1import { n as __exportAll } from "/node_modules/.vite/deps/rolldown-runtime-EAsCxrDo.js?v=6a21e4cf"; 2//#region node_modules/ethers/lib.esm/_version.js 3/** 4* The current version of Ethers. 5*/ 6var version = "6.17.0"; 7//#endregion 8//#region node_modules/ethers/lib.esm/utils/properties.js 9/** 10* Property helper functions. 11* 12* @_subsection api/utils:Properties [about-properties] 13*/ 14function checkType(value, type, name) { 15 const types = type.split("|").map((t) => t.trim()); 16 for (let i = 0; i < types.length; i++) switch (type) { 17 case "any": return; 18 case "bigint": 19 case "boolean": 20 case "number": 21 case "string": if (typeof value === type) return; 22 } 23 const error = /* @__PURE__ */ new Error(`invalid value for type ${type}`); 24 error.code = "INVALID_ARGUMENT"; 25 error.argument = `value.${name}`; 26 error.value = value; 27 throw error; 28} 29/** 30* Resolves to a new object that is a copy of %%value%%, but with all 31* values resolved. 32*/ 33async function resolveProperties(value) { 34 const keys = Object.keys(value); 35 return (await Promise.all(keys.map((k) => Promise.resolve(value[k])))).reduce((accum, v, index) => { 36 accum[keys[index]] = v; 37 return accum; 38 }, {}); 39} 40/** 41* Assigns the %%values%% to %%target%% as read-only values. 42* 43* It %%types%% is specified, the values are checked. 44*/ 45function defineProperties(target, values, types) { 46 for (let key in values) { 47 let value = values[key]; 48 const type = types ? types[key] : null; 49 if (type) checkType(value, type, key); 50 Object.defineProperty(target, key, { 51 enumerable: true, 52 value, 53 writable: false 54 }); 55 } 56} 57//#endregion 58//#region node_modules/ethers/lib.esm/utils/errors.js 59/** 60* All errors in ethers include properties to ensure they are both 61* human-readable (i.e. ``.message``) and machine-readable (i.e. ``.code``). 62* 63* The [[isError]] function can be used to check the error ``code`` and 64* provide a type guard for the properties present on that error interface. 65* 66* @_section: api/utils/errors:Errors [about-errors] 67*/ 68function stringify$1(value, seen) { 69 if (value == null) return "null"; 70 if (seen == null) seen = /* @__PURE__ */ new Set(); 71 if (typeof value === "object") { 72 if (seen.has(value)) return "[Circular]"; 73 seen.add(value); 74 } 75 if (Array.isArray(value)) return "[ " + value.map((v) => stringify$1(v, seen)).join(", ") + " ]"; 76 if (value instanceof Uint8Array) { 77 const HEX = "0123456789abcdef"; 78 let result = "0x"; 79 for (let i = 0; i < value.length; i++) { 80 result += HEX[value[i] >> 4]; 81 result += HEX[value[i] & 15]; 82 } 83 return result; 84 } 85 if (typeof value === "object" && typeof value.toJSON === "function") return stringify$1(value.toJSON(), seen); 86 switch (typeof value) { 87 case "boolean": 88 case "number": 89 case "symbol": return value.toString(); 90 case "bigint": return BigInt(value).toString(); 91 case "string": return JSON.stringify(value); 92 case "object": { 93 const keys = Object.keys(value); 94 keys.sort(); 95 return "{ " + keys.map((k) => `${stringify$1(k, seen)}: ${stringify$1(value[k], seen)}`).join(", ") + " }"; 96 } 97 } 98 return `[ COULD NOT SERIALIZE ]`; 99} 100/** 101* Returns true if the %%error%% matches an error thrown by ethers 102* that matches the error %%code%%. 103* 104* In TypeScript environments, this can be used to check that %%error%% 105* matches an EthersError type, which means the expected properties will 106* be set. 107* 108* @See [ErrorCodes](api:ErrorCode) 109* @example 110* try { 111* // code.... 112* } catch (e) { 113* if (isError(e, "CALL_EXCEPTION")) { 114* // The Type Guard has validated this object 115* console.log(e.data); 116* } 117* } 118*/ 119function isError(error, code) { 120 return error && error.code === code; 121} 122/** 123* Returns true if %%error%% is a [[CallExceptionError]. 124*/ 125function isCallException(error) { 126 return isError(error, "CALL_EXCEPTION"); 127} 128/** 129* Returns a new Error configured to the format ethers emits errors, with 130* the %%message%%, [[api:ErrorCode]] %%code%% and additional properties 131* for the corresponding EthersError. 132* 133* Each error in ethers includes the version of ethers, a 134* machine-readable [[ErrorCode]], and depending on %%code%%, additional 135* required properties. The error message will also include the %%message%%, 136* ethers version, %%code%% and all additional properties, serialized. 137*/ 138function makeError(message, code, info) { 139 let shortMessage = message; 140 { 141 const details = []; 142 if (info) {
143 if ("message" in info || "code" in info || "name" in info) throw new Error(`value will overwrite populated values: ${stringify$1(info)}`); 144 for (const key in info) { 145 if (key === "shortMessage") continue; 146 const value = info[key]; 147 details.push(key + "=" + stringify$1(value)); 148 } 149 } 150 details.push(`code=${code}`); 151 details.push(`version=${version}`); 152 if (details.length) message += " (" + details.join(", ") + ")"; 153 } 154 let error; 155 switch (code) { 156 case "INVALID_ARGUMENT": 157 error = new TypeError(message); 158 break; 159 case "NUMERIC_FAULT": 160 case "BUFFER_OVERRUN": 161 error = new RangeError(message); 162 break; 163 default: error = new Error(message); 164 } 165 defineProperties(error, { code }); 166 if (info) Object.assign(error, info); 167 if (error.shortMessage == null) defineProperties(error, { shortMessage }); 168 return error; 169} 170/** 171* Throws an EthersError with %%message%%, %%code%% and additional error 172* %%info%% when %%check%% is falsish.. 173* 174* @see [[api:makeError]] 175*/ 176function assert(check, message, code, info) { 177 if (!check) throw makeError(message, code, info); 178} 179/** 180* A simple helper to simply ensuring provided arguments match expected 181* constraints, throwing if not. 182* 183* In TypeScript environments, the %%check%% has been asserted true, so 184* any further code does not need additional compile-time checks. 185*/ 186function assertArgument(check, message, name, value) { 187 assert(check, message, "INVALID_ARGUMENT", { 188 argument: name, 189 value 190 }); 191} 192function assertArgumentCount(count, expectedCount, message) { 193 if (message == null) message = ""; 194 if (message) message = ": " + message; 195 assert(count >= expectedCount, "missing argument" + message, "MISSING_ARGUMENT", { 196 count, 197 expectedCount 198 }); 199 assert(count <= expectedCount, "too many arguments" + message, "UNEXPECTED_ARGUMENT", { 200 count, 201 expectedCount 202 }); 203} 204var _normalizeForms = [ 205 "NFD", 206 "NFC", 207 "NFKD", 208 "NFKC" 209].reduce((accum, form) => { 210 try { 211 /* c8 ignore start */ 212 if ("test".normalize(form) !== "test") throw new Error("bad"); 213 /* c8 ignore stop */ 214 if (form === "NFD") { 215 /* c8 ignore start */ 216 if (String.fromCharCode(233).normalize("NFD") !== String.fromCharCode(101, 769)) throw new Error("broken"); 217 } 218 accum.push(form); 219 } catch (error) {} 220 return accum; 221}, []); 222/** 223* Throws if the normalization %%form%% is not supported. 224*/ 225function assertNormalize(form) { 226 assert(_normalizeForms.indexOf(form) >= 0, "platform missing String.prototype.normalize", "UNSUPPORTED_OPERATION", { 227 operation: "String.prototype.normalize", 228 info: { form } 229 }); 230} 231/** 232* Many classes use file-scoped values to guard the constructor, 233* making it effectively private. This facilitates that pattern 234* by ensuring the %%givenGaurd%% matches the file-scoped %%guard%%, 235* throwing if not, indicating the %%className%% if provided. 236*/ 237function assertPrivate(givenGuard, guard, className) { 238 if (className == null) className = ""; 239 if (givenGuard !== guard) { 240 let method = className, operation = "new"; 241 if (className) { 242 method += "."; 243 operation += " " + className; 244 } 245 assert(false, `private constructor; use ${method}from* methods`, "UNSUPPORTED_OPERATION", { operation }); 246 } 247} 248//#endregion 249//#region node_modules/ethers/lib.esm/utils/data.js 250/** 251* Some data helpers. 252* 253* 254* @_subsection api/utils:Data Helpers [about-data] 255*/ 256function _getBytes(value, name, copy) { 257 if (value instanceof Uint8Array) { 258 if (copy) return new Uint8Array(value); 259 return value; 260 } 261 if (typeof value === "string" && value.length % 2 === 0 && value.match(/^0x[0-9a-f]*$/i)) { 262 const result = new Uint8Array((value.length - 2) / 2); 263 let offset = 2; 264 for (let i = 0; i < result.length; i++) { 265 result[i] = parseInt(value.substring(offset, offset + 2), 16); 266 offset += 2; 267 } 268 return result; 269 } 270 assertArgument(false, "invalid BytesLike value", name || "value", value); 271} 272/** 273* Get a typed Uint8Array for %%value%%. If already a Uint8Array 274* the original %%value%% is returned; if a copy is required use 275* [[getBytesCopy]]. 276* 277* @see: getBytesCopy 278*/ 279function getBytes(value, name) { 280 return _getBytes(value, name, false); 281} 282/** 283* Get a typed Uint8Array for %%value%%, creating a copy if necessary 284* to prevent any modifications of the returned value from being 285* reflected elsewhere. 286* 287* @see: getBytes 288*/ 289function getBytesCopy(value, name) { 290 return _getBytes(value, name, true); 291} 292/** 293* Returns true if %%value%% is a valid [[HexString]]. 294* 295* If %%length%% is ``true`` or a //number//, it also checks that 296* %%value%% is a valid [[DataHexString]] of %%length%% (if a //number//) 297* bytes of data (e.g. ``0x1234`` is 2 bytes). 298*/ 299function isHexString(value, length) { 300 if (typeof value !== "string" || !value.match(/^0x[0-9A-Fa-f]*$/)) return false;
301 if (typeof length === "number" && value.length !== 2 + 2 * length) return false; 302 if (length === true && value.length % 2 !== 0) return false; 303 return true; 304} 305/** 306* Returns true if %%value%% is a valid representation of arbitrary 307* data (i.e. a valid [[DataHexString]] or a Uint8Array). 308*/ 309function isBytesLike(value) { 310 return isHexString(value, true) || value instanceof Uint8Array; 311} 312var HexCharacters = "0123456789abcdef"; 313/** 314* Returns a [[DataHexString]] representation of %%data%%. 315*/ 316function hexlify(data) { 317 const bytes = getBytes(data); 318 let result = "0x"; 319 for (let i = 0; i < bytes.length; i++) { 320 const v = bytes[i]; 321 result += HexCharacters[(v & 240) >> 4] + HexCharacters[v & 15]; 322 } 323 return result; 324} 325/** 326* Returns a [[DataHexString]] by concatenating all values 327* within %%data%%. 328*/ 329function concat(datas) { 330 return "0x" + datas.map((d) => hexlify(d).substring(2)).join(""); 331} 332/** 333* Returns the length of %%data%%, in bytes. 334*/ 335function dataLength(data) { 336 if (isHexString(data, true)) return (data.length - 2) / 2; 337 return getBytes(data).length; 338} 339/** 340* Returns a [[DataHexString]] by slicing %%data%% from the %%start%% 341* offset to the %%end%% offset. 342* 343* By default %%start%% is 0 and %%end%% is the length of %%data%%. 344*/ 345function dataSlice(data, start, end) { 346 const bytes = getBytes(data); 347 if (end != null && end > bytes.length) assert(false, "cannot slice beyond data bounds", "BUFFER_OVERRUN", { 348 buffer: bytes, 349 length: bytes.length, 350 offset: end 351 }); 352 return hexlify(bytes.slice(start == null ? 0 : start, end == null ? bytes.length : end)); 353} 354/** 355* Return the [[DataHexString]] result by stripping all **leading** 356** zero bytes from %%data%%. 357*/ 358function stripZerosLeft(data) { 359 let bytes = hexlify(data).substring(2); 360 while (bytes.startsWith("00")) bytes = bytes.substring(2); 361 return "0x" + bytes; 362} 363function zeroPad(data, length, left) { 364 const bytes = getBytes(data); 365 assert(length >= bytes.length, "padding exceeds data length", "BUFFER_OVERRUN", { 366 buffer: new Uint8Array(bytes), 367 length, 368 offset: length + 1 369 }); 370 const result = new Uint8Array(length); 371 result.fill(0); 372 if (left) result.set(bytes, length - bytes.length); 373 else result.set(bytes, 0); 374 return hexlify(result); 375} 376/** 377* Return the [[DataHexString]] of %%data%% padded on the **left** 378* to %%length%% bytes. 379* 380* If %%data%% already exceeds %%length%%, a [[BufferOverrunError]] is 381* thrown. 382* 383* This pads data the same as **values** are in Solidity 384* (e.g. ``uint128``). 385*/ 386function zeroPadValue(data, length) { 387 return zeroPad(data, length, true); 388} 389/** 390* Return the [[DataHexString]] of %%data%% padded on the **right** 391* to %%length%% bytes. 392* 393* If %%data%% already exceeds %%length%%, a [[BufferOverrunError]] is 394* thrown. 395* 396* This pads data the same as **bytes** are in Solidity 397* (e.g. ``bytes16``). 398*/ 399function zeroPadBytes(data, length) { 400 return zeroPad(data, length, false); 401} 402//#endregion 403//#region node_modules/ethers/lib.esm/utils/maths.js 404/** 405* Some mathematic operations. 406* 407* @_subsection: api/utils:Math Helpers [about-maths] 408*/ 409var BN_0$10 = BigInt(0); 410var BN_1$5 = BigInt(1); 411var maxValue = 9007199254740991; 412/** 413* Convert %%value%% from a twos-compliment representation of %%width%% 414* bits to its value. 415* 416* If the highest bit is ``1``, the result will be negative. 417*/ 418function fromTwos(_value, _width) { 419 const value = getUint(_value, "value"); 420 const width = BigInt(getNumber(_width, "width")); 421 assert(value >> width === BN_0$10, "overflow", "NUMERIC_FAULT", { 422 operation: "fromTwos", 423 fault: "overflow", 424 value: _value 425 }); 426 if (value >> width - BN_1$5) { 427 const mask = (BN_1$5 << width) - BN_1$5; 428 return -((~value & mask) + BN_1$5); 429 } 430 return value; 431} 432/** 433* Convert %%value%% to a twos-compliment representation of 434* %%width%% bits. 435* 436* The result will always be positive. 437*/ 438function toTwos(_value, _width) { 439 let value = getBigInt(_value, "value"); 440 const width = BigInt(getNumber(_width, "width")); 441 const limit = BN_1$5 << width - BN_1$5; 442 if (value < BN_0$10) { 443 value = -value; 444 assert(value <= limit, "too low", "NUMERIC_FAULT", { 445 operation: "toTwos", 446 fault: "overflow", 447 value: _value 448 }); 449 const mask = (BN_1$5 << width) - BN_1$5; 450 return (~value & mask) + BN_1$5; 451 } else assert(value < limit, "too high", "NUMERIC_FAULT", { 452 operation: "toTwos", 453 fault: "overflow", 454 value: _value 455 }); 456 return value; 457} 458/**
459* Mask %%value%% with a bitmask of %%bits%% ones. 460*/ 461function mask(_value, _bits) { 462 return getUint(_value, "value") & (BN_1$5 << BigInt(getNumber(_bits, "bits"))) - BN_1$5; 463} 464/** 465* Gets a BigInt from %%value%%. If it is an invalid value for 466* a BigInt, then an ArgumentError will be thrown for %%name%%. 467*/ 468function getBigInt(value, name) { 469 switch (typeof value) { 470 case "bigint": return value; 471 case "number": 472 assertArgument(Number.isInteger(value), "underflow", name || "value", value); 473 assertArgument(value >= -9007199254740991 && value <= maxValue, "overflow", name || "value", value); 474 return BigInt(value); 475 case "string": try { 476 if (value === "") throw new Error("empty string"); 477 if (value[0] === "-" && value[1] !== "-") return -BigInt(value.substring(1)); 478 return BigInt(value); 479 } catch (e) { 480 assertArgument(false, `invalid BigNumberish string: ${e.message}`, name || "value", value); 481 } 482 } 483 assertArgument(false, "invalid BigNumberish value", name || "value", value); 484} 485/** 486* Returns %%value%% as a bigint, validating it is valid as a bigint 487* value and that it is positive. 488*/ 489function getUint(value, name) { 490 const result = getBigInt(value, name); 491 assert(result >= BN_0$10, "unsigned value cannot be negative", "NUMERIC_FAULT", { 492 fault: "overflow", 493 operation: "getUint", 494 value 495 }); 496 return result; 497} 498var Nibbles$1 = "0123456789abcdef"; 499function toBigInt(value) { 500 if (value instanceof Uint8Array) { 501 let result = "0x0"; 502 for (const v of value) { 503 result += Nibbles$1[v >> 4]; 504 result += Nibbles$1[v & 15]; 505 } 506 return BigInt(result); 507 } 508 return getBigInt(value); 509} 510/** 511* Gets a //number// from %%value%%. If it is an invalid value for 512* a //number//, then an ArgumentError will be thrown for %%name%%. 513*/ 514function getNumber(value, name) { 515 switch (typeof value) { 516 case "bigint": 517 assertArgument(value >= -9007199254740991 && value <= maxValue, "overflow", name || "value", value); 518 return Number(value); 519 case "number": 520 assertArgument(Number.isInteger(value), "underflow", name || "value", value); 521 assertArgument(value >= -9007199254740991 && value <= maxValue, "overflow", name || "value", value); 522 return value; 523 case "string": try { 524 if (value === "") throw new Error("empty string"); 525 return getNumber(BigInt(value), name); 526 } catch (e) { 527 assertArgument(false, `invalid numeric string: ${e.message}`, name || "value", value); 528 } 529 } 530 assertArgument(false, "invalid numeric value", name || "value", value); 531} 532/** 533* Converts %%value%% to a number. If %%value%% is a Uint8Array, it 534* is treated as Big Endian data. Throws if the value is not safe. 535*/ 536function toNumber(value) { 537 return getNumber(toBigInt(value)); 538} 539/** 540* Converts %%value%% to a Big Endian hexstring, optionally padded to 541* %%width%% bytes. 542*/ 543function toBeHex(_value, _width) { 544 const value = getUint(_value, "value"); 545 let result = value.toString(16); 546 if (_width == null) { 547 if (result.length % 2) result = "0" + result; 548 } else { 549 const width = getNumber(_width, "width"); 550 if (width === 0 && value === BN_0$10) return "0x"; 551 assert(width * 2 >= result.length, `value exceeds width (${width} bytes)`, "NUMERIC_FAULT", { 552 operation: "toBeHex", 553 fault: "overflow", 554 value: _value 555 }); 556 while (result.length < width * 2) result = "0" + result; 557 } 558 return "0x" + result; 559} 560/** 561* Converts %%value%% to a Big Endian Uint8Array. 562*/ 563function toBeArray(_value, _width) { 564 const value = getUint(_value, "value"); 565 if (value === BN_0$10) { 566 const width = _width != null ? getNumber(_width, "width") : 0; 567 return new Uint8Array(width); 568 } 569 let hex = value.toString(16); 570 if (hex.length % 2) hex = "0" + hex; 571 if (_width != null) { 572 const width = getNumber(_width, "width"); 573 while (hex.length < width * 2) hex = "00" + hex; 574 assert(width * 2 === hex.length, `value exceeds width (${width} bytes)`, "NUMERIC_FAULT", { 575 operation: "toBeArray", 576 fault: "overflow", 577 value: _value 578 }); 579 } 580 const result = new Uint8Array(hex.length / 2); 581 for (let i = 0; i < result.length; i++) { 582 const offset = i * 2; 583 result[i] = parseInt(hex.substring(offset, offset + 2), 16); 584 } 585 return result; 586} 587/** 588* Returns a [[HexString]] for %%value%% safe to use as a //Quantity//. 589* 590* A //Quantity// does not have and leading 0 values unless the value is 591* the literal value `0x0`. This is most commonly used for JSSON-RPC 592* numeric values. 593*/ 594function toQuantity(value) { 595 let result = hexlify(isBytesLike(value) ? value : toBeArray(value)).substring(2); 596 while (result.startsWith("0")) result = result.substring(1); 597 if (result === "") result = "0"; 598 return "0x" + result; 599} 600//#endregion 601//#region node_modules/ethers/lib.esm/utils/base58.js 602/** 603* The [Base58 Encoding](link-base58) scheme allows a **numeric** value 604* to be encoded as a compact string using a radix of 58 using only 605* alpha-numeric characters. Confusingly similar characters are omitted 606* (i.e. ``"l0O"``). 607* 608* Note that Base58 encodes a **numeric** value, not arbitrary bytes, 609* since any zero-bytes on the left would get removed. To mitigate this 610* issue most schemes that use Base58 choose specific high-order values 611* to ensure non-zero prefixes. 612* 613* @_subsection: api/utils:Base58 Encoding [about-base58] 614*/ 615var Alphabet = "123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz"; 616var Lookup = null; 617function getAlpha(letter) { 618 if (Lookup == null) { 619 Lookup = {}; 620 for (let i = 0; i < 58; i++) Lookup[Alphabet[i]] = BigInt(i); 621 } 622 const result = Lookup[letter]; 623 assertArgument(result != null, `invalid base58 value`, "letter", letter); 624 return result; 625} 626var BN_0$9 = BigInt(0); 627var BN_58 = BigInt(58); 628/** 629* Encode %%value%% as a Base58-encoded string. 630*/ 631function encodeBase58(_value) { 632 const bytes = getBytes(_value); 633 let value = toBigInt(bytes); 634 let result = ""; 635 while (value) { 636 result = Alphabet[Number(value % BN_58)] + result; 637 value /= BN_58; 638 } 639 for (let i = 0; i < bytes.length; i++) { 640 if (bytes[i]) break; 641 result = Alphabet[0] + result; 642 } 643 return result; 644} 645/** 646* Decode the Base58-encoded %%value%%. 647*/ 648function decodeBase58(value) { 649 let result = BN_0$9; 650 for (let i = 0; i < value.length; i++) { 651 result *= BN_58; 652 result += getAlpha(value[i]); 653 } 654 return result; 655} 656//#endregion 657//#region node_modules/ethers/lib.esm/utils/base64-browser.js 658function decodeBase64(textData) { 659 textData = atob(textData); 660 const data = new Uint8Array(textData.length); 661 for (let i = 0; i < textData.length; i++) data[i] = textData.charCodeAt(i); 662 return getBytes(data); 663} 664function encodeBase64(_data) { 665 const data = getBytes(_data); 666 let textData = ""; 667 for (let i = 0; i < data.length; i++) textData += String.fromCharCode(data[i]); 668 return btoa(textData); 669} 670//#endregion 671//#region node_modules/ethers/lib.esm/utils/events.js 672/** 673* Events allow for applications to use the observer pattern, which 674* allows subscribing and publishing events, outside the normal 675* execution paths. 676* 677* @_section api/utils/events:Events [about-events] 678*/ 679/** 680* When an [[EventEmitterable]] triggers a [[Listener]], the 681* callback always ahas one additional argument passed, which is 682* an **EventPayload**. 683*/ 684var EventPayload = class { 685 /** 686 * The event filter. 687 */ 688 filter; 689 /** 690 * The **EventEmitterable**. 691 */ 692 emitter; 693 #listener; 694 /** 695 * Create a new **EventPayload** for %%emitter%% with 696 * the %%listener%% and for %%filter%%. 697 */ 698 constructor(emitter, listener, filter) { 699 this.#listener = listener; 700 defineProperties(this, { 701 emitter, 702 filter 703 }); 704 } 705 /** 706 * Unregister the triggered listener for future events. 707 */ 708 async removeListener() { 709 if (this.#listener == null) return; 710 await this.emitter.off(this.filter, this.#listener); 711 } 712}; 713//#endregion 714//#region node_modules/ethers/lib.esm/utils/utf8.js 715/**
716* Using strings in Ethereum (or any security-basd system) requires 717* additional care. These utilities attempt to mitigate some of the 718* safety issues as well as provide the ability to recover and analyse 719* strings. 720* 721* @_subsection api/utils:Strings and UTF-8 [about-strings] 722*/ 723function errorFunc(reason, offset, bytes, output, badCodepoint) { 724 assertArgument(false, `invalid codepoint at offset ${offset}; ${reason}`, "bytes", bytes); 725} 726function ignoreFunc(reason, offset, bytes, output, badCodepoint) { 727 if (reason === "BAD_PREFIX" || reason === "UNEXPECTED_CONTINUE") { 728 let i = 0; 729 for (let o = offset + 1; o < bytes.length; o++) { 730 if (bytes[o] >> 6 !== 2) break; 731 i++; 732 } 733 return i; 734 } 735 if (reason === "OVERRUN") return bytes.length - offset - 1; 736 return 0; 737} 738function replaceFunc(reason, offset, bytes, output, badCodepoint) { 739 if (reason === "OVERLONG") { 740 assertArgument(typeof badCodepoint === "number", "invalid bad code point for replacement", "badCodepoint", badCodepoint); 741 output.push(badCodepoint); 742 return 0; 743 } 744 output.push(65533); 745 return ignoreFunc(reason, offset, bytes, output, badCodepoint); 746} 747/** 748* A handful of popular, built-in UTF-8 error handling strategies. 749* 750* **``"error"``** - throws on ANY illegal UTF-8 sequence or 751* non-canonical (overlong) codepoints (this is the default) 752* 753* **``"ignore"``** - silently drops any illegal UTF-8 sequence 754* and accepts non-canonical (overlong) codepoints 755* 756* **``"replace"``** - replace any illegal UTF-8 sequence with the 757* UTF-8 replacement character (i.e. ``"\\ufffd"``) and accepts 758* non-canonical (overlong) codepoints 759* 760* @returns: Record<"error" | "ignore" | "replace", Utf8ErrorFunc> 761*/ 762var Utf8ErrorFuncs = Object.freeze({ 763 error: errorFunc, 764 ignore: ignoreFunc, 765 replace: replaceFunc 766}); 767function getUtf8CodePoints(_bytes, onError) { 768 if (onError == null) onError = Utf8ErrorFuncs.error; 769 const bytes = getBytes(_bytes, "bytes"); 770 const result = []; 771 let i = 0; 772 while (i < bytes.length) { 773 const c = bytes[i++]; 774 if (c >> 7 === 0) { 775 result.push(c); 776 continue; 777 } 778 let extraLength = null; 779 let overlongMask = null; 780 if ((c & 224) === 192) { 781 extraLength = 1; 782 overlongMask = 127; 783 } else if ((c & 240) === 224) { 784 extraLength = 2; 785 overlongMask = 2047; 786 } else if ((c & 248) === 240) { 787 extraLength = 3; 788 overlongMask = 65535; 789 } else { 790 if ((c & 192) === 128) i += onError("UNEXPECTED_CONTINUE", i - 1, bytes, result); 791 else i += onError("BAD_PREFIX", i - 1, bytes, result); 792 continue; 793 } 794 if (i - 1 + extraLength >= bytes.length) { 795 i += onError("OVERRUN", i - 1, bytes, result); 796 continue; 797 } 798 let res = c & (1 << 8 - extraLength - 1) - 1; 799 for (let j = 0; j < extraLength; j++) { 800 let nextChar = bytes[i]; 801 if ((nextChar & 192) != 128) { 802 i += onError("MISSING_CONTINUE", i, bytes, result); 803 res = null; 804 break; 805 } 806 res = res << 6 | nextChar & 63; 807 i++; 808 } 809 if (res === null) continue; 810 if (res > 1114111) { 811 i += onError("OUT_OF_RANGE", i - 1 - extraLength, bytes, result, res); 812 continue; 813 } 814 if (res >= 55296 && res <= 57343) { 815 i += onError("UTF16_SURROGATE", i - 1 - extraLength, bytes, result, res); 816 continue; 817 } 818 if (res <= overlongMask) { 819 i += onError("OVERLONG", i - 1 - extraLength, bytes, result, res); 820 continue; 821 } 822 result.push(res); 823 } 824 return result; 825} 826/** 827* Returns the UTF-8 byte representation of %%str%%. 828* 829* If %%form%% is specified, the string is normalized. 830*/ 831function toUtf8Bytes(str, form) { 832 assertArgument(typeof str === "string", "invalid string value", "str", str); 833 if (form != null) { 834 assertNormalize(form); 835 str = str.normalize(form); 836 } 837 let result = []; 838 for (let i = 0; i < str.length; i++) { 839 const c = str.charCodeAt(i); 840 if (c < 128) result.push(c); 841 else if (c < 2048) { 842 result.push(c >> 6 | 192); 843 result.push(c & 63 | 128); 844 } else if ((c & 64512) == 55296) { 845 i++; 846 const c2 = str.charCodeAt(i); 847 assertArgument(i < str.length && (c2 & 64512) === 56320, "invalid surrogate pair", "str", str); 848 const pair = 65536 + ((c & 1023) << 10) + (c2 & 1023); 849 result.push(pair >> 18 | 240); 850 result.push(pair >> 12 & 63 | 128); 851 result.push(pair >> 6 & 63 | 128); 852 result.push(pair & 63 | 128); 853 } else { 854 result.push(c >> 12 | 224); 855 result.push(c >> 6 & 63 | 128); 856 result.push(c & 63 | 128); 857 } 858 } 859 return new Uint8Array(result); 860} 861function _toUtf8String(codePoints) { 862 return codePoints.map((codePoint) => { 863 if (codePoint <= 65535) return String.fromCharCode(codePoint); 864 codePoint -= 65536; 865 return String.fromCharCode((codePoint >> 10 & 1023) + 55296, (codePoint & 1023) + 56320); 866 }).join(""); 867} 868/** 869* Returns the string represented by the UTF-8 data %%bytes%%. 870* 871* When %%onError%% function is specified, it is called on UTF-8 872* errors allowing recovery using the [[Utf8ErrorFunc]] API. 873* (default: [error](Utf8ErrorFuncs)) 874*/ 875function toUtf8String(bytes, onError) { 876 return _toUtf8String(getUtf8CodePoints(bytes, onError)); 877} 878/** 879* Returns the UTF-8 code-points for %%str%%. 880* 881* If %%form%% is specified, the string is normalized. 882*/ 883function toUtf8CodePoints(str, form) { 884 return getUtf8CodePoints(toUtf8Bytes(str, form)); 885} 886//#endregion 887//#region node_modules/ethers/lib.esm/utils/geturl-browser.js 888function createGetUrl(options) { 889 async function getUrl(req, _signal) { 890 assert(_signal == null || !_signal.cancelled, "request cancelled before sending", "CANCELLED"); 891 const protocol = req.url.split(":")[0].toLowerCase(); 892 assert(protocol === "http" || protocol === "https", `unsupported protocol ${protocol}`, "UNSUPPORTED_OPERATION", { 893 info: { protocol }, 894 operation: "request" 895 }); 896 assert(protocol === "https" || !req.credentials || req.allowInsecureAuthentication, "insecure authorized connections unsupported", "UNSUPPORTED_OPERATION", { operation: "request" }); 897 let error = null; 898 const controller = new AbortController(); 899 const timer = setTimeout(() => { 900 error = makeError("request timeout", "TIMEOUT"); 901 controller.abort(); 902 }, req.timeout); 903 if (_signal) _signal.addListener(() => { 904 error = makeError("request cancelled", "CANCELLED"); 905 controller.abort(); 906 }); 907 const init = Object.assign({}, options, { 908 method: req.method, 909 headers: new Headers(Array.from(req)), 910 body: req.body || void 0, 911 signal: controller.signal 912 }); 913 let resp; 914 try { 915 resp = await fetch(req.url, init); 916 } catch (_error) { 917 clearTimeout(timer); 918 if (error) throw error; 919 throw _error; 920 } 921 clearTimeout(timer); 922 const headers = {};
923 resp.headers.forEach((value, key) => { 924 headers[key.toLowerCase()] = value; 925 }); 926 const respBody = await resp.arrayBuffer(); 927 const body = respBody == null ? null : new Uint8Array(respBody); 928 return { 929 statusCode: resp.status, 930 statusMessage: resp.statusText, 931 headers, 932 body 933 }; 934 } 935 return getUrl; 936} 937//#endregion 938//#region node_modules/ethers/lib.esm/utils/fetch.js 939/** 940* Fetching content from the web is environment-specific, so Ethers 941* provides an abstraction that each environment can implement to provide 942* this service. 943* 944* On [Node.js](link-node), the ``http`` and ``https`` libs are used to 945* create a request object, register event listeners and process data 946* and populate the [[FetchResponse]]. 947* 948* In a browser, the [DOM fetch](link-js-fetch) is used, and the resulting 949* ``Promise`` is waited on to retrieve the payload. 950* 951* The [[FetchRequest]] is responsible for handling many common situations, 952* such as redirects, server throttling, authentication, etc. 953* 954* It also handles common gateways, such as IPFS and data URIs. 955* 956* @_section api/utils/fetching:Fetching Web Content [about-fetch] 957*/ 958var MAX_ATTEMPTS = 12; 959var SLOT_INTERVAL = 250; 960var defaultGetUrlFunc = createGetUrl(); 961var reData = /* @__PURE__ */ new RegExp("^data:([^;:]*)?(;base64)?,(.*)$", "i"); 962var reIpfs = /* @__PURE__ */ new RegExp("^ipfs://(ipfs/)?(.*)$", "i"); 963var locked$5 = false; 964async function dataGatewayFunc(url, signal) { 965 try { 966 const match = url.match(reData); 967 if (!match) throw new Error("invalid data"); 968 return new FetchResponse(200, "OK", { "content-type": match[1] || "text/plain" }, match[2] ? decodeBase64(match[3]) : unpercent(match[3])); 969 } catch (error) { 970 return new FetchResponse(599, "BAD REQUEST (invalid data: URI)", {}, null, new FetchRequest(url)); 971 } 972} 973/** 974* Returns a [[FetchGatewayFunc]] for fetching content from a standard 975* IPFS gateway hosted at %%baseUrl%%. 976*/ 977function getIpfsGatewayFunc(baseUrl) { 978 async function gatewayIpfs(url, signal) { 979 try { 980 const match = url.match(reIpfs); 981 if (!match) throw new Error("invalid link"); 982 return new FetchRequest(`${baseUrl}${match[2]}`); 983 } catch (error) { 984 return new FetchResponse(599, "BAD REQUEST (invalid IPFS URI)", {}, null, new FetchRequest(url)); 985 } 986 } 987 return gatewayIpfs; 988} 989var Gateways = { 990 "data": dataGatewayFunc, 991 "ipfs": getIpfsGatewayFunc("https://gateway.ipfs.io/ipfs/") 992}; 993var fetchSignals = /* @__PURE__ */ new WeakMap(); 994/** 995* @_ignore 996*/ 997var FetchCancelSignal = class { 998 #listeners; 999 #cancelled; 1000 constructor(request) { 1001 this.#listeners = []; 1002 this.#cancelled = false; 1003 fetchSignals.set(request, () => { 1004 if (this.#cancelled) return; 1005 this.#cancelled = true; 1006 for (const listener of this.#listeners) setTimeout(() => { 1007 listener(); 1008 }, 0); 1009 this.#listeners = []; 1010 }); 1011 } 1012 addListener(listener) { 1013 assert(!this.#cancelled, "singal already cancelled", "UNSUPPORTED_OPERATION", { operation: "fetchCancelSignal.addCancelListener" }); 1014 this.#listeners.push(listener); 1015 } 1016 get cancelled() { 1017 return this.#cancelled; 1018 } 1019 checkSignal() { 1020 assert(!this.cancelled, "cancelled", "CANCELLED", {}); 1021 } 1022}; 1023function checkSignal(signal) { 1024 if (signal == null) throw new Error("missing signal; should not happen"); 1025 signal.checkSignal(); 1026 return signal; 1027} 1028/** 1029* Represents a request for a resource using a URI. 1030* 1031* By default, the supported schemes are ``HTTP``, ``HTTPS``, ``data:``, 1032* and ``IPFS:``. 1033* 1034* Additional schemes can be added globally using [[registerGateway]]. 1035* 1036* @example: 1037* req = new FetchRequest("https://www.ricmoo.com") 1038* resp = await req.send() 1039* resp.body.length 1040* //_result: 1041*/ 1042var FetchRequest = class FetchRequest { 1043 #allowInsecure; 1044 #gzip; 1045 #headers; 1046 #method; 1047 #timeout; 1048 #url; 1049 #body; 1050 #bodyType; 1051 #creds; 1052 #preflight; 1053 #process; 1054 #retry; 1055 #signal; 1056 #throttle; 1057 #getUrlFunc; 1058 /** 1059 * The fetch URL to request. 1060 */ 1061 get url() { 1062 return this.#url; 1063 } 1064 set url(url) { 1065 this.#url = String(url); 1066 } 1067 /** 1068 * The fetch body, if any, to send as the request body. //(default: null)// 1069 * 1070 * When setting a body, the intrinsic ``Content-Type`` is automatically 1071 * set and will be used if **not overridden** by setting a custom 1072 * header. 1073 * 1074 * If %%body%% is null, the body is cleared (along with the 1075 * intrinsic ``Content-Type``). 1076 * 1077 * If %%body%% is a string, the intrinsic ``Content-Type`` is set to 1078 * ``text/plain``. 1079 * 1080 * If %%body%% is a Uint8Array, the intrinsic ``Content-Type`` is set to 1081 * ``application/octet-stream``. 1082 * 1083 * If %%body%% is any other object, the intrinsic ``Content-Type`` is 1084 * set to ``application/json``. 1085 */ 1086 get body() { 1087 if (this.#body == null) return null; 1088 return new Uint8Array(this.#body); 1089 } 1090 set body(body) { 1091 if (body == null) { 1092 this.#body = void 0; 1093 this.#bodyType = void 0; 1094 } else if (typeof body === "string") { 1095 this.#body = toUtf8Bytes(body); 1096 this.#bodyType = "text/plain"; 1097 } else if (body instanceof Uint8Array) { 1098 this.#body = body; 1099 this.#bodyType = "application/octet-stream"; 1100 } else if (typeof body === "object") { 1101 this.#body = toUtf8Bytes(JSON.stringify(body)); 1102 this.#bodyType = "application/json"; 1103 } else throw new Error("invalid body"); 1104 } 1105 /** 1106 * Returns true if the request has a body. 1107 */ 1108 hasBody() { 1109 return this.#body != null; 1110 }
1111 /** 1112 * The HTTP method to use when requesting the URI. If no method 1113 * has been explicitly set, then ``GET`` is used if the body is 1114 * null and ``POST`` otherwise. 1115 */ 1116 get method() { 1117 if (this.#method) return this.#method; 1118 if (this.hasBody()) return "POST"; 1119 return "GET"; 1120 } 1121 set method(method) { 1122 if (method == null) method = ""; 1123 this.#method = String(method).toUpperCase(); 1124 } 1125 /** 1126 * The headers that will be used when requesting the URI. All 1127 * keys are lower-case. 1128 * 1129 * This object is a copy, so any changes will **NOT** be reflected 1130 * in the ``FetchRequest``. 1131 * 1132 * To set a header entry, use the ``setHeader`` method. 1133 */ 1134 get headers() { 1135 const headers = Object.assign({}, this.#headers); 1136 if (this.#creds) headers["authorization"] = `Basic ${encodeBase64(toUtf8Bytes(this.#creds))}`; 1137 if (this.allowGzip) headers["accept-encoding"] = "gzip"; 1138 if (headers["content-type"] == null && this.#bodyType) headers["content-type"] = this.#bodyType; 1139 if (this.body) headers["content-length"] = String(this.body.length); 1140 return headers; 1141 } 1142 /** 1143 * Get the header for %%key%%, ignoring case. 1144 */ 1145 getHeader(key) { 1146 return this.headers[key.toLowerCase()]; 1147 } 1148 /** 1149 * Set the header for %%key%% to %%value%%. All values are coerced 1150 * to a string. 1151 */ 1152 setHeader(key, value) { 1153 this.#headers[String(key).toLowerCase()] = String(value); 1154 } 1155 /** 1156 * Clear all headers, resetting all intrinsic headers. 1157 */ 1158 clearHeaders() { 1159 this.#headers = {}; 1160 } 1161 [Symbol.iterator]() { 1162 const headers = this.headers; 1163 const keys = Object.keys(headers); 1164 let index = 0; 1165 return { next: () => { 1166 if (index < keys.length) { 1167 const key = keys[index++]; 1168 return { 1169 value: [key, headers[key]], 1170 done: false 1171 }; 1172 } 1173 return { 1174 value: void 0, 1175 done: true 1176 }; 1177 } }; 1178 } 1179 /** 1180 * The value that will be sent for the ``Authorization`` header. 1181 * 1182 * To set the credentials, use the ``setCredentials`` method. 1183 */ 1184 get credentials() { 1185 return this.#creds || null; 1186 } 1187 /** 1188 * Sets an ``Authorization`` for %%username%% with %%password%%. 1189 */ 1190 setCredentials(username, password) { 1191 assertArgument(!username.match(/:/), "invalid basic authentication username", "username", "[REDACTED]"); 1192 this.#creds = `${username}:${password}`; 1193 }
1194 /** 1195 * Enable and request gzip-encoded responses. The response will 1196 * automatically be decompressed. //(default: true)// 1197 */ 1198 get allowGzip() { 1199 return this.#gzip; 1200 } 1201 set allowGzip(value) { 1202 this.#gzip = !!value; 1203 } 1204 /** 1205 * Allow ``Authentication`` credentials to be sent over insecure 1206 * channels. //(default: false)// 1207 */ 1208 get allowInsecureAuthentication() { 1209 return !!this.#allowInsecure; 1210 } 1211 set allowInsecureAuthentication(value) { 1212 this.#allowInsecure = !!value; 1213 } 1214 /** 1215 * The timeout (in milliseconds) to wait for a complete response. 1216 * //(default: 5 minutes)// 1217 */ 1218 get timeout() { 1219 return this.#timeout; 1220 } 1221 set timeout(timeout) { 1222 assertArgument(timeout >= 0, "timeout must be non-zero", "timeout", timeout); 1223 this.#timeout = timeout; 1224 } 1225 /** 1226 * This function is called prior to each request, for example 1227 * during a redirection or retry in case of server throttling. 1228 * 1229 * This offers an opportunity to populate headers or update 1230 * content before sending a request. 1231 */ 1232 get preflightFunc() { 1233 return this.#preflight || null; 1234 } 1235 set preflightFunc(preflight) { 1236 this.#preflight = preflight; 1237 } 1238 /** 1239 * This function is called after each response, offering an 1240 * opportunity to provide client-level throttling or updating 1241 * response data. 1242 * 1243 * Any error thrown in this causes the ``send()`` to throw. 1244 * 1245 * To schedule a retry attempt (assuming the maximum retry limit 1246 * has not been reached), use [[response.throwThrottleError]]. 1247 */ 1248 get processFunc() { 1249 return this.#process || null; 1250 } 1251 set processFunc(process) { 1252 this.#process = process; 1253 } 1254 /** 1255 * This function is called on each retry attempt. 1256 */ 1257 get retryFunc() { 1258 return this.#retry || null; 1259 } 1260 set retryFunc(retry) { 1261 this.#retry = retry; 1262 } 1263 /** 1264 * This function is called to fetch content from HTTP and 1265 * HTTPS URLs and is platform specific (e.g. nodejs vs 1266 * browsers). 1267 * 1268 * This is by default the currently registered global getUrl 1269 * function, which can be changed using [[registerGetUrl]]. 1270 * If this has been set, setting is to ``null`` will cause 1271 * this FetchRequest (and any future clones) to revert back to 1272 * using the currently registered global getUrl function. 1273 * 1274 * Setting this is generally not necessary, but may be useful 1275 * for developers that wish to intercept requests or to 1276 * configurege a proxy or other agent. 1277 */ 1278 get getUrlFunc() { 1279 return this.#getUrlFunc || defaultGetUrlFunc; 1280 } 1281 set getUrlFunc(value) { 1282 this.#getUrlFunc = value; 1283 } 1284 /** 1285 * Create a new FetchRequest instance with default values. 1286 * 1287 * Once created, each property may be set before issuing a 1288 * ``.send()`` to make the request. 1289 */ 1290 constructor(url) { 1291 this.#url = String(url); 1292 this.#allowInsecure = false; 1293 this.#gzip = true; 1294 this.#headers = {}; 1295 this.#method = ""; 1296 this.#timeout = 3e5; 1297 this.#throttle = { 1298 slotInterval: SLOT_INTERVAL, 1299 maxAttempts: MAX_ATTEMPTS 1300 }; 1301 this.#getUrlFunc = null; 1302 } 1303 toString() { 1304 return `<FetchRequest method=${JSON.stringify(this.method)} url=${JSON.stringify(this.url)} headers=${JSON.stringify(this.headers)} body=${this.#body ? hexlify(this.#body) : "null"}>`; 1305 } 1306 /** 1307 * Update the throttle parameters used to determine maximum 1308 * attempts and exponential-backoff properties. 1309 */ 1310 setThrottleParams(params) { 1311 if (params.slotInterval != null) this.#throttle.slotInterval = params.slotInterval; 1312 if (params.maxAttempts != null) this.#throttle.maxAttempts = params.maxAttempts; 1313 } 1314 async #send(attempt, expires, delay, _request, _response) { 1315 if (attempt >= this.#throttle.maxAttempts) return _response.makeServerError("exceeded maximum retry limit"); 1316 assert(getTime$2() <= expires, "timeout", "TIMEOUT", { 1317 operation: "request.send", 1318 reason: "timeout", 1319 request: _request 1320 }); 1321 if (delay > 0) await wait(delay); 1322 let req = this.clone(); 1323 const scheme = (req.url.split(":")[0] || "").toLowerCase(); 1324 if (scheme in Gateways) { 1325 const result = await Gateways[scheme](req.url, checkSignal(_request.#signal)); 1326 if (result instanceof FetchResponse) { 1327 let response = result; 1328 if (this.processFunc) { 1329 checkSignal(_request.#signal); 1330 try { 1331 response = await this.processFunc(req, response); 1332 } catch (error) { 1333 if (error.throttle == null || typeof error.stall !== "number") response.makeServerError("error in post-processing function", error).assertOk(); 1334 } 1335 } 1336 return response; 1337 } 1338 req = result; 1339 } 1340 if (this.preflightFunc) req = await this.preflightFunc(req); 1341 const resp = await this.getUrlFunc(req, checkSignal(_request.#signal)); 1342 let response = new FetchResponse(resp.statusCode, resp.statusMessage, resp.headers, resp.body, _request); 1343 if ([ 1344 301, 1345 302, 1346 307, 1347 308 1348 ].indexOf(response.statusCode) >= 0) { 1349 try { 1350 const location = response.headers.location || ""; 1351 return req.redirect(location).#send(attempt + 1, expires, 0, _request, response); 1352 } catch (error) {} 1353 return response; 1354 } else if (response.statusCode === 429) { 1355 if (this.retryFunc == null || await this.retryFunc(req, response, attempt)) { 1356 const retryAfter = response.headers["retry-after"]; 1357 let delay = this.#throttle.slotInterval * Math.trunc(Math.random() * Math.pow(2, attempt)); 1358 if (typeof retryAfter === "string" && retryAfter.match(/^[1-9][0-9]*$/)) delay = parseInt(retryAfter); 1359 return req.clone().#send(attempt + 1, expires, delay, _request, response); 1360 } 1361 } 1362 if (this.processFunc) { 1363 checkSignal(_request.#signal); 1364 try { 1365 response = await this.processFunc(req, response); 1366 } catch (error) { 1367 if (error.throttle == null || typeof error.stall !== "number") response.makeServerError("error in post-processing function", error).assertOk(); 1368 let delay = this.#throttle.slotInterval * Math.trunc(Math.random() * Math.pow(2, attempt)); 1369 if (error.stall >= 0) delay = error.stall; 1370 return req.clone().#send(attempt + 1, expires, delay, _request, response); 1371 } 1372 } 1373 return response; 1374 }
1375 /** 1376 * Resolves to the response by sending the request. 1377 */ 1378 send() { 1379 assert(this.#signal == null, "request already sent", "UNSUPPORTED_OPERATION", { operation: "fetchRequest.send" }); 1380 this.#signal = new FetchCancelSignal(this); 1381 return this.#send(0, getTime$2() + this.timeout, 0, this, new FetchResponse(0, "", {}, null, this)); 1382 } 1383 /** 1384 * Cancels the inflight response, causing a ``CANCELLED`` 1385 * error to be rejected from the [[send]]. 1386 */ 1387 cancel() { 1388 assert(this.#signal != null, "request has not been sent", "UNSUPPORTED_OPERATION", { operation: "fetchRequest.cancel" }); 1389 const signal = fetchSignals.get(this); 1390 if (!signal) throw new Error("missing signal; should not happen"); 1391 signal(); 1392 } 1393 /** 1394 * Returns a new [[FetchRequest]] that represents the redirection 1395 * to %%location%%. 1396 */ 1397 redirect(location) { 1398 const current = this.url.split(":")[0].toLowerCase(); 1399 const target = location.split(":")[0].toLowerCase(); 1400 assert((current !== "https" || target !== "http") && location.match(/^https?:/), `unsupported redirect`, "UNSUPPORTED_OPERATION", { operation: `redirect(${this.method} ${JSON.stringify(this.url)} => ${JSON.stringify(location)})` }); 1401 const req = new FetchRequest(location); 1402 req.method = this.method; 1403 req.allowGzip = this.allowGzip; 1404 req.timeout = this.timeout; 1405 req.#headers = Object.assign({}, this.#headers); 1406 if (this.#body) req.#body = new Uint8Array(this.#body); 1407 req.#bodyType = this.#bodyType; 1408 return req; 1409 } 1410 /** 1411 * Create a new copy of this request. 1412 */ 1413 clone() { 1414 const clone = new FetchRequest(this.url); 1415 clone.#method = this.#method; 1416 if (this.#body) clone.#body = this.#body; 1417 clone.#bodyType = this.#bodyType; 1418 clone.#headers = Object.assign({}, this.#headers); 1419 clone.#creds = this.#creds; 1420 if (this.allowGzip) clone.allowGzip = true; 1421 clone.timeout = this.timeout; 1422 if (this.allowInsecureAuthentication) clone.allowInsecureAuthentication = true; 1423 clone.#preflight = this.#preflight; 1424 clone.#process = this.#process; 1425 clone.#retry = this.#retry; 1426 clone.#throttle = Object.assign({}, this.#throttle); 1427 clone.#getUrlFunc = this.#getUrlFunc; 1428 return clone; 1429 } 1430 /** 1431 * Locks all static configuration for gateways and FetchGetUrlFunc 1432 * registration. 1433 */ 1434 static lockConfig() { 1435 locked$5 = true; 1436 } 1437 /** 1438 * Get the current Gateway function for %%scheme%%. 1439 */ 1440 static getGateway(scheme) { 1441 return Gateways[scheme.toLowerCase()] || null; 1442 } 1443 /** 1444 * Use the %%func%% when fetching URIs using %%scheme%%. 1445 * 1446 * This method affects all requests globally. 1447 * 1448 * If [[lockConfig]] has been called, no change is made and this 1449 * throws. 1450 */ 1451 static registerGateway(scheme, func) { 1452 scheme = scheme.toLowerCase(); 1453 if (scheme === "http" || scheme === "https") throw new Error(`cannot intercept ${scheme}; use registerGetUrl`); 1454 if (locked$5) throw new Error("gateways locked"); 1455 Gateways[scheme] = func; 1456 } 1457 /** 1458 * Use %%getUrl%% when fetching URIs over HTTP and HTTPS requests. 1459 * 1460 * This method affects all requests globally. 1461 * 1462 * If [[lockConfig]] has been called, no change is made and this 1463 * throws. 1464 */ 1465 static registerGetUrl(getUrl) { 1466 if (locked$5) throw new Error("gateways locked"); 1467 defaultGetUrlFunc = getUrl; 1468 } 1469 /** 1470 * Creates a getUrl function that fetches content from HTTP and 1471 * HTTPS URLs. 1472 * 1473 * The available %%options%% are dependent on the platform 1474 * implementation of the default getUrl function. 1475 * 1476 * This is not generally something that is needed, but is useful 1477 * when trying to customize simple behaviour when fetching HTTP 1478 * content. 1479 */ 1480 static createGetUrlFunc(options) { 1481 return createGetUrl(options); 1482 } 1483 /** 1484 * Creates a function that can "fetch" data URIs. 1485 * 1486 * Note that this is automatically done internally to support 1487 * data URIs, so it is not necessary to register it. 1488 * 1489 * This is not generally something that is needed, but may 1490 * be useful in a wrapper to perfom custom data URI functionality. 1491 */ 1492 static createDataGateway() { 1493 return dataGatewayFunc; 1494 } 1495 /** 1496 * Creates a function that will fetch IPFS (unvalidated) from 1497 * a custom gateway baseUrl. 1498 * 1499 * The default IPFS gateway used internally is 1500 * ``"https:/\/gateway.ipfs.io/ipfs/"``. 1501 */ 1502 static createIpfsGatewayFunc(baseUrl) { 1503 return getIpfsGatewayFunc(baseUrl); 1504 } 1505}; 1506/** 1507* The response for a FetchRequest. 1508*/ 1509var FetchResponse = class FetchResponse { 1510 #statusCode; 1511 #statusMessage; 1512 #headers; 1513 #body; 1514 #request; 1515 #error; 1516 toString() { 1517 return `<FetchResponse status=${this.statusCode} body=${this.#body ? hexlify(this.#body) : "null"}>`; 1518 }
1519 /** 1520 * The response status code. 1521 */ 1522 get statusCode() { 1523 return this.#statusCode; 1524 } 1525 /** 1526 * The response status message. 1527 */ 1528 get statusMessage() { 1529 return this.#statusMessage; 1530 } 1531 /** 1532 * The response headers. All keys are lower-case. 1533 */ 1534 get headers() { 1535 return Object.assign({}, this.#headers); 1536 } 1537 /** 1538 * The response body, or ``null`` if there was no body. 1539 */ 1540 get body() { 1541 return this.#body == null ? null : new Uint8Array(this.#body); 1542 } 1543 /** 1544 * The response body as a UTF-8 encoded string, or the empty 1545 * string (i.e. ``""``) if there was no body. 1546 * 1547 * An error is thrown if the body is invalid UTF-8 data. 1548 */ 1549 get bodyText() { 1550 try { 1551 return this.#body == null ? "" : toUtf8String(this.#body); 1552 } catch (error) { 1553 assert(false, "response body is not valid UTF-8 data", "UNSUPPORTED_OPERATION", { 1554 operation: "bodyText", 1555 info: { response: this } 1556 }); 1557 } 1558 } 1559 /** 1560 * The response body, decoded as JSON. 1561 * 1562 * An error is thrown if the body is invalid JSON-encoded data 1563 * or if there was no body. 1564 */ 1565 get bodyJson() { 1566 try { 1567 return JSON.parse(this.bodyText); 1568 } catch (error) { 1569 assert(false, "response body is not valid JSON", "UNSUPPORTED_OPERATION", { 1570 operation: "bodyJson", 1571 info: { response: this } 1572 }); 1573 } 1574 } 1575 [Symbol.iterator]() { 1576 const headers = this.headers; 1577 const keys = Object.keys(headers); 1578 let index = 0; 1579 return { next: () => { 1580 if (index < keys.length) { 1581 const key = keys[index++]; 1582 return { 1583 value: [key, headers[key]], 1584 done: false 1585 }; 1586 } 1587 return { 1588 value: void 0, 1589 done: true 1590 }; 1591 } }; 1592 } 1593 constructor(statusCode, statusMessage, headers, body, request) { 1594 this.#statusCode = statusCode; 1595 this.#statusMessage = statusMessage; 1596 this.#headers = Object.keys(headers).reduce((accum, k) => { 1597 accum[k.toLowerCase()] = String(headers[k]); 1598 return accum; 1599 }, {}); 1600 this.#body = body == null ? null : new Uint8Array(body); 1601 this.#request = request || null; 1602 this.#error = { message: "" }; 1603 } 1604 /** 1605 * Return a Response with matching headers and body, but with 1606 * an error status code (i.e. 599) and %%message%% with an 1607 * optional %%error%%. 1608 */ 1609 makeServerError(message, error) { 1610 let statusMessage; 1611 if (!message) { 1612 message = `${this.statusCode} ${this.statusMessage}`; 1613 statusMessage = `CLIENT ESCALATED SERVER ERROR (${message})`; 1614 } else statusMessage = `CLIENT ESCALATED SERVER ERROR (${this.statusCode} ${this.statusMessage}; ${message})`; 1615 const response = new FetchResponse(599, statusMessage, this.headers, this.body, this.#request || void 0); 1616 response.#error = { 1617 message, 1618 error 1619 }; 1620 return response; 1621 } 1622 /** 1623 * If called within a [request.processFunc](FetchRequest-processFunc) 1624 * call, causes the request to retry as if throttled for %%stall%% 1625 * milliseconds. 1626 */ 1627 throwThrottleError(message, stall) { 1628 if (stall == null) stall = -1; 1629 else assertArgument(Number.isInteger(stall) && stall >= 0, "invalid stall timeout", "stall", stall); 1630 const error = new Error(message || "throttling requests"); 1631 defineProperties(error, { 1632 stall, 1633 throttle: true 1634 }); 1635 throw error; 1636 } 1637 /** 1638 * Get the header value for %%key%%, ignoring case. 1639 */ 1640 getHeader(key) { 1641 return this.headers[key.toLowerCase()]; 1642 } 1643 /** 1644 * Returns true if the response has a body. 1645 */ 1646 hasBody() { 1647 return this.#body != null; 1648 } 1649 /** 1650 * The request made for this response. 1651 */ 1652 get request() { 1653 return this.#request; 1654 } 1655 /** 1656 * Returns true if this response was a success statusCode. 1657 */ 1658 ok() { 1659 return this.#error.message === "" && this.statusCode >= 200 && this.statusCode < 300; 1660 } 1661 /** 1662 * Throws a ``SERVER_ERROR`` if this response is not ok. 1663 */ 1664 assertOk() { 1665 if (this.ok()) return; 1666 let { message, error } = this.#error; 1667 if (message === "") message = `server response ${this.statusCode} ${this.statusMessage}`; 1668 let requestUrl = null; 1669 if (this.request) requestUrl = this.request.url; 1670 let responseBody = null; 1671 try { 1672 if (this.#body) responseBody = toUtf8String(this.#body); 1673 } catch (e) {} 1674 assert(false, message, "SERVER_ERROR", { 1675 request: this.request || "unknown request", 1676 response: this, 1677 error, 1678 info: { 1679 requestUrl, 1680 responseBody, 1681 responseStatus: `${this.statusCode} ${this.statusMessage}` 1682 } 1683 }); 1684 } 1685}; 1686function getTime$2() { 1687 return (/* @__PURE__ */ new Date()).getTime(); 1688} 1689function unpercent(value) { 1690 return toUtf8Bytes(value.replace(/%([0-9a-f][0-9a-f])/gi, (all, code) => { 1691 return String.fromCharCode(parseInt(code, 16)); 1692 })); 1693} 1694function wait(delay) { 1695 return new Promise((resolve) => setTimeout(resolve, delay)); 1696} 1697//#endregion 1698//#region node_modules/ethers/lib.esm/utils/fixednumber.js 1699/** 1700* The **FixedNumber** class permits using values with decimal places, 1701* using fixed-pont math. 1702* 1703* Fixed-point math is still based on integers under-the-hood, but uses an 1704* internal offset to store fractional components below, and each operation 1705* corrects for this after each operation. 1706* 1707* @_section: api/utils/fixed-point-math:Fixed-Point Maths [about-fixed-point-math] 1708*/ 1709var BN_N1 = BigInt(-1); 1710var BN_0$8 = BigInt(0); 1711var BN_1$4 = BigInt(1); 1712var BN_5 = BigInt(5); 1713var _guard$5 = {}; 1714var Zeros$1 = "0000"; 1715while (Zeros$1.length < 80) Zeros$1 += Zeros$1; 1716function getTens(decimals) { 1717 let result = Zeros$1; 1718 while (result.length < decimals) result += result; 1719 return BigInt("1" + result.substring(0, decimals)); 1720} 1721function checkValue(val, format, safeOp) { 1722 const width = BigInt(format.width); 1723 if (format.signed) { 1724 const limit = BN_1$4 << width - BN_1$4; 1725 assert(safeOp == null || val >= -limit && val < limit, "overflow", "NUMERIC_FAULT", { 1726 operation: safeOp, 1727 fault: "overflow", 1728 value: val 1729 }); 1730 if (val > BN_0$8) val = fromTwos(mask(val, width), width); 1731 else val = -fromTwos(mask(-val, width), width); 1732 } else { 1733 const limit = BN_1$4 << width; 1734 assert(safeOp == null || val >= 0 && val < limit, "overflow", "NUMERIC_FAULT", { 1735 operation: safeOp, 1736 fault: "overflow", 1737 value: val 1738 }); 1739 val = (val % limit + limit) % limit & limit - BN_1$4; 1740 } 1741 return val; 1742} 1743function getFormat(value) { 1744 if (typeof value === "number") value = `fixed128x${value}`; 1745 let signed = true; 1746 let width = 128; 1747 let decimals = 18; 1748 if (typeof value === "string") { 1749 if (value === "fixed") {} else if (value === "ufixed") signed = false;
1750 else { 1751 const match = value.match(/^(u?)fixed([0-9]+)x([0-9]+)$/); 1752 assertArgument(match, "invalid fixed format", "format", value); 1753 signed = match[1] !== "u"; 1754 width = parseInt(match[2]); 1755 decimals = parseInt(match[3]); 1756 } 1757 } else if (value) { 1758 const v = value; 1759 const check = (key, type, defaultValue) => { 1760 if (v[key] == null) return defaultValue; 1761 assertArgument(typeof v[key] === type, "invalid fixed format (" + key + " not " + type + ")", "format." + key, v[key]); 1762 return v[key]; 1763 }; 1764 signed = check("signed", "boolean", signed); 1765 width = check("width", "number", width); 1766 decimals = check("decimals", "number", decimals); 1767 } 1768 assertArgument(width % 8 === 0, "invalid FixedNumber width (not byte aligned)", "format.width", width); 1769 assertArgument(decimals <= 80, "invalid FixedNumber decimals (too large)", "format.decimals", decimals); 1770 const name = (signed ? "" : "u") + "fixed" + String(width) + "x" + String(decimals); 1771 return { 1772 signed, 1773 width, 1774 decimals, 1775 name 1776 }; 1777} 1778function toString(val, decimals) { 1779 let negative = ""; 1780 if (val < BN_0$8) { 1781 negative = "-"; 1782 val *= BN_N1; 1783 } 1784 let str = val.toString(); 1785 if (decimals === 0) return negative + str; 1786 while (str.length <= decimals) str = Zeros$1 + str; 1787 const index = str.length - decimals; 1788 str = str.substring(0, index) + "." + str.substring(index); 1789 while (str[0] === "0" && str[1] !== ".") str = str.substring(1); 1790 while (str[str.length - 1] === "0" && str[str.length - 2] !== ".") str = str.substring(0, str.length - 1); 1791 return negative + str; 1792} 1793/** 1794* A FixedNumber represents a value over its [[FixedFormat]] 1795* arithmetic field. 1796* 1797* A FixedNumber can be used to perform math, losslessly, on 1798* values which have decmial places. 1799* 1800* A FixedNumber has a fixed bit-width to store values in, and stores all 1801* values internally by multiplying the value by 10 raised to the power of 1802* %%decimals%%. 1803* 1804* If operations are performed that cause a value to grow too high (close to 1805* positive infinity) or too low (close to negative infinity), the value 1806* is said to //overflow//. 1807* 1808* For example, an 8-bit signed value, with 0 decimals may only be within 1809* the range ``-128`` to ``127``; so ``-128 - 1`` will overflow and become 1810* ``127``. Likewise, ``127 + 1`` will overflow and become ``-127``. 1811* 1812* Many operation have a normal and //unsafe// variant. The normal variant 1813* will throw a [[NumericFaultError]] on any overflow, while the //unsafe// 1814* variant will silently allow overflow, corrupting its value value. 1815* 1816* If operations are performed that cause a value to become too small 1817* (close to zero), the value loses precison and is said to //underflow//. 1818* 1819* For example, a value with 1 decimal place may store a number as small 1820* as ``0.1``, but the value of ``0.1 / 2`` is ``0.05``, which cannot fit 1821* into 1 decimal place, so underflow occurs which means precision is lost 1822* and the value becomes ``0``. 1823* 1824* Some operations have a normal and //signalling// variant. The normal 1825* variant will silently ignore underflow, while the //signalling// variant 1826* will thow a [[NumericFaultError]] on underflow. 1827*/ 1828var FixedNumber = class FixedNumber { 1829 /** 1830 * The specific fixed-point arithmetic field for this value. 1831 */ 1832 format; 1833 #format; 1834 #val; 1835 #tens; 1836 /** 1837 * This is a property so console.log shows a human-meaningful value. 1838 * 1839 * @private 1840 */ 1841 _value; 1842 /** 1843 * @private 1844 */ 1845 constructor(guard, value, format) { 1846 assertPrivate(guard, _guard$5, "FixedNumber"); 1847 this.#val = value; 1848 this.#format = format; 1849 const _value = toString(value, format.decimals); 1850 defineProperties(this, { 1851 format: format.name, 1852 _value 1853 }); 1854 this.#tens = getTens(format.decimals); 1855 } 1856 /** 1857 * If true, negative values are permitted, otherwise only 1858 * positive values and zero are allowed. 1859 */ 1860 get signed() { 1861 return this.#format.signed; 1862 } 1863 /** 1864 * The number of bits available to store the value. 1865 */ 1866 get width() { 1867 return this.#format.width; 1868 } 1869 /** 1870 * The number of decimal places in the fixed-point arithment field. 1871 */ 1872 get decimals() { 1873 return this.#format.decimals; 1874 } 1875 /** 1876 * The value as an integer, based on the smallest unit the 1877 * [[decimals]] allow. 1878 */ 1879 get value() { 1880 return this.#val; 1881 } 1882 #checkFormat(other) { 1883 assertArgument(this.format === other.format, "incompatible format; use fixedNumber.toFormat", "other", other); 1884 } 1885 #checkValue(val, safeOp) { 1886 val = checkValue(val, this.#format, safeOp); 1887 return new FixedNumber(_guard$5, val, this.#format); 1888 } 1889 #add(o, safeOp) { 1890 this.#checkFormat(o); 1891 return this.#checkValue(this.#val + o.#val, safeOp); 1892 } 1893 /** 1894 * Returns a new [[FixedNumber]] with the result of %%this%% added 1895 * to %%other%%, ignoring overflow. 1896 */ 1897 addUnsafe(other) { 1898 return this.#add(other); 1899 } 1900 /** 1901 * Returns a new [[FixedNumber]] with the result of %%this%% added 1902 * to %%other%%. A [[NumericFaultError]] is thrown if overflow 1903 * occurs. 1904 */ 1905 add(other) { 1906 return this.#add(other, "add"); 1907 } 1908 #sub(o, safeOp) { 1909 this.#checkFormat(o); 1910 return this.#checkValue(this.#val - o.#val, safeOp); 1911 } 1912 /** 1913 * Returns a new [[FixedNumber]] with the result of %%other%% subtracted 1914 * from %%this%%, ignoring overflow. 1915 */ 1916 subUnsafe(other) { 1917 return this.#sub(other); 1918 } 1919 /** 1920 * Returns a new [[FixedNumber]] with the result of %%other%% subtracted 1921 * from %%this%%. A [[NumericFaultError]] is thrown if overflow 1922 * occurs. 1923 */ 1924 sub(other) { 1925 return this.#sub(other, "sub"); 1926 } 1927 #mul(o, safeOp) { 1928 this.#checkFormat(o); 1929 return this.#checkValue(this.#val * o.#val / this.#tens, safeOp); 1930 } 1931 /** 1932 * Returns a new [[FixedNumber]] with the result of %%this%% multiplied 1933 * by %%other%%, ignoring overflow and underflow (precision loss). 1934 */ 1935 mulUnsafe(other) { 1936 return this.#mul(other); 1937 } 1938 /** 1939 * Returns a new [[FixedNumber]] with the result of %%this%% multiplied 1940 * by %%other%%. A [[NumericFaultError]] is thrown if overflow 1941 * occurs. 1942 */
1943 mul(other) { 1944 return this.#mul(other, "mul"); 1945 } 1946 /** 1947 * Returns a new [[FixedNumber]] with the result of %%this%% multiplied 1948 * by %%other%%. A [[NumericFaultError]] is thrown if overflow 1949 * occurs or if underflow (precision loss) occurs. 1950 */ 1951 mulSignal(other) { 1952 this.#checkFormat(other); 1953 const value = this.#val * other.#val; 1954 assert(value % this.#tens === BN_0$8, "precision lost during signalling mul", "NUMERIC_FAULT", { 1955 operation: "mulSignal", 1956 fault: "underflow", 1957 value: this 1958 }); 1959 return this.#checkValue(value / this.#tens, "mulSignal"); 1960 } 1961 #div(o, safeOp) { 1962 assert(o.#val !== BN_0$8, "division by zero", "NUMERIC_FAULT", { 1963 operation: "div", 1964 fault: "divide-by-zero", 1965 value: this 1966 }); 1967 this.#checkFormat(o); 1968 return this.#checkValue(this.#val * this.#tens / o.#val, safeOp); 1969 } 1970 /** 1971 * Returns a new [[FixedNumber]] with the result of %%this%% divided 1972 * by %%other%%, ignoring underflow (precision loss). A 1973 * [[NumericFaultError]] is thrown if overflow occurs. 1974 */ 1975 divUnsafe(other) { 1976 return this.#div(other); 1977 } 1978 /** 1979 * Returns a new [[FixedNumber]] with the result of %%this%% divided 1980 * by %%other%%, ignoring underflow (precision loss). A 1981 * [[NumericFaultError]] is thrown if overflow occurs. 1982 */ 1983 div(other) { 1984 return this.#div(other, "div"); 1985 } 1986 /** 1987 * Returns a new [[FixedNumber]] with the result of %%this%% divided 1988 * by %%other%%. A [[NumericFaultError]] is thrown if underflow 1989 * (precision loss) occurs. 1990 */ 1991 divSignal(other) { 1992 assert(other.#val !== BN_0$8, "division by zero", "NUMERIC_FAULT", { 1993 operation: "div", 1994 fault: "divide-by-zero", 1995 value: this 1996 }); 1997 this.#checkFormat(other); 1998 const value = this.#val * this.#tens; 1999 assert(value % other.#val === BN_0$8, "precision lost during signalling div", "NUMERIC_FAULT", { 2000 operation: "divSignal", 2001 fault: "underflow", 2002 value: this 2003 }); 2004 return this.#checkValue(value / other.#val, "divSignal"); 2005 } 2006 /** 2007 * Returns a comparison result between %%this%% and %%other%%. 2008 * 2009 * This is suitable for use in sorting, where ``-1`` implies %%this%% 2010 * is smaller, ``1`` implies %%this%% is larger and ``0`` implies 2011 * both are equal. 2012 */ 2013 cmp(other) { 2014 let a = this.value, b = other.value; 2015 const delta = this.decimals - other.decimals; 2016 if (delta > 0) b *= getTens(delta); 2017 else if (delta < 0) a *= getTens(-delta); 2018 if (a < b) return -1; 2019 if (a > b) return 1; 2020 return 0; 2021 } 2022 /** 2023 * Returns true if %%other%% is equal to %%this%%. 2024 */ 2025 eq(other) { 2026 return this.cmp(other) === 0; 2027 } 2028 /** 2029 * Returns true if %%other%% is less than to %%this%%. 2030 */ 2031 lt(other) { 2032 return this.cmp(other) < 0; 2033 } 2034 /** 2035 * Returns true if %%other%% is less than or equal to %%this%%. 2036 */ 2037 lte(other) { 2038 return this.cmp(other) <= 0; 2039 } 2040 /** 2041 * Returns true if %%other%% is greater than to %%this%%. 2042 */ 2043 gt(other) { 2044 return this.cmp(other) > 0; 2045 } 2046 /** 2047 * Returns true if %%other%% is greater than or equal to %%this%%. 2048 */ 2049 gte(other) { 2050 return this.cmp(other) >= 0; 2051 } 2052 /** 2053 * Returns a new [[FixedNumber]] which is the largest **integer** 2054 * that is less than or equal to %%this%%. 2055 * 2056 * The decimal component of the result will always be ``0``. 2057 */ 2058 floor() { 2059 let val = this.#val; 2060 if (this.#val < BN_0$8) val -= this.#tens - BN_1$4; 2061 val = this.#val / this.#tens * this.#tens; 2062 return this.#checkValue(val, "floor"); 2063 } 2064 /** 2065 * Returns a new [[FixedNumber]] which is the smallest **integer** 2066 * that is greater than or equal to %%this%%. 2067 * 2068 * The decimal component of the result will always be ``0``. 2069 */ 2070 ceiling() { 2071 let val = this.#val; 2072 if (this.#val > BN_0$8) val += this.#tens - BN_1$4; 2073 val = this.#val / this.#tens * this.#tens; 2074 return this.#checkValue(val, "ceiling"); 2075 } 2076 /** 2077 * Returns a new [[FixedNumber]] with the decimal component 2078 * rounded up on ties at %%decimals%% places. 2079 */ 2080 round(decimals) { 2081 if (decimals == null) decimals = 0; 2082 if (decimals >= this.decimals) return this; 2083 const delta = this.decimals - decimals; 2084 const bump = BN_5 * getTens(delta - 1); 2085 let value = this.value + bump; 2086 const tens = getTens(delta); 2087 value = value / tens * tens; 2088 checkValue(value, this.#format, "round"); 2089 return new FixedNumber(_guard$5, value, this.#format); 2090 } 2091 /** 2092 * Returns true if %%this%% is equal to ``0``. 2093 */ 2094 isZero() { 2095 return this.#val === BN_0$8; 2096 }
2097 /** 2098 * Returns true if %%this%% is less than ``0``. 2099 */ 2100 isNegative() { 2101 return this.#val < BN_0$8; 2102 } 2103 /** 2104 * Returns the string representation of %%this%%. 2105 */ 2106 toString() { 2107 return this._value; 2108 } 2109 /** 2110 * Returns a float approximation. 2111 * 2112 * Due to IEEE 754 precission (or lack thereof), this function 2113 * can only return an approximation and most values will contain 2114 * rounding errors. 2115 */ 2116 toUnsafeFloat() { 2117 return parseFloat(this.toString()); 2118 } 2119 /** 2120 * Return a new [[FixedNumber]] with the same value but has had 2121 * its field set to %%format%%. 2122 * 2123 * This will throw if the value cannot fit into %%format%%. 2124 */ 2125 toFormat(format) { 2126 return FixedNumber.fromString(this.toString(), format); 2127 } 2128 /** 2129 * Creates a new [[FixedNumber]] for %%value%% divided by 2130 * %%decimal%% places with %%format%%. 2131 * 2132 * This will throw a [[NumericFaultError]] if %%value%% (once adjusted 2133 * for %%decimals%%) cannot fit in %%format%%, either due to overflow 2134 * or underflow (precision loss). 2135 */ 2136 static fromValue(_value, _decimals, _format) { 2137 const decimals = _decimals == null ? 0 : getNumber(_decimals); 2138 const format = getFormat(_format); 2139 let value = getBigInt(_value, "value"); 2140 const delta = decimals - format.decimals; 2141 if (delta > 0) { 2142 const tens = getTens(delta); 2143 assert(value % tens === BN_0$8, "value loses precision for format", "NUMERIC_FAULT", { 2144 operation: "fromValue", 2145 fault: "underflow", 2146 value: _value 2147 }); 2148 value /= tens; 2149 } else if (delta < 0) value *= getTens(-delta); 2150 checkValue(value, format, "fromValue"); 2151 return new FixedNumber(_guard$5, value, format); 2152 } 2153 /** 2154 * Creates a new [[FixedNumber]] for %%value%% with %%format%%. 2155 * 2156 * This will throw a [[NumericFaultError]] if %%value%% cannot fit 2157 * in %%format%%, either due to overflow or underflow (precision loss). 2158 */ 2159 static fromString(_value, _format) { 2160 const match = _value.match(/^(-?)([0-9]*)\.?([0-9]*)$/); 2161 assertArgument(match && match[2].length + match[3].length > 0, "invalid FixedNumber string value", "value", _value); 2162 const format = getFormat(_format); 2163 let whole = match[2] || "0", decimal = match[3] || ""; 2164 while (decimal.length < format.decimals) decimal += Zeros$1; 2165 assert(decimal.substring(format.decimals).match(/^0*$/), "too many decimals for format", "NUMERIC_FAULT", { 2166 operation: "fromString", 2167 fault: "underflow", 2168 value: _value 2169 }); 2170 decimal = decimal.substring(0, format.decimals); 2171 const value = BigInt(match[1] + whole + decimal); 2172 checkValue(value, format, "fromString"); 2173 return new FixedNumber(_guard$5, value, format); 2174 } 2175 /** 2176 * Creates a new [[FixedNumber]] with the big-endian representation 2177 * %%value%% with %%format%%. 2178 * 2179 * This will throw a [[NumericFaultError]] if %%value%% cannot fit 2180 * in %%format%% due to overflow. 2181 */ 2182 static fromBytes(_value, _format) { 2183 let value = toBigInt(getBytes(_value, "value")); 2184 const format = getFormat(_format); 2185 if (format.signed) value = fromTwos(value, format.width); 2186 checkValue(value, format, "fromBytes"); 2187 return new FixedNumber(_guard$5, value, format); 2188 } 2189}; 2190//#endregion 2191//#region node_modules/ethers/lib.esm/utils/rlp-decode.js 2192function hexlifyByte(value) { 2193 let result = value.toString(16); 2194 while (result.length < 2) result = "0" + result; 2195 return "0x" + result; 2196} 2197function unarrayifyInteger(data, offset, length) { 2198 let result = 0; 2199 for (let i = 0; i < length; i++) result = result * 256 + data[offset + i]; 2200 return result; 2201} 2202function _decodeChildren(data, offset, childOffset, length) { 2203 const result = []; 2204 while (childOffset < offset + 1 + length) { 2205 const decoded = _decode(data, childOffset); 2206 result.push(decoded.result); 2207 childOffset += decoded.consumed; 2208 assert(childOffset <= offset + 1 + length, "child data too short", "BUFFER_OVERRUN", { 2209 buffer: data, 2210 length, 2211 offset 2212 }); 2213 } 2214 return { 2215 consumed: 1 + length, 2216 result 2217 }; 2218} 2219function _decode(data, offset) { 2220 assert(data.length !== 0, "data too short", "BUFFER_OVERRUN", { 2221 buffer: data, 2222 length: 0, 2223 offset: 1 2224 }); 2225 const checkOffset = (offset) => { 2226 assert(offset <= data.length, "data short segment too short", "BUFFER_OVERRUN", { 2227 buffer: data, 2228 length: data.length, 2229 offset 2230 }); 2231 }; 2232 if (data[offset] >= 248) { 2233 const lengthLength = data[offset] - 247; 2234 checkOffset(offset + 1 + lengthLength); 2235 const length = unarrayifyInteger(data, offset + 1, lengthLength); 2236 checkOffset(offset + 1 + lengthLength + length); 2237 return _decodeChildren(data, offset, offset + 1 + lengthLength, lengthLength + length); 2238 } else if (data[offset] >= 192) { 2239 const length = data[offset] - 192; 2240 checkOffset(offset + 1 + length); 2241 return _decodeChildren(data, offset, offset + 1, length); 2242 } else if (data[offset] >= 184) { 2243 const lengthLength = data[offset] - 183; 2244 checkOffset(offset + 1 + lengthLength); 2245 const length = unarrayifyInteger(data, offset + 1, lengthLength); 2246 checkOffset(offset + 1 + lengthLength + length); 2247 const result = hexlify(data.slice(offset + 1 + lengthLength, offset + 1 + lengthLength + length)); 2248 return { 2249 consumed: 1 + lengthLength + length, 2250 result 2251 }; 2252 } else if (data[offset] >= 128) { 2253 const length = data[offset] - 128; 2254 checkOffset(offset + 1 + length); 2255 const result = hexlify(data.slice(offset + 1, offset + 1 + length)); 2256 return { 2257 consumed: 1 + length, 2258 result 2259 }; 2260 } 2261 return { 2262 consumed: 1, 2263 result: hexlifyByte(data[offset]) 2264 }; 2265} 2266/** 2267* Decodes %%data%% into the structured data it represents. 2268*/ 2269function decodeRlp(_data) { 2270 const data = getBytes(_data, "data"); 2271 const decoded = _decode(data, 0); 2272 assertArgument(decoded.consumed === data.length, "unexpected junk after rlp payload", "data", _data); 2273 return decoded.result; 2274} 2275//#endregion 2276//#region node_modules/ethers/lib.esm/utils/rlp-encode.js 2277function arrayifyInteger(value) { 2278 const result = []; 2279 while (value) { 2280 result.unshift(value & 255); 2281 value >>= 8; 2282 } 2283 return result; 2284} 2285function _encode(object) { 2286 if (Array.isArray(object)) { 2287 let payload = []; 2288 object.forEach(function(child) { 2289 payload = payload.concat(_encode(child)); 2290 }); 2291 if (payload.length <= 55) { 2292 payload.unshift(192 + payload.length); 2293 return payload; 2294 } 2295 const length = arrayifyInteger(payload.length); 2296 length.unshift(247 + length.length); 2297 return length.concat(payload); 2298 } 2299 const data = Array.prototype.slice.call(getBytes(object, "object")); 2300 if (data.length === 1 && data[0] <= 127) return data; 2301 else if (data.length <= 55) { 2302 data.unshift(128 + data.length); 2303 return data; 2304 } 2305 const length = arrayifyInteger(data.length); 2306 length.unshift(183 + length.length); 2307 return length.concat(data); 2308} 2309var nibbles = "0123456789abcdef"; 2310/** 2311* Encodes %%object%% as an RLP-encoded [[DataHexString]]. 2312*/ 2313function encodeRlp(object) {
2314 let result = "0x"; 2315 for (const v of _encode(object)) { 2316 result += nibbles[v >> 4]; 2317 result += nibbles[v & 15]; 2318 } 2319 return result; 2320} 2321//#endregion 2322//#region node_modules/ethers/lib.esm/utils/units.js 2323/** 2324* Most interactions with Ethereum requires integer values, which use 2325* the smallest magnitude unit. 2326* 2327* For example, imagine dealing with dollars and cents. Since dollars 2328* are divisible, non-integer values are possible, such as ``$10.77``. 2329* By using the smallest indivisible unit (i.e. cents), the value can 2330* be kept as the integer ``1077``. 2331* 2332* When receiving decimal input from the user (as a decimal string), 2333* the value should be converted to an integer and when showing a user 2334* a value, the integer value should be converted to a decimal string. 2335* 2336* This creates a clear distinction, between values to be used by code 2337* (integers) and values used for display logic to users (decimals). 2338* 2339* The native unit in Ethereum, //ether// is divisible to 18 decimal places, 2340* where each individual unit is called a //wei//. 2341* 2342* @_subsection api/utils:Unit Conversion [about-units] 2343*/ 2344var names = [ 2345 "wei", 2346 "kwei", 2347 "mwei", 2348 "gwei", 2349 "szabo", 2350 "finney", 2351 "ether" 2352]; 2353/** 2354* Converts %%value%% into a //decimal string//, assuming %%unit%% decimal 2355* places. The %%unit%% may be the number of decimal places or the name of 2356* a unit (e.g. ``"gwei"`` for 9 decimal places). 2357* 2358*/ 2359function formatUnits(value, unit) { 2360 let decimals = 18; 2361 if (typeof unit === "string") { 2362 const index = names.indexOf(unit); 2363 assertArgument(index >= 0, "invalid unit", "unit", unit); 2364 decimals = 3 * index; 2365 } else if (unit != null) decimals = getNumber(unit, "unit"); 2366 return FixedNumber.fromValue(value, decimals, { 2367 decimals, 2368 width: 512 2369 }).toString(); 2370} 2371/** 2372* Converts the //decimal string// %%value%% to a BigInt, assuming 2373* %%unit%% decimal places. The %%unit%% may the number of decimal places 2374* or the name of a unit (e.g. ``"gwei"`` for 9 decimal places). 2375*/ 2376function parseUnits(value, unit) { 2377 assertArgument(typeof value === "string", "value must be a string", "value", value); 2378 let decimals = 18; 2379 if (typeof unit === "string") { 2380 const index = names.indexOf(unit); 2381 assertArgument(index >= 0, "invalid unit", "unit", unit); 2382 decimals = 3 * index; 2383 } else if (unit != null) decimals = getNumber(unit, "unit"); 2384 return FixedNumber.fromString(value, { 2385 decimals, 2386 width: 512 2387 }).value; 2388} 2389/** 2390* Converts %%value%% into a //decimal string// using 18 decimal places. 2391*/ 2392function formatEther(wei) { 2393 return formatUnits(wei, 18); 2394} 2395/** 2396* Converts the //decimal string// %%ether%% to a BigInt, using 18 2397* decimal places. 2398*/ 2399function parseEther(ether) { 2400 return parseUnits(ether, 18); 2401} 2402//#endregion 2403//#region node_modules/ethers/lib.esm/utils/uuid.js 2404/** 2405* Explain UUID and link to RFC here. 2406* 2407* @_subsection: api/utils:UUID [about-uuid] 2408*/ 2409/** 2410* Returns the version 4 [[link-uuid]] for the %%randomBytes%%. 2411* 2412* @see: https://www.ietf.org/rfc/rfc4122.txt (Section 4.4) 2413*/ 2414function uuidV4(randomBytes) { 2415 const bytes = getBytes(randomBytes, "randomBytes"); 2416 bytes[6] = bytes[6] & 15 | 64; 2417 bytes[8] = bytes[8] & 63 | 128; 2418 const value = hexlify(bytes); 2419 return [ 2420 value.substring(2, 10), 2421 value.substring(10, 14), 2422 value.substring(14, 18), 2423 value.substring(18, 22), 2424 value.substring(22, 34) 2425 ].join("-"); 2426} 2427var Padding = /* @__PURE__ */ new Uint8Array(32); 2428var passProperties$1 = ["then"]; 2429var _guard$4 = {}; 2430var resultNames = /* @__PURE__ */ new WeakMap(); 2431function getNames(result) { 2432 return resultNames.get(result); 2433} 2434function setNames(result, names) { 2435 resultNames.set(result, names); 2436} 2437function throwError(name, error) { 2438 const wrapped = /* @__PURE__ */ new Error(`deferred error during ABI decoding triggered accessing ${name}`); 2439 wrapped.error = error; 2440 throw wrapped; 2441} 2442function toObject(names, items, deep) { 2443 if (names.indexOf(null) >= 0) return items.map((item, index) => { 2444 if (item instanceof Result) return toObject(getNames(item), item, deep); 2445 return item; 2446 }); 2447 return names.reduce((accum, name, index) => { 2448 let item = items.getValue(name); 2449 if (!(name in accum)) {
2450 if (deep && item instanceof Result) item = toObject(getNames(item), item, deep); 2451 accum[name] = item; 2452 } 2453 return accum; 2454 }, {}); 2455} 2456/** 2457* A [[Result]] is a sub-class of Array, which allows accessing any 2458* of its values either positionally by its index or, if keys are 2459* provided by its name. 2460* 2461* @_docloc: api/abi 2462*/ 2463var Result = class Result extends Array { 2464 #names; 2465 /** 2466 * @private 2467 */ 2468 constructor(...args) { 2469 const guard = args[0]; 2470 let items = args[1]; 2471 let names = (args[2] || []).slice(); 2472 let wrap = true; 2473 if (guard !== _guard$4) { 2474 items = args; 2475 names = []; 2476 wrap = false; 2477 } 2478 super(items.length); 2479 items.forEach((item, index) => { 2480 this[index] = item; 2481 }); 2482 const nameCounts = names.reduce((accum, name) => { 2483 if (typeof name === "string") accum.set(name, (accum.get(name) || 0) + 1); 2484 return accum; 2485 }, /* @__PURE__ */ new Map()); 2486 setNames(this, Object.freeze(items.map((item, index) => { 2487 const name = names[index]; 2488 if (name != null && nameCounts.get(name) === 1) return name; 2489 return null; 2490 }))); 2491 this.#names = []; 2492 if (this.#names == null) this.#names; 2493 if (!wrap) return; 2494 Object.freeze(this); 2495 const proxy = new Proxy(this, { get: (target, prop, receiver) => { 2496 if (typeof prop === "string") { 2497 if (prop.match(/^[0-9]+$/)) { 2498 const index = getNumber(prop, "%index"); 2499 if (index < 0 || index >= this.length) throw new RangeError("out of result range"); 2500 const item = target[index]; 2501 if (item instanceof Error) throwError(`index ${index}`, item); 2502 return item; 2503 } 2504 if (passProperties$1.indexOf(prop) >= 0) return Reflect.get(target, prop, receiver); 2505 const value = target[prop]; 2506 if (value instanceof Function) return function(...args) { 2507 return value.apply(this === receiver ? target : this, args); 2508 }; 2509 else if (!(prop in target)) return target.getValue.apply(this === receiver ? target : this, [prop]); 2510 } 2511 return Reflect.get(target, prop, receiver); 2512 } }); 2513 setNames(proxy, getNames(this)); 2514 return proxy; 2515 } 2516 /** 2517 * Returns the Result as a normal Array. If %%deep%%, any children 2518 * which are Result objects are also converted to a normal Array. 2519 * 2520 * This will throw if there are any outstanding deferred 2521 * errors. 2522 */ 2523 toArray(deep) { 2524 const result = []; 2525 this.forEach((item, index) => { 2526 if (item instanceof Error) throwError(`index ${index}`, item); 2527 if (deep && item instanceof Result) item = item.toArray(deep); 2528 result.push(item); 2529 }); 2530 return result; 2531 } 2532 /** 2533 * Returns the Result as an Object with each name-value pair. If 2534 * %%deep%%, any children which are Result objects are also 2535 * converted to an Object. 2536 * 2537 * This will throw if any value is unnamed, or if there are 2538 * any outstanding deferred errors. 2539 */ 2540 toObject(deep) { 2541 const names = getNames(this); 2542 return names.reduce((accum, name, index) => { 2543 assert(name != null, `value at index ${index} unnamed`, "UNSUPPORTED_OPERATION", { operation: "toObject()" }); 2544 return toObject(names, this, deep); 2545 }, {}); 2546 } 2547 /** 2548 * @_ignore 2549 */ 2550 slice(start, end) { 2551 if (start == null) start = 0; 2552 if (start < 0) { 2553 start += this.length; 2554 if (start < 0) start = 0; 2555 } 2556 if (end == null) end = this.length; 2557 if (end < 0) { 2558 end += this.length; 2559 if (end < 0) end = 0; 2560 } 2561 if (end > this.length) end = this.length; 2562 const _names = getNames(this); 2563 const result = [], names = []; 2564 for (let i = start; i < end; i++) { 2565 result.push(this[i]); 2566 names.push(_names[i]); 2567 } 2568 return new Result(_guard$4, result, names); 2569 } 2570 /** 2571 * @_ignore 2572 */ 2573 filter(callback, thisArg) { 2574 const _names = getNames(this); 2575 const result = [], names = []; 2576 for (let i = 0; i < this.length; i++) { 2577 const item = this[i]; 2578 if (item instanceof Error) throwError(`index ${i}`, item); 2579 if (callback.call(thisArg, item, i, this)) { 2580 result.push(item); 2581 names.push(_names[i]); 2582 } 2583 } 2584 return new Result(_guard$4, result, names); 2585 } 2586 /** 2587 * @_ignore 2588 */ 2589 map(callback, thisArg) { 2590 const result = []; 2591 for (let i = 0; i < this.length; i++) { 2592 const item = this[i]; 2593 if (item instanceof Error) throwError(`index ${i}`, item); 2594 result.push(callback.call(thisArg, item, i, this)); 2595 } 2596 return result; 2597 }
2598 /** 2599 * Returns the value for %%name%%. 2600 * 2601 * Since it is possible to have a key whose name conflicts with 2602 * a method on a [[Result]] or its superclass Array, or any 2603 * JavaScript keyword, this ensures all named values are still 2604 * accessible by name. 2605 */ 2606 getValue(name) { 2607 const index = getNames(this).indexOf(name); 2608 if (index === -1) return; 2609 const value = this[index]; 2610 if (value instanceof Error) throwError(`property ${JSON.stringify(name)}`, value.error); 2611 return value; 2612 } 2613 /** 2614 * Creates a new [[Result]] for %%items%% with each entry 2615 * also accessible by its corresponding name in %%keys%%. 2616 */ 2617 static fromItems(items, keys) { 2618 return new Result(_guard$4, items, keys); 2619 } 2620}; 2621/** 2622* Returns all errors found in a [[Result]]. 2623* 2624* Since certain errors encountered when creating a [[Result]] do 2625* not impact the ability to continue parsing data, they are 2626* deferred until they are actually accessed. Hence a faulty string 2627* in an Event that is never used does not impact the program flow. 2628* 2629* However, sometimes it may be useful to access, identify or 2630* validate correctness of a [[Result]]. 2631* 2632* @_docloc api/abi 2633*/ 2634function checkResultErrors(result) { 2635 const errors = []; 2636 const checkErrors = function(path, object) { 2637 if (!Array.isArray(object)) return; 2638 for (let key in object) { 2639 const childPath = path.slice(); 2640 childPath.push(key); 2641 try { 2642 checkErrors(childPath, object[key]); 2643 } catch (error) { 2644 errors.push({ 2645 path: childPath, 2646 error 2647 }); 2648 } 2649 } 2650 }; 2651 checkErrors([], result); 2652 return errors; 2653} 2654function getValue$1(value) { 2655 let bytes = toBeArray(value); 2656 assert(bytes.length <= 32, "value out-of-bounds", "BUFFER_OVERRUN", { 2657 buffer: bytes, 2658 length: 32, 2659 offset: bytes.length 2660 }); 2661 if (bytes.length !== 32) bytes = getBytesCopy(concat([Padding.slice(bytes.length % 32), bytes])); 2662 return bytes; 2663} 2664/** 2665* @_ignore 2666*/ 2667var Coder = class { 2668 name; 2669 type; 2670 localName; 2671 dynamic; 2672 constructor(name, type, localName, dynamic) { 2673 defineProperties(this, { 2674 name, 2675 type, 2676 localName, 2677 dynamic 2678 }, { 2679 name: "string", 2680 type: "string", 2681 localName: "string", 2682 dynamic: "boolean" 2683 }); 2684 } 2685 _throwError(message, value) { 2686 assertArgument(false, message, this.localName, value); 2687 } 2688}; 2689/** 2690* @_ignore 2691*/ 2692var Writer = class { 2693 #data; 2694 #dataLength; 2695 constructor() { 2696 this.#data = []; 2697 this.#dataLength = 0; 2698 } 2699 get data() { 2700 return concat(this.#data); 2701 } 2702 get length() { 2703 return this.#dataLength; 2704 } 2705 #writeData(data) { 2706 this.#data.push(data); 2707 this.#dataLength += data.length; 2708 return data.length; 2709 } 2710 appendWriter(writer) { 2711 return this.#writeData(getBytesCopy(writer.data)); 2712 } 2713 writeBytes(value) { 2714 let bytes = getBytesCopy(value); 2715 const paddingOffset = bytes.length % 32; 2716 if (paddingOffset) bytes = getBytesCopy(concat([bytes, Padding.slice(paddingOffset)])); 2717 return this.#writeData(bytes); 2718 } 2719 writeValue(value) { 2720 return this.#writeData(getValue$1(value)); 2721 } 2722 writeUpdatableValue() { 2723 const offset = this.#data.length; 2724 this.#data.push(Padding); 2725 this.#dataLength += 32; 2726 return (value) => { 2727 this.#data[offset] = getValue$1(value); 2728 }; 2729 } 2730}; 2731/** 2732* @_ignore 2733*/ 2734var Reader = class Reader { 2735 allowLoose; 2736 #data; 2737 #offset; 2738 #bytesRead; 2739 #parent; 2740 #maxInflation; 2741 constructor(data, allowLoose, maxInflation) { 2742 defineProperties(this, { allowLoose: !!allowLoose }); 2743 this.#data = getBytesCopy(data); 2744 this.#bytesRead = 0; 2745 this.#parent = null; 2746 this.#maxInflation = maxInflation != null ? maxInflation : 1024; 2747 this.#offset = 0; 2748 } 2749 get data() { 2750 return hexlify(this.#data); 2751 } 2752 get dataLength() { 2753 return this.#data.length; 2754 } 2755 get consumed() { 2756 return this.#offset; 2757 } 2758 get bytes() { 2759 return new Uint8Array(this.#data); 2760 } 2761 #incrementBytesRead(count) { 2762 if (this.#parent) return this.#parent.#incrementBytesRead(count); 2763 this.#bytesRead += count; 2764 assert(this.#maxInflation < 1 || this.#bytesRead <= this.#maxInflation * this.dataLength, `compressed ABI data exceeds inflation ratio of ${this.#maxInflation} ( see: https:/\/github.com/ethers-io/ethers.js/issues/4537 )`, "BUFFER_OVERRUN", { 2765 buffer: getBytesCopy(this.#data), 2766 offset: this.#offset, 2767 length: count, 2768 info: { 2769 bytesRead: this.#bytesRead, 2770 dataLength: this.dataLength 2771 } 2772 }); 2773 } 2774 #peekBytes(offset, length, loose) { 2775 let alignedLength = Math.ceil(length / 32) * 32; 2776 if (this.#offset + alignedLength > this.#data.length) { 2777 if (this.allowLoose && loose && this.#offset + length <= this.#data.length) alignedLength = length; 2778 else assert(false, "data out-of-bounds", "BUFFER_OVERRUN", { 2779 buffer: getBytesCopy(this.#data), 2780 length: this.#data.length, 2781 offset: this.#offset + alignedLength 2782 }); 2783 } 2784 return this.#data.slice(this.#offset, this.#offset + alignedLength); 2785 } 2786 subReader(offset) { 2787 const reader = new Reader(this.#data.slice(this.#offset + offset), this.allowLoose, this.#maxInflation); 2788 reader.#parent = this; 2789 return reader; 2790 } 2791 readBytes(length, loose) { 2792 let bytes = this.#peekBytes(0, length, !!loose); 2793 this.#incrementBytesRead(length); 2794 this.#offset += bytes.length; 2795 return bytes.slice(0, length); 2796 } 2797 readValue() { 2798 return toBigInt(this.readBytes(32)); 2799 } 2800 readIndex() { 2801 return toNumber(this.readBytes(32)); 2802 } 2803}; 2804//#endregion 2805//#region node_modules/@noble/hashes/esm/_assert.js 2806function number(n) { 2807 if (!Number.isSafeInteger(n) || n < 0) throw new Error(`Wrong positive integer: ${n}`); 2808} 2809function bytes(b, ...lengths) { 2810 if (!(b instanceof Uint8Array)) throw new Error("Expected Uint8Array"); 2811 if (lengths.length > 0 && !lengths.includes(b.length)) throw new Error(`Expected Uint8Array of length ${lengths}, not of length=${b.length}`); 2812} 2813function hash(hash) { 2814 if (typeof hash !== "function" || typeof hash.create !== "function") throw new Error("Hash should be wrapped by utils.wrapConstructor"); 2815 number(hash.outputLen); 2816 number(hash.blockLen); 2817} 2818function exists(instance, checkFinished = true) { 2819 if (instance.destroyed) throw new Error("Hash instance has been destroyed"); 2820 if (checkFinished && instance.finished) throw new Error("Hash#digest() has already been called"); 2821} 2822function output(out, instance) { 2823 bytes(out); 2824 const min = instance.outputLen; 2825 if (out.length < min) throw new Error(`digestInto() expects output buffer of length at least ${min}`); 2826} 2827//#endregion 2828//#region node_modules/@noble/hashes/esm/crypto.js 2829var crypto$1 = typeof globalThis === "object" && "crypto" in globalThis ? globalThis.crypto : void 0; 2830//#endregion
2831//#region node_modules/@noble/hashes/esm/utils.js 2832/*! noble-hashes - MIT License (c) 2022 Paul Miller (paulmillr.com) */ 2833var u8a$1 = (a) => a instanceof Uint8Array; 2834var u32 = (arr) => new Uint32Array(arr.buffer, arr.byteOffset, Math.floor(arr.byteLength / 4)); 2835var createView = (arr) => new DataView(arr.buffer, arr.byteOffset, arr.byteLength); 2836var rotr = (word, shift) => word << 32 - shift | word >>> shift; 2837if (!(new Uint8Array(new Uint32Array([287454020]).buffer)[0] === 68)) throw new Error("Non little-endian hardware is not supported"); 2838var nextTick = async () => {}; 2839async function asyncLoop(iters, tick, cb) { 2840 let ts = Date.now(); 2841 for (let i = 0; i < iters; i++) { 2842 cb(i); 2843 const diff = Date.now() - ts; 2844 if (diff >= 0 && diff < tick) continue; 2845 await /* @__PURE__ */ nextTick(); 2846 ts += diff; 2847 } 2848} 2849/** 2850* @example utf8ToBytes('abc') // new Uint8Array([97, 98, 99]) 2851*/ 2852function utf8ToBytes$1(str) { 2853 if (typeof str !== "string") throw new Error(`utf8ToBytes expected string, got ${typeof str}`); 2854 return new Uint8Array(new TextEncoder().encode(str)); 2855} 2856/** 2857* Normalizes (non-hex) string or Uint8Array to Uint8Array. 2858* Warning: when Uint8Array is passed, it would NOT get copied. 2859* Keep in mind for future mutable operations. 2860*/ 2861function toBytes(data) { 2862 if (typeof data === "string") data = utf8ToBytes$1(data); 2863 if (!u8a$1(data)) throw new Error(`expected Uint8Array, got ${typeof data}`); 2864 return data; 2865} 2866/** 2867* Copies several Uint8Arrays into one. 2868*/ 2869function concatBytes$1(...arrays) { 2870 const r = new Uint8Array(arrays.reduce((sum, a) => sum + a.length, 0)); 2871 let pad = 0; 2872 arrays.forEach((a) => { 2873 if (!u8a$1(a)) throw new Error("Uint8Array expected"); 2874 r.set(a, pad); 2875 pad += a.length; 2876 }); 2877 return r; 2878} 2879var Hash = class { 2880 clone() { 2881 return this._cloneInto(); 2882 } 2883}; 2884var toStr = {}.toString; 2885function checkOpts(defaults, opts) { 2886 if (opts !== void 0 && toStr.call(opts) !== "[object Object]") throw new Error("Options should be object or undefined"); 2887 return Object.assign(defaults, opts); 2888} 2889function wrapConstructor(hashCons) { 2890 const hashC = (msg) => hashCons().update(toBytes(msg)).digest(); 2891 const tmp = hashCons(); 2892 hashC.outputLen = tmp.outputLen; 2893 hashC.blockLen = tmp.blockLen; 2894 hashC.create = () => hashCons(); 2895 return hashC; 2896} 2897/** 2898* Secure PRNG. Uses `crypto.getRandomValues`, which defers to OS. 2899*/ 2900function randomBytes$2(bytesLength = 32) { 2901 if (crypto$1 && typeof crypto$1.getRandomValues === "function") return crypto$1.getRandomValues(new Uint8Array(bytesLength)); 2902 throw new Error("crypto.getRandomValues must be defined"); 2903} 2904//#endregion 2905//#region node_modules/@noble/hashes/esm/hmac.js 2906var HMAC = class extends Hash { 2907 constructor(hash$2, _key) { 2908 super(); 2909 this.finished = false; 2910 this.destroyed = false; 2911 hash(hash$2); 2912 const key = toBytes(_key); 2913 this.iHash = hash$2.create(); 2914 if (typeof this.iHash.update !== "function") throw new Error("Expected instance of class which extends utils.Hash"); 2915 this.blockLen = this.iHash.blockLen; 2916 this.outputLen = this.iHash.outputLen; 2917 const blockLen = this.blockLen; 2918 const pad = new Uint8Array(blockLen); 2919 pad.set(key.length > blockLen ? hash$2.create().update(key).digest() : key); 2920 for (let i = 0; i < pad.length; i++) pad[i] ^= 54; 2921 this.iHash.update(pad); 2922 this.oHash = hash$2.create(); 2923 for (let i = 0; i < pad.length; i++) pad[i] ^= 106; 2924 this.oHash.update(pad); 2925 pad.fill(0); 2926 } 2927 update(buf) { 2928 exists(this); 2929 this.iHash.update(buf); 2930 return this; 2931 } 2932 digestInto(out) { 2933 exists(this); 2934 bytes(out, this.outputLen); 2935 this.finished = true; 2936 this.iHash.digestInto(out); 2937 this.oHash.update(out); 2938 this.oHash.digestInto(out); 2939 this.destroy(); 2940 } 2941 digest() { 2942 const out = new Uint8Array(this.oHash.outputLen); 2943 this.digestInto(out); 2944 return out; 2945 } 2946 _cloneInto(to) { 2947 to || (to = Object.create(Object.getPrototypeOf(this), {})); 2948 const { oHash, iHash, finished, destroyed, blockLen, outputLen } = this; 2949 to = to; 2950 to.finished = finished; 2951 to.destroyed = destroyed; 2952 to.blockLen = blockLen; 2953 to.outputLen = outputLen; 2954 to.oHash = oHash._cloneInto(to.oHash);
vendor: 6,356 bytes, lines 2955-3210
2955 to.iHash = iHash._cloneInto(to.iHash); 2956 return to; 2957 } 2958 destroy() { 2959 this.destroyed = true; 2960 this.oHash.destroy(); 2961 this.iHash.destroy(); 2962 } 2963}; 2964/** 2965* HMAC: RFC2104 message authentication code. 2966* @param hash - function that would be used e.g. sha256 2967* @param key - message key 2968* @param message - message data 2969*/ 2970var hmac = (hash, key, message) => new HMAC(hash, key).update(message).digest(); 2971hmac.create = (hash, key) => new HMAC(hash, key); 2972//#endregion 2973//#region node_modules/@noble/hashes/esm/pbkdf2.js 2974function pbkdf2Init(hash$1, _password, _salt, _opts) { 2975 hash(hash$1); 2976 const { c, dkLen, asyncTick } = checkOpts({ 2977 dkLen: 32, 2978 asyncTick: 10 2979 }, _opts); 2980 number(c); 2981 number(dkLen); 2982 number(asyncTick); 2983 if (c < 1) throw new Error("PBKDF2: iterations (c) should be >= 1"); 2984 const password = toBytes(_password); 2985 const salt = toBytes(_salt); 2986 const DK = new Uint8Array(dkLen); 2987 const PRF = hmac.create(hash$1, password); 2988 return { 2989 c, 2990 dkLen, 2991 asyncTick, 2992 DK, 2993 PRF, 2994 PRFSalt: PRF._cloneInto().update(salt) 2995 }; 2996} 2997function pbkdf2Output(PRF, PRFSalt, DK, prfW, u) { 2998 PRF.destroy(); 2999 PRFSalt.destroy(); 3000 if (prfW) prfW.destroy(); 3001 u.fill(0); 3002 return DK; 3003} 3004/** 3005* PBKDF2-HMAC: RFC 2898 key derivation function 3006* @param hash - hash function that would be used e.g. sha256 3007* @param password - password from which a derived key is generated 3008* @param salt - cryptographic salt 3009* @param opts - {c, dkLen} where c is work factor and dkLen is output message size 3010*/ 3011function pbkdf2$1(hash, password, salt, opts) { 3012 const { c, dkLen, DK, PRF, PRFSalt } = pbkdf2Init(hash, password, salt, opts); 3013 let prfW; 3014 const arr = /* @__PURE__ */ new Uint8Array(4); 3015 const view = createView(arr); 3016 const u = new Uint8Array(PRF.outputLen); 3017 for (let ti = 1, pos = 0; pos < dkLen; ti++, pos += PRF.outputLen) { 3018 const Ti = DK.subarray(pos, pos + PRF.outputLen); 3019 view.setInt32(0, ti, false); 3020 (prfW = PRFSalt._cloneInto(prfW)).update(arr).digestInto(u); 3021 Ti.set(u.subarray(0, Ti.length)); 3022 for (let ui = 1; ui < c; ui++) { 3023 PRF._cloneInto(prfW).update(u).digestInto(u); 3024 for (let i = 0; i < Ti.length; i++) Ti[i] ^= u[i]; 3025 } 3026 } 3027 return pbkdf2Output(PRF, PRFSalt, DK, prfW, u); 3028} 3029//#endregion 3030//#region node_modules/@noble/hashes/esm/_sha2.js 3031function setBigUint64(view, byteOffset, value, isLE) { 3032 if (typeof view.setBigUint64 === "function") return view.setBigUint64(byteOffset, value, isLE); 3033 const _32n = BigInt(32); 3034 const _u32_max = BigInt(4294967295); 3035 const wh = Number(value >> _32n & _u32_max); 3036 const wl = Number(value & _u32_max); 3037 const h = isLE ? 4 : 0; 3038 const l = isLE ? 0 : 4; 3039 view.setUint32(byteOffset + h, wh, isLE); 3040 view.setUint32(byteOffset + l, wl, isLE); 3041} 3042var SHA2 = class extends Hash { 3043 constructor(blockLen, outputLen, padOffset, isLE) { 3044 super(); 3045 this.blockLen = blockLen; 3046 this.outputLen = outputLen; 3047 this.padOffset = padOffset; 3048 this.isLE = isLE; 3049 this.finished = false; 3050 this.length = 0; 3051 this.pos = 0; 3052 this.destroyed = false; 3053 this.buffer = new Uint8Array(blockLen); 3054 this.view = createView(this.buffer); 3055 } 3056 update(data) { 3057 exists(this); 3058 const { view, buffer, blockLen } = this; 3059 data = toBytes(data); 3060 const len = data.length; 3061 for (let pos = 0; pos < len;) { 3062 const take = Math.min(blockLen - this.pos, len - pos); 3063 if (take === blockLen) { 3064 const dataView = createView(data); 3065 for (; blockLen <= len - pos; pos += blockLen) this.process(dataView, pos); 3066 continue; 3067 } 3068 buffer.set(data.subarray(pos, pos + take), this.pos); 3069 this.pos += take; 3070 pos += take; 3071 if (this.pos === blockLen) { 3072 this.process(view, 0); 3073 this.pos = 0; 3074 } 3075 } 3076 this.length += data.length; 3077 this.roundClean(); 3078 return this; 3079 } 3080 digestInto(out) { 3081 exists(this); 3082 output(out, this); 3083 this.finished = true; 3084 const { buffer, view, blockLen, isLE } = this; 3085 let { pos } = this; 3086 buffer[pos++] = 128; 3087 this.buffer.subarray(pos).fill(0); 3088 if (this.padOffset > blockLen - pos) { 3089 this.process(view, 0); 3090 pos = 0; 3091 } 3092 for (let i = pos; i < blockLen; i++) buffer[i] = 0; 3093 setBigUint64(view, blockLen - 8, BigInt(this.length * 8), isLE); 3094 this.process(view, 0); 3095 const oview = createView(out); 3096 const len = this.outputLen; 3097 if (len % 4) throw new Error("_sha2: outputLen should be aligned to 32bit"); 3098 const outLen = len / 4; 3099 const state = this.get(); 3100 if (outLen > state.length) throw new Error("_sha2: outputLen bigger than state"); 3101 for (let i = 0; i < outLen; i++) oview.setUint32(4 * i, state[i], isLE); 3102 } 3103 digest() { 3104 const { buffer, outputLen } = this; 3105 this.digestInto(buffer); 3106 const res = buffer.slice(0, outputLen); 3107 this.destroy(); 3108 return res; 3109 } 3110 _cloneInto(to) { 3111 to || (to = new this.constructor()); 3112 to.set(...this.get()); 3113 const { blockLen, buffer, length, finished, destroyed, pos } = this; 3114 to.length = length; 3115 to.pos = pos; 3116 to.finished = finished; 3117 to.destroyed = destroyed; 3118 if (length % blockLen) to.buffer.set(buffer); 3119 return to; 3120 } 3121}; 3122//#endregion 3123//#region node_modules/@noble/hashes/esm/sha256.js 3124var Chi = (a, b, c) => a & b ^ ~a & c; 3125var Maj = (a, b, c) => a & b ^ a & c ^ b & c; 3126var SHA256_K = /* @__PURE__ */ new Uint32Array([ 3127 1116352408, 3128 1899447441, 3129 3049323471, 3130 3921009573, 3131 961987163, 3132 1508970993, 3133 2453635748, 3134 2870763221, 3135 3624381080, 3136 310598401, 3137 607225278, 3138 1426881987, 3139 1925078388, 3140 2162078206, 3141 2614888103, 3142 3248222580, 3143 3835390401, 3144 4022224774, 3145 264347078, 3146 604807628, 3147 770255983, 3148 1249150122, 3149 1555081692, 3150 1996064986, 3151 2554220882, 3152 2821834349, 3153 2952996808, 3154 3210313671, 3155 3336571891, 3156 3584528711, 3157 113926993, 3158 338241895, 3159 666307205, 3160 773529912, 3161 1294757372, 3162 1396182291, 3163 1695183700, 3164 1986661051, 3165 2177026350, 3166 2456956037, 3167 2730485921, 3168 2820302411, 3169 3259730800, 3170 3345764771, 3171 3516065817, 3172 3600352804, 3173 4094571909, 3174 275423344, 3175 430227734, 3176 506948616, 3177 659060556, 3178 883997877, 3179 958139571, 3180 1322822218, 3181 1537002063, 3182 1747873779, 3183 1955562222, 3184 2024104815, 3185 2227730452, 3186 2361852424, 3187 2428436474, 3188 2756734187, 3189 3204031479, 3190 3329325298 3191]); 3192var IV = /* @__PURE__ */ new Uint32Array([ 3193 1779033703, 3194 3144134277, 3195 1013904242, 3196 2773480762, 3197 1359893119, 3198 2600822924, 3199 528734635, 3200 1541459225 3201]); 3202var SHA256_W = /* @__PURE__ */ new Uint32Array(64); 3203var SHA256 = class extends SHA2 { 3204 constructor() { 3205 super(64, 32, 8, false); 3206 this.A = IV[0] | 0; 3207 this.B = IV[1] | 0; 3208 this.C = IV[2] | 0; 3209 this.D = IV[3] | 0; 3210 this.E = IV[4] | 0;
3211 this.F = IV[5] | 0; 3212 this.G = IV[6] | 0; 3213 this.H = IV[7] | 0; 3214 } 3215 get() { 3216 const { A, B, C, D, E, F, G, H } = this; 3217 return [ 3218 A, 3219 B, 3220 C, 3221 D, 3222 E, 3223 F, 3224 G, 3225 H 3226 ]; 3227 } 3228 set(A, B, C, D, E, F, G, H) { 3229 this.A = A | 0; 3230 this.B = B | 0; 3231 this.C = C | 0; 3232 this.D = D | 0; 3233 this.E = E | 0; 3234 this.F = F | 0; 3235 this.G = G | 0; 3236 this.H = H | 0; 3237 } 3238 process(view, offset) { 3239 for (let i = 0; i < 16; i++, offset += 4) SHA256_W[i] = view.getUint32(offset, false); 3240 for (let i = 16; i < 64; i++) { 3241 const W15 = SHA256_W[i - 15]; 3242 const W2 = SHA256_W[i - 2]; 3243 const s0 = rotr(W15, 7) ^ rotr(W15, 18) ^ W15 >>> 3; 3244 const s1 = rotr(W2, 17) ^ rotr(W2, 19) ^ W2 >>> 10; 3245 SHA256_W[i] = s1 + SHA256_W[i - 7] + s0 + SHA256_W[i - 16] | 0; 3246 } 3247 let { A, B, C, D, E, F, G, H } = this; 3248 for (let i = 0; i < 64; i++) { 3249 const sigma1 = rotr(E, 6) ^ rotr(E, 11) ^ rotr(E, 25); 3250 const T1 = H + sigma1 + Chi(E, F, G) + SHA256_K[i] + SHA256_W[i] | 0; 3251 const T2 = (rotr(A, 2) ^ rotr(A, 13) ^ rotr(A, 22)) + Maj(A, B, C) | 0; 3252 H = G; 3253 G = F; 3254 F = E; 3255 E = D + T1 | 0; 3256 D = C; 3257 C = B; 3258 B = A; 3259 A = T1 + T2 | 0; 3260 } 3261 A = A + this.A | 0; 3262 B = B + this.B | 0; 3263 C = C + this.C | 0; 3264 D = D + this.D | 0; 3265 E = E + this.E | 0; 3266 F = F + this.F | 0; 3267 G = G + this.G | 0; 3268 H = H + this.H | 0; 3269 this.set(A, B, C, D, E, F, G, H); 3270 } 3271 roundClean() { 3272 SHA256_W.fill(0); 3273 } 3274 destroy() { 3275 this.set(0, 0, 0, 0, 0, 0, 0, 0); 3276 this.buffer.fill(0); 3277 } 3278}; 3279/** 3280* SHA2-256 hash function 3281* @param message - data that would be hashed 3282*/ 3283var sha256$1 = /* @__PURE__ */ wrapConstructor(() => new SHA256()); 3284//#endregion 3285//#region node_modules/@noble/hashes/esm/_u64.js 3286var U32_MASK64 = /* @__PURE__ */ BigInt(2 ** 32 - 1); 3287var _32n = /* @__PURE__ */ BigInt(32); 3288function fromBig(n, le = false) { 3289 if (le) return { 3290 h: Number(n & U32_MASK64), 3291 l: Number(n >> _32n & U32_MASK64) 3292 }; 3293 return { 3294 h: Number(n >> _32n & U32_MASK64) | 0, 3295 l: Number(n & U32_MASK64) | 0 3296 }; 3297} 3298function split$1(lst, le = false) { 3299 let Ah = new Uint32Array(lst.length); 3300 let Al = new Uint32Array(lst.length); 3301 for (let i = 0; i < lst.length; i++) { 3302 const { h, l } = fromBig(lst[i], le); 3303 [Ah[i], Al[i]] = [h, l]; 3304 } 3305 return [Ah, Al]; 3306} 3307var toBig = (h, l) => BigInt(h >>> 0) << _32n | BigInt(l >>> 0); 3308var shrSH = (h, _l, s) => h >>> s; 3309var shrSL = (h, l, s) => h << 32 - s | l >>> s; 3310var rotrSH = (h, l, s) => h >>> s | l << 32 - s; 3311var rotrSL = (h, l, s) => h << 32 - s | l >>> s; 3312var rotrBH = (h, l, s) => h << 64 - s | l >>> s - 32; 3313var rotrBL = (h, l, s) => h >>> s - 32 | l << 64 - s; 3314var rotr32H = (_h, l) => l; 3315var rotr32L = (h, _l) => h; 3316var rotlSH = (h, l, s) => h << s | l >>> 32 - s; 3317var rotlSL = (h, l, s) => l << s | h >>> 32 - s; 3318var rotlBH = (h, l, s) => l << s - 32 | h >>> 64 - s; 3319var rotlBL = (h, l, s) => h << s - 32 | l >>> 64 - s; 3320function add(Ah, Al, Bh, Bl) { 3321 const l = (Al >>> 0) + (Bl >>> 0); 3322 return { 3323 h: Ah + Bh + (l / 2 ** 32 | 0) | 0, 3324 l: l | 0 3325 }; 3326} 3327var add3L = (Al, Bl, Cl) => (Al >>> 0) + (Bl >>> 0) + (Cl >>> 0); 3328var add3H = (low, Ah, Bh, Ch) => Ah + Bh + Ch + (low / 2 ** 32 | 0) | 0; 3329var add4L = (Al, Bl, Cl, Dl) => (Al >>> 0) + (Bl >>> 0) + (Cl >>> 0) + (Dl >>> 0); 3330var add4H = (low, Ah, Bh, Ch, Dh) => Ah + Bh + Ch + Dh + (low / 2 ** 32 | 0) | 0; 3331var add5L = (Al, Bl, Cl, Dl, El) => (Al >>> 0) + (Bl >>> 0) + (Cl >>> 0) + (Dl >>> 0) + (El >>> 0); 3332var add5H = (low, Ah, Bh, Ch, Dh, Eh) => Ah + Bh + Ch + Dh + Eh + (low / 2 ** 32 | 0) | 0; 3333var u64 = { 3334 fromBig, 3335 split: split$1, 3336 toBig, 3337 shrSH, 3338 shrSL, 3339 rotrSH, 3340 rotrSL, 3341 rotrBH, 3342 rotrBL, 3343 rotr32H, 3344 rotr32L, 3345 rotlSH, 3346 rotlSL, 3347 rotlBH, 3348 rotlBL, 3349 add, 3350 add3L, 3351 add3H, 3352 add4L, 3353 add4H, 3354 add5H, 3355 add5L 3356}; 3357//#endregion 3358//#region node_modules/@noble/hashes/esm/sha512.js 3359var [SHA512_Kh, SHA512_Kl] = /* @__PURE__ */ (() => u64.split([ 3360 "0x428a2f98d728ae22", 3361 "0x7137449123ef65cd", 3362 "0xb5c0fbcfec4d3b2f", 3363 "0xe9b5dba58189dbbc", 3364 "0x3956c25bf348b538", 3365 "0x59f111f1b605d019", 3366 "0x923f82a4af194f9b", 3367 "0xab1c5ed5da6d8118", 3368 "0xd807aa98a3030242", 3369 "0x12835b0145706fbe", 3370 "0x243185be4ee4b28c", 3371 "0x550c7dc3d5ffb4e2",
3372 "0x72be5d74f27b896f", 3373 "0x80deb1fe3b1696b1", 3374 "0x9bdc06a725c71235", 3375 "0xc19bf174cf692694", 3376 "0xe49b69c19ef14ad2", 3377 "0xefbe4786384f25e3", 3378 "0x0fc19dc68b8cd5b5", 3379 "0x240ca1cc77ac9c65", 3380 "0x2de92c6f592b0275", 3381 "0x4a7484aa6ea6e483", 3382 "0x5cb0a9dcbd41fbd4", 3383 "0x76f988da831153b5", 3384 "0x983e5152ee66dfab", 3385 "0xa831c66d2db43210", 3386 "0xb00327c898fb213f", 3387 "0xbf597fc7beef0ee4", 3388 "0xc6e00bf33da88fc2", 3389 "0xd5a79147930aa725", 3390 "0x06ca6351e003826f", 3391 "0x142929670a0e6e70", 3392 "0x27b70a8546d22ffc", 3393 "0x2e1b21385c26c926", 3394 "0x4d2c6dfc5ac42aed", 3395 "0x53380d139d95b3df", 3396 "0x650a73548baf63de", 3397 "0x766a0abb3c77b2a8", 3398 "0x81c2c92e47edaee6", 3399 "0x92722c851482353b", 3400 "0xa2bfe8a14cf10364", 3401 "0xa81a664bbc423001", 3402 "0xc24b8b70d0f89791", 3403 "0xc76c51a30654be30", 3404 "0xd192e819d6ef5218", 3405 "0xd69906245565a910", 3406 "0xf40e35855771202a", 3407 "0x106aa07032bbd1b8", 3408 "0x19a4c116b8d2d0c8", 3409 "0x1e376c085141ab53", 3410 "0x2748774cdf8eeb99", 3411 "0x34b0bcb5e19b48a8", 3412 "0x391c0cb3c5c95a63", 3413 "0x4ed8aa4ae3418acb", 3414 "0x5b9cca4f7763e373", 3415 "0x682e6ff3d6b2b8a3", 3416 "0x748f82ee5defb2fc", 3417 "0x78a5636f43172f60", 3418 "0x84c87814a1f0ab72", 3419 "0x8cc702081a6439ec", 3420 "0x90befffa23631e28", 3421 "0xa4506cebde82bde9", 3422 "0xbef9a3f7b2c67915", 3423 "0xc67178f2e372532b", 3424 "0xca273eceea26619c", 3425 "0xd186b8c721c0c207", 3426 "0xeada7dd6cde0eb1e", 3427 "0xf57d4f7fee6ed178", 3428 "0x06f067aa72176fba", 3429 "0x0a637dc5a2c898a6", 3430 "0x113f9804bef90dae", 3431 "0x1b710b35131c471b", 3432 "0x28db77f523047d84", 3433 "0x32caab7b40c72493", 3434 "0x3c9ebe0a15c9bebc", 3435 "0x431d67c49c100d4c", 3436 "0x4cc5d4becb3e42b6", 3437 "0x597f299cfc657e2a", 3438 "0x5fcb6fab3ad6faec", 3439 "0x6c44198c4a475817" 3440].map((n) => BigInt(n))))(); 3441var SHA512_W_H = /* @__PURE__ */ new Uint32Array(80); 3442var SHA512_W_L = /* @__PURE__ */ new Uint32Array(80); 3443var SHA512 = class extends SHA2 { 3444 constructor() { 3445 super(128, 64, 16, false); 3446 this.Ah = 1779033703; 3447 this.Al = -205731576; 3448 this.Bh = -1150833019; 3449 this.Bl = -2067093701; 3450 this.Ch = 1013904242; 3451 this.Cl = -23791573; 3452 this.Dh = -1521486534; 3453 this.Dl = 1595750129; 3454 this.Eh = 1359893119;
3455 this.El = -1377402159; 3456 this.Fh = -1694144372; 3457 this.Fl = 725511199; 3458 this.Gh = 528734635; 3459 this.Gl = -79577749; 3460 this.Hh = 1541459225; 3461 this.Hl = 327033209; 3462 } 3463 get() { 3464 const { Ah, Al, Bh, Bl, Ch, Cl, Dh, Dl, Eh, El, Fh, Fl, Gh, Gl, Hh, Hl } = this; 3465 return [ 3466 Ah, 3467 Al, 3468 Bh, 3469 Bl, 3470 Ch, 3471 Cl, 3472 Dh, 3473 Dl, 3474 Eh, 3475 El, 3476 Fh, 3477 Fl, 3478 Gh, 3479 Gl, 3480 Hh, 3481 Hl 3482 ]; 3483 } 3484 set(Ah, Al, Bh, Bl, Ch, Cl, Dh, Dl, Eh, El, Fh, Fl, Gh, Gl, Hh, Hl) { 3485 this.Ah = Ah | 0; 3486 this.Al = Al | 0; 3487 this.Bh = Bh | 0; 3488 this.Bl = Bl | 0; 3489 this.Ch = Ch | 0; 3490 this.Cl = Cl | 0; 3491 this.Dh = Dh | 0; 3492 this.Dl = Dl | 0; 3493 this.Eh = Eh | 0; 3494 this.El = El | 0; 3495 this.Fh = Fh | 0; 3496 this.Fl = Fl | 0; 3497 this.Gh = Gh | 0; 3498 this.Gl = Gl | 0; 3499 this.Hh = Hh | 0; 3500 this.Hl = Hl | 0; 3501 } 3502 process(view, offset) { 3503 for (let i = 0; i < 16; i++, offset += 4) { 3504 SHA512_W_H[i] = view.getUint32(offset); 3505 SHA512_W_L[i] = view.getUint32(offset += 4); 3506 } 3507 for (let i = 16; i < 80; i++) { 3508 const W15h = SHA512_W_H[i - 15] | 0; 3509 const W15l = SHA512_W_L[i - 15] | 0; 3510 const s0h = u64.rotrSH(W15h, W15l, 1) ^ u64.rotrSH(W15h, W15l, 8) ^ u64.shrSH(W15h, W15l, 7); 3511 const s0l = u64.rotrSL(W15h, W15l, 1) ^ u64.rotrSL(W15h, W15l, 8) ^ u64.shrSL(W15h, W15l, 7); 3512 const W2h = SHA512_W_H[i - 2] | 0; 3513 const W2l = SHA512_W_L[i - 2] | 0; 3514 const s1h = u64.rotrSH(W2h, W2l, 19) ^ u64.rotrBH(W2h, W2l, 61) ^ u64.shrSH(W2h, W2l, 6); 3515 const s1l = u64.rotrSL(W2h, W2l, 19) ^ u64.rotrBL(W2h, W2l, 61) ^ u64.shrSL(W2h, W2l, 6); 3516 const SUMl = u64.add4L(s0l, s1l, SHA512_W_L[i - 7], SHA512_W_L[i - 16]); 3517 const SUMh = u64.add4H(SUMl, s0h, s1h, SHA512_W_H[i - 7], SHA512_W_H[i - 16]); 3518 SHA512_W_H[i] = SUMh | 0; 3519 SHA512_W_L[i] = SUMl | 0; 3520 } 3521 let { Ah, Al, Bh, Bl, Ch, Cl, Dh, Dl, Eh, El, Fh, Fl, Gh, Gl, Hh, Hl } = this; 3522 for (let i = 0; i < 80; i++) { 3523 const sigma1h = u64.rotrSH(Eh, El, 14) ^ u64.rotrSH(Eh, El, 18) ^ u64.rotrBH(Eh, El, 41); 3524 const sigma1l = u64.rotrSL(Eh, El, 14) ^ u64.rotrSL(Eh, El, 18) ^ u64.rotrBL(Eh, El, 41); 3525 const CHIh = Eh & Fh ^ ~Eh & Gh; 3526 const CHIl = El & Fl ^ ~El & Gl; 3527 const T1ll = u64.add5L(Hl, sigma1l, CHIl, SHA512_Kl[i], SHA512_W_L[i]); 3528 const T1h = u64.add5H(T1ll, Hh, sigma1h, CHIh, SHA512_Kh[i], SHA512_W_H[i]); 3529 const T1l = T1ll | 0; 3530 const sigma0h = u64.rotrSH(Ah, Al, 28) ^ u64.rotrBH(Ah, Al, 34) ^ u64.rotrBH(Ah, Al, 39); 3531 const sigma0l = u64.rotrSL(Ah, Al, 28) ^ u64.rotrBL(Ah, Al, 34) ^ u64.rotrBL(Ah, Al, 39); 3532 const MAJh = Ah & Bh ^ Ah & Ch ^ Bh & Ch; 3533 const MAJl = Al & Bl ^ Al & Cl ^ Bl & Cl; 3534 Hh = Gh | 0; 3535 Hl = Gl | 0; 3536 Gh = Fh | 0; 3537 Gl = Fl | 0; 3538 Fh = Eh | 0; 3539 Fl = El | 0; 3540 ({h: Eh, l: El} = u64.add(Dh | 0, Dl | 0, T1h | 0, T1l | 0)); 3541 Dh = Ch | 0; 3542 Dl = Cl | 0; 3543 Ch = Bh | 0; 3544 Cl = Bl | 0; 3545 Bh = Ah | 0; 3546 Bl = Al | 0; 3547 const All = u64.add3L(T1l, sigma0l, MAJl); 3548 Ah = u64.add3H(All, T1h, sigma0h, MAJh); 3549 Al = All | 0; 3550 } 3551 ({h: Ah, l: Al} = u64.add(this.Ah | 0, this.Al | 0, Ah | 0, Al | 0)); 3552 ({h: Bh, l: Bl} = u64.add(this.Bh | 0, this.Bl | 0, Bh | 0, Bl | 0)); 3553 ({h: Ch, l: Cl} = u64.add(this.Ch | 0, this.Cl | 0, Ch | 0, Cl | 0)); 3554 ({h: Dh, l: Dl} = u64.add(this.Dh | 0, this.Dl | 0, Dh | 0, Dl | 0)); 3555 ({h: Eh, l: El} = u64.add(this.Eh | 0, this.El | 0, Eh | 0, El | 0)); 3556 ({h: Fh, l: Fl} = u64.add(this.Fh | 0, this.Fl | 0, Fh | 0, Fl | 0)); 3557 ({h: Gh, l: Gl} = u64.add(this.Gh | 0, this.Gl | 0, Gh | 0, Gl | 0)); 3558 ({h: Hh, l: Hl} = u64.add(this.Hh | 0, this.Hl | 0, Hh | 0, Hl | 0)); 3559 this.set(Ah, Al, Bh, Bl, Ch, Cl, Dh, Dl, Eh, El, Fh, Fl, Gh, Gl, Hh, Hl); 3560 } 3561 roundClean() { 3562 SHA512_W_H.fill(0); 3563 SHA512_W_L.fill(0); 3564 } 3565 destroy() { 3566 this.buffer.fill(0); 3567 this.set(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0); 3568 } 3569}; 3570var sha512$1 = /* @__PURE__ */ wrapConstructor(() => new SHA512()); 3571//#endregion 3572//#region node_modules/ethers/lib.esm/crypto/crypto-browser.js 3573function getGlobal$1() { 3574 if (typeof self !== "undefined") return self; 3575 if (typeof window !== "undefined") return window; 3576 if (typeof global !== "undefined") return global; 3577 throw new Error("unable to locate global object"); 3578} 3579var anyGlobal = getGlobal$1(); 3580var crypto = anyGlobal.crypto || anyGlobal.msCrypto; 3581function createHash(algo) { 3582 switch (algo) { 3583 case "sha256": return sha256$1.create(); 3584 case "sha512": return sha512$1.create(); 3585 } 3586 assertArgument(false, "invalid hashing algorithm name", "algorithm", algo); 3587} 3588function createHmac(_algo, key) { 3589 const algo = { 3590 sha256: sha256$1, 3591 sha512: sha512$1 3592 }[_algo]; 3593 assertArgument(algo != null, "invalid hmac algorithm", "algorithm", _algo); 3594 return hmac.create(algo, key); 3595} 3596function pbkdf2Sync(password, salt, iterations, keylen, _algo) { 3597 const algo = { 3598 sha256: sha256$1, 3599 sha512: sha512$1 3600 }[_algo]; 3601 assertArgument(algo != null, "invalid pbkdf2 algorithm", "algorithm", _algo);
vendor: 6,084 bytes, lines 3602-3806
3602 return pbkdf2$1(algo, password, salt, { 3603 c: iterations, 3604 dkLen: keylen 3605 }); 3606} 3607function randomBytes$1(length) { 3608 assert(crypto != null, "platform does not support secure random numbers", "UNSUPPORTED_OPERATION", { operation: "randomBytes" }); 3609 assertArgument(Number.isInteger(length) && length > 0 && length <= 1024, "invalid length", "length", length); 3610 const result = new Uint8Array(length); 3611 crypto.getRandomValues(result); 3612 return result; 3613} 3614//#endregion 3615//#region node_modules/ethers/lib.esm/crypto/hmac.js 3616/** 3617* An **HMAC** enables verification that a given key was used 3618* to authenticate a payload. 3619* 3620* See: [[link-wiki-hmac]] 3621* 3622* @_subsection: api/crypto:HMAC [about-hmac] 3623*/ 3624var locked$4 = false; 3625var _computeHmac = function(algorithm, key, data) { 3626 return createHmac(algorithm, key).update(data).digest(); 3627}; 3628var __computeHmac = _computeHmac; 3629/** 3630* Return the HMAC for %%data%% using the %%key%% key with the underlying 3631* %%algo%% used for compression. 3632* 3633* @example: 3634* key = id("some-secret") 3635* 3636* // Compute the HMAC 3637* computeHmac("sha256", key, "0x1337") 3638* //_result: 3639* 3640* // To compute the HMAC of UTF-8 data, the data must be 3641* // converted to UTF-8 bytes 3642* computeHmac("sha256", key, toUtf8Bytes("Hello World")) 3643* //_result: 3644* 3645*/ 3646function computeHmac(algorithm, _key, _data) { 3647 const key = getBytes(_key, "key"); 3648 const data = getBytes(_data, "data"); 3649 return hexlify(__computeHmac(algorithm, key, data)); 3650} 3651computeHmac._ = _computeHmac; 3652computeHmac.lock = function() { 3653 locked$4 = true; 3654}; 3655computeHmac.register = function(func) { 3656 if (locked$4) throw new Error("computeHmac is locked"); 3657 __computeHmac = func; 3658}; 3659Object.freeze(computeHmac); 3660//#endregion 3661//#region node_modules/@noble/hashes/esm/sha3.js 3662var [SHA3_PI, SHA3_ROTL, _SHA3_IOTA] = [ 3663 [], 3664 [], 3665 [] 3666]; 3667var _0n$4 = /* @__PURE__ */ BigInt(0); 3668var _1n$5 = /* @__PURE__ */ BigInt(1); 3669var _2n$3 = /* @__PURE__ */ BigInt(2); 3670var _7n = /* @__PURE__ */ BigInt(7); 3671var _256n = /* @__PURE__ */ BigInt(256); 3672var _0x71n = /* @__PURE__ */ BigInt(113); 3673for (let round = 0, R = _1n$5, x = 1, y = 0; round < 24; round++) { 3674 [x, y] = [y, (2 * x + 3 * y) % 5]; 3675 SHA3_PI.push(2 * (5 * y + x)); 3676 SHA3_ROTL.push((round + 1) * (round + 2) / 2 % 64); 3677 let t = _0n$4; 3678 for (let j = 0; j < 7; j++) { 3679 R = (R << _1n$5 ^ (R >> _7n) * _0x71n) % _256n; 3680 if (R & _2n$3) t ^= _1n$5 << (_1n$5 << /* @__PURE__ */ BigInt(j)) - _1n$5; 3681 } 3682 _SHA3_IOTA.push(t); 3683} 3684var [SHA3_IOTA_H, SHA3_IOTA_L] = /* @__PURE__ */ split$1(_SHA3_IOTA, true); 3685var rotlH = (h, l, s) => s > 32 ? rotlBH(h, l, s) : rotlSH(h, l, s); 3686var rotlL = (h, l, s) => s > 32 ? rotlBL(h, l, s) : rotlSL(h, l, s); 3687function keccakP(s, rounds = 24) { 3688 const B = /* @__PURE__ */ new Uint32Array(10); 3689 for (let round = 24 - rounds; round < 24; round++) { 3690 for (let x = 0; x < 10; x++) B[x] = s[x] ^ s[x + 10] ^ s[x + 20] ^ s[x + 30] ^ s[x + 40]; 3691 for (let x = 0; x < 10; x += 2) { 3692 const idx1 = (x + 8) % 10; 3693 const idx0 = (x + 2) % 10; 3694 const B0 = B[idx0]; 3695 const B1 = B[idx0 + 1]; 3696 const Th = rotlH(B0, B1, 1) ^ B[idx1]; 3697 const Tl = rotlL(B0, B1, 1) ^ B[idx1 + 1]; 3698 for (let y = 0; y < 50; y += 10) { 3699 s[x + y] ^= Th; 3700 s[x + y + 1] ^= Tl; 3701 } 3702 } 3703 let curH = s[2]; 3704 let curL = s[3]; 3705 for (let t = 0; t < 24; t++) { 3706 const shift = SHA3_ROTL[t]; 3707 const Th = rotlH(curH, curL, shift); 3708 const Tl = rotlL(curH, curL, shift); 3709 const PI = SHA3_PI[t]; 3710 curH = s[PI]; 3711 curL = s[PI + 1]; 3712 s[PI] = Th; 3713 s[PI + 1] = Tl; 3714 } 3715 for (let y = 0; y < 50; y += 10) { 3716 for (let x = 0; x < 10; x++) B[x] = s[y + x]; 3717 for (let x = 0; x < 10; x++) s[y + x] ^= ~B[(x + 2) % 10] & B[(x + 4) % 10]; 3718 } 3719 s[0] ^= SHA3_IOTA_H[round]; 3720 s[1] ^= SHA3_IOTA_L[round]; 3721 } 3722 B.fill(0); 3723} 3724var Keccak = class Keccak extends Hash { 3725 constructor(blockLen, suffix, outputLen, enableXOF = false, rounds = 24) { 3726 super(); 3727 this.blockLen = blockLen; 3728 this.suffix = suffix; 3729 this.outputLen = outputLen; 3730 this.enableXOF = enableXOF; 3731 this.rounds = rounds; 3732 this.pos = 0; 3733 this.posOut = 0; 3734 this.finished = false; 3735 this.destroyed = false; 3736 number(outputLen); 3737 if (0 >= this.blockLen || this.blockLen >= 200) throw new Error("Sha3 supports only keccak-f1600 function"); 3738 this.state = /* @__PURE__ */ new Uint8Array(200); 3739 this.state32 = u32(this.state); 3740 } 3741 keccak() { 3742 keccakP(this.state32, this.rounds); 3743 this.posOut = 0; 3744 this.pos = 0; 3745 } 3746 update(data) { 3747 exists(this); 3748 const { blockLen, state } = this; 3749 data = toBytes(data); 3750 const len = data.length; 3751 for (let pos = 0; pos < len;) { 3752 const take = Math.min(blockLen - this.pos, len - pos); 3753 for (let i = 0; i < take; i++) state[this.pos++] ^= data[pos++]; 3754 if (this.pos === blockLen) this.keccak(); 3755 } 3756 return this; 3757 } 3758 finish() { 3759 if (this.finished) return; 3760 this.finished = true; 3761 const { state, suffix, pos, blockLen } = this; 3762 state[pos] ^= suffix; 3763 if ((suffix & 128) !== 0 && pos === blockLen - 1) this.keccak(); 3764 state[blockLen - 1] ^= 128; 3765 this.keccak(); 3766 } 3767 writeInto(out) { 3768 exists(this, false); 3769 bytes(out); 3770 this.finish(); 3771 const bufferOut = this.state; 3772 const { blockLen } = this; 3773 for (let pos = 0, len = out.length; pos < len;) { 3774 if (this.posOut >= blockLen) this.keccak(); 3775 const take = Math.min(blockLen - this.posOut, len - pos); 3776 out.set(bufferOut.subarray(this.posOut, this.posOut + take), pos); 3777 this.posOut += take; 3778 pos += take; 3779 } 3780 return out; 3781 } 3782 xofInto(out) { 3783 if (!this.enableXOF) throw new Error("XOF is not possible for this instance"); 3784 return this.writeInto(out); 3785 } 3786 xof(bytes) { 3787 number(bytes); 3788 return this.xofInto(new Uint8Array(bytes)); 3789 } 3790 digestInto(out) { 3791 output(out, this); 3792 if (this.finished) throw new Error("digest() was already called"); 3793 this.writeInto(out); 3794 this.destroy(); 3795 return out; 3796 } 3797 digest() { 3798 return this.digestInto(new Uint8Array(this.outputLen)); 3799 } 3800 destroy() { 3801 this.destroyed = true; 3802 this.state.fill(0); 3803 } 3804 _cloneInto(to) { 3805 const { blockLen, suffix, outputLen, rounds, enableXOF } = this; 3806 to || (to = new Keccak(blockLen, suffix, outputLen, enableXOF, roun
3806ds)); 3807 to.state32.set(this.state32); 3808 to.pos = this.pos; 3809 to.posOut = this.posOut; 3810 to.finished = this.finished; 3811 to.rounds = rounds; 3812 to.suffix = suffix; 3813 to.outputLen = outputLen; 3814 to.enableXOF = enableXOF; 3815 to.destroyed = this.destroyed; 3816 return to; 3817 } 3818}; 3819var gen = (suffix, blockLen, outputLen) => wrapConstructor(() => new Keccak(blockLen, suffix, outputLen)); 3820/** 3821* keccak-256 hash function. Different from SHA3-256. 3822* @param message - that would be hashed 3823*/ 3824var keccak_256 = /* @__PURE__ */ gen(1, 136, 32); 3825//#endregion 3826//#region node_modules/ethers/lib.esm/crypto/keccak.js 3827/** 3828* Cryptographic hashing functions 3829* 3830* @_subsection: api/crypto:Hash Functions [about-crypto-hashing] 3831*/ 3832var locked$3 = false; 3833var _keccak256 = function(data) { 3834 return keccak_256(data); 3835}; 3836var __keccak256 = _keccak256; 3837/** 3838* Compute the cryptographic KECCAK256 hash of %%data%%. 3839* 3840* The %%data%% **must** be a data representation, to compute the 3841* hash of UTF-8 data use the [[id]] function. 3842* 3843* @returns DataHexstring 3844* @example: 3845* keccak256("0x") 3846* //_result: 3847* 3848* keccak256("0x1337") 3849* //_result: 3850* 3851* keccak256(new Uint8Array([ 0x13, 0x37 ])) 3852* //_result: 3853* 3854* // Strings are assumed to be DataHexString, otherwise it will 3855* // throw. To hash UTF-8 data, see the note above. 3856* keccak256("Hello World") 3857* //_error: 3858*/ 3859function keccak256(_data) { 3860 const data = getBytes(_data, "data"); 3861 return hexlify(__keccak256(data)); 3862} 3863keccak256._ = _keccak256; 3864keccak256.lock = function() { 3865 locked$3 = true; 3866}; 3867keccak256.register = function(func) { 3868 if (locked$3) throw new TypeError("keccak256 is locked"); 3869 __keccak256 = func; 3870}; 3871Object.freeze(keccak256); 3872//#endregion 3873//#region node_modules/@noble/hashes/esm/ripemd160.js 3874var Rho = /* @__PURE__ */ new Uint8Array([ 3875 7, 3876 4, 3877 13, 3878 1, 3879 10, 3880 6, 3881 15, 3882 3, 3883 12, 3884 0, 3885 9, 3886 5, 3887 2, 3888 14, 3889 11, 3890 8 3891]); 3892var Id = /* @__PURE__ */ Uint8Array.from({ length: 16 }, (_, i) => i); 3893var Pi = /* @__PURE__ */ Id.map((i) => (9 * i + 5) % 16); 3894var idxL = [Id]; 3895var idxR = [Pi]; 3896for (let i = 0; i < 4; i++) for (let j of [idxL, idxR]) j.push(j[i].map((k) => Rho[k])); 3897var shifts = /* @__PURE__ */ [ 3898 [ 3899 11, 3900 14, 3901 15, 3902 12, 3903 5, 3904 8, 3905 7, 3906 9, 3907 11, 3908 13, 3909 14, 3910 15, 3911 6, 3912 7, 3913 9, 3914 8 3915 ], 3916 [ 3917 12, 3918 13, 3919 11, 3920 15, 3921 6, 3922 9, 3923 9, 3924 7, 3925 12, 3926 15, 3927 11, 3928 13, 3929 7, 3930 8, 3931 7, 3932 7 3933 ], 3934 [ 3935 13, 3936 15, 3937 14, 3938 11, 3939 7, 3940 7, 3941 6, 3942 8, 3943 13, 3944 14, 3945 13, 3946 12, 3947 5, 3948 5, 3949 6, 3950 9 3951 ], 3952 [ 3953 14, 3954 11, 3955 12, 3956 14, 3957 8, 3958 6, 3959 5, 3960 5, 3961 15, 3962 12, 3963 15, 3964 14, 3965 9, 3966 9, 3967 8, 3968 6 3969 ], 3970 [ 3971 15, 3972 12, 3973 13, 3974 13, 3975 9, 3976 5, 3977 8, 3978 6, 3979 14, 3980 11, 3981 12, 3982 11, 3983 8, 3984 6, 3985 5, 3986 5 3987 ] 3988].map((i) => new Uint8Array(i)); 3989var shiftsL = /* @__PURE__ */ idxL.map((idx, i) => idx.map((j) => shifts[i][j])); 3990var shiftsR = /* @__PURE__ */ idxR.map((idx, i) => idx.map((j) => shifts[i][j])); 3991var Kl = /* @__PURE__ */ new Uint32Array([ 3992 0, 3993 1518500249, 3994 1859775393, 3995 2400959708, 3996 2840853838 3997]); 3998var Kr = /* @__PURE__ */ new Uint32Array([ 3999 1352829926, 4000 1548603684, 4001 1836072691, 4002 2053994217, 4003 0 4004]); 4005var rotl$1 = (word, shift) => word << shift | word >>> 32 - shift; 4006function f(group, x, y, z) { 4007 if (group === 0) return x ^ y ^ z; 4008 else if (group === 1) return x & y | ~x & z; 4009 else if (group === 2) return (x | ~y) ^ z; 4010 else if (group === 3) return x & z | y & ~z; 4011 else return x ^ (y | ~z); 4012} 4013var BUF = /* @__PURE__ */ new Uint32Array(16); 4014var RIPEMD160 = class extends SHA2 { 4015 constructor() { 4016 super(64, 20, 8, true); 4017 this.h0 = 1732584193; 4018 this.h1 = -271733879;
4019 this.h2 = -1732584194; 4020 this.h3 = 271733878; 4021 this.h4 = -1009589776; 4022 } 4023 get() { 4024 const { h0, h1, h2, h3, h4 } = this; 4025 return [ 4026 h0, 4027 h1, 4028 h2, 4029 h3, 4030 h4 4031 ]; 4032 } 4033 set(h0, h1, h2, h3, h4) { 4034 this.h0 = h0 | 0; 4035 this.h1 = h1 | 0; 4036 this.h2 = h2 | 0; 4037 this.h3 = h3 | 0; 4038 this.h4 = h4 | 0; 4039 } 4040 process(view, offset) { 4041 for (let i = 0; i < 16; i++, offset += 4) BUF[i] = view.getUint32(offset, true); 4042 let al = this.h0 | 0, ar = al, bl = this.h1 | 0, br = bl, cl = this.h2 | 0, cr = cl, dl = this.h3 | 0, dr = dl, el = this.h4 | 0, er = el; 4043 for (let group = 0; group < 5; group++) { 4044 const rGroup = 4 - group; 4045 const hbl = Kl[group], hbr = Kr[group]; 4046 const rl = idxL[group], rr = idxR[group]; 4047 const sl = shiftsL[group], sr = shiftsR[group]; 4048 for (let i = 0; i < 16; i++) { 4049 const tl = rotl$1(al + f(group, bl, cl, dl) + BUF[rl[i]] + hbl, sl[i]) + el | 0; 4050 al = el, el = dl, dl = rotl$1(cl, 10) | 0, cl = bl, bl = tl; 4051 } 4052 for (let i = 0; i < 16; i++) { 4053 const tr = rotl$1(ar + f(rGroup, br, cr, dr) + BUF[rr[i]] + hbr, sr[i]) + er | 0; 4054 ar = er, er = dr, dr = rotl$1(cr, 10) | 0, cr = br, br = tr; 4055 } 4056 } 4057 this.set(this.h1 + cl + dr | 0, this.h2 + dl + er | 0, this.h3 + el + ar | 0, this.h4 + al + br | 0, this.h0 + bl + cr | 0); 4058 } 4059 roundClean() { 4060 BUF.fill(0); 4061 } 4062 destroy() { 4063 this.destroyed = true; 4064 this.buffer.fill(0); 4065 this.set(0, 0, 0, 0, 0); 4066 } 4067}; 4068/** 4069* RIPEMD-160 - a hash function from 1990s. 4070* @param message - msg that would be hashed 4071*/ 4072var ripemd160$1 = /* @__PURE__ */ wrapConstructor(() => new RIPEMD160()); 4073//#endregion 4074//#region node_modules/ethers/lib.esm/crypto/ripemd160.js 4075var locked$2 = false; 4076var _ripemd160 = function(data) { 4077 return ripemd160$1(data); 4078}; 4079var __ripemd160 = _ripemd160; 4080/** 4081* Compute the cryptographic RIPEMD-160 hash of %%data%%. 4082* 4083* @_docloc: api/crypto:Hash Functions 4084* @returns DataHexstring 4085* 4086* @example: 4087* ripemd160("0x") 4088* //_result: 4089* 4090* ripemd160("0x1337") 4091* //_result: 4092* 4093* ripemd160(new Uint8Array([ 0x13, 0x37 ])) 4094* //_result: 4095* 4096*/ 4097function ripemd160(_data) { 4098 const data = getBytes(_data, "data"); 4099 return hexlify(__ripemd160(data)); 4100} 4101ripemd160._ = _ripemd160; 4102ripemd160.lock = function() { 4103 locked$2 = true; 4104}; 4105ripemd160.register = function(func) { 4106 if (locked$2) throw new TypeError("ripemd160 is locked"); 4107 __ripemd160 = func; 4108}; 4109Object.freeze(ripemd160); 4110//#endregion 4111//#region node_modules/ethers/lib.esm/crypto/pbkdf2.js 4112/** 4113* A **Password-Based Key-Derivation Function** is designed to create 4114* a sequence of bytes suitible as a **key** from a human-rememberable 4115* password. 4116* 4117* @_subsection: api/crypto:Passwords [about-pbkdf] 4118*/ 4119var locked$1 = false; 4120var _pbkdf2 = function(password, salt, iterations, keylen, algo) { 4121 return pbkdf2Sync(password, salt, iterations, keylen, algo); 4122}; 4123var __pbkdf2 = _pbkdf2; 4124/** 4125* Return the [[link-pbkdf2]] for %%keylen%% bytes for %%password%% using 4126* the %%salt%% and using %%iterations%% of %%algo%%. 4127* 4128* This PBKDF is outdated and should not be used in new projects, but is 4129* required to decrypt older files. 4130* 4131* @example: 4132* // The password must be converted to bytes, and it is generally 4133* // best practices to ensure the string has been normalized. Many 4134* // formats explicitly indicate the normalization form to use. 4135* password = "hello" 4136* passwordBytes = toUtf8Bytes(password, "NFKC") 4137* 4138* salt = id("some-salt") 4139* 4140* // Compute the PBKDF2 4141* pbkdf2(passwordBytes, salt, 1024, 16, "sha256") 4142* //_result: 4143*/ 4144function pbkdf2(_password, _salt, iterations, keylen, algo) { 4145 const password = getBytes(_password, "password"); 4146 const salt = getBytes(_salt, "salt"); 4147 return hexlify(__pbkdf2(password, salt, iterations, keylen, algo)); 4148} 4149pbkdf2._ = _pbkdf2; 4150pbkdf2.lock = function() { 4151 locked$1 = true; 4152}; 4153pbkdf2.register = function(func) { 4154 if (locked$1) throw new Error("pbkdf2 is locked"); 4155 __pbkdf2 = func; 4156}; 4157Object.freeze(pbkdf2); 4158//#endregion 4159//#region node_modules/ethers/lib.esm/crypto/random.js 4160/** 4161* A **Cryptographically Secure Random Value** is one that has been 4162* generated with additional care take to prevent side-channels 4163* from allowing others to detect it and prevent others from through 4164* coincidence generate the same values. 4165* 4166* @_subsection: api/crypto:Random Values [about-crypto-random] 4167*/ 4168var locked = false;
4169var _randomBytes = function(length) { 4170 return new Uint8Array(randomBytes$1(length)); 4171}; 4172var __randomBytes = _randomBytes; 4173/** 4174* Return %%length%% bytes of cryptographically secure random data. 4175* 4176* @example: 4177* randomBytes(8) 4178* //_result: 4179*/ 4180function randomBytes(length) { 4181 return __randomBytes(length); 4182} 4183randomBytes._ = _randomBytes; 4184randomBytes.lock = function() { 4185 locked = true; 4186}; 4187randomBytes.register = function(func) { 4188 if (locked) throw new Error("randomBytes is locked"); 4189 __randomBytes = func; 4190}; 4191Object.freeze(randomBytes); 4192//#endregion 4193//#region node_modules/@noble/hashes/esm/scrypt.js 4194var rotl = (a, b) => a << b | a >>> 32 - b; 4195function XorAndSalsa(prev, pi, input, ii, out, oi) { 4196 let y00 = prev[pi++] ^ input[ii++], y01 = prev[pi++] ^ input[ii++]; 4197 let y02 = prev[pi++] ^ input[ii++], y03 = prev[pi++] ^ input[ii++]; 4198 let y04 = prev[pi++] ^ input[ii++], y05 = prev[pi++] ^ input[ii++]; 4199 let y06 = prev[pi++] ^ input[ii++], y07 = prev[pi++] ^ input[ii++]; 4200 let y08 = prev[pi++] ^ input[ii++], y09 = prev[pi++] ^ input[ii++]; 4201 let y10 = prev[pi++] ^ input[ii++], y11 = prev[pi++] ^ input[ii++]; 4202 let y12 = prev[pi++] ^ input[ii++], y13 = prev[pi++] ^ input[ii++]; 4203 let y14 = prev[pi++] ^ input[ii++], y15 = prev[pi++] ^ input[ii++]; 4204 let x00 = y00, x01 = y01, x02 = y02, x03 = y03, x04 = y04, x05 = y05, x06 = y06, x07 = y07, x08 = y08, x09 = y09, x10 = y10, x11 = y11, x12 = y12, x13 = y13, x14 = y14, x15 = y15; 4205 for (let i = 0; i < 8; i += 2) { 4206 x04 ^= rotl(x00 + x12 | 0, 7); 4207 x08 ^= rotl(x04 + x00 | 0, 9); 4208 x12 ^= rotl(x08 + x04 | 0, 13); 4209 x00 ^= rotl(x12 + x08 | 0, 18); 4210 x09 ^= rotl(x05 + x01 | 0, 7); 4211 x13 ^= rotl(x09 + x05 | 0, 9); 4212 x01 ^= rotl(x13 + x09 | 0, 13); 4213 x05 ^= rotl(x01 + x13 | 0, 18); 4214 x14 ^= rotl(x10 + x06 | 0, 7); 4215 x02 ^= rotl(x14 + x10 | 0, 9); 4216 x06 ^= rotl(x02 + x14 | 0, 13); 4217 x10 ^= rotl(x06 + x02 | 0, 18); 4218 x03 ^= rotl(x15 + x11 | 0, 7); 4219 x07 ^= rotl(x03 + x15 | 0, 9); 4220 x11 ^= rotl(x07 + x03 | 0, 13); 4221 x15 ^= rotl(x11 + x07 | 0, 18); 4222 x01 ^= rotl(x00 + x03 | 0, 7); 4223 x02 ^= rotl(x01 + x00 | 0, 9); 4224 x03 ^= rotl(x02 + x01 | 0, 13); 4225 x00 ^= rotl(x03 + x02 | 0, 18); 4226 x06 ^= rotl(x05 + x04 | 0, 7); 4227 x07 ^= rotl(x06 + x05 | 0, 9); 4228 x04 ^= rotl(x07 + x06 | 0, 13); 4229 x05 ^= rotl(x04 + x07 | 0, 18); 4230 x11 ^= rotl(x10 + x09 | 0, 7); 4231 x08 ^= rotl(x11 + x10 | 0, 9); 4232 x09 ^= rotl(x08 + x11 | 0, 13); 4233 x10 ^= rotl(x09 + x08 | 0, 18); 4234 x12 ^= rotl(x15 + x14 | 0, 7); 4235 x13 ^= rotl(x12 + x15 | 0, 9); 4236 x14 ^= rotl(x13 + x12 | 0, 13); 4237 x15 ^= rotl(x14 + x13 | 0, 18); 4238 } 4239 out[oi++] = y00 + x00 | 0; 4240 out[oi++] = y01 + x01 | 0; 4241 out[oi++] = y02 + x02 | 0; 4242 out[oi++] = y03 + x03 | 0; 4243 out[oi++] = y04 + x04 | 0; 4244 out[oi++] = y05 + x05 | 0; 4245 out[oi++] = y06 + x06 | 0; 4246 out[oi++] = y07 + x07 | 0; 4247 out[oi++] = y08 + x08 | 0; 4248 out[oi++] = y09 + x09 | 0; 4249 out[oi++] = y10 + x10 | 0; 4250 out[oi++] = y11 + x11 | 0; 4251 out[oi++] = y12 + x12 | 0; 4252 out[oi++] = y13 + x13 | 0; 4253 out[oi++] = y14 + x14 | 0; 4254 out[oi++] = y15 + x15 | 0; 4255} 4256function BlockMix(input, ii, out, oi, r) { 4257 let head = oi + 0; 4258 let tail = oi + 16 * r; 4259 for (let i = 0; i < 16; i++) out[tail + i] = input[ii + (2 * r - 1) * 16 + i]; 4260 for (let i = 0; i < r; i++, head += 16, ii += 16) { 4261 XorAndSalsa(out, tail, input, ii, out, head); 4262 if (i > 0) tail += 16; 4263 XorAndSalsa(out, head, input, ii += 16, out, tail); 4264 } 4265} 4266function scryptInit(password, salt, _opts) { 4267 const { N, r, p, dkLen, asyncTick, maxmem, onProgress } = checkOpts({ 4268 dkLen: 32, 4269 asyncTick: 10, 4270 maxmem: 1024 ** 3 + 1024 4271 }, _opts); 4272 number(N); 4273 number(r); 4274 number(p); 4275 number(dkLen); 4276 number(asyncTick); 4277 number(maxmem); 4278 if (onProgress !== void 0 && typeof onProgress !== "function") throw new Error("progressCb should be function"); 4279 const blockSize = 128 * r; 4280 const blockSize32 = blockSize / 4; 4281 if (N <= 1 || (N & N - 1) !== 0 || N >= 2 ** (blockSize / 8) || N > 2 ** 32) throw new Error("Scrypt: N must be larger than 1, a power of 2, less than 2^(128 * r / 8) and less than 2^32"); 4282 if (p < 0 || p > (2 ** 32 - 1) * 32 / blockSize) throw new Error("Scrypt: p must be a positive integer less than or equal to ((2^32 - 1) * 32) / (128 * r)"); 4283 if (dkLen < 0 || dkLen > (2 ** 32 - 1) * 32) throw new Error("Scrypt: dkLen should be positive integer less than or equal to (2^32 - 1) * 32"); 4284 const memUsed = blockSize * (N + p); 4285 if (memUsed > maxmem) throw new Error(`Scrypt: parameters too large, ${memUsed} (128 * r * (N + p)) > ${maxmem} (maxmem)`);
vendor: 3,839 bytes, lines 4286-4416
4286 const B = pbkdf2$1(sha256$1, password, salt, { 4287 c: 1, 4288 dkLen: blockSize * p 4289 }); 4290 const B32 = u32(B); 4291 const V = u32(new Uint8Array(blockSize * N)); 4292 const tmp = u32(new Uint8Array(blockSize)); 4293 let blockMixCb = () => {}; 4294 if (onProgress) { 4295 const totalBlockMix = 2 * N * p; 4296 const callbackPer = Math.max(Math.floor(totalBlockMix / 1e4), 1); 4297 let blockMixCnt = 0; 4298 blockMixCb = () => { 4299 blockMixCnt++; 4300 if (onProgress && (!(blockMixCnt % callbackPer) || blockMixCnt === totalBlockMix)) onProgress(blockMixCnt / totalBlockMix); 4301 }; 4302 } 4303 return { 4304 N, 4305 r, 4306 p, 4307 dkLen, 4308 blockSize32, 4309 V, 4310 B32, 4311 B, 4312 tmp, 4313 blockMixCb, 4314 asyncTick 4315 }; 4316} 4317function scryptOutput(password, dkLen, B, V, tmp) { 4318 const res = pbkdf2$1(sha256$1, password, B, { 4319 c: 1, 4320 dkLen 4321 }); 4322 B.fill(0); 4323 V.fill(0); 4324 tmp.fill(0); 4325 return res; 4326} 4327/** 4328* Scrypt KDF from RFC 7914. 4329* @param password - pass 4330* @param salt - salt 4331* @param opts - parameters 4332* - `N` is cpu/mem work factor (power of 2 e.g. 2**18) 4333* - `r` is block size (8 is common), fine-tunes sequential memory read size and performance 4334* - `p` is parallelization factor (1 is common) 4335* - `dkLen` is output key length in bytes e.g. 32. 4336* - `asyncTick` - (default: 10) max time in ms for which async function can block execution 4337* - `maxmem` - (default: `1024 ** 3 + 1024` aka 1GB+1KB). A limit that the app could use for scrypt 4338* - `onProgress` - callback function that would be executed for progress report 4339* @returns Derived key 4340*/ 4341function scrypt$1(password, salt, opts) { 4342 const { N, r, p, dkLen, blockSize32, V, B32, B, tmp, blockMixCb } = scryptInit(password, salt, opts); 4343 for (let pi = 0; pi < p; pi++) { 4344 const Pi = blockSize32 * pi; 4345 for (let i = 0; i < blockSize32; i++) V[i] = B32[Pi + i]; 4346 for (let i = 0, pos = 0; i < N - 1; i++) { 4347 BlockMix(V, pos, V, pos += blockSize32, r); 4348 blockMixCb(); 4349 } 4350 BlockMix(V, (N - 1) * blockSize32, B32, Pi, r); 4351 blockMixCb(); 4352 for (let i = 0; i < N; i++) { 4353 const j = B32[Pi + blockSize32 - 16] % N; 4354 for (let k = 0; k < blockSize32; k++) tmp[k] = B32[Pi + k] ^ V[j * blockSize32 + k]; 4355 BlockMix(tmp, 0, B32, Pi, r); 4356 blockMixCb(); 4357 } 4358 } 4359 return scryptOutput(password, dkLen, B, V, tmp); 4360} 4361/** 4362* Scrypt KDF from RFC 7914. 4363*/ 4364async function scryptAsync(password, salt, opts) { 4365 const { N, r, p, dkLen, blockSize32, V, B32, B, tmp, blockMixCb, asyncTick } = scryptInit(password, salt, opts); 4366 for (let pi = 0; pi < p; pi++) { 4367 const Pi = blockSize32 * pi; 4368 for (let i = 0; i < blockSize32; i++) V[i] = B32[Pi + i]; 4369 let pos = 0; 4370 await asyncLoop(N - 1, asyncTick, () => { 4371 BlockMix(V, pos, V, pos += blockSize32, r); 4372 blockMixCb(); 4373 }); 4374 BlockMix(V, (N - 1) * blockSize32, B32, Pi, r); 4375 blockMixCb(); 4376 await asyncLoop(N, asyncTick, () => { 4377 const j = B32[Pi + blockSize32 - 16] % N; 4378 for (let k = 0; k < blockSize32; k++) tmp[k] = B32[Pi + k] ^ V[j * blockSize32 + k]; 4379 BlockMix(tmp, 0, B32, Pi, r); 4380 blockMixCb(); 4381 }); 4382 } 4383 return scryptOutput(password, dkLen, B, V, tmp); 4384} 4385//#endregion 4386//#region node_modules/ethers/lib.esm/crypto/scrypt.js 4387var lockedSync = false; 4388var lockedAsync = false; 4389var _scryptAsync = async function(passwd, salt, N, r, p, dkLen, onProgress) { 4390 return await scryptAsync(passwd, salt, { 4391 N, 4392 r, 4393 p, 4394 dkLen, 4395 onProgress 4396 }); 4397}; 4398var _scryptSync = function(passwd, salt, N, r, p, dkLen) { 4399 return scrypt$1(passwd, salt, { 4400 N, 4401 r, 4402 p, 4403 dkLen 4404 }); 4405}; 4406var __scryptAsync = _scryptAsync; 4407var __scryptSync = _scryptSync; 4408/** 4409* The [[link-wiki-scrypt]] uses a memory and cpu hard method of 4410* derivation to increase the resource cost to brute-force a password 4411* for a given key. 4412* 4413* This means this algorithm is intentionally slow, and can be tuned to 4414* become slower. As computation and memory speed improve over time, 4415* increasing the difficulty maintains the cost of an attacker. 4416*
4417* For example, if a target time of 5 seconds is used, a legitimate user 4418* which knows their password requires only 5 seconds to unlock their 4419* account. A 6 character password has 68 billion possibilities, which 4420* would require an attacker to invest over 10,000 years of CPU time. This 4421* is of course a crude example (as password generally aren't random), 4422* but demonstrates to value of imposing large costs to decryption. 4423* 4424* For this reason, if building a UI which involved decrypting or 4425* encrypting datsa using scrypt, it is recommended to use a 4426* [[ProgressCallback]] (as event short periods can seem lik an eternity 4427* if the UI freezes). Including the phrase //"decrypting"// in the UI 4428* can also help, assuring the user their waiting is for a good reason. 4429* 4430* @_docloc: api/crypto:Passwords 4431* 4432* @example: 4433* // The password must be converted to bytes, and it is generally 4434* // best practices to ensure the string has been normalized. Many 4435* // formats explicitly indicate the normalization form to use. 4436* password = "hello" 4437* passwordBytes = toUtf8Bytes(password, "NFKC") 4438* 4439* salt = id("some-salt") 4440* 4441* // Compute the scrypt 4442* scrypt(passwordBytes, salt, 1024, 8, 1, 16) 4443* //_result: 4444*/ 4445async function scrypt(_passwd, _salt, N, r, p, dkLen, progress) { 4446 const passwd = getBytes(_passwd, "passwd"); 4447 const salt = getBytes(_salt, "salt"); 4448 return hexlify(await __scryptAsync(passwd, salt, N, r, p, dkLen, progress)); 4449} 4450scrypt._ = _scryptAsync; 4451scrypt.lock = function() { 4452 lockedAsync = true; 4453}; 4454scrypt.register = function(func) { 4455 if (lockedAsync) throw new Error("scrypt is locked"); 4456 __scryptAsync = func; 4457}; 4458Object.freeze(scrypt); 4459/** 4460* Provides a synchronous variant of [[scrypt]]. 4461* 4462* This will completely lock up and freeze the UI in a browser and will 4463* prevent any event loop from progressing. For this reason, it is 4464* preferred to use the [async variant](scrypt). 4465* 4466* @_docloc: api/crypto:Passwords 4467* 4468* @example: 4469* // The password must be converted to bytes, and it is generally 4470* // best practices to ensure the string has been normalized. Many 4471* // formats explicitly indicate the normalization form to use. 4472* password = "hello" 4473* passwordBytes = toUtf8Bytes(password, "NFKC") 4474* 4475* salt = id("some-salt") 4476* 4477* // Compute the scrypt 4478* scryptSync(passwordBytes, salt, 1024, 8, 1, 16) 4479* //_result: 4480*/ 4481function scryptSync(_passwd, _salt, N, r, p, dkLen) { 4482 const passwd = getBytes(_passwd, "passwd"); 4483 const salt = getBytes(_salt, "salt"); 4484 return hexlify(__scryptSync(passwd, salt, N, r, p, dkLen)); 4485} 4486scryptSync._ = _scryptSync; 4487scryptSync.lock = function() { 4488 lockedSync = true; 4489}; 4490scryptSync.register = function(func) { 4491 if (lockedSync) throw new Error("scryptSync is locked"); 4492 __scryptSync = func; 4493}; 4494Object.freeze(scryptSync); 4495//#endregion 4496//#region node_modules/ethers/lib.esm/crypto/sha2.js 4497var _sha256 = function(data) { 4498 return createHash("sha256").update(data).digest(); 4499}; 4500var _sha512 = function(data) { 4501 return createHash("sha512").update(data).digest(); 4502}; 4503var __sha256 = _sha256; 4504var __sha512 = _sha512; 4505var locked256 = false; 4506var locked512 = false; 4507/** 4508* Compute the cryptographic SHA2-256 hash of %%data%%. 4509* 4510* @_docloc: api/crypto:Hash Functions 4511* @returns DataHexstring 4512* 4513* @example: 4514* sha256("0x") 4515* //_result: 4516* 4517* sha256("0x1337") 4518* //_result: 4519* 4520* sha256(new Uint8Array([ 0x13, 0x37 ])) 4521* //_result: 4522* 4523*/ 4524function sha256(_data) { 4525 const data = getBytes(_data, "data"); 4526 return hexlify(__sha256(data)); 4527} 4528sha256._ = _sha256; 4529sha256.lock = function() { 4530 locked256 = true; 4531}; 4532sha256.register = function(func) { 4533 if (locked256) throw new Error("sha256 is locked"); 4534 __sha256 = func; 4535}; 4536Object.freeze(sha256); 4537/** 4538* Compute the cryptographic SHA2-512 hash of %%data%%. 4539* 4540* @_docloc: api/crypto:Hash Functions 4541* @returns DataHexstring 4542* 4543* @example: 4544* sha512("0x") 4545* //_result: 4546* 4547* sha512("0x1337") 4548* //_result: 4549* 4550* sha512(new Uint8Array([ 0x13, 0x37 ])) 4551* //_result: 4552*/ 4553function sha512(_data) { 4554 const data = getBytes(_data, "data"); 4555 return hexlify(__sha512(data)); 4556} 4557sha512._ = _sha512; 4558sha512.lock = function() { 4559 locked512 = true; 4560}; 4561sha512.register = function(func) { 4562 if (locked512) throw new Error("sha512 is locked"); 4563 __sha512 = func; 4564}; 4565Object.freeze(sha256); 4566//#endregion 4567//#region node_modules/@noble/curves/esm/abstract/utils.js
4568var utils_exports = /* @__PURE__ */ __exportAll({ 4569 bitGet: () => bitGet, 4570 bitLen: () => bitLen, 4571 bitMask: () => bitMask, 4572 bitSet: () => bitSet, 4573 bytesToHex: () => bytesToHex, 4574 bytesToNumberBE: () => bytesToNumberBE, 4575 bytesToNumberLE: () => bytesToNumberLE, 4576 concatBytes: () => concatBytes, 4577 createHmacDrbg: () => createHmacDrbg, 4578 ensureBytes: () => ensureBytes, 4579 equalBytes: () => equalBytes, 4580 hexToBytes: () => hexToBytes, 4581 hexToNumber: () => hexToNumber, 4582 numberToBytesBE: () => numberToBytesBE, 4583 numberToBytesLE: () => numberToBytesLE, 4584 numberToHexUnpadded: () => numberToHexUnpadded, 4585 numberToVarBytesBE: () => numberToVarBytesBE, 4586 utf8ToBytes: () => utf8ToBytes, 4587 validateObject: () => validateObject 4588}); 4589/*! noble-curves - MIT License (c) 2022 Paul Miller (paulmillr.com) */ 4590var _0n$3 = BigInt(0); 4591var _1n$4 = BigInt(1); 4592var _2n$2 = BigInt(2); 4593var u8a = (a) => a instanceof Uint8Array; 4594var hexes = /* @__PURE__ */ Array.from({ length: 256 }, (_, i) => i.toString(16).padStart(2, "0")); 4595/** 4596* @example bytesToHex(Uint8Array.from([0xca, 0xfe, 0x01, 0x23])) // 'cafe0123' 4597*/ 4598function bytesToHex(bytes) { 4599 if (!u8a(bytes)) throw new Error("Uint8Array expected"); 4600 let hex = ""; 4601 for (let i = 0; i < bytes.length; i++) hex += hexes[bytes[i]]; 4602 return hex; 4603} 4604function numberToHexUnpadded(num) { 4605 const hex = num.toString(16); 4606 return hex.length & 1 ? `0${hex}` : hex; 4607} 4608function hexToNumber(hex) { 4609 if (typeof hex !== "string") throw new Error("hex string expected, got " + typeof hex); 4610 return BigInt(hex === "" ? "0" : `0x${hex}`); 4611} 4612/** 4613* @example hexToBytes('cafe0123') // Uint8Array.from([0xca, 0xfe, 0x01, 0x23]) 4614*/ 4615function hexToBytes(hex) { 4616 if (typeof hex !== "string") throw new Error("hex string expected, got " + typeof hex); 4617 const len = hex.length; 4618 if (len % 2) throw new Error("padded hex string expected, got unpadded hex of length " + len); 4619 const array = new Uint8Array(len / 2); 4620 for (let i = 0; i < array.length; i++) { 4621 const j = i * 2; 4622 const hexByte = hex.slice(j, j + 2); 4623 const byte = Number.parseInt(hexByte, 16); 4624 if (Number.isNaN(byte) || byte < 0) throw new Error("Invalid byte sequence"); 4625 array[i] = byte; 4626 } 4627 return array; 4628} 4629function bytesToNumberBE(bytes) { 4630 return hexToNumber(bytesToHex(bytes)); 4631} 4632function bytesToNumberLE(bytes) { 4633 if (!u8a(bytes)) throw new Error("Uint8Array expected"); 4634 return hexToNumber(bytesToHex(Uint8Array.from(bytes).reverse())); 4635} 4636function numberToBytesBE(n, len) { 4637 return hexToBytes(n.toString(16).padStart(len * 2, "0")); 4638} 4639function numberToBytesLE(n, len) { 4640 return numberToBytesBE(n, len).reverse(); 4641} 4642function numberToVarBytesBE(n) { 4643 return hexToBytes(numberToHexUnpadded(n)); 4644} 4645/** 4646* Takes hex string or Uint8Array, converts to Uint8Array. 4647* Validates output length. 4648* Will throw error for other types. 4649* @param title descriptive title for an error e.g. 'private key' 4650* @param hex hex string or Uint8Array 4651* @param expectedLength optional, will compare to result array's length 4652* @returns 4653*/ 4654function ensureBytes(title, hex, expectedLength) { 4655 let res; 4656 if (typeof hex === "string") try { 4657 res = hexToBytes(hex); 4658 } catch (e) { 4659 throw new Error(`${title} must be valid hex string, got "${hex}". Cause: ${e}`); 4660 } 4661 else if (u8a(hex)) res = Uint8Array.from(hex); 4662 else throw new Error(`${title} must be hex string or Uint8Array`); 4663 const len = res.length; 4664 if (typeof expectedLength === "number" && len !== expectedLength) throw new Error(`${title} expected ${expectedLength} bytes, got ${len}`); 4665 return res; 4666} 4667/** 4668* Copies several Uint8Arrays into one. 4669*/ 4670function concatBytes(...arrays) { 4671 const r = new Uint8Array(arrays.reduce((sum, a) => sum + a.length, 0)); 4672 let pad = 0; 4673 arrays.forEach((a) => { 4674 if (!u8a(a)) throw new Error("Uint8Array expected"); 4675 r.set(a, pad); 4676 pad += a.length; 4677 }); 4678 return r; 4679} 4680function equalBytes(b1, b2) { 4681 if (b1.length !== b2.length) return false; 4682 for (let i = 0; i < b1.length; i++) if (b1[i] !== b2[i]) return false; 4683 return true; 4684} 4685/** 4686* @example utf8ToBytes('abc') // new Uint8Array([97, 98, 99]) 4687*/ 4688function utf8ToBytes(str) { 4689 if (typeof str !== "string") throw new Error(`utf8ToBytes expected string, got ${typeof str}`); 4690 return new Uint8Array(new TextEncoder().encode(str)); 4691} 4692/** 4693* Calculates amount of bits in a bigint. 4694* Same as `n.toString(2).length` 4695*/ 4696function bitLen(n) { 4697 let len = 0; 4698 for (; n > _0n$3; n >>= _1n$4, len += 1); 4699 return len; 4700} 4701/** 4702* Gets single bit at position. 4703* NOTE: first bit position is 0 (same as arrays) 4704* Same as `!!+Array.from(n.toString(2)).reverse()[pos]` 4705*/ 4706function bitGet(n, pos) { 4707 return n >> BigInt(pos) & _1n$4; 4708} 4709/** 4710* Sets single bit at position. 4711*/ 4712var bitSet = (n, pos, value) => { 4713 return n | (value ? _1n$4 : _0n$3) << BigInt(pos); 4714}; 4715/** 4716* Calculate mask for N bits. Not using ** operator with bigints because of old engines. 4717* Same as BigInt(`0b${Array(i).fill('1').join('')}`) 4718*/ 4719var bitMask = (n) => (_2n$2 << BigInt(n - 1)) - _1n$4; 4720var u8n = (data) => new Uint8Array(data);
vendor: 10,484 bytes, lines 4721-5059
4721var u8fr = (arr) => Uint8Array.from(arr); 4722/** 4723* Minimal HMAC-DRBG from NIST 800-90 for RFC6979 sigs. 4724* @returns function that will call DRBG until 2nd arg returns something meaningful 4725* @example 4726* const drbg = createHmacDRBG<Key>(32, 32, hmac); 4727* drbg(seed, bytesToKey); // bytesToKey must return Key or undefined 4728*/ 4729function createHmacDrbg(hashLen, qByteLen, hmacFn) { 4730 if (typeof hashLen !== "number" || hashLen < 2) throw new Error("hashLen must be a number"); 4731 if (typeof qByteLen !== "number" || qByteLen < 2) throw new Error("qByteLen must be a number"); 4732 if (typeof hmacFn !== "function") throw new Error("hmacFn must be a function"); 4733 let v = u8n(hashLen); 4734 let k = u8n(hashLen); 4735 let i = 0; 4736 const reset = () => { 4737 v.fill(1); 4738 k.fill(0); 4739 i = 0; 4740 }; 4741 const h = (...b) => hmacFn(k, v, ...b); 4742 const reseed = (seed = u8n()) => { 4743 k = h(u8fr([0]), seed); 4744 v = h(); 4745 if (seed.length === 0) return; 4746 k = h(u8fr([1]), seed); 4747 v = h(); 4748 }; 4749 const gen = () => { 4750 if (i++ >= 1e3) throw new Error("drbg: tried 1000 values"); 4751 let len = 0; 4752 const out = []; 4753 while (len < qByteLen) { 4754 v = h(); 4755 const sl = v.slice(); 4756 out.push(sl); 4757 len += v.length; 4758 } 4759 return concatBytes(...out); 4760 }; 4761 const genUntil = (seed, pred) => { 4762 reset(); 4763 reseed(seed); 4764 let res = void 0; 4765 while (!(res = pred(gen()))) reseed(); 4766 reset(); 4767 return res; 4768 }; 4769 return genUntil; 4770} 4771var validatorFns = { 4772 bigint: (val) => typeof val === "bigint", 4773 function: (val) => typeof val === "function", 4774 boolean: (val) => typeof val === "boolean", 4775 string: (val) => typeof val === "string", 4776 stringOrUint8Array: (val) => typeof val === "string" || val instanceof Uint8Array, 4777 isSafeInteger: (val) => Number.isSafeInteger(val), 4778 array: (val) => Array.isArray(val), 4779 field: (val, object) => object.Fp.isValid(val), 4780 hash: (val) => typeof val === "function" && Number.isSafeInteger(val.outputLen) 4781}; 4782function validateObject(object, validators, optValidators = {}) { 4783 const checkField = (fieldName, type, isOptional) => { 4784 const checkVal = validatorFns[type]; 4785 if (typeof checkVal !== "function") throw new Error(`Invalid validator "${type}", expected function`); 4786 const val = object[fieldName]; 4787 if (isOptional && val === void 0) return; 4788 if (!checkVal(val, object)) throw new Error(`Invalid param ${String(fieldName)}=${val} (${typeof val}), expected ${type}`); 4789 }; 4790 for (const [fieldName, type] of Object.entries(validators)) checkField(fieldName, type, false); 4791 for (const [fieldName, type] of Object.entries(optValidators)) checkField(fieldName, type, true); 4792 return object; 4793} 4794//#endregion 4795//#region node_modules/@noble/curves/esm/abstract/modular.js 4796/*! noble-curves - MIT License (c) 2022 Paul Miller (paulmillr.com) */ 4797var _0n$2 = BigInt(0); 4798var _1n$3 = BigInt(1); 4799var _2n$1 = BigInt(2); 4800var _3n$1 = BigInt(3); 4801var _4n = BigInt(4); 4802var _5n = BigInt(5); 4803var _8n = BigInt(8); 4804var _9n = BigInt(9); 4805var _16n = BigInt(16); 4806function mod(a, b) { 4807 const result = a % b; 4808 return result >= _0n$2 ? result : b + result; 4809} 4810/** 4811* Efficiently raise num to power and do modular division. 4812* Unsafe in some contexts: uses ladder, so can expose bigint bits. 4813* @example 4814* pow(2n, 6n, 11n) // 64n % 11n == 9n 4815*/ 4816function pow(num, power, modulo) { 4817 if (modulo <= _0n$2 || power < _0n$2) throw new Error("Expected power/modulo > 0"); 4818 if (modulo === _1n$3) return _0n$2; 4819 let res = _1n$3; 4820 while (power > _0n$2) { 4821 if (power & _1n$3) res = res * num % modulo; 4822 num = num * num % modulo; 4823 power >>= _1n$3; 4824 } 4825 return res; 4826} 4827function pow2(x, power, modulo) { 4828 let res = x; 4829 while (power-- > _0n$2) { 4830 res *= res; 4831 res %= modulo; 4832 } 4833 return res; 4834} 4835function invert(number, modulo) { 4836 if (number === _0n$2 || modulo <= _0n$2) throw new Error(`invert: expected positive integers, got n=${number} mod=${modulo}`); 4837 let a = mod(number, modulo); 4838 let b = modulo; 4839 let x = _0n$2, y = _1n$3, u = _1n$3, v = _0n$2; 4840 while (a !== _0n$2) { 4841 const q = b / a; 4842 const r = b % a; 4843 const m = x - u * q; 4844 const n = y - v * q; 4845 b = a, a = r, x = u, y = v, u = m, v = n; 4846 } 4847 if (b !== _1n$3) throw new Error("invert: does not exist"); 4848 return mod(x, modulo); 4849} 4850/** 4851* Tonelli-Shanks square root search algorithm. 4852* 1. https://eprint.iacr.org/2012/685.pdf (page 12) 4853* 2. Square Roots from 1; 24, 51, 10 to Dan Shanks 4854* Will start an infinite loop if field order P is not prime. 4855* @param P field order 4856* @returns function that takes field Fp (created from P) and number n 4857*/ 4858function tonelliShanks(P) { 4859 const legendreC = (P - _1n$3) / _2n$1; 4860 let Q, S, Z; 4861 for (Q = P - _1n$3, S = 0; Q % _2n$1 === _0n$2; Q /= _2n$1, S++); 4862 for (Z = _2n$1; Z < P && pow(Z, legendreC, P) !== P - _1n$3; Z++); 4863 if (S === 1) { 4864 const p1div4 = (P + _1n$3) / _4n; 4865 return function tonelliFast(Fp, n) { 4866 const root = Fp.pow(n, p1div4); 4867 if (!Fp.eql(Fp.sqr(root), n)) throw new Error("Cannot find square root"); 4868 return root; 4869 }; 4870 } 4871 const Q1div2 = (Q + _1n$3) / _2n$1; 4872 return function tonelliSlow(Fp, n) { 4873 if (Fp.pow(n, legendreC) === Fp.neg(Fp.ONE)) throw new Error("Cannot find square root"); 4874 let r = S; 4875 let g = Fp.pow(Fp.mul(Fp.ONE, Z), Q); 4876 let x = Fp.pow(n, Q1div2); 4877 let b = Fp.pow(n, Q); 4878 while (!Fp.eql(b, Fp.ONE)) { 4879 if (Fp.eql(b, Fp.ZERO)) return Fp.ZERO; 4880 let m = 1; 4881 for (let t2 = Fp.sqr(b); m < r; m++) { 4882 if (Fp.eql(t2, Fp.ONE)) break; 4883 t2 = Fp.sqr(t2); 4884 } 4885 const ge = Fp.pow(g, _1n$3 << BigInt(r - m - 1)); 4886 g = Fp.sqr(ge); 4887 x = Fp.mul(x, ge); 4888 b = Fp.mul(b, g); 4889 r = m; 4890 } 4891 return x; 4892 }; 4893} 4894function FpSqrt(P) { 4895 if (P % _4n === _3n$1) { 4896 const p1div4 = (P + _1n$3) / _4n; 4897 return function sqrt3mod4(Fp, n) { 4898 const root = Fp.pow(n, p1div4); 4899 if (!Fp.eql(Fp.sqr(root), n)) throw new Error("Cannot find square root"); 4900 return root; 4901 }; 4902 } 4903 if (P % _8n === _5n) { 4904 const c1 = (P - _5n) / _8n; 4905 return function sqrt5mod8(Fp, n) { 4906 const n2 = Fp.mul(n, _2n$1); 4907 const v = Fp.pow(n2, c1); 4908 const nv = Fp.mul(n, v); 4909 const i = Fp.mul(Fp.mul(nv, _2n$1), v); 4910 const root = Fp.mul(nv, Fp.sub(i, Fp.ONE)); 4911 if (!Fp.eql(Fp.sqr(root), n)) throw new Error("Cannot find square root"); 4912 return root; 4913 }; 4914 } 4915 if (P % _16n === _9n) {} 4916 return tonelliShanks(P); 4917} 4918var FIELD_FIELDS = [ 4919 "create", 4920 "isValid", 4921 "is0", 4922 "neg", 4923 "inv", 4924 "sqrt", 4925 "sqr", 4926 "eql", 4927 "add", 4928 "sub", 4929 "mul", 4930 "pow", 4931 "div", 4932 "addN", 4933 "subN", 4934 "mulN", 4935 "sqrN" 4936]; 4937function validateField(field) { 4938 return validateObject(field, FIELD_FIELDS.reduce((map, val) => { 4939 map[val] = "function"; 4940 return map; 4941 }, { 4942 ORDER: "bigint", 4943 MASK: "bigint", 4944 BYTES: "isSafeInteger", 4945 BITS: "isSafeInteger" 4946 })); 4947} 4948/** 4949* Same as `pow` but for Fp: non-constant-time. 4950* Unsafe in some contexts: uses ladder, so can expose bigint bits. 4951*/ 4952function FpPow(f, num, power) { 4953 if (power < _0n$2) throw new Error("Expected power > 0"); 4954 if (power === _0n$2) return f.ONE; 4955 if (power === _1n$3) return num; 4956 let p = f.ONE; 4957 let d = num; 4958 while (power > _0n$2) { 4959 if (power & _1n$3) p = f.mul(p, d); 4960 d = f.sqr(d); 4961 power >>= _1n$3; 4962 } 4963 return p; 4964} 4965/** 4966* Efficiently invert an array of Field elements. 4967* `inv(0)` will return `undefined` here: make sure to throw an error. 4968*/ 4969function FpInvertBatch(f, nums) { 4970 const tmp = new Array(nums.length); 4971 const lastMultiplied = nums.reduce((acc, num, i) => { 4972 if (f.is0(num)) return acc; 4973 tmp[i] = acc; 4974 return f.mul(acc, num); 4975 }, f.ONE); 4976 const inverted = f.inv(lastMultiplied); 4977 nums.reduceRight((acc, num, i) => { 4978 if (f.is0(num)) return acc; 4979 tmp[i] = f.mul(acc, tmp[i]); 4980 return f.mul(acc, num); 4981 }, inverted); 4982 return tmp; 4983} 4984function nLength(n, nBitLength) { 4985 const _nBitLength = nBitLength !== void 0 ? nBitLength : n.toString(2).length; 4986 return { 4987 nBitLength: _nBitLength, 4988 nByteLength: Math.ceil(_nBitLength / 8) 4989 }; 4990} 4991/** 4992* Initializes a finite field over prime. **Non-primes are not supported.** 4993* Do not init in loop: slow. Very fragile: always run a benchmark on a change. 4994* Major performance optimizations: 4995* * a) denormalized operations like mulN instead of mul 4996* * b) same object shape: never add or remove keys 4997* * c) Object.freeze 4998* @param ORDER prime positive bigint 4999* @param bitLen how many bits the field consumes 5000* @param isLE (def: false) if encoding / decoding should be in little-endian 5001* @param redef optional faster redefinitions of sqrt and other methods 5002*/ 5003function Field(ORDER, bitLen, isLE = false, redef = {}) { 5004 if (ORDER <= _0n$2) throw new Error(`Expected Field ORDER > 0, got ${ORDER}`); 5005 const { nBitLength: BITS, nByteLength: BYTES } = nLength(ORDER, bitLen); 5006 if (BYTES > 2048) throw new Error("Field lengths over 2048 bytes are not supported"); 5007 const sqrtP = FpSqrt(ORDER); 5008 const f = Object.freeze({ 5009 ORDER, 5010 BITS, 5011 BYTES, 5012 MASK: bitMask(BITS), 5013 ZERO: _0n$2, 5014 ONE: _1n$3, 5015 create: (num) => mod(num, ORDER), 5016 isValid: (num) => { 5017 if (typeof num !== "bigint") throw new Error(`Invalid field element: expected bigint, got ${typeof num}`); 5018 return _0n$2 <= num && num < ORDER; 5019 }, 5020 is0: (num) => num === _0n$2, 5021 isOdd: (num) => (num & _1n$3) === _1n$3, 5022 neg: (num) => mod(-num, ORDER), 5023 eql: (lhs, rhs) => lhs === rhs, 5024 sqr: (num) => mod(num * num, ORDER), 5025 add: (lhs, rhs) => mod(lhs + rhs, ORDER), 5026 sub: (lhs, rhs) => mod(lhs - rhs, ORDER), 5027 mul: (lhs, rhs) => mod(lhs * rhs, ORDER), 5028 pow: (num, power) => FpPow(f, num, power), 5029 div: (lhs, rhs) => mod(lhs * invert(rhs, ORDER), ORDER), 5030 sqrN: (num) => num * num, 5031 addN: (lhs, rhs) => lhs + rhs, 5032 subN: (lhs, rhs) => lhs - rhs, 5033 mulN: (lhs, rhs) => lhs * rhs, 5034 inv: (num) => invert(num, ORDER), 5035 sqrt: redef.sqrt || ((n) => sqrtP(f, n)), 5036 invertBatch: (lst) => FpInvertBatch(f, lst), 5037 cmov: (a, b, c) => c ? b : a, 5038 toBytes: (num) => isLE ? numberToBytesLE(num, BYTES) : numberToBytesBE(num, BYTES), 5039 fromBytes: (bytes) => { 5040 if (bytes.length !== BYTES) throw new Error(`Fp.fromBytes: expected ${BYTES}, got ${bytes.length}`); 5041 return isLE ? bytesToNumberLE(bytes) : bytesToNumberBE(bytes); 5042 } 5043 }); 5044 return Object.freeze(f); 5045} 5046/** 5047* Returns total number of bytes consumed by the field element. 5048* For example, 32 bytes for usual 256-bit weierstrass curve. 5049* @param fieldOrder number of field elements, usually CURVE.n 5050* @returns byte length of field 5051*/ 5052function getFieldBytesLength(fieldOrder) { 5053 if (typeof fieldOrder !== "bigint") throw new Error("field order must be bigint"); 5054 const bitLength = fieldOrder.toString(2).length; 5055 return Math.ceil(bitLength / 8); 5056} 5057/** 5058* Returns minimal amount of bytes that can be safely reduced 5059* by field order.
5060* Should be 2^-128 for 128-bit curve such as P256. 5061* @param fieldOrder number of field elements, usually CURVE.n 5062* @returns byte length of target hash 5063*/ 5064function getMinHashLength(fieldOrder) { 5065 const length = getFieldBytesLength(fieldOrder); 5066 return length + Math.ceil(length / 2); 5067} 5068/** 5069* "Constant-time" private key generation utility. 5070* Can take (n + n/2) or more bytes of uniform input e.g. from CSPRNG or KDF 5071* and convert them into private scalar, with the modulo bias being negligible. 5072* Needs at least 48 bytes of input for 32-byte private key. 5073* https://research.kudelskisecurity.com/2020/07/28/the-definitive-guide-to-modulo-bias-and-how-to-avoid-it/ 5074* FIPS 186-5, A.2 https://csrc.nist.gov/publications/detail/fips/186/5/final 5075* RFC 9380, https://www.rfc-editor.org/rfc/rfc9380#section-5 5076* @param hash hash output from SHA3 or a similar function 5077* @param groupOrder size of subgroup - (e.g. secp256k1.CURVE.n) 5078* @param isLE interpret hash bytes as LE num 5079* @returns valid private scalar 5080*/ 5081function mapHashToField(key, fieldOrder, isLE = false) { 5082 const len = key.length; 5083 const fieldLen = getFieldBytesLength(fieldOrder); 5084 const minLen = getMinHashLength(fieldOrder); 5085 if (len < 16 || len < minLen || len > 1024) throw new Error(`expected ${minLen}-1024 bytes of input, got ${len}`); 5086 const reduced = mod(isLE ? bytesToNumberBE(key) : bytesToNumberLE(key), fieldOrder - _1n$3) + _1n$3; 5087 return isLE ? numberToBytesLE(reduced, fieldLen) : numberToBytesBE(reduced, fieldLen); 5088} 5089//#endregion 5090//#region node_modules/@noble/curves/esm/abstract/curve.js 5091/*! noble-curves - MIT License (c) 2022 Paul Miller (paulmillr.com) */ 5092var _0n$1 = BigInt(0); 5093var _1n$2 = BigInt(1); 5094function wNAF(c, bits) { 5095 const constTimeNegate = (condition, item) => { 5096 const neg = item.negate(); 5097 return condition ? neg : item; 5098 }; 5099 const opts = (W) => { 5100 return { 5101 windows: Math.ceil(bits / W) + 1, 5102 windowSize: 2 ** (W - 1) 5103 }; 5104 }; 5105 return { 5106 constTimeNegate, 5107 unsafeLadder(elm, n) { 5108 let p = c.ZERO; 5109 let d = elm; 5110 while (n > _0n$1) { 5111 if (n & _1n$2) p = p.add(d); 5112 d = d.double(); 5113 n >>= _1n$2; 5114 } 5115 return p; 5116 }, 5117 /** 5118 * Creates a wNAF precomputation window. Used for caching. 5119 * Default window size is set by `utils.precompute()` and is equal to 8. 5120 * Number of precomputed points depends on the curve size: 5121 * 2^(ðâ1) * (Math.ceil(ð / ð) + 1), where: 5122 * - ð is the window size 5123 * - ð is the bitlength of the curve order. 5124 * For a 256-bit curve and window size 8, the number of precomputed points is 128 * 33 = 4224. 5125 * @returns precomputed point tables flattened to a single array 5126 */ 5127 precomputeWindow(elm, W) { 5128 const { windows, windowSize } = opts(W); 5129 const points = []; 5130 let p = elm; 5131 let base = p; 5132 for (let window = 0; window < windows; window++) { 5133 base = p; 5134 points.push(base); 5135 for (let i = 1; i < windowSize; i++) { 5136 base = base.add(p); 5137 points.push(base); 5138 } 5139 p = base.double(); 5140 } 5141 return points; 5142 }, 5143 /** 5144 * Implements ec multiplication using precomputed tables and w-ary non-adjacent form. 5145 * @param W window size 5146 * @param precomputes precomputed tables 5147 * @param n scalar (we don't check here, but should be less than curve order) 5148 * @returns real and fake (for const-time) points 5149 */ 5150 wNAF(W, precomputes, n) { 5151 const { windows, windowSize } = opts(W); 5152 let p = c.ZERO; 5153 let f = c.BASE; 5154 const mask = BigInt(2 ** W - 1); 5155 const maxNumber = 2 ** W; 5156 const shiftBy = BigInt(W); 5157 for (let window = 0; window < windows; window++) { 5158 const offset = window * windowSize; 5159 let wbits = Number(n & mask); 5160 n >>= shiftBy; 5161 if (wbits > windowSize) { 5162 wbits -= maxNumber; 5163 n += _1n$2; 5164 } 5165 const offset1 = offset; 5166 const offset2 = offset + Math.abs(wbits) - 1; 5167 const cond1 = window % 2 !== 0; 5168 const cond2 = wbits < 0; 5169 if (wbits === 0) f = f.add(constTimeNegate(cond1, precomputes[offset1])); 5170 else p = p.add(constTimeNegate(cond2, precomputes[offset2])); 5171 } 5172 return { 5173 p, 5174 f 5175 }; 5176 }, 5177 wNAFCached(P, precomputesMap, n, transform) { 5178 const W = P._WINDOW_SIZE || 1; 5179 let comp = precomputesMap.get(P); 5180 if (!comp) {
5181 comp = this.precomputeWindow(P, W); 5182 if (W !== 1) precomputesMap.set(P, transform(comp)); 5183 } 5184 return this.wNAF(W, comp, n); 5185 } 5186 }; 5187} 5188function validateBasic(curve) { 5189 validateField(curve.Fp); 5190 validateObject(curve, { 5191 n: "bigint", 5192 h: "bigint", 5193 Gx: "field", 5194 Gy: "field" 5195 }, { 5196 nBitLength: "isSafeInteger", 5197 nByteLength: "isSafeInteger" 5198 }); 5199 return Object.freeze({ 5200 ...nLength(curve.n, curve.nBitLength), 5201 ...curve, 5202 p: curve.Fp.ORDER 5203 }); 5204} 5205//#endregion 5206//#region node_modules/@noble/curves/esm/abstract/weierstrass.js 5207/*! noble-curves - MIT License (c) 2022 Paul Miller (paulmillr.com) */ 5208function validatePointOpts(curve) { 5209 const opts = validateBasic(curve); 5210 validateObject(opts, { 5211 a: "field", 5212 b: "field" 5213 }, { 5214 allowedPrivateKeyLengths: "array", 5215 wrapPrivateKey: "boolean", 5216 isTorsionFree: "function", 5217 clearCofactor: "function", 5218 allowInfinityPoint: "boolean", 5219 fromBytes: "function", 5220 toBytes: "function" 5221 }); 5222 const { endo, Fp, a } = opts; 5223 if (endo) { 5224 if (!Fp.eql(a, Fp.ZERO)) throw new Error("Endomorphism can only be defined for Koblitz curves that have a=0"); 5225 if (typeof endo !== "object" || typeof endo.beta !== "bigint" || typeof endo.splitScalar !== "function") throw new Error("Expected endomorphism with beta: bigint and splitScalar: function"); 5226 } 5227 return Object.freeze({ ...opts }); 5228} 5229var { bytesToNumberBE: b2n, hexToBytes: h2b } = utils_exports; 5230var DER = { 5231 Err: class DERErr extends Error { 5232 constructor(m = "") { 5233 super(m); 5234 } 5235 }, 5236 _parseInt(data) { 5237 const { Err: E } = DER; 5238 if (data.length < 2 || data[0] !== 2) throw new E("Invalid signature integer tag");
vendor: 14,427 bytes, lines 5239-5698
5239 const len = data[1]; 5240 const res = data.subarray(2, len + 2); 5241 if (!len || res.length !== len) throw new E("Invalid signature integer: wrong length"); 5242 if (res[0] & 128) throw new E("Invalid signature integer: negative"); 5243 if (res[0] === 0 && !(res[1] & 128)) throw new E("Invalid signature integer: unnecessary leading zero"); 5244 return { 5245 d: b2n(res), 5246 l: data.subarray(len + 2) 5247 }; 5248 }, 5249 toSig(hex) { 5250 const { Err: E } = DER; 5251 const data = typeof hex === "string" ? h2b(hex) : hex; 5252 if (!(data instanceof Uint8Array)) throw new Error("ui8a expected"); 5253 let l = data.length; 5254 if (l < 2 || data[0] != 48) throw new E("Invalid signature tag"); 5255 if (data[1] !== l - 2) throw new E("Invalid signature: incorrect length"); 5256 const { d: r, l: sBytes } = DER._parseInt(data.subarray(2)); 5257 const { d: s, l: rBytesLeft } = DER._parseInt(sBytes); 5258 if (rBytesLeft.length) throw new E("Invalid signature: left bytes after parsing"); 5259 return { 5260 r, 5261 s 5262 }; 5263 }, 5264 hexFromSig(sig) { 5265 const slice = (s) => Number.parseInt(s[0], 16) & 8 ? "00" + s : s; 5266 const h = (num) => { 5267 const hex = num.toString(16); 5268 return hex.length & 1 ? `0${hex}` : hex; 5269 }; 5270 const s = slice(h(sig.s)); 5271 const r = slice(h(sig.r)); 5272 const shl = s.length / 2; 5273 const rhl = r.length / 2; 5274 const sl = h(shl); 5275 const rl = h(rhl); 5276 return `30${h(rhl + shl + 4)}02${rl}${r}02${sl}${s}`; 5277 } 5278}; 5279var _0n = BigInt(0); 5280var _1n$1 = BigInt(1); 5281var _3n = BigInt(3); 5282function weierstrassPoints(opts) { 5283 const CURVE = validatePointOpts(opts); 5284 const { Fp } = CURVE; 5285 const toBytes = CURVE.toBytes || ((_c, point, _isCompressed) => { 5286 const a = point.toAffine(); 5287 return concatBytes(Uint8Array.from([4]), Fp.toBytes(a.x), Fp.toBytes(a.y)); 5288 }); 5289 const fromBytes = CURVE.fromBytes || ((bytes) => { 5290 const tail = bytes.subarray(1); 5291 return { 5292 x: Fp.fromBytes(tail.subarray(0, Fp.BYTES)), 5293 y: Fp.fromBytes(tail.subarray(Fp.BYTES, 2 * Fp.BYTES)) 5294 }; 5295 }); 5296 /** 5297 * y² = x³ + ax + b: Short weierstrass curve formula 5298 * @returns y² 5299 */ 5300 function weierstrassEquation(x) { 5301 const { a, b } = CURVE; 5302 const x2 = Fp.sqr(x); 5303 const x3 = Fp.mul(x2, x); 5304 return Fp.add(Fp.add(x3, Fp.mul(x, a)), b); 5305 } 5306 if (!Fp.eql(Fp.sqr(CURVE.Gy), weierstrassEquation(CURVE.Gx))) throw new Error("bad generator point: equation left != right"); 5307 function isWithinCurveOrder(num) { 5308 return typeof num === "bigint" && _0n < num && num < CURVE.n; 5309 } 5310 function assertGE(num) { 5311 if (!isWithinCurveOrder(num)) throw new Error("Expected valid bigint: 0 < bigint < curve.n"); 5312 } 5313 function normPrivateKeyToScalar(key) { 5314 const { allowedPrivateKeyLengths: lengths, nByteLength, wrapPrivateKey, n } = CURVE; 5315 if (lengths && typeof key !== "bigint") { 5316 if (key instanceof Uint8Array) key = bytesToHex(key); 5317 if (typeof key !== "string" || !lengths.includes(key.length)) throw new Error("Invalid key"); 5318 key = key.padStart(nByteLength * 2, "0"); 5319 } 5320 let num; 5321 try { 5322 num = typeof key === "bigint" ? key : bytesToNumberBE(ensureBytes("private key", key, nByteLength)); 5323 } catch (error) { 5324 throw new Error(`private key must be ${nByteLength} bytes, hex or bigint, not ${typeof key}`); 5325 } 5326 if (wrapPrivateKey) num = mod(num, n); 5327 assertGE(num); 5328 return num; 5329 } 5330 const pointPrecomputes = /* @__PURE__ */ new Map(); 5331 function assertPrjPoint(other) { 5332 if (!(other instanceof Point)) throw new Error("ProjectivePoint expected"); 5333 } 5334 /** 5335 * Projective Point works in 3d / projective (homogeneous) coordinates: (x, y, z) â (x=x/z, y=y/z) 5336 * Default Point works in 2d / affine coordinates: (x, y) 5337 * We're doing calculations in projective, because its operations don't require costly inversion. 5338 */ 5339 class Point { 5340 constructor(px, py, pz) { 5341 this.px = px; 5342 this.py = py; 5343 this.pz = pz; 5344 if (px == null || !Fp.isValid(px)) throw new Error("x required"); 5345 if (py == null || !Fp.isValid(py)) throw new Error("y required"); 5346 if (pz == null || !Fp.isValid(pz)) throw new Error("z required"); 5347 } 5348 static fromAffine(p) { 5349 const { x, y } = p || {}; 5350 if (!p || !Fp.isValid(x) || !Fp.isValid(y)) throw new Error("invalid affine point"); 5351 if (p instanceof Point) throw new Error("projective point not allowed"); 5352 const is0 = (i) => Fp.eql(i, Fp.ZERO); 5353 if (is0(x) && is0(y)) return Point.ZERO; 5354 return new Point(x, y, Fp.ONE); 5355 } 5356 get x() { 5357 return this.toAffine().x; 5358 } 5359 get y() { 5360 return this.toAffine().y; 5361 } 5362 /** 5363 * Takes a bunch of Projective Points but executes only one 5364 * inversion on all of them. Inversion is very slow operation, 5365 * so this improves performance massively. 5366 * Optimization: converts a list of projective points to a list of identical points with Z=1. 5367 */ 5368 static normalizeZ(points) { 5369 const toInv = Fp.invertBatch(points.map((p) => p.pz)); 5370 return points.map((p, i) => p.toAffine(toInv[i])).map(Point.fromAffine); 5371 } 5372 /** 5373 * Converts hash string or Uint8Array to Point. 5374 * @param hex short/long ECDSA hex 5375 */ 5376 static fromHex(hex) { 5377 const P = Point.fromAffine(fromBytes(ensureBytes("pointHex", hex))); 5378 P.assertValidity(); 5379 return P; 5380 } 5381 static fromPrivateKey(privateKey) { 5382 return Point.BASE.multiply(normPrivateKeyToScalar(privateKey)); 5383 } 5384 _setWindowSize(windowSize) { 5385 this._WINDOW_SIZE = windowSize; 5386 pointPrecomputes.delete(this); 5387 } 5388 assertValidity() { 5389 if (this.is0()) { 5390 if (CURVE.allowInfinityPoint && !Fp.is0(this.py)) return; 5391 throw new Error("bad point: ZERO"); 5392 } 5393 const { x, y } = this.toAffine(); 5394 if (!Fp.isValid(x) || !Fp.isValid(y)) throw new Error("bad point: x or y not FE"); 5395 const left = Fp.sqr(y); 5396 const right = weierstrassEquation(x); 5397 if (!Fp.eql(left, right)) throw new Error("bad point: equation left != right"); 5398 if (!this.isTorsionFree()) throw new Error("bad point: not in prime-order subgroup"); 5399 } 5400 hasEvenY() { 5401 const { y } = this.toAffine(); 5402 if (Fp.isOdd) return !Fp.isOdd(y); 5403 throw new Error("Field doesn't support isOdd"); 5404 } 5405 /** 5406 * Compare one point to another. 5407 */ 5408 equals(other) { 5409 assertPrjPoint(other); 5410 const { px: X1, py: Y1, pz: Z1 } = this; 5411 const { px: X2, py: Y2, pz: Z2 } = other; 5412 const U1 = Fp.eql(Fp.mul(X1, Z2), Fp.mul(X2, Z1)); 5413 const U2 = Fp.eql(Fp.mul(Y1, Z2), Fp.mul(Y2, Z1)); 5414 return U1 && U2; 5415 } 5416 /** 5417 * Flips point to one corresponding to (x, -y) in Affine coordinates. 5418 */ 5419 negate() { 5420 return new Point(this.px, Fp.neg(this.py), this.pz); 5421 } 5422 double() { 5423 const { a, b } = CURVE; 5424 const b3 = Fp.mul(b, _3n); 5425 const { px: X1, py: Y1, pz: Z1 } = this; 5426 let X3 = Fp.ZERO, Y3 = Fp.ZERO, Z3 = Fp.ZERO; 5427 let t0 = Fp.mul(X1, X1); 5428 let t1 = Fp.mul(Y1, Y1); 5429 let t2 = Fp.mul(Z1, Z1); 5430 let t3 = Fp.mul(X1, Y1); 5431 t3 = Fp.add(t3, t3); 5432 Z3 = Fp.mul(X1, Z1); 5433 Z3 = Fp.add(Z3, Z3); 5434 X3 = Fp.mul(a, Z3); 5435 Y3 = Fp.mul(b3, t2); 5436 Y3 = Fp.add(X3, Y3); 5437 X3 = Fp.sub(t1, Y3); 5438 Y3 = Fp.add(t1, Y3); 5439 Y3 = Fp.mul(X3, Y3); 5440 X3 = Fp.mul(t3, X3); 5441 Z3 = Fp.mul(b3, Z3); 5442 t2 = Fp.mul(a, t2); 5443 t3 = Fp.sub(t0, t2); 5444 t3 = Fp.mul(a, t3); 5445 t3 = Fp.add(t3, Z3); 5446 Z3 = Fp.add(t0, t0); 5447 t0 = Fp.add(Z3, t0); 5448 t0 = Fp.add(t0, t2); 5449 t0 = Fp.mul(t0, t3); 5450 Y3 = Fp.add(Y3, t0); 5451 t2 = Fp.mul(Y1, Z1); 5452 t2 = Fp.add(t2, t2); 5453 t0 = Fp.mul(t2, t3); 5454 X3 = Fp.sub(X3, t0); 5455 Z3 = Fp.mul(t2, t1); 5456 Z3 = Fp.add(Z3, Z3); 5457 Z3 = Fp.add(Z3, Z3); 5458 return new Point(X3, Y3, Z3); 5459 } 5460 add(other) { 5461 assertPrjPoint(other); 5462 const { px: X1, py: Y1, pz: Z1 } = this; 5463 const { px: X2, py: Y2, pz: Z2 } = other; 5464 let X3 = Fp.ZERO, Y3 = Fp.ZERO, Z3 = Fp.ZERO; 5465 const a = CURVE.a; 5466 const b3 = Fp.mul(CURVE.b, _3n); 5467 let t0 = Fp.mul(X1, X2); 5468 let t1 = Fp.mul(Y1, Y2); 5469 let t2 = Fp.mul(Z1, Z2); 5470 let t3 = Fp.add(X1, Y1); 5471 let t4 = Fp.add(X2, Y2); 5472 t3 = Fp.mul(t3, t4); 5473 t4 = Fp.add(t0, t1); 5474 t3 = Fp.sub(t3, t4); 5475 t4 = Fp.add(X1, Z1); 5476 let t5 = Fp.add(X2, Z2); 5477 t4 = Fp.mul(t4, t5); 5478 t5 = Fp.add(t0, t2); 5479 t4 = Fp.sub(t4, t5); 5480 t5 = Fp.add(Y1, Z1); 5481 X3 = Fp.add(Y2, Z2); 5482 t5 = Fp.mul(t5, X3); 5483 X3 = Fp.add(t1, t2); 5484 t5 = Fp.sub(t5, X3); 5485 Z3 = Fp.mul(a, t4); 5486 X3 = Fp.mul(b3, t2); 5487 Z3 = Fp.add(X3, Z3); 5488 X3 = Fp.sub(t1, Z3); 5489 Z3 = Fp.add(t1, Z3); 5490 Y3 = Fp.mul(X3, Z3); 5491 t1 = Fp.add(t0, t0); 5492 t1 = Fp.add(t1, t0); 5493 t2 = Fp.mul(a, t2); 5494 t4 = Fp.mul(b3, t4); 5495 t1 = Fp.add(t1, t2); 5496 t2 = Fp.sub(t0, t2); 5497 t2 = Fp.mul(a, t2); 5498 t4 = Fp.add(t4, t2); 5499 t0 = Fp.mul(t1, t4); 5500 Y3 = Fp.add(Y3, t0); 5501 t0 = Fp.mul(t5, t4); 5502 X3 = Fp.mul(t3, X3); 5503 X3 = Fp.sub(X3, t0); 5504 t0 = Fp.mul(t3, t1); 5505 Z3 = Fp.mul(t5, Z3); 5506 Z3 = Fp.add(Z3, t0); 5507 return new Point(X3, Y3, Z3); 5508 } 5509 subtract(other) { 5510 return this.add(other.negate()); 5511 } 5512 is0() { 5513 return this.equals(Point.ZERO); 5514 } 5515 wNAF(n) { 5516 return wnaf.wNAFCached(this, pointPrecomputes, n, (comp) => { 5517 const toInv = Fp.invertBatch(comp.map((p) => p.pz)); 5518 return comp.map((p, i) => p.toAffine(toInv[i])).map(Point.fromAffine); 5519 }); 5520 } 5521 /** 5522 * Non-constant-time multiplication. Uses double-and-add algorithm. 5523 * It's faster, but should only be used when you don't care about 5524 * an exposed private key e.g. sig verification, which works over *public* keys. 5525 */ 5526 multiplyUnsafe(n) { 5527 const I = Point.ZERO; 5528 if (n === _0n) return I; 5529 assertGE(n); 5530 if (n === _1n$1) return this; 5531 const { endo } = CURVE; 5532 if (!endo) return wnaf.unsafeLadder(this, n); 5533 let { k1neg, k1, k2neg, k2 } = endo.splitScalar(n); 5534 let k1p = I; 5535 let k2p = I; 5536 let d = this; 5537 while (k1 > _0n || k2 > _0n) { 5538 if (k1 & _1n$1) k1p = k1p.add(d); 5539 if (k2 & _1n$1) k2p = k2p.add(d); 5540 d = d.double(); 5541 k1 >>= _1n$1; 5542 k2 >>= _1n$1; 5543 } 5544 if (k1neg) k1p = k1p.negate(); 5545 if (k2neg) k2p = k2p.negate(); 5546 k2p = new Point(Fp.mul(k2p.px, endo.beta), k2p.py, k2p.pz); 5547 return k1p.add(k2p); 5548 } 5549 /** 5550 * Constant time multiplication. 5551 * Uses wNAF method. Windowed method may be 10% faster, 5552 * but takes 2x longer to generate and consumes 2x memory. 5553 * Uses precomputes when available. 5554 * Uses endomorphism for Koblitz curves. 5555 * @param scalar by which the point would be multiplied 5556 * @returns New point 5557 */ 5558 multiply(scalar) { 5559 assertGE(scalar); 5560 let n = scalar; 5561 let point, fake; 5562 const { endo } = CURVE; 5563 if (endo) { 5564 const { k1neg, k1, k2neg, k2 } = endo.splitScalar(n); 5565 let { p: k1p, f: f1p } = this.wNAF(k1); 5566 let { p: k2p, f: f2p } = this.wNAF(k2); 5567 k1p = wnaf.constTimeNegate(k1neg, k1p); 5568 k2p = wnaf.constTimeNegate(k2neg, k2p); 5569 k2p = new Point(Fp.mul(k2p.px, endo.beta), k2p.py, k2p.pz); 5570 point = k1p.add(k2p); 5571 fake = f1p.add(f2p); 5572 } else { 5573 const { p, f } = this.wNAF(n); 5574 point = p; 5575 fake = f; 5576 } 5577 return Point.normalizeZ([point, fake])[0]; 5578 } 5579 /** 5580 * Efficiently calculate `aP + bQ`. Unsafe, can expose private key, if used incorrectly. 5581 * Not using Strauss-Shamir trick: precomputation tables are faster. 5582 * The trick could be useful if both P and Q are not G (not in our case). 5583 * @returns non-zero affine point 5584 */ 5585 multiplyAndAddUnsafe(Q, a, b) { 5586 const G = Point.BASE; 5587 const mul = (P, a) => a === _0n || a === _1n$1 || !P.equals(G) ? P.multiplyUnsafe(a) : P.multiply(a); 5588 const sum = mul(this, a).add(mul(Q, b)); 5589 return sum.is0() ? void 0 : sum; 5590 } 5591 toAffine(iz) { 5592 const { px: x, py: y, pz: z } = this; 5593 const is0 = this.is0(); 5594 if (iz == null) iz = is0 ? Fp.ONE : Fp.inv(z); 5595 const ax = Fp.mul(x, iz); 5596 const ay = Fp.mul(y, iz); 5597 const zz = Fp.mul(z, iz); 5598 if (is0) return { 5599 x: Fp.ZERO, 5600 y: Fp.ZERO 5601 }; 5602 if (!Fp.eql(zz, Fp.ONE)) throw new Error("invZ was invalid"); 5603 return { 5604 x: ax, 5605 y: ay 5606 }; 5607 } 5608 isTorsionFree() { 5609 const { h: cofactor, isTorsionFree } = CURVE; 5610 if (cofactor === _1n$1) return true; 5611 if (isTorsionFree) return isTorsionFree(Point, this); 5612 throw new Error("isTorsionFree() has not been declared for the elliptic curve"); 5613 } 5614 clearCofactor() { 5615 const { h: cofactor, clearCofactor } = CURVE; 5616 if (cofactor === _1n$1) return this; 5617 if (clearCofactor) return clearCofactor(Point, this); 5618 return this.multiplyUnsafe(CURVE.h); 5619 } 5620 toRawBytes(isCompressed = true) { 5621 this.assertValidity(); 5622 return toBytes(Point, this, isCompressed); 5623 } 5624 toHex(isCompressed = true) { 5625 return bytesToHex(this.toRawBytes(isCompressed)); 5626 } 5627 } 5628 Point.BASE = new Point(CURVE.Gx, CURVE.Gy, Fp.ONE); 5629 Point.ZERO = new Point(Fp.ZERO, Fp.ONE, Fp.ZERO); 5630 const _bits = CURVE.nBitLength; 5631 const wnaf = wNAF(Point, CURVE.endo ? Math.ceil(_bits / 2) : _bits); 5632 return { 5633 CURVE, 5634 ProjectivePoint: Point, 5635 normPrivateKeyToScalar, 5636 weierstrassEquation, 5637 isWithinCurveOrder 5638 }; 5639} 5640function validateOpts(curve) { 5641 const opts = validateBasic(curve); 5642 validateObject(opts, { 5643 hash: "hash", 5644 hmac: "function", 5645 randomBytes: "function" 5646 }, { 5647 bits2int: "function", 5648 bits2int_modN: "function", 5649 lowS: "boolean" 5650 }); 5651 return Object.freeze({ 5652 lowS: true, 5653 ...opts 5654 }); 5655} 5656function weierstrass(curveDef) { 5657 const CURVE = validateOpts(curveDef); 5658 const { Fp, n: CURVE_ORDER } = CURVE; 5659 const compressedLen = Fp.BYTES + 1; 5660 const uncompressedLen = 2 * Fp.BYTES + 1; 5661 function isValidFieldElement(num) { 5662 return _0n < num && num < Fp.ORDER; 5663 } 5664 function modN(a) { 5665 return mod(a, CURVE_ORDER); 5666 } 5667 function invN(a) { 5668 return invert(a, CURVE_ORDER); 5669 } 5670 const { ProjectivePoint: Point, normPrivateKeyToScalar, weierstrassEquation, isWithinCurveOrder } = weierstrassPoints({ 5671 ...CURVE, 5672 toBytes(_c, point, isCompressed) { 5673 const a = point.toAffine(); 5674 const x = Fp.toBytes(a.x); 5675 const cat = concatBytes; 5676 if (isCompressed) return cat(Uint8Array.from([point.hasEvenY() ? 2 : 3]), x); 5677 else return cat(Uint8Array.from([4]), x, Fp.toBytes(a.y)); 5678 }, 5679 fromBytes(bytes) { 5680 const len = bytes.length; 5681 const head = bytes[0]; 5682 const tail = bytes.subarray(1); 5683 if (len === compressedLen && (head === 2 || head === 3)) { 5684 const x = bytesToNumberBE(tail); 5685 if (!isValidFieldElement(x)) throw new Error("Point is not on curve"); 5686 const y2 = weierstrassEquation(x); 5687 let y = Fp.sqrt(y2); 5688 const isYOdd = (y & _1n$1) === _1n$1; 5689 if ((head & 1) === 1 !== isYOdd) y = Fp.neg(y); 5690 return { 5691 x, 5692 y 5693 }; 5694 } else if (len === uncompressedLen && head === 4) return { 5695 x: Fp.fromBytes(tail.subarray(0, Fp.BYTES)), 5696 y: Fp.fromBytes(tail.subarray(Fp.BYTES, 2 * Fp.BYTES)) 5697 }; 5698 else throw new Error(`Point of length ${len}
5698 was invalid. Expected ${compressedLen} compressed bytes or ${uncompressedLen} uncompressed bytes`); 5699 } 5700 }); 5701 const numToNByteStr = (num) => bytesToHex(numberToBytesBE(num, CURVE.nByteLength)); 5702 function isBiggerThanHalfOrder(number) { 5703 return number > CURVE_ORDER >> _1n$1; 5704 } 5705 function normalizeS(s) { 5706 return isBiggerThanHalfOrder(s) ? modN(-s) : s; 5707 } 5708 const slcNum = (b, from, to) => bytesToNumberBE(b.slice(from, to)); 5709 /** 5710 * ECDSA signature with its (r, s) properties. Supports DER & compact representations. 5711 */ 5712 class Signature { 5713 constructor(r, s, recovery) { 5714 this.r = r; 5715 this.s = s; 5716 this.recovery = recovery; 5717 this.assertValidity(); 5718 } 5719 static fromCompact(hex) { 5720 const l = CURVE.nByteLength; 5721 hex = ensureBytes("compactSignature", hex, l * 2); 5722 return new Signature(slcNum(hex, 0, l), slcNum(hex, l, 2 * l)); 5723 } 5724 static fromDER(hex) { 5725 const { r, s } = DER.toSig(ensureBytes("DER", hex)); 5726 return new Signature(r, s); 5727 } 5728 assertValidity() { 5729 if (!isWithinCurveOrder(this.r)) throw new Error("r must be 0 < r < CURVE.n"); 5730 if (!isWithinCurveOrder(this.s)) throw new Error("s must be 0 < s < CURVE.n"); 5731 } 5732 addRecoveryBit(recovery) { 5733 return new Signature(this.r, this.s, recovery); 5734 } 5735 recoverPublicKey(msgHash) { 5736 const { r, s, recovery: rec } = this; 5737 const h = bits2int_modN(ensureBytes("msgHash", msgHash)); 5738 if (rec == null || ![ 5739 0, 5740 1, 5741 2, 5742 3 5743 ].includes(rec)) throw new Error("recovery id invalid"); 5744 const radj = rec === 2 || rec === 3 ? r + CURVE.n : r; 5745 if (radj >= Fp.ORDER) throw new Error("recovery id 2 or 3 invalid"); 5746 const prefix = (rec & 1) === 0 ? "02" : "03"; 5747 const R = Point.fromHex(prefix + numToNByteStr(radj)); 5748 const ir = invN(radj); 5749 const u1 = modN(-h * ir); 5750 const u2 = modN(s * ir); 5751 const Q = Point.BASE.multiplyAndAddUnsafe(R, u1, u2); 5752 if (!Q) throw new Error("point at infinify"); 5753 Q.assertValidity(); 5754 return Q; 5755 } 5756 hasHighS() { 5757 return isBiggerThanHalfOrder(this.s); 5758 } 5759 normalizeS() { 5760 return this.hasHighS() ? new Signature(this.r, modN(-this.s), this.recovery) : this; 5761 } 5762 toDERRawBytes() { 5763 return hexToBytes(this.toDERHex()); 5764 } 5765 toDERHex() { 5766 return DER.hexFromSig({ 5767 r: this.r, 5768 s: this.s 5769 }); 5770 } 5771 toCompactRawBytes() { 5772 return hexToBytes(this.toCompactHex()); 5773 } 5774 toCompactHex() { 5775 return numToNByteStr(this.r) + numToNByteStr(this.s); 5776 } 5777 } 5778 const utils = { 5779 isValidPrivateKey(privateKey) { 5780 try { 5781 normPrivateKeyToScalar(privateKey); 5782 return true; 5783 } catch (error) { 5784 return false; 5785 } 5786 }, 5787 normPrivateKeyToScalar, 5788 /** 5789 * Produces cryptographically secure private key from random of size 5790 * (groupLen + ceil(groupLen / 2)) with modulo bias being negligible. 5791 */ 5792 randomPrivateKey: () => { 5793 const length = getMinHashLength(CURVE.n); 5794 return mapHashToField(CURVE.randomBytes(length), CURVE.n); 5795 }, 5796 /** 5797 * Creates precompute table for an arbitrary EC point. Makes point "cached". 5798 * Allows to massively speed-up `point.multiply(scalar)`. 5799 * @returns cached point 5800 * @example 5801 * const fast = utils.precompute(8, ProjectivePoint.fromHex(someonesPubKey)); 5802 * fast.multiply(privKey); // much faster ECDH now 5803 */ 5804 precompute(windowSize = 8, point = Point.BASE) { 5805 point._setWindowSize(windowSize); 5806 point.multiply(BigInt(3)); 5807 return point; 5808 } 5809 }; 5810 /** 5811 * Computes public key for a private key. Checks for validity of the private key. 5812 * @param privateKey private key 5813 * @param isCompressed whether to return compact (default), or full key 5814 * @returns Public key, full when isCompressed=false; short when isCompressed=true 5815 */ 5816 function getPublicKey(privateKey, isCompressed = true) { 5817 return Point.fromPrivateKey(privateKey).toRawBytes(isCompressed); 5818 } 5819 /** 5820 * Quick and dirty check for item being public key. Does not validate hex, or being on-curve. 5821 */ 5822 function isProbPub(item) { 5823 const arr = item instanceof Uint8Array; 5824 const str = typeof item === "string"; 5825 const len = (arr || str) && item.length; 5826 if (arr) return len === compressedLen || len === uncompressedLen; 5827 if (str) return len === 2 * compressedLen || len === 2 * uncompressedLen; 5828 if (item instanceof Point) return true; 5829 return false;
vendor: 4,793 bytes, lines 5830-5963
5830 } 5831 /** 5832 * ECDH (Elliptic Curve Diffie Hellman). 5833 * Computes shared public key from private key and public key. 5834 * Checks: 1) private key validity 2) shared key is on-curve. 5835 * Does NOT hash the result. 5836 * @param privateA private key 5837 * @param publicB different public key 5838 * @param isCompressed whether to return compact (default), or full key 5839 * @returns shared public key 5840 */ 5841 function getSharedSecret(privateA, publicB, isCompressed = true) { 5842 if (isProbPub(privateA)) throw new Error("first arg must be private key"); 5843 if (!isProbPub(publicB)) throw new Error("second arg must be public key"); 5844 return Point.fromHex(publicB).multiply(normPrivateKeyToScalar(privateA)).toRawBytes(isCompressed); 5845 } 5846 const bits2int = CURVE.bits2int || function(bytes) { 5847 const num = bytesToNumberBE(bytes); 5848 const delta = bytes.length * 8 - CURVE.nBitLength; 5849 return delta > 0 ? num >> BigInt(delta) : num; 5850 }; 5851 const bits2int_modN = CURVE.bits2int_modN || function(bytes) { 5852 return modN(bits2int(bytes)); 5853 }; 5854 const ORDER_MASK = bitMask(CURVE.nBitLength); 5855 /** 5856 * Converts to bytes. Checks if num in `[0..ORDER_MASK-1]` e.g.: `[0..2^256-1]`. 5857 */ 5858 function int2octets(num) { 5859 if (typeof num !== "bigint") throw new Error("bigint expected"); 5860 if (!(_0n <= num && num < ORDER_MASK)) throw new Error(`bigint expected < 2^${CURVE.nBitLength}`); 5861 return numberToBytesBE(num, CURVE.nByteLength); 5862 } 5863 function prepSig(msgHash, privateKey, opts = defaultSigOpts) { 5864 if (["recovered", "canonical"].some((k) => k in opts)) throw new Error("sign() legacy options not supported"); 5865 const { hash, randomBytes } = CURVE; 5866 let { lowS, prehash, extraEntropy: ent } = opts; 5867 if (lowS == null) lowS = true; 5868 msgHash = ensureBytes("msgHash", msgHash); 5869 if (prehash) msgHash = ensureBytes("prehashed msgHash", hash(msgHash)); 5870 const h1int = bits2int_modN(msgHash); 5871 const d = normPrivateKeyToScalar(privateKey); 5872 const seedArgs = [int2octets(d), int2octets(h1int)]; 5873 if (ent != null) { 5874 const e = ent === true ? randomBytes(Fp.BYTES) : ent; 5875 seedArgs.push(ensureBytes("extraEntropy", e)); 5876 } 5877 const seed = concatBytes(...seedArgs); 5878 const m = h1int; 5879 function k2sig(kBytes) { 5880 const k = bits2int(kBytes); 5881 if (!isWithinCurveOrder(k)) return; 5882 const ik = invN(k); 5883 const q = Point.BASE.multiply(k).toAffine(); 5884 const r = modN(q.x); 5885 if (r === _0n) return; 5886 const s = modN(ik * modN(m + r * d)); 5887 if (s === _0n) return; 5888 let recovery = (q.x === r ? 0 : 2) | Number(q.y & _1n$1); 5889 let normS = s; 5890 if (lowS && isBiggerThanHalfOrder(s)) { 5891 normS = normalizeS(s); 5892 recovery ^= 1; 5893 } 5894 return new Signature(r, normS, recovery); 5895 } 5896 return { 5897 seed, 5898 k2sig 5899 }; 5900 } 5901 const defaultSigOpts = { 5902 lowS: CURVE.lowS, 5903 prehash: false 5904 }; 5905 const defaultVerOpts = { 5906 lowS: CURVE.lowS, 5907 prehash: false 5908 }; 5909 /** 5910 * Signs message hash with a private key. 5911 * ``` 5912 * sign(m, d, k) where 5913 * (x, y) = G Ã k 5914 * r = x mod n 5915 * s = (m + dr)/k mod n 5916 * ``` 5917 * @param msgHash NOT message. msg needs to be hashed to `msgHash`, or use `prehash`. 5918 * @param privKey private key 5919 * @param opts lowS for non-malleable sigs. extraEntropy for mixing randomness into k. prehash will hash first arg. 5920 * @returns signature with recovery param 5921 */ 5922 function sign(msgHash, privKey, opts = defaultSigOpts) { 5923 const { seed, k2sig } = prepSig(msgHash, privKey, opts); 5924 const C = CURVE; 5925 return createHmacDrbg(C.hash.outputLen, C.nByteLength, C.hmac)(seed, k2sig); 5926 } 5927 Point.BASE._setWindowSize(8); 5928 /** 5929 * Verifies a signature against message hash and public key. 5930 * Rejects lowS signatures by default: to override, 5931 * specify option `{lowS: false}`. Implements section 4.1.4 from https://www.secg.org/sec1-v2.pdf: 5932 * 5933 * ``` 5934 * verify(r, s, h, P) where 5935 * U1 = hs^-1 mod n 5936 * U2 = rs^-1 mod n 5937 * R = U1â G - U2â P 5938 * mod(R.x, n) == r 5939 * ``` 5940 */ 5941 function verify(signature, msgHash, publicKey, opts = defaultVerOpts) { 5942 const sg = signature; 5943 msgHash = ensureBytes("msgHash", msgHash); 5944 publicKey = ensureBytes("publicKey", publicKey); 5945 if ("strict" in opts) throw new Error("options.strict was renamed to lowS"); 5946 const { lowS, prehash } = opts; 5947 let _sig = void 0; 5948 let P; 5949 try { 5950 if (typeof sg === "string" || sg instanceof Uint8Array) try { 5951 _sig = Signature.fromDER(sg); 5952 } catch (derError) { 5953 if (!(derError instanceof DER.Err)) throw derError; 5954 _sig = Signature.fromCompact(sg); 5955 } 5956 else if (typeof sg === "object" && typeof sg.r === "bigint" && typeof sg.s === "bigint") { 5957 const { r, s } = sg; 5958 _sig = new Signature(r, s); 5959 } else throw new Error("PARSE"); 5960 P = Point.fromHex(publicKey); 5961 } catch (error) { 5962 if (error.message === "PARSE") throw new Error(`signature must be Signature instance, Uint8Array or hex string`); 5963 return false;
5964 } 5965 if (lowS && _sig.hasHighS()) return false; 5966 if (prehash) msgHash = CURVE.hash(msgHash); 5967 const { r, s } = _sig; 5968 const h = bits2int_modN(msgHash); 5969 const is = invN(s); 5970 const u1 = modN(h * is); 5971 const u2 = modN(r * is); 5972 const R = Point.BASE.multiplyAndAddUnsafe(P, u1, u2)?.toAffine(); 5973 if (!R) return false; 5974 return modN(R.x) === r; 5975 } 5976 return { 5977 CURVE, 5978 getPublicKey, 5979 getSharedSecret, 5980 sign, 5981 verify, 5982 ProjectivePoint: Point, 5983 Signature, 5984 utils 5985 }; 5986} 5987//#endregion 5988//#region node_modules/@noble/curves/esm/_shortw_utils.js 5989/*! noble-curves - MIT License (c) 2022 Paul Miller (paulmillr.com) */ 5990function getHash(hash) { 5991 return { 5992 hash, 5993 hmac: (key, ...msgs) => hmac(hash, key, concatBytes$1(...msgs)), 5994 randomBytes: randomBytes$2 5995 }; 5996} 5997function createCurve(curveDef, defHash) { 5998 const create = (hash) => weierstrass({ 5999 ...curveDef, 6000 ...getHash(hash) 6001 }); 6002 return Object.freeze({ 6003 ...create(defHash), 6004 create 6005 }); 6006} 6007//#endregion 6008//#region node_modules/@noble/curves/esm/secp256k1.js 6009/*! noble-curves - MIT License (c) 2022 Paul Miller (paulmillr.com) */ 6010var secp256k1P = BigInt("0xfffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc2f"); 6011var secp256k1N = BigInt("0xfffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364141"); 6012var _1n = BigInt(1); 6013var _2n = BigInt(2); 6014var divNearest = (a, b) => (a + b / _2n) / b; 6015/** 6016* ân = n^((p+1)/4) for fields p = 3 mod 4. We unwrap the loop and multiply bit-by-bit. 6017* (P+1n/4n).toString(2) would produce bits [223x 1, 0, 22x 1, 4x 0, 11, 00] 6018*/ 6019function sqrtMod(y) { 6020 const P = secp256k1P; 6021 const _3n = BigInt(3), _6n = BigInt(6), _11n = BigInt(11), _22n = BigInt(22); 6022 const _23n = BigInt(23), _44n = BigInt(44), _88n = BigInt(88); 6023 const b2 = y * y * y % P; 6024 const b3 = b2 * b2 * y % P; 6025 const b11 = pow2(pow2(pow2(b3, _3n, P) * b3 % P, _3n, P) * b3 % P, _2n, P) * b2 % P; 6026 const b22 = pow2(b11, _11n, P) * b11 % P; 6027 const b44 = pow2(b22, _22n, P) * b22 % P; 6028 const b88 = pow2(b44, _44n, P) * b44 % P; 6029 const root = pow2(pow2(pow2(pow2(pow2(pow2(b88, _88n, P) * b88 % P, _44n, P) * b44 % P, _3n, P) * b3 % P, _23n, P) * b22 % P, _6n, P) * b2 % P, _2n, P); 6030 if (!Fp.eql(Fp.sqr(root), y)) throw new Error("Cannot find square root"); 6031 return root; 6032} 6033var Fp = Field(secp256k1P, void 0, void 0, { sqrt: sqrtMod }); 6034var secp256k1 = createCurve({ 6035 a: BigInt(0), 6036 b: BigInt(7), 6037 Fp, 6038 n: secp256k1N, 6039 Gx: BigInt("55066263022277343669578718895168534326250603453777594175500187360389116729240"), 6040 Gy: BigInt("32670510020758816978083085130507043184471273380659243275938904335757337482424"), 6041 h: BigInt(1), 6042 lowS: true, 6043 /** 6044 * secp256k1 belongs to Koblitz curves: it has efficiently computable endomorphism. 6045 * Endomorphism uses 2x less RAM, speeds up precomputation by 2x and ECDH / key recovery by 20%. 6046 * For precomputed wNAF it trades off 1/2 init time & 1/3 ram for 20% perf hit. 6047 * Explanation: https://gist.github.com/paulmillr/eb670806793e84df628a7c434a873066 6048 */ 6049 endo: { 6050 beta: BigInt("0x7ae96a2b657c07106e64479eac3434e99cf0497512f58995c1396c28719501ee"), 6051 splitScalar: (k) => { 6052 const n = secp256k1N; 6053 const a1 = BigInt("0x3086d221a7d46bcde86c90e49284eb15"); 6054 const b1 = -_1n * BigInt("0xe4437ed6010e88286f547fa90abfe4c3"); 6055 const a2 = BigInt("0x114ca50f7a8e2f3f657c1108d9d44cfd8"); 6056 const b2 = a1; 6057 const POW_2_128 = BigInt("0x100000000000000000000000000000000"); 6058 const c1 = divNearest(b2 * k, n); 6059 const c2 = divNearest(-b1 * k, n); 6060 let k1 = mod(k - c1 * a1 - c2 * a2, n); 6061 let k2 = mod(-c1 * b1 - c2 * b2, n); 6062 const k1neg = k1 > POW_2_128; 6063 const k2neg = k2 > POW_2_128; 6064 if (k1neg) k1 = n - k1; 6065 if (k2neg) k2 = n - k2; 6066 if (k1 > POW_2_128 || k2 > POW_2_128) throw new Error("splitScalar: Endomorphism failed, k=" + k); 6067 return { 6068 k1neg, 6069 k1, 6070 k2neg, 6071 k2 6072 }; 6073 } 6074 } 6075}, sha256$1); 6076secp256k1.ProjectivePoint; 6077//#endregion 6078//#region node_modules/ethers/lib.esm/constants/addresses.js 6079/** 6080* A constant for the zero address. 6081* 6082* (**i.e.** ``"0x0000000000000000000000000000000000000000"``) 6083*/ 6084var ZeroAddress = "0x0000000000000000000000000000000000000000"; 6085//#endregion 6086//#region node_modules/ethers/lib.esm/constants/hashes.js 6087/** 6088* A constant for the zero hash. 6089* 6090* (**i.e.** ``"0x0000000000000000000000000000000000000000000000000000000000000000"``) 6091*/ 6092var ZeroHash = "0x0000000000000000000000000000000000000000000000000000000000000000"; 6093//#endregion 6094//#region node_modules/ethers/lib.esm/constants/numbers.js 6095/** 6096* A constant for the order N for the secp256k1 curve. 6097* 6098* (**i.e.** ``0xfffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364141n``) 6099*/ 6100var N = BigInt("0xfffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364141"); 6101/** 6102* A constant for the number of wei in a single ether. 6103* 6104* (**i.e.** ``1000000000000000000n``) 6105*/ 6106var WeiPerEther = BigInt("1000000000000000000"); 6107/** 6108* A constant for the maximum value for a ``uint256``. 6109* 6110* (**i.e.** ``0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffn``) 6111*/ 6112var MaxUint256 = BigInt("0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"); 6113/** 6114* A constant for the minimum value for an ``int256``. 6115* 6116* (**i.e.** ``-8000000000000000000000000000000000000000000000000000000000000000n``) 6117*/ 6118var MinInt256 = BigInt("0x8000000000000000000000000000000000000000000000000000000000000000") * BigInt(-1); 6119/** 6120* A constant for the maximum value for an ``int256``. 6121* 6122* (**i.e.** ``0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffn``) 6123*/ 6124var MaxInt256 = BigInt("0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"); 6125//#endregion 6126//#region node_modules/ethers/lib.esm/constants/strings.js 6127/** 6128* A constant for the ether symbol (normalized using NFKC). 6129* 6130* (**i.e.** ``"\\u039e"``) 6131*/ 6132var EtherSymbol = "Î"; 6133/** 6134* A constant for the [[link-eip-191]] personal message prefix. 6135* 6136* (**i.e.** ``"\\x19Ethereum Signed Message:\\n"``) 6137*/ 6138var MessagePrefix = "�Ethereum Signed Message:\n"; 6139//#endregion 6140//#region node_modules/ethers/lib.esm/crypto/signature.js 6141var BN_0$7 = BigInt(0); 6142var BN_1$3 = BigInt(1); 6143var BN_2$3 = BigInt(2); 6144var BN_27$1 = BigInt(27); 6145var BN_28$1 = BigInt(28); 6146var BN_35$1 = BigInt(35); 6147var BN_N = BigInt("0xfffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364141"); 6148var BN_N_2 = BN_N / BN_2$3; 6149var inspect$3 = Symbol.for("nodejs.util.inspect.custom"); 6150var _guard$3 = {}; 6151function toUint256(value) { 6152 return zeroPadValue(toBeArray(value), 32); 6153} 6154/** 6155* A Signature @TODO 6156* 6157* 6158* @_docloc: api/crypto:Signing 6159*/ 6160var Signature = class Signature { 6161 #r; 6162 #s; 6163 #v; 6164 #networkV; 6165 /** 6166 * The ``r`` value for a signature. 6167 * 6168 * This represents the ``x`` coordinate of a "reference" or 6169 * challenge point, from which the ``y`` can be computed. 6170 */ 6171 get r() { 6172 return this.#r; 6173 } 6174 set r(value) { 6175 assertArgument(dataLength(value) === 32, "invalid r", "value", value); 6176 this.#r = hexlify(value); 6177 } 6178 /** 6179 * The ``s`` value for a signature. 6180 */ 6181 get s() { 6182 assertArgument(parseInt(this.#s.substring(0, 3)) < 8, "non-canonical s; use ._s", "s", this.#s); 6183 return this.#s; 6184 } 6185 set s(_value) { 6186 assertArgument(dataLength(_value) === 32, "invalid s", "value", _value); 6187 this.#s = hexlify(_value); 6188 } 6189 /** 6190 * Return the s value, unchecked for EIP-2 compliance. 6191 * 6192 * This should generally not be used and is for situations where 6193 * a non-canonical S value might be relevant, such as Frontier blocks 6194 * that were mined prior to EIP-2 or invalid Authorization List 6195 * signatures. 6196 */ 6197 get _s() { 6198 return this.#s; 6199 } 6200 /** 6201 * Returns true if the Signature is valid for [[link-eip-2]] signatures. 6202 */ 6203 isValid() { 6204 return BigInt(this.#s) <= BN_N_2; 6205 }
6206 /** 6207 * The ``v`` value for a signature. 6208 * 6209 * Since a given ``x`` value for ``r`` has two possible values for 6210 * its correspondin ``y``, the ``v`` indicates which of the two ``y`` 6211 * values to use. 6212 * 6213 * It is normalized to the values ``27`` or ``28`` for legacy 6214 * purposes. 6215 */ 6216 get v() { 6217 return this.#v; 6218 } 6219 set v(value) { 6220 const v = getNumber(value, "value"); 6221 assertArgument(v === 27 || v === 28, "invalid v", "v", value); 6222 this.#v = v; 6223 } 6224 /** 6225 * The EIP-155 ``v`` for legacy transactions. For non-legacy 6226 * transactions, this value is ``null``. 6227 */ 6228 get networkV() { 6229 return this.#networkV; 6230 } 6231 /** 6232 * The chain ID for EIP-155 legacy transactions. For non-legacy 6233 * transactions, this value is ``null``. 6234 */ 6235 get legacyChainId() { 6236 const v = this.networkV; 6237 if (v == null) return null; 6238 return Signature.getChainId(v); 6239 } 6240 /** 6241 * The ``yParity`` for the signature. 6242 * 6243 * See ``v`` for more details on how this value is used. 6244 */ 6245 get yParity() { 6246 return this.v === 27 ? 0 : 1; 6247 } 6248 /** 6249 * The [[link-eip-2098]] compact representation of the ``yParity`` 6250 * and ``s`` compacted into a single ``bytes32``. 6251 */ 6252 get yParityAndS() { 6253 const yParityAndS = getBytes(this.s); 6254 if (this.yParity) yParityAndS[0] |= 128; 6255 return hexlify(yParityAndS); 6256 } 6257 /** 6258 * The [[link-eip-2098]] compact representation. 6259 */ 6260 get compactSerialized() { 6261 return concat([this.r, this.yParityAndS]); 6262 } 6263 /** 6264 * The serialized representation. 6265 */ 6266 get serialized() { 6267 return concat([ 6268 this.r, 6269 this.s, 6270 this.yParity ? "0x1c" : "0x1b" 6271 ]); 6272 } 6273 /** 6274 * @private 6275 */ 6276 constructor(guard, r, s, v) { 6277 assertPrivate(guard, _guard$3, "Signature"); 6278 this.#r = r; 6279 this.#s = s; 6280 this.#v = v; 6281 this.#networkV = null; 6282 } 6283 /** 6284 * Returns the canonical signature. 6285 * 6286 * This is only necessary when dealing with legacy transaction which 6287 * did not enforce canonical S values (i.e. [[link-eip-2]]. Most 6288 * developers should never require this. 6289 */ 6290 getCanonical() { 6291 if (this.isValid()) return this; 6292 const s = BN_N - BigInt(this._s); 6293 const v = 55 - this.v; 6294 const result = new Signature(_guard$3, this.r, toUint256(s), v); 6295 if (this.networkV) result.#networkV = this.networkV; 6296 return result; 6297 } 6298 /** 6299 * Returns a new identical [[Signature]]. 6300 */ 6301 clone() { 6302 const clone = new Signature(_guard$3, this.r, this._s, this.v); 6303 if (this.networkV) clone.#networkV = this.networkV; 6304 return clone; 6305 } 6306 /** 6307 * Returns a representation that is compatible with ``JSON.stringify``. 6308 */ 6309 toJSON() { 6310 const networkV = this.networkV; 6311 return { 6312 _type: "signature", 6313 networkV: networkV != null ? networkV.toString() : null, 6314 r: this.r, 6315 s: this._s, 6316 v: this.v 6317 }; 6318 } 6319 [inspect$3]() { 6320 return this.toString(); 6321 } 6322 toString() { 6323 if (this.isValid()) return `Signature { r: ${this.r}, s: ${this._s}, v: ${this.v} }`; 6324 return `Signature { r: ${this.r}, s: ${this._s}, v: ${this.v}, valid: false }`; 6325 } 6326 /** 6327 * Compute the chain ID from the ``v`` in a legacy EIP-155 transactions. 6328 * 6329 * @example: 6330 * Signature.getChainId(45) 6331 * //_result: 6332 * 6333 * Signature.getChainId(46) 6334 * //_result: 6335 */ 6336 static getChainId(v) { 6337 const bv = getBigInt(v, "v"); 6338 if (bv == BN_27$1 || bv == BN_28$1) return BN_0$7; 6339 assertArgument(bv >= BN_35$1, "invalid EIP-155 v", "v", v); 6340 return (bv - BN_35$1) / BN_2$3; 6341 } 6342 /** 6343 * Compute the ``v`` for a chain ID for a legacy EIP-155 transactions. 6344 * 6345 * Legacy transactions which use [[link-eip-155]] hijack the ``v`` 6346 * property to include the chain ID. 6347 * 6348 * @example: 6349 * Signature.getChainIdV(5, 27) 6350 * //_result: 6351 * 6352 * Signature.getChainIdV(5, 28) 6353 * //_result: 6354 * 6355 */ 6356 static getChainIdV(chainId, v) { 6357 return getBigInt(chainId) * BN_2$3 + BigInt(35 + v - 27); 6358 } 6359 /** 6360 * Compute the normalized legacy transaction ``v`` from a ``yParirty``, 6361 * a legacy transaction ``v`` or a legacy [[link-eip-155]] transaction. 6362 * 6363 * @example: 6364 * // The values 0 and 1 imply v is actually yParity 6365 * Signature.getNormalizedV(0) 6366 * //_result: 6367 * 6368 * // Legacy non-EIP-1559 transaction (i.e. 27 or 28) 6369 * Signature.getNormalizedV(27) 6370 * //_result: 6371 * 6372 * // Legacy EIP-155 transaction (i.e. >= 35) 6373 * Signature.getNormalizedV(46) 6374 * //_result: 6375 * 6376 * // Invalid values throw 6377 * Signature.getNormalizedV(5) 6378 * //_error: 6379 */ 6380 static getNormalizedV(v) { 6381 const bv = getBigInt(v); 6382 if (bv === BN_0$7 || bv === BN_27$1) return 27; 6383 if (bv === BN_1$3 || bv === BN_28$1) return 28; 6384 assertArgument(bv >= BN_35$1, "invalid v", "v", v); 6385 return bv & BN_1$3 ? 27 : 28; 6386 }
vendor: 8,405 bytes, lines 6387-6647
6387 /** 6388 * Creates a new [[Signature]]. 6389 * 6390 * If no %%sig%% is provided, a new [[Signature]] is created 6391 * with default values. 6392 * 6393 * If %%sig%% is a string, it is parsed. 6394 */ 6395 static from(sig) { 6396 function assertError(check, message) { 6397 assertArgument(check, message, "signature", sig); 6398 } 6399 if (sig == null) return new Signature(_guard$3, ZeroHash, ZeroHash, 27); 6400 if (typeof sig === "string") { 6401 const bytes = getBytes(sig, "signature"); 6402 if (bytes.length === 64) { 6403 const r = hexlify(bytes.slice(0, 32)); 6404 const s = bytes.slice(32, 64); 6405 const v = s[0] & 128 ? 28 : 27; 6406 s[0] &= 127; 6407 return new Signature(_guard$3, r, hexlify(s), v); 6408 } 6409 if (bytes.length === 65) { 6410 const r = hexlify(bytes.slice(0, 32)); 6411 const s = hexlify(bytes.slice(32, 64)); 6412 const v = Signature.getNormalizedV(bytes[64]); 6413 return new Signature(_guard$3, r, s, v); 6414 } 6415 assertError(false, "invalid raw signature length"); 6416 } 6417 if (sig instanceof Signature) return sig.clone(); 6418 const _r = sig.r; 6419 assertError(_r != null, "missing r"); 6420 const r = toUint256(_r); 6421 const s = (function(s, yParityAndS) { 6422 if (s != null) return toUint256(s); 6423 if (yParityAndS != null) { 6424 assertError(isHexString(yParityAndS, 32), "invalid yParityAndS"); 6425 const bytes = getBytes(yParityAndS); 6426 bytes[0] &= 127; 6427 return hexlify(bytes); 6428 } 6429 assertError(false, "missing s"); 6430 })(sig.s, sig.yParityAndS); 6431 const { networkV, v } = (function(_v, yParityAndS, yParity) { 6432 if (_v != null) { 6433 const v = getBigInt(_v); 6434 return { 6435 networkV: v >= BN_35$1 ? v : void 0, 6436 v: Signature.getNormalizedV(v) 6437 }; 6438 } 6439 if (yParityAndS != null) { 6440 assertError(isHexString(yParityAndS, 32), "invalid yParityAndS"); 6441 return { v: getBytes(yParityAndS)[0] & 128 ? 28 : 27 }; 6442 } 6443 if (yParity != null) { 6444 switch (getNumber(yParity, "sig.yParity")) { 6445 case 0: return { v: 27 }; 6446 case 1: return { v: 28 }; 6447 } 6448 assertError(false, "invalid yParity"); 6449 } 6450 assertError(false, "missing v"); 6451 })(sig.v, sig.yParityAndS, sig.yParity); 6452 const result = new Signature(_guard$3, r, s, v); 6453 if (networkV) result.#networkV = networkV; 6454 assertError(sig.yParity == null || getNumber(sig.yParity, "sig.yParity") === result.yParity, "yParity mismatch"); 6455 assertError(sig.yParityAndS == null || sig.yParityAndS === result.yParityAndS, "yParityAndS mismatch"); 6456 return result; 6457 } 6458}; 6459//#endregion 6460//#region node_modules/ethers/lib.esm/crypto/signing-key.js 6461/** 6462* Add details about signing here. 6463* 6464* @_subsection: api/crypto:Signing [about-signing] 6465*/ 6466/** 6467* A **SigningKey** provides high-level access to the elliptic curve 6468* cryptography (ECC) operations and key management. 6469*/ 6470var SigningKey = class SigningKey { 6471 #privateKey; 6472 /** 6473 * Creates a new **SigningKey** for %%privateKey%%. 6474 */ 6475 constructor(privateKey) { 6476 assertArgument(dataLength(privateKey) === 32, "invalid private key", "privateKey", "[REDACTED]"); 6477 this.#privateKey = hexlify(privateKey); 6478 } 6479 /** 6480 * The private key. 6481 */ 6482 get privateKey() { 6483 return this.#privateKey; 6484 } 6485 /** 6486 * The uncompressed public key. 6487 * 6488 * This will always begin with the prefix ``0x04`` and be 132 6489 * characters long (the ``0x`` prefix and 130 hexadecimal nibbles). 6490 */ 6491 get publicKey() { 6492 return SigningKey.computePublicKey(this.#privateKey); 6493 } 6494 /** 6495 * The compressed public key. 6496 * 6497 * This will always begin with either the prefix ``0x02`` or ``0x03`` 6498 * and be 68 characters long (the ``0x`` prefix and 33 hexadecimal 6499 * nibbles) 6500 */ 6501 get compressedPublicKey() { 6502 return SigningKey.computePublicKey(this.#privateKey, true); 6503 } 6504 /** 6505 * Return the signature of the signed %%digest%%. 6506 */ 6507 sign(digest) { 6508 assertArgument(dataLength(digest) === 32, "invalid digest length", "digest", digest); 6509 const sig = secp256k1.sign(getBytesCopy(digest), getBytesCopy(this.#privateKey), { lowS: true }); 6510 return Signature.from({ 6511 r: toBeHex(sig.r, 32), 6512 s: toBeHex(sig.s, 32), 6513 v: sig.recovery ? 28 : 27 6514 }); 6515 } 6516 /** 6517 * Returns the [[link-wiki-ecdh]] shared secret between this 6518 * private key and the %%other%% key. 6519 * 6520 * The %%other%% key may be any type of key, a raw public key, 6521 * a compressed/uncompressed pubic key or aprivate key. 6522 * 6523 * Best practice is usually to use a cryptographic hash on the 6524 * returned value before using it as a symetric secret. 6525 * 6526 * @example: 6527 * sign1 = new SigningKey(id("some-secret-1")) 6528 * sign2 = new SigningKey(id("some-secret-2")) 6529 * 6530 * // Notice that privA.computeSharedSecret(pubB)... 6531 * sign1.computeSharedSecret(sign2.publicKey) 6532 * //_result: 6533 * 6534 * // ...is equal to privB.computeSharedSecret(pubA). 6535 * sign2.computeSharedSecret(sign1.publicKey) 6536 * //_result: 6537 */ 6538 computeSharedSecret(other) { 6539 const pubKey = SigningKey.computePublicKey(other); 6540 return hexlify(secp256k1.getSharedSecret(getBytesCopy(this.#privateKey), getBytes(pubKey), false)); 6541 } 6542 /** 6543 * Compute the public key for %%key%%, optionally %%compressed%%. 6544 * 6545 * The %%key%% may be any type of key, a raw public key, a 6546 * compressed/uncompressed public key or private key. 6547 * 6548 * @example: 6549 * sign = new SigningKey(id("some-secret")); 6550 * 6551 * // Compute the uncompressed public key for a private key 6552 * SigningKey.computePublicKey(sign.privateKey) 6553 * //_result: 6554 * 6555 * // Compute the compressed public key for a private key 6556 * SigningKey.computePublicKey(sign.privateKey, true) 6557 * //_result: 6558 * 6559 * // Compute the uncompressed public key 6560 * SigningKey.computePublicKey(sign.publicKey, false); 6561 * //_result: 6562 * 6563 * // Compute the Compressed a public key 6564 * SigningKey.computePublicKey(sign.publicKey, true); 6565 * //_result: 6566 */ 6567 static computePublicKey(key, compressed) { 6568 let bytes = getBytes(key, "key"); 6569 if (bytes.length === 32) return hexlify(secp256k1.getPublicKey(bytes, !!compressed)); 6570 if (bytes.length === 64) { 6571 const pub = /* @__PURE__ */ new Uint8Array(65); 6572 pub[0] = 4; 6573 pub.set(bytes, 1); 6574 bytes = pub; 6575 } 6576 return hexlify(secp256k1.ProjectivePoint.fromHex(bytes).toRawBytes(compressed)); 6577 } 6578 /** 6579 * Returns the public key for the private key which produced the 6580 * %%signature%% for the given %%digest%%. 6581 * 6582 * @example: 6583 * key = new SigningKey(id("some-secret")) 6584 * digest = id("hello world") 6585 * sig = key.sign(digest) 6586 * 6587 * // Notice the signer public key... 6588 * key.publicKey 6589 * //_result: 6590 * 6591 * // ...is equal to the recovered public key 6592 * SigningKey.recoverPublicKey(digest, sig) 6593 * //_result: 6594 * 6595 */ 6596 static recoverPublicKey(digest, signature) { 6597 assertArgument(dataLength(digest) === 32, "invalid digest length", "digest", digest); 6598 const sig = Signature.from(signature); 6599 let secpSig = secp256k1.Signature.fromCompact(getBytesCopy(concat([sig.r, sig.s]))); 6600 secpSig = secpSig.addRecoveryBit(sig.yParity); 6601 const pubKey = secpSig.recoverPublicKey(getBytesCopy(digest)); 6602 assertArgument(pubKey != null, "invalid signature for digest", "signature", signature); 6603 return "0x" + pubKey.toHex(false); 6604 } 6605 /** 6606 * Returns the point resulting from adding the ellipic curve points 6607 * %%p0%% and %%p1%%. 6608 * 6609 * This is not a common function most developers should require, but 6610 * can be useful for certain privacy-specific techniques. 6611 * 6612 * For example, it is used by [[HDNodeWallet]] to compute child 6613 * addresses from parent public keys and chain codes. 6614 */ 6615 static addPoints(p0, p1, compressed) { 6616 const pub0 = secp256k1.ProjectivePoint.fromHex(SigningKey.computePublicKey(p0).substring(2)); 6617 const pub1 = secp256k1.ProjectivePoint.fromHex(SigningKey.computePublicKey(p1).substring(2)); 6618 return "0x" + pub0.add(pub1).toHex(!!compressed); 6619 } 6620}; 6621//#endregion 6622//#region node_modules/ethers/lib.esm/crypto/index.js 6623/** 6624* Once called, prevents any future change to the underlying cryptographic 6625* primitives using the ``.register`` feature for hooks. 6626*/ 6627function lock() { 6628 computeHmac.lock(); 6629 keccak256.lock(); 6630 pbkdf2.lock(); 6631 randomBytes.lock(); 6632 ripemd160.lock(); 6633 scrypt.lock(); 6634 scryptSync.lock(); 6635 sha256.lock(); 6636 sha512.lock(); 6637 randomBytes.lock(); 6638} 6639//#endregion 6640//#region node_modules/ethers/lib.esm/address/address.js 6641var BN_0$6 = BigInt(0); 6642var BN_36 = BigInt(36); 6643function getChecksumAddress(address) { 6644 address = address.toLowerCase(); 6645 const chars = address.substring(2).split(""); 6646 const expanded = /* @__PURE__ */ new Uint8Array(40); 6647 for (let i = 0; i < 40;
6647 i++) expanded[i] = chars[i].charCodeAt(0); 6648 const hashed = getBytes(keccak256(expanded)); 6649 for (let i = 0; i < 40; i += 2) { 6650 if (hashed[i >> 1] >> 4 >= 8) chars[i] = chars[i].toUpperCase(); 6651 if ((hashed[i >> 1] & 15) >= 8) chars[i + 1] = chars[i + 1].toUpperCase(); 6652 } 6653 return "0x" + chars.join(""); 6654} 6655var ibanLookup = {}; 6656for (let i = 0; i < 10; i++) ibanLookup[String(i)] = String(i); 6657for (let i = 0; i < 26; i++) ibanLookup[String.fromCharCode(65 + i)] = String(10 + i); 6658var safeDigits = 15; 6659function ibanChecksum(address) { 6660 address = address.toUpperCase(); 6661 address = address.substring(4) + address.substring(0, 2) + "00"; 6662 let expanded = address.split("").map((c) => { 6663 return ibanLookup[c]; 6664 }).join(""); 6665 while (expanded.length >= safeDigits) { 6666 let block = expanded.substring(0, safeDigits); 6667 expanded = parseInt(block, 10) % 97 + expanded.substring(block.length); 6668 } 6669 let checksum = String(98 - parseInt(expanded, 10) % 97); 6670 while (checksum.length < 2) checksum = "0" + checksum; 6671 return checksum; 6672} 6673var Base36 = (function() { 6674 const result = {}; 6675 for (let i = 0; i < 36; i++) { 6676 const key = "0123456789abcdefghijklmnopqrstuvwxyz"[i]; 6677 result[key] = BigInt(i); 6678 } 6679 return result; 6680})(); 6681function fromBase36(value) { 6682 value = value.toLowerCase(); 6683 let result = BN_0$6; 6684 for (let i = 0; i < value.length; i++) result = result * BN_36 + Base36[value[i]]; 6685 return result; 6686} 6687/** 6688* Returns a normalized and checksumed address for %%address%%. 6689* This accepts non-checksum addresses, checksum addresses and 6690* [[getIcapAddress]] formats. 6691* 6692* The checksum in Ethereum uses the capitalization (upper-case
6693* vs lower-case) of the characters within an address to encode 6694* its checksum, which offers, on average, a checksum of 15-bits. 6695* 6696* If %%address%% contains both upper-case and lower-case, it is 6697* assumed to already be a checksum address and its checksum is 6698* validated, and if the address fails its expected checksum an 6699* error is thrown. 6700* 6701* If you wish the checksum of %%address%% to be ignore, it should 6702* be converted to lower-case (i.e. ``.toLowercase()``) before 6703* being passed in. This should be a very rare situation though, 6704* that you wish to bypass the safegaurds in place to protect 6705* against an address that has been incorrectly copied from another 6706* source. 6707* 6708* @example: 6709* // Adds the checksum (via upper-casing specific letters) 6710* getAddress("0x8ba1f109551bd432803012645ac136ddd64dba72") 6711* //_result: 6712* 6713* // Converts ICAP address and adds checksum 6714* getAddress("XE65GB6LDNXYOFTX0NSV3FUWKOWIXAMJK36"); 6715* //_result: 6716* 6717* // Throws an error if an address contains mixed case, 6718* // but the checksum fails 6719* getAddress("0x8Ba1f109551bD432803012645Ac136ddd64DBA72") 6720* //_error: 6721*/ 6722function getAddress(address) { 6723 assertArgument(typeof address === "string", "invalid address", "address", address); 6724 if (address.match(/^(0x)?[0-9a-fA-F]{40}$/)) { 6725 if (!address.startsWith("0x")) address = "0x" + address; 6726 const result = getChecksumAddress(address); 6727 assertArgument(!address.match(/([A-F].*[a-f])|([a-f].*[A-F])/) || result === address, "bad address checksum", "address", address); 6728 return result; 6729 } 6730 if (address.match(/^XE[0-9]{2}[0-9A-Za-z]{30,31}$/)) { 6731 assertArgument(address.substring(2, 4) === ibanChecksum(address), "bad icap checksum", "address", address); 6732 let result = fromBase36(address.substring(4)).toString(16); 6733 while (result.length < 40) result = "0" + result; 6734 return getChecksumAddress("0x" + result); 6735 } 6736 assertArgument(false, "invalid address", "address", address); 6737} 6738/** 6739* The [ICAP Address format](link-icap) format is an early checksum 6740* format which attempts to be compatible with the banking 6741* industry [IBAN format](link-wiki-iban) for bank accounts. 6742* 6743* It is no longer common or a recommended format. 6744* 6745* @example: 6746* getIcapAddress("0x8ba1f109551bd432803012645ac136ddd64dba72"); 6747* //_result: 6748* 6749* getIcapAddress("XE65GB6LDNXYOFTX0NSV3FUWKOWIXAMJK36"); 6750* //_result: 6751* 6752* // Throws an error if the ICAP checksum is wrong 6753* getIcapAddress("XE65GB6LDNXYOFTX0NSV3FUWKOWIXAMJK37"); 6754* //_error: 6755*/ 6756function getIcapAddress(address) { 6757 let base36 = BigInt(getAddress(address)).toString(36).toUpperCase(); 6758 while (base36.length < 30) base36 = "0" + base36; 6759 return "XE" + ibanChecksum("XE00" + base36) + base36; 6760} 6761//#endregion 6762//#region node_modules/ethers/lib.esm/address/contract-address.js 6763/** 6764* Returns the address that would result from a ``CREATE`` for %%tx%%. 6765* 6766* This can be used to compute the address a contract will be 6767* deployed to by an EOA when sending a deployment transaction (i.e. 6768* when the ``to`` address is ``null``). 6769* 6770* This can also be used to compute the address a contract will be 6771* deployed to by a contract, by using the contract's address as the 6772* ``to`` and the contract's nonce. 6773* 6774* @example 6775* from = "0x8ba1f109551bD432803012645Ac136ddd64DBA72"; 6776* nonce = 5; 6777* 6778* getCreateAddress({ from, nonce }); 6779* //_result: 6780*/ 6781function getCreateAddress(tx) { 6782 const from = getAddress(tx.from); 6783 let nonceHex = getBigInt(tx.nonce, "tx.nonce").toString(16); 6784 if (nonceHex === "0") nonceHex = "0x"; 6785 else if (nonceHex.length % 2) nonceHex = "0x0" + nonceHex; 6786 else nonceHex = "0x" + nonceHex; 6787 return getAddress(dataSlice(keccak256(encodeRlp([from, nonceHex])), 12)); 6788} 6789/** 6790* Returns the address that would result from a ``CREATE2`` operation 6791* with the given %%from%%, %%salt%% and %%initCodeHash%%. 6792* 6793* To compute the %%initCodeHash%% from a contract's init code, use 6794* the [[keccak256]] function. 6795* 6796* For a quick overview and example of ``CREATE2``, see [[link-ricmoo-wisps]]. 6797* 6798* @example 6799* // The address of the contract 6800* from = "0x8ba1f109551bD432803012645Ac136ddd64DBA72" 6801* 6802* // The salt 6803* salt = id("HelloWorld") 6804* 6805* // The hash of the initCode
6806* initCode = "0x6394198df16000526103ff60206004601c335afa6040516060f3"; 6807* initCodeHash = keccak256(initCode) 6808* 6809* getCreate2Address(from, salt, initCodeHash) 6810* //_result: 6811*/ 6812function getCreate2Address(_from, _salt, _initCodeHash) { 6813 const from = getAddress(_from); 6814 const salt = getBytes(_salt, "salt"); 6815 const initCodeHash = getBytes(_initCodeHash, "initCodeHash"); 6816 assertArgument(salt.length === 32, "salt must be 32 bytes", "salt", _salt); 6817 assertArgument(initCodeHash.length === 32, "initCodeHash must be 32 bytes", "initCodeHash", _initCodeHash); 6818 return getAddress(dataSlice(keccak256(concat([ 6819 "0xff", 6820 from, 6821 salt, 6822 initCodeHash 6823 ])), 12)); 6824} 6825//#endregion 6826//#region node_modules/ethers/lib.esm/address/checks.js 6827/** 6828* Returns true if %%value%% is an object which implements the 6829* [[Addressable]] interface. 6830* 6831* @example: 6832* // Wallets and AbstractSigner sub-classes 6833* isAddressable(Wallet.createRandom()) 6834* //_result: 6835* 6836* // Contracts 6837* contract = new Contract("dai.tokens.ethers.eth", [ ], provider) 6838* isAddressable(contract) 6839* //_result: 6840*/ 6841function isAddressable(value) { 6842 return value && typeof value.getAddress === "function"; 6843} 6844/** 6845* Returns true if %%value%% is a valid address. 6846* 6847* @example: 6848* // Valid address 6849* isAddress("0x8ba1f109551bD432803012645Ac136ddd64DBA72") 6850* //_result: 6851* 6852* // Valid ICAP address 6853* isAddress("XE65GB6LDNXYOFTX0NSV3FUWKOWIXAMJK36") 6854* //_result: 6855* 6856* // Invalid checksum 6857* isAddress("0x8Ba1f109551bD432803012645Ac136ddd64DBa72") 6858* //_result: 6859* 6860* // Invalid ICAP checksum 6861* isAddress("0x8Ba1f109551bD432803012645Ac136ddd64DBA72") 6862* //_result: 6863* 6864* // Not an address (an ENS name requires a provided and an 6865* // asynchronous API to access) 6866* isAddress("ricmoo.eth") 6867* //_result: 6868*/ 6869function isAddress(value) { 6870 try { 6871 getAddress(value); 6872 return true; 6873 } catch (error) {} 6874 return false; 6875} 6876async function checkAddress(target, promise) { 6877 const result = await promise; 6878 if (result == null || result === "0x0000000000000000000000000000000000000000") { 6879 assert(typeof target !== "string", "unconfigured name", "UNCONFIGURED_NAME", { value: target }); 6880 assertArgument(false, "invalid AddressLike value; did not resolve to a value address", "target", target); 6881 } 6882 return getAddress(result); 6883} 6884/** 6885* Resolves to an address for the %%target%%, which may be any 6886* supported address type, an [[Addressable]] or a Promise which 6887* resolves to an address. 6888* 6889* If an ENS name is provided, but that name has not been correctly 6890* configured a [[UnconfiguredNameError]] is thrown. 6891* 6892* @example: 6893* addr = "0x6B175474E89094C44Da98b954EedeAC495271d0F" 6894* 6895* // Addresses are return synchronously 6896* resolveAddress(addr, provider) 6897* //_result: 6898* 6899* // Address promises are resolved asynchronously 6900* resolveAddress(Promise.resolve(addr)) 6901* //_result: 6902* 6903* // ENS names are resolved asynchronously 6904* resolveAddress("dai.tokens.ethers.eth", provider) 6905* //_result: 6906* 6907* // Addressable objects are resolved asynchronously 6908* contract = new Contract(addr, [ ]) 6909* resolveAddress(contract, provider) 6910* //_result: 6911* 6912* // Unconfigured ENS names reject 6913* resolveAddress("nothing-here.ricmoo.eth", provider) 6914* //_error: 6915* 6916* // ENS names require a NameResolver object passed in 6917* // (notice the provider was omitted) 6918* resolveAddress("nothing-here.ricmoo.eth") 6919* //_error: 6920*/ 6921function resolveAddress(target, resolver) { 6922 if (typeof target === "string") { 6923 if (target.match(/^0x[0-9a-f]{40}$/i)) return getAddress(target); 6924 assert(resolver != null, "ENS resolution requires a provider", "UNSUPPORTED_OPERATION", { operation: "resolveName" }); 6925 return checkAddress(target, resolver.resolveName(target)); 6926 } else if (isAddressable(target)) return checkAddress(target, target.getAddress()); 6927 else if (target && typeof target.then === "function") return checkAddress(target, target); 6928 assertArgument(false, "unsupported addressable value", "target", target); 6929} 6930//#endregion 6931//#region node_modules/ethers/lib.esm/abi/typed.js 6932/** 6933* A Typed object allows a value to have its type explicitly 6934* specified. 6935* 6936* For example, in Solidity, the value ``45`` could represent a 6937* ``uint8`` or a ``uint256``. The value ``0x1234`` could represent 6938* a ``bytes2`` or ``bytes``. 6939* 6940* Since JavaScript has no meaningful way to explicitly inform any 6941* APIs which what the type is, this allows transparent interoperation 6942* with Soldity. 6943* 6944* @_subsection: api/abi:Typed Values 6945*/ 6946var _gaurd = {}; 6947function n(value, width) { 6948 let signed = false;
6949 if (width < 0) { 6950 signed = true; 6951 width *= -1; 6952 } 6953 return new Typed(_gaurd, `${signed ? "" : "u"}int${width}`, value, { 6954 signed, 6955 width 6956 }); 6957} 6958function b(value, size) { 6959 return new Typed(_gaurd, `bytes${size ? size : ""}`, value, { size }); 6960} 6961var _typedSymbol = Symbol.for("_ethers_typed"); 6962/** 6963* The **Typed** class to wrap values providing explicit type information. 6964*/ 6965var Typed = class Typed { 6966 /** 6967 * The type, as a Solidity-compatible type. 6968 */ 6969 type; 6970 /** 6971 * The actual value. 6972 */ 6973 value; 6974 #options; 6975 /** 6976 * @_ignore: 6977 */ 6978 _typedSymbol; 6979 /** 6980 * @_ignore: 6981 */ 6982 constructor(gaurd, type, value, options) { 6983 if (options == null) options = null; 6984 assertPrivate(_gaurd, gaurd, "Typed"); 6985 defineProperties(this, { 6986 _typedSymbol, 6987 type, 6988 value 6989 }); 6990 this.#options = options; 6991 this.format(); 6992 } 6993 /** 6994 * Format the type as a Human-Readable type. 6995 */ 6996 format() { 6997 if (this.type === "array") throw new Error(""); 6998 else if (this.type === "dynamicArray") throw new Error(""); 6999 else if (this.type === "tuple") return `tuple(${this.value.map((v) => v.format()).join(",")})`; 7000 return this.type; 7001 } 7002 /** 7003 * The default value returned by this type. 7004 */ 7005 defaultValue() { 7006 return 0; 7007 } 7008 /** 7009 * The minimum value for numeric types. 7010 */ 7011 minValue() { 7012 return 0; 7013 } 7014 /** 7015 * The maximum value for numeric types. 7016 */ 7017 maxValue() { 7018 return 0; 7019 } 7020 /** 7021 * Returns ``true`` and provides a type guard is this is a [[TypedBigInt]]. 7022 */ 7023 isBigInt() { 7024 return !!this.type.match(/^u?int[0-9]+$/); 7025 } 7026 /** 7027 * Returns ``true`` and provides a type guard is this is a [[TypedData]]. 7028 */ 7029 isData() { 7030 return this.type.startsWith("bytes"); 7031 } 7032 /** 7033 * Returns ``true`` and provides a type guard is this is a [[TypedString]]. 7034 */ 7035 isString() { 7036 return this.type === "string"; 7037 } 7038 /** 7039 * Returns the tuple name, if this is a tuple. Throws otherwise. 7040 */ 7041 get tupleName() { 7042 if (this.type !== "tuple") throw TypeError("not a tuple"); 7043 return this.#options; 7044 } 7045 /** 7046 * Returns the length of the array type or ``-1`` if it is dynamic. 7047 * 7048 * Throws if the type is not an array. 7049 */ 7050 get arrayLength() { 7051 if (this.type !== "array") throw TypeError("not an array"); 7052 if (this.#options === true) return -1; 7053 if (this.#options === false) return this.value.length; 7054 return null; 7055 } 7056 /**
7057 * Returns a new **Typed** of %%type%% with the %%value%%. 7058 */ 7059 static from(type, value) { 7060 return new Typed(_gaurd, type, value); 7061 } 7062 /** 7063 * Return a new ``uint8`` type for %%v%%. 7064 */ 7065 static uint8(v) { 7066 return n(v, 8); 7067 } 7068 /** 7069 * Return a new ``uint16`` type for %%v%%. 7070 */ 7071 static uint16(v) { 7072 return n(v, 16); 7073 } 7074 /** 7075 * Return a new ``uint24`` type for %%v%%. 7076 */ 7077 static uint24(v) { 7078 return n(v, 24); 7079 } 7080 /** 7081 * Return a new ``uint32`` type for %%v%%. 7082 */ 7083 static uint32(v) { 7084 return n(v, 32); 7085 } 7086 /** 7087 * Return a new ``uint40`` type for %%v%%. 7088 */ 7089 static uint40(v) { 7090 return n(v, 40); 7091 } 7092 /** 7093 * Return a new ``uint48`` type for %%v%%. 7094 */ 7095 static uint48(v) { 7096 return n(v, 48); 7097 } 7098 /** 7099 * Return a new ``uint56`` type for %%v%%. 7100 */ 7101 static uint56(v) { 7102 return n(v, 56); 7103 } 7104 /** 7105 * Return a new ``uint64`` type for %%v%%. 7106 */ 7107 static uint64(v) { 7108 return n(v, 64); 7109 } 7110 /** 7111 * Return a new ``uint72`` type for %%v%%. 7112 */ 7113 static uint72(v) { 7114 return n(v, 72); 7115 } 7116 /** 7117 * Return a new ``uint80`` type for %%v%%. 7118 */ 7119 static uint80(v) { 7120 return n(v, 80); 7121 } 7122 /** 7123 * Return a new ``uint88`` type for %%v%%. 7124 */ 7125 static uint88(v) { 7126 return n(v, 88); 7127 } 7128 /** 7129 * Return a new ``uint96`` type for %%v%%. 7130 */ 7131 static uint96(v) { 7132 return n(v, 96); 7133 } 7134 /** 7135 * Return a new ``uint104`` type for %%v%%. 7136 */ 7137 static uint104(v) { 7138 return n(v, 104); 7139 } 7140 /** 7141 * Return a new ``uint112`` type for %%v%%. 7142 */ 7143 static uint112(v) { 7144 return n(v, 112); 7145 } 7146 /** 7147 * Return a new ``uint120`` type for %%v%%. 7148 */ 7149 static uint120(v) { 7150 return n(v, 120); 7151 } 7152 /** 7153 * Return a new ``uint128`` type for %%v%%. 7154 */ 7155 static uint128(v) { 7156 return n(v, 128); 7157 } 7158 /** 7159 * Return a new ``uint136`` type for %%v%%. 7160 */ 7161 static uint136(v) { 7162 return n(v, 136); 7163 } 7164 /** 7165 * Return a new ``uint144`` type for %%v%%. 7166 */ 7167 static uint144(v) { 7168 return n(v, 144); 7169 } 7170 /** 7171 * Return a new ``uint152`` type for %%v%%. 7172 */ 7173 static uint152(v) { 7174 return n(v, 152); 7175 } 7176 /** 7177 * Return a new ``uint160`` type for %%v%%. 7178 */ 7179 static uint160(v) { 7180 return n(v, 160); 7181 } 7182 /** 7183 * Return a new ``uint168`` type for %%v%%. 7184 */ 7185 static uint168(v) { 7186 return n(v, 168); 7187 } 7188 /** 7189 * Return a new ``uint176`` type for %%v%%. 7190 */ 7191 static uint176(v) { 7192 return n(v, 176); 7193 } 7194 /** 7195 * Return a new ``uint184`` type for %%v%%. 7196 */ 7197 static uint184(v) { 7198 return n(v, 184); 7199 } 7200 /** 7201 * Return a new ``uint192`` type for %%v%%. 7202 */ 7203 static uint192(v) { 7204 return n(v, 192); 7205 } 7206 /** 7207 * Return a new ``uint200`` type for %%v%%. 7208 */ 7209 static uint200(v) { 7210 return n(v, 200); 7211 } 7212 /** 7213 * Return a new ``uint208`` type for %%v%%. 7214 */ 7215 static uint208(v) { 7216 return n(v, 208); 7217 } 7218 /** 7219 * Return a new ``uint216`` type for %%v%%. 7220 */ 7221 static uint216(v) { 7222 return n(v, 216); 7223 } 7224 /** 7225 * Return a new ``uint224`` type for %%v%%. 7226 */ 7227 static uint224(v) { 7228 return n(v, 224); 7229 } 7230 /** 7231 * Return a new ``uint232`` type for %%v%%. 7232 */ 7233 static uint232(v) { 7234 return n(v, 232); 7235 } 7236 /** 7237 * Return a new ``uint240`` type for %%v%%. 7238 */ 7239 static uint240(v) { 7240 return n(v, 240); 7241 } 7242 /** 7243 * Return a new ``uint248`` type for %%v%%. 7244 */ 7245 static uint248(v) { 7246 return n(v, 248); 7247 } 7248 /** 7249 * Return a new ``uint256`` type for %%v%%. 7250 */ 7251 static uint256(v) { 7252 return n(v, 256); 7253 } 7254 /** 7255 * Return a new ``uint256`` type for %%v%%. 7256 */ 7257 static uint(v) { 7258 return n(v, 256); 7259 } 7260 /** 7261 * Return a new ``int8`` type for %%v%%. 7262 */ 7263 static int8(v) { 7264 return n(v, -8); 7265 } 7266 /** 7267 * Return a new ``int16`` type for %%v%%. 7268 */ 7269 static int16(v) { 7270 return n(v, -16); 7271 } 7272 /** 7273 * Return a new ``int24`` type for %%v%%. 7274 */ 7275 static int24(v) { 7276 return n(v, -24); 7277 } 7278 /** 7279 * Return a new ``int32`` type for %%v%%. 7280 */ 7281 static int32(v) { 7282 return n(v, -32); 7283 } 7284 /** 7285 * Return a new ``int40`` type for %%v%%. 7286 */ 7287 static int40(v) { 7288 return n(v, -40); 7289 } 7290 /** 7291 * Return a new ``int48`` type for %%v%%. 7292 */ 7293 static int48(v) { 7294 return n(v, -48); 7295 } 7296 /** 7297 * Return a new ``int56`` type for %%v%%. 7298 */ 7299 static int56(v) { 7300 return n(v, -56); 7301 } 7302 /** 7303 * Return a new ``int64`` type for %%v%%. 7304 */ 7305 static int64(v) { 7306 return n(v, -64); 7307 } 7308 /** 7309 * Return a new ``int72`` type for %%v%%. 7310 */ 7311 static int72(v) { 7312 return n(v, -72); 7313 } 7314 /** 7315 * Return a new ``int80`` type for %%v%%. 7316 */ 7317 static int80(v) { 7318 return n(v, -80); 7319 } 7320 /** 7321 * Return a new ``int88`` type for %%v%%. 7322 */ 7323 static int88(v) { 7324 return n(v, -88); 7325 } 7326 /** 7327 * Return a new ``int96`` type for %%v%%. 7328 */ 7329 static int96(v) { 7330 return n(v, -96); 7331 } 7332 /** 7333 * Return a new ``int104`` type for %%v%%. 7334 */ 7335 static int104(v) { 7336 return n(v, -104); 7337 } 7338 /** 7339 * Return a new ``int112`` type for %%v%%. 7340 */ 7341 static int112(v) { 7342 return n(v, -112); 7343 } 7344 /** 7345 * Return a new ``int120`` type for %%v%%. 7346 */ 7347 static int120(v) { 7348 return n(v, -120); 7349 } 7350 /** 7351 * Return a new ``int128`` type for %%v%%. 7352 */ 7353 static int128(v) { 7354 return n(v, -128); 7355 } 7356 /** 7357 * Return a new ``int136`` type for %%v%%. 7358 */ 7359 static int136(v) { 7360 return n(v, -136); 7361 } 7362 /** 7363 * Return a new ``int144`` type for %%v%%. 7364 */ 7365 static int144(v) { 7366 return n(v, -144); 7367 } 7368 /** 7369 * Return a new ``int52`` type for %%v%%. 7370 */ 7371 static int152(v) { 7372 return n(v, -152); 7373 } 7374 /** 7375 * Return a new ``int160`` type for %%v%%. 7376 */ 7377 static int160(v) { 7378 return n(v, -160); 7379 } 7380 /** 7381 * Return a new ``int168`` type for %%v%%. 7382 */ 7383 static int168(v) { 7384 return n(v, -168); 7385 } 7386 /** 7387 * Return a new ``int176`` type for %%v%%. 7388 */ 7389 static int176(v) { 7390 return n(v, -176); 7391 } 7392 /** 7393 * Return a new ``int184`` type for %%v%%. 7394 */ 7395 static int184(v) { 7396 return n(v, -184); 7397 } 7398 /** 7399 * Return a new ``int92`` type for %%v%%. 7400 */ 7401 static int192(v) { 7402 return n(v, -192); 7403 } 7404 /** 7405 * Return a new ``int200`` type for %%v%%. 7406 */ 7407 static int200(v) { 7408 return n(v, -200); 7409 } 7410 /** 7411 * Return a new ``int208`` type for %%v%%. 7412 */ 7413 static int208(v) { 7414 return n(v, -208); 7415 } 7416 /** 7417 * Return a new ``int216`` type for %%v%%. 7418 */ 7419 static int216(v) { 7420 return n(v, -216); 7421 } 7422 /** 7423 * Return a new ``int224`` type for %%v%%. 7424 */ 7425 static int224(v) { 7426 return n(v, -224); 7427 } 7428 /** 7429 * Return a new ``int232`` type for %%v%%. 7430 */ 7431 static int232(v) { 7432 return n(v, -232); 7433 } 7434 /** 7435 * Return a new ``int240`` type for %%v%%. 7436 */ 7437 static int240(v) { 7438 return n(v, -240); 7439 } 7440 /** 7441 * Return a new ``int248`` type for %%v%%. 7442 */ 7443 static int248(v) { 7444 return n(v, -248); 7445 } 7446 /** 7447 * Return a new ``int256`` type for %%v%%. 7448 */ 7449 static int256(v) { 7450 return n(v, -256); 7451 } 7452 /** 7453 * Return a new ``int256`` type for %%v%%. 7454 */ 7455 static int(v) { 7456 return n(v, -256); 7457 } 7458 /** 7459 * Return a new ``bytes1`` type for %%v%%. 7460 */ 7461 static bytes1(v) { 7462 return b(v, 1); 7463 } 7464 /** 7465 * Return a new ``bytes2`` type for %%v%%. 7466 */ 7467 static bytes2(v) { 7468 return b(v, 2); 7469 } 7470 /** 7471 * Return a new ``bytes3`` type for %%v%%. 7472 */ 7473 static bytes3(v) { 7474 return b(v, 3); 7475 } 7476 /** 7477 * Return a new ``bytes4`` type for %%v%%. 7478 */ 7479 static bytes4(v) { 7480 return b(v, 4); 7481 } 7482 /** 7483 * Return a new ``bytes5`` type for %%v%%. 7484 */ 7485 static bytes5(v) { 7486 return b(v, 5); 7487 } 7488 /** 7489 * Return a new ``bytes6`` type for %%v%%. 7490 */ 7491 static bytes6(v) { 7492 return b(v, 6); 7493 } 7494 /** 7495 * Return a new ``bytes7`` type for %%v%%. 7496 */ 7497 static bytes7(v) { 7498 return b(v, 7); 7499 } 7500 /** 7501 * Return a new ``bytes8`` type for %%v%%. 7502 */ 7503 static bytes8(v) { 7504 return b(v, 8); 7505 } 7506 /** 7507 * Return a new ``bytes9`` type for %%v%%. 7508 */ 7509 static bytes9(v) { 7510 return b(v, 9); 7511 } 7512 /** 7513 * Return a new ``bytes10`` type for %%v%%. 7514 */ 7515 static bytes10(v) { 7516 return b(v, 10); 7517 } 7518 /** 7519 * Return a new ``bytes11`` type for %%v%%. 7520 */ 7521 static bytes11(v) { 7522 return b(v, 11); 7523 } 7524 /** 7525 * Return a new ``bytes12`` type for %%v%%. 7526 */ 7527 static bytes12(v) { 7528 return b(v, 12); 7529 } 7530 /** 7531 * Return a new ``bytes13`` type for %%v%%. 7532 */ 7533 static bytes13(v) { 7534 return b(v, 13); 7535 } 7536 /** 7537 * Return a new ``bytes14`` type for %%v%%. 7538 */ 7539 static bytes14(v) { 7540 return b(v, 14); 7541 } 7542 /** 7543 * Return a new ``bytes15`` type for %%v%%. 7544 */ 7545 static bytes15(v) { 7546 return b(v, 15); 7547 } 7548 /** 7549 * Return a new ``bytes16`` type for %%v%%. 7550 */ 7551 static bytes16(v) { 7552 return b(v, 16); 7553 } 7554 /** 7555 * Return a new ``bytes17`` type for %%v%%. 7556 */ 7557 static bytes17(v) { 7558 return b(v, 17); 7559 } 7560 /** 7561 * Return a new ``bytes18`` type for %%v%%. 7562 */ 7563 static bytes18(v) { 7564 return b(v, 18); 7565 } 7566 /** 7567 * Return a new ``bytes19`` type for %%v%%. 7568 */ 7569 static bytes19(v) { 7570 return b(v, 19); 7571 } 7572 /** 7573 * Return a new ``bytes20`` type for %%v%%. 7574 */ 7575 static bytes20(v) { 7576 return b(v, 20); 7577 } 7578 /** 7579 * Return a new ``bytes21`` type for %%v%%. 7580 */ 7581 static bytes21(v) { 7582 return b(v, 21); 7583 } 7584 /** 7585 * Return a new ``bytes22`` type for %%v%%. 7586 */ 7587 static bytes22(v) { 7588 return b(v, 22); 7589 } 7590 /** 7591 * Return a new ``bytes23`` type for %%v%%. 7592 */ 7593 static bytes23(v) { 7594 return b(v, 23); 7595 } 7596 /** 7597 * Return a new ``bytes24`` type for %%v%%. 7598 */ 7599 static bytes24(v) { 7600 return b(v, 24); 7601 } 7602 /** 7603 * Return a new ``bytes25`` type for %%v%%. 7604 */ 7605 static bytes25(v) { 7606 return b(v, 25); 7607 } 7608 /** 7609 * Return a new ``bytes26`` type for %%v%%. 7610 */ 7611 static bytes26(v) { 7612 return b(v, 26); 7613 } 7614 /** 7615 * Return a new ``bytes27`` type for %%v%%. 7616 */ 7617 static bytes27(v) { 7618 return b(v, 27); 7619 } 7620 /** 7621 * Return a new ``bytes28`` type for %%v%%. 7622 */ 7623 static bytes28(v) { 7624 return b(v, 28); 7625 } 7626 /** 7627 * Return a new ``bytes29`` type for %%v%%. 7628 */ 7629 static bytes29(v) { 7630 return b(v, 29); 7631 } 7632 /** 7633 * Return a new ``bytes30`` type for %%v%%. 7634 */ 7635 static bytes30(v) { 7636 return b(v, 30); 7637 } 7638 /** 7639 * Return a new ``bytes31`` type for %%v%%. 7640 */ 7641 static bytes31(v) { 7642 return b(v, 31); 7643 } 7644 /** 7645 * Return a new ``bytes32`` type for %%v%%. 7646 */ 7647 static bytes32(v) { 7648 return b(v, 32); 7649 } 7650 /** 7651 * Return a new ``address`` type for %%v%%. 7652 */ 7653 static address(v) { 7654 return new Typed(_gaurd, "address", v); 7655 } 7656 /** 7657 * Return a new ``bool`` type for %%v%%. 7658 */ 7659 static bool(v) { 7660 return new Typed(_gaurd, "bool", !!v); 7661 } 7662 /** 7663 * Return a new ``bytes`` type for %%v%%. 7664 */ 7665 static bytes(v) { 7666 return new Typed(_gaurd, "bytes", v); 7667 } 7668 /** 7669 * Return a new ``string`` type for %%v%%. 7670 */ 7671 static string(v) { 7672 return new Typed(_gaurd, "string", v); 7673 } 7674 /** 7675 * Return a new ``array`` type for %%v%%, allowing %%dynamic%% length. 7676 */ 7677 static array(v, dynamic) { 7678 throw new Error("not implemented yet"); 7679 } 7680 /** 7681 * Return a new ``tuple`` type for %%v%%, with the optional %%name%%. 7682 */ 7683 static tuple(v, name) { 7684 throw new Error("not implemented yet"); 7685 } 7686 /** 7687 * Return a new ``uint8`` type for %%v%%. 7688 */ 7689 static overrides(v) { 7690 return new Typed(_gaurd, "overrides", Object.assign({}, v)); 7691 } 7692 /** 7693 * Returns true only if %%value%% is a [[Typed]] instance. 7694 */ 7695 static isTyped(value) { 7696 return value && typeof value === "object" && "_typedSymbol" in value && value._typedSymbol === _typedSymbol; 7697 }
7698 /** 7699 * If the value is a [[Typed]] instance, validates the underlying value 7700 * and returns it, otherwise returns value directly. 7701 * 7702 * This is useful for functions that with to accept either a [[Typed]] 7703 * object or values. 7704 */ 7705 static dereference(value, type) { 7706 if (Typed.isTyped(value)) { 7707 if (value.type !== type) throw new Error(`invalid type: expecetd ${type}, got ${value.type}`); 7708 return value.value; 7709 } 7710 return value; 7711 } 7712}; 7713//#endregion 7714//#region node_modules/ethers/lib.esm/abi/coders/address.js 7715/** 7716* @_ignore 7717*/ 7718var AddressCoder = class extends Coder { 7719 constructor(localName) { 7720 super("address", "address", localName, false); 7721 } 7722 defaultValue() { 7723 return "0x0000000000000000000000000000000000000000"; 7724 } 7725 encode(writer, _value) { 7726 let value = Typed.dereference(_value, "string"); 7727 try { 7728 value = getAddress(value); 7729 } catch (error) { 7730 return this._throwError(error.message, _value); 7731 } 7732 return writer.writeValue(value); 7733 } 7734 decode(reader) { 7735 return getAddress(toBeHex(reader.readValue(), 20)); 7736 } 7737}; 7738//#endregion 7739//#region node_modules/ethers/lib.esm/abi/coders/anonymous.js 7740/** 7741* Clones the functionality of an existing Coder, but without a localName 7742* 7743* @_ignore 7744*/ 7745var AnonymousCoder = class extends Coder { 7746 coder; 7747 constructor(coder) { 7748 super(coder.name, coder.type, "_", coder.dynamic); 7749 this.coder = coder; 7750 } 7751 defaultValue() { 7752 return this.coder.defaultValue(); 7753 } 7754 encode(writer, value) { 7755 return this.coder.encode(writer, value); 7756 } 7757 decode(reader) { 7758 return this.coder.decode(reader); 7759 } 7760}; 7761//#endregion 7762//#region node_modules/ethers/lib.esm/abi/coders/array.js 7763/** 7764* @_ignore 7765*/ 7766function pack(writer, coders, values) { 7767 let arrayValues = []; 7768 if (Array.isArray(values)) arrayValues = values; 7769 else if (values && typeof values === "object") { 7770 let unique = {}; 7771 arrayValues = coders.map((coder) => { 7772 const name = coder.localName; 7773 assert(name, "cannot encode object for signature with missing names", "INVALID_ARGUMENT", { 7774 argument: "values", 7775 info: { coder }, 7776 value: values 7777 }); 7778 assert(!unique[name], "cannot encode object for signature with duplicate names", "INVALID_ARGUMENT", { 7779 argument: "values", 7780 info: { coder }, 7781 value: values 7782 }); 7783 unique[name] = true; 7784 return values[name]; 7785 }); 7786 } else assertArgument(false, "invalid tuple value", "tuple", values); 7787 assertArgument(coders.length === arrayValues.length, "types/value length mismatch", "tuple", values); 7788 let staticWriter = new Writer(); 7789 let dynamicWriter = new Writer(); 7790 let updateFuncs = []; 7791 coders.forEach((coder, index) => { 7792 let value = arrayValues[index]; 7793 if (coder.dynamic) { 7794 let dynamicOffset = dynamicWriter.length; 7795 coder.encode(dynamicWriter, value); 7796 let updateFunc = staticWriter.writeUpdatableValue(); 7797 updateFuncs.push((baseOffset) => { 7798 updateFunc(baseOffset + dynamicOffset); 7799 }); 7800 } else coder.encode(staticWriter, value); 7801 }); 7802 updateFuncs.forEach((func) => { 7803 func(staticWriter.length); 7804 }); 7805 let length = writer.appendWriter(staticWriter); 7806 length += writer.appendWriter(dynamicWriter); 7807 return length; 7808} 7809/** 7810* @_ignore 7811*/ 7812function unpack(reader, coders) { 7813 let values = []; 7814 let keys = []; 7815 let baseReader = reader.subReader(0); 7816 coders.forEach((coder) => { 7817 let value = null; 7818 if (coder.dynamic) { 7819 let offset = reader.readIndex(); 7820 let offsetReader = baseReader.subReader(offset); 7821 try { 7822 value = coder.decode(offsetReader); 7823 } catch (error) { 7824 if (isError(error, "BUFFER_OVERRUN")) throw error; 7825 value = error; 7826 value.baseType = coder.name; 7827 value.name = coder.localName; 7828 value.type = coder.type; 7829 } 7830 } else try { 7831 value = coder.decode(reader); 7832 } catch (error) { 7833 if (isError(error, "BUFFER_OVERRUN")) throw error; 7834 value = error; 7835 value.baseType = coder.name; 7836 value.name = coder.localName; 7837 value.type = coder.type; 7838 } 7839 if (value == void 0) throw new Error("investigate"); 7840 values.push(value); 7841 keys.push(coder.localName || null); 7842 }); 7843 return Result.fromItems(values, keys); 7844} 7845/** 7846* @_ignore 7847*/ 7848var ArrayCoder = class extends Coder { 7849 coder; 7850 length; 7851 constructor(coder, length, localName) { 7852 const type = coder.type + "[" + (length >= 0 ? length : "") + "]"; 7853 const dynamic = length === -1 || coder.dynamic; 7854 super("array", type, localName, dynamic); 7855 defineProperties(this, { 7856 coder, 7857 length 7858 }); 7859 } 7860 defaultValue() {
7861 const defaultChild = this.coder.defaultValue(); 7862 const result = []; 7863 for (let i = 0; i < this.length; i++) result.push(defaultChild); 7864 return result; 7865 } 7866 encode(writer, _value) { 7867 const value = Typed.dereference(_value, "array"); 7868 if (!Array.isArray(value)) this._throwError("expected array value", value); 7869 let count = this.length; 7870 if (count === -1) { 7871 count = value.length; 7872 writer.writeValue(value.length); 7873 } 7874 assertArgumentCount(value.length, count, "coder array" + (this.localName ? " " + this.localName : "")); 7875 let coders = []; 7876 for (let i = 0; i < value.length; i++) coders.push(this.coder); 7877 return pack(writer, coders, value); 7878 } 7879 decode(reader) { 7880 let count = this.length; 7881 if (count === -1) { 7882 count = reader.readIndex(); 7883 assert(count * 32 <= reader.dataLength, "insufficient data length", "BUFFER_OVERRUN", { 7884 buffer: reader.bytes, 7885 offset: count * 32, 7886 length: reader.dataLength 7887 }); 7888 } 7889 let coders = []; 7890 for (let i = 0; i < count; i++) coders.push(new AnonymousCoder(this.coder)); 7891 return unpack(reader, coders); 7892 } 7893}; 7894//#endregion 7895//#region node_modules/ethers/lib.esm/abi/coders/boolean.js 7896/** 7897* @_ignore 7898*/ 7899var BooleanCoder = class extends Coder { 7900 constructor(localName) { 7901 super("bool", "bool", localName, false); 7902 } 7903 defaultValue() { 7904 return false; 7905 } 7906 encode(writer, _value) { 7907 const value = Typed.dereference(_value, "bool"); 7908 return writer.writeValue(value ? 1 : 0); 7909 } 7910 decode(reader) { 7911 return !!reader.readValue(); 7912 } 7913}; 7914//#endregion 7915//#region node_modules/ethers/lib.esm/abi/coders/bytes.js 7916/** 7917* @_ignore 7918*/ 7919var DynamicBytesCoder = class extends Coder { 7920 constructor(type, localName) { 7921 super(type, type, localName, true); 7922 } 7923 defaultValue() { 7924 return "0x"; 7925 } 7926 encode(writer, value) { 7927 value = getBytesCopy(value); 7928 let length = writer.writeValue(value.length); 7929 length += writer.writeBytes(value); 7930 return length; 7931 } 7932 decode(reader) { 7933 return reader.readBytes(reader.readIndex(), true); 7934 } 7935}; 7936/** 7937* @_ignore 7938*/ 7939var BytesCoder = class extends DynamicBytesCoder { 7940 constructor(localName) { 7941 super("bytes", localName); 7942 } 7943 decode(reader) { 7944 return hexlify(super.decode(reader)); 7945 } 7946}; 7947//#endregion 7948//#region node_modules/ethers/lib.esm/abi/coders/fixed-bytes.js 7949/** 7950* @_ignore 7951*/ 7952var FixedBytesCoder = class extends Coder { 7953 size; 7954 constructor(size, localName) { 7955 let name = "bytes" + String(size); 7956 super(name, name, localName, false); 7957 defineProperties(this, { size }, { size: "number" }); 7958 } 7959 defaultValue() { 7960 return "0x0000000000000000000000000000000000000000000000000000000000000000".substring(0, 2 + this.size * 2); 7961 } 7962 encode(writer, _value) { 7963 let data = getBytesCopy(Typed.dereference(_value, this.type)); 7964 if (data.length !== this.size) this._throwError("incorrect data length", _value); 7965 return writer.writeBytes(data); 7966 } 7967 decode(reader) { 7968 return hexlify(reader.readBytes(this.size)); 7969 } 7970}; 7971//#endregion 7972//#region node_modules/ethers/lib.esm/abi/coders/null.js 7973var Empty = new Uint8Array([]); 7974/** 7975* @_ignore 7976*/ 7977var NullCoder = class extends Coder { 7978 constructor(localName) { 7979 super("null", "", localName, false); 7980 } 7981 defaultValue() { 7982 return null; 7983 } 7984 encode(writer, value) { 7985 if (value != null) this._throwError("not null", value); 7986 return writer.writeBytes(Empty); 7987 } 7988 decode(reader) { 7989 reader.readBytes(0); 7990 return null; 7991 } 7992}; 7993//#endregion 7994//#region node_modules/ethers/lib.esm/abi/coders/number.js 7995var BN_0$5 = BigInt(0); 7996var BN_1$2 = BigInt(1); 7997var BN_MAX_UINT256$1 = BigInt("0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"); 7998/** 7999* @_ignore 8000*/ 8001var NumberCoder = class extends Coder { 8002 size; 8003 signed; 8004 constructor(size, signed, localName) { 8005 const name = (signed ? "int" : "uint") + size * 8; 8006 super(name, name, localName, false); 8007 defineProperties(this, { 8008 size, 8009 signed 8010 }, { 8011 size: "number", 8012 signed: "boolean" 8013 }); 8014 } 8015 defaultValue() { 8016 return 0; 8017 } 8018 encode(writer, _value) { 8019 let value = getBigInt(Typed.dereference(_value, this.type)); 8020 let maxUintValue = mask(BN_MAX_UINT256$1, 256); 8021 if (this.signed) { 8022 let bounds = mask(maxUintValue, this.size * 8 - 1); 8023 if (value > bounds || value < -(bounds + BN_1$2)) this._throwError("value out-of-bounds", _value); 8024 value = toTwos(value, 256); 8025 } else if (value < BN_0$5 || value > mask(maxUintValue, this.size * 8)) this._throwError("value out-of-bounds", _value); 8026 return writer.writeValue(value); 8027 } 8028 decode(reader) { 8029 let value = mask(reader.readValue(), this.size * 8); 8030 if (this.signed) value = fromTwos(value, this.size * 8); 8031 return value; 8032 } 8033}; 8034//#endregion 8035//#region node_modules/ethers/lib.esm/abi/coders/string.js 8036/** 8037* @_ignore 8038*/ 8039var StringCoder = class extends DynamicBytesCoder { 8040 constructor(localName) { 8041 super("string", localName); 8042 } 8043 defaultValue() { 8044 return ""; 8045 } 8046 encode(writer, _value) { 8047 return super.encode(writer, toUtf8Bytes(Typed.dereference(_value, "string"))); 8048 } 8049 decode(reader) { 8050 return toUtf8String(super.decode(reader)); 8051 } 8052}; 8053//#endregion 8054//#region node_modules/ethers/lib.esm/abi/coders/tuple.js 8055/** 8056* @_ignore 8057*/ 8058var TupleCoder = class extends Coder { 8059 coders; 8060 constructor(coders, localName) { 8061 let dynamic = false;
8062 const types = []; 8063 coders.forEach((coder) => { 8064 if (coder.dynamic) dynamic = true; 8065 types.push(coder.type); 8066 }); 8067 const type = "tuple(" + types.join(",") + ")"; 8068 super("tuple", type, localName, dynamic); 8069 defineProperties(this, { coders: Object.freeze(coders.slice()) }); 8070 } 8071 defaultValue() { 8072 const values = []; 8073 this.coders.forEach((coder) => { 8074 values.push(coder.defaultValue()); 8075 }); 8076 const uniqueNames = this.coders.reduce((accum, coder) => { 8077 const name = coder.localName; 8078 if (name) { 8079 if (!accum[name]) accum[name] = 0; 8080 accum[name]++; 8081 } 8082 return accum; 8083 }, {}); 8084 this.coders.forEach((coder, index) => { 8085 let name = coder.localName; 8086 if (!name || uniqueNames[name] !== 1) return; 8087 if (name === "length") name = "_length"; 8088 if (values[name] != null) return; 8089 values[name] = values[index]; 8090 }); 8091 return Object.freeze(values); 8092 } 8093 encode(writer, _value) { 8094 const value = Typed.dereference(_value, "tuple"); 8095 return pack(writer, this.coders, value); 8096 } 8097 decode(reader) { 8098 return unpack(reader, this.coders); 8099 } 8100}; 8101//#endregion 8102//#region node_modules/ethers/lib.esm/transaction/accesslist.js 8103function accessSetify(addr, storageKeys) { 8104 return { 8105 address: getAddress(addr), 8106 storageKeys: storageKeys.map((storageKey, index) => { 8107 assertArgument(isHexString(storageKey, 32), "invalid slot", `storageKeys[${index}]`, storageKey); 8108 return storageKey.toLowerCase(); 8109 }) 8110 }; 8111} 8112/** 8113* Returns a [[AccessList]] from any ethers-supported access-list structure. 8114*/ 8115function accessListify(value) { 8116 if (Array.isArray(value)) return value.map((set, index) => { 8117 if (Array.isArray(set)) { 8118 assertArgument(set.length === 2, "invalid slot set", `value[${index}]`, set); 8119 return accessSetify(set[0], set[1]); 8120 } 8121 assertArgument(set != null && typeof set === "object", "invalid address-slot set", "value", value); 8122 return accessSetify(set.address, set.storageKeys); 8123 }); 8124 assertArgument(value != null && typeof value === "object", "invalid access list", "value", value); 8125 const result = Object.keys(value).map((addr) => { 8126 const storageKeys = value[addr].reduce((accum, storageKey) => { 8127 accum[storageKey] = true; 8128 return accum; 8129 }, {}); 8130 return accessSetify(addr, Object.keys(storageKeys).sort()); 8131 }); 8132 result.sort((a, b) => a.address.localeCompare(b.address)); 8133 return result; 8134} 8135//#endregion 8136//#region node_modules/ethers/lib.esm/transaction/authorization.js 8137function authorizationify(auth) { 8138 return { 8139 address: getAddress(auth.address), 8140 nonce: getBigInt(auth.nonce != null ? auth.nonce : 0), 8141 chainId: getBigInt(auth.chainId != null ? auth.chainId : 0), 8142 signature: Signature.from(auth.signature) 8143 }; 8144} 8145//#endregion 8146//#region node_modules/ethers/lib.esm/transaction/address.js 8147/** 8148* Returns the address for the %%key%%. 8149* 8150* The key may be any standard form of public key or a private key. 8151*/ 8152function computeAddress(key) { 8153 let pubkey; 8154 if (typeof key === "string") pubkey = SigningKey.computePublicKey(key, false); 8155 else pubkey = key.publicKey; 8156 return getAddress(keccak256("0x" + pubkey.substring(4)).substring(26)); 8157} 8158/** 8159* Returns the recovered address for the private key that was 8160* used to sign %%digest%% that resulted in %%signature%%. 8161*/ 8162function recoverAddress(digest, signature) { 8163 return computeAddress(SigningKey.recoverPublicKey(digest, signature)); 8164} 8165//#endregion 8166//#region node_modules/ethers/lib.esm/transaction/transaction.js 8167var BN_0$4 = BigInt(0); 8168var BN_2$2 = BigInt(2); 8169var BN_27 = BigInt(27); 8170var BN_28 = BigInt(28); 8171var BN_35 = BigInt(35); 8172var BN_MAX_UINT = BigInt("0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"); 8173var inspect$2 = Symbol.for("nodejs.util.inspect.custom"); 8174var BLOB_SIZE = 131072; 8175var CELL_COUNT = 128; 8176function getKzgLibrary(kzg) { 8177 const blobToKzgCommitment = (blob) => { 8178 if ("computeBlobProof" in kzg) { 8179 if ("blobToKzgCommitment" in kzg && typeof kzg.blobToKzgCommitment === "function") return getBytes(kzg.blobToKzgCommitment(hexlify(blob))); 8180 } else if ("blobToKzgCommitment" in kzg && typeof kzg.blobToKzgCommitment === "function") return getBytes(kzg.blobToKzgCommitment(blob)); 8181 if ("blobToKZGCommitment" in kzg && typeof kzg.blobToKZGCommitment === "function") return getBytes(kzg.blobToKZGCommitment(hexlify(blob))); 8182 assertArgument(false, "unsupported KZG library", "kzg", kzg); 8183 }; 8184 const computeBlobKzgProof = (blob, commitment) => { 8185 if ("computeBlobProof" in kzg && typeof kzg.computeBlobProof === "function") return getBytes(kzg.computeBlobProof(hexlify(blob), hexlify(commitment))); 8186 if ("computeBlobKzgProof" in kzg && typeof kzg.computeBlobKzgProof === "function") return kzg.computeBlobKzgProof(blob, commitment); 8187 if ("computeBlobKZGProof" in kzg && typeof kzg.computeBlobKZGProof === "function") return getBytes(kzg.computeBlobKZGProof(hexlify(blob), hexlify(commitment))); 8188 assertArgument(false, "unsupported KZG library", "kzg", kzg); 8189 }; 8190 return { 8191 blobToKzgCommitment, 8192 computeBlobKzgProof 8193 }; 8194} 8195function getVersionedHash(version, hash) { 8196 let versioned = version.toString(16); 8197 while (versioned.length < 2) versioned = "0" + versioned; 8198 versioned += sha256(hash).substring(4); 8199 return "0x" + versioned; 8200} 8201function handleAddress(value) { 8202 if (value === "0x") return null; 8203 return getAddress(value); 8204} 8205function handleAccessList(value, param) { 8206 try { 8207 return accessListify(value); 8208 } catch (error) { 8209 assertArgument(false, error.message, param, value); 8210 } 8211} 8212function handleAuthorizationList(value, param) { 8213 try { 8214 if (!Array.isArray(value)) throw new Error("authorizationList: invalid array"); 8215 const result = []; 8216 for (let i = 0; i < value.length; i++) { 8217 const auth = value[i]; 8218 if (!Array.isArray(auth)) throw new Error(`authorization[${i}
8218]: invalid array`); 8219 if (auth.length !== 6) throw new Error(`authorization[${i}]: wrong length`); 8220 if (!auth[1]) throw new Error(`authorization[${i}]: null address`); 8221 result.push({ 8222 address: handleAddress(auth[1]), 8223 nonce: handleUint(auth[2], "nonce"), 8224 chainId: handleUint(auth[0], "chainId"), 8225 signature: Signature.from({ 8226 yParity: handleNumber(auth[3], "yParity"), 8227 r: zeroPadValue(auth[4], 32), 8228 s: zeroPadValue(auth[5], 32) 8229 }) 8230 }); 8231 } 8232 return result; 8233 } catch (error) { 8234 assertArgument(false, error.message, param, value); 8235 } 8236} 8237function handleNumber(_value, param) { 8238 if (_value === "0x") return 0; 8239 return getNumber(_value, param); 8240} 8241function handleUint(_value, param) { 8242 if (_value === "0x") return BN_0$4; 8243 const value = getBigInt(_value, param); 8244 assertArgument(value <= BN_MAX_UINT, "value exceeds uint size", param, value); 8245 return value; 8246} 8247function formatNumber(_value, name) { 8248 const value = getBigInt(_value, "value"); 8249 const result = toBeArray(value); 8250 assertArgument(result.length <= 32, `value too large`, `tx.${name}`, value); 8251 return result; 8252} 8253function formatAccessList(value) { 8254 return accessListify(value).map((set) => [set.address, set.storageKeys]); 8255} 8256function formatAuthorizationList(value) { 8257 return value.map((a) => { 8258 return [ 8259 formatNumber(a.chainId, "chainId"), 8260 a.address, 8261 formatNumber(a.nonce, "nonce"), 8262 formatNumber(a.signature.yParity, "yParity"), 8263 toBeArray(a.signature.r), 8264 toBeArray(a.signature._s) 8265 ]; 8266 }); 8267} 8268function formatHashes(value, param) { 8269 assertArgument(Array.isArray(value), `invalid ${param}`, "value", value); 8270 for (let i = 0; i < value.length; i++) assertArgument(isHexString(value[i], 32), "invalid ${ param } hash", `value[${i}]`, value[i]); 8271 return value; 8272} 8273function _parseLegacy(data) { 8274 const fields = decodeRlp(data); 8275 assertArgument(Array.isArray(fields) && (fields.length === 9 || fields.length === 6), "invalid field count for legacy transaction", "data", data); 8276 const tx = { 8277 type: 0, 8278 nonce: handleNumber(fields[0], "nonce"), 8279 gasPrice: handleUint(fields[1], "gasPrice"), 8280 gasLimit: handleUint(fields[2], "gasLimit"), 8281 to: handleAddress(fields[3]), 8282 value: handleUint(fields[4], "value"), 8283 data: hexlify(fields[5]), 8284 chainId: BN_0$4 8285 }; 8286 if (fields.length === 6) return tx; 8287 const v = handleUint(fields[6], "v"); 8288 const r = handleUint(fields[7], "r"); 8289 const s = handleUint(fields[8], "s"); 8290 if (r === BN_0$4 && s === BN_0$4) tx.chainId = v; 8291 else { 8292 let chainId = (v - BN_35) / BN_2$2; 8293 if (chainId < BN_0$4) chainId = BN_0$4; 8294 tx.chainId = chainId; 8295 assertArgument(chainId !== BN_0$4 || v === BN_27 || v === BN_28, "non-canonical legacy v", "v", fields[6]); 8296 tx.signature = Signature.from({ 8297 r: zeroPadValue(fields[7], 32), 8298 s: zeroPadValue(fields[8], 32), 8299 v 8300 }); 8301 } 8302 return tx; 8303} 8304function _serializeLegacy(tx, sig) { 8305 const fields = [ 8306 formatNumber(tx.nonce, "nonce"), 8307 formatNumber(tx.gasPrice || 0, "gasPrice"), 8308 formatNumber(tx.gasLimit, "gasLimit"), 8309 tx.to || "0x", 8310 formatNumber(tx.value, "value"), 8311 tx.data 8312 ]; 8313 let chainId = BN_0$4; 8314 if (tx.chainId != BN_0$4) { 8315 chainId = getBigInt(tx.chainId, "tx.chainId"); 8316 assertArgument(!sig || sig.networkV == null || sig.legacyChainId === chainId, "tx.chainId/sig.v mismatch", "sig", sig); 8317 } else if (tx.signature) { 8318 const legacy = tx.signature.legacyChainId; 8319 if (legacy != null) chainId = legacy; 8320 } 8321 if (!sig) { 8322 if (chainId !== BN_0$4) { 8323 fields.push(toBeArray(chainId)); 8324 fields.push("0x"); 8325 fields.push("0x"); 8326 } 8327 return encodeRlp(fields); 8328 } 8329 let v = BigInt(27 + sig.yParity); 8330 if (chainId !== BN_0$4) v = Signature.getChainIdV(chainId, sig.v); 8331 else if (BigInt(sig.v) !== v) assertArgument(false, "tx.chainId/sig.v mismatch", "sig", sig); 8332 fields.push(toBeArray(v)); 8333 fields.push(toBeArray(sig.r)); 8334 fields.push(toBeArray(sig._s)); 8335 return encodeRlp(fields); 8336} 8337function _parseEipSignature(tx, fields) { 8338 let yParity; 8339 try { 8340 yParity = handleNumber(fields[0], "yParity"); 8341 if (yParity !== 0 && yParity !== 1) throw new Error("bad yParity"); 8342 } catch (error) { 8343 assertArgument(false, "invalid yParity", "yParity", fields[0]); 8344 } 8345 const r = zeroPadValue(fields[1], 32); 8346 const s = zeroPadValue(fields[2], 32); 8347 tx.signature = Signature.from({ 8348 r, 8349 s, 8350 yParity 8351 }); 8352} 8353function _parseEip1559(data) { 8354 const fields = decodeRlp(getBytes(data).slice(1)); 8355 assertArgument(Array.isArray(fields) && (fields.length === 9 || fields.length === 12), "invalid field count for transaction type: 2", "data", hexlify(data)); 8356 const tx = { 8357 type: 2, 8358 chainId: handleUint(fields[0], "chainId"), 8359 nonce: handleNumber(fields[1], "nonce"), 8360 maxPriorityFeePerGas: handleUint(fields[2], "maxPriorityFeePerGas"), 8361 maxFeePerGas: handleUint(fields[3], "maxFeePerGas"), 8362 gasPrice: null,
vendor: 4,896 bytes, lines 8363-8477
8363 gasLimit: handleUint(fields[4], "gasLimit"), 8364 to: handleAddress(fields[5]), 8365 value: handleUint(fields[6], "value"), 8366 data: hexlify(fields[7]), 8367 accessList: handleAccessList(fields[8], "accessList") 8368 }; 8369 if (fields.length === 9) return tx; 8370 _parseEipSignature(tx, fields.slice(9)); 8371 return tx; 8372} 8373function _serializeEip1559(tx, sig) { 8374 const fields = [ 8375 formatNumber(tx.chainId, "chainId"), 8376 formatNumber(tx.nonce, "nonce"), 8377 formatNumber(tx.maxPriorityFeePerGas || 0, "maxPriorityFeePerGas"), 8378 formatNumber(tx.maxFeePerGas || 0, "maxFeePerGas"), 8379 formatNumber(tx.gasLimit, "gasLimit"), 8380 tx.to || "0x", 8381 formatNumber(tx.value, "value"), 8382 tx.data, 8383 formatAccessList(tx.accessList || []) 8384 ]; 8385 if (sig) { 8386 fields.push(formatNumber(sig.yParity, "yParity")); 8387 fields.push(toBeArray(sig.r)); 8388 fields.push(toBeArray(sig.s)); 8389 } 8390 return concat(["0x02", encodeRlp(fields)]); 8391} 8392function _parseEip2930(data) { 8393 const fields = decodeRlp(getBytes(data).slice(1)); 8394 assertArgument(Array.isArray(fields) && (fields.length === 8 || fields.length === 11), "invalid field count for transaction type: 1", "data", hexlify(data)); 8395 const tx = { 8396 type: 1, 8397 chainId: handleUint(fields[0], "chainId"), 8398 nonce: handleNumber(fields[1], "nonce"), 8399 gasPrice: handleUint(fields[2], "gasPrice"), 8400 gasLimit: handleUint(fields[3], "gasLimit"), 8401 to: handleAddress(fields[4]), 8402 value: handleUint(fields[5], "value"), 8403 data: hexlify(fields[6]), 8404 accessList: handleAccessList(fields[7], "accessList") 8405 }; 8406 if (fields.length === 8) return tx; 8407 _parseEipSignature(tx, fields.slice(8)); 8408 return tx; 8409} 8410function _serializeEip2930(tx, sig) { 8411 const fields = [ 8412 formatNumber(tx.chainId, "chainId"), 8413 formatNumber(tx.nonce, "nonce"), 8414 formatNumber(tx.gasPrice || 0, "gasPrice"), 8415 formatNumber(tx.gasLimit, "gasLimit"), 8416 tx.to || "0x", 8417 formatNumber(tx.value, "value"), 8418 tx.data, 8419 formatAccessList(tx.accessList || []) 8420 ]; 8421 if (sig) { 8422 fields.push(formatNumber(sig.yParity, "recoveryParam")); 8423 fields.push(toBeArray(sig.r)); 8424 fields.push(toBeArray(sig.s)); 8425 } 8426 return concat(["0x01", encodeRlp(fields)]); 8427} 8428function _parseEip4844(data) { 8429 let fields = decodeRlp(getBytes(data).slice(1)); 8430 let typeName = "3"; 8431 let blobWrapperVersion = null; 8432 let blobs = null; 8433 if (fields.length === 4 && Array.isArray(fields[0])) { 8434 typeName = "3 (network format)"; 8435 const fBlobs = fields[1], fCommits = fields[2], fProofs = fields[3]; 8436 assertArgument(Array.isArray(fBlobs), "invalid network format: blobs not an array", "fields[1]", fBlobs); 8437 assertArgument(Array.isArray(fCommits), "invalid network format: commitments not an array", "fields[2]", fCommits); 8438 assertArgument(Array.isArray(fProofs), "invalid network format: proofs not an array", "fields[3]", fProofs); 8439 assertArgument(fBlobs.length === fCommits.length, "invalid network format: blobs/commitments length mismatch", "fields", fields); 8440 assertArgument(fBlobs.length === fProofs.length, "invalid network format: blobs/proofs length mismatch", "fields", fields); 8441 blobs = []; 8442 for (let i = 0; i < fields[1].length; i++) blobs.push({ 8443 data: fBlobs[i], 8444 commitment: fCommits[i], 8445 proof: fProofs[i] 8446 }); 8447 fields = fields[0]; 8448 } else if (fields.length === 5 && Array.isArray(fields[0])) { 8449 typeName = "3 (EIP-7594 network format)"; 8450 blobWrapperVersion = getNumber(fields[1]); 8451 const fBlobs = fields[2], fCommits = fields[3], fProofs = fields[4]; 8452 assertArgument(blobWrapperVersion === 1, `unsupported EIP-7594 network format version: ${blobWrapperVersion}`, "fields[1]", blobWrapperVersion); 8453 assertArgument(Array.isArray(fBlobs), "invalid EIP-7594 network format: blobs not an array", "fields[2]", fBlobs); 8454 assertArgument(Array.isArray(fCommits), "invalid EIP-7594 network format: commitments not an array", "fields[3]", fCommits); 8455 assertArgument(Array.isArray(fProofs), "invalid EIP-7594 network format: proofs not an array", "fields[4]", fProofs); 8456 assertArgument(fBlobs.length === fCommits.length, "invalid network format: blobs/commitments length mismatch", "fields", fields); 8457 assertArgument(fBlobs.length * CELL_COUNT === fProofs.length, "invalid network format: blobs/proofs length mismatch", "fields", fields); 8458 blobs = []; 8459 for (let i = 0; i < fBlobs.length; i++) { 8460 const proof = []; 8461 for (let j = 0; j < CELL_COUNT; j++) proof.push(fProofs[i * CELL_COUNT + j]); 8462 blobs.push({ 8463 data: fBlobs[i], 8464 commitment: fCommits[i], 8465 proof: concat(proof) 8466 }); 8467 } 8468 fields = fields[0]; 8469 } 8470 assertArgument(Array.isArray(fields) && (fields.length === 11 || fields.length === 14), `invalid field count for transaction type: ${typeName}`, "data", hexlify(data)); 8471 const tx = { 8472 type: 3, 8473 chainId: handleUint(fields[0], "chainId"), 8474 nonce: handleNumber(fields[1], "nonce"), 8475 maxPriorityFeePerGas: handleUint(fields[2], "maxPriorityFeePerGas"), 8476 maxFeePerGas: handleUint(fields[3], "maxFeePerGas"), 8477 gasPrice: null,
8478 gasLimit: handleUint(fields[4], "gasLimit"), 8479 to: handleAddress(fields[5]), 8480 value: handleUint(fields[6], "value"), 8481 data: hexlify(fields[7]), 8482 accessList: handleAccessList(fields[8], "accessList"), 8483 maxFeePerBlobGas: handleUint(fields[9], "maxFeePerBlobGas"), 8484 blobVersionedHashes: fields[10], 8485 blobWrapperVersion 8486 }; 8487 if (blobs) tx.blobs = blobs; 8488 assertArgument(tx.to != null, `invalid address for transaction type: ${typeName}`, "data", data); 8489 assertArgument(Array.isArray(tx.blobVersionedHashes), "invalid blobVersionedHashes: must be an array", "data", data); 8490 for (let i = 0; i < tx.blobVersionedHashes.length; i++) assertArgument(isHexString(tx.blobVersionedHashes[i], 32), `invalid blobVersionedHash at index ${i}: must be length 32`, "data", data); 8491 if (fields.length === 11) return tx; 8492 _parseEipSignature(tx, fields.slice(11)); 8493 return tx; 8494} 8495function _serializeEip4844(tx, sig, blobs) { 8496 const fields = [ 8497 formatNumber(tx.chainId, "chainId"), 8498 formatNumber(tx.nonce, "nonce"), 8499 formatNumber(tx.maxPriorityFeePerGas || 0, "maxPriorityFeePerGas"), 8500 formatNumber(tx.maxFeePerGas || 0, "maxFeePerGas"), 8501 formatNumber(tx.gasLimit, "gasLimit"), 8502 tx.to || "0x0000000000000000000000000000000000000000", 8503 formatNumber(tx.value, "value"), 8504 tx.data, 8505 formatAccessList(tx.accessList || []), 8506 formatNumber(tx.maxFeePerBlobGas || 0, "maxFeePerBlobGas"), 8507 formatHashes(tx.blobVersionedHashes || [], "blobVersionedHashes") 8508 ]; 8509 if (sig) { 8510 fields.push(formatNumber(sig.yParity, "yParity")); 8511 fields.push(toBeArray(sig.r)); 8512 fields.push(toBeArray(sig.s)); 8513 if (blobs) { 8514 if (tx.blobWrapperVersion != null) { 8515 const wrapperVersion = toBeArray(tx.blobWrapperVersion); 8516 const cellProofs = []; 8517 for (const { proof } of blobs) { 8518 const p = getBytes(proof); 8519 const cellSize = p.length / CELL_COUNT; 8520 for (let i = 0; i < p.length; i += cellSize) cellProofs.push(p.subarray(i, i + cellSize)); 8521 } 8522 return concat(["0x03", encodeRlp([ 8523 fields, 8524 wrapperVersion, 8525 blobs.map((b) => b.data), 8526 blobs.map((b) => b.commitment), 8527 cellProofs 8528 ])]); 8529 } 8530 return concat(["0x03", encodeRlp([ 8531 fields, 8532 blobs.map((b) => b.data), 8533 blobs.map((b) => b.commitment), 8534 blobs.map((b) => b.proof) 8535 ])]); 8536 } 8537 } 8538 return concat(["0x03", encodeRlp(fields)]); 8539} 8540function _parseEip7702(data) { 8541 const fields = decodeRlp(getBytes(data).slice(1)); 8542 assertArgument(Array.isArray(fields) && (fields.length === 10 || fields.length === 13), "invalid field count for transaction type: 4", "data", hexlify(data)); 8543 const tx = { 8544 type: 4, 8545 chainId: handleUint(fields[0], "chainId"), 8546 nonce: handleNumber(fields[1], "nonce"), 8547 maxPriorityFeePerGas: handleUint(fields[2], "maxPriorityFeePerGas"), 8548 maxFeePerGas: handleUint(fields[3], "maxFeePerGas"), 8549 gasPrice: null, 8550 gasLimit: handleUint(fields[4], "gasLimit"), 8551 to: handleAddress(fields[5]), 8552 value: handleUint(fields[6], "value"), 8553 data: hexlify(fields[7]), 8554 accessList: handleAccessList(fields[8], "accessList"), 8555 authorizationList: handleAuthorizationList(fields[9], "authorizationList") 8556 }; 8557 if (fields.length === 10) return tx; 8558 _parseEipSignature(tx, fields.slice(10)); 8559 return tx; 8560} 8561function _serializeEip7702(tx, sig) { 8562 const fields = [ 8563 formatNumber(tx.chainId, "chainId"), 8564 formatNumber(tx.nonce, "nonce"), 8565 formatNumber(tx.maxPriorityFeePerGas || 0, "maxPriorityFeePerGas"), 8566 formatNumber(tx.maxFeePerGas || 0, "maxFeePerGas"), 8567 formatNumber(tx.gasLimit, "gasLimit"), 8568 tx.to || "0x", 8569 formatNumber(tx.value, "value"), 8570 tx.data, 8571 formatAccessList(tx.accessList || []), 8572 formatAuthorizationList(tx.authorizationList || []) 8573 ]; 8574 if (sig) { 8575 fields.push(formatNumber(sig.yParity, "yParity")); 8576 fields.push(toBeArray(sig.r)); 8577 fields.push(toBeArray(sig.s)); 8578 } 8579 return concat(["0x04", encodeRlp(fields)]); 8580} 8581/** 8582* A **Transaction** describes an operation to be executed on 8583* Ethereum by an Externally Owned Account (EOA). It includes 8584* who (the [[to]] address), what (the [[data]]) and how much (the 8585* [[value]] in ether) the operation should entail. 8586* 8587* @example: 8588* tx = new Transaction() 8589* //_result: 8590* 8591* tx.data = "0x1234"; 8592* //_result: 8593*/ 8594var Transaction = class Transaction { 8595 #type; 8596 #to; 8597 #data; 8598 #nonce;
vendor: 1,952 bytes, lines 8599-8704
8599 #gasLimit; 8600 #gasPrice; 8601 #maxPriorityFeePerGas; 8602 #maxFeePerGas; 8603 #value; 8604 #chainId; 8605 #sig; 8606 #accessList; 8607 #maxFeePerBlobGas; 8608 #blobVersionedHashes; 8609 #kzg; 8610 #blobs; 8611 #auths; 8612 #blobWrapperVersion; 8613 /** 8614 * The transaction type. 8615 * 8616 * If null, the type will be automatically inferred based on 8617 * explicit properties. 8618 */ 8619 get type() { 8620 return this.#type; 8621 } 8622 set type(value) { 8623 switch (value) { 8624 case null: 8625 this.#type = null; 8626 break; 8627 case 0: 8628 case "legacy": 8629 this.#type = 0; 8630 break; 8631 case 1: 8632 case "berlin": 8633 case "eip-2930": 8634 this.#type = 1; 8635 break; 8636 case 2: 8637 case "london": 8638 case "eip-1559": 8639 this.#type = 2; 8640 break; 8641 case 3: 8642 case "cancun": 8643 case "eip-4844": 8644 this.#type = 3; 8645 break; 8646 case 4: 8647 case "pectra": 8648 case "eip-7702": 8649 this.#type = 4; 8650 break; 8651 default: assertArgument(false, "unsupported transaction type", "type", value); 8652 } 8653 } 8654 /** 8655 * The name of the transaction type. 8656 */ 8657 get typeName() { 8658 switch (this.type) { 8659 case 0: return "legacy"; 8660 case 1: return "eip-2930"; 8661 case 2: return "eip-1559"; 8662 case 3: return "eip-4844"; 8663 case 4: return "eip-7702"; 8664 } 8665 return null; 8666 } 8667 /** 8668 * The ``to`` address for the transaction or ``null`` if the 8669 * transaction is an ``init`` transaction. 8670 */ 8671 get to() { 8672 const value = this.#to; 8673 if (value == null && this.type === 3) return ZeroAddress; 8674 return value; 8675 } 8676 set to(value) { 8677 this.#to = value == null ? null : getAddress(value); 8678 } 8679 /** 8680 * The transaction nonce. 8681 */ 8682 get nonce() { 8683 return this.#nonce; 8684 } 8685 set nonce(value) { 8686 this.#nonce = getNumber(value, "value"); 8687 } 8688 /** 8689 * The gas limit. 8690 */ 8691 get gasLimit() { 8692 return this.#gasLimit; 8693 } 8694 set gasLimit(value) { 8695 this.#gasLimit = getBigInt(value); 8696 } 8697 /** 8698 * The gas price. 8699 * 8700 * On legacy networks this defines the fee that will be paid. On 8701 * EIP-1559 networks, this should be ``null``. 8702 */ 8703 get gasPrice() { 8704 const value = this.#gasPrice;
8705 if (value == null && (this.type === 0 || this.type === 1)) return BN_0$4; 8706 return value; 8707 } 8708 set gasPrice(value) { 8709 this.#gasPrice = value == null ? null : getBigInt(value, "gasPrice"); 8710 } 8711 /** 8712 * The maximum priority fee per unit of gas to pay. On legacy 8713 * networks this should be ``null``. 8714 */ 8715 get maxPriorityFeePerGas() { 8716 const value = this.#maxPriorityFeePerGas; 8717 if (value == null) { 8718 if (this.type === 2 || this.type === 3) return BN_0$4; 8719 return null; 8720 } 8721 return value; 8722 } 8723 set maxPriorityFeePerGas(value) { 8724 this.#maxPriorityFeePerGas = value == null ? null : getBigInt(value, "maxPriorityFeePerGas"); 8725 } 8726 /** 8727 * The maximum total fee per unit of gas to pay. On legacy 8728 * networks this should be ``null``. 8729 */ 8730 get maxFeePerGas() { 8731 const value = this.#maxFeePerGas; 8732 if (value == null) { 8733 if (this.type === 2 || this.type === 3) return BN_0$4; 8734 return null; 8735 } 8736 return value; 8737 } 8738 set maxFeePerGas(value) { 8739 this.#maxFeePerGas = value == null ? null : getBigInt(value, "maxFeePerGas"); 8740 } 8741 /** 8742 * The transaction data. For ``init`` transactions this is the 8743 * deployment code. 8744 */ 8745 get data() { 8746 return this.#data; 8747 } 8748 set data(value) { 8749 this.#data = hexlify(value); 8750 } 8751 /** 8752 * The amount of ether (in wei) to send in this transactions. 8753 */ 8754 get value() { 8755 return this.#value; 8756 } 8757 set value(value) { 8758 this.#value = getBigInt(value, "value"); 8759 } 8760 /** 8761 * The chain ID this transaction is valid on. 8762 */ 8763 get chainId() { 8764 return this.#chainId; 8765 } 8766 set chainId(value) { 8767 this.#chainId = getBigInt(value); 8768 } 8769 /** 8770 * If signed, the signature for this transaction. 8771 */ 8772 get signature() { 8773 return this.#sig || null; 8774 } 8775 set signature(value) { 8776 this.#sig = value == null ? null : Signature.from(value); 8777 } 8778 isValid() { 8779 const sig = this.signature; 8780 if (sig && !sig.isValid()) return false; 8781 const auths = this.authorizationList; 8782 if (auths) { 8783 for (const auth of auths) if (!auth.signature.isValid()) return false; 8784 } 8785 return true; 8786 } 8787 /** 8788 * The access list. 8789 * 8790 * An access list permits discounted (but pre-paid) access to 8791 * bytecode and state variable access within contract execution. 8792 */ 8793 get accessList() { 8794 const value = this.#accessList || null; 8795 if (value == null) { 8796 if (this.type === 1 || this.type === 2 || this.type === 3) return []; 8797 return null; 8798 } 8799 return value; 8800 } 8801 set accessList(value) { 8802 this.#accessList = value == null ? null : accessListify(value); 8803 } 8804 get authorizationList() { 8805 const value = this.#auths || null; 8806 if (value == null) { 8807 if (this.type === 4) return []; 8808 } 8809 return value; 8810 } 8811 set authorizationList(auths) { 8812 this.#auths = auths == null ? null : auths.map((a) => authorizationify(a)); 8813 } 8814 /** 8815 * The max fee per blob gas for Cancun transactions. 8816 */ 8817 get maxFeePerBlobGas() { 8818 const value = this.#maxFeePerBlobGas; 8819 if (value == null && this.type === 3) return BN_0$4; 8820 return value; 8821 } 8822 set maxFeePerBlobGas(value) { 8823 this.#maxFeePerBlobGas = value == null ? null : getBigInt(value, "maxFeePerBlobGas"); 8824 } 8825 /** 8826 * The BLOb versioned hashes for Cancun transactions. 8827 */ 8828 get blobVersionedHashes() { 8829 let value = this.#blobVersionedHashes; 8830 if (value == null && this.type === 3) return []; 8831 return value; 8832 } 8833 set blobVersionedHashes(value) { 8834 if (value != null) { 8835 assertArgument(Array.isArray(value), "blobVersionedHashes must be an Array", "value", value); 8836 value = value.slice(); 8837 for (let i = 0; i < value.length; i++) assertArgument(isHexString(value[i], 32), "invalid blobVersionedHash", `value[${i}]`, value[i]); 8838 } 8839 this.#blobVersionedHashes = value; 8840 } 8841 /** 8842 * The BLObs for the Transaction, if any. 8843 * 8844 * If ``blobs`` is non-``null``, then the [[seriailized]] 8845 * will return the network formatted sidecar, otherwise it 8846 * will return the standard [[link-eip-2718]] payload. The 8847 * [[unsignedSerialized]] is unaffected regardless. 8848 * 8849 * When setting ``blobs``, either fully valid [[Blob]] objects 8850 * may be specified (i.e. correctly padded, with correct 8851 * committments and proofs) or a raw [[BytesLike]] may 8852 * be provided. 8853 * 8854 * If raw [[BytesLike]] are provided, the [[kzg]] property **must** 8855 * be already set. The blob will be correctly padded and the 8856 * [[KzgLibrary]] will be used to compute the committment and 8857 * proof for the blob. 8858 * 8859 * A BLOb is a sequence of field elements, each of which must 8860 * be within the BLS field modulo, so some additional processing 8861 * may be required to encode arbitrary data to ensure each 32 byte 8862 * field is within the valid range. 8863 * 8864 * Setting this automatically populates [[blobVersionedHashes]], 8865 * overwriting any existing values. Setting this to ``null`` 8866 * does **not** remove the [[blobVersionedHashes]], leaving them 8867 * present. 8868 */ 8869 get blobs() { 8870 if (this.#blobs == null) return null; 8871 return this.#blobs.map((b) => Object.assign({}, b)); 8872 } 8873 set blobs(_blobs) { 8874 if (_blobs == null) { 8875 this.#blobs = null; 8876 return; 8877 } 8878 const blobs = []; 8879 const versionedHashes = []; 8880 for (let i = 0; i < _blobs.length; i++) { 8881 const blob = _blobs[i]; 8882 if (isBytesLike(blob)) { 8883 assert(this.#kzg, "adding a raw blob requires a KZG library", "UNSUPPORTED_OPERATION", { operation: "set blobs()" }); 8884 let data = getBytes(blob); 8885 assertArgument(data.length <= BLOB_SIZE, "blob is too large", `blobs[${i}]`, blob); 8886 if (data.length !== BLOB_SIZE) { 8887 const padded = new Uint8Array(BLOB_SIZE); 8888 padded.set(data); 8889 data = padded; 8890 } 8891 const commit = this.#kzg.blobToKzgCommitment(data); 8892 const proof = hexlify(this.#kzg.computeBlobKzgProof(data, commit)); 8893 blobs.push({ 8894 data: hexlify(data), 8895 commitment: hexlify(commit), 8896 proof 8897 }); 8898 versionedHashes.push(getVersionedHash(1, commit)); 8899 } else { 8900 const data = hexlify(blob.data); 8901 const commitment = hexlify(blob.commitment); 8902 const proof = hexlify(blob.proof); 8903 blobs.push({ 8904 data, 8905 commitment, 8906 proof 8907 }); 8908 versionedHashes.push(getVersionedHash(1, commitment)); 8909 } 8910 } 8911 this.#blobs = blobs; 8912 this.#blobVersionedHashes = versionedHashes; 8913 } 8914 get kzg() { 8915 return this.#kzg; 8916 } 8917 set kzg(kzg) { 8918 if (kzg == null) this.#kzg = null; 8919 else this.#kzg = getKzgLibrary(kzg); 8920 } 8921 get blobWrapperVersion() { 8922 return this.#blobWrapperVersion; 8923 } 8924 set blobWrapperVersion(value) { 8925 this.#blobWrapperVersion = value; 8926 }
8927 /** 8928 * Creates a new Transaction with default values. 8929 */ 8930 constructor() { 8931 this.#type = null; 8932 this.#to = null; 8933 this.#nonce = 0; 8934 this.#gasLimit = BN_0$4; 8935 this.#gasPrice = null; 8936 this.#maxPriorityFeePerGas = null; 8937 this.#maxFeePerGas = null; 8938 this.#data = "0x"; 8939 this.#value = BN_0$4; 8940 this.#chainId = BN_0$4; 8941 this.#sig = null; 8942 this.#accessList = null; 8943 this.#maxFeePerBlobGas = null; 8944 this.#blobVersionedHashes = null; 8945 this.#kzg = null; 8946 this.#blobs = null; 8947 this.#auths = null; 8948 this.#blobWrapperVersion = null; 8949 } 8950 /** 8951 * The transaction hash, if signed. Otherwise, ``null``. 8952 */ 8953 get hash() { 8954 if (this.signature == null) return null; 8955 return keccak256(this.#getSerialized(true, false)); 8956 } 8957 /** 8958 * The pre-image hash of this transaction. 8959 * 8960 * This is the digest that a [[Signer]] must sign to authorize 8961 * this transaction. 8962 */ 8963 get unsignedHash() { 8964 return keccak256(this.unsignedSerialized); 8965 } 8966 /** 8967 * The sending address, if signed. Otherwise, ``null``. 8968 */ 8969 get from() { 8970 if (this.signature == null) return null; 8971 return recoverAddress(this.unsignedHash, this.signature.getCanonical()); 8972 } 8973 /** 8974 * The public key of the sender, if signed. Otherwise, ``null``. 8975 */ 8976 get fromPublicKey() { 8977 if (this.signature == null) return null; 8978 return SigningKey.recoverPublicKey(this.unsignedHash, this.signature.getCanonical()); 8979 } 8980 /** 8981 * Returns true if signed. 8982 * 8983 * This provides a Type Guard that properties requiring a signed 8984 * transaction are non-null. 8985 */ 8986 isSigned() { 8987 return this.signature != null; 8988 } 8989 #getSerialized(signed, sidecar) { 8990 assert(!signed || this.signature != null, "cannot serialize unsigned transaction; maybe you meant .unsignedSerialized", "UNSUPPORTED_OPERATION", { operation: ".serialized" }); 8991 const sig = signed ? this.signature : null; 8992 switch (this.inferType()) { 8993 case 0: return _serializeLegacy(this, sig); 8994 case 1: return _serializeEip2930(this, sig); 8995 case 2: return _serializeEip1559(this, sig); 8996 case 3: return _serializeEip4844(this, sig, sidecar ? this.blobs : null); 8997 case 4: return _serializeEip7702(this, sig); 8998 } 8999 assert(false, "unsupported transaction type", "UNSUPPORTED_OPERATION", { operation: ".serialized" }); 9000 } 9001 /** 9002 * The serialized transaction. 9003 * 9004 * This throws if the transaction is unsigned. For the pre-image, 9005 * use [[unsignedSerialized]]. 9006 */ 9007 get serialized() { 9008 return this.#getSerialized(true, true); 9009 } 9010 /** 9011 * The transaction pre-image. 9012 * 9013 * The hash of this is the digest which needs to be signed to 9014 * authorize this transaction. 9015 */ 9016 get unsignedSerialized() { 9017 return this.#getSerialized(false, false); 9018 } 9019 /** 9020 * Return the most "likely" type; currently the highest 9021 * supported transaction type. 9022 */ 9023 inferType() { 9024 const types = this.inferTypes(); 9025 if (types.indexOf(2) >= 0) return 2; 9026 return types.pop(); 9027 } 9028 /** 9029 * Validates the explicit properties and returns a list of compatible 9030 * transaction types. 9031 */ 9032 inferTypes() { 9033 const hasGasPrice = this.gasPrice != null; 9034 const hasFee = this.maxFeePerGas != null || this.maxPriorityFeePerGas != null; 9035 const hasAccessList = this.accessList != null; 9036 const hasBlob = this.#maxFeePerBlobGas != null || this.#blobVersionedHashes; 9037 if (this.maxFeePerGas != null && this.maxPriorityFeePerGas != null) assert(this.maxFeePerGas >= this.maxPriorityFeePerGas, "priorityFee cannot be more than maxFee", "BAD_DATA", { value: this }); 9038 assert(!hasFee || this.type !== 0 && this.type !== 1, "transaction type cannot have maxFeePerGas or maxPriorityFeePerGas", "BAD_DATA", { value: this }); 9039 assert(this.type !== 0 || !hasAccessList, "legacy transaction cannot have accessList", "BAD_DATA", { value: this }); 9040 const types = []; 9041 if (this.type != null) types.push(this.type); 9042 else if (this.authorizationList && this.authorizationList.length) types.push(4); 9043 else if (hasFee) types.push(2); 9044 else if (hasGasPrice) { 9045 types.push(1); 9046 if (!hasAccessList) types.push(0); 9047 } else if (hasAccessList) { 9048 types.push(1); 9049 types.push(2); 9050 } else if (hasBlob && this.to) types.push(3); 9051 else { 9052 types.push(0); 9053 types.push(1); 9054 types.push(2); 9055 types.push(3); 9056 } 9057 types.sort(); 9058 return types; 9059 } 9060 /** 9061 * Returns true if this transaction is a legacy transaction (i.e. 9062 * ``type === 0``). 9063 * 9064 * This provides a Type Guard that the related properties are 9065 * non-null. 9066 */ 9067 isLegacy() { 9068 return this.type === 0; 9069 } 9070 /** 9071 * Returns true if this transaction is berlin hardform transaction (i.e. 9072 * ``type === 1``). 9073 * 9074 * This provides a Type Guard that the related properties are 9075 * non-null. 9076 */ 9077 isBerlin() { 9078 return this.type === 1; 9079 } 9080 /** 9081 * Returns true if this transaction is london hardform transaction (i.e. 9082 * ``type === 2``). 9083 * 9084 * This provides a Type Guard that the related properties are 9085 * non-null. 9086 */ 9087 isLondon() { 9088 return this.type === 2; 9089 }
9090 /** 9091 * Returns true if this transaction is an [[link-eip-4844]] BLOB 9092 * transaction. 9093 * 9094 * This provides a Type Guard that the related properties are 9095 * non-null. 9096 */ 9097 isCancun() { 9098 return this.type === 3; 9099 } 9100 /** 9101 * Create a copy of this transaciton. 9102 */ 9103 clone() { 9104 return Transaction.from(this); 9105 } 9106 /** 9107 * Return a JSON-friendly object. 9108 */ 9109 toJSON() { 9110 const s = (v) => { 9111 if (v == null) return null; 9112 return v.toString(); 9113 }; 9114 return { 9115 type: this.type, 9116 to: this.to, 9117 data: this.data, 9118 nonce: this.nonce, 9119 gasLimit: s(this.gasLimit), 9120 gasPrice: s(this.gasPrice), 9121 maxPriorityFeePerGas: s(this.maxPriorityFeePerGas), 9122 maxFeePerGas: s(this.maxFeePerGas), 9123 value: s(this.value), 9124 chainId: s(this.chainId), 9125 sig: this.signature ? this.signature.toJSON() : null, 9126 accessList: this.accessList 9127 }; 9128 } 9129 [inspect$2]() { 9130 return this.toString(); 9131 } 9132 toString() { 9133 const output = []; 9134 const add = (key) => { 9135 let value = this[key]; 9136 if (typeof value === "string") value = JSON.stringify(value); 9137 output.push(`${key}: ${value}`); 9138 }; 9139 if (this.type) add("type"); 9140 add("to"); 9141 add("data"); 9142 add("nonce"); 9143 add("gasLimit"); 9144 add("value"); 9145 if (this.chainId != null) add("chainId"); 9146 if (this.signature) { 9147 add("from"); 9148 output.push(`signature: ${this.signature.toString()}`); 9149 } 9150 const auths = this.authorizationList; 9151 if (auths) { 9152 const outputAuths = []; 9153 for (const auth of auths) { 9154 const o = []; 9155 o.push(`address: ${JSON.stringify(auth.address)}`); 9156 if (auth.nonce != null) o.push(`nonce: ${auth.nonce}`); 9157 if (auth.chainId != null) o.push(`chainId: ${auth.chainId}`); 9158 if (auth.signature) o.push(`signature: ${auth.signature.toString()}`); 9159 outputAuths.push(`Authorization { ${o.join(", ")} }`); 9160 } 9161 output.push(`authorizations: [ ${outputAuths.join(", ")} ]`); 9162 } 9163 return `Transaction { ${output.join(", ")} }`; 9164 } 9165 /** 9166 * Create a **Transaction** from a serialized transaction or a 9167 * Transaction-like object. 9168 */ 9169 static from(tx) { 9170 if (tx == null) return new Transaction(); 9171 if (typeof tx === "string") { 9172 const payload = getBytes(tx); 9173 if (payload[0] >= 127) return Transaction.from(_parseLegacy(payload)); 9174 switch (payload[0]) { 9175 case 1: return Transaction.from(_parseEip2930(payload)); 9176 case 2: return Transaction.from(_parseEip1559(payload)); 9177 case 3: return Transaction.from(_parseEip4844(payload)); 9178 case 4: return Transaction.from(_parseEip7702(payload)); 9179 } 9180 assert(false, "unsupported transaction type", "UNSUPPORTED_OPERATION", { operation: "from" }); 9181 } 9182 const result = new Transaction(); 9183 if (tx.type != null) result.type = tx.type; 9184 if (tx.to != null) result.to = tx.to; 9185 if (tx.nonce != null) result.nonce = tx.nonce; 9186 if (tx.gasLimit != null) result.gasLimit = tx.gasLimit; 9187 if (tx.gasPrice != null) result.gasPrice = tx.gasPrice; 9188 if (tx.maxPriorityFeePerGas != null) result.maxPriorityFeePerGas = tx.maxPriorityFeePerGas; 9189 if (tx.maxFeePerGas != null) result.maxFeePerGas = tx.maxFeePerGas; 9190 if (tx.maxFeePerBlobGas != null) result.maxFeePerBlobGas = tx.maxFeePerBlobGas; 9191 if (tx.data != null) result.data = tx.data; 9192 if (tx.value != null) result.value = tx.value; 9193 if (tx.chainId != null) result.chainId = tx.chainId; 9194 if (tx.signature != null) result.signature = Signature.from(tx.signature); 9195 if (tx.accessList != null) result.accessList = tx.accessList; 9196 if (tx.authorizationList != null) result.authorizationList = tx.authorizationList; 9197 if (tx.blobVersionedHashes != null) result.blobVersionedHashes = tx.blobVersionedHashes; 9198 if (tx.kzg != null) result.kzg = tx.kzg; 9199 if (tx.blobWrapperVersion != null) result.blobWrapperVersion = tx.blobWrapperVersion; 9200 if (tx.blobs != null) result.blobs = tx.blobs; 9201 if (tx.hash != null) { 9202 assertArgument(result.isSigned(), "unsigned transaction cannot define '.hash'", "tx", tx); 9203 assertArgument(result.hash === tx.hash, "hash mismatch", "tx", tx); 9204 } 9205 if (tx.from != null) { 9206 assertArgument(result.isSigned(), "unsigned transaction cannot define '.from'", "tx", tx); 9207 assertArgument(result.from.toLowerCase() === (tx.from || "").toLowerCase(), "from mismatch", "tx", tx); 9208 } 9209 return result; 9210 } 9211}; 9212//#endregion 9213//#region node_modules/ethers/lib.esm/hash/authorization.js 9214/** 9215* Computes the [[link-eip-7702]] authorization digest to sign. 9216*/ 9217function hashAuthorization(auth) { 9218 assertArgument(typeof auth.address === "string", "invalid address for hashAuthorization", "auth.address", auth); 9219 return keccak256(concat(["0x05", encodeRlp([ 9220 auth.chainId != null ? toBeArray(auth.chainId) : "0x", 9221 getAddress(auth.address), 9222 auth.nonce != null ? toBeArray(auth.nonce) : "0x"
9223 ])])); 9224} 9225/** 9226* Return the address of the private key that produced 9227* the signature %%sig%% during signing for %%message%%. 9228*/ 9229function verifyAuthorization(auth, sig) { 9230 return recoverAddress(hashAuthorization(auth), sig); 9231} 9232//#endregion 9233//#region node_modules/ethers/lib.esm/hash/id.js 9234/** 9235* A simple hashing function which operates on UTF-8 strings to 9236* compute an 32-byte identifier. 9237* 9238* This simply computes the [UTF-8 bytes](toUtf8Bytes) and computes 9239* the [[keccak256]]. 9240* 9241* @example: 9242* id("hello world") 9243* //_result: 9244*/ 9245function id(value) { 9246 return keccak256(toUtf8Bytes(value)); 9247} 9248//#endregion 9249//#region node_modules/@adraffy/ens-normalize/dist/index.mjs 9250var COMPRESSED$1 = "
vendor: 20,100 bytes, line 9250
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
9250"; 9251var FENCED = /* @__PURE__ */ new Map([ 9252 [8217, "apostrophe"], 9253 [8260, "fraction slash"], 9254 [12539, "middle dot"] 9255]); 9256var NSM_MAX = 4; 9257function decode_arithmetic(bytes) { 9258 let pos = 0; 9259 function u16() { 9260 return bytes[pos++] << 8 | bytes[pos++]; 9261 } 9262 let symbol_count = u16(); 9263 let total = 1; 9264 let acc = [0, 1]; 9265 for (let i = 1; i < symbol_count; i++) acc.push(total += u16()); 9266 let skip = u16(); 9267 let pos_payload = pos; 9268 pos += skip; 9269 let read_width = 0; 9270 let read_buffer = 0; 9271 function read_bit() { 9272 if (read_width == 0) { 9273 read_buffer = read_buffer << 8 | bytes[pos++]; 9274 read_width = 8; 9275 } 9276 return read_buffer >> --read_width & 1; 9277 } 9278 const N = 31; 9279 const FULL = 2 ** N; 9280 const HALF = FULL >>> 1; 9281 const QRTR = HALF >> 1; 9282 const MASK = FULL - 1; 9283 let register = 0; 9284 for (let i = 0; i < N; i++) register = register << 1 | read_bit(); 9285 let symbols = []; 9286 let low = 0; 9287 let range = FULL; 9288 while (true) { 9289 let value = Math.floor(((register - low + 1) * total - 1) / range); 9290 let start = 0; 9291 let end = symbol_count; 9292 while (end - start > 1) { 9293 let mid = start + end >>> 1; 9294 if (value < acc[mid]) end = mid; 9295 else start = mid; 9296 } 9297 if (start == 0) break; 9298 symbols.push(start); 9299 let a = low + Math.floor(range * acc[start] / total); 9300 let b = low + Math.floor(range * acc[start + 1] / total) - 1; 9301 while (((a ^ b) & HALF) == 0) { 9302 register = register << 1 & MASK | read_bit(); 9303 a = a << 1 & MASK; 9304 b = b << 1 & MASK | 1; 9305 } 9306 while (a & ~b & QRTR) { 9307 register = register & HALF | register << 1 & MASK >>> 1 | read_bit(); 9308 a = a << 1 ^ HALF; 9309 b = (b ^ HALF) << 1 | HALF | 1; 9310 } 9311 low = a; 9312 range = 1 + b - a; 9313 } 9314 let offset = symbol_count - 4; 9315 return symbols.map((x) => { 9316 switch (x - offset) { 9317 case 3: return offset + 65792 + (bytes[pos_payload++] << 16 | bytes[pos_payload++] << 8 | bytes[pos_payload++]); 9318 case 2: return offset + 256 + (bytes[pos_payload++] << 8 | bytes[pos_payload++]); 9319 case 1: return offset + bytes[pos_payload++]; 9320 default: return x - 1; 9321 } 9322 }); 9323} 9324function read_payload(v) { 9325 let pos = 0; 9326 return () => v[pos++]; 9327} 9328function read_compressed_payload(s) { 9329 return read_payload(decode_arithmetic(unsafe_atob(s))); 9330} 9331function unsafe_atob(s) { 9332 let lookup = []; 9333 [..."ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"].forEach((c, i) => lookup[c.charCodeAt(0)] = i); 9334 let n = s.length; 9335 let ret = new Uint8Array(6 * n >> 3); 9336 for (let i = 0, pos = 0, width = 0, carry = 0; i < n; i++) { 9337 carry = carry << 6 | lookup[s.charCodeAt(i)]; 9338 width += 6; 9339 if (width >= 8) ret[pos++] = carry >> (width -= 8); 9340 } 9341 return ret; 9342} 9343function signed(i) { 9344 return i & 1 ? ~i >> 1 : i >> 1; 9345} 9346function read_deltas(n, next) { 9347 let v = Array(n); 9348 for (let i = 0, x = 0; i < n; i++) v[i] = x += signed(next()); 9349 return v; 9350} 9351function read_sorted(next, prev = 0) { 9352 let ret = []; 9353 while (true) { 9354 let x = next(); 9355 let n = next(); 9356 if (!n) break; 9357 prev += x; 9358 for (let i = 0; i < n; i++) ret.push(prev + i); 9359 prev += n + 1; 9360 } 9361 return ret; 9362} 9363function read_sorted_arrays(next) { 9364 return read_array_while(() => { 9365 let v = read_sorted(next); 9366 if (v.length) return v; 9367 }); 9368} 9369function read_mapped(next) { 9370 let ret = []; 9371 while (true) { 9372 let w = next(); 9373 if (w == 0) break; 9374 ret.push(read_linear_table(w, next)); 9375 } 9376 while (true) { 9377 let w = next() - 1; 9378 if (w < 0) break; 9379 ret.push(read_replacement_table(w, next)); 9380 } 9381 return ret.flat(); 9382} 9383function read_array_while(next) { 9384 let v = []; 9385 while (true) { 9386 let x = next(v.length); 9387 if (!x) break; 9388 v.push(x); 9389 } 9390 return v; 9391} 9392function read_transposed(n, w, next) { 9393 let m = Array(n).fill().map(() => []); 9394 for (let i = 0; i < w; i++) read_deltas(n, next).forEach((x, j) => m[j].push(x)); 9395 return m; 9396} 9397function read_linear_table(w, next) { 9398 let dx = 1 + next(); 9399 let dy = next(); 9400 let vN = read_array_while(next); 9401 return read_transposed(vN.length, 1 + w, next).flatMap((v, i) => { 9402 let [x, ...ys] = v; 9403 return Array(vN[i]).fill().map((_, j) => { 9404 let j_dy = j * dy; 9405 return [x + j * dx, ys.map((y) => y + j_dy)]; 9406 }); 9407 }); 9408} 9409function read_replacement_table(w, next) { 9410 return read_transposed(1 + next(), 1 + w, next).map((v) => [v[0], v.slice(1)]); 9411} 9412function read_trie(next) { 9413 let ret = []; 9414 let sorted = read_sorted(next); 9415 expand(decode([]), []); 9416 return ret; 9417 function decode(Q) { 9418 return { 9419 S: next(), 9420 B: read_array_while(() => { 9421 let cps = read_sorted(next).map((i) => sorted[i]); 9422 if (cps.length) return decode(cps); 9423 }), 9424 Q 9425 }; 9426 } 9427 function expand({ S, B }, cps, saved) { 9428 if (S & 4 && saved === cps[cps.length - 1]) return; 9429 if (S & 2) saved = cps[cps.length - 1]; 9430 if (S & 1) ret.push(cps); 9431 for (let br of B) for (let cp of br.Q) expand(br, [...cps, cp], saved); 9432 } 9433} 9434function hex_cp(cp) { 9435 return cp.toString(16).toUpperCase().padStart(2, "0"); 9436} 9437function quote_cp(cp) { 9438 return `{${hex_cp(cp)}}`; 9439} 9440function explode_cp(s) { 9441 let cps = []; 9442 for (let pos = 0, len = s.length; pos < len;) { 9443 let cp = s.codePointAt(pos); 9444 pos += cp < 65536 ? 1 : 2; 9445 cps.push(cp); 9446 } 9447 return cps; 9448} 9449function str_from_cps(cps) { 9450 const chunk = 4096; 9451 let len = cps.length; 9452 if (len < chunk) return String.fromCodePoint(...cps); 9453 let buf = []; 9454 for (let i = 0; i < len;) buf.push(String.fromCodePoint(...cps.slice(i, i += chunk))); 9455 return buf.join(""); 9456} 9457function compare_arrays(a, b) { 9458 let n = a.length; 9459 let c = n - b.length; 9460 for (let i = 0; c == 0 && i < n; i++) c = a[i] - b[i]; 9461 return c; 9462} 9463var COMPRESSED = "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"; 9464var S0 = 44032; 9465var L0 = 4352; 9466var V0 = 4449; 9467var T0 = 4519; 9468var T_COUNT = 28; 9469var N_COUNT = 588; 9470var S1 = 55204; 9471var L1 = 4371; 9472var V1 = 4470; 9473var T1$1 = 4547; 9474function unpack_cc(packed) { 9475 return packed >> 24 & 255; 9476} 9477function unpack_cp(packed) { 9478 return packed & 16777215; 9479} 9480var SHIFTED_RANK; 9481var EXCLUSIONS; 9482var DECOMP; 9483var RECOMP; 9484function init$1() { 9485 let r = read_compressed_payload(COMPRESSED); 9486 SHIFTED_RANK = new Map(read_sorted_arrays(r).flatMap((v, i) => v.map((x) => [x, i + 1 << 24]))); 9487 EXCLUSIONS = new Set(read_sorted(r)); 9488 DECOMP = /* @__PURE__ */ new Map(); 9489 RECOMP = /* @__PURE__ */ new Map(); 9490 for (let [cp, cps] of read_mapped(r)) { 9491 if (!EXCLUSIONS.has(cp) && cps.length == 2) { 9492 let [a, b] = cps; 9493 let bucket = RECOMP.get(a); 9494 if (!bucket) { 9495 bucket = /* @__PURE__ */ new Map(); 9496 RECOMP.set(a, bucket); 9497 } 9498 bucket.set(b, cp); 9499 } 9500 DECOMP.set(cp, cps.reverse()); 9501 } 9502} 9503function is_hangul(cp) { 9504 return cp >= S0 && cp < S1; 9505} 9506function compose_pair(a, b) { 9507 if (a >= L0 && a < L1 && b >= V0 && b < V1) return S0 + (a - L0) * N_COUNT + (b - V0) * T_COUNT; 9508 else if (is_hangul(a) && b > T0 && b < T1$1 && (a - S0) % T_COUNT == 0) return a + (b - T0); 9509 else { 9510 let recomp = RECOMP.get(a); 9511 if (recomp) { 9512 recomp = recomp.get(b); 9513 if (recomp) return recomp; 9514 } 9515 return -1; 9516 } 9517} 9518function decomposed(cps) { 9519 if (!SHIFTED_RANK) init$1(); 9520 let ret = []; 9521 let buf = []; 9522 let check_order = false;
9523 function add(cp) { 9524 let cc = SHIFTED_RANK.get(cp); 9525 if (cc) { 9526 check_order = true; 9527 cp |= cc; 9528 } 9529 ret.push(cp); 9530 } 9531 for (let cp of cps) while (true) { 9532 if (cp < 128) ret.push(cp); 9533 else if (is_hangul(cp)) { 9534 let s_index = cp - S0; 9535 let l_index = s_index / N_COUNT | 0; 9536 let v_index = s_index % N_COUNT / T_COUNT | 0; 9537 let t_index = s_index % T_COUNT; 9538 add(L0 + l_index); 9539 add(V0 + v_index); 9540 if (t_index > 0) add(T0 + t_index); 9541 } else { 9542 let mapped = DECOMP.get(cp); 9543 if (mapped) buf.push(...mapped); 9544 else add(cp); 9545 } 9546 if (!buf.length) break; 9547 cp = buf.pop(); 9548 } 9549 if (check_order && ret.length > 1) { 9550 let prev_cc = unpack_cc(ret[0]); 9551 for (let i = 1; i < ret.length; i++) { 9552 let cc = unpack_cc(ret[i]); 9553 if (cc == 0 || prev_cc <= cc) { 9554 prev_cc = cc; 9555 continue; 9556 } 9557 let j = i - 1; 9558 while (true) { 9559 let tmp = ret[j + 1]; 9560 ret[j + 1] = ret[j]; 9561 ret[j] = tmp; 9562 if (!j) break; 9563 prev_cc = unpack_cc(ret[--j]); 9564 if (prev_cc <= cc) break; 9565 } 9566 prev_cc = unpack_cc(ret[i]); 9567 } 9568 } 9569 return ret; 9570} 9571function composed_from_decomposed(v) { 9572 let ret = []; 9573 let stack = []; 9574 let prev_cp = -1; 9575 let prev_cc = 0; 9576 for (let packed of v) { 9577 let cc = unpack_cc(packed); 9578 let cp = unpack_cp(packed); 9579 if (prev_cp == -1) { 9580 if (cc == 0) prev_cp = cp; 9581 else ret.push(cp); 9582 } else if (prev_cc > 0 && prev_cc >= cc) { 9583 if (cc == 0) { 9584 ret.push(prev_cp, ...stack); 9585 stack.length = 0; 9586 prev_cp = cp; 9587 } else stack.push(cp); 9588 prev_cc = cc; 9589 } else { 9590 let composed = compose_pair(prev_cp, cp); 9591 if (composed >= 0) prev_cp = composed; 9592 else if (prev_cc == 0 && cc == 0) { 9593 ret.push(prev_cp); 9594 prev_cp = cp; 9595 } else { 9596 stack.push(cp); 9597 prev_cc = cc; 9598 } 9599 } 9600 } 9601 if (prev_cp >= 0) ret.push(prev_cp, ...stack); 9602 return ret; 9603} 9604function nfd(cps) { 9605 return decomposed(cps).map(unpack_cp); 9606} 9607function nfc(cps) { 9608 return composed_from_decomposed(decomposed(cps)); 9609} 9610var HYPHEN = 45; 9611var STOP_CH = "."; 9612var FE0F = 65039; 9613var UNIQUE_PH = 1; 9614var Array_from = (x) => Array.from(x); 9615function group_has_cp(g, cp) { 9616 return g.P.has(cp) || g.Q.has(cp); 9617} 9618var Emoji = class extends Array { 9619 get is_emoji() { 9620 return true; 9621 } 9622}; 9623var MAPPED; 9624var IGNORED; 9625var CM; 9626var NSM; 9627var ESCAPE; 9628var GROUPS; 9629var WHOLE_VALID; 9630var WHOLE_MAP; 9631var VALID; 9632var EMOJI_LIST; 9633var EMOJI_ROOT; 9634function init() { 9635 if (MAPPED) return; 9636 let r = read_compressed_payload(COMPRESSED$1); 9637 const read_sorted_array = () => read_sorted(r); 9638 const read_sorted_set = () => new Set(read_sorted_array()); 9639 const set_add_many = (set, v) => v.forEach((x) => set.add(x)); 9640 MAPPED = new Map(read_mapped(r)); 9641 IGNORED = read_sorted_set(); 9642 CM = read_sorted_array(); 9643 NSM = new Set(read_sorted_array().map((i) => CM[i])); 9644 CM = new Set(CM); 9645 ESCAPE = read_sorted_set(); 9646 read_sorted_set(); 9647 let chunks = read_sorted_arrays(r); 9648 let unrestricted = r(); 9649 const read_chunked = () => { 9650 let set = /* @__PURE__ */ new Set(); 9651 read_sorted_array().forEach((i) => set_add_many(set, chunks[i])); 9652 set_add_many(set, read_sorted_array()); 9653 return set; 9654 }; 9655 GROUPS = read_array_while((i) => { 9656 let N = read_array_while(r).map((x) => x + 96); 9657 if (N.length) { 9658 let R = i >= unrestricted; 9659 N[0] -= 32; 9660 N = str_from_cps(N); 9661 if (R) N = `Restricted[${N}]`; 9662 let P = read_chunked(); 9663 let Q = read_chunked(); 9664 let M = !r(); 9665 return { 9666 N, 9667 P, 9668 Q, 9669 M, 9670 R 9671 }; 9672 } 9673 }); 9674 WHOLE_VALID = read_sorted_set(); 9675 WHOLE_MAP = /* @__PURE__ */ new Map(); 9676 let wholes = read_sorted_array().concat(Array_from(WHOLE_VALID)).sort((a, b) => a - b); 9677 wholes.forEach((cp, i) => { 9678 let d = r(); 9679 let w = wholes[i] = d ? wholes[i - d] : { 9680 V: [], 9681 M: /* @__PURE__ */ new Map() 9682 }; 9683 w.V.push(cp); 9684 if (!WHOLE_VALID.has(cp)) WHOLE_MAP.set(cp, w); 9685 }); 9686 for (let { V, M } of new Set(WHOLE_MAP.values())) { 9687 let recs = []; 9688 for (let cp of V) { 9689 let gs = GROUPS.filter((g) => group_has_cp(g, cp)); 9690 let rec = recs.find(({ G }) => gs.some((g) => G.has(g))); 9691 if (!rec) { 9692 rec = { 9693 G: /* @__PURE__ */ new Set(), 9694 V: [] 9695 }; 9696 recs.push(rec); 9697 } 9698 rec.V.push(cp);
9699 set_add_many(rec.G, gs); 9700 } 9701 let union = recs.flatMap((x) => Array_from(x.G)); 9702 for (let { G, V } of recs) { 9703 let complement = new Set(union.filter((g) => !G.has(g))); 9704 for (let cp of V) M.set(cp, complement); 9705 } 9706 } 9707 VALID = /* @__PURE__ */ new Set(); 9708 let multi = /* @__PURE__ */ new Set(); 9709 const add_to_union = (cp) => VALID.has(cp) ? multi.add(cp) : VALID.add(cp); 9710 for (let g of GROUPS) { 9711 for (let cp of g.P) add_to_union(cp); 9712 for (let cp of g.Q) add_to_union(cp); 9713 } 9714 for (let cp of VALID) if (!WHOLE_MAP.has(cp) && !multi.has(cp)) WHOLE_MAP.set(cp, UNIQUE_PH); 9715 set_add_many(VALID, nfd(VALID)); 9716 EMOJI_LIST = read_trie(r).map((v) => Emoji.from(v)).sort(compare_arrays); 9717 EMOJI_ROOT = /* @__PURE__ */ new Map(); 9718 for (let cps of EMOJI_LIST) { 9719 let prev = [EMOJI_ROOT]; 9720 for (let cp of cps) { 9721 let next = prev.map((node) => { 9722 let child = node.get(cp); 9723 if (!child) { 9724 child = /* @__PURE__ */ new Map(); 9725 node.set(cp, child); 9726 } 9727 return child; 9728 }); 9729 if (cp === FE0F) prev.push(...next); 9730 else prev = next; 9731 } 9732 for (let x of prev) x.V = cps; 9733 } 9734} 9735function quoted_cp(cp) { 9736 return (should_escape(cp) ? "" : `${bidi_qq(safe_str_from_cps([cp]))} `) + quote_cp(cp); 9737} 9738function bidi_qq(s) { 9739 return `"${s}"\u200E`; 9740} 9741function check_label_extension(cps) { 9742 if (cps.length >= 4 && cps[2] == HYPHEN && cps[3] == HYPHEN) throw new Error(`invalid label extension: "${str_from_cps(cps.slice(0, 4))}"`); 9743} 9744function check_leading_underscore(cps) { 9745 const UNDERSCORE = 95; 9746 for (let i = cps.lastIndexOf(UNDERSCORE); i > 0;) if (cps[--i] !== UNDERSCORE) throw new Error("underscore allowed only at start"); 9747} 9748function check_fenced(cps) { 9749 let cp = cps[0]; 9750 let prev = FENCED.get(cp); 9751 if (prev) throw error_placement(`leading ${prev}`); 9752 let n = cps.length; 9753 let last = -1; 9754 for (let i = 1; i < n; i++) { 9755 cp = cps[i]; 9756 let match = FENCED.get(cp); 9757 if (match) { 9758 if (last == i) throw error_placement(`${prev} + ${match}`); 9759 last = i + 1; 9760 prev = match; 9761 } 9762 } 9763 if (last == n) throw error_placement(`trailing ${prev}`); 9764} 9765function safe_str_from_cps(cps, max = Infinity, quoter = quote_cp) { 9766 let buf = []; 9767 if (is_combining_mark(cps[0])) buf.push("â"); 9768 if (cps.length > max) { 9769 max >>= 1; 9770 cps = [ 9771 ...cps.slice(0, max), 9772 8230, 9773 ...cps.slice(-max) 9774 ]; 9775 } 9776 let prev = 0; 9777 let n = cps.length; 9778 for (let i = 0; i < n; i++) { 9779 let cp = cps[i]; 9780 if (should_escape(cp)) { 9781 buf.push(str_from_cps(cps.slice(prev, i))); 9782 buf.push(quoter(cp)); 9783 prev = i + 1; 9784 } 9785 } 9786 buf.push(str_from_cps(cps.slice(prev, n))); 9787 return buf.join(""); 9788} 9789function is_combining_mark(cp, only_nsm) { 9790 init(); 9791 return only_nsm ? NSM.has(cp) : CM.has(cp); 9792} 9793function should_escape(cp) { 9794 init(); 9795 return ESCAPE.has(cp); 9796} 9797function ens_normalize(name) { 9798 return flatten(split(name, nfc, filter_fe0f)); 9799} 9800function split(name, nf, ef) { 9801 if (!name) return []; 9802 init(); 9803 let offset = 0; 9804 return name.split(STOP_CH).map((label) => { 9805 let input = explode_cp(label); 9806 let info = { 9807 input, 9808 offset 9809 }; 9810 offset += input.length + 1; 9811 try { 9812 let tokens = info.tokens = tokens_from_str(input, nf, ef); 9813 let token_count = tokens.length; 9814 let type; 9815 if (!token_count) throw new Error(`empty label`); 9816 let norm = info.output = tokens.flat(); 9817 check_leading_underscore(norm); 9818 if (!(info.emoji = token_count > 1 || tokens[0].is_emoji) && norm.every((cp) => cp < 128)) { 9819 check_label_extension(norm); 9820 type = "ASCII"; 9821 } else { 9822 let chars = tokens.flatMap((x) => x.is_emoji ? [] : x); 9823 if (!chars.length) type = "Emoji"; 9824 else { 9825 if (CM.has(norm[0])) throw error_placement("leading combining mark"); 9826 for (let i = 1; i < token_count; i++) { 9827 let cps = tokens[i]; 9828 if (!cps.is_emoji && CM.has(cps[0])) throw error_placement(`emoji + comb
9828ining mark: "${str_from_cps(tokens[i - 1])} + ${safe_str_from_cps([cps[0]])}"`); 9829 } 9830 check_fenced(norm); 9831 let unique = Array_from(new Set(chars)); 9832 let [g] = determine_group(unique); 9833 check_group(g, chars); 9834 check_whole(g, unique); 9835 type = g.N; 9836 } 9837 } 9838 info.type = type; 9839 } catch (err) { 9840 info.error = err; 9841 } 9842 return info; 9843 }); 9844} 9845function check_whole(group, unique) { 9846 let maker; 9847 let shared = []; 9848 for (let cp of unique) { 9849 let whole = WHOLE_MAP.get(cp); 9850 if (whole === UNIQUE_PH) return; 9851 if (whole) { 9852 let set = whole.M.get(cp); 9853 maker = maker ? maker.filter((g) => set.has(g)) : Array_from(set); 9854 if (!maker.length) return; 9855 } else shared.push(cp); 9856 } 9857 if (maker) { 9858 for (let g of maker) if (shared.every((cp) => group_has_cp(g, cp))) throw new Error(`whole-script confusable: ${group.N}/${g.N}`); 9859 } 9860} 9861function determine_group(unique) { 9862 let groups = GROUPS; 9863 for (let cp of unique) { 9864 let gs = groups.filter((g) => group_has_cp(g, cp)); 9865 if (!gs.length) { 9866 if (!GROUPS.some((g) => group_has_cp(g, cp))) throw error_disallowed(cp); 9867 else throw error_group_member(groups[0], cp); 9868 } 9869 groups = gs; 9870 if (gs.length == 1) break; 9871 } 9872 return groups; 9873} 9874function flatten(split) { 9875 return split.map(({ input, error, output }) => { 9876 if (error) { 9877 let msg = error.message; 9878 throw new Error(split.length == 1 ? msg : `Invalid label ${bidi_qq(safe_str_from_cps(input, 63))}: ${msg}`); 9879 } 9880 return str_from_cps(output); 9881 }).join(STOP_CH); 9882} 9883function error_disallowed(cp) { 9884 return /* @__PURE__ */ new Error(`disallowed character: ${quoted_cp(cp)}`); 9885} 9886function error_group_member(g, cp) { 9887 let quoted = quoted_cp(cp); 9888 let gg = GROUPS.find((g) => g.P.has(cp)); 9889 if (gg) quoted = `${gg.N} ${quoted}`; 9890 return /* @__PURE__ */ new Error(`illegal mixture: ${g.N} + ${quoted}`); 9891} 9892function error_placement(where) { 9893 return /* @__PURE__ */ new Error(`illegal placement: ${where}`); 9894} 9895function check_group(g, cps) { 9896 for (let cp of cps) if (!group_has_cp(g, cp)) throw error_group_member(g, cp); 9897 if (g.M) { 9898 let decomposed = nfd(cps); 9899 for (let i = 1, e = decomposed.length; i < e; i++) if (NSM.has(decomposed[i])) { 9900 let j = i + 1; 9901 for (let cp; j < e && NSM.has(cp = decomposed[j]); j++) for (let k = i; k < j; k++) if (decomposed[k] == cp) throw new Error(`duplicate non-spacing marks: ${quoted_cp(cp)}`); 9902 if (j - i > NSM_MAX) throw new Error(`excessive non-spacing marks: ${bidi_qq(safe_str_from_cps(decomposed.slice(i - 1, j)))} (${j - i}/${NSM_MAX})`); 9903 i = j; 9904 } 9905 } 9906} 9907function tokens_from_str(input, nf, ef) { 9908 let ret = []; 9909 let chars = []; 9910 input = input.slice().reverse(); 9911 while (input.length) { 9912 let emoji = consume_emoji_reversed(input); 9913 if (emoji) { 9914 if (chars.length) { 9915 ret.push(nf(chars)); 9916 chars = []; 9917 } 9918 ret.push(ef(emoji)); 9919 } else { 9920 let cp = input.pop(); 9921 if (VALID.has(cp)) chars.push(cp); 9922 else { 9923 let cps = MAPPED.get(cp); 9924 if (cps) chars.push(...cps); 9925 else if (!IGNORED.has(cp)) throw error_disallowed(cp); 9926 } 9927 } 9928 } 9929 if (chars.length) ret.push(nf(chars)); 9930 return ret; 9931} 9932function filter_fe0f(cps) { 9933 return cps.filter((cp) => cp != FE0F); 9934} 9935function consume_emoji_reversed(cps, eaten) { 9936 let node = EMOJI_ROOT; 9937 let emoji; 9938 let pos = cps.length; 9939 while (pos) { 9940 node = node.get(cps[--pos]); 9941 if (!node) break; 9942 let { V } = node; 9943 if (V) { 9944 emoji = V; 9945 if (eaten) eaten.push(...cps.slice(pos).reverse()); 9946 cps.length = pos; 9947 } 9948 } 9949 return emoji; 9950} 9951//#endregion 9952//#region node_modules/ethers/lib.esm/hash/namehash.js 9953var Zeros = /* @__PURE__ */ new Uint8Array(32); 9954Zeros.fill(0); 9955function checkComponent(comp) { 9956 assertArgument(comp.length !== 0, "invalid ENS name; empty component", "comp", comp); 9957 return comp; 9958} 9959function ensNameSplit(name) { 9960 const bytes = toUtf8Bytes(ensNormalize(name)); 9961 const comps = []; 9962 if (name.length === 0) return comps; 9963 let last = 0; 9964 for (let i = 0; i < bytes.length; i++) if (bytes[i] === 46) { 9965 comps.push(checkComponent(bytes.slice(last, i))); 9966 last = i + 1; 9967 } 9968 assertArgument(last < bytes.length, "invalid ENS name; empty component", "name", name); 9969 comps.push(checkComponent(bytes.slice(last))); 9970 return comps; 9971} 9972/** 9973* Returns the ENS %%name%% normalized. 9974*/ 9975function ensNormalize(name) { 9976 try { 9977 if (name.length === 0) throw new Error("empty label"); 9978 return ens_normalize(name); 9979 } catch (error) { 9980 assertArgument(false, `invalid ENS name (${error.message})`, "name", name); 9981 } 9982} 9983/** 9984* Returns ``true`` if %%name%% is a valid ENS name. 9985*/ 9986function isValidName(name) { 9987 try { 9988 return ensNameSplit(name).length !== 0; 9989 } catch (error) {} 9990 return false;
9991} 9992/** 9993* Returns the [[link-namehash]] for %%name%%. 9994*/ 9995function namehash(name) { 9996 assertArgument(typeof name === "string", "invalid ENS name; not a string", "name", name); 9997 assertArgument(name.length, `invalid ENS name (empty label)`, "name", name); 9998 let result = Zeros; 9999 const comps = ensNameSplit(name); 10000 while (comps.length) result = keccak256(concat([result, keccak256(comps.pop())])); 10001 return hexlify(result); 10002} 10003/** 10004* Returns the DNS encoded %%name%%. 10005* 10006* This is used for various parts of ENS name resolution, such 10007* as the wildcard resolution. 10008*/ 10009function dnsEncode(name, _maxLength) { 10010 const length = _maxLength != null ? _maxLength : 63; 10011 assertArgument(length <= 255, "DNS encoded label cannot exceed 255", "length", length); 10012 return hexlify(concat(ensNameSplit(name).map((comp) => { 10013 assertArgument(comp.length <= length, `label ${JSON.stringify(name)} exceeds ${length} bytes`, "name", name); 10014 const bytes = new Uint8Array(comp.length + 1); 10015 bytes.set(comp, 1); 10016 bytes[0] = bytes.length - 1; 10017 return bytes; 10018 }))) + "00"; 10019} 10020//#endregion 10021//#region node_modules/ethers/lib.esm/hash/message.js 10022/** 10023* Computes the [[link-eip-191]] personal-sign message digest to sign. 10024* 10025* This prefixes the message with [[MessagePrefix]] and the decimal length 10026* of %%message%% and computes the [[keccak256]] digest. 10027* 10028* If %%message%% is a string, it is converted to its UTF-8 bytes 10029* first. To compute the digest of a [[DataHexString]], it must be converted 10030* to [bytes](getBytes). 10031* 10032* @example: 10033* hashMessage("Hello World") 10034* //_result: 10035* 10036* // Hashes the SIX (6) string characters, i.e. 10037* // [ "0", "x", "4", "2", "4", "3" ] 10038* hashMessage("0x4243") 10039* //_result: 10040* 10041* // Hashes the TWO (2) bytes [ 0x42, 0x43 ]... 10042* hashMessage(getBytes("0x4243")) 10043* //_result: 10044* 10045* // ...which is equal to using data 10046* hashMessage(new Uint8Array([ 0x42, 0x43 ])) 10047* //_result: 10048* 10049*/ 10050function hashMessage(message) { 10051 if (typeof message === "string") message = toUtf8Bytes(message); 10052 return keccak256(concat([ 10053 toUtf8Bytes(MessagePrefix), 10054 toUtf8Bytes(String(message.length)), 10055 message 10056 ])); 10057} 10058/** 10059* Return the address of the private key that produced 10060* the signature %%sig%% during signing for %%message%%. 10061*/ 10062function verifyMessage(message, sig) { 10063 return recoverAddress(hashMessage(message), sig); 10064} 10065//#endregion 10066//#region node_modules/ethers/lib.esm/hash/solidity.js 10067var regexBytes = /* @__PURE__ */ new RegExp("^bytes([0-9]+)$"); 10068var regexNumber = /* @__PURE__ */ new RegExp("^(u?int)([0-9]*)$"); 10069var regexArray = /* @__PURE__ */ new RegExp("^(.*)\\[([0-9]*)\\]$"); 10070function _pack(type, value, isArray) { 10071 switch (type) { 10072 case "address": 10073 if (isArray) return getBytes(zeroPadValue(value, 32)); 10074 return getBytes(getAddress(value)); 10075 case "string": return toUtf8Bytes(value); 10076 case "bytes": return getBytes(value); 10077 case "bool": 10078 value = !!value ? "0x01" : "0x00"; 10079 if (isArray) return getBytes(zeroPadValue(value, 32)); 10080 return getBytes(value); 10081 } 10082 let match = type.match(regexNumber); 10083 if (match) { 10084 let signed = match[1] === "int"; 10085 let size = parseInt(match[2] || "256"); 10086 assertArgument((!match[2] || match[2] === String(size)) && size % 8 === 0 && size !== 0 && size <= 256, "invalid number type", "type", type); 10087 if (isArray) size = 256; 10088 if (signed) value = toTwos(value, size); 10089 return getBytes(zeroPadValue(toBeArray(value), size / 8)); 10090 } 10091 match = type.match(regexBytes); 10092 if (match) { 10093 const size = parseInt(match[1]); 10094 assertArgument(String(size) === match[1] && size !== 0 && size <= 32, "invalid bytes type", "type", type); 10095 assertArgument(dataLength(value) === size, `invalid value for ${type}`, "value", value); 10096 if (isArray) return getBytes(zeroPadBytes(value, 32)); 10097 return value; 10098 } 10099 match = type.match(regexArray); 10100 if (match && Array.isArray(value)) { 10101 const baseType = match[1]; 10102 assertArgument(parseInt(match[2] || String(value.length)) === value.length, `invalid array length for ${type}`, "value", value); 10103 const result = []; 10104 value.forEach(function(value) { 10105 result.push(_pack(baseType, value, true)); 10106 }); 10107 return getBytes(concat(result)); 10108 } 10109 assertArgument(false, "invalid type", "type", type); 10110} 10111/** 10112* Computes the [[link-solc-packed]] representation of %%values%% 10113* respectively to their %%types%%. 10114* 10115* @example: 10116* addr = "0x8ba1f109551bd432803012645ac136ddd64dba72" 10117* solidityPacked([ "address", "uint" ], [ addr, 45 ]); 10118* //_result: 10119*/ 10120function solidityPacked(types, values) { 10121 assertArgument(types.length === values.length, "wrong number of values; expected ${ types.length }", "values", values); 10122 const tight = [];
10123 types.forEach(function(type, index) { 10124 tight.push(_pack(type, values[index])); 10125 }); 10126 return hexlify(concat(tight)); 10127} 10128/** 10129* Computes the [[link-solc-packed]] [[keccak256]] hash of %%values%% 10130* respectively to their %%types%%. 10131* 10132* @example: 10133* addr = "0x8ba1f109551bd432803012645ac136ddd64dba72" 10134* solidityPackedKeccak256([ "address", "uint" ], [ addr, 45 ]); 10135* //_result: 10136*/ 10137function solidityPackedKeccak256(types, values) { 10138 return keccak256(solidityPacked(types, values)); 10139} 10140/** 10141* Computes the [[link-solc-packed]] [[sha256]] hash of %%values%% 10142* respectively to their %%types%%. 10143* 10144* @example: 10145* addr = "0x8ba1f109551bd432803012645ac136ddd64dba72" 10146* solidityPackedSha256([ "address", "uint" ], [ addr, 45 ]); 10147* //_result: 10148*/ 10149function solidityPackedSha256(types, values) { 10150 return sha256(solidityPacked(types, values)); 10151} 10152//#endregion 10153//#region node_modules/ethers/lib.esm/hash/typed-data.js 10154var padding = /* @__PURE__ */ new Uint8Array(32); 10155padding.fill(0); 10156var BN__1 = BigInt(-1); 10157var BN_0$3 = BigInt(0); 10158var BN_1$1 = BigInt(1); 10159var BN_MAX_UINT256 = BigInt("0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"); 10160function hexPadRight(value) { 10161 const bytes = getBytes(value); 10162 const padOffset = bytes.length % 32; 10163 if (padOffset) return concat([bytes, padding.slice(padOffset)]); 10164 return hexlify(bytes); 10165} 10166var hexTrue = toBeHex(BN_1$1, 32); 10167var hexFalse = toBeHex(BN_0$3, 32); 10168var domainFieldTypes = { 10169 name: "string", 10170 version: "string", 10171 chainId: "uint256", 10172 verifyingContract: "address", 10173 salt: "bytes32" 10174}; 10175var domainFieldNames = [ 10176 "name", 10177 "version", 10178 "chainId", 10179 "verifyingContract", 10180 "salt" 10181]; 10182function checkString(key) { 10183 return function(value) { 10184 assertArgument(typeof value === "string", `invalid domain value for ${JSON.stringify(key)}`, `domain.${key}`, value); 10185 return value; 10186 }; 10187} 10188var domainChecks = { 10189 name: checkString("name"), 10190 version: checkString("version"),
10191 chainId: function(_value) { 10192 const value = getBigInt(_value, "domain.chainId"); 10193 assertArgument(value >= 0, "invalid chain ID", "domain.chainId", _value); 10194 if (Number.isSafeInteger(value)) return Number(value); 10195 return toQuantity(value); 10196 }, 10197 verifyingContract: function(value) { 10198 try { 10199 return getAddress(value).toLowerCase(); 10200 } catch (error) {} 10201 assertArgument(false, `invalid domain value "verifyingContract"`, "domain.verifyingContract", value); 10202 }, 10203 salt: function(value) { 10204 const bytes = getBytes(value, "domain.salt"); 10205 assertArgument(bytes.length === 32, `invalid domain value "salt"`, "domain.salt", value); 10206 return hexlify(bytes); 10207 } 10208}; 10209function getBaseEncoder(type) { 10210 { 10211 const match = type.match(/^(u?)int(\d+)$/); 10212 if (match) { 10213 const signed = match[1] === ""; 10214 const width = parseInt(match[2]); 10215 assertArgument(width % 8 === 0 && width !== 0 && width <= 256 && match[2] === String(width), "invalid numeric width", "type", type); 10216 const boundsUpper = mask(BN_MAX_UINT256, signed ? width - 1 : width); 10217 const boundsLower = signed ? (boundsUpper + BN_1$1) * BN__1 : BN_0$3; 10218 return function(_value) { 10219 const value = getBigInt(_value, "value"); 10220 assertArgument(value >= boundsLower && value <= boundsUpper, `value out-of-bounds for ${type}`, "value", value); 10221 return toBeHex(signed ? toTwos(value, 256) : value, 32); 10222 }; 10223 } 10224 } 10225 { 10226 const match = type.match(/^bytes(\d+)$/); 10227 if (match) { 10228 const width = parseInt(match[1]); 10229 assertArgument(width !== 0 && width <= 32 && match[1] === String(width), "invalid bytes width", "type", type); 10230 return function(value) { 10231 assertArgument(getBytes(value).length === width, `invalid length for ${type}`, "value", value); 10232 return hexPadRight(value); 10233 }; 10234 } 10235 } 10236 switch (type) { 10237 case "address": return function(value) { 10238 return zeroPadValue(getAddress(value), 32); 10239 }; 10240 case "bool": return function(value) { 10241 return !value ? hexFalse : hexTrue; 10242 }; 10243 case "bytes": return function(value) { 10244 return keccak256(value); 10245 }; 10246 case "string": return function(value) { 10247 return id(value); 10248 }; 10249 } 10250 return null; 10251} 10252function encodeType(name, fields) { 10253 return `${name}(${fields.map(({ name, type }) => type + " " + name).join(",")})`; 10254} 10255function splitArray(type) { 10256 const match = type.match(/^([^\x5b]*)((\x5b\d*\x5d)*)(\x5b(\d*)\x5d)$/); 10257 if (match) return { 10258 base: match[1], 10259 index: match[2] + match[4], 10260 array: { 10261 base: match[1], 10262 prefix: match[1] + match[2], 10263 count: match[5] ? parseInt(match[5]) : -1 10264 } 10265 }; 10266 return { base: type }; 10267} 10268/** 10269* A **TypedDataEncode** prepares and encodes [[link-eip-712]] payloads 10270* for signed typed data. 10271* 10272* This is useful for those that wish to compute various components of a 10273* typed data hash, primary types, or sub-components, but generally the 10274* higher level [[Signer-signTypedData]] is more useful. 10275*/ 10276var TypedDataEncoder = class TypedDataEncoder { 10277 /** 10278 * The primary type for the structured [[types]]. 10279 * 10280 * This is derived automatically from the [[types]], since no 10281 * recursion is possible, once the DAG for the types is consturcted 10282 * internally, the primary type must be the only remaining type with 10283 * no parent nodes. 10284 */ 10285 primaryType; 10286 #types; 10287 /** 10288 * The types. 10289 */ 10290 get types() { 10291 return JSON.parse(this.#types); 10292 } 10293 #fullTypes; 10294 #encoderCache; 10295 /** 10296 * Create a new **TypedDataEncoder** for %%types%%. 10297 * 10298 * This performs all necessary checking that types are valid and 10299 * do not violate the [[link-eip-712]] structural constraints as 10300 * well as computes the [[primaryType]]. 10301 */ 10302 constructor(_types) { 10303 this.#fullTypes = /* @__PURE__ */ new Map(); 10304 this.#encoderCache = /* @__PURE__ */ new Map(); 10305 const links = /* @__PURE__ */ new Map(); 10306 const parents = /* @__PURE__ */ new Map(); 10307 const subtypes = /* @__PURE__ */ new Map(); 10308 const types = {}; 10309 Object.keys(_types).forEach((type) => { 10310 types[type] = _types[type].map(({ name, type }) => { 10311 let { base, index } = splitArray(type); 10312 if (base === "int" && !_types["int"]) base = "int256"; 10313 if (base === "uint" && !_types["uint"]) base = "uint256"; 10314 return { 10315 name, 10316 type: base + (index || "") 10317 }; 10318 });
vendor: 4,133 bytes, lines 10319-10438
10319 links.set(type, /* @__PURE__ */ new Set()); 10320 parents.set(type, []); 10321 subtypes.set(type, /* @__PURE__ */ new Set()); 10322 }); 10323 this.#types = JSON.stringify(types); 10324 for (const name in types) { 10325 const uniqueNames = /* @__PURE__ */ new Set(); 10326 for (const field of types[name]) { 10327 assertArgument(!uniqueNames.has(field.name), `duplicate variable name ${JSON.stringify(field.name)} in ${JSON.stringify(name)}`, "types", _types); 10328 uniqueNames.add(field.name); 10329 const baseType = splitArray(field.type).base; 10330 assertArgument(baseType !== name, `circular type reference to ${JSON.stringify(baseType)}`, "types", _types); 10331 if (getBaseEncoder(baseType)) continue; 10332 assertArgument(parents.has(baseType), `unknown type ${JSON.stringify(baseType)}`, "types", _types); 10333 parents.get(baseType).push(name); 10334 links.get(name).add(baseType); 10335 } 10336 } 10337 const primaryTypes = Array.from(parents.keys()).filter((n) => parents.get(n).length === 0); 10338 assertArgument(primaryTypes.length !== 0, "missing primary type", "types", _types); 10339 assertArgument(primaryTypes.length === 1, `ambiguous primary types or unused types: ${primaryTypes.map((t) => JSON.stringify(t)).join(", ")}`, "types", _types); 10340 defineProperties(this, { primaryType: primaryTypes[0] }); 10341 function checkCircular(type, found) { 10342 assertArgument(!found.has(type), `circular type reference to ${JSON.stringify(type)}`, "types", _types); 10343 found.add(type); 10344 for (const child of links.get(type)) { 10345 if (!parents.has(child)) continue; 10346 checkCircular(child, found); 10347 for (const subtype of found) subtypes.get(subtype).add(child); 10348 } 10349 found.delete(type); 10350 } 10351 checkCircular(this.primaryType, /* @__PURE__ */ new Set()); 10352 for (const [name, set] of subtypes) { 10353 const st = Array.from(set); 10354 st.sort(); 10355 this.#fullTypes.set(name, encodeType(name, types[name]) + st.map((t) => encodeType(t, types[t])).join("")); 10356 } 10357 } 10358 /** 10359 * Returnthe encoder for the specific %%type%%. 10360 */ 10361 getEncoder(type) { 10362 let encoder = this.#encoderCache.get(type); 10363 if (!encoder) { 10364 encoder = this.#getEncoder(type); 10365 this.#encoderCache.set(type, encoder); 10366 } 10367 return encoder; 10368 } 10369 #getEncoder(type) { 10370 { 10371 const encoder = getBaseEncoder(type); 10372 if (encoder) return encoder; 10373 } 10374 const array = splitArray(type).array; 10375 if (array) { 10376 const subtype = array.prefix; 10377 const subEncoder = this.getEncoder(subtype); 10378 return (value) => { 10379 assertArgument(array.count === -1 || array.count === value.length, `array length mismatch; expected length ${array.count}`, "value", value); 10380 let result = value.map(subEncoder); 10381 if (this.#fullTypes.has(subtype)) result = result.map(keccak256); 10382 return keccak256(concat(result)); 10383 }; 10384 } 10385 const fields = this.types[type]; 10386 if (fields) { 10387 const encodedType = id(this.#fullTypes.get(type)); 10388 return (value) => { 10389 const values = fields.map(({ name, type }) => { 10390 const result = this.getEncoder(type)(value[name]); 10391 if (this.#fullTypes.has(type)) return keccak256(result); 10392 return result; 10393 }); 10394 values.unshift(encodedType); 10395 return concat(values); 10396 }; 10397 } 10398 assertArgument(false, `unknown type: ${type}`, "type", type); 10399 } 10400 /** 10401 * Return the full type for %%name%%. 10402 */ 10403 encodeType(name) { 10404 const result = this.#fullTypes.get(name); 10405 assertArgument(result, `unknown type: ${JSON.stringify(name)}`, "name", name); 10406 return result; 10407 } 10408 /** 10409 * Return the encoded %%value%% for the %%type%%. 10410 */ 10411 encodeData(type, value) { 10412 return this.getEncoder(type)(value); 10413 } 10414 /** 10415 * Returns the hash of %%value%% for the type of %%name%%. 10416 */ 10417 hashStruct(name, value) { 10418 return keccak256(this.encodeData(name, value)); 10419 } 10420 /** 10421 * Return the fulled encoded %%value%% for the [[types]]. 10422 */ 10423 encode(value) { 10424 return this.encodeData(this.primaryType, value); 10425 } 10426 /** 10427 * Return the hash of the fully encoded %%value%% for the [[types]]. 10428 */ 10429 hash(value) { 10430 return this.hashStruct(this.primaryType, value); 10431 } 10432 /** 10433 * @_ignore: 10434 */ 10435 _visit(type, value, callback) { 10436 if (getBaseEncoder(type)) return callback(type, value); 10437 const array = splitArray(type).array; 10438 if (array) {
10439 assertArgument(array.count === -1 || array.count === value.length, `array length mismatch; expected length ${array.count}`, "value", value); 10440 return value.map((v) => this._visit(array.prefix, v, callback)); 10441 } 10442 const fields = this.types[type]; 10443 if (fields) return fields.reduce((accum, { name, type }) => { 10444 accum[name] = this._visit(type, value[name], callback); 10445 return accum; 10446 }, {}); 10447 assertArgument(false, `unknown type: ${type}`, "type", type); 10448 } 10449 /** 10450 * Call %%calback%% for each value in %%value%%, passing the type and 10451 * component within %%value%%. 10452 * 10453 * This is useful for replacing addresses or other transformation that 10454 * may be desired on each component, based on its type. 10455 */ 10456 visit(value, callback) { 10457 return this._visit(this.primaryType, value, callback); 10458 } 10459 /** 10460 * Create a new **TypedDataEncoder** for %%types%%. 10461 */ 10462 static from(types) { 10463 return new TypedDataEncoder(types); 10464 } 10465 /** 10466 * Return the primary type for %%types%%. 10467 */ 10468 static getPrimaryType(types) { 10469 return TypedDataEncoder.from(types).primaryType; 10470 } 10471 /** 10472 * Return the hashed struct for %%value%% using %%types%% and %%name%%. 10473 */ 10474 static hashStruct(name, types, value) { 10475 return TypedDataEncoder.from(types).hashStruct(name, value); 10476 } 10477 /** 10478 * Return the domain hash for %%domain%%. 10479 */ 10480 static hashDomain(domain) { 10481 const domainFields = []; 10482 for (const name in domain) { 10483 if (domain[name] == null) continue; 10484 const type = domainFieldTypes[name]; 10485 assertArgument(type, `invalid typed-data domain key: ${JSON.stringify(name)}`, "domain", domain); 10486 domainFields.push({ 10487 name, 10488 type 10489 }); 10490 } 10491 domainFields.sort((a, b) => { 10492 return domainFieldNames.indexOf(a.name) - domainFieldNames.indexOf(b.name); 10493 }); 10494 return TypedDataEncoder.hashStruct("EIP712Domain", { EIP712Domain: domainFields }, domain); 10495 } 10496 /** 10497 * Return the fully encoded [[link-eip-712]] %%value%% for %%types%% with %%domain%%. 10498 */ 10499 static encode(domain, types, value) { 10500 return concat([ 10501 "0x1901", 10502 TypedDataEncoder.hashDomain(domain), 10503 TypedDataEncoder.from(types).hash(value) 10504 ]); 10505 } 10506 /** 10507 * Return the hash of the fully encoded [[link-eip-712]] %%value%% for %%types%% with %%domain%%. 10508 */ 10509 static hash(domain, types, value) { 10510 return keccak256(TypedDataEncoder.encode(domain, types, value)); 10511 } 10512 /** 10513 * Resolves to the value from resolving all addresses in %%value%% for 10514 * %%types%% and the %%domain%%. 10515 */ 10516 static async resolveNames(domain, types, value, resolveName) { 10517 domain = Object.assign({}, domain); 10518 for (const key in domain) if (domain[key] == null) delete domain[key]; 10519 const ensCache = {}; 10520 if (domain.verifyingContract && !isHexString(domain.verifyingContract, 20)) ensCache[domain.verifyingContract] = "0x"; 10521 const encoder = TypedDataEncoder.from(types); 10522 encoder.visit(value, (type, value) => { 10523 if (type === "address" && !isHexString(value, 20)) ensCache[value] = "0x"; 10524 return value; 10525 }); 10526 for (const name in ensCache) ensCache[name] = await resolveName(name); 10527 if (domain.verifyingContract && ensCache[domain.verifyingContract]) domain.verifyingContract = ensCache[domain.verifyingContract]; 10528 value = encoder.visit(value, (type, value) => { 10529 if (type === "address" && ensCache[value]) return ensCache[value]; 10530 return value; 10531 }); 10532 return { 10533 domain, 10534 value 10535 }; 10536 } 10537 /** 10538 * Returns the JSON-encoded payload expected by nodes which implement 10539 * the JSON-RPC [[link-eip-712]] method. 10540 */ 10541 static getPayload(domain, types, value) { 10542 TypedDataEncoder.hashDomain(domain); 10543 const domainValues = {}; 10544 const domainTypes = []; 10545 domainFieldNames.forEach((name) => { 10546 const value = domain[name]; 10547 if (value == null) return; 10548 domainValues[name] = domainChecks[name](value); 10549 domainTypes.push({ 10550 name, 10551 type: domainFieldTypes[name] 10552 }); 10553 }); 10554 const encoder = TypedDataEncoder.from(types); 10555 types = encoder.types; 10556 const typesWithDomain = Object.assign({}, types); 10557 assertArgument(typesWithDomain.EIP712Domain == null, "types must not contain EIP712Domain type", "types.EIP712Domain", types); 10558 typesWithDomain.EIP712Domain = domainTypes; 10559 encoder.encode(value); 10560 return { 10561 types: typesWithDomain, 10562 domain: domainValues, 10563 primaryType: encoder.primaryType, 10564 message: encoder.visit(value, (type, value) => { 10565 if (type.match(/^bytes(\d*)/)) return hexlify(getBytes(value)); 10566 if (type.match(/^u?int/)) return getBigInt(value).toString(); 10567 switch (type) { 10568 case "address": return value.toLowerCase(); 10569 case "bool": return !!value; 10570 case "string": 10571 assertArgument(typeof value === "string", "invalid string", "value", value); 10572 return value; 10573 } 10574 assertArgument(false, "unsupported type", "type", type); 10575 }) 10576 }; 10577 } 10578}; 10579/** 10580* Compute the address used to sign the typed data for the %%signature%%. 10581*/ 10582function verifyTypedData(domain, types, value, signature) { 10583 return recoverAddress(TypedDataEncoder.hash(domain, types, value), signature); 10584} 10585//#endregion 10586//#region node_modules/ethers/lib.esm/abi/fragments.js 10587/** 10588* A fragment is a single item from an ABI, which may represent any of: 10589* 10590* - [Functions](FunctionFragment) 10591* - [Events](EventFragment) 10592* - [Constructors](ConstructorFragment) 10593* - Custom [Errors](ErrorFragment) 10594* - [Fallback or Receive](FallbackFragment) functions 10595* 10596* @_subsection api/abi/abi-coder:Fragments [about-fragments] 10597*/ 10598function setify(items) { 10599 const result = /* @__PURE__ */ new Set();
10600 items.forEach((k) => result.add(k)); 10601 return Object.freeze(result); 10602} 10603var KwVisibDeploy = setify("external public payable override".split(" ")); 10604var _kwVisib = "constant external internal payable private public pure view override"; 10605var KwVisib = setify(_kwVisib.split(" ")); 10606var _kwTypes = "constructor error event fallback function receive struct"; 10607var KwTypes = setify(_kwTypes.split(" ")); 10608var _kwModifiers = "calldata memory storage payable indexed"; 10609var KwModifiers = setify(_kwModifiers.split(" ")); 10610var Keywords = setify([ 10611 _kwTypes, 10612 _kwModifiers, 10613 "tuple returns", 10614 _kwVisib 10615].join(" ").split(" ")); 10616var SimpleTokens = { 10617 "(": "OPEN_PAREN", 10618 ")": "CLOSE_PAREN", 10619 "[": "OPEN_BRACKET", 10620 "]": "CLOSE_BRACKET", 10621 ",": "COMMA", 10622 "@": "AT" 10623}; 10624var regexWhitespacePrefix = /* @__PURE__ */ new RegExp("^(\\s*)"); 10625var regexNumberPrefix = /* @__PURE__ */ new RegExp("^([0-9]+)"); 10626var regexIdPrefix = /* @__PURE__ */ new RegExp("^([a-zA-Z$_][a-zA-Z0-9$_]*)"); 10627var regexId = /* @__PURE__ */ new RegExp("^([a-zA-Z$_][a-zA-Z0-9$_]*)$"); 10628var regexType = /* @__PURE__ */ new RegExp("^(address|bool|bytes([0-9]*)|string|u?int([0-9]*))$"); 10629var TokenString = class TokenString { 10630 #offset; 10631 #tokens; 10632 get offset() { 10633 return this.#offset; 10634 } 10635 get length() { 10636 return this.#tokens.length - this.#offset; 10637 } 10638 constructor(tokens) { 10639 this.#offset = 0; 10640 this.#tokens = tokens.slice(); 10641 } 10642 clone() { 10643 return new TokenString(this.#tokens); 10644 } 10645 reset() { 10646 this.#offset = 0; 10647 } 10648 #subTokenString(from = 0, to = 0) { 10649 return new TokenString(this.#tokens.slice(from, to).map((t) => { 10650 return Object.freeze(Object.assign({}, t, { 10651 match: t.match - from, 10652 linkBack: t.linkBack - from, 10653 linkNext: t.linkNext - from 10654 })); 10655 })); 10656 } 10657 popKeyword(allowed) { 10658 const top = this.peek(); 10659 if (top.type !== "KEYWORD" || !allowed.has(top.text)) throw new Error(`expected keyword ${top.text}`); 10660 return this.pop().text; 10661 } 10662 popType(type) { 10663 if (this.peek().type !== type) { 10664 const top = this.peek(); 10665 throw new Error(`expected ${type}; got ${top.type} ${JSON.stringify(top.text)}`); 10666 } 10667 return this.pop().text; 10668 } 10669 popParen() { 10670 const top = this.peek(); 10671 if (top.type !== "OPEN_PAREN") throw new Error("bad start"); 10672 const result = this.#subTokenString(this.#offset + 1, top.match + 1); 10673 this.#offset = top.match + 1; 10674 return result; 10675 } 10676 popParams() { 10677 const top = this.peek(); 10678 if (top.type !== "OPEN_PAREN") throw new Error("bad start"); 10679 const result = []; 10680 while (this.#offset < top.match - 1) { 10681 const link = this.peek().linkNext; 10682 result.push(this.#subTokenString(this.#offset + 1, link)); 10683 this.#offset = link; 10684 } 10685 this.#offset = top.match + 1; 10686 return result; 10687 } 10688 peek() { 10689 if (this.#offset >= this.#tokens.length) throw new Error("out-of-bounds"); 10690 return this.#tokens[this.#offset]; 10691 } 10692 peekKeyword(allowed) { 10693 const top = this.peekType("KEYWORD"); 10694 return top != null && allowed.has(top) ? top : null; 10695 } 10696 peekType(type) { 10697 if (this.length === 0) return null; 10698 const top = this.peek(); 10699 return top.type === type ? top.text : null; 10700 } 10701 pop() { 10702 const result = this.peek(); 10703 this.#offset++; 10704 return result; 10705 } 10706 toString() { 10707 const tokens = []; 10708 for (let i = this.#offset; i < this.#tokens.length; i++) { 10709 const token = this.#tokens[i]; 10710 tokens.push(`${token.type}:${token.text}`); 10711 } 10712 return `<TokenString ${tokens.join(" ")}>`; 10713 } 10714}; 10715function lex(text) { 10716 const tokens = []; 10717 const throwError = (message) => { 10718 const token = offset < text.length ? JSON.stringify(text[offset]) : "$EOI"; 10719 throw new Error(`invalid token ${token} at ${offset}: ${message}`); 10720 }; 10721 let brackets = []; 10722 let commas = []; 10723 let offset = 0; 10724 while (offset < text.length) { 10725 let cur = text.substring(offset); 10726 let match = cur.match(regexWhitespacePrefix); 10727 if (match) { 10728 offset += match[1].length; 10729 cur = text.substring(offset); 10730 } 10731 const token = { 10732 depth: brackets.length, 10733 linkBack: -1, 10734 linkNext: -1, 10735 match: -1, 10736 type: "", 10737 text: "", 10738 offset, 10739 value: -1 10740 }; 10741 tokens.push(token); 10742 let type = SimpleTokens[cur[0]] || ""; 10743 if (type) { 10744 token.type = type; 10745 token.text = cur[0]; 10746 offset++; 10747 if (type === "OPEN_PAREN") { 10748 brackets.push(tokens.length - 1); 10749 commas.push(tokens.length - 1); 10750 } else if (type == "CLOSE_PAREN") { 10751 if (brackets.length === 0) throwError("no matching open bracket"); 10752 token.match = brackets.pop(); 10753 tokens[token.match].match = tokens.length - 1; 10754 token.depth--; 10755 token.linkBack = commas.pop(); 10756 tokens[token.linkBack].linkNext = tokens.length - 1; 10757 } else if (type === "COMMA") { 10758 token.linkBack = commas.pop(); 10759 tokens[token.linkBack].linkNext = tokens.length - 1; 10760 commas.push(tokens.length - 1); 10761 } else if (type === "OPEN_BRACKET") token.type = "BRACKET"; 10762 else if (type === "CLOSE_BRACKET") { 10763 let suffix = tokens.pop().text; 10764 if (tokens.length > 0 && tokens[tokens.length - 1].type === "NUMBER") { 10765 const value = tokens.pop().text; 10766 suffix = value + suffix; 10767 tokens[tokens.length - 1].value = getNumber(value); 10768 } 10769 if (tokens.length === 0 || tokens[tokens.length - 1].type !== "BRACKET") throw new Error("missing opening bracket"); 10770 tokens[tokens.length - 1].text += suffix; 10771 } 10772 continue; 10773 } 10774 match = cur.match(regexIdPrefix); 10775 if (match) { 10776 token.text = match[1]; 10777 offset += token.text.length; 10778 if (Keywords.has(token.text)) { 10779 token.type = "KEYWORD"; 10780 continue; 10781 } 10782 if (token.text.match(regexType)) { 10783 token.type = "TYPE"; 10784 continue; 10785 } 10786 token.type = "ID"; 10787 continue; 10788 } 10789 match = cur.match(regexNumberPrefix); 10790 if (match) { 10791 token.text = match[1]; 10792 token.type = "NUMBER"; 10793 offset += token.text.length; 10794 continue; 10795 } 10796 throw new Error(`unexpected token ${JSON.stringify(cur[0])} at position ${offset}`); 10797 } 10798 return new TokenString(tokens.map((t) => Object.freeze(t))); 10799} 10800function allowSingle(set, allowed) { 10801 let included = []; 10802 for (const key in allowed.keys()) if (set.has(key)) included.push(key); 10803 if (included.length > 1) throw new Error(`conflicting types: ${included.join(", ")}`); 10804} 10805function consumeName(type, tokens) { 10806 if (tokens.peekKeyword(KwTypes)) { 10807 const keyword = tokens.pop().text; 10808 if (keyword !== type) throw new Error(`expected ${type}, got ${keyword}`); 10809 } 10810 return tokens.popType("ID"); 10811} 10812function consumeKeywords(tokens, allowed) { 10813 const keywords = /* @__PURE__ */ new Set(); 10814 while (true) { 10815 const keyword = tokens.peekType("KEYWORD"); 10816 if (keyword == null || allowed && !allowed.has(keyword)) break; 10817 tokens.pop(); 10818 if (keywords.has(keyword)) throw new Error(`duplicate keywords: ${JSON.stringify(keyword)}`); 10819 keywords.add(keyword); 10820 } 10821 return Object.freeze(keywords); 10822} 10823function consumeMutability(tokens) { 10824 let modifiers = consumeKeywords(tokens, KwVisib); 10825 allowSingle(modifiers, setify("constant payable nonpayable".split(" "))); 10826 allowSingle(modifiers, setify("pure view payable nonpayable".split(" "))); 10827 if (modifiers.has("view")) return "view"; 10828 if (modifiers.has("pure")) return "pure"; 10829 if (modifiers.has("payable")) return "payable"; 10830 if (modifiers.has("nonpayable")) return "nonpayable"; 10831 if (modifiers.has("constant")) return "view"; 10832 return "nonpayable"; 10833} 10834function consumeParams(tokens, allowIndexed) { 10835 return tokens.popParams().map((t) => ParamType.from(t, allowIndexed)); 10836} 10837function consumeGas(tokens) { 10838 if (tokens.peekType("AT")) { 10839 tokens.pop(); 10840 if (tokens.peekType("NUMBER")) return getBigInt(tokens.pop().text); 10841 throw new Error("invalid gas"); 10842 } 10843 return null; 10844} 10845function consumeEoi(tokens) { 10846 if (tokens.length) throw new Error(`unexpected tokens at offset ${tokens.offset}: ${tokens.toString()}`); 10847} 10848var regexArrayType = /* @__PURE__ */ new RegExp(/^(.*)\[([0-9]*)\]$/); 10849function verifyBasicType(type) { 10850 const match = type.match(regexType); 10851 assertArgument(match, "invalid type", "type", type); 10852 if (type === "uint") return "uint256"; 10853 if (type === "int") return "int256"; 10854 if (match[2]) { 10855 const length = parseInt(match[2]); 10856 assertArgument(length !== 0 && length <= 32, "invalid bytes length", "type", type); 10857 } else if (match[3]) { 10858 const size = parseInt(match[3]); 10859 assertArgument(size !== 0 && size <= 256 && size % 8 === 0, "invalid numeric width", "type", type); 10860 } 10861 return type; 10862} 10863var _guard$2 = {}; 10864var internal$1 = Symbol.for("_ethers_internal"); 10865var ParamTypeInternal = "_ParamTypeInternal"; 10866var ErrorFragmentInternal = "_ErrorInternal"; 10867var EventFragmentInternal = "_EventInternal"; 10868var ConstructorFragmentInternal = "_ConstructorInternal"; 10869var FallbackFragmentInternal = "_FallbackInternal"; 10870var FunctionFragmentInternal = "_FunctionInternal"; 10871var StructFragmentInternal = "_StructInternal"; 10872/** 10873* Each input and output of a [[Fragment]] is an Array of **ParamType**. 10874*/ 10875var ParamType = class ParamType { 10876 /** 10877 * The local name of the parameter (or ``""`` if unbound) 10878 */ 10879 name; 10880 /** 10881 * The fully qualified type (e.g. ``"address"``, ``"tuple(address)"``, 10882 * ``"uint256[3][]"``) 10883 */ 10884 type; 10885 /** 10886 * The base type (e.g. ``"address"``, ``"tuple"``, ``"array"``) 10887 */ 10888 baseType; 10889 /** 10890 * True if the parameters is indexed. 10891 * 10892 * For non-indexable types this is ``null``. 10893 */ 10894 indexed; 10895 /** 10896 * The components for the tuple. 10897 * 10898 * For non-tuple types this is ``null``. 10899 */ 10900 components; 10901 /** 10902 * The array length, or ``-1`` for dynamic-lengthed arrays. 10903 * 10904 * For non-array types this is ``null``. 10905 */ 10906 arrayLength; 10907 /** 10908 * The type of each child in the array. 10909 * 10910 * For non-array types this is ``null``. 10911 */ 10912 arrayChildren; 10913 /** 10914 * @private 10915 */ 10916 constructor(guard, name, type, baseType, indexed, components, arrayLength, arrayChildren) { 10917 assertPrivate(guard, _guard$2, "ParamType"); 10918 Object.defineProperty(this, internal$1, { value: ParamTypeInternal }); 10919 if (components) components = Object.freeze(components.slice()); 10920 if (baseType === "array") { 10921 if (arrayLength == null || arrayChildren == null) throw new Error(""); 10922 } else if (arrayLength != null || arrayChildren != null) throw new Error(""); 10923 if (baseType === "tuple") { 10924 if (components == null) throw new Error(""); 10925 } else if (components != null) throw new Error(""); 10926 defineProperties(this, { 10927 name, 10928 type, 10929 baseType, 10930 indexed,
10931 components, 10932 arrayLength, 10933 arrayChildren 10934 }); 10935 } 10936 /** 10937 * Return a string representation of this type. 10938 * 10939 * For example, 10940 * 10941 * ``sighash" => "(uint256,address)"`` 10942 * 10943 * ``"minimal" => "tuple(uint256,address) indexed"`` 10944 * 10945 * ``"full" => "tuple(uint256 foo, address bar) indexed baz"`` 10946 */ 10947 format(format) { 10948 if (format == null) format = "sighash"; 10949 if (format === "json") { 10950 const name = this.name || ""; 10951 if (this.isArray()) { 10952 const result = JSON.parse(this.arrayChildren.format("json")); 10953 result.name = name; 10954 result.type += `[${this.arrayLength < 0 ? "" : String(this.arrayLength)}]`; 10955 return JSON.stringify(result); 10956 } 10957 const result = { 10958 type: this.baseType === "tuple" ? "tuple" : this.type, 10959 name 10960 }; 10961 if (typeof this.indexed === "boolean") result.indexed = this.indexed; 10962 if (this.isTuple()) result.components = this.components.map((c) => JSON.parse(c.format(format))); 10963 return JSON.stringify(result); 10964 } 10965 let result = ""; 10966 if (this.isArray()) { 10967 result += this.arrayChildren.format(format); 10968 result += `[${this.arrayLength < 0 ? "" : String(this.arrayLength)}]`; 10969 } else if (this.isTuple()) result += "(" + this.components.map((comp) => comp.format(format)).join(format === "full" ? ", " : ",") + ")"; 10970 else result += this.type; 10971 if (format !== "sighash") { 10972 if (this.indexed === true) result += " indexed"; 10973 if (format === "full" && this.name) result += " " + this.name; 10974 } 10975 return result; 10976 } 10977 /** 10978 * Returns true if %%this%% is an Array type. 10979 * 10980 * This provides a type gaurd ensuring that [[arrayChildren]] 10981 * and [[arrayLength]] are non-null. 10982 */ 10983 isArray() { 10984 return this.baseType === "array"; 10985 } 10986 /** 10987 * Returns true if %%this%% is a Tuple type. 10988 * 10989 * This provides a type gaurd ensuring that [[components]] 10990 * is non-null. 10991 */ 10992 isTuple() { 10993 return this.baseType === "tuple"; 10994 } 10995 /** 10996 * Returns true if %%this%% is an Indexable type. 10997 * 10998 * This provides a type gaurd ensuring that [[indexed]] 10999 * is non-null. 11000 */ 11001 isIndexable() { 11002 return this.indexed != null; 11003 } 11004 /** 11005 * Walks the **ParamType** with %%value%%, calling %%process%% 11006 * on each type, destructing the %%value%% recursively. 11007 */ 11008 walk(value, process) { 11009 if (this.isArray()) { 11010 if (!Array.isArray(value)) throw new Error("invalid array value"); 11011 if (this.arrayLength !== -1 && value.length !== this.arrayLength) throw new Error("array is wrong length"); 11012 const _this = this; 11013 return value.map((v) => _this.arrayChildren.walk(v, process)); 11014 } 11015 if (this.isTuple()) { 11016 if (!Array.isArray(value)) throw new Error("invalid tuple value"); 11017 if (value.length !== this.components.length) throw new Error("array is wrong length"); 11018 const _this = this; 11019 return value.map((v, i) => _this.components[i].walk(v, process)); 11020 } 11021 return process(this.type, value); 11022 } 11023 #walkAsync(promises, value, process, setValue) { 11024 if (this.isArray()) { 11025 if (!Array.isArray(value)) throw new Error("invalid array value"); 11026 if (this.arrayLength !== -1 && value.length !== this.arrayLength) throw new Error("array is wrong length"); 11027 const childType = this.arrayChildren; 11028 const result = value.slice(); 11029 result.forEach((value, index) => { 11030 childType.#walkAsync(promises, value, process, (value) => { 11031 result[index] = value; 11032 }); 11033 }); 11034 setValue(result); 11035 return; 11036 } 11037 if (this.isTuple()) { 11038 const components = this.components; 11039 let result; 11040 if (Array.isArray(value)) result = value.slice(); 11041 else { 11042 if (value == null || typeof value !== "object") throw new Error("invalid tuple value"); 11043 result = components.map((param) => { 11044 if (!param.name) throw new Error("cannot use object value with unnamed components"); 11045 if (!(param.name in value)) throw new Error(`missing value for component ${param.name}`); 11046 return value[param.name]; 11047 }); 11048 } 11049 if (result.length !== this.components.length) throw new Error("array is wrong length"); 11050 result.forEach((value, index) => { 11051 components[index].#walkAsync(promises, value, process, (value) => { 11052 result[index] = value; 11053 }); 11054 }); 11055 setValue(result); 11056 return; 11057 } 11058 const result = process(this.type, value); 11059 if (result.then) promises.push((async function() { 11060 setValue(await result); 11061 })()); 11062 else setValue(result); 11063 } 11064 /** 11065 * Walks the **ParamType** with %%value%%, asynchronously calling 11066 * %%process%% on each type, destructing the %%value%% recursively. 11067 * 11068 * This can be used to resolve ENS names by walking and resolving each 11069 * ``"address"`` type. 11070 */ 11071 async walkAsync(value, process) { 11072 const promises = []; 11073 const result = [value]; 11074 this.#walkAsync(promises, value, process, (value) => { 11075 result[0] = value; 11076 }); 11077 if (promises.length) await Promise.all(promises); 11078 return result[0]; 11079 } 11080 /** 11081 * Creates a new **ParamType** for %%obj%%. 11082 * 11083 * If %%allowIndexed%% then the ``indexed`` keyword is permitted, 11084 * otherwise the ``indexed`` keyword will throw an error. 11085 */ 11086 static from(obj, allowIndexed) { 11087 if (ParamType.isParamType(obj)) return obj; 11088 if (typeof obj === "string") try { 11089 return ParamType.from(lex(obj), allowIndexed); 11090 } catch (error) { 11091 assertArgument(false, "invalid param type", "obj", obj); 11092 } 11093 else if (obj instanceof TokenString) { 11094 let type = "", baseType = ""; 11095 let comps = null; 11096 if (consumeKeywords(obj, setify(["tuple"])).has("tuple") || obj.peekType("OPEN_PAREN")) { 11097 baseType = "tuple"; 11098 comps = obj.popParams().map((t) => ParamType.from(t)); 11099 type = `tuple(${comps.map((c) => c.format()).join(",")})`; 11100 } else { 11101 type = verifyBasicType(obj.popType("TYPE")); 11102 baseType = type; 11103 } 11104 let arrayChildren = null; 11105 let arrayLength = null; 11106 while (obj.length && obj.peekType("BRACKET")) { 11107 const bracket = obj.pop(); 11108 arrayChildren = new ParamType(_guard$2, "", type, baseType, null, comps, arrayLength, arrayChildren); 11109 arrayLength = bracket.value; 11110 type += bracket.text; 11111 baseType = "array"; 11112 comps = null; 11113 } 11114 let indexed = null; 11115 if (consumeKeywords(obj, KwModifiers).has("indexed")) { 11116 if (!allowIndexed) throw new Error(""); 11117 indexed = true; 11118 } 11119 const name = obj.peekType("ID") ? obj.pop().text : ""; 11120 if (obj.length) throw new Error("leftover tokens"); 11121 return new ParamType(_guard$2, name, type, baseType, indexed, comps, arrayLength, arrayChildren); 11122 } 11123 const name = obj.name; 11124 assertArgument(!name || typeof name === "string" && name.match(regexId), "invalid name", "obj.name", name); 11125 let indexed = obj.indexed; 11126 if (indexed != null) { 11127 assertArgument(allowIndexed, "parameter cannot be indexed", "obj.indexed", obj.indexed); 11128 indexed = !!indexed; 11129 } 11130 let type = obj.type; 11131 let arrayMatch = type.match(regexArrayType); 11132 if (arrayMatch) { 11133 const arrayLength = parseInt(arrayMatch[2] || "-1"); 11134 const arrayChildren = ParamType.from({ 11135 type: arrayMatch[1], 11136 components: obj.components 11137 }); 11138 return new ParamType(_guard$2, name || "", type, "array", indexed, null, arrayLength, arrayChildren); 11139 } 11140 if (type === "tuple" || type.startsWith("tuple(") || type.startsWith("(")) { 11141 const comps = obj.components != null ? obj.components.map((c) => ParamType.from(c)) : null; 11142 return new ParamType(_guard$2, name || "", type, "tuple", indexed, comps, null, null); 11143 } 11144 type = verifyBasicType(obj.type); 11145 return new ParamType(_guard$2, name || "", type, type, indexed, null, null, null); 11146 } 11147 /** 11148 * Returns true if %%value%% is a **ParamType**. 11149 */ 11150 static isParamType(value) { 11151 return value && value[internal$1] === ParamTypeInternal; 11152 } 11153}; 11154/** 11155* An abstract class to represent An individual fragment from a parse ABI. 11156*/ 11157var Fragment = class Fragment { 11158 /** 11159 * The type of the fragment. 11160 */ 11161 type; 11162 /** 11163 * The inputs for the fragment. 11164 */ 11165 inputs; 11166 /** 11167 * @private 11168 */ 11169 constructor(guard, type, inputs) { 11170 assertPrivate(guard, _guard$2, "Fragment"); 11171 inputs = Object.freeze(inputs.slice()); 11172 defineProperties(this, { 11173 type, 11174 inputs 11175 }); 11176 } 11177 /** 11178 * Creates a new **Fragment** for %%obj%%, wich can be any supp
11178orted 11179 * ABI frgament type. 11180 */ 11181 static from(obj) { 11182 if (typeof obj === "string") { 11183 try { 11184 Fragment.from(JSON.parse(obj)); 11185 } catch (e) {} 11186 return Fragment.from(lex(obj)); 11187 } 11188 if (obj instanceof TokenString) switch (obj.peekKeyword(KwTypes)) { 11189 case "constructor": return ConstructorFragment.from(obj); 11190 case "error": return ErrorFragment.from(obj); 11191 case "event": return EventFragment.from(obj); 11192 case "fallback": 11193 case "receive": return FallbackFragment.from(obj); 11194 case "function": return FunctionFragment.from(obj); 11195 case "struct": return StructFragment.from(obj); 11196 } 11197 else if (typeof obj === "object") { 11198 switch (obj.type) { 11199 case "constructor": return ConstructorFragment.from(obj); 11200 case "error": return ErrorFragment.from(obj); 11201 case "event": return EventFragment.from(obj); 11202 case "fallback": 11203 case "receive": return FallbackFragment.from(obj); 11204 case "function": return FunctionFragment.from(obj); 11205 case "struct": return StructFragment.from(obj); 11206 } 11207 assert(false, `unsupported type: ${obj.type}`, "UNSUPPORTED_OPERATION", { operation: "Fragment.from" }); 11208 } 11209 assertArgument(false, "unsupported frgament object", "obj", obj); 11210 } 11211 /** 11212 * Returns true if %%value%% is a [[ConstructorFragment]]. 11213 */ 11214 static isConstructor(value) { 11215 return ConstructorFragment.isFragment(value); 11216 } 11217 /** 11218 * Returns true if %%value%% is an [[ErrorFragment]]. 11219 */ 11220 static isError(value) { 11221 return ErrorFragment.isFragment(value); 11222 } 11223 /** 11224 * Returns true if %%value%% is an [[EventFragment]]. 11225 */ 11226 static isEvent(value) { 11227 return EventFragment.isFragment(value); 11228 } 11229 /** 11230 * Returns true if %%value%% is a [[FunctionFragment]]. 11231 */ 11232 static isFunction(value) { 11233 return FunctionFragment.isFragment(value); 11234 } 11235 /** 11236 * Returns true if %%value%% is a [[StructFragment]]. 11237 */ 11238 static isStruct(value) { 11239 return StructFragment.isFragment(value); 11240 } 11241}; 11242/** 11243* An abstract class to represent An individual fragment 11244* which has a name from a parse ABI. 11245*/ 11246var NamedFragment = class extends Fragment { 11247 /** 11248 * The name of the fragment. 11249 */ 11250 name; 11251 /** 11252 * @private 11253 */ 11254 constructor(guard, type, name, inputs) { 11255 super(guard, type, inputs); 11256 assertArgument(typeof name === "string" && name.match(regexId), "invalid identifier", "name", name); 11257 inputs = Object.freeze(inputs.slice()); 11258 defineProperties(this, { name }); 11259 } 11260}; 11261function joinParams(format, params) { 11262 return "(" + params.map((p) => p.format(format)).join(format === "full" ? ", " : ",") + ")"; 11263} 11264/** 11265* A Fragment which represents a //Custom Error//. 11266*/ 11267var ErrorFragment = class ErrorFragment extends NamedFragment { 11268 /** 11269 * @private 11270 */ 11271 constructor(guard, name, inputs) { 11272 super(guard, "error", name, inputs); 11273 Object.defineProperty(this, internal$1, { value: ErrorFragmentInternal }); 11274 } 11275 /** 11276 * The Custom Error selector. 11277 */ 11278 get selector() { 11279 return id(this.format("sighash")).substring(0, 10); 11280 } 11281 /** 11282 * Returns a string representation of this fragment as %%format%%. 11283 */ 11284 format(format) { 11285 if (format == null) format = "sighash"; 11286 if (format === "json") return JSON.stringify({ 11287 type: "error", 11288 name: this.name, 11289 inputs: this.inputs.map((input) => JSON.parse(input.format(format))) 11290 }); 11291 const result = []; 11292 if (format !== "sighash") result.push("error"); 11293 result.push(this.name + joinParams(format, this.inputs)); 11294 return result.join(" "); 11295 } 11296 /** 11297 * Returns a new **ErrorFragment** for %%obj%%. 11298 */ 11299 static from(obj) { 11300 if (ErrorFragment.isFragment(obj)) return obj; 11301 if (typeof obj === "string") return ErrorFragment.from(lex(obj)); 11302 else if (obj instanceof TokenString) { 11303 const name = consumeName("error", obj); 11304 const inputs = consumeParams(obj); 11305 consumeEoi(obj); 11306 return new ErrorFragment(_guard$2, name, inputs); 11307 } 11308 return new ErrorFragment(_guard$2, obj.name, obj.inputs ? obj.inputs.map(ParamType.from) : []); 11309 } 11310 /** 11311 * Returns ``true`` and provides a type guard if %%value%% is an 11312 * **ErrorFragment**. 11313 */ 11314 static isFragment(value) { 11315 return value && value[internal$1] === ErrorFragmentInternal; 11316 } 11317}; 11318/** 11319* A Fragment which represents an Event. 11320*/ 11321var EventFragment = class EventFragment extends NamedFragment { 11322 /** 11323 * Whether this event is anonymous. 11324 */ 11325 anonymous; 11326 /** 11327 * @private 11328 */ 11329 constructor(guard, name, inputs, anonymous) { 11330 super(guard, "event", name, inputs); 11331 Object.defineProperty(this, internal$1, { value: EventFragmentInternal }); 11332 defineProperties(this, { anonymous }); 11333 } 11334 /** 11335 * The Event topic hash. 11336 */ 11337 get topicHash() { 11338 return id(this.format("sighash")); 11339 } 11340 /** 11341 * Returns a string representation of this event as %%format%%. 11342 */ 11343 format(format) { 11344 if (format == null) format = "sighash"; 11345 if (format === "json") return JSON.stringify({ 11346 type: "event", 11347 anonymous: this.anonymous, 11348 name: this.name, 11349 inputs: this.inputs.map((i) => JSON.parse(i.format(format))) 11350 }); 11351 const result = []; 11352 if (format !== "sighash") result.push("event"); 11353 result.push(this.name + joinParams(format, this.inputs)); 11354 if (format !== "sighash" && this.anonymous) result.push("anonymous"); 11355 return result.join(" "); 11356 } 11357 /** 11358 * Return the topic hash for an event with %%name%% and %%params%%. 11359 */ 11360 static getTopicHash(name, params) { 11361 params = (params || []).map((p) => ParamType.from(p)); 11362 return new EventFragment(_guard$2, name, params, false).topicHash; 11363 } 11364 /** 11365 * Returns a new **EventFragment** for %%obj%%. 11366 */ 11367 static from(obj) {
11368 if (EventFragment.isFragment(obj)) return obj; 11369 if (typeof obj === "string") try { 11370 return EventFragment.from(lex(obj)); 11371 } catch (error) { 11372 assertArgument(false, "invalid event fragment", "obj", obj); 11373 } 11374 else if (obj instanceof TokenString) { 11375 const name = consumeName("event", obj); 11376 const inputs = consumeParams(obj, true); 11377 const anonymous = !!consumeKeywords(obj, setify(["anonymous"])).has("anonymous"); 11378 consumeEoi(obj); 11379 return new EventFragment(_guard$2, name, inputs, anonymous); 11380 } 11381 return new EventFragment(_guard$2, obj.name, obj.inputs ? obj.inputs.map((p) => ParamType.from(p, true)) : [], !!obj.anonymous); 11382 } 11383 /** 11384 * Returns ``true`` and provides a type guard if %%value%% is an 11385 * **EventFragment**. 11386 */ 11387 static isFragment(value) { 11388 return value && value[internal$1] === EventFragmentInternal; 11389 } 11390}; 11391/** 11392* A Fragment which represents a constructor. 11393*/ 11394var ConstructorFragment = class ConstructorFragment extends Fragment { 11395 /** 11396 * Whether the constructor can receive an endowment. 11397 */ 11398 payable; 11399 /** 11400 * The recommended gas limit for deployment or ``null``. 11401 */ 11402 gas; 11403 /** 11404 * @private 11405 */ 11406 constructor(guard, type, inputs, payable, gas) { 11407 super(guard, type, inputs); 11408 Object.defineProperty(this, internal$1, { value: ConstructorFragmentInternal }); 11409 defineProperties(this, { 11410 payable, 11411 gas 11412 }); 11413 } 11414 /** 11415 * Returns a string representation of this constructor as %%format%%. 11416 */ 11417 format(format) { 11418 assert(format != null && format !== "sighash", "cannot format a constructor for sighash", "UNSUPPORTED_OPERATION", { operation: "format(sighash)" }); 11419 if (format === "json") return JSON.stringify({ 11420 type: "constructor", 11421 stateMutability: this.payable ? "payable" : "undefined", 11422 payable: this.payable, 11423 gas: this.gas != null ? this.gas : void 0, 11424 inputs: this.inputs.map((i) => JSON.parse(i.format(format))) 11425 }); 11426 const result = [`constructor${joinParams(format, this.inputs)}`]; 11427 if (this.payable) result.push("payable"); 11428 if (this.gas != null) result.push(`@${this.gas.toString()}`); 11429 return result.join(" "); 11430 } 11431 /** 11432 * Returns a new **ConstructorFragment** for %%obj%%. 11433 */ 11434 static from(obj) { 11435 if (ConstructorFragment.isFragment(obj)) return obj; 11436 if (typeof obj === "string") try { 11437 return ConstructorFragment.from(lex(obj)); 11438 } catch (error) { 11439 assertArgument(false, "invalid constuctor fragment", "obj", obj); 11440 } 11441 else if (obj instanceof TokenString) { 11442 consumeKeywords(obj, setify(["constructor"])); 11443 const inputs = consumeParams(obj); 11444 const payable = !!consumeKeywords(obj, KwVisibDeploy).has("payable"); 11445 const gas = consumeGas(obj); 11446 consumeEoi(obj); 11447 return new ConstructorFragment(_guard$2, "constructor", inputs, payable, gas); 11448 } 11449 return new ConstructorFragment(_guard$2, "constructor", obj.inputs ? obj.inputs.map(ParamType.from) : [], !!obj.payable, obj.gas != null ? obj.gas : null); 11450 } 11451 /** 11452 * Returns ``true`` and provides a type guard if %%value%% is a 11453 * **ConstructorFragment**. 11454 */ 11455 static isFragment(value) { 11456 return value && value[internal$1] === ConstructorFragmentInternal; 11457 } 11458}; 11459/** 11460* A Fragment which represents a method. 11461*/ 11462var FallbackFragment = class FallbackFragment extends Fragment { 11463 /** 11464 * If the function can be sent value during invocation. 11465 */ 11466 payable; 11467 constructor(guard, inputs, payable) { 11468 super(guard, "fallback", inputs); 11469 Object.defineProperty(this, internal$1, { value: FallbackFragmentInternal }); 11470 defineProperties(this, { payable }); 11471 } 11472 /** 11473 * Returns a string representation of this fallback as %%format%%. 11474 */ 11475 format(format) { 11476 const type = this.inputs.length === 0 ? "receive" : "fallback"; 11477 if (format === "json") { 11478 const stateMutability = this.payable ? "payable" : "nonpayable"; 11479 return JSON.stringify({ 11480 type, 11481 stateMutability 11482 }); 11483 } 11484 return `${type}()${this.payable ? " payable" : ""}`; 11485 } 11486 /** 11487 * Returns a new **FallbackFragment** for %%obj%%. 11488 */ 11489 static from(obj) { 11490 if (FallbackFragment.isFragment(obj)) return obj; 11491 if (typeof obj === "string") try { 11492 return FallbackFragment.from(lex(obj)); 11493 } catch (error) { 11494 assertArgument(false, "invalid fallback fragment", "obj", obj); 11495 } 11496 else if (obj instanceof TokenString) { 11497 const errorObj = obj.toString(); 11498 assertArgument(obj.peekKeyword(setify(["fallback", "receive"])), "type must be fallback or receive", "obj", errorObj); 11499 if (obj.popKeyword(setify(["fallback", "receive"])) === "receive") { 11500 const inputs = consumeParams(obj); 11501 assertArgument(inputs.length === 0, `receive cannot have arguments`, "obj.inputs", inputs); 11502 consumeKeywords(obj, setify(["payable"])); 11503 consumeEoi(obj); 11504 return new FallbackFragment(_guard$2, [], true); 11505 } 11506 let inputs = consumeParams(obj); 11507 if (inputs.length) assertArgument(inputs.length === 1 && inputs[0].type === "bytes", "invalid fallback inputs", "obj.inputs", inputs.map((i) => i.format("minimal")).join(", ")); 11508 else inputs = [ParamType.from("bytes")]; 11509 const mutability = consumeMutability(obj);
11510 assertArgument(mutability === "nonpayable" || mutability === "payable", "fallback cannot be constants", "obj.stateMutability", mutability); 11511 if (consumeKeywords(obj, setify(["returns"])).has("returns")) { 11512 const outputs = consumeParams(obj); 11513 assertArgument(outputs.length === 1 && outputs[0].type === "bytes", "invalid fallback outputs", "obj.outputs", outputs.map((i) => i.format("minimal")).join(", ")); 11514 } 11515 consumeEoi(obj); 11516 return new FallbackFragment(_guard$2, inputs, mutability === "payable"); 11517 } 11518 if (obj.type === "receive") return new FallbackFragment(_guard$2, [], true); 11519 if (obj.type === "fallback") { 11520 const inputs = [ParamType.from("bytes")]; 11521 const payable = obj.stateMutability === "payable"; 11522 return new FallbackFragment(_guard$2, inputs, payable); 11523 } 11524 assertArgument(false, "invalid fallback description", "obj", obj); 11525 } 11526 /** 11527 * Returns ``true`` and provides a type guard if %%value%% is a 11528 * **FallbackFragment**. 11529 */ 11530 static isFragment(value) { 11531 return value && value[internal$1] === FallbackFragmentInternal; 11532 } 11533}; 11534/** 11535* A Fragment which represents a method. 11536*/ 11537var FunctionFragment = class FunctionFragment extends NamedFragment { 11538 /** 11539 * If the function is constant (e.g. ``pure`` or ``view`` functions). 11540 */ 11541 constant; 11542 /** 11543 * The returned types for the result of calling this function. 11544 */ 11545 outputs; 11546 /** 11547 * The state mutability (e.g. ``payable``, ``nonpayable``, ``view`` 11548 * or ``pure``) 11549 */ 11550 stateMutability; 11551 /** 11552 * If the function can be sent value during invocation. 11553 */ 11554 payable; 11555 /** 11556 * The recommended gas limit to send when calling this function. 11557 */ 11558 gas; 11559 /** 11560 * @private 11561 */ 11562 constructor(guard, name, stateMutability, inputs, outputs, gas) { 11563 super(guard, "function", name, inputs); 11564 Object.defineProperty(this, internal$1, { value: FunctionFragmentInternal }); 11565 outputs = Object.freeze(outputs.slice()); 11566 const constant = stateMutability === "view" || stateMutability === "pure"; 11567 const payable = stateMutability === "payable"; 11568 defineProperties(this, { 11569 constant, 11570 gas, 11571 outputs, 11572 payable, 11573 stateMutability 11574 }); 11575 } 11576 /** 11577 * The Function selector. 11578 */ 11579 get selector() { 11580 return id(this.format("sighash")).substring(0, 10); 11581 } 11582 /** 11583 * Returns a string representation of this function as %%format%%. 11584 */ 11585 format(format) { 11586 if (format == null) format = "sighash"; 11587 if (format === "json") return JSON.stringify({ 11588 type: "function", 11589 name: this.name, 11590 constant: this.constant, 11591 stateMutability: this.stateMutability !== "nonpayable" ? this.stateMutability : void 0, 11592 payable: this.payable, 11593 gas: this.gas != null ? this.gas : void 0, 11594 inputs: this.inputs.map((i) => JSON.parse(i.format(format))), 11595 outputs: this.outputs.map((o) => JSON.parse(o.format(format))) 11596 }); 11597 const result = []; 11598 if (format !== "sighash") result.push("function"); 11599 result.push(this.name + joinParams(format, this.inputs)); 11600 if (format !== "sighash") { 11601 if (this.stateMutability !== "nonpayable") result.push(this.stateMutability); 11602 if (this.outputs && this.outputs.length) { 11603 result.push("returns"); 11604 result.push(joinParams(format, this.outputs)); 11605 } 11606 if (this.gas != null) result.push(`@${this.gas.toString()}`); 11607 } 11608 return result.join(" "); 11609 } 11610 /** 11611 * Return the selector for a function with %%name%% and %%params%%. 11612 */ 11613 static getSelector(name, params) { 11614 params = (params || []).map((p) => ParamType.from(p)); 11615 return new FunctionFragment(_guard$2, name, "view", params, [], null).selector; 11616 } 11617 /** 11618 * Returns a new **FunctionFragment** for %%obj%%. 11619 */ 11620 static from(obj) { 11621 if (FunctionFragment.isFragment(obj)) return obj; 11622 if (typeof obj === "string") try { 11623 return FunctionFragment.from(lex(obj)); 11624 } catch (error) { 11625 assertArgument(false, "invalid function fragment", "obj", obj); 11626 } 11627 else if (obj instanceof TokenString) { 11628 const name = consumeName("function", obj); 11629 const inputs = consumeParams(obj); 11630 const mutability = consumeMutability(obj); 11631 let outputs = []; 11632 if (consumeKeywords(obj, setify(["returns"])).has("returns")) outputs = consumeParams(obj); 11633 const gas = consumeGas(obj); 11634 consumeEoi(obj); 11635 return new FunctionFragment(_guard$2, name, mutability, inputs, outputs, gas); 11636 } 11637 let stateMutability = obj.stateMutability; 11638 if (stateMutability == null) { 11639 stateMutability = "payable"; 11640 if (typeof obj.constant === "boolean") { 11641 stateMutability = "view"; 11642 if (!obj.constant) { 11643 stateMutability = "payable"; 11644 if (typeof obj.payable === "boolean" && !obj.payable) stateMutability = "nonpayable"; 11645 } 11646 } else if (typeof obj.payable === "boolean" && !obj.payable) stateMutability = "nonpayable"; 11647 } 11648 return new FunctionFragment(_guard$2, obj.name, stateMutability, obj.inputs ? obj.inputs.map(ParamType.from) : [], obj.outputs ? obj.outputs.map(ParamType.from) : [], obj.gas != null ? obj.gas : null); 11649 } 11650 /** 11651 * Returns ``true`` and provides a type guard if %%value%% is a 11652 * **FunctionFragment**. 11653 */ 11654 static isFragment(value) { 11655 return value && value[internal$1] === FunctionFragmentInternal; 11656 } 11657}; 11658/** 11659* A Fragment which represents a structure. 11660*/ 11661var StructFragment = class StructFragment extends NamedFragment { 11662 /** 11663 * @private 11664 */ 11665 constructor(guard, name, inputs) { 11666 super(guard, "struct", name, inputs); 11667 Object.defineProperty(this, internal$1, { value: StructFragmentInternal }); 11668 } 11669 /** 11670 * Returns a string representation of this struct as %%format%%. 11671 */ 11672 format() { 11673 throw new Error("@TODO"); 11674 } 11675 /** 11676 * Returns a new **StructFragment** for %%obj%%. 11677 */ 11678 static from(obj) { 11679 if (typeof obj === "string") try { 11680 return StructFragment.from(lex(obj)); 11681 } catch (error) { 11682 assertArgument(false, "invalid struct fragment", "obj", obj); 11683 } 11684 else if (obj instanceof TokenString) { 11685 const name = consumeName("struct", obj); 11686 const inputs = consumeParams(obj); 11687 consumeEoi(obj); 11688 return new StructFragment(_guard$2, name, inputs); 11689 } 11690 return new StructFragment(_guard$2, obj.name, obj.inputs ? obj.inputs.map(ParamType.from) : []); 11691 } 11692 /** 11693 * Returns ``true`` and provides a type guard if %%value%% is a 11694 * **StructFragment**. 11695 */ 11696 static isFragment(value) { 11697 return value && value[internal$1] === StructFragmentInternal; 11698 } 11699}; 11700//#endregion 11701//#region node_modules/ethers/lib.esm/abi/abi-coder.js 11702/** 11703* When sending values to or receiving values from a [[Contract]], the 11704* data is generally encoded using the [ABI standard](link-solc-abi). 11705* 11706* The AbiCoder provides a utility to encode values to ABI data and 11707* decode values from ABI data. 11708* 11709* Most of the time, developers should favour the [[Contract]] class, 11710* which further abstracts a lot of the finer details of ABI data. 11711* 11712* @_section api/abi/abi-coder:ABI Encoding 11713*/ 11714var PanicReasons$1 = /* @__PURE__ */ new Map(); 11715PanicReasons$1.set(0, "GENERIC_PANIC"); 11716PanicReasons$1.set(1, "ASSERT_FALSE"); 11717PanicReasons$1.set(17, "OVERFLOW"); 11718PanicReasons$1.set(18, "DIVIDE_BY_ZERO"); 11719PanicReasons$1.set(33, "ENUM_RANGE_ERROR"); 11720PanicReasons$1.set(34, "BAD_STORAGE_DATA"); 11721PanicReasons$1.set(49, "STACK_UNDERFLOW"); 11722PanicReasons$1.set(50, "ARRAY_RANGE_ERROR"); 11723PanicReasons$1.set(65, "OUT_OF_MEMORY"); 11724PanicReasons$1.set(81, "UNINITIALIZED_FUNCTION_CALL"); 11725var paramTypeBytes = /* @__PURE__ */ new RegExp(/^bytes([0-9]*)$/); 11726var paramTypeNumber = /* @__PURE__ */ new RegExp(/^(u?int)([0-9]*)$/); 11727var defaultCoder = null; 11728var defaultMaxInflation = 1024; 11729function getBuiltinCallException(action, tx, data, abiCoder) { 11730 let message = "missing revert data"; 11731 let reason = null; 11732 const invocation = null; 11733 let revert = null; 11734 if (data) { 11735 message = "execution reverted"; 11736 const bytes = getBytes(data); 11737 data = hexlify(data); 11738 if (bytes.length === 0) {
11739 message += " (no data present; likely require(false) occurred"; 11740 reason = "require(false)"; 11741 } else if (bytes.length % 32 !== 4) message += " (could not decode reason; invalid data length)"; 11742 else if (hexlify(bytes.slice(0, 4)) === "0x08c379a0") try { 11743 reason = abiCoder.decode(["string"], bytes.slice(4))[0]; 11744 revert = { 11745 signature: "Error(string)", 11746 name: "Error", 11747 args: [reason] 11748 }; 11749 message += `: ${JSON.stringify(reason)}`; 11750 } catch (error) { 11751 message += " (could not decode reason; invalid string data)"; 11752 } 11753 else if (hexlify(bytes.slice(0, 4)) === "0x4e487b71") try { 11754 const code = Number(abiCoder.decode(["uint256"], bytes.slice(4))[0]); 11755 revert = { 11756 signature: "Panic(uint256)", 11757 name: "Panic", 11758 args: [code] 11759 }; 11760 reason = `Panic due to ${PanicReasons$1.get(code) || "UNKNOWN"}(${code})`; 11761 message += `: ${reason}`; 11762 } catch (error) { 11763 message += " (could not decode panic code)"; 11764 } 11765 else message += " (unknown custom error)"; 11766 } 11767 const transaction = { 11768 to: tx.to ? getAddress(tx.to) : null, 11769 data: tx.data || "0x" 11770 }; 11771 if (tx.from) transaction.from = getAddress(tx.from); 11772 return makeError(message, "CALL_EXCEPTION", { 11773 action, 11774 data, 11775 reason, 11776 transaction, 11777 invocation, 11778 revert 11779 }); 11780} 11781/** 11782* The **AbiCoder** is a low-level class responsible for encoding JavaScript 11783* values into binary data and decoding binary data into JavaScript values. 11784*/ 11785var AbiCoder = class AbiCoder { 11786 #getCoder(param) { 11787 if (param.isArray()) return new ArrayCoder(this.#getCoder(param.arrayChildren), param.arrayLength, param.name); 11788 if (param.isTuple()) return new TupleCoder(param.components.map((c) => this.#getCoder(c)), param.name); 11789 switch (param.baseType) { 11790 case "address": return new AddressCoder(param.name); 11791 case "bool": return new BooleanCoder(param.name); 11792 case "string": return new StringCoder(param.name); 11793 case "bytes": return new BytesCoder(param.name); 11794 case "": return new NullCoder(param.name); 11795 } 11796 let match = param.type.match(paramTypeNumber); 11797 if (match) { 11798 let size = parseInt(match[2] || "256"); 11799 assertArgument(size !== 0 && size <= 256 && size % 8 === 0, "invalid " + match[1] + " bit length", "param", param); 11800 return new NumberCoder(size / 8, match[1] === "int", param.name); 11801 } 11802 match = param.type.match(paramTypeBytes); 11803 if (match) { 11804 let size = parseInt(match[1]); 11805 assertArgument(size !== 0 && size <= 32, "invalid bytes length", "param", param); 11806 return new FixedBytesCoder(size, param.name); 11807 } 11808 assertArgument(false, "invalid type", "type", param.type); 11809 } 11810 /** 11811 * Get the default values for the given %%types%%. 11812 * 11813 * For example, a ``uint`` is by default ``0`` and ``bool`` 11814 * is by default ``false``. 11815 */ 11816 getDefaultValue(types) { 11817 return new TupleCoder(types.map((type) => this.#getCoder(ParamType.from(type))), "_").defaultValue(); 11818 } 11819 /** 11820 * Encode the %%values%% as the %%types%% into ABI data. 11821 * 11822 * @returns DataHexstring 11823 */ 11824 encode(types, values) { 11825 assertArgumentCount(values.length, types.length, "types/values length mismatch"); 11826 const coder = new TupleCoder(types.map((type) => this.#getCoder(ParamType.from(type))), "_"); 11827 const writer = new Writer(); 11828 coder.encode(writer, values); 11829 return writer.data; 11830 } 11831 /** 11832 * Decode the ABI %%data%% as the %%types%% into values. 11833 * 11834 * If %%loose%% decoding is enabled, then strict padding is 11835 * not enforced. Some older versions of Solidity incorrectly 11836 * padded event data emitted from ``external`` functions. 11837 */ 11838 decode(types, data, loose) { 11839 return new TupleCoder(types.map((type) => this.#getCoder(ParamType.from(type))), "_").decode(new Reader(data, loose, defaultMaxInflation)); 11840 } 11841 static _setDefaultMaxInflation(value) { 11842 assertArgument(typeof value === "number" && Number.isInteger(value), "invalid defaultMaxInflation factor", "value", value); 11843 defaultMaxInflation = value; 11844 } 11845 /** 11846 * Returns the shared singleton instance of a default [[AbiCoder]]. 11847 * 11848 * On the first call, the instance is created internally. 11849 */ 11850 static defaultAbiCoder() { 11851 if (defaultCoder == null) defaultCoder = new AbiCoder(); 11852 return defaultCoder; 11853 }
11854 /** 11855 * Returns an ethers-compatible [[CallExceptionError]] Error for the given 11856 * result %%data%% for the [[CallExceptionAction]] %%action%% against 11857 * the Transaction %%tx%%. 11858 */ 11859 static getBuiltinCallException(action, tx, data) { 11860 return getBuiltinCallException(action, tx, data, AbiCoder.defaultAbiCoder()); 11861 } 11862}; 11863//#endregion 11864//#region node_modules/ethers/lib.esm/abi/bytes32.js 11865/** 11866* About bytes32 strings... 11867* 11868* @_docloc: api/utils:Bytes32 Strings 11869*/ 11870/** 11871* Encodes %%text%% as a Bytes32 string. 11872*/ 11873function encodeBytes32String(text) { 11874 const bytes = toUtf8Bytes(text); 11875 if (bytes.length > 31) throw new Error("bytes32 string must be less than 32 bytes"); 11876 return zeroPadBytes(bytes, 32); 11877} 11878/** 11879* Encodes the Bytes32-encoded %%bytes%% into a string. 11880*/ 11881function decodeBytes32String(_bytes) { 11882 const data = getBytes(_bytes, "bytes"); 11883 if (data.length !== 32) throw new Error("invalid bytes32 - not 32 bytes long"); 11884 if (data[31] !== 0) throw new Error("invalid bytes32 string - no null terminator"); 11885 let length = 31; 11886 while (data[length - 1] === 0) length--; 11887 return toUtf8String(data.slice(0, length)); 11888} 11889//#endregion 11890//#region node_modules/ethers/lib.esm/abi/interface.js 11891/** 11892* The Interface class is a low-level class that accepts an 11893* ABI and provides all the necessary functionality to encode 11894* and decode paramaters to and results from methods, events 11895* and errors. 11896* 11897* It also provides several convenience methods to automatically 11898* search and find matching transactions and events to parse them. 11899* 11900* @_subsection api/abi:Interfaces [interfaces] 11901*/ 11902/** 11903* When using the [[Interface-parseLog]] to automatically match a Log to its event 11904* for parsing, a **LogDescription** is returned. 11905*/ 11906var LogDescription = class { 11907 /** 11908 * The matching fragment for the ``topic0``. 11909 */ 11910 fragment; 11911 /** 11912 * The name of the Event. 11913 */ 11914 name; 11915 /** 11916 * The full Event signature. 11917 */ 11918 signature; 11919 /** 11920 * The topic hash for the Event. 11921 */ 11922 topic; 11923 /** 11924 * The arguments passed into the Event with ``emit``. 11925 */ 11926 args; 11927 /** 11928 * @_ignore: 11929 */ 11930 constructor(fragment, topic, args) { 11931 const name = fragment.name, signature = fragment.format(); 11932 defineProperties(this, { 11933 fragment, 11934 name, 11935 signature, 11936 topic, 11937 args 11938 }); 11939 } 11940}; 11941/** 11942* When using the [[Interface-parseTransaction]] to automatically match 11943* a transaction data to its function for parsing, 11944* a **TransactionDescription** is returned. 11945*/ 11946var TransactionDescription = class { 11947 /** 11948 * The matching fragment from the transaction ``data``. 11949 */ 11950 fragment; 11951 /** 11952 * The name of the Function from the transaction ``data``. 11953 */ 11954 name; 11955 /** 11956 * The arguments passed to the Function from the transaction ``data``. 11957 */ 11958 args; 11959 /** 11960 * The full Function signature from the transaction ``data``. 11961 */ 11962 signature; 11963 /** 11964 * The selector for the Function from the transaction ``data``. 11965 */ 11966 selector; 11967 /** 11968 * The ``value`` (in wei) from the transaction. 11969 */ 11970 value; 11971 /** 11972 * @_ignore: 11973 */ 11974 constructor(fragment, selector, args, value) { 11975 const name = fragment.name, signature = fragment.format(); 11976 defineProperties(this, { 11977 fragment, 11978 name, 11979 args, 11980 signature, 11981 selector, 11982 value 11983 }); 11984 } 11985}; 11986/** 11987* When using the [[Interface-parseError]] to automatically match an 11988* error for a call result for parsing, an **ErrorDescription** is returned. 11989*/ 11990var ErrorDescription = class { 11991 /** 11992 * The matching fragment. 11993 */ 11994 fragment; 11995 /** 11996 * The name of the Error. 11997 */ 11998 name; 11999 /** 12000 * The arguments passed to the Error with ``revert``. 12001 */ 12002 args; 12003 /** 12004 * The full Error signature. 12005 */ 12006 signature; 12007 /** 12008 * The selector for the Error. 12009 */ 12010 selector; 12011 /** 12012 * @_ignore: 12013 */ 12014 constructor(fragment, selector, args) { 12015 const name = fragment.name, signature = fragment.format(); 12016 defineProperties(this, { 12017 fragment, 12018 name, 12019 args, 12020 signature, 12021 selector 12022 }); 12023 } 12024}; 12025/** 12026* An **Indexed** is used as a value when a value that does not 12027* fit within a topic (i.e. not a fixed-length, 32-byte type). It 12028* is the ``keccak256`` of the value, and used for types such as 12029* arrays, tuples, bytes and strings. 12030*/ 12031var Indexed = class { 12032 /** 12033 * The ``keccak256`` of the value logged. 12034 */ 12035 hash; 12036 /** 12037 * @_ignore: 12038 */ 12039 _isIndexed; 12040 /** 12041 * Returns ``true`` if %%value%% is an **Indexed**. 12042 * 12043 * This provides a Type Guard for property access. 12044 */ 12045 static isIndexed(value) { 12046 return !!(value && value._isIndexed); 12047 } 12048 /** 12049 * @_ignore: 12050 */ 12051 constructor(hash) { 12052 defineProperties(this, { 12053 hash, 12054 _isIndexed: true 12055 }); 12056 } 12057}; 12058var PanicReasons = { 12059 "0": "generic panic", 12060 "1": "assert(false)", 12061 "17": "arithmetic overflow", 12062 "18": "division or modulo by zero", 12063 "33": "enum overflow",
12064 "34": "invalid encoded storage byte array accessed", 12065 "49": "out-of-bounds array access; popping on an empty array", 12066 "50": "out-of-bounds access of an array or bytesN", 12067 "65": "out of memory", 12068 "81": "uninitialized function" 12069}; 12070var BuiltinErrors = { 12071 "0x08c379a0": { 12072 signature: "Error(string)", 12073 name: "Error", 12074 inputs: ["string"], 12075 reason: (message) => { 12076 return `reverted with reason string ${JSON.stringify(message)}`; 12077 } 12078 }, 12079 "0x4e487b71": { 12080 signature: "Panic(uint256)", 12081 name: "Panic", 12082 inputs: ["uint256"], 12083 reason: (code) => { 12084 let reason = "unknown panic code"; 12085 if (code >= 0 && code <= 255 && PanicReasons[code.toString()]) reason = PanicReasons[code.toString()]; 12086 return `reverted with panic code 0x${code.toString(16)} (${reason})`; 12087 } 12088 } 12089}; 12090/** 12091* An Interface abstracts many of the low-level details for 12092* encoding and decoding the data on the blockchain. 12093* 12094* An ABI provides information on how to encode data to send to 12095* a Contract, how to decode the results and events and how to 12096* interpret revert errors. 12097* 12098* The ABI can be specified by [any supported format](InterfaceAbi). 12099*/ 12100var Interface = class Interface { 12101 /** 12102 * All the Contract ABI members (i.e. methods, events, errors, etc). 12103 */ 12104 fragments; 12105 /** 12106 * The Contract constructor. 12107 */ 12108 deploy; 12109 /** 12110 * The Fallback method, if any. 12111 */ 12112 fallback; 12113 /** 12114 * If receiving ether is supported. 12115 */ 12116 receive; 12117 #errors; 12118 #events; 12119 #functions; 12120 #abiCoder; 12121 /** 12122 * Create a new Interface for the %%fragments%%. 12123 */ 12124 constructor(fragments) { 12125 let abi = []; 12126 if (typeof fragments === "string") abi = JSON.parse(fragments); 12127 else abi = fragments; 12128 this.#functions = /* @__PURE__ */ new Map(); 12129 this.#errors = /* @__PURE__ */ new Map(); 12130 this.#events = /* @__PURE__ */ new Map(); 12131 const frags = []; 12132 for (const a of abi) try { 12133 frags.push(Fragment.from(a)); 12134 } catch (error) { 12135 console.log(`[Warning] Invalid Fragment ${JSON.stringify(a)}:`, error.message); 12136 } 12137 defineProperties(this, { fragments: Object.freeze(frags) }); 12138 let fallback = null; 12139 let receive = false; 12140 this.#abiCoder = this.getAbiCoder(); 12141 this.fragments.forEach((fragment, index) => { 12142 let bucket; 12143 switch (fragment.type) { 12144 case "constructor": 12145 if (this.deploy) { 12146 console.log("duplicate definition - constructor"); 12147 return; 12148 } 12149 defineProperties(this, { deploy: fragment }); 12150 return; 12151 case "fallback": 12152 if (fragment.inputs.length === 0) receive = true; 12153 else { 12154 assertArgument(!fallback || fragment.payable !== fallback.payable, "conflicting fallback fragments", `fragments[${index}]`, fragment); 12155 fallback = fragment; 12156 receive = fallback.payable; 12157 } 12158 return; 12159 case "function": 12160 bucket = this.#functions; 12161 break; 12162 case "event": 12163 bucket = this.#events; 12164 break; 12165 case "error": 12166 bucket = this.#errors; 12167 break; 12168 default: return; 12169 } 12170 const signature = fragment.format(); 12171 if (bucket.has(signature)) return; 12172 bucket.set(signature, fragment); 12173 }); 12174 if (!this.deploy) defineProperties(this, { deploy: ConstructorFragment.from("constructor()") }); 12175 defineProperties(this, { 12176 fallback, 12177 receive 12178 }); 12179 } 12180 /** 12181 * Returns the entire Human-Readable ABI, as an array of 12182 * signatures, optionally as %%minimal%% strings, which 12183 * removes parameter names and unneceesary spaces. 12184 */ 12185 format(minimal) { 12186 const format = minimal ? "minimal" : "full"; 12187 return this.fragments.map((f) => f.format(format)); 12188 } 12189 /** 12190 * Return the JSON-encoded ABI. This is the format Solidiy 12191 * returns. 12192 */ 12193 formatJson() { 12194 const abi = this.fragments.map((f) => f.format("json")); 12195 return JSON.stringify(abi.map((j) => JSON.parse(j))); 12196 } 12197 /** 12198 * The ABI coder that will be used to encode and decode binary 12199 * data. 12200 */ 12201 getAbiCoder() { 12202 return AbiCoder.defaultAbiCoder(); 12203 } 12204 #getFunction(key, values, forceUnique) { 12205 if (isHexString(key)) { 12206 const selector = key.toLowerCase(); 12207 for (const fragment of this.#functions.values()) if (selector === fragment.selector) return fragment; 12208 return null; 12209 } 12210 if (key.indexOf("(") === -1) { 12211 const matching = []; 12212 for (const [name, fragment] of this.#functions) if (name.split("(")[0] === key) matching.push(fragment); 12213 if (values) {
12214 const lastValue = values.length > 0 ? values[values.length - 1] : null; 12215 let valueLength = values.length; 12216 let allowOptions = true; 12217 if (Typed.isTyped(lastValue) && lastValue.type === "overrides") { 12218 allowOptions = false; 12219 valueLength--; 12220 } 12221 for (let i = matching.length - 1; i >= 0; i--) { 12222 const inputs = matching[i].inputs.length; 12223 if (inputs !== valueLength && (!allowOptions || inputs !== valueLength - 1)) matching.splice(i, 1); 12224 } 12225 for (let i = matching.length - 1; i >= 0; i--) { 12226 const inputs = matching[i].inputs; 12227 for (let j = 0; j < values.length; j++) { 12228 if (!Typed.isTyped(values[j])) continue; 12229 if (j >= inputs.length) { 12230 if (values[j].type === "overrides") continue; 12231 matching.splice(i, 1); 12232 break; 12233 } 12234 if (values[j].type !== inputs[j].baseType) { 12235 matching.splice(i, 1); 12236 break; 12237 } 12238 } 12239 } 12240 } 12241 if (matching.length === 1 && values && values.length !== matching[0].inputs.length) { 12242 const lastArg = values[values.length - 1]; 12243 if (lastArg == null || Array.isArray(lastArg) || typeof lastArg !== "object") matching.splice(0, 1); 12244 } 12245 if (matching.length === 0) return null; 12246 if (matching.length > 1 && forceUnique) assertArgument(false, `ambiguous function description (i.e. matches ${matching.map((m) => JSON.stringify(m.format())).join(", ")})`, "key", key); 12247 return matching[0]; 12248 } 12249 const result = this.#functions.get(FunctionFragment.from(key).format()); 12250 if (result) return result; 12251 return null; 12252 } 12253 /** 12254 * Get the function name for %%key%%, which may be a function selector, 12255 * function name or function signature that belongs to the ABI. 12256 */ 12257 getFunctionName(key) { 12258 const fragment = this.#getFunction(key, null, false); 12259 assertArgument(fragment, "no matching function", "key", key); 12260 return fragment.name; 12261 } 12262 /** 12263 * Returns true if %%key%% (a function selector, function name or 12264 * function signature) is present in the ABI. 12265 * 12266 * In the case of a function name, the name may be ambiguous, so 12267 * accessing the [[FunctionFragment]] may require refinement. 12268 */ 12269 hasFunction(key) { 12270 return !!this.#getFunction(key, null, false); 12271 } 12272 /** 12273 * Get the [[FunctionFragment]] for %%key%%, which may be a function 12274 * selector, function name or function signature that belongs to the ABI. 12275 * 12276 * If %%values%% is provided, it will use the Typed API to handle 12277 * ambiguous cases where multiple functions match by name. 12278 * 12279 * If the %%key%% and %%values%% do not refine to a single function in 12280 * the ABI, this will throw. 12281 */ 12282 getFunction(key, values) { 12283 return this.#getFunction(key, values || null, true); 12284 } 12285 /** 12286 * Iterate over all functions, calling %%callback%%, sorted by their name. 12287 */ 12288 forEachFunction(callback) { 12289 const names = Array.from(this.#functions.keys()); 12290 names.sort((a, b) => a.localeCompare(b)); 12291 for (let i = 0; i < names.length; i++) { 12292 const name = names[i]; 12293 callback(this.#functions.get(name), i); 12294 } 12295 } 12296 #getEvent(key, values, forceUnique) { 12297 if (isHexString(key)) { 12298 const eventTopic = key.toLowerCase(); 12299 for (const fragment of this.#events.values()) if (eventTopic === fragment.topicHash) return fragment; 12300 return null; 12301 } 12302 if (key.indexOf("(") === -1) { 12303 const matching = []; 12304 for (const [name, fragment] of this.#events) if (name.split("(")[0] === key) matching.push(fragment); 12305 if (values) { 12306 for (let i = matching.length - 1; i >= 0; i--) if (matching[i].inputs.length < values.length) matching.splice(i, 1); 12307 for (let i = matching.length - 1; i >= 0; i--) { 12308 const inputs = matching[i].inputs; 12309 for (let j = 0; j < values.length; j++) { 12310 if (!Typed.isTyped(values[j])) continue; 12311 if (values[j].type !== inputs[j].baseType) { 12312 matching.splice(i, 1); 12313 break; 12314 } 12315 } 12316 } 12317 } 12318 if (matching.length === 0) return null; 12319 if (matching.length > 1 && forceUnique) assertArgument(false, `ambiguous event description (i.e. matches ${matching.map((m) => JSON.stringify(m.format())).join(", ")})`, "key", key); 12320 return matching[0]; 12321 } 12322 const result = this.#events.get(EventFragment.from(key).format()); 12323 if (result) return result; 12324 return null; 12325 }
12326 /** 12327 * Get the event name for %%key%%, which may be a topic hash, 12328 * event name or event signature that belongs to the ABI. 12329 */ 12330 getEventName(key) { 12331 const fragment = this.#getEvent(key, null, false); 12332 assertArgument(fragment, "no matching event", "key", key); 12333 return fragment.name; 12334 } 12335 /** 12336 * Returns true if %%key%% (an event topic hash, event name or 12337 * event signature) is present in the ABI. 12338 * 12339 * In the case of an event name, the name may be ambiguous, so 12340 * accessing the [[EventFragment]] may require refinement. 12341 */ 12342 hasEvent(key) { 12343 return !!this.#getEvent(key, null, false); 12344 } 12345 /** 12346 * Get the [[EventFragment]] for %%key%%, which may be a topic hash, 12347 * event name or event signature that belongs to the ABI. 12348 * 12349 * If %%values%% is provided, it will use the Typed API to handle 12350 * ambiguous cases where multiple events match by name. 12351 * 12352 * If the %%key%% and %%values%% do not refine to a single event in 12353 * the ABI, this will throw. 12354 */ 12355 getEvent(key, values) { 12356 return this.#getEvent(key, values || null, true); 12357 } 12358 /** 12359 * Iterate over all events, calling %%callback%%, sorted by their name. 12360 */ 12361 forEachEvent(callback) { 12362 const names = Array.from(this.#events.keys()); 12363 names.sort((a, b) => a.localeCompare(b)); 12364 for (let i = 0; i < names.length; i++) { 12365 const name = names[i]; 12366 callback(this.#events.get(name), i); 12367 } 12368 } 12369 /** 12370 * Get the [[ErrorFragment]] for %%key%%, which may be an error 12371 * selector, error name or error signature that belongs to the ABI. 12372 * 12373 * If %%values%% is provided, it will use the Typed API to handle 12374 * ambiguous cases where multiple errors match by name. 12375 * 12376 * If the %%key%% and %%values%% do not refine to a single error in 12377 * the ABI, this will throw. 12378 */ 12379 getError(key, values) { 12380 if (isHexString(key)) { 12381 const selector = key.toLowerCase(); 12382 if (BuiltinErrors[selector]) return ErrorFragment.from(BuiltinErrors[selector].signature); 12383 for (const fragment of this.#errors.values()) if (selector === fragment.selector) return fragment; 12384 return null; 12385 } 12386 if (key.indexOf("(") === -1) { 12387 const matching = []; 12388 for (const [name, fragment] of this.#errors) if (name.split("(")[0] === key) matching.push(fragment); 12389 if (matching.length === 0) { 12390 if (key === "Error") return ErrorFragment.from("error Error(string)"); 12391 if (key === "Panic") return ErrorFragment.from("error Panic(uint256)"); 12392 return null; 12393 } else if (matching.length > 1) assertArgument(false, `ambiguous error description (i.e. ${matching.map((m) => JSON.stringify(m.format())).join(", ")})`, "name", key); 12394 return matching[0]; 12395 } 12396 key = ErrorFragment.from(key).format(); 12397 if (key === "Error(string)") return ErrorFragment.from("error Error(string)"); 12398 if (key === "Panic(uint256)") return ErrorFragment.from("error Panic(uint256)"); 12399 const result = this.#errors.get(key); 12400 if (result) return result; 12401 return null; 12402 } 12403 /** 12404 * Iterate over all errors, calling %%callback%%, sorted by their name. 12405 */ 12406 forEachError(callback) { 12407 const names = Array.from(this.#errors.keys()); 12408 names.sort((a, b) => a.localeCompare(b)); 12409 for (let i = 0; i < names.length; i++) { 12410 const name = names[i]; 12411 callback(this.#errors.get(name), i); 12412 } 12413 } 12414 _decodeParams(params, data) { 12415 return this.#abiCoder.decode(params, data); 12416 } 12417 _encodeParams(params, values) { 12418 return this.#abiCoder.encode(params, values); 12419 } 12420 /** 12421 * Encodes a ``tx.data`` object for deploying the Contract with 12422 * the %%values%% as the constructor arguments. 12423 */ 12424 encodeDeploy(values) { 12425 return this._encodeParams(this.deploy.inputs, values || []); 12426 } 12427 /** 12428 * Decodes the result %%data%% (e.g. from an ``eth_call``) for the 12429 * specified error (see [[getError]] for valid values for 12430 * %%key%%). 12431 * 12432 * Most developers should prefer the [[parseCallResult]] method instead, 12433 * which will automatically detect a ``CALL_EXCEPTION`` and throw the 12434 * corresponding error. 12435 */ 12436 decodeErrorResult(fragment, data) { 12437 if (typeof fragment === "string") { 12438 const f = this.getError(fragment); 12439 assertArgument(f, "unknown error", "fragment", fragment); 12440 fragment = f; 12441 } 12442 assertArgument(dataSlice(data, 0, 4) === fragment.selector, `data signature does not match error ${fragment.name}.`, "data", data); 12443 return this._decodeParams(fragment.inputs, dataSlice(data, 4)); 12444 } 12445 /** 12446 * Encodes the transaction revert data for a call result that 12447 * reverted from the the Contract with the sepcified %%error%% 12448 * (see [[getError]] for valid values for %%fragment%%) with the %%values%%. 12449 * 12450 * This is generally not used by most developers, unless trying to mock 12451 * a result from a Contract. 12452 */ 12453 encodeErrorResult(fragment, values) { 12454 if (typeof fragment === "string") { 12455 const f = this.getError(fragment); 12456 assertArgument(f, "unknown error", "fragment", fragment); 12457 fragment = f; 12458 } 12459 return concat([fragment.selector, this._encodeParams(fragment.inputs, values || [])]); 12460 } 12461 /** 12462 * Decodes the %%data%% from a transaction ``tx.data`` for 12463 * the function specified (see [[getFunction]] for valid values 12464 * for %%fragment%%). 12465 * 12466 * Most developers should prefer the [[parseTransaction]] method 12467 * instead, which will automatically detect the fragment. 12468 */ 12469 decodeFunctionData(fragment, data) { 12470 if (typeof fragment === "string") { 12471 const f = this.getFunction(fragment); 12472 assertArgument(f, "unknown function", "fragment", fragment); 12473 fragment = f; 12474 } 12475 assertArgument(dataSlice(data, 0, 4) === fragment.selector, `data signature does not match function ${fragment.name}.`, "data", data); 12476 return this._decodeParams(fragment.inputs, dataSlice(data, 4)); 12477 } 12478 /** 12479 * Encodes the ``tx.data`` for a transaction that calls the function 12480 * specified (see [[getFunction]] for valid values for %%fragment%%) with 12481 * the %%values%%. 12482 */ 12483 encodeFunctionData(fragment, values) { 12484 if (typeof fragment === "string") { 12485 const f = this.getFunction(fragment); 12486 assertArgument(f, "unknown function", "fragment", fragment); 12487 fragment = f; 12488 } 12489 return concat([fragment.selector, this._encodeParams(fragment.inputs, values || [])]); 12490 } 12491 /** 12492 * Decodes the result %%data%% (e.g. from an ``eth_call``) for the 12493 * specified function (see [[getFunction]] for valid values for 12494 * %%key%%). 12495 * 12496 * Most developers should prefer the [[parseCallResult]] method instead, 12497 * which will automatically detect a ``CALL_EXCEPTION`` and throw the 12498 * corresponding error. 12499 */ 12500 decodeFunctionResult(fragment, data) { 12501 if (typeof fragment === "string") { 12502 const f = this.getFunction(fragment); 12503 assertArgument(f, "unknown function", "fragment", fragment); 12504 fragment = f; 12505 }
12506 let message = "invalid length for result data"; 12507 const bytes = getBytesCopy(data); 12508 if (bytes.length % 32 === 0) try { 12509 return this.#abiCoder.decode(fragment.outputs, bytes); 12510 } catch (error) { 12511 message = "could not decode result data"; 12512 } 12513 assert(false, message, "BAD_DATA", { 12514 value: hexlify(bytes), 12515 info: { 12516 method: fragment.name, 12517 signature: fragment.format() 12518 } 12519 }); 12520 } 12521 makeError(_data, tx) { 12522 const data = getBytes(_data, "data"); 12523 const error = AbiCoder.getBuiltinCallException("call", tx, data); 12524 if (error.message.startsWith("execution reverted (unknown custom error)")) { 12525 const selector = hexlify(data.slice(0, 4)); 12526 const ef = this.getError(selector); 12527 if (ef) try { 12528 const args = this.#abiCoder.decode(ef.inputs, data.slice(4)); 12529 error.revert = { 12530 name: ef.name, 12531 signature: ef.format(), 12532 args 12533 }; 12534 error.reason = error.revert.signature; 12535 error.message = `execution reverted: ${error.reason}`; 12536 } catch (e) { 12537 error.message = `execution reverted (coult not decode custom error)`; 12538 } 12539 } 12540 const parsed = this.parseTransaction(tx); 12541 if (parsed) error.invocation = { 12542 method: parsed.name, 12543 signature: parsed.signature, 12544 args: parsed.args 12545 }; 12546 return error; 12547 } 12548 /** 12549 * Encodes the result data (e.g. from an ``eth_call``) for the 12550 * specified function (see [[getFunction]] for valid values 12551 * for %%fragment%%) with %%values%%. 12552 * 12553 * This is generally not used by most developers, unless trying to mock 12554 * a result from a Contract. 12555 */ 12556 encodeFunctionResult(fragment, values) { 12557 if (typeof fragment === "string") { 12558 const f = this.getFunction(fragment); 12559 assertArgument(f, "unknown function", "fragment", fragment); 12560 fragment = f; 12561 } 12562 return hexlify(this.#abiCoder.encode(fragment.outputs, values || [])); 12563 } 12564 encodeFilterTopics(fragment, values) { 12565 if (typeof fragment === "string") { 12566 const f = this.getEvent(fragment); 12567 assertArgument(f, "unknown event", "eventFragment", fragment); 12568 fragment = f; 12569 } 12570 assert(values.length <= fragment.inputs.length, `too many arguments for ${fragment.format()}`, "UNEXPECTED_ARGUMENT", { 12571 count: values.length, 12572 expectedCount: fragment.inputs.length 12573 }); 12574 const topics = []; 12575 if (!fragment.anonymous) topics.push(fragment.topicHash); 12576 const encodeTopic = (param, value) => { 12577 if (param.type === "string") return id(value); 12578 else if (param.type === "bytes") return keccak256(hexlify(value)); 12579 if (param.type === "bool" && typeof value === "boolean") value = value ? "0x01" : "0x00"; 12580 else if (param.type.match(/^u?int/)) value = toBeHex(value); 12581 else if (param.type.match(/^bytes/)) value = zeroPadBytes(value, 32); 12582 else if (param.type === "address") this.#abiCoder.encode(["address"], [value]); 12583 return zeroPadValue(hexlify(value), 32); 12584 }; 12585 values.forEach((value, index) => { 12586 const param = fragment.inputs[index]; 12587 if (!param.indexed) { 12588 assertArgument(value == null, "cannot filter non-indexed parameters; must be null", "contract." + param.name, value); 12589 return; 12590 } 12591 if (value == null) topics.push(null); 12592 else if (param.baseType === "array" || param.baseType === "tuple") assertArgument(false, "filtering with tuples or arrays not supported", "contract." + param.name, value); 12593 else if (Array.isArray(value)) topics.push(value.map((value) => encodeTopic(param, value))); 12594 else topics.push(encodeTopic(param, value)); 12595 }); 12596 while (topics.length && topics[topics.length - 1] === null) topics.pop(); 12597 return topics; 12598 } 12599 encodeEventLog(fragment, values) { 12600 if (typeof fragment === "string") { 12601 const f = this.getEvent(fragment); 12602 assertArgument(f, "unknown event", "eventFragment", fragment); 12603 fragment = f; 12604 } 12605 const topics = []; 12606 const dataTypes = []; 12607 const dataValues = []; 12608 if (!fragment.anonymous) topics.push(fragment.topicHash); 12609 assertArgument(values.length === fragment.inputs.length, "event arguments/values mismatch", "values", values); 12610 fragment.inputs.forEach((param, index) => { 12611 const value = values[index]; 12612 if (param.indexed) { 12613 if (param.type === "string") topics.push(id(value)); 12614 else if (param.type === "bytes") topics.push(keccak256(value)); 12615 else if (param.baseType === "tuple" || param.baseType === "array") throw new Error("not implemented"); 12616 else topics.push(this.#abiCoder.encode([param.type], [value])); 12617 } else { 12618 dataTypes.push(param); 12619 dataValues.push(value); 12620 } 12621 }); 12622 return {
12623 data: this.#abiCoder.encode(dataTypes, dataValues), 12624 topics 12625 }; 12626 } 12627 decodeEventLog(fragment, data, topics) { 12628 if (typeof fragment === "string") { 12629 const f = this.getEvent(fragment); 12630 assertArgument(f, "unknown event", "eventFragment", fragment); 12631 fragment = f; 12632 } 12633 if (topics != null && !fragment.anonymous) { 12634 const eventTopic = fragment.topicHash; 12635 assertArgument(isHexString(topics[0], 32) && topics[0].toLowerCase() === eventTopic, "fragment/topic mismatch", "topics[0]", topics[0]); 12636 topics = topics.slice(1); 12637 } 12638 const indexed = []; 12639 const nonIndexed = []; 12640 const dynamic = []; 12641 fragment.inputs.forEach((param, index) => { 12642 if (param.indexed) { 12643 if (param.type === "string" || param.type === "bytes" || param.baseType === "tuple" || param.baseType === "array") { 12644 indexed.push(ParamType.from({ 12645 type: "bytes32", 12646 name: param.name 12647 })); 12648 dynamic.push(true); 12649 } else { 12650 indexed.push(param); 12651 dynamic.push(false); 12652 } 12653 } else { 12654 nonIndexed.push(param); 12655 dynamic.push(false); 12656 } 12657 }); 12658 const resultIndexed = topics != null ? this.#abiCoder.decode(indexed, concat(topics)) : null; 12659 const resultNonIndexed = this.#abiCoder.decode(nonIndexed, data, true); 12660 const values = []; 12661 const keys = []; 12662 let nonIndexedIndex = 0, indexedIndex = 0; 12663 fragment.inputs.forEach((param, index) => { 12664 let value = null; 12665 if (param.indexed) { 12666 if (resultIndexed == null) value = new Indexed(null); 12667 else if (dynamic[index]) value = new Indexed(resultIndexed[indexedIndex++]); 12668 else try { 12669 value = resultIndexed[indexedIndex++]; 12670 } catch (error) { 12671 value = error; 12672 } 12673 } else try { 12674 value = resultNonIndexed[nonIndexedIndex++]; 12675 } catch (error) { 12676 value = error; 12677 } 12678 values.push(value); 12679 keys.push(param.name || null); 12680 }); 12681 return Result.fromItems(values, keys); 12682 } 12683 /** 12684 * Parses a transaction, finding the matching function and extracts 12685 * the parameter values along with other useful function details. 12686 * 12687 * If the matching function cannot be found, return null. 12688 */ 12689 parseTransaction(tx) { 12690 const data = getBytes(tx.data, "tx.data"); 12691 const value = getBigInt(tx.value != null ? tx.value : 0, "tx.value"); 12692 const fragment = this.getFunction(hexlify(data.slice(0, 4))); 12693 if (!fragment) return null; 12694 const args = this.#abiCoder.decode(fragment.inputs, data.slice(4)); 12695 return new TransactionDescription(fragment, fragment.selector, args, value); 12696 } 12697 parseCallResult(data) { 12698 throw new Error("@TODO"); 12699 } 12700 /** 12701 * Parses a receipt log, finding the matching event and extracts 12702 * the parameter values along with other useful event details. 12703 * 12704 * If the matching event cannot be found, returns null. 12705 */ 12706 parseLog(log) { 12707 const fragment = this.getEvent(log.topics[0]); 12708 if (!fragment || fragment.anonymous) return null; 12709 return new LogDescription(fragment, fragment.topicHash, this.decodeEventLog(fragment, log.data, log.topics)); 12710 } 12711 /** 12712 * Parses a revert data, finding the matching error and extracts 12713 * the parameter values along with other useful error details. 12714 * 12715 * If the matching error cannot be found, returns null. 12716 */ 12717 parseError(data) { 12718 const hexData = hexlify(data); 12719 const fragment = this.getError(dataSlice(hexData, 0, 4)); 12720 if (!fragment) return null; 12721 const args = this.#abiCoder.decode(fragment.inputs, dataSlice(hexData, 4)); 12722 return new ErrorDescription(fragment, fragment.selector, args); 12723 } 12724 /** 12725 * Creates a new [[Interface]] from the ABI %%value%%. 12726 * 12727 * The %%value%% may be provided as an existing [[Interface]] object, 12728 * a JSON-encoded ABI or any Human-Readable ABI format. 12729 */ 12730 static from(value) { 12731 if (value instanceof Interface) return value; 12732 if (typeof value === "string") return new Interface(JSON.parse(value)); 12733 if (typeof value.formatJson === "function") return new Interface(value.formatJson()); 12734 if (typeof value.format === "function") return new Interface(value.format("json")); 12735 return new Interface(value); 12736 } 12737}; 12738//#endregion 12739//#region node_modules/ethers/lib.esm/providers/provider.js 12740var BN_0$2 = BigInt(0); 12741function getValue(value) { 12742 if (value == null) return null; 12743 return value; 12744} 12745function toJson(value) { 12746 if (value == null) return null; 12747 return value.toString(); 12748} 12749/** 12750* A **FeeData** wraps all the fee-related values associated with 12751* the network. 12752*/ 12753var FeeData = class { 12754 /** 12755 * The gas price for legacy networks. 12756 */ 12757 gasPrice; 12758 /** 12759 * The maximum fee to pay per gas. 12760 * 12761 * The base fee per gas is defined by the network and based on 12762 * congestion, increasing the cost during times of heavy load 12763 * and lowering when less busy. 12764 * 12765 * The actual fee per gas will be the base fee for the block 12766 * and the priority fee, up to the max fee per gas. 12767 * 12768 * This will be ``null`` on legacy networks (i.e. [pre-EIP-1559](link-eip-1559)) 12769 */ 12770 maxFeePerGas; 12771 /** 12772 * The additional amout to pay per gas to encourage a validator 12773 * to include the transaction. 12774 * 12775 * The purpose of this is to compensate the validator for the 12776 * adjusted risk for including a given transaction. 12777 * 12778 * This will be ``null`` on legacy networks (i.e. [pre-EIP-1559](link-eip-1559)) 12779 */ 12780 maxPriorityFeePerGas; 12781 /** 12782 * Creates a new FeeData for %%gasPrice%%, %%maxFeePerGas%% and 12783 * %%maxPriorityFeePerGas%%. 12784 */ 12785 constructor(gasPrice, maxFeePerGas, maxPriorityFeePerGas) { 12786 defineProperties(this, { 12787 gasPrice: getValue(gasPrice), 12788 maxFeePerGas: getValue(maxFeePerGas), 12789 maxPriorityFeePerGas: getValue(maxPriorityFeePerGas) 12790 }); 12791 } 12792 /** 12793 * Returns a JSON-friendly value. 12794 */ 12795 toJSON() { 12796 const { gasPrice, maxFeePerGas, maxPriorityFeePerGas } = this; 12797 return { 12798 _type: "FeeData", 12799 gasPrice: toJson(gasPrice), 12800 maxFeePerGas: toJson(maxFeePerGas), 12801 maxPriorityFeePerGas: toJson(maxPriorityFeePerGas) 12802 }; 12803 } 12804}; 12805/** 12806* Returns a copy of %%req%% with all properties coerced to their strict 12807* types. 12808*/ 12809function copyRequest(req) { 12810 const result = {}; 12811 if (req.to) result.to = req.to; 12812 if (req.from) result.from = req.from; 12813 if (req.data) result.data = hexlify(req.data); 12814 const bigIntKeys = "chainId,gasLimit,gasPrice,maxFeePerBlobGas,maxFeePerGas,maxPriorityFeePerGas,value".split(/,/); 12815 for (const key of bigIntKeys) { 12816 if (!(key in req) || req[key] == null) continue; 12817 result[key] = getBigInt(req[key], `request.${key}`); 12818 } 12819 const numberKeys = "type,nonce".split(/,/); 12820 for (const key of numberKeys) { 12821 if (!(key in req) || req[key] == null) continue; 12822 result[key] = getNumber(req[key], `request.${key}`); 12823 } 12824 if (req.accessList) result.accessList = accessListify(req.accessList); 12825 if (req.authorizationList) result.authorizationList = req.authorizationList.slice(); 12826 if ("blockTag" in req) result.blockTag = req.blockTag; 12827 if ("enableCcipRead" in req) result.enableCcipRead = !!req.enableCcipRead; 12828 if ("customData" in req) result.customData = req.customData; 12829 if ("blobVersionedHashes" in req && req.blobVersionedHashes) result.blobVersionedHashes = req.blobVersionedHashes.slice(); 12830 if ("kzg" in req) result.kzg = req.kzg; 12831 if ("blobWrapperVersion" in req) result.blobWrapperVersion = req.blobWrapperVersion; 12832 if ("blobs" in req && req.blobs) result.blobs = req.blobs.map((b) => { 12833 if (isBytesLike(b)) return hexlify(b); 12834 return Object.assign({}, b); 12835 }); 12836 return result; 12837} 12838/** 12839* A **Block** represents the data associated with a full block on 12840* Ethereum. 12841*/ 12842var Block = class { 12843 /** 12844 * The provider connected to the block used to fetch additional details 12845 * if necessary. 12846 */ 12847 provider; 12848 /** 12849 * The block number, sometimes called the block height. This is a 12850 * sequential number that is one higher than the parent block. 12851 */ 12852 number; 12853 /** 12854 * The block hash. 12855 * 12856 * This hash includes all properties, so can be safely used to identify 12857 * an exact set of block properties. 12858 */ 12859 hash; 12860 /** 12861 * The timestamp for this block, which is the number of seconds since 12862 * epoch that this block was included. 12863 */ 12864 timestamp; 12865 /** 12866 * The block hash of the parent block. 12867 */ 12868 parentHash; 12869 /** 12870 * The hash tree root of the parent beacon block for the given 12871 * execution block. See [[link-eip-4788]]. 12872 */ 12873 parentBeaconBlockRoot; 12874 /** 12875 * The nonce. 12876 * 12877 * On legacy networks, this is the random number inserted which 12878 * permitted the difficulty target to be reached. 12879 */ 12880 nonce; 12881 /** 12882 * The difficulty target. 12883 * 12884 * On legacy networks, this is the proof-of-work target required 12885 * for a block to meet the protocol rules to be included. 12886 * 12887 * On modern networks, this is a random number arrived at using 12888 * randao. @TODO: Find links? 12889 */ 12890 difficulty; 12891 /** 12892 * The total gas limit for this block. 12893 */ 12894 gasLimit; 12895 /** 12896 * The total gas used in this block. 12897 */ 12898 gasUsed; 12899 /** 12900 * The root hash for the global state after applying changes 12901 * in this block. 12902 */ 12903 stateRoot; 12904 /** 12905 * The hash of the transaction receipts trie. 12906 */ 12907 receiptsRoot; 12908 /** 12909 * The hash of the transactions. 12910 */ 12911 transactionsRoot; 12912 /** 12913 * The total amount of blob gas consumed by the transactions 12914 * within the block. See [[link-eip-4844]]. 12915 */ 12916 blobGasUsed; 12917 /**
12918 * The running total of blob gas consumed in excess of the 12919 * target, prior to the block. See [[link-eip-4844]]. 12920 */ 12921 excessBlobGas; 12922 /** 12923 * The miner coinbase address, wihch receives any subsidies for 12924 * including this block. 12925 */ 12926 miner; 12927 /** 12928 * The latest RANDAO mix of the post beacon state of 12929 * the previous block. 12930 */ 12931 prevRandao; 12932 /** 12933 * Any extra data the validator wished to include. 12934 */ 12935 extraData; 12936 /** 12937 * The base fee per gas that all transactions in this block were 12938 * charged. 12939 * 12940 * This adjusts after each block, depending on how congested the network 12941 * is. 12942 */ 12943 baseFeePerGas; 12944 #transactions; 12945 /** 12946 * Create a new **Block** object. 12947 * 12948 * This should generally not be necessary as the unless implementing a 12949 * low-level library. 12950 */ 12951 constructor(block, provider) { 12952 this.#transactions = block.transactions.map((tx) => { 12953 if (typeof tx !== "string") return new TransactionResponse(tx, provider); 12954 return tx; 12955 }); 12956 defineProperties(this, { 12957 provider, 12958 hash: getValue(block.hash), 12959 number: block.number, 12960 timestamp: block.timestamp, 12961 parentHash: block.parentHash, 12962 parentBeaconBlockRoot: block.parentBeaconBlockRoot, 12963 nonce: block.nonce, 12964 difficulty: block.difficulty, 12965 gasLimit: block.gasLimit, 12966 gasUsed: block.gasUsed, 12967 blobGasUsed: block.blobGasUsed, 12968 excessBlobGas: block.excessBlobGas, 12969 miner: block.miner, 12970 prevRandao: getValue(block.prevRandao), 12971 extraData: block.extraData, 12972 baseFeePerGas: getValue(block.baseFeePerGas), 12973 stateRoot: block.stateRoot, 12974 receiptsRoot: block.receiptsRoot, 12975 transactionsRoot: block.transactionsRoot 12976 }); 12977 } 12978 /** 12979 * Returns the list of transaction hashes, in the order 12980 * they were executed within the block. 12981 */ 12982 get transactions() { 12983 return this.#transactions.map((tx) => { 12984 if (typeof tx === "string") return tx; 12985 return tx.hash; 12986 }); 12987 } 12988 /** 12989 * Returns the complete transactions, in the order they 12990 * were executed within the block. 12991 * 12992 * This is only available for blocks which prefetched 12993 * transactions, by passing ``true`` to %%prefetchTxs%% 12994 * into [[Provider-getBlock]]. 12995 */ 12996 get prefetchedTransactions() { 12997 const txs = this.#transactions.slice(); 12998 if (txs.length === 0) return []; 12999 assert(typeof txs[0] === "object", "transactions were not prefetched with block request", "UNSUPPORTED_OPERATION", { operation: "transactionResponses()" }); 13000 return txs; 13001 } 13002 /** 13003 * Returns a JSON-friendly value. 13004 */ 13005 toJSON() { 13006 const { baseFeePerGas, difficulty, extraData, gasLimit, gasUsed, hash, miner, prevRandao, nonce, number, parentHash, parentBeaconBlockRoot, stateRoot, receiptsRoot, transactionsRoot, timestamp, transactions } = this; 13007 return { 13008 _type: "Block", 13009 baseFeePerGas: toJson(baseFeePerGas), 13010 difficulty: toJson(difficulty), 13011 extraData, 13012 gasLimit: toJson(gasLimit), 13013 gasUsed: toJson(gasUsed), 13014 blobGasUsed: toJson(this.blobGasUsed), 13015 excessBlobGas: toJson(this.excessBlobGas), 13016 hash, 13017 miner, 13018 prevRandao, 13019 nonce, 13020 number, 13021 parentHash, 13022 timestamp, 13023 parentBeaconBlockRoot, 13024 stateRoot, 13025 receiptsRoot, 13026 transactionsRoot, 13027 transactions 13028 }; 13029 } 13030 [Symbol.iterator]() { 13031 let index = 0; 13032 const txs = this.transactions; 13033 return { next: () => { 13034 if (index < this.length) return { 13035 value: txs[index++], 13036 done: false 13037 }; 13038 return { 13039 value: void 0, 13040 done: true 13041 }; 13042 } }; 13043 } 13044 /** 13045 * The number of transactions in this block. 13046 */ 13047 get length() { 13048 return this.#transactions.length; 13049 } 13050 /** 13051 * The [[link-js-date]] this block was included at. 13052 */ 13053 get date() { 13054 if (this.timestamp == null) return null; 13055 return /* @__PURE__ */ new Date(this.timestamp * 1e3); 13056 } 13057 /** 13058 * Get the transaction at %%indexe%% within this block. 13059 */ 13060 async getTransaction(indexOrHash) { 13061 let tx = void 0; 13062 if (typeof indexOrHash === "number") tx = this.#transactions[indexOrHash]; 13063 else { 13064 const hash = indexOrHash.toLowerCase(); 13065 for (const v of this.#transactions) if (typeof v === "string") { 13066 if (v !== hash) continue; 13067 tx = v; 13068 break; 13069 } else { 13070 if (v.hash !== hash) continue; 13071 tx = v; 13072 break; 13073 } 13074 } 13075 if (tx == null) throw new Error("no such tx"); 13076 if (typeof tx === "string") return await this.provider.getTransaction(tx); 13077 else return tx; 13078 } 13079 /** 13080 * If a **Block** was fetched with a request to include the transactions 13081 * this will allow synchronous access to those transactions. 13082 * 13083 * If the transactions were not prefetched, this will throw. 13084 */ 13085 getPrefetchedTransaction(indexOrHash) { 13086 const txs = this.prefetchedTransactions; 13087 if (typeof indexOrHash === "number") return txs[indexOrHash]; 13088 indexOrHash = indexOrHash.toLowerCase(); 13089 for (const tx of txs) if (tx.hash === indexOrHash) return tx; 13090 assertArgument(false, "no matching transaction", "indexOrHash", indexOrHash); 13091 } 13092 /** 13093 * Returns true if this block been mined. This provides a type guard 13094 * for all properties on a [[MinedBlock]]. 13095 */ 13096 isMined() { 13097 return !!this.hash; 13098 } 13099 /** 13100 * Returns true if this block is an [[link-eip-2930]] block. 13101 */ 13102 isLondon() { 13103 return !!this.baseFeePerGas; 13104 } 13105 /** 13106 * @_ignore: 13107 */ 13108 orphanedEvent() { 13109 if (!this.isMined()) throw new Error(""); 13110 return createOrphanedBlockFilter(this); 13111 } 13112}; 13113/** 13114* A **Log** in Ethereum represents an event that has been included in a 13115* transaction using the ``LOG*`` opcodes, which are most commonly used by 13116* Solidity's emit for announcing events. 13117*/ 13118var Log = class { 13119 /** 13120 * The provider connected to the log used to fetch additional details 13121 * if necessary. 13122 */ 13123 provider; 13124 /** 13125 * The transaction hash of the transaction this log occurred in. Use the 13126 * [[Log-getTransaction]] to get the [[TransactionResponse]]. 13127 */ 13128 transactionHash; 13129 /** 13130 * The block hash of the block this log occurred in. Use the 13131 * [[Log-getBlock]] to get the [[Block]]. 13132 */ 13133 blockHash; 13134 /** 13135 * The block number of the block this log occurred in. It is preferred 13136 * to use the [[Block-hash]] when fetching the related [[Block]], 13137 * since in the case of an orphaned block, the block at that height may 13138 * have changed. 13139 */ 13140 blockNumber; 13141 /** 13142 * If the **Log** represents a block that was removed due to an orphaned 13143 * block, this will be true. 13144 * 13145 * This can only happen within an orphan event listener. 13146 */ 13147 removed; 13148 /** 13149 * The address of the contract that emitted this log. 13150 */ 13151 address; 13152 /** 13153 * The data included in this log when it was emitted. 13154 */ 13155 data; 13156 /** 13157 * The indexed topics included in this log when it was emitted. 13158 * 13159 * All topics are included in the bloom filters, so they can be 13160 * efficiently filtered using the [[Provider-getLogs]] method. 13161 */ 13162 topics; 13163 /** 13164 * The index within the block this log occurred at. This is generally 13165 * not useful to developers, but can be used with the various roots 13166 * to proof inclusion within a block. 13167 */ 13168 index; 13169 /** 13170 * The index within the transaction of this log. 13171 */ 13172 transactionIndex; 13173 /** 13174 * @_ignore: 13175 */ 13176 constructor(log, provider) { 13177 this.provider = provider; 13178 const topics = Object.freeze(log.topics.slice()); 13179 defineProperties(this, { 13180 transactionHash: log.transactionHash, 13181 blockHash: log.blockHash, 13182 blockNumber: log.blockNumber, 13183 removed: log.removed, 13184 address: log.address, 13185 data: log.data, 13186 topics, 13187 index: log.index, 13188 transactionIndex: log.transactionIndex 13189 }); 13190 } 13191 /** 13192 * Returns a JSON-compatible object. 13193 */ 13194 toJSON() { 13195 const { address, blockHash, blockNumber, data, index, removed, topics, transactionHash, transactionIndex } = this; 13196 return { 13197 _type: "log", 13198 address, 13199 blockHash, 13200 blockNumber, 13201 data, 13202 index, 13203 removed, 13204 topics, 13205 transactionHash, 13206 transactionIndex 13207 }; 13208 } 13209 /** 13210 * Returns the block that this log occurred in. 13211 */ 13212 async getBlock() { 13213 const block = await this.provider.getBlock(this.blockHash); 13214 assert(!!block, "failed to find transaction", "UNKNOWN_ERROR", {}); 13215 return block; 13216 } 13217 /** 13218 * Returns the transaction that this log occurred in. 13219 */ 13220 async getTransaction() { 13221 const tx = await this.provider.getTransaction(this.transactionHash); 13222 assert(!!tx, "failed to find transaction", "UNKNOWN_ERROR", {}); 13223 return tx; 13224 } 13225 /** 13226 * Returns the transaction receipt fot the transaction that this 13227 * log occurred in. 13228 */ 13229 async getTransactionReceipt() { 13230 const receipt = await this.provider.getTransactionReceipt(this.transactionHash); 13231 assert(!!receipt, "failed to find transaction receipt", "UNKNOWN_ERROR", {}); 13232 return receipt; 13233 }
13234 /** 13235 * @_ignore: 13236 */ 13237 removedEvent() { 13238 return createRemovedLogFilter(this); 13239 } 13240}; 13241/** 13242* A **TransactionReceipt** includes additional information about a 13243* transaction that is only available after it has been mined. 13244*/ 13245var TransactionReceipt = class { 13246 /** 13247 * The provider connected to the log used to fetch additional details 13248 * if necessary. 13249 */ 13250 provider; 13251 /** 13252 * The address the transaction was sent to. 13253 */ 13254 to; 13255 /** 13256 * The sender of the transaction. 13257 */ 13258 from; 13259 /** 13260 * The address of the contract if the transaction was directly 13261 * responsible for deploying one. 13262 * 13263 * This is non-null **only** if the ``to`` is empty and the ``data`` 13264 * was successfully executed as initcode. 13265 */ 13266 contractAddress; 13267 /** 13268 * The transaction hash. 13269 */ 13270 hash; 13271 /** 13272 * The index of this transaction within the block transactions. 13273 */ 13274 index; 13275 /** 13276 * The block hash of the [[Block]] this transaction was included in. 13277 */ 13278 blockHash; 13279 /** 13280 * The block number of the [[Block]] this transaction was included in. 13281 */ 13282 blockNumber; 13283 /** 13284 * The bloom filter bytes that represent all logs that occurred within 13285 * this transaction. This is generally not useful for most developers, 13286 * but can be used to validate the included logs. 13287 */ 13288 logsBloom; 13289 /** 13290 * The actual amount of gas used by this transaction. 13291 * 13292 * When creating a transaction, the amount of gas that will be used can 13293 * only be approximated, but the sender must pay the gas fee for the 13294 * entire gas limit. After the transaction, the difference is refunded. 13295 */ 13296 gasUsed; 13297 /** 13298 * The gas used for BLObs. See [[link-eip-4844]]. 13299 */ 13300 blobGasUsed; 13301 /** 13302 * The amount of gas used by all transactions within the block for this 13303 * and all transactions with a lower ``index``. 13304 * 13305 * This is generally not useful for developers but can be used to 13306 * validate certain aspects of execution. 13307 */ 13308 cumulativeGasUsed; 13309 /** 13310 * The actual gas price used during execution. 13311 * 13312 * Due to the complexity of [[link-eip-1559]] this value can only 13313 * be caluclated after the transaction has been mined, snce the base 13314 * fee is protocol-enforced. 13315 */ 13316 gasPrice; 13317 /** 13318 * The price paid per BLOB in gas. See [[link-eip-4844]]. 13319 */ 13320 blobGasPrice; 13321 /** 13322 * The [[link-eip-2718]] transaction type. 13323 */ 13324 type; 13325 /** 13326 * The status of this transaction, indicating success (i.e. ``1``) or 13327 * a revert (i.e. ``0``). 13328 * 13329 * This is available in post-byzantium blocks, but some backends may 13330 * backfill this value. 13331 */ 13332 status; 13333 /** 13334 * The root hash of this transaction. 13335 * 13336 * This is no present and was only included in pre-byzantium blocks, but 13337 * could be used to validate certain parts of the receipt. 13338 */ 13339 root; 13340 #logs; 13341 /** 13342 * @_ignore: 13343 */ 13344 constructor(tx, provider) { 13345 this.#logs = Object.freeze(tx.logs.map((log) => { 13346 return new Log(log, provider); 13347 })); 13348 let gasPrice = BN_0$2; 13349 if (tx.effectiveGasPrice != null) gasPrice = tx.effectiveGasPrice; 13350 else if (tx.gasPrice != null) gasPrice = tx.gasPrice; 13351 defineProperties(this, { 13352 provider, 13353 to: tx.to, 13354 from: tx.from, 13355 contractAddress: tx.contractAddress, 13356 hash: tx.hash, 13357 index: tx.index, 13358 blockHash: tx.blockHash, 13359 blockNumber: tx.blockNumber, 13360 logsBloom: tx.logsBloom, 13361 gasUsed: tx.gasUsed, 13362 cumulativeGasUsed: tx.cumulativeGasUsed, 13363 blobGasUsed: tx.blobGasUsed, 13364 gasPrice, 13365 blobGasPrice: tx.blobGasPrice, 13366 type: tx.type, 13367 status: tx.status, 13368 root: tx.root 13369 }); 13370 } 13371 /** 13372 * The logs for this transaction. 13373 */ 13374 get logs() { 13375 return this.#logs; 13376 } 13377 /** 13378 * Returns a JSON-compatible representation. 13379 */ 13380 toJSON() { 13381 const { to, from, contractAddress, hash, index, blockHash, blockNumber, logsBloom, logs, status, root } = this; 13382 return { 13383 _type: "TransactionReceipt", 13384 blockHash, 13385 blockNumber, 13386 contractAddress, 13387 cumulativeGasUsed: toJson(this.cumulativeGasUsed), 13388 from, 13389 gasPrice: toJson(this.gasPrice), 13390 blobGasUsed: toJson(this.blobGasUsed), 13391 blobGasPrice: toJson(this.blobGasPrice), 13392 gasUsed: toJson(this.gasUsed), 13393 hash, 13394 index, 13395 logs, 13396 logsBloom, 13397 root, 13398 status, 13399 to 13400 }; 13401 } 13402 /** 13403 * @_ignore: 13404 */ 13405 get length() { 13406 return this.logs.length; 13407 } 13408 [Symbol.iterator]() { 13409 let index = 0; 13410 return { next: () => { 13411 if (index < this.length) return { 13412 value: this.logs[index++], 13413 done: false 13414 }; 13415 return { 13416 value: void 0, 13417 done: true 13418 }; 13419 } }; 13420 } 13421 /**
13422 * The total fee for this transaction, in wei. 13423 */ 13424 get fee() { 13425 return this.gasUsed * this.gasPrice; 13426 } 13427 /** 13428 * Resolves to the block this transaction occurred in. 13429 */ 13430 async getBlock() { 13431 const block = await this.provider.getBlock(this.blockHash); 13432 if (block == null) throw new Error("TODO"); 13433 return block; 13434 } 13435 /** 13436 * Resolves to the transaction this transaction occurred in. 13437 */ 13438 async getTransaction() { 13439 const tx = await this.provider.getTransaction(this.hash); 13440 if (tx == null) throw new Error("TODO"); 13441 return tx; 13442 } 13443 /** 13444 * Resolves to the return value of the execution of this transaction. 13445 * 13446 * Support for this feature is limited, as it requires an archive node 13447 * with the ``debug_`` or ``trace_`` API enabled. 13448 */ 13449 async getResult() { 13450 return await this.provider.getTransactionResult(this.hash); 13451 } 13452 /** 13453 * Resolves to the number of confirmations this transaction has. 13454 */ 13455 async confirmations() { 13456 return await this.provider.getBlockNumber() - this.blockNumber + 1; 13457 } 13458 /** 13459 * @_ignore: 13460 */ 13461 removedEvent() { 13462 return createRemovedTransactionFilter(this); 13463 } 13464 /** 13465 * @_ignore: 13466 */ 13467 reorderedEvent(other) { 13468 assert(!other || other.isMined(), "unmined 'other' transction cannot be orphaned", "UNSUPPORTED_OPERATION", { operation: "reorderedEvent(other)" }); 13469 return createReorderedTransactionFilter(this, other); 13470 } 13471}; 13472/** 13473* A **TransactionResponse** includes all properties about a transaction 13474* that was sent to the network, which may or may not be included in a 13475* block. 13476* 13477* The [[TransactionResponse-isMined]] can be used to check if the 13478* transaction has been mined as well as type guard that the otherwise 13479* possibly ``null`` properties are defined. 13480*/ 13481var TransactionResponse = class TransactionResponse { 13482 /** 13483 * The provider this is connected to, which will influence how its 13484 * methods will resolve its async inspection methods. 13485 */ 13486 provider; 13487 /** 13488 * The block number of the block that this transaction was included in. 13489 * 13490 * This is ``null`` for pending transactions. 13491 */ 13492 blockNumber; 13493 /** 13494 * The blockHash of the block that this transaction was included in. 13495 * 13496 * This is ``null`` for pending transactions. 13497 */ 13498 blockHash; 13499 /** 13500 * The index within the block that this transaction resides at. 13501 */ 13502 index; 13503 /** 13504 * The transaction hash. 13505 */ 13506 hash; 13507 /** 13508 * The [[link-eip-2718]] transaction envelope type. This is 13509 * ``0`` for legacy transactions types. 13510 */ 13511 type; 13512 /** 13513 * The receiver of this transaction. 13514 * 13515 * If ``null``, then the transaction is an initcode transaction. 13516 * This means the result of executing the [[data]] will be deployed 13517 * as a new contract on chain (assuming it does not revert) and the 13518 * address may be computed using [[getCreateAddress]]. 13519 */ 13520 to; 13521 /** 13522 * The sender of this transaction. It is implicitly computed 13523 * from the transaction pre-image hash (as the digest) and the 13524 * [[signature]] using ecrecover. 13525 */ 13526 from; 13527 /** 13528 * The nonce, which is used to prevent replay attacks and offer 13529 * a method to ensure transactions from a given sender are explicitly 13530 * ordered. 13531 * 13532 * When sending a transaction, this must be equal to the number of 13533 * transactions ever sent by [[from]]. 13534 */ 13535 nonce; 13536 /** 13537 * The maximum units of gas this transaction can consume. If execution 13538 * exceeds this, the entries transaction is reverted and the sender 13539 * is charged for the full amount, despite not state changes being made. 13540 */ 13541 gasLimit; 13542 /** 13543 * The gas price can have various values, depending on the network. 13544 * 13545 * In modern networks, for transactions that are included this is 13546 * the //effective gas price// (the fee per gas that was actually 13547 * charged), while for transactions that have not been included yet 13548 * is the [[maxFeePerGas]]. 13549 * 13550 * For legacy transactions, or transactions on legacy networks, this 13551 * is the fee that will be charged per unit of gas the transaction 13552 * consumes. 13553 */ 13554 gasPrice; 13555 /** 13556 * The maximum priority fee (per unit of gas) to allow a 13557 * validator to charge the sender. This is inclusive of the 13558 * [[maxFeeFeePerGas]]. 13559 */ 13560 maxPriorityFeePerGas; 13561 /** 13562 * The maximum fee (per unit of gas) to allow this transaction 13563 * to charge the sender. 13564 */ 13565 maxFeePerGas; 13566 /** 13567 * The [[link-eip-4844]] max fee per BLOb gas. 13568 */ 13569 maxFeePerBlobGas; 13570 /** 13571 * The data. 13572 */ 13573 data; 13574 /** 13575 * The value, in wei. Use [[formatEther]] to format this value 13576 * as ether. 13577 */ 13578 value; 13579 /** 13580 * The chain ID. 13581 */ 13582 chainId; 13583 /** 13584 * The signature. 13585 */ 13586 signature; 13587 /** 13588 * The [[link-eip-2930]] access list for transaction types that 13589 * support it, otherwise ``null``. 13590 */ 13591 accessList; 13592 /** 13593 * The [[link-eip-4844]] BLOb versioned hashes. 13594 */ 13595 blobVersionedHashes; 13596 /** 13597 * The [[link-eip-7702]] authorizations (if any). 13598 */ 13599 authorizationList; 13600 #startBlock; 13601 /** 13602 * @_ignore: 13603 */ 13604 constructor(tx, provider) { 13605 this.provider = provider; 13606 this.blockNumber = tx.blockNumber != null ? tx.blockNumber : null; 13607 this.blockHash = tx.blockHash != null ? tx.blockHash : null; 13608 this.hash = tx.hash; 13609 this.index = tx.index; 13610 this.type = tx.type; 13611 this.from = tx.from; 13612 this.to = tx.to || null; 13613 this.gasLimit = tx.gasLimit; 13614 this.nonce = tx.nonce; 13615 this.data = tx.data; 13616 this.value = tx.value; 13617 this.gasPrice = tx.gasPrice; 13618 this.maxPriorityFeePerGas = tx.maxPriorityFeePerGas != null ? tx.maxPriorityFeePerGas : null; 13619 this.maxFeePerGas = tx.maxFeePerGas != null ? tx.maxFeePerGas : null; 13620 this.maxFeePerBlobGas = tx.maxFeePerBlobGas != null ? tx.maxFeePerBlobGas : null; 13621 this.chainId = tx.chainId; 13622 this.signature = tx.signature; 13623 this.accessList = tx.accessList != null ? tx.accessList : null; 13624 this.blobVersionedHashes = tx.blobVersionedHashes != null ? tx.blobVersionedHashes : null; 13625 this.authorizationList = tx.authorizationList != null ? tx.authorizationList : null; 13626 this.#startBlock = -1; 13627 } 13628 /** 13629 * Returns a JSON-compatible representation of this transaction. 13630 */ 13631 toJSON() { 13632 const { blockNumber, blockHash, index, hash, type, to, from, nonce, data, signature, accessList, blobVersionedHashes } = this; 13633 return { 13634 _type: "TransactionResponse", 13635 accessList, 13636 blockNumber, 13637 blockHash, 13638 blobVersionedHashes, 13639 chainId: toJson(this.chainId), 13640 data, 13641 from, 13642 gasLimit: toJson(this.gasLimit), 13643 gasPrice: toJson(this.gasPrice), 13644 hash, 13645 maxFeePerGas: toJson(this.maxFeePerGas), 13646 maxPriorityFeePerGas: toJson(this.maxPriorityFeePerGas), 13647 maxFeePerBlobGas: toJson(this.maxFeePerBlobGas), 13648 nonce, 13649 signature, 13650 to, 13651 index, 13652 type, 13653 value: toJson(this.value) 13654 }; 13655 } 13656 /** 13657 * Resolves to the Block that this transaction was included in. 13658 * 13659 * This will return null if the transaction has not been included yet. 13660 */ 13661 async getBlock() { 13662 let blockNumber = this.blockNumber; 13663 if (blockNumber == null) { 13664 const tx = await this.getTransaction(); 13665 if (tx) blockNumber = tx.blockNumber; 13666 } 13667 if (blockNumber == null) return null; 13668 const block = this.provider.getBlock(blockNumber); 13669 if (block == null) throw new Error("TODO"); 13670 return block; 13671 } 13672 /** 13673 * Resolves to this transaction being re-requested from the 13674 * provider. This can be used if you have an unmined transaction 13675 * and wish to get an up-to-date populated instance. 13676 */ 13677 async getTransaction() { 13678 return this.provider.getTransaction(this.hash); 13679 } 13680 /** 13681 * Resolve to the number of confirmations this transaction has. 13682 */ 13683 async confirmations() { 13684 if (this.blockNumber == null) { 13685 const { tx, blockNumber } = await resolveProperties({ 13686 tx: this.getTransaction(), 13687 blockNumber: this.provider.getBlockNumber() 13688 }); 13689 if (tx == null || tx.blockNumber == null) return 0; 13690 return blockNumber - tx.blockNumber + 1; 13691 } 13692 return await this.provider.getBlockNumber() - this.blockNumber + 1; 13693 } 13694 /** 13695 * Resolves once this transaction has been mined and has 13696 * %%confirms%% blocks including it (default: ``1``) with an 13697 * optional %%timeout%%. 13698 * 13699 * This can resolve to ``null`` only if %%confirms%% is ``0`` 13700 * and the transaction has not been mined, otherwise this will 13701 * wait until enough confirmations have completed. 13702 */ 13703 async wait(_confirms, _timeout) { 13704 const confirms = _confirms == null ? 1 : _confirms; 13705 const timeout = _timeout == null ? 0 : _timeout; 13706 let startBlock = this.#startBlock; 13707 let nextScan = -1; 13708 let stopScanning = startBlock === -1 ? true : false;
13709 const checkReplacement = async () => { 13710 if (stopScanning) return null; 13711 const { blockNumber, nonce } = await resolveProperties({ 13712 blockNumber: this.provider.getBlockNumber(), 13713 nonce: this.provider.getTransactionCount(this.from) 13714 }); 13715 if (nonce < this.nonce) { 13716 startBlock = blockNumber; 13717 return; 13718 } 13719 if (stopScanning) return null; 13720 const mined = await this.getTransaction(); 13721 if (mined && mined.blockNumber != null) return; 13722 if (nextScan === -1) { 13723 nextScan = startBlock - 3; 13724 if (nextScan < this.#startBlock) nextScan = this.#startBlock; 13725 } 13726 while (nextScan <= blockNumber) { 13727 if (stopScanning) return null; 13728 const block = await this.provider.getBlock(nextScan, true); 13729 if (block == null) return; 13730 for (const hash of block) if (hash === this.hash) return; 13731 for (let i = 0; i < block.length; i++) { 13732 const tx = await block.getTransaction(i); 13733 if (tx.from === this.from && tx.nonce === this.nonce) { 13734 if (stopScanning) return null; 13735 const receipt = await this.provider.getTransactionReceipt(tx.hash); 13736 if (receipt == null) return; 13737 if (blockNumber - receipt.blockNumber + 1 < confirms) return; 13738 let reason = "replaced"; 13739 if (tx.data === this.data && tx.to === this.to && tx.value === this.value) reason = "repriced"; 13740 else if (tx.data === "0x" && tx.from === tx.to && tx.value === BN_0$2) reason = "cancelled"; 13741 assert(false, "transaction was replaced", "TRANSACTION_REPLACED", { 13742 cancelled: reason === "replaced" || reason === "cancelled", 13743 reason, 13744 replacement: tx.replaceableTransaction(startBlock), 13745 hash: tx.hash, 13746 receipt 13747 }); 13748 } 13749 } 13750 nextScan++; 13751 } 13752 }; 13753 const checkReceipt = (receipt) => { 13754 if (receipt == null || receipt.status !== 0) return receipt; 13755 assert(false, "transaction execution reverted", "CALL_EXCEPTION", { 13756 action: "sendTransaction", 13757 data: null, 13758 reason: null, 13759 invocation: null, 13760 revert: null, 13761 transaction: { 13762 to: receipt.to, 13763 from: receipt.from, 13764 data: "" 13765 }, 13766 receipt 13767 }); 13768 }; 13769 const receipt = await this.provider.getTransactionReceipt(this.hash); 13770 if (confirms === 0) return checkReceipt(receipt); 13771 if (receipt) { 13772 if (confirms === 1 || await receipt.confirmations() >= confirms) return checkReceipt(receipt); 13773 } else { 13774 await checkReplacement(); 13775 if (confirms === 0) return null; 13776 } 13777 return await new Promise((resolve, reject) => { 13778 const cancellers = []; 13779 const cancel = () => { 13780 cancellers.forEach((c) => c()); 13781 }; 13782 cancellers.push(() => { 13783 stopScanning = true; 13784 }); 13785 if (timeout > 0) { 13786 const timer = setTimeout(() => { 13787 cancel(); 13788 reject(makeError("wait for transaction timeout", "TIMEOUT")); 13789 }, timeout); 13790 cancellers.push(() => { 13791 clearTimeout(timer); 13792 }); 13793 } 13794 const txListener = async (receipt) => { 13795 if (await receipt.confirmations() >= confirms) { 13796 cancel(); 13797 try { 13798 resolve(checkReceipt(receipt)); 13799 } catch (error) { 13800 reject(error); 13801 } 13802 } 13803 }; 13804 cancellers.push(() => { 13805 this.provider.off(this.hash, txListener); 13806 }); 13807 this.provider.on(this.hash, txListener); 13808 if (startBlock >= 0) { 13809 const replaceListener = async () => { 13810 try { 13811 await checkReplacement(); 13812 } catch (error) { 13813 if (isError(error, "TRANSACTION_REPLACED")) { 13814 cancel(); 13815 reject(error); 13816 return; 13817 } 13818 } 13819 if (!stopScanning) this.provider.once("block", replaceListener); 13820 }; 13821 cancellers.push(() => { 13822 this.provider.off("block", replaceListener); 13823 }); 13824 this.provider.once("block", replaceListener); 13825 } 13826 }); 13827 } 13828 /** 13829 * Returns ``true`` if this transaction has been included. 13830 * 13831 * This is effective only as of the time the TransactionResponse 13832 * was instantiated. To get up-to-date information, use 13833 * [[getTransaction]]. 13834 * 13835 * This provides a Type Guard that this transaction will have 13836 * non-null property values for properties that are null for 13837 * unmined transactions. 13838 */ 13839 isMined() { 13840 return this.blockHash != null; 13841 }
13842 /** 13843 * Returns true if the transaction is a legacy (i.e. ``type == 0``) 13844 * transaction. 13845 * 13846 * This provides a Type Guard that this transaction will have 13847 * the ``null``-ness for hardfork-specific properties set correctly. 13848 */ 13849 isLegacy() { 13850 return this.type === 0; 13851 } 13852 /** 13853 * Returns true if the transaction is a Berlin (i.e. ``type == 1``) 13854 * transaction. See [[link-eip-2070]]. 13855 * 13856 * This provides a Type Guard that this transaction will have 13857 * the ``null``-ness for hardfork-specific properties set correctly. 13858 */ 13859 isBerlin() { 13860 return this.type === 1; 13861 } 13862 /** 13863 * Returns true if the transaction is a London (i.e. ``type == 2``) 13864 * transaction. See [[link-eip-1559]]. 13865 * 13866 * This provides a Type Guard that this transaction will have 13867 * the ``null``-ness for hardfork-specific properties set correctly. 13868 */ 13869 isLondon() { 13870 return this.type === 2; 13871 } 13872 /** 13873 * Returns true if hte transaction is a Cancun (i.e. ``type == 3``) 13874 * transaction. See [[link-eip-4844]]. 13875 */ 13876 isCancun() { 13877 return this.type === 3; 13878 } 13879 /** 13880 * Returns a filter which can be used to listen for orphan events 13881 * that evict this transaction. 13882 */ 13883 removedEvent() { 13884 assert(this.isMined(), "unmined transaction canot be orphaned", "UNSUPPORTED_OPERATION", { operation: "removeEvent()" }); 13885 return createRemovedTransactionFilter(this); 13886 } 13887 /** 13888 * Returns a filter which can be used to listen for orphan events 13889 * that re-order this event against %%other%%. 13890 */ 13891 reorderedEvent(other) { 13892 assert(this.isMined(), "unmined transaction canot be orphaned", "UNSUPPORTED_OPERATION", { operation: "removeEvent()" }); 13893 assert(!other || other.isMined(), "unmined 'other' transaction canot be orphaned", "UNSUPPORTED_OPERATION", { operation: "removeEvent()" }); 13894 return createReorderedTransactionFilter(this, other); 13895 } 13896 /** 13897 * Returns a new TransactionResponse instance which has the ability to 13898 * detect (and throw an error) if the transaction is replaced, which 13899 * will begin scanning at %%startBlock%%. 13900 * 13901 * This should generally not be used by developers and is intended 13902 * primarily for internal use. Setting an incorrect %%startBlock%% can 13903 * have devastating performance consequences if used incorrectly. 13904 */ 13905 replaceableTransaction(startBlock) { 13906 assertArgument(Number.isInteger(startBlock) && startBlock >= 0, "invalid startBlock", "startBlock", startBlock); 13907 const tx = new TransactionResponse(this, this.provider); 13908 tx.#startBlock = startBlock; 13909 return tx; 13910 } 13911}; 13912function createOrphanedBlockFilter(block) { 13913 return { 13914 orphan: "drop-block", 13915 hash: block.hash, 13916 number: block.number 13917 }; 13918} 13919function createReorderedTransactionFilter(tx, other) { 13920 return { 13921 orphan: "reorder-transaction", 13922 tx, 13923 other 13924 }; 13925} 13926function createRemovedTransactionFilter(tx) { 13927 return { 13928 orphan: "drop-transaction", 13929 tx 13930 }; 13931} 13932function createRemovedLogFilter(log) { 13933 return { 13934 orphan: "drop-log", 13935 log: { 13936 transactionHash: log.transactionHash, 13937 blockHash: log.blockHash, 13938 blockNumber: log.blockNumber, 13939 address: log.address, 13940 data: log.data, 13941 topics: Object.freeze(log.topics.slice()), 13942 index: log.index 13943 } 13944 }; 13945} 13946//#endregion 13947//#region node_modules/ethers/lib.esm/contract/wrappers.js 13948/** 13949* An **EventLog** contains additional properties parsed from the [[Log]]. 13950*/ 13951var EventLog = class extends Log { 13952 /** 13953 * The Contract Interface. 13954 */ 13955 interface; 13956 /** 13957 * The matching event. 13958 */ 13959 fragment; 13960 /** 13961 * The parsed arguments passed to the event by ``emit``. 13962 */ 13963 args; 13964 /** 13965 * @_ignore: 13966 */ 13967 constructor(log, iface, fragment) { 13968 super(log, log.provider); 13969 const args = iface.decodeEventLog(fragment, log.data, log.topics); 13970 defineProperties(this, { 13971 args, 13972 fragment, 13973 interface: iface 13974 }); 13975 } 13976 /** 13977 * The name of the event. 13978 */ 13979 get eventName() { 13980 return this.fragment.name; 13981 } 13982 /** 13983 * The signature of the event. 13984 */ 13985 get eventSignature() { 13986 return this.fragment.format(); 13987 } 13988}; 13989/** 13990* An **EventLog** contains additional properties parsed from the [[Log]]. 13991*/ 13992var UndecodedEventLog = class extends Log { 13993 /** 13994 * The error encounted when trying to decode the log. 13995 */ 13996 error; 13997 /** 13998 * @_ignore: 13999 */ 14000 constructor(log, error) { 14001 super(log, log.provider); 14002 defineProperties(this, { error }); 14003 } 14004}; 14005/** 14006* A **ContractTransactionReceipt** includes the parsed logs from a 14007* [[TransactionReceipt]]. 14008*/ 14009var ContractTransactionReceipt = class extends TransactionReceipt { 14010 #iface; 14011 /** 14012 * @_ignore: 14013 */ 14014 constructor(iface, provider, tx) { 14015 super(tx, provider); 14016 this.#iface = iface; 14017 }
14018 /** 14019 * The parsed logs for any [[Log]] which has a matching event in the 14020 * Contract ABI. 14021 */ 14022 get logs() { 14023 return super.logs.map((log) => { 14024 const fragment = log.topics.length ? this.#iface.getEvent(log.topics[0]) : null; 14025 if (fragment) try { 14026 return new EventLog(log, this.#iface, fragment); 14027 } catch (error) { 14028 return new UndecodedEventLog(log, error); 14029 } 14030 return log; 14031 }); 14032 } 14033}; 14034/** 14035* A **ContractTransactionResponse** will return a 14036* [[ContractTransactionReceipt]] when waited on. 14037*/ 14038var ContractTransactionResponse = class extends TransactionResponse { 14039 #iface; 14040 /** 14041 * @_ignore: 14042 */ 14043 constructor(iface, provider, tx) { 14044 super(tx, provider); 14045 this.#iface = iface; 14046 } 14047 /** 14048 * Resolves once this transaction has been mined and has 14049 * %%confirms%% blocks including it (default: ``1``) with an 14050 * optional %%timeout%%. 14051 * 14052 * This can resolve to ``null`` only if %%confirms%% is ``0`` 14053 * and the transaction has not been mined, otherwise this will 14054 * wait until enough confirmations have completed. 14055 */ 14056 async wait(confirms, timeout) { 14057 const receipt = await super.wait(confirms, timeout); 14058 if (receipt == null) return null; 14059 return new ContractTransactionReceipt(this.#iface, this.provider, receipt); 14060 } 14061}; 14062/** 14063* A **ContractUnknownEventPayload** is included as the last parameter to 14064* Contract Events when the event does not match any events in the ABI. 14065*/ 14066var ContractUnknownEventPayload = class extends EventPayload { 14067 /** 14068 * The log with no matching events. 14069 */ 14070 log; 14071 /** 14072 * @_event: 14073 */ 14074 constructor(contract, listener, filter, log) { 14075 super(contract, listener, filter); 14076 defineProperties(this, { log }); 14077 } 14078 /** 14079 * Resolves to the block the event occured in. 14080 */ 14081 async getBlock() { 14082 return await this.log.getBlock(); 14083 } 14084 /** 14085 * Resolves to the transaction the event occured in. 14086 */ 14087 async getTransaction() { 14088 return await this.log.getTransaction(); 14089 } 14090 /** 14091 * Resolves to the transaction receipt the event occured in. 14092 */ 14093 async getTransactionReceipt() { 14094 return await this.log.getTransactionReceipt(); 14095 } 14096}; 14097/** 14098* A **ContractEventPayload** is included as the last parameter to 14099* Contract Events when the event is known. 14100*/ 14101var ContractEventPayload = class extends ContractUnknownEventPayload { 14102 /** 14103 * @_ignore: 14104 */ 14105 constructor(contract, listener, filter, fragment, _log) { 14106 super(contract, listener, filter, new EventLog(_log, contract.interface, fragment)); 14107 const args = contract.interface.decodeEventLog(fragment, this.log.data, this.log.topics); 14108 defineProperties(this, { 14109 args, 14110 fragment 14111 }); 14112 } 14113 /** 14114 * The event name. 14115 */ 14116 get eventName() { 14117 return this.fragment.name; 14118 } 14119 /** 14120 * The event signature. 14121 */ 14122 get eventSignature() { 14123 return this.fragment.format(); 14124 } 14125}; 14126//#endregion 14127//#region node_modules/ethers/lib.esm/contract/contract.js 14128var BN_0$1 = BigInt(0); 14129function canCall(value) { 14130 return value && typeof value.call === "function"; 14131} 14132function canEstimate(value) { 14133 return value && typeof value.estimateGas === "function"; 14134} 14135function canResolve(value) { 14136 return value && typeof value.resolveName === "function"; 14137} 14138function canSend(value) { 14139 return value && typeof value.sendTransaction === "function"; 14140} 14141function getResolver(value) { 14142 if (value != null) { 14143 if (canResolve(value)) return value; 14144 if (value.provider) return value.provider; 14145 } 14146} 14147var PreparedTopicFilter = class { 14148 #filter; 14149 fragment; 14150 constructor(contract, fragment, args) { 14151 defineProperties(this, { fragment }); 14152 if (fragment.inputs.length < args.length) throw new Error("too many arguments"); 14153 const runner = getRunner(contract.runner, "resolveName"); 14154 const resolver = canResolve(runner) ? runner : null; 14155 this.#filter = (async function() { 14156 const resolvedArgs = await Promise.all(fragment.inputs.map((param, index) => { 14157 if (args[index] == null) return null; 14158 return param.walkAsync(args[index], (type, value) => { 14159 if (type === "address") { 14160 if (Array.isArray(value)) return Promise.all(value.map((v) => resolveAddress(v, resolver))); 14161 return resolveAddress(value, resolver); 14162 } 14163 return value; 14164 }); 14165 })); 14166 return contract.interface.encodeFilterTopics(fragment, resolvedArgs); 14167 })(); 14168 } 14169 getTopicFilter() { 14170 return this.#filter; 14171 } 14172}; 14173function getRunner(value, feature) { 14174 if (value == null) return null; 14175 if (typeof value[feature] === "function") return value; 14176 if (value.provider && typeof value.provider[feature] === "function") return value.provider; 14177 return null; 14178} 14179function getProvider(value) { 14180 if (value == null) return null; 14181 return value.provider || null; 14182} 14183/** 14184* @_ignore: 14185*/ 14186async function copyOverrides(arg, allowed) { 14187 const _overrides = Typed.dereference(arg, "overrides"); 14188 assertArgument(typeof _overrides === "object", "invalid overrides parameter", "overrides", arg); 14189 const overrides = copyRequest(_overrides); 14190 assertArgument(overrides.to == null || (allowed || []).indexOf("to") >= 0, "cannot override to", "overrides.to", overrides.to); 14191 assertArgument(overrides.data == null || (allowed || []).indexOf("data") >= 0, "cannot override data", "overrides.data", overrides.data); 14192 if (overrides.from) overrides.from = overrides.from; 14193 return overrides; 14194} 14195/** 14196* @_ignore: 14197*/ 14198async function resolveArgs(_runner, inputs, args) { 14199 const runner = getRunner(_runner, "resolveName"); 14200 const resolver = canResolve(runner) ? runner : null; 14201 return await Promise.all(inputs.map((param, index) => { 14202 return param.walkAsync(args[index], (type, value) => { 14203 value = Typed.dereference(value, type); 14204 if (type === "address") return resolveAddress(value, resolver); 14205 return value; 14206 }); 14207 })); 14208} 14209function buildWrappedFallback(contract) { 14210 const populateTransaction = async function(overrides) { 14211 const tx = await copyOverrides(overrides, ["data"]); 14212 tx.to = await contract.getAddress(); 14213 if (tx.from) tx.from = await resolveAddress(tx.from, getResolver(contract.runner)); 14214 const iface = contract.interface; 14215 const noValue = getBigInt(tx.value || BN_0$1, "overrides.value") === BN_0$1; 14216 const noData = (tx.data || "0x") === "0x"; 14217 if (iface.fallback && !iface.fallback.payable && iface.receive && !noData && !noValue) assertArgument(false, "cannot send data to receive or send value to non-payable fallback", "overrides", overrides); 14218 assertArgument(iface.fallback || noData, "cannot send data to receive-only contract", "overrides.data", tx.data); 14219 assertArgument(iface.receive || iface.fallback && iface.fallback.payable || noValue, "cannot send value to non-payable fallback", "overrides.value", tx.value); 14220 assertArgument(iface.fallback || noData, "cannot send data to receive-only contract", "overrides.data", tx.data); 14221 return tx; 14222 }; 14223 const staticCall = async function(overrides) { 14224 const runner = getRunner(contract.runner, "call"); 14225 assert(canCall(runner), "contract runner does not support calling", "UNSUPPORTED_OPERATION", { operation: "call" }); 14226 const tx = await populateTransaction(overrides); 14227 try { 14228 return await runner.call(tx); 14229 } catch (error) { 14230 if (isCallException(error) && error.data) throw contract.interface.makeError(error.data, tx); 14231 throw error; 14232 } 14233 }; 14234 const send = async function(overrides) { 14235 const runner = contract.runner; 14236 assert(canSend(runner), "contract runner does not support sending transactions", "UNSUPPORTED_OPERATION", { operation: "sendTransaction" }); 14237 const tx = await runner.sendTransaction(await populateTransaction(overrides)); 14238 const provider = getProvider(contract.runner); 14239 return new ContractTransactionResponse(contract.interface, provider, tx); 14240 }; 14241 const estimateGas = async function(overrides) { 14242 const runner = getRunner(contract.runner, "estimateGas"); 14243 assert(canEstimate(runner), "contract runner does not support gas estimation", "UNSUPPORTED_OPERATION", { operation: "estimateGas" }); 14244 return await runner.estimateGas(await populateTransaction(overrides)); 14245 }; 14246 const method = async (overrides) => { 14247 return await send(overrides); 14248 }; 14249 defineProperties(method, { 14250 _contract: contract, 14251 estimateGas, 14252 populateTransaction, 14253 send, 14254 staticCall 14255 }); 14256 return method; 14257} 14258function buildWrappedMethod(contract, key) { 14259 const getFragment = function(...args) { 14260 const fragment = contract.interface.getFunction(key, args); 14261 assert(fragment, "no matching fragment", "UNSUPPORTED_OPERATION", { 14262 operation: "fragment", 14263 info: { 14264 key, 14265 args 14266 } 14267 }); 14268 return fragment; 14269 }; 14270 const populateTransaction = async function(...args) { 14271 const fragment = getFragment(...args); 14272 let overrides = {}; 14273 if (fragment.inputs.length + 1 === args.length) { 14274 overrides = await copyOverrides(args.pop()); 14275 if (overrides.from) overrides.from = await resolveAddress(overrides.from, getResolver(contract.runner)); 14276 } 14277 if (fragment.inputs.length !== args.length) throw new Error("internal error: fragment inputs doesn't match arguments; should not happen"); 14278 const resolvedArgs = await resolveArgs(contract.runner, fragment.inputs, args); 14279 return Object.assign({}, overrides, await resolveProperties({ 14280 to: contract.getAddress(), 14281 data: contract.interface.encodeFunctionData(fragment, resolvedArgs) 14282 })); 14283 }; 14284 const staticCall = async function(...args) { 14285 const result = await staticCallResult(...args); 14286 if (result.length === 1) return result[0]; 14287 return result; 14288 }; 14289 const send = async function(...args) { 14290 const runner = contract.runner; 14291 assert(canSend(runner), "contract runner does not support sending transactions", "UNSUPPORTED_OPERATION", { operation: "sendTransaction" }); 14292 const tx = await runner.sendTransaction(await populateTransaction(...args)); 14293 const provider = getProvider(contract.runner); 14294 return new ContractTransactionResponse(contract.interface, provider, tx); 14295 }; 14296 const estimateGas = async function(...args) { 14297 const runner = getRunner(contract.runner, "estimateGas"); 14298 assert(canEstimate(runner), "contract runner does not support gas estimation", "UNSUPPORTED_OPERATION", { operation: "estimateGas" }); 14299 return await runner.estimateGas(await populateTransaction(...args)); 14300 }; 14301 const staticCallResult = async function(...args) { 14302 const runner = getRunner(contract.runner, "call"); 14303 assert(canCall(runner), "contract runner does not support calling", "UNSUPPORTED_OPERATION", { operation: "call" }); 14304 const tx = await populateTransaction(...args);
14305 let result = "0x"; 14306 try { 14307 result = await runner.call(tx); 14308 } catch (error) { 14309 if (isCallException(error) && error.data) throw contract.interface.makeError(error.data, tx); 14310 throw error; 14311 } 14312 const fragment = getFragment(...args); 14313 return contract.interface.decodeFunctionResult(fragment, result); 14314 }; 14315 const method = async (...args) => { 14316 if (getFragment(...args).constant) return await staticCall(...args); 14317 return await send(...args); 14318 }; 14319 defineProperties(method, { 14320 name: contract.interface.getFunctionName(key), 14321 _contract: contract, 14322 _key: key, 14323 getFragment, 14324 estimateGas, 14325 populateTransaction, 14326 send, 14327 staticCall, 14328 staticCallResult 14329 }); 14330 Object.defineProperty(method, "fragment", { 14331 configurable: false, 14332 enumerable: true, 14333 get: () => { 14334 const fragment = contract.interface.getFunction(key); 14335 assert(fragment, "no matching fragment", "UNSUPPORTED_OPERATION", { 14336 operation: "fragment", 14337 info: { key } 14338 }); 14339 return fragment; 14340 } 14341 }); 14342 return method; 14343} 14344function buildWrappedEvent(contract, key) { 14345 const getFragment = function(...args) { 14346 const fragment = contract.interface.getEvent(key, args); 14347 assert(fragment, "no matching fragment", "UNSUPPORTED_OPERATION", { 14348 operation: "fragment", 14349 info: { 14350 key, 14351 args 14352 } 14353 }); 14354 return fragment; 14355 }; 14356 const method = function(...args) { 14357 return new PreparedTopicFilter(contract, getFragment(...args), args); 14358 }; 14359 defineProperties(method, { 14360 name: contract.interface.getEventName(key), 14361 _contract: contract, 14362 _key: key, 14363 getFragment 14364 }); 14365 Object.defineProperty(method, "fragment", { 14366 configurable: false, 14367 enumerable: true, 14368 get: () => { 14369 const fragment = contract.interface.getEvent(key); 14370 assert(fragment, "no matching fragment", "UNSUPPORTED_OPERATION", { 14371 operation: "fragment", 14372 info: { key } 14373 }); 14374 return fragment; 14375 } 14376 }); 14377 return method; 14378} 14379var internal = Symbol.for("_ethersInternal_contract"); 14380var internalValues = /* @__PURE__ */ new WeakMap(); 14381function setInternal(contract, values) { 14382 internalValues.set(contract[internal], values); 14383} 14384function getInternal(contract) { 14385 return internalValues.get(contract[internal]); 14386} 14387function isDeferred(value) { 14388 return value && typeof value === "object" && "getTopicFilter" in value && typeof value.getTopicFilter === "function" && value.fragment; 14389} 14390async function getSubInfo(contract, event) { 14391 let topics; 14392 let fragment = null; 14393 if (Array.isArray(event)) { 14394 const topicHashify = function(name) { 14395 if (isHexString(name, 32)) return name; 14396 const fragment = contract.interface.getEvent(name); 14397 assertArgument(fragment, "unknown fragment", "name", name); 14398 return fragment.topicHash; 14399 }; 14400 topics = event.map((e) => { 14401 if (e == null) return null; 14402 if (Array.isArray(e)) return e.map(topicHashify); 14403 return topicHashify(e); 14404 }); 14405 } else if (event === "*") topics = [null]; 14406 else if (typeof event === "string") { 14407 if (isHexString(event, 32)) topics = [event]; 14408 else { 14409 fragment = contract.interface.getEvent(event); 14410 assertArgument(fragment, "unknown fragment", "event", event); 14411 topics = [fragment.topicHash]; 14412 } 14413 } else if (isDeferred(event)) topics = await event.getTopicFilter(); 14414 else if ("fragment" in event) { 14415 fragment = event.fragment; 14416 topics = [fragment.topicHash]; 14417 } else assertArgument(false, "unknown event name", "event", event); 14418 topics = topics.map((t) => { 14419 if (t == null) return null; 14420 if (Array.isArray(t)) { 14421 const items = Array.from(new Set(t.map((t) => t.toLowerCase())).values()); 14422 if (items.length === 1) return items[0]; 14423 items.sort(); 14424 return items; 14425 } 14426 return t.toLowerCase(); 14427 }); 14428 const tag = topics.map((t) => { 14429 if (t == null) return "null"; 14430 if (Array.isArray(t)) return t.join("|"); 14431 return t; 14432 }).join("&"); 14433 return { 14434 fragment, 14435 tag, 14436 topics 14437 }; 14438} 14439async function hasSub(contract, event) { 14440 const { subs } = getInternal(contract); 14441 return subs.get((await getSubInfo(contract, event)).tag) || null; 14442} 14443async function getSub(contract, operation, event) { 14444 const provider = getProvider(contract.runner); 14445 assert(provider, "contract runner does not support subscribing", "UNSUPPORTED_OPERATION", { operation }); 14446 const { fragment, tag, topics } = await getSubInfo(contract, event); 14447 const { addr, subs } = getInternal(contract); 14448 let sub = subs.get(tag); 14449 if (!sub) { 14450 const filter = { 14451 address: addr ? addr : contract, 14452 topics 14453 }; 14454 const listener = (log) => { 14455 let foundFragment = fragment; 14456 if (foundFragment == null) try { 14457 foundFragment = contract.interface.getEvent(log.topics[0]); 14458 } catch (error) {} 14459 if (foundFragment) { 14460 const _foundFragment = foundFragment; 14461 emit(contract, event, fragment ? contract.interface.decodeEventLog(fragment, log.data, log.to
14461pics) : [], (listener) => { 14462 return new ContractEventPayload(contract, listener, event, _foundFragment, log); 14463 }); 14464 } else emit(contract, event, [], (listener) => { 14465 return new ContractUnknownEventPayload(contract, listener, event, log); 14466 }); 14467 }; 14468 let starting = []; 14469 const start = () => { 14470 if (starting.length) return; 14471 starting.push(provider.on(filter, listener)); 14472 }; 14473 const stop = async () => { 14474 if (starting.length == 0) return; 14475 let started = starting; 14476 starting = []; 14477 await Promise.all(started); 14478 provider.off(filter, listener); 14479 }; 14480 sub = { 14481 tag, 14482 listeners: [], 14483 start, 14484 stop 14485 }; 14486 subs.set(tag, sub); 14487 } 14488 return sub; 14489} 14490var lastEmit = Promise.resolve(); 14491async function _emit(contract, event, args, payloadFunc) { 14492 await lastEmit; 14493 const sub = await hasSub(contract, event); 14494 if (!sub) return false; 14495 const count = sub.listeners.length; 14496 sub.listeners = sub.listeners.filter(({ listener, once }) => { 14497 const passArgs = Array.from(args); 14498 if (payloadFunc) passArgs.push(payloadFunc(once ? null : listener)); 14499 try { 14500 listener.call(contract, ...passArgs); 14501 } catch (error) {} 14502 return !once; 14503 }); 14504 if (sub.listeners.length === 0) { 14505 sub.stop(); 14506 getInternal(contract).subs.delete(sub.tag); 14507 } 14508 return count > 0; 14509} 14510async function emit(contract, event, args, payloadFunc) { 14511 try { 14512 await lastEmit; 14513 } catch (error) {} 14514 const resultPromise = _emit(contract, event, args, payloadFunc); 14515 lastEmit = resultPromise; 14516 return await resultPromise; 14517} 14518var passProperties = ["then"]; 14519var BaseContract = class BaseContract { 14520 /** 14521 * The target to connect to. 14522 * 14523 * This can be an address, ENS name or any [[Addressable]], such as 14524 * another contract. To get the resolved address, use the ``getAddress`` 14525 * method. 14526 */ 14527 target; 14528 /** 14529 * The contract Interface. 14530 */ 14531 interface; 14532 /** 14533 * The connected runner. This is generally a [[Provider]] or a 14534 * [[Signer]], which dictates what operations are supported. 14535 * 14536 * For example, a **Contract** connected to a [[Provider]] may 14537 * only execute read-only operations. 14538 */ 14539 runner; 14540 /** 14541 * All the Events available on this contract. 14542 */ 14543 filters; 14544 /** 14545 * @_ignore: 14546 */ 14547 [internal]; 14548 /** 14549 * The fallback or receive function if any. 14550 */ 14551 fallback; 14552 /** 14553 * Creates a new contract connected to %%target%% with the %%abi%% and 14554 * optionally connected to a %%runner%% to perform operations on behalf 14555 * of. 14556 */ 14557 constructor(target, abi, runner, _deployTx) { 14558 assertArgument(typeof target === "string" || isAddressable(target), "invalid value for Contract target", "target", target); 14559 if (runner == null) runner = null; 14560 const iface = Interface.from(abi); 14561 defineProperties(this, { 14562 target, 14563 runner, 14564 interface: iface 14565 }); 14566 Object.defineProperty(this, internal, { value: {} }); 14567 let addrPromise; 14568 let addr = null; 14569 let deployTx = null; 14570 if (_deployTx) { 14571 const provider = getProvider(runner); 14572 deployTx = new ContractTransactionResponse(this.interface, provider, _deployTx); 14573 } 14574 let subs = /* @__PURE__ */ new Map(); 14575 if (typeof target === "string") { 14576 if (isHexString(target)) { 14577 addr = target; 14578 addrPromise = Promise.resolve(target); 14579 } else { 14580 const resolver = getRunner(runner, "resolveName"); 14581 if (!canResolve(resolver)) throw makeError("contract runner does not support name resolution", "UNSUPPORTED_OPERATION", { operation: "resolveName" }); 14582 addrPromise = resolver.resolveName(target).then((addr) => { 14583 if (addr == null) throw makeError("an ENS name used for a contract target must be correctly configured", "UNCONFIGURED_NAME", { value: target }); 14584 getInternal(this).addr = addr; 14585 return addr; 14586 }); 14587 } 14588 } else addrPromise = target.getAddress().then((addr) => { 14589 if (addr == null) throw new Error("TODO"); 14590 getInternal(this).addr = addr; 14591 return addr; 14592 }); 14593 setInternal(this, { 14594 addrPromise, 14595 addr, 14596 deployTx, 14597 subs 14598 }); 14599 const filters = new Proxy({}, { 14600 get: (target, prop, receiver) => { 14601 if (typeof prop === "symbol" || passProperties.indexOf(prop) >= 0) return Reflect.get(target, prop, receiver); 14602 try { 14603 return this.getEvent(prop); 14604 } catch (error) { 14605 if (!isError(error, "INVALID_ARGUMENT") || error.argument !== "key") throw error; 14606 } 14607 }, 14608 has: (target, prop) => { 14609 if (passProperties.indexOf(prop) >= 0) return Reflect.has(target, prop); 14610 return Reflect.has(target, prop) || this.interface.hasEvent(String(prop)); 14611 } 14612 }); 14613 defineProperties(this, { filters }); 14614 defineProperties(this, { fallback: iface.receive || iface.fallback ? buildWrappedFallback(this) : null }); 14615 return new Proxy(this, { 14616 get: (target, prop, receiver) => { 14617 if (typeof prop === "symbol" || prop in target || passProperties.indexOf(prop) >= 0) return Reflect.get(target, prop, receiver);
14618 try { 14619 return target.getFunction(prop); 14620 } catch (error) { 14621 if (!isError(error, "INVALID_ARGUMENT") || error.argument !== "key") throw error; 14622 } 14623 }, 14624 has: (target, prop) => { 14625 if (typeof prop === "symbol" || prop in target || passProperties.indexOf(prop) >= 0) return Reflect.has(target, prop); 14626 return target.interface.hasFunction(prop); 14627 } 14628 }); 14629 } 14630 /** 14631 * Return a new Contract instance with the same target and ABI, but 14632 * a different %%runner%%. 14633 */ 14634 connect(runner) { 14635 return new BaseContract(this.target, this.interface, runner); 14636 } 14637 /** 14638 * Return a new Contract instance with the same ABI and runner, but 14639 * a different %%target%%. 14640 */ 14641 attach(target) { 14642 return new BaseContract(target, this.interface, this.runner); 14643 } 14644 /** 14645 * Return the resolved address of this Contract. 14646 */ 14647 async getAddress() { 14648 return await getInternal(this).addrPromise; 14649 } 14650 /** 14651 * Return the deployed bytecode or null if no bytecode is found. 14652 */ 14653 async getDeployedCode() { 14654 const provider = getProvider(this.runner); 14655 assert(provider, "runner does not support .provider", "UNSUPPORTED_OPERATION", { operation: "getDeployedCode" }); 14656 const code = await provider.getCode(await this.getAddress()); 14657 if (code === "0x") return null; 14658 return code; 14659 } 14660 /** 14661 * Resolve to this Contract once the bytecode has been deployed, or 14662 * resolve immediately if already deployed. 14663 */ 14664 async waitForDeployment() { 14665 const deployTx = this.deploymentTransaction(); 14666 if (deployTx) { 14667 await deployTx.wait(); 14668 return this; 14669 } 14670 if (await this.getDeployedCode() != null) return this; 14671 const provider = getProvider(this.runner); 14672 assert(provider != null, "contract runner does not support .provider", "UNSUPPORTED_OPERATION", { operation: "waitForDeployment" }); 14673 return new Promise((resolve, reject) => { 14674 const checkCode = async () => { 14675 try { 14676 if (await this.getDeployedCode() != null) return resolve(this); 14677 provider.once("block", checkCode); 14678 } catch (error) { 14679 reject(error); 14680 } 14681 }; 14682 checkCode(); 14683 }); 14684 } 14685 /** 14686 * Return the transaction used to deploy this contract. 14687 * 14688 * This is only available if this instance was returned from a 14689 * [[ContractFactory]]. 14690 */ 14691 deploymentTransaction() { 14692 return getInternal(this).deployTx; 14693 } 14694 /** 14695 * Return the function for a given name. This is useful when a contract 14696 * method name conflicts with a JavaScript name such as ``prototype`` or 14697 * when using a Contract programmatically. 14698 */ 14699 getFunction(key) { 14700 if (typeof key !== "string") key = key.format(); 14701 return buildWrappedMethod(this, key); 14702 } 14703 /** 14704 * Return the event for a given name. This is useful when a contract 14705 * event name conflicts with a JavaScript name such as ``prototype`` or 14706 * when using a Contract programmatically. 14707 */ 14708 getEvent(key) { 14709 if (typeof key !== "string") key = key.format(); 14710 return buildWrappedEvent(this, key); 14711 } 14712 /** 14713 * @_ignore: 14714 */ 14715 async queryTransaction(hash) { 14716 throw new Error("@TODO"); 14717 } 14718 /** 14719 * Provide historic access to event data for %%event%% in the range 14720 * %%fromBlock%% (default: ``0``) to %%toBlock%% (default: ``"latest"``) 14721 * inclusive. 14722 */ 14723 async queryFilter(event, fromBlock, toBlock) { 14724 if (fromBlock == null) fromBlock = 0; 14725 if (toBlock == null) toBlock = "latest"; 14726 const { addr, addrPromise } = getInternal(this); 14727 const address = addr ? addr : await addrPromise; 14728 const { fragment, topics } = await getSubInfo(this, event); 14729 const filter = { 14730 address, 14731 topics, 14732 fromBlock, 14733 toBlock 14734 }; 14735 const provider = getProvider(this.runner); 14736 assert(provider, "contract runner does not have a provider", "UNSUPPORTED_OPERATION", { operation: "queryFilter" }); 14737 return (await provider.getLogs(filter)).map((log) => { 14738 let foundFragment = fragment; 14739 if (foundFragment == null) try { 14740 foundFragment = this.interface.getEvent(log.topics[0]); 14741 } catch (error) {} 14742 if (foundFragment) try { 14743 return new EventLog(log, this.interface, foundFragment); 14744 } catch (error) { 14745 return new UndecodedEventLog(log, error); 14746 } 14747 return new Log(log, provider); 14748 }); 14749 } 14750 /** 14751 * Add an event %%listener%% for the %%event%%. 14752 */ 14753 async on(event, listener) { 14754 const sub = await getSub(this, "on", event); 14755 sub.listeners.push({ 14756 listener, 14757 once: false 14758 }); 14759 sub.start(); 14760 return this; 14761 } 14762 /** 14763 * Add an event %%listener%% for the %%event%%, but remove the listener 14764 * after it is fired once. 14765 */ 14766 async once(event, listener) { 14767 const sub = await getSub(this, "once", event); 14768 sub.listeners.push({ 14769 listener, 14770 once: true 14771 }); 14772 sub.start(); 14773 return this; 14774 } 14775 /** 14776 * Emit an %%event%% calling all listeners with %%args%%. 14777 * 14778 * Resolves to ``true`` if any listeners were called. 14779 */ 14780 async emit(event, ...args) { 14781 return await emit(this, event, args, null); 14782 } 14783 /** 14784 * Resolves to the number of listeners of %%event%% or the total number 14785 * of listeners if unspecified. 14786 */ 14787 async listenerCount(event) { 14788 if (event) { 14789 const sub = await hasSub(this, event); 14790 if (!sub) return 0; 14791 return sub.listeners.length; 14792 } 14793 const { subs } = getInternal(this); 14794 let total = 0; 14795 for (const { listeners } of subs.values()) total += listeners.length; 14796 return total; 14797 }
14798 /** 14799 * Resolves to the listeners subscribed to %%event%% or all listeners 14800 * if unspecified. 14801 */ 14802 async listeners(event) { 14803 if (event) { 14804 const sub = await hasSub(this, event); 14805 if (!sub) return []; 14806 return sub.listeners.map(({ listener }) => listener); 14807 } 14808 const { subs } = getInternal(this); 14809 let result = []; 14810 for (const { listeners } of subs.values()) result = result.concat(listeners.map(({ listener }) => listener)); 14811 return result; 14812 } 14813 /** 14814 * Remove the %%listener%% from the listeners for %%event%% or remove 14815 * all listeners if unspecified. 14816 */ 14817 async off(event, listener) { 14818 const sub = await hasSub(this, event); 14819 if (!sub) return this; 14820 if (listener) { 14821 const index = sub.listeners.map(({ listener }) => listener).indexOf(listener); 14822 if (index >= 0) sub.listeners.splice(index, 1); 14823 } 14824 if (listener == null || sub.listeners.length === 0) { 14825 sub.stop(); 14826 getInternal(this).subs.delete(sub.tag); 14827 } 14828 return this; 14829 } 14830 /** 14831 * Remove all the listeners for %%event%% or remove all listeners if 14832 * unspecified. 14833 */ 14834 async removeAllListeners(event) { 14835 if (event) { 14836 const sub = await hasSub(this, event); 14837 if (!sub) return this; 14838 sub.stop(); 14839 getInternal(this).subs.delete(sub.tag); 14840 } else { 14841 const { subs } = getInternal(this); 14842 for (const { tag, stop } of subs.values()) { 14843 stop(); 14844 subs.delete(tag); 14845 } 14846 } 14847 return this; 14848 } 14849 /** 14850 * Alias for [on]. 14851 */ 14852 async addListener(event, listener) { 14853 return await this.on(event, listener); 14854 } 14855 /** 14856 * Alias for [off]. 14857 */ 14858 async removeListener(event, listener) { 14859 return await this.off(event, listener); 14860 } 14861 /** 14862 * Create a new Class for the %%abi%%. 14863 */ 14864 static buildClass(abi) { 14865 class CustomContract extends BaseContract { 14866 constructor(address, runner = null) { 14867 super(address, abi, runner); 14868 } 14869 } 14870 return CustomContract; 14871 } 14872 /** 14873 * Create a new BaseContract with a specified Interface. 14874 */ 14875 static from(target, abi, runner) { 14876 if (runner == null) runner = null; 14877 return new this(target, abi, runner); 14878 } 14879}; 14880function _ContractBase() { 14881 return BaseContract; 14882} 14883/** 14884* A [[BaseContract]] with no type guards on its methods or events. 14885*/ 14886var Contract = class extends _ContractBase() {}; 14887//#endregion 14888//#region node_modules/ethers/lib.esm/contract/factory.js 14889/** 14890* A **ContractFactory** is used to deploy a Contract to the blockchain. 14891*/ 14892var ContractFactory = class ContractFactory { 14893 /** 14894 * The Contract Interface. 14895 */ 14896 interface; 14897 /** 14898 * The Contract deployment bytecode. Often called the initcode. 14899 */ 14900 bytecode; 14901 /** 14902 * The ContractRunner to deploy the Contract as. 14903 */ 14904 runner; 14905 /** 14906 * Create a new **ContractFactory** with %%abi%% and %%bytecode%%, 14907 * optionally connected to %%runner%%. 14908 * 14909 * The %%bytecode%% may be the ``bytecode`` property within the 14910 * standard Solidity JSON output. 14911 */ 14912 constructor(abi, bytecode, runner) { 14913 const iface = Interface.from(abi); 14914 if (bytecode instanceof Uint8Array) bytecode = hexlify(getBytes(bytecode)); 14915 else { 14916 if (typeof bytecode === "object") bytecode = bytecode.object; 14917 if (!bytecode.startsWith("0x")) bytecode = "0x" + bytecode; 14918 bytecode = hexlify(getBytes(bytecode)); 14919 } 14920 defineProperties(this, { 14921 bytecode, 14922 interface: iface, 14923 runner: runner || null 14924 }); 14925 } 14926 attach(target) { 14927 return new BaseContract(target, this.interface, this.runner); 14928 } 14929 /** 14930 * Resolves to the transaction to deploy the contract, passing %%args%% 14931 * into the constructor. 14932 */ 14933 async getDeployTransaction(...args) { 14934 let overrides = {}; 14935 const fragment = this.interface.deploy; 14936 if (fragment.inputs.length + 1 === args.length) overrides = await copyOverrides(args.pop()); 14937 if (fragment.inputs.length !== args.length) throw new Error("incorrect number of arguments to constructor"); 14938 const resolvedArgs = await resolveArgs(this.runner, fragment.inputs, args); 14939 const data = concat([this.bytecode, this.interface.encodeDeploy(resolvedArgs)]); 14940 return Object.assign({}, overrides, { data }); 14941 } 14942 /** 14943 * Resolves to the Contract deployed by passing %%args%% into the 14944 * constructor. 14945 * 14946 * This will resolve to the Contract before it has been deployed to the 14947 * network, so the [[BaseContract-waitForDeployment]] should be used before 14948 * sending any transactions to it. 14949 */ 14950 async deploy(...args) { 14951 const tx = await this.getDeployTransaction(...args); 14952 assert(this.runner && typeof this.runner.sendTransaction === "function", "factory runner does not support sending transactions", "UNSUPPORTED_OPERATION", { operation: "sendTransaction" }); 14953 const sentTx = await this.runner.sendTransaction(tx); 14954 return new BaseContract(getCreateAddress(sentTx), this.interface, this.runner, sentTx); 14955 } 14956 /** 14957 * Return a new **ContractFactory** with the same ABI and bytecode, 14958 * but connected to %%runner%%. 14959 */ 14960 connect(runner) { 14961 return new ContractFactory(this.interface, this.bytecode, runner); 14962 } 14963 /**
14964 * Create a new **ContractFactory** from the standard Solidity JSON output. 14965 */ 14966 static fromSolidity(output, runner) { 14967 assertArgument(output != null, "bad compiler output", "output", output); 14968 if (typeof output === "string") output = JSON.parse(output); 14969 const abi = output.abi; 14970 let bytecode = ""; 14971 if (output.bytecode) bytecode = output.bytecode; 14972 else if (output.evm && output.evm.bytecode) bytecode = output.evm.bytecode; 14973 return new this(abi, bytecode, runner); 14974 } 14975}; 14976//#endregion 14977//#region node_modules/ethers/lib.esm/providers/ens-resolver.js 14978/** 14979* ENS is a service which allows easy-to-remember names to map to 14980* network addresses. 14981* 14982* @_section: api/providers/ens-resolver:ENS Resolver [about-ens-rsolver] 14983*/ 14984var BN_60 = BigInt(60); 14985function getIpfsLink(link) { 14986 if (link.match(/^ipfs:\/\/ipfs\//i)) link = link.substring(12); 14987 else if (link.match(/^ipfs:\/\//i)) link = link.substring(7); 14988 else assertArgument(false, "unsupported IPFS format", "link", link); 14989 return `https:/\/gateway.ipfs.io/ipfs/${link}`; 14990} 14991/** 14992* A provider plugin super-class for processing multicoin address types. 14993*/ 14994var MulticoinProviderPlugin = class { 14995 /** 14996 * The name. 14997 */ 14998 name; 14999 /** 15000 * Creates a new **MulticoinProviderPluing** for %%name%%. 15001 */ 15002 constructor(name) { 15003 defineProperties(this, { name }); 15004 } 15005 connect(provider) { 15006 return this; 15007 } 15008 /** 15009 * Returns ``true`` if %%coinType%% is supported by this plugin. 15010 */ 15011 supportsCoinType(coinType) { 15012 return false; 15013 } 15014 /** 15015 * Resolves to the encoded %%address%% for %%coinType%%. 15016 */ 15017 async encodeAddress(coinType, address) { 15018 throw new Error("unsupported coin"); 15019 } 15020 /** 15021 * Resolves to the decoded %%data%% for %%coinType%%. 15022 */ 15023 async decodeAddress(coinType, data) { 15024 throw new Error("unsupported coin"); 15025 } 15026}; 15027var matcherIpfs = /* @__PURE__ */ new RegExp("^(ipfs)://(.*)$", "i"); 15028var matchers = [ 15029 /* @__PURE__ */ new RegExp("^(https)://(.*)$", "i"), 15030 /* @__PURE__ */ new RegExp("^(data):(.*)$", "i"), 15031 matcherIpfs, 15032 /* @__PURE__ */ new RegExp("^eip155:[0-9]+/(erc[0-9]+):(.*)$", "i") 15033]; 15034function isEvmCoinType(coinType) { 15035 return coinType === BN_60 || coinType >= 2147483648 && coinType <= 4294967295; 15036} 15037/** 15038* A connected object to a resolved ENS name resolver, which can be 15039* used to query additional details. 15040*/ 15041var EnsResolver = class EnsResolver { 15042 /** 15043 * The connected provider. 15044 */ 15045 provider; 15046 /** 15047 * The address of the resolver. 15048 */ 15049 address; 15050 /** 15051 * The name this resolver was resolved against. 15052 */ 15053 name; 15054 #supports2544; 15055 #resolver; 15056 constructor(provider, address, name, supportsWildcard) { 15057 defineProperties(this, { 15058 provider, 15059 address, 15060 name 15061 }); 15062 this.#supports2544 = supportsWildcard != null ? Promise.resolve(supportsWildcard) : null; 15063 this.#resolver = new Contract(address, [ 15064 "function supportsInterface(bytes4) view returns (bool)", 15065 "function resolve(bytes, bytes) view returns (bytes)", 15066 "function addr(bytes32) view returns (address)", 15067 "function addr(bytes32, uint) view returns (bytes)", 15068 "function text(bytes32, string) view returns (string)", 15069 "function contenthash(bytes32) view returns (bytes)", 15070 "function name(bytes32) view returns (string)" 15071 ], provider); 15072 } 15073 /** 15074 * Resolves to true if the resolver supports wildcard resolution. 15075 */ 15076 async supportsWildcard() { 15077 if (this.#supports2544 == null) this.#supports2544 = (async () => { 15078 try { 15079 return await this.#resolver.supportsInterface("0x9061b923"); 15080 } catch (error) { 15081 if (isError(error, "CALL_EXCEPTION")) return false; 15082 this.#supports2544 = null; 15083 throw error; 15084 } 15085 })(); 15086 return await this.#supports2544; 15087 } 15088 async #fetch(funcName, params) { 15089 params = (params || []).slice(); 15090 const iface = this.#resolver.interface; 15091 params.unshift(namehash(this.name)); 15092 let fragment = null; 15093 if (await this.supportsWildcard()) { 15094 fragment = iface.getFunction(funcName); 15095 assert(fragment, "missing fragment", "UNKNOWN_ERROR", { info: { funcName } }); 15096 params = [dnsEncode(this.name, 255), iface.encodeFunctionData(fragment, params)]; 15097 funcName = "resolve(bytes,bytes)"; 15098 } 15099 params.push({ enableCcipRead: true }); 15100 try { 15101 const result = await this.#resolver[funcName](...params); 15102 if (fragment) return iface.decodeFunctionResult(fragment, result)[0]; 15103 return result; 15104 } catch (error) { 15105 if (!isError(error, "CALL_EXCEPTION")) throw error; 15106 } 15107 return null; 15108 }
15109 /** 15110 * Resolves to the address for %%coinType%% or null if the 15111 * provided %%coinType%% has not been configured. 15112 */ 15113 async getAddress(_coinType) { 15114 const coinType = _coinType == null ? BN_60 : getBigInt(_coinType); 15115 if (coinType === BN_60) try { 15116 const result = await this.#fetch("addr(bytes32)"); 15117 if (result == null || result === "0x0000000000000000000000000000000000000000") return null; 15118 return result; 15119 } catch (error) { 15120 if (isError(error, "CALL_EXCEPTION")) return null; 15121 throw error; 15122 } 15123 if (isEvmCoinType(coinType)) { 15124 const data = await this.#fetch("addr(bytes32,uint)", [coinType]); 15125 if (isHexString(data, 20)) return getAddress(data); 15126 return null; 15127 } 15128 if (coinType >= 0 && coinType < 2147483648) { 15129 let ethCoinType = coinType + BigInt(2147483648); 15130 const data = await this.#fetch("addr(bytes32,uint)", [ethCoinType]); 15131 if (isHexString(data, 20)) return getAddress(data); 15132 } 15133 let coinPlugin = null; 15134 for (const plugin of this.provider.plugins) { 15135 if (!(plugin instanceof MulticoinProviderPlugin)) continue; 15136 if (coinType <= 2147483648 && plugin.supportsCoinType(Number(coinType))) { 15137 coinPlugin = plugin; 15138 break; 15139 } 15140 } 15141 if (coinPlugin == null) return null; 15142 const data = await this.#fetch("addr(bytes32,uint)", [coinType]); 15143 if (data == null || data === "0x") return null; 15144 if (coinType < 2147483648) { 15145 const address = await coinPlugin.decodeAddress(Number(coinType), data); 15146 if (address != null) return address; 15147 } 15148 assert(false, `invalid coin data`, "UNSUPPORTED_OPERATION", { 15149 operation: `getAddress(${coinType})`, 15150 info: { 15151 coinType, 15152 data 15153 } 15154 }); 15155 } 15156 /** 15157 * Resolves to the EIP-634 text record for %%key%%, or ``null`` 15158 * if unconfigured. 15159 */ 15160 async getText(key) { 15161 const data = await this.#fetch("text(bytes32,string)", [key]); 15162 if (data == null || data === "0x") return null; 15163 return data; 15164 } 15165 /** 15166 * Rsolves to the content-hash or ``null`` if unconfigured. 15167 */ 15168 async getContentHash() { 15169 const data = await this.#fetch("contenthash(bytes32)"); 15170 if (data == null || data === "0x") return null; 15171 const ipfs = data.match(/^0x(e3010170|e5010172)(([0-9a-f][0-9a-f])([0-9a-f][0-9a-f])([0-9a-f]*))$/); 15172 if (ipfs) { 15173 const scheme = ipfs[1] === "e3010170" ? "ipfs" : "ipns"; 15174 const length = parseInt(ipfs[4], 16); 15175 if (ipfs[5].length === length * 2) return `${scheme}:/\/${encodeBase58("0x" + ipfs[2])}`; 15176 } 15177 const swarm = data.match(/^0xe40101fa011b20([0-9a-f]*)$/); 15178 if (swarm && swarm[1].length === 64) return `bzz:/\/${swarm[1]}`; 15179 assert(false, `invalid or unsupported content hash data`, "UNSUPPORTED_OPERATION", { 15180 operation: "getContentHash()", 15181 info: { data } 15182 }); 15183 } 15184 async getName() { 15185 return await this.#fetch("name(bytes32)"); 15186 } 15187 /** 15188 * Resolves to the avatar url or ``null`` if the avatar is either 15189 * unconfigured or incorrectly configured (e.g. references an NFT 15190 * not owned by the address). 15191 * 15192 * If diagnosing issues with configurations, the [[_getAvatar]] 15193 * method may be useful. 15194 */ 15195 async getAvatar() { 15196 return (await this._getAvatar()).url; 15197 } 15198 /** 15199 * When resolving an avatar, there are many steps involved, such 15200 * fetching metadata and possibly validating ownership of an 15201 * NFT. 15202 * 15203 * This method can be used to examine each step and the value it 15204 * was working from. 15205 */ 15206 async _getAvatar() { 15207 const linkage = [{ 15208 type: "name", 15209 value: this.name 15210 }]; 15211 try { 15212 const avatar = await this.getText("avatar"); 15213 if (avatar == null) { 15214 linkage.push({ 15215 type: "!avatar", 15216 value: "" 15217 }); 15218 return { 15219 url: null, 15220 linkage 15221 }; 15222 } 15223 linkage.push({ 15224 type: "avatar", 15225 value: avatar 15226 }); 15227 for (let i = 0; i < matchers.length; i++) { 15228 const match = avatar.match(matchers[i]); 15229 if (match == null) continue; 15230 const scheme = match[1].toLowerCase(); 15231 switch (scheme) { 15232 case "https": 15233 case "data": 15234 linkage.push({ 15235 type: "url", 15236 value: avatar 15237 }); 15238 return { 15239 linkage, 15240 url: avatar 15241 }; 15242 case "ipfs": { 15243 const url = getIpfsLink(avatar); 15244 linkage.push({ 15245 type: "ipfs", 15246 value: avatar 15247 }); 15248 linkage.push({ 15249 type: "url", 15250 value: url 15251 }); 15252 return { 15253 linkage, 15254 url 15255 }; 15256 } 15257 case "erc721": 15258 case "erc1155": { 15259 const selector = scheme === "erc721" ? "tokenURI(uint256)" : "uri(uint256)"; 15260 linkage.push({ 15261 type: scheme, 15262 value: avatar 15263 }); 15264 const owner = await this.getAddress(); 15265 if (owner == null) { 15266 linkage.push({ 15267 type: "!owner", 15268 value: "" 15269 }); 15270 return { 15271 url: null, 15272 linkage 15273 }; 15274 } 15275 const comps = (match[2] || "").split("/"); 15276 if (comps.length !== 2) { 15277 linkage.push({ 15278 type: `!${scheme}caip`, 15279 value: match[2] || "" 15280 }); 15281 return { 15282 url: null, 15283 linkage 15284 }; 15285 } 15286 const tokenId = comps[1]; 15287 const contract = new Contract(comps[0], [ 15288 "function tokenURI(uint) view returns (string)", 15289 "function ownerOf(uint) view returns (address)", 15290 "function uri(uint) view returns (string)", 15291 "function balanceOf(address, uint256) view returns (uint)" 15292 ], this.provider); 15293 if (scheme === "erc721") { 15294 const tokenOwner = await contract.ownerOf(tokenId); 15295 if (owner !== tokenOwner) { 15296 linkage.push({ 15297 type: "!owner", 15298 value: tokenOwner 15299 }); 15300 return { 15301 url: null, 15302 linkage 15303 }; 15304 } 15305 linkage.push({ 15306 type: "owner", 15307 value: tokenOwner 15308 }); 15309 } else if (scheme === "erc1155") { 15310 const balance = await contract.balanceOf(owner, tokenId); 15311 if (!balance) { 15312 linkage.push({ 15313 type: "!balance", 15314 value: "0" 15315 }); 15316 return { 15317 url: null, 15318 linkage 15319 }; 15320 } 15321 linkage.push({ 15322 type: "balance", 15323 value: balance.toString() 15324 }); 15325 } 15326 let metadataUrl = await contract[selector](tokenId); 15327 if (metadataUrl == null || metadataUrl === "0x") { 15328 linkage.push({ 15329 type: "!metadata-url", 15330 value: "" 15331 }); 15332 return { 15333 url: null, 15334 linkage 15335 }; 15336 } 15337 linkage.push({ 15338 type: "metadata-url-base", 15339 value: metadataUrl 15340 }); 15341 if (scheme === "erc1155") { 15342 metadataUrl = metadataUrl.replace("{id}", toBeHex(tokenId, 32).substring(2)); 15343 linkage.push({ 15344 type: "metadata-url-expanded", 15345 value: metadataUrl 15346 }); 15347 } 15348 if (metadataUrl.match(/^ipfs:/i)) metadataUrl = getIpfsLink(metadataUrl); 15349 linkage.push({ 15350 type: "metadata-url", 15351 value: metadataUrl 15352 }); 15353 let metadata = {}; 15354 const response = await new FetchRequest(metadataUrl).send(); 15355 response.assertOk(); 15356 try { 15357 metadata = response.bodyJson; 15358 } catch (error) { 15359 try { 15360 linkage.push({ 15361 type: "!metadata", 15362 value: response.bodyText 15363 }); 15364 } catch (error) { 15365 const bytes = response.body; 15366 if (bytes) linkage.push({ 15367 type: "!metadata", 15368 value: hexlify(bytes) 15369 }); 15370 return { 15371 url: null, 15372 linkage 15373 }; 15374 } 15375 return { 15376 url: null, 15377 linkage 15378 }; 15379 } 15380 if (!metadata) { 15381 linkage.push({ 15382 type: "!metadata", 15383 value: "" 15384 }); 15385 return { 15386 url: null, 15387 linkage 15388 }; 15389 } 15390 linkage.push({ 15391 type: "metadata", 15392 value: JSON.stringify(metadata) 15393 }); 15394 let imageUrl = metadata.image; 15395 if (typeof imageUrl !== "string") { 15396 linkage.push({ 15397 type: "!imageUrl", 15398 value: "" 15399 }); 15400 return { 15401 url: null, 15402 linkage 15403 }; 15404 } 15405 if (imageUrl.match(/^(https:\/\/|data:)/i)) {} else { 15406 if (imageUrl.match(matcherIpfs) == null) { 15407 linkage.push({ 15408 type: "!imageUrl-ipfs", 15409 value: imageUrl 15410 }); 15411 return { 15412 url: null, 15413 linkage 15414 }; 15415 } 15416 linkage.push({ 15417 type: "imageUrl-ipfs", 15418 value: imageUrl 15419 }); 15420 imageUrl = getIpfsLink(imageUrl); 15421 } 15422 linkage.push({ 15423 type: "url", 15424 value: imageUrl 15425 }); 15426 return { 15427 linkage, 15428 url: imageUrl 15429 }; 15430 } 15431 } 15432 } 15433 } catch (error) {} 15434 return { 15435 linkage, 15436 url: null 15437 }; 15438 } 15439 static async getEnsAddress(provider) { 15440 const network = await provider.getNetwork(); 15441 const ensPlugin = network.getPlugin("org.ethers.plugins.network.Ens"); 15442 assert(ensPlugin, "network does not support ENS", "UNSUPPORTED_OPERATION", { 15443 operation: "getEnsAddress", 15444 info: { network } 15445 }); 15446 return ensPlugin.address; 15447 } 15448 static async getUniversalResolverAddress(provider) { 15449 const ensPlugin = (await provider.getNetwork()).getPlugin("org.ethers.plugins.network.Ens"); 15450 if (ensPlugin && ensPlugin.universalResolver) return ensPlugin.universalResolver; 15451 return null; 15452 } 15453 static async #getResolver(provider, name) {
15454 const ensAddr = await EnsResolver.getEnsAddress(provider); 15455 try { 15456 const addr = await new Contract(ensAddr, ["function resolver(bytes32) view returns (address)"], provider).resolver(namehash(name), { enableCcipRead: true }); 15457 if (addr === "0x0000000000000000000000000000000000000000") return null; 15458 return addr; 15459 } catch (error) { 15460 throw error; 15461 } 15462 } 15463 static async lookupAddress(provider, address, _coinType) { 15464 const coinType = _coinType == null ? BN_60 : getBigInt(_coinType); 15465 if (isEvmCoinType(coinType)) address = getAddress(address); 15466 const universal = await createUniversal(provider); 15467 if (universal) try { 15468 const addr = (await universal.reverse(address, coinType, { enableCcipRead: true })).primary; 15469 if (!isValidName(addr)) return null; 15470 return addr; 15471 } catch (e) { 15472 if (isError(e, "CALL_EXCEPTION") && e.reason === "ResolverNotFound(bytes)") return null; 15473 throw e; 15474 } 15475 assert(coinType === BN_60, "lookupAddress coinType requires ENS Universal Resolver", "UNSUPPORTED_OPERATION", { operation: "lookupAddress" }); 15476 try { 15477 const resolver = await EnsResolver.fromName(provider, `${address.toLowerCase().substring(2)}.addr.reverse`); 15478 if (!resolver) return null; 15479 const name = await resolver.getName(); 15480 if (name == null || !isValidName(name)) return null; 15481 if (await provider.resolveName(name) !== address) return null; 15482 return name; 15483 } catch (error) { 15484 if (isError(error, "BAD_DATA") && error.value === "0x") return null; 15485 if (isError(error, "CALL_EXCEPTION")) return null; 15486 throw error; 15487 } 15488 } 15489 /** 15490 * Resolve to the ENS resolver for %%name%% using %%provider%% or 15491 * ``null`` if unconfigured. 15492 */ 15493 static async fromName(provider, name) { 15494 const universal = await createUniversal(provider); 15495 if (universal) { 15496 let dnsName; 15497 try { 15498 dnsName = dnsEncode(ensNormalize(name), 255); 15499 } catch (error) { 15500 return null; 15501 } 15502 const result = await universal.requireResolver(dnsName); 15503 return new EnsResolver(provider, result.resolver, name, result.extended); 15504 } 15505 let currentName = name; 15506 while (true) { 15507 if (currentName === "" || currentName === ".") return null; 15508 if (name !== "eth" && currentName === "eth") return null; 15509 const addr = await EnsResolver.#getResolver(provider, currentName); 15510 if (addr != null) { 15511 const resolver = new EnsResolver(provider, addr, name); 15512 if (currentName !== name && !await resolver.supportsWildcard()) return null; 15513 return resolver; 15514 } 15515 currentName = currentName.split(".").slice(1).join("."); 15516 } 15517 } 15518}; 15519async function createUniversal(provider) { 15520 const address = await EnsResolver.getUniversalResolverAddress(provider); 15521 if (!address) return null; 15522 return new Contract(address, [ 15523 "function requireResolver(bytes) view returns ((bytes name, uint256 offset, bytes32 node, address resolver, bool extended))", 15524 "function findResolver(bytes) view returns (address resolver, bytes32 node, uint offset)", 15525 "function resolve(bytes name, bytes data) view returns (bytes result, address resolver)", 15526 "function reverse(bytes name, uint coinType) view returns (string primary, address resolver, address reverseResolver)", 15527 "error ResolverNotFound(bytes name)", 15528 "error ResolverNotContract(bytes name, address resolver)", 15529 "error ReverseAddressMismatch(string primary, bytes primaryAddress)", 15530 "error HttpError(uint16 statusCode, string statusMessage)" 15531 ], provider); 15532} 15533//#endregion 15534//#region node_modules/ethers/lib.esm/providers/format.js 15535/** 15536* @_ignore 15537*/ 15538var BN_0 = BigInt(0); 15539function allowNull(format, nullValue) { 15540 return (function(value) { 15541 if (value == null) return nullValue; 15542 return format(value); 15543 }); 15544} 15545function arrayOf(format, allowNull) { 15546 return ((array) => { 15547 if (allowNull && array == null) return null; 15548 if (!Array.isArray(array)) throw new Error("not an array"); 15549 return array.map((i) => format(i)); 15550 }); 15551} 15552function object(format, altNames) { 15553 return ((value) => { 15554 const result = {}; 15555 for (const key in format) { 15556 let srcKey = key; 15557 if (altNames && key in altNames && !(srcKey in value)) { 15558 for (const altKey of altNames[key]) if (altKey in value) { 15559 srcKey = altKey; 15560 break; 15561 } 15562 } 15563 try { 15564 const nv = format[key](value[srcKey]); 15565 if (nv !== void 0) result[key] = nv; 15566 } catch (error) { 15567 assert(false, `invalid value for value.${key} (${error instanceof Error ? error.message : "not-an-error"})`, "BAD_DATA", { value }); 15568 } 15569 } 15570 return result; 15571 }); 15572} 15573function formatBoolean(value) { 15574 switch (value) { 15575 case true: 15576 case "true": return true; 15577 case false: 15578 case "false": return false;
15579 } 15580 assertArgument(false, `invalid boolean; ${JSON.stringify(value)}`, "value", value); 15581} 15582function formatData(value) { 15583 assertArgument(isHexString(value, true), "invalid data", "value", value); 15584 return value; 15585} 15586function formatHash(value) { 15587 assertArgument(isHexString(value, 32), "invalid hash", "value", value); 15588 return value; 15589} 15590var _formatLog = object({ 15591 address: getAddress, 15592 blockHash: formatHash, 15593 blockNumber: getNumber, 15594 data: formatData, 15595 index: getNumber, 15596 removed: allowNull(formatBoolean, false), 15597 topics: arrayOf(formatHash), 15598 transactionHash: formatHash, 15599 transactionIndex: getNumber 15600}, { index: ["logIndex"] }); 15601function formatLog(value) { 15602 return _formatLog(value); 15603} 15604var _formatBlock = object({ 15605 hash: allowNull(formatHash), 15606 parentHash: formatHash, 15607 parentBeaconBlockRoot: allowNull(formatHash, null), 15608 number: getNumber, 15609 timestamp: getNumber, 15610 nonce: allowNull(formatData), 15611 difficulty: getBigInt, 15612 gasLimit: getBigInt, 15613 gasUsed: getBigInt, 15614 stateRoot: allowNull(formatHash, null), 15615 receiptsRoot: allowNull(formatHash, null), 15616 transactionsRoot: allowNull(formatHash, null), 15617 blobGasUsed: allowNull(getBigInt, null), 15618 excessBlobGas: allowNull(getBigInt, null), 15619 miner: allowNull(getAddress), 15620 prevRandao: allowNull(formatHash, null), 15621 extraData: formatData, 15622 baseFeePerGas: allowNull(getBigInt) 15623}, { prevRandao: ["mixHash"] }); 15624function formatBlock(value) { 15625 const result = _formatBlock(value); 15626 result.transactions = value.transactions.map((tx) => { 15627 if (typeof tx === "string") return tx; 15628 return formatTransactionResponse(tx); 15629 }); 15630 return result; 15631} 15632var _formatReceiptLog = object({ 15633 transactionIndex: getNumber, 15634 blockNumber: getNumber, 15635 transactionHash: formatHash, 15636 address: getAddress, 15637 topics: arrayOf(formatHash), 15638 data: formatData, 15639 index: getNumber, 15640 blockHash: formatHash 15641}, { index: ["logIndex"] }); 15642function formatReceiptLog(value) { 15643 return _formatReceiptLog(value); 15644} 15645var _formatTransactionReceipt = object({ 15646 to: allowNull(getAddress, null), 15647 from: allowNull(getAddress, null), 15648 contractAddress: allowNull(getAddress, null), 15649 index: getNumber, 15650 root: allowNull(hexlify), 15651 gasUsed: getBigInt, 15652 blobGasUsed: allowNull(getBigInt, null), 15653 logsBloom: allowNull(formatData), 15654 blockHash: formatHash, 15655 hash: formatHash, 15656 logs: arrayOf(formatReceiptLog), 15657 blockNumber: getNumber, 15658 cumulativeGasUsed: getBigInt, 15659 effectiveGasPrice: allowNull(getBigInt), 15660 blobGasPrice: allowNull(getBigInt, null), 15661 status: allowNull(getNumber), 15662 type: allowNull(getNumber, 0) 15663}, { 15664 effectiveGasPrice: ["gasPrice"], 15665 hash: ["transactionHash"], 15666 index: ["transactionIndex"] 15667}); 15668function formatTransactionReceipt(value) { 15669 return _formatTransactionReceipt(value); 15670} 15671function formatTransactionResponse(value) { 15672 if (value.to && getBigInt(value.to) === BN_0) value.to = "0x0000000000000000000000000000000000000000"; 15673 const result = object({ 15674 hash: formatHash, 15675 index: allowNull(getNumber, void 0), 15676 type: (value) => { 15677 if (value === "0x" || value == null) return 0; 15678 return getNumber(value); 15679 }, 15680 accessList: allowNull(accessListify, null), 15681 blobVersionedHashes: allowNull(arrayOf(formatHash, true), null), 15682 authorizationList: allowNull(arrayOf((v) => { 15683 let sig; 15684 if (v.signature) sig = v.signature; 15685 else { 15686 let yParity = v.yParity; 15687 if (yParity === "0x1b") yParity = 0; 15688 else if (yParity === "0x1c") yParity = 1; 15689 sig = Object.assign({}, v, { yParity }); 15690 } 15691 return { 15692 address: getAddress(v.address), 15693 chainId: getBigInt(v.chainId), 15694 nonce: getBigInt(v.nonce), 15695 signature: Signature.from(sig) 15696 }; 15697 }, false), null), 15698 blockHash: allowNull(formatHash, null), 15699 blockNumber: allowNull(getNumber, null), 15700 transactionIndex: allowNull(getNumber, null), 15701 from: getAddress, 15702 gasPrice: allowNull(getBigInt), 15703 maxPriorityFeePerGas: allowNull(getBigInt), 15704 maxFeePerGas: allowNull(getBigInt), 15705 maxFeePerBlobGas: allowNull(getBigInt, null), 15706 gasLimit: getBigInt, 15707 to: allowNull(getAddress, null), 15708 value: getBigInt, 15709 nonce: getNumber, 15710 data: formatData, 15711 creates: allowNull(getAddress, null), 15712 chainId: allowNull(getBigInt, null) 15713 }, { 15714 data: ["input"], 15715 gasLimit: ["gas"], 15716 index: ["transactionIndex"] 15717 })(value); 15718 if (result.to == null && result.creates == null) result.creates = getCreateAddress(result); 15719 if ((value.type === 1 || value.type === 2) && value.accessList == null) result.accessList = []; 15720 if (value.signature) result.signature = Signature.from(value.signature); 15721 else result.signature = Signature.from(value); 15722 if (result.chainId == null) { 15723 const chainId = result.signature.legacyChainId; 15724 if (chainId != null) result.chainId = chainId; 15725 } 15726 if (result.blockHash && getBigInt(result.blockHash) === BN_0) result.blockHash = null; 15727 return result; 15728} 15729//#endregion 15730//#region node_modules/ethers/lib.esm/providers/plugins-network.js 15731var EnsAddress = "0x00000000000C2E074eC69A0dFb2997BA6C7d2e1e"; 15732var inspect$1 = Symbol.for("nodejs.util.inspect.custom"); 15733/** 15734* A **NetworkPlugin** provides additional functionality on a [[Network]]. 15735*/ 15736var NetworkPlugin = class NetworkPlugin { 15737 /** 15738 * The name of the plugin. 15739 * 15740 * It is recommended to use reverse-domain-notation, which permits 15741 * unique names with a known authority as well as hierarchal entries. 15742 */ 15743 name; 15744 /**
15745 * Creates a new **NetworkPlugin**. 15746 */ 15747 constructor(name) { 15748 defineProperties(this, { name }); 15749 } 15750 [inspect$1]() { 15751 return this.toString(); 15752 } 15753 toString() { 15754 return `${this.name} { }`; 15755 } 15756 /** 15757 * Creates a copy of this plugin. 15758 */ 15759 clone() { 15760 return new NetworkPlugin(this.name); 15761 } 15762}; 15763/** 15764* A **GasCostPlugin** allows a network to provide alternative values when 15765* computing the intrinsic gas required for a transaction. 15766*/ 15767var GasCostPlugin = class GasCostPlugin extends NetworkPlugin { 15768 /** 15769 * The block number to treat these values as valid from. 15770 * 15771 * This allows a hardfork to have updated values included as well as 15772 * mulutiple hardforks to be supported. 15773 */ 15774 effectiveBlock; 15775 /** 15776 * The transactions base fee. 15777 */ 15778 txBase; 15779 /** 15780 * The fee for creating a new account. 15781 */ 15782 txCreate; 15783 /** 15784 * The fee per zero-byte in the data. 15785 */ 15786 txDataZero; 15787 /** 15788 * The fee per non-zero-byte in the data. 15789 */ 15790 txDataNonzero; 15791 /** 15792 * The fee per storage key in the [[link-eip-2930]] access list. 15793 */ 15794 txAccessListStorageKey; 15795 /** 15796 * The fee per address in the [[link-eip-2930]] access list. 15797 */ 15798 txAccessListAddress; 15799 /** 15800 * Creates a new GasCostPlugin from %%effectiveBlock%% until the 15801 * latest block or another GasCostPlugin supercedes that block number, 15802 * with the associated %%costs%%. 15803 */ 15804 constructor(effectiveBlock, costs) { 15805 if (effectiveBlock == null) effectiveBlock = 0; 15806 super(`org.ethers.network.plugins.GasCost#${effectiveBlock || 0}`); 15807 const props = { effectiveBlock }; 15808 function set(name, nullish) { 15809 let value = (costs || {})[name]; 15810 if (value == null) value = nullish; 15811 assertArgument(typeof value === "number", `invalud value for ${name}`, "costs", costs); 15812 props[name] = value; 15813 } 15814 set("txBase", 21e3); 15815 set("txCreate", 32e3); 15816 set("txDataZero", 4); 15817 set("txDataNonzero", 16); 15818 set("txAccessListStorageKey", 1900); 15819 set("txAccessListAddress", 2400); 15820 defineProperties(this, props); 15821 } 15822 toString() { 15823 return `${this.name} { txBase: ${this.txBase}, txCreate: ${this.txCreate}, txDataZero: ${this.txDataZero}, txAccessListStorageKey: ${this.txAccessListStorageKey}, txAccessListAddress: ${this.txAccessListAddress} }`; 15824 } 15825 clone() { 15826 return new GasCostPlugin(this.effectiveBlock, this); 15827 } 15828}; 15829/** 15830* An **EnsPlugin** allows a [[Network]] to specify the ENS Registry 15831* Contract address and the target network to use when using that 15832* contract. 15833* 15834* Various testnets have their own instance of the contract to use, but 15835* in general, the mainnet instance supports multi-chain addresses and 15836* should be used. 15837*/ 15838var EnsPlugin = class EnsPlugin extends NetworkPlugin { 15839 /** 15840 * The ENS Registrty Contract address. 15841 */ 15842 address; 15843 /** 15844 * The chain ID that the ENS contract lives on. 15845 */ 15846 targetNetwork; 15847 /** 15848 * The Universal Resolver Contract Address. 15849 */ 15850 universalResolver; 15851 /** 15852 * Creates a new **EnsPlugin** connected to %%address%% on the 15853 * %%targetNetwork%%. The default ENS address and mainnet is used 15854 * if unspecified. 15855 */ 15856 constructor(address, targetNetwork, universalResolver) { 15857 super("org.ethers.plugins.network.Ens"); 15858 defineProperties(this, { 15859 address: address || EnsAddress, 15860 targetNetwork: targetNetwork == null ? 1 : targetNetwork, 15861 universalResolver 15862 }); 15863 } 15864 toString() { 15865 return `${this.name} { address: ${this.address}, targetNetwork: ${this.targetNetwork}, universalResolver: ${this.universalResolver} }`; 15866 } 15867 clone() { 15868 return new EnsPlugin(this.address, this.targetNetwork, this.universalResolver); 15869 } 15870}; 15871/** 15872* A **FeeDataNetworkPlugin** allows a network to provide and alternate 15873* means to specify its fee data. 15874* 15875* For example, a network which does not support [[link-eip-1559]] may 15876* choose to use a Gas Station site to approximate the gas price. 15877*/ 15878var FeeDataNetworkPlugin = class FeeDataNetworkPlugin extends NetworkPlugin { 15879 #feeDataFunc; 15880 /** 15881 * The fee data function provided to the constructor. 15882 */ 15883 get feeDataFunc() { 15884 return this.#feeDataFunc; 15885 } 15886 /** 15887 * Creates a new **FeeDataNetworkPlugin**. 15888 */ 15889 constructor(feeDataFunc) { 15890 super("org.ethers.plugins.network.FeeData"); 15891 this.#feeDataFunc = feeDataFunc; 15892 } 15893 /** 15894 * Resolves to the fee data. 15895 */ 15896 async getFeeData(provider) { 15897 return await this.#feeDataFunc(provider); 15898 } 15899 clone() { 15900 return new FeeDataNetworkPlugin(this.#feeDataFunc); 15901 } 15902}; 15903var FetchUrlFeeDataNetworkPlugin = class extends NetworkPlugin { 15904 #url;
15905 #processFunc; 15906 /** 15907 * The URL to initialize the FetchRequest with in %%processFunc%%. 15908 */ 15909 get url() { 15910 return this.#url; 15911 } 15912 /** 15913 * The callback to use when computing the FeeData. 15914 */ 15915 get processFunc() { 15916 return this.#processFunc; 15917 } 15918 /** 15919 * Creates a new **FetchUrlFeeDataNetworkPlugin** which will 15920 * be used when computing the fee data for the network. 15921 */ 15922 constructor(url, processFunc) { 15923 super("org.ethers.plugins.network.FetchUrlFeeDataPlugin"); 15924 this.#url = url; 15925 this.#processFunc = processFunc; 15926 } 15927 toString() { 15928 return `${this.name} { url: ${this.url} }`; 15929 } 15930 clone() { 15931 return this; 15932 } 15933}; 15934//#endregion 15935//#region node_modules/ethers/lib.esm/providers/network.js 15936/** 15937* A **Network** encapsulates the various properties required to 15938* interact with a specific chain. 15939* 15940* @_subsection: api/providers:Networks [networks] 15941*/ 15942var inspect = Symbol.for("nodejs.util.inspect.custom"); 15943var Networks = /* @__PURE__ */ new Map(); 15944/** 15945* A **Network** provides access to a chain's properties and allows 15946* for plug-ins to extend functionality. 15947*/ 15948var Network = class Network { 15949 #name; 15950 #chainId; 15951 #plugins; 15952 /** 15953 * Creates a new **Network** for %%name%% and %%chainId%%. 15954 */ 15955 constructor(name, chainId) { 15956 this.#name = name; 15957 this.#chainId = getBigInt(chainId); 15958 this.#plugins = /* @__PURE__ */ new Map(); 15959 } 15960 [inspect]() { 15961 return this.toString(); 15962 } 15963 toString() { 15964 const plugins = []; 15965 for (const plugin of this.#plugins.values()) plugins.push(plugin.toString()); 15966 return `Network { name: ${this.name}, chainId: ${this.chainId}, plugins: [ ${plugins.join(", ")} ] }`; 15967 } 15968 /** 15969 * Returns a JSON-compatible representation of a Network. 15970 */ 15971 toJSON() { 15972 return { 15973 name: this.name, 15974 chainId: String(this.chainId) 15975 }; 15976 } 15977 /** 15978 * The network common name. 15979 * 15980 * This is the canonical name, as networks migh have multiple 15981 * names. 15982 */ 15983 get name() { 15984 return this.#name; 15985 } 15986 set name(value) { 15987 this.#name = value; 15988 } 15989 /** 15990 * The network chain ID. 15991 */ 15992 get chainId() { 15993 return this.#chainId; 15994 } 15995 set chainId(value) { 15996 this.#chainId = getBigInt(value, "chainId"); 15997 } 15998 /** 15999 * Returns true if %%other%% matches this network. Any chain ID 16000 * must match, and if no chain ID is present, the name must match. 16001 * 16002 * This method does not currently check for additional properties, 16003 * such as ENS address or plug-in compatibility. 16004 */ 16005 matches(other) { 16006 if (other == null) return false; 16007 if (typeof other === "string") { 16008 try { 16009 return this.chainId === getBigInt(other); 16010 } catch (error) {} 16011 return this.name === other; 16012 } 16013 if (typeof other === "number" || typeof other === "bigint") { 16014 try { 16015 return this.chainId === getBigInt(other); 16016 } catch (error) {} 16017 return false; 16018 } 16019 if (typeof other === "object") { 16020 if (other.chainId != null) { 16021 try { 16022 return this.chainId === getBigInt(other.chainId); 16023 } catch (error) {} 16024 return false; 16025 } 16026 if (other.name != null) return this.name === other.name; 16027 return false; 16028 } 16029 return false; 16030 } 16031 /** 16032 * Returns the list of plugins currently attached to this Network. 16033 */ 16034 get plugins() { 16035 return Array.from(this.#plugins.values()); 16036 } 16037 /** 16038 * Attach a new %%plugin%% to this Network. The network name 16039 * must be unique, excluding any fragment. 16040 */ 16041 attachPlugin(plugin) { 16042 if (this.#plugins.get(plugin.name)) throw new Error(`cannot replace existing plugin: ${plugin.name} `); 16043 this.#plugins.set(plugin.name, plugin.clone()); 16044 return this; 16045 } 16046 /** 16047 * Return the plugin, if any, matching %%name%% exactly. Plugins 16048 * with fragments will not be returned unless %%name%% includes 16049 * a fragment. 16050 */ 16051 getPlugin(name) { 16052 return this.#plugins.get(name) || null; 16053 } 16054 /** 16055 * Gets a list of all plugins that match %%name%%, with otr without 16056 * a fragment. 16057 */ 16058 getPlugins(basename) { 16059 return this.plugins.filter((p) => p.name.split("#")[0] === basename); 16060 } 16061 /** 16062 * Create a copy of this Network. 16063 */ 16064 clone() { 16065 const clone = new Network(this.name, this.chainId); 16066 this.plugins.forEach((plugin) => { 16067 clone.attachPlugin(plugin.clone()); 16068 }); 16069 return clone; 16070 } 16071 /** 16072 * Compute the intrinsic gas required for a transaction. 16073 * 16074 * A GasCostPlugin can be attached to override the default 16075 * values. 16076 */ 16077 computeIntrinsicGas(tx) { 16078 const costs = this.getPlugin("org.ethers.plugins.network.GasCost") || new GasCostPlugin(); 16079 let gas = costs.txBase; 16080 if (tx.to == null) gas += costs.txCreate; 16081 if (tx.data) for (let i = 2; i < tx.data.length; i += 2) if (tx.data.substring(i, i + 2) === "00") gas += costs.txDataZero; 16082 else gas += costs.txDataNonzero; 16083 if (tx.accessList) { 16084 const accessList = accessListify(tx.accessList); 16085 for (const addr in accessList) gas += costs.txAccessListAddress + costs.txAccessListStorageKey * accessList[addr].storageKeys.length; 16086 } 16087 return gas; 16088 } 16089 /** 16090 * Returns a new Network for the %%network%% name or chainId. 16091 */ 16092 static from(network) { 16093 injectCommonNetworks(); 16094 if (network == null) return Network.from("mainnet"); 16095 if (typeof network === "number") network = BigInt(network); 16096 if (typeof network === "string" || typeof network === "bigint") { 16097 const networkFunc = Networks.get(network); 16098 if (networkFunc) return networkFunc(); 16099 if (typeof network === "bigint") return new Network("unknown", network); 16100 assertArgument(false, "unknown network", "network", network); 16101 } 16102 if (typeof network.clone === "function") return network.clone(); 16103 if (typeof network === "object") { 16104 assertArgument(typeof network.name === "string" && typeof network.chainId === "number", "invalid network object name or chainId", "network", network); 16105 const custom = new Network(network.name, network.chainId); 16106 const n = network; 16107 if (n.ensAddress || n.ensNetwork != null || n.ensUniversalResolver) custom.attachPlugin(new EnsPlugin(n.ensAddress, n.ensNetwork, n.ensUniversalResolver)); 16108 return custom; 16109 } 16110 assertArgument(false, "invalid network", "network", network); 16111 } 16112 /** 16113 * Register %%nameOrChainId%% with a function which returns 16114 * an instance of a Network representing that chain. 16115 */ 16116 static register(nameOrChainId, networkFunc) { 16117 if (typeof nameOrChainId === "number") nameOrChainId = BigInt(nameOrChainId); 16118 const existing = Networks.get(nameOrChainId); 16119 if (existing) assertArgument(false, `conflicting network for ${JSON.stringify(existing.name)}`, "nameOrChainId", nameOrChainId); 16120 Networks.set(nameOrChainId, networkFunc); 16121 } 16122}; 16123function parseUnits$1(_value, decimals) {
16124 const value = String(_value); 16125 if (!value.match(/^[0-9.]+$/)) throw new Error(`invalid gwei value: ${_value}`); 16126 const comps = value.split("."); 16127 if (comps.length === 1) comps.push(""); 16128 if (comps.length !== 2) throw new Error(`invalid gwei value: ${_value}`); 16129 while (comps[1].length < decimals) comps[1] += "0"; 16130 if (comps[1].length > 9) { 16131 let frac = BigInt(comps[1].substring(0, 9)); 16132 if (!comps[1].substring(9).match(/^0+$/)) frac++; 16133 comps[1] = frac.toString(); 16134 } 16135 return BigInt(comps[0] + comps[1]); 16136} 16137function getGasStationPlugin(url) { 16138 return new FetchUrlFeeDataNetworkPlugin(url, async (fetchFeeData, provider, request) => { 16139 request.setHeader("User-Agent", "ethers"); 16140 let response; 16141 try { 16142 const [_response, _feeData] = await Promise.all([request.send(), fetchFeeData()]); 16143 response = _response; 16144 const payload = response.bodyJson.standard; 16145 return { 16146 gasPrice: _feeData.gasPrice, 16147 maxFeePerGas: parseUnits$1(payload.maxFee, 9), 16148 maxPriorityFeePerGas: parseUnits$1(payload.maxPriorityFee, 9) 16149 }; 16150 } catch (error) { 16151 assert(false, `error encountered with polygon gas station (${JSON.stringify(request.url)})`, "SERVER_ERROR", { 16152 request, 16153 response, 16154 error 16155 }); 16156 } 16157 }); 16158} 16159var injected = false; 16160function injectCommonNetworks() { 16161 if (injected) return; 16162 injected = true; 16163 function registerEth(name, chainId, options) { 16164 const func = function() { 16165 const network = new Network(name, chainId); 16166 if (options.ensNetwork != null) network.attachPlugin(new EnsPlugin(null, options.ensNetwork, options.ensUniversalResolver)); 16167 network.attachPlugin(new GasCostPlugin()); 16168 (options.plugins || []).forEach((plugin) => { 16169 network.attachPlugin(plugin); 16170 }); 16171 return network; 16172 }; 16173 Network.register(name, func); 16174 Network.register(chainId, func); 16175 if (options.altNames) options.altNames.forEach((name) => { 16176 Network.register(name, func); 16177 }); 16178 } 16179 const ensUniversalResolver = "0xeEeEEEeE14D718C2B47D9923Deab1335E144EeEe"; 16180 registerEth("mainnet", 1, { 16181 ensUniversalResolver, 16182 ensNetwork: 1, 16183 altNames: ["homestead"] 16184 }); 16185 registerEth("ropsten", 3, { ensNetwork: 3 }); 16186 registerEth("rinkeby", 4, { ensNetwork: 4 }); 16187 registerEth("goerli", 5, { ensNetwork: 5 }); 16188 registerEth("kovan", 42, { ensNetwork: 42 }); 16189 registerEth("sepolia", 11155111, { 16190 ensUniversalResolver, 16191 ensNetwork: 11155111 16192 }); 16193 registerEth("holesky", 17e3, { ensNetwork: 17e3 }); 16194 registerEth("classic", 61, {});
16195 registerEth("classicKotti", 6, {}); 16196 registerEth("arbitrum", 42161, { ensNetwork: 1 }); 16197 registerEth("arbitrum-goerli", 421613, {}); 16198 registerEth("arbitrum-sepolia", 421614, {}); 16199 registerEth("base", 8453, { ensNetwork: 1 }); 16200 registerEth("base-goerli", 84531, {}); 16201 registerEth("base-sepolia", 84532, {}); 16202 registerEth("bnb", 56, { ensNetwork: 1 }); 16203 registerEth("bnbt", 97, {}); 16204 registerEth("filecoin", 314, {}); 16205 registerEth("filecoin-calibration", 314159, {}); 16206 registerEth("linea", 59144, { ensNetwork: 1 }); 16207 registerEth("linea-goerli", 59140, {}); 16208 registerEth("linea-sepolia", 59141, {}); 16209 registerEth("matic", 137, { 16210 ensNetwork: 1, 16211 plugins: [getGasStationPlugin("https://gasstation.polygon.technology/v2")] 16212 }); 16213 registerEth("matic-amoy", 80002, {}); 16214 registerEth("matic-mumbai", 80001, { 16215 altNames: ["maticMumbai", "maticmum"], 16216 plugins: [getGasStationPlugin("https://gasstation-testnet.polygon.technology/v2")] 16217 }); 16218 registerEth("optimism", 10, { 16219 ensNetwork: 1, 16220 plugins: [] 16221 }); 16222 registerEth("optimism-goerli", 420, {}); 16223 registerEth("optimism-sepolia", 11155420, {}); 16224 registerEth("xdai", 100, { ensNetwork: 1 }); 16225} 16226//#endregion 16227//#region node_modules/ethers/lib.esm/providers/subscriber-polling.js 16228function copy$2(obj) { 16229 return JSON.parse(JSON.stringify(obj)); 16230} 16231/** 16232* A **PollingBlockSubscriber** polls at a regular interval for a change 16233* in the block number. 16234* 16235* @_docloc: api/providers/abstract-provider 16236*/ 16237var PollingBlockSubscriber = class { 16238 #provider; 16239 #poller; 16240 #interval; 16241 #blockNumber; 16242 /** 16243 * Create a new **PollingBlockSubscriber** attached to %%provider%%. 16244 */ 16245 constructor(provider) { 16246 this.#provider = provider; 16247 this.#poller = null; 16248 this.#interval = 4e3; 16249 this.#blockNumber = -2; 16250 } 16251 /** 16252 * The polling interval. 16253 */ 16254 get pollingInterval() { 16255 return this.#interval; 16256 } 16257 set pollingInterval(value) { 16258 this.#interval = value; 16259 } 16260 async #poll() { 16261 try { 16262 const blockNumber = await this.#provider.getBlockNumber(); 16263 if (this.#blockNumber === -2) { 16264 this.#blockNumber = blockNumber; 16265 return; 16266 } 16267 if (blockNumber !== this.#blockNumber) { 16268 for (let b = this.#blockNumber + 1; b <= blockNumber; b++) { 16269 if (this.#poller == null) return; 16270 await this.#provider.emit("block", b); 16271 } 16272 this.#blockNumber = blockNumber; 16273 } 16274 } catch (error) {} 16275 if (this.#poller == null) return; 16276 this.#poller = this.#provider._setTimeout(this.#poll.bind(this), this.#interval); 16277 } 16278 start() { 16279 if (this.#poller) return; 16280 this.#poller = this.#provider._setTimeout(this.#poll.bind(this), this.#interval); 16281 this.#poll(); 16282 } 16283 stop() { 16284 if (!this.#poller) return; 16285 this.#provider._clearTimeout(this.#poller); 16286 this.#poller = null; 16287 } 16288 pause(dropWhilePaused) { 16289 this.stop(); 16290 if (dropWhilePaused) this.#blockNumber = -2; 16291 } 16292 resume() { 16293 this.start(); 16294 } 16295}; 16296/** 16297* An **OnBlockSubscriber** can be sub-classed, with a [[_poll]] 16298* implmentation which will be called on every new block. 16299* 16300* @_docloc: api/providers/abstract-provider 16301*/ 16302var OnBlockSubscriber = class { 16303 #provider; 16304 #poll; 16305 #running; 16306 /** 16307 * Create a new **OnBlockSubscriber** attached to %%provider%%. 16308 */ 16309 constructor(provider) { 16310 this.#provider = provider; 16311 this.#running = false; 16312 this.#poll = (blockNumber) => { 16313 this._poll(blockNumber, this.#provider); 16314 }; 16315 } 16316 /** 16317 * Called on every new block. 16318 */ 16319 async _poll(blockNumber, provider) { 16320 throw new Error("sub-classes must override this"); 16321 } 16322 start() { 16323 if (this.#running) return; 16324 this.#running = true; 16325 this.#poll(-2); 16326 this.#provider.on("block", this.#poll); 16327 } 16328 stop() { 16329 if (!this.#running) return; 16330 this.#running = false; 16331 this.#provider.off("block", this.#poll); 16332 } 16333 pause(dropWhilePaused) { 16334 this.stop(); 16335 } 16336 resume() { 16337 this.start(); 16338 } 16339}; 16340var PollingBlockTagSubscriber = class extends OnBlockSubscriber { 16341 #tag; 16342 #lastBlock; 16343 constructor(provider, tag) { 16344 super(provider); 16345 this.#tag = tag; 16346 this.#lastBlock = -2; 16347 } 16348 pause(dropWhilePaused) { 16349 if (dropWhilePaused) this.#lastBlock = -2; 16350 super.pause(dropWhilePaused); 16351 } 16352 async _poll(blockNumber, provider) { 16353 const block = await provider.getBlock(this.#tag); 16354 if (block == null) return; 16355 if (this.#lastBlock === -2) this.#lastBlock = block.number; 16356 else if (block.number > this.#lastBlock) { 16357 provider.emit(this.#tag, block.number); 16358 this.#lastBlock = block.number; 16359 } 16360 } 16361}; 16362/** 16363* @_ignore: 16364* 16365* @_docloc: api/providers/abstract-provider 16366*/ 16367var PollingOrphanSubscriber = class extends OnBlockSubscriber { 16368 #filter;
16369 constructor(provider, filter) { 16370 super(provider); 16371 this.#filter = copy$2(filter); 16372 } 16373 async _poll(blockNumber, provider) { 16374 throw new Error("@TODO"); 16375 } 16376}; 16377/** 16378* A **PollingTransactionSubscriber** will poll for a given transaction 16379* hash for its receipt. 16380* 16381* @_docloc: api/providers/abstract-provider 16382*/ 16383var PollingTransactionSubscriber = class extends OnBlockSubscriber { 16384 #hash; 16385 /** 16386 * Create a new **PollingTransactionSubscriber** attached to 16387 * %%provider%%, listening for %%hash%%. 16388 */ 16389 constructor(provider, hash) { 16390 super(provider); 16391 this.#hash = hash; 16392 } 16393 async _poll(blockNumber, provider) { 16394 const tx = await provider.getTransactionReceipt(this.#hash); 16395 if (tx) provider.emit(this.#hash, tx); 16396 } 16397}; 16398/** 16399* A **PollingEventSubscriber** will poll for a given filter for its logs. 16400* 16401* @_docloc: api/providers/abstract-provider 16402*/ 16403var PollingEventSubscriber = class { 16404 #provider; 16405 #filter; 16406 #poller; 16407 #running; 16408 #blockNumber; 16409 /** 16410 * Create a new **PollingTransactionSubscriber** attached to 16411 * %%provider%%, listening for %%filter%%. 16412 */ 16413 constructor(provider, filter) { 16414 this.#provider = provider; 16415 this.#filter = copy$2(filter); 16416 this.#poller = this.#poll.bind(this); 16417 this.#running = false; 16418 this.#blockNumber = -2; 16419 } 16420 async #poll(blockNumber) { 16421 if (this.#blockNumber === -2) return; 16422 const filter = copy$2(this.#filter); 16423 filter.fromBlock = this.#blockNumber + 1; 16424 filter.toBlock = blockNumber; 16425 const logs = await this.#provider.getLogs(filter); 16426 if (logs.length === 0) { 16427 if (this.#blockNumber < blockNumber - 60) this.#blockNumber = blockNumber - 60; 16428 return; 16429 } 16430 for (const log of logs) { 16431 this.#provider.emit(this.#filter, log); 16432 this.#blockNumber = log.blockNumber; 16433 } 16434 } 16435 start() { 16436 if (this.#running) return; 16437 this.#running = true; 16438 if (this.#blockNumber === -2) this.#provider.getBlockNumber().then((blockNumber) => { 16439 this.#blockNumber = blockNumber; 16440 }); 16441 this.#provider.on("block", this.#poller); 16442 } 16443 stop() { 16444 if (!this.#running) return; 16445 this.#running = false; 16446 this.#provider.off("block", this.#poller); 16447 } 16448 pause(dropWhilePaused) { 16449 this.stop(); 16450 if (dropWhilePaused) this.#blockNumber = -2; 16451 } 16452 resume() { 16453 this.start(); 16454 } 16455}; 16456//#endregion 16457//#region node_modules/ethers/lib.esm/providers/abstract-provider.js 16458/** 16459* The available providers should suffice for most developers purposes, 16460* but the [[AbstractProvider]] class has many features which enable 16461* sub-classing it for specific purposes. 16462* 16463* @_section: api/providers/abstract-provider: Subclassing Provider [abstract-provider] 16464*/ 16465var BN_2$1 = BigInt(2); 16466var MAX_CCIP_REDIRECTS = 10; 16467function stall$4(duration) { 16468 return new Promise((resolve) => { 16469 setTimeout(resolve, duration); 16470 }); 16471} 16472function isPromise$1(value) { 16473 return value && typeof value.then === "function"; 16474} 16475function getTag(prefix, value) { 16476 return prefix + ":" + JSON.stringify(value, (k, v) => { 16477 if (v == null) return "null"; 16478 if (typeof v === "bigint") return `bigint:${v.toString()}`; 16479 if (typeof v === "string") return v.toLowerCase(); 16480 if (typeof v === "object" && !Array.isArray(v)) { 16481 const keys = Object.keys(v); 16482 keys.sort(); 16483 return keys.reduce((accum, key) => { 16484 accum[key] = v[key]; 16485 return accum; 16486 }, {}); 16487 } 16488 return v; 16489 }); 16490} 16491/** 16492* An **UnmanagedSubscriber** is useful for events which do not require 16493* any additional management, such as ``"debug"`` which only requires 16494* emit in synchronous event loop triggered calls. 16495*/ 16496var UnmanagedSubscriber = class { 16497 /** 16498 * The name fof the event. 16499 */ 16500 name; 16501 /** 16502 * Create a new UnmanagedSubscriber with %%name%%. 16503 */ 16504 constructor(name) { 16505 defineProperties(this, { name }); 16506 } 16507 start() {} 16508 stop() {} 16509 pause(dropWhilePaused) {} 16510 resume() {} 16511}; 16512function copy$1(value) { 16513 return JSON.parse(JSON.stringify(value)); 16514} 16515function concisify(items) { 16516 items = Array.from(new Set(items).values()); 16517 items.sort(); 16518 return items; 16519} 16520async function getSubscription(_event, provider) { 16521 if (_event == null) throw new Error("invalid event"); 16522 if (Array.isArray(_event)) _event = { topics: _event }; 16523 if (typeof _event === "string") switch (_event) { 16524 case "block": 16525 case "debug": 16526 case "error": 16527 case "finalized": 16528 case "network": 16529 case "pending": 16530 case "safe": return { 16531 type: _event, 16532 tag: _event 16533 }; 16534 } 16535 if (isHexString(_event, 32)) { 16536 const hash = _event.toLowerCase(); 16537 return { 16538 type: "transaction", 16539 tag: getTag("tx", { hash }), 16540 hash 16541 }; 16542 } 16543 if (_event.orphan) { 16544 const event = _event; 16545 return { 16546 type: "orphan", 16547 tag: getTag("orphan", event), 16548 filter: copy$1(event) 16549 }; 16550 } 16551 if (_event.address || _event.topics) { 16552 const event = _event; 16553 const filter = { topics: (event.topics || []).map((t) => { 16554 if (t == null) return null; 16555 if (Array.isArray(t)) return concisify(t.map((t) => t.toLowerCase())); 16556 return t.toLowerCase(); 16557 }) }; 16558 if (event.address) { 16559 const addresses = []; 16560 const promises = []; 16561 const addAddress = (addr) => { 16562 if (isHexString(addr)) addresses.push(addr); 16563 else promises.push((async () => { 16564 addresses.push(await resolveAddress(addr, provider)); 16565 })()); 16566 }; 16567 if (Array.isArray(event.address)) event.address.forEach(addAddress); 16568 else addAddress(event.address); 16569 if (promises.length) await Promise.all(promises); 16570 filter.address = concisify(addresses.map((a) => a.toLowerCase())); 16571 } 16572 return { 16573 filter, 16574 tag: getTag("event", filter), 16575 type: "event" 16576 }; 16577 } 16578 assertArgument(false, "unknown ProviderEvent", "event", _event); 16579} 16580function getTime$1() { 16581 return (/* @__PURE__ */ new Date()).getTime(); 16582} 16583var defaultOptions$1 = { 16584 cacheTimeout: 250, 16585 pollingInterval: 4e3 16586}; 16587/** 16588* An **AbstractProvider** provides a base class for other sub-classes to 16589* implement the [[Provider]] API by normalizing input arguments and 16590* formatting output results as well as tracking events for consistent 16591* behaviour on an eventually-consistent network. 16592*/ 16593var AbstractProvider = class { 16594 #subs; 16595 #plugins; 16596 #pausedState; 16597 #destroyed; 16598 #networkPromise; 16599 #anyNetwork; 16600 #performCache; 16601 #lastBlockNumber; 16602 #nextTimer; 16603 #timers; 16604 #disableCcipRead; 16605 #requestRate; 16606 #requestTimes; 16607 #options; 16608 /** 16609 * Create a new **AbstractProvider** connected to %%network%%, or
16610 * use the various network detection capabilities to discover the 16611 * [[Network]] if necessary. 16612 */ 16613 constructor(_network, options) { 16614 this.#options = Object.assign({}, defaultOptions$1, options || {}); 16615 if (_network === "any") { 16616 this.#anyNetwork = true; 16617 this.#networkPromise = null; 16618 } else if (_network) { 16619 const network = Network.from(_network); 16620 this.#anyNetwork = false; 16621 this.#networkPromise = Promise.resolve(network); 16622 setTimeout(() => { 16623 this.emit("network", network, null); 16624 }, 0); 16625 } else { 16626 this.#anyNetwork = false; 16627 this.#networkPromise = null; 16628 } 16629 this.#lastBlockNumber = -1; 16630 this.#performCache = /* @__PURE__ */ new Map(); 16631 this.#subs = /* @__PURE__ */ new Map(); 16632 this.#plugins = /* @__PURE__ */ new Map(); 16633 this.#pausedState = null; 16634 this.#destroyed = false; 16635 this.#nextTimer = 1; 16636 this.#timers = /* @__PURE__ */ new Map(); 16637 this.#disableCcipRead = false; 16638 this.#requestRate = 0; 16639 this.#requestTimes = []; 16640 } 16641 /** 16642 * Limit the number of requests per second. (default: no limit) 16643 */ 16644 get _requestRate() { 16645 const value = this.#requestRate; 16646 if (value == 0) return null; 16647 return value; 16648 } 16649 set _requestRate(value) { 16650 if (value == null || value < 0) value = 0; 16651 this.#requestRate = getNumber(value); 16652 } 16653 get pollingInterval() { 16654 return this.#options.pollingInterval; 16655 } 16656 /** 16657 * Returns ``this``, to allow an **AbstractProvider** to implement 16658 * the [[ContractRunner]] interface. 16659 */ 16660 get provider() { 16661 return this; 16662 } 16663 /** 16664 * Returns all the registered plug-ins. 16665 */ 16666 get plugins() { 16667 return Array.from(this.#plugins.values()); 16668 } 16669 /** 16670 * Attach a new plug-in. 16671 */ 16672 attachPlugin(plugin) { 16673 if (this.#plugins.get(plugin.name)) throw new Error(`cannot replace existing plugin: ${plugin.name} `); 16674 this.#plugins.set(plugin.name, plugin.connect(this)); 16675 return this; 16676 } 16677 /** 16678 * Get a plugin by name. 16679 */ 16680 getPlugin(name) { 16681 return this.#plugins.get(name) || null; 16682 } 16683 /** 16684 * Prevent any CCIP-read operation, regardless of whether requested 16685 * in a [[call]] using ``enableCcipRead``. 16686 */ 16687 get disableCcipRead() { 16688 return this.#disableCcipRead; 16689 } 16690 set disableCcipRead(value) { 16691 this.#disableCcipRead = !!value; 16692 } 16693 #getDelay() { 16694 let requestRate = this.#requestRate; 16695 if (requestRate === 0) return 0; 16696 const requests = this.#requestTimes; 16697 const now = getTime$1(); 16698 requests.push(now); 16699 const scanTime = now - 1e3; 16700 while (requests.length && requests[0] < scanTime) requests.shift(); 16701 if (requests.length < requestRate) return 0; 16702 return requests[0] + 1e3 - now; 16703 } 16704 async #perform(req) { 16705 const timeout = this.#options.cacheTimeout; 16706 if (timeout < 0) { 16707 const delay = this.#getDelay(); 16708 if (delay) await stall$4(delay); 16709 return await this._perform(req); 16710 } 16711 const tag = getTag(req.method, req); 16712 let perform = this.#performCache.get(tag); 16713 if (!perform) { 16714 const delay = this.#getDelay(); 16715 if (delay) await stall$4(delay); 16716 perform = this._perform(req); 16717 this.#performCache.set(tag, perform); 16718 setTimeout(() => { 16719 if (this.#performCache.get(tag) === perform) this.#performCache.delete(tag); 16720 }, timeout); 16721 } 16722 return await perform; 16723 } 16724 /** 16725 * Resolves to the data for executing the CCIP-read operations. 16726 */ 16727 async ccipReadFetch(tx, calldata, urls) { 16728 if (this.disableCcipRead || urls.length === 0 || tx.to == null) return null; 16729 const sender = tx.to.toLowerCase(); 16730 const data = calldata.toLowerCase(); 16731 const errorMessages = []; 16732 for (let i = 0; i < urls.length; i++) { 16733 const url = urls[i]; 16734 const request = new FetchRequest(url.replace("{sender}", sender).replace("{data}", data)); 16735 if (url.indexOf("{data}") === -1) request.body = { 16736 data, 16737 sender 16738 }; 16739 this.emit("debug", { 16740 action: "sendCcipReadFetchRequest", 16741 request, 16742 index: i, 16743 urls 16744 }); 16745 let errorMessage = "unknown error"; 16746 let resp; 16747 try { 16748 resp = await request.send(); 16749 } catch (error) { 16750 errorMessages.push(error.message); 16751 this.emit("debug", { 16752 action: "receiveCcipReadFetchError", 16753 request, 16754 result: { error } 16755 }); 16756 continue; 16757 } 16758 try { 16759 const result = resp.bodyJson; 16760 if (result.data) {
16761 this.emit("debug", { 16762 action: "receiveCcipReadFetchResult", 16763 request, 16764 result 16765 }); 16766 return result.data; 16767 } 16768 if (result.message) errorMessage = result.message; 16769 this.emit("debug", { 16770 action: "receiveCcipReadFetchError", 16771 request, 16772 result 16773 }); 16774 } catch (error) {} 16775 assert(resp.statusCode < 400 || resp.statusCode >= 500, `response not found during CCIP fetch: ${errorMessage}`, "OFFCHAIN_FAULT", { 16776 reason: "404_MISSING_RESOURCE", 16777 transaction: tx, 16778 info: { 16779 url, 16780 errorMessage 16781 } 16782 }); 16783 errorMessages.push(errorMessage); 16784 } 16785 assert(false, `error encountered during CCIP fetch: ${errorMessages.map((m) => JSON.stringify(m)).join(", ")}`, "OFFCHAIN_FAULT", { 16786 reason: "500_SERVER_ERROR", 16787 transaction: tx, 16788 info: { 16789 urls, 16790 errorMessages 16791 } 16792 }); 16793 } 16794 /** 16795 * Provides the opportunity for a sub-class to wrap a block before 16796 * returning it, to add additional properties or an alternate 16797 * sub-class of [[Block]]. 16798 */ 16799 _wrapBlock(value, network) { 16800 return new Block(formatBlock(value), this); 16801 } 16802 /** 16803 * Provides the opportunity for a sub-class to wrap a log before 16804 * returning it, to add additional properties or an alternate 16805 * sub-class of [[Log]]. 16806 */ 16807 _wrapLog(value, network) { 16808 return new Log(formatLog(value), this); 16809 } 16810 /** 16811 * Provides the opportunity for a sub-class to wrap a transaction 16812 * receipt before returning it, to add additional properties or an 16813 * alternate sub-class of [[TransactionReceipt]]. 16814 */ 16815 _wrapTransactionReceipt(value, network) { 16816 return new TransactionReceipt(formatTransactionReceipt(value), this); 16817 } 16818 /** 16819 * Provides the opportunity for a sub-class to wrap a transaction 16820 * response before returning it, to add additional properties or an 16821 * alternate sub-class of [[TransactionResponse]]. 16822 */ 16823 _wrapTransactionResponse(tx, network) { 16824 return new TransactionResponse(formatTransactionResponse(tx), this); 16825 } 16826 /** 16827 * Resolves to the Network, forcing a network detection using whatever 16828 * technique the sub-class requires. 16829 * 16830 * Sub-classes **must** override this. 16831 */ 16832 _detectNetwork() { 16833 assert(false, "sub-classes must implement this", "UNSUPPORTED_OPERATION", { operation: "_detectNetwork" }); 16834 } 16835 /** 16836 * Sub-classes should use this to perform all built-in operations. All 16837 * methods sanitizes and normalizes the values passed into this. 16838 * 16839 * Sub-classes **must** override this. 16840 */ 16841 async _perform(req) { 16842 assert(false, `unsupported method: ${req.method}`, "UNSUPPORTED_OPERATION", { 16843 operation: req.method, 16844 info: req 16845 }); 16846 } 16847 async getBlockNumber() { 16848 const blockNumber = getNumber(await this.#perform({ method: "getBlockNumber" }), "%response"); 16849 if (this.#lastBlockNumber >= 0) this.#lastBlockNumber = blockNumber; 16850 return blockNumber; 16851 } 16852 /** 16853 * Returns or resolves to the address for %%address%%, resolving ENS 16854 * names and [[Addressable]] objects and returning if already an 16855 * address. 16856 */ 16857 _getAddress(address) { 16858 return resolveAddress(address, this); 16859 } 16860 /** 16861 * Returns or resolves to a valid block tag for %%blockTag%%, resolving 16862 * negative values and returning if already a valid block tag. 16863 */ 16864 _getBlockTag(blockTag) { 16865 if (blockTag == null) return "latest"; 16866 switch (blockTag) { 16867 case "earliest": return "0x0"; 16868 case "finalized": 16869 case "latest": 16870 case "pending": 16871 case "safe": return blockTag; 16872 } 16873 if (isHexString(blockTag)) { 16874 if (isHexString(blockTag, 32)) return blockTag; 16875 return toQuantity(blockTag); 16876 } 16877 if (typeof blockTag === "bigint") blockTag = getNumber(blockTag, "blockTag"); 16878 if (typeof blockTag === "number") { 16879 if (blockTag >= 0) return toQuantity(blockTag); 16880 if (this.#lastBlockNumber >= 0) return toQuantity(this.#lastBlockNumber + blockTag); 16881 return this.getBlockNumber().then((b) => toQuantity(b + blockTag)); 16882 } 16883 assertArgument(false, "invalid blockTag", "blockTag", blockTag); 16884 } 16885 /** 16886 * Returns or resolves to a filter for %%filter%%, resolving any ENS 16887 * names or [[Addressable]] object and returning if already a valid 16888 * filter. 16889 */ 16890 _getFilter(filter) { 16891 const topics = (filter.topics || []).map((t) => { 16892 if (t == null) return null; 16893 if (Array.isArray(t)) return concisify(t.map((t) => t.toLowerCase())); 16894 return t.toLowerCase(); 16895 }); 16896 const blockHash = "blockHash" in filter ? filter.blockHash : void 0; 16897 const resolve = (_address, fromBlock, toBlock) => { 16898 let address = void 0; 16899 switch (_address.length) { 16900 case 0: break; 16901 case 1: 16902 address = _address[0]; 16903 break; 16904 default: 16905 _address.sort(); 16906 address = _address; 16907 } 16908 if (blockHash) { 16909 if (fromBlock != null || toBlock != null) throw new Error("invalid filter"); 16910 } 16911 const filter = {};
16912 if (address) filter.address = address; 16913 if (topics.length) filter.topics = topics; 16914 if (fromBlock) filter.fromBlock = fromBlock; 16915 if (toBlock) filter.toBlock = toBlock; 16916 if (blockHash) filter.blockHash = blockHash; 16917 return filter; 16918 }; 16919 let address = []; 16920 if (filter.address) { 16921 if (Array.isArray(filter.address)) for (const addr of filter.address) address.push(this._getAddress(addr)); 16922 else address.push(this._getAddress(filter.address)); 16923 } 16924 let fromBlock = void 0; 16925 if ("fromBlock" in filter) fromBlock = this._getBlockTag(filter.fromBlock); 16926 let toBlock = void 0; 16927 if ("toBlock" in filter) toBlock = this._getBlockTag(filter.toBlock); 16928 if (address.filter((a) => typeof a !== "string").length || fromBlock != null && typeof fromBlock !== "string" || toBlock != null && typeof toBlock !== "string") return Promise.all([ 16929 Promise.all(address), 16930 fromBlock, 16931 toBlock 16932 ]).then((result) => { 16933 return resolve(result[0], result[1], result[2]); 16934 }); 16935 return resolve(address, fromBlock, toBlock); 16936 } 16937 /** 16938 * Returns or resolves to a transaction for %%request%%, resolving 16939 * any ENS names or [[Addressable]] and returning if already a valid 16940 * transaction. 16941 */ 16942 _getTransactionRequest(_request) { 16943 const request = copyRequest(_request); 16944 const promises = []; 16945 ["to", "from"].forEach((key) => { 16946 if (request[key] == null) return; 16947 const addr = resolveAddress(request[key], this); 16948 if (isPromise$1(addr)) promises.push((async function() { 16949 request[key] = await addr; 16950 })()); 16951 else request[key] = addr; 16952 }); 16953 if (request.blockTag != null) { 16954 const blockTag = this._getBlockTag(request.blockTag); 16955 if (isPromise$1(blockTag)) promises.push((async function() { 16956 request.blockTag = await blockTag; 16957 })()); 16958 else request.blockTag = blockTag; 16959 } 16960 if (promises.length) return (async function() { 16961 await Promise.all(promises); 16962 return request; 16963 })(); 16964 return request; 16965 } 16966 async getNetwork() { 16967 if (this.#networkPromise == null) { 16968 const detectNetwork = (async () => { 16969 try { 16970 const network = await this._detectNetwork(); 16971 this.emit("network", network, null); 16972 return network; 16973 } catch (error) { 16974 if (this.#networkPromise === detectNetwork) this.#networkPromise = null; 16975 throw error; 16976 } 16977 })(); 16978 this.#networkPromise = detectNetwork; 16979 return (await detectNetwork).clone(); 16980 } 16981 const networkPromise = this.#networkPromise; 16982 const [expected, actual] = await Promise.all([networkPromise, this._detectNetwork()]); 16983 if (expected.chainId !== actual.chainId) { 16984 if (this.#anyNetwork) { 16985 this.emit("network", actual, expected); 16986 if (this.#networkPromise === networkPromise) this.#networkPromise = Promise.resolve(actual); 16987 } else assert(false, `network changed: ${expected.chainId} => ${actual.chainId} `, "NETWORK_ERROR", { event: "changed" }); 16988 } 16989 return expected.clone(); 16990 } 16991 async getFeeData() { 16992 const network = await this.getNetwork(); 16993 const getFeeDataFunc = async () => { 16994 const { _block, gasPrice, priorityFee } = await resolveProperties({ 16995 _block: this.#getBlock("latest", false), 16996 gasPrice: (async () => { 16997 try { 16998 return getBigInt(await this.#perform({ method: "getGasPrice" }), "%response"); 16999 } catch (error) {} 17000 return null; 17001 })(), 17002 priorityFee: (async () => { 17003 try { 17004 return getBigInt(await this.#perform({ method: "getPriorityFee" }), "%response"); 17005 } catch (error) {} 17006 return null; 17007 })() 17008 }); 17009 let maxFeePerGas = null; 17010 let maxPriorityFeePerGas = null; 17011 const block = this._wrapBlock(_block, network); 17012 if (block && block.baseFeePerGas) { 17013 maxPriorityFeePerGas = priorityFee != null ? priorityFee : BigInt("1000000000"); 17014 maxFeePerGas = block.baseFeePerGas * BN_2$1 + maxPriorityFeePerGas; 17015 } 17016 return new FeeData(gasPrice, maxFeePerGas, maxPriorityFeePerGas); 17017 }; 17018 const plugin = network.getPlugin("org.ethers.plugins.network.FetchUrlFeeDataPlugin"); 17019 if (plugin) { 17020 const req = new FetchRequest(plugin.url); 17021 const feeData = await plugin.processFunc(getFeeDataFunc, this, req); 17022 return new FeeData(feeData.gasPrice, feeData.maxFeePerGas, feeData.maxPriorityFeePerGas); 17023 } 17024 return await getFeeDataFunc(); 17025 } 17026 async estimateGas(_tx) { 17027 let tx = this._getTransactionRequest(_tx);
vendor: 6,332 bytes, lines 17028-17230
17028 if (isPromise$1(tx)) tx = await tx; 17029 return getBigInt(await this.#perform({ 17030 method: "estimateGas", 17031 transaction: tx 17032 }), "%response"); 17033 } 17034 async #call(tx, blockTag, attempt) { 17035 assert(attempt < MAX_CCIP_REDIRECTS, "CCIP read exceeded maximum redirections", "OFFCHAIN_FAULT", { 17036 reason: "TOO_MANY_REDIRECTS", 17037 transaction: Object.assign({}, tx, { 17038 blockTag, 17039 enableCcipRead: true 17040 }) 17041 }); 17042 const transaction = copyRequest(tx); 17043 try { 17044 const delay = this.#getDelay(); 17045 if (delay) await stall$4(delay); 17046 return hexlify(await this._perform({ 17047 method: "call", 17048 transaction, 17049 blockTag 17050 })); 17051 } catch (error) { 17052 if (!this.disableCcipRead && isCallException(error) && error.data && attempt >= 0 && blockTag === "latest" && transaction.to != null && dataSlice(error.data, 0, 4) === "0x556f1830") { 17053 const data = error.data; 17054 const txSender = await resolveAddress(transaction.to, this); 17055 let ccipArgs; 17056 try { 17057 ccipArgs = parseOffchainLookup(dataSlice(error.data, 4)); 17058 } catch (error) { 17059 assert(false, error.message, "OFFCHAIN_FAULT", { 17060 reason: "BAD_DATA", 17061 transaction, 17062 info: { data } 17063 }); 17064 } 17065 assert(ccipArgs.sender.toLowerCase() === txSender.toLowerCase(), "CCIP Read sender mismatch", "CALL_EXCEPTION", { 17066 action: "call", 17067 data, 17068 reason: "OffchainLookup", 17069 transaction, 17070 invocation: null, 17071 revert: { 17072 signature: "OffchainLookup(address,string[],bytes,bytes4,bytes)", 17073 name: "OffchainLookup", 17074 args: ccipArgs.errorArgs 17075 } 17076 }); 17077 const ccipResult = await this.ccipReadFetch(transaction, ccipArgs.calldata, ccipArgs.urls); 17078 assert(ccipResult != null, "CCIP Read failed to fetch data", "OFFCHAIN_FAULT", { 17079 reason: "FETCH_FAILED", 17080 transaction, 17081 info: { 17082 data: error.data, 17083 errorArgs: ccipArgs.errorArgs 17084 } 17085 }); 17086 const tx = { 17087 to: txSender, 17088 data: concat([ccipArgs.selector, encodeBytes([ccipResult, ccipArgs.extraData])]) 17089 }; 17090 this.emit("debug", { 17091 action: "sendCcipReadCall", 17092 transaction: tx 17093 }); 17094 try { 17095 const result = await this.#call(tx, blockTag, attempt + 1); 17096 this.emit("debug", { 17097 action: "receiveCcipReadCallResult", 17098 transaction: Object.assign({}, tx), 17099 result 17100 }); 17101 return result; 17102 } catch (error) { 17103 this.emit("debug", { 17104 action: "receiveCcipReadCallError", 17105 transaction: Object.assign({}, tx), 17106 error 17107 }); 17108 throw error; 17109 } 17110 } 17111 throw error; 17112 } 17113 } 17114 async #checkNetwork(promise) { 17115 const { value } = await resolveProperties({ 17116 network: this.getNetwork(), 17117 value: promise 17118 }); 17119 return value; 17120 } 17121 async call(_tx) { 17122 const { tx, blockTag } = await resolveProperties({ 17123 tx: this._getTransactionRequest(_tx), 17124 blockTag: this._getBlockTag(_tx.blockTag) 17125 }); 17126 return await this.#checkNetwork(this.#call(tx, blockTag, _tx.enableCcipRead ? 0 : -1)); 17127 } 17128 async #getAccountValue(request, _address, _blockTag) { 17129 let address = this._getAddress(_address); 17130 let blockTag = this._getBlockTag(_blockTag); 17131 if (typeof address !== "string" || typeof blockTag !== "string") [address, blockTag] = await Promise.all([address, blockTag]); 17132 return await this.#checkNetwork(this.#perform(Object.assign(request, { 17133 address, 17134 blockTag 17135 }))); 17136 } 17137 async getBalance(address, blockTag) { 17138 return getBigInt(await this.#getAccountValue({ method: "getBalance" }, address, blockTag), "%response"); 17139 } 17140 async getTransactionCount(address, blockTag) { 17141 return getNumber(await this.#getAccountValue({ method: "getTransactionCount" }, address, blockTag), "%response"); 17142 } 17143 async getCode(address, blockTag) { 17144 return hexlify(await this.#getAccountValue({ method: "getCode" }, address, blockTag)); 17145 } 17146 async getStorage(address, _position, blockTag) { 17147 const position = getBigInt(_position, "position"); 17148 return hexlify(await this.#getAccountValue({ 17149 method: "getStorage", 17150 position 17151 }, address, blockTag)); 17152 } 17153 async broadcastTransaction(signedTx) { 17154 const { blockNumber, hash, network } = await resolveProperties({ 17155 blockNumber: this.getBlockNumber(), 17156 hash: this._perform({ 17157 method: "broadcastTransaction", 17158 signedTransaction: signedTx 17159 }), 17160 network: this.getNetwork() 17161 }); 17162 const tx = Transaction.from(signedTx); 17163 if (tx.hash !== hash) throw new Error("@TODO: the returned hash did not match"); 17164 return this._wrapTransactionResponse(tx, network).replaceableTransaction(blockNumber); 17165 } 17166 async #getBlock(block, includeTransactions) { 17167 if (isHexString(block, 32)) return await this.#perform({ 17168 method: "getBlock", 17169 blockHash: block, 17170 includeTransactions 17171 }); 17172 let blockTag = this._getBlockTag(block); 17173 if (typeof blockTag !== "string") blockTag = await blockTag; 17174 return await this.#perform({ 17175 method: "getBlock", 17176 blockTag, 17177 includeTransactions 17178 }); 17179 } 17180 async getBlock(block, prefetchTxs) { 17181 const { network, params } = await resolveProperties({ 17182 network: this.getNetwork(), 17183 params: this.#getBlock(block, !!prefetchTxs) 17184 }); 17185 if (params == null) return null; 17186 return this._wrapBlock(params, network); 17187 } 17188 async getTransaction(hash) { 17189 const { network, params } = await resolveProperties({ 17190 network: this.getNetwork(), 17191 params: this.#perform({ 17192 method: "getTransaction", 17193 hash 17194 }) 17195 }); 17196 if (params == null) return null; 17197 return this._wrapTransactionResponse(params, network); 17198 } 17199 async getTransactionReceipt(hash) { 17200 const { network, params } = await resolveProperties({ 17201 network: this.getNetwork(), 17202 params: this.#perform({ 17203 method: "getTransactionReceipt", 17204 hash 17205 }) 17206 }); 17207 if (params == null) return null; 17208 if (params.gasPrice == null && params.effectiveGasPrice == null) { 17209 const tx = await this.#perform({ 17210 method: "getTransaction", 17211 hash 17212 }); 17213 if (tx == null) throw new Error("report this; could not find tx or effectiveGasPrice"); 17214 params.effectiveGasPrice = tx.gasPrice; 17215 } 17216 return this._wrapTransactionReceipt(params, network); 17217 } 17218 async getTransactionResult(hash) { 17219 const { result } = await resolveProperties({ 17220 network: this.getNetwork(), 17221 result: this.#perform({ 17222 method: "getTransactionResult", 17223 hash 17224 }) 17225 }); 17226 if (result == null) return null; 17227 return hexlify(result); 17228 } 17229 async getLogs(_filter) { 17230 let filter = this._getFilter(_filter);
17231 if (isPromise$1(filter)) filter = await filter; 17232 const { network, params } = await resolveProperties({ 17233 network: this.getNetwork(), 17234 params: this.#perform({ 17235 method: "getLogs", 17236 filter 17237 }) 17238 }); 17239 return params.map((p) => this._wrapLog(p, network)); 17240 } 17241 _getProvider(chainId) { 17242 assert(false, "provider cannot connect to target network", "UNSUPPORTED_OPERATION", { operation: "_getProvider()" }); 17243 } 17244 async getResolver(name) { 17245 return await EnsResolver.fromName(this, name); 17246 } 17247 async getAvatar(name) { 17248 const resolver = await this.getResolver(name); 17249 if (resolver) return await resolver.getAvatar(); 17250 return null; 17251 } 17252 async resolveName(name, coinType) { 17253 const resolver = await this.getResolver(name); 17254 if (resolver) return await resolver.getAddress(coinType); 17255 return null; 17256 } 17257 async lookupAddress(address, coinType) { 17258 return await EnsResolver.lookupAddress(this, address, coinType); 17259 } 17260 async waitForTransaction(hash, _confirms, timeout) { 17261 const confirms = _confirms != null ? _confirms : 1; 17262 if (confirms === 0) return this.getTransactionReceipt(hash); 17263 return new Promise(async (resolve, reject) => { 17264 let timer = null; 17265 const listener = (async (blockNumber) => { 17266 try { 17267 const receipt = await this.getTransactionReceipt(hash); 17268 if (receipt != null) { 17269 if (blockNumber - receipt.blockNumber + 1 >= confirms) { 17270 resolve(receipt); 17271 if (timer) { 17272 clearTimeout(timer); 17273 timer = null; 17274 } 17275 return; 17276 } 17277 } 17278 } catch (error) { 17279 console.log("EEE", error); 17280 } 17281 this.once("block", listener); 17282 }); 17283 if (timeout != null) timer = setTimeout(() => { 17284 if (timer == null) return; 17285 timer = null; 17286 this.off("block", listener); 17287 reject(makeError("timeout", "TIMEOUT", { reason: "timeout" })); 17288 }, timeout); 17289 listener(await this.getBlockNumber()); 17290 }); 17291 } 17292 async waitForBlock(blockTag) { 17293 assert(false, "not implemented yet", "NOT_IMPLEMENTED", { operation: "waitForBlock" }); 17294 } 17295 /** 17296 * Clear a timer created using the [[_setTimeout]] method. 17297 */ 17298 _clearTimeout(timerId) { 17299 const timer = this.#timers.get(timerId); 17300 if (!timer) return; 17301 if (timer.timer) clearTimeout(timer.timer); 17302 this.#timers.delete(timerId); 17303 } 17304 /** 17305 * Create a timer that will execute %%func%% after at least %%timeout%% 17306 * (in ms). If %%timeout%% is unspecified, then %%func%% will execute 17307 * in the next event loop. 17308 * 17309 * [Pausing](AbstractProvider-paused) the provider will pause any 17310 * associated timers. 17311 */ 17312 _setTimeout(_func, timeout) { 17313 if (timeout == null) timeout = 0; 17314 const timerId = this.#nextTimer++; 17315 const func = () => { 17316 this.#timers.delete(timerId); 17317 _func(); 17318 }; 17319 if (this.paused) this.#timers.set(timerId, { 17320 timer: null, 17321 func, 17322 time: timeout 17323 }); 17324 else { 17325 const timer = setTimeout(func, timeout); 17326 this.#timers.set(timerId, { 17327 timer, 17328 func, 17329 time: getTime$1() 17330 }); 17331 } 17332 return timerId; 17333 } 17334 /** 17335 * Perform %%func%% on each subscriber. 17336 */ 17337 _forEachSubscriber(func) { 17338 for (const sub of this.#subs.values()) func(sub.subscriber); 17339 } 17340 /** 17341 * Sub-classes may override this to customize subscription 17342 * implementations. 17343 */ 17344 _getSubscriber(sub) { 17345 switch (sub.type) { 17346 case "debug": 17347 case "error": 17348 case "network": return new UnmanagedSubscriber(sub.type); 17349 case "block": { 17350 const subscriber = new PollingBlockSubscriber(this); 17351 subscriber.pollingInterval = this.pollingInterval; 17352 return subscriber; 17353 } 17354 case "safe": 17355 case "finalized": return new PollingBlockTagSubscriber(this, sub.type); 17356 case "event": return new PollingEventSubscriber(this, sub.filter); 17357 case "transaction": return new PollingTransactionSubscriber(this, sub.hash); 17358 case "orphan": return new PollingOrphanSubscriber(this, sub.filter); 17359 } 17360 throw new Error(`unsupported event: ${sub.type}`); 17361 } 17362 /** 17363 * If a [[Subscriber]] fails and needs to replace itself, this 17364 * method may be used. 17365 * 17366 * For example, this is used for providers when using the 17367 * ``eth_getFilterChanges`` method, which can return null if state 17368 * filters are not supported by the backend, allowing the Subscriber 17369 * to swap in a [[PollingEventSubscriber]]. 17370 */ 17371 _recoverSubscriber(oldSub, newSub) { 17372 for (const sub of this.#subs.values()) if (sub.subscriber === oldSub) { 17373 if (sub.started) sub.subscriber.stop(); 17374 sub.subscriber = newSub; 17375 if (sub.started) newSub.start(); 17376 if (this.#pausedState != null) newSub.pause(this.#pausedState); 17377 break; 17378 } 17379 } 17380 async #hasSub(event, emitArgs) { 17381 let sub = await getSubscription(event, this); 17382 if (sub.type === "event" && emitArgs && emitArgs.length > 0 && emitArgs[0].removed === true) sub = await getSubscription({ 17383 orphan: "drop-log", 17384 log: emitArgs[0] 17385 }, this); 17386 return this.#subs.get(sub.tag) || null; 17387 } 17388 async #getSub(event) { 17389 const subscription = await getSubscription(event, this); 17390 const tag = subscription.tag; 17391 let sub = this.#subs.get(tag); 17392 if (!sub) { 17393 sub = { 17394 subscriber: this._getSubscriber(subscription), 17395 tag, 17396 addressableMap: /* @__PURE__ */ new WeakMap(), 17397 nameMap: /* @__PURE__ */ new Map(), 17398 started: false, 17399 listeners: [] 17400 }; 17401 this.#subs.set(tag, sub); 17402 } 17403 return sub; 17404 } 17405 async on(event, listener) { 17406 const sub = await this.#getSub(event); 17407 sub.listeners.push({ 17408 listener, 17409 once: false 17410 }); 17411 if (!sub.started) { 17412 sub.subscriber.start(); 17413 sub.started = true; 17414 if (this.#pausedState != null) sub.subscriber.pause(this.#pausedState); 17415 } 17416 return this; 17417 } 17418 async once(event, listener) { 17419 const sub = await this.#getSub(event); 17420 sub.listeners.push({ 17421 listener, 17422 once: true 17423 }); 17424 if (!sub.started) { 17425 sub.subscriber.start(); 17426 sub.started = true; 17427 if (this.#pausedState != null) sub.subscriber.pause(this.#pausedState); 17428 } 17429 return this; 17430 } 17431 async emit(event, ...args) { 17432 const sub = await this.#hasSub(event, args); 17433 if (!sub || sub.listeners.length === 0) return false;
17434 const count = sub.listeners.length; 17435 sub.listeners = sub.listeners.filter(({ listener, once }) => { 17436 const payload = new EventPayload(this, once ? null : listener, event); 17437 try { 17438 listener.call(this, ...args, payload); 17439 } catch (error) {} 17440 return !once; 17441 }); 17442 if (sub.listeners.length === 0) { 17443 if (sub.started) sub.subscriber.stop(); 17444 this.#subs.delete(sub.tag); 17445 } 17446 return count > 0; 17447 } 17448 async listenerCount(event) { 17449 if (event) { 17450 const sub = await this.#hasSub(event); 17451 if (!sub) return 0; 17452 return sub.listeners.length; 17453 } 17454 let total = 0; 17455 for (const { listeners } of this.#subs.values()) total += listeners.length; 17456 return total; 17457 } 17458 async listeners(event) { 17459 if (event) { 17460 const sub = await this.#hasSub(event); 17461 if (!sub) return []; 17462 return sub.listeners.map(({ listener }) => listener); 17463 } 17464 let result = []; 17465 for (const { listeners } of this.#subs.values()) result = result.concat(listeners.map(({ listener }) => listener)); 17466 return result; 17467 } 17468 async off(event, listener) { 17469 const sub = await this.#hasSub(event); 17470 if (!sub) return this; 17471 if (listener) { 17472 const index = sub.listeners.map(({ listener }) => listener).indexOf(listener); 17473 if (index >= 0) sub.listeners.splice(index, 1); 17474 } 17475 if (!listener || sub.listeners.length === 0) { 17476 if (sub.started) sub.subscriber.stop(); 17477 this.#subs.delete(sub.tag); 17478 } 17479 return this; 17480 } 17481 async removeAllListeners(event) { 17482 if (event) { 17483 const { tag, started, subscriber } = await this.#getSub(event); 17484 if (started) subscriber.stop(); 17485 this.#subs.delete(tag); 17486 } else for (const [tag, { started, subscriber }] of this.#subs) { 17487 if (started) subscriber.stop(); 17488 this.#subs.delete(tag); 17489 } 17490 return this; 17491 } 17492 async addListener(event, listener) { 17493 return await this.on(event, listener); 17494 } 17495 async removeListener(event, listener) { 17496 return this.off(event, listener); 17497 } 17498 /** 17499 * If this provider has been destroyed using the [[destroy]] method. 17500 * 17501 * Once destroyed, all resources are reclaimed, internal event loops 17502 * and timers are cleaned up and no further requests may be sent to 17503 * the provider. 17504 */ 17505 get destroyed() { 17506 return this.#destroyed; 17507 } 17508 /** 17509 * Sub-classes may use this to shutdown any sockets or release their 17510 * resources and reject any pending requests. 17511 * 17512 * Sub-classes **must** call ``super.destroy()``. 17513 */ 17514 destroy() { 17515 this.removeAllListeners(); 17516 for (const timerId of this.#timers.keys()) this._clearTimeout(timerId); 17517 this.#destroyed = true; 17518 } 17519 /** 17520 * Whether the provider is currently paused. 17521 * 17522 * A paused provider will not emit any events, and generally should 17523 * not make any requests to the network, but that is up to sub-classes 17524 * to manage. 17525 * 17526 * Setting ``paused = true`` is identical to calling ``.pause(false)``, 17527 * which will buffer any events that occur while paused until the 17528 * provider is unpaused. 17529 */ 17530 get paused() { 17531 return this.#pausedState != null; 17532 } 17533 set paused(pause) { 17534 if (!!pause === this.paused) return; 17535 if (this.paused) this.resume(); 17536 else this.pause(false); 17537 } 17538 /** 17539 * Pause the provider. If %%dropWhilePaused%%, any events that occur 17540 * while paused are dropped, otherwise all events will be emitted once 17541 * the provider is unpaused. 17542 */ 17543 pause(dropWhilePaused) { 17544 this.#lastBlockNumber = -1; 17545 if (this.#pausedState != null) { 17546 if (this.#pausedState == !!dropWhilePaused) return; 17547 assert(false, "cannot change pause type; resume first", "UNSUPPORTED_OPERATION", { operation: "pause" }); 17548 } 17549 this._forEachSubscriber((s) => s.pause(dropWhilePaused)); 17550 this.#pausedState = !!dropWhilePaused; 17551 for (const timer of this.#timers.values()) { 17552 if (timer.timer) clearTimeout(timer.timer); 17553 timer.time = getTime$1() - timer.time; 17554 } 17555 } 17556 /** 17557 * Resume the provider. 17558 */ 17559 resume() { 17560 if (this.#pausedState == null) return; 17561 this._forEachSubscriber((s) => s.resume()); 17562 this.#pausedState = null; 17563 for (const timer of this.#timers.values()) { 17564 let timeout = timer.time; 17565 if (timeout < 0) timeout = 0; 17566 timer.time = getTime$1(); 17567 setTimeout(timer.func, timeout); 17568 } 17569 } 17570}; 17571function _parseString(result, start) { 17572 try { 17573 const bytes = _parseBytes(result, start); 17574 if (bytes) return toUtf8String(bytes); 17575 } catch (error) {} 17576 return null; 17577} 17578function _parseBytes(result, start) { 17579 if (result === "0x") return null; 17580 try { 17581 const offset = getNumber(dataSlice(result, start, start + 32)); 17582 const length = getNumber(dataSlice(result, offset, offset + 32)); 17583 return dataSlice(result, offset + 32, offset + 32 + length); 17584 } catch (error) {} 17585 return null; 17586} 17587function numPad(value) { 17588 const result = toBeArray(value); 17589 if (result.length > 32) throw new Error("internal; should not happen"); 17590 const padded = /* @__PURE__ */ new Uint8Array(32); 17591 padded.set(result, 32 - result.length); 17592 return padded; 17593} 17594function bytesPad(value) { 17595 if (value.length % 32 === 0) return value; 17596 const result = new Uint8Array(Math.ceil(value.length / 32) * 32); 17597 result.set(value); 17598 return result; 17599} 17600var empty = new Uint8Array([]); 17601function encodeBytes(datas) { 17602 const result = []; 17603 let byteCount = 0; 17604 for (let i = 0; i < datas.length; i++) { 17605 result.push(empty); 17606 byteCount += 32; 17607 } 17608 for (let i = 0; i < datas.length; i++) { 17609 const data = getBytes(datas[i]); 17610 result[i] = numPad(byteCount); 17611 result.push(numPad(data.length)); 17612 result.push(bytesPad(data)); 17613 byteCount += 32 + Math.ceil(data.length / 32) * 32; 17614 } 17615 return concat(result); 17616} 17617var zeros = "0x0000000000000000000000000000000000000000000000000000000000000000"; 17618function parseOffchainLookup(data) { 17619 const result = { 17620 sender: "", 17621 urls: [], 17622 calldata: "", 17623 selector: "", 17624 extraData: "", 17625 errorArgs: [] 17626 }; 17627 assert(dataLength(data) >= 160, "insufficient OffchainLookup data", "OFFCHAIN_FAULT", { reason: "insufficient OffchainLookup data" }); 17628 const sender = dataSlice(data, 0, 32); 17629 assert(dataSlice(sender, 0, 12) === dataSlice(zeros, 0, 12), "corrupt OffchainLookup sender", "OFFCHAIN_FAULT", { reason: "corrupt OffchainLookup sender" }); 17630 result.sender = dataSlice(sender, 12); 17631 try { 17632 const urls = []; 17633 const urlsOffset = getNumber(dataSlice(data, 32, 64)); 17634 const urlsLength = getNumber(dataSlice(data, urlsOffset, urlsOffset + 32)); 17635 const urlsData = dataSlice(data, urlsOffset + 32); 17636 for (let u = 0; u < urlsLength; u++) { 17637 const url = _parseString(urlsData, u * 32); 17638 if (url == null) throw new Error("abort"); 17639 urls.push(url); 17640 } 17641 result.urls = urls; 17642 } catch (error) { 17643 assert(false, "corrupt OffchainLookup urls", "OFFCHAIN_FAULT", { reason: "corrupt OffchainLookup urls" }); 17644 } 17645 try { 17646 const calldata = _parseBytes(data, 64); 17647 if (calldata == null) throw new Error("abort"); 17648 result.calldata = calldata; 17649 } catch (error) { 17650 assert(false, "corrupt OffchainLookup calldata", "OFFCHAIN_FAULT", { reason: "corrupt OffchainLookup calldata" }); 17651 } 17652 assert(dataSlice(data, 100, 128) === dataSlice(zeros, 0, 28), "corrupt OffchainLookup callbaackSelector", "OFFCHAIN_FAULT", { reason: "corrupt OffchainLookup callbaackSelector" }); 17653 result.selector = dataSlice(data, 96, 100); 17654 try { 17655 const extraData = _parseBytes(data, 128); 17656 if (extraData == null) throw new Error("abort"); 17657 result.extraData = extraData; 17658 } catch (error) { 17659 assert(false, "corrupt OffchainLookup extraData", "OFFCHAIN_FAULT", { reason: "corrupt OffchainLookup extraData" }); 17660 }
17661 result.errorArgs = "sender,urls,calldata,selector,extraData".split(/,/).map((k) => result[k]); 17662 return result; 17663} 17664//#endregion 17665//#region node_modules/ethers/lib.esm/providers/abstract-signer.js 17666/** 17667* Generally the [[Wallet]] and [[JsonRpcSigner]] and their sub-classes 17668* are sufficient for most developers, but this is provided to 17669* fascilitate more complex Signers. 17670* 17671* @_section: api/providers/abstract-signer: Subclassing Signer [abstract-signer] 17672*/ 17673function checkProvider(signer, operation) { 17674 if (signer.provider) return signer.provider; 17675 assert(false, "missing provider", "UNSUPPORTED_OPERATION", { operation }); 17676} 17677async function populate(signer, tx) { 17678 let pop = copyRequest(tx); 17679 if (pop.to != null) pop.to = resolveAddress(pop.to, signer); 17680 if (pop.from != null) { 17681 const from = pop.from; 17682 pop.from = Promise.all([signer.getAddress(), resolveAddress(from, signer)]).then(([address, from]) => { 17683 assertArgument(address.toLowerCase() === from.toLowerCase(), "transaction from mismatch", "tx.from", from); 17684 return address; 17685 }); 17686 } else pop.from = signer.getAddress(); 17687 return await resolveProperties(pop); 17688} 17689/** 17690* An **AbstractSigner** includes most of teh functionality required 17691* to get a [[Signer]] working as expected, but requires a few 17692* Signer-specific methods be overridden. 17693* 17694*/ 17695var AbstractSigner = class { 17696 /** 17697 * The provider this signer is connected to. 17698 */ 17699 provider; 17700 /** 17701 * Creates a new Signer connected to %%provider%%. 17702 */ 17703 constructor(provider) { 17704 defineProperties(this, { provider: provider || null }); 17705 } 17706 async getNonce(blockTag) { 17707 return checkProvider(this, "getTransactionCount").getTransactionCount(await this.getAddress(), blockTag); 17708 } 17709 async populateCall(tx) { 17710 return await populate(this, tx); 17711 } 17712 async populateTransaction(tx) { 17713 const provider = checkProvider(this, "populateTransaction"); 17714 const pop = await populate(this, tx); 17715 if (pop.nonce == null) pop.nonce = await this.getNonce("pending"); 17716 if (pop.gasLimit == null) pop.gasLimit = await this.estimateGas(p
17716op); 17717 const network = await this.provider.getNetwork(); 17718 if (pop.chainId != null) assertArgument(getBigInt(pop.chainId) === network.chainId, "transaction chainId mismatch", "tx.chainId", tx.chainId); 17719 else pop.chainId = network.chainId; 17720 const hasEip1559 = pop.maxFeePerGas != null || pop.maxPriorityFeePerGas != null; 17721 if (pop.gasPrice != null && (pop.type === 2 || hasEip1559)) assertArgument(false, "eip-1559 transaction do not support gasPrice", "tx", tx); 17722 else if ((pop.type === 0 || pop.type === 1) && hasEip1559) assertArgument(false, "pre-eip-1559 transaction do not support maxFeePerGas/maxPriorityFeePerGas", "tx", tx); 17723 if ((pop.type === 2 || pop.type == null) && pop.maxFeePerGas != null && pop.maxPriorityFeePerGas != null) pop.type = 2; 17724 else if (pop.type === 0 || pop.type === 1) { 17725 const feeData = await provider.getFeeData(); 17726 assert(feeData.gasPrice != null, "network does not support gasPrice", "UNSUPPORTED_OPERATION", { operation: "getGasPrice" }); 17727 if (pop.gasPrice == null) pop.gasPrice = feeData.gasPrice; 17728 } else { 17729 const feeData = await provider.getFeeData(); 17730 if (pop.type == null) { 17731 if (feeData.maxFeePerGas != null && feeData.maxPriorityFeePerGas != null) { 17732 if (pop.authorizationList && pop.authorizationList.length) pop.type = 4; 17733 else pop.type = 2; 17734 if (pop.gasPrice != null) { 17735 const gasPrice = pop.gasPrice; 17736 delete pop.gasPrice; 17737 pop.maxFeePerGas = gasPrice; 17738 pop.maxPriorityFeePerGas = gasPrice; 17739 } else { 17740 if (pop.maxFeePerGas == null) pop.maxFeePerGas = feeData.maxFeePerGas; 17741 if (pop.maxPriorityFeePerGas == null) pop.maxPriorityFeePerGas = feeData.maxPriorityFeePerGas; 17742 } 17743 } else if (feeData.gasPrice != null) { 17744 assert(!hasEip1559, "network does not support EIP-1559", "UNSUPPORTED_OPERATION", { operation: "populateTransaction" }); 17745 if (pop.gasPrice == null) pop.gasPrice = feeData.gasPrice; 17746 pop.type = 0; 17747 } else assert(false, "failed to get consistent fee data", "UNSUPPORTED_OPERATION", { operation: "signer.getFeeData" }); 17748 } else if (pop.type === 2 || pop.type === 3 || pop.type === 4) { 17749 if (pop.maxFeePerGas == null) pop.maxFeePerGas = feeData.maxFeePerGas; 17750 if (pop.maxPriorityFeePerGas == null) pop.maxPriorityFeePerGas = feeData.maxPriorityFeePerGas; 17751 } 17752 } 17753 return await resolveProperties(pop); 17754 } 17755 async populateAuthorization(_auth) { 17756 const auth = Object.assign({}, _auth); 17757 if (auth.chainId == null) auth.chainId = (await checkProvider(this, "getNetwork").getNetwork()).chainId; 17758 if (auth.nonce == null) auth.nonce = await this.getNonce(); 17759 return auth; 17760 } 17761 async estimateGas(tx) { 17762 return checkProvider(this, "estimateGas").estimateGas(await this.populateCall(tx)); 17763 } 17764 async call(tx) { 17765 return checkProvider(this, "call").call(await this.populateCall(tx)); 17766 } 17767 async resolveName(name) { 17768 return await checkProvider(this, "resolveName").resolveName(name); 17769 } 17770 async sendTransaction(tx) { 17771 const provider = checkProvider(this, "sendTransaction"); 17772 const pop = await this.populateTransaction(tx); 17773 delete pop.from; 17774 const txObj = Transaction.from(pop); 17775 return await provider.broadcastTransaction(await this.signTransaction(txObj)); 17776 } 17777 authorize(authorization) { 17778 assert(false, "authorization not implemented for this signer", "UNSUPPORTED_OPERATION", { operation: "authorize" }); 17779 } 17780}; 17781/** 17782* A **VoidSigner** is a class designed to allow an address to be used 17783* in any API which accepts a Signer, but for which there are no 17784* credentials available to perform any actual signing. 17785* 17786* This for example allow impersonating an account for the purpose of 17787* static calls or estimating gas, but does not allow sending transactions. 17788*/ 17789var VoidSigner = class VoidSigner extends AbstractSigner { 17790 /** 17791 * The signer address. 17792 */ 17793 address; 17794 /** 17795 * Creates a new **VoidSigner** with %%address%% attached to 17796 * %%provider%%. 17797 */ 17798 constructor(address, provider) { 17799 super(provider); 17800 defineProperties(this, { address }); 17801 } 17802 async getAddress() { 17803 return this.address; 17804 } 17805 connect(provider) { 17806 return new VoidSigner(this.address, provider); 17807 } 17808 #throwUnsupported(suffix, operation) { 17809 assert(false, `VoidSigner cannot sign ${suffix}`, "UNSUPPORTED_OPERATION", { operation }); 17810 } 17811 async signTransaction(tx) { 17812 this.#throwUnsupported("transactions", "signTransaction"); 17813 } 17814 async signMessage(message) { 17815 this.#throwUnsupported("messages", "signMessage"); 17816 } 17817 async signTypedData(domain, types, value) { 17818 this.#throwUnsupported("typed-data", "signTypedData"); 17819 } 17820}; 17821//#endregion 17822//#region node_modules/ethers/lib.esm/providers/community.js 17823/** 17824* There are many awesome community services that provide Ethereum 17825* nodes both for developers just starting out and for large-scale 17826* communities. 17827* 17828* @_section: api/providers/thirdparty: Community Providers [thirdparty] 17829*/ 17830var shown = /* @__PURE__ */ new Set(); 17831/** 17832* Displays a warning in the console when the community resource is 17833* being used too heavily by the app, recommending the developer 17834* acquire their own credentials instead of using the community 17835* credentials. 17836* 17837* The notification will only occur once per service. 17838*/ 17839function showThrottleMessage(service) { 17840 if (shown.has(service)) return; 17841 shown.add(service); 17842 console.log("========= NOTICE ========="); 17843 console.log(`Request-Rate Exceeded for ${service} (this message will not be repeated)`); 17844 console.log(""); 17845 console.log("The default API keys for each service are provided as a highly-throttled,"); 17846 console.log("community resource for low-traffic projects and early prototyping."); 17847 console.log(""); 17848 console.log("While your application will continue to function, we highly recommended"); 17849 console.log("signing up for your own API keys to improve performance, increase your"); 17850 console.log("request rate/limit and enable other perks, such as metrics and advanced APIs."); 17851 console.log(""); 17852 console.log("For more details: https://docs.ethers.org/api-keys/"); 17853 console.log("=========================="); 17854} 17855//#endregion
17856//#region node_modules/ethers/lib.esm/providers/subscriber-filterid.js 17857function copy(obj) { 17858 return JSON.parse(JSON.stringify(obj)); 17859} 17860/** 17861* Some backends support subscribing to events using a Filter ID. 17862* 17863* When subscribing with this technique, the node issues a unique 17864* //Filter ID//. At this point the node dedicates resources to 17865* the filter, so that periodic calls to follow up on the //Filter ID// 17866* will receive any events since the last call. 17867* 17868* @_docloc: api/providers/abstract-provider 17869*/ 17870var FilterIdSubscriber = class { 17871 #provider; 17872 #filterIdPromise; 17873 #poller; 17874 #running; 17875 #network; 17876 #hault; 17877 /** 17878 * Creates a new **FilterIdSubscriber** which will used [[_subscribe]] 17879 * and [[_emitResults]] to setup the subscription and provide the event 17880 * to the %%provider%%. 17881 */ 17882 constructor(provider) { 17883 this.#provider = provider; 17884 this.#filterIdPromise = null; 17885 this.#poller = this.#poll.bind(this); 17886 this.#running = false; 17887 this.#network = null; 17888 this.#hault = false; 17889 } 17890 /** 17891 * Sub-classes **must** override this to begin the subscription. 17892 */ 17893 _subscribe(provider) { 17894 throw new Error("subclasses must override this"); 17895 } 17896 /** 17897 * Sub-classes **must** override this handle the events. 17898 */ 17899 _emitResults(provider, result) { 17900 throw new Error("subclasses must override this"); 17901 } 17902 /** 17903 * Sub-classes **must** override this handle recovery on errors. 17904 */ 17905 _recover(provider) { 17906 throw new Error("subclasses must override this"); 17907 } 17908 async #poll(blockNumber) { 17909 try { 17910 if (this.#filterIdPromise == null) this.#filterIdPromise = this._subscribe(this.#provider); 17911 let filterId = null; 17912 try { 17913 filterId = await this.#filterIdPromise; 17914 } catch (error) { 17915 if (!isError(error, "UNSUPPORTED_OPERATION") || error.operation !== "eth_newFilter") throw error; 17916 } 17917 if (filterId == null) { 17918 this.#filterIdPromise = null; 17919 this.#provider._recoverSubscriber(this, this._recover(this.#provider)); 17920 return; 17921 } 17922 const network = await this.#provider.getNetwork(); 17923 if (!this.#network) this.#network = network; 17924 if (this.#network.chainId !== network.chainId) throw new Error("chaid changed"); 17925 if (this.#hault) return; 17926 const result = await this.#provider.send("eth_getFilterChanges", [filterId]); 17927 await this._emitResults(this.#provider, result); 17928 } catch (error) { 17929 console.log("@TODO", error); 17930 } 17931 this.#provider.once("block", this.#poller); 17932 } 17933 #teardown() { 17934 const filterIdPromise = this.#filterIdPromise; 17935 if (filterIdPromise) { 17936 this.#filterIdPromise = null; 17937 filterIdPromise.then((filterId) => { 17938 if (this.#provider.destroyed) return; 17939 this.#provider.send("eth_uninstallFilter", [filterId]); 17940 }); 17941 } 17942 } 17943 start() { 17944 if (this.#running) return; 17945 this.#running = true; 17946 this.#poll(-2); 17947 } 17948 stop() { 17949 if (!this.#running) return; 17950 this.#running = false; 17951 this.#hault = true; 17952 this.#teardown(); 17953 this.#provider.off("block", this.#poller); 17954 } 17955 pause(dropWhilePaused) { 17956 if (dropWhilePaused) this.#teardown(); 17957 this.#provider.off("block", this.#poller); 17958 } 17959 resume() { 17960 this.start(); 17961 } 17962}; 17963/** 17964* A **FilterIdSubscriber** for receiving contract events. 17965* 17966* @_docloc: api/providers/abstract-provider 17967*/ 17968var FilterIdEventSubscriber = class extends FilterIdSubscriber { 17969 #event; 17970 /** 17971 * Creates a new **FilterIdEventSubscriber** attached to %%provider%% 17972 * listening for %%filter%%. 17973 */ 17974 constructor(provider, filter) { 17975 super(provider); 17976 this.#event = copy(filter); 17977 } 17978 _recover(provider) { 17979 return new PollingEventSubscriber(provider, this.#event); 17980 } 17981 async _subscribe(provider) { 17982 return await provider.send("eth_newFilter", [this.#event]); 17983 } 17984 async _emitResults(provider, results) { 17985 for (const result of results) provider.emit(this.#event, provider._wrapLog(result, provider._network)); 17986 } 17987}; 17988/** 17989* A **FilterIdSubscriber** for receiving pending transactions events. 17990* 17991* @_docloc: api/providers/abstract-provider 17992*/ 17993var FilterIdPendingSubscriber = class extends FilterIdSubscriber { 17994 async _subscribe(provider) { 17995 return await provider.send("eth_newPendingTransactionFilter", []); 17996 } 17997 async _emitResults(provider, results) { 17998 for (const result of results) provider.emit("pending", result); 17999 } 18000}; 18001//#endregion
18002//#region node_modules/ethers/lib.esm/providers/provider-jsonrpc.js 18003/** 18004* One of the most common ways to interact with the blockchain is 18005* by a node running a JSON-RPC interface which can be connected to, 18006* based on the transport, using: 18007* 18008* - HTTP or HTTPS - [[JsonRpcProvider]] 18009* - WebSocket - [[WebSocketProvider]] 18010* - IPC - [[IpcSocketProvider]] 18011* 18012* @_section: api/providers/jsonrpc:JSON-RPC Provider [about-jsonrpcProvider] 18013*/ 18014var Primitive = "bigint,boolean,function,number,string,symbol".split(/,/g); 18015function deepCopy(value) { 18016 if (value == null || Primitive.indexOf(typeof value) >= 0) return value; 18017 if (typeof value.getAddress === "function") return value; 18018 if (Array.isArray(value)) return value.map(deepCopy); 18019 if (typeof value === "object") return Object.keys(value).reduce((accum, key) => { 18020 accum[key] = value[key]; 18021 return accum; 18022 }, {}); 18023 throw new Error(`should not happen: ${value} (${typeof value})`); 18024} 18025function stall$3(duration) { 18026 return new Promise((resolve) => { 18027 setTimeout(resolve, duration); 18028 }); 18029} 18030function getLowerCase(value) { 18031 if (value) return value.toLowerCase(); 18032 return value; 18033} 18034function isPollable(value) { 18035 return value && typeof value.pollingInterval === "number"; 18036} 18037var defaultOptions = { 18038 polling: false, 18039 staticNetwork: null, 18040 batchStallTime: 10, 18041 batchMaxSize: 1 << 20, 18042 batchMaxCount: 100, 18043 cacheTimeout: 250, 18044 pollingInterval: 4e3 18045}; 18046var JsonRpcSigner = class extends AbstractSigner { 18047 address; 18048 constructor(provider, address) { 18049 super(provider); 18050 address = getAddress(address); 18051 defineProperties(this, { address }); 18052 } 18053 connect(provider) { 18054 assert(false, "cannot reconnect JsonRpcSigner", "UNSUPPORTED_OPERATION", { operation: "signer.connect" }); 18055 } 18056 async getAddress() { 18057 return this.address; 18058 } 18059 async populateTransaction(tx) { 18060 return await this.populateCall(tx); 18061 } 18062 async sendUncheckedTransaction(_tx) { 18063 const tx = deepCopy(_tx); 18064 const promises = []; 18065 if (tx.from) { 18066 const _from = tx.from; 18067 promises.push((async () => { 18068 const from = await resolveAddress(_from, this.provider); 18069 assertArgument(from != null && from.toLowerCase() === this.address.toLowerCase(), "from address mismatch", "transaction", _tx); 18070 tx.from = from; 18071 })()); 18072 } else tx.from = this.address; 18073 if (tx.gasLimit == null) promises.push((async () => { 18074 tx.gasLimit = await this.provider.estimateGas({ 18075 ...tx, 18076 from: this.address 18077 }); 18078 })()); 18079 if (tx.to != null) { 18080 const _to = tx.to; 18081 promises.push((async () => { 18082 tx.to = await resolveAddress(_to, this.provider); 18083 })()); 18084 } 18085 if (promises.length) await Promise.all(promises); 18086 const hexTx = this.provider.getRpcTransaction(tx); 18087 return this.provider.send("eth_sendTransaction", [hexTx]); 18088 } 18089 async sendTransaction(tx) { 18090 const blockNumber = await this.provider.getBlockNumber(); 18091 const hash = await this.sendUncheckedTransaction(tx); 18092 return await new Promise((resolve, reject) => { 18093 const timeouts = [1e3, 100]; 18094 let invalids = 0; 18095 const checkTx = async () => { 18096 try { 18097 const tx = await this.provider.getTransaction(hash); 18098 if (tx != null) { 18099 resolve(tx.replaceableTransaction(blockNumber)); 18100 return; 18101 } 18102 } catch (error) { 18103 if (isError(error, "CANCELLED") || isError(error, "BAD_DATA") || isError(error, "NETWORK_ERROR") || isError(error, "UNSUPPORTED_OPERATION")) { 18104 if (error.info == null) error.info = {}; 18105 error.info.sendTransactionHash = hash; 18106 reject(error); 18107 return; 18108 } 18109 if (isError(error, "INVALID_ARGUMENT")) { 18110 invalids++; 18111 if (error.info == null) error.info = {}; 18112 error.info.sendTransactionHash = hash; 18113 if (invalids > 10) { 18114 reject(error); 18115 return; 18116 } 18117 } 18118 this.provider.emit("error", makeError("failed to fetch transation after sending (will try again)", "UNKNOWN_ERROR", { error })); 18119 } 18120 this.provider._setTimeout(() => { 18121 checkTx(); 18122 }, timeouts.pop() || 4e3); 18123 }; 18124 checkTx(); 18125 }); 18126 } 18127 async signTransaction(_tx) { 18128 const tx = deepCopy(_tx); 18129 if (tx.from) { 18130 const from = await resolveAddress(tx.from, this.provider); 18131 assertArgument(from != null && from.toLowerCase() === this.address.toLowerCase(), "from address mismatch", "transaction", _tx); 18132 tx.from = from; 18133 } else tx.from = this.address; 18134 const hexTx = this.provider.getRpcTransaction(tx); 18135 return await this.provider.send("eth_signTransaction", [hexTx]); 18136 } 18137 async signMessage(_message) { 18138 const message = typeof _message === "string" ? toUtf8Bytes(_message) : _message; 18139 return await this.provider.send("personal_sign", [hexlify(message), this.address.toLowerCase()]); 18140 } 18141 async signTypedData(domain, types, _value) { 18142 const value = deepCopy(_value); 18143 const populated = await TypedDataEncoder.resolveNames(domain, types, value, async (value) => { 18144 const address = await resolveAddress(value); 18145 assertArgument(address != null, "TypedData does not support null address", "value", value); 18146 return address; 18147 }); 18148 return await this.provider.send("eth_signTypedData_v4", [this.address.toLowerCase(), JSON.stringify(TypedDataEncoder.getPayload(populated.domain, types, populated.value))]); 18149 } 18150 async unlock(password) { 18151 return this.provider.send("personal_unlockAccount", [ 18152 this.address.toLowerCase(), 18153 password, 18154 null 18155 ]); 18156 } 18157 async _legacySignMessage(_message) { 18158 const message = typeof _message === "string" ? toUtf8Bytes(_message) : _message; 18159 return await this.provider.send("eth_sign", [this.address.toLowerCase(), hexlify(message)]); 18160 } 18161}; 18162/** 18163* The JsonRpcApiProvider is an abstract class and **MUST** be 18164* sub-classed. 18165* 18166* It provides the base for all JSON-RPC-based Provider interaction. 18167* 18168* Sub-classing Notes: 18169* - a sub-class MUST override _send 18170* - a sub-class MUST call the `_start()` method once connected 18171*/ 18172var JsonRpcApiProvider = class extends AbstractProvider { 18173 #options; 18174 #nextId; 18175 #payloads; 18176 #drainTimer; 18177 #notReady; 18178 #network; 18179 #pendingDetectNetwork; 18180 #scheduleDrain() { 18181 if (this.#drainTimer) return; 18182 const stallTime = this._getOption("batchMaxCount") === 1 ? 0 : this._getOption("batchStallTime"); 18183 this.#drainTimer = setTimeout(() => { 18184 this.#drainTimer = null; 18185 const payloads = this.#payloads; 18186 this.#payloads = []; 18187 while (payloads.length) { 18188 const batch = [payloads.shift()]; 18189 while (payloads.length) { 18190 if (batch.length === this.#options.batchMaxCount) break; 18191 batch.push(payloads.shift()); 18192 if (JSON.stringify(batch.map((p) => p.payload)).length > this.#options.batchMaxSize) { 18193 payloads.unshift(batch.pop()); 18194 break; 18195 } 18196 } 18197 (async () => { 18198 const payload = batch.length === 1 ? batch[0].payload : batch.map((p) => p.payload);
vendor: 2,536 bytes, lines 18199-18284
18199 this.emit("debug", { 18200 action: "sendRpcPayload", 18201 payload 18202 }); 18203 try { 18204 const result = await this._send(payload); 18205 this.emit("debug", { 18206 action: "receiveRpcResult", 18207 result 18208 }); 18209 for (const { resolve, reject, payload } of batch) { 18210 if (this.destroyed) { 18211 reject(makeError("provider destroyed; cancelled request", "UNSUPPORTED_OPERATION", { operation: payload.method })); 18212 continue; 18213 } 18214 const resp = result.filter((r) => r.id === payload.id)[0]; 18215 if (resp == null) { 18216 const error = makeError("missing response for request", "BAD_DATA", { 18217 value: result, 18218 info: { payload } 18219 }); 18220 this.emit("error", error); 18221 reject(error); 18222 continue; 18223 } 18224 if ("error" in resp) { 18225 reject(this.getRpcError(payload, resp)); 18226 continue; 18227 } 18228 resolve(resp.result); 18229 } 18230 } catch (error) { 18231 this.emit("debug", { 18232 action: "receiveRpcError", 18233 error 18234 }); 18235 for (const { reject } of batch) reject(error); 18236 } 18237 })(); 18238 } 18239 }, stallTime); 18240 } 18241 constructor(network, options) { 18242 super(network, options); 18243 this.#nextId = 1; 18244 this.#options = Object.assign({}, defaultOptions, options || {}); 18245 this.#payloads = []; 18246 this.#drainTimer = null; 18247 this.#network = null; 18248 this.#pendingDetectNetwork = null; 18249 { 18250 let resolve = null; 18251 const promise = new Promise((_resolve) => { 18252 resolve = _resolve; 18253 }); 18254 this.#notReady = { 18255 promise, 18256 resolve 18257 }; 18258 } 18259 const staticNetwork = this._getOption("staticNetwork"); 18260 if (typeof staticNetwork === "boolean") { 18261 assertArgument(!staticNetwork || network !== "any", "staticNetwork cannot be used on special network 'any'", "options", options); 18262 if (staticNetwork && network != null) this.#network = Network.from(network); 18263 } else if (staticNetwork) { 18264 assertArgument(network == null || staticNetwork.matches(network), "staticNetwork MUST match network object", "options", options); 18265 this.#network = staticNetwork; 18266 } 18267 } 18268 /** 18269 * Returns the value associated with the option %%key%%. 18270 * 18271 * Sub-classes can use this to inquire about configuration options. 18272 */ 18273 _getOption(key) { 18274 return this.#options[key]; 18275 } 18276 /** 18277 * Gets the [[Network]] this provider has committed to. On each call, the network 18278 * is detected, and if it has changed, the call will reject. 18279 */ 18280 get _network() { 18281 assert(this.#network, "network is not available yet", "NETWORK_ERROR"); 18282 return this.#network; 18283 } 18284 /**
18285 * Resolves to the non-normalized value by performing %%req%%. 18286 * 18287 * Sub-classes may override this to modify behavior of actions, 18288 * and should generally call ``super._perform`` as a fallback. 18289 */ 18290 async _perform(req) { 18291 if (req.method === "call" || req.method === "estimateGas") { 18292 let tx = req.transaction; 18293 if (tx && tx.type != null && getBigInt(tx.type)) { 18294 if (tx.maxFeePerGas == null && tx.maxPriorityFeePerGas == null) { 18295 const feeData = await this.getFeeData(); 18296 if (feeData.maxFeePerGas == null && feeData.maxPriorityFeePerGas == null) req = Object.assign({}, req, { transaction: Object.assign({}, tx, { type: void 0 }) }); 18297 } 18298 } 18299 } 18300 const request = this.getRpcRequest(req); 18301 if (request != null) return await this.send(request.method, request.args); 18302 return super._perform(req); 18303 } 18304 /** 18305 * Sub-classes may override this; it detects the *actual* network that 18306 * we are **currently** connected to. 18307 * 18308 * Keep in mind that [[send]] may only be used once [[ready]], otherwise the 18309 * _send primitive must be used instead. 18310 */ 18311 async _detectNetwork() { 18312 const network = this._getOption("staticNetwork"); 18313 if (network) { 18314 if (network === true) { 18315 if (this.#network) return this.#network; 18316 } else return network; 18317 } 18318 if (this.#pendingDetectNetwork) return await this.#pendingDetectNetwork; 18319 if (this.ready) { 18320 this.#pendingDetectNetwork = (async () => { 18321 try { 18322 const result = Network.from(getBigInt(await this.send("eth_chainId", []))); 18323 this.#pendingDetectNetwork = null; 18324 return result; 18325 } catch (error) { 18326 this.#pendingDetectNetwork = null; 18327 throw error; 18328 } 18329 })(); 18330 return await this.#pendingDetectNetwork; 18331 } 18332 this.#pendingDetectNetwork = (async () => { 18333 const payload = { 18334 id: this.#nextId++, 18335 method: "eth_chainId", 18336 params: [], 18337 jsonrpc: "2.0" 18338 }; 18339 this.emit("debug", { 18340 action: "sendRpcPayload", 18341 payload 18342 }); 18343 let result; 18344 try { 18345 result = (await this._send(payload))[0]; 18346 this.#pendingDetectNetwork = null; 18347 } catch (error) { 18348 this.#pendingDetectNetwork = null; 18349 this.emit("debug", { 18350 action: "receiveRpcError", 18351 error 18352 }); 18353 throw error; 18354 } 18355 this.emit("debug", { 18356 action: "receiveRpcResult", 18357 result 18358 }); 18359 if ("result" in result) return Network.from(getBigInt(result.result)); 18360 throw this.getRpcError(payload, result); 18361 })(); 18362 return await this.#pendingDetectNetwork; 18363 } 18364 /** 18365 * Sub-classes **MUST** call this. Until [[_start]] has been called, no calls 18366 * will be passed to [[_send]] from [[send]]. If it is overridden, then 18367 * ``super._start()`` **MUST** be called. 18368 * 18369 * Calling it multiple times is safe and has no effect. 18370 */ 18371 _start() { 18372 if (this.#notReady == null || this.#notReady.resolve == null) return; 18373 this.#notReady.resolve(); 18374 this.#notReady = null; 18375 (async () => { 18376 while (this.#network == null && !this.destroyed) try { 18377 this.#network = await this._detectNetwork(); 18378 } catch (error) { 18379 if (this.destroyed) break; 18380 console.log("JsonRpcProvider failed to detect network and cannot start up; retry in 1s (perhaps the URL is wrong or the node is not started)"); 18381 this.emit("error", makeError("failed to bootstrap network detection", "NETWORK_ERROR", { 18382 event: "initial-network-discovery", 18383 info: { error } 18384 })); 18385 await stall$3(1e3); 18386 } 18387 this.#scheduleDrain(); 18388 })(); 18389 } 18390 /** 18391 * Resolves once the [[_start]] has been called. This can be used in 18392 * sub-classes to defer sending data until the connection has been 18393 * established. 18394 */ 18395 async _waitUntilReady() { 18396 if (this.#notReady == null) return; 18397 return await this.#notReady.promise; 18398 } 18399 /** 18400 * Return a Subscriber that will manage the %%sub%%. 18401 * 18402 * Sub-classes may override this to modify the behavior of 18403 * subscription management. 18404 */ 18405 _getSubscriber(sub) { 18406 if (sub.type === "pending") return new FilterIdPendingSubscriber(this); 18407 if (sub.type === "event") { 18408 if (this._getOption("polling")) return new PollingEventSubscriber(this, sub.filter); 18409 return new FilterIdEventSubscriber(this, sub.filter); 18410 } 18411 if (sub.type === "orphan" && sub.filter.orphan === "drop-log") return new UnmanagedSubscriber("orphan"); 18412 return super._getSubscriber(sub); 18413 } 18414 /** 18415 * Returns true only if the [[_start]] has been called. 18416 */ 18417 get ready() { 18418 return this.#notReady == null; 18419 }
18420 /** 18421 * Returns %%tx%% as a normalized JSON-RPC transaction request, 18422 * which has all values hexlified and any numeric values converted 18423 * to Quantity values. 18424 */ 18425 getRpcTransaction(tx) { 18426 const result = {}; 18427 [ 18428 "chainId", 18429 "gasLimit", 18430 "gasPrice", 18431 "type", 18432 "maxFeePerGas", 18433 "maxPriorityFeePerGas", 18434 "nonce", 18435 "value" 18436 ].forEach((key) => { 18437 if (tx[key] == null) return; 18438 let dstKey = key; 18439 if (key === "gasLimit") dstKey = "gas"; 18440 result[dstKey] = toQuantity(getBigInt(tx[key], `tx.${key}`)); 18441 }); 18442 [ 18443 "from", 18444 "to", 18445 "data" 18446 ].forEach((key) => { 18447 if (tx[key] == null) return; 18448 result[key] = hexlify(tx[key]); 18449 }); 18450 if (tx.accessList) result["accessList"] = accessListify(tx.accessList); 18451 if (tx.blobVersionedHashes) result["blobVersionedHashes"] = tx.blobVersionedHashes.map((h) => h.toLowerCase()); 18452 if (tx.authorizationList) result["authorizationList"] = tx.authorizationList.map((_a) => { 18453 const a = authorizationify(_a); 18454 return { 18455 address: a.address, 18456 nonce: toQuantity(a.nonce), 18457 chainId: toQuantity(a.chainId), 18458 yParity: toQuantity(a.signature.yParity), 18459 r: toQuantity(a.signature.r), 18460 s: toQuantity(a.signature.s) 18461 }; 18462 }); 18463 return result; 18464 } 18465 /** 18466 * Returns the request method and arguments required to perform 18467 * %%req%%. 18468 */ 18469 getRpcRequest(req) { 18470 switch (req.method) { 18471 case "chainId": return { 18472 method: "eth_chainId", 18473 args: [] 18474 }; 18475 case "getBlockNumber": return { 18476 method: "eth_blockNumber", 18477 args: [] 18478 }; 18479 case "getGasPrice": return { 18480 method: "eth_gasPrice", 18481 args: [] 18482 }; 18483 case "getPriorityFee": return { 18484 method: "eth_maxPriorityFeePerGas", 18485 args: [] 18486 }; 18487 case "getBalance": return { 18488 method: "eth_getBalance", 18489 args: [getLowerCase(req.address), req.blockTag] 18490 }; 18491 case "getTransactionCount": return { 18492 method: "eth_getTransactionCount", 18493 args: [getLowerCase(req.address), req.blockTag] 18494 }; 18495 case "getCode": return { 18496 method: "eth_getCode", 18497 args: [getLowerCase(req.address), req.blockTag] 18498 }; 18499 case "getStorage": return { 18500 method: "eth_getStorageAt", 18501 args: [ 18502 getLowerCase(req.address), 18503 "0x" + req.position.toString(16), 18504 req.blockTag 18505 ] 18506 }; 18507 case "broadcastTransaction": return { 18508 method: "eth_sendRawTransaction", 18509 args: [req.signedTransaction] 18510 }; 18511 case "getBlock": 18512 if ("blockTag" in req) return { 18513 method: "eth_getBlockByNumber", 18514 args: [req.blockTag, !!req.includeTransactions] 18515 }; 18516 else if ("blockHash" in req) return { 18517 method: "eth_getBlockByHash", 18518 args: [req.blockHash, !!req.includeTransactions] 18519 }; 18520 break; 18521 case "getTransaction": return { 18522 method: "eth_getTransactionByHash", 18523 args: [req.hash] 18524 }; 18525 case "getTransactionReceipt": return { 18526 method: "eth_getTransactionReceipt", 18527 args: [req.hash] 18528 }; 18529 case "call": return { 18530 method: "eth_call", 18531 args: [this.getRpcTransaction(req.transaction), req.blockTag] 18532 }; 18533 case "estimateGas": return { 18534 method: "eth_estimateGas", 18535 args: [this.getRpcTransaction(req.transaction)] 18536 }; 18537 case "getLogs": 18538 if (req.filter && req.filter.address != null) { 18539 if (Array.isArray(req.filter.address)) req.filter.address = req.filter.address.map(getLowerCase); 18540 else req.filter.address = getLowerCase(req.filter.address); 18541 } 18542 return { 18543 method: "eth_getLogs", 18544 args: [req.filter] 18545 }; 18546 } 18547 return null; 18548 } 18549 /** 18550 * Returns an ethers-style Error for the given JSON-RPC error 18551 * %%payload%%, coalescing the various strings and error shapes 18552 * that different nodes return, coercing them into a machine-readable 18553 * standardized error. 18554 */ 18555 getRpcError(payload, _error) { 18556 const { method } = payload; 18557 const { error } = _error; 18558 if (method === "eth_estimateGas" && error.message) { 18559 const msg = error.message; 18560 if (!msg.match(/revert/i) && msg.match(/insufficient funds/i)) return makeError("insufficient funds", "INSUFFICIENT_FUNDS", { 18561 transaction: payload.params[0], 18562 info: { 18563 payload, 18564 error 18565 } 18566 }); 18567 else if (msg.match(/nonce/i) && msg.match(/too low/i)) return makeError("nonce has already been used", "NONCE_EXPIRED", { 18568 transaction: payload.params[0], 18569 info: { 18570 payload, 18571 error 18572 } 18573 }); 18574 } 18575 if (method === "eth_call" || method === "eth_estimateGas") { 18576 const result = spelunkData(error); 18577 const e = AbiCoder.getBuiltinCallException(method === "eth_call" ? "call" : "estimateGas", payload.params[0], result ? result.data : null); 18578 e.info = { 18579 error, 18580 payload 18581 }; 18582 return e; 18583 } 18584 const message = JSON.stringify(spelunkMessage(error)); 18585 if (typeof error.message === "string" && error.message.match(/user denied|ethers-user-denied/i)) return makeError(`user rejected action`, "ACTION_REJECTED", { 18586 action: { 18587 eth_sign: "signMessage", 18588 personal_sign: "signMessage", 18589 eth_signTypedData_v4: "signTypedData", 18590 eth_signTransaction: "signTransaction", 18591 eth_sendTransaction: "sendTransaction", 18592 eth_requestAccounts: "requestAccess", 18593 wallet_requestAccounts: "requestAccess" 18594 }[method] || "unknown", 18595 reason: "rejected", 18596 info: { 18597 payload, 18598 error 18599 } 18600 }); 18601 if (method === "eth_sendRawTransaction" || method === "eth_sendTransaction") { 18602 const transaction = payload.params[0]; 18603 if (message.match(/insufficient funds|base fee exceeds gas limit/i)) return makeError("insufficient funds for intrinsic transaction cost", "INSUFFICIENT_FUNDS", { 18604 transaction, 18605 info: { error } 18606 }); 18607 if (message.match(/nonce/i) && message.match(/too low/i)) return makeError("nonce has already been used", "NONCE_EXPIRED", { 18608 transaction, 18609 info: { error } 18610 }); 18611 if (message.match(/replacement transaction/i) && message.match(/underpriced/i)) return makeError("replacement fee too low", "REPLACEMENT_UNDERPRICED", { 18612 transaction, 18613 info: { error } 18614 }); 18615 if (message.match(/only replay-protected/i)) return makeError("legacy pre-eip-155 transactions not supported", "UNSUPPORTED_OPERATION", { 18616 operation: method, 18617 info: { 18618 transaction, 18619 info: { error } 18620 } 18621 }); 18622 } 18623 let unsupported = !!message.match(/the method .* does not exist/i); 18624 if (!unsupported) { 18625 if (error && error.details && error.details.startsWith("Unauthorized method:")) unsupported = true; 18626 } 18627 if (unsupported) return makeError("unsupported operation", "UNSUPPORTED_OPERATION", { 18628 operation: payload.method, 18629 info: { 18630 error, 18631 payload 18632 } 18633 }); 18634 return makeError("could not coalesce error", "UNKNOWN_ERROR", { 18635 error, 18636 payload 18637 }); 18638 } 18639 /** 18640 * Requests the %%method%% with %%params%% via the JSON-RPC protocol 18641 * over the underlying channel. This can be used to call methods 18642 * on the backend that do not have a high-level API within the Provider 18643 * API. 18644 * 18645 * This method queues requests according to the batch constraints 18646 * in the options, assigns the request a unique ID. 18647 * 18648 * **Do NOT override** this method in sub-classes; instead 18649 * override [[_send]] or force the options values in the 18650 * call to the constructor to modify this method's behavior. 18651 */ 18652 send(method, params) { 18653 if (this.destroyed) return Promise.reject(makeError("provider destroyed; cancelled request", "UNSUPPORTED_OPERATION", { operation: method })); 18654 const id = this.#nextId++; 18655 const promise = new Promise((resolve, reject) => { 18656 this.#payloads.push({ 18657 resolve, 18658 reject, 18659 payload: { 18660 method, 18661 params, 18662 id, 18663 jsonrpc: "2.0" 18664 } 18665 }); 18666 }); 18667 this.#scheduleDrain(); 18668 return promise; 18669 }
18670 /** 18671 * Resolves to the [[Signer]] account for %%address%% managed by 18672 * the client. 18673 * 18674 * If the %%address%% is a number, it is used as an index in the 18675 * the accounts from [[listAccounts]]. 18676 * 18677 * This can only be used on clients which manage accounts (such as 18678 * Geth with imported account or MetaMask). 18679 * 18680 * Throws if the account doesn't exist. 18681 */ 18682 async getSigner(address) { 18683 if (address == null) address = 0; 18684 const accountsPromise = this.send("eth_accounts", []); 18685 if (typeof address === "number") { 18686 const accounts = await accountsPromise; 18687 if (address >= accounts.length) throw new Error("no such account"); 18688 return new JsonRpcSigner(this, accounts[address]); 18689 } 18690 const { accounts } = await resolveProperties({ 18691 network: this.getNetwork(), 18692 accounts: accountsPromise 18693 }); 18694 address = getAddress(address); 18695 for (const account of accounts) if (getAddress(account) === address) return new JsonRpcSigner(this, address); 18696 throw new Error("invalid account"); 18697 } 18698 async listAccounts() { 18699 return (await this.send("eth_accounts", [])).map((a) => new JsonRpcSigner(this, a)); 18700 } 18701 destroy() { 18702 if (this.#drainTimer) { 18703 clearTimeout(this.#drainTimer); 18704 this.#drainTimer = null; 18705 } 18706 for (const { payload, reject } of this.#payloads) reject(makeError("provider destroyed; cancelled request", "UNSUPPORTED_OPERATION", { operation: payload.method })); 18707 this.#payloads = []; 18708 super.destroy(); 18709 } 18710}; 18711/** 18712* @_ignore: 18713*/ 18714var JsonRpcApiPollingProvider = class extends JsonRpcApiProvider { 18715 #pollingInterval; 18716 constructor(network, options) { 18717 super(network, options); 18718 let pollingInterval = this._getOption("pollingInterval"); 18719 if (pollingInterval == null) pollingInterval = defaultOptions.pollingInterval; 18720 this.#pollingInterval = pollingInterval; 18721 } 18722 _getSubscriber(sub) { 18723 const subscriber = super._getSubscriber(sub); 18724 if (isPollable(subscriber)) subscriber.pollingInterval = this.#pollingInterval; 18725 return subscriber; 18726 } 18727 /** 18728 * The polling interval (default: 4000 ms) 18729 */ 18730 get pollingInterval() { 18731 return this.#pollingInterval; 18732 } 18733 set pollingInterval(value) { 18734 if (!Number.isInteger(value) || value < 0) throw new Error("invalid interval"); 18735 this.#pollingInterval = value; 18736 this._forEachSubscriber((sub) => { 18737 if (isPollable(sub)) sub.pollingInterval = this.#pollingInterval; 18738 }); 18739 } 18740}; 18741/** 18742* The JsonRpcProvider is one of the most common Providers, 18743* which performs all operations over HTTP (or HTTPS) requests. 18744* 18745* Events are processed by polling the backend for the current block 18746* number; when it advances, all block-base events are then checked 18747* for updates. 18748*/ 18749var JsonRpcProvider = class extends JsonRpcApiPollingProvider { 18750 #connect; 18751 constructor(url, network, options) { 18752 if (url == null) url = "http://localhost:8545"; 18753 super(network, options); 18754 if (typeof url === "string") this.#connect = new FetchRequest(url); 18755 else this.#connect = url.clone(); 18756 } 18757 _getConnection() { 18758 return this.#connect.clone(); 18759 } 18760 async send(method, params) { 18761 await this._start(); 18762 return await super.send(method, params); 18763 } 18764 async _send(payload) { 18765 const request = this._getConnection(); 18766 request.body = JSON.stringify(payload); 18767 request.setHeader("content-type", "application/json"); 18768 const response = await request.send(); 18769 response.assertOk(); 18770 let resp = response.bodyJson;
18771 if (!Array.isArray(resp)) resp = [resp]; 18772 return resp; 18773 } 18774}; 18775function spelunkData(value) { 18776 if (value == null) return null; 18777 if (typeof value.message === "string" && value.message.match(/revert/i) && isHexString(value.data)) return { 18778 message: value.message, 18779 data: value.data 18780 }; 18781 if (typeof value === "object") { 18782 for (const key in value) { 18783 const result = spelunkData(value[key]); 18784 if (result) return result; 18785 } 18786 return null; 18787 } 18788 if (typeof value === "string") try { 18789 return spelunkData(JSON.parse(value)); 18790 } catch (error) {} 18791 return null; 18792} 18793function _spelunkMessage(value, result) { 18794 if (value == null) return; 18795 if (typeof value.message === "string") result.push(value.message); 18796 if (typeof value === "object") for (const key in value) _spelunkMessage(value[key], result); 18797 if (typeof value === "string") try { 18798 return _spelunkMessage(JSON.parse(value), result); 18799 } catch (error) {} 18800} 18801function spelunkMessage(value) { 18802 const result = []; 18803 _spelunkMessage(value, result); 18804 return result; 18805} 18806//#endregion 18807//#region node_modules/ethers/lib.esm/providers/provider-ankr.js 18808/** 18809* [[link-ankr]] provides a third-party service for connecting to 18810* various blockchains over JSON-RPC. 18811* 18812* **Supported Networks** 18813* 18814* - Ethereum Mainnet (``mainnet``) 18815* - Goerli Testnet (``goerli``) 18816* - Sepolia Testnet (``sepolia``) 18817* - Arbitrum (``arbitrum``) 18818* - Base (``base``) 18819* - Base Goerlia Testnet (``base-goerli``) 18820* - Base Sepolia Testnet (``base-sepolia``) 18821* - BNB (``bnb``) 18822* - BNB Testnet (``bnbt``) 18823* - Filecoin (``filecoin``) 18824* - Filecoin Calibration Testnet (``filecoin-calibration``) 18825* - Optimism (``optimism``) 18826* - Optimism Goerli Testnet (``optimism-goerli``) 18827* - Optimism Sepolia Testnet (``optimism-sepolia``) 18828* - Polygon (``matic``) 18829* - Polygon Mumbai Testnet (``matic-mumbai``) 18830* 18831* @_subsection: api/providers/thirdparty:Ankr [providers-ankr] 18832*/ 18833var defaultApiKey$2 = "9f7d929b018cdffb338517efa06f58359e86ff1ffd350bc889738523659e7972"; 18834function getHost$5(name) { 18835 switch (name) { 18836 case "mainnet": return "rpc.ankr.com/eth"; 18837 case "goerli": return "rpc.ankr.com/eth_goerli"; 18838 case "sepolia": return "rpc.ankr.com/eth_sepolia"; 18839 case "arbitrum": return "rpc.ankr.com/arbitrum"; 18840 case "base": return "rpc.ankr.com/base"; 18841 case "base-goerli": return "rpc.ankr.com/base_goerli"; 18842 case "base-sepolia": return "rpc.ankr.com/base_sepolia"; 18843 case "bnb": return "rpc.ankr.com/bsc"; 18844 case "bnbt": return "rpc.ankr.com/bsc_testnet_chapel"; 18845 case "filecoin": return "rpc.ankr.com/filecoin"; 18846 case "filecoin-calibration": return "rpc.ankr.com/filecoin_testnet"; 18847 case "matic": return "rpc.ankr.com/polygon"; 18848 case "matic-mumbai": return "rpc.ankr.com/polygon_mumbai"; 18849 case "optimism": return "rpc.ankr.com/optimism"; 18850 case "optimism-goerli": return "rpc.ankr.com/optimism_testnet"; 18851 case "optimism-sepolia": return "rpc.ankr.com/optimism_sepolia"; 18852 } 18853 assertArgument(false, "unsupported network", "network", name); 18854} 18855/** 18856* The **AnkrProvider** connects to the [[link-ankr]] 18857* JSON-RPC end-points. 18858* 18859* By default, a highly-throttled API key is used, which is 18860* appropriate for quick prototypes and simple scripts. To 18861* gain access to an increased rate-limit, it is highly 18862* recommended to [sign up here](link-ankr-signup). 18863*/ 18864var AnkrProvider = class AnkrProvider extends JsonRpcProvider { 18865 /** 18866 * The API key for the Ankr connection. 18867 */ 18868 apiKey; 18869 /** 18870 * Create a new **AnkrProvider**. 18871 * 18872 * By default connecting to ``mainnet`` with a highly throttled 18873 * API key. 18874 */ 18875 constructor(_network, apiKey) { 18876 if (_network == null) _network = "mainnet"; 18877 const network = Network.from(_network); 18878 if (apiKey == null) apiKey = defaultApiKey$2; 18879 const options = { 18880 polling: true, 18881 staticNetwork: network 18882 }; 18883 const request = AnkrProvider.getRequest(network, apiKey); 18884 super(request, network, options); 18885 defineProperties(this, { apiKey }); 18886 } 18887 _getProvider(chainId) { 18888 try { 18889 return new AnkrProvider(chainId, this.apiKey); 18890 } catch (error) {} 18891 return super._getProvider(chainId); 18892 } 18893 /** 18894 * Returns a prepared request for connecting to %%network%% with 18895 * %%apiKey%%. 18896 */
18897 static getRequest(network, apiKey) { 18898 if (apiKey == null) apiKey = defaultApiKey$2; 18899 const request = new FetchRequest(`https:/\/${getHost$5(network.name)}/${apiKey}`); 18900 request.allowGzip = true; 18901 if (apiKey === defaultApiKey$2) request.retryFunc = async (request, response, attempt) => { 18902 showThrottleMessage("AnkrProvider"); 18903 return true; 18904 }; 18905 return request; 18906 } 18907 getRpcError(payload, error) { 18908 if (payload.method === "eth_sendRawTransaction") { 18909 if (error && error.error && error.error.message === "INTERNAL_ERROR: could not replace existing tx") error.error.message = "replacement transaction underpriced"; 18910 } 18911 return super.getRpcError(payload, error); 18912 } 18913 isCommunityResource() { 18914 return this.apiKey === defaultApiKey$2; 18915 } 18916}; 18917//#endregion 18918//#region node_modules/ethers/lib.esm/providers/provider-alchemy.js 18919/** 18920* [[link-alchemy]] provides a third-party service for connecting to 18921* various blockchains over JSON-RPC. 18922* 18923* **Supported Networks** 18924* 18925* - Ethereum Mainnet (``mainnet``) 18926* - Goerli Testnet (``goerli``) 18927* - Sepolia Testnet (``sepolia``) 18928* - Arbitrum (``arbitrum``) 18929* - Arbitrum Goerli Testnet (``arbitrum-goerli``) 18930* - Arbitrum Sepolia Testnet (``arbitrum-sepolia``) 18931* - Base (``base``) 18932* - Base Goerlia Testnet (``base-goerli``) 18933* - Base Sepolia Testnet (``base-sepolia``) 18934* - Optimism (``optimism``) 18935* - Optimism Goerli Testnet (``optimism-goerli``) 18936* - Optimism Sepolia Testnet (``optimism-sepolia``) 18937* - Polygon (``matic``) 18938* - Polygon Amoy Testnet (``matic-amoy``) 18939* - Polygon Mumbai Testnet (``matic-mumbai``) 18940* 18941* @_subsection: api/providers/thirdparty:Alchemy [providers-alchemy] 18942*/ 18943var defaultApiKey$1 = "_gg7wSSi0KMBsdKnGVfHDueq6xMB9EkC"; 18944function getHost$4(name) { 18945 switch (name) { 18946 case "mainnet": return "eth-mainnet.g.alchemy.com"; 18947 case "goerli": return "eth-goerli.g.alchemy.com"; 18948 case "sepolia": return "eth-sepolia.g.alchemy.com"; 18949 case "arbitrum": return "arb-mainnet.g.alchemy.com"; 18950 case "arbitrum-goerli": return "arb-goerli.g.alchemy.com"; 18951 case "arbitrum-sepolia": return "arb-sepolia.g.alchemy.com"; 18952 case "base": return "base-mainnet.g.alchemy.com"; 18953 case "base-goerli": return "base-goerli.g.alchemy.com"; 18954 case "base-sepolia": return "base-sepolia.g.alchemy.com"; 18955 case "bnb": return "bnb-mainnet.g.alchemy.com"; 18956 case "bnbt": return "bnb-testnet.g.alchemy.com"; 18957 case "matic": return "polygon-mainnet.g.alchemy.com"; 18958 case "matic-amoy": return "polygon-amoy.g.alchemy.com"; 18959 case "matic-mumbai": return "polygon-mumbai.g.alchemy.com"; 18960 case "optimism": return "opt-mainnet.g.alchemy.com"; 18961 case "optimism-goerli": return "opt-goerli.g.alchemy.com"; 18962 case "optimism-sepolia": return "opt-sepolia.g.alchemy.com"; 18963 } 18964 assertArgument(false, "unsupported network", "network", name); 18965} 18966/** 18967* The **AlchemyProvider** connects to the [[link-alchemy]] 18968* JSON-RPC end-points. 18969* 18970* By default, a highly-throttled API key is used, which is 18971* appropriate for quick prototypes and simple scripts. To 18972* gain access to an increased rate-limit, it is highly 18973* recommended to [sign up here](link-alchemy-signup). 18974* 18975* @_docloc: api/providers/thirdparty 18976*/ 18977var AlchemyProvider = class AlchemyProvider extends JsonRpcProvider { 18978 apiKey; 18979 constructor(_network, apiKey) { 18980 if (_network == null) _network = "mainnet"; 18981 const network = Network.from(_network); 18982 if (apiKey == null) apiKey = defaultApiKey$1; 18983 const request = AlchemyProvider.getRequest(network, apiKey); 18984 super(request, network, { staticNetwork: network }); 18985 defineProperties(this, { apiKey }); 18986 } 18987 _getProvider(chainId) { 18988 try { 18989 return new AlchemyProvider(chainId, this.apiKey); 18990 } catch (error) {} 18991 return super._getProvider(chainId); 18992 } 18993 async _perform(req) { 18994 if (req.method === "getTransactionResult") { 18995 const { trace, tx } = await resolveProperties({ 18996 trace: this.send("trace_transaction", [req.hash]), 18997 tx: this.getTransaction(req.hash) 18998 }); 18999 if (trace == null || tx == null) return null; 19000 let data; 19001 let error = false; 19002 try { 19003 data = trace[0].result.output; 19004 error = trace[0].error === "Reverted"; 19005 } catch (error) {} 19006 if (data) { 19007 assert(!error, "an error occurred during transaction executions", "CALL_EXCEPTION", { 19008 action: "getTransactionResult", 19009 data, 19010 reason: null, 19011 transaction: tx, 19012 invocation: null, 19013 revert: null 19014 }); 19015 return data; 19016 } 19017 assert(false, "could not parse trace result", "BAD_DATA", { value: trace }); 19018 } 19019 return await super._perform(req); 19020 } 19021 isCommunityResource() { 19022 return this.apiKey === defaultApiKey$1; 19023 }
19024 static getRequest(network, apiKey) { 19025 if (apiKey == null) apiKey = defaultApiKey$1; 19026 const request = new FetchRequest(`https:/\/${getHost$4(network.name)}/v2/${apiKey}`); 19027 request.allowGzip = true; 19028 if (apiKey === defaultApiKey$1) request.retryFunc = async (request, response, attempt) => { 19029 showThrottleMessage("alchemy"); 19030 return true; 19031 }; 19032 return request; 19033 } 19034}; 19035//#endregion 19036//#region node_modules/ethers/lib.esm/providers/provider-chainstack.js 19037/** 19038* [[link-chainstack]] provides a third-party service for connecting to 19039* various blockchains over JSON-RPC. 19040* 19041* **Supported Networks** 19042* 19043* - Ethereum Mainnet (``mainnet``) 19044* - Arbitrum (``arbitrum``) 19045* - BNB Smart Chain Mainnet (``bnb``) 19046* - Polygon (``matic``) 19047* 19048* @_subsection: api/providers/thirdparty:Chainstack [providers-chainstack] 19049*/ 19050function getApiKey(name) { 19051 switch (name) { 19052 case "mainnet": return "39f1d67cedf8b7831010a665328c9197"; 19053 case "arbitrum": return "0550c209db33c3abf4cc927e1e18cea1"; 19054 case "bnb": return "98b5a77e531614387366f6fc5da097f8"; 19055 case "matic": return "cd9d4d70377471aa7c142ec4a4205249"; 19056 } 19057 assertArgument(false, "unsupported network", "network", name); 19058} 19059function getHost$3(name) { 19060 switch (name) { 19061 case "mainnet": return "ethereum-mainnet.core.chainstack.com"; 19062 case "arbitrum": return "arbitrum-mainnet.core.chainstack.com"; 19063 case "bnb": return "bsc-mainnet.core.chainstack.com"; 19064 case "matic": return "polygon-mainnet.core.chainstack.com"; 19065 } 19066 assertArgument(false, "unsupported network", "network", name); 19067} 19068/** 19069* The **ChainstackProvider** connects to the [[link-chainstack]] 19070* JSON-RPC end-points. 19071* 19072* By default, a highly-throttled API key is used, which is 19073* appropriate for quick prototypes and simple scripts. To 19074* gain access to an increased rate-limit, it is highly 19075* recommended to [sign up here](link-chainstack). 19076*/ 19077var ChainstackProvider = class ChainstackProvider extends JsonRpcProvider { 19078 /** 19079 * The API key for the Chainstack connection. 19080 */ 19081 apiKey; 19082 /** 19083 * Creates a new **ChainstackProvider**. 19084 */ 19085 constructor(_network, apiKey) { 19086 if (_network == null) _network = "mainnet"; 19087 const network = Network.from(_network); 19088 if (apiKey == null) apiKey = getApiKey(network.name); 19089 const request = ChainstackProvider.getRequest(network, apiKey); 19090 super(request, network, { staticNetwork: network }); 19091 defineProperties(this, { apiKey }); 19092 } 19093 _getProvider(chainId) { 19094 try { 19095 return new ChainstackProvider(chainId, this.apiKey); 19096 } catch (error) {} 19097 return super._getProvider(chainId); 19098 } 19099 isCommunityResource() { 19100 return this.apiKey === getApiKey(this._network.name); 19101 } 19102 /** 19103 * Returns a prepared request for connecting to %%network%% 19104 * with %%apiKey%% and %%projectSecret%%. 19105 */ 19106 static getRequest(network, apiKey) { 19107 if (apiKey == null) apiKey = getApiKey(network.name); 19108 const request = new FetchRequest(`https:/\/${getHost$3(network.name)}/${apiKey}`); 19109 request.allowGzip = true; 19110 if (apiKey === getApiKey(network.name)) request.retryFunc = async (request, response, attempt) => { 19111 showThrottleMessage("ChainstackProvider"); 19112 return true; 19113 }; 19114 return request; 19115 } 19116}; 19117//#endregion 19118//#region node_modules/ethers/lib.esm/providers/provider-cloudflare.js 19119/** 19120* About Cloudflare 19121* 19122* @_subsection: api/providers/thirdparty:Cloudflare [providers-cloudflare] 19123*/ 19124/** 19125* About Cloudflare... 19126*/ 19127var CloudflareProvider = class extends JsonRpcProvider { 19128 constructor(_network) { 19129 if (_network == null) _network = "mainnet"; 19130 const network = Network.from(_network); 19131 assertArgument(network.name === "mainnet", "unsupported network", "network", _network); 19132 super("https://cloudflare-eth.com/", network, { staticNetwork: network }); 19133 } 19134}; 19135//#endregion 19136//#region node_modules/ethers/lib.esm/providers/provider-etherscan.js 19137/** 19138* [[link-etherscan]] provides a third-party service for connecting to 19139* various blockchains over a combination of JSON-RPC and custom API 19140* endpoints. 19141* 19142* **Supported Networks** 19143* 19144* - Ethereum Mainnet (``mainnet``) 19145* - Goerli Testnet (``goerli``) 19146* - Sepolia Testnet (``sepolia``) 19147* - Holesky Testnet (``holesky``) 19148* - Arbitrum (``arbitrum``) 19149* - Arbitrum Goerli Testnet (``arbitrum-goerli``) 19150* - Base (``base``) 19151* - Base Sepolia Testnet (``base-sepolia``) 19152* - BNB Smart Chain Mainnet (``bnb``) 19153* - BNB Smart Chain Testnet (``bnbt``) 19154* - Optimism (``optimism``) 19155* - Optimism Goerli Testnet (``optimism-goerli``) 19156* - Polygon (``matic``) 19157* - Polygon Mumbai Testnet (``matic-mumbai``) 19158* - Polygon Amoy Testnet (``matic-amoy``) 19159* 19160* @_subsection api/providers/thirdparty:Etherscan [providers-etherscan] 19161*/ 19162var Supported = "1 11155111 17000 560048 2741 11124 33111 33139 42170 42161 421614 43114 43113 8453 84532 80069 80094 199 1029 81457 168587773 56 97 42220 11142220 252 2523 100 999 737373 747474 59144 59141 5000 5003 43521 143 10143 1287 1284 1285 10 111
1916255420 204 5611 80002 137 534352 534351 1329 1328 146 14601 988 2201 1923 1924 167013 167000 130 1301 480 4801 51 50 324 300".split(/ /g); 19163var THROTTLE = 2e3; 19164function isPromise(value) { 19165 return value && typeof value.then === "function"; 19166} 19167var EtherscanPluginId = "org.ethers.plugins.provider.Etherscan"; 19168/** 19169* A Network can include an **EtherscanPlugin** to provide 19170* a custom base URL. 19171* 19172* @_docloc: api/providers/thirdparty:Etherscan 19173*/ 19174var EtherscanPlugin = class EtherscanPlugin extends NetworkPlugin { 19175 /** 19176 * The Etherscan API base URL. 19177 */ 19178 baseUrl; 19179 /** 19180 * Creates a new **EtherscanProvider** which will use 19181 * %%baseUrl%%. 19182 */ 19183 constructor(baseUrl) { 19184 super(EtherscanPluginId); 19185 defineProperties(this, { baseUrl }); 19186 } 19187 clone() { 19188 return new EtherscanPlugin(this.baseUrl); 19189 } 19190}; 19191var skipKeys = ["enableCcipRead"]; 19192var nextId = 1; 19193/** 19194* The **EtherscanBaseProvider** is the super-class of 19195* [[EtherscanProvider]], which should generally be used instead. 19196* 19197* Since the **EtherscanProvider** includes additional code for 19198* [[Contract]] access, in //rare cases// that contracts are not 19199* used, this class can reduce code size. 19200* 19201* @_docloc: api/providers/thirdparty:Etherscan 19202*/ 19203var EtherscanProvider = class extends AbstractProvider { 19204 /** 19205 * The connected network. 19206 */ 19207 network; 19208 /** 19209 * The API key or null if using the community provided bandwidth. 19210 */ 19211 apiKey; 19212 #plugin; 19213 /** 19214 * Creates a new **EtherscanBaseProvider**. 19215 */ 19216 constructor(_network, _apiKey) { 19217 const apiKey = _apiKey != null ? _apiKey : null; 19218 super(); 19219 const network = Network.from(_network); 19220 assertArgument(Supported.indexOf(`${network.chainId}`) >= 0, "unsupported network", "network", network); 19221 this.#plugin = network.getPlugin(EtherscanPluginId); 19222 defineProperties(this, { 19223 apiKey, 19224 network 19225 }); 19226 } 19227 /** 19228 * Returns the base URL. 19229 * 19230 * If an [[EtherscanPlugin]] is configured on the 19231 * [[EtherscanBaseProvider_network]], returns the plugin's 19232 * baseUrl. 19233 * 19234 * Deprecated; for Etherscan v2 the base is no longer a simply 19235 * host, but instead a URL including a chainId parameter. Changing 19236 * this to return a URL prefix could break some libraries, so it 19237 * is left intact but will be removed in the future as it is unused. 19238 */ 19239 getBaseUrl() { 19240 if (this.#plugin) return this.#plugin.baseUrl; 19241 switch (this.network.name) { 19242 case "mainnet": return "https://api.etherscan.io"; 19243 case "goerli": return "https://api-goerli.etherscan.io"; 19244 case "sepolia": return "https://api-sepolia.etherscan.io"; 19245 case "holesky": return "https://api-holesky.etherscan.io"; 19246 case "arbitrum": return "https://api.arbiscan.io"; 19247 case "arbitrum-goerli": return "https://api-goerli.arbiscan.io"; 19248 case "base": return "https://api.basescan.org"; 19249 case "base-sepolia": return "https://api-sepolia.basescan.org"; 19250 case "bnb": return "https://api.bscscan.com"; 19251 case "bnbt": return "https://api-testnet.bscscan.com"; 19252 case "matic": return "https://api.polygonscan.com"; 19253 case "matic-amoy": return "https://api-amoy.polygonscan.com"; 19254 case "matic-mumbai": return "https://api-testnet.polygonscan.com"; 19255 case "optimism": return "https://api-optimistic.etherscan.io"; 19256 case "optimism-goerli": return "https://api-goerli-optimistic.etherscan.io"; 19257 } 19258 assertArgument(false, "unsupported network", "network", this.network); 19259 } 19260 /** 19261 * Returns the URL for the %%module%% and %%params%%. 19262 */ 19263 getUrl(module, params) { 19264 let query = Object.keys(params).reduce((accum, key) => { 19265 const value = params[key]; 19266 if (value != null) accum += `&${key}=${value}`; 19267 return accum; 19268 }, ""); 19269 if (this.apiKey) query += `&apikey=${this.apiKey}`; 19270 return `https:/\/api.etherscan.io/v2/api?chainid=${this.network.chainId}&module=${module}${query}`; 19271 } 19272 /** 19273 * Returns the URL for using POST requests. 19274 */ 19275 getPostUrl() { 19276 return `https:/\/api.etherscan.io/v2/api?chainid=${this.network.chainId}`; 19277 } 19278 /** 19279 * Returns the parameters for using POST requests. 19280 */ 19281 getPostData(module, params) { 19282 params.module = module; 19283 params.apikey = this.apiKey; 19284 params.chainid = this.network.chainId; 19285 return params; 19286 } 19287 async detectNetwork() { 19288 return this.network; 19289 } 19290 /** 19291 * Resolves to the result of calling %%module%% with %%params%%. 19292 * 19293 * If %%post%%, the request is made as a POST request. 19294 */ 19295 async fetch(module, params, post) { 19296 const id = nextId++; 19297 const url = post ? this.getPostUrl() : this.getUrl(module, params); 19298 const payload = post ? this.getPostData(module, params) : null;
19299 this.emit("debug", { 19300 action: "sendRequest", 19301 id, 19302 url, 19303 payload 19304 }); 19305 const request = new FetchRequest(url); 19306 request.setThrottleParams({ slotInterval: 1e3 }); 19307 request.retryFunc = (req, resp, attempt) => { 19308 if (this.isCommunityResource()) showThrottleMessage("Etherscan"); 19309 return Promise.resolve(true); 19310 }; 19311 request.processFunc = async (request, response) => { 19312 const result = response.hasBody() ? JSON.parse(toUtf8String(response.body)) : {}; 19313 const throttle = (typeof result.result === "string" ? result.result : "").toLowerCase().indexOf("rate limit") >= 0; 19314 if (module === "proxy") { 19315 if (result && result.status == 0 && result.message == "NOTOK" && throttle) { 19316 this.emit("debug", { 19317 action: "receiveError", 19318 id, 19319 reason: "proxy-NOTOK", 19320 error: result 19321 }); 19322 response.throwThrottleError(result.result, THROTTLE); 19323 } 19324 } else if (throttle) { 19325 this.emit("debug", { 19326 action: "receiveError", 19327 id, 19328 reason: "null result", 19329 error: result.result 19330 }); 19331 response.throwThrottleError(result.result, THROTTLE); 19332 } 19333 return response; 19334 }; 19335 if (payload) { 19336 request.setHeader("content-type", "application/x-www-form-urlencoded; charset=UTF-8"); 19337 request.body = Object.keys(payload).map((k) => `${k}=${payload[k]}`).join("&"); 19338 } 19339 const response = await request.send(); 19340 try { 19341 response.assertOk(); 19342 } catch (error) { 19343 this.emit("debug", { 19344 action: "receiveError", 19345 id, 19346 error, 19347 reason: "assertOk" 19348 }); 19349 assert(false, "response error", "SERVER_ERROR", { 19350 request, 19351 response 19352 }); 19353 } 19354 if (!response.hasBody()) { 19355 this.emit("debug", { 19356 action: "receiveError", 19357 id, 19358 error: "missing body", 19359 reason: "null body" 19360 }); 19361 assert(false, "missing response", "SERVER_ERROR", { 19362 request, 19363 response 19364 }); 19365 } 19366 const result = JSON.parse(toUtf8String(response.body)); 19367 if (module === "proxy") { 19368 if (result.jsonrpc != "2.0") { 19369 this.emit("debug", { 19370 action: "receiveError", 19371 id, 19372 result, 19373 reason: "invalid JSON-RPC" 19374 }); 19375 assert(false, "invalid JSON-RPC response (missing jsonrpc='2.0')", "SERVER_ERROR", { 19376 request, 19377 response, 19378 info: { result } 19379 }); 19380 } 19381 if (result.error) { 19382 this.emit("debug", { 19383 action: "receiveError", 19384 id, 19385 result, 19386 reason: "JSON-RPC error" 19387 }); 19388 assert(false, "error response", "SERVER_ERROR", { 19389 request, 19390 response, 19391 info: { result } 19392 }); 19393 } 19394 this.emit("debug", { 19395 action: "receiveRequest", 19396 id, 19397 result 19398 }); 19399 return result.result; 19400 } else { 19401 if (result.status == 0 && (result.message === "No records found" || result.message === "No transactions found")) { 19402 this.emit("debug", { 19403 action: "receiveRequest", 19404 id, 19405 result 19406 }); 19407 return result.result; 19408 } 19409 if (result.status != 1 || typeof result.message === "string" && !result.message.match(/^OK/)) { 19410 this.emit("debug", { 19411 action: "receiveError", 19412 id, 19413 result 19414 }); 19415 assert(false, "error response", "SERVER_ERROR", { 19416 request, 19417 response, 19418 info: { result } 19419 }); 19420 } 19421 this.emit("debug", { 19422 action: "receiveRequest", 19423 id, 19424 result 19425 }); 19426 return result.result; 19427 } 19428 } 19429 /** 19430 * Returns %%transaction%% normalized for the Etherscan API. 19431 */ 19432 _getTransactionPostData(transaction) { 19433 const result = {}; 19434 for (let key in transaction) { 19435 if (skipKeys.indexOf(key) >= 0) continue; 19436 if (transaction[key] == null) continue; 19437 let value = transaction[key]; 19438 if (key === "type" && value === 0) continue; 19439 if (key === "blockTag" && value === "latest") continue; 19440 if ({ 19441 type: true, 19442 gasLimit: true, 19443 gasPrice: true, 19444 maxFeePerGas: true, 19445 maxPriorityFeePerGas: true, 19446 nonce: true, 19447 value: true 19448 }[key]) value = toQuantity(value); 19449 else if (key === "accessList") value = "[" + accessListify(value).map((set) => { 19450 return `{address:"${set.address}",storageKeys:["${set.storageKeys.join("\",\"")}"]}`; 19451 }).join(",") + "]"; 19452 else if (key === "blobVersionedHashes") { 19453 if (value.length === 0) continue; 19454 assert(false, "Etherscan API does not support blobVersionedHashes", "UNSUPPORTED_OPERATION", { 19455 operation: "_getTransactionPostData", 19456 info: { transaction } 19457 }); 19458 } else value = hexlify(value); 19459 result[key] = value; 19460 } 19461 return result; 19462 }
19463 /** 19464 * Throws the normalized Etherscan error. 19465 */ 19466 _checkError(req, error, transaction) { 19467 let message = ""; 19468 if (isError(error, "SERVER_ERROR")) { 19469 try { 19470 message = error.info.result.error.message; 19471 } catch (e) {} 19472 if (!message) try { 19473 message = error.info.message; 19474 } catch (e) {} 19475 } 19476 if (req.method === "estimateGas") { 19477 if (!message.match(/revert/i) && message.match(/insufficient funds/i)) assert(false, "insufficient funds", "INSUFFICIENT_FUNDS", { transaction: req.transaction }); 19478 } 19479 if (req.method === "call" || req.method === "estimateGas") { 19480 if (message.match(/execution reverted/i)) { 19481 let data = ""; 19482 try { 19483 data = error.info.result.error.data; 19484 } catch (error) {} 19485 const e = AbiCoder.getBuiltinCallException(req.method, req.transaction, data); 19486 e.info = { 19487 request: req, 19488 error 19489 }; 19490 throw e; 19491 } 19492 } 19493 if (message) { 19494 if (req.method === "broadcastTransaction") { 19495 const transaction = Transaction.from(req.signedTransaction); 19496 if (message.match(/replacement/i) && message.match(/underpriced/i)) assert(false, "replacement fee too low", "REPLACEMENT_UNDERPRICED", { transaction }); 19497 if (message.match(/insufficient funds/)) assert(false, "insufficient funds for intrinsic transaction cost", "INSUFFICIENT_FUNDS", { transaction }); 19498 if (message.match(/same hash was already imported|transaction nonce is too low|nonce too low/)) assert(false, "nonce has already been used", "NONCE_EXPIRED", { transaction }); 19499 } 19500 } 19501 throw error; 19502 } 19503 async _detectNetwork() { 19504 return this.network; 19505 } 19506 async _perform(req) { 19507 switch (req.method) { 19508 case "chainId": return this.network.chainId; 19509 case "getBlockNumber": return this.fetch("proxy", { action: "eth_blockNumber" }); 19510 case "getGasPrice": return this.fetch("proxy", { action: "eth_gasPrice" }); 19511 case "getPriorityFee": if (this.network.name === "mainnet") return "1000000000"; 19512 else if (this.network.name === "optimism") return "1000000"; 19513 else throw new Error("fallback onto the AbstractProvider default"); 19514 case "getBalance": return this.fetch("account", { 19515 action: "balance", 19516 address: req.address, 19517 tag: req.blockTag 19518 }); 19519 case "getTransactionCount": return this.fetch("proxy", { 19520 action: "eth_getTransactionCount", 19521 address: req.address, 19522 tag: req.blockTag 19523 }); 19524 case "getCode": return this.fetch("proxy", { 19525 action: "eth_getCode", 19526 address: req.address, 19527 tag: req.blockTag 19528 }); 19529 case "getStorage": return this.fetch("proxy", { 19530 action: "eth_getStorageAt", 19531 address: req.address, 19532 position: req.position, 19533 tag: req.blockTag 19534 }); 19535 case "broadcastTransaction": return this.fetch("proxy", { 19536 action: "eth_sendRawTransaction", 19537 hex: req.signedTransaction 19538 }, true).catch((error) => { 19539 return this._checkError(req, error, req.signedTransaction); 19540 }); 19541 case "getBlock": 19542 if ("blockTag" in req) return this.fetch("proxy", { 19543 action: "eth_getBlockByNumber", 19544 tag: req.blockTag, 19545 boolean: req.includeTransactions ? "true" : "false" 19546 }); 19547 assert(false, "getBlock by blockHash not supported by Etherscan", "UNSUPPORTED_OPERATION", { operation: "getBlock(blockHash)" }); 19548 case "getTransaction": return this.fetch("proxy", { 19549 action: "eth_getTransactionByHash", 19550 txhash: req.hash 19551 }); 19552 case "getTransactionReceipt": return this.fetch("proxy", { 19553 action: "eth_getTransactionReceipt", 19554 txhash: req.hash 19555 }); 19556 case "call": { 19557 if (req.blockTag !== "latest") throw new Error("EtherscanProvider does not support blockTag for call"); 19558 const postData = this._getTransactionPostData(req.transaction); 19559 postData.module = "proxy"; 19560 postData.action = "eth_call"; 19561 try { 19562 return await this.fetch("proxy", postData, true); 19563 } catch (error) { 19564 return this._checkError(req, error, req.transaction); 19565 } 19566 } 19567 case "estimateGas": { 19568 const postData = this._getTransactionPostData(req.transaction); 19569 postData.module = "proxy"; 19570 postData.action = "eth_estimateGas"; 19571 try { 19572 return await this.fetch("proxy", postData, true); 19573 } catch (error) { 19574 return this._checkError(req, error, req.transaction); 19575 } 19576 } 19577 } 19578 return super._perform(req); 19579 } 19580 async getNetwork() { 19581 return this.network; 19582 } 19583 /** 19584 * Resolves to the current price of ether. 19585 * 19586 * This returns ``0`` on any network other than ``mainnet``. 19587 */ 19588 async getEtherPrice() { 19589 if (this.network.name !== "mainnet") return 0; 19590 return parseFloat((await this.fetch("stats", { action: "ethprice" })).ethusd); 19591 } 19592 /** 19593 * Resolves to a [Contract]] for %%address%%, using the 19594 * Etherscan API to retreive the Contract ABI. 19595 */ 19596 async getContract(_address) { 19597 let address = this._getAddress(_address);
19598 if (isPromise(address)) address = await address; 19599 try { 19600 const resp = await this.fetch("contract", { 19601 action: "getabi", 19602 address 19603 }); 19604 const abi = JSON.parse(resp); 19605 return new Contract(address, abi, this); 19606 } catch (error) { 19607 return null; 19608 } 19609 } 19610 isCommunityResource() { 19611 return this.apiKey == null; 19612 } 19613}; 19614//#endregion 19615//#region node_modules/ethers/lib.esm/providers/ws-browser.js 19616function getGlobal() { 19617 if (typeof self !== "undefined") return self; 19618 if (typeof window !== "undefined") return window; 19619 if (typeof global !== "undefined") return global; 19620 throw new Error("unable to locate global object"); 19621} 19622var _WebSocket = getGlobal().WebSocket; 19623//#endregion 19624//#region node_modules/ethers/lib.esm/providers/provider-socket.js 19625/** 19626* Generic long-lived socket provider. 19627* 19628* Sub-classing notes 19629* - a sub-class MUST call the `_start()` method once connected 19630* - a sub-class MUST override the `_write(string)` method 19631* - a sub-class MUST call `_processMessage(string)` for each message 19632* 19633* @_subsection: api/providers/abstract-provider:Socket Providers [about-socketProvider] 19634*/ 19635/** 19636* A **SocketSubscriber** uses a socket transport to handle events and 19637* should use [[_emit]] to manage the events. 19638*/ 19639var SocketSubscriber = class { 19640 #provider; 19641 #filter; 19642 /** 19643 * The filter. 19644 */ 19645 get filter() { 19646 return JSON.parse(this.#filter); 19647 } 19648 #filterId; 19649 #paused; 19650 #emitPromise; 19651 /** 19652 * Creates a new **SocketSubscriber** attached to %%provider%% listening 19653 * to %%filter%%. 19654 */ 19655 constructor(provider, filter) { 19656 this.#provider = provider; 19657 this.#filter = JSON.stringify(filter); 19658 this.#filterId = null; 19659 this.#paused = null; 19660 this.#emitPromise = null; 19661 } 19662 start() { 19663 this.#filterId = this.#provider.send("eth_subscribe", this.filter).then((filterId) => { 19664 this.#provider._register(filterId, this); 19665 return filterId; 19666 }); 19667 } 19668 stop() { 19669 this.#filterId.then((filterId) => { 19670 if (this.#provider.destroyed) return; 19671 this.#provider.send("eth_unsubscribe", [filterId]); 19672 }); 19673 this.#filterId = null; 19674 } 19675 pause(dropWhilePaused) { 19676 assert(dropWhilePaused, "preserve logs while paused not supported by SocketSubscriber yet", "UNSUPPORTED_OPERATION", { operation: "pause(false)" }); 19677 this.#paused = !!dropWhilePaused; 19678 } 19679 resume() { 19680 this.#paused = null; 19681 } 19682 /** 19683 * @_ignore: 19684 */ 19685 _handleMessage(message) { 19686 if (this.#filterId == null) return; 19687 if (this.#paused === null) { 19688 let emitPromise = this.#emitPromise; 19689 if (emitPromise == null) emitPromise = this._emit(this.#provider, message); 19690 else emitPromise = emitPromise.then(async () => { 19691 await this._emit(this.#provider, message); 19692 }); 19693 this.#emitPromise = emitPromise.then(() => { 19694 if (this.#emitPromise === emitPromise) this.#emitPromise = null; 19695 }); 19696 } 19697 } 19698 /** 19699 * Sub-classes **must** override this to emit the events on the 19700 * provider. 19701 */ 19702 async _emit(provider, message) { 19703 throw new Error("sub-classes must implemente this; _emit"); 19704 } 19705}; 19706/** 19707* A **SocketBlockSubscriber** listens for ``newHeads`` events and emits 19708* ``"block"`` events. 19709*/ 19710var SocketBlockSubscriber = class extends SocketSubscriber { 19711 /** 19712 * @_ignore: 19713 */ 19714 constructor(provider) { 19715 super(provider, ["newHeads"]); 19716 } 19717 async _emit(provider, message) { 19718 provider.emit("block", parseInt(message.number)); 19719 } 19720}; 19721/** 19722* A **SocketPendingSubscriber** listens for pending transacitons and emits 19723* ``"pending"`` events. 19724*/ 19725var SocketPendingSubscriber = class extends SocketSubscriber { 19726 /** 19727 * @_ignore: 19728 */ 19729 constructor(provider) { 19730 super(provider, ["newPendingTransactions"]); 19731 } 19732 async _emit(provider, message) { 19733 provider.emit("pending", message); 19734 } 19735}; 19736/** 19737* A **SocketEventSubscriber** listens for event logs. 19738*/ 19739var SocketEventSubscriber = class extends SocketSubscriber { 19740 #logFilter; 19741 /** 19742 * The filter. 19743 */ 19744 get logFilter() { 19745 return JSON.parse(this.#logFilter); 19746 } 19747 /** 19748 * @_ignore: 19749 */ 19750 constructor(provider, filter) { 19751 super(provider, ["logs", filter]); 19752 this.#logFilter = JSON.stringify(filter); 19753 } 19754 async _emit(provider, message) { 19755 provider.emit(this.logFilter, provider._wrapLog(message, provider._network)); 19756 } 19757}; 19758/** 19759* A **SocketProvider** is backed by a long-lived connection over a 19760* socket, which can subscribe and receive real-time messages over 19761* its communication channel. 19762*/ 19763var SocketProvider = class extends JsonRpcApiProvider { 19764 #callbacks; 19765 #subs; 19766 #pending; 19767 /** 19768 * Creates a new **SocketProvider** connected to %%network%%. 19769 * 19770 * If unspecified, the network will be discovered. 19771 */ 19772 constructor(network, _options) { 19773 const options = Object.assign({}, _options != null ? _options : {}); 19774 assertArgument(options.batchMaxCount == null || options.batchMaxCount === 1, "sockets-based providers do not support batches", "options.batchMaxCount", _options); 19775 options.batchMaxCount = 1; 19776 if (options.staticNetwork == null) options.staticNetwork = true; 19777 super(network, options); 19778 this.#callbacks = /* @__PURE__ */ new Map(); 19779 this.#subs = /* @__PURE__ */ new Map(); 19780 this.#pending = /* @__PURE__ */ new Map(); 19781 } 19782 _getSubscriber(sub) { 19783 switch (sub.type) { 19784 case "close": return new UnmanagedSubscriber("close"); 19785 case "block": return new SocketBlockSubscriber(this); 19786 case "pending": return new SocketPendingSubscriber(this);
vendor: 6,468 bytes, lines 19787-19982
19787 case "event": return new SocketEventSubscriber(this, sub.filter); 19788 case "orphan": if (sub.filter.orphan === "drop-log") return new UnmanagedSubscriber("drop-log"); 19789 } 19790 return super._getSubscriber(sub); 19791 } 19792 /** 19793 * Register a new subscriber. This is used internalled by Subscribers 19794 * and generally is unecessary unless extending capabilities. 19795 */ 19796 _register(filterId, subscriber) { 19797 this.#subs.set(filterId, subscriber); 19798 const pending = this.#pending.get(filterId); 19799 if (pending) { 19800 for (const message of pending) subscriber._handleMessage(message); 19801 this.#pending.delete(filterId); 19802 } 19803 } 19804 async _send(payload) { 19805 assertArgument(!Array.isArray(payload), "WebSocket does not support batch send", "payload", payload); 19806 const promise = new Promise((resolve, reject) => { 19807 this.#callbacks.set(payload.id, { 19808 payload, 19809 resolve, 19810 reject 19811 }); 19812 }); 19813 await this._waitUntilReady(); 19814 await this._write(JSON.stringify(payload)); 19815 return [await promise]; 19816 } 19817 /** 19818 * Sub-classes **must** call this with messages received over their 19819 * transport to be processed and dispatched. 19820 */ 19821 async _processMessage(message) { 19822 const result = JSON.parse(message); 19823 if (result && typeof result === "object" && "id" in result) { 19824 const callback = this.#callbacks.get(result.id); 19825 if (callback == null) { 19826 this.emit("error", makeError("received result for unknown id", "UNKNOWN_ERROR", { 19827 reasonCode: "UNKNOWN_ID", 19828 result 19829 })); 19830 return; 19831 } 19832 this.#callbacks.delete(result.id); 19833 callback.resolve(result); 19834 } else if (result && result.method === "eth_subscription") { 19835 const filterId = result.params.subscription; 19836 const subscriber = this.#subs.get(filterId); 19837 if (subscriber) subscriber._handleMessage(result.params.result); 19838 else { 19839 let pending = this.#pending.get(filterId); 19840 if (pending == null) { 19841 pending = []; 19842 this.#pending.set(filterId, pending); 19843 } 19844 pending.push(result.params.result); 19845 } 19846 } else { 19847 this.emit("error", makeError("received unexpected message", "UNKNOWN_ERROR", { 19848 reasonCode: "UNEXPECTED_MESSAGE", 19849 result 19850 })); 19851 return; 19852 } 19853 } 19854 /** 19855 * Sub-classes **must** override this to send %%message%% over their 19856 * transport. 19857 */ 19858 async _write(message) { 19859 throw new Error("sub-classes must override this"); 19860 } 19861}; 19862//#endregion 19863//#region node_modules/ethers/lib.esm/providers/provider-websocket.js 19864/** 19865* A JSON-RPC provider which is backed by a WebSocket. 19866* 19867* WebSockets are often preferred because they retain a live connection 19868* to a server, which permits more instant access to events. 19869* 19870* However, this incurs higher server infrasturture costs, so additional 19871* resources may be required to host your own WebSocket nodes and many 19872* third-party services charge additional fees for WebSocket endpoints. 19873*/ 19874var WebSocketProvider = class extends SocketProvider { 19875 #connect; 19876 #websocket; 19877 get websocket() { 19878 if (this.#websocket == null) throw new Error("websocket closed"); 19879 return this.#websocket; 19880 } 19881 constructor(url, network, options) { 19882 super(network, options); 19883 if (typeof url === "string") { 19884 this.#connect = () => { 19885 return new _WebSocket(url); 19886 }; 19887 this.#websocket = this.#connect(); 19888 } else if (typeof url === "function") { 19889 this.#connect = url; 19890 this.#websocket = url(); 19891 } else { 19892 this.#connect = null; 19893 this.#websocket = url; 19894 } 19895 this.websocket.onopen = async () => { 19896 try { 19897 await this._start(); 19898 this.resume(); 19899 } catch (error) { 19900 console.log("failed to start WebsocketProvider", error); 19901 } 19902 }; 19903 this.websocket.onmessage = (message) => { 19904 this._processMessage(message.data); 19905 }; 19906 } 19907 async _write(message) { 19908 this.websocket.send(message); 19909 } 19910 async destroy() { 19911 if (this.#websocket != null) { 19912 this.#websocket.close(); 19913 this.#websocket = null; 19914 } 19915 super.destroy(); 19916 } 19917}; 19918//#endregion 19919//#region node_modules/ethers/lib.esm/providers/provider-infura.js 19920/** 19921* [[link-infura]] provides a third-party service for connecting to 19922* various blockchains over JSON-RPC. 19923* 19924* **Supported Networks** 19925* 19926* - Ethereum Mainnet (``mainnet``) 19927* - Goerli Testnet (``goerli``) 19928* - Sepolia Testnet (``sepolia``) 19929* - Arbitrum (``arbitrum``) 19930* - Arbitrum Goerli Testnet (``arbitrum-goerli``) 19931* - Arbitrum Sepolia Testnet (``arbitrum-sepolia``) 19932* - Base (``base``) 19933* - Base Goerlia Testnet (``base-goerli``) 19934* - Base Sepolia Testnet (``base-sepolia``) 19935* - BNB Smart Chain Mainnet (``bnb``) 19936* - BNB Smart Chain Testnet (``bnbt``) 19937* - Linea (``linea``) 19938* - Linea Goerli Testnet (``linea-goerli``) 19939* - Linea Sepolia Testnet (``linea-sepolia``) 19940* - Optimism (``optimism``) 19941* - Optimism Goerli Testnet (``optimism-goerli``) 19942* - Optimism Sepolia Testnet (``optimism-sepolia``) 19943* - Polygon (``matic``) 19944* - Polygon Amoy Testnet (``matic-amoy``) 19945* - Polygon Mumbai Testnet (``matic-mumbai``) 19946* 19947* @_subsection: api/providers/thirdparty:INFURA [providers-infura] 19948*/ 19949var defaultProjectId = "84842078b09946638c03157f83405213"; 19950function getHost$2(name) { 19951 switch (name) { 19952 case "mainnet": return "mainnet.infura.io"; 19953 case "goerli": return "goerli.infura.io"; 19954 case "sepolia": return "sepolia.infura.io"; 19955 case "arbitrum": return "arbitrum-mainnet.infura.io"; 19956 case "arbitrum-goerli": return "arbitrum-goerli.infura.io"; 19957 case "arbitrum-sepolia": return "arbitrum-sepolia.infura.io"; 19958 case "base": return "base-mainnet.infura.io"; 19959 case "base-goerlia": 19960 case "base-goerli": return "base-goerli.infura.io"; 19961 case "base-sepolia": return "base-sepolia.infura.io"; 19962 case "bnb": return "bsc-mainnet.infura.io"; 19963 case "bnbt": return "bsc-testnet.infura.io"; 19964 case "linea": return "linea-mainnet.infura.io"; 19965 case "linea-goerli": return "linea-goerli.infura.io"; 19966 case "linea-sepolia": return "linea-sepolia.infura.io"; 19967 case "matic": return "polygon-mainnet.infura.io"; 19968 case "matic-amoy": return "polygon-amoy.infura.io"; 19969 case "matic-mumbai": return "polygon-mumbai.infura.io"; 19970 case "optimism": return "optimism-mainnet.infura.io"; 19971 case "optimism-goerli": return "optimism-goerli.infura.io"; 19972 case "optimism-sepolia": return "optimism-sepolia.infura.io"; 19973 } 19974 assertArgument(false, "unsupported network", "network", name); 19975} 19976/** 19977* The **InfuraWebSocketProvider** connects to the [[link-infura]] 19978* WebSocket end-points. 19979* 19980* By default, a highly-throttled API key is used, which is 19981* appropriate for quick prototypes and simple scripts. To 19982* gain access to an increased rate-limit, it is highly
19983* recommended to [sign up here](link-infura-signup). 19984*/ 19985var InfuraWebSocketProvider = class extends WebSocketProvider { 19986 /** 19987 * The Project ID for the INFURA connection. 19988 */ 19989 projectId; 19990 /** 19991 * The Project Secret. 19992 * 19993 * If null, no authenticated requests are made. This should not 19994 * be used outside of private contexts. 19995 */ 19996 projectSecret; 19997 /** 19998 * Creates a new **InfuraWebSocketProvider**. 19999 */ 20000 constructor(network, projectId) { 20001 const provider = new InfuraProvider(network, projectId); 20002 const req = provider._getConnection(); 20003 assert(!req.credentials, "INFURA WebSocket project secrets unsupported", "UNSUPPORTED_OPERATION", { operation: "InfuraProvider.getWebSocketProvider()" }); 20004 const url = req.url.replace(/^http/i, "ws").replace("/v3/", "/ws/v3/"); 20005 super(url, provider._network); 20006 defineProperties(this, { 20007 projectId: provider.projectId, 20008 projectSecret: provider.projectSecret 20009 }); 20010 } 20011 isCommunityResource() { 20012 return this.projectId === defaultProjectId; 20013 } 20014}; 20015/** 20016* The **InfuraProvider** connects to the [[link-infura]] 20017* JSON-RPC end-points. 20018* 20019* By default, a highly-throttled API key is used, which is 20020* appropriate for quick prototypes and simple scripts. To 20021* gain access to an increased rate-limit, it is highly 20022* recommended to [sign up here](link-infura-signup). 20023*/ 20024var InfuraProvider = class InfuraProvider extends JsonRpcProvider { 20025 /** 20026 * The Project ID for the INFURA connection. 20027 */ 20028 projectId; 20029 /** 20030 * The Project Secret. 20031 * 20032 * If null, no authenticated requests are made. This should not 20033 * be used outside of private contexts. 20034 */ 20035 projectSecret; 20036 /** 20037 * Creates a new **InfuraProvider**. 20038 */ 20039 constructor(_network, projectId, projectSecret) { 20040 if (_network == null) _network = "mainnet"; 20041 const network = Network.from(_network); 20042 if (projectId == null) projectId = defaultProjectId; 20043 if (projectSecret == null) projectSecret = null; 20044 const request = InfuraProvider.getRequest(network, projectId, projectSecret); 20045 super(request, network, { staticNetwork: network }); 20046 defineProperties(this, { 20047 projectId, 20048 projectSecret 20049 }); 20050 } 20051 _getProvider(chainId) { 20052 try { 20053 return new InfuraProvider(chainId, this.projectId, this.projectSecret); 20054 } catch (error) {} 20055 return super._getProvider(chainId); 20056 } 20057 isCommunityResource() { 20058 return this.projectId === defaultProjectId; 20059 } 20060 /** 20061 * Creates a new **InfuraWebSocketProvider**. 20062 */ 20063 static getWebSocketProvider(network, projectId) { 20064 return new InfuraWebSocketProvider(network, projectId); 20065 } 20066 /** 20067 * Returns a prepared request for connecting to %%network%% 20068 * with %%projectId%% and %%projectSecret%%. 20069 */ 20070 static getRequest(network, projectId, projectSecret) { 20071 if (projectId == null) projectId = defaultProjectId; 20072 if (projectSecret == null) projectSecret = null; 20073 const request = new FetchRequest(`https:/\/${getHost$2(network.name)}/v3/${projectId}`); 20074 request.allowGzip = true; 20075 if (projectSecret) request.setCredentials("", projectSecret); 20076 if (projectId === defaultProjectId) request.retryFunc = async (request, response, attempt) => { 20077 showThrottleMessage("InfuraProvider"); 20078 return true; 20079 }; 20080 return request; 20081 } 20082}; 20083//#endregion 20084//#region node_modules/ethers/lib.esm/providers/provider-quicknode.js 20085/** 20086* [[link-quicknode]] provides a third-party service for connecting to 20087* various blockchains over JSON-RPC. 20088* 20089* **Supported Networks** 20090* 20091* - Ethereum Mainnet (``mainnet``) 20092* - Goerli Testnet (``goerli``) 20093* - Sepolia Testnet (``sepolia``) 20094* - Holesky Testnet (``holesky``) 20095* - Arbitrum (``arbitrum``) 20096* - Arbitrum Goerli Testnet (``arbitrum-goerli``) 20097* - Arbitrum Sepolia Testnet (``arbitrum-sepolia``) 20098* - Base Mainnet (``base``); 20099* - Base Goerli Testnet (``base-goerli``); 20100* - Base Sepolia Testnet (``base-sepolia``); 20101* - BNB Smart Chain Mainnet (``bnb``) 20102* - BNB Smart Chain Testnet (``bnbt``) 20103* - Optimism (``optimism``) 20104* - Optimism Goerli Testnet (``optimism-goerli``) 20105* - Optimism Sepolia Testnet (``optimism-sepolia``) 20106* - Polygon (``matic``) 20107* - Polygon Mumbai Testnet (``matic-mumbai``) 20108* 20109* @_subsection: api/providers/thirdparty:QuickNode [providers-quicknode] 20110*/ 20111var defaultToken = "919b412a057b5e9c9b6dce193c5a60242d6efadb"; 20112function getHost$1(name) { 20113 switch (name) { 20114 case "mainnet": return "ethers.quiknode.pro"; 20115 case "goerli": return "ethers.ethereum-goerli.quiknode.pro"; 20116 case "sepolia": return "ethers.ethereum-sepolia.quiknode.pro"; 20117 case "holesky": return "ethers.ethereum-holesky.quiknode.pro"; 20118 case "arbitrum": return "ethers.arbitrum-mainnet.quiknode.pro"; 20119 case "arbitrum-goerli": return "ethers.arbitrum-goerli.quiknode.pro"; 20120 case "arbitrum-sepolia": return "ethers.arbitrum-sepolia.quiknode.pro"; 20121 case "base": return "ethers.base-mainnet.quiknode.pro"; 20122 case "base-goerli": return "ethers.base-goerli.quiknode.pro"; 20123 case "base-spolia": return "ethers.base-sepolia.quiknode.pro"; 20124 case "bnb": return "ethers.bsc.quiknode.pro"; 20125 case "bnbt": return "ethers.bsc-testnet.quiknode.pro"; 20126 case "matic": return "ethers.matic.quiknode.pro"; 20127 case "matic-mumbai": return "ethers.matic-testnet.quiknode.pro"; 20128 case "optimism": return "ethers.optimism.quiknode.pro"; 20129 case "optimism-goerli": return "ethers.optimism-goerli.quiknode.pro"; 20130 case "optimism-sepolia": return "ethers.optimism-sepolia.quiknode.pro"; 20131 case "xdai": return "ethers.xdai.quiknode.pro"; 20132 } 20133 assertArgument(false, "unsupported network", "network", name); 20134} 20135/** 20136* The **QuickNodeProvider** connects to the [[link-quicknode]] 20137* JSON-RPC end-points. 20138* 20139* By default, a highly-throttled API token is used, which is 20140* appropriate for quick prototypes and simple scripts. To 20141* gain access to an increased rate-limit, it is highly
20142* recommended to [sign up here](link-quicknode). 20143*/ 20144var QuickNodeProvider = class QuickNodeProvider extends JsonRpcProvider { 20145 /** 20146 * The API token. 20147 */ 20148 token; 20149 /** 20150 * Creates a new **QuickNodeProvider**. 20151 */ 20152 constructor(_network, token) { 20153 if (_network == null) _network = "mainnet"; 20154 const network = Network.from(_network); 20155 if (token == null) token = defaultToken; 20156 const request = QuickNodeProvider.getRequest(network, token); 20157 super(request, network, { staticNetwork: network }); 20158 defineProperties(this, { token }); 20159 } 20160 _getProvider(chainId) { 20161 try { 20162 return new QuickNodeProvider(chainId, this.token); 20163 } catch (error) {} 20164 return super._getProvider(chainId); 20165 } 20166 isCommunityResource() { 20167 return this.token === defaultToken; 20168 } 20169 /** 20170 * Returns a new request prepared for %%network%% and the 20171 * %%token%%. 20172 */ 20173 static getRequest(network, token) { 20174 if (token == null) token = defaultToken; 20175 const request = new FetchRequest(`https:/\/${getHost$1(network.name)}/${token}`); 20176 request.allowGzip = true; 20177 if (token === defaultToken) request.retryFunc = async (request, response, attempt) => { 20178 showThrottleMessage("QuickNodeProvider"); 20179 return true; 20180 }; 20181 return request; 20182 } 20183}; 20184//#endregion 20185//#region node_modules/ethers/lib.esm/providers/provider-fallback.js 20186/** 20187* A **FallbackProvider** provides resilience, security and performance 20188* in a way that is customizable and configurable. 20189* 20190* @_section: api/providers/fallback-provider:Fallback Provider [about-fallback-provider] 20191*/ 20192var BN_1 = BigInt("1"); 20193var BN_2 = BigInt("2"); 20194function shuffle(array) { 20195 for (let i = array.length - 1; i > 0; i--) { 20196 const j = Math.floor(Math.random() * (i + 1)); 20197 const tmp = array[i]; 20198 array[i] = array[j]; 20199 array[j] = tmp; 20200 } 20201} 20202function stall$2(duration) { 20203 return new Promise((resolve) => { 20204 setTimeout(resolve, duration); 20205 }); 20206} 20207function getTime() { 20208 return (/* @__PURE__ */ new Date()).getTime(); 20209} 20210function stringify(value) { 20211 return JSON.stringify(value, (key, value) => { 20212 if (typeof value === "bigint") return { 20213 type: "bigint", 20214 value: value.toString() 20215 }; 20216 return value; 20217 }); 20218} 20219var defaultConfig = { 20220 stallTimeout: 400, 20221 priority: 1, 20222 weight: 1 20223}; 20224var defaultState = { 20225 blockNumber: -2, 20226 requests: 0, 20227 lateResponses: 0, 20228 errorResponses: 0, 20229 outOfSync: -1, 20230 unsupportedEvents: 0, 20231 rollingDuration: 0, 20232 score: 0, 20233 _network: null, 20234 _updateNumber: null, 20235 _totalTime: 0, 20236 _lastFatalError: null, 20237 _lastFatalErrorTimestamp: 0 20238}; 20239async function waitForSync(config, blockNumber) { 20240 while (config.blockNumber < 0 || config.blockNumber < blockNumber) { 20241 if (!config._updateNumber) config._updateNumber = (async () => { 20242 try { 20243 const blockNumber = await config.provider.getBlockNumber(); 20244 if (blockNumber > config.blockNumber) config.blockNumber = blockNumber; 20245 } catch (error) { 20246 config.blockNumber = -2; 20247 config._lastFatalError = error; 20248 config._lastFatalErrorTimestamp = getTime(); 20249 } 20250 config._updateNumber = null; 20251 })(); 20252 await config._updateNumber; 20253 config.outOfSync++; 20254 if (config._lastFatalError) break; 20255 } 20256} 20257function _normalize(value) { 20258 if (value == null) return "null"; 20259 if (Array.isArray(value)) return "[" + value.map(_normalize).join(",") + "]"; 20260 if (typeof value === "object" && typeof value.toJSON === "function") return _normalize(value.toJSON()); 20261 switch (typeof value) { 20262 case "boolean": 20263 case "symbol": return value.toString(); 20264 case "bigint": 20265 case "number": return BigInt(value).toString(); 20266 case "string": return JSON.stringify(value); 20267 case "object": { 20268 const keys = Object.keys(value); 20269 keys.sort(); 20270 return "{" + keys.map((k) => `${JSON.stringify(k)}:${_normalize(value[k])}`).join(",") + "}"; 20271 } 20272 } 20273 console.log("Could not serialize", value); 20274 throw new Error("Hmm..."); 20275} 20276function normalizeResult(method, value) { 20277 if ("error" in value) { 20278 const error = value.error; 20279 let tag; 20280 if (isError(error, "CALL_EXCEPTION")) tag = _normalize(Object.assign({}, error, { 20281 shortMessage: void 0, 20282 reason: void 0, 20283 info: void 0 20284 })); 20285 else tag = _normalize(error); 20286 return { 20287 tag, 20288 value: error 20289 }; 20290 } 20291 const result = value.result; 20292 return { 20293 tag: _normalize(result), 20294 value: result 20295 }; 20296} 20297function checkQuorum(quorum, results) { 20298 const tally = /* @__PURE__ */ new Map(); 20299 for (const { value, tag, weight } of results) { 20300 const t = tally.get(tag) || { 20301 value, 20302 weight: 0 20303 }; 20304 t.weight += weight; 20305 tally.set(tag, t); 20306 } 20307 let best = null; 20308 for (const r of tally.values()) if (r.weight >= quorum && (!best || r.weight > best.weight)) best = r; 20309 if (best) return best.value; 20310} 20311function getMedian(quorum, results) { 20312 let resultWeight = 0; 20313 const errorMap = /* @__PURE__ */ new Map(); 20314 let bestError = null; 20315 const values = []; 20316 for (const { value, tag, weight } of results) if (value instanceof Error) { 20317 const e = errorMap.get(tag) || { 20318 value, 20319 weight: 0 20320 }; 20321 e.weight += weight; 20322 errorMap.set(tag, e); 20323 if (bestError == null || e.weight > bestError.weight) bestError = e; 20324 } else { 20325 values.push(BigInt(value)); 20326 resultWeight += weight; 20327 } 20328 if (resultWeight < quorum) { 20329 if (bestError && bestError.weight >= quorum) return bestError.value; 20330 return; 20331 } 20332 values.sort((a, b) => a < b ? -1 : b > a ? 1 : 0); 20333 const mid = Math.floor(values.length / 2); 20334 if (values.length % 2) return values[mid]; 20335 return (values[mid - 1] + values[mid] + BN_1) / BN_2; 20336} 20337function getAnyResult(quorum, results) { 20338 const result = checkQuorum(quorum, results); 20339 if (result !== void 0) return result; 20340 for (const r of results) if (r.value) return r.value; 20341} 20342function getFuzzyMode(quorum, results) { 20343 if (quorum === 1) return getNumber(getMedian(quorum, results), "%internal"); 20344 const tally = /* @__PURE__ */ new Map(); 20345 const add = (result, weight) => { 20346 const t = tally.get(result) || { 20347 result, 20348 weight: 0 20349 }; 20350 t.weight += weight; 20351 tally.set(result, t); 20352 }; 20353 for (const { weight, value } of results) { 20354 const r = getNumber(value); 20355 add(r - 1, weight); 20356 add(r, weight); 20357 add(r + 1, weight); 20358 } 20359 let bestWeight = 0; 20360 let bestResult = void 0; 20361 for (const { weight, result } of tally.values()) if (weight >= quorum && (weight > bestWeight || bestResult != null && weight === bestWeight && result > bestResult)) { 20362 bestWeight = weight; 20363 bestResult = result; 20364 } 20365 return bestResult; 20366} 20367/** 20368* A **FallbackProvider** manages several [[Providers]] providing 20369* resilience by switching between slow or misbehaving nodes, security 20370* by requiring multiple backends to aggree and performance by allowing 20371* faster backends to respond earlier. 20372* 20373*/ 20374var FallbackProvider = class extends AbstractProvider { 20375 /** 20376 * The number of backends that must agree on a value before it is 20377 * accpeted. 20378 */ 20379 quorum; 20380 /** 20381 * @_ignore: 20382 */ 20383 eventQuorum; 20384 /** 20385 * @_ignore: 20386 */ 20387 eventWorkers; 20388 #configs;
20389 #height; 20390 #initialSyncPromise; 20391 /** 20392 * Creates a new **FallbackProvider** with %%providers%% connected to 20393 * %%network%%. 20394 * 20395 * If a [[Provider]] is included in %%providers%%, defaults are used 20396 * for the configuration. 20397 */ 20398 constructor(providers, network, options) { 20399 super(network, options); 20400 this.#configs = providers.map((p) => { 20401 if (p instanceof AbstractProvider) return Object.assign({ provider: p }, defaultConfig, defaultState); 20402 else return Object.assign({}, defaultConfig, p, defaultState); 20403 }); 20404 this.#height = -2; 20405 this.#initialSyncPromise = null; 20406 if (options && options.quorum != null) this.quorum = options.quorum; 20407 else this.quorum = Math.ceil(this.#configs.reduce((accum, config) => { 20408 accum += config.weight; 20409 return accum; 20410 }, 0) / 2); 20411 this.eventQuorum = 1; 20412 this.eventWorkers = 1; 20413 assertArgument(this.quorum <= this.#configs.reduce((a, c) => a + c.weight, 0), "quorum exceed provider weight", "quorum", this.quorum); 20414 } 20415 get providerConfigs() { 20416 return this.#configs.map((c) => { 20417 const result = Object.assign({}, c); 20418 for (const key in result) if (key[0] === "_") delete result[key]; 20419 return result; 20420 }); 20421 } 20422 async _detectNetwork() { 20423 return Network.from(getBigInt(await this._perform({ method: "chainId" }))); 20424 } 20425 /** 20426 * Transforms a %%req%% into the correct method call on %%provider%%. 20427 */ 20428 async _translatePerform(provider, req) { 20429 switch (req.method) { 20430 case "broadcastTransaction": return await provider.broadcastTransaction(req.signedTransaction); 20431 case "call": return await provider.call(Object.assign({}, req.transaction, { blockTag: req.blockTag })); 20432 case "chainId": return (await provider.getNetwork()).chainId; 20433 case "estimateGas": return await provider.estimateGas(req.transaction); 20434 case "getBalance": return await provider.getBalance(req.address, req.blockTag); 20435 case "getBlock": { 20436 const block = "blockHash" in req ? req.blockHash : req.blockTag; 20437 return await provider.getBlock(block, req.includeTransactions); 20438 } 20439 case "getBlockNumber": return await provider.getBlockNumber(); 20440 case "getCode": return await provider.getCode(req.address, req.blockTag); 20441 case "getGasPrice": return (await provider.getFeeData()).gasPrice; 20442 case "getPriorityFee": return (await provider.getFeeData()).maxPriorityFeePerGas; 20443 case "getLogs": return await provider.getLogs(req.filter); 20444 case "getStorage": return await provider.getStorage(req.address, req.position, req.blockTag); 20445 case "getTransaction": return await provider.getTransaction(req.hash); 20446 case "getTransactionCount": return await provider.getTransactionCount(req.address, req.blockTag); 20447 case "getTransactionReceipt": return await provider.getTransactionReceipt(req.hash); 20448 case "getTransactionResult": return await provider.getTransactionResult(req.hash); 20449 } 20450 } 20451 #getNextConfig(running) { 20452 const configs = Array.from(running).map((r) => r.config); 20453 const allConfigs = this.#configs.slice(); 20454 shuffle(allConfigs); 20455 allConfigs.sort((a, b) => a.priority - b.priority); 20456 for (const config of allConfigs) { 20457 if (config._lastFatalError) continue; 20458 if (configs.indexOf(config) === -1) return config; 20459 } 20460 return null; 20461 } 20462 #addRunner(running, req) { 20463 const config = this.#getNextConfig(running); 20464 if (config == null) return null; 20465 const runner = { 20466 config, 20467 result: null, 20468 didBump: false, 20469 perform: null, 20470 staller: null 20471 }; 20472 const now = getTime(); 20473 runner.perform = (async () => { 20474 try { 20475 config.requests++; 20476 const result = await this._translatePerform(config.provider, req); 20477 runner.result = { result }; 20478 } catch (error) { 20479 config.errorResponses++; 20480 runner.result = { error }; 20481 } 20482 const dt = getTime() - now; 20483 config._totalTime += dt; 20484 config.rollingDuration = .95 * config.rollingDuration + .05 * dt; 20485 runner.perform = null; 20486 })(); 20487 runner.staller = (async () => { 20488 await stall$2(config.stallTimeout); 20489 runner.staller = null; 20490 })(); 20491 running.add(runner); 20492 return runner; 20493 } 20494 async #initialSync() { 20495 let initialSync = this.#initialSyncPromise; 20496 if (!initialSync) { 20497 const promises = [];
20498 this.#configs.forEach((config) => { 20499 promises.push((async () => { 20500 await waitForSync(config, 0); 20501 if (!config._lastFatalError) config._network = await config.provider.getNetwork(); 20502 })()); 20503 }); 20504 this.#initialSyncPromise = initialSync = (async () => { 20505 await Promise.all(promises); 20506 let chainId = null; 20507 for (const config of this.#configs) { 20508 if (config._lastFatalError) continue; 20509 const network = config._network; 20510 if (chainId == null) chainId = network.chainId; 20511 else if (network.chainId !== chainId) assert(false, "cannot mix providers on different networks", "UNSUPPORTED_OPERATION", { operation: "new FallbackProvider" }); 20512 } 20513 })(); 20514 } 20515 await initialSync; 20516 } 20517 async #checkQuorum(running, req) { 20518 const results = []; 20519 for (const runner of running) if (runner.result != null) { 20520 const { tag, value } = normalizeResult(req.method, runner.result); 20521 results.push({ 20522 tag, 20523 value, 20524 weight: runner.config.weight 20525 }); 20526 } 20527 if (results.reduce((a, r) => a + r.weight, 0) < this.quorum) return; 20528 switch (req.method) { 20529 case "getBlockNumber": { 20530 if (this.#height === -2) this.#height = Math.ceil(getNumber(getMedian(this.quorum, this.#configs.filter((c) => !c._lastFatalError).map((c) => ({ 20531 value: c.blockNumber, 20532 tag: getNumber(c.blockNumber).toString(), 20533 weight: c.weight 20534 }))))); 20535 const mode = getFuzzyMode(this.quorum, results); 20536 if (mode === void 0) return; 20537 if (mode > this.#height) this.#height = mode; 20538 return this.#height; 20539 } 20540 case "getGasPrice": 20541 case "getPriorityFee": 20542 case "estimateGas": return getMedian(this.quorum, results); 20543 case "getBlock": 20544 if ("blockTag" in req && req.blockTag === "pending") return getAnyResult(this.quorum, results); 20545 return checkQuorum(this.quorum, results); 20546 case "call": 20547 case "chainId": 20548 case "getBalance": 20549 case "getTransactionCount": 20550 case "getCode": 20551 case "getStorage": 20552 case "getTransaction": 20553 case "getTransactionReceipt": 20554 case "getLogs": return checkQuorum(this.quorum, results); 20555 case "broadcastTransaction": return getAnyResult(this.quorum, results); 20556 } 20557 assert(false, "unsupported method", "UNSUPPORTED_OPERATION", { operation: `_perform(${stringify(req.method)})` }); 20558 } 20559 async #waitForQuorum(running, req) { 20560 if (running.size === 0) throw new Error("no runners?!"); 20561 const interesting = []; 20562 let newRunners = 0; 20563 for (const runner of running) { 20564 if (runner.perform) interesting.push(runner.perform); 20565 if (runner.staller) { 20566 interesting.push(runner.staller); 20567 continue; 20568 } 20569 if (runner.didBump) continue; 20570 runner.didBump = true; 20571 newRunners++; 20572 } 20573 const value = await this.#checkQuorum(running, req); 20574 if (value !== void 0) { 20575 if (value instanceof Error) throw value; 20576 return value; 20577 } 20578 for (let i = 0; i < newRunners; i++) this.#addRunner(running, req); 20579 assert(interesting.length > 0, "quorum not met", "SERVER_ERROR", { 20580 request: "%sub-requests", 20581 info: { 20582 request: req, 20583 results: Array.from(running).map((r) => stringify(r.result)) 20584 } 20585 }); 20586 await Promise.race(interesting); 20587 return await this.#waitForQuorum(running, req); 20588 } 20589 async _perform(req) { 20590 if (req.method === "broadcastTransaction") { 20591 const results = this.#configs.map((c) => null); 20592 const broadcasts = this.#configs.map(async ({ provider, weight }, index) => { 20593 try { 20594 const result = await provider._perform(req); 20595 results[index] = Object.assign(normalizeResult(req.method, { result }), { weight }); 20596 } catch (error) { 20597 results[index] = Object.assign(normalizeResult(req.method, { error }), { weight }); 20598 } 20599 }); 20600 while (true) { 20601 const done = results.filter((r) => r != null); 20602 for (const { value } of done) if (!(value instanceof Error)) return value; 20603 const result = checkQuorum(this.quorum, results.filter((r) => r != null)); 20604 if (isError(result, "INSUFFICIENT_FUNDS")) throw result; 20605 const waiting = broadcasts.filter((b, i) => results[i] == null); 20606 if (waiting.length === 0) break; 20607 await Promise.race(waiting); 20608 } 20609 const result = getAnyResult(this.quorum, results); 20610 assert(result !== void 0, "problem multi-broadcasting", "SERVER_ERROR", { 20611 request: "%sub-requests", 20612 info: { 20613 request: req, 20614 results: results.map(stringify) 20615 } 20616 }); 20617 if (result instanceof Error) throw result; 20618 return result; 20619 } 20620 await this.#initialSync(); 20621 const running = /* @__PURE__ */ new Set(); 20622 let inflightQuorum = 0; 20623 while (true) { 20624 const runner = this.#addRunner(running, req); 20625 if (runner == null) break; 20626 inflightQuorum += runner.config.weight; 20627 if (inflightQuorum >= this.quorum) break; 20628 } 20629 const result = await this.#waitForQuorum(running, req); 20630 for (const runner of running) if (runner.perform && runner.result == null) runner.config.lateResponses++; 20631 return result; 20632 } 20633 async destroy() { 20634 for (const { provider } of this.#configs) provider.destroy(); 20635 super.destroy(); 20636 } 20637}; 20638//#endregion
20639//#region node_modules/ethers/lib.esm/providers/default-provider.js 20640function isWebSocketLike(value) { 20641 return value && typeof value.send === "function" && typeof value.close === "function"; 20642} 20643var Testnets = "goerli kovan sepolia classicKotti optimism-goerli arbitrum-goerli matic-mumbai bnbt".split(" "); 20644/** 20645* Returns a default provider for %%network%%. 20646* 20647* If %%network%% is a [[WebSocketLike]] or string that begins with 20648* ``"ws:"`` or ``"wss:"``, a [[WebSocketProvider]] is returned backed 20649* by that WebSocket or URL. 20650* 20651* If %%network%% is a string that begins with ``"HTTP:"`` or ``"HTTPS:"``, 20652* a [[JsonRpcProvider]] is returned connected to that URL. 20653* 20654* Otherwise, a default provider is created backed by well-known public 20655* Web3 backends (such as [[link-infura]]) using community-provided API 20656* keys. 20657* 20658* The %%options%% allows specifying custom API keys per backend (setting 20659* an API key to ``"-"`` will omit that provider) and ``options.exclusive`` 20660* can be set to either a backend name or and array of backend names, which 20661* will whitelist **only** those backends. 20662* 20663* Current backend strings supported are: 20664* - ``"alchemy"`` 20665* - ``"ankr"`` 20666* - ``"cloudflare"`` 20667* - ``"chainstack"`` 20668* - ``"etherscan"`` 20669* - ``"infura"`` 20670* - ``"publicPolygon"`` 20671* - ``"quicknode"`` 20672* 20673* @example: 20674* // Connect to a local Geth node 20675* provider = getDefaultProvider("http://localhost:8545/"); 20676* 20677* // Connect to Ethereum mainnet with any current and future 20678* // third-party services available 20679* provider = getDefaultProvider("mainnet"); 20680* 20681* // Connect to Polygon, but only allow Etherscan and 20682* // INFURA and use "MY_API_KEY" in calls to Etherscan. 20683* provider = getDefaultProvider("matic", { 20684* etherscan: "MY_API_KEY", 20685* exclusive: [ "etherscan", "infura" ] 20686* }); 20687*/ 20688function getDefaultProvider(network, options) { 20689 if (options == null) options = {}; 20690 const allowService = (name) => { 20691 if (options[name] === "-") return false; 20692 if (typeof options.exclusive === "string") return name === options.exclusive; 20693 if (Array.isArray(options.exclusive)) return options.exclusive.indexOf(name) !== -1; 20694 return true; 20695 }; 20696 if (typeof network === "string" && network.match(/^https?:/)) return new JsonRpcProvider(network); 20697 if (typeof network === "string" && network.match(/^wss?:/) || isWebSocketLike(network)) return new WebSocketProvider(network); 20698 let staticNetwork = null; 20699 try { 20700 staticNetwork = Network.from(network); 20701 } catch (error) {} 20702 const providers = []; 20703 if (allowService("publicPolygon") && staticNetwork) { 20704 if (staticNetwork.name === "matic") providers.push(new JsonRpcProvider("https://polygon-rpc.com/", staticNetwork, { staticNetwork })); 20705 else if (staticNetwork.name === "matic-amoy") providers.push(new JsonRpcProvider("https://rpc-amoy.polygon.technology/", staticNetwork, { staticNetwork })); 20706 } 20707 if (allowService("alchemy")) try { 20708 providers.push(new AlchemyProvider(network, options.alchemy)); 20709 } catch (error) {} 20710 if (allowService("ankr") && options.ankr != null) try { 20711 providers.push(new AnkrProvider(network, options.ankr)); 20712 } catch (error) {} 20713 if (allowService("chainstack")) try { 20714 providers.push(new ChainstackProvider(network, options.chainstack)); 20715 } catch (error) {} 20716 if (allowService("cloudflare")) try { 20717 providers.push(new CloudflareProvider(network)); 20718 } catch (error) {} 20719 if (allowService("etherscan")) try { 20720 providers.push(new EtherscanProvider(network, options.etherscan)); 20721 } catch (error) {} 20722 if (allowService("infura")) try { 20723 let projectId = options.infura; 20724 let projectSecret = void 0; 20725 if (typeof projectId === "object") { 20726 projectSecret = projectId.projectSecret; 20727 projectId = projectId.projectId; 20728 } 20729 providers.push(new InfuraProvider(network, projectId, projectSecret)); 20730 } catch (error) {} 20731 if (allowService("quicknode")) try { 20732 let token = options.quicknode; 20733 providers.push(new QuickNodeProvider(network, token)); 20734 } catch (error) {} 20735 assert(providers.length, "unsupported default network", "UNSUPPORTED_OPERATION", { operation: "getDefaultProvider" }); 20736 if (providers.length === 1) return providers[0]; 20737 let quorum = Math.floor(providers.length / 2); 20738 if (quorum > 2) quorum = 2; 20739 if (staticNetwork && Testnets.indexOf(staticNetwork.name) !== -1) quorum = 1; 20740 if (options && options.quorum) quorum = options.quorum; 20741 return new FallbackProvider(providers, void 0, { quorum }); 20742} 20743//#endregion 20744//#region node_modules/ethers/lib.esm/providers/signer-noncemanager.js 20745/** 20746* A **NonceManager** wraps another [[Signer]] and automatically manages 20747* the nonce, ensuring serialized and sequential nonces are used during 20748* transaction. 20749*/ 20750var NonceManager = class NonceManager extends AbstractSigner { 20751 /** 20752 * The Signer being managed. 20753 */ 20754 signer; 20755 #noncePromise; 20756 #delta; 20757 /** 20758 * Creates a new **NonceManager** to manage %%signer%%. 20759 */ 20760 constructor(signer) { 20761 super(signer.provider); 20762 defineProperties(this, { signer }); 20763 this.#noncePromise = null; 20764 this.#delta = 0; 20765 } 20766 async getAddress() { 20767 return this.signer.getAddress(); 20768 } 20769 connect(provider) { 20770 return new NonceManager(this.signer.connect(provider)); 20771 } 20772 async getNonce(blockTag) { 20773 if (blockTag === "pending") { 20774 if (this.#noncePromise == null) this.#noncePromise = super.getNonce("pending"); 20775 const delta = this.#delta; 20776 return await this.#noncePromise + delta; 20777 } 20778 return super.getNonce(blockTag); 20779 } 20780 /** 20781 * Manually increment the nonce. This may be useful when managng 20782 * offline transactions. 20783 */ 20784 increment() { 20785 this.#delta++; 20786 } 20787 /** 20788 * Resets the nonce, causing the **NonceManager** to reload the current 20789 * nonce from the blockchain on the next transaction. 20790 */ 20791 reset() { 20792 this.#delta = 0; 20793 this.#noncePromise = null; 20794 } 20795 async sendTransaction(tx) { 20796 const noncePromise = this.getNonce("pending"); 20797 this.increment(); 20798 tx = await this.signer.populateTransaction(tx); 20799 tx.nonce = await noncePromise; 20800 return await this.signer.sendTransaction(tx); 20801 } 20802 signTransaction(tx) { 20803 return this.signer.signTransaction(tx); 20804 } 20805 signMessage(message) {
20806 return this.signer.signMessage(message); 20807 } 20808 signTypedData(domain, types, value) { 20809 return this.signer.signTypedData(domain, types, value); 20810 } 20811}; 20812//#endregion 20813//#region node_modules/ethers/lib.esm/providers/provider-browser.js 20814/** 20815* A **BrowserProvider** is intended to wrap an injected provider which 20816* adheres to the [[link-eip-1193]] standard, which most (if not all) 20817* currently do. 20818*/ 20819var BrowserProvider = class BrowserProvider extends JsonRpcApiPollingProvider { 20820 #request; 20821 #providerInfo; 20822 /** 20823 * Connect to the %%ethereum%% provider, optionally forcing the 20824 * %%network%%. 20825 */ 20826 constructor(ethereum, network, _options) { 20827 const options = Object.assign({}, _options != null ? _options : {}, { batchMaxCount: 1 }); 20828 assertArgument(ethereum && ethereum.request, "invalid EIP-1193 provider", "ethereum", ethereum); 20829 super(network, options); 20830 this.#providerInfo = null; 20831 if (_options && _options.providerInfo) this.#providerInfo = _options.providerInfo; 20832 this.#request = async (method, params) => { 20833 const payload = { 20834 method, 20835 params 20836 }; 20837 this.emit("debug", { 20838 action: "sendEip1193Request", 20839 payload 20840 }); 20841 try { 20842 const result = await ethereum.request(payload); 20843 this.emit("debug", { 20844 action: "receiveEip1193Result", 20845 result 20846 }); 20847 return result; 20848 } catch (e) { 20849 const error = new Error(e.message); 20850 error.code = e.code; 20851 error.data = e.data; 20852 error.payload = payload; 20853 this.emit("debug", { 20854 action: "receiveEip1193Error", 20855 error 20856 }); 20857 throw error; 20858 } 20859 }; 20860 } 20861 get providerInfo() { 20862 return this.#providerInfo; 20863 } 20864 async send(method, params) { 20865 await this._start(); 20866 return await super.send(method, params); 20867 } 20868 async _send(payload) { 20869 assertArgument(!Array.isArray(payload), "EIP-1193 does not support batch request", "payload", payload); 20870 try { 20871 const result = await this.#request(payload.method, payload.params || []); 20872 return [{ 20873 id: payload.id, 20874 result 20875 }]; 20876 } catch (e) { 20877 return [{ 20878 id: payload.id, 20879 error: { 20880 code: e.code, 20881 data: e.data, 20882 message: e.message 20883 } 20884 }]; 20885 } 20886 } 20887 getRpcError(payload, error) { 20888 error = JSON.parse(JSON.stringify(error)); 20889 switch (error.error.code || -1) { 20890 case 4001: 20891 error.error.message = `ethers-user-denied: ${error.error.message}`; 20892 break; 20893 case 4200: error.error.message = `ethers-unsupported: ${error.error.message}`; 20894 } 20895 return super.getRpcError(payload, error); 20896 } 20897 /** 20898 * Resolves to ``true`` if the provider manages the %%address%%. 20899 */ 20900 async hasSigner(address) { 20901 if (address == null) address = 0; 20902 const accounts = await this.send("eth_accounts", []); 20903 if (typeof address === "number") return accounts.length > address; 20904 address = address.toLowerCase(); 20905 return accounts.filter((a) => a.toLowerCase() === address).length !== 0; 20906 } 20907 async getSigner(address) { 20908 if (address == null) address = 0; 20909 if (!await this.hasSigner(address)) try { 20910 await this.#request("eth_requestAccounts", []); 20911 } catch (error) { 20912 const payload = error.payload; 20913 throw this.getRpcError(payload, { 20914 id: payload.id, 20915 error 20916 }); 20917 } 20918 return await super.getSigner(address); 20919 } 20920 /** 20921 * Discover and connect to a Provider in the Browser using the 20922 * [[link-eip-6963]] discovery mechanism. If no providers are 20923 * present, ``null`` is resolved. 20924 */ 20925 static async discover(options) { 20926 if (options == null) options = {}; 20927 if (options.provider) return new BrowserProvider(options.provider); 20928 const context = options.window ? options.window : typeof window !== "undefined" ? window : null; 20929 if (context == null) return null; 20930 const anyProvider = options.anyProvider; 20931 if (anyProvider && context.ethereum) return new BrowserProvider(context.ethereum); 20932 if (!("addEventListener" in context && "dispatchEvent" in context && "removeEventListener" in context)) return null; 20933 const timeout = options.timeout ? options.timeout : 300; 20934 if (timeout === 0) return null; 20935 return await new Promise((resolve, reject) => { 20936 let found = []; 20937 const addProvider = (event) => { 20938 found.push(event.detail); 20939 if (anyProvider) finalize(); 20940 }; 20941 const finalize = () => { 20942 clearTimeout(timer); 20943 if (found.length) { 20944 if (options && options.filter) { 20945 const filtered = options.filter(found.map((i) => Object.assign({}, i.info))); 20946 if (filtered == null) resolve(null); 20947 else if (filtered instanceof BrowserProvider) resolve(filtered); 20948 else { 20949 let match = null; 20950 if (filtered.uuid) match = found.filter((f) =>
20950 filtered.uuid === f.info.uuid)[0]; 20951 if (match) { 20952 const { provider, info } = match; 20953 resolve(new BrowserProvider(provider, void 0, { providerInfo: info })); 20954 } else reject(makeError("filter returned unknown info", "UNSUPPORTED_OPERATION", { value: filtered })); 20955 } 20956 } else { 20957 const { provider, info } = found[0]; 20958 resolve(new BrowserProvider(provider, void 0, { providerInfo: info })); 20959 } 20960 } else resolve(null); 20961 context.removeEventListener("eip6963:announceProvider", addProvider); 20962 }; 20963 const timer = setTimeout(() => { 20964 finalize(); 20965 }, timeout); 20966 context.addEventListener("eip6963:announceProvider", addProvider); 20967 context.dispatchEvent(new Event("eip6963:requestProvider")); 20968 }); 20969 } 20970}; 20971//#endregion 20972//#region node_modules/ethers/lib.esm/providers/provider-blockscout.js 20973/** 20974* [[link-blockscout]] provides a third-party service for connecting to 20975* various blockchains over JSON-RPC. 20976* 20977* **Supported Networks** 20978* 20979* - Ethereum Mainnet (``mainnet``) 20980* - Sepolia Testnet (``sepolia``) 20981* - Holesky Testnet (``holesky``) 20982* - Ethereum Classic (``classic``) 20983* - Arbitrum (``arbitrum``) 20984* - Base (``base``) 20985* - Base Sepolia Testnet (``base-sepolia``) 20986* - Gnosis (``xdai``) 20987* - Optimism (``optimism``) 20988* - Optimism Sepolia Testnet (``optimism-sepolia``) 20989* - Polygon (``matic``) 20990* 20991* @_subsection: api/providers/thirdparty:Blockscout [providers-blockscout] 20992*/ 20993function getUrl(name) { 20994 switch (name) { 20995 case "mainnet": return "https://eth.blockscout.com/api/eth-rpc"; 20996 case "sepolia": return "https://eth-sepolia.blockscout.com/api/eth-rpc"; 20997 case "holesky": return "https://eth-holesky.blockscout.com/api/eth-rpc"; 20998 case "classic": return "https://etc.blockscout.com/api/eth-rpc"; 20999 case "arbitrum": return "https://arbitrum.blockscout.com/api/eth-rpc"; 21000 case "base": return "https://base.blockscout.com/api/eth-rpc"; 21001 case "base-sepolia": return "https://base-sepolia.blockscout.com/api/eth-rpc"; 21002 case "matic": return "https://polygon.blockscout.com/api/eth-rpc"; 21003 case "optimism": return "https://optimism.blockscout.com/api/eth-rpc"; 21004 case "optimism-sepolia": return "https://optimism-sepolia.blockscout.com/api/eth-rpc"; 21005 case "xdai": return "https://gnosis.blockscout.com/api/eth-rpc"; 21006 } 21007 assertArgument(false, "unsupported network", "network", name); 21008} 21009var defaultApiKey = "proapi_gwcAAagyQKJ4r2KrAATyyCshiyUEpWfr2x7aKDOWFc56ZY8mBFcT9KZuP5Ce2jIfr_kHzUm"; 21010/** 21011* The **BlockscoutProvider** connects to the [[link-blockscout]] 21012* JSON-RPC end-points. 21013* 21014* By default, a highly-throttled API key is used, which is 21015* appropriate for quick prototypes and simple scripts. To 21016* gain access to an increased rate-limit, it is highly 21017* recommended to [sign up here](link-blockscout-signup). 21018*/ 21019var BlockscoutProvider = class BlockscoutProvider extends JsonRpcProvider { 21020 /** 21021 * The API key. 21022 */ 21023 apiKey; 21024 /** 21025 * Creates a new **BlockscoutProvider**. 21026 */ 21027 constructor(_network, apiKey) { 21028 if (_network == null) _network = "mainnet"; 21029 const network = Network.from(_network); 21030 if (apiKey == null) apiKey = defaultApiKey; 21031 const request = BlockscoutProvider.getRequest(network); 21032 super(request, network, { staticNetwork: network }); 21033 defineProperties(this, { apiKey }); 21034 } 21035 _getProvider(chainId) { 21036 try { 21037 return new BlockscoutProvider(chainId, this.apiKey); 21038 } catch (error) {} 21039 return super._getProvider(chainId); 21040 } 21041 isCommunityResource() { 21042 return this.apiKey === null; 21043 } 21044 getRpcRequest(req) { 21045 const resp = super.getRpcRequest(req); 21046 if (resp && resp.method === "eth_estimateGas" && resp.args.length == 1) { 21047 resp.args = resp.args.slice(); 21048 resp.args.push("latest"); 21049 } 21050 return resp; 21051 } 21052 getRpcError(payload, _error) { 21053 const error = _error ? _error.error : null; 21054 if (error && error.code === -32015 && !isHexString(error.data || "", true)) { 21055 const panicCodes = { 21056 "assert(false)": "01", 21057 "arithmetic underflow or overflow": "11", 21058 "division or modulo by zero": "12", 21059 "out-of-bounds array access; popping on an empty array": "31", 21060 "out-of-bounds access of an array or bytesN": "32" 21061 }; 21062 let panicCode = ""; 21063 if (error.message === "VM execution error.") panicCode = panicCodes[error.data] || ""; 21064 else if (panicCodes[error.message || ""]) panicCode = panicCodes[error.message || ""]; 21065 if (panicCode) { 21066 error.message += ` (reverted: ${error.data})`; 21067 error.data = "0x4e487b7100000000000000000000000000000000000000000000000000000000000000" + panicCode; 21068 } 21069 } else if (error && error.code === -32e3) { 21070 if (error.message === "wrong transaction nonce") error.message += "
21070(nonce too low)"; 21071 } 21072 return super.getRpcError(payload, _error); 21073 } 21074 /** 21075 * Returns a prepared request for connecting to %%network%% 21076 * with %%apiKey%%. 21077 */ 21078 static getRequest(network) { 21079 const request = new FetchRequest(getUrl(network.name)); 21080 request.allowGzip = true; 21081 return request; 21082 } 21083}; 21084//#endregion 21085//#region node_modules/ethers/lib.esm/providers/provider-pocket.js 21086/** 21087* [[link-pocket]] provides a third-party service for connecting to 21088* various blockchains over JSON-RPC. 21089* 21090* **Supported Networks** 21091* 21092* - Ethereum Mainnet (``mainnet``) 21093* - Goerli Testnet (``goerli``) 21094* - Polygon (``matic``) 21095* - Arbitrum (``arbitrum``) 21096* 21097* @_subsection: api/providers/thirdparty:Pocket [providers-pocket] 21098*/ 21099var defaultApplicationId = "62e1ad51b37b8e00394bda3b"; 21100function getHost(name) { 21101 switch (name) { 21102 case "mainnet": return "eth-mainnet.gateway.pokt.network"; 21103 case "goerli": return "eth-goerli.gateway.pokt.network"; 21104 case "matic": return "poly-mainnet.gateway.pokt.network"; 21105 case "matic-mumbai": return "polygon-mumbai-rpc.gateway.pokt.network"; 21106 } 21107 assertArgument(false, "unsupported network", "network", name); 21108} 21109/** 21110* The **PocketProvider** connects to the [[link-pocket]] 21111* JSON-RPC end-points. 21112* 21113* By default, a highly-throttled API key is used, which is 21114* appropriate for quick prototypes and simple scripts. To 21115* gain access to an increased rate-limit, it is highly 21116* recommended to [sign up here](link-pocket-signup). 21117*/ 21118var PocketProvider = class PocketProvider extends JsonRpcProvider { 21119 /** 21120 * The Application ID for the Pocket connection. 21121 */ 21122 applicationId; 21123 /** 21124 * The Application Secret for making authenticated requests 21125 * to the Pocket connection. 21126 */ 21127 applicationSecret; 21128 /** 21129 * Create a new **PocketProvider**. 21130 * 21131 * By default connecting to ``mainnet`` with a highly throttled 21132 * API key. 21133 */ 21134 constructor(_network, applicationId, applicationSecret) { 21135 if (_network == null) _network = "mainnet"; 21136 const network = Network.from(_network); 21137 if (applicationId == null) applicationId = defaultApplicationId; 21138 if (applicationSecret == null) applicationSecret = null; 21139 const options = { staticNetwork: network }; 21140 const request = PocketProvider.getRequest(network, applicationId, applicationSecret); 21141 super(request, network, options); 21142 defineProperties(this, { 21143 applicationId, 21144 applicationSecret 21145 }); 21146 } 21147 _getProvider(chainId) { 21148 try { 21149 return new PocketProvider(chainId, this.applicationId, this.applicationSecret); 21150 } catch (error) {} 21151 return super._getProvider(chainId); 21152 } 21153 /** 21154 * Returns a prepared request for connecting to %%network%% with 21155 * %%applicationId%%. 21156 */ 21157 static getRequest(network, applicationId, applicationSecret) { 21158 if (applicationId == null) applicationId = defaultApplicationId; 21159 const request = new FetchRequest(`https:/\/${getHost(network.name)}/v1/lb/${applicationId}`); 21160 request.allowGzip = true; 21161 if (applicationSecret) request.setCredentials("", applicationSecret); 21162 if (applicationId === defaultApplicationId) request.retryFunc = async (request, response, attempt) => { 21163 showThrottleMessage("PocketProvider"); 21164 return true; 21165 }; 21166 return request; 21167 } 21168 isCommunityResource() { 21169 return this.applicationId === defaultApplicationId; 21170 } 21171}; 21172//#endregion 21173//#region node_modules/ethers/lib.esm/providers/provider-ipcsocket-browser.js 21174var IpcSocketProvider = void 0; 21175//#endregion 21176//#region node_modules/ethers/lib.esm/wallet/base-wallet.js 21177/** 21178* The **BaseWallet** is a stream-lined implementation of a 21179* [[Signer]] that operates with a private key. 21180* 21181* It is preferred to use the [[Wallet]] class, as it offers 21182* additional functionality and simplifies loading a variety 21183* of JSON formats, Mnemonic Phrases, etc. 21184* 21185* This class may be of use for those attempting to implement 21186* a minimal Signer. 21187*/ 21188var BaseWallet = class BaseWallet extends AbstractSigner { 21189 /** 21190 * The wallet address. 21191 */ 21192 address; 21193 #signingKey; 21194 /** 21195 * Creates a new BaseWallet for %%privateKey%%, optionally 21196 * connected to %%provider%%. 21197 * 21198 * If %%provider%% is not specified, only offline methods can 21199 * be used. 21200 */ 21201 constructor(privateKey, provider) { 21202 super(provider); 21203 assertArgument(privateKey && typeof privateKey.sign === "function", "invalid private key", "privateKey", "[ REDACTED ]"); 21204 this.#signingKey = privateKey; 21205 const address = computeAddress(this.signingKey.publicKey); 21206 defineProperties(this, { address }); 21207 } 21208 /** 21209 * The [[SigningKey]] used for signing payloads. 21210 */ 21211 get signingKey() { 21212 return this.#signingKey; 21213 } 21214 /** 21215 * The private key for this wallet. 21216 */ 21217 get privateKey() { 21218 return this.signingKey.privateKey; 21219 } 21220 async getAddress() { 21221 return this.address; 21222 } 21223 connect(provider) { 21224 return new BaseWallet(this.#signingKey, provider); 21225 } 21226 async signTransaction(tx) { 21227 tx = copyRequest(tx); 21228 const { to, from } = await resolveProperties({ 21229 to: tx.to ? resolveAddress(tx.to, this) : void 0, 21230 from: tx.from ? resolveAddress(tx.from, this) : void 0 21231 }); 21232 if (to != null) tx.to = to; 21233 if (from != null) tx.from = from; 21234 if (tx.from != null) { 21235 assertArgument(getAddress(tx.from) === this.address, "transaction from address mismatch", "tx.from", tx.from); 21236 delete tx.from; 21237 } 21238 const btx = Transaction.from(tx); 21239 btx.signature = this.signingKey.sign(btx.unsignedHash); 21240 return btx.serialized; 21241 } 21242 async signMessage(message) { 21243 return this.signMessageSync(message); 21244 } 21245 /** 21246 * Returns the signature for %%message%% signed with this wallet. 21247 */ 21248 signMessageSync(message) { 21249 return this.signingKey.sign(hashMessage(message)).serialized; 21250 } 21251 /** 21252 * Returns the Authorization for %%auth%%. 21253 */ 21254 authorizeSync(auth) { 21255 assertArgument(typeof auth.address === "string", "invalid address for authorizeSync", "auth.address", auth); 21256 const signature = this.signingKey.sign(hashAuthorization(auth)); 21257 return Object.assign({}, { 21258 address: getAddress(auth.address), 21259 nonce: getBigInt(auth.nonce || 0), 21260 chainId: getBigInt(auth.chainId || 0) 21261 }, { signature }); 21262 } 21263 /** 21264 * Resolves to the Authorization for %%auth%%. 21265 */ 21266 async authorize(auth) { 21267 auth = Object.assign({}, auth, { address: await resolveAddress(auth.address, this) }); 21268 return this.authorizeSync(await this.populateAuthorization(auth)); 21269 } 21270 async signTypedData(domain, types, value) { 21271 const populated = await TypedDataEncoder.resolveNames(domain, types, value, async (name) => { 21272 assert(this.provider != null, "cannot resolve ENS names without a provider", "UNSUPPORTED_OPERATION", { 21273 operation: "resolveName", 21274 info: { name } 21275 }); 21276 const address = await this.provider.resolveName(name); 21277 assert(address != null, "unconfigured ENS name", "UNCONFIGURED_NAME", { value: name }); 21278 return address; 21279 }); 21280 return this.signingKey.sign(TypedDataEncoder.hash(populated.domain, types, populated.value)).serialized; 21281 } 21282}; 21283//#endregion 21284//#region node_modules/ethers/lib.esm/wordlists/decode-owl.js 21285var subsChrs = " !#$%&'()*+,-./<=>?@[]^_`{|}~"; 21286var Word = /^[a-z]*$/i; 21287function unfold(words, sep) { 21288 let initial = 97; 21289 return words.reduce((accum, word) => { 21290 if (word === sep) initial++; 21291 else if (word.match(Word)) accum.push(String.fromCharCode(initial) + word); 21292 else { 21293 initial = 97; 21294 accum.push(word); 21295 } 21296 return accum; 21297 }, []); 21298} 21299/** 21300* @_ignore 21301*/ 21302function decode(data, subs) { 21303 for (let i = 28; i >= 0;
21303 i--) data = data.split(subsChrs[i]).join(subs.substring(2 * i, 2 * i + 2)); 21304 const clumps = []; 21305 const leftover = data.replace(/(:|([0-9])|([A-Z][a-z]*))/g, (all, item, semi, word) => { 21306 if (semi) for (let i = parseInt(semi); i >= 0; i--) clumps.push(";"); 21307 else clumps.push(item.toLowerCase()); 21308 return ""; 21309 }); 21310 /* c8 ignore start */ 21311 if (leftover) throw new Error(`leftovers: ${JSON.stringify(leftover)}`); 21312 /* c8 ignore stop */ 21313 return unfold(unfold(clumps, ";"), ":"); 21314} 21315/** 21316* @_ignore 21317*/ 21318function decodeOwl(data) { 21319 assertArgument(data[0] === "0", "unsupported auwl data", "data", data); 21320 return decode(data.substring(59), data.substring(1, 59)); 21321} 21322//#endregion 21323//#region node_modules/ethers/lib.esm/wordlists/wordlist.js 21324/** 21325* A Wordlist represents a collection of language-specific 21326* words used to encode and devoce [[link-bip-39]] encoded data 21327* by mapping words to 11-bit values and vice versa. 21328*/ 21329var Wordlist = class { 21330 locale; 21331 /** 21332 * Creates a new Wordlist instance. 21333 * 21334 * Sub-classes MUST call this if they provide their own constructor, 21335 * passing in the locale string of the language. 21336 * 21337 * Generally there is no need to create instances of a Wordlist, 21338 * since each language-specific Wordlist creates an instance and 21339 * there is no state kept internally, so they are safe to share. 21340 */ 21341 constructor(locale) { 21342 defineProperties(this, { locale }); 21343 } 21344 /** 21345 * Sub-classes may override this to provide a language-specific 21346 * method for spliting %%phrase%% into individual words. 21347 * 21348 * By default, %%phrase%% is split using any sequences of 21349 * white-space as defined by regular expressions (i.e. ``/\s+/``). 21350 */ 21351 split(phrase) { 21352 return phrase.toLowerCase().split(/\s+/g); 21353 } 21354 /** 21355 * Sub-classes may override this to provider a language-specific 21356 * method for joining %%words%% into a phrase. 21357 * 21358 * By default, %%words%% are joined by a single space. 21359 */ 21360 join(words) { 21361 return words.join(" "); 21362 } 21363}; 21364//#endregion 21365//#region node_modules/ethers/lib.esm/wordlists/wordlist-owl.js 21366/** 21367* An OWL format Wordlist is an encoding method that exploits 21368* the general locality of alphabetically sorted words to 21369* achieve a simple but effective means of compression. 21370* 21371* This class is generally not useful to most developers as 21372* it is used mainly internally to keep Wordlists for languages 21373* based on ASCII-7 small. 21374* 21375* If necessary, there are tools within the ``generation/`` folder 21376* to create the necessary data. 21377*/ 21378var WordlistOwl = class extends Wordlist { 21379 #data; 21380 #checksum; 21381 /** 21382 * Creates a new Wordlist for %%locale%% using the OWL %%data%% 21383 * and validated against the %%checksum%%. 21384 */ 21385 constructor(locale, data, checksum) { 21386 super(locale); 21387 this.#data = data; 21388 this.#checksum = checksum; 21389 this.#words = null; 21390 } 21391 /** 21392 * The OWL-encoded data. 21393 */ 21394 get _data() { 21395 return this.#data; 21396 } 21397 /** 21398 * Decode all the words for the wordlist. 21399 */ 21400 _decodeWords() { 21401 return decodeOwl(this.#data); 21402 } 21403 #words; 21404 #loadWords() { 21405 if (this.#words == null) { 21406 const words = this._decodeWords(); 21407 /* c8 ignore start */ 21408 if (id(words.join("\n") + "\n") !== this.#checksum) throw new Error(`BIP39 Wordlist for ${this.locale} FAILED`); 21409 /* c8 ignore stop */ 21410 this.#words = words; 21411 } 21412 return this.#words; 21413 } 21414 getWord(index) { 21415 const words = this.#loadWords(); 21416 assertArgument(index >= 0 && index < words.length, `invalid word index: ${index}`, "index", index); 21417 return words[index]; 21418 } 21419 getWordIndex(word) { 21420 return this.#loadWords().indexOf(word); 21421 } 21422}; 21423//#endregion 21424//#region node_modules/ethers/lib.esm/wordlists/lang-en.js 21425var words = "0erleonalorenseinceregesticitStanvetearctssi#ch2Athck&tneLl0And#Il.yLeOutO=S|S%b/ra@SurdU'0Ce[Cid|CountCu'Hie=IdOu,-Qui*Ro[TT]T%T*[Tu$0AptDD-tD*[Ju,M.UltV<)Vi)0Rob-0FairF%dRaid0A(EEntRee0Ead0MRRp%tS!_rmBumCoholErtI&LLeyLowMo,O}PhaReadySoT Ways0A>urAz(gOngOuntU'd0Aly,Ch%Ci|G G!GryIm$K!Noun)Nu$O` Sw T&naTiqueXietyY1ArtOlogyPe?P!Pro=Ril1ChCt-EaEnaGueMMedM%MyOundR<+Re,Ri=RowTTefa@Ti,Tw%k0KPe@SaultSetSi,SumeThma0H!>OmTa{T&dT.udeTra@0Ct]D.Gu,NtTh%ToTumn0Era+OcadoOid0AkeA*AyEsomeFulKw?d0Is:ByChel%C#D+GL<)Lc#y~MbooN<aNn RRelyRga(R*lSeS-SketTt!3A^AnAutyCau'ComeEfF%eG(Ha=H(dLie=LowLtN^Nef./TrayTt Twe&Y#d3Cyc!DKeNdOlogyRdR`Tt _{AdeAmeAnketA,EakE[IndOodO[omOu'Ue
21425UrUsh_rdAtDyIlMbNeNusOkO,Rd R(gRrowSsTtomUn)XY_{etA(AndA[A=EadEezeI{Id+IefIghtIngIskOccoliOk&OnzeOomO` OwnUsh2Bb!DdyD+tFf$oIldLbLkL!tNd!Nk Rd&Rg R,SS(e[SyTt Y Zz:Bba+B(B!CtusGeKe~LmM aMpNN$N)lNdyNn#NoeNvasNy#Pab!P.$Pta(RRb#RdRgoRpetRryRtSeShS(o/!Su$TT$ogT^Teg%yTt!UghtU'Ut]Ve3Il(gL yM|NsusNturyRe$Rta(_irAlkAmp]An+AosApt Ar+A'AtEapE{Ee'EfErryE,I{&IefIldIm}yOi)Oo'R#-U{!UnkUrn0G?Nnam#Rc!Tiz&TyVil_imApArifyAwAyE<ErkEv I{I|IffImbIn-IpO{OgO'O`OudOwnUbUmpU, Ut^_^A,C#utDeFfeeIlInL!@L%LumnMb(eMeMf%tM-Mm#Mp<yNc tNdu@NfirmNg*[N}@Nsid NtrolNv()OkOlPp PyR$ReRnR*@/Tt#U^UntryUp!Ur'Us(V Yo>_{Ad!AftAmA}AshAt AwlAzyEamEd.EekEwI{etImeIspIt-OpO[Ou^OwdUci$UelUi'Umb!Un^UshYY,$2BeLtu*PPbo?dRiousRr|Rta(R=Sh]/omTe3C!:DMa+MpN)Ng R(gShUght WnY3AlBa>BrisCadeCemb CideCl(eC%a>C*a'ErF&'F(eFyG*eLayLiv M<dMi'Ni$Nti,NyP?tP&dPos.P`PutyRi=ScribeS tSignSkSpair/royTailTe@VelopVi)Vo>3AgramAlAm#dAryCeE'lEtFf G.$Gn.yLemmaNn NosaurRe@RtSag*eScov Sea'ShSmi[S%d Splay/<)V tVideV%)Zzy5Ct%Cum|G~Lph(Ma(Na>NkeyN%OrSeUb!Ve_ftAg#AmaA,-AwEamE[IftIllInkIpI=OpUmY2CkMbNeR(g/T^Ty1Arf1Nam-:G G!RlyRnR`Sily/Sy1HoOlogyOnomy0GeItUca>1F%t0G1GhtTh 2BowD E@r-Eg<tEm|Eph<tEvat%I>Se0B?kBodyBra)Er+Ot]PloyPow Pty0Ab!A@DD![D%'EmyErgyF%)Ga+G(eH<)JoyLi,OughR-hRollSu*T Ti*TryVelope1Isode0U$Uip0AA'OdeOs]R%Upt0CapeSayS&)Ta>0Ern$H-s1Id&)IlOkeOl=1A@Amp!Ce[Ch<+C.eCludeCu'Ecu>Erci'Hau,Hib.I!I,ItOt-P<dPe@Pi*Pla(Po'P*[T&dTra0EEbrow:Br-CeCultyDeIntI`~L'MeMilyMousNNcyNtasyRmSh]TT$Th TigueUltV%.e3Atu*Bru?yD $EEdElMa!N)/iv$T^V W3B Ct]EldGu*LeLmLt N$NdNeNg NishReRmR,Sc$ShTT}[X_gAmeAshAtAv%EeIghtIpOatO{O%Ow UidUshY_mCusGIlLd~owOdOtR)Re,R+tRkRtu}RumRw?dSsil/ UndX_gi!AmeEqu|EshI&dIn+OgOntO,OwnOz&U.2ElNNnyRna)RyTu*:D+tInLaxy~ yMePRa+Rba+Rd&Rl-Rm|SSpTeTh U+Ze3N $NiusN*Nt!Nu(e/u*2O,0AntFtGg!Ng RaffeRlVe_dAn)A*A[IdeImp'ObeOomOryO=OwUe_tDde[LdOdO'RillaSpelSsipV nWn_bA)A(AntApeA[Av.yEatE&IdIefItOc yOupOwUnt_rdE[IdeIltIt?N3M:B.IrLfMm M, NdPpyRb%RdRshR=,TVeWkZ?d3AdAl`ArtAvyD+hogIght~oLmetLpNRo3Dd&Gh~NtPRe/%y5BbyCkeyLdLeLiday~owMeNeyOdPeRnRr%R'Sp.$/TelUrV 5BGeM<Mb!M%Nd*dNgryNtRd!RryRtSb<d3Brid:1EOn0EaEntifyLe2N%e4LLeg$L}[0A+Ita>M&'Mu}Pa@Po'Pro=Pul'0ChCludeComeC*a'DexD-a>Do%Du,ryF<tFl-tF%mHa!H .Iti$Je@JuryMa>N Noc|PutQuiryS<eSe@SideSpi*/$lTa@T e,ToVe,V.eVol=3On0L<dOla>Sue0Em1Ory:CketGu?RZz3AlousAns~yWel9BInKeUr}yY5D+I)MpNg!Ni%Nk/:Ng?oo3EnEpT^upY3CkDD}yNdNgdomSsTT^&TeTt&Wi4EeIfeO{Ow:BBelB%Dd DyKeMpNgua+PtopR+T T(UghUndryVaWWnWsu.Y Zy3Ad AfArnA=Ctu*FtGG$G&dIsu*M#NdNg`NsOp?dSs#Tt Vel3ArB tyBr?yC&'FeFtGhtKeMbM.NkOnQuid/Tt!VeZ?d5AdAnB, C$CkG-NelyNgOpTt yUdUn+VeY$5CkyGga+Mb N?N^Xury3R-s:Ch(eDG-G}tIdIlInJ%KeMm$NNa+Nda>NgoNs]Nu$P!Rb!R^Rg(R(eRketRria+SkSs/ T^T i$ThTrixTt XimumZe3AdowAnAsu*AtCh<-D$DiaLodyLtMb M%yNt]NuRcyR+R.RryShSsa+T$Thod3Dd!DnightLk~]M-NdNimumN%Nu>Rac!Rr%S ySs/akeXXedXtu*5Bi!DelDifyMM|N.%NkeyN, N`OnR$ReRn(gSqu.oTh T]T%Unta(U'VeVie5ChFf(LeLtiplySc!SeumShroomS-/Tu$3Self/ yTh:I=MePk(Rrow/yT]Tu*3ArCkEdGati=G!@I` PhewR=/TTw%kUtr$V WsXt3CeGht5B!I'M(eeOd!Rm$R`SeTab!TeTh(gTi)VelW5C!?Mb R'T:K0EyJe@Li+Scu*S =Ta(Vious0CurE<Tob 0Or1FF Fi)T&2L1Ay0DI=Ymp-0It0CeEI#L(eLy1EnEraIn]Po'T]1An+B.Ch?dD D(?yG<I|Ig($Ph<0Tr-h0H 0Tdo%T TputTside0AlEnEr0NN 0Yg&0/ 0O}:CtDd!GeIrLa)LmNdaNelN-N` P RadeR|RkRrotRtySsT^ThTi|TrolTt nU'VeYm|3A)AnutArAs<tL-<NN$tyNcilOp!Pp [email protected]#T2O}OtoRa'Ys-$0AnoCn-Ctu*E)GGe#~LotNkO} Pe/olT^Zza_)A}tA,-A>AyEa'Ed+U{UgUn+2EmEtIntL?LeLi)NdNyOlPul?Rt]S.]Ssib!/TatoTt yV tyWd W _@i)Ai'Ed-tEf Epa*Es|EttyEv|I)IdeIm?yIntI%.yIs#Iva>IzeOb!mO)[Odu)Of.OgramOje@Omo>OofOp tyOsp O>@OudOvide2Bl-Dd(g~LpL'Mpk(N^PilPpyR^a'R.yRpo'R'ShTZz!3Ramid:99Al.yAntumArt E,]I{ItIzO>:Bb.Cco#CeCkD?DioIlInI'~yMpN^NdomN+PidReTeTh V&WZ%3AdyAlAs#BelBuildC$lCei=CipeC%dCyc!Du)F!@F%mFu'G]G*tGul?Je@LaxLea'LiefLyMa(Memb M(dMo=Nd NewNtOp&PairPeatPla)P%tQui*ScueSemb!Si,Sour)Sp#'SultTi*T*atTurnUn]Ve$ViewW?d2Y`m0BBb#CeChDeD+F!GhtGidNgOtPp!SkTu$V$V 5AdA,BotBu,CketM<)OfOkieOmSeTa>UghUndU>Y$5Bb DeGLeNNwayR$:DDd!D}[FeIlLadLm#L#LtLu>MeMp!NdTisfyToshiU)Usa+VeY1A!AnA*Att E}HemeHoolI&)I[%sOrp]OutRapRe&RiptRub1AAr^As#AtC#dC*tCt]Cur.yEdEkGm|Le@~M(?Ni%N'Nt&)RiesRvi)Ss]Tt!TupV&_dowAftAllowA*EdEllEriffIeldIftI}IpIv O{OeOotOpOrtOuld O=RimpRugUff!Y0Bl(gCkDeE+GhtGnL|Lk~yLv Mil?Mp!N)NgR&/ Tua>XZe1A>
21425Et^IIllInIrtUll0AbAmEepEnd I)IdeIghtImOg<OtOwUsh0AllArtI!OkeOo`0A{AkeApIffOw0ApCc Ci$CkDaFtL?Ldi LidLut]L=Me#eNgOnRryRtUlUndUpUr)U`0A)A*Ati$AwnEakEci$EedEllEndH eI)Id IkeInIr.L.OilOns%O#OrtOtRayReadR(gY0Ua*UeezeUir*l_b!AdiumAffA+AirsAmpAndArtA>AyEakEelEmEpE*oI{IllIngO{Oma^O}OolOryO=Ra>gyReetRikeR#gRugg!Ud|[email protected])[ChDd&Ff G?G+,ItMm NNnyN'tP PplyP*meReRfa)R+Rpri'RroundR=ySpe@/a(1AllowAmpApArmE?EetIftImIngIt^Ord1MbolMptomRup/em:B!Ck!GIlL|LkNkPeR+tSk/eTtooXi3A^Am~NN<tNnisNtRm/Xt_nkAtEmeEnE%yE*EyIngIsOughtReeRi=RowUmbUnd 0CketDeG LtMb MeNyPRedSsueT!5A,BaccoDayDdl EGe` I!tK&MatoM%rowNeNgueNightOlO`PP-Pp!R^RnadoRtoi'SsT$Uri,W?dW WnY_{AdeAff-Ag-A(Ansf ApAshA=lAyEatEeEndI$IbeI{Igg ImIpOphyOub!U{UeUlyUmpetU,U`Y2BeIt]Mb!NaN}lRkeyRnRt!1El=EntyI)InI,O1PeP-$:5Ly5B*lla0Ab!Awa*C!Cov D DoFairFoldHappyIf%mIqueItIv 'KnownLo{TilUsu$Veil1Da>GradeHoldOnP Set1B<Ge0A+EEdEfulE![U$0Il.y:C<tCuumGueLidL!yL=NNishP%Rious/Ult3H-!L=tNd%Ntu*NueRbRifyRs]RyS'lT <3Ab!Br<tCiousCt%yDeoEw~a+Nta+Ol(Rtu$RusSaS.Su$T$Vid5C$I)IdLc<oLumeTeYa+:GeG#ItLk~LnutNtRfa*RmRri%ShSp/eT VeY3Al`Ap#ArA'lA` BDd(gEk&dIrdLcome/T_!AtEatEelEnE*IpIsp 0DeD`FeLd~NNdowNeNgNkNn Nt ReSdomSeShT}[5LfM<Nd OdOlRdRkRldRryR`_pE{E,!I,I>Ong::Rd3Ar~ow9UUngU`:3BraRo9NeO"; 21426var checksum = "0x3c8acc1e7b08d8e76f9fda015ef48dc8c710a73cb7e0f77b2c18a9b5a7adde60"; 21427var wordlist = null; 21428/** 21429* The [[link-bip39-en]] for [mnemonic phrases](link-bip-39). 21430* 21431* @_docloc: api/wordlists 21432*/ 21433var LangEn = class LangEn extends WordlistOwl { 21434 /** 21435 * Creates a new instance of the English language Wordlist. 21436 * 21437 * This should be unnecessary most of the time as the exported 21438 * [[langEn]] should suffice. 21439 * 21440 * @_ignore: 21441 */ 21442 constructor() { 21443 super("en", words, checksum); 21444 } 21445 /** 21446 * Returns a singleton instance of a ``LangEn``, creating it 21447 * if this is the first time being called. 21448 */ 21449 static wordlist() { 21450 if (wordlist == null) wordlist = new LangEn();
21451 return wordlist; 21452 } 21453}; 21454//#endregion 21455//#region node_modules/ethers/lib.esm/wallet/mnemonic.js 21456function getUpperMask(bits) { 21457 return (1 << bits) - 1 << 8 - bits & 255; 21458} 21459function getLowerMask(bits) { 21460 return (1 << bits) - 1 & 255; 21461} 21462function mnemonicToEntropy(mnemonic, wordlist) { 21463 assertNormalize("NFKD"); 21464 if (wordlist == null) wordlist = LangEn.wordlist(); 21465 const words = wordlist.split(mnemonic); 21466 assertArgument(words.length % 3 === 0 && words.length >= 12 && words.length <= 24, "invalid mnemonic length", "mnemonic", "[ REDACTED ]"); 21467 const entropy = new Uint8Array(Math.ceil(11 * words.length / 8)); 21468 let offset = 0; 21469 for (let i = 0; i < words.length; i++) { 21470 let index = wordlist.getWordIndex(words[i].normalize("NFKD")); 21471 assertArgument(index >= 0, `invalid mnemonic word at index ${i}`, "mnemonic", "[ REDACTED ]"); 21472 for (let bit = 0; bit < 11; bit++) { 21473 if (index & 1 << 10 - bit) entropy[offset >> 3] |= 1 << 7 - offset % 8; 21474 offset++; 21475 } 21476 } 21477 const entropyBits = 32 * words.length / 3; 21478 const checksumMask = getUpperMask(words.length / 3); 21479 assertArgument((getBytes(sha256(entropy.slice(0, entropyBits / 8)))[0] & checksumMask) === (entropy[entropy.length - 1] & checksumMask), "invalid mnemonic checksum", "mnemonic", "[ REDACTED ]"); 21480 return hexlify(entropy.slice(0, entropyBits / 8)); 21481} 21482function entropyToMnemonic(entropy, wordlist) { 21483 assertArgument(entropy.length % 4 === 0 && entropy.length >= 16 && entropy.length <= 32, "invalid entropy size", "entropy", "[ REDACTED ]"); 21484 if (wordlist == null) wordlist = LangEn.wordlist(); 21485 const indices = [0]; 21486 let remainingBits = 11; 21487 for (let i = 0; i < entropy.length; i++) if (remainingBits > 8) { 21488 indices[indices.length - 1] <<= 8; 21489 indices[indices.length - 1] |= entropy[i]; 21490 remainingBits -= 8; 21491 } else { 21492 indices[indices.length - 1] <<= remainingBits; 21493 indices[indices.length - 1] |= entropy[i] >> 8 - remainingBits; 21494 indices.push(entropy[i] & getLowerMask(8 - remainingBits)); 21495 remainingBits += 3; 21496 } 21497 const checksumBits = entropy.length / 4; 21498 const checksum = parseInt(sha256(entropy).substring(2, 4), 16) & getUpperMask(checksumBits); 21499 indices[indices.length - 1] <<= checksumBits; 21500 indices[indices.length - 1] |= checksum >> 8 - checksumBits;
21501 return wordlist.join(indices.map((index) => wordlist.getWord(index))); 21502} 21503var _guard$1 = {}; 21504/** 21505* A **Mnemonic** wraps all properties required to compute [[link-bip-39]] 21506* seeds and convert between phrases and entropy. 21507*/ 21508var Mnemonic = class Mnemonic { 21509 /** 21510 * The mnemonic phrase of 12, 15, 18, 21 or 24 words. 21511 * 21512 * Use the [[wordlist]] ``split`` method to get the individual words. 21513 */ 21514 phrase; 21515 /** 21516 * The password used for this mnemonic. If no password is used this 21517 * is the empty string (i.e. ``""``) as per the specification. 21518 */ 21519 password; 21520 /** 21521 * The wordlist for this mnemonic. 21522 */ 21523 wordlist; 21524 /** 21525 * The underlying entropy which the mnemonic encodes. 21526 */ 21527 entropy; 21528 /** 21529 * @private 21530 */ 21531 constructor(guard, entropy, phrase, password, wordlist) { 21532 if (password == null) password = ""; 21533 if (wordlist == null) wordlist = LangEn.wordlist(); 21534 assertPrivate(guard, _guard$1, "Mnemonic"); 21535 defineProperties(this, { 21536 phrase, 21537 password, 21538 wordlist, 21539 entropy 21540 }); 21541 } 21542 /** 21543 * Returns the seed for the mnemonic. 21544 */ 21545 computeSeed() { 21546 const salt = toUtf8Bytes("mnemonic" + this.password, "NFKD"); 21547 return pbkdf2(toUtf8Bytes(this.phrase, "NFKD"), salt, 2048, 64, "sha512"); 21548 } 21549 /** 21550 * Creates a new Mnemonic for the %%phrase%%. 21551 * 21552 * The default %%password%% is the empty string and the default 21553 * wordlist is the [English wordlists](LangEn). 21554 */ 21555 static fromPhrase(phrase, password, wordlist) { 21556 const entropy = mnemonicToEntropy(phrase, wordlist); 21557 phrase = entropyToMnemonic(getBytes(entropy), wordlist); 21558 return new Mnemonic(_guard$1, entropy, phrase, password, wordlist); 21559 } 21560 /** 21561 * Create a new **Mnemonic** from the %%entropy%%. 21562 * 21563 * The default %%password%% is the empty string and the default 21564 * wordlist is the [English wordlists](LangEn). 21565 */ 21566 static fromEntropy(_entropy, password, wordlist) { 21567 const entropy = getBytes(_entropy, "entropy"); 21568 const phrase = entropyToMnemonic(entropy, wordlist); 21569 return new Mnemonic(_guard$1, hexlify(entropy), phrase, password, wordlist); 21570 } 21571 /** 21572 * Returns the phrase for %%mnemonic%%. 21573 */ 21574 static entropyToPhrase(_entropy, wordlist) { 21575 return entropyToMnemonic(getBytes(_entropy, "entropy"), wordlist); 21576 } 21577 /** 21578 * Returns the entropy for %%phrase%%. 21579 */ 21580 static phraseToEntropy(phrase, wordlist) { 21581 return mnemonicToEntropy(phrase, wordlist); 21582 } 21583 /** 21584 * Returns true if %%phrase%% is a valid [[link-bip-39]] phrase. 21585 * 21586 * This checks all the provided words belong to the %%wordlist%%, 21587 * that the length is valid and the checksum is correct. 21588 */ 21589 static isValidMnemonic(phrase, wordlist) { 21590 try { 21591 mnemonicToEntropy(phrase, wordlist); 21592 return true; 21593 } catch (error) {} 21594 return false; 21595 } 21596}; 21597//#endregion 21598//#region node_modules/aes-js/lib.esm/aes.js 21599/*! MIT License. Copyright 2015-2022 Richard Moore <[email protected]>. See LICENSE.txt. */ 21600var __classPrivateFieldGet$2 = function(receiver, state, kind, f) { 21601 if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a getter"); 21602 if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot read private member from an object whose class did not declare it"); 21603 return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver); 21604}; 21605var __classPrivateFieldSet$2 = function(receiver, state, value, kind, f) { 21606 if (kind === "m") throw new TypeError("Private method is not writable"); 21607 if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a setter"); 21608 if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot write private member to an object whose class did not declare it"); 21609 return kind === "a" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value), value; 21610}; 21611var _AES_key; 21612var _AES_Kd; 21613var _AES_Ke; 21614var numberOfRounds = { 21615 16: 10, 21616 24: 12, 21617 32: 14 21618}; 21619var rcon = [ 21620 1, 21621 2, 21622 4, 21623 8, 21624 16, 21625 32, 21626 64, 21627 128, 21628 27, 21629 54, 21630 108, 21631 216, 21632 171, 21633 77, 21634 154, 21635 47, 21636 94, 21637 188, 21638 99, 21639 198, 21640 151, 21641 53, 21642 106, 21643 212, 21644 179, 21645 125, 21646 250, 21647 239, 21648 197, 21649 145 21650]; 21651var S = [ 21652 99, 21653 124, 21654 119, 21655 123, 21656 242, 21657 107, 21658 111, 21659 197, 21660 48, 21661 1, 21662 103, 21663 43, 21664 254, 21665 215, 21666 171, 21667 118, 21668 202, 21669 130, 21670 201, 21671 125, 21672 250, 21673 89, 21674 71, 21675 240, 21676 173, 21677 212, 21678 162, 21679 175, 21680 156, 21681 164, 21682 114, 21683 192, 21684 183, 21685 253, 21686 147, 21687 38, 21688 54, 21689 63, 21690 247, 21691 204, 21692 52, 21693 165, 21694 229, 21695 241, 21696 113, 21697 216, 21698 49, 21699 21, 21700 4, 21701 199, 21702 35, 21703 195, 21704 24, 21705 150, 21706 5, 21707 154, 21708 7,
21709 18, 21710 128, 21711 226, 21712 235, 21713 39, 21714 178, 21715 117, 21716 9, 21717 131, 21718 44, 21719 26, 21720 27, 21721 110, 21722 90, 21723 160, 21724 82, 21725 59, 21726 214, 21727 179, 21728 41, 21729 227, 21730 47, 21731 132, 21732 83, 21733 209, 21734 0, 21735 237, 21736 32, 21737 252, 21738 177, 21739 91, 21740 106, 21741 203, 21742 190, 21743 57, 21744 74, 21745 76, 21746 88, 21747 207, 21748 208, 21749 239, 21750 170, 21751 251, 21752 67, 21753 77, 21754 51, 21755 133, 21756 69, 21757 249, 21758 2, 21759 127, 21760 80, 21761 60, 21762 159, 21763 168, 21764 81, 21765 163, 21766 64, 21767 143, 21768 146, 21769 157, 21770 56, 21771 245, 21772 188, 21773 182, 21774 218, 21775 33, 21776 16, 21777 255, 21778 243, 21779 210, 21780 205, 21781 12, 21782 19, 21783 236, 21784 95, 21785 151, 21786 68, 21787 23, 21788 196, 21789 167, 21790 126, 21791 61, 21792 100, 21793 93, 21794 25, 21795 115, 21796 96, 21797 129, 21798 79, 21799 220, 21800 34, 21801 42, 21802 144, 21803 136, 21804 70, 21805 238, 21806 184, 21807 20, 21808 222, 21809 94, 21810 11, 21811 219, 21812 224, 21813 50, 21814 58, 21815 10, 21816 73, 21817 6, 21818 36, 21819 92, 21820 194, 21821 211, 21822 172, 21823 98, 21824 145, 21825 149, 21826 228, 21827 121, 21828 231, 21829 200, 21830 55, 21831 109, 21832 141, 21833 213, 21834 78, 21835 169, 21836 108, 21837 86, 21838 244, 21839 234, 21840 101, 21841 122, 21842 174, 21843 8, 21844 186, 21845 120, 21846 37, 21847 46, 21848 28, 21849 166, 21850 180, 21851 198, 21852 232, 21853 221, 21854 116, 21855 31, 21856 75, 21857 189, 21858 139, 21859 138, 21860 112, 21861 62, 21862 181, 21863 102, 21864 72, 21865 3, 21866 246, 21867 14, 21868 97, 21869 53, 21870 87, 21871 185, 21872 134, 21873 193, 21874 29, 21875 158, 21876 225, 21877 248, 21878 152, 21879 17, 21880 105, 21881 217, 21882 142, 21883 148, 21884 155, 21885 30, 21886 135, 21887 233, 21888 206, 21889 85, 21890 40, 21891 223, 21892 140, 21893 161, 21894 137, 21895 13, 21896 191, 21897 230, 21898 66, 21899 104, 21900 65, 21901 153, 21902 45, 21903 15, 21904 176, 21905 84, 21906 187, 21907 22 21908]; 21909var Si = [ 21910 82, 21911 9, 21912 106, 21913 213, 21914 48, 21915 54, 21916 165, 21917 56, 21918 191, 21919 64, 21920 163, 21921 158, 21922 129, 21923 243, 21924 215, 21925 251, 21926 124, 21927 227, 21928 57, 21929 130, 21930 155, 21931 47, 21932 255, 21933 135, 21934 52, 21935 142, 21936 67, 21937 68, 21938 196, 21939 222, 21940 233, 21941 203, 21942 84, 21943 123, 21944 148, 21945 50, 21946 166, 21947 194, 21948 35, 21949 61, 21950 238, 21951 76, 21952 149, 21953 11, 21954 66, 21955 250, 21956 195, 21957 78, 21958 8, 21959 46, 21960 161, 21961 102, 21962 40, 21963 217, 21964 36, 21965 178, 21966 118, 21967 91, 21968 162, 21969 73, 21970 109, 21971 139, 21972 209, 21973 37, 21974 114, 21975 248, 21976 246, 21977 100, 21978 134, 21979 104, 21980 152, 21981 22, 21982 212, 21983 164, 21984 92, 21985 204, 21986 93, 21987 101, 21988 182, 21989 146, 21990 108, 21991 112, 21992 72, 21993 80, 21994 253, 21995 237, 21996 185, 21997 218, 21998 94, 21999 21, 22000 70, 22001 87, 22002 167, 22003 141, 22004 157, 22005 132, 22006 144, 22007 216, 22008 171, 22009 0, 22010 140, 22011 188, 22012 211, 22013 10, 22014 247, 22015 228, 22016 88, 22017 5, 22018 184, 22019 179, 22020 69, 22021 6, 22022 208, 22023 44, 22024 30, 22025 143, 22026 202, 22027 63, 22028 15, 22029 2, 22030 193, 22031 175, 22032 189, 22033 3, 22034 1, 22035 19, 22036 138, 22037 107, 22038 58, 22039 145, 22040 17, 22041 65, 22042 79, 22043 103, 22044 220, 22045 234, 22046 151, 22047 242, 22048 207, 22049 206, 22050 240, 22051 180, 22052 230, 22053 115, 22054 150, 22055 172, 22056 116, 22057 34, 22058 231, 22059 173, 22060 53, 22061 133, 22062 226, 22063 249, 22064 55, 22065 232, 22066 28, 22067 117, 22068 223, 22069 110, 22070 71, 22071 241, 22072 26, 22073 113, 22074 29, 22075 41, 22076 197, 22077 137, 22078 111, 22079 183, 22080 98, 22081 14, 22082 170, 22083 24, 22084 190, 22085 27, 22086 252, 22087 86, 22088 62, 22089 75, 22090 198, 22091 210, 22092 121, 22093 32, 22094 154, 22095 219, 22096 192, 22097 254, 22098 120, 22099 205, 22100 90, 22101 244, 22102 31, 22103 221, 22104 168, 22105 51, 22106 136, 22107 7, 22108 199, 22109 49, 22110 177, 22111 18, 22112 16, 22113 89, 22114 39, 22115 128, 22116 236, 22117 95, 22118 96, 22119 81, 22120 127, 22121 169, 22122 25, 22123 181, 22124 74, 22125 13, 22126 45, 22127 229, 22128 122, 22129 159, 22130 147, 22131 201, 22132 156, 22133 239, 22134 160, 22135 224, 22136 59, 22137 77, 22138 174, 22139 42, 22140 245, 22141 176, 22142 200, 22143 235, 22144 187, 22145 60, 22146 131, 22147 83, 22148 153, 22149 97, 22150 23, 22151 43, 22152 4, 22153 126, 22154 186, 22155 119, 22156 214, 22157 38, 22158 225, 22159 105, 22160 20, 22161 99, 22162 85, 22163 33, 22164 12, 22165 125 22166]; 22167var T1 = [ 22168 3328402341, 22169 4168907908, 22170 4000806809, 22171 4135287693, 22172 4294111757, 22173 3597364157, 22174 3731845041, 22175 2445657428, 22176 1613770832, 22177 33620227, 22178 3462883241, 22179 1445669757, 22180 3892248089, 22181 3050821474, 22182 1303096294, 22183 3967186586, 22184 2412431941, 22185 528646813, 22186 2311702848, 22187 4202528135, 22188 4026202645, 22189 2992200171, 22190 2387036105, 22191 4226871307, 22192 1101901292, 22193 3017069671, 22194 1604494077, 22195 1169141738, 22196 597466303, 22197 1403299063, 22198 3832705686, 22199 2613100635, 22200 1974974402, 22201 3791519004, 22202 1033081774, 22203 1277568618, 22204 1815492186, 22205 2118074177, 22206 4126668546, 22207 2211236943, 22208 1748251740, 22209 1369810420, 22210 3521504564, 22211 4193382664, 22212 3799085459, 22213 2883115123, 22214 1647391059, 22215 706024767, 22216 134480908, 22217 2512897874, 22218 1176707941, 22219 2646852446, 22220 806885416, 22221 932615841, 22222 168101135, 22223 798661301, 22224 235341577, 22225 605164086, 22226 461406363, 22227 3756188221, 22228 3454790438, 22229 1311188841, 22230 2142417613, 22231 3933566367, 22232 302582043, 22233 495158174, 22234 1479289972, 22235 874125870, 22236 907746093, 22237 3698224818, 22238 3025820398, 22239 1537253627, 22240 2756858614, 22241 1983593293, 22242 3084310113, 22243 2108928974, 22244 1378429307, 22245 3722699582, 22246 1580150641, 22247 327451799, 22248 2790478837, 22249 3117535592, 22250 0, 22251 3253595436, 22252 1075847264, 22253 3825007647, 22254 2041688520, 22255 3059440621, 22256 3563743934, 22257 2378943302, 22258 1740553945, 22259 1916352843, 22260 2487896798, 22261 2555137236, 22262 2958579944, 22263 2244988746, 22264 3151024235, 22265 3320835882, 22266 1336584933, 22267 3992714006, 22268 2252555205, 22269 2588757463, 22270 1714631509, 22271 293963156, 22272 2319795663, 22273 3925473552, 22274 67240454, 22275 4269768577, 22276 2689618160, 22277 2017213508, 22278 631218106, 22279 1269344483, 22280 2723238387, 22281 1571005438, 22282 2151694528, 22283 93294474, 22284 1066570413, 22285 563977660, 22286 1882732616, 22287 4059428100, 22288 1673313503, 22289 2008463041, 22290 2950355573, 22291 1109467491, 22292 537923632, 22293 3858759450, 22294 4260623118, 22295 3218264685, 22296 2177748300, 22297 403442708, 22298 638784309, 22299 3287084079, 22300 3193921505, 22301 899127202, 22302 2286175436, 22303 773265209, 22304 2479146071, 22305 1437050866, 22306 4236148354, 22307 2050833735, 22308 3362022572, 22309 3126681063, 22310 840505643, 22311 3866325909, 22312 3227541664, 22313 427917720, 22314 2655997905, 22315 2749160575, 22316 1143087718, 22317 1412049534, 22318 999329963, 22319 193497219, 22320 2353415882, 22321 3354324521, 22322 1807268051,
22323 672404540, 22324 2816401017, 22325 3160301282, 22326 369822493, 22327 2916866934, 22328 3688947771, 22329 1681011286, 22330 1949973070, 22331 336202270, 22332 2454276571, 22333 201721354, 22334 1210328172, 22335 3093060836, 22336 2680341085, 22337 3184776046, 22338 1135389935, 22339 3294782118, 22340 965841320, 22341 831886756, 22342 3554993207, 22343 4068047243, 22344 3588745010, 22345 2345191491, 22346 1849112409, 22347 3664604599, 22348 26054028, 22349 2983581028, 22350 2622377682, 22351 1235855840, 22352 3630984372, 22353 2891339514, 22354 4092916743, 22355 3488279077, 22356 3395642799, 22357 4101667470, 22358 1202630377, 22359 268961816, 22360 1874508501, 22361 4034427016, 22362 1243948399, 22363 1546530418, 22364 941366308, 22365 1470539505, 22366 1941222599, 22367 2546386513, 22368 3421038627, 22369 2715671932, 22370 3899946140, 22371 1042226977, 22372 2521517021, 22373 1639824860, 22374 227249030, 22375 260737669, 22376 3765465232, 22377 2084453954, 22378 1907733956, 22379 3429263018, 22380 2420656344, 22381 100860677, 22382 4160157185, 22383 470683154, 22384 3261161891, 22385 1781871967, 22386 2924959737, 22387 1773779408, 22388 394692241, 22389 2579611992, 22390 974986535, 22391 664706745, 22392 3655459128, 22393 3958962195, 22394 731420851, 22395 571543859, 22396 3530123707, 22397 2849626480, 22398 126783113, 22399 865375399, 22400 765172662, 22401 1008606754, 22402 361203602, 22403 3387549984, 22404 2278477385, 22405 2857719295, 22406 1344809080, 22407 2782912378, 22408 59542671, 22409 1503764984, 22410 160008576, 22411 437062935, 22412 1707065306, 22413 3622233649, 22414 2218934982, 22415 3496503480, 22416 2185314755, 22417 697932208, 22418 1512910199, 22419 504303377, 22420 2075177163, 22421 2824099068, 22422 1841019862, 22423 739644986 22424]; 22425var T2 = [ 22426 2781242211, 22427 2230877308, 22428 2582542199, 22429 2381740923, 22430 234877682, 22431 3184946027, 22432 2984144751, 22433 1418839493, 22434 1348481072, 22435 50462977, 22436 2848876391, 22437 2102799147, 22438 434634494, 22439 1656084439, 22440 3863849899, 22441 2599188086, 22442 1167051466, 22443 2636087938, 22444 1082771913, 22445 2281340285, 22446 368048890, 22447 3954334041, 22448 3381544775, 22449 201060592, 22450 3963727277, 22451 1739838676, 22452 4250903202, 22453 3930435503, 22454 3206782108, 22455 4149453988, 22456 2531553906, 22457 1536934080, 22458 3262494647, 22459 484572669, 22460 2923271059, 22461 1783375398, 22462 1517041206, 22463 1098792767, 22464 49674231, 22465 1334037708, 22466 1550332980, 22467 4098991525, 22468 886171109, 22469 150598129, 22470 2481090929, 22471 1940642008, 22472 1398944049, 22473 1059722517, 22474 201851908, 22475 1385547719, 22476 1699095331, 22477 1587397571, 22478 674240536, 22479 2704774806, 22480 252314885, 22481 3039795866, 22482 151914247, 22483 908333586, 22484 2602270848, 22485 1038082786, 22486 651029483, 22487 1766729511, 22488 3447698098, 22489 2682942837, 22490 454166793, 22491 2652734339, 22492 1951935532, 22493 775166490, 22494 758520603, 22495 3000790638, 22496 4004797018, 22497 4217086112, 22498 4137964114, 22499 1299594043, 22500 1639438038, 22501 3464344499, 22502 2068982057, 22503 1054729187, 22504 1901997871, 22505 2534638724, 22506 4121318227, 22507 1757008337, 22508 0, 22509 750906861, 22510 1614815264, 22511 535035132, 22512 3363418545, 22513 3988151131, 22514 3201591914, 22515 1183697867, 22516 3647454910, 22517 1265776953, 22518 3734260298, 22519 3566750796, 22520 3903871064, 22521 1250283471, 22522 1807470800, 22523 717615087, 22524 3847203498, 22525 384695291, 22526 3313910595, 22527 3617213773, 22528 1432761139, 22529 2484176261, 22530 3481945413, 22531 283769337, 22532 100925954, 22533 2180939647, 22534 4037038160, 22535 1148730428, 22536 3123027871, 22537 3813386408, 22538 4087501137, 22539 4267549603, 22540 3229630528, 22541 2315620239, 22542 2906624658, 22543 3156319645, 22544 1215313976,
22545 82966005, 22546 3747855548, 22547 3245848246, 22548 1974459098, 22549 1665278241, 22550 807407632, 22551 451280895, 22552 251524083, 22553 1841287890, 22554 1283575245, 22555 337120268, 22556 891687699, 22557 801369324, 22558 3787349855, 22559 2721421207, 22560 3431482436, 22561 959321879, 22562 1469301956, 22563 4065699751, 22564 2197585534, 22565 1199193405, 22566 2898814052, 22567 3887750493, 22568 724703513, 22569 2514908019, 22570 2696962144, 22571 2551808385, 22572 3516813135, 22573 2141445340, 22574 1715741218, 22575 2119445034, 22576 2872807568, 22577 2198571144, 22578 3398190662, 22579 700968686, 22580 3547052216, 22581 1009259540, 22582 2041044702, 22583 3803995742, 22584 487983883, 22585 1991105499, 22586 1004265696, 22587 1449407026, 22588 1316239930, 22589 504629770, 22590 3683797321, 22591 168560134, 22592 1816667172, 22593 3837287516, 22594 1570751170, 22595 1857934291, 22596 4014189740, 22597 2797888098, 22598 2822345105, 22599 2754712981, 22600 936633572, 22601 2347923833, 22602 852879335, 22603 1133234376, 22604 1500395319, 22605 3084545389, 22606 2348912013, 22607 1689376213, 22608 3533459022, 22609 3762923945, 22610 3034082412, 22611 4205598294, 22612 133428468, 22613 634383082, 22614 2949277029, 22615 2398386810, 22616 3913789102, 22617 403703816, 22618 3580869306, 22619 2297460856, 22620 1867130149, 22621 1918643758, 22622 607656988, 22623 4049053350, 22624 3346248884, 22625 1368901318, 22626 600565992, 22627 2090982877, 22628 2632479860, 22629 557719327,
22630 3717614411, 22631 3697393085, 22632 2249034635, 22633 2232388234, 22634 2430627952, 22635 1115438654, 22636 3295786421, 22637 2865522278, 22638 3633334344, 22639 84280067, 22640 33027830, 22641 303828494, 22642 2747425121, 22643 1600795957, 22644 4188952407, 22645 3496589753, 22646 2434238086, 22647 1486471617, 22648 658119965, 22649 3106381470, 22650 953803233, 22651 334231800, 22652 3005978776, 22653 857870609, 22654 3151128937, 22655 1890179545, 22656 2298973838, 22657 2805175444, 22658 3056442267, 22659 574365214, 22660 2450884487, 22661 550103529, 22662 1233637070, 22663 4289353045, 22664 2018519080, 22665 2057691103, 22666 2399374476, 22667 4166623649, 22668 2148108681, 22669 387583245, 22670 3664101311, 22671 836232934, 22672 3330556482, 22673 3100665960, 22674 3280093505, 22675 2955516313, 22676 2002398509, 22677 287182607, 22678 3413881008, 22679 4238890068, 22680 3597515707, 22681 975967766 22682]; 22683var T3 = [ 22684 1671808611, 22685 2089089148, 22686 2006576759, 22687 2072901243, 22688 4061003762, 22689 1807603307, 22690 1873927791, 22691 3310653893, 22692 810573872, 22693 16974337, 22694 1739181671, 22695 729634347, 22696 4263110654, 22697 3613570519, 22698 2883997099, 22699 1989864566, 22700 3393556426, 22701 2191335298, 22702 3376449993, 22703 2106063485, 22704 4195741690, 22705 1508618841, 22706 1204391495, 22707 4027317232, 22708 2917941677, 22709 3563566036, 22710 2734514082, 22711 2951366063, 22712 2629772188, 22713 2767672228, 22714 1922491506, 22715 3227229120, 22716 3082974647, 22717 4246528509, 22718 2477669779, 22719 644500518, 22720 911895606, 22721 1061256767, 22722 4144166391, 22723 3427763148, 22724 878471220, 22725 2784252325, 22726 3845444069, 22727 4043897329, 22728 1905517169, 22729 3631459288, 22730 827548209, 22731 356461077, 22732 67897348, 22733 3344078279, 22734 593839651, 22735 3277757891, 22736 405286936, 22737 2527147926, 22738 84871685, 22739 2595565466, 22740 118033927, 22741 305538066, 22742 2157648768, 22743 3795705826, 22744 3945188843, 22745 661212711, 22746 2999812018, 22747 1973414517, 22748 152769033, 22749 2208177539, 22750 745822252, 22751 439235610, 22752 455947803, 22753 1857215598, 22754 1525593178, 22755 2700827552, 22756 1391895634, 22757 994932283, 22758 3596728278, 22759 3016654259, 22760 695947817, 22761 3812548067, 22762 795958831, 22763 2224493444, 22764 1408607827, 22765 3513301457, 22766 0, 22767 3979133421, 22768 543178784, 22769 4229948412, 22770 2982705585, 22771 1542305371, 22772 1790891114, 22773 3410398667, 22774 3201918910, 22775 961245753, 22776 1256100938, 22777 1289001036, 22778 1491644504, 22779 3477767631, 22780 3496721360, 22781 4012557807, 22782 2867154858, 22783 4212583931, 22784 1137018435, 22785 1305975373, 22786 861234739, 22787 2241073541, 22788 1171229253, 22789 4178635257, 22790 33948674, 22791 2139225727, 22792 1357946960, 22793 1011120188, 22794 2679776671, 22795 2833468328, 22796 1374921297, 22797 2751356323, 22798 1086357568, 22799 2408187279, 22800 2460827538, 22801 2646352285, 22802 944271416, 22803 4110742005, 22804 3168756668, 22805 3066132406, 22806 3665145818, 22807 560153121, 22808 271589392, 22809 4279952895, 22810 4077846003, 22811 3530407890, 22812 3444343245, 22813 202643468, 22814 322250259, 22815 3962553324, 22816 1608629855, 22817 2543990167, 22818 1154254916, 22819 389623319, 22820 3294073796, 22821 2817676711, 22822 2122513534, 22823 1028094525, 22824 1689045092, 22825 1575467613, 22826 422261273, 22827 1939203699, 22828 1621147744, 22829 2174228865, 22830 1339137615, 22831 3699352540, 22832 577127458, 22833 712922154, 22834 2427141008, 22835 2290289544, 22836 1187679302, 22837 3995715566, 22838 3100863416, 22839 339486740, 22840 3732514782, 22841 1591917662, 22842 186455563, 22843 3681988059, 22844 3762019296, 22845 844522546, 22846 978220090, 22847 169743370, 22848 1239126601, 22849 101321734, 22850 611076132, 22851 1558493276, 22852 3260915650, 22853 3547250131, 22854 2901361580, 22855 1655096418, 22856 2443721105, 22857 2510565781, 22858 3828863972, 22859 2039214713, 22860 3878868455, 22861 3359869896, 22862 928607799, 22863 1840765549, 22864 2374762893, 22865 3580146133, 22866 1322425422, 22867 2850048425, 22868 1823791212, 22869 1459268694, 22870 4094161908, 22871 3928346602, 22872 1706019429, 22873 2056189050, 22874 2934523822, 22875 135794696, 22876 3134549946, 22877 2022240376, 22878 628050469, 22879 779246638, 22880 472135708, 22881 2800834470, 22882 3032970164, 22883 3327236038, 22884 3894660072, 22885 3715932637, 22886 1956440180, 22887 522272287, 22888 1272813131, 22889 3185336765, 22890 2340818315, 22891 2323976074, 22892 1888542832, 22893 1044544574, 22894 3049550261, 22895 1722469478, 22896 1222152264, 22897 50660867, 22898 4127324150, 22899 236067854, 22900 1638122081, 22901 895445557, 22902 1475980887, 22903 3117443513, 22904 2257655686, 22905 3243809217, 22906 489110045, 22907 2662934430, 22908 3778599393, 22909 4162055160, 22910 2561878936, 22911 288563729, 22912 1773916777, 22913 3648039385, 22914 2391345038, 22915 2493985684, 22916 2612407707, 22917 505560094, 22918 2274497927, 22919 3911240169, 22920 3460925390, 22921 1442818645, 22922 678973480, 22923 3749357023, 22924 2358182796, 22925 2717407649, 22926 2306869641, 22927 219617805, 22928 3218761151, 22929 3862026214, 22930 1120306242, 22931 1756942440, 22932 1103331905, 22933 2578459033, 22934 762796589, 22935 252780047, 22936 2966125488, 22937 1425844308, 22938 3151392187, 22939 372911126 22940]; 22941var T4 = [ 22942 1667474886, 22943 2088535288, 22944 2004326894, 22945 2071694838, 22946 4075949567, 22947 1802223062, 22948 1869591006, 22949 3318043793, 22950 808472672, 22951 16843522, 22952 1734846926, 22953 724270422, 22954 4278065639, 22955 3621216949, 22956 2880169549, 22957 1987484396, 22958 3402253711, 22959 2189597983, 22960 3385409673, 22961 2105378810, 22962 4210693615, 22963 1499065266, 22964 1195886990, 22965 4042263547,
22966 2913856577, 22967 3570689971, 22968 2728590687, 22969 2947541573, 22970 2627518243, 22971 2762274643, 22972 1920112356, 22973 3233831835, 22974 3082273397, 22975 4261223649, 22976 2475929149, 22977 640051788, 22978 909531756, 22979 1061110142, 22980 4160160501, 22981 3435941763, 22982 875846760, 22983 2779116625, 22984 3857003729, 22985 4059105529, 22986 1903268834, 22987 3638064043, 22988 825316194, 22989 353713962, 22990 67374088, 22991 3351728789, 22992 589522246, 22993 3284360861, 22994 404236336, 22995 2526454071, 22996 84217610, 22997 2593830191, 22998 117901582, 22999 303183396, 23000 2155911963, 23001 3806477791, 23002 3958056653, 23003 656894286, 23004 2998062463, 23005 1970642922, 23006 151591698, 23007 2206440989, 23008 741110872, 23009 437923380, 23010 454765878, 23011 1852748508, 23012 1515908788, 23013 2694904667, 23014 1381168804, 23015 993742198, 23016 3604373943, 23017 3014905469, 23018 690584402, 23019 3823320797, 23020 791638366, 23021 2223281939, 23022 1398011302, 23023 3520161977, 23024 0, 23025 3991743681, 23026 538992704, 23027 4244381667, 23028 2981218425, 23029 1532751286, 23030 1785380564, 23031 3419096717, 23032 3200178535, 23033 960056178, 23034 1246420628, 23035 1280103576, 23036 1482221744, 23037 3486468741, 23038 3503319995, 23039 4025428677, 23040 2863326543, 23041 4227536621, 23042 1128514950, 23043 1296947098, 23044 859002214, 23045 2240123921, 23046 1162203018, 23047 4193849577, 23048 33687044, 23049 2139062782, 23050 1347481760, 23051 1010582648, 23052 2678045221, 23053 2829640523, 23054 1364325282, 23055 2745433693, 23056 1077985408, 23057 2408548869, 23058 2459086143, 23059 2644360225, 23060 943212656, 23061 4126475505, 23062 3166494563, 23063 3065430391, 23064 3671750063, 23065 555836226, 23066 269496352, 23067 4294908645, 23068 4092792573, 23069 3537006015, 23070 3452783745, 23071 202118168, 23072 320025894, 23073 3974901699, 23074 1600119230, 23075 2543297077, 23076 1145359496, 23077 387397934, 23078 3301201811, 23079 2812801621, 23080 2122220284, 23081 1027426170, 23082 1684319432, 23083 1566435258, 23084 421079858, 23085 1936954854, 23086 1616945344, 23087 2172753945, 23088 1330631070, 23089 3705438115, 23090 572679748, 23091 707427924, 23092 2425400123, 23093 2290647819, 23094 1179044492, 23095 4008585671, 23096 3099120491, 23097 336870440, 23098 3739122087, 23099 1583276732, 23100 185277718, 23101 3688593069, 23102 3772791771, 23103 842159716, 23104 976899700, 23105 168435220, 23106 1229577106, 23107 101059084, 23108 606366792, 23109 1549591736, 23110 3267517855, 23111 3553849021, 23112 2897014595, 23113 1650632388, 23114 2442242105, 23115 2509612081, 23116 3840161747, 23117 2038008818, 23118 3890688725, 23119 3368567691, 23120 926374254, 23121 1835907034, 23122 2374863873, 23123 3587531953, 23124 1313788572, 23125 2846482505, 23126 1819063512, 23127 1448540844, 23128 4109633523, 23129 3941213647, 23130 1701162954, 23131 2054852340, 23132 2930698567, 23133 134748176, 23134 3132806511, 23135 2021165296, 23136 623210314, 23137 774795868, 23138 471606328, 23139 2795958615, 23140 3031746419, 23141 3334885783, 23142 3907527627, 23143 3722280097, 23144 1953799400, 23145 522133822, 23146 1263263126, 23147 3183336545, 23148 2341176845, 23149 2324333839, 23150 1886425312, 23151 1044267644, 23152 3048588401, 23153 1718004428, 23154 1212733584, 23155 50529542, 23156 4143317495, 23157 235803164, 23158 1633788866, 23159 892690282, 23160 1465383342, 23161 3115962473, 23162 2256965911, 23163 3250673817, 23164 488449850, 23165 2661202215, 23166 3789633753, 23167 4177007595, 23168 2560144171, 23169 286339874, 23170 1768537042, 23171 3654906025, 23172 2391705863, 23173 2492770099, 23174 2610673197, 23175 505291324, 23176 2273808917, 23177 3924369609, 23178 3469625735, 23179 1431699370, 23180 673740880, 23181 3755965093, 23182 2358021891, 23183 2711746649, 23184 2307489801, 23185 218961690, 23186 3217021541, 23187 3873845719, 23188 1111672452, 23189 1751693520, 23190 1094828930, 23191 2576986153, 23192 757954394, 23193 252645662, 23194 2964376443, 23195 1414855848, 23196 3149649517, 23197 370555436 23198]; 23199var T5 = [ 23200 1374988112, 23201 2118214995, 23202 437757123, 23203 975658646, 23204 1001089995, 23205 530400753, 23206 2902087851, 23207 1273168787, 23208 540080725, 23209 2910219766, 23210 2295101073, 23211 4110568485, 23212 1340463100, 23213 3307916247, 23214 641025152, 23215 3043140495, 23216 3736164937, 23217 632953703, 23218 1172967064, 23219 1576976609, 23220 3274667266, 23221 2169303058, 23222 2370213795, 23223 1809054150, 23224 59727847, 23225 361929877, 23226 3211623147, 23227 2505202138, 23228 3569255213, 23229 1484005843, 23230 1239443753, 23231 2395588676, 23232 1975683434, 23233 4102977912, 23234 2572697195, 23235 666464733, 23236 3202437046, 23237 4035489047, 23238 3374361702, 23239 2110667444, 23240 1675577880, 23241 3843699074, 23242 2538681184, 23243 1649639237, 23244 2976151520, 23245 3144396420, 23246 4269907996, 23247 4178062228, 23248 1883793496, 23249 2403728665, 23250 2497604743, 23251 1383856311, 23252 2876494627, 23253 1917518562, 23254 3810496343, 23255 1716890410, 23256 3001755655, 23257 800440835, 23258 2261089178, 23259 3543599269, 23260 807962610, 23261 599762354, 23262 33778362, 23263 3977675356, 23264 2328828971, 23265 2809771154, 23266 4077384432, 23267 1315562145, 23268 1708848333, 23269 101039829, 23270 3509871135, 23271 3299278474, 23272 875451293, 23273 2733856160, 23274 92987698, 23275 2767645557, 23276 193195065, 23277 1080094634, 23278 1584504582, 23279 3178106961, 23280 1042385657, 23281 2531067453, 23282 3711829422, 23283 1306967366, 23284 2438237621, 23285 1908694277, 23286 67556463, 23287 1615861247, 23288 429456164, 23289 3602770327, 23290 2302690252, 23291 1742315127, 23292 2968011453, 23293 126454664, 23294 3877198648, 23295 2043211483, 23296 2709260871, 23297 2084704233, 23298 4169408201, 23299 0, 23300 159417987, 23301 841739592, 23302 504459436, 23303 1817866830, 23304 4245618683, 23305 260388950, 23306 1034867998, 23307 908933415, 23308 168810852, 23309 1750902305, 23310 2606453969, 23311 607530554, 23312 202008497, 23313 2472011535, 23314 3035535058, 23315 463180190, 23316 2160117071, 23317 1641816226, 23318 1517767529, 23319 470948374, 23320 3801332234, 23321 3231722213, 23322 1008918595, 23323 303765277, 23324 235474187, 23325 4069246893, 23326 766945465, 23327 337553864, 23328 1475418501, 23329 2943682380, 23330 4003061179, 23331 2743034109, 23332 4144047775, 23333 1551037884, 23334 1147550661, 23335 1543208500, 23336 2336434550, 23337 3408119516, 23338 3069049960, 23339 3102011747, 23340 3610369226, 23341 1113818384, 23342 328671808, 23343 2227573024, 23344 2236228733, 23345 3535486456, 23346 2935566865, 23347 3341394285,
23348 496906059, 23349 3702665459, 23350 226906860, 23351 2009195472, 23352 733156972, 23353 2842737049, 23354 294930682, 23355 1206477858, 23356 2835123396, 23357 2700099354, 23358 1451044056, 23359 573804783, 23360 2269728455, 23361 3644379585, 23362 2362090238, 23363 2564033334, 23364 2801107407, 23365 2776292904, 23366 3669462566, 23367 1068351396, 23368 742039012, 23369 1350078989, 23370 1784663195, 23371 1417561698, 23372 4136440770, 23373 2430122216, 23374 775550814, 23375 2193862645, 23376 2673705150, 23377 1775276924, 23378 1876241833, 23379 3475313331, 23380 3366754619, 23381 270040487, 23382 3902563182, 23383 3678124923, 23384 3441850377, 23385 1851332852, 23386 3969562369, 23387 2203032232, 23388 3868552805, 23389 2868897406, 23390 566021896, 23391 4011190502, 23392 3135740889, 23393 1248802510, 23394 3936291284, 23395 699432150, 23396 832877231, 23397 708780849, 23398 3332740144, 23399 899835584, 23400 1951317047, 23401 4236429990, 23402 3767586992, 23403 866637845, 23404 4043610186, 23405 1106041591, 23406 2144161806, 23407 395441711, 23408 1984812685, 23409 1139781709, 23410 3433712980, 23411 3835036895, 23412 2664543715, 23413 1282050075, 23414 3240894392, 23415 1181045119, 23416 2640243204, 23417 25965917, 23418 4203181171, 23419 4211818798, 23420 3009879386, 23421 2463879762, 23422 3910161971, 23423 1842759443, 23424 2597806476, 23425 933301370, 23426 1509430414, 23427 3943906441, 23428 3467192302, 23429 3076639029, 23430 3776767469, 23431 2051518780, 23432 2631065433, 23433 1441952575, 23434 404016761, 23435 1942435775, 23436 1408749034, 23437 1610459739, 23438 3745345300, 23439 2017778566, 23440 3400528769, 23441 3110650942, 23442 941896748, 23443 3265478751, 23444 371049330, 23445 3168937228, 23446 675039627, 23447 4279080257, 23448 967311729, 23449 135050206, 23450 3635733660, 23451 1683407248, 23452 2076935265, 23453 3576870512, 23454 1215061108, 23455 3501741890 23456]; 23457var T6 = [ 23458 1347548327, 23459 1400783205, 23460 3273267108, 23461 2520393566, 23462 3409685355, 23463 4045380933, 23464 2880240216, 23465 2471224067, 23466 1428173050, 23467 4138563181, 23468 2441661558, 23469 636813900, 23470 4233094615, 23471 3620022987, 23472 2149987652, 23473 2411029155, 23474 1239331162, 23475 1730525723, 23476 2554718734, 23477 3781033664, 23478 46346101, 23479 310463728, 23480 2743944855, 23481 3328955385, 23482 3875770207, 23483 2501218972, 23484 3955191162, 23485 3667219033, 23486 768917123, 23487 3545789473, 23488 692707433, 23489 1150208456, 23490 1786102409, 23491 2029293177, 23492 1805211710, 23493 3710368113, 23494 3065962831, 23495 401639597, 23496 1724457132, 23497 3028143674, 23498 409198410, 23499 2196052529, 23500 1620529459, 23501 1164071807, 23502 3769721975, 23503 2226875310, 23504 486441376, 23505 2499348523, 23506 1483753576, 23507 428819965, 23508 2274680428, 23509 3075636216, 23510 598438867, 23511 3799141122, 23512 1474502543, 23513 711349675, 23514 129166120, 23515 53458370, 23516 2592523643, 23517 2782082824, 23518 4063242375, 23519 2988687269, 23520 3120694122, 23521 1559041666, 23522 730517276, 23523 2460449204, 23524 4042459122, 23525 2706270690, 23526 3446004468, 23527 3573941694, 23528 533804130, 23529 2328143614, 23530 2637442643, 23531 2695033685, 23532 839224033, 23533 1973745387, 23534 957055980, 23535 2856345839, 23536 106852767, 23537 1371368976, 23538 4181598602, 23539 1033297158, 23540 2933734917, 23541 1179510461, 23542 3046200461, 23543 91341917, 23544 1862534868, 23545 4284502037, 23546 605657339, 23547 2547432937, 23548 3431546947, 23549 2003294622, 23550 3182487618, 23551 2282195339, 23552 954669403, 23553 3682191598, 23554 1201765386, 23555 3917234703, 23556 3388507166, 23557 0, 23558 2198438022, 23559 1211247597, 23560 2887651696, 23561 1315723890, 23562 4227665663, 23563 1443857720, 23564 507358933, 23565 657861945, 23566 1678381017, 23567 560487590, 23568 3516619604, 23569 975451694, 23570 2970356327, 23571 261314535, 23572 3535072918, 23573 2652609425, 23574 1333838021, 23575 2724322336, 23576 1767536459, 23577 370938394, 23578 182621114, 23579 3854606378, 23580 1128014560, 23581 487725847, 23582 185469197, 23583 2918353863, 23584 3106780840, 23585 3356761769, 23586 2237133081, 23587 1286567175, 23588 3152976349, 23589 4255350624, 23590 2683765030, 23591 3160175349, 23592 3309594171, 23593 878443390, 23594 1988838185, 23595 3704300486, 23596 1756818940, 23597 1673061617, 23598 3403100636, 23599 272786309, 23600 1075025698, 23601 545572369, 23602 2105887268, 23603 4174560061, 23604 296679730, 23605 1841768865, 23606 1260232239, 23607 4091327024, 23608 3960309330, 23609 3497509347, 23610 1814803222, 23611 2578018489, 23612 4195456072, 23613 575138148, 23614 3299409036, 23615 446754879, 23616 3629546796, 23617 4011996048, 23618 3347532110, 23619 3252238545, 23620 4270639778, 23621 915985419, 23622 3483825537, 23623 681933534, 23624 651868046, 23625 2755636671, 23626 3828103837, 23627 223377554, 23628 2607439820, 23629 1649704518, 23630 3270937875, 23631 3901806776, 23632 1580087799, 23633 4118987695, 23634 3198115200, 23635 2087309459, 23636 2842678573, 23637 3016697106, 23638 1003007129, 23639 2802849917, 23640 1860738147, 23641 2077965243, 23642 164439672, 23643 4100872472, 23644 32283319, 23645 2827177882, 23646 1709610350, 23647 2125135846, 23648 136428751, 23649 3874428392, 23650 3652904859, 23651 3460984630, 23652 3572145929, 23653 3593056380, 23654 2939266226, 23655 824852259, 23656 818324884, 23657 3224740454, 23658 930369212,
23659 2801566410, 23660 2967507152, 23661 355706840, 23662 1257309336, 23663 4148292826, 23664 243256656, 23665 790073846, 23666 2373340630, 23667 1296297904, 23668 1422699085, 23669 3756299780, 23670 3818836405, 23671 457992840, 23672 3099667487, 23673 2135319889, 23674 77422314, 23675 1560382517, 23676 1945798516, 23677 788204353, 23678 1521706781, 23679 1385356242, 23680 870912086, 23681 325965383, 23682 2358957921, 23683 2050466060, 23684 2388260884, 23685 2313884476, 23686 4006521127, 23687 901210569, 23688 3990953189, 23689 1014646705, 23690 1503449823, 23691 1062597235, 23692 2031621326, 23693 3212035895, 23694 3931371469, 23695 1533017514, 23696 350174575, 23697 2256028891, 23698 2177544179, 23699 1052338372, 23700 741876788, 23701 1606591296, 23702 1914052035, 23703 213705253, 23704 2334669897, 23705 1107234197, 23706 1899603969, 23707 3725069491, 23708 2631447780, 23709 2422494913, 23710 1635502980, 23711 1893020342, 23712 1950903388, 23713 1120974935 23714]; 23715var T7 = [ 23716 2807058932, 23717 1699970625, 23718 2764249623, 23719 1586903591, 23720 1808481195, 23721 1173430173, 23722 1487645946, 23723 59984867, 23724 4199882800, 23725 1844882806, 23726 1989249228, 23727 1277555970, 23728 3623636965, 23729 3419915562, 23730 1149249077, 23731 2744104290, 23732 1514790577, 23733 459744698, 23734 244860394, 23735 3235995134, 23736 1963115311, 23737 4027744588, 23738 2544078150, 23739 4190530515, 23740 1608975247, 23741 2627016082, 23742 2062270317, 23743 1507497298, 23744 2200818878, 23745 567498868, 23746 1764313568, 23747 3359936201, 23748 2305455554, 23749 2037970062, 23750 1047239e3, 23751 1910319033, 23752 1337376481, 23753 2904027272, 23754 2892417312, 23755 984907214, 23756 1243112415, 23757 830661914, 23758 861968209, 23759 2135253587, 23760 2011214180, 23761 2927934315, 23762 2686254721, 23763 731183368, 23764 1750626376, 23765 4246310725, 23766 1820824798, 23767 4172763771, 23768 3542330227, 23769 48394827, 23770 2404901663, 23771 2871682645, 23772 671593195, 23773 3254988725, 23774 2073724613, 23775 145085239, 23776 2280796200, 23777 2779915199, 23778 1790575107, 23779 2187128086, 23780 472615631, 23781 3029510009, 23782 4075877127, 23783 3802222185, 23784 4107101658, 23785 3201631749, 23786 1646252340, 23787 4270507174, 23788 1402811438, 23789 1436590835, 23790 3778151818, 23791 3950355702, 23792 3963161475, 23793 4020912224, 23794 2667994737, 23795 273792366, 23796 2331590177, 23797 104699613, 23798 95345982, 23799 3175501286, 23800 2377486676, 23801 1560637892, 23802 3564045318, 23803 369057872, 23804 4213447064, 23805 3919042237, 23806 1137477952, 23807 2658625497, 23808 1119727848, 23809 2340947849, 23810 1530455833, 23811 4007360968, 23812 172466556, 23813 266959938, 23814 516552836, 23815 0, 23816 2256734592, 23817 3980931627, 23818 1890328081, 23819 1917742170, 23820 4294704398, 23821 945164165, 23822 3575528878, 23823 958871085, 23824 3647212047, 23825 2787207260, 23826 1423022939, 23827 775562294, 23828 1739656202, 23829 3876557655, 23830 2530391278, 23831 2443058075, 23832 3310321856, 23833 547512796, 23834 1265195639, 23835 437656594, 23836 3121275539, 23837 719700128, 23838 3762502690, 23839 387781147, 23840 218828297, 23841 3350065803, 23842 2830708150, 23843 2848461854, 23844 428169201, 23845 122466165, 23846 3720081049, 23847 1627235199, 23848 648017665, 23849 4122762354, 23850 1002783846, 23851 2117360635, 23852 695634755, 23853 3336358691, 23854 4234721005, 23855 4049844452, 23856 3704280881, 23857 2232435299, 23858 574624663, 23859 287343814, 23860 612205898, 23861 1039717051, 23862 840019705, 23863 2708326185, 23864 793451934, 23865 821288114, 23866 1391201670, 23867 3822090177, 23868 376187827, 23869 3113855344, 23870 1224348052, 23871 1679968233, 23872 2361698556, 23873 1058709744, 23874 752375421, 23875 2431590963, 23876 1321699145, 23877 3519142200, 23878 2734591178, 23879 188127444, 23880 2177869557, 23881 3727205754, 23882 2384911031, 23883 3215212461, 23884 2648976442, 23885 2450346104, 23886 3432737375, 23887 1180849278, 23888 331544205, 23889 3102249176, 23890 4150144569, 23891 2952102595, 23892 2159976285, 23893 2474404304, 23894 766078933, 23895 313773861, 23896 2570832044, 23897 2108100632, 23898 1668212892, 23899 3145456443, 23900 2013908262, 23901 418672217, 23902 3070356634, 23903 2594734927, 23904 1852171925, 23905 3867060991, 23906 3473416636, 23907 3907448597, 23908 2614737639, 23909 919489135, 23910 164948639, 23911 2094410160, 23912 2997825956, 23913 590424639, 23914 2486224549, 23915 1723872674, 23916 3157750862, 23917 3399941250, 23918 3501252752, 23919 3625268135, 23920 2555048196, 23921 3673637356,
23922 1343127501, 23923 4130281361, 23924 3599595085, 23925 2957853679, 23926 1297403050, 23927 81781910, 23928 3051593425, 23929 2283490410, 23930 532201772, 23931 1367295589, 23932 3926170974, 23933 895287692, 23934 1953757831, 23935 1093597963, 23936 492483431, 23937 3528626907, 23938 1446242576, 23939 1192455638, 23940 1636604631, 23941 209336225, 23942 344873464, 23943 1015671571, 23944 669961897, 23945 3375740769, 23946 3857572124, 23947 2973530695, 23948 3747192018, 23949 1933530610, 23950 3464042516, 23951 935293895, 23952 3454686199, 23953 2858115069, 23954 1863638845, 23955 3683022916, 23956 4085369519, 23957 3292445032, 23958 875313188, 23959 1080017571, 23960 3279033885, 23961 621591778, 23962 1233856572, 23963 2504130317, 23964 24197544, 23965 3017672716, 23966 3835484340, 23967 3247465558, 23968 2220981195, 23969 3060847922, 23970 1551124588, 23971 1463996600 23972]; 23973var T8 = [ 23974 4104605777, 23975 1097159550, 23976 396673818, 23977 660510266, 23978 2875968315, 23979 2638606623, 23980 4200115116, 23981 3808662347, 23982 821712160, 23983 1986918061, 23984 3430322568, 23985 38544885, 23986 3856137295, 23987 718002117, 23988 893681702, 23989 1654886325, 23990 2975484382, 23991 3122358053, 23992 3926825029, 23993 4274053469, 23994 796197571, 23995 1290801793, 23996 1184342925, 23997 3556361835, 23998 2405426947, 23999 2459735317, 24000 1836772287, 24001 1381620373, 24002 3196267988, 24003 1948373848, 24004 3764988233, 24005 3385345166, 24006 3263785589, 24007 2390325492, 24008 1480485785, 24009 3111247143, 24010 3780097726, 24011 2293045232, 24012 548169417, 24013 3459953789, 24014 3746175075, 24015 439452389, 24016 1362321559, 24017 1400849762, 24018 1685577905, 24019 1806599355, 24020 2174754046, 24021 137073913, 24022 1214797936, 24023 1174215055, 24024 3731654548, 24025 2079897426, 24026 1943217067, 24027 1258480242, 24028 529487843, 24029 1437280870, 24030 3945269170, 24031 3049390895, 24032 3313212038, 24033 923313619, 24034 679998e3, 24035 3215307299, 24036 57326082, 24037 377642221, 24038 3474729866, 24039 2041877159, 24040 133361907, 24041 1776460110, 24042 3673476453, 24043 96392454, 24044 878845905, 24045 2801699524, 24046 777231668, 24047 4082475170, 24048 2330014213, 24049 4142626212, 24050 2213296395, 24051 1626319424, 24052 1906247262, 24053 1846563261, 24054 562755902, 24055 3708173718, 24056 1040559837, 24057 3871163981, 24058 1418573201, 24059 3294430577, 24060 114585348, 24061 1343618912, 24062 2566595609, 24063 3186202582, 24064 1078185097, 24065 3651041127, 24066 3896688048, 24067 2307622919, 24068 425408743, 24069 3371096953, 24070 2081048481, 24071 1108339068, 24072 2216610296, 24073 0, 24074 2156299017, 24075 736970802, 24076 292596766, 24077 1517440620, 24078 251657213, 24079 2235061775, 24080 2933202493, 24081 758720310, 24082 265905162, 24083 1554391400, 24084 1532285339, 24085 908999204, 24086 174567692, 24087 1474760595, 24088 4002861748, 24089 2610011675, 24090 3234156416, 24091 3693126241, 24092 2001430874, 24093 303699484, 24094 2478443234, 24095 2687165888, 24096 585122620, 24097 454499602, 24098 151849742, 24099 2345119218, 24100 3064510765, 24101 514443284, 24102 4044981591, 24103 1963412655, 24104 2581445614, 24105 2137062819, 24106 19308535, 24107 1928707164, 24108 1715193156, 24109 4219352155, 24110 1126790795, 24111 600235211, 24112 3992742070, 24113 3841024952, 24114 836553431, 24115 1669664834, 24116 2535604243, 24117 3323011204, 24118 1243905413, 24119 3141400786, 24120 4180808110, 24121 698445255, 24122 2653899549, 24123 2989552604, 24124 2253581325, 24125 3252932727, 24126 3004591147, 24127 1891211689, 24128 2487810577, 24129 3915653703, 24130 4237083816, 24131 4030667424, 24132 2100090966, 24133 865136418, 24134 1229899655, 24135 953270745, 24136 3399679628, 24137 3557504664, 24138 4118925222, 24139 2061379749, 24140 3079546586, 24141 2915017791, 24142 983426092, 24143 2022837584, 24144 1607244650, 24145 2118541908, 24146 2366882550, 24147 3635996816, 24148 972512814, 24149 3283088770, 24150 1568718495, 24151 3499326569, 24152 3576539503, 24153 621982671, 24154 2895723464, 24155 410887952, 24156 2623762152, 24157 1002142683, 24158 645401037, 24159 1494807662, 24160 2595684844, 24161 1335535747, 24162 2507040230, 24163 4293295786, 24164 3167684641, 24165 367585007, 24166 3885750714, 24167 1865862730, 24168 2668221674, 24169 2960971305, 24170 2763173681, 24171 1059270954, 24172 2777952454, 24173 2724642869, 24174 1320957812, 24175 2194319100, 24176 2429595872, 24177 2815956275, 24178 77089521, 24179 3973773121, 24180 3444575871, 24181 2448830231, 24182 1305906550, 24183 4021308739, 24184 2857194700, 24185 2516901860, 24186 3518358430, 24187 1787304780, 24188 740276417, 24189 1699839814, 24190 1592394909, 24191 2352307457, 24192 2272556026, 24193 188821243, 24194 1729977011, 24195 3687994002, 24196 274084841, 24197 3594982253, 24198 3613494426, 24199 2701949495, 24200 4162096729, 24201 322734571, 24202 2837966542, 24203 1640576439, 24204 484830689, 24205 1202797690, 24206 3537852828, 24207 4067639125, 24208 349075736, 24209 3342319475, 24210 4157467219, 24211 4255800159, 24212 1030690015, 24213 1155237496, 24214 2951971274, 24215 1757691577, 24216 607398968, 24217 2738905026, 24218 499347990, 24219 3794078908, 24220 1011452712, 24221 227885567, 24222 2818666809, 24223 213114376, 24224 3034881240, 24225 1455525988, 24226 3414450555, 24227 850817237, 24228 1817998408, 24229 3092726480 24230]; 24231var U1 = [ 24232 0, 24233 235474187, 24234 470948374, 24235 303765277, 24236 941896748, 24237 908933415, 24238 607530554, 24239 708780849, 24240 1883793496, 24241 2118214995, 24242 1817866830, 24243 1649639237, 24244 1215061108, 24245 1181045119, 24246 1417561698, 24247 1517767529, 24248 3767586992, 24249 4003061179, 24250 4236429990, 24251 4069246893, 24252 3635733660, 24253 3602770327, 24254 3299278474, 24255 3400528769, 24256 2430122216, 24257 2664543715, 24258 2362090238, 24259 2193862645, 24260 2835123396, 24261 2801107407, 24262 3035535058, 24263 3135740889, 24264 3678124923, 24265 3576870512, 24266 3341394285, 24267 3374361702, 24268 3810496343, 24269 3977675356, 24270 4279080257, 24271 4043610186, 24272 2876494627, 24273 2776292904, 24274 3076639029, 24275 3110650942, 24276 2472011535, 24277 2640243204, 24278 2403728665, 24279 2169303058, 24280 1001089995, 24281 899835584, 24282 666464733, 24283 699432150, 24284 59727847, 24285 226906860, 24286 530400753, 24287 294930682, 24288 1273168787, 24289 1172967064, 24290 1475418501, 24291 1509430414, 24292 1942435775, 24293 2110667444, 24294 1876241833, 24295 1641816226, 24296 2910219766, 24297 2743034109, 24298 2976151520, 24299 3211623147, 24300 2505202138, 24301 2606453969, 24302 2302690252, 24303 2269728455, 24304 3711829422, 24305 3543599269, 24306 3240894392, 24307 3475313331, 24308 3843699074, 24309 3943906441, 24310 4178062228, 24311 4144047775, 24312 1306967366, 24313 1139781709, 24314 1374988112, 24315 1610459739, 24316 1975683434, 24317 2076935265, 24318 1775276924, 24319 1742315127, 24320 1034867998, 24321 866637845, 24322 566021896, 24323 800440835, 24324 92987698, 24325 193195065, 24326 429456164, 24327 395441711, 24328 1984812685, 24329 2017778566, 24330 1784663195, 24331 1683407248, 24332 1315562145, 24333 1080094634, 24334 1383856311, 24335 1551037884, 24336 101039829, 24337 135050206, 24338 437757123, 24339 337553864, 24340 1042385657, 24341 807962610, 24342 573804783, 24343 742039012, 24344 2531067453, 24345 2564033334, 24346 2328828971, 24347 2227573024, 24348 2935566865, 24349 2700099354, 24350 3001755655, 24351 3168937228, 24352 3868552805, 24353 3902563182, 24354 4203181171, 24355 4102977912, 24356 3736164937, 24357 3501741890, 24358 3265478751, 24359 3433712980, 24360 1106041591, 24361 1340463100, 24362 1576976609, 24363 1408749034, 24364 2043211483, 24365 2009195472, 24366 1708848333, 24367 1809054150, 24368 832877231, 24369 1068351396, 24370 766945465, 24371 599762354, 24372 159417987, 24373 126454664, 24374 361929877, 24375 463180190, 24376 2709260871, 24377 2943682380, 24378 3178106961, 24379 3009879386, 24380 2572697195, 24381 2538681184, 24382 2236228733, 24383 2336434550, 24384 3509871135, 24385 3745345300, 24386 3441850377, 24387 3274667266, 24388 3910161971, 24389 3877198648,
24390 4110568485, 24391 4211818798, 24392 2597806476, 24393 2497604743, 24394 2261089178, 24395 2295101073, 24396 2733856160, 24397 2902087851, 24398 3202437046, 24399 2968011453, 24400 3936291284, 24401 3835036895, 24402 4136440770, 24403 4169408201, 24404 3535486456, 24405 3702665459, 24406 3467192302, 24407 3231722213, 24408 2051518780, 24409 1951317047, 24410 1716890410, 24411 1750902305, 24412 1113818384, 24413 1282050075, 24414 1584504582, 24415 1350078989, 24416 168810852, 24417 67556463, 24418 371049330, 24419 404016761, 24420 841739592, 24421 1008918595, 24422 775550814, 24423 540080725, 24424 3969562369, 24425 3801332234, 24426 4035489047, 24427 4269907996, 24428 3569255213, 24429 3669462566, 24430 3366754619, 24431 3332740144, 24432 2631065433, 24433 2463879762, 24434 2160117071, 24435 2395588676, 24436 2767645557, 24437 2868897406, 24438 3102011747, 24439 3069049960, 24440 202008497, 24441 33778362, 24442 270040487, 24443 504459436, 24444 875451293, 24445 975658646, 24446 675039627, 24447 641025152, 24448 2084704233, 24449 1917518562, 24450 1615861247, 24451 1851332852, 24452 1147550661, 24453 1248802510, 24454 1484005843, 24455 1451044056, 24456 933301370, 24457 967311729, 24458 733156972, 24459 632953703, 24460 260388950, 24461 25965917, 24462 328671808, 24463 496906059, 24464 1206477858, 24465 1239443753, 24466 1543208500, 24467 1441952575, 24468 2144161806, 24469 1908694277, 24470 1675577880, 24471 1842759443, 24472 3610369226, 24473 3644379585, 24474 3408119516, 24475 3307916247, 24476 4011190502, 24477 3776767469, 24478 4077384432, 24479 4245618683, 24480 2809771154, 24481 2842737049, 24482 3144396420, 24483 3043140495, 24484 2673705150, 24485 2438237621, 24486 2203032232, 24487 2370213795 24488]; 24489var U2 = [ 24490 0, 24491 185469197, 24492 370938394, 24493 487725847, 24494 741876788, 24495 657861945, 24496 975451694, 24497 824852259, 24498 1483753576, 24499 1400783205, 24500 1315723890, 24501 1164071807, 24502 1950903388, 24503 2135319889, 24504 1649704518, 24505 1767536459, 24506 2967507152, 24507 3152976349, 24508 2801566410, 24509 2918353863, 24510 2631447780, 24511 2547432937, 24512 2328143614, 24513 2177544179, 24514 3901806776, 24515 3818836405, 24516 4270639778, 24517 4118987695, 24518 3299409036, 24519 3483825537, 24520 3535072918, 24521 3652904859, 24522 2077965243, 24523 1893020342, 24524 1841768865, 24525 1724457132, 24526 1474502543, 24527 1559041666, 24528 1107234197, 24529 1257309336, 24530 598438867, 24531 681933534, 24532 901210569, 24533 1052338372, 24534 261314535, 24535 77422314, 24536 428819965, 24537 310463728, 24538 3409685355, 24539 3224740454, 24540 3710368113, 24541 3593056380, 24542 3875770207, 24543 3960309330, 24544 4045380933, 24545 4195456072, 24546 2471224067, 24547 2554718734, 24548 2237133081, 24549 2388260884, 24550 3212035895, 24551 3028143674, 24552 2842678573, 24553 2724322336, 24554 4138563181, 24555 4255350624, 24556 3769721975, 24557 3955191162, 24558 3667219033, 24559 3516619604, 24560 3431546947, 24561 3347532110, 24562 2933734917, 24563 2782082824, 24564 3099667487, 24565 3016697106, 24566 2196052529, 24567 2313884476, 24568 2499348523, 24569 2683765030, 24570 1179510461, 24571 1296297904, 24572 1347548327, 24573 1533017514, 24574 1786102409, 24575 1635502980, 24576 2087309459, 24577 2003294622, 24578 507358933, 24579 355706840, 24580 136428751, 24581 53458370, 24582 839224033, 24583 957055980, 24584 605657339, 24585 790073846, 24586 2373340630, 24587 2256028891, 24588 2607439820, 24589 2422494913, 24590 2706270690, 24591 2856345839, 24592 3075636216, 24593 3160175349, 24594 3573941694, 24595 3725069491, 24596 3273267108, 24597 3356761769, 24598 4181598602, 24599 4063242375, 24600 4011996048, 24601 3828103837, 24602 1033297158, 24603 915985419, 24604 730517276, 24605 545572369, 24606 296679730, 24607 446754879, 24608 129166120, 24609 213705253, 24610 1709610350, 24611 1860738147, 24612 1945798516, 24613 2029293177, 24614 1239331162, 24615 1120974935, 24616 1606591296, 24617 1422699085, 24618 4148292826, 24619 4233094615, 24620 3781033664, 24621 3931371469, 24622 3682191598, 24623 3497509347, 24624 3446004468, 24625 3328955385, 24626 2939266226, 24627 2755636671, 24628 3106780840, 24629 2988687269, 24630 2198438022, 24631 2282195339, 24632 2501218972, 24633 2652609425, 24634 1201765386, 24635 1286567175, 24636 1371368976, 24637 1521706781, 24638 1805211710, 24639 1620529459, 24640 2105887268, 24641 1988838185, 24642 533804130, 24643 350174575, 24644 164439672, 24645 46346101, 24646 870912086, 24647 954669403, 24648 636813900, 24649 788204353, 24650 2358957921, 24651 2274680428, 24652 2592523643, 24653 2441661558, 24654 2695033685, 24655 2880240216, 24656 3065962831, 24657 3182487618, 24658 3572145929, 24659 3756299780, 24660 3270937875, 24661 3388507166, 24662 4174560061, 24663 4091327024, 24664 4006521127, 24665 3854606378, 24666 1014646705, 24667 930369212, 24668 711349675, 24669 560487590, 24670 272786309, 24671 457992840, 24672 106852767, 24673 223377554, 24674 1678381017, 24675 1862534868, 24676 1914052035, 24677 2031621326, 24678 1211247597, 24679 1128014560, 24680 1580087799, 24681 1428173050, 24682 32283319, 24683 182621114, 24684 401639597, 24685 486441376, 24686 768917123, 24687 651868046, 24688 1003007129, 24689 818324884, 24690 1503449823, 24691 1385356242, 24692 1333838021, 24693 1150208456, 24694 1973745387, 24695 2125135846, 24696 1673061617, 24697 1756818940, 24698 2970356327, 24699 3120694122, 24700 2802849917, 24701 2887651696, 24702 2637442643, 24703 2520393566, 24704 2334669897, 24705 2149987652, 24706 3917234703, 24707 3799141122, 24708 4284502037, 24709 4100872472, 24710 3309594171, 24711 3460984630, 24712 3545789473, 24713 3629546796, 24714 2050466060, 24715 1899603969, 24716 1814803222, 24717 1730525723, 24718 1443857720, 24719 1560382517, 24720 1075025698, 24721 1260232239, 24722 575138148, 24723 692707433, 24724 878443390, 24725 1062597235, 24726 243256656, 24727 91341917, 24728 409198410, 24729 325965383, 24730 3403100636, 24731 3252238545, 24732 3704300486, 24733 3620022987, 24734 3874428392, 24735 3990953189, 24736 4042459122, 24737 4227665663, 24738 2460449204, 24739 2578018489, 24740 2226875310, 24741 2411029155,
24742 3198115200, 24743 3046200461, 24744 2827177882, 24745 2743944855 24746]; 24747var U3 = [ 24748 0, 24749 218828297, 24750 437656594, 24751 387781147, 24752 875313188, 24753 958871085, 24754 775562294, 24755 590424639, 24756 1750626376, 24757 1699970625, 24758 1917742170, 24759 2135253587, 24760 1551124588, 24761 1367295589, 24762 1180849278, 24763 1265195639, 24764 3501252752, 24765 3720081049, 24766 3399941250, 24767 3350065803, 24768 3835484340, 24769 3919042237, 24770 4270507174, 24771 4085369519, 24772 3102249176, 24773 3051593425, 24774 2734591178, 24775 2952102595, 24776 2361698556, 24777 2177869557, 24778 2530391278, 24779 2614737639, 24780 3145456443, 24781 3060847922, 24782 2708326185, 24783 2892417312, 24784 2404901663, 24785 2187128086, 24786 2504130317, 24787 2555048196, 24788 3542330227, 24789 3727205754, 24790 3375740769, 24791 3292445032, 24792 3876557655, 24793 3926170974, 24794 4246310725, 24795 4027744588, 24796 1808481195, 24797 1723872674, 24798 1910319033, 24799 2094410160, 24800 1608975247, 24801 1391201670, 24802 1173430173, 24803 1224348052, 24804 59984867, 24805 244860394, 24806 428169201, 24807 344873464, 24808 935293895, 24809 984907214, 24810 766078933, 24811 547512796, 24812 1844882806, 24813 1627235199, 24814 2011214180, 24815 2062270317, 24816 1507497298, 24817 1423022939, 24818 1137477952, 24819 1321699145, 24820 95345982, 24821 145085239, 24822 532201772, 24823 313773861, 24824 830661914, 24825 1015671571, 24826 731183368, 24827 648017665, 24828 3175501286, 24829 2957853679, 24830 2807058932, 24831 2858115069, 24832 2305455554, 24833 2220981195, 24834 2474404304, 24835 2658625497, 24836 3575528878, 24837 3625268135, 24838 3473416636, 24839 3254988725, 24840 3778151818, 24841 3963161475, 24842 4213447064, 24843 4130281361, 24844 3599595085, 24845 3683022916, 24846 3432737375, 24847 3247465558, 24848 3802222185, 24849 4020912224, 24850 4172763771, 24851 4122762354, 24852 3201631749, 24853 3017672716, 24854 2764249623, 24855 2848461854, 24856 2331590177, 24857 2280796200, 24858 2431590963, 24859 2648976442, 24860 104699613, 24861 188127444, 24862 472615631, 24863 287343814, 24864 840019705, 24865 1058709744, 24866 671593195, 24867 621591778, 24868 1852171925, 24869 1668212892, 24870 1953757831, 24871 2037970062, 24872 1514790577, 24873 1463996600, 24874 1080017571, 24875 1297403050, 24876 3673637356, 24877 3623636965, 24878 3235995134, 24879 3454686199, 24880 4007360968, 24881 3822090177, 24882 4107101658, 24883 4190530515, 24884 2997825956, 24885 3215212461, 24886 2830708150, 24887 2779915199, 24888 2256734592, 24889 2340947849, 24890 2627016082, 24891 2443058075, 24892 172466556, 24893 122466165, 24894 273792366, 24895 492483431, 24896 1047239e3, 24897 861968209, 24898 612205898, 24899 695634755, 24900 1646252340, 24901 1863638845, 24902 2013908262, 24903 1963115311, 24904 1446242576, 24905 1530455833, 24906 1277555970, 24907 1093597963, 24908 1636604631, 24909 1820824798, 24910 2073724613, 24911 1989249228, 24912 1436590835, 24913 1487645946, 24914 1337376481, 24915 1119727848, 24916 164948639, 24917 81781910, 24918 331544205, 24919 516552836, 24920 1039717051, 24921 821288114, 24922 669961897, 24923 719700128, 24924 2973530695, 24925 3157750862, 24926 2871682645, 24927 2787207260, 24928 2232435299, 24929 2283490410, 24930 2667994737, 24931 2450346104, 24932 3647212047, 24933 3564045318, 24934 3279033885, 24935 3464042516, 24936 3980931627, 24937 3762502690, 24938 4150144569, 24939 4199882800, 24940 3070356634, 24941 3121275539, 24942 2904027272, 24943 2686254721, 24944 2200818878, 24945 2384911031, 24946 2570832044, 24947 2486224549, 24948 3747192018, 24949 3528626907, 24950 3310321856, 24951 3359936201, 24952 3950355702, 24953 3867060991, 24954 4049844452, 24955 4234721005, 24956 1739656202, 24957 1790575107, 24958 2108100632, 24959 1890328081, 24960 1402811438, 24961 1586903591, 24962 1233856572, 24963 1149249077, 24964 266959938, 24965 48394827, 24966 369057872, 24967 418672217, 24968 1002783846, 24969 919489135, 24970 567498868, 24971 752375421, 24972 209336225, 24973 24197544, 24974 376187827, 24975 459744698, 24976 945164165, 24977 895287692, 24978 574624663, 24979 793451934, 24980 1679968233, 24981 1764313568, 24982 2117360635, 24983 1933530610, 24984 1343127501, 24985 1560637892, 24986 1243112415, 24987 1192455638, 24988 3704280881, 24989 3519142200, 24990 3336358691, 24991 3419915562, 24992 3907448597, 24993 3857572124, 24994 4075877127, 24995 4294704398, 24996 3029510009, 24997 3113855344, 24998 2927934315, 24999 2744104290, 25000 2159976285, 25001 2377486676, 25002 2594734927, 25003 2544078150 25004]; 25005var U4 = [ 25006 0, 25007 151849742, 25008 303699484, 25009 454499602, 25010 607398968, 25011 758720310, 25012 908999204, 25013 1059270954, 25014 1214797936, 25015 1097159550, 25016 1517440620, 25017 1400849762, 25018 1817998408, 25019 1699839814, 25020 2118541908, 25021 2001430874, 25022 2429595872, 25023 2581445614, 25024 2194319100, 25025 2345119218, 25026 3034881240, 25027 3186202582, 25028 2801699524, 25029 2951971274, 25030 3635996816, 25031 3518358430, 25032 3399679628, 25033 3283088770, 25034 4237083816, 25035 4118925222, 25036 4002861748, 25037 3885750714, 25038 1002142683, 25039 850817237, 25040 698445255, 25041 548169417, 25042 529487843, 25043 377642221, 25044 227885567, 25045 77089521, 25046 1943217067, 25047 2061379749, 25048 1640576439, 25049 1757691577, 25050 1474760595, 25051 1592394909, 25052 1174215055, 25053 1290801793, 25054 2875968315, 25055 2724642869, 25056 3111247143, 25057 2960971305, 25058 2405426947, 25059 2253581325, 25060 2638606623, 25061 2487810577, 25062 3808662347, 25063 3926825029, 25064 4044981591, 25065 4162096729, 25066 3342319475, 25067 3459953789,
25068 3576539503, 25069 3693126241, 25070 1986918061, 25071 2137062819, 25072 1685577905, 25073 1836772287, 25074 1381620373, 25075 1532285339, 25076 1078185097, 25077 1229899655, 25078 1040559837, 25079 923313619, 25080 740276417, 25081 621982671, 25082 439452389, 25083 322734571, 25084 137073913, 25085 19308535, 25086 3871163981, 25087 4021308739, 25088 4104605777, 25089 4255800159, 25090 3263785589, 25091 3414450555, 25092 3499326569, 25093 3651041127, 25094 2933202493, 25095 2815956275, 25096 3167684641, 25097 3049390895, 25098 2330014213, 25099 2213296395, 25100 2566595609, 25101 2448830231, 25102 1305906550, 25103 1155237496, 25104 1607244650, 25105 1455525988, 25106 1776460110, 25107 1626319424, 25108 2079897426, 25109 1928707164, 25110 96392454, 25111 213114376, 25112 396673818, 25113 514443284, 25114 562755902, 25115 679998e3, 25116 865136418, 25117 983426092, 25118 3708173718, 25119 3557504664, 25120 3474729866, 25121 3323011204, 25122 4180808110, 25123 4030667424, 25124 3945269170, 25125 3794078908, 25126 2507040230, 25127 2623762152, 25128 2272556026, 25129 2390325492, 25130 2975484382, 25131 3092726480, 25132 2738905026, 25133 2857194700, 25134 3973773121, 25135 3856137295, 25136 4274053469, 25137 4157467219, 25138 3371096953, 25139 3252932727, 25140 3673476453, 25141 3556361835, 25142 2763173681, 25143 2915017791, 25144 3064510765, 25145 3215307299, 25146 2156299017, 25147 2307622919, 25148 2459735317, 25149 2610011675, 25150 2081048481, 25151 1963412655, 25152 1846563261, 25153 1729977011, 25154 1480485785, 25155 1362321559, 25156 1243905413, 25157 1126790795, 25158 878845905, 25159 1030690015, 25160 645401037, 25161 796197571, 25162 274084841, 25163 425408743, 25164 38544885, 25165 188821243, 25166 3613494426, 25167 3731654548, 25168 3313212038, 25169 3430322568, 25170 4082475170, 25171 4200115116, 25172 3780097726, 25173 3896688048, 25174 2668221674, 25175 2516901860, 25176 2366882550, 25177 2216610296, 25178 3141400786, 25179 2989552604, 25180 2837966542, 25181 2687165888, 25182 1202797690, 25183 1320957812, 25184 1437280870, 25185 1554391400, 25186 1669664834, 25187 1787304780, 25188 1906247262, 25189 2022837584, 25190 265905162, 25191 114585348, 25192 499347990, 25193 349075736, 25194 736970802, 25195 585122620, 25196 972512814, 25197 821712160, 25198 2595684844, 25199 2478443234, 25200 2293045232, 25201 2174754046, 25202 3196267988, 25203 3079546586, 25204 2895723464, 25205 2777952454, 25206 3537852828, 25207 3687994002, 25208 3234156416, 25209 3385345166, 25210 4142626212, 25211 4293295786, 25212 3841024952, 25213 3992742070, 25214 174567692, 25215 57326082, 25216 410887952, 25217 292596766, 25218 777231668, 25219 660510266, 25220 1011452712, 25221 893681702, 25222 1108339068, 25223 1258480242, 25224 1343618912, 25225 1494807662, 25226 1715193156, 25227 1865862730, 25228 1948373848, 25229 2100090966, 25230 2701949495, 25231 2818666809, 25232 3004591147, 25233 3122358053, 25234 2235061775, 25235 2352307457, 25236 2535604243, 25237 2653899549, 25238 3915653703, 25239 3764988233, 25240 4219352155, 25241 4067639125, 25242 3444575871, 25243 3294430577, 25244 3746175075, 25245 3594982253, 25246 836553431, 25247 953270745, 25248 600235211, 25249 718002117, 25250 367585007, 25251 484830689, 25252 133361907, 25253 251657213, 25254 2041877159, 25255 1891211689, 25256 1806599355, 25257 1654886325, 25258 1568718495, 25259 1418573201, 25260 1335535747, 25261 1184342925 25262]; 25263function convertToInt32(bytes) { 25264 const result = []; 25265 for (let i = 0; i < bytes.length; i += 4) result.push(bytes[i] << 24 | bytes[i + 1] << 16 | bytes[i + 2] << 8 | bytes[i + 3]); 25266 return result; 25267} 25268var AES = class AES { 25269 get key() { 25270 return __classPrivateFieldGet$2(this, _AES_key, "f").slice(); 25271 } 25272 constructor(key) { 25273 _AES_key.set(this, void 0); 25274 _AES_Kd.set(this, void 0); 25275 _AES_Ke.set(this, void 0); 25276 if (!(this instanceof AES)) throw Error("AES must be instanitated with `new`"); 25277 __classPrivateFieldSet$2(this, _AES_key, new Uint8Array(key), "f"); 25278 const rounds = numberOfRounds[this.key.length]; 25279 if (rounds == null) throw new TypeError("invalid key size (must be 16, 24 or 32 bytes)"); 25280 __classPrivateFieldSet$2(this, _AES_Ke, [], "f"); 25281 __classPrivateFieldSet$2(this, _AES_Kd, [], "f"); 25282 for (let i = 0; i <= rounds; i++) { 25283 __classPrivateFieldGet$2(this, _AES_Ke, "f").push([ 25284 0, 25285 0, 25286 0, 25287 0 25288 ]); 25289 __classPrivateFieldGet$2(this, _AES_Kd, "f").push([ 25290 0, 25291 0, 25292 0, 25293 0 25294 ]); 25295 } 25296 const roundKeyCount = (rounds + 1) * 4; 25297 const KC = this.key.length / 4; 25298 const tk = convertToInt32(this.key); 25299 let index; 25300 for (let i = 0; i < KC; i++) { 25301 index = i >> 2; 25302 __classPrivateFieldGet$2(this, _AES_Ke, "f")[index][i % 4] = tk[i]; 25303 __classPrivateFieldGet$2(this, _AES_Kd, "f")[rounds - index][i % 4] = tk[i]; 25304 } 25305 let rconpointer = 0; 25306 let t = KC, tt; 25307 while (t < roundKeyCount) { 25308 tt = tk[KC - 1]; 25309 tk[0] ^= S[tt >> 16 & 255] << 24 ^ S[tt >> 8 & 255] << 16 ^ S[tt & 255] << 8 ^ S[tt >> 24 & 255] ^ rcon[rconpointer] << 24; 25310 rconpointer += 1; 25311 if (KC != 8) for (let i = 1; i < KC; i++) tk[i] ^= tk[i - 1]; 25312 else { 25313 for (let i = 1; i < KC / 2; i++) tk[i] ^= tk[i - 1]; 25314 tt = tk[KC / 2 - 1]; 25315 tk[KC / 2] ^= S[tt & 255] ^ S[tt >> 8 & 255] << 8 ^ S[tt >> 16 & 255] << 16 ^ S[tt >> 24 & 255] << 24; 25316 for (let i = KC / 2 + 1; i < KC; i++) tk[i] ^= tk[i - 1]; 25317 } 25318 let i = 0, r, c; 25319 while (i < KC && t < roundKeyCount) { 25320 r = t >> 2; 25321 c = t % 4; 25322 __classPrivateFieldGet$2(this, _AES_Ke, "f")[r][c] = tk[i]; 25323 __classPrivateFieldGet$2(this, _AES_Kd, "f")[rounds - r][c] = tk[i++]; 25324 t++; 25325 } 25326 } 25327 for (let r = 1; r < rounds; r++) for (let c = 0; c < 4; c++) { 25328 tt = __classPrivateFieldGet$2(this, _AES_Kd, "f")[r][c]; 25329 __classPrivateFieldGet$2(this, _AES_Kd, "f")[r][c] = U1[tt >> 24 & 255] ^ U2[tt >> 16 & 255] ^ U3[tt >> 8 & 255] ^ U4[tt & 255]; 25330 } 25331 } 25332 encrypt(plaintext) { 25333 if (plaintext.length != 16) throw new TypeError("invalid plaintext size (must be 16 bytes)"); 25334 const rounds = __classPrivateFieldGet$2(this, _AES_Ke, "f").length - 1; 25335 const a = [ 25336 0, 25337 0, 25338 0, 25339 0 25340 ]; 25341 let t = convertToInt32(plaintext); 25342 for (let i = 0; i < 4; i++) t[i] ^= __classPrivateFieldGet$2(this, _AES_Ke, "f")[0][i]; 25343 for (let r = 1; r < rounds; r++) { 25344 for (let i = 0; i < 4; i++) a[i] = T1[t[i] >> 24 & 255] ^ T2[t[(i + 1) % 4] >> 16 & 255] ^ T3[t[(i + 2) % 4] >> 8 & 255] ^ T4[t[(i + 3) % 4] & 255] ^ __classPrivateFieldGet$2(this, _AES_Ke, "f")[r][i]; 25345 t = a.slice(); 25346 } 25347 const result = /* @__PURE__ */ new Uint8Array(16); 25348 let tt = 0; 25349 for (let i = 0; i < 4; i++) { 25350 tt = __classPrivateFieldGet$2(this, _AES_Ke, "f")[rounds][i];
25351 result[4 * i] = (S[t[i] >> 24 & 255] ^ tt >> 24) & 255; 25352 result[4 * i + 1] = (S[t[(i + 1) % 4] >> 16 & 255] ^ tt >> 16) & 255; 25353 result[4 * i + 2] = (S[t[(i + 2) % 4] >> 8 & 255] ^ tt >> 8) & 255; 25354 result[4 * i + 3] = (S[t[(i + 3) % 4] & 255] ^ tt) & 255; 25355 } 25356 return result; 25357 } 25358 decrypt(ciphertext) { 25359 if (ciphertext.length != 16) throw new TypeError("invalid ciphertext size (must be 16 bytes)"); 25360 const rounds = __classPrivateFieldGet$2(this, _AES_Kd, "f").length - 1; 25361 const a = [ 25362 0, 25363 0, 25364 0, 25365 0 25366 ]; 25367 let t = convertToInt32(ciphertext); 25368 for (let i = 0; i < 4; i++) t[i] ^= __classPrivateFieldGet$2(this, _AES_Kd, "f")[0][i]; 25369 for (let r = 1; r < rounds; r++) { 25370 for (let i = 0; i < 4; i++) a[i] = T5[t[i] >> 24 & 255] ^ T6[t[(i + 3) % 4] >> 16 & 255] ^ T7[t[(i + 2) % 4] >> 8 & 255] ^ T8[t[(i + 1) % 4] & 255] ^ __classPrivateFieldGet$2(this, _AES_Kd, "f")[r][i]; 25371 t = a.slice(); 25372 } 25373 const result = /* @__PURE__ */ new Uint8Array(16); 25374 let tt = 0; 25375 for (let i = 0; i < 4; i++) { 25376 tt = __classPrivateFieldGet$2(this, _AES_Kd, "f")[rounds][i]; 25377 result[4 * i] = (Si[t[i] >> 24 & 255] ^ tt >> 24) & 255; 25378 result[4 * i + 1] = (Si[t[(i + 3) % 4] >> 16 & 255] ^ tt >> 16) & 255; 25379 result[4 * i + 2] = (Si[t[(i + 2) % 4] >> 8 & 255] ^ tt >> 8) & 255; 25380 result[4 * i + 3] = (Si[t[(i + 1) % 4] & 255] ^ tt) & 255; 25381 } 25382 return result; 25383 } 25384}; 25385_AES_key = /* @__PURE__ */ new WeakMap(), _AES_Kd = /* @__PURE__ */ new WeakMap(), _AES_Ke = /* @__PURE__ */ new WeakMap(); 25386//#endregion 25387//#region node_modules/aes-js/lib.esm/mode.js 25388var ModeOfOperation = class { 25389 constructor(name, key, cls) { 25390 if (cls && !(this instanceof cls)) throw new Error(`${name} must be instantiated with "new"`); 25391 Object.defineProperties(this, { 25392 aes: { 25393 enumerable: true, 25394 value: new AES(key) 25395 }, 25396 name: { 25397 enumerable: true, 25398 value: name 25399 } 25400 }); 25401 } 25402}; 25403//#endregion 25404//#region node_modules/aes-js/lib.esm/mode-cbc.js 25405var __classPrivateFieldSet$1 = function(receiver, state, value, kind, f) { 25406 if (kind === "m") throw new TypeError("Private method is not writable"); 25407 if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a setter"); 25408 if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot write private member to an object whose class did not declare it"); 25409 return kind === "a" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value), value; 25410}; 25411var __classPrivateFieldGet$1 = function(receiver, state, kind, f) { 25412 if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a getter"); 25413 if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot read private member from an object whose class did not declare it"); 25414 return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver); 25415}; 25416var _CBC_iv; 25417var _CBC_lastBlock; 25418var CBC = class CBC extends ModeOfOperation { 25419 constructor(key, iv) { 25420 super("ECC", key, CBC); 25421 _CBC_iv.set(this, void 0); 25422 _CBC_lastBlock.set(this, void 0); 25423 if (iv) { 25424 if (iv.length % 16) throw new TypeError("invalid iv size (must be 16 bytes)"); 25425 __classPrivateFieldSet$1(this, _CBC_iv, new Uint8Array(iv), "f"); 25426 } else __classPrivateFieldSet$1(this, _CBC_iv, /* @__PURE__ */ new Uint8Array(16), "f"); 25427 __classPrivateFieldSet$1(this, _CBC_lastBlock, this.iv, "f"); 25428 } 25429 get iv() { 25430 return new Uint8Array(__classPrivateFieldGet$1(this, _CBC_iv, "f")); 25431 } 25432 encrypt(plaintext) { 25433 if (plaintext.length % 16) throw new TypeError("invalid plaintext size (must be multiple of 16 bytes)"); 25434 const ciphertext = new Uint8Array(plaintext.length); 25435 for (let i = 0; i < plaintext.length; i += 16) { 25436 for (let j = 0; j < 16; j++) __classPrivateFieldGet$1(this, _CBC_lastBlock, "f")[j] ^= plaintext[i + j]; 25437 __classPrivateFieldSet$1(this, _CBC_lastBlock, this.aes.encrypt(__classPrivateFieldGet$1(this, _CBC_lastBlock, "f")), "f"); 25438 ciphertext.set(__classPrivateFieldGet$1(this, _CBC_lastBlock, "f"), i); 25439 } 25440 return ciphertext; 25441 } 25442 decrypt(ciphertext) { 25443 if (ciphertext.length % 16) throw new TypeError("invalid ciphertext size (must be multiple of 16 bytes)"); 25444 const plaintext = new Uint8Array(ciphertext.length); 25445 for (let i = 0; i < ciphertext.length; i += 16) { 25446 const block = this.aes.decrypt(ciphertext.subarray(i, i + 16)); 25447 for (let j = 0; j < 16; j++) { 25448 plaintext[i + j] = block[j] ^ __classPrivateFieldGet$1(this, _CBC_lastBlock, "f")[j]; 25449 __classPrivateFieldGet$1(this, _CBC_lastBlock, "f")[j] = ciphertext[i + j]; 25450 } 25451 } 25452 return plaintext; 25453 } 25454}; 25455_CBC_iv = /* @__PURE__ */ new WeakMap(), _CBC_lastBlock = /* @__PURE__ */ new WeakMap(); 25456//#endregion 25457//#region node_modules/aes-js/lib.esm/mode-ctr.js 25458var __classPrivateFieldSet = function(receiver, state, value, kind, f) { 25459 if (kind === "m") throw new TypeError("Private method is not writable"); 25460 if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a setter"); 25461 if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot write private member to an object whose class did not declare it"); 25462 return kind === "a" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value), value; 25463}; 25464var __classPrivateFieldGet = function(receiver, state, kind, f) { 25465 if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a getter"); 25466 if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot read private member from an object whose class did not declare it"); 25467 return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver); 25468}; 25469var _CTR_remaining; 25470var _CTR_remainingIndex; 25471var _CTR_counter; 25472var CTR = class CTR extends ModeOfOperation { 25473 constructor(key, initialValue) { 25474 super("CTR", key, CTR); 25475 _CTR_remaining.set(this, void 0); 25476 _CTR_remainingIndex.set(this, void 0); 25477 _CTR_counter.set(this, void 0);
25478 __classPrivateFieldSet(this, _CTR_counter, /* @__PURE__ */ new Uint8Array(16), "f"); 25479 __classPrivateFieldGet(this, _CTR_counter, "f").fill(0); 25480 __classPrivateFieldSet(this, _CTR_remaining, __classPrivateFieldGet(this, _CTR_counter, "f"), "f"); 25481 __classPrivateFieldSet(this, _CTR_remainingIndex, 16, "f"); 25482 if (initialValue == null) initialValue = 1; 25483 if (typeof initialValue === "number") this.setCounterValue(initialValue); 25484 else this.setCounterBytes(initialValue); 25485 } 25486 get counter() { 25487 return new Uint8Array(__classPrivateFieldGet(this, _CTR_counter, "f")); 25488 } 25489 setCounterValue(value) { 25490 if (!Number.isInteger(value) || value < 0 || value > Number.MAX_SAFE_INTEGER) throw new TypeError("invalid counter initial integer value"); 25491 for (let index = 15; index >= 0; --index) { 25492 __classPrivateFieldGet(this, _CTR_counter, "f")[index] = value % 256; 25493 value = Math.floor(value / 256); 25494 } 25495 } 25496 setCounterBytes(value) { 25497 if (value.length !== 16) throw new TypeError("invalid counter initial Uint8Array value length"); 25498 __classPrivateFieldGet(this, _CTR_counter, "f").set(value); 25499 } 25500 increment() { 25501 for (let i = 15; i >= 0; i--) if (__classPrivateFieldGet(this, _CTR_counter, "f")[i] === 255) __classPrivateFieldGet(this, _CTR_counter, "f")[i] = 0; 25502 else { 25503 __classPrivateFieldGet(this, _CTR_counter, "f")[i]++; 25504 break; 25505 } 25506 } 25507 encrypt(plaintext) { 25508 var _a, _b; 25509 const crypttext = new Uint8Array(plaintext); 25510 for (let i = 0; i < crypttext.length; i++) { 25511 if (__classPrivateFieldGet(this, _CTR_remainingIndex, "f") === 16) { 25512 __classPrivateFieldSet(this, _CTR_remaining, this.aes.encrypt(__classPrivateFieldGet(this, _CTR_counter, "f")), "f"); 25513 __classPrivateFieldSet(this, _CTR_remainingIndex, 0, "f"); 25514 this.increment(); 25515 } 25516 crypttext[i] ^= __classPrivateFieldGet(this, _CTR_remaining, "f")[__classPrivateFieldSet(this, _CTR_remainingIndex, (_b = __classPrivateFieldGet(this, _CTR_remainingIndex, "f"), _a = _b++, _b), "f"), _a]; 25517 } 25518 return crypttext; 25519 } 25520 decrypt(ciphertext) { 25521 return this.encrypt(ciphertext); 25522 } 25523}; 25524_CTR_remaining = /* @__PURE__ */ new WeakMap(), _CTR_remainingIndex = /* @__PURE__ */ new WeakMap(), _CTR_counter = /* @__PURE__ */ new WeakMap(); 25525//#endregion 25526//#region node_modules/aes-js/lib.esm/padding.js 25527function pkcs7Strip(data) { 25528 if (data.length < 16) throw new TypeError("PKCS#7 invalid length"); 25529 const padder = data[data.length - 1]; 25530 if (padder > 16) throw new TypeError("PKCS#7 padding byte out of range"); 25531 const length = data.length - padder; 25532 for (let i = 0; i < padder; i++) if (data[length + i] !== padder) throw new TypeError("PKCS#7 invalid padding byte"); 25533 return new Uint8Array(data.subarray(0, length)); 25534} 25535//#endregion 25536//#region node_modules/ethers/lib.esm/wallet/utils.js 25537/** 25538* @_ignore 25539*/ 25540function looseArrayify(hexString) { 25541 if (typeof hexString === "string" && !hexString.startsWith("0x")) hexString = "0x" + hexString; 25542 return getBytesCopy(hexString); 25543} 25544function zpad$1(value, length) { 25545 value = String(value); 25546 while (value.length < length) value = "0" + value; 25547 return value; 25548} 25549function getPassword(password) { 25550 if (typeof password === "string") return toUtf8Bytes(password, "NFKC"); 25551 return getBytesCopy(password); 25552} 25553function spelunk(object, _path) { 25554 const match = _path.match(/^([a-z0-9$_.-]*)(:([a-z]+))?(!)?$/i); 25555 assertArgument(match != null, "invalid path", "path", _path); 25556 const path = match[1]; 25557 const type = match[3]; 25558 const reqd = match[4] === "!"; 25559 let cur = object; 25560 for (const comp of path.toLowerCase().split(".")) { 25561 if (Array.isArray(cur)) { 25562 if (!comp.match(/^[0-9]+$/)) break; 25563 cur = cur[parseInt(comp)]; 25564 } else if (typeof cur === "object") { 25565 let found = null; 25566 for (const key in cur) if (key.toLowerCase() === comp) { 25567 found = cur[key]; 25568 break; 25569 } 25570 cur = found; 25571 } else cur = null; 25572 if (cur == null) break; 25573 } 25574 assertArgument(!reqd || cur != null, "missing required value", "path", path); 25575 if (type && cur != null) { 25576 if (type === "int") { 25577 if (typeof cur === "string" && cur.match(/^-?[0-9]+$/)) return parseInt(cur); 25578 else if (Number.isSafeInteger(cur)) return cur; 25579 } 25580 if (type === "number") { 25581 if (typeof cur === "string" && cur.match(/^-?[0-9.]*$/)) return parseFloat(cur); 25582 } 25583 if (type === "data") { 25584 if (typeof cur === "string") return looseArrayify(cur); 25585 } 25586 if (type === "array" && Array.isArray(cur)) return cur; 25587 if (type === typeof cur) return cur; 25588 assertArgument(false, `wrong type found for ${type} `, "path", path); 25589 } 25590 return cur; 25591} 25592//#endregion 25593//#region node_modules/ethers/lib.esm/wallet/json-keystore.js 25594/** 25595* The JSON Wallet formats allow a simple way to store the private 25596* keys needed in Ethereum along with related information and allows 25597* for extensible forms of encryption. 25598* 25599* These utilities facilitate decrypting and encrypting the most common 25600* JSON Wallet formats. 25601* 25602* @_subsection: api/wallet:JSON Wallets [json-wallets] 25603*/ 25604var defaultPath$1 = "m/44'/60'/0'/0/0"; 25605/** 25606* Returns true if %%json%% is a valid JSON Keystore Wallet. 25607*/ 25608function isKeystoreJson(json) { 25609 try { 25610 const data = JSON.parse(json); 25611 if ((data.version != null ? parseInt(data.version) : 0) === 3) return true; 25612 } catch (error) {} 25613 return false;
25614} 25615function decrypt(data, key, ciphertext) { 25616 if (spelunk(data, "crypto.cipher:string") === "aes-128-ctr") return hexlify(new CTR(key, spelunk(data, "crypto.cipherparams.iv:data!")).decrypt(ciphertext)); 25617 assert(false, "unsupported cipher", "UNSUPPORTED_OPERATION", { operation: "decrypt" }); 25618} 25619function getAccount(data, _key) { 25620 const key = getBytes(_key); 25621 const ciphertext = spelunk(data, "crypto.ciphertext:data!"); 25622 assertArgument(hexlify(keccak256(concat([key.slice(16, 32), ciphertext]))).substring(2) === spelunk(data, "crypto.mac:string!").toLowerCase(), "incorrect password", "password", "[ REDACTED ]"); 25623 const privateKey = decrypt(data, key.slice(0, 16), ciphertext); 25624 const address = computeAddress(privateKey); 25625 if (data.address) { 25626 let check = data.address.toLowerCase(); 25627 if (!check.startsWith("0x")) check = "0x" + check; 25628 assertArgument(getAddress(check) === address, "keystore address/privateKey mismatch", "address", data.address); 25629 } 25630 const account = { 25631 address, 25632 privateKey 25633 }; 25634 if (spelunk(data, "x-ethers.version:string") === "0.1") { 25635 const mnemonicKey = key.slice(32, 64); 25636 const mnemonicCiphertext = spelunk(data, "x-ethers.mnemonicCiphertext:data!"); 25637 const mnemonicAesCtr = new CTR(mnemonicKey, spelunk(data, "x-ethers.mnemonicCounter:data!")); 25638 account.mnemonic = { 25639 path: spelunk(data, "x-ethers.path:string") || defaultPath$1, 25640 locale: spelunk(data, "x-ethers.locale:string") || "en", 25641 entropy: hexlify(getBytes(mnemonicAesCtr.decrypt(mnemonicCiphertext))) 25642 }; 25643 } 25644 return account; 25645} 25646function getDecryptKdfParams(data) { 25647 const kdf = spelunk(data, "crypto.kdf:string"); 25648 if (kdf && typeof kdf === "string") { 25649 if (kdf.toLowerCase() === "scrypt") { 25650 const salt = spelunk(data, "crypto.kdfparams.salt:data!"); 25651 const N = spelunk(data, "crypto.kdfparams.n:int!"); 25652 const r = spelunk(data, "crypto.kdfparams.r:int!"); 25653 const p = spelunk(data, "crypto.kdfparams.p:int!"); 25654 assertArgument(N > 0 && (N & N - 1) === 0, "invalid kdf.N", "kdf.N", N); 25655 assertArgument(r > 0 && p > 0, "invalid kdf", "kdf", kdf); 25656 const dkLen = spelunk(data, "crypto.kdfparams.dklen:int!"); 25657 assertArgument(dkLen === 32, "invalid kdf.dklen", "kdf.dflen", dkLen); 25658 return { 25659 name: "scrypt", 25660 salt, 25661 N, 25662 r, 25663 p, 25664 dkLen: 64 25665 }; 25666 } else if (kdf.toLowerCase() === "pbkdf2") { 25667 const salt = spelunk(data, "crypto.kdfparams.salt:data!"); 25668 const prf = spelunk(data, "crypto.kdfparams.prf:string!"); 25669 const algorithm = prf.split("-").pop(); 25670 assertArgument(algorithm === "sha256" || algorithm === "sha512", "invalid kdf.pdf", "kdf.pdf", prf); 25671 const count = spelunk(data, "crypto.kdfparams.c:int!"); 25672 const dkLen = spelunk(data, "crypto.kdfparams.dklen:int!"); 25673 assertArgument(dkLen === 32, "invalid kdf.dklen", "kdf.dklen", dkLen); 25674 return { 25675 name: "pbkdf2", 25676 salt, 25677 count, 25678 dkLen, 25679 algorithm 25680 }; 25681 } 25682 } 25683 assertArgument(false, "unsupported key-derivation function", "kdf", kdf); 25684} 25685/** 25686* Returns the account details for the JSON Keystore Wallet %%json%% 25687* using %%password%%. 25688* 25689* It is preferred to use the [async version](decryptKeystoreJson) 25690* instead, which allows a [[ProgressCallback]] to keep the user informed 25691* as to the decryption status. 25692* 25693* This method will block the event loop (freezing all UI) until decryption 25694* is complete, which can take quite some time, depending on the wallet 25695* paramters and platform. 25696*/ 25697function decryptKeystoreJsonSync(json, _password) { 25698 const data = JSON.parse(json); 25699 const password = getPassword(_password); 25700 const params = getDecryptKdfParams(data); 25701 if (params.name === "pbkdf2") { 25702 const { salt, count, dkLen, algorithm } = params; 25703 return getAccount(data, pbkdf2(password, salt, count, dkLen, algorithm)); 25704 } 25705 assert(params.name === "scrypt", "cannot be reached", "UNKNOWN_ERROR", { params }); 25706 const { salt, N, r, p, dkLen } = params; 25707 return getAccount(data, scryptSync(password, salt, N, r, p, dkLen)); 25708} 25709function stall$1(duration) { 25710 return new Promise((resolve) => { 25711 setTimeout(() => { 25712 resolve(); 25713 }, duration); 25714 }); 25715} 25716/** 25717* Resolves to the decrypted JSON Keystore Wallet %%json%% using the 25718* %%password%%. 25719*
25720* If provided, %%progress%% will be called periodically during the 25721* decrpytion to provide feedback, and if the function returns 25722* ``false`` will halt decryption. 25723* 25724* The %%progressCallback%% will **always** receive ``0`` before 25725* decryption begins and ``1`` when complete. 25726*/ 25727async function decryptKeystoreJson(json, _password, progress) { 25728 const data = JSON.parse(json); 25729 const password = getPassword(_password); 25730 const params = getDecryptKdfParams(data); 25731 if (params.name === "pbkdf2") { 25732 if (progress) { 25733 progress(0); 25734 await stall$1(0); 25735 } 25736 const { salt, count, dkLen, algorithm } = params; 25737 const key = pbkdf2(password, salt, count, dkLen, algorithm); 25738 if (progress) { 25739 progress(1); 25740 await stall$1(0); 25741 } 25742 return getAccount(data, key); 25743 } 25744 assert(params.name === "scrypt", "cannot be reached", "UNKNOWN_ERROR", { params }); 25745 const { salt, N, r, p, dkLen } = params; 25746 return getAccount(data, await scrypt(password, salt, N, r, p, dkLen, progress)); 25747} 25748function getEncryptKdfParams(options) { 25749 const salt = options.salt != null ? getBytes(options.salt, "options.salt") : randomBytes(32); 25750 let N = 1 << 17, r = 8, p = 1; 25751 if (options.scrypt) { 25752 if (options.scrypt.N) N = options.scrypt.N; 25753 if (options.scrypt.r) r = options.scrypt.r; 25754 if (options.scrypt.p) p = options.scrypt.p; 25755 } 25756 assertArgument(typeof N === "number" && N > 0 && Number.isSafeInteger(N) && (BigInt(N) & BigInt(N - 1)) === BigInt(0), "invalid scrypt N parameter", "options.N", N); 25757 assertArgument(typeof r === "number" && r > 0 && Number.isSafeInteger(r), "invalid scrypt r parameter", "options.r", r); 25758 assertArgument(typeof p === "number" && p > 0 && Number.isSafeInteger(p), "invalid scrypt p parameter", "options.p", p); 25759 return { 25760 name: "scrypt", 25761 dkLen: 32, 25762 salt, 25763 N, 25764 r, 25765 p 25766 }; 25767} 25768function _encryptKeystore(key, kdf, account, options) { 25769 const privateKey = getBytes(account.privateKey, "privateKey"); 25770 const iv = options.iv != null ? getBytes(options.iv, "options.iv") : randomBytes(16); 25771 assertArgument(iv.length === 16, "invalid options.iv length", "options.iv", options.iv); 25772 const uuidRandom = options.uuid != null ? getBytes(options.uuid, "options.uuid") : randomBytes(16); 25773 assertArgument(uuidRandom.length === 16, "invalid options.uuid length", "options.uuid", options.iv); 25774 const derivedKey = key.slice(0, 16); 25775 const macPrefix = key.slice(16, 32); 25776 const ciphertext = getBytes(new CTR(derivedKey, iv).encrypt(privateKey)); 25777 const mac = keccak256(concat([macPrefix, ciphertext])); 25778 const data = { 25779 address: account.address.substring(2).toLowerCase(), 25780 id: uuidV4(uuidRandom), 25781 version: 3, 25782 Crypto: { 25783 cipher: "aes-128-ctr", 25784 cipherparams: { iv: hexlify(iv).substring(2) }, 25785 ciphertext: hexlify(ciphertext).substring(2), 25786 kdf: "scrypt", 25787 kdfparams: { 25788 salt: hexlify(kdf.salt).substring(2), 25789 n: kdf.N, 25790 dklen: 32, 25791 p: kdf.p, 25792 r: kdf.r 25793 }, 25794 mac: mac.substring(2) 25795 } 25796 }; 25797 if (account.mnemonic) { 25798 const client = options.client != null ? options.client : `ethers/${version}`; 25799 const path = account.mnemonic.path || defaultPath$1; 25800 const locale = account.mnemonic.locale || "en"; 25801 const mnemonicKey = key.slice(32, 64); 25802 const entropy = getBytes(account.mnemonic.entropy, "account.mnemonic.entropy"); 25803 const mnemonicIv = randomBytes(16); 25804 const mnemonicCiphertext = getBytes(new CTR(mnemonicKey, mnemonicIv).encrypt(entropy)); 25805 const now = /* @__PURE__ */ new Date(); 25806 data["x-ethers"] = { 25807 client, 25808 gethFilename: "UTC--" + (now.getUTCFullYear() + "-" + zpad$1(now.getUTCMonth() + 1, 2) + "-" + zpad$1(now.getUTCDate(), 2) + "T" + zpad$1(now.getUTCHours(), 2) + "-" + zpad$1(now.getUTCMinutes(), 2) + "-" + zpad$1(now.getUTCSeconds(), 2) + ".0Z") + "--" + data.address, 25809 path, 25810 locale, 25811 mnemonicCounter: hexlify(mnemonicIv).substring(2), 25812 mnemonicCiphertext: hexlify(mnemonicCiphertext).substring(2), 25813 version: "0.1" 25814 }; 25815 } 25816 return JSON.stringify(data); 25817} 25818/** 25819* Return the JSON Keystore Wallet for %%account%% encrypted with 25820* %%password%%. 25821* 25822* The %%options%% can be used to tune the password-based key 25823* derivation function parameters, explicitly set the random values 25824* used. Any provided [[ProgressCallback]] is ignord. 25825*/
25826function encryptKeystoreJsonSync(account, password, options) { 25827 if (options == null) options = {}; 25828 const passwordBytes = getPassword(password); 25829 const kdf = getEncryptKdfParams(options); 25830 return _encryptKeystore(getBytes(scryptSync(passwordBytes, kdf.salt, kdf.N, kdf.r, kdf.p, 64)), kdf, account, options); 25831} 25832/** 25833* Resolved to the JSON Keystore Wallet for %%account%% encrypted 25834* with %%password%%. 25835* 25836* The %%options%% can be used to tune the password-based key 25837* derivation function parameters, explicitly set the random values 25838* used and provide a [[ProgressCallback]] to receive periodic updates 25839* on the completion status.. 25840*/ 25841async function encryptKeystoreJson(account, password, options) { 25842 if (options == null) options = {}; 25843 const passwordBytes = getPassword(password); 25844 const kdf = getEncryptKdfParams(options); 25845 return _encryptKeystore(getBytes(await scrypt(passwordBytes, kdf.salt, kdf.N, kdf.r, kdf.p, 64, options.progressCallback)), kdf, account, options); 25846} 25847//#endregion 25848//#region node_modules/ethers/lib.esm/wallet/hdwallet.js 25849/** 25850* Explain HD Wallets.. 25851* 25852* @_subsection: api/wallet:HD Wallets [hd-wallets] 25853*/ 25854/** 25855* The default derivation path for Ethereum HD Nodes. (i.e. ``"m/44'/60'/0'/0/0"``) 25856*/ 25857var defaultPath = "m/44'/60'/0'/0/0"; 25858var MasterSecret = new Uint8Array([ 25859 66, 25860 105, 25861 116, 25862 99, 25863 111, 25864 105, 25865 110, 25866 32, 25867 115, 25868 101, 25869 101, 25870 100 25871]); 25872var HardenedBit = 2147483648; 25873var N$1 = BigInt("0xfffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364141"); 25874var Nibbles = "0123456789abcdef"; 25875function zpad(value, length) { 25876 let result = ""; 25877 while (value) { 25878 result = Nibbles[value % 16] + result; 25879 value = Math.trunc(value / 16); 25880 } 25881 while (result.length < length * 2) result = "0" + result; 25882 return "0x" + result; 25883} 25884function encodeBase58Check(_value) { 25885 const value = getBytes(_value); 25886 return encodeBase58(concat([value, dataSlice(sha256(sha256(value)), 0, 4)])); 25887} 25888var _guard = {}; 25889function ser_I(index, chainCode, publicKey, privateKey) { 25890 const data = /* @__PURE__ */ new Uint8Array(37); 25891 if (index & HardenedBit) { 25892 assert(privateKey != null, "cannot derive child of neutered node", "UNSUPPORTED_OPERATION", { operation: "deriveChild" }); 25893 data.set(getBytes(privateKey), 1); 25894 } else data.set(getBytes(publicKey)); 25895 for (let i = 24; i >= 0; i -= 8) data[33 + (i >> 3)] = index >> 24 - i & 255; 25896 const I = getBytes(computeHmac("sha512", chainCode, data)); 25897 return { 25898 IL: I.slice(0, 32), 25899 IR: I.slice(32) 25900 }; 25901} 25902function derivePath(node, path) { 25903 const components = path.split("/"); 25904 assertArgument(components.length > 0, "invalid path", "path", path); 25905 if (components[0] === "m") { 25906 assertArgument(node.depth === 0, `cannot derive root path (i.e. path starting with "m/") for a node at non-zero depth ${node.depth}`, "path", path); 25907 components.shift(); 25908 } 25909 let result = node; 25910 for (let i = 0; i < components.length; i++) { 25911 const component = components[i]; 25912 if (component.match(/^[0-9]+'$/)) { 25913 const index = parseInt(component.substring(0, component.length - 1)); 25914 assertArgument(index < HardenedBit, "invalid path index", `path[${i}]`, component); 25915 result = result.deriveChild(HardenedBit + index); 25916 } else if (component.match(/^[0-9]+$/)) { 25917 const index = parseInt(component); 25918 assertArgument(index < HardenedBit, "invalid path index", `path[${i}]`, component); 25919 result = result.deriveChild(index); 25920 } else assertArgument(false, "invalid path component", `path[${i}]`, component); 25921 } 25922 return result; 25923} 25924/** 25925* An **HDNodeWallet** is a [[Signer]] backed by the private key derived 25926* from an HD Node using the [[link-bip-32]] stantard. 25927* 25928* An HD Node forms a hierarchal structure with each HD Node having a 25929* private key and the ability to derive child HD Nodes, defined by 25930* a path indicating the index of each child. 25931*/ 25932var HDNodeWallet = class HDNodeWallet extends BaseWallet { 25933 /** 25934 * The compressed public key. 25935 */ 25936 publicKey; 25937 /** 25938 * The fingerprint. 25939 * 25940 * A fingerprint allows quick qay to detect parent and child nodes, 25941 * but developers should be prepared to deal with collisions as it 25942 * is only 4 bytes. 25943 */ 25944 fingerprint; 25945 /** 25946 * The parent fingerprint. 25947 */ 25948 parentFingerprint; 25949 /** 25950 * The mnemonic used to create this HD Node, if available. 25951 *
vendor: 7,892 bytes, lines 25952-26193
25952 * Sources such as extended keys do not encode the mnemonic, in 25953 * which case this will be ``null``. 25954 */ 25955 mnemonic; 25956 /** 25957 * The chaincode, which is effectively a public key used 25958 * to derive children. 25959 */ 25960 chainCode; 25961 /** 25962 * The derivation path of this wallet. 25963 * 25964 * Since extended keys do not provide full path details, this 25965 * may be ``null``, if instantiated from a source that does not 25966 * encode it. 25967 */ 25968 path; 25969 /** 25970 * The child index of this wallet. Values over ``2 *\* 31`` indicate 25971 * the node is hardened. 25972 */ 25973 index; 25974 /** 25975 * The depth of this wallet, which is the number of components 25976 * in its path. 25977 */ 25978 depth; 25979 /** 25980 * @private 25981 */ 25982 constructor(guard, signingKey, parentFingerprint, chainCode, path, index, depth, mnemonic, provider) { 25983 super(signingKey, provider); 25984 assertPrivate(guard, _guard, "HDNodeWallet"); 25985 defineProperties(this, { publicKey: signingKey.compressedPublicKey }); 25986 const fingerprint = dataSlice(ripemd160(sha256(this.publicKey)), 0, 4); 25987 defineProperties(this, { 25988 parentFingerprint, 25989 fingerprint, 25990 chainCode, 25991 path, 25992 index, 25993 depth 25994 }); 25995 defineProperties(this, { mnemonic }); 25996 } 25997 connect(provider) { 25998 return new HDNodeWallet(_guard, this.signingKey, this.parentFingerprint, this.chainCode, this.path, this.index, this.depth, this.mnemonic, provider); 25999 } 26000 #account() { 26001 const account = { 26002 address: this.address, 26003 privateKey: this.privateKey 26004 }; 26005 const m = this.mnemonic; 26006 if (this.path && m && m.wordlist.locale === "en" && m.password === "") account.mnemonic = { 26007 path: this.path, 26008 locale: "en", 26009 entropy: m.entropy 26010 }; 26011 return account; 26012 } 26013 /** 26014 * Resolves to a [JSON Keystore Wallet](json-wallets) encrypted with 26015 * %%password%%. 26016 * 26017 * If %%progressCallback%% is specified, it will receive periodic 26018 * updates as the encryption process progreses. 26019 */ 26020 async encrypt(password, progressCallback) { 26021 return await encryptKeystoreJson(this.#account(), password, { progressCallback }); 26022 } 26023 /** 26024 * Returns a [JSON Keystore Wallet](json-wallets) encryped with 26025 * %%password%%. 26026 * 26027 * It is preferred to use the [async version](encrypt) instead, 26028 * which allows a [[ProgressCallback]] to keep the user informed. 26029 * 26030 * This method will block the event loop (freezing all UI) until 26031 * it is complete, which may be a non-trivial duration. 26032 */ 26033 encryptSync(password) { 26034 return encryptKeystoreJsonSync(this.#account(), password); 26035 } 26036 /** 26037 * The extended key. 26038 * 26039 * This key will begin with the prefix ``xpriv`` and can be used to 26040 * reconstruct this HD Node to derive its children. 26041 */ 26042 get extendedKey() { 26043 assert(this.depth < 256, "Depth too deep", "UNSUPPORTED_OPERATION", { operation: "extendedKey" }); 26044 return encodeBase58Check(concat([ 26045 "0x0488ADE4", 26046 zpad(this.depth, 1), 26047 this.parentFingerprint, 26048 zpad(this.index, 4), 26049 this.chainCode, 26050 concat(["0x00", this.privateKey]) 26051 ])); 26052 } 26053 /** 26054 * Returns true if this wallet has a path, providing a Type Guard 26055 * that the path is non-null. 26056 */ 26057 hasPath() { 26058 return this.path != null; 26059 } 26060 /** 26061 * Returns a neutered HD Node, which removes the private details 26062 * of an HD Node. 26063 * 26064 * A neutered node has no private key, but can be used to derive 26065 * child addresses and other public data about the HD Node. 26066 */ 26067 neuter() { 26068 return new HDNodeVoidWallet(_guard, this.address, this.publicKey, this.parentFingerprint, this.chainCode, this.path, this.index, this.depth, this.provider); 26069 } 26070 /** 26071 * Return the child for %%index%%. 26072 */ 26073 deriveChild(_index) { 26074 const index = getNumber(_index, "index"); 26075 assertArgument(index <= 4294967295, "invalid index", "index", index); 26076 let path = this.path; 26077 if (path) { 26078 path += "/" + (index & 2147483647); 26079 if (index & HardenedBit) path += "'"; 26080 } 26081 const { IR, IL } = ser_I(index, this.chainCode, this.publicKey, this.privateKey); 26082 const ki = new SigningKey(toBeHex((toBigInt(IL) + BigInt(this.privateKey)) % N$1, 32)); 26083 return new HDNodeWallet(_guard, ki, this.fingerprint, hexlify(IR), path, index, this.depth + 1, this.mnemonic, this.provider); 26084 } 26085 /** 26086 * Return the HDNode for %%path%% from this node. 26087 */ 26088 derivePath(path) { 26089 return derivePath(this, path); 26090 } 26091 static #fromSeed(_seed, mnemonic) { 26092 assertArgument(isBytesLike(_seed), "invalid seed", "seed", "[REDACTED]"); 26093 const seed = getBytes(_seed, "seed"); 26094 assertArgument(seed.length >= 16 && seed.length <= 64, "invalid seed", "seed", "[REDACTED]"); 26095 const I = getBytes(computeHmac("sha512", MasterSecret, seed)); 26096 const signingKey = new SigningKey(hexlify(I.slice(0, 32))); 26097 return new HDNodeWallet(_guard, signingKey, "0x00000000", hexlify(I.slice(32)), "m", 0, 0, mnemonic, null); 26098 } 26099 /** 26100 * Creates a new HD Node from %%extendedKey%%. 26101 * 26102 * If the %%extendedKey%% will either have a prefix or ``xpub`` or 26103 * ``xpriv``, returning a neutered HD Node ([[HDNodeVoidWallet]]) 26104 * or full HD Node ([[HDNodeWallet) respectively. 26105 */ 26106 static fromExtendedKey(extendedKey) { 26107 const bytes = toBeArray(decodeBase58(extendedKey)); 26108 assertArgument(bytes.length === 82 || encodeBase58Check(bytes.slice(0, 78)) === extendedKey, "invalid extended key", "extendedKey", "[ REDACTED ]"); 26109 const depth = bytes[4]; 26110 const parentFingerprint = hexlify(bytes.slice(5, 9)); 26111 const index = parseInt(hexlify(bytes.slice(9, 13)).substring(2), 16); 26112 const chainCode = hexlify(bytes.slice(13, 45)); 26113 const key = bytes.slice(45, 78); 26114 switch (hexlify(bytes.slice(0, 4))) { 26115 case "0x0488b21e": 26116 case "0x043587cf": { 26117 const publicKey = hexlify(key); 26118 return new HDNodeVoidWallet(_guard, computeAddress(publicKey), publicKey, parentFingerprint, chainCode, null, index, depth, null); 26119 } 26120 case "0x0488ade4": 26121 case "0x04358394 ": 26122 if (key[0] !== 0) break; 26123 return new HDNodeWallet(_guard, new SigningKey(key.slice(1)), parentFingerprint, chainCode, null, index, depth, null, null); 26124 } 26125 assertArgument(false, "invalid extended key prefix", "extendedKey", "[ REDACTED ]"); 26126 } 26127 /** 26128 * Creates a new random HDNode. 26129 */ 26130 static createRandom(password, path, wordlist) { 26131 if (password == null) password = ""; 26132 if (path == null) path = defaultPath; 26133 if (wordlist == null) wordlist = LangEn.wordlist(); 26134 const mnemonic = Mnemonic.fromEntropy(randomBytes(16), password, wordlist); 26135 return HDNodeWallet.#fromSeed(mnemonic.computeSeed(), mnemonic).derivePath(path); 26136 } 26137 /** 26138 * Create an HD Node from %%mnemonic%%. 26139 */ 26140 static fromMnemonic(mnemonic, path) { 26141 if (!path) path = defaultPath; 26142 return HDNodeWallet.#fromSeed(mnemonic.computeSeed(), mnemonic).derivePath(path); 26143 } 26144 /** 26145 * Creates an HD Node from a mnemonic %%phrase%%. 26146 */ 26147 static fromPhrase(phrase, password, path, wordlist) { 26148 if (password == null) password = ""; 26149 if (path == null) path = defaultPath; 26150 if (wordlist == null) wordlist = LangEn.wordlist(); 26151 const mnemonic = Mnemonic.fromPhrase(phrase, password, wordlist); 26152 return HDNodeWallet.#fromSeed(mnemonic.computeSeed(), mnemonic).derivePath(path); 26153 } 26154 /** 26155 * Creates an HD Node from a %%seed%%. 26156 */ 26157 static fromSeed(seed) { 26158 return HDNodeWallet.#fromSeed(seed, null); 26159 } 26160}; 26161/** 26162* A **HDNodeVoidWallet** cannot sign, but provides access to 26163* the children nodes of a [[link-bip-32]] HD wallet addresses. 26164* 26165* The can be created by using an extended ``xpub`` key to 26166* [[HDNodeWallet_fromExtendedKey]] or by 26167* [nuetering](HDNodeWallet-neuter) a [[HDNodeWallet]]. 26168*/ 26169var HDNodeVoidWallet = class HDNodeVoidWallet extends VoidSigner { 26170 /** 26171 * The compressed public key. 26172 */ 26173 publicKey; 26174 /** 26175 * The fingerprint. 26176 * 26177 * A fingerprint allows quick qay to detect parent and child nodes, 26178 * but developers should be prepared to deal with collisions as it 26179 * is only 4 bytes. 26180 */ 26181 fingerprint; 26182 /** 26183 * The parent node fingerprint. 26184 */ 26185 parentFingerprint; 26186 /** 26187 * The chaincode, which is effectively a public key used 26188 * to derive children. 26189 */ 26190 chainCode; 26191 /** 26192 * The derivation path of this wallet. 26193 *
26194 * Since extended keys do not provider full path details, this 26195 * may be ``null``, if instantiated from a source that does not 26196 * enocde it. 26197 */ 26198 path; 26199 /** 26200 * The child index of this wallet. Values over ``2 *\* 31`` indicate 26201 * the node is hardened. 26202 */ 26203 index; 26204 /** 26205 * The depth of this wallet, which is the number of components 26206 * in its path. 26207 */ 26208 depth; 26209 /** 26210 * @private 26211 */ 26212 constructor(guard, address, publicKey, parentFingerprint, chainCode, path, index, depth, provider) { 26213 super(address, provider); 26214 assertPrivate(guard, _guard, "HDNodeVoidWallet"); 26215 defineProperties(this, { publicKey }); 26216 const fingerprint = dataSlice(ripemd160(sha256(publicKey)), 0, 4); 26217 defineProperties(this, { 26218 publicKey, 26219 fingerprint, 26220 parentFingerprint, 26221 chainCode, 26222 path, 26223 index, 26224 depth 26225 }); 26226 } 26227 connect(provider) { 26228 return new HDNodeVoidWallet(_guard, this.address, this.publicKey, this.parentFingerprint, this.chainCode, this.path, this.index, this.depth, provider); 26229 } 26230 /** 26231 * The extended key. 26232 * 26233 * This key will begin with the prefix ``xpub`` and can be used to 26234 * reconstruct this neutered key to derive its children addresses. 26235 */ 26236 get extendedKey() { 26237 assert(this.depth < 256, "Depth too deep", "UNSUPPORTED_OPERATION", { operation: "extendedKey" }); 26238 return encodeBase58Check(concat([ 26239 "0x0488B21E", 26240 zpad(this.depth, 1), 26241 this.parentFingerprint, 26242 zpad(this.index, 4), 26243 this.chainCode, 26244 this.publicKey 26245 ])); 26246 } 26247 /** 26248 * Returns true if this wallet has a path, providing a Type Guard 26249 * that the path is non-null. 26250 */ 26251 hasPath() { 26252 return this.path != null; 26253 } 26254 /** 26255 * Return the child for %%index%%. 26256 */ 26257 deriveChild(_index) { 26258 const index = getNumber(_index, "index"); 26259 assertArgument(index <= 4294967295, "invalid index", "index", index); 26260 let path = this.path; 26261 if (path) { 26262 path += "/" + (index & 2147483647); 26263 if (index & HardenedBit) path += "'"; 26264 } 26265 const { IR, IL } = ser_I(index, this.chainCode, this.publicKey, null); 26266 const Ki = SigningKey.addPoints(IL, this.publicKey, true); 26267 const address = computeAddress(Ki); 26268 return new HDNodeVoidWallet(_guard, address, Ki, this.fingerprint, hexlify(IR), path, index, this.depth + 1, this.provider); 26269 } 26270 /** 26271 * Return the signer for %%path%% from this node. 26272 */ 26273 derivePath(path) { 26274 return derivePath(this, path); 26275 } 26276}; 26277/** 26278* Returns the [[link-bip-32]] path for the account at %%index%%. 26279* 26280* This is the pattern used by wallets like Ledger. 26281* 26282* There is also an [alternate pattern](getIndexedAccountPath) used by 26283* some software. 26284*/ 26285function getAccountPath(_index) { 26286 const index = getNumber(_index, "index"); 26287 assertArgument(index >= 0 && index < HardenedBit, "invalid account index", "index", index); 26288 return `m/44'/60'/${index}'/0/0`; 26289} 26290/** 26291* Returns the path using an alternative pattern for deriving accounts, 26292* at %%index%%. 26293* 26294* This derivation path uses the //index// component rather than the 26295* //account// component to derive sequential accounts. 26296* 26297* This is the pattern used by wallets like MetaMask. 26298*/ 26299function getIndexedAccountPath(_index) { 26300 const index = getNumber(_index, "index"); 26301 assertArgument(index >= 0 && index < HardenedBit, "invalid account index", "index", index); 26302 return `m/44'/60'/0'/0/${index}`; 26303} 26304//#endregion 26305//#region node_modules/ethers/lib.esm/wallet/json-crowdsale.js 26306/** 26307* @_subsection: api/wallet:JSON Wallets [json-wallets] 26308*/ 26309/** 26310* Returns true if %%json%% is a valid JSON Crowdsale wallet. 26311*/ 26312function isCrowdsaleJson(json) { 26313 try { 26314 if (JSON.parse(json).encseed) return true; 26315 } catch (error) {} 26316 return false; 26317} 26318/** 26319* Before Ethereum launched, it was necessary to create a wallet 26320* format for backers to use, which would be used to receive ether 26321* as a reward for contributing to the project. 26322* 26323* The [[link-crowdsale]] format is now obsolete, but it is still 26324* useful to support and the additional code is fairly trivial as 26325* all the primitives required are used through core portions of 26326* the library. 26327*/ 26328function decryptCrowdsaleJson(json, _password) { 26329 const data = JSON.parse(json); 26330 const password = getPassword(_password); 26331 const address = getAddress(spelunk(data, "ethaddr:string!")); 26332 const encseed = looseArrayify(spelunk(data, "encseed:string!")); 26333 assertArgument(encseed && encseed.length % 16 === 0, "invalid encseed", "json", json); 26334 const key = getBytes(pbkdf2(password, password, 2e3, 32, "sha256")).slice(0, 16); 26335 const iv = encseed.slice(0, 16); 26336 const encryptedSeed = encseed.slice(16); 26337 const seed = pkcs7Strip(getBytes(new CBC(key, iv).decrypt(encryptedSeed))); 26338 let seedHex = ""; 26339 for (let i = 0; i < seed.length; i++) seedHex += String.fromCharCode(seed[i]); 26340 return { 26341 address, 26342 privateKey: id(seedHex) 26343 }; 26344} 26345//#endregion 26346//#region node_modules/ethers/lib.esm/wallet/wallet.js 26347function stall(duration) { 26348 return new Promise((resolve) => { 26349 setTimeout(() => { 26350 resolve(); 26351 }, duration); 26352 }); 26353} 26354/** 26355* A **Wallet** manages a single private key which is used to sign 26356* transactions, messages and other common payloads. 26357* 26358* This class is generally the main entry point for developers 26359* that wish to use a private key directly, as it can create 26360* instances from a large variety of common sources, including 26361* raw private key, [[link-bip-39]] mnemonics and encrypte JSON 26362* wallets. 26363*/ 26364var Wallet = class Wallet extends BaseWallet { 26365 /** 26366 * Create a new wallet for the private %%key%%, optionally connected 26367 * to %%provider%%. 26368 */ 26369 constructor(key, provider) { 26370 if (typeof key === "string" && !key.startsWith("0x")) key = "0x" + key; 26371 let signingKey = typeof key === "string" ? new SigningKey(key) : key; 26372 super(signingKey, provider); 26373 } 26374 connect(provider) { 26375 return new Wallet(this.signingKey, provider); 26376 } 26377 /** 26378 * Resolves to a [JSON Keystore Wallet](json-wallets) encrypted with 26379 * %%password%%. 26380 * 26381 * If %%progressCallback%% is specified, it will receive periodic 26382 * updates as the encryption process progreses. 26383 */ 26384 async encrypt(password, progressCallback) {
26385 return await encryptKeystoreJson({ 26386 address: this.address, 26387 privateKey: this.privateKey 26388 }, password, { progressCallback }); 26389 } 26390 /** 26391 * Returns a [JSON Keystore Wallet](json-wallets) encryped with 26392 * %%password%%. 26393 * 26394 * It is preferred to use the [async version](encrypt) instead, 26395 * which allows a [[ProgressCallback]] to keep the user informed. 26396 * 26397 * This method will block the event loop (freezing all UI) until 26398 * it is complete, which may be a non-trivial duration. 26399 */ 26400 encryptSync(password) { 26401 return encryptKeystoreJsonSync({ 26402 address: this.address, 26403 privateKey: this.privateKey 26404 }, password); 26405 } 26406 static #fromAccount(account) { 26407 assertArgument(account, "invalid JSON wallet", "json", "[ REDACTED ]"); 26408 if ("mnemonic" in account && account.mnemonic && account.mnemonic.locale === "en") { 26409 const mnemonic = Mnemonic.fromEntropy(account.mnemonic.entropy); 26410 const wallet = HDNodeWallet.fromMnemonic(mnemonic, account.mnemonic.path); 26411 if (wallet.address === account.address && wallet.privateKey === account.privateKey) return wallet; 26412 console.log("WARNING: JSON mismatch address/privateKey != mnemonic; fallback onto private key"); 26413 } 26414 const wallet = new Wallet(account.privateKey); 26415 assertArgument(wallet.address === account.address, "address/privateKey mismatch", "json", "[ REDACTED ]"); 26416 return wallet; 26417 }
26418 /** 26419 * Creates (asynchronously) a **Wallet** by decrypting the %%json%% 26420 * with %%password%%. 26421 * 26422 * If %%progress%% is provided, it is called periodically during 26423 * decryption so that any UI can be updated. 26424 */ 26425 static async fromEncryptedJson(json, password, progress) { 26426 let account = null; 26427 if (isKeystoreJson(json)) account = await decryptKeystoreJson(json, password, progress); 26428 else if (isCrowdsaleJson(json)) { 26429 if (progress) { 26430 progress(0); 26431 await stall(0); 26432 } 26433 account = decryptCrowdsaleJson(json, password); 26434 if (progress) { 26435 progress(1); 26436 await stall(0); 26437 } 26438 } 26439 return Wallet.#fromAccount(account); 26440 } 26441 /** 26442 * Creates a **Wallet** by decrypting the %%json%% with %%password%%. 26443 * 26444 * The [[fromEncryptedJson]] method is preferred, as this method 26445 * will lock up and freeze the UI during decryption, which may take 26446 * some time. 26447 */ 26448 static fromEncryptedJsonSync(json, password) { 26449 let account = null; 26450 if (isKeystoreJson(json)) account = decryptKeystoreJsonSync(json, password); 26451 else if (isCrowdsaleJson(json)) account = decryptCrowdsaleJson(json, password); 26452 else assertArgument(false, "invalid JSON wallet", "json", "[ REDACTED ]"); 26453 return Wallet.#fromAccount(account); 26454 } 26455 /** 26456 * Creates a new random [[HDNodeWallet]] using the available 26457 * [cryptographic random source](randomBytes). 26458 * 26459 * If there is no crytographic random source, this will throw. 26460 */ 26461 static createRandom(provider) { 26462 const wallet = HDNodeWallet.createRandom(); 26463 if (provider) return wallet.connect(provider); 26464 return wallet; 26465 }
26466 /** 26467 * Creates a [[HDNodeWallet]] for %%phrase%%. 26468 */ 26469 static fromPhrase(phrase, provider) { 26470 const wallet = HDNodeWallet.fromPhrase(phrase); 26471 if (provider) return wallet.connect(provider); 26472 return wallet; 26473 } 26474}; 26475//#endregion 26476//#region node_modules/ethers/lib.esm/wordlists/bit-reader.js 26477var Base64 = ")!@#$%^&*(ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz-_"; 26478/** 26479* @_ignore 26480*/ 26481function decodeBits(width, data) { 26482 const maxValue = (1 << width) - 1; 26483 const result = []; 26484 let accum = 0, bits = 0, flood = 0; 26485 for (let i = 0; i < data.length; i++) { 26486 accum = accum << 6 | Base64.indexOf(data[i]); 26487 bits += 6; 26488 while (bits >= width) { 26489 const value = accum >> bits - width; 26490 accum &= (1 << bits - width) - 1; 26491 bits -= width; 26492 if (value === 0) flood += maxValue; 26493 else { 26494 result.push(value + flood); 26495 flood = 0; 26496 } 26497 } 26498 } 26499 return result; 26500} 26501//#endregion 26502//#region node_modules/ethers/lib.esm/wordlists/decode-owla.js 26503/** 26504* @_ignore 26505*/ 26506function decodeOwlA(data, accents) { 26507 let words = decodeOwl(data).join(","); 26508 accents.split(/,/g).forEach((accent) => { 26509 const match = accent.match(/^([a-z]*)([0-9]+)([0-9])(.*)$/); 26510 assertArgument(match !== null, "internal error parsing accents", "accents", accents); 26511 let posOffset = 0; 26512 const positions = decodeBits(parseInt(match[3]), match[4]); 26513 const charCode = parseInt(match[2]); 26514 const regex = new RegExp(`([${match[1]}])`, "g"); 26515 words = words.replace(regex, (all, letter) => { 26516 if (--positions[posOffset] === 0) { 26517 letter = String.fromCharCode(letter.charCodeAt(0), charCode); 26518 posOffset++; 26519 } 26520 return letter; 26521 }); 26522 }); 26523 return words.split(","); 26524} 26525//#endregion 26526//#region node_modules/ethers/lib.esm/wordlists/wordlist-owla.js 26527/** 26528* An OWL-A format Wordlist extends the OWL format to add an 26529* overlay onto an OWL format Wordlist to support diacritic 26530* marks. 26531* 26532* This class is generally not useful to most developers as 26533* it is used mainly internally to keep Wordlists for languages 26534* based on latin-1 small. 26535* 26536* If necessary, there are tools within the ``generation/`` folder 26537* to create the necessary data. 26538*/ 26539var WordlistOwlA = class extends WordlistOwl { 26540 #accent; 26541 /** 26542 * Creates a new Wordlist for %%locale%% using the OWLA %%data%% 26543 * and %%accent%% data and validated against the %%checksum%%. 26544 */ 26545 constructor(locale, data, accent, checksum) { 26546 super(locale, data, checksum); 26547 this.#accent = accent; 26548 } 26549 /** 26550 * The OWLA-encoded accent data. 26551 */ 26552 get _accent() { 26553 return this.#accent; 26554 } 26555 /** 26556 * Decode all the words for the wordlist. 26557 */ 26558 _decodeWords() { 26559 return decodeOwlA(this._data, this._accent); 26560 } 26561}; 26562//#endregion 26563//#region node_modules/ethers/lib.esm/wordlists/wordlists-browser.js 26564var wordlists = { en: LangEn.wordlist() }; 26565//#endregion 26566//#region node_modules/ethers/lib.esm/ethers.js 26567var ethers_exports = /* @__PURE__ */ __exportAll({ 26568 AbiCoder: () => AbiCoder, 26569 AbstractProvider: () => AbstractProvider, 26570 AbstractSigner: () => AbstractSigner, 26571 AlchemyProvider: () => AlchemyProvider, 26572 AnkrProvider: () => AnkrProvider, 26573 BaseContract: () => BaseContract, 26574 BaseWallet: () => BaseWallet, 26575 Block: () => Block, 26576 BlockscoutProvider: () => BlockscoutProvider, 26577 BrowserProvider: () => BrowserProvider, 26578 ChainstackProvider: () => ChainstackProvider, 26579 CloudflareProvider: () => CloudflareProvider, 26580 ConstructorFragment: () => ConstructorFragment, 26581 Contract: () => Contract, 26582 ContractEventPayload: () => ContractEventPayload, 26583 ContractFactory: () => ContractFactory, 26584 ContractTransactionReceipt: () => ContractTransactionReceipt, 26585 ContractTransactionResponse: () => ContractTransactionResponse, 26586 ContractUnknownEventPayload: () => ContractUnknownEventPayload, 26587 EnsPlugin: () => EnsPlugin, 26588 EnsResolver: () => EnsResolver, 26589 ErrorDescription: () => ErrorDescription, 26590 ErrorFragment: () => ErrorFragment, 26591 EtherSymbol: () => "Î", 26592 EtherscanPlugin: () => EtherscanPlugin, 26593 EtherscanProvider: () => EtherscanProvider, 26594 EventFragment: () => EventFragment, 26595 EventLog: () => EventLog, 26596 EventPayload: () => EventPayload, 26597 FallbackFragment: () => FallbackFragment, 26598 FallbackProvider: () => FallbackProvider, 26599 FeeData: () => FeeData, 26600 FeeDataNetworkPlugin: () => FeeDataNetworkPlugin, 26601 FetchCancelSignal: () => FetchCancelSignal, 26602 FetchRequest: () => FetchRequest, 26603 FetchResponse: () => FetchResponse, 26604 FetchUrlFeeDataNetworkPlugin: () => FetchUrlFeeDataNetworkPlugin, 26605 FixedNumber: () => FixedNumber, 26606 Fragment: () => Fragment, 26607 FunctionFragment: () => FunctionFragment, 26608 GasCostPlugin: () => GasCostPlugin, 26609 HDNodeVoidWallet: () => HDNodeVoidWallet, 26610 HDNodeWallet: () => HDNodeWallet, 26611 Indexed: () => Indexed, 26612 InfuraProvider: () => InfuraProvider, 26613 InfuraWebSocketProvider: () => InfuraWebSocketProvider, 26614 Interface: () => Interface, 26615 IpcSocketProvider: () => void 0, 26616 JsonRpcApiProvider: () => JsonRpcApiProvider, 26617 JsonRpcProvider: () => JsonRpcProvider, 26618 JsonRpcSigner: () => JsonRpcSigner, 26619 LangEn: () => LangEn, 26620 Log: () => Log, 26621 LogDescription: () => LogDescription, 26622 MaxInt256: () => MaxInt256, 26623 MaxUint256: () => MaxUint256, 26624 MessagePrefix: () =>
26624 MessagePrefix, 26625 MinInt256: () => MinInt256, 26626 Mnemonic: () => Mnemonic, 26627 MulticoinProviderPlugin: () => MulticoinProviderPlugin, 26628 N: () => N, 26629 NamedFragment: () => NamedFragment, 26630 Network: () => Network, 26631 NetworkPlugin: () => NetworkPlugin, 26632 NonceManager: () => NonceManager, 26633 ParamType: () => ParamType, 26634 PocketProvider: () => PocketProvider, 26635 QuickNodeProvider: () => QuickNodeProvider, 26636 Result: () => Result, 26637 Signature: () => Signature, 26638 SigningKey: () => SigningKey, 26639 SocketBlockSubscriber: () => SocketBlockSubscriber, 26640 SocketEventSubscriber: () => SocketEventSubscriber, 26641 SocketPendingSubscriber: () => SocketPendingSubscriber, 26642 SocketProvider: () => SocketProvider, 26643 SocketSubscriber: () => SocketSubscriber, 26644 StructFragment: () => StructFragment, 26645 Transaction: () => Transaction, 26646 TransactionDescription: () => TransactionDescription, 26647 TransactionReceipt: () => TransactionReceipt, 26648 TransactionResponse: () => TransactionResponse, 26649 Typed: () => Typed, 26650 TypedDataEncoder: () => TypedDataEncoder, 26651 UndecodedEventLog: () => UndecodedEventLog, 26652 UnmanagedSubscriber: () => UnmanagedSubscriber, 26653 Utf8ErrorFuncs: () => Utf8ErrorFuncs, 26654 VoidSigner: () => VoidSigner, 26655 Wallet: () => Wallet, 26656 WebSocketProvider: () => WebSocketProvider, 26657 WeiPerEther: () => WeiPerEther, 26658 Wordlist: () => Wordlist, 26659 WordlistOwl: () => WordlistOwl, 26660 WordlistOwlA: () => WordlistOwlA, 26661 ZeroAddress: () => ZeroAddress, 26662 ZeroHash: () => ZeroHash, 26663 accessListify: () => accessListify, 26664 assert: () => assert, 26665 assertArgument: () => assertArgument, 26666 assertArgumentCount: () => assertArgumentCount, 26667 assertNormalize: () => assertNormalize, 26668 assertPrivate: () => assertPrivate, 26669 authorizationify: () => authorizationify, 26670 checkResultErrors: () => checkResultErrors, 26671 computeAddress: () => computeAddress, 26672 computeHmac: () => computeHmac, 26673 concat: () => concat, 26674 copyRequest: () => copyRequest, 26675 dataLength: () => dataLength, 26676 dataSlice: () => dataSlice, 26677 decodeBase58: () => decodeBase58, 26678 decodeBase64: () => decodeBase64, 26679 decodeBytes32String: () => decodeBytes32String, 26680 decodeRlp: () => decodeRlp, 26681 decryptCrowdsaleJson: () => decryptCrowdsaleJson, 26682 decryptKeystoreJson: () => decryptKeystoreJson, 26683 decryptKeystoreJsonSync: () => decryptKeystoreJsonSync, 26684 defaultPath: () => defaultPath, 26685 defineProperties: () => defineProperties, 26686 dnsEncode: () => dnsEncode, 26687 encodeBase58: () => encodeBase58, 26688 encodeBase64: () => encodeBase64, 26689 encodeBytes32String: () => encodeBytes32String, 26690 encodeRlp: () => encodeRlp, 26691 encryptKeystoreJson: () =>
26691 encryptKeystoreJson, 26692 encryptKeystoreJsonSync: () => encryptKeystoreJsonSync, 26693 ensNormalize: () => ensNormalize, 26694 formatEther: () => formatEther, 26695 formatUnits: () => formatUnits, 26696 fromTwos: () => fromTwos, 26697 getAccountPath: () => getAccountPath, 26698 getAddress: () => getAddress, 26699 getBigInt: () => getBigInt, 26700 getBytes: () => getBytes, 26701 getBytesCopy: () => getBytesCopy, 26702 getCreate2Address: () => getCreate2Address, 26703 getCreateAddress: () => getCreateAddress, 26704 getDefaultProvider: () => getDefaultProvider, 26705 getIcapAddress: () => getIcapAddress, 26706 getIndexedAccountPath: () => getIndexedAccountPath, 26707 getNumber: () => getNumber, 26708 getUint: () => getUint, 26709 hashAuthorization: () => hashAuthorization, 26710 hashMessage: () => hashMessage, 26711 hexlify: () => hexlify, 26712 id: () => id, 26713 isAddress: () => isAddress, 26714 isAddressable: () => isAddressable, 26715 isBytesLike: () => isBytesLike, 26716 isCallException: () => isCallException, 26717 isCrowdsaleJson: () => isCrowdsaleJson, 26718 isError: () => isError, 26719 isHexString: () => isHexString, 26720 isKeystoreJson: () => isKeystoreJson, 26721 isValidName: () => isValidName, 26722 keccak256: () => keccak256, 26723 lock: () => lock, 26724 makeError: () => makeError, 26725 mask: () => mask, 26726 namehash: () => namehash, 26727 parseEther: () => parseEther, 26728 parseUnits: () => parseUnits, 26729 pbkdf2: () => pbkdf2, 26730 randomBytes: () => randomBytes, 26731 recoverAddress: () => recoverAddress, 26732 resolveAddress: () => resolveAddress, 26733 resolveProperties: () => resolveProperties, 26734 ripemd160: () => ripemd160, 26735 scrypt: () => scrypt, 26736 scryptSync: () => scryptSync, 26737 sha256: () => sha256, 26738 sha512: () => sha512, 26739 showThrottleMessage: () => showThrottleMessage, 26740 solidityPacked: () => solidityPacked, 26741 solidityPackedKeccak256: () => solidityPackedKeccak256, 26742 solidityPackedSha256: () => solidityPackedSha256, 26743 stripZerosLeft: () => stripZerosLeft, 26744 toBeArray: () => toBeArray, 26745 toBeHex: () => toBeHex, 26746 toBigInt: () => toBigInt, 26747 toNumber: () => toNumber, 26748 toQuantity: () => toQuantity, 26749 toTwos: () => toTwos, 26750 toUtf8Bytes: () => toUtf8Bytes, 26751 toUtf8CodePoints: () => toUtf8CodePoints, 26752 toUtf8String: () => toUtf8String, 26753 uuidV4: () => uuidV4, 26754 verifyAuthorization: () => verifyAuthorization, 26755 verifyMessage: () => verifyMessage, 26756 verifyTypedData: () => verifyTypedData, 26757 version: () => version, 26758 wordlists: () => wordlists, 26759 zeroPadBytes: () => zeroPadBytes, 26760 zeroPadValue: () => zeroPadValue 26761}); 26762//#endregion 26763//#region node_modules/ethers/lib.esm/index.js 26764/** 26765* The Application Programming Interface (API) is the collection of 26766* functions, classes and types offered by the Ethers library. 26767* 26768* @_section: api:Application Programming Interface [about-api] 26769* @_navTitle: API 26770*/ 26771//#endregion 26772export { AbiCoder, AbstractProvider, AbstractSigner, AlchemyProvider, AnkrProvider, BaseContract, BaseWallet, Block, BlockscoutProvider, BrowserProvider, ChainstackProvider, CloudflareProvider, ConstructorFragment, Contract, ContractEventPayload, ContractFactory, ContractTransactionReceipt, ContractTransactionResponse, ContractUnknownEventPayload, EnsPlugin, EnsResolver, ErrorDescription, ErrorFragment, EtherSymbol, EtherscanPlugin, EtherscanProvider, EventFragment, EventLog, EventPayload, FallbackFragment, FallbackProvider, FeeData, FeeDataNetworkPlugin, FetchCancelSignal, FetchRequest, FetchResponse, FetchUrlFeeDataNetworkPlugin, FixedNumber, Fragment, FunctionFragment, GasCostPlugin, HDNodeVoidWallet, HDNodeWallet, Indexed, InfuraProvider, InfuraWebSocketProvider, Interface, IpcSocketProvider, JsonRpcApiProvider, JsonRpcProvider, JsonRpcSigner, LangEn, Log, LogDescription, MaxInt256, MaxUint256, MessagePrefix, MinInt256, Mnemonic, MulticoinProviderPlugin, N, NamedFragment, Network, NetworkPlugin, NonceManager, ParamType, PocketProvider, QuickNodeProvider, Result, Signature, SigningKey, SocketBlockSubscriber, SocketEventSubscriber, SocketPendingSubscriber, SocketProvider, SocketSubscriber, StructFragment, Transaction, TransactionDescription, TransactionReceipt, TransactionResponse, Typed, TypedDataEncoder, UndecodedEventLog, UnmanagedSubscriber, Utf8ErrorFuncs, VoidSigner, Wallet, WebSocketProvider, WeiPerEther, Wordlist, WordlistOwl, WordlistOwlA, ZeroAddress, ZeroHash, accessListify, assert, assertArgument, assertArgumentCount, assertNormalize, assertPrivate, authorizationify, checkResultErrors, computeAddress, computeHmac, concat, copyRequest, dataLength, dataSlice, decodeBase58, decodeBase64, decodeBytes32String, decodeRlp, decryptCrowdsaleJson, decryptKeystoreJson, decryptKeystoreJsonSync, defaultPath, defineProperties, dnsEncode, encodeBase58, encodeBase64, encodeBytes32String, encodeRlp, encryptKe
26772ystoreJson, encryptKeystoreJsonSync, ensNormalize, ethers_exports as ethers, formatEther, formatUnits, fromTwos, getAccountPath, getAddress, getBigInt, getBytes, getBytesCopy, getCreate2Address, getCreateAddress, getDefaultProvider, getIcapAddress, getIndexedAccountPath, getNumber, getUint, hashAuthorization, hashMessage, hexlify, id, isAddress, isAddressable, isBytesLike, isCallException, isCrowdsaleJson, isError, isHexString, isKeystoreJson, isValidName, keccak256, lock, makeError, mask, namehash, parseEther, parseUnits, pbkdf2, randomBytes, recoverAddress, resolveAddress, resolveProperties, ripemd160, scrypt, scryptSync, sha256, sha512, showThrottleMessage, solidityPacked, solidityPackedKeccak256, solidityPackedSha256, stripZerosLeft, toBeArray, toBeHex, toBigInt, toNumber, toQuantity, toTwos, toUtf8Bytes, toUtf8CodePoints, toUtf8String, uuidV4, verifyAuthorization, verifyMessage, verifyTypedData, version, wordlists, zeroPadBytes, zeroPadValue }; 26773 26774//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXRoZXJzLmpzIiwibmFtZXMiOlsic3RyaW5naWZ5IiwiQk5fMCIsIkJOXzEiLCJOaWJibGVzIiwiQk5fMCIsImxvY2tlZCIsImdldFRpbWUiLCJCTl8wIiwiQk5fMSIsIl9ndWFyZCIsIlplcm9zIiwicGFzc1Byb3BlcnRpZXMiLCJfZ3VhcmQiLCJnZXRWYWx1ZSIsImNyeXB0byIsInU4YSIsInV0ZjhUb0J5dGVzIiwiY29uY2F0Qnl0ZXMiLCJyYW5kb21CeXRlcyIsImNyeXB0byIsImhhc2giLCJoYXNoIiwicGJrZGYyIiwic2hhMjU2Iiwic3BsaXQiLCJzaGE1MTIiLCJnZXRHbG9iYWwiLCJzaGEyNTYiLCJzaGE1MTIiLCJwYmtkZjIiLCJyYW5kb21CeXRlcyIsImxvY2tlZCIsIl8wbiIsIl8xbiIsIl8ybiIsImxvY2tlZCIsInJvdGwiLCJyaXBlbWQxNjAiLCJsb2NrZWQiLCJub2JsZV9yaXBlbWQxNjAiLCJsb2NrZWQiLCJjcnlwdG9fcmFuZG9tIiwicGJrZGYyIiwic2hhMjU2Iiwic2NyeXB0IiwiX25vYmxlQXN5bmMiLCJfbm9ibGVTeW5jIiwiSCIsIl8wbiIsIl8xbiIsIl8ybiIsIl8wbiIsIl8xbiIsIl8ybiIsIl8zbiIsImdjZCIsIl8wbiIsIl8xbiIsInV0IiwiXzFuIiwidXQuY29uY2F0Qnl0ZXMiLCJ1dC5ieXRlc1RvSGV4IiwidXQuYnl0ZXNUb051bWJlckJFIiwibW9kLm1vZCIsIm1vZC5pbnZlcnQiLCJ1dC5udW1iZXJUb0J5dGVzQkUiLCJ1dC5oZXhUb0J5dGVzIiwibW9kLmdldE1pbkhhc2hMZW5ndGgiLCJtb2QubWFwSGFzaFRvRmllbGQiLCJ1dC5iaXRNYXNrIiwidXQuY3JlYXRlSG1hY0RyYmciLCJjb25jYXRCeXRlcyIsInNoYTI1NiIsIkJOXzAiLCJCTl8xIiwiQk5fMiIsIkJOXzI3IiwiQk5fMjgiLCJCTl8zNSIsImluc3BlY3QiLCJfZ3VhcmQiLCJCTl8wIiwiQk5fMCIsIkJOXzEiLCJCTl9NQVhfVUlOVDI1NiIsIkJOXzAiLCJCTl8yIiwiaW5zcGVjdCIsIlQxIiwiX2tlY2NhazI1NiIsIl9zaGEyNTYiLCJCTl8wIiwiQk5fMSIsIl9ndWFyZCIsImludGVybmFsIiwiUGFuaWNSZWFzb25zIiwiQk5fMCIsIkJOXzAiLCJpbnNwZWN0IiwicGFyc2VVbml0cyIsImNvcHkiLCJCTl8yIiwic3RhbGwiLCJpc1Byb21pc2UiLCJjb3B5IiwiZ2V0VGltZSIsImRlZmF1bHRPcHRpb25zIiwic3RhbGwiLCJkZWZhdWx0QXBpS2V5IiwiZ2V0SG9zdCIsImRlZmF1bHRBcGlLZXkiLCJnZXRIb3N0IiwiZ2V0SG9zdCIsImdldEhvc3QiLCJnZXRIb3N0Iiwic3RhbGwiLCJfZ3VhcmQiLCJfX2NsYXNzUHJpdmF0ZUZpZWxkR2V0IiwiX19jbGFzc1ByaXZhdGVGaWVsZFNldCIsIl9fY2xhc3NQcml2YXRlRmllbGRTZXQiLCJfX2NsYXNzUHJpdmF0ZUZpZWxkR2V0IiwienBhZCIsImRlZmF1bHRQYXRoIiwic3RhbGwiLCJ6cGFkIiwiTiJdLCJzb3VyY2VzIjpbIi4uLy4uL2V0aGVycy9saWIuZXNtL192ZXJzaW9uLmpzIiwiLi4vLi4vZXRoZXJzL2xpYi5lc20vdXRpbHMvcHJvcGVydGllcy5qcyIsIi4uLy4uL2V0aGVycy9saWIuZXNtL3V0aWxzL2Vycm9ycy5qcyIsIi4uLy4uL2V0aGVycy9saWIuZXNtL3V0aWxzL2RhdGEuanMiLCIuLi8uLi9ldGhlcnMvbGliLmVzbS91dGlscy9tYXRocy5qcyIsIi4uLy4uL2V0aGVycy9saWIuZXNtL3V0aWxzL2Jhc2U1OC5qcyIsIi4uLy4uL2V0aGVycy9saWIuZXNtL3V0aWxzL2Jhc2U2NC1icm93c2VyLmpzIiwiLi4vLi4vZXRoZXJzL2xpYi5lc20vdXRpbHMvZXZlbnRzLmpzIiwiLi4vLi4vZXRoZXJzL2xpYi5lc20vdXRpbHMvdXRmOC5qcyIsIi4uLy4uL2V0aGVycy9saWIuZXNtL3V0aWxzL2dldHVybC1icm93c2VyLmpzIiwiLi4vLi4vZXRoZXJzL2xpYi5lc20vdXRpbHMvZmV0Y2guanMiLCIuLi8uLi9ldGhlcnMvbGliLmVzbS91dGlscy9maXhlZG51bWJlci5qcyIsIi4uLy4uL2V0aGVycy9saWIuZXNtL3V0aWxzL3JscC1kZWNvZGUuanMiLCIuLi8uLi9ldGhlcnMvbGliLmVzbS91dGlscy9ybHAtZW5jb2RlLmpzIiwiLi4vLi4vZXRoZXJzL2xpYi5lc20vdXRpbHMvdW5pdHMuanMiLCIuLi8uLi9ldGhlcnMvbGliLmVzbS91dGlscy91dWlkLmpzIiwiLi4vLi4vZXRoZXJzL2xpYi5lc20vYWJpL2NvZGVycy9hYnN0cmFjdC1jb2Rlci5qcyIsIi4uLy4uL0Bub2JsZS9oYXNoZXMvZXNtL19hc3NlcnQuanMiLCIuLi8uLi9Abm9ibGUvaGFzaGVzL2VzbS9jcnlwdG8uanMiLCIuLi8uLi9Abm9ibGUvaGFzaGVzL2VzbS91dGlscy5qcyIsIi4uLy4uL0Bub2JsZS9oYXNoZXMvZXNtL2htYWMuanMiLCIuLi8uLi9Abm9ibGUvaGFzaGVzL2VzbS9wYmtkZjIuanMiLCIuLi8uLi9Abm9ibGUvaGFzaGVzL2VzbS9fc2hhMi5qcyIsIi4uLy4uL0Bub2JsZS9oYXNoZXMvZXNtL3NoYTI1Ni5qcyIsIi4uLy4uL0Bub2JsZS9oYXNoZXMvZXNtL191NjQuanMiLCIuLi8uLi9Abm9ibGUvaGFzaGVzL2VzbS9zaGE1MTIuanMiLCIuLi8uLi9ldGhlcnMvbGliLmVzbS9jcnlwdG8vY3J5cHRvLWJyb3dzZXIuanMiLCIuLi8uLi9ldGhlcnMvbGliLmVzbS9jcnlwdG8vaG1hYy5qcyIsIi4uLy4uL0Bub2JsZS9oYXNoZXMvZXNtL3NoYTMuanMiLCIuLi8uLi9ldGhlcnMvbGliLmVzbS9jcnlwdG8va2VjY2FrLmpzIiwiLi4vLi4vQG5vYmxlL2hhc2hlcy9lc20vcmlwZW1kMTYwLmpzIiwiLi4vLi4vZXRoZXJzL2xpYi5lc20vY3J5cHRvL3JpcGVtZDE2MC5qcyIsIi4uLy4uL2V0aGVycy9saWIuZXNtL2NyeXB0by9wYmtkZjIuanMiLCIuLi8uLi9ldGhlcnMvbGliLmVzbS9jcnlwdG8vcmFuZG9tLmpzIiwiLi4vLi4vQG5vYmxlL2hhc2hlcy9lc20vc2NyeXB0LmpzIiwiLi4vLi4vZXRoZXJzL2xpYi5lc20vY3J5cHRvL3NjcnlwdC5qcyIsIi4uLy4uL2V0aGVycy9saWIuZXNtL2NyeXB0by9zaGEyLmpzIiwiLi4vLi4vQG5vYmxlL2N1cnZlcy9lc20vYWJzd
26774HJhY3QvdXRpbHMuanMiLCIuLi8uLi9Abm9ibGUvY3VydmVzL2VzbS9hYnN0cmFjdC9tb2R1bGFyLmpzIiwiLi4vLi4vQG5vYmxlL2N1cnZlcy9lc20vYWJzdHJhY3QvY3VydmUuanMiLCIuLi8uLi9Abm9ibGUvY3VydmVzL2VzbS9hYnN0cmFjdC93ZWllcnN0cmFzcy5qcyIsIi4uLy4uL0Bub2JsZS9jdXJ2ZXMvZXNtL19zaG9ydHdfdXRpbHMuanMiLCIuLi8uLi9Abm9ibGUvY3VydmVzL2VzbS9zZWNwMjU2azEuanMiLCIuLi8uLi9ldGhlcnMvbGliLmVzbS9jb25zdGFudHMvYWRkcmVzc2VzLmpzIiwiLi4vLi4vZXRoZXJzL2xpYi5lc20vY29uc3RhbnRzL2hhc2hlcy5qcyIsIi4uLy4uL2V0aGVycy9saWIuZXNtL2NvbnN0YW50cy9udW1iZXJzLmpzIiwiLi4vLi4vZXRoZXJzL2xpYi5lc20vY29uc3RhbnRzL3N0cmluZ3MuanMiLCIuLi8uLi9ldGhlcnMvbGliLmVzbS9jcnlwdG8vc2lnbmF0dXJlLmpzIiwiLi4vLi4vZXRoZXJzL2xpYi5lc20vY3J5cHRvL3NpZ25pbmcta2V5LmpzIiwiLi4vLi4vZXRoZXJzL2xpYi5lc20vY3J5cHRvL2luZGV4LmpzIiwiLi4vLi4vZXRoZXJzL2xpYi5lc20vYWRkcmVzcy9hZGRyZXNzLmpzIiwiLi4vLi4vZXRoZXJzL2xpYi5lc20vYWRkcmVzcy9jb250cmFjdC1hZGRyZXNzLmpzIiwiLi4vLi4vZXRoZXJzL2xpYi5lc20vYWRkcmVzcy9jaGVja3MuanMiLCIuLi8uLi9ldGhlcnMvbGliLmVzbS9hYmkvdHlwZWQuanMiLCIuLi8uLi9ldGhlcnMvbGliLmVzbS9hYmkvY29kZXJzL2FkZHJlc3MuanMiLCIuLi8uLi9ldGhlcnMvbGliLmVzbS9hYmkvY29kZXJzL2Fub255bW91cy5qcyIsIi4uLy4uL2V0aGVycy9saWIuZXNtL2FiaS9jb2RlcnMvYXJyYXkuanMiLCIuLi8uLi9ldGhlcnMvbGliLmVzbS9hYmkvY29kZXJzL2Jvb2xlYW4uanMiLCIuLi8uLi9ldGhlcnMvbGliLmVzbS9hYmkvY29kZXJzL2J5dGVzLmpzIiwiLi4vLi4vZXRoZXJzL2xpYi5lc20vYWJpL2NvZGVycy9maXhlZC1ieXRlcy5qcyIsIi4uLy4uL2V0aGVycy9saWIuZXNtL2FiaS9jb2RlcnMvbnVsbC5qcyIsIi4uLy4uL2V0aGVycy9saWIuZXNtL2FiaS9jb2RlcnMvbnVtYmVyLmpzIiwiLi4vLi4vZXRoZXJzL2xpYi5lc20vYWJpL2NvZGVycy9zdHJpbmcuanMiLCIuLi8uLi9ldGhlcnMvbGliLmVzbS9hYmkvY29kZXJzL3R1cGxlLmpzIiwiLi4vLi4vZXRoZXJzL2xpYi5lc20vdHJhbnNhY3Rpb24vYWNjZXNzbGlzdC5qcyIsIi4uLy4uL2V0aGVycy9saWIuZXNtL3RyYW5zYWN0aW9uL2F1dGhvcml6YXRpb24uanMiLCIuLi8uLi9ldGhlcnMvbGliLmVzbS90cmFuc2FjdGlvbi9hZGRyZXNzLmpzIiwiLi4vLi4vZXRoZXJzL2xpYi5lc20vdHJhbnNhY3Rpb24vdHJhbnNhY3Rpb24uanMiLCIuLi8uLi9ldGhlcnMvbGliLmVzbS9oYXNoL2F1dGhvcml6YXRpb24uanMiLCIuLi8uLi9ldGhlcnMvbGliLmVzbS9oYXNoL2lkLmpzIiwiLi4vLi4vQGFkcmFmZnkvZW5zLW5vcm1hbGl6ZS9kaXN0L2luZGV4Lm1qcyIsIi4uLy4uL2V0aGVycy9saWIuZXNtL2hhc2gvbmFtZWhhc2guanMiLCIuLi8uLi9ldGhlcnMvbGliLmVzbS9oYXNoL21lc3NhZ2UuanMiLCIuLi8uLi9ldGhlcnMvbGliLmVzbS9oYXNoL3NvbGlkaXR5LmpzIiwiLi4vLi4vZXRoZXJzL2xpYi5lc20vaGFzaC90eXBlZC1kYXRhLmpzIiwiLi4vLi4vZXRoZXJzL2xpYi5lc20vYWJpL2ZyYWdtZW50cy5qcyIsIi4uLy4uL2V0aGVycy9saWIuZXNtL2FiaS9hYmktY29kZXIuanMiLCIuLi8uLi9ldGhlcnMvbGliLmVzbS9hYmkvYnl0ZXMzMi5qcyIsIi4uLy4uL2V0aGVycy9saWIuZXNtL2FiaS9pbnRlcmZhY2UuanMiLCIuLi8uLi9ldGhlcnMvbGliLmVzbS9wcm92aWRlcnMvcHJvdmlkZXIuanMiLCIuLi8uLi9ldGhlcnMvbGliLmVzbS9jb250cmFjdC93cmFwcGVycy5qcyIsIi4uLy4uL2V0aGVycy9saWIuZXNtL2NvbnRyYWN0L2NvbnRyYWN0LmpzIiwiLi4vLi4vZXRoZXJzL2xpYi5lc20vY29udHJhY3QvZmFjdG9yeS5qcyIsIi4uLy4uL2V0aGVycy9saWIuZXNtL3Byb3ZpZGVycy9lbnMtcmVzb2x2ZXIuanMiLCIuLi8uLi9ldGhlcnMvbGliLmVzbS9wcm92aWRlcnMvZm9ybWF0LmpzIiwiLi4vLi4vZXRoZXJzL2xpYi5lc20vcHJvdmlkZXJzL3BsdWdpbnMtbmV0d29yay5qcyIsIi4uLy4uL2V0aGVycy9saWIuZXNtL3Byb3ZpZGVycy9uZXR3b3JrLmpzIiwiLi4vLi4vZXRoZXJzL2xpYi5lc20vcHJvdmlkZXJzL3N1YnNjcmliZXItcG9sbGluZy5qcyIsIi4uLy4uL2V0aGVycy9saWIuZXNtL3Byb3ZpZGVycy9hYnN0cmFjdC1wcm92aWRlci5qcyIsIi4uLy4uL2V0aGVycy9saWIuZXNtL3Byb3ZpZGVycy9hYnN0cmFjdC1zaWduZXIuanMiLCIuLi8uLi9ldGhlcnMvbGliLmVzbS9wcm92aWRlcnMvY29tbXVuaXR5LmpzIiwiLi4vLi4vZXRoZXJzL2xpYi5lc20vcHJvdmlkZXJzL3N1YnNjcmliZXItZmlsdGVyaWQuanMiLCIuLi8uLi9ldGhlcnMvbGliLmVzbS9wcm92aWRlcnMvcHJvdmlkZXItanNvbnJwYy5qcyIsIi4uLy4uL2V0aGVycy9saWIuZXNtL3Byb3ZpZGVycy9wcm92aWRlci1hbmtyLmpzIiwiLi4vLi4vZXRoZXJzL2xpYi5lc20vcHJvdmlkZXJzL3Byb3ZpZGVyLWFsY2hlbXkuanMiLCIuLi8uLi9ldGhlcnMvbGliLmVzbS9wcm92aWRlcnMvcHJvdmlkZXItY2hhaW5zdGFjay5qcyIsIi4uLy4uL2V0aGVycy9saWIuZXNtL3Byb3ZpZGVycy9wcm92aWRlci1jbG91ZGZsYXJlLmpzIiwiLi4vLi4vZXRoZXJzL2xpYi5lc20vcHJvdmlkZXJzL3Byb3ZpZGVyLWV0aGVyc2Nhbi5qcyIsIi4uLy4uL2V0aGVycy9saWIuZXNtL3Byb3ZpZGVycy93cy1icm93c2VyLmpzIiwiLi4vLi4vZXRoZXJzL2xpYi5lc20vcHJvdmlkZXJzL3Byb3ZpZGVyLXNvY2tldC5qcyIsIi4uLy4uL2V0aGVycy9saWIuZXNtL3Byb3ZpZGVycy9wcm92aWRlci13ZWJzb2NrZXQuanMiLCIuLi8uLi9ldGhlcnMvbGliLmVzbS9wcm92aWRlcnMvcHJvdmlkZXItaW5mdXJhLmpzIiwiLi4vLi4vZXRoZXJzL2xpYi5lc20vcHJvdmlkZXJzL3Byb3ZpZGVyLXF1aWNrbm9kZS5qcyIsIi4uLy4uL2V0aGVycy9saWIuZXNtL3Byb3ZpZGVycy9wcm92aWRlci1mYWxsYmFjay5qcyIsIi4uLy4uL2V0aGVycy9saWIuZXNtL3Byb3ZpZGVycy9kZWZhdWx0LXByb3ZpZGVyLmpzIiwiLi4vLi4vZXRoZXJzL2xpYi5lc20vcHJvdmlkZXJzL3NpZ25lci1ub25jZW1hbmFnZXIuanMiLCIuLi8uLi9ldGhlcnMvbGliLmVzbS9wcm92aWRlcnMvcHJvdmlkZXItYnJvd3Nlci5qcyIsIi4uLy4uL2V0aGVycy9saWIuZXNtL3Byb3ZpZGVycy9wcm92aWRlci1ibG9ja3Njb3V0LmpzIiwiLi4vLi4vZXRoZXJzL2xpYi5lc20vcHJvdmlkZXJzL3Byb3ZpZGVyLXBvY2tldC5qcyIsIi4uLy4uL2V0aGVycy9saWIuZXNtL3Byb3ZpZGVycy9wcm92aWRlci1pcGNzb2NrZXQtYnJvd3Nlci5qcyIsIi4uLy4uL2V0aGVycy9saWIuZXNtL3dhbGxldC9iYXNlLXdhbGxldC5qcyIsIi4uLy4uL2V0aGVycy9saWIuZXNtL3dvcmRsaXN0cy9kZWNvZGUtb3dsLmpzIiwiLi4vLi4vZXRoZXJzL2xpYi5lc20vd29yZGxpc3RzL3dvcmRsaXN0LmpzIiwiLi4vLi4vZXRoZXJzL2xpYi5lc20vd29yZGxpc3RzL3dvcmRsaXN0LW93bC5qcyIsIi4uLy4uL2V0aGVycy9saWIuZXNtL3dvcmRsaXN0cy9sYW5nLWVuLmpzIiwiLi4vLi4vZXRoZXJzL2xpYi5lc20vd2FsbGV0L21uZW1vbmljLmpzIiwiLi4vLi4vYWVzLWpzL2xpYi5lc20vYWVzLmpzIiwiLi4vLi4vYWVzLWpzL2xpYi5lc20vbW9kZS5qcyIsIi4uLy4uL2Flcy1qcy9saWIuZXNtL21vZGUtY2JjLmpzIiwiLi4vLi4vYWVzLWpzL2xpYi5lc20vbW9kZS1jdHIuanMiLCIuLi8uLi9hZXMtanMvbGliLmVzbS9wYWRkaW5nLmpzIiwiLi4vLi4vZXRoZXJzL2xpYi5lc20vd2FsbGV0L3V0aWxzLmpzIiwiLi4vLi4vZXRoZXJzL2xpYi5lc20vd2FsbGV0L2pzb24ta2V5c3RvcmUuanMiLCIuLi8uLi9ldGhlcnMvbGliLmVzbS93YWxsZXQvaGR3YWxsZXQuanMiLCIuLi8uLi9ldGhlcnMvbGliLmVzbS93YWxsZXQvanNvbi1jcm93ZHNhbGUuanMiLCIuLi8uLi9ldGhlcnMvbGliLmVzbS93YWxsZXQvd2FsbGV0LmpzIiwiLi4vLi4vZXRoZXJzL2xpYi5lc20vd29yZGxpc3RzL2JpdC1yZWFkZXIuanMiLCIuLi8uLi9ldGhlcnMvbGliLmVzbS93b3JkbGlzdHMvZGVjb2RlLW93bGEuanMiLCIuLi8uLi9ldGhlcnMvbGliLmVzbS93b3JkbGlzdHMvd29yZGxpc3Qtb3dsYS5qcyIsIi4uLy4uL2V0aGVycy9saWIuZXNtL3dvcmRsaXN0cy93b3JkbGlzdHMtYnJvd3Nlci5qcyIsIi4uLy4uL2V0aGVycy9saWIuZXNtL2V0aGVycy5qcyIsIi4uLy4uL2V0aGVycy9saWIuZXNtL2luZGV4LmpzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qIERvIE5PVCBtb2RpZnkgdGhpcyBmaWxlOyBzZWUgL3NyYy50cy9fYWRtaW4vdXBkYXRlLXZlcnNpb24udHMgKi9cbi8qKlxuICogIFRoZSBjdXJyZW50IHZlcnNpb24gb2YgRXRoZXJzLlxuICovXG5leHBvcnQgY29uc3QgdmVyc2lvbiA9I
26774FwiNi4xNy4wXCI7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1fdmVyc2lvbi5qcy5tYXAiLCIvKipcbiAqICBQcm9wZXJ0eSBoZWxwZXIgZnVuY3Rpb25zLlxuICpcbiAqICBAX3N1YnNlY3Rpb24gYXBpL3V0aWxzOlByb3BlcnRpZXMgIFthYm91dC1wcm9wZXJ0aWVzXVxuICovXG5mdW5jdGlvbiBjaGVja1R5cGUodmFsdWUsIHR5cGUsIG5hbWUpIHtcbiAgICBjb25zdCB0eXBlcyA9IHR5cGUuc3BsaXQoXCJ8XCIpLm1hcCh0ID0+IHQudHJpbSgpKTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHR5cGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHN3aXRjaCAodHlwZSkge1xuICAgICAgICAgICAgY2FzZSBcImFueVwiOlxuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIGNhc2UgXCJiaWdpbnRcIjpcbiAgICAgICAgICAgIGNhc2UgXCJib29sZWFuXCI6XG4gICAgICAgICAgICBjYXNlIFwibnVtYmVyXCI6XG4gICAgICAgICAgICBjYXNlIFwic3RyaW5nXCI6XG4gICAgICAgICAgICAgICAgaWYgKHR5cGVvZiAodmFsdWUpID09PSB0eXBlKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgY29uc3QgZXJyb3IgPSBuZXcgRXJyb3IoYGludmFsaWQgdmFsdWUgZm9yIHR5cGUgJHt0eXBlfWApO1xuICAgIGVycm9yLmNvZGUgPSBcIklOVkFMSURfQVJHVU1FTlRcIjtcbiAgICBlcnJvci5hcmd1bWVudCA9IGB2YWx1ZS4ke25hbWV9YDtcbiAgICBlcnJvci52YWx1ZSA9IHZhbHVlO1xuICAgIHRocm93IGVycm9yO1xufVxuLyoqXG4gKiAgUmVzb2x2ZXMgdG8gYSBuZXcgb2JqZWN0IHRoYXQgaXMgYSBjb3B5IG9mICUldmFsdWUlJSwgYnV0IHdpdGggYWxsXG4gKiAgdmFsdWVzIHJlc29sdmVkLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcmVzb2x2ZVByb3BlcnRpZXModmFsdWUpIHtcbiAgICBjb25zdCBrZXlzID0gT2JqZWN0LmtleXModmFsdWUpO1xuICAgIGNvbnN0IHJlc3VsdHMgPSBhd2FpdCBQcm9taXNlLmFsbChrZXlzLm1hcCgoaykgPT4gUHJvbWlzZS5yZXNvbHZlKHZhbHVlW2tdKSkpO1xuICAgIHJldHVybiByZXN1bHRzLnJlZHVjZSgoYWNjdW0sIHYsIGluZGV4KSA9PiB7XG4gICAgICAgIGFjY3VtW2tleXNbaW5kZXhdXSA9IHY7XG4gICAgICAgIHJldHVybiBhY2N1bTtcbiAgICB9LCB7fSk7XG59XG4vKipcbiAqICBBc3NpZ25zIHRoZSAlJXZhbHVlcyUlIHRvICUldGFyZ2V0JSUgYXMgcmVhZC1vbmx5IHZhbHVlcy5cbiAqXG4gKiAgSXQgJSV0eXBlcyUlIGlzIHNwZWNpZmllZCwgdGhlIHZhbHVlcyBhcmUgY2hlY2tlZC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGRlZmluZVByb3BlcnRpZXModGFyZ2V0LCB2YWx1ZXMsIHR5cGVzKSB7XG4gICAgZm9yIChsZXQga2V5IGluIHZhbHVlcykge1xuICAgICAgICBsZXQgdmFsdWUgPSB2YWx1ZXNba2V5XTtcbiAgICAgICAgY29uc3QgdHlwZSA9ICh0eXBlcyA/IHR5cGVzW2tleV0gOiBudWxsKTtcbiAgICAgICAgaWYgKHR5cGUpIHtcbiAgICAgICAgICAgIGNoZWNrVHlwZSh2YWx1ZSwgdHlwZSwga2V5KTtcbiAgICAgICAgfVxuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBrZXksIHsgZW51bWVyYWJsZTogdHJ1ZSwgdmFsdWUsIHdyaXRhYmxlOiBmYWxzZSB9KTtcbiAgICB9XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1wcm9wZXJ0aWVzLmpzLm1hcCIsIi8qKlxuICogIEFsbCBlcnJvcnMgaW4gZXRoZXJzIGluY2x1ZGUgcHJv
26774cGVydGllcyB0byBlbnN1cmUgdGhleSBhcmUgYm90aFxuICogIGh1bWFuLXJlYWRhYmxlIChpLmUuIGBgLm1lc3NhZ2VgYCkgYW5kIG1hY2hpbmUtcmVhZGFibGUgKGkuZS4gYGAuY29kZWBgKS5cbiAqXG4gKiAgVGhlIFtbaXNFcnJvcl1dIGZ1bmN0aW9uIGNhbiBiZSB1c2VkIHRvIGNoZWNrIHRoZSBlcnJvciBgYGNvZGVgYCBhbmRcbiAqICBwcm92aWRlIGEgdHlwZSBndWFyZCBmb3IgdGhlIHByb3BlcnRpZXMgcHJlc2VudCBvbiB0aGF0IGVycm9yIGludGVyZmFjZS5cbiAqXG4gKiAgQF9zZWN0aW9uOiBhcGkvdXRpbHMvZXJyb3JzOkVycm9ycyAgW2Fib3V0LWVycm9yc11cbiAqL1xuaW1wb3J0IHsgdmVyc2lvbiB9IGZyb20gXCIuLi9fdmVyc2lvbi5qc1wiO1xuaW1wb3J0IHsgZGVmaW5lUHJvcGVydGllcyB9IGZyb20gXCIuL3Byb3BlcnRpZXMuanNcIjtcbmZ1bmN0aW9uIHN0cmluZ2lmeSh2YWx1ZSwgc2Vlbikge1xuICAgIGlmICh2YWx1ZSA9PSBudWxsKSB7XG4gICAgICAgIHJldHVybiBcIm51bGxcIjtcbiAgICB9XG4gICAgaWYgKHNlZW4gPT0gbnVsbCkge1xuICAgICAgICBzZWVuID0gbmV3IFNldCgpO1xuICAgIH1cbiAgICBpZiAodHlwZW9mICh2YWx1ZSkgPT09IFwib2JqZWN0XCIpIHtcbiAgICAgICAgaWYgKHNlZW4uaGFzKHZhbHVlKSkge1xuICAgICAgICAgICAgcmV0dXJuIFwiW0NpcmN1bGFyXVwiO1xuICAgICAgICB9XG4gICAgICAgIHNlZW4uYWRkKHZhbHVlKTtcbiAgICB9XG4gICAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG4gICAgICAgIHJldHVybiBcIlsgXCIgKyAodmFsdWUubWFwKCh2KSA9PiBzdHJpbmdpZnkodiwgc2VlbikpKS5qb2luKFwiLCBcIikgKyBcIiBdXCI7XG4gICAgfVxuICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIFVpbnQ4QXJyYXkpIHtcbiAgICAgICAgY29uc3QgSEVYID0gXCIwMTIzNDU2Nzg5YWJjZGVmXCI7XG4gICAgICAgIGxldCByZXN1bHQgPSBcIjB4XCI7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdmFsdWUubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIHJlc3VsdCArPSBIRVhbdmFsdWVbaV0gPj4gNF07XG4gICAgICAgICAgICByZXN1bHQgKz0gSEVYW3ZhbHVlW2ldICYgMHhmXTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbiAgICBpZiAodHlwZW9mICh2YWx1ZSkgPT09IFwib2JqZWN0XCIgJiYgdHlwZW9mICh2YWx1ZS50b0pTT04pID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgcmV0dXJuIHN0cmluZ2lmeSh2YWx1ZS50b0pTT04oKSwgc2Vlbik7XG4gICAgfVxuICAgIHN3aXRjaCAodHlwZW9mICh2YWx1ZSkpIHtcbiAgICAgICAgY2FzZSBcImJvb2xlYW5cIjpcbiAgICAgICAgY2FzZSBcIm51bWJlclwiOlxuICAgICAgICBjYXNlIFwic3ltYm9sXCI6XG4gICAgICAgICAgICByZXR1cm4gdmFsdWUudG9TdHJpbmcoKTtcbiAgICAgICAgY2FzZSBcImJpZ2ludFwiOlxuICAgICAgICAgICAgcmV0dXJuIEJpZ0ludCh2YWx1ZSkudG9TdHJpbmcoKTtcbiAgICAgICAgY2FzZSBcInN0cmluZ1wiOlxuICAgICAgICAgICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KHZhbHVlKTtcbiAgICAgICAgY2FzZSBcIm9iamVjdFwiOiB7XG4gICAgICAgICAgICBjb25zdCBrZXlzID0gT2JqZWN0LmtleXModmFsdWUpO1xuICAgICAgICAgICAga2V5cy5zb3J0KCk7XG4gICAgICAgICAgICByZXR1cm4gXCJ7IFwiICsga2V5cy5tYXAoKGspID0+IGAke3N0cmluZ2lmeShrLCBzZWVuKX06ICR7c3RyaW5naWZ5KHZhbHVlW2tdLCBzZWVuKX1gKS5qb2luKFwiLCBcIikgKyBcIiB9XCI7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGBbIENPVUxEIE5PVCBTRVJJQUxJWkUgXWA7XG59XG4vKipcbiAqICBSZXR1cm5zIHRydWUgaWYgdGhlICUlZXJyb3IlJSBtYXRjaGVzIGFuIGVycm9yIHRocm93biBieSBldGhlcnNcbiAqICB0aGF0IG1hdGNoZXMgdGhlIGVycm9yICUlY29kZSUlLlxuICpcbiAqICBJbiBUeXBlU2NyaXB0IGVudmlyb25tZW50cywgdGhpcyBjYW4gYmUgdXNlZCB0byBjaGVjayB0aGF0ICUlZXJyb3IlJVxuICogIG1hdGNoZXMgYW4gRXRoZXJzRXJyb3IgdHlwZSwgd2hpY2ggbWVhbnMgdGhlIGV4cGVjdGVkIHByb3BlcnRpZXMgd2lsbFxuICogIGJlIHNldC5cbiAqXG4gKiAgQFNlZSBbRXJyb3JDb2Rlc10oYXBpOkVycm9yQ29kZSlcbiAqICBAZXhhbXBsZVxuICogICAgdHJ5IHtcbiAqICAgICAgLy8gY29
26774kZS4uLi5cbiAqICAgIH0gY2F0Y2ggKGUpIHtcbiAqICAgICAgaWYgKGlzRXJyb3IoZSwgXCJDQUxMX0VYQ0VQVElPTlwiKSkge1xuICogICAgICAgICAgLy8gVGhlIFR5cGUgR3VhcmQgaGFzIHZhbGlkYXRlZCB0aGlzIG9iamVjdFxuICogICAgICAgICAgY29uc29sZS5sb2coZS5kYXRhKTtcbiAqICAgICAgfVxuICogICAgfVxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNFcnJvcihlcnJvciwgY29kZSkge1xuICAgIHJldHVybiAoZXJyb3IgJiYgZXJyb3IuY29kZSA9PT0gY29kZSk7XG59XG4vKipcbiAqICBSZXR1cm5zIHRydWUgaWYgJSVlcnJvciUlIGlzIGEgW1tDYWxsRXhjZXB0aW9uRXJyb3JdLlxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNDYWxsRXhjZXB0aW9uKGVycm9yKSB7XG4gICAgcmV0dXJuIGlzRXJyb3IoZXJyb3IsIFwiQ0FMTF9FWENFUFRJT05cIik7XG59XG4vKipcbiAqICBSZXR1cm5zIGEgbmV3IEVycm9yIGNvbmZpZ3VyZWQgdG8gdGhlIGZvcm1hdCBldGhlcnMgZW1pdHMgZXJyb3JzLCB3aXRoXG4gKiAgdGhlICUlbWVzc2FnZSUlLCBbW2FwaTpFcnJvckNvZGVdXSAlJWNvZGUlJSBhbmQgYWRkaXRpb25hbCBwcm9wZXJ0aWVzXG4gKiAgZm9yIHRoZSBjb3JyZXNwb25kaW5nIEV0aGVyc0Vycm9yLlxuICpcbiAqICBFYWNoIGVycm9yIGluIGV0aGVycyBpbmNsdWRlcyB0aGUgdmVyc2lvbiBvZiBldGhlcnMsIGFcbiAqICBtYWNoaW5lLXJlYWRhYmxlIFtbRXJyb3JDb2RlXV0sIGFuZCBkZXBlbmRpbmcgb24gJSVjb2RlJSUsIGFkZGl0aW9uYWxcbiAqICByZXF1aXJlZCBwcm9wZXJ0aWVzLiBUaGUgZXJyb3IgbWVzc2FnZSB3aWxsIGFsc28gaW5jbHVkZSB0aGUgJSVtZXNzYWdlJSUsXG4gKiAgZXRoZXJzIHZlcnNpb24sICUlY29kZSUlIGFuZCBhbGwgYWRkaXRpb25hbCBwcm9wZXJ0aWVzLCBzZXJpYWxpemVkLlxuICovXG5leHBvcnQgZnVuY3Rpb24gbWFrZUVycm9yKG1lc3NhZ2UsIGNvZGUsIGluZm8pIHtcbiAgICBsZXQgc2hvcnRNZXNzYWdlID0gbWVzc2FnZTtcbiAgICB7XG4gICAgICAgIGNvbnN0IGRldGFpbHMgPSBbXTtcbiAgICAgICAgaWYgKGluZm8pIHtcbiAgICAgICAgICAgIGlmIChcIm1lc3NhZ2VcIiBpbiBpbmZvIHx8IFwiY29kZVwiIGluIGluZm8gfHwgXCJuYW1lXCIgaW4gaW5mbykge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgdmFsdWUgd2lsbCBvdmVyd3JpdGUgcG9wdWxhdGVkIHZhbHVlczogJHtzdHJpbmdpZnkoaW5mbyl9YCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGtleSBpbiBpbmZvKSB7XG4gICAgICAgICAgICAgICAgaWYgKGtleSA9PT0gXCJzaG9ydE1lc3NhZ2VcIikge1xuICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY29uc3QgdmFsdWUgPSAoaW5mb1trZXldKTtcbiAgICAgICAgICAgICAgICAvLyAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGRldGFpbHMucHVzaChrZXkgKyBcIj1cIiArIHN0cmluZ2lmeSh2YWx1ZSkpO1xuICAgICAgICAgICAgICAgIC8vICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGVycm9yOiBhbnkpIHtcbiAgICAgICAgICAgICAgICAvLyAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhcIk1NTVwiLCBlcnJvci5tZXNzYWdlKTtcbiAgICAgICAgICAgICAgICAvLyAgICAgICAgICAgICAgICAgICAgZGV0YWlscy5wdXNoKGtleSArIFwiPVtjb3VsZCBub3Qgc2VyaWFsaXplIG9iamVjdF1cIik7XG4gICAgICAgICAgICAgICAgLy8gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGRldGFpbHMucHVzaChgY29kZT0ke2NvZGV9YCk7XG4gICAgICAgIGRldGFpbHMucHVzaChgdmVyc2lvbj0ke3ZlcnNpb259YCk7XG4gICAgICAgIGlmIChkZXRhaWxzLmxlbmd0aCkge1xuICAgICAgICAgICAgbWVzc2FnZSArPSBcIiAoXCIgKyBkZXRhaWxzLmpvaW4oXCIsIFwiKSArIFwiKVwiO1xuICAgICAgICB9XG4gICAgfVxuICAgIGxldCBlcnJvcjtcbiAgICBzd2l0Y2ggKGNvZGUpIHtcbiAgICAgICAgY2FzZSBcIklOVkFMSURfQVJHVU1FTlRcIjpcbiAgICAgICAgICAgIGVycm9yID0gbmV3IFR5cGVFcnJvcihtZXNzYWdlKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIFwiTlVNRVJJQ19GQVVMVFwiOlxuICAgICAgICBjYXNlIFwiQlVGRkVSX09WRVJSVU5cIjpcbiAgICAgICAgICAgIGVycm9yID0gbmV3IFJhbmdlRXJyb3IobWVzc2FnZSk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgIGVycm9yID0gbmV3IEVycm9yKG1lc3NhZ2UpO1xuICAgIH1cbiAgICBkZWZpbmVQcm9wZXJ0aWVzKGVycm9yLCB7IGNvZGUgfSk7XG4gICAgaWYgKGluZm8pIHtcbiAgICAgICAgT2JqZWN0LmFzc2lnbihlcnJvciwgaW5mbyk7XG4gICAgfVxuICAgIGlmIChlcnJvci5zaG9ydE1lc3NhZ2UgPT0gbnVsbCkge1xuICAgICAgICBkZWZpbmVQcm9wZXJ0aWVzKGVycm9yLCB7IHNob3J0TWVzc2FnZSB9KTtcbiAgICB9XG4gICAgcmV0dXJuIGVycm9yO1xufVxuLyoqXG4gKiAgVGhyb3dzIGFuIEV0aGVyc0Vycm9yIHdpdGggJSVtZXNzYWdlJSUsICUlY29kZSUlIGFuZCBhZGRpdGlvbmFsIGVycm9yXG4gKiAgJSVpbmZvJSUgd2hlbiAlJWNoZWNrJSUgaXMgZmFsc2lzaC4uXG4gKlxuICogIEBzZWUgW1thcGk6bWFrZUVycm9yXV1cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGFzc2VydChjaGVjaywgbWVzc2FnZSwgY29kZSwgaW5mbykge1xuICAgIGlmICghY2hlY2spIHtcbiAgICAgICAgdGhyb3cgbWFrZUVycm9yKG1lc3NhZ2UsIGNvZGUsIGluZm8pO1xuICAgIH1cbn1cbi8qKlxuICogIEEgc2ltcGxlIGhlbHBlciB0byBzaW1wbHkgZW5zdXJpbmcgcHJvdmlkZWQgYXJndW1lbnRzIG1hdGNoIGV4cGVjdGVkXG4gKiAgY29uc3RyYWludHMsIHRocm93aW5nIGlmIG5vdC5cbiAqXG4gKiAgSW4gVHlwZVNjcmlwdCBlbnZpcm9ubWVudHMsIHRoZSAlJWNoZWNrJSUgaGFzIGJlZW4gYXNzZXJ0ZWQgdHJ1ZSwgc29cbiAqICBhbnkgZnVydGhlciBjb2RlIGRvZXMgbm90IG5lZWQgYWRkaXRpb25hbCBjb21waWxlLXRpbWUgY2hlY2tz
26774LlxuICovXG5leHBvcnQgZnVuY3Rpb24gYXNzZXJ0QXJndW1lbnQoY2hlY2ssIG1lc3NhZ2UsIG5hbWUsIHZhbHVlKSB7XG4gICAgYXNzZXJ0KGNoZWNrLCBtZXNzYWdlLCBcIklOVkFMSURfQVJHVU1FTlRcIiwgeyBhcmd1bWVudDogbmFtZSwgdmFsdWU6IHZhbHVlIH0pO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGFzc2VydEFyZ3VtZW50Q291bnQoY291bnQsIGV4cGVjdGVkQ291bnQsIG1lc3NhZ2UpIHtcbiAgICBpZiAobWVzc2FnZSA9PSBudWxsKSB7XG4gICAgICAgIG1lc3NhZ2UgPSBcIlwiO1xuICAgIH1cbiAgICBpZiAobWVzc2FnZSkge1xuICAgICAgICBtZXNzYWdlID0gXCI6IFwiICsgbWVzc2FnZTtcbiAgICB9XG4gICAgYXNzZXJ0KGNvdW50ID49IGV4cGVjdGVkQ291bnQsIFwibWlzc2luZyBhcmd1bWVudFwiICsgbWVzc2FnZSwgXCJNSVNTSU5HX0FSR1VNRU5UXCIsIHtcbiAgICAgICAgY291bnQ6IGNvdW50LFxuICAgICAgICBleHBlY3RlZENvdW50OiBleHBlY3RlZENvdW50XG4gICAgfSk7XG4gICAgYXNzZXJ0KGNvdW50IDw9IGV4cGVjdGVkQ291bnQsIFwidG9vIG1hbnkgYXJndW1lbnRzXCIgKyBtZXNzYWdlLCBcIlVORVhQRUNURURfQVJHVU1FTlRcIiwge1xuICAgICAgICBjb3VudDogY291bnQsXG4gICAgICAgIGV4cGVjdGVkQ291bnQ6IGV4cGVjdGVkQ291bnRcbiAgICB9KTtcbn1cbmNvbnN0IF9ub3JtYWxpemVGb3JtcyA9IFtcIk5GRFwiLCBcIk5GQ1wiLCBcIk5GS0RcIiwgXCJORktDXCJdLnJlZHVjZSgoYWNjdW0sIGZvcm0pID0+IHtcbiAgICB0cnkge1xuICAgICAgICAvLyBHZW5lcmFsIHRlc3QgZm9yIG5vcm1hbGl6ZVxuICAgICAgICAvKiBjOCBpZ25vcmUgc3RhcnQgKi9cbiAgICAgICAgaWYgKFwidGVzdFwiLm5vcm1hbGl6ZShmb3JtKSAhPT0gXCJ0ZXN0XCIpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcImJhZFwiKTtcbiAgICAgICAgfVxuICAgICAgICA7XG4gICAgICAgIC8qIGM4IGlnbm9yZSBzdG9wICovXG4gICAgICAgIGlmIChmb3JtID09PSBcIk5GRFwiKSB7XG4gICAgICAgICAgICBjb25zdCBjaGVjayA9IFN0cmluZy5mcm9tQ2hhckNvZGUoMHhlOSkubm9ybWFsaXplKFwiTkZEXCIpO1xuICAgICAgICAgICAgY29uc3QgZXhwZWN0ZWQgPSBTdHJpbmcuZnJvbUNoYXJDb2RlKDB4NjUsIDB4MDMwMSk7XG4gICAgICAgICAgICAvKiBjOCBpZ25vcmUgc3RhcnQgKi9cbiAgICAgICAgICAgIGlmIChjaGVjayAhPT0gZXhwZWN0ZWQpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJicm9rZW5cIik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvKiBjOCBpZ25vcmUgc3RvcCAqL1xuICAgICAgICB9XG4gICAgICAgIGFjY3VtLnB1c2goZm9ybSk7XG4gICAgfVxuICAgIGNhdGNoIChlcnJvcikgeyB9XG4gICAgcmV0dXJuIGFjY3VtO1xufSwgW10pO1xuLyoqXG4gKiAgVGhyb3dzIGlmIHRoZSBub3JtYWxpemF0aW9uICUlZm9ybSUlIGlzIG5vdCBzdXBwb3J0ZWQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBhc3NlcnROb3JtYWxpemUoZm9ybSkge1xuICAgIGFzc2VydChfbm9ybWFsaXplRm9ybXMuaW5kZXhPZihmb3JtKSA+PSAwLCBcInBsYXRmb3JtIG1pc3NpbmcgU3RyaW5nLnByb3RvdHlwZS5ub3JtYWxpemVcIiwgXCJVTlNVUFBPUlRFRF9PUEVSQVRJT05cIiwge1xuICAgICAgICBvcGVyYXRpb246IFwiU3RyaW5nLnByb3RvdHlwZS5ub3JtYWxpemVcIiwgaW5mbzogeyBmb3JtIH1cbiAgICB9KTtcbn1cbi8qKlxuICogIE1hbnkgY2xhc3NlcyB1c2UgZmlsZS1zY29wZWQgdmFsdWVzIHRvIGd1YXJkIHRoZSBjb25zdHJ1Y3RvcixcbiAqICBtYWtpbmcgaXQgZWZmZWN0aXZlbHkgcHJpdmF0ZS4gVGhpcyBmYWNpbGl0YXRlcyB0aGF0IHBhdHRlcm5cbiAqICBieSBlbnN1cmluZyB0aGUgJSVnaXZlbkdhdXJkJSUgbWF0Y2hlcyB0aGUgZmlsZS1zY29wZWQgJSVndWFyZCUlLFxuICogIHRocm93aW5nIGlmIG5vdCwgaW5kaWNhdGluZyB0aGUgJSVjbGFzc05hbWUlJSBpZiBwcm92aWRlZC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGFzc2VydFByaXZhdGUoZ2l2ZW5HdWFyZCwgZ3VhcmQsIGNsYXNzTmFtZSkge1xuICAgIGlmIChjbGFzc05hbWUgPT0gbnVsbCkge1xuICAgICAgICBjbGFzc05hbWUgPSBcIlwiO1xuICAgIH1cbiAgICBpZiAoZ2l2ZW5HdWFyZCAhPT0gZ3VhcmQpIHtcbiAgICAgICAgbGV0IG1ldGhvZCA9IGNsYXNzTmFtZSwgb3BlcmF0aW9uID0gXCJuZXdcIjtcbiAgICAgICAgaWYgKGNsYXNzTmFtZSkge1xuICAgICAgICAgICAgbWV0aG9kICs9IFwiLlwiO1xuICAgICAgICAgICAgb3BlcmF0aW9uICs9IFwiIFwiICsgY2xhc3NOYW1lO1xuICAgICAgICB9XG4gICAgICAgIGFzc2VydChmYWxzZSwgYHByaXZhdGUgY29uc3RydWN0b3I7IHVzZSAke21ldGhvZH1mcm9tKiBtZXRob2RzYCwgXCJVTlNVUFBPUlRFRF9PUEVSQVRJT05cIiwge1xuICAgICAgICAgICAgb3BlcmF0aW9uXG4gICAgICAgIH0pO1xuICAgIH1cbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWVycm9ycy5qcy5tYXAiLCIvKipcbiAqICBTb21lIGRhdGEgaGVscGVycy5cbiAqXG4gKlxuICogIEBfc3Vic2VjdGlvbiBhcGkvdXRpbHM6RGF0YSBIZWxwZXJzICBbYWJvdXQtZGF0YV1cbiAqL1xuaW1wb3J0IHsgYXNzZXJ0LCBhc3NlcnRBcmd1bWVudCB9IGZyb20gXCIuL2Vycm9ycy5qc1wiO1xuZnVuY3Rpb24gX2dldEJ5dGVzKHZhbHVlLCBuYW1lLCBjb3B5KSB7XG4gICAgaWYgKHZhbHVlIGluc3RhbmNlb2YgVWludDhBcnJheSkge1xuICAgICAgICBpZiAoY29weSkge1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBVaW50OEFycmF5KHZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgfVxuICAgIGlmICh0eXBlb2YgKHZhbHVlKSA9PT0gXCJzdHJpbmdcIiAmJiAodmFsdWUubGVuZ3RoICUgMikgPT09IDAgJiZcbiAgICAgICAgdmFsdWUubWF0Y2goL14weFswLTlhLWZdKiQvaSkpIHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gbmV3IFVpbnQ4QXJyYXkoKHZhbHVlLmxlbmd0aCAtIDIpIC8gMik7XG4gICAgICAgIGxldCBvZmZzZXQgPSAyO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHJlc3VsdC5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgcmVzdWx0W2ldID0gcGFyc2VJbnQodmFsdWUuc3Vic3RyaW5nKG9mZnNldCwgb2Zmc2V0ICsgMiksIDE2KTtcbiAgICAgICAgICAgIG9mZnNldCArPSAyO1xuICAgICAgICB9XG4gICAgICAgI
26774HJldHVybiByZXN1bHQ7XG4gICAgfVxuICAgIGFzc2VydEFyZ3VtZW50KGZhbHNlLCBcImludmFsaWQgQnl0ZXNMaWtlIHZhbHVlXCIsIG5hbWUgfHwgXCJ2YWx1ZVwiLCB2YWx1ZSk7XG59XG4vKipcbiAqICBHZXQgYSB0eXBlZCBVaW50OEFycmF5IGZvciAlJXZhbHVlJSUuIElmIGFscmVhZHkgYSBVaW50OEFycmF5XG4gKiAgdGhlIG9yaWdpbmFsICUldmFsdWUlJSBpcyByZXR1cm5lZDsgaWYgYSBjb3B5IGlzIHJlcXVpcmVkIHVzZVxuICogIFtbZ2V0Qnl0ZXNDb3B5XV0uXG4gKlxuICogIEBzZWU6IGdldEJ5dGVzQ29weVxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0Qnl0ZXModmFsdWUsIG5hbWUpIHtcbiAgICByZXR1cm4gX2dldEJ5dGVzKHZhbHVlLCBuYW1lLCBmYWxzZSk7XG59XG4vKipcbiAqICBHZXQgYSB0eXBlZCBVaW50OEFycmF5IGZvciAlJXZhbHVlJSUsIGNyZWF0aW5nIGEgY29weSBpZiBuZWNlc3NhcnlcbiAqICB0byBwcmV2ZW50IGFueSBtb2RpZmljYXRpb25zIG9mIHRoZSByZXR1cm5lZCB2YWx1ZSBmcm9tIGJlaW5nXG4gKiAgcmVmbGVjdGVkIGVsc2V3aGVyZS5cbiAqXG4gKiAgQHNlZTogZ2V0Qnl0ZXNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldEJ5dGVzQ29weSh2YWx1ZSwgbmFtZSkge1xuICAgIHJldHVybiBfZ2V0Qnl0ZXModmFsdWUsIG5hbWUsIHRydWUpO1xufVxuLyoqXG4gKiAgUmV0dXJucyB0cnVlIGlmICUldmFsdWUlJSBpcyBhIHZhbGlkIFtbSGV4U3RyaW5nXV0uXG4gKlxuICogIElmICUlbGVuZ3RoJSUgaXMgYGB0cnVlYGAgb3IgYSAvL251bWJlci8vLCBpdCBhbHNvIGNoZWNrcyB0aGF0XG4gKiAgJSV2YWx1ZSUlIGlzIGEgdmFsaWQgW1tEYXRhSGV4U3RyaW5nXV0gb2YgJSVsZW5ndGglJSAoaWYgYSAvL251bWJlci8vKVxuICogIGJ5dGVzIG9mIGRhdGEgKGUuZy4gYGAweDEyMzRgYCBpcyAyIGJ5dGVzKS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzSGV4U3RyaW5nKHZhbHVlLCBsZW5ndGgpIHtcbiAgICBpZiAodHlwZW9mICh2YWx1ZSkgIT09IFwic3RyaW5nXCIgfHwgIXZhbHVlLm1hdGNoKC9eMHhbMC05QS1GYS1mXSokLykpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBpZiAodHlwZW9mIChsZW5ndGgpID09PSBcIm51bWJlclwiICYmIHZhbHVlLmxlbmd0aCAhPT0gMiArIDIgKiBsZW5ndGgpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBpZiAobGVuZ3RoID09PSB0cnVlICYmICh2YWx1ZS5sZW5ndGggJSAyKSAhPT0gMCkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHJldHVybiB0cnVlO1xufVxuLyoqXG4gKiAgUmV0dXJucyB0cnVlIGlmICUldmFsdWUlJSBpcyBhIHZhbGlkIHJlcHJlc2VudGF0aW9uIG9mIGFyYml0cmFyeVxuICogIGRhdGEgKGkuZS4gYSB2YWxpZCBbW0RhdGFIZXhTdHJpbmddXSBvciBhIFVpbnQ4QXJyYXkpLlxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNCeXRlc0xpa2UodmFsdWUpIHtcbiAgICByZXR1cm4gKGlzSGV4U3RyaW5nKHZhbHVlLCB0cnVlKSB8fCAodmFsdWUgaW5zdGFuY2VvZiBVaW50OEFycmF5KSk7XG59XG5jb25zdCBIZXhDaGFyYWN0ZXJzID0gXCIwMTIzNDU2Nzg5YWJjZGVmXCI7XG4vKipcbiAqICBSZXR1cm5zIGEgW1tEYXRhSGV4U3RyaW5nXV0gcmVwcmVzZW50YXRpb24gb2YgJSVkYXRhJSUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBoZXhsaWZ5KGRhdGEpIHtcbiAgICBjb25zdCBieXRlcyA9IGdldEJ5dGVzKGRhdGEpO1xuICAgIGxldCByZXN1bHQgPSBcIjB4XCI7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBieXRlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICBjb25zdCB2ID0gYnl0ZXNbaV07XG4gICAgICAgIHJlc3VsdCArPSBIZXhDaGFyYWN0ZXJzWyh2ICYgMHhmMCkgPj4gNF0gKyBIZXhDaGFyYWN0ZXJzW3YgJiAweDBmXTtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbn1cbi8qKlxuICogIFJldHVybnMgYSBbW0RhdGFIZXhTdHJpbmddXSBieSBjb25jYXRlbmF0aW5nIGFsbCB2YWx1ZXNcbiAqICB3aXRoaW4gJSVkYXRhJSUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjb25jYXQoZGF0YXMpIHtcbiAgICByZXR1cm4gXCIweFwiICsgZGF0YXMubWFwKChkKSA9PiBoZXhsaWZ5KGQpLnN1YnN0cmluZygyKSkuam9pbihcIlwiKTtcbn1cbi8qKlxuICogIFJldHVybnMgdGhlIGxlbmd0aCBvZiAlJWRhdGElJSwgaW4gYnl0ZXMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBkYXRhTGVuZ3RoKGRhdGEpIHtcbiAgICBpZiAoaXNIZXhTdHJpbmcoZGF0YSwgdHJ1ZSkpIHtcbiAgICAgICAgcmV0dXJuIChkYXRhLmxlbmd0aCAtIDIpIC8gMjtcbiAgICB9XG4gICAgcmV0dXJuIGdldEJ5dGVzKGRhdGEpLmxlbmd0aDtcbn1cbi8qKlxuICogIFJldHVybnMgYSBbW0RhdGFIZXhTdHJpbmddXSBieSBzbGljaW5nICUlZGF0YSUlIGZyb20gdGhlICUlc3RhcnQlJVxuICogIG9mZnNldCB0byB0aGUgJSVlbmQlJSBvZmZzZXQuXG4gKlxuICogIEJ5IGRlZmF1bHQgJSVzdGFydCUlIGlzIDAgYW5kICUlZW5kJSUgaXMgdGhlIGxlbmd0aCBvZiAlJWRhdGElJS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGRhdGFTbGljZShkYXRhLCBzdGFydCwgZW5kKSB7XG4gICAgY29uc3QgYnl0ZXMgPSBnZXRCeXRlcyhkYXRhKTtcbiAgICBpZiAoZW5kICE9IG51bGwgJiYgZW5kID4gYnl0ZXMubGVuZ3RoKSB7XG4gICAgICAgIGFzc2VydChmYWxzZSwgXCJjYW5ub3Qgc2xpY2UgYmV5b25kIGRhdGEgYm91bmRzXCIsIFwiQlVGRkVSX09WRVJSVU5cIiwge1xuICAgICAgICAgICAgYnVmZmVyOiBieXRlcywgbGVuZ3RoOiBieXRlcy5sZW5ndGgsIG9mZnNldDogZW5kXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICByZXR1cm4gaGV4bGlmeShieXRlcy5zbGljZSgoc3RhcnQgPT0gbnVsbCkgPyAwIDogc3RhcnQsIChlbmQgPT0gbnVsbCkgPyBieXRlcy5sZW5ndGggOiBlbmQpKTtcbn1cbi8qKlxuICogIFJldHVybiB0aGUgW1tEYXRhSGV4U3RyaW5nXV0gcmVzdWx0IGJ5IHN0cmlwcGluZyBhbGwgKipsZWFkaW5nKipcbiAqKiB6ZXJvIGJ5dGVzIGZyb20gJSVkYXRhJSUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzdHJpcFplcm9zTGVmdChkYXRhKSB7XG4gICAgbGV0IGJ5dGVzID0gaGV4bGlmeShkYXRhKS5zdWJzdHJpbmcoMik7XG4gICAgd2hpbGUgKGJ5dGVzLnN0YXJ0c1dpdGgoXCIwMFwiKSkge1xuICAgICAgICBieXRlcyA9IGJ5dGVzLnN1YnN0cmluZygyKTtcbiAgICB9XG4gICAgcmV0dXJuIFwiMHhcIiArIGJ5dG
26774VzO1xufVxuZnVuY3Rpb24gemVyb1BhZChkYXRhLCBsZW5ndGgsIGxlZnQpIHtcbiAgICBjb25zdCBieXRlcyA9IGdldEJ5dGVzKGRhdGEpO1xuICAgIGFzc2VydChsZW5ndGggPj0gYnl0ZXMubGVuZ3RoLCBcInBhZGRpbmcgZXhjZWVkcyBkYXRhIGxlbmd0aFwiLCBcIkJVRkZFUl9PVkVSUlVOXCIsIHtcbiAgICAgICAgYnVmZmVyOiBuZXcgVWludDhBcnJheShieXRlcyksXG4gICAgICAgIGxlbmd0aDogbGVuZ3RoLFxuICAgICAgICBvZmZzZXQ6IGxlbmd0aCArIDFcbiAgICB9KTtcbiAgICBjb25zdCByZXN1bHQgPSBuZXcgVWludDhBcnJheShsZW5ndGgpO1xuICAgIHJlc3VsdC5maWxsKDApO1xuICAgIGlmIChsZWZ0KSB7XG4gICAgICAgIHJlc3VsdC5zZXQoYnl0ZXMsIGxlbmd0aCAtIGJ5dGVzLmxlbmd0aCk7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICByZXN1bHQuc2V0KGJ5dGVzLCAwKTtcbiAgICB9XG4gICAgcmV0dXJuIGhleGxpZnkocmVzdWx0KTtcbn1cbi8qKlxuICogIFJldHVybiB0aGUgW1tEYXRhSGV4U3RyaW5nXV0gb2YgJSVkYXRhJSUgcGFkZGVkIG9uIHRoZSAqKmxlZnQqKlxuICogIHRvICUlbGVuZ3RoJSUgYnl0ZXMuXG4gKlxuICogIElmICUlZGF0YSUlIGFscmVhZHkgZXhjZWVkcyAlJWxlbmd0aCUlLCBhIFtbQnVmZmVyT3ZlcnJ1bkVycm9yXV0gaXNcbiAqICB0aHJvd24uXG4gKlxuICogIFRoaXMgcGFkcyBkYXRhIHRoZSBzYW1lIGFzICoqdmFsdWVzKiogYXJlIGluIFNvbGlkaXR5XG4gKiAgKGUuZy4gYGB1aW50MTI4YGApLlxuICovXG5leHBvcnQgZnVuY3Rpb24gemVyb1BhZFZhbHVlKGRhdGEsIGxlbmd0aCkge1xuICAgIHJldHVybiB6ZXJvUGFkKGRhdGEsIGxlbmd0aCwgdHJ1ZSk7XG59XG4vKipcbiAqICBSZXR1cm4gdGhlIFtbRGF0YUhleFN0cmluZ11dIG9mICUlZGF0YSUlIHBhZGRlZCBvbiB0aGUgKipyaWdodCoqXG4gKiAgdG8gJSVsZW5ndGglJSBieXRlcy5cbiAqXG4gKiAgSWYgJSVkYXRhJSUgYWxyZWFkeSBleGNlZWRzICUlbGVuZ3RoJSUsIGEgW1tCdWZmZXJPdmVycnVuRXJyb3JdXSBpc1xuICogIHRocm93bi5cbiAqXG4gKiAgVGhpcyBwYWRzIGRhdGEgdGhlIHNhbWUgYXMgKipieXRlcyoqIGFyZSBpbiBTb2xpZGl0eVxuICogIChlLmcuIGBgYnl0ZXMxNmBgKS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHplcm9QYWRCeXRlcyhkYXRhLCBsZW5ndGgpIHtcbiAgICByZXR1cm4gemVyb1BhZChkYXRhLCBsZW5ndGgsIGZhbHNlKTtcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWRhdGEuanMubWFwIiwiLyoqXG4gKiAgU29tZSBtYXRoZW1hdGljIG9wZXJhdGlvbnMuXG4gKlxuICogIEBfc3Vic2VjdGlvbjogYXBpL3V0aWxzOk1hdGggSGVscGVycyAgW2Fib3V0LW1hdGhzXVxuICovXG5pbXBvcnQgeyBoZXhsaWZ5LCBpc0J5dGVzTGlrZSB9IGZyb20gXCIuL2RhdGEuanNcIjtcbmltcG9ydCB7IGFzc2VydCwgYXNzZXJ0QXJndW1lbnQgfSBmcm9tIFwiLi9lcnJvcnMuanNcIjtcbmNvbnN0IEJOXzAgPSBCaWdJbnQoMCk7XG5jb25zdCBCTl8xID0gQmlnSW50KDEpO1xuLy9jb25zdCBCTl9NYXgyNTYgPSAoQk5fMSA8PCBCaWdJbnQoMjU2KSkgLSBCTl8xO1xuLy8gSUVFRSA3NTQgc3VwcG9ydCA1My1iaXRzIG9mIG1hbnRpc3NhXG5jb25zdCBtYXhWYWx1ZSA9IDB4MWZmZmZmZmZmZmZmZmY7XG4vKipcbiAqICBDb252ZXJ0ICUldmFsdWUlJSBmcm9tIGEgdHdvcy1jb21wbGltZW50IHJlcHJlc2VudGF0aW9uIG9mICUld2lkdGglJVxuICogIGJpdHMgdG8gaXRzIHZhbHVlLlxuICpcbiAqICBJZiB0aGUgaGlnaGVzdCBiaXQgaXMgYGAxYGAsIHRoZSByZXN1bHQgd2lsbCBiZSBuZWdhdGl2ZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGZyb21Ud29zKF92YWx1ZSwgX3dpZHRoKSB7XG4gICAgY29uc3QgdmFsdWUgPSBnZXRVaW50KF92YWx1ZSwgXCJ2YWx1ZVwiKTtcbiAgICBjb25zdCB3aWR0aCA9IEJpZ0ludChnZXROdW1iZXIoX3dpZHRoLCBcIndpZHRoXCIpKTtcbiAgICBhc3NlcnQoKHZhbHVlID4+IHdpZHRoKSA9PT0gQk5fMCwgXCJvdmVyZmxvd1wiLCBcIk5VTUVSSUNfRkFVTFRcIiwge1xuICAgICAgICBvcGVyYXRpb246IFwiZnJvbVR3b3NcIiwgZmF1bHQ6IFwib3ZlcmZsb3dcIiwgdmFsdWU6IF92YWx1ZVxuICAgIH0pO1xuICAgIC8vIFRvcCBiaXQgc2V0OyB0cmVhdCBhcyBh
26774IG5lZ2F0aXZlIHZhbHVlXG4gICAgaWYgKHZhbHVlID4+ICh3aWR0aCAtIEJOXzEpKSB7XG4gICAgICAgIGNvbnN0IG1hc2sgPSAoQk5fMSA8PCB3aWR0aCkgLSBCTl8xO1xuICAgICAgICByZXR1cm4gLSgoKH52YWx1ZSkgJiBtYXNrKSArIEJOXzEpO1xuICAgIH1cbiAgICByZXR1cm4gdmFsdWU7XG59XG4vKipcbiAqICBDb252ZXJ0ICUldmFsdWUlJSB0byBhIHR3b3MtY29tcGxpbWVudCByZXByZXNlbnRhdGlvbiBvZlxuICogICUld2lkdGglJSBiaXRzLlxuICpcbiAqICBUaGUgcmVzdWx0IHdpbGwgYWx3YXlzIGJlIHBvc2l0aXZlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gdG9Ud29zKF92YWx1ZSwgX3dpZHRoKSB7XG4gICAgbGV0IHZhbHVlID0gZ2V0QmlnSW50KF92YWx1ZSwgXCJ2YWx1ZVwiKTtcbiAgICBjb25zdCB3aWR0aCA9IEJpZ0ludChnZXROdW1iZXIoX3dpZHRoLCBcIndpZHRoXCIpKTtcbiAgICBjb25zdCBsaW1pdCA9IChCTl8xIDw8ICh3aWR0aCAtIEJOXzEpKTtcbiAgICBpZiAodmFsdWUgPCBCTl8wKSB7XG4gICAgICAgIHZhbHVlID0gLXZhbHVlO1xuICAgICAgICBhc3NlcnQodmFsdWUgPD0gbGltaXQsIFwidG9vIGxvd1wiLCBcIk5VTUVSSUNfRkFVTFRcIiwge1xuICAgICAgICAgICAgb3BlcmF0aW9uOiBcInRvVHdvc1wiLCBmYXVsdDogXCJvdmVyZmxvd1wiLCB2YWx1ZTogX3ZhbHVlXG4gICAgICAgIH0pO1xuICAgICAgICBjb25zdCBtYXNrID0gKEJOXzEgPDwgd2lkdGgpIC0gQk5fMTtcbiAgICAgICAgcmV0dXJuICgofnZhbHVlKSAmIG1hc2spICsgQk5fMTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIGFzc2VydCh2YWx1ZSA8IGxpbWl0LCBcInRvbyBoaWdoXCIsIFwiTlVNRVJJQ19GQVVMVFwiLCB7XG4gICAgICAgICAgICBvcGVyYXRpb246IFwidG9Ud29zXCIsIGZhdWx0OiBcIm92ZXJmbG93XCIsIHZhbHVlOiBfdmFsdWVcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHJldHVybiB2YWx1ZTtcbn1cbi8qKlxuICogIE1hc2sgJSV2YWx1ZSUlIHdpdGggYSBiaXRtYXNrIG9mICUlYml0cyUlIG9uZXMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBtYXNrKF92YWx1ZSwgX2JpdHMpIHtcbiAgICBjb25zdCB2YWx1ZSA9IGdldFVpbnQoX3ZhbHVlLCBcInZhbHVlXCIpO1xuICAgIGNvbnN0IGJpdHMgPSBCaWdJbnQoZ2V0TnVtYmVyKF9iaXRzLCBcImJpdHNcIikpO1xuICAgIHJldHVybiB2YWx1ZSAmICgoQk5fMSA8PCBiaXRzKSAtIEJOXzEpO1xufVxuLyoqXG4gKiAgR2V0cyBhIEJpZ0ludCBmcm9tICUldmFsdWUlJS4gSWYgaXQgaXMgYW4gaW52YWxpZCB2YWx1ZSBmb3JcbiAqICBhIEJpZ0ludCwgdGhlbiBhbiBBcmd1bWVudEVycm9yIHdpbGwgYmUgdGhyb3duIGZvciAlJW5hbWUlJS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldEJpZ0ludCh2YWx1ZSwgbmFtZSkge1xuICAgIHN3aXRjaCAodHlwZW9mICh2YWx1ZSkpIHtcbiAgICAgICAgY2FzZSBcImJpZ2ludFwiOiByZXR1cm4gdmFsdWU7XG4gICAgICAgIGNhc2UgXCJudW1iZXJcIjpcbiAgICAgICAgICAgIGFzc2VydEFyZ3VtZW50KE51bWJlci5pc0ludGVnZXIodmFsdWUpLCBcInVuZGVyZmxvd1wiLCBuYW1lIHx8IFwidmFsdWVcIiwgdmFsdWUpO1xuICAgICAgICAgICAgYXNzZXJ0QXJndW1lbnQodmFsdWUgPj0gLW1heFZhbHVlICYmIHZhbHVlIDw9IG1heFZhbHVlLCBcIm92ZXJmbG93XCIsIG5hbWUgfHwgXCJ2YWx1ZVwiLCB2YWx1ZSk7XG4gICAgICAgICAgICByZXR1cm4gQmlnSW50KHZhbHVlKTtcbiAgICAgICAgY2FzZSBcInN0cmluZ1wiOlxuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBpZiAodmFsdWUgPT09IFwiXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiZW1wdHkgc3RyaW5nXCIpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAodmFsdWVbMF0gPT09IFwiLVwiICYmIHZhbHVlWzFdICE9PSBcIi1cIikge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gLUJpZ0ludCh2YWx1ZS5zdWJzdHJpbmcoMSkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gQmlnSW50KHZhbHVlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgYXNzZXJ0QXJndW1lbnQoZmFsc2UsIGBpbnZhbGlkIEJpZ051bWJlcmlzaCBzdHJpbmc6ICR7ZS5tZXNzYWdlfWAsIG5hbWUgfHwgXCJ2YWx1ZVwiLCB2YWx1ZSk7XG4gICAgICAgICAgICB9XG4gICAgfVxuICAgIGFzc2VydEFyZ3VtZW50KGZhbHNlLCBcImludmFsaWQgQmlnTnVtYmVyaXNoIHZhbHVlXCIsIG5hbW
26774UgfHwgXCJ2YWx1ZVwiLCB2YWx1ZSk7XG59XG4vKipcbiAqICBSZXR1cm5zICUldmFsdWUlJSBhcyBhIGJpZ2ludCwgdmFsaWRhdGluZyBpdCBpcyB2YWxpZCBhcyBhIGJpZ2ludFxuICogIHZhbHVlIGFuZCB0aGF0IGl0IGlzIHBvc2l0aXZlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0VWludCh2YWx1ZSwgbmFtZSkge1xuICAgIGNvbnN0IHJlc3VsdCA9IGdldEJpZ0ludCh2YWx1ZSwgbmFtZSk7XG4gICAgYXNzZXJ0KHJlc3VsdCA+PSBCTl8wLCBcInVuc2lnbmVkIHZhbHVlIGNhbm5vdCBiZSBuZWdhdGl2ZVwiLCBcIk5VTUVSSUNfRkFVTFRcIiwge1xuICAgICAgICBmYXVsdDogXCJvdmVyZmxvd1wiLCBvcGVyYXRpb246IFwiZ2V0VWludFwiLCB2YWx1ZVxuICAgIH0pO1xuICAgIHJldHVybiByZXN1bHQ7XG59XG5jb25zdCBOaWJibGVzID0gXCIwMTIzNDU2Nzg5YWJjZGVmXCI7XG4vKlxuICogQ29udmVydHMgJSV2YWx1ZSUlIHRvIGEgQmlnSW50LiBJZiAlJXZhbHVlJSUgaXMgYSBVaW50OEFycmF5LCBpdFxuICogaXMgdHJlYXRlZCBhcyBCaWcgRW5kaWFuIGRhdGEuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0b0JpZ0ludCh2YWx1ZSkge1xuICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIFVpbnQ4QXJyYXkpIHtcbiAgICAgICAgbGV0IHJlc3VsdCA9IFwiMHgwXCI7XG4gICAgICAgIGZvciAoY29uc3QgdiBvZiB2YWx1ZSkge1xuICAgICAgICAgICAgcmVzdWx0ICs9IE5pYmJsZXNbdiA+PiA0XTtcbiAgICAgICAgICAgIHJlc3VsdCArPSBOaWJibGVzW3YgJiAweDBmXTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gQmlnSW50KHJlc3VsdCk7XG4gICAgfVxuICAgIHJldHVybiBnZXRCaWdJbnQodmFsdWUpO1xufVxuLyoqXG4gKiAgR2V0cyBhIC8vbnVtYmVyLy8gZnJvbSAlJXZhbHVlJSUuIElmIGl0IGlzIGFuIGludmFsaWQgdmFsdWUgZm9yXG4gKiAgYSAvL251bWJlci8vLCB0aGVuIGFuIEFyZ3VtZW50RXJyb3Igd2lsbCBiZSB0aHJvd24gZm9yICUlbmFtZSUlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0TnVtYmVyKHZhbHVlLCBuYW1lKSB7XG4gICAgc3dpdGNoICh0eXBlb2YgKHZhbHVlKSkge1xuICAgICAgICBjYXNlIFwiYmlnaW50XCI6XG4gICAgICAgICAgICBhc3NlcnRBcmd1bWVudCh2YWx1ZSA+PSAtbWF4VmFsdWUgJiYgdmFsdWUgPD0gbWF4VmFsdWUsIFwib3ZlcmZsb3dcIiwgbmFtZSB8fCBcInZhbHVlXCIsIHZhbHVlKTtcbiAgICAgICAgICAgIHJldHVybiBOdW1iZXIodmFsdWUpO1xuICAgICAgICBjYXNlIFwibnVtYmVyXCI6XG4gICAgICAgICAgICBhc3NlcnRBcmd1bWVudChOdW1iZXIuaXNJbnRlZ2VyKHZhbHVlKSwgXCJ1bmRlcmZsb3dcIiwgbmFtZSB8fCBcInZhbHVlXCIsIHZhbHVlKTtcbiAgICAgICAgICAgIGFzc2VydEFyZ3VtZW50KHZhbHVlID49IC1tYXhWYWx1ZSAmJiB2YWx1ZSA8PSBtYXhWYWx1ZSwgXCJvdmVyZmxvd1wiLCBuYW1lIHx8IFwidmFsdWVcIiwgdmFsdWUpO1xuICAgICAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgICAgICBjYXNlIFwic3RyaW5nXCI6XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGlmICh2YWx1ZSA9PT0gXCJcIikge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJlbXB0eSBzdHJpbmdcIik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiBnZXROdW1iZXIoQmlnSW50KHZhbHVlKSwgbmFtZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgIGFzc2VydEFyZ3VtZW50KGZhbHNlLCBgaW52YWxpZCBudW1lcmljIHN0cmluZzogJHtlLm1lc3NhZ2V9YCwgbmFtZSB8fCBcInZhbHVlXCIsIHZhbHVlKTtcbiAgICAgICAgICAgIH1cbiAgICB9XG4gICAgYXNzZXJ0QXJndW1lbnQoZmFsc2UsIFwiaW52YWxpZCBudW1lcmljIHZhbHVlXCIsIG5hbW
26774UgfHwgXCJ2YWx1ZVwiLCB2YWx1ZSk7XG59XG4vKipcbiAqICBDb252ZXJ0cyAlJXZhbHVlJSUgdG8gYSBudW1iZXIuIElmICUldmFsdWUlJSBpcyBhIFVpbnQ4QXJyYXksIGl0XG4gKiAgaXMgdHJlYXRlZCBhcyBCaWcgRW5kaWFuIGRhdGEuIFRocm93cyBpZiB0aGUgdmFsdWUgaXMgbm90IHNhZmUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0b051bWJlcih2YWx1ZSkge1xuICAgIHJldHVybiBnZXROdW1iZXIodG9CaWdJbnQodmFsdWUpKTtcbn1cbi8qKlxuICogIENvbnZlcnRzICUldmFsdWUlJSB0byBhIEJpZyBFbmRpYW4gaGV4c3RyaW5nLCBvcHRpb25hbGx5IHBhZGRlZCB0b1xuICogICUld2lkdGglJSBieXRlcy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRvQmVIZXgoX3ZhbHVlLCBfd2lkdGgpIHtcbiAgICBjb25zdCB2YWx1ZSA9IGdldFVpbnQoX3ZhbHVlLCBcInZhbHVlXCIpO1xuICAgIGxldCByZXN1bHQgPSB2YWx1ZS50b1N0cmluZygxNik7XG4gICAgaWYgKF93aWR0aCA9PSBudWxsKSB7XG4gICAgICAgIC8vIEVuc3VyZSB0aGUgdmFsdWUgaXMgb2YgZXZlbiBsZW5ndGhcbiAgICAgICAgaWYgKHJlc3VsdC5sZW5ndGggJSAyKSB7XG4gICAgICAgICAgICByZXN1bHQgPSBcIjBcIiArIHJlc3VsdDtcbiAgICAgICAgfVxuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgY29uc3Qgd2lkdGggPSBnZXROdW1iZXIoX3dpZHRoLCBcIndpZHRoXCIpO1xuICAgICAgICAvLyBTcGVjaWFsIGNhc2Ugd2hlbiBib3RoIHZhbHVlIGFuZCB3aWR0aCBhcmUgMCAoc2VlOiAjNTAyNSlcbiAgICAgICAgaWYgKHdpZHRoID09PSAwICYmIHZhbHVlID09PSBCTl8wKSB7XG4gICAgICAgICAgICByZXR1cm4gXCIweFwiO1xuICAgICAgICB9XG4gICAgICAgIGFzc2VydCh3aWR0aCAqIDIgPj0gcmVzdWx0Lmxlbmd0aCwgYHZhbHVlIGV4Y2VlZHMgd2lkdGggKCR7d2lkdGh9IGJ5dGVzKWAsIFwiTlVNRVJJQ19GQVVMVFwiLCB7XG4gICAgICAgICAgICBvcGVyYXRpb246IFwidG9CZUhleFwiLFxuICAgICAgICAgICAgZmF1bHQ6IFwib3ZlcmZsb3dcIixcbiAgICAgICAgICAgIHZhbHVlOiBfdmFsdWVcbiAgICAgICAgfSk7XG4gICAgICAgIC8vIFBhZCB0aGUgdmFsdWUgdG8gdGhlIHJlcXVpcmVkIHdpZHRoXG4gICAgICAgIHdoaWxlIChyZXN1bHQubGVuZ3RoIDwgKHdpZHRoICogMikpIHtcbiAgICAgICAgICAgIHJlc3VsdCA9IFwiMFwiICsgcmVzdWx0O1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBcIjB4XCIgKyByZXN1bHQ7XG59XG4vKipcbiAqICBDb252ZXJ0cyAlJXZhbHVlJSUgdG8gYSBCaWcgRW5kaWFuIFVpbnQ4QXJyYXkuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0b0JlQXJyYXkoX3ZhbHVlLCBfd2lkdGgpIHtcbiAgICBjb25zdCB2YWx1ZSA9IGdldFVpbnQoX3ZhbHVlLCBcInZhbHVlXCIpO1xuICAgIGlmICh2YWx1ZSA9PT0gQk5fMCkge1xuICAgICAgICBjb25zdCB3aWR0aCA9IChfd2lkdGggIT0gbnVsbCkgPyBnZXROdW1iZXIoX3dpZHRoLCBcIndpZHRoXCIpIDogMDtcbiAgICAgICAgcmV0dXJuIG5ldyBVaW50OEFycmF5KHdpZHRoKTtcbiAgICB9XG4gICAgbGV0IGhleCA9IHZhbHVlLnRvU3RyaW5nKDE2KTtcbiAgICBpZiAoaGV4Lmxlbmd0aCAlIDIpIHtcbiAgICAgICAgaGV4ID0gXCIwXCIgKyBoZXg7XG4gICAgfVxuICAgIGlmIChfd2lkdGggIT0gbnVsbCkge1xuICAgICAgICBjb25zdCB3aWR0aCA9IGdldE51bWJlcihfd2lkdGgsIFwid2lkdGhcIik7XG4gICAgICAgIHdoaWxlIChoZXgubGVuZ3RoIDwgKHdpZHRoICogMikpIHtcbiAgICAgICAgICAgIGhleCA9IFwiMDBcIiArIGhleDtcbiAgICAgICAgfVxuICAgICAgICBhc3NlcnQoKHdpZHRoICogMikgPT09IGhleC5sZW5ndGgsIGB2YWx1ZSBleGNlZWRzIHdpZHRoICgke3dpZHRofSBieXRlcylgLCBcIk5VTUVSSUNfRkFVTFRcIiwge1xuICAgICAgICAgICAgb3BlcmF0aW9uOiBcInRvQmVBcnJheVwiLFxuICAgICAgICAgICAgZmF1bHQ6IFwib3ZlcmZsb3dcIixcbiAgICAgICAgICAgIHZhbHVlOiBfdmFsdWVcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIGNvbnN0IHJlc3VsdCA9IG5ldyBVaW50OEFycmF5KGhleC5sZW5ndGggLyAyKTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHJlc3VsdC5sZW5ndGg7IGkrKykge1xuICAgICAgICBjb25zdCBvZmZzZXQgPSBpICogMjtcbiAgICAgICAgcmVzdWx0W2ldID0gcGFyc2VJbnQoaGV4LnN1YnN0cmluZyhvZmZzZXQsIG9mZnNldCArIDIpLCAxNik7XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG59XG4vKipcbiAqICBSZXR1cm5zIGEgW1tIZXhTdHJpbmddXSBmb3IgJSV2YWx1ZSUlIHNhZmUgdG8gdXNlIGFzIGEgLy9RdWFudGl0eS8vLlxuICpcbiAqICBBIC8vUXVhbnRpdHkv
26774LyBkb2VzIG5vdCBoYXZlIGFuZCBsZWFkaW5nIDAgdmFsdWVzIHVubGVzcyB0aGUgdmFsdWUgaXNcbiAqICB0aGUgbGl0ZXJhbCB2YWx1ZSBgMHgwYC4gVGhpcyBpcyBtb3N0IGNvbW1vbmx5IHVzZWQgZm9yIEpTU09OLVJQQ1xuICogIG51bWVyaWMgdmFsdWVzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gdG9RdWFudGl0eSh2YWx1ZSkge1xuICAgIGxldCByZXN1bHQgPSBoZXhsaWZ5KGlzQnl0ZXNMaWtlKHZhbHVlKSA/IHZhbHVlIDogdG9CZUFycmF5KHZhbHVlKSkuc3Vic3RyaW5nKDIpO1xuICAgIHdoaWxlIChyZXN1bHQuc3RhcnRzV2l0aChcIjBcIikpIHtcbiAgICAgICAgcmVzdWx0ID0gcmVzdWx0LnN1YnN0cmluZygxKTtcbiAgICB9XG4gICAgaWYgKHJlc3VsdCA9PT0gXCJcIikge1xuICAgICAgICByZXN1bHQgPSBcIjBcIjtcbiAgICB9XG4gICAgcmV0dXJuIFwiMHhcIiArIHJlc3VsdDtcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPW1hdGhzLmpzLm1hcCIsIi8qKlxuICogIFRoZSBbQmFzZTU4IEVuY29kaW5nXShsaW5rLWJhc2U1OCkgc2NoZW1lIGFsbG93cyBhICoqbnVtZXJpYyoqIHZhbHVlXG4gKiAgdG8gYmUgZW5jb2RlZCBhcyBhIGNvbXBhY3Qgc3RyaW5nIHVzaW5nIGEgcmFkaXggb2YgNTggdXNpbmcgb25seVxuICogIGFscGhhLW51bWVyaWMgY2hhcmFjdGVycy4gQ29uZnVzaW5nbHkgc2ltaWxhciBjaGFyYWN0ZXJzIGFyZSBvbWl0dGVkXG4gKiAgKGkuZS4gYGBcImwwT1wiYGApLlxuICpcbiAqICBOb3RlIHRoYXQgQmFzZTU4IGVuY29kZXMgYSAqKm51bWVyaWMqKiB2YWx1ZSwgbm90IGFyYml0cmFyeSBieXRlcyxcbiAqICBzaW5jZSBhbnkgemVyby1ieXRlcyBvbiB0aGUgbGVmdCB3b3VsZCBnZXQgcmVtb3ZlZC4gVG8gbWl0aWdhdGUgdGhpc1xuICogIGlzc3VlIG1vc3Qgc2NoZW1lcyB0aGF0IHVzZSBCYXNlNTggY2hvb3NlIHNwZWNpZmljIGhpZ2gtb3JkZXIgdmFsdWVzXG4gKiAgdG8gZW5zdXJlIG5vbi16ZXJvIHByZWZpeGVzLlxuICpcbiAqICBAX3N1YnNlY3Rpb246IGFwaS91dGlsczpCYXNlNTggRW5jb2RpbmcgW2Fib3V0LWJhc2U1OF1cbiAqL1xuaW1wb3J0IHsgZ2V0Qnl0ZXMgfSBmcm9tIFwiLi9kYXRhLmpzXCI7XG5pbXBvcnQgeyBhc3NlcnRBcmd1bWVudCB9IGZyb20gXCIuL2Vycm9ycy5qc1wiO1xuaW1wb3J0IHsgdG9CaWdJbnQgfSBmcm9tIFwiLi9tYXRocy5qc1wiO1xuY29uc3QgQWxwaGFiZXQgPSBcIjEyMzQ1Njc4OUFCQ0RFRkdISktMTU5QUVJTVFVWV1hZWmFiY2RlZmdoaWprbW5vcHFyc3R1dnd4eXpcIjtcbmxldCBMb29rdXAgPSBudWxsO1xuZnVuY3Rpb24gZ2V0QWxwaGEobGV0dGVyKSB7XG4gICAgaWYgKExvb2t1cCA9PSBudWxsKSB7XG4gICAgICAgIExvb2t1cCA9IHt9O1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IEFscGhhYmV0Lmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBMb29rdXBbQWxwaGFiZXRbaV1dID0gQmlnSW50KGkpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGNvbnN0IHJlc3VsdCA9IExvb2t1cFtsZXR0ZXJdO1xuICAgIGFzc2VydEFyZ3VtZW50KHJlc3VsdCAhPSBudWxsLCBgaW52YWxpZCBiYXNlNTggdmFsdWVgLCBcImxldHRlclwiLCBsZXR0ZXIpO1xuICAgIHJldHVybiByZXN1bHQ7XG59XG5jb25zdCBCTl8wID0gQmlnSW50KDApO1xuY29uc3QgQk5fNTggPSBCaWdJbnQoNTgpO1xuLyoqXG4gKiAgRW5jb2RlICUldmFsdWUlJSBhcyBhIEJhc2U1OC1lbmNvZGVkIHN0cmluZy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGVuY29kZUJhc2U1OChfdmFsdWUpIHtcbiAgICBjb25zdCBieXRlcyA9IGdldEJ5dGVzKF92YWx1ZSk7XG4gICAgbGV0IHZhbHVlID0gdG9CaWdJbnQoYnl0ZXMpO1xuICAgIGxldCByZXN1bHQgPSBcIlwiO1xuICAgIHdoaWxlICh2YWx1ZSkge1xuICAgICAgICByZXN1bHQgPSBBbHBoYWJldFtOdW1iZXIodmFsdWUgJSBCTl81OCldICsgcmVzdWx0O1xuICAgICAgICB2YWx1ZSAvPSBCTl81ODtcbiAgICB9XG4gICAgLy8gQWNjb3VudCBmb3IgbGVhZGluZyBwYWRkaW5nIHplcm9zXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBieXRlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICBpZiAoYnl0ZXNbaV0pIHtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIHJlc3VsdCA9IEFscGhhYmV0WzBdICsgcmVzdWx0O1xuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xufVxuLyoqXG4gKiAgRGVjb2RlIHRoZSBCYXNlNTgtZW5jb2RlZCAlJXZhbHVlJSUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBkZWNvZGVCYXNlNTgodmFsdWUpIHtcbiAgICBsZXQgcmVzdWx0ID0gQk5fMDtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHZhbHVlLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHJlc3VsdCAqPSBCTl81ODtcbiAgICAgICAgcmVzdWx0ICs9IGdldEFscGhhKHZhbHVlW2ldKTtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWJhc2U1OC5qcy5tYXAiLCIvLyB1dGlscy9iYXNlNjQtYnJvd3NlclxuaW1wb3J0IHsgZ2V0Qnl0ZXMgfSBmcm9tIFwiLi9kYXRhLmpzXCI7XG5leHBvcnQgZnVuY3Rpb24gZGVjb2RlQmFzZTY0KHRleHREYXRhKSB7XG4gICAgdGV4dERhdGEgPSBhdG9iKHRleHREYXRhKTtcbiAgICBjb25zdCBkYXRhID0gbmV3IFVpbnQ4QXJyYXkodGV4dERhdGEubGVuZ3RoKTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRleHREYXRhLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGRhdGFbaV0gPSB0ZXh0RGF0YS5jaGFyQ29kZUF0KGkpO1xuICAgIH1cbiAgICByZXR1cm4gZ2V0Qnl0ZXMoZGF0YSk7XG59XG5leHBvcnQgZnVuY3Rpb24gZW5jb2RlQmFzZTY0KF9kYXRhKSB7XG4gICAgY29uc3QgZGF0YSA9IGdldEJ5dGVzKF9kYXRhKTtcbiAgICBsZXQgdGV4dERhdGEgPSBcIlwiO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZGF0YS5sZW5ndGg7IGkrKykge1xuICAgICAgICB0ZXh0RGF0YSArPSBTdHJpbmcuZnJvbUNoYXJDb2RlKGRhdGFbaV0pO1xuICAgIH1cbiAgICByZXR1cm4gYnRvYSh0ZXh0RGF0YSk7XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1iYXNlNjQtYnJvd3Nlci5qcy5tYXAiLCIvKipcbiAqICBFdmVudHMgYWxsb3cgZm9yIGFwcGxpY2F0aW9ucyB0byB1c2UgdGhlIG9ic2VydmVyIHBhdHRlcm4sIHdoaWNoXG4gKiAgYWxsb3dzIHN1YnNjcmliaW5nIGFuZCBwdWJsaXNoaW5nIGV2ZW50cywgb3V0c2lkZSB0aGUgbm9ybWFsXG4gKiAgZXhlY3V0aW9uIHBhdGhzLlxuICpcbiAqICBAX3NlY3Rpb24gYXBpL3V0aWxzL2V2ZW50czpFdmVudHMgIFthYm91dC1ldmVud
26774HNdXG4gKi9cbmltcG9ydCB7IGRlZmluZVByb3BlcnRpZXMgfSBmcm9tIFwiLi9wcm9wZXJ0aWVzLmpzXCI7XG4vKipcbiAqICBXaGVuIGFuIFtbRXZlbnRFbWl0dGVyYWJsZV1dIHRyaWdnZXJzIGEgW1tMaXN0ZW5lcl1dLCB0aGVcbiAqICBjYWxsYmFjayBhbHdheXMgYWhhcyBvbmUgYWRkaXRpb25hbCBhcmd1bWVudCBwYXNzZWQsIHdoaWNoIGlzXG4gKiAgYW4gKipFdmVudFBheWxvYWQqKi5cbiAqL1xuZXhwb3J0IGNsYXNzIEV2ZW50UGF5bG9hZCB7XG4gICAgLyoqXG4gICAgICogIFRoZSBldmVudCBmaWx0ZXIuXG4gICAgICovXG4gICAgZmlsdGVyO1xuICAgIC8qKlxuICAgICAqICBUaGUgKipFdmVudEVtaXR0ZXJhYmxlKiouXG4gICAgICovXG4gICAgZW1pdHRlcjtcbiAgICAjbGlzdGVuZXI7XG4gICAgLyoqXG4gICAgICogIENyZWF0ZSBhIG5ldyAqKkV2ZW50UGF5bG9hZCoqIGZvciAlJWVtaXR0ZXIlJSB3aXRoXG4gICAgICogIHRoZSAlJWxpc3RlbmVyJSUgYW5kIGZvciAlJWZpbHRlciUlLlxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yKGVtaXR0ZXIsIGxpc3RlbmVyLCBmaWx0ZXIpIHtcbiAgICAgICAgdGhpcy4jbGlzdGVuZXIgPSBsaXN0ZW5lcjtcbiAgICAgICAgZGVmaW5lUHJvcGVydGllcyh0aGlzLCB7IGVtaXR0ZXIsIGZpbHRlciB9KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogIFVucmVnaXN0ZXIgdGhlIHRyaWdnZXJlZCBsaXN0ZW5lciBmb3IgZnV0dXJlIGV2ZW50cy5cbiAgICAgKi9cbiAgICBhc3luYyByZW1vdmVMaXN0ZW5lcigpIHtcbiAgICAgICAgaWYgKHRoaXMuI2xpc3RlbmVyID09IG51bGwpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBhd2FpdCB0aGlzLmVtaXR0ZXIub2ZmKHRoaXMuZmlsdGVyLCB0aGlzLiNsaXN0ZW5lcik7XG4gICAgfVxufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9ZXZlbnRzLmpzLm1hcCIsIi8qKlxuICogIFVzaW5nIHN0cmluZ3MgaW4gRXRoZXJldW0gKG9yIGFueSBzZWN1cml0eS1iYXNkIHN5c3RlbSkgcmVxdWlyZXNcbiAqICBhZGRpdGlvbmFsIGNhcmUuIFRoZXNlIHV0aWxpdGllcyBhdHRlbXB0IHRvIG1pdGlnYXRlIHNvbWUgb2YgdGhlXG4gKiAgc2FmZXR5IGlzc3VlcyBhcyB3ZWxsIGFzIHByb3ZpZGUgdGhlIGFiaWxpdHkgdG8gcmVjb3ZlciBhbmQgYW5hbHlzZVxuICogIHN0cmluZ3MuXG4gKlxuICogIEBfc3Vic2VjdGlvbiBhcGkvdXRpbHM6U3RyaW5ncyBhbmQgVVRGLTggIFthYm91dC1zdHJpbmdzXVxuICovXG5pbXBvcnQgeyBnZXRCeXRlcyB9IGZyb20gXCIuL2RhdGEuanNcIjtcbmltcG9ydCB7IGFzc2VydEFyZ3VtZW50LCBhc3NlcnROb3JtYWxpemUgfSBmcm9tIFwiLi9lcnJvcnMuanNcIjtcbmZ1bmN0aW9uIGVycm9yRnVuYyhyZWFzb24sIG9mZnNldCwgYnl0ZXMsIG91dHB1dCwgYmFkQ29kZXBvaW50KSB7XG4gICAgYXNzZXJ0QXJndW1lbnQoZmFsc2UsIGBpbnZhbGlkIGNvZGVwb2ludCBhdCBvZmZzZXQgJHtvZmZzZXR9OyAke3JlYXNvbn1gLCBcImJ5dGVzXCIsIGJ5dGVzKTtcbn1cbmZ1bmN0aW9uIGlnbm9yZUZ1bmMocmVhc29uLCBvZmZzZXQsIGJ5dGVzLCBvdXRwdXQsIGJhZENvZGVwb2ludCkge1xuICAgIC8vIElmIHRoZXJlIGlzIGFuIGludmFsaWQgcHJlZml4IChpbmNsdWRpbmcgc3RyYXkgY29udGludWF0aW9uKSwgc2tpcCBhbnkgYWRkaXRpb25hbCBjb250aW51YXRpb24gYnl0ZXNcbiAgICBpZiAocmVhc29uID09PSBcIkJBRF9QUkVGSVhcIiB8fCByZWFzb24gPT09IFwiVU5FWFBFQ1RFRF9DT05USU5VRVwiKSB7XG4gICAgICAgIGxldCBpID0gMDtcbiAgICAgICAgZm9yIChsZXQgbyA9IG9mZnNldCArIDE7IG8gPCBieXRlcy5sZW5ndGg7IG8rKykge1xuICAgICAgICAgICAgaWYgKGJ5dGVzW29dID4+IDYgIT09IDB4MDIpIHtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGkrKztcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gaTtcbiAgICB9XG4gICAgLy8gVGhpcyBieXRlIHJ1bnMgdXMgcGFzdCB0aGUgZW5kIG9mIHRoZSBzdHJpbmcsIHNvIGp1c3QganVtcCB0byB0aGUgZW5kXG4gICAgLy8gKGJ1dCB0aGUgZmlyc3QgYnl0ZSB3YXMgcmVhZCBhbHJlYWR5IHJlYWQgYW5kIHRoZXJlZm9yZSBza2lwcGVkKVxuICAgIGlmIChyZWFzb24gPT09IFwiT1ZFUlJVTlwiKSB7XG4gICAgICAgIHJldHVybiBieXRlcy5sZW5ndGggLSBvZmZzZXQgLSAxO1xuICAgIH1cbiAgICAvLyBOb3RoaW5nIHRvIHNraXBcbiAgICByZXR1cm4gMDtcbn1cbmZ1bmN0aW9uIHJlcGxhY2VGdW5jKHJlYXNvbiwgb2Zmc2V0LCBieXRlcywgb3V0cHV0LCBiYWRDb2RlcG9pbnQpIHtcbiAgICAvLyBPdmVybG9uZyByZXByZXNlbnRhdGlvbnMgYXJlIG90aGVyd2lzZSBcInZhbGlkXCIgY29kZSBwb2ludHM7IGp1c3Qgbm9uLWRlaXN0aW5ndGlzaGVkXG4gICAgaWYgKHJlYXNvbiA9PT0gXCJPVkVSTE9OR1wiKSB7XG4gICAgICAgIGFzc2VydEFyZ3VtZW50KHR5cGVvZiAoYmFkQ29kZXBvaW50KSA9PT0gXCJudW1iZXJcIiwgXCJpbnZhbGlkIGJhZCBjb2RlIHBvaW50IGZvciByZXBsYWNlbWVudFwiLCBcImJhZENvZGVwb2ludFwiLCBiYWRDb2RlcG9pbnQpO1xuICAgICAgICBvdXRwdXQucHVzaChiYWRDb2RlcG9pbnQpO1xuICAgICAgICByZXR1cm4gMDtcbiAgICB9XG4gICAgLy8gUHV0IHRoZSByZXBsYWNlbWVudCBjaGFyYWN0ZXIgaW50byB0aGUgb3V0cHV0XG4gICAgb3V0cHV0LnB1c2goMHhmZmZkKTtcbiAgICAvLyBPdGhlcndpc2UsIHByb2Nlc3MgYXMgaWYgaWdub3JpbmcgZXJyb3JzXG4gICAgcmV0dXJuIGlnbm9yZUZ1bmMocmVhc29uLCBvZmZzZXQsIGJ5dGVzLCBvdXRwdXQsIGJhZENvZGVwb2ludCk7XG59XG4vKipcbiAqICBBIGhhbmRmdWwgb2YgcG9wdWxhciwgYnVpbHQtaW4gVVRGLTggZXJyb3IgaGFuZGxpbmcgc3RyYXRlZ2llcy5cbiAqXG4gKiAgKipgYFwiZXJyb3JcImBgKiogLSB0aHJvd3Mgb24gQU5ZIGlsbGVnYWwgVVRGLTggc2VxdWVuY2Ugb3JcbiAqICBub24tY2Fub25pY2FsIChvdmVybG9uZykgY29kZXBvaW50cyAodGhpcyBpcyB0aGUgZGVmYXVsdClcbiAqXG4gKiAgKipgYFwiaWdub3JlXCJgYCoqIC0gc2lsZW50bHkgZHJvcHMgYW55IGlsbGVnYWwgVVRGLTggc2VxdWVuY2VcbiAqICBhbmQgYWNjZXB0cyBub24tY2Fub25pY2FsIChvdmVybG9uZykgY29kZXBvaW50c1xuICpcbiAqICAqKmBgXCJyZXBsYWNlXCJgYCoqIC0gcmVwbGFjZSBhbnkgaWxsZWdhbCBVVEYtOCBzZXF1ZW5jZSB3aXRoIHRoZVxuICogIFVURi04IHJlcGxhY2VtZW50IGNoYXJhY3RlciAoaS5lLiBgYFwiXFxcXHVmZmZkXCJgYCkgYW5kIGFjY2VwdHNcbiAqICBub24tY2Fub25pY2FsIChvdmVybG9uZykgY29kZXBvaW50c1xuICpcbiAqICBAcmV0dXJuczogUmVjb3JkPFwiZXJyb3JcIiB8IFwiaWdub3JlXCIgfCBcInJlcGxhY2VcIiwgVXRmOEVycm9yRnVuYz5cbiAqL1xuZXhwb3J0IGNvbnN0IFV0ZjhFcnJvckZ1bmNzID0gT2JqZWN0LmZyZWV6ZSh7XG4gICAgZXJyb3I6IGVycm9yRnVuYyxcbiAgICBpZ25vcmU6IGlnbm9yZUZ1bmMsXG4gICAgcmVwbGFjZTogcmVwbGFjZUZ1bmNcbn0pO1xuLy8gaH
26774R0cDovL3N0YWNrb3ZlcmZsb3cuY29tL3F1ZXN0aW9ucy8xMzM1NjQ5My9kZWNvZGUtdXRmLTgtd2l0aC1qYXZhc2NyaXB0IzEzNjkxNDk5XG5mdW5jdGlvbiBnZXRVdGY4Q29kZVBvaW50cyhfYnl0ZXMsIG9uRXJyb3IpIHtcbiAgICBpZiAob25FcnJvciA9PSBudWxsKSB7XG4gICAgICAgIG9uRXJyb3IgPSBVdGY4RXJyb3JGdW5jcy5lcnJvcjtcbiAgICB9XG4gICAgY29uc3QgYnl0ZXMgPSBnZXRCeXRlcyhfYnl0ZXMsIFwiYnl0ZXNcIik7XG4gICAgY29uc3QgcmVzdWx0ID0gW107XG4gICAgbGV0IGkgPSAwO1xuICAgIC8vIEludmFsaWQgYnl0ZXMgYXJlIGlnbm9yZWRcbiAgICB3aGlsZSAoaSA8IGJ5dGVzLmxlbmd0aCkge1xuICAgICAgICBjb25zdCBjID0gYnl0ZXNbaSsrXTtcbiAgICAgICAgLy8gMHh4eCB4eHh4XG4gICAgICAgIGlmIChjID4+IDcgPT09IDApIHtcbiAgICAgICAgICAgIHJlc3VsdC5wdXNoKGMpO1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgLy8gTXVsdGlieXRlOyBob3cgbWFueSBieXRlcyBsZWZ0IGZvciB0aGlzIGNoYXJhY3Rlcj9cbiAgICAgICAgbGV0IGV4dHJhTGVuZ3RoID0gbnVsbDtcbiAgICAgICAgbGV0IG92ZXJsb25nTWFzayA9IG51bGw7XG4gICAgICAgIC8vIDExMHggeHh4eCAxMHh4IHh4eHhcbiAgICAgICAgaWYgKChjICYgMHhlMCkgPT09IDB4YzApIHtcbiAgICAgICAgICAgIGV4dHJhTGVuZ3RoID0gMTtcbiAgICAgICAgICAgIG92ZXJsb25nTWFzayA9IDB4N2Y7XG4gICAgICAgICAgICAvLyAxMTEwIHh4eHggMTB4eCB4eHh4IDEweHggeHh4eFxuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKChjICYgMHhmMCkgPT09IDB4ZTApIHtcbiAgICAgICAgICAgIGV4dHJhTGVuZ3RoID0gMjtcbiAgICAgICAgICAgIG92ZXJsb25nTWFzayA9IDB4N2ZmO1xuICAgICAgICAgICAgLy8gMTExMSAweHh4IDEweHggeHh4eCAxMHh4IHh4eHggMTB4eCB4eHh4XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoKGMgJiAweGY4KSA9PT0gMHhmMCkge1xuICAgICAgICAgICAgZXh0cmFMZW5ndGggPSAzO1xuICAgICAgICAgICAgb3ZlcmxvbmdNYXNrID0gMHhmZmZmO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgaWYgKChjICYgMHhjMCkgPT09IDB4ODApIHtcbiAgICAgICAgICAgICAgICBpICs9IG9uRXJyb3IoXCJVTkVYUEVDVEVEX0NPTlRJTlVFXCIsIGkgLSAxLCBieXRlcywgcmVzdWx0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGkgKz0gb25FcnJvcihcIkJBRF9QUkVGSVhcIiwgaSAtIDEsIGJ5dGVzLCByZXN1bHQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgLy8gRG8gd2UgaGF2ZSBlbm91Z2ggYnl0ZXMgaW4gb3VyIGRhdGE/XG4gICAgICAgIGlmIChpIC0gMSArIGV4dHJhTGVuZ3RoID49IGJ5dGVzLmxlbmd0aCkge1xuICAgICAgICAgICAgaSArPSBvbkVycm9yKFwiT1ZFUlJVTlwiLCBpIC0gMSwgYnl0ZXMsIHJlc3VsdCk7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICAvLyBSZW1vdmUgdGhlIGxlbmd0aCBwcmVmaXggZnJvbSB0aGUgY2hhclxuICAgICAgICBsZXQgcmVzID0gYyAmICgoMSA8PCAoOCAtIGV4dHJhTGVuZ3RoIC0gMSkpIC0gMSk7XG4gICAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgZXh0cmFMZW5ndGg7IGorKykge1xuICAgICAgICAgICAgbGV0IG5leHRDaGFyID0gYnl0ZXNbaV07XG4gICAgICAgICAgICAvLyBJbnZhbGlkIGNvbnRpbnVhdGlvbiBieXRlXG4gICAgICAgICAgICBpZiAoKG5leHRDaGFyICYgMHhjMCkgIT0gMHg4MCkge1xuICAgICAgICAgICAgICAgIGkgKz0gb25FcnJvcihcIk1JU1NJTkdfQ09OVElOVUVcIiwgaSwgYnl0ZXMsIHJlc3VsdCk7XG4gICAgICAgICAgICAgICAgcmVzID0gbnVsbDtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIDtcbiAgICAgICAgICAgIHJlcyA9IChyZXMgPDwgNikgfCAobmV4dENoYXIgJiAweDNmKTtcbiAgICAgICAgICAgIGkrKztcbiAgICAgICAgfVxuICAgICAgICAvLyBTZWUgYWJvdmUgbG9vcCBmb3IgaW52YWxpZCBjb250aW51YXRpb24gYnl0ZVxuICAgICAgICBpZiAocmVzID09PSBudWxsKSB7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICAvLyBNYXhpbXVtIGNvZGUgcG9pbnRcbiAgICAgICAgaWYgKHJlcyA+IDB4MTBmZmZmKSB7XG4gICAgICAgICAgICBpICs9IG9uRXJyb3IoXCJPVVRfT0ZfUkFOR0VcIiwgaSAtIDEgLSBleHRyYUxlbmd0aCwgYnl0ZXMsIHJlc3VsdCwgcmVzKTtcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIC8vIFJlc2VydmVkIGZvciBVVEYtMTYgc3Vycm9nYXRlIGhhbHZlc1xuICAgICAgICBpZiAocmVzID49IDB4ZDgwMCAmJiByZXMgPD0gMHhkZmZmKSB7XG4gICAgICAgICAgICBpICs9IG9uRXJyb3IoXCJVVEYxNl9TVVJST0dBVEVcIiwgaSAtIDEgLSBleHRyYUxlbmd0aCwgYnl0ZXMsIHJlc3VsdCwgcmVzKTtcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIC8vIENoZWNrIGZvciBvdmVybG9uZyBzZXF1ZW5jZXMgKG1vcmUgYnl0ZXMgdGhhbiBuZWVkZWQpXG4gICAgICAgIGlmIChyZXMgPD0gb3ZlcmxvbmdNYXNrKSB7XG4gICAgICAgICAgICBpICs9IG9uRXJyb3IoXCJPVkVSTE9OR1wiLCBpIC0gMSAtIGV4dHJhTGVuZ3RoLCBieXRlcywgcmVzdWx0LCByZXMpO1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgcmVzdWx0LnB1c2gocmVzKTtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbn1cbi8vIGh0dHA6Ly9zdGFja292ZXJmbG93LmNvbS9xdWVzdGlvbnMvMTg3Mjk0MDUvaG93LXRvLWNvbnZlcnQtdXRmOC1zdHJpbmctdG8tYnl0ZS1hcnJheVxuLyoqXG4gKiAgUmV0dXJucyB0aGUgVVRGLTggYnl0ZSByZXByZXNlbnRhdGlvbiBvZiAlJXN0ciUlLlxuICpcbiAqICBJZiAlJWZvcm0lJSBpcyBzcGVjaWZpZWQsIHRoZSBzdHJpbmcgaXMgbm9ybWFsaXplZC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRvVXRmOEJ5dGVzKHN0ciwgZm9ybSkge1xuICAgIGFzc2VydEFyZ3VtZW50KHR5cGVvZiAoc3RyKSA9PT0gXCJzdHJpbmdcIiwgXCJpbnZhbGlkIHN0cmluZyB2YWx1ZVwiLCBcInN0clwiLCBzdHIpO1xuICAgIGlmIChmb3JtICE9IG51bGwpIHtcbiAgICAgICAgYXNzZXJ0Tm9ybWFsaXplKGZvcm0pO1xuICAgICAgICBzdHIgPSBzdHIubm9ybWFsaXplKGZvcm0pO1xuICAgIH1cbiAgICBsZXQgcmVzdWx0ID0gW107XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBzdHIubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgY29uc3QgYyA9IHN0ci5jaGFyQ29kZUF0KGkpO1xuICAgICAgICBpZiAoYyA8IDB4ODApIHtcbiAgICAgICAgICAgI
26774HJlc3VsdC5wdXNoKGMpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGMgPCAweDgwMCkge1xuICAgICAgICAgICAgcmVzdWx0LnB1c2goKGMgPj4gNikgfCAweGMwKTtcbiAgICAgICAgICAgIHJlc3VsdC5wdXNoKChjICYgMHgzZikgfCAweDgwKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmICgoYyAmIDB4ZmMwMCkgPT0gMHhkODAwKSB7XG4gICAgICAgICAgICBpKys7XG4gICAgICAgICAgICBjb25zdCBjMiA9IHN0ci5jaGFyQ29kZUF0KGkpO1xuICAgICAgICAgICAgYXNzZXJ0QXJndW1lbnQoaSA8IHN0ci5sZW5ndGggJiYgKChjMiAmIDB4ZmMwMCkgPT09IDB4ZGMwMCksIFwiaW52YWxpZCBzdXJyb2dhdGUgcGFpclwiLCBcInN0clwiLCBzdHIpO1xuICAgICAgICAgICAgLy8gU3Vycm9nYXRlIFBhaXJcbiAgICAgICAgICAgIGNvbnN0IHBhaXIgPSAweDEwMDAwICsgKChjICYgMHgwM2ZmKSA8PCAxMCkgKyAoYzIgJiAweDAzZmYpO1xuICAgICAgICAgICAgcmVzdWx0LnB1c2goKHBhaXIgPj4gMTgpIHwgMHhmMCk7XG4gICAgICAgICAgICByZXN1bHQucHVzaCgoKHBhaXIgPj4gMTIpICYgMHgzZikgfCAweDgwKTtcbiAgICAgICAgICAgIHJlc3VsdC5wdXNoKCgocGFpciA+PiA2KSAmIDB4M2YpIHwgMHg4MCk7XG4gICAgICAgICAgICByZXN1bHQucHVzaCgocGFpciAmIDB4M2YpIHwgMHg4MCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICByZXN1bHQucHVzaCgoYyA+PiAxMikgfCAweGUwKTtcbiAgICAgICAgICAgIHJlc3VsdC5wdXNoKCgoYyA+PiA2KSAmIDB4M2YpIHwgMHg4MCk7XG4gICAgICAgICAgICByZXN1bHQucHVzaCgoYyAmIDB4M2YpIHwgMHg4MCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG5ldyBVaW50OEFycmF5KHJlc3VsdCk7XG59XG47XG4vL2V4cG9ydCBcbmZ1bmN0aW9uIF90b1V0ZjhTdHJpbmcoY29kZVBvaW50cykge1xuICAgIHJldHVybiBjb2RlUG9pbnRzLm1hcCgoY29kZVBvaW50KSA9PiB7XG4gICAgICAgIGlmIChjb2RlUG9pbnQgPD0gMHhmZmZmKSB7XG4gICAgICAgICAgICByZXR1cm4gU3RyaW5nLmZyb21DaGFyQ29kZShjb2RlUG9pbnQpO1xuICAgICAgICB9XG4gICAgICAgIGNvZGVQb2ludCAtPSAweDEwMDAwO1xuICAgICAgICByZXR1cm4gU3RyaW5nLmZyb21DaGFyQ29kZSgoKChjb2RlUG9pbnQgPj4gMTApICYgMHgzZmYpICsgMHhkODAwKSwgKChjb2RlUG9pbnQgJiAweDNmZikgKyAweGRjMDApKTtcbiAgICB9KS5qb2luKFwiXCIpO1xufVxuLyoqXG4gKiAgUmV0dXJucyB0aGUgc3RyaW5nIHJlcHJlc2VudGVkIGJ5IHRoZSBVVEYtOCBkYXRhICUlYnl0ZXMlJS5cbiAqXG4gKiAgV2hlbiAlJW9uRXJyb3IlJSBmdW5jdGlvbiBpcyBzcGVjaWZpZWQsIGl0IGlzIGNhbGxlZCBvbiBVVEYtOFxuICogIGVycm9ycyBhbGxvd2luZyByZWNvdmVyeSB1c2luZyB0aGUgW1tVdGY4RXJyb3JGdW5jXV0gQVBJLlxuICogIChkZWZhdWx0OiBbZXJyb3JdKFV0ZjhFcnJvckZ1bmNzKSlcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRvVXRmOFN0cmluZyhieXRlcywgb25FcnJvcikge1xuICAgIHJldHVybiBfdG9VdGY4U3RyaW5nKGdldFV0ZjhDb2RlUG9pbnRzKGJ5dGVzLCBvbkVycm9yKSk7XG59XG4vKipcbiAqICBSZXR1cm5zIHRoZSBVVEYtOCBjb2RlLXBvaW50cyBmb3IgJSVzdHIlJS5cbiAqXG4gKiAgSWYgJSVmb3JtJSUgaXMgc3BlY2lmaWVkLCB0aGUgc3RyaW5nIGlzIG5vcm1hbGl6ZWQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0b1V0ZjhDb2RlUG9pbnRzKHN0ciwgZm9ybSkge1xuICAgIHJldHVybiBnZXRVdGY4Q29kZVBvaW50cyh0b1V0ZjhCeXRlcyhzdHIsIGZvcm0pKTtcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXV0ZjguanMubWFwIiwiaW1wb3J0IHsgYXNzZXJ0LCBtYWtlRXJyb3IgfSBmcm9tIFwiLi9lcnJvcnMuanNcIjtcbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVHZXRVcmwob3B0aW9ucykge1xuICAgIGFzeW5jIGZ1bmN0aW9uIGdldFVybChyZXEsIF9zaWduYWwpIHtcbiAgICAgICAgYXNzZXJ0KF9zaWduYWwgPT0gbnVsbCB8fCAhX3NpZ25hbC5jYW5jZWxsZWQsIFwicmVxdWVzdCBjYW5jZWxsZWQgYmVmb3JlIHNlbmRpbmdcIiwgXCJDQU5DRUxMRURcIik7XG4gICAgICAgIGNvbnN0IHByb3RvY29sID0gcmVxLnVybC5zcGxpdChcIjpcIilbMF0udG9Mb3dlckNhc2UoKTtcbiAgICAgICAgYXNzZXJ0KHByb3RvY29sID09PSBcImh0dHBcIiB8fCBwcm90b2NvbCA9PT0gXCJodHRwc1wiLCBgdW5zdXBwb3J0ZWQgcHJvdG9jb2wgJHtwcm90b2NvbH1gLCBcIlVOU1VQUE9SVEVEX09QRVJBVElPTlwiLCB7XG4gICAgICAgICAgICBpbmZvOiB7IHByb3RvY29sIH0sXG4gICAgICAgICAgICBvcGVyYXRpb246IFwicmVxdWVzdFwiXG4gICAgICAgIH0pO1xuICAgICAgICBhc3NlcnQocHJvdG9jb2wgPT09IFwiaHR0cHNcIiB8fCAhcmVxLmNyZWRlbnRpYWxzIHx8IHJlcS5hbGxvd0luc2VjdXJlQXV0aGVudGljYXRpb24sIFwiaW5zZWN1cmUgYXV0aG9yaXplZCBjb25uZWN0aW9ucyB1bnN1cHBvcnRlZFwiLCBcIlVOU1VQUE9SVEVEX09QRVJBVElPTlwiLCB7XG4gICAgICAgICAgICBvcGVyYXRpb246IFwicmVxdWVzdFwiXG4gICAgICAgIH0pO1xuICAgICAgICBsZXQgZXJyb3IgPSBudWxsO1xuICAgICAgICBjb25zdCBjb250cm9sbGVyID0gbmV3IEFib3J0Q29udHJvbGxlcigpO1xuICAgICAgICBjb25zdCB0aW1lciA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgZXJyb3IgPSBtYWtlRXJyb3IoXCJyZXF1ZXN0IHRpbWVvdXRcIiwgXCJUSU1FT1VUXCIpO1xuICAgICAgICAgICAgY29udHJvbGxlci5hYm9ydCgpO1xuICAgICAgICB9LCByZXEudGltZW91dCk7XG4gICAgICAgIGlmIChfc2lnbmFsKSB7XG4gICAgICAgICAgICBfc2lnbmFsLmFkZExpc3RlbmVyKCgpID0+IHtcbiAgICAgICAgICAgICAgICBlcnJvciA9IG1ha2VFcnJvcihcInJlcXVlc3QgY2FuY2VsbGVkXCIsIFwiQ0FOQ0VMTEVEXCIpO1xuICAgICAgICAgICAgICAgIGNvbnRyb2xsZXIuYWJvcnQoKTtcbiAgICAgICAgICAgI
26774H0pO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGluaXQgPSBPYmplY3QuYXNzaWduKHt9LCBvcHRpb25zLCB7XG4gICAgICAgICAgICBtZXRob2Q6IHJlcS5tZXRob2QsXG4gICAgICAgICAgICBoZWFkZXJzOiBuZXcgSGVhZGVycyhBcnJheS5mcm9tKHJlcSkpLFxuICAgICAgICAgICAgYm9keTogcmVxLmJvZHkgfHwgdW5kZWZpbmVkLFxuICAgICAgICAgICAgc2lnbmFsOiBjb250cm9sbGVyLnNpZ25hbFxuICAgICAgICB9KTtcbiAgICAgICAgbGV0IHJlc3A7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICByZXNwID0gYXdhaXQgZmV0Y2gocmVxLnVybCwgaW5pdCk7XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKF9lcnJvcikge1xuICAgICAgICAgICAgY2xlYXJUaW1lb3V0KHRpbWVyKTtcbiAgICAgICAgICAgIGlmIChlcnJvcikge1xuICAgICAgICAgICAgICAgIHRocm93IGVycm9yO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhyb3cgX2Vycm9yO1xuICAgICAgICB9XG4gICAgICAgIGNsZWFyVGltZW91dCh0aW1lcik7XG4gICAgICAgIGNvbnN0IGhlYWRlcnMgPSB7fTtcbiAgICAgICAgcmVzcC5oZWFkZXJzLmZvckVhY2goKHZhbHVlLCBrZXkpID0+IHtcbiAgICAgICAgICAgIGhlYWRlcnNba2V5LnRvTG93ZXJDYXNlKCldID0gdmFsdWU7XG4gICAgICAgIH0pO1xuICAgICAgICBjb25zdCByZXNwQm9keSA9IGF3YWl0IHJlc3AuYXJyYXlCdWZmZXIoKTtcbiAgICAgICAgY29uc3QgYm9keSA9IChyZXNwQm9keSA9PSBudWxsKSA/IG51bGwgOiBuZXcgVWludDhBcnJheShyZXNwQm9keSk7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBzdGF0dXNDb2RlOiByZXNwLnN0YXR1cyxcbiAgICAgICAgICAgIHN0YXR1c01lc3NhZ2U6IHJlc3Auc3RhdHVzVGV4dCxcbiAgICAgICAgICAgIGhlYWRlcnMsIGJvZHlcbiAgICAgICAgfTtcbiAgICB9XG4gICAgcmV0dXJuIGdldFVybDtcbn1cbi8vIEBUT0RPOiByZW1vdmUgaW4gdjc7IHByb3ZpZGVkIGZvciBiYWNrd2FyZHMgY29tcGF0XG5jb25zdCBkZWZhdWx0R2V0VXJsID0gY3JlYXRlR2V0VXJsKHt9KTtcbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZXRVcmwocmVxLCBfc2lnbmFsKSB7XG4gICAgcmV0dXJuIGRlZmF1bHRHZXRVcmwocmVxLCBfc2lnbmFsKTtcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWdldHVybC1icm93c2VyLmpzLm1hcCIsIi8qKlxuICogIEZldGNoaW5nIGNvbnRlbnQgZnJvbSB0aGUgd2ViIGlzIGVudmlyb25tZW50LXNwZWNpZmljLCBzbyBFdGhlcnNcbiAqICBwcm92aWRlcyBhbiBhYnN0cmFjdGlvbiB0aGF0IGVhY2ggZW52aXJvbm1lbnQgY2FuIGltcGxlbWVudCB0byBwcm92aWRlXG4gKiAgdGhpcyBzZXJ2aWNlLlxuICpcbiAqICBPbiBbTm9kZS5qc10obGluay1ub2RlKSwgdGhlIGBgaHR0cGBgIGFuZCBgYGh0dHBzYGAgbGlicyBhcmUgdXNlZCB0b1xuICogIGNyZWF0ZSBhIHJlcXVlc3Qgb2JqZWN0LCByZWdpc3RlciBldmVudCBsaXN0ZW5lcnMgYW5kIHByb2Nlc3MgZGF0YVxuICogIGFuZCBwb3B1bGF0ZSB0aGUgW1tGZXRjaFJlc3BvbnNlXV0uXG4gKlxuICogIEluIGEgYnJvd3NlciwgdGhlIFtET00gZmV0Y2hdKGxpbmstanMtZmV0Y2gpIGlzIHVzZWQsIGFuZCB0aGUgcmVzdWx0aW5nXG4gKiAgYGBQcm9taXNlYGAgaXMgd2FpdGVkIG9uIHRvIHJldHJpZXZlIHRoZSBwYXlsb2FkLlxuICpcbiAqICBUaGUgW1tGZXRjaFJlcXVlc3RdXSBpcyByZXNwb25zaWJsZSBmb3IgaGFuZGxpbmcgbWFueSBjb21tb24gc2l0dWF0aW9ucyxcbiAqICBzdWNoIGFzIHJlZGlyZWN0cywgc2VydmVyIHRocm90dGxpbmcsIGF1dGhlbnRpY2F0aW9uLCBldGMuXG4gKlxuICogIEl0IGFsc28gaGFuZGxlcyBjb21tb24gZ2F0ZXdheXMsIHN1Y2ggYXMgSVBGUyBhbmQgZGF0YSBVUklzLlxuICpcbiAqICBAX3NlY3Rpb24gYXBpL3V0aWxzL2ZldGNoaW5nOkZldGNoaW5nIFdlYiBDb250ZW50ICBbYWJvdXQtZmV0Y2hdXG4gKi9cbmltcG9ydCB7IGRlY29kZUJhc2U2NCwgZW5jb2RlQmFzZTY0IH0gZnJvbSBcIi4vYmFzZTY0LmpzXCI7XG5pbXBvcnQgeyBoZXhsaWZ5IH0gZnJvbSBcIi4vZGF0YS5qc1wiO1xuaW1wb3J0IHsgYXNzZXJ0LCBhc3NlcnRBcmd1bWVudCB9IGZyb20gXCIuL2Vycm9ycy5qc1wiO1xuaW1wb3J0IHsgZGVmaW5lUHJvcGVydGllcyB9IGZyb20gXCIuL3Byb3BlcnRpZXMuanNcIjtcbmltcG9ydCB7IHRvVXRmOEJ5dGVzLCB0b1V0ZjhTdHJpbmcgfSBmcm9tIFwiLi91dGY4LmpzXCI7XG5pbXBvcnQgeyBjcmVhdGVHZXRVcmwgfSBmcm9tIFwiLi9nZXR1cmwuanNcIjtcbmNvbnN0IE1BWF9BVFRFTVBUUyA9IDEyO1xuY29uc3QgU0xPVF9JTlRFUlZBTCA9IDI1MDtcbi8vIFRoZSBnbG9iYWwgRmV0Y2hHZXRVcmxGdW5jIGltcGxlbWVudGF0aW9uLlxubGV0IGRlZmF1bHRHZXRVcmxGdW5jID0gY3JlYXRlR2V0VXJsKCk7XG5jb25zdCByZURhdGEgPSBuZXcgUmVnRXhwKFwiXmRhdGE6KFteOzpdKik/KDtiYXNlNjQpPywoLiopJFwiLCBcImlcIik7XG5jb25zdCByZUlwZnMgPSBuZXcgUmVnRXhwKFwiXmlwZnM6L1xcLyhpcGZzLyk/KC4qKSRcIiwgXCJpXCIpO1xuLy8gSWYgbG9ja2VkLCBuZXcgR2F0ZXdheXMgY2Fubm90IGJlIGFkZGVkXG5sZXQgbG9ja2VkID0gZmFsc2U7XG4vLyBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9IVFRQL0Jhc2ljc19vZl9IVFRQL0RhdGFfVVJMc1xuYXN5bmMgZnVuY3Rpb24gZGF0YUdhdGV3YXlGdW5jKHVybCwgc2lnbmFsKSB7XG4gICAgdHJ5IHtcbiAgICAgICAgY29uc3QgbWF0Y2ggPSB1cmwubWF0Y2gocmVEYXRhKTtcbiAgICAgICAgaWYgKCFtYXRjaCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiaW52YWxpZCBkYXRhXCIpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBuZXcgRmV0Y2hSZXNwb25zZSgyMDAsIFwiT0tcIiwge1xuICAgICAgICAgICAgXCJjb250ZW50LXR5cGVcIjogKG1hdGNoWzFdIHx8IFwidGV4dC9wbGFpblwiKSxcbiAgICAgICAgfSwgKG1hdGNoWzJdID8gZGVjb2RlQmFzZTY0KG1hdGNoWzNdKSA6IHVucGVyY2VudChtYXRjaFszXSkpKTtcbiAgICB9XG4gICAgY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgI
26774HJldHVybiBuZXcgRmV0Y2hSZXNwb25zZSg1OTksIFwiQkFEIFJFUVVFU1QgKGludmFsaWQgZGF0YTogVVJJKVwiLCB7fSwgbnVsbCwgbmV3IEZldGNoUmVxdWVzdCh1cmwpKTtcbiAgICB9XG59XG4vKipcbiAqICBSZXR1cm5zIGEgW1tGZXRjaEdhdGV3YXlGdW5jXV0gZm9yIGZldGNoaW5nIGNvbnRlbnQgZnJvbSBhIHN0YW5kYXJkXG4gKiAgSVBGUyBnYXRld2F5IGhvc3RlZCBhdCAlJWJhc2VVcmwlJS5cbiAqL1xuZnVuY3Rpb24gZ2V0SXBmc0dhdGV3YXlGdW5jKGJhc2VVcmwpIHtcbiAgICBhc3luYyBmdW5jdGlvbiBnYXRld2F5SXBmcyh1cmwsIHNpZ25hbCkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgY29uc3QgbWF0Y2ggPSB1cmwubWF0Y2gocmVJcGZzKTtcbiAgICAgICAgICAgIGlmICghbWF0Y2gpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJpbnZhbGlkIGxpbmtcIik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gbmV3IEZldGNoUmVxdWVzdChgJHtiYXNlVXJsfSR7bWF0Y2hbMl19YCk7XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICByZXR1cm4gbmV3IEZldGNoUmVzcG9uc2UoNTk5LCBcIkJBRCBSRVFVRVNUIChpbnZhbGlkIElQRlMgVVJJKVwiLCB7fSwgbnVsbCwgbmV3IEZldGNoUmVxdWVzdCh1cmwpKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZ2F0ZXdheUlwZnM7XG59XG5jb25zdCBHYXRld2F5cyA9IHtcbiAgICBcImRhdGFcIjogZGF0YUdhdGV3YXlGdW5jLFxuICAgIFwiaXBmc1wiOiBnZXRJcGZzR2F0ZXdheUZ1bmMoXCJodHRwczovXFwvZ2F0ZXdheS5pcGZzLmlvL2lwZnMvXCIpXG59O1xuY29uc3QgZmV0Y2hTaWduYWxzID0gbmV3IFdlYWtNYXAoKTtcbi8qKlxuICogIEBfaWdub3JlXG4gKi9cbmV4cG9ydCBjbGFzcyBGZXRjaENhbmNlbFNpZ25hbCB7XG4gICAgI2xpc3RlbmVycztcbiAgICAjY2FuY2VsbGVkO1xuICAgIGNvbnN0cnVjdG9yKHJlcXVlc3QpIHtcbiAgICAgICAgdGhpcy4jbGlzdGVuZXJzID0gW107XG4gICAgICAgIHRoaXMuI2NhbmNlbGxlZCA9IGZhbHNlO1xuICAgICAgICBmZXRjaFNpZ25hbHMuc2V0KHJlcXVlc3QsICgpID0+IHtcbiAgICAgICAgICAgIGlmICh0aGlzLiNjYW5jZWxsZWQpIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLiNjYW5jZWxsZWQgPSB0cnVlO1xuICAgICAgICAgICAgZm9yIChjb25zdCBsaXN0ZW5lciBvZiB0aGlzLiNsaXN0ZW5lcnMpIHtcbiAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHsgbGlzdGVuZXIoKTsgfSwgMCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLiNsaXN0ZW5lcnMgPSBbXTtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIGFkZExpc3RlbmVyKGxpc3RlbmVyKSB7XG4gICAgICAgIGFzc2VydCghdGhpcy4jY2FuY2VsbGVkLCBcInNpbmdhbCBhbHJlYWR5IGNhbmNlbGxlZFwiLCBcIlVOU1VQUE9SVEVEX09QRVJBVElPTlwiLCB7XG4gICAgICAgICAgICBvcGVyYXRpb246IFwiZmV0Y2hDYW5jZWxTaWduYWwuYWRkQ2FuY2VsTGlzdGVuZXJcIlxuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy4jbGlzdGVuZXJzLnB1c2gobGlzdGVuZXIpO1xuICAgIH1cbiAgICBnZXQgY2FuY2VsbGVkKCkgeyByZXR1cm4gdGhpcy4jY2FuY2VsbGVkOyB9XG4gICAgY2hlY2tTaWduYWwoKSB7XG4gICAgICAgIGFzc2VydCghdGhpcy5jYW5jZWxsZWQsIFwiY2FuY2VsbGVkXCIsIFwiQ0FOQ0VMTEVEXCIsIHt9KTtcbiAgICB9XG59XG4vLyBDaGVjayB0aGUgc2lnbmFsLCB0aHJvd2luZyBpZiBpdCBpcyBjYW5jZWxsZWRcbmZ1bmN0aW9uIGNoZWNrU2lnbmFsKHNpZ25hbCkge1xuICAgIGlmIChzaWduYWwgPT0gbnVsbCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJtaXNzaW5nIHNpZ25hbDsgc2hvdWxkIG5vdCBoYXBwZW5cIik7XG4gICAgfVxuICAgIHNpZ25hbC5jaGVja1NpZ25hbCgpO1xuICAgIHJldHVybiBzaWduYWw7XG59XG4vKipcbiAqICBSZXByZXNlbnRzIGEgcmVxdWVzdCBmb3IgYSByZXNvdXJjZSB1c2luZyBhIFVSSS5cbiAqXG4gKiAgQnkgZGVmYXVsdCwgdGhlIHN1cHBvcnRlZCBzY2hlbWVzIGFyZSBgYEhUVFBgYCwgYGBIVFRQU2BgLCBgYGRhdGE6YGAsXG4gKiAgYW5kIGBgSVBGUzpgYC5cbiAqXG4gKiAgQWRkaXRpb25hbCBzY2hlbWVzIGNhbiBiZSBhZGRlZCBnbG9iYWxseSB1c2luZyBbW3JlZ2lzdGVyR2F0ZXdheV1dLlxuICpcbiAqICBAZXhhbXBsZTpcbiAqICAgIHJlcSA9IG5ldyBGZXRjaFJlcXVlc3QoXCJodHRwczovL3d3dy5yaWNtb28uY29tXCIpXG4gKiAgICByZXNwID0gYXdhaXQgcmVxLnNlbmQoKVxuICogICAgcmVzcC5ib2R5Lmxlbmd0aFxuICogICAgLy9fcmVzdWx0OlxuICovXG5leHBvcnQgY2xhc3MgRmV0Y2hSZXF1ZXN0IHtcbiAgICAjYWxsb3dJbnNlY3VyZTtcbiAgICAjZ3ppcDtcbiAgICAjaGVhZGVycztcbiAgICAjbWV0aG9kO1xuICAgICN0aW1lb3V0O1xuICAgICN1cmw7XG4gICAgI2JvZHk7XG4gICAgI2JvZHlUeXBlO1xuICAgICNjcmVkcztcbiAgICAvLyBIb29rc1xuICAgICNwcmVmbGlnaHQ7XG4gICAgI3Byb2Nlc3M7XG4gICAgI3JldHJ5O1xuICAgICNzaWduYWw7XG4gICAgI3Rocm90dGxlO1xuICAgICNnZXRVcmxGdW5jO1xuICAgIC8qKlxuICAgICAqICBUaGUgZmV0Y2ggVVJMIHRvIHJlcXVlc3QuXG4gICAgICovXG4gICAgZ2V0IHVybCgpIHsgcmV0dXJuIHRoaXMuI3VybDsgfVxuICAgIHNldCB1cmwodXJsKSB7XG4gICAgICAgIHRoaXMuI3VybCA9IFN0cmluZyh1cmwpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiAgVGhlIGZldGNoIGJvZHksIGlmIGFueSwgdG8gc2VuZCBhcyB0aGUgcmVxdWVzdCBib2R5LiAvLyhkZWZhdWx0OiBudWxsKS8vXG4gICAgICpcbiAgICAgKiAgV2hlbiBzZXR0aW5nIGEgYm9keSwgdGhlIGludHJpbnNpYyBgYENvbnRlbnQtVHlwZWBgIGlzIGF1dG9tYXRpY2FsbHlcbiAgICAgKiAgc2V0IGFuZCB3aWxsIGJlIHVzZWQgaWYgKipub3Qgb3ZlcnJpZGRlbioqIGJ5IHNldH
26774RpbmcgYSBjdXN0b21cbiAgICAgKiAgaGVhZGVyLlxuICAgICAqXG4gICAgICogIElmICUlYm9keSUlIGlzIG51bGwsIHRoZSBib2R5IGlzIGNsZWFyZWQgKGFsb25nIHdpdGggdGhlXG4gICAgICogIGludHJpbnNpYyBgYENvbnRlbnQtVHlwZWBgKS5cbiAgICAgKlxuICAgICAqICBJZiAlJWJvZHklJSBpcyBhIHN0cmluZywgdGhlIGludHJpbnNpYyBgYENvbnRlbnQtVHlwZWBgIGlzIHNldCB0b1xuICAgICAqICBgYHRleHQvcGxhaW5gYC5cbiAgICAgKlxuICAgICAqICBJZiAlJWJvZHklJSBpcyBhIFVpbnQ4QXJyYXksIHRoZSBpbnRyaW5zaWMgYGBDb250ZW50LVR5cGVgYCBpcyBzZXQgdG9cbiAgICAgKiAgYGBhcHBsaWNhdGlvbi9vY3RldC1zdHJlYW1gYC5cbiAgICAgKlxuICAgICAqICBJZiAlJWJvZHklJSBpcyBhbnkgb3RoZXIgb2JqZWN0LCB0aGUgaW50cmluc2ljIGBgQ29udGVudC1UeXBlYGAgaXNcbiAgICAgKiAgc2V0IHRvIGBgYXBwbGljYXRpb24vanNvbmBgLlxuICAgICAqL1xuICAgIGdldCBib2R5KCkge1xuICAgICAgICBpZiAodGhpcy4jYm9keSA9PSBudWxsKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbmV3IFVpbnQ4QXJyYXkodGhpcy4jYm9keSk7XG4gICAgfVxuICAgIHNldCBib2R5KGJvZHkpIHtcbiAgICAgICAgaWYgKGJvZHkgPT0gbnVsbCkge1xuICAgICAgICAgICAgdGhpcy4jYm9keSA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIHRoaXMuI2JvZHlUeXBlID0gdW5kZWZpbmVkO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHR5cGVvZiAoYm9keSkgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgICAgIHRoaXMuI2JvZHkgPSB0b1V0ZjhCeXRlcyhib2R5KTtcbiAgICAgICAgICAgIHRoaXMuI2JvZHlUeXBlID0gXCJ0ZXh0L3BsYWluXCI7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoYm9keSBpbnN0YW5jZW9mIFVpbnQ4QXJyYXkpIHtcbiAgICAgICAgICAgIHRoaXMuI2JvZHkgPSBib2R5O1xuICAgICAgICAgICAgdGhpcy4jYm9keVR5cGUgPSBcImFwcGxpY2F0aW9uL29jdGV0LXN0cmVhbVwiO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHR5cGVvZiAoYm9keSkgPT09IFwib2JqZWN0XCIpIHtcbiAgICAgICAgICAgIHRoaXMuI2JvZHkgPSB0b1V0ZjhCeXRlcyhKU09OLnN0cmluZ2lmeShib2R5KSk7XG4gICAgICAgICAgICB0aGlzLiNib2R5VHlwZSA9IFwiYXBwbGljYXRpb24vanNvblwiO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiaW52YWxpZCBib2R5XCIpO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqICBSZXR1cm5zIHRydWUgaWYgdGhlIHJlcXVlc3QgaGFzIGEgYm9keS5cbiAgICAgKi9cbiAgICBoYXNCb2R5KCkge1xuICAgICAgICByZXR1cm4gKHRoaXMuI2JvZHkgIT0gbnVsbCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqICBUaGUgSFRUUCBtZXRob2QgdG8gdXNlIHdoZW4gcmVxdWVzdGluZyB0aGUgVVJJLiBJZiBubyBtZXRob2RcbiAgICAgKiAgaGFzIGJlZW4gZXhwbGljaXRseSBzZXQsIHRoZW4gYGBHRVRgYCBpcyB1c2VkIGlmIHRoZSBib2R5IGlzXG4gICAgICogIG51bGwgYW5kIGBgUE9TVGBgIG90aGVyd2lzZS5cbiAgICAgKi9cbiAgICBnZXQgbWV0aG9kKCkge1xuICAgICAgICBpZiAodGhpcy4jbWV0aG9kKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy4jbWV0aG9kO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLmhhc0JvZHkoKSkge1xuICAgICAgICAgICAgcmV0dXJuIFwiUE9TVFwiO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBcIkdFVFwiO1xuICAgIH1cbiAgICBzZXQgbWV0aG9kKG1ldGhvZCkge1xuICAgICAgICBpZiAobWV0aG9kID09IG51bGwpIHtcbiAgICAgICAgICAgIG1ldGhvZCA9IFwiXCI7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy4jbWV0aG9kID0gU3RyaW5nKG1ldGhvZCkudG9VcHBlckNhc2UoKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogIFRoZSBoZWFkZXJzIHRoYXQgd2lsbCBiZSB1c2VkIHdoZW4gcmVxdWVzdGluZyB0aGUgVVJJLiBBbGxcbiAgICAgKiAga2V5cyBhcmUgbG93ZXItY2FzZS5cbiAgICAgKlxuICAgICAqICBUaGlzIG9iamVjdCBpcyBhIGNvcHksIHNvIGFueSBjaGFuZ2VzIHdpbGwgKipOT1QqKiBiZSByZWZsZWN0ZWRcbiAgICAgKiAgaW4gdGhlIGBgRmV0Y2hSZXF1ZXN0YGAuXG4gICAgICpcbiAgICAgKiAgVG8gc2V0IGEgaGVhZGVyIGVudHJ5LCB1c2UgdGhlIGBgc2V0SGVhZGVyYGAgbWV0aG9kLlxuICAgICAqL1xuICAgIGdldCBoZWFkZXJzKCkge1xuICAgICAgICBjb25zdCBoZWFkZXJzID0gT2JqZWN0LmFzc2lnbih7fSwgdGhpcy4jaGVhZGVycyk7XG4gICAgICAgIGlmICh0aGlzLiNjcmVkcykge1xuICAgICAgICAgICAgaGVhZGVyc1tcImF1dGhvcml6YXRpb25cIl0gPSBgQmFzaWMgJHtlbmNvZGVCYXNlNjQodG9VdGY4Qnl0ZXModGhpcy4jY3JlZHMpKX1gO1xuICAgICAgICB9XG4gICAgICAgIDtcbiAgICAgICAgaWYgKHRoaXMuYWxsb3dHemlwKSB7XG4gICAgICAgICAgICBoZWFkZXJzW1wiYWNjZXB0LWVuY29kaW5nXCJdID0gXCJnemlwXCI7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGhlYWRlcnNbXCJjb250ZW50LXR5cGVcIl0gPT0gbnVsbCAmJiB0aGlzLiNib2R5VHlwZSkge1xuICAgICAgICAgICAgaGVhZGVyc1tcImNvbnRlbnQtdHlwZVwiXSA9IHRoaXMuI2JvZHlUeXBlO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLmJvZHkpIHtcbiAgICAgICAgICAgIGhlYWRlcnNbXCJjb250ZW50LWxlbmd0aFwiXSA9IFN0cmluZyh0aGlzLmJvZHkubGVuZ3RoKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gaGVhZGVycztcbiAgICB9XG4gICAgLyoqXG4gICAgICogIEdldCB0aGUgaGVhZGVyIGZvciAlJWtleSUlLCBpZ25vcmluZyBjYXNlLlxuICAgICAqL1xuICAgIGdldEhlYWRlcihrZXkpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuaGVhZGVyc1trZXkudG9Mb3dlckNhc2UoKV07XG4gICAgfVxuICAgIC8qKlxuICAgICAqICBTZXQgdGhlIGhlYWRlciBmb3IgJSVrZXklJSB0byAlJXZhbHVlJSUuIEFsbCB2YWx1ZXMgYXJlIGNvZXJjZWRcbiAgICAgKiAgdG8gYSBzdHJpbmcuXG4gICAgICovXG4gICAgc2V0SGVhZGVyKGtleSwgdmFsdWUpIHtcbiAgICAgICAgdGhpcy4jaGVhZGVyc1tTdHJpbmc
26774oa2V5KS50b0xvd2VyQ2FzZSgpXSA9IFN0cmluZyh2YWx1ZSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqICBDbGVhciBhbGwgaGVhZGVycywgcmVzZXR0aW5nIGFsbCBpbnRyaW5zaWMgaGVhZGVycy5cbiAgICAgKi9cbiAgICBjbGVhckhlYWRlcnMoKSB7XG4gICAgICAgIHRoaXMuI2hlYWRlcnMgPSB7fTtcbiAgICB9XG4gICAgW1N5bWJvbC5pdGVyYXRvcl0oKSB7XG4gICAgICAgIGNvbnN0IGhlYWRlcnMgPSB0aGlzLmhlYWRlcnM7XG4gICAgICAgIGNvbnN0IGtleXMgPSBPYmplY3Qua2V5cyhoZWFkZXJzKTtcbiAgICAgICAgbGV0IGluZGV4ID0gMDtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIG5leHQ6ICgpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoaW5kZXggPCBrZXlzLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBrZXkgPSBrZXlzW2luZGV4KytdO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6IFtrZXksIGhlYWRlcnNba2V5XV0sIGRvbmU6IGZhbHNlXG4gICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiB7IHZhbHVlOiB1bmRlZmluZWQsIGRvbmU6IHRydWUgfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogIFRoZSB2YWx1ZSB0aGF0IHdpbGwgYmUgc2VudCBmb3IgdGhlIGBgQXV0aG9yaXphdGlvbmBgIGhlYWRlci5cbiAgICAgKlxuICAgICAqICBUbyBzZXQgdGhlIGNyZWRlbnRpYWxzLCB1c2UgdGhlIGBgc2V0Q3JlZGVudGlhbHNgYCBtZXRob2QuXG4gICAgICovXG4gICAgZ2V0IGNyZWRlbnRpYWxzKCkge1xuICAgICAgICByZXR1cm4gdGhpcy4jY3JlZHMgfHwgbnVsbDtcbiAgICB9XG4gICAgLyoqXG4gICAgICogIFNldHMgYW4gYGBBdXRob3JpemF0aW9uYGAgZm9yICUldXNlcm5hbWUlJSB3aXRoICUlcGFzc3dvcmQlJS5cbiAgICAgKi9cbiAgICBzZXRDcmVkZW50aWFscyh1c2VybmFtZSwgcGFzc3dvcmQpIHtcbiAgICAgICAgYXNzZXJ0QXJndW1lbnQoIXVzZXJuYW1lLm1hdGNoKC86LyksIFwiaW52YWxpZCBiYXNpYyBhdXRoZW50aWNhdGlvbiB1c2VybmFtZVwiLCBcInVzZXJuYW1lXCIsIFwiW1JFREFDVEVEXVwiKTtcbiAgICAgICAgdGhpcy4jY3JlZHMgPSBgJHt1c2VybmFtZX06JHtwYXNzd29yZH1gO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiAgRW5hYmxlIGFuZCByZXF1ZXN0IGd6aXAtZW5jb2RlZCByZXNwb25zZXMuIFRoZSByZXNwb25zZSB3aWxsXG4gICAgICogIGF1dG9tYXRpY2FsbHkgYmUgZGVjb21wcmVzc2VkLiAvLyhkZWZhdWx0OiB0cnVlKS8vXG4gICAgICovXG4gICAgZ2V0IGFsbG93R3ppcCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuI2d6aXA7XG4gICAgfVxuICAgIHNldCBhbGxvd0d6aXAodmFsdWUpIHtcbiAgICAgICAgdGhpcy4jZ3ppcCA9ICEhdmFsdWU7XG4gICAgfVxuICAgIC8qKlxuICAgICAqICBBbGxvdyBgYEF1dGhlbnRpY2F0aW9uYGAgY3JlZGVudGlhbHMgdG8gYmUgc2VudCBvdmVyIGluc2VjdXJlXG4gICAgICogIGNoYW5uZWxzLiAvLyhkZWZhdWx0OiBmYWxzZSkvL1xuICAgICAqL1xuICAgIGdldCBhbGxvd0luc2VjdXJlQXV0aGVudGljYXRpb24oKSB7XG4gICAgICAgIHJldHVybiAhIXRoaXMuI2FsbG93SW5zZWN1cmU7XG4gICAgfVxuICAgIHNldCBhbGxvd0luc2VjdXJlQXV0aGVudGljYXRpb24odmFsdWUpIHtcbiAgICAgICAgdGhpcy4jYWxsb3dJbnNlY3VyZSA9ICEhdmFsdWU7XG4gICAgfVxuICAgIC8qKlxuICAgICAqICBUaGUgdGltZW91dCAoaW4gbWlsbGlzZWNvbmRzKSB0byB3YWl0IGZvciBhIGNvbXBsZXRlIHJlc3BvbnNlLlxuICAgICAqICAvLyhkZWZhdWx0OiA1IG1pbnV0ZXMpLy9cbiAgICAgKi9cbiAgICBnZXQgdGltZW91dCgpIHsgcmV0dXJuIHRoaXMuI3RpbWVvdXQ7IH1cbiAgICBzZXQgdGltZW91dCh0aW1lb3V0KSB7XG4gICAgICAgIGFzc2VydEFyZ3VtZW50KHRpbWVvdXQgPj0gMCwgXCJ0aW1lb3V0IG11c3QgYmUgbm9uLXplcm9cIiwgXCJ0aW1lb3V0XCIsIHRpbWVvdXQpO1xuICAgICAgICB0aGlzLiN0aW1lb3V0ID0gdGltZW91dDtcbiAgICB9XG4gICAgLyoqXG4gICAgICogIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHByaW9yIHRvIGVhY2ggcmVxdWVzdCwgZm9yIGV4YW1wbGVcbiAgICAgKiAgZHVyaW5nIGEgcmVkaXJlY3Rpb24gb3IgcmV0cnkgaW4gY2FzZSBvZiBzZXJ2ZXIgdGhyb3R0bGluZy5cbiAgICAgKlxuICAgICAqICBUaGlzIG9mZmVycyBhbiBvcHBvcnR1bml0eSB0byBwb3B1bGF0ZSBoZWFkZXJzIG9yIHVwZGF0ZVxuICAgICAqICBjb250ZW50IGJlZm9yZSBzZW5kaW5nIGEgcmVxdWVzdC5cbiAgICAgKi9cbiAgICBnZXQgcHJlZmxpZ2h0RnVuYygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuI3ByZWZsaWdodCB8fCBudWxsO1xuICAgIH1cbiAgICBzZXQgcHJlZmxpZ2h0RnVuYyhwcmVmbGlnaHQpIHtcbiAgICAgICAgdGhpcy4jcHJlZmxpZ2h0ID0gcHJlZmxpZ2h0O1xuICAgIH1cbiAgICAvKipcbiAgICAgKiAgVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgYWZ0ZXIgZWFjaCByZXNwb25zZSwgb2ZmZXJpbmcgYW5cbiAgICAgKiAgb3Bwb3J0dW5pdHkgdG8gcHJvdmlkZSBjbGllbnQtbGV2ZWwgdGhyb3R0bGluZyBvciB1cGRhdGluZ1xuICAgICAqICByZXNwb25zZSBkYXRhLlxuICAgICAqXG4gICAgICogIEFueSBlcnJvciB0aHJvd24gaW4gdGhpcyBjYXVzZXMgdGhlIGBgc2VuZCgpYGAgdG8gdGhyb3cuXG4gICAgICpcbiAgICAgKiAgVG8gc2NoZWR1bGUgYSByZXRyeSBhdHRlbXB0IChhc3N1bWluZyB0aGUgbWF4aW11bSByZXRyeSBsaW1pdFxuICAgICAqICBoYXMgbm90IGJlZW4gcmVhY2hlZCksIHVzZSBbW3Jlc3BvbnNlLnRocm93VGhyb3R0bGVFcnJvcl1dLlxuICAgICAqL1xuICAgIGdldCBwcm9jZXNzRnVuYygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuI3Byb2Nlc3MgfHwgbnVsbDtcbiAgICB9XG4gICAgc2V0IHByb2Nlc3NGdW5jKHByb2Nlc3MpIHtcbiAgICAgICAgdGhpcy4jcHJvY2VzcyA9IHByb2Nlc3M7XG4gICAgfVxuICAgIC8qKlxuICAgICAqICBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBvbiBlYWNoIHJldHJ5IGF0dGVtcHQuXG4gICAgICovXG4gICAgZ2V0IHJldHJ5RnVuYygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuI3JldHJ5IHx8IG51bGw7XG4gICAgfVxuICAgIHNldCByZXRyeUZ1bmMocmV0cnkpIHtcbiAgICAgICAgdGhpcy4jcmV0cnkgPSByZXRyeTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHRvIGZldGNoIGNvbnRlbnQgZnJvbSBIVFRQIGFuZFxuICAgICAqICBIVFRQUyBVUkxzIGFuZCBpcyBwbGF0Zm9ybSBzcGVjaWZpYyAoZS5nLiBub2RlanMgdnNcbiAgICAgKiAgYnJvd3NlcnMpLlxuICAgICAqXG4gICAgICogIFRoaXMgaXMgYnkgZGVmYXVsdCB0aGUgY3VycmVudGx5IHJlZ2lzdGVyZWQgZ2xvYmFsIGdldFVybFxuICAgICAqICBmdW5jdGlvbiwgd2hpY2ggY2FuIGJlIGNoYW5nZWQgdXNpbmcgW1tyZWdpc3RlckdldFVybF1dLlxuICAgICAqICBJZiB0aGlzIGhhcyBiZWVuIHNldCwgc2V0dGluZyBpcyB0byBgYG51bGxgYCB3aWxsIGNhdXNlXG4gICAgICogIHRoaXMgRmV0Y2hSZXF1ZXN0IChhbmQgYW55IGZ1dHVyZSBjbG9uZXMpIHRvIHJldmVydCBiYWNrIHRvXG4gICAgICogIHVzaW5nIHRoZSBjdXJyZW50bHkgcmVnaXN0ZXJlZCBnbG9iYWwgZ2V0VXJsIGZ1bmN0aW9uLlxuICAgICAqXG4gICAgICogIFNldHRpbmcgdGhpcyBpcyBnZW5lcmFsbHkgbm90IG5lY2Vzc2FyeSwgYnV0IG1heSBiZSB1c2VmdWxcbiAgICAgKiAgZm9yIGRldmVsb3BlcnMgdGhhdCB3aXNoIHRvIGludGVyY2VwdCByZXF1ZXN0cyBvciB0b1xuICAgICAqICBjb25maWd1cmVnZSBhIHByb3h5IG9yIG9
267740aGVyIGFnZW50LlxuICAgICAqL1xuICAgIGdldCBnZXRVcmxGdW5jKCkge1xuICAgICAgICByZXR1cm4gdGhpcy4jZ2V0VXJsRnVuYyB8fCBkZWZhdWx0R2V0VXJsRnVuYztcbiAgICB9XG4gICAgc2V0IGdldFVybEZ1bmModmFsdWUpIHtcbiAgICAgICAgdGhpcy4jZ2V0VXJsRnVuYyA9IHZhbHVlO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiAgQ3JlYXRlIGEgbmV3IEZldGNoUmVxdWVzdCBpbnN0YW5jZSB3aXRoIGRlZmF1bHQgdmFsdWVzLlxuICAgICAqXG4gICAgICogIE9uY2UgY3JlYXRlZCwgZWFjaCBwcm9wZXJ0eSBtYXkgYmUgc2V0IGJlZm9yZSBpc3N1aW5nIGFcbiAgICAgKiAgYGAuc2VuZCgpYGAgdG8gbWFrZSB0aGUgcmVxdWVzdC5cbiAgICAgKi9cbiAgICBjb25zdHJ1Y3Rvcih1cmwpIHtcbiAgICAgICAgdGhpcy4jdXJsID0gU3RyaW5nKHVybCk7XG4gICAgICAgIHRoaXMuI2FsbG93SW5zZWN1cmUgPSBmYWxzZTtcbiAgICAgICAgdGhpcy4jZ3ppcCA9IHRydWU7XG4gICAgICAgIHRoaXMuI2hlYWRlcnMgPSB7fTtcbiAgICAgICAgdGhpcy4jbWV0aG9kID0gXCJcIjtcbiAgICAgICAgdGhpcy4jdGltZW91dCA9IDMwMDAwMDtcbiAgICAgICAgdGhpcy4jdGhyb3R0bGUgPSB7XG4gICAgICAgICAgICBzbG90SW50ZXJ2YWw6IFNMT1RfSU5URVJWQUwsXG4gICAgICAgICAgICBtYXhBdHRlbXB0czogTUFYX0FUVEVNUFRTXG4gICAgICAgIH07XG4gICAgICAgIHRoaXMuI2dldFVybEZ1bmMgPSBudWxsO1xuICAgIH1cbiAgICB0b1N0cmluZygpIHtcbiAgICAgICAgcmV0dXJuIGA8RmV0Y2hSZXF1ZXN0IG1ldGhvZD0ke0pTT04uc3RyaW5naWZ5KHRoaXMubWV0aG9kKX0gdXJsPSR7SlNPTi5zdHJpbmdpZnkodGhpcy51cmwpfSBoZWFkZXJzPSR7SlNPTi5zdHJpbmdpZnkodGhpcy5oZWFkZXJzKX0gYm9keT0ke3RoaXMuI2JvZHkgPyBoZXhsaWZ5KHRoaXMuI2JvZHkpIDogXCJudWxsXCJ9PmA7XG4gICAgfVxuICAgIC8qKlxuICAgICAqICBVcGRhdGUgdGhlIHRocm90dGxlIHBhcmFtZXRlcnMgdXNlZCB0byBkZXRlcm1pbmUgbWF4aW11bVxuICAgICAqICBhdHRlbXB0cyBhbmQgZXhwb25lbnRpYWwtYmFja29mZiBwcm9wZXJ0aWVzLlxuICAgICAqL1xuICAgIHNldFRocm90dGxlUGFyYW1zKHBhcmFtcykge1xuICAgICAgICBpZiAocGFyYW1zLnNsb3RJbnRlcnZhbCAhPSBudWxsKSB7XG4gICAgICAgICAgICB0aGlzLiN0aHJvdHRsZS5zbG90SW50ZXJ2YWwgPSBwYXJhbXMuc2xvdEludGVydmFsO1xuICAgICAgICB9XG4gICAgICAgIGlmIChwYXJhbXMubWF4QXR0ZW1wdHMgIT0gbnVsbCkge1xuICAgICAgICAgICAgdGhpcy4jdGhyb3R0bGUubWF4QXR0ZW1wdHMgPSBwYXJhbXMubWF4QXR0ZW1wdHM7XG4gICAgICAgIH1cbiAgICB9XG4gICAgYXN5bmMgI3NlbmQoYXR0ZW1wdCwgZXhwaXJlcywgZGVsYXksIF9yZXF1ZXN0LCBfcmVzcG9uc2UpIHtcbiAgICAgICAgaWYgKGF0dGVtcHQgPj0gdGhpcy4jdGhyb3R0bGUubWF4QXR0ZW1wdHMpIHtcbiAgICAgICAgICAgIHJldHVybiBfcmVzcG9uc2UubWFrZVNlcnZlckVycm9yKFwiZXhjZWVkZWQgbWF4aW11bSByZXRyeSBsaW1pdFwiKTtcbiAgICAgICAgfVxuICAgICAgICBhc3NlcnQoZ2V0VGltZSgpIDw9IGV4cGlyZXMsIFwidGltZW91dFwiLCBcIlRJTUVPVVRcIiwge1xuICAgICAgICAgICAgb3BlcmF0aW9uOiBcInJlcXVlc3Quc2VuZFwiLCByZWFzb246IFwidGltZW91dFwiLCByZXF1ZXN0OiBfcmVxdWVzdFxuICAgICAgICB9KTtcbiAgICAgICAgaWYgKGRlbGF5ID4gMCkge1xuICAgICAgICAgICAgYXdhaXQgd2FpdChkZWxheSk7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IHJlcSA9IHRoaXMuY2xvbmUoKTtcbiAgICAgICAgY29uc3Qgc2NoZW1lID0gKHJlcS51cmwuc3BsaXQoXCI6XCIpWzBdIHx8IFwiXCIpLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgIC8vIFByb2Nlc3MgYW55IEdhdGV3YXlzXG4gICAgICAgIGlmIChzY2hlbWUgaW4gR2F0ZXdheXMpIHtcbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IEdhdGV3YXlzW3NjaGVtZV0ocmVxLnVybCwgY2hlY2tTaWduYWwoX3JlcXVlc3QuI3NpZ25hbCkpO1xuICAgICAgICAgICAgaWYgKHJlc3VsdCBpbnN0YW5jZW9mIEZldGNoUmVzcG9uc2UpIHtcbiAgICAgICAgICAgICAgICBsZXQgcmVzcG9uc2UgPSByZXN1bHQ7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMucHJvY2Vzc0Z1bmMpIHtcbiAgICAgICAgICAgICAgICAgICAgY2hlY2tTaWduYWwoX3JlcXVlc3QuI3NpZ25hbCk7XG4gICAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXNwb25zZSA9IGF3YWl0IHRoaXMucHJvY2Vzc0Z1bmMocmVxLCByZXNwb25zZSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBTb21ldGhpbmcgd2VudCB3cm9uZyBkdXJpbmcgcHJvY2Vzc2luZzsgdGhyb3cgYSA1eHggc2VydmVyIGVycm9yXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZXJyb3IudGhyb3R0bGUgPT0gbnVsbCB8fCB0eXBlb2YgKGVycm9yLnN0YWxsKSAhPT0gXCJudW1iZXJcIikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3BvbnNlLm1ha2VTZXJ2ZXJFcnJvcihcImVycm9yIGluIHBvc3QtcHJvY2Vzc2luZyBmdW5jdGlvblwiLCBlcnJvcikuYXNzZXJ0T2soKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIElnbm9yZSB0aHJvdHRsaW5nXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlc3BvbnNlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmVxID0gcmVzdWx0O1xuICAgICAgICB9XG4gICAgICAgIC8vIFdlIGhhdmUgYSBwcmVmbGlnaHQgZnVuY3Rpb247IHVwZGF0ZSB0aGUgcmVxdWVzdFxuICAgICAgICBpZiAodGhpcy5wcmVmbGlnaHRGdW5jKSB7XG4gICAgICAgICAgICByZXEgPSBhd2FpdCB0aGlzLnByZWZsaWdodEZ1bmMocmVxKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCByZXNwID0gYXdhaXQgdGhpcy5nZXRVcmxGdW5jKHJlcSwgY2hlY2tTaWduYWwoX3JlcXVlc3QuI3NpZ25hbCkpO1xuICAgICAgICBsZXQgcmVzcG9uc2UgPSBuZXcgRmV0Y2hSZXNwb25zZShyZXNwLnN0YXR1c0NvZGUsIHJlc3Auc3RhdHVzTWVzc2FnZSwgcmVzcC5oZWFkZXJzLCByZXNwLmJvZHksIF9yZXF1ZXN0KTtcbiAgICAgICAgaWYgKFszMDEsI
26774DMwMiwgMzA3LCAzMDhdLmluZGV4T2YocmVzcG9uc2Uuc3RhdHVzQ29kZSkgPj0gMCkge1xuICAgICAgICAgICAgLy8gUmVkaXJlY3RcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgY29uc3QgbG9jYXRpb24gPSByZXNwb25zZS5oZWFkZXJzLmxvY2F0aW9uIHx8IFwiXCI7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlcS5yZWRpcmVjdChsb2NhdGlvbikuI3NlbmQoYXR0ZW1wdCArIDEsIGV4cGlyZXMsIDAsIF9yZXF1ZXN0LCByZXNwb25zZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXRjaCAoZXJyb3IpIHsgfVxuICAgICAgICAgICAgLy8gVGhpbmdzIHdvbid0IGdldCBhbnkgYmV0dGVyIG9uIGFub3RoZXIgYXR0ZW1wdDsgYWJvcnRcbiAgICAgICAgICAgIHJldHVybiByZXNwb25zZTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChyZXNwb25zZS5zdGF0dXNDb2RlID09PSA0MjkpIHtcbiAgICAgICAgICAgIC8vIFRocm90dGxlXG4gICAgICAgICAgICBpZiAodGhpcy5yZXRyeUZ1bmMgPT0gbnVsbCB8fCAoYXdhaXQgdGhpcy5yZXRyeUZ1bmMocmVxLCByZXNwb25zZSwgYXR0ZW1wdCkpKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgcmV0cnlBZnRlciA9IHJlc3BvbnNlLmhlYWRlcnNbXCJyZXRyeS1hZnRlclwiXTtcbiAgICAgICAgICAgICAgICBsZXQgZGVsYXkgPSB0aGlzLiN0aHJvdHRsZS5zbG90SW50ZXJ2YWwgKiBNYXRoLnRydW5jKE1hdGgucmFuZG9tKCkgKiBNYXRoLnBvdygyLCBhdHRlbXB0KSk7XG4gICAgICAgICAgICAgICAgaWYgKHR5cGVvZiAocmV0cnlBZnRlcikgPT09IFwic3RyaW5nXCIgJiYgcmV0cnlBZnRlci5tYXRjaCgvXlsxLTldWzAtOV0qJC8pKSB7XG4gICAgICAgICAgICAgICAgICAgIGRlbGF5ID0gcGFyc2VJbnQocmV0cnlBZnRlcik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiByZXEuY2xvbmUoKS4jc2VuZChhdHRlbXB0ICsgMSwgZXhwaXJlcywgZGVsYXksIF9yZXF1ZXN0LCByZXNwb25zZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMucHJvY2Vzc0Z1bmMpIHtcbiAgICAgICAgICAgIGNoZWNrU2lnbmFsKF9yZXF1ZXN0LiNzaWduYWwpO1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICByZXNwb25zZSA9IGF3YWl0IHRoaXMucHJvY2Vzc0Z1bmMocmVxLCByZXNwb25zZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgICAgICAvLyBTb21ldGhpbmcgd2VudCB3cm9uZyBkdXJpbmcgcHJvY2Vzc2luZzsgdGhyb3cgYSA1eHggc2VydmVyIGVycm9yXG4gICAgICAgICAgICAgICAgaWYgKGVycm9yLnRocm90dGxlID09IG51bGwgfHwgdHlwZW9mIChlcnJvci5zdGFsbCkgIT09IFwibnVtYmVyXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzcG9uc2UubWFrZVNlcnZlckVycm9yKFwiZXJyb3IgaW4gcG9zdC1wcm9jZXNzaW5nIGZ1bmN0aW9uXCIsIGVycm9yKS5hc3NlcnRPaygpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAvLyBUaHJvdHRsZVxuICAgICAgICAgICAgICAgIGxldCBkZWxheSA9IHRoaXMuI3Rocm90dGxlLnNsb3RJbnRlcnZhbCAqIE1hdGgudHJ1bmMoTWF0aC5yYW5kb20oKSAqIE1hdGgucG93KDIsIGF0dGVtcHQpKTtcbiAgICAgICAgICAgICAgICA7XG4gICAgICAgICAgICAgICAgaWYgKGVycm9yLnN0YWxsID49IDApIHtcbiAgICAgICAgICAgICAgICAgICAgZGVsYXkgPSBlcnJvci5zdGFsbDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlcS5jbG9uZSgpLiNzZW5kKGF0dGVtcHQgKyAxLCBleHBpcmVzLCBkZWxheSwgX3JlcXVlc3QsIHJlc3BvbnNlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzcG9uc2U7XG4gICAgfVxuICAgIC8qKlxuICAgICAqICBSZXNvbHZlcyB0byB0aGUgcmVzcG9uc2UgYnkgc2VuZGluZyB0aGUgcmVxdWVzdC5cbiAgICAgKi9cbiAgICBzZW5kKCkge1xuICAgICAgICBhc3NlcnQodGhpcy4jc2lnbmFsID09IG51bGwsIFwicmVxdWVzdCBhbHJlYWR5IHNlbnRcIiwgXCJVTlNVUFBPUlRFRF9PUEVSQVRJT05cIiwgeyBvcGVyYXRpb246IFwiZmV0Y2hSZXF1ZXN0LnNlbmRcIiB9KTtcbiAgICAgICAgdGhpcy4jc2lnbmFsID0gbmV3IEZldGNoQ2FuY2VsU2lnbmFsKHRoaXMpO1xuICAgICAgICByZXR1cm4gdGhpcy4jc2VuZCgwLCBnZXRUaW1lKCkgKyB0aGlzLnRpbWVvdXQsIDAsIHRoaXMsIG5ldyBGZXRjaFJlc3BvbnNlKDAsIFwiXCIsIHt9LCBudWxsLCB0aGlzKSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqICBDYW5jZWxzIHRoZSBpbmZsaWdodCByZXNwb25zZSwgY2F1c2luZyBhIGBgQ0FOQ0VMTEVEYGBcbiAgICAgKiAgZXJyb3IgdG8gYmUgcmVqZWN0ZWQgZnJvbSB0aGUgW1tzZW5kXV0uXG4gICAgICovXG4gICAgY2FuY2VsKCkge1xuICAgICAgICBhc3NlcnQodGhpcy4jc2lnbmFsICE9IG51bGwsIFwicmVxdWVzdCBoYXMgbm90IGJlZW4gc2VudFwiLCBcIlVOU1VQUE9SVEVEX09QRVJBVElPTlwiLCB7IG9wZXJhdGlvbjogXCJmZXRjaFJlcXVlc3QuY2FuY2VsXCIgfSk7XG4gICAgICAgIGNvbnN0IHNpZ25hbCA9IGZldGNoU2lnbmFscy5nZXQodGhpcyk7XG4gICAgICAgIGlmICghc2lnbmFsKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJtaXNzaW5nIHNpZ25hbDsgc2hvdWxkIG5vdCBoYXBwZW5cIik7XG4gICAgICAgIH1cbiAgICAgICAgc2lnbmFsKCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqICBSZXR1cm5zIGEgbmV3IFtbRmV0Y2hSZXF1ZXN0XV0gdGhhdCByZXByZXNlbnRzIHRoZSByZWRpcmVjdGlvblxuICAgICAqICB0byAlJWxvY2F0aW9uJSUuXG4gICAgICovXG4gICAgcmVkaXJlY3QobG9jYXRpb24pIHtcbiAgICAgICAgLy8gUmVkaXJlY3Rpb247IGZvciBub3cgd2Ugb25seSBzdXBwb3J0IGFic29sdXRlIGxvY2F0aW9uc1xuICAgICAgICBjb25zdCBjdXJyZW50ID0gdGhpcy51cmwuc3BsaXQoXCI6XCIpWzBdLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgIGNvbnN0IHRhcmdldCA9IGxvY2F0aW9uLnNwbGl0KFwiOlwiKVswXS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICAvLyBEb24ndCBhbGxvdyByZWRpcmVjdGluZzpcbiAgICAgICAgLy8gLSBkb3duZ3JhZGluZyB0aGUgc2VjdXJpdHkgKGUuZy4gaHR0cHMgPT4gaH
26774R0cClcbiAgICAgICAgLy8gLSB0byBub24tSFRUUCAob3Igbm9uLUhUVFBTKSBwcm90b2NvbHMgW3RoaXMgY291bGQgYmUgcmVsYXhlZD9dXG4gICAgICAgIGFzc2VydCgoY3VycmVudCAhPT0gXCJodHRwc1wiIHx8IHRhcmdldCAhPT0gXCJodHRwXCIpICYmIGxvY2F0aW9uLm1hdGNoKC9eaHR0cHM/Oi8pLCBgdW5zdXBwb3J0ZWQgcmVkaXJlY3RgLCBcIlVOU1VQUE9SVEVEX09QRVJBVElPTlwiLCB7XG4gICAgICAgICAgICBvcGVyYXRpb246IGByZWRpcmVjdCgke3RoaXMubWV0aG9kfSAke0pTT04uc3RyaW5naWZ5KHRoaXMudXJsKX0gPT4gJHtKU09OLnN0cmluZ2lmeShsb2NhdGlvbil9KWBcbiAgICAgICAgfSk7XG4gICAgICAgIC8vIENyZWF0ZSBhIGNvcHkgb2YgdGhpcyByZXF1ZXN0LCB3aXRoIGEgbmV3IFVSTFxuICAgICAgICBjb25zdCByZXEgPSBuZXcgRmV0Y2hSZXF1ZXN0KGxvY2F0aW9uKTtcbiAgICAgICAgcmVxLm1ldGhvZCA9IHRoaXMubWV0aG9kO1xuICAgICAgICByZXEuYWxsb3dHemlwID0gdGhpcy5hbGxvd0d6aXA7XG4gICAgICAgIHJlcS50aW1lb3V0ID0gdGhpcy50aW1lb3V0O1xuICAgICAgICByZXEuI2hlYWRlcnMgPSBPYmplY3QuYXNzaWduKHt9LCB0aGlzLiNoZWFkZXJzKTtcbiAgICAgICAgaWYgKHRoaXMuI2JvZHkpIHtcbiAgICAgICAgICAgIHJlcS4jYm9keSA9IG5ldyBVaW50OEFycmF5KHRoaXMuI2JvZHkpO1xuICAgICAgICB9XG4gICAgICAgIHJlcS4jYm9keVR5cGUgPSB0aGlzLiNib2R5VHlwZTtcbiAgICAgICAgLy8gRG8gbm90IGZvcndhcmQgY3JlZGVudGlhbHMgdW5sZXNzIG9uIHRoZSBzYW1lIGRvbWFpbjsgb25seSBhYnNvbHV0ZVxuICAgICAgICAvL3JlcS5hbGxvd0luc2VjdXJlID0gZmFsc2U7XG4gICAgICAgIC8vIHBhdGhzIGFyZSBjdXJyZW50bHkgc3VwcG9ydGVkOyBtYXkgd2FudCBhIHdheSB0byBzcGVjaWZ5IHRvIGZvcndhcmQ/XG4gICAgICAgIC8vc2V0U3RvcmUocmVxLiNwcm9wcywgXCJjcmVkc1wiLCBnZXRTdG9yZSh0aGlzLiNwcm9zLCBcImNyZWRzXCIpKTtcbiAgICAgICAgcmV0dXJuIHJlcTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogIENyZWF0ZSBhIG5ldyBjb3B5IG9mIHRoaXMgcmVxdWVzdC5cbiAgICAgKi9cbiAgICBjbG9uZSgpIHtcbiAgICAgICAgY29uc3QgY2xvbmUgPSBuZXcgRmV0Y2hSZXF1ZXN0KHRoaXMudXJsKTtcbiAgICAgICAgLy8gUHJlc2VydmUgXCJkZWZhdWx0IG1ldGhvZFwiIChpLmUuIG51bGwpXG4gICAgICAgIGNsb25lLiNtZXRob2QgPSB0aGlzLiNtZXRob2Q7XG4gICAgICAgIC8vIFByZXNlcnZlIFwiZGVmYXVsdCBib2R5XCIgd2l0aCB0eXBlLCBjb3B5aW5nIHRoZSBVaW50OEFycmF5IGlzIHByZXNlbnRcbiAgICAgICAgaWYgKHRoaXMuI2JvZHkpIHtcbiAgICAgICAgICAgIGNsb25lLiNib2R5ID0gdGhpcy4jYm9keTtcbiAgICAgICAgfVxuICAgICAgICBjbG9uZS4jYm9keVR5cGUgPSB0aGlzLiNib2R5VHlwZTtcbiAgICAgICAgLy8gUHJlc2VydmUgXCJkZWZhdWx0IGhlYWRlcnNcIlxuICAgICAgICBjbG9uZS4jaGVhZGVycyA9IE9iamVjdC5hc3NpZ24oe30sIHRoaXMuI2hlYWRlcnMpO1xuICAgICAgICAvLyBDcmVkZW50aWFscyBpcyByZWFkb25seSwgc28gd2UgY29weSBpbnRlcm5hbGx5XG4gICAgICAgIGNsb25lLiNjcmVkcyA9IHRoaXMuI2NyZWRzO1xuICAgICAgICBpZiAodGhpcy5hbGxvd0d6aXApIHtcbiAgICAgICAgICAgIGNsb25lLmFsbG93R3ppcCA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgY2xvbmUudGltZW91dCA9IHRoaXMudGltZW91dDtcbiAgICAgICAgaWYgKHRoaXMuYWxsb3dJbnNlY3VyZUF1dGhlbnRpY2F0aW9uKSB7XG4gICAgICAgICAgICBjbG9uZS5hbGxvd0luc2VjdXJlQXV0aGVudGljYXRpb24gPSB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIGNsb25lLiNwcmVmbGlnaHQgPSB0aGlzLiNwcmVmbGlnaHQ7XG4gICAgICAgIGNsb25lLiNwcm9jZXNzID0gdGhpcy4jcHJvY2VzcztcbiAgICAgICAgY2xvbmUuI3JldHJ5ID0gdGhpcy4jcmV0cnk7XG4gICAgICAgIGNsb25lLiN0aHJvdHRsZSA9IE9iamVjdC5hc3NpZ24oe30sIHRoaXMuI3Rocm90dGxlKTtcbiAgICAgICAgY2xvbmUuI2dldFVybEZ1bmMgPSB0aGlzLiNnZXRVcmxGdW5jO1xuICAgICAgICByZXR1cm4gY2xvbmU7XG4gICAgfVxuICAgIC8qKlxuICAgICAqICBMb2NrcyBhbGwgc3RhdGljIGNvbmZpZ3VyYXRpb24gZm9yIGdhdGV3YXlzIGFuZCBGZXRjaEdldFVybEZ1bmNcbiAgICAgKiAgcmVnaXN0cmF0aW9uLlxuICAgICAqL1xuICAgIHN0YXRpYyBsb2NrQ29uZmlnKCkge1xuICAgICAgICBsb2NrZWQgPSB0cnVlO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiAgR2V0IHRoZSBjdXJyZW50IEdhdGV3YXkgZnVuY3Rpb24gZm9yICUlc2NoZW1lJSUuXG4gICAgICovXG4gICAgc3RhdGljIGdldEdhdGV3YXkoc2NoZW1lKSB7XG4gICAgICAgIHJldHVybiBHYXRld2F5c1tzY2hlbWUudG9Mb3dlckNhc2UoKV0gfHwgbnVsbDtcbiAgICB9XG4gICAgLyoqXG4gICAgICogIFVzZSB0aGUgJSVmdW5jJSUgd2hlbiBmZXRjaGluZyBVUklzIHVzaW5nICUlc2NoZW1lJSUuXG4gICAgICpcbiAgICAgKiAgVGhpcyBtZXRob2QgYWZmZWN0cyBhbGwgcmVxdWVzdHMgZ2xvYmFsbHkuXG4gICAgICpcbiAgICAgKiAgSWYgW1tsb2NrQ29uZmlnXV0gaGFzIGJlZW4gY2FsbGVkLCBubyBjaGFuZ2UgaXMgbWFkZSBhbmQgdGhpc1xuICAgICAqICB0aHJvd3MuXG4gICAgICovXG4gICAgc3RhdGljIHJlZ2lzdGVyR2F0ZXdheShzY2hlbWUsIGZ1bmMpIHtcbiAgICAgICAgc2NoZW1lID0gc2NoZW1lLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgIGlmIChzY2hlbWUgPT09IFwiaHR0cFwiIHx8IHNjaGVtZSA9PT0gXCJodHRwc1wiKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYGNhbm5vdCBpbnRlcmNlcHQgJHtzY2hlbWV9OyB1c2UgcmVnaXN0ZXJHZXRVcmxgKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobG9ja2VkKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJnYXRld2F5cyBsb2NrZWRcIik7XG4gICAgICAgI
26774H1cbiAgICAgICAgR2F0ZXdheXNbc2NoZW1lXSA9IGZ1bmM7XG4gICAgfVxuICAgIC8qKlxuICAgICAqICBVc2UgJSVnZXRVcmwlJSB3aGVuIGZldGNoaW5nIFVSSXMgb3ZlciBIVFRQIGFuZCBIVFRQUyByZXF1ZXN0cy5cbiAgICAgKlxuICAgICAqICBUaGlzIG1ldGhvZCBhZmZlY3RzIGFsbCByZXF1ZXN0cyBnbG9iYWxseS5cbiAgICAgKlxuICAgICAqICBJZiBbW2xvY2tDb25maWddXSBoYXMgYmVlbiBjYWxsZWQsIG5vIGNoYW5nZSBpcyBtYWRlIGFuZCB0aGlzXG4gICAgICogIHRocm93cy5cbiAgICAgKi9cbiAgICBzdGF0aWMgcmVnaXN0ZXJHZXRVcmwoZ2V0VXJsKSB7XG4gICAgICAgIGlmIChsb2NrZWQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcImdhdGV3YXlzIGxvY2tlZFwiKTtcbiAgICAgICAgfVxuICAgICAgICBkZWZhdWx0R2V0VXJsRnVuYyA9IGdldFVybDtcbiAgICB9XG4gICAgLyoqXG4gICAgICogIENyZWF0ZXMgYSBnZXRVcmwgZnVuY3Rpb24gdGhhdCBmZXRjaGVzIGNvbnRlbnQgZnJvbSBIVFRQIGFuZFxuICAgICAqICBIVFRQUyBVUkxzLlxuICAgICAqXG4gICAgICogIFRoZSBhdmFpbGFibGUgJSVvcHRpb25zJSUgYXJlIGRlcGVuZGVudCBvbiB0aGUgcGxhdGZvcm1cbiAgICAgKiAgaW1wbGVtZW50YXRpb24gb2YgdGhlIGRlZmF1bHQgZ2V0VXJsIGZ1bmN0aW9uLlxuICAgICAqXG4gICAgICogIFRoaXMgaXMgbm90IGdlbmVyYWxseSBzb21ldGhpbmcgdGhhdCBpcyBuZWVkZWQsIGJ1dCBpcyB1c2VmdWxcbiAgICAgKiAgd2hlbiB0cnlpbmcgdG8gY3VzdG9taXplIHNpbXBsZSBiZWhhdmlvdXIgd2hlbiBmZXRjaGluZyBIVFRQXG4gICAgICogIGNvbnRlbnQuXG4gICAgICovXG4gICAgc3RhdGljIGNyZWF0ZUdldFVybEZ1bmMob3B0aW9ucykge1xuICAgICAgICByZXR1cm4gY3JlYXRlR2V0VXJsKG9wdGlvbnMpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiAgQ3JlYXRlcyBhIGZ1bmN0aW9uIHRoYXQgY2FuIFwiZmV0Y2hcIiBkYXRhIFVSSXMuXG4gICAgICpcbiAgICAgKiAgTm90ZSB0aGF0IHRoaXMgaXMgYXV0b21hdGljYWxseSBkb25lIGludGVybmFsbHkgdG8gc3VwcG9ydFxuICAgICAqICBkYXRhIFVSSXMsIHNvIGl0IGlzIG5vdCBuZWNlc3NhcnkgdG8gcmVnaXN0ZXIgaXQuXG4gICAgICpcbiAgICAgKiAgVGhpcyBpcyBub3QgZ2VuZXJhbGx5IHNvbWV0aGluZyB0aGF0IGlzIG5lZWRlZCwgYnV0IG1heVxuICAgICAqICBiZSB1c2VmdWwgaW4gYSB3cmFwcGVyIHRvIHBlcmZvbSBjdXN0b20gZGF0YSBVUkkgZnVuY3Rpb25hbGl0eS5cbiAgICAgKi9cbiAgICBzdGF0aWMgY3JlYXRlRGF0YUdhdGV3YXkoKSB7XG4gICAgICAgIHJldHVybiBkYXRhR2F0ZXdheUZ1bmM7XG4gICAgfVxuICAgIC8qKlxuICAgICAqICBDcmVhdGVzIGEgZnVuY3Rpb24gdGhhdCB3aWxsIGZldGNoIElQRlMgKHVudmFsaWRhdGVkKSBmcm9tXG4gICAgICogIGEgY3VzdG9tIGdhdGV3YXkgYmFzZVVybC5cbiAgICAgKlxuICAgICAqICBUaGUgZGVmYXVsdCBJUEZTIGdhdGV3YXkgdXNlZCBpbnRlcm5hbGx5IGlzXG4gICAgICogIGBgXCJodHRwczovXFwvZ2F0ZXdheS5pcGZzLmlvL2lwZnMvXCJgYC5cbiAgICAgKi9cbiAgICBzdGF0aWMgY3JlYXRlSXBmc0dhdGV3YXlGdW5jKGJhc2VVcmwpIHtcbiAgICAgICAgcmV0dXJuIGdldElwZnNHYXRld2F5RnVuYyhiYXNlVXJsKTtcbiAgICB9XG59XG47XG4vKipcbiAqICBUaGUgcmVzcG9uc2UgZm9yIGEgRmV0Y2hSZXF1ZXN0LlxuICovXG5leHBvcnQgY2xhc3MgRmV0Y2hSZXNwb25zZSB7XG4gICAgI3N0YXR1c0NvZGU7XG4gICAgI3N0YXR1c01lc3NhZ2U7XG4gICAgI2hlYWRlcnM7XG4gICAgI2JvZHk7XG4gICAgI3JlcXVlc3Q7XG4gICAgI2Vycm9yO1xuICAgIHRvU3RyaW5nKCkge1xuICAgICAgICByZXR1cm4gYDxGZXRjaFJlc3BvbnNlIHN0YXR1cz0ke3RoaXMuc3RhdHVzQ29kZX0gYm9keT0ke3RoaXMuI2JvZHkgPyBoZXhsaWZ5KHRoaXMuI2JvZHkpIDogXCJudWxsXCJ9PmA7XG4gICAgfVxuICAgIC8qKlxuICAgICAqICBUaGUgcmVzcG9uc2Ugc3RhdHVzIGNvZGUuXG4gICAgICovXG4gICAgZ2V0IHN0YXR1c0NvZGUoKSB7IHJldHVybiB0aGlzLiNzdGF0dXNDb2RlOyB9XG4gICAgLyoqXG4gICAgICogIFRoZSByZXNwb25zZSBzdGF0dXMgbWVzc2FnZS5cbiAgICAgKi9cbiAgICBnZXQgc3RhdHVzTWVzc2FnZSgpIHsgcmV0dXJuIHRoaXMuI3N0YXR1c01lc3NhZ2U7IH1cbiAgICAvKipcbiAgICAgKiAgVGhlIHJlc3BvbnNlIGhlYWRlcnMuIEFsbCBrZXlzIGFyZSBsb3dlci1jYXNlLlxuICAgICAqL1xuICAgIGdldCBoZWFkZXJzKCkgeyByZXR1cm4gT2JqZWN0LmFzc2lnbih7fSwgdGhpcy4jaGVhZGVycyk7IH1cbiAgICAvKipcbiAgICAgKiAgVGhlIHJlc3BvbnNlIGJvZHksIG9yIGBgbnVsbGBgIGlmIHRoZXJlIHdhcyBubyBib2R5LlxuICAgICAqL1xuICAgIGdldCBib2R5KCkge1xuICAgICAgICByZXR1cm4gKHRoaXMuI2JvZHkgPT0gbnVsbCkgPyBudWxsIDogbmV3IFVpbnQ4QXJyYXkodGhpcy4jYm9keSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqICBUaGUgcmVzcG9uc2UgYm9keSBhcyBhIFVURi04IGVuY29kZWQgc3RyaW5nLCBvciB0aGUgZW1wdHlcbiAgICAgKiAgc3RyaW5nIChpLmUuIGBgXCJcImBgKSBpZiB0aGVyZSB3YXMgbm8gYm9keS5cbiAgICAgKlxuICAgICAqICBBbiBlcnJvciBpcyB0aHJvd24gaWYgdGhlIGJvZHkgaXMgaW52YWxpZCBVVEYtOCBkYXRhLlxuICAgICAqL1xuICAgIGdldCBib2R5VGV4dCgpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHJldHVybiAodGhpcy4jYm9keSA9PSBudWxsKSA/IFwiXCIgOiB0b1V0ZjhTdHJpbmcodGhpcy4jYm9keSk7XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICBhc3NlcnQoZmFsc2UsIFwicmVzcG9uc2UgYm9keSBpcyBub3QgdmFsaWQgVVRGLTggZGF0YVwiLCBcIlVOU1VQUE9SVEVEX09QRVJBVElPTlwiLCB7XG4gICAgICAgICAgICAgICAgb3BlcmF0aW9uOiBcImJvZHlUZXh0XCIsIGluZm86IHsgcmVzcG9uc2U6IHRoaXMgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgI
26774H1cbiAgICB9XG4gICAgLyoqXG4gICAgICogIFRoZSByZXNwb25zZSBib2R5LCBkZWNvZGVkIGFzIEpTT04uXG4gICAgICpcbiAgICAgKiAgQW4gZXJyb3IgaXMgdGhyb3duIGlmIHRoZSBib2R5IGlzIGludmFsaWQgSlNPTi1lbmNvZGVkIGRhdGFcbiAgICAgKiAgb3IgaWYgdGhlcmUgd2FzIG5vIGJvZHkuXG4gICAgICovXG4gICAgZ2V0IGJvZHlKc29uKCkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgcmV0dXJuIEpTT04ucGFyc2UodGhpcy5ib2R5VGV4dCk7XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICBhc3NlcnQoZmFsc2UsIFwicmVzcG9uc2UgYm9keSBpcyBub3QgdmFsaWQgSlNPTlwiLCBcIlVOU1VQUE9SVEVEX09QRVJBVElPTlwiLCB7XG4gICAgICAgICAgICAgICAgb3BlcmF0aW9uOiBcImJvZHlKc29uXCIsIGluZm86IHsgcmVzcG9uc2U6IHRoaXMgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgW1N5bWJvbC5pdGVyYXRvcl0oKSB7XG4gICAgICAgIGNvbnN0IGhlYWRlcnMgPSB0aGlzLmhlYWRlcnM7XG4gICAgICAgIGNvbnN0IGtleXMgPSBPYmplY3Qua2V5cyhoZWFkZXJzKTtcbiAgICAgICAgbGV0IGluZGV4ID0gMDtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIG5leHQ6ICgpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoaW5kZXggPCBrZXlzLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBrZXkgPSBrZXlzW2luZGV4KytdO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6IFtrZXksIGhlYWRlcnNba2V5XV0sIGRvbmU6IGZhbHNlXG4gICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiB7IHZhbHVlOiB1bmRlZmluZWQsIGRvbmU6IHRydWUgfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICB9XG4gICAgY29uc3RydWN0b3Ioc3RhdHVzQ29kZSwgc3RhdHVzTWVzc2FnZSwgaGVhZGVycywgYm9keSwgcmVxdWVzdCkge1xuICAgICAgICB0aGlzLiNzdGF0dXNDb2RlID0gc3RhdHVzQ29kZTtcbiAgICAgICAgdGhpcy4jc3RhdHVzTWVzc2FnZSA9IHN0YXR1c01lc3NhZ2U7XG4gICAgICAgIHRoaXMuI2hlYWRlcnMgPSBPYmplY3Qua2V5cyhoZWFkZXJzKS5yZWR1Y2UoKGFjY3VtLCBrKSA9PiB7XG4gICAgICAgICAgICBhY2N1bVtrLnRvTG93ZXJDYXNlKCldID0gU3RyaW5nKGhlYWRlcnNba10pO1xuICAgICAgICAgICAgcmV0dXJuIGFjY3VtO1xuICAgICAgICB9LCB7fSk7XG4gICAgICAgIHRoaXMuI2JvZHkgPSAoKGJvZHkgPT0gbnVsbCkgPyBudWxsIDogbmV3IFVpbnQ4QXJyYXkoYm9keSkpO1xuICAgICAgICB0aGlzLiNyZXF1ZXN0ID0gKHJlcXVlc3QgfHwgbnVsbCk7XG4gICAgICAgIHRoaXMuI2Vycm9yID0geyBtZXNzYWdlOiBcIlwiIH07XG4gICAgfVxuICAgIC8qKlxuICAgICAqICBSZXR1cm4gYSBSZXNwb25zZSB3aXRoIG1hdGNoaW5nIGhlYWRlcnMgYW5kIGJvZHksIGJ1dCB3aXRoXG4gICAgICogIGFuIGVycm9yIHN0YXR1cyBjb2RlIChpLmUuIDU5OSkgYW5kICUlbWVzc2FnZSUlIHdpdGggYW5cbiAgICAgKiAgb3B0aW9uYWwgJSVlcnJvciUlLlxuICAgICAqL1xuICAgIG1ha2VTZXJ2ZXJFcnJvcihtZXNzYWdlLCBlcnJvcikge1xuICAgICAgICBsZXQgc3RhdHVzTWVzc2FnZTtcbiAgICAgICAgaWYgKCFtZXNzYWdlKSB7XG4gICAgICAgICAgICBtZXNzYWdlID0gYCR7dGhpcy5zdGF0dXNDb2RlfSAke3RoaXMuc3RhdHVzTWVzc2FnZX1gO1xuICAgICAgICAgICAgc3RhdHVzTWVzc2FnZSA9IGBDTElFTlQgRVNDQUxBVEVEIFNFUlZFUiBFUlJPUiAoJHttZXNzYWdlfSlgO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgc3RhdHVzTWVzc2FnZSA9IGBDTElFTlQgRVNDQUxBVEVEIFNFUlZFUiBFUlJPUiAoJHt0aGlzLnN0YXR1c0NvZGV9ICR7dGhpcy5zdGF0dXNNZXNzYWdlfTsgJHttZXNzYWdlfSlgO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHJlc3BvbnNlID0gbmV3IEZldGNoUmVzcG9uc2UoNTk5LCBzdGF0dXNNZXNzYWdlLCB0aGlzLmhlYWRlcnMsIHRoaXMuYm9keSwgdGhpcy4jcmVxdWVzdCB8fCB1bmRlZmluZWQpO1xuICAgICAgICByZXNwb25zZS4jZXJyb3IgPSB7IG1lc3NhZ2UsIGVycm9yIH07XG4gICAgICAgIHJldHVybiByZXNwb25zZTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogIElmIGNhbGxlZCB3aXRoaW4gYSBbcmVxdWVzdC5wcm9jZXNzRnVuY10oRmV0Y2hSZXF1ZXN0LXByb2Nlc3NGdW5jKVxuICAgICAqICBjYWxsLCBjYXVzZXMgdGhlIHJlcXVlc3QgdG8gcmV0cnkgYXMgaWYgdGhyb3R0bGVkIGZvciAlJXN0YWxsJSVcbiAgICAgKiAgbWlsbGlzZWNvbmRzLlxuICAgICAqL1xuICAgIHRocm93VGhyb3R0bGVFcnJvcihtZXNzYWdlLCBzdGFsbCkge1xuICAgICAgICBpZiAoc3RhbGwgPT0gbnVsbCkge1xuICAgICAgICAgICAgc3RhbGwgPSAtMTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGFzc2VydEFyZ3VtZW50KE51bWJlci5pc0ludGVnZXIoc3RhbGwpICYmIHN0YWxsID49IDAsIFwiaW52YWxpZCBzdGFsbCB0aW1lb3V0XCIsIFwic3RhbGxcIiwgc3RhbGwpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGVycm9yID0gbmV3IEVycm9yKG1lc3NhZ2UgfHwgXCJ0aHJvdHRsaW5nIHJlcXVlc3RzXCIpO1xuICAgICAgICBkZWZpbmVQcm9wZXJ0aWVzKGVycm9yLCB7IHN0YWxsLCB0aHJvdHRsZTogdHJ1ZSB9KTtcbiAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgfVxuICAgIC8qKlxuICAgICAqICBHZXQgdGhlIGhlYWRlciB2YWx1ZSBmb3IgJSVrZXklJSwgaWdub3JpbmcgY2FzZS5cbiAgICAgKi9cbiAgICBnZXRIZWFkZXIoa2V5KSB7XG4gICAgICAgIHJldHVybiB0aGlzLmhlYWRlcnNba2V5LnRvTG93ZXJDYXNlKCldO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiAgUmV0dXJucyB0cnVlIGlmIHRoZSByZXNwb25zZSBoYXMgYSBib2R5LlxuICAgICAqL1xuICAgIGhhc0JvZHkoKSB7XG4gICAgICAgI
26774HJldHVybiAodGhpcy4jYm9keSAhPSBudWxsKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogIFRoZSByZXF1ZXN0IG1hZGUgZm9yIHRoaXMgcmVzcG9uc2UuXG4gICAgICovXG4gICAgZ2V0IHJlcXVlc3QoKSB7IHJldHVybiB0aGlzLiNyZXF1ZXN0OyB9XG4gICAgLyoqXG4gICAgICogIFJldHVybnMgdHJ1ZSBpZiB0aGlzIHJlc3BvbnNlIHdhcyBhIHN1Y2Nlc3Mgc3RhdHVzQ29kZS5cbiAgICAgKi9cbiAgICBvaygpIHtcbiAgICAgICAgcmV0dXJuICh0aGlzLiNlcnJvci5tZXNzYWdlID09PSBcIlwiICYmIHRoaXMuc3RhdHVzQ29kZSA+PSAyMDAgJiYgdGhpcy5zdGF0dXNDb2RlIDwgMzAwKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogIFRocm93cyBhIGBgU0VSVkVSX0VSUk9SYGAgaWYgdGhpcyByZXNwb25zZSBpcyBub3Qgb2suXG4gICAgICovXG4gICAgYXNzZXJ0T2soKSB7XG4gICAgICAgIGlmICh0aGlzLm9rKCkpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBsZXQgeyBtZXNzYWdlLCBlcnJvciB9ID0gdGhpcy4jZXJyb3I7XG4gICAgICAgIGlmIChtZXNzYWdlID09PSBcIlwiKSB7XG4gICAgICAgICAgICBtZXNzYWdlID0gYHNlcnZlciByZXNwb25zZSAke3RoaXMuc3RhdHVzQ29kZX0gJHt0aGlzLnN0YXR1c01lc3NhZ2V9YDtcbiAgICAgICAgfVxuICAgICAgICBsZXQgcmVxdWVzdFVybCA9IG51bGw7XG4gICAgICAgIGlmICh0aGlzLnJlcXVlc3QpIHtcbiAgICAgICAgICAgIHJlcXVlc3RVcmwgPSB0aGlzLnJlcXVlc3QudXJsO1xuICAgICAgICB9XG4gICAgICAgIGxldCByZXNwb25zZUJvZHkgPSBudWxsO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgaWYgKHRoaXMuI2JvZHkpIHtcbiAgICAgICAgICAgICAgICByZXNwb25zZUJvZHkgPSB0b1V0ZjhTdHJpbmcodGhpcy4jYm9keSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKGUpIHsgfVxuICAgICAgICBhc3NlcnQoZmFsc2UsIG1lc3NhZ2UsIFwiU0VSVkVSX0VSUk9SXCIsIHtcbiAgICAgICAgICAgIHJlcXVlc3Q6ICh0aGlzLnJlcXVlc3QgfHwgXCJ1bmtub3duIHJlcXVlc3RcIiksIHJlc3BvbnNlOiB0aGlzLCBlcnJvcixcbiAgICAgICAgICAgIGluZm86IHtcbiAgICAgICAgICAgICAgICByZXF1ZXN0VXJsLCByZXNwb25zZUJvZHksXG4gICAgICAgICAgICAgICAgcmVzcG9uc2VTdGF0dXM6IGAke3RoaXMuc3RhdHVzQ29kZX0gJHt0aGlzLnN0YXR1c01lc3NhZ2V9YFxuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG59XG5mdW5jdGlvbiBnZXRUaW1lKCkgeyByZXR1cm4gKG5ldyBEYXRlKCkpLmdldFRpbWUoKTsgfVxuZnVuY3Rpb24gdW5wZXJjZW50KHZhbHVlKSB7XG4gICAgcmV0dXJuIHRvVXRmOEJ5dGVzKHZhbHVlLnJlcGxhY2UoLyUoWzAtOWEtZl1bMC05YS1mXSkvZ2ksIChhbGwsIGNvZGUpID0+IHtcbiAgICAgICAgcmV0dXJuIFN0cmluZy5mcm9tQ2hhckNvZGUocGFyc2VJbnQoY29kZSwgMTYpKTtcbiAgICB9KSk7XG59XG5mdW5jdGlvbiB3YWl0KGRlbGF5KSB7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiBzZXRUaW1lb3V0KHJlc29sdmUsIGRlbGF5KSk7XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1mZXRjaC5qcy5tYXAiLCIvKipcbiAqICBUaGUgKipGaXhlZE51bWJlcioqIGNsYXNzIHBlcm1pdHMgdXNpbmcgdmFsdWVzIHdpdGggZGVjaW1hbCBwbGFjZXMsXG4gKiAgdXNpbmcgZml4ZWQtcG9udCBtYXRoLlxuICpcbiAqICBGaXhlZC1wb2ludCBtYXRoIGlzIHN0aWxsIGJhc2VkIG9uIGludGVnZXJzIHVuZGVyLXRoZS1ob29kLCBidXQgdXNlcyBhblxuICogIGludGVybmFsIG9mZnNldCB0byBzdG9yZSBmcmFjdGlvbmFsIGNvbXBvbmVudHMgYmVsb3csIGFuZCBlYWNoIG9wZXJhdGlvblxuICogIGNvcnJlY3RzIGZvciB0aGlzIGFmdGVyIGVhY2ggb3BlcmF0aW9uLlxuICpcbiAqICBAX3NlY3Rpb246IGFwaS91dGlscy9maXhlZC1wb2ludC1tYXRoOkZpeGVkLVBvaW50IE1hdGhzICBbYWJvdXQtZml4ZWQtcG9pbnQtbWF0aF1cbiAqL1xuaW1wb3J0IHsgZ2V0Qnl0ZXMgfSBmcm9tIFwiLi9kYXRhLmpzXCI7XG5pbXBvcnQgeyBhc3NlcnQsIGFzc2VydEFyZ3VtZW50LCBhc3NlcnRQcml2YXRlIH0gZnJvbSBcIi4vZXJyb3JzLmpzXCI7XG5pbXBvcnQgeyBnZXRCaWdJbnQsIGdldE51bWJlciwgZnJvbVR3b3MsIG1hc2ssIHRvQmlnSW50IH0gZnJvbSBcIi4vbWF0aHMuanNcIjtcbmltcG9ydCB7IGRlZmluZVByb3BlcnRpZXMgfSBmcm9tIFwiLi9wcm9wZXJ0aWVzLmpzXCI7XG5jb25zdCBCTl9OMSA9IEJpZ0ludCgtMSk7XG5jb25zdCBCTl8wID0gQmlnSW50KDApO1xuY29uc3QgQk5fMSA9IEJpZ0ludCgxKTtcbmNvbnN0IEJOXzUgPSBCaWdJbnQoNSk7XG5jb25zdCBfZ3VhcmQgPSB7fTtcbi8vIENvbnN0YW50IHRvIHB1bGwgemVyb3MgZnJvbSBmb3IgbXVsdGlwbGllcnNcbmxldCBaZXJvcyA9IFwiMDAwMFwiO1xud2hpbGUgKFplcm9zLmxlbmd0aCA8IDgwKSB7XG4gICAgWmVyb3MgKz0gWmVyb3M7XG59XG4vLyBSZXR1cm5zIGEgc3RyaW5nIFwiMVwiIGZvbGxvd2VkIGJ5IGRlY2ltYWwgXCIwXCJzXG5mdW5jdGlvbiBnZXRUZW5zKGRlY2ltYWxzKSB7XG4gICAgbGV0IHJlc3VsdCA9IFplcm9zO1xuICAgIHdoaWxlIChyZXN1bHQubGVuZ3RoIDwgZGVjaW1hbHMpIHtcbiAgICAgICAgcmVzdWx0ICs9IHJlc3VsdDtcbiAgICB9XG4gICAgcmV0dXJuIEJpZ0ludChcIjFcIiArIHJlc3VsdC5zdWJzdHJpbmcoMCwgZGVjaW1hbHMpKTtcbn1cbmZ1bmN0aW9uIGNoZWNrVmFsdWUodmFsLCBmb3JtYXQsIHNhZmVPcCkge1xuICAgIGNvbnN0IHdpZHRoID0gQmlnSW50KGZvcm1hdC53aWR0aCk7XG4gICAgaWYgKGZvcm1hdC5zaWduZWQpIHtcbiAgICAgICAgY29uc3QgbGltaXQgPSAoQk5fMSA8PCAod2lkdGggLSBCTl8xKSk7XG4gICAgICAgIGFzc2VydChzYWZlT3AgPT0gbnVsbCB8fCAodmFsID49IC1saW1pdCAmJiB2YWwgPCBsaW1pdCksIFwib3ZlcmZsb3dcIiwgXCJOVU1FUklDX0ZBVUxUXCIsIHtcbiAgICAgICAgICAgIG9wZXJhdGlvbj
26774ogc2FmZU9wLCBmYXVsdDogXCJvdmVyZmxvd1wiLCB2YWx1ZTogdmFsXG4gICAgICAgIH0pO1xuICAgICAgICBpZiAodmFsID4gQk5fMCkge1xuICAgICAgICAgICAgdmFsID0gZnJvbVR3b3MobWFzayh2YWwsIHdpZHRoKSwgd2lkdGgpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdmFsID0gLWZyb21Ud29zKG1hc2soLXZhbCwgd2lkdGgpLCB3aWR0aCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIGNvbnN0IGxpbWl0ID0gKEJOXzEgPDwgd2lkdGgpO1xuICAgICAgICBhc3NlcnQoc2FmZU9wID09IG51bGwgfHwgKHZhbCA+PSAwICYmIHZhbCA8IGxpbWl0KSwgXCJvdmVyZmxvd1wiLCBcIk5VTUVSSUNfRkFVTFRcIiwge1xuICAgICAgICAgICAgb3BlcmF0aW9uOiBzYWZlT3AsIGZhdWx0OiBcIm92ZXJmbG93XCIsIHZhbHVlOiB2YWxcbiAgICAgICAgfSk7XG4gICAgICAgIHZhbCA9ICgoKHZhbCAlIGxpbWl0KSArIGxpbWl0KSAlIGxpbWl0KSAmIChsaW1pdCAtIEJOXzEpO1xuICAgIH1cbiAgICByZXR1cm4gdmFsO1xufVxuZnVuY3Rpb24gZ2V0Rm9ybWF0KHZhbHVlKSB7XG4gICAgaWYgKHR5cGVvZiAodmFsdWUpID09PSBcIm51bWJlclwiKSB7XG4gICAgICAgIHZhbHVlID0gYGZpeGVkMTI4eCR7dmFsdWV9YDtcbiAgICB9XG4gICAgbGV0IHNpZ25lZCA9IHRydWU7XG4gICAgbGV0IHdpZHRoID0gMTI4O1xuICAgIGxldCBkZWNpbWFscyA9IDE4O1xuICAgIGlmICh0eXBlb2YgKHZhbHVlKSA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgICAvLyBQYXJzZSB0aGUgZm9ybWF0IHN0cmluZ1xuICAgICAgICBpZiAodmFsdWUgPT09IFwiZml4ZWRcIikge1xuICAgICAgICAgICAgLy8gZGVmYXVsdHMuLi5cbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmICh2YWx1ZSA9PT0gXCJ1Zml4ZWRcIikge1xuICAgICAgICAgICAgc2lnbmVkID0gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBjb25zdCBtYXRjaCA9IHZhbHVlLm1hdGNoKC9eKHU/KWZpeGVkKFswLTldKyl4KFswLTldKykkLyk7XG4gICAgICAgICAgICBhc3NlcnRBcmd1bWVudChtYXRjaCwgXCJpbnZhbGlkIGZpeGVkIGZvcm1hdFwiLCBcImZvcm1hdFwiLCB2YWx1ZSk7XG4gICAgICAgICAgICBzaWduZWQgPSAobWF0Y2hbMV0gIT09IFwidVwiKTtcbiAgICAgICAgICAgIHdpZHRoID0gcGFyc2VJbnQobWF0Y2hbMl0pO1xuICAgICAgICAgICAgZGVjaW1hbHMgPSBwYXJzZUludChtYXRjaFszXSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZWxzZSBpZiAodmFsdWUpIHtcbiAgICAgICAgLy8gRXh0cmFjdCB0aGUgdmFsdWVzIGZyb20gdGhlIG9iamVjdFxuICAgICAgICBjb25zdCB2ID0gdmFsdWU7XG4gICAgICAgIGNvbnN0IGNoZWNrID0gKGtleSwgdHlwZSwgZGVmYXVsdFZhbHVlKSA9PiB7XG4gICAgICAgICAgICBpZiAodltrZXldID09IG51bGwpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZGVmYXVsdFZhbHVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgYXNzZXJ0QXJndW1lbnQodHlwZW9mICh2W2tleV0pID09PSB0eXBlLCBcImludmFsaWQgZml4ZWQgZm9ybWF0IChcIiArIGtleSArIFwiIG5vdCBcIiArIHR5cGUgKyBcIilcIiwgXCJmb3JtYXQuXCIgKyBrZXksIHZba2V5XSk7XG4gICAgICAgICAgICByZXR1cm4gdltrZXldO1xuICAgICAgICB9O1xuICAgICAgICBzaWduZWQgPSBjaGVjayhcInNpZ25lZFwiLCBcImJvb2xlYW5cIiwgc2lnbmVkKTtcbiAgICAgICAgd2lkdGggPSBjaGVjayhcIndpZHRoXCIsIFwibnVtYmVyXCIsIHdpZHRoKTtcbiAgICAgICAgZGVjaW1hbHMgPSBjaGVjayhcImRlY2ltYWxzXCIsIFwibnVtYmVyXCIsIGRlY2ltYWxzKTtcbiAgICB9XG4gICAgYXNzZXJ0QXJndW1lbnQoKHdpZHRoICUgOCkgPT09IDAsIFwiaW52YWxpZCBGaXhlZE51bWJlciB3aWR0aCAobm90IGJ5dGUgYWxpZ25lZClcIiwgXCJmb3JtYXQud2lkdGhcIiwgd2lkdGgpO1xuICAgIGFzc2VydEFyZ3VtZW50KGRlY2ltYWxzIDw9IDgwLCBcImludmFsaWQgRml4ZWROdW1iZXIgZGVjaW1hbHMgKHRvbyBsYXJnZSlcIiwgXCJmb3JtYXQuZGVjaW1hbHNcIiwgZGVjaW1hbHMpO1xuICAgIGNvbnN0IG5hbWUgPSAoc2lnbmVkID8gXCJcIiA6IFwidVwiKSArIFwiZml4ZWRcIiArIFN0cmluZyh3aWR0aCkgKyBcInhcIiArIFN0cmluZyhkZWNpbWFscyk7XG4gICAgcmV0dXJuIHsgc2lnbmVkLCB3aWR0aCwgZGVjaW1hbHMsIG5hbWUgfTtcbn1cbmZ1bmN0aW9uIHRvU3RyaW5nKHZhbCwgZGVjaW1hbHMpIHtcbiAgICBsZXQgbmVnYXRpdmUgPSBcIlwiO1xuICAgIGlmICh2YWwgPCBCTl8wKSB7XG4gICAgICAgIG5lZ2F0aXZlID0gXCItXCI7XG4gICAgICAgIHZhbCAqPSBCTl9OMTtcbiAgICB9XG4gICAgbGV0IHN0ciA9IHZhbC50b1N0cmluZygpO1xuICAgIC8vIE5vIGRlY2ltYWwgcG9pbnQgZm9yIHdob2xlIHZhbHVlc1xuICAgIGlmIChkZWNpbWFscyA9PT0gMCkge1xuICAgICAgICByZXR1cm4gKG5lZ2F0aXZlICsgc3RyKTtcbiAgICB9XG4gICAgLy8gUGFkIG91dCB0byB0aGUgd2hvbGUgY29tcG9uZW50IChpbmNsdWRpbmcgYSB3aG9sZSBkaWdpdClcbiAgICB3aGlsZSAoc3RyLmxlbmd0aCA8PSBkZWNpbWFscykge1xuICAgICAgICBzdHIgPSBaZXJvcyArIHN0cjtcbiAgICB9XG4gICAgLy8gSW5zZXJ0IHRoZSBkZWNpbWFsIHBvaW50XG4gICAgY29uc3QgaW5kZXggPSBzdHIubGVuZ3RoIC0gZGVjaW1hbHM7XG4gICAgc3RyID0gc3RyLnN1YnN0cmluZygwLCBpbmRleCkgKyBcIi5cIiArIHN0ci5zdWJzdHJpbmcoaW5kZXgpO1xuICAgIC8vIFRyaW0gdGhlIHdob2xlIGNvbXBvbmVudCAobGVhdmluZyBhdCBsZWFzdCBvbmUgMClcbiAgICB3aGlsZSAoc3RyWzBdID09PSBcIjBcIiAmJiBzdHJbMV0gIT09IFwiLlwiKSB7XG4gICAgICAgIHN0ciA9IHN0ci5zdWJzdHJpbmcoMSk7XG4gICAgfVxuICAgIC8vIFRyaW0gdGhlIGRlY2ltYWwgY29tcG9uZW50IChsZWF2aW5nIGF0IGxlYXN0IG9uZSAwKVxuICAgIHdoaWxlIChzdHJbc3RyLmxlbmd0aCAtIDFdID09PSBcIjBcIiAmJiBzdHJbc3RyLmxlbmd0aCAtIDJdICE9PSBcIi5cIikge1xuICAgICAgICBzdHIgPSBzdHIuc3Vic3RyaW5nKDAsIHN0ci5sZW5ndGggLSAxKTtcbiAgICB9XG4gICAgcmV0dXJuIChuZWdhdGl2ZSArIHN0cik7XG59XG4vKipcbiAqICBBIEZpeGVkTnVtYmVyIHJlcHJlc2VudHMgYSB2YWx1ZSBvdmVyIGl0cyBbW0ZpeGVkRm9ybWF0XV1cbiAqICBhcml0aG1ldGljIGZpZWxkLlxuICpcbiAqICBBIEZpeGVkTnVtYmVyIGNhbiBiZSB1c2VkIHRvIHBlcmZvcm0gbWF0aCwgbG9zc2xlc3NseSwgb25cbiAqICB2YWx1ZXMgd2hpY2ggaGF2ZSBkZWNtaWFsIHBsYWNlcy5cbiAqXG4gKiAgQSBGaXhlZE51bWJlciBoYXMgYSBmaXhlZCBiaXQtd2lkdGggdG8gc3RvcmUgdmFsdWVzIGluLCBhbmQgc3RvcmVzIGFsbFxuICogIHZhbHVlcyBpbnRlcm5hbGx5IGJ5IG11bHRpcGx5aW5nIHRoZSB2YWx1ZSBieSAxMCByYWlzZWQgdG8gdGhlIHBvd2VyIG9mXG4gKiAgJSVkZWNpbWFscyUlLlxuICpcbiAqICBJZiBvcGVyYXRpb25zIGFyZSBwZXJmb3JtZWQgdGhhdCBjYXVzZSBhIHZhbHVlIHRvIGdyb3cgdG9vIGhpZ2ggKGNsb3NlIHRvXG4gKiAgcG9zaXRpdmUgaW5maW5pdHkpIG9yIHRvbyBsb3cgKGNsb3NlIHRvIG5lZ2F0aXZlIGluZmluaXR5KSwgdGhlI
26774HZhbHVlXG4gKiAgaXMgc2FpZCB0byAvL292ZXJmbG93Ly8uXG4gKlxuICogIEZvciBleGFtcGxlLCBhbiA4LWJpdCBzaWduZWQgdmFsdWUsIHdpdGggMCBkZWNpbWFscyBtYXkgb25seSBiZSB3aXRoaW5cbiAqICB0aGUgcmFuZ2UgYGAtMTI4YGAgdG8gYGAxMjdgYDsgc28gYGAtMTI4IC0gMWBgIHdpbGwgb3ZlcmZsb3cgYW5kIGJlY29tZVxuICogIGBgMTI3YGAuIExpa2V3aXNlLCBgYDEyNyArIDFgYCB3aWxsIG92ZXJmbG93IGFuZCBiZWNvbWUgYGAtMTI3YGAuXG4gKlxuICogIE1hbnkgb3BlcmF0aW9uIGhhdmUgYSBub3JtYWwgYW5kIC8vdW5zYWZlLy8gdmFyaWFudC4gVGhlIG5vcm1hbCB2YXJpYW50XG4gKiAgd2lsbCB0aHJvdyBhIFtbTnVtZXJpY0ZhdWx0RXJyb3JdXSBvbiBhbnkgb3ZlcmZsb3csIHdoaWxlIHRoZSAvL3Vuc2FmZS8vXG4gKiAgdmFyaWFudCB3aWxsIHNpbGVudGx5IGFsbG93IG92ZXJmbG93LCBjb3JydXB0aW5nIGl0cyB2YWx1ZSB2YWx1ZS5cbiAqXG4gKiAgSWYgb3BlcmF0aW9ucyBhcmUgcGVyZm9ybWVkIHRoYXQgY2F1c2UgYSB2YWx1ZSB0byBiZWNvbWUgdG9vIHNtYWxsXG4gKiAgKGNsb3NlIHRvIHplcm8pLCB0aGUgdmFsdWUgbG9zZXMgcHJlY2lzb24gYW5kIGlzIHNhaWQgdG8gLy91bmRlcmZsb3cvLy5cbiAqXG4gKiAgRm9yIGV4YW1wbGUsIGEgdmFsdWUgd2l0aCAxIGRlY2ltYWwgcGxhY2UgbWF5IHN0b3JlIGEgbnVtYmVyIGFzIHNtYWxsXG4gKiAgYXMgYGAwLjFgYCwgYnV0IHRoZSB2YWx1ZSBvZiBgYDAuMSAvIDJgYCBpcyBgYDAuMDVgYCwgd2hpY2ggY2Fubm90IGZpdFxuICogIGludG8gMSBkZWNpbWFsIHBsYWNlLCBzbyB1bmRlcmZsb3cgb2NjdXJzIHdoaWNoIG1lYW5zIHByZWNpc2lvbiBpcyBsb3N0XG4gKiAgYW5kIHRoZSB2YWx1ZSBiZWNvbWVzIGBgMGBgLlxuICpcbiAqICBTb21lIG9wZXJhdGlvbnMgaGF2ZSBhIG5vcm1hbCBhbmQgLy9zaWduYWxsaW5nLy8gdmFyaWFudC4gVGhlIG5vcm1hbFxuICogIHZhcmlhbnQgd2lsbCBzaWxlbnRseSBpZ25vcmUgdW5kZXJmbG93LCB3aGlsZSB0aGUgLy9zaWduYWxsaW5nLy8gdmFyaWFudFxuICogIHdpbGwgdGhvdyBhIFtbTnVtZXJpY0ZhdWx0RXJyb3JdXSBvbiB1bmRlcmZsb3cuXG4gKi9cbmV4cG9ydCBjbGFzcyBGaXhlZE51bWJlciB7XG4gICAgLyoqXG4gICAgICogIFRoZSBzcGVjaWZpYyBmaXhlZC1wb2ludCBhcml0aG1ldGljIGZpZWxkIGZvciB0aGlzIHZhbHVlLlxuICAgICAqL1xuICAgIGZvcm1hdDtcbiAgICAjZm9ybWF0O1xuICAgIC8vIFRoZSBhY3R1YWwgdmFsdWUgKGFjY291bnRpbmcgZm9yIGRlY2ltYWxzKVxuICAgICN2YWw7XG4gICAgLy8gQSBiYXNlLTEwIHZhbHVlIHRvIG11bHRpcGxlIHZhbHVlcyBieSB0byBtYWludGFpbiB0aGUgbWFnbml0dWRlXG4gICAgI3RlbnM7XG4gICAgLyoqXG4gICAgICogIFRoaXMgaXMgYSBwcm9wZXJ0eSBzbyBjb25zb2xlLmxvZyBzaG93cyBhIGh1bWFuLW1lYW5pbmdmdWwgdmFsdWUuXG4gICAgICpcbiAgICAgKiAgQHByaXZhdGVcbiAgICAgKi9cbiAgICBfdmFsdWU7XG4gICAgLy8gVXNlIHRoaXMgd2hlbiBjaGFuZ2luZyB0aGlzIGZpbGUgdG8gZ2V0IHNvbWUgdHlwaW5nIGluZm8sXG4gICAgLy8gYnV0IHRoZW4gc3dpdGNoIHRvIGFueSB0byBtYXNrIHRoZSBpbnRlcm5hbCB0eXBlXG4gICAgLy9jb25zdHJ1Y3RvcihndWFyZDogYW55LCB2YWx1ZTogYmlnaW50LCBmb3JtYXQ6IF9GaXhlZEZvcm1hdCkge1xuICAgIC8qKlxuICAgICAqICBAcHJpdmF0ZVxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yKGd1YXJkLCB2YWx1ZSwgZm9ybWF0KSB7XG4gICAgICAgIGFzc2VydFByaXZhdGUoZ3VhcmQsIF9ndWFyZCwgXCJGaXhlZE51bWJlclwiKTtcbiAgICAgICAgdGhpcy4jdmFsID0gdmFsdWU7XG4gICAgICAgIHRoaXMuI2Zvcm1hdCA9IGZvcm1hdDtcbiAgICAgICAgY29uc3QgX3ZhbHVlID0gdG9TdHJpbmcodmFsdWUsIGZvcm1hdC5kZWNpbWFscyk7XG4gICAgICAgIGRlZmluZVByb3BlcnRpZXModGhpcywgeyBmb3JtYXQ6IGZvcm1hdC5uYW1lLCBfdmFsdWUgfSk7XG4gICAgICAgIHRoaXMuI3RlbnMgPSBnZXRUZW5zKGZvcm1hdC5kZWNpbWFscyk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqICBJZiB0cnVlLCBuZWdhdGl2ZSB2YWx1ZXMgYXJlIHBlcm1pdHRlZCwgb3RoZXJ3aXNlIG9ubHlcbiAgICAgKiAgcG9zaXRpdmUgdmFsdWVzIGFuZCB6ZXJvIGFyZSBhbGxvd2VkLlxuICAgICAqL1xuICAgIGdldCBzaWduZWQoKSB7IHJldHVybiB0aGlzLiNmb3JtYXQuc2lnbmVkOyB9XG4gICAgLyoqXG4gICAgICogIFRoZSBudW1iZXIgb2YgYml0cyBhdmFpbGFibGUgdG8gc3RvcmUgdGhlIHZhbHVlLlxuICAgICAqL1xuICAgIGdldCB3aWR0aCgpIHsgcmV0dXJuIHRoaXMuI2Zvcm1hdC53aWR0aDsgfVxuICAgIC8qKlxuICAgICAqICBUaGUgbnVtYmVyIG9mIGRlY2ltYWwgcGxhY2VzIGluIHRoZSBmaXhlZC1wb2ludCBhcml0aG1lbnQgZmllbGQuXG4gICAgICovXG4gICAgZ2V0IGRlY2ltYWxzKCkgeyByZXR1cm4gdGhpcy4jZm9ybWF0LmRlY2ltYWxzOyB9XG4gICAgLyoqXG4gICAgICogIFRoZSB2YWx1ZSBhcyBhbiBpbnRlZ2VyLCBiYXNlZCBvbiB0aGUgc21hbGxlc3QgdW5pdCB0aGVcbiAgICAgKiAgW1tkZWNpbWFsc11dIGFsbG93LlxuICAgICAqL1xuICAgIGdldCB2YWx1ZSgpIHsgcmV0dXJuIHRoaXMuI3ZhbDsgfVxuICAgICNjaGVja0Zvcm1hdChvdGhlcikge1xuICAgICAgICBhc3NlcnRBcmd1bWVudCh0aGlzLmZvcm1hdCA9PT0gb3RoZXIuZm9ybWF0LCBcImluY29tcGF0aWJsZSBmb3JtYXQ7IHVzZSBmaXhlZE51bWJlci50b0Zvcm1hdFwiLCBcIm90aGVyXCIsIG90aGVyKTtcbiAgICB9XG4gICAgI2NoZWNrVmFsdWUodmFsLCBzYWZlT3ApIHtcbiAgICAgICAgLypcbiAgICAgICAgICAgICAgICBjb25zdCB3aWR0aCA9IEJpZ0ludCh0aGlzLndpZHRoKTtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5zaWduZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgbGltaXQgPSAoQk5fMSA8PCAod2lkdGggLSBCTl8xKSk7XG4gICAgICAgICAgICAgICAgICAgIGFzc2VydChzYWZlT3AgPT0gbnVsbCB8fCAodmFsID49IC1saW1pdCAgJiYgdmFsI
26774DwgbGltaXQpLCBcIm92ZXJmbG93XCIsIFwiTlVNRVJJQ19GQVVMVFwiLCB7XG4gICAgICAgICAgICAgICAgICAgICAgICBvcGVyYXRpb246IDxzdHJpbmc+c2FmZU9wLCBmYXVsdDogXCJvdmVyZmxvd1wiLCB2YWx1ZTogdmFsXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgaWYgKHZhbCA+IEJOXzApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhbCA9IGZyb21Ud29zKG1hc2sodmFsLCB3aWR0aCksIHdpZHRoKTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhbCA9IC1mcm9tVHdvcyhtYXNrKC12YWwsIHdpZHRoKSwgd2lkdGgpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgIFxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IG1hc2tlZCA9IG1hc2sodmFsLCB3aWR0aCk7XG4gICAgICAgICAgICAgICAgICAgIGFzc2VydChzYWZlT3AgPT0gbnVsbCB8fCAodmFsID49IDAgJiYgdmFsID09PSBtYXNrZWQpLCBcIm92ZXJmbG93XCIsIFwiTlVNRVJJQ19GQVVMVFwiLCB7XG4gICAgICAgICAgICAgICAgICAgICAgICBvcGVyYXRpb246IDxzdHJpbmc+c2FmZU9wLCBmYXVsdDogXCJvdmVyZmxvd1wiLCB2YWx1ZTogdmFsXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICB2YWwgPSBtYXNrZWQ7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAqL1xuICAgICAgICB2YWwgPSBjaGVja1ZhbHVlKHZhbCwgdGhpcy4jZm9ybWF0LCBzYWZlT3ApO1xuICAgICAgICByZXR1cm4gbmV3IEZpeGVkTnVtYmVyKF9ndWFyZCwgdmFsLCB0aGlzLiNmb3JtYXQpO1xuICAgIH1cbiAgICAjYWRkKG8sIHNhZmVPcCkge1xuICAgICAgICB0aGlzLiNjaGVja0Zvcm1hdChvKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuI2NoZWNrVmFsdWUodGhpcy4jdmFsICsgby4jdmFsLCBzYWZlT3ApO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiAgUmV0dXJucyBhIG5ldyBbW0ZpeGVkTnVtYmVyXV0gd2l0aCB0aGUgcmVzdWx0IG9mICUldGhpcyUlIGFkZGVkXG4gICAgICogIHRvICUlb3RoZXIlJSwgaWdub3Jpbmcgb3ZlcmZsb3cuXG4gICAgICovXG4gICAgYWRkVW5zYWZlKG90aGVyKSB7IHJldHVybiB0aGlzLiNhZGQob3RoZXIpOyB9XG4gICAgLyoqXG4gICAgICogIFJldHVybnMgYSBuZXcgW1tGaXhlZE51bWJlcl1dIHdpdGggdGhlIHJlc3VsdCBvZiAlJXRoaXMlJSBhZGRlZFxuICAgICAqICB0byAlJW90aGVyJSUuIEEgW1tOdW1lcmljRmF1bHRFcnJvcl1dIGlzIHRocm93biBpZiBvdmVyZmxvd1xuICAgICAqICBvY2N1cnMuXG4gICAgICovXG4gICAgYWRkKG90aGVyKSB7IHJldHVybiB0aGlzLiNhZGQob3RoZXIsIFwiYWRkXCIpOyB9XG4gICAgI3N1YihvLCBzYWZlT3ApIHtcbiAgICAgICAgdGhpcy4jY2hlY2tGb3JtYXQobyk7XG4gICAgICAgIHJldHVybiB0aGlzLiNjaGVja1ZhbHVlKHRoaXMuI3ZhbCAtIG8uI3ZhbCwgc2FmZU9wKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogIFJldHVybnMgYSBuZXcgW1tGaXhlZE51bWJlcl1dIHdpdGggdGhlIHJlc3VsdCBvZiAlJW90aGVyJSUgc3VidHJhY3RlZFxuICAgICAqICBmcm9tICUldGhpcyUlLCBpZ25vcmluZyBvdmVyZmxvdy5cbiAgICAgKi9cbiAgICBzdWJVbnNhZmUob3RoZXIpIHsgcmV0dXJuIHRoaXMuI3N1YihvdGhlcik7IH1cbiAgICAvKipcbiAgICAgKiAgUmV0dXJucyBhIG5ldyBbW0ZpeGVkTnVtYmVyXV0gd2l0aCB0aGUgcmVzdWx0IG9mICUlb3RoZXIlJSBzdWJ0cmFjdGVkXG4gICAgICogIGZyb20gJSV0aGlzJSUuIEEgW1tOdW1lcmljRmF1bHRFcnJvcl1dIGlzIHRocm93biBpZiBvdmVyZmxvd1xuICAgICAqICBvY2N1cnMuXG4gICAgICovXG4gICAgc3ViKG90aGVyKSB7IHJldHVybiB0aGlzLiNzdWIob3RoZXIsIFwic3ViXCIpOyB9XG4gICAgI211bChvLCBzYWZlT3ApIHtcbiAgICAgICAgdGhpcy4jY2hlY2tGb3JtYXQobyk7XG4gICAgICAgIHJldHVybiB0aGlzLiNjaGVja1ZhbHVlKCh0aGlzLiN2YWwgKiBvLiN2YWwpIC8gdGhpcy4jdGVucywgc2FmZU9wKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogIFJldHVybnMgYSBuZXcgW1tGaXhlZE51bWJlcl1dIHdpdGggdGhlIHJlc3VsdCBvZiAlJXRoaXMlJSBtdWx0aXBsaWVkXG4gICAgICogIGJ5ICUlb3RoZXIlJSwgaWdub3Jpbmcgb3ZlcmZsb3cgYW5kIHVuZGVyZmxvdyAocHJlY2lzaW9uIGxvc3MpLlxuICAgICAqL1xuICAgIG11bFVuc2FmZShvdGhlcikgeyByZXR1cm4gdGhpcy4jbXVsKG90aGVyKTsgfVxuICAgIC8qKlxuICAgICAqICBSZXR1cm5zIGEgbmV3IFtbRml4ZWROdW1iZXJdXSB3aXRoIHRoZSByZXN1bHQgb2YgJSV0aGlzJSUgbXVsdGlwbGllZFxuICAgICAqICBieSAlJW90aGVyJSUuIEEgW1tOdW1lcmljRmF1bHRFcnJvcl1dIGlzIHRocm93biBpZiBvdmVyZmxvd1xuICAgICAqICBvY2N1cnMuXG4gICAgICovXG4gICAgbXVsKG90aGVyKSB7IHJldHVybiB0aGlzLiNtdWwob3RoZXIsIFwibXVsXCIpOyB9XG4gICAgLyoqXG4gICAgICogIFJldHVybnMgYSBuZXcgW1tGaXhlZE51bWJlcl1dIHdpdGggdGhlIHJlc3VsdCBvZiAlJXRoaXMlJSBtdWx0aXBsaWVkXG4gICAgICogIGJ5ICUlb3RoZXIlJS4gQSBbW051bWVyaWNGYXVsdEVycm9yXV0gaXMgdGhyb3duIGlmIG92ZXJmbG93XG4gICAgICogIG9jY3VycyBvciBpZiB1bmRlcmZsb3cgKHByZWNpc2lvbiBsb3NzKSBvY2N1cnMuXG4gICAgICovXG4gICAgbXVsU2lnbmFsKG90aGVyKSB7XG4gICAgICAgIHRoaXMuI2NoZWNrRm9ybWF0KG90aGVyKTtcbiAgICAgICAgY29uc3QgdmFsdWUgPSB0aGlzLiN2YWwgKiBvdGhlci4jdmFsO1xuICAgICAgICBhc3NlcnQoKHZhbHVlICUgdGhpcy4jdGVucykgPT09IEJOXzAsIFwicHJlY2lzaW9uIGxvc3QgZHVyaW5nIHNpZ25hbGxpbmcgbXVsXCIsIFwiTlVNRVJJQ19GQVVMVFwiLCB7XG4gICAgICAgICAgICBvcGVyYXRpb246IFwibXVsU2lnbmFsXCIsIGZhdWx0OiBcInVuZGVyZmxvd1wiLCB2YWx1ZTogdGhpc1xuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIHRoaXMuI2NoZWNrVmFsdWUodmFsdWUgLyB0aGlzLiN0ZW5zLCBcIm11bFNpZ25hbFwiKTtcbiAgICB9XG4gICAgI2RpdihvLCBzYWZlT3ApIHtcbiAgICAgICAgYXNzZXJ0KG8uI3ZhbCAhPT0gQk5fMCwgXCJkaXZpc2lvbiBieSB6ZXJvXCIsIFwiTlVNRVJJQ19GQVVMVFwiLCB7XG4gICAgICAgICAgICBvcGVyYXRpb246IFwiZGl2XCIsIGZh
26774dWx0OiBcImRpdmlkZS1ieS16ZXJvXCIsIHZhbHVlOiB0aGlzXG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLiNjaGVja0Zvcm1hdChvKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuI2NoZWNrVmFsdWUoKHRoaXMuI3ZhbCAqIHRoaXMuI3RlbnMpIC8gby4jdmFsLCBzYWZlT3ApO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiAgUmV0dXJucyBhIG5ldyBbW0ZpeGVkTnVtYmVyXV0gd2l0aCB0aGUgcmVzdWx0IG9mICUldGhpcyUlIGRpdmlkZWRcbiAgICAgKiAgYnkgJSVvdGhlciUlLCBpZ25vcmluZyB1bmRlcmZsb3cgKHByZWNpc2lvbiBsb3NzKS4gQVxuICAgICAqICBbW051bWVyaWNGYXVsdEVycm9yXV0gaXMgdGhyb3duIGlmIG92ZXJmbG93IG9jY3Vycy5cbiAgICAgKi9cbiAgICBkaXZVbnNhZmUob3RoZXIpIHsgcmV0dXJuIHRoaXMuI2RpdihvdGhlcik7IH1cbiAgICAvKipcbiAgICAgKiAgUmV0dXJucyBhIG5ldyBbW0ZpeGVkTnVtYmVyXV0gd2l0aCB0aGUgcmVzdWx0IG9mICUldGhpcyUlIGRpdmlkZWRcbiAgICAgKiAgYnkgJSVvdGhlciUlLCBpZ25vcmluZyB1bmRlcmZsb3cgKHByZWNpc2lvbiBsb3NzKS4gQVxuICAgICAqICBbW051bWVyaWNGYXVsdEVycm9yXV0gaXMgdGhyb3duIGlmIG92ZXJmbG93IG9jY3Vycy5cbiAgICAgKi9cbiAgICBkaXYob3RoZXIpIHsgcmV0dXJuIHRoaXMuI2RpdihvdGhlciwgXCJkaXZcIik7IH1cbiAgICAvKipcbiAgICAgKiAgUmV0dXJucyBhIG5ldyBbW0ZpeGVkTnVtYmVyXV0gd2l0aCB0aGUgcmVzdWx0IG9mICUldGhpcyUlIGRpdmlkZWRcbiAgICAgKiAgYnkgJSVvdGhlciUlLiBBIFtbTnVtZXJpY0ZhdWx0RXJyb3JdXSBpcyB0aHJvd24gaWYgdW5kZXJmbG93XG4gICAgICogIChwcmVjaXNpb24gbG9zcykgb2NjdXJzLlxuICAgICAqL1xuICAgIGRpdlNpZ25hbChvdGhlcikge1xuICAgICAgICBhc3NlcnQob3RoZXIuI3ZhbCAhPT0gQk5fMCwgXCJkaXZpc2lvbiBieSB6ZXJvXCIsIFwiTlVNRVJJQ19GQVVMVFwiLCB7XG4gICAgICAgICAgICBvcGVyYXRpb246IFwiZGl2XCIsIGZhdWx0OiBcImRpdmlkZS1ieS16ZXJvXCIsIHZhbHVlOiB0aGlzXG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLiNjaGVja0Zvcm1hdChvdGhlcik7XG4gICAgICAgIGNvbnN0IHZhbHVlID0gKHRoaXMuI3ZhbCAqIHRoaXMuI3RlbnMpO1xuICAgICAgICBhc3NlcnQoKHZhbHVlICUgb3RoZXIuI3ZhbCkgPT09IEJOXzAsIFwicHJlY2lzaW9uIGxvc3QgZHVyaW5nIHNpZ25hbGxpbmcgZGl2XCIsIFwiTlVNRVJJQ19GQVVMVFwiLCB7XG4gICAgICAgICAgICBvcGVyYXRpb246IFwiZGl2U2lnbmFsXCIsIGZhdWx0OiBcInVuZGVyZmxvd1wiLCB2YWx1ZTogdGhpc1xuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIHRoaXMuI2NoZWNrVmFsdWUodmFsdWUgLyBvdGhlci4jdmFsLCBcImRpdlNpZ25hbFwiKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogIFJldHVybnMgYSBjb21wYXJpc29uIHJlc3VsdCBiZXR3ZWVuICUldGhpcyUlIGFuZCAlJW90aGVyJSUuXG4gICAgICpcbiAgICAgKiAgVGhpcyBpcyBzdWl0YWJsZSBmb3IgdXNlIGluIHNvcnRpbmcsIHdoZXJlIGBgLTFgYCBpbXBsaWVzICUldGhpcyUlXG4gICAgICogIGlzIHNtYWxsZXIsIGBgMWBgIGltcGxpZXMgJSV0aGlzJSUgaXMgbGFyZ2VyIGFuZCBgYDBgYCBpbXBsaWVzXG4gICAgICogIGJvdGggYXJlIGVxdWFsLlxuICAgICAqL1xuICAgIGNtcChvdGhlcikge1xuICAgICAgICBsZXQgYSA9IHRoaXMudmFsdWUsIGIgPSBvdGhlci52YWx1ZTtcbiAgICAgICAgLy8gQ29lcmNlIGEgYW5kIGIgdG8gdGhlIHNhbWUgbWFnbml0dWRlXG4gICAgICAgIGNvbnN0IGRlbHRhID0gdGhpcy5kZWNpbWFscyAtIG90aGVyLmRlY2ltYWxzO1xuICAgICAgICBpZiAoZGVsdGEgPiAwKSB7XG4gICAgICAgICAgICBiICo9IGdldFRlbnMoZGVsdGEpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGRlbHRhIDwgMCkge1xuICAgICAgICAgICAgYSAqPSBnZXRUZW5zKC1kZWx0YSk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gQ29tbnBhcmVcbiAgICAgICAgaWYgKGEgPCBiKSB7XG4gICAgICAgICAgICByZXR1cm4gLTE7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGEgPiBiKSB7XG4gICAgICAgICAgICByZXR1cm4gMTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gMDtcbiAgICB9XG4gICAgLyoqXG4gICAgICogIFJldHVybnMgdHJ1ZSBpZiAlJW90aGVyJSUgaXMgZXF1YWwgdG8gJSV0aGlzJSUuXG4gICAgICovXG4gICAgZXEob3RoZXIpIHsgcmV0dXJuIHRoaXMuY21wKG90aGVyKSA9PT0gMDsgfVxuICAgIC8qKlxuICAgICAqICBSZXR1cm5zIHRydWUgaWYgJSVvdGhlciUlIGlzIGxlc3MgdGhhbiB0byAlJXRoaXMlJS5cbiAgICAgKi9cbiAgICBsdChvdGhlcikgeyByZXR1cm4gdGhpcy5jbXAob3RoZXIpIDwgMDsgfVxuICAgIC8qKlxuICAgICAqICBSZXR1cm5zIHRydWUgaWYgJSVvdGhlciUlIGlzIGxlc3MgdGhhbiBvciBlcXVhbCB0byAlJXRoaXMlJS5cbiAgICAgKi9cbiAgICBsdGUob3RoZXIpIHsgcmV0dXJuIHRoaXMuY21wKG90aGVyKSA8PSAwOyB9XG4gICAgLyoqXG4gICAgICogIFJldHVybnMgdHJ1ZSBpZiAlJW90aGVyJSUgaXMgZ3JlYXRlciB0aGFuIHRvICUldGhpcyUlLlxuICAgICAqL1xuICAgIGd0KG90aGVyKSB7IHJldHVybiB0aGlzLmNtcChvdGhlcikgPiAwOyB9XG4gICAgLyoqXG4gICAgICogIFJldHVybnMgdHJ1ZSBpZiAlJW90aGVyJSUgaXMgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvICUldGhpcyUlLlxuICAgICAqL1xuICAgIGd0ZShvdGhlcikgeyByZXR1cm4gdGhpcy5jbXAob3RoZXIpID49IDA7IH1cbiAgICAvKipcbiAgICAgKiAgUmV0dXJucyBhIG5ldyBbW0ZpeGVkTnVtYmVyXV0gd2hpY2ggaXMgdGhlIGxhcmdlc3QgKippbnRlZ2VyKipcbiAgICAgKiAgdGhhdCBpcyBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gJSV0aGlzJSUuXG4gICAgICpcbiAgICAgKiAgVGhlIGRlY2ltYWwgY29tcG9uZW50IG9mIHRoZSByZXN1bHQgd2lsbCBhbHdheXMgYmUgYGAwYGAuXG4gICAgICovXG4gICAgZmxvb3IoKSB7XG4gICAgICAgIGxldCB2YWwgPSB0aGlzLiN2YWw7XG4gICAgICAgIGlmICh0aGlzLiN2YWwgPCBCTl8wKSB7XG4gICAgICAgICAgICB2YWwgLT0gdGhpcy4jdGVucyAtIEJOXzE7XG4gICAgICAgI
26774H1cbiAgICAgICAgdmFsID0gKHRoaXMuI3ZhbCAvIHRoaXMuI3RlbnMpICogdGhpcy4jdGVucztcbiAgICAgICAgcmV0dXJuIHRoaXMuI2NoZWNrVmFsdWUodmFsLCBcImZsb29yXCIpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiAgUmV0dXJucyBhIG5ldyBbW0ZpeGVkTnVtYmVyXV0gd2hpY2ggaXMgdGhlIHNtYWxsZXN0ICoqaW50ZWdlcioqXG4gICAgICogIHRoYXQgaXMgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvICUldGhpcyUlLlxuICAgICAqXG4gICAgICogIFRoZSBkZWNpbWFsIGNvbXBvbmVudCBvZiB0aGUgcmVzdWx0IHdpbGwgYWx3YXlzIGJlIGBgMGBgLlxuICAgICAqL1xuICAgIGNlaWxpbmcoKSB7XG4gICAgICAgIGxldCB2YWwgPSB0aGlzLiN2YWw7XG4gICAgICAgIGlmICh0aGlzLiN2YWwgPiBCTl8wKSB7XG4gICAgICAgICAgICB2YWwgKz0gdGhpcy4jdGVucyAtIEJOXzE7XG4gICAgICAgIH1cbiAgICAgICAgdmFsID0gKHRoaXMuI3ZhbCAvIHRoaXMuI3RlbnMpICogdGhpcy4jdGVucztcbiAgICAgICAgcmV0dXJuIHRoaXMuI2NoZWNrVmFsdWUodmFsLCBcImNlaWxpbmdcIik7XG4gICAgfVxuICAgIC8qKlxuICAgICAqICBSZXR1cm5zIGEgbmV3IFtbRml4ZWROdW1iZXJdXSB3aXRoIHRoZSBkZWNpbWFsIGNvbXBvbmVudFxuICAgICAqICByb3VuZGVkIHVwIG9uIHRpZXMgYXQgJSVkZWNpbWFscyUlIHBsYWNlcy5cbiAgICAgKi9cbiAgICByb3VuZChkZWNpbWFscykge1xuICAgICAgICBpZiAoZGVjaW1hbHMgPT0gbnVsbCkge1xuICAgICAgICAgICAgZGVjaW1hbHMgPSAwO1xuICAgICAgICB9XG4gICAgICAgIC8vIE5vdCBlbm91Z2ggcHJlY2lzaW9uIHRvIG5vdCBhbHJlYWR5IGJlIHJvdW5kZWRcbiAgICAgICAgaWYgKGRlY2ltYWxzID49IHRoaXMuZGVjaW1hbHMpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGRlbHRhID0gdGhpcy5kZWNpbWFscyAtIGRlY2ltYWxzO1xuICAgICAgICBjb25zdCBidW1wID0gQk5fNSAqIGdldFRlbnMoZGVsdGEgLSAxKTtcbiAgICAgICAgbGV0IHZhbHVlID0gdGhpcy52YWx1ZSArIGJ1bXA7XG4gICAgICAgIGNvbnN0IHRlbnMgPSBnZXRUZW5zKGRlbHRhKTtcbiAgICAgICAgdmFsdWUgPSAodmFsdWUgLyB0ZW5zKSAqIHRlbnM7XG4gICAgICAgIGNoZWNrVmFsdWUodmFsdWUsIHRoaXMuI2Zvcm1hdCwgXCJyb3VuZFwiKTtcbiAgICAgICAgcmV0dXJuIG5ldyBGaXhlZE51bWJlcihfZ3VhcmQsIHZhbHVlLCB0aGlzLiNmb3JtYXQpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiAgUmV0dXJucyB0cnVlIGlmICUldGhpcyUlIGlzIGVxdWFsIHRvIGBgMGBgLlxuICAgICAqL1xuICAgIGlzWmVybygpIHsgcmV0dXJuICh0aGlzLiN2YWwgPT09IEJOXzApOyB9XG4gICAgLyoqXG4gICAgICogIFJldHVybnMgdHJ1ZSBpZiAlJXRoaXMlJSBpcyBsZXNzIHRoYW4gYGAwYGAuXG4gICAgICovXG4gICAgaXNOZWdhdGl2ZSgpIHsgcmV0dXJuICh0aGlzLiN2YWwgPCBCTl8wKTsgfVxuICAgIC8qKlxuICAgICAqICBSZXR1cm5zIHRoZSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgJSV0aGlzJSUuXG4gICAgICovXG4gICAgdG9TdHJpbmcoKSB7IHJldHVybiB0aGlzLl92YWx1ZTsgfVxuICAgIC8qKlxuICAgICAqICBSZXR1cm5zIGEgZmxvYXQgYXBwcm94aW1hdGlvbi5cbiAgICAgKlxuICAgICAqICBEdWUgdG8gSUVFRSA3NTQgcHJlY2lzc2lvbiAob3IgbGFjayB0aGVyZW9mKSwgdGhpcyBmdW5jdGlvblxuICAgICAqICBjYW4gb25seSByZXR1cm4gYW4gYXBwcm94aW1hdGlvbiBhbmQgbW9zdCB2YWx1ZXMgd2lsbCBjb250YWluXG4gICAgICogIHJvdW5kaW5nIGVycm9ycy5cbiAgICAgKi9cbiAgICB0b1Vuc2FmZUZsb2F0KCkgeyByZXR1cm4gcGFyc2VGbG9hdCh0aGlzLnRvU3RyaW5nKCkpOyB9XG4gICAgLyoqXG4gICAgICogIFJldHVybiBhIG5ldyBbW0ZpeGVkTnVtYmVyXV0gd2l0aCB0aGUgc2FtZSB2YWx1ZSBidXQgaGFzIGhhZFxuICAgICAqICBpdHMgZmllbGQgc2V0IHRvICUlZm9ybWF0JSUuXG4gICAgICpcbiAgICAgKiAgVGhpcyB3aWxsIHRocm93IGlmIHRoZSB2YWx1ZSBjYW5ub3QgZml0IGludG8gJSVmb3JtYXQlJS5cbiAgICAgKi9cbiAgICB0b0Zvcm1hdChmb3JtYXQpIHtcbiAgICAgICAgcmV0dXJuIEZpeGVkTnVtYmVyLmZyb21TdHJpbmcodGhpcy50b1N0cmluZygpLCBmb3JtYXQpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiAgQ3JlYXRlcyBhIG5ldyBbW0ZpeGVkTnVtYmVyXV0gZm9yICUldmFsdWUlJSBkaXZpZGVkIGJ5XG4gICAgICogICUlZGVjaW1hbCUlIHBsYWNlcyB3aXRoICUlZm9ybWF0JSUuXG4gICAgICpcbiAgICAgKiAgVGhpcyB3aWxsIHRocm93IGEgW1tOdW1lcmljRmF1bHRFcnJvcl1dIGlmICUldmFsdWUlJSAob25jZSBhZGp1c3RlZFxuICAgICAqICBmb3IgJSVkZWNpbWFscyUlKSBjYW5ub3QgZml0IGluICUlZm9ybWF0JSUsIGVpdGhlciBkdWUgdG8gb3ZlcmZsb3dcbiAgICAgKiAgb3IgdW5kZXJmbG93IChwcmVjaXNpb24gbG9zcykuXG4gICAgICovXG4gICAgc3RhdGljIGZyb21WYWx1ZShfdmFsdWUsIF9kZWNpbWFscywgX2Zvcm1hdCkge1xuICAgICAgICBjb25zdCBkZWNpbWFscyA9IChfZGVjaW1hbHMgPT0gbnVsbCkgPyAwIDogZ2V0TnVtYmVyKF9kZWNpbWFscyk7XG4gICAgICAgIGNvbnN0IGZvcm1hdCA9IGdldEZvcm1hdChfZm9ybWF0KTtcbiAgICAgICAgbGV0IHZhbHVlID0gZ2V0QmlnSW50KF92YWx1ZSwgXCJ2YWx1ZVwiKTtcbiAgICAgICAgY29uc3QgZGVsdGEgPSBkZWNpbWFscyAtIGZvcm1hdC5kZWNpbWFscztcbiAgICAgICAgaWYgKGRlbHRhID4gMCkge1xuICAgICAgICAgICAgY29uc3QgdGVucyA9IGdldFRlbnMoZGVsdGEpO1xuICAgICAgICAgICAgYXNzZXJ0KCh2YWx1ZSAlIHRlbnMpID09PSBCTl8wLCBcInZhbHVlIGxvc2VzIHByZWNpc2lvbiBmb3IgZm9ybWF0XCIsIFwiTlVNRVJJQ19GQVVMVFwiLCB7XG4gICAgICAgICAgICAgICAgb3BlcmF0aW9uOiBcImZyb21WYWx1ZVwiLCBmYXVsdDogXCJ1bmRlcmZsb3dcIiwgdmFsdWU6IF92YWx1ZVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB2YWx1ZSAvPSB0ZW5zO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGRlbHRhIDwgMCkge1xuICAgICAgICAgICAgdmFsdWUgKj0gZ2V0VGVucygtZGVsdGEpO1xuICAgICAgICB9XG4gICAgICAgIGNoZWNrVmFsdWUodmFsdWUsIGZvcm1hdCwgXCJmcm9tVmFsdWVcIik7XG4gICAgICAgI
26774HJldHVybiBuZXcgRml4ZWROdW1iZXIoX2d1YXJkLCB2YWx1ZSwgZm9ybWF0KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogIENyZWF0ZXMgYSBuZXcgW1tGaXhlZE51bWJlcl1dIGZvciAlJXZhbHVlJSUgd2l0aCAlJWZvcm1hdCUlLlxuICAgICAqXG4gICAgICogIFRoaXMgd2lsbCB0aHJvdyBhIFtbTnVtZXJpY0ZhdWx0RXJyb3JdXSBpZiAlJXZhbHVlJSUgY2Fubm90IGZpdFxuICAgICAqICBpbiAlJWZvcm1hdCUlLCBlaXRoZXIgZHVlIHRvIG92ZXJmbG93IG9yIHVuZGVyZmxvdyAocHJlY2lzaW9uIGxvc3MpLlxuICAgICAqL1xuICAgIHN0YXRpYyBmcm9tU3RyaW5nKF92YWx1ZSwgX2Zvcm1hdCkge1xuICAgICAgICBjb25zdCBtYXRjaCA9IF92YWx1ZS5tYXRjaCgvXigtPykoWzAtOV0qKVxcLj8oWzAtOV0qKSQvKTtcbiAgICAgICAgYXNzZXJ0QXJndW1lbnQobWF0Y2ggJiYgKG1hdGNoWzJdLmxlbmd0aCArIG1hdGNoWzNdLmxlbmd0aCkgPiAwLCBcImludmFsaWQgRml4ZWROdW1iZXIgc3RyaW5nIHZhbHVlXCIsIFwidmFsdWVcIiwgX3ZhbHVlKTtcbiAgICAgICAgY29uc3QgZm9ybWF0ID0gZ2V0Rm9ybWF0KF9mb3JtYXQpO1xuICAgICAgICBsZXQgd2hvbGUgPSAobWF0Y2hbMl0gfHwgXCIwXCIpLCBkZWNpbWFsID0gKG1hdGNoWzNdIHx8IFwiXCIpO1xuICAgICAgICAvLyBQYWQgb3V0IHRoZSBkZWNpbWFsc1xuICAgICAgICB3aGlsZSAoZGVjaW1hbC5sZW5ndGggPCBmb3JtYXQuZGVjaW1hbHMpIHtcbiAgICAgICAgICAgIGRlY2ltYWwgKz0gWmVyb3M7XG4gICAgICAgIH1cbiAgICAgICAgLy8gQ2hlY2sgcHJlY2lzaW9uIGlzIHNhZmVcbiAgICAgICAgYXNzZXJ0KGRlY2ltYWwuc3Vic3RyaW5nKGZvcm1hdC5kZWNpbWFscykubWF0Y2goL14wKiQvKSwgXCJ0b28gbWFueSBkZWNpbWFscyBmb3IgZm9ybWF0XCIsIFwiTlVNRVJJQ19GQVVMVFwiLCB7XG4gICAgICAgICAgICBvcGVyYXRpb246IFwiZnJvbVN0cmluZ1wiLCBmYXVsdDogXCJ1bmRlcmZsb3dcIiwgdmFsdWU6IF92YWx1ZVxuICAgICAgICB9KTtcbiAgICAgICAgLy8gUmVtb3ZlIGV4dHJhIHBhZGRpbmdcbiAgICAgICAgZGVjaW1hbCA9IGRlY2ltYWwuc3Vic3RyaW5nKDAsIGZvcm1hdC5kZWNpbWFscyk7XG4gICAgICAgIGNvbnN0IHZhbHVlID0gQmlnSW50KG1hdGNoWzFdICsgd2hvbGUgKyBkZWNpbWFsKTtcbiAgICAgICAgY2hlY2tWYWx1ZSh2YWx1ZSwgZm9ybWF0LCBcImZyb21TdHJpbmdcIik7XG4gICAgICAgIHJldHVybiBuZXcgRml4ZWROdW1iZXIoX2d1YXJkLCB2YWx1ZSwgZm9ybWF0KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogIENyZWF0ZXMgYSBuZXcgW1tGaXhlZE51bWJlcl1dIHdpdGggdGhlIGJpZy1lbmRpYW4gcmVwcmVzZW50YXRpb25cbiAgICAgKiAgJSV2YWx1ZSUlIHdpdGggJSVmb3JtYXQlJS5cbiAgICAgKlxuICAgICAqICBUaGlzIHdpbGwgdGhyb3cgYSBbW051bWVyaWNGYXVsdEVycm9yXV0gaWYgJSV2YWx1ZSUlIGNhbm5vdCBmaXRcbiAgICAgKiAgaW4gJSVmb3JtYXQlJSBkdWUgdG8gb3ZlcmZsb3cuXG4gICAgICovXG4gICAgc3RhdGljIGZyb21CeXRlcyhfdmFsdWUsIF9mb3JtYXQpIHtcbiAgICAgICAgbGV0IHZhbHVlID0gdG9CaWdJbnQoZ2V0Qnl0ZXMoX3ZhbHVlLCBcInZhbHVlXCIpKTtcbiAgICAgICAgY29uc3QgZm9ybWF0ID0gZ2V0Rm9ybWF0KF9mb3JtYXQpO1xuICAgICAgICBpZiAoZm9ybWF0LnNpZ25lZCkge1xuICAgICAgICAgICAgdmFsdWUgPSBmcm9tVHdvcyh2YWx1ZSwgZm9ybWF0LndpZHRoKTtcbiAgICAgICAgfVxuICAgICAgICBjaGVja1ZhbHVlKHZhbHVlLCBmb3JtYXQsIFwiZnJvbUJ5dGVzXCIpO1xuICAgICAgICByZXR1cm4gbmV3IEZpeGVkTnVtYmVyKF9ndWFyZCwgdmFsdWUsIGZvcm1hdCk7XG4gICAgfVxufVxuLy9jb25zdCBmMSA9IEZpeGVkTnVtYmVyLmZyb21TdHJpbmcoXCIxMi41NlwiLCBcImZpeGVkMTZ4MlwiKTtcbi8vY29uc3QgZjIgPSBGaXhlZE51bWJlci5mcm9tU3RyaW5nKFwiMC4zXCIsIFwiZml4ZWQxNngyXCIpO1xuLy9jb25zb2xlLmxvZyhmMS5kaXZTaWduYWwoZjIpKTtcbi8vY29uc3QgQlVNUCA9IEZpeGVkTnVtYmVyLmZyb20oXCIwLjVcIik7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1maXhlZG51bWJlci5qcy5tYXAiLCIvL1NlZTogaHR0cHM6Ly9naXRodWIuY29tL2V0aGVyZXVtL3dpa2kvd2lraS9STFBcbmltcG9ydCB7IGhleGxpZnkgfSBmcm9tIFwiLi9kYXRhLmpzXCI7XG5pbXBvcnQgeyBhc3NlcnQsIGFzc2VydEFyZ3VtZW50IH0gZnJvbSBcIi4vZXJyb3JzLmpzXCI7XG5pbXBvcnQgeyBnZXRCeXRlcyB9IGZyb20gXCIuL2RhdGEuanNcIjtcbmZ1bmN0aW9uIGhleGxpZnlCeXRlKHZhbHVlKSB7XG4gICAgbGV0IHJlc3VsdCA9IHZhbHVlLnRvU3RyaW5nKDE2KTtcbiAgICB3aGlsZSAocmVzdWx0Lmxlbmd0aCA8IDIpIHtcbiAgICAgICAgcmVzdWx0ID0gXCIwXCIgKyByZXN1bHQ7XG4gICAgfVxuICAgIHJldHVybiBcIjB4XCIgKyByZXN1bHQ7XG59XG5mdW5jdGlvbiB1bmFycmF5aWZ5SW50ZWdlcihkYXRhLCBvZmZzZXQsIGxlbmd0aCkge1xuICAgIGxldCByZXN1bHQgPSAwO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHtcbiAgICAgICAgcmVzdWx0ID0gKHJlc3VsdCAqIDI1NikgKyBkYXRhW29mZnNldCArIGldO1xuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xufVxuZnVuY3Rpb24gX2RlY29kZUNoaWxkcmVuKGRhdGEsIG9mZnNldCwgY2hpbGRPZmZzZXQsIGxlbmd0aCkge1xuICAgIGNvbnN0IHJlc3VsdCA9IFtdO1xuICAgIHdoaWxlIChjaGlsZE9mZnNldCA8IG9mZnNldCArIDEgKyBsZW5ndGgpIHtcbiAgICAgICAgY29uc3QgZGVjb2RlZCA9IF9kZWNvZGUoZGF0YSwgY2hpbGRPZmZzZXQpO1xuICAgICAgICByZXN1bHQucHVzaChkZWNvZGVkLnJlc3VsdCk7XG4gICAgICAgIGNoaWxkT2Zmc2V0ICs9IGRlY29kZWQuY29uc3VtZWQ7XG4gICAgICAgIGFzc2VydChjaGlsZE9mZnNldCA8PSBvZmZzZXQgKyAxICsgbGVuZ3RoLCBcImNoaWxkIGRhdGEgdG9vIHNob3J0XCIsIFwiQlVGRkVSX09WRVJSVU5cIiwge1xuICAgICAgICAgICAgYnVmZmVyOiBkYXRhLCBsZW5ndGgsIG9mZnNldFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgcmV0dXJuIHsgY29uc3VtZWQ6ICgxICsgbGVuZ3RoKSwgcmVzdWx0OiByZXN1bHQgfTtcbn1cbi8vIHJldHVybnMgeyBjb25zdW1lZDogbnVtYmVyLCByZXN1bHQ6IE9iamVjdCB9XG5mdW5jdGlvbiBfZGVjb2RlKGRhdGEsIG9mZnNldCkge1xuICAgIGFzc2VydChkYXRhLmxlbmd0aCAhPT0gMCwgXCJkYXRhIHRvbyBzaG9ydFwiLCBcIkJVRkZFUl9PVkVSUlVOXCIsIHtcbiAgICAgICAgYnVmZmVyOiBkYXRhLCBsZW5ndGg6IDAsIG9mZnNldDogMVxuICAgIH0pO1xuICAgIGNvbnN0IGNoZWNrT2Zmc2V0ID0gKG9mZnNldCkgPT4ge1xuICAgICAgICBhc3NlcnQob2Zmc2V0IDw9IGRhdGEubGVuZ3RoLCBcImRhdGEgc2hvcnQgc2VnbWVudCB0b28gc2hvcnRcIiwgXCJCVUZGRVJfT1ZFUlJVTlwiLCB7XG4gICAgICAgICAgICBidWZmZXI6IGRhdGEsIGxlbmd0aDogZGF0YS5sZW5ndGgsIG9mZnNldFxuICAgICAgICB9KTtcbiAgICB9O1xuICAgIC8vIEFycmF5IHdpdGggZXh0cmEgbGVuZ3RoIHByZWZpeFxuICAgIGlmIChkYXRhW29mZnNldF0gPj0gMHhmOCkge1xuICAgICAgICBjb25zdCBsZW5ndGhMZW5ndGggPSBkYXRhW29mZnNldF0gLSAweGY3O1xuICAgICAgICBjaGVja09mZnNldChvZmZzZXQgKyAxICsgbGVuZ3RoTGVuZ3RoKTtcbiAgICAgICAgY29uc3QgbGVuZ3RoID0gdW5hcnJheWlmeUludGVnZXIoZGF0YSwgb2Zmc2V0ICsgMSwgbGVuZ3RoTGVuZ3RoKTtcbiAgICAgICAgY2hlY2tPZmZzZXQob2Zmc2V0ICsgMSArIGxlbmd0aExlbmd0aCArIGxlbmd0aCk7XG4gICAgICAgI
26774HJldHVybiBfZGVjb2RlQ2hpbGRyZW4oZGF0YSwgb2Zmc2V0LCBvZmZzZXQgKyAxICsgbGVuZ3RoTGVuZ3RoLCBsZW5ndGhMZW5ndGggKyBsZW5ndGgpO1xuICAgIH1cbiAgICBlbHNlIGlmIChkYXRhW29mZnNldF0gPj0gMHhjMCkge1xuICAgICAgICBjb25zdCBsZW5ndGggPSBkYXRhW29mZnNldF0gLSAweGMwO1xuICAgICAgICBjaGVja09mZnNldChvZmZzZXQgKyAxICsgbGVuZ3RoKTtcbiAgICAgICAgcmV0dXJuIF9kZWNvZGVDaGlsZHJlbihkYXRhLCBvZmZzZXQsIG9mZnNldCArIDEsIGxlbmd0aCk7XG4gICAgfVxuICAgIGVsc2UgaWYgKGRhdGFbb2Zmc2V0XSA+PSAweGI4KSB7XG4gICAgICAgIGNvbnN0IGxlbmd0aExlbmd0aCA9IGRhdGFbb2Zmc2V0XSAtIDB4Yjc7XG4gICAgICAgIGNoZWNrT2Zmc2V0KG9mZnNldCArIDEgKyBsZW5ndGhMZW5ndGgpO1xuICAgICAgICBjb25zdCBsZW5ndGggPSB1bmFycmF5aWZ5SW50ZWdlcihkYXRhLCBvZmZzZXQgKyAxLCBsZW5ndGhMZW5ndGgpO1xuICAgICAgICBjaGVja09mZnNldChvZmZzZXQgKyAxICsgbGVuZ3RoTGVuZ3RoICsgbGVuZ3RoKTtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gaGV4bGlmeShkYXRhLnNsaWNlKG9mZnNldCArIDEgKyBsZW5ndGhMZW5ndGgsIG9mZnNldCArIDEgKyBsZW5ndGhMZW5ndGggKyBsZW5ndGgpKTtcbiAgICAgICAgcmV0dXJuIHsgY29uc3VtZWQ6ICgxICsgbGVuZ3RoTGVuZ3RoICsgbGVuZ3RoKSwgcmVzdWx0OiByZXN1bHQgfTtcbiAgICB9XG4gICAgZWxzZSBpZiAoZGF0YVtvZmZzZXRdID49IDB4ODApIHtcbiAgICAgICAgY29uc3QgbGVuZ3RoID0gZGF0YVtvZmZzZXRdIC0gMHg4MDtcbiAgICAgICAgY2hlY2tPZmZzZXQob2Zmc2V0ICsgMSArIGxlbmd0aCk7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGhleGxpZnkoZGF0YS5zbGljZShvZmZzZXQgKyAxLCBvZmZzZXQgKyAxICsgbGVuZ3RoKSk7XG4gICAgICAgIHJldHVybiB7IGNvbnN1bWVkOiAoMSArIGxlbmd0aCksIHJlc3VsdDogcmVzdWx0IH07XG4gICAgfVxuICAgIHJldHVybiB7IGNvbnN1bWVkOiAxLCByZXN1bHQ6IGhleGxpZnlCeXRlKGRhdGFbb2Zmc2V0XSkgfTtcbn1cbi8qKlxuICogIERlY29kZXMgJSVkYXRhJSUgaW50byB0aGUgc3RydWN0dXJlZCBkYXRhIGl0IHJlcHJlc2VudHMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBkZWNvZGVSbHAoX2RhdGEpIHtcbiAgICBjb25zdCBkYXRhID0gZ2V0Qnl0ZXMoX2RhdGEsIFwiZGF0YVwiKTtcbiAgICBjb25zdCBkZWNvZGVkID0gX2RlY29kZShkYXRhLCAwKTtcbiAgICBhc3NlcnRBcmd1bWVudChkZWNvZGVkLmNvbnN1bWVkID09PSBkYXRhLmxlbmd0aCwgXCJ1bmV4cGVjdGVkIGp1bmsgYWZ0ZXIgcmxwIHBheWxvYWRcIiwgXCJkYXRhXCIsIF9kYXRhKTtcbiAgICByZXR1cm4gZGVjb2RlZC5yZXN1bHQ7XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1ybHAtZGVjb2RlLmpzLm1hcCIsIi8vU2VlOiBodHRwczovL2dpdGh1Yi5jb20vZXRoZXJldW0vd2lraS93aWtpL1JMUFxuaW1wb3J0IHsgZ2V0Qnl0ZXMgfSBmcm9tIFwiLi9kYXRhLmpzXCI7XG5mdW5jdGlvbiBhcnJheWlmeUludGVnZXIodmFsdWUpIHtcbiAgICBjb25zdCByZXN1bHQgPSBbXTtcbiAgICB3aGlsZSAodmFsdWUpIHtcbiAgICAgICAgcmVzdWx0LnVuc2hpZnQodmFsdWUgJiAweGZmKTtcbiAgICAgICAgdmFsdWUgPj49IDg7XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG59XG5mdW5jdGlvbiBfZW5jb2RlKG9iamVjdCkge1xuICAgIGlmIChBcnJheS5pc0FycmF5KG9iamVjdCkpIHtcbiAgICAgICAgbGV0IHBheWxvYWQgPSBbXTtcbiAgICAgICAgb2JqZWN0LmZvckVhY2goZnVuY3Rpb24gKGNoaWxkKSB7XG4gICAgICAgICAgICBwYXlsb2FkID0gcGF5bG9hZC5jb25jYXQoX2VuY29kZShjaGlsZCkpO1xuICAgICAgICB9KTtcbiAgICAgICAgaWYgKHBheWxvYWQubGVuZ3RoIDw9IDU1KSB7XG4gICAgICAgICAgICBwYXlsb2FkLnVuc2hpZnQoMHhjMCArIHBheWxvYWQubGVuZ3RoKTtcbiAgICAgICAgICAgIHJldHVybiBwYXlsb2FkO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGxlbmd0aCA9IGFycmF5aWZ5SW50ZWdlcihwYXlsb2FkLmxlbmd0aCk7XG4gICAgICAgIGxlbmd0aC51bnNoaWZ0KDB4ZjcgKyBsZW5ndGgubGVuZ3RoKTtcbiAgICAgICAgcmV0dXJuIGxlbmd0aC5jb25jYXQocGF5bG9hZCk7XG4gICAgfVxuICAgIGNvbnN0IGRhdGEgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChnZXRCeXRlcyhvYmplY3QsIFwib2JqZWN0XCIpKTtcbiAgICBpZiAoZGF0YS5sZW5ndGggPT09IDEgJiYgZGF0YVswXSA8PSAweDdmKSB7XG4gICAgICAgIHJldHVybiBkYXRhO1xuICAgIH1cbiAgICBlbHNlIGlmIChkYXRhLmxlbmd0aCA8PSA1NSkge1xuICAgICAgICBkYXRhLnVuc2hpZnQoMHg4MCArIGRhdGEubGVuZ3RoKTtcbiAgICAgICAgcmV0dXJuIGRhdGE7XG4gICAgfVxuICAgIGNvbnN0IGxlbmd0aCA9IGFycmF5aWZ5SW50ZWdlcihkYXRhLmxlbmd0aCk7XG4gICAgbGVuZ3RoLnVuc2hpZnQoMHhiNyArIGxlbmd0aC5sZW5ndGgpO1xuICAgIHJldHVybiBsZW5ndGguY29uY2F0KGRhdGEpO1xufVxuY29uc3QgbmliYmxlcyA9IFwiMDEyMzQ1Njc4OWFiY2RlZlwiO1xuLyoqXG4gKiAgRW5jb2RlcyAlJW9iamVjdCUlIGFzIGFuIFJMUC1lbmNvZGVkIFtbRGF0YUhleFN0cmluZ11dLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZW5jb2RlUmxwKG9iamVjdCkge1xuICAgIGxldCByZXN1bHQgPSBcIjB4XCI7XG4gICAgZm9yIChjb25zdCB2IG9mIF9lbmNvZGUob2JqZWN0KSkge1xuICAgICAgICByZXN1bHQgKz0gbmliYmxlc1t2ID4+IDRdO1xuICAgICAgICByZXN1bHQgKz0gbmliYmxlc1t2ICYgMHhmXTtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXJscC1lbmNvZGUuanMubWFwIiwiLyoqXG4gKiAgTW9zdCBpbnRlcmFjdGlvbnMgd2l0aCBFdGhlcmV1bSByZXF1aXJlcyBpbnRlZ2VyIHZhbHVlcywgd2hpY2ggdXNlXG4gKiAgdGhlIHNtYWxsZXN0IG1hZ25pdHVkZSB1bml0LlxuICpcbiAqICBGb3IgZXhhbXBsZSwgaW1hZ2luZSBkZWFsaW5nIHdpdGggZG9sbGFycyBhbmQgY2VudHMuIFNpbmNlIGRvbGxhcnNcbiAqICBhcmUgZGl2aXNpYmxlLCBub24taW50ZWdlciB2YWx1ZXMgYXJlIHBvc3NpYmxlLCBzdWNoIGFzIGBgJDEwLjc3YGAuXG4gKiAgQnkgdXNpbmcgdGhlIHNtYWxsZXN0IGluZGl2aXNpYmxlIHVuaXQgKGkuZS4gY2VudHMpLCB0aGUgdmFsdWUgY2FuXG4gKiAgYmUga2VwdCBhcyB0aGUgaW50ZWdlciBgYDEwNzdgYC5cbiAqXG4gKiAgV2hlbiByZWNlaXZpbmcgZGVjaW1hbCBpbnB1dCBmcm9tIHRoZSB1c2VyIChhcyBhIGRlY2ltYWwgc3RyaW5nKSxcbiAqICB0aGUgdmFsdWUgc2hvdWxkIGJlIGNvbnZlcnRlZCB0byBhbiBpbnRlZ2VyIGFuZCB3aGVuIHNob3dpbmcgYSB1c2VyXG4gKiAgYSB2YWx1ZSwgdGhlIGludGVnZXIgdmFsdWUgc2hvdWxkIGJlIGNvbnZlcnRlZCB0byBhIGRlY2ltYWwgc3RyaW5nLlxuICpcbiAqICBUaGlzIGNyZWF0ZXMgYSBjbGVhciBkaXN0aW5jdGlvbiwgYmV0d2VlbiB2YWx1ZXMgdG8gYmUgdXNlZCBieSBjb2RlXG4gKiAgKGludGVnZXJzKSBhbmQgdmFsdWVzIHVzZWQgZm9yIGRpc3BsYXkgbG9naWMgdG8gdXNlcnMgKGRlY2ltYWxzKS5cbiAqXG4gKiAgVGhlIG5hdGl2ZSB1bml0IGluIEV0aGVyZXVtLCAvL2V0aGVyLy8gaXMgZGl2aXNpYmxlIHRvIDE4IGRlY2ltYWwgcGxhY2VzLFxuICogIHdoZXJlIGVhY2ggaW5kaXZpZHVhbCB1bml0IGlzIGNhbGxlZCBhIC8vd2VpLy8uXG4gKlxuICogIEBfc3Vic2VjdGlvbiBhcGkvdXRpbHM6VW5pdCB
26774Db252ZXJzaW9uICBbYWJvdXQtdW5pdHNdXG4gKi9cbmltcG9ydCB7IGFzc2VydEFyZ3VtZW50IH0gZnJvbSBcIi4vZXJyb3JzLmpzXCI7XG5pbXBvcnQgeyBGaXhlZE51bWJlciB9IGZyb20gXCIuL2ZpeGVkbnVtYmVyLmpzXCI7XG5pbXBvcnQgeyBnZXROdW1iZXIgfSBmcm9tIFwiLi9tYXRocy5qc1wiO1xuY29uc3QgbmFtZXMgPSBbXG4gICAgXCJ3ZWlcIixcbiAgICBcImt3ZWlcIixcbiAgICBcIm13ZWlcIixcbiAgICBcImd3ZWlcIixcbiAgICBcInN6YWJvXCIsXG4gICAgXCJmaW5uZXlcIixcbiAgICBcImV0aGVyXCIsXG5dO1xuLyoqXG4gKiAgQ29udmVydHMgJSV2YWx1ZSUlIGludG8gYSAvL2RlY2ltYWwgc3RyaW5nLy8sIGFzc3VtaW5nICUldW5pdCUlIGRlY2ltYWxcbiAqICBwbGFjZXMuIFRoZSAlJXVuaXQlJSBtYXkgYmUgdGhlIG51bWJlciBvZiBkZWNpbWFsIHBsYWNlcyBvciB0aGUgbmFtZSBvZlxuICogIGEgdW5pdCAoZS5nLiBgYFwiZ3dlaVwiYGAgZm9yIDkgZGVjaW1hbCBwbGFjZXMpLlxuICpcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGZvcm1hdFVuaXRzKHZhbHVlLCB1bml0KSB7XG4gICAgbGV0IGRlY2ltYWxzID0gMTg7XG4gICAgaWYgKHR5cGVvZiAodW5pdCkgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgY29uc3QgaW5kZXggPSBuYW1lcy5pbmRleE9mKHVuaXQpO1xuICAgICAgICBhc3NlcnRBcmd1bWVudChpbmRleCA+PSAwLCBcImludmFsaWQgdW5pdFwiLCBcInVuaXRcIiwgdW5pdCk7XG4gICAgICAgIGRlY2ltYWxzID0gMyAqIGluZGV4O1xuICAgIH1cbiAgICBlbHNlIGlmICh1bml0ICE9IG51bGwpIHtcbiAgICAgICAgZGVjaW1hbHMgPSBnZXROdW1iZXIodW5pdCwgXCJ1bml0XCIpO1xuICAgIH1cbiAgICByZXR1cm4gRml4ZWROdW1iZXIuZnJvbVZhbHVlKHZhbHVlLCBkZWNpbWFscywgeyBkZWNpbWFscywgd2lkdGg6IDUxMiB9KS50b1N0cmluZygpO1xufVxuLyoqXG4gKiAgQ29udmVydHMgdGhlIC8vZGVjaW1hbCBzdHJpbmcvLyAlJXZhbHVlJSUgdG8gYSBCaWdJbnQsIGFzc3VtaW5nXG4gKiAgJSV1bml0JSUgZGVjaW1hbCBwbGFjZXMuIFRoZSAlJXVuaXQlJSBtYXkgdGhlIG51bWJlciBvZiBkZWNpbWFsIHBsYWNlc1xuICogIG9yIHRoZSBuYW1lIG9mIGEgdW5pdCAoZS5nLiBgYFwiZ3dlaVwiYGAgZm9yIDkgZGVjaW1hbCBwbGFjZXMpLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcGFyc2VVbml0cyh2YWx1ZSwgdW5pdCkge1xuICAgIGFzc2VydEFyZ3VtZW50KHR5cGVvZiAodmFsdWUpID09PSBcInN0cmluZ1wiLCBcInZhbHVlIG11c3QgYmUgYSBzdHJpbmdcIiwgXCJ2YWx1ZVwiLCB2YWx1ZSk7XG4gICAgbGV0IGRlY2ltYWxzID0gMTg7XG4gICAgaWYgKHR5cGVvZiAodW5pdCkgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgY29uc3QgaW5kZXggPSBuYW1lcy5pbmRleE9mKHVuaXQpO1xuICAgICAgICBhc3NlcnRBcmd1bWVudChpbmRleCA+PSAwLCBcImludmFsaWQgdW5pdFwiLCBcInVuaXRcIiwgdW5pdCk7XG4gICAgICAgIGRlY2ltYWxzID0gMyAqIGluZGV4O1xuICAgIH1cbiAgICBlbHNlIGlmICh1bml0ICE9IG51bGwpIHtcbiAgICAgICAgZGVjaW1hbHMgPSBnZXROdW1iZXIodW5pdCwgXCJ1bml0XCIpO1xuICAgIH1cbiAgICByZXR1cm4gRml4ZWROdW1iZXIuZnJvbVN0cmluZyh2YWx1ZSwgeyBkZWNpbWFscywgd2lkdGg6IDUxMiB9KS52YWx1ZTtcbn1cbi8qKlxuICogIENvbnZlcnRzICUldmFsdWUlJSBpbnRvIGEgLy9kZWNpbWFsIHN0cmluZy8vIHVzaW5nIDE4IGRlY2ltYWwgcGxhY2VzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZm9ybWF0RXRoZXIod2VpKSB7XG4gICAgcmV0dXJuIGZvcm1hdFVuaXRzKHdlaSwgMTgpO1xufVxuLyoqXG4gKiAgQ29udmVydHMgdGhlIC8vZGVjaW1hbCBzdHJpbmcvLyAlJWV0aGVyJSUgdG8gYSBCaWdJbnQsIHVzaW5nIDE4XG4gKiAgZGVjaW1hbCBwbGFjZXMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwYXJzZUV0aGVyKGV0aGVyKSB7XG4gICAgcmV0dXJuIHBhcnNlVW5pdHMoZXRoZXIsIDE4KTtcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXVuaXRzLmpzLm1hcCIsIi8qKlxuICogIEV4cGxhaW4gVVVJRCBhbmQgbGluayB0byBSRkMgaGVyZS5cbiAqXG4gKiAgQF9zdWJzZWN0aW9uOiBhcGkvdXRpbHM6VVVJRCAgW2Fib3V0LXV1aWRdXG4gKi9cbmltcG9ydCB7IGdldEJ5dGVzLCBoZXhsaWZ5IH0gZnJvbSBcIi4vZGF0YS5qc1wiO1xuLyoqXG4gKiAgUmV0dXJucyB0aGUgdmVyc2lvbiA0IFtbbGluay11dWlkXV0gZm9yIHRoZSAlJXJhbmRvbUJ5dGVzJSUuXG4gKlxuICogIEBzZWU6IGh0dHBzOi8vd3d3LmlldGYub3JnL3JmYy9yZmM0MTIyLnR4dCAoU2VjdGlvbiA0LjQpXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB1dWlkVjQocmFuZG9tQnl0ZXMpIHtcbiAgICBjb25zdCBieXRlcyA9IGdldEJ5dGVzKHJhbmRvbUJ5dGVzLCBcInJhbmRvbUJ5dGVzXCIpO1xuICAgIC8vIFNlY3Rpb246IDQuMS4zOlxuICAgIC8vIC0gdGltZV9oaV9hbmRfdmVyc2lvblsxMjoxNl0gPSAwYjAxMDBcbiAgICBieXRlc1s2XSA9IChieXRlc1s2XSAmIDB4MGYpIHwgMHg0MDtcbiAgICAvLyBTZWN0aW9uIDQuNFxuICAgIC8vIC0gY2xvY2tfc2VxX2hpX2FuZF9yZXNlcnZlZFs2XSA9IDBiMFxuICAgIC8vIC0gY2xvY2tfc2VxX2hpX2FuZF9yZXNlcnZlZFs3XSA9IDBiMVxuICAgIGJ5dGVzWzhdID0gKGJ5dGVzWzhdICYgMHgzZikgfCAweDgwO1xuICAgIGNvbnN0IHZhbHVlID0gaGV4bGlmeShieXRlcyk7XG4gICAgcmV0dXJuIFtcbiAgICAgICAgdmFsdWUuc3Vic3RyaW5nKDIsIDEwKSxcbiAgICAgICAgdmFsdWUuc3Vic3RyaW5nKDEwLCAxNCksXG4gICAgICAgIHZhbHVlLnN1YnN0cmluZygxNCwgMTgpLFxuICAgICAgICB2YWx1ZS5zdWJzdHJpbmcoMTgsIDIyKSxcbiAgICAgICAgdmFsdWUuc3Vic3RyaW5nKDIyLCAzNCksXG4gICAgXS5qb2luKFwiLVwiKTtcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXV1aWQuanMubWFwIiwiaW1wb3J0IHsgZGVmaW5lUHJvcGVydGllcywgY29uY2F0LCBnZXRCeXRlc0NvcHksIGdldE51bWJlciwgaGV4bGlmeSwgdG9CZUFycmF5LCB0b0JpZ0ludCwgdG9OdW1iZXIsIGFzc2VydCwgYXNzZXJ0QXJndW1lbnRcbi8qLCBpc0Vycm9yKi9cbiB9IGZyb20gXCIuLi8uLi91dGlscy9pbmRleC5qc1wiO1xuLyoqXG4gKiBAX2lnbm9yZTpcbiAqL1xuZXhwb3J0IGNvbnN0IFdvcmRTaXplID0gMzI7XG5jb25zdCBQYWRkaW5nID0gbmV3IFVpbnQ4QXJyYXkoV29yZFNpemUpO1xuLy8gUHJvcGVydGllcyB1c2VkIHRvIGltbWVkaWF0ZSBwYXNzIHRocm91Z2ggdG8gdGhlIHVuZGVybHlpbmcgb2JqZWN0XG4vLyAtIGB0aGVuYCBpcyB1c2VkIHRvIGRldGVjdCBpZiBhbiBvYmplY3QgaXMgYSBQcm9taXNlIGZvciBhd2FpdFxuY29uc3QgcGFzc1Byb3BlcnRpZXMgPSBbXCJ0aGVuXCJdO1xuY29uc3QgX2d1YXJkID0ge307XG5jb25zdCByZXN1bHROYW1lcyA9IG5ldyBXZWFrTWFwKCk7XG5mdW5jdGlvbiBnZXROYW1lcyhyZXN1bHQpIHtcbiAgICByZXR1cm4gcmVzdWx0TmFtZXMuZ2V0KHJlc3VsdCk7XG59XG5mdW5jdGlvbiBzZXROYW1lcyhyZXN1bHQsIG5hbWVzKSB7XG4gICAgcmVzdWx0TmFtZXMuc2V0KHJlc3VsdCwgbmFtZXMpO1xufVxuZnVuY3Rpb24gdGhyb3dFcnJvcihuYW1lLCBlcnJvcikge1xuICAgIGNvbnN0IHdyYXBwZWQgPSBuZXcgRXJyb3IoYGRlZmVycmVkIGVycm9yIGR1cmluZyBBQkkgZGVjb2RpbmcgdHJpZ2dlcmVkIGFjY2Vzc2luZyAke25hbWV9YCk7XG4gICAgd3JhcHBlZC5lcnJvciA9IGVycm9yO1xuICAgIHRocm93IHdyYXBwZWQ7XG59XG5mdW5jdGlvbiB0b09iamVjdChuYW1lcywgaXRlbXMsIGRlZXApIHtcbiAgICBpZiAobmFtZXMuaW5kZXhPZihudWxsKSA+PSAwKSB7XG4gICAgICAgI
26774HJldHVybiBpdGVtcy5tYXAoKGl0ZW0sIGluZGV4KSA9PiB7XG4gICAgICAgICAgICBpZiAoaXRlbSBpbnN0YW5jZW9mIFJlc3VsdCkge1xuICAgICAgICAgICAgICAgIHJldHVybiB0b09iamVjdChnZXROYW1lcyhpdGVtKSwgaXRlbSwgZGVlcCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gaXRlbTtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHJldHVybiBuYW1lcy5yZWR1Y2UoKGFjY3VtLCBuYW1lLCBpbmRleCkgPT4ge1xuICAgICAgICBsZXQgaXRlbSA9IGl0ZW1zLmdldFZhbHVlKG5hbWUpO1xuICAgICAgICBpZiAoIShuYW1lIGluIGFjY3VtKSkge1xuICAgICAgICAgICAgaWYgKGRlZXAgJiYgaXRlbSBpbnN0YW5jZW9mIFJlc3VsdCkge1xuICAgICAgICAgICAgICAgIGl0ZW0gPSB0b09iamVjdChnZXROYW1lcyhpdGVtKSwgaXRlbSwgZGVlcCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBhY2N1bVtuYW1lXSA9IGl0ZW07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGFjY3VtO1xuICAgIH0sIHt9KTtcbn1cbi8qKlxuICogIEEgW1tSZXN1bHRdXSBpcyBhIHN1Yi1jbGFzcyBvZiBBcnJheSwgd2hpY2ggYWxsb3dzIGFjY2Vzc2luZyBhbnlcbiAqICBvZiBpdHMgdmFsdWVzIGVpdGhlciBwb3NpdGlvbmFsbHkgYnkgaXRzIGluZGV4IG9yLCBpZiBrZXlzIGFyZVxuICogIHByb3ZpZGVkIGJ5IGl0cyBuYW1lLlxuICpcbiAqICBAX2RvY2xvYzogYXBpL2FiaVxuICovXG5leHBvcnQgY2xhc3MgUmVzdWx0IGV4dGVuZHMgQXJyYXkge1xuICAgIC8vIE5vIGxvbmdlciB1c2VkOyBidXQgY2Fubm90IGJlIHJlbW92ZWQgYXMgaXQgd2lsbCByZW1vdmUgdGhlXG4gICAgLy8gI3ByaXZhdGUgZmllbGQgZnJvbSB0aGUgLmQudHMgd2hpY2ggbWF5IGJyZWFrIGJhY2t3YXJkc1xuICAgIC8vIGNvbXBhdGliaWxpdHlcbiAgICAjbmFtZXM7XG4gICAgLyoqXG4gICAgICogIEBwcml2YXRlXG4gICAgICovXG4gICAgY29uc3RydWN0b3IoLi4uYXJncykge1xuICAgICAgICAvLyBUbyBwcm9wZXJseSBzdWItY2xhc3MgQXJyYXkgc28gdGhlIG90aGVyIGJ1aWx0LWluXG4gICAgICAgIC8vIGZ1bmN0aW9ucyB3b3JrLCB0aGUgY29uc3RydWN0b3IgaGFzIHRvIGJlaGF2ZSBmYWlybHlcbiAgICAgICAgLy8gd2VsbC4gU28sIGluIHRoZSBldmVudCB3ZSBhcmUgY3JlYXRlZCB2aWEgZnJvbUl0ZW1zKClcbiAgICAgICAgLy8gd2UgYnVpbGQgdGhlIHJlYWQtb25seSBSZXN1bHQgb2JqZWN0IHdlIHdhbnQsIGJ1dCBvblxuICAgICAgICAvLyBhbnkgb3RoZXIgaW5wdXQsIHdlIHVzZSB0aGUgZGVmYXVsdCBjb25zdHJ1Y3RvclxuICAgICAgICAvLyBjb25zdHJ1Y3RvcihndWFyZDogYW55LCBpdGVtczogQXJyYXk8YW55Piwga2V5cz86IEFycmF5PG51bGwgfCBzdHJpbmc+KTtcbiAgICAgICAgY29uc3QgZ3VhcmQgPSBhcmdzWzBdO1xuICAgICAgICBsZXQgaXRlbXMgPSBhcmdzWzFdO1xuICAgICAgICBsZXQgbmFtZXMgPSAoYXJnc1syXSB8fCBbXSkuc2xpY2UoKTtcbiAgICAgICAgbGV0IHdyYXAgPSB0cnVlO1xuICAgICAgICBpZiAoZ3VhcmQgIT09IF9ndWFyZCkge1xuICAgICAgICAgICAgaXRlbXMgPSBhcmdzO1xuICAgICAgICAgICAgbmFtZXMgPSBbXTtcbiAgICAgICAgICAgIHdyYXAgPSBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICAvLyBDYW4ndCBqdXN0IHBhc3MgaW4gLi4uaXRlbXMgc2luY2UgYW4gYXJyYXkgb2YgbGVuZ3RoIDFcbiAgICAgICAgLy8gaXMgYSBzcGVjaWFsIGNhc2UgaW4gdGhlIHN1cGVyLlxuICAgICAgICBzdXBlcihpdGVtcy5sZW5ndGgpO1xuICAgICAgICBpdGVtcy5mb3JFYWNoKChpdGVtLCBpbmRleCkgPT4geyB0aGlzW2luZGV4XSA9IGl0ZW07IH0pO1xuICAgICAgICAvLyBGaW5kIGFsbCB1bmlxdWUga2V5c1xuICAgICAgICBjb25zdCBuYW1lQ291bnRzID0gbmFtZXMucmVkdWNlKChhY2N1bSwgbmFtZSkgPT4ge1xuICAgICAgICAgICAgaWYgKHR5cGVvZiAobmFtZSkgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgICAgICAgICBhY2N1bS5zZXQobmFtZSwgKGFjY3VtLmdldChuYW1lKSB8fCAwKSArIDEpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGFjY3VtO1xuICAgICAgICB9LCAobmV3IE1hcCgpKSk7XG4gICAgICAgIC8vIFJlbW92ZSBhbnkga2V5IHRoYXRzIG5vdCB1bmlxdWVcbiAgICAgICAgc2V0TmFtZXModGhpcywgT2JqZWN0LmZyZWV6ZShpdGVtcy5tYXAoKGl0ZW0sIGluZGV4KSA9PiB7XG4gICAgICAgICAgICBjb25zdCBuYW1lID0gbmFtZXNbaW5kZXhdO1xuICAgICAgICAgICAgaWYgKG5hbWUgIT0gbnVsbCAmJiBuYW1lQ291bnRzLmdldChuYW1lKSA9PT0gMSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBuYW1lO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH0pKSk7XG4gICAgICAgIC8vIER1bW15IG9wZXJhdGlvbnMgdG8gcHJldmVudCBUeXBlU2NyaXB0IGZyb20gY29tcGxhaW5pbmdcbiAgICAgICAgdGhpcy4jbmFtZXMgPSBbXTtcbiAgICAgICAgaWYgKHRoaXMuI25hbWVzID09IG51bGwpIHtcbiAgICAgICAgICAgIHZvaWQgKHRoaXMuI25hbWVzKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIXdyYXApIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICAvLyBBIHdyYXBwZWQgUmVzdWx0IGlzIGltbXV0YWJsZVxuICAgICAgICBPYmplY3QuZnJlZXplKHRoaXMpO1xuICAgICAgICAvLyBQcm94eSBpbmRpY2VzIGFuZCBuYW1lcyBzbyB3ZSBjYW4gdHJhcCBkZWZlcnJlZCBlcnJvcnNcbiAgICAgICAgY29uc3QgcHJveHkgPSBuZXcgUHJveHkodGhpcywge1xuICAgICAgICAgICAgZ2V0OiAodGFyZ2V0LCBwcm9wLCByZWNlaXZlcikgPT4ge1xuICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgKHByb3ApID09PSBcInN0cmluZ1wiKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIEluZGV4IGFjY2Vzc29yXG4gICAgICAgICAgICAgICAgICAgIGlmIChwcm9wLm1hdGNoKC9eWzAtOV0rJC8pKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbmRleCA9IGdldE51bWJlcihwcm9wLCBcIiVpbmRleFwiKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpbmRleCA8IDAgfHwgaW5kZXggPj0gdGhpcy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcihcIm91dCBvZiByZXN1bHQgcmFuZ2VcIik7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpdGVtID0gdGFyZ2V0W2luZGV4XTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpdGVtIGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvd0Vycm9yKGBpbmRleCAke2luZGV4fWAsIGl0ZW0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGl0ZW07XG4gICAgICAgICAgICAgICAgICAgI
26774H1cbiAgICAgICAgICAgICAgICAgICAgLy8gUGFzcyBpbXBvcnRhbnQgY2hlY2tzIChsaWtlIGB0aGVuYCBmb3IgUHJvbWlzZSkgdGhyb3VnaFxuICAgICAgICAgICAgICAgICAgICBpZiAocGFzc1Byb3BlcnRpZXMuaW5kZXhPZihwcm9wKSA+PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gUmVmbGVjdC5nZXQodGFyZ2V0LCBwcm9wLCByZWNlaXZlcik7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgY29uc3QgdmFsdWUgPSB0YXJnZXRbcHJvcF07XG4gICAgICAgICAgICAgICAgICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIEZ1bmN0aW9uKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBNYWtlIHN1cmUgZnVuY3Rpb25zIHdvcmsgd2l0aCBwcml2YXRlIHZhcmlhYmxlc1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gU2VlOiBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9KYXZhU2NyaXB0L1JlZmVyZW5jZS9HbG9iYWxfT2JqZWN0cy9Qcm94eSNub19wcml2YXRlX3Byb3BlcnR5X2ZvcndhcmRpbmdcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbiAoLi4uYXJncykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB2YWx1ZS5hcHBseSgodGhpcyA9PT0gcmVjZWl2ZXIpID8gdGFyZ2V0IDogdGhpcywgYXJncyk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKCEocHJvcCBpbiB0YXJnZXQpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBQb3NzaWJsZSBuYW1lIGFjY2Vzc29yXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGFyZ2V0LmdldFZhbHVlLmFwcGx5KCh0aGlzID09PSByZWNlaXZlcikgPyB0YXJnZXQgOiB0aGlzLCBbcHJvcF0pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiBSZWZsZWN0LmdldCh0YXJnZXQsIHByb3AsIHJlY2VpdmVyKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIHNldE5hbWVzKHByb3h5LCBnZXROYW1lcyh0aGlzKSk7XG4gICAgICAgIHJldHVybiBwcm94eTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogIFJldHVybnMgdGhlIFJlc3VsdCBhcyBhIG5vcm1hbCBBcnJheS4gSWYgJSVkZWVwJSUsIGFueSBjaGlsZHJlblxuICAgICAqICB3aGljaCBhcmUgUmVzdWx0IG9iamVjdHMgYXJlIGFsc28gY29udmVydGVkIHRvIGEgbm9ybWFsIEFycmF
267745LlxuICAgICAqXG4gICAgICogIFRoaXMgd2lsbCB0aHJvdyBpZiB0aGVyZSBhcmUgYW55IG91dHN0YW5kaW5nIGRlZmVycmVkXG4gICAgICogIGVycm9ycy5cbiAgICAgKi9cbiAgICB0b0FycmF5KGRlZXApIHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gW107XG4gICAgICAgIHRoaXMuZm9yRWFjaCgoaXRlbSwgaW5kZXgpID0+IHtcbiAgICAgICAgICAgIGlmIChpdGVtIGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICAgICAgICAgICAgICB0aHJvd0Vycm9yKGBpbmRleCAke2luZGV4fWAsIGl0ZW0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGRlZXAgJiYgaXRlbSBpbnN0YW5jZW9mIFJlc3VsdCkge1xuICAgICAgICAgICAgICAgIGl0ZW0gPSBpdGVtLnRvQXJyYXkoZGVlcCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXN1bHQucHVzaChpdGVtKTtcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuICAgIC8qKlxuICAgICAqICBSZXR1cm5zIHRoZSBSZXN1bHQgYXMgYW4gT2JqZWN0IHdpdGggZWFjaCBuYW1lLXZhbHVlIHBhaXIuIElmXG4gICAgICogICUlZGVlcCUlLCBhbnkgY2hpbGRyZW4gd2hpY2ggYXJlIFJlc3VsdCBvYmplY3RzIGFyZSBhbHNvXG4gICAgICogIGNvbnZlcnRlZCB0byBhbiBPYmplY3QuXG4gICAgICpcbiAgICAgKiAgVGhpcyB3aWxsIHRocm93IGlmIGFueSB2YWx1ZSBpcyB1bm5hbWVkLCBvciBpZiB0aGVyZSBhcmVcbiAgICAgKiAgYW55IG91dHN0YW5kaW5nIGRlZmVycmVkIGVycm9ycy5cbiAgICAgKi9cbiAgICB0b09iamVjdChkZWVwKSB7XG4gICAgICAgIGNvbnN0IG5hbWVzID0gZ2V0TmFtZXModGhpcyk7XG4gICAgICAgIHJldHVybiBuYW1lcy5yZWR1Y2UoKGFjY3VtLCBuYW1lLCBpbmRleCkgPT4ge1xuICAgICAgICAgICAgYXNzZXJ0KG5hbWUgIT0gbnVsbCwgYHZhbHVlIGF0IGluZGV4ICR7aW5kZXh9IHVubmFtZWRgLCBcIlVOU1VQUE9SVEVEX09QRVJBVElPTlwiLCB7XG4gICAgICAgICAgICAgICAgb3BlcmF0aW9uOiBcInRvT2JqZWN0KClcIlxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICByZXR1cm4gdG9PYmplY3QobmFtZXMsIHRoaXMsIGRlZXApO1xuICAgICAgICB9LCB7fSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqICBAX2lnbm9yZVxuICAgICAqL1xuICAgIHNsaWNlKHN0YXJ0LCBlbmQpIHtcbiAgICAgICAgaWYgKHN0YXJ0ID09IG51bGwpIHtcbiAgICAgICAgICAgIHN0YXJ0ID0gMDtcbiAgICAgICAgfVxuICAgICAgICBpZiAoc3RhcnQgPCAwKSB7XG4gICAgICAgICAgICBzdGFydCArPSB0aGlzLmxlbmd0aDtcbiAgICAgICAgICAgIGlmIChzdGFydCA8IDApIHtcbiAgICAgICAgICAgICAgICBzdGFydCA9IDA7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGVuZCA9PSBudWxsKSB7XG4gICAgICAgICAgICBlbmQgPSB0aGlzLmxlbmd0aDtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZW5kIDwgMCkge1xuICAgICAgICAgICAgZW5kICs9IHRoaXMubGVuZ3RoO1xuICAgICAgICAgICAgaWYgKGVuZCA8IDApIHtcbiAgICAgICAgICAgICAgICBlbmQgPSAwO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChlbmQgPiB0aGlzLmxlbmd0aCkge1xuICAgICAgICAgICAgZW5kID0gdGhpcy5sZW5ndGg7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgX25hbWVzID0gZ2V0TmFtZXModGhpcyk7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IFtdLCBuYW1lcyA9IFtdO1xuICAgICAgICBmb3IgKGxldCBpID0gc3RhcnQ7IGkgPCBlbmQ7IGkrKykge1xuICAgICAgICAgICAgcmVzdWx0LnB1c2godGhpc1tpXSk7XG4gICAgICAgICAgICBuYW1lcy5wdXNoKF9uYW1lc1tpXSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG5ldyBSZXN1bHQoX2d1YXJkLCByZXN1bHQsIG5hbWVzKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogIEBfaWdub3JlXG4gICAgICovXG4gICAgZmlsdGVyKGNhbGxiYWNrLCB0aGlzQXJnKSB7XG4gICAgICAgIGNvbnN0IF9uYW1lcyA9IGdldE5hbWVzKHRoaXMpO1xuICAgICAgICBjb25zdCByZXN1bHQgPSBbXSwgbmFtZXMgPSBbXTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBjb25zdCBpdGVtID0gdGhpc1tpXTtcbiAgICAgICAgICAgIGlmIChpdGVtIGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICAgICAgICAgICAgICB0aHJvd0Vycm9yKGBpbmRleCAke2l9YCwgaXRlbSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoY2FsbGJhY2suY2FsbCh0aGlzQXJnLCBpdGVtLCBpLCB0aGlzKSkge1xuICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKGl0ZW0pO1xuICAgICAgICAgICAgICAgIG5hbWVzLnB1c2goX25hbWVzW2ldKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbmV3IFJlc3VsdChfZ3VhcmQsIHJlc3VsdCwgbmFtZXMpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiAgQF9pZ25vcmVcbiAgICAgKi9cbiAgICBtYXAoY2FsbGJhY2ssIHRoaXNBcmcpIHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gW107XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgY29uc3QgaXRlbSA9IHRoaXNbaV07XG4gICAgICAgICAgICBpZiAoaXRlbSBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgICAgICAgICAgICAgdGhyb3dFcnJvcihgaW5kZXggJHtpfWAsIGl0ZW0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmVzdWx0LnB1c2goY2FsbGJhY2suY2FsbCh0aGlzQXJnLCBpdGVtLCBpLCB0aGlzKSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG4gICAgLyoqXG4gICAgICogIFJldHVybnMgdGhlIHZhbHVlIGZvciAlJW5hbWUlJS5cbiAgICAgKlxuICAgICAqICBTaW5jZSBpdCBpcyBwb3NzaWJsZSB0byBoYXZlIGEga2V5IHdob3NlIG5hbWUgY29uZmxpY3RzIHdpdGhcbiAgICAgKiAgYSBtZXRob2Qgb24gYSBbW1Jlc3VsdF1dIG9yIGl0cyBzdXBlcmNsYXNzIEFycmF5LCBvciBhbnlcbiAgICAgKiAgSmF2YVNjcmlwdCBrZXl3b3JkLCB0aGlzIGVuc3VyZXMgYWxsIG5hbWVkIHZhbHVlcyBhcmUgc3RpbGxcbiAgICAgKiAgYWNjZXNzaWJsZSBieSBuYW1lLlxuICAgICAqL1xuICAgIGdldFZhbHVlKG5hbWUpIHtcbiAgICAgICAgY29uc3QgaW5kZXggPSBnZXROYW1lcyh0aGlzKS5pbmRleE9mKG5hbW
26774UpO1xuICAgICAgICBpZiAoaW5kZXggPT09IC0xKSB7XG4gICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHZhbHVlID0gdGhpc1tpbmRleF07XG4gICAgICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgICAgICAgICB0aHJvd0Vycm9yKGBwcm9wZXJ0eSAke0pTT04uc3RyaW5naWZ5KG5hbWUpfWAsIHZhbHVlLmVycm9yKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgfVxuICAgIC8qKlxuICAgICAqICBDcmVhdGVzIGEgbmV3IFtbUmVzdWx0XV0gZm9yICUlaXRlbXMlJSB3aXRoIGVhY2ggZW50cnlcbiAgICAgKiAgYWxzbyBhY2Nlc3NpYmxlIGJ5IGl0cyBjb3JyZXNwb25kaW5nIG5hbWUgaW4gJSVrZXlzJSUuXG4gICAgICovXG4gICAgc3RhdGljIGZyb21JdGVtcyhpdGVtcywga2V5cykge1xuICAgICAgICByZXR1cm4gbmV3IFJlc3VsdChfZ3VhcmQsIGl0ZW1zLCBrZXlzKTtcbiAgICB9XG59XG4vKipcbiAqICBSZXR1cm5zIGFsbCBlcnJvcnMgZm91bmQgaW4gYSBbW1Jlc3VsdF1dLlxuICpcbiAqICBTaW5jZSBjZXJ0YWluIGVycm9ycyBlbmNvdW50ZXJlZCB3aGVuIGNyZWF0aW5nIGEgW1tSZXN1bHRdXSBkb1xuICogIG5vdCBpbXBhY3QgdGhlIGFiaWxpdHkgdG8gY29udGludWUgcGFyc2luZyBkYXRhLCB0aGV5IGFyZVxuICogIGRlZmVycmVkIHVudGlsIHRoZXkgYXJlIGFjdHVhbGx5IGFjY2Vzc2VkLiBIZW5jZSBhIGZhdWx0eSBzdHJpbmdcbiAqICBpbiBhbiBFdmVudCB0aGF0IGlzIG5ldmVyIHVzZWQgZG9lcyBub3QgaW1wYWN0IHRoZSBwcm9ncmFtIGZsb3cuXG4gKlxuICogIEhvd2V2ZXIsIHNvbWV0aW1lcyBpdCBtYXkgYmUgdXNlZnVsIHRvIGFjY2VzcywgaWRlbnRpZnkgb3JcbiAqICB2YWxpZGF0ZSBjb3JyZWN0bmVzcyBvZiBhIFtbUmVzdWx0XV0uXG4gKlxuICogIEBfZG9jbG9jIGFwaS9hYmlcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNoZWNrUmVzdWx0RXJyb3JzKHJlc3VsdCkge1xuICAgIC8vIEZpbmQgdGhlIGZpcnN0IGVycm9yIChpZiBhbnkpXG4gICAgY29uc3QgZXJyb3JzID0gW107XG4gICAgY29uc3QgY2hlY2tFcnJvcnMgPSBmdW5jdGlvbiAocGF0aCwgb2JqZWN0KSB7XG4gICAgICAgIGlmICghQXJyYXkuaXNBcnJheShvYmplY3QpKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgZm9yIChsZXQga2V5IGluIG9iamVjdCkge1xuICAgICAgICAgICAgY29uc3QgY2hpbGRQYXRoID0gcGF0aC5zbGljZSgpO1xuICAgICAgICAgICAgY2hpbGRQYXRoLnB1c2goa2V5KTtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgY2hlY2tFcnJvcnMoY2hpbGRQYXRoLCBvYmplY3Rba2V5XSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgICAgICBlcnJvcnMucHVzaCh7IHBhdGg6IGNoaWxkUGF0aCwgZXJyb3I6IGVycm9yIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfTtcbiAgICBjaGVja0Vycm9ycyhbXSwgcmVzdWx0KTtcbiAgICByZXR1cm4gZXJyb3JzO1xufVxuZnVuY3Rpb24gZ2V0VmFsdWUodmFsdWUpIHtcbiAgICBsZXQgYnl0ZXMgPSB0b0JlQXJyYXkodmFsdWUpO1xuICAgIGFzc2VydChieXRlcy5sZW5ndGggPD0gV29yZFNpemUsIFwidmFsdWUgb3V0LW9mLWJvdW5kc1wiLCBcIkJVRkZFUl9PVkVSUlVOXCIsIHsgYnVmZmVyOiBieXRlcywgbGVuZ3RoOiBXb3JkU2l6ZSwgb2Zmc2V0OiBieXRlcy5sZW5ndGggfSk7XG4gICAgaWYgKGJ5dGVzLmxlbmd0aCAhPT0gV29yZFNpemUpIHtcbiAgICAgICAgYnl0ZXMgPSBnZXRCeXRlc0NvcHkoY29uY2F0KFtQYWRkaW5nLnNsaWNlKGJ5dGVzLmxlbmd0aCAlIFdvcmRTaXplKSwgYnl0ZXNdKSk7XG4gICAgfVxuICAgIHJldHVybiBieXRlcztcbn1cbi8qKlxuICogIEBfaWdub3JlXG4gKi9cbmV4cG9ydCBjbGFzcyBDb2RlciB7XG4gICAgLy8gVGhlIGNvZGVyIG5hbWU6XG4gICAgLy8gICAtIGFkZHJlc3MsIHVpbnQyNTYsIHR1cGxlLCBhcnJheSwgZXRjLlxuICAgIG5hbWU7XG4gICAgLy8gVGhlIGZ1bGx5IGV4cGFuZGVkIHR5cGUsIGluY2x1ZGluZyBjb21wb3NpdGUgdHlwZXM6XG4gICAgLy8gICAtIGFkZHJlc3MsIHVpbnQyNTYsIHR1cGxlKGFkZHJlc3MsYnl0ZXMpLCB1aW50MjU2WzNdWzRdW10sICBldGMuXG4gICAgdHlwZTtcbiAgICAvLyBUaGUgbG9jYWxOYW1lIGJvdW5kIGluIHRoZSBzaWduYXR1cmUsIGluIHRoaXMgZXhhbXBsZSBpdCBpcyBcImJhelwiOlxuICAgIC8vICAgLSB0dXBsZShhZGRyZXNzIGZvbywgdWludCBiYXIpIGJhelxuICAgIGxvY2FsTmFtZTtcbiAgICAvLyBXaGV0aGVyIHRoaXMgdHlwZSBpcyBkeW5hbWljOlxuICAgIC8vICAtIER5bmFtaWM6IGJ5dGVzLCBzdHJpbmcsIGFkZHJlc3NbXSwgdHVwbGUoYm9vbGVhbltdKSwgZXRjLlxuICAgIC8vICAtIE5vdCBEeW5hbWljOiBhZGRyZXNzLCB1aW50MjU2LCBib29sZWFuWzNdLCB0dXBsZShhZGRyZXNzLCB1aW50OClcbiAgICBkeW5hbWljO1xuICAgIGNvbnN0cnVjdG9yKG5hbWUsIHR5cGUsIGxvY2FsTmFtZSwgZHluYW1pYykge1xuICAgICAgICBkZWZpbmVQcm9wZXJ0aWVzKHRoaXMsIHsgbmFtZSwgdHlwZSwgbG9jYWxOYW1lLCBkeW5hbWljIH0sIHtcbiAgICAgICAgICAgIG5hbWU6IFwic3RyaW5nXCIsIHR5cGU6IFwic3RyaW5nXCIsIGxvY2FsTmFtZTogXCJzdHJpbmdcIiwgZHluYW1pYzogXCJib29sZWFuXCJcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIF90aHJvd0Vycm9yKG1lc3NhZ2UsIHZhbHVlKSB7XG4gICAgICAgIGFzc2VydEFyZ3VtZW50KGZhbHNlLCBtZXNzYWdlLCB0aGlzLmxvY2FsTmFtZSwgdmFsdWUpO1xuICAgIH1cbn1cbi8qKlxuICogIEBfaWdub3JlXG4gKi9cbmV4cG9ydCBjbGFzcyBXcml0ZXIge1xuICAgIC8vIEFuIGFycmF5IG9mIFdvcmRTaXplIGxlbmd0aGVkIG9iamVjdHMgdG8gY29uY2F0ZW5hdGlvblxuICAgICNkYXRhO1xuICAgICNkYXRhTGVuZ3RoO1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICB0aGlzLiNkYXRhID0gW107XG4gICAgICAgI
26774HRoaXMuI2RhdGFMZW5ndGggPSAwO1xuICAgIH1cbiAgICBnZXQgZGF0YSgpIHtcbiAgICAgICAgcmV0dXJuIGNvbmNhdCh0aGlzLiNkYXRhKTtcbiAgICB9XG4gICAgZ2V0IGxlbmd0aCgpIHsgcmV0dXJuIHRoaXMuI2RhdGFMZW5ndGg7IH1cbiAgICAjd3JpdGVEYXRhKGRhdGEpIHtcbiAgICAgICAgdGhpcy4jZGF0YS5wdXNoKGRhdGEpO1xuICAgICAgICB0aGlzLiNkYXRhTGVuZ3RoICs9IGRhdGEubGVuZ3RoO1xuICAgICAgICByZXR1cm4gZGF0YS5sZW5ndGg7XG4gICAgfVxuICAgIGFwcGVuZFdyaXRlcih3cml0ZXIpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuI3dyaXRlRGF0YShnZXRCeXRlc0NvcHkod3JpdGVyLmRhdGEpKTtcbiAgICB9XG4gICAgLy8gQXJyYXlpc2ggaXRlbTsgcGFkIG9uIHRoZSByaWdodCB0byAqbmVhcmVzdCogV29yZFNpemVcbiAgICB3cml0ZUJ5dGVzKHZhbHVlKSB7XG4gICAgICAgIGxldCBieXRlcyA9IGdldEJ5dGVzQ29weSh2YWx1ZSk7XG4gICAgICAgIGNvbnN0IHBhZGRpbmdPZmZzZXQgPSBieXRlcy5sZW5ndGggJSBXb3JkU2l6ZTtcbiAgICAgICAgaWYgKHBhZGRpbmdPZmZzZXQpIHtcbiAgICAgICAgICAgIGJ5dGVzID0gZ2V0Qnl0ZXNDb3B5KGNvbmNhdChbYnl0ZXMsIFBhZGRpbmcuc2xpY2UocGFkZGluZ09mZnNldCldKSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuI3dyaXRlRGF0YShieXRlcyk7XG4gICAgfVxuICAgIC8vIE51bWVyaWMgaXRlbTsgcGFkIG9uIHRoZSBsZWZ0ICp0byogV29yZFNpemVcbiAgICB3cml0ZVZhbHVlKHZhbHVlKSB7XG4gICAgICAgIHJldHVybiB0aGlzLiN3cml0ZURhdGEoZ2V0VmFsdWUodmFsdWUpKTtcbiAgICB9XG4gICAgLy8gSW5zZXJ0cyBhIG51bWVyaWMgcGxhY2UtaG9sZGVyLCByZXR1cm5pbmcgYSBjYWxsYmFjayB0aGF0IGNhblxuICAgIC8vIGJlIHVzZWQgdG8gYXNqdXN0IHRoZSB2YWx1ZSBsYXRlclxuICAgIHdyaXRlVXBkYXRhYmxlVmFsdWUoKSB7XG4gICAgICAgIGNvbnN0IG9mZnNldCA9IHRoaXMuI2RhdGEubGVuZ3RoO1xuICAgICAgICB0aGlzLiNkYXRhLnB1c2goUGFkZGluZyk7XG4gICAgICAgIHRoaXMuI2RhdGFMZW5ndGggKz0gV29yZFNpemU7XG4gICAgICAgIHJldHVybiAodmFsdWUpID0+IHtcbiAgICAgICAgICAgIHRoaXMuI2RhdGFbb2Zmc2V0XSA9IGdldFZhbHVlKHZhbHVlKTtcbiAgICAgICAgfTtcbiAgICB9XG59XG4vKipcbiAqICBAX2lnbm9yZVxuICovXG5leHBvcnQgY2xhc3MgUmVhZGVyIHtcbiAgICAvLyBBbGxvd3MgaW5jb21wbGV0ZSB1bnBhZGRlZCBkYXRhIHRvIGJlIHJlYWQ7IG90aGVyd2lzZSBhbiBlcnJvclxuICAgIC8vIGlzIHJhaXNlZCBpZiBhdHRlbXB0aW5nIHRvIG92ZXJydW4gdGhlIGJ1ZmZlci4gVGhpcyBpcyByZXF1aXJlZFxuICAgIC8vIHRvIGRlYWwgd2l0aCBhbiBvbGQgU29saWRpdHkgYnVnLCBpbiB3aGljaCBldmVudCBkYXRhIGZvclxuICAgIC8vIGV4dGVybmFsIChub3QgcHVibGljIHRob2d1aCkgd2FzIHRpZ2h0bHkgcGFja2VkLlxuICAgIGFsbG93TG9vc2U7XG4gICAgI2RhdGE7XG4gICAgI29mZnNldDtcbiAgICAjYnl0ZXNSZWFkO1xuICAgICNwYXJlbnQ7XG4gICAgI21heEluZmxhdGlvbjtcbiAgICBjb25zdHJ1Y3RvcihkYXRhLCBhbGxvd0xvb3NlLCBtYXhJbmZsYXRpb24pIHtcbiAgICAgICAgZGVmaW5lUHJvcGVydGllcyh0aGlzLCB7IGFsbG93TG9vc2U6ICEhYWxsb3dMb29zZSB9KTtcbiAgICAgICAgdGhpcy4jZGF0YSA9IGdldEJ5dGVzQ29weShkYXRhKTtcbiAgICAgICAgdGhpcy4jYnl0ZXNSZWFkID0gMDtcbiAgICAgICAgdGhpcy4jcGFyZW50ID0gbnVsbDtcbiAgICAgICAgdGhpcy4jbWF4SW5mbGF0aW9uID0gKG1heEluZmxhdGlvbiAhPSBudWxsKSA/IG1heEluZmxhdGlvbiA6IDEwMjQ7XG4gICAgICAgIHRoaXMuI29mZnNldCA9IDA7XG4gICAgfVxuICAgIGdldCBkYXRhKCkgeyByZXR1cm4gaGV4bGlmeSh0aGlzLiNkYXRhKTsgfVxuICAgIGdldCBkYXRhTGVuZ3RoKCkgeyByZXR1cm4gdGhpcy4jZGF0YS5sZW5ndGg7IH1cbiAgICBnZXQgY29uc3VtZWQoKSB7IHJldHVybiB0aGlzLiNvZmZzZXQ7IH1cbiAgICBnZXQgYnl0ZXMoKSB7IHJldHVybiBuZXcgVWludDhBcnJheSh0aGlzLiNkYXRhKTsgfVxuICAgICNpbmNyZW1lbnRCeXRlc1JlYWQoY291bnQpIHtcbiAgICAgICAgaWYgKHRoaXMuI3BhcmVudCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuI3BhcmVudC4jaW5jcmVtZW50Qnl0ZXNSZWFkKGNvdW50KTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLiNieXRlc1JlYWQgKz0gY291bnQ7XG4gICAgICAgIC8vIENoZWNrIGZvciBleGNlc3NpdmUgaW5mbGF0aW9uIChzZWU6ICM0NTM3KVxuICAgICAgICBhc3NlcnQodGhpcy4jbWF4SW5mbGF0aW9uIDwgMSB8fCB0aGlzLiNieXRlc1JlYWQgPD0gdGhpcy4jbWF4SW5mbGF0aW9uICogdGhpcy5kYXRhTGVuZ3RoLCBgY29tcHJlc3NlZCBBQkkgZGF0YSBleGNlZWRzIGluZmxhdGlvbiByYXRpbyBvZiAke3RoaXMuI21heEluZmxhdGlvbn0gKCBzZWU6IGh0dHBzOi9cXC9naXRodWIuY29tL2V0aGVycy1pby9ldGhlcnMuanMvaXNzdWVzLzQ1MzcgKWAsIFwiQlVGRkVSX09WRVJSVU5cIiwge1xuICAgICAgICAgICAgYnVmZmVyOiBnZXRCeXRlc0NvcHkodGhpcy4jZGF0YSksIG9mZnNldDogdGhpcy4jb2Zmc2V0LFxuICAgICAgICAgICAgbGVuZ3RoOiBjb3VudCwgaW5mbzoge1xuICAgICAgICAgICAgICAgIGJ5dGVzUmVhZDogdGhpcy4jYnl0ZXNSZWFkLFxuICAgICAgICAgICAgICAgIGRhdGFMZW5ndGg6IHRoaXMuZGF0YUxlbmd0aFxuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG4gICAgI3BlZWtCeXRlcyhvZmZzZXQsIGxlbmd0aCwgbG9vc2UpIHtcbiAgICAgICAgbGV0IGFsaWduZWRMZW5ndGggPSBNYXRoLmNlaWwobGVuZ3RoIC8gV29yZFNpemUpICogV29yZFNpemU7XG4gICAgICAgIGlmICh0aGlzLiNvZmZzZXQgKyBhbGlnbmVkTGVuZ3RoID4gdGhpcy4jZGF0YS5sZW5ndGgpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLmFsbG93TG9vc2UgJiYgbG9vc2UgJiYgdGhpcy4jb2Zmc2V0ICsgbGVuZ3RoIDw9IHRoaXMuI2RhdGEubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgYWxpZ25lZExlbmd0aCA9IGxlbmd0aDtcbiAgICAgICAgICAgI
26774H1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGFzc2VydChmYWxzZSwgXCJkYXRhIG91dC1vZi1ib3VuZHNcIiwgXCJCVUZGRVJfT1ZFUlJVTlwiLCB7XG4gICAgICAgICAgICAgICAgICAgIGJ1ZmZlcjogZ2V0Qnl0ZXNDb3B5KHRoaXMuI2RhdGEpLFxuICAgICAgICAgICAgICAgICAgICBsZW5ndGg6IHRoaXMuI2RhdGEubGVuZ3RoLFxuICAgICAgICAgICAgICAgICAgICBvZmZzZXQ6IHRoaXMuI29mZnNldCArIGFsaWduZWRMZW5ndGhcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy4jZGF0YS5zbGljZSh0aGlzLiNvZmZzZXQsIHRoaXMuI29mZnNldCArIGFsaWduZWRMZW5ndGgpO1xuICAgIH1cbiAgICAvLyBDcmVhdGUgYSBzdWItcmVhZGVyIHdpdGggdGhlIHNhbWUgdW5kZXJseWluZyBkYXRhLCBidXQgb2Zmc2V0XG4gICAgc3ViUmVhZGVyKG9mZnNldCkge1xuICAgICAgICBjb25zdCByZWFkZXIgPSBuZXcgUmVhZGVyKHRoaXMuI2RhdGEuc2xpY2UodGhpcy4jb2Zmc2V0ICsgb2Zmc2V0KSwgdGhpcy5hbGxvd0xvb3NlLCB0aGlzLiNtYXhJbmZsYXRpb24pO1xuICAgICAgICByZWFkZXIuI3BhcmVudCA9IHRoaXM7XG4gICAgICAgIHJldHVybiByZWFkZXI7XG4gICAgfVxuICAgIC8vIFJlYWQgYnl0ZXNcbiAgICByZWFkQnl0ZXMobGVuZ3RoLCBsb29zZSkge1xuICAgICAgICBsZXQgYnl0ZXMgPSB0aGlzLiNwZWVrQnl0ZXMoMCwgbGVuZ3RoLCAhIWxvb3NlKTtcbiAgICAgICAgdGhpcy4jaW5jcmVtZW50Qnl0ZXNSZWFkKGxlbmd0aCk7XG4gICAgICAgIHRoaXMuI29mZnNldCArPSBieXRlcy5sZW5ndGg7XG4gICAgICAgIC8vIEBUT0RPOiBNYWtlIHN1cmUgdGhlIGxlbmd0aC4uZW5kIGJ5dGVzIGFyZSBhbGwgMD9cbiAgICAgICAgcmV0dXJuIGJ5dGVzLnNsaWNlKDAsIGxlbmd0aCk7XG4gICAgfVxuICAgIC8vIFJlYWQgYSBudW1lcmljIHZhbHVlc1xuICAgIHJlYWRWYWx1ZSgpIHtcbiAgICAgICAgcmV0dXJuIHRvQmlnSW50KHRoaXMucmVhZEJ5dGVzKFdvcmRTaXplKSk7XG4gICAgfVxuICAgIHJlYWRJbmRleCgpIHtcbiAgICAgICAgcmV0dXJuIHRvTnVtYmVyKHRoaXMucmVhZEJ5dGVzKFdvcmRTaXplKSk7XG4gICAgfVxufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9YWJzd
26774HJhY3QtY29kZXIuanMubWFwIiwiZnVuY3Rpb24gbnVtYmVyKG4pIHtcbiAgICBpZiAoIU51bWJlci5pc1NhZmVJbnRlZ2VyKG4pIHx8IG4gPCAwKVxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFdyb25nIHBvc2l0aXZlIGludGVnZXI6ICR7bn1gKTtcbn1cbmZ1bmN0aW9uIGJvb2woYikge1xuICAgIGlmICh0eXBlb2YgYiAhPT0gJ2Jvb2xlYW4nKVxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEV4cGVjdGVkIGJvb2xlYW4sIG5vdCAke2J9YCk7XG59XG5mdW5jdGlvbiBieXRlcyhiLCAuLi5sZW5ndGhzKSB7XG4gICAgaWYgKCEoYiBpbnN0YW5jZW9mIFVpbnQ4QXJyYXkpKVxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0V4cGVjdGVkIFVpbnQ4QXJyYXknKTtcbiAgICBpZiAobGVuZ3Rocy5sZW5ndGggPiAwICYmICFsZW5ndGhzLmluY2x1ZGVzKGIubGVuZ3RoKSlcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBFeHBlY3RlZCBVaW50OEFycmF5IG9mIGxlbmd0aCAke2xlbmd0aHN9LCBub3Qgb2YgbGVuZ3RoPSR7Yi5sZW5ndGh9YCk7XG59XG5mdW5jdGlvbiBoYXNoKGhhc2gpIHtcbiAgICBpZiAodHlwZW9mIGhhc2ggIT09ICdmdW5jdGlvbicgfHwgdHlwZW9mIGhhc2guY3JlYXRlICE9PSAnZnVuY3Rpb24nKVxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0hhc2ggc2hvdWxkIGJlIHdyYXBwZWQgYnkgdXRpbHMud3JhcENvbnN0cnVjdG9yJyk7XG4gICAgbnVtYmVyKGhhc2gub3V0cHV0TGVuKTtcbiAgICBudW1iZXIoaGFzaC5ibG9ja0xlbik7XG59XG5mdW5jdGlvbiBleGlzdHMoaW5zdGFuY2UsIGNoZWNrRmluaXNoZWQgPSB0cnVlKSB7XG4gICAgaWYgKGluc3RhbmNlLmRlc3Ryb3llZClcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdIYXNoIGluc3RhbmNlIGhhcyBiZWVuIGRlc3Ryb3llZCcpO1xuICAgIGlmIChjaGVja0ZpbmlzaGVkICYmIGluc3RhbmNlLmZpbmlzaGVkKVxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0hhc2gjZGlnZXN0KCkgaGFzIGFscmVhZHkgYmVlbiBjYWxsZWQnKTtcbn1cbmZ1bmN0aW9uIG91dHB1dChvdXQsIGluc3RhbmNlKSB7XG4gICAgYnl0ZXMob3V0KTtcbiAgICBjb25zdCBtaW4gPSBpbnN0YW5jZS5vdXRwdXRMZW47XG4gICAgaWYgKG91dC5sZW5ndGggPCBtaW4pIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBkaWdlc3RJbnRvKCkgZXhwZWN0cyBvdXRwdXQgYnVmZmVyIG9mIGxlbmd0aCBhdCBsZWFzdCAke21pbn1gKTtcbiAgICB9XG59XG5leHBvcnQgeyBudW1iZXIsIGJvb2wsIGJ5dGVzLCBoYXNoLCBleGlzdHMsIG91dHB1dCB9O1xuY29uc3QgYXNzZXJ0ID0geyBudW1iZXIsIGJvb2wsIGJ5dGVzLCBoYXNoLCBleGlzdHMsIG91dHB1dCB9O1xuZXhwb3J0IGRlZmF1bHQgYXNzZXJ0O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9X2Fzc2VydC5qcy5tYXAiLCJleHBvcnQgY29uc3QgY3J5cHRvID0gdHlwZW9mIGdsb2JhbFRoaXMgPT09ICdvYmplY3QnICYmICdjcnlwdG8nIGluIGdsb2JhbFRoaXMgPyBnbG9iYWxUaGlzLmNyeXB0byA6IHVuZGVmaW5lZDtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWNyeXB0by5qcy5tYXAiLCIvKiEgbm9ibGUtaGFzaGVzIC0gTUlUIExpY2Vuc2UgKGMpIDIwMjIgUGF1bCBNaWxsZXIgKHBhdWxtaWxsci5jb20pICovXG4vLyBXZSB1c2UgV2ViQ3J5cHRvIGFrYSBnbG9iYWxUaGlzLmNyeXB0bywgd2hpY2ggZXhpc3RzIGluIGJyb3dzZXJzIGFuZCBub2RlLmpzIDE2Ky5cbi8vIG5vZGUuanMgdmVyc2lvbnMgZWFybGllciB0aGFuIHYxOSBkb24ndCBkZWNsYXJlIGl0IGluIGdsb2JhbCBzY29wZS5cbi8vIEZvciBub2Rl
26774LmpzLCBwYWNrYWdlLmpzb24jZXhwb3J0cyBmaWVsZCBtYXBwaW5nIHJld3JpdGVzIGltcG9ydFxuLy8gZnJvbSBgY3J5cHRvYCB0byBgY3J5cHRvTm9kZWAsIHdoaWNoIGltcG9ydHMgbmF0aXZlIG1vZHVsZS5cbi8vIE1ha2VzIHRoZSB1dGlscyB1bi1pbXBvcnRhYmxlIGluIGJyb3dzZXJzIHdpdGhvdXQgYSBidW5kbGVyLlxuLy8gT25jZSBub2RlLmpzIDE4IGlzIGRlcHJlY2F0ZWQsIHdlIGNhbiBqdXN0IGRyb3AgdGhlIGltcG9ydC5cbmltcG9ydCB7IGNyeXB0byB9IGZyb20gJ0Bub2JsZS9oYXNoZXMvY3J5cHRvJztcbmNvbnN0IHU4YSA9IChhKSA9PiBhIGluc3RhbmNlb2YgVWludDhBcnJheTtcbi8vIENhc3QgYXJyYXkgdG8gZGlmZmVyZW50IHR5cGVcbmV4cG9ydCBjb25zdCB1OCA9IChhcnIpID0+IG5ldyBVaW50OEFycmF5KGFyci5idWZmZXIsIGFyci5ieXRlT2Zmc2V0LCBhcnIuYnl0ZUxlbmd0aCk7XG5leHBvcnQgY29uc3QgdTMyID0gKGFycikgPT4gbmV3IFVpbnQzMkFycmF5KGFyci5idWZmZXIsIGFyci5ieXRlT2Zmc2V0LCBNYXRoLmZsb29yKGFyci5ieXRlTGVuZ3RoIC8gNCkpO1xuLy8gQ2FzdCBhcnJheSB0byB2aWV3XG5leHBvcnQgY29uc3QgY3JlYXRlVmlldyA9IChhcnIpID0+IG5ldyBEYXRhVmlldyhhcnIuYnVmZmVyLCBhcnIuYnl0ZU9mZnNldCwgYXJyLmJ5dGVMZW5ndGgpO1xuLy8gVGhlIHJvdGF0ZSByaWdodCAoY2lyY3VsYXIgcmlnaHQgc2hpZnQpIG9wZXJhdGlvbiBmb3IgdWludDMyXG5leHBvcnQgY29uc3Qgcm90ciA9ICh3b3JkLCBzaGlmdCkgPT4gKHdvcmQgPDwgKDMyIC0gc2hpZnQpKSB8ICh3b3JkID4+PiBzaGlmdCk7XG4vLyBiaWctZW5kaWFuIGhhcmR3YXJlIGlzIHJhcmUuIEp1c3QgaW4gY2FzZSBzb21lb25lIHN0aWxsIGRlY2lkZXMgdG8gcnVuIGhhc2hlczpcbi8vIGVhcmx5LXRocm93IGFuIGVycm9yIGJlY2F1c2Ugd2UgZG9uJ3Qgc3VwcG9ydCBCRSB5ZXQuXG5leHBvcnQgY29uc3QgaXNMRSA9IG5ldyBVaW50OEFycmF5KG5ldyBVaW50MzJBcnJheShbMHgxMTIyMzM0NF0pLmJ1ZmZlcilbMF0gPT09IDB4NDQ7XG5pZiAoIWlzTEUpXG4gICAgdGhyb3cgbmV3IEVycm9yKCdOb24gbGl0dGxlLWVuZGlhbiBoYXJkd2FyZSBpcyBub3Qgc3VwcG9ydGVkJyk7XG5jb25zdCBoZXhlcyA9IC8qIEBfX1BVUkVfXyAqLyBBcnJheS5mcm9tKHsgbGVuZ3RoOiAyNTYgfSwgKF8sIGkpID0+IGkudG9TdHJpbmcoMTYpLnBhZFN0YXJ0KDIsICcwJykpO1xuLyoqXG4gKiBAZXhhbXBsZSBieXRlc1RvSGV4KFVpbnQ4QXJyYXkuZnJvbShbMHhjYSwgMHhmZSwgMHgwMSwgMHgyM10pKSAvLyAnY2FmZTAxMjMnXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBieXRlc1RvSGV4KGJ5dGVzKSB7XG4gICAgaWYgKCF1OGEoYnl0ZXMpKVxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1VpbnQ4QXJyYXkgZXhwZWN0ZWQnKTtcbiAgICAvLyBwcmUtY2FjaGluZyBpbXByb3ZlcyB0aGUgc3BlZWQgNnhcbiAgICBsZXQgaGV4ID0gJyc7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBieXRlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICBoZXggKz0gaGV4ZXNbYnl0ZXNbaV1dO1xuICAgIH1cbiAgICByZXR1cm4gaGV4O1xufVxuLyoqXG4gKiBAZXhhbXBsZSBoZXhUb0J5dGVzKCdjYWZlMDEyMycpIC8vIFVpbnQ4QXJyYXkuZnJvbShbMHhjYSwgMHhmZSwgMHgwMSwgMHgyM10pXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBoZXhUb0J5dGVzKGhleCkge1xuICAgIGlmICh0eXBlb2YgaGV4ICE9PSAnc3RyaW5nJylcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdoZXggc3RyaW5nIGV4cGVjdGVkLCBnb3QgJyArIHR5cGVvZiBoZXgpO1xuICAgIGNvbnN0IGxlbiA9IGhleC5sZW5ndGg7XG4gICAgaWYgKGxlbiAlIDIpXG4gICAgICAgIHRocm93IG5ldyBFcnJvcigncGFkZGVkIGhleCBzdHJpbmcgZXhwZWN0ZWQsIGdvdCB1bnBhZGRlZCBoZXggb2YgbGVuZ3RoICcgKyBsZW4pO1xuICAgIGNvbnN0IGFycmF5ID0gbmV3IFVpbnQ4QXJyYXkobGVuIC8gMik7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBhcnJheS5sZW5ndGg7IGkrKykge1xuICAgICAgICBjb25zdCBqID0gaSAqIDI7XG4gICAgICAgIGNvbnN0IGhleEJ5dGUgPSBoZXguc2xpY2UoaiwgaiArIDIpO1xuICAgICAgICBjb25zdCBieXRlID0gTnVtYmVyLnBhcnNlSW50KGhleEJ5dGUsIDE2KTtcbiAgICAgICAgaWYgKE51bWJlci5pc05hTihieXRlKSB8fCBieXRlIDwgMClcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBieXRlIHNlcXVlbmNlJyk7XG4gICAgICAgIGFycmF5W2ldID0gYnl0ZTtcbiAgICB9XG4gICAgcmV0dXJuIGFycmF5O1xufVxuLy8gVGhlcmUgaXMgbm8gc2V0SW1tZWRpYXRlIGluIGJyb3dzZXIgYW5kIHNldFRpbWVvdXQgaXMgc2xvdy5cbi8vIGNhbGwgb2YgYXN5bmMgZm4gd2lsbCByZXR1cm4gUHJvbWlzZSwgd2hpY2ggd2lsbCBiZSBmdWxsZmlsZWQgb25seSBvblxuLy8gbmV4dCBzY2hlZHVsZXIgcXVldWUgcHJvY2Vzc2luZyBzdGVwIGFuZCB0aGlzIGlzIGV4YWN0bHkgd2hhdCB3ZSBuZWVkLlxuZXhwb3J0IGNvbnN0IG5leHRUaWNrID0gYXN5bmMgKCkgPT4geyB9O1xuLy8gUmV0dXJucyBjb250cm9sIHRvIHRocmVhZCBlYWNoICd0aWNrJyBtcyB0byBhdm9pZCBibG9ja2luZ1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGFzeW5jTG9vcChpdGVycywgdGljaywgY2IpIHtcbiAgICBsZXQgdHMgPSBEYXRlLm5vdygpO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgaXRlcnM7IGkrKykge1xuICAgICAgICBjYihpKTtcbiAgICAgICAgLy8gRGF0ZS5ub3coKSBpcyBub3QgbW9ub3RvbmljLCBzbyBpbiBjYXNlIGlmIGNsb2NrIGdvZXMgYmFja3dhcmRzIHdlIHJldHVybiByZXR1cm4gY29udHJvbCB0b29cbiAgICAgICAgY29uc3QgZGlmZiA9IERhdGUubm93KCkgLSB0cztcbiAgICAgICAgaWYgKGRpZmYgPj0gMCAmJiBkaWZmIDwgdGljaylcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICBhd2FpdCBuZXh0VGljaygpO1xuICAgICAgICB0cyArPSBkaWZmO1xuICAgIH1cbn1cbi8qKlxuICogQGV4YW1wbGUgdXRmOFRvQnl0ZXMoJ2FiYycpIC8vIG5ldyBVaW50OEFycmF5KFs5NywgOTgsIDk5XSlcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHV0ZjhUb0J5dGVzKHN0cikge1xuICAgIGlmICh0eXBlb2Ygc3RyICE9PSAnc3RyaW5nJylcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGB1dGY4VG9CeXRlcyBleHBlY3RlZCBzdHJpbmcsIGdvdCAke3R5cGVvZiBzdHJ9YCk7XG4gICAgcmV0dXJuIG5ldyBVaW50OEFycmF5KG5ldyBUZXh0RW5jb2RlcigpLmVuY29kZShzdHIpKTsgLy8gaHR0cHM6Ly9idWd6aWwubGEvMTY4MTgwOVxufVxuLyoqXG4gKiBOb3JtYWxpem
26774VzIChub24taGV4KSBzdHJpbmcgb3IgVWludDhBcnJheSB0byBVaW50OEFycmF5LlxuICogV2FybmluZzogd2hlbiBVaW50OEFycmF5IGlzIHBhc3NlZCwgaXQgd291bGQgTk9UIGdldCBjb3BpZWQuXG4gKiBLZWVwIGluIG1pbmQgZm9yIGZ1dHVyZSBtdXRhYmxlIG9wZXJhdGlvbnMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0b0J5dGVzKGRhdGEpIHtcbiAgICBpZiAodHlwZW9mIGRhdGEgPT09ICdzdHJpbmcnKVxuICAgICAgICBkYXRhID0gdXRmOFRvQnl0ZXMoZGF0YSk7XG4gICAgaWYgKCF1OGEoZGF0YSkpXG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgZXhwZWN0ZWQgVWludDhBcnJheSwgZ290ICR7dHlwZW9mIGRhdGF9YCk7XG4gICAgcmV0dXJuIGRhdGE7XG59XG4vKipcbiAqIENvcGllcyBzZXZlcmFsIFVpbnQ4QXJyYXlzIGludG8gb25lLlxuICovXG5leHBvcnQgZnVuY3Rpb24gY29uY2F0Qnl0ZXMoLi4uYXJyYXlzKSB7XG4gICAgY29uc3QgciA9IG5ldyBVaW50OEFycmF5KGFycmF5cy5yZWR1Y2UoKHN1bSwgYSkgPT4gc3VtICsgYS5sZW5ndGgsIDApKTtcbiAgICBsZXQgcGFkID0gMDsgLy8gd2FsayB0aHJvdWdoIGVhY2ggaXRlbSwgZW5zdXJlIHRoZXkgaGF2ZSBwcm9wZXIgdHlwZVxuICAgIGFycmF5cy5mb3JFYWNoKChhKSA9PiB7XG4gICAgICAgIGlmICghdThhKGEpKVxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdVaW50OEFycmF5IGV4cGVjdGVkJyk7XG4gICAgICAgIHIuc2V0KGEsIHBhZCk7XG4gICAgICAgIHBhZCArPSBhLmxlbmd0aDtcbiAgICB9KTtcbiAgICByZXR1cm4gcjtcbn1cbi8vIEZvciBydW50aW1lIGNoZWNrIGlmIGNsYXNzIGltcGxlbWVudHMgaW50ZXJmYWNlXG5leHBvcnQgY2xhc3MgSGFzaCB7XG4gICAgLy8gU2FmZSB2ZXJzaW9uIHRoYXQgY2xvbmVzIGludGVybmFsIHN0YXRlXG4gICAgY2xvbmUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9jbG9uZUludG8oKTtcbiAgICB9XG59XG5jb25zdCB0b1N0ciA9IHt9LnRvU3RyaW5nO1xuZXhwb3J0IGZ1bmN0aW9uIGNoZWNrT3B0cyhkZWZhdWx0cywgb3B0cykge1xuICAgIGlmIChvcHRzICE9PSB1bmRlZmluZWQgJiYgdG9TdHIuY2FsbChvcHRzKSAhPT0gJ1tvYmplY3QgT2JqZWN0XScpXG4gICAgICAgIHRocm93IG5ldyBFcnJvcignT3B0aW9ucyBzaG91bGQgYmUgb2JqZWN0IG9yIHVuZGVmaW5lZCcpO1xuICAgIGNvbnN0IG1lcmdlZCA9IE9iamVjdC5hc3NpZ24oZGVmYXVsdHMsIG9wdHMpO1xuICAgIHJldHVybiBtZXJnZWQ7XG59XG5leHBvcnQgZnVuY3Rpb24gd3JhcENvbnN0cnVjdG9yKGhhc2hDb25zKSB7XG4gICAgY29uc3QgaGFzaEMgPSAobXNnKSA9PiBoYXNoQ29ucygpLnVwZGF0ZSh0b0J5dGVzKG1zZykpLmRpZ2VzdCgpO1xuICAgIGNvbnN0IHRtcCA9IGhhc2hDb25zKCk7XG4gICAgaGFzaEMub3V0cHV0TGVuID0gdG1wLm91dHB1dExlbjtcbiAgICBoYXNoQy5ibG9ja0xlbiA9IHRtcC5ibG9ja0xlbjtcbiAgICBoYXNoQy5jcmVhdGUgPSAoKSA9PiBoYXNoQ29ucygpO1xuICAgIHJldHVybiBoYXNoQztcbn1cbmV4cG9ydCBmdW5jdGlvbiB3cmFwQ29uc3RydWN0b3JXaXRoT3B0cyhoYXNoQ29ucykge1xuICAgIGNvbnN0IGhhc2hDID0gKG1zZywgb3B0cykgPT4gaGFzaENvbnMob3B0cykudXBkYXRlKHRvQnl0ZXMobXNnKSkuZGlnZXN0KCk7XG4gICAgY29uc3QgdG1wID0gaGFzaENvbnMoe30pO1xuICAgIGhhc2hDLm91dHB1dExlbiA9IHRtcC5vdXRwdXRMZW47XG4gICAgaGFzaEMuYmxvY2tMZW4gPSB0bXAuYmxvY2tMZW47XG4gICAgaGFzaEMuY3JlYXRlID0gKG9wdHMpID0+IGhhc2hDb25zKG9wdHMpO1xuICAgIHJldHVybiBoYXNoQztcbn1cbmV4cG9ydCBmdW5jdGlvbiB3cmFwWE9GQ29uc3RydWN0b3JXaXRoT3B0cyhoYXNoQ29ucykge1xuICAgIGNvbnN0IGhhc2hDID0gKG1zZywgb3B0cykgPT4gaGFzaENvbnMob3B0cykudXBkYXRlKHRvQnl0ZXMobXNnKSkuZGlnZXN0KCk7XG4gICAgY29uc3QgdG1wID0gaGFzaENvbnMoe30pO1xuICAgIGhhc2hDLm91dHB1dExlbiA9IHRtcC5vdXRwdXRMZW47XG4gICAgaGFzaEMuYmxvY2tMZW4gPSB0bXAuYmxvY2tMZW47XG4gICAgaGFzaEMuY3JlYXRlID0gKG9wdHMpID0+IGhhc2hDb25zKG9wdHMpO1xuICAgIHJldHVybiBoYXNoQztcbn1cbi8qKlxuICogU2VjdXJlIFBSTkcuIFVzZXMgYGNyeXB0by5nZXRSYW5kb21WYWx1ZXNgLCB3aGljaCBkZWZlcnMgdG8gT1MuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByYW5kb21CeXRlcyhieXRlc0xlbmd0aCA9IDMyKSB7XG4gICAgaWYgKGNyeXB0byAmJiB0eXBlb2YgY3J5cHRvLmdldFJhbmRvbVZhbHVlcyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICByZXR1cm4gY3J5cHRvLmdldFJhbmRvbVZhbHVlcyhuZXcgVWludDhBcnJheShieXRlc0xlbmd0aCkpO1xuICAgIH1cbiAgICB0aHJvdyBuZXcgRXJyb3IoJ2NyeXB0by5nZXRSYW5kb21WYWx1ZXMgbXVzdCBiZSBkZWZpbmVkJyk7XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD11dGlscy5qcy5tYXAiLCJpbXBvcnQgeyBoYXNoIGFzIGFzc2VydEhhc2gsIGJ5dGVzIGFzIGFzc2VydEJ5dGVzLCBleGlzdHMgYXMgYXNzZXJ0RXhpc3RzIH0gZnJvbSAnLi9fYXNzZXJ0LmpzJztcbmltcG9ydCB7IEhhc2gsIHRvQnl0ZXMgfSBmcm9tICcuL3V0aWxzLmpzJztcbi8vIEhNQUMgKFJGQyAyMTA0KVxuZXhwb3J0IGNsYXNzIEhNQUMgZXh0ZW5kcyBIYXNoIHtcbiAgICBjb25zdHJ1Y3RvcihoYXNoLCBfa2V5KSB7XG4gICAgICAgIHN1cGVyKCk7XG4gICAgICAgIHRoaXMuZmluaXNoZWQgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5kZXN0cm95ZWQgPSBmYWxzZTtcbiAgICAgICAgYXNzZXJ0SGFzaChoYXNoKTtcbiAgICAgICAgY29uc3Qga2V5ID0gdG9CeXRlcyhfa2V5KTtcbiAgICAgICAgdGhpcy5pSGFzaCA9IGhhc2guY3JlYXRlKCk7XG4gICAgICAgIGlmICh0eXBlb2YgdGhpcy5pSGFzaC51cGRhdGUgIT09ICdmdW5jdGlvbicpXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0V4cGVjdGVkIGluc3RhbmNlIG9mIGNsYXNzIHdoaWNoIGV4dGVuZHMgdXRpbHMuSGFzaCcpO1xuICAgICAgICB0aGlzLmJsb2NrTGVuID0gdGhpcy5pSGFzaC5ibG9ja0xlbjtcbiAgICAgICAgdGhpcy5vdXRwdXRMZW4gPSB0aGlzLmlIYXNoLm91dHB1dExlbjtcbiAgICAgICAgY29uc3QgYmxvY2tMZW4gPSB0aGlzLmJsb2NrTGVuO1xuICAgICAgICBjb25zdCBwYWQgPSBuZXcgVWludDhBcnJheShibG9ja0xlbik7XG4gICAgICAgIC8vIGJsb2NrTGVuIGNhbiBiZSBiaWdnZXIgdGhhbiBvdXRwdXRMZW5cbiAgICAgICAgcGFkLnNldChrZXkubGVuZ3RoID4gYmxvY2tMZW4gPyBoYXNoLmNyZWF0ZSgpLnVwZGF0ZShrZXkpLmRpZ2VzdCgpIDoga2V5KTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBwYWQubGVuZ3RoOyBpKyspXG4gICAgICAgICAgICBwYWRbaV0gXj0gMHgzNjtcbiAgICAgICAgdGhpcy5pSGFzaC51cGRhdGUocGFkKTtcbiAgICAgICAgLy8gQnkgZG9pbmcgdXBkYXRlIChwcm9jZXNzaW5nIG9mIGZpcnN0IGJsb2NrKSBvZiBvdXRlciBoYXNoIGhlcmUgd2UgY2FuIHJlLXVzZSBpdCBiZXR3ZWVuIG11bHRpcGxlIGNhbGxzIHZpYSBjbG9uZVxuICAgICAgICB0aGlzLm9IYXNoID0gaGFzaC5jcmVhdGUoKTtcbiAgICAgICAgLy8gVW5kbyBpbnRlcm5hbCBYT1IgJiYgYXBwbHkgb3V0ZXIgWE9SXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcGFkLmxlbmd0aDsgaSsrKVxuICAgICAgICAgICAgcGFkW2ldIF49ID
26774B4MzYgXiAweDVjO1xuICAgICAgICB0aGlzLm9IYXNoLnVwZGF0ZShwYWQpO1xuICAgICAgICBwYWQuZmlsbCgwKTtcbiAgICB9XG4gICAgdXBkYXRlKGJ1Zikge1xuICAgICAgICBhc3NlcnRFeGlzdHModGhpcyk7XG4gICAgICAgIHRoaXMuaUhhc2gudXBkYXRlKGJ1Zik7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICBkaWdlc3RJbnRvKG91dCkge1xuICAgICAgICBhc3NlcnRFeGlzdHModGhpcyk7XG4gICAgICAgIGFzc2VydEJ5dGVzKG91dCwgdGhpcy5vdXRwdXRMZW4pO1xuICAgICAgICB0aGlzLmZpbmlzaGVkID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5pSGFzaC5kaWdlc3RJbnRvKG91dCk7XG4gICAgICAgIHRoaXMub0hhc2gudXBkYXRlKG91dCk7XG4gICAgICAgIHRoaXMub0hhc2guZGlnZXN0SW50byhvdXQpO1xuICAgICAgICB0aGlzLmRlc3Ryb3koKTtcbiAgICB9XG4gICAgZGlnZXN0KCkge1xuICAgICAgICBjb25zdCBvdXQgPSBuZXcgVWludDhBcnJheSh0aGlzLm9IYXNoLm91dHB1dExlbik7XG4gICAgICAgIHRoaXMuZGlnZXN0SW50byhvdXQpO1xuICAgICAgICByZXR1cm4gb3V0O1xuICAgIH1cbiAgICBfY2xvbmVJbnRvKHRvKSB7XG4gICAgICAgIC8vIENyZWF0ZSBuZXcgaW5zdGFuY2Ugd2l0aG91dCBjYWxsaW5nIGNvbnN0cnVjdG9yIHNpbmNlIGtleSBhbHJlYWR5IGluIHN0YXRlIGFuZCB3ZSBkb24ndCBrbm93IGl0LlxuICAgICAgICB0byB8fCAodG8gPSBPYmplY3QuY3JlYXRlKE9iamVjdC5nZXRQcm90b3R5cGVPZih0aGlzKSwge30pKTtcbiAgICAgICAgY29uc3QgeyBvSGFzaCwgaUhhc2gsIGZpbmlzaGVkLCBkZXN0cm95ZWQsIGJsb2NrTGVuLCBvdXRwdXRMZW4gfSA9IHRoaXM7XG4gICAgICAgIHRvID0gdG87XG4gICAgICAgIHRvLmZpbmlzaGVkID0gZmluaXNoZWQ7XG4gICAgICAgIHRvLmRlc3Ryb3llZCA9IGRlc3Ryb3llZDtcbiAgICAgICAgdG8uYmxvY2tMZW4gPSBibG9ja0xlbjtcbiAgICAgICAgdG8ub3V0cHV0TGVuID0gb3V0cHV0TGVuO1xuICAgICAgICB0by5vSGFzaCA9IG9IYXNoLl9jbG9uZUludG8odG8ub0hhc2gpO1xuICAgICAgICB0by5pSGFzaCA9IGlIYXNoLl9jbG9uZUludG8odG8uaUhhc2gpO1xuICAgICAgICByZXR1cm4gdG87XG4gICAgfVxuICAgIGRlc3Ryb3koKSB7XG4gICAgICAgIHRoaXMuZGVzdHJveWVkID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5vSGFzaC5kZXN0cm95KCk7XG4gICAgICAgIHRoaXMuaUhhc2guZGVzdHJveSgpO1xuICAgIH1cbn1cbi8qKlxuICogSE1BQzogUkZDMjEwNCBtZXNzYWdlIGF1dGhlbnRpY2F0aW9uIGNvZGUuXG4gKiBAcGFyYW0gaGFzaCAtIGZ1bmN0aW9uIHRoYXQgd291bGQgYmUgdXNlZCBlLmcuIHNoYTI1NlxuICogQHBhcmFtIGtleSAtIG1lc3NhZ2Uga2V5XG4gKiBAcGFyYW0gbWVzc2FnZSAtIG1lc3NhZ2UgZGF0YVxuICovXG5leHBvcnQgY29uc3QgaG1hYyA9IChoYXNoLCBrZXksIG1lc3NhZ2UpID0+IG5ldyBITUFDKGhhc2gsIGtleSkudXBkYXRlKG1lc3NhZ2UpLmRpZ2VzdCgpO1xuaG1hYy5jcmVhdGUgPSAoaGFzaCwga2V5KSA9PiBuZXcgSE1BQyhoYXNoLCBrZXkpO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9aG1hYy5qcy5tYXAiLCJpbXBvcnQgeyBoYXNoIGFzIGFzc2VydEhhc2gsIG51bWJlciBhcyBhc3NlcnROdW1iZXIgfSBmcm9tICcuL19hc3NlcnQuanMnO1xuaW1wb3J0IHsgaG1hYyB9IGZyb20gJy4vaG1hYy5qcyc7XG5pbXBvcnQgeyBjcmVhdGVWaWV3LCB0b0J5dGVzLCBjaGVja09wdHMsIGFzeW5jTG9vcCB9IGZyb20gJy4vdXRpbHMuanMnO1xuLy8gQ29tbW9uIHByb2xvZ3VlIGFuZCBlcGlsb2d1ZSBmb3Igc3luYy9hc3luYyBmdW5jdGlvbnNcbmZ1bmN0aW9uIHBia2RmMkluaXQoaGFzaCwgX3Bhc3N3b3JkLCBfc2FsdCwgX29wdHMpIHtcbiAgICBhc3NlcnRIYXNoKGhhc2gpO1xuICAgIGNvbnN0IG9wdHMgPSBjaGVja09wdHMoeyBka0xlbjogMzIsIGFzeW5jVGljazogMTAgfSwgX29wdHMpO1xuICAgIGNvbnN0IHsgYywgZGtMZW4sIGFzeW5jVGljayB9ID0gb3B0cztcbiAgICBhc3NlcnROdW1iZXIoYyk7XG4gICAgYXNzZXJ0TnVtYmVyKGRrTGVuKTtcbiAgICBhc3NlcnROdW1iZXIoYXN5bmNUaWNrKTtcbiAgICBpZiAoYyA8IDEpXG4gICAgICAgIHRocm93IG5ldyBFcnJvcignUEJLREYyOiBpdGVyYXRpb25zIChjKSBzaG91bGQgYmUgPj0gMScpO1xuICAgIGNvbnN0IHBhc3N3b3JkID0gdG9CeXRlcyhfcGFzc3dvcmQpO1xuICAgIGNvbnN0IHNhbHQgPSB0b0J5dGVzKF9zYWx0KTtcbiAgICAvLyBESyA9IFBCS0RGMihQUkYsIFBhc3N3b3JkLCBTYWx0LCBjLCBka0xlbik7XG4gICAgY29uc3QgREsgPSBuZXcgVWludDhBcnJheShka0xlbik7XG4gICAgLy8gVTEgPSBQUkYoUGFzc3dvcmQsIFNhbHQgKyBJTlRfMzJfQkUoaSkpXG4gICAgY29uc3QgUFJGID0gaG1hYy5jcmVhdGUoaGFzaCwgcGFzc3dvcmQpO1xuICAgIGNvbnN0IFBSRlNhbHQgPSBQUkYuX2Nsb25lSW50bygpLnVwZGF0ZShzYWx0KTtcbiAgICByZXR1cm4geyBjLCBka0xlbiwgYXN5bmNUaWNrLCBESywgUFJGLCBQUkZTYWx0IH07XG59XG5mdW5jdGlvbiBwYmtkZjJPdXRwdXQoUFJGLCBQUkZTYWx0LCBESywgcHJmVywgdSkge1xuICAgIFBSRi5kZXN0cm95KCk7XG4gICAgUFJGU2FsdC5kZXN0cm95KCk7XG4gICAgaWYgKHByZlcpXG4gICAgICAgIHByZlcuZGVzdHJveSgpO1xuICAgIHUuZmlsbCgwKTtcbiAgICByZXR1cm4gREs7XG59XG4vKipcbiAqIFBCS0RGMi1ITUFDOiBSRkMgMjg5OCBrZXkgZGVyaXZhdGlvbiBmdW5jdGlvblxuICogQHBhcmFtIGhhc2ggLSBoYXNoIGZ1bmN0aW9uIHRoYXQgd291bGQgYmUgdXNlZCBlLmcuIHNoYTI1NlxuICogQHBhcmFtIHBhc3N3b3JkIC0gcGFzc3dvcmQgZnJvbSB3aGljaCBhIGRlcml2ZWQga2V5IGlzIGdlbmVyYXRlZFxuICogQHBhcmFtIHNhbHQgLSBjcnlwdG9ncmFwaGljIHNhbHRcbiAqIEBwYXJhbSBvcHRzIC0ge2MsIGRrTGVufSB3aGVyZSBjIGlzIHdvcmsgZmFjdG9yIGFuZCBka0xlbiBpcyBvdXRwdXQgbWVzc2FnZSBzaXplXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwYmtkZjIoaGFzaCwgcGFzc3dvcmQsIHNhbHQsIG9wdHMpIHtcbiAgICBjb25zdCB7IGMsIGRrTGVuLCBESywgUFJGLCBQUkZTYWx0IH0gPSBwYmtkZjJJbml0KGhhc2gsIHBhc3N3b3JkLCBzYWx0LCBvcHRzKTtcbiAgICBsZXQgcHJmVzsgLy8gV29ya2luZyBjb3B5XG4gICAgY29uc3QgYXJyID0gbmV3IFVpbnQ4QXJyYXkoNCk7XG4gICAgY29uc3QgdmlldyA9IGNyZWF0ZVZpZXcoYXJyKTtcbiAgICBjb25zdCB1ID0gbmV3IFVpbnQ4QXJyYXkoUFJGLm91dHB1dExlbik7XG4gICAgLy8gREsgPSBUMSArIFQyICsg4ouvICsgVGRrbGVuL2hsZW5cbiAgICBmb3IgKGxldCB0aSA9IDEsIHBvcyA9IDA7IHBvcyA8IGRrTGVuOyB0aSsrLCBwb3MgKz0gUFJGLm91dHB1dExlbikge1xuICAgICAgICAvLyBUaSA9IEYoUGFzc3dvcmQsIFNhbHQsIGMsIGkpXG4gICAgICAgIGNvbnN0IFRpID0gREsuc3ViYXJyYXkocG9zLCBwb3MgKyBQUkYub3V0cHV0TGVuKTtcbiAgICAgICAgdmlldy5zZXRJbnQzMigwLCB0aSwgZmFsc2UpO1xuICAgICAgICAvLyBGKFBhc3N3b3JkLCBTYWx0LCBjLCBpKSA9IFUxIF4gVTIgXiDii68gXiBVY1xuICAgICAgICAvLyBVMSA9IFBSRihQYXNzd29yZCwgU2FsdCArIElOVF8zMl9CRShpKSlcbiAgICAgICAgKHByZlcgPSBQUkZTYWx0Ll9jbG9uZUludG8ocHJmVykpLnVwZGF0ZShhcnIpLmRpZ2VzdEludG8odSk7XG4gICAgICAgIFRpLnNldCh1LnN1YmFycmF5KDAsIFRpLmxlbmd0aCkpO1xuICAgICAgICBmb3IgKGxldCB1aSA9IDE7IHVpIDwgYzsgdWkrKykge1xuICAgICAgICAgICAgLy8gVWMgPSBQUkYoUGFzc3dvcmQsIFVj4oiSMSlcbiAgICAgICAgICAgIFBSRi5fY2xvbmVJbnRvKHByZlcpLnVwZGF0ZSh1KS5kaWdlc3RJbnRvKHUpO1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBUaS5sZW5ndGg7IGkrKylcbiAgICAgICAgICAgICAgICBUaVtpXSBePSB1W2ldO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybi
26774BwYmtkZjJPdXRwdXQoUFJGLCBQUkZTYWx0LCBESywgcHJmVywgdSk7XG59XG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcGJrZGYyQXN5bmMoaGFzaCwgcGFzc3dvcmQsIHNhbHQsIG9wdHMpIHtcbiAgICBjb25zdCB7IGMsIGRrTGVuLCBhc3luY1RpY2ssIERLLCBQUkYsIFBSRlNhbHQgfSA9IHBia2RmMkluaXQoaGFzaCwgcGFzc3dvcmQsIHNhbHQsIG9wdHMpO1xuICAgIGxldCBwcmZXOyAvLyBXb3JraW5nIGNvcHlcbiAgICBjb25zdCBhcnIgPSBuZXcgVWludDhBcnJheSg0KTtcbiAgICBjb25zdCB2aWV3ID0gY3JlYXRlVmlldyhhcnIpO1xuICAgIGNvbnN0IHUgPSBuZXcgVWludDhBcnJheShQUkYub3V0cHV0TGVuKTtcbiAgICAvLyBESyA9IFQxICsgVDIgKyDii68gKyBUZGtsZW4vaGxlblxuICAgIGZvciAobGV0IHRpID0gMSwgcG9zID0gMDsgcG9zIDwgZGtMZW47IHRpKyssIHBvcyArPSBQUkYub3V0cHV0TGVuKSB7XG4gICAgICAgIC8vIFRpID0gRihQYXNzd29yZCwgU2FsdCwgYywgaSlcbiAgICAgICAgY29uc3QgVGkgPSBESy5zdWJhcnJheShwb3MsIHBvcyArIFBSRi5vdXRwdXRMZW4pO1xuICAgICAgICB2aWV3LnNldEludDMyKDAsIHRpLCBmYWxzZSk7XG4gICAgICAgIC8vIEYoUGFzc3dvcmQsIFNhbHQsIGMsIGkpID0gVTEgXiBVMiBeIOKLryBeIFVjXG4gICAgICAgIC8vIFUxID0gUFJGKFBhc3N3b3JkLCBTYWx0ICsgSU5UXzMyX0JFKGkpKVxuICAgICAgICAocHJmVyA9IFBSRlNhbHQuX2Nsb25lSW50byhwcmZXKSkudXBkYXRlKGFycikuZGlnZXN0SW50byh1KTtcbiAgICAgICAgVGkuc2V0KHUuc3ViYXJyYXkoMCwgVGkubGVuZ3RoKSk7XG4gICAgICAgIGF3YWl0IGFzeW5jTG9vcChjIC0gMSwgYXN5bmNUaWNrLCAoKSA9PiB7XG4gICAgICAgICAgICAvLyBVYyA9IFBSRihQYXNzd29yZCwgVWPiiJIxKVxuICAgICAgICAgICAgUFJGLl9jbG9uZUludG8ocHJmVykudXBkYXRlKHUpLmRpZ2VzdEludG8odSk7XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IFRpLmxlbmd0aDsgaSsrKVxuICAgICAgICAgICAgICAgIFRpW2ldIF49IHVbaV07XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICByZXR1cm4gcGJrZGYyT3V0cHV0KFBSRiwgUFJGU2FsdCwgREssIHByZlcsIHUpO1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9cGJrZGYyLmpzLm1hcCIsImltcG9ydCB7IGV4aXN0cywgb3V0cHV0IH0gZnJvbSAnLi9fYXNzZXJ0LmpzJztcbmltcG9ydCB7IEhhc2gsIGNyZWF0ZVZpZXcsIHRvQnl0ZXMgfSBmcm9tICcuL3V0aWxzLmpzJztcbi8vIFBvbHlmaWxsIGZvciBTYWZhcmkgMTRcbmZ1bmN0aW9uIHNldEJpZ1VpbnQ2NCh2aWV3LCBieXRlT2Zmc2V0LCB2YWx1ZSwgaXNMRSkge1xuICAgIGlmICh0eXBlb2Ygdmlldy5zZXRCaWdVaW50NjQgPT09ICdmdW5jdGlvbicpXG4gICAgICAgIHJldHVybiB2aWV3LnNldEJpZ1VpbnQ2NChieXRlT2Zmc2V0LCB2YWx1ZSwgaXNMRSk7XG4gICAgY29uc3QgXzMybiA9IEJpZ0ludCgzMik7XG4gICAgY29uc3QgX3UzMl9tYXggPSBCaWdJbnQoMHhmZmZmZmZmZik7XG4gICAgY29uc3Qgd2ggPSBOdW1iZXIoKHZhbHVlID4+IF8zMm4pICYgX3UzMl9tYXgpO1xuICAgIGNvbnN0IHdsID0gTnVtYmVyKHZhbHVlICYgX3UzMl9tYXgpO1xuICAgIGNvbnN0IGggPSBpc0xFID8gNCA6IDA7XG4gICAgY29uc3QgbCA9IGlzTEUgPyAwIDogNDtcbiAgICB2aWV3LnNldFVpbnQzMihieXRlT2Zmc2V0ICsgaCwgd2gsIGlzTEUpO1xuICAgIHZpZXcuc2V0VWludDMyKGJ5dGVPZmZzZXQgKyBsLCB3bCwgaXNMRSk7XG59XG4vLyBCYXNlIFNIQTIgY2xhc3MgKFJGQyA2MjM0KVxuZXhwb3J0IGNsYXNzIFNIQTIgZXh0ZW5kcyBIYXNoIHtcbiAgICBjb25zdHJ1Y3RvcihibG9ja0xlbiwgb3V0cHV0TGVuLCBwYWRPZmZzZXQsIGlzTEUpIHtcbiAgICAgICAgc3VwZXIoKTtcbiAgICAgICAgdGhpcy5ibG9ja0xlbiA9IGJsb2NrTGVuO1xuICAgICAgICB0aGlzLm91dHB1dExlbiA9IG91dHB1dExlbjtcbiAgICAgICAgdGhpcy5wYWRPZmZzZXQgPSBwYWRPZmZzZXQ7XG4gICAgICAgIHRoaXMuaXNMRSA9IGlzTEU7XG4gICAgICAgIHRoaXMuZmluaXNoZWQgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5sZW5ndGggPSAwO1xuICAgICAgICB0aGlzLnBvcyA9IDA7XG4gICAgICAgIHRoaXMuZGVzdHJveWVkID0gZmFsc2U7XG4gICAgICAgIHRoaXMuYnVmZmVyID0gbmV3IFVpbnQ4QXJyYXkoYmxvY2tMZW4pO1xuICAgICAgICB0aGlzLnZpZXcgPSBjcmVhdGVWaWV3KHRoaXMuYnVmZmVyKTtcbiAgICB9XG4gICAgdXBkYXRlKGRhdGEpIHtcbiAgICAgICAgZXhpc3RzKHRoaXMpO1xuICAgICAgICBjb25zdCB7IHZpZXcsIGJ1ZmZlciwgYmxvY2tMZW4gfSA9IHRoaXM7XG4gICAgICAgIGRhdGEgPSB0b0J5dGVzKGRhdGEpO1xuICAgICAgICBjb25zdCBsZW4gPSBkYXRhLmxlbmd0aDtcbiAgICAgICAgZm9yIChsZXQgcG9zID0gMDsgcG9zIDwgbGVuOykge1xuICAgICAgICAgICAgY29uc3QgdGFrZSA9IE1hdGgubWluKGJsb2NrTGVuIC0gdGhpcy5wb3MsIGxlbiAtIHBvcyk7XG4gICAgICAgICAgICAvLyBGYXN0IHBhdGg6IHdlIGhhdmUgYXQgbGVhc3Qgb25lIGJsb2NrIGluIGlucHV0LCBjYXN0IGl0IHRvIHZpZXcgYW5kIHByb2Nlc3NcbiAgICAgICAgICAgIGlmICh0YWtlID09PSBibG9ja0xlbikge1xuICAgICAgICAgICAgICAgIGNvbnN0IGRhdGFWaWV3ID0gY3JlYXRlVmlldyhkYXRhKTtcbiAgICAgICAgICAgICAgICBmb3IgKDsgYmxvY2tMZW4gPD0gbGVuIC0gcG9zOyBwb3MgKz0gYmxvY2tMZW4pXG4gICAgICAgICAgICAgICAgICAgIHRoaXMucHJvY2VzcyhkYXRhVmlldywgcG9zKTtcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGJ1ZmZlci5zZXQoZGF0YS5zdWJhcnJheShwb3MsIHBvcyArIHRha2UpLCB0aGlzLnBvcyk7XG4gICAgICAgICAgICB0aGlzLnBvcyArPSB0YWtlO1xuICAgICAgICAgICAgcG9zICs9IHRha2U7XG4gICAgICAgICAgICBpZiAodGhpcy5wb3MgPT09IGJsb2NrTGVuKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5wcm9jZXNzKHZpZXcsIDApO1xuICAgICAgICAgICAgICAgI
26774HRoaXMucG9zID0gMDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB0aGlzLmxlbmd0aCArPSBkYXRhLmxlbmd0aDtcbiAgICAgICAgdGhpcy5yb3VuZENsZWFuKCk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICBkaWdlc3RJbnRvKG91dCkge1xuICAgICAgICBleGlzdHModGhpcyk7XG4gICAgICAgIG91dHB1dChvdXQsIHRoaXMpO1xuICAgICAgICB0aGlzLmZpbmlzaGVkID0gdHJ1ZTtcbiAgICAgICAgLy8gUGFkZGluZ1xuICAgICAgICAvLyBXZSBjYW4gYXZvaWQgYWxsb2NhdGlvbiBvZiBidWZmZXIgZm9yIHBhZGRpbmcgY29tcGxldGVseSBpZiBpdFxuICAgICAgICAvLyB3YXMgcHJldmlvdXNseSBub3QgYWxsb2NhdGVkIGhlcmUuIEJ1dCBpdCB3b24ndCBjaGFuZ2UgcGVyZm9ybWFuY2UuXG4gICAgICAgIGNvbnN0IHsgYnVmZmVyLCB2aWV3LCBibG9ja0xlbiwgaXNMRSB9ID0gdGhpcztcbiAgICAgICAgbGV0IHsgcG9zIH0gPSB0aGlzO1xuICAgICAgICAvLyBhcHBlbmQgdGhlIGJpdCAnMScgdG8gdGhlIG1lc3NhZ2VcbiAgICAgICAgYnVmZmVyW3BvcysrXSA9IDBiMTAwMDAwMDA7XG4gICAgICAgIHRoaXMuYnVmZmVyLnN1YmFycmF5KHBvcykuZmlsbCgwKTtcbiAgICAgICAgLy8gd2UgaGF2ZSBsZXNzIHRoYW4gcGFkT2Zmc2V0IGxlZnQgaW4gYnVmZmVyLCBzbyB3ZSBjYW5ub3QgcHV0IGxlbmd0aCBpbiBjdXJyZW50IGJsb2NrLCBuZWVkIHByb2Nlc3MgaXQgYW5kIHBhZCBhZ2FpblxuICAgICAgICBpZiAodGhpcy5wYWRPZmZzZXQgPiBibG9ja0xlbiAtIHBvcykge1xuICAgICAgICAgICAgdGhpcy5wcm9jZXNzKHZpZXcsIDApO1xuICAgICAgICAgICAgcG9zID0gMDtcbiAgICAgICAgfVxuICAgICAgICAvLyBQYWQgdW50aWwgZnVsbCBibG9jayBieXRlIHdpdGggemVyb3NcbiAgICAgICAgZm9yIChsZXQgaSA9IHBvczsgaSA8IGJsb2NrTGVuOyBpKyspXG4gICAgICAgICAgICBidWZmZXJbaV0gPSAwO1xuICAgICAgICAvLyBOb3RlOiBzaGE1MTIgcmVxdWlyZXMgbGVuZ3RoIHRvIGJlIDEyOGJpdCBpbnRlZ2VyLCBidXQgbGVuZ3RoIGluIEpTIHdpbGwgb3ZlcmZsb3cgYmVmb3JlIHRoYXRcbiAgICAgICAgLy8gWW91IG5lZWQgdG8gd3JpdGUgYXJvdW5kIDIgZXhhYnl0ZXMgKHU2NF9tYXggLyA4IC8gKDEwMjQqKjYpKSBmb3IgdGhpcyB0byBoYXBwZW4uXG4gICAgICAgIC8vIFNvIHdlIGp1c3Qgd3JpdGUgbG93ZXN0IDY0IGJpdHMgb2YgdGhhdCB2YWx1ZS5cbiAgICAgICAgc2V0QmlnVWludDY0KHZpZXcsIGJsb2NrTGVuIC0gOCwgQmlnSW50KHRoaXMubGVuZ3RoICogOCksIGlzTEUpO1xuICAgICAgICB0aGlzLnByb2Nlc3ModmlldywgMCk7XG4gICAgICAgIGNvbnN0IG92aWV3ID0gY3JlYXRlVmlldyhvdXQpO1xuICAgICAgICBjb25zdCBsZW4gPSB0aGlzLm91dHB1dExlbjtcbiAgICAgICAgLy8gTk9URTogd2UgZG8gZGl2aXNpb24gYnkgNCBsYXRlciwgd2hpY2ggc2hvdWxkIGJlIGZ1c2VkIGluIHNpbmdsZSBvcCB3aXRoIG1vZHVsbyBieSBKSVRcbiAgICAgICAgaWYgKGxlbiAlIDQpXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ19zaGEyOiBvdXRwdXRMZW4gc2hvdWxkIGJlIGFsaWduZWQgdG8gMzJiaXQnKTtcbiAgICAgICAgY29uc3Qgb3V0TGVuID0gbGVuIC8gNDtcbiAgICAgICAgY29uc3Qgc3RhdGUgPSB0aGlzLmdldCgpO1xuICAgICAgICBpZiAob3V0TGVuID4gc3RhdGUubGVuZ3RoKVxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdfc2hhMjogb3V0cHV0TGVuIGJpZ2dlciB0aGFuIHN0YXRlJyk7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgb3V0TGVuOyBpKyspXG4gICAgICAgICAgICBvdmlldy5zZXRVaW50MzIoNCAqIGksIHN0YXRlW2ldLCBpc0xFKTtcbiAgICB9XG4gICAgZGlnZXN0KCkge1xuICAgICAgICBjb25zdCB7IGJ1ZmZlciwgb3V0cHV0TGVuIH0gPSB0aGlzO1xuICAgICAgICB0aGlzLmRpZ2VzdEludG8oYnVmZmVyKTtcbiAgICAgICAgY29uc3QgcmVzID0gYnVmZmVyLnNsaWNlKDAsIG91dHB1dExlbik7XG4gICAgICAgIHRoaXMuZGVzdHJveSgpO1xuICAgICAgICByZXR1cm4gcmVzO1xuICAgIH1cbiAgICBfY2xvbmVJbnRvKHRvKSB7XG4gICAgICAgIHRvIHx8ICh0byA9IG5ldyB0aGlzLmNvbnN0cnVjdG9yKCkpO1xuICAgICAgICB0by5zZXQoLi4udGhpcy5nZXQoKSk7XG4gICAgICAgIGNvbnN0IHsgYmxvY2tMZW4sIGJ1ZmZlciwgbGVuZ3RoLCBmaW5pc2hlZCwgZGVzdHJveWVkLCBwb3MgfSA9IHRoaXM7XG4gICAgICAgIHRvLmxlbmd0aCA9IGxlbmd0aDtcbiAgICAgICAgdG8ucG9zID0gcG9zO1xuICAgICAgICB0by5maW5pc2hlZCA9IGZpbmlzaGVkO1xuICAgICAgICB0by5kZXN0cm95ZWQgPSBkZXN0cm95ZWQ7XG4gICAgICAgIGlmIChsZW5ndGggJSBibG9ja0xlbilcbiAgICAgICAgICAgIHRvLmJ1ZmZlci5zZXQoYnVmZmVyKTtcbiAgICAgICAgcmV0dXJuIHRvO1xuICAgIH1cbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPV9zaGEyLmpzLm1hcCIsImltcG9ydCB7IFNIQTIgfSBmcm9tICcuL19zaGEyLmpzJztcbmltcG9ydCB7IHJvdHIsIHdyYXBDb25zdHJ1Y3RvciB9IGZyb20gJy4vdXRpbHMuanMnO1xuLy8gU0hBMi0yNTYgbmVlZCB0byB0cnkgMl4xMjggaGFzaGVzIHRvIGV4ZWN1dGUgYmlydGhkYXkgYXR0YWNrLlxuLy8gQlRDIG5ldHdvcmsgaXMgZG9pbmcgMl42NyBoYXNoZXMvc2VjIGFzIHBlciBlYXJseSAyMDIzLlxuLy8gQ2hvaWNlOiBhID8gYiA6IGNcbmNvbnN0IENoaSA9IChhLCBiLCBjKSA9PiAoYSAmIGIpIF4gKH5hICYgYyk7XG4vLyBNYWpvcml0eSBmdW5jdGlvbiwgdHJ1ZSBpZiBhbnkgdHdvIGlucHVzdCBpcyB0cnVlXG5jb25zdCBNYWogPSAoYSwgYiwgYykgPT4gKGEgJiBiKSBeIChhICYgYykgXiAoYiAmIGMpO1xuLy8gUm91bmQgY29uc3RhbnRzOlxuLy8gZmlyc3QgMzIgYml0cyBvZiB0aGUgZnJhY3Rpb25hbCBwYXJ0cyBvZiB0aGUgY3ViZSByb290cyBvZiB0aGUgZmlyc3QgNjQgcHJpbWVzIDIuLjMxMSlcbi8vIHByZXR0aWVyLWlnbm9yZVxuY29uc3QgU0hBMjU2X0sgPSAvKiBAX19QVVJFX18gKi8gbmV3IFVpbnQzMkFycmF
267745KFtcbiAgICAweDQyOGEyZjk4LCAweDcxMzc0NDkxLCAweGI1YzBmYmNmLCAweGU5YjVkYmE1LCAweDM5NTZjMjViLCAweDU5ZjExMWYxLCAweDkyM2Y4MmE0LCAweGFiMWM1ZWQ1LFxuICAgIDB4ZDgwN2FhOTgsIDB4MTI4MzViMDEsIDB4MjQzMTg1YmUsIDB4NTUwYzdkYzMsIDB4NzJiZTVkNzQsIDB4ODBkZWIxZmUsIDB4OWJkYzA2YTcsIDB4YzE5YmYxNzQsXG4gICAgMHhlNDliNjljMSwgMHhlZmJlNDc4NiwgMHgwZmMxOWRjNiwgMHgyNDBjYTFjYywgMHgyZGU5MmM2ZiwgMHg0YTc0ODRhYSwgMHg1Y2IwYTlkYywgMHg3NmY5ODhkYSxcbiAgICAweDk4M2U1MTUyLCAweGE4MzFjNjZkLCAweGIwMDMyN2M4LCAweGJmNTk3ZmM3LCAweGM2ZTAwYmYzLCAweGQ1YTc5MTQ3LCAweDA2Y2E2MzUxLCAweDE0MjkyOTY3LFxuICAgIDB4MjdiNzBhODUsIDB4MmUxYjIxMzgsIDB4NGQyYzZkZmMsIDB4NTMzODBkMTMsIDB4NjUwYTczNTQsIDB4NzY2YTBhYmIsIDB4ODFjMmM5MmUsIDB4OTI3MjJjODUsXG4gICAgMHhhMmJmZThhMSwgMHhhODFhNjY0YiwgMHhjMjRiOGI3MCwgMHhjNzZjNTFhMywgMHhkMTkyZTgxOSwgMHhkNjk5MDYyNCwgMHhmNDBlMzU4NSwgMHgxMDZhYTA3MCxcbiAgICAweDE5YTRjMTE2LCAweDFlMzc2YzA4LCAweDI3NDg3NzRjLCAweDM0YjBiY2I1LCAweDM5MWMwY2IzLCAweDRlZDhhYTRhLCAweDViOWNjYTRmLCAweDY4MmU2ZmYzLFxuICAgIDB4NzQ4ZjgyZWUsIDB4NzhhNTYzNmYsIDB4ODRjODc4MTQsIDB4OGNjNzAyMDgsIDB4OTBiZWZmZmEsIDB4YTQ1MDZjZWIsIDB4YmVmOWEzZjcsIDB4YzY3MTc4ZjJcbl0pO1xuLy8gSW5pdGlhbCBzdGF0ZSAoZmlyc3QgMzIgYml0cyBvZiB0aGUgZnJhY3Rpb25hbCBwYXJ0cyBvZiB0aGUgc3F1YXJlIHJvb3RzIG9mIHRoZSBmaXJzdCA4IHByaW1lcyAyLi4xOSk6XG4vLyBwcmV0dGllci1pZ25vcmVcbmNvbnN0IElWID0gLyogQF9fUFVSRV9fICovIG5ldyBVaW50MzJBcnJheShbXG4gICAgMHg2YTA5ZTY2NywgMHhiYjY3YWU4NSwgMHgzYzZlZjM3MiwgMHhhNTRmZjUzYSwgMHg1MTBlNTI3ZiwgMHg5YjA1Njg4YywgMHgxZjgzZDlhYiwgMHg1YmUwY2QxOVxuXSk7XG4vLyBUZW1wb3JhcnkgYnVmZmVyLCBub3QgdXNlZCB0byBzdG9yZSBhbnl0aGluZyBiZXR3ZWVuIHJ1bnNcbi8vIE5hbWVkIHRoaXMgd2F5IGJlY2F1c2UgaXQgbWF0Y2hlcyBzcGVjaWZpY2F0aW9uLlxuY29uc3QgU0hBMjU2X1cgPSAvKiBAX19QVVJFX18gKi8gbmV3IFVpbnQzMkFycmF5KDY0KTtcbmNsYXNzIFNIQTI1NiBleHRlbmRzIFNIQTIge1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICBzdXBlcig2NCwgMzIsIDgsIGZhbHNlKTtcbiAgICAgICAgLy8gV2UgY2Fubm90IHVzZSBhcnJheSBoZXJlIHNpbmNlIGFycmF5IGFsbG93cyBpbmRleGluZyBieSB2YXJpYWJsZVxuICAgICAgICAvLyB3aGljaCBtZWFucyBvcHRpbWl6ZXIvY29tcGlsZXIgY2Fubm90IHVzZSByZWdpc3RlcnMuXG4gICAgICAgIHRoaXMuQSA9IElWWzBdIHwgMDtcbiAgICAgICAgdGhpcy5CID0gSVZbMV0gfCAwO1xuICAgICAgICB0aGlzLkMgPSBJVlsyXSB8IDA7XG4gICAgICAgIHRoaXMuRCA9IElWWzNdIHwgMDtcbiAgICAgICAgdGhpcy5FID0gSVZbNF0gfCAwO1xuICAgICAgICB0aGlzLkYgPSBJVls1XSB8IDA7XG4gICAgICAgIHRoaXMuRyA9IElWWzZdIHwgMDtcbiAgICAgICAgdGhpcy5IID0gSVZbN10gfCAwO1xuICAgIH1cbiAgICBnZXQoKSB7XG4gICAgICAgIGNvbnN0IHsgQSwgQiwgQywgRCwgRSwgRiwgRywgSCB9ID0gdGhpcztcbiAgICAgICAgcmV0dXJuIFtBLCBCLCBDLCBELCBFLCBGLCBHLCBIXTtcbiAgICB9XG4gICAgLy8gcHJldHRpZXItaWdub3JlXG4gICAgc2V0KEEsIEIsIEMsIEQsIEUsIEYsIEcsIEgpIHtcbiAgICAgICAgdGhpcy5BID0gQSB8IDA7XG4gICAgICAgIHRoaXMuQiA9IEIgfCAwO1xuICAgICAgICB0aGlzLkMgPSBDIHwgMDtcbiAgICAgICAgdGhpcy5EID0gRCB8IDA7XG4gICAgICAgIHRoaXMuRSA9IEUgfCAwO1xuICAgICAgICB0aGlzLkYgPSBGIHwgMDtcbiAgICAgICAgdGhpcy5HID0gRyB8IDA7XG4gICAgICAgIHRoaXMuSCA9IEggfCAwO1xuICAgIH1cbiAgICBwcm9jZXNzKHZpZXcsIG9mZnNldCkge1xuICAgICAgICAvLyBFeHRlbmQgdGhlIGZpcnN0IDE2IHdvcmRzIGludG8gdGhlIHJlbWFpbmluZyA0OCB3b3JkcyB3WzE2Li42M10gb2YgdGhlIG1lc3NhZ2Ugc2NoZWR1bGUgYXJyYXlcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCAxNjsgaSsrLCBvZmZzZXQgKz0gNClcbiAgICAgICAgICAgIFNIQTI1Nl9XW2ldID0gdmlldy5nZXRVaW50MzIob2Zmc2V0LCBmYWxzZSk7XG4gICAgICAgIGZvciAobGV0IGkgPSAxNjsgaSA8IDY0OyBpKyspIHtcbiAgICAgICAgICAgIGNvbnN0IFcxNSA9IFNIQTI1Nl9XW2kgLSAxNV07XG4gICAgICAgICAgICBjb25zdCBXMiA9IFNIQTI1Nl9XW2kgLSAyXTtcbiAgICAgICAgICAgIGNvbnN0IHMwID0gcm90cihXMTUsIDcpIF4gcm90cihXMTUsIDE4KSBeIChXMTUgPj4+IDMpO1xuICAgICAgICAgICAgY29uc3QgczEgPSByb3RyKFcyLCAxNykgXiByb3RyKFcyLCAxOSkgXiAoVzIgPj4+IDEwKTtcbiAgICAgICAgICAgIFNIQTI1Nl9XW2ldID0gKHMxICsgU0hBMjU2X1dbaSAtIDddICsgczAgKyBTSEEyNTZfV1tpIC0gMTZdKSB8IDA7XG4gICAgICAgIH1cbiAgICAgICAgLy8gQ29tcHJlc3Npb24gZnVuY3Rpb24gbWFpbiBsb29wLCA2NCByb3VuZHNcbiAgICAgICAgbGV0IHsgQSwgQiwgQywgRCwgRSwgRiwgRywgSCB9ID0gdGhpcztcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCA2NDsgaSsrKSB7XG4gICAgICAgICAgICBjb25zdCBzaWdtYTEgPSByb3RyKEUsIDYpIF4gcm90cihFLCAxMSkgXiByb3RyKEUsIDI1KTtcbiAgICAgICAgICAgIGNvbnN0IFQxID0gKEggKyBzaWdtYTEgKyBDaGkoRSwgRiwgRykgKyBTSEEyNTZfS1tpXSArIFNIQTI1Nl9XW2ldKSB8IDA7XG4gICAgICAgICAgICBjb25zdCBzaWdtYTAgPSByb3RyKEEsIDIpIF4gcm90cihBLCAxMykgXiByb3RyKEEsIDIyKTtcbiAgICAgICAgICAgIGNvbnN0IFQyID0gKHNpZ21hMCArIE1haihBLCBCLCBDKSkgfCAwO1xuICAgICAgICAgICAgSCA9IEc7XG4gICAgICAgICAgICBHID0gRjtcbiAgICAgICAgICAgIEYgPSBFO1xuICAgICAgICAgICAgRSA9IChEICsgVDEpIHwgMDtcbiAgICAgICAgICAgIEQgPSBDO1xuICAgICAgICAgICAgQyA9IEI7XG4gICAgICAgICAgICBCID0gQTtcbiAgICAgICAgICAgIEEgPSAoVDEgKyBUMikgfCAwO1xuICAgICAgICB9XG4gICAgICAgIC8vIEFkZCB0aGUgY29tcHJlc3NlZCBjaHVuayB0byB0aGUgY3VycmVudCBoYXNoIHZhbHVlXG4gICAgICAgIEEgPSAoQSArIHRoaXMuQSkgfCAwO1xuICAgICAgICBCID0gKEIgKyB0aGlzLkIpIHwgMDtcbiAgICAgICAgQyA9IChDICsgdGhpcy5DKSB8IDA7XG4gICAgICAgIEQgPSAoRCArIHRoaXMuRCkgfCAwO1xuICAgICAgICBFID0gKEUgKyB0aGlzLkUpIHwgMDtcbiAgICAgICAgRiA9IChGICsgdGhpcy5GKSB8IDA7XG4gICAgICAgIEcgPSAoRyArIHRoaXMuRykgfCAwO1xuICAgICAgICBIID0gKEggKyB0aGlzLkgpIHwgMDtcbiAgICAgICAgdGhpcy5zZXQoQSwgQiwgQywgRCwgRSwgRiwgRywgSCk7XG4gICAgfVxuICAgIHJvdW5kQ2xlYW4oKSB7XG4gICAgICAgIFNIQTI1Nl9XLmZpbGwoMCk7XG4gICAgfVxuICAgIGRlc3Ryb3koKSB7XG4gICAgICAgI
26774HRoaXMuc2V0KDAsIDAsIDAsIDAsIDAsIDAsIDAsIDApO1xuICAgICAgICB0aGlzLmJ1ZmZlci5maWxsKDApO1xuICAgIH1cbn1cbi8vIENvbnN0YW50cyBmcm9tIGh0dHBzOi8vbnZscHVicy5uaXN0Lmdvdi9uaXN0cHVicy9GSVBTL05JU1QuRklQUy4xODAtNC5wZGZcbmNsYXNzIFNIQTIyNCBleHRlbmRzIFNIQTI1NiB7XG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHN1cGVyKCk7XG4gICAgICAgIHRoaXMuQSA9IDB4YzEwNTllZDggfCAwO1xuICAgICAgICB0aGlzLkIgPSAweDM2N2NkNTA3IHwgMDtcbiAgICAgICAgdGhpcy5DID0gMHgzMDcwZGQxNyB8IDA7XG4gICAgICAgIHRoaXMuRCA9IDB4ZjcwZTU5MzkgfCAwO1xuICAgICAgICB0aGlzLkUgPSAweGZmYzAwYjMxIHwgMDtcbiAgICAgICAgdGhpcy5GID0gMHg2ODU4MTUxMSB8IDA7XG4gICAgICAgIHRoaXMuRyA9IDB4NjRmOThmYTcgfCAwO1xuICAgICAgICB0aGlzLkggPSAweGJlZmE0ZmE0IHwgMDtcbiAgICAgICAgdGhpcy5vdXRwdXRMZW4gPSAyODtcbiAgICB9XG59XG4vKipcbiAqIFNIQTItMjU2IGhhc2ggZnVuY3Rpb25cbiAqIEBwYXJhbSBtZXNzYWdlIC0gZGF0YSB0aGF0IHdvdWxkIGJlIGhhc2hlZFxuICovXG5leHBvcnQgY29uc3Qgc2hhMjU2ID0gLyogQF9fUFVSRV9fICovIHdyYXBDb25zdHJ1Y3RvcigoKSA9PiBuZXcgU0hBMjU2KCkpO1xuZXhwb3J0IGNvbnN0IHNoYTIyNCA9IC8qIEBfX1BVUkVfXyAqLyB3cmFwQ29uc3RydWN0b3IoKCkgPT4gbmV3IFNIQTIyNCgpKTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXNoYTI1Ni5qcy5tYXAiLCJjb25zdCBVMzJfTUFTSzY0ID0gLyogQF9fUFVSRV9fICovIEJpZ0ludCgyICoqIDMyIC0gMSk7XG5jb25zdCBfMzJuID0gLyogQF9fUFVSRV9fICovIEJpZ0ludCgzMik7XG4vLyBXZSBhcmUgbm90IHVzaW5nIEJpZ1VpbnQ2NEFycmF5LCBiZWNhdXNlIHRoZXkgYXJlIGV4dHJlbWVseSBzbG93IGFzIHBlciAyMDIyXG5mdW5jdGlvbiBmcm9tQmlnKG4sIGxlID0gZmFsc2UpIHtcbiAgICBpZiAobGUpXG4gICAgICAgIHJldHVybiB7IGg6IE51bWJlcihuICYgVTMyX01BU0s2NCksIGw6IE51bWJlcigobiA+PiBfMzJuKSAmIFUzMl9NQVNLNjQpIH07XG4gICAgcmV0dXJuIHsgaDogTnVtYmVyKChuID4+IF8zMm4pICYgVTMyX01BU0s2NCkgfCAwLCBsOiBOdW1iZXIobiAmIFUzMl9NQVNLNjQpIHwgMCB9O1xufVxuZnVuY3Rpb24gc3BsaXQobHN0LCBsZSA9IGZhbHNlKSB7XG4gICAgbGV0IEFoID0gbmV3IFVpbnQzMkFycmF5KGxzdC5sZW5ndGgpO1xuICAgIGxldCBBbCA9IG5ldyBVaW50MzJBcnJheShsc3QubGVuZ3RoKTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxzdC5sZW5ndGg7IGkrKykge1xuICAgICAgICBjb25zdCB7IGgsIGwgfSA9IGZyb21CaWcobHN0W2ldLCBsZSk7XG4gICAgICAgIFtBaFtpXSwgQWxbaV1dID0gW2gsIGxdO1xuICAgIH1cbiAgICByZXR1cm4gW0FoLCBBbF07XG59XG5jb25zdCB0b0JpZyA9IChoLCBsKSA9PiAoQmlnSW50KGggPj4+IDApIDw8IF8zMm4pIHwgQmlnSW50KGwgPj4+IDApO1xuLy8gZm9yIFNoaWZ0IGluIFswLCAzMilcbmNvbnN0IHNoclNIID0gKGgsIF9sLCBzKSA9PiBoID4+PiBzO1xuY29uc3Qgc2hyU0wgPSAoaCwgbCwgcykgPT4gKGggPDwgKDMyIC0gcykpIHwgKGwgPj4+IHMpO1xuLy8gUmlnaHQgcm90YXRlIGZvciBTaGlmdCBpbiBbMSwgMzIpXG5jb25zdCByb3RyU0ggPSAoaCwgbCwgcykgPT4gKGggPj4+IHMpIHwgKGwgPDwgKDMyIC0gcykpO1xuY29uc3Qgcm90clNMID0gKGgsIGwsIHMpID0+IChoIDw8ICgzMiAtIHMpKSB8IChsID4+PiBzKTtcbi8vIFJpZ2h0IHJvdGF0ZSBmb3IgU2hpZnQgaW4gKDMyLCA2NCksIE5PVEU6IDMyIGlzIHNwZWNpYWwgY2FzZS5cbmNvbnN0IHJvdHJCSCA9IChoLCBsLCBzKSA9PiAoaCA8PCAoNjQgLSBzKSkgfCAobCA+Pj4gKHMgLSAzMikpO1xuY29uc3Qgcm90ckJMID0gKGgsIGwsIHMpID0+IChoID4+PiAocyAtIDMyKSkgfCAobCA8PCAoNjQgLSBzKSk7XG4vLyBSaWdodCByb3RhdGUgZm9yIHNoaWZ0PT09MzIgKGp1c3Qgc3dhcHMgbCZoKVxuY29uc3Qgcm90cjMySCA9IChfaCwgbCkgPT4gbDtcbmNvbnN0IHJvdHIzMkwgPSAoaCwgX2wpID0+IGg7XG4vLyBMZWZ0IHJvdGF0ZSBmb3IgU2hpZnQgaW4gWzEsIDMyKVxuY29uc3Qgcm90bFNIID0gKGgsIGwsIHMpID0+IChoIDw8IHMpIHwgKGwgPj4+ICgzMiAtIHMpKTtcbmNvbnN0IHJvdGxTTCA9IChoLCBsLCBzKSA9PiAobCA8PCBzKSB8IChoID4+PiAoMzIgLSBzKSk7XG4vLyBMZWZ0IHJvdGF0ZSBmb3IgU2hpZnQgaW4gKDMyLCA2NCksIE5PVEU6IDMyIGlzIHNwZWNpYWwgY2FzZS5cbmNvbnN0IHJvdGxCSCA9IChoLCBsLCBzKSA9PiAobCA8PCAocyAtIDMyKSkgfCAoaCA+Pj4gKDY0IC0gcykpO1xuY29uc3Qgcm90bEJMID0gKGgsIGwsIHMpID0+IChoIDw8IChzIC0gMzIpKSB8IChsID4+PiAoNjQgLSBzKSk7XG4vLyBKUyB1c2VzIDMyLWJpdCBzaWduZWQgaW50ZWdlcnMgZm9yIGJpdHdpc2Ugb3BlcmF0aW9ucyB3aGljaCBtZWFucyB3ZSBjYW5ub3Rcbi8vIHNpbXBsZSB0YWtlIGNhcnJ5IG91dCBvZiBsb3cgYml0IHN1bSBieSBzaGlmdCwgd2UgbmVlZCB0byB1c2UgZGl2aXNpb24uXG5mdW5jdGlvbiBhZGQoQWgsIEFsLCBCaCwgQmwpIHtcbiAgICBjb25zdCBsID0gKEFsID4+PiAwKSArIChCbCA+Pj4gMCk7XG4gICAgcmV0dXJuIHsgaDogKEFoICsgQmggKyAoKGwgLyAyICoqIDMyKSB8IDApKSB8IDAsIGw6IGwgfCAwIH07XG59XG4vLyBBZGRpdGlvbiB3aXRoIG1vcmUgdGhhbiAyIGVsZW1lbnRzXG5jb25zdCBhZGQzTCA9IChBbCwgQmwsIENsKSA9PiAoQWwgPj4+IDApICsgKEJsID4+PiAwKSArIChDbCA+Pj4gMCk7XG5jb25zdCBhZGQzSCA9IChsb3csIEFoLCBCaCwgQ2gpID0+IChBaCArIEJoICsgQ2ggKyAoKGxvdyAvIDIgKiogMzIpIHwgMCkpIHwgMDtcbmNvbnN0IGFkZDRMID0gKEFsLCBCbCwgQ2wsIERsKSA9PiAoQWwgPj4+IDApICsgKEJsID4+PiAwKSArIChDbCA+Pj4gMCkgKyAoRGwgPj4+IDApO1xuY29uc3QgYWRkNEggPSAobG93LCBBaCwgQmgsIENoLCBEaCkgPT4gKE
26774FoICsgQmggKyBDaCArIERoICsgKChsb3cgLyAyICoqIDMyKSB8IDApKSB8IDA7XG5jb25zdCBhZGQ1TCA9IChBbCwgQmwsIENsLCBEbCwgRWwpID0+IChBbCA+Pj4gMCkgKyAoQmwgPj4+IDApICsgKENsID4+PiAwKSArIChEbCA+Pj4gMCkgKyAoRWwgPj4+IDApO1xuY29uc3QgYWRkNUggPSAobG93LCBBaCwgQmgsIENoLCBEaCwgRWgpID0+IChBaCArIEJoICsgQ2ggKyBEaCArIEVoICsgKChsb3cgLyAyICoqIDMyKSB8IDApKSB8IDA7XG4vLyBwcmV0dGllci1pZ25vcmVcbmV4cG9ydCB7IGZyb21CaWcsIHNwbGl0LCB0b0JpZywgc2hyU0gsIHNoclNMLCByb3RyU0gsIHJvdHJTTCwgcm90ckJILCByb3RyQkwsIHJvdHIzMkgsIHJvdHIzMkwsIHJvdGxTSCwgcm90bFNMLCByb3RsQkgsIHJvdGxCTCwgYWRkLCBhZGQzTCwgYWRkM0gsIGFkZDRMLCBhZGQ0SCwgYWRkNUgsIGFkZDVMLCB9O1xuLy8gcHJldHRpZXItaWdub3JlXG5jb25zdCB1NjQgPSB7XG4gICAgZnJvbUJpZywgc3BsaXQsIHRvQmlnLFxuICAgIHNoclNILCBzaHJTTCxcbiAgICByb3RyU0gsIHJvdHJTTCwgcm90ckJILCByb3RyQkwsXG4gICAgcm90cjMySCwgcm90cjMyTCxcbiAgICByb3RsU0gsIHJvdGxTTCwgcm90bEJILCByb3RsQkwsXG4gICAgYWRkLCBhZGQzTCwgYWRkM0gsIGFkZDRMLCBhZGQ0SCwgYWRkNUgsIGFkZDVMLFxufTtcbmV4cG9ydCBkZWZhdWx0IHU2NDtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPV91NjQuanMubWFwIiwiaW1wb3J0IHsgU0hBMiB9IGZyb20gJy4vX3NoYTIuanMnO1xuaW1wb3J0IHU2NCBmcm9tICcuL191NjQuanMnO1xuaW1wb3J0IHsgd3JhcENvbnN0cnVjdG9yIH0gZnJvbSAnLi91dGlscy5qcyc7XG4vLyBSb3VuZCBjb250YW50cyAoZmlyc3QgMzIgYml0cyBvZiB0aGUgZnJhY3Rpb25hbCBwYXJ0cyBvZiB0aGUgY3ViZSByb290cyBvZiB0aGUgZmlyc3QgODAgcHJpbWVzIDIuLjQwOSk6XG4vLyBwcmV0dGllci1pZ25vcmVcbmNvbnN0IFtTSEE1MTJfS2gsIFNIQTUxMl9LbF0gPSAvKiBAX19QVVJFX18gKi8gKCgpID0+IHU2NC5zcGxpdChbXG4gICAgJzB4NDI4YTJmOThkNzI4YWUyMicsICcweDcxMzc0NDkxMjNlZjY1Y2QnLCAnMHhiNWMwZmJjZmVjNGQzYjJmJywgJzB4ZTliNWRiYTU4MTg5ZGJiYycsXG4gICAgJzB4Mzk1NmMyNWJmMzQ4YjUzOCcsICcweDU5ZjExMWYxYjYwNWQwMTknLCAnMHg5MjNmODJhNGFmMTk0ZjliJywgJzB4YWIxYzVlZDVkYTZkODExOCcsXG4gICAgJzB4ZDgwN2FhOThhMzAzMDI0MicsICcweDEyODM1YjAxNDU3MDZmYmUnLCAnMHgyNDMxODViZTRlZTRiMjhjJywgJzB4NTUwYzdkYzNkNWZmYjRlMicsXG4gICAgJzB4NzJiZTVkNzRmMjdiODk2ZicsICcweDgwZGViMWZlM2IxNjk2YjEnLCAnMHg5YmRjMDZhNzI1YzcxMjM1JywgJzB4YzE5YmYxNzRjZjY5MjY5NCcsXG4gICAgJzB4ZTQ5YjY5YzE5ZWYxNGFkMicsICcweGVmYmU0Nzg2Mzg0ZjI1ZTMnLCAnMHgwZmMxOWRjNjhiOGNkNWI1JywgJzB4MjQwY2ExY2M3N2FjOWM2NScsXG4gICAgJzB4MmRlOTJjNmY1OTJiMDI3NScsICcweDRhNzQ4NGFhNmVhNmU0ODMnLCAnMHg1Y2IwYTlkY2JkNDFmYmQ0JywgJzB4NzZmOTg4ZGE4MzExNTNiNScsXG4gICAgJzB4OTgzZTUxNTJlZTY2ZGZhYicsICcweGE4MzFjNjZkMmRiNDMyMTAnLCAnMHhiMDAzMjdjODk4ZmIyMTNmJywgJzB4YmY1OTdmYzdiZWVmMGVlNCcsXG4gICAgJzB4YzZlMDBiZjMzZGE4OGZjMicsICcweGQ1YTc5MTQ3OTMwYWE3MjUnLCAnMHgwNmNhNjM1MWUwMDM4MjZmJywgJzB4MTQyOTI5NjcwYTBlNmU3MCcsXG4gICAgJzB4MjdiNzBhODU0NmQyMmZmYycsICcweDJlMWIyMTM4NWMyNmM5MjYnLCAnMHg0ZDJjNmRmYzVhYzQyYWVkJywgJzB4NTMzODBkMTM5ZDk1YjNkZicsXG4gICAgJzB4NjUwYTczNTQ4YmFmNjNkZScsICcweDc2NmEwYWJiM2M3N2IyYTgnLCAnMHg4MWMyYzkyZTQ3ZWRhZWU2JywgJzB4OTI3MjJjODUxNDgyMzUzYicsXG4gICAgJzB4YTJiZmU4YTE0Y2YxMDM2NCcsICcweGE4MWE2NjRiYmM0MjMwMDEnLCAnMHhjMjRiOGI3MGQwZjg5NzkxJywgJzB4Yzc2YzUxYTMwNjU0YmUzMCcsXG4gICAgJzB4ZDE5MmU4MTlkNmVmNTIxOCcsICcweGQ2OTkwNjI0NTU2NWE5MTAnLCAnMHhmNDBlMzU4NTU3NzEyMDJhJywgJzB4MTA2YWEwNzAzMmJiZDFiOCcsXG4gICAgJzB4MTlhNGMxMTZiOGQyZDBjOCcsICcweDFlMzc2YzA4NTE0MWFiNTMnLCAnMHgyNzQ4Nzc0Y2RmOGVlYjk5JywgJzB4MzRiMGJjYjVlMTliNDhhOCcsXG4gICAgJzB4MzkxYzBjYjNjNWM5NWE2MycsICcweDRlZDhhYTRhZTM0MThhY2InLCAnMHg1YjljY2E0Zjc3NjNlMzczJywgJzB4NjgyZTZmZjNkNmIyYjhhMycsXG4gICAgJzB4NzQ4ZjgyZWU1ZGVmYjJmYycsICcweDc4YTU2MzZmNDMxNzJmNjAnLCAnMHg4NGM4NzgxNGExZjBhYjcyJywgJzB4OGNjNzAyMDgxYTY0MzllYycsXG4gICAgJzB4OTBiZWZmZmEyMzYzMWUyOCcsICcweGE0NTA2Y2ViZGU4MmJkZTknLCAnMHhiZWY5YTNmN2IyYzY3OTE1JywgJzB4YzY3MTc4ZjJlMzcyNTMyYicsXG4gICAgJzB4Y2EyNzNlY2VlYTI2NjE5YycsICcweGQxODZiOGM3MjFjMGMyMDcnLCAnMHhlYWRhN2RkNmNkZTBlYjFlJywgJzB4ZjU3ZDRmN2ZlZTZlZDE3OCcsXG4gICAgJzB4MDZmMDY3YWE3MjE3NmZiYScsICcweDBhNjM3ZGM1YTJjODk4YTYnLCAnMHgxMTNmOTgwNGJlZjkwZGFlJywgJzB4MWI3MTBiMzUxMzFjNDcxYicsXG4gICAgJzB4MjhkYjc3ZjUyMzA0N2Q4NCcsICcweDMyY2FhYjdiNDBjNzI0OTMnLCAnMHgzYzllYmUwYTE1YzliZWJjJywgJzB4NDMxZDY3YzQ5YzEwMGQ0YycsXG4gICAgJzB4NGNjNWQ0YmVjYjNlNDJiNicsICcweDU5N2YyOTljZmM2NTdlMmEnLCAnMHg1ZmNiNmZhYjNhZDZmYWVjJywgJzB4NmM0NDE5OGM0YTQ3NTgxNydcbl0ubWFwKG4gPT4gQmlnSW50KG4pKSkpKCk7XG4vLyBUZW1wb3JhcnkgYnVmZmVyLCBub3QgdXNlZCB0byBzdG9yZSBhbnl0aGluZyBiZXR3ZWVuIHJ1bnNcbmNvbnN0IFNIQTUxMl9XX0ggPSAvKiBAX19QVVJFX18gKi8gbmV3IFVpbnQzMkFycmF5KDgwKTtcbmNvbnN0IFNIQTUxMl9XX0wgPSAvKiBAX19QVVJFX18gKi8gbmV3IFVpbnQzMkFycmF
267745KDgwKTtcbmV4cG9ydCBjbGFzcyBTSEE1MTIgZXh0ZW5kcyBTSEEyIHtcbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgc3VwZXIoMTI4LCA2NCwgMTYsIGZhbHNlKTtcbiAgICAgICAgLy8gV2UgY2Fubm90IHVzZSBhcnJheSBoZXJlIHNpbmNlIGFycmF5IGFsbG93cyBpbmRleGluZyBieSB2YXJpYWJsZSB3aGljaCBtZWFucyBvcHRpbWl6ZXIvY29tcGlsZXIgY2Fubm90IHVzZSByZWdpc3RlcnMuXG4gICAgICAgIC8vIEFsc28gbG9va3MgY2xlYW5lciBhbmQgZWFzaWVyIHRvIHZlcmlmeSB3aXRoIHNwZWMuXG4gICAgICAgIC8vIEluaXRpYWwgc3RhdGUgKGZpcnN0IDMyIGJpdHMgb2YgdGhlIGZyYWN0aW9uYWwgcGFydHMgb2YgdGhlIHNxdWFyZSByb290cyBvZiB0aGUgZmlyc3QgOCBwcmltZXMgMi4uMTkpOlxuICAgICAgICAvLyBoIC0tIGhpZ2ggMzIgYml0cywgbCAtLSBsb3cgMzIgYml0c1xuICAgICAgICB0aGlzLkFoID0gMHg2YTA5ZTY2NyB8IDA7XG4gICAgICAgIHRoaXMuQWwgPSAweGYzYmNjOTA4IHwgMDtcbiAgICAgICAgdGhpcy5CaCA9IDB4YmI2N2FlODUgfCAwO1xuICAgICAgICB0aGlzLkJsID0gMHg4NGNhYTczYiB8IDA7XG4gICAgICAgIHRoaXMuQ2ggPSAweDNjNmVmMzcyIHwgMDtcbiAgICAgICAgdGhpcy5DbCA9IDB4ZmU5NGY4MmIgfCAwO1xuICAgICAgICB0aGlzLkRoID0gMHhhNTRmZjUzYSB8IDA7XG4gICAgICAgIHRoaXMuRGwgPSAweDVmMWQzNmYxIHwgMDtcbiAgICAgICAgdGhpcy5FaCA9IDB4NTEwZTUyN2YgfCAwO1xuICAgICAgICB0aGlzLkVsID0gMHhhZGU2ODJkMSB8IDA7XG4gICAgICAgIHRoaXMuRmggPSAweDliMDU2ODhjIHwgMDtcbiAgICAgICAgdGhpcy5GbCA9IDB4MmIzZTZjMWYgfCAwO1xuICAgICAgICB0aGlzLkdoID0gMHgxZjgzZDlhYiB8IDA7XG4gICAgICAgIHRoaXMuR2wgPSAweGZiNDFiZDZiIHwgMDtcbiAgICAgICAgdGhpcy5IaCA9IDB4NWJlMGNkMTkgfCAwO1xuICAgICAgICB0aGlzLkhsID0gMHgxMzdlMjE3OSB8IDA7XG4gICAgfVxuICAgIC8vIHByZXR0aWVyLWlnbm9yZVxuICAgIGdldCgpIHtcbiAgICAgICAgY29uc3QgeyBBaCwgQWwsIEJoLCBCbCwgQ2gsIENsLCBEaCwgRGwsIEVoLCBFbCwgRmgsIEZsLCBHaCwgR2wsIEhoLCBIbCB9ID0gdGhpcztcbiAgICAgICAgcmV0dXJuIFtBaCwgQWwsIEJoLCBCbCwgQ2gsIENsLCBEaCwgRGwsIEVoLCBFbCwgRmgsIEZsLCBHaCwgR2wsIEhoLCBIbF07XG4gICAgfVxuICAgIC8vIHByZXR0aWVyLWlnbm9yZVxuICAgIHNldChBaCwgQWwsIEJoLCBCbCwgQ2gsIENsLCBEaCwgRGwsIEVoLCBFbCwgRmgsIEZsLCBHaCwgR2wsIEhoLCBIbCkge1xuICAgICAgICB0aGlzLkFoID0gQWggfCAwO1xuICAgICAgICB0aGlzLkFsID0gQWwgfCAwO1xuICAgICAgICB0aGlzLkJoID0gQmggfCAwO1xuICAgICAgICB0aGlzLkJsID0gQmwgfCAwO1xuICAgICAgICB0aGlzLkNoID0gQ2ggfCAwO1xuICAgICAgICB0aGlzLkNsID0gQ2wgfCAwO1xuICAgICAgICB0aGlzLkRoID0gRGggfCAwO1xuICAgICAgICB0aGlzLkRsID0gRGwgfCAwO1xuICAgICAgICB0aGlzLkVoID0gRWggfCAwO1xuICAgICAgICB0aGlzLkVsID0gRWwgfCAwO1xuICAgICAgICB0aGlzLkZoID0gRmggfCAwO1xuICAgICAgICB0aGlzLkZsID0gRmwgfCAwO1xuICAgICAgICB0aGlzLkdoID0gR2ggfCAwO1xuICAgICAgICB0aGlzLkdsID0gR2wgfCAwO1xuICAgICAgICB0aGlzLkhoID0gSGggfCAwO1xuICAgICAgICB0aGlzLkhsID0gSGwgfCAwO1xuICAgIH1cbiAgICBwcm9jZXNzKHZpZXcsIG9mZnNldCkge1xuICAgICAgICAvLyBFeHRlbmQgdGhlIGZpcnN0IDE2IHdvcmRzIGludG8gdGhlIHJlbWFpbmluZyA2NCB3b3JkcyB3WzE2Li43OV0gb2YgdGhlIG1lc3NhZ2Ugc2NoZWR1bGUgYXJyYXlcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCAxNjsgaSsrLCBvZmZzZXQgKz0gNCkge1xuICAgICAgICAgICAgU0hBNTEyX1dfSFtpXSA9IHZpZXcuZ2V0VWludDMyKG9mZnNldCk7XG4gICAgICAgICAgICBTSEE1MTJfV19MW2ldID0gdmlldy5nZXRVaW50MzIoKG9mZnNldCArPSA0KSk7XG4gICAgICAgIH1cbiAgICAgICAgZm9yIChsZXQgaSA9IDE2OyBpIDwgODA7IGkrKykge1xuICAgICAgICAgICAgLy8gczAgOj0gKHdbaS0xNV0gcmlnaHRyb3RhdGUgMSkgeG9yICh3W2ktMTVdIHJpZ2h0cm90YXRlIDgpIHhvciAod1tpLTE1XSByaWdodHNoaWZ0IDcpXG4gICAgICAgICAgICBjb25zdCBXMTVoID0gU0hBNTEyX1dfSFtpIC0gMTVdIHwgMDtcbiAgICAgICAgICAgIGNvbnN0IFcxNWwgPSBTSEE1MTJfV19MW2kgLSAxNV0gfCAwO1xuICAgICAgICAgICAgY29uc3QgczBoID0gdTY0LnJvdHJTSChXMTVoLCBXMTVsLCAxKSBeIHU2NC5yb3RyU0goVzE1aCwgVzE1bCwgOCkgXiB1NjQuc2hyU0goVzE1aCwgVzE1bCwgNyk7XG4gICAgICAgICAgICBjb25zdCBzMGwgPSB1NjQucm90clNMKFcxNWgsIFcxNWwsIDEpIF4gdTY0LnJvdHJTTChXMTVoLCBXMTVsLCA4KSBeIHU2NC5zaHJTTChXMTVoLCBXMTVsLCA3KTtcbiAgICAgICAgICAgIC8vIHMxIDo9ICh3W2ktMl0gcmlnaHRyb3RhdGUgMTkpIHhvciAod1tpLTJdIHJpZ2h0cm90YXRlIDYxKSB4b3IgKHdbaS0yXSByaWdodHNoaWZ0IDYpXG4gICAgICAgICAgICBjb25zdCBXMmggPSBTSEE1MTJfV19IW2kgLSAyXSB8IDA7XG4gICAgICAgICAgICBjb25zdCBXMmwgPSBTSEE1MTJfV19MW2kgLSAyXSB8IDA7XG4gICAgICAgICAgICBjb25zdCBzMWggPSB1NjQucm90clNIKFcyaCwgVzJsLCAxOSkgXiB1NjQucm90ckJIKFcyaCwgVzJsLCA2MSkgXiB1NjQuc2hyU0goVzJoLCBXMmwsIDYpO1xuICAgICAgICAgICAgY29uc3QgczFsID0gdTY0LnJvdHJTTChXMmgsIFcybCwgMTkpIF4gdTY0LnJvdHJCTChXMmgsIFcybCwgNjEpIF4gdTY0LnNoclNMKFcyaCwgVzJsLCA2KTtcbiAgICAgICAgICAgIC8vIFNIQTI1Nl9XW2ldID0gczAgKyBzMSArIFNIQTI1Nl9XW2kgLSA3XSArIFNIQTI1Nl9XW2kgLSAxNl07XG4gICAgICAgICAgICBjb25zdCBTVU1sID0gdTY0LmFkZDRMKHMwbCwgczFsLCBTSEE1MTJfV19MW2kgLSA3XSwgU0hBNTEyX1dfTFtpIC0gMTZdKTtcbiAgICAgICAgICAgIGNvbnN0IFNVTWggPSB1NjQuYWRkNEgoU1VNbCwgczBoLCBzMWgsIFNIQTUxMl9XX0hbaSAtIDddLCBTSEE1MTJfV19IW2kgLSAxNl0pO1xuICAgICAgICAgICAgU0hBNTEyX1dfSFtpXSA9IFNVTWggfCAwO1xuICAgICAgICAgICAgU0hBNTEyX1dfTFtpXSA9IFNVTWwgfCAwO1xuICAgICAgICB9XG4gICAgICAgIGxldCB7IEFoLCBBbCwgQmgsIEJsLCBDaCwgQ2wsIERoLCBEbCwgRWgsIEVsLCBGaCwgRmwsIEdoLCBHbCwgSGgsIEhsIH0gPSB0aGlzO1xuICAgICAgICAvLyBDb21wcmVzc2lvbiBmdW5jdGlvbiBtYWluIGxvb3AsIDgwIHJvdW5kc1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IDgwOyBpKyspIHtcbiAgICAgICAgICAgIC8vIFMxIDo9IChlIHJpZ2h0cm90YXRlIDE0KSB4b3IgKGUgcmlnaHRyb3RhdGUgMTgpIHhvciAoZSByaWdodHJvdGF0ZSA0MSlcbiAgICAgICAgICAgIGNvbnN0IHNpZ21hMWggPSB1NjQucm90clNIKEVoLCBFbCwgMTQpIF4gdTY0LnJvdHJTSChFaCwgRWwsIDE4KSBeIHU2NC5yb3RyQkgoRWgsIEVsLCA0MSk7XG4gICAgICAgICAgICBjb25zdCBzaWdtYTFsID0gdTY0LnJvdHJTTChFaCwgRWwsIDE0KSBeIHU2NC5yb3RyU0woRWgsIEVsLCAxOCkgXiB1NjQucm90ckJMKEVoLCBFbCwgNDEpO1xuICAgICAgICAgICAgLy9jb25zdCBUMSA9IChIICsgc2lnbWExICsgQ2hpKEUsIEYsIEcpICsgU0hBMjU2X0tbaV0gKyBTSEEyNTZfV1tpXSkgfCAwO1xuICAgICAgICAgICAgY29uc3QgQ0hJaCA9IChFaCAmIEZoKSBeICh+RWggJiBHaCk7XG4gICAgICAgICAgICBjb25zdCBDSElsID0gKEVsICYgRmwpIF4gKH5FbCAmIEdsKTtcbiAgICAgICAgICAgIC8vIFQ
26774xID0gSCArIHNpZ21hMSArIENoaShFLCBGLCBHKSArIFNIQTUxMl9LW2ldICsgU0hBNTEyX1dbaV1cbiAgICAgICAgICAgIC8vIHByZXR0aWVyLWlnbm9yZVxuICAgICAgICAgICAgY29uc3QgVDFsbCA9IHU2NC5hZGQ1TChIbCwgc2lnbWExbCwgQ0hJbCwgU0hBNTEyX0tsW2ldLCBTSEE1MTJfV19MW2ldKTtcbiAgICAgICAgICAgIGNvbnN0IFQxaCA9IHU2NC5hZGQ1SChUMWxsLCBIaCwgc2lnbWExaCwgQ0hJaCwgU0hBNTEyX0toW2ldLCBTSEE1MTJfV19IW2ldKTtcbiAgICAgICAgICAgIGNvbnN0IFQxbCA9IFQxbGwgfCAwO1xuICAgICAgICAgICAgLy8gUzAgOj0gKGEgcmlnaHRyb3RhdGUgMjgpIHhvciAoYSByaWdodHJvdGF0ZSAzNCkgeG9yIChhIHJpZ2h0cm90YXRlIDM5KVxuICAgICAgICAgICAgY29uc3Qgc2lnbWEwaCA9IHU2NC5yb3RyU0goQWgsIEFsLCAyOCkgXiB1NjQucm90ckJIKEFoLCBBbCwgMzQpIF4gdTY0LnJvdHJCSChBaCwgQWwsIDM5KTtcbiAgICAgICAgICAgIGNvbnN0IHNpZ21hMGwgPSB1NjQucm90clNMKEFoLCBBbCwgMjgpIF4gdTY0LnJvdHJCTChBaCwgQWwsIDM0KSBeIHU2NC5yb3RyQkwoQWgsIEFsLCAzOSk7XG4gICAgICAgICAgICBjb25zdCBNQUpoID0gKEFoICYgQmgpIF4gKEFoICYgQ2gpIF4gKEJoICYgQ2gpO1xuICAgICAgICAgICAgY29uc3QgTUFKbCA9IChBbCAmIEJsKSBeIChBbCAmIENsKSBeIChCbCAmIENsKTtcbiAgICAgICAgICAgIEhoID0gR2ggfCAwO1xuICAgICAgICAgICAgSGwgPSBHbCB8IDA7XG4gICAgICAgICAgICBHaCA9IEZoIHwgMDtcbiAgICAgICAgICAgIEdsID0gRmwgfCAwO1xuICAgICAgICAgICAgRmggPSBFaCB8IDA7XG4gICAgICAgICAgICBGbCA9IEVsIHwgMDtcbiAgICAgICAgICAgICh7IGg6IEVoLCBsOiBFbCB9ID0gdTY0LmFkZChEaCB8IDAsIERsIHwgMCwgVDFoIHwgMCwgVDFsIHwgMCkpO1xuICAgICAgICAgICAgRGggPSBDaCB8IDA7XG4gICAgICAgICAgICBEbCA9IENsIHwgMDtcbiAgICAgICAgICAgIENoID0gQmggfCAwO1xuICAgICAgICAgICAgQ2wgPSBCbCB8IDA7XG4gICAgICAgICAgICBCaCA9IEFoIHwgMDtcbiAgICAgICAgICAgIEJsID0gQWwgfCAwO1xuICAgICAgICAgICAgY29uc3QgQWxsID0gdTY0LmFkZDNMKFQxbCwgc2lnbWEwbCwgTUFKbCk7XG4gICAgICAgICAgICBBaCA9IHU2NC5hZGQzSChBbGwsIFQxaCwgc2lnbWEwaCwgTUFKaCk7XG4gICAgICAgICAgICBBbCA9IEFsbCB8IDA7XG4gICAgICAgIH1cbiAgICAgICAgLy8gQWRkIHRoZSBjb21wcmVzc2VkIGNodW5rIHRvIHRoZSBjdXJyZW50IGhhc2ggdmFsdWVcbiAgICAgICAgKHsgaDogQWgsIGw6IEFsIH0gPSB1NjQuYWRkKHRoaXMuQWggfCAwLCB0aGlzLkFsIHwgMCwgQWggfCAwLCBBbCB8IDApKTtcbiAgICAgICAgKHsgaDogQmgsIGw6IEJsIH0gPSB1NjQuYWRkKHRoaXMuQmggfCAwLCB0aGlzLkJsIHwgMCwgQmggfCAwLCBCbCB8IDApKTtcbiAgICAgICAgKHsgaDogQ2gsIGw6IENsIH0gPSB1NjQuYWRkKHRoaXMuQ2ggfCAwLCB0aGlzLkNsIHwgMCwgQ2ggfCAwLCBDbCB8IDApKTtcbiAgICAgICAgKHsgaDogRGgsIGw6IERsIH0gPSB1NjQuYWRkKHRoaXMuRGggfCAwLCB0aGlzLkRsIHwgMCwgRGggfCAwLCBEbCB8IDApKTtcbiAgICAgICAgKHsgaDogRWgsIGw6IEVsIH0gPSB1NjQuYWRkKHRoaXMuRWggfCAwLCB0aGlzLkVsIHwgMCwgRWggfCAwLCBFbCB8IDApKTtcbiAgICAgICAgKHsgaDogRmgsIGw6IEZsIH0gPSB1NjQuYWRkKHRoaXMuRmggfCAwLCB0aGlzLkZsIHwgMCwgRmggfCAwLCBGbCB8IDApKTtcbiAgICAgICAgKHsgaDogR2gsIGw6IEdsIH0gPSB1NjQuYWRkKHRoaXMuR2ggfCAwLCB0aGlzLkdsIHwgMCwgR2ggfCAwLCBHbCB8IDApKTtcbiAgICAgICAgKHsgaDogSGgsIGw6IEhsIH0gPSB1NjQuYWRkKHRoaXMuSGggfCAwLCB0aGlzLkhsIHwgMCwgSGggfCAwLCBIbCB8IDApKTtcbiAgICAgICAgdGhpcy5zZXQoQWgsIEFsLCBCaCwgQmwsIENoLCBDbCwgRGgsIERsLCBFaCwgRWwsIEZoLCBGbCwgR2gsIEdsLCBIaCwgSGwpO1xuICAgIH1cbiAgICByb3VuZENsZWFuKCkge1xuICAgICAgICBTSEE1MTJfV19ILmZpbGwoMCk7XG4gICAgICAgIFNIQTUxMl9XX0wuZmlsbCgwKTtcbiAgICB9XG4gICAgZGVzdHJveSgpIHtcbiAgICAgICAgdGhpcy5idWZmZXIuZmlsbCgwKTtcbiAgICAgICAgdGhpcy5zZXQoMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCk7XG4gICAgfVxufVxuY2xhc3MgU0hBNTEyXzIyNCBleHRlbmRzIFNIQTUxMiB7XG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHN1cGVyKCk7XG4gICAgICAgIC8vIGggLS0gaGlnaCAzMiBiaXRzLCBsIC0tIGxvdyAzMiBiaXRzXG4gICAgICAgIHRoaXMuQWggPSAweDhjM2QzN2M4IHwgMDtcbiAgICAgICAgdGhpcy5BbCA9IDB4MTk1NDRkYTIgfCAwO1xuICAgICAgICB0aGlzLkJoID0gMHg3M2UxOTk2NiB8IDA7XG4gICAgICAgIHRoaXMuQmwgPSAweDg5ZGNkNGQ2IHwgMDtcbiAgICAgICAgdGhpcy5DaCA9IDB4MWRmYWI3YWUgfCAwO1xuICAgICAgICB0aGlzLkNsID0gMHgzMmZmOWM4MiB8IDA7XG4gICAgICAgIHRoaXMuRGggPSAweDY3OWRkNTE0IHwgMDtcbiAgICAgICAgdGhpcy5EbCA9IDB4NTgyZjlmY2YgfCAwO1xuICAgICAgICB0aGlzLkVoID0gMHgwZjZkMmI2OSB8IDA7XG4gICAgICAgIHRoaXMuRWwgPSAweDdiZDQ0ZGE4IHwgMDtcbiAgICAgICAgdGhpcy5GaCA9IDB4NzdlMzZmNzMgfCAwO1xuICAgICAgICB0aGlzLkZsID0gMHgwNGM0ODk0MiB8IDA7XG4gICAgICAgIHRoaXMuR2ggPSAweDNmOWQ4NWE4IHwgMDtcbiAgICAgICAgdGhpcy5HbCA9IDB4NmExZDM2YzggfCAwO1xuICAgICAgICB0aGlzLkhoID0gMHgxMTEyZTZhZCB8IDA7XG4gICAgICAgIHRoaXMuSGwgPSAweDkxZDY5MmExIHwgMDtcbiAgICAgICAgdGhpcy5vdXRwdXRMZW4gPSAyODtcbiAgICB9XG59XG5jbGFzcyBTSEE1MTJfMjU2IGV4dGVuZHMgU0hBNTEyIHtcbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgc3VwZXIoKTtcbiAgICAgICAgLy8gaCAtLSBoaWdoIDMyIGJpdHMsIGwgLS0gbG93IDMyIGJpdHNcbiAgICAgICAgdGhpcy5BaCA9IDB4MjIzMTIxOTQgfCAwO1xuICAgICAgICB0aGlzLkFsID0gMHhmYzJiZjcyYyB8IDA7XG4gICAgICAgI
26774HRoaXMuQmggPSAweDlmNTU1ZmEzIHwgMDtcbiAgICAgICAgdGhpcy5CbCA9IDB4Yzg0YzY0YzIgfCAwO1xuICAgICAgICB0aGlzLkNoID0gMHgyMzkzYjg2YiB8IDA7XG4gICAgICAgIHRoaXMuQ2wgPSAweDZmNTNiMTUxIHwgMDtcbiAgICAgICAgdGhpcy5EaCA9IDB4OTYzODc3MTkgfCAwO1xuICAgICAgICB0aGlzLkRsID0gMHg1OTQwZWFiZCB8IDA7XG4gICAgICAgIHRoaXMuRWggPSAweDk2MjgzZWUyIHwgMDtcbiAgICAgICAgdGhpcy5FbCA9IDB4YTg4ZWZmZTMgfCAwO1xuICAgICAgICB0aGlzLkZoID0gMHhiZTVlMWUyNSB8IDA7XG4gICAgICAgIHRoaXMuRmwgPSAweDUzODYzOTkyIHwgMDtcbiAgICAgICAgdGhpcy5HaCA9IDB4MmIwMTk5ZmMgfCAwO1xuICAgICAgICB0aGlzLkdsID0gMHgyYzg1YjhhYSB8IDA7XG4gICAgICAgIHRoaXMuSGggPSAweDBlYjcyZGRjIHwgMDtcbiAgICAgICAgdGhpcy5IbCA9IDB4ODFjNTJjYTIgfCAwO1xuICAgICAgICB0aGlzLm91dHB1dExlbiA9IDMyO1xuICAgIH1cbn1cbmNsYXNzIFNIQTM4NCBleHRlbmRzIFNIQTUxMiB7XG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHN1cGVyKCk7XG4gICAgICAgIC8vIGggLS0gaGlnaCAzMiBiaXRzLCBsIC0tIGxvdyAzMiBiaXRzXG4gICAgICAgIHRoaXMuQWggPSAweGNiYmI5ZDVkIHwgMDtcbiAgICAgICAgdGhpcy5BbCA9IDB4YzEwNTllZDggfCAwO1xuICAgICAgICB0aGlzLkJoID0gMHg2MjlhMjkyYSB8IDA7XG4gICAgICAgIHRoaXMuQmwgPSAweDM2N2NkNTA3IHwgMDtcbiAgICAgICAgdGhpcy5DaCA9IDB4OTE1OTAxNWEgfCAwO1xuICAgICAgICB0aGlzLkNsID0gMHgzMDcwZGQxNyB8IDA7XG4gICAgICAgIHRoaXMuRGggPSAweDE1MmZlY2Q4IHwgMDtcbiAgICAgICAgdGhpcy5EbCA9IDB4ZjcwZTU5MzkgfCAwO1xuICAgICAgICB0aGlzLkVoID0gMHg2NzMzMjY2NyB8IDA7XG4gICAgICAgIHRoaXMuRWwgPSAweGZmYzAwYjMxIHwgMDtcbiAgICAgICAgdGhpcy5GaCA9IDB4OGViNDRhODcgfCAwO1xuICAgICAgICB0aGlzLkZsID0gMHg2ODU4MTUxMSB8IDA7XG4gICAgICAgIHRoaXMuR2ggPSAweGRiMGMyZTBkIHwgMDtcbiAgICAgICAgdGhpcy5HbCA9IDB4NjRmOThmYTcgfCAwO1xuICAgICAgICB0aGlzLkhoID0gMHg0N2I1NDgxZCB8IDA7XG4gICAgICAgIHRoaXMuSGwgPSAweGJlZmE0ZmE0IHwgMDtcbiAgICAgICAgdGhpcy5vdXRwdXRMZW4gPSA0ODtcbiAgICB9XG59XG5leHBvcnQgY29uc3Qgc2hhNTEyID0gLyogQF9fUFVSRV9fICovIHdyYXBDb25zdHJ1Y3RvcigoKSA9PiBuZXcgU0hBNTEyKCkpO1xuZXhwb3J0IGNvbnN0IHNoYTUxMl8yMjQgPSAvKiBAX19QVVJFX18gKi8gd3JhcENvbnN0cnVjdG9yKCgpID0+IG5ldyBTSEE1MTJfMjI0KCkpO1xuZXhwb3J0IGNvbnN0IHNoYTUxMl8yNTYgPSAvKiBAX19QVVJFX18gKi8gd3JhcENvbnN0cnVjdG9yKCgpID0+IG5ldyBTSEE1MTJfMjU2KCkpO1xuZXhwb3J0IGNvbnN0IHNoYTM4NCA9IC8qIEBfX1BVUkVfXyAqLyB3cmFwQ29uc3RydWN0b3IoKCkgPT4gbmV3IFNIQTM4NCgpKTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXNoYTUxMi5qcy5tYXAiLCIvKiBCcm93c2VyIENyeXB0byBTaGltcyAqL1xuaW1wb3J0IHsgaG1hYyB9IGZyb20gXCJAbm9ibGUvaGFzaGVzL2htYWNcIjtcbmltcG9ydCB7IHBia2RmMiB9IGZyb20gXCJAbm9ibGUvaGFzaGVzL3Bia2RmMlwiO1xuaW1wb3J0IHsgc2hhMjU2IH0gZnJvbSBcIkBub2JsZS9oYXNoZXMvc2hhMjU2XCI7XG5pbXBvcnQgeyBzaGE1MTIgfSBmcm9tIFwiQG5vYmxlL2hhc2hlcy9zaGE1MTJcIjtcbmltcG9ydCB7IGFzc2VydCwgYXNzZXJ0QXJndW1lbnQgfSBmcm9tIFwiLi4vdXRpbHMvaW5kZXguanNcIjtcbmZ1bmN0aW9uIGdldEdsb2JhbCgpIHtcbiAgICBpZiAodHlwZW9mIHNlbGYgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgIHJldHVybiBzZWxmO1xuICAgIH1cbiAgICBpZiAodHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgcmV0dXJuIHdpbmRvdztcbiAgICB9XG4gICAgaWYgKHR5cGVvZiBnbG9iYWwgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgIHJldHVybiBnbG9iYWw7XG4gICAgfVxuICAgIHRocm93IG5ldyBFcnJvcigndW5hYmxlIHRvIGxvY2F0ZSBnbG9iYWwgb2JqZWN0Jyk7XG59XG47XG5jb25zdCBhbnlHbG9iYWwgPSBnZXRHbG9iYWwoKTtcbmNvbnN0IGNyeXB0byA9IGFueUdsb2JhbC5jcnlwdG8gfHwgYW55R2xvYmFsLm1zQ3J5cHRvO1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUhhc2goYWxnbykge1xuICAgIHN3aXRjaCAoYWxnbykge1xuICAgICAgICBjYXNlIFwic2hhMjU2XCI6IHJldHVybiBzaGEyNTYuY3JlYXRlKCk7XG4gICAgICAgIGNhc2UgXCJzaGE1MTJcIjogcmV0dXJuIHNoYTUxMi5jcmVhdGUoKTtcbiAgICB9XG4gICAgYXNzZXJ0QXJndW1lbnQoZmFsc2UsIFwiaW52YWxpZCBoYXNoaW5nIGFsZ29yaXRobSBuYW1lXCIsIFwiYWxnb3JpdGhtXCIsIGFsZ28pO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUhtYWMoX2FsZ28sIGtleSkge1xuICAgIGNvbnN0IGFsZ28gPSAoeyBzaGEyNTYsIHNoYTUxMiB9W19hbGdvXSk7XG4gICAgYXNzZXJ0QXJndW1lbnQoYWxnbyAhPSBudWxsLCBcImludmFsaWQgaG1hYyBhbGdvcml0aG1cIiwgXCJhbGdvcml0aG1cIiwgX2FsZ28pO1xuICAgIHJldHVybiBobWFjLmNyZWF0ZShhbGdvLCBrZXkpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIHBia2RmMlN5bmMocGFzc3dvcmQsIHNhbHQsIGl0ZXJhdGlvbnMsIGtleWxlbiwgX2FsZ28pIHtcbiAgICBjb25zdCBhbGdvID0gKHsgc2hhMjU2LCBzaGE1MTIgfVtfYWxnb10pO1xuICAgIGFzc2VydEFyZ3VtZW50KGFsZ28gIT0gbnVsbCwgXCJpbnZhbGlkIHBia2RmMiBhbGdvcml0aG1cIiwgXCJhbGdvcml0aG1cIiwgX2FsZ28pO1xuICAgIHJldHVybiBwYmtkZjIoYWxnbywgcGFzc3dvcmQsIHNhbHQsIHsgYzogaXRlcmF0aW9ucywgZGtMZW46IGtleWxlbiB9KTtcbn1cbmV4cG9ydCBmdW5jdGlvbiByYW5kb21CeXRlcyhsZW5ndGgpIHtcbiAgICBhc3NlcnQoY3J5cHRvICE9IG51bGwsIFwicGxhdGZvcm0gZG9lcyBub3Qgc3VwcG9ydCBzZWN1cmUgcmFuZG9tIG51bWJlcnNcIiwgXCJVTlNVUFBPUlRFRF9PUEVSQVRJT05cIiwge1xuICAgICAgICBvcGVyYXRpb246IFwicmFuZG9tQnl0ZXNcIlxuICAgIH0pO1xuICAgIGFzc2VydEFyZ3VtZW50KE51bWJlci5pc0ludGVnZXIobGVuZ3RoKSAmJiBsZW5ndGggPiAwICYmIGxlbmd0aCA8PSAxMDI0LCBcImludmFsaWQgbGVuZ3RoXCIsIFwibGVuZ3RoXCIsIGxlbmd0aCk7XG4gICAgY29uc3QgcmVzdWx0ID0gbmV3IFVpbnQ4QXJyYXkobGVuZ3RoKTtcbiAgICBjcnlwdG8uZ2V0UmFuZG9tVmFsdWVzKHJlc3VsdCk7XG4gICAgcmV0dXJuIHJlc3VsdDtcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWNyeXB0by1icm93c2VyLmpzLm1hcCIsIi8qKlxuICogIEFuICoqSE1BQyoqIGVuYWJsZXMgdmVyaWZpY2F0aW9uIHRoYXQgYSBnaXZlbiBrZXkgd2FzIHVzZWRcbiAqICB0byBhdXRoZW50aWNhdGUgYSBwYXlsb2FkLlxuICpcbiAqICBTZWU6IFtbbGluay13aWtpLWhtYWNdXVxuICpcbiAqICBAX3N1YnNlY3Rpb246IGFwaS9jcnlwdG86SE1BQyAgW2Fib3V0LWhtYWNdXG4gKi9cbmltcG9ydCB7
26774IGNyZWF0ZUhtYWMgfSBmcm9tIFwiLi9jcnlwdG8uanNcIjtcbmltcG9ydCB7IGdldEJ5dGVzLCBoZXhsaWZ5IH0gZnJvbSBcIi4uL3V0aWxzL2luZGV4LmpzXCI7XG5sZXQgbG9ja2VkID0gZmFsc2U7XG5jb25zdCBfY29tcHV0ZUhtYWMgPSBmdW5jdGlvbiAoYWxnb3JpdGhtLCBrZXksIGRhdGEpIHtcbiAgICByZXR1cm4gY3JlYXRlSG1hYyhhbGdvcml0aG0sIGtleSkudXBkYXRlKGRhdGEpLmRpZ2VzdCgpO1xufTtcbmxldCBfX2NvbXB1dGVIbWFjID0gX2NvbXB1dGVIbWFjO1xuLyoqXG4gKiAgUmV0dXJuIHRoZSBITUFDIGZvciAlJWRhdGElJSB1c2luZyB0aGUgJSVrZXklJSBrZXkgd2l0aCB0aGUgdW5kZXJseWluZ1xuICogICUlYWxnbyUlIHVzZWQgZm9yIGNvbXByZXNzaW9uLlxuICpcbiAqICBAZXhhbXBsZTpcbiAqICAgIGtleSA9IGlkKFwic29tZS1zZWNyZXRcIilcbiAqXG4gKiAgICAvLyBDb21wdXRlIHRoZSBITUFDXG4gKiAgICBjb21wdXRlSG1hYyhcInNoYTI1NlwiLCBrZXksIFwiMHgxMzM3XCIpXG4gKiAgICAvL19yZXN1bHQ6XG4gKlxuICogICAgLy8gVG8gY29tcHV0ZSB0aGUgSE1BQyBvZiBVVEYtOCBkYXRhLCB0aGUgZGF0YSBtdXN0IGJlXG4gKiAgICAvLyBjb252ZXJ0ZWQgdG8gVVRGLTggYnl0ZXNcbiAqICAgIGNvbXB1dGVIbWFjKFwic2hhMjU2XCIsIGtleSwgdG9VdGY4Qnl0ZXMoXCJIZWxsbyBXb3JsZFwiKSlcbiAqICAgIC8vX3Jlc3VsdDpcbiAqXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjb21wdXRlSG1hYyhhbGdvcml0aG0sIF9rZXksIF9kYXRhKSB7XG4gICAgY29uc3Qga2V5ID0gZ2V0Qnl0ZXMoX2tleSwgXCJrZXlcIik7XG4gICAgY29uc3QgZGF0YSA9IGdldEJ5dGVzKF9kYXRhLCBcImRhdGFcIik7XG4gICAgcmV0dXJuIGhleGxpZnkoX19jb21wdXRlSG1hYyhhbGdvcml0aG0sIGtleSwgZGF0YSkpO1xufVxuY29tcHV0ZUhtYWMuXyA9IF9jb21wdXRlSG1hYztcbmNvbXB1dGVIbWFjLmxvY2sgPSBmdW5jdGlvbiAoKSB7IGxvY2tlZCA9IHRydWU7IH07XG5jb21wdXRlSG1hYy5yZWdpc3RlciA9IGZ1bmN0aW9uIChmdW5jKSB7XG4gICAgaWYgKGxvY2tlZCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJjb21wdXRlSG1hYyBpcyBsb2NrZWRcIik7XG4gICAgfVxuICAgIF9fY29tcHV0ZUhtYWMgPSBmdW5jO1xufTtcbk9iamVjdC5mcmVlemUoY29tcHV0ZUhtYWMpO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9aG1hYy5qcy5tYXAiLCJpbXBvcnQgeyBieXRlcywgZXhpc3RzLCBudW1iZXIsIG91dHB1dCB9IGZyb20gJy4vX2Fzc2VydC5qcyc7XG5pbXBvcnQgeyByb3RsQkgsIHJvdGxCTCwgcm90bFNILCByb3RsU0wsIHNwbGl0IH0gZnJvbSAnLi9fdTY0LmpzJztcbmltcG9ydCB7IEhhc2gsIHUzMiwgdG9CeXRlcywgd3JhcENvbnN0cnVjdG9yLCB3cmFwWE9GQ29uc3RydWN0b3JXaXRoT3B0cywgfSBmcm9tICcuL3V0aWxzLmpzJztcbi8vIFNIQTMgKGtlY2NhaykgaXMgYmFzZWQgb24gYSBuZXcgZGVzaWduOiBiYXNpY2FsbHksIHRoZSBpbnRlcm5hbCBzdGF0ZSBpcyBiaWdnZXIgdGhhbiBvdXRwdXQgc2l6ZS5cbi8vIEl0J3MgY2FsbGVkIGEgc3BvbmdlIGZ1bmN0aW9uLlxuLy8gVmFyaW91cyBwZXIgcm91bmQgY29uc3RhbnRzIGNhbGN1bGF0aW9uc1xuY29uc3QgW1NIQTNfUEksIFNIQTNfUk9UTCwgX1NIQTNfSU9UQV0gPSBbW10sIFtdLCBbXV07XG5jb25zdCBfMG4gPSAvKiBAX19QVVJFX18gKi8gQmlnSW50KDApO1xuY29uc3QgXzFuID0gLyogQF9fUFVSRV9fICovIEJpZ0ludCgxKTtcbmNvbnN0IF8ybiA9IC8qIEBfX1BVUkVfXyAqLyBCaWdJbnQoMik7XG5jb25zdCBfN24gPSAvKiBAX19QVVJFX18gKi8gQmlnSW50KDcpO1xuY29uc3QgXzI1Nm4gPSAvKiBAX19QVVJFX18gKi8gQmlnSW50KDI1Nik7XG5jb25zdCBfMHg3MW4gPSAvKiBAX19QVVJFX18gKi8gQmlnSW50KDB4NzEpO1xuZm9yIChsZXQgcm91bmQgPSAwLCBSID0gXzFuLCB4ID0gMSwgeSA9IDA7IHJvdW5kIDwgMjQ7IHJvdW5kKyspIHtcbiAgICAvLyBQaVxuICAgIFt4LCB5XSA9IFt5LCAoMiAqIHggKyAzICogeSkgJSA1XTtcbiAgICBTSEEzX1BJLnB1c2goMiAqICg1ICogeSArIHgpKTtcbiAgICAvLyBSb3RhdGlvbmFsXG4gICAgU0hBM19ST1RMLnB1c2goKCgocm91bmQgKyAxKSAqIChyb3VuZCArIDIpKSAvIDIpICUgNjQpO1xuICAgIC8vIElvdGFcbiAgICBsZXQgdCA9IF8wbjtcbiAgICBmb3IgKGxldCBqID0gMDsgaiA8IDc7IGorKykge1xuICAgICAgICBSID0gKChSIDw8IF8xbikgXiAoKFIgPj4gXzduKSAqIF8weDcxbikpICUgXzI1Nm47XG4gICAgICAgIGlmIChSICYgXzJuKVxuICAgICAgICAgICAgdCBePSBfMW4gPDwgKChfMW4gPDwgLyogQF9fUFVSRV9fICovIEJpZ0ludChqKSkgLSBfMW4pO1xuICAgIH1cbiAgICBfU0hBM19JT1RBLnB1c2godCk7XG59XG5jb25zdCBbU0hBM19JT1RBX0gsIFNIQTNfSU9UQV9MXSA9IC8qIEBfX1BVUkVfXyAqLyBzcGxpdChfU0hBM19JT1RBLCB0cnVlKTtcbi8vIExlZnQgcm90YXRpb24gKHdpdGhvdXQgMCwgMzIsIDY0KVxuY29uc3Qgcm90bEggPSAoaCwgbCwgcykgPT4gKHMgPiAzMiA/IHJvdGxCSChoLCBsLCBzKSA6IHJvdGxTSChoLCBsLCBzKSk7XG5jb25zdCByb3RsTCA9IChoLCBsLCBzKSA9PiAocyA+IDMyID8gcm90bEJMKGgsIGwsIHMpIDogcm90bFNMKGgsIGwsIHMpKTtcbi8vIFNhbWUgYXMga2VjY2FrZjE2MDAsIGJ1dCBhbGxvd3MgdG8gc2tpcCBzb21lIHJvdW5kc1xuZXhwb3J0IGZ1bmN0aW9uIGtlY2Nha1Aocywgcm91bmRzID0gMjQpIHtcbiAgICBjb25zdCBCID0gbmV3IFVpbnQzMkFycmF5KDUgKiAyKTtcbiAgICAvLyBOT1RFOiBhbGwgaW5kaWNlcyBhcmUgeDIgc2luY2Ugd2Ugc3RvcmUgc3RhdGUgYXMgdTMyIGluc3RlYWQgb2YgdTY0IChiaWdpbnRzIHRvIHNsb3cgaW4ganMpXG4gICAgZm9yIChsZXQgcm91bmQgPSAyNCAtIHJvdW5kczsgcm91bmQgPCAyNDsgcm91bmQrKykge1xuICAgICAgICAvLyBUaGV0YSDOuFxuICAgICAgICBmb3IgKGxldCB4ID0gMDsgeCA8IDEwOyB4KyspXG4gICAgICAgICAgICBCW3hdID0gc1t4XSBeIHNbeCArIDEwXSBeIHNbeCArIDIwXSBeIHNbeCArIDMwXSBeIHNbeCArIDQwXTtcbiAgICAgICAgZm9yIChsZXQgeCA9IDA7IHggPCAxMDsgeCArPSAyKSB7XG4gICAgICAgICAgICBjb25zdCBpZHgxID0gKHggKyA4KSAlIDEwO1xuICAgICAgICAgICAgY29uc3QgaWR4MCA9ICh4ICsgMikgJSAxMDtcbiAgICAgICAgICAgIGNvbnN0IEIwID0gQltpZHgwXTtcbiAgICAgICAgICAgIGNvbnN0IEIxID0gQltpZHgwICsgMV07XG4gICAgICAgICAgICBjb25zdCBUaCA9IHJvdGxIKEIwLCBCMSwgMSkgXiBCW2lkeDFdO1xuICAgICAgICAgICAgY29uc3QgVGwgPSByb3RsTChCMCwgQjEsIDEpIF4gQltpZHgxICsgMV07XG4gICAgICAgICAgICBmb3IgKGxldCB5ID0gMDsgeSA8IDUwOyB5ICs9IDEwKSB7XG4gICAgICAgICAgICAgICAgc1t4ICsgeV0gXj0gVGg7XG4gICAgICAgICAgICAgICAgc1t4ICsgeSArIDFdIF49IFRsO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8vIFJobyAoz4EpIGFuZCBQaSAoz4ApXG4gICAgICAgIGxldCBjdXJIID0gc1syXTtcbiAgICAgICAgbGV0IGN1ckwgPSBzWzNdO1xuICAgICAgICBmb3IgKGxldCB0ID0gMDsgdCA8IDI0OyB0KyspIHtcbiAgICAgICAgICAgIGNvbnN0IHNoaWZ0ID0gU0hBM19ST1RMW3RdO1xuICAgICAgICAgICAgY29uc3QgVGggPSByb3RsSChjdXJILCBjdXJMLCBzaGlmdCk7XG4gICAgICAgICAgICBjb25zdCBUbCA9IHJvdGxMKGN1ckgsIGN1ckwsIHNoaWZ0KTtcbiAgICAgICAgICAgIGNvbnN0IFBJID0gU0hBM19QSVt0XTtcbiAgICAgICAgICAgIGN1ckggPSBzW1BJXTtcbiAgICAgICAgICAgIGN1ckwgPSBzW1BJICsgMV07XG4gICAgICAgICAgICBzW1BJXSA9IFRoO1xuICAgICAgICAgICAgc1tQSSArIDFdID0gVGw7XG4gICAgICAgI
26774H1cbiAgICAgICAgLy8gQ2hpICjPhylcbiAgICAgICAgZm9yIChsZXQgeSA9IDA7IHkgPCA1MDsgeSArPSAxMCkge1xuICAgICAgICAgICAgZm9yIChsZXQgeCA9IDA7IHggPCAxMDsgeCsrKVxuICAgICAgICAgICAgICAgIEJbeF0gPSBzW3kgKyB4XTtcbiAgICAgICAgICAgIGZvciAobGV0IHggPSAwOyB4IDwgMTA7IHgrKylcbiAgICAgICAgICAgICAgICBzW3kgKyB4XSBePSB+QlsoeCArIDIpICUgMTBdICYgQlsoeCArIDQpICUgMTBdO1xuICAgICAgICB9XG4gICAgICAgIC8vIElvdGEgKM65KVxuICAgICAgICBzWzBdIF49IFNIQTNfSU9UQV9IW3JvdW5kXTtcbiAgICAgICAgc1sxXSBePSBTSEEzX0lPVEFfTFtyb3VuZF07XG4gICAgfVxuICAgIEIuZmlsbCgwKTtcbn1cbmV4cG9ydCBjbGFzcyBLZWNjYWsgZXh0ZW5kcyBIYXNoIHtcbiAgICAvLyBOT1RFOiB3ZSBhY2NlcHQgYXJndW1lbnRzIGluIGJ5dGVzIGluc3RlYWQgb2YgYml0cyBoZXJlLlxuICAgIGNvbnN0cnVjdG9yKGJsb2NrTGVuLCBzdWZmaXgsIG91dHB1dExlbiwgZW5hYmxlWE9GID0gZmFsc2UsIHJvdW5kcyA9IDI0KSB7XG4gICAgICAgIHN1cGVyKCk7XG4gICAgICAgIHRoaXMuYmxvY2tMZW4gPSBibG9ja0xlbjtcbiAgICAgICAgdGhpcy5zdWZmaXggPSBzdWZmaXg7XG4gICAgICAgIHRoaXMub3V0cHV0TGVuID0gb3V0cHV0TGVuO1xuICAgICAgICB0aGlzLmVuYWJsZVhPRiA9IGVuYWJsZVhPRjtcbiAgICAgICAgdGhpcy5yb3VuZHMgPSByb3VuZHM7XG4gICAgICAgIHRoaXMucG9zID0gMDtcbiAgICAgICAgdGhpcy5wb3NPdXQgPSAwO1xuICAgICAgICB0aGlzLmZpbmlzaGVkID0gZmFsc2U7XG4gICAgICAgIHRoaXMuZGVzdHJveWVkID0gZmFsc2U7XG4gICAgICAgIC8vIENhbiBiZSBwYXNzZWQgZnJvbSB1c2VyIGFzIGRrTGVuXG4gICAgICAgIG51bWJlcihvdXRwdXRMZW4pO1xuICAgICAgICAvLyAxNjAwID0gNXg1IG1hdHJpeCBvZiA2NGJpdC4gIDE2MDAgYml0cyA9PT0gMjAwIGJ5dGVzXG4gICAgICAgIGlmICgwID49IHRoaXMuYmxvY2tMZW4gfHwgdGhpcy5ibG9ja0xlbiA+PSAyMDApXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1NoYTMgc3VwcG9ydHMgb25seSBrZWNjYWstZjE2MDAgZnVuY3Rpb24nKTtcbiAgICAgICAgdGhpcy5zdGF0ZSA9IG5ldyBVaW50OEFycmF5KDIwMCk7XG4gICAgICAgIHRoaXMuc3RhdGUzMiA9IHUzMih0aGlzLnN0YXRlKTtcbiAgICB9XG4gICAga2VjY2FrKCkge1xuICAgICAgICBrZWNjYWtQKHRoaXMuc3RhdGUzMiwgdGhpcy5yb3VuZHMpO1xuICAgICAgICB0aGlzLnBvc091dCA9IDA7XG4gICAgICAgIHRoaXMucG9zID0gMDtcbiAgICB9XG4gICAgdXBkYXRlKGRhdGEpIHtcbiAgICAgICAgZXhpc3RzKHRoaXMpO1xuICAgICAgICBjb25zdCB7IGJsb2NrTGVuLCBzdGF0ZSB9ID0gdGhpcztcbiAgICAgICAgZGF0YSA9IHRvQnl0ZXMoZGF0YSk7XG4gICAgICAgIGNvbnN0IGxlbiA9IGRhdGEubGVuZ3RoO1xuICAgICAgICBmb3IgKGxldCBwb3MgPSAwOyBwb3MgPCBsZW47KSB7XG4gICAgICAgICAgICBjb25zdCB0YWtlID0gTWF0aC5taW4oYmxvY2tMZW4gLSB0aGlzLnBvcywgbGVuIC0gcG9zKTtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGFrZTsgaSsrKVxuICAgICAgICAgICAgICAgIHN0YXRlW3RoaXMucG9zKytdIF49IGRhdGFbcG9zKytdO1xuICAgICAgICAgICAgaWYgKHRoaXMucG9zID09PSBibG9ja0xlbilcbiAgICAgICAgICAgICAgICB0aGlzLmtlY2NhaygpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICBmaW5pc2goKSB7XG4gICAgICAgIGlmICh0aGlzLmZpbmlzaGVkKVxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB0aGlzLmZpbmlzaGVkID0gdHJ1ZTtcbiAgICAgICAgY29uc3QgeyBzdGF0ZSwgc3VmZml4LCBwb3MsIGJsb2NrTGVuIH0gPSB0aGlzO1xuICAgICAgICAvLyBEbyB0aGUgcGFkZGluZ1xuICAgICAgICBzdGF0ZVtwb3NdIF49IHN1ZmZpeDtcbiAgICAgICAgaWYgKChzdWZmaXggJiAweDgwKSAhPT0gMCAmJiBwb3MgPT09IGJsb2NrTGVuIC0gMSlcbiAgICAgICAgICAgIHRoaXMua2VjY2FrKCk7XG4gICAgICAgIHN0YXRlW2Jsb2NrTGVuIC0gMV0gXj0gMHg4MDtcbiAgICAgICAgdGhpcy5rZWNjYWsoKTtcbiAgICB9XG4gICAgd3JpdGVJbnRvKG91dCkge1xuICAgICAgICBleGlzdHModGhpcywgZmFsc2UpO1xuICAgICAgICBieXRlcyhvdXQpO1xuICAgICAgICB0aGlzLmZpbmlzaCgpO1xuICAgICAgICBjb25zdCBidWZmZXJPdXQgPSB0aGlzLnN0YXRlO1xuICAgICAgICBjb25zdCB7IGJsb2NrTGVuIH0gPSB0aGlzO1xuICAgICAgICBmb3IgKGxldCBwb3MgPSAwLCBsZW4gPSBvdXQubGVuZ3RoOyBwb3MgPCBsZW47KSB7XG4gICAgICAgICAgICBpZiAodGhpcy5wb3NPdXQgPj0gYmxvY2tMZW4pXG4gICAgICAgICAgICAgICAgdGhpcy5rZWNjYWsoKTtcbiAgICAgICAgICAgIGNvbnN0IHRha2UgPSBNYXRoLm1pbihibG9ja0xlbiAtIHRoaXMucG9zT3V0LCBsZW4gLSBwb3MpO1xuICAgICAgICAgICAgb3V0LnNldChidWZmZXJPdXQuc3ViYXJyYXkodGhpcy5wb3NPdXQsIHRoaXMucG9zT3V0ICsgdGFrZSksIHBvcyk7XG4gICAgICAgICAgICB0aGlzLnBvc091dCArPSB0YWtlO1xuICAgICAgICAgICAgcG9zICs9IHRha2U7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG91dDtcbiAgICB9XG4gICAgeG9mSW50byhvdXQpIHtcbiAgICAgICAgLy8gU2hhMy9LZWNjYWsgdXNhZ2Ugd2l0aCBYT0YgaXMgcHJvYmFibHkgbWlzdGFrZSwgb25seSBTSEFLRSBpbnN0YW5jZXMgY2FuIGRvIFhPRlxuICAgICAgICBpZiAoIXRoaXMuZW5hYmxlWE9GKVxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdYT0YgaXMgbm90IHBvc3NpYmxlIGZvciB0aGlzIGluc3RhbmNlJyk7XG4gICAgICAgIHJldHVybiB0aGlzLndyaXRlSW50byhvdXQpO1xuICAgIH1cbiAgICB4b2YoYnl0ZXMpIHtcbiAgICAgICAgbnVtYmVyKGJ5dGVzKTtcbiAgICAgICAgcmV0dXJuIHRoaXMueG9mSW50byhuZXcgVWludDhBcnJheShieXRlcykpO1xuICAgIH1cbiAgICBkaWdlc3RJbnRvKG91dCkge1xuICAgICAgICBvdXRwdXQob3V0LCB0aGlzKTtcbiAgICAgICAgaWYgKHRoaXMuZmluaXNoZWQpXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2RpZ2VzdCgpIHdhcyBhbHJlYWR5IGNhbGxlZCcpO1xuICAgICAgICB0aGlzLndyaXRlSW50byhvdXQpO1xuICAgICAgICB0aGlzLmRlc3Ryb3koKTtcbiAgICAgICAgcmV0dXJuIG91dDtcbiAgICB9XG4gICAgZGlnZXN0KCkge1xuICAgICAgICByZXR1cm4gdGhpcy5kaWdlc3RJbnRvKG5ldyBVaW50OEFycmF5KHRoaXMub3V0cHV0TGVuKSk7XG4gICAgfVxuICAgIGRlc3Ryb3koKSB7XG4gICAgICAgI
26774HRoaXMuZGVzdHJveWVkID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5zdGF0ZS5maWxsKDApO1xuICAgIH1cbiAgICBfY2xvbmVJbnRvKHRvKSB7XG4gICAgICAgIGNvbnN0IHsgYmxvY2tMZW4sIHN1ZmZpeCwgb3V0cHV0TGVuLCByb3VuZHMsIGVuYWJsZVhPRiB9ID0gdGhpcztcbiAgICAgICAgdG8gfHwgKHRvID0gbmV3IEtlY2NhayhibG9ja0xlbiwgc3VmZml4LCBvdXRwdXRMZW4sIGVuYWJsZVhPRiwgcm91bmRzKSk7XG4gICAgICAgIHRvLnN0YXRlMzIuc2V0KHRoaXMuc3RhdGUzMik7XG4gICAgICAgIHRvLnBvcyA9IHRoaXMucG9zO1xuICAgICAgICB0by5wb3NPdXQgPSB0aGlzLnBvc091dDtcbiAgICAgICAgdG8uZmluaXNoZWQgPSB0aGlzLmZpbmlzaGVkO1xuICAgICAgICB0by5yb3VuZHMgPSByb3VuZHM7XG4gICAgICAgIC8vIFN1ZmZpeCBjYW4gY2hhbmdlIGluIGNTSEFLRVxuICAgICAgICB0by5zdWZmaXggPSBzdWZmaXg7XG4gICAgICAgIHRvLm91dHB1dExlbiA9IG91dHB1dExlbjtcbiAgICAgICAgdG8uZW5hYmxlWE9GID0gZW5hYmxlWE9GO1xuICAgICAgICB0by5kZXN0cm95ZWQgPSB0aGlzLmRlc3Ryb3llZDtcbiAgICAgICAgcmV0dXJuIHRvO1xuICAgIH1cbn1cbmNvbnN0IGdlbiA9IChzdWZmaXgsIGJsb2NrTGVuLCBvdXRwdXRMZW4pID0+IHdyYXBDb25zdHJ1Y3RvcigoKSA9PiBuZXcgS2VjY2FrKGJsb2NrTGVuLCBzdWZmaXgsIG91dHB1dExlbikpO1xuZXhwb3J0IGNvbnN0IHNoYTNfMjI0ID0gLyogQF9fUFVSRV9fICovIGdlbigweDA2LCAxNDQsIDIyNCAvIDgpO1xuLyoqXG4gKiBTSEEzLTI1NiBoYXNoIGZ1bmN0aW9uXG4gKiBAcGFyYW0gbWVzc2FnZSAtIHRoYXQgd291bGQgYmUgaGFzaGVkXG4gKi9cbmV4cG9ydCBjb25zdCBzaGEzXzI1NiA9IC8qIEBfX1BVUkVfXyAqLyBnZW4oMHgwNiwgMTM2LCAyNTYgLyA4KTtcbmV4cG9ydCBjb25zdCBzaGEzXzM4NCA9IC8qIEBfX1BVUkVfXyAqLyBnZW4oMHgwNiwgMTA0LCAzODQgLyA4KTtcbmV4cG9ydCBjb25zdCBzaGEzXzUxMiA9IC8qIEBfX1BVUkVfXyAqLyBnZW4oMHgwNiwgNzIsIDUxMiAvIDgpO1xuZXhwb3J0IGNvbnN0IGtlY2Nha18yMjQgPSAvKiBAX19QVVJFX18gKi8gZ2VuKDB4MDEsIDE0NCwgMjI0IC8gOCk7XG4vKipcbiAqIGtlY2Nhay0yNTYgaGFzaCBmdW5jdGlvbi4gRGlmZmVyZW50IGZyb20gU0hBMy0yNTYuXG4gKiBAcGFyYW0gbWVzc2FnZSAtIHRoYXQgd291bGQgYmUgaGFzaGVkXG4gKi9cbmV4cG9ydCBjb25zdCBrZWNjYWtfMjU2ID0gLyogQF9fUFVSRV9fICovIGdlbigweDAxLCAxMzYsIDI1NiAvIDgpO1xuZXhwb3J0IGNvbnN0IGtlY2Nha18zODQgPSAvKiBAX19QVVJFX18gKi8gZ2VuKDB4MDEsIDEwNCwgMzg0IC8gOCk7XG5leHBvcnQgY29uc3Qga2VjY2FrXzUxMiA9IC8qIEBfX1BVUkVfXyAqLyBnZW4oMHgwMSwgNzIsIDUxMiAvIDgpO1xuY29uc3QgZ2VuU2hha2UgPSAoc3VmZml4LCBibG9ja0xlbiwgb3V0cHV0TGVuKSA9PiB3cmFwWE9GQ29uc3RydWN0b3JXaXRoT3B0cygob3B0cyA9IHt9KSA9PiBuZXcgS2VjY2FrKGJsb2NrTGVuLCBzdWZmaXgsIG9wdHMuZGtMZW4gPT09IHVuZGVmaW5lZCA/IG91dHB1dExlbiA6IG9wdHMuZGtMZW4sIHRydWUpKTtcbmV4cG9ydCBjb25zdCBzaGFrZTEyOCA9IC8qIEBfX1BVUkVfXyAqLyBnZW5TaGFrZSgweDFmLCAxNjgsIDEyOCAvIDgpO1xuZXhwb3J0IGNvbnN0IHNoYWtlMjU2ID0gLyogQF9fUFVSRV9fICovIGdlblNoYWtlKDB4MWYsIDEzNiwgMjU2IC8gOCk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1zaGEzLmpzLm1hcCIsIi8qKlxuICogIENyeXB0b2dyYXBoaWMgaGFzaGluZyBmdW5jdGlvbnNcbiAqXG4gKiAgQF9zdWJzZWN0aW9uOiBhcGkvY3J5cHRvOkhhc2ggRnVuY3Rpb25zIFthYm91dC1jcnlwdG8taGFzaGluZ11cbiAqL1xuaW1wb3J0IHsga2VjY2FrXzI1NiB9IGZyb20gXCJAbm9ibGUvaGFzaGVzL3NoYTNcIjtcbmltcG9ydCB7IGdldEJ5dGVzLCBoZXhsaWZ5IH0gZnJvbSBcIi4uL3V0aWxzL2luZGV4LmpzXCI7XG5sZXQgbG9ja2VkID0gZmFsc2U7XG5jb25zdCBfa2VjY2FrMjU2ID0gZnVuY3Rpb24gKGRhdGEpIHtcbiAgICByZXR1cm4ga2VjY2FrXzI1NihkYXRhKTtcbn07XG5sZXQgX19rZWNjYWsyNTYgPSBfa2VjY2FrMjU2O1xuLyoqXG4gKiAgQ29tcHV0ZSB0aGUgY3J5cHRvZ3JhcGh
26774pYyBLRUNDQUsyNTYgaGFzaCBvZiAlJWRhdGElJS5cbiAqXG4gKiAgVGhlICUlZGF0YSUlICoqbXVzdCoqIGJlIGEgZGF0YSByZXByZXNlbnRhdGlvbiwgdG8gY29tcHV0ZSB0aGVcbiAqICBoYXNoIG9mIFVURi04IGRhdGEgdXNlIHRoZSBbW2lkXV0gZnVuY3Rpb24uXG4gKlxuICogIEByZXR1cm5zIERhdGFIZXhzdHJpbmdcbiAqICBAZXhhbXBsZTpcbiAqICAgIGtlY2NhazI1NihcIjB4XCIpXG4gKiAgICAvL19yZXN1bHQ6XG4gKlxuICogICAga2VjY2FrMjU2KFwiMHgxMzM3XCIpXG4gKiAgICAvL19yZXN1bHQ6XG4gKlxuICogICAga2VjY2FrMjU2KG5ldyBVaW50OEFycmF5KFsgMHgxMywgMHgzNyBdKSlcbiAqICAgIC8vX3Jlc3VsdDpcbiAqXG4gKiAgICAvLyBTdHJpbmdzIGFyZSBhc3N1bWVkIHRvIGJlIERhdGFIZXhTdHJpbmcsIG90aGVyd2lzZSBpdCB3aWxsXG4gKiAgICAvLyB0aHJvdy4gVG8gaGFzaCBVVEYtOCBkYXRhLCBzZWUgdGhlIG5vdGUgYWJvdmUuXG4gKiAgICBrZWNjYWsyNTYoXCJIZWxsbyBXb3JsZFwiKVxuICogICAgLy9fZXJyb3I6XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBrZWNjYWsyNTYoX2RhdGEpIHtcbiAgICBjb25zdCBkYXRhID0gZ2V0Qnl0ZXMoX2RhdGEsIFwiZGF0YVwiKTtcbiAgICByZXR1cm4gaGV4bGlmeShfX2tlY2NhazI1NihkYXRhKSk7XG59XG5rZWNjYWsyNTYuXyA9IF9rZWNjYWsyNTY7XG5rZWNjYWsyNTYubG9jayA9IGZ1bmN0aW9uICgpIHsgbG9ja2VkID0gdHJ1ZTsgfTtcbmtlY2NhazI1Ni5yZWdpc3RlciA9IGZ1bmN0aW9uIChmdW5jKSB7XG4gICAgaWYgKGxvY2tlZCkge1xuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFwia2VjY2FrMjU2IGlzIGxvY2tlZFwiKTtcbiAgICB9XG4gICAgX19rZWNjYWsyNTYgPSBmdW5jO1xufTtcbk9iamVjdC5mcmVlemUoa2VjY2FrMjU2KTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWtlY2Nhay5qcy5tYXAiLCJpbXBvcnQgeyBTSEEyIH0gZnJvbSAnLi9fc2hhMi5qcyc7XG5pbXBvcnQgeyB3cmFwQ29uc3RydWN0b3IgfSBmcm9tICcuL3V0aWxzLmpzJztcbi8vIGh0dHBzOi8vaG9tZXMuZXNhdC5rdWxldXZlbi5iZS9+Ym9zc2VsYWUvcmlwZW1kMTYwLmh0bWxcbi8vIGh0dHBzOi8vaG9tZXMuZXNhdC5rdWxldXZlbi5iZS9+Ym9zc2VsYWUvcmlwZW1kMTYwL3BkZi9BQi05NjAxL0FCLTk2MDEucGRmXG5jb25zdCBSaG8gPSAvKiBAX19QVVJFX18gKi8gbmV3IFVpbnQ4QXJyYXkoWzcsIDQsIDEzLCAxLCAxMCwgNiwgMTUsIDMsIDEyLCAwLCA5LCA1LCAyLCAxNCwgMTEsIDhdKTtcbmNvbnN0IElkID0gLyogQF9fUFVSRV9fICovIFVpbnQ4QXJyYXkuZnJvbSh7IGxlbmd0aDogMTYgfSwgKF8sIGkpID0+IGkpO1xuY29uc3QgUGkgPSAvKiBAX19QVVJFX18gKi8gSWQubWFwKChpKSA9PiAoOSAqIGkgKyA1KSAlIDE2KTtcbmxldCBpZHhMID0gW0lkXTtcbmxldCBpZHhSID0gW1BpXTtcbmZvciAobGV0IGkgPSAwOyBpIDwgNDsgaSsrKVxuICAgIGZvciAobGV0IGogb2YgW2lkeEwsIGlkeFJdKVxuICAgICAgICBqLnB1c2goaltpXS5tYXAoKGspID0+IFJob1trXSkpO1xuY29uc3Qgc2hpZnRzID0gLyogQF9fUFVSRV9fICovIFtcbiAgICBbMTEsIDE0LCAxNSwgMTIsIDUsIDgsIDcsIDksIDExLCAxMywgMTQsIDE1LCA2LCA3LCA5LCA4XSxcbiAgICBbMTIsIDEzLCAxMSwgMTUsIDYsIDksIDksIDcsIDEyLCAxNSwgMTEsIDEzLCA3LCA4LCA3LCA3XSxcbiAgICBbMTMsIDE1LCAxNCwgMTEsIDcsIDcsIDYsIDgsIDEzLCAxNCwgMTMsIDEyLCA1LCA1LCA2LCA5XSxcbiAgICBbMTQsIDExLCAxMiwgMTQsIDgsIDYsIDUsIDUsIDE1LCAxMiwgMTUsIDE0LCA5LCA5LCA4LCA2XSxcbiAgICBbMTUsIDEyLCAxMywgMTMsIDksIDUsIDgsIDYsIDE0LCAxMSwgMTIsIDExLCA4LCA2LCA1LCA1XSxcbl0ubWFwKChpKSA9PiBuZXcgVWludDhBcnJheShpKSk7XG5jb25zdCBzaGlmdHNMID0gLyogQF9fUFVSRV9fICovIGlkeEwubWFwKChpZHgsIGkpID0+IGlkeC5tYXAoKGopID0+IHNoaWZ0c1tpXVtqXSkpO1xuY29uc3Qgc2hpZnRzUiA9IC8qIEBfX1BVUkVfXyAqLyBpZHhSLm1hcCgoaWR4LCBpKSA9PiBpZHgubWFwKChqKSA9PiBzaGlmdHNbaV1bal0pKTtcbmNvbnN0IEtsID0gLyogQF9fUFVSRV9fICovIG5ldyBVaW50MzJBcnJheShbXG4gICAgMHgwMDAwMDAwMCwgMHg1YTgyNzk5OSwgMHg2ZWQ5ZWJhMSwgMHg4ZjFiYmNkYywgMHhhOTUzZmQ0ZSxcbl0pO1xuY29uc3QgS3IgPSAvKiBAX19QVVJFX18gKi8gbmV3IFVpbnQzMkFycmF5KFtcbiAgICAweDUwYTI4YmU2LCAweDVjNGRkMTI0LCAweDZkNzAzZWYzLCAweDdhNmQ3NmU5LCAweDAwMDAwMDAwLFxuXSk7XG4vLyBUaGUgcm90YXRlIGxlZnQgKGNpcmN1bGFyIGxlZnQgc2hpZnQpIG9wZXJhdGlvbiBmb3IgdWludDMyXG5jb25zdCByb3RsID0gKHdvcmQsIHNoaWZ0KSA9PiAod29yZCA8PCBzaGlmdCkgfCAod29yZCA+Pj4gKDMyIC0gc2hpZnQpKTtcbi8vIEl0J3MgY2FsbGVkIGYoKSBpbiBzcGVjLlxuZnVuY3Rpb24gZihncm91cCwgeCwgeSwgeikge1xuICAgIGlmIChncm91cCA9PT0gMClcbiAgICAgICAgcmV0dXJuIHggXiB5IF4gejtcbiAgICBlbHNlIGlmIChncm91cCA9PT0gMSlcbiAgICAgICAgcmV0dXJuICh4ICYgeSkgfCAofnggJiB6KTtcbiAgICBlbHNlIGlmIChncm91cCA9PT0gMilcbiAgICAgICAgcmV0dXJuICh4IHwgfnkpIF4gejtcbiAgICBlbHNlIGlmIChncm91cCA9PT0gMylcbiAgICAgICAgcmV0dXJuICh4ICYgeikgfCAoeSAmIH56KTtcbiAgICBlbHNlXG4gICAgICAgIHJldHVybiB4IF4gKHkgfCB+eik7XG59XG4vLyBUZW1wb3JhcnkgYnVmZmVyLCBub3QgdXNlZCB0byBzdG9yZSBhbnl0aGluZyBiZXR3ZWVuIHJ1bnNcbmNvbnN0IEJVRiA9IC8qIEBfX1BVUkVfXyAqLyBuZXcgVWludDMyQXJyYXkoMTYpO1xuZXhwb3J0IGNsYXNzIFJJUEVNRDE2MCBleHRlbmRzIFNIQTIge1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICBzdXBlcig2NCwgMjAsIDgsIHRydWUpO1xuICAgICAgICB0aGlzLmgwID0gMHg2NzQ1MjMwMSB8IDA7XG4gICAgICAgIHRoaXMuaDEgPSAweGVmY2RhYjg5IHwgMDtcbiAgICAgICAgdGhpcy5oMiA9IDB4OThiYWRjZmUgfCAwO1xuICAgICAgICB0aGlzLmgzID0gMHgxMDMyNTQ3NiB8IDA7XG4gICAgICAgI
26774HRoaXMuaDQgPSAweGMzZDJlMWYwIHwgMDtcbiAgICB9XG4gICAgZ2V0KCkge1xuICAgICAgICBjb25zdCB7IGgwLCBoMSwgaDIsIGgzLCBoNCB9ID0gdGhpcztcbiAgICAgICAgcmV0dXJuIFtoMCwgaDEsIGgyLCBoMywgaDRdO1xuICAgIH1cbiAgICBzZXQoaDAsIGgxLCBoMiwgaDMsIGg0KSB7XG4gICAgICAgIHRoaXMuaDAgPSBoMCB8IDA7XG4gICAgICAgIHRoaXMuaDEgPSBoMSB8IDA7XG4gICAgICAgIHRoaXMuaDIgPSBoMiB8IDA7XG4gICAgICAgIHRoaXMuaDMgPSBoMyB8IDA7XG4gICAgICAgIHRoaXMuaDQgPSBoNCB8IDA7XG4gICAgfVxuICAgIHByb2Nlc3Modmlldywgb2Zmc2V0KSB7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgMTY7IGkrKywgb2Zmc2V0ICs9IDQpXG4gICAgICAgICAgICBCVUZbaV0gPSB2aWV3LmdldFVpbnQzMihvZmZzZXQsIHRydWUpO1xuICAgICAgICAvLyBwcmV0dGllci1pZ25vcmVcbiAgICAgICAgbGV0IGFsID0gdGhpcy5oMCB8IDAsIGFyID0gYWwsIGJsID0gdGhpcy5oMSB8IDAsIGJyID0gYmwsIGNsID0gdGhpcy5oMiB8IDAsIGNyID0gY2wsIGRsID0gdGhpcy5oMyB8IDAsIGRyID0gZGwsIGVsID0gdGhpcy5oNCB8IDAsIGVyID0gZWw7XG4gICAgICAgIC8vIEluc3RlYWQgb2YgaXRlcmF0aW5nIDAgdG8gODAsIHdlIHNwbGl0IGl0IGludG8gNSBncm91cHNcbiAgICAgICAgLy8gQW5kIHVzZSB0aGUgZ3JvdXBzIGluIGNvbnN0YW50cywgZnVuY3Rpb25zLCBldGMuIE11Y2ggc2ltcGxlclxuICAgICAgICBmb3IgKGxldCBncm91cCA9IDA7IGdyb3VwIDwgNTsgZ3JvdXArKykge1xuICAgICAgICAgICAgY29uc3Qgckdyb3VwID0gNCAtIGdyb3VwO1xuICAgICAgICAgICAgY29uc3QgaGJsID0gS2xbZ3JvdXBdLCBoYnIgPSBLcltncm91cF07IC8vIHByZXR0aWVyLWlnbm9yZVxuICAgICAgICAgICAgY29uc3QgcmwgPSBpZHhMW2dyb3VwXSwgcnIgPSBpZHhSW2dyb3VwXTsgLy8gcHJldHRpZXItaWdub3JlXG4gICAgICAgICAgICBjb25zdCBzbCA9IHNoaWZ0c0xbZ3JvdXBdLCBzciA9IHNoaWZ0c1JbZ3JvdXBdOyAvLyBwcmV0dGllci1pZ25vcmVcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgMTY7IGkrKykge1xuICAgICAgICAgICAgICAgIGNvbnN0IHRsID0gKHJvdGwoYWwgKyBmKGdyb3VwLCBibCwgY2wsIGRsKSArIEJVRltybFtpXV0gKyBoYmwsIHNsW2ldKSArIGVsKSB8IDA7XG4gICAgICAgICAgICAgICAgYWwgPSBlbCwgZWwgPSBkbCwgZGwgPSByb3RsKGNsLCAxMCkgfCAwLCBjbCA9IGJsLCBibCA9IHRsOyAvLyBwcmV0dGllci1pZ25vcmVcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIDIgbG9vcHMgYXJlIDEwJSBmYXN0ZXJcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgMTY7IGkrKykge1xuICAgICAgICAgICAgICAgIGNvbnN0IHRyID0gKHJvdGwoYXIgKyBmKHJHcm91cCwgYnIsIGNyLCBkcikgKyBCVUZbcnJbaV1dICsgaGJyLCBzcltpXSkgKyBlcikgfCAwO1xuICAgICAgICAgICAgICAgIGFyID0gZXIsIGVyID0gZHIsIGRyID0gcm90bChjciwgMTApIHwgMCwgY3IgPSBiciwgYnIgPSB0cjsgLy8gcHJldHRpZXItaWdub3JlXG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgLy8gQWRkIHRoZSBjb21wcmVzc2VkIGNodW5rIHRvIHRoZSBjdXJyZW50IGhhc2ggdmFsdWVcbiAgICAgICAgdGhpcy5zZXQoKHRoaXMuaDEgKyBjbCArIGRyKSB8IDAsICh0aGlzLmgyICsgZGwgKyBlcikgfCAwLCAodGhpcy5oMyArIGVsICsgYXIpIHwgMCwgKHRoaXMuaDQgKyBhbCArIGJyKSB8IDAsICh0aGlzLmgwICsgYmwgKyBjcikgfCAwKTtcbiAgICB9XG4gICAgcm91bmRDbGVhbigpIHtcbiAgICAgICAgQlVGLmZpbGwoMCk7XG4gICAgfVxuICAgIGRlc3Ryb3koKSB7XG4gICAgICAgIHRoaXMuZGVzdHJveWVkID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5idWZmZXIuZmlsbCgwKTtcbiAgICAgICAgdGhpcy5zZXQoMCwgMCwgMCwgMCwgMCk7XG4gICAgfVxufVxuLyoqXG4gKiBSSVBFTUQtMTYwIC0gYSBoYXNoIGZ1bmN0aW9uIGZyb20gMTk5MHMuXG4gKiBAcGFyYW0gbWVzc2FnZSAtIG1zZyB0aGF0IHdvdWxkIGJlIGhhc2hlZFxuICovXG5leHBvcnQgY29uc3QgcmlwZW1kMTYwID0gLyogQF9fUFVSRV9fICovIHdyYXBDb25zdHJ1Y3RvcigoKSA9PiBuZXcgUklQRU1EMTYwKCkpO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9cmlwZW1kMTYwLmpzLm1hcCIsImltcG9ydCB7IHJpcGVtZDE2MCBhcyBub2JsZV9yaXBlbWQxNjAgfSBmcm9tIFwiQG5vYmxlL2hhc2hlcy9yaXBlbWQxNjBcIjtcbmltcG9ydCB7IGdldEJ5dGVzLCBoZXhsaWZ5IH0gZnJvbSBcIi4uL3V0aWxzL2luZGV4LmpzXCI7XG5sZXQgbG9ja2VkID0gZmFsc2U7XG5jb25zdCBfcmlwZW1kMTYwID0gZnVuY3Rpb24gKGRhdGEpIHtcbiAgICByZXR1cm4gbm9ibGVfcmlwZW1kMTYwKGRhdGEpO1xufTtcbmxldCBfX3JpcGVtZDE2MCA9IF9yaXBlbWQxNjA7XG4vKipcbiAqICBDb21wdXRlIHRoZSBjcnlwdG9ncmFwaGljIFJJUEVNRC0xNjAgaGFzaCBvZiAlJWRhdGElJS5cbiAqXG4gKiAgQF9kb2Nsb2M6IGFwaS9jcnlwdG86SGFzaCBGdW5jdGlvbnNcbiAqICBAcmV0dXJucyBEYXRhSGV4c3RyaW5nXG4gKlxuICogIEBleGFtcGxlOlxuICogICAgcmlwZW1kMTYwKFwiMHhcIilcbiAqICAgIC8vX3Jlc3VsdDpcbiAqXG4gKiAgICByaXBlbWQxNjAoXCIweDEzMzdcIilcbiAqICAgIC8vX3Jlc3VsdDpcbiAqXG4gKiAgICByaXBlbWQxNjAobmV3IFVpbnQ4QXJyYXkoWyAweDEzLCAweDM3IF0pKVxuICogICAgLy9fcmVzdWx0OlxuICpcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJpcGVtZDE2MChfZGF0YSkge1xuICAgIGNvbnN0IGRhdGEgPSBnZXRCeXRlcyhfZGF0YSwgXCJkYXRhXCIpO1xuICAgIHJldHVybiBoZXhsaWZ5KF9fcmlwZW1kMTYwKGRhdGEpKTtcbn1cbnJpcGVtZDE2MC5fID0gX3JpcGVtZDE2MDtcbnJpcGVtZDE2MC5sb2NrID0gZnVuY3Rpb24gKCkgeyBsb2NrZWQgPSB0cnVlOyB9O1xucmlwZW1kMTYwLnJlZ2lzdGVyID0gZnVuY3Rpb24gKGZ1bmMpIHtcbiAgICBpZiAobG9ja2VkKSB7XG4gICAgICAgI
26774HRocm93IG5ldyBUeXBlRXJyb3IoXCJyaXBlbWQxNjAgaXMgbG9ja2VkXCIpO1xuICAgIH1cbiAgICBfX3JpcGVtZDE2MCA9IGZ1bmM7XG59O1xuT2JqZWN0LmZyZWV6ZShyaXBlbWQxNjApO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9cmlwZW1kMTYwLmpzLm1hcCIsIi8qKlxuICogIEEgKipQYXNzd29yZC1CYXNlZCBLZXktRGVyaXZhdGlvbiBGdW5jdGlvbioqIGlzIGRlc2lnbmVkIHRvIGNyZWF0ZVxuICogIGEgc2VxdWVuY2Ugb2YgYnl0ZXMgc3VpdGlibGUgYXMgYSAqKmtleSoqIGZyb20gYSBodW1hbi1yZW1lbWJlcmFibGVcbiAqICBwYXNzd29yZC5cbiAqXG4gKiAgQF9zdWJzZWN0aW9uOiBhcGkvY3J5cHRvOlBhc3N3b3JkcyAgW2Fib3V0LXBia2RmXVxuICovXG5pbXBvcnQgeyBwYmtkZjJTeW5jIH0gZnJvbSBcIi4vY3J5cHRvLmpzXCI7XG5pbXBvcnQgeyBnZXRCeXRlcywgaGV4bGlmeSB9IGZyb20gXCIuLi91dGlscy9pbmRleC5qc1wiO1xubGV0IGxvY2tlZCA9IGZhbHNlO1xuY29uc3QgX3Bia2RmMiA9IGZ1bmN0aW9uIChwYXNzd29yZCwgc2FsdCwgaXRlcmF0aW9ucywga2V5bGVuLCBhbGdvKSB7XG4gICAgcmV0dXJuIHBia2RmMlN5bmMocGFzc3dvcmQsIHNhbHQsIGl0ZXJhdGlvbnMsIGtleWxlbiwgYWxnbyk7XG59O1xubGV0IF9fcGJrZGYyID0gX3Bia2RmMjtcbi8qKlxuICogIFJldHVybiB0aGUgW1tsaW5rLXBia2RmMl1dIGZvciAlJWtleWxlbiUlIGJ5dGVzIGZvciAlJXBhc3N3b3JkJSUgdXNpbmdcbiAqICB0aGUgJSVzYWx0JSUgYW5kIHVzaW5nICUlaXRlcmF0aW9ucyUlIG9mICUlYWxnbyUlLlxuICpcbiAqICBUaGlzIFBCS0RGIGlzIG91dGRhdGVkIGFuZCBzaG91bGQgbm90IGJlIHVzZWQgaW4gbmV3IHByb2plY3RzLCBidXQgaXNcbiAqICByZXF1aXJlZCB0byBkZWNyeXB0IG9sZGVyIGZpbGVzLlxuICpcbiAqICBAZXhhbXBsZTpcbiAqICAgIC8vIFRoZSBwYXNzd29yZCBtdXN0IGJlIGNvbnZlcnRlZCB0byBieXRlcywgYW5kIGl0IGlzIGdlbmVyYWxseVxuICogICAgLy8gYmVzdCBwcmFjdGljZXMgdG8gZW5zdXJlIHRoZSBzdHJpbmcgaGFzIGJlZW4gbm9ybWFsaXplZC4gTWFueVxuICogICAgLy8gZm9ybWF0cyBleHBsaWNpdGx5IGluZGljYXRlIHRoZSBub3JtYWxpemF0aW9uIGZvcm0gdG8gdXNlLlxuICogICAgcGFzc3dvcmQgPSBcImhlbGxvXCJcbiAqICAgIHBhc3N3b3JkQnl0ZXMgPSB0b1V0ZjhCeXRlcyhwYXNzd29yZCwgXCJORktDXCIpXG4gKlxuICogICAgc2FsdCA9IGlkKFwic29tZS1zYWx0XCIpXG4gKlxuICogICAgLy8gQ29tcHV0ZSB0aGUgUEJLREYyXG4gKiAgICBwYmtkZjIocGFzc3dvcmRCeXRlcywgc2FsdCwgMTAyNCwgMTYsIFwic2hhMjU2XCIpXG4gKiAgICAvL19yZXN1bHQ6XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwYmtkZjIoX3Bhc3N3b3JkLCBfc2FsdCwgaXRlcmF0aW9ucywga2V5bGVuLCBhbGdvKSB7XG4gICAgY29uc3QgcGFzc3dvcmQgPSBnZXRCeXRlcyhfcGFzc3dvcmQsIFwicGFzc3dvcmRcIik7XG4gICAgY29uc3Qgc2FsdCA9IGdldEJ5dGVzKF9zYWx0LCBcInNhbHRcIik7XG4gICAgcmV0dXJuIGhleGxpZnkoX19wYmtkZjIocGFzc3dvcmQsIHNhbHQsIGl0ZXJhdGlvbnMsIGtleWxlbiwgYWxnbykpO1xufVxucGJrZGYyLl8gPSBfcGJrZGYyO1xucGJrZGYyLmxvY2sgPSBmdW5jdGlvbiAoKSB7IGxvY2tlZCA9IHRydWU7IH07XG5wYmtkZjIucmVnaXN0ZXIgPSBmdW5jdGlvbiAoZnVuYykge1xuICAgIGlmIChsb2NrZWQpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwicGJrZGYyIGlzIGxvY2tlZFwiKTtcbiAgICB9XG4gICAgX19wYmtkZjIgPSBmdW5jO1xufTtcbk9iamVjdC5mcmVlemUocGJrZGYyKTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXBia2RmMi5qcy5tYXAiLCIvKipcbiAqICBBICoqQ3J5cHRvZ3JhcGh
26774pY2FsbHkgU2VjdXJlIFJhbmRvbSBWYWx1ZSoqIGlzIG9uZSB0aGF0IGhhcyBiZWVuXG4gKiAgZ2VuZXJhdGVkIHdpdGggYWRkaXRpb25hbCBjYXJlIHRha2UgdG8gcHJldmVudCBzaWRlLWNoYW5uZWxzXG4gKiAgZnJvbSBhbGxvd2luZyBvdGhlcnMgdG8gZGV0ZWN0IGl0IGFuZCBwcmV2ZW50IG90aGVycyBmcm9tIHRocm91Z2hcbiAqICBjb2luY2lkZW5jZSBnZW5lcmF0ZSB0aGUgc2FtZSB2YWx1ZXMuXG4gKlxuICogIEBfc3Vic2VjdGlvbjogYXBpL2NyeXB0bzpSYW5kb20gVmFsdWVzICBbYWJvdXQtY3J5cHRvLXJhbmRvbV1cbiAqL1xuaW1wb3J0IHsgcmFuZG9tQnl0ZXMgYXMgY3J5cHRvX3JhbmRvbSB9IGZyb20gXCIuL2NyeXB0by5qc1wiO1xubGV0IGxvY2tlZCA9IGZhbHNlO1xuY29uc3QgX3JhbmRvbUJ5dGVzID0gZnVuY3Rpb24gKGxlbmd0aCkge1xuICAgIHJldHVybiBuZXcgVWludDhBcnJheShjcnlwdG9fcmFuZG9tKGxlbmd0aCkpO1xufTtcbmxldCBfX3JhbmRvbUJ5dGVzID0gX3JhbmRvbUJ5dGVzO1xuLyoqXG4gKiAgUmV0dXJuICUlbGVuZ3RoJSUgYnl0ZXMgb2YgY3J5cHRvZ3JhcGhpY2FsbHkgc2VjdXJlIHJhbmRvbSBkYXRhLlxuICpcbiAqICBAZXhhbXBsZTpcbiAqICAgIHJhbmRvbUJ5dGVzKDgpXG4gKiAgICAvL19yZXN1bHQ6XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByYW5kb21CeXRlcyhsZW5ndGgpIHtcbiAgICByZXR1cm4gX19yYW5kb21CeXRlcyhsZW5ndGgpO1xufVxucmFuZG9tQnl0ZXMuXyA9IF9yYW5kb21CeXRlcztcbnJhbmRvbUJ5dGVzLmxvY2sgPSBmdW5jdGlvbiAoKSB7IGxvY2tlZCA9IHRydWU7IH07XG5yYW5kb21CeXRlcy5yZWdpc3RlciA9IGZ1bmN0aW9uIChmdW5jKSB7XG4gICAgaWYgKGxvY2tlZCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJyYW5kb21CeXRlcyBpcyBsb2NrZWRcIik7XG4gICAgfVxuICAgIF9fcmFuZG9tQnl0ZXMgPSBmdW5jO1xufTtcbk9iamVjdC5mcmVlemUocmFuZG9tQnl0ZXMpO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9cmFuZG9tLmpzLm1hcCIsImltcG9ydCB7IG51bWJlciBhcyBhc3NlcnROdW1iZXIgfSBmcm9tICcuL19hc3NlcnQuanMnO1xuaW1wb3J0IHsgc2hhMjU2IH0gZnJvbSAnLi9zaGEyNTYuanMnO1xuaW1wb3J0IHsgcGJrZGYyIH0gZnJvbSAnLi9wYmtkZjIuanMnO1xuaW1wb3J0IHsgYXN5bmNMb29wLCBjaGVja09wdHMsIHUzMiB9IGZyb20gJy4vdXRpbHMuanMnO1xuLy8gUkZDIDc5MTQgU2NyeXB0IEtERlxuLy8gTGVmdCByb3RhdGUgZm9yIHVpbnQzMlxuY29uc3Qgcm90bCA9IChhLCBiKSA9PiAoYSA8PCBiKSB8IChhID4+PiAoMzIgLSBiKSk7XG4vLyBUaGUgbWFpbiBTY3J5cHQgbG9vcDogdXNlcyBTYWxzYSBleHRlbnNpdmVseS5cbi8vIFNpeCB2ZXJzaW9ucyBvZiB0aGUgZnVuY3Rpb24gd2VyZSB0cmllZCwgdGhpcyBpcyB0aGUgZmFzdGVzdCBvbmUuXG4vLyBwcmV0dGllci1pZ25vcmVcbmZ1bmN0aW9uIFhvckFuZFNhbHNhKHByZXYsIHBpLCBpbnB1dCwgaWksIG91dCwgb2kpIHtcbiAgICAvLyBCYXNlZCBvbiBodHRwczovL2NyLnlwLnRvL3NhbHNhMjAuaHRtbFxuICAgIC8vIFhvciBibG9ja3NcbiAgICBsZXQgeTAwID0gcHJldltwaSsrXSBeIGlucHV0W2lpKytdLCB5MDEgPSBwcmV2W3BpKytdIF4gaW5wdXRbaWkrK107XG4gICAgbGV0IHkwMiA9IHByZXZbcGkrK10gXiBpbnB1dFtpaSsrXSwgeTAzID0gcHJldltwaSsrXSBeIGlucHV0W2lpKytdO1xuICAgIGxldCB5MDQgPSBwcmV2W3BpKytdIF4gaW5wdXRbaWkrK10sIHkwNSA9IHByZXZbcGkrK10gXiBpbnB1dFtpaSsrXTtcbiAgICBsZXQgeTA2ID0gcHJldltwaSsrXSBeIGlucHV0W2lpKytdLCB5MDcgPSBwcmV2W3BpKytdIF4gaW5wdXRbaWkrK107XG4gICAgbGV0IHkwOCA9IHByZXZbcGkrK10gXiBpbnB1dFtpaSsrXSwgeTA5ID0gcHJldltwaSsrXSBeIGlucHV0W2lpKytdO1xuICAgIGxldCB5MTAgPSBwcmV2W3BpKytdIF4gaW5wdXRbaWkrK10sIHkxMSA9IHByZXZbcGkrK10gXiBpbnB1dFtpaSsrXTtcbiAgICBsZXQgeTEyID0gcHJldltwaSsrXSBeIGlucHV0W2lpKytdLCB5MTMgPSBwcmV2W3BpKytdIF4gaW5wdXRbaWkrK107XG4gICAgbGV0IHkxNCA9IHByZXZbcGkrK10gXiBpbnB1dFtpaSsrXSwgeTE1ID0gcHJldltwaSsrXSBeIGlucHV0W2lpKytdO1xuICAgIC8vIFNhdmUgc3RhdGUgdG8gdGVtcG9yYXJ5IHZhcmlhYmxlcyAoc2Fsc2EpXG4gICAgbGV0IHgwMCA9IHkwMCwgeDAxID0geTAxLCB4MDIgPSB5MDIsIHgwMyA9IHkwMywgeDA0ID0geTA0LCB4MDUgPSB5MDUsIHgwNiA9IHkwNiwgeDA3ID0geTA3LCB4MDggPSB5MDgsIHgwOSA9IHkwOSwgeDEwID0geTEwLCB4MTEgPSB5MTEsIHgxMiA9IHkxMiwgeDEzID0geTEzLCB4MTQgPSB5MTQsIHgxNSA9IHkxNTtcbiAgICAvLyBNYWluIGxvb3AgKHNhbHNhKVxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgODsgaSArPSAyKSB7XG4gICAgICAgIHgwNCBePSByb3RsKHgwMCArIHgxMiB8IDAsIDcpO1xuICAgICAgICB4MDggXj0gcm90bCh4MDQgKyB4MDAgfCAwLCA5KTtcbiAgICAgICAgeDEyIF49IHJvdGwoeDA4ICsgeDA0IHwgMCwgMTMpO1xuICAgICAgICB4MDAgXj0gcm90bCh4MTIgKyB4MDggfCAwLCAxOCk7XG4gICAgICAgIHgwOSBePSByb3RsKHgwNSArIHgwMSB8IDAsIDcpO1xuICAgICAgICB4MTMgXj0gcm90bCh4MDkgKyB4MDUgfCAwLCA5KTtcbiAgICAgICAgeDAxIF49IHJvdGwoeDEzICsgeDA5IHwgMCwgMTMpO1xuICAgICAgICB4MDUgXj0gcm90bCh4MDEgKyB4MTMgfCAwLCAxOCk7XG4gICAgICAgIHgxNCBePSByb3RsKHgxMCArIHgwNiB8IDAsIDcpO1xuICAgICAgICB4MDIgXj0gcm90bCh4MTQgKyB4MTAgfCAwLCA5KTtcbiAgICAgICAgeDA2IF49IHJvdGwoeDAyICsgeDE0IHwgMCwgMTMpO1xuICAgICAgICB4MTAgXj0gcm90bCh4MDYgKyB4MDIgfCAwLCAxOCk7XG4gICAgICAgIHgwMyBePSByb3RsKHgxNSArIHgxMSB8IDAsIDcpO1xuICAgICAgICB4MDcgXj0gcm90bCh4MDMgKyB4MTUgfCAwLCA5KTtcbiAgICAgICAgeDExIF49IHJvdGwoeDA3ICsgeDAzIHwgMCwgMTMpO1xuICAgICAgICB4MTUgXj0gcm90bCh4MTEgKyB4MDcgfCAwLCAxOCk7XG4gICAgICAgI
26774HgwMSBePSByb3RsKHgwMCArIHgwMyB8IDAsIDcpO1xuICAgICAgICB4MDIgXj0gcm90bCh4MDEgKyB4MDAgfCAwLCA5KTtcbiAgICAgICAgeDAzIF49IHJvdGwoeDAyICsgeDAxIHwgMCwgMTMpO1xuICAgICAgICB4MDAgXj0gcm90bCh4MDMgKyB4MDIgfCAwLCAxOCk7XG4gICAgICAgIHgwNiBePSByb3RsKHgwNSArIHgwNCB8IDAsIDcpO1xuICAgICAgICB4MDcgXj0gcm90bCh4MDYgKyB4MDUgfCAwLCA5KTtcbiAgICAgICAgeDA0IF49IHJvdGwoeDA3ICsgeDA2IHwgMCwgMTMpO1xuICAgICAgICB4MDUgXj0gcm90bCh4MDQgKyB4MDcgfCAwLCAxOCk7XG4gICAgICAgIHgxMSBePSByb3RsKHgxMCArIHgwOSB8IDAsIDcpO1xuICAgICAgICB4MDggXj0gcm90bCh4MTEgKyB4MTAgfCAwLCA5KTtcbiAgICAgICAgeDA5IF49IHJvdGwoeDA4ICsgeDExIHwgMCwgMTMpO1xuICAgICAgICB4MTAgXj0gcm90bCh4MDkgKyB4MDggfCAwLCAxOCk7XG4gICAgICAgIHgxMiBePSByb3RsKHgxNSArIHgxNCB8IDAsIDcpO1xuICAgICAgICB4MTMgXj0gcm90bCh4MTIgKyB4MTUgfCAwLCA5KTtcbiAgICAgICAgeDE0IF49IHJvdGwoeDEzICsgeDEyIHwgMCwgMTMpO1xuICAgICAgICB4MTUgXj0gcm90bCh4MTQgKyB4MTMgfCAwLCAxOCk7XG4gICAgfVxuICAgIC8vIFdyaXRlIG91dHB1dCAoc2Fsc2EpXG4gICAgb3V0W29pKytdID0gKHkwMCArIHgwMCkgfCAwO1xuICAgIG91dFtvaSsrXSA9ICh5MDEgKyB4MDEpIHwgMDtcbiAgICBvdXRbb2krK10gPSAoeTAyICsgeDAyKSB8IDA7XG4gICAgb3V0W29pKytdID0gKHkwMyArIHgwMykgfCAwO1xuICAgIG91dFtvaSsrXSA9ICh5MDQgKyB4MDQpIHwgMDtcbiAgICBvdXRbb2krK10gPSAoeTA1ICsgeDA1KSB8IDA7XG4gICAgb3V0W29pKytdID0gKHkwNiArIHgwNikgfCAwO1xuICAgIG91dFtvaSsrXSA9ICh5MDcgKyB4MDcpIHwgMDtcbiAgICBvdXRbb2krK10gPSAoeTA4ICsgeDA4KSB8IDA7XG4gICAgb3V0W29pKytdID0gKHkwOSArIHgwOSkgfCAwO1xuICAgIG91dFtvaSsrXSA9ICh5MTAgKyB4MTApIHwgMDtcbiAgICBvdXRbb2krK10gPSAoeTExICsgeDExKSB8IDA7XG4gICAgb3V0W29pKytdID0gKHkxMiArIHgxMikgfCAwO1xuICAgIG91dFtvaSsrXSA9ICh5MTMgKyB4MTMpIHwgMDtcbiAgICBvdXRbb2krK10gPSAoeTE0ICsgeDE0KSB8IDA7XG4gICAgb3V0W29pKytdID0gKHkxNSArIHgxNSkgfCAwO1xufVxuZnVuY3Rpb24gQmxvY2tNaXgoaW5wdXQsIGlpLCBvdXQsIG9pLCByKSB7XG4gICAgLy8gVGhlIGJsb2NrIEIgaXMgciAxMjgtYnl0ZSBjaHVua3MgKHdoaWNoIGlzIGVxdWl2YWxlbnQgb2YgMnIgNjQtYnl0ZSBjaHVua3MpXG4gICAgbGV0IGhlYWQgPSBvaSArIDA7XG4gICAgbGV0IHRhaWwgPSBvaSArIDE2ICogcjtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IDE2OyBpKyspXG4gICAgICAgIG91dFt0YWlsICsgaV0gPSBpbnB1dFtpaSArICgyICogciAtIDEpICogMTYgKyBpXTsgLy8gWCDihpAgQlsycuKIkjFdXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCByOyBpKyssIGhlYWQgKz0gMTYsIGlpICs9IDE2KSB7XG4gICAgICAgIC8vIFdlIHdyaXRlIG9kZCAmIGV2ZW4gWWkgYXQgc2FtZSB0aW1lLiBFdmVuOiAwYlhYWFhYMCBPZGQ6ICAwYlhYWFhYMVxuICAgICAgICBYb3JBbmRTYWxzYShvdXQsIHRhaWwsIGlucHV0LCBpaSwgb3V0LCBoZWFkKTsgLy8gaGVhZFtpXSA9IFNhbHNhKGJsb2NrSW5bMippXSBeIHRhaWxbaS0xXSlcbiAgICAgICAgaWYgKGkgPiAwKVxuICAgICAgICAgICAgdGFpbCArPSAxNjsgLy8gRmlyc3QgaXRlcmF0aW9uIG92ZXJ3cml0ZXMgdG1wIHZhbHVlIGluIHRhaWxcbiAgICAgICAgWG9yQW5kU2Fsc2Eob3V0LCBoZWFkLCBpbnB1dCwgKGlpICs9IDE2KSwgb3V0LCB0YWlsKTsgLy8gdGFpbFtpXSA9IFNhbHNhKGJsb2NrSW5bMippKzFdIF4gaGVhZFtpXSlcbiAgICB9XG59XG4vLyBDb21tb24gcHJvbG9ndWUgYW5kIGVwaWxvZ3VlIGZvciBzeW5jL2FzeW5jIGZ1bmN0aW9uc1xuZnVuY3Rpb24gc2NyeXB0SW5pdChwYXNzd29yZCwgc2FsdCwgX29wdHMpIHtcbiAgICAvLyBNYXhtZW0gLSAxR0IrMUtCIGJ5IGRlZmF1bHRcbiAgICBjb25zdCBvcHRzID0gY2hlY2tPcHRzKHtcbiAgICAgICAgZGtMZW46IDMyLFxuICAgICAgICBhc3luY1RpY2s6IDEwLFxuICAgICAgICBtYXhtZW06IDEwMjQgKiogMyArIDEwMjQsXG4gICAgfSwgX29wdHMpO1xuICAgIGNvbnN0IHsgTiwgciwgcCwgZGtMZW4sIGFzeW5jVGljaywgbWF4bWVtLCBvblByb2dyZXNzIH0gPSBvcHRzO1xuICAgIGFzc2VydE51bWJlcihOKTtcbiAgICBhc3NlcnROdW1iZXIocik7XG4gICAgYXNzZXJ0TnVtYmVyKHApO1xuICAgIGFzc2VydE51bWJlcihka0xlbik7XG4gICAgYXNzZXJ0TnVtYmVyKGFzeW5jVGljayk7XG4gICAgYXNzZXJ0TnVtYmVyKG1heG1lbSk7XG4gICAgaWYgKG9uUHJvZ3Jlc3MgIT09IHVuZGVmaW5lZCAmJiB0eXBlb2Ygb25Qcm9ncmVzcyAhPT0gJ2Z1bmN0aW9uJylcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdwcm9ncmVzc0NiIHNob3VsZCBiZSBmdW5jdGlvbicpO1xuICAgIGNvbnN0IGJsb2NrU2l6ZSA9IDEyOCAqIHI7XG4gICAgY29uc3QgYmxvY2tTaXplMzIgPSBibG9ja1NpemUgLyA0O1xuICAgIGlmIChOIDw9IDEgfHwgKE4gJiAoTiAtIDEpKSAhPT0gMCB8fCBOID49IDIgKiogKGJsb2NrU2l6ZSAvIDgpIHx8IE4gPiAyICoqIDMyKSB7XG4gICAgICAgIC8vIE5PVEU6IHdlIGxpbWl0IE4gdG8gYmUgbGVzcyB0aGFuIDIqKjMyIGJlY2F1c2Ugb2YgMzIgYml0IHZhcmlhbnQgb2YgSW50ZWdyaWZ5IGZ1bmN0aW9uXG4gICAgICAgIC8vIFRoZXJlIGlzIG5vIEpTIGVuZ2luZXMgdGhhdCBhbGxvd3MgYWxvY2F0ZSBtb3JlIHRoYW4gNEdCIHBlciBzaW5nbGUgVWludDhBcnJheSBmb3Igbm93LCBidXQgY2FuIGNoYW5nZSBpbiBmdXR1cmUuXG4gICAgICAgIHRocm93IG5ldyBFcnJvcignU2NyeXB0OiBOIG11c3QgYmUgbGFyZ2VyIHRoYW4gMSwgYSBwb3dlciBvZiAyLCBsZXNzIHRoYW4gMl4oMTI4ICogciAvIDgpIGFuZCBsZXNzIHRoYW4gMl4zMicpO1xuICAgIH1cbiAgICBpZiAocCA8IDAgfHwgcCA+ICgoMiAqKiAzMiAtIDEpICogMzIpIC8gYmxvY2tTaXplKSB7XG4gICAgICAgI
26774HRocm93IG5ldyBFcnJvcignU2NyeXB0OiBwIG11c3QgYmUgYSBwb3NpdGl2ZSBpbnRlZ2VyIGxlc3MgdGhhbiBvciBlcXVhbCB0byAoKDJeMzIgLSAxKSAqIDMyKSAvICgxMjggKiByKScpO1xuICAgIH1cbiAgICBpZiAoZGtMZW4gPCAwIHx8IGRrTGVuID4gKDIgKiogMzIgLSAxKSAqIDMyKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignU2NyeXB0OiBka0xlbiBzaG91bGQgYmUgcG9zaXRpdmUgaW50ZWdlciBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gKDJeMzIgLSAxKSAqIDMyJyk7XG4gICAgfVxuICAgIGNvbnN0IG1lbVVzZWQgPSBibG9ja1NpemUgKiAoTiArIHApO1xuICAgIGlmIChtZW1Vc2VkID4gbWF4bWVtKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgU2NyeXB0OiBwYXJhbWV0ZXJzIHRvbyBsYXJnZSwgJHttZW1Vc2VkfSAoMTI4ICogciAqIChOICsgcCkpID4gJHttYXhtZW19IChtYXhtZW0pYCk7XG4gICAgfVxuICAgIC8vIFtCMC4uLkJw4oiSMV0g4oaQIFBCS0RGMkhNQUMtU0hBMjU2KFBhc3NwaHJhc2UsIFNhbHQsIDEsIGJsb2NrU2l6ZSpQYXJhbGxlbGl6YXRpb25GYWN0b3IpXG4gICAgLy8gU2luY2UgaXQgaGFzIG9ubHkgb25lIGl0ZXJhdGlvbiB0aGVyZSBpcyBubyByZWFzb24gdG8gdXNlIGFzeW5jIHZhcmlhbnRcbiAgICBjb25zdCBCID0gcGJrZGYyKHNoYTI1NiwgcGFzc3dvcmQsIHNhbHQsIHsgYzogMSwgZGtMZW46IGJsb2NrU2l6ZSAqIHAgfSk7XG4gICAgY29uc3QgQjMyID0gdTMyKEIpO1xuICAgIC8vIFJlLXVzZWQgYmV0d2VlbiBwYXJhbGxlbCBpdGVyYXRpb25zLiBBcnJheShpdGVyYXRpb25zKSBvZiBCXG4gICAgY29uc3QgViA9IHUzMihuZXcgVWludDhBcnJheShibG9ja1NpemUgKiBOKSk7XG4gICAgY29uc3QgdG1wID0gdTMyKG5ldyBVaW50OEFycmF5KGJsb2NrU2l6ZSkpO1xuICAgIGxldCBibG9ja01peENiID0gKCkgPT4geyB9O1xuICAgIGlmIChvblByb2dyZXNzKSB7XG4gICAgICAgIGNvbnN0IHRvdGFsQmxvY2tNaXggPSAyICogTiAqIHA7XG4gICAgICAgIC8vIEludm9rZSBjYWxsYmFjayBpZiBwcm9ncmVzcyBjaGFuZ2VzIGZyb20gMTAuMDEgdG8gMTAuMDJcbiAgICAgICAgLy8gQWxsb3dzIHRvIGRyYXcgc21vb3RoIHByb2dyZXNzIGJhciBvbiB1cCB0byA4SyBzY3JlZW5cbiAgICAgICAgY29uc3QgY2FsbGJhY2tQZXIgPSBNYXRoLm1heChNYXRoLmZsb29yKHRvdGFsQmxvY2tNaXggLyAxMDAwMCksIDEpO1xuICAgICAgICBsZXQgYmxvY2tNaXhDbnQgPSAwO1xuICAgICAgICBibG9ja01peENiID0gKCkgPT4ge1xuICAgICAgICAgICAgYmxvY2tNaXhDbnQrKztcbiAgICAgICAgICAgIGlmIChvblByb2dyZXNzICYmICghKGJsb2NrTWl4Q250ICUgY2FsbGJhY2tQZXIpIHx8IGJsb2NrTWl4Q250ID09PSB0b3RhbEJsb2NrTWl4KSlcbiAgICAgICAgICAgICAgICBvblByb2dyZXNzKGJsb2NrTWl4Q250IC8gdG90YWxCbG9ja01peCk7XG4gICAgICAgIH07XG4gICAgfVxuICAgIHJldHVybiB7IE4sIHIsIHAsIGRrTGVuLCBibG9ja1NpemUzMiwgViwgQjMyLCBCLCB0bXAsIGJsb2NrTWl4Q2IsIGFzeW5jVGljayB9O1xufVxuZnVuY3Rpb24gc2NyeXB0T3V0cHV0KHBhc3N3b3JkLCBka0xlbiwgQiwgViwgdG1wKSB7XG4gICAgY29uc3QgcmVzID0gcGJrZGYyKHNoYTI1NiwgcGFzc3dvcmQsIEIsIHsgYzogMSwgZGtMZW4gfSk7XG4gICAgQi5maWxsKDApO1xuICAgIFYuZmlsbCgwKTtcbiAgICB0bXAuZmlsbCgwKTtcbiAgICByZXR1cm4gcmVzO1xufVxuLyoqXG4gKiBTY3J5cHQgS0RGIGZyb20gUkZDIDc5MTQuXG4gKiBAcGFyYW0gcGFzc3dvcmQgLSBwYXNzXG4gKiBAcGFyYW0gc2FsdCAtIHNhbHRcbiAqIEBwYXJhbSBvcHRzIC0gcGFyYW1ldGVyc1xuICogLSBgTmAgaXMgY3B1L21lbSB3b3JrIGZhY3RvciAocG93ZXIgb2YgMiBlLmcuIDIqKjE4KVxuICogLSBgcmAgaXMgYmxvY2sgc2l6ZSAoOCBpcyBjb21tb24pLCBmaW5lLXR1bmVzIHNlcXVlbnRpYWwgbWVtb3J5IHJlYWQgc2l6ZSBhbmQgcGVyZm9ybWFuY2VcbiAqIC0gYHBgIGlzIHBhcmFsbGVsaXphdGlvbiBmYWN0b3IgKDEgaXMgY29tbW9uKVxuICogLSBgZGtMZW5gIGlzIG91dHB1dCBrZXkgbGVuZ3RoIGluIGJ5dGVzIGUuZy4gMzIuXG4gKiAtIGBhc3luY1RpY2tgIC0gKGRlZmF1bHQ6IDEwKSBtYXggdGltZSBpbiBtcyBmb3Igd2hpY2ggYXN5bmMgZnVuY3Rpb24gY2FuIGJsb2NrIGV4ZWN1dGlvblxuICogLSBgbWF4bWVtYCAtIChkZWZhdWx0OiBgMTAyNCAqKiAzICsgMTAyNGAgYWthIDFHQisxS0IpLiBBIGxpbWl0IHRoYXQgdGhlIGFwcCBjb3VsZCB1c2UgZm9yIHNjcnlwdFxuICogLSBgb25Qcm9ncmVzc2AgLSBjYWxsYmFjayBmdW5jdGlvbiB0aGF0IHdvdWxkIGJlIGV4ZWN1dGVkIGZvciBwcm9ncmVzcyByZXBvcnRcbiAqIEByZXR1cm5zIERlcml2ZWQga2V5XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzY3J5cHQocGFzc3dvcmQsIHNhbHQsIG9wdHMpIHtcbiAgICBjb25zdCB7IE4sIHIsIHAsIGRrTGVuLCBibG9ja1NpemUzMiwgViwgQjMyLCBCLCB0bXAsIGJsb2NrTWl4Q2IgfSA9IHNjcnlwdEluaXQocGFzc3dvcmQsIHNhbHQsIG9wdHMpO1xuICAgIGZvciAobGV0IHBpID0gMDsgcGkgPCBwOyBwaSsrKSB7XG4gICAgICAgIGNvbnN0IFBpID0gYmxvY2tTaXplMzIgKiBwaTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBibG9ja1NpemUzMjsgaSsrKVxuICAgICAgICAgICAgVltpXSA9IEIzMltQaSArIGldOyAvLyBWWzBdID0gQltpXVxuICAgICAgICBmb3IgKGxldCBpID0gMCwgcG9zID0gMDsgaSA8IE4gLSAxOyBpKyspIHtcbiAgICAgICAgICAgIEJsb2NrTWl4KFYsIHBvcywgViwgKHBvcyArPSBibG9ja1NpemUzMiksIHIpOyAvLyBWW2ldID0gQmxvY2tNaXgoVltpLTFdKTtcbiAgICAgICAgICAgIGJsb2NrTWl4Q2IoKTtcbiAgICAgICAgfVxuICAgICAgICBCbG9ja01peChWLCAoTiAtIDEpICogYmxvY2tTaXplMzIsIEIzMiwgUGksIHIpOyAvLyBQcm9jZXNzIGxhc3QgZWxlbWVudFxuICAgICAgICBibG9ja01peENiKCk7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgTjsgaSsrKSB7XG4gICAgICAgICAgICAvLyBGaXJzdCB1MzIgb2YgdGhlIGxhc3QgNjQtYnl0ZSBibG9jayAodTMyIGlzIExFKVxuICAgICAgICAgICAgY29uc3QgaiA9IEIzMltQaSArIGJsb2NrU2l6ZTMyIC0gMTZdICUgTjsgLy8gaiA9IEludGVncmlmeShYKSAlIGl0ZXJhdGlvbnNcbiAgICAgICAgICAgIGZvciAobGV0IGsgPSAwOyBrIDwgYmxvY2tTaXplMzI7IGsrKylcbiAgICAgICAgICAgICAgICB0bXBba10gPSBCMzJbUGkgKyBrXSBeIFZbaiAqIGJsb2NrU2l6ZTMyICsga107IC8vIHRtcCA9IEIgXiBWW2pdXG4gICAgICAgICAgICBCbG9ja01peCh0bXAsIDAsIEIzMiwgUGksIHIpOyAvLyBCID0gQmxvY2tNaXgoQiBeIFZbal0pXG4gICAgICAgICAgICBibG9ja01peENiKCk7XG4gICAgICAgI
26774H1cbiAgICB9XG4gICAgcmV0dXJuIHNjcnlwdE91dHB1dChwYXNzd29yZCwgZGtMZW4sIEIsIFYsIHRtcCk7XG59XG4vKipcbiAqIFNjcnlwdCBLREYgZnJvbSBSRkMgNzkxNC5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHNjcnlwdEFzeW5jKHBhc3N3b3JkLCBzYWx0LCBvcHRzKSB7XG4gICAgY29uc3QgeyBOLCByLCBwLCBka0xlbiwgYmxvY2tTaXplMzIsIFYsIEIzMiwgQiwgdG1wLCBibG9ja01peENiLCBhc3luY1RpY2sgfSA9IHNjcnlwdEluaXQocGFzc3dvcmQsIHNhbHQsIG9wdHMpO1xuICAgIGZvciAobGV0IHBpID0gMDsgcGkgPCBwOyBwaSsrKSB7XG4gICAgICAgIGNvbnN0IFBpID0gYmxvY2tTaXplMzIgKiBwaTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBibG9ja1NpemUzMjsgaSsrKVxuICAgICAgICAgICAgVltpXSA9IEIzMltQaSArIGldOyAvLyBWWzBdID0gQltpXVxuICAgICAgICBsZXQgcG9zID0gMDtcbiAgICAgICAgYXdhaXQgYXN5bmNMb29wKE4gLSAxLCBhc3luY1RpY2ssICgpID0+IHtcbiAgICAgICAgICAgIEJsb2NrTWl4KFYsIHBvcywgViwgKHBvcyArPSBibG9ja1NpemUzMiksIHIpOyAvLyBWW2ldID0gQmxvY2tNaXgoVltpLTFdKTtcbiAgICAgICAgICAgIGJsb2NrTWl4Q2IoKTtcbiAgICAgICAgfSk7XG4gICAgICAgIEJsb2NrTWl4KFYsIChOIC0gMSkgKiBibG9ja1NpemUzMiwgQjMyLCBQaSwgcik7IC8vIFByb2Nlc3MgbGFzdCBlbGVtZW50XG4gICAgICAgIGJsb2NrTWl4Q2IoKTtcbiAgICAgICAgYXdhaXQgYXN5bmNMb29wKE4sIGFzeW5jVGljaywgKCkgPT4ge1xuICAgICAgICAgICAgLy8gRmlyc3QgdTMyIG9mIHRoZSBsYXN0IDY0LWJ5dGUgYmxvY2sgKHUzMiBpcyBMRSlcbiAgICAgICAgICAgIGNvbnN0IGogPSBCMzJbUGkgKyBibG9ja1NpemUzMiAtIDE2XSAlIE47IC8vIGogPSBJbnRlZ3JpZnkoWCkgJSBpdGVyYXRpb25zXG4gICAgICAgICAgICBmb3IgKGxldCBrID0gMDsgayA8IGJsb2NrU2l6ZTMyOyBrKyspXG4gICAgICAgICAgICAgICAgdG1wW2tdID0gQjMyW1BpICsga10gXiBWW2ogKiBibG9ja1NpemUzMiArIGtdOyAvLyB0bXAgPSBCIF4gVltqXVxuICAgICAgICAgICAgQmxvY2tNaXgodG1wLCAwLCBCMzIsIFBpLCByKTsgLy8gQiA9IEJsb2NrTWl4KEIgXiBWW2pdKVxuICAgICAgICAgICAgYmxvY2tNaXhDYigpO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgcmV0dXJuIHNjcnlwdE91dHB1dChwYXNzd29yZCwgZGtMZW4sIEIsIFYsIHRtcCk7XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1zY3J5cHQuanMubWFwIiwiaW1wb3J0IHsgc2NyeXB0IGFzIF9ub2JsZVN5bmMsIHNjcnlwdEFzeW5jIGFzIF9ub2JsZUFzeW5jIH0gZnJvbSBcIkBub2JsZS9oYXNoZXMvc2NyeXB0XCI7XG5pbXBvcnQgeyBnZXRCeXRlcywgaGV4bGlmeSBhcyBIIH0gZnJvbSBcIi4uL3V0aWxzL2luZGV4LmpzXCI7XG5sZXQgbG9ja2VkU3luYyA9IGZhbHNlLCBsb2NrZWRBc3luYyA9IGZhbHNlO1xuY29uc3QgX3NjcnlwdEFzeW5jID0gYXN5bmMgZnVuY3Rpb24gKHBhc3N3ZCwgc2FsdCwgTiwgciwgcCwgZGtMZW4sIG9uUHJvZ3Jlc3MpIHtcbiAgICByZXR1cm4gYXdhaXQgX25vYmxlQXN5bmMocGFzc3dkLCBzYWx0LCB7IE4sIHIsIHAsIGRrTGVuLCBvblByb2dyZXNzIH0pO1xufTtcbmNvbnN0IF9zY3J5cHRTeW5jID0gZnVuY3Rpb24gKHBhc3N3ZCwgc2FsdCwgTiwgciwgcCwgZGtMZW4pIHtcbiAgICByZXR1cm4gX25vYmxlU3luYyhwYXNzd2QsIHNhbHQsIHsgTiwgciwgcCwgZGtMZW4gfSk7XG59O1xubGV0IF9fc2NyeXB0QXN5bmMgPSBfc2NyeXB0QXN5bmM7XG5sZXQgX19zY3J5cHRTeW5jID0gX3NjcnlwdFN5bmM7XG4vKipcbiAqICBUaGUgW1tsaW5rLXdpa2ktc2NyeXB0XV0gdXNlcyBhIG1lbW9yeSBhbmQgY3B1IGhhcmQgbWV0aG9kIG9mXG4gKiAgZGVyaXZhdGlvbiB0byBpbmNyZWFzZSB0aGUgcmVzb3VyY2UgY29zdCB0byBicnV0ZS1mb3JjZSBhIHBhc3N3b3JkXG4gKiAgZm9yIGEgZ2l2ZW4ga2V5LlxuICpcbiAqICBUaGlzIG1lYW5zIHRoaXMgYWxnb3JpdGhtIGlzIGludGVudGlvbmFsbHkgc2xvdywgYW5kIGNhbiBiZSB0dW5lZCB0b1xuICogIGJlY29tZSBzbG93ZXIuIEFzIGNvbXB1dGF0aW9uIGFuZCBtZW1vcnkgc3BlZWQgaW1wcm92ZSBvdmVyIHRpbWUsXG4gKiAgaW5jcmVhc2luZyB0aGUgZGlmZmljdWx0eSBtYWludGFpbnMgdGhlIGNvc3Qgb2YgYW4gYXR0YWNrZXIuXG4gKlxuICogIEZvciBleGFtcGxlLCBpZiBhIHRhcmdldCB0aW1lIG9mIDUgc2Vjb25kcyBpcyB1c2VkLCBhIGxlZ2l0aW1hdGUgdXNlclxuICogIHdoaWNoIGtub3dzIHRoZWlyIHBhc3N3b3JkIHJlcXVpcmVzIG9ubHkgNSBzZWNvbmRzIHRvIHVubG9jayB0aGVpclxuICogIGFjY291bnQuIEEgNiBjaGFyYWN0ZXIgcGFzc3dvcmQgaGFzIDY4IGJpbGxpb24gcG9zc2liaWxpdGllcywgd2hpY2hcbiAqICB3b3VsZCByZXF1aXJlIGFuIGF0dGFja2VyIHRvIGludmVzdCBvdmVyIDEwLDAwMCB5ZWFycyBvZiBDUFUgdGltZS4gVGhpc1xuICogIGlzIG9mIGNvdXJzZSBhIGNydWRlIGV4YW1wbGUgKGFzIHBhc3N3b3JkIGdlbmVyYWxseSBhcmVuJ3QgcmFuZG9tKSxcbiAqICBidXQgZGVtb25zdHJhdGVzIHRvIHZhbHVlIG9mIGltcG9zaW5nIGxhcmdlIGNvc3RzIHRvIGRlY3J5cHRpb24uXG4gKlxuICogIEZvciB0aGlzIHJlYXNvbiwgaWYgYnVpbGRpbmcgYSBVSSB3aGljaCBpbnZvbHZlZCBkZWNyeXB0aW5nIG9yXG4gKiAgZW5jcnlwdGluZyBkYXRzYSB1c2luZyBzY3J5cHQsIGl0IGlzIHJlY29tbWVuZGVkIHRvIHVzZSBhXG4gKiAgW1tQcm9ncmVzc0NhbGxiYWNrXV0gKGFzIGV2ZW50IHNob3J0IHBlcmlvZHMgY2FuIHNlZW0gbGlrIGFuIGV0ZXJuaXR5XG4gKiAgaWYgdGhlIFVJIGZyZWV6ZXMpLiBJbmNsdWRpbmcgdGhlIHBocmFzZSAvL1wiZGVjcnlwdGluZ1wiLy8gaW4gdGhlIFVJXG4gKiAgY2FuIGFsc28gaGVscCwgYXNzdXJpbmcgdGhlIHVzZXIgdGhlaXIgd2FpdGluZyBpcyBmb3IgYSBnb29kIHJlYXNvbi5cbiAqXG4gKiAgQF9kb2Nsb2M6IGFwaS9jcnlwdG86UGFzc3dvcmRzXG4gKlxuICogIEBleGFtcGxlOlxuICogICAgLy8gVGhlIHBhc3N3b3JkIG11c3QgYmUgY29udmVydGVkIHRvIGJ5dG
26774VzLCBhbmQgaXQgaXMgZ2VuZXJhbGx5XG4gKiAgICAvLyBiZXN0IHByYWN0aWNlcyB0byBlbnN1cmUgdGhlIHN0cmluZyBoYXMgYmVlbiBub3JtYWxpemVkLiBNYW55XG4gKiAgICAvLyBmb3JtYXRzIGV4cGxpY2l0bHkgaW5kaWNhdGUgdGhlIG5vcm1hbGl6YXRpb24gZm9ybSB0byB1c2UuXG4gKiAgICBwYXNzd29yZCA9IFwiaGVsbG9cIlxuICogICAgcGFzc3dvcmRCeXRlcyA9IHRvVXRmOEJ5dGVzKHBhc3N3b3JkLCBcIk5GS0NcIilcbiAqXG4gKiAgICBzYWx0ID0gaWQoXCJzb21lLXNhbHRcIilcbiAqXG4gKiAgICAvLyBDb21wdXRlIHRoZSBzY3J5cHRcbiAqICAgIHNjcnlwdChwYXNzd29yZEJ5dGVzLCBzYWx0LCAxMDI0LCA4LCAxLCAxNilcbiAqICAgIC8vX3Jlc3VsdDpcbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHNjcnlwdChfcGFzc3dkLCBfc2FsdCwgTiwgciwgcCwgZGtMZW4sIHByb2dyZXNzKSB7XG4gICAgY29uc3QgcGFzc3dkID0gZ2V0Qnl0ZXMoX3Bhc3N3ZCwgXCJwYXNzd2RcIik7XG4gICAgY29uc3Qgc2FsdCA9IGdldEJ5dGVzKF9zYWx0LCBcInNhbHRcIik7XG4gICAgcmV0dXJuIEgoYXdhaXQgX19zY3J5cHRBc3luYyhwYXNzd2QsIHNhbHQsIE4sIHIsIHAsIGRrTGVuLCBwcm9ncmVzcykpO1xufVxuc2NyeXB0Ll8gPSBfc2NyeXB0QXN5bmM7XG5zY3J5cHQubG9jayA9IGZ1bmN0aW9uICgpIHsgbG9ja2VkQXN5bmMgPSB0cnVlOyB9O1xuc2NyeXB0LnJlZ2lzdGVyID0gZnVuY3Rpb24gKGZ1bmMpIHtcbiAgICBpZiAobG9ja2VkQXN5bmMpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwic2NyeXB0IGlzIGxvY2tlZFwiKTtcbiAgICB9XG4gICAgX19zY3J5cHRBc3luYyA9IGZ1bmM7XG59O1xuT2JqZWN0LmZyZWV6ZShzY3J5cHQpO1xuLyoqXG4gKiAgUHJvdmlkZXMgYSBzeW5jaHJvbm91cyB2YXJpYW50IG9mIFtbc2NyeXB0XV0uXG4gKlxuICogIFRoaXMgd2lsbCBjb21wbGV0ZWx5IGxvY2sgdXAgYW5kIGZyZWV6ZSB0aGUgVUkgaW4gYSBicm93c2VyIGFuZCB3aWxsXG4gKiAgcHJldmVudCBhbnkgZXZlbnQgbG9vcCBmcm9tIHByb2dyZXNzaW5nLiBGb3IgdGhpcyByZWFzb24sIGl0IGlzXG4gKiAgcHJlZmVycmVkIHRvIHVzZSB0aGUgW2FzeW5jIHZhcmlhbnRdKHNjcnlwdCkuXG4gKlxuICogIEBfZG9jbG9jOiBhcGkvY3J5cHRvOlBhc3N3b3Jkc1xuICpcbiAqICBAZXhhbXBsZTpcbiAqICAgIC8vIFRoZSBwYXNzd29yZCBtdXN0IGJlIGNvbnZlcnRlZCB0byBieXRlcywgYW5kIGl0IGlzIGdlbmVyYWxseVxuICogICAgLy8gYmVzdCBwcmFjdGljZXMgdG8gZW5zdXJlIHRoZSBzdHJpbmcgaGFzIGJlZW4gbm9ybWFsaXplZC4gTWFueVxuICogICAgLy8gZm9ybWF0cyBleHBsaWNpdGx5IGluZGljYXRlIHRoZSBub3JtYWxpemF0aW9uIGZvcm0gdG8gdXNlLlxuICogICAgcGFzc3dvcmQgPSBcImhlbGxvXCJcbiAqICAgIHBhc3N3b3JkQnl0ZXMgPSB0b1V0ZjhCeXRlcyhwYXNzd29yZCwgXCJORktDXCIpXG4gKlxuICogICAgc2FsdCA9IGlkKFwic29tZS1zYWx0XCIpXG4gKlxuICogICAgLy8gQ29tcHV0ZSB0aGUgc2NyeXB0XG4gKiAgICBzY3J5cHRTeW5jKHBhc3N3b3JkQnl0ZXMsIHNhbHQsIDEwMjQsIDgsIDEsIDE2KVxuICogICAgLy9fcmVzdWx0OlxuICovXG5leHBvcnQgZnVuY3Rpb24gc2NyeXB0U3luYyhfcGFzc3dkLCBfc2FsdCwgTiwgciwgcCwgZGtMZW4pIHtcbiAgICBjb25zdCBwYXNzd2QgPSBnZXRCeXRlcyhfcGFzc3dkLCBcInBhc3N3ZFwiKTtcbiAgICBjb25zdCBzYWx0ID0gZ2V0Qnl0ZXMoX3NhbHQsIFwic2FsdFwiKTtcbiAgICByZXR1cm4gSChfX3NjcnlwdFN5bmMocGFzc3dkLCBzYWx0LCBOLCByLCBwLCBka0xlbikpO1xufVxuc2NyeXB0U3luYy5fID0gX3NjcnlwdFN5bmM7XG5zY3J5cHRTeW5jLmxvY2sgPSBmdW5jdGlvbiAoKSB7IGxvY2tlZFN5bmMgPSB0cnVlOyB9O1xuc2NyeXB0U3luYy5yZWdpc3RlciA9IGZ1bmN0aW9uIChmdW5jKSB7XG4gICAgaWYgKGxvY2tlZFN5bmMpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwic2NyeXB0U3luYyBpcyBsb2NrZWRcIik7XG4gICAgfVxuICAgIF9fc2NyeXB0U3luYyA9IGZ1bmM7XG59O1xuT2JqZWN0LmZyZWV6ZShzY3J5cHRTeW5jKTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXNjcnlwdC5qcy5tYXAiLCJpbXBvcnQgeyBjcmVhdGVIYXNoIH0gZnJvbSBcIi4vY3J5cHRvLmpzXCI7XG5pbXBvcnQgeyBnZXRCeXRlcywgaGV4bGlmeSB9IGZyb20gXCIuLi91dGlscy9pbmRleC5qc1wiO1xuY29uc3QgX3NoYTI1NiA9IGZ1bmN0aW9uIChkYXRhKSB7XG4gICAgcmV0dXJuIGNyZWF0ZUhhc2goXCJzaGEyNTZcIikudXBkYXRlKGRhdGEpLmRpZ2VzdCgpO1xufTtcbmNvbnN0IF9zaGE1MTIgPSBmdW5jdGlvbiAoZGF0YSkge1xuICAgIHJldHVybiBjcmVhdGVIYXNoKFwic2hhNTEyXCIpLnVwZGF0ZShkYXRhKS5kaWdlc3QoKTtcbn07XG5sZXQgX19zaGEyNTYgPSBfc2hhMjU2O1xubGV0IF9fc2hhNTEyID0gX3NoYTUxMjtcbmxldCBsb2NrZWQyNTYgPSBmYWxzZSwgbG9ja2VkNTEyID0gZmFsc2U7XG4vKipcbiAqICBDb21wdXRlIHRoZSBjcnlwdG9ncmFwaGljIFNIQTItMjU2IGhhc2ggb2YgJSVkYXRhJSUuXG4gKlxuICogIEBfZG9jbG9jOiBhcGkvY3J5cHRvOkhhc2ggRnVuY3Rpb25zXG4gKiAgQHJldHVybnMgRGF0YUhleHN0cmluZ1xuICpcbiAqICBAZXhhbXBsZTpcbiAqICAgIHNoYTI1NihcIjB4XCIpXG4gKiAgICAvL19yZXN1bHQ6XG4gKlxuICogICAgc2hhMjU2KFwiMHgxMzM3XCIpXG4gKiAgICAvL19yZXN1bHQ6XG4gKlxuICogICAgc2hhMjU2KG5ldyBVaW50OEFycmF5KFsgMHgxMywgMHgzNyBdKSlcbiAqICAgIC8vX3Jlc3VsdDpcbiAqXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzaGEyNTYoX2RhdGEpIHtcbiAgICBjb25zdCBkYXRhID0gZ2V0Qnl0ZXMoX2RhdGEsIFwiZGF0YVwiKTtcbiAgICByZXR1cm4gaGV4bGlmeShfX3NoYTI1NihkYXRhKSk7XG59XG5zaGEyNTYuXyA9IF9zaGEyNTY7XG5zaGEyNTYubG9jayA9IGZ1bmN0aW9uICgpIHsgbG9ja2VkMjU2ID0gdHJ1ZTsgfTtcbnNoYTI1Ni5yZWdpc3RlciA9IGZ1bmN0aW9uIChmdW5jKSB7XG4gICAgaWYgKGxvY2tlZDI1Nikge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJzaGEyNTYgaXMgbG9ja2VkXCIpO1xuICAgIH1cbiAgICBfX3NoYTI1NiA9IGZ1bmM7XG59O1xuT2JqZWN0LmZyZWV6ZShzaGEyNTYpO1xuLyoqXG4gKiAgQ29tcHV0ZSB0aGUgY3J5cHRvZ3JhcGh
26774pYyBTSEEyLTUxMiBoYXNoIG9mICUlZGF0YSUlLlxuICpcbiAqICBAX2RvY2xvYzogYXBpL2NyeXB0bzpIYXNoIEZ1bmN0aW9uc1xuICogIEByZXR1cm5zIERhdGFIZXhzdHJpbmdcbiAqXG4gKiAgQGV4YW1wbGU6XG4gKiAgICBzaGE1MTIoXCIweFwiKVxuICogICAgLy9fcmVzdWx0OlxuICpcbiAqICAgIHNoYTUxMihcIjB4MTMzN1wiKVxuICogICAgLy9fcmVzdWx0OlxuICpcbiAqICAgIHNoYTUxMihuZXcgVWludDhBcnJheShbIDB4MTMsIDB4MzcgXSkpXG4gKiAgICAvL19yZXN1bHQ6XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzaGE1MTIoX2RhdGEpIHtcbiAgICBjb25zdCBkYXRhID0gZ2V0Qnl0ZXMoX2RhdGEsIFwiZGF0YVwiKTtcbiAgICByZXR1cm4gaGV4bGlmeShfX3NoYTUxMihkYXRhKSk7XG59XG5zaGE1MTIuXyA9IF9zaGE1MTI7XG5zaGE1MTIubG9jayA9IGZ1bmN0aW9uICgpIHsgbG9ja2VkNTEyID0gdHJ1ZTsgfTtcbnNoYTUxMi5yZWdpc3RlciA9IGZ1bmN0aW9uIChmdW5jKSB7XG4gICAgaWYgKGxvY2tlZDUxMikge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJzaGE1MTIgaXMgbG9ja2VkXCIpO1xuICAgIH1cbiAgICBfX3NoYTUxMiA9IGZ1bmM7XG59O1xuT2JqZWN0LmZyZWV6ZShzaGEyNTYpO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9c2hhMi5qcy5tYXAiLCIvKiEgbm9ibGUtY3VydmVzIC0gTUlUIExpY2Vuc2UgKGMpIDIwMjIgUGF1bCBNaWxsZXIgKHBhdWxtaWxsci5jb20pICovXG4vLyAxMDAgbGluZXMgb2YgY29kZSBpbiB0aGUgZmlsZSBhcmUgZHVwbGljYXRlZCBmcm9tIG5vYmxlLWhhc2hlcyAodXRpbHMpLlxuLy8gVGhpcyBpcyBPSzogYGFic3RyYWN0YCBkaXJlY3RvcnkgZG9lcyBub3QgdXNlIG5vYmxlLWhhc2hlcy5cbi8vIFVzZXIgbWF5IG9wdC1pbiBpbnRvIHVzaW5nIGRpZmZlcmVudCBoYXNoaW5nIGxpYnJhcnkuIFRoaXMgd2F5LCBub2JsZS1oYXNoZXNcbi8vIHdvbid0IGJlIGluY2x1ZGVkIGludG8gdGhlaXIgYnVuZGxlLlxuY29uc3QgXzBuID0gQmlnSW50KDApO1xuY29uc3QgXzFuID0gQmlnSW50KDEpO1xuY29uc3QgXzJuID0gQmlnSW50KDIpO1xuY29uc3QgdThhID0gKGEpID0+IGEgaW5zdGFuY2VvZiBVaW50OEFycmF5O1xuY29uc3QgaGV4ZXMgPSAvKiBAX19QVVJFX18gKi8gQXJyYXkuZnJvbSh7IGxlbmd0aDogMjU2IH0sIChfLCBpKSA9PiBpLnRvU3RyaW5nKDE2KS5wYWRTdGFydCgyLCAnMCcpKTtcbi8qKlxuICogQGV4YW1wbGUgYnl0ZXNUb0hleChVaW50OEFycmF5LmZyb20oWzB4Y2EsIDB4ZmUsIDB4MDEsIDB4MjNdKSkgLy8gJ2NhZmUwMTIzJ1xuICovXG5leHBvcnQgZnVuY3Rpb24gYnl0ZXNUb0hleChieXRlcykge1xuICAgIGlmICghdThhKGJ5dGVzKSlcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdVaW50OEFycmF5IGV4cGVjdGVkJyk7XG4gICAgLy8gcHJlLWNhY2hpbmcgaW1wcm92ZXMgdGhlIHNwZWVkIDZ4XG4gICAgbGV0IGhleCA9ICcnO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYnl0ZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgaGV4ICs9IGhleGVzW2J5dGVzW2ldXTtcbiAgICB9XG4gICAgcmV0dXJuIGhleDtcbn1cbmV4cG9ydCBmdW5jdGlvbiBudW1iZXJUb0hleFVucGFkZGVkKG51bSkge1xuICAgIGNvbnN0IGhleCA9IG51bS50b1N0cmluZygxNik7XG4gICAgcmV0dXJuIGhleC5sZW5ndGggJiAxID8gYDAke2hleH1gIDogaGV4O1xufVxuZXhwb3J0IGZ1bmN0aW9uIGhleFRvTnVtYmVyKGhleCkge1xuICAgIGlmICh0eXBlb2YgaGV4ICE9PSAnc3RyaW5nJylcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdoZXggc3RyaW5nIGV4cGVjdGVkLCBnb3QgJyArIHR5cGVvZiBoZXgpO1xuICAgIC8vIEJpZyBFbmRpYW5cbiAgICByZXR1cm4gQmlnSW50KGhleCA9PT0gJycgPyAnMCcgOiBgMHgke2hleH1gKTtcbn1cbi8qKlxuICogQGV4YW1wbGUgaGV4VG9CeXRlcygnY2FmZTAxMjMnKSAvLyBVaW50OEFycmF5LmZyb20oWzB4Y2EsIDB4ZmUsIDB4MDEsIDB4MjNdKVxuICovXG5leHBvcnQgZnVuY3Rpb24gaGV4VG9CeXRlcyhoZXgpIHtcbiAgICBpZiAodHlwZW9mIGhleCAhPT0gJ3N0cmluZycpXG4gICAgICAgIHRocm93IG5ldyBFcnJvcignaGV4IHN0cmluZyBleHBlY3RlZCwgZ290ICcgKyB0eXBlb2YgaGV4KTtcbiAgICBjb25zdCBsZW4gPSBoZXgubGVuZ3RoO1xuICAgIGlmIChsZW4gJSAyKVxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ3BhZGRlZCBoZXggc3RyaW5nIGV4cGVjdGVkLCBnb3QgdW5wYWRkZWQgaGV4IG9mIGxlbmd0aCAnICsgbGVuKTtcbiAgICBjb25zdCBhcnJheSA9IG5ldyBVaW50OEFycmF5KGxlbiAvIDIpO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYXJyYXkubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgY29uc3QgaiA9IGkgKiAyO1xuICAgICAgICBjb25zdCBoZXhCeXRlID0gaGV4LnNsaWNlKGosIGogKyAyKTtcbiAgICAgICAgY29uc3QgYnl0ZSA9IE51bWJlci5wYXJzZUludChoZXhCeXRlLCAxNik7XG4gICAgICAgIGlmIChOdW1iZXIuaXNOYU4oYnl0ZSkgfHwgYnl0ZSA8IDApXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgYnl0ZSBzZXF1ZW5jZScpO1xuICAgICAgICBhcnJheVtpXSA9IGJ5dGU7XG4gICAgfVxuICAgIHJldHVybiBhcnJheTtcbn1cbi8vIEJFOiBCaWcgRW5kaWFuLCBMRTogTGl0dGxlIEVuZGlhblxuZXhwb3J0IGZ1bmN0aW9uIGJ5dGVzVG9OdW1iZXJCRShieXRlcykge1xuICAgIHJldHVybiBoZXhUb051bWJlcihieXRlc1RvSGV4KGJ5dGVzKSk7XG59XG5leHBvcnQgZnVuY3Rpb24gYnl0ZXNUb051bWJlckxFKGJ5dGVzKSB7XG4gICAgaWYgKCF1OGEoYnl0ZXMpKVxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1VpbnQ4QXJyYXkgZXhwZWN0ZWQnKTtcbiAgICByZXR1cm4gaGV4VG9OdW1iZXIoYnl0ZXNUb0hleChVaW50OEFycmF5LmZyb20oYnl0ZXMpLnJldmVyc2UoKSkpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIG51bWJlclRvQnl0ZXNCRShuLCBsZW4pIHtcbiAgICByZXR1cm4gaGV4VG9CeXRlcyhuLnRvU3RyaW5nKDE2KS5wYWRTdGFydChsZW4gKiAyLCAnMCcpKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBudW1iZXJUb0J5dGVzTEUobiwgbGVuKSB7XG4gICAgcmV0dXJuIG51bWJlclRvQnl0ZXNCRShuLCBsZW4pLnJldmVyc2UoKTtcbn1cbi8vIFVucGFkZGVkLCByYXJlbHkgdXNlZFxuZXhwb3J0IGZ1bmN0aW9uIG51bWJlclRvVmFyQnl0ZXNCRShuKSB7XG4gICAgcmV0dXJuIGhleFRvQnl0ZXMobnVtYmVyVG9IZXhVbnBhZGRlZChuKSk7XG59XG4vKipcbiAqIFRha2VzIGhleCBzdHJpbmcgb3IgVWludDhBcnJheSwgY29udmVydHMgdG8gVWludDhBcnJheS5cbiAqIFZhbGlkYXRlcyBvdXRwdXQgbGVuZ3RoLlxuICogV2lsbCB0aHJvdyBlcnJvciBmb3Igb3RoZXIgdHlwZXMuXG4gKiBAcGFyYW0gdGl0bGUgZGVzY3JpcHRpdmUgdGl0bGUgZm9yIGFuIGVycm9yIGUuZy4gJ3ByaXZhdGUga2V5J1xuICogQHBhcmFtIGhleCBoZXggc3RyaW5nIG9yIFVpbnQ4QXJyYXlcbiAqIEBwYXJhbSBleHBlY3RlZExlbmd0aCBvcHRpb25hbCwgd2lsbCBjb21wYXJlIHRvIHJlc3VsdCBhcnJheSdzIGxlbmd0aFxuICogQHJldHVybnNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGVuc3VyZUJ5dGVzKHRpdGxlLCBoZXgsIGV4cGVjdGVkTGVuZ3RoKSB7XG4gICAgbGV0IHJlcztcbiAgICBpZiAodHlwZW9mIGhleCA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgI
26774HJlcyA9IGhleFRvQnl0ZXMoaGV4KTtcbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGAke3RpdGxlfSBtdXN0IGJlIHZhbGlkIGhleCBzdHJpbmcsIGdvdCBcIiR7aGV4fVwiLiBDYXVzZTogJHtlfWApO1xuICAgICAgICB9XG4gICAgfVxuICAgIGVsc2UgaWYgKHU4YShoZXgpKSB7XG4gICAgICAgIC8vIFVpbnQ4QXJyYXkuZnJvbSgpIGluc3RlYWQgb2YgaGFzaC5zbGljZSgpIGJlY2F1c2Ugbm9kZS5qcyBCdWZmZXJcbiAgICAgICAgLy8gaXMgaW5zdGFuY2Ugb2YgVWludDhBcnJheSwgYW5kIGl0cyBzbGljZSgpIGNyZWF0ZXMgKiptdXRhYmxlKiogY29weVxuICAgICAgICByZXMgPSBVaW50OEFycmF5LmZyb20oaGV4KTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgJHt0aXRsZX0gbXVzdCBiZSBoZXggc3RyaW5nIG9yIFVpbnQ4QXJyYXlgKTtcbiAgICB9XG4gICAgY29uc3QgbGVuID0gcmVzLmxlbmd0aDtcbiAgICBpZiAodHlwZW9mIGV4cGVjdGVkTGVuZ3RoID09PSAnbnVtYmVyJyAmJiBsZW4gIT09IGV4cGVjdGVkTGVuZ3RoKVxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYCR7dGl0bGV9IGV4cGVjdGVkICR7ZXhwZWN0ZWRMZW5ndGh9IGJ5dGVzLCBnb3QgJHtsZW59YCk7XG4gICAgcmV0dXJuIHJlcztcbn1cbi8qKlxuICogQ29waWVzIHNldmVyYWwgVWludDhBcnJheXMgaW50byBvbmUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjb25jYXRCeXRlcyguLi5hcnJheXMpIHtcbiAgICBjb25zdCByID0gbmV3IFVpbnQ4QXJyYXkoYXJyYXlzLnJlZHVjZSgoc3VtLCBhKSA9PiBzdW0gKyBhLmxlbmd0aCwgMCkpO1xuICAgIGxldCBwYWQgPSAwOyAvLyB3YWxrIHRocm91Z2ggZWFjaCBpdGVtLCBlbnN1cmUgdGhleSBoYXZlIHByb3BlciB0eXBlXG4gICAgYXJyYXlzLmZvckVhY2goKGEpID0+IHtcbiAgICAgICAgaWYgKCF1OGEoYSkpXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1VpbnQ4QXJyYXkgZXhwZWN0ZWQnKTtcbiAgICAgICAgci5zZXQoYSwgcGFkKTtcbiAgICAgICAgcGFkICs9IGEubGVuZ3RoO1xuICAgIH0pO1xuICAgIHJldHVybiByO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGVxdWFsQnl0ZXMoYjEsIGIyKSB7XG4gICAgLy8gV2UgZG9uJ3QgY2FyZSBhYm91dCB0aW1pbmcgYXR0YWNrcyBoZXJlXG4gICAgaWYgKGIxLmxlbmd0aCAhPT0gYjIubGVuZ3RoKVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBiMS5sZW5ndGg7IGkrKylcbiAgICAgICAgaWYgKGIxW2ldICE9PSBiMltpXSlcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICByZXR1cm4gdHJ1ZTtcbn1cbi8qKlxuICogQGV4YW1wbGUgdXRmOFRvQnl0ZXMoJ2FiYycpIC8vIG5ldyBVaW50OEFycmF5KFs5NywgOTgsIDk5XSlcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHV0ZjhUb0J5dGVzKHN0cikge1xuICAgIGlmICh0eXBlb2Ygc3RyICE9PSAnc3RyaW5nJylcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGB1dGY4VG9CeXRlcyBleHBlY3RlZCBzdHJpbmcsIGdvdCAke3R5cGVvZiBzdHJ9YCk7XG4gICAgcmV0dXJuIG5ldyBVaW50OEFycmF5KG5ldyBUZXh0RW5jb2RlcigpLmVuY29kZShzdHIpKTsgLy8gaHR0cHM6Ly9idWd6aWwubGEvMTY4MTgwOVxufVxuLy8gQml0IG9wZXJhdGlvbnNcbi8qKlxuICogQ2FsY3VsYXRlcyBhbW91bnQgb2YgYml0cyBpbiBhIGJpZ2ludC5cbiAqIFNhbWUgYXMgYG4udG9TdHJpbmcoMikubGVuZ3RoYFxuICovXG5leHBvcnQgZnVuY3Rpb24gYml0TGVuKG4pIHtcbiAgICBsZXQgbGVuO1xuICAgIGZvciAobGVuID0gMDsgbiA+IF8wbjsgbiA+Pj0gXzFuLCBsZW4gKz0gMSlcbiAgICAgICAgO1xuICAgIHJldHVybiBsZW47XG59XG4vKipcbiAqIEdldHMgc2luZ2xlIGJpdCBhdCBwb3NpdGlvbi5cbiAqIE5PVEU6IGZpcnN0IGJpdCBwb3NpdGlvbiBpcyAwIChzYW1lIGFzIGFycmF5cylcbiAqIFNhbWUgYXMgYCEhK0FycmF5LmZyb20obi50b1N0cmluZygyKSkucmV2ZXJzZSgpW3Bvc11gXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBiaXRHZXQobiwgcG9zKSB7XG4gICAgcmV0dXJuIChuID4+IEJpZ0ludChwb3MpKSAmIF8xbjtcbn1cbi8qKlxuICogU2V0cyBzaW5nbGUgYml0IGF0IHBvc2l0aW9uLlxuICovXG5leHBvcnQgY29uc3QgYml0U2V0ID0gKG4sIHBvcywgdmFsdWUpID0+IHtcbiAgICByZXR1cm4gbiB8ICgodmFsdWUgPyBfMW4gOiBfMG4pIDw8IEJpZ0ludChwb3MpKTtcbn07XG4vKipcbiAqIENhbGN1bGF0ZSBtYXNrIGZvciBOIGJpdHMuIE5vdCB1c2luZyAqKiBvcGVyYXRvciB3aXRoIGJpZ2ludHMgYmVjYXVzZSBvZiBvbGQgZW5naW5lcy5cbiAqIFNhbWUgYXMgQmlnSW50KGAwYiR7QXJyYXkoaSkuZmlsbCgnMScpLmpvaW4oJycpfWApXG4gKi9cbmV4cG9ydCBjb25zdCBiaXRNYXNrID0gKG4pID0+IChfMm4gPDwgQmlnSW50KG4gLSAxKSkgLSBfMW47XG4vLyBEUkJHXG5jb25zdCB1OG4gPSAoZGF0YSkgPT4gbmV3IFVpbnQ4QXJyYXkoZGF0YSk7IC8vIGNyZWF0ZXMgVWludDhBcnJheVxuY29uc3QgdThmciA9IChhcnIpID0+IFVpbnQ4QXJyYXkuZnJvbShhcnIpOyAvLyBhbm90aGVyIHNob3J0Y3V0XG4vKipcbiAqIE1pbmltYWwgSE1BQy1EUkJHIGZyb20gTklTVCA4MDAtOTAgZm9yIFJGQzY5Nzkgc2lncy5cbiAqIEByZXR1cm5zIGZ1bmN0aW9uIHRoYXQgd2lsbCBjYWxsIERSQkcgdW50aWwgMm5kIGFyZyByZXR1cm5zIHNvbWV0aGluZyBtZWFuaW5nZnVsXG4gKiBAZXhhbXBsZVxuICogICBjb25zdCBkcmJnID0gY3JlYXRlSG1hY0RSQkc8S2V5PigzMiwgMzIsIGhtYWMpO1xuICogICBkcmJnKHNlZWQsIGJ5dGVzVG9LZXkpOyAvLyBieXRlc1RvS2V5IG11c3QgcmV0dXJuIEtleSBvciB1bmRlZmluZWRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUhtYWNEcmJnKGhhc2hMZW4sIHFCeXRlTGVuLCBobWFjRm4pIHtcbiAgICBpZiAodHlwZW9mIGhhc2hMZW4gIT09ICdudW1iZXInIHx8IGhhc2hMZW4gPCAyKVxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2hhc2hMZW4gbXVzdCBiZSBhIG51bWJlcicpO1xuICAgIGlmICh0eXBlb2YgcUJ5dGVMZW4gIT09ICdudW1iZXInIHx8IHFCeXRlTGVuIDwgMilcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdxQnl0ZUxlbiBtdXN0IGJlIGEgbnVtYmVyJyk7XG4gICAgaWYgKHR5cGVvZiBobWFjRm4gIT09ICdmdW5jdGlvbicpXG4gICAgICAgI
26774HRocm93IG5ldyBFcnJvcignaG1hY0ZuIG11c3QgYmUgYSBmdW5jdGlvbicpO1xuICAgIC8vIFN0ZXAgQiwgU3RlcCBDOiBzZXQgaGFzaExlbiB0byA4KmNlaWwoaGxlbi84KVxuICAgIGxldCB2ID0gdThuKGhhc2hMZW4pOyAvLyBNaW5pbWFsIG5vbi1mdWxsLXNwZWMgSE1BQy1EUkJHIGZyb20gTklTVCA4MDAtOTAgZm9yIFJGQzY5Nzkgc2lncy5cbiAgICBsZXQgayA9IHU4bihoYXNoTGVuKTsgLy8gU3RlcHMgQiBhbmQgQyBvZiBSRkM2OTc5IDMuMjogc2V0IGhhc2hMZW4sIGluIG91ciBjYXNlIGFsd2F5cyBzYW1lXG4gICAgbGV0IGkgPSAwOyAvLyBJdGVyYXRpb25zIGNvdW50ZXIsIHdpbGwgdGhyb3cgd2hlbiBvdmVyIDEwMDBcbiAgICBjb25zdCByZXNldCA9ICgpID0+IHtcbiAgICAgICAgdi5maWxsKDEpO1xuICAgICAgICBrLmZpbGwoMCk7XG4gICAgICAgIGkgPSAwO1xuICAgIH07XG4gICAgY29uc3QgaCA9ICguLi5iKSA9PiBobWFjRm4oaywgdiwgLi4uYik7IC8vIGhtYWMoaykodiwgLi4udmFsdWVzKVxuICAgIGNvbnN0IHJlc2VlZCA9IChzZWVkID0gdThuKCkpID0+IHtcbiAgICAgICAgLy8gSE1BQy1EUkJHIHJlc2VlZCgpIGZ1bmN0aW9uLiBTdGVwcyBELUdcbiAgICAgICAgayA9IGgodThmcihbMHgwMF0pLCBzZWVkKTsgLy8gayA9IGhtYWMoayB8fCB2IHx8IDB4MDAgfHwgc2VlZClcbiAgICAgICAgdiA9IGgoKTsgLy8gdiA9IGhtYWMoayB8fCB2KVxuICAgICAgICBpZiAoc2VlZC5sZW5ndGggPT09IDApXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIGsgPSBoKHU4ZnIoWzB4MDFdKSwgc2VlZCk7IC8vIGsgPSBobWFjKGsgfHwgdiB8fCAweDAxIHx8IHNlZWQpXG4gICAgICAgIHYgPSBoKCk7IC8vIHYgPSBobWFjKGsgfHwgdilcbiAgICB9O1xuICAgIGNvbnN0IGdlbiA9ICgpID0+IHtcbiAgICAgICAgLy8gSE1BQy1EUkJHIGdlbmVyYXRlKCkgZnVuY3Rpb25cbiAgICAgICAgaWYgKGkrKyA+PSAxMDAwKVxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdkcmJnOiB0cmllZCAxMDAwIHZhbHVlcycpO1xuICAgICAgICBsZXQgbGVuID0gMDtcbiAgICAgICAgY29uc3Qgb3V0ID0gW107XG4gICAgICAgIHdoaWxlIChsZW4gPCBxQnl0ZUxlbikge1xuICAgICAgICAgICAgdiA9IGgoKTtcbiAgICAgICAgICAgIGNvbnN0IHNsID0gdi5zbGljZSgpO1xuICAgICAgICAgICAgb3V0LnB1c2goc2wpO1xuICAgICAgICAgICAgbGVuICs9IHYubGVuZ3RoO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBjb25jYXRCeXRlcyguLi5vdXQpO1xuICAgIH07XG4gICAgY29uc3QgZ2VuVW50aWwgPSAoc2VlZCwgcHJlZCkgPT4ge1xuICAgICAgICByZXNldCgpO1xuICAgICAgICByZXNlZWQoc2VlZCk7IC8vIFN0ZXBzIEQtR1xuICAgICAgICBsZXQgcmVzID0gdW5kZWZpbmVkOyAvLyBTdGVwIEg6IGdyaW5kIHVudGlsIGsgaXMgaW4gWzEuLm4tMV1cbiAgICAgICAgd2hpbGUgKCEocmVzID0gcHJlZChnZW4oKSkpKVxuICAgICAgICAgICAgcmVzZWVkKCk7XG4gICAgICAgIHJlc2V0KCk7XG4gICAgICAgIHJldHVybiByZXM7XG4gICAgfTtcbiAgICByZXR1cm4gZ2VuVW50aWw7XG59XG4vLyBWYWxpZGF0aW5nIGN1cnZlcyBhbmQgZmllbGRzXG5jb25zdCB2YWxpZGF0b3JGbnMgPSB7XG4gICAgYmlnaW50OiAodmFsKSA9PiB0eXBlb2YgdmFsID09PSAnYmlnaW50JyxcbiAgICBmdW5jdGlvbjogKHZhbCkgPT4gdHlwZW9mIHZhbCA9PT0gJ2Z1bmN0aW9uJyxcbiAgICBib29sZWFuOiAodmFsKSA9PiB0eXBlb2YgdmFsID09PSAnYm9vbGVhbicsXG4gICAgc3RyaW5nOiAodmFsKSA9PiB0eXBlb2YgdmFsID09PSAnc3RyaW5nJyxcbiAgICBzdHJpbmdPclVpbnQ4QXJyYXk6ICh2YWwpID0+IHR5cGVvZiB2YWwgPT09ICdzdHJpbmcnIHx8IHZhbCBpbnN0YW5jZW9mIFVpbnQ4QXJyYXksXG4gICAgaXNTYWZlSW50ZWdlcjogKHZhbCkgPT4gTnVtYmVyLmlzU2FmZUludGVnZXIodmFsKSxcbiAgICBhcnJheTogKHZhbCkgPT4gQXJyYXkuaXNBcnJheSh2YWwpLFxuICAgIGZpZWxkOiAodmFsLCBvYmplY3QpID0+IG9iamVjdC5GcC5pc1ZhbGlkKHZhbCksXG4gICAgaGFzaDogKHZhbCkgPT4gdHlwZW9mIHZhbCA9PT0gJ2Z1bmN0aW9uJyAmJiBOdW1iZXIuaXNTYWZlSW50ZWdlcih2YWwub3V0cHV0TGVuKSxcbn07XG4vLyB0eXBlIFJlY29yZDxLIGV4dGVuZHMgc3RyaW5nIHwgbnVtYmVyIHwgc3ltYm9sLCBUPiA9IHsgW1AgaW4gS106IFQ7IH1cbmV4cG9ydCBmdW5jdGlvbiB2YWxpZGF0ZU9iamVjdChvYmplY3QsIHZhbGlkYXRvcnMsIG9wdFZhbGlkYXRvcnMgPSB7fSkge1xuICAgIGNvbnN0IGNoZWNrRmllbGQgPSAoZmllbGROYW1lLCB0eXBlLCBpc09wdGlvbmFsKSA9PiB7XG4gICAgICAgIGNvbnN0IGNoZWNrVmFsID0gdmFsaWRhdG9yRm5zW3R5cGVdO1xuICAgICAgICBpZiAodHlwZW9mIGNoZWNrVmFsICE9PSAnZnVuY3Rpb24nKVxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIHZhbGlkYXRvciBcIiR7dHlwZX1cIiwgZXhwZWN0ZWQgZnVuY3Rpb25gKTtcbiAgICAgICAgY29uc3QgdmFsID0gb2JqZWN0W2ZpZWxkTmFtZV07XG4gICAgICAgIGlmIChpc09wdGlvbmFsICYmIHZhbCA9PT0gdW5kZWZpbmVkKVxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICBpZiAoIWNoZWNrVmFsKHZhbCwgb2JqZWN0KSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIHBhcmFtICR7U3RyaW5nKGZpZWxkTmFtZSl9PSR7dmFsfSAoJHt0eXBlb2YgdmFsfSksIGV4cGVjdGVkICR7dHlwZX1gKTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgZm9yIChjb25zdCBbZmllbGROYW1lLCB0eXBlXSBvZiBPYmplY3QuZW50cmllcyh2YWxpZGF0b3JzKSlcbiAgICAgICAgY2hlY2tGaWVsZChmaWVsZE5hbWUsIHR5cGUsIGZhbHNlKTtcbiAgICBmb3IgKGNvbnN0IFtmaWVsZE5hbWUsIHR5cGVdIG9mIE9iamVjdC5lbnRyaWVzKG9wdFZhbGlkYXRvcnMpKVxuICAgICAgICBjaGVja0ZpZWxkKGZpZWxkTmFtZSwgdHlwZSwgdHJ1ZSk7XG4gICAgcmV0dXJuIG9iamVjdDtcbn1cbi8vIHZhbGlkYXRlIHR5cGUgdGVzdHNcbi8vIGNvbnN0IG86IHsgYTogbnVtYmVyOyBiOiBudW1iZXI7IGM6IG51bWJlciB9ID0geyBhOiAxLCBiOiA1LCBjOiA2IH07XG4vLyBjb25zdCB6MCA9IHZhbGlkYXRlT2JqZWN0KG8sIHsgYTogJ2lzU2FmZUludGVnZXInIH0sIHsgYzogJ2JpZ2ludCcgfSk7IC8vIE9rIVxuLy8gLy8gU2hvdWxkIGZhaWwgdHlwZS1jaGVja1xuLy8gY29uc3QgejEgPSB2YWxpZGF0ZU9iamVjdChvLCB7IGE6ICd0bXAnIH0sIHsgYzogJ3p6JyB9KTtcbi8vIGNvbnN0IHoyID0gdmFsaWRhdGVPYmplY3QobywgeyBhOiAnaXNTYWZlSW50ZWdlcicgfSwgeyBjOiAnenonIH0pO1xuLy8gY29uc3QgejMgPSB2YWxpZGF0ZU9iamVjdChvLCB7IHRlc3Q6ICdib29sZWFuJywgejogJ2J1ZycgfSk7XG4vLyBjb25zdCB6NCA9IHZhbGlkYXRlT2JqZWN0KG8sIHsgYTogJ2Jvb2xlYW4nLCB6OiAnYnVnJyB9KTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXV0aWxzLmpzLm1hcCIsIi8qISBub2JsZS1jdXJ2ZXMgLSBNSVQgTGljZW5zZSAoYykgMjAyMiBQYXVsIE1pbGxlciAocGF1bG1pbGxyLmNvbSkgKi9cbi8vIFV0aWxpdGllcyBmb3IgbW9kdWxhciBhcml0aG1ldGljcyBhbmQgZmluaXRlIGZpZWxkc1xuaW1wb3J0IHsgYml0TWFzaywgbnVtYmVyVG9CeXRlc0JFLCBudW1iZXJUb0J5dGVzTEUsIGJ5dGVzVG9OdW1iZXJCRSwgYnl0ZXNUb051bWJlckxFLCBlbnN1cmVCeXRlcywgdmFsaWRhdGVPYmplY3QsIH0gZnJvbSAnLi91dGlscy5qcyc7XG4vLyBwcmV0dGllci1pZ25vcmVcbmNvbnN0IF8wbiA9IEJpZ0ludCgwKSwgXzFuID0gQmlnSW50KDEpLCBfMm4gPSBCaWdJbnQoMiksIF8zbiA9IEJpZ0ludCgzKTtcbi8vIHByZXR0aWVyLWlnbm9yZVxuY29uc3QgXzRuID0gQmlnSW50KDQpLCBfNW4gPSBCaWdJbnQoNSksIF84biA9IEJpZ0ludCg4KTtcbi8vIHByZXR0aWVyLWlnbm9yZVxuY29uc3QgXzluID0gQmlnSW50KDkpLCBfMTZuID0gQmlnSW50KDE2KTtcbi8vIENhbGN1bGF0ZXMgYSBtb2R1bG8gYlxuZXhwb3J0IGZ1bmN0aW9uIG1vZChhLCBiKSB7XG4gICAgY29uc3QgcmVzdWx0ID0gYSAlIGI7XG4gICAgcmV0dXJuIHJlc3VsdCA+PSBfMG4gPyByZXN1bHQgOiBiICsgcmVzdWx0O1xufVxuLyoqXG4gKiBFZmZpY2llbnRseSByYWlzZSBudW0gdG8gcG93ZXIgYW5kIGRvIG1vZHVsYXIgZGl2aXNpb24uXG4gKiBVbnNhZmUgaW4gc29tZSBjb250ZXh0czogdXNlcyBsYWRkZXIsIHNvIGNhbiBleHBvc2UgYmlnaW50IGJpdHMuXG4gKiBAZXhhbXBsZVxuICogcG93KDJuLCA2biwgMTFuKSAvLyA2NG4gJSAxMW4gPT
267740gOW5cbiAqL1xuLy8gVE9ETzogdXNlIGZpZWxkIHZlcnNpb24gJiYgcmVtb3ZlXG5leHBvcnQgZnVuY3Rpb24gcG93KG51bSwgcG93ZXIsIG1vZHVsbykge1xuICAgIGlmIChtb2R1bG8gPD0gXzBuIHx8IHBvd2VyIDwgXzBuKVxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0V4cGVjdGVkIHBvd2VyL21vZHVsbyA+IDAnKTtcbiAgICBpZiAobW9kdWxvID09PSBfMW4pXG4gICAgICAgIHJldHVybiBfMG47XG4gICAgbGV0IHJlcyA9IF8xbjtcbiAgICB3aGlsZSAocG93ZXIgPiBfMG4pIHtcbiAgICAgICAgaWYgKHBvd2VyICYgXzFuKVxuICAgICAgICAgICAgcmVzID0gKHJlcyAqIG51bSkgJSBtb2R1bG87XG4gICAgICAgIG51bSA9IChudW0gKiBudW0pICUgbW9kdWxvO1xuICAgICAgICBwb3dlciA+Pj0gXzFuO1xuICAgIH1cbiAgICByZXR1cm4gcmVzO1xufVxuLy8gRG9lcyB4IF4gKDIgXiBwb3dlcikgbW9kIHAuIHBvdzIoMzAsIDQpID09IDMwIF4gKDIgXiA0KVxuZXhwb3J0IGZ1bmN0aW9uIHBvdzIoeCwgcG93ZXIsIG1vZHVsbykge1xuICAgIGxldCByZXMgPSB4O1xuICAgIHdoaWxlIChwb3dlci0tID4gXzBuKSB7XG4gICAgICAgIHJlcyAqPSByZXM7XG4gICAgICAgIHJlcyAlPSBtb2R1bG87XG4gICAgfVxuICAgIHJldHVybiByZXM7XG59XG4vLyBJbnZlcnNlcyBudW1iZXIgb3ZlciBtb2R1bG9cbmV4cG9ydCBmdW5jdGlvbiBpbnZlcnQobnVtYmVyLCBtb2R1bG8pIHtcbiAgICBpZiAobnVtYmVyID09PSBfMG4gfHwgbW9kdWxvIDw9IF8wbikge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYGludmVydDogZXhwZWN0ZWQgcG9zaXRpdmUgaW50ZWdlcnMsIGdvdCBuPSR7bnVtYmVyfSBtb2Q9JHttb2R1bG99YCk7XG4gICAgfVxuICAgIC8vIEV1Y2xpZGVhbiBHQ0QgaHR0cHM6Ly9icmlsbGlhbnQub3JnL3dpa2kvZXh0ZW5kZWQtZXVjbGlkZWFuLWFsZ29yaXRobS9cbiAgICAvLyBGZXJtYXQncyBsaXR0bGUgdGhlb3JlbSBcIkNULWxpa2VcIiB2ZXJzaW9uIGludihuKSA9IG5eKG0tMikgbW9kIG0gaXMgMzB4IHNsb3dlci5cbiAgICBsZXQgYSA9IG1vZChudW1iZXIsIG1vZHVsbyk7XG4gICAgbGV0IGIgPSBtb2R1bG87XG4gICAgLy8gcHJldHRpZXItaWdub3JlXG4gICAgbGV0IHggPSBfMG4sIHkgPSBfMW4sIHUgPSBfMW4sIHYgPSBfMG47XG4gICAgd2hpbGUgKGEgIT09IF8wbikge1xuICAgICAgICAvLyBKSVQgYXBwbGllcyBvcHRpbWl6YXRpb24gaWYgdGhvc2UgdHdvIGxpbmVzIGZvbGxvdyBlYWNoIG90aGVyXG4gICAgICAgIGNvbnN0IHEgPSBiIC8gYTtcbiAgICAgICAgY29uc3QgciA9IGIgJSBhO1xuICAgICAgICBjb25zdCBtID0geCAtIHUgKiBxO1xuICAgICAgICBjb25zdCBuID0geSAtIHYgKiBxO1xuICAgICAgICAvLyBwcmV0dGllci1pZ25vcmVcbiAgICAgICAgYiA9IGEsIGEgPSByLCB4ID0gdSwgeSA9IHYsIHUgPSBtLCB2ID0gbjtcbiAgICB9XG4gICAgY29uc3QgZ2NkID0gYjtcbiAgICBpZiAoZ2NkICE9PSBfMW4pXG4gICAgICAgIHRocm93IG5ldyBFcnJvcignaW52ZXJ0OiBkb2VzIG5vdCBleGlzdCcpO1xuICAgIHJldHVybiBtb2QoeCwgbW9kdWxvKTtcbn1cbi8qKlxuICogVG9uZWxsaS1TaGFua3Mgc3F1YXJlIHJvb3Qgc2VhcmNoIGFsZ29yaXRobS5cbiAqIDEuIGh0dHBzOi8vZXByaW50LmlhY3Iub3JnLzIwMTIvNjg1LnBkZiAocGFnZSAxMilcbiAqIDIuIFNxdWFyZSBSb290cyBmcm9tIDE7IDI0LCA1MSwgMTAgdG8gRGFuIFNoYW5rc1xuICogV2lsbCBzdGFydCBhbiBpbmZpbml0ZSBsb29wIGlmIGZpZWxkIG9yZGVyIFAgaXMgbm90IHByaW1lLlxuICogQHBhcmFtIFAgZmllbGQgb3JkZXJcbiAqIEByZXR1cm5zIGZ1bmN0aW9uIHRoYXQgdGFrZXMgZmllbGQgRnAgKGNyZWF0ZWQgZnJvbSBQKSBhbmQgbnVtYmVyIG5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRvbmVsbGlTaGFua3MoUCkge1xuICAgIC8vIExlZ2VuZHJlIGNvbnN0YW50OiB1c2VkIHRvIGNhbGN1bGF0ZSBMZWdlbmRyZSBzeW1ib2wgKGEgfCBwKSxcbiAgICAvLyB3aGljaCBkZW5vdGVzIHRoZSB2YWx1ZSBvZiBhXigocC0xKS8yKSAobW9kIHApLlxuICAgIC8vIChhIHwgcCkg4omhIDEgICAgaWYgYSBpcyBhIHNxdWFyZSAobW9kIHApXG4gICAgLy8gKGEgfCBwKSDiiaEgLTEgICBpZiBhIGlzIG5vdCBhIHNxdWFyZSAobW9kIHApXG4gICAgLy8gKGEgfCBwKSDiiaEgMCAgICBpZiBhIOKJoSAwIChtb2QgcClcbiAgICBjb25zdCBsZWdlbmRyZUMgPSAoUCAtIF8xbikgLyBfMm47XG4gICAgbGV0IFEsIFMsIFo7XG4gICAgLy8gU3RlcCAxOiBCeSBmYWN0b3Jpbmcgb3V0IHBvd2VycyBvZiAyIGZyb20gcCAtIDEsXG4gICAgLy8gZmluZCBxIGFuZCBzIHN1Y2ggdGhhdCBwIC0gMSA9IHEqKDJecykgd2l0aCBxIG9kZFxuICAgIGZvciAoUSA9IFAgLSBfMW4sIFMgPSAwOyBRICUgXzJuID09PSBfMG47IFEgLz0gXzJuLCBTKyspXG4gICAgICAgIDtcbiAgICAvLyBTdGVwIDI6IFNlbGVjdCBhIG5vbi1zcXVhcmUgeiBzdWNoIHRoYXQgKHogfCBwKSDiiaEgLTEgYW5kIHNldCBjIOKJoSB6cVxuICAgIGZvciAoWiA9IF8ybjsgWiA8IFAgJiYgcG93KFosIGxlZ2VuZHJlQywgUCkgIT09IFAgLSBfMW47IForKylcbiAgICAgICAgO1xuICAgIC8vIEZhc3QtcGF0aFxuICAgIGlmIChTID09PSAxKSB7XG4gICAgICAgIGNvbnN0IHAxZGl2NCA9IChQICsgXzFuKSAvIF80bjtcbiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uIHRvbmVsbGlGYXN0KEZwLCBuKSB7XG4gICAgICAgICAgICBjb25zdCByb290ID0gRnAucG93KG4sIHAxZGl2NCk7XG4gICAgICAgICAgICBpZiAoIUZwLmVxbChGcC5zcXIocm9vdCksIG4pKVxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignQ2Fubm90IGZpbmQgc3F1YXJlIHJvb3QnKTtcbiAgICAgICAgICAgIHJldHVybiByb290O1xuICAgICAgICB9O1xuICAgIH1cbiAgICAvLyBTbG93LXBhdGhcbiAgICBjb25zdCBRMWRpdjIgPSAoUSArIF8xbikgLyBfMm47XG4gICAgcmV0dXJuIGZ1bmN0aW9uIHRvbmVsbGlTbG93KEZwLCBuKSB7XG4gICAgICAgIC8vIFN0ZXAgMDogQ2hlY2sgdGhhdCBuIGlzIGluZGVlZCBhIHNxdWFyZTogKG4gfCBwKSBzaG91bGQgbm90IGJlIOKJoSAtMVxuICAgICAgICBpZiAoRnAucG93KG4sIGxlZ2VuZHJlQykgPT09IEZwLm5lZyhGcC5PTkUpKVxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdDYW5ub3QgZmluZCBzcXVhcmUgcm9vdCcpO1xuICAgICAgICBsZXQgciA9IFM7XG4gICAgICAgIC8vIFRPRE86IHdpbGwgZmFpbCBhdCBGcDIvZXRjXG4gICAgICAgIGxldCBnID0gRnAucG93KEZwLm11bChGcC5PTkUsIFopLCBRKTsgLy8gd2lsbCB1cGRhdGUgYm90aCB4IGFuZCBiXG4gICAgICAgIGxldCB4ID0gRnAucG93KG4sIFExZGl2Mik7IC8vIGZpcnN0IGd1ZXNzIGF0IHRoZSBzcXVhcmUgcm9vdFxuICAgICAgICBsZXQgYiA9IEZwLnBvdyhuLCBRKTsgLy8gZmlyc3QgZ3Vlc3MgYXQgdGhlIGZ1ZGdlIGZhY3RvclxuICAgICAgICB3aGlsZSAoIUZwLmVxbChiLCBGcC5PTkUpKSB7XG4gICAgICAgICAgICBpZiAoRnAuZXFsKGIsIEZwLlpFUk8pKVxuICAgICAgICAgICAgICAgI
26774HJldHVybiBGcC5aRVJPOyAvLyBodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9Ub25lbGxpJUUyJTgwJTkzU2hhbmtzX2FsZ29yaXRobSAoNC4gSWYgdCA9IDAsIHJldHVybiByID0gMClcbiAgICAgICAgICAgIC8vIEZpbmQgbSBzdWNoIGJeKDJebSk9PTFcbiAgICAgICAgICAgIGxldCBtID0gMTtcbiAgICAgICAgICAgIGZvciAobGV0IHQyID0gRnAuc3FyKGIpOyBtIDwgcjsgbSsrKSB7XG4gICAgICAgICAgICAgICAgaWYgKEZwLmVxbCh0MiwgRnAuT05FKSlcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgdDIgPSBGcC5zcXIodDIpOyAvLyB0MiAqPSB0MlxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gTk9URTogci1tLTEgY2FuIGJlIGJpZ2dlciB0aGFuIDMyLCBuZWVkIHRvIGNvbnZlcnQgdG8gYmlnaW50IGJlZm9yZSBzaGlmdCwgb3RoZXJ3aXNlIHRoZXJlIHdpbGwgYmUgb3ZlcmZsb3dcbiAgICAgICAgICAgIGNvbnN0IGdlID0gRnAucG93KGcsIF8xbiA8PCBCaWdJbnQociAtIG0gLSAxKSk7IC8vIGdlID0gMl4oci1tLTEpXG4gICAgICAgICAgICBnID0gRnAuc3FyKGdlKTsgLy8gZyA9IGdlICogZ2VcbiAgICAgICAgICAgIHggPSBGcC5tdWwoeCwgZ2UpOyAvLyB4ICo9IGdlXG4gICAgICAgICAgICBiID0gRnAubXVsKGIsIGcpOyAvLyBiICo9IGdcbiAgICAgICAgICAgIHIgPSBtO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB4O1xuICAgIH07XG59XG5leHBvcnQgZnVuY3Rpb24gRnBTcXJ0KFApIHtcbiAgICAvLyBOT1RFOiBkaWZmZXJlbnQgYWxnb3JpdGhtcyBjYW4gZ2l2ZSBkaWZmZXJlbnQgcm9vdHMsIGl0IGlzIHVwIHRvIHVzZXIgdG8gZGVjaWRlIHdoaWNoIG9uZSB0aGV5IHdhbnQuXG4gICAgLy8gRm9yIGV4YW1wbGUgdGhlcmUgaXMgRnBTcXJ0T2RkL0ZwU3FydEV2ZW4gdG8gY2hvaWNlIHJvb3QgYmFzZWQgb24gb2RkbmVzcyAodXNlZCBmb3IgaGFzaC10by1jdXJ2ZSkuXG4gICAgLy8gUCDiiaEgMyAobW9kIDQpXG4gICAgLy8g4oiabiA9IG5eKChQKzEpLzQpXG4gICAgaWYgKFAgJSBfNG4gPT09IF8zbikge1xuICAgICAgICAvLyBOb3QgYWxsIHJvb3RzIHBvc3NpYmxlIVxuICAgICAgICAvLyBjb25zdCBPUkRFUiA9XG4gICAgICAgIC8vICAgMHgxYTAxMTFlYTM5N2ZlNjlhNGIxYmE3YjY0MzRiYWNkNzY0Nzc0Yjg0ZjM4NTEyYmY2NzMwZDJhMGY2YjBmNjI0MWVhYmZmZmViMTUzZmZmZmI5ZmVmZmZmZmZmZmFhYWJuO1xuICAgICAgICAvLyBjb25zdCBOVU0gPSA3MjA1NzU5NDAzNzkyNzgxNm47XG4gICAgICAgIGNvbnN0IHAxZGl2NCA9IChQICsgXzFuKSAvIF80bjtcbiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uIHNxcnQzbW9kNChGcCwgbikge1xuICAgICAgICAgICAgY29uc3Qgcm9vdCA9IEZwLnBvdyhuLCBwMWRpdjQpO1xuICAgICAgICAgICAgLy8gVGhyb3cgaWYgcm9vdCoqMiAhPSBuXG4gICAgICAgICAgICBpZiAoIUZwLmVxbChGcC5zcXIocm9vdCksIG4pKVxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignQ2Fubm90IGZpbmQgc3F1YXJlIHJvb3QnKTtcbiAgICAgICAgICAgIHJldHVybiByb290O1xuICAgICAgICB9O1xuICAgIH1cbiAgICAvLyBBdGtpbiBhbGdvcml0aG0gZm9yIHEg4omhIDUgKG1vZCA4KSwgaHR0cHM6Ly9lcHJpbnQuaWFjci5vcmcvMjAxMi82ODUucGRmIChwYWdlIDEwKVxuICAgIGlmIChQICUgXzhuID09PSBfNW4pIHtcbiAgICAgICAgY29uc3QgYzEgPSAoUCAtIF81bikgLyBfOG47XG4gICAgICAgIHJldHVybiBmdW5jdGlvbiBzcXJ0NW1vZDgoRnAsIG4pIHtcbiAgICAgICAgICAgIGNvbnN0IG4yID0gRnAubXVsKG4sIF8ybik7XG4gICAgICAgICAgICBjb25zdCB2ID0gRnAucG93KG4yLCBjMSk7XG4gICAgICAgICAgICBjb25zdCBudiA9IEZwLm11bChuLCB2KTtcbiAgICAgICAgICAgIGNvbnN0IGkgPSBGcC5tdWwoRnAubXVsKG52LCBfMm4pLCB2KTtcbiAgICAgICAgICAgIGNvbnN0IHJvb3QgPSBGcC5tdWwobnYsIEZwLnN1YihpLCBGcC5PTkUpKTtcbiAgICAgICAgICAgIGlmICghRnAuZXFsKEZwLnNxcihyb290KSwgbikpXG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdDYW5ub3QgZmluZCBzcXVhcmUgcm9vdCcpO1xuICAgICAgICAgICAgcmV0dXJuIHJvb3Q7XG4gICAgICAgIH07XG4gICAgfVxuICAgIC8vIFAg4omhIDkgKG1vZCAxNilcbiAgICBpZiAoUCAlIF8xNm4gPT09IF85bikge1xuICAgICAgICAvLyBOT1RFOiB0b25lbGxpIGlzIHRvbyBzbG93IGZvciBibHMtRnAyIGNhbGN1bGF0aW9ucyBldmVuIG9uIHN0YXJ0XG4gICAgICAgIC8vIE1lYW5zIHdlIGNhbm5vdCB1c2Ugc3FydCBmb3IgY29uc3RhbnRzIGF0IGFsbCFcbiAgICAgICAgLy9cbiAgICAgICAgLy8gY29uc3QgYzEgPSBGcC5zcXJ0KEZwLm5lZ2F0ZShGcC5PTkUpKTsgLy8gIDEuIGMxID0gc3FydCgtMSkgaW4gRiwgaS5lLiwgKGMxXjIpID09IC0xIGluIEZcbiAgICAgICAgLy8gY29uc3QgYzIgPSBGcC5zcXJ0KGMxKTsgICAgICAgICAgICAgICAgLy8gIDIuIGMyID0gc3FydChjMSkgaW4gRiwgaS5lLiwgKGMyXjIpID09IGMxIGluIEZcbiAgICAgICAgLy8gY29uc3QgYzMgPSBGcC5zcXJ0KEZwLm5lZ2F0ZShjMSkpOyAgICAgLy8gIDMuIGMzID0gc3FydCgtYzEpIGluIEYsIGkuZS4sIChjM14yKSA9PSAtYzEgaW4gRlxuICAgICAgICAvLyBjb25zdCBjNCA9IChQICsgXzduKSAvIF8xNm47ICAgICAgICAgICAvLyAgNC4gYzQgPSAocSArIDcpIC8gMTYgICAgICAgICMgSW50ZWdlciBhcml0aG1ldGljXG4gICAgICAgIC8vIHNxcnQgPSAoeCkgPT4ge1xuICAgICAgICAvLyAgIGxldCB0djEgPSBGcC5wb3coeCwgYzQpOyAgICAgICAgICAgICAvLyAgMS4gdHYxID0geF5jNFxuICAgICAgICAvLyAgIGxldCB0djIgPSBGcC5tdWwoYzEsIHR2MSk7ICAgICAgICAgICAvLyAgMi4gdHYyID0gYzEgKiB0djFcbiAgICAgICAgLy8gICBjb25zdCB0djMgPSBGcC5tdWwoYzIsIHR2MSk7ICAgICAgICAgLy8gIDMuIHR2MyA9IGMyICogdHYxXG4gICAgICAgIC8vICAgbGV0IHR2NCA9IEZwLm11bChjMywgdHYxKTsgICAgICAgICAgIC8vICA0LiB0djQgPSBjMyAqIHR2MVxuICAgICAgICAvLyAgIGNvbnN0IGUxID0gRnAuZXF1YWxzKEZwLnNxdWFyZSh0djIpLCB4KTsgLy8gIDUuICBlMSA9ICh0djJeMikgPT0geFxuICAgICAgICAvLyAgIGNvbnN0IGUyID0gRnAuZXF1YWxzKEZwLnNxdWFyZSh0djMpLCB4KTsgLy8gIDYuICBlMiA9ICh0djNeMikgPT0geFxuICAgICAgICAvLyAgIHR2MSA9IEZwLmNtb3YodHYxLCB0djIsIGUxKTsgLy8gIDcuIHR2MSA9IENNT1YodHYxLCB0djIsIGUxKSAgIyBTZWxlY3QgdHYyIGlmICh0djJeMikgPT0geFxuICAgICAgICAvLyAgIHR2MiA9IEZwLmNtb3YodHY0LCB0djMsIGUyKTsgLy8gIDguIHR2MiA9IENNT1YodHY0LCB0djMsIGUyKSAgIyBTZWxlY3QgdHYzIGlmICh0djNeMikgPT0geFxuICAgICAgICAvLyAgIGNvbnN0IGUzID0gRnAuZXF1YWxzKEZwLnNxdWFyZSh0djIpLCB4KTsgLy8gIDkuICBlMyA9ICh0djJeMikgPT0geFxuICAgICAgICAvLyAgIHJldHVybi
26774BGcC5jbW92KHR2MSwgdHYyLCBlMyk7IC8vICAxMC4gIHogPSBDTU9WKHR2MSwgdHYyLCBlMykgICMgU2VsZWN0IHRoZSBzcXJ0IGZyb20gdHYxIGFuZCB0djJcbiAgICAgICAgLy8gfVxuICAgIH1cbiAgICAvLyBPdGhlciBjYXNlczogVG9uZWxsaS1TaGFua3MgYWxnb3JpdGhtXG4gICAgcmV0dXJuIHRvbmVsbGlTaGFua3MoUCk7XG59XG4vLyBMaXR0bGUtZW5kaWFuIGNoZWNrIGZvciBmaXJzdCBMRSBiaXQgKGxhc3QgQkUgYml0KTtcbmV4cG9ydCBjb25zdCBpc05lZ2F0aXZlTEUgPSAobnVtLCBtb2R1bG8pID0+IChtb2QobnVtLCBtb2R1bG8pICYgXzFuKSA9PT0gXzFuO1xuLy8gcHJldHRpZXItaWdub3JlXG5jb25zdCBGSUVMRF9GSUVMRFMgPSBbXG4gICAgJ2NyZWF0ZScsICdpc1ZhbGlkJywgJ2lzMCcsICduZWcnLCAnaW52JywgJ3NxcnQnLCAnc3FyJyxcbiAgICAnZXFsJywgJ2FkZCcsICdzdWInLCAnbXVsJywgJ3BvdycsICdkaXYnLFxuICAgICdhZGROJywgJ3N1Yk4nLCAnbXVsTicsICdzcXJOJ1xuXTtcbmV4cG9ydCBmdW5jdGlvbiB2YWxpZGF0ZUZpZWxkKGZpZWxkKSB7XG4gICAgY29uc3QgaW5pdGlhbCA9IHtcbiAgICAgICAgT1JERVI6ICdiaWdpbnQnLFxuICAgICAgICBNQVNLOiAnYmlnaW50JyxcbiAgICAgICAgQllURVM6ICdpc1NhZmVJbnRlZ2VyJyxcbiAgICAgICAgQklUUzogJ2lzU2FmZUludGVnZXInLFxuICAgIH07XG4gICAgY29uc3Qgb3B0cyA9IEZJRUxEX0ZJRUxEUy5yZWR1Y2UoKG1hcCwgdmFsKSA9PiB7XG4gICAgICAgIG1hcFt2YWxdID0gJ2Z1bmN0aW9uJztcbiAgICAgICAgcmV0dXJuIG1hcDtcbiAgICB9LCBpbml0aWFsKTtcbiAgICByZXR1cm4gdmFsaWRhdGVPYmplY3QoZmllbGQsIG9wdHMpO1xufVxuLy8gR2VuZXJpYyBmaWVsZCBmdW5jdGlvbnNcbi8qKlxuICogU2FtZSBhcyBgcG93YCBidXQgZm9yIEZwOiBub24tY29uc3RhbnQtdGltZS5cbiAqIFVuc2FmZSBpbiBzb21lIGNvbnRleHRzOiB1c2VzIGxhZGRlciwgc28gY2FuIGV4cG9zZSBiaWdpbnQgYml0cy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIEZwUG93KGYsIG51bSwgcG93ZXIpIHtcbiAgICAvLyBTaG91bGQgaGF2ZSBzYW1lIHNwZWVkIGFzIHBvdyBmb3IgYmlnaW50c1xuICAgIC8vIFRPRE86IGJlbmNobWFyayFcbiAgICBpZiAocG93ZXIgPCBfMG4pXG4gICAgICAgIHRocm93IG5ldyBFcnJvcignRXhwZWN0ZWQgcG93ZXIgPiAwJyk7XG4gICAgaWYgKHBvd2VyID09PSBfMG4pXG4gICAgICAgIHJldHVybiBmLk9ORTtcbiAgICBpZiAocG93ZXIgPT09IF8xbilcbiAgICAgICAgcmV0dXJuIG51bTtcbiAgICBsZXQgcCA9IGYuT05FO1xuICAgIGxldCBkID0gbnVtO1xuICAgIHdoaWxlIChwb3dlciA+IF8wbikge1xuICAgICAgICBpZiAocG93ZXIgJiBfMW4pXG4gICAgICAgICAgICBwID0gZi5tdWwocCwgZCk7XG4gICAgICAgIGQgPSBmLnNxcihkKTtcbiAgICAgICAgcG93ZXIgPj49IF8xbjtcbiAgICB9XG4gICAgcmV0dXJuIHA7XG59XG4vKipcbiAqIEVmZmljaWVudGx5IGludmVydCBhbiBhcnJheSBvZiBGaWVsZCBlbGVtZW50cy5cbiAqIGBpbnYoMClgIHdpbGwgcmV0dXJuIGB1bmRlZmluZWRgIGhlcmU6IG1ha2Ugc3VyZSB0byB0aHJvdyBhbiBlcnJvci5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIEZwSW52ZXJ0QmF0Y2goZiwgbnVtcykge1xuICAgIGNvbnN0IHRtcCA9IG5ldyBBcnJheShudW1zLmxlbmd0aCk7XG4gICAgLy8gV2FsayBmcm9tIGZpcnN0IHRvIGxhc3QsIG11bHRpcGx5IHRoZW0gYnkgZWFjaCBvdGhlciBNT0QgcFxuICAgIGNvbnN0IGxhc3RNdWx0aXBsaWVkID0gbnVtcy5yZWR1Y2UoKGFjYywgbnVtLCBpKSA9PiB7XG4gICAgICAgIGlmIChmLmlzMChudW0pKVxuICAgICAgICAgICAgcmV0dXJuIGFjYztcbiAgICAgICAgdG1wW2ldID0gYWNjO1xuICAgICAgICByZXR1cm4gZi5tdWwoYWNjLCBudW0pO1xuICAgIH0sIGYuT05FKTtcbiAgICAvLyBJbnZlcnQgbGFzdCBlbGVtZW50XG4gICAgY29uc3QgaW52ZXJ0ZWQgPSBmLmludihsYXN0TXVsdGlwbGllZCk7XG4gICAgLy8gV2FsayBmcm9tIGxhc3QgdG8gZmlyc3QsIG11bHRpcGx5IHRoZW0gYnkgaW52ZXJ0ZWQgZWFjaCBvdGhlciBNT0QgcFxuICAgIG51bXMucmVkdWNlUmlnaHQoKGFjYywgbnVtLCBpKSA9PiB7XG4gICAgICAgIGlmIChmLmlzMChudW0pKVxuICAgICAgICAgICAgcmV0dXJuIGFjYztcbiAgICAgICAgdG1wW2ldID0gZi5tdWwoYWNjLCB0bXBbaV0pO1xuICAgICAgICByZXR1cm4gZi5tdWwoYWNjLCBudW0pO1xuICAgIH0sIGludmVydGVkKTtcbiAgICByZXR1cm4gdG1wO1xufVxuZXhwb3J0IGZ1bmN0aW9uIEZwRGl2KGYsIGxocywgcmhzKSB7XG4gICAgcmV0dXJuIGYubXVsKGxocywgdHlwZW9mIHJocyA9PT0gJ2JpZ2ludCcgPyBpbnZlcnQocmhzLCBmLk9SREVSKSA6IGYuaW52KHJocykpO1xufVxuLy8gVGhpcyBmdW5jdGlvbiByZXR1cm5zIFRydWUgd2hlbmV2ZXIgdGhlIHZhbHVlIHggaXMgYSBzcXVhcmUgaW4gdGhlIGZpZWxkIEYuXG5leHBvcnQgZnVuY3Rpb24gRnBJc1NxdWFyZShmKSB7XG4gICAgY29uc3QgbGVnZW5kcmVDb25zdCA9IChmLk9SREVSIC0gXzFuKSAvIF8ybjsgLy8gSW50ZWdlciBhcml0aG1ldGljXG4gICAgcmV0dXJuICh4KSA9PiB7XG4gICAgICAgIGNvbnN0IHAgPSBmLnBvdyh4LCBsZWdlbmRyZUNvbnN0KTtcbiAgICAgICAgcmV0dXJuIGYuZXFsKHAsIGYuWkVSTykgfHwgZi5lcWwocCwgZi5PTkUpO1xuICAgIH07XG59XG4vLyBDVVJWRS5uIGxlbmd0aHNcbmV4cG9ydCBmdW5jdGlvbiBuTGVuZ3RoKG4sIG5CaXRMZW5ndGgpIHtcbiAgICAvLyBCaXQgc2l6ZSwgYnl0ZSBzaXplIG9mIENVUlZFLm5cbiAgICBjb25zdCBfbkJpdExlbmd0aCA9IG5CaXRMZW5ndGggIT09IHVuZGVmaW5lZCA/IG5CaXRMZW5ndGggOiBuLnRvU3RyaW5nKDIpLmxlbmd0aDtcbiAgICBjb25zdCBuQnl0ZUxlbmd0aCA9IE1hdGguY2VpbChfbkJpdExlbmd0aCAvIDgpO1xuICAgIHJldHVybiB7IG5CaXRMZW5ndGg6IF9uQml0TGVuZ3RoLCBuQnl0ZUxlbmd0aCB9O1xufVxuLyoqXG4gKiBJbml0aWFsaXplcyBhIGZpbml0ZSBmaWVsZCBvdmVyIHByaW1lLiAqKk5vbi1wcmltZXMgYXJlIG5vdCBzdXBwb3J0ZWQuKipcbiAqIERvIG5vdCBpbml0IGluIGxvb3A6IHNsb3cuIFZlcnkgZnJhZ2lsZTogYWx3YXlzIHJ1biBhIGJlbmNobWFyayBvbiBhIGNoYW5nZS5cbiAqIE1ham9yIHBlcmZvcm1hbmNlIG9wdGltaXphdGlvbnM6XG4gKiAqIGEpIGRlbm9ybWFsaXplZCBvcGVyYXRpb25zIGxpa2UgbXVsTiBpbnN0ZWFkIG9mIG11bFxuICogKiBiKSBzYW1lIG9iamVjdCBzaGFwZTogbmV2ZXIgYWRkIG9yIHJlbW92ZSBrZXlzXG4gKiAqIGMpIE9iamVjdC5mcmVlemVcbiAqIEBwYXJhbSBPUkRFUiBwcmltZSBwb3NpdGl2ZSBiaWdpbnRcbiAqIEBwYXJhbSBiaXRMZW4gaG93IG1hbnkgYml0cyB0aGUgZmllbGQgY29uc3VtZXNcbiAqIEBwYXJhbSBpc0xFIChkZWY6IGZhbHNlKSBpZiBlbmNvZGluZyAvIGRlY29kaW5nIHNob3VsZCBiZSBpbiBsaXR0bG
26774UtZW5kaWFuXG4gKiBAcGFyYW0gcmVkZWYgb3B0aW9uYWwgZmFzdGVyIHJlZGVmaW5pdGlvbnMgb2Ygc3FydCBhbmQgb3RoZXIgbWV0aG9kc1xuICovXG5leHBvcnQgZnVuY3Rpb24gRmllbGQoT1JERVIsIGJpdExlbiwgaXNMRSA9IGZhbHNlLCByZWRlZiA9IHt9KSB7XG4gICAgaWYgKE9SREVSIDw9IF8wbilcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBFeHBlY3RlZCBGaWVsZCBPUkRFUiA+IDAsIGdvdCAke09SREVSfWApO1xuICAgIGNvbnN0IHsgbkJpdExlbmd0aDogQklUUywgbkJ5dGVMZW5ndGg6IEJZVEVTIH0gPSBuTGVuZ3RoKE9SREVSLCBiaXRMZW4pO1xuICAgIGlmIChCWVRFUyA+IDIwNDgpXG4gICAgICAgIHRocm93IG5ldyBFcnJvcignRmllbGQgbGVuZ3RocyBvdmVyIDIwNDggYnl0ZXMgYXJlIG5vdCBzdXBwb3J0ZWQnKTtcbiAgICBjb25zdCBzcXJ0UCA9IEZwU3FydChPUkRFUik7XG4gICAgY29uc3QgZiA9IE9iamVjdC5mcmVlemUoe1xuICAgICAgICBPUkRFUixcbiAgICAgICAgQklUUyxcbiAgICAgICAgQllURVMsXG4gICAgICAgIE1BU0s6IGJpdE1hc2soQklUUyksXG4gICAgICAgIFpFUk86IF8wbixcbiAgICAgICAgT05FOiBfMW4sXG4gICAgICAgIGNyZWF0ZTogKG51bSkgPT4gbW9kKG51bSwgT1JERVIpLFxuICAgICAgICBpc1ZhbGlkOiAobnVtKSA9PiB7XG4gICAgICAgICAgICBpZiAodHlwZW9mIG51bSAhPT0gJ2JpZ2ludCcpXG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIGZpZWxkIGVsZW1lbnQ6IGV4cGVjdGVkIGJpZ2ludCwgZ290ICR7dHlwZW9mIG51bX1gKTtcbiAgICAgICAgICAgIHJldHVybiBfMG4gPD0gbnVtICYmIG51bSA8IE9SREVSOyAvLyAwIGlzIHZhbGlkIGVsZW1lbnQsIGJ1dCBpdCdzIG5vdCBpbnZlcnRpYmxlXG4gICAgICAgIH0sXG4gICAgICAgIGlzMDogKG51bSkgPT4gbnVtID09PSBfMG4sXG4gICAgICAgIGlzT2RkOiAobnVtKSA9PiAobnVtICYgXzFuKSA9PT0gXzFuLFxuICAgICAgICBuZWc6IChudW0pID0+IG1vZCgtbnVtLCBPUkRFUiksXG4gICAgICAgIGVxbDogKGxocywgcmhzKSA9PiBsaHMgPT09IHJocyxcbiAgICAgICAgc3FyOiAobnVtKSA9PiBtb2QobnVtICogbnVtLCBPUkRFUiksXG4gICAgICAgIGFkZDogKGxocywgcmhzKSA9PiBtb2QobGhzICsgcmhzLCBPUkRFUiksXG4gICAgICAgIHN1YjogKGxocywgcmhzKSA9PiBtb2QobGhzIC0gcmhzLCBPUkRFUiksXG4gICAgICAgIG11bDogKGxocywgcmhzKSA9PiBtb2QobGhzICogcmhzLCBPUkRFUiksXG4gICAgICAgIHBvdzogKG51bSwgcG93ZXIpID0+IEZwUG93KGYsIG51bSwgcG93ZXIpLFxuICAgICAgICBkaXY6IChsaHMsIHJocykgPT4gbW9kKGxocyAqIGludmVydChyaHMsIE9SREVSKSwgT1JERVIpLFxuICAgICAgICAvLyBTYW1lIGFzIGFib3ZlLCBidXQgZG9lc24ndCBub3JtYWxpemVcbiAgICAgICAgc3FyTjogKG51bSkgPT4gbnVtICogbnVtLFxuICAgICAgICBhZGROOiAobGhzLCByaHMpID0+IGxocyArIHJocyxcbiAgICAgICAgc3ViTjogKGxocywgcmhzKSA9PiBsaHMgLSByaHMsXG4gICAgICAgIG11bE46IChsaHMsIHJocykgPT4gbGhzICogcmhzLFxuICAgICAgICBpbnY6IChudW0pID0+IGludmVydChudW0sIE9SREVSKSxcbiAgICAgICAgc3FydDogcmVkZWYuc3FydCB8fCAoKG4pID0+IHNxcnRQKGYsIG4pKSxcbiAgICAgICAgaW52ZXJ0QmF0Y2g6IChsc3QpID0+IEZwSW52ZXJ0QmF0Y2goZiwgbHN0KSxcbiAgICAgICAgLy8gVE9ETzogZG8gd2UgcmVhbGx5IG5lZWQgY29uc3RhbnQgY21vdj9cbiAgICAgICAgLy8gV2UgZG9uJ3QgaGF2ZSBjb25zdC10aW1lIGJpZ2ludHMgYW55d2F5LCBzbyBwcm9iYWJseSB3aWxsIGJlIG5vdCB2ZXJ5IHVzZWZ1bFxuICAgICAgICBjbW92OiAoYSwgYiwgYykgPT4gKGMgPyBiIDogYSksXG4gICAgICAgIHRvQnl0ZXM6IChudW0pID0+IChpc0xFID8gbnVtYmVyVG9CeXRlc0xFKG51bSwgQllURVMpIDogbnVtYmVyVG9CeXRlc0JFKG51bSwgQllURVMpKSxcbiAgICAgICAgZnJvbUJ5dGVzOiAoYnl0ZXMpID0+IHtcbiAgICAgICAgICAgIGlmIChieXRlcy5sZW5ndGggIT09IEJZVEVTKVxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgRnAuZnJvbUJ5dGVzOiBleHBlY3RlZCAke0JZVEVTfSwgZ290ICR7Ynl0ZXMubGVuZ3RofWApO1xuICAgICAgICAgICAgcmV0dXJuIGlzTEUgPyBieXRlc1RvTnVtYmVyTEUoYnl0ZXMpIDogYnl0ZXNUb051bWJlckJFKGJ5dGVzKTtcbiAgICAgICAgfSxcbiAgICB9KTtcbiAgICByZXR1cm4gT2JqZWN0LmZyZWV6ZShmKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBGcFNxcnRPZGQoRnAsIGVsbSkge1xuICAgIGlmICghRnAuaXNPZGQpXG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgRmllbGQgZG9lc24ndCBoYXZlIGlzT2RkYCk7XG4gICAgY29uc3Qgcm9vdCA9IEZwLnNxcnQoZWxtKTtcbiAgICByZXR1cm4gRnAuaXNPZGQocm9vdCkgPyByb290IDogRnAubmVnKHJvb3QpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIEZwU3FydEV2ZW4oRnAsIGVsbSkge1xuICAgIGlmICghRnAuaXNPZGQpXG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgRmllbGQgZG9lc24ndCBoYXZlIGlzT2RkYCk7XG4gICAgY29uc3Qgcm9vdCA9IEZwLnNxcnQoZWxtKTtcbiAgICByZXR1cm4gRnAuaXNPZGQocm9vdCkgPyBGcC5uZWcocm9vdCkgOiByb290O1xufVxuLyoqXG4gKiBcIkNvbnN0YW50LXRpbWVcIiBwcml2YXRlIGtleSBnZW5lcmF0aW9uIHV0aWxpdHkuXG4gKiBTYW1lIGFzIG1hcEtleVRvRmllbGQsIGJ1dCBhY2NlcHRzIGxlc3MgYnl0ZXMgKDQwIGluc3RlYWQgb2YgNDggZm9yIDMyLWJ5dGUgZmllbGQpLlxuICogV2hpY2ggbWFrZXMgaXQgc2xpZ2h0bHkgbW9yZSBiaWFzZWQsIGxlc3Mgc2VjdXJlLlxuICogQGRlcHJlY2F0ZWQgdXNlIG1hcEtleVRvRmllbGQgaW5zdGVhZFxuICovXG5leHBvcnQgZnVuY3Rpb24gaGFzaFRvUHJpdmF0ZVNjYWxhcihoYXNoLCBncm91cE9yZGVyLCBpc0xFID0gZmFsc2UpIHtcbiAgICBoYXNoID0gZW5zdXJlQnl0ZXMoJ3ByaXZhdGVIYXNoJywgaGFzaCk7XG4gICAgY29uc3QgaGFzaExlbiA9IGhhc2gubGVuZ3RoO1xuICAgIGNvbnN0IG1pbkxlbiA9IG5MZW5ndGgoZ3JvdXBPcmRlcikubkJ5dGVMZW5ndGggKyA4O1xuICAgIGlmIChtaW5MZW4gPCAyNCB8fCBoYXNoTGVuIDwgbWluTGVuIHx8IGhhc2hMZW4gPiAxMDI0KVxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYGhhc2hUb1ByaXZhdGVTY2FsYXI6IGV4cGVjdGVkICR7bWluTGVufS0xMDI0IGJ5dGVzIG9mIGlucHV0LCBnb3QgJHtoYXNoTGVufWApO1xuICAgIGNvbnN0IG51bSA9IGlzTEUgPyBieXRlc1RvTnVtYmVyTEUoaGFzaCkgOiBieXRlc1RvTnVtYmVyQkUoaGFzaCk7XG4gICAgcmV0dXJuIG1vZChudW0sIGdyb3VwT3JkZXIgLSBfMW4pICsgXzFuO1xufVxuLyoqXG4gKiBSZXR1cm5zIHRvdGFsIG51bWJlciBvZiBieXRlcyBjb25zdW1lZCBieSB0aGUgZmllbGQgZWxlbWVudC5cbiAqIEZvciBleGFtcGxlLCAzMiBieXRlcyBmb3IgdXN1YWwgMjU2LWJpdCB3ZWllcnN0cmFzcyBjdXJ2ZS5cbiAqIEBwYXJhbSBmaWVsZE9yZGVyIG51bWJlciBvZiBmaWVsZCBlbGVtZW50cywgdXN1YWxseSBDVVJWRS5uXG4gKiBAcmV0dXJucyBieXRlIGxlbmd0aCBvZiBmaWVsZFxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0RmllbGRCeXRlc0xlbmd0aChmaWVsZE9yZGVyKSB7XG4gICAgaWYgKHR5cGVvZiBmaWVsZE9yZGVyICE9PSAnYmlnaW50JylcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdmaWVsZCBvcmRlciBtdXN0IGJlIGJpZ2ludCcpO1xuICAgIGNvbnN0IGJpdExlbmd0aCA9IGZpZWxkT3JkZXIudG9TdHJpbmc
26774oMikubGVuZ3RoO1xuICAgIHJldHVybiBNYXRoLmNlaWwoYml0TGVuZ3RoIC8gOCk7XG59XG4vKipcbiAqIFJldHVybnMgbWluaW1hbCBhbW91bnQgb2YgYnl0ZXMgdGhhdCBjYW4gYmUgc2FmZWx5IHJlZHVjZWRcbiAqIGJ5IGZpZWxkIG9yZGVyLlxuICogU2hvdWxkIGJlIDJeLTEyOCBmb3IgMTI4LWJpdCBjdXJ2ZSBzdWNoIGFzIFAyNTYuXG4gKiBAcGFyYW0gZmllbGRPcmRlciBudW1iZXIgb2YgZmllbGQgZWxlbWVudHMsIHVzdWFsbHkgQ1VSVkUublxuICogQHJldHVybnMgYnl0ZSBsZW5ndGggb2YgdGFyZ2V0IGhhc2hcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldE1pbkhhc2hMZW5ndGgoZmllbGRPcmRlcikge1xuICAgIGNvbnN0IGxlbmd0aCA9IGdldEZpZWxkQnl0ZXNMZW5ndGgoZmllbGRPcmRlcik7XG4gICAgcmV0dXJuIGxlbmd0aCArIE1hdGguY2VpbChsZW5ndGggLyAyKTtcbn1cbi8qKlxuICogXCJDb25zdGFudC10aW1lXCIgcHJpdmF0ZSBrZXkgZ2VuZXJhdGlvbiB1dGlsaXR5LlxuICogQ2FuIHRha2UgKG4gKyBuLzIpIG9yIG1vcmUgYnl0ZXMgb2YgdW5pZm9ybSBpbnB1dCBlLmcuIGZyb20gQ1NQUk5HIG9yIEtERlxuICogYW5kIGNvbnZlcnQgdGhlbSBpbnRvIHByaXZhdGUgc2NhbGFyLCB3aXRoIHRoZSBtb2R1bG8gYmlhcyBiZWluZyBuZWdsaWdpYmxlLlxuICogTmVlZHMgYXQgbGVhc3QgNDggYnl0ZXMgb2YgaW5wdXQgZm9yIDMyLWJ5dGUgcHJpdmF0ZSBrZXkuXG4gKiBodHRwczovL3Jlc2VhcmNoLmt1ZGVsc2tpc2VjdXJpdHkuY29tLzIwMjAvMDcvMjgvdGhlLWRlZmluaXRpdmUtZ3VpZGUtdG8tbW9kdWxvLWJpYXMtYW5kLWhvdy10by1hdm9pZC1pdC9cbiAqIEZJUFMgMTg2LTUsIEEuMiBodHRwczovL2NzcmMubmlzdC5nb3YvcHVibGljYXRpb25zL2RldGFpbC9maXBzLzE4Ni81L2ZpbmFsXG4gKiBSRkMgOTM4MCwgaHR0cHM6Ly93d3cucmZjLWVkaXRvci5vcmcvcmZjL3JmYzkzODAjc2VjdGlvbi01XG4gKiBAcGFyYW0gaGFzaCBoYXNoIG91dHB1dCBmcm9tIFNIQTMgb3IgYSBzaW1pbGFyIGZ1bmN0aW9uXG4gKiBAcGFyYW0gZ3JvdXBPcmRlciBzaXplIG9mIHN1Ymdyb3VwIC0gKGUuZy4gc2VjcDI1NmsxLkNVUlZFLm4pXG4gKiBAcGFyYW0gaXNMRSBpbnRlcnByZXQgaGFzaCBieXRlcyBhcyBMRSBudW1cbiAqIEByZXR1cm5zIHZhbGlkIHByaXZhdGUgc2NhbGFyXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBtYXBIYXNoVG9GaWVsZChrZXksIGZpZWxkT3JkZXIsIGlzTEUgPSBmYWxzZSkge1xuICAgIGNvbnN0IGxlbiA9IGtleS5sZW5ndGg7XG4gICAgY29uc3QgZmllbGRMZW4gPSBnZXRGaWVsZEJ5dGVzTGVuZ3RoKGZpZWxkT3JkZXIpO1xuICAgIGNvbnN0IG1pbkxlbiA9IGdldE1pbkhhc2hMZW5ndGgoZmllbGRPcmRlcik7XG4gICAgLy8gTm8gc21hbGwgbnVtYmVyczogbmVlZCB0byB1bmRlcnN0YW5kIGJpYXMgc3RvcnkuIE5vIGh1Z2UgbnVtYmVyczogZWFzaWVyIHRvIGRldGVjdCBKUyB0aW1pbmdzLlxuICAgIGlmIChsZW4gPCAxNiB8fCBsZW4gPCBtaW5MZW4gfHwgbGVuID4gMTAyNClcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBleHBlY3RlZCAke21pbkxlbn0tMTAyNCBieXRlcyBvZiBpbnB1dCwgZ290ICR7bGVufWApO1xuICAgIGNvbnN0IG51bSA9IGlzTEUgPyBieXRlc1RvTnVtYmVyQkUoa2V5KSA6IGJ5dGVzVG9OdW1iZXJMRShrZXkpO1xuICAgIC8vIGBtb2QoeCwgMTEpYCBjYW4gc29tZXRpbWVzIHByb2R1Y2UgMC4gYG1vZCh4LCAxMCkgKyAxYCBpcyB0aGUgc2FtZSwgYnV0IG5vIDBcbiAgICBjb25zdCByZWR1Y2VkID0gbW9kKG51bSwgZmllbGRPcmRlciAtIF8xbikgKyBfMW47XG4gICAgcmV0dXJuIGlzTEUgPyBudW1iZXJUb0J5dGVzTEUocmVkdWNlZCwgZmllbGRMZW4pIDogbnVtYmVyVG9CeXRlc0JFKHJlZHVjZWQsIGZpZWxkTGVuKTtcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPW1vZHVsYXIuanMubWFwIiwiLyohIG5vYmxlLWN1cnZlcyAtIE1JVCBMaWNlbnNlIChjKSAyMDIyIFBhdWwgTWlsbGVyIChwYXVsbWlsbHIuY29tKSAqL1xuLy8gQWJlbGlhbiBncm91cCB1dGlsaXRpZXNcbmltcG9ydCB7IHZhbGlkYXRlRmllbGQsIG5MZW5ndGggfSBmcm9tICcuL21vZHVsYXIuanMnO1xuaW1wb3J0IHsgdmFsaWRhdGVPYmplY3QgfSBmcm9tICcuL3V0aWxzLmpzJztcbmNvbnN0IF8wbiA9IEJpZ0ludCgwKTtcbmNvbnN0IF8xbiA9IEJpZ0ludCgxKTtcbi8vIEVsbGlwdGljIGN1cnZlIG11bHRpcGxpY2F0aW9uIG9mIFBvaW50IGJ5IHNjYWxhci4gRnJhZ2lsZS5cbi8vIFNjYWxhcnMgc2hvdWxkIGFsd2F5cyBiZSBsZXNzIHRoYW4gY3VydmUgb3JkZXI6IHRoaXMgc2hvdWxkIGJlIGNoZWNrZWQgaW5zaWRlIG9mIGEgY3VydmUgaXRzZWxmLlxuLy8gQ3JlYXRlcyBwcmVjb21wdXRhdGlvbiB0YWJsZXMgZm9yIGZhc3QgbXVsdGlwbGljYXRpb246XG4vLyAtIHByaXZhdGUgc2NhbGFyIGlzIHNwbGl0IGJ5IGZpeGVkIHNpemUgd2luZG93cyBvZiBXIGJpdHNcbi8vIC0gZXZlcnkgd2luZG93IHBvaW50IGlzIGNvbGxlY3RlZCBmcm9tIHdpbmRvdydzIHRhYmxlICYgYWRkZWQgdG8gYWNjdW11bGF0b3Jcbi8vIC0gc2luY2Ugd2luZG93cyBhcmUgZGlmZmVyZW50LCBzYW1lIHBvaW50IGluc2lkZSB0YWJsZXMgd29uJ3QgYmUgYWNjZXNzZWQgbW9yZSB0aGFuIG9uY2UgcGVyIGNhbGNcbi8vIC0gZWFjaCBtdWx0aXBsaWNhdGlvbiBpcyAnTWF0aC5jZWlsKENVUlZFX09SREVSIC8g8J2RiikgKyAxJyBwb2ludCBhZGRpdGlvbnMgKGZpeGVkIGZvciBhbnkgc2NhbGFyKVxuLy8gLSArMSB3aW5kb3cgaXMgbmVjY2Vzc2FyeSBmb3Igd05BRlxuLy8gLSB3TkFGIHJlZHVjZXMgdGFibGUgc2l6ZTogMnggbGVzcyBtZW1vcnkgKyAyeCBmYXN0ZXIgZ2VuZXJhdGlvbiwgYnV0IDEwJSBzbG93ZXIgbXVsdGlwbGljYXRpb25cbi8vIFRPRE86IFJlc2VhcmNoIHJldHVybmluZyAyZCBKUyBhcnJheSBvZiB3aW5kb3dzLCBpbnN0ZWFkIG9mIGEgc2luZ2xlIHdpbmRvdy4gVGhpcyB3b3VsZCBhbGxvd1xuLy8gd2luZG93cyB0byBiZSBpbiBkaWZmZXJlbnQgbWVtb3J5IGxvY2F0aW9uc1xuZXhwb3J0IGZ1bmN0aW9uIHdOQUYoYywgYml0cykge1xuICAgIGNvbnN0IGNvbnN0VGltZU5lZ2F0ZSA9IChjb25kaXRpb24sIGl0ZW0pID0+IHtcbiAgICAgICAgY29uc3QgbmVnID0gaXRlbS5uZWdhdGUoKTtcbiAgICAgICAgcmV0dXJuIGNvbmRpdGlvbiA/IG5lZyA6IGl0ZW07XG4gICAgfTtcbiAgICBjb25zdCBvcHRzID0gKFcpID0+IHtcbiAgICAgICAgY29uc3Qgd2luZG93cyA9IE1hdGguY2VpbChiaXRzIC8gVykgKyAxOyAvLyArMSwgYmVjYXVzZVxuICAgICAgICBjb25zdCB3aW5kb3dTaXplID0gMiAqKiAoVyAtIDEpOyAvLyAtMSBiZWNhdXNlIHdlIHNraXAgemVyb1xuICAgICAgICByZXR1cm4geyB3aW5kb3dzLCB3aW5kb3dTaXplIH07XG4gICAgfTtcbiAgICByZXR1cm4ge1xuICAgICAgICBjb25zdFRpbWVOZWdhdGUsXG4gICAgICAgIC8vIG5vbi1jb25zdCB0aW1lIG11bHRpcGxpY2F0aW9uIGxhZGRlclxuICAgICAgICB1bnNhZmVMYWRkZXIoZWxtLCBuKSB7XG4gICAgICAgICAgICBsZXQgcCA9IGMuWkVSTztcbiAgICAgICAgICAgIGxldCBkID0gZWxtO1xuICAgICAgICAgICAgd2hpbGUgKG4gPiBfMG4pIHtcbiAgICAgICAgICAgICAgICBpZiAobiAmIF8xbilcbiAgICAgICAgICAgICAgICAgICAgcCA9IHAuYWRkKGQpO1xuICAgICAgICAgICAgICAgIGQgPSBkLmRvdWJsZSgpO1xuICAgICAgICAgICAgICAgIG4gPj49IF8xbjtcbiAgICAgICAgICAgI
26774H1cbiAgICAgICAgICAgIHJldHVybiBwO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogQ3JlYXRlcyBhIHdOQUYgcHJlY29tcHV0YXRpb24gd2luZG93LiBVc2VkIGZvciBjYWNoaW5nLlxuICAgICAgICAgKiBEZWZhdWx0IHdpbmRvdyBzaXplIGlzIHNldCBieSBgdXRpbHMucHJlY29tcHV0ZSgpYCBhbmQgaXMgZXF1YWwgdG8gOC5cbiAgICAgICAgICogTnVtYmVyIG9mIHByZWNvbXB1dGVkIHBvaW50cyBkZXBlbmRzIG9uIHRoZSBjdXJ2ZSBzaXplOlxuICAgICAgICAgKiAyXijwnZGK4oiSMSkgKiAoTWF0aC5jZWlsKPCdkZsgLyDwnZGKKSArIDEpLCB3aGVyZTpcbiAgICAgICAgICogLSDwnZGKIGlzIHRoZSB3aW5kb3cgc2l6ZVxuICAgICAgICAgKiAtIPCdkZsgaXMgdGhlIGJpdGxlbmd0aCBvZiB0aGUgY3VydmUgb3JkZXIuXG4gICAgICAgICAqIEZvciBhIDI1Ni1iaXQgY3VydmUgYW5kIHdpbmRvdyBzaXplIDgsIHRoZSBudW1iZXIgb2YgcHJlY29tcHV0ZWQgcG9pbnRzIGlzIDEyOCAqIDMzID0gNDIyNC5cbiAgICAgICAgICogQHJldHVybnMgcHJlY29tcHV0ZWQgcG9pbnQgdGFibGVzIGZsYXR0ZW5lZCB0byBhIHNpbmdsZSBhcnJheVxuICAgICAgICAgKi9cbiAgICAgICAgcHJlY29tcHV0ZVdpbmRvdyhlbG0sIFcpIHtcbiAgICAgICAgICAgIGNvbnN0IHsgd2luZG93cywgd2luZG93U2l6ZSB9ID0gb3B0cyhXKTtcbiAgICAgICAgICAgIGNvbnN0IHBvaW50cyA9IFtdO1xuICAgICAgICAgICAgbGV0IHAgPSBlbG07XG4gICAgICAgICAgICBsZXQgYmFzZSA9IHA7XG4gICAgICAgICAgICBmb3IgKGxldCB3aW5kb3cgPSAwOyB3aW5kb3cgPCB3aW5kb3dzOyB3aW5kb3crKykge1xuICAgICAgICAgICAgICAgIGJhc2UgPSBwO1xuICAgICAgICAgICAgICAgIHBvaW50cy5wdXNoKGJhc2UpO1xuICAgICAgICAgICAgICAgIC8vID0xLCBiZWNhdXNlIHdlIHNraXAgemVyb1xuICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAxOyBpIDwgd2luZG93U2l6ZTsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgIGJhc2UgPSBiYXNlLmFkZChwKTtcbiAgICAgICAgICAgICAgICAgICAgcG9pbnRzLnB1c2goYmFzZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHAgPSBiYXNlLmRvdWJsZSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHBvaW50cztcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEltcGxlbWVudHMgZWMgbXVsdGlwbGljYXRpb24gdXNpbmcgcHJlY29tcHV0ZWQgdGFibGVzIGFuZCB3LWFyeSBub24tYWRqYWNlbnQgZm9ybS5cbiAgICAgICAgICogQHBhcmFtIFcgd2luZG93IHNpemVcbiAgICAgICAgICogQHBhcmFtIHByZWNvbXB1dGVzIHByZWNvbXB1dGVkIHRhYmxlc1xuICAgICAgICAgKiBAcGFyYW0gbiBzY2FsYXIgKHdlIGRvbid0IGNoZWNrIGhlcmUsIGJ1dCBzaG91bGQgYmUgbGVzcyB0aGFuIGN1cnZlIG9yZGVyKVxuICAgICAgICAgKiBAcmV0dXJucyByZWFsIGFuZCBmYWtlIChmb3IgY29uc3QtdGltZSkgcG9pbnRzXG4gICAgICAgICAqL1xuICAgICAgICB3TkFGKFcsIHByZWNvbXB1dGVzLCBuKSB7XG4gICAgICAgICAgICAvLyBUT0RPOiBtYXliZSBjaGVjayB0aGF0IHNjYWxhciBpcyBsZXNzIHRoYW4gZ3JvdXAgb3JkZXI/IHdOQUYgYmVoYXZpb3VzIGlzIHVuZGVmaW5lZCBvdGhlcndpc2VcbiAgICAgICAgICAgIC8vIEJ1dCBuZWVkIHRvIGNhcmVmdWxseSByZW1vdmUgb3RoZXIgY2hlY2tzIGJlZm9yZSB3TkFGLiBPUkRFUiA9PSBiaXRzIGhlcmVcbiAgICAgICAgICAgIGNvbnN0IHsgd2luZG93cywgd2luZG93U2l6ZSB9ID0gb3B0cyhXKTtcbiAgICAgICAgICAgIGxldCBwID0gYy5aRVJPO1xuICAgICAgICAgICAgbGV0IGYgPSBjLkJBU0U7XG4gICAgICAgICAgICBjb25zdCBtYXNrID0gQmlnSW50KDIgKiogVyAtIDEpOyAvLyBDcmVhdGUgbWFzayB3aXRoIFcgb25lczogMGIxMTExIGZvciBXPTQgZXRjLlxuICAgICAgICAgICAgY29uc3QgbWF4TnVtYmVyID0gMiAqKiBXO1xuICAgICAgICAgICAgY29uc3Qgc2hpZnRCeSA9IEJpZ0ludChXKTtcbiAgICAgICAgICAgIGZvciAobGV0IHdpbmRvdyA9IDA7IHdpbmRvdyA8IHdpbmRvd3M7IHdpbmRvdysrKSB7XG4gICAgICAgICAgICAgICAgY29uc3Qgb2Zmc2V0ID0gd2luZG93ICogd2luZG93U2l6ZTtcbiAgICAgICAgICAgICAgICAvLyBFeHRyYWN0IFcgYml0cy5cbiAgICAgICAgICAgICAgICBsZXQgd2JpdHMgPSBOdW1iZXIobiAmIG1hc2spO1xuICAgICAgICAgICAgICAgIC8vIFNoaWZ0IG51bWJlciBieSBXIGJpdHMuXG4gICAgICAgICAgICAgICAgbiA+Pj0gc2hpZnRCeTtcbiAgICAgICAgICAgICAgICAvLyBJZiB0aGUgYml0cyBhcmUgYmlnZ2VyIHRoYW4gbWF4IHNpemUsIHdlJ2xsIHNwbGl0IHRob3NlLlxuICAgICAgICAgICAgICAgIC8vICsyMjQgPT4gMjU2IC0gMzJcbiAgICAgICAgICAgICAgICBpZiAod2JpdHMgPiB3aW5kb3dTaXplKSB7XG4gICAgICAgICAgICAgICAgICAgIHdiaXRzIC09IG1heE51bWJlcjtcbiAgICAgICAgICAgICAgICAgICAgbiArPSBfMW47XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIC8vIFRoaXMgY29kZSB3YXMgZmlyc3Qgd3JpdHRlbiB3aXRoIGFzc3VtcHRpb24gdGhhdCAnZicgYW5kICdwJyB3aWxsIG5ldmVyIGJlIGluZmluaXR5IHBvaW50OlxuICAgICAgICAgICAgICAgIC8vIHNpbmNlIGVhY2ggYWRkaXRpb24gaXMgbXVsdGlwbGllZCBieSAyICoqIFcsIGl0IGNhbm5vdCBjYW5jZWwgZWFjaCBvdGhlci4gSG93ZXZlcixcbiAgICAgICAgICAgICAgICAvLyB0aGVyZSBpcyBuZWdhdGUgbm93OiBpdCBpcyBwb3NzaWJsZSB0aGF0IG5lZ2F0ZWQgZWxlbWVudCBmcm9tIGxvdyB2YWx1ZVxuICAgICAgICAgICAgICAgIC8vIHdvdWxkIGJlIHRoZSBzYW1lIGFzIGhpZ2ggZWxlbWVudCwgd2hpY2ggd2lsbCBjcmVhdGUgY2FycnkgaW50byBuZXh0IHdpbmRvdy5cbiAgICAgICAgICAgICAgICAvLyBJdCdzIG5vdCBvYnZpb3VzIGhvdyB0aGlzIGNhbiBmYWlsLCBidXQgc3RpbGwgd29ydGggaW52ZXN0aWdhdGluZyBsYXRlci5cbiAgICAgICAgICAgICAgICAvLyBDaGVjayBpZiB3ZSdyZSBvbnRvIFplcm8gcG9pbnQuXG4gICAgICAgICAgICAgICAgLy8gQWRkIHJhbmRvbSBwb2ludCBpbnNpZGUgY3VycmVudCB3aW5kb3cgdG8gZi5cbiAgICAgICAgICAgICAgICBjb25zdCBvZmZzZXQxID0gb2Zmc2V0O1xuICAgICAgICAgICAgICAgIGNvbnN0IG9mZnNldDIgP
26774SBvZmZzZXQgKyBNYXRoLmFicyh3Yml0cykgLSAxOyAvLyAtMSBiZWNhdXNlIHdlIHNraXAgemVyb1xuICAgICAgICAgICAgICAgIGNvbnN0IGNvbmQxID0gd2luZG93ICUgMiAhPT0gMDtcbiAgICAgICAgICAgICAgICBjb25zdCBjb25kMiA9IHdiaXRzIDwgMDtcbiAgICAgICAgICAgICAgICBpZiAod2JpdHMgPT09IDApIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gVGhlIG1vc3QgaW1wb3J0YW50IHBhcnQgZm9yIGNvbnN0LXRpbWUgZ2V0UHVibGljS2V5XG4gICAgICAgICAgICAgICAgICAgIGYgPSBmLmFkZChjb25zdFRpbWVOZWdhdGUoY29uZDEsIHByZWNvbXB1dGVzW29mZnNldDFdKSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBwID0gcC5hZGQoY29uc3RUaW1lTmVnYXRlKGNvbmQyLCBwcmVjb21wdXRlc1tvZmZzZXQyXSkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIEpJVC1jb21waWxlciBzaG91bGQgbm90IGVsaW1pbmF0ZSBmIGhlcmUsIHNpbmNlIGl0IHdpbGwgbGF0ZXIgYmUgdXNlZCBpbiBub3JtYWxpemVaKClcbiAgICAgICAgICAgIC8vIEV2ZW4gaWYgdGhlIHZhcmlhYmxlIGlzIHN0aWxsIHVudXNlZCwgdGhlcmUgYXJlIHNvbWUgY2hlY2tzIHdoaWNoIHdpbGxcbiAgICAgICAgICAgIC8vIHRocm93IGFuIGV4Y2VwdGlvbiwgc28gY29tcGlsZXIgbmVlZHMgdG8gcHJvdmUgdGhleSB3b24ndCBoYXBwZW4sIHdoaWNoIGlzIGhhcmQuXG4gICAgICAgICAgICAvLyBBdCB0aGlzIHBvaW50IHRoZXJlIGlzIGEgd2F5IHRvIEYgYmUgaW5maW5pdHktcG9pbnQgZXZlbiBpZiBwIGlzIG5vdCxcbiAgICAgICAgICAgIC8vIHdoaWNoIG1ha2VzIGl0IGxlc3MgY29uc3QtdGltZTogYXJvdW5kIDEgYmlnaW50IG11bHRpcGx5LlxuICAgICAgICAgICAgcmV0dXJuIHsgcCwgZiB9O1xuICAgICAgICB9LFxuICAgICAgICB3TkFGQ2FjaGVkKFAsIHByZWNvbXB1dGVzTWFwLCBuLCB0cmFuc2Zvcm0pIHtcbiAgICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICAgIGNvbnN0IFcgPSBQLl9XSU5ET1dfU0laRSB8fCAxO1xuICAgICAgICAgICAgLy8gQ2FsY3VsYXRlIHByZWNvbXB1dGVzIG9uIGEgZmlyc3QgcnVuLCByZXVzZSB0aGVtIGFmdGVyXG4gICAgICAgICAgICBsZXQgY29tcCA9IHByZWNvbXB1dGVzTWFwLmdldChQKTtcbiAgICAgICAgICAgIGlmICghY29tcCkge1xuICAgICAgICAgICAgICAgIGNvbXAgPSB0aGlzLnByZWNvbXB1dGVXaW5kb3coUCwgVyk7XG4gICAgICAgICAgICAgICAgaWYgKFcgIT09IDEpIHtcbiAgICAgICAgICAgICAgICAgICAgcHJlY29tcHV0ZXNNYXAuc2V0KFAsIHRyYW5zZm9ybShjb21wKSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHRoaXMud05BRihXLCBjb21wLCBuKTtcbiAgICAgICAgfSxcbiAgICB9O1xufVxuZXhwb3J0IGZ1bmN0aW9uIHZhbGlkYXRlQmFzaWMoY3VydmUpIHtcbiAgICB2YWxpZGF0ZUZpZWxkKGN1cnZlLkZwKTtcbiAgICB2YWxpZGF0ZU9iamVjdChjdXJ2ZSwge1xuICAgICAgICBuOiAnYmlnaW50JyxcbiAgICAgICAgaDogJ2JpZ2ludCcsXG4gICAgICAgIEd4OiAnZmllbGQnLFxuICAgICAgICBHeTogJ2ZpZWxkJyxcbiAgICB9LCB7XG4gICAgICAgIG5CaXRMZW5ndGg6ICdpc1NhZmVJbnRlZ2VyJyxcbiAgICAgICAgbkJ5dGVMZW5ndGg6ICdpc1NhZmVJbnRlZ2VyJyxcbiAgICB9KTtcbiAgICAvLyBTZXQgZGVmYXVsdHNcbiAgICByZXR1cm4gT2JqZWN0LmZyZWV6ZSh7XG4gICAgICAgIC4uLm5MZW5ndGgoY3VydmUubiwgY3VydmUubkJpdExlbmd0aCksXG4gICAgICAgIC4uLmN1cnZlLFxuICAgICAgICAuLi57IHA6IGN1cnZlLkZwLk9SREVSIH0sXG4gICAgfSk7XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1jdXJ2ZS5qcy5tYXAiLCIvKiEgbm9ibGUtY3VydmVzIC0gTUlUIExpY2Vuc2UgKGMpIDIwMjIgUGF1bCBNaWxsZXIgKHBhdWxtaWxsci5jb20pICovXG4vLyBTaG9ydCBXZWllcnN0cmFzcyBjdXJ2ZS4gVGhlIGZvcm11bGEgaXM6IHnCsiA9IHjCsyArIGF4ICsgYlxuaW1wb3J0ICogYXMgbW9kIGZyb20gJy4vbW9kdWxhci5qcyc7XG5pbXBvcnQgKiBhcyB1dCBmcm9tICcuL3V0aWxzLmpzJztcbmltcG9ydCB7IGVuc3VyZUJ5dGVzIH0gZnJvbSAnLi91dGlscy5qcyc7XG5pbXBvcnQgeyB3TkFGLCB2YWxpZGF0ZUJhc2ljIH0gZnJvbSAnLi9jdXJ2ZS5qcyc7XG5mdW5jdGlvbiB2YWxpZGF0ZVBvaW50T3B0cyhjdXJ2ZSkge1xuICAgIGNvbnN0IG9wdHMgPSB2YWxpZGF0ZUJhc2ljKGN1cnZlKTtcbiAgICB1dC52YWxpZGF0ZU9iamVjdChvcHRzLCB7XG4gICAgICAgIGE6ICdmaWVsZCcsXG4gICAgICAgIGI6ICdmaWVsZCcsXG4gICAgfSwge1xuICAgICAgICBhbGxvd2VkUHJpdmF0ZUtleUxlbmd0aHM6ICdhcnJheScsXG4gICAgICAgIHdyYXBQcml2YXRlS2V5OiAnYm9vbGVhbicsXG4gICAgICAgIGlzVG9yc2lvbkZyZWU6ICdmdW5jdGlvbicsXG4gICAgICAgIGNsZWFyQ29mYWN0b3I6ICdmdW5jdGlvbicsXG4gICAgICAgIGFsbG93SW5maW5pdHlQb2ludDogJ2Jvb2xlYW4nLFxuICAgICAgICBmcm9tQnl0ZXM6ICdmdW5jdGlvbicsXG4gICAgICAgIHRvQnl0ZXM6ICdmdW5jdGlvbicsXG4gICAgfSk7XG4gICAgY29uc3QgeyBlbmRvLCBGcCwgYSB9ID0gb3B0cztcbiAgICBpZiAoZW5kbykge1xuICAgICAgICBpZiAoIUZwLmVxbChhLCBGcC5aRVJPKSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdFbmRvbW9ycGhpc20gY2FuIG9ubHkgYmUgZGVmaW5lZCBmb3IgS29ibGl0eiBjdXJ2ZXMgdGhhdCBoYXZlIGE9MCcpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2YgZW5kbyAhPT0gJ29iamVjdCcgfHxcbiAgICAgICAgICAgIHR5cGVvZiBlbmRvLmJldGEgIT09ICdiaWdpbnQnIHx8XG4gICAgICAgICAgICB0eXBlb2YgZW5kby5zcGxpdFNjYWxhciAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdFeHBlY3RlZCBlbmRvbW9ycGhpc20gd2l0aCBiZXRhOiBiaWdpbnQgYW5kIHNwbGl0U2NhbGFyOiBmdW5jdGlvbicpO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybi
26774BPYmplY3QuZnJlZXplKHsgLi4ub3B0cyB9KTtcbn1cbi8vIEFTTi4xIERFUiBlbmNvZGluZyB1dGlsaXRpZXNcbmNvbnN0IHsgYnl0ZXNUb051bWJlckJFOiBiMm4sIGhleFRvQnl0ZXM6IGgyYiB9ID0gdXQ7XG5leHBvcnQgY29uc3QgREVSID0ge1xuICAgIC8vIGFzbi4xIERFUiBlbmNvZGluZyB1dGlsc1xuICAgIEVycjogY2xhc3MgREVSRXJyIGV4dGVuZHMgRXJyb3Ige1xuICAgICAgICBjb25zdHJ1Y3RvcihtID0gJycpIHtcbiAgICAgICAgICAgIHN1cGVyKG0pO1xuICAgICAgICB9XG4gICAgfSxcbiAgICBfcGFyc2VJbnQoZGF0YSkge1xuICAgICAgICBjb25zdCB7IEVycjogRSB9ID0gREVSO1xuICAgICAgICBpZiAoZGF0YS5sZW5ndGggPCAyIHx8IGRhdGFbMF0gIT09IDB4MDIpXG4gICAgICAgICAgICB0aHJvdyBuZXcgRSgnSW52YWxpZCBzaWduYXR1cmUgaW50ZWdlciB0YWcnKTtcbiAgICAgICAgY29uc3QgbGVuID0gZGF0YVsxXTtcbiAgICAgICAgY29uc3QgcmVzID0gZGF0YS5zdWJhcnJheSgyLCBsZW4gKyAyKTtcbiAgICAgICAgaWYgKCFsZW4gfHwgcmVzLmxlbmd0aCAhPT0gbGVuKVxuICAgICAgICAgICAgdGhyb3cgbmV3IEUoJ0ludmFsaWQgc2lnbmF0dXJlIGludGVnZXI6IHdyb25nIGxlbmd0aCcpO1xuICAgICAgICAvLyBodHRwczovL2NyeXB0by5zdGFja2V4Y2hhbmdlLmNvbS9hLzU3NzM0IExlZnRtb3N0IGJpdCBvZiBmaXJzdCBieXRlIGlzICduZWdhdGl2ZScgZmxhZyxcbiAgICAgICAgLy8gc2luY2Ugd2UgYWx3YXlzIHVzZSBwb3NpdGl2ZSBpbnRlZ2VycyBoZXJlLiBJdCBtdXN0IGFsd2F5cyBiZSBlbXB0eTpcbiAgICAgICAgLy8gLSBhZGQgemVybyBieXRlIGlmIGV4aXN0c1xuICAgICAgICAvLyAtIGlmIG5leHQgYnl0ZSBkb2Vzbid0IGhhdmUgYSBmbGFnLCBsZWFkaW5nIHplcm8gaXMgbm90IGFsbG93ZWQgKG1pbmltYWwgZW5jb2RpbmcpXG4gICAgICAgIGlmIChyZXNbMF0gJiAwYjEwMDAwMDAwKVxuICAgICAgICAgICAgdGhyb3cgbmV3IEUoJ0ludmFsaWQgc2lnbmF0dXJlIGludGVnZXI6IG5lZ2F0aXZlJyk7XG4gICAgICAgIGlmIChyZXNbMF0gPT09IDB4MDAgJiYgIShyZXNbMV0gJiAwYjEwMDAwMDAwKSlcbiAgICAgICAgICAgIHRocm93IG5ldyBFKCdJbnZhbGlkIHNpZ25hdHVyZSBpbnRlZ2VyOiB1bm5lY2Vzc2FyeSBsZWFkaW5nIHplcm8nKTtcbiAgICAgICAgcmV0dXJuIHsgZDogYjJuKHJlcyksIGw6IGRhdGEuc3ViYXJyYXkobGVuICsgMikgfTsgLy8gZCBpcyBkYXRhLCBsIGlzIGxlZnRcbiAgICB9LFxuICAgIHRvU2lnKGhleCkge1xuICAgICAgICAvLyBwYXJzZSBERVIgc2lnbmF0dXJlXG4gICAgICAgIGNvbnN0IHsgRXJyOiBFIH0gPSBERVI7XG4gICAgICAgIGNvbnN0IGRhdGEgPSB0eXBlb2YgaGV4ID09PSAnc3RyaW5nJyA/IGgyYihoZXgpIDogaGV4O1xuICAgICAgICBpZiAoIShkYXRhIGluc3RhbmNlb2YgVWludDhBcnJheSkpXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ3VpOGEgZXhwZWN0ZWQnKTtcbiAgICAgICAgbGV0IGwgPSBkYXRhLmxlbmd0aDtcbiAgICAgICAgaWYgKGwgPCAyIHx8IGRhdGFbMF0gIT0gMHgzMClcbiAgICAgICAgICAgIHRocm93IG5ldyBFKCdJbnZhbGlkIHNpZ25hdHVyZSB0YWcnKTtcbiAgICAgICAgaWYgKGRhdGFbMV0gIT09IGwgLSAyKVxuICAgICAgICAgICAgdGhyb3cgbmV3IEUoJ0ludmFsaWQgc2lnbmF0dXJlOiBpbmNvcnJlY3QgbGVuZ3RoJyk7XG4gICAgICAgIGNvbnN0IHsgZDogciwgbDogc0J5dGVzIH0gPSBERVIuX3BhcnNlSW50KGRhdGEuc3ViYXJyYXkoMikpO1xuICAgICAgICBjb25zdCB7IGQ6IHMsIGw6IHJCeXRlc0xlZnQgfSA9IERFUi5fcGFyc2VJbnQoc0J5dGVzKTtcbiAgICAgICAgaWYgKHJCeXRlc0xlZnQubGVuZ3RoKVxuICAgICAgICAgICAgdGhyb3cgbmV3IEUoJ0ludmFsaWQgc2lnbmF0dXJlOiBsZWZ0IGJ5dGVzIGFmdGVyIHBhcnNpbmcnKTtcbiAgICAgICAgcmV0dXJuIHsgciwgcyB9O1xuICAgIH0sXG4gICAgaGV4RnJvbVNpZyhzaWcpIHtcbiAgICAgICAgLy8gQWRkIGxlYWRpbmcgemVybyBpZiBmaXJzdCBieXRlIGhhcyBuZWdhdGl2ZSBiaXQgZW5hYmxlZC4gTW9yZSBkZXRhaWxzIGluICdfcGFyc2VJbnQnXG4gICAgICAgIGNvbnN0IHNsaWNlID0gKHMpID0+IChOdW1iZXIucGFyc2VJbnQoc1swXSwgMTYpICYgMGIxMDAwID8gJzAwJyArIHMgOiBzKTtcbiAgICAgICAgY29uc3QgaCA9IChudW0pID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGhleCA9IG51bS50b1N0cmluZygxNik7XG4gICAgICAgICAgICByZXR1cm4gaGV4Lmxlbmd0aCAmIDEgPyBgMCR7aGV4fWAgOiBoZXg7XG4gICAgICAgIH07XG4gICAgICAgIGNvbnN0IHMgPSBzbGljZShoKHNpZy5zKSk7XG4gICAgICAgIGNvbnN0IHIgPSBzbGljZShoKHNpZy5yKSk7XG4gICAgICAgIGNvbnN0IHNobCA9IHMubGVuZ3RoIC8gMjtcbiAgICAgICAgY29uc3QgcmhsID0gci5sZW5ndGggLyAyO1xuICAgICAgICBjb25zdCBzbCA9IGgoc2hsKTtcbiAgICAgICAgY29uc3QgcmwgPSBoKHJobCk7XG4gICAgICAgIHJldHVybiBgMzAke2gocmhsICsgc2hsICsgNCl9MDIke3JsfSR7cn0wMiR7c2x9JHtzfWA7XG4gICAgfSxcbn07XG4vLyBCZSBmcmllbmRseSB0byBiYWQgRUNNQVNjcmlwdCBwYXJzZXJzIGJ5IG5vdCB1c2luZyBiaWdpbnQgbGl0ZXJhbHNcbi8vIHByZXR0aWVyLWlnbm9yZVxuY29uc3QgXzBuID0gQmlnSW50KDApLCBfMW4gPSBCaWdJbnQoMSksIF8ybiA9IEJpZ0ludCgyKSwgXzNuID0gQmlnSW50KDMpLCBfNG4gPSBCaWdJbnQoNCk7XG5leHBvcnQgZnVuY3Rpb24gd2VpZXJzdHJhc3NQb2ludHMob3B0cykge1xuICAgIGNvbnN0IENVUlZFID0gdmFsaWRhdGVQb2ludE9wdHMob3B0cyk7XG4gICAgY29uc3QgeyBGcCB9ID0gQ1VSVkU7IC8vIEFsbCBjdXJ2ZXMgaGFzIHNhbWUgZmllbGQgLyBncm91cCBsZW5ndGggYXMgZm9yIG5vdywgYnV0IHRoZXkgY2FuIGRpZmZlclxuICAgIGNvbnN0IHRvQnl0ZXMgPSBDVVJWRS50b0J5dGVzIHx8XG4gICAgICAgICgoX2MsIHBvaW50LCBfaXNDb21wcmVzc2VkKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBhID0gcG9pbnQudG9BZmZpbmUoKTtcbiAgICAgICAgICAgI
26774HJldHVybiB1dC5jb25jYXRCeXRlcyhVaW50OEFycmF5LmZyb20oWzB4MDRdKSwgRnAudG9CeXRlcyhhLngpLCBGcC50b0J5dGVzKGEueSkpO1xuICAgICAgICB9KTtcbiAgICBjb25zdCBmcm9tQnl0ZXMgPSBDVVJWRS5mcm9tQnl0ZXMgfHxcbiAgICAgICAgKChieXRlcykgPT4ge1xuICAgICAgICAgICAgLy8gY29uc3QgaGVhZCA9IGJ5dGVzWzBdO1xuICAgICAgICAgICAgY29uc3QgdGFpbCA9IGJ5dGVzLnN1YmFycmF5KDEpO1xuICAgICAgICAgICAgLy8gaWYgKGhlYWQgIT09IDB4MDQpIHRocm93IG5ldyBFcnJvcignT25seSBub24tY29tcHJlc3NlZCBlbmNvZGluZyBpcyBzdXBwb3J0ZWQnKTtcbiAgICAgICAgICAgIGNvbnN0IHggPSBGcC5mcm9tQnl0ZXModGFpbC5zdWJhcnJheSgwLCBGcC5CWVRFUykpO1xuICAgICAgICAgICAgY29uc3QgeSA9IEZwLmZyb21CeXRlcyh0YWlsLnN1YmFycmF5KEZwLkJZVEVTLCAyICogRnAuQllURVMpKTtcbiAgICAgICAgICAgIHJldHVybiB7IHgsIHkgfTtcbiAgICAgICAgfSk7XG4gICAgLyoqXG4gICAgICogecKyID0geMKzICsgYXggKyBiOiBTaG9ydCB3ZWllcnN0cmFzcyBjdXJ2ZSBmb3JtdWxhXG4gICAgICogQHJldHVybnMgecKyXG4gICAgICovXG4gICAgZnVuY3Rpb24gd2VpZXJzdHJhc3NFcXVhdGlvbih4KSB7XG4gICAgICAgIGNvbnN0IHsgYSwgYiB9ID0gQ1VSVkU7XG4gICAgICAgIGNvbnN0IHgyID0gRnAuc3FyKHgpOyAvLyB4ICogeFxuICAgICAgICBjb25zdCB4MyA9IEZwLm11bCh4MiwgeCk7IC8vIHgyICogeFxuICAgICAgICByZXR1cm4gRnAuYWRkKEZwLmFkZCh4MywgRnAubXVsKHgsIGEpKSwgYik7IC8vIHgzICsgYSAqIHggKyBiXG4gICAgfVxuICAgIC8vIFZhbGlkYXRlIHdoZXRoZXIgdGhlIHBhc3NlZCBjdXJ2ZSBwYXJhbXMgYXJlIHZhbGlkLlxuICAgIC8vIFdlIGNoZWNrIGlmIGN1cnZlIGVxdWF0aW9uIHdvcmtzIGZvciBnZW5lcmF0b3IgcG9pbnQuXG4gICAgLy8gYGFzc2VydFZhbGlkaXR5KClgIHdvbid0IHdvcms6IGBpc1RvcnNpb25GcmVlKClgIGlzIG5vdCBhdmFpbGFibGUgYXQgdGhpcyBwb2ludCBpbiBibHMxMi0zODEuXG4gICAgLy8gUHJvamVjdGl2ZVBvaW50IGNsYXNzIGhhcyBub3QgYmVlbiBpbml0aWFsaXplZCB5ZXQuXG4gICAgaWYgKCFGcC5lcWwoRnAuc3FyKENVUlZFLkd5KSwgd2VpZXJzdHJhc3NFcXVhdGlvbihDVVJWRS5HeCkpKVxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2JhZCBnZW5lcmF0b3IgcG9pbnQ6IGVxdWF0aW9uIGxlZnQgIT0gcmlnaHQnKTtcbiAgICAvLyBWYWxpZCBncm91cCBlbGVtZW50cyByZXNpZGUgaW4gcmFuZ2UgMS4ubi0xXG4gICAgZnVuY3Rpb24gaXNXaXRoaW5DdXJ2ZU9yZGVyKG51bSkge1xuICAgICAgICByZXR1cm4gdHlwZW9mIG51bSA9PT0gJ2JpZ2ludCcgJiYgXzBuIDwgbnVtICYmIG51bSA8IENVUlZFLm47XG4gICAgfVxuICAgIGZ1bmN0aW9uIGFzc2VydEdFKG51bSkge1xuICAgICAgICBpZiAoIWlzV2l0aGluQ3VydmVPcmRlcihudW0pKVxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdFeHBlY3RlZCB2YWxpZCBiaWdpbnQ6IDAgPCBiaWdpbnQgPCBjdXJ2ZS5uJyk7XG4gICAgfVxuICAgIC8vIFZhbGlkYXRlcyBpZiBwcml2IGtleSBpcyB2YWxpZCBhbmQgY29udmVydHMgaXQgdG8gYmlnaW50LlxuICAgIC8vIFN1cHBvcnRzIG9wdGlvbnMgYWxsb3dlZFByaXZhdGVLZXlMZW5ndGhzIGFuZCB3cmFwUHJpdmF0ZUtleS5cbiAgICBmdW5jdGlvbiBub3JtUHJpdmF0ZUtleVRvU2NhbGFyKGtleSkge1xuICAgICAgICBjb25zdCB7IGFsbG93ZWRQcml2YXRlS2V5TGVuZ3RoczogbGVuZ3RocywgbkJ5dGVMZW5ndGgsIHdyYXBQcml2YXRlS2V5LCBuIH0gPSBDVVJWRTtcbiAgICAgICAgaWYgKGxlbmd0aHMgJiYgdHlwZW9mIGtleSAhPT0gJ2JpZ2ludCcpIHtcbiAgICAgICAgICAgIGlmIChrZXkgaW5zdGFuY2VvZiBVaW50OEFycmF5KVxuICAgICAgICAgICAgICAgIGtleSA9IHV0LmJ5dGVzVG9IZXgoa2V5KTtcbiAgICAgICAgICAgIC8vIE5vcm1hbGl6ZSB0byBoZXggc3RyaW5nLCBwYWQuIEUuZy4gUDUyMSB3b3VsZCBub3JtIDEzMC0xMzIgY2hhciBoZXggdG8gMTMyLWNoYXIgYnl0ZXNcbiAgICAgICAgICAgIGlmICh0eXBlb2Yga2V5ICE9PSAnc3RyaW5nJyB8fCAhbGVuZ3Rocy5pbmNsdWRlcyhrZXkubGVuZ3RoKSlcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQga2V5Jyk7XG4gICAgICAgICAgICBrZXkgPSBrZXkucGFkU3RhcnQobkJ5dGVMZW5ndGggKiAyLCAnMCcpO1xuICAgICAgICB9XG4gICAgICAgIGxldCBudW07XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBudW0gPVxuICAgICAgICAgICAgICAgIHR5cGVvZiBrZXkgPT09ICdiaWdpbnQnXG4gICAgICAgICAgICAgICAgICAgID8ga2V5XG4gICAgICAgICAgICAgICAgICAgIDogdXQuYnl0ZXNUb051bWJlckJFKGVuc3VyZUJ5dGVzKCdwcml2YXRlIGtleScsIGtleSwgbkJ5dGVMZW5ndGgpKTtcbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgcHJpdmF0ZSBrZXkgbXVzdCBiZSAke25CeXRlTGVuZ3RofSBieXRlcywgaGV4IG9yIGJpZ2ludCwgbm90ICR7dHlwZW9mIGtleX1gKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAod3JhcFByaXZhdGVLZXkpXG4gICAgICAgICAgICBudW0gPSBtb2QubW9kKG51bSwgbik7IC8vIGRpc2FibGVkIGJ5IGRlZmF1bHQsIGVuYWJsZWQgZm9yIEJMU1xuICAgICAgICBhc3NlcnRHRShudW0pOyAvLyBudW0gaW4gcmFuZ2UgWzEuLk4tMV1cbiAgICAgICAgcmV0dXJuIG51bTtcbiAgICB9XG4gICAgY29uc3QgcG9pbnRQcmVjb21wdXRlcyA9IG5ldyBNYXAoKTtcbiAgICBmdW5jdGlvbiBhc3NlcnRQcmpQb2ludChvdGhlcikge1xuICAgICAgICBpZiAoIShvdGhlciBpbnN0YW5jZW9mIFBvaW50KSlcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignUHJvamVjdGl2ZVBvaW50IGV4cGVjdGVkJyk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFByb2plY3RpdmUgUG9pbnQgd29ya3MgaW4gM2QgLyBwcm9qZWN0aXZlIChob21vZ2VuZW91cykgY29vcmRpbmF0ZXM6ICh4LCB5LCB6KSDiiIsgKHg9eC96LCB5PXkveilcbiAgICAgKiBEZWZhdWx0IFBvaW50IHdvcmtzIGluIDJkIC8gYWZmaW5lIGNvb3JkaW5hdGVzOiAoeCwgeSlcbiAgICAgKiBXZSdyZSBkb2luZyBjYWxjdWxhdGlvbnMgaW4gcHJvamVjdGl2ZSwgYmVjYXVzZSBpdHMgb3BlcmF0aW9ucyBkb24ndCByZXF1aXJlIGNvc3RseSBpbnZlcnNpb24uXG4gICAgICovXG4gICAgY2xhc3MgUG9pbnQge1xuICAgICAgICBjb25zdHJ1Y3RvcihweCwgcHksIHB6KSB7XG4gICAgICAgICAgICB0aGlzLnB4ID0gcHg7XG4gICAgICAgICAgICB0aGlzLnB5ID0gcHk7XG4gICAgICAgICAgICB0aGlzLnB6ID0gcHo7XG4gICAgICAgICAgICBpZiAocHggPT0gbnVsbCB8fCAhRnAuaXNWYWxpZC
26774hweCkpXG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCd4IHJlcXVpcmVkJyk7XG4gICAgICAgICAgICBpZiAocHkgPT0gbnVsbCB8fCAhRnAuaXNWYWxpZChweSkpXG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCd5IHJlcXVpcmVkJyk7XG4gICAgICAgICAgICBpZiAocHogPT0gbnVsbCB8fCAhRnAuaXNWYWxpZChweikpXG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCd6IHJlcXVpcmVkJyk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gRG9lcyBub3QgdmFsaWRhdGUgaWYgdGhlIHBvaW50IGlzIG9uLWN1cnZlLlxuICAgICAgICAvLyBVc2UgZnJvbUhleCBpbnN0ZWFkLCBvciBjYWxsIGFzc2VydFZhbGlkaXR5KCkgbGF0ZXIuXG4gICAgICAgIHN0YXRpYyBmcm9tQWZmaW5lKHApIHtcbiAgICAgICAgICAgIGNvbnN0IHsgeCwgeSB9ID0gcCB8fCB7fTtcbiAgICAgICAgICAgIGlmICghcCB8fCAhRnAuaXNWYWxpZCh4KSB8fCAhRnAuaXNWYWxpZCh5KSlcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgYWZmaW5lIHBvaW50Jyk7XG4gICAgICAgICAgICBpZiAocCBpbnN0YW5jZW9mIFBvaW50KVxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcigncHJvamVjdGl2ZSBwb2ludCBub3QgYWxsb3dlZCcpO1xuICAgICAgICAgICAgY29uc3QgaXMwID0gKGkpID0+IEZwLmVxbChpLCBGcC5aRVJPKTtcbiAgICAgICAgICAgIC8vIGZyb21BZmZpbmUoeDowLCB5OjApIHdvdWxkIHByb2R1Y2UgKHg6MCwgeTowLCB6OjEpLCBidXQgd2UgbmVlZCAoeDowLCB5OjEsIHo6MClcbiAgICAgICAgICAgIGlmIChpczAoeCkgJiYgaXMwKHkpKVxuICAgICAgICAgICAgICAgIHJldHVybiBQb2ludC5aRVJPO1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBQb2ludCh4LCB5LCBGcC5PTkUpO1xuICAgICAgICB9XG4gICAgICAgIGdldCB4KCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMudG9BZmZpbmUoKS54O1xuICAgICAgICB9XG4gICAgICAgIGdldCB5KCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMudG9BZmZpbmUoKS55O1xuICAgICAgICB9XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUYWtlcyBhIGJ1bmNoIG9mIFByb2plY3RpdmUgUG9pbnRzIGJ1dCBleGVjdXRlcyBvbmx5IG9uZVxuICAgICAgICAgKiBpbnZlcnNpb24gb24gYWxsIG9mIHRoZW0uIEludmVyc2lvbiBpcyB2ZXJ5IHNsb3cgb3BlcmF0aW9uLFxuICAgICAgICAgKiBzbyB0aGlzIGltcHJvdmVzIHBlcmZvcm1hbmNlIG1hc3NpdmVseS5cbiAgICAgICAgICogT3B0aW1pemF0aW9uOiBjb252ZXJ0cyBhIGxpc3Qgb2YgcHJvamVjdGl2ZSBwb2ludHMgdG8gYSBsaXN0IG9mIGlkZW50aWNhbCBwb2ludHMgd2l0aCBaPTEuXG4gICAgICAgICAqL1xuICAgICAgICBzdGF0aWMgbm9ybWFsaXplWihwb2ludHMpIHtcbiAgICAgICAgICAgIGNvbnN0IHRvSW52ID0gRnAuaW52ZXJ0QmF0Y2gocG9pbnRzLm1hcCgocCkgPT4gcC5weikpO1xuICAgICAgICAgICAgcmV0dXJuIHBvaW50cy5tYXAoKHAsIGkpID0+IHAudG9BZmZpbmUodG9JbnZbaV0pKS5tYXAoUG9pbnQuZnJvbUFmZmluZSk7XG4gICAgICAgIH1cbiAgICAgICAgLyoqXG4gICAgICAgICAqIENvbnZlcnRzIGhhc2ggc3RyaW5nIG9yIFVpbnQ4QXJyYXkgdG8gUG9pbnQuXG4gICAgICAgICAqIEBwYXJhbSBoZXggc2hvcnQvbG9uZyBFQ0RTQSBoZXhcbiAgICAgICAgICovXG4gICAgICAgIHN0YXRpYyBmcm9tSGV4KGhleCkge1xuICAgICAgICAgICAgY29uc3QgUCA9IFBvaW50LmZyb21BZmZpbmUoZnJvbUJ5dGVzKGVuc3VyZUJ5dGVzKCdwb2ludEhleCcsIGhleCkpKTtcbiAgICAgICAgICAgIFAuYXNzZXJ0VmFsaWRpdHkoKTtcbiAgICAgICAgICAgIHJldHVybiBQO1xuICAgICAgICB9XG4gICAgICAgIC8vIE11bHRpcGxpZXMgZ2VuZXJhdG9yIHBvaW50IGJ5IHByaXZhdGVLZXkuXG4gICAgICAgIHN0YXRpYyBmcm9tUHJpdmF0ZUtleShwcml2YXRlS2V5KSB7XG4gICAgICAgICAgICByZXR1cm4gUG9pbnQuQkFTRS5tdWx0aXBseShub3JtUHJpdmF0ZUtleVRvU2NhbGFyKHByaXZhdGVLZXkpKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBcIlByaXZhdGUgbWV0aG9kXCIsIGRvbid0IHVzZSBpdCBkaXJlY3RseVxuICAgICAgICBfc2V0V2luZG93U2l6ZSh3aW5kb3dTaXplKSB7XG4gICAgICAgICAgICB0aGlzLl9XSU5ET1dfU0laRSA9IHdpbmRvd1NpemU7XG4gICAgICAgICAgICBwb2ludFByZWNvbXB1dGVzLmRlbGV0ZSh0aGlzKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBBIHBvaW50IG9uIGN1cnZlIGlzIHZhbGlkIGlmIGl0IGNvbmZvcm1zIHRvIGVxdWF0aW9uLlxuICAgICAgICBhc3NlcnRWYWxpZGl0eSgpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLmlzMCgpKSB7XG4gICAgICAgICAgICAgICAgLy8gKDAsIDEsIDApIGFrYSBaRVJPIGlzIGludmFsaWQgaW4gbW9zdCBjb250ZXh0cy5cbiAgICAgICAgICAgICAgICAvLyBJbiBCTFMsIFpFUk8gY2FuIGJlIHNlcmlhbGl6ZWQsIHNvIHdlIGFsbG93IGl0LlxuICAgICAgICAgICAgICAgIC8vICgwLCAwLCAwKSBpcyB3cm9uZyByZXByZXNlbnRhdGlvbiBvZiBaRVJPIGFuZCBpcyBhbHdheXMgaW52YWxpZC5cbiAgICAgICAgICAgICAgICBpZiAoQ1VSVkUuYWxsb3dJbmZpbml0eVBvaW50ICYmICFGcC5pczAodGhpcy5weSkpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2JhZCBwb2ludDogWkVSTycpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gU29tZSAzcmQtcGFydHkgdGVzdCB2ZWN0b3JzIHJlcXVpcmUgZGlmZmVyZW50IHdvcmRpbmcgYmV0d2VlbiBoZXJlICYgYGZyb21Db21wcmVzc2VkSGV4YFxuICAgICAgICAgICAgY29uc3QgeyB4LCB5IH0gPSB0aGlzLnRvQWZmaW5lKCk7XG4gICAgICAgICAgICAvLyBDaGVjayBpZiB4LCB5IGFyZSB2YWxpZCBmaWVsZCBlbGVtZW50c1xuICAgICAgICAgICAgaWYgKCFGcC5pc1ZhbGlkKHgpIHx8ICFGcC5pc1ZhbGlkKHkpKVxuICAgICAgICAgICAgICAgI
26774HRocm93IG5ldyBFcnJvcignYmFkIHBvaW50OiB4IG9yIHkgbm90IEZFJyk7XG4gICAgICAgICAgICBjb25zdCBsZWZ0ID0gRnAuc3FyKHkpOyAvLyB5wrJcbiAgICAgICAgICAgIGNvbnN0IHJpZ2h0ID0gd2VpZXJzdHJhc3NFcXVhdGlvbih4KTsgLy8geMKzICsgYXggKyBiXG4gICAgICAgICAgICBpZiAoIUZwLmVxbChsZWZ0LCByaWdodCkpXG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdiYWQgcG9pbnQ6IGVxdWF0aW9uIGxlZnQgIT0gcmlnaHQnKTtcbiAgICAgICAgICAgIGlmICghdGhpcy5pc1RvcnNpb25GcmVlKCkpXG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdiYWQgcG9pbnQ6IG5vdCBpbiBwcmltZS1vcmRlciBzdWJncm91cCcpO1xuICAgICAgICB9XG4gICAgICAgIGhhc0V2ZW5ZKCkge1xuICAgICAgICAgICAgY29uc3QgeyB5IH0gPSB0aGlzLnRvQWZmaW5lKCk7XG4gICAgICAgICAgICBpZiAoRnAuaXNPZGQpXG4gICAgICAgICAgICAgICAgcmV0dXJuICFGcC5pc09kZCh5KTtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIkZpZWxkIGRvZXNuJ3Qgc3VwcG9ydCBpc09kZFwiKTtcbiAgICAgICAgfVxuICAgICAgICAvKipcbiAgICAgICAgICogQ29tcGFyZSBvbmUgcG9pbnQgdG8gYW5vdGhlci5cbiAgICAgICAgICovXG4gICAgICAgIGVxdWFscyhvdGhlcikge1xuICAgICAgICAgICAgYXNzZXJ0UHJqUG9pbnQob3RoZXIpO1xuICAgICAgICAgICAgY29uc3QgeyBweDogWDEsIHB5OiBZMSwgcHo6IFoxIH0gPSB0aGlzO1xuICAgICAgICAgICAgY29uc3QgeyBweDogWDIsIHB5OiBZMiwgcHo6IFoyIH0gPSBvdGhlcjtcbiAgICAgICAgICAgIGNvbnN0IFUxID0gRnAuZXFsKEZwLm11bChYMSwgWjIpLCBGcC5tdWwoWDIsIFoxKSk7XG4gICAgICAgICAgICBjb25zdCBVMiA9IEZwLmVxbChGcC5tdWwoWTEsIFoyKSwgRnAubXVsKFkyLCBaMSkpO1xuICAgICAgICAgICAgcmV0dXJuIFUxICYmIFUyO1xuICAgICAgICB9XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBGbGlwcyBwb2ludCB0byBvbmUgY29ycmVzcG9uZGluZyB0byAoeCwgLXkpIGluIEFmZmluZSBjb29yZGluYXRlcy5cbiAgICAgICAgICovXG4gICAgICAgIG5lZ2F0ZSgpIHtcbiAgICAgICAgICAgIHJldHVybiBuZXcgUG9pbnQodGhpcy5weCwgRnAubmVnKHRoaXMucHkpLCB0aGlzLnB6KTtcbiAgICAgICAgfVxuICAgICAgICAvLyBSZW5lcy1Db3N0ZWxsby1CYXRpbmEgZXhjZXB0aW9uLWZyZWUgZG91YmxpbmcgZm9ybXVsYS5cbiAgICAgICAgLy8gVGhlcmUgaXMgMzAlIGZhc3RlciBKYWNvYmlhbiBmb3JtdWxhLCBidXQgaXQgaXMgbm90IGNvbXBsZXRlLlxuICAgICAgICAvLyBodHRwczovL2VwcmludC5pYWNyLm9yZy8yMDE1LzEwNjAsIGFsZ29yaXRobSAzXG4gICAgICAgIC8vIENvc3Q6IDhNICsgM1MgKyAzKmEgKyAyKmIzICsgMTVhZGQuXG4gICAgICAgIGRvdWJsZSgpIHtcbiAgICAgICAgICAgIGNvbnN0IHsgYSwgYiB9ID0gQ1VSVkU7XG4gICAgICAgICAgICBjb25zdCBiMyA9IEZwLm11bChiLCBfM24pO1xuICAgICAgICAgICAgY29uc3QgeyBweDogWDEsIHB5OiBZMSwgcHo6IFoxIH0gPSB0aGlzO1xuICAgICAgICAgICAgbGV0IFgzID0gRnAuWkVSTywgWTMgPSBGcC5aRVJPLCBaMyA9IEZwLlpFUk87IC8vIHByZXR0aWVyLWlnbm9yZVxuICAgICAgICAgICAgbGV0IHQwID0gRnAubXVsKFgxLCBYMSk7IC8vIHN0ZXAgMVxuICAgICAgICAgICAgbGV0IHQxID0gRnAubXVsKFkxLCBZMSk7XG4gICAgICAgICAgICBsZXQgdDIgPSBGcC5tdWwoWjEsIFoxKTtcbiAgICAgICAgICAgIGxldCB0MyA9IEZwLm11bChYMSwgWTEpO1xuICAgICAgICAgICAgdDMgPSBGcC5hZGQodDMsIHQzKTsgLy8gc3RlcCA1XG4gICAgICAgICAgICBaMyA9IEZwLm11bChYMSwgWjEpO1xuICAgICAgICAgICAgWjMgPSBGcC5hZGQoWjMsIFozKTtcbiAgICAgICAgICAgIFgzID0gRnAubXVsKGEsIFozKTtcbiAgICAgICAgICAgIFkzID0gRnAubXVsKGIzLCB0Mik7XG4gICAgICAgICAgICBZMyA9IEZwLmFkZChYMywgWTMpOyAvLyBzdGVwIDEwXG4gICAgICAgICAgICBYMyA9IEZwLnN1Yih0MSwgWTMpO1xuICAgICAgICAgICAgWTMgPSBGcC5hZGQodDEsIFkzKTtcbiAgICAgICAgICAgIFkzID0gRnAubXVsKFgzLCBZMyk7XG4gICAgICAgICAgICBYMyA9IEZwLm11bCh0MywgWDMpO1xuICAgICAgICAgICAgWjMgPSBGcC5tdWwoYjMsIFozKTsgLy8gc3RlcCAxNVxuICAgICAgICAgICAgdDIgPSBGcC5tdWwoYSwgdDIpO1xuICAgICAgICAgICAgdDMgPSBGcC5zdWIodDAsIHQyKTtcbiAgICAgICAgICAgIHQzID0gRnAubXVsKGEsIHQzKTtcbiAgICAgICAgICAgIHQzID0gRnAuYWRkKHQzLCBaMyk7XG4gICAgICAgICAgICBaMyA9IEZwLmFkZCh0MCwgdDApOyAvLyBzdGVwIDIwXG4gICAgICAgICAgICB0MCA9IEZwLmFkZChaMywgdDApO1xuICAgICAgICAgICAgdDAgPSBGcC5hZGQodDAsIHQyKTtcbiAgICAgICAgICAgIHQwID0gRnAubXVsKHQwLCB0Myk7XG4gICAgICAgICAgICBZMyA9IEZwLmFkZChZMywgdDApO1xuICAgICAgICAgICAgdDIgPSBGcC5tdWwoWTEsIFoxKTsgLy8gc3RlcCAyNVxuICAgICAgICAgICAgdDIgPSBGcC5hZGQodDIsIHQyKTtcbiAgICAgICAgICAgIHQwID0gRnAubXVsKHQyLCB0Myk7XG4gICAgICAgICAgICBYMyA9IEZwLnN1YihYMywgdDApO1xuICAgICAgICAgICAgWjMgPSBGcC5tdWwodDIsIHQxKTtcbiAgICAgICAgICAgIFozID0gRnAuYWRkKFozLCBaMyk7IC8vIHN0ZXAgMzBcbiAgICAgICAgICAgIFozID0gRnAuYWRkKFozLCBaMyk7XG4gICAgICAgICAgICByZXR1cm4gbmV3IFBvaW50KFgzLCBZMywgWjMpO1xuICAgICAgICB9XG4gICAgICAgIC8vIFJlbmVzLUNvc3RlbGxvLUJhdGluYSBleGNlcHRpb24tZnJlZSBhZGRpdGlvbiBmb3JtdWxhLlxuICAgICAgICAvLyBUaGVyZSBpcyAzMCUgZmFzdGVyIEphY29iaWFuIGZvcm11bGEsIGJ1dCBpdCBpcyBub3QgY29tcGxldGUuXG4gICAgICAgIC8vIGh0dHBzOi8vZXByaW50LmlhY3Iub3JnLzIwMTUvMTA2MCwgYWxnb3JpdGhtIDFcbiAgICAgICAgLy8gQ29zdDogMTJNICsgM
26774FMgKyAzKmEgKyAzKmIzICsgMjNhZGQuXG4gICAgICAgIGFkZChvdGhlcikge1xuICAgICAgICAgICAgYXNzZXJ0UHJqUG9pbnQob3RoZXIpO1xuICAgICAgICAgICAgY29uc3QgeyBweDogWDEsIHB5OiBZMSwgcHo6IFoxIH0gPSB0aGlzO1xuICAgICAgICAgICAgY29uc3QgeyBweDogWDIsIHB5OiBZMiwgcHo6IFoyIH0gPSBvdGhlcjtcbiAgICAgICAgICAgIGxldCBYMyA9IEZwLlpFUk8sIFkzID0gRnAuWkVSTywgWjMgPSBGcC5aRVJPOyAvLyBwcmV0dGllci1pZ25vcmVcbiAgICAgICAgICAgIGNvbnN0IGEgPSBDVVJWRS5hO1xuICAgICAgICAgICAgY29uc3QgYjMgPSBGcC5tdWwoQ1VSVkUuYiwgXzNuKTtcbiAgICAgICAgICAgIGxldCB0MCA9IEZwLm11bChYMSwgWDIpOyAvLyBzdGVwIDFcbiAgICAgICAgICAgIGxldCB0MSA9IEZwLm11bChZMSwgWTIpO1xuICAgICAgICAgICAgbGV0IHQyID0gRnAubXVsKFoxLCBaMik7XG4gICAgICAgICAgICBsZXQgdDMgPSBGcC5hZGQoWDEsIFkxKTtcbiAgICAgICAgICAgIGxldCB0NCA9IEZwLmFkZChYMiwgWTIpOyAvLyBzdGVwIDVcbiAgICAgICAgICAgIHQzID0gRnAubXVsKHQzLCB0NCk7XG4gICAgICAgICAgICB0NCA9IEZwLmFkZCh0MCwgdDEpO1xuICAgICAgICAgICAgdDMgPSBGcC5zdWIodDMsIHQ0KTtcbiAgICAgICAgICAgIHQ0ID0gRnAuYWRkKFgxLCBaMSk7XG4gICAgICAgICAgICBsZXQgdDUgPSBGcC5hZGQoWDIsIFoyKTsgLy8gc3RlcCAxMFxuICAgICAgICAgICAgdDQgPSBGcC5tdWwodDQsIHQ1KTtcbiAgICAgICAgICAgIHQ1ID0gRnAuYWRkKHQwLCB0Mik7XG4gICAgICAgICAgICB0NCA9IEZwLnN1Yih0NCwgdDUpO1xuICAgICAgICAgICAgdDUgPSBGcC5hZGQoWTEsIFoxKTtcbiAgICAgICAgICAgIFgzID0gRnAuYWRkKFkyLCBaMik7IC8vIHN0ZXAgMTVcbiAgICAgICAgICAgIHQ1ID0gRnAubXVsKHQ1LCBYMyk7XG4gICAgICAgICAgICBYMyA9IEZwLmFkZCh0MSwgdDIpO1xuICAgICAgICAgICAgdDUgPSBGcC5zdWIodDUsIFgzKTtcbiAgICAgICAgICAgIFozID0gRnAubXVsKGEsIHQ0KTtcbiAgICAgICAgICAgIFgzID0gRnAubXVsKGIzLCB0Mik7IC8vIHN0ZXAgMjBcbiAgICAgICAgICAgIFozID0gRnAuYWRkKFgzLCBaMyk7XG4gICAgICAgICAgICBYMyA9IEZwLnN1Yih0MSwgWjMpO1xuICAgICAgICAgICAgWjMgPSBGcC5hZGQodDEsIFozKTtcbiAgICAgICAgICAgIFkzID0gRnAubXVsKFgzLCBaMyk7XG4gICAgICAgICAgICB0MSA9IEZwLmFkZCh0MCwgdDApOyAvLyBzdGVwIDI1XG4gICAgICAgICAgICB0MSA9IEZwLmFkZCh0MSwgdDApO1xuICAgICAgICAgICAgdDIgPSBGcC5tdWwoYSwgdDIpO1xuICAgICAgICAgICAgdDQgPSBGcC5tdWwoYjMsIHQ0KTtcbiAgICAgICAgICAgIHQxID0gRnAuYWRkKHQxLCB0Mik7XG4gICAgICAgICAgICB0MiA9IEZwLnN1Yih0MCwgdDIpOyAvLyBzdGVwIDMwXG4gICAgICAgICAgICB0MiA9IEZwLm11bChhLCB0Mik7XG4gICAgICAgICAgICB0NCA9IEZwLmFkZCh0NCwgdDIpO1xuICAgICAgICAgICAgdDAgPSBGcC5tdWwodDEsIHQ0KTtcbiAgICAgICAgICAgIFkzID0gRnAuYWRkKFkzLCB0MCk7XG4gICAgICAgICAgICB0MCA9IEZwLm11bCh0NSwgdDQpOyAvLyBzdGVwIDM1XG4gICAgICAgICAgICBYMyA9IEZwLm11bCh0MywgWDMpO1xuICAgICAgICAgICAgWDMgPSBGcC5zdWIoWDMsIHQwKTtcbiAgICAgICAgICAgIHQwID0gRnAubXVsKHQzLCB0MSk7XG4gICAgICAgICAgICBaMyA9IEZwLm11bCh0NSwgWjMpO1xuICAgICAgICAgICAgWjMgPSBGcC5hZGQoWjMsIHQwKTsgLy8gc3RlcCA0MFxuICAgICAgICAgICAgcmV0dXJuIG5ldyBQb2ludChYMywgWTMsIFozKTtcbiAgICAgICAgfVxuICAgICAgICBzdWJ0cmFjdChvdGhlcikge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuYWRkKG90aGVyLm5lZ2F0ZSgpKTtcbiAgICAgICAgfVxuICAgICAgICBpczAoKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5lcXVhbHMoUG9pbnQuWkVSTyk7XG4gICAgICAgIH1cbiAgICAgICAgd05BRihuKSB7XG4gICAgICAgICAgICByZXR1cm4gd25hZi53TkFGQ2FjaGVkKHRoaXMsIHBvaW50UHJlY29tcHV0ZXMsIG4sIChjb21wKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgdG9JbnYgPSBGcC5pbnZlcnRCYXRjaChjb21wLm1hcCgocCkgPT4gcC5weikpO1xuICAgICAgICAgICAgICAgIHJldHVybiBjb21wLm1hcCgocCwgaSkgPT4gcC50b0FmZmluZSh0b0ludltpXSkpLm1hcChQb2ludC5mcm9tQWZmaW5lKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBOb24tY29uc3RhbnQtdGltZSBtdWx0aXBsaWNhdGlvbi4gVXNlcyBkb3VibGUtYW5kLWFkZCBhbGdvcml0aG0uXG4gICAgICAgICAqIEl0J3MgZmFzdGVyLCBidXQgc2hvdWxkIG9ubHkgYmUgdXNlZCB3aGVuIHlvdSBkb24ndCBjYXJlIGFib3V0XG4gICAgICAgICAqIGFuIGV4cG9zZWQgcHJpdmF0ZSBrZXkgZS5nLiBzaWcgdmVyaWZpY2F0aW9uLCB3aGljaCB3b3JrcyBvdmVyICpwdWJsaWMqIGtleXMuXG4gICAgICAgICAqL1xuICAgICAgICBtdWx0aXBseVVuc2FmZShuKSB7XG4gICAgICAgICAgICBjb25zdCBJID0gUG9pbnQuWkVSTztcbiAgICAgICAgICAgIGlmIChuID09PSBfMG4pXG4gICAgICAgICAgICAgICAgcmV0dXJuIEk7XG4gICAgICAgICAgICBhc3NlcnRHRShuKTsgLy8gV2lsbCB0aHJvdyBvbiAwXG4gICAgICAgICAgICBpZiAobiA9PT0gXzFuKVxuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgICAgICAgY29uc3QgeyBlbmRvIH0gPSBDVVJWRTtcbiAgICAgICAgICAgIGlmICghZW5kbylcbiAgICAgICAgICAgICAgICByZXR1cm4gd25hZi51bnNhZmVMYWRkZXIodGhpcywgbik7XG4gICAgICAgICAgICAvLyBBcHBseSBlbmRvbW9ycGhpc21cbiAgICAgICAgICAgIGxldCB7IGsxbmVnLCBrMSwgazJuZWcsIGsyIH0gPSBlbmRvLnNwbGl0U2NhbGFyKG4pO1xuICAgICAgICAgICAgbGV0IGsxcCA9IEk7XG4gICAgICAgICAgICBsZXQgazJwID0gSTtcbiAgICAgICAgICAgIGxldCBkID0gdGhpcztcbiAgICAgICAgICAgI
26774HdoaWxlIChrMSA+IF8wbiB8fCBrMiA+IF8wbikge1xuICAgICAgICAgICAgICAgIGlmIChrMSAmIF8xbilcbiAgICAgICAgICAgICAgICAgICAgazFwID0gazFwLmFkZChkKTtcbiAgICAgICAgICAgICAgICBpZiAoazIgJiBfMW4pXG4gICAgICAgICAgICAgICAgICAgIGsycCA9IGsycC5hZGQoZCk7XG4gICAgICAgICAgICAgICAgZCA9IGQuZG91YmxlKCk7XG4gICAgICAgICAgICAgICAgazEgPj49IF8xbjtcbiAgICAgICAgICAgICAgICBrMiA+Pj0gXzFuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGsxbmVnKVxuICAgICAgICAgICAgICAgIGsxcCA9IGsxcC5uZWdhdGUoKTtcbiAgICAgICAgICAgIGlmIChrMm5lZylcbiAgICAgICAgICAgICAgICBrMnAgPSBrMnAubmVnYXRlKCk7XG4gICAgICAgICAgICBrMnAgPSBuZXcgUG9pbnQoRnAubXVsKGsycC5weCwgZW5kby5iZXRhKSwgazJwLnB5LCBrMnAucHopO1xuICAgICAgICAgICAgcmV0dXJuIGsxcC5hZGQoazJwKTtcbiAgICAgICAgfVxuICAgICAgICAvKipcbiAgICAgICAgICogQ29uc3RhbnQgdGltZSBtdWx0aXBsaWNhdGlvbi5cbiAgICAgICAgICogVXNlcyB3TkFGIG1ldGhvZC4gV2luZG93ZWQgbWV0aG9kIG1heSBiZSAxMCUgZmFzdGVyLFxuICAgICAgICAgKiBidXQgdGFrZXMgMnggbG9uZ2VyIHRvIGdlbmVyYXRlIGFuZCBjb25zdW1lcyAyeCBtZW1vcnkuXG4gICAgICAgICAqIFVzZXMgcHJlY29tcHV0ZXMgd2hlbiBhdmFpbGFibGUuXG4gICAgICAgICAqIFVzZXMgZW5kb21vcnBoaXNtIGZvciBLb2JsaXR6IGN1cnZlcy5cbiAgICAgICAgICogQHBhcmFtIHNjYWxhciBieSB3aGljaCB0aGUgcG9pbnQgd291bGQgYmUgbXVsdGlwbGllZFxuICAgICAgICAgKiBAcmV0dXJucyBOZXcgcG9pbnRcbiAgICAgICAgICovXG4gICAgICAgIG11bHRpcGx5KHNjYWxhcikge1xuICAgICAgICAgICAgYXNzZXJ0R0Uoc2NhbGFyKTtcbiAgICAgICAgICAgIGxldCBuID0gc2NhbGFyO1xuICAgICAgICAgICAgbGV0IHBvaW50LCBmYWtlOyAvLyBGYWtlIHBvaW50IGlzIHVzZWQgdG8gY29uc3QtdGltZSBtdWx0XG4gICAgICAgICAgICBjb25zdCB7IGVuZG8gfSA9IENVUlZFO1xuICAgICAgICAgICAgaWYgKGVuZG8pIHtcbiAgICAgICAgICAgICAgICBjb25zdCB7IGsxbmVnLCBrMSwgazJuZWcsIGsyIH0gPSBlbmRvLnNwbGl0U2NhbGFyKG4pO1xuICAgICAgICAgICAgICAgIGxldCB7IHA6IGsxcCwgZjogZjFwIH0gPSB0aGlzLndOQUYoazEpO1xuICAgICAgICAgICAgICAgIGxldCB7IHA6IGsycCwgZjogZjJwIH0gPSB0aGlzLndOQUYoazIpO1xuICAgICAgICAgICAgICAgIGsxcCA9IHduYWYuY29uc3RUaW1lTmVnYXRlKGsxbmVnLCBrMXApO1xuICAgICAgICAgICAgICAgIGsycCA9IHduYWYuY29uc3RUaW1lTmVnYXRlKGsybmVnLCBrMnApO1xuICAgICAgICAgICAgICAgIGsycCA9IG5ldyBQb2ludChGcC5tdWwoazJwLnB4LCBlbmRvLmJldGEpLCBrMnAucHksIGsycC5weik7XG4gICAgICAgICAgICAgICAgcG9pbnQgPSBrMXAuYWRkKGsycCk7XG4gICAgICAgICAgICAgICAgZmFrZSA9IGYxcC5hZGQoZjJwKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGNvbnN0IHsgcCwgZiB9ID0gdGhpcy53TkFGKG4pO1xuICAgICAgICAgICAgICAgIHBvaW50ID0gcDtcbiAgICAgICAgICAgICAgICBmYWtlID0gZjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIE5vcm1hbGl6ZSBgemAgZm9yIGJvdGggcG9pbnRzLCBidXQgcmV0dXJuIG9ubHkgcmVhbCBvbmVcbiAgICAgICAgICAgIHJldHVybiBQb2ludC5ub3JtYWxpemVaKFtwb2ludCwgZmFrZV0pWzBdO1xuICAgICAgICB9XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBFZmZpY2llbnRseSBjYWxjdWxhdGUgYGFQICsgYlFgLiBVbnNhZmUsIGNhbiBleHBvc2UgcHJpdmF0ZSBrZXksIGlmIHVzZWQgaW5jb3JyZWN0bHkuXG4gICAgICAgICAqIE5vdCB1c2luZyBTdHJhdXNzLVNoYW1pciB0cmljazogcHJlY29tcHV0YXRpb24gdGFibGVzIGFyZSBmYXN0ZXIuXG4gICAgICAgICAqIFRoZSB0cmljayBjb3VsZCBiZSB1c2VmdWwgaWYgYm90aCBQIGFuZCBRIGFyZSBub3QgRyAobm90IGluIG91ciBjYXNlKS5cbiAgICAgICAgICogQHJldHVybnMgbm9uLXplcm8gYWZmaW5lIHBvaW50XG4gICAgICAgICAqL1xuICAgICAgICBtdWx0aXBseUFuZEFkZFVuc2FmZShRLCBhLCBiKSB7XG4gICAgICAgICAgICBjb25zdCBHID0gUG9pbnQuQkFTRTsgLy8gTm8gU3RyYXVzcy1TaGFtaXIgdHJpY2s6IHdlIGhhdmUgMTAlIGZhc3RlciBHIHByZWNvbXB1dGVzXG4gICAgICAgICAgICBjb25zdCBtdWwgPSAoUCwgYSAvLyBTZWxlY3QgZmFzdGVyIG11bHRpcGx5KCkgbWV0aG9kXG4gICAgICAgICAgICApID0+IChhID09PSBfMG4gfHwgYSA9PT0gXzFuIHx8ICFQLmVxdWFscyhHKSA/IFAubXVsdGlwbHlVbnNhZmUoYSkgOiBQLm11bHRpcGx5KGEpKTtcbiAgICAgICAgICAgIGNvbnN0IHN1bSA9IG11bCh0aGlzLCBhKS5hZGQobXVsKFEsIGIpKTtcbiAgICAgICAgICAgIHJldHVybiBzdW0uaXMwKCkgPyB1bmRlZmluZWQgOiBzdW07XG4gICAgICAgIH1cbiAgICAgICAgLy8gQ29udmVydHMgUHJvamVjdGl2ZSBwb2ludCB0byBhZmZpbmUgKHgsIHkpIGNvb3JkaW5hdGVzLlxuICAgICAgICAvLyBDYW4gYWNjZXB0IHByZWNvbXB1dGVkIFpeLTEgLSBmb3IgZXhhbXBsZSwgZnJvbSBpbnZlcnRCYXRjaC5cbiAgICAgICAgLy8gKHgsIHksIHopIOKIiyAoeD14L3osIHk9eS96KVxuICAgICAgICB0b0FmZmluZShpeikge1xuICAgICAgICAgICAgY29uc3QgeyBweDogeCwgcHk6IHksIHB6OiB6IH0gPSB0aGlzO1xuICAgICAgICAgICAgY29uc3QgaXMwID0gdGhpcy5pczAoKTtcbiAgICAgICAgICAgIC8vIElmIGludlogd2FzIDAsIHdlIHJldHVybiB6ZXJvIHBvaW50LiBIb3dldmVyIHdlIHN0aWxsIHdhbnQgdG8gZXhlY3V0ZVxuICAgICAgICAgICAgLy8gYWxsIG9wZXJhdGlvbnMsIHNvIHdlIHJlcGxhY2UgaW52WiB3aXRoIGEgcmFuZG9tIG51bWJlciwgMS5cbiAgICAgICAgICAgIGlmIChpeiA9PSBudWxsKVxuICAgICAgICAgICAgICAgIGl6ID0gaXMwID8gRnAuT05FIDogRnAuaW52KHopO1xuICAgICAgICAgICAgY29uc3QgYXggPSBGcC5tdWwoeCwgaXopO1xuICAgICAgICAgICAgY29uc3QgYXkgPSBGcC5tdWwoeSwgaXopO1xuICAgICAgICAgICAgY29uc3QgenogPSBGcC5tdWwoeiwgaXopO1xuICAgICAgICAgICAgaWYgKGlzMClcbiAgICAgICAgICAgICAgICByZXR1cm4geyB4OiBGcC5aRVJPLCB5OiBGcC5aRVJPIH07XG4gICAgICAgICAgICBpZiAoIUZwLmVxbCh6eiwgRnAuT05FKSlcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludlogd2FzIGludmFsaWQnKTtcbiAgICAgICAgICAgI
26774HJldHVybiB7IHg6IGF4LCB5OiBheSB9O1xuICAgICAgICB9XG4gICAgICAgIGlzVG9yc2lvbkZyZWUoKSB7XG4gICAgICAgICAgICBjb25zdCB7IGg6IGNvZmFjdG9yLCBpc1RvcnNpb25GcmVlIH0gPSBDVVJWRTtcbiAgICAgICAgICAgIGlmIChjb2ZhY3RvciA9PT0gXzFuKVxuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOyAvLyBObyBzdWJncm91cHMsIGFsd2F5cyB0b3JzaW9uLWZyZWVcbiAgICAgICAgICAgIGlmIChpc1RvcnNpb25GcmVlKVxuICAgICAgICAgICAgICAgIHJldHVybiBpc1RvcnNpb25GcmVlKFBvaW50LCB0aGlzKTtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignaXNUb3JzaW9uRnJlZSgpIGhhcyBub3QgYmVlbiBkZWNsYXJlZCBmb3IgdGhlIGVsbGlwdGljIGN1cnZlJyk7XG4gICAgICAgIH1cbiAgICAgICAgY2xlYXJDb2ZhY3RvcigpIHtcbiAgICAgICAgICAgIGNvbnN0IHsgaDogY29mYWN0b3IsIGNsZWFyQ29mYWN0b3IgfSA9IENVUlZFO1xuICAgICAgICAgICAgaWYgKGNvZmFjdG9yID09PSBfMW4pXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXM7IC8vIEZhc3QtcGF0aFxuICAgICAgICAgICAgaWYgKGNsZWFyQ29mYWN0b3IpXG4gICAgICAgICAgICAgICAgcmV0dXJuIGNsZWFyQ29mYWN0b3IoUG9pbnQsIHRoaXMpO1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMubXVsdGlwbHlVbnNhZmUoQ1VSVkUuaCk7XG4gICAgICAgIH1cbiAgICAgICAgdG9SYXdCeXRlcyhpc0NvbXByZXNzZWQgPSB0cnVlKSB7XG4gICAgICAgICAgICB0aGlzLmFzc2VydFZhbGlkaXR5KCk7XG4gICAgICAgICAgICByZXR1cm4gdG9CeXRlcyhQb2ludCwgdGhpcywgaXNDb21wcmVzc2VkKTtcbiAgICAgICAgfVxuICAgICAgICB0b0hleChpc0NvbXByZXNzZWQgPSB0cnVlKSB7XG4gICAgICAgICAgICByZXR1cm4gdXQuYnl0ZXNUb0hleCh0aGlzLnRvUmF3Qnl0ZXMoaXNDb21wcmVzc2VkKSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgUG9pbnQuQkFTRSA9IG5ldyBQb2ludChDVVJWRS5HeCwgQ1VSVkUuR3ksIEZwLk9ORSk7XG4gICAgUG9pbnQuWkVSTyA9IG5ldyBQb2ludChGcC5aRVJPLCBGcC5PTkUsIEZwLlpFUk8pO1xuICAgIGNvbnN0IF9iaXRzID0gQ1VSVkUubkJpdExlbmd0aDtcbiAgICBjb25zdCB3bmFmID0gd05BRihQb2ludCwgQ1VSVkUuZW5kbyA/IE1hdGguY2VpbChfYml0cyAvIDIpIDogX2JpdHMpO1xuICAgIC8vIFZhbGlkYXRlIGlmIGdlbmVyYXRvciBwb2ludCBpcyBvbiBjdXJ2ZVxuICAgIHJldHVybiB7XG4gICAgICAgIENVUlZFLFxuICAgICAgICBQcm9qZWN0aXZlUG9pbnQ6IFBvaW50LFxuICAgICAgICBub3JtUHJpdmF0ZUtleVRvU2NhbGFyLFxuICAgICAgICB3ZWllcnN0cmFzc0VxdWF0aW9uLFxuICAgICAgICBpc1dpdGhpbkN1cnZlT3JkZXIsXG4gICAgfTtcbn1cbmZ1bmN0aW9uIHZhbGlkYXRlT3B0cyhjdXJ2ZSkge1xuICAgIGNvbnN0IG9wdHMgPSB2YWxpZGF0ZUJhc2ljKGN1cnZlKTtcbiAgICB1dC52YWxpZGF0ZU9iamVjdChvcHRzLCB7XG4gICAgICAgIGhhc2g6ICdoYXNoJyxcbiAgICAgICAgaG1hYzogJ2Z1bmN0aW9uJyxcbiAgICAgICAgcmFuZG9tQnl0ZXM6ICdmdW5jdGlvbicsXG4gICAgfSwge1xuICAgICAgICBiaXRzMmludDogJ2Z1bmN0aW9uJyxcbiAgICAgICAgYml0czJpbnRfbW9kTjogJ2Z1bmN0aW9uJyxcbiAgICAgICAgbG93UzogJ2Jvb2xlYW4nLFxuICAgIH0pO1xuICAgIHJldHVybiBPYmplY3QuZnJlZXplKHsgbG93UzogdHJ1ZSwgLi4ub3B0cyB9KTtcbn1cbmV4cG9ydCBmdW5jdGlvbiB3ZWllcnN0cmFzcyhjdXJ2ZURlZikge1xuICAgIGNvbnN0IENVUlZFID0gdmFsaWRhdGVPcHRzKGN1cnZlRGVmKTtcbiAgICBjb25zdCB7IEZwLCBuOiBDVVJWRV9PUkRFUiB9ID0gQ1VSVkU7XG4gICAgY29uc3QgY29tcHJlc3NlZExlbiA9IEZwLkJZVEVTICsgMTsgLy8gZS5nLiAzMyBmb3IgMzJcbiAgICBjb25zdCB1bmNvbXByZXNzZWRMZW4gPSAyICogRnAuQllURVMgKyAxOyAvLyBlLmcuIDY1IGZvciAzMlxuICAgIGZ1bmN0aW9uIGlzVmFsaWRGaWVsZEVsZW1lbnQobnVtKSB7XG4gICAgICAgIHJldHVybiBfMG4gPCBudW0gJiYgbnVtIDwgRnAuT1JERVI7IC8vIDAgaXMgYmFubmVkIHNpbmNlIGl0J3Mgbm90IGludmVydGlibGUgRkVcbiAgICB9XG4gICAgZnVuY3Rpb24gbW9kTihhKSB7XG4gICAgICAgIHJldHVybiBtb2QubW9kKGEsIENVUlZFX09SREVSKTtcbiAgICB9XG4gICAgZnVuY3Rpb24gaW52TihhKSB7XG4gICAgICAgIHJldHVybiBtb2QuaW52ZXJ0KGEsIENVUlZFX09SREVSKTtcbiAgICB9XG4gICAgY29uc3QgeyBQcm9qZWN0aXZlUG9pbnQ6IFBvaW50LCBub3JtUHJpdmF0ZUtleVRvU2NhbGFyLCB3ZWllcnN0cmFzc0VxdWF0aW9uLCBpc1dpdGhpbkN1cnZlT3JkZXIsIH0gPSB3ZWllcnN0cmFzc1BvaW50cyh7XG4gICAgICAgIC4uLkNVUlZFLFxuICAgICAgICB0b0J5dGVzKF9jLCBwb2ludCwgaXNDb21wcmVzc2VkKSB7XG4gICAgICAgICAgICBjb25zdCBhID0gcG9pbnQudG9BZmZpbmUoKTtcbiAgICAgICAgICAgIGNvbnN0IHggPSBGcC50b0J5dGVzKGEueCk7XG4gICAgICAgICAgICBjb25zdCBjYXQgPSB1dC5jb25jYXRCeXRlcztcbiAgICAgICAgICAgIGlmIChpc0NvbXByZXNzZWQpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gY2F0KFVpbnQ4QXJyYXkuZnJvbShbcG9pbnQuaGFzRXZlblkoKSA/IDB4MDIgOiAweDAzXSksIHgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGNhdChVaW50OEFycmF5LmZyb20oWzB4MDRdKSwgeCwgRnAudG9CeXRlcyhhLnkpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgZnJvbUJ5dGVzKGJ5dGVzKSB7XG4gICAgICAgICAgICBjb25zdCBsZW4gPSBieXRlcy5sZW5ndGg7XG4gICAgICAgICAgICBjb25zdCBoZWFkID0gYnl0ZXNbMF07XG4gICAgICAgICAgICBjb25zdCB0YWlsID0gYnl0ZXMuc3ViYXJyYXkoMSk7XG4gICAgICAgICAgICAvLyB0aGlzLmFzc2VydFZhbGlkaXR5KCkgaXMgZG9uZSBpbnNpZGUgb2YgZnJvbUhleFxuICAgICAgICAgICAgaWYgKGxlbiA9PT0gY29tcHJlc3NlZExlbiAmJiAoaGVhZCA9PT0gMHgwMiB8fCBoZWFkID09PSAweDAzKSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHggPSB1dC5ieXRlc1RvTnVtYmVyQkUodGFpbCk7XG4gICAgICAgICAgICAgICAgaWYgKCFpc1ZhbGlkRmllbGRFbGVtZW50KHgpKVxuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1BvaW50IGlzIG5vdCBvbiBjdXJ2ZScpO1xuICAgICAgICAgICAgICAgIGNvbnN0IHkyID0gd2VpZXJzdHJhc3NFcXVhdGlvbih4KTsgLy8gecKyID0geMKzICsgYXggKyBiXG4gICAgICAgICAgICAgICAgbGV0IHkgPSBGcC5zcXJ0KHkyKTsgLy8geSA9IHnCsiBeIChwKzEpLzRcbiAgICAgICAgICAgICAgICBjb25zdCBpc1lPZGQgPSAoeSAmIF8xbikgPT09IF8xbjtcbiAgICAgICAgICAgICAgICAvLyBFQ0RTQVxuICAgICAgICAgICAgICAgIGNvbnN0IGlzSGVhZE9kZCA9ICh
26774oZWFkICYgMSkgPT09IDE7XG4gICAgICAgICAgICAgICAgaWYgKGlzSGVhZE9kZCAhPT0gaXNZT2RkKVxuICAgICAgICAgICAgICAgICAgICB5ID0gRnAubmVnKHkpO1xuICAgICAgICAgICAgICAgIHJldHVybiB7IHgsIHkgfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKGxlbiA9PT0gdW5jb21wcmVzc2VkTGVuICYmIGhlYWQgPT09IDB4MDQpIHtcbiAgICAgICAgICAgICAgICBjb25zdCB4ID0gRnAuZnJvbUJ5dGVzKHRhaWwuc3ViYXJyYXkoMCwgRnAuQllURVMpKTtcbiAgICAgICAgICAgICAgICBjb25zdCB5ID0gRnAuZnJvbUJ5dGVzKHRhaWwuc3ViYXJyYXkoRnAuQllURVMsIDIgKiBGcC5CWVRFUykpO1xuICAgICAgICAgICAgICAgIHJldHVybiB7IHgsIHkgfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgUG9pbnQgb2YgbGVuZ3RoICR7bGVufSB3YXMgaW52YWxpZC4gRXhwZWN0ZWQgJHtjb21wcmVzc2VkTGVufSBjb21wcmVzc2VkIGJ5dGVzIG9yICR7dW5jb21wcmVzc2VkTGVufSB1bmNvbXByZXNzZWQgYnl0ZXNgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICB9KTtcbiAgICBjb25zdCBudW1Ub05CeXRlU3RyID0gKG51bSkgPT4gdXQuYnl0ZXNUb0hleCh1dC5udW1iZXJUb0J5dGVzQkUobnVtLCBDVVJWRS5uQnl0ZUxlbmd0aCkpO1xuICAgIGZ1bmN0aW9uIGlzQmlnZ2VyVGhhbkhhbGZPcmRlcihudW1iZXIpIHtcbiAgICAgICAgY29uc3QgSEFMRiA9IENVUlZFX09SREVSID4+IF8xbjtcbiAgICAgICAgcmV0dXJuIG51bWJlciA+IEhBTEY7XG4gICAgfVxuICAgIGZ1bmN0aW9uIG5vcm1hbGl6ZVMocykge1xuICAgICAgICByZXR1cm4gaXNCaWdnZXJUaGFuSGFsZk9yZGVyKHMpID8gbW9kTigtcykgOiBzO1xuICAgIH1cbiAgICAvLyBzbGljZSBieXRlcyBudW1cbiAgICBjb25zdCBzbGNOdW0gPSAoYiwgZnJvbSwgdG8pID0+IHV0LmJ5dGVzVG9OdW1iZXJCRShiLnNsaWNlKGZyb20sIHRvKSk7XG4gICAgLyoqXG4gICAgICogRUNEU0Egc2lnbmF0dXJlIHdpdGggaXRzIChyLCBzKSBwcm9wZXJ0aWVzLiBTdXBwb3J0cyBERVIgJiBjb21wYWN0IHJlcHJlc2VudGF0aW9ucy5cbiAgICAgKi9cbiAgICBjbGFzcyBTaWduYXR1cmUge1xuICAgICAgICBjb25zdHJ1Y3RvcihyLCBzLCByZWNvdmVyeSkge1xuICAgICAgICAgICAgdGhpcy5yID0gcjtcbiAgICAgICAgICAgIHRoaXMucyA9IHM7XG4gICAgICAgICAgICB0aGlzLnJlY292ZXJ5ID0gcmVjb3Zlcnk7XG4gICAgICAgICAgICB0aGlzLmFzc2VydFZhbGlkaXR5KCk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gcGFpciAoYnl0ZXMgb2YgciwgYnl0ZXMgb2YgcylcbiAgICAgICAgc3RhdGljIGZyb21Db21wYWN0KGhleCkge1xuICAgICAgICAgICAgY29uc3QgbCA9IENVUlZFLm5CeXRlTGVuZ3RoO1xuICAgICAgICAgICAgaGV4ID0gZW5zdXJlQnl0ZXMoJ2NvbXBhY3RTaWduYXR1cmUnLCBoZXgsIGwgKiAyKTtcbiAgICAgICAgICAgIHJldHVybiBuZXcgU2lnbmF0dXJlKHNsY051bShoZXgsIDAsIGwpLCBzbGNOdW0oaGV4LCBsLCAyICogbCkpO1xuICAgICAgICB9XG4gICAgICAgIC8vIERFUiBlbmNvZGVkIEVDRFNBIHNpZ25hdHVyZVxuICAgICAgICAvLyBodHRwczovL2JpdGNvaW4uc3RhY2tleGNoYW5nZS5jb20vcXVlc3Rpb25zLzU3NjQ0L3doYXQtYXJlLXRoZS1wYXJ0cy1vZi1hLWJpdGNvaW4tdHJhbnNhY3Rpb24taW5wdXQtc2NyaXB0XG4gICAgICAgIHN0YXRpYyBmcm9tREVSKGhleCkge1xuICAgICAgICAgICAgY29uc3QgeyByLCBzIH0gPSBERVIudG9TaWcoZW5zdXJlQnl0ZXMoJ0RFUicsIGhleCkpO1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBTaWduYXR1cmUociwgcyk7XG4gICAgICAgIH1cbiAgICAgICAgYXNzZXJ0VmFsaWRpdHkoKSB7XG4gICAgICAgICAgICAvLyBjYW4gdXNlIGFzc2VydEdFIGhlcmVcbiAgICAgICAgICAgIGlmICghaXNXaXRoaW5DdXJ2ZU9yZGVyKHRoaXMucikpXG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdyIG11c3QgYmUgMCA8IHIgPCBDVVJWRS5uJyk7XG4gICAgICAgICAgICBpZiAoIWlzV2l0aGluQ3VydmVPcmRlcih0aGlzLnMpKVxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcigncyBtdXN0IGJlIDAgPCBzIDwgQ1VSVkUubicpO1xuICAgICAgICB9XG4gICAgICAgIGFkZFJlY292ZXJ5Qml0KHJlY292ZXJ5KSB7XG4gICAgICAgICAgICByZXR1cm4gbmV3IFNpZ25hdHVyZSh0aGlzLnIsIHRoaXMucywgcmVjb3ZlcnkpO1xuICAgICAgICB9XG4gICAgICAgIHJlY292ZXJQdWJsaWNLZXkobXNnSGFzaCkge1xuICAgICAgICAgICAgY29uc3QgeyByLCBzLCByZWNvdmVyeTogcmVjIH0gPSB0aGlzO1xuICAgICAgICAgICAgY29uc3QgaCA9IGJpdHMyaW50X21vZE4oZW5zdXJlQnl0ZXMoJ21zZ0hhc2gnLCBtc2dIYXNoKSk7IC8vIFRydW5jYXRlIGhhc2hcbiAgICAgICAgICAgIGlmIChyZWMgPT0gbnVsbCB8fCAhWzAsIDEsIDIsIDNdLmluY2x1ZGVzKHJlYykpXG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdyZWNvdmVyeSBpZCBpbnZhbGlkJyk7XG4gICAgICAgICAgICBjb25zdCByYWRqID0gcmVjID09PSAyIHx8IHJlYyA9PT0gMyA/IHIgKyBDVVJWRS5uIDogcjtcbiAgICAgICAgICAgIGlmIChyYWRqID49IEZwLk9SREVSKVxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcigncmVjb3ZlcnkgaWQgMiBvciAzIGludmFsaWQnKTtcbiAgICAgICAgICAgIGNvbnN0IHByZWZpeCA9IChyZWMgJiAxKSA9PT0gMCA/ICcwMicgOiAnMDMnO1xuICAgICAgICAgICAgY29uc3QgUiA9IFBvaW50LmZyb21IZXgocHJlZml4ICsgbnVtVG9OQnl0ZVN0cihyYWRqKSk7XG4gICAgICAgICAgICBjb25zdCBpciA9IGludk4ocmFkaik7IC8vIHJeLTFcbiAgICAgICAgICAgIGNvbnN0IHUxID0gbW9kTigtaCAqIGlyKTsgLy8gLWhyXi0xXG4gICAgICAgICAgICBjb25zdCB1MiA9IG1vZE4ocyAqIGlyKTsgLy8gc3JeLTFcbiAgICAgICAgICAgIGNvbnN0IFEgPSBQb2ludC5CQVNFLm11bHRpcGx5QW5kQWRkVW5zYWZlKFIsIHUxLCB1Mik7IC8vIChzcl4tMSlSLShocl4tMSlHID0gLShocl4tMSlHICsgKHNyXi0xKVxuICAgICAgICAgICAgaWYgKCFRKVxuICAgICAgICAgICAgICAgI
26774HRocm93IG5ldyBFcnJvcigncG9pbnQgYXQgaW5maW5pZnknKTsgLy8gdW5zYWZlIGlzIGZpbmU6IG5vIHByaXYgZGF0YSBsZWFrZWRcbiAgICAgICAgICAgIFEuYXNzZXJ0VmFsaWRpdHkoKTtcbiAgICAgICAgICAgIHJldHVybiBRO1xuICAgICAgICB9XG4gICAgICAgIC8vIFNpZ25hdHVyZXMgc2hvdWxkIGJlIGxvdy1zLCB0byBwcmV2ZW50IG1hbGxlYWJpbGl0eS5cbiAgICAgICAgaGFzSGlnaFMoKSB7XG4gICAgICAgICAgICByZXR1cm4gaXNCaWdnZXJUaGFuSGFsZk9yZGVyKHRoaXMucyk7XG4gICAgICAgIH1cbiAgICAgICAgbm9ybWFsaXplUygpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmhhc0hpZ2hTKCkgPyBuZXcgU2lnbmF0dXJlKHRoaXMuciwgbW9kTigtdGhpcy5zKSwgdGhpcy5yZWNvdmVyeSkgOiB0aGlzO1xuICAgICAgICB9XG4gICAgICAgIC8vIERFUi1lbmNvZGVkXG4gICAgICAgIHRvREVSUmF3Qnl0ZXMoKSB7XG4gICAgICAgICAgICByZXR1cm4gdXQuaGV4VG9CeXRlcyh0aGlzLnRvREVSSGV4KCkpO1xuICAgICAgICB9XG4gICAgICAgIHRvREVSSGV4KCkge1xuICAgICAgICAgICAgcmV0dXJuIERFUi5oZXhGcm9tU2lnKHsgcjogdGhpcy5yLCBzOiB0aGlzLnMgfSk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gcGFkZGVkIGJ5dGVzIG9mIHIsIHRoZW4gcGFkZGVkIGJ5dGVzIG9mIHNcbiAgICAgICAgdG9Db21wYWN0UmF3Qnl0ZXMoKSB7XG4gICAgICAgICAgICByZXR1cm4gdXQuaGV4VG9CeXRlcyh0aGlzLnRvQ29tcGFjdEhleCgpKTtcbiAgICAgICAgfVxuICAgICAgICB0b0NvbXBhY3RIZXgoKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVtVG9OQnl0ZVN0cih0aGlzLnIpICsgbnVtVG9OQnl0ZVN0cih0aGlzLnMpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGNvbnN0IHV0aWxzID0ge1xuICAgICAgICBpc1ZhbGlkUHJpdmF0ZUtleShwcml2YXRlS2V5KSB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIG5vcm1Qcml2YXRlS2V5VG9TY2FsYXIocHJpdmF0ZUtleSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIG5vcm1Qcml2YXRlS2V5VG9TY2FsYXI6IG5vcm1Qcml2YXRlS2V5VG9TY2FsYXIsXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBQcm9kdWNlcyBjcnlwdG9ncmFwaGljYWxseSBzZWN1cmUgcHJpdmF0ZSBrZXkgZnJvbSByYW5kb20gb2Ygc2l6ZVxuICAgICAgICAgKiAoZ3JvdXBMZW4gKyBjZWlsKGdyb3VwTGVuIC8gMikpIHdpdGggbW9kdWxvIGJpYXMgYmVpbmcgbmVnbGlnaWJsZS5cbiAgICAgICAgICovXG4gICAgICAgIHJhbmRvbVByaXZhdGVLZXk6ICgpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGxlbmd0aCA9IG1vZC5nZXRNaW5IYXNoTGVuZ3RoKENVUlZFLm4pO1xuICAgICAgICAgICAgcmV0dXJuIG1vZC5tYXBIYXNoVG9GaWVsZChDVVJWRS5yYW5kb21CeXRlcyhsZW5ndGgpLCBDVVJWRS5uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIENyZWF0ZXMgcHJlY29tcHV0ZSB0YWJsZSBmb3IgYW4gYXJiaXRyYXJ5IEVDIHBvaW50LiBNYWtlcyBwb2ludCBcImNhY2hlZFwiLlxuICAgICAgICAgKiBBbGxvd3MgdG8gbWFzc2l2ZWx5IHNwZWVkLXVwIGBwb2ludC5tdWx0aXBseShzY2FsYXIpYC5cbiAgICAgICAgICogQHJldHVybnMgY2FjaGVkIHBvaW50XG4gICAgICAgICAqIEBleGFtcGxlXG4gICAgICAgICAqIGNvbnN0IGZhc3QgPSB1dGlscy5wcmVjb21wdXRlKDgsIFByb2plY3RpdmVQb2ludC5mcm9tSGV4KHNvbWVvbmVzUHViS2V5KSk7XG4gICAgICAgICAqIGZhc3QubXVsdGlwbHkocHJpdktleSk7IC8vIG11Y2ggZmFzdGVyIEVDREggbm93XG4gICAgICAgICAqL1xuICAgICAgICBwcmVjb21wdXRlKHdpbmRvd1NpemUgPSA4LCBwb2ludCA9IFBvaW50LkJBU0UpIHtcbiAgICAgICAgICAgIHBvaW50Ll9zZXRXaW5kb3dTaXplKHdpbmRvd1NpemUpO1xuICAgICAgICAgICAgcG9pbnQubXVsdGlwbHkoQmlnSW50KDMpKTsgLy8gMyBpcyBhcmJpdHJhcnksIGp1c3QgbmVlZCBhbnkgbnVtYmVyIGhlcmVcbiAgICAgICAgICAgIHJldHVybiBwb2ludDtcbiAgICAgICAgfSxcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIENvbXB1dGVzIHB1YmxpYyBrZXkgZm9yIGEgcHJpdmF0ZSBrZXkuIENoZWNrcyBmb3IgdmFsaWRpdHkgb2YgdGhlIHByaXZhdGUga2V5LlxuICAgICAqIEBwYXJhbSBwcml2YXRlS2V5IHByaXZhdGUga2V5XG4gICAgICogQHBhcmFtIGlzQ29tcHJlc3NlZCB3aGV0aGVyIHRvIHJldHVybiBjb21wYWN0IChkZWZhdWx0KSwgb3IgZnVsbCBrZXlcbiAgICAgKiBAcmV0dXJucyBQdWJsaWMga2V5LCBmdWxsIHdoZW4gaXNDb21wcmVzc2VkPWZhbHNlOyBzaG9ydCB3aGVuIGlzQ29tcHJlc3NlZD10cnVlXG4gICAgICovXG4gICAgZnVuY3Rpb24gZ2V0UHVibGljS2V5KHByaXZhdGVLZXksIGlzQ29tcHJlc3NlZCA9IHRydWUpIHtcbiAgICAgICAgcmV0dXJuIFBvaW50LmZyb21Qcml2YXRlS2V5KHByaXZhdGVLZXkpLnRvUmF3Qnl0ZXMoaXNDb21wcmVzc2VkKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUXVpY2sgYW5kIGRpcnR5IGNoZWNrIGZvciBpdGVtIGJlaW5nIHB1YmxpYyBrZXkuIERvZXMgbm90IHZhbGlkYXRlIGhleCwgb3IgYmVpbmcgb24tY3VydmUuXG4gICAgICovXG4gICAgZnVuY3Rpb24gaXNQcm9iUHViKGl0ZW0pIHtcbiAgICAgICAgY29uc3QgYXJyID0gaXRlbSBpbnN0YW5jZW9mIFVpbnQ4QXJyYXk7XG4gICAgICAgIGNvbnN0IHN0ciA9IHR5cGVvZiBpdGVtID09PSAnc3RyaW5nJztcbiAgICAgICAgY29uc3QgbGVuID0gKGFyciB8fCBzdHIpICYmIGl0ZW0ubGVuZ3RoO1xuICAgICAgICBpZiAoYXJyKVxuICAgICAgICAgICAgcmV0dXJuIGxlbiA9PT0gY29tcHJlc3NlZExlbiB8fCBsZW4gPT09IHVuY29tcHJlc3NlZExlbjtcbiAgICAgICAgaWYgKHN0cilcbiAgICAgICAgICAgI
26774HJldHVybiBsZW4gPT09IDIgKiBjb21wcmVzc2VkTGVuIHx8IGxlbiA9PT0gMiAqIHVuY29tcHJlc3NlZExlbjtcbiAgICAgICAgaWYgKGl0ZW0gaW5zdGFuY2VvZiBQb2ludClcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEVDREggKEVsbGlwdGljIEN1cnZlIERpZmZpZSBIZWxsbWFuKS5cbiAgICAgKiBDb21wdXRlcyBzaGFyZWQgcHVibGljIGtleSBmcm9tIHByaXZhdGUga2V5IGFuZCBwdWJsaWMga2V5LlxuICAgICAqIENoZWNrczogMSkgcHJpdmF0ZSBrZXkgdmFsaWRpdHkgMikgc2hhcmVkIGtleSBpcyBvbi1jdXJ2ZS5cbiAgICAgKiBEb2VzIE5PVCBoYXNoIHRoZSByZXN1bHQuXG4gICAgICogQHBhcmFtIHByaXZhdGVBIHByaXZhdGUga2V5XG4gICAgICogQHBhcmFtIHB1YmxpY0IgZGlmZmVyZW50IHB1YmxpYyBrZXlcbiAgICAgKiBAcGFyYW0gaXNDb21wcmVzc2VkIHdoZXRoZXIgdG8gcmV0dXJuIGNvbXBhY3QgKGRlZmF1bHQpLCBvciBmdWxsIGtleVxuICAgICAqIEByZXR1cm5zIHNoYXJlZCBwdWJsaWMga2V5XG4gICAgICovXG4gICAgZnVuY3Rpb24gZ2V0U2hhcmVkU2VjcmV0KHByaXZhdGVBLCBwdWJsaWNCLCBpc0NvbXByZXNzZWQgPSB0cnVlKSB7XG4gICAgICAgIGlmIChpc1Byb2JQdWIocHJpdmF0ZUEpKVxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdmaXJzdCBhcmcgbXVzdCBiZSBwcml2YXRlIGtleScpO1xuICAgICAgICBpZiAoIWlzUHJvYlB1YihwdWJsaWNCKSlcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignc2Vjb25kIGFyZyBtdXN0IGJlIHB1YmxpYyBrZXknKTtcbiAgICAgICAgY29uc3QgYiA9IFBvaW50LmZyb21IZXgocHVibGljQik7IC8vIGNoZWNrIGZvciBiZWluZyBvbi1jdXJ2ZVxuICAgICAgICByZXR1cm4gYi5tdWx0aXBseShub3JtUHJpdmF0ZUtleVRvU2NhbGFyKHByaXZhdGVBKSkudG9SYXdCeXRlcyhpc0NvbXByZXNzZWQpO1xuICAgIH1cbiAgICAvLyBSRkM2OTc5OiBlbnN1cmUgRUNEU0EgbXNnIGlzIFggYnl0ZXMgYW5kIDwgTi4gUkZDIHN1Z2dlc3RzIG9wdGlvbmFsIHRydW5jYXRpbmcgdmlhIGJpdHMyb2N0ZXRzLlxuICAgIC8vIEZJUFMgMTg2LTQgNC42IHN1Z2dlc3RzIHRoZSBsZWZ0bW9zdCBtaW4obkJpdExlbiwgb3V0TGVuKSBiaXRzLCB3aGljaCBtYXRjaGVzIGJpdHMyaW50LlxuICAgIC8vIGJpdHMyaW50IGNhbiBwcm9kdWNlIHJlcz5OLCB3ZSBjYW4gZG8gbW9kKHJlcywgTikgc2luY2UgdGhlIGJpdExlbiBpcyB0aGUgc2FtZS5cbiAgICAvLyBpbnQyb2N0ZXRzIGNhbid0IGJlIHVzZWQ7IHBhZHMgc21hbGwgbXNncyB3aXRoIDA6IHVuYWNjZXB0YXRibGUgZm9yIHRydW5jIGFzIHBlciBSRkMgdmVjdG9yc1xuICAgIGNvbnN0IGJpdHMyaW50ID0gQ1VSVkUuYml0czJpbnQgfHxcbiAgICAgICAgZnVuY3Rpb24gKGJ5dGVzKSB7XG4gICAgICAgICAgICAvLyBGb3IgY3VydmVzIHdpdGggbkJpdExlbmd0aCAlIDggIT09IDA6IGJpdHMyb2N0ZXRzKGJpdHMyb2N0ZXRzKG0pKSAhPT0gYml0czJvY3RldHMobSlcbiAgICAgICAgICAgIC8vIGZvciBzb21lIGNhc2VzLCBzaW5jZSBieXRlcy5sZW5ndGggKiA4IGlzIG5vdCBhY3R1YWwgYml0TGVuZ3RoLlxuICAgICAgICAgICAgY29uc3QgbnVtID0gdXQuYnl0ZXNUb051bWJlckJFKGJ5dGVzKTsgLy8gY2hlY2sgZm9yID09IHU4IGRvbmUgaGVyZVxuICAgICAgICAgICAgY29uc3QgZGVsdGEgPSBieXRlcy5sZW5ndGggKiA4IC0gQ1VSVkUubkJpdExlbmd0aDsgLy8gdHJ1bmNhdGUgdG8gbkJpdExlbmd0aCBsZWZ0bW9zdCBiaXRzXG4gICAgICAgICAgICByZXR1cm4gZGVsdGEgPiAwID8gbnVtID4+IEJpZ0ludChkZWx0YSkgOiBudW07XG4gICAgICAgIH07XG4gICAgY29uc3QgYml0czJpbnRfbW9kTiA9IENVUlZFLmJpdHMyaW50X21vZE4gfHxcbiAgICAgICAgZnVuY3Rpb24gKGJ5dGVzKSB7XG4gICAgICAgICAgICByZXR1cm4gbW9kTihiaXRzMmludChieXRlcykpOyAvLyBjYW4ndCB1c2UgYnl0ZXNUb051bWJlckJFIGhlcmVcbiAgICAgICAgfTtcbiAgICAvLyBOT1RFOiBwYWRzIG91dHB1dCB3aXRoIHplcm8gYXMgcGVyIHNwZWNcbiAgICBjb25zdCBPUkRFUl9NQVNLID0gdXQuYml0TWFzayhDVVJWRS5uQml0TGVuZ3RoKTtcbiAgICAvKipcbiAgICAgKiBDb252ZXJ0cyB0byBieXRlcy4gQ2hlY2tzIGlmIG51bSBpbiBgWzAuLk9SREVSX01BU0stMV1gIGUuZy46IGBbMC4uMl4yNTYtMV1gLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGludDJvY3RldHMobnVtKSB7XG4gICAgICAgIGlmICh0eXBlb2YgbnVtICE9PSAnYmlnaW50JylcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignYmlnaW50IGV4cGVjdGVkJyk7XG4gICAgICAgIGlmICghKF8wbiA8PSBudW0gJiYgbnVtIDwgT1JERVJfTUFTSykpXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYGJpZ2ludCBleHBlY3RlZCA8IDJeJHtDVVJWRS5uQml0TGVuZ3RofWApO1xuICAgICAgICAvLyB3b3JrcyB3aXRoIG9yZGVyLCBjYW4gaGF2ZSBkaWZmZXJlbnQgc2l6ZSB0aGFuIG51bVRvRmllbGQhXG4gICAgICAgIHJldHVybiB1dC5udW1iZXJUb0J5dGVzQkUobnVtLCBDVVJWRS5uQnl0ZUxlbmd0aCk7XG4gICAgfVxuICAgIC8vIFN0ZXBzIEEsIEQgb2YgUkZDNjk3OSAzLjJcbiAgICAvLyBDcmVhdGVzIFJGQzY5Nzkgc2VlZDsgY29udmVydHMgbXNnL3ByaXZLZXkgdG8gbnVtYmVycy5cbiAgICAvLyBVc2VkIG9ubHkgaW4gc2lnbiwgbm90IGluIHZlcmlmeS5cbiAgICAvLyBOT1RFOiB3ZSBjYW5ub3QgYXNzdW1lIGhlcmUgdGhhdCBtc2dIYXNoIGhhcyBzYW1lIGFtb3VudCBvZiBieXRlcyBhcyBjdXJ2ZSBvcmRlciwgdGhpcyB3aWxsIGJlIHdyb25nIGF0IGxlYXN0IGZvciBQNTIxLlxuICAgIC8vIEFsc28gaXQgY2FuIGJlIGJpZ2dlciBmb3IgUDIyNCArIFNIQTI1NlxuICAgIGZ1bmN0aW9uIHByZXBTaWcobXNnSGFzaCwgcHJpdmF0ZUtleSwgb3B0cyA9IGRlZmF1bHRTaWdPcHRzKSB7XG4gICAgICAgIGlmIChbJ3JlY292ZXJlZCcsICdjYW5vbmljYWwnXS5zb21lKChrKSA9PiBrIGluIG9wdHMpKVxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdzaWduKCkgbGVnYWN5IG9wdGlvbnMgbm90IHN1cHBvcnRlZCcpO1xuICAgICAgICBjb25zdCB7IGhhc2gsIHJhbmRvbUJ5dGVzIH0gPSBDVVJWRTtcbiAgICAgICAgbGV0IHsgbG93UywgcHJlaGFzaCwgZXh0cmFFbnRyb3B5OiBlbnQgfSA9IG9wdHM7IC8vIGdlbmVyYXRlcyBsb3ctcyBzaWdzIGJ5IGRlZmF1bHRcbiAgICAgICAgaWYgKGxvd1MgPT0gbnVsbClcbiAgICAgICAgICAgIGxvd1MgPSB0cnVlOyAvLyBSRkM2OTc5IDMuMjogd2Ugc2tpcCBzdGVwIEEsIGJlY2F1c2Ugd2UgYWxyZWFkeSBwcm92aWRlIGhhc2hcbiAgICAgICAgbXNnSGFzaCA9IGVuc3VyZUJ5dGVzKCdtc2dIYXNoJywgbXNnSGFzaCk7XG4gICAgICAgIGlmIChwcmVoYXNoKVxuICAgICAgICAgICAgbXNnSGFzaCA9IGVuc3VyZUJ5dGVzKCdwcmVoYXNoZWQgbXNnSGFzaCcsIGhhc2gobXNnSGFzaCkpO1xuICAgICAgICAvLyBXZSBjYW4ndCBsYXRlciBjYWxsIGJpdHMyb2N0ZXRzLCBzaW5jZSBuZXN0ZWQgYml0czJpbnQgaXMgYnJva2VuIGZvciBjdXJ2ZXNcbiAgICAgICAgLy8gd2l0aCBuQml0TGVuZ3RoICUgOCAhPT0gMC4gQmVjYXVzZSBvZiB0aGF0LCB3ZSB1bndyYXAgaXQgaGVyZSBhcyBpbnQyb2N0ZXRzIGNhbGwuXG4gICAgICAgIC8vIGNvbnN0IGJpdHMyb2N0ZXRzID0gKGJpdHMpID0+IGludDJvY3RldHMoYml0czJpbnRfbW9kTihiaXRzKSlcbiAgICAgICAgY29uc3QgaDFpbnQgPSBiaXRzMmludF9tb2ROKG1zZ0hhc2gpO1xuICAgICAgICBjb25zdCBkID0gbm9ybVByaXZhdGVLZXlUb1NjYWxhcihwcml2YXRlS2V5KTsgLy8gdmFsaWRhdGUgcHJpdmF0ZSBrZXksIGNvbnZlcnQgdG8gYmlnaW50XG4gICAgICAgIGNvbnN0IHNlZWRBcmdzID0gW2ludDJvY3RldHMoZCksIGludDJvY3RldHMoaDFpbnQpXTtcbiAgICAgICAgLy8gZXh0cmFFbnRyb3B5LiBSRkM2OTc5IDMuNjogYWRkaXRpb25hbCBrJyAob3B0aW9uYWwpLlxuICAgICAgICBpZiAoZW50ICE9IG51bGwpIHtcbiAgICAgICAgICAgIC8vIEsgPSBITUFDX0soViB8fCAweDAwIHx8IGludDJvY3RldHMoeCkgfHwgYml0czJvY3RldHMoaDEpIHx8IGsnKVxuICAgICAgICAgICAgY29uc3QgZSA9IGVudCA9PT0gdHJ1ZSA/IHJhbmRvbUJ5dGVzKEZwLkJZVEVTKSA6IGVudDsgLy8gZ2VuZXJhdGUgcmFuZG9tIGJ5dG
26774VzIE9SIHBhc3MgYXMtaXNcbiAgICAgICAgICAgIHNlZWRBcmdzLnB1c2goZW5zdXJlQnl0ZXMoJ2V4dHJhRW50cm9weScsIGUpKTsgLy8gY2hlY2sgZm9yIGJlaW5nIGJ5dGVzXG4gICAgICAgIH1cbiAgICAgICAgY29uc3Qgc2VlZCA9IHV0LmNvbmNhdEJ5dGVzKC4uLnNlZWRBcmdzKTsgLy8gU3RlcCBEIG9mIFJGQzY5NzkgMy4yXG4gICAgICAgIGNvbnN0IG0gPSBoMWludDsgLy8gTk9URTogbm8gbmVlZCB0byBjYWxsIGJpdHMyaW50IHNlY29uZCB0aW1lIGhlcmUsIGl0IGlzIGluc2lkZSB0cnVuY2F0ZUhhc2ghXG4gICAgICAgIC8vIENvbnZlcnRzIHNpZ25hdHVyZSBwYXJhbXMgaW50byBwb2ludCB3IHIvcywgY2hlY2tzIHJlc3VsdCBmb3IgdmFsaWRpdHkuXG4gICAgICAgIGZ1bmN0aW9uIGsyc2lnKGtCeXRlcykge1xuICAgICAgICAgICAgLy8gUkZDIDY5NzkgU2VjdGlvbiAzLjIsIHN0ZXAgMzogayA9IGJpdHMyaW50KFQpXG4gICAgICAgICAgICBjb25zdCBrID0gYml0czJpbnQoa0J5dGVzKTsgLy8gQ2Fubm90IHVzZSBmaWVsZHMgbWV0aG9kcywgc2luY2UgaXQgaXMgZ3JvdXAgZWxlbWVudFxuICAgICAgICAgICAgaWYgKCFpc1dpdGhpbkN1cnZlT3JkZXIoaykpXG4gICAgICAgICAgICAgICAgcmV0dXJuOyAvLyBJbXBvcnRhbnQ6IGFsbCBtb2QoKSBjYWxscyBoZXJlIG11c3QgYmUgZG9uZSBvdmVyIE5cbiAgICAgICAgICAgIGNvbnN0IGlrID0gaW52TihrKTsgLy8ga14tMSBtb2QgblxuICAgICAgICAgICAgY29uc3QgcSA9IFBvaW50LkJBU0UubXVsdGlwbHkoaykudG9BZmZpbmUoKTsgLy8gcSA9IEdrXG4gICAgICAgICAgICBjb25zdCByID0gbW9kTihxLngpOyAvLyByID0gcS54IG1vZCBuXG4gICAgICAgICAgICBpZiAociA9PT0gXzBuKVxuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIC8vIENhbiB1c2Ugc2NhbGFyIGJsaW5kaW5nIGJeLTEoYm0gKyBiZHIpIHdoZXJlIGIg4oiIIFsxLHHiiJIxXSBhY2NvcmRpbmcgdG9cbiAgICAgICAgICAgIC8vIGh0dHBzOi8vdGNoZXMuaWFjci5vcmcvaW5kZXgucGhwL1RDSEVTL2FydGljbGUvdmlldy83MzM3LzY1MDkuIFdlJ3ZlIGRlY2lkZWQgYWdhaW5zdCBpdDpcbiAgICAgICAgICAgIC8vIGEpIGRlcGVuZGVuY3kgb24gQ1NQUk5HIGIpIDE1JSBzbG93ZG93biBjKSBkb2Vzbid0IHJlYWxseSBoZWxwIHNpbmNlIGJpZ2ludHMgYXJlIG5vdCBDVFxuICAgICAgICAgICAgY29uc3QgcyA9IG1vZE4oaWsgKiBtb2ROKG0gKyByICogZCkpOyAvLyBOb3QgdXNpbmcgYmxpbmRpbmcgaGVyZVxuICAgICAgICAgICAgaWYgKHMgPT09IF8wbilcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICBsZXQgcmVjb3ZlcnkgPSAocS54ID09PSByID8gMCA6IDIpIHwgTnVtYmVyKHEueSAmIF8xbik7IC8vIHJlY292ZXJ5IGJpdCAoMiBvciAzLCB3aGVuIHEueCA+IG4pXG4gICAgICAgICAgICBsZXQgbm9ybVMgPSBzO1xuICAgICAgICAgICAgaWYgKGxvd1MgJiYgaXNCaWdnZXJUaGFuSGFsZk9yZGVyKHMpKSB7XG4gICAgICAgICAgICAgICAgbm9ybVMgPSBub3JtYWxpemVTKHMpOyAvLyBpZiBsb3dTIHdhcyBwYXNzZWQsIGVuc3VyZSBzIGlzIGFsd2F5c1xuICAgICAgICAgICAgICAgIHJlY292ZXJ5IF49IDE7IC8vIC8vIGluIHRoZSBib3R0b20gaGFsZiBvZiBOXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gbmV3IFNpZ25hdHVyZShyLCBub3JtUywgcmVjb3ZlcnkpOyAvLyB1c2Ugbm9ybVMsIG5vdCBzXG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHsgc2VlZCwgazJzaWcgfTtcbiAgICB9XG4gICAgY29uc3QgZGVmYXVsdFNpZ09wdHMgPSB7IGxvd1M6IENVUlZFLmxvd1MsIHByZWhhc2g6IGZhbHNlIH07XG4gICAgY29uc3QgZGVmYXVsdFZlck9wdHMgPSB7IGxvd1M6IENVUlZFLmxvd1MsIHByZWhhc2g6IGZhbHNlIH07XG4gICAgLyoqXG4gICAgICogU2lnbnMgbWVzc2FnZSBoYXNoIHdpdGggYSBwcml2YXRlIGtleS5cbiAgICAgKiBgYGBcbiAgICAgKiBzaWduKG0sIGQsIGspIHdoZXJlXG4gICAgICogICAoeCwgeSkgPSBHIMOXIGtcbiAgICAgKiAgIHIgPSB4IG1vZCBuXG4gICAgICogICBzID0gKG0gKyBkcikvayBtb2QgblxuICAgICAqIGBgYFxuICAgICAqIEBwYXJhbSBtc2dIYXNoIE5PVCBtZXNzYWdlLiBtc2cgbmVlZHMgdG8gYmUgaGFzaGVkIHRvIGBtc2dIYXNoYCwgb3IgdXNlIGBwcmVoYXNoYC5cbiAgICAgKiBAcGFyYW0gcHJpdktleSBwcml2YXRlIGtleVxuICAgICAqIEBwYXJhbSBvcHRzIGxvd1MgZm9yIG5vbi1tYWxsZWFibGUgc2lncy4gZXh0cmFFbnRyb3B5IGZvciBtaXhpbmcgcmFuZG9tbmVzcyBpbnRvIGsuIHByZWhhc2ggd2lsbCBoYXNoIGZpcnN0IGFyZy5cbiAgICAgKiBAcmV0dXJucyBzaWduYXR1cmUgd2l0aCByZWNvdmVyeSBwYXJhbVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHNpZ24obXNnSGFzaCwgcHJpdktleSwgb3B0cyA9IGRlZmF1bHRTaWdPcHRzKSB7XG4gICAgICAgIGNvbnN0IHsgc2VlZCwgazJzaWcgfSA9IHByZXBTaWcobXNnSGFzaCwgcHJpdktleSwgb3B0cyk7IC8vIFN0ZXBzIEEsIEQgb2YgUkZDNjk3OSAzLjIuXG4gICAgICAgIGNvbnN0IEMgPSBDVVJWRTtcbiAgICAgICAgY29uc3QgZHJiZyA9IHV0LmNyZWF0ZUhtYWNEcmJnKEMuaGFzaC5vdXRwdXRMZW4sIEMubkJ5dGVMZW5ndGgsIEMuaG1hYyk7XG4gICAgICAgIHJldHVybiBkcmJnKHNlZWQsIGsyc2lnKTsgLy8gU3RlcHMgQiwgQywgRCwgRSwgRiwgR1xuICAgIH1cbiAgICAvLyBFbmFibGUgcHJlY29tcHV0ZXMuIFNsb3dzIGRvd24gZmlyc3QgcHVibGljS2V5IGNvbXB1dGF0aW9uIGJ5IDIwbXMuXG4gICAgUG9pbnQuQkFTRS5fc2V0V2luZG93U2l6ZSg4KTtcbiAgICAvLyB1dGlscy5wcmVjb21wdXRlKDgsIFByb2plY3RpdmVQb2ludC5CQVNFKVxuICAgIC8qKlxuICAgICAqIFZlcmlmaWVzIGEgc2lnbmF0dXJlIGFnYWluc3QgbWVzc2FnZSBoYXNoIGFuZCBwdWJsaWMga2V5LlxuICAgICAqIFJlamVjdHMgbG93UyBzaWduYXR1cmVzIGJ5IGRlZmF1bHQ6IHRvIG92ZXJyaWRlLFxuICAgICAqIHNwZWNpZnkgb3B0aW9uIGB7bG93UzogZmFsc2V9YC4gSW1wbGVtZW50cyBzZWN0aW9uIDQuMS40IGZyb20gaHR0cHM6Ly93d3cuc2VjZy5vcmcvc2VjMS12Mi5wZGY6XG4gICAgICpcbiAgICAgKiBgYGBcbiAgICAgKiB2ZXJpZnkociwgcywgaCwgUCkgd2hlcmVcbiAgICAgKiAgIFUxID0gaHNeLTEgbW9kIG5cbiAgICAgKiAgIFUyID0gcnNeLTEgbW9kIG5cbiAgICAgKiAgIFIgPSBVMeKLhUcgLSBVMuKLhVBcbiAgICAgKiAgIG1vZChSLngsIG4pID09IHJcbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBmdW5jdGlvbiB2ZXJpZnkoc2lnbmF0dXJlLCBtc2dIYXNoLCBwdWJsaWNLZXksIG9wdHMgPSBkZWZh
26774dWx0VmVyT3B0cykge1xuICAgICAgICBjb25zdCBzZyA9IHNpZ25hdHVyZTtcbiAgICAgICAgbXNnSGFzaCA9IGVuc3VyZUJ5dGVzKCdtc2dIYXNoJywgbXNnSGFzaCk7XG4gICAgICAgIHB1YmxpY0tleSA9IGVuc3VyZUJ5dGVzKCdwdWJsaWNLZXknLCBwdWJsaWNLZXkpO1xuICAgICAgICBpZiAoJ3N0cmljdCcgaW4gb3B0cylcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignb3B0aW9ucy5zdHJpY3Qgd2FzIHJlbmFtZWQgdG8gbG93UycpO1xuICAgICAgICBjb25zdCB7IGxvd1MsIHByZWhhc2ggfSA9IG9wdHM7XG4gICAgICAgIGxldCBfc2lnID0gdW5kZWZpbmVkO1xuICAgICAgICBsZXQgUDtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGlmICh0eXBlb2Ygc2cgPT09ICdzdHJpbmcnIHx8IHNnIGluc3RhbmNlb2YgVWludDhBcnJheSkge1xuICAgICAgICAgICAgICAgIC8vIFNpZ25hdHVyZSBjYW4gYmUgcmVwcmVzZW50ZWQgaW4gMiB3YXlzOiBjb21wYWN0ICgyKm5CeXRlTGVuZ3RoKSAmIERFUiAodmFyaWFibGUtbGVuZ3RoKS5cbiAgICAgICAgICAgICAgICAvLyBTaW5jZSBERVIgY2FuIGFsc28gYmUgMipuQnl0ZUxlbmd0aCBieXRlcywgd2UgY2hlY2sgZm9yIGl0IGZpcnN0LlxuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIF9zaWcgPSBTaWduYXR1cmUuZnJvbURFUihzZyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNhdGNoIChkZXJFcnJvcikge1xuICAgICAgICAgICAgICAgICAgICBpZiAoIShkZXJFcnJvciBpbnN0YW5jZW9mIERFUi5FcnIpKVxuICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgZGVyRXJyb3I7XG4gICAgICAgICAgICAgICAgICAgIF9zaWcgPSBTaWduYXR1cmUuZnJvbUNvbXBhY3Qoc2cpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKHR5cGVvZiBzZyA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIHNnLnIgPT09ICdiaWdpbnQnICYmIHR5cGVvZiBzZy5zID09PSAnYmlnaW50Jykge1xuICAgICAgICAgICAgICAgIGNvbnN0IHsgciwgcyB9ID0gc2c7XG4gICAgICAgICAgICAgICAgX3NpZyA9IG5ldyBTaWduYXR1cmUociwgcyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1BBUlNFJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBQID0gUG9pbnQuZnJvbUhleChwdWJsaWNLZXkpO1xuICAgICAgICB9XG4gICAgICAgIGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgaWYgKGVycm9yLm1lc3NhZ2UgPT09ICdQQVJTRScpXG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBzaWduYXR1cmUgbXVzdCBiZSBTaWduYXR1cmUgaW5zdGFuY2UsIFVpbnQ4QXJyYXkgb3IgaGV4IHN0cmluZ2ApO1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIGlmIChsb3dTICYmIF9zaWcuaGFzSGlnaFMoKSlcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgaWYgKHByZWhhc2gpXG4gICAgICAgICAgICBtc2dIYXNoID0gQ1VSVkUuaGFzaChtc2dIYXNoKTtcbiAgICAgICAgY29uc3QgeyByLCBzIH0gPSBfc2lnO1xuICAgICAgICBjb25zdCBoID0gYml0czJpbnRfbW9kTihtc2dIYXNoKTsgLy8gQ2Fubm90IHVzZSBmaWVsZHMgbWV0aG9kcywgc2luY2UgaXQgaXMgZ3JvdXAgZWxlbWVudFxuICAgICAgICBjb25zdCBpcyA9IGludk4ocyk7IC8vIHNeLTFcbiAgICAgICAgY29uc3QgdTEgPSBtb2ROKGggKiBpcyk7IC8vIHUxID0gaHNeLTEgbW9kIG5cbiAgICAgICAgY29uc3QgdTIgPSBtb2ROKHIgKiBpcyk7IC8vIHUyID0gcnNeLTEgbW9kIG5cbiAgICAgICAgY29uc3QgUiA9IFBvaW50LkJBU0UubXVsdGlwbHlBbmRBZGRVbnNhZmUoUCwgdTEsIHUyKT8udG9BZmZpbmUoKTsgLy8gUiA9IHUx4ouFRyArIHUy4ouFUFxuICAgICAgICBpZiAoIVIpXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIGNvbnN0IHYgPSBtb2ROKFIueCk7XG4gICAgICAgIHJldHVybiB2ID09PSByO1xuICAgIH1cbiAgICByZXR1cm4ge1xuICAgICAgICBDVVJWRSxcbiAgICAgICAgZ2V0UHVibGljS2V5LFxuICAgICAgICBnZXRTaGFyZWRTZWNyZXQsXG4gICAgICAgIHNpZ24sXG4gICAgICAgIHZlcmlmeSxcbiAgICAgICAgUHJvamVjdGl2ZVBvaW50OiBQb2ludCxcbiAgICAgICAgU2lnbmF0dXJlLFxuICAgICAgICB1dGlscyxcbiAgICB9O1xufVxuLyoqXG4gKiBJbXBsZW1lbnRhdGlvbiBvZiB0aGUgU2hhbGx1ZSBhbmQgdmFuIGRlIFdvZXN0aWpuZSBtZXRob2QgZm9yIGFueSB3ZWllcnN0cmFzcyBjdXJ2ZS5cbiAqIFRPRE86IGNoZWNrIGlmIHRoZXJlIGlzIGEgd2F5IHRvIG1lcmdlIHRoaXMgd2l0aCB1dlJhdGlvIGluIEVkd2FyZHM7IG1vdmUgdG8gbW9kdWxhci5cbiAqIGIgPSBUcnVlIGFuZCB5ID0gc3FydCh1IC8gdikgaWYgKHUgLyB2KSBpcyBzcXVhcmUgaW4gRiwgYW5kXG4gKiBiID0gRmFsc2UgYW5kIHkgPSBzcXJ0KFogKiAodSAvIHYpKSBvdGhlcndpc2UuXG4gKiBAcGFyYW0gRnBcbiAqIEBwYXJhbSBaXG4gKiBAcmV0dXJuc1xuICovXG5leHBvcnQgZnVuY3Rpb24gU1dVRnBTcXJ0UmF0aW8oRnAsIFopIHtcbiAgICAvLyBHZW5lcmljIGltcGxlbWVudGF0aW9uXG4gICAgY29uc3QgcSA9IEZwLk9SREVSO1xuICAgIGxldCBsID0gXzBuO1xuICAgIGZvciAobGV0IG8gPSBxIC0gXzFuOyBvICUgXzJuID09PSBfMG47IG8gLz0gXzJuKVxuICAgICAgICBsICs9IF8xbjtcbiAgICBjb25zdCBjMSA9IGw7IC8vIDEuIGMxLCB0aGUgbGFyZ2VzdCBpbnRlZ2VyIHN1Y2ggdGhhdCAyXmMxIGRpdmlkZXMgcSAtIDEuXG4gICAgLy8gV2UgbmVlZCAybiAqKiBjMSBhbmQgMm4gKiogKGMxLTEpLiBXZSBjYW4ndCB1c2UgKio7IGJ1dCB3ZSBjYW4gdXNlIDw8LlxuICAgIC8vIDJuICoqIGMxID09IDJuIDw8IChjMS0xKVxuICAgIGNvbnN0IF8ybl9wb3dfYzFfMSA9IF8ybiA8PCAoYzEgLSBfMW4gLSBfMW4pO1xuICAgIGNvbnN0IF8ybl9wb3dfYzEgPSBfMm5fcG93X2MxXzEgKiBfMm47XG4gICAgY29uc3QgYzIgPSAocSAtIF8xbikgLyBfMm5fcG93X2MxOyAvLyAyLiBjMiA9IChxIC0gMSkgLyAoMl5jMSkgICMgSW50ZWdlciBhcml0aG1ldGljXG4gICAgY29uc3QgYzMgPSAoYzIgLSBfMW4pIC8gXzJuOyAvLyAzLiBjMyA9IChjMiAtIDEpIC8gMiAgICAgICAgICAgICMgSW50ZWdlciBhcml0aG1ldGljXG4gICAgY29uc3QgYzQgPSBfMm5fcG93X2MxIC0gXzFuOyAvLyA0LiBjNCA9IDJeYzEgLSAxICAgICAgICAgICAgICAgICMgSW50ZWdlciBhcml0aG1ldGljXG4gICAgY29uc3QgYz
26774UgPSBfMm5fcG93X2MxXzE7IC8vIDUuIGM1ID0gMl4oYzEgLSAxKSAgICAgICAgICAgICAgICAgICMgSW50ZWdlciBhcml0aG1ldGljXG4gICAgY29uc3QgYzYgPSBGcC5wb3coWiwgYzIpOyAvLyA2LiBjNiA9IFpeYzJcbiAgICBjb25zdCBjNyA9IEZwLnBvdyhaLCAoYzIgKyBfMW4pIC8gXzJuKTsgLy8gNy4gYzcgPSBaXigoYzIgKyAxKSAvIDIpXG4gICAgbGV0IHNxcnRSYXRpbyA9ICh1LCB2KSA9PiB7XG4gICAgICAgIGxldCB0djEgPSBjNjsgLy8gMS4gdHYxID0gYzZcbiAgICAgICAgbGV0IHR2MiA9IEZwLnBvdyh2LCBjNCk7IC8vIDIuIHR2MiA9IHZeYzRcbiAgICAgICAgbGV0IHR2MyA9IEZwLnNxcih0djIpOyAvLyAzLiB0djMgPSB0djJeMlxuICAgICAgICB0djMgPSBGcC5tdWwodHYzLCB2KTsgLy8gNC4gdHYzID0gdHYzICogdlxuICAgICAgICBsZXQgdHY1ID0gRnAubXVsKHUsIHR2Myk7IC8vIDUuIHR2NSA9IHUgKiB0djNcbiAgICAgICAgdHY1ID0gRnAucG93KHR2NSwgYzMpOyAvLyA2LiB0djUgPSB0djVeYzNcbiAgICAgICAgdHY1ID0gRnAubXVsKHR2NSwgdHYyKTsgLy8gNy4gdHY1ID0gdHY1ICogdHYyXG4gICAgICAgIHR2MiA9IEZwLm11bCh0djUsIHYpOyAvLyA4LiB0djIgPSB0djUgKiB2XG4gICAgICAgIHR2MyA9IEZwLm11bCh0djUsIHUpOyAvLyA5LiB0djMgPSB0djUgKiB1XG4gICAgICAgIGxldCB0djQgPSBGcC5tdWwodHYzLCB0djIpOyAvLyAxMC4gdHY0ID0gdHYzICogdHYyXG4gICAgICAgIHR2NSA9IEZwLnBvdyh0djQsIGM1KTsgLy8gMTEuIHR2NSA9IHR2NF5jNVxuICAgICAgICBsZXQgaXNRUiA9IEZwLmVxbCh0djUsIEZwLk9ORSk7IC8vIDEyLiBpc1FSID0gdHY1ID09IDFcbiAgICAgICAgdHYyID0gRnAubXVsKHR2MywgYzcpOyAvLyAxMy4gdHYyID0gdHYzICogYzdcbiAgICAgICAgdHY1ID0gRnAubXVsKHR2NCwgdHYxKTsgLy8gMTQuIHR2NSA9IHR2NCAqIHR2MVxuICAgICAgICB0djMgPSBGcC5jbW92KHR2MiwgdHYzLCBpc1FSKTsgLy8gMTUuIHR2MyA9IENNT1YodHYyLCB0djMsIGlzUVIpXG4gICAgICAgIHR2NCA9IEZwLmNtb3YodHY1LCB0djQsIGlzUVIpOyAvLyAxNi4gdHY0ID0gQ01PVih0djUsIHR2NCwgaXNRUilcbiAgICAgICAgLy8gMTcuIGZvciBpIGluIChjMSwgYzEgLSAxLCAuLi4sIDIpOlxuICAgICAgICBmb3IgKGxldCBpID0gYzE7IGkgPiBfMW47IGktLSkge1xuICAgICAgICAgICAgbGV0IHR2NSA9IGkgLSBfMm47IC8vIDE4LiAgICB0djUgPSBpIC0gMlxuICAgICAgICAgICAgdHY1ID0gXzJuIDw8ICh0djUgLSBfMW4pOyAvLyAxOS4gICAgdHY1ID0gMl50djVcbiAgICAgICAgICAgIGxldCB0dnY1ID0gRnAucG93KHR2NCwgdHY1KTsgLy8gMjAuICAgIHR2NSA9IHR2NF50djVcbiAgICAgICAgICAgIGNvbnN0IGUxID0gRnAuZXFsKHR2djUsIEZwLk9ORSk7IC8vIDIxLiAgICBlMSA9IHR2NSA9PSAxXG4gICAgICAgICAgICB0djIgPSBGcC5tdWwodHYzLCB0djEpOyAvLyAyMi4gICAgdHYyID0gdHYzICogdHYxXG4gICAgICAgICAgICB0djEgPSBGcC5tdWwodHYxLCB0djEpOyAvLyAyMy4gICAgdHYxID0gdHYxICogdHYxXG4gICAgICAgICAgICB0dnY1ID0gRnAubXVsKHR2NCwgdHYxKTsgLy8gMjQuICAgIHR2NSA9IHR2NCAqIHR2MVxuICAgICAgICAgICAgdHYzID0gRnAuY21vdih0djIsIHR2MywgZTEpOyAvLyAyNS4gICAgdHYzID0gQ01PVih0djIsIHR2MywgZTEpXG4gICAgICAgICAgICB0djQgPSBGcC5jbW92KHR2djUsIHR2NCwgZTEpOyAvLyAyNi4gICAgdHY0ID0gQ01PVih0djUsIHR2NCwgZTEpXG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHsgaXNWYWxpZDogaXNRUiwgdmFsdWU6IHR2MyB9O1xuICAgIH07XG4gICAgaWYgKEZwLk9SREVSICUgXzRuID09PSBfM24pIHtcbiAgICAgICAgLy8gc3FydF9yYXRpb18zbW9kNCh1LCB2KVxuICAgICAgICBjb25zdCBjMSA9IChGcC5PUkRFUiAtIF8zbikgLyBfNG47IC8vIDEuIGMxID0gKHEgLSAzKSAvIDQgICAgICMgSW50ZWdlciBhcml0aG1ldGljXG4gICAgICAgIGNvbnN0IGMyID0gRnAuc3FydChGcC5uZWcoWikpOyAvLyAyLiBjMiA9IHNxcnQoLVopXG4gICAgICAgIHNxcnRSYXRpbyA9ICh1LCB2KSA9PiB7XG4gICAgICAgICAgICBsZXQgdHYxID0gRnAuc3FyKHYpOyAvLyAxLiB0djEgPSB2XjJcbiAgICAgICAgICAgIGNvbnN0IHR2MiA9IEZwLm11bCh1LCB2KTsgLy8gMi4gdHYyID0gdSAqIHZcbiAgICAgICAgICAgIHR2MSA9IEZwLm11bCh0djEsIHR2Mik7IC8vIDMuIHR2MSA9IHR2MSAqIHR2MlxuICAgICAgICAgICAgbGV0IHkxID0gRnAucG93KHR2MSwgYzEpOyAvLyA0LiB5MSA9IHR2MV5jMVxuICAgICAgICAgICAgeTEgPSBGcC5tdWwoeTEsIHR2Mik7IC8vIDUuIHkxID0geTEgKiB0djJcbiAgICAgICAgICAgIGNvbnN0IHkyID0gRnAubXVsKHkxLCBjMik7IC8vIDYuIHkyID0geTEgKiBjMlxuICAgICAgICAgICAgY29uc3QgdHYzID0gRnAubXVsKEZwLnNxcih5MSksIHYpOyAvLyA3LiB0djMgPSB5MV4yOyA4LiB0djMgPSB0djMgKiB2XG4gICAgICAgICAgICBjb25zdCBpc1FSID0gRnAuZXFsKHR2MywgdSk7IC8vIDkuIGlzUVIgPSB0djMgPT0gdVxuICAgICAgICAgICAgbGV0IHkgPSBGcC5jbW92KHkyLCB5MSwgaXNRUik7IC8vIDEwLiB5ID0gQ01PVih5MiwgeTEsIGlzUVIpXG4gICAgICAgICAgICByZXR1cm4geyBpc1ZhbGlkOiBpc1FSLCB2YWx1ZTogeSB9OyAvLyAxMS4gcmV0dXJuIChpc1FSLCB5KSBpc1FSID8geSA6IHkqYzJcbiAgICAgICAgfTtcbiAgICB9XG4gICAgLy8gTm8gY3VydmVzIHVzZXMgdGhhdFxuICAgIC8vIGlmIChGcC5PUkRFUiAlIF84biA9PT0gXzVuKSAvLyBzcXJ0X3JhdGlvXzVtb2Q4XG4gICAgcmV0dXJuIHNxcnRSYXRpbztcbn1cbi8qKlxuICogU2ltcGxpZmllZCBTaGFsbHVlLXZhbiBkZSBXb2VzdGlqbmUtVWxhcyBNZXRob2RcbiAqIGh0dHBzOi8vd3d3LnJmYy1lZGl0b3Iub3JnL3JmYy9yZmM5MzgwI3NlY3Rpb24tNi42LjJcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG1hcFRvQ3VydmVTaW1wbGVTV1UoRnAsIG9wdHMpIHtcbiAgICBtb2QudmFsaWRhdGVGaWVsZChGcCk7XG4gICAgaWYgKCFGcC5pc1ZhbGlkKG9wdHMuQSkgfHwgIUZwLmlzVmFsaWQob3B0cy5CKSB8fCAhRnAuaXNWYWxpZC
26774hvcHRzLlopKVxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ21hcFRvQ3VydmVTaW1wbGVTV1U6IGludmFsaWQgb3B0cycpO1xuICAgIGNvbnN0IHNxcnRSYXRpbyA9IFNXVUZwU3FydFJhdGlvKEZwLCBvcHRzLlopO1xuICAgIGlmICghRnAuaXNPZGQpXG4gICAgICAgIHRocm93IG5ldyBFcnJvcignRnAuaXNPZGQgaXMgbm90IGltcGxlbWVudGVkIScpO1xuICAgIC8vIElucHV0OiB1LCBhbiBlbGVtZW50IG9mIEYuXG4gICAgLy8gT3V0cHV0OiAoeCwgeSksIGEgcG9pbnQgb24gRS5cbiAgICByZXR1cm4gKHUpID0+IHtcbiAgICAgICAgLy8gcHJldHRpZXItaWdub3JlXG4gICAgICAgIGxldCB0djEsIHR2MiwgdHYzLCB0djQsIHR2NSwgdHY2LCB4LCB5O1xuICAgICAgICB0djEgPSBGcC5zcXIodSk7IC8vIDEuICB0djEgPSB1XjJcbiAgICAgICAgdHYxID0gRnAubXVsKHR2MSwgb3B0cy5aKTsgLy8gMi4gIHR2MSA9IFogKiB0djFcbiAgICAgICAgdHYyID0gRnAuc3FyKHR2MSk7IC8vIDMuICB0djIgPSB0djFeMlxuICAgICAgICB0djIgPSBGcC5hZGQodHYyLCB0djEpOyAvLyA0LiAgdHYyID0gdHYyICsgdHYxXG4gICAgICAgIHR2MyA9IEZwLmFkZCh0djIsIEZwLk9ORSk7IC8vIDUuICB0djMgPSB0djIgKyAxXG4gICAgICAgIHR2MyA9IEZwLm11bCh0djMsIG9wdHMuQik7IC8vIDYuICB0djMgPSBCICogdHYzXG4gICAgICAgIHR2NCA9IEZwLmNtb3Yob3B0cy5aLCBGcC5uZWcodHYyKSwgIUZwLmVxbCh0djIsIEZwLlpFUk8pKTsgLy8gNy4gIHR2NCA9IENNT1YoWiwgLXR2MiwgdHYyICE9IDApXG4gICAgICAgIHR2NCA9IEZwLm11bCh0djQsIG9wdHMuQSk7IC8vIDguICB0djQgPSBBICogdHY0XG4gICAgICAgIHR2MiA9IEZwLnNxcih0djMpOyAvLyA5LiAgdHYyID0gdHYzXjJcbiAgICAgICAgdHY2ID0gRnAuc3FyKHR2NCk7IC8vIDEwLiB0djYgPSB0djReMlxuICAgICAgICB0djUgPSBGcC5tdWwodHY2LCBvcHRzLkEpOyAvLyAxMS4gdHY1ID0gQSAqIHR2NlxuICAgICAgICB0djIgPSBGcC5hZGQodHYyLCB0djUpOyAvLyAxMi4gdHYyID0gdHYyICsgdHY1XG4gICAgICAgIHR2MiA9IEZwLm11bCh0djIsIHR2Myk7IC8vIDEzLiB0djIgPSB0djIgKiB0djNcbiAgICAgICAgdHY2ID0gRnAubXVsKHR2NiwgdHY0KTsgLy8gMTQuIHR2NiA9IHR2NiAqIHR2NFxuICAgICAgICB0djUgPSBGcC5tdWwodHY2LCBvcHRzLkIpOyAvLyAxNS4gdHY1ID0gQiAqIHR2NlxuICAgICAgICB0djIgPSBGcC5hZGQodHYyLCB0djUpOyAvLyAxNi4gdHYyID0gdHYyICsgdHY1XG4gICAgICAgIHggPSBGcC5tdWwodHYxLCB0djMpOyAvLyAxNy4gICB4ID0gdHYxICogdHYzXG4gICAgICAgIGNvbnN0IHsgaXNWYWxpZCwgdmFsdWUgfSA9IHNxcnRSYXRpbyh0djIsIHR2Nik7IC8vIDE4LiAoaXNfZ3gxX3NxdWFyZSwgeTEpID0gc3FydF9yYXRpbyh0djIsIHR2NilcbiAgICAgICAgeSA9IEZwLm11bCh0djEsIHUpOyAvLyAxOS4gICB5ID0gdHYxICogdSAgLT4gWiAqIHVeMyAqIHkxXG4gICAgICAgIHkgPSBGcC5tdWwoeSwgdmFsdWUpOyAvLyAyMC4gICB5ID0geSAqIHkxXG4gICAgICAgIHggPSBGcC5jbW92KHgsIHR2MywgaXNWYWxpZCk7IC8vIDIxLiAgIHggPSBDTU9WKHgsIHR2MywgaXNfZ3gxX3NxdWFyZSlcbiAgICAgICAgeSA9IEZwLmNtb3YoeSwgdmFsdWUsIGlzVmFsaWQpOyAvLyAyMi4gICB5ID0gQ01PVih5LCB5MSwgaXNfZ3gxX3NxdWFyZSlcbiAgICAgICAgY29uc3QgZTEgPSBGcC5pc09kZCh1KSA9PT0gRnAuaXNPZGQoeSk7IC8vIDIzLiAgZTEgPSBzZ24wKHUpID09IHNnbjAoeSlcbiAgICAgICAgeSA9IEZwLmNtb3YoRnAubmVnKHkpLCB5LCBlMSk7IC8vIDI0LiAgIHkgPSBDTU9WKC15LCB5LCBlMSlcbiAgICAgICAgeCA9IEZwLmRpdih4LCB0djQpOyAvLyAyNS4gICB4ID0geCAvIHR2NFxuICAgICAgICByZXR1cm4geyB4LCB5IH07XG4gICAgfTtcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXdlaWVyc3RyYXNzLmpzLm1hcCIsIi8qISBub2JsZS1jdXJ2ZXMgLSBNSVQgTGljZW5zZSAoYykgMjAyMiBQYXVsIE1pbGxlciAocGF1bG1pbGxyLmNvbSkgKi9cbmltcG9ydCB7IGhtYWMgfSBmcm9tICdAbm9ibGUvaGFzaGVzL2htYWMnO1xuaW1wb3J0IHsgY29uY2F0Qnl0ZXMsIHJhbmRvbUJ5dGVzIH0gZnJvbSAnQG5vYmxlL2hhc2hlcy91dGlscyc7XG5pbXBvcnQgeyB3ZWllcnN0cmFzcyB9IGZyb20gJy4vYWJzdHJhY3Qvd2VpZXJzdHJhc3MuanMnO1xuLy8gY29ubmVjdHMgbm9ibGUtY3VydmVzIHRvIG5vYmxlLWhhc2hlc1xuZXhwb3J0IGZ1bmN0aW9uIGdldEhhc2goaGFzaCkge1xuICAgIHJldHVybiB7XG4gICAgICAgIGhhc2gsXG4gICAgICAgIGhtYWM6IChrZXksIC4uLm1zZ3MpID0+IGhtYWMoaGFzaCwga2V5LCBjb25jYXRCeXRlcyguLi5tc2dzKSksXG4gICAgICAgIHJhbmRvbUJ5dGVzLFxuICAgIH07XG59XG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlQ3VydmUoY3VydmVEZWYsIGRlZkhhc2gpIHtcbiAgICBjb25zdCBjcmVhdGUgPSAoaGFzaCkgPT4gd2VpZXJzdHJhc3MoeyAuLi5jdXJ2ZURlZiwgLi4uZ2V0SGFzaChoYXNoKSB9KTtcbiAgICByZXR1cm4gT2JqZWN0LmZyZWV6ZSh7IC4uLmNyZWF0ZShkZWZIYXNoKSwgY3JlYXRlIH0pO1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9X3Nob3J0d191dGlscy5qcy5tYXAiLCIvKiEgbm9ibGUtY3VydmVzIC0gTUlUIExpY2Vuc2UgKGMpIDIwMjIgUGF1bCBNaWxsZXIgKHBhdWxtaWxsci5jb20pICovXG5pbXBvcnQgeyBzaGEyNTYgfSBmcm9tICdAbm9ibGUvaGFzaGVzL3NoYTI1Nic7XG5pbXBvcnQgeyByYW5kb21CeXRlcyB9IGZyb20gJ0Bub2JsZS9oYXNoZXMvdXRpbHMnO1xuaW1wb3J0IHsgRmllbGQsIG1vZCwgcG93MiB9IGZyb20gJy4vYWJzdHJhY3QvbW9kdWxhci5qcyc7XG5pbXBvcnQgeyBtYXBUb0N1cnZlU2ltcGxlU1dVIH0gZnJvbSAnLi9hYnN0cmFjdC93ZWllcnN0cmFzcy5qcyc7XG5pbXBvcnQgeyBieXRlc1RvTnVtYmVyQkUsIGNvbmNhdEJ5dGVzLCBlbnN1cmVCeXRlcywgbnVtYmVyVG9CeXRlc0JFIH0gZnJvbSAnLi9hYnN0cmFjdC91dGlscy5qcyc7XG5pbXBvcnQgeyBjcmVhdGVIYXNoZXIsIGlzb2dlbnlNYXAgfSBmcm9tICcuL2Fic3RyYWN0L2hhc2gtdG8tY3VydmUuanMnO1xuaW1wb3J0IHsgY3JlYXRlQ3VydmUgfSBmcm9tICcuL19zaG9ydHdfdXRpbHMuanMnO1xuY29uc3Qgc2VjcDI1NmsxUCA9IEJpZ0ludCgnMHhmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZWZmZmZmYzJmJyk7XG5jb25zdCBzZWNwMjU2azFOID0gQmlnSW50KCcweGZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZlYmFhZWRjZTZhZjQ4YTAzYmJmZDI1ZThjZDAzNjQxNDEnKTtcbmNvbnN0IF8xbiA9IEJpZ0ludCgxKTtcbmNvbnN0IF8ybiA9IEJpZ0ludCgyKTtcbmNvbnN0IGRpdk5lYXJlc3QgPSAoYSwgYikgPT4gKGEgKyBiIC8gXzJuKSAvIGI7XG4vKipcbiAqIOKImm4gPSBuXigocCsxKS80KSBmb3IgZmllbGRzIHAgPSAzIG1vZCA0LiBXZSB1bndyYXAgdGhlIGxvb3AgYW5kIG11bHRpcGx5IGJpdC1ieS1iaXQuXG4gKiAoUCsxbi80bikudG9TdHJpbmc
26774oMikgd291bGQgcHJvZHVjZSBiaXRzIFsyMjN4IDEsIDAsIDIyeCAxLCA0eCAwLCAxMSwgMDBdXG4gKi9cbmZ1bmN0aW9uIHNxcnRNb2QoeSkge1xuICAgIGNvbnN0IFAgPSBzZWNwMjU2azFQO1xuICAgIC8vIHByZXR0aWVyLWlnbm9yZVxuICAgIGNvbnN0IF8zbiA9IEJpZ0ludCgzKSwgXzZuID0gQmlnSW50KDYpLCBfMTFuID0gQmlnSW50KDExKSwgXzIybiA9IEJpZ0ludCgyMik7XG4gICAgLy8gcHJldHRpZXItaWdub3JlXG4gICAgY29uc3QgXzIzbiA9IEJpZ0ludCgyMyksIF80NG4gPSBCaWdJbnQoNDQpLCBfODhuID0gQmlnSW50KDg4KTtcbiAgICBjb25zdCBiMiA9ICh5ICogeSAqIHkpICUgUDsgLy8geF4zLCAxMVxuICAgIGNvbnN0IGIzID0gKGIyICogYjIgKiB5KSAlIFA7IC8vIHheN1xuICAgIGNvbnN0IGI2ID0gKHBvdzIoYjMsIF8zbiwgUCkgKiBiMykgJSBQO1xuICAgIGNvbnN0IGI5ID0gKHBvdzIoYjYsIF8zbiwgUCkgKiBiMykgJSBQO1xuICAgIGNvbnN0IGIxMSA9IChwb3cyKGI5LCBfMm4sIFApICogYjIpICUgUDtcbiAgICBjb25zdCBiMjIgPSAocG93MihiMTEsIF8xMW4sIFApICogYjExKSAlIFA7XG4gICAgY29uc3QgYjQ0ID0gKHBvdzIoYjIyLCBfMjJuLCBQKSAqIGIyMikgJSBQO1xuICAgIGNvbnN0IGI4OCA9IChwb3cyKGI0NCwgXzQ0biwgUCkgKiBiNDQpICUgUDtcbiAgICBjb25zdCBiMTc2ID0gKHBvdzIoYjg4LCBfODhuLCBQKSAqIGI4OCkgJSBQO1xuICAgIGNvbnN0IGIyMjAgPSAocG93MihiMTc2LCBfNDRuLCBQKSAqIGI0NCkgJSBQO1xuICAgIGNvbnN0IGIyMjMgPSAocG93MihiMjIwLCBfM24sIFApICogYjMpICUgUDtcbiAgICBjb25zdCB0MSA9IChwb3cyKGIyMjMsIF8yM24sIFApICogYjIyKSAlIFA7XG4gICAgY29uc3QgdDIgPSAocG93Mih0MSwgXzZuLCBQKSAqIGIyKSAlIFA7XG4gICAgY29uc3Qgcm9vdCA9IHBvdzIodDIsIF8ybiwgUCk7XG4gICAgaWYgKCFGcC5lcWwoRnAuc3FyKHJvb3QpLCB5KSlcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdDYW5ub3QgZmluZCBzcXVhcmUgcm9vdCcpO1xuICAgIHJldHVybiByb290O1xufVxuY29uc3QgRnAgPSBGaWVsZChzZWNwMjU2azFQLCB1bmRlZmluZWQsIHVuZGVmaW5lZCwgeyBzcXJ0OiBzcXJ0TW9kIH0pO1xuZXhwb3J0IGNvbnN0IHNlY3AyNTZrMSA9IGNyZWF0ZUN1cnZlKHtcbiAgICBhOiBCaWdJbnQoMCksXG4gICAgYjogQmlnSW50KDcpLFxuICAgIEZwLFxuICAgIG46IHNlY3AyNTZrMU4sXG4gICAgLy8gQmFzZSBwb2ludCAoeCwgeSkgYWthIGdlbmVyYXRvciBwb2ludFxuICAgIEd4OiBCaWdJbnQoJzU1MDY2MjYzMDIyMjc3MzQzNjY5NTc4NzE4ODk1MTY4NTM0MzI2MjUwNjAzNDUzNzc3NTk0MTc1NTAwMTg3MzYwMzg5MTE2NzI5MjQwJyksXG4gICAgR3k6IEJpZ0ludCgnMzI2NzA1MTAwMjA3NTg4MTY5NzgwODMwODUxMzA1MDcwNDMxODQ0NzEyNzMzODA2NTkyNDMyNzU5Mzg5MDQzMzU3NTczMzc0ODI0MjQnKSxcbiAgICBoOiBCaWdJbnQoMSksXG4gICAgbG93UzogdHJ1ZSxcbiAgICAvKipcbiAgICAgKiBzZWNwMjU2azEgYmVsb25ncyB0byBLb2JsaXR6IGN1cnZlczogaXQgaGFzIGVmZmljaWVudGx5IGNvbXB1dGFibGUgZW5kb21vcnBoaXNtLlxuICAgICAqIEVuZG9tb3JwaGlzbSB1c2VzIDJ4IGxlc3MgUkFNLCBzcGVlZHMgdXAgcHJlY29tcHV0YXRpb24gYnkgMnggYW5kIEVDREggLyBrZXkgcmVjb3ZlcnkgYnkgMjAlLlxuICAgICAqIEZvciBwcmVjb21wdXRlZCB3TkFGIGl0IHRyYWRlcyBvZmYgMS8yIGluaXQgdGltZSAmIDEvMyByYW0gZm9yIDIwJSBwZXJmIGhpdC5cbiAgICAgKiBFeHBsYW5hdGlvbjogaHR0cHM6Ly9naXN0LmdpdGh1Yi5jb20vcGF1bG1pbGxyL2ViNjcwODA2NzkzZTg0ZGY2MjhhN2M0MzRhODczMDY2XG4gICAgICovXG4gICAgZW5kbzoge1xuICAgICAgICBiZXRhOiBCaWdJbnQoJzB4N2FlOTZhMmI2NTdjMDcxMDZlNjQ0NzllYWMzNDM0ZTk5Y2YwNDk3NTEyZjU4OTk1YzEzOTZjMjg3MTk1MDFlZScpLFxuICAgICAgICBzcGxpdFNjYWxhcjogKGspID0+IHtcbiAgICAgICAgICAgIGNvbnN0IG4gPSBzZWNwMjU2azFOO1xuICAgICAgICAgICAgY29uc3QgYTEgPSBCaWdJbnQoJzB4MzA4NmQyMjFhN2Q0NmJjZGU4NmM5MGU0OTI4NGViMTUnKTtcbiAgICAgICAgICAgIGNvbnN0IGIxID0gLV8xbiAqIEJpZ0ludCgnMHhlNDQzN2VkNjAxMGU4ODI4NmY1NDdmYTkwYWJmZTRjMycpO1xuICAgICAgICAgICAgY29uc3QgYTIgPSBCaWdJbnQoJzB4MTE0Y2E1MGY3YThlMmYzZjY1N2MxMTA4ZDlkNDRjZmQ4Jyk7XG4gICAgICAgICAgICBjb25zdCBiMiA9IGExO1xuICAgICAgICAgICAgY29uc3QgUE9XXzJfMTI4ID0gQmlnSW50KCcweDEwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCcpOyAvLyAoMm4qKjEyOG4pLnRvU3RyaW5nKDE2KVxuICAgICAgICAgICAgY29uc3QgYzEgPSBkaXZOZWFyZXN0KGIyICogaywgbik7XG4gICAgICAgICAgICBjb25zdCBjMiA9IGRpdk5lYXJlc3QoLWIxICogaywgbik7XG4gICAgICAgICAgICBsZXQgazEgPSBtb2QoayAtIGMxICogYTEgLSBjMiAqIGEyLCBuKTtcbiAgICAgICAgICAgIGxldCBrMiA9IG1vZCgtYzEgKiBiMSAtIGMyICogYjIsIG4pO1xuICAgICAgICAgICAgY29uc3QgazFuZWcgPSBrMSA+IFBPV18yXzEyODtcbiAgICAgICAgICAgIGNvbnN0IGsybmVnID0gazIgPiBQT1dfMl8xMjg7XG4gICAgICAgICAgICBpZiAoazFuZWcpXG4gICAgICAgICAgICAgICAgazEgPSBuIC0gazE7XG4gICAgICAgICAgICBpZiAoazJuZWcpXG4gICAgICAgICAgICAgICAgazIgPSBuIC0gazI7XG4gICAgICAgICAgICBpZiAoazEgPiBQT1dfMl8xMjggfHwgazIgPiBQT1dfMl8xMjgpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ3NwbGl0U2NhbGFyOiBFbmRvbW9ycGhpc20gZmFpbGVkLCBrPScgKyBrKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB7IGsxbmVnLCBrMSwgazJuZWcsIGsyIH07XG4gICAgICAgIH0sXG4gICAgfSxcbn0sIHNoYTI1Nik7XG4vLyBTY2hub3JyIHNpZ25hdHVyZXMgYXJlIHN1cGVyaW9yIHRvIEVDRFNBIGZyb20gYWJvdmUuIEJlbG93IGlzIFNjaG5vcnItc3BlY2lmaWMgQklQMDM0MCBjb2RlLlxuLy8gaHR0cHM6Ly9naXRodWIuY29tL2JpdGNvaW4vYmlwcy9ibG9iL21hc3Rlci9iaXAtMDM0MC5tZWRpYXdpa2lcbmNvbnN0IF8wbiA9IEJpZ0ludCgwKTtcbmNvbnN0IGZlID0gKHgpID0+IHR5cGVvZiB4ID09PSAnYmlnaW50JyAmJiBfMG4gPCB4ICYmIHggPCBzZWNwMjU2azFQO1xuY29uc3QgZ2UgPSAoeCkgPT4gdHlwZW9mIHggPT09ICdiaWdpbnQnICYmIF8wbiA8IHggJiYgeCA8IHNlY3AyNTZrMU47XG4vKiogQW4gb2JqZWN0IG1hcHBpbmcgdGFncyB0byB0aG
26774VpciB0YWdnZWQgaGFzaCBwcmVmaXggb2YgW1NIQTI1Nih0YWcpIHwgU0hBMjU2KHRhZyldICovXG5jb25zdCBUQUdHRURfSEFTSF9QUkVGSVhFUyA9IHt9O1xuZnVuY3Rpb24gdGFnZ2VkSGFzaCh0YWcsIC4uLm1lc3NhZ2VzKSB7XG4gICAgbGV0IHRhZ1AgPSBUQUdHRURfSEFTSF9QUkVGSVhFU1t0YWddO1xuICAgIGlmICh0YWdQID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgY29uc3QgdGFnSCA9IHNoYTI1NihVaW50OEFycmF5LmZyb20odGFnLCAoYykgPT4gYy5jaGFyQ29kZUF0KDApKSk7XG4gICAgICAgIHRhZ1AgPSBjb25jYXRCeXRlcyh0YWdILCB0YWdIKTtcbiAgICAgICAgVEFHR0VEX0hBU0hfUFJFRklYRVNbdGFnXSA9IHRhZ1A7XG4gICAgfVxuICAgIHJldHVybiBzaGEyNTYoY29uY2F0Qnl0ZXModGFnUCwgLi4ubWVzc2FnZXMpKTtcbn1cbi8vIEVDRFNBIGNvbXBhY3QgcG9pbnRzIGFyZSAzMy1ieXRlLiBTY2hub3JyIGlzIDMyOiB3ZSBzdHJpcCBmaXJzdCBieXRlIDB4MDIgb3IgMHgwM1xuY29uc3QgcG9pbnRUb0J5dGVzID0gKHBvaW50KSA9PiBwb2ludC50b1Jhd0J5dGVzKHRydWUpLnNsaWNlKDEpO1xuY29uc3QgbnVtVG8zMmIgPSAobikgPT4gbnVtYmVyVG9CeXRlc0JFKG4sIDMyKTtcbmNvbnN0IG1vZFAgPSAoeCkgPT4gbW9kKHgsIHNlY3AyNTZrMVApO1xuY29uc3QgbW9kTiA9ICh4KSA9PiBtb2QoeCwgc2VjcDI1NmsxTik7XG5jb25zdCBQb2ludCA9IHNlY3AyNTZrMS5Qcm9qZWN0aXZlUG9pbnQ7XG5jb25zdCBHbXVsQWRkID0gKFEsIGEsIGIpID0+IFBvaW50LkJBU0UubXVsdGlwbHlBbmRBZGRVbnNhZmUoUSwgYSwgYik7XG4vLyBDYWxjdWxhdGUgcG9pbnQsIHNjYWxhciBhbmQgYnl0ZXNcbmZ1bmN0aW9uIHNjaG5vcnJHZXRFeHRQdWJLZXkocHJpdikge1xuICAgIGxldCBkXyA9IHNlY3AyNTZrMS51dGlscy5ub3JtUHJpdmF0ZUtleVRvU2NhbGFyKHByaXYpOyAvLyBzYW1lIG1ldGhvZCBleGVjdXRlZCBpbiBmcm9tUHJpdmF0ZUtleVxuICAgIGxldCBwID0gUG9pbnQuZnJvbVByaXZhdGVLZXkoZF8pOyAvLyBQID0gZCfii4VHOyAwIDwgZCcgPCBuIGNoZWNrIGlzIGRvbmUgaW5zaWRlXG4gICAgY29uc3Qgc2NhbGFyID0gcC5oYXNFdmVuWSgpID8gZF8gOiBtb2ROKC1kXyk7XG4gICAgcmV0dXJuIHsgc2NhbGFyOiBzY2FsYXIsIGJ5dGVzOiBwb2ludFRvQnl0ZXMocCkgfTtcbn1cbi8qKlxuICogbGlmdF94IGZyb20gQklQMzQwLiBDb252ZXJ0IDMyLWJ5dGUgeCBjb29yZGluYXRlIHRvIGVsbGlwdGljIGN1cnZlIHBvaW50LlxuICogQHJldHVybnMgdmFsaWQgcG9pbnQgY2hlY2tlZCBmb3IgYmVpbmcgb24tY3VydmVcbiAqL1xuZnVuY3Rpb24gbGlmdF94KHgpIHtcbiAgICBpZiAoIWZlKHgpKVxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2JhZCB4OiBuZWVkIDAgPCB4IDwgcCcpOyAvLyBGYWlsIGlmIHgg4omlIHAuXG4gICAgY29uc3QgeHggPSBtb2RQKHggKiB4KTtcbiAgICBjb25zdCBjID0gbW9kUCh4eCAqIHggKyBCaWdJbnQoNykpOyAvLyBMZXQgYyA9IHjCsyArIDcgbW9kIHAuXG4gICAgbGV0IHkgPSBzcXJ0TW9kKGMpOyAvLyBMZXQgeSA9IGNeKHArMSkvNCBtb2QgcC5cbiAgICBpZiAoeSAlIF8ybiAhPT0gXzBuKVxuICAgICAgICB5ID0gbW9kUCgteSk7IC8vIFJldHVybiB0aGUgdW5pcXVlIHBvaW50IFAgc3VjaCB0aGF0IHgoUCkgPSB4IGFuZFxuICAgIGNvbnN0IHAgPSBuZXcgUG9pbnQoeCwgeSwgXzFuKTsgLy8geShQKSA9IHkgaWYgeSBtb2QgMiA9IDAgb3IgeShQKSA9IHAteSBvdGhlcndpc2UuXG4gICAgcC5hc3NlcnRWYWxpZGl0eSgpO1xuICAgIHJldHVybiBwO1xufVxuLyoqXG4gKiBDcmVhdGUgdGFnZ2VkIGhhc2gsIGNvbnZlcnQgaXQgdG8gYmlnaW50LCByZWR1Y2UgbW9kdWxvLW4uXG4gKi9cbmZ1bmN0aW9uIGNoYWxsZW5nZSguLi5hcmdzKSB7XG4gICAgcmV0dXJuIG1vZE4oYnl0ZXNUb051bWJlckJFKHRhZ2dlZEhhc2goJ0JJUDAzNDAvY2hhbGxlbmdlJywgLi4uYXJncykpKTtcbn1cbi8qKlxuICogU2Nobm9yciBwdWJsaWMga2V5IGlzIGp1c3QgYHhgIGNvb3JkaW5hdGUgb2YgUG9pbnQgYXMgcGVyIEJJUDM0MC5cbiAqL1xuZnVuY3Rpb24gc2Nobm9yckdldFB1YmxpY0tleShwcml2YXRlS2V5KSB7XG4gICAgcmV0dXJuIHNjaG5vcnJHZXRFeHRQdWJLZXkocHJpdmF0ZUtleSkuYnl0ZXM7IC8vIGQnPWludChzaykuIEZhaWwgaWYgZCc9MCBvciBkJ+KJpW4uIFJldCBieXRlcyhkJ+KLhUcpXG59XG4vKipcbiAqIENyZWF0ZXMgU2Nobm9yciBzaWduYXR1cmUgYXMgcGVyIEJJUDM0MC4gVmVyaWZpZXMgaXRzZWxmIGJlZm9yZSByZXR1cm5pbmcgYW55dGhpbmcuXG4gKiBhdXhSYW5kIGlzIG9wdGlvbmFsIGFuZCBpcyBub3QgdGhlIHNvbGUgc291cmNlIG9mIGsgZ2VuZXJhdGlvbjogYmFkIENTUFJORyB3b24ndCBiZSBkYW5nZXJvdXMuXG4gKi9cbmZ1bmN0aW9uIHNjaG5vcnJTaWduKG1lc3NhZ2UsIHByaXZhdGVLZXksIGF1eFJhbmQgPSByYW5kb21CeXRlcygzMikpIHtcbiAgICBjb25zdCBtID0gZW5zdXJlQnl0ZXMoJ21lc3NhZ2UnLCBtZXNzYWdlKTtcbiAgICBjb25zdCB7IGJ5dGVzOiBweCwgc2NhbGFyOiBkIH0gPSBzY2hub3JyR2V0RXh0UHViS2V5KHByaXZhdGVLZXkpOyAvLyBjaGVja3MgZm9yIGlzV2l0aGluQ3VydmVPcmRlclxuICAgIGNvbnN0IGEgPSBlbnN1cmVCeXRlcygnYXV4UmFuZCcsIGF1eFJhbmQsIDMyKTsgLy8gQXV4aWxpYXJ5IHJhbmRvbSBkYXRhIGE6IGEgMzItYnl0ZSBhcnJheVxuICAgIGNvbnN0IHQgPSBudW1UbzMyYihkIF4gYnl0ZXNUb051bWJlckJFKHRhZ2dlZEhhc2goJ0JJUDAzNDAvYXV4JywgYSkpKTsgLy8gTGV0IHQgYmUgdGhlIGJ5dGUtd2lzZSB4b3Igb2YgYnl0ZXMoZCkgYW5kIGhhc2gvYXV4KGEpXG4gICAgY29uc3QgcmFuZCA9IHRhZ2dlZEhhc2goJ0JJUDAzNDAvbm9uY2UnLCB0LCBweCwgbSk7IC8vIExldCByYW5kID0gaGFzaC9ub25jZSh0IHx8IGJ5dGVzKFApIHx8IG0pXG4gICAgY29uc3Qga18gPSBtb2ROKGJ5dGVzVG9OdW1iZXJCRShyYW5kKSk7IC8vIExldCBrJyA9IGludChyYW5kKSBtb2QgblxuICAgIGlmIChrXyA9PT0gXzBuKVxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ3NpZ24gZmFpbGVkOiBrIGlzIHplcm8nKTsgLy8gRmFpbCBpZiBrJyA9IDAuXG4gICAgY29uc3QgeyBieXRlczogcngsIHNjYWxhcjogayB9ID0gc2Nobm9yckdldEV4d
26774FB1YktleShrXyk7IC8vIExldCBSID0gayfii4VHLlxuICAgIGNvbnN0IGUgPSBjaGFsbGVuZ2UocngsIHB4LCBtKTsgLy8gTGV0IGUgPSBpbnQoaGFzaC9jaGFsbGVuZ2UoYnl0ZXMoUikgfHwgYnl0ZXMoUCkgfHwgbSkpIG1vZCBuLlxuICAgIGNvbnN0IHNpZyA9IG5ldyBVaW50OEFycmF5KDY0KTsgLy8gTGV0IHNpZyA9IGJ5dGVzKFIpIHx8IGJ5dGVzKChrICsgZWQpIG1vZCBuKS5cbiAgICBzaWcuc2V0KHJ4LCAwKTtcbiAgICBzaWcuc2V0KG51bVRvMzJiKG1vZE4oayArIGUgKiBkKSksIDMyKTtcbiAgICAvLyBJZiBWZXJpZnkoYnl0ZXMoUCksIG0sIHNpZykgKHNlZSBiZWxvdykgcmV0dXJucyBmYWlsdXJlLCBhYm9ydFxuICAgIGlmICghc2Nobm9yclZlcmlmeShzaWcsIG0sIHB4KSlcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdzaWduOiBJbnZhbGlkIHNpZ25hdHVyZSBwcm9kdWNlZCcpO1xuICAgIHJldHVybiBzaWc7XG59XG4vKipcbiAqIFZlcmlmaWVzIFNjaG5vcnIgc2lnbmF0dXJlLlxuICogV2lsbCBzd2FsbG93IGVycm9ycyAmIHJldHVybiBmYWxzZSBleGNlcHQgZm9yIGluaXRpYWwgdHlwZSB2YWxpZGF0aW9uIG9mIGFyZ3VtZW50cy5cbiAqL1xuZnVuY3Rpb24gc2Nobm9yclZlcmlmeShzaWduYXR1cmUsIG1lc3NhZ2UsIHB1YmxpY0tleSkge1xuICAgIGNvbnN0IHNpZyA9IGVuc3VyZUJ5dGVzKCdzaWduYXR1cmUnLCBzaWduYXR1cmUsIDY0KTtcbiAgICBjb25zdCBtID0gZW5zdXJlQnl0ZXMoJ21lc3NhZ2UnLCBtZXNzYWdlKTtcbiAgICBjb25zdCBwdWIgPSBlbnN1cmVCeXRlcygncHVibGljS2V5JywgcHVibGljS2V5LCAzMik7XG4gICAgdHJ5IHtcbiAgICAgICAgY29uc3QgUCA9IGxpZnRfeChieXRlc1RvTnVtYmVyQkUocHViKSk7IC8vIFAgPSBsaWZ0X3goaW50KHBrKSk7IGZhaWwgaWYgdGhhdCBmYWlsc1xuICAgICAgICBjb25zdCByID0gYnl0ZXNUb051bWJlckJFKHNpZy5zdWJhcnJheSgwLCAzMikpOyAvLyBMZXQgciA9IGludChzaWdbMDozMl0pOyBmYWlsIGlmIHIg4omlIHAuXG4gICAgICAgIGlmICghZmUocikpXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIGNvbnN0IHMgPSBieXRlc1RvTnVtYmVyQkUoc2lnLnN1YmFycmF5KDMyLCA2NCkpOyAvLyBMZXQgcyA9IGludChzaWdbMzI6NjRdKTsgZmFpbCBpZiBzIOKJpSBuLlxuICAgICAgICBpZiAoIWdlKHMpKVxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICBjb25zdCBlID0gY2hhbGxlbmdlKG51bVRvMzJiKHIpLCBwb2ludFRvQnl0ZXMoUCksIG0pOyAvLyBpbnQoY2hhbGxlbmdlKGJ5dGVzKHIpfHxieXRlcyhQKXx8bSkpJW5cbiAgICAgICAgY29uc3QgUiA9IEdtdWxBZGQoUCwgcywgbW9kTigtZSkpOyAvLyBSID0gc+KLhUcgLSBl4ouFUFxuICAgICAgICBpZiAoIVIgfHwgIVIuaGFzRXZlblkoKSB8fCBSLnRvQWZmaW5lKCkueCAhPT0gcilcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTsgLy8gLWVQID09IChuLWUpUFxuICAgICAgICByZXR1cm4gdHJ1ZTsgLy8gRmFpbCBpZiBpc19pbmZpbml0ZShSKSAvIG5vdCBoYXNfZXZlbl95KFIpIC8geChSKSDiiaAgci5cbiAgICB9XG4gICAgY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG59XG5leHBvcnQgY29uc3Qgc2Nobm9yciA9IC8qIEBfX1BVUkVfXyAqLyAoKCkgPT4gKHtcbiAgICBnZXRQdWJsaWNLZXk6IHNjaG5vcnJHZXRQdWJsaWNLZXksXG4gICAgc2lnbjogc2Nobm9yclNpZ24sXG4gICAgdmVyaWZ5OiBzY2hub3JyVmVyaWZ5LFxuICAgIHV0aWxzOiB7XG4gICAgICAgIHJhbmRvbVByaXZhdGVLZXk6IHNlY3AyNTZrMS51dGlscy5yYW5kb21Qcml2YXRlS2V5LFxuICAgICAgICBsaWZ0X3gsXG4gICAgICAgIHBvaW50VG9CeXRlcyxcbiAgICAgICAgbnVtYmVyVG9CeXRlc0JFLFxuICAgICAgICBieXRlc1RvTnVtYmVyQkUsXG4gICAgICAgIHRhZ2dlZEhhc2gsXG4gICAgICAgIG1vZCxcbiAgICB9LFxufSkpKCk7XG5jb25zdCBpc29NYXAgPSAvKiBAX19QVVJFX18gKi8gKCgpID0+IGlzb2dlbnlNYXAoRnAsIFtcbiAgICAvLyB4TnVtXG4gICAgW1xuICAgICAgICAnMHg4ZTM4ZTM4ZTM4ZTM4ZTM4ZTM4ZTM4ZTM4ZTM4ZTM4ZTM4ZTM4ZTM4ZTM4ZTM4ZTM4ZTM4ZTM4ZGFhYWFhOGM3JyxcbiAgICAgICAgJzB4N2QzZDRjODBiYzMyMWQ1YjlmMzE1Y2VhN2ZkNDRjNWQ1OTVkMmZjMGJmNjNiOTJkZmZmMTA0NGYxN2M2NTgxJyxcbiAgICAgICAgJzB4NTM0YzMyOGQyM2YyMzRlNmUyYTQxM2RlY2EyNWNhZWNlNDUwNjE0NDAzN2M0MDMxNGVjYmQwYjUzZDlkZDI2MicsXG4gICAgICAgICcweDhlMzhlMzhlMzhlMzhlMzhlMzhlMzhlMzhlMzhlMzhlMzhlMzhlMzhlMzhlMzhlMzhlMzhlMzhkYWFhYWE4OGMnLFxuICAgIF0sXG4gICAgLy8geERlblxuICAgIFtcbiAgICAgICAgJzB4ZDM1NzcxMTkzZDk0OTE4YTljYTM0Y2NiYjdiNjQwZGQ4NmNkNDA5NTQyZjg0ODdkOWZlNmI3NDU3ODFlYjQ5YicsXG4gICAgICAgICcweGVkYWRjNmY2NDM4M2RjMWRmN2M0YjJkNTFiNTQyMjU0MDZkMzZiNjQxZjVlNDFiYmM1MmE1NjYxMmE4YzZkMTQnLFxuICAgICAgICAnMHgwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAxJywgLy8gTEFTVCAxXG4gICAgXSxcbiAgICAvLyB5TnVtXG4gICAgW1xuICAgICAgICAnMHg0YmRhMTJmNjg0YmRhMTJmNjg0YmRhMTJmNjg0YmRhMTJmNjg0YmRhMTJmNjg0YmRhMTJmNjg0YjhlMzhlMjNjJyxcbiAgICAgICAgJzB4Yzc1ZTBjMzJkNWNiN2MwZmE5ZDBhNTRiMTJhMGE2ZDU2NDdhYjA0NmQ2ODZkYTZmZGZmYzkwZmMyMDFkNzFhMycsXG4gICAgICAgICcweDI5YTYxOTQ2OTFmOTFhNzM3MTUyMDllZjY1MTJlNTc2NzIyODMwYTIwMWJlMjAxOGE3NjVlODVhOWVjZWU5MzEnLFxuICAgICAgICAnMHgyZjY4NGJkYTEyZjY4NGJkYTEyZjY4NGJkYTEyZjY4NGJkYTEyZjY4NGJkYTEyZjY4NGJkYTEyZjM4ZTM4ZDg0JyxcbiAgICBdLFxuICAgIC8vIHlEZW5cbiAgICBbXG4gICAgICAgICcweGZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZlZmZmZmY5M2InLFxuICAgICAgICAnMHg3YTA2NTM0YmI4YmRiNDlmZDVlOWU2NjMyNzIyYzI5ODk0NjdjMWJmYzhlOGQ5NzhkZmI0MjVkMjY4NWMyNTczJyxcbiAgICAgICAgJzB4NjQ4NGFhNzE2NTQ1Y2EyY2YzYTcwYzNmYThmZTMzN2UwYTNkMjExNjJmMGQ2Mjk5YTdiZjgxOTJiZmQyYTc2ZicsXG4gICAgICAgICcweDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDEnLCAvLyBMQVNUIDFcbiAgICBdLFxuXS5tYXAoKGkpID0+IGkubWFwKChqKSA9PiBCaWdJbnQoaikpKSkpKCk7XG5jb25zdCBtYXBTV1UgPSAvKiBAX19QVVJFX18gKi8gKCgpID0+IG1hcFRvQ3VydmVTaW1wbGVTV1UoRnAsIHtcbiAgICBBOiBCaWdJbnQoJzB4M2Y4NzMxYWJkZDY2MWFkY2EwOGE1NTU4ZjBmNWQyNzJlOTUzZDM2M2NiNmYwZTVkNDA1NDQ3YzAxYTQ0NDUzMycpLFxuICAgIEI6IEJpZ0ludCgnMTc3MScpLFxuICAgIFo6IEZwLmNyZWF0ZShCaWdJbnQoJy0xMScpKSxcbn0pKSgpO1xuY29uc3QgaHRmID0gLyogQF9fUFVSRV9fICovICgoKSA9PiBjcmVhdGVIYXNoZXIoc2VjcDI1NmsxLlByb2plY3RpdmVQb2ludCwgKHNjYWxhcnMpID0+IHtcbiAgICBjb25zdCB7IHgsIHkgfSA9IG1hcFNXVShGcC5jcmVhdGUoc2NhbGFyc1swXSkpO1xuICAgIHJldHVybi
26774Bpc29NYXAoeCwgeSk7XG59LCB7XG4gICAgRFNUOiAnc2VjcDI1NmsxX1hNRDpTSEEtMjU2X1NTV1VfUk9fJyxcbiAgICBlbmNvZGVEU1Q6ICdzZWNwMjU2azFfWE1EOlNIQS0yNTZfU1NXVV9OVV8nLFxuICAgIHA6IEZwLk9SREVSLFxuICAgIG06IDEsXG4gICAgazogMTI4LFxuICAgIGV4cGFuZDogJ3htZCcsXG4gICAgaGFzaDogc2hhMjU2LFxufSkpKCk7XG5leHBvcnQgY29uc3QgaGFzaFRvQ3VydmUgPSAvKiBAX19QVVJFX18gKi8gKCgpID0+IGh0Zi5oYXNoVG9DdXJ2ZSkoKTtcbmV4cG9ydCBjb25zdCBlbmNvZGVUb0N1cnZlID0gLyogQF9fUFVSRV9fICovICgoKSA9PiBodGYuZW5jb2RlVG9DdXJ2ZSkoKTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXNlY3AyNTZrMS5qcy5tYXAiLCIvKipcbiAqICBBIGNvbnN0YW50IGZvciB0aGUgemVybyBhZGRyZXNzLlxuICpcbiAqICAoKippLmUuKiogYGBcIjB4MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMFwiYGApXG4gKi9cbmV4cG9ydCBjb25zdCBaZXJvQWRkcmVzcyA9IFwiMHgwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwXCI7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1hZGRyZXNzZXMuanMubWFwIiwiLyoqXG4gKiAgQSBjb25zdGFudCBmb3IgdGhlIHplcm8gaGFzaC5cbiAqXG4gKiAgKCoqaS5lLioqIGBgXCIweDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDBcImBgKVxuICovXG5leHBvcnQgY29uc3QgWmVyb0hhc2ggPSBcIjB4MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMFwiO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9aGFzaGVzLmpzLm1hcCIsIi8qKlxuICogIEEgY29uc3RhbnQgZm9yIHRoZSBvcmRlciBOIGZvciB0aGUgc2VjcDI1NmsxIGN1cnZlLlxuICpcbiAqICAoKippLmUuKiogYGAweGZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZlYmFhZWRjZTZhZjQ4YTAzYmJmZDI1ZThjZDAzNjQxNDFuYGApXG4gKi9cbmV4cG9ydCBjb25zdCBOID0gQmlnSW50KFwiMHhmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZWJhYWVkY2U2YWY0OGEwM2JiZmQyNWU4Y2QwMzY0MTQxXCIpO1xuLyoqXG4gKiAgQSBjb25zdGFudCBmb3IgdGhlIG51bWJlciBvZiB3ZWkgaW4gYSBzaW5nbGUgZXRoZXIuXG4gKlxuICogICgqKmkuZS4qKiBgYDEwMDAwMDAwMDAwMDAwMDAwMDBuYGApXG4gKi9cbmV4cG9ydCBjb25zdCBXZWlQZXJFdGhlciA9IEJpZ0ludChcIjEwMDAwMDAwMDAwMDAwMDAwMDBcIik7XG4vKipcbiAqICBBIGNvbnN0YW50IGZvciB0aGUgbWF4aW11bSB2YWx1ZSBmb3IgYSBgYHVpbnQyNTZgYC5cbiAqXG4gKiAgKCoqaS5lLioqIGBgMHhmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmbmBgKVxuICovXG5leHBvcnQgY29uc3QgTWF4VWludD
26774I1NiA9IEJpZ0ludChcIjB4ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZlwiKTtcbi8qKlxuICogIEEgY29uc3RhbnQgZm9yIHRoZSBtaW5pbXVtIHZhbHVlIGZvciBhbiBgYGludDI1NmBgLlxuICpcbiAqICAoKippLmUuKiogYGAtODAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMG5gYClcbiAqL1xuZXhwb3J0IGNvbnN0IE1pbkludDI1NiA9IEJpZ0ludChcIjB4ODAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMFwiKSAqIEJpZ0ludCgtMSk7XG4vKipcbiAqICBBIGNvbnN0YW50IGZvciB0aGUgbWF4aW11bSB2YWx1ZSBmb3IgYW4gYGBpbnQyNTZgYC5cbiAqXG4gKiAgKCoqaS5lLioqIGBgMHg3ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmbmBgKVxuICovXG5leHBvcnQgY29uc3QgTWF4SW50MjU2ID0gQmlnSW50KFwiMHg3ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmXCIpO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9bnVtYmVycy5qcy5tYXAiLCIvLyBORktDIChjb21wb3NlZCkgICAgICAgICAgICAgLy8gKGRlY29tcG9zZWQpXG4vKipcbiAqICBBIGNvbnN0YW50IGZvciB0aGUgZXRoZXIgc3ltYm9sIChub3JtYWxpemVkIHVzaW5nIE5GS0MpLlxuICpcbiAqICAoKippLmUuKiogYGBcIlxcXFx1MDM5ZVwiYGApXG4gKi9cbmV4cG9ydCBjb25zdCBFdGhlclN5bWJvbCA9IFwiXFx1MDM5ZVwiOyAvLyBcIlxcdUQ4MzVcXHVERjYzXCI7XG4vKipcbiAqICBBIGNvbnN0YW50IGZvciB0aGUgW1tsaW5rLWVpcC0xOTFdXSBwZXJzb25hbCBtZXNzYWdlIHByZWZpeC5cbiAqXG4gKiAgKCoqaS5lLioqIGBgXCJcXFxceDE5RXRoZXJldW0gU2lnbmVkIE1lc3NhZ2U6XFxcXG5cImBgKVxuICovXG5leHBvcnQgY29uc3QgTWVzc2FnZVByZWZpeCA9IFwiXFx4MTlFdGhlcmV1bSBTaWduZWQgTWVzc2FnZTpcXG5cIjtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXN0cmluZ3MuanMubWFwIiwiaW1wb3J0IHsgWmVyb0hhc2ggfSBmcm9tIFwiLi4vY29uc3RhbnRzL2luZGV4LmpzXCI7XG5pbXBvcnQgeyBjb25jYXQsIGRhdGFMZW5ndGgsIGdldEJpZ0ludCwgZ2V0Qnl0ZXMsIGdldE51bWJlciwgaGV4bGlmeSwgdG9CZUFycmF5LCBpc0hleFN0cmluZywgemVyb1BhZFZhbHVlLCBhc3NlcnRBcmd1bWVudCwgYXNzZXJ0UHJpdmF0ZSB9IGZyb20gXCIuLi91dGlscy9pbmRleC5qc1wiO1xuLy8gQ29uc3RhbnRzXG5jb25zdCBCTl8wID0gQmlnSW50KDApO1xuY29uc3QgQk5fMSA9IEJpZ0ludCgxKTtcbmNvbnN0IEJOXzIgPSBCaWdJbnQoMik7XG5jb25zdCBCTl8yNyA9IEJpZ0ludCgyNyk7XG5jb25zdCBCTl8yOCA9IEJpZ0ludCgyOCk7XG5jb25zdCBCTl8zNSA9IEJpZ0ludCgzNSk7XG5jb25zdCBCTl9OID0gQmlnSW50KFwiMHhmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZWJhYWVkY2U2YWY0OGEwM2JiZmQyNWU4Y2QwMzY0MTQxXCIpO1xuY29uc3QgQk5fTl8yID0gQk5fTiAvIEJOXzI7IC8vIE11c3QgYmUgaW50ZWdlciAoZmxvb3IpIGRpdmlzaW9uOyBkbyBOT1Qgc2hpZnRzXG5jb25zdCBpbnNwZWN0ID0gU3ltYm9sLmZvcihcIm5vZGVqcy51dGlsLmluc3BlY3QuY3VzdG9tXCIpO1xuY29uc3QgX2d1YXJkID0ge307XG5mdW5jdGlvbiB0b1VpbnQyNTYodmFsdWUpIHtcbiAgICByZXR1cm4gemVyb1BhZFZhbHVlKHRvQmVBcnJheSh2YWx1ZSksIDMyKTtcbn1cbi8qKlxuICogIEEgU2lnbmF0dXJlICBAVE9ET1xuICpcbiAqXG4gKiAgQF9kb2Nsb2M6IGFwaS9jcnlwdG86U2lnbmluZ1xuICovXG5leHBvcnQgY2xhc3MgU2lnbmF0dXJlIHtcbiAgICAjcjtcbiAgICAjcztcbiAgICAjdjtcbiAgICAjbmV0d29ya1Y7XG4gICAgLyoqXG4gICAgICogIFRoZSBgYHJgYCB2YWx1ZSBmb3IgYSBzaWduYXR1cmUuXG4gICAgICpcbiAgICAgKiAgVGhpcyByZXByZXNlbnRzIHRoZSBgYHhgYCBjb29yZGluYXRlIG9mIGEgXCJyZWZlcmVuY2VcIiBvclxuICAgICAqICBjaGFsbGVuZ2UgcG9pbnQsIGZyb20gd2hpY2ggdGhlIGBgeWBgIGNhbiBiZSBjb21wdXRlZC5cbiAgICAgKi9cbiAgICBnZXQgcigpIHsgcmV0dXJuIHRoaXMuI3I7IH1cbiAgICBzZXQgcih2YWx1ZSkge1xuICAgICAgICBhc3NlcnRBcmd1bWVudChkYXRhTGVuZ3RoKHZhbHVlKSA9PT0gMzIsIFwiaW52YWxpZCByXCIsIFwidmFsdWVcIiwgdmFsdWUpO1xuICAgICAgICB0aGlzLiNyID0gaGV4bGlmeSh2YWx1ZSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqICBUaGUgYGBzYGAgdmFsdWUgZm9yIGEgc2lnbmF0dXJlLlxuICAgICAqL1xuICAgIGdldCBzKCkge1xuICAgICAgICBhc3NlcnRBcmd1bWVudChwYXJzZUludCh0aGlzLiNzLnN1YnN0cmluZygwLCAzKSkgPCA4LCBcIm5vbi1jYW5vbmljYWwgczsgdXNlIC5fc1wiLCBcInNcIiwgdGhpcy4jcyk7XG4gICAgICAgIHJldHVybiB0aGlzLiNzO1xuICAgIH1cbiAgICBzZXQgcyhfdmFsdWUpIHtcbiAgICAgICAgYXNzZXJ0QXJndW1lbnQoZGF0YUxlbmd0aChfdmFsdWUpID09PSAzMiwgXCJpbnZhbGlkIHNcIiwgXCJ2YWx1ZVwiLCBfdmFsdWUpO1xuICAgICAgICB0aGlzLiNzID0gaGV4bGlmeShfdmFsdWUpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiAgUmV0dXJuIHRoZSBzIHZhbHVlLCB1bmNoZWNrZWQgZm9yIEVJUC0yIGNvbXBsaWFuY2UuXG4gICAgICpcbiAgICAgKiAgVGhpcyBzaG91bGQgZ2VuZXJhbGx5IG5vdCBiZSB1c2VkIGFuZCBpcyBmb3Igc2l0dWF0aW9ucyB3aGVyZVxuICAgICAqICBhIG5vbi1jYW5vbmljYWwgUyB2YWx1ZSBtaWdodCBiZSByZWxldmFudCwgc3VjaCBhcyBGcm9udGllciBibG9ja3NcbiAgICAgKiAgdGhhdCB3ZXJlIG1pbmVkIHByaW9yIHRvIEVJUC0yIG9yIGludmFsaWQgQXV0aG9yaXphdGlvbiBMaXN0XG4gICAgICogIHNpZ25hdHVyZXMuXG4gICAgICovXG4gICAgZ2V0IF9zKCkgeyByZXR1cm4gdGhpcy4jczsgfVxuICAgIC8qKlxuICAgICAqICBSZXR1cm5zIHRydWUgaWYgdGhlIFNpZ25hdHVyZSBpcyB2YWxpZCBmb3IgW1tsaW5rLWVpcC0yXV0gc2lnbmF0dXJlcy5cbiAgICAgKi9cbiAgICBpc1ZhbGlkKCkge1xuICAgICAgICBjb25zdCBzID0gQmlnSW50KHRoaXMuI3MpO1xuICAgICAgICByZXR1cm4gKHMgPD0gQk5fTl8yKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogIFRoZSBgYHZgYCB2YWx1ZSBmb3IgYSBzaWduYXR1cmUuXG4gICAgICpcbiAgICAgKiAgU2luY2UgYSBnaXZlbiBgYHhgYCB2YWx1ZSBmb3IgYGByYGAgaGFzIHR3byBwb3NzaWJsZSB2YWx1ZXMgZm9yXG4gICAgICogIGl0cyBjb3JyZXNwb25kaW4gYGB5YGAsIHRoZSBgYHZgYCBpbmRpY2F0ZXMgd2hpY2ggb2YgdGhlIHR3byBgYHlgYFxuICAgICAqICB2YWx1ZXMgdG8gdXNlLlxuICAgICAqXG4gICAgICogIEl0IGlzIG5vcm1hbGl6ZWQgdG8gdGhlIHZhbHVlcyBgYDI3YGAgb3IgYGAyOGBgIGZvciBsZWdhY3lcbiAgICAgKiAgcHVycG9zZXMuXG4gICAgICovXG4gICAgZ2V0IHYoKSB7IHJldHVybi
26774B0aGlzLiN2OyB9XG4gICAgc2V0IHYodmFsdWUpIHtcbiAgICAgICAgY29uc3QgdiA9IGdldE51bWJlcih2YWx1ZSwgXCJ2YWx1ZVwiKTtcbiAgICAgICAgYXNzZXJ0QXJndW1lbnQodiA9PT0gMjcgfHwgdiA9PT0gMjgsIFwiaW52YWxpZCB2XCIsIFwidlwiLCB2YWx1ZSk7XG4gICAgICAgIHRoaXMuI3YgPSB2O1xuICAgIH1cbiAgICAvKipcbiAgICAgKiAgVGhlIEVJUC0xNTUgYGB2YGAgZm9yIGxlZ2FjeSB0cmFuc2FjdGlvbnMuIEZvciBub24tbGVnYWN5XG4gICAgICogIHRyYW5zYWN0aW9ucywgdGhpcyB2YWx1ZSBpcyBgYG51bGxgYC5cbiAgICAgKi9cbiAgICBnZXQgbmV0d29ya1YoKSB7IHJldHVybiB0aGlzLiNuZXR3b3JrVjsgfVxuICAgIC8qKlxuICAgICAqICBUaGUgY2hhaW4gSUQgZm9yIEVJUC0xNTUgbGVnYWN5IHRyYW5zYWN0aW9ucy4gRm9yIG5vbi1sZWdhY3lcbiAgICAgKiAgdHJhbnNhY3Rpb25zLCB0aGlzIHZhbHVlIGlzIGBgbnVsbGBgLlxuICAgICAqL1xuICAgIGdldCBsZWdhY3lDaGFpbklkKCkge1xuICAgICAgICBjb25zdCB2ID0gdGhpcy5uZXR3b3JrVjtcbiAgICAgICAgaWYgKHYgPT0gbnVsbCkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIFNpZ25hdHVyZS5nZXRDaGFpbklkKHYpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiAgVGhlIGBgeVBhcml0eWBgIGZvciB0aGUgc2lnbmF0dXJlLlxuICAgICAqXG4gICAgICogIFNlZSBgYHZgYCBmb3IgbW9yZSBkZXRhaWxzIG9uIGhvdyB0aGlzIHZhbHVlIGlzIHVzZWQuXG4gICAgICovXG4gICAgZ2V0IHlQYXJpdHkoKSB7XG4gICAgICAgIHJldHVybiAodGhpcy52ID09PSAyNykgPyAwIDogMTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogIFRoZSBbW2xpbmstZWlwLTIwOThdXSBjb21wYWN0IHJlcHJlc2VudGF0aW9uIG9mIHRoZSBgYHlQYXJpdHlgYFxuICAgICAqICBhbmQgYGBzYGAgY29tcGFjdGVkIGludG8gYSBzaW5nbGUgYGBieXRlczMyYGAuXG4gICAgICovXG4gICAgZ2V0IHlQYXJpdHlBbmRTKCkge1xuICAgICAgICAvLyBUaGUgRUlQLTIwOTggY29tcGFjdCByZXByZXNlbnRhdGlvblxuICAgICAgICBjb25zdCB5UGFyaXR5QW5kUyA9IGdldEJ5dGVzKHRoaXMucyk7XG4gICAgICAgIGlmICh0aGlzLnlQYXJpdHkpIHtcbiAgICAgICAgICAgIHlQYXJpdHlBbmRTWzBdIHw9IDB4ODA7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGhleGxpZnkoeVBhcml0eUFuZFMpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiAgVGhlIFtbbGluay1laXAtMjA5OF1dIGNvbXBhY3QgcmVwcmVzZW50YXRpb24uXG4gICAgICovXG4gICAgZ2V0IGNvbXBhY3RTZXJpYWxpemVkKCkge1xuICAgICAgICByZXR1cm4gY29uY2F0KFt0aGlzLnIsIHRoaXMueVBhcml0eUFuZFNdKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogIFRoZSBzZXJpYWxpemVkIHJlcHJlc2VudGF0aW9uLlxuICAgICAqL1xuICAgIGdldCBzZXJpYWxpemVkKCkge1xuICAgICAgICByZXR1cm4gY29uY2F0KFt0aGlzLnIsIHRoaXMucywgKHRoaXMueVBhcml0eSA/IFwiMHgxY1wiIDogXCIweDFiXCIpXSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqICBAcHJpdmF0ZVxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yKGd1YXJkLCByLCBzLCB2KSB7XG4gICAgICAgIGFzc2VydFByaXZhdGUoZ3VhcmQsIF9ndWFyZCwgXCJTaWduYXR1cmVcIik7XG4gICAgICAgIHRoaXMuI3IgPSByO1xuICAgICAgICB0aGlzLiNzID0gcztcbiAgICAgICAgdGhpcy4jdiA9IHY7XG4gICAgICAgIHRoaXMuI25ldHdvcmtWID0gbnVsbDtcbiAgICB9XG4gICAgLyoqXG4gICAgICogIFJldHVybnMgdGhlIGNhbm9uaWNhbCBzaWduYXR1cmUuXG4gICAgICpcbiAgICAgKiAgVGhpcyBpcyBvbmx5IG5lY2Vzc2FyeSB3aGVuIGRlYWxpbmcgd2l0aCBsZWdhY3kgdHJhbnNhY3Rpb24gd2hpY2hcbiAgICAgKiAgZGlkIG5vdCBlbmZvcmNlIGNhbm9uaWNhbCBTIHZhbHVlcyAoaS5lLiBbW2xpbmstZWlwLTJdXS4gTW9zdFxuICAgICAqICBkZXZlbG9wZXJzIHNob3VsZCBuZXZlciByZXF1aXJlIHRoaXMuXG4gICAgICovXG4gICAgZ2V0Q2Fub25pY2FsKCkge1xuICAgICAgICBpZiAodGhpcy5pc1ZhbGlkKCkpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgICB9XG4gICAgICAgIC8vIENvbXB1dGUgdGhlIGNhbm9uaWNhbCBzaWduYXR1cmU7IHMnID0gTiAtIHMsIHYgPSAhdlxuICAgICAgICBjb25zdCBzID0gQk5fTiAtIEJpZ0ludCh0aGlzLl9zKTtcbiAgICAgICAgY29uc3QgdiA9ICg1NSAtIHRoaXMudik7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IG5ldyBTaWduYXR1cmUoX2d1YXJkLCB0aGlzLnIsIHRvVWludDI1NihzKSwgdik7XG4gICAgICAgIC8vIFBvcHVsYXRlIHRoZSBuZXR3b3JrViBpZiBuZWNlc3NhcnlcbiAgICAgICAgaWYgKHRoaXMubmV0d29ya1YpIHtcbiAgICAgICAgICAgIHJlc3VsdC4jbmV0d29ya1YgPSB0aGlzLm5ldHdvcmtWO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuICAgIC8qKlxuICAgICAqICBSZXR1cm5zIGEgbmV3IGlkZW50aWNhbCBbW1NpZ25hdHVyZV1dLlxuICAgICAqL1xuICAgIGNsb25lKCkge1xuICAgICAgICBjb25zdCBjbG9uZSA9IG5ldyBTaWduYXR1cmUoX2d1YXJkLCB0aGlzLnIsIHRoaXMuX3MsIHRoaXMudik7XG4gICAgICAgIGlmICh0aGlzLm5ldHdvcmtWKSB7XG4gICAgICAgICAgICBjbG9uZS4jbmV0d29ya1YgPSB0aGlzLm5ldHdvcmtWO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBjbG9uZTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogIFJldHVybnMgYSByZXByZXNlbnRhdGlvbiB0aGF0IGlzIGNvbXBhdGlibGUgd2l0aCBgYEpTT04uc3RyaW5naWZ5YGAuXG4gICAgICovXG4gICAgdG9KU09OKCkge1xuICAgICAgICBjb25zdCBuZXR3b3JrViA9IHRoaXMubmV0d29ya1Y7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBfdHlwZTogXCJzaWduYXR1cmVcIixcbiAgICAgICAgICAgIG5ldHdvcmtWOiAoKG5ldHdvcmtWICE9IG51bGwpID8gbmV0d29ya1YudG9TdHJpbmc
26774oKSA6IG51bGwpLFxuICAgICAgICAgICAgcjogdGhpcy5yLCBzOiB0aGlzLl9zLCB2OiB0aGlzLnYsXG4gICAgICAgIH07XG4gICAgfVxuICAgIFtpbnNwZWN0XSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudG9TdHJpbmcoKTtcbiAgICB9XG4gICAgdG9TdHJpbmcoKSB7XG4gICAgICAgIGlmICh0aGlzLmlzVmFsaWQoKSkge1xuICAgICAgICAgICAgcmV0dXJuIGBTaWduYXR1cmUgeyByOiAke3RoaXMucn0sIHM6ICR7dGhpcy5fc30sIHY6ICR7dGhpcy52fSB9YDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYFNpZ25hdHVyZSB7IHI6ICR7dGhpcy5yfSwgczogJHt0aGlzLl9zfSwgdjogJHt0aGlzLnZ9LCB2YWxpZDogZmFsc2UgfWA7XG4gICAgfVxuICAgIC8qKlxuICAgICAqICBDb21wdXRlIHRoZSBjaGFpbiBJRCBmcm9tIHRoZSBgYHZgYCBpbiBhIGxlZ2FjeSBFSVAtMTU1IHRyYW5zYWN0aW9ucy5cbiAgICAgKlxuICAgICAqICBAZXhhbXBsZTpcbiAgICAgKiAgICBTaWduYXR1cmUuZ2V0Q2hhaW5JZCg0NSlcbiAgICAgKiAgICAvL19yZXN1bHQ6XG4gICAgICpcbiAgICAgKiAgICBTaWduYXR1cmUuZ2V0Q2hhaW5JZCg0NilcbiAgICAgKiAgICAvL19yZXN1bHQ6XG4gICAgICovXG4gICAgc3RhdGljIGdldENoYWluSWQodikge1xuICAgICAgICBjb25zdCBidiA9IGdldEJpZ0ludCh2LCBcInZcIik7XG4gICAgICAgIC8vIFRoZSB2IGlzIG5vdCBhbiBFSVAtMTU1IHYsIHNvIGl0IGlzIHRoZSB1bnNwZWNpZmllZCBjaGFpbiBJRFxuICAgICAgICBpZiAoKGJ2ID09IEJOXzI3KSB8fCAoYnYgPT0gQk5fMjgpKSB7XG4gICAgICAgICAgICByZXR1cm4gQk5fMDtcbiAgICAgICAgfVxuICAgICAgICAvLyBCYWQgdmFsdWUgZm9yIGFuIEVJUC0xNTUgdlxuICAgICAgICBhc3NlcnRBcmd1bWVudChidiA+PSBCTl8zNSwgXCJpbnZhbGlkIEVJUC0xNTUgdlwiLCBcInZcIiwgdik7XG4gICAgICAgIHJldHVybiAoYnYgLSBCTl8zNSkgLyBCTl8yO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiAgQ29tcHV0ZSB0aGUgYGB2YGAgZm9yIGEgY2hhaW4gSUQgZm9yIGEgbGVnYWN5IEVJUC0xNTUgdHJhbnNhY3Rpb25zLlxuICAgICAqXG4gICAgICogIExlZ2FjeSB0cmFuc2FjdGlvbnMgd2hpY2ggdXNlIFtbbGluay1laXAtMTU1XV0gaGlqYWNrIHRoZSBgYHZgYFxuICAgICAqICBwcm9wZXJ0eSB0byBpbmNsdWRlIHRoZSBjaGFpbiBJRC5cbiAgICAgKlxuICAgICAqICBAZXhhbXBsZTpcbiAgICAgKiAgICBTaWduYXR1cmUuZ2V0Q2hhaW5JZFYoNSwgMjcpXG4gICAgICogICAgLy9fcmVzdWx0OlxuICAgICAqXG4gICAgICogICAgU2lnbmF0dXJlLmdldENoYWluSWRWKDUsIDI4KVxuICAgICAqICAgIC8vX3Jlc3VsdDpcbiAgICAgKlxuICAgICAqL1xuICAgIHN0YXRpYyBnZXRDaGFpbklkVihjaGFpbklkLCB2KSB7XG4gICAgICAgIHJldHVybiAoZ2V0QmlnSW50KGNoYWluSWQpICogQk5fMikgKyBCaWdJbnQoMzUgKyB2IC0gMjcpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiAgQ29tcHV0ZSB0aGUgbm9ybWFsaXplZCBsZWdhY3kgdHJhbnNhY3Rpb24gYGB2YGAgZnJvbSBhIGBgeVBhcmlydHlgYCxcbiAgICAgKiAgYSBsZWdhY3kgdHJhbnNhY3Rpb24gYGB2YGAgb3IgYSBsZWdhY3kgW1tsaW5rLWVpcC0xNTVdXSB0cmFuc2FjdGlvbi5cbiAgICAgKlxuICAgICAqICBAZXhhbXBsZTpcbiAgICAgKiAgICAvLyBUaGUgdmFsdWVzIDAgYW5kIDEgaW1wbHkgdiBpcyBhY3R1YWxseSB5UGFyaXR5XG4gICAgICogICAgU2lnbmF0dXJlLmdldE5vcm1hbGl6ZWRWKDApXG4gICAgICogICAgLy9fcmVzdWx0OlxuICAgICAqXG4gICAgICogICAgLy8gTGVnYWN5IG5vbi1FSVAtMTU1OSB0cmFuc2FjdGlvbiAoaS5lLiAyNyBvciAyOClcbiAgICAgKiAgICBTaWduYXR1cmUuZ2V0Tm9ybWFsaXplZFYoMjcpXG4gICAgICogICAgLy9fcmVzdWx0OlxuICAgICAqXG4gICAgICogICAgLy8gTGVnYWN5IEVJUC0xNTUgdHJhbnNhY3Rpb24gKGkuZS4gPj0gMzUpXG4gICAgICogICAgU2lnbmF0dXJlLmdldE5vcm1hbGl6ZWRWKDQ2KVxuICAgICAqICAgIC8vX3Jlc3VsdDpcbiAgICAgKlxuICAgICAqICAgIC8vIEludmFsaWQgdmFsdWVzIHRocm93XG4gICAgICogICAgU2lnbmF0dXJlLmdldE5vcm1hbGl6ZWRWKDUpXG4gICAgICogICAgLy9fZXJyb3I6XG4gICAgICovXG4gICAgc3RhdGljIGdldE5vcm1hbGl6ZWRWKHYpIHtcbiAgICAgICAgY29uc3QgYnYgPSBnZXRCaWdJbnQodik7XG4gICAgICAgIGlmIChidiA9PT0gQk5fMCB8fCBidiA9PT0gQk5fMjcpIHtcbiAgICAgICAgICAgIHJldHVybiAyNztcbiAgICAgICAgfVxuICAgICAgICBpZiAoYnYgPT09IEJOXzEgfHwgYnYgPT09IEJOXzI4KSB7XG4gICAgICAgICAgICByZXR1cm4gMjg7XG4gICAgICAgIH1cbiAgICAgICAgYXNzZXJ0QXJndW1lbnQoYnYgPj0gQk5fMzUsIFwiaW52YWxpZCB2XCIsIFwidlwiLCB2KTtcbiAgICAgICAgLy8gT3RoZXJ3aXNlLCBFSVAtMTU1IHYgbWVhbnMgb2RkIGlzIDI3IGFuZCBldmVuIGlzIDI4XG4gICAgICAgIHJldHVybiAoYnYgJiBCTl8xKSA/IDI3IDogMjg7XG4gICAgfVxuICAgIC8qKlxuICAgICAqICBDcmVhdGVzIGEgbmV3IFtbU2lnbmF0dXJlXV0uXG4gICAgICpcbiAgICAgKiAgSWYgbm8gJSVzaWclJSBpcyBwcm92aWRlZCwgYSBuZXcgW1tTaWduYXR1cmVdXSBpcyBjcmVhdGVkXG4gICAgICogIHdpdGggZGVmYXVsdCB2YWx1ZXMuXG4gICAgICpcbiAgICAgKiAgSWYgJSVzaWclJSBpcyBhIHN0cmluZywgaXQgaXMgcGFyc2VkLlxuICAgICAqL1xuICAgIHN0YXRpYyBmcm9tKHNpZykge1xuICAgICAgICBmdW5jdGlvbiBhc3NlcnRFcnJvcihjaGVjaywgbWVzc2FnZSkge1xuICAgICAgICAgICAgYXNzZXJ0QXJndW1lbnQoY2hlY2ssIG1lc3NhZ2UsIFwic2lnbmF0dXJlXCIsIHNpZyk7XG4gICAgICAgIH1cbiAgICAgICAgO1xuICAgICAgICBpZiAoc2lnID09IG51bGwpIHtcbiAgICAgICAgICAgIHJldHVybiBuZXcgU2lnbmF0dXJlKF9ndWFyZCwgWmVyb0hhc2gsIFplcm9IYXNoLCAyNyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGVvZiAoc2lnKSA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgICAgICAgY29uc3QgYnl0ZXMgPSBnZXRCeXRlcyhzaWcsIFwic2lnbmF0dXJlXCIpO1xuICAgICAgICAgICAgaWYgKGJ5dGVzLmxlbmd0aCA9PT0gNjQpIHtcbiAgICAgICAgICAgICAgICBjb25zdCByID0gaGV4bGlmeShieXRlcy5zbGljZSgwLCAzMikpO1xuICAgICAgICAgICAgICAgIGNvbnN0IHMgPSBieXRlcy5zbGljZSgzMiwgNjQpO1xuICAgICAgICAgICAgICAgIGNvbnN0IHYgPSAoc1swXSAmIDB4ODApID8gMjggOiAyNztcbiAgICAgICAgICAgICAgICBzWzBdICY9IDB4N2Y7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBTaWduYXR1cmUoX2d1YXJkLCByLCBoZXhsaWZ5KHMpLCB2KTtcbiAgICAgICAgICAgI
26774H1cbiAgICAgICAgICAgIGlmIChieXRlcy5sZW5ndGggPT09IDY1KSB7XG4gICAgICAgICAgICAgICAgY29uc3QgciA9IGhleGxpZnkoYnl0ZXMuc2xpY2UoMCwgMzIpKTtcbiAgICAgICAgICAgICAgICBjb25zdCBzID0gaGV4bGlmeShieXRlcy5zbGljZSgzMiwgNjQpKTtcbiAgICAgICAgICAgICAgICBjb25zdCB2ID0gU2lnbmF0dXJlLmdldE5vcm1hbGl6ZWRWKGJ5dGVzWzY0XSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBTaWduYXR1cmUoX2d1YXJkLCByLCBzLCB2KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGFzc2VydEVycm9yKGZhbHNlLCBcImludmFsaWQgcmF3IHNpZ25hdHVyZSBsZW5ndGhcIik7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHNpZyBpbnN0YW5jZW9mIFNpZ25hdHVyZSkge1xuICAgICAgICAgICAgcmV0dXJuIHNpZy5jbG9uZSgpO1xuICAgICAgICB9XG4gICAgICAgIC8vIEdldCByXG4gICAgICAgIGNvbnN0IF9yID0gc2lnLnI7XG4gICAgICAgIGFzc2VydEVycm9yKF9yICE9IG51bGwsIFwibWlzc2luZyByXCIpO1xuICAgICAgICBjb25zdCByID0gdG9VaW50MjU2KF9yKTtcbiAgICAgICAgLy8gR2V0IHM7IGJ5IGFueSBtZWFucyBuZWNlc3NhcnkgKHdlIGNoZWNrIGNvbnNpc3RlbmN5IGJlbG93KVxuICAgICAgICBjb25zdCBzID0gKGZ1bmN0aW9uIChzLCB5UGFyaXR5QW5kUykge1xuICAgICAgICAgICAgaWYgKHMgIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIHJldHVybiB0b1VpbnQyNTYocyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoeVBhcml0eUFuZFMgIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIGFzc2VydEVycm9yKGlzSGV4U3RyaW5nKHlQYXJpdHlBbmRTLCAzMiksIFwiaW52YWxpZCB5UGFyaXR5QW5kU1wiKTtcbiAgICAgICAgICAgICAgICBjb25zdCBieXRlcyA9IGdldEJ5dGVzKHlQYXJpdHlBbmRTKTtcbiAgICAgICAgICAgICAgICBieXRlc1swXSAmPSAweDdmO1xuICAgICAgICAgICAgICAgIHJldHVybiBoZXhsaWZ5KGJ5dGVzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGFzc2VydEVycm9yKGZhbHNlLCBcIm1pc3Npbmcgc1wiKTtcbiAgICAgICAgfSkoc2lnLnMsIHNpZy55UGFyaXR5QW5kUyk7XG4gICAgICAgIC8vIEdldCB2OyBieSBhbnkgbWVhbnMgbmVjZXNzYXJ5ICh3ZSBjaGVjayBjb25zaXN0ZW5jeSBiZWxvdylcbiAgICAgICAgY29uc3QgeyBuZXR3b3JrViwgdiB9ID0gKGZ1bmN0aW9uIChfdiwgeVBhcml0eUFuZFMsIHlQYXJpdHkpIHtcbiAgICAgICAgICAgIGlmIChfdiAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgdiA9IGdldEJpZ0ludChfdik7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAgICAgbmV0d29ya1Y6ICgodiA+PSBCTl8zNSkgPyB2IDogdW5kZWZpbmVkKSxcbiAgICAgICAgICAgICAgICAgICAgdjogU2lnbmF0dXJlLmdldE5vcm1hbGl6ZWRWKHYpXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh5UGFyaXR5QW5kUyAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgYXNzZXJ0RXJyb3IoaXNIZXhTdHJpbmcoeVBhcml0eUFuZFMsIDMyKSwgXCJpbnZhbGlkIHlQYXJpdHlBbmRTXCIpO1xuICAgICAgICAgICAgICAgIHJldHVybiB7IHY6ICgoZ2V0Qnl0ZXMoeVBhcml0eUFuZFMpWzBdICYgMHg4MCkgPyAyOCA6IDI3KSB9O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHlQYXJpdHkgIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIHN3aXRjaCAoZ2V0TnVtYmVyKHlQYXJpdHksIFwic2lnLnlQYXJpdHlcIikpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAwOiByZXR1cm4geyB2OiAyNyB9O1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDE6IHJldHVybiB7IHY6IDI4IH07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGFzc2VydEVycm9yKGZhbHNlLCBcImludmFsaWQgeVBhcml0eVwiKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGFzc2VydEVycm9yKGZhbHNlLCBcIm1pc3NpbmcgdlwiKTtcbiAgICAgICAgfSkoc2lnLnYsIHNpZy55UGFyaXR5QW5kUywgc2lnLnlQYXJpdHkpO1xuICAgICAgICBjb25zdCByZXN1bHQgPSBuZXcgU2lnbmF0dXJlKF9ndWFyZCwgciwgcywgdik7XG4gICAgICAgIGlmIChuZXR3b3JrVikge1xuICAgICAgICAgICAgcmVzdWx0LiNuZXR3b3JrViA9IG5ldHdvcmtWO1xuICAgICAgICB9XG4gICAgICAgIC8vIElmIG11bHRpcGxlIG9mIHYsIHlQYXJpdHksIHlQYXJpdHlBbmRTIHdlIGdpdmVuLCBjaGVjayB0aGV5IG1hdGNoXG4gICAgICAgIGFzc2VydEVycm9yKHNpZy55UGFyaXR5ID09IG51bGwgfHwgZ2V0TnVtYmVyKHNpZy55UGFyaXR5LCBcInNpZy55UGFyaXR5XCIpID09PSByZXN1bHQueVBhcml0eSwgXCJ5UGFyaXR5IG1pc21hdGNoXCIpO1xuICAgICAgICBhc3NlcnRFcnJvcihzaWcueVBhcml0eUFuZFMgPT0gbnVsbCB8fCBzaWcueVBhcml0eUFuZFMgPT09IHJlc3VsdC55UGFyaXR5QW5kUywgXCJ5UGFyaXR5QW5kUyBtaXNtYXRjaFwiKTtcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1zaWduYXR1cmUuanMubWFwIiwiLyoqXG4gKiAgQWRkIGRldGFpbHMgYWJvdXQgc2lnbmluZyBoZXJlLlxuICpcbiAqICBAX3N1YnNlY3Rpb246IGFwaS9jcnlwdG86U2lnbmluZyAgW2Fib3V0LXNpZ25pbmddXG4gKi9cbmltcG9ydCB7IHNlY3AyNTZrMSB9IGZyb20gXCJAbm9ibGUvY3VydmVzL3NlY3AyNTZrMVwiO1xuaW1wb3J0IHsgY29uY2F0LCBkYXRhTGVuZ3RoLCBnZXRCeXRlcywgZ2V0Qnl0ZXNDb3B5LCBoZXhsaWZ5LCB0b0JlSGV4LCBhc3NlcnRBcmd1bWVudCB9IGZyb20gXCIuLi91dGlscy9pbmRleC5qc1wiO1xuaW1wb3J0IHsgU2lnbmF0dXJlIH0gZnJvbSBcIi4vc2lnbmF0dXJlLmpzXCI7XG4vKipcbiAqICBBICoqU2lnbmluZ0tleSoqIHByb3ZpZGVzIGhpZ2gtbGV2ZWwgYWNjZXNzIHRvIHRoZSBlbGxpcHRpYyBjdXJ2ZVxuICogIGNyeXB0b2dyYXBoeSAoRUNDKSBvcGVyYXRpb25zIGFuZCBrZXkgbWFuYWdlbWVudC5cbiAqL1xuZXhwb3J0IGNsYXNzIFNpZ25pbmdLZXkge1xuICAgICNwcml2YXRlS2V5O1xuICAgIC8qKlxuICAgICAqICBDcmVhdGVzIGEgbmV3ICoqU2lnbmluZ0tleSoqIGZvciAlJXByaXZhdGVLZXklJS5cbiAgICAgKi9cbiAgICBjb25zdHJ1Y3Rvcihwcml2YXRlS2V5KSB7XG4gICAgICAgIGFzc2VydEFyZ3VtZW50KGRhdGFMZW5ndGgocHJpdmF0ZUtleSkgPT09IDMyLCBcImludmFsaWQgcHJpdmF0ZSBrZXlcIiwgXCJwcml2YXRlS2V5XCIsIFwiW1JFREFDVEVEXVwiKTtcbiAgICAgICAgdGhpcy4jcHJpdmF0ZUtleSA9IGhleGxpZnkocHJpdmF0ZUtleSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqICBUaGUgcHJpdmF0ZSBrZXkuXG4gICAgICovXG4gICAgZ2V0IHByaXZhdGVLZXkoKSB7IHJldHVybi
26774B0aGlzLiNwcml2YXRlS2V5OyB9XG4gICAgLyoqXG4gICAgICogIFRoZSB1bmNvbXByZXNzZWQgcHVibGljIGtleS5cbiAgICAgKlxuICAgICAqIFRoaXMgd2lsbCBhbHdheXMgYmVnaW4gd2l0aCB0aGUgcHJlZml4IGBgMHgwNGBgIGFuZCBiZSAxMzJcbiAgICAgKiBjaGFyYWN0ZXJzIGxvbmcgKHRoZSBgYDB4YGAgcHJlZml4IGFuZCAxMzAgaGV4YWRlY2ltYWwgbmliYmxlcykuXG4gICAgICovXG4gICAgZ2V0IHB1YmxpY0tleSgpIHsgcmV0dXJuIFNpZ25pbmdLZXkuY29tcHV0ZVB1YmxpY0tleSh0aGlzLiNwcml2YXRlS2V5KTsgfVxuICAgIC8qKlxuICAgICAqICBUaGUgY29tcHJlc3NlZCBwdWJsaWMga2V5LlxuICAgICAqXG4gICAgICogIFRoaXMgd2lsbCBhbHdheXMgYmVnaW4gd2l0aCBlaXRoZXIgdGhlIHByZWZpeCBgYDB4MDJgYCBvciBgYDB4MDNgYFxuICAgICAqICBhbmQgYmUgNjggY2hhcmFjdGVycyBsb25nICh0aGUgYGAweGBgIHByZWZpeCBhbmQgMzMgaGV4YWRlY2ltYWxcbiAgICAgKiAgbmliYmxlcylcbiAgICAgKi9cbiAgICBnZXQgY29tcHJlc3NlZFB1YmxpY0tleSgpIHsgcmV0dXJuIFNpZ25pbmdLZXkuY29tcHV0ZVB1YmxpY0tleSh0aGlzLiNwcml2YXRlS2V5LCB0cnVlKTsgfVxuICAgIC8qKlxuICAgICAqICBSZXR1cm4gdGhlIHNpZ25hdHVyZSBvZiB0aGUgc2lnbmVkICUlZGlnZXN0JSUuXG4gICAgICovXG4gICAgc2lnbihkaWdlc3QpIHtcbiAgICAgICAgYXNzZXJ0QXJndW1lbnQoZGF0YUxlbmd0aChkaWdlc3QpID09PSAzMiwgXCJpbnZhbGlkIGRpZ2VzdCBsZW5ndGhcIiwgXCJkaWdlc3RcIiwgZGlnZXN0KTtcbiAgICAgICAgY29uc3Qgc2lnID0gc2VjcDI1NmsxLnNpZ24oZ2V0Qnl0ZXNDb3B5KGRpZ2VzdCksIGdldEJ5dGVzQ29weSh0aGlzLiNwcml2YXRlS2V5KSwge1xuICAgICAgICAgICAgbG93UzogdHJ1ZVxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIFNpZ25hdHVyZS5mcm9tKHtcbiAgICAgICAgICAgIHI6IHRvQmVIZXgoc2lnLnIsIDMyKSxcbiAgICAgICAgICAgIHM6IHRvQmVIZXgoc2lnLnMsIDMyKSxcbiAgICAgICAgICAgIHY6IChzaWcucmVjb3ZlcnkgPyAweDFjIDogMHgxYilcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqICBSZXR1cm5zIHRoZSBbW2xpbmstd2lraS1lY2RoXV0gc2hhcmVkIHNlY3JldCBiZXR3ZWVuIHRoaXNcbiAgICAgKiAgcHJpdmF0ZSBrZXkgYW5kIHRoZSAlJW90aGVyJSUga2V5LlxuICAgICAqXG4gICAgICogIFRoZSAlJW90aGVyJSUga2V5IG1heSBiZSBhbnkgdHlwZSBvZiBrZXksIGEgcmF3IHB1YmxpYyBrZXksXG4gICAgICogIGEgY29tcHJlc3NlZC91bmNvbXByZXNzZWQgcHViaWMga2V5IG9yIGFwcml2YXRlIGtleS5cbiAgICAgKlxuICAgICAqICBCZXN0IHByYWN0aWNlIGlzIHVzdWFsbHkgdG8gdXNlIGEgY3J5cHRvZ3JhcGh
26774pYyBoYXNoIG9uIHRoZVxuICAgICAqICByZXR1cm5lZCB2YWx1ZSBiZWZvcmUgdXNpbmcgaXQgYXMgYSBzeW1ldHJpYyBzZWNyZXQuXG4gICAgICpcbiAgICAgKiAgQGV4YW1wbGU6XG4gICAgICogICAgc2lnbjEgPSBuZXcgU2lnbmluZ0tleShpZChcInNvbWUtc2VjcmV0LTFcIikpXG4gICAgICogICAgc2lnbjIgPSBuZXcgU2lnbmluZ0tleShpZChcInNvbWUtc2VjcmV0LTJcIikpXG4gICAgICpcbiAgICAgKiAgICAvLyBOb3RpY2UgdGhhdCBwcml2QS5jb21wdXRlU2hhcmVkU2VjcmV0KHB1YkIpLi4uXG4gICAgICogICAgc2lnbjEuY29tcHV0ZVNoYXJlZFNlY3JldChzaWduMi5wdWJsaWNLZXkpXG4gICAgICogICAgLy9fcmVzdWx0OlxuICAgICAqXG4gICAgICogICAgLy8gLi4uaXMgZXF1YWwgdG8gcHJpdkIuY29tcHV0ZVNoYXJlZFNlY3JldChwdWJBKS5cbiAgICAgKiAgICBzaWduMi5jb21wdXRlU2hhcmVkU2VjcmV0KHNpZ24xLnB1YmxpY0tleSlcbiAgICAgKiAgICAvL19yZXN1bHQ6XG4gICAgICovXG4gICAgY29tcHV0ZVNoYXJlZFNlY3JldChvdGhlcikge1xuICAgICAgICBjb25zdCBwdWJLZXkgPSBTaWduaW5nS2V5LmNvbXB1dGVQdWJsaWNLZXkob3RoZXIpO1xuICAgICAgICByZXR1cm4gaGV4bGlmeShzZWNwMjU2azEuZ2V0U2hhcmVkU2VjcmV0KGdldEJ5dGVzQ29weSh0aGlzLiNwcml2YXRlS2V5KSwgZ2V0Qnl0ZXMocHViS2V5KSwgZmFsc2UpKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogIENvbXB1dGUgdGhlIHB1YmxpYyBrZXkgZm9yICUla2V5JSUsIG9wdGlvbmFsbHkgJSVjb21wcmVzc2VkJSUuXG4gICAgICpcbiAgICAgKiAgVGhlICUla2V5JSUgbWF5IGJlIGFueSB0eXBlIG9mIGtleSwgYSByYXcgcHVibGljIGtleSwgYVxuICAgICAqICBjb21wcmVzc2VkL3VuY29tcHJlc3NlZCBwdWJsaWMga2V5IG9yIHByaXZhdGUga2V5LlxuICAgICAqXG4gICAgICogIEBleGFtcGxlOlxuICAgICAqICAgIHNpZ24gPSBuZXcgU2lnbmluZ0tleShpZChcInNvbWUtc2VjcmV0XCIpKTtcbiAgICAgKlxuICAgICAqICAgIC8vIENvbXB1dGUgdGhlIHVuY29tcHJlc3NlZCBwdWJsaWMga2V5IGZvciBhIHByaXZhdGUga2V5XG4gICAgICogICAgU2lnbmluZ0tleS5jb21wdXRlUHVibGljS2V5KHNpZ24ucHJpdmF0ZUtleSlcbiAgICAgKiAgICAvL19yZXN1bHQ6XG4gICAgICpcbiAgICAgKiAgICAvLyBDb21wdXRlIHRoZSBjb21wcmVzc2VkIHB1YmxpYyBrZXkgZm9yIGEgcHJpdmF0ZSBrZXlcbiAgICAgKiAgICBTaWduaW5nS2V5LmNvbXB1dGVQdWJsaWNLZXkoc2lnbi5wcml2YXRlS2V5LCB0cnVlKVxuICAgICAqICAgIC8vX3Jlc3VsdDpcbiAgICAgKlxuICAgICAqICAgIC8vIENvbXB1dGUgdGhlIHVuY29tcHJlc3NlZCBwdWJsaWMga2V5XG4gICAgICogICAgU2lnbmluZ0tleS5jb21wdXRlUHVibGljS2V5KHNpZ24ucHVibGljS2V5LCBmYWxzZSk7XG4gICAgICogICAgLy9fcmVzdWx0OlxuICAgICAqXG4gICAgICogICAgLy8gQ29tcHV0ZSB0aGUgQ29tcHJlc3NlZCBhIHB1YmxpYyBrZXlcbiAgICAgKiAgICBTaWduaW5nS2V5LmNvbXB1dGVQdWJsaWNLZXkoc2lnbi5wdWJsaWNLZXksIHRydWUpO1xuICAgICAqICAgIC8vX3Jlc3VsdDpcbiAgICAgKi9cbiAgICBzdGF0aWMgY29tcHV0ZVB1YmxpY0tleShrZXksIGNvbXByZXNzZWQpIHtcbiAgICAgICAgbGV0IGJ5dGVzID0gZ2V0Qnl0ZXMoa2V5LCBcImtleVwiKTtcbiAgICAgICAgLy8gcHJpdmF0ZSBrZXlcbiAgICAgICAgaWYgKGJ5dGVzLmxlbmd0aCA9PT0gMzIpIHtcbiAgICAgICAgICAgIGNvbnN0IHB1YktleSA9IHNlY3AyNTZrMS5nZXRQdWJsaWNLZXkoYnl0ZXMsICEhY29tcHJlc3NlZCk7XG4gICAgICAgICAgICByZXR1cm4gaGV4bGlmeShwdWJLZXkpO1xuICAgICAgICB9XG4gICAgICAgIC8vIHJhdyBwdWJsaWMga2V5OyB1c2UgdW5jb21wcmVzc2VkIGtleSB3aXRoIDB4MDQgcHJlZml4XG4gICAgICAgIGlmIChieXRlcy5sZW5ndGggPT09IDY0KSB7XG4gICAgICAgICAgICBjb25zdCBwdWIgPSBuZXcgVWludDhBcnJheSg2NSk7XG4gICAgICAgICAgICBwdWJbMF0gPSAweDA0O1xuICAgICAgICAgICAgcHViLnNldChieXRlcywgMSk7XG4gICAgICAgICAgICBieXRlcyA9IHB1YjtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBwb2ludCA9IHNlY3AyNTZrMS5Qcm9qZWN0aXZlUG9pbnQuZnJvbUhleChieXRlcyk7XG4gICAgICAgIHJldHVybiBoZXhsaWZ5KHBvaW50LnRvUmF3Qnl0ZXMoY29tcHJlc3NlZCkpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiAgUmV0dXJucyB0aGUgcHVibGljIGtleSBmb3IgdGhlIHByaXZhdGUga2V5IHdoaWNoIHByb2R1Y2VkIHRoZVxuICAgICAqICAlJXNpZ25hdHVyZSUlIGZvciB0aGUgZ2l2ZW4gJSVkaWdlc3QlJS5cbiAgICAgKlxuICAgICAqICBAZXhhbXBsZTpcbiAgICAgKiAgICBrZXkgPSBuZXcgU2lnbmluZ0tleShpZChcInNvbWUtc2VjcmV0XCIpKVxuICAgICAqICAgIGRpZ2VzdCA9IGlkKFwiaGVsbG8gd29ybGRcIilcbiAgICAgKiAgICBzaWcgPSBrZXkuc2lnbihkaWdlc3QpXG4gICAgICpcbiAgICAgKiAgICAvLyBOb3RpY2UgdGhlIHNpZ25lciBwdWJsaWMga2V5Li4uXG4gICAgICogICAga2V5LnB1YmxpY0tleVxuICAgICAqICAgIC8vX3Jlc3VsdDpcbiAgICAgKlxuICAgICAqICAgIC8vIC4uLmlzIGVxdWFsIHRvIHRoZSByZWNvdmVyZWQgcHVibGljIGtleVxuICAgICAqICAgIFNpZ25pbmdLZXkucmVjb3ZlclB1YmxpY0tleShkaWdlc3QsIHNpZylcbiAgICAgKiAgICAvL19yZXN1bHQ6XG4gICAgICpcbiAgICAgKi9cbiAgICBzdGF0aWMgcmVjb3ZlclB1YmxpY0tleShkaWdlc3QsIHNpZ25hdHVyZSkge1xuICAgICAgICBhc3NlcnRBcmd1bWVudChkYXRhTGVuZ3RoKGRpZ2VzdCkgPT09IDMyLCBcImludmFsaWQgZGlnZXN0IGxlbmd0aFwiLCBcImRpZ2VzdFwiLCBkaWdlc3QpO1xuICAgICAgICBjb25zdCBzaWcgPSBTaWduYXR1cmUuZnJvbShzaWduYXR1cmUpO1xuICAgICAgICBsZXQgc2VjcFNpZyA9IHNlY3AyNTZrMS5TaWduYXR1cmUuZnJvbUNvbXBhY3QoZ2V0Qnl0ZXNDb3B5KGNvbmNhdChbc2lnLnIsIHNpZy5zXSkpKTtcbiAgICAgICAgc2VjcFNpZyA9IHNlY3BTaWcuYWRkUmVjb3ZlcnlCaXQoc2lnLnlQYXJpdHkpO1xuICAgICAgICBjb25zdCBwdWJLZXkgPSBzZWNwU2lnLnJlY292ZXJQdWJsaWNLZXkoZ2V0Qnl0ZXNDb3B5KGRpZ2VzdCkpO1xuICAgICAgICBhc3NlcnRBcmd1bWVudChwdWJLZXkgIT0gbnVsbCwgXCJpbnZhbGlkIHNpZ25hdHVyZSBmb3IgZGlnZXN0XCIsIFwic2lnbmF0dXJlXCIsIHNpZ25hdHVyZSk7XG4gICAgICAgI
26774HJldHVybiBcIjB4XCIgKyBwdWJLZXkudG9IZXgoZmFsc2UpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiAgUmV0dXJucyB0aGUgcG9pbnQgcmVzdWx0aW5nIGZyb20gYWRkaW5nIHRoZSBlbGxpcGljIGN1cnZlIHBvaW50c1xuICAgICAqICAlJXAwJSUgYW5kICUlcDElJS5cbiAgICAgKlxuICAgICAqICBUaGlzIGlzIG5vdCBhIGNvbW1vbiBmdW5jdGlvbiBtb3N0IGRldmVsb3BlcnMgc2hvdWxkIHJlcXVpcmUsIGJ1dFxuICAgICAqICBjYW4gYmUgdXNlZnVsIGZvciBjZXJ0YWluIHByaXZhY3ktc3BlY2lmaWMgdGVjaG5pcXVlcy5cbiAgICAgKlxuICAgICAqICBGb3IgZXhhbXBsZSwgaXQgaXMgdXNlZCBieSBbW0hETm9kZVdhbGxldF1dIHRvIGNvbXB1dGUgY2hpbGRcbiAgICAgKiAgYWRkcmVzc2VzIGZyb20gcGFyZW50IHB1YmxpYyBrZXlzIGFuZCBjaGFpbiBjb2Rlcy5cbiAgICAgKi9cbiAgICBzdGF0aWMgYWRkUG9pbnRzKHAwLCBwMSwgY29tcHJlc3NlZCkge1xuICAgICAgICBjb25zdCBwdWIwID0gc2VjcDI1NmsxLlByb2plY3RpdmVQb2ludC5mcm9tSGV4KFNpZ25pbmdLZXkuY29tcHV0ZVB1YmxpY0tleShwMCkuc3Vic3RyaW5nKDIpKTtcbiAgICAgICAgY29uc3QgcHViMSA9IHNlY3AyNTZrMS5Qcm9qZWN0aXZlUG9pbnQuZnJvbUhleChTaWduaW5nS2V5LmNvbXB1dGVQdWJsaWNLZXkocDEpLnN1YnN0cmluZygyKSk7XG4gICAgICAgIHJldHVybiBcIjB4XCIgKyBwdWIwLmFkZChwdWIxKS50b0hleCghIWNvbXByZXNzZWQpO1xuICAgIH1cbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXNpZ25pbmcta2V5LmpzLm1hcCIsIi8qKlxuICogIEEgZnVuZGFtZW50YWwgYnVpbGRpbmcgYmxvY2sgb2YgRXRoZXJldW0gaXMgdGhlIHVuZGVybHlpbmdcbiAqICBjcnlwdG9ncmFwaGljIHByaW1pdGl2ZXMuXG4gKlxuICogIEBfc2VjdGlvbjogYXBpL2NyeXB0bzpDcnlwdG9ncmFwaGljIEZ1bmN0aW9ucyAgIFthYm91dC1jcnlwdG9dXG4gKi9cbm51bGw7XG4vLyBXZSBpbXBvcnQgYWxsIHRoZXNlIHNvIHdlIGNhbiBleHBvcnQgbG9jaygpXG5pbXBvcnQgeyBjb21wdXRlSG1hYyB9IGZyb20gXCIuL2htYWMuanNcIjtcbmltcG9ydCB7IGtlY2NhazI1NiB9IGZyb20gXCIuL2tlY2Nhay5qc1wiO1xuaW1wb3J0IHsgcmlwZW1kMTYwIH0gZnJvbSBcIi4vcmlwZW1kMTYwLmpzXCI7XG5pbXBvcnQgeyBwYmtkZjIgfSBmcm9tIFwiLi9wYmtkZjIuanNcIjtcbmltcG9ydCB7IHJhbmRvbUJ5dGVzIH0gZnJvbSBcIi4vcmFuZG9tLmpzXCI7XG5pbXBvcnQgeyBzY3J5cHQsIHNjcnlwdFN5bmMgfSBmcm9tIFwiLi9zY3J5cHQuanNcIjtcbmltcG9ydCB7IHNoYTI1Niwgc2hhNTEyIH0gZnJvbSBcIi4vc2hhMi5qc1wiO1xuZXhwb3J0IHsgY29tcHV0ZUhtYWMsIHJhbmRvbUJ5dGVzLCBrZWNjYWsyNTYsIHJpcGVtZDE2MCwgc2hhMjU2LCBzaGE1MTIsIHBia2RmMiwgc2NyeXB0LCBzY3J5cHRTeW5jIH07XG5leHBvcnQgeyBTaWduaW5nS2V5IH0gZnJvbSBcIi4vc2lnbmluZy1rZXkuanNcIjtcbmV4cG9ydCB7IFNpZ25hdHVyZSB9IGZyb20gXCIuL3NpZ25hdHVyZS5qc1wiO1xuLyoqXG4gKiAgT25jZSBjYWxsZWQsIHByZXZlbnRzIGFueSBmdXR1cmUgY2hhbmdlIHRvIHRoZSB1bmRlcmx5aW5nIGNyeXB0b2dyYXBoaWNcbiAqICBwcmltaXRpdmVzIHVzaW5nIHRoZSBgYC5yZWdpc3RlcmBgIGZlYXR1cmUgZm9yIGhvb2tzLlxuICovXG5mdW5jdGlvbiBsb2NrKCkge1xuICAgIGNvbXB1dGVIbWFjLmxvY2soKTtcbiAgICBrZWNjYWsyNTYubG9jaygpO1xuICAgIHBia2RmMi5sb2NrKCk7XG4gICAgcmFuZG9tQnl0ZXMubG9jaygpO1xuICAgIHJpcGVtZDE2MC5sb2NrKCk7XG4gICAgc2NyeXB0LmxvY2soKTtcbiAgICBzY3J5cHRTeW5jLmxvY2soKTtcbiAgICBzaGEyNTYubG9jaygpO1xuICAgIHNoYTUxMi5sb2NrKCk7XG4gICAgcmFuZG9tQnl0ZXMubG9jaygpO1xufVxuZXhwb3J0IHsgbG9jayB9O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9aW5kZXguanMubWFwIiwiaW1wb3J0IHsga2VjY2FrMjU2IH0gZnJvbSBcIi4uL2NyeXB0by9pbmRleC5qc1wiO1xuaW1wb3J0IHsgZ2V0Qnl0ZXMsIGFzc2VydEFyZ3VtZW50IH0gZnJvbSBcIi4uL3V0aWxzL2luZGV4LmpzXCI7XG5jb25zdCBCTl8wID0gQmlnSW50KDApO1xuY29uc3QgQk5fMzYgPSBCaWdJbnQoMzYpO1xuZnVuY3Rpb24gZ2V0Q2hlY2tzdW1BZGRyZXNzKGFkZHJlc3MpIHtcbiAgICAvLyAgICBpZiAoIWlzSGV4U3RyaW5nKGFkZHJlc3MsIDIwKSkge1xuICAgIC8vICAgICAgICBsb2dnZXIudGhyb3dBcmd1bWVudEVycm9yKFwiaW52YWxpZCBhZGRyZXNzXCIsIFwiYWRkcmVzc1wiLCBhZGRyZXNzKTtcbiAgICAvLyAgICB9XG4gICAgYWRkcmVzcyA9IGFkZHJlc3MudG9Mb3dlckNhc2UoKTtcbiAgICBjb25zdCBjaGFycyA9IGFkZHJlc3Muc3Vic3RyaW5nKDIpLnNwbGl0KFwiXCIpO1xuICAgIGNvbnN0IGV4cGFuZGVkID0gbmV3IFVpbnQ4QXJyYXkoNDApO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgNDA7IGkrKykge1xuICAgICAgICBleHBhbmRlZFtpXSA9IGNoYXJzW2ldLmNoYXJDb2RlQXQoMCk7XG4gICAgfVxuICAgIGNvbnN0IGhhc2hlZCA9IGdldEJ5dGVzKGtlY2NhazI1NihleHBhbmRlZCkpO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgNDA7IGkgKz0gMikge1xuICAgICAgICBpZiAoKGhhc2hlZFtpID4+IDFdID4+IDQpID49IDgpIHtcbiAgICAgICAgICAgIGNoYXJzW2ldID0gY2hhcnNbaV0udG9VcHBlckNhc2UoKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoKGhhc2hlZFtpID4+IDFdICYgMHgwZikgPj0gOCkge1xuICAgICAgICAgICAgY2hhcnNbaSArIDFdID0gY2hhcnNbaSArIDFdLnRvVXBwZXJDYXNlKCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIFwiMHhcIiArIGNoYXJzLmpvaW4oXCJcIik7XG59XG4vLyBTZWU6IGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0ludGVybmF0aW9uYWxfQmFua19BY2NvdW50X051bWJlclxuLy8gQ3JlYXRlIGxvb2t1cCB0YWJsZVxuY29uc3QgaWJhbkxvb2t1cCA9IHt9O1xuZm9yIChsZXQgaSA9IDA7IGkgPCAxMDsgaSsrKSB7XG4gICAgaWJhbkxvb2t1cFtTdHJpbmc
26774oaSldID0gU3RyaW5nKGkpO1xufVxuZm9yIChsZXQgaSA9IDA7IGkgPCAyNjsgaSsrKSB7XG4gICAgaWJhbkxvb2t1cFtTdHJpbmcuZnJvbUNoYXJDb2RlKDY1ICsgaSldID0gU3RyaW5nKDEwICsgaSk7XG59XG4vLyBIb3cgbWFueSBkZWNpbWFsIGRpZ2l0cyBjYW4gd2UgcHJvY2Vzcz8gKGZvciA2NC1iaXQgZmxvYXQsIHRoaXMgaXMgMTUpXG4vLyBpLmUuIE1hdGguZmxvb3IoTWF0aC5sb2cxMChOdW1iZXIuTUFYX1NBRkVfSU5URUdFUikpO1xuY29uc3Qgc2FmZURpZ2l0cyA9IDE1O1xuZnVuY3Rpb24gaWJhbkNoZWNrc3VtKGFkZHJlc3MpIHtcbiAgICBhZGRyZXNzID0gYWRkcmVzcy50b1VwcGVyQ2FzZSgpO1xuICAgIGFkZHJlc3MgPSBhZGRyZXNzLnN1YnN0cmluZyg0KSArIGFkZHJlc3Muc3Vic3RyaW5nKDAsIDIpICsgXCIwMFwiO1xuICAgIGxldCBleHBhbmRlZCA9IGFkZHJlc3Muc3BsaXQoXCJcIikubWFwKChjKSA9PiB7IHJldHVybiBpYmFuTG9va3VwW2NdOyB9KS5qb2luKFwiXCIpO1xuICAgIC8vIEphdmFzY3JpcHQgY2FuIGhhbmRsZSBpbnRlZ2VycyBzYWZlbHkgdXAgdG8gMTUgKGRlY2ltYWwpIGRpZ2l0c1xuICAgIHdoaWxlIChleHBhbmRlZC5sZW5ndGggPj0gc2FmZURpZ2l0cykge1xuICAgICAgICBsZXQgYmxvY2sgPSBleHBhbmRlZC5zdWJzdHJpbmcoMCwgc2FmZURpZ2l0cyk7XG4gICAgICAgIGV4cGFuZGVkID0gcGFyc2VJbnQoYmxvY2ssIDEwKSAlIDk3ICsgZXhwYW5kZWQuc3Vic3RyaW5nKGJsb2NrLmxlbmd0aCk7XG4gICAgfVxuICAgIGxldCBjaGVja3N1bSA9IFN0cmluZyg5OCAtIChwYXJzZUludChleHBhbmRlZCwgMTApICUgOTcpKTtcbiAgICB3aGlsZSAoY2hlY2tzdW0ubGVuZ3RoIDwgMikge1xuICAgICAgICBjaGVja3N1bSA9IFwiMFwiICsgY2hlY2tzdW07XG4gICAgfVxuICAgIHJldHVybiBjaGVja3N1bTtcbn1cbjtcbmNvbnN0IEJhc2UzNiA9IChmdW5jdGlvbiAoKSB7XG4gICAgO1xuICAgIGNvbnN0IHJlc3VsdCA9IHt9O1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgMzY7IGkrKykge1xuICAgICAgICBjb25zdCBrZXkgPSBcIjAxMjM0NTY3ODlhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5elwiW2ldO1xuICAgICAgICByZXN1bHRba2V5XSA9IEJpZ0ludChpKTtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbn0pKCk7XG5mdW5jdGlvbiBmcm9tQmFzZTM2KHZhbHVlKSB7XG4gICAgdmFsdWUgPSB2YWx1ZS50b0xvd2VyQ2FzZSgpO1xuICAgIGxldCByZXN1bHQgPSBCTl8wO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdmFsdWUubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgcmVzdWx0ID0gcmVzdWx0ICogQk5fMzYgKyBCYXNlMzZbdmFsdWVbaV1dO1xuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xufVxuLyoqXG4gKiAgUmV0dXJucyBhIG5vcm1hbGl6ZWQgYW5kIGNoZWNrc3VtZWQgYWRkcmVzcyBmb3IgJSVhZGRyZXNzJSUuXG4gKiAgVGhpcyBhY2NlcHRzIG5vbi1jaGVja3N1bSBhZGRyZXNzZXMsIGNoZWNrc3VtIGFkZHJlc3NlcyBhbmRcbiAqICBbW2dldEljYXBBZGRyZXNzXV0gZm9ybWF0cy5cbiAqXG4gKiAgVGhlIGNoZWNrc3VtIGluIEV0aGVyZXVtIHVzZXMgdGhlIGNhcGl0YWxpemF0aW9uICh1cHBlci1jYXNlXG4gKiAgdnMgbG93ZXItY2FzZSkgb2YgdGhlIGNoYXJhY3RlcnMgd2l0aGluIGFuIGFkZHJlc3MgdG8gZW5jb2RlXG4gKiAgaXRzIGNoZWNrc3VtLCB3aGljaCBvZmZlcnMsIG9uIGF2ZXJhZ2UsIGEgY2hlY2tzdW0gb2YgMTUtYml0cy5cbiAqXG4gKiAgSWYgJSVhZGRyZXNzJSUgY29udGFpbnMgYm90aCB1cHBlci1jYXNlIGFuZCBsb3dlci1jYXNlLCBpdCBpc1xuICogIGFzc3VtZWQgdG8gYWxyZWFkeSBiZSBhIGNoZWNrc3VtIGFkZHJlc3MgYW5kIGl0cyBjaGVja3N1bSBpc1xuICogIHZhbGlkYXRlZCwgYW5kIGlmIHRoZSBhZGRyZXNzIGZhaWxzIGl0cyBleHBlY3RlZCBjaGVja3N1bSBhblxuICogIGVycm9yIGlzIHRocm93bi5cbiAqXG4gKiAgSWYgeW91IHdpc2ggdGhlIGNoZWNrc3VtIG9mICUlYWRkcmVzcyUlIHRvIGJlIGlnbm9yZSwgaXQgc2hvdWxkXG4gKiAgYmUgY29udmVydGVkIHRvIGxvd2VyLWNhc2UgKGkuZS4gYGAudG9Mb3dlcmNhc2UoKWBgKSBiZWZvcmVcbiAqICBiZWluZyBwYXNzZWQgaW4uIFRoaXMgc2hvdWxkIGJlIGEgdmVyeSByYXJlIHNpdHVhdGlvbiB0aG91Z2gsXG4gKiAgdGhhdCB5b3Ugd2lzaCB0byBieXBhc3MgdGhlIHNhZmVnYXVyZHMgaW4gcGxhY2UgdG8gcHJvdGVjdFxuICogIGFnYWluc3QgYW4gYWRkcmVzcyB0aGF0IGhhcyBiZWVuIGluY29ycmVjdGx5IGNvcGllZCBmcm9tIGFub3RoZXJcbiAqICBzb3VyY2UuXG4gKlxuICogIEBleGFtcGxlOlxuICogICAgLy8gQWRkcyB0aGUgY2hlY2tzdW0gKHZpYSB1cHBlci1jYXNpbmcgc3BlY2lmaWMgbGV0dGVycylcbiAqICAgIGdldEFkZHJl
26774c3MoXCIweDhiYTFmMTA5NTUxYmQ0MzI4MDMwMTI2NDVhYzEzNmRkZDY0ZGJhNzJcIilcbiAqICAgIC8vX3Jlc3VsdDpcbiAqXG4gKiAgICAvLyBDb252ZXJ0cyBJQ0FQIGFkZHJlc3MgYW5kIGFkZHMgY2hlY2tzdW1cbiAqICAgIGdldEFkZHJlc3MoXCJYRTY1R0I2TEROWFlPRlRYME5TVjNGVVdLT1dJWEFNSkszNlwiKTtcbiAqICAgIC8vX3Jlc3VsdDpcbiAqXG4gKiAgICAvLyBUaHJvd3MgYW4gZXJyb3IgaWYgYW4gYWRkcmVzcyBjb250YWlucyBtaXhlZCBjYXNlLFxuICogICAgLy8gYnV0IHRoZSBjaGVja3N1bSBmYWlsc1xuICogICAgZ2V0QWRkcmVzcyhcIjB4OEJhMWYxMDk1NTFiRDQzMjgwMzAxMjY0NUFjMTM2ZGRkNjREQkE3MlwiKVxuICogICAgLy9fZXJyb3I6XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRBZGRyZXNzKGFkZHJlc3MpIHtcbiAgICBhc3NlcnRBcmd1bWVudCh0eXBlb2YgKGFkZHJlc3MpID09PSBcInN0cmluZ1wiLCBcImludmFsaWQgYWRkcmVzc1wiLCBcImFkZHJlc3NcIiwgYWRkcmVzcyk7XG4gICAgaWYgKGFkZHJlc3MubWF0Y2goL14oMHgpP1swLTlhLWZBLUZdezQwfSQvKSkge1xuICAgICAgICAvLyBNaXNzaW5nIHRoZSAweCBwcmVmaXhcbiAgICAgICAgaWYgKCFhZGRyZXNzLnN0YXJ0c1dpdGgoXCIweFwiKSkge1xuICAgICAgICAgICAgYWRkcmVzcyA9IFwiMHhcIiArIGFkZHJlc3M7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgcmVzdWx0ID0gZ2V0Q2hlY2tzdW1BZGRyZXNzKGFkZHJlc3MpO1xuICAgICAgICAvLyBJdCBpcyBhIGNoZWNrc3VtbWVkIGFkZHJlc3Mgd2l0aCBhIGJhZCBjaGVja3N1bVxuICAgICAgICBhc3NlcnRBcmd1bWVudCghYWRkcmVzcy5tYXRjaCgvKFtBLUZdLipbYS1mXSl8KFthLWZdLipbQS1GXSkvKSB8fCByZXN1bHQgPT09IGFkZHJlc3MsIFwiYmFkIGFkZHJlc3MgY2hlY2tzdW1cIiwgXCJhZGRyZXNzXCIsIGFkZHJlc3MpO1xuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbiAgICAvLyBNYXliZSBJQ0FQPyAod2Ugb25seSBzdXBwb3J0IGRpcmVjdCBtb2RlKVxuICAgIGlmIChhZGRyZXNzLm1hdGNoKC9eWEVbMC05XXsyfVswLTlBLVphLXpdezMwLDMxfSQvKSkge1xuICAgICAgICAvLyBJdCBpcyBhbiBJQ0FQIGFkZHJlc3Mgd2l0aCBhIGJhZCBjaGVja3N1bVxuICAgICAgICBhc3NlcnRBcmd1bWVudChhZGRyZXNzLnN1YnN0cmluZygyLCA0KSA9PT0gaWJhbkNoZWNrc3VtKGFkZHJlc3MpLCBcImJhZCBpY2FwIGNoZWNrc3VtXCIsIFwiYWRkcmVzc1wiLCBhZGRyZXNzKTtcbiAgICAgICAgbGV0IHJlc3VsdCA9IGZyb21CYXNlMzYoYWRkcmVzcy5zdWJzdHJpbmcoNCkpLnRvU3RyaW5nKDE2KTtcbiAgICAgICAgd2hpbGUgKHJlc3VsdC5sZW5ndGggPCA0MCkge1xuICAgICAgICAgICAgcmVzdWx0ID0gXCIwXCIgKyByZXN1bHQ7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGdldENoZWNrc3VtQWRkcmVzcyhcIjB4XCIgKyByZXN1bHQpO1xuICAgIH1cbiAgICBhc3NlcnRBcmd1bWVudChmYWxzZSwgXCJpbnZhbGlkIGFkZHJlc3NcIiwgXCJhZGRyZXNzXCIsIGFkZHJlc3MpO1xufVxuLyoqXG4gKiAgVGhlIFtJQ0FQIEFkZHJlc3MgZm9ybWF0XShsaW5rLWljYXApIGZvcm1hdCBpcyBhbiBlYXJseSBjaGVja3N1bVxuICogIGZvcm1hdCB3aGljaCBhdHRlbXB0cyB0byBiZSBjb21wYXRpYmxlIHdpdGggdGhlIGJhbmtpbmdcbiAqICBpbmR1c3RyeSBbSUJBTiBmb3JtYXRdKGxpbmstd2lraS1pYmFuKSBmb3IgYmFuayBhY2NvdW50cy5cbiAqXG4gKiAgSXQgaXMgbm8gbG9uZ2VyIGNvbW1vbiBvciBhIHJlY29tbWVuZGVkIGZvcm1hdC5cbiAqXG4gKiAgQGV4YW1wbGU6XG4gKiAgICBnZXRJY2FwQWRkcmVzcyhcIjB4OGJhMWYxMDk1NTFiZDQzMjgwMzAxMjY0NWFjMTM2ZGRkNjRkYmE3MlwiKTtcbiAqICAgIC8vX3Jlc3VsdDpcbiAqXG4gKiAgICBnZXRJY2FwQWRkcmVzcyhcIlhFNjVHQjZMRE5YWU9GVFgwTlNWM0ZVV0tPV0lYQU1KSzM2XCIpO1xuICogICAgLy9fcmVzdWx0OlxuICpcbiAqICAgIC8vIFRocm93cyBhbiBlcnJvciBpZiB0aGUgSUNBUCBjaGVja3N1bSBpcyB3cm9uZ1xuICogICAgZ2V0SWNhcEFkZHJlc3MoXCJYRTY1R0I2TEROWFlPRlRYME5TVjNGVVdLT1dJWEFNSkszN1wiKTtcbiAqICAgIC8vX2Vycm9yOlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0SWNhcEFkZHJlc3MoYWRkcmVzcykge1xuICAgIC8vbGV0IGJhc2UzNiA9IF9iYXNlMTZUbzM2KGdldEFkZHJlc3MoYWRkcmVzcykuc3Vic3RyaW5nKDIpKS50b1VwcGVyQ2FzZSgpO1xuICAgIGxldCBiYXNlMzYgPSBCaWdJbnQoZ2V0QWRkcmVzcyhhZGRyZXNzKSkudG9TdHJpbmcoMzYpLnRvVXBwZXJDYXNlKCk7XG4gICAgd2hpbGUgKGJhc2UzNi5sZW5ndGggPCAzMCkge1xuICAgICAgICBiYXNlMzYgPSBcIjBcIiArIGJhc2UzNjtcbiAgICB9XG4gICAgcmV0dXJuIFwiWEVcIiArIGliYW5DaGVja3N1bShcIlhFMDBcIiArIGJhc2UzNikgKyBiYXNlMzY7XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1hZGRyZXNzLmpzLm1hcCIsImltcG9ydCB7IGtlY2NhazI1NiB9IGZyb20gXCIuLi9jcnlwdG8vaW5kZXguanNcIjtcbmltcG9ydCB7IGNvbmNhdCwgZGF0YVNsaWNlLCBnZXRCaWdJbnQsIGdldEJ5dGVzLCBlbmNvZGVSbHAsIGFzc2VydEFyZ3VtZW50IH0gZnJvbSBcIi4uL3V0aWxzL2luZGV4LmpzXCI7XG5pbXBvcnQgeyBnZXRBZGRyZXNzIH0gZnJvbSBcIi4vYWRkcmVzcy5qc1wiO1xuLy8gaHR0cDovL2V0aGVyZXVtLnN0YWNrZXhjaGFuZ2UuY29tL3F1ZXN0aW9ucy83NjAvaG93LWlzLXRoZS1hZGRyZXNzLW9mLWFuLWV0aGVyZXVtLWNvbnRyYWN0LWNvbXB1dGVkXG4vKipcbiAqICBSZXR1cm5zIHRoZSBhZGRyZXNzIHRoYXQgd291bGQgcmVzdWx0IGZyb20gYSBgYENSRUFURWBgIGZvciAlJXR4JSUuXG4gKlxuICogIFRoaXMgY2FuIGJlIHVzZWQgdG8gY29tcHV0ZSB0aGUgYWRkcmVzcyBhIGNvbnRyYWN0IHdpbGwgYmVcbiAqICBkZXBsb3llZCB0byBieSBhbiBFT0Egd2hlbiBzZW5kaW5nIGEgZGVwbG95bWVudCB0cmFuc2FjdGlvbiAoaS5lLlxuICogIHdoZW4gdGhlIGBgdG9gYCBhZGRyZXNzIGlzIGBgbnVsbGBgKS5cbiAqXG4gKiAgVGhpcyBjYW4gYWxzbyBiZSB1c2VkIHRvIGNvbXB1dGUgdGhlIGFkZHJlc3MgYSBjb250cmFjdCB3aWxsIGJlXG4gKiAgZGVwbG95ZWQgdG8gYnkgYSBjb250cmFjdCwgYnkgdXNpbmcgdGhlIGNvbnRyYWN0J3MgYWRkcmVzcyBhcyB0aGVcbiAqICBgYHRvYGAgYW5kIHRoZSBjb250cmFjdCdzIG5vbmNlLlxuICpcbiAqICBAZXhhbXBsZVxuICogICAgZnJvbSA9IFwiMHg4YmExZjEwOTU1MWJENDMyODAzMDEyNjQ1QWMxMzZkZGQ2NERCQTcyXCI7XG4gKiAgICBub25jZSA9IDU7XG4gKlxuICogICAgZ2V0Q3JlYXRlQWRkcmVzcyh7IGZyb20sIG5vbmNlIH0pO1xuICogICAgLy9fcmVzdWx0OlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0Q3JlYXRlQWRkcmVzcyh0eCkge1xuICAgIGNvbnN0IGZyb20gPSBnZXRBZGRyZXNzKHR4LmZyb20pO1xuICAgIGNvbnN0IG5vbmNlID0gZ2V0QmlnSW50KHR4Lm5vbmNlLCBcInR4Lm5vbmNlXCIpO1xuICAgIGxldCBub25jZUhleCA9IG5vbmNlLnRvU3RyaW5nKDE2KTtcbiAgICBpZiAobm9uY2VIZXggPT09IFwiMFwiKSB7XG4gICAgICAgIG5vbmNlSGV4ID0gXCIweFwiO1xuICAgIH1cbiAgICBlbHNlIGlmIChub25jZUhleC5sZW5ndGggJSAyKSB7XG4gICAgICAgIG5vbmNlSGV4ID0gXCIweDBcIiArIG5vbmNlSGV4O1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgbm9uY2VIZXggPSBcIjB4XCIgKyBub25jZUhleDtcbiAgICB9XG4gICAgcmV0dXJuIGdldEFkZHJl
26774c3MoZGF0YVNsaWNlKGtlY2NhazI1NihlbmNvZGVSbHAoW2Zyb20sIG5vbmNlSGV4XSkpLCAxMikpO1xufVxuLyoqXG4gKiAgUmV0dXJucyB0aGUgYWRkcmVzcyB0aGF0IHdvdWxkIHJlc3VsdCBmcm9tIGEgYGBDUkVBVEUyYGAgb3BlcmF0aW9uXG4gKiAgd2l0aCB0aGUgZ2l2ZW4gJSVmcm9tJSUsICUlc2FsdCUlIGFuZCAlJWluaXRDb2RlSGFzaCUlLlxuICpcbiAqICBUbyBjb21wdXRlIHRoZSAlJWluaXRDb2RlSGFzaCUlIGZyb20gYSBjb250cmFjdCdzIGluaXQgY29kZSwgdXNlXG4gKiAgdGhlIFtba2VjY2FrMjU2XV0gZnVuY3Rpb24uXG4gKlxuICogIEZvciBhIHF1aWNrIG92ZXJ2aWV3IGFuZCBleGFtcGxlIG9mIGBgQ1JFQVRFMmBgLCBzZWUgW1tsaW5rLXJpY21vby13aXNwc11dLlxuICpcbiAqICBAZXhhbXBsZVxuICogICAgLy8gVGhlIGFkZHJlc3Mgb2YgdGhlIGNvbnRyYWN0XG4gKiAgICBmcm9tID0gXCIweDhiYTFmMTA5NTUxYkQ0MzI4MDMwMTI2NDVBYzEzNmRkZDY0REJBNzJcIlxuICpcbiAqICAgIC8vIFRoZSBzYWx0XG4gKiAgICBzYWx0ID0gaWQoXCJIZWxsb1dvcmxkXCIpXG4gKlxuICogICAgLy8gVGhlIGhhc2ggb2YgdGhlIGluaXRDb2RlXG4gKiAgICBpbml0Q29kZSA9IFwiMHg2Mzk0MTk4ZGYxNjAwMDUyNjEwM2ZmNjAyMDYwMDQ2MDFjMzM1YWZhNjA0MDUxNjA2MGYzXCI7XG4gKiAgICBpbml0Q29kZUhhc2ggPSBrZWNjYWsyNTYoaW5pdENvZGUpXG4gKlxuICogICAgZ2V0Q3JlYXRlMkFkZHJlc3MoZnJvbSwgc2FsdCwgaW5pdENvZGVIYXNoKVxuICogICAgLy9fcmVzdWx0OlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0Q3JlYXRlMkFkZHJlc3MoX2Zyb20sIF9zYWx0LCBfaW5pdENvZGVIYXNoKSB7XG4gICAgY29uc3QgZnJvbSA9IGdldEFkZHJl
26774c3MoX2Zyb20pO1xuICAgIGNvbnN0IHNhbHQgPSBnZXRCeXRlcyhfc2FsdCwgXCJzYWx0XCIpO1xuICAgIGNvbnN0IGluaXRDb2RlSGFzaCA9IGdldEJ5dGVzKF9pbml0Q29kZUhhc2gsIFwiaW5pdENvZGVIYXNoXCIpO1xuICAgIGFzc2VydEFyZ3VtZW50KHNhbHQubGVuZ3RoID09PSAzMiwgXCJzYWx0IG11c3QgYmUgMzIgYnl0ZXNcIiwgXCJzYWx0XCIsIF9zYWx0KTtcbiAgICBhc3NlcnRBcmd1bWVudChpbml0Q29kZUhhc2gubGVuZ3RoID09PSAzMiwgXCJpbml0Q29kZUhhc2ggbXVzdCBiZSAzMiBieXRlc1wiLCBcImluaXRDb2RlSGFzaFwiLCBfaW5pdENvZGVIYXNoKTtcbiAgICByZXR1cm4gZ2V0QWRkcmVzcyhkYXRhU2xpY2Uoa2VjY2FrMjU2KGNvbmNhdChbXCIweGZmXCIsIGZyb20sIHNhbHQsIGluaXRDb2RlSGFzaF0pKSwgMTIpKTtcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWNvbnRyYWN0LWFkZHJlc3MuanMubWFwIiwiaW1wb3J0IHsgYXNzZXJ0LCBhc3NlcnRBcmd1bWVudCB9IGZyb20gXCIuLi91dGlscy9pbmRleC5qc1wiO1xuaW1wb3J0IHsgZ2V0QWRkcmVzcyB9IGZyb20gXCIuL2FkZHJlc3MuanNcIjtcbi8qKlxuICogIFJldHVybnMgdHJ1ZSBpZiAlJXZhbHVlJSUgaXMgYW4gb2JqZWN0IHdoaWNoIGltcGxlbWVudHMgdGhlXG4gKiAgW1tBZGRyZXNzYWJsZV1dIGludGVyZmFjZS5cbiAqXG4gKiAgQGV4YW1wbGU6XG4gKiAgICAvLyBXYWxsZXRzIGFuZCBBYnN0cmFjdFNpZ25lciBzdWItY2xhc3Nlc1xuICogICAgaXNBZGRyZXNzYWJsZShXYWxsZXQuY3JlYXRlUmFuZG9tKCkpXG4gKiAgICAvL19yZXN1bHQ6XG4gKlxuICogICAgLy8gQ29udHJhY3RzXG4gKiAgICBjb250cmFjdCA9IG5ldyBDb250cmFjdChcImRhaS50b2tlbnMuZXRoZXJzLmV0aFwiLCBbIF0sIHByb3ZpZGVyKVxuICogICAgaXNBZGRyZXNzYWJsZShjb250cmFjdClcbiAqICAgIC8vX3Jlc3VsdDpcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzQWRkcmVzc2FibGUodmFsdWUpIHtcbiAgICByZXR1cm4gKHZhbHVlICYmIHR5cGVvZiAodmFsdWUuZ2V0QWRkcmVzcykgPT09IFwiZnVuY3Rpb25cIik7XG59XG4vKipcbiAqICBSZXR1cm5zIHRydWUgaWYgJSV2YWx1ZSUlIGlzIGEgdmFsaWQgYWRkcmVzcy5cbiAqXG4gKiAgQGV4YW1wbGU6XG4gKiAgICAvLyBWYWxpZCBhZGRyZXNzXG4gKiAgICBpc0FkZHJlc3MoXCIweDhiYTFmMTA5NTUxYkQ0MzI4MDMwMTI2NDVBYzEzNmRkZDY0REJBNzJcIilcbiAqICAgIC8vX3Jlc3VsdDpcbiAqXG4gKiAgICAvLyBWYWxpZCBJQ0FQIGFkZHJlc3NcbiAqICAgIGlzQWRkcmVzcyhcIlhFNjVHQjZMRE5YWU9GVFgwTlNWM0ZVV0tPV0lYQU1KSzM2XCIpXG4gKiAgICAvL19yZXN1bHQ6XG4gKlxuICogICAgLy8gSW52YWxpZCBjaGVja3N1bVxuICogICAgaXNBZGRyZXNzKFwiMHg4QmExZjEwOTU1MWJENDMyODAzMDEyNjQ1QWMxMzZkZGQ2NERCYTcyXCIpXG4gKiAgICAvL19yZXN1bHQ6XG4gKlxuICogICAgLy8gSW52YWxpZCBJQ0FQIGNoZWNrc3VtXG4gKiAgICBpc0FkZHJlc3MoXCIweDhCYTFmMTA5NTUxYkQ0MzI4MDMwMTI2NDVBYzEzNmRkZDY0REJBNzJcIilcbiAqICAgIC8vX3Jlc3VsdDpcbiAqXG4gKiAgICAvLyBOb3QgYW4gYWRkcmVzcyAoYW4gRU5TIG5hbWUgcmVxdWlyZXMgYSBwcm92aWRlZCBhbmQgYW5cbiAqICAgIC8vIGFzeW5jaHJvbm91cyBBUEkgdG8gYWNjZXNzKVxuICogICAgaXNBZGRyZXNzKFwicmljbW9vLmV0aFwiKVxuICogICAgLy9fcmVzdWx0OlxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNBZGRyZXNzKHZhbHVlKSB7XG4gICAgdHJ5IHtcbiAgICAgICAgZ2V0QWRkcmVzcyh2YWx1ZSk7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICBjYXRjaCAoZXJyb3IpIHsgfVxuICAgIHJldHVybiBmYWxzZTtcbn1cbmFzeW5jIGZ1bmN0aW9uIGNoZWNrQWRkcmVzcyh0YXJnZXQsIHByb21pc2UpIHtcbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBwcm9taXNlO1xuICAgIGlmIChyZXN1bHQgPT0gbnVsbCB8fCByZXN1bHQgPT09IFwiMHgwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwXCIpIHtcbiAgICAgICAgYXNzZXJ0KHR5cGVvZiAodGFyZ2V0KSAhPT0gXCJzdHJpbmdcIiwgXCJ1bmNvbmZpZ3VyZWQgbmFtZVwiLCBcIlVOQ09ORklHVVJFRF9OQU1FXCIsIHsgdmFsdWU6IHRhcmdldCB9KTtcbiAgICAgICAgYXNzZXJ0QXJndW1lbnQoZmFsc2UsIFwiaW52YWxpZCBBZGRyZXNzTGlrZSB2YWx1ZTsgZGlkIG5vdCByZXNvbHZlIHRvIGEgdmFsdWUgYWRkcmVzc1wiLCBcInRhcmdldFwiLCB0YXJnZXQpO1xuICAgIH1cbiAgICByZXR1cm4gZ2V0QWRkcmVzcyhyZXN1bHQpO1xufVxuLyoqXG4gKiAgUmVzb2x2ZXMgdG8gYW4gYWRkcmVzcyBmb3IgdGhlICUldGFyZ2V0JSUsIHdoaWNoIG1heSBiZSBhbnlcbiAqICBzdXBwb3J0ZWQgYWRkcmVzcyB0eXBlLCBhbiBbW0FkZHJlc3NhYmxlXV0gb3IgYSBQcm9taXNlIHdoaWNoXG4gKiAgcmVzb2x2ZXMgdG8gYW4gYWRkcmVzcy5cbiAqXG4gKiAgSWYgYW4gRU5TIG5hbWUgaXMgcHJvdmlkZWQsIGJ1dCB0aGF0IG5hbWUgaGFzIG5vdCBiZWVuIGNvcnJlY3RseVxuICogIGNvbmZpZ3VyZWQgYSBbW1VuY29uZmlndXJlZE5hbWVFcnJvcl1dIGlzIHRocm93bi5cbiAqXG4gKiAgQGV4YW1wbGU6XG4gKiAgICBhZGRyID0gXCIweDZCMTc1NDc0RTg5MDk0QzQ0RGE5OGI5NTRFZWRlQUM0OTUyNzFkMEZcIlxuICpcbiAqICAgIC8vIEFkZHJlc3NlcyBhcmUgcmV0dXJuIHN5bmNocm9ub3VzbHlcbiAqICAgIHJlc29sdmVBZGRyZXNzKGFkZHIsIHByb3ZpZGVyKVxuICogICAgLy9fcmVzdWx0OlxuICpcbiAqICAgIC8vIEFkZHJlc3MgcHJvbWlzZXMgYXJlIHJlc29sdmVkIGFzeW5jaHJvbm91c2x5XG4gKiAgICByZXNvbHZlQWRkcmVzcyhQcm9taXNlLnJlc29sdmUoYWRkcikpXG4gKiAgICAvL19yZXN1bHQ6XG4gKlxuICogICAgLy8gRU5TIG5hbWVzIGFyZSByZXNvbHZlZCBhc3luY2hyb25vdXNseVxuICogICAgcmVzb2x2ZUFkZHJlc3MoXCJkYWkudG9rZW5zLmV0aGVycy5ldGhcIiwgcHJvdmlkZXIpXG4gKiAgICAvL19yZXN1bHQ6XG4gKlxuICogICAgLy8gQWRkcmVzc2FibGUgb2JqZWN0cyBhcmUgcmVzb2x2ZWQgYXN5bmNocm9ub3VzbHlcbiAqICAgIGNvbnRyYWN0ID0gbmV3IENvbnRyYWN0KGFkZHIsIFsgXSlcbiAqICAgIHJlc29sdmVBZGRyZXNzKGNvbnRyYWN0LCBwcm92aWRlcilcbiAqICAgIC8vX3Jlc3VsdDpcbiAqXG4gKiAgICAvLyBVbmNvbmZpZ3VyZWQgRU5TIG5hbWVzIHJlamVjdFxuICogICAgcmVzb2x2ZUFkZHJl
26774c3MoXCJub3RoaW5nLWhlcmUucmljbW9vLmV0aFwiLCBwcm92aWRlcilcbiAqICAgIC8vX2Vycm9yOlxuICpcbiAqICAgIC8vIEVOUyBuYW1lcyByZXF1aXJlIGEgTmFtZVJlc29sdmVyIG9iamVjdCBwYXNzZWQgaW5cbiAqICAgIC8vIChub3RpY2UgdGhlIHByb3ZpZGVyIHdhcyBvbWl0dGVkKVxuICogICAgcmVzb2x2ZUFkZHJlc3MoXCJub3RoaW5nLWhlcmUucmljbW9vLmV0aFwiKVxuICogICAgLy9fZXJyb3I6XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZXNvbHZlQWRkcmVzcyh0YXJnZXQsIHJlc29sdmVyKSB7XG4gICAgaWYgKHR5cGVvZiAodGFyZ2V0KSA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgICBpZiAodGFyZ2V0Lm1hdGNoKC9eMHhbMC05YS1mXXs0MH0kL2kpKSB7XG4gICAgICAgICAgICByZXR1cm4gZ2V0QWRkcmVzcyh0YXJnZXQpO1xuICAgICAgICB9XG4gICAgICAgIGFzc2VydChyZXNvbHZlciAhPSBudWxsLCBcIkVOUyByZXNvbHV0aW9uIHJlcXVpcmVzIGEgcHJvdmlkZXJcIiwgXCJVTlNVUFBPUlRFRF9PUEVSQVRJT05cIiwgeyBvcGVyYXRpb246IFwicmVzb2x2ZU5hbWVcIiB9KTtcbiAgICAgICAgcmV0dXJuIGNoZWNrQWRkcmVzcyh0YXJnZXQsIHJlc29sdmVyLnJlc29sdmVOYW1lKHRhcmdldCkpO1xuICAgIH1cbiAgICBlbHNlIGlmIChpc0FkZHJlc3NhYmxlKHRhcmdldCkpIHtcbiAgICAgICAgcmV0dXJuIGNoZWNrQWRkcmVzcyh0YXJnZXQsIHRhcmdldC5nZXRBZGRyZXNzKCkpO1xuICAgIH1cbiAgICBlbHNlIGlmICh0YXJnZXQgJiYgdHlwZW9mICh0YXJnZXQudGhlbikgPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICByZXR1cm4gY2hlY2tBZGRyZXNzKHRhcmdldCwgdGFyZ2V0KTtcbiAgICB9XG4gICAgYXNzZXJ0QXJndW1lbnQoZmFsc2UsIFwidW5zdXBwb3J0ZWQgYWRkcmVzc2FibGUgdmFsdWVcIiwgXCJ0YXJnZXRcIiwgdGFyZ2V0KTtcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWNoZWNrcy5qcy5tYXAiLCIvKipcbiAqICBBIFR5cGVkIG9iamVjdCBhbGxvd3MgYSB2YWx1ZSB0byBoYXZlIGl0cyB0eXBlIGV4cGxpY2l0bHlcbiAqICBzcGVjaWZpZWQuXG4gKlxuICogIEZvciBleGFtcGxlLCBpbiBTb2xpZGl0eSwgdGhlIHZhbHVlIGBgNDVgYCBjb3VsZCByZXByZXNlbnQgYVxuICogIGBgdWludDhgYCBvciBhIGBgdWludDI1NmBgLiBUaGUgdmFsdWUgYGAweDEyMzRgYCBjb3VsZCByZXByZXNlbnRcbiAqICBhIGBgYnl0ZXMyYGAgb3IgYGBieXRlc2BgLlxuICpcbiAqICBTaW5jZSBKYXZhU2NyaXB0IGhhcyBubyBtZWFuaW5nZnVsIHdheSB0byBleHBsaWNpdGx5IGluZm9ybSBhbnlcbiAqICBBUElzIHdoaWNoIHdoYXQgdGhlIHR5cGUgaXMsIHRoaXMgYWxsb3dzIHRyYW5zcGFyZW50IGludGVyb3BlcmF0aW9uXG4gKiAgd2l0aCBTb2xkaXR5LlxuICpcbiAqICBAX3N1YnNlY3Rpb246IGFwaS9hYmk6VHlwZWQgVmFsdWVzXG4gKi9cbmltcG9ydCB7IGFzc2VydFByaXZhdGUsIGRlZmluZVByb3BlcnRpZXMgfSBmcm9tIFwiLi4vdXRpbHMvaW5kZXguanNcIjtcbmNvbnN0IF9nYXVyZCA9IHt9O1xuZnVuY3Rpb24gbih2YWx1ZSwgd2lkdGgpIHtcbiAgICBsZXQgc2lnbmVkID0gZmFsc2U7XG4gICAgaWYgKHdpZHRoIDwgMCkge1xuICAgICAgICBzaWduZWQgPSB0cnVlO1xuICAgICAgICB3aWR0aCAqPSAtMTtcbiAgICB9XG4gICAgLy8gQFRPRE86IENoZWNrIHJhbmdlIGlzIHZhbGlkIGZvciB2YWx1ZVxuICAgIHJldHVybiBuZXcgVHlwZWQoX2dhdXJkLCBgJHtzaWduZWQgPyBcIlwiIDogXCJ1XCJ9aW50JHt3aWR0aH1gLCB2YWx1ZSwgeyBzaWduZWQsIHdpZHRoIH0pO1xufVxuZnVuY3Rpb24gYih2YWx1ZSwgc2l6ZSkge1xuICAgIC8vIEBUT0RPOiBDaGVjayByYW5nZSBpcyB2YWxpZCBmb3IgdmFsdWVcbiAgICByZXR1cm4gbmV3IFR5cGVkKF9nYXVyZCwgYGJ5dGVzJHsoc2l6ZSkgPyBzaXplIDogXCJcIn1gLCB2YWx1ZSwgeyBzaXplIH0pO1xufVxuY29uc3QgX3R5cGVkU3ltYm9sID0gU3ltYm9sLmZvcihcIl9ldGhlcnNfdHlwZWRcIik7XG4vKipcbiAqICBUaGUgKipUeXBlZCoqIGNsYXNzIHRvIHdyYXAgdmFsdWVzIHByb3ZpZGluZyBleHBsaWNpdCB0eXBlIGluZm9ybWF0aW9uLlxuICovXG5leHBvcnQgY2xhc3MgVHlwZWQge1xuICAgIC8qKlxuICAgICAqICBUaGUgdHlwZSwgYXMgYSBTb2xpZGl0eS1jb21wYXRpYmxlIHR5cGUuXG4gICAgICovXG4gICAgdHlwZTtcbiAgICAvKipcbiAgICAgKiAgVGhlIGFjdHVhbCB2YWx1ZS5cbiAgICAgKi9cbiAgICB2YWx1ZTtcbiAgICAjb3B0aW9ucztcbiAgICAvKipcbiAgICAgKiAgQF9pZ25vcmU6XG4gICAgICovXG4gICAgX3R5cGVkU3ltYm9sO1xuICAgIC8qKlxuICAgICAqICBAX2lnbm9yZTpcbiAgICAgKi9cbiAgICBjb25zdHJ1Y3RvcihnYXVyZCwgdHlwZSwgdmFsdWUsIG9wdGlvbnMpIHtcbiAgICAgICAgaWYgKG9wdGlvbnMgPT0gbnVsbCkge1xuICAgICAgICAgICAgb3B0aW9ucyA9IG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgYXNzZXJ0UHJpdmF0ZShfZ2F1cmQsIGdhdXJkLCBcIlR5cGVkXCIpO1xuICAgICAgICBkZWZpbmVQcm9wZXJ0aWVzKHRoaXMsIHsgX3R5cGVkU3ltYm9sLCB0eXBlLCB2YWx1ZSB9KTtcbiAgICAgICAgdGhpcy4jb3B0aW9ucyA9IG9wdGlvbnM7XG4gICAgICAgIC8vIENoZWNrIHRoZSB2YWx1ZSBpcyB2YWxpZFxuICAgICAgICB0aGlzLmZvcm1hdCgpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiAgRm9ybWF0IHRoZSB0eXBlIGFzIGEgSHVtYW4tUmVhZGFibGUgdHlwZS5cbiAgICAgKi9cbiAgICBmb3JtYXQoKSB7XG4gICAgICAgIGlmICh0aGlzLnR5cGUgPT09IFwiYXJyYXlcIikge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiXCIpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHRoaXMudHlwZSA9PT0gXCJkeW5hbWljQXJyYXlcIikge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiXCIpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHRoaXMudHlwZSA9PT0gXCJ0dXBsZVwiKSB7XG4gICAgICAgICAgICByZXR1cm4gYHR1cGxlKCR7dGhpcy52YWx1ZS
267745tYXAoKHYpID0+IHYuZm9ybWF0KCkpLmpvaW4oXCIsXCIpfSlgO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLnR5cGU7XG4gICAgfVxuICAgIC8qKlxuICAgICAqICBUaGUgZGVmYXVsdCB2YWx1ZSByZXR1cm5lZCBieSB0aGlzIHR5cGUuXG4gICAgICovXG4gICAgZGVmYXVsdFZhbHVlKCkge1xuICAgICAgICByZXR1cm4gMDtcbiAgICB9XG4gICAgLyoqXG4gICAgICogIFRoZSBtaW5pbXVtIHZhbHVlIGZvciBudW1lcmljIHR5cGVzLlxuICAgICAqL1xuICAgIG1pblZhbHVlKCkge1xuICAgICAgICByZXR1cm4gMDtcbiAgICB9XG4gICAgLyoqXG4gICAgICogIFRoZSBtYXhpbXVtIHZhbHVlIGZvciBudW1lcmljIHR5cGVzLlxuICAgICAqL1xuICAgIG1heFZhbHVlKCkge1xuICAgICAgICByZXR1cm4gMDtcbiAgICB9XG4gICAgLyoqXG4gICAgICogIFJldHVybnMgYGB0cnVlYGAgYW5kIHByb3ZpZGVzIGEgdHlwZSBndWFyZCBpcyB0aGlzIGlzIGEgW1tUeXBlZEJpZ0ludF1dLlxuICAgICAqL1xuICAgIGlzQmlnSW50KCkge1xuICAgICAgICByZXR1cm4gISEodGhpcy50eXBlLm1hdGNoKC9edT9pbnRbMC05XSskLykpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiAgUmV0dXJucyBgYHRydWVgYCBhbmQgcHJvdmlkZXMgYSB0eXBlIGd1YXJkIGlzIHRoaXMgaXMgYSBbW1R5cGVkRGF0YV1dLlxuICAgICAqL1xuICAgIGlzRGF0YSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudHlwZS5zdGFydHNXaXRoKFwiYnl0ZXNcIik7XG4gICAgfVxuICAgIC8qKlxuICAgICAqICBSZXR1cm5zIGBgdHJ1ZWBgIGFuZCBwcm92aWRlcyBhIHR5cGUgZ3VhcmQgaXMgdGhpcyBpcyBhIFtbVHlwZWRTdHJpbmddXS5cbiAgICAgKi9cbiAgICBpc1N0cmluZygpIHtcbiAgICAgICAgcmV0dXJuICh0aGlzLnR5cGUgPT09IFwic3RyaW5nXCIpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiAgUmV0dXJucyB0aGUgdHVwbGUgbmFtZSwgaWYgdGhpcyBpcyBhIHR1cGxlLiBUaHJvd3Mgb3RoZXJ3aXNlLlxuICAgICAqL1xuICAgIGdldCB0dXBsZU5hbWUoKSB7XG4gICAgICAgIGlmICh0aGlzLnR5cGUgIT09IFwidHVwbGVcIikge1xuICAgICAgICAgICAgdGhyb3cgVHlwZUVycm9yKFwibm90IGEgdHVwbGVcIik7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuI29wdGlvbnM7XG4gICAgfVxuICAgIC8vIFJldHVybnMgdGhlIGxlbmd0aCBvZiB0aGlzIHR5cGUgYXMgYW4gYXJyYXlcbiAgICAvLyAtIGBudWxsYCBpbmRpY2F0ZXMgdGhlIGxlbmd0aCBpcyB1bmZvcmNlZCwgaXQgY291bGQgYmUgZHluYW1pY1xuICAgIC8vIC0gYC0xYCBpbmRpY2F0ZXMgdGhlIGxlbmd0aCBpcyBkeW5hbWljXG4gICAgLy8gLSBhbnkgb3RoZXIgdmFsdWUgaW5kaWNhdGVzIGl0IGlzIGEgc3RhdGljIGFycmF5IGFuZCBpcyBpdHMgbGVuZ3RoXG4gICAgLyoqXG4gICAgICogIFJldHVybnMgdGhlIGxlbmd0aCBvZiB0aGUgYXJyYXkgdHlwZSBvciBgYC0xYGAgaWYgaXQgaXMgZHluYW1pYy5cbiAgICAgKlxuICAgICAqICBUaHJvd3MgaWYgdGhlIHR5cGUgaXMgbm90IGFuIGFycmF5LlxuICAgICAqL1xuICAgIGdldCBhcnJheUxlbmd0aCgpIHtcbiAgICAgICAgaWYgKHRoaXMudHlwZSAhPT0gXCJhcnJheVwiKSB7XG4gICAgICAgICAgICB0aHJvdyBUeXBlRXJyb3IoXCJub3QgYW4gYXJyYXlcIik7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuI29wdGlvbnMgPT09IHRydWUpIHtcbiAgICAgICAgICAgIHJldHVybiAtMTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy4jb3B0aW9ucyA9PT0gZmFsc2UpIHtcbiAgICAgICAgICAgIHJldHVybiAodGhpcy52YWx1ZSkubGVuZ3RoO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiAgUmV0dXJucyBhIG5ldyAqKlR5cGVkKiogb2YgJSV0eXBlJSUgd2l0aCB0aGUgJSV2YWx1ZSUlLlxuICAgICAqL1xuICAgIHN0YXRpYyBmcm9tKHR5cGUsIHZhbHVlKSB7XG4gICAgICAgIHJldHVybiBuZXcgVHlwZWQoX2dhdXJkLCB0eXBlLCB2YWx1ZSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqICBSZXR1cm4gYSBuZXcgYGB1aW50OGBgIHR5cGUgZm9yICUldiUlLlxuICAgICAqL1xuICAgIHN0YXRpYyB1aW50OCh2KSB7IHJldHVybiBuKHYsIDgpOyB9XG4gICAgLyoqXG4gICAgICogIFJldHVybiBhIG5ldyBgYHVpbnQxNmBgIHR5cGUgZm9yICUldiUlLlxuICAgICAqL1xuICAgIHN0YXRpYyB1aW50MTYodikgeyByZXR1cm4gbih2LCAxNik7IH1cbiAgICAvKipcbiAgICAgKiAgUmV0dXJuIGEgbmV3IGBgdWludDI0YGAgdHlwZSBmb3IgJSV2JSUuXG4gICAgICovXG4gICAgc3RhdGljIHVpbnQyNCh2KSB7IHJldHVybiBuKHYsIDI0KTsgfVxuICAgIC8qKlxuICAgICAqICBSZXR1cm4gYSBuZXcgYGB1aW50MzJgYCB0eXBlIGZvciAlJXYlJS5cbiAgICAgKi9cbiAgICBzdGF0aWMgdWludDMyKHYpIHsgcmV0dXJuIG4odiwgMzIpOyB9XG4gICAgLyoqXG4gICAgICogIFJldHVybiBhIG5ldyBgYHVpbnQ0MGBgIHR5cGUgZm9yICUldiUlLlxuICAgICAqL1xuICAgIHN0YXRpYyB1aW50NDAodikgeyByZXR1cm4gbih2LCA0MCk7IH1cbiAgICAvKipcbiAgICAgKiAgUmV0dXJuIGEgbmV3IGBgdWludDQ4YGAgdHlwZSBmb3IgJSV2JSUuXG4gICAgICovXG4gICAgc3RhdGljIHVpbnQ0OCh2KSB7IHJldHVybiBuKHYsIDQ4KTsgfVxuICAgIC8qKlxuICAgICAqICBSZXR1cm4gYSBuZXcgYGB1aW50NTZgYCB0eXBlIGZvciAlJXYlJS5cbiAgICAgKi9cbiAgICBzdGF0aWMgdWludDU2KHYpIHsgcmV0dXJuIG4odiwgNTYpOyB9XG4gICAgLyoqXG4gICAgICogIFJldHVybiBhIG5ldyBgYHVpbnQ2NGBgIHR5cGUgZm9yICUldiUlLlxuICAgICAqL1xuICAgIHN0YXRpYyB1aW50NjQodikgeyByZXR1cm4gbih2LCA2NCk7IH1cbiAgICAvKipcbiAgICAgKiAgUmV0dXJuIGEgbmV3IGBgdWludDcyYGAgdHlwZSBmb3IgJSV2JSUuXG4gICAgICovXG4gICAgc3RhdGljIHVpbnQ3Mih2KSB7IHJldHVybiBuKHYsIDcyKTsgfVxuICAgIC8qKlxuICAgICAqICBSZXR1cm4gYSBuZXcgYGB1aW50ODBgYCB0eXBlIGZvciAlJXYlJS5cbiAgICAgKi9cbiAgICBzdGF0aWMgdWludDgwKHYpIHsgcmV0dXJuIG4odiwgODApOyB9XG4gICAgLyoqXG4gICAgICogIFJldHVybi
26774BhIG5ldyBgYHVpbnQ4OGBgIHR5cGUgZm9yICUldiUlLlxuICAgICAqL1xuICAgIHN0YXRpYyB1aW50ODgodikgeyByZXR1cm4gbih2LCA4OCk7IH1cbiAgICAvKipcbiAgICAgKiAgUmV0dXJuIGEgbmV3IGBgdWludDk2YGAgdHlwZSBmb3IgJSV2JSUuXG4gICAgICovXG4gICAgc3RhdGljIHVpbnQ5Nih2KSB7IHJldHVybiBuKHYsIDk2KTsgfVxuICAgIC8qKlxuICAgICAqICBSZXR1cm4gYSBuZXcgYGB1aW50MTA0YGAgdHlwZSBmb3IgJSV2JSUuXG4gICAgICovXG4gICAgc3RhdGljIHVpbnQxMDQodikgeyByZXR1cm4gbih2LCAxMDQpOyB9XG4gICAgLyoqXG4gICAgICogIFJldHVybiBhIG5ldyBgYHVpbnQxMTJgYCB0eXBlIGZvciAlJXYlJS5cbiAgICAgKi9cbiAgICBzdGF0aWMgdWludDExMih2KSB7IHJldHVybiBuKHYsIDExMik7IH1cbiAgICAvKipcbiAgICAgKiAgUmV0dXJuIGEgbmV3IGBgdWludDEyMGBgIHR5cGUgZm9yICUldiUlLlxuICAgICAqL1xuICAgIHN0YXRpYyB1aW50MTIwKHYpIHsgcmV0dXJuIG4odiwgMTIwKTsgfVxuICAgIC8qKlxuICAgICAqICBSZXR1cm4gYSBuZXcgYGB1aW50MTI4YGAgdHlwZSBmb3IgJSV2JSUuXG4gICAgICovXG4gICAgc3RhdGljIHVpbnQxMjgodikgeyByZXR1cm4gbih2LCAxMjgpOyB9XG4gICAgLyoqXG4gICAgICogIFJldHVybiBhIG5ldyBgYHVpbnQxMzZgYCB0eXBlIGZvciAlJXYlJS5cbiAgICAgKi9cbiAgICBzdGF0aWMgdWludDEzNih2KSB7IHJldHVybiBuKHYsIDEzNik7IH1cbiAgICAvKipcbiAgICAgKiAgUmV0dXJuIGEgbmV3IGBgdWludDE0NGBgIHR5cGUgZm9yICUldiUlLlxuICAgICAqL1xuICAgIHN0YXRpYyB1aW50MTQ0KHYpIHsgcmV0dXJuIG4odiwgMTQ0KTsgfVxuICAgIC8qKlxuICAgICAqICBSZXR1cm4gYSBuZXcgYGB1aW50MTUyYGAgdHlwZSBmb3IgJSV2JSUuXG4gICAgICovXG4gICAgc3RhdGljIHVpbnQxNTIodikgeyByZXR1cm4gbih2LCAxNTIpOyB9XG4gICAgLyoqXG4gICAgICogIFJldHVybiBhIG5ldyBgYHVpbnQxNjBgYCB0eXBlIGZvciAlJXYlJS5cbiAgICAgKi9cbiAgICBzdGF0aWMgdWludDE2MCh2KSB7IHJldHVybiBuKHYsIDE2MCk7IH1cbiAgICAvKipcbiAgICAgKiAgUmV0dXJuIGEgbmV3IGBgdWludDE2OGBgIHR5cGUgZm9yICUldiUlLlxuICAgICAqL1xuICAgIHN0YXRpYyB1aW50MTY4KHYpIHsgcmV0dXJuIG4odiwgMTY4KTsgfVxuICAgIC8qKlxuICAgICAqICBSZXR1cm4gYSBuZXcgYGB1aW50MTc2YGAgdHlwZSBmb3IgJSV2JSUuXG4gICAgICovXG4gICAgc3RhdGljIHVpbnQxNzYodikgeyByZXR1cm4gbih2LCAxNzYpOyB9XG4gICAgLyoqXG4gICAgICogIFJldHVybiBhIG5ldyBgYHVpbnQxODRgYCB0eXBlIGZvciAlJXYlJS5cbiAgICAgKi9cbiAgICBzdGF0aWMgdWludDE4NCh2KSB7IHJldHVybiBuKHYsIDE4NCk7IH1cbiAgICAvKipcbiAgICAgKiAgUmV0dXJuIGEgbmV3IGBgdWludDE5MmBgIHR5cGUgZm9yICUldiUlLlxuICAgICAqL1xuICAgIHN0YXRpYyB1aW50MTkyKHYpIHsgcmV0dXJuIG4odiwgMTkyKTsgfVxuICAgIC8qKlxuICAgICAqICBSZXR1cm4gYSBuZXcgYGB1aW50MjAwYGAgdHlwZSBmb3IgJSV2JSUuXG4gICAgICovXG4gICAgc3RhdGljIHVpbnQyMDAodikgeyByZXR1cm4gbih2LCAyMDApOyB9XG4gICAgLyoqXG4gICAgICogIFJldHVybiBhIG5ldyBgYHVpbnQyMDhgYCB0eXBlIGZvciAlJXYlJS5cbiAgICAgKi9cbiAgICBzdGF0aWMgdWludDIwOCh2KSB7IHJldHVybiBuKHYsIDIwOCk7IH1cbiAgICAvKipcbiAgICAgKiAgUmV0dXJuIGEgbmV3IGBgdWludDIxNmBgIHR5cGUgZm9yICUldiUlLlxuICAgICAqL1xuICAgIHN0YXRpYyB1aW50MjE2KHYpIHsgcmV0dXJuIG4odiwgMjE2KTsgfVxuICAgIC8qKlxuICAgICAqICBSZXR1cm4gYSBuZXcgYGB1aW50MjI0YGAgdHlwZSBmb3IgJSV2JSUuXG4gICAgICovXG4gICAgc3RhdGljIHVpbnQyMjQodikgeyByZXR1cm4gbih2LCAyMjQpOyB9XG4gICAgLyoqXG4gICAgICogIFJldHVybiBhIG5ldyBgYHVpbnQyMzJgYCB0eXBlIGZvciAlJXYlJS5cbiAgICAgKi9cbiAgICBzdGF0aWMgdWludDIzMih2KSB7IHJldHVybiBuKHYsIDIzMik7IH1cbiAgICAvKipcbiAgICAgKiAgUmV0dXJuIGEgbmV3IGBgdWludDI0MGBgIHR5cGUgZm9yICUldiUlLlxuICAgICAqL1xuICAgIHN0YXRpYyB1aW50MjQwKHYpIHsgcmV0dXJuIG4odiwgMjQwKTsgfVxuICAgIC8qKlxuICAgICAqICBSZXR1cm4gYSBuZXcgYGB1aW50MjQ4YGAgdHlwZSBmb3IgJSV2JSUuXG4gICAgICovXG4gICAgc3RhdGljIHVpbnQyNDgodikgeyByZXR1cm4gbih2LCAyNDgpOyB9XG4gICAgLyoqXG4gICAgICogIFJldHVybiBhIG5ldyBgYHVpbnQyNTZgYCB0eXBlIGZvciAlJXYlJS5cbiAgICAgKi9cbiAgICBzdGF0aWMgdWludDI1Nih2KSB7IHJldHVybiBuKHYsIDI1Nik7IH1cbiAgICAvKipcbiAgICAgKiAgUmV0dXJuIGEgbmV3IGBgdWludDI1NmBgIHR5cGUgZm9yICUldiUlLlxuICAgICAqL1xuICAgIHN0YXRpYyB1aW50KHYpIHsgcmV0dXJuIG4odiwgMjU2KTsgfVxuICAgIC8qKlxuICAgICAqICBSZXR1cm4gYSBuZXcgYGBpbnQ4YGAgdHlwZSBmb3IgJSV2JSUuXG4gICAgICovXG4gICAgc3RhdGljIGludDgodikgeyByZXR1cm4gbih2LCAtOCk7IH1cbiAgICAvKipcbiAgICAgKiAgUmV0dXJuIGEgbmV3IGBgaW50MTZgYCB0eXBlIGZvciAlJXYlJS5cbiAgICAgKi9cbiAgICBzdGF0aWMgaW50MTYodikgeyByZXR1cm4gbih2LCAtMTYpOyB9XG4gICAgLyoqXG4gICAgICogIFJldHVybiBhIG5ldyBgYGludDI0YGAgdHlwZSBmb3IgJSV2JSUuXG4gICAgICovXG4gICAgc3RhdGljIGludDI0KHYpIHsgcmV0dXJuIG4odiwgLTI0KTsgfVxuICAgIC8qKlxuICAgICAqICBSZXR1cm4gYSBuZXcgYGBpbnQzMmBgIHR5cGUgZm9yICUldiUlLlxuICAgICAqL1xuICAgIHN0YXRpYyBpbnQzMih2KSB7IHJldHVybiBuKHYsIC0zMik7IH1cbiAgICAvKipcbiAgICAgKiAgUmV0dXJuIGEgbmV3IGBgaW50NDBgYCB0eXBlIGZvciAlJXYlJS5cbiAgICAgKi9cbiAgICBzdGF0aWMgaW50NDAodikgeyByZXR1cm4gbih2LCAtNDApOyB9XG4gICAgLyoqXG4gICAgICogIFJldHVybi
26774BhIG5ldyBgYGludDQ4YGAgdHlwZSBmb3IgJSV2JSUuXG4gICAgICovXG4gICAgc3RhdGljIGludDQ4KHYpIHsgcmV0dXJuIG4odiwgLTQ4KTsgfVxuICAgIC8qKlxuICAgICAqICBSZXR1cm4gYSBuZXcgYGBpbnQ1NmBgIHR5cGUgZm9yICUldiUlLlxuICAgICAqL1xuICAgIHN0YXRpYyBpbnQ1Nih2KSB7IHJldHVybiBuKHYsIC01Nik7IH1cbiAgICAvKipcbiAgICAgKiAgUmV0dXJuIGEgbmV3IGBgaW50NjRgYCB0eXBlIGZvciAlJXYlJS5cbiAgICAgKi9cbiAgICBzdGF0aWMgaW50NjQodikgeyByZXR1cm4gbih2LCAtNjQpOyB9XG4gICAgLyoqXG4gICAgICogIFJldHVybiBhIG5ldyBgYGludDcyYGAgdHlwZSBmb3IgJSV2JSUuXG4gICAgICovXG4gICAgc3RhdGljIGludDcyKHYpIHsgcmV0dXJuIG4odiwgLTcyKTsgfVxuICAgIC8qKlxuICAgICAqICBSZXR1cm4gYSBuZXcgYGBpbnQ4MGBgIHR5cGUgZm9yICUldiUlLlxuICAgICAqL1xuICAgIHN0YXRpYyBpbnQ4MCh2KSB7IHJldHVybiBuKHYsIC04MCk7IH1cbiAgICAvKipcbiAgICAgKiAgUmV0dXJuIGEgbmV3IGBgaW50ODhgYCB0eXBlIGZvciAlJXYlJS5cbiAgICAgKi9cbiAgICBzdGF0aWMgaW50ODgodikgeyByZXR1cm4gbih2LCAtODgpOyB9XG4gICAgLyoqXG4gICAgICogIFJldHVybiBhIG5ldyBgYGludDk2YGAgdHlwZSBmb3IgJSV2JSUuXG4gICAgICovXG4gICAgc3RhdGljIGludDk2KHYpIHsgcmV0dXJuIG4odiwgLTk2KTsgfVxuICAgIC8qKlxuICAgICAqICBSZXR1cm4gYSBuZXcgYGBpbnQxMDRgYCB0eXBlIGZvciAlJXYlJS5cbiAgICAgKi9cbiAgICBzdGF0aWMgaW50MTA0KHYpIHsgcmV0dXJuIG4odiwgLTEwNCk7IH1cbiAgICAvKipcbiAgICAgKiAgUmV0dXJuIGEgbmV3IGBgaW50MTEyYGAgdHlwZSBmb3IgJSV2JSUuXG4gICAgICovXG4gICAgc3RhdGljIGludDExMih2KSB7IHJldHVybiBuKHYsIC0xMTIpOyB9XG4gICAgLyoqXG4gICAgICogIFJldHVybiBhIG5ldyBgYGludDEyMGBgIHR5cGUgZm9yICUldiUlLlxuICAgICAqL1xuICAgIHN0YXRpYyBpbnQxMjAodikgeyByZXR1cm4gbih2LCAtMTIwKTsgfVxuICAgIC8qKlxuICAgICAqICBSZXR1cm4gYSBuZXcgYGBpbnQxMjhgYCB0eXBlIGZvciAlJXYlJS5cbiAgICAgKi9cbiAgICBzdGF0aWMgaW50MTI4KHYpIHsgcmV0dXJuIG4odiwgLTEyOCk7IH1cbiAgICAvKipcbiAgICAgKiAgUmV0dXJuIGEgbmV3IGBgaW50MTM2YGAgdHlwZSBmb3IgJSV2JSUuXG4gICAgICovXG4gICAgc3RhdGljIGludDEzNih2KSB7IHJldHVybiBuKHYsIC0xMzYpOyB9XG4gICAgLyoqXG4gICAgICogIFJldHVybiBhIG5ldyBgYGludDE0NGBgIHR5cGUgZm9yICUldiUlLlxuICAgICAqL1xuICAgIHN0YXRpYyBpbnQxNDQodikgeyByZXR1cm4gbih2LCAtMTQ0KTsgfVxuICAgIC8qKlxuICAgICAqICBSZXR1cm4gYSBuZXcgYGBpbnQ1MmBgIHR5cGUgZm9yICUldiUlLlxuICAgICAqL1xuICAgIHN0YXRpYyBpbnQxNTIodikgeyByZXR1cm4gbih2LCAtMTUyKTsgfVxuICAgIC8qKlxuICAgICAqICBSZXR1cm4gYSBuZXcgYGBpbnQxNjBgYCB0eXBlIGZvciAlJXYlJS5cbiAgICAgKi9cbiAgICBzdGF0aWMgaW50MTYwKHYpIHsgcmV0dXJuIG4odiwgLTE2MCk7IH1cbiAgICAvKipcbiAgICAgKiAgUmV0dXJuIGEgbmV3IGBgaW50MTY4YGAgdHlwZSBmb3IgJSV2JSUuXG4gICAgICovXG4gICAgc3RhdGljIGludDE2OCh2KSB7IHJldHVybiBuKHYsIC0xNjgpOyB9XG4gICAgLyoqXG4gICAgICogIFJldHVybiBhIG5ldyBgYGludDE3NmBgIHR5cGUgZm9yICUldiUlLlxuICAgICAqL1xuICAgIHN0YXRpYyBpbnQxNzYodikgeyByZXR1cm4gbih2LCAtMTc2KTsgfVxuICAgIC8qKlxuICAgICAqICBSZXR1cm4gYSBuZXcgYGBpbnQxODRgYCB0eXBlIGZvciAlJXYlJS5cbiAgICAgKi9cbiAgICBzdGF0aWMgaW50MTg0KHYpIHsgcmV0dXJuIG4odiwgLTE4NCk7IH1cbiAgICAvKipcbiAgICAgKiAgUmV0dXJuIGEgbmV3IGBgaW50OTJgYCB0eXBlIGZvciAlJXYlJS5cbiAgICAgKi9cbiAgICBzdGF0aWMgaW50MTkyKHYpIHsgcmV0dXJuIG4odiwgLTE5Mik7IH1cbiAgICAvKipcbiAgICAgKiAgUmV0dXJuIGEgbmV3IGBgaW50MjAwYGAgdHlwZSBmb3IgJSV2JSUuXG4gICAgICovXG4gICAgc3RhdGljIGludDIwMCh2KSB7IHJldHVybiBuKHYsIC0yMDApOyB9XG4gICAgLyoqXG4gICAgICogIFJldHVybiBhIG5ldyBgYGludDIwOGBgIHR5cGUgZm9yICUldiUlLlxuICAgICAqL1xuICAgIHN0YXRpYyBpbnQyMDgodikgeyByZXR1cm4gbih2LCAtMjA4KTsgfVxuICAgIC8qKlxuICAgICAqICBSZXR1cm4gYSBuZXcgYGBpbnQyMTZgYCB0eXBlIGZvciAlJXYlJS5cbiAgICAgKi9cbiAgICBzdGF0aWMgaW50MjE2KHYpIHsgcmV0dXJuIG4odiwgLTIxNik7IH1cbiAgICAvKipcbiAgICAgKiAgUmV0dXJuIGEgbmV3IGBgaW50MjI0YGAgdHlwZSBmb3IgJSV2JSUuXG4gICAgICovXG4gICAgc3RhdGljIGludDIyNCh2KSB7IHJldHVybiBuKHYsIC0yMjQpOyB9XG4gICAgLyoqXG4gICAgICogIFJldHVybiBhIG5ldyBgYGludDIzMmBgIHR5cGUgZm9yICUldiUlLlxuICAgICAqL1xuICAgIHN0YXRpYyBpbnQyMzIodikgeyByZXR1cm4gbih2LCAtMjMyKTsgfVxuICAgIC8qKlxuICAgICAqICBSZXR1cm4gYSBuZXcgYGBpbnQyNDBgYCB0eXBlIGZvciAlJXYlJS5cbiAgICAgKi9cbiAgICBzdGF0aWMgaW50MjQwKHYpIHsgcmV0dXJuIG4odiwgLTI0MCk7IH1cbiAgICAvKipcbiAgICAgKiAgUmV0dXJuIGEgbmV3IGBgaW50MjQ4YGAgdHlwZSBmb3IgJSV2JSUuXG4gICAgICovXG4gICAgc3RhdGljIGludDI0OCh2KSB7IHJldHVybiBuKHYsIC0yNDgpOyB9XG4gICAgLyoqXG4gICAgICogIFJldHVybiBhIG5ldyBgYGludDI1NmBgIHR5cGUgZm9yICUldiUlLlxuICAgICAqL1xuICAgIHN0YXRpYyBpbnQyNTYodikgeyByZXR1cm4gbih2LCAtMjU2KTsgfVxuICAgIC8qKlxuICAgICAqICBSZXR1cm4gYSBuZXcgYGBpbnQyNTZgYCB0eXBlIGZvciAlJXYlJS5cbiAgICAgKi9cbiAgICBzdGF0aWMgaW50KHYpIHsgcmV0dXJuIG4odiwgLTI1Nik7IH1cbiAgICAvKipcbiAgICAgKiAgUmV0dXJuIGEgbmV3IGBgYnl0ZXMxYGAgdHlwZSBmb3IgJSV2JSUuXG4gICAgICovXG4gICAgc3RhdGljIGJ5dGVzMSh2KSB7IHJldHVybi
26774BiKHYsIDEpOyB9XG4gICAgLyoqXG4gICAgICogIFJldHVybiBhIG5ldyBgYGJ5dGVzMmBgIHR5cGUgZm9yICUldiUlLlxuICAgICAqL1xuICAgIHN0YXRpYyBieXRlczIodikgeyByZXR1cm4gYih2LCAyKTsgfVxuICAgIC8qKlxuICAgICAqICBSZXR1cm4gYSBuZXcgYGBieXRlczNgYCB0eXBlIGZvciAlJXYlJS5cbiAgICAgKi9cbiAgICBzdGF0aWMgYnl0ZXMzKHYpIHsgcmV0dXJuIGIodiwgMyk7IH1cbiAgICAvKipcbiAgICAgKiAgUmV0dXJuIGEgbmV3IGBgYnl0ZXM0YGAgdHlwZSBmb3IgJSV2JSUuXG4gICAgICovXG4gICAgc3RhdGljIGJ5dGVzNCh2KSB7IHJldHVybiBiKHYsIDQpOyB9XG4gICAgLyoqXG4gICAgICogIFJldHVybiBhIG5ldyBgYGJ5dGVzNWBgIHR5cGUgZm9yICUldiUlLlxuICAgICAqL1xuICAgIHN0YXRpYyBieXRlczUodikgeyByZXR1cm4gYih2LCA1KTsgfVxuICAgIC8qKlxuICAgICAqICBSZXR1cm4gYSBuZXcgYGBieXRlczZgYCB0eXBlIGZvciAlJXYlJS5cbiAgICAgKi9cbiAgICBzdGF0aWMgYnl0ZXM2KHYpIHsgcmV0dXJuIGIodiwgNik7IH1cbiAgICAvKipcbiAgICAgKiAgUmV0dXJuIGEgbmV3IGBgYnl0ZXM3YGAgdHlwZSBmb3IgJSV2JSUuXG4gICAgICovXG4gICAgc3RhdGljIGJ5dGVzNyh2KSB7IHJldHVybiBiKHYsIDcpOyB9XG4gICAgLyoqXG4gICAgICogIFJldHVybiBhIG5ldyBgYGJ5dGVzOGBgIHR5cGUgZm9yICUldiUlLlxuICAgICAqL1xuICAgIHN0YXRpYyBieXRlczgodikgeyByZXR1cm4gYih2LCA4KTsgfVxuICAgIC8qKlxuICAgICAqICBSZXR1cm4gYSBuZXcgYGBieXRlczlgYCB0eXBlIGZvciAlJXYlJS5cbiAgICAgKi9cbiAgICBzdGF0aWMgYnl0ZXM5KHYpIHsgcmV0dXJuIGIodiwgOSk7IH1cbiAgICAvKipcbiAgICAgKiAgUmV0dXJuIGEgbmV3IGBgYnl0ZXMxMGBgIHR5cGUgZm9yICUldiUlLlxuICAgICAqL1xuICAgIHN0YXRpYyBieXRlczEwKHYpIHsgcmV0dXJuIGIodiwgMTApOyB9XG4gICAgLyoqXG4gICAgICogIFJldHVybiBhIG5ldyBgYGJ5dGVzMTFgYCB0eXBlIGZvciAlJXYlJS5cbiAgICAgKi9cbiAgICBzdGF0aWMgYnl0ZXMxMSh2KSB7IHJldHVybiBiKHYsIDExKTsgfVxuICAgIC8qKlxuICAgICAqICBSZXR1cm4gYSBuZXcgYGBieXRlczEyYGAgdHlwZSBmb3IgJSV2JSUuXG4gICAgICovXG4gICAgc3RhdGljIGJ5dGVzMTIodikgeyByZXR1cm4gYih2LCAxMik7IH1cbiAgICAvKipcbiAgICAgKiAgUmV0dXJuIGEgbmV3IGBgYnl0ZXMxM2BgIHR5cGUgZm9yICUldiUlLlxuICAgICAqL1xuICAgIHN0YXRpYyBieXRlczEzKHYpIHsgcmV0dXJuIGIodiwgMTMpOyB9XG4gICAgLyoqXG4gICAgICogIFJldHVybiBhIG5ldyBgYGJ5dGVzMTRgYCB0eXBlIGZvciAlJXYlJS5cbiAgICAgKi9cbiAgICBzdGF0aWMgYnl0ZXMxNCh2KSB7IHJldHVybiBiKHYsIDE0KTsgfVxuICAgIC8qKlxuICAgICAqICBSZXR1cm4gYSBuZXcgYGBieXRlczE1YGAgdHlwZSBmb3IgJSV2JSUuXG4gICAgICovXG4gICAgc3RhdGljIGJ5dGVzMTUodikgeyByZXR1cm4gYih2LCAxNSk7IH1cbiAgICAvKipcbiAgICAgKiAgUmV0dXJuIGEgbmV3IGBgYnl0ZXMxNmBgIHR5cGUgZm9yICUldiUlLlxuICAgICAqL1xuICAgIHN0YXRpYyBieXRlczE2KHYpIHsgcmV0dXJuIGIodiwgMTYpOyB9XG4gICAgLyoqXG4gICAgICogIFJldHVybiBhIG5ldyBgYGJ5dGVzMTdgYCB0eXBlIGZvciAlJXYlJS5cbiAgICAgKi9cbiAgICBzdGF0aWMgYnl0ZXMxNyh2KSB7IHJldHVybiBiKHYsIDE3KTsgfVxuICAgIC8qKlxuICAgICAqICBSZXR1cm4gYSBuZXcgYGBieXRlczE4YGAgdHlwZSBmb3IgJSV2JSUuXG4gICAgICovXG4gICAgc3RhdGljIGJ5dGVzMTgodikgeyByZXR1cm4gYih2LCAxOCk7IH1cbiAgICAvKipcbiAgICAgKiAgUmV0dXJuIGEgbmV3IGBgYnl0ZXMxOWBgIHR5cGUgZm9yICUldiUlLlxuICAgICAqL1xuICAgIHN0YXRpYyBieXRlczE5KHYpIHsgcmV0dXJuIGIodiwgMTkpOyB9XG4gICAgLyoqXG4gICAgICogIFJldHVybiBhIG5ldyBgYGJ5dGVzMjBgYCB0eXBlIGZvciAlJXYlJS5cbiAgICAgKi9cbiAgICBzdGF0aWMgYnl0ZXMyMCh2KSB7IHJldHVybiBiKHYsIDIwKTsgfVxuICAgIC8qKlxuICAgICAqICBSZXR1cm4gYSBuZXcgYGBieXRlczIxYGAgdHlwZSBmb3IgJSV2JSUuXG4gICAgICovXG4gICAgc3RhdGljIGJ5dGVzMjEodikgeyByZXR1cm4gYih2LCAyMSk7IH1cbiAgICAvKipcbiAgICAgKiAgUmV0dXJuIGEgbmV3IGBgYnl0ZXMyMmBgIHR5cGUgZm9yICUldiUlLlxuICAgICAqL1xuICAgIHN0YXRpYyBieXRlczIyKHYpIHsgcmV0dXJuIGIodiwgMjIpOyB9XG4gICAgLyoqXG4gICAgICogIFJldHVybiBhIG5ldyBgYGJ5dGVzMjNgYCB0eXBlIGZvciAlJXYlJS5cbiAgICAgKi9cbiAgICBzdGF0aWMgYnl0ZXMyMyh2KSB7IHJldHVybiBiKHYsIDIzKTsgfVxuICAgIC8qKlxuICAgICAqICBSZXR1cm4gYSBuZXcgYGBieXRlczI0YGAgdHlwZSBmb3IgJSV2JSUuXG4gICAgICovXG4gICAgc3RhdGljIGJ5dGVzMjQodikgeyByZXR1cm4gYih2LCAyNCk7IH1cbiAgICAvKipcbiAgICAgKiAgUmV0dXJuIGEgbmV3IGBgYnl0ZXMyNWBgIHR5cGUgZm9yICUldiUlLlxuICAgICAqL1xuICAgIHN0YXRpYyBieXRlczI1KHYpIHsgcmV0dXJuIGIodiwgMjUpOyB9XG4gICAgLyoqXG4gICAgICogIFJldHVybiBhIG5ldyBgYGJ5dGVzMjZgYCB0eXBlIGZvciAlJXYlJS5cbiAgICAgKi9cbiAgICBzdGF0aWMgYnl0ZXMyNih2KSB7IHJldHVybiBiKHYsIDI2KTsgfVxuICAgIC8qKlxuICAgICAqICBSZXR1cm4gYSBuZXcgYGBieXRlczI3YGAgdHlwZSBmb3IgJSV2JSUuXG4gICAgICovXG4gICAgc3RhdGljIGJ5dGVzMjcodikgeyByZXR1cm4gYih2LCAyNyk7IH1cbiAgICAvKipcbiAgICAgKiAgUmV0dXJuIGEgbmV3IGBgYnl0ZXMyOGBgIHR5cGUgZm9yICUldiUlLlxuICAgICAqL1xuICAgIHN0YXRpYyBieXRlczI4KHYpIHsgcmV0dXJuIGIodiwgMjgpOyB9XG4gICAgLyoqXG4gICAgICogIFJldHVybiBhIG5ldyBgYGJ5dGVzMjlgYCB0eXBlIGZvciAlJXYlJS5cbiAgICAgKi9cbiAgICBzdGF0aWMgYnl0ZXMyOSh2KSB7IHJldHVybi
26774BiKHYsIDI5KTsgfVxuICAgIC8qKlxuICAgICAqICBSZXR1cm4gYSBuZXcgYGBieXRlczMwYGAgdHlwZSBmb3IgJSV2JSUuXG4gICAgICovXG4gICAgc3RhdGljIGJ5dGVzMzAodikgeyByZXR1cm4gYih2LCAzMCk7IH1cbiAgICAvKipcbiAgICAgKiAgUmV0dXJuIGEgbmV3IGBgYnl0ZXMzMWBgIHR5cGUgZm9yICUldiUlLlxuICAgICAqL1xuICAgIHN0YXRpYyBieXRlczMxKHYpIHsgcmV0dXJuIGIodiwgMzEpOyB9XG4gICAgLyoqXG4gICAgICogIFJldHVybiBhIG5ldyBgYGJ5dGVzMzJgYCB0eXBlIGZvciAlJXYlJS5cbiAgICAgKi9cbiAgICBzdGF0aWMgYnl0ZXMzMih2KSB7IHJldHVybiBiKHYsIDMyKTsgfVxuICAgIC8qKlxuICAgICAqICBSZXR1cm4gYSBuZXcgYGBhZGRyZXNzYGAgdHlwZSBmb3IgJSV2JSUuXG4gICAgICovXG4gICAgc3RhdGljIGFkZHJlc3ModikgeyByZXR1cm4gbmV3IFR5cGVkKF9nYXVyZCwgXCJhZGRyZXNzXCIsIHYpOyB9XG4gICAgLyoqXG4gICAgICogIFJldHVybiBhIG5ldyBgYGJvb2xgYCB0eXBlIGZvciAlJXYlJS5cbiAgICAgKi9cbiAgICBzdGF0aWMgYm9vbCh2KSB7IHJldHVybiBuZXcgVHlwZWQoX2dhdXJkLCBcImJvb2xcIiwgISF2KTsgfVxuICAgIC8qKlxuICAgICAqICBSZXR1cm4gYSBuZXcgYGBieXRlc2BgIHR5cGUgZm9yICUldiUlLlxuICAgICAqL1xuICAgIHN0YXRpYyBieXRlcyh2KSB7IHJldHVybiBuZXcgVHlwZWQoX2dhdXJkLCBcImJ5dGVzXCIsIHYpOyB9XG4gICAgLyoqXG4gICAgICogIFJldHVybiBhIG5ldyBgYHN0cmluZ2BgIHR5cGUgZm9yICUldiUlLlxuICAgICAqL1xuICAgIHN0YXRpYyBzdHJpbmc
26774odikgeyByZXR1cm4gbmV3IFR5cGVkKF9nYXVyZCwgXCJzdHJpbmdcIiwgdik7IH1cbiAgICAvKipcbiAgICAgKiAgUmV0dXJuIGEgbmV3IGBgYXJyYXlgYCB0eXBlIGZvciAlJXYlJSwgYWxsb3dpbmcgJSVkeW5hbWljJSUgbGVuZ3RoLlxuICAgICAqL1xuICAgIHN0YXRpYyBhcnJheSh2LCBkeW5hbWljKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIm5vdCBpbXBsZW1lbnRlZCB5ZXRcIik7XG4gICAgICAgIHJldHVybiBuZXcgVHlwZWQoX2dhdXJkLCBcImFycmF5XCIsIHYsIGR5bmFtaWMpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiAgUmV0dXJuIGEgbmV3IGBgdHVwbGVgYCB0eXBlIGZvciAlJXYlJSwgd2l0aCB0aGUgb3B0aW9uYWwgJSVuYW1lJSUuXG4gICAgICovXG4gICAgc3RhdGljIHR1cGxlKHYsIG5hbWUpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwibm90IGltcGxlbWVudGVkIHlldFwiKTtcbiAgICAgICAgcmV0dXJuIG5ldyBUeXBlZChfZ2F1cmQsIFwidHVwbGVcIiwgdiwgbmFtZSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqICBSZXR1cm4gYSBuZXcgYGB1aW50OGBgIHR5cGUgZm9yICUldiUlLlxuICAgICAqL1xuICAgIHN0YXRpYyBvdmVycmlkZXModikge1xuICAgICAgICByZXR1cm4gbmV3IFR5cGVkKF9nYXVyZCwgXCJvdmVycmlkZXNcIiwgT2JqZWN0LmFzc2lnbih7fSwgdikpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiAgUmV0dXJucyB0cnVlIG9ubHkgaWYgJSV2YWx1ZSUlIGlzIGEgW1tUeXBlZF1dIGluc3RhbmNlLlxuICAgICAqL1xuICAgIHN0YXRpYyBpc1R5cGVkKHZhbHVlKSB7XG4gICAgICAgIHJldHVybiAodmFsdWVcbiAgICAgICAgICAgICYmIHR5cGVvZiAodmFsdWUpID09PSBcIm9iamVjdFwiXG4gICAgICAgICAgICAmJiBcIl90eXBlZFN5bWJvbFwiIGluIHZhbHVlXG4gICAgICAgICAgICAmJiB2YWx1ZS5fdHlwZWRTeW1ib2wgPT09IF90eXBlZFN5bWJvbCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqICBJZiB0aGUgdmFsdWUgaXMgYSBbW1R5cGVkXV0gaW5zdGFuY2UsIHZhbGlkYXRlcyB0aGUgdW5kZXJseWluZyB2YWx1ZVxuICAgICAqICBhbmQgcmV0dXJucyBpdCwgb3RoZXJ3aXNlIHJldHVybnMgdmFsdWUgZGlyZWN0bHkuXG4gICAgICpcbiAgICAgKiAgVGhpcyBpcyB1c2VmdWwgZm9yIGZ1bmN0aW9ucyB0aGF0IHdpdGggdG8gYWNjZXB0IGVpdGhlciBhIFtbVHlwZWRdXVxuICAgICAqICBvYmplY3Qgb3IgdmFsdWVzLlxuICAgICAqL1xuICAgIHN0YXRpYyBkZXJlZmVyZW5jZSh2YWx1ZSwgdHlwZSkge1xuICAgICAgICBpZiAoVHlwZWQuaXNUeXBlZCh2YWx1ZSkpIHtcbiAgICAgICAgICAgIGlmICh2YWx1ZS50eXBlICE9PSB0eXBlKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBpbnZhbGlkIHR5cGU6IGV4cGVjZXRkICR7dHlwZX0sIGdvdCAke3ZhbHVlLnR5cGV9YCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gdmFsdWUudmFsdWU7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgIH1cbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXR5cGVkLmpzLm1hcCIsImltcG9ydCB7IGdldEFkZHJlc3MgfSBmcm9tIFwiLi4vLi4vYWRkcmVzcy9pbmRleC5qc1wiO1xuaW1wb3J0IHsgdG9CZUhleCB9IGZyb20gXCIuLi8uLi91dGlscy9tYXRocy5qc1wiO1xuaW1wb3J0IHsgVHlwZWQgfSBmcm9tIFwiLi4vdHlwZWQuanNcIjtcbmltcG9ydCB7IENvZGVyIH0gZnJvbSBcIi4vYWJzdHJhY3QtY29kZXIuanNcIjtcbi8qKlxuICogIEBfaWdub3JlXG4gKi9cbmV4cG9ydCBjbGFzcyBBZGRyZXNzQ29kZXIgZXh0ZW5kcyBDb2RlciB7XG4gICAgY29uc3RydWN0b3IobG9jYWxOYW1lKSB7XG4gICAgICAgIHN1cGVyKFwiYWRkcmVzc1wiLCBcImFkZHJlc3NcIiwgbG9jYWxOYW1lLCBmYWxzZSk7XG4gICAgfVxuICAgIGRlZmF1bHRWYWx1ZSgpIHtcbiAgICAgICAgcmV0dXJuIFwiMHgwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwXCI7XG4gICAgfVxuICAgIGVuY29kZSh3cml0ZXIsIF92YWx1ZSkge1xuICAgICAgICBsZXQgdmFsdWUgPSBUeXBlZC5kZXJlZmVyZW5jZShfdmFsdWUsIFwic3RyaW5nXCIpO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgdmFsdWUgPSBnZXRBZGRyZXNzKHZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl90aHJvd0Vycm9yKGVycm9yLm1lc3NhZ2UsIF92YWx1ZSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHdyaXRlci53cml0ZVZhbHVlKHZhbHVlKTtcbiAgICB9XG4gICAgZGVjb2RlKHJlYWRlcikge1xuICAgICAgICByZXR1cm4gZ2V0QWRkcmVzcyh0b0JlSGV4KHJlYWRlci5yZWFkVmFsdWUoKSwgMjApKTtcbiAgICB9XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1hZGRyZXNzLmpzLm1hcCIsImltcG9ydCB7IENvZGVyIH0gZnJvbSBcIi4vYWJzdHJhY3QtY29kZXIuanNcIjtcbi8qKlxuICogIENsb25lcyB0aGUgZnVuY3Rpb25hbGl0eSBvZiBhbiBleGlzdGluZyBDb2RlciwgYnV0IHdpdGhvdXQgYSBsb2NhbE5hbWVcbiAqXG4gKiAgQF9pZ25vcmVcbiAqL1xuZXhwb3J0IGNsYXNzIEFub255bW91c0NvZGVyIGV4dGVuZHMgQ29kZXIge1xuICAgIGNvZGVyO1xuICAgIGNvbnN0cnVjdG9yKGNvZGVyKSB7XG4gICAgICAgIHN1cGVyKGNvZGVyLm5hbWUsIGNvZGVyLnR5cGUsIFwiX1wiLCBjb2Rlci5keW5hbWljKTtcbiAgICAgICAgdGhpcy5jb2RlciA9IGNvZGVyO1xuICAgIH1cbiAgICBkZWZhdWx0VmFsdWUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmNvZGVyLmRlZmF1bHRWYWx1ZSgpO1xuICAgIH1cbiAgICBlbmNvZGUod3JpdGVyLCB2YWx1ZSkge1xuICAgICAgICByZXR1cm4gdGhpcy5jb2Rlci5lbmNvZGUod3JpdGVyLCB2YWx1ZSk7XG4gICAgfVxuICAgIGRlY29kZShyZWFkZXIpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY29kZXIuZGVjb2RlKHJlYWRlcik7XG4gICAgfVxufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9YW5vbnltb3VzLmpzLm1hcCIsImltcG9ydCB7
26774IGRlZmluZVByb3BlcnRpZXMsIGlzRXJyb3IsIGFzc2VydCwgYXNzZXJ0QXJndW1lbnQsIGFzc2VydEFyZ3VtZW50Q291bnQgfSBmcm9tIFwiLi4vLi4vdXRpbHMvaW5kZXguanNcIjtcbmltcG9ydCB7IFR5cGVkIH0gZnJvbSBcIi4uL3R5cGVkLmpzXCI7XG5pbXBvcnQgeyBDb2RlciwgUmVzdWx0LCBXb3JkU2l6ZSwgV3JpdGVyIH0gZnJvbSBcIi4vYWJzdHJhY3QtY29kZXIuanNcIjtcbmltcG9ydCB7IEFub255bW91c0NvZGVyIH0gZnJvbSBcIi4vYW5vbnltb3VzLmpzXCI7XG4vKipcbiAqICBAX2lnbm9yZVxuICovXG5leHBvcnQgZnVuY3Rpb24gcGFjayh3cml0ZXIsIGNvZGVycywgdmFsdWVzKSB7XG4gICAgbGV0IGFycmF5VmFsdWVzID0gW107XG4gICAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWVzKSkge1xuICAgICAgICBhcnJheVZhbHVlcyA9IHZhbHVlcztcbiAgICB9XG4gICAgZWxzZSBpZiAodmFsdWVzICYmIHR5cGVvZiAodmFsdWVzKSA9PT0gXCJvYmplY3RcIikge1xuICAgICAgICBsZXQgdW5pcXVlID0ge307XG4gICAgICAgIGFycmF5VmFsdWVzID0gY29kZXJzLm1hcCgoY29kZXIpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IG5hbWUgPSBjb2Rlci5sb2NhbE5hbWU7XG4gICAgICAgICAgICBhc3NlcnQobmFtZSwgXCJjYW5ub3QgZW5jb2RlIG9iamVjdCBmb3Igc2lnbmF0dXJlIHdpdGggbWlzc2luZyBuYW1lc1wiLCBcIklOVkFMSURfQVJHVU1FTlRcIiwgeyBhcmd1bWVudDogXCJ2YWx1ZXNcIiwgaW5mbzogeyBjb2RlciB9LCB2YWx1ZTogdmFsdWVzIH0pO1xuICAgICAgICAgICAgYXNzZXJ0KCF1bmlxdWVbbmFtZV0sIFwiY2Fubm90IGVuY29kZSBvYmplY3QgZm9yIHNpZ25hdHVyZSB3aXRoIGR1cGxpY2F0ZSBuYW1lc1wiLCBcIklOVkFMSURfQVJHVU1FTlRcIiwgeyBhcmd1bWVudDogXCJ2YWx1ZXNcIiwgaW5mbzogeyBjb2RlciB9LCB2YWx1ZTogdmFsdWVzIH0pO1xuICAgICAgICAgICAgdW5pcXVlW25hbWVdID0gdHJ1ZTtcbiAgICAgICAgICAgIHJldHVybiB2YWx1ZXNbbmFtZV07XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgYXNzZXJ0QXJndW1lbnQoZmFsc2UsIFwiaW52YWxpZCB0dXBsZSB2YWx1ZVwiLCBcInR1cGxlXCIsIHZhbHVlcyk7XG4gICAgfVxuICAgIGFzc2VydEFyZ3VtZW50KGNvZGVycy5sZW5ndGggPT09IGFycmF5VmFsdWVzLmxlbmd0aCwgXCJ0eXBlcy92YWx1ZSBsZW5ndGggbWlzbWF0Y2hcIiwgXCJ0dXBsZVwiLCB2YWx1ZXMpO1xuICAgIGxldCBzdGF0aWNXcml0ZXIgPSBuZXcgV3JpdGVyKCk7XG4gICAgbGV0IGR5bmFtaWNXcml0ZXIgPSBuZXcgV3JpdGVyKCk7XG4gICAgbGV0IHVwZGF0ZUZ1bmNzID0gW107XG4gICAgY29kZXJzLmZvckVhY2goKGNvZGVyLCBpbmRleCkgPT4ge1xuICAgICAgICBsZXQgdmFsdWUgPSBhcnJheVZhbHVlc1tpbmRleF07XG4gICAgICAgIGlmIChjb2Rlci5keW5hbWljKSB7XG4gICAgICAgICAgICAvLyBHZXQgY3VycmVudCBkeW5hbWljIG9mZnNldCAoZm9yIHRoZSBmdXR1cmUgcG9pbnRlcilcbiAgICAgICAgICAgIGxldCBkeW5hbWljT2Zmc2V0ID0gZHluYW1pY1dyaXRlci5sZW5ndGg7XG4gICAgICAgICAgICAvLyBFbmNvZGUgdGhlIGR5bmFtaWMgdmFsdWUgaW50byB0aGUgZHluYW1pY1dyaXRlclxuICAgICAgICAgICAgY29kZXIuZW5jb2RlKGR5bmFtaWNXcml0ZXIsIHZhbHVlKTtcbiAgICAgICAgICAgIC8vIFByZXBhcmUgdG8gcG9wdWxhdGUgdGhlIGNvcnJlY3Qgb2Zmc2V0IG9uY2Ugd2UgYXJlIGRvbmVcbiAgICAgICAgICAgIGxldCB1cGRhdGVGdW5jID0gc3RhdGljV3JpdGVyLndyaXRlVXBkYXRhYmxlVmFsdWUoKTtcbiAgICAgICAgICAgIHVwZGF0ZUZ1bmNzLnB1c2goKGJhc2VPZmZzZXQpID0+IHtcbiAgICAgICAgICAgICAgICB1cGRhdGVGdW5jKGJhc2VPZmZzZXQgKyBkeW5hbWljT2Zmc2V0KTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgY29kZXIuZW5jb2RlKHN0YXRpY1dyaXRlciwgdmFsdWUpO1xuICAgICAgICB9XG4gICAgfSk7XG4gICAgLy8gQmFja2ZpbGwgYWxsIHRoZSBkeW5hbWljIG9mZnNldHMsIG5vdyB0aGF0IHdlIGtub3cgdGhlIHN0YXRpYyBsZW5ndGhcbiAgICB1cGRhdGVGdW5jcy5mb3JFYWNoKChmdW5jKSA9PiB7IGZ1bmMoc3RhdGljV3JpdGVyLmxlbmd0aCk7IH0pO1xuICAgIGxldCBsZW5ndGggPSB3cml0ZXIuYXBwZW5kV3JpdGVyKHN0YXRpY1dyaXRlcik7XG4gICAgbGVuZ3RoICs9IHdyaXRlci5hcHBlbmRXcml0ZXIoZHluYW1pY1dyaXRlcik7XG4gICAgcmV0dXJuIGxlbmd0aDtcbn1cbi8qKlxuICogIEBfaWdub3JlXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB1bnBhY2socmVhZGVyLCBjb2RlcnMpIHtcbiAgICBsZXQgdmFsdWVzID0gW107XG4gICAgbGV0IGtleXMgPSBbXTtcbiAgICAvLyBBIHJlYWRlciBhbmNob3JlZCB0byB0aGlzIGJhc2VcbiAgICBsZXQgYmFzZVJlYWRlciA9IHJlYWRlci5zdWJSZWFkZXIoMCk7XG4gICAgY29kZXJzLmZvckVhY2goKGNvZGVyKSA9PiB7XG4gICAgICAgIGxldCB2YWx1ZSA9IG51bGw7XG4gICAgICAgIGlmIChjb2Rlci5keW5hbWljKSB7XG4gICAgICAgICAgICBsZXQgb2Zmc2V0ID0gcmVhZGVyLnJlYWRJbmRleCgpO1xuICAgICAgICAgICAgbGV0IG9mZnNldFJlYWRlciA9IGJhc2VSZWFkZXIuc3ViUmVhZGVyKG9mZnNldCk7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIHZhbHVlID0gY29kZXIuZGVjb2RlKG9mZnNldFJlYWRlcik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgICAgICAvLyBDYW5ub3QgcmVjb3ZlciBmcm9tIHRoaXNcbiAgICAgICAgICAgICAgICBpZiAoaXNFcnJvcihlcnJvciwgXCJCVUZGRVJfT1ZFUlJVTlwiKSkge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdmFsdWUgPSBlcnJvcjtcbiAgICAgICAgICAgICAgICB2YWx1ZS5iYXNlVHlwZSA9IGNvZGVyLm5hbWU7XG4gICAgICAgICAgICAgICAgdmFsdWUubmFtZSA9IGNvZGVyLmxvY2FsTmFtZTtcbiAgICAgICAgICAgICAgICB2YWx1ZS
2677450eXBlID0gY29kZXIudHlwZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgdmFsdWUgPSBjb2Rlci5kZWNvZGUocmVhZGVyKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgICAgIC8vIENhbm5vdCByZWNvdmVyIGZyb20gdGhpc1xuICAgICAgICAgICAgICAgIGlmIChpc0Vycm9yKGVycm9yLCBcIkJVRkZFUl9PVkVSUlVOXCIpKSB7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IGVycm9yO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB2YWx1ZSA9IGVycm9yO1xuICAgICAgICAgICAgICAgIHZhbHVlLmJhc2VUeXBlID0gY29kZXIubmFtZTtcbiAgICAgICAgICAgICAgICB2YWx1ZS5uYW1lID0gY29kZXIubG9jYWxOYW1lO1xuICAgICAgICAgICAgICAgIHZhbHVlLnR5cGUgPSBjb2Rlci50eXBlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmICh2YWx1ZSA9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcImludmVzdGlnYXRlXCIpO1xuICAgICAgICB9XG4gICAgICAgIHZhbHVlcy5wdXNoKHZhbHVlKTtcbiAgICAgICAga2V5cy5wdXNoKGNvZGVyLmxvY2FsTmFtZSB8fCBudWxsKTtcbiAgICB9KTtcbiAgICByZXR1cm4gUmVzdWx0LmZyb21JdGVtcyh2YWx1ZXMsIGtleXMpO1xufVxuLyoqXG4gKiAgQF9pZ25vcmVcbiAqL1xuZXhwb3J0IGNsYXNzIEFycmF5Q29kZXIgZXh0ZW5kcyBDb2RlciB7XG4gICAgY29kZXI7XG4gICAgbGVuZ3RoO1xuICAgIGNvbnN0cnVjdG9yKGNvZGVyLCBsZW5ndGgsIGxvY2FsTmFtZSkge1xuICAgICAgICBjb25zdCB0eXBlID0gKGNvZGVyLnR5cGUgKyBcIltcIiArIChsZW5ndGggPj0gMCA/IGxlbmd0aCA6IFwiXCIpICsgXCJdXCIpO1xuICAgICAgICBjb25zdCBkeW5hbWljID0gKGxlbmd0aCA9PT0gLTEgfHwgY29kZXIuZHluYW1pYyk7XG4gICAgICAgIHN1cGVyKFwiYXJyYXlcIiwgdHlwZSwgbG9jYWxOYW1lLCBkeW5hbWljKTtcbiAgICAgICAgZGVmaW5lUHJvcGVydGllcyh0aGlzLCB7IGNvZGVyLCBsZW5ndGggfSk7XG4gICAgfVxuICAgIGRlZmF1bHRWYWx1ZSgpIHtcbiAgICAgICAgLy8gVmVyaWZpZXMgdGhlIGNoaWxkIGNvZGVyIGlzIHZhbGlkIChldmVuIGlmIHRoZSBhcnJheSBpcyBkeW5hbWljIG9yIDAtbGVuZ3RoKVxuICAgICAgICBjb25zdCBkZWZhdWx0Q2hpbGQgPSB0aGlzLmNvZGVyLmRlZmF1bHRWYWx1ZSgpO1xuICAgICAgICBjb25zdCByZXN1bHQgPSBbXTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICByZXN1bHQucHVzaChkZWZhdWx0Q2hpbGQpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuICAgIGVuY29kZSh3cml0ZXIsIF92YWx1ZSkge1xuICAgICAgICBjb25zdCB2YWx1ZSA9IFR5cGVkLmRlcmVmZXJlbmNlKF92YWx1ZSwgXCJhcnJheVwiKTtcbiAgICAgICAgaWYgKCFBcnJheS5pc0FycmF5KHZhbHVlKSkge1xuICAgICAgICAgICAgdGhpcy5fdGhyb3dFcnJvcihcImV4cGVjdGVkIGFycmF5IHZhbHVlXCIsIHZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgICBsZXQgY291bnQgPSB0aGlzLmxlbmd0aDtcbiAgICAgICAgaWYgKGNvdW50ID09PSAtMSkge1xuICAgICAgICAgICAgY291bnQgPSB2YWx1ZS5sZW5ndGg7XG4gICAgICAgICAgICB3cml0ZXIud3JpdGVWYWx1ZSh2YWx1ZS5sZW5ndGgpO1xuICAgICAgICB9XG4gICAgICAgIGFzc2VydEFyZ3VtZW50Q291bnQodmFsdWUubGVuZ3RoLCBjb3VudCwgXCJjb2RlciBhcnJheVwiICsgKHRoaXMubG9jYWxOYW1lID8gKFwiIFwiICsgdGhpcy5sb2NhbE5hbWUpIDogXCJcIikpO1xuICAgICAgICBsZXQgY29kZXJzID0gW107XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdmFsdWUubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGNvZGVycy5wdXNoKHRoaXMuY29kZXIpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBwYWNrKHdyaXRlciwgY29kZXJzLCB2YWx1ZSk7XG4gICAgfVxuICAgIGRlY29kZShyZWFkZXIpIHtcbiAgICAgICAgbGV0IGNvdW50ID0gdGhpcy5sZW5ndGg7XG4gICAgICAgIGlmIChjb3VudCA9PT0gLTEpIHtcbiAgICAgICAgICAgIGNvdW50ID0gcmVhZGVyLnJlYWRJbmRleCgpO1xuICAgICAgICAgICAgLy8gQ2hlY2sgdGhhdCB0aGVyZSBpcyAqcm91Z2hseSogZW5vdWdoIGRhdGEgdG8gZW5zdXJlXG4gICAgICAgICAgICAvLyBzdHJheSByYW5kb20gZGF0YSBpcyBub3QgYmVpbmcgcmVhZCBhcyBhIGxlbmd0aC4gRWFjaFxuICAgICAgICAgICAgLy8gc2xvdCByZXF1aXJlcyBhdCBsZWFzdCAzMiBieXRlcyBmb3IgdGhlaXIgdmFsdWUgKG9yIDMyXG4gICAgICAgICAgICAvLyBieXRlcyBhcyBhIGxpbmsgdG8gdGhlIGRhdGEpLiBUaGlzIGNvdWxkIHVzZSBhIG11Y2hcbiAgICAgICAgICAgIC8vIHRpZ2h0ZXIgYm91bmQsIGJ1dCB3ZSBhcmUgZXJyb3Jpbmcgb24gdGhlIHNpZGUgb2Ygc2FmZXR5LlxuICAgICAgICAgICAgYXNzZXJ0KGNvdW50ICogV29yZFNpemUgPD0gcmVhZGVyLmRhdGFMZW5ndGgsIFwiaW5zdWZmaWNpZW50IGRhdGEgbGVuZ3RoXCIsIFwiQlVGRkVSX09WRVJSVU5cIiwgeyBidWZmZXI6IHJlYWRlci5ieXRlcywgb2Zmc2V0OiBjb3VudCAqIFdvcmRTaXplLCBsZW5ndGg6IHJlYWRlci5kYXRhTGVuZ3RoIH0pO1xuICAgICAgICB9XG4gICAgICAgIGxldCBjb2RlcnMgPSBbXTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7XG4gICAgICAgICAgICBjb2RlcnMucHVzaChuZXcgQW5vbnltb3VzQ29kZXIodGhpcy5jb2RlcikpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB1bnBhY2socmVhZGVyLCBjb2RlcnMpO1xuICAgIH1cbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWFycmF5LmpzLm1hcCIsImltcG9ydCB7IFR5cGVkIH0gZnJvbSBcIi4uL3R5cGVkLmpzXCI7XG5pbXBvcnQgeyBDb2RlciB9IGZyb20gXCIuL2Fic3RyYWN0LWNvZGVyLmpzXCI7XG4vKipcbiAqICBAX2lnbm9yZVxuICovXG5leHBvcnQgY2xhc3MgQm9vbGVhbkNvZGVyIGV4dGVuZHMgQ29kZXIge1xuICAgIGNvbnN0cnVjdG9yKGxvY2FsTmFtZSkge1xuICAgICAgICBzdXBlcihcImJvb2xcIiwgXCJib29sXCIsIGxvY2FsTmFtZSwgZmFsc2UpO1xuICAgIH1cbiAgICBkZWZhdWx0VmFsdWUoKSB7XG4gICAgICAgI
26774HJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgZW5jb2RlKHdyaXRlciwgX3ZhbHVlKSB7XG4gICAgICAgIGNvbnN0IHZhbHVlID0gVHlwZWQuZGVyZWZlcmVuY2UoX3ZhbHVlLCBcImJvb2xcIik7XG4gICAgICAgIHJldHVybiB3cml0ZXIud3JpdGVWYWx1ZSh2YWx1ZSA/IDEgOiAwKTtcbiAgICB9XG4gICAgZGVjb2RlKHJlYWRlcikge1xuICAgICAgICByZXR1cm4gISFyZWFkZXIucmVhZFZhbHVlKCk7XG4gICAgfVxufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9Ym9vbGVhbi5qcy5tYXAiLCJpbXBvcnQgeyBnZXRCeXRlc0NvcHksIGhleGxpZnkgfSBmcm9tIFwiLi4vLi4vdXRpbHMvaW5kZXguanNcIjtcbmltcG9ydCB7IENvZGVyIH0gZnJvbSBcIi4vYWJzdHJhY3QtY29kZXIuanNcIjtcbi8qKlxuICogIEBfaWdub3JlXG4gKi9cbmV4cG9ydCBjbGFzcyBEeW5hbWljQnl0ZXNDb2RlciBleHRlbmRzIENvZGVyIHtcbiAgICBjb25zdHJ1Y3Rvcih0eXBlLCBsb2NhbE5hbWUpIHtcbiAgICAgICAgc3VwZXIodHlwZSwgdHlwZSwgbG9jYWxOYW1lLCB0cnVlKTtcbiAgICB9XG4gICAgZGVmYXVsdFZhbHVlKCkge1xuICAgICAgICByZXR1cm4gXCIweFwiO1xuICAgIH1cbiAgICBlbmNvZGUod3JpdGVyLCB2YWx1ZSkge1xuICAgICAgICB2YWx1ZSA9IGdldEJ5dGVzQ29weSh2YWx1ZSk7XG4gICAgICAgIGxldCBsZW5ndGggPSB3cml0ZXIud3JpdGVWYWx1ZSh2YWx1ZS5sZW5ndGgpO1xuICAgICAgICBsZW5ndGggKz0gd3JpdGVyLndyaXRlQnl0ZXModmFsdWUpO1xuICAgICAgICByZXR1cm4gbGVuZ3RoO1xuICAgIH1cbiAgICBkZWNvZGUocmVhZGVyKSB7XG4gICAgICAgIHJldHVybiByZWFkZXIucmVhZEJ5dGVzKHJlYWRlci5yZWFkSW5kZXgoKSwgdHJ1ZSk7XG4gICAgfVxufVxuLyoqXG4gKiAgQF9pZ25vcmVcbiAqL1xuZXhwb3J0IGNsYXNzIEJ5dGVzQ29kZXIgZXh0ZW5kcyBEeW5hbWljQnl0ZXNDb2RlciB7XG4gICAgY29uc3RydWN0b3IobG9jYWxOYW1lKSB7XG4gICAgICAgIHN1cGVyKFwiYnl0ZXNcIiwgbG9jYWxOYW1lKTtcbiAgICB9XG4gICAgZGVjb2RlKHJlYWRlcikge1xuICAgICAgICByZXR1cm4gaGV4bGlmeShzdXBlci5kZWNvZGUocmVhZGVyKSk7XG4gICAgfVxufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9Ynl0ZXMuanMubWFwIiwiaW1wb3J0IHsgZGVmaW5lUHJvcGVydGllcywgZ2V0Qnl0ZXNDb3B5LCBoZXhsaWZ5IH0gZnJvbSBcIi4uLy4uL3V0aWxzL2luZGV4LmpzXCI7XG5pbXBvcnQgeyBUeXBlZCB9IGZyb20gXCIuLi90eXBlZC5qc1wiO1xuaW1wb3J0IHsgQ29kZXIgfSBmcm9tIFwiLi9hYnN0cmFjdC1jb2Rlci5qc1wiO1xuLyoqXG4gKiAgQF9pZ25vcmVcbiAqL1xuZXhwb3J0IGNsYXNzIEZpeGVkQnl0ZXNDb2RlciBleHRlbmRzIENvZGVyIHtcbiAgICBzaXplO1xuICAgIGNvbnN0cnVjdG9yKHNpemUsIGxvY2FsTmFtZSkge1xuICAgICAgICBsZXQgbmFtZSA9IFwiYnl0ZXNcIiArIFN0cmluZyhzaXplKTtcbiAgICAgICAgc3VwZXIobmFtZSwgbmFtZSwgbG9jYWxOYW1lLCBmYWxzZSk7XG4gICAgICAgIGRlZmluZVByb3BlcnRpZXModGhpcywgeyBzaXplIH0sIHsgc2l6ZTogXCJudW1iZXJcIiB9KTtcbiAgICB9XG4gICAgZGVmYXVsdFZhbHVlKCkge1xuICAgICAgICByZXR1cm4gKFwiMHgwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwXCIpLnN1YnN0cmluZygwLCAyICsgdGhpcy5zaXplICogMik7XG4gICAgfVxuICAgIGVuY29kZSh3cml0ZXIsIF92YWx1ZSkge1xuICAgICAgICBsZXQgZGF0YSA9IGdldEJ5dGVzQ29weShUeXBlZC5kZXJlZmVyZW5jZShfdmFsdWUsIHRoaXMudHlwZSkpO1xuICAgICAgICBpZiAoZGF0YS5sZW5ndGggIT09IHRoaXMuc2l6ZSkge1xuICAgICAgICAgICAgdGhpcy5fdGhyb3dFcnJvcihcImluY29ycmVjdCBkYXRhIGxlbmd0aFwiLCBfdmFsdWUpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB3cml0ZXIud3JpdGVCeXRlcyhkYXRhKTtcbiAgICB9XG4gICAgZGVjb2RlKHJlYWRlcikge1xuICAgICAgICByZXR1cm4gaGV4bGlmeShyZWFkZXIucmVhZEJ5dGVzKHRoaXMuc2l6ZSkpO1xuICAgIH1cbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWZpeGVkLWJ5dGVzLmpzLm1hcCIsImltcG9ydCB7IENvZGVyIH0gZnJvbSBcIi4vYWJzdHJhY3QtY29kZXIuanNcIjtcbmNvbnN0IEVtcHR5ID0gbmV3IFVpbnQ4QXJyYXkoW10pO1xuLyoqXG4gKiAgQF9pZ25vcmVcbiAqL1xuZXhwb3J0IGNsYXNzIE51bGxDb2RlciBleHRlbmRzIENvZGVyIHtcbiAgICBjb25zdHJ1Y3Rvcihsb2NhbE5hbWUpIHtcbiAgICAgICAgc3VwZXIoXCJudWxsXCIsIFwiXCIsIGxvY2FsTmFtZSwgZmFsc2UpO1xuICAgIH1cbiAgICBkZWZhdWx0VmFsdWUoKSB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICBlbmNvZGUod3JpdGVyLCB2YWx1ZSkge1xuICAgICAgICBpZiAodmFsdWUgIT0gbnVsbCkge1xuICAgICAgICAgICAgdGhpcy5fdGhyb3dFcnJvcihcIm5vdCBudWxsXCIsIHZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gd3JpdGVyLndyaXRlQnl0ZXMoRW1wdHkpO1xuICAgIH1cbiAgICBkZWNvZGUocmVhZGVyKSB7XG4gICAgICAgIHJlYWRlci5yZWFkQnl0ZXMoMCk7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPW51bGwuanMubWFwIiwiaW1wb3J0IHsgZGVmaW5lUHJvcGVydGllcywgZnJvbVR3b3MsIGdldEJpZ0ludCwgbWFzaywgdG9Ud29zIH0gZnJvbSBcIi4uLy4uL3V0aWxzL2luZGV4LmpzXCI7XG5pbXBvcnQgeyBUeXBlZCB9IGZyb20gXCIuLi90eXBlZC5qc1wiO1xuaW1wb3J0IHsgQ29kZXIsIFdvcmRTaXplIH0gZnJvbSBcIi4vYWJzdHJhY3QtY29kZXIuanNcIjtcbmNvbnN0IEJOXzAgPSBCaWdJbnQoMCk7XG5jb25zdCBCTl8xID0gQmlnSW50KDEpO1xuY29uc3QgQk5fTUFYX1VJTlQyNTYgPSBCaWdJbnQoXCIweGZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZcIik7XG4vKipcbiAqICBAX2lnbm9yZVxuICovXG5leHBvcnQgY2xhc3MgTnVtYmVyQ29kZXIgZXh0ZW5kcyBDb2RlciB7XG4gICAgc2l6ZTtcbiAgICBzaWduZWQ7XG4gICAgY29uc3RydWN0b3Ioc2l6ZSwgc2lnbmVkLCBsb2NhbE5hbWUpIHtcbiAgICAgICAgY29uc3QgbmFtZSA9ICgoc2lnbmVkID8gXCJpbnRcIiA6IFwidWludFwiKSArIChzaXplICogOCkpO1xuICAgICAgICBzdXBlcihuYW1lLCBuYW1lLCBsb2NhbE5hbWUsIGZhbHNlKTtcbiAgICAgICAgZGVmaW5lUHJvcGVydGllcyh0aGlzLCB7
26774IHNpemUsIHNpZ25lZCB9LCB7IHNpemU6IFwibnVtYmVyXCIsIHNpZ25lZDogXCJib29sZWFuXCIgfSk7XG4gICAgfVxuICAgIGRlZmF1bHRWYWx1ZSgpIHtcbiAgICAgICAgcmV0dXJuIDA7XG4gICAgfVxuICAgIGVuY29kZSh3cml0ZXIsIF92YWx1ZSkge1xuICAgICAgICBsZXQgdmFsdWUgPSBnZXRCaWdJbnQoVHlwZWQuZGVyZWZlcmVuY2UoX3ZhbHVlLCB0aGlzLnR5cGUpKTtcbiAgICAgICAgLy8gQ2hlY2sgYm91bmRzIGFyZSBzYWZlIGZvciBlbmNvZGluZ1xuICAgICAgICBsZXQgbWF4VWludFZhbHVlID0gbWFzayhCTl9NQVhfVUlOVDI1NiwgV29yZFNpemUgKiA4KTtcbiAgICAgICAgaWYgKHRoaXMuc2lnbmVkKSB7XG4gICAgICAgICAgICBsZXQgYm91bmRzID0gbWFzayhtYXhVaW50VmFsdWUsICh0aGlzLnNpemUgKiA4KSAtIDEpO1xuICAgICAgICAgICAgaWYgKHZhbHVlID4gYm91bmRzIHx8IHZhbHVlIDwgLShib3VuZHMgKyBCTl8xKSkge1xuICAgICAgICAgICAgICAgIHRoaXMuX3Rocm93RXJyb3IoXCJ2YWx1ZSBvdXQtb2YtYm91bmRzXCIsIF92YWx1ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB2YWx1ZSA9IHRvVHdvcyh2YWx1ZSwgOCAqIFdvcmRTaXplKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmICh2YWx1ZSA8IEJOXzAgfHwgdmFsdWUgPiBtYXNrKG1heFVpbnRWYWx1ZSwgdGhpcy5zaXplICogOCkpIHtcbiAgICAgICAgICAgIHRoaXMuX3Rocm93RXJyb3IoXCJ2YWx1ZSBvdXQtb2YtYm91bmRzXCIsIF92YWx1ZSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHdyaXRlci53cml0ZVZhbHVlKHZhbHVlKTtcbiAgICB9XG4gICAgZGVjb2RlKHJlYWRlcikge1xuICAgICAgICBsZXQgdmFsdWUgPSBtYXNrKHJlYWRlci5yZWFkVmFsdWUoKSwgdGhpcy5zaXplICogOCk7XG4gICAgICAgIGlmICh0aGlzLnNpZ25lZCkge1xuICAgICAgICAgICAgdmFsdWUgPSBmcm9tVHdvcyh2YWx1ZSwgdGhpcy5zaXplICogOCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgIH1cbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPW51bWJlci5qcy5tYXAiLCJpbXBvcnQgeyB0b1V0ZjhCeXRlcywgdG9VdGY4U3RyaW5nIH0gZnJvbSBcIi4uLy4uL3V0aWxzL3V0ZjguanNcIjtcbmltcG9ydCB7IFR5cGVkIH0gZnJvbSBcIi4uL3R5cGVkLmpzXCI7XG5pbXBvcnQgeyBEeW5hbWljQnl0ZXNDb2RlciB9IGZyb20gXCIuL2J5dGVzLmpzXCI7XG4vKipcbiAqICBAX2lnbm9yZVxuICovXG5leHBvcnQgY2xhc3MgU3RyaW5nQ29kZXIgZXh0ZW5kcyBEeW5hbWljQnl0ZXNDb2RlciB7XG4gICAgY29uc3RydWN0b3IobG9jYWxOYW1lKSB7XG4gICAgICAgIHN1cGVyKFwic3RyaW5nXCIsIGxvY2FsTmFtZSk7XG4gICAgfVxuICAgIGRlZmF1bHRWYWx1ZSgpIHtcbiAgICAgICAgcmV0dXJuIFwiXCI7XG4gICAgfVxuICAgIGVuY29kZSh3cml0ZXIsIF92YWx1ZSkge1xuICAgICAgICByZXR1cm4gc3VwZXIuZW5jb2RlKHdyaXRlciwgdG9VdGY4Qnl0ZXMoVHlwZWQuZGVyZWZlcmVuY2UoX3ZhbHVlLCBcInN0cmluZ1wiKSkpO1xuICAgIH1cbiAgICBkZWNvZGUocmVhZGVyKSB7XG4gICAgICAgIHJldHVybiB0b1V0ZjhTdHJpbmcoc3VwZXIuZGVjb2RlKHJlYWRlcikpO1xuICAgIH1cbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXN0cmluZy5qcy5tYXAiLCJpbXBvcnQgeyBkZWZpbmVQcm9wZXJ0aWVzIH0gZnJvbSBcIi4uLy4uL3V0aWxzL3Byb3BlcnRpZXMuanNcIjtcbmltcG9ydCB7IFR5cGVkIH0gZnJvbSBcIi4uL3R5cGVkLmpzXCI7XG5pbXBvcnQgeyBDb2RlciB9IGZyb20gXCIuL2Fic3RyYWN0LWNvZGVyLmpzXCI7XG5pbXBvcnQgeyBwYWNrLCB1bnBhY2sgfSBmcm9tIFwiLi9hcnJheS5qc1wiO1xuLyoqXG4gKiAgQF9pZ25vcmVcbiAqL1xuZXhwb3J0IGNsYXNzIFR1cGxlQ29kZXIgZXh0ZW5kcyBDb2RlciB7XG4gICAgY29kZXJzO1xuICAgIGNvbnN0cnVjdG9yKGNvZGVycywgbG9jYWxOYW1lKSB7XG4gICAgICAgIGxldCBkeW5hbWljID0gZmFsc2U7XG4gICAgICAgIGNvbnN0IHR5cGVzID0gW107XG4gICAgICAgIGNvZGVycy5mb3JFYWNoKChjb2RlcikgPT4ge1xuICAgICAgICAgICAgaWYgKGNvZGVyLmR5bmFtaWMpIHtcbiAgICAgICAgICAgICAgICBkeW5hbWljID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHR5cGVzLnB1c2goY29kZXIudHlwZSk7XG4gICAgICAgIH0pO1xuICAgICAgICBjb25zdCB0eXBlID0gKFwidHVwbGUoXCIgKyB0eXBlcy5qb2luKFwiLFwiKSArIFwiKVwiKTtcbiAgICAgICAgc3VwZXIoXCJ0dXBsZVwiLCB0eXBlLCBsb2NhbE5hbWUsIGR5bmFtaWMpO1xuICAgICAgICBkZWZpbmVQcm9wZXJ0aWVzKHRoaXMsIHsgY29kZXJzOiBPYmplY3QuZnJlZXplKGNvZGVycy5zbGljZSgpKSB9KTtcbiAgICB9XG4gICAgZGVmYXVsdFZhbHVlKCkge1xuICAgICAgICBjb25zdCB2YWx1ZXMgPSBbXTtcbiAgICAgICAgdGhpcy5jb2RlcnMuZm9yRWFjaCgoY29kZXIpID0+IHtcbiAgICAgICAgICAgIHZhbHVlcy5wdXNoKGNvZGVyLmRlZmF1bHRWYWx1ZSgpKTtcbiAgICAgICAgfSk7XG4gICAgICAgIC8vIFdlIG9ubHkgb3V0cHV0IG5hbWVkIHByb3BlcnRpZXMgZm9yIHVuaXF1ZWx5IG5hbWVkIGNvZGVyc1xuICAgICAgICBjb25zdCB1bmlxdWVOYW1lcyA9IHRoaXMuY29kZXJzLnJlZHVjZSgoYWNjdW0sIGNvZGVyKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBuYW1lID0gY29kZXIubG9jYWxOYW1lO1xuICAgICAgICAgICAgaWYgKG5hbWUpIHtcbiAgICAgICAgICAgICAgICBpZiAoIWFjY3VtW25hbWVdKSB7XG4gICAgICAgICAgICAgICAgICAgIGFjY3VtW25hbWVdID0gMDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgYWNjdW1bbmFtZV0rKztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBhY2N1bTtcbiAgICAgICAgfSwge30pO1xuICAgICAgICAvLyBBZGQgbmFtZWQgdmFsdWVzXG4gICAgICAgIHRoaXMuY29kZXJzLmZvckVhY2goKGNvZGVyLCBpbmRleCkgPT4ge1xuICAgICAgICAgICAgbGV0IG5hbWUgPSBjb2Rlci5sb2NhbE5hbWU7XG4gICAgICAgICAgICBpZiAoIW5hbWUgfHwgdW5pcXVlTmFtZXNbbmFtZV0gIT09IDEpIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAobmFtZSA9PT0gXCJsZW5ndGhcIikge1xuICAgICAgICAgICAgICAgIG5hbWUgPSBcIl9sZW5ndGhcIjtcbiAgICAgICAgICAgI
26774H1cbiAgICAgICAgICAgIGlmICh2YWx1ZXNbbmFtZV0gIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHZhbHVlc1tuYW1lXSA9IHZhbHVlc1tpbmRleF07XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gT2JqZWN0LmZyZWV6ZSh2YWx1ZXMpO1xuICAgIH1cbiAgICBlbmNvZGUod3JpdGVyLCBfdmFsdWUpIHtcbiAgICAgICAgY29uc3QgdmFsdWUgPSBUeXBlZC5kZXJlZmVyZW5jZShfdmFsdWUsIFwidHVwbGVcIik7XG4gICAgICAgIHJldHVybiBwYWNrKHdyaXRlciwgdGhpcy5jb2RlcnMsIHZhbHVlKTtcbiAgICB9XG4gICAgZGVjb2RlKHJlYWRlcikge1xuICAgICAgICByZXR1cm4gdW5wYWNrKHJlYWRlciwgdGhpcy5jb2RlcnMpO1xuICAgIH1cbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXR1cGxlLmpzLm1hcCIsImltcG9ydCB7IGdldEFkZHJlc3MgfSBmcm9tIFwiLi4vYWRkcmVzcy9pbmRleC5qc1wiO1xuaW1wb3J0IHsgYXNzZXJ0QXJndW1lbnQsIGlzSGV4U3RyaW5nIH0gZnJvbSBcIi4uL3V0aWxzL2luZGV4LmpzXCI7XG5mdW5jdGlvbiBhY2Nlc3NTZXRpZnkoYWRkciwgc3RvcmFnZUtleXMpIHtcbiAgICByZXR1cm4ge1xuICAgICAgICBhZGRyZXNzOiBnZXRBZGRyZXNzKGFkZHIpLFxuICAgICAgICBzdG9yYWdlS2V5czogc3RvcmFnZUtleXMubWFwKChzdG9yYWdlS2V5LCBpbmRleCkgPT4ge1xuICAgICAgICAgICAgYXNzZXJ0QXJndW1lbnQoaXNIZXhTdHJpbmcoc3RvcmFnZUtleSwgMzIpLCBcImludmFsaWQgc2xvdFwiLCBgc3RvcmFnZUtleXNbJHtpbmRleH1dYCwgc3RvcmFnZUtleSk7XG4gICAgICAgICAgICByZXR1cm4gc3RvcmFnZUtleS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICB9KVxuICAgIH07XG59XG4vKipcbiAqICBSZXR1cm5zIGEgW1tBY2Nlc3NMaXN0XV0gZnJvbSBhbnkgZXRoZXJzLXN1cHBvcnRlZCBhY2Nlc3MtbGlzdCBzdHJ1Y3R1cmUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBhY2Nlc3NMaXN0aWZ5KHZhbHVlKSB7XG4gICAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG4gICAgICAgIHJldHVybiB2YWx1ZS5tYXAoKHNldCwgaW5kZXgpID0+IHtcbiAgICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KHNldCkpIHtcbiAgICAgICAgICAgICAgICBhc3NlcnRBcmd1bWVudChzZXQubGVuZ3RoID09PSAyLCBcImludmFsaWQgc2xvdCBzZXRcIiwgYHZhbHVlWyR7aW5kZXh9XWAsIHNldCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGFjY2Vzc1NldGlmeShzZXRbMF0sIHNldFsxXSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBhc3NlcnRBcmd1bWVudChzZXQgIT0gbnVsbCAmJiB0eXBlb2YgKHNldCkgPT09IFwib2JqZWN0XCIsIFwiaW52YWxpZCBhZGRyZXNzLXNsb3Qgc2V0XCIsIFwidmFsdWVcIiwgdmFsdWUpO1xuICAgICAgICAgICAgcmV0dXJuIGFjY2Vzc1NldGlmeShzZXQuYWRkcmVzcywgc2V0LnN0b3JhZ2VLZXlzKTtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIGFzc2VydEFyZ3VtZW50KHZhbHVlICE9IG51bGwgJiYgdHlwZW9mICh2YWx1ZSkgPT09IFwib2JqZWN0XCIsIFwiaW52YWxpZCBhY2Nlc3MgbGlzdFwiLCBcInZhbHVlXCIsIHZhbHVlKTtcbiAgICBjb25zdCByZXN1bHQgPSBPYmplY3Qua2V5cyh2YWx1ZSkubWFwKChhZGRyKSA9PiB7XG4gICAgICAgIGNvbnN0IHN0b3JhZ2VLZXlzID0gdmFsdWVbYWRkcl0ucmVkdWNlKChhY2N1bSwgc3RvcmFnZUtleSkgPT4ge1xuICAgICAgICAgICAgYWNjdW1bc3RvcmFnZUtleV0gPSB0cnVlO1xuICAgICAgICAgICAgcmV0dXJuIGFjY3VtO1xuICAgICAgICB9LCB7fSk7XG4gICAgICAgIHJldHVybiBhY2Nlc3NTZXRpZnkoYWRkciwgT2JqZWN0LmtleXMoc3RvcmFnZUtleXMpLnNvcnQoKSk7XG4gICAgfSk7XG4gICAgcmVzdWx0LnNvcnQoKGEsIGIpID0+IChhLmFkZHJlc3MubG9jYWxlQ29tcGFyZShiLmFkZHJlc3MpKSk7XG4gICAgcmV0dXJuIHJlc3VsdDtcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWFjY2Vzc2xpc3QuanMubWFwIiwiaW1wb3J0IHsgZ2V0QWRkcmVzcyB9IGZyb20gXCIuLi9hZGRyZXNzL2luZGV4LmpzXCI7XG5pbXBvcnQgeyBTaWduYXR1cmUgfSBmcm9tIFwiLi4vY3J5cHRvL2luZGV4LmpzXCI7XG5pbXBvcnQgeyBnZXRCaWdJbnQgfSBmcm9tIFwiLi4vdXRpbHMvaW5kZXguanNcIjtcbmV4cG9ydCBmdW5jdGlvbiBhdXRob3JpemF0aW9uaWZ5KGF1dGgpIHtcbiAgICByZXR1cm4ge1xuICAgICAgICBhZGRyZXNzOiBnZXRBZGRyZXNzKGF1dGguYWRkcmVzcyksXG4gICAgICAgIG5vbmNlOiBnZXRCaWdJbnQoKGF1dGgubm9uY2UgIT0gbnVsbCkgPyBhdXRoLm5vbmNlIDogMCksXG4gICAgICAgIGNoYWluSWQ6IGdldEJpZ0ludCgoYXV0aC5jaGFpbklkICE9IG51bGwpID8gYXV0aC5jaGFpbklkIDogMCksXG4gICAgICAgIHNpZ25hdHVyZTogU2lnbmF0dXJlLmZyb20oYXV0aC5zaWduYXR1cmUpXG4gICAgfTtcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWF1dGhvcml6YXRpb24uanMubWFwIiwiaW1wb3J0IHsgZ2V0QWRkcmVzcyB9IGZyb20gXCIuLi9hZGRyZXNzL2luZGV4LmpzXCI7XG5pbXBvcnQgeyBrZWNjYWsyNTYsIFNpZ25pbmdLZXkgfSBmcm9tIFwiLi4vY3J5cHRvL2luZGV4LmpzXCI7XG4vKipcbiAqICBSZXR1cm5zIHRoZSBhZGRyZXNzIGZvciB0aGUgJSVrZXklJS5cbiAqXG4gKiAgVGhlIGtleSBtYXkgYmUgYW55IHN0YW5kYXJkIGZvcm0gb2YgcHVibGljIGtleSBvciBhIHByaXZhdGUga2V5LlxuICovXG5leHBvcnQgZnVuY3Rpb24gY29tcHV0ZUFkZHJlc3Moa2V5KSB7XG4gICAgbGV0IHB1YmtleTtcbiAgICBpZiAodHlwZW9mIChrZXkpID09PSBcInN0cmluZ1wiKSB7XG4gICAgICAgIHB1YmtleSA9IFNpZ25pbmdLZXkuY29tcHV0ZVB1YmxpY0tleShrZXksIGZhbHNlKTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIHB1YmtleSA9IGtleS5wdWJsaWNLZXk7XG4gICAgfVxuICAgIHJldHVybiBnZXRBZGRyZXNzKGtlY2NhazI1NihcIjB4XCIgKyBwdWJrZXkuc3Vic3RyaW5nKDQpKS5zdWJzdHJpbmcoMjYpKTtcbn1cbi8qKlxuICogIFJldHVybnMgdGhlIHJlY292ZXJlZCBhZGRyZXNzIGZvciB0aGUgcHJpdmF0ZSBrZXkgdGhhdCB3YXNcbiAqICB1c2VkIHRvIHNpZ24gJSVkaWdlc3QlJSB0aGF0IHJlc3VsdGVkIGluICUlc2lnbmF0dXJlJSUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZWNvdmVyQWRkcmVzcyhkaWdlc3QsIHNpZ25hdHVyZSkge1xuICAgIHJldHVybi
26774Bjb21wdXRlQWRkcmVzcyhTaWduaW5nS2V5LnJlY292ZXJQdWJsaWNLZXkoZGlnZXN0LCBzaWduYXR1cmUpKTtcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWFkZHJlc3MuanMubWFwIiwiaW1wb3J0IHsgZ2V0QWRkcmVzcyB9IGZyb20gXCIuLi9hZGRyZXNzL2luZGV4LmpzXCI7XG5pbXBvcnQgeyBaZXJvQWRkcmVzcyB9IGZyb20gXCIuLi9jb25zdGFudHMvYWRkcmVzc2VzLmpzXCI7XG5pbXBvcnQgeyBrZWNjYWsyNTYsIHNoYTI1NiwgU2lnbmF0dXJlLCBTaWduaW5nS2V5IH0gZnJvbSBcIi4uL2NyeXB0by9pbmRleC5qc1wiO1xuaW1wb3J0IHsgY29uY2F0LCBkZWNvZGVSbHAsIGVuY29kZVJscCwgZ2V0Qnl0ZXMsIGdldEJpZ0ludCwgZ2V0TnVtYmVyLCBoZXhsaWZ5LCBhc3NlcnQsIGFzc2VydEFyZ3VtZW50LCBpc0J5dGVzTGlrZSwgaXNIZXhTdHJpbmcsIHRvQmVBcnJheSwgemVyb1BhZFZhbHVlIH0gZnJvbSBcIi4uL3V0aWxzL2luZGV4LmpzXCI7XG5pbXBvcnQgeyBhY2Nlc3NMaXN0aWZ5IH0gZnJvbSBcIi4vYWNjZXNzbGlzdC5qc1wiO1xuaW1wb3J0IHsgYXV0aG9yaXphdGlvbmlmeSB9IGZyb20gXCIuL2F1dGhvcml6YXRpb24uanNcIjtcbmltcG9ydCB7IHJlY292ZXJBZGRyZXNzIH0gZnJvbSBcIi4vYWRkcmVzcy5qc1wiO1xuY29uc3QgQk5fMCA9IEJpZ0ludCgwKTtcbmNvbnN0IEJOXzIgPSBCaWdJbnQoMik7XG5jb25zdCBCTl8yNyA9IEJpZ0ludCgyNyk7XG5jb25zdCBCTl8yOCA9IEJpZ0ludCgyOCk7XG5jb25zdCBCTl8zNSA9IEJpZ0ludCgzNSk7XG5jb25zdCBCTl9NQVhfVUlOVCA9IEJpZ0ludChcIjB4ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZlwiKTtcbmNvbnN0IGluc3BlY3QgPSBTeW1ib2wuZm9yKFwibm9kZWpzLnV0aWwuaW5zcGVjdC5jdXN0b21cIik7XG5jb25zdCBCTE9CX1NJWkUgPSA0MDk2ICogMzI7XG5jb25zdCBDRUxMX0NPVU5UID0gMTI4O1xuLyoqXG4gKiAgUmV0dXJucyBhIEJMT2IgcHJvb2YgYXMgaXRzIGNlbGxzIGZvciBbW2xpbmstZWlwLTc1OTRdXSBCTE9iLlxuICpcbiAqICBUaGUgZGVmYXVsdCAlJWNlbGxDb3VudCUlIGlzIDEyOC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNwbGl0QmxvYkNlbGxzKF9wcm9vZiwgY2VsbENvdW50KSB7XG4gICAgaWYgKGNlbGxDb3VudCA9PSBudWxsKSB7XG4gICAgICAgIGNlbGxDb3VudCA9IENFTExfQ09VTlQ7XG4gICAgfVxuICAgIGNvbnN0IGNlbGxQcm9vZnMgPSBbXTtcbiAgICBjb25zdCBwcm9vZiA9IGdldEJ5dGVzKF9wcm9vZik7XG4gICAgY29uc3QgY2VsbFNpemUgPSBwcm9vZi5sZW5ndGggLyBjZWxsQ291bnQ7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBwcm9vZi5sZW5ndGg7IGkgKz0gY2VsbFNpemUpIHtcbiAgICAgICAgY2VsbFByb29mcy5wdXNoKGhleGxpZnkocHJvb2Yuc3ViYXJyYXkoaSwgaSArIGNlbGxTaXplKSkpO1xuICAgIH1cbiAgICByZXR1cm4gY2VsbFByb29mcztcbn1cbmZ1bmN0aW9uIGdldEt6Z0xpYnJhcnkoa3pnKSB7XG4gICAgY29uc3QgYmxvYlRvS3pnQ29tbWl0bWVudCA9IChibG9iKSA9PiB7XG4gICAgICAgIGlmIChcImNvbXB1dGVCbG9iUHJvb2ZcIiBpbiBremcpIHtcbiAgICAgICAgICAgIC8vIG1pY3JvLWVjYy1zaWduZXI7IGNoZWNrIGZvciBjb21wdXRlQmxvYlByb29mIHNpbmNlIHRoaXMgQVBJXG4gICAgICAgICAgICAvLyBleHBlY3RzIGEgc3RyaW5nIHdoaWxlIHRoZSBremctd2FzbSBiZWxvdyBleHBlY3RzIGEgVW5pdDhBcnJheVxuICAgICAgICAgICAgaWYgKFwiYmxvYlRvS3pnQ29tbWl0bWVudFwiIGluIGt6ZyAmJiB0eXBlb2YgKGt6Zy5ibG9iVG9LemdDb21taXRtZW50KSA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGdldEJ5dGVzKGt6Zy5ibG9iVG9LemdDb21taXRtZW50KGhleGxpZnkoYmxvYikpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChcImJsb2JUb0t6Z0NvbW1pdG1lbnRcIiBpbiBremcgJiYgdHlwZW9mIChremcuYmxvYlRvS3pnQ29tbWl0bWVudCkgPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICAgICAgLy8ga3pnLXdhc20gPDAuNS4wOyBibG9iVG9LemdDb21taXRtZW50KFVpbnQ4QXJyYXkpID0+IFVpbnQ4QXJyYXlcbiAgICAgICAgICAgIHJldHVybiBnZXRCeXRlcyhremcuYmxvYlRvS3pnQ29tbWl0bWVudChibG9iKSk7XG4gICAgICAgIH1cbiAgICAgICAgLy8ga3pnLXdhc20gPj0gMC41LjA7IGJsb2JUb0taR0NvbW1pdG1lbnQoc3RyaW5nKSA9PiBzdHJpbmdcbiAgICAgICAgaWYgKFwiYmxvYlRvS1pHQ29tbWl0bWVudFwiIGluIGt6ZyAmJiB0eXBlb2YgKGt6Zy5ibG9iVG9LWkdDb21taXRtZW50KSA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgICAgICByZXR1cm4gZ2V0Qnl0ZXMoa3pnLmJsb2JUb0taR0NvbW1pdG1lbnQoaGV4bGlmeShibG9iKSkpO1xuICAgICAgICB9XG4gICAgICAgIGFzc2VydEFyZ3VtZW50KGZhbHNlLCBcInVuc3VwcG9ydGVkIEtaRyBsaWJyYXJ5XCIsIFwia3pnXCIsIGt6Zyk7XG4gICAgfTtcbiAgICBjb25zdCBjb21wdXRlQmxvYkt6Z1Byb29mID0gKGJsb2IsIGNvbW1pdG1lbnQpID0+IHtcbiAgICAgICAgLy8gbWljcm8tZWNjLXNpZ25lclxuICAgICAgICBpZiAoXCJjb21wdXRlQmxvYlByb29mXCIgaW4ga3pnICYmIHR5cGVvZiAoa3pnLmNvbXB1dGVCbG9iUHJvb2YpID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgICAgIHJldHVybiBnZXRCeXRlcyhremcuY29tcHV0ZUJsb2JQcm9vZihoZXhsaWZ5KGJsb2IpLCBoZXhsaWZ5KGNvbW1pdG1lbnQpKSk7XG4gICAgICAgIH1cbiAgICAgICAgLy8ga3pnLXdhc20gPDAuNS4wOyBjb21wdXRlQmxvYkt6Z1Byb29mKFVpbnQ4QXJyYXksIFVpbnQ4QXJyYXkpID0+IFVpbnQ4QXJyYXlcbiAgICAgICAgaWYgKFwiY29tcHV0ZUJsb2JLemdQcm9vZlwiIGluIGt6ZyAmJiB0eXBlb2YgKGt6Zy5jb21wdXRlQmxvYkt6Z1Byb29mKSA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgICAgICByZXR1cm4ga3pnLmNvbXB1dGVCbG9iS3pnUHJvb2YoYmxvYiwgY29tbWl0bWVudCk7XG4gICAgICAgI
26774H1cbiAgICAgICAgLy8ga3pnLXdhc20gPj0gMC41LjA7IGNvbXB1dGVCbG9iS1pHUHJvb2Yoc3RyaW5nLCBzdHJpbmcpID0+IHN0cmluZ1xuICAgICAgICBpZiAoXCJjb21wdXRlQmxvYktaR1Byb29mXCIgaW4ga3pnICYmIHR5cGVvZiAoa3pnLmNvbXB1dGVCbG9iS1pHUHJvb2YpID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgICAgIHJldHVybiBnZXRCeXRlcyhremcuY29tcHV0ZUJsb2JLWkdQcm9vZihoZXhsaWZ5KGJsb2IpLCBoZXhsaWZ5KGNvbW1pdG1lbnQpKSk7XG4gICAgICAgIH1cbiAgICAgICAgYXNzZXJ0QXJndW1lbnQoZmFsc2UsIFwidW5zdXBwb3J0ZWQgS1pHIGxpYnJhcnlcIiwgXCJremdcIiwga3pnKTtcbiAgICB9O1xuICAgIHJldHVybiB7IGJsb2JUb0t6Z0NvbW1pdG1lbnQsIGNvbXB1dGVCbG9iS3pnUHJvb2YgfTtcbn1cbmZ1bmN0aW9uIGdldFZlcnNpb25lZEhhc2godmVyc2lvbiwgaGFzaCkge1xuICAgIGxldCB2ZXJzaW9uZWQgPSB2ZXJzaW9uLnRvU3RyaW5nKDE2KTtcbiAgICB3aGlsZSAodmVyc2lvbmVkLmxlbmd0aCA8IDIpIHtcbiAgICAgICAgdmVyc2lvbmVkID0gXCIwXCIgKyB2ZXJzaW9uZWQ7XG4gICAgfVxuICAgIHZlcnNpb25lZCArPSBzaGEyNTYoaGFzaCkuc3Vic3RyaW5nKDQpO1xuICAgIHJldHVybiBcIjB4XCIgKyB2ZXJzaW9uZWQ7XG59XG5mdW5jdGlvbiBoYW5kbGVBZGRyZXNzKHZhbHVlKSB7XG4gICAgaWYgKHZhbHVlID09PSBcIjB4XCIpIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIHJldHVybiBnZXRBZGRyZXNzKHZhbHVlKTtcbn1cbmZ1bmN0aW9uIGhhbmRsZUFjY2Vzc0xpc3QodmFsdWUsIHBhcmFtKSB7XG4gICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIGFjY2Vzc0xpc3RpZnkodmFsdWUpO1xuICAgIH1cbiAgICBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgYXNzZXJ0QXJndW1lbnQoZmFsc2UsIGVycm9yLm1lc3NhZ2UsIHBhcmFtLCB2YWx1ZSk7XG4gICAgfVxufVxuZnVuY3Rpb24gaGFuZGxlQXV0aG9yaXphdGlvbkxpc3QodmFsdWUsIHBhcmFtKSB7XG4gICAgdHJ5IHtcbiAgICAgICAgaWYgKCFBcnJheS5pc0FycmF5KHZhbHVlKSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiYXV0aG9yaXphdGlvbkxpc3Q6IGludmFsaWQgYXJyYXlcIik7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgcmVzdWx0ID0gW107XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdmFsdWUubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGNvbnN0IGF1dGggPSB2YWx1ZVtpXTtcbiAgICAgICAgICAgIGlmICghQXJyYXkuaXNBcnJheShhdXRoKSkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgYXV0aG9yaXphdGlvblske2l9XTogaW52YWxpZCBhcnJheWApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGF1dGgubGVuZ3RoICE9PSA2KSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBhdXRob3JpemF0aW9uWyR7aX1dOiB3cm9uZyBsZW5ndGhgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICghYXV0aFsxXSkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgYXV0aG9yaXphdGlvblske2l9XTogbnVsbCBhZGRyZXNzYCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXN1bHQucHVzaCh7XG4gICAgICAgICAgICAgICAgYWRkcmVzczogaGFuZGxlQWRkcmVzcyhhdXRoWzFdKSxcbiAgICAgICAgICAgICAgICBub25jZTogaGFuZGxlVWludChhdXRoWzJdLCBcIm5vbmNlXCIpLFxuICAgICAgICAgICAgICAgIGNoYWluSWQ6IGhhbmRsZVVpbnQoYXV0aFswXSwgXCJjaGFpbklkXCIpLFxuICAgICAgICAgICAgICAgIHNpZ25hdHVyZTogU2lnbmF0dXJlLmZyb20oe1xuICAgICAgICAgICAgICAgICAgICB5UGFyaXR5OiBoYW5kbGVOdW1iZXIoYXV0aFszXSwgXCJ5UGFyaXR5XCIpLFxuICAgICAgICAgICAgICAgICAgICByOiB6ZXJvUGFkVmFsdWUoYXV0aFs0XSwgMzIpLFxuICAgICAgICAgICAgICAgICAgICBzOiB6ZXJvUGFkVmFsdWUoYXV0aFs1XSwgMzIpXG4gICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuICAgIGNhdGNoIChlcnJvcikge1xuICAgICAgICBhc3NlcnRBcmd1bWVudChmYWxzZSwgZXJyb3IubWVzc2FnZSwgcGFyYW0sIHZhbHVlKTtcbiAgICB9XG59XG5mdW5jdGlvbiBoYW5kbGVOdW1iZXIoX3ZhbHVlLCBwYXJhbSkge1xuICAgIGlmIChfdmFsdWUgPT09IFwiMHhcIikge1xuICAgICAgICByZXR1cm4gMDtcbiAgICB9XG4gICAgcmV0dXJuIGdldE51bWJlcihfdmFsdWUsIHBhcmFtKTtcbn1cbmZ1bmN0aW9uIGhhbmRsZVVpbnQoX3ZhbHVlLCBwYXJhbSkge1xuICAgIGlmIChfdmFsdWUgPT09IFwiMHhcIikge1xuICAgICAgICByZXR1cm4gQk5fMDtcbiAgICB9XG4gICAgY29uc3QgdmFsdWUgPSBnZXRCaWdJbnQoX3ZhbHVlLCBwYXJhbSk7XG4gICAgYXNzZXJ0QXJndW1lbnQodmFsdWUgPD0gQk5fTUFYX1VJTlQsIFwidmFsdWUgZXhjZWVkcyB1aW50IHNpemVcIiwgcGFyYW0sIHZhbHVlKTtcbiAgICByZXR1cm4gdmFsdWU7XG59XG5mdW5jdGlvbiBmb3JtYXROdW1iZXIoX3ZhbHVlLCBuYW1lKSB7XG4gICAgY29uc3QgdmFsdWUgPSBnZXRCaWdJbnQoX3ZhbHVlLCBcInZhbHVlXCIpO1xuICAgIGNvbnN0IHJlc3VsdCA9IHRvQmVBcnJheSh2YWx1ZSk7XG4gICAgYXNzZXJ0QXJndW1lbnQocmVzdWx0Lmxlbmd0aCA8PSAzMiwgYHZhbHVlIHRvbyBsYXJnZWAsIGB0eC4ke25hbWV9YCwgdmFsdWUpO1xuICAgIHJldHVybiByZXN1bHQ7XG59XG5mdW5jdGlvbiBmb3JtYXRBY2Nlc3NMaXN0KHZhbHVlKSB7XG4gICAgcmV0dXJuIGFjY2Vzc0xpc3RpZnkodmFsdWUpLm1hcCgoc2V0KSA9PiBbc2V0LmFkZHJlc3MsIHNldC5zdG9yYWdlS2V5c10pO1xufVxuZnVuY3Rpb24gZm9ybWF0QXV0aG9yaXphdGlvbkxpc3QodmFsdWUpIHtcbiAgICByZXR1cm4gdmFsdWUubWFwKChhKSA9PiB7XG4gICAgICAgIHJldHVybiBbXG4gICAgICAgICAgICBmb3JtYXROdW1iZXIoYS5jaGFpbklkLCBcImNoYWluSWRcIiksXG4gICAgICAgICAgICBhLmFkZHJlc3MsXG4gICAgICAgICAgICBmb3JtYXROdW1iZXIoYS5ub25jZSwgXCJub25jZVwiKSxcbiAgICAgICAgICAgIGZvcm1hdE51bWJlcihhLnNpZ25hdHVyZS55UGFyaXR5LCBcInlQYXJpdHlcIiksXG4gICAgICAgICAgICB0b0JlQXJyYXkoYS5zaWduYXR1cmUuciksXG4gICAgICAgICAgICB0b0JlQXJyYXkoYS5zaWduYXR1cmUuX3MpXG4gICAgICAgIF07XG4gICAgfSk7XG59XG5mdW5jdGlvbiBmb3JtYXRIYXNoZXModmFsdWUsIHBhcmFtKSB7XG4gICAgYXNzZXJ0QXJndW1lbnQoQXJyYXkuaXNBcnJheSh2YWx1ZSksIGBpbnZhbGlkICR7cGFyYW19YCwgXCJ2YWx1ZVwiLCB2YWx1ZSk7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCB2YWx1ZS
267745sZW5ndGg7IGkrKykge1xuICAgICAgICBhc3NlcnRBcmd1bWVudChpc0hleFN0cmluZyh2YWx1ZVtpXSwgMzIpLCBcImludmFsaWQgJHsgcGFyYW0gfSBoYXNoXCIsIGB2YWx1ZVske2l9XWAsIHZhbHVlW2ldKTtcbiAgICB9XG4gICAgcmV0dXJuIHZhbHVlO1xufVxuZnVuY3Rpb24gX3BhcnNlTGVnYWN5KGRhdGEpIHtcbiAgICBjb25zdCBmaWVsZHMgPSBkZWNvZGVSbHAoZGF0YSk7XG4gICAgYXNzZXJ0QXJndW1lbnQoQXJyYXkuaXNBcnJheShmaWVsZHMpICYmIChmaWVsZHMubGVuZ3RoID09PSA5IHx8IGZpZWxkcy5sZW5ndGggPT09IDYpLCBcImludmFsaWQgZmllbGQgY291bnQgZm9yIGxlZ2FjeSB0cmFuc2FjdGlvblwiLCBcImRhdGFcIiwgZGF0YSk7XG4gICAgY29uc3QgdHggPSB7XG4gICAgICAgIHR5cGU6IDAsXG4gICAgICAgIG5vbmNlOiBoYW5kbGVOdW1iZXIoZmllbGRzWzBdLCBcIm5vbmNlXCIpLFxuICAgICAgICBnYXNQcmljZTogaGFuZGxlVWludChmaWVsZHNbMV0sIFwiZ2FzUHJpY2VcIiksXG4gICAgICAgIGdhc0xpbWl0OiBoYW5kbGVVaW50KGZpZWxkc1syXSwgXCJnYXNMaW1pdFwiKSxcbiAgICAgICAgdG86IGhhbmRsZUFkZHJlc3MoZmllbGRzWzNdKSxcbiAgICAgICAgdmFsdWU6IGhhbmRsZVVpbnQoZmllbGRzWzRdLCBcInZhbHVlXCIpLFxuICAgICAgICBkYXRhOiBoZXhsaWZ5KGZpZWxkc1s1XSksXG4gICAgICAgIGNoYWluSWQ6IEJOXzBcbiAgICB9O1xuICAgIC8vIExlZ2FjeSB1bnNpZ25lZCB0cmFuc2FjdGlvblxuICAgIGlmIChmaWVsZHMubGVuZ3RoID09PSA2KSB7XG4gICAgICAgIHJldHVybiB0eDtcbiAgICB9XG4gICAgY29uc3QgdiA9IGhhbmRsZVVpbnQoZmllbGRzWzZdLCBcInZcIik7XG4gICAgY29uc3QgciA9IGhhbmRsZVVpbnQoZmllbGRzWzddLCBcInJcIik7XG4gICAgY29uc3QgcyA9IGhhbmRsZVVpbnQoZmllbGRzWzhdLCBcInNcIik7XG4gICAgaWYgKHIgPT09IEJOXzAgJiYgcyA9PT0gQk5fMCkge1xuICAgICAgICAvLyBFSVAtMTU1IHVuc2lnbmVkIHRyYW5zYWN0aW9uXG4gICAgICAgIHR4LmNoYWluSWQgPSB2O1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgLy8gQ29tcHV0ZSB0aGUgRUlQLTE1NSBjaGFpbiBJRCAob3IgMCBmb3IgbGVnYWN5KVxuICAgICAgICBsZXQgY2hhaW5JZCA9ICh2IC0gQk5fMzUpIC8gQk5fMjtcbiAgICAgICAgaWYgKGNoYWluSWQgPCBCTl8wKSB7XG4gICAgICAgICAgICBjaGFpbklkID0gQk5fMDtcbiAgICAgICAgfVxuICAgICAgICB0eC5jaGFpbklkID0gY2hhaW5JZDtcbiAgICAgICAgLy8gU2lnbmVkIExlZ2FjeSBUcmFuc2FjdGlvblxuICAgICAgICBhc3NlcnRBcmd1bWVudChjaGFpbklkICE9PSBCTl8wIHx8ICh2ID09PSBCTl8yNyB8fCB2ID09PSBCTl8yOCksIFwibm9uLWNhbm9uaWNhbCBsZWdhY3kgdlwiLCBcInZcIiwgZmllbGRzWzZdKTtcbiAgICAgICAgdHguc2lnbmF0dXJlID0gU2lnbmF0dXJlLmZyb20oe1xuICAgICAgICAgICAgcjogemVyb1BhZFZhbHVlKGZpZWxkc1s3XSwgMzIpLFxuICAgICAgICAgICAgczogemVyb1BhZFZhbHVlKGZpZWxkc1s4XSwgMzIpLFxuICAgICAgICAgICAgdlxuICAgICAgICB9KTtcbiAgICAgICAgLy90eC5oYXNoID0ga2VjY2FrMjU2KGRhdGEpO1xuICAgIH1cbiAgICByZXR1cm4gdHg7XG59XG5mdW5jdGlvbiBfc2VyaWFsaXplTGVnYWN5KHR4LCBzaWcpIHtcbiAgICBjb25zdCBmaWVsZHMgPSBbXG4gICAgICAgIGZvcm1hdE51bWJlcih0eC5ub25jZSwgXCJub25jZVwiKSxcbiAgICAgICAgZm9ybWF0TnVtYmVyKHR4Lmdhc1ByaWNlIHx8IDAsIFwiZ2FzUHJpY2VcIiksXG4gICAgICAgIGZvcm1hdE51bWJlcih0eC5nYXNMaW1pdCwgXCJnYXNMaW1pdFwiKSxcbiAgICAgICAgKHR4LnRvIHx8IFwiMHhcIiksXG4gICAgICAgIGZvcm1hdE51bWJlcih0eC52YWx1ZSwgXCJ2YWx1ZVwiKSxcbiAgICAgICAgdHguZGF0YSxcbiAgICBdO1xuICAgIGxldCBjaGFpbklkID0gQk5fMDtcbiAgICBpZiAodHguY2hhaW5JZCAhPSBCTl8wKSB7XG4gICAgICAgIC8vIEEgY2hhaW5JZCB3YXMgcHJvdmlkZWQ7IGlmIG5vbi16ZXJvIHdlJ2xsIHVzZSBFSVAtMTU1XG4gICAgICAgIGNoYWluSWQgPSBnZXRCaWdJbnQodHguY2hhaW5JZCwgXCJ0eC5jaGFpbklkXCIpO1xuICAgICAgICAvLyBXZSBoYXZlIGEgY2hhaW5JZCBpbiB0aGUgdHggYW5kIGFuIEVJUC0xNTUgdiBpbiB0aGUgc2lnbmF0dXJlLFxuICAgICAgICAvLyBtYWtlIHN1cmUgdGhleSBhZ3JlZSB3aXRoIGVhY2ggb3RoZXJcbiAgICAgICAgYXNzZXJ0QXJndW1lbnQoIXNpZyB8fCBzaWcubmV0d29ya1YgPT0gbnVsbCB8fCBzaWcubGVnYWN5Q2hhaW5JZCA9PT0gY2hhaW5JZCwgXCJ0eC5jaGFpbklkL3NpZy52IG1pc21hdGNoXCIsIFwic2lnXCIsIHNpZyk7XG4gICAgfVxuICAgIGVsc2UgaWYgKHR4LnNpZ25hdHVyZSkge1xuICAgICAgICAvLyBObyBleHBsaWNpdCBjaGFpbklkLCBidXQgRUlQLTE1NSBoYXZlIGEgZGVyaXZlZCBpbXBsaWNpdCBjaGFpbklkXG4gICAgICAgIGNvbnN0IGxlZ2FjeSA9IHR4LnNpZ25hdHVyZS5sZWdhY3lDaGFpbklkO1xuICAgICAgICBpZiAobGVnYWN5ICE9IG51bGwpIHtcbiAgICAgICAgICAgIGNoYWluSWQgPSBsZWdhY3k7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLy8gUmVxdWVzdGluZyBhbiB1bnNpZ25lZCB0cmFuc2FjdGlvblxuICAgIGlmICghc2lnKSB7XG4gICAgICAgIC8vIFdlIGhhdmUgYW4gRUlQLTE1NSB0cmFuc2FjdGlvbiAoY2hhaW5JZCB3YXMgc3BlY2lmaWVkIGFuZCBub24temVybylcbiAgICAgICAgaWYgKGNoYWluSWQgIT09IEJOXzApIHtcbiAgICAgICAgICAgIGZpZWxkcy5wdXNoKHRvQmVBcnJheShjaGFpbklkKSk7XG4gICAgICAgICAgICBmaWVsZHMucHVzaChcIjB4XCIpO1xuICAgICAgICAgICAgZmllbGRzLnB1c2goXCIweFwiKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZW5jb2RlUmxwKGZpZWxkcyk7XG4gICAgfVxuICAgIC8vIEBUT0RPOiBXZSBzaG91bGQgcHJvYmFibHkgY2hlY2sgdGhhdCB0eC5zaWduYXR1cmUsIGNoYWluSWQsIGFuZCBzaWdcbiAgICAvLyAgICAgICAgbWF0Y2ggYnV0IHRoYXQgbG9naWMgY291bGQgYnJlYWsgZXhpc3RpbmcgY29kZSwgc28gc2NoZWR1bGVcbiAgICAvLyAgICAgICAgdGhpcyBmb3IgdGhlIG5leHQgbWFqb3IgYnVtcC5cbiAgICAvLyBDb21wdXRlIHRoZSBFSVAtMTU1IHZcbiAgICBsZXQgdiA9IEJpZ0ludCgyNyArIHNpZy55UGFyaXR5KTtcbiAgICBpZiAoY2hhaW5JZCAhPT0gQk5fMCkge1xuICAgICAgICB2ID0gU2lnbmF0dXJlLmdldENoYWluSWRWKGNoYWluSWQsIHNpZy52KTtcbiAgICB9XG4gICAgZWxzZSBpZiAoQmlnSW50KHNpZy52KSAhPT0gdikge1xuICAgICAgICBhc3NlcnRBcmd1bWVudChmYWxzZSwgXCJ0eC5jaGFpbklkL3NpZy52IG1pc21hdGNoXCIsIFwic2lnXCIsIHNpZyk7XG4gICAgfVxuICAgIC8vIEFkZCB0aGUgc2lnbmF0dXJlXG4gICAgZmllbGRzLnB1c2godG9CZUFycmF5KHYpKTtcbiAgICBmaWVsZHMucHVzaCh0b0JlQXJyYXkoc2lnLnIpKTtcbiAgICBmaWVsZHMucHVzaCh0b0JlQXJyYXkoc2lnLl9zKSk7XG4gICAgcmV0dXJuIGVuY29kZVJscChmaWVsZHMpO1xufVxuZnVuY3Rpb24gX3BhcnNlRWlwU2lnbmF0dXJlKHR4LCBmaWVsZHMpIHtcbiAgICBsZXQgeVBhcml0eTtcbiAgICB0cnkge1xuICAgICAgICB5UGFyaXR5ID0gaGFuZGxlTnVtYmVyKGZpZWxkc1swXSwgXCJ5UGFyaXR5XCIpO1xuICAgICAgICBpZiAoeVBhcml0eSAhPT0gMCAmJiB5UGFyaXR5ICE9PSAxKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJiYWQgeVBhcml0eVwiKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgYXNzZXJ0QXJndW1lbnQoZmFsc2UsIFwiaW52YWxpZCB5UGFyaXR5XCIsIFwieVBhcml0eVwiLCBmaWVsZHNbMF0pO1xuICAgIH1cbiAgICBjb25zdCByID0gemVyb1BhZFZhbHVlKGZpZWxkc1sxXSwgMzIpO1xuICAgIGNvbnN0IHMgPSB6ZXJvUGFkVmFsdWUoZmllbGRzWzJdLCAzMik7XG4gICAgY29uc3Qgc2lnbmF0dXJlID0gU2lnbmF0dXJlLmZyb20oeyByLCBzLCB5UGFyaXR5IH0pO1xuICAgIHR4LnNpZ25hdHVyZSA9IHNpZ25hdHVyZTtcbn1cbmZ1bmN0aW9uIF9wYXJzZUVpcDE1NTkoZGF0YSkge1xuICAgIGNvbnN0IGZpZWxkcyA9IGRlY29kZVJscChnZXRCeXRlcyhkYXRhKS5zbGljZSgxKSk7XG4gICAgYXNzZXJ0QXJndW1lbnQoQXJyYXkuaXNBcnJheShmaWVsZHMpICYmIChmaWVsZHMubGVuZ3RoID09PSA5IHx8IGZpZWxkcy5sZW5ndGggPT09IDEyKSwgXCJpbnZhbGlkIGZpZWxkIGNvdW50IGZvciB0cmFuc2FjdGlvbiB0eXBlOiAyXCIsIFwiZGF0YVwiLCBoZXhsaWZ5KGRhdGEpKTtcbiAgICBjb25zdCB0eCA9IHtcbiAgICAgICAgdHlwZTogMixcbiAgICAgICAgY2hhaW5JZDogaGFuZGxlVWludChmaWVsZHNbMF0sIFwiY2hhaW5JZFwiKSxcbiAgICAgICAgbm9uY2U6IGhhbmRsZU51bWJlcihmaWVsZHNbMV0sIFwibm9uY2VcIiksXG4gICAgICAgIG1heFByaW9yaXR5RmVlUGVyR2FzOiBoYW5kbGVVaW50KGZpZWxkc1syXSwgXCJtYXhQcmlvcml0eUZlZVBlckdhc1wiKSxcbiAgICAgICAgbWF4RmVlUGVyR2FzOiBoYW5kbGVVaW50KGZpZWxkc1szXSwgXCJtYXhGZWVQZXJHYXNcIiksXG4gICAgICAgIGdhc1ByaWNlOiBudWxsLFxuICAgICAgICBnYXNMaW1pdDogaGFuZGxlVWludChmaWVsZHNbNF0sIFwiZ2FzTGltaXRcIiksXG4gICAgICAgI
26774HRvOiBoYW5kbGVBZGRyZXNzKGZpZWxkc1s1XSksXG4gICAgICAgIHZhbHVlOiBoYW5kbGVVaW50KGZpZWxkc1s2XSwgXCJ2YWx1ZVwiKSxcbiAgICAgICAgZGF0YTogaGV4bGlmeShmaWVsZHNbN10pLFxuICAgICAgICBhY2Nlc3NMaXN0OiBoYW5kbGVBY2Nlc3NMaXN0KGZpZWxkc1s4XSwgXCJhY2Nlc3NMaXN0XCIpLFxuICAgIH07XG4gICAgLy8gVW5zaWduZWQgRUlQLTE1NTkgVHJhbnNhY3Rpb25cbiAgICBpZiAoZmllbGRzLmxlbmd0aCA9PT0gOSkge1xuICAgICAgICByZXR1cm4gdHg7XG4gICAgfVxuICAgIC8vdHguaGFzaCA9IGtlY2NhazI1NihkYXRhKTtcbiAgICBfcGFyc2VFaXBTaWduYXR1cmUodHgsIGZpZWxkcy5zbGljZSg5KSk7XG4gICAgcmV0dXJuIHR4O1xufVxuZnVuY3Rpb24gX3NlcmlhbGl6ZUVpcDE1NTkodHgsIHNpZykge1xuICAgIGNvbnN0IGZpZWxkcyA9IFtcbiAgICAgICAgZm9ybWF0TnVtYmVyKHR4LmNoYWluSWQsIFwiY2hhaW5JZFwiKSxcbiAgICAgICAgZm9ybWF0TnVtYmVyKHR4Lm5vbmNlLCBcIm5vbmNlXCIpLFxuICAgICAgICBmb3JtYXROdW1iZXIodHgubWF4UHJpb3JpdHlGZWVQZXJHYXMgfHwgMCwgXCJtYXhQcmlvcml0eUZlZVBlckdhc1wiKSxcbiAgICAgICAgZm9ybWF0TnVtYmVyKHR4Lm1heEZlZVBlckdhcyB8fCAwLCBcIm1heEZlZVBlckdhc1wiKSxcbiAgICAgICAgZm9ybWF0TnVtYmVyKHR4Lmdhc0xpbWl0LCBcImdhc0xpbWl0XCIpLFxuICAgICAgICAodHgudG8gfHwgXCIweFwiKSxcbiAgICAgICAgZm9ybWF0TnVtYmVyKHR4LnZhbHVlLCBcInZhbHVlXCIpLFxuICAgICAgICB0eC5kYXRhLFxuICAgICAgICBmb3JtYXRBY2Nlc3NMaXN0KHR4LmFjY2Vzc0xpc3QgfHwgW10pXG4gICAgXTtcbiAgICBpZiAoc2lnKSB7XG4gICAgICAgIGZpZWxkcy5wdXNoKGZvcm1hdE51bWJlcihzaWcueVBhcml0eSwgXCJ5UGFyaXR5XCIpKTtcbiAgICAgICAgZmllbGRzLnB1c2godG9CZUFycmF5KHNpZy5yKSk7XG4gICAgICAgIGZpZWxkcy5wdXNoKHRvQmVBcnJheShzaWcucykpO1xuICAgIH1cbiAgICByZXR1cm4gY29uY2F0KFtcIjB4MDJcIiwgZW5jb2RlUmxwKGZpZWxkcyldKTtcbn1cbmZ1bmN0aW9uIF9wYXJzZUVpcDI5MzAoZGF0YSkge1xuICAgIGNvbnN0IGZpZWxkcyA9IGRlY29kZVJscChnZXRCeXRlcyhkYXRhKS5zbGljZSgxKSk7XG4gICAgYXNzZXJ0QXJndW1lbnQoQXJyYXkuaXNBcnJheShmaWVsZHMpICYmIChmaWVsZHMubGVuZ3RoID09PSA4IHx8IGZpZWxkcy5sZW5ndGggPT09IDExKSwgXCJpbnZhbGlkIGZpZWxkIGNvdW50IGZvciB0cmFuc2FjdGlvbiB0eXBlOiAxXCIsIFwiZGF0YVwiLCBoZXhsaWZ5KGRhdGEpKTtcbiAgICBjb25zdCB0eCA9IHtcbiAgICAgICAgdHlwZTogMSxcbiAgICAgICAgY2hhaW5JZDogaGFuZGxlVWludChmaWVsZHNbMF0sIFwiY2hhaW5JZFwiKSxcbiAgICAgICAgbm9uY2U6IGhhbmRsZU51bWJlcihmaWVsZHNbMV0sIFwibm9uY2VcIiksXG4gICAgICAgIGdhc1ByaWNlOiBoYW5kbGVVaW50KGZpZWxkc1syXSwgXCJnYXNQcmljZVwiKSxcbiAgICAgICAgZ2FzTGltaXQ6IGhhbmRsZVVpbnQoZmllbGRzWzNdLCBcImdhc0xpbWl0XCIpLFxuICAgICAgICB0bzogaGFuZGxlQWRkcmVzcyhmaWVsZHNbNF0pLFxuICAgICAgICB2YWx1ZTogaGFuZGxlVWludChmaWVsZHNbNV0sIFwidmFsdWVcIiksXG4gICAgICAgIGRhdGE6IGhleGxpZnkoZmllbGRzWzZdKSxcbiAgICAgICAgYWNjZXNzTGlzdDogaGFuZGxlQWNjZXNzTGlzdChmaWVsZHNbN10sIFwiYWNjZXNzTGlzdFwiKVxuICAgIH07XG4gICAgLy8gVW5zaWduZWQgRUlQLTI5MzAgVHJhbnNhY3Rpb25cbiAgICBpZiAoZmllbGRzLmxlbmd0aCA9PT0gOCkge1xuICAgICAgICByZXR1cm4gdHg7XG4gICAgfVxuICAgIC8vdHguaGFzaCA9IGtlY2NhazI1NihkYXRhKTtcbiAgICBfcGFyc2VFaXBTaWduYXR1cmUodHgsIGZpZWxkcy5zbGljZSg4KSk7XG4gICAgcmV0dXJuIHR4O1xufVxuZnVuY3Rpb24gX3NlcmlhbGl6ZUVpcDI5MzAodHgsIHNpZykge1xuICAgIGNvbnN0IGZpZWxkcyA9IFtcbiAgICAgICAgZm9ybWF0TnVtYmVyKHR4LmNoYWluSWQsIFwiY2hhaW5JZFwiKSxcbiAgICAgICAgZm9ybWF0TnVtYmVyKHR4Lm5vbmNlLCBcIm5vbmNlXCIpLFxuICAgICAgICBmb3JtYXROdW1iZXIodHguZ2FzUHJpY2UgfHwgMCwgXCJnYXNQcmljZVwiKSxcbiAgICAgICAgZm9ybWF0TnVtYmVyKHR4Lmdhc0xpbWl0LCBcImdhc0xpbWl0XCIpLFxuICAgICAgICAodHgudG8gfHwgXCIweFwiKSxcbiAgICAgICAgZm9ybWF0TnVtYmVyKHR4LnZhbHVlLCBcInZhbHVlXCIpLFxuICAgICAgICB0eC5kYXRhLFxuICAgICAgICBmb3JtYXRBY2Nlc3NMaXN0KHR4LmFjY2Vzc0xpc3QgfHwgW10pXG4gICAgXTtcbiAgICBpZiAoc2lnKSB7XG4gICAgICAgIGZpZWxkcy5wdXNoKGZvcm1hdE51bWJlcihzaWcueVBhcml0eSwgXCJyZWNvdmVyeVBhcmFtXCIpKTtcbiAgICAgICAgZmllbGRzLnB1c2godG9CZUFycmF5KHNpZy5yKSk7XG4gICAgICAgIGZpZWxkcy5wdXNoKHRvQmVBcnJheShzaWcucykpO1xuICAgIH1cbiAgICByZXR1cm4gY29uY2F0KFtcIjB4MDFcIiwgZW5jb2RlUmxwKGZpZWxkcyldKTtcbn1cbmZ1bmN0aW9uIF9wYXJzZUVpcDQ4NDQoZGF0YSkge1xuICAgIGxldCBmaWVsZHMgPSBkZWNvZGVSbHAoZ2V0Qnl0ZXMoZGF0YSkuc2xpY2UoMSkpO1xuICAgIGxldCB0eXBlTmFtZSA9IFwiM1wiO1xuICAgIGxldCBibG9iV3JhcHBlclZlcnNpb24gPSBudWxsO1xuICAgIGxldCBibG9icyA9IG51bGw7XG4gICAgLy8gUGFyc2UgdGhlIG5ldHdvcmsgZm9ybWF0XG4gICAgaWYgKGZpZWxkcy5sZW5ndGggPT09IDQgJiYgQXJyYXkuaXNBcnJheShmaWVsZHNbMF0pKSB7XG4gICAgICAgIC8vIEVJUC00ODQ0IGZvcm1hdCB3aXRoIHNpZGVjYXJcbiAgICAgICAgdHlwZU5hbWUgPSBcIjMgKG5ldHdvcmsgZm9ybWF0KVwiO1xuICAgICAgICBjb25zdCBmQmxvYnMgPSBmaWVsZHNbMV0sIGZDb21taXRzID0gZmllbGRzWzJdLCBmUHJvb2ZzID0gZmllbGRzWzNdO1xuICAgICAgICBhc3NlcnRBcmd1bWVudChBcnJheS5pc0FycmF
267745KGZCbG9icyksIFwiaW52YWxpZCBuZXR3b3JrIGZvcm1hdDogYmxvYnMgbm90IGFuIGFycmF5XCIsIFwiZmllbGRzWzFdXCIsIGZCbG9icyk7XG4gICAgICAgIGFzc2VydEFyZ3VtZW50KEFycmF5LmlzQXJyYXkoZkNvbW1pdHMpLCBcImludmFsaWQgbmV0d29yayBmb3JtYXQ6IGNvbW1pdG1lbnRzIG5vdCBhbiBhcnJheVwiLCBcImZpZWxkc1syXVwiLCBmQ29tbWl0cyk7XG4gICAgICAgIGFzc2VydEFyZ3VtZW50KEFycmF5LmlzQXJyYXkoZlByb29mcyksIFwiaW52YWxpZCBuZXR3b3JrIGZvcm1hdDogcHJvb2ZzIG5vdCBhbiBhcnJheVwiLCBcImZpZWxkc1szXVwiLCBmUHJvb2ZzKTtcbiAgICAgICAgYXNzZXJ0QXJndW1lbnQoZkJsb2JzLmxlbmd0aCA9PT0gZkNvbW1pdHMubGVuZ3RoLCBcImludmFsaWQgbmV0d29yayBmb3JtYXQ6IGJsb2JzL2NvbW1pdG1lbnRzIGxlbmd0aCBtaXNtYXRjaFwiLCBcImZpZWxkc1wiLCBmaWVsZHMpO1xuICAgICAgICBhc3NlcnRBcmd1bWVudChmQmxvYnMubGVuZ3RoID09PSBmUHJvb2ZzLmxlbmd0aCwgXCJpbnZhbGlkIG5ldHdvcmsgZm9ybWF0OiBibG9icy9wcm9vZnMgbGVuZ3RoIG1pc21hdGNoXCIsIFwiZmllbGRzXCIsIGZpZWxkcyk7XG4gICAgICAgIGJsb2JzID0gW107XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZmllbGRzWzFdLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBibG9icy5wdXNoKHtcbiAgICAgICAgICAgICAgICBkYXRhOiBmQmxvYnNbaV0sXG4gICAgICAgICAgICAgICAgY29tbWl0bWVudDogZkNvbW1pdHNbaV0sXG4gICAgICAgICAgICAgICAgcHJvb2Y6IGZQcm9vZnNbaV0sXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBmaWVsZHMgPSBmaWVsZHNbMF07XG4gICAgfVxuICAgIGVsc2UgaWYgKGZpZWxkcy5sZW5ndGggPT09IDUgJiYgQXJyYXkuaXNBcnJheShmaWVsZHNbMF0pKSB7XG4gICAgICAgIC8vIEVJUC03NTk0IGZvcm1hdCB3aXRoIHNpZGVjYXJcbiAgICAgICAgdHlwZU5hbWUgPSBcIjMgKEVJUC03NTk0IG5ldHdvcmsgZm9ybWF0KVwiO1xuICAgICAgICBibG9iV3JhcHBlclZlcnNpb24gPSBnZXROdW1iZXIoZmllbGRzWzFdKTtcbiAgICAgICAgY29uc3QgZkJsb2JzID0gZmllbGRzWzJdLCBmQ29tbWl0cyA9IGZpZWxkc1szXSwgZlByb29mcyA9IGZpZWxkc1s0XTtcbiAgICAgICAgYXNzZXJ0QXJndW1lbnQoYmxvYldyYXBwZXJWZXJzaW9uID09PSAxLCBgdW5zdXBwb3J0ZWQgRUlQLTc1OTQgbmV0d29yayBmb3JtYXQgdmVyc2lvbjogJHtibG9iV3JhcHBlclZlcnNpb259YCwgXCJmaWVsZHNbMV1cIiwgYmxvYldyYXBwZXJWZXJzaW9uKTtcbiAgICAgICAgYXNzZXJ0QXJndW1lbnQoQXJyYXkuaXNBcnJheShmQmxvYnMpLCBcImludmFsaWQgRUlQLTc1OTQgbmV0d29yayBmb3JtYXQ6IGJsb2JzIG5vdCBhbiBhcnJheVwiLCBcImZpZWxkc1syXVwiLCBmQmxvYnMpO1xuICAgICAgICBhc3NlcnRBcmd1bWVudChBcnJheS5pc0FycmF5KGZDb21taXRzKSwgXCJpbnZhbGlkIEVJUC03NTk0IG5ldHdvcmsgZm9ybWF0OiBjb21taXRtZW50cyBub3QgYW4gYXJyYXlcIiwgXCJmaWVsZHNbM11cIiwgZkNvbW1pdHMpO1xuICAgICAgICBhc3NlcnRBcmd1bWVudChBcnJheS5pc0FycmF5KGZQcm9vZnMpLCBcImludmFsaWQgRUlQLTc1OTQgbmV0d29yayBmb3JtYXQ6IHByb29mcyBub3QgYW4gYXJyYXlcIiwgXCJmaWVsZHNbNF1cIiwgZlByb29mcyk7XG4gICAgICAgIGFzc2VydEFyZ3VtZW50KGZCbG9icy5sZW5ndGggPT09IGZDb21taXRzLmxlbmd0aCwgXCJpbnZhbGlkIG5ldHdvcmsgZm9ybWF0OiBibG9icy9jb21taXRtZW50cyBsZW5ndGggbWlzbWF0Y2hcIiwgXCJmaWVsZHNcIiwgZmllbGRzKTtcbiAgICAgICAgYXNzZXJ0QXJndW1lbnQoZkJsb2JzLmxlbmd0aCAqIENFTExfQ09VTlQgPT09IGZQcm9vZnMubGVuZ3RoLCBcImludmFsaWQgbmV0d29yayBmb3JtYXQ6IGJsb2JzL3Byb29mcyBsZW5ndGggbWlzbWF0Y2hcIiwgXCJmaWVsZHNcIiwgZmllbGRzKTtcbiAgICAgICAgYmxvYnMgPSBbXTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBmQmxvYnMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGNvbnN0IHByb29mID0gW107XG4gICAgICAgICAgICBmb3IgKGxldCBqID0gMDsgaiA8IENFTExfQ09VTlQ7IGorKykge1xuICAgICAgICAgICAgICAgIHByb29mLnB1c2goZlByb29mc1soaSAqIENFTExfQ09VTlQpICsgal0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgYmxvYnMucHVzaCh7XG4gICAgICAgICAgICAgICAgZGF0YTogZkJsb2JzW2ldLFxuICAgICAgICAgICAgICAgIGNvbW1pdG1lbnQ6IGZDb21taXRzW2ldLFxuICAgICAgICAgICAgICAgIHByb29mOiBjb25jYXQocHJvb2YpXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBmaWVsZHMgPSBmaWVsZHNbMF07XG4gICAgfVxuICAgIGFzc2VydEFyZ3VtZW50KEFycmF5LmlzQXJyYXkoZmllbGRzKSAmJiAoZmllbGRzLmxlbmd0aCA9PT0gMTEgfHwgZmllbGRzLmxlbmd0aCA9PT0gMTQpLCBgaW52YWxpZCBmaWVsZCBjb3VudCBmb3IgdHJhbnNhY3Rpb24gdHlwZTogJHt0eXBlTmFtZX1gLCBcImRhdGFcIiwgaGV4bGlmeShkYXRhKSk7XG4gICAgY29uc3QgdHggPSB7XG4gICAgICAgIHR5cGU6IDMsXG4gICAgICAgIGNoYWluSWQ6IGhhbmRsZVVpbnQoZmllbGRzWzBdLCBcImNoYWluSWRcIiksXG4gICAgICAgIG5vbmNlOiBoYW5kbGVOdW1iZXIoZmllbGRzWzFdLCBcIm5vbmNlXCIpLFxuICAgICAgICBtYXhQcmlvcml0eUZlZVBlckdhczogaGFuZGxlVWludChmaWVsZHNbMl0sIFwibWF4UHJpb3JpdHlGZWVQZXJHYXNcIiksXG4gICAgICAgIG1heEZlZVBlckdhczogaGFuZGxlVWludChmaWVsZHNbM10sIFwibWF4RmVlUGVyR2FzXCIpLFxuICAgICAgICBnYXNQcmljZTogbnVsbCxcbiAgICAgICAgZ2FzTGltaXQ6IGhhbmRsZVVpbnQoZmllbGRzWzRdLCBcImdhc0xpbWl0XCIpLFxuICAgICAgICB0bzogaGFuZGxlQWRkcmVzcyhmaWVsZHNbNV0pLFxuICAgICAgICB2YWx1ZTogaGFuZGxlVWludChmaWVsZHNbNl0sIFwidmFsdWVcIiksXG4gICAgICAgIGRhdGE6IGhleGxpZnkoZmllbGRzWzddKSxcbiAgICAgICAgYWNjZXNzTGlzdDogaGFuZGxlQWNjZXNzTGlzdChmaWVsZHNbOF0sIFwiYWNjZXNzTGlzdFwiKSxcbiAgICAgICAgbWF4RmVlUGVyQmxvYkdhczogaGFuZGxlVWludChmaWVsZHNbOV0sIFwibWF4RmVlUGVyQmxvYkdhc1wiKSxcbiAgICAgICAgYmxvYlZlcnNpb25lZEhhc2hlczogZmllbGRzWzEwXSxcbiAgICAgICAgYmxvYldyYXBwZXJWZXJzaW9uXG4gICAgfTtcbiAgICBpZiAoYmxvYnMpIHtcbiAgICAgICAgdHguYmxvYnMgPSBibG9icztcbiAgICB9XG4gICAgYXNzZXJ0QXJndW1lbnQodHgudG8gIT0gbnVsbCwgYGludmFsaWQgYWRkcmVzcyBmb3IgdHJhbnNhY3Rpb24gdHlwZTogJHt0eXBlTmFtZX1gLCBcImRhdGFcIiwgZGF0YSk7XG4gICAgYXNzZXJ0QXJndW1lbnQoQXJyYXkuaXNBcnJheSh0eC5ibG9iVmVyc2lvbmVkSGFzaGVzKSwgXCJpbnZhbGlkIGJsb2JWZXJzaW9uZWRIYXNoZXM6IG11c3QgYmUgYW4gYXJyYXlcIiwgXCJkYXRhXCIsIGRhdGEpO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdHguYmxvYlZlcnNpb25lZEhhc2hlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICBhc3NlcnRBcmd1bWVudChpc0hleFN0cmluZyh0eC5ibG9iVmVyc2lvbmVkSGFzaGVzW2ldLCAzMiksIGBpbnZhbGlkIGJsb2JWZXJzaW9uZWRIYXNoIGF0IGluZGV4ICR7aX06IG11c3QgYmUgbGVuZ3RoIDMyYCwgXCJkYXRhXCIsIGRhdGEpO1xuICAgIH1cbiAgICAvLyBVbnNpZ25lZCBFSVAtNDg0NCBUcmFuc2FjdGlvblxuICAgIGlmIChmaWVsZHMubGVuZ3RoID09PSAxMSkge1xuICAgICAgICByZXR1cm4gdHg7XG4gICAgfVxuICAgIC8vIEBUT0RPOiBEbyB3ZSBuZWVkIHRvIGRvIHRoaXM/IFRoaXMgaXMgb25seSBjYWxsZWQgaW50ZXJuYWxseVxuICAgIC8vIGFuZCB1c2VkIHRvIHZlcmlmeSBoYXNoZXM7IGl0IG1pZ2h0IHNhdmUgdGltZSB0byBub3QgZG8gdGhpc1xuICAgIC8vdHguaGFzaCA9IGtlY2NhazI1Nihjb25jYXQoWyBcIjB4MDNcIiwgZW5jb2RlUmxwKGZpZWxkcykgXSkpO1xuICAgIF9wYXJzZUVpcFNpZ25hdHVyZSh0eCwgZmllbGRzLnNsaWNlKDExKSk7XG4gICAgcmV0dXJuIHR4O1xufVxuZnVuY3Rpb24gX3NlcmlhbGl6ZUVpcDQ4NDQodHgsIHNpZywgYmxvYnMpIHtcbiAgICBjb25zdCBmaWVsZHMgPSBbXG4gICAgICAgIGZvcm1hdE51bWJlcih0eC5jaGFpbklkLCBcImNoYWluSWRcIiksXG4gICAgICAgIGZvcm1hdE51bWJlcih0eC5ub25jZSwgXCJub25jZVwiKSxcbiAgICAgICAgZm9ybWF0TnVtYmVyKHR4Lm1heFByaW9yaXR5RmVlUGVyR2FzIHx8IDAsIFwibWF4UHJpb3JpdHlGZWVQZXJHYXNcIiksXG4gICAgICAgIGZvcm1hdE51bWJlcih0eC5tYXhGZWVQZXJHYXMgfHwgMCwgXCJtYXhGZWVQZXJHYXNcIiksXG4gICAgICAgIGZvcm1hdE51bWJlcih0eC5nYXNMaW1pdCwgXCJnYXNMaW1pdFwiKSxcbiAgICAgICAgKHR4LnRvIHx8IFplcm9BZGRyZXNzKSxcbiAgICAgICAgZm9ybWF0TnVtYmVyKHR4LnZhbHVlLCBcInZhbHVlXCIpLFxuICAgICAgICB0eC5kYXRhLFxuICAgICAgICBmb3JtYXRBY2Nlc3NMaXN0KHR4LmFjY2Vzc0xpc3QgfHwgW10pLFxuICAgICAgICBmb3JtYXROdW1iZXIodHgubWF4RmVlUGVyQmxvYkdhcyB8fCAwLCBcIm1heEZlZVBlckJsb2JHYXNcIiksXG4gICAgICAgIGZvcm1hdEhhc2hlcyh0eC5ibG9iVmVyc2lvbmVkSGFzaGVzIHx8IFtdLCBcImJsb2JWZXJzaW9uZWRIYXNoZXNcIilcbiAgICBdO1xuICAgIGlmIChzaWcpIHtcbiAgICAgICAgZmllbGRzLnB1c2goZm9ybWF0TnVtYmVyKHNpZy55UGFyaXR5LCBcInlQYXJpdHlcIikpO1xuICAgICAgICBmaWVsZHMucHVzaCh0b0JlQXJyYXkoc2lnLnIpKTtcbiAgICAgICAgZmllbGRzLnB1c2godG9CZUFycmF5KHNpZy5zKSk7XG4gICAgICAgIC8vIFdlIGhhdmUgYmxvYn
26774M7IHJldHVybiB0aGUgbmV0d29yayB3cmFwcGVkIGZvcm1hdFxuICAgICAgICBpZiAoYmxvYnMpIHtcbiAgICAgICAgICAgIC8vIFVzZSBFSVAtNzU5NFxuICAgICAgICAgICAgaWYgKHR4LmJsb2JXcmFwcGVyVmVyc2lvbiAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgY29uc3Qgd3JhcHBlclZlcnNpb24gPSB0b0JlQXJyYXkodHguYmxvYldyYXBwZXJWZXJzaW9uKTtcbiAgICAgICAgICAgICAgICBjb25zdCBjZWxsUHJvb2ZzID0gW107XG4gICAgICAgICAgICAgICAgZm9yIChjb25zdCB7IHByb29mIH0gb2YgYmxvYnMpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcCA9IGdldEJ5dGVzKHByb29mKTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgY2VsbFNpemUgPSBwLmxlbmd0aCAvIENFTExfQ09VTlQ7XG4gICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcC5sZW5ndGg7IGkgKz0gY2VsbFNpemUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNlbGxQcm9vZnMucHVzaChwLnN1YmFycmF5KGksIGkgKyBjZWxsU2l6ZSkpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiBjb25jYXQoW1xuICAgICAgICAgICAgICAgICAgICBcIjB4MDNcIixcbiAgICAgICAgICAgICAgICAgICAgZW5jb2RlUmxwKFtcbiAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkcyxcbiAgICAgICAgICAgICAgICAgICAgICAgIHdyYXBwZXJWZXJzaW9uLFxuICAgICAgICAgICAgICAgICAgICAgICAgYmxvYnMubWFwKChiKSA9PiBiLmRhdGEpLFxuICAgICAgICAgICAgICAgICAgICAgICAgYmxvYnMubWFwKChiKSA9PiBiLmNvbW1pdG1lbnQpLFxuICAgICAgICAgICAgICAgICAgICAgICAgY2VsbFByb29mc1xuICAgICAgICAgICAgICAgICAgICBdKVxuICAgICAgICAgICAgICAgIF0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gRmFsbCBiYWNrIG9udG8gY2xhc3NpYyBFSVAtNDg0NCBiZWhhdmlvclxuICAgICAgICAgICAgcmV0dXJuIGNvbmNhdChbXG4gICAgICAgICAgICAgICAgXCIweDAzXCIsXG4gICAgICAgICAgICAgICAgZW5jb2RlUmxwKFtcbiAgICAgICAgICAgICAgICAgICAgZmllbGRzLFxuICAgICAgICAgICAgICAgICAgICBibG9icy5tYXAoKGIpID0+IGIuZGF0YSksXG4gICAgICAgICAgICAgICAgICAgIGJsb2JzLm1hcCgoYikgPT4gYi5jb21taXRtZW50KSxcbiAgICAgICAgICAgICAgICAgICAgYmxvYnMubWFwKChiKSA9PiBiLnByb29mKSxcbiAgICAgICAgICAgICAgICBdKVxuICAgICAgICAgICAgXSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGNvbmNhdChbXCIweDAzXCIsIGVuY29kZVJscChmaWVsZHMpXSk7XG59XG5mdW5jdGlvbiBfcGFyc2VFaXA3NzAyKGRhdGEpIHtcbiAgICBjb25zdCBmaWVsZHMgPSBkZWNvZGVSbHAoZ2V0Qnl0ZXMoZGF0YSkuc2xpY2UoMSkpO1xuICAgIGFzc2VydEFyZ3VtZW50KEFycmF5LmlzQXJyYXkoZmllbGRzKSAmJiAoZmllbGRzLmxlbmd0aCA9PT0gMTAgfHwgZmllbGRzLmxlbmd0aCA9PT0gMTMpLCBcImludmFsaWQgZmllbGQgY291bnQgZm9yIHRyYW5zYWN0aW9uIHR5cGU6IDRcIiwgXCJkYXRhXCIsIGhleGxpZnkoZGF0YSkpO1xuICAgIGNvbnN0IHR4ID0ge1xuICAgICAgICB0eXBlOiA0LFxuICAgICAgICBjaGFpbklkOiBoYW5kbGVVaW50KGZpZWxkc1swXSwgXCJjaGFpbklkXCIpLFxuICAgICAgICBub25jZTogaGFuZGxlTnVtYmVyKGZpZWxkc1sxXSwgXCJub25jZVwiKSxcbiAgICAgICAgbWF4UHJpb3JpdHlGZWVQZXJHYXM6IGhhbmRsZVVpbnQoZmllbGRzWzJdLCBcIm1heFByaW9yaXR5RmVlUGVyR2FzXCIpLFxuICAgICAgICBtYXhGZWVQZXJHYXM6IGhhbmRsZVVpbnQoZmllbGRzWzNdLCBcIm1heEZlZVBlckdhc1wiKSxcbiAgICAgICAgZ2FzUHJpY2U6IG51bGwsXG4gICAgICAgIGdhc0xpbWl0OiBoYW5kbGVVaW50KGZpZWxkc1s0XSwgXCJnYXNMaW1pdFwiKSxcbiAgICAgICAgdG86IGhhbmRsZUFkZHJlc3MoZmllbGRzWzVdKSxcbiAgICAgICAgdmFsdWU6IGhhbmRsZVVpbnQoZmllbGRzWzZdLCBcInZhbHVlXCIpLFxuICAgICAgICBkYXRhOiBoZXhsaWZ5KGZpZWxkc1s3XSksXG4gICAgICAgIGFjY2Vzc0xpc3Q6IGhhbmRsZUFjY2Vzc0xpc3QoZmllbGRzWzhdLCBcImFjY2Vzc0xpc3RcIiksXG4gICAgICAgIGF1dGhvcml6YXRpb25MaXN0OiBoYW5kbGVBdXRob3JpemF0aW9uTGlzdChmaWVsZHNbOV0sIFwiYXV0aG9yaXphdGlvbkxpc3RcIiksXG4gICAgfTtcbiAgICAvLyBVbnNpZ25lZCBFSVAtNzcwMiBUcmFuc2FjdGlvblxuICAgIGlmIChmaWVsZHMubGVuZ3RoID09PSAxMCkge1xuICAgICAgICByZXR1cm4gdHg7XG4gICAgfVxuICAgIF9wYXJzZUVpcFNpZ25hdHVyZSh0eCwgZmllbGRzLnNsaWNlKDEwKSk7XG4gICAgcmV0dXJuIHR4O1xufVxuZnVuY3Rpb24gX3NlcmlhbGl6ZUVpcDc3MDIodHgsIHNpZykge1xuICAgIGNvbnN0IGZpZWxkcyA9IFtcbiAgICAgICAgZm9ybWF0TnVtYmVyKHR4LmNoYWluSWQsIFwiY2hhaW5JZFwiKSxcbiAgICAgICAgZm9ybWF0TnVtYmVyKHR4Lm5vbmNlLCBcIm5vbmNlXCIpLFxuICAgICAgICBmb3JtYXROdW1iZXIodHgubWF4UHJpb3JpdHlGZWVQZXJHYXMgfHwgMCwgXCJtYXhQcmlvcml0eUZlZVBlckdhc1wiKSxcbiAgICAgICAgZm9ybWF0TnVtYmVyKHR4Lm1heEZlZVBlckdhcyB8fCAwLCBcIm1heEZlZVBlckdhc1wiKSxcbiAgICAgICAgZm9ybWF0TnVtYmVyKHR4Lmdhc0xpbWl0LCBcImdhc0xpbWl0XCIpLFxuICAgICAgICAodHgudG8gfHwgXCIweFwiKSxcbiAgICAgICAgZm9ybWF0TnVtYmVyKHR4LnZhbHVlLCBcInZhbHVlXCIpLFxuICAgICAgICB0eC5kYXRhLFxuICAgICAgICBmb3JtYXRBY2Nlc3NMaXN0KHR4LmFjY2Vzc0xpc3QgfHwgW10pLFxuICAgICAgICBmb3JtYXRBdXRob3JpemF0aW9uTGlzdCh0eC5hdXRob3JpemF0aW9uTGlzdCB8fCBbXSlcbiAgICBdO1xuICAgIGlmIChzaWcpIHtcbiAgICAgICAgZmllbGRzLnB1c2goZm9ybWF0TnVtYmVyKHNpZy55UGFyaXR5LCBcInlQYXJpdHlcIikpO1xuICAgICAgICBmaWVsZHMucHVzaCh0b0JlQXJyYXkoc2lnLnIpKTtcbiAgICAgICAgZmllbGRzLnB1c2godG9CZUFycmF5KHNpZy5zKSk7XG4gICAgfVxuICAgIHJldHVybi
26774Bjb25jYXQoW1wiMHgwNFwiLCBlbmNvZGVSbHAoZmllbGRzKV0pO1xufVxuLyoqXG4gKiAgQSAqKlRyYW5zYWN0aW9uKiogZGVzY3JpYmVzIGFuIG9wZXJhdGlvbiB0byBiZSBleGVjdXRlZCBvblxuICogIEV0aGVyZXVtIGJ5IGFuIEV4dGVybmFsbHkgT3duZWQgQWNjb3VudCAoRU9BKS4gSXQgaW5jbHVkZXNcbiAqICB3aG8gKHRoZSBbW3RvXV0gYWRkcmVzcyksIHdoYXQgKHRoZSBbW2RhdGFdXSkgYW5kIGhvdyBtdWNoICh0aGVcbiAqICBbW3ZhbHVlXV0gaW4gZXRoZXIpIHRoZSBvcGVyYXRpb24gc2hvdWxkIGVudGFpbC5cbiAqXG4gKiAgQGV4YW1wbGU6XG4gKiAgICB0eCA9IG5ldyBUcmFuc2FjdGlvbigpXG4gKiAgICAvL19yZXN1bHQ6XG4gKlxuICogICAgdHguZGF0YSA9IFwiMHgxMjM0XCI7XG4gKiAgICAvL19yZXN1bHQ6XG4gKi9cbmV4cG9ydCBjbGFzcyBUcmFuc2FjdGlvbiB7XG4gICAgI3R5cGU7XG4gICAgI3RvO1xuICAgICNkYXRhO1xuICAgICNub25jZTtcbiAgICAjZ2FzTGltaXQ7XG4gICAgI2dhc1ByaWNlO1xuICAgICNtYXhQcmlvcml0eUZlZVBlckdhcztcbiAgICAjbWF4RmVlUGVyR2FzO1xuICAgICN2YWx1ZTtcbiAgICAjY2hhaW5JZDtcbiAgICAjc2lnO1xuICAgICNhY2Nlc3NMaXN0O1xuICAgICNtYXhGZWVQZXJCbG9iR2FzO1xuICAgICNibG9iVmVyc2lvbmVkSGFzaGVzO1xuICAgICNremc7XG4gICAgI2Jsb2JzO1xuICAgICNhdXRocztcbiAgICAjYmxvYldyYXBwZXJWZXJzaW9uO1xuICAgIC8qKlxuICAgICAqICBUaGUgdHJhbnNhY3Rpb24gdHlwZS5cbiAgICAgKlxuICAgICAqICBJZiBudWxsLCB0aGUgdHlwZSB3aWxsIGJlIGF1dG9tYXRpY2FsbHkgaW5mZXJyZWQgYmFzZWQgb25cbiAgICAgKiAgZXhwbGljaXQgcHJvcGVydGllcy5cbiAgICAgKi9cbiAgICBnZXQgdHlwZSgpIHsgcmV0dXJuIHRoaXMuI3R5cGU7IH1cbiAgICBzZXQgdHlwZSh2YWx1ZSkge1xuICAgICAgICBzd2l0Y2ggKHZhbHVlKSB7XG4gICAgICAgICAgICBjYXNlIG51bGw6XG4gICAgICAgICAgICAgICAgdGhpcy4jdHlwZSA9IG51bGw7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgICBjYXNlIFwibGVnYWN5XCI6XG4gICAgICAgICAgICAgICAgdGhpcy4jdHlwZSA9IDA7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICBjYXNlIFwiYmVybGluXCI6XG4gICAgICAgICAgICBjYXNlIFwiZWlwLTI5MzBcIjpcbiAgICAgICAgICAgICAgICB0aGlzLiN0eXBlID0gMTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgMjpcbiAgICAgICAgICAgIGNhc2UgXCJsb25kb25cIjpcbiAgICAgICAgICAgIGNhc2UgXCJlaXAtMTU1OVwiOlxuICAgICAgICAgICAgICAgIHRoaXMuI3R5cGUgPSAyO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAzOlxuICAgICAgICAgICAgY2FzZSBcImNhbmN1blwiOlxuICAgICAgICAgICAgY2FzZSBcImVpcC00ODQ0XCI6XG4gICAgICAgICAgICAgICAgdGhpcy4jdHlwZSA9IDM7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIDQ6XG4gICAgICAgICAgICBjYXNlIFwicGVjdHJhXCI6XG4gICAgICAgICAgICBjYXNlIFwiZWlwLTc3MDJcIjpcbiAgICAgICAgICAgICAgICB0aGlzLiN0eXBlID0gNDtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgYXNzZXJ0QXJndW1lbnQoZmFsc2UsIFwidW5zdXBwb3J0ZWQgdHJhbnNhY3Rpb24gdHlwZVwiLCBcInR5cGVcIiwgdmFsdWUpO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqICBUaGUgbmFtZSBvZiB0aGUgdHJhbnNhY3Rpb24gdHlwZS5cbiAgICAgKi9cbiAgICBnZXQgdHlwZU5hbWUoKSB7XG4gICAgICAgIHN3aXRjaCAodGhpcy50eXBlKSB7XG4gICAgICAgICAgICBjYXNlIDA6IHJldHVybiBcImxlZ2FjeVwiO1xuICAgICAgICAgICAgY2FzZSAxOiByZXR1cm4gXCJlaXAtMjkzMFwiO1xuICAgICAgICAgICAgY2FzZSAyOiByZXR1cm4gXCJlaXAtMTU1OVwiO1xuICAgICAgICAgICAgY2FzZSAzOiByZXR1cm4gXCJlaXAtNDg0NFwiO1xuICAgICAgICAgICAgY2FzZSA0OiByZXR1cm4gXCJlaXAtNzcwMlwiO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiAgVGhlIGBgdG9gYCBhZGRyZXNzIGZvciB0aGUgdHJhbnNhY3Rpb24gb3IgYGBudWxsYGAgaWYgdGhlXG4gICAgICogIHRyYW5zYWN0aW9uIGlzIGFuIGBgaW5pdGBgIHRyYW5zYWN0aW9uLlxuICAgICAqL1xuICAgIGdldCB0bygpIHtcbiAgICAgICAgY29uc3QgdmFsdWUgPSB0aGlzLiN0bztcbiAgICAgICAgaWYgKHZhbHVlID09IG51bGwgJiYgdGhpcy50eXBlID09PSAzKSB7XG4gICAgICAgICAgICByZXR1cm4gWmVyb0FkZHJlc3M7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgIH1cbiAgICBzZXQgdG8odmFsdWUpIHtcbiAgICAgICAgdGhpcy4jdG8gPSAodmFsdWUgPT0gbnVsbCkgPyBudWxsIDogZ2V0QWRkcmVzcyh2YWx1ZSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqICBUaGUgdHJhbnNhY3Rpb24gbm9uY2UuXG4gICAgICovXG4gICAgZ2V0IG5vbmNlKCkgeyByZXR1cm4gdGhpcy4jbm9uY2U7IH1cbiAgICBzZXQgbm9uY2UodmFsdWUpIHsgdGhpcy4jbm9uY2UgPSBnZXROdW1iZXIodmFsdWUsIFwidmFsdWVcIik7IH1cbiAgICAvKipcbiAgICAgKiAgVGhlIGdhcyBsaW1pdC5cbiAgICAgKi9cbiAgICBnZXQgZ2FzTGltaXQoKSB7IHJldHVybiB0aGlzLiNnYXNMaW1pdDsgfVxuICAgIHNldCBnYXNMaW1pdCh2YWx1ZSkgeyB0aGlzLiNnYXNMaW1pdCA9IGdldEJpZ0ludCh2YWx1ZSk7IH1cbiAgICAvKipcbiAgICAgKiAgVGhlIGdhcyBwcmljZS5cbiAgICAgKlxuICAgICAqICBPbiBsZWdhY3kgbmV0d29ya3MgdGhpcyBkZWZpbmVzIHRoZSBmZWUgdGhhdCB3aWxsIGJlIHBhaWQuIE9uXG4gICAgICogIEVJUC0xNTU5IG5ldHdvcmtzLCB0aGlzIHNob3VsZCBiZSBgYG51bGxgYC5cbiAgICAgKi9cbiAgICBnZXQgZ2FzUHJpY2UoKSB7XG4gICAgICAgIGNvbnN0IHZhbHVlID0gdGhpcy4jZ2FzUHJpY2U7XG4gICAgICAgIGlmICh2YWx1ZSA9PSBudWxsICYmICh0aGlzLnR5cGUgPT09IDAgfHwgdGhpcy50eXBlID09PSAxKSkge1xuICAgICAgICAgICAgcmV0dXJuIEJOXzA7XG4gICAgICAgI
26774H1cbiAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgIH1cbiAgICBzZXQgZ2FzUHJpY2UodmFsdWUpIHtcbiAgICAgICAgdGhpcy4jZ2FzUHJpY2UgPSAodmFsdWUgPT0gbnVsbCkgPyBudWxsIDogZ2V0QmlnSW50KHZhbHVlLCBcImdhc1ByaWNlXCIpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiAgVGhlIG1heGltdW0gcHJpb3JpdHkgZmVlIHBlciB1bml0IG9mIGdhcyB0byBwYXkuIE9uIGxlZ2FjeVxuICAgICAqICBuZXR3b3JrcyB0aGlzIHNob3VsZCBiZSBgYG51bGxgYC5cbiAgICAgKi9cbiAgICBnZXQgbWF4UHJpb3JpdHlGZWVQZXJHYXMoKSB7XG4gICAgICAgIGNvbnN0IHZhbHVlID0gdGhpcy4jbWF4UHJpb3JpdHlGZWVQZXJHYXM7XG4gICAgICAgIGlmICh2YWx1ZSA9PSBudWxsKSB7XG4gICAgICAgICAgICBpZiAodGhpcy50eXBlID09PSAyIHx8IHRoaXMudHlwZSA9PT0gMykge1xuICAgICAgICAgICAgICAgIHJldHVybiBCTl8wO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgIH1cbiAgICBzZXQgbWF4UHJpb3JpdHlGZWVQZXJHYXModmFsdWUpIHtcbiAgICAgICAgdGhpcy4jbWF4UHJpb3JpdHlGZWVQZXJHYXMgPSAodmFsdWUgPT0gbnVsbCkgPyBudWxsIDogZ2V0QmlnSW50KHZhbHVlLCBcIm1heFByaW9yaXR5RmVlUGVyR2FzXCIpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiAgVGhlIG1heGltdW0gdG90YWwgZmVlIHBlciB1bml0IG9mIGdhcyB0byBwYXkuIE9uIGxlZ2FjeVxuICAgICAqICBuZXR3b3JrcyB0aGlzIHNob3VsZCBiZSBgYG51bGxgYC5cbiAgICAgKi9cbiAgICBnZXQgbWF4RmVlUGVyR2FzKCkge1xuICAgICAgICBjb25zdCB2YWx1ZSA9IHRoaXMuI21heEZlZVBlckdhcztcbiAgICAgICAgaWYgKHZhbHVlID09IG51bGwpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLnR5cGUgPT09IDIgfHwgdGhpcy50eXBlID09PSAzKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIEJOXzA7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgfVxuICAgIHNldCBtYXhGZWVQZXJHYXModmFsdWUpIHtcbiAgICAgICAgdGhpcy4jbWF4RmVlUGVyR2FzID0gKHZhbHVlID09IG51bGwpID8gbnVsbCA6IGdldEJpZ0ludCh2YWx1ZSwgXCJtYXhGZWVQZXJHYXNcIik7XG4gICAgfVxuICAgIC8qKlxuICAgICAqICBUaGUgdHJhbnNhY3Rpb24gZGF0YS4gRm9yIGBgaW5pdGBgIHRyYW5zYWN0aW9ucyB0aGlzIGlzIHRoZVxuICAgICAqICBkZXBsb3ltZW50IGNvZGUuXG4gICAgICovXG4gICAgZ2V0IGRhdGEoKSB7IHJldHVybiB0aGlzLiNkYXRhOyB9XG4gICAgc2V0IGRhdGEodmFsdWUpIHsgdGhpcy4jZGF0YSA9IGhleGxpZnkodmFsdWUpOyB9XG4gICAgLyoqXG4gICAgICogIFRoZSBhbW91bnQgb2YgZXRoZXIgKGluIHdlaSkgdG8gc2VuZCBpbiB0aGlzIHRyYW5zYWN0aW9ucy5cbiAgICAgKi9cbiAgICBnZXQgdmFsdWUoKSB7IHJldHVybiB0aGlzLiN2YWx1ZTsgfVxuICAgIHNldCB2YWx1ZSh2YWx1ZSkge1xuICAgICAgICB0aGlzLiN2YWx1ZSA9IGdldEJpZ0ludCh2YWx1ZSwgXCJ2YWx1ZVwiKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogIFRoZSBjaGFpbiBJRCB0aGlzIHRyYW5zYWN0aW9uIGlzIHZhbGlkIG9uLlxuICAgICAqL1xuICAgIGdldCBjaGFpbklkKCkgeyByZXR1cm4gdGhpcy4jY2hhaW5JZDsgfVxuICAgIHNldCBjaGFpbklkKHZhbHVlKSB7IHRoaXMuI2NoYWluSWQgPSBnZXRCaWdJbnQodmFsdWUpOyB9XG4gICAgLyoqXG4gICAgICogIElmIHNpZ25lZCwgdGhlIHNpZ25hdHVyZSBmb3IgdGhpcyB0cmFuc2FjdGlvbi5cbiAgICAgKi9cbiAgICBnZXQgc2lnbmF0dXJlKCkgeyByZXR1cm4gdGhpcy4jc2lnIHx8IG51bGw7IH1cbiAgICBzZXQgc2lnbmF0dXJlKHZhbHVlKSB7XG4gICAgICAgIHRoaXMuI3NpZyA9ICh2YWx1ZSA9PSBudWxsKSA/IG51bGwgOiBTaWduYXR1cmUuZnJvbSh2YWx1ZSk7XG4gICAgfVxuICAgIGlzVmFsaWQoKSB7XG4gICAgICAgIGNvbnN0IHNpZyA9IHRoaXMuc2lnbmF0dXJlO1xuICAgICAgICBpZiAoc2lnICYmICFzaWcuaXNWYWxpZCgpKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgYXV0aHMgPSB0aGlzLmF1dGhvcml6YXRpb25MaXN0O1xuICAgICAgICBpZiAoYXV0aHMpIHtcbiAgICAgICAgICAgIGZvciAoY29uc3QgYXV0aCBvZiBhdXRocykge1xuICAgICAgICAgICAgICAgIGlmICghYXV0aC5zaWduYXR1cmUuaXNWYWxpZCgpKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIC8qKlxuICAgICAqICBUaGUgYWNjZXNzIGxpc3QuXG4gICAgICpcbiAgICAgKiAgQW4gYWNjZXNzIGxpc3QgcGVybWl0cyBkaXNjb3VudGVkIChidXQgcHJlLXBhaWQpIGFjY2VzcyB0b1xuICAgICAqICBieXRlY29kZSBhbmQgc3RhdGUgdmFyaWFibGUgYWNjZXNzIHdpdGhpbiBjb250cmFjdCBleGVjdXRpb24uXG4gICAgICovXG4gICAgZ2V0IGFjY2Vzc0xpc3QoKSB7XG4gICAgICAgIGNvbnN0IHZhbHVlID0gdGhpcy4jYWNjZXNzTGlzdCB8fCBudWxsO1xuICAgICAgICBpZiAodmFsdWUgPT0gbnVsbCkge1xuICAgICAgICAgICAgaWYgKHRoaXMudHlwZSA9PT0gMSB8fCB0aGlzLnR5cGUgPT09IDIgfHwgdGhpcy50eXBlID09PSAzKSB7XG4gICAgICAgICAgICAgICAgLy8gQFRPRE86IGluIHY3LCB0aGlzIHNob3VsZCBhc3NpZ24gdGhlIHZhbHVlIG9yIGJlY29tZVxuICAgICAgICAgICAgICAgIC8vIGEgbGl2ZSBvYmplY3QgaXRzZWxmLCBvdGhlcndpc2UgbXV0YXRpb24gaXMgaW5jb25zaXN0ZW50XG4gICAgICAgICAgICAgICAgcmV0dXJuIFtdO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgIH1cbiAgICBzZXQgYWNjZXNzTGlzdCh2YWx1ZSkge1xuICAgICAgICB0aGlzLiNhY2Nlc3NMaXN0ID0gKHZhbHVlID09IG51bGwpID8gbnVsbCA6IGFjY2Vzc0xpc3RpZnkodmFsdWUpO1xuICAgIH1cbiAgICBnZXQgYXV0aG9yaXphdGlvbkxpc3QoKSB7XG4gICAgICAgIGNvbnN0IHZhbHVlID0gdGhpcy4jYXV0aHMgfHwgbnVsbDtcbiAgICAgICAgaWYgKHZhbHVlID09IG51bGwpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLnR5cGUgPT09IDQpIHtcbiAgICAgICAgICAgICAgICAvLyBAVE9ETzogaW4gdjcsIHRoaXMgc2hvdWxkIGJlY29tZSBhIGxpdmUgb2JqZWN0IGl0c2VsZixcbiAgICAgICAgICAgICAgICAvLyBvdGhlcndpc2UgbXV0YXRpb24gaXMgaW5jb25zaXN0ZW50XG4gICAgICAgICAgICAgICAgcmV0dXJuIFtdO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgI
26774HJldHVybiB2YWx1ZTtcbiAgICB9XG4gICAgc2V0IGF1dGhvcml6YXRpb25MaXN0KGF1dGhzKSB7XG4gICAgICAgIHRoaXMuI2F1dGhzID0gKGF1dGhzID09IG51bGwpID8gbnVsbCA6IGF1dGhzLm1hcCgoYSkgPT4gYXV0aG9yaXphdGlvbmlmeShhKSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqICBUaGUgbWF4IGZlZSBwZXIgYmxvYiBnYXMgZm9yIENhbmN1biB0cmFuc2FjdGlvbnMuXG4gICAgICovXG4gICAgZ2V0IG1heEZlZVBlckJsb2JHYXMoKSB7XG4gICAgICAgIGNvbnN0IHZhbHVlID0gdGhpcy4jbWF4RmVlUGVyQmxvYkdhcztcbiAgICAgICAgaWYgKHZhbHVlID09IG51bGwgJiYgdGhpcy50eXBlID09PSAzKSB7XG4gICAgICAgICAgICByZXR1cm4gQk5fMDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgfVxuICAgIHNldCBtYXhGZWVQZXJCbG9iR2FzKHZhbHVlKSB7XG4gICAgICAgIHRoaXMuI21heEZlZVBlckJsb2JHYXMgPSAodmFsdWUgPT0gbnVsbCkgPyBudWxsIDogZ2V0QmlnSW50KHZhbHVlLCBcIm1heEZlZVBlckJsb2JHYXNcIik7XG4gICAgfVxuICAgIC8qKlxuICAgICAqICBUaGUgQkxPYiB2ZXJzaW9uZWQgaGFzaGVzIGZvciBDYW5jdW4gdHJhbnNhY3Rpb25zLlxuICAgICAqL1xuICAgIGdldCBibG9iVmVyc2lvbmVkSGFzaGVzKCkge1xuICAgICAgICAvLyBAVE9ETzogTXV0YXRpb24gaXMgaW5jb25zaXN0ZW50OyBpZiB1bnNldCwgdGhlIHJldHVybmVkIHZhbHVlXG4gICAgICAgIC8vIGNhbm5vdCBtdXRhdGUgdGhlIG9iamVjdCwgaWYgc2V0IGl0IGNhblxuICAgICAgICBsZXQgdmFsdWUgPSB0aGlzLiNibG9iVmVyc2lvbmVkSGFzaGVzO1xuICAgICAgICBpZiAodmFsdWUgPT0gbnVsbCAmJiB0aGlzLnR5cGUgPT09IDMpIHtcbiAgICAgICAgICAgIHJldHVybiBbXTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgfVxuICAgIHNldCBibG9iVmVyc2lvbmVkSGFzaGVzKHZhbHVlKSB7XG4gICAgICAgIGlmICh2YWx1ZSAhPSBudWxsKSB7XG4gICAgICAgICAgICBhc3NlcnRBcmd1bWVudChBcnJheS5pc0FycmF5KHZhbHVlKSwgXCJibG9iVmVyc2lvbmVkSGFzaGVzIG11c3QgYmUgYW4gQXJyYXlcIiwgXCJ2YWx1ZVwiLCB2YWx1ZSk7XG4gICAgICAgICAgICB2YWx1ZSA9IHZhbHVlLnNsaWNlKCk7XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHZhbHVlLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgYXNzZXJ0QXJndW1lbnQoaXNIZXhTdHJpbmcodmFsdWVbaV0sIDMyKSwgXCJpbnZhbGlkIGJsb2JWZXJzaW9uZWRIYXNoXCIsIGB2YWx1ZVske2l9XWAsIHZhbHVlW2ldKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB0aGlzLiNibG9iVmVyc2lvbmVkSGFzaGVzID0gdmFsdWU7XG4gICAgfVxuICAgIC8qKlxuICAgICAqICBUaGUgQkxPYnMgZm9yIHRoZSBUcmFuc2FjdGlvbiwgaWYgYW55LlxuICAgICAqXG4gICAgICogIElmIGBgYmxvYnNgYCBpcyBub24tYGBudWxsYGAsIHRoZW4gdGhlIFtbc2VyaWFpbGl6ZWRdXVxuICAgICAqICB3aWxsIHJldHVybiB0aGUgbmV0d29yayBmb3JtYXR0ZWQgc2lkZWNhciwgb3RoZXJ3aXNlIGl0XG4gICAgICogIHdpbGwgcmV0dXJuIHRoZSBzdGFuZGFyZCBbW2xpbmstZWlwLTI3MThdXSBwYXlsb2FkLiBUaGVcbiAgICAgKiAgW1t1bnNpZ25lZFNlcmlhbGl6ZWRdXSBpcyB1bmFmZmVjdGVkIHJlZ2FyZGxlc3MuXG4gICAgICpcbiAgICAgKiAgV2hlbiBzZXR0aW5nIGBgYmxvYnNgYCwgZWl0aGVyIGZ1bGx5IHZhbGlkIFtbQmxvYl1dIG9iamVjdHNcbiAgICAgKiAgbWF5IGJlIHNwZWNpZmllZCAoaS5lLiBjb3JyZWN0bHkgcGFkZGVkLCB3aXRoIGNvcnJlY3RcbiAgICAgKiAgY29tbWl0dG1lbnRzIGFuZCBwcm9vZnMpIG9yIGEgcmF3IFtbQnl0ZXNMaWtlXV0gbWF5XG4gICAgICogIGJlIHByb3ZpZGVkLlxuICAgICAqXG4gICAgICogIElmIHJhdyBbW0J5dGVzTGlrZV1dIGFyZSBwcm92aWRlZCwgdGhlIFtba3pnXV0gcHJvcGVydHkgKiptdXN0KipcbiAgICAgKiAgYmUgYWxyZWFkeSBzZXQuIFRoZSBibG9iIHdpbGwgYmUgY29ycmVjdGx5IHBhZGRlZCBhbmQgdGhlXG4gICAgICogIFtbS3pnTGlicmFyeV1dIHdpbGwgYmUgdXNlZCB0byBjb21wdXRlIHRoZSBjb21taXR0bWVudCBhbmRcbiAgICAgKiAgcHJvb2YgZm9yIHRoZSBibG9iLlxuICAgICAqXG4gICAgICogIEEgQkxPYiBpcyBhIHNlcXVlbmNlIG9mIGZpZWxkIGVsZW1lbnRzLCBlYWNoIG9mIHdoaWNoIG11c3RcbiAgICAgKiAgYmUgd2l0aGluIHRoZSBCTFMgZmllbGQgbW9kdWxvLCBzbyBzb21lIGFkZGl0aW9uYWwgcHJvY2Vzc2luZ1xuICAgICAqICBtYXkgYmUgcmVxdWlyZWQgdG8gZW5jb2RlIGFyYml0cmFyeSBkYXRhIHRvIGVuc3VyZSBlYWNoIDMyIGJ5dGVcbiAgICAgKiAgZmllbGQgaXMgd2l0aGluIHRoZSB2YWxpZCByYW5nZS5cbiAgICAgKlxuICAgICAqICBTZXR0aW5nIHRoaXMgYXV0b21hdGljYWxseSBwb3B1bGF0ZXMgW1tibG9iVmVyc2lvbmVkSGFzaGVzXV0sXG4gICAgICogIG92ZXJ3cml0aW5nIGFueSBleGlzdGluZyB2YWx1ZXMuIFNldHRpbmcgdGhpcyB0byBgYG51bGxgYFxuICAgICAqICBkb2VzICoqbm90KiogcmVtb3ZlIHRoZSBbW2Jsb2JWZXJzaW9uZWRIYXNoZXNdXSwgbGVhdmluZyB0aGVtXG4gICAgICogIHByZXNlbnQuXG4gICAgICovXG4gICAgZ2V0IGJsb2JzKCkge1xuICAgICAgICBpZiAodGhpcy4jYmxvYnMgPT0gbnVsbCkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuI2Jsb2JzLm1hcCgoYikgPT4gT2JqZWN0LmFzc2lnbih7fSwgYikpO1xuICAgIH1cbiAgICBzZXQgYmxvYnMoX2Jsb2JzKSB7XG4gICAgICAgIGlmIChfYmxvYnMgPT0gbnVsbCkge1xuICAgICAgICAgICAgdGhpcy4jYmxvYnMgPSBudWxsO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGJsb2JzID0gW107XG4gICAgICAgIGNvbnN0IHZlcnNpb25lZEhhc2hlcyA9IFtdO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IF9ibG9icy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgY29uc3QgYmxvYiA9IF9ibG9ic1tpXTtcbiAgICAgICAgICAgIGlmIChpc0J5dGVzTGlrZShibG9iKSkge1xuICAgICAgICAgICAgICAgIGFzc2VydCh0aGlzLiNremcsIFwiYWRkaW5nIGEgcmF3IGJsb2IgcmVxdWlyZXMgYSBLWkcgbGlicmFyeVwiLCBcIlVOU1VQUE9SVEVEX09QRVJBVElPTlwiLCB7XG4gICAgICAgICAgICAgICAgICAgIG9wZXJhdGlvbj
26774ogXCJzZXQgYmxvYnMoKVwiXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgbGV0IGRhdGEgPSBnZXRCeXRlcyhibG9iKTtcbiAgICAgICAgICAgICAgICBhc3NlcnRBcmd1bWVudChkYXRhLmxlbmd0aCA8PSBCTE9CX1NJWkUsIFwiYmxvYiBpcyB0b28gbGFyZ2VcIiwgYGJsb2JzWyR7aX1dYCwgYmxvYik7XG4gICAgICAgICAgICAgICAgLy8gUGFkIGJsb2IgaWYgbmVjZXNzYXJ5XG4gICAgICAgICAgICAgICAgaWYgKGRhdGEubGVuZ3RoICE9PSBCTE9CX1NJWkUpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcGFkZGVkID0gbmV3IFVpbnQ4QXJyYXkoQkxPQl9TSVpFKTtcbiAgICAgICAgICAgICAgICAgICAgcGFkZGVkLnNldChkYXRhKTtcbiAgICAgICAgICAgICAgICAgICAgZGF0YSA9IHBhZGRlZDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY29uc3QgY29tbWl0ID0gdGhpcy4ja3pnLmJsb2JUb0t6Z0NvbW1pdG1lbnQoZGF0YSk7XG4gICAgICAgICAgICAgICAgY29uc3QgcHJvb2YgPSBoZXhsaWZ5KHRoaXMuI2t6Zy5jb21wdXRlQmxvYkt6Z1Byb29mKGRhdGEsIGNvbW1pdCkpO1xuICAgICAgICAgICAgICAgIGJsb2JzLnB1c2goe1xuICAgICAgICAgICAgICAgICAgICBkYXRhOiBoZXhsaWZ5KGRhdGEpLFxuICAgICAgICAgICAgICAgICAgICBjb21taXRtZW50OiBoZXhsaWZ5KGNvbW1pdCksXG4gICAgICAgICAgICAgICAgICAgIHByb29mXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgdmVyc2lvbmVkSGFzaGVzLnB1c2goZ2V0VmVyc2lvbmVkSGFzaCgxLCBjb21taXQpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGNvbnN0IGRhdGEgPSBoZXhsaWZ5KGJsb2IuZGF0YSk7XG4gICAgICAgICAgICAgICAgY29uc3QgY29tbWl0bWVudCA9IGhleGxpZnkoYmxvYi5jb21taXRtZW50KTtcbiAgICAgICAgICAgICAgICBjb25zdCBwcm9vZiA9IGhleGxpZnkoYmxvYi5wcm9vZik7XG4gICAgICAgICAgICAgICAgYmxvYnMucHVzaCh7IGRhdGEsIGNvbW1pdG1lbnQsIHByb29mIH0pO1xuICAgICAgICAgICAgICAgIHZlcnNpb25lZEhhc2hlcy5wdXNoKGdldFZlcnNpb25lZEhhc2goMSwgY29tbWl0bWVudCkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHRoaXMuI2Jsb2JzID0gYmxvYnM7XG4gICAgICAgIHRoaXMuI2Jsb2JWZXJzaW9uZWRIYXNoZXMgPSB2ZXJzaW9uZWRIYXNoZXM7XG4gICAgfVxuICAgIGdldCBremcoKSB7IHJldHVybiB0aGlzLiNremc7IH1cbiAgICBzZXQga3pnKGt6Zykge1xuICAgICAgICBpZiAoa3pnID09IG51bGwpIHtcbiAgICAgICAgICAgIHRoaXMuI2t6ZyA9IG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0aGlzLiNremcgPSBnZXRLemdMaWJyYXJ5KGt6Zyk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZ2V0IGJsb2JXcmFwcGVyVmVyc2lvbigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuI2Jsb2JXcmFwcGVyVmVyc2lvbjtcbiAgICB9XG4gICAgc2V0IGJsb2JXcmFwcGVyVmVyc2lvbih2YWx1ZSkge1xuICAgICAgICB0aGlzLiNibG9iV3JhcHBlclZlcnNpb24gPSB2YWx1ZTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogIENyZWF0ZXMgYSBuZXcgVHJhbnNhY3Rpb24gd2l0aCBkZWZhdWx0IHZhbHVlcy5cbiAgICAgKi9cbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgdGhpcy4jdHlwZSA9IG51bGw7XG4gICAgICAgIHRoaXMuI3RvID0gbnVsbDtcbiAgICAgICAgdGhpcy4jbm9uY2UgPSAwO1xuICAgICAgICB0aGlzLiNnYXNMaW1pdCA9IEJOXzA7XG4gICAgICAgIHRoaXMuI2dhc1ByaWNlID0gbnVsbDtcbiAgICAgICAgdGhpcy4jbWF4UHJpb3JpdHlGZWVQZXJHYXMgPSBudWxsO1xuICAgICAgICB0aGlzLiNtYXhGZWVQZXJHYXMgPSBudWxsO1xuICAgICAgICB0aGlzLiNkYXRhID0gXCIweFwiO1xuICAgICAgICB0aGlzLiN2YWx1ZSA9IEJOXzA7XG4gICAgICAgIHRoaXMuI2NoYWluSWQgPSBCTl8wO1xuICAgICAgICB0aGlzLiNzaWcgPSBudWxsO1xuICAgICAgICB0aGlzLiNhY2Nlc3NMaXN0ID0gbnVsbDtcbiAgICAgICAgdGhpcy4jbWF4RmVlUGVyQmxvYkdhcyA9IG51bGw7XG4gICAgICAgIHRoaXMuI2Jsb2JWZXJzaW9uZWRIYXNoZXMgPSBudWxsO1xuICAgICAgICB0aGlzLiNremcgPSBudWxsO1xuICAgICAgICB0aGlzLiNibG9icyA9IG51bGw7XG4gICAgICAgIHRoaXMuI2F1dGhzID0gbnVsbDtcbiAgICAgICAgdGhpcy4jYmxvYldyYXBwZXJWZXJzaW9uID0gbnVsbDtcbiAgICB9XG4gICAgLyoqXG4gICAgICogIFRoZSB0cmFuc2FjdGlvbiBoYXNoLCBpZiBzaWduZWQuIE90aGVyd2lzZSwgYGBudWxsYGAuXG4gICAgICovXG4gICAgZ2V0IGhhc2goKSB7XG4gICAgICAgIGlmICh0aGlzLnNpZ25hdHVyZSA9PSBudWxsKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4ga2VjY2FrMjU2KHRoaXMuI2dldFNlcmlhbGl6ZWQodHJ1ZSwgZmFsc2UpKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogIFRoZSBwcmUtaW1hZ2UgaGFzaCBvZiB0aGlzIHRyYW5zYWN0aW9uLlxuICAgICAqXG4gICAgICogIFRoaXMgaXMgdGhlIGRpZ2VzdCB0aGF0IGEgW1tTaWduZXJdXSBtdXN0IHNpZ24gdG8gYXV0aG9yaXplXG4gICAgICogIHRoaXMgdHJhbnNhY3Rpb24uXG4gICAgICovXG4gICAgZ2V0IHVuc2lnbmVkSGFzaCgpIHtcbiAgICAgICAgcmV0dXJuIGtlY2NhazI1Nih0aGlzLnVuc2lnbmVkU2VyaWFsaXplZCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqICBUaGUgc2VuZGluZyBhZGRyZXNzLCBpZiBzaWduZWQuIE90aGVyd2lzZSwgYGBudWxsYGAuXG4gICAgICovXG4gICAgZ2V0IGZyb20oKSB7XG4gICAgICAgIGlmICh0aGlzLnNpZ25hdHVyZSA9PSBudWxsKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVjb3ZlckFkZHJlc3ModGhpcy51bnNpZ25lZEhhc2gsIHRoaXMuc2lnbmF0dXJlLmdldENhbm9uaWNhbCgpKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogIFRoZSBwdWJsaWMga2V5IG9mIHRoZSBzZW5kZXIsIGlmIHNpZ25lZC4gT3RoZXJ3aXNlLCBgYG51bGxgYC5cbiAgICAgKi9cbiAgICBnZXQgZnJvbVB1YmxpY0tleSgpIHtcbiAgICAgICAgaWYgKHRoaXMuc2lnbmF0dXJlID09IG51bGwpIHtcbiAgICAgICAgICAgI
26774HJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBTaWduaW5nS2V5LnJlY292ZXJQdWJsaWNLZXkodGhpcy51bnNpZ25lZEhhc2gsIHRoaXMuc2lnbmF0dXJlLmdldENhbm9uaWNhbCgpKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogIFJldHVybnMgdHJ1ZSBpZiBzaWduZWQuXG4gICAgICpcbiAgICAgKiAgVGhpcyBwcm92aWRlcyBhIFR5cGUgR3VhcmQgdGhhdCBwcm9wZXJ0aWVzIHJlcXVpcmluZyBhIHNpZ25lZFxuICAgICAqICB0cmFuc2FjdGlvbiBhcmUgbm9uLW51bGwuXG4gICAgICovXG4gICAgaXNTaWduZWQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnNpZ25hdHVyZSAhPSBudWxsO1xuICAgIH1cbiAgICAjZ2V0U2VyaWFsaXplZChzaWduZWQsIHNpZGVjYXIpIHtcbiAgICAgICAgYXNzZXJ0KCFzaWduZWQgfHwgdGhpcy5zaWduYXR1cmUgIT0gbnVsbCwgXCJjYW5ub3Qgc2VyaWFsaXplIHVuc2lnbmVkIHRyYW5zYWN0aW9uOyBtYXliZSB5b3UgbWVhbnQgLnVuc2lnbmVkU2VyaWFsaXplZFwiLCBcIlVOU1VQUE9SVEVEX09QRVJBVElPTlwiLCB7IG9wZXJhdGlvbjogXCIuc2VyaWFsaXplZFwiIH0pO1xuICAgICAgICBjb25zdCBzaWcgPSBzaWduZWQgPyB0aGlzLnNpZ25hdHVyZSA6IG51bGw7XG4gICAgICAgIHN3aXRjaCAodGhpcy5pbmZlclR5cGUoKSkge1xuICAgICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgICAgIHJldHVybiBfc2VyaWFsaXplTGVnYWN5KHRoaXMsIHNpZyk7XG4gICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgICAgcmV0dXJuIF9zZXJpYWxpemVFaXAyOTMwKHRoaXMsIHNpZyk7XG4gICAgICAgICAgICBjYXNlIDI6XG4gICAgICAgICAgICAgICAgcmV0dXJuIF9zZXJpYWxpemVFaXAxNTU5KHRoaXMsIHNpZyk7XG4gICAgICAgICAgICBjYXNlIDM6XG4gICAgICAgICAgICAgICAgcmV0dXJuIF9zZXJpYWxpemVFaXA0ODQ0KHRoaXMsIHNpZywgc2lkZWNhciA/IHRoaXMuYmxvYnMgOiBudWxsKTtcbiAgICAgICAgICAgIGNhc2UgNDpcbiAgICAgICAgICAgICAgICByZXR1cm4gX3NlcmlhbGl6ZUVpcDc3MDIodGhpcywgc2lnKTtcbiAgICAgICAgfVxuICAgICAgICBhc3NlcnQoZmFsc2UsIFwidW5zdXBwb3J0ZWQgdHJhbnNhY3Rpb24gdHlwZVwiLCBcIlVOU1VQUE9SVEVEX09QRVJBVElPTlwiLCB7IG9wZXJhdGlvbjogXCIuc2VyaWFsaXplZFwiIH0pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiAgVGhlIHNlcmlhbGl6ZWQgdHJhbnNhY3Rpb24uXG4gICAgICpcbiAgICAgKiAgVGhpcyB0aHJvd3MgaWYgdGhlIHRyYW5zYWN0aW9uIGlzIHVuc2lnbmVkLiBGb3IgdGhlIHByZS1pbWFnZSxcbiAgICAgKiAgdXNlIFtbdW5zaWduZWRTZXJpYWxpemVkXV0uXG4gICAgICovXG4gICAgZ2V0IHNlcmlhbGl6ZWQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLiNnZXRTZXJpYWxpemVkKHRydWUsIHRydWUpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiAgVGhlIHRyYW5zYWN0aW9uIHByZS1pbWFnZS5cbiAgICAgKlxuICAgICAqICBUaGUgaGFzaCBvZiB0aGlzIGlzIHRoZSBkaWdlc3Qgd2hpY2ggbmVlZHMgdG8gYmUgc2lnbmVkIHRvXG4gICAgICogIGF1dGhvcml6ZSB0aGlzIHRyYW5zYWN0aW9uLlxuICAgICAqL1xuICAgIGdldCB1bnNpZ25lZFNlcmlhbGl6ZWQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLiNnZXRTZXJpYWxpemVkKGZhbHNlLCBmYWxzZSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqICBSZXR1cm4gdGhlIG1vc3QgXCJsaWtlbHlcIiB0eXBlOyBjdXJyZW50bHkgdGhlIGhpZ2hlc3RcbiAgICAgKiAgc3VwcG9ydGVkIHRyYW5zYWN0aW9uIHR5cGUuXG4gICAgICovXG4gICAgaW5mZXJUeXBlKCkge1xuICAgICAgICBjb25zdCB0eXBlcyA9IHRoaXMuaW5mZXJUeXBlcygpO1xuICAgICAgICAvLyBQcmVmZXIgTG9uZG9uIChFSVAtMTU1OSkgb3ZlciBDYW5jdW4gKEJMT2IpXG4gICAgICAgIGlmICh0eXBlcy5pbmRleE9mKDIpID49IDApIHtcbiAgICAgICAgICAgIHJldHVybiAyO1xuICAgICAgICB9XG4gICAgICAgIC8vIFJldHVybiB0aGUgaGlnaGVzdCBpbmZlcnJlZCB0eXBlXG4gICAgICAgIHJldHVybiAodHlwZXMucG9wKCkpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiAgVmFsaWRhdGVzIHRoZSBleHBsaWNpdCBwcm9wZXJ0aWVzIGFuZCByZXR1cm5zIGEgbGlzdCBvZiBjb21wYXRpYmxlXG4gICAgICogIHRyYW5zYWN0aW9uIHR5cGVzLlxuICAgICAqL1xuICAgIGluZmVyVHlwZXMoKSB7XG4gICAgICAgIC8vIENoZWNrcyB0aGF0IHRoZXJlIGFyZSBubyBjb25mbGljdGluZyBwcm9wZXJ0aWVzIHNldFxuICAgICAgICBjb25zdCBoYXNHYXNQcmljZSA9IHRoaXMuZ2FzUHJpY2UgIT0gbnVsbDtcbiAgICAgICAgY29uc3QgaGFzRmVlID0gKHRoaXMubWF4RmVlUGVyR2FzICE9IG51bGwgfHwgdGhpcy5tYXhQcmlvcml0eUZlZVBlckdhcyAhPSBudWxsKTtcbiAgICAgICAgY29uc3QgaGFzQWNjZXNzTGlzdCA9ICh0aGlzLmFjY2Vzc0xpc3QgIT0gbnVsbCk7XG4gICAgICAgIGNvbnN0IGhhc0Jsb2IgPSAodGhpcy4jbWF4RmVlUGVyQmxvYkdhcyAhPSBudWxsIHx8IHRoaXMuI2Jsb2JWZXJzaW9uZWRIYXNoZXMpO1xuICAgICAgICAvL2lmIChoYXNHYXNQcmljZSAmJiBoYXNGZWUpIHtcbiAgICAgICAgLy8gICAgdGhyb3cgbmV3IEVycm9yKFwidHJhbnNhY3Rpb24gY2Fubm90IGhhdmUgZ2FzUHJpY2UgYW5kIG1heEZlZVBlckdhc1wiKTtcbiAgICAgICAgLy99XG4gICAgICAgIGlmICh0aGlzLm1heEZlZVBlckdhcyAhPSBudWxsICYmIHRoaXMubWF4UHJpb3JpdHlGZWVQZXJHYXMgIT0gbnVsbCkge1xuICAgICAgICAgICAgYXNzZXJ0KHRoaXMubWF4RmVlUGVyR2FzID49IHRoaXMubWF4UHJpb3JpdHlGZWVQZXJHYXMsIFwicHJpb3JpdHlGZWUgY2Fubm90IGJlIG1vcmUgdGhhbiBtYXhGZWVcIiwgXCJCQURfREFUQVwiLCB7IHZhbHVlOiB0aGlzIH0pO1xuICAgICAgICB9XG4gICAgICAgIC8vaWYgKHRoaXMudHlwZSA9PT0gMiAmJiBoYXNHYXNQcmljZSkge1xuICAgICAgICAvLyAgICB0aHJvdyBuZXcgRXJyb3IoXCJlaXAtMTU1OSB0cmFuc2FjdGlvbiBjYW5ub3QgaGF2ZSBnYXNQcmljZVwiKTtcbiAgICAgICAgLy99XG4gICAgICAgIGFzc2VydCghaGFzRmVlIHx8ICh0aGlzLnR5cGUgIT09IDAgJiYgdGhpcy50eXBlICE9PSAxKSwgXCJ0cmFuc2FjdGlvbiB0eXBlIGNhbm5vdCBoYXZlIG1heEZlZVBlckdhcyBvciBtYXhQcmlvcml0eUZlZVBlckdhc1wiLCBcIkJBRF9EQVRBXCIsIHsgdmFsdWU6IHRoaXMgfSk7XG4gICAgICAgIGFzc2VydCh0aGlzLnR5cGUgIT09IDAgfHwgIWhhc0FjY2Vzc0xpc3QsIFwibGVnYWN5IHRyYW5zYWN0aW9uIGNhbm5vdCBoYXZlIGFjY2Vzc0xpc3RcIiwgXCJCQURfREFUQVwiLCB7IHZhbHVlOiB0aGlzIH0pO1xuICAgICAgICBjb25zdCB0eXBlcyA9IFtdO1xuICAgICAgICAvLyBFeHBsaWNpdCB0eXBlXG4gICAgICAgIGlmICh0aGlzLnR5cGUgIT0gbnVsbCkge1xuICAgICAgICAgICAgdHlwZXMucHVzaCh0aGlzLnR5cGUpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgaWYgKHRoaXMuYXV0aG9yaXphdGlvbkxpc3QgJiYgdGhpcy5hdXRob3JpemF0aW9uTGlzdC5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICB0eX
26774Blcy5wdXNoKDQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoaGFzRmVlKSB7XG4gICAgICAgICAgICAgICAgdHlwZXMucHVzaCgyKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKGhhc0dhc1ByaWNlKSB7XG4gICAgICAgICAgICAgICAgdHlwZXMucHVzaCgxKTtcbiAgICAgICAgICAgICAgICBpZiAoIWhhc0FjY2Vzc0xpc3QpIHtcbiAgICAgICAgICAgICAgICAgICAgdHlwZXMucHVzaCgwKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChoYXNBY2Nlc3NMaXN0KSB7XG4gICAgICAgICAgICAgICAgdHlwZXMucHVzaCgxKTtcbiAgICAgICAgICAgICAgICB0eXBlcy5wdXNoKDIpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoaGFzQmxvYiAmJiB0aGlzLnRvKSB7XG4gICAgICAgICAgICAgICAgdHlwZXMucHVzaCgzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHR5cGVzLnB1c2goMCk7XG4gICAgICAgICAgICAgICAgdHlwZXMucHVzaCgxKTtcbiAgICAgICAgICAgICAgICB0eXBlcy5wdXNoKDIpO1xuICAgICAgICAgICAgICAgIHR5cGVzLnB1c2goMyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgdHlwZXMuc29ydCgpO1xuICAgICAgICByZXR1cm4gdHlwZXM7XG4gICAgfVxuICAgIC8qKlxuICAgICAqICBSZXR1cm5zIHRydWUgaWYgdGhpcyB0cmFuc2FjdGlvbiBpcyBhIGxlZ2FjeSB0cmFuc2FjdGlvbiAoaS5lLlxuICAgICAqICBgYHR5cGUgPT09IDBgYCkuXG4gICAgICpcbiAgICAgKiAgVGhpcyBwcm92aWRlcyBhIFR5cGUgR3VhcmQgdGhhdCB0aGUgcmVsYXRlZCBwcm9wZXJ0aWVzIGFyZVxuICAgICAqICBub24tbnVsbC5cbiAgICAgKi9cbiAgICBpc0xlZ2FjeSgpIHtcbiAgICAgICAgcmV0dXJuICh0aGlzLnR5cGUgPT09IDApO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiAgUmV0dXJucyB0cnVlIGlmIHRoaXMgdHJhbnNhY3Rpb24gaXMgYmVybGluIGhhcmRmb3JtIHRyYW5zYWN0aW9uIChpLmUuXG4gICAgICogIGBgdHlwZSA9PT0gMWBgKS5cbiAgICAgKlxuICAgICAqICBUaGlzIHByb3ZpZGVzIGEgVHlwZSBHdWFyZCB0aGF0IHRoZSByZWxhdGVkIHByb3BlcnRpZXMgYXJlXG4gICAgICogIG5vbi1udWxsLlxuICAgICAqL1xuICAgIGlzQmVybGluKCkge1xuICAgICAgICByZXR1cm4gKHRoaXMudHlwZSA9PT0gMSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqICBSZXR1cm5zIHRydWUgaWYgdGhpcyB0cmFuc2FjdGlvbiBpcyBsb25kb24gaGFyZGZvcm0gdHJhbnNhY3Rpb24gKGkuZS5cbiAgICAgKiAgYGB0eXBlID09PSAyYGApLlxuICAgICAqXG4gICAgICogIFRoaXMgcHJvdmlkZXMgYSBUeXBlIEd1YXJkIHRoYXQgdGhlIHJlbGF0ZWQgcHJvcGVydGllcyBhcmVcbiAgICAgKiAgbm9uLW51bGwuXG4gICAgICovXG4gICAgaXNMb25kb24oKSB7XG4gICAgICAgIHJldHVybiAodGhpcy50eXBlID09PSAyKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogIFJldHVybnMgdHJ1ZSBpZiB0aGlzIHRyYW5zYWN0aW9uIGlzIGFuIFtbbGluay1laXAtNDg0NF1dIEJMT0JcbiAgICAgKiAgdHJhbnNhY3Rpb24uXG4gICAgICpcbiAgICAgKiAgVGhpcyBwcm92aWRlcyBhIFR5cGUgR3VhcmQgdGhhdCB0aGUgcmVsYXRlZCBwcm9wZXJ0aWVzIGFyZVxuICAgICAqICBub24tbnVsbC5cbiAgICAgKi9cbiAgICBpc0NhbmN1bigpIHtcbiAgICAgICAgcmV0dXJuICh0aGlzLnR5cGUgPT09IDMpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiAgQ3JlYXRlIGEgY29weSBvZiB0aGlzIHRyYW5zYWNpdG9uLlxuICAgICAqL1xuICAgIGNsb25lKCkge1xuICAgICAgICByZXR1cm4gVHJhbnNhY3Rpb24uZnJvbSh0aGlzKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogIFJldHVybiBhIEpTT04tZnJpZW5kbHkgb2JqZWN0LlxuICAgICAqL1xuICAgIHRvSlNPTigpIHtcbiAgICAgICAgY29uc3QgcyA9ICh2KSA9PiB7XG4gICAgICAgICAgICBpZiAodiA9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gdi50b1N0cmluZygpO1xuICAgICAgICB9O1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgdHlwZTogdGhpcy50eXBlLFxuICAgICAgICAgICAgdG86IHRoaXMudG8sXG4gICAgICAgICAgICAvLyAgICAgICAgICAgIGZyb206IHRoaXMuZnJvbSxcbiAgICAgICAgICAgIGRhdGE6IHRoaXMuZGF0YSxcbiAgICAgICAgICAgIG5vbmNlOiB0aGlzLm5vbmNlLFxuICAgICAgICAgICAgZ2FzTGltaXQ6IHModGhpcy5nYXNMaW1pdCksXG4gICAgICAgICAgICBnYXNQcmljZTogcyh0aGlzLmdhc1ByaWNlKSxcbiAgICAgICAgICAgIG1heFByaW9yaXR5RmVlUGVyR2FzOiBzKHRoaXMubWF4UHJpb3JpdHlGZWVQZXJHYXMpLFxuICAgICAgICAgICAgbWF4RmVlUGVyR2FzOiBzKHRoaXMubWF4RmVlUGVyR2FzKSxcbiAgICAgICAgICAgIHZhbHVlOiBzKHRoaXMudmFsdWUpLFxuICAgICAgICAgICAgY2hhaW5JZDogcyh0aGlzLmNoYWluSWQpLFxuICAgICAgICAgICAgc2lnOiB0aGlzLnNpZ25hdHVyZSA/IHRoaXMuc2lnbmF0dXJlLnRvSlNPTigpIDogbnVsbCxcbiAgICAgICAgICAgIGFjY2Vzc0xpc3Q6IHRoaXMuYWNjZXNzTGlzdFxuICAgICAgICB9O1xuICAgIH1cbiAgICBbaW5zcGVjdF0oKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnRvU3RyaW5nKCk7XG4gICAgfVxuICAgIHRvU3RyaW5nKCkge1xuICAgICAgICBjb25zdCBvdXRwdXQgPSBbXTtcbiAgICAgICAgY29uc3QgYWRkID0gKGtleSkgPT4ge1xuICAgICAgICAgICAgbGV0IHZhbHVlID0gdGhpc1trZXldO1xuICAgICAgICAgICAgaWYgKHR5cGVvZiAodmFsdWUpID09PSBcInN0cmluZ1wiKSB7XG4gICAgICAgICAgICAgICAgdmFsdWUgPSBKU09OLnN0cmluZ2lmeSh2YWx1ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBvdXRwdXQucHVzaChgJHtrZXl9OiAke3ZhbHVlfWApO1xuICAgICAgICB9O1xuICAgICAgICBpZiAodGhpcy50eXBlKSB7XG4gICAgICAgICAgICBhZGQoXCJ0eXBlXCIpO1xuICAgICAgICB9XG4gICAgICAgIGFkZChcInRvXCIpO1xuICAgICAgICBhZGQoXCJkYXRhXCIpO1xuICAgICAgICBhZGQoXCJub25jZVwiKTtcbiAgICAgICAgYWRkKFwiZ2FzTGltaXRcIik7XG4gICAgICAgIGFkZChcInZhbHVlXCIpO1xuICAgICAgICBpZiAodGhpcy5jaGFpbklkICE9IG51bGwpIHtcbiAgICAgICAgICAgIGFkZChcImNoYWluSWRcIik7XG4gICAgICAgI
26774H1cbiAgICAgICAgaWYgKHRoaXMuc2lnbmF0dXJlKSB7XG4gICAgICAgICAgICBhZGQoXCJmcm9tXCIpO1xuICAgICAgICAgICAgb3V0cHV0LnB1c2goYHNpZ25hdHVyZTogJHt0aGlzLnNpZ25hdHVyZS50b1N0cmluZygpfWApO1xuICAgICAgICB9XG4gICAgICAgIC8vIEBUT0RPOiBhY2Nlc3NMaXN0XG4gICAgICAgIC8vIEBUT0RPOiBibG9icyAobWlnaHQgbWFrZSBvdXRwdXQgaHVnZTsgbWF5YmUganVzdCBpbmNsdWRlIGEgZmxhZz8pXG4gICAgICAgIGNvbnN0IGF1dGhzID0gdGhpcy5hdXRob3JpemF0aW9uTGlzdDtcbiAgICAgICAgaWYgKGF1dGhzKSB7XG4gICAgICAgICAgICBjb25zdCBvdXRwdXRBdXRocyA9IFtdO1xuICAgICAgICAgICAgZm9yIChjb25zdCBhdXRoIG9mIGF1dGhzKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgbyA9IFtdO1xuICAgICAgICAgICAgICAgIG8ucHVzaChgYWRkcmVzczogJHtKU09OLnN0cmluZ2lmeShhdXRoLmFkZHJlc3MpfWApO1xuICAgICAgICAgICAgICAgIGlmIChhdXRoLm5vbmNlICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgby5wdXNoKGBub25jZTogJHthdXRoLm5vbmNlfWApO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoYXV0aC5jaGFpbklkICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgby5wdXNoKGBjaGFpbklkOiAke2F1dGguY2hhaW5JZH1gKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKGF1dGguc2lnbmF0dXJlKSB7XG4gICAgICAgICAgICAgICAgICAgIG8ucHVzaChgc2lnbmF0dXJlOiAke2F1dGguc2lnbmF0dXJlLnRvU3RyaW5nKCl9YCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIG91dHB1dEF1dGhzLnB1c2goYEF1dGhvcml6YXRpb24geyAke28uam9pbihcIiwgXCIpfSB9YCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBvdXRwdXQucHVzaChgYXV0aG9yaXphdGlvbnM6IFsgJHtvdXRwdXRBdXRocy5qb2luKFwiLCBcIil9IF1gKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYFRyYW5zYWN0aW9uIHsgJHtvdXRwdXQuam9pbihcIiwgXCIpfSB9YDtcbiAgICB9XG4gICAgLyoqXG4gICAgICogIENyZWF0ZSBhICoqVHJhbnNhY3Rpb24qKiBmcm9tIGEgc2VyaWFsaXplZCB0cmFuc2FjdGlvbiBvciBhXG4gICAgICogIFRyYW5zYWN0aW9uLWxpa2Ugb2JqZWN0LlxuICAgICAqL1xuICAgIHN0YXRpYyBmcm9tKHR4KSB7XG4gICAgICAgIGlmICh0eCA9PSBudWxsKSB7XG4gICAgICAgICAgICByZXR1cm4gbmV3IFRyYW5zYWN0aW9uKCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGVvZiAodHgpID09PSBcInN0cmluZ1wiKSB7XG4gICAgICAgICAgICBjb25zdCBwYXlsb2FkID0gZ2V0Qnl0ZXModHgpO1xuICAgICAgICAgICAgaWYgKHBheWxvYWRbMF0gPj0gMHg3ZikgeyAvLyBAVE9ETzogPiB2cyA+PSA/P1xuICAgICAgICAgICAgICAgIHJldHVybiBUcmFuc2FjdGlvbi5mcm9tKF9wYXJzZUxlZ2FjeShwYXlsb2FkKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBzd2l0Y2ggKHBheWxvYWRbMF0pIHtcbiAgICAgICAgICAgICAgICBjYXNlIDE6IHJldHVybiBUcmFuc2FjdGlvbi5mcm9tKF9wYXJzZUVpcDI5MzAocGF5bG9hZCkpO1xuICAgICAgICAgICAgICAgIGNhc2UgMjogcmV0dXJuIFRyYW5zYWN0aW9uLmZyb20oX3BhcnNlRWlwMTU1OShwYXlsb2FkKSk7XG4gICAgICAgICAgICAgICAgY2FzZSAzOiByZXR1cm4gVHJhbnNhY3Rpb24uZnJvbShfcGFyc2VFaXA0ODQ0KHBheWxvYWQpKTtcbiAgICAgICAgICAgICAgICBjYXNlIDQ6IHJldHVybiBUcmFuc2FjdGlvbi5mcm9tKF9wYXJzZUVpcDc3MDIocGF5bG9hZCkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgYXNzZXJ0KGZhbHNlLCBcInVuc3VwcG9ydGVkIHRyYW5zYWN0aW9uIHR5cGVcIiwgXCJVTlNVUFBPUlRFRF9PUEVSQVRJT05cIiwgeyBvcGVyYXRpb246IFwiZnJvbVwiIH0pO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IG5ldyBUcmFuc2FjdGlvbigpO1xuICAgICAgICBpZiAodHgudHlwZSAhPSBudWxsKSB7XG4gICAgICAgICAgICByZXN1bHQudHlwZSA9IHR4LnR5cGU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR4LnRvICE9IG51bGwpIHtcbiAgICAgICAgICAgIHJlc3VsdC50byA9IHR4LnRvO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eC5ub25jZSAhPSBudWxsKSB7XG4gICAgICAgICAgICByZXN1bHQubm9uY2UgPSB0eC5ub25jZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHguZ2FzTGltaXQgIT0gbnVsbCkge1xuICAgICAgICAgICAgcmVzdWx0Lmdhc0xpbWl0ID0gdHguZ2FzTGltaXQ7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR4Lmdhc1ByaWNlICE9IG51bGwpIHtcbiAgICAgICAgICAgIHJlc3VsdC5nYXNQcmljZSA9IHR4Lmdhc1ByaWNlO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eC5tYXhQcmlvcml0eUZlZVBlckdhcyAhPSBudWxsKSB7XG4gICAgICAgICAgICByZXN1bHQubWF4UHJpb3JpdHlGZWVQZXJHYXMgPSB0eC5tYXhQcmlvcml0eUZlZVBlckdhcztcbiAgICAgICAgfVxuICAgICAgICBpZiAodHgubWF4RmVlUGVyR2FzICE9IG51bGwpIHtcbiAgICAgICAgICAgIHJlc3VsdC5tYXhGZWVQZXJHYXMgPSB0eC5tYXhGZWVQZXJHYXM7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR4Lm1heEZlZVBlckJsb2JHYXMgIT0gbnVsbCkge1xuICAgICAgICAgICAgcmVzdWx0Lm1heEZlZVBlckJsb2JHYXMgPSB0eC5tYXhGZWVQZXJCbG9iR2FzO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eC5kYXRhICE9IG51bGwpIHtcbiAgICAgICAgICAgIHJlc3VsdC5kYXRhID0gdHguZGF0YTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHgudmFsdWUgIT0gbnVsbCkge1xuICAgICAgICAgICAgcmVzdWx0LnZhbHVlID0gdHgudmFsdWU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR4LmNoYWluSWQgIT0gbnVsbCkge1xuICAgICAgICAgICAgcmVzdWx0LmNoYWluSWQgPSB0eC5jaGFpbklkO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eC5zaWduYXR1cmUgIT0gbnVsbCkge1xuICAgICAgICAgICAgcmVzdWx0LnNpZ25hdHVyZSA9IFNpZ25hdHVyZS5mcm9tKHR4LnNpZ25hdHVyZSk7XG4gICAgICAgI
26774H1cbiAgICAgICAgaWYgKHR4LmFjY2Vzc0xpc3QgIT0gbnVsbCkge1xuICAgICAgICAgICAgcmVzdWx0LmFjY2Vzc0xpc3QgPSB0eC5hY2Nlc3NMaXN0O1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eC5hdXRob3JpemF0aW9uTGlzdCAhPSBudWxsKSB7XG4gICAgICAgICAgICByZXN1bHQuYXV0aG9yaXphdGlvbkxpc3QgPSB0eC5hdXRob3JpemF0aW9uTGlzdDtcbiAgICAgICAgfVxuICAgICAgICAvLyBUaGlzIHdpbGwgZ2V0IG92ZXJ3cml0dGVuIGJ5IGJsb2JzLCBpZiBwcmVzZW50XG4gICAgICAgIGlmICh0eC5ibG9iVmVyc2lvbmVkSGFzaGVzICE9IG51bGwpIHtcbiAgICAgICAgICAgIHJlc3VsdC5ibG9iVmVyc2lvbmVkSGFzaGVzID0gdHguYmxvYlZlcnNpb25lZEhhc2hlcztcbiAgICAgICAgfVxuICAgICAgICAvLyBNYWtlIHN1cmUgd2UgYXNzaWduIHRoZSBremcgYmVmb3JlIGFzc2lnbmluZyBibG9icywgd2hpY2hcbiAgICAgICAgLy8gcmVxdWlyZSB0aGUgbGlicmFyeSBpbiB0aGUgZXZlbnQgcmF3IGJsb2IgZGF0YSBpcyBwcm92aWRlZC5cbiAgICAgICAgaWYgKHR4Lmt6ZyAhPSBudWxsKSB7XG4gICAgICAgICAgICByZXN1bHQua3pnID0gdHgua3pnO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eC5ibG9iV3JhcHBlclZlcnNpb24gIT0gbnVsbCkge1xuICAgICAgICAgICAgcmVzdWx0LmJsb2JXcmFwcGVyVmVyc2lvbiA9IHR4LmJsb2JXcmFwcGVyVmVyc2lvbjtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHguYmxvYnMgIT0gbnVsbCkge1xuICAgICAgICAgICAgcmVzdWx0LmJsb2JzID0gdHguYmxvYnM7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR4Lmhhc2ggIT0gbnVsbCkge1xuICAgICAgICAgICAgYXNzZXJ0QXJndW1lbnQocmVzdWx0LmlzU2lnbmVkKCksIFwidW5zaWduZWQgdHJhbnNhY3Rpb24gY2Fubm90IGRlZmluZSAnLmhhc2gnXCIsIFwidHhcIiwgdHgpO1xuICAgICAgICAgICAgYXNzZXJ0QXJndW1lbnQocmVzdWx0Lmhhc2ggPT09IHR4Lmhhc2gsIFwiaGFzaCBtaXNtYXRjaFwiLCBcInR4XCIsIHR4KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHguZnJvbSAhPSBudWxsKSB7XG4gICAgICAgICAgICBhc3NlcnRBcmd1bWVudChyZXN1bHQuaXNTaWduZWQoKSwgXCJ1bnNpZ25lZCB0cmFuc2FjdGlvbiBjYW5ub3QgZGVmaW5lICcuZnJvbSdcIiwgXCJ0eFwiLCB0eCk7XG4gICAgICAgICAgICBhc3NlcnRBcmd1bWVudChyZXN1bHQuZnJvbS50b0xvd2VyQ2FzZSgpID09PSAodHguZnJvbSB8fCBcIlwiKS50b0xvd2VyQ2FzZSgpLCBcImZyb20gbWlzbWF0Y2hcIiwgXCJ0eFwiLCB0eCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD10cmFuc2FjdGlvbi5qcy5tYXAiLCJpbXBvcnQgeyBnZXRBZGRyZXNzIH0gZnJvbSBcIi4uL2FkZHJlc3MvaW5kZXguanNcIjtcbmltcG9ydCB7IGtlY2NhazI1NiB9IGZyb20gXCIuLi9jcnlwdG8vaW5kZXguanNcIjtcbmltcG9ydCB7IHJlY292ZXJBZGRyZXNzIH0gZnJvbSBcIi4uL3RyYW5zYWN0aW9uL2luZGV4LmpzXCI7XG5pbXBvcnQgeyBhc3NlcnRBcmd1bWVudCwgY29uY2F0LCBlbmNvZGVSbHAsIHRvQmVBcnJheSB9IGZyb20gXCIuLi91dGlscy9pbmRleC5qc1wiO1xuLyoqXG4gKiAgQ29tcHV0ZXMgdGhlIFtbbGluay1laXAtNzcwMl1dIGF1dGhvcml6YXRpb24gZGlnZXN0IHRvIHNpZ24uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBoYXNoQXV0aG9yaXphdGlvbihhdXRoKSB7XG4gICAgYXNzZXJ0QXJndW1lbnQodHlwZW9mIChhdXRoLmFkZHJlc3MpID09PSBcInN0cmluZ1wiLCBcImludmFsaWQgYWRkcmVzcyBmb3IgaGFzaEF1dGhvcml6YXRpb25cIiwgXCJhdXRoLmFkZHJlc3NcIiwgYXV0aCk7XG4gICAgcmV0dXJuIGtlY2NhazI1Nihjb25jYXQoW1xuICAgICAgICBcIjB4MDVcIiwgZW5jb2RlUmxwKFtcbiAgICAgICAgICAgIChhdXRoLmNoYWluSWQgIT0gbnVsbCkgPyB0b0JlQXJyYXkoYXV0aC5jaGFpbklkKSA6IFwiMHhcIixcbiAgICAgICAgICAgIGdldEFkZHJl
26774c3MoYXV0aC5hZGRyZXNzKSxcbiAgICAgICAgICAgIChhdXRoLm5vbmNlICE9IG51bGwpID8gdG9CZUFycmF5KGF1dGgubm9uY2UpIDogXCIweFwiLFxuICAgICAgICBdKVxuICAgIF0pKTtcbn1cbi8qKlxuICogIFJldHVybiB0aGUgYWRkcmVzcyBvZiB0aGUgcHJpdmF0ZSBrZXkgdGhhdCBwcm9kdWNlZFxuICogIHRoZSBzaWduYXR1cmUgJSVzaWclJSBkdXJpbmcgc2lnbmluZyBmb3IgJSVtZXNzYWdlJSUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB2ZXJpZnlBdXRob3JpemF0aW9uKGF1dGgsIHNpZykge1xuICAgIHJldHVybiByZWNvdmVyQWRkcmVzcyhoYXNoQXV0aG9yaXphdGlvbihhdXRoKSwgc2lnKTtcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWF1dGhvcml6YXRpb24uanMubWFwIiwiaW1wb3J0IHsga2VjY2FrMjU2IH0gZnJvbSBcIi4uL2NyeXB0by9pbmRleC5qc1wiO1xuaW1wb3J0IHsgdG9VdGY4Qnl0ZXMgfSBmcm9tIFwiLi4vdXRpbHMvaW5kZXguanNcIjtcbi8qKlxuICogIEEgc2ltcGxlIGhhc2hpbmcgZnVuY3Rpb24gd2hpY2ggb3BlcmF0ZXMgb24gVVRGLTggc3RyaW5ncyB0b1xuICogIGNvbXB1dGUgYW4gMzItYnl0ZSBpZGVudGlmaWVyLlxuICpcbiAqICBUaGlzIHNpbXBseSBjb21wdXRlcyB0aGUgW1VURi04IGJ5dGVzXSh0b1V0ZjhCeXRlcykgYW5kIGNvbXB1dGVzXG4gKiAgdGhlIFtba2VjY2FrMjU2XV0uXG4gKlxuICogIEBleGFtcGxlOlxuICogICAgaWQoXCJoZWxsbyB3b3JsZFwiKVxuICogICAgLy9fcmVzdWx0OlxuICovXG5leHBvcnQgZnVuY3Rpb24gaWQodmFsdWUpIHtcbiAgICByZXR1cm4ga2VjY2FrMjU2KHRvVXRmOEJ5dGVzKHZhbHVlKSk7XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1pZC5qcy5tYXAiLCIvLyBjcmVhdGVkIDIwMjUtMDktMTRUMTc6NTY6MjQuMDk5WlxuLy8gY29tcHJlc3NlZCBiYXNlNjQtZW5jb2RlZCBibG9iIGZvciBpbmNsdWRlLWVucyBkYXRhXG4vLyBzb3VyY2U6IGh0dHBzOi8vZ2l0aHViLmNvbS9hZHJhZmZ5L2Vucy1ub3JtYWxpemUuanMvYmxvYi9tYWluL3NyYy9tYWtlLmpzXG4vLyBzZWU6IGh0dHBzOi8vZ2l0aHViLmNvbS9hZHJhZmZ5L2Vucy1ub3JtYWxpemUuanMjc2VjdXJpdHlcbi8vIFNIQS0yNTY6IDkyY2JmM2ExYWYzYzNjMGE5MWFlZTBkYzU0MjA3Mjc3NWY0ZWJiYmM1MjZhODQxODlhMTJkYTJkNTZmNWFjY2RcbnZhciBDT01QUkVTU0VEJDEgPSAnQUVrVk1RbnZEVjBCMHdLV0FRWUJRZ0RwQVRRQW9RRGNBSVVBcHdCc0FPTUFjQUNUQUVVQWlnQlJBSGtBUGdBL0FDd0FOd0FvQUdJQUhnQXZBQ3NBSlFBWEFDOEFIQUFoQUNJQUx3QVZBQ3NBRVFBaUFBc0FHd0FSQUJnQUZ3QTdBQ29BS3dBc0FEUUFGZ0F0QUJJQUhBQWhBQTRBSFFBZEFCVUFGZ0FaQUEwQURnQVhBQkFBR1FBVUFCSUV0QVlRQVNJVU9qZkRCZE1Bc1FDdVB3Rm5BS1VCQTEwakFLNS9MeTh2THdFL3B3VUo2LzBIUHdia01RVlhCVmdBUFNzNUFQYTJFUWJJd1F1VUNrRUR5SjR6QXNVS0x3S09vUUtHMkQrT2I0a0N4Y3NDZy9JQkg5OEpBUEt0QVVFQ0xZMEtQNDhBNHdEaUNoVUFGOVM1eUF3TFBaMEVHM2NBL1FJNUdMMFA2d2tHS2VrRkJJRm5EUnNITFFDckFHbVI3NldjZndCYkJwTWpCdWtBR3dBN0RKTUFXeFZicWZ0N3V5Y00yeURQQ0xzcEE3RVVPd0QzTFd1akFLRjlHQUFYQkNYWEZnRWRBTGtaelFUNkNTQk1Od21YQ1lnZUcxWlpUT09EUWdBVEFBd0FGUUFPYTFRQUlRQU9BRWZ1RmRnOTh6bFl5cFhtTGdvUUhWOU5XRDNzQUJNQURBQVZBQTVySUZ4QWx3REQ2d0FiQURrTXhRQWJGVnVwKzNFQjIyNGNIUVZiQmVJQzBKOEN4TEFLVEJ5a1pSUnpHbTFNOVFDN0RXY0M0UUFMTFRTSkY4bVJBb0Y3QVJNYkFMME5ad0xoQUFzdEFVaFFKWkZNQ2dNdCt3VXlDZGRwRjYwQjEwTUFTU3NTZHdJeEZpRUM2eWU1TjJzQU9lRUI5U1VBeHc3THRRRWJZNEVBc1FVQUJRQ0swMGtGRzhNZkJ4Y0FxQ2ZSQWFFckxRT2JBR2NCQ2hrKzdUZDBCQmdYQUtvQnh3SWhBTk1yRW5NNjgxQ3dCWkE2ZHljMVNBWDZKd1ZaQlZpdnVBVnBPMTFDRWpwWVFaZDdrMlpmb2ZnTEV3UEZCeVh4ZHlNRW8wc0NVMU1DZFJ1ckp3R1BvNlUxV3dORkZ3U0RZUWtBMFFhclB5OGpCeWtDT1YwQWF3RmhIM0VBZ3gwWkFKVUJTYmNBSjJrWEFhL0ZBemN0SVVOVEFXOVpCbVVDWlFEeFNSY0RLUUVGQUVsQkFLc0FYUUJ6QUN1MUJnZno3eG1OZndBSklRQXBBTE1iUndIUkFkc0hDekdYZUlIb0FBb0FFUUEwQUQwQU9ETjNlZFBBRUY4UVhBRk5DVXhzT2hVTEFxd1BwZ3ZsRVJVTTBTckwwOWdBTktrSDZ3TlRCK3NEVXdOVEIrc0g2d05UQitzRFV3TlRBMU1EVXh3SzhCclR3QkJmRDBnRWJRV09CWXNFMWdpREpra1JnUWNvQ05KVURYUWVIRWNEUlFEOEl5VkpIRHVUTXdzbFFrd01UUU1IL0RaQ2JLZDlPQU5ITWF0VTlaQ2lBOHN5VHpsc0FSNXhFcUFBS2c5ekhEVzFUbjU2UjNHZ0NrdFByclYvU1dKT1p3SytPcWcvK0FvaENaTnZ1M2RPQmowUUZ5ZWhFUE1NTHdHeEFUY042VXZVQk8wR053VEZIM2taRlEvSmxaZ0lvUzNaRE9rbTN5NmRnRllqOFNwL0JlbEw4RHpaQzBsUlpBOVZDMkVKM3pwZmdVb0RIUUVKSW9jSzJRMDFDR2tRN3dyRlp3M2hFVUVITlFQUlNaWUFvUWI5Q3cwZE1SV3hKZ3hpcUFzRk9YTUc5eHJ5QzRzbXF4TWxldmdGenhvZEJra0JKUnI3QU1zdTQ0V3NXaTFjR0U5YkJmOExJU1BERktSUUhBMGhRTE40UkJvWEJ4RWxwUUtOUTJ4S2cxRXlIbzhoOGp3NURXSXVEMUY0Qi9FOEFSbExDMzA4bWthblJRb1J6ajZKUFVRaVJVd29CREY3TENzbmh3bkxENEVNdFh4dUFWVUpIUW10REcwVExSRVROOEVJTlFjVktaY2dKeEVJSFVhUllKWUU4NXNEN3hQTkF3Y0ZPd2s5Qnc4RHNSd3BFeW9WSlFVSmdTRFRBdTgyMFM2dkFvdFdmQUVUQmNjUElSL2JFRXhIM0E3bENKY0NZUU4vSmVjQUtSVWRBQk1pbHdnL1h3QmJqOVJUQVM3SENNTnFhQ053QTJNVTQxMFJid2VORGxNSG94d3ZGYnNjM1hERVhnZUdCQ2lmcXdsWEFYRUpsUUZiQk44SUJUVlhqSndnUFdkUGkxUVlseUJkUVR0ZCtBSXRER0VWbTBTNWgzUUNodzluRWhjQk1RRnZCelVNL1FKekVla1JaeENSQ09lR0FEV3hNL1E2SVFSTElYOGdEUW9qQTB0c3lnc2pKdlVNOUdVQm54SmVBd2cwT1hmcVo2ZGdzaUFYK1FjVk1zRkJYQ0h0QzQ1UHlReVlHcjBZUGxRcUdlQU
26774h1d1B2R3U4bjVrRlRCZnNEbnc4NlNUUHFCTGtMWlFpSENUc0FSUTZmRXdmVEdHWUtiWXpNQVMySEFiT1ZBMU9OZndKcml3WXpCd2NBWXdlREJYWGhBQmtDb3dpZkFBRUF5d05UQURVQ3FRZVpBQlVBZ1QwQk9RTWpLd0VkNFFLTEE0OElMY2NCa1NzQjd5VUVGNzhNRVFEek0yNUdBc090QW9CbVpwNEYyVlFDaWdKRk1RRkpJUVFCU2tOTkE2dHQzUURYQUVjR0Q5dERBUkduUnNjVzN6OEIyMnNuQU1NQTl3QUJNUWNCUFFISkFlOXBBTE1CV3dzdENaNnZzUUZKNVNVQWZ3QVJad0hUQW9VQTJRQXhBSHZ0QVU4QVNRVlY5UVhQQWt0RkFRMHRGQ2RUWFFHM0F4c0JMd0VKQUhVR3g0bWh4UU1iQkdrSHp3SVFGeFhkQXU4cUI3RURJdHNUeVVMQkFyM2FVUUF5RWdvMENyVUt0QjlmODF3dkFpMXVQVXdBQ2gra1BzTS9TZ1ZOTzA4N1ZEdFBPMVE3VHp0VU8wODdWRHRQTzFRRGs3dmV1OTRLYUY5QlllY01vZzNRUk1RNlJSUFhZRTFnTGhQRUxiTVV2UlhLSlZJWk9ScTRKd0VsNEZVRkR3QXR6MllzQ0NnMGNSZTRBRHNwWklNOVk0SWVMQXBISE9OVGpWVDBMUmNBclV1ZU02c05xQnNSUkR3RlEzWHBZaVlXQ2dvZUFtUjlBbUkrVjBtclZ6Y2NBcUh6QW1pVUFtWUZBcCtBT0JjSEFtWTNBbVlpQkdvRWV3Ti9Ed04ramprQ09YTVRPWDQ2SHg4Q2JCa0NNakk0QmdKdHd3SnRxdXVHTDJOQkp3RmpBTm9BM1FCR0FRZVVESWtBK2dlK0FBbXhBbmNyQW5hZU93SjVSejhDZUxZWldOZEZxa2JUQW53N0FuckVBbjBGQW56c0JWVUZIRWY4U0hsZklBQW5FVWxVU2xjUkUwcklBdEQ5QXRESVN5TURpRXNEaCtKRXdaRXVBdktkWFA4REE2cEx5a3dwSWN0TlNFMnJBb3M3QW9yVXZSY0RHVDlqQWJNQ2pqTUNqbGc4azMwQ2p0VUNqbGgwVWJCVE1RWlMwRlNCQXBQM0FwTUlBT1VBR0
26774ZVYVZhdFZ6QUlzRnltUmdqTGRlR0pGTnpVQ2w1c0M3NjVZSGFRQVZTRUNsb3NDbG5pWUFLVlpxRm9GZlVrQU53S1dzUUtXU2x4QVhNMENtY2NDbVdCY3hsMERGUUtjbHptK09wa0NuQklDbjVjQ25yU0dBQmtMTFNZTEFwM3RBcDZPQUxFNVlUQmg2d0tlendLZ2FnR2xBcDZiR3dLZVNxRmp4R1FqSVNjQ0o2c0NKbm9Db1BjQ29FZ0NvdGtDb2NBQ3Bpc0NwY29DcC9zQWVRS243bWg0YUszL1JXb1lhczBDck44Q3JLb0NyV01DclA0Q1Z4a0NWZGdDc2QzVEF4OUtiSk1Dc3JrSkFyTGtFMnpjYlY5dFJGc0RKY2tDdGxnM08yNk1BeWxCQXJoYUFybERFUUs1Sm5Od01uRGRBcjBWQXJ2V2NKSURNZzBDdm9SeC9nTXpiUUsrRm5NZWMwc0N3OGNDd3dCemZuUkhNVUYwM0FNOG93TThsZ005dXdMRmVBTEdRd0xHRElVQ3lHVk5Bc2hBQXNsTEFza3FBbVNaQXQzT2VIVmRlS3A1SVV2TUF4aWZadjRDWWZBWjc1VWdld2Rlamw2M0RRTFBad0xQYUN0SFQ4N3ZENXNBd3FrQ3oyOEJKZVlEVGc1K1J3RUMzQ01DMjRZQzBrc0RVbGdEVTFzQS9RTlZpSUNGTzhjUzZWeEJnaGlDejRMS2c0a0Myc01DMmRxRURJUkZwemdEaHFFQUt3TmtDb1p0VmZVQVVRTGZZUUxldEc5ekF1SXI3UkFCOHl3akFmU1hBZkxPZ3dMcjd3THBiSFVDNnZVQzZ1QUE5VU1CdFFMdWhRTHJtSmFtbHY4Qzdqc0RoZHlZZFhEY2NaMEM4djhBWlFPT0VwbVBBdmNQQTVGcUE1S0RBdmVVQXZuVkF2aGltaGlhcDdjem14b0RuWDhDL3ZZQkZ3QTFueGlmcndNRmlRT21aZ09tMVFETndRTUdacUdFb2dFRkF3eEZBUXNCR3dkcEJsMjFZd0VBdHdSbnV3MkhIcThKQUJOeE5RQWZBeThTU1FPRmV3RmZJeDBBak9zQUhRRG1ud09ialFpekJodWZ3UUNuQlJHNzZSMDlQaFo0QldnM1BrQXJRaUZDdEY5eEVWKzhBSmJGQlRJQWtFd1ptN2s3Sm1BeUViclBEaThZeGhpSnlmWUZWd1ZZQlZjRldBVmpCVmdGVndWWUJWY0ZXQVZYQlZnRlZ3VllSaFVJMTRWbkFnSUNDbVJlNlNzRXlRT3hCaSs3dXdDN0JLZTdBT2RBS1JheUJVWSthVDV3UWo5Q3RsOTFOMS9vQUZnUk02c0FqUDdNYTh2OHB1ZEdlajBtSXdRckZpYzJOWDV0MzJyQjhSbkNMR2tCYTlkdU1CY0ZYd1ZxeWNISnVBalBTVnNBQUFBS2ZGNTlpNzRBTXorQkFBTVcwUWJsclNNRkFJekRDd01CRFFEbFpSMDlKQjlLUXJGQ3ZFRTRJMThuWURZbk9DTUp3VDBLUkQ5RFBuZytnVDV3UG5FQ2lVSzhTVUk3WDh0T1QycE5DaXhyVkM5cUMyNGZYK0F6T2hzSlo1c0tZaU1yUEIwbVFxdEN2Q3ZNQWN2OFg4a09IeTRKQ0FraWZwM2Zham90U2hmSnE4bXNDV1hCeTh3S1lFRmZEK1VRb3hFQWs0MGRSVUlsRzZsdE9jNDRDak0vUXo1d1FqOGNCd29kVEVkc1d5d3RXdUc4RWdwOTdSMHJRajhjWFFoS0NRNHpWRU5DTndRN1E1d3NDb0ViTFVJL0cvVUlVeUlqR0RBeEFBV1BZZkJlQ25Ga3lXQUxZQzBqYmtOZ0dUa0NHeDVnc3dZQ2F4QmxUbUJORVFGazUyQVZZSlZnZldDellFdGdrV2dXRndhMUR0eFZxYnhhQzBNV3F3RzdLODNCQWg4VkFCd0RIZ0Y1QW13dk1KVlNnQUdLQ3JoSEdnRGtJM1NPQ3NvTnBrM3FBWnNDaDV4UEJVQmZBUGYzQndBMEZsY01DNlVNSkIrNnIwZUFnUXcwQUJVVG55dUNDSG9DMGd0TFpSRWJBTmhPQm5VRUNoNWFBREVBdHJpdEFKUW5DeFp2cXlRNG54a0JXd0dHQ2Z3RDJlMFBCcW9HU2dhNUFCM0xWYWxhQ2J0aEU0a0xMVDhPdXdHN0FTSUNSMW9vS0NnZ0hoOGhMQkltQmlFTWpRQlVBbTVYa0VtVkFXNGZEM0ZIQWROMUQ4NVJJQm1wc0UzcUJ4RUZURjhBOS9jSEFIb0dKR3dLS3d1bE9EQXR4NjlXRFFzQVg3d0xBR05BbFFoNkFPcE43eUlidndBeEFMYTRyUUNVSnkwN0RzNENrQmg3VUx0WXlIUnlqc09sbXcvWkZVa2I3QUVwRUZ3U0JoL2xBY2NKT2hDVEJROHJERFlMQUJFQXMrQWlBUUlBcEFEaEFKaUNDckpyT1M4QUZBQmJHOFl1YkhZcURjRVFBanNrSE5QaEhCNExHMzBDZXdUQkNxcnhiQUFuTFE2bUxzNmhIQWU3Q1FBUU9nKzdHa2NjemFGM0hnRTlLbDhjTHM0UkdRQjlxOW9jQXV1Z0NBSENBVUx6NUI5bEFiNEp0d3o2Q0R3S1BnQUZ3QXM5QWtzTnV3aThEVHdLdkFrOERyc0ZtQUViYXdvdXpxRXFENHNhNFFIREFSRVdPd0NnQ3pzTHV4QzdCQmlxZTl3QU8yc01QQUFDcGdtOEJSdlE5UVVCdmdINmJzb0dld0c3RDAwUkVyd0JBUURxQVFBQWRCVmJCaGJMRlB4dkY3c1lPeGpiTDdadHZnTklxTHNBQjdzQUxyc0M2dzVXQUFxN0JBQWV1d0pWSUNwL0ZUd1Z1d0crSitRQXNsb0J2U2pnbzd2SUFBRmJBQUc3QUFKYkFBTGpBQWc3QUE2N0FnQWJ1NlZiRHIvRUFQUUFhUHVvT3dNQnU1VW5Td0RuM1JtN0NCcDdDS0VGQ3Y5d0FOKzdwN3NhdTZPTGVYSUcrNm1iZ3dBU3V3WWJDd0c4QUFDR0FHMjdCZ0FMdTZjN0FSbzd1Z2lobk1vQnV3dnRCOENwT3dEaGV3Ry9BQURsQUJXN0FBYjdBQW03QUdtTEFCcTdHTHVPYVJYN0FBNXJBQzVMSGdBR3V3QVh1d2doQUExS0FjSUF0NjhtQWNBQUFMUUFEcHNBSEJzQnYvN2hDcUVBQmNZTEZSWGJBQWViQUVLN0FRSUFhYnNBQzNzQUhic0FDTHNKb1FBRnlnQnVueG5WQUpFSUlRQUZ5Z0FCT3dBSDJ3QWRtd2doQUFhYUFBbDdBQnNyQUcwYkFPYTdnQUFJV3dBVXV3a2hBQWJLQU9PTEFBazdDNkVPeFB0ZkFBYzdBRzZjUUVnQVJ3QURPd0FKclFNM0FBY2JBQmw3QWJ2L0FhYjdBQW9iQUFvN0FBbjdwK3NHdXdBSkd3QURDd0FRT3dBSVBBQVVPd0FSYXdBUGl3QU42d0FOdXdBWkN3WVdHd0FWT3dCdW14bTdBTG9iTGdBVE93TUFhU3NLQU9GTEFBSTdBQVJTQUJkN0JSc0FCdEFBR0xzQUMvc0FYN3NBYS9zQTVJc0J1d0FYZGdHOEFBRnlDNkVBQlVvQWJYWUFCL3NBNVhzQUhHc2VBWHNvVWdBNVJRRCtCdzBNY2dBb0tuQUJwQVVJWGdHOFhpTU1DUWR2UzJ4Zktva2ZQQlJpTFRZRG9RcTBBZGdBRmdMUkEyNEJkbkpIVWhRaEEwOENGVDRCTEFZRGMwYThlMUo2UUFBcEFERUIrd0JUQ3RzQWU1QXNBU3NBZHVVTkVUSkdBVW9BVndVQUFWQUJCNHJNQUhnN0JDQ2xBRm9BMWhVQWxXZzNINHNBeld1eEFNL1VGZ2pDZFhNYkdGWWRDZEVCaUpDcklsTlRUVWdTUE1LSitRQi9IRGRBS1N2Z0VaZFBBSElCS1N3d0tVSVpEd013VlFUM3hlNEFTMlhjQUdvQ2NRSS9FWG82eDNndU5kVUdCUUFRR3gwS0NBd3FCQjhkS1U1VFRnaTV1Z0FLRXMwQUpnQUJHZ0NHQUlrQWpqVUE3Z0MwQU9BQW5Ud0F1d0NyQUtZQW9RRHlBSjhBMHdDY0FPc0JEQUVIQU1BQWVRQmFBTXNBelFFSEFOY0E2d0NJQUtJQk5RRGpBTmdBMVFNQkJ5b3oxTlRVMUxiQTNNM1F6a015RndGTkFWY3ZSd0ZWQVdRQll3RldBVWRMUTBWb0RRRk9GUWNJQXpJMkRBY0FJZzBrSmlrc09EbzZQVDA5UGo4T1FCNVJVVkZSVTFOU1V5bFVWVmRXVmh4ZFlXRmdZbUVqWm
267741od2IzSnljbkp5Y25SMGRIUjBkSFIwZEhSMGRuWjNkblZiQUVEc0FFVUFsZ0IwQUM0QVl2SUFpZ0JUQUZNQU13Sno2UUNILy9MeUFHQUFqK3dBbXdCTEFGNEFZUG41cWdDQkFJRUFaUUJTQUswQUhnQ3lBSDhDUEFJL0FQZ0E0d0Q2QVBvQTVBRDdBT1VBNVFEa0FPSUFLUUozQVUwQlBBRTZBVkFCT2dFNkFUb0JOUUUwQVRRQk5BRVlBVlFQQUNzSUFBQk5Gd29XQXhVV0RnQ0tBSklBb2dCTEFHUVlBaTBBY0FCcEFKRURFZ01rS2dNZVFUNUhLUUNMQWtzQXd3SlRBcUFBdWdLU0FwSUNrZ0tTQXBJQ2tnS0hBcElDa2dLU0FwSUNrZ0tTQXBFQ2tRS1VBcHdDa3dLU0FwSUNrQUtRQXBBQ2tBS09BcEVDY1FIUUFwTUNtd0tTQXBJQ2tSWjVDd0Q2QlFPbkFsMENOaGNCVUJBMUF0NFJDaXNUQVVvM0UwMlJBWGVrUEFGbFdRRC9BejFIQVFBQWt5a2VHSTlxQUNsZ0FHa0FMZ0NKQTVUTWkvQ3VoRm9GdWlzT3doRUJuZFYwS2dzRUl6RnNBVE5hYkFHeUFONStnSDkrZ0g2QmdvSitnNGFFZm9XSWhvQ0hnb2lDaVg2S2ZvdCtqSXFOZm81K2o0S1FmcEYra242VGZwU0RsWWlXZ3BkKzJnTGFiT0VDMkd3QWdtd2tiS0FBZzJ4c0JFa0VSZ1JJQkVzRVNRUlBCRXdFUndSTkJFOEVUZ1JLQkV3RVR3Q1dabXdBb3dPSWJBQzBaZ0VGYkFESlVXeHNBTTlzQWd4c0FQWmFiQUQyQVJrQTlnRDBBUFFBOVFEMEEzMWViTlNFSTJYQUFQWUE5QUQwQVBVQTlCeHNiQUNKV213QTlnQ0pBUmtBOWdDSkFMNEE2QUFJQVBZQWlRTjlYbXpVaENObHdCeHNBUGRhYkFFWkFQWUE5Z0QwQVBRQTlRRDBBUGNBOUFEMEFQVUE5QU45WG16VWhDTmx3QnhzYkFDSldtd0JHUUQyQUlrQTlnQ0pBdTBBOWdDSkFMNENOd0QzQUlrRGZWNXMxSVFqWmNBY2JBSkRBVFpzQWtvQk9Xd0NTOEZzYkFKWGJHd0Rud0x0QTU4RG53T2dBNkFEb0FPZzFJUWpaY0FHQTMxZWJCeHNiQUNKV213QkdRT2ZBSWtEbndDSkF1MERud0NKQUw0Q053T2ZBSW5VaENObHdBWURmVjVzSEd3RVBtd0FpUVEvQUlrR2pURnRJREZzMW00REtHd0RyQUpzYkFCVld2NFZNZ0pzYkFDSkFtd0FWQUVBdWw1c0FteGViR3dBaVY1c0FteGViRDNZQUVsczFnSnNiRWJDeHhQL3g1QkFwQTBLWUZBODlBc2pUeDk3RUhtSlFQeW9jSXRDMkpuTkZSQ0VuRlU2U0ZURG9JMFB4ZVJOUm9OUldrcHpWbldXOHBUYWdrTm1nZitqR3VwcVozZXU1MExBRm5jK096Zkp3ZHViMUFkcE95NzZWbmlqV05SL0NNRWV2aWtRa0Z5UXVMdVBhanhXaTljaHFPb01KN3FwQ040c3gzTEpHNE15dThrRDY4d0M2K2lBd3QrcFUxSkVlWTEzcnBDVmtYU1pmaW5WS240eFpweHNJM0xwOGJKTHJKOXVqa3JJYWxNUkJBY3YvR1NLRXRvd3pjRW41WG1KdzJCYWdCOFYyVVdKb0pIWjE0U1hoTTdwMFhlR0ZPdXc2bWx2eXE5OVdZcDVYeHJPNnJ1OW5uNFJIY09rSjdoeDVVcVd0bWFuN3lWTUx6WVhRZWZRUlVkSVk3MFJZUUU4K2FBekNOU0dRa1hpSGZuSFlSTWkreGN6S0RkWkxrM0FWMWd6eGtrU0hMakJ3dXE4c2hJSisvUkFicWpxUWJ1Z0ZoZTBycWtsdTQzMkVFUmtNNWs5eTFEWHpkczQ2b0xxS0F4Nk9oUFQyV2lxRWZoYUlUbjdPRjlZNjk0QW1LbVV2YnBXcDB4SnFEYWYzamVOSlhuSzZOcG5HY0ZPbWJjbGJBUkMrNSs1VTUydWZ3NWIwSGgrMkxyck5pbXZaZTRlWW1BcFJzWm5KRTMxMFNxQisxeEI2clNKZm5WMWYyRDBhd0IxOE9jMHNYQUZxSWxnSGdXaWFaR2R2UDVDSlVTc0NUQ1FVQzMzNStpU2t3UGxMSko1bHdqVFNuOUx3MjJOYksxVHU4dytiVXBIdERSRFBobzdHdW44YXcySnp1OWkrTjBPdC9rUE1iTEFiL3JVUTgya2Zwazg1cUxEa2Z4TGwzOVFQRG5nbzcyR1loL1hpZ2JwY20xcEEyM0QyeXd0M0Q4R2dNT2FvMDQwd0Rxa0h4T0V4ME9oQytabUhpSWRqSzd5UmJmSkQyb3VaYkFlZGhEM3A3czhXRG1DSmZOZm9yZ0RZUEdBWFNJMDhmVGpQWjVCMzdsYzVWWEd6YzF2Sm1pYkR3Qk5Welh1YVV6ZzdONUg0QnhxamhKK2t6OUhMVUp5czdicEJEWUFQdmJ1dDEzQXdKQ1dkMDU5dFM4WVRZZ0M4SHdya2V3QmZhMUxTU3BtTXI5dVIyRWVrVGlBTUgrTXg0QUd6Z2JxdWNjd0JEbExtUmhnWEwvWWlMUENFYjZkMms1cUo2bzgwMHFkZEFCa3BxdDdORytzYzJ1dkhad1pzNTdXMUFIVEZNMUtrTVNoYXNBREFoMkZ2emJ6Sk96VkRNUzNabFQyQlNGS2Rua1pGQjZKeXFKYmhtNlhBTmlzOVRydHpKZGxQVnArcmw4djNuSWtlNkpvdTdtMlRLdTUzVm91bnVwZ2t6Mkx6clFQaGhhdExJRzdyZkYvZ1VLV3AxNVgzTEt0K1p2dUNEU3FQVWlnRjl5Sm50aW1DMUhKUjdZai9kVXJMQVhXclQrMXRud1BKSkxHS0FsUTVWZU5EV1JLQ1R0MnZ6M3JKdW80K2dJdDc1L01rZmwvZ1NaYmxaOXIvU0VlZW9zWlhuZWxpL3hOaDFXVkN2a1J0MlJueXlqdE1rTXFoelhoMVBWT0NiSUxxdjByN3JHWW0wQ0hJeUtkaEhMOTBjbDlFMUk2ZUV0UVRDdDZSWGo4TTBISHJIQ0hMVlJwTk02V0liVDVCQ01HVm5MMG81ODk1cVNSYkNKeis1SThQR01oQU4vWHJqNEJnSWRsS3FsSHRCSHFUSndtSzE2OXRvWjJJV3hOenJBYklHN3poODVRL0xHMkE0eUJjYUJlbDUyemR1bm9rQjBsdjNBN2tYblRJN002Wm5mWjdud3VqNWxrR2hxU3BXK3c1Q0kvRm1SbHBsQkViblp5MVp4UzNETDhyZjFZV2hPNVhpdldaQlNSaDFnRnNqanlqM3FSRzFjbS82b3JzN1dzRWlmNldSeG5zMU1LRFphNktyYmZNUS9zd0liKzJuYjB0cXhIZWlpNkZjZ1ZlQWpFL1h3YWMxb3d4MDRkSktHOFI1WVFnSE5uRWZIZjBxYjhXT25VMGVRU2phenErSUs3Y1N1Q3FZelBFVUIveCtRZ0dacU0zZEJvWXZOdlpWT0hEa2JnZGlsV2RhZ3FPNWJreWJYZkxweU1QdUdxOG12QUFFWkdiUjZSd1hHbFc5RXJPV1RmbmpmeDZkWEZKcUJqME9CU0dGejRsV1Fhc05PbVZKZU40U0ZXU0xmT0dCLzdlaFY1WXVvTk5ST0haRUc5RWxWdU1ucWJETU11RGxlT3QvY04vZ3NXeEd3MTI4bXdVOC9IeGtPS3FkVFpuSTdkSGthNjdXQ1RmL0ZtQnJ4cE5DYUtKMUd4QlRDU1M3TU5maE5qOFM0R3RvdGc2WjNBTTljQWVWUk9ucHBVTWFpVjVqanVkTG5OcW9WcktPMS9GaWpMbEFjNzRreHlkeEtYMVJRdU1xSFI2M2VlY1lyNW82TUorQjc4VnNMbENycGVsV2g2R09yQ09CSW9RbUljZHBKTDFwd0UyenpacUJrZWNHVGRLOEtNT0I2cjFlTlJVUnlyejZNODk5VFphb1Mvdk5PeEhmKzVnT1JVK095WUljSVc2ZGlQMjVHSEY2dThUTmp1TC9HSnpDbkxMWGQwMUtyc2pSYTUxdjQrTy9WSUFXWEVTSnhmeFdqdjYyOEorY1dVUXBvRCtZeXR6czNqU01SSjIzL1hUK3ZVZHRVTUxEUXExdm5Jb2VnL0dqV2g4OE1UNms5ZFJxRGFRK3ZvZGlsRmd2anVOdzVwSnBJZDltZnd5WWVMQ0diM0JtSFhkZlFmaGZQUlFhdXBlL2Y4VEc0
26774QmszZURLbFlCYUVLM2taWU5OMlNkeHo0N20vdllCeHZJT0t0bnFwbEIxcGVienVYbUFyL011elFDa25LZTY1M2R6YVdRUTdNVWhXWVd2eklad0xlMXYwclh4SW1MYXorQWtBdStzWWlraG91TkYzRVc2dzRjclo2TXVVaURiSUF4OFhoQWZlZ2N2VzZ4OUJQYjMvc0N4R1d1OVl5YXRxRXhCK1RTbTY5cUlrSTlJd2hqcmNuek1FK2pXQng0bU5RbTVXd0x6VWpTeVk0RlowYU1GNVlGbFhVRDRoTDRYZk9lWXY1ckRlMnMyRC9DbisyOGZaOVVDbk9RdlhGTW5RcWZjMEcrWnFPV1dEOWwvbGlxVVBhTlF6Wmp4Q0hwVUFEOFJjYzkwTW5pUTAydWdIV3NVdXBGVXZoQzl1c1k3ek5QdDVGMmpPN3FnemhhZnNRU2Q1MGpnTHJDNlF4NmJwSGJYUjNXTkF1MUJ6R213YnorZWJHbXdUamR5MDA2WTZ6aXBQN24vT0psdlNtYnErU1krbmVmQVZLSzZFQk1QYmNlNW4zSWRSSTgrdmJ4Q3BONTNydzNUdmdOZHMxU3VNaXVMR3h0ODlMNzFteFBEZWFuR2h5SHZPam1PNTZ0blZwb0hhbFFuTDZUcU51cUtzSGpIQ0lLQjRwQ2dqNFd5WVB2UnZZdnFpNUVNcjdsTjNNb3RQUi9LSDdKVUQxbFpiVTBRemZickVCSm51UWlWQXlBQzl2d1hXcDJUUlUxLzBhYXB5QUgyY2JnbEVIVkFkbCsxcmIxdTE0N3VWMHRkMWVOb1Fac3FIcklNSVlWUFh0TGsyVElVM2NKRTA4UGpvWU5EcGZGL0ljSm5ZUUhsNm5zcGxjelgzUmdhaDROYkpKSGwvLzVzY1V1ZnFzU2QvL2tiSVM0MDZaV29NUC8vK2poR1Vzd1gvNW5WTnovakFqOUttWFB0QW1NaUsra2hoYm4xdy9tRUx6Wk1UL1d4Y1cvL3kvanNIYU9NLzYxb0FXL0NqWWhKdFk2MjIvVHRNWXVQN2JpbEJ2YmlUM3ZCOW44SWNGUG53TTc4SDBLZmhZRFJkWTVQaFdKNGpXUlF6QitIVDVOVlpWNTZMRzgyaGNRbXMrak9UVC9jOVk5c3g1clBpMS93QjdmLytjNVVmVUNLazNpd3dDdXl3VWMyTUduQXdzWGYxRTVob0k1NXgxUS9RYnkrc1dIOE5SamF2WjhWYURzZGkxTlVWaEg4NkJKSFgxeWFGdDF3MU9ZZUw1TFZtZE4rNVErS3VUdlhFUER6VUNnNnhwMEhoc1VoVFdTZTdNWk1NLzZyc1RVYjAvbmJVRTNZUWxHR3Q0OGtUMS82Y25mNnlIbnZIdFF4OUVvc09YTjA3N3l5RXEvakUzWVRpRy81U0VKbVhGZW9jSkoxRUFkNnZLZUs2VkVkSkxPWjFrbS9Fd09uWldDUXB6Q0xLUEh4cmZoNHlKaEdxLy8yZG9zMkUvMytNT2NkVzVFc2dJZG1UUVVRZXR6Unk1ZlFIaERCbDM3WGJXenNxTy9jQVNFRGp5c3QxLzhORVJPcVZBeFduZGRRVit1bUo4SXJLVmdLdkdhVGMwR3NRNHM4aDBPc3FsNVFLd2xkZFBEakpoS0lueVdxWVVLbW1sSXRzK0ZJY1haNnlNNmNsamJzalVHMmtzU09rdUl3NHNZSGZmUk5nQk9MQXB2RDZYclI2UnQwclYyVWY4SXBuSVVWbmI5VHd0OTFRakFhRC9kU3RTV0R4ZzdhWVkrVlhJZ251b3dZZE9ranl3YTJobGdybkk2UGphVTNlM1VqUTVZazVtZElKR3lIbnYzL1ArMUVrTWF2MXlGeUYrRmVKRS9SWG5XQncrTmgwYU9vNlRHbEtYN2QrZGtQOSticnZyNzlTZHRYSnRjRC9hWEJHaU1OZkc2L05RbmlRSFlRbEs3OEZFSERxT2grYkRJMG8rMlViMGg1M0VML3ZsempyQmN6VkVaejJiT3R2SUwrREl6RGtrOW5DV3Q3dGxxc3EzbDlKTXRKazNyNUhHMmlKOWIvWDExVEc2d3dNQWpITFEyb2FzYU1Fc3lkaDg4UVB2SStobXFJSGh2YWxwS29LT3VlSlIwZVo5SjhHMmFsTk9JT3k5OGp3dmJjODdFd2s5ZCs1Ry90VWlqVG1sYmpGbERLWFYwNUhhbEt4YVJUcnVjYzczT243eXpBUFM2ZjJ2NG9naWFXeVdlVjczZHYvTXNRVDVIalJyc1lWOWRMQWNJM1QrekMycUVWSU55TnBFaG9LVit4VlN1V3RUNEFoQmZwblo3dW5JTStIWDNtc0kwSGlJK1ArejJQRmdrakdpNVBxRWJHL3dOSVdlUlVqUHRERWdiYnViTitJNEphRExyVzlib3JSQkRvYjdaRngrSmRLZUZWVUtWZVdxYi9jODhPbDdEaE0wc3VMdHVFZDh0a0RTTVREM0RGeDhVcGhQSU5ITUhpNTFoQVB0dFhMNEVrdHQvbEtFVUcvUjRxWktvaEhqVnBBY1BJTWlIeVdyNnhSOC9FV25OSnZCRkVUNzZ5Q2RrNWVyN0FEQi8xYmdvSW1ocFNpWi9vbVpqUEtQQ0VlWnNPd3ZQbVhMKzF2bEpOZUdPM1R6eVNtR0ExWDZlNThnTHJhekRNNzFqeXdNMVhMOHpLSE42RzNrQjMxWTh2THRQOTgyTjk3NVNaWGsySndEdm12N0FZL2FEc0ZGazF2K25FNy9oYnZ1T1doQkg0a3VlbWVZb3pQazJLMjJWeC9ZR2lEVExVN1lpbHBPdDI5dTNSWk1CaDRVSmpsVFA1SXR4VHpXdjZlYkw5YitHU1UxVnNtMlM4TE1mVmZKY3phQlNxRThKMUE0WVVqcHNBTEw3Kytid0NQWEZoYXVmZHBERnRCbEhiOW1ha2VZYnFkZzlsdHZLL0h3Ri9yTkU2S3J0V1VrRWN4bVRCN0l5dTVUaVZhSWdXL1l4elFocEFybGlJTWtPb0s1TDdTaFZ0RitEWXFWMDFtazdmd29wMDRoUVJ3ZzRLRm1yNXo5bllmMDVWVnFrU2U3Z2ZueDVieHhsUTBxRVYwaml3emYwNjRxRzExaUVxakhjVWdEV1dzRHMvTEVHbHpYMzFUNUtWTCs3RDRFb0tpbTdIQmFnaXFSbzVKSTNXZkRCZ3BLSXJ1V3o5ai9KNkhwNVEvRUpiTVdCOE5lU011RmFyTnczQUVZUEJKdFlRTy80b0QvWmdQVFNRMDZkaTBFZXVtWDVFYnJkVGhPK2Z2WUVWU3hMdFozQUprZWUwWG4wc0R3TnRpaVpoSmpKUkR1RzFZUktCMXZPdWxmZDlKakhleXUrVUhUbXJ0cmEvcG0rOFJpeGg0V0tpTGFMT0N4SWJaTm9XUlpTeXlVR0xQakFhQW8rU1FCcGZPMnVydVdyekZ4TGxwdnJYSk5NQ1d0bEpES0dBbmxXSzV4cFUydGN4WGJlRCtzYmRmd1lYdC9xVHdEazZVcVhSL2FVdDA5OURoU05sNE5rOG1Yd3B3K2IwbnZqS09HNk1nMVBSWGpyTVVNQU52TmdFQXJ2OG5NSnMzdmoxYUhpOE1Iei9VZkpXV3prY3JTcFpUTkJoZHVYbEdSN2kraXAvVEhEcDVSOUtSTmNES0VDZ3R3Z1hnNEVGTjVISGZpa1AvWHZzb0NrSFRnK05ic0Q4R2w2ZWtuazRBcnduL0JXR0owaGdXMC9nVUtyenVHWmh1YjdpZ1JQM2FiZXRwSW0rMjR4RU9sV2wzWUtwbTJxVEJGdlg4ZGREUnZtMUxjd25DSnVFZlp4MTJxUFk5VHJudE1JUXN2MzE2enZweVdueVN0WDhWVTRqNnRRaytDV2xMQlVDSlI2TWRIOUNwN2cycWRuMldNOXFGYlJFbWVqSDA5ZGxXRVBtOGhQRjBMN1J4d1JSZGlDczBEUDhld2s2QXBvRUxrS1U5aGNrU2RiblhtOFVISm1hTlhqeHYvcTBmVFRwdThybmw5bE4wdlFDcERSYkN0Y3oxMnJHUkZFQTdDZmc3RmhabjVRRmtObXYxWlVSS0VzaVpjZTFuUzlLN0hyd3BDN3lKVjRYdDNlQVZiTEpmb1hIcnR3RzYwWjhnd2FTbm14b0wzczJabFJxZ2daTi9NSG8xb1VTNEwrR3dPYkZJNTk2TGQ0TXZpOGwrY1FtRjFnSnBrcG5EaW83VHVPMzVucGFNSGlXekZxUFNYM3FOZ2tJUEd1WDBxR1luUElWc005MDFZdThvWm5PWk9ZMVRidElkRlVOS05xMmRQOFNKNEYvVkNFeklqRjAvUmgrN1VyWmo4MHRDNnJvZ25WSDNtcWE4ZUNzL2xjUVUxUGpqOThrQm1BS0RiWlVUd29zdjAyVXVuUlIzbjBYNmMrZjczbXR3QjcvV2JRMTZnTzQzMUV0d1piTkcxU000VFpQQm5zUVNFU2xzZkcySkxRWHg1eFdmNGJtUS94Y1ZDUElTQVg1ODk3SnhIS0xEL1hrZ3U1NytBQlIyK01NdEViWDY0K01ObEJIcEtDN3NqbFdWRVNoZjVxQStkR2M1OUxGVmxaclgvRW5xOXovdit3bloxSEVybXhtakpqeE9BK2hBalZVV2d0cTZ5Z0FpLzhld0pEalVNRnczemhRRnRieVRMRFBGZDIxSmk1UzVRUFpvOW5NU3hkZzErREdGU04wd2xXdDdYZVlQYkhxTGZsaVYwSjFrT2hRTnAwVmJVUHkwTVMyTX
26774M2Nk94dFNXdmFVTGFXSG5mQUErc2llVlZndGpEd04zbktvbldhcGtTS1JOOEJLS0pRcENmcW84UlFJNXVkaGZ1NXM1Kzd2d3NwcG1BSkRnejJHTkE3ZDQzVmRiVjJsL1NydkV1NFJZc2xtTkptZlNPVmJzc3hBaFNZeTZXeHBJUWREQjBGVkJwWjZJTTh5cjgxUU4rWExaM24vd2VkL1IrczZMc2xreEtienpzdC9Ha1JiZTZyRm10dkpDd3IxVDQ0RVRNK0lNZ09ualVPMGVHNmExbjJ3N2x3TTFvRkJ2ek1VV1JrTkZPdktjeDNvU2I1WGRlblo1ZFhzdXRlNm5rUnlwQmlTZEF0QTJmeEFkOFVkTE9aVy9NQjdmWm9FdUZoZVFYaWpkYUY4a3VhUlpvU2VXZEtPa0tzR1lFR2FYZmFES1R1MFdNVGNMbmlRczdLUkN6OWlLM1NQK1kyeElqa2ZWR3FGTFNRNnZoK0ExdTZGZGZ3WHN2MVZQTWZpMmN4bWRNKy94VGdNWEV5bzJaR2NRMlltUHNnaG5ZZHYyK3o0OEpwR1pBNHRVSzFwMXEyVmRWeHlmeXBYRVhjcnhLS3RtdDhVZFc3c0hXbUtNcUR1QkJNM0ovSlVReDhlVVlONHBKNW9ScXZkaVBIVTFvL1dQamlLdm5sQ3FPZHl4bHhGNTRMOVBydExEMU5lalo5YVpEaXZWcjZaZk1GSzEvcHNWeWdvUElBbnBoY0pXV2I5KzVJS01LbWdSUVVMc1RQWmk2Qnc0d1AzMnpWRW9LY0hwUDczQ2tGQXFTOThuU2FHb1dEakRKaWFBQ0puNHA1bzFqcTlSNFE0VmNpYmhYRi8vTEhQMGJkZjYza1JWWmRSYmJoR2U3c0RRY3lXUzV0cGtmZVlIbmZmMjVXSys0RnB6TGxBY2JhS21IZElCcU93M2ZJbXgxdXFRSUFESDBUeUh6RmxxVEc2bk1vWTgxc3ZQMFQ2Qkl5RUxNUzh0TWUrRTFwNlRGUDZzVnBaYTZWTmFUdW11ZkQ1YWo5Z29SYTlTQW1kSlQ0SGhJMnIwZWdqOFVyZ0ZiOEw1OXdHTG5ZbHprTEFpVWQzbS9XV0lJRVU2MWtQb0VqZDNnSVZ5L2ZpQmNncVFxSG5vWHBMMFNxTEdkR0dnbjdEUWVWTVNZV0hmam5vMUZuZ0lLUDljallhVGxjUlA2Ylp1bmpIUDEzL2xiVm00YXd0aTg5NHBUZi9aTk5xcjRPUit0RFZpZS9tK3JDOFFwVm5SYnNDTVB1a09IODdCMmpNNEFHNnBIdVhsMXg5U2lLZGhZSlZPaGZvLytTQ2FHalVXMkNvb2dMMUZGaEZHTjlvK2Fjb1ZMbDBTWHMvM3ZyU2NjbVplQUYzTmV3RnVPZy9QMTJRWUtRRitTSCtLWWNObnNBaElBRUxQQlVncmUvS1JVSkVBK0tQRDBNSFJqdiszSi9qMloyM011Sm1rZnk3bGVXY01zdGk4d1hMU0hnWEZKVGFrc3gxV29pNm9sand4RlZJSkcxMlNCU1pMTkpEYlhNWVBla21pWFQ0RmNsS0kzNUJGZ3FuWXBLZmNzcitmOEhVWFFvSEo5VVlaNEo1WU1pSEh5QXhnNmVpZGhvZGdxSjJIdGYveFlFeCtHMHpYY2h1emx0OGhjQWwrQVQ4TkNRNG9yRmM0RGVyYWJGMWVuQTdOVExudnRaaDNGVXdxSU92WTdRNERZbW9ESHdYVFN3NVVOTmg2cjdqMEIvZXpNWUpNRGN3NCs2Z0NUWlg0WVErN1hzOGRlNzJ2c1IzY21mcHhJWDY0LzZLUjFwM1ZYNEY2dmZIRXp4emFyaDhhREg0RzFERm9CQk02bnBYRnBLK1JoK1dyY0ZjbEFlQXhpMFBvYVI5Q3BPeHhHTFNkdnhLVlN3OG9PT2FuRy9zb0tJbVJvcE4zOEFkY1VoaE0yR1QvUGdRZVNRckcxMm5qdUpKRDVaN3ZXZkFabUZ5YllMZFNBOTFrQjRhb0Job2oxWi8vS05JVlZ1anFhTExSd0NrYnluNHZoMDczOUM5VjlpU2p5YmVPSWVTT3ZOczdMVzFhN0VVdE5vS0FuT0dNTDRVOEtCWHBmcnc3M1dqQXN6Skc0UXNjcStYcjNrWldSNE9tbTB4VDZxRTl5NkZOU3BzdFY0b25NWlNxQ0VKKzNWWDlxanZkeDVRVnJNMFdYeG1QWnhlamRmbmloY0ZBanp2NVBqbFRsNmlja0RiSGU2K0xjaDUycGpPUHFrK20zUlorYmgySlNNR3RGQnVPRGJNY2hycFJWbHQxNk5UUTA1UHMwSUR0V2xVbVdmUDJ2WDhNNFlEeW5JdU9aNENrOTErNTkxQjk4R3c5ZncreVFvZ1RSOENTZzB6YUp1K3JsQm8vbXIzQSsxTnppRitrZHVieit3aGM4NTdBWnQ2RHdJQklGNSs1eWlhYWYzQnlRcDFGbTNzT2taREF6d3NZU1FUTS9LdjZpZGt1Z0Y2M0ZEb2JEZFVZM2h1cnVVK3NDYUJ1UlIrSG1Pb3d2bVpvQmpaSE5oNzdTWEZ0bVkvb09VRTdpZk43bkJIQW84M1MveHZjUzZINENpMnUvOUlkNjJXdjZVaSt6TU5MQXpoZmtUa1ZjVzJCd3JuWXZwdXIwWkRsenMrWkxzbUdUV3ZkMTg5MnQ3OGd4MVlqRUp1c0djeHBoakxrVjBVZkFLbGVrZlNCVldIRTJhaGs0QWJiUm1IeUw3R1lkdEtmZGxJTndyY2RKdWYzQ2VlMW5mVW9qRFFuL1ltSXRFU09GaHRMenJrRXY0azJYcE1VOW9hSlEzVlVDKzFJTmg2QkU2OHBrSGFtZUdKbTRHdmRiMjRRMGZYV3hkOVRwM0E5bXpGU2U0cVhER0dESVY0QUFHVjFqSURmdmVrbkgxVHdXcFVUNkhpUXhLUDNBQUhKTmtKZVJsai9tWEJtUzRTMWo4Rks2WW1wSzdqeXlBaVJic01DQ0xvSmN4MDFmdmdwTXZLUVJ4dTlJT3d5bWNvblFqRDU2Zzdrc09yY09lb1RiaXVzNEpuR2VzQVMxRHRnZGFvcGhZc3cxd0dJc01TM1A3SzZkb0UzSzVjenpucVBRTFNSUkYvWWx6YjVOdFNLc0wzM1Nnc2tGTkNGNGtobjVMV2FEeEkyM1pSaTJoenFOOHVXOFV6WkVCWXk2OCtWdEdMU3ltUXJYR1VscjJuTzJCYkJJVDVWaDFSbUdBeURYYVcwRlBycHgzd3YyVVlkRms5dFNsKzkwNmJNeEN1WFFhS0RRUC9VMTlVRWNWR0s0Z21rc0w4bEFvcnhRU0FPd3BlWVg5eHJac2g2eW9HYUwvWDVPM3RnUUM4T00rL0d2eG5XOVh2QXR1L0p4QWlneWRmU21aZnFaZmcxWE9jSE5PcExsTjhqNjRPWjM2bDVxYXdEQko2MllhVHZ4ZU5tbTVnb3dDZEJvc2djcEhPZ05nd0Erc2tuTjhYbXNSMklZQ2hjYWZsOWJHTk1aL25CNWd1V3V2RXppdjZRSTJiUDJEdHlLV0cvcVVqWk1heHkrd0FTa2tWR3R1d0d0eXdrVFlHNk1ZclpCbzE4dlljd3c0OEcvK2YrZUlUQS9xTXdiTGxKQzBTMysvYWkycFB2a09oUlJWbUdUdVN1cGF4aElrMHhvWEx0aXhDeFNBbjRaM09uVVMzd0JxVnNjTEk0UDNHUDdpLzZneFlzc3dzVm1rdkRYRkxoTy9PS2N1cjhmbGVnQ1NLaXFtVnBJUnZDemdiakVBMG1YUG4rUkV4WFkvMk9FMWYvQll1V3BSUVk4Z0NEcE1PWUJ4OUduNHRMM2hpaFNJUjFpeGgyUElJVDdjcjJnVUpiZnM3NkVLWUc1MkprMFVaRi9QUWtCeEd1RkNFV1huRzZ1ZS9oVElxalRScTFzb3RWcktyd0lHSERySVR5dWFuVXpiSVlkZ2RFZVY4OEsxVkQ4MlRZQjJCNjFGdCt0QjFLcUhQbVQ5K2hXb2FWK2lGM1N1dnRKcXZub0xhQTh3eHJENTZBVU1VTEVnek85U3ZCY0JBZnF6L2R6TVl6d010L1lMc3pEYm1HZTFiY0hIZkZNY3ZHcWw5YmYvdHArSHJqNHExOGFObmZ0R2ptWFRmd3MzOWVtbjcvNUlCeG9nOU1ybWZ0QUE1T3E0YXdlbm04SGltV083MmR3VmxIY0htdXRWTWRyTUh3K3AydnpwelQrQjBpSVorSUVwcGx3V2hDbGNYbHhoeEFzRjNDSFJubmFVRXFxM0J5UStjcWhlNVN2UjRTRnhoL0xab1F3dGo4UVpRR1QxQnpZMkVNcFluVWNaV1FFUGx3Rlp3KzdVcnlLOXFWOEtncnVZc3Z5TW9LMTZLSTJzTjRTT2JsclZ3aHlpTDgrSUJaOGNwVWhzSlFTVTdURkhBaStMMkYwc24weStGdERPRGxudWlmMk1iYThRZGRQWllZeGpUc0lna01lM002KzdrWHhVZlp2YkNVbHlxNzFKMWVOY3pHazZWcXc2clN4Mkszdk0rRGpMeERSR3pXZXBUTzJxVFQvVzhTN3UwUVhjeUZVYWhjQjR2cTh4Q1lUcHk4aXN3dG55ejdLeDZsZ1RFUUo5UnFrZ0VJTjZET1VxQjB1UmRlWXVEYTdBUDdaeTl6K1psVHNtVlI1dnRWNzFtM2RtZHROZVdnaGJyNVBuUEp0alhBemN2Wmp4eVY5NlZFeC9CMVRBMElFUVNJNTB5d0d1SWJtQVlkUWcvbC9yeGhRTFgrNnVPTHlGc2FVdDZtdGpwQUprTGZlaG5CNk1sT0huTk9yV0x2Q0JxVkJTMDdqY00rNFJ6TEVlZDNmMy8wWHdwOTJVK25hdGFOSHlFZ25udVlSNlBYRWpSTEVUejB4cnQzVWdsZks3Qm40YU5sWEc3Y1pjbzRsTXppTHY1K01oMkpDd3czbXo2OVo5Wk1SUi94djVFS0ozOElGeEtkOWR3NUNnUElYamEvZ3pBc2hNYkYxNC9xQklnTmtkVVFlUDhZRTdTcklDR3RpVG5BS1R5QTljWGEzT2F1REh4Wk9kVFA3eXVZQnpEMVVjSHN0SU8xNkZ4RjFiUlVBbFNrc3pJODNZdWZUY2hVOE9Qbm5vekRsOWJTMHk2Q25uakd3Z2o5TTYxY1hjWnNsampoTGVUL1ZxKzMwU2NOMlBjVC9kT294VURx
26774RFMzOCtPcENDekxEZG53SFFjM0VDUVZJa2F4bWRQYVpUU2RmcDJqakd6U2ROTE01eVBRc2dKRGwrWm5oY2xEUWk4bHRVbmtxV0ozMjNJdlRaUE44cm4wK0VzaEwxY3g5UGlhTFR6VXNyeW45WnAyTnQvZGV0VUFoNE4vMkkzZGxNUXFqSEZ4U2lodjB1eWt6ZmxxNWNsTXkyWkJheG9FYjAvUU1wMDNJUVF1czN2blpkL05PbVNzbWdxWHFLRlAzb3p5RGdZN1JRUytucGFiZS9oTkcrNXNhNUZ0dkw4djB1WXVhZzJOZXdZa2NvbDNUT1RhZHB1bmNDbkRnT0dwbUxuVFExUEVQVU4yY05zclc4TFlmSXYraHpmYjd2b2QraXBYSHptYmdqNUZ6YzZSY1QvNVBEN1ZROG5USkJOajF1cmtWVXg5dUp2VFdtcVkwOE9DODByR0RMYVdYdjI0M1ZCMTZnanQ0WHR3cDVIMlVEUjBMaUtXMjRFZC9zT084amwxeUVVL1hBYjNoN1NjS25DRnkvVjNzSUNya1kxRDBLOWZTb2tISUwwczUvN0RMU2hMQVBYUmJWN2ZidjRxajZPd0hDOWQ1UGxFT1gzTFJwUTNQN2hjU0FLbElLUERNODN5cHo1NlU1K3JKZW8wY3lVdEM3d2x0TDh3cUVpTlNnWnNEV3pBQ2M3UkZvWnFobEQwK3NpaElCUWxrUVRYbXZVeUlPWmhrUVgyenFNRTVWUkM3bXMxc2EzQ1krb2RNbjNtTUJpVHZDTUtubkN4ZzVaUExxNEdVREI0akY4QnIySzR4NHN4ZldqR1hRYXRKMjVJMUp5ckl2Mlo0YlAxakt3NUMrQjIvczB2NGRHVU9zYVM2SVBJUVYzRVRRK0YyZlNsMkJQQlhIenlZTjhWbXdXSXJLZU1YOXB5R1d1QU9WWHdreEpzUkJhQlZ6TGhaRFA4T05HbmNrbkw1RHBUeEhOMzJHZ0ZXTXdzYzBHbUwwb1JEbVJUOHUybHZqQUtVSWkwTW1YaElIU2xGZWgzUWg1cFA2YXA0WVVkNmI1NjlaSWFIZ3lhMkF5RDEyY1B4WTBJbi9QQmp6RGN0VGFLSkNVK3hjNm05UmtOTERFRThndXZ4dEpQOHNsOE45YkxxdzBGL3FlamFCbGNIWXF3MzF6WXBzdXRRcDA3aHNQMXZoR2RsNGhKMXdBN09Dc0FIbktqOTg3OXVTSElMRW11WjZ2STFsVDR0dm5XQ1ZLWmhoWXJXSFc5b1BLUEtwYk9DNkZUamYvT3RVdndtaVhyMnlrdnlMekhHUWV5UzdCZW5acEwzTi9DYUY1VDdHa21sN0pYTjVjajBQS2FEcFpWSW1ENjFGdU1nRkhQcVNIdnQ0RWo0S0JkQWZkY29PM0FqUVBMd3d0S3NnR00rdHk0bE5aTUJFSXRKU1JMdW5HNWNrck0vQmVvWFdvUFpWdkVvSXpMZ0ZRWVB1cE13WkNYaXM0VzJTQ0oyenNlZlpxQ2orYVRmU3ExRllkVWoyVWVKQUx2VlRmN3Z1dWlrT0UxSGl0M1VJQUdVaS9zcWdNdW05dncyMTh5MUZsWS85WG5Pamk5bnFoR0FjTVlJQ2M3QmlxTFpqNU4rY0tFdVNBdWl5V2JNZzgxWkQxbEhvdnkvd2UyZWFDY0N2NE16RVczTzBtVkEvdDJ4ZEEwY3hUVmJYbUZobit0QVJEcHZEejVmdExyMTVPQUFtdm8yUWlBa3krZmVWTzRiR2lidjJubEJtQnpxeDBsRURmRW00VW5FczExcGJud1psSi8wWTczL3dCUFlmVE5aaUpLUjczVHpkQ1cxQmZmaUpxOWJMalFtYUtuVTArZ044c2ZlMjVJS1NVQ29vUXd4ZVBEckZuM2EvelVnV3h2UG9UWVZYZm9iWS9HVjJxcVRrZVZEVjlEODY1N2ZoWTAvd2lhSjVOZkx4aFhiRS9uYXhzMzROMGhkNnZ4TmZkbTFUQ25vem0vTktTQ1RoY2hvWWdNRjdaMnR6WEZvdlJmc05Wa2Y4Nkpqck02MHI3VUl1VjNic21mck1PcXpqWGpONkhQQkcyNXpDSjNRTHVleVNiajlvRnZYL0h4V0JxaDMxUEJQeGR1Q1ZBeE1xQzlISytZTDNvQlpxQnJ1b2g2TEt2ZE1xb3owUFlYVUJyd2JpaW95RThUajVJbWpKbWlPT1dMYkFadklaL2w5cklQbGp4M1Q1Z2xKMmV3bGZ1SVQ1R2xvZFFzQWYvSUV0bVlrTUw1U1JRR3h4d1crcmxaa0Q4YmVsSk51MDlJdHd4OXhEVUxUbmVtVkRlb2pkYmdjZDJnS0dNOWFPMDBKaXZ0YnM3WnlPU0U4SVBoOThHZnZhdEQ4VWQ1dUhjWmZBZk1pUFNsSXhkNFVxZVNEenVOZmJLRHVGZXBreUMvczNqOWZhd21oWTFiOU5xRGkwWlM1ZVAzNWw3ckwyZUs1UWxXTGx5Q214eDhBRmFGaVR1RDJwTVV4WlY1bUJTSnVKZHVPYXEyWnJXcHUyOERFOGpsL2hpc0J6N2JHV0g2cUxGMGF5V05xMVNlanRjczhLUXJRcUprNVA5UUhEWUhPSW9sZ05zTURtRWFXY1RlbGdoYmZGQ0RxV3JxNllMd0RXeSttNjhlYzVuU2hncTJmZHVVQnBRVXVLS0tnbnR0YVVYOVBSZk1teHFKeVU3ZTBSTHIxYmV2K2dlMUtLMGJaeWhIS0tERThnUVg5VmY3ck5IV094QnRaY3h3d0d1c3lNcEg3N3FXWnhYc1FtYmdJR2h0aU8rZ1NTUkN5dS9laytPRnN6MUhNaVFIMElIVjdQakppM2RzellmRnA4dWU5aDQrQWZLdGU0TVRpZWhQdnhOY20vVDF0OXZzRlp4OHJITjVpZTc3cjJqelpPcS9FbTRRK0g5c05jWmFrZjlIbnpDYzFmSml4cHB4UDhGUUFCbVZucWE2R2JKaHdha2E3V0g3V2RvejFXeE9qU05WOE45c2dXNVMzUHBna3V0K1RUQ2tqQStBb2RVT2sxS0lSKzhHOFMzV3JTWkc0bnlxZko2RkVqWGw2YS9MRW9STUhaVXFmUFJXdndxcnRYWXk5SVVzbVVHemtxaTc2aWI0TkFOQ2U1RG55T3huRlJaOWQ4RmRCVkJqcmEzaU51WmhKdVdXNU9taS9oQmlncURzZzBtdTJBaGZKRFhkd3lNSUozM0hISFBmUzJKdGplZ1JlalgxMW00MVRiTkwrUXA3bVIwZzlDUEtUajlQSWp1U3ljR04vWVBvelhJNHphclh1QWVMdjVDSEt0S2NKS1JiZDZSMm9MTmlFdDBUOCtRSVZKSDd6dDluY0tNZ2Q0OXZWMlAxQXlTY1o5UXpidTNtM0xCbnV1NmR3N2FFMGI2cjRrelZrSS9HVVM4OG1BNTNML3JMdG50a0ZsWlhHdElvcU5QMm1EM2VWdjA4QVZWUFQzd0puODF6cGJKVjlTdXFaNlBkMWdlMFp6MlJGSGVDZFY1Q0xQZnRIOVY1bzkrVnpGdTRSMFFldW1xRHdVaFhuM0l5WW90ZEpueHIxbDNCcVduUVZBZURCRU90UHlKUXgxcTUrbU9EaUNsWHRZZUJMVFd0c0o0MkFNQmNmL0lGSWhwZmhZTzA4aHNnMElrK0RwUUZOT0tSZUszbzNjdWRreFdYMHNvUHRJNWVTRk9BNnlOeWxTK0lRanJRdFlRLzVzNFVjaXhKZm9rdW1CVWpwSDlvZlNqVVR3UENhcEdGbmRmcXFHNUlIZU1NdmZnKzg4U1htN2JOeWprNnBHS3pMK1d4REFkcUt0UTcyV1dWYk9rM0krdWVHdWFtbW1CMnB2Rlp2cUljVS9sdlczbjkrcjJseWNuUUxFNE9YOVIxaklnVzRjRGpKM3Y4ZEFhNjZtVmNmQzdwdENyNWlvNm1DYUE5cUk5VDlGRldxbzFaQWFNeGd4QXU4YVhxbWFPWXJ5TU5EMnNUVWZvSHZ4Y1lLN2hFaUpoQ0xZRkR4M1BCaEU5N2MyYTB1YjEvZVBKY3lKT3FyN1VhVEFQVEoreHZadGpiLzQwc2xvWTFsdFJuVGtXSUxtSVAyYjdTM0FkWENSK1lpQXJNVUh3ZG5jcGpweURHZnpxR09Vb0F1YWFtV3pBTWFjUXRiMzQvTTMyRkVnUjVsVUVmOGZSekZyWlVoelFqMGZSNy82Z2R6ZG5WVnZjU25lTG10cUo5MzBWQ0NET1JZOENWZFFXZG8vUzNQTmtYM3BRc1BWS1dJWUdBTXJGWm9xOGJRL09KQkRTWFA3S1NCZEwzUU4wWnFkMzkzcDZWRmM3RG5sbkZpTjAwU1k1TnV4N3lhZGVJTTBVcGwyclZzdTgvVkFJJztcbmNvbnN0IEZFTkNFRCA9IG5ldyBNYXAoW1s4MjE3LFwiYXBvc3Ryb3BoZVwiXSxbODI2MCxcImZyYWN0aW9uIHNsYXNoXCJdLFsxMjUzOSxcIm1pZGRsZSBkb3RcIl1dKTtcbmNvbnN0IE5TTV9NQVggPSA0O1xuXG5mdW5jdGlvbiBkZWNvZGVfYXJpdGhtZXRpYyhieXRlcykge1xyXG5cdGxldCBwb3MgPSAwO1xyXG5cdGZ1bmN0aW9uIHUxNigpIHsgcmV0dXJuIChieXRlc1twb3MrK10gPDwgOCkgfCBieXRlc1twb3MrK107IH1cclxuXHRcclxuXHQvLyBkZWNvZGUgdGhlIGZyZXF1ZW5jeSB0YWJsZVxyXG5cdGxldCBzeW1ib2xfY291bnQgPSB1MTYoKTtcclxuXHRsZXQgdG90YWwgPSAxO1xyXG5cdGxldCBhY2MgPSBbMCwgMV07IC8vIGZpcnN0IHN5bWJvbCBoYXMgZnJlcXVlbmN5IDFcclxuXHRmb3IgKGxldCBpID0gMTsgaSA8IHN5bWJvbF9jb3VudDsgaSsrKSB7XHJcblx0XHRhY2MucHVzaCh0b3RhbCArPSB1MTYoKSk7XHJcblx0fVxyXG5cclxuXHQvLyBza2lwIHRoZSBzaXplZC1wYXlsb2FkIHR
26774oYXQgdGhlIGxhc3QgMyBzeW1ib2xzIGluZGV4IGludG9cclxuXHRsZXQgc2tpcCA9IHUxNigpO1xyXG5cdGxldCBwb3NfcGF5bG9hZCA9IHBvcztcclxuXHRwb3MgKz0gc2tpcDtcclxuXHJcblx0bGV0IHJlYWRfd2lkdGggPSAwO1xyXG5cdGxldCByZWFkX2J1ZmZlciA9IDA7IFxyXG5cdGZ1bmN0aW9uIHJlYWRfYml0KCkge1xyXG5cdFx0aWYgKHJlYWRfd2lkdGggPT0gMCkge1xyXG5cdFx0XHQvLyB0aGlzIHdpbGwgcmVhZCBiZXlvbmQgZW5kIG9mIGJ1ZmZlclxyXG5cdFx0XHQvLyBidXQgKHVuZGVmaW5lZHwwKSA9PiB6ZXJvIHBhZFxyXG5cdFx0XHRyZWFkX2J1ZmZlciA9IChyZWFkX2J1ZmZlciA8PCA4KSB8IGJ5dGVzW3BvcysrXTtcclxuXHRcdFx0cmVhZF93aWR0aCA9IDg7XHJcblx0XHR9XHJcblx0XHRyZXR1cm4gKHJlYWRfYnVmZmVyID4+IC0tcmVhZF93aWR0aCkgJiAxO1xyXG5cdH1cclxuXHJcblx0Y29uc3QgTiA9IDMxO1xyXG5cdGNvbnN0IEZVTEwgPSAyKipOO1xyXG5cdGNvbnN0IEhBTEYgPSBGVUxMID4+PiAxO1xyXG5cdGNvbnN0IFFSVFIgPSBIQUxGID4+IDE7XHJcblx0Y29uc3QgTUFTSyA9IEZVTEwgLSAxO1xyXG5cclxuXHQvLyBmaWxsIHJlZ2lzdGVyXHJcblx0bGV0IHJlZ2lzdGVyID0gMDtcclxuXHRmb3IgKGxldCBpID0gMDsgaSA8IE47IGkrKykgcmVnaXN0ZXIgPSAocmVnaXN0ZXIgPDwgMSkgfCByZWFkX2JpdCgpO1xyXG5cclxuXHRsZXQgc3ltYm9scyA9IFtdO1xyXG5cdGxldCBsb3cgPSAwO1xyXG5cdGxldCByYW5nZSA9IEZVTEw7IC8vIHRyZWF0IGxpa2UgYSBmbG9hdFxyXG5cdHdoaWxlICh0cnVlKSB7XHJcblx0XHRsZXQgdmFsdWUgPSBNYXRoLmZsb29yKCgoKHJlZ2lzdGVyIC0gbG93ICsgMSkgKiB0b3RhbCkgLSAxKSAvIHJhbmdlKTtcclxuXHRcdGxldCBzdGFydCA9IDA7XHJcblx0XHRsZXQgZW5kID0gc3ltYm9sX2NvdW50O1xyXG5cdFx0d2hpbGUgKGVuZCAtIHN0YXJ0ID4gMSkgeyAvLyBiaW5hcnkgc2VhcmNoXHJcblx0XHRcdGxldCBtaWQgPSAoc3RhcnQgKyBlbmQpID4+PiAxO1xyXG5cdFx0XHRpZiAodmFsdWUgPCBhY2NbbWlkXSkge1xyXG5cdFx0XHRcdGVuZCA9IG1pZDtcclxuXHRcdFx0fSBlbHNlIHtcclxuXHRcdFx0XHRzdGFydCA9IG1pZDtcclxuXHRcdFx0fVxyXG5cdFx0fVxyXG5cdFx0aWYgKHN0YXJ0ID09IDApIGJyZWFrOyAvLyBmaXJzdCBzeW1ib2wgaXMgZW5kIG1hcmtcclxuXHRcdHN5bWJvbHMucHVzaChzdGFydCk7XHJcblx0XHRsZXQgYSA9IGxvdyArIE1hdGguZmxvb3IocmFuZ2UgKiBhY2Nbc3RhcnRdICAgLyB0b3RhbCk7XHJcblx0XHRsZXQgYiA9IGxvdyArIE1hdGguZmxvb3IocmFuZ2UgKiBhY2Nbc3RhcnQrMV0gLyB0b3RhbCkgLSAxO1xyXG5cdFx0d2hpbGUgKCgoYSBeIGIpICYgSEFMRikgPT0gMCkge1xyXG5cdFx0XHRyZWdpc3RlciA9IChyZWdpc3RlciA8PCAxKSAmIE1BU0sgfCByZWFkX2JpdCgpO1xyXG5cdFx0XHRhID0gKGEgPDwgMSkgJiBNQVNLO1xyXG5cdFx0XHRiID0gKGIgPDwgMSkgJiBNQVNLIHwgMTtcclxuXHRcdH1cclxuXHRcdHdoaWxlIChhICYgfmIgJiBRUlRSKSB7XHJcblx0XHRcdHJlZ2lzdGVyID0gKHJlZ2lzdGVyICYgSEFMRikgfCAoKHJlZ2lzdGVyIDw8IDEpICYgKE1BU0sgPj4+IDEpKSB8IHJlYWRfYml0KCk7XHJcblx0XHRcdGEgPSAoYSA8PCAxKSBeIEhBTEY7XHJcblx0XHRcdGIgPSAoKGIgXiBIQUxGKSA8PCAxKSB8IEhBTEYgfCAxO1xyXG5cdFx0fVxyXG5cdFx0bG93ID0gYTtcclxuXHRcdHJhbmdlID0gMSArIGIgLSBhO1xyXG5cdH1cclxuXHRsZXQgb2Zmc2V0ID0gc3ltYm9sX2NvdW50IC0gNDtcclxuXHRyZXR1cm4gc3ltYm9scy5tYXAoeCA9PiB7IC8vIGluZGV4IGludG8gcGF5bG9hZFxyXG5cdFx0c3dpdGNoICh4IC0gb2Zmc2V0KSB7XHJcblx0XHRcdGNhc2UgMzogcmV0dXJuIG9mZnNldCArIDB4MTAxMDAgKyAoKGJ5dGVzW3Bvc19wYXlsb2FkKytdIDw8IDE2KSB8IChieXRlc1twb3NfcGF5bG9hZCsrXSA8PCA4KSB8IGJ5dGVzW3Bvc19wYXlsb2FkKytdKTtcclxuXHRcdFx0Y2FzZSAyOiByZXR1cm4gb2Zmc2V0ICsgMHgxMDAgKyAoKGJ5dGVzW3Bvc19wYXlsb2FkKytdIDw8IDgpIHwgYnl0ZXNbcG9zX3BheWxvYWQrK10pO1xyXG5cdFx0XHRjYXNlIDE6IHJldHVybiBvZmZzZXQgKyBieXRlc1twb3NfcGF5bG9hZCsrXTtcclxuXHRcdFx0ZGVmYXVsdDogcmV0dXJuIHggLSAxO1xyXG5cdFx0fVxyXG5cdH0pO1xyXG59XHRcclxuXHJcbi8vIHJldHVybnMgYW4gaXRlcmF0b3Igd2hpY2ggcmV0dXJucyB0aGUgbmV4dCBzeW1ib2xcclxuZnVuY3Rpb24gcmVhZF9wYXlsb2FkKHYpIHtcclxuXHRsZXQgcG9zID0gMDtcclxuXHRyZXR1cm4gKCkgPT4gdltwb3MrK107XHJcbn1cclxuZnVuY3Rpb24gcmVhZF9jb21wcmVzc2VkX3BheWxvYWQocykge1xyXG5cdHJldHVybiByZWFkX3BheWxvYWQoZGVjb2RlX2FyaXRobWV0aWModW5zYWZlX2F0b2IocykpKTtcclxufVxyXG5cclxuLy8gdW5zYWZlIGluIHRoZSBzZW5zZTpcclxuLy8gZXhwZWN0ZWQgd2VsbC1mb3JtZWQgQmFzZTY0IHcvbyBwYWRkaW5nIFxyXG4vLyAyMDIyMDkyMjogYWRkZWQgZm9yIGh0dHBzOi8vZ2l0aHViLmNvbS9hZHJhZmZ5L2Vucy1ub3JtYWxpemUuanMvaXNzdWVzLzRcclxuZnVuY3Rpb24gdW5zYWZlX2F0b2Iocykge1xyXG5cdGxldCBsb29rdXAgPSBbXTtcclxuXHRbLi4uJ0FCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky8nXS5mb3JFYWNoKChjLCBpKSA9PiBsb29rdXBbYy5jaGFyQ29kZUF0KDApXSA9IGkpO1xyXG5cdGxldCBuID0gcy5sZW5ndGg7XHJcblx0bGV0IHJldCA9IG5ldyBVaW50OEFycmF5KCg2ICogbikgPj4gMyk7XHJcblx0Zm9yIChsZXQgaSA9IDAsIHBvcyA9IDAsIHdpZHRoID0gMCwgY2FycnkgPSAwOyBpIDwgbjsgaSsrKSB7XHJcblx0XHRjYXJyeSA9IChjYXJyeSA8PCA2KSB8IGxvb2t1cFtzLmNoYXJDb2RlQXQoaSldO1xyXG5cdFx0d2lkdGggKz0gNjtcclxuXHRcdGlmICh3aWR0aCA+PSA4KSB7XHJcblx0XHRcdHJldFtwb3MrK10gPSAoY2FycnkgPj4gKHdpZHRoIC09IDgpKTtcclxuXHRcdH1cclxuXHR9XHJcblx0cmV0dXJuIHJldDtcclxufVxyXG5cclxuLy8gZWcuIFswLDEsMiwzLi4uXSA9PiBbMCwtMSwxLC0yLC4uLl1cclxuZnVuY3Rpb24gc2lnbmVkKGkpIHsgXHJcblx0cmV0dXJuIChpICYgMSkgPyAofmkgPj4gMSkgOiAoaSA+PiAxKTtcclxufVxyXG5cclxuZnVuY3Rpb24gcmVhZF9kZWx0YXMobiwgbmV4dCkge1xyXG5cdGxldCB2ID0gQXJyYXkobik7XHJcblx0Zm9yIChsZXQgaSA9IDAsIHggPSAwOyBpIDwgbjsgaSsrKSB2W2ldID0geCArPSBzaWduZWQobmV4dCgpKTtcclxuXHRyZXR1cm4gdjtcclxufVxyXG5cclxuLy8gWzEyM11bNV0gPT4gWzAgM10gWzEgMV0gWzAgMF1cclxuZnVuY3Rpb24gcmVhZF9zb3J0ZWQobmV4dCwgcHJldiA9IDApIHtcclxuXHRsZXQgcmV0ID0gW107XHJcblx0d2hpbGUgKHRydWUpIHtcclxuXHRcdGxldCB4ID0gbmV4dCgpO1xyXG5cdFx0bGV0IG4gPSBuZXh0KCk7XHJcblx0XHRpZiAoIW4pIGJyZWFrO1xyXG5cdFx0cHJldiArPSB4O1xyXG5cdFx0Zm9yIChsZXQgaSA9IDA7IGkgPCBuOyBpKyspIHtcclxuXHRcdFx0cmV0LnB1c2gocHJldiArIGkpO1xyXG5cdFx0fVxyXG5cdFx0cHJldiArPSBuICsgMTtcclxuXHR9XHJcblx0cmV0dXJuIHJldDtcclxufVxyXG5cclxuZnVuY3Rpb24gcmVhZF9zb3J0ZWRfYXJyYXlzKG5leHQpIHtcclxuXHRyZXR1cm4gcmVhZF9hcnJheV93aGlsZSgoKSA9PiB7IFxyXG5cdFx0bGV0IHYgPSByZWFkX3NvcnRlZChuZXh0KTtcclxuXHRcdGlmICh2Lmxlbmd0aCkgcmV0dXJuIHY7XHJcblx0fSk7XHJcbn1cclxuXHJcbi8vIHJldHVybnMgbWFwIG9mIHggPT4geXNcclxuZnVuY3Rpb24gcmVhZF9tYXBwZWQobmV4dCkge1xyXG5cdGxldCByZXQgPSBbXTtcclxuXHR3aGlsZSAodHJ1ZSkge1xyXG5cdFx0bGV0IHcgPSBuZXh0KCk7XHJcblx0XHRpZiAodyA9PSAwKSBicmVhaztcclxuXHRcdHJldC5wdXNoKHJlYWRfbGluZWFyX3RhYmxlKHcsIG5leHQpKTtcclxuXHR9XHJcblx0d2hpbGUgKHRydWUpIHtcclxuXHRcdGxldCB3ID0gbmV4dCgpIC0gMTtcclxuXHRcdGlmICh3IDwgMCkgYnJlYWs7XHJcblx0XHRyZXQucHVzaChyZWFkX3JlcGxhY2VtZW50X3RhYmxlKHcsIG5leHQpKTtcclxuXHR9XHJcblx0cmV0dXJuIHJldC5mbGF0KCk7XHJcbn1cclxuXHJcbi8vIHJlYWQgdW50aWwgbmV4dCBpcyBmYWxzeVxyXG4vLyByZXR1cm4gYXJyYXkgb2YgcmVhZCB2YWx1ZXNcclxuZnVuY3Rpb24gcmVhZF9hcnJheV93aGlsZShuZXh0KSB7XHJcblx0bGV0IHYgPSBbXTtcclxuXHR3aGlsZSAodHJ1ZSkge1xyXG5cdFx0bGV0IHggPSBuZXh0KHYubGVuZ3RoKTtcclxuXHRcdGlmICgheCkgYnJlYWs7XHJcblx0XHR2LnB1c2goeCk7XHJcblx0fVxyXG5cdHJldHVybi
26774B2O1xyXG59XHJcblxyXG4vLyByZWFkIHcgY29sdW1ucyBvZiBsZW5ndGggblxyXG4vLyByZXR1cm4gYXMgbiByb3dzIG9mIGxlbmd0aCB3XHJcbmZ1bmN0aW9uIHJlYWRfdHJhbnNwb3NlZChuLCB3LCBuZXh0KSB7XHJcblx0bGV0IG0gPSBBcnJheShuKS5maWxsKCkubWFwKCgpID0+IFtdKTtcclxuXHRmb3IgKGxldCBpID0gMDsgaSA8IHc7IGkrKykge1xyXG5cdFx0cmVhZF9kZWx0YXMobiwgbmV4dCkuZm9yRWFjaCgoeCwgaikgPT4gbVtqXS5wdXNoKHgpKTtcclxuXHR9XHJcblx0cmV0dXJuIG07XHJcbn1cclxuIFxyXG4vLyByZXR1cm5zIFtbeCwgeXNdLCBbeCtkeCwgeXMrZHldLCBbeCsyKmR4LCB5cysyKmR5XSwgLi4uXVxyXG4vLyB3aGVyZSBkeC9keSA9IHN0ZXBzLCBuID0gcnVuIHNpemUsIHcgPSBsZW5ndGggb2YgeVxyXG5mdW5jdGlvbiByZWFkX2xpbmVhcl90YWJsZSh3LCBuZXh0KSB7XHJcblx0bGV0IGR4ID0gMSArIG5leHQoKTtcclxuXHRsZXQgZHkgPSBuZXh0KCk7XHJcblx0bGV0IHZOID0gcmVhZF9hcnJheV93aGlsZShuZXh0KTtcclxuXHRsZXQgbSA9IHJlYWRfdHJhbnNwb3NlZCh2Ti5sZW5ndGgsIDErdywgbmV4dCk7XHJcblx0cmV0dXJuIG0uZmxhdE1hcCgodiwgaSkgPT4ge1xyXG5cdFx0bGV0IFt4LCAuLi55c10gPSB2O1xyXG5cdFx0cmV0dXJuIEFycmF5KHZOW2ldKS5maWxsKCkubWFwKChfLCBqKSA9PiB7XHJcblx0XHRcdGxldCBqX2R5ID0gaiAqIGR5O1xyXG5cdFx0XHRyZXR1cm4gW3ggKyBqICogZHgsIHlzLm1hcCh5ID0+IHkgKyBqX2R5KV07XHJcblx0XHR9KTtcclxuXHR9KTtcclxufVxyXG5cclxuLy8gcmV0dXJuIFtbeCwgeXMuLi5dLCAuLi5dXHJcbi8vIHdoZXJlIHcgPSBsZW5ndGggb2YgeVxyXG5mdW5jdGlvbiByZWFkX3JlcGxhY2VtZW50X3RhYmxlKHcsIG5leHQpIHsgXHJcblx0bGV0IG4gPSAxICsgbmV4dCgpO1xyXG5cdGxldCBtID0gcmVhZF90cmFuc3Bvc2VkKG4sIDErdywgbmV4dCk7XHJcblx0cmV0dXJuIG0ubWFwKHYgPT4gW3ZbMF0sIHYuc2xpY2UoMSldKTtcclxufVxyXG5cclxuXHJcbmZ1bmN0aW9uIHJlYWRfdHJpZShuZXh0KSB7XHJcblx0bGV0IHJldCA9IFtdO1xyXG5cdGxldCBzb3J0ZWQgPSByZWFkX3NvcnRlZChuZXh0KTsgXHJcblx0ZXhwYW5kKGRlY29kZShbXSksIFtdKTtcclxuXHRyZXR1cm4gcmV0OyAvLyBub3Qgc29ydGVkXHJcblx0ZnVuY3Rpb24gZGVjb2RlKFEpIHsgLy8gY2hhcmFjdGVycyB0aGF0IGxlYWQgaW50byB0aGlzIG5vZGVcclxuXHRcdGxldCBTID0gbmV4dCgpOyAvLyBzdGF0ZTogdmFsaWQsIHNhdmUsIGNoZWNrXHJcblx0XHRsZXQgQiA9IHJlYWRfYXJyYXlfd2hpbGUoKCkgPT4geyAvLyBidWNrZXRzIGxlYWRpbmcgdG8gbmV3IG5vZGVzXHJcblx0XHRcdGxldCBjcHMgPSByZWFkX3NvcnRlZChuZXh0KS5tYXAoaSA9PiBzb3J0ZWRbaV0pO1xyXG5cdFx0XHRpZiAoY3BzLmxlbmd0aCkgcmV0dXJuIGRlY29kZShjcHMpO1xyXG5cdFx0fSk7XHJcblx0XHRyZXR1cm4ge1MsIEIsIFF9O1xyXG5cdH1cclxuXHRmdW5jdGlvbiBleHBhbmQoe1MsIEJ9LCBjcHMsIHNhdmVkKSB7XHJcblx0XHRpZiAoUyAmIDQgJiYgc2F2ZWQgPT09IGNwc1tjcHMubGVuZ3RoLTFdKSByZXR1cm47XHJcblx0XHRpZiAoUyAmIDIpIHNhdmVkID0gY3BzW2Nwcy5sZW5ndGgtMV07XHJcblx0XHRpZiAoUyAmIDEpIHJldC5wdXNoKGNwcyk7IFxyXG5cdFx0Zm9yIChsZXQgYnIgb2YgQikge1xyXG5cdFx0XHRmb3IgKGxldCBjcCBvZiBici5RKSB7XHJcblx0XHRcdFx0ZXhwYW5kKGJyLCBbLi4uY3BzLCBjcF0sIHNhdmVkKTtcclxuXHRcdFx0fVxyXG5cdFx0fVxyXG5cdH1cclxufVxuXG5mdW5jdGlvbiBoZXhfY3AoY3ApIHtcclxuXHRyZXR1cm4gY3AudG9TdHJpbmcoMTYpLnRvVXBwZXJDYXNlKCkucGFkU3RhcnQoMiwgJzAnKTtcclxufVxyXG5cclxuZnVuY3Rpb24gcXVvdGVfY3AoY3ApIHtcclxuXHRyZXR1cm4gYHske2hleF9jcChjcCl9fWA7IC8vIHJhZmZ5IGNvbnZlbnRpb246IGxpa2UgXCJcXHV7WH1cIiB3L28gdGhlIFwiXFx1XCJcclxufVxyXG5cclxuLypcclxuZXhwb3J0IGZ1bmN0aW9uIGV4cGxvZGVfY3Aocykge1xyXG5cdHJldHVybiBbLi4uc10ubWFwKGMgPT4gYy5jb2RlUG9pbnRBdCgwKSk7XHJcbn1cclxuKi9cclxuZnVuY3Rpb24gZXhwbG9kZV9jcChzKSB7IC8vIHRoaXMgaXMgYWJvdXQgMnggZmFzdGVyXHJcblx0bGV0IGNwcyA9IFtdO1xyXG5cdGZvciAobGV0IHBvcyA9IDAsIGxlbiA9IHMubGVuZ3RoOyBwb3MgPCBsZW47ICkge1xyXG5cdFx0bGV0IGNwID0gcy5jb2RlUG9pbnRBdChwb3MpO1xyXG5cdFx0cG9zICs9IGNwIDwgMHgxMDAwMCA/IDEgOiAyO1xyXG5cdFx0Y3BzLnB1c2goY3ApO1xyXG5cdH1cclxuXHRyZXR1cm4gY3BzO1xyXG59XHJcblxyXG5mdW5jdGlvbiBzdHJfZnJvbV9jcHMoY3BzKSB7XHJcblx0Y29uc3QgY2h1bmsgPSA0MDk2O1xyXG5cdGxldCBsZW4gPSBjcHMubGVuZ3RoO1xyXG5cdGlmIChsZW4gPCBjaHVuaykgcmV0dXJuIFN0cmluZy5mcm9tQ29kZVBvaW50KC4uLmNwcyk7XHJcblx0bGV0IGJ1ZiA9IFtdO1xyXG5cdGZvciAobGV0IGkgPSAwOyBpIDwgbGVuOyApIHtcclxuXHRcdGJ1Zi5wdXNoKFN0cmluZy5mcm9tQ29kZVBvaW50KC4uLmNwcy5zbGljZShpLCBpICs9IGNodW5rKSkpO1xyXG5cdH1cclxuXHRyZXR1cm4gYnVmLmpvaW4oJycpO1xyXG59XHJcblxyXG5mdW5jdGlvbiBjb21wYXJlX2FycmF5cyhhLCBiKSB7XHJcblx0bGV0IG4gPSBhLmxlbmd0aDtcclxuXHRsZXQgYyA9IG4gLSBiLmxlbmd0aDtcclxuXHRmb3IgKGxldCBpID0gMDsgYyA9PSAwICYmIGkgPCBuOyBpKyspIGMgPSBhW2ldIC0gYltpXTtcclxuXHRyZXR1cm4gYztcclxufVxyXG5cclxuZnVuY3Rpb24gYXJyYXlfcmVwbGFjZSh2LCBhLCBiKSB7XHJcblx0bGV0IHByZXYgPSAwO1xyXG5cdHdoaWxlICh0cnVlKSB7XHJcblx0XHRsZXQgbmV4dCA9IHYuaW5kZXhPZihhLCBwcmV2KTtcclxuXHRcdGlmIChuZXh0IDwgMCkgYnJlYWs7XHJcblx0XHR2W25leHRdID0gYjsgXHJcblx0XHRwcmV2ID0gbmV4dCArIDE7XHJcblx0fVxyXG59XG5cbi8vIGNyZWF0ZWQgMjAyNS0wOS0xNFQxNzo1NjoyNC4wOTlaXG4vLyBjb21wcmVzc2VkIGJhc2U2NC1lbmNvZGVkIGJsb2IgZm9yIGluY2x1ZGUtbmYgZGF0YVxuLy8gc291cmNlOiBodHRwczovL2dpdGh1Yi5jb20vYWRyYWZmeS9lbnMtbm9ybWFsaXplLmpzL2Jsb2IvbWFpbi9zcmMvbWFrZS5qc1xuLy8gc2VlOiBodHRwczovL2dpdGh1Yi5jb20vYWRyYWZmeS9lbnMtbm9ybWFsaXplLmpzI3NlY3VyaXR5XG4vLyBTSEEtMjU2OiA5ZWY0M2NjNzIxNWFhN2E1M2U0ZWQ5YWZhM2I0ZjJmOGNlMDBhMmM3MDhiOWViOTZhYTQwOWFlNmZhM2ZiNmFmXG52YXIgQ09NUFJFU1NFRCA9ICdBRVVEV0FIU0NHWUFUd0RWQURJQWRnQWlBRFFBRkFBdEFCUUFJUUFQQUNjQURRQVNBQXNBR1FBSkFCSUFDUUFSQUFVQUN3QUZBQXdBQlFBUUFBTUFCd0FFQUFvQUJRQUpBQUlBQ2dBQkFBUUFGQUFMQUFJQUN3QUJBQUlBQVFBSEFBTUFBd0FFQU
26774FzQURBQU1BQXdBQ3dBTkFBMEFBd0FLQUFrQUJBQWRBQVlBWndEVEFlY0ROQUN4Q21JQjh4aFpBcWZvQzE5MFVHY1RoZ0J1cndmN1BUMDlQYjA5QWpnSnVtOE9qRGxseEhZVUtYQVB4enE2dEFCQXhnSzh5c1V2V0FnTVBUMDlQVDA5UFNzNkxUMkhjZ1dYV3dGTG9TTUVFRWw1UkZWTUt2TzBYUThFeERkSk1uSWdQaTg5dWowME1zdkJYeEVQQUdQQ0R3Qm5RS29FYndSd0JIRUVjZ1J6QkhRRWRRUjJCSGNFZUFSNkJIc0VmQVIrQklBRWdmbmRCUW9CWWdVTEFXSUZEQUZpQk5jRTJBVFpCUkFGRVFVdkJkQUxGQXNWRFBjTkJ3MTNEWWNPTUE0eERqTUI0QmxsSEkwQjJncmJBTURwSExrUTdRSFZBUFJOUVFGbkdSVUVnMHlFQjJ1YUpFTUFKcElCcG9iNUFFUlNNQUtOb0FYcWFRTFJCTUN6RWlDK0FaNEVXUkpKRmJFdTdRRFFMQVJ0RWJnRUN4RHdBYi9SeUFrMUFWNG5EMmNFUVFLVEF6c0FHcG9iUGdBYWhBR1BDcnlzZHkwT0FLd0FmRkljQkFRRlVtb0EvUHRaQURrQklhZFZqMlVNVWd4NUlsNEFOUUM5dkxJQkRBSFVHVnNROHdDemZRSWJHVmNDSEJaSEFaOENCQWdYT2hHN0FxTVo0TTcrMU0wVUFQRE5BV3NDK21jSkRlOEFBUUE5OXprRVhMSUN5UW96QW82bEFvYmNQNUp2alFMRnp3S0Q5Z1UvT0Q4RkVRQ3RFUUw2YlcrbkFLVUV2empESHN1UnlVdk9GSGNhY1V6NUFxSUZSU0Uya3pzQkVRQ3VhUUw1RFFUbGNnTzZ0d1NwVGlVZ0N3SUZDQVVYQkhRRXFRVjZzd0FWeFVsbVRtc0N3anFzUC93S0pRbVhiNzkzVWdaQkVCc25wUkQzRERNQnRRRTdEZTFMMkFUeEJqc0V5Ujk5R1JrUHpaV2NDS1V0M1F6dEp1TXVvWUJhSS9VcWd3WHRTL1E4M1F0TlVXZ1BXUXRsQ2VNNlk0Rk9BeUVCRFNLTEN0ME5PUWh0RVBNS3lXc041UkZGQnprRDFVbWFBS1VIQVFzUkhUVVZ0U1lRWXF3TENUbDNCdnNhOWd1UEpxOFRLWHI4QmRNYUlRWk5BU2thL3dEUEx1ZUZzRm94WEJ4UFh3WURDeVVqeHhTb1VDQU5KVUMzZUVnYUd3Y1ZKYWtDa1VOd1NvZFJOaDZUSWZZOFBRMW1MaE5SZkFmMVBBVVpUd3VCUEo1R3EwVU9FZEkralQxSUlrbE1MQVExZnl3dko0c0p6dytGRExsOGNnRlpDU0VKc1F4eEV6RVJGemZGQ0RrSEdTMlhKQ2NWQ0NGR2xXQ2FCUGVmQS9NVDBRTUxCVDhKUVFjVEE3VWNMUk11RlNrRkRZRWsxd0x6TnRVdXN3S1BWb0FCRndYTER5VWYzeEJRUitBTzZRaWJBbVVEZ3lYckFDMFZJUUFYSXBzSVEyTUFYNC9ZVXdVdXl3akhhbXdqZEFObkZPZGhFWE1Ia1E1WEI2Y2NNeFcvSE9Gd3lGNExoZ2dvbzY4Sld3RjFDWmtCWHdUakNBazFXNHlnSUVGblU0dFlHSnNnWVVFL1hmd0NNUXhsRlo5RXZZZDRBb3NQYXhJYkFUVUJjd2M1RFFFQ2R4SHRFV3NRbFFqcmhnUTF0VFA0T2lVRVR5R0RJQkVLSndOUGJNNExKeWI1RFBocEFhTVNZZ01NTkQxMzdtZXJZTFlrRi8wSEdUTEZRV0FoOFF1U1Q4ME1uQnJCR0VKVUxobmtCNzhEOHhyekorcEJWd1gvQTZNREV6cE5NKzRFdlF0cENJc0pQd0JKRHFNWEI5Y1lhZ3B4ak5BQk1Zc0J0NWtEVjVHREFtK1BCamNIQ3dCbkM0Y0ZlZVVBSFFLbkNLTUFCUURQQTFjQU9RS3RCNTBBR1FDRlFRRTlBeWN2QVNIbEFvOERrd2d4eXdHVkx3SHpLUVFid3d3VkFQYzNia29DdzdFQ2dHcG1vZ1hkV0FLT0FrazFBVTBsQkFWT1IxRURyM0hoQU5zQVN3WVQzMGNCRmF0S3l4cmpRd0hmYnlzQXh3RDdBQVUxQndWQkFjMEI4MjBBdHdGZkN6RUpvck8xQVUzcEtRQ0RBQlZyQWRjQ2lRRGRBRFVBZi9FQlV3Qk5CVm41QmRNQ1Qwa0JFVEVZSzFkaEFic0RId0V6QVEwQWVRYkxqYVhKQng4RWJRZlRBaEFiRmVFQzd5NEh0UUVESXQ4VHpVTEZBcjNlVmFGZ0FtU0JBbUpDVzAydld6Y2dBcUgzQW1pWUFtWUpBcCtFT0JzTEFtWTdBbVltQkc0RWZ3Ti9Fd04ra2prR09YY1hPW
26774Uk2SXlNQ2JCMENNalk0Q2dKdHh3SnRydStLTTJkRkt3Rm5BTjRBNFFCS0JRZVlESTBBL2d2Q0FBMjFBbmN2QW5haVB3SjVTME1DZUxvZFhOdEZya2JYQW53L0FucklBbjBKQW56d0JWa0ZJRWdBU0gxakpBS0JiUUtBQUFLQUJRSi9ya2xZU2xzVkYwck1BdEVCQXRETVN5Y0RpRThEaCtaRXhaRXlBdktoWFFNREE2NUx6a3d0SlFQUFRVeE5yd0tMUHdLSzJNRWJCeDFEWndXM0FvNDNBbzVjUUplQkFvN1pBbzVjZUZHMFV6VUtVdFJVaFFLVCt3S1REQURwQUJ4VkhsV3ZWZEFHTEJzcGxZWXk0WGhtUlRzNUFwZWZBdSt5V0NHb0FGa2xBcGFQQXBaOG5BQ3BXYXhhQ1lGTkFEc0NsclVDbGs1Y1JGelJBcG5MQXBsa1hNcGRCeGtDbkpzNXdqcWRBcHdXQXArYkFwNjRpZ0FkRHpFcUR3S2Q4UUtla2dDMVBXRTBZZThDbnRNQ29HNEJxUUtlbng4Q25rNmxZOGhrSnlVckFpZXZBaVorQXFEN0FxQk1BcUxkQXFIRUFxWXZBcVhPQXFmL0FIMENwL0pvZkdpeEFBTkphaHhxMFFLczR3S3NyZ0t0WndLdEFnSlhIUUpWM0FLeDRkY0RIMDVzbHdLeXZRMENzdWdYYk9CdFkyMUlYd01selFLMlhEcy9icEFES1VVQ3VGNEN1VWNWQXJrcWQzQTJjT0VDdlJrQ3U5cHdsZ015RVFLK2lISUNBek54QXI0YWN5SnpUd0xEeXdMREJIT0NkRXMxUlhUZ0F6eW5BenlhQXoyL0FzVjhBc1pIQXNZUWlRTElhVkVDeUVRQ3lVOEN5UzRDWkowQzNkSjRlV0Y0cm5rbFM5QURHS05uQWdKaDlCbnpsU1I3QzE2U1hyc1JBczlyQXM5c0wwdFQwdk1UbndER3JRTFBjd0VwNmdOT0VuNUxCUUxjSndMYmlnTFNUd05TWEFOVFh3RUJBMVdNZ0lrL0FNc1c3V0JGZ2h5QzA0TE9nNDBDMnNjQzJkNkVFSVJKcHp3RGhxVUFMd05rRG9aeFdma0FWUUxmWlFMZXVITjNBdUl2N1JRQjh6QW5BZlNiQWZMU2h3THI4d0xwY0hrQzZ2a0M2dVFBK1VjQnVRTHVpUUxybkphcWx3TUM3ajhEaGVDWWVYRGdjYUVDOHdNQWFRT09GcG1UQXZjVEE1RnVBNUtIQXZlWUF2blpBdmhtbWh5YXE3czNteDREbllNQy92b0JHd0E1bnh5ZnN3TUZqUU9tYWdPbTJRRFJ4UU1HYXFHSW9nVUpBd3hKQXRRQVB3TUE0VUVYVXdFUjh3TnJCNWRuQlFDVExTdTNyNzNiQVltWkZIOFJCRGtCK3lrRklRNmRDWjhBa3YwVHRSUXJ4UUwzTFNjQXBRQzNCYm1Pa1JjL3hxZHRRUzRVSm8wdUFVTUJnUHdCdFNZQWRRTU9CRzBBTEFJV0RLRUFBQW9DUFFKcUE5MERmZ1NSQVNCRkJTRjhDZ0FGQUVRQUV3QTJFZ0ozQVFBRjFRTnI3d3JGQWdEM0NwOG52N0czNVFHUklVRkNBZWtVZnhFMHdJa0FCQUFiQUZvQ1JRS0Vpd0FHT2xNNmxJMXRBTGc2anpyUUFJMDR3VHJjQUtVQTZBRExBVHFCT2pzNS9EbjVPM2FKT2xzN25vazZiemtZQVZZQk13RnNCUzgxWFRXZU5hMDFaalYxTmJZMXhUV0NOWkUxMGpYaE5aNDFyVFh1TmYwMXNqWEJOZ0kyRVRYR05kVTJGalluTmQ0MTdUWXVOajAyTGpVdElUWTZOajAyUERiSk53Z0VrRHhYTmpnMjNUY2dOdzgyeWlBM2lUY3dDZ1N3UEdjMkpEY1pOMnc2alRjaFF0UkRCMExnUXdzY0R3OEpteWh0S0ZGVkJnRHBmd0Rwc0FEK214UTkxd0xwTlNNQXJRQzlCYmVPa1JkTHhwdHpCTDhNREFNTUFRZ0RBQWtLQ3dzTENRb0dCQVZWQkkvRHZ3RHo5YjI5a2FVQ2IwUXRzUlROTHQ0ZUdCY1NIQU1aRmhZWkVoWUVBUkFFQlVFY1FSeEJIRUVjUVJ4QkhFRWFRUnhCSEVGQ1NUeEJQRWxJU1VoQk5rTTJRVFliTmtsSVNWbUJWSWdFTGdFYUpaa0M3YU1Bb1FDakJjR09teGROeHJzQnZ3R0pBYVFjRVowZVBDa2xNQUFoTXZBSU1BTDU0Z0M3Qm04RWVzY2p6UU1wQVJRcEtnRFVIcVN2QWo1R3F3cjdZck1VQUNUOUFOM3JwRjI3SDdmc2QvdHdQdDRsK1VXMXlRWUtCdDJDZ3k3cUpwR2lMY2RFMlAxY1FTSW1VYnFKNklDSDI3SDRrblFNSVJNckZrSHUzc3g2dEMzNVkrZUxJaDRlNENNS0o0RGZ5Vis4bWZ0YTQ5OVJDQUoweGZlWlI4UHNvWU9BcHZhOXBqR240UGh2eVpTNy9oNUpMdWhhdWNmanVVK1o1ODR3d3FOTzRoV1ltYUJDY2pnUVBhbGUxYmpvSHpNVWJ1dC96VGd4SHhCbkF5cmRLcEY0SVJNQVNMQnREL2p2aXlMZUNnajh0d1dqQWQzSGNoTi91cWFlUlllSEpnbDdKRVk5L2NUcnZ0ZnlieC9yM1kvTnR4SjlkcCtNVFZtaVM5YndCSDczczhEaTU2L01hK21UUE1IcTRUMXlFRzFmV2NxcjB1K2hyR25KRXZVMUpKQW0vbWFRU3JLcmF6SXl2U2tERmtqOFVVbGZCcThiYW5pVEdQbmc2WVpSTDY2MXJETnc0dy8xZzJmaWdHMEloWG5MN3dvc2Qvc1ZObzVkWVNtTUJUUDVjN3JZTGpSZEN3ZzhxdXdsak9NUGY2M0Q4SUNBTDByNzFYUml5RkhkZ3dIYndmZ25QT2Y0THpqZjJ2K2orSWlESEcyaXNwNXlVbnpTRHlEUmI0aS9WczBxSFNIcThQaUVRL0puQlA3UHhuak4wajZnVDRBVkFlUngvMW85Vm5FVWxVd3ZGcnpKcUhrOWp4QXc0c1l4Q25yeGFlQmRDRkZLYm5FN3oreDU0RjVXN1pac1U2a3g4UW9jdWw2Rm9BSEh5MDFGR0wvbm5lNjFtbjQrdVlYZlExVWNjbitITUxLRStjWnpUOEJCMUUzRlJza09nSnJSc3EyNXJhdUxtOCt1YW1YcGtTL2JUeTZ5MXdEYkNyVzRlRDUzMmtUV3J0TlVtVlZaT0luL0MrL0pSOUtWUjVpRzlUWThpYVQ2N3VibS93aEwxeGJLWm9xdFkrYTZmTnhNSnJnMjExYkdZSkRVa1lNTldBMEJNQisrOXpPbTZFaWs0cm9xczlDQ0VGVzBseUFLMFBidmx6dm94clp1WS9PRWhOVy9sLzYzVTE1T2QvUlN2bUR2WHBHTGlWbWVHaTVQRFNIMmJZejVvMmc2d0ZEUTJGYlpnWWdURjhyUGx2QTFpZmpaRDNOTHRGZFhkcFNJSnZnS1I3R3BqSldHN0daR2F3UG9tSUg4QjV0VW10SEg5THBNKy9LUUt1bkVQYTFHaVFrQ1h2NENubTlETE9SbzJqb2ljSGRQRFo2NG9iUXJQWjViZ3Fja2tqMEc2L05FaVBZQlk0YkNrTDdXOEc1WXpzVWI2R2FrRmp5a1NQa1Q3SkdlTGVCNnVKT0dNbSt4N04zODFCQ0RmYkpGeDBkdExnVjlRNDc3QmZMMWZ2aXRYNWFuVi9vWWZ4ZVlsK2VGNXg1YkI4K0VwL0wybnNtZDU2YUtGNGFBRDRHYkpXc2RLeUJXMjJ4RW1BRDNYZGJ0c015QUZvUjVtT2xhMGdFZDlVL1lWQjd6dkhHcEhiUW9uYXk5U3YwYlE4aVo4cGlhWFZyS2M1QUcxQW1xcWdhRXZ6SFNQMld1eDdhWlRXaDZxdVZEVlUwMUp0TUlWUmRDRndsU2JicXFob0ZseXpzb3RRelJleEZ2Wi9NcVVTRnUzT2hSSXVOQmJ1ZnZCcGRWZ2I4WGRHSjQ4L2xKUENaN2RzT3VqVFRiS1BTRXZHWGtPbkcyWGRpOC9uTTNFTVJxSVRkNVFlVTdpT2pLcUM3VVJKWTZUbkxzSGlqMjJ4QUhLblZSRDVNRHRCWW5vR0ZxWkdNRG1YQ1c2T2orQkFXdzE0aEVTWS94TEY2YkxrdTA2QUhraVhUSFBDRlowZjlZU3FxbzI3ZUF
26774oaFM2N09yQTJIZXQ0TTlKTTNqbS95Ulg2Yll4bmZtellsNXFRZEh4TjA4RnNOdVdEcldkNHZNVVkyUUQzaHI4dlM3M1NDVGtGb1haUjN4TnpPUXQ4ZC82SGZqQm1YcXZyRTZFR2tMeks2WUsyVTIva3NVL2lVSCtMdlZJc0pJK3JpMkFML2tsbytTaGREeWZzNUE4M2kycHJrTXM1MUlLUjdaY3FqWkppNVgzK2JkOEdseVd2dGRkeEtFb0VxU2dFTzdBOGpJZ2YybkgwaDhGak03b0I2eXRlM1g1bXBMMGkvRTRSeDBDb3RLbklMSmovdkpxbzRWa1BROTNqUnRSVmZhaXRRUHFsZGw1eFJZUHE4Mzg3WjBEY25adk9lSU9OMEh0MStQMjdrRkxHUUljTEJYNEZHM3NmZmNjTkhoNWNQZnpwOUlOb1J0cVZ0ZFZpSmZnOFJqblhpSXovTU5xRU42enZ6WDNoTXp5V0M3b1NvWElUMTR1YmMwYWJQWDhScDlHVmE1TkkvOGl2KzZlbGExb1RuY2JkaW1SS25yYlJmZkRSL1g0bkgrYmdxQXVIV2w3aE9hZVhQV1Z6SWVSbDdnYStKekQ0U3gzbWxqL3E2UmEvRTJIaERmMjFlRXpUTE5HZkNac1krL3l4WnpReklBdWlqRzY1aWk0Ty93YUFKQ3JFSmFXZC9EUkFLTVE1Njc4RHc1QVQ3UkNLemRhZEl3ZDhMc0QrRGdQQkFTbVdzVWxmOFIwazF3LzJrNGxPMldwYjR6TUk2RUpWSnMweGsvd244L2ZSVVBxckRLaGJqSFI0MVNxZ0ZNeDVSR01QdWR1RndsdTVsSzg5dFcxMXNUcWlYLzVFZkdzNW5PK3k5Rkt2Z1hLUE9FbWdFMDVFS05MNlNqYjN4UzQwSDNCVlBobTBFU09aZ0FqWm95bWM4YmUwaW5EVm80SmRKVmYrTktkM3ROL0NhQjdHU2hoSDI3cWY5NU5vRlpWWC82WmtSMmxYK0NnV3JRMklOZ2toK2JiTXo2OCt1SjNDbHNoOEhTTVBFUXRBdCtCQkU2ZlhEYWI3S0lsc0t4VTFsSVhXL0tXVnN0cGRQYW5KMHBkWHBRaW5EeVVRanRZN1pWY2ZpZWNSeFJETUFVaEhGVTJjRWFjaVEraHRpUE1QeDFrZHZ0V0c5VDQ0dzNyMDM3bGpIQkZKZFlSMHI1NXF2TVJpeHRBRUZKQXFBNFQxRVM4N0ZBeDdVb3pYYXN5dGc4TWZ0Wll0MHJqWWdMZTZFSjVhV3Z5MnFzY0JTQlE3eWVob0pJQTN3SUlaOXVrZmt5QmI2cW51ZTVrbzhXNTBycFY0a1hxV2pJNW5iR1JYck5XMHRCWkhYbFk0OG5TZ2NVWEJIV1Q0R2NnTFpKb0xsS0puVjk2a0NZcHE5ZVdIaDd4SnprQ0F5clF1UTVBSjBxcS91WjN0b0pnbE50ZXJlditRbTBLWHhQZy8rWWJGUkpkZmhicDF3T25WT0VZZFZIVHlhNkN0TzBhZmhFYUJoeDNvSHdDYjVLcTZSd0hEekZNbDJ2ZmpMOEd3emNDb1RqN3daZStVRm5ZRFYyeUtwUFU5ZGJhMjlnWUJkTnFKZy9LWG96TytDSlRsS21sS2hucVRmNWRvZVMzNURaRlYrY1lKUVZqZCtvVlkvR3RjLzZYUHpVeGIxZ01xZjZjRWpOTm9SQzhBT2JycCtmeDBjVnRHdTRmZkMyVGdYUkM4elBsOG1vVUhDQjVIWjI1ZDg3bWxzaWlLMGFOd0J0Y0VRalJOQlQvUXJYYncvOGFWWGRLTUhuOUVxWUVLRXl4U0dUcFlRT2FlczFHMVFxOHBEZ3FrWnRsTzJIUnlDWHBtZU03VFNyUlBrQWgwMDRCZmlzVnBGNnpQNDRuMkp2eHovZ09Wb2NOQ3l5OVY2bGtvZDI4UU00cGJhTXZWSmlnRC93M0Jyc2pTSnJYbHFjNHVsQllPQ2NlaUJONGIvZ0hhall5dXBiaEV0NjNhNjE5QXk0d3NMNmE2dzZCK0E3VG5veUU3QmxpV0hKZnpWeHhJS00vVzNNL0o4Qng5OU9wODYzUThlTnVJTUdSeCsrVmJZZmptK1ZHWUJBM0FwL0tFdS93eEJOQnBKSm5jd0hQRzQ1VjhHaDk4WklyR0NjMjBNd2lqR293WmJjUzdkMW5FZ2NPVzVjZGRacEhMMlhQQUlSYkNvbGloZVp6WFR2QnhaT1kzaU1TRFNLRHJJQ3lKL2lRczF2ZHBsVmRIL0pyTEpzUTJqdFRuZkNySVRJZ2hxM0tGWDNxQWdMV0FJcDhJZmZOU2RUWXB0bmJHZmM4cytxY3Izenl6eUhwMWFKZytqeFRGNGtEMXJ5NVdhdXY1VjN4bk9Hd1RGZWNOelhTTEhCVzIwL3BDUWprNHVvckQwcGxJaE1TVGM3OSsvcjRSS1BDbFJZVEJZZXgxT2I1Y3J0ZnZSUUJCdjZyZS82Rmh0Q3F0ZHVhZzY3Z2xxUkE3Ny8zdWxibGg5WVJ0TWREeGtDeUpEZU5uQXVDTFBRRm1kUlJXSnRIMjBaOERzdGZKZis1b2o1U1NCNjRkMGlGNS9ZYTRLZlRXeGZpdmo5QXAyL3piWWFUby8xZ08zdE02UllzQ1poYXJNQkZyN0ZtNjFtTFNyUW5FSTRPRjFnYlZTNGsvSkU5VW90T3JuTEpadXN3b1dvZENTVjh6Ynlia0pTVklQN244VWFFOXhDUjM5ckpabWYyN0hPQVBWT0djOXBka1FVY1JySTBxeVZGOVozajFSSERieElmd2JXem1QVmp3SWRQSnZ0bUJZd0VRSVVzSVcxUzkzOWhjVmlrSzAwb3pQUkkwMmNxaHpWVU56cE94VmRyd1JQdmxoMWFJT2YweEZFcUQzWWtHbkNuRmFoL2NGTjNKMmdCN04rYlpTR2F3d2tLRnUxdHBRTXJwMVcrMjdZTmt5VDBUcGNGcFRxZ09xcUxhYnJnY0NVUHhoOTdtUkVPR3k0eEl0elE5eFNsNnJxKzhCWnNIY3JRRlJlUytRZU14SjNQNkNuTDlFUC9lT0xEanVtTGh2cmNRcnBQaWtuc29mYnpCdjlnVFAwbFUrVElWd0U2RTdDY0tmVDM2cStaaUVPSEo5YXlmMGR5VUpMZXpBYjJNOGFOSHdkMCtPSm1zVmdUelJXQSc7XG5cbi8vIGh0dHBzOi8vdW5pY29kZS5vcmcvcmVwb3J0cy90cjE1L1xyXG4vLyBmb3IgcmVmZXJlbmNlIGltcGxlbWVudGF0aW9uXHJcbi8vIHNlZTogL2Rlcml2ZS9uZi5qc1xyXG5cclxuXHJcbi8vIGFsZ29yaXRobWljIGhhbmd1bFxyXG4vLyBodHRwczovL3d3dy51bmljb2RlLm9yZy92ZXJzaW9ucy9Vbmljb2RlMTUuMC4wL2NoMDMucGRmIChwYWdlIDE0NClcclxuY29uc3QgUzAgPSAweEFDMDA7XHJcbmNvbnN0IEwwID0gMHgxMTAwO1xyXG5jb25zdCBWMCA9IDB4MTE2MTtcclxuY29uc3QgVDAgPSAweDExQTc7XHJcbmNvbnN0IExfQ09VTlQgPSAxOTtcclxuY29uc3QgVl9DT1VOVCA9IDIxO1xyXG5jb25zdCBUX0NPVU5UID0gMjg7XHJcbmNvbnN0IE5fQ09VTlQgPSBWX0NPVU5UICogVF9DT1VOVDtcclxuY29uc3QgU19DT1VOVCA9IExfQ09VTlQgKiBOX0NPVU5UO1xyXG5jb25zdCBTMSA9IFMwICsgU19DT1VOVDtcclxuY29uc3QgTDEgPSBMMCArIExfQ09VTlQ7XHJcbmNvbnN0IFYxID0gVjAgKyBWX0NPVU5UO1xyXG5jb25zdCBUMSA9IFQwICsgVF9DT1VOVDtcclxuXHJcbmZ1bmN0aW9uIHVucGFja19jYyhwYWNrZWQpIHtcclxuXHRyZXR1cm4gKHBhY2tlZCA+PiAyNCkgJiAweEZGO1xyXG59XHJcbmZ1bmN0aW9uIHVucGFja19jcChwYWNrZWQpIHtcclxuXHRyZXR1cm4gcGFja2VkICYgMHhGRkZGRkY7XHJcbn1cclxuXHJcbmxldCBTSElGVEVEX1JBTkssIEVYQ0xVU0lPTlMsIERFQ09NUCwgUkVDT01QO1xyXG5cclxuLy8gZXhwb3J0IGZ1bmN0aW9uIG5mX2RlaW5pdCgpIHtcclxuLy8gXHRpZiAoIVNISUZURURfUkFOSykgcmV0dXJuO1xyXG4vLyBcdFNISUZURURfUkFOSyA9IEVYQ0xVU0lPTlMgPSBERUNPTVAgPSBSRUNPTVAgPSB1bmRlZmluZWQ7XHJcbi8vIH1cclxuXHJcbmZ1bmN0aW9uIGluaXQkMSgpIHtcclxuXHQvL2NvbnNvbGUudGltZSgnbmYnKTtcclxuXHRsZXQgciA9IHJlYWRfY29tcHJlc3NlZF9wYXlsb2FkKENPTVBSRVNTRUQpO1xyXG5cdFNISUZURURfUkFOSyA9IG5ldyBNYXAocmVhZF9zb3J0ZWRfYXJyYXlzKHIpLmZsYXRNYXAoKHYsIGkpID0+IHYubWFwKHggPT4gW3gsIChpKzEpIDw8IDI0XSkpKTsgLy8gcHJlLXNoaWZ0ZWRcclxuXHRFWENMVVNJT05TID0gbmV3IFNldChyZWFkX3NvcnRlZChyKSk7XHJcblx0REVDT01QID0gbmV3IE1hcCgpO1xyXG5cdFJFQ09NUCA9IG5ldyBNYXAoKTtcclxuXHRmb3IgKGxldCBbY3AsIGNwc10gb2YgcmVhZF9tYXBwZWQocikpIHtcclxuXHRcdGlmICghRVhDTFVTSU9OUy5oYXMoY3ApICYmIGNwcy5sZW5ndGggPT0gMikge1xyXG5cdFx0XHRsZXQgW2EsIGJdID0gY3BzO1xyXG5cdFx0XHRsZXQgYnVja2V0ID0gUkVDT01QLmdldChhKTtcclxuXHRcdFx0aWYgKCFidWNrZXQpIHtcclxuXHRcdFx0XHRidWNrZXQgPSBuZXcgTWFwKCk7XHJcblx0XHRcdFx0UkVDT01QLnNldChhLCBidWNrZXQpO1xyXG5cdFx0XHR9XHJcblx0XHRcdGJ1Y2tldC5zZXQoYiwgY3ApO1xyXG5cdFx0fVxyXG5cdFx0REVDT01QLnNldChjcCwgY3BzLnJldmVyc2UoKSk7IC8vIHN0b3JlZCByZXZlcnNlZFxyXG5cdH1cclxuXHQvL2NvbnNvbGUudGltZUVuZCgnbmYnKTtcclxuXHQvLyAyMDIzMDkwNTogMTFtc1xyXG59XHJcblxyXG5mdW5jdGlvbiBpc19oYW5ndWwoY3ApIHtcclxuXHRyZXR1cm4gY3AgPj0gUzAgJiYgY3AgPCBTMTtcclxufVxyXG5cclxuZnVuY3Rpb24gY29tcG9zZV9wYWlyKGEsIGIpIHtcclxuXHRpZiAoYSA+PSBMMCAmJiBhIDwgTDEgJiYgYiA+PSBWMCAmJiBiIDwgVjEpIHtcclxuXHRcdHJldHVybi
26774BTMCArIChhIC0gTDApICogTl9DT1VOVCArIChiIC0gVjApICogVF9DT1VOVDtcclxuXHR9IGVsc2UgaWYgKGlzX2hhbmd1bChhKSAmJiBiID4gVDAgJiYgYiA8IFQxICYmIChhIC0gUzApICUgVF9DT1VOVCA9PSAwKSB7XHJcblx0XHRyZXR1cm4gYSArIChiIC0gVDApO1xyXG5cdH0gZWxzZSB7XHJcblx0XHRsZXQgcmVjb21wID0gUkVDT01QLmdldChhKTtcclxuXHRcdGlmIChyZWNvbXApIHtcclxuXHRcdFx0cmVjb21wID0gcmVjb21wLmdldChiKTtcclxuXHRcdFx0aWYgKHJlY29tcCkge1xyXG5cdFx0XHRcdHJldHVybiByZWNvbXA7XHJcblx0XHRcdH1cclxuXHRcdH1cclxuXHRcdHJldHVybiAtMTtcclxuXHR9XHJcbn1cclxuXHJcbmZ1bmN0aW9uIGRlY29tcG9zZWQoY3BzKSB7XHJcblx0aWYgKCFTSElGVEVEX1JBTkspIGluaXQkMSgpO1xyXG5cdGxldCByZXQgPSBbXTtcclxuXHRsZXQgYnVmID0gW107XHJcblx0bGV0IGNoZWNrX29yZGVyID0gZmFsc2U7XHJcblx0ZnVuY3Rpb24gYWRkKGNwKSB7XHJcblx0XHRsZXQgY2MgPSBTSElGVEVEX1JBTksuZ2V0KGNwKTtcclxuXHRcdGlmIChjYykge1xyXG5cdFx0XHRjaGVja19vcmRlciA9IHRydWU7XHJcblx0XHRcdGNwIHw9IGNjO1xyXG5cdFx0fVxyXG5cdFx0cmV0LnB1c2goY3ApO1xyXG5cdH1cclxuXHRmb3IgKGxldCBjcCBvZiBjcHMpIHtcclxuXHRcdHdoaWxlICh0cnVlKSB7XHJcblx0XHRcdGlmIChjcCA8IDB4ODApIHtcclxuXHRcdFx0XHRyZXQucHVzaChjcCk7XHJcblx0XHRcdH0gZWxzZSBpZiAoaXNfaGFuZ3VsKGNwKSkge1xyXG5cdFx0XHRcdGxldCBzX2luZGV4ID0gY3AgLSBTMDtcclxuXHRcdFx0XHRsZXQgbF9pbmRleCA9IHNfaW5kZXggLyBOX0NPVU5UIHwgMDtcclxuXHRcdFx0XHRsZXQgdl9pbmRleCA9IChzX2luZGV4ICUgTl9DT1VOVCkgLyBUX0NPVU5UIHwgMDtcclxuXHRcdFx0XHRsZXQgdF9pbmRleCA9IHNfaW5kZXggJSBUX0NPVU5UO1xyXG5cdFx0XHRcdGFkZChMMCArIGxfaW5kZXgpO1xyXG5cdFx0XHRcdGFkZChWMCArIHZfaW5kZXgpO1xyXG5cdFx0XHRcdGlmICh0X2luZGV4ID4gMCkgYWRkKFQwICsgdF9pbmRleCk7XHJcblx0XHRcdH0gZWxzZSB7XHJcblx0XHRcdFx0bGV0IG1hcHBlZCA9IERFQ09NUC5nZXQoY3ApO1xyXG5cdFx0XHRcdGlmIChtYXBwZWQpIHtcclxuXHRcdFx0XHRcdGJ1Zi5wdXNoKC4uLm1hcHBlZCk7XHJcblx0XHRcdFx0fSBlbHNlIHtcclxuXHRcdFx0XHRcdGFkZChjcCk7XHJcblx0XHRcdFx0fVxyXG5cdFx0XHR9XHJcblx0XHRcdGlmICghYnVmLmxlbmd0aCkgYnJlYWs7XHJcblx0XHRcdGNwID0gYnVmLnBvcCgpO1xyXG5cdFx0fVxyXG5cdH1cclxuXHRpZiAoY2hlY2tfb3JkZXIgJiYgcmV0Lmxlbmd0aCA+IDEpIHtcclxuXHRcdGxldCBwcmV2X2NjID0gdW5wYWNrX2NjKHJldFswXSk7XHJcblx0XHRmb3IgKGxldCBpID0gMTsgaSA8IHJldC5sZW5ndGg7IGkrKykge1xyXG5cdFx0XHRsZXQgY2MgPSB1bnBhY2tfY2MocmV0W2ldKTtcclxuXHRcdFx0aWYgKGNjID09IDAgfHwgcHJldl9jYyA8PSBjYykge1xyXG5cdFx0XHRcdHByZXZfY2MgPSBjYztcclxuXHRcdFx0XHRjb250aW51ZTtcclxuXHRcdFx0fVxyXG5cdFx0XHRsZXQgaiA9IGktMTtcclxuXHRcdFx0d2hpbGUgKHRydWUpIHtcclxuXHRcdFx0XHRsZXQgdG1wID0gcmV0W2orMV07XHJcblx0XHRcdFx0cmV0W2orMV0gPSByZXRbal07XHJcblx0XHRcdFx0cmV0W2pdID0gdG1wO1xyXG5cdFx0XHRcdGlmICghaikgYnJlYWs7XHJcblx0XHRcdFx0cHJldl9jYyA9IHVucGFja19jYyhyZXRbLS1qXSk7XHJcblx0XHRcdFx0aWYgKHByZXZfY2MgPD0gY2MpIGJyZWFrO1xyXG5cdFx0XHR9XHJcblx0XHRcdHByZXZfY2MgPSB1bnBhY2tfY2MocmV0W2ldKTtcclxuXHRcdH1cclxuXHR9XHJcblx0cmV0dXJuIHJldDtcclxufVxyXG5cclxuZnVuY3Rpb24gY29tcG9zZWRfZnJvbV9kZWNvbXBvc2VkKHYpIHtcclxuXHRsZXQgcmV0ID0gW107XHJcblx0bGV0IHN0YWNrID0gW107XHJcblx0bGV0IHByZXZfY3AgPSAtMTtcclxuXHRsZXQgcHJldl9jYyA9IDA7XHJcblx0Zm9yIChsZXQgcGFja2VkIG9mIHYpIHtcclxuXHRcdGxldCBjYyA9IHVucGFja19jYyhwYWNrZWQpO1xyXG5cdFx0bGV0IGNwID0gdW5wYWNrX2NwKHBhY2tlZCk7XHJcblx0XHRpZiAocHJldl9jcCA9PSAtMSkge1xyXG5cdFx0XHRpZiAoY2MgPT0gMCkge1xyXG5cdFx0XHRcdHByZXZfY3AgPSBjcDtcclxuXHRcdFx0fSBlbHNlIHtcclxuXHRcdFx0XHRyZXQucHVzaChjcCk7XHJcblx0XHRcdH1cclxuXHRcdH0gZWxzZSBpZiAocHJldl9jYyA+IDAgJiYgcHJldl9jYyA+PSBjYykge1xyXG5cdFx0XHRpZiAoY2MgPT0gMCkge1xyXG5cdFx0XHRcdHJldC5wdXNoKHByZXZfY3AsIC4uLnN0YWNrKTtcclxuXHRcdFx0XHRzdGFjay5sZW5ndGggPSAwO1xyXG5cdFx0XHRcdHByZXZfY3AgPSBjcDtcclxuXHRcdFx0fSBlbHNlIHtcclxuXHRcdFx0XHRzdGFjay5wdXNoKGNwKTtcclxuXHRcdFx0fVxyXG5cdFx0XHRwcmV2X2NjID0gY2M7XHJcblx0XHR9IGVsc2Uge1xyXG5cdFx0XHRsZXQgY29tcG9zZWQgPSBjb21wb3NlX3BhaXIocHJldl9jcCwgY3ApO1xyXG5cdFx0XHRpZiAoY29tcG9zZWQgPj0gMCkge1xyXG5cdFx0XHRcdHByZXZfY3AgPSBjb21wb3NlZDtcclxuXHRcdFx0fSBlbHNlIGlmIChwcmV2X2NjID09IDAgJiYgY2MgPT0gMCkge1xyXG5cdFx0XHRcdHJldC5wdXNoKHByZXZfY3ApO1xyXG5cdFx0XHRcdHByZXZfY3AgPSBjcDtcclxuXHRcdFx0fSBlbHNlIHtcclxuXHRcdFx0XHRzdGFjay5wdXNoKGNwKTtcclxuXHRcdFx0XHRwcmV2X2NjID0gY2M7XHJcblx0XHRcdH1cclxuXHRcdH1cclxuXHR9XHJcblx0aWYgKHByZXZfY3AgPj0gMCkge1xyXG5cdFx0cmV0LnB1c2gocHJldl9jcCwgLi4uc3RhY2spO1x0XHJcblx0fVxyXG5cdHJldHVybiByZXQ7XHJcbn1cclxuXHJcbi8vIG5vdGU6IGNwcyBjYW4gYmUgaXRlcmFibGVcclxuZnVuY3Rpb24gbmZkKGNwcykge1xyXG5cdHJldHVybiBkZWNvbXBvc2VkKGNwcykubWFwKHVucGFja19jcCk7XHJcbn1cclxuZnVuY3Rpb24gbmZjKGNwcykge1xyXG5cdHJldHVybi
26774Bjb21wb3NlZF9mcm9tX2RlY29tcG9zZWQoZGVjb21wb3NlZChjcHMpKTtcclxufVxuXG5jb25zdCBIWVBIRU4gPSAweDJEO1xyXG5jb25zdCBTVE9QID0gMHgyRTtcclxuY29uc3QgU1RPUF9DSCA9ICcuJztcclxuY29uc3QgRkUwRiA9IDB4RkUwRjtcclxuY29uc3QgVU5JUVVFX1BIID0gMTtcclxuXHJcbi8vIDIwMjMwOTEzOiByZXBsYWNlIFsuLi52XSB3aXRoIEFycmF5X2Zyb20odikgdG8gYXZvaWQgbGFyZ2Ugc3ByZWFkc1xyXG5jb25zdCBBcnJheV9mcm9tID0geCA9PiBBcnJheS5mcm9tKHgpOyAvLyBBcnJheS5mcm9tLmJpbmQoQXJyYXkpO1xyXG5cclxuZnVuY3Rpb24gZ3JvdXBfaGFzX2NwKGcsIGNwKSB7XHJcblx0Ly8gMjAyMzA5MTM6IGtlZXAgcHJpbWFyeSBhbmQgc2Vjb25kYXJ5IGRpc3RpbmN0IGluc3RlYWQgb2YgY3JlYXRpbmcgdmFsaWQgdW5pb25cclxuXHRyZXR1cm4gZy5QLmhhcyhjcCkgfHwgZy5RLmhhcyhjcCk7XHJcbn1cclxuXHJcbmNsYXNzIEVtb2ppIGV4dGVuZHMgQXJyYXkge1xyXG5cdGdldCBpc19lbW9qaSgpIHsgcmV0dXJuIHRydWU7IH0gLy8gZnJlZSB0YWdnaW5nIHN5c3RlbVxyXG59XHJcblxyXG5sZXQgTUFQUEVELCBJR05PUkVELCBDTSwgTlNNLCBFU0NBUEUsIE5GQ19DSEVDSywgR1JPVVBTLCBXSE9MRV9WQUxJRCwgV0hPTEVfTUFQLCBWQUxJRCwgRU1PSklfTElTVCwgRU1PSklfUk9PVDtcclxuXHJcbi8vIGV4cG9ydCBmdW5jdGlvbiBlbnNfZGVpbml0KCkge1xyXG4vLyBcdG5mX2RlaW5pdCgpO1xyXG4vLyBcdGlmICghTUFQUEVEKSByZXR1cm47XHJcbi8vIFx0TUFQUEVEID0gSUdOT1JFRCA9IENNID0gTlNNID0gRVNDQVBFID0gTkZDX0NIRUNLID0gR1JPVVBTID0gV0hPTEVfVkFMSUQgPSBXSE9MRV9NQVAgPSBWQUxJRCA9IEVNT0pJX0xJU1QgPSBFTU9KSV9ST09UID0gdW5kZWZpbmVkO1xyXG4vLyB9XHJcblxyXG5mdW5jdGlvbiBpbml0KCkge1xyXG5cdGlmIChNQVBQRUQpIHJldHVybjtcclxuXHRcclxuXHRsZXQgciA9IHJlYWRfY29tcHJlc3NlZF9wYXlsb2FkKENPTVBSRVNTRUQkMSk7XHJcblx0Y29uc3QgcmVhZF9zb3J0ZWRfYXJyYXkgPSAoKSA9PiByZWFkX3NvcnRlZChyKTtcclxuXHRjb25zdCByZWFkX3NvcnRlZF9zZXQgPSAoKSA9PiBuZXcgU2V0KHJlYWRfc29ydGVkX2FycmF5KCkpO1xyXG5cdGNvbnN0IHNldF9hZGRfbWFueSA9IChzZXQsIHYpID0+IHYuZm9yRWFjaCh4ID0+IHNldC5hZGQoeCkpO1xyXG5cclxuXHRNQVBQRUQgPSBuZXcgTWFwKHJlYWRfbWFwcGVkKHIpKTsgXHJcblx0SUdOT1JFRCA9IHJlYWRfc29ydGVkX3NldCgpOyAvLyBpZ25vcmVkIGNoYXJhY3RlcnMgYXJlIG5vdCB2YWxpZCwgc28ganVzdCByZWFkIHJhdyBjb2RlcG9pbnRzXHJcblxyXG5cdC8qXHJcblx0Ly8gZGlyZWN0IGluY2x1ZGUgZnJvbSBwYXlsb2FkIGlzIHNtYWxsZXIgdGhhbiB0aGUgZGVjb21wcmVzc2lvbiBjb2RlXHJcblx0Y29uc3QgRkVOQ0VEID0gbmV3IE1hcChyZWFkX2FycmF5X3doaWxlKCgpID0+IHtcclxuXHRcdGxldCBjcCA9IHIoKTtcclxuXHRcdGlmIChjcCkgcmV0dXJuIFtjcCwgcmVhZF9zdHIocigpKV07XHJcblx0fSkpO1xyXG5cdCovXHJcblx0Ly8gMjAyMzAyMTc6IHdlIHN0aWxsIG5lZWQgYWxsIENNIGZvciBwcm9wZXIgZXJyb3IgZm9ybWF0dGluZ1xyXG5cdC8vIGJ1dCBub3JtIG9ubHkgbmVlZHMgTlNNIHN1YnNldCB0aGF0IGFyZSBwb3RlbnRpYWxseS12YWxpZFxyXG5cdENNID0gcmVhZF9zb3J0ZWRfYXJyYXkoKTtcclxuXHROU00gPSBuZXcgU2V0KHJlYWRfc29ydGVkX2FycmF5KCkubWFwKGkgPT4gQ01baV0pKTtcclxuXHRDTSA9IG5ldyBTZXQoQ00pO1xyXG5cdFxyXG5cdEVTQ0FQRSA9IHJlYWRfc29ydGVkX3NldCgpOyAvLyBjaGFyYWN0ZXJzIHRoYXQgc2hvdWxkIG5vdCBiZSBwcmludGVkXHJcblx0TkZDX0NIRUNLID0gcmVhZF9zb3J0ZWRfc2V0KCk7IC8vIG9ubHkgbmVlZGVkIHRvIGlsbHVzdHJhdGUgZW5zX3Rva2VuaXplKCkgdHJhbnNmb3JtYXRpb25zXHJcblxyXG5cdGxldCBjaHVua3MgPSByZWFkX3NvcnRlZF9hcnJheXMocik7XHJcblx0bGV0IHVucmVzdHJpY3RlZCA9IHIoKTtcclxuXHQvL2NvbnN0IHJlYWRfY2h1bmtlZCA9ICgpID0+IG5ldyBTZXQocmVhZF9zb3J0ZWRfYXJyYXkoKS5mbGF0TWFwKGkgPT4gY2h1bmtzW2ldKS5jb25jYXQocmVhZF9zb3J0ZWRfYXJyYXkoKSkpO1xyXG5cdGNvbnN0IHJlYWRfY2h1bmtlZCA9ICgpID0+IHtcclxuXHRcdC8vIDIwMjMwOTIxOiBidWlsZCBzZXQgaW4gcGFydHMsIDJ4IGZhc3RlclxyXG5cdFx0bGV0IHNldCA9IG5ldyBTZXQoKTtcclxuXHRcdHJlYWRfc29ydGVkX2FycmF5KCkuZm9yRWFjaChpID0+IHNldF9hZGRfbWFueShzZXQsIGNodW5rc1tpXSkpO1xyXG5cdFx0c2V0X2FkZF9tYW55KHNldCwgcmVhZF9zb3J0ZWRfYXJyYXkoKSk7XHJcblx0XHRyZXR1cm4gc2V0OyBcclxuXHR9O1xyXG5cdEdST1VQUyA9IHJlYWRfYXJyYXlfd2hpbGUoaSA9PiB7XHJcblx0XHQvLyBtaW5pZmllciBwcm9wZXJ0eSBtYW5nbGluZyBzZWVtcyB1bnNhZmVcclxuXHRcdC8vIHNvIHRoZXNlIGFyZSBtYW51YWxseSByZW5hbWVkIHRvIHNpbmdsZSBjaGFyc1xyXG5cdFx0bGV0IE4gPSByZWFkX2FycmF5X3doaWxlKHIpLm1hcCh4ID0+IHgrMHg2MCk7XHJcblx0XHRpZiAoTi5sZW5ndGgpIHtcclxuXHRcdFx0bGV0IFIgPSBpID49IHVucmVzdHJpY3RlZDsgLy8gdW5yZXN0cmljdGVkIHRoZW4gcmVzdHJpY3RlZFxyXG5cdFx0XHROWzBdIC09IDMyOyAvLyBjYXBpdGFsaXplXHJcblx0XHRcdE4gPSBzdHJfZnJvbV9jcHMoTik7XHJcblx0XHRcdGlmIChSKSBOPWBSZXN0cmljdGVkWyR7Tn1dYDtcclxuXHRcdFx0bGV0IFAgPSByZWFkX2NodW5rZWQoKTsgLy8gcHJpbWFyeVxyXG5cdFx0XHRsZXQgUSA9IHJlYWRfY2h1bmtlZCgpOyAvLyBzZWNvbmRhcnlcclxuXHRcdFx0bGV0IE0gPSAhcigpOyAvLyBub3Qtd2hpdGVsaXN0ZWQsIGNoZWNrIGZvciBOU01cclxuXHRcdFx0Ly8gKioqIHRoaXMgY29kZSBjdXJyZW50bHkgaXNuJ3QgbmVlZGVkICoqKlxyXG5cdFx0XHQvKlxyXG5cdFx0XHRsZXQgViA9IFsuLi5QLCAuLi5RXS5zb3J0KChhLCBiKSA9PiBhLWIpOyAvLyBkZXJpdmU6IHNvcnRlZCB2YWxpZFxyXG5cdFx0XHRsZXQgTSA9IHIoKS0xOyAvLyBudW1iZXIgb2YgY29tYmluaW5nIG1hcmtcclxuXHRcdFx0aWYgKE0gPCAwKSB7IC8vIHdoaXRlbGlzdGVkXHJcblx0XHRcdFx0TSA9IG5ldyBNYXAocmVhZF9hcnJheV93aGlsZSgoKSA9PiB7XHJcblx0XHRcdFx0XHRsZXQgaSA9IHIoKTtcclxuXHRcdFx0XHRcdGlmIChpKSByZXR1cm4gW1ZbaS0xXSwgcmVhZF9hcnJheV93aGlsZSgoKSA9PiB7XHJcblx0XHRcdFx0XHRcdGxldCB2ID0gcmVhZF9hcnJheV93aGlsZShyKTtcclxuXHRcdFx0XHRcdFx0aWYgKHYubGVuZ3RoKSByZXR1cm4gdi5tYXAoeCA9PiB4LTEpO1xyXG5cdFx0XHRcdFx0fSldO1xyXG5cdFx0XHRcdH0pKTtcclxuXHRcdFx0fSovXHJcblx0XHRcdHJldHVybi
26774B7TiwgUCwgUSwgTSwgUn07XHJcblx0XHR9XHJcblx0fSk7XHJcblxyXG5cdC8vIGRlY29kZSBjb21wcmVzc2VkIHdob2xlc1xyXG5cdFdIT0xFX1ZBTElEID0gcmVhZF9zb3J0ZWRfc2V0KCk7XHJcblx0V0hPTEVfTUFQID0gbmV3IE1hcCgpO1xyXG5cdGxldCB3aG9sZXMgPSByZWFkX3NvcnRlZF9hcnJheSgpLmNvbmNhdChBcnJheV9mcm9tKFdIT0xFX1ZBTElEKSkuc29ydCgoYSwgYikgPT4gYS1iKTsgLy8gbXVzdCBiZSBzb3J0ZWRcclxuXHR3aG9sZXMuZm9yRWFjaCgoY3AsIGkpID0+IHtcclxuXHRcdGxldCBkID0gcigpOyBcclxuXHRcdGxldCB3ID0gd2hvbGVzW2ldID0gZCA/IHdob2xlc1tpLWRdIDoge1Y6IFtdLCBNOiBuZXcgTWFwKCl9O1xyXG5cdFx0dy5WLnB1c2goY3ApOyAvLyBhZGQgdG8gbWVtYmVyIHNldFxyXG5cdFx0aWYgKCFXSE9MRV9WQUxJRC5oYXMoY3ApKSB7XHJcblx0XHRcdFdIT0xFX01BUC5zZXQoY3AsIHcpOyAgLy8gcmVnaXN0ZXIgd2l0aCB3aG9sZSBtYXBcclxuXHRcdH1cclxuXHR9KTtcclxuXHJcblx0Ly8gY29tcHV0ZSBjb25mdXNhYmxlLWV4dGVudCBjb21wbGVtZW50c1xyXG5cdC8vIHVzYWdlOiBXSE9MRV9NQVAuZ2V0KGNwKS5NLmdldChjcCkgPSBjb21wbGVtZW50IHNldFxyXG5cdGZvciAobGV0IHtWLCBNfSBvZiBuZXcgU2V0KFdIT0xFX01BUC52YWx1ZXMoKSkpIHtcclxuXHRcdC8vIGNvbm5lY3QgYWxsIGdyb3VwcyB0aGF0IGhhdmUgZWFjaCB3aG9sZSBjaGFyYWN0ZXJcclxuXHRcdGxldCByZWNzID0gW107XHJcblx0XHRmb3IgKGxldCBjcCBvZiBWKSB7XHJcblx0XHRcdGxldCBncyA9IEdST1VQUy5maWx0ZXIoZyA9PiBncm91cF9oYXNfY3AoZywgY3ApKTtcclxuXHRcdFx0bGV0IHJlYyA9IHJlY3MuZmluZCgoe0d9KSA9PiBncy5zb21lKGcgPT4gRy5oYXMoZykpKTtcclxuXHRcdFx0aWYgKCFyZWMpIHtcclxuXHRcdFx0XHRyZWMgPSB7RzogbmV3IFNldCgpLCBWOiBbXX07XHJcblx0XHRcdFx0cmVjcy5wdXNoKHJlYyk7XHJcblx0XHRcdH1cclxuXHRcdFx0cmVjLlYucHVzaChjcCk7XHJcblx0XHRcdHNldF9hZGRfbWFueShyZWMuRywgZ3MpO1xyXG5cdFx0fVxyXG5cdFx0Ly8gcGVyIGNoYXJhY3RlciBjYWNoZSBncm91cHMgd2hpY2ggYXJlIG5vdCBhIG1lbWJlciBvZiB0aGUgZXh0ZW50XHJcblx0XHRsZXQgdW5pb24gPSByZWNzLmZsYXRNYXAoeCA9PiBBcnJheV9mcm9tKHguRykpOyAvLyBhbGwgb2YgdGhlIGdyb3VwcyB1c2VkIGJ5IHRoaXMgd2hvbGVcclxuXHRcdGZvciAobGV0IHtHLCBWfSBvZiByZWNzKSB7XHJcblx0XHRcdGxldCBjb21wbGVtZW50ID0gbmV3IFNldCh1bmlvbi5maWx0ZXIoZyA9PiAhRy5oYXMoZykpKTsgLy8gZ3JvdXBzIG5vdCBjb3ZlcmVkIGJ5IHRoZSBleHRlbnRcclxuXHRcdFx0Zm9yIChsZXQgY3Agb2YgVikge1xyXG5cdFx0XHRcdE0uc2V0KGNwLCBjb21wbGVtZW50KTsgLy8gdGhpcyBpcyB0aGUgc2FtZSByZWZlcmVuY2VcclxuXHRcdFx0fVxyXG5cdFx0fVxyXG5cdH1cclxuXHJcblx0Ly8gY29tcHV0ZSB2YWxpZCBzZXRcclxuXHQvLyAyMDIzMDkyNDogVkFMSUQgd2FzIHVuaW9uIGJ1dCBjYW4gYmUgcmUtdXNlZFxyXG5cdFZBTElEID0gbmV3IFNldCgpOyAvLyBleGlzdHMgaW4gMSsgZ3JvdXBzXHJcblx0bGV0IG11bHRpID0gbmV3IFNldCgpOyAvLyBleGlzdHMgaW4gMisgZ3JvdXBzXHJcblx0Y29uc3QgYWRkX3RvX3VuaW9uID0gY3AgPT4gVkFMSUQuaGFzKGNwKSA/IG11bHRpLmFkZChjcCkgOiBWQUxJRC5hZGQoY3ApO1xyXG5cdGZvciAobGV0IGcgb2YgR1JPVVBTKSB7XHJcblx0XHRmb3IgKGxldCBjcCBvZiBnLlApIGFkZF90b191bmlvbihjcCk7XHJcblx0XHRmb3IgKGxldCBjcCBvZiBnLlEpIGFkZF90b191bmlvbihjcCk7XHJcblx0fVxyXG5cdC8vIGR1YWwgcHVycG9zZSBXSE9MRV9NQVA6IHJldHVybiBwbGFjZWhvbGRlciBpZiB1bmlxdWUgbm9uLWNvbmZ1c2FibGVcclxuXHRmb3IgKGxldCBjcCBvZiBWQUxJRCkge1xyXG5cdFx0aWYgKCFXSE9MRV9NQVAuaGFzKGNwKSAmJiAhbXVsdGkuaGFzKGNwKSkge1xyXG5cdFx0XHRXSE9MRV9NQVAuc2V0KGNwLCBVTklRVUVfUEgpO1xyXG5cdFx0fVxyXG5cdH1cclxuXHQvLyBhZGQgYWxsIGRlY29tcG9zZWQgcGFydHNcclxuXHQvLyBzZWUgZGVyaXZlOiBcIlZhbGlkIGlzIENsb3NlZCAodmlhIEJydXRlLWZvcmNlKVwiXHJcblx0c2V0X2FkZF9tYW55KFZBTElELCBuZmQoVkFMSUQpKTtcclxuXHRcclxuXHQvLyBkZWNvZGUgZW1vamlcclxuXHQvLyAyMDIzMDcxOTogZW1vamkgYXJlIG5vdyBmdWxseS1leHBhbmRlZCB0byBhdm9pZCBxdWlyayBsb2dpYyBcclxuXHRFTU9KSV9MSVNUID0gcmVhZF90cmllKHIpLm1hcCh2ID0+IEVtb2ppLmZyb20odikpLnNvcnQoY29tcGFyZV9hcnJheXMpO1xyXG5cdEVNT0pJX1JPT1QgPSBuZXcgTWFwKCk7IC8vIHRoaXMgaGFzIGFwcHJveCA3SyBub2RlcyAoMisgcGVyIGVtb2ppKVxyXG5cdGZvciAobGV0IGNwcyBvZiBFTU9KSV9MSVNUKSB7XHJcblx0XHQvLyAyMDIzMDcxOTogY2hhbmdlIHRvICpzbGlnaHRseSogc3RyaWN0ZXIgYWxnb3JpdGhtIHdoaWNoIGRpc2FsbG93cyBcclxuXHRcdC8vIGluc2VydGlvbiBvZiBtaXNwbGFjZWQgRkUwRiBpbiBlbW9qaSBzZXF1ZW5jZXMgKG1hdGNoaW5nIEVOU0lQLTE1KVxyXG5cdFx0Ly8gZXhhbXBsZTogYmVhdXRpZmllZCBbQSBCXSAoZWcuIGZsYWcgZW1vamkpIFxyXG5cdFx0Ly8gIGJlZm9yZTogYWxsb3c6IFtBIEZFMEYgQl0sIGVycm9yOiBbQSBGRTBGIEZFMEYgQl0gXHJcblx0XHQvLyAgIGFmdGVyOiBlcnJvcjogYm90aFxyXG5cdFx0Ly8gbm90ZTogdGhpcyBjb2RlIG5vdyBtYXRjaGVzIEVOU05vcm1hbGl6ZS57Y3MsamF2YX0gbG9naWNcclxuXHRcdGxldCBwcmV2ID0gW0VNT0pJX1JPT1RdO1xyXG5cdFx0Zm9yIChsZXQgY3Agb2YgY3BzKSB7XHJcblx0XHRcdGxldCBuZXh0ID0gcHJldi5tYXAobm9kZSA9PiB7XHJcblx0XHRcdFx0bGV0IGNoaWxkID0gbm9kZS5nZXQoY3ApO1xyXG5cdFx0XHRcdGlmICghY2hpbGQpIHtcclxuXHRcdFx0XHRcdC8vIHNob3VsZCB0aGlzIGJlIG9iamVjdD8gXHJcblx0XHRcdFx0XHQvLyAobW9zdCBoYXZlIDEtMiBpdGVtcywgZmV3IGhhdmUgbWFueSlcclxuXHRcdFx0XHRcdC8vIDIwMjMwNzE5OiBubywgdjggZGVmYXVsdCBtYXAgaXMgND9cclxuXHRcdFx0XHRcdGNoaWxkID0gbmV3IE1hcCgpO1xyXG5cdFx0XHRcdFx0bm9kZS5zZXQoY3AsIGNoaWxkKTtcclxuXHRcdFx0XHR9XHJcblx0XHRcdFx0cmV0dXJuIGNoaWxkO1xyXG5cdFx0XHR9KTtcclxuXHRcdFx0aWYgKGNwID09PSBGRTBGKSB7XHJcblx0XHRcdFx0cHJldi5wdXNoKC4uLm5leHQpOyAvLyBsZXNzIHRoYW4gMjAgZWxlbWVudHNcclxuXHRcdFx0fSBlbHNlIHtcclxuXHRcdFx0XHRwcmV2ID0gbmV4dDtcclxuXHRcdFx0fVxyXG5cdFx0fVxyXG5cdFx0Zm9yIChsZXQgeCBvZiBwcmV2KSB7XHJcblx0XHRcdHguViA9IGNwcztcclxuXHRcdH1cclxuXHR9XHJcbn1cclxuXHJcbi8vIGlmIGVzY2FwZWQ6IHtIRVh9XHJcbi8vICAgICAgIGVsc2U6IFwieFwiIHtIRVh9XHJcbmZ1bmN0aW9uIHF1b3RlZF9jcChjcCkge1xyXG5cdHJldHVybiAoc2hvdWxkX2VzY2FwZShjcCkgPyAnJyA6IGAke2JpZGlfcXEoc2FmZV9zdHJfZnJvbV9jcHMoW2NwXSkpfSBgKSArIHF1b3RlX2NwKGNwKTtcclxufVxyXG5cclxuLy8gMjAyMzAyMTE6IHNvbWUgbWVzc2FnZXMgY2FuIGJlIG1peGVkLWRpcmVjdGlvbmFsIGFuZCByZXN1bHQgaW4gc3BpbGxvdmVyXHJcbi8vIHVzZSAyMDBFIGFmdGVyIGEgcXVvdGVkIHN0cmluZyB0byBmb3JjZSB0aGUgcmVtYWluZGVyIG9mIGEgc3RyaW5nIGZyb20gXHJcbi8vIGFjcXVyaW5nIHRoZSBkaXJlY3Rpb24gb2YgdGhlIHF1b3RlXHJcbi8vIGh0dHBzOi8vd3d3LnczLm9yZy9JbnRlcm5hdGlvbmFsL3F1ZXN0aW9ucy9xYS1iaWRpLXVuaWNvZGUtY29udHJvbHMjZXhjZXB0aW9uc1xyXG5mdW5jdGlvbiBiaWRpX3FxKHMpIHtcclxuXHRyZXR1cm4gYFwiJHtzfVwiXFx1MjAwRWA7IC8vIHN0cm9uZyBMVFJcclxufVxyXG5cclxuZnVuY3Rpb24gY2hlY2tfbGFiZWxfZXh0ZW5zaW9uKGNwcykge1xyXG5cdGlmIChjcHMubGVuZ3RoID49IDQgJiYgY3BzWzJdID09IEhZUEhFTiAmJiBjcHNbM10gPT0gSFlQSEVOKSB7XHJcblx0XHR0aHJvdyBuZXcgRXJyb3IoYGludmFsaWQgbGFiZWwgZXh0ZW5zaW9uOiBcIiR7c3RyX2Zyb21fY3BzKGNwcy5zbGljZSgwLCA0KSl9XCJgKTsgLy8gdGhpcyBjYW4gb25seSBiZSBhc2NpaSBzbyBjYW50IGJlIGJpZGlcclxuXHR9XHJcbn1cclxuZnVuY3Rpb24gY2hlY2tfbGVhZGluZ191bmRlcnNjb3JlKGNwcykge1xyXG5cdGNvbnN0IFVOREVSU0NPUkUgPSAweDVGO1xyXG5cdGZvciAobGV0IGkgPSBjcHMubGFzdEluZGV4T2YoVU5ERVJTQ09SRSk7IGkgPiAwOyApIHtcclxuXHRcdGlmIChjcHNbLS1pXSAhPT0gVU5ERVJTQ09SRSkge1xyXG5cdFx0XHR0aHJvdyBuZXcgRXJyb3IoJ3VuZGVyc2NvcmUgYWxsb3dlZCBvbmx5IGF0IHN0YXJ0Jyk7XHJcblx0XHR9XHJcblx0fVxyXG59XHJcbi8vIGNoZWNrIHRoYXQgYSBmZW5jZWQgY3AgaXMgbm90IGxlYWRpbmcsIHRyYWlsaW5nLCBvciB0b3VjaGluZyBhbm90aGVyIGZlbmNlZCBjcFxyXG5mdW5jdGlvbiBjaGVja19mZW5jZWQoY3BzKSB7XHJcblx0bGV0IGNwID0gY3BzWzBdO1xyXG5cdGxldCBwcmV2ID0gRkVOQ0VELmdldChjcCk7XHJcblx0aWYgKHByZXYpIHRocm93IGVycm9yX3BsYWNlbWVudChgbGVhZGluZyAke3ByZXZ9YCk7XHJcblx0bGV0IG4gPSBjcHMubGVuZ3RoO1xyXG5cdGxldCBsYXN0ID0gLTE7IC8vIHByZXZlbn
26774RzIHRyYWlsaW5nIGZyb20gdGhyb3dpbmdcclxuXHRmb3IgKGxldCBpID0gMTsgaSA8IG47IGkrKykge1xyXG5cdFx0Y3AgPSBjcHNbaV07XHJcblx0XHRsZXQgbWF0Y2ggPSBGRU5DRUQuZ2V0KGNwKTtcclxuXHRcdGlmIChtYXRjaCkge1xyXG5cdFx0XHQvLyBzaW5jZSBjcHNbMF0gaXNuJ3QgZmVuY2VkLCBjcHNbMV0gY2Fubm90IHRocm93XHJcblx0XHRcdGlmIChsYXN0ID09IGkpIHRocm93IGVycm9yX3BsYWNlbWVudChgJHtwcmV2fSArICR7bWF0Y2h9YCk7XHJcblx0XHRcdGxhc3QgPSBpICsgMTtcclxuXHRcdFx0cHJldiA9IG1hdGNoO1xyXG5cdFx0fVxyXG5cdH1cclxuXHRpZiAobGFzdCA9PSBuKSB0aHJvdyBlcnJvcl9wbGFjZW1lbnQoYHRyYWlsaW5nICR7cHJldn1gKTtcclxufVxyXG5cclxuLy8gY3JlYXRlIGEgc2FmZSB0byBwcmludCBzdHJpbmcgXHJcbi8vIGludmlzaWJsZXMgYXJlIGVzY2FwZWRcclxuLy8gbGVhZGluZyBjbSB1c2VzIHBsYWNlaG9sZGVyXHJcbi8vIGlmIGNwcyBleGNlZWQgbWF4LCBtaWRkbGUgdHJ1bmNhdGUgd2l0aCBlbGxpcHNpc1xyXG4vLyBxdW90ZXIoY3ApID0+IHN0cmluZywgZWcuIDMwMDAgPT4gXCJ7MzAwMH1cIlxyXG4vLyBub3RlOiBpbiBodG1sLCB5b3UnZCBjYWxsIHRoaXMgZnVuY3Rpb24gdGhlbiByZXBsYWNlIFs8PiZdIHdpdGggZW50aXRpZXNcclxuZnVuY3Rpb24gc2FmZV9zdHJfZnJvbV9jcHMoY3BzLCBtYXggPSBJbmZpbml0eSwgcXVvdGVyID0gcXVvdGVfY3ApIHtcclxuXHQvL2lmIChOdW1iZXIuaXNJbnRlZ2VyKGNwcykpIGNwcyA9IFtjcHNdO1xyXG5cdC8vaWYgKCFBcnJheS5pc0FycmF5KGNwcykpIHRocm93IG5ldyBUeXBlRXJyb3IoYGV4cGVjdGVkIGNvZGVwb2ludHNgKTtcclxuXHRsZXQgYnVmID0gW107XHJcblx0aWYgKGlzX2NvbWJpbmluZ19tYXJrKGNwc1swXSkpIGJ1Zi5wdXNoKCfil4wnKTtcclxuXHRpZiAoY3BzLmxlbmd0aCA+IG1heCkge1xyXG5cdFx0bWF4ID4+PSAxO1xyXG5cdFx0Y3BzID0gWy4uLmNwcy5zbGljZSgwLCBtYXgpLCAweDIwMjYsIC4uLmNwcy5zbGljZSgtbWF4KV07XHJcblx0fVxyXG5cdGxldCBwcmV2ID0gMDtcclxuXHRsZXQgbiA9IGNwcy5sZW5ndGg7XHJcblx0Zm9yIChsZXQgaSA9IDA7IGkgPCBuOyBpKyspIHtcclxuXHRcdGxldCBjcCA9IGNwc1tpXTtcclxuXHRcdGlmIChzaG91bGRfZXNjYXBlKGNwKSkge1xyXG5cdFx0XHRidWYucHVzaChzdHJfZnJvbV9jcHMoY3BzLnNsaWNlKHByZXYsIGkpKSk7XHJcblx0XHRcdGJ1Zi5wdXNoKHF1b3RlcihjcCkpO1xyXG5cdFx0XHRwcmV2ID0gaSArIDE7XHJcblx0XHR9XHJcblx0fVxyXG5cdGJ1Zi5wdXNoKHN0cl9mcm9tX2NwcyhjcHMuc2xpY2UocHJldiwgbikpKTtcclxuXHRyZXR1cm4gYnVmLmpvaW4oJycpO1xyXG59XHJcblxyXG4vLyBub3RlOiBzZXQocykgY2Fubm90IGJlIGV4cG9zZWQgYmVjYXVzZSB0aGV5IGNhbiBiZSBtb2RpZmllZFxyXG4vLyBub3RlOiBPYmplY3QuZnJlZXplKCkgZG9lc24ndCB3b3JrXHJcbmZ1bmN0aW9uIGlzX2NvbWJpbmluZ19tYXJrKGNwLCBvbmx5X25zbSkgeyAvLyAyMDI0MDEyNzogYWRkIGV4dHJhIGFyZ3VtZW50XHJcblx0aW5pdCgpO1xyXG5cdHJldHVybiBvbmx5X25zbSA/IE5TTS5oYXMoY3ApIDogQ00uaGFzKGNwKTtcclxufVxyXG5mdW5jdGlvbiBzaG91bGRfZXNjYXBlKGNwKSB7XHJcblx0aW5pdCgpO1xyXG5cdHJldHVybiBFU0NBUEUuaGFzKGNwKTtcclxufVxyXG5cclxuLy8gcmV0dXJuIGFsbCBzdXBwb3J0ZWQgZW1vamkgYXMgZnVsbHktcXVhbGlmaWVkIGVtb2ppIFxyXG4vLyBvcmRlcmVkIGJ5IGxlbmd0aCB0aGVuIGxleGljb2dyYXBoaWMgXHJcbmZ1bmN0aW9uIGVuc19lbW9qaSgpIHtcclxuXHRpbml0KCk7XHJcblx0cmV0dXJuIEVNT0pJX0xJU1QubWFwKHggPT4geC5zbGljZSgpKTsgLy8gZW1vamkgYXJlIGV4cG9zZWQgc28gY29weVxyXG59XHJcblxyXG5mdW5jdGlvbiBlbnNfbm9ybWFsaXplX2ZyYWdtZW50KGZyYWcsIGRlY29tcG9zZSkge1xyXG5cdGluaXQoKTtcclxuXHRsZXQgbmYgPSBkZWNvbXBvc2UgPyBuZmQgOiBuZmM7XHJcblx0cmV0dXJuIGZyYWcuc3BsaXQoU1RPUF9DSCkubWFwKGxhYmVsID0+IHN0cl9mcm9tX2Nwcyh0b2tlbnNfZnJvbV9zdHIoZXhwbG9kZV9jcChsYWJlbCksIG5mLCBmaWx0ZXJfZmUwZikuZmxhdCgpKSkuam9pbihTVE9QX0NIKTtcclxufVxyXG5cclxuZnVuY3Rpb24gZW5zX25vcm1hbGl6ZShuYW1lKSB7XHJcblx0cmV0dXJuIGZsYXR0ZW4oc3BsaXQobmFtZSwgbmZjLCBmaWx0ZXJfZmUwZikpO1xyXG59XHJcblxyXG5mdW5jdGlvbiBlbnNfYmVhdXRpZnkobmFtZSkge1xyXG5cdGxldCBsYWJlbHMgPSBzcGxpdChuYW1lLCBuZmMsIHggPT4geCk7IC8vIGVtb2ppIG5vdCBleHBvc2VkXHJcblx0Zm9yIChsZXQge3R5cGUsIG91dHB1dCwgZXJyb3J9IG9mIGxhYmVscykge1xyXG5cdFx0aWYgKGVycm9yKSBicmVhazsgLy8gZmxhdHRlbiB3aWxsIHRocm93XHJcblxyXG5cdFx0Ly8gcmVwbGFjZSBsZWFkaW5nL3RyYWlsaW5nIGh5cGhlblxyXG5cdFx0Ly8gMjAyMzAxMjE6IGNvbnNpZGVyIGJlYXV0aWZpbmcgYWxsIG9yIGxlYWRpbmcvdHJhaWxpbmcgaHlwaGVuIHRvIHVuaWNvZGUgdmFyaWFudFxyXG5cdFx0Ly8gbm90IGV4YWN0bHkgdGhlIHNhbWUgaW4gZXZlcnkgZm9udCwgYnV0IHZlcnkgc2ltaWxhcjogXCItXCIgdnMgXCLigJBcIlxyXG5cdFx0LypcclxuXHRcdGNvbnN0IFVOSUNPREVfSFlQSEVOID0gMHgyMDEwO1xyXG5cdFx0Ly8gbWF5YmUgdGhpcyBzaG91bGQgcmVwbGFjZSBhbGwgZm9yIHZpc3VhbCBjb25zaXN0YW5jeT9cclxuXHRcdC8vIGBub2RlIHRvb2xzL3JlZy1jb3VudC5qcyByZWdleCBeLVxcezIsXFx9YCA9PiA1OTJcclxuXHRcdC8vZm9yIChsZXQgaSA9IDA7IGkgPCBvdXRwdXQubGVuZ3RoOyBpKyspIGlmIChvdXRwdXRbaV0gPT0gMHgyRCkgb3V0cHV0W2ldID0gMHgyMDEwO1xyXG5cdFx0aWYgKG91dHB1dFswXSA9PSBIWVBIRU4pIG91dHB1dFswXSA9IFVOSUNPREVfSFlQSEVOO1xyXG5cdFx0bGV0IGVuZCA9IG91dHB1dC5sZW5ndGgtMTtcclxuXHRcdGlmIChvdXRwdXRbZW5kXSA9PSBIWVBIRU4pIG91dHB1dFtlbmRdID0gVU5JQ09ERV9IWVBIRU47XHJcblx0XHQqL1xyXG5cdFx0Ly8gMjAyMzAxMjM6IFdIQVRXRyBVUkwgdXNlcyBcIkNoZWNrSHlwaGVuc1wiIGZhbHNlXHJcblx0XHQvLyBodHRwczovL3VybC5zcGVjLndoYXR3Zy5vcmcvI2l
26774kbmFcclxuXHJcblx0XHQvLyB1cGRhdGUgZXRoZXJldW0gc3ltYm9sXHJcblx0XHQvLyDOviA9PiDOniBpZiBub3QgZ3JlZWtcclxuXHRcdGlmICh0eXBlICE9PSAnR3JlZWsnKSBhcnJheV9yZXBsYWNlKG91dHB1dCwgMHgzQkUsIDB4MzlFKTtcclxuXHJcblx0XHQvLyAyMDIyMTIxMzogZml4ZXMgYmlkaSBzdWJkb21haW4gaXNzdWUsIGJ1dCBicmVha3MgaW52YXJpYW50ICgyMDBFIGlzIGRpc2FsbG93ZWQpXHJcblx0XHQvLyBjb3VsZCBiZSBmaXhlZCB3aXRoIHNwZWNpYWwgY2FzZSBmb3I6IDJEICguKSArIDIwMEUgKExUUilcclxuXHRcdC8vIGh0dHBzOi8vZGlzY3Vzcy5lbnMuZG9tYWlucy90L2JpZGktbGFiZWwtb3JkZXJpbmctc3Bvb2YvMTU4MjRcclxuXHRcdC8vb3V0cHV0LnNwbGljZSgwLCAwLCAweDIwMEUpO1xyXG5cdH1cclxuXHRyZXR1cm4gZmxhdHRlbihsYWJlbHMpO1xyXG59XHJcblxyXG5mdW5jdGlvbiBlbnNfc3BsaXQobmFtZSwgcHJlc2VydmVfZW1vamkpIHtcclxuXHRyZXR1cm4gc3BsaXQobmFtZSwgbmZjLCBwcmVzZXJ2ZV9lbW9qaSA/IHggPT4geC5zbGljZSgpIDogZmlsdGVyX2ZlMGYpOyAvLyBlbW9qaSBhcmUgZXhwb3NlZCBzbyBjb3B5XHJcbn1cclxuXHJcbmZ1bmN0aW9uIHNwbGl0KG5hbWUsIG5mLCBlZikge1xyXG5cdGlmICghbmFtZSkgcmV0dXJuIFtdOyAvLyAyMDIzMDcxOTogZW1wdHkgbmFtZSBhbGxvd2FuY2VcclxuXHRpbml0KCk7XHJcblx0bGV0IG9mZnNldCA9IDA7XHJcblx0Ly8gaHR0cHM6Ly91bmljb2RlLm9yZy9yZXBvcnRzL3RyNDYvI1ZhbGlkaXR5X0NyaXRlcmlhXHJcblx0Ly8gNC4pIFwiVGhlIGxhYmVsIG11c3Qgbm90IGNvbnRhaW4gYSBVKzAwMkUgKCAuICkgRlVMTCBTVE9QLlwiXHJcblx0cmV0dXJuIG5hbWUuc3BsaXQoU1RPUF9DSCkubWFwKGxhYmVsID0+IHtcclxuXHRcdGxldCBpbnB1dCA9IGV4cGxvZGVfY3AobGFiZWwpO1xyXG5cdFx0bGV0IGluZm8gPSB7XHJcblx0XHRcdGlucHV0LFxyXG5cdFx0XHRvZmZzZXQsIC8vIGNvZGVwb2ludCwgbm90IHN1YnN0cmluZyFcclxuXHRcdH07XHJcblx0XHRvZmZzZXQgKz0gaW5wdXQubGVuZ3RoICsgMTsgLy8gKyBzdG9wXHJcblx0XHR0cnkge1xyXG5cdFx0XHQvLyAxLikgXCJUaGUgbGFiZWwgbXVzdCBiZSBpbiBVbmljb2RlIE5vcm1hbGl6YXRpb24gRm9ybSBORkNcIlxyXG5cdFx0XHRsZXQgdG9rZW5zID0gaW5mby50b2tlbnMgPSB0b2tlbnNfZnJvbV9zdHIoaW5wdXQsIG5mLCBlZik7XHJcblx0XHRcdGxldCB0b2tlbl9jb3VudCA9IHRva2Vucy5sZW5ndGg7XHJcblx0XHRcdGxldCB0eXBlO1xyXG5cdFx0XHRpZiAoIXRva2VuX2NvdW50KSB7IC8vIHRoZSBsYWJlbCB3YXMgZWZmZWN0aXZlbHkgZW1wdHkgKGNvdWxkIG9mIGhhZCBpZ25vcmVkIGNoYXJhY3RlcnMpXHJcblx0XHRcdFx0Ly9ub3JtID0gW107XHJcblx0XHRcdFx0Ly90eXBlID0gJ05vbmUnOyAvLyB1c2UgdGhpcyBpbnN0ZWFkIG9mIG5leHQgbWF0Y2gsIFwiQVNDSUlcIlxyXG5cdFx0XHRcdC8vIDIwMjMwMTIwOiBjaGFuZ2UgdG8gc3RyaWN0XHJcblx0XHRcdFx0Ly8gaHR0cHM6Ly9kaXNjdXNzLmVucy5kb21haW5zL3QvZW5zLW5hbWUtbm9ybWFsaXphdGlvbi0ybmQvMTQ1NjQvNTlcclxuXHRcdFx0XHR0aHJvdyBuZXcgRXJyb3IoYGVtcHR5IGxhYmVsYCk7XHJcblx0XHRcdH0gXHJcblx0XHRcdGxldCBub3JtID0gaW5mby5vdXRwdXQgPSB0b2tlbnMuZmxhdCgpO1xyXG5cdFx0XHRjaGVja19sZWFkaW5nX3VuZGVyc2NvcmUobm9ybSk7XHJcblx0XHRcdGxldCBlbW9qaSA9IGluZm8uZW1vamkgPSB0b2tlbl9jb3VudCA+IDEgfHwgdG9rZW5zWzBdLmlzX2Vtb2ppOyAvLyBzYW1lIGFzOiB0b2tlbnMuc29tZSh4ID0+IHguaXNfZW1vamkpO1xyXG5cdFx0XHRpZiAoIWVtb2ppICYmIG5vcm0uZXZlcnkoY3AgPT4gY3AgPCAweDgwKSkgeyAvLyBzcGVjaWFsIGNhc2UgZm9yIGFzY2lpXHJcblx0XHRcdFx0Ly8gMjAyMzAxMjM6IG1hdGNoZXMgbWF0Y2hlcyBXSEFUV0csIHNlZSBub3RlIDMuM1xyXG5cdFx0XHRcdGNoZWNrX2xhYmVsX2V4dGVuc2lvbihub3JtKTsgLy8gb25seSBuZWVkZWQgZm9yIGFzY2lpXHJcblx0XHRcdFx0Ly8gY2FudCBoYXZlIGZlbmNlZFxyXG5cdFx0XHRcdC8vIGNhbnQgaGF2ZSBjbVxyXG5cdFx0XHRcdC8vIGNhbnQgaGF2ZSB3aG9sZXNcclxuXHRcdFx0XHQvLyBzZWUgZGVyaXZlOiBcIkZhc3RwYXRoIEFTQ0lJXCJcclxuXHRcdFx0XHR0eXBlID0gJ0FTQ0lJJztcclxuXHRcdFx0fSBlbHNlIHtcclxuXHRcdFx0XHRsZXQgY2hhcnMgPSB0b2tlbnMuZmxhdE1hcCh4ID0+IHguaXNfZW1vamkgPyBbXSA6IHgpOyAvLyBhbGwgb2YgdGhlIG5mYyB0b2tlbnMgY29uY2F0IHRvZ2V0aGVyXHJcblx0XHRcdFx0aWYgKCFjaGFycy5sZW5ndGgpIHsgLy8gdGhlcmVzIG5vIHRleHQsIGp1c3QgZW1vamlcclxuXHRcdFx0XHRcdHR5cGUgPSAnRW1vamknO1xyXG5cdFx0XHRcdH0gZWxzZSB7XHJcblx0XHRcdFx0XHQvLyA1LikgXCJUaGUgbGFiZWwgbXVzdCBub3QgYmVnaW4gd2l0aCBhIGNvbWJpbmluZyBtYXJrLCB0aGF0IGlzOiBHZW5lcmFsX0NhdGVnb3J5PU1hcmsuXCJcclxuXHRcdFx0XHRcdGlmIChDTS5oYXMobm9ybVswXSkpIHRocm93IGVycm9yX3BsYWNlbWVudCgnbGVhZGluZyBjb21iaW5pbmcgbWFyaycpO1xyXG5cdFx0XHRcdFx0Zm9yIChsZXQgaSA9IDE7IGkgPCB0b2tlbl9jb3VudDsgaSsrKSB7IC8vIHdlJ3ZlIGFscmVhZHkgY2hlY2tlZCB0aGUgZmlyc3QgdG9rZW5cclxuXHRcdFx0XHRcdFx0bGV0IGNwcyA9IHRva2Vuc1tpXTtcclxuXHRcdFx0XHRcdFx0aWYgKCFjcHMuaXNfZW1vamkgJiYgQ00uaGFzKGNwc1swXSkpIHsgLy8gZXZlcnkgdGV4dCB0b2tlbiBoYXMgZW1vamkgbmVpZ2hib3JzLCBlZy4gRXRFRUV0RXQuLi5cclxuXHRcdFx0XHRcdFx0XHQvLyBiaWRpX3FxKCkgbm90IG5lZWRlZCBzaW5jZSBlbW9qaSBpcyBMVFIgYW5kIGNwcyBpcyBhIENNXHJcblx0XHRcdFx0XHRcdFx0dGhyb3cgZXJyb3JfcGxhY2VtZW50KGBlbW9qaSArIGNvbWJpbmluZyBtYXJrOiBcIiR7c3RyX2Zyb21fY3BzKHRva2Vuc1tpLTFdKX0gKyAke3NhZmVfc3RyX2Zyb21fY3BzKFtjcHNbMF1dKX1cImApOyBcclxuXHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0Y2hlY2tfZmVuY2VkKG5vcm0pO1xyXG5cdFx0XHRcdFx0bGV0IHVuaXF1ZSA9IEFycmF5X2Zyb20obmV3IFNldChjaGFycykpO1xyXG5cdFx0XHRcdFx0bGV0IFtnXSA9IGRldGVybWluZV9ncm91cCh1bmlxdWUpOyAvLyB0YWtlIHRoZSBmaXJzdCBtYXRjaFxyXG5cdFx0XHRcdFx0Ly8gc2VlIGRlcml2ZTogXCJNYXRjaGluZyBHcm91cHMgaGF2ZSBTYW1lIENNIFN0eWxlXCJcclxuXHRcdFx0XHRcdC8vIGFsdGVybmF0aXZlOiBjb3VsZCBmb3JtIGEgaHlicmlkIHR5cGU6IExhdGluL0phcGFuZXNlLy4uLlx0XHJcblx0XHRcdFx0XHRjaGVja19ncm91cChnLCBjaGFycyk7IC8vIG5lZWQgdGV4dCBpbiBvcmRlclxyXG5cdFx0XHRcdFx0Y2hlY2tfd2hvbGUoZywgdW5pcXVlKTsgLy8gb25seSBuZWVkIHVuaXF1ZSB0ZXh0IChvcmRlciB3b3VsZCBiZSByZXF1aXJlZCBmb3IgbXVsdGlwbGUtY2hhciBjb25mdXNhYmxlcylcclxuXHRcdFx0XHRcdHR5cGUgPSBnLk47XHJcblx0XHRcdFx0XHQvLyAyMDIzMDEyMTogY29uc2lkZXIgZXhwb3NpbmcgcmVzdHJpY3RlZCBmbGFnXHJcblx0XHRcdFx0XHQvLyBpdCdzIHNpbXBsZXIgdG8ganVzdCBjaGVjayBmb3IgJ1Jlc3RyaWN0ZWQnXHJcblx0XHRcdFx0XHQvLyBvciBldmVuIGJldHRlcjogdHlwZS5lbmRzV2l0aCgnXScpXHJcblx0XHRcdFx0XHQvL2lmIChnLlIpIGluZm8ucmVzdHJpY3RlZCA9IHRydWU7XHJcblx0XHRcdFx0fVxyXG5cdFx0XHR9XHJcblx0XHRcdGluZm8udHlwZSA9IHR5cGU7XHJcblx0XHR9IGNhdGNoIChlcnIpIHtcclxuXHRcdFx0aW5mby5lcnJvciA9IGVycjsgLy8gdXNlIGZ1bGwgZXJyb3Igb2JqZWN0XHJcblx0XHR9XHJcblx0XHRyZXR1cm4gaW5mbztcclxuXHR9KTtcclxufVxyXG5cclxuZnVuY3Rpb24gY2hlY2tfd2hvbGUoZ3JvdXAsIHVuaXF1ZSkge1xyXG5cdGxldCBtYWtlcjtcclxuXHRsZXQgc2hhcmVkID0gW107XHJcblx0Zm9yIChsZXQgY3Agb2YgdW5pcXVlKSB7XHJcblx0XHRsZXQgd2hvbGUgPSBXSE9MRV9NQVAuZ2V0KGNwKTtcclxuXHRcdGlmICh3aG9sZSA9PT0gVU5JUVVFX1BIKSByZXR1cm47IC8vIHVuaXF1ZSwgbm9uLWNvbmZ1c2FibGVcclxuXHRcdGlmICh3aG9sZSkge1xyXG5cdFx0XHRsZXQgc2V0ID0gd2hvbGUuTS5nZXQoY3ApOyAvLyBncm91cHMgd2hpY2ggaGF2ZSBhIGNoYXJhY3RlciB0aGF0IGxvb2stbGlrZSB0aGlzIGNoYXJhY3RlclxyXG5cdFx0XHRtYWtlciA9IG1ha2VyID8gbWFrZXIuZmlsdGVyKGcgPT4gc2V0LmhhcyhnKSkgOiBBcnJheV9mcm9tKHNldCk7XHJcblx0XHRcdGlmICghbWFrZXIubGVuZ3RoKSByZXR1cm47IC8vIGNvbmZ1c2FibGUgaW50ZXJzZWN0aW9uIGlzIGVtcHR5XHJcblx0XHR9IGVsc2Uge1xyXG5cdFx0XHRzaGFyZWQucHVzaChjcCk7IFxyXG5cdFx0fVxyXG5cdH1cclxuXHRpZiAobWFrZXIpIHtcclxuXHRcdC8vIHdlIGhhdmUgMSsgY29uZnVzYWJsZVxyXG5cdFx0Ly8gY2hlY2sgaWYgYW55IG9mIHRoZSByZW1haW5pbmcgZ3JvdXBzXHJcblx0XHQvLyBjb250YWluIHRoZSBzaGFyZWQgY2hhcmFjdGVycyB0b29cclxuXHRcdGZvciAobGV0IGcgb2YgbWFrZXIpIHtcclxuXHRcdFx0aWYgKHNoYXJlZC5ldmVyeShjcCA9PiBncm91cF9oYXNfY3AoZywgY3ApKSkge1xyXG5cdFx0XHRcdHRocm93IG5ldyBFcnJvcihgd2hvbGUtc2NyaXB0IGNvbmZ1c2FibGU6ICR7Z3JvdXAuTn0vJHtnLk59YCk7XHJcblx0XHRcdH1cclxuXHRcdH1cclxuXHR9XHJcbn1cclxuXHJcbi8vIGFzc3VtcHRpb246IHVuaXF1ZS5zaXplID4gMFxyXG4vLyByZXR1cm5zIGxpc3Qgb2YgbWF0Y2hpbmcgZ3JvdXBzXHJcbmZ1bmN0aW9uIGRldGVybWluZV9ncm91cCh1bmlxdWUpIHtcclxuXHRsZXQgZ3JvdXBzID0gR1JPVVBTO1xyXG5cdGZvciAobGV0IGNwIG9mIHVuaXF1ZSkge1xyXG5cdFx0Ly8gbm90ZTogd2UgbmVlZCB0byBkb2RnZSBDTSB0aGF0IGFyZSB3aGl0ZWxpc3RlZFxyXG5cdFx0Ly8gYnV0IHRoYXQgY29kZSBpc24ndCBjdXJyZW50bHkgbmVjZXNzYXJ5XHJcblx0XHRsZXQgZ3MgPSBncm91cHMuZmlsdGVyKGcgPT4gZ3JvdXBfaGFzX2NwKGcsIGNwKSk7XHJcblx0XHRpZiAoIWdzLmxlbmd0aCkge1xyXG5cdFx0XHRpZiAoIUdST1VQUy5zb21lKG
26774cgPT4gZ3JvdXBfaGFzX2NwKGcsIGNwKSkpIHsgXHJcblx0XHRcdFx0Ly8gdGhlIGNoYXJhY3RlciB3YXMgY29tcG9zZWQgb2YgdmFsaWQgcGFydHNcclxuXHRcdFx0XHQvLyBidXQgaXQncyBORkMgZm9ybSBpcyBpbnZhbGlkXHJcblx0XHRcdFx0Ly8gMjAyMzA3MTY6IGNoYW5nZSB0byBtb3JlIGV4YWN0IHN0YXRlbWVudCwgc2VlOiBFTlNOb3JtYWxpemUue2NzLGphdmF9XHJcblx0XHRcdFx0Ly8gbm90ZTogdGhpcyBkb2Vzbid0IGhhdmUgdG8gYmUgYSBjb21wb3NpdGlvblxyXG5cdFx0XHRcdC8vIDIwMjMwNzIwOiBjaGFuZ2UgdG8gZnVsbCBjaGVja1xyXG5cdFx0XHRcdHRocm93IGVycm9yX2Rpc2FsbG93ZWQoY3ApOyAvLyB0aGlzIHNob3VsZCBiZSByYXJlXHJcblx0XHRcdH0gZWxzZSB7XHJcblx0XHRcdFx0Ly8gdGhlcmUgaXMgbm8gZ3JvdXAgdGhhdCBjb250YWlucyBhbGwgdGhlc2UgY2hhcmFjdGVyc1xyXG5cdFx0XHRcdC8vIHRocm93IHVzaW5nIHRoZSBoaWdoZXN0IHByaW9yaXR5IGdyb3VwIHRoYXQgbWF0Y2hlZFxyXG5cdFx0XHRcdC8vIGh0dHBzOi8vd3d3LnVuaWNvZGUub3JnL3JlcG9ydHMvdHIzOS8jbWl4ZWRfc2NyaXB0X2NvbmZ1c2FibGVzXHJcblx0XHRcdFx0dGhyb3cgZXJyb3JfZ3JvdXBfbWVtYmVyKGdyb3Vwc1swXSwgY3ApO1xyXG5cdFx0XHR9XHJcblx0XHR9XHJcblx0XHRncm91cHMgPSBncztcclxuXHRcdGlmIChncy5sZW5ndGggPT0gMSkgYnJlYWs7IC8vIHRoZXJlIGlzIG9ubHkgb25lIGdyb3VwIGxlZnRcclxuXHR9XHJcblx0Ly8gdGhlcmUgYXJlIGF0IGxlYXN0IDEgZ3JvdXAocykgd2l0aCBhbGwgb2YgdGhlc2UgY2hhcmFjdGVyc1xyXG5cdHJldHVybiBncm91cHM7XHJcbn1cclxuXHJcbi8vIHRocm93IG9uIGZpcnN0IGVycm9yXHJcbmZ1bmN0aW9uIGZsYXR0ZW4oc3BsaXQpIHtcclxuXHRyZXR1cm4gc3BsaXQubWFwKCh7aW5wdXQsIGVycm9yLCBvdXRwdXR9KSA9PiB7XHJcblx0XHRpZiAoZXJyb3IpIHtcclxuXHRcdFx0Ly8gZG9uJ3QgcHJpbnQgbGFiZWwgYWdhaW4gaWYganVzdCBhIHNpbmdsZSBsYWJlbFxyXG5cdFx0XHRsZXQgbXNnID0gZXJyb3IubWVzc2FnZTtcclxuXHRcdFx0Ly8gYmlkaV9xcSgpIG9ubHkgbmVjZXNzYXJ5IGlmIG1zZyBpcyBkaWdpdHNcclxuXHRcdFx0dGhyb3cgbmV3IEVycm9yKHNwbGl0Lmxlbmd0aCA9PSAxID8gbXNnIDogYEludmFsaWQgbGFiZWwgJHtiaWRpX3FxKHNhZmVfc3RyX2Zyb21fY3BzKGlucHV0LCA2MykpfTogJHttc2d9YCk7IFxyXG5cdFx0fVxyXG5cdFx0cmV0dXJuIHN0cl9mcm9tX2NwcyhvdXRwdXQpO1xyXG5cdH0pLmpvaW4oU1RPUF9DSCk7XHJcbn1cclxuXHJcbmZ1bmN0aW9uIGVycm9yX2Rpc2FsbG93ZWQoY3ApIHtcclxuXHQvLyBUT0RPOiBhZGQgY3AgdG8gZXJyb3I/XHJcblx0cmV0dXJuIG5ldyBFcnJvcihgZGlzYWxsb3dlZCBjaGFyYWN0ZXI6ICR7cXVvdGVkX2NwKGNwKX1gKTsgXHJcbn1cclxuZnVuY3Rpb24gZXJyb3JfZ3JvdXBfbWVtYmVyKGcsIGNwKSB7XHJcblx0bGV0IHF1b3RlZCA9IHF1b3RlZF9jcChjcCk7XHJcblx0bGV0IGdnID0gR1JPVVBTLmZpbmQoZyA9PiBnLlAuaGFzKGNwKSk7IC8vIG9ubHkgY2hlY2sgcHJpbWFyeVxyXG5cdGlmIChnZykge1xyXG5cdFx0cXVvdGVkID0gYCR7Z2cuTn0gJHtxdW90ZWR9YDtcclxuXHR9XHJcblx0cmV0dXJuIG5ldyBFcnJvcihgaWxsZWdhbCBtaXh0dXJlOiAke2cuTn0gKyAke3F1b3RlZH1gKTtcclxufVxyXG5mdW5jdGlvbiBlcnJvcl9wbGFjZW1lbnQod2hlcmUpIHtcclxuXHRyZXR1cm4gbmV3IEVycm9yKGBpbGxlZ2FsIHBsYWNlbWVudDogJHt3aGVyZX1gKTtcclxufVxyXG5cclxuLy8gYXNzdW1wdGlvbjogY3BzLmxlbmd0aCA+IDBcclxuLy8gYXNzdW1wdGlvbjogY3BzWzBdIGlzbid0IGEgQ01cclxuLy8gYXNzdW1wdGlvbjogdGhlIHByZXZpb3VzIGNoYXJhY3RlciBpc24ndCBhbiBlbW9qaVxyXG5mdW5jdGlvbiBjaGVja19ncm91cChnLCBjcHMpIHtcclxuXHRmb3IgKGxldCBjcCBvZiBjcHMpIHtcclxuXHRcdGlmICghZ3JvdXBfaGFzX2NwKGcsIGNwKSkge1xyXG5cdFx0XHQvLyBmb3Igd2hpdGVsaXN0ZWQgc2NyaXB0cywgdGhpcyB3aWxsIHRocm93IGlsbGVnYWwgbWl4dHVyZSBvbiBpbnZhbGlkIGNtLCBlZy4gXCJlezMwMH17MzAwfVwiXHJcblx0XHRcdC8vIGF0IHRoZSBtb21lbnQsIGl0J3MgdW5uZWNlc3NhcnkgdG8gaW50cm9kdWNlIGFuIGV4dHJhIGVycm9yIHR5cGVcclxuXHRcdFx0Ly8gdW50aWwgdGhlcmUgZXhpc3RzIGEgd2hpdGVsaXN0ZWQgbXVsdGktY2hhcmFjdGVyXHJcblx0XHRcdC8vICAgZWcuIGlmIChNIDwgMCAmJiBpc19jb21iaW5pbmdfbWFyayhjcCkpIHsgLi4uIH1cclxuXHRcdFx0Ly8gdGhlcmUgYXJlIDMgY2FzZXM6XHJcblx0XHRcdC8vICAgMS4gaWxsZWdhbCBjbSBmb3Igd3JvbmcgZ3JvdXAgPT4gbWl4dHVyZSBlcnJvclxyXG5cdFx0XHQvLyAgIDIuIGlsbGVnYWwgY20gZm9yIHNhbWUgZ3JvdXAgPT4gY20gZXJyb3JcclxuXHRcdFx0Ly8gICAgICAgcmVxdWlyZXMgc2V0IG9mIHdoaXRlbGlzdCBjbSBwZXIgZ3JvdXA6IFxyXG5cdFx0XHQvLyAgICAgICAgZWcuIG5ldyBTZXQoWy4uLmcuUCwgLi4uZy5RXS5mbGF0TWFwKG5mYykuZmlsdGVyKGNwID0+IENNLmhhcyhjcCkpKVxyXG5cdFx0XHQvLyAgIDMuIHdyb25nIGdyb3VwID0+IG1peHR1cmUgZXJyb3JcclxuXHRcdFx0dGhyb3cgZXJyb3JfZ3JvdXBfbWVtYmVyKGcsIGNwKTtcclxuXHRcdH1cclxuXHR9XHJcblx0Ly9pZiAoTSA+PSAwKSB7IC8vIHdlIGhhdmUgYSBrbm93biBmaXhlZCBjbSBjb3VudFxyXG5cdGlmIChnLk0pIHsgLy8gd2UgbmVlZCB0byBjaGVjayBmb3IgTlNNXHJcblx0XHRsZXQgZGVjb21wb3NlZCA9IG5mZChjcHMpO1xyXG5cdFx0Zm9yIChsZXQgaSA9IDEsIGUgPSBkZWNvbXBvc2VkLmxlbmd0aDsgaSA8IGU7IGkrKykgeyAvLyBzZWU6IGFzc3VtcHRpb25cclxuXHRcdFx0Ly8gMjAyMzAyMTA6IGJ1Z2ZpeDogdXNpbmcgY3BzIGluc3RlYWQgb2YgZGVjb21wb3NlZCBoL3QgQ2FyYm9uMjI1XHJcblx0XHRcdC8qXHJcblx0XHRcdGlmIChDTS5oYXMoZGVjb21wb3NlZFtpXSkpIHtcclxuXHRcdFx0XHRsZXQgaiA9IGkgKyAxO1xyXG5cdFx0XHRcdHdoaWxlIChqIDwgZSAmJiBDTS5oYXMoZGVjb21wb3NlZFtqXSkpIGorKztcclxuXHRcdFx0XHRpZiAoaiAtIGkgPiBNKSB7XHJcblx0XHRcdFx0XHR0aHJvdyBuZXcgRXJyb3IoYHRvbyBtYW55IGNvbWJpbmluZyBtYXJrczogJHtnLk59ICR7YmlkaV9xcS
26774hzdHJfZnJvbV9jcHMoZGVjb21wb3NlZC5zbGljZShpLTEsIGopKSl9ICgke2otaX0vJHtNfSlgKTtcclxuXHRcdFx0XHR9XHJcblx0XHRcdFx0aSA9IGo7XHJcblx0XHRcdH1cclxuXHRcdFx0Ki9cclxuXHRcdFx0Ly8gMjAyMzAyMTc6IHN3aXRjaCB0byBOU00gY291bnRpbmdcclxuXHRcdFx0Ly8gaHR0cHM6Ly93d3cudW5pY29kZS5vcmcvcmVwb3J0cy90cjM5LyNPcHRpb25hbF9EZXRlY3Rpb25cclxuXHRcdFx0aWYgKE5TTS5oYXMoZGVjb21wb3NlZFtpXSkpIHtcclxuXHRcdFx0XHRsZXQgaiA9IGkgKyAxO1xyXG5cdFx0XHRcdGZvciAobGV0IGNwOyBqIDwgZSAmJiBOU00uaGFzKGNwID0gZGVjb21wb3NlZFtqXSk7IGorKykge1xyXG5cdFx0XHRcdFx0Ly8gYS4gRm9yYmlkIHNlcXVlbmNlcyBvZiB0aGUgc2FtZSBub25zcGFjaW5nIG1hcmsuXHJcblx0XHRcdFx0XHRmb3IgKGxldCBrID0gaTsgayA8IGo7IGsrKykgeyAvLyBPKG5eMikgYnV0IG4gPCAxMDBcclxuXHRcdFx0XHRcdFx0aWYgKGRlY29tcG9zZWRba10gPT0gY3ApIHtcclxuXHRcdFx0XHRcdFx0XHR0aHJvdyBuZXcgRXJyb3IoYGR1cGxpY2F0ZSBub24tc3BhY2luZyBtYXJrczogJHtxdW90ZWRfY3AoY3ApfWApO1xyXG5cdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHR9XHJcblx0XHRcdFx0fVxyXG5cdFx0XHRcdC8vIHBhcnNlIHRvIGVuZCBzbyB3ZSBoYXZlIGZ1bGwgbnNtIGNvdW50XHJcblx0XHRcdFx0Ly8gYi4gRm9yYmlkIHNlcXVlbmNlcyBvZiBtb3JlIHRoYW4gNCBub25zcGFjaW5nIG1hcmtzIChnYz1NbiBvciBnYz1NZSkuXHJcblx0XHRcdFx0aWYgKGogLSBpID4gTlNNX01BWCkge1xyXG5cdFx0XHRcdFx0Ly8gbm90ZTogdGhpcyBzbGljZSBzdGFydHMgd2l0aCBhIGJhc2UgY2hhciBvciBzcGFjaW5nLW1hcmsgY21cclxuXHRcdFx0XHRcdHRocm93IG5ldyBFcnJvcihgZXhjZXNzaXZlIG5vbi1zcGFjaW5nIG1hcmtzOiAke2JpZGlfcXEoc2FmZV9zdHJfZnJvbV9jcHMoZGVjb21wb3NlZC5zbGljZShpLTEsIGopKSl9ICgke2otaX0vJHtOU01fTUFYfSlgKTtcclxuXHRcdFx0XHR9XHJcblx0XHRcdFx0aSA9IGo7XHJcblx0XHRcdH1cclxuXHRcdH1cclxuXHR9XHJcblx0Ly8gKioqIHRoaXMgY29kZSBjdXJyZW50bHkgaXNuJ3QgbmVlZGVkICoqKlxyXG5cdC8qXHJcblx0bGV0IGNtX3doaXRlbGlzdCA9IE0gaW5zdGFuY2VvZiBNYXA7XHJcblx0Zm9yIChsZXQgaSA9IDAsIGUgPSBjcHMubGVuZ3RoOyBpIDwgZTsgKSB7XHJcblx0XHRsZXQgY3AgPSBjcHNbaSsrXTtcclxuXHRcdGxldCBzZXFzID0gY21fd2hpdGVsaXN0ICYmIE0uZ2V0KGNwKTtcclxuXHRcdGlmIChzZXFzKSB7IFxyXG5cdFx0XHQvLyBsaXN0IG9mIGNvZGVwb2ludHMgdGhhdCBjYW4gZm9sbG93XHJcblx0XHRcdC8vIGlmIHRoaXMgZXhpc3RzLCB0aGlzIHdpbGwgYWx3YXlzIGJlIDErXHJcblx0XHRcdGxldCBqID0gaTtcclxuXHRcdFx0d2hpbGUgKGogPCBlICYmIENNLmhhcyhjcHNbal0pKSBqKys7XHJcblx0XHRcdGxldCBjbXMgPSBjcHMuc2xpY2UoaSwgaik7XHJcblx0XHRcdGxldCBtYXRjaCA9IHNlcXMuZmluZChzZXEgPT4gIWNvbXBhcmVfYXJyYXlzKHNlcSwgY21zKSk7XHJcblx0XHRcdGlmICghbWF0Y2gpIHRocm93IG5ldyBFcnJvcihgZGlzYWxsb3dlZCBjb21iaW5pbmcgbWFyayBzZXF1ZW5jZTogXCIke3NhZmVfc3RyX2Zyb21fY3BzKFtjcCwgLi4uY21zXSl9XCJgKTtcclxuXHRcdFx0aSA9IGo7XHJcblx0XHR9IGVsc2UgaWYgKCFWLmhhcyhjcCkpIHtcclxuXHRcdFx0Ly8gaHR0cHM6Ly93d3cudW5pY29kZS5vcmcvcmVwb3J0cy90cjM5LyNtaXhlZF9zY3JpcHRfY29uZnVzYWJsZXNcclxuXHRcdFx0bGV0IHF1b3RlZCA9IHF1b3RlZF9jcChjcCk7XHJcblx0XHRcdGZvciAobGV0IGNwIG9mIGNwcykge1xyXG5cdFx0XHRcdGxldCB1ID0gVU5JUVVFLmdldChjcCk7XHJcblx0XHRcdFx0aWYgKHUgJiYgdSAhPT0gZykge1xyXG5cdFx0XHRcdFx0Ly8gaWYgYm90aCBzY3JpcHRzIGFyZSByZXN0cmljdGVkIHRoaXMgZXJyb3IgaXMgY29uZnVzaW5nXHJcblx0XHRcdFx0XHQvLyBiZWNhdXNlIHdlIGRvbid0IGRpZmZlcmVudGlhdGUgUmVzdHJpY3RlZEEgZnJvbSBSZXN0cmljdGVkQiBcclxuXHRcdFx0XHRcdGlmICghdS5SKSBxdW90ZWQgPSBgJHtxdW90ZWR9IGlzICR7dS5OfWA7XHJcblx0XHRcdFx0XHRicmVhaztcclxuXHRcdFx0XHR9XHJcblx0XHRcdH1cclxuXHRcdFx0dGhyb3cgbmV3IEVycm9yKGBkaXNhbGxvd2VkICR7Zy5OfSBjaGFyYWN0ZXI6ICR7cXVvdGVkfWApO1xyXG5cdFx0XHQvL3Rocm93IG5ldyBFcnJvcihgZGlzYWxsb3dlZCBjaGFyYWN0ZXI6ICR7cXVvdGVkfSAoZXhwZWN0ZWQgJHtnLk59KWApO1xyXG5cdFx0XHQvL3Rocm93IG5ldyBFcnJvcihgJHtnLk59IGRvZXMgbm90IGFsbG93OiAke3F1b3RlZH1gKTtcclxuXHRcdH1cclxuXHR9XHJcblx0aWYgKCFjbV93aGl0ZWxpc3QpIHtcclxuXHRcdGxldCBkZWNvbXBvc2VkID0gbmZkKGNwcyk7XHJcblx0XHRmb3IgKGxldCBpID0gMSwgZSA9IGRlY29tcG9zZWQubGVuZ3RoOyBpIDwgZTsgaSsrKSB7IC8vIHdlIGtub3cgaXQgY2FuJ3QgYmUgY20gbGVhZGluZ1xyXG5cdFx0XHRpZiAoQ00uaGFzKGRlY29tcG9zZWRbaV0pKSB7XHJcblx0XHRcdFx0bGV0IGogPSBpICsgMTtcclxuXHRcdFx0XHR3aGlsZSAoaiA8IGUgJiYgQ00uaGFzKGRlY29tcG9zZWRbal0pKSBqKys7XHJcblx0XHRcdFx0aWYgKGogLSBpID4gTSkge1xyXG5cdFx0XHRcdFx0dGhyb3cgbmV3IEVycm9yKGB0b28gbWFueSBjb21iaW5pbmcgbWFya3M6IFwiJHtzdHJfZnJvbV9jcHMoZGVjb21wb3NlZC5zbGljZShpLTEsIGopKX1cIiAoJHtqLWl9LyR7TX0pYCk7XHJcblx0XHRcdFx0fVxyXG5cdFx0XHRcdGkgPSBqO1xyXG5cdFx0XHR9XHJcblx0XHR9XHJcblx0fVxyXG5cdCovXHJcbn1cclxuXHJcbi8vIGdpdmVuIGEgbGlzdCBvZiBjb2RlcG9pbnRzXHJcbi8vIHJldHVybnMgYSBsaXN0IG9mIGxpc3RzLCB3aGVyZSBlbW9qaSBhcmUgYSBmdWxseS1xdWFsaWZpZWQgKGFzIEFycmF5IHN1YmNsYXNzKVxyXG4vLyBlZy4gZXhwbG9kZV9jcChcImFiY/CfkqlkXCIpID0+IFtbNjEsIDYyLCA2M10sIEVtb2ppWzFGNEE5LCBGRTBGXSwgWzY0XV1cclxuLy8gMjAyMzA4MTg6IHJlbmFtZSBmb3IgJ3Byb2Nlc3MnIG5hbWUgY29sbGlzaW9uIGgvdCBKYXZhcm9tZVxyXG4vLyBodHRwczovL2dpdGh1Yi5jb20vYWRyYWZmeS9lbnMtbm9ybWFsaXplLmpzL2lzc3Vlcy8yM1xyXG5mdW5jdGlvbiB0b2tlbnNfZnJvbV9zdHIoaW5wdXQsIG5mLCBlZikge1xyXG5cdGxldCByZXQgPSBbXTtcclxuXHRsZXQgY2hhcnMgPSBbXTtcclxuXHRpbnB1dCA9IGlucHV0LnNsaWNlKCkucmV2ZXJzZSgpOyAvLyBmbGlwIHNvIHdlIGNhbiBwb3BcclxuXHR3aGlsZSAoaW5wdXQubGVuZ3RoKSB7XHJcblx0XHRsZXQgZW1vamkgPSBjb25zdW1lX2Vtb2ppX3JldmVyc2VkKGlucHV0KTtcclxuXHRcdGlmIChlbW9qaSkge1xyXG5cdFx0XHRpZiAoY2hhcnMubGVuZ3RoKSB7XHJcblx0XHRcdFx0cmV0LnB1c2gobmYoY2hhcnMpKTtcclxuXHRcdFx0XHRjaGFycyA9IFtdO1xyXG5cdFx0XHR9XHJcblx0XHRcdHJldC5wdXNoKGVmKGVtb2ppKSk7XHJcblx0XHR9IGVsc2Uge1xyXG5cdFx0XHRsZXQgY3AgPSBpbnB1dC5wb3AoKTtcclxuXHRcdFx0aWYgKFZBTElELmhhcyhjcCkpIHtcclxuXHRcdFx0XHRjaGFycy5wdXNoKGNwKTtcclxuXHRcdFx0fSBlbHNlIHtcclxuXHRcdFx0XHRsZXQgY3BzID0gTUFQUEVELmdldChjcCk7XHJcblx0XHRcdFx0aWYgKGNwcykge1xyXG5cdFx0XHRcdFx0Y2hhcnMucHVzaCguLi5jcHMpOyAvLyBsZXNzIHRoYW4gMTAgZWxlbWVudHNcclxuXHRcdFx0XHR9IGVsc2UgaWYgKCFJR05PUkVELmhhcyhjcCkpIHtcclxuXHRcdFx0XHRcdC8vIDIwMjMwOTEyOiB1bmljb2RlIDE1LjEgY2hhbmdlZCB0aGUgb3JkZXIgb2YgcHJvY2Vzc2luZyBzdWNoIHRoYXRcclxuXHRcdFx0XHRcdC8vIGRpc2FsbG93ZWQgcGFydHMgYXJlIG9ubHkgcmVqZWN0ZWQgYWZ0ZXIgTkZDXHJcblx0XHRcdFx0XHQvLyBodHRwczovL3VuaWNvZGUub3JnL3JlcG9ydHMvdHI0Ni8jVmFsaWRpdHlfQ3JpdGVyaWFcclxuXHRcdFx0XHRcdC8vIHRoaXMgZG9lc24ndCBpbXBhY3Qgbm9ybWFsaXphdGlvbiBhcyBvZiB0b2RheVxyXG5cdFx0XHRcdFx0Ly8gdGVjaG5pY2FsbHksIHRoaXMgZXJyb3IgY2FuIGJlIHJlbW92ZWQgYXMgdGhlIGdyb3VwIGxvZ2ljIHdpbGwgYXBwbHkgc2ltaWxhciBsb2dpY1xyXG5cdFx0XHRcdFx0Ly8gaG93ZXZlciB0aGUgZXJyb3IgdHlwZSBtaWdodCBiZSBsZXNzIGNsZWFyXHJcblx0XHRcdFx0XHR0aHJvdyBlcnJvcl9kaXNhbGxvd2VkKGNwKTtcclxuXHRcdFx0XHR9XHJcblx0XHRcdH1cclxuXHRcdH1cclxuXHR9XHJcblx0aWYgKGNoYXJzLmxlbmd0aCkge1xyXG5cdFx0cmV0LnB1c2gobmYoY2hhcnMpKTtcclxuXHR9XHJcblx0cmV0dXJuIHJldDtcclxufVxyXG5cclxuZnVuY3Rpb24gZmlsdGVyX2ZlMGYoY3BzKSB7XHJcblx0cmV0dXJuIGNwcy5maWx0ZXIoY3AgPT4gY3AgIT0gRkUwRik7XHJcbn1cclxuXHJcbi8vIGdpdmVuIGFycmF5IG9mIGNvZGVwb2ludHNcclxuLy8gcmV0dXJucyB0aGUgbG9uZ2VzdCB2YWxpZCBlbW9qaSBzZXF1ZW5jZSAob3IgdW5kZWZpbmVkIGlmIG5vIG1hdGNoKVxyXG4vLyAqTVVUQVRFUyogdGhlIHN1cHBsaWVkIGFycmF5XHJcbi8vIGRpc2FsbG93cyBpbnRlcmxlYXZlZCBpZ25vcmVkIGNoYXJhY3RlcnNcclxuLy8gZmlsbHMgKG9wdGlvbmFsKSBlYXRlbiBhcnJheSB3aXRoIG1hdGNoZWQgY29kZXBvaW50c1xyXG5mdW5jdGlvbiBjb25zdW1lX2Vtb2ppX3JldmVyc2VkKGNwcywgZWF0ZW4pIHtcclxuXHRsZXQgbm9kZSA9IEVNT0pJX1JPT1Q7XHJcblx0bGV0IGVtb2ppO1xyXG5cdGxldCBwb3MgPSBjcHMubGVuZ3RoO1xyXG5cdHdoaWxlIChwb3MpIHtcclxuXHRcdG5vZGUgPSBub2RlLmdldChjcHNbLS1wb3NdKTtcclxuXHRcdGlmICghbm9kZSkgYnJlYWs7XHJcblx0XHRsZXQge1Z9ID0gbm9kZTtcclxuXHRcdGlmIChWKSB7IC8vIHRoaXMgaXMgYSB2YWxpZCBlbW9qaSAoc28gZmFyKVxyXG5cdFx0XHRlbW9qaSA9IFY7XHJcblx0XHRcdGlmIChlYXRlbikgZWF0ZW4ucHVzaCguLi5jcHMuc2xpY2UocG9zKS5yZXZlcnNlKCkpOyAvLyAob3B0aW9uYWwpIGNvcHkgaW5wdXQsIHVzZWQgZm9yIGVuc190b2tlbml6ZSgpXHJcblx0XHRcdGNwcy5sZW5ndGggPSBwb3M7IC8vIHRydW5jYXRlXHJcblx0XHR9XHJcblx0fVxyXG5cdHJldHVybi
26774BlbW9qaTtcclxufVxyXG5cclxuLy8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXHJcbi8vIHRva2VuaXplciBcclxuXHJcbmNvbnN0IFRZX1ZBTElEID0gJ3ZhbGlkJztcclxuY29uc3QgVFlfTUFQUEVEID0gJ21hcHBlZCc7XHJcbmNvbnN0IFRZX0lHTk9SRUQgPSAnaWdub3JlZCc7XHJcbmNvbnN0IFRZX0RJU0FMTE9XRUQgPSAnZGlzYWxsb3dlZCc7XHJcbmNvbnN0IFRZX0VNT0pJID0gJ2Vtb2ppJztcclxuY29uc3QgVFlfTkZDID0gJ25mYyc7XHJcbmNvbnN0IFRZX1NUT1AgPSAnc3RvcCc7XHJcblxyXG5mdW5jdGlvbiBlbnNfdG9rZW5pemUobmFtZSwge1xyXG5cdG5mID0gdHJ1ZSwgLy8gY29sbGFwc2UgdW5ub3JtYWxpemVkIHJ1bnMgaW50byBhIHNpbmdsZSB0b2tlblxyXG59ID0ge30pIHtcclxuXHRpbml0KCk7XHJcblx0bGV0IGlucHV0ID0gZXhwbG9kZV9jcChuYW1lKS5yZXZlcnNlKCk7XHJcblx0bGV0IGVhdGVuID0gW107XHJcblx0bGV0IHRva2VucyA9IFtdO1xyXG5cdHdoaWxlIChpbnB1dC5sZW5ndGgpIHtcclxuXHRcdGxldCBlbW9qaSA9IGNvbnN1bWVfZW1vamlfcmV2ZXJzZWQoaW5wdXQsIGVhdGVuKTtcclxuXHRcdGlmIChlbW9qaSkge1xyXG5cdFx0XHR0b2tlbnMucHVzaCh7XHJcblx0XHRcdFx0dHlwZTogVFlfRU1PSkksXHJcblx0XHRcdFx0ZW1vamk6IGVtb2ppLnNsaWNlKCksIC8vIGNvcHkgZW1vamlcclxuXHRcdFx0XHRpbnB1dDogZWF0ZW4sXHJcblx0XHRcdFx0Y3BzOiBmaWx0ZXJfZmUwZihlbW9qaSlcclxuXHRcdFx0fSk7XHJcblx0XHRcdGVhdGVuID0gW107IC8vIHJlc2V0IGJ1ZmZlclxyXG5cdFx0fSBlbHNlIHtcclxuXHRcdFx0bGV0IGNwID0gaW5wdXQucG9wKCk7XHJcblx0XHRcdGlmIChjcCA9PSBTVE9QKSB7XHJcblx0XHRcdFx0dG9rZW5zLnB1c2goe3R5cGU6IFRZX1NUT1AsIGNwfSk7XHJcblx0XHRcdH0gZWxzZSBpZiAoVkFMSUQuaGFzKGNwKSkge1xyXG5cdFx0XHRcdHRva2Vucy5wdXNoKHt0eXBlOiBUWV9WQUxJRCwgY3BzOiBbY3BdfSk7XHJcblx0XHRcdH0gZWxzZSBpZiAoSUdOT1JFRC5oYXMoY3ApKSB7XHJcblx0XHRcdFx0dG9rZW5zLnB1c2goe3R5cGU6IFRZX0lHTk9SRUQsIGNwfSk7XHJcblx0XHRcdH0gZWxzZSB7XHJcblx0XHRcdFx0bGV0IGNwcyA9IE1BUFBFRC5nZXQoY3ApO1xyXG5cdFx0XHRcdGlmIChjcHMpIHtcclxuXHRcdFx0XHRcdHRva2Vucy5wdXNoKHt0eXBlOiBUWV9NQVBQRUQsIGNwLCBjcHM6IGNwcy5zbGljZSgpfSk7XHJcblx0XHRcdFx0fSBlbHNlIHtcclxuXHRcdFx0XHRcdHRva2Vucy5wdXNoKHt0eXBlOiBUWV9ESVNBTExPV0VELCBjcH0pO1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0fVxyXG5cdFx0fVxyXG5cdH1cclxuXHRpZiAobmYpIHtcclxuXHRcdGZvciAobGV0IGkgPSAwLCBzdGFydCA9IC0xOyBpIDwgdG9rZW5zLmxlbmd0aDsgaSsrKSB7XHJcblx0XHRcdGxldCB0b2tlbiA9IHRva2Vuc1tpXTtcclxuXHRcdFx0aWYgKGlzX3ZhbGlkX29yX21hcHBlZCh0b2tlbi50eXBlKSkge1xyXG5cdFx0XHRcdGlmIChyZXF1aXJlc19jaGVjayh0b2tlbi5jcHMpKSB7IC8vIG5vcm1hbGl6YXRpb24gbWlnaHQgYmUgbmVlZGVkXHJcblx0XHRcdFx0XHRsZXQgZW5kID0gaSArIDE7XHJcblx0XHRcdFx0XHRmb3IgKGxldCBwb3MgPSBlbmQ7IHBvcyA8IHRva2Vucy5sZW5ndGg7IHBvcysrKSB7IC8vIGZpbmQgYWRqYWNlbnQgdGV4dFxyXG5cdFx0XHRcdFx0XHRsZXQge3R5cGUsIGNwc30gPSB0b2tlbnNbcG9zXTtcclxuXHRcdFx0XHRcdFx0aWYgKGlzX3ZhbGlkX29yX21hcHBlZCh0eXBlKSkge1xyXG5cdFx0XHRcdFx0XHRcdGlmICghcmVxdWlyZXNfY2hlY2soY3BzKSkgYnJlYWs7XHJcblx0XHRcdFx0XHRcdFx0ZW5kID0gcG9zICsgMTtcclxuXHRcdFx0XHRcdFx0fSBlbHNlIGlmICh0eXBlICE9PSBUWV9JR05PUkVEKSB7IC8vIHx8IHR5cGUgIT09IFRZX0RJU0FMTE9XRUQpIHsgXHJcblx0XHRcdFx0XHRcdFx0YnJlYWs7XHJcblx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdGlmIChzdGFydCA8IDApIHN0YXJ0ID0gaTtcclxuXHRcdFx0XHRcdGxldCBzbGljZSA9IHRva2Vucy5zbGljZShzdGFydCwgZW5kKTtcclxuXHRcdFx0XHRcdGxldCBjcHMwID0gc2xpY2UuZmxhdE1hcCh4ID0+IGlzX3ZhbGlkX29yX21hcHBlZCh4LnR5cGUpID8geC5jcHMgOiBbXSk7IC8vIHN0cmlwIGp1bmsgdG9rZW5zXHJcblx0XHRcdFx0XHRsZXQgY3BzID0gbmZjKGNwczApO1xyXG5cdFx0XHRcdFx0aWYgKGNvbXBhcmVfYXJyYXlzKGNwcywgY3BzMCkpIHsgLy8gYnVuZGxlIGludG8gYW4gbmZjIHRva2VuXHJcblx0XHRcdFx0XHRcdHRva2Vucy5zcGxpY2Uoc3RhcnQsIGVuZCAtIHN0YXJ0LCB7XHJcblx0XHRcdFx0XHRcdFx0dHlwZTogVFlfTkZDLCBcclxuXHRcdFx0XHRcdFx0XHRpbnB1dDogY3BzMCwgLy8gdGhlcmUgYXJlIDMgc3RhdGVzOiB0b2tlbnMwID09KHByb2Nlc3MpPT4gaW5wdXQgPT0obmZjKT0+IHRva2Vucy9jcHNcclxuXHRcdFx0XHRcdFx0XHRjcHMsIFxyXG5cdFx0XHRcdFx0XHRcdHRva2VuczA6IGNvbGxhcHNlX3ZhbGlkX3Rva2VucyhzbGljZSksXHJcblx0XHRcdFx0XHRcdFx0dG9rZW5zOiBlbnNfdG9rZW5pemUoc3RyX2Zyb21fY3BzKGNwcyksIHtuZjogZmFsc2V9KVxyXG5cdFx0XHRcdFx0XHR9KTtcclxuXHRcdFx0XHRcdFx0aSA9IHN0YXJ0O1xyXG5cdFx0XHRcdFx0fSBlbHNlIHsgXHJcblx0XHRcdFx0XHRcdGkgPSBlbmQgLSAxOyAvLyBza2lwIHRvIGVuZCBvZiBzbGljZVxyXG5cdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0c3RhcnQgPSAtMTsgLy8gcmVzZXRcclxuXHRcdFx0XHR9IGVsc2Uge1xyXG5cdFx0XHRcdFx0c3RhcnQgPSBpOyAvLyByZW1lbWJlciBsYXN0XHJcblx0XHRcdFx0fVxyXG5cdFx0XHR9IGVsc2UgaWYgKHRva2VuLnR5cGUgIT09IFRZX0lHTk9SRUQpIHsgLy8gMjAyMjEwMjQ6IGlzIHRoaXMgY29ycmVjdD9cclxuXHRcdFx0XHRzdGFydCA9IC0xOyAvLyByZXNldFxyXG5cdFx0XHR9XHJcblx0XHR9XHJcblx0fVxyXG5cdHJldHVybi
26774Bjb2xsYXBzZV92YWxpZF90b2tlbnModG9rZW5zKTtcclxufVxyXG5cclxuZnVuY3Rpb24gaXNfdmFsaWRfb3JfbWFwcGVkKHR5cGUpIHtcclxuXHRyZXR1cm4gdHlwZSA9PSBUWV9WQUxJRCB8fCB0eXBlID09IFRZX01BUFBFRDtcclxufVxyXG5cclxuZnVuY3Rpb24gcmVxdWlyZXNfY2hlY2soY3BzKSB7XHJcblx0cmV0dXJuIGNwcy5zb21lKGNwID0+IE5GQ19DSEVDSy5oYXMoY3ApKTtcclxufVxyXG5cclxuZnVuY3Rpb24gY29sbGFwc2VfdmFsaWRfdG9rZW5zKHRva2Vucykge1xyXG5cdGZvciAobGV0IGkgPSAwOyBpIDwgdG9rZW5zLmxlbmd0aDsgaSsrKSB7XHJcblx0XHRpZiAodG9rZW5zW2ldLnR5cGUgPT0gVFlfVkFMSUQpIHtcclxuXHRcdFx0bGV0IGogPSBpICsgMTtcclxuXHRcdFx0d2hpbGUgKGogPCB0b2tlbnMubGVuZ3RoICYmIHRva2Vuc1tqXS50eXBlID09IFRZX1ZBTElEKSBqKys7XHJcblx0XHRcdHRva2Vucy5zcGxpY2UoaSwgaiAtIGksIHt0eXBlOiBUWV9WQUxJRCwgY3BzOiB0b2tlbnMuc2xpY2UoaSwgaikuZmxhdE1hcCh4ID0+IHguY3BzKX0pO1xyXG5cdFx0fVxyXG5cdH1cclxuXHRyZXR1cm4gdG9rZW5zO1xyXG59XG5cbmV4cG9ydCB7IGVuc19iZWF1dGlmeSwgZW5zX2Vtb2ppLCBlbnNfbm9ybWFsaXplLCBlbnNfbm9ybWFsaXplX2ZyYWdtZW50LCBlbnNfc3BsaXQsIGVuc190b2tlbml6ZSwgaXNfY29tYmluaW5nX21hcmssIG5mYywgbmZkLCBzYWZlX3N0cl9mcm9tX2Nwcywgc2hvdWxkX2VzY2FwZSB9O1xuIiwiaW1wb3J0IHsga2VjY2FrMjU2IH0gZnJvbSBcIi4uL2NyeXB0by9pbmRleC5qc1wiO1xuaW1wb3J0IHsgY29uY2F0LCBoZXhsaWZ5LCBhc3NlcnRBcmd1bWVudCwgdG9VdGY4Qnl0ZXMgfSBmcm9tIFwiLi4vdXRpbHMvaW5kZXguanNcIjtcbmltcG9ydCB7IGVuc19ub3JtYWxpemUgfSBmcm9tIFwiQGFkcmFmZnkvZW5zLW5vcm1hbGl6ZVwiO1xuY29uc3QgWmVyb3MgPSBuZXcgVWludDhBcnJheSgzMik7XG5aZXJvcy5maWxsKDApO1xuZnVuY3Rpb24gY2hlY2tDb21wb25lbnQoY29tcCkge1xuICAgIGFzc2VydEFyZ3VtZW50KGNvbXAubGVuZ3RoICE9PSAwLCBcImludmFsaWQgRU5TIG5hbWU7IGVtcHR5IGNvbXBvbmVudFwiLCBcImNvbXBcIiwgY29tcCk7XG4gICAgcmV0dXJuIGNvbXA7XG59XG5mdW5jdGlvbiBlbnNOYW1lU3BsaXQobmFtZSkge1xuICAgIGNvbnN0IGJ5dGVzID0gdG9VdGY4Qnl0ZXMoZW5zTm9ybWFsaXplKG5hbWUpKTtcbiAgICBjb25zdCBjb21wcyA9IFtdO1xuICAgIGlmIChuYW1lLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICByZXR1cm4gY29tcHM7XG4gICAgfVxuICAgIGxldCBsYXN0ID0gMDtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGJ5dGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGNvbnN0IGQgPSBieXRlc1tpXTtcbiAgICAgICAgLy8gQSBzZXBhcmF0b3IgKGkuZS4gXCIuXCIpOyBjb3B5IHRoaXMgY29tcG9uZW50XG4gICAgICAgIGlmIChkID09PSAweDJlKSB7XG4gICAgICAgICAgICBjb21wcy5wdXNoKGNoZWNrQ29tcG9uZW50KGJ5dGVzLnNsaWNlKGxhc3QsIGkpKSk7XG4gICAgICAgICAgICBsYXN0ID0gaSArIDE7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLy8gVGhlcmUgd2FzIGEgc3RyYXkgc2VwYXJhdG9yIGF0IHRoZSBlbmQgb2YgdGhlIG5hbWVcbiAgICBhc3NlcnRBcmd1bWVudChsYXN0IDwgYnl0ZXMubGVuZ3RoLCBcImludmFsaWQgRU5TIG5hbWU7IGVtcHR5IGNvbXBvbmVudFwiLCBcIm5hbWVcIiwgbmFtZSk7XG4gICAgY29tcHMucHVzaChjaGVja0NvbXBvbmVudChieXRlcy5zbGljZShsYXN0KSkpO1xuICAgIHJldHVybiBjb21wcztcbn1cbi8qKlxuICogIFJldHVybnMgdGhlIEVOUyAlJW5hbWUlJSBub3JtYWxpemVkLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZW5zTm9ybWFsaXplKG5hbWUpIHtcbiAgICB0cnkge1xuICAgICAgICBpZiAobmFtZS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcImVtcHR5IGxhYmVsXCIpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBlbnNfbm9ybWFsaXplKG5hbWUpO1xuICAgIH1cbiAgICBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgYXNzZXJ0QXJndW1lbnQoZmFsc2UsIGBpbnZhbGlkIEVOUyBuYW1lICgke2Vycm9yLm1lc3NhZ2V9KWAsIFwibmFtZVwiLCBuYW1lKTtcbiAgICB9XG59XG4vKipcbiAqICBSZXR1cm5zIGBgdHJ1ZWBgIGlmICUlbmFtZSUlIGlzIGEgdmFsaWQgRU5TIG5hbWUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc1ZhbGlkTmFtZShuYW1lKSB7XG4gICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIChlbnNOYW1lU3BsaXQobmFtZSkubGVuZ3RoICE9PSAwKTtcbiAgICB9XG4gICAgY2F0Y2ggKGVycm9yKSB7IH1cbiAgICByZXR1cm4gZmFsc2U7XG59XG4vKipcbiAqICBSZXR1cm5zIHRoZSBbW2xpbmstbmFtZWhhc2hdXSBmb3IgJSVuYW1lJSUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBuYW1laGFzaChuYW1lKSB7XG4gICAgYXNzZXJ0QXJndW1lbnQodHlwZW9mIChuYW1lKSA9PT0gXCJzdHJpbmdcIiwgXCJpbnZhbGlkIEVOUyBuYW1lOyBub3QgYSBzdHJpbmdcIiwgXCJuYW1lXCIsIG5hbWUpO1xuICAgIGFzc2VydEFyZ3VtZW50KG5hbWUubGVuZ3RoLCBgaW52YWxpZCBFTlMgbmFtZSAoZW1wdHkgbGFiZWwpYCwgXCJuYW1lXCIsIG5hbWUpO1xuICAgIGxldCByZXN1bHQgPSBaZXJvcztcbiAgICBjb25zdCBjb21wcyA9IGVuc05hbWVTcGxpdChuYW1lKTtcbiAgICB3aGlsZSAoY29tcHMubGVuZ3RoKSB7XG4gICAgICAgIHJlc3VsdCA9IGtlY2NhazI1Nihjb25jYXQoW3Jlc3VsdCwga2VjY2FrMjU2KChjb21wcy5wb3AoKSkpXSkpO1xuICAgIH1cbiAgICByZXR1cm4gaGV4bGlmeShyZXN1bHQpO1xufVxuLyoqXG4gKiAgUmV0dXJucyB0aGUgRE5TIGVuY29kZWQgJSVuYW1lJSUuXG4gKlxuICogIFRoaXMgaXMgdXNlZCBmb3IgdmFyaW91cyBwYXJ0cyBvZiBFTlMgbmFtZSByZXNvbHV0aW9uLCBzdWNoXG4gKiAgYXMgdGhlIHdpbGRjYXJkIHJlc29sdXRpb24uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBkbnNFbmNvZGUobmFtZSwgX21heExlbmd0aCkge1xuICAgIGNvbnN0IGxlbmd0aCA9IChfbWF4TGVuZ3RoICE9IG51bGwpID8gX21heExlbmd0aCA6IDYzO1xuICAgIGFzc2VydEFyZ3VtZW50KGxlbmd0aCA8PSAyNTUsIFwiRE5TIGVuY29kZWQgbGFiZWwgY2Fubm90IGV4Y2VlZCAyNTVcIiwgXCJsZW5ndGhcIiwgbGVuZ3RoKTtcbiAgICByZXR1cm4gaGV4bGlmeShjb25jYXQoZW5zTmFtZVNwbGl0KG5hbWUpLm1hcCgoY29tcCkgPT4ge1xuICAgICAgICBhc3NlcnRBcmd1bWVudChjb21wLmxlbmd0aCA8PSBsZW5ndGgsIGBsYWJlbCAke0pTT04uc3RyaW5naWZ5KG5hbWUpfSBleGNlZWRzICR7bGVuZ3RofSBieXRlc2AsIFwibmFtZVwiLCBuYW1lKTtcbiAgICAgICAgY29uc3QgYnl0ZXMgPSBuZXcgVWludDhBcnJheShjb21wLmxlbmd0aCArIDEpO1xuICAgICAgICBieXRlcy5zZXQoY29tcCwgMSk7XG4gICAgICAgIGJ5dGVzWzBdID0gYnl0ZXMubGVuZ3RoIC0gMTtcbiAgICAgICAgcmV0dXJuIGJ5dGVzO1xuICAgIH0pKSkgKyBcIjAwXCI7XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1uYW1laGFzaC5qcy5tYXAiLCJpbXBvcnQgeyBrZWNjYWsyNTYgfSBmcm9tIFwiLi4vY3J5cHRvL2luZGV4LmpzXCI7XG5pbXBvcnQgeyBNZXNzYWdlUHJlZml4IH0gZnJvbSBcIi4uL2NvbnN0YW50cy9pbmRleC5qc1wiO1xuaW1wb3J0IHsgcmVjb3ZlckFkZHJl
26774c3MgfSBmcm9tIFwiLi4vdHJhbnNhY3Rpb24vaW5kZXguanNcIjtcbmltcG9ydCB7IGNvbmNhdCwgdG9VdGY4Qnl0ZXMgfSBmcm9tIFwiLi4vdXRpbHMvaW5kZXguanNcIjtcbi8qKlxuICogIENvbXB1dGVzIHRoZSBbW2xpbmstZWlwLTE5MV1dIHBlcnNvbmFsLXNpZ24gbWVzc2FnZSBkaWdlc3QgdG8gc2lnbi5cbiAqXG4gKiAgVGhpcyBwcmVmaXhlcyB0aGUgbWVzc2FnZSB3aXRoIFtbTWVzc2FnZVByZWZpeF1dIGFuZCB0aGUgZGVjaW1hbCBsZW5ndGhcbiAqICBvZiAlJW1lc3NhZ2UlJSBhbmQgY29tcHV0ZXMgdGhlIFtba2VjY2FrMjU2XV0gZGlnZXN0LlxuICpcbiAqICBJZiAlJW1lc3NhZ2UlJSBpcyBhIHN0cmluZywgaXQgaXMgY29udmVydGVkIHRvIGl0cyBVVEYtOCBieXRlc1xuICogIGZpcnN0LiBUbyBjb21wdXRlIHRoZSBkaWdlc3Qgb2YgYSBbW0RhdGFIZXhTdHJpbmddXSwgaXQgbXVzdCBiZSBjb252ZXJ0ZWRcbiAqICB0byBbYnl0ZXNdKGdldEJ5dGVzKS5cbiAqXG4gKiAgQGV4YW1wbGU6XG4gKiAgICBoYXNoTWVzc2FnZShcIkhlbGxvIFdvcmxkXCIpXG4gKiAgICAvL19yZXN1bHQ6XG4gKlxuICogICAgLy8gSGFzaGVzIHRoZSBTSVggKDYpIHN0cmluZyBjaGFyYWN0ZXJzLCBpLmUuXG4gKiAgICAvLyBbIFwiMFwiLCBcInhcIiwgXCI0XCIsIFwiMlwiLCBcIjRcIiwgXCIzXCIgXVxuICogICAgaGFzaE1lc3NhZ2UoXCIweDQyNDNcIilcbiAqICAgIC8vX3Jlc3VsdDpcbiAqXG4gKiAgICAvLyBIYXNoZXMgdGhlIFRXTyAoMikgYnl0ZXMgWyAweDQyLCAweDQzIF0uLi5cbiAqICAgIGhhc2hNZXNzYWdlKGdldEJ5dGVzKFwiMHg0MjQzXCIpKVxuICogICAgLy9fcmVzdWx0OlxuICpcbiAqICAgIC8vIC4uLndoaWNoIGlzIGVxdWFsIHRvIHVzaW5nIGRhdGFcbiAqICAgIGhhc2hNZXNzYWdlKG5ldyBVaW50OEFycmF5KFsgMHg0MiwgMHg0MyBdKSlcbiAqICAgIC8vX3Jlc3VsdDpcbiAqXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBoYXNoTWVzc2FnZShtZXNzYWdlKSB7XG4gICAgaWYgKHR5cGVvZiAobWVzc2FnZSkgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgbWVzc2FnZSA9IHRvVXRmOEJ5dGVzKG1lc3NhZ2UpO1xuICAgIH1cbiAgICByZXR1cm4ga2VjY2FrMjU2KGNvbmNhdChbXG4gICAgICAgIHRvVXRmOEJ5dGVzKE1lc3NhZ2VQcmVmaXgpLFxuICAgICAgICB0b1V0ZjhCeXRlcyhTdHJpbmcobWVzc2FnZS5sZW5ndGgpKSxcbiAgICAgICAgbWVzc2FnZVxuICAgIF0pKTtcbn1cbi8qKlxuICogIFJldHVybiB0aGUgYWRkcmVzcyBvZiB0aGUgcHJpdmF0ZSBrZXkgdGhhdCBwcm9kdWNlZFxuICogIHRoZSBzaWduYXR1cmUgJSVzaWclJSBkdXJpbmcgc2lnbmluZyBmb3IgJSVtZXNzYWdlJSUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB2ZXJpZnlNZXNzYWdlKG1lc3NhZ2UsIHNpZykge1xuICAgIGNvbnN0IGRpZ2VzdCA9IGhhc2hNZXNzYWdlKG1lc3NhZ2UpO1xuICAgIHJldHVybiByZWNvdmVyQWRkcmVzcyhkaWdlc3QsIHNpZyk7XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1tZXNzYWdlLmpzLm1hcCIsImltcG9ydCB7IGdldEFkZHJlc3MgfSBmcm9tIFwiLi4vYWRkcmVzcy9pbmRleC5qc1wiO1xuaW1wb3J0IHsga2VjY2FrMjU2IGFzIF9rZWNjYWsyNTYsIHNoYTI1NiBhcyBfc2hhMjU2IH0gZnJvbSBcIi4uL2NyeXB0by9pbmRleC5qc1wiO1xuaW1wb3J0IHsgY29uY2F0LCBkYXRhTGVuZ3RoLCBnZXRCeXRlcywgaGV4bGlmeSwgdG9CZUFycmF5LCB0b1R3b3MsIHRvVXRmOEJ5dGVzLCB6ZXJvUGFkQnl0ZXMsIHplcm9QYWRWYWx1ZSwgYXNzZXJ0QXJndW1lbnQgfSBmcm9tIFwiLi4vdXRpbHMvaW5kZXguanNcIjtcbmNvbnN0IHJlZ2V4Qnl0ZXMgPSBuZXcgUmVnRXhwKFwiXmJ5dGVzKFswLTldKykkXCIpO1xuY29uc3QgcmVnZXhOdW1iZXIgPSBuZXcgUmVnRXhwKFwiXih1P2ludCkoWzAtOV0qKSRcIik7XG5jb25zdCByZWdleEFycmF5ID0gbmV3IFJlZ0V4cChcIl4oLiopXFxcXFsoWzAtOV0qKVxcXFxdJFwiKTtcbmZ1bmN0aW9uIF9wYWNrKHR5cGUsIHZhbHVlLCBpc0FycmF
267745KSB7XG4gICAgc3dpdGNoICh0eXBlKSB7XG4gICAgICAgIGNhc2UgXCJhZGRyZXNzXCI6XG4gICAgICAgICAgICBpZiAoaXNBcnJheSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBnZXRCeXRlcyh6ZXJvUGFkVmFsdWUodmFsdWUsIDMyKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gZ2V0Qnl0ZXMoZ2V0QWRkcmVzcyh2YWx1ZSkpO1xuICAgICAgICBjYXNlIFwic3RyaW5nXCI6XG4gICAgICAgICAgICByZXR1cm4gdG9VdGY4Qnl0ZXModmFsdWUpO1xuICAgICAgICBjYXNlIFwiYnl0ZXNcIjpcbiAgICAgICAgICAgIHJldHVybiBnZXRCeXRlcyh2YWx1ZSk7XG4gICAgICAgIGNhc2UgXCJib29sXCI6XG4gICAgICAgICAgICB2YWx1ZSA9ICghIXZhbHVlID8gXCIweDAxXCIgOiBcIjB4MDBcIik7XG4gICAgICAgICAgICBpZiAoaXNBcnJheSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBnZXRCeXRlcyh6ZXJvUGFkVmFsdWUodmFsdWUsIDMyKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gZ2V0Qnl0ZXModmFsdWUpO1xuICAgIH1cbiAgICBsZXQgbWF0Y2ggPSB0eXBlLm1hdGNoKHJlZ2V4TnVtYmVyKTtcbiAgICBpZiAobWF0Y2gpIHtcbiAgICAgICAgbGV0IHNpZ25lZCA9IChtYXRjaFsxXSA9PT0gXCJpbnRcIik7XG4gICAgICAgIGxldCBzaXplID0gcGFyc2VJbnQobWF0Y2hbMl0gfHwgXCIyNTZcIik7XG4gICAgICAgIGFzc2VydEFyZ3VtZW50KCghbWF0Y2hbMl0gfHwgbWF0Y2hbMl0gPT09IFN0cmluZyhzaXplKSkgJiYgKHNpemUgJSA4ID09PSAwKSAmJiBzaXplICE9PSAwICYmIHNpemUgPD0gMjU2LCBcImludmFsaWQgbnVtYmVyIHR5cGVcIiwgXCJ0eXBlXCIsIHR5cGUpO1xuICAgICAgICBpZiAoaXNBcnJheSkge1xuICAgICAgICAgICAgc2l6ZSA9IDI1NjtcbiAgICAgICAgfVxuICAgICAgICBpZiAoc2lnbmVkKSB7XG4gICAgICAgICAgICB2YWx1ZSA9IHRvVHdvcyh2YWx1ZSwgc2l6ZSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGdldEJ5dGVzKHplcm9QYWRWYWx1ZSh0b0JlQXJyYXkodmFsdWUpLCBzaXplIC8gOCkpO1xuICAgIH1cbiAgICBtYXRjaCA9IHR5cGUubWF0Y2gocmVnZXhCeXRlcyk7XG4gICAgaWYgKG1hdGNoKSB7XG4gICAgICAgIGNvbnN0IHNpemUgPSBwYXJzZUludChtYXRjaFsxXSk7XG4gICAgICAgIGFzc2VydEFyZ3VtZW50KFN0cmluZyhzaXplKSA9PT0gbWF0Y2hbMV0gJiYgc2l6ZSAhPT0gMCAmJiBzaXplIDw9IDMyLCBcImludmFsaWQgYnl0ZXMgdHlwZVwiLCBcInR5cGVcIiwgdHlwZSk7XG4gICAgICAgIGFzc2VydEFyZ3VtZW50KGRhdGFMZW5ndGgodmFsdWUpID09PSBzaXplLCBgaW52YWxpZCB2YWx1ZSBmb3IgJHt0eXBlfWAsIFwidmFsdWVcIiwgdmFsdWUpO1xuICAgICAgICBpZiAoaXNBcnJheSkge1xuICAgICAgICAgICAgcmV0dXJuIGdldEJ5dGVzKHplcm9QYWRCeXRlcyh2YWx1ZSwgMzIpKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgfVxuICAgIG1hdGNoID0gdHlwZS5tYXRjaChyZWdleEFycmF5KTtcbiAgICBpZiAobWF0Y2ggJiYgQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICAgICAgY29uc3QgYmFzZVR5cGUgPSBtYXRjaFsxXTtcbiAgICAgICAgY29uc3QgY291bnQgPSBwYXJzZUludChtYXRjaFsyXSB8fCBTdHJpbmcodmFsdWUubGVuZ3RoKSk7XG4gICAgICAgIGFzc2VydEFyZ3VtZW50KGNvdW50ID09PSB2YWx1ZS5sZW5ndGgsIGBpbnZhbGlkIGFycmF5IGxlbmd0aCBmb3IgJHt0eXBlfWAsIFwidmFsdWVcIiwgdmFsdWUpO1xuICAgICAgICBjb25zdCByZXN1bHQgPSBbXTtcbiAgICAgICAgdmFsdWUuZm9yRWFjaChmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgICAgIHJlc3VsdC5wdXNoKF9wYWNrKGJhc2VUeXBlLCB2YWx1ZSwgdHJ1ZSkpO1xuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIGdldEJ5dGVzKGNvbmNhdChyZXN1bHQpKTtcbiAgICB9XG4gICAgYXNzZXJ0QXJndW1lbnQoZmFsc2UsIFwiaW52YWxpZCB0eXBlXCIsIFwidHlwZVwiLCB0eXBlKTtcbn1cbi8vIEBUT0RPOiBBcnJheSBFbnVtXG4vKipcbiAqICAgQ29tcHV0ZXMgdGhlIFtbbGluay1zb2xjLXBhY2tlZF1dIHJlcHJlc2VudGF0aW9uIG9mICUldmFsdWVzJSVcbiAqICAgcmVzcGVjdGl2ZWx5IHRvIHRoZWlyICUldHlwZXMlJS5cbiAqXG4gKiAgIEBleGFtcGxlOlxuICogICAgICAgYWRkciA9IFwiMHg4YmExZjEwOTU1MWJkNDMyODAzMDEyNjQ1YWMxMzZkZGQ2NGRiYTcyXCJcbiAqICAgICAgIHNvbGlkaXR5UGFja2VkKFsgXCJhZGRyZXNzXCIsIFwidWludFwiIF0sIFsgYWRkciwgNDUgXSk7XG4gKiAgICAgICAvL19yZXN1bHQ6XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzb2xpZGl0eVBhY2tlZCh0eXBlcywgdmFsdWVzKSB7XG4gICAgYXNzZXJ0QXJndW1lbnQodHlwZXMubGVuZ3RoID09PSB2YWx1ZXMubGVuZ3RoLCBcIndyb25nIG51bWJlciBvZiB2YWx1ZXM7IGV4cGVjdGVkICR7IHR5cGVzLmxlbmd0aCB9XCIsIFwidmFsdWVzXCIsIHZhbHVlcyk7XG4gICAgY29uc3QgdGlnaHQgPSBbXTtcbiAgICB0eXBlcy5mb3JFYWNoKGZ1bmN0aW9uICh0eXBlLCBpbmRleCkge1xuICAgICAgICB0aWdodC5wdXNoKF9wYWNrKHR5cGUsIHZhbHVlc1tpbmRleF0pKTtcbiAgICB9KTtcbiAgICByZXR1cm4gaGV4bGlmeShjb25jYXQodGlnaHQpKTtcbn1cbi8qKlxuICogICBDb21wdXRlcyB0aGUgW1tsaW5rLXNvbGMtcGFja2VkXV0gW1trZWNjYWsyNTZdXSBoYXNoIG9mICUldmFsdWVzJSVcbiAqICAgcmVzcGVjdGl2ZWx5IHRvIHRoZWlyICUldHlwZXMlJS5cbiAqXG4gKiAgIEBleGFtcGxlOlxuICogICAgICAgYWRkciA9IFwiMHg4YmExZjEwOTU1MWJkNDMyODAzMDEyNjQ1YWMxMzZkZGQ2NGRiYTcyXCJcbiAqICAgICAgIHNvbGlkaXR5UGFja2VkS2VjY2FrMjU2KFsgXCJhZGRyZXNzXCIsIFwidWludFwiIF0sIFsgYWRkciwgNDUgXSk7XG4gKiAgICAgICAvL19yZXN1bHQ6XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzb2xpZGl0eVBhY2tlZEtlY2NhazI1Nih0eXBlcywgdmFsdWVzKSB7XG4gICAgcmV0dXJuIF9rZWNjYWsyNTYoc29saWRpdHlQYWNrZWQodHlwZXMsIHZhbHVlcykpO1xufVxuLyoqXG4gKiAgIENvbXB1dGVzIHRoZSBbW2xpbmstc29sYy1wYWNrZWRdXSBbW3NoYTI1Nl1dIGhhc2ggb2YgJSV2YWx1ZXMlJVxuICogICByZXNwZWN0aXZlbHkgdG8gdGhlaXIgJSV0eXBlcyUlLlxuICpcbiAqICAgQGV4YW1wbGU6XG4gKiAgICAgICBhZGRyID0gXCIweDhiYTFmMTA5NTUxYmQ0MzI4MDMwMTI2NDVhYzEzNmRkZDY0ZGJhNzJcIlxuICogICAgICAgc29saWRpdHlQYWNrZWRTaGEyNTYoWyBcImFkZHJlc3NcIiwgXCJ1aW50XCIgXSwgWyBhZGRyLCA0NSBdKTtcbiAqICAgICAgIC8vX3Jlc3VsdDpcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNvbGlkaXR5UGFja2VkU2hhMjU2KHR5cGVzLCB2YWx1ZXMpIHtcbiAgICByZXR1cm4gX3NoYTI1Nihzb2xpZGl0eVBhY2tlZCh0eXBlcywgdmFsdWVzKSk7XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1zb2xpZGl0eS5qcy5tYXAiLCIvL2ltcG9ydCB7
26774IFR5cGVkRGF0YURvbWFpbiwgVHlwZWREYXRhRmllbGQgfSBmcm9tIFwiQGV0aGVyc3Byb2plY3QvcHJvdmlkZXJhYnN0cmFjdC1zaWduZXJcIjtcbmltcG9ydCB7IGdldEFkZHJlc3MgfSBmcm9tIFwiLi4vYWRkcmVzcy9pbmRleC5qc1wiO1xuaW1wb3J0IHsga2VjY2FrMjU2IH0gZnJvbSBcIi4uL2NyeXB0by9pbmRleC5qc1wiO1xuaW1wb3J0IHsgcmVjb3ZlckFkZHJlc3MgfSBmcm9tIFwiLi4vdHJhbnNhY3Rpb24vaW5kZXguanNcIjtcbmltcG9ydCB7IGNvbmNhdCwgZGVmaW5lUHJvcGVydGllcywgZ2V0QmlnSW50LCBnZXRCeXRlcywgaGV4bGlmeSwgaXNIZXhTdHJpbmcsIG1hc2ssIHRvQmVIZXgsIHRvUXVhbnRpdHksIHRvVHdvcywgemVyb1BhZFZhbHVlLCBhc3NlcnRBcmd1bWVudCB9IGZyb20gXCIuLi91dGlscy9pbmRleC5qc1wiO1xuaW1wb3J0IHsgaWQgfSBmcm9tIFwiLi9pZC5qc1wiO1xuY29uc3QgcGFkZGluZyA9IG5ldyBVaW50OEFycmF5KDMyKTtcbnBhZGRpbmcuZmlsbCgwKTtcbmNvbnN0IEJOX18xID0gQmlnSW50KC0xKTtcbmNvbnN0IEJOXzAgPSBCaWdJbnQoMCk7XG5jb25zdCBCTl8xID0gQmlnSW50KDEpO1xuY29uc3QgQk5fTUFYX1VJTlQyNTYgPSBCaWdJbnQoXCIweGZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZcIik7XG47XG47XG5mdW5jdGlvbiBoZXhQYWRSaWdodCh2YWx1ZSkge1xuICAgIGNvbnN0IGJ5dGVzID0gZ2V0Qnl0ZXModmFsdWUpO1xuICAgIGNvbnN0IHBhZE9mZnNldCA9IGJ5dGVzLmxlbmd0aCAlIDMyO1xuICAgIGlmIChwYWRPZmZzZXQpIHtcbiAgICAgICAgcmV0dXJuIGNvbmNhdChbYnl0ZXMsIHBhZGRpbmcuc2xpY2UocGFkT2Zmc2V0KV0pO1xuICAgIH1cbiAgICByZXR1cm4gaGV4bGlmeShieXRlcyk7XG59XG5jb25zdCBoZXhUcnVlID0gdG9CZUhleChCTl8xLCAzMik7XG5jb25zdCBoZXhGYWxzZSA9IHRvQmVIZXgoQk5fMCwgMzIpO1xuY29uc3QgZG9tYWluRmllbGRUeXBlcyA9IHtcbiAgICBuYW1lOiBcInN0cmluZ1wiLFxuICAgIHZlcnNpb246IFwic3RyaW5nXCIsXG4gICAgY2hhaW5JZDogXCJ1aW50MjU2XCIsXG4gICAgdmVyaWZ5aW5nQ29udHJhY3Q6IFwiYWRkcmVzc1wiLFxuICAgIHNhbHQ6IFwiYnl0ZXMzMlwiXG59O1xuY29uc3QgZG9tYWluRmllbGROYW1lcyA9IFtcbiAgICBcIm5hbWVcIiwgXCJ2ZXJzaW9uXCIsIFwiY2hhaW5JZFwiLCBcInZlcmlmeWluZ0NvbnRyYWN0XCIsIFwic2FsdFwiXG5dO1xuZnVuY3Rpb24gY2hlY2tTdHJpbmcoa2V5KSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICBhc3NlcnRBcmd1bWVudCh0eXBlb2YgKHZhbHVlKSA9PT0gXCJzdHJpbmdcIiwgYGludmFsaWQgZG9tYWluIHZhbHVlIGZvciAke0pTT04uc3RyaW5naWZ5KGtleSl9YCwgYGRvbWFpbi4ke2tleX1gLCB2YWx1ZSk7XG4gICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICB9O1xufVxuY29uc3QgZG9tYWluQ2hlY2tzID0ge1xuICAgIG5hbWU6IGNoZWNrU3RyaW5nKFwibmFtZVwiKSxcbiAgICB2ZXJzaW9uOiBjaGVja1N0cmluZyhcInZlcnNpb25cIiksXG4gICAgY2hhaW5JZDogZnVuY3Rpb24gKF92YWx1ZSkge1xuICAgICAgICBjb25zdCB2YWx1ZSA9IGdldEJpZ0ludChfdmFsdWUsIFwiZG9tYWluLmNoYWluSWRcIik7XG4gICAgICAgIGFzc2VydEFyZ3VtZW50KHZhbHVlID49IDAsIFwiaW52YWxpZCBjaGFpbiBJRFwiLCBcImRvbWFpbi5jaGFpbklkXCIsIF92YWx1ZSk7XG4gICAgICAgIGlmIChOdW1iZXIuaXNTYWZlSW50ZWdlcih2YWx1ZSkpIHtcbiAgICAgICAgICAgIHJldHVybiBOdW1iZXIodmFsdWUpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0b1F1YW50aXR5KHZhbHVlKTtcbiAgICB9LFxuICAgIHZlcmlmeWluZ0NvbnRyYWN0OiBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHJldHVybiBnZXRBZGRyZXNzKHZhbHVlKS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICB9XG4gICAgICAgIGNhdGNoIChlcnJvcikgeyB9XG4gICAgICAgIGFzc2VydEFyZ3VtZW50KGZhbHNlLCBgaW52YWxpZCBkb21haW4gdmFsdWUgXCJ2ZXJpZnlpbmdDb250cmFjdFwiYCwgXCJkb21haW4udmVyaWZ5aW5nQ29udHJhY3RcIiwgdmFsdWUpO1xuICAgIH0sXG4gICAgc2FsdDogZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgIGNvbnN0IGJ5dGVzID0gZ2V0Qnl0ZXModmFsdWUsIFwiZG9tYWluLnNhbHRcIik7XG4gICAgICAgIGFzc2VydEFyZ3VtZW50KGJ5dGVzLmxlbmd0aCA9PT0gMzIsIGBpbnZhbGlkIGRvbWFpbiB2YWx1ZSBcInNhbHRcImAsIFwiZG9tYWluLnNhbHRcIiwgdmFsdWUpO1xuICAgICAgICByZXR1cm4gaGV4bGlmeShieXRlcyk7XG4gICAgfVxufTtcbmZ1bmN0aW9uIGdldEJhc2VFbmNvZGVyKHR5cGUpIHtcbiAgICAvLyBpbnRYWCBhbmQgdWludFhYXG4gICAge1xuICAgICAgICBjb25zdCBtYXRjaCA9IHR5cGUubWF0Y2goL14odT8paW50KFxcZCspJC8pO1xuICAgICAgICBpZiAobWF0Y2gpIHtcbiAgICAgICAgICAgIGNvbnN0IHNpZ25lZCA9IChtYXRjaFsxXSA9PT0gXCJcIik7XG4gICAgICAgICAgICBjb25zdCB3aWR0aCA9IHBhcnNlSW50KG1hdGNoWzJdKTtcbiAgICAgICAgICAgIGFzc2VydEFyZ3VtZW50KHdpZHRoICUgOCA9PT0gMCAmJiB3aWR0aCAhPT0gMCAmJiB3aWR0aCA8PSAyNTYgJiYgbWF0Y2hbMl0gPT09IFN0cmluZyh3aWR0aCksIFwiaW52YWxpZCBudW1lcmljIHdpZHRoXCIsIFwidHlwZVwiLCB0eXBlKTtcbiAgICAgICAgICAgIGNvbnN0IGJvdW5kc1VwcGVyID0gbWFzayhCTl9NQVhfVUlOVDI1Niwgc2lnbmVkID8gKHdpZHRoIC0gMSkgOiB3aWR0aCk7XG4gICAgICAgICAgICBjb25zdCBib3VuZHNMb3dlciA9IHNpZ25lZCA/ICgoYm91bmRzVXBwZXIgKyBCTl8xKSAqIEJOX18xKSA6IEJOXzA7XG4gICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24gKF92YWx1ZSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gZ2V0QmlnSW50KF92YWx1ZSwgXCJ2YWx1ZVwiKTtcbiAgICAgICAgICAgICAgICBhc3NlcnRBcmd1bWVudCh2YWx1ZSA+PSBib3VuZHNMb3dlciAmJiB2YWx1ZSA8PSBib3VuZHNVcHBlciwgYHZhbHVlIG91dC1vZi1ib3VuZHMgZm9yICR7dHlwZX1gLCBcInZhbHVlXCIsIHZhbHVlKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gdG9CZUhleChzaWduZWQgPyB0b1R3b3ModmFsdWUsIDI1NikgOiB2YWx1ZSwgMzIpO1xuICAgICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvLyBieXRlc1hYXG4gICAge1xuICAgICAgICBjb25zdCBtYXRjaCA9IHR5cGUubWF0Y2goL15ieXRlcyhcXGQrKSQvKTtcbiAgICAgICAgaWYgKG1hdGNoKSB7XG4gICAgICAgICAgICBjb25zdCB3aWR0aCA9IHBhcnNlSW50KG1hdGNoWzFdKTtcbiAgICAgICAgICAgIGFzc2VydEFyZ3VtZW50KHdpZHRoICE9PSAwICYmIHdpZHRoIDw9IDMyICYmIG1hdGNoWzFdID09PSBTdHJpbmcod2lkdGgpLCBcImludmFsaWQgYnl0ZXMgd2lkdGhcIiwgXCJ0eXBlXCIsIHR5cGUpO1xuICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGJ5dGVzID0gZ2V0Qnl0ZXModmFsdWUpO1xuICAgICAgICAgICAgICAgIGFzc2VydEFyZ3VtZW50KGJ5dG
26774VzLmxlbmd0aCA9PT0gd2lkdGgsIGBpbnZhbGlkIGxlbmd0aCBmb3IgJHt0eXBlfWAsIFwidmFsdWVcIiwgdmFsdWUpO1xuICAgICAgICAgICAgICAgIHJldHVybiBoZXhQYWRSaWdodCh2YWx1ZSk7XG4gICAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgfVxuICAgIHN3aXRjaCAodHlwZSkge1xuICAgICAgICBjYXNlIFwiYWRkcmVzc1wiOiByZXR1cm4gZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgICAgICByZXR1cm4gemVyb1BhZFZhbHVlKGdldEFkZHJlc3ModmFsdWUpLCAzMik7XG4gICAgICAgIH07XG4gICAgICAgIGNhc2UgXCJib29sXCI6IHJldHVybiBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgICAgIHJldHVybiAoKCF2YWx1ZSkgPyBoZXhGYWxzZSA6IGhleFRydWUpO1xuICAgICAgICB9O1xuICAgICAgICBjYXNlIFwiYnl0ZXNcIjogcmV0dXJuIGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICAgICAgcmV0dXJuIGtlY2NhazI1Nih2YWx1ZSk7XG4gICAgICAgIH07XG4gICAgICAgIGNhc2UgXCJzdHJpbmdcIjogcmV0dXJuIGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICAgICAgcmV0dXJuIGlkKHZhbHVlKTtcbiAgICAgICAgfTtcbiAgICB9XG4gICAgcmV0dXJuIG51bGw7XG59XG5mdW5jdGlvbiBlbmNvZGVUeXBlKG5hbWUsIGZpZWxkcykge1xuICAgIHJldHVybiBgJHtuYW1lfSgke2ZpZWxkcy5tYXAoKHsgbmFtZSwgdHlwZSB9KSA9PiAodHlwZSArIFwiIFwiICsgbmFtZSkpLmpvaW4oXCIsXCIpfSlgO1xufVxuLy8gZm9vW11bM10gPT4geyBiYXNlOiBcImZvb1wiLCBpbmRleDogXCJbXVszXVwiLCBhcnJheToge1xuLy8gICAgIGJhc2U6IFwiZm9vXCIsIHByZWZpeDogXCJmb29bXVwiLCBjb3VudDogMyB9IH1cbmZ1bmN0aW9uIHNwbGl0QXJyYXkodHlwZSkge1xuICAgIGNvbnN0IG1hdGNoID0gdHlwZS5tYXRjaCgvXihbXlxceDViXSopKChcXHg1YlxcZCpcXHg1ZCkqKShcXHg1YihcXGQqKVxceDVkKSQvKTtcbiAgICBpZiAobWF0Y2gpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGJhc2U6IG1hdGNoWzFdLFxuICAgICAgICAgICAgaW5kZXg6IChtYXRjaFsyXSArIG1hdGNoWzRdKSxcbiAgICAgICAgICAgIGFycmF5OiB7XG4gICAgICAgICAgICAgICAgYmFzZTogbWF0Y2hbMV0sXG4gICAgICAgICAgICAgICAgcHJlZml4OiAobWF0Y2hbMV0gKyBtYXRjaFsyXSksXG4gICAgICAgICAgICAgICAgY291bnQ6IChtYXRjaFs1XSA/IHBhcnNlSW50KG1hdGNoWzVdKSA6IC0xKSxcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICB9XG4gICAgcmV0dXJuIHsgYmFzZTogdHlwZSB9O1xufVxuLyoqXG4gKiAgQSAqKlR5cGVkRGF0YUVuY29kZSoqIHByZXBhcmVzIGFuZCBlbmNvZGVzIFtbbGluay1laXAtNzEyXV0gcGF5bG9hZHNcbiAqICBmb3Igc2lnbmVkIHR5cGVkIGRhdGEuXG4gKlxuICogIFRoaXMgaXMgdXNlZnVsIGZvciB0aG9zZSB0aGF0IHdpc2ggdG8gY29tcHV0ZSB2YXJpb3VzIGNvbXBvbmVudHMgb2YgYVxuICogIHR5cGVkIGRhdGEgaGFzaCwgcHJpbWFyeSB0eXBlcywgb3Igc3ViLWNvbXBvbmVudHMsIGJ1dCBnZW5lcmFsbHkgdGhlXG4gKiAgaGlnaGVyIGxldmVsIFtbU2lnbmVyLXNpZ25UeXBlZERhdGFdXSBpcyBtb3JlIHVzZWZ1bC5cbiAqL1xuZXhwb3J0IGNsYXNzIFR5cGVkRGF0YUVuY29kZXIge1xuICAgIC8qKlxuICAgICAqICBUaGUgcHJpbWFyeSB0eXBlIGZvciB0aGUgc3RydWN0dXJlZCBbW3R5cGVzXV0uXG4gICAgICpcbiAgICAgKiAgVGhpcyBpcyBkZXJpdmVkIGF1dG9tYXRpY2FsbHkgZnJvbSB0aGUgW1t0eXBlc11dLCBzaW5jZSBub1xuICAgICAqICByZWN1cnNpb24gaXMgcG9zc2libGUsIG9uY2UgdGhlIERBRyBmb3IgdGhlIHR5cGVzIGlzIGNvbnN0dXJjdGVkXG4gICAgICogIGludGVybmFsbHksIHRoZSBwcmltYXJ5IHR5cGUgbXVzdCBiZSB0aGUgb25seSByZW1haW5pbmcgdHlwZSB3aXRoXG4gICAgICogIG5vIHBhcmVudCBub2Rlcy5cbiAgICAgKi9cbiAgICBwcmltYXJ5VHlwZTtcbiAgICAjdHlwZXM7XG4gICAgLyoqXG4gICAgICogIFRoZSB0eXBlcy5cbiAgICAgKi9cbiAgICBnZXQgdHlwZXMoKSB7XG4gICAgICAgIHJldHVybiBKU09OLnBhcnNlKHRoaXMuI3R5cGVzKTtcbiAgICB9XG4gICAgI2Z1bGxUeXBlcztcbiAgICAjZW5jb2RlckNhY2hlO1xuICAgIC8qKlxuICAgICAqICBDcmVhdGUgYSBuZXcgKipUeXBlZERhdGFFbmNvZGVyKiogZm9yICUldHlwZXMlJS5cbiAgICAgKlxuICAgICAqICBUaGlzIHBlcmZvcm1zIGFsbCBuZWNlc3NhcnkgY2hlY2tpbmcgdGhhdCB0eXBlcyBhcmUgdmFsaWQgYW5kXG4gICAgICogIGRvIG5vdCB2aW9sYXRlIHRoZSBbW2xpbmstZWlwLTcxMl1dIHN0cnVjdHVyYWwgY29uc3RyYWludHMgYXNcbiAgICAgKiAgd2VsbCBhcyBjb21wdXRlcyB0aGUgW1twcmltYXJ5VHlwZV1dLlxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yKF90eXBlcykge1xuICAgICAgICB0aGlzLiNmdWxsVHlwZXMgPSBuZXcgTWFwKCk7XG4gICAgICAgIHRoaXMuI2VuY29kZXJDYWNoZSA9IG5ldyBNYXAoKTtcbiAgICAgICAgLy8gTGluayBzdHJ1Y3QgdHlwZXMgdG8gdGhlaXIgZGlyZWN0IGNoaWxkIHN0cnVjdHNcbiAgICAgICAgY29uc3QgbGlua3MgPSBuZXcgTWFwKCk7XG4gICAgICAgIC8vIExpbmsgc3RydWN0cyB0byBzdHJ1Y3RzIHdoaWNoIGNvbnRhaW4gdGhlbSBhcyBhIGNoaWxkXG4gICAgICAgIGNvbnN0IHBhcmVudHMgPSBuZXcgTWFwKCk7XG4gICAgICAgIC8vIExpbmsgYWxsIHN1YnR5cGVzIHdpdGhpbiBhIGdpdmVuIHN0cnVjdFxuICAgICAgICBjb25zdCBzdWJ0eXBlcyA9IG5ldyBNYXAoKTtcbiAgICAgICAgY29uc3QgdHlwZXMgPSB7fTtcbiAgICAgICAgT2JqZWN0LmtleXMoX3R5cGVzKS5mb3JFYWNoKCh0eXBlKSA9PiB7XG4gICAgICAgICAgICB0eXBlc1t0eXBlXSA9IF90eXBlc1t0eXBlXS5tYXAoKHsgbmFtZSwgdHlwZSB9KSA9PiB7XG4gICAgICAgICAgICAgICAgLy8gTm9ybWFsaXplIHRoZSBiYXNlIHR5cGUgKHVubGVzcyBuYW1lIGNvbmZsaWN0KVxuICAgICAgICAgICAgICAgIGxldCB7IGJhc2UsIGluZGV4IH0gPSBzcGxpdEFycmF5KHR5cGUpO1xuICAgICAgICAgICAgICAgIGlmIChiYXNlID09PSBcImludFwiICYmICFfdHlwZXNbXCJpbnRcIl0pIHtcbiAgICAgICAgICAgICAgICAgICAgYmFzZSA9IFwiaW50MjU2XCI7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChiYXNlID09PSBcInVpbnRcIiAmJiAhX3R5cGVzW1widWludFwiXSkge1xuICAgICAgICAgICAgICAgICAgICBiYXNlID0gXCJ1aW50MjU2XCI7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgI
26774HJldHVybiB7IG5hbWUsIHR5cGU6IChiYXNlICsgKGluZGV4IHx8IFwiXCIpKSB9O1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBsaW5rcy5zZXQodHlwZSwgbmV3IFNldCgpKTtcbiAgICAgICAgICAgIHBhcmVudHMuc2V0KHR5cGUsIFtdKTtcbiAgICAgICAgICAgIHN1YnR5cGVzLnNldCh0eXBlLCBuZXcgU2V0KCkpO1xuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy4jdHlwZXMgPSBKU09OLnN0cmluZ2lmeSh0eXBlcyk7XG4gICAgICAgIGZvciAoY29uc3QgbmFtZSBpbiB0eXBlcykge1xuICAgICAgICAgICAgY29uc3QgdW5pcXVlTmFtZXMgPSBuZXcgU2V0KCk7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGZpZWxkIG9mIHR5cGVzW25hbWVdKSB7XG4gICAgICAgICAgICAgICAgLy8gQ2hlY2sgZWFjaCBmaWVsZCBoYXMgYSB1bmlxdWUgbmFtZVxuICAgICAgICAgICAgICAgIGFzc2VydEFyZ3VtZW50KCF1bmlxdWVOYW1lcy5oYXMoZmllbGQubmFtZSksIGBkdXBsaWNhdGUgdmFyaWFibGUgbmFtZSAke0pTT04uc3RyaW5naWZ5KGZpZWxkLm5hbWUpfSBpbiAke0pTT04uc3RyaW5naWZ5KG5hbWUpfWAsIFwidHlwZXNcIiwgX3R5cGVzKTtcbiAgICAgICAgICAgICAgICB1bmlxdWVOYW1lcy5hZGQoZmllbGQubmFtZSk7XG4gICAgICAgICAgICAgICAgLy8gR2V0IHRoZSBiYXNlIHR5cGUgKGRyb3AgYW55IGFycmF5IHNwZWNpZmllcnMpXG4gICAgICAgICAgICAgICAgY29uc3QgYmFzZVR5cGUgPSBzcGxpdEFycmF5KGZpZWxkLnR5cGUpLmJhc2U7XG4gICAgICAgICAgICAgICAgYXNzZXJ0QXJndW1lbnQoYmFzZVR5cGUgIT09IG5hbWUsIGBjaXJjdWxhciB0eXBlIHJlZmVyZW5jZSB0byAke0pTT04uc3RyaW5naWZ5KGJhc2VUeXBlKX1gLCBcInR5cGVzXCIsIF90eXBlcyk7XG4gICAgICAgICAgICAgICAgLy8gSXMgdGhpcyBhIGJhc2UgZW5jb2RpbmcgdHlwZT9cbiAgICAgICAgICAgICAgICBjb25zdCBlbmNvZGVyID0gZ2V0QmFzZUVuY29kZXIoYmFzZVR5cGUpO1xuICAgICAgICAgICAgICAgIGlmIChlbmNvZGVyKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBhc3NlcnRBcmd1bWVudChwYXJlbnRzLmhhcyhiYXNlVHlwZSksIGB1bmtub3duIHR5cGUgJHtKU09OLnN0cmluZ2lmeShiYXNlVHlwZSl9YCwgXCJ0eXBlc1wiLCBfdHlwZXMpO1xuICAgICAgICAgICAgICAgIC8vIEFkZCBsaW5rYWdlXG4gICAgICAgICAgICAgICAgcGFyZW50cy5nZXQoYmFzZVR5cGUpLnB1c2gobmFtZSk7XG4gICAgICAgICAgICAgICAgbGlua3MuZ2V0KG5hbWUpLmFkZChiYXNlVHlwZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgLy8gRGVkdWNlIHRoZSBwcmltYXJ5IHR5cGVcbiAgICAgICAgY29uc3QgcHJpbWFyeVR5cGVzID0gQXJyYXkuZnJvbShwYXJlbnRzLmtleXMoKSkuZmlsdGVyKChuKSA9PiAocGFyZW50cy5nZXQobikubGVuZ3RoID09PSAwKSk7XG4gICAgICAgIGFzc2VydEFyZ3VtZW50KHByaW1hcnlUeXBlcy5sZW5ndGggIT09IDAsIFwibWlzc2luZyBwcmltYXJ5IHR5cGVcIiwgXCJ0eXBlc1wiLCBfdHlwZXMpO1xuICAgICAgICBhc3NlcnRBcmd1bWVudChwcmltYXJ5VHlwZXMubGVuZ3RoID09PSAxLCBgYW1iaWd1b3VzIHByaW1hcnkgdHlwZXMgb3IgdW51c2VkIHR5cGVzOiAke3ByaW1hcnlUeXBlcy5tYXAoKHQpID0+IChKU09OLnN0cmluZ2lmeSh0KSkpLmpvaW4oXCIsIFwiKX1gLCBcInR5cGVzXCIsIF90eXBlcyk7XG4gICAgICAgIGRlZmluZVByb3BlcnRpZXModGhpcywgeyBwcmltYXJ5VHlwZTogcHJpbWFyeVR5cGVzWzBdIH0pO1xuICAgICAgICAvLyBDaGVjayBmb3IgY2lyY3VsYXIgdHlwZSByZWZlcmVuY2VzXG4gICAgICAgIGZ1bmN0aW9uIGNoZWNrQ2lyY3VsYXIodHlwZSwgZm91bmQpIHtcbiAgICAgICAgICAgIGFzc2VydEFyZ3VtZW50KCFmb3VuZC5oYXModHlwZSksIGBjaXJjdWxhciB0eXBlIHJlZmVyZW5jZSB0byAke0pTT04uc3RyaW5naWZ5KHR5cGUpfWAsIFwidHlwZXNcIiwgX3R5cGVzKTtcbiAgICAgICAgICAgIGZvdW5kLmFkZCh0eXBlKTtcbiAgICAgICAgICAgIGZvciAoY29uc3QgY2hpbGQgb2YgbGlua3MuZ2V0KHR5cGUpKSB7XG4gICAgICAgICAgICAgICAgaWYgKCFwYXJlbnRzLmhhcyhjaGlsZCkpIHtcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIC8vIFJlY3Vyc2l2ZWx5IGNoZWNrIGNoaWxkcmVuXG4gICAgICAgICAgICAgICAgY2hlY2tDaXJjdWxhcihjaGlsZCwgZm91bmQpO1xuICAgICAgICAgICAgICAgIC8vIE1hcmsgYWxsIGFuY2VzdG9ycyBhcyBoYXZpbmcgdGhpcyBkZWNlbmRhbnRcbiAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IHN1YnR5cGUgb2YgZm91bmQpIHtcbiAgICAgICAgICAgICAgICAgICAgc3VidHlwZXMuZ2V0KHN1YnR5cGUpLmFkZChjaGlsZCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZm91bmQuZGVsZXRlKHR5cGUpO1xuICAgICAgICB9XG4gICAgICAgIGNoZWNrQ2lyY3VsYXIodGhpcy5wcmltYXJ5VHlwZSwgbmV3IFNldCgpKTtcbiAgICAgICAgLy8gQ29tcHV0ZSBlYWNoIGZ1bGx5IGRlc2NyaWJlIHR5cGVcbiAgICAgICAgZm9yIChjb25zdCBbbmFtZSwgc2V0XSBvZiBzdWJ0eXBlcykge1xuICAgICAgICAgICAgY29uc3Qgc3QgPSBBcnJheS5mcm9tKHNldCk7XG4gICAgICAgICAgICBzdC5zb3J0KCk7XG4gICAgICAgICAgICB0aGlzLiNmdWxsVHlwZXMuc2V0KG5hbWUsIGVuY29kZVR5cGUobmFtZSwgdHlwZXNbbmFtZV0pICsgc3QubWFwKCh0KSA9PiBlbmNvZGVUeXBlKHQsIHR5cGVzW3RdKSkuam9pbihcIlwiKSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogIFJldHVybnRoZSBlbmNvZGVyIGZvciB0aGUgc3BlY2lmaWMgJSV0eXBlJSUuXG4gICAgICovXG4gICAgZ2V0RW5jb2Rlcih0eXBlKSB7XG4gICAgICAgIGxldCBlbmNvZGVyID0gdGhpcy4jZW5jb2RlckNhY2hlLmdldCh0eXBlKTtcbiAgICAgICAgaWYgKCFlbmNvZGVyKSB7XG4gICAgICAgICAgICBlbmNvZGVyID0gdGhpcy4jZ2V0RW5jb2Rlcih0eXBlKTtcbiAgICAgICAgICAgI
26774HRoaXMuI2VuY29kZXJDYWNoZS5zZXQodHlwZSwgZW5jb2Rlcik7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGVuY29kZXI7XG4gICAgfVxuICAgICNnZXRFbmNvZGVyKHR5cGUpIHtcbiAgICAgICAgLy8gQmFzaWMgZW5jb2RlciB0eXBlIChhZGRyZXNzLCBib29sLCB1aW50MjU2LCBldGMpXG4gICAgICAgIHtcbiAgICAgICAgICAgIGNvbnN0IGVuY29kZXIgPSBnZXRCYXNlRW5jb2Rlcih0eXBlKTtcbiAgICAgICAgICAgIGlmIChlbmNvZGVyKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGVuY29kZXI7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgLy8gQXJyYXlcbiAgICAgICAgY29uc3QgYXJyYXkgPSBzcGxpdEFycmF5KHR5cGUpLmFycmF5O1xuICAgICAgICBpZiAoYXJyYXkpIHtcbiAgICAgICAgICAgIGNvbnN0IHN1YnR5cGUgPSBhcnJheS5wcmVmaXg7XG4gICAgICAgICAgICBjb25zdCBzdWJFbmNvZGVyID0gdGhpcy5nZXRFbmNvZGVyKHN1YnR5cGUpO1xuICAgICAgICAgICAgcmV0dXJuICh2YWx1ZSkgPT4ge1xuICAgICAgICAgICAgICAgIGFzc2VydEFyZ3VtZW50KGFycmF5LmNvdW50ID09PSAtMSB8fCBhcnJheS5jb3VudCA9PT0gdmFsdWUubGVuZ3RoLCBgYXJyYXkgbGVuZ3RoIG1pc21hdGNoOyBleHBlY3RlZCBsZW5ndGggJHthcnJheS5jb3VudH1gLCBcInZhbHVlXCIsIHZhbHVlKTtcbiAgICAgICAgICAgICAgICBsZXQgcmVzdWx0ID0gdmFsdWUubWFwKHN1YkVuY29kZXIpO1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLiNmdWxsVHlwZXMuaGFzKHN1YnR5cGUpKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IHJlc3VsdC5tYXAoa2VjY2FrMjU2KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIGtlY2NhazI1Nihjb25jYXQocmVzdWx0KSk7XG4gICAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICAgIC8vIFN0cnVjdFxuICAgICAgICBjb25zdCBmaWVsZHMgPSB0aGlzLnR5cGVzW3R5cGVdO1xuICAgICAgICBpZiAoZmllbGRzKSB7XG4gICAgICAgICAgICBjb25zdCBlbmNvZGVkVHlwZSA9IGlkKHRoaXMuI2Z1bGxUeXBlcy5nZXQodHlwZSkpO1xuICAgICAgICAgICAgcmV0dXJuICh2YWx1ZSkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IHZhbHVlcyA9IGZpZWxkcy5tYXAoKHsgbmFtZSwgdHlwZSB9KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IHRoaXMuZ2V0RW5jb2Rlcih0eXBlKSh2YWx1ZVtuYW1lXSk7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLiNmdWxsVHlwZXMuaGFzKHR5cGUpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4ga2VjY2FrMjU2KHJlc3VsdCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB2YWx1ZXMudW5zaGlmdChlbmNvZGVkVHlwZSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGNvbmNhdCh2YWx1ZXMpO1xuICAgICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgICBhc3NlcnRBcmd1bWVudChmYWxzZSwgYHVua25vd24gdHlwZTogJHt0eXBlfWAsIFwidHlwZVwiLCB0eXBlKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogIFJldHVybiB0aGUgZnVsbCB0eXBlIGZvciAlJW5hbWUlJS5cbiAgICAgKi9cbiAgICBlbmNvZGVUeXBlKG5hbWUpIHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gdGhpcy4jZnVsbFR5cGVzLmdldChuYW1lKTtcbiAgICAgICAgYXNzZXJ0QXJndW1lbnQocmVzdWx0LCBgdW5rbm93biB0eXBlOiAke0pTT04uc3RyaW5naWZ5KG5hbWUpfWAsIFwibmFtZVwiLCBuYW1lKTtcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG4gICAgLyoqXG4gICAgICogIFJldHVybiB0aGUgZW5jb2RlZCAlJXZhbHVlJSUgZm9yIHRoZSAlJXR5cGUlJS5cbiAgICAgKi9cbiAgICBlbmNvZGVEYXRhKHR5cGUsIHZhbHVlKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldEVuY29kZXIodHlwZSkodmFsdWUpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiAgUmV0dXJucyB0aGUgaGFzaCBvZiAlJXZhbHVlJSUgZm9yIHRoZSB0eXBlIG9mICUlbmFtZSUlLlxuICAgICAqL1xuICAgIGhhc2hTdHJ1Y3QobmFtZSwgdmFsdWUpIHtcbiAgICAgICAgcmV0dXJuIGtlY2NhazI1Nih0aGlzLmVuY29kZURhdGEobmFtZSwgdmFsdWUpKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogIFJldHVybiB0aGUgZnVsbGVkIGVuY29kZWQgJSV2YWx1ZSUlIGZvciB0aGUgW1t0eXBlc11dLlxuICAgICAqL1xuICAgIGVuY29kZSh2YWx1ZSkge1xuICAgICAgICByZXR1cm4gdGhpcy5lbmNvZGVEYXRhKHRoaXMucHJpbWFyeVR5cGUsIHZhbHVlKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogIFJldHVybiB0aGUgaGFzaCBvZiB0aGUgZnVsbHkgZW5jb2RlZCAlJXZhbHVlJSUgZm9yIHRoZSBbW3R5cGVzXV0uXG4gICAgICovXG4gICAgaGFzaCh2YWx1ZSkge1xuICAgICAgICByZXR1cm4gdGhpcy5oYXNoU3RydWN0KHRoaXMucHJpbWFyeVR5cGUsIHZhbHVlKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogIEBfaWdub3JlOlxuICAgICAqL1xuICAgIF92aXNpdCh0eXBlLCB2YWx1ZSwgY2FsbGJhY2spIHtcbiAgICAgICAgLy8gQmFzaWMgZW5jb2RlciB0eXBlIChhZGRyZXNzLCBib29sLCB1aW50MjU2LCBldGMpXG4gICAgICAgIHtcbiAgICAgICAgICAgIGNvbnN0IGVuY29kZXIgPSBnZXRCYXNlRW5jb2Rlcih0eXBlKTtcbiAgICAgICAgICAgIGlmIChlbmNvZGVyKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGNhbGxiYWNrKHR5cGUsIHZhbHVlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAvLyBBcnJheVxuICAgICAgICBjb25zdCBhcnJheSA9IHNwbGl0QXJyYXkodHlwZSkuYXJyYXk7XG4gICAgICAgIGlmIChhcnJheSkge1xuICAgICAgICAgICAgYXNzZXJ0QXJndW1lbnQoYXJyYXkuY291bnQgPT09IC0xIHx8IGFycmF5LmNvdW50ID09PSB2YWx1ZS5sZW5ndGgsIGBhcnJheSBsZW5ndGggbWlzbWF0Y2g7IGV4cGVjdGVkIGxlbmd0aCAke2FycmF5LmNvdW50fWAsIFwidmFsdWVcIiwgdmFsdWUpO1xuICAgICAgICAgICAgcmV0dXJuIHZhbHVlLm1hcCgodikgPT4gdGhpcy5fdmlzaXQoYXJyYXkucHJlZml4LCB2LCBjYWxsYmFjaykpO1xuICAgICAgICB9XG4gICAgICAgIC8vIFN0cnVjdFxuICAgICAgICBjb25zdCBmaWVsZHMgPSB0aGlzLnR5cGVzW3R5cGVdO1xuICAgICAgICBpZiAoZmllbGRzKSB7XG4gICAgICAgICAgICByZXR1cm4gZmllbGRzLnJlZHVjZSgoYWNjdW0sIHsgbmFtZSwgdHlwZSB9KSA9PiB7XG4gICAgICAgICAgICAgICAgYWNjdW1bbmFtZV0gPSB0aGlzLl92aXNpdCh0eXBlLCB2YWx1ZVtuYW1lXSwgY2FsbGJhY2spO1xuICAgICAgICAgICAgICAgI
26774HJldHVybiBhY2N1bTtcbiAgICAgICAgICAgIH0sIHt9KTtcbiAgICAgICAgfVxuICAgICAgICBhc3NlcnRBcmd1bWVudChmYWxzZSwgYHVua25vd24gdHlwZTogJHt0eXBlfWAsIFwidHlwZVwiLCB0eXBlKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogIENhbGwgJSVjYWxiYWNrJSUgZm9yIGVhY2ggdmFsdWUgaW4gJSV2YWx1ZSUlLCBwYXNzaW5nIHRoZSB0eXBlIGFuZFxuICAgICAqICBjb21wb25lbnQgd2l0aGluICUldmFsdWUlJS5cbiAgICAgKlxuICAgICAqICBUaGlzIGlzIHVzZWZ1bCBmb3IgcmVwbGFjaW5nIGFkZHJlc3NlcyBvciBvdGhlciB0cmFuc2Zvcm1hdGlvbiB0aGF0XG4gICAgICogIG1heSBiZSBkZXNpcmVkIG9uIGVhY2ggY29tcG9uZW50LCBiYXNlZCBvbiBpdHMgdHlwZS5cbiAgICAgKi9cbiAgICB2aXNpdCh2YWx1ZSwgY2FsbGJhY2spIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3Zpc2l0KHRoaXMucHJpbWFyeVR5cGUsIHZhbHVlLCBjYWxsYmFjayk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqICBDcmVhdGUgYSBuZXcgKipUeXBlZERhdGFFbmNvZGVyKiogZm9yICUldHlwZXMlJS5cbiAgICAgKi9cbiAgICBzdGF0aWMgZnJvbSh0eXBlcykge1xuICAgICAgICByZXR1cm4gbmV3IFR5cGVkRGF0YUVuY29kZXIodHlwZXMpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiAgUmV0dXJuIHRoZSBwcmltYXJ5IHR5cGUgZm9yICUldHlwZXMlJS5cbiAgICAgKi9cbiAgICBzdGF0aWMgZ2V0UHJpbWFyeVR5cGUodHlwZXMpIHtcbiAgICAgICAgcmV0dXJuIFR5cGVkRGF0YUVuY29kZXIuZnJvbSh0eXBlcykucHJpbWFyeVR5cGU7XG4gICAgfVxuICAgIC8qKlxuICAgICAqICBSZXR1cm4gdGhlIGhhc2hlZCBzdHJ1Y3QgZm9yICUldmFsdWUlJSB1c2luZyAlJXR5cGVzJSUgYW5kICUlbmFtZSUlLlxuICAgICAqL1xuICAgIHN0YXRpYyBoYXNoU3RydWN0KG5hbWUsIHR5cGVzLCB2YWx1ZSkge1xuICAgICAgICByZXR1cm4gVHlwZWREYXRhRW5jb2Rlci5mcm9tKHR5cGVzKS5oYXNoU3RydWN0KG5hbWUsIHZhbHVlKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogIFJldHVybiB0aGUgZG9tYWluIGhhc2ggZm9yICUlZG9tYWluJSUuXG4gICAgICovXG4gICAgc3RhdGljIGhhc2hEb21haW4oZG9tYWluKSB7XG4gICAgICAgIGNvbnN0IGRvbWFpbkZpZWxkcyA9IFtdO1xuICAgICAgICBmb3IgKGNvbnN0IG5hbWUgaW4gZG9tYWluKSB7XG4gICAgICAgICAgICBpZiAoZG9tYWluW25hbWVdID09IG51bGwpIHtcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IHR5cGUgPSBkb21haW5GaWVsZFR5cGVzW25hbWVdO1xuICAgICAgICAgICAgYXNzZXJ0QXJndW1lbnQodHlwZSwgYGludmFsaWQgdHlwZWQtZGF0YSBkb21haW4ga2V5OiAke0pTT04uc3RyaW5naWZ5KG5hbWUpfWAsIFwiZG9tYWluXCIsIGRvbWFpbik7XG4gICAgICAgICAgICBkb21haW5GaWVsZHMucHVzaCh7IG5hbWUsIHR5cGUgfSk7XG4gICAgICAgIH1cbiAgICAgICAgZG9tYWluRmllbGRzLnNvcnQoKGEsIGIpID0+IHtcbiAgICAgICAgICAgIHJldHVybiBkb21haW5GaWVsZE5hbWVzLmluZGV4T2YoYS5uYW1lKSAtIGRvbWFpbkZpZWxkTmFtZXMuaW5kZXhPZihiLm5hbWUpO1xuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIFR5cGVkRGF0YUVuY29kZXIuaGFzaFN0cnVjdChcIkVJUDcxMkRvbWFpblwiLCB7IEVJUDcxMkRvbWFpbjogZG9tYWluRmllbGRzIH0sIGRvbWFpbik7XG4gICAgfVxuICAgIC8qKlxuICAgICAqICBSZXR1cm4gdGhlIGZ1bGx5IGVuY29kZWQgW1tsaW5rLWVpcC03MTJdXSAlJXZhbHVlJSUgZm9yICUldHlwZXMlJSB3aXRoICUlZG9tYWluJSUuXG4gICAgICovXG4gICAgc3RhdGljIGVuY29kZShkb21haW4sIHR5cGVzLCB2YWx1ZSkge1xuICAgICAgICByZXR1cm4gY29uY2F0KFtcbiAgICAgICAgICAgIFwiMHgxOTAxXCIsXG4gICAgICAgICAgICBUeXBlZERhdGFFbmNvZGVyLmhhc2hEb21haW4oZG9tYWluKSxcbiAgICAgICAgICAgIFR5cGVkRGF0YUVuY29kZXIuZnJvbSh0eXBlcykuaGFzaCh2YWx1ZSlcbiAgICAgICAgXSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqICBSZXR1cm4gdGhlIGhhc2ggb2YgdGhlIGZ1bGx5IGVuY29kZWQgW1tsaW5rLWVpcC03MTJdXSAlJXZhbHVlJSUgZm9yICUldHlwZXMlJSB3aXRoICUlZG9tYWluJSUuXG4gICAgICovXG4gICAgc3RhdGljIGhhc2goZG9tYWluLCB0eXBlcywgdmFsdWUpIHtcbiAgICAgICAgcmV0dXJuIGtlY2NhazI1NihUeXBlZERhdGFFbmNvZGVyLmVuY29kZShkb21haW4sIHR5cGVzLCB2YWx1ZSkpO1xuICAgIH1cbiAgICAvLyBSZXBsYWNlcyBhbGwgYWRkcmVzcyB0eXBlcyB3aXRoIEVOUyBuYW1lcyB3aXRoIHRoZWlyIGxvb2tlZCB1cCBhZGRyZXNzXG4gICAgLyoqXG4gICAgICogUmVzb2x2ZXMgdG8gdGhlIHZhbHVlIGZyb20gcmVzb2x2aW5nIGFsbCBhZGRyZXNzZXMgaW4gJSV2YWx1ZSUlIGZvclxuICAgICAqICUldHlwZXMlJSBhbmQgdGhlICUlZG9tYWluJSUuXG4gICAgICovXG4gICAgc3RhdGljIGFzeW5jIHJlc29sdmVOYW1lcyhkb21haW4sIHR5cGVzLCB2YWx1ZSwgcmVzb2x2ZU5hbWUpIHtcbiAgICAgICAgLy8gTWFrZSBhIGNvcHkgdG8gaXNvbGF0ZSBpdCBmcm9tIHRoZSBvYmplY3QgcGFzc2VkIGluXG4gICAgICAgIGRvbWFpbiA9IE9iamVjdC5hc3NpZ24oe30sIGRvbWFpbik7XG4gICAgICAgIC8vIEFsbG93IHBhc3NpbmcgbnVsbCB0byBpZ25vcmUgdmFsdWVcbiAgICAgICAgZm9yIChjb25zdCBrZXkgaW4gZG9tYWluKSB7XG4gICAgICAgICAgICBpZiAoZG9tYWluW2tleV0gPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIGRlbGV0ZSBkb21haW5ba2V5XTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAvLyBMb29rIHVwIGFsbCBFTlMgbmFtZXNcbiAgICAgICAgY29uc3QgZW5zQ2FjaGUgPSB7fTtcbiAgICAgICAgLy8gRG8gd2UgbmVlZCB0byBsb29rIHVwIHRoZSBkb21haW4ncyB2ZXJpZnlpbmdDb250cmFjdD9cbiAgICAgICAgaWYgKGRvbWFpbi52ZXJpZnlpbmdDb250cmFjdCAmJiAhaXNIZXhTdHJpbmcoZG9tYWluLnZlcmlmeWluZ0NvbnRyYWN0LCAyMCkpIHtcbiAgICAgICAgICAgIGVuc0NhY2hlW2RvbWFpbi52ZXJpZnlpbmdDb250cmFjdF0gPSBcIjB4XCI7XG4gICAgICAgI
26774H1cbiAgICAgICAgLy8gV2UgYXJlIGdvaW5nIHRvIHVzZSB0aGUgZW5jb2RlciB0byB2aXNpdCBhbGwgdGhlIGJhc2UgdmFsdWVzXG4gICAgICAgIGNvbnN0IGVuY29kZXIgPSBUeXBlZERhdGFFbmNvZGVyLmZyb20odHlwZXMpO1xuICAgICAgICAvLyBHZXQgYSBsaXN0IG9mIGFsbCB0aGUgYWRkcmVzc2VzXG4gICAgICAgIGVuY29kZXIudmlzaXQodmFsdWUsICh0eXBlLCB2YWx1ZSkgPT4ge1xuICAgICAgICAgICAgaWYgKHR5cGUgPT09IFwiYWRkcmVzc1wiICYmICFpc0hleFN0cmluZyh2YWx1ZSwgMjApKSB7XG4gICAgICAgICAgICAgICAgZW5zQ2FjaGVbdmFsdWVdID0gXCIweFwiO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgICAgICB9KTtcbiAgICAgICAgLy8gTG9va3VwIGVhY2ggbmFtZVxuICAgICAgICBmb3IgKGNvbnN0IG5hbWUgaW4gZW5zQ2FjaGUpIHtcbiAgICAgICAgICAgIGVuc0NhY2hlW25hbWVdID0gYXdhaXQgcmVzb2x2ZU5hbWUobmFtZSk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gUmVwbGFjZSB0aGUgZG9tYWluIHZlcmlmeWluZ0NvbnRyYWN0IGlmIG5lZWRlZFxuICAgICAgICBpZiAoZG9tYWluLnZlcmlmeWluZ0NvbnRyYWN0ICYmIGVuc0NhY2hlW2RvbWFpbi52ZXJpZnlpbmdDb250cmFjdF0pIHtcbiAgICAgICAgICAgIGRvbWFpbi52ZXJpZnlpbmdDb250cmFjdCA9IGVuc0NhY2hlW2RvbWFpbi52ZXJpZnlpbmdDb250cmFjdF07XG4gICAgICAgIH1cbiAgICAgICAgLy8gUmVwbGFjZSBhbGwgRU5TIG5hbWVzIHdpdGggdGhlaXIgYWRkcmVzc1xuICAgICAgICB2YWx1ZSA9IGVuY29kZXIudmlzaXQodmFsdWUsICh0eXBlLCB2YWx1ZSkgPT4ge1xuICAgICAgICAgICAgaWYgKHR5cGUgPT09IFwiYWRkcmVzc1wiICYmIGVuc0NhY2hlW3ZhbHVlXSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBlbnNDYWNoZVt2YWx1ZV07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4geyBkb21haW4sIHZhbHVlIH07XG4gICAgfVxuICAgIC8qKlxuICAgICAqICBSZXR1cm5zIHRoZSBKU09OLWVuY29kZWQgcGF5bG9hZCBleHBlY3RlZCBieSBub2RlcyB3aGljaCBpbXBsZW1lbnRcbiAgICAgKiAgdGhlIEpTT04tUlBDIFtbbGluay1laXAtNzEyXV0gbWV0aG9kLlxuICAgICAqL1xuICAgIHN0YXRpYyBnZXRQYXlsb2FkKGRvbWFpbiwgdHlwZXMsIHZhbHVlKSB7XG4gICAgICAgIC8vIFZhbGlkYXRlIHRoZSBkb21haW4gZmllbGRzXG4gICAgICAgIFR5cGVkRGF0YUVuY29kZXIuaGFzaERvbWFpbihkb21haW4pO1xuICAgICAgICAvLyBEZXJpdmUgdGhlIEVJUDcxMkRvbWFpbiBTdHJ1Y3QgcmVmZXJlbmNlIHR5cGVcbiAgICAgICAgY29uc3QgZG9tYWluVmFsdWVzID0ge307XG4gICAgICAgIGNvbnN0IGRvbWFpblR5cGVzID0gW107XG4gICAgICAgIGRvbWFpbkZpZWxkTmFtZXMuZm9yRWFjaCgobmFtZSkgPT4ge1xuICAgICAgICAgICAgY29uc3QgdmFsdWUgPSBkb21haW5bbmFtZV07XG4gICAgICAgICAgICBpZiAodmFsdWUgPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGRvbWFpblZhbHVlc1tuYW1lXSA9IGRvbWFpbkNoZWNrc1tuYW1lXSh2YWx1ZSk7XG4gICAgICAgICAgICBkb21haW5UeXBlcy5wdXNoKHsgbmFtZSwgdHlwZTogZG9tYWluRmllbGRUeXBlc1tuYW1lXSB9KTtcbiAgICAgICAgfSk7XG4gICAgICAgIGNvbnN0IGVuY29kZXIgPSBUeXBlZERhdGFFbmNvZGVyLmZyb20odHlwZXMpO1xuICAgICAgICAvLyBHZXQgdGhlIG5vcm1hbGl6ZWQgdHlwZXNcbiAgICAgICAgdHlwZXMgPSBlbmNvZGVyLnR5cGVzO1xuICAgICAgICBjb25zdCB0eXBlc1dpdGhEb21haW4gPSBPYmplY3QuYXNzaWduKHt9LCB0eXBlcyk7XG4gICAgICAgIGFzc2VydEFyZ3VtZW50KHR5cGVzV2l0aERvbWFpbi5FSVA3MTJEb21haW4gPT0gbnVsbCwgXCJ0eXBlcyBtdXN0IG5vdCBjb250YWluIEVJUDcxMkRvbWFpbiB0eXBlXCIsIFwidHlwZXMuRUlQNzEyRG9tYWluXCIsIHR5cGVzKTtcbiAgICAgICAgdHlwZXNXaXRoRG9tYWluLkVJUDcxMkRvbWFpbiA9IGRvbWFpblR5cGVzO1xuICAgICAgICAvLyBWYWxpZGF0ZSB0aGUgZGF0YSBzdHJ1Y3R1cmVzIGFuZCB0eXBlc1xuICAgICAgICBlbmNvZGVyLmVuY29kZSh2YWx1ZSk7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICB0eXBlczogdHlwZXNXaXRoRG9tYWluLFxuICAgICAgICAgICAgZG9tYWluOiBkb21haW5WYWx1ZXMsXG4gICAgICAgICAgICBwcmltYXJ5VHlwZTogZW5jb2Rlci5wcmltYXJ5VHlwZSxcbiAgICAgICAgICAgIG1lc3NhZ2U6IGVuY29kZXIudmlzaXQodmFsdWUsICh0eXBlLCB2YWx1ZSkgPT4ge1xuICAgICAgICAgICAgICAgIC8vIGJ5dGVzXG4gICAgICAgICAgICAgICAgaWYgKHR5cGUubWF0Y2goL15ieXRlcyhcXGQqKS8pKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBoZXhsaWZ5KGdldEJ5dGVzKHZhbHVlKSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIC8vIHVpbnQgb3IgaW50XG4gICAgICAgICAgICAgICAgaWYgKHR5cGUubWF0Y2goL151P2ludC8pKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBnZXRCaWdJbnQodmFsdWUpLnRvU3RyaW5nKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHN3aXRjaCAodHlwZSkge1xuICAgICAgICAgICAgICAgICAgICBjYXNlIFwiYWRkcmVzc1wiOlxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHZhbHVlLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgXCJib29sXCI6XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gISF2YWx1ZTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSBcInN0cmluZ1wiOlxuICAgICAgICAgICAgICAgICAgICAgICAgYXNzZXJ0QXJndW1lbnQodHlwZW9mICh2YWx1ZSkgPT09IFwic3RyaW5nXCIsIFwiaW52YWxpZCBzdHJpbmdcIiwgXCJ2YWx1ZVwiLCB2YWx1ZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGFzc2VydEFyZ3VtZW50KGZhbHNlLCBcInVuc3VwcG9ydGVkIHR5cGVcIiwgXCJ0eXBlXCIsIHR5cGUpO1xuICAgICAgICAgICAgfSlcbiAgICAgICAgfTtcbiAgICB9XG59XG4vKipcbiAqICBDb21wdXRlIHRoZSBhZGRyZXNzIHVzZWQgdG8gc2lnbiB0aGUgdHlwZWQgZGF0YSBmb3IgdGhlICUlc2lnbmF0dXJlJSUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB2ZXJpZnlUeXBlZERhdGEoZG9tYWluLCB0eXBlcywgdmFsdWUsIHNpZ25hdHVyZSkge1xuICAgIHJldHVybi
26774ByZWNvdmVyQWRkcmVzcyhUeXBlZERhdGFFbmNvZGVyLmhhc2goZG9tYWluLCB0eXBlcywgdmFsdWUpLCBzaWduYXR1cmUpO1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9dHlwZWQtZGF0YS5qcy5tYXAiLCIvKipcbiAqICBBIGZyYWdtZW50IGlzIGEgc2luZ2xlIGl0ZW0gZnJvbSBhbiBBQkksIHdoaWNoIG1heSByZXByZXNlbnQgYW55IG9mOlxuICpcbiAqICAtIFtGdW5jdGlvbnNdKEZ1bmN0aW9uRnJhZ21lbnQpXG4gKiAgLSBbRXZlbnRzXShFdmVudEZyYWdtZW50KVxuICogIC0gW0NvbnN0cnVjdG9yc10oQ29uc3RydWN0b3JGcmFnbWVudClcbiAqICAtIEN1c3RvbSBbRXJyb3JzXShFcnJvckZyYWdtZW50KVxuICogIC0gW0ZhbGxiYWNrIG9yIFJlY2VpdmVdKEZhbGxiYWNrRnJhZ21lbnQpIGZ1bmN0aW9uc1xuICpcbiAqICBAX3N1YnNlY3Rpb24gYXBpL2FiaS9hYmktY29kZXI6RnJhZ21lbnRzICBbYWJvdXQtZnJhZ21lbnRzXVxuICovXG5pbXBvcnQgeyBkZWZpbmVQcm9wZXJ0aWVzLCBnZXRCaWdJbnQsIGdldE51bWJlciwgYXNzZXJ0LCBhc3NlcnRQcml2YXRlLCBhc3NlcnRBcmd1bWVudCB9IGZyb20gXCIuLi91dGlscy9pbmRleC5qc1wiO1xuaW1wb3J0IHsgaWQgfSBmcm9tIFwiLi4vaGFzaC9pbmRleC5qc1wiO1xuO1xuLy8gWyBcImFcIiwgXCJiXCIgXSA9PiB7IFwiYVwiOiAxLCBcImJcIjogMSB9XG5mdW5jdGlvbiBzZXRpZnkoaXRlbXMpIHtcbiAgICBjb25zdCByZXN1bHQgPSBuZXcgU2V0KCk7XG4gICAgaXRlbXMuZm9yRWFjaCgoaykgPT4gcmVzdWx0LmFkZChrKSk7XG4gICAgcmV0dXJuIE9iamVjdC5mcmVlemUocmVzdWx0KTtcbn1cbmNvbnN0IF9rd1Zpc2liRGVwbG95ID0gXCJleHRlcm5hbCBwdWJsaWMgcGF5YWJsZSBvdmVycmlkZVwiO1xuY29uc3QgS3dWaXNpYkRlcGxveSA9IHNldGlmeShfa3dWaXNpYkRlcGxveS5zcGxpdChcIiBcIikpO1xuLy8gVmlzaWJpbGl0eSBLZXl3b3Jkc1xuY29uc3QgX2t3VmlzaWIgPSBcImNvbnN0YW50IGV4dGVybmFsIGludGVybmFsIHBheWFibGUgcHJpdmF0ZSBwdWJsaWMgcHVyZSB2aWV3IG92ZXJyaWRlXCI7XG5jb25zdCBLd1Zpc2liID0gc2V0aWZ5KF9rd1Zpc2liLnNwbGl0KFwiIFwiKSk7XG5jb25zdCBfa3dUeXBlcyA9IFwiY29uc3RydWN0b3IgZXJyb3IgZXZlbnQgZmFsbGJhY2sgZnVuY3Rpb24gcmVjZWl2ZSBzdHJ1Y3RcIjtcbmNvbnN0IEt3VHlwZXMgPSBzZXRpZnkoX2t3VHlwZXMuc3BsaXQoXCIgXCIpKTtcbmNvbnN0IF9rd01vZGlmaWVycyA9IFwiY2FsbGRhdGEgbWVtb3J5IHN0b3JhZ2UgcGF5YWJsZSBpbmRleGVkXCI7XG5jb25zdCBLd01vZGlmaWVycyA9IHNldGlmeShfa3dNb2RpZmllcnMuc3BsaXQoXCIgXCIpKTtcbmNvbnN0IF9rd090aGVyID0gXCJ0dXBsZSByZXR1cm5zXCI7XG4vLyBBbGwgS2V5d29yZHNcbmNvbnN0IF9rZXl3b3JkcyA9IFtfa3dUeXBlcywgX2t3TW9kaWZpZXJzLCBfa3dPdGhlciwgX2t3VmlzaWJdLmpvaW4oXCIgXCIpO1xuY29uc3QgS2V5d29yZHMgPSBzZXRpZnkoX2tleXdvcmRzLnNwbGl0KFwiIFwiKSk7XG4vLyBTaW5nbGUgY2hhcmFjdGVyIHRva2Vuc1xuY29uc3QgU2ltcGxlVG9rZW5zID0ge1xuICAgIFwiKFwiOiBcIk9QRU5fUEFSRU5cIiwgXCIpXCI6IFwiQ0xPU0VfUEFSRU5cIixcbiAgICBcIltc
26774IjogXCJPUEVOX0JSQUNLRVRcIiwgXCJdXCI6IFwiQ0xPU0VfQlJBQ0tFVFwiLFxuICAgIFwiLFwiOiBcIkNPTU1BXCIsIFwiQFwiOiBcIkFUXCJcbn07XG4vLyBQYXJzZXIgcmVnZXhlcyB0byBjb25zdW1lIHRoZSBuZXh0IHRva2VuXG5jb25zdCByZWdleFdoaXRlc3BhY2VQcmVmaXggPSBuZXcgUmVnRXhwKFwiXihcXFxccyopXCIpO1xuY29uc3QgcmVnZXhOdW1iZXJQcmVmaXggPSBuZXcgUmVnRXhwKFwiXihbMC05XSspXCIpO1xuY29uc3QgcmVnZXhJZFByZWZpeCA9IG5ldyBSZWdFeHAoXCJeKFthLXpBLVokX11bYS16QS1aMC05JF9dKilcIik7XG4vLyBQYXJzZXIgcmVnZXhzIHRvIGNoZWNrIHZhbGlkaXR5XG5jb25zdCByZWdleElkID0gbmV3IFJlZ0V4cChcIl4oW2EtekEtWiRfXVthLXpBLVowLTkkX10qKSRcIik7XG5jb25zdCByZWdleFR5cGUgPSBuZXcgUmVnRXhwKFwiXihhZGRyZXNzfGJvb2x8Ynl0ZXMoWzAtOV0qKXxzdHJpbmd8dT9pbnQoWzAtOV0qKSkkXCIpO1xuY2xhc3MgVG9rZW5TdHJpbmcge1xuICAgICNvZmZzZXQ7XG4gICAgI3Rva2VucztcbiAgICBnZXQgb2Zmc2V0KCkgeyByZXR1cm4gdGhpcy4jb2Zmc2V0OyB9XG4gICAgZ2V0IGxlbmd0aCgpIHsgcmV0dXJuIHRoaXMuI3Rva2Vucy5sZW5ndGggLSB0aGlzLiNvZmZzZXQ7IH1cbiAgICBjb25zdHJ1Y3Rvcih0b2tlbnMpIHtcbiAgICAgICAgdGhpcy4jb2Zmc2V0ID0gMDtcbiAgICAgICAgdGhpcy4jdG9rZW5zID0gdG9rZW5zLnNsaWNlKCk7XG4gICAgfVxuICAgIGNsb25lKCkgeyByZXR1cm4gbmV3IFRva2VuU3RyaW5nKHRoaXMuI3Rva2Vucyk7IH1cbiAgICByZXNldCgpIHsgdGhpcy4jb2Zmc2V0ID0gMDsgfVxuICAgICNzdWJUb2tlblN0cmluZyhmcm9tID0gMCwgdG8gPSAwKSB7XG4gICAgICAgIHJldHVybiBuZXcgVG9rZW5TdHJpbmcodGhpcy4jdG9rZW5zLnNsaWNlKGZyb20sIHRvKS5tYXAoKHQpID0+IHtcbiAgICAgICAgICAgIHJldHVybiBPYmplY3QuZnJlZXplKE9iamVjdC5hc3NpZ24oe30sIHQsIHtcbiAgICAgICAgICAgICAgICBtYXRjaDogKHQubWF0Y2ggLSBmcm9tKSxcbiAgICAgICAgICAgICAgICBsaW5rQmFjazogKHQubGlua0JhY2sgLSBmcm9tKSxcbiAgICAgICAgICAgICAgICBsaW5rTmV4dDogKHQubGlua05leHQgLSBmcm9tKSxcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfSkpO1xuICAgIH1cbiAgICAvLyBQb3BzIGFuZCByZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgbmV4dCB0b2tlbiwgaWYgaXQgaXMgYSBrZXl3b3JkIGluIGFsbG93ZWQ7IHRocm93cyBpZiBvdXQgb2YgdG9rZW5zXG4gICAgcG9wS2V5d29yZChhbGxvd2VkKSB7XG4gICAgICAgIGNvbnN0IHRvcCA9IHRoaXMucGVlaygpO1xuICAgICAgICBpZiAodG9wLnR5cGUgIT09IFwiS0VZV09SRFwiIHx8ICFhbGxvd2VkLmhhcyh0b3AudGV4dCkpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgZXhwZWN0ZWQga2V5d29yZCAke3RvcC50ZXh0fWApO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLnBvcCgpLnRleHQ7XG4gICAgfVxuICAgIC8vIFBvcHMgYW5kIHJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSBuZXh0IHRva2VuIGlmIGl0IGlzIGB0eXBlYDsgdGhyb3dzIGlmIG91dCBvZiB0b2tlbnNcbiAgICBwb3BUeXBlKHR5cGUpIHtcbiAgICAgICAgaWYgKHRoaXMucGVlaygpLnR5cGUgIT09IHR5cGUpIHtcbiAgICAgICAgICAgIGNvbnN0IHRvcCA9IHRoaXMucGVlaygpO1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBleHBlY3RlZCAke3R5cGV9OyBnb3QgJHt0b3AudHlwZX0gJHtKU09OLnN0cmluZ2lmeSh0b3AudGV4dCl9YCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMucG9wKCkudGV4dDtcbiAgICB9XG4gICAgLy8gUG9wcyBhbmQgcmV0dXJucyBhIFwiKFwiIFRPS0VOUyBcIilcIlxuICAgIHBvcFBhcmVuKCkge1xuICAgICAgICBjb25zdCB0b3AgPSB0aGlzLnBlZWsoKTtcbiAgICAgICAgaWYgKHRvcC50eXBlICE9PSBcIk9QRU5fUEFSRU5cIikge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiYmFkIHN0YXJ0XCIpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IHRoaXMuI3N1YlRva2VuU3RyaW5nKHRoaXMuI29mZnNldCArIDEsIHRvcC5tYXRjaCArIDEpO1xuICAgICAgICB0aGlzLiNvZmZzZXQgPSB0b3AubWF0Y2ggKyAxO1xuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbiAgICAvLyBQb3BzIGFuZCByZXR1cm5zIHRoZSBpdGVtcyB3aXRoaW4gXCIoXCIgSVRFTTEgXCIsXCIgSVRFTTIgXCIsXCIgLi4uIFwiKVwiXG4gICAgcG9wUGFyYW1zKCkge1xuICAgICAgICBjb25zdCB0b3AgPSB0aGlzLnBlZWsoKTtcbiAgICAgICAgaWYgKHRvcC50eXBlICE9PSBcIk9QRU5fUEFSRU5cIikge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiYmFkIHN0YXJ0XCIpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IFtdO1xuICAgICAgICB3aGlsZSAodGhpcy4jb2Zmc2V0IDwgdG9wLm1hdGNoIC0gMSkge1xuICAgICAgICAgICAgY29uc3QgbGluayA9IHRoaXMucGVlaygpLmxpbmtOZXh0O1xuICAgICAgICAgICAgcmVzdWx0LnB1c2godGhpcy4jc3ViVG9rZW5TdHJpbmcodGhpcy4jb2Zmc2V0ICsgMSwgbGluaykpO1xuICAgICAgICAgICAgdGhpcy4jb2Zmc2V0ID0gbGluaztcbiAgICAgICAgfVxuICAgICAgICB0aGlzLiNvZmZzZXQgPSB0b3AubWF0Y2ggKyAxO1xuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbiAgICAvLyBSZXR1cm5zIHRoZSB0b3AgVG9rZW4sIHRocm93aW5nIGlmIG91dCBvZiB0b2tlbnNcbiAgICBwZWVrKCkge1xuICAgICAgICBpZiAodGhpcy4jb2Zmc2V0ID49IHRoaXMuI3Rva2Vucy5sZW5ndGgpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIm91dC1vZi1ib3VuZHNcIik7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuI3Rva2Vuc1t0aGlzLiNvZmZzZXRdO1xuICAgIH1cbiAgICAvLyBSZXR1cm5zIHRoZSBuZXh0IHZhbHVlLCBpZiBpdCBpcyBhIGtleXdvcmQgaW4gYGFsbG93ZWRgXG4gICAgcGVla0tleXdvcmQoYWxsb3dlZCkge1xuICAgICAgICBjb25zdCB0b3AgPSB0aGlzLnBlZWtUeXBlKFwiS0VZV09SRFwiKTtcbiAgICAgICAgcmV0dXJuICh0b3AgIT0gbnVsbCAmJiBhbGxvd2VkLmhhcyh0b3ApKSA/IHRvcCA6IG51bGw7XG4gICAgfVxuICAgIC8vIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSBuZXh0IHRva2VuIGlmIGl0IGlzIGB0eXBlYFxuICAgIHBlZWtUeXBlKHR5cGUpIHtcbiAgICAgICAgaWYgKHRoaXMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCB0b3AgPSB0aGlzLnBlZWsoKTtcbiAgICAgICAgcmV0dXJuICh0b3AudHlwZSA9PT0gdHlwZSkgPyB0b3AudGV4dCA6IG51bGw7XG4gICAgfVxuICAgIC8vIFJldHVybnMgdGhlIG5leHQgdG9rZW47IHRocm93cyBpZiBvdXQgb2YgdG9rZW5zXG4gICAgcG9wKCkge1xuICAgICAgICBjb25zdCByZXN1bHQgPSB0aGlzLnBlZWsoKTtcbiAgICAgICAgdGhpcy4jb2Zmc2V0Kys7XG4gICAgICAgI
26774HJldHVybiByZXN1bHQ7XG4gICAgfVxuICAgIHRvU3RyaW5nKCkge1xuICAgICAgICBjb25zdCB0b2tlbnMgPSBbXTtcbiAgICAgICAgZm9yIChsZXQgaSA9IHRoaXMuI29mZnNldDsgaSA8IHRoaXMuI3Rva2Vucy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgY29uc3QgdG9rZW4gPSB0aGlzLiN0b2tlbnNbaV07XG4gICAgICAgICAgICB0b2tlbnMucHVzaChgJHt0b2tlbi50eXBlfToke3Rva2VuLnRleHR9YCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGA8VG9rZW5TdHJpbmcgJHt0b2tlbnMuam9pbihcIiBcIil9PmA7XG4gICAgfVxufVxuZnVuY3Rpb24gbGV4KHRleHQpIHtcbiAgICBjb25zdCB0b2tlbnMgPSBbXTtcbiAgICBjb25zdCB0aHJvd0Vycm9yID0gKG1lc3NhZ2UpID0+IHtcbiAgICAgICAgY29uc3QgdG9rZW4gPSAob2Zmc2V0IDwgdGV4dC5sZW5ndGgpID8gSlNPTi5zdHJpbmdpZnkodGV4dFtvZmZzZXRdKSA6IFwiJEVPSVwiO1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYGludmFsaWQgdG9rZW4gJHt0b2tlbn0gYXQgJHtvZmZzZXR9OiAke21lc3NhZ2V9YCk7XG4gICAgfTtcbiAgICBsZXQgYnJhY2tldHMgPSBbXTtcbiAgICBsZXQgY29tbWFzID0gW107XG4gICAgbGV0IG9mZnNldCA9IDA7XG4gICAgd2hpbGUgKG9mZnNldCA8IHRleHQubGVuZ3RoKSB7XG4gICAgICAgIC8vIFN0cmlwIG9mZiBhbnkgbGVhZGluZyB3aGl0ZXNwYWNlXG4gICAgICAgIGxldCBjdXIgPSB0ZXh0LnN1YnN0cmluZyhvZmZzZXQpO1xuICAgICAgICBsZXQgbWF0Y2ggPSBjdXIubWF0Y2gocmVnZXhXaGl0ZXNwYWNlUHJlZml4KTtcbiAgICAgICAgaWYgKG1hdGNoKSB7XG4gICAgICAgICAgICBvZmZzZXQgKz0gbWF0Y2hbMV0ubGVuZ3RoO1xuICAgICAgICAgICAgY3VyID0gdGV4dC5zdWJzdHJpbmcob2Zmc2V0KTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCB0b2tlbiA9IHsgZGVwdGg6IGJyYWNrZXRzLmxlbmd0aCwgbGlua0JhY2s6IC0xLCBsaW5rTmV4dDogLTEsIG1hdGNoOiAtMSwgdHlwZTogXCJcIiwgdGV4dDogXCJcIiwgb2Zmc2V0LCB2YWx1ZTogLTEgfTtcbiAgICAgICAgdG9rZW5zLnB1c2godG9rZW4pO1xuICAgICAgICBsZXQgdHlwZSA9IChTaW1wbGVUb2tlbnNbY3VyWzBdXSB8fCBcIlwiKTtcbiAgICAgICAgaWYgKHR5cGUpIHtcbiAgICAgICAgICAgIHRva2VuLnR5cGUgPSB0eXBlO1xuICAgICAgICAgICAgdG9rZW4udGV4dCA9IGN1clswXTtcbiAgICAgICAgICAgIG9mZnNldCsrO1xuICAgICAgICAgICAgaWYgKHR5cGUgPT09IFwiT1BFTl9QQVJFTlwiKSB7XG4gICAgICAgICAgICAgICAgYnJhY2tldHMucHVzaCh0b2tlbnMubGVuZ3RoIC0gMSk7XG4gICAgICAgICAgICAgICAgY29tbWFzLnB1c2godG9rZW5zLmxlbmd0aCAtIDEpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAodHlwZSA9PSBcIkNMT1NFX1BBUkVOXCIpIHtcbiAgICAgICAgICAgICAgICBpZiAoYnJhY2tldHMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgIHRocm93RXJyb3IoXCJubyBtYXRjaGluZyBvcGVuIGJyYWNrZXRcIik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHRva2VuLm1hdGNoID0gYnJhY2tldHMucG9wKCk7XG4gICAgICAgICAgICAgICAgKHRva2Vuc1t0b2tlbi5tYXRjaF0pLm1hdGNoID0gdG9rZW5zLmxlbmd0aCAtIDE7XG4gICAgICAgICAgICAgICAgdG9rZW4uZGVwdGgtLTtcbiAgICAgICAgICAgICAgICB0b2tlbi5saW5rQmFjayA9IGNvbW1hcy5wb3AoKTtcbiAgICAgICAgICAgICAgICAodG9rZW5zW3Rva2VuLmxpbmtCYWNrXSkubGlua05leHQgPSB0b2tlbnMubGVuZ3RoIC0gMTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKHR5cGUgPT09IFwiQ09NTUFcIikge1xuICAgICAgICAgICAgICAgIHRva2VuLmxpbmtCYWNrID0gY29tbWFzLnBvcCgpO1xuICAgICAgICAgICAgICAgICh0b2tlbnNbdG9rZW4ubGlua0JhY2tdKS5saW5rTmV4dCA9IHRva2Vucy5sZW5ndGggLSAxO1xuICAgICAgICAgICAgICAgIGNvbW1hcy5wdXNoKHRva2Vucy5sZW5ndGggLSAxKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKHR5cGUgPT09IFwiT1BFTl9CUkFDS0VUXCIpIHtcbiAgICAgICAgICAgICAgICB0b2tlbi50eXBlID0gXCJCUkFDS0VUXCI7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmICh0eXBlID09PSBcIkNMT1NFX0JSQUNLRVRcIikge1xuICAgICAgICAgICAgICAgIC8vIFJlbW92ZSB0aGUgQ0xPU0VfQlJBQ0tFVFxuICAgICAgICAgICAgICAgIGxldCBzdWZmaXggPSB0b2tlbnMucG9wKCkudGV4dDtcbiAgICAgICAgICAgICAgICBpZiAodG9rZW5zLmxlbmd0aCA+IDAgJiYgdG9rZW5zW3Rva2Vucy5sZW5ndGggLSAxXS50eXBlID09PSBcIk5VTUJFUlwiKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gdG9rZW5zLnBvcCgpLnRleHQ7XG4gICAgICAgICAgICAgICAgICAgIHN1ZmZpeCA9IHZhbHVlICsgc3VmZml4O1xuICAgICAgICAgICAgICAgICAgICAodG9rZW5zW3Rva2Vucy5sZW5ndGggLSAxXSkudmFsdWUgPSBnZXROdW1iZXIodmFsdWUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAodG9rZW5zLmxlbmd0aCA9PT0gMCB8fCB0b2tlbnNbdG9rZW5zLmxlbmd0aCAtIDFdLnR5cGUgIT09IFwiQlJBQ0tFVFwiKSB7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIm1pc3Npbmcgb3BlbmluZyBicmFja2V0XCIpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAodG9rZW5zW3Rva2Vucy5sZW5ndGggLSAxXSkudGV4dCArPSBzdWZmaXg7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICBtYXRjaCA9IGN1ci5tYXRjaChyZWdleElkUHJlZml4KTtcbiAgICAgICAgaWYgKG1hdGNoKSB7XG4gICAgICAgICAgICB0b2tlbi50ZXh0ID0gbWF0Y2hbMV07XG4gICAgICAgICAgICBvZmZzZXQgKz0gdG9rZW4udGV4dC5sZW5ndGg7XG4gICAgICAgICAgICBpZiAoS2V5d29yZHMuaGFzKHRva2VuLnRleHQpKSB7XG4gICAgICAgICAgICAgICAgdG9rZW4udHlwZSA9IFwiS0VZV09SRFwiO1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHRva2VuLnRleHQubWF0Y2gocmVnZXhUeXBlKSkge1xuICAgICAgICAgICAgICAgI
26774HRva2VuLnR5cGUgPSBcIlRZUEVcIjtcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRva2VuLnR5cGUgPSBcIklEXCI7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICBtYXRjaCA9IGN1ci5tYXRjaChyZWdleE51bWJlclByZWZpeCk7XG4gICAgICAgIGlmIChtYXRjaCkge1xuICAgICAgICAgICAgdG9rZW4udGV4dCA9IG1hdGNoWzFdO1xuICAgICAgICAgICAgdG9rZW4udHlwZSA9IFwiTlVNQkVSXCI7XG4gICAgICAgICAgICBvZmZzZXQgKz0gdG9rZW4udGV4dC5sZW5ndGg7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYHVuZXhwZWN0ZWQgdG9rZW4gJHtKU09OLnN0cmluZ2lmeShjdXJbMF0pfSBhdCBwb3NpdGlvbiAke29mZnNldH1gKTtcbiAgICB9XG4gICAgcmV0dXJuIG5ldyBUb2tlblN0cmluZyh0b2tlbnMubWFwKCh0KSA9PiBPYmplY3QuZnJlZXplKHQpKSk7XG59XG4vLyBDaGVjayBvbmx5IG9uZSBvZiBgYWxsb3dlZGAgaXMgaW4gYHNldGBcbmZ1bmN0aW9uIGFsbG93U2luZ2xlKHNldCwgYWxsb3dlZCkge1xuICAgIGxldCBpbmNsdWRlZCA9IFtdO1xuICAgIGZvciAoY29uc3Qga2V5IGluIGFsbG93ZWQua2V5cygpKSB7XG4gICAgICAgIGlmIChzZXQuaGFzKGtleSkpIHtcbiAgICAgICAgICAgIGluY2x1ZGVkLnB1c2goa2V5KTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBpZiAoaW5jbHVkZWQubGVuZ3RoID4gMSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYGNvbmZsaWN0aW5nIHR5cGVzOiAke2luY2x1ZGVkLmpvaW4oXCIsIFwiKX1gKTtcbiAgICB9XG59XG4vLyBGdW5jdGlvbnMgdG8gcHJvY2VzcyBhIFNvbGlkaXR5IFNpZ25hdHVyZSBUb2tlblN0cmluZyBmcm9tIGxlZnQtdG8tcmlnaHQgZm9yLi4uXG4vLyAuLi50aGUgbmFtZSB3aXRoIGFuIG9wdGlvbmFsIHR5cGUsIHJldHVybmluZyB0aGUgbmFtZVxuZnVuY3Rpb24gY29uc3VtZU5hbWUodHlwZSwgdG9rZW5zKSB7XG4gICAgaWYgKHRva2Vucy5wZWVrS2V5d29yZChLd1R5cGVzKSkge1xuICAgICAgICBjb25zdCBrZXl3b3JkID0gdG9rZW5zLnBvcCgpLnRleHQ7XG4gICAgICAgIGlmIChrZXl3b3JkICE9PSB0eXBlKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYGV4cGVjdGVkICR7dHlwZX0sIGdvdCAke2tleXdvcmR9YCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHRva2Vucy5wb3BUeXBlKFwiSURcIik7XG59XG4vLyAuLi5hbGwga2V5d29yZHMgbWF0Y2hpbmcgYWxsb3dlZCwgcmV0dXJuaW5nIHRoZSBrZXl3b3Jkc1xuZnVuY3Rpb24gY29uc3VtZUtleXdvcmRzKHRva2VucywgYWxsb3dlZCkge1xuICAgIGNvbnN0IGtleXdvcmRzID0gbmV3IFNldCgpO1xuICAgIHdoaWxlICh0cnVlKSB7XG4gICAgICAgIGNvbnN0IGtleXdvcmQgPSB0b2tlbnMucGVla1R5cGUoXCJLRVlXT1JEXCIpO1xuICAgICAgICBpZiAoa2V5d29yZCA9PSBudWxsIHx8IChhbGxvd2VkICYmICFhbGxvd2VkLmhhcyhrZXl3b3JkKSkpIHtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIHRva2Vucy5wb3AoKTtcbiAgICAgICAgaWYgKGtleXdvcmRzLmhhcyhrZXl3b3JkKSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBkdXBsaWNhdGUga2V5d29yZHM6ICR7SlNPTi5zdHJpbmdpZnkoa2V5d29yZCl9YCk7XG4gICAgICAgIH1cbiAgICAgICAga2V5d29yZHMuYWRkKGtleXdvcmQpO1xuICAgIH1cbiAgICByZXR1cm4gT2JqZWN0LmZyZWV6ZShrZXl3b3Jkcyk7XG59XG4vLyAuLi5hbGwgdmlzaWJpbGl0eSBrZXl3b3JkcywgcmV0dXJuaW5nIHRoZSBjb2FsZXNjZWQgbXV0YWJpbGl0eVxuZnVuY3Rpb24gY29uc3VtZU11dGFiaWxpdHkodG9rZW5zKSB7XG4gICAgbGV0IG1vZGlmaWVycyA9IGNvbnN1bWVLZXl3b3Jkcyh0b2tlbnMsIEt3VmlzaWIpO1xuICAgIC8vIERldGVjdCBjb25mbGljdGluZyBtb2RpZmllcnNcbiAgICBhbGxvd1NpbmdsZShtb2RpZmllcnMsIHNldGlmeShcImNvbnN0YW50IHBheWFibGUgbm9ucGF5YWJsZVwiLnNwbGl0KFwiIFwiKSkpO1xuICAgIGFsbG93U2luZ2xlKG1vZGlmaWVycywgc2V0aWZ5KFwicHVyZSB2aWV3IHBheWFibGUgbm9ucGF5YWJsZVwiLnNwbGl0KFwiIFwiKSkpO1xuICAgIC8vIFByb2Nlc3MgbXV0YWJpbGl0eSBzdGF0ZXNcbiAgICBpZiAobW9kaWZpZXJzLmhhcyhcInZpZXdcIikpIHtcbiAgICAgICAgcmV0dXJuIFwidmlld1wiO1xuICAgIH1cbiAgICBpZiAobW9kaWZpZXJzLmhhcyhcInB1cmVcIikpIHtcbiAgICAgICAgcmV0dXJuIFwicHVyZVwiO1xuICAgIH1cbiAgICBpZiAobW9kaWZpZXJzLmhhcyhcInBheWFibGVcIikpIHtcbiAgICAgICAgcmV0dXJuIFwicGF5YWJsZVwiO1xuICAgIH1cbiAgICBpZiAobW9kaWZpZXJzLmhhcyhcIm5vbnBheWFibGVcIikpIHtcbiAgICAgICAgcmV0dXJuIFwibm9ucGF5YWJsZVwiO1xuICAgIH1cbiAgICAvLyBQcm9jZXNzIGxlZ2FjeSBgY29uc3RhbnRgIGxhc3RcbiAgICBpZiAobW9kaWZpZXJzLmhhcyhcImNvbnN0YW50XCIpKSB7XG4gICAgICAgIHJldHVybiBcInZpZXdcIjtcbiAgICB9XG4gICAgcmV0dXJuIFwibm9ucGF5YWJsZVwiO1xufVxuLy8gLi4uYSBwYXJhbWV0ZXIgbGlzdCwgcmV0dXJuaW5nIHRoZSBQYXJhbVR5cGUgbGlzdFxuZnVuY3Rpb24gY29uc3VtZVBhcmFtcyh0b2tlbnMsIGFsbG93SW5kZXhlZCkge1xuICAgIHJldHVybiB0b2tlbnMucG9wUGFyYW1zKCkubWFwKCh0KSA9PiBQYXJhbVR5cGUuZnJvbSh0LCBhbGxvd0luZGV4ZWQpKTtcbn1cbi8vIC4uLmEgZ2FzIGxpbWl0LCByZXR1cm5pbmcgYSBCaWdOdW1iZXIgb3IgbnVsbCBpZiBub25lXG5mdW5jdGlvbiBjb25zdW1lR2FzKHRva2Vucykge1xuICAgIGlmICh0b2tlbnMucGVla1R5cGUoXCJBVFwiKSkge1xuICAgICAgICB0b2tlbnMucG9wKCk7XG4gICAgICAgIGlmICh0b2tlbnMucGVla1R5cGUoXCJOVU1CRVJcIikpIHtcbiAgICAgICAgICAgIHJldHVybiBnZXRCaWdJbnQodG9rZW5zLnBvcCgpLnRleHQpO1xuICAgICAgICB9XG4gICAgICAgI
26774HRocm93IG5ldyBFcnJvcihcImludmFsaWQgZ2FzXCIpO1xuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbn1cbmZ1bmN0aW9uIGNvbnN1bWVFb2kodG9rZW5zKSB7XG4gICAgaWYgKHRva2Vucy5sZW5ndGgpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGB1bmV4cGVjdGVkIHRva2VucyBhdCBvZmZzZXQgJHt0b2tlbnMub2Zmc2V0fTogJHt0b2tlbnMudG9TdHJpbmcoKX1gKTtcbiAgICB9XG59XG5jb25zdCByZWdleEFycmF5VHlwZSA9IG5ldyBSZWdFeHAoL14oLiopXFxbKFswLTldKilcXF0kLyk7XG5mdW5jdGlvbiB2ZXJpZnlCYXNpY1R5cGUodHlwZSkge1xuICAgIGNvbnN0IG1hdGNoID0gdHlwZS5tYXRjaChyZWdleFR5cGUpO1xuICAgIGFzc2VydEFyZ3VtZW50KG1hdGNoLCBcImludmFsaWQgdHlwZVwiLCBcInR5cGVcIiwgdHlwZSk7XG4gICAgaWYgKHR5cGUgPT09IFwidWludFwiKSB7XG4gICAgICAgIHJldHVybiBcInVpbnQyNTZcIjtcbiAgICB9XG4gICAgaWYgKHR5cGUgPT09IFwiaW50XCIpIHtcbiAgICAgICAgcmV0dXJuIFwiaW50MjU2XCI7XG4gICAgfVxuICAgIGlmIChtYXRjaFsyXSkge1xuICAgICAgICAvLyBieXRlc1hYXG4gICAgICAgIGNvbnN0IGxlbmd0aCA9IHBhcnNlSW50KG1hdGNoWzJdKTtcbiAgICAgICAgYXNzZXJ0QXJndW1lbnQobGVuZ3RoICE9PSAwICYmIGxlbmd0aCA8PSAzMiwgXCJpbnZhbGlkIGJ5dGVzIGxlbmd0aFwiLCBcInR5cGVcIiwgdHlwZSk7XG4gICAgfVxuICAgIGVsc2UgaWYgKG1hdGNoWzNdKSB7XG4gICAgICAgIC8vIGludFhYIG9yIHVpbnRYWFxuICAgICAgICBjb25zdCBzaXplID0gcGFyc2VJbnQobWF0Y2hbM10pO1xuICAgICAgICBhc3NlcnRBcmd1bWVudChzaXplICE9PSAwICYmIHNpemUgPD0gMjU2ICYmIChzaXplICUgOCkgPT09IDAsIFwiaW52YWxpZCBudW1lcmljIHdpZHRoXCIsIFwidHlwZVwiLCB0eXBlKTtcbiAgICB9XG4gICAgcmV0dXJuIHR5cGU7XG59XG4vLyBNYWtlIHRoZSBGcmFnbWVudCBjb25zdHJ1Y3RvcnMgZWZmZWN0aXZlbHkgcHJpdmF0ZVxuY29uc3QgX2d1YXJkID0ge307XG5jb25zdCBpbnRlcm5hbCA9IFN5bWJvbC5mb3IoXCJfZXRoZXJzX2ludGVybmFsXCIpO1xuY29uc3QgUGFyYW1UeXBlSW50ZXJuYWwgPSBcIl9QYXJhbVR5cGVJbnRlcm5hbFwiO1xuY29uc3QgRXJyb3JGcmFnbWVudEludGVybmFsID0gXCJfRXJyb3JJbnRlcm5hbFwiO1xuY29uc3QgRXZlbnRGcmFnbWVudEludGVybmFsID0gXCJfRXZlbnRJbnRlcm5hbFwiO1xuY29uc3QgQ29uc3RydWN0b3JGcmFnbWVudEludGVybmFsID0gXCJfQ29uc3RydWN0b3JJbnRlcm5hbFwiO1xuY29uc3QgRmFsbGJhY2tGcmFnbWVudEludGVybmFsID0gXCJfRmFsbGJhY2tJbnRlcm5hbFwiO1xuY29uc3QgRnVuY3Rpb25GcmFnbWVudEludGVybmFsID0gXCJfRnVuY3Rpb25JbnRlcm5hbFwiO1xuY29uc3QgU3RydWN0RnJhZ21lbnRJbnRlcm5hbCA9IFwiX1N0cnVjdEludGVybmFsXCI7XG4vKipcbiAqICBFYWNoIGlucHV0IGFuZCBvdXRwdXQgb2YgYSBbW0ZyYWdtZW50XV0gaXMgYW4gQXJyYXkgb2YgKipQYXJhbVR5cGUqKi5cbiAqL1xuZXhwb3J0IGNsYXNzIFBhcmFtVHlwZSB7XG4gICAgLyoqXG4gICAgICogIFRoZSBsb2NhbCBuYW1lIG9mIHRoZSBwYXJhbWV0ZXIgKG9yIGBgXCJcImBgIGlmIHVuYm91bmQpXG4gICAgICovXG4gICAgbmFtZTtcbiAgICAvKipcbiAgICAgKiAgVGhlIGZ1bGx5IHF1YWxpZmllZCB0eXBlIChlLmcuIGBgXCJhZGRyZXNzXCJgYCwgYGBcInR1cGxlKGFkZHJlc3MpXCJgYCxcbiAgICAgKiAgYGBcInVpbnQyNTZbM11bXVwiYGApXG4gICAgICovXG4gICAgdHlwZTtcbiAgICAvKipcbiAgICAgKiAgVGhlIGJhc2UgdHlwZSAoZS5nLiBgYFwiYWRkcmVzc1wiYGAsIGBgXCJ0dXBsZVwiYGAsIGBgXCJhcnJheVwiYGApXG4gICAgICovXG4gICAgYmFzZVR5cGU7XG4gICAgLyoqXG4gICAgICogIFRydWUgaWYgdGhlIHBhcmFtZXRlcnMgaXMgaW5kZXhlZC5cbiAgICAgKlxuICAgICAqICBGb3Igbm9uLWluZGV4YWJsZSB0eXBlcyB0aGlzIGlzIGBgbnVsbGBgLlxuICAgICAqL1xuICAgIGluZGV4ZWQ7XG4gICAgLyoqXG4gICAgICogIFRoZSBjb21wb25lbnRzIGZvciB0aGUgdHVwbGUuXG4gICAgICpcbiAgICAgKiAgRm9yIG5vbi10dXBsZSB0eXBlcyB0aGlzIGlzIGBgbnVsbGBgLlxuICAgICAqL1xuICAgIGNvbXBvbmVudHM7XG4gICAgLyoqXG4gICAgICogIFRoZSBhcnJheSBsZW5ndGgsIG9yIGBgLTFgYCBmb3IgZHluYW1pYy1sZW5ndGhlZCBhcnJheXMuXG4gICAgICpcbiAgICAgKiAgRm9yIG5vbi1hcnJheSB0eXBlcyB0aGlzIGlzIGBgbnVsbGBgLlxuICAgICAqL1xuICAgIGFycmF5TGVuZ3RoO1xuICAgIC8qKlxuICAgICAqICBUaGUgdHlwZSBvZiBlYWNoIGNoaWxkIGluIHRoZSBhcnJheS5cbiAgICAgKlxuICAgICAqICBGb3Igbm9uLWFycmF5IHR5cGVzIHRoaXMgaXMgYGBudWxsYGAuXG4gICAgICovXG4gICAgYXJyYXlDaGlsZHJlbjtcbiAgICAvKipcbiAgICAgKiAgQHByaXZhdGVcbiAgICAgKi9cbiAgICBjb25zdHJ1Y3RvcihndWFyZCwgbmFtZSwgdHlwZSwgYmFzZVR5cGUsIGluZGV4ZWQsIGNvbXBvbmVudHMsIGFycmF5TGVuZ3RoLCBhcnJheUNoaWxkcmVuKSB7XG4gICAgICAgIGFzc2VydFByaXZhdGUoZ3VhcmQsIF9ndWFyZCwgXCJQYXJhbVR5cGVcIik7XG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCBpbnRlcm5hbCwgeyB2YWx1ZTogUGFyYW1UeXBlSW50ZXJuYWwgfSk7XG4gICAgICAgIGlmIChjb21wb25lbnRzKSB7XG4gICAgICAgICAgICBjb21wb25lbnRzID0gT2JqZWN0LmZyZWV6ZShjb21wb25lbnRzLnNsaWNlKCkpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChiYXNlVHlwZSA9PT0gXCJhcnJheVwiKSB7XG4gICAgICAgICAgICBpZiAoYXJyYXlMZW5ndGggPT0gbnVsbCB8fCBhcnJheUNoaWxkcmVuID09IG51bGwpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJcIik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoYXJyYXlMZW5ndGggIT0gbnVsbCB8fCBhcnJheUNoaWxkcmVuICE9IG51bGwpIHtcbiAgICAgICAgICAgI
26774HRocm93IG5ldyBFcnJvcihcIlwiKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoYmFzZVR5cGUgPT09IFwidHVwbGVcIikge1xuICAgICAgICAgICAgaWYgKGNvbXBvbmVudHMgPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlwiKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChjb21wb25lbnRzICE9IG51bGwpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlwiKTtcbiAgICAgICAgfVxuICAgICAgICBkZWZpbmVQcm9wZXJ0aWVzKHRoaXMsIHtcbiAgICAgICAgICAgIG5hbWUsIHR5cGUsIGJhc2VUeXBlLCBpbmRleGVkLCBjb21wb25lbnRzLCBhcnJheUxlbmd0aCwgYXJyYXlDaGlsZHJlblxuICAgICAgICB9KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogIFJldHVybiBhIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGlzIHR5cGUuXG4gICAgICpcbiAgICAgKiAgRm9yIGV4YW1wbGUsXG4gICAgICpcbiAgICAgKiAgYGBzaWdoYXNoXCIgPT4gXCIodWludDI1NixhZGRyZXNzKVwiYGBcbiAgICAgKlxuICAgICAqICBgYFwibWluaW1hbFwiID0+IFwidHVwbGUodWludDI1NixhZGRyZXNzKSBpbmRleGVkXCJgYFxuICAgICAqXG4gICAgICogIGBgXCJmdWxsXCIgPT4gXCJ0dXBsZSh1aW50MjU2IGZvbywgYWRkcmVzcyBiYXIpIGluZGV4ZWQgYmF6XCJgYFxuICAgICAqL1xuICAgIGZvcm1hdChmb3JtYXQpIHtcbiAgICAgICAgaWYgKGZvcm1hdCA9PSBudWxsKSB7XG4gICAgICAgICAgICBmb3JtYXQgPSBcInNpZ2hhc2hcIjtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZm9ybWF0ID09PSBcImpzb25cIikge1xuICAgICAgICAgICAgY29uc3QgbmFtZSA9IHRoaXMubmFtZSB8fCBcIlwiO1xuICAgICAgICAgICAgaWYgKHRoaXMuaXNBcnJheSgpKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gSlNPTi5wYXJzZSh0aGlzLmFycmF5Q2hpbGRyZW4uZm9ybWF0KFwianNvblwiKSk7XG4gICAgICAgICAgICAgICAgcmVzdWx0Lm5hbWUgPSBuYW1lO1xuICAgICAgICAgICAgICAgIHJlc3VsdC50eXBlICs9IGBbJHsodGhpcy5hcnJheUxlbmd0aCA8IDAgPyBcIlwiIDogU3RyaW5nKHRoaXMuYXJyYXlMZW5ndGgpKX1dYDtcbiAgICAgICAgICAgICAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkocmVzdWx0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IHtcbiAgICAgICAgICAgICAgICB0eXBlOiAoKHRoaXMuYmFzZVR5cGUgPT09IFwidHVwbGVcIikgPyBcInR1cGxlXCIgOiB0aGlzLnR5cGUpLFxuICAgICAgICAgICAgICAgIG5hbWVcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBpZiAodHlwZW9mICh0aGlzLmluZGV4ZWQpID09PSBcImJvb2xlYW5cIikge1xuICAgICAgICAgICAgICAgIHJlc3VsdC5pbmRleGVkID0gdGhpcy5pbmRleGVkO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHRoaXMuaXNUdXBsZSgpKSB7XG4gICAgICAgICAgICAgICAgcmVzdWx0LmNvbXBvbmVudHMgPSB0aGlzLmNvbXBvbmVudHMubWFwKChjKSA9PiBKU09OLnBhcnNlKGMuZm9ybWF0KGZvcm1hdCkpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBKU09OLnN0cmluZ2lmeShyZXN1bHQpO1xuICAgICAgICB9XG4gICAgICAgIGxldCByZXN1bHQgPSBcIlwiO1xuICAgICAgICAvLyBBcnJheVxuICAgICAgICBpZiAodGhpcy5pc0FycmF5KCkpIHtcbiAgICAgICAgICAgIHJlc3VsdCArPSB0aGlzLmFycmF5Q2hpbGRyZW4uZm9ybWF0KGZvcm1hdCk7XG4gICAgICAgICAgICByZXN1bHQgKz0gYFskeyh0aGlzLmFycmF5TGVuZ3RoIDwgMCA/IFwiXCIgOiBTdHJpbmcodGhpcy5hcnJheUxlbmd0aCkpfV1gO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgaWYgKHRoaXMuaXNUdXBsZSgpKSB7XG4gICAgICAgICAgICAgICAgcmVzdWx0ICs9IFwiKFwiICsgdGhpcy5jb21wb25lbnRzLm1hcCgoY29tcCkgPT4gY29tcC5mb3JtYXQoZm9ybWF0KSkuam9pbigoZm9ybWF0ID09PSBcImZ1bGxcIikgPyBcIiwgXCIgOiBcIixcIikgKyBcIilcIjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHJlc3VsdCArPSB0aGlzLnR5cGU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGZvcm1hdCAhPT0gXCJzaWdoYXNoXCIpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLmluZGV4ZWQgPT09IHRydWUpIHtcbiAgICAgICAgICAgICAgICByZXN1bHQgKz0gXCIgaW5kZXhlZFwiO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGZvcm1hdCA9PT0gXCJmdWxsXCIgJiYgdGhpcy5uYW1lKSB7XG4gICAgICAgICAgICAgICAgcmVzdWx0ICs9IFwiIFwiICsgdGhpcy5uYW1lO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuICAgIC8qKlxuICAgICAqICBSZXR1cm5zIHRydWUgaWYgJSV0aGlzJSUgaXMgYW4gQXJyYXkgdHlwZS5cbiAgICAgKlxuICAgICAqICBUaGlzIHByb3ZpZGVzIGEgdHlwZSBnYXVyZCBlbnN1cmluZyB0aGF0IFtbYXJyYXlDaGlsZHJlbl1dXG4gICAgICogIGFuZCBbW2FycmF5TGVuZ3RoXV0gYXJlIG5vbi1udWxsLlxuICAgICAqL1xuICAgIGlzQXJyYXkoKSB7XG4gICAgICAgIHJldHVybiAodGhpcy5iYXNlVHlwZSA9PT0gXCJhcnJheVwiKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogIFJldHVybnMgdHJ1ZSBpZiAlJXRoaXMlJSBpcyBhIFR1cGxlIHR5cGUuXG4gICAgICpcbiAgICAgKiAgVGhpcyBwcm92aWRlcyBhIHR5cGUgZ2F1cmQgZW5zdXJpbmcgdGhhdCBbW2NvbXBvbmVudHNdXVxuICAgICAqICBpcyBub24tbnVsbC5cbiAgICAgKi9cbiAgICBpc1R1cGxlKCkge1xuICAgICAgICByZXR1cm4gKHRoaXMuYmFzZVR5cGUgPT09IFwidHVwbGVcIik7XG4gICAgfVxuICAgIC8qKlxuICAgICAqICBSZXR1cm5zIHRydWUgaWYgJSV0aGlzJSUgaXMgYW4gSW5kZXhhYmxlIHR5cGUuXG4gICAgICpcbiAgICAgKiAgVGhpcyBwcm92aWRlcyBhIHR5cGUgZ2F1cmQgZW5zdXJpbmcgdGhhdCBbW2luZGV4ZWRdXVxuICAgICAqICBpcyBub24tbnVsbC5cbiAgICAgKi9cbiAgICBpc0luZGV4YWJsZSgpIHtcbiAgICAgICAgcmV0dXJuICh0aGlzLmluZGV4ZWQgIT0gbnVsbCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqICBXYWxrcyB0aGUgKipQYXJhbVR5cGUqKiB3aXRoICUldmFsdWUlJSwgY2FsbGluZyAlJXByb2Nlc3MlJVxuICAgICAqICBvbiBlYWNoIHR5cGUsIGRlc3RydWN0aW5nIHRoZSAlJXZhbHVlJSUgcmVjdXJzaXZlbHkuXG4gICAgICovXG4gICAgd2Fsayh2YWx1ZSwgcHJvY2Vzcykge1xuICAgICAgICBpZiAodGhpcy5pc0FycmF
267745KCkpIHtcbiAgICAgICAgICAgIGlmICghQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJpbnZhbGlkIGFycmF5IHZhbHVlXCIpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHRoaXMuYXJyYXlMZW5ndGggIT09IC0xICYmIHZhbHVlLmxlbmd0aCAhPT0gdGhpcy5hcnJheUxlbmd0aCkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcImFycmF5IGlzIHdyb25nIGxlbmd0aFwiKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IF90aGlzID0gdGhpcztcbiAgICAgICAgICAgIHJldHVybiB2YWx1ZS5tYXAoKHYpID0+IChfdGhpcy5hcnJheUNoaWxkcmVuLndhbGsodiwgcHJvY2VzcykpKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5pc1R1cGxlKCkpIHtcbiAgICAgICAgICAgIGlmICghQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJpbnZhbGlkIHR1cGxlIHZhbHVlXCIpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHZhbHVlLmxlbmd0aCAhPT0gdGhpcy5jb21wb25lbnRzLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcImFycmF5IGlzIHdyb25nIGxlbmd0aFwiKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IF90aGlzID0gdGhpcztcbiAgICAgICAgICAgIHJldHVybiB2YWx1ZS5tYXAoKHYsIGkpID0+IChfdGhpcy5jb21wb25lbnRzW2ldLndhbGsodiwgcHJvY2VzcykpKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcHJvY2Vzcyh0aGlzLnR5cGUsIHZhbHVlKTtcbiAgICB9XG4gICAgI3dhbGtBc3luYyhwcm9taXNlcywgdmFsdWUsIHByb2Nlc3MsIHNldFZhbHVlKSB7XG4gICAgICAgIGlmICh0aGlzLmlzQXJyYXkoKSkge1xuICAgICAgICAgICAgaWYgKCFBcnJheS5pc0FycmF5KHZhbHVlKSkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcImludmFsaWQgYXJyYXkgdmFsdWVcIik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAodGhpcy5hcnJheUxlbmd0aCAhPT0gLTEgJiYgdmFsdWUubGVuZ3RoICE9PSB0aGlzLmFycmF5TGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiYXJyYXkgaXMgd3JvbmcgbGVuZ3RoXCIpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgY2hpbGRUeXBlID0gdGhpcy5hcnJheUNoaWxkcmVuO1xuICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gdmFsdWUuc2xpY2UoKTtcbiAgICAgICAgICAgIHJlc3VsdC5mb3JFYWNoKCh2YWx1ZSwgaW5kZXgpID0+IHtcbiAgICAgICAgICAgICAgICBjaGlsZFR5cGUuI3dhbGtBc3luYyhwcm9taXNlcywgdmFsdWUsIHByb2Nlc3MsICh2YWx1ZSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICByZXN1bHRbaW5kZXhdID0gdmFsdWU7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHNldFZhbHVlKHJlc3VsdCk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuaXNUdXBsZSgpKSB7XG4gICAgICAgICAgICBjb25zdCBjb21wb25lbnRzID0gdGhpcy5jb21wb25lbnRzO1xuICAgICAgICAgICAgLy8gQ29udmVydCB0aGUgb2JqZWN0IGludG8gYW4gYXJyYXlcbiAgICAgICAgICAgIGxldCByZXN1bHQ7XG4gICAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICAgICAgICAgICAgICByZXN1bHQgPSB2YWx1ZS5zbGljZSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgaWYgKHZhbHVlID09IG51bGwgfHwgdHlwZW9mICh2YWx1ZSkgIT09IFwib2JqZWN0XCIpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiaW52YWxpZCB0dXBsZSB2YWx1ZVwiKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmVzdWx0ID0gY29tcG9uZW50cy5tYXAoKHBhcmFtKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmICghcGFyYW0ubmFtZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiY2Fubm90IHVzZSBvYmplY3QgdmFsdWUgd2l0aCB1bm5hbWVkIGNvbXBvbmVudHNcIik7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKCEocGFyYW0ubmFtZSBpbiB2YWx1ZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgbWlzc2luZyB2YWx1ZSBmb3IgY29tcG9uZW50ICR7cGFyYW0ubmFtZX1gKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdmFsdWVbcGFyYW0ubmFtZV07XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAocmVzdWx0Lmxlbmd0aCAhPT0gdGhpcy5jb21wb25lbnRzLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcImFycmF5IGlzIHdyb25nIGxlbmd0aFwiKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJlc3VsdC5mb3JFYWNoKCh2YWx1ZSwgaW5kZXgpID0+IHtcbiAgICAgICAgICAgICAgICBjb21wb25lbnRzW2luZGV4XS4jd2Fsa0FzeW5jKHByb21pc2VzLCB2YWx1ZSwgcHJvY2VzcywgKHZhbHVlKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdFtpbmRleF0gPSB2YWx1ZTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgc2V0VmFsdWUocmVzdWx0KTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCByZXN1bHQgPSBwcm9jZXNzKHRoaXMudHlwZSwgdmFsdWUpO1xuICAgICAgICBpZiAocmVzdWx0LnRoZW4pIHtcbiAgICAgICAgICAgIHByb21pc2VzLnB1c2goKGFzeW5jIGZ1bmN0aW9uICgpIHsgc2V0VmFsdWUoYXdhaXQgcmVzdWx0KTsgfSkoKSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBzZXRWYWx1ZShyZXN1bHQpO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqICBXYWxrcyB0aGUgKipQYXJhbVR5cGUqKiB3aXRoICUldmFsdWUlJSwgYXN5bmNocm9ub3VzbHkgY2FsbGluZ1xuICAgICAqICAlJXByb2Nlc3MlJSBvbiBlYWNoIHR5cGUsIGRlc3RydWN0aW5nIHRoZSAlJXZhbHVlJSUgcmVjdXJzaXZlbHkuXG4gICAgICpcbiAgICAgKiAgVGhpcyBjYW4gYmUgdXNlZCB0byByZXNvbHZlIEVOUyBuYW1lcyBieSB3YWxraW5nIGFuZCByZXNvbHZpbmcgZWFjaFxuICAgICAqICBgYFwiYWRkcmVzc1wiYGAgdHlwZS5cbiAgICAgKi9cbiAgICBhc3luYyB3YWxrQXN5bmModmFsdWUsIHByb2Nlc3MpIHtcbiAgICAgICAgY29uc3QgcHJvbWlzZXMgPSBbXTtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gW3ZhbHVlXTtcbiAgICAgICAgdGhpcy4jd2Fsa0FzeW5jKHByb21pc2VzLCB2YWx1ZSwgcHJvY2VzcywgKHZhbHVlKSA9PiB7XG4gICAgICAgICAgICByZXN1bHRbMF0gPSB2YWx1ZTtcbiAgICAgICAgfSk7XG4gICAgICAgIGlmIChwcm9taXNlcy5sZW5ndGgpIHtcbiAgICAgICAgICAgIGF3YWl0IFByb21pc2UuYWxsKHByb21pc2VzKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzdWx0WzBdO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiAgQ3JlYXRlcyBhIG5ldyAqKlBhcmFtVHlwZSoqIGZvciAlJW9iaiUlLlxuICAgICAqXG4gICAgICogIElmICUlYWxsb3dJbmRleGVkJSUgdGhlbiB0aGUgYGBpbmRleGVkYGAga2V5d29yZCBpcyBwZXJtaXR0ZWQsXG4gICAgICogIG90aGVyd2lzZSB0aGUgYGBpbmRleGVkYGAga2V5d29yZCB3aWxsIHRocm93IGFuIGVycm9yLlxuICAgICAqL1xuICAgIHN0YXRpYyBmcm9tKG9iaiwgYWxsb3dJbmRleGVkKSB7XG4gICAgICAgIGlmIChQYXJhbVR5cGUuaXNQYXJhbVR5cGUob2JqKSkge1xuICAgICAgICAgICAgcmV0dXJuIG9iajtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIChvYmopID09PSBcInN0cmluZ1wiKSB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgI
26774HJldHVybiBQYXJhbVR5cGUuZnJvbShsZXgob2JqKSwgYWxsb3dJbmRleGVkKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgICAgIGFzc2VydEFyZ3VtZW50KGZhbHNlLCBcImludmFsaWQgcGFyYW0gdHlwZVwiLCBcIm9ialwiLCBvYmopO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKG9iaiBpbnN0YW5jZW9mIFRva2VuU3RyaW5nKSB7XG4gICAgICAgICAgICBsZXQgdHlwZSA9IFwiXCIsIGJhc2VUeXBlID0gXCJcIjtcbiAgICAgICAgICAgIGxldCBjb21wcyA9IG51bGw7XG4gICAgICAgICAgICBpZiAoY29uc3VtZUtleXdvcmRzKG9iaiwgc2V0aWZ5KFtcInR1cGxlXCJdKSkuaGFzKFwidHVwbGVcIikgfHwgb2JqLnBlZWtUeXBlKFwiT1BFTl9QQVJFTlwiKSkge1xuICAgICAgICAgICAgICAgIC8vIFR1cGxlXG4gICAgICAgICAgICAgICAgYmFzZVR5cGUgPSBcInR1cGxlXCI7XG4gICAgICAgICAgICAgICAgY29tcHMgPSBvYmoucG9wUGFyYW1zKCkubWFwKCh0KSA9PiBQYXJhbVR5cGUuZnJvbSh0KSk7XG4gICAgICAgICAgICAgICAgdHlwZSA9IGB0dXBsZSgke2NvbXBzLm1hcCgoYykgPT4gYy5mb3JtYXQoKSkuam9pbihcIixcIil9KWA7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAvLyBOb3JtYWxcbiAgICAgICAgICAgICAgICB0eXBlID0gdmVyaWZ5QmFzaWNUeXBlKG9iai5wb3BUeXBlKFwiVFlQRVwiKSk7XG4gICAgICAgICAgICAgICAgYmFzZVR5cGUgPSB0eXBlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gQ2hlY2sgZm9yIEFycmF5XG4gICAgICAgICAgICBsZXQgYXJyYXlDaGlsZHJlbiA9IG51bGw7XG4gICAgICAgICAgICBsZXQgYXJyYXlMZW5ndGggPSBudWxsO1xuICAgICAgICAgICAgd2hpbGUgKG9iai5sZW5ndGggJiYgb2JqLnBlZWtUeXBlKFwiQlJBQ0tFVFwiKSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGJyYWNrZXQgPSBvYmoucG9wKCk7IC8vYXJyYXlzW2ldO1xuICAgICAgICAgICAgICAgIGFycmF5Q2hpbGRyZW4gPSBuZXcgUGFyYW1UeXBlKF9ndWFyZCwgXCJcIiwgdHlwZSwgYmFzZVR5cGUsIG51bGwsIGNvbXBzLCBhcnJheUxlbmd0aCwgYXJyYXlDaGlsZHJlbik7XG4gICAgICAgICAgICAgICAgYXJyYXlMZW5ndGggPSBicmFja2V0LnZhbHVlO1xuICAgICAgICAgICAgICAgIHR5cGUgKz0gYnJhY2tldC50ZXh0O1xuICAgICAgICAgICAgICAgIGJhc2VUeXBlID0gXCJhcnJheVwiO1xuICAgICAgICAgICAgICAgIGNvbXBzID0gbnVsbDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGxldCBpbmRleGVkID0gbnVsbDtcbiAgICAgICAgICAgIGNvbnN0IGtleXdvcmRzID0gY29uc3VtZUtleXdvcmRzKG9iaiwgS3dNb2RpZmllcnMpO1xuICAgICAgICAgICAgaWYgKGtleXdvcmRzLmhhcyhcImluZGV4ZWRcIikpIHtcbiAgICAgICAgICAgICAgICBpZiAoIWFsbG93SW5kZXhlZCkge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJcIik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGluZGV4ZWQgPSB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgbmFtZSA9IChvYmoucGVla1R5cGUoXCJJRFwiKSA/IG9iai5wb3AoKS50ZXh0IDogXCJcIik7XG4gICAgICAgICAgICBpZiAob2JqLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcImxlZnRvdmVyIHRva2Vuc1wiKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBuZXcgUGFyYW1UeXBlKF9ndWFyZCwgbmFtZSwgdHlwZSwgYmFzZVR5cGUsIGluZGV4ZWQsIGNvbXBzLCBhcnJheUxlbmd0aCwgYXJyYXlDaGlsZHJlbik7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgbmFtZSA9IG9iai5uYW1lO1xuICAgICAgICBhc3NlcnRBcmd1bWVudCghbmFtZSB8fCAodHlwZW9mIChuYW1lKSA9PT0gXCJzdHJpbmdcIiAmJiBuYW1lLm1hdGNoKHJlZ2V4SWQpKSwgXCJpbnZhbGlkIG5hbWVcIiwgXCJvYmoubmFtZVwiLCBuYW1lKTtcbiAgICAgICAgbGV0IGluZGV4ZWQgPSBvYmouaW5kZXhlZDtcbiAgICAgICAgaWYgKGluZGV4ZWQgIT0gbnVsbCkge1xuICAgICAgICAgICAgYXNzZXJ0QXJndW1lbnQoYWxsb3dJbmRleGVkLCBcInBhcmFtZXRlciBjYW5ub3QgYmUgaW5kZXhlZFwiLCBcIm9iai5pbmRleGVkXCIsIG9iai5pbmRleGVkKTtcbiAgICAgICAgICAgIGluZGV4ZWQgPSAhIWluZGV4ZWQ7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IHR5cGUgPSBvYmoudHlwZTtcbiAgICAgICAgbGV0IGFycmF5TWF0Y2ggPSB0eXBlLm1hdGNoKHJlZ2V4QXJyYXlUeXBlKTtcbiAgICAgICAgaWYgKGFycmF5TWF0Y2gpIHtcbiAgICAgICAgICAgIGNvbnN0IGFycmF5TGVuZ3RoID0gcGFyc2VJbnQoYXJyYXlNYXRjaFsyXSB8fCBcIi0xXCIpO1xuICAgICAgICAgICAgY29uc3QgYXJyYXlDaGlsZHJlbiA9IFBhcmFtVHlwZS5mcm9tKHtcbiAgICAgICAgICAgICAgICB0eXBlOiBhcnJheU1hdGNoWzFdLFxuICAgICAgICAgICAgICAgIGNvbXBvbmVudHM6IG9iai5jb21wb25lbnRzXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHJldHVybiBuZXcgUGFyYW1UeXBlKF9ndWFyZCwgbmFtZSB8fCBcIlwiLCB0eXBlLCBcImFycmF5XCIsIGluZGV4ZWQsIG51bGwsIGFycmF5TGVuZ3RoLCBhcnJheUNoaWxkcmVuKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZSA9PT0gXCJ0dXBsZVwiIHx8IHR5cGUuc3RhcnRzV2l0aChcInR1cGxlKFwiIC8qIGZpeDogKSAqLykgfHwgdHlwZS5zdGFydHNXaXRoKFwiKFwiIC8qIGZpeDogKSAqLykpIHtcbiAgICAgICAgICAgIGNvbnN0IGNvbXBzID0gKG9iai5jb21wb25lbnRzICE9IG51bGwpID8gb2JqLmNvbXBvbmVudHMubWFwKChjKSA9PiBQYXJhbVR5cGUuZnJvbShjKSkgOiBudWxsO1xuICAgICAgICAgICAgY29uc3QgdHVwbGUgPSBuZXcgUGFyYW1UeXBlKF9ndWFyZCwgbmFtZSB8fCBcIlwiLCB0eXBlLCBcInR1cGxlXCIsIGluZGV4ZWQsIGNvbXBzLCBudWxsLCBudWxsKTtcbiAgICAgICAgICAgIC8vIEBUT0RPOiB1c2UgbGV4ZXIgdG8gdmFsaWRhdGUgYW5kIG5vcm1hbGl6ZSB0eXBlXG4gICAgICAgICAgICByZXR1cm4gdHVwbGU7XG4gICAgICAgI
26774H1cbiAgICAgICAgdHlwZSA9IHZlcmlmeUJhc2ljVHlwZShvYmoudHlwZSk7XG4gICAgICAgIHJldHVybiBuZXcgUGFyYW1UeXBlKF9ndWFyZCwgbmFtZSB8fCBcIlwiLCB0eXBlLCB0eXBlLCBpbmRleGVkLCBudWxsLCBudWxsLCBudWxsKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogIFJldHVybnMgdHJ1ZSBpZiAlJXZhbHVlJSUgaXMgYSAqKlBhcmFtVHlwZSoqLlxuICAgICAqL1xuICAgIHN0YXRpYyBpc1BhcmFtVHlwZSh2YWx1ZSkge1xuICAgICAgICByZXR1cm4gKHZhbHVlICYmIHZhbHVlW2ludGVybmFsXSA9PT0gUGFyYW1UeXBlSW50ZXJuYWwpO1xuICAgIH1cbn1cbi8qKlxuICogIEFuIGFic3RyYWN0IGNsYXNzIHRvIHJlcHJlc2VudCBBbiBpbmRpdmlkdWFsIGZyYWdtZW50IGZyb20gYSBwYXJzZSBBQkkuXG4gKi9cbmV4cG9ydCBjbGFzcyBGcmFnbWVudCB7XG4gICAgLyoqXG4gICAgICogIFRoZSB0eXBlIG9mIHRoZSBmcmFnbWVudC5cbiAgICAgKi9cbiAgICB0eXBlO1xuICAgIC8qKlxuICAgICAqICBUaGUgaW5wdXRzIGZvciB0aGUgZnJhZ21lbnQuXG4gICAgICovXG4gICAgaW5wdXRzO1xuICAgIC8qKlxuICAgICAqICBAcHJpdmF0ZVxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yKGd1YXJkLCB0eXBlLCBpbnB1dHMpIHtcbiAgICAgICAgYXNzZXJ0UHJpdmF0ZShndWFyZCwgX2d1YXJkLCBcIkZyYWdtZW50XCIpO1xuICAgICAgICBpbnB1dHMgPSBPYmplY3QuZnJlZXplKGlucHV0cy5zbGljZSgpKTtcbiAgICAgICAgZGVmaW5lUHJvcGVydGllcyh0aGlzLCB7IHR5cGUsIGlucHV0cyB9KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogIENyZWF0ZXMgYSBuZXcgKipGcmFnbWVudCoqIGZvciAlJW9iaiUlLCB3aWNoIGNhbiBiZSBhbnkgc3VwcG9ydGVkXG4gICAgICogIEFCSSBmcmdhbWVudCB0eXBlLlxuICAgICAqL1xuICAgIHN0YXRpYyBmcm9tKG9iaikge1xuICAgICAgICBpZiAodHlwZW9mIChvYmopID09PSBcInN0cmluZ1wiKSB7XG4gICAgICAgICAgICAvLyBUcnkgcGFyc2luZyBKU09OLi4uXG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIEZyYWdtZW50LmZyb20oSlNPTi5wYXJzZShvYmopKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhdGNoIChlKSB7IH1cbiAgICAgICAgICAgIC8vIC4uLm90aGVyd2lzZSwgdXNlIHRoZSBodW1hbi1yZWFkYWJsZSBsZXhlclxuICAgICAgICAgICAgcmV0dXJuIEZyYWdtZW50LmZyb20obGV4KG9iaikpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChvYmogaW5zdGFuY2VvZiBUb2tlblN0cmluZykge1xuICAgICAgICAgICAgLy8gSHVtYW4tcmVhZGFibGUgQUJJIChhbHJlYWR5IGxleGVkKVxuICAgICAgICAgICAgY29uc3QgdHlwZSA9IG9iai5wZWVrS2V5d29yZChLd1R5cGVzKTtcbiAgICAgICAgICAgIHN3aXRjaCAodHlwZSkge1xuICAgICAgICAgICAgICAgIGNhc2UgXCJjb25zdHJ1Y3RvclwiOiByZXR1cm4gQ29uc3RydWN0b3JGcmFnbWVudC5mcm9tKG9iaik7XG4gICAgICAgICAgICAgICAgY2FzZSBcImVycm9yXCI6IHJldHVybiBFcnJvckZyYWdtZW50LmZyb20ob2JqKTtcbiAgICAgICAgICAgICAgICBjYXNlIFwiZXZlbnRcIjogcmV0dXJuIEV2ZW50RnJhZ21lbnQuZnJvbShvYmopO1xuICAgICAgICAgICAgICAgIGNhc2UgXCJmYWxsYmFja1wiOlxuICAgICAgICAgICAgICAgIGNhc2UgXCJyZWNlaXZlXCI6XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBGYWxsYmFja0ZyYWdtZW50LmZyb20ob2JqKTtcbiAgICAgICAgICAgICAgICBjYXNlIFwiZnVuY3Rpb25cIjogcmV0dXJuIEZ1bmN0aW9uRnJhZ21lbnQuZnJvbShvYmopO1xuICAgICAgICAgICAgICAgIGNhc2UgXCJzdHJ1Y3RcIjogcmV0dXJuIFN0cnVjdEZyYWdtZW50LmZyb20ob2JqKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmICh0eXBlb2YgKG9iaikgPT09IFwib2JqZWN0XCIpIHtcbiAgICAgICAgICAgIC8vIEpTT04gQUJJXG4gICAgICAgICAgICBzd2l0Y2ggKG9iai50eXBlKSB7XG4gICAgICAgICAgICAgICAgY2FzZSBcImNvbnN0cnVjdG9yXCI6IHJldHVybiBDb25zdHJ1Y3RvckZyYWdtZW50LmZyb20ob2JqKTtcbiAgICAgICAgICAgICAgICBjYXNlIFwiZXJyb3JcIjogcmV0dXJuIEVycm9yRnJhZ21lbnQuZnJvbShvYmopO1xuICAgICAgICAgICAgICAgIGNhc2UgXCJldmVudFwiOiByZXR1cm4gRXZlbnRGcmFnbWVudC5mcm9tKG9iaik7XG4gICAgICAgICAgICAgICAgY2FzZSBcImZhbGxiYWNrXCI6XG4gICAgICAgICAgICAgICAgY2FzZSBcInJlY2VpdmVcIjpcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEZhbGxiYWNrRnJhZ21lbnQuZnJvbShvYmopO1xuICAgICAgICAgICAgICAgIGNhc2UgXCJmdW5jdGlvblwiOiByZXR1cm4gRnVuY3Rpb25GcmFnbWVudC5mcm9tKG9iaik7XG4gICAgICAgICAgICAgICAgY2FzZSBcInN0cnVjdFwiOiByZXR1cm4gU3RydWN0RnJhZ21lbnQuZnJvbShvYmopO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgYXNzZXJ0KGZhbHNlLCBgdW5zdXBwb3J0ZWQgdHlwZTogJHtvYmoudHlwZX1gLCBcIlVOU1VQUE9SVEVEX09QRVJBVElPTlwiLCB7XG4gICAgICAgICAgICAgICAgb3BlcmF0aW9uOiBcIkZyYWdtZW50LmZyb21cIlxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgYXNzZXJ0QXJndW1lbnQoZmFsc2UsIFwidW5zdXBwb3J0ZWQgZnJnYW1lbnQgb2JqZWN0XCIsIFwib2JqXCIsIG9iaik7XG4gICAgfVxuICAgIC8qKlxuICAgICAqICBSZXR1cm5zIHRydWUgaWYgJSV2YWx1ZSUlIGlzIGEgW1tDb25zdHJ1Y3RvckZyYWdtZW50XV0uXG4gICAgICovXG4gICAgc3RhdGljIGlzQ29uc3RydWN0b3IodmFsdWUpIHtcbiAgICAgICAgcmV0dXJuIENvbnN0cnVjdG9yRnJhZ21lbnQuaXNGcmFnbWVudCh2YWx1ZSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqICBSZXR1cm5zIHRydWUgaWYgJSV2YWx1ZSUlIGlzIGFuIFtbRXJyb3JGcmFnbWVudF1dLlxuICAgICAqL1xuICAgIHN0YXRpYyBpc0Vycm9yKHZhbHVlKSB7XG4gICAgICAgIHJldHVybi
26774BFcnJvckZyYWdtZW50LmlzRnJhZ21lbnQodmFsdWUpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiAgUmV0dXJucyB0cnVlIGlmICUldmFsdWUlJSBpcyBhbiBbW0V2ZW50RnJhZ21lbnRdXS5cbiAgICAgKi9cbiAgICBzdGF0aWMgaXNFdmVudCh2YWx1ZSkge1xuICAgICAgICByZXR1cm4gRXZlbnRGcmFnbWVudC5pc0ZyYWdtZW50KHZhbHVlKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogIFJldHVybnMgdHJ1ZSBpZiAlJXZhbHVlJSUgaXMgYSBbW0Z1bmN0aW9uRnJhZ21lbnRdXS5cbiAgICAgKi9cbiAgICBzdGF0aWMgaXNGdW5jdGlvbih2YWx1ZSkge1xuICAgICAgICByZXR1cm4gRnVuY3Rpb25GcmFnbWVudC5pc0ZyYWdtZW50KHZhbHVlKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogIFJldHVybnMgdHJ1ZSBpZiAlJXZhbHVlJSUgaXMgYSBbW1N0cnVjdEZyYWdtZW50XV0uXG4gICAgICovXG4gICAgc3RhdGljIGlzU3RydWN0KHZhbHVlKSB7XG4gICAgICAgIHJldHVybiBTdHJ1Y3RGcmFnbWVudC5pc0ZyYWdtZW50KHZhbHVlKTtcbiAgICB9XG59XG4vKipcbiAqICBBbiBhYnN0cmFjdCBjbGFzcyB0byByZXByZXNlbnQgQW4gaW5kaXZpZHVhbCBmcmFnbWVudFxuICogIHdoaWNoIGhhcyBhIG5hbWUgZnJvbSBhIHBhcnNlIEFCSS5cbiAqL1xuZXhwb3J0IGNsYXNzIE5hbWVkRnJhZ21lbnQgZXh0ZW5kcyBGcmFnbWVudCB7XG4gICAgLyoqXG4gICAgICogIFRoZSBuYW1lIG9mIHRoZSBmcmFnbWVudC5cbiAgICAgKi9cbiAgICBuYW1lO1xuICAgIC8qKlxuICAgICAqICBAcHJpdmF0ZVxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yKGd1YXJkLCB0eXBlLCBuYW1lLCBpbnB1dHMpIHtcbiAgICAgICAgc3VwZXIoZ3VhcmQsIHR5cGUsIGlucHV0cyk7XG4gICAgICAgIGFzc2VydEFyZ3VtZW50KHR5cGVvZiAobmFtZSkgPT09IFwic3RyaW5nXCIgJiYgbmFtZS5tYXRjaChyZWdleElkKSwgXCJpbnZhbGlkIGlkZW50aWZpZXJcIiwgXCJuYW1lXCIsIG5hbWUpO1xuICAgICAgICBpbnB1dHMgPSBPYmplY3QuZnJlZXplKGlucHV0cy5zbGljZSgpKTtcbiAgICAgICAgZGVmaW5lUHJvcGVydGllcyh0aGlzLCB7IG5hbWUgfSk7XG4gICAgfVxufVxuZnVuY3Rpb24gam9pblBhcmFtcyhmb3JtYXQsIHBhcmFtcykge1xuICAgIHJldHVybiBcIihcIiArIHBhcmFtcy5tYXAoKHApID0+IHAuZm9ybWF0KGZvcm1hdCkpLmpvaW4oKGZvcm1hdCA9PT0gXCJmdWxsXCIpID8gXCIsIFwiIDogXCIsXCIpICsgXCIpXCI7XG59XG4vKipcbiAqICBBIEZyYWdtZW50IHdoaWNoIHJlcHJlc2VudHMgYSAvL0N1c3RvbSBFcnJvci8vLlxuICovXG5leHBvcnQgY2xhc3MgRXJyb3JGcmFnbWVudCBleHRlbmRzIE5hbWVkRnJhZ21lbnQge1xuICAgIC8qKlxuICAgICAqICBAcHJpdmF0ZVxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yKGd1YXJkLCBuYW1lLCBpbnB1dHMpIHtcbiAgICAgICAgc3VwZXIoZ3VhcmQsIFwiZXJyb3JcIiwgbmFtZSwgaW5wdXRzKTtcbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsIGludGVybmFsLCB7IHZhbHVlOiBFcnJvckZyYWdtZW50SW50ZXJuYWwgfSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqICBUaGUgQ3VzdG9tIEVycm9yIHNlbGVjdG9yLlxuICAgICAqL1xuICAgIGdldCBzZWxlY3RvcigpIHtcbiAgICAgICAgcmV0dXJuIGlkKHRoaXMuZm9ybWF0KFwic2lnaGFzaFwiKSkuc3Vic3RyaW5nKDAsIDEwKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogIFJldHVybnMgYSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhpcyBmcmFnbWVudCBhcyAlJWZvcm1hdCUlLlxuICAgICAqL1xuICAgIGZvcm1hdChmb3JtYXQpIHtcbiAgICAgICAgaWYgKGZvcm1hdCA9PSBudWxsKSB7XG4gICAgICAgICAgICBmb3JtYXQgPSBcInNpZ2hhc2hcIjtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZm9ybWF0ID09PSBcImpzb25cIikge1xuICAgICAgICAgICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KHtcbiAgICAgICAgICAgICAgICB0eXBlOiBcImVycm9yXCIsXG4gICAgICAgICAgICAgICAgbmFtZTogdGh
26774pcy5uYW1lLFxuICAgICAgICAgICAgICAgIGlucHV0czogdGhpcy5pbnB1dHMubWFwKChpbnB1dCkgPT4gSlNPTi5wYXJzZShpbnB1dC5mb3JtYXQoZm9ybWF0KSkpLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgcmVzdWx0ID0gW107XG4gICAgICAgIGlmIChmb3JtYXQgIT09IFwic2lnaGFzaFwiKSB7XG4gICAgICAgICAgICByZXN1bHQucHVzaChcImVycm9yXCIpO1xuICAgICAgICB9XG4gICAgICAgIHJlc3VsdC5wdXNoKHRoaXMubmFtZSArIGpvaW5QYXJhbXMoZm9ybWF0LCB0aGlzLmlucHV0cykpO1xuICAgICAgICByZXR1cm4gcmVzdWx0LmpvaW4oXCIgXCIpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiAgUmV0dXJucyBhIG5ldyAqKkVycm9yRnJhZ21lbnQqKiBmb3IgJSVvYmolJS5cbiAgICAgKi9cbiAgICBzdGF0aWMgZnJvbShvYmopIHtcbiAgICAgICAgaWYgKEVycm9yRnJhZ21lbnQuaXNGcmFnbWVudChvYmopKSB7XG4gICAgICAgICAgICByZXR1cm4gb2JqO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2YgKG9iaikgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgICAgIHJldHVybiBFcnJvckZyYWdtZW50LmZyb20obGV4KG9iaikpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKG9iaiBpbnN0YW5jZW9mIFRva2VuU3RyaW5nKSB7XG4gICAgICAgICAgICBjb25zdCBuYW1lID0gY29uc3VtZU5hbWUoXCJlcnJvclwiLCBvYmopO1xuICAgICAgICAgICAgY29uc3QgaW5wdXRzID0gY29uc3VtZVBhcmFtcyhvYmopO1xuICAgICAgICAgICAgY29uc3VtZUVvaShvYmopO1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBFcnJvckZyYWdtZW50KF9ndWFyZCwgbmFtZSwgaW5wdXRzKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbmV3IEVycm9yRnJhZ21lbnQoX2d1YXJkLCBvYmoubmFtZSwgb2JqLmlucHV0cyA/IG9iai5pbnB1dHMubWFwKFBhcmFtVHlwZS5mcm9tKSA6IFtdKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogIFJldHVybnMgYGB0cnVlYGAgYW5kIHByb3ZpZGVzIGEgdHlwZSBndWFyZCBpZiAlJXZhbHVlJSUgaXMgYW5cbiAgICAgKiAgKipFcnJvckZyYWdtZW50KiouXG4gICAgICovXG4gICAgc3RhdGljIGlzRnJhZ21lbnQodmFsdWUpIHtcbiAgICAgICAgcmV0dXJuICh2YWx1ZSAmJiB2YWx1ZVtpbnRlcm5hbF0gPT09IEVycm9yRnJhZ21lbnRJbnRlcm5hbCk7XG4gICAgfVxufVxuLyoqXG4gKiAgQSBGcmFnbWVudCB3aGljaCByZXByZXNlbnRzIGFuIEV2ZW50LlxuICovXG5leHBvcnQgY2xhc3MgRXZlbnRGcmFnbWVudCBleHRlbmRzIE5hbWVkRnJhZ21lbnQge1xuICAgIC8qKlxuICAgICAqICBXaGV0aGVyIHRoaXMgZXZlbnQgaXMgYW5vbnltb3VzLlxuICAgICAqL1xuICAgIGFub255bW91cztcbiAgICAvKipcbiAgICAgKiAgQHByaXZhdGVcbiAgICAgKi9cbiAgICBjb25zdHJ1Y3RvcihndWFyZCwgbmFtZSwgaW5wdXRzLCBhbm9ueW1vdXMpIHtcbiAgICAgICAgc3VwZXIoZ3VhcmQsIFwiZXZlbnRcIiwgbmFtZSwgaW5wdXRzKTtcbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsIGludGVybmFsLCB7IHZhbHVlOiBFdmVudEZyYWdtZW50SW50ZXJuYWwgfSk7XG4gICAgICAgIGRlZmluZVByb3BlcnRpZXModGhpcywgeyBhbm9ueW1vdXMgfSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqICBUaGUgRXZlbnQgdG9waWMgaGFzaC5cbiAgICAgKi9cbiAgICBnZXQgdG9waWNIYXNoKCkge1xuICAgICAgICByZXR1cm4gaWQodGhpcy5mb3JtYXQoXCJzaWdoYXNoXCIpKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogIFJldHVybnMgYSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhpcyBldmVudCBhcyAlJWZvcm1hdCUlLlxuICAgICAqL1xuICAgIGZvcm1hdChmb3JtYXQpIHtcbiAgICAgICAgaWYgKGZvcm1hdCA9PSBudWxsKSB7XG4gICAgICAgICAgICBmb3JtYXQgPSBcInNpZ2hhc2hcIjtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZm9ybWF0ID09PSBcImpzb25cIikge1xuICAgICAgICAgICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KHtcbiAgICAgICAgICAgICAgICB0eXBlOiBcImV2ZW50XCIsXG4gICAgICAgICAgICAgICAgYW5vbnltb3VzOiB0aGlzLmFub255bW91cyxcbiAgICAgICAgICAgICAgICBuYW1lOiB0aGlzLm5hbWUsXG4gICAgICAgICAgICAgICAgaW5wdXRzOiB0aGlzLmlucHV0cy5tYXAoKGkpID0+IEpTT04ucGFyc2UoaS5mb3JtYXQoZm9ybWF0KSkpXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCByZXN1bHQgPSBbXTtcbiAgICAgICAgaWYgKGZvcm1hdCAhPT0gXCJzaWdoYXNoXCIpIHtcbiAgICAgICAgICAgIHJlc3VsdC5wdXNoKFwiZXZlbnRcIik7XG4gICAgICAgIH1cbiAgICAgICAgcmVzdWx0LnB1c2godGhpcy5uYW1lICsgam9pblBhcmFtcyhmb3JtYXQsIHRoaXMuaW5wdXRzKSk7XG4gICAgICAgIGlmIChmb3JtYXQgIT09IFwic2lnaGFzaFwiICYmIHRoaXMuYW5vbnltb3VzKSB7XG4gICAgICAgICAgICByZXN1bHQucHVzaChcImFub255bW91c1wiKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzdWx0LmpvaW4oXCIgXCIpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiAgUmV0dXJuIHRoZSB0b3BpYyBoYXNoIGZvciBhbiBldmVudCB3aXRoICUlbmFtZSUlIGFuZCAlJXBhcmFtcyUlLlxuICAgICAqL1xuICAgIHN0YXRpYyBnZXRUb3BpY0hhc2gobmFtZSwgcGFyYW1zKSB7XG4gICAgICAgIHBhcmFtcyA9IChwYXJhbXMgfHwgW10pLm1hcCgocCkgPT4gUGFyYW1UeXBlLmZyb20ocCkpO1xuICAgICAgICBjb25zdCBmcmFnbWVudCA9IG5ldyBFdmVudEZyYWdtZW50KF9ndWFyZCwgbmFtZSwgcGFyYW1zLCBmYWxzZSk7XG4gICAgICAgIHJldHVybiBmcmFnbWVudC50b3BpY0hhc2g7XG4gICAgfVxuICAgIC8qKlxuICAgICAqICBSZXR1cm5zIGEgbmV3ICoqRXZlbnRGcmFnbWVudCoqIGZvciAlJW9iaiUlLlxuICAgICAqL1xuICAgIHN0YXRpYyBmcm9tKG9iaikge1xuICAgICAgICBpZiAoRXZlbnRGcmFnbWVudC5pc0ZyYWdtZW50KG9iaikpIHtcbiAgICAgICAgICAgI
26774HJldHVybiBvYmo7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGVvZiAob2JqKSA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gRXZlbnRGcmFnbWVudC5mcm9tKGxleChvYmopKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgICAgIGFzc2VydEFyZ3VtZW50KGZhbHNlLCBcImludmFsaWQgZXZlbnQgZnJhZ21lbnRcIiwgXCJvYmpcIiwgb2JqKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChvYmogaW5zdGFuY2VvZiBUb2tlblN0cmluZykge1xuICAgICAgICAgICAgY29uc3QgbmFtZSA9IGNvbnN1bWVOYW1lKFwiZXZlbnRcIiwgb2JqKTtcbiAgICAgICAgICAgIGNvbnN0IGlucHV0cyA9IGNvbnN1bWVQYXJhbXMob2JqLCB0cnVlKTtcbiAgICAgICAgICAgIGNvbnN0IGFub255bW91cyA9ICEhY29uc3VtZUtleXdvcmRzKG9iaiwgc2V0aWZ5KFtcImFub255bW91c1wiXSkpLmhhcyhcImFub255bW91c1wiKTtcbiAgICAgICAgICAgIGNvbnN1bWVFb2kob2JqKTtcbiAgICAgICAgICAgIHJldHVybiBuZXcgRXZlbnRGcmFnbWVudChfZ3VhcmQsIG5hbWUsIGlucHV0cywgYW5vbnltb3VzKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbmV3IEV2ZW50RnJhZ21lbnQoX2d1YXJkLCBvYmoubmFtZSwgb2JqLmlucHV0cyA/IG9iai5pbnB1dHMubWFwKChwKSA9PiBQYXJhbVR5cGUuZnJvbShwLCB0cnVlKSkgOiBbXSwgISFvYmouYW5vbnltb3VzKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogIFJldHVybnMgYGB0cnVlYGAgYW5kIHByb3ZpZGVzIGEgdHlwZSBndWFyZCBpZiAlJXZhbHVlJSUgaXMgYW5cbiAgICAgKiAgKipFdmVudEZyYWdtZW50KiouXG4gICAgICovXG4gICAgc3RhdGljIGlzRnJhZ21lbnQodmFsdWUpIHtcbiAgICAgICAgcmV0dXJuICh2YWx1ZSAmJiB2YWx1ZVtpbnRlcm5hbF0gPT09IEV2ZW50RnJhZ21lbnRJbnRlcm5hbCk7XG4gICAgfVxufVxuLyoqXG4gKiAgQSBGcmFnbWVudCB3aGljaCByZXByZXNlbnRzIGEgY29uc3RydWN0b3IuXG4gKi9cbmV4cG9ydCBjbGFzcyBDb25zdHJ1Y3RvckZyYWdtZW50IGV4dGVuZHMgRnJhZ21lbnQge1xuICAgIC8qKlxuICAgICAqICBXaGV0aGVyIHRoZSBjb25zdHJ1Y3RvciBjYW4gcmVjZWl2ZSBhbiBlbmRvd21lbnQuXG4gICAgICovXG4gICAgcGF5YWJsZTtcbiAgICAvKipcbiAgICAgKiAgVGhlIHJlY29tbWVuZGVkIGdhcyBsaW1pdCBmb3IgZGVwbG95bWVudCBvciBgYG51bGxgYC5cbiAgICAgKi9cbiAgICBnYXM7XG4gICAgLyoqXG4gICAgICogIEBwcml2YXRlXG4gICAgICovXG4gICAgY29uc3RydWN0b3IoZ3VhcmQsIHR5cGUsIGlucHV0cywgcGF5YWJsZSwgZ2FzKSB7XG4gICAgICAgIHN1cGVyKGd1YXJkLCB0eXBlLCBpbnB1dHMpO1xuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgaW50ZXJuYWwsIHsgdmFsdWU6IENvbnN0cnVjdG9yRnJhZ21lbnRJbnRlcm5hbCB9KTtcbiAgICAgICAgZGVmaW5lUHJvcGVydGllcyh0aGlzLCB7IHBheWFibGUsIGdhcyB9KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogIFJldHVybnMgYSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhpcyBjb25zdHJ1Y3RvciBhcyAlJWZvcm1hdCUlLlxuICAgICAqL1xuICAgIGZvcm1hdChmb3JtYXQpIHtcbiAgICAgICAgYXNzZXJ0KGZvcm1hdCAhPSBudWxsICYmIGZvcm1hdCAhPT0gXCJzaWdoYXNoXCIsIFwiY2Fubm90IGZvcm1hdCBhIGNvbnN0cnVjdG9yIGZvciBzaWdoYXNoXCIsIFwiVU5TVVBQT1JURURfT1BFUkFUSU9OXCIsIHsgb3BlcmF0aW9uOiBcImZvcm1hdChzaWdoYXNoKVwiIH0pO1xuICAgICAgICBpZiAoZm9ybWF0ID09PSBcImpzb25cIikge1xuICAgICAgICAgICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KHtcbiAgICAgICAgICAgICAgICB0eXBlOiBcImNvbnN0cnVjdG9yXCIsXG4gICAgICAgICAgICAgICAgc3RhdGVNdXRhYmlsaXR5OiAodGhpcy5wYXlhYmxlID8gXCJwYXlhYmxlXCIgOiBcInVuZGVmaW5lZFwiKSxcbiAgICAgICAgICAgICAgICBwYXlhYmxlOiB0aGlzLnBheWFibGUsXG4gICAgICAgICAgICAgICAgZ2FzOiAoKHRoaXMuZ2FzICE9IG51bGwpID8gdGhpcy5nYXMgOiB1bmRlZmluZWQpLFxuICAgICAgICAgICAgICAgIGlucHV0czogdGhpcy5pbnB1dHMubWFwKChpKSA9PiBKU09OLnBhcnNlKGkuZm9ybWF0KGZvcm1hdCkpKVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgcmVzdWx0ID0gW2Bjb25zdHJ1Y3RvciR7am9pblBhcmFtcyhmb3JtYXQsIHRoaXMuaW5wdXRzKX1gXTtcbiAgICAgICAgaWYgKHRoaXMucGF5YWJsZSkge1xuICAgICAgICAgICAgcmVzdWx0LnB1c2goXCJwYXlhYmxlXCIpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLmdhcyAhPSBudWxsKSB7XG4gICAgICAgICAgICByZXN1bHQucHVzaChgQCR7dGhpcy5nYXMudG9TdHJpbmcoKX1gKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzdWx0LmpvaW4oXCIgXCIpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiAgUmV0dXJucyBhIG5ldyAqKkNvbnN0cnVjdG9yRnJhZ21lbnQqKiBmb3IgJSVvYmolJS5cbiAgICAgKi9cbiAgICBzdGF0aWMgZnJvbShvYmopIHtcbiAgICAgICAgaWYgKENvbnN0cnVjdG9yRnJhZ21lbnQuaXNGcmFnbWVudChvYmopKSB7XG4gICAgICAgICAgICByZXR1cm4gb2JqO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2YgKG9iaikgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIENvbnN0cnVjdG9yRnJhZ21lbnQuZnJvbShsZXgob2JqKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgICAgICBhc3NlcnRBcmd1bWVudChmYWxzZSwgXCJpbnZhbGlkIGNvbnN0dWN0b3IgZnJhZ21lbnRcIiwgXCJvYmpcIiwgb2JqKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChvYmogaW5zdGFuY2VvZiBUb2tlblN0cmluZykge1xuICAgICAgICAgICAgY29uc3VtZUtleXdvcmRzKG9iaiwgc2V0aWZ5KFtcImNvbnN0cnVjdG9yXCJdKSk7XG4gICAgICAgICAgICBjb25zdCBpbnB1dHMgPSBjb25zdW1lUGFyYW1zKG9iaik7XG4gICAgICAgICAgICBjb25zdCBwYXlhYmxlID0gISFjb25zdW1lS2V5d29yZHMob2JqLCBLd1Zpc2liRGVwbG95KS5oYXMoXCJwYXlhYmxlXCIpO1xuICAgICAgICAgICAgY29uc3QgZ2FzID0gY29uc3VtZUdhcyhvYmopO1xuICAgICAgICAgICAgY29uc3VtZUVvaShvYmopO1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBDb25zdHJ1Y3RvckZyYWdtZW50KF9ndWFyZCwgXCJjb25zdHJ1Y3RvclwiLCBpbnB1dHMsIHBheWFibG
26774UsIGdhcyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG5ldyBDb25zdHJ1Y3RvckZyYWdtZW50KF9ndWFyZCwgXCJjb25zdHJ1Y3RvclwiLCBvYmouaW5wdXRzID8gb2JqLmlucHV0cy5tYXAoUGFyYW1UeXBlLmZyb20pIDogW10sICEhb2JqLnBheWFibGUsIChvYmouZ2FzICE9IG51bGwpID8gb2JqLmdhcyA6IG51bGwpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiAgUmV0dXJucyBgYHRydWVgYCBhbmQgcHJvdmlkZXMgYSB0eXBlIGd1YXJkIGlmICUldmFsdWUlJSBpcyBhXG4gICAgICogICoqQ29uc3RydWN0b3JGcmFnbWVudCoqLlxuICAgICAqL1xuICAgIHN0YXRpYyBpc0ZyYWdtZW50KHZhbHVlKSB7XG4gICAgICAgIHJldHVybiAodmFsdWUgJiYgdmFsdWVbaW50ZXJuYWxdID09PSBDb25zdHJ1Y3RvckZyYWdtZW50SW50ZXJuYWwpO1xuICAgIH1cbn1cbi8qKlxuICogIEEgRnJhZ21lbnQgd2hpY2ggcmVwcmVzZW50cyBhIG1ldGhvZC5cbiAqL1xuZXhwb3J0IGNsYXNzIEZhbGxiYWNrRnJhZ21lbnQgZXh0ZW5kcyBGcmFnbWVudCB7XG4gICAgLyoqXG4gICAgICogIElmIHRoZSBmdW5jdGlvbiBjYW4gYmUgc2VudCB2YWx1ZSBkdXJpbmcgaW52b2NhdGlvbi5cbiAgICAgKi9cbiAgICBwYXlhYmxlO1xuICAgIGNvbnN0cnVjdG9yKGd1YXJkLCBpbnB1dHMsIHBheWFibGUpIHtcbiAgICAgICAgc3VwZXIoZ3VhcmQsIFwiZmFsbGJhY2tcIiwgaW5wdXRzKTtcbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsIGludGVybmFsLCB7IHZhbHVlOiBGYWxsYmFja0ZyYWdtZW50SW50ZXJuYWwgfSk7XG4gICAgICAgIGRlZmluZVByb3BlcnRpZXModGhpcywgeyBwYXlhYmxlIH0pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiAgUmV0dXJucyBhIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGlzIGZhbGxiYWNrIGFzICUlZm9ybWF0JSUuXG4gICAgICovXG4gICAgZm9ybWF0KGZvcm1hdCkge1xuICAgICAgICBjb25zdCB0eXBlID0gKCh0aGlzLmlucHV0cy5sZW5ndGggPT09IDApID8gXCJyZWNlaXZlXCIgOiBcImZhbGxiYWNrXCIpO1xuICAgICAgICBpZiAoZm9ybWF0ID09PSBcImpzb25cIikge1xuICAgICAgICAgICAgY29uc3Qgc3RhdGVNdXRhYmlsaXR5ID0gKHRoaXMucGF5YWJsZSA/IFwicGF5YWJsZVwiIDogXCJub25wYXlhYmxlXCIpO1xuICAgICAgICAgICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KHsgdHlwZSwgc3RhdGVNdXRhYmlsaXR5IH0pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBgJHt0eXBlfSgpJHt0aGlzLnBheWFibGUgPyBcIiBwYXlhYmxlXCIgOiBcIlwifWA7XG4gICAgfVxuICAgIC8qKlxuICAgICAqICBSZXR1cm5zIGEgbmV3ICoqRmFsbGJhY2tGcmFnbWVudCoqIGZvciAlJW9iaiUlLlxuICAgICAqL1xuICAgIHN0YXRpYyBmcm9tKG9iaikge1xuICAgICAgICBpZiAoRmFsbGJhY2tGcmFnbWVudC5pc0ZyYWdtZW50KG9iaikpIHtcbiAgICAgICAgICAgIHJldHVybiBvYmo7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGVvZiAob2JqKSA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gRmFsbGJhY2tGcmFnbWVudC5mcm9tKGxleChvYmopKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgICAgIGFzc2VydEFyZ3VtZW50KGZhbHNlLCBcImludmFsaWQgZmFsbGJhY2sgZnJhZ21lbnRcIiwgXCJvYmpcIiwgb2JqKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChvYmogaW5zdGFuY2VvZiBUb2tlblN0cmluZykge1xuICAgICAgICAgICAgY29uc3QgZXJyb3JPYmogPSBvYmoudG9TdHJpbmcoKTtcbiAgICAgICAgICAgIGNvbnN0IHRvcElzVmFsaWQgPSBvYmoucGVla0tleXdvcmQoc2V0aWZ5KFtcImZhbGxiYWNrXCIsIFwicmVjZWl2ZVwiXSkpO1xuICAgICAgICAgICAgYXNzZXJ0QXJndW1lbnQodG9wSXNWYWxpZCwgXCJ0eXBlIG11c3QgYmUgZmFsbGJhY2sgb3IgcmVjZWl2ZVwiLCBcIm9ialwiLCBlcnJvck9iaik7XG4gICAgICAgICAgICBjb25zdCB0eXBlID0gb2JqLnBvcEtleXdvcmQoc2V0aWZ5KFtcImZhbGxiYWNrXCIsIFwicmVjZWl2ZVwiXSkpO1xuICAgICAgICAgICAgLy8gcmVjZWl2ZSgpXG4gICAgICAgICAgICBpZiAodHlwZSA9PT0gXCJyZWNlaXZlXCIpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBpbnB1dHMgPSBjb25zdW1lUGFyYW1zKG9iaik7XG4gICAgICAgICAgICAgICAgYXNzZXJ0QXJndW1lbnQoaW5wdXRzLmxlbmd0aCA9PT0gMCwgYHJlY2VpdmUgY2Fubm90IGhhdmUgYXJndW1lbnRzYCwgXCJvYmouaW5wdXRzXCIsIGlucHV0cyk7XG4gICAgICAgICAgICAgICAgY29uc3VtZUtleXdvcmRzKG9iaiwgc2V0aWZ5KFtcInBheWFibGVcIl0pKTtcbiAgICAgICAgICAgICAgICBjb25zdW1lRW9pKG9iaik7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBGYWxsYmFja0ZyYWdtZW50KF9ndWFyZCwgW10sIHRydWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gZmFsbGJhY2soKSBbcGF5YWJsZV1cbiAgICAgICAgICAgIC8vIGZhbGxiYWNrKGJ5dGVzKSBbcGF5YWJsZV0gcmV0dXJucyAoYnl0ZXMpXG4gICAgICAgICAgICBsZXQgaW5wdXRzID0gY29uc3VtZVBhcmFtcyhvYmopO1xuICAgICAgICAgICAgaWYgKGlucHV0cy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICBhc3NlcnRBcmd1bWVudChpbnB1dHMubGVuZ3RoID09PSAxICYmIGlucHV0c1swXS50eXBlID09PSBcImJ5dGVzXCIsIFwiaW52YWxpZCBmYWxsYmFjayBpbnB1dHNcIiwgXCJvYmouaW5wdXRzXCIsIGlucHV0cy5tYXAoKGkpID0+IGkuZm9ybWF0KFwibWluaW1hbFwiKSkuam9pbihcIiwgXCIpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGlucHV0cyA9IFtQYXJhbVR5cGUuZnJvbShcImJ5dGVzXCIpXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IG11dGFiaWxpdHkgPSBjb25zdW1lTXV0YWJpbGl0eShvYmopO1xuICAgICAgICAgICAgYXNzZXJ0QXJndW1lbnQobXV0YWJpbGl0eSA9PT0gXCJub25wYXlhYmxlXCIgfHwgbXV0YWJpbGl0eSA9PT0gXCJwYXlhYmxlXCIsIFwiZmFsbGJhY2sgY2Fubm90IGJlIGNvbnN0YW50c1wiLCBcIm9iai5zdGF0ZU11dGFiaWxpdHlcIiwgbXV0YWJpbGl0eSk7XG4gICAgICAgICAgICBpZiAoY29uc3VtZUtleXdvcmRzKG9iaiwgc2V0aWZ5KFtcInJldHVybnNcIl0pKS5oYXMoXCJyZXR1cm5zXCIpKSB7XG4gICAgICAgICAgICAgICAgY29uc3Qgb3V0cHV0cyA9IGNvbnN1bWVQYXJhbXMob2JqKTtcbiAgICAgICAgICAgICAgICBhc3NlcnRBcmd1bWVudChvdXRwdXRzLmxlbmd0aCA9PT0gMSAmJi
26774BvdXRwdXRzWzBdLnR5cGUgPT09IFwiYnl0ZXNcIiwgXCJpbnZhbGlkIGZhbGxiYWNrIG91dHB1dHNcIiwgXCJvYmoub3V0cHV0c1wiLCBvdXRwdXRzLm1hcCgoaSkgPT4gaS5mb3JtYXQoXCJtaW5pbWFsXCIpKS5qb2luKFwiLCBcIikpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3VtZUVvaShvYmopO1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBGYWxsYmFja0ZyYWdtZW50KF9ndWFyZCwgaW5wdXRzLCBtdXRhYmlsaXR5ID09PSBcInBheWFibGVcIik7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG9iai50eXBlID09PSBcInJlY2VpdmVcIikge1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBGYWxsYmFja0ZyYWdtZW50KF9ndWFyZCwgW10sIHRydWUpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChvYmoudHlwZSA9PT0gXCJmYWxsYmFja1wiKSB7XG4gICAgICAgICAgICBjb25zdCBpbnB1dHMgPSBbUGFyYW1UeXBlLmZyb20oXCJieXRlc1wiKV07XG4gICAgICAgICAgICBjb25zdCBwYXlhYmxlID0gKG9iai5zdGF0ZU11dGFiaWxpdHkgPT09IFwicGF5YWJsZVwiKTtcbiAgICAgICAgICAgIHJldHVybiBuZXcgRmFsbGJhY2tGcmFnbWVudChfZ3VhcmQsIGlucHV0cywgcGF5YWJsZSk7XG4gICAgICAgIH1cbiAgICAgICAgYXNzZXJ0QXJndW1lbnQoZmFsc2UsIFwiaW52YWxpZCBmYWxsYmFjayBkZXNjcmlwdGlvblwiLCBcIm9ialwiLCBvYmopO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiAgUmV0dXJucyBgYHRydWVgYCBhbmQgcHJvdmlkZXMgYSB0eXBlIGd1YXJkIGlmICUldmFsdWUlJSBpcyBhXG4gICAgICogICoqRmFsbGJhY2tGcmFnbWVudCoqLlxuICAgICAqL1xuICAgIHN0YXRpYyBpc0ZyYWdtZW50KHZhbHVlKSB7XG4gICAgICAgIHJldHVybiAodmFsdWUgJiYgdmFsdWVbaW50ZXJuYWxdID09PSBGYWxsYmFja0ZyYWdtZW50SW50ZXJuYWwpO1xuICAgIH1cbn1cbi8qKlxuICogIEEgRnJhZ21lbnQgd2hpY2ggcmVwcmVzZW50cyBhIG1ldGhvZC5cbiAqL1xuZXhwb3J0IGNsYXNzIEZ1bmN0aW9uRnJhZ21lbnQgZXh0ZW5kcyBOYW1lZEZyYWdtZW50IHtcbiAgICAvKipcbiAgICAgKiAgSWYgdGhlIGZ1bmN0aW9uIGlzIGNvbnN0YW50IChlLmcuIGBgcHVyZWBgIG9yIGBgdmlld2BgIGZ1bmN0aW9ucykuXG4gICAgICovXG4gICAgY29uc3RhbnQ7XG4gICAgLyoqXG4gICAgICogIFRoZSByZXR1cm5lZCB0eXBlcyBmb3IgdGhlIHJlc3VsdCBvZiBjYWxsaW5nIHRoaXMgZnVuY3Rpb24uXG4gICAgICovXG4gICAgb3V0cHV0cztcbiAgICAvKipcbiAgICAgKiAgVGhlIHN0YXRlIG11dGFiaWxpdHkgKGUuZy4gYGBwYXlhYmxlYGAsIGBgbm9ucGF5YWJsZWBgLCBgYHZpZXdgYFxuICAgICAqICBvciBgYHB1cmVgYClcbiAgICAgKi9cbiAgICBzdGF0ZU11dGFiaWxpdHk7XG4gICAgLyoqXG4gICAgICogIElmIHRoZSBmdW5jdGlvbiBjYW4gYmUgc2VudCB2YWx1ZSBkdXJpbmcgaW52b2NhdGlvbi5cbiAgICAgKi9cbiAgICBwYXlhYmxlO1xuICAgIC8qKlxuICAgICAqICBUaGUgcmVjb21tZW5kZWQgZ2FzIGxpbWl0IHRvIHNlbmQgd2hlbiBjYWxsaW5nIHRoaXMgZnVuY3Rpb24uXG4gICAgICovXG4gICAgZ2FzO1xuICAgIC8qKlxuICAgICAqICBAcHJpdmF0ZVxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yKGd1YXJkLCBuYW1lLCBzdGF0ZU11dGFiaWxpdHksIGlucHV0cywgb3V0cHV0cywgZ2FzKSB7XG4gICAgICAgIHN1cGVyKGd1YXJkLCBcImZ1bmN0aW9uXCIsIG5hbWUsIGlucHV0cyk7XG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCBpbnRlcm5hbCwgeyB2YWx1ZTogRnVuY3Rpb25GcmFnbWVudEludGVybmFsIH0pO1xuICAgICAgICBvdXRwdXRzID0gT2JqZWN0LmZyZWV6ZShvdXRwdXRzLnNsaWNlKCkpO1xuICAgICAgICBjb25zdCBjb25zdGFudCA9IChzdGF0ZU11dGFiaWxpdHkgPT09IFwidmlld1wiIHx8IHN0YXRlTXV0YWJpbGl0eSA9PT0gXCJwdXJlXCIpO1xuICAgICAgICBjb25zdCBwYXlhYmxlID0gKHN0YXRlTXV0YWJpbGl0eSA9PT0gXCJwYXlhYmxlXCIpO1xuICAgICAgICBkZWZpbmVQcm9wZXJ0aWVzKHRoaXMsIHsgY29uc3RhbnQsIGdhcywgb3V0cHV0cywgcGF5YWJsZSwgc3RhdGVNdXRhYmlsaXR5IH0pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiAgVGhlIEZ1bmN0aW9uIHNlbGVjdG9yLlxuICAgICAqL1xuICAgIGdldCBzZWxlY3RvcigpIHtcbiAgICAgICAgcmV0dXJuIGlkKHRoaXMuZm9ybWF0KFwic2lnaGFzaFwiKSkuc3Vic3RyaW5nKDAsIDEwKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogIFJldHVybnMgYSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhpcyBmdW5jdGlvbiBhcyAlJWZvcm1hdCUlLlxuICAgICAqL1xuICAgIGZvcm1hdChmb3JtYXQpIHtcbiAgICAgICAgaWYgKGZvcm1hdCA9PSBudWxsKSB7XG4gICAgICAgICAgICBmb3JtYXQgPSBcInNpZ2hhc2hcIjtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZm9ybWF0ID09PSBcImpzb25cIikge1xuICAgICAgICAgICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KHtcbiAgICAgICAgICAgICAgICB0eXBlOiBcImZ1bmN0aW9uXCIsXG4gICAgICAgICAgICAgICAgbmFtZTogdGh
26774pcy5uYW1lLFxuICAgICAgICAgICAgICAgIGNvbnN0YW50OiB0aGlzLmNvbnN0YW50LFxuICAgICAgICAgICAgICAgIHN0YXRlTXV0YWJpbGl0eTogKCh0aGlzLnN0YXRlTXV0YWJpbGl0eSAhPT0gXCJub25wYXlhYmxlXCIpID8gdGhpcy5zdGF0ZU11dGFiaWxpdHkgOiB1bmRlZmluZWQpLFxuICAgICAgICAgICAgICAgIHBheWFibGU6IHRoaXMucGF5YWJsZSxcbiAgICAgICAgICAgICAgICBnYXM6ICgodGhpcy5nYXMgIT0gbnVsbCkgPyB0aGlzLmdhcyA6IHVuZGVmaW5lZCksXG4gICAgICAgICAgICAgICAgaW5wdXRzOiB0aGlzLmlucHV0cy5tYXAoKGkpID0+IEpTT04ucGFyc2UoaS5mb3JtYXQoZm9ybWF0KSkpLFxuICAgICAgICAgICAgICAgIG91dHB1dHM6IHRoaXMub3V0cHV0cy5tYXAoKG8pID0+IEpTT04ucGFyc2Uoby5mb3JtYXQoZm9ybWF0KSkpLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgcmVzdWx0ID0gW107XG4gICAgICAgIGlmIChmb3JtYXQgIT09IFwic2lnaGFzaFwiKSB7XG4gICAgICAgICAgICByZXN1bHQucHVzaChcImZ1bmN0aW9uXCIpO1xuICAgICAgICB9XG4gICAgICAgIHJlc3VsdC5wdXNoKHRoaXMubmFtZSArIGpvaW5QYXJhbXMoZm9ybWF0LCB0aGlzLmlucHV0cykpO1xuICAgICAgICBpZiAoZm9ybWF0ICE9PSBcInNpZ2hhc2hcIikge1xuICAgICAgICAgICAgaWYgKHRoaXMuc3RhdGVNdXRhYmlsaXR5ICE9PSBcIm5vbnBheWFibGVcIikge1xuICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKHRoaXMuc3RhdGVNdXRhYmlsaXR5KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh0aGlzLm91dHB1dHMgJiYgdGhpcy5vdXRwdXRzLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKFwicmV0dXJuc1wiKTtcbiAgICAgICAgICAgICAgICByZXN1bHQucHVzaChqb2luUGFyYW1zKGZvcm1hdCwgdGhpcy5vdXRwdXRzKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAodGhpcy5nYXMgIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKGBAJHt0aGlzLmdhcy50b1N0cmluZygpfWApO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXN1bHQuam9pbihcIiBcIik7XG4gICAgfVxuICAgIC8qKlxuICAgICAqICBSZXR1cm4gdGhlIHNlbGVjdG9yIGZvciBhIGZ1bmN0aW9uIHdpdGggJSVuYW1lJSUgYW5kICUlcGFyYW1zJSUuXG4gICAgICovXG4gICAgc3RhdGljIGdldFNlbGVjdG9yKG5hbWUsIHBhcmFtcykge1xuICAgICAgICBwYXJhbXMgPSAocGFyYW1zIHx8IFtdKS5tYXAoKHApID0+IFBhcmFtVHlwZS5mcm9tKHApKTtcbiAgICAgICAgY29uc3QgZnJhZ21lbnQgPSBuZXcgRnVuY3Rpb25GcmFnbWVudChfZ3VhcmQsIG5hbWUsIFwidmlld1wiLCBwYXJhbXMsIFtdLCBudWxsKTtcbiAgICAgICAgcmV0dXJuIGZyYWdtZW50LnNlbGVjdG9yO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiAgUmV0dXJucyBhIG5ldyAqKkZ1bmN0aW9uRnJhZ21lbnQqKiBmb3IgJSVvYmolJS5cbiAgICAgKi9cbiAgICBzdGF0aWMgZnJvbShvYmopIHtcbiAgICAgICAgaWYgKEZ1bmN0aW9uRnJhZ21lbnQuaXNGcmFnbWVudChvYmopKSB7XG4gICAgICAgICAgICByZXR1cm4gb2JqO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2YgKG9iaikgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIEZ1bmN0aW9uRnJhZ21lbnQuZnJvbShsZXgob2JqKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgICAgICBhc3NlcnRBcmd1bWVudChmYWxzZSwgXCJpbnZhbGlkIGZ1bmN0aW9uIGZyYWdtZW50XCIsIFwib2JqXCIsIG9iaik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAob2JqIGluc3RhbmNlb2YgVG9rZW5TdHJpbmcpIHtcbiAgICAgICAgICAgIGNvbnN0IG5hbWUgPSBjb25zdW1lTmFtZShcImZ1bmN0aW9uXCIsIG9iaik7XG4gICAgICAgICAgICBjb25zdCBpbnB1dHMgPSBjb25zdW1lUGFyYW1zKG9iaik7XG4gICAgICAgICAgICBjb25zdCBtdXRhYmlsaXR5ID0gY29uc3VtZU11dGFiaWxpdHkob2JqKTtcbiAgICAgICAgICAgIGxldCBvdXRwdXRzID0gW107XG4gICAgICAgICAgICBpZiAoY29uc3VtZUtleXdvcmRzKG9iaiwgc2V0aWZ5KFtcInJldHVybnNcIl0pKS5oYXMoXCJyZXR1cm5zXCIpKSB7XG4gICAgICAgICAgICAgICAgb3V0cHV0cyA9IGNvbnN1bWVQYXJhbXMob2JqKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IGdhcyA9IGNvbnN1bWVHYXMob2JqKTtcbiAgICAgICAgICAgIGNvbnN1bWVFb2kob2JqKTtcbiAgICAgICAgICAgIHJldHVybiBuZXcgRnVuY3Rpb25GcmFnbWVudChfZ3VhcmQsIG5hbWUsIG11dGFiaWxpdHksIGlucHV0cywgb3V0cHV0cywgZ2FzKTtcbiAgICAgICAgfVxuICAgICAgICBsZXQgc3RhdGVNdXRhYmlsaXR5ID0gb2JqLnN0YXRlTXV0YWJpbGl0eTtcbiAgICAgICAgLy8gVXNlIGxlZ2FjeSBTb2xpZGl0eSBBQkkgbG9naWMgaWYgc3RhdGVNdXRhYmlsaXR5IGlzIG1pc3NpbmdcbiAgICAgICAgaWYgKHN0YXRlTXV0YWJpbGl0eSA9PSBudWxsKSB7XG4gICAgICAgICAgICBzdGF0ZU11dGFiaWxpdHkgPSBcInBheWFibGVcIjtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgKG9iai5jb25zdGFudCkgPT09IFwiYm9vbGVhblwiKSB7XG4gICAgICAgICAgICAgICAgc3RhdGVNdXRhYmlsaXR5ID0gXCJ2aWV3XCI7XG4gICAgICAgICAgICAgICAgaWYgKCFvYmouY29uc3RhbnQpIHtcbiAgICAgICAgICAgICAgICAgICAgc3RhdGVNdXRhYmlsaXR5ID0gXCJwYXlhYmxlXCI7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgKG9iai5wYXlhYmxlKSA9PT0gXCJib29sZWFuXCIgJiYgIW9iai5wYXlhYmxlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZU11dGFiaWxpdHkgPSBcIm5vbnBheWFibGVcIjtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgI
26774H1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKHR5cGVvZiAob2JqLnBheWFibGUpID09PSBcImJvb2xlYW5cIiAmJiAhb2JqLnBheWFibGUpIHtcbiAgICAgICAgICAgICAgICBzdGF0ZU11dGFiaWxpdHkgPSBcIm5vbnBheWFibGVcIjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAvLyBAVE9ETzogdmVyaWZ5U3RhdGUgZm9yIHN0YXRlTXV0YWJpbGl0eSAoZS5nLiB0aHJvdyBpZlxuICAgICAgICAvLyAgICAgICAgcGF5YWJsZTogZmFsc2UgYnV0IHN0YXRlTXV0YWJpbGl0eSBpcyBcIm5vbnBheWFibGVcIilcbiAgICAgICAgcmV0dXJuIG5ldyBGdW5jdGlvbkZyYWdtZW50KF9ndWFyZCwgb2JqLm5hbWUsIHN0YXRlTXV0YWJpbGl0eSwgb2JqLmlucHV0cyA/IG9iai5pbnB1dHMubWFwKFBhcmFtVHlwZS5mcm9tKSA6IFtdLCBvYmoub3V0cHV0cyA/IG9iai5vdXRwdXRzLm1hcChQYXJhbVR5cGUuZnJvbSkgOiBbXSwgKG9iai5nYXMgIT0gbnVsbCkgPyBvYmouZ2FzIDogbnVsbCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqICBSZXR1cm5zIGBgdHJ1ZWBgIGFuZCBwcm92aWRlcyBhIHR5cGUgZ3VhcmQgaWYgJSV2YWx1ZSUlIGlzIGFcbiAgICAgKiAgKipGdW5jdGlvbkZyYWdtZW50KiouXG4gICAgICovXG4gICAgc3RhdGljIGlzRnJhZ21lbnQodmFsdWUpIHtcbiAgICAgICAgcmV0dXJuICh2YWx1ZSAmJiB2YWx1ZVtpbnRlcm5hbF0gPT09IEZ1bmN0aW9uRnJhZ21lbnRJbnRlcm5hbCk7XG4gICAgfVxufVxuLyoqXG4gKiAgQSBGcmFnbWVudCB3aGljaCByZXByZXNlbnRzIGEgc3RydWN0dXJlLlxuICovXG5leHBvcnQgY2xhc3MgU3RydWN0RnJhZ21lbnQgZXh0ZW5kcyBOYW1lZEZyYWdtZW50IHtcbiAgICAvKipcbiAgICAgKiAgQHByaXZhdGVcbiAgICAgKi9cbiAgICBjb25zdHJ1Y3RvcihndWFyZCwgbmFtZSwgaW5wdXRzKSB7XG4gICAgICAgIHN1cGVyKGd1YXJkLCBcInN0cnVjdFwiLCBuYW1lLCBpbnB1dHMpO1xuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgaW50ZXJuYWwsIHsgdmFsdWU6IFN0cnVjdEZyYWdtZW50SW50ZXJuYWwgfSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqICBSZXR1cm5zIGEgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgc3RydWN0IGFzICUlZm9ybWF0JSUuXG4gICAgICovXG4gICAgZm9ybWF0KCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJAVE9ET1wiKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogIFJldHVybnMgYSBuZXcgKipTdHJ1Y3RGcmFnbWVudCoqIGZvciAlJW9iaiUlLlxuICAgICAqL1xuICAgIHN0YXRpYyBmcm9tKG9iaikge1xuICAgICAgICBpZiAodHlwZW9mIChvYmopID09PSBcInN0cmluZ1wiKSB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIHJldHVybiBTdHJ1Y3RGcmFnbWVudC5mcm9tKGxleChvYmopKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgICAgIGFzc2VydEFyZ3VtZW50KGZhbHNlLCBcImludmFsaWQgc3RydWN0IGZyYWdtZW50XCIsIFwib2JqXCIsIG9iaik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAob2JqIGluc3RhbmNlb2YgVG9rZW5TdHJpbmcpIHtcbiAgICAgICAgICAgIGNvbnN0IG5hbWUgPSBjb25zdW1lTmFtZShcInN0cnVjdFwiLCBvYmopO1xuICAgICAgICAgICAgY29uc3QgaW5wdXRzID0gY29uc3VtZVBhcmFtcyhvYmopO1xuICAgICAgICAgICAgY29uc3VtZUVvaShvYmopO1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBTdHJ1Y3RGcmFnbWVudChfZ3VhcmQsIG5hbWUsIGlucHV0cyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG5ldyBTdHJ1Y3RGcmFnbWVudChfZ3VhcmQsIG9iai5uYW1lLCBvYmouaW5wdXRzID8gb2JqLmlucHV0cy5tYXAoUGFyYW1UeXBlLmZyb20pIDogW10pO1xuICAgIH1cbiAgICAvLyBAVE9ETzogZml4IHRoaXMgcmV0dXJuIHR5cGVcbiAgICAvKipcbiAgICAgKiAgUmV0dXJucyBgYHRydWVgYCBhbmQgcHJvdmlkZXMgYSB0eXBlIGd1YXJkIGlmICUldmFsdWUlJSBpcyBhXG4gICAgICogICoqU3RydWN0RnJhZ21lbnQqKi5cbiAgICAgKi9cbiAgICBzdGF0aWMgaXNGcmFnbWVudCh2YWx1ZSkge1xuICAgICAgICByZXR1cm4gKHZhbHVlICYmIHZhbHVlW2ludGVybmFsXSA9PT0gU3RydWN0RnJhZ21lbnRJbnRlcm5hbCk7XG4gICAgfVxufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9ZnJhZ21lbnRzLmpzLm1hcCIsIi8qKlxuICogIFdoZW4gc2VuZGluZyB2YWx1ZXMgdG8gb3IgcmVjZWl2aW5nIHZhbHVlcyBmcm9tIGEgW1tDb250cmFjdF1dLCB0aGVcbiAqICBkYXRhIGlzIGdlbmVyYWxseSBlbmNvZGVkIHVzaW5nIHRoZSBbQUJJIHN0YW5kYXJkXShsaW5rLXNvbGMtYWJpKS5cbiAqXG4gKiAgVGhlIEFiaUNvZGVyIHByb3ZpZGVzIGEgdXRpbGl0eSB0byBlbmNvZGUgdmFsdWVzIHRvIEFCSSBkYXRhIGFuZFxuICogIGRlY29kZSB2YWx1ZXMgZnJvbSBBQkkgZGF0YS5cbiAqXG4gKiAgTW9zdCBvZiB0aGUgdGltZSwgZGV2ZWxvcGVycyBzaG91bGQgZmF2b3VyIHRoZSBbW0NvbnRyYWN0XV0gY2xhc3MsXG4gKiAgd2hpY2ggZnVydGhlciBhYnN0cmFjdHMgYSBsb3Qgb2YgdGhlIGZpbmVyIGRldGFpbHMgb2YgQUJJIGRhdGEuXG4gKlxuICogIEBfc2VjdGlvbiBhcGkvYWJpL2FiaS1jb2RlcjpBQkkgRW5jb2RpbmdcbiAqL1xuLy8gU2VlOiBodHRwczovL2dpdGh1Yi5jb20vZXRoZXJldW0vd2lraS93aWtpL0V0aGVyZXVtLUNvbnRyYWN0LUFCSVxuaW1wb3J0IHsgYXNzZXJ0QXJndW1lbnRDb3VudCwgYXNzZXJ0QXJndW1lbnQgfSBmcm9tIFwiLi4vdXRpbHMvaW5kZXguanNcIjtcbmltcG9ydCB7IFJlYWRlciwgV3JpdGVyIH0gZnJvbSBcIi4vY29kZXJzL2Fic3RyYWN0LWNvZGVyLmpzXCI7XG5pbXBvcnQgeyBBZGRyZXNzQ29kZXIgfSBmcm9tIFwiLi9jb2RlcnMvYWRkcmVzcy5qc1wiO1xuaW1wb3J0IHsgQXJyYXlDb2RlciB9IGZyb20gXCIuL2NvZGVycy9hcnJheS5qc1wiO1xuaW1wb3J0IHsgQm9vbGVhbkNvZGVyIH0gZnJvbSBcIi4vY29kZXJzL2Jvb2xlYW4uanNcIjtcbmltcG9ydCB7
26774IEJ5dGVzQ29kZXIgfSBmcm9tIFwiLi9jb2RlcnMvYnl0ZXMuanNcIjtcbmltcG9ydCB7IEZpeGVkQnl0ZXNDb2RlciB9IGZyb20gXCIuL2NvZGVycy9maXhlZC1ieXRlcy5qc1wiO1xuaW1wb3J0IHsgTnVsbENvZGVyIH0gZnJvbSBcIi4vY29kZXJzL251bGwuanNcIjtcbmltcG9ydCB7IE51bWJlckNvZGVyIH0gZnJvbSBcIi4vY29kZXJzL251bWJlci5qc1wiO1xuaW1wb3J0IHsgU3RyaW5nQ29kZXIgfSBmcm9tIFwiLi9jb2RlcnMvc3RyaW5nLmpzXCI7XG5pbXBvcnQgeyBUdXBsZUNvZGVyIH0gZnJvbSBcIi4vY29kZXJzL3R1cGxlLmpzXCI7XG5pbXBvcnQgeyBQYXJhbVR5cGUgfSBmcm9tIFwiLi9mcmFnbWVudHMuanNcIjtcbmltcG9ydCB7IGdldEFkZHJlc3MgfSBmcm9tIFwiLi4vYWRkcmVzcy9pbmRleC5qc1wiO1xuaW1wb3J0IHsgZ2V0Qnl0ZXMsIGhleGxpZnksIG1ha2VFcnJvciB9IGZyb20gXCIuLi91dGlscy9pbmRleC5qc1wiO1xuLy8gaHR0cHM6Ly9kb2NzLnNvbGlkaXR5bGFuZy5vcmcvZW4vdjAuOC4xNy9jb250cm9sLXN0cnVjdHVyZXMuaHRtbFxuY29uc3QgUGFuaWNSZWFzb25zID0gbmV3IE1hcCgpO1xuUGFuaWNSZWFzb25zLnNldCgweDAwLCBcIkdFTkVSSUNfUEFOSUNcIik7XG5QYW5pY1JlYXNvbnMuc2V0KDB4MDEsIFwiQVNTRVJUX0ZBTFNFXCIpO1xuUGFuaWNSZWFzb25zLnNldCgweDExLCBcIk9WRVJGTE9XXCIpO1xuUGFuaWNSZWFzb25zLnNldCgweDEyLCBcIkRJVklERV9CWV9aRVJPXCIpO1xuUGFuaWNSZWFzb25zLnNldCgweDIxLCBcIkVOVU1fUkFOR0VfRVJST1JcIik7XG5QYW5pY1JlYXNvbnMuc2V0KDB4MjIsIFwiQkFEX1NUT1JBR0VfREFUQVwiKTtcblBhbmljUmVhc29ucy5zZXQoMHgzMSwgXCJTVEFDS19VTkRFUkZMT1dcIik7XG5QYW5pY1JlYXNvbnMuc2V0KDB4MzIsIFwiQVJSQVlfUkFOR0VfRVJST1JcIik7XG5QYW5pY1JlYXNvbnMuc2V0KDB4NDEsIFwiT1VUX09GX01FTU9SWVwiKTtcblBhbmljUmVhc29ucy5zZXQoMHg1MSwgXCJVTklOSVRJQUxJWkVEX0ZVTkNUSU9OX0NBTExcIik7XG5jb25zdCBwYXJhbVR5cGVCeXRlcyA9IG5ldyBSZWdFeHAoL15ieXRlcyhbMC05XSopJC8pO1xuY29uc3QgcGFyYW1UeXBlTnVtYmVyID0gbmV3IFJlZ0V4cCgvXih1P2ludCkoWzAtOV0qKSQvKTtcbmxldCBkZWZhdWx0Q29kZXIgPSBudWxsO1xubGV0IGRlZmF1bHRNYXhJbmZsYXRpb24gPSAxMDI0O1xuZnVuY3Rpb24gZ2V0QnVpbHRpbkNhbGxFeGNlcHRpb24oYWN0aW9uLCB0eCwgZGF0YSwgYWJpQ29kZXIpIHtcbiAgICBsZXQgbWVzc2FnZSA9IFwibWlzc2luZyByZXZlcnQgZGF0YVwiO1xuICAgIGxldCByZWFzb24gPSBudWxsO1xuICAgIGNvbnN0IGludm9jYXRpb24gPSBudWxsO1xuICAgIGxldCByZXZlcnQgPSBudWxsO1xuICAgIGlmIChkYXRhKSB7XG4gICAgICAgIG1lc3NhZ2UgPSBcImV4ZWN1dGlvbiByZXZlcnRlZFwiO1xuICAgICAgICBjb25zdCBieXRlcyA9IGdldEJ5dGVzKGRhdGEpO1xuICAgICAgICBkYXRhID0gaGV4bGlmeShkYXRhKTtcbiAgICAgICAgaWYgKGJ5dGVzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgbWVzc2FnZSArPSBcIiAobm8gZGF0YSBwcmVzZW50OyBsaWtlbHkgcmVxdWlyZShmYWxzZSkgb2NjdXJyZWRcIjtcbiAgICAgICAgICAgIHJlYXNvbiA9IFwicmVxdWlyZShmYWxzZSlcIjtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChieXRlcy5sZW5ndGggJSAzMiAhPT0gNCkge1xuICAgICAgICAgICAgbWVzc2FnZSArPSBcIiAoY291bGQgbm90IGRlY29kZSByZWFzb247IGludmFsaWQgZGF0YSBsZW5ndGgpXCI7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoaGV4bGlmeShieXRlcy5zbGljZSgwLCA0KSkgPT09IFwiMHgwOGMzNzlhMFwiKSB7XG4gICAgICAgICAgICAvLyBFcnJvcihzdHJpbmcpXG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIHJlYXNvbiA9IGFiaUNvZGVyLmRlY29kZShbXCJzdHJpbmdcIl0sIGJ5dGVzLnNsaWNlKDQpKVswXTtcbiAgICAgICAgICAgICAgICByZXZlcnQgPSB7XG4gICAgICAgICAgICAgICAgICAgIHNpZ25hdHVyZTogXCJFcnJvcihzdHJpbmcpXCIsXG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiRXJyb3JcIixcbiAgICAgICAgICAgICAgICAgICAgYXJnczogW3JlYXNvbl1cbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIG1lc3NhZ2UgKz0gYDogJHtKU09OLnN0cmluZ2lmeShyZWFzb24pfWA7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgICAgICBtZXNzYWdlICs9IFwiIChjb3VsZCBub3QgZGVjb2RlIHJlYXNvbjsgaW52YWxpZCBzdHJpbmcgZGF0YSlcIjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChoZXhsaWZ5KGJ5dGVzLnNsaWNlKDAsIDQpKSA9PT0gXCIweDRlNDg3YjcxXCIpIHtcbiAgICAgICAgICAgIC8vIFBhbmljKHVpbnQyNTYpXG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGNvZGUgPSBOdW1iZXIoYWJpQ29kZXIuZGVjb2RlKFtcInVpbnQyNTZcIl0sIGJ5dGVzLnNsaWNlKDQpKVswXSk7XG4gICAgICAgICAgICAgICAgcmV2ZXJ0ID0ge1xuICAgICAgICAgICAgICAgICAgICBzaWduYXR1cmU6IFwiUGFuaWModWludDI1NilcIixcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJQYW5pY1wiLFxuICAgICAgICAgICAgICAgICAgICBhcmdzOiBbY29kZV1cbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIHJlYXNvbiA9IGBQYW5pYyBkdWUgdG8gJHtQYW5pY1JlYXNvbnMuZ2V0KGNvZGUpIHx8IFwiVU5LTk9XTlwifSgke2NvZGV9KWA7XG4gICAgICAgICAgICAgICAgbWVzc2FnZSArPSBgOiAke3JlYXNvbn1gO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICAgICAgbWVzc2FnZSArPSBcIiAoY291bGQgbm90IGRlY29kZSBwYW5pYyBjb2RlKVwiO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgbWVzc2FnZSArPSBcIiAodW5rbm93biBjdXN0b20gZXJyb3IpXCI7XG4gICAgICAgI
26774H1cbiAgICB9XG4gICAgY29uc3QgdHJhbnNhY3Rpb24gPSB7XG4gICAgICAgIHRvOiAodHgudG8gPyBnZXRBZGRyZXNzKHR4LnRvKSA6IG51bGwpLFxuICAgICAgICBkYXRhOiAodHguZGF0YSB8fCBcIjB4XCIpXG4gICAgfTtcbiAgICBpZiAodHguZnJvbSkge1xuICAgICAgICB0cmFuc2FjdGlvbi5mcm9tID0gZ2V0QWRkcmVzcyh0eC5mcm9tKTtcbiAgICB9XG4gICAgcmV0dXJuIG1ha2VFcnJvcihtZXNzYWdlLCBcIkNBTExfRVhDRVBUSU9OXCIsIHtcbiAgICAgICAgYWN0aW9uLCBkYXRhLCByZWFzb24sIHRyYW5zYWN0aW9uLCBpbnZvY2F0aW9uLCByZXZlcnRcbiAgICB9KTtcbn1cbi8qKlxuICogIFRoZSAqKkFiaUNvZGVyKiogaXMgYSBsb3ctbGV2ZWwgY2xhc3MgcmVzcG9uc2libGUgZm9yIGVuY29kaW5nIEphdmFTY3JpcHRcbiAqICB2YWx1ZXMgaW50byBiaW5hcnkgZGF0YSBhbmQgZGVjb2RpbmcgYmluYXJ5IGRhdGEgaW50byBKYXZhU2NyaXB0IHZhbHVlcy5cbiAqL1xuZXhwb3J0IGNsYXNzIEFiaUNvZGVyIHtcbiAgICAjZ2V0Q29kZXIocGFyYW0pIHtcbiAgICAgICAgaWYgKHBhcmFtLmlzQXJyYXkoKSkge1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBBcnJheUNvZGVyKHRoaXMuI2dldENvZGVyKHBhcmFtLmFycmF5Q2hpbGRyZW4pLCBwYXJhbS5hcnJheUxlbmd0aCwgcGFyYW0ubmFtZSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHBhcmFtLmlzVHVwbGUoKSkge1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBUdXBsZUNvZGVyKHBhcmFtLmNvbXBvbmVudHMubWFwKChjKSA9PiB0aGlzLiNnZXRDb2RlcihjKSksIHBhcmFtLm5hbWUpO1xuICAgICAgICB9XG4gICAgICAgIHN3aXRjaCAocGFyYW0uYmFzZVR5cGUpIHtcbiAgICAgICAgICAgIGNhc2UgXCJhZGRyZXNzXCI6XG4gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBBZGRyZXNzQ29kZXIocGFyYW0ubmFtZSk7XG4gICAgICAgICAgICBjYXNlIFwiYm9vbFwiOlxuICAgICAgICAgICAgICAgIHJldHVybiBuZXcgQm9vbGVhbkNvZGVyKHBhcmFtLm5hbWUpO1xuICAgICAgICAgICAgY2FzZSBcInN0cmluZ1wiOlxuICAgICAgICAgICAgICAgIHJldHVybiBuZXcgU3RyaW5nQ29kZXIocGFyYW0ubmFtZSk7XG4gICAgICAgICAgICBjYXNlIFwiYnl0ZXNcIjpcbiAgICAgICAgICAgICAgICByZXR1cm4gbmV3IEJ5dGVzQ29kZXIocGFyYW0ubmFtZSk7XG4gICAgICAgICAgICBjYXNlIFwiXCI6XG4gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBOdWxsQ29kZXIocGFyYW0ubmFtZSk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gdT9pbnRbMC05XSpcbiAgICAgICAgbGV0IG1hdGNoID0gcGFyYW0udHlwZS5tYXRjaChwYXJhbVR5cGVOdW1iZXIpO1xuICAgICAgICBpZiAobWF0Y2gpIHtcbiAgICAgICAgICAgIGxldCBzaXplID0gcGFyc2VJbnQobWF0Y2hbMl0gfHwgXCIyNTZcIik7XG4gICAgICAgICAgICBhc3NlcnRBcmd1bWVudChzaXplICE9PSAwICYmIHNpemUgPD0gMjU2ICYmIChzaXplICUgOCkgPT09IDAsIFwiaW52YWxpZCBcIiArIG1hdGNoWzFdICsgXCIgYml0IGxlbmd0aFwiLCBcInBhcmFtXCIsIHBhcmFtKTtcbiAgICAgICAgICAgIHJldHVybiBuZXcgTnVtYmVyQ29kZXIoc2l6ZSAvIDgsIChtYXRjaFsxXSA9PT0gXCJpbnRcIiksIHBhcmFtLm5hbWUpO1xuICAgICAgICB9XG4gICAgICAgIC8vIGJ5dGVzWzAtOV0rXG4gICAgICAgIG1hdGNoID0gcGFyYW0udHlwZS5tYXRjaChwYXJhbVR5cGVCeXRlcyk7XG4gICAgICAgIGlmIChtYXRjaCkge1xuICAgICAgICAgICAgbGV0IHNpemUgPSBwYXJzZUludChtYXRjaFsxXSk7XG4gICAgICAgICAgICBhc3NlcnRBcmd1bWVudChzaXplICE9PSAwICYmIHNpemUgPD0gMzIsIFwiaW52YWxpZCBieXRlcyBsZW5ndGhcIiwgXCJwYXJhbVwiLCBwYXJhbSk7XG4gICAgICAgICAgICByZXR1cm4gbmV3IEZpeGVkQnl0ZXNDb2RlcihzaXplLCBwYXJhbS5uYW1lKTtcbiAgICAgICAgfVxuICAgICAgICBhc3NlcnRBcmd1bWVudChmYWxzZSwgXCJpbnZhbGlkIHR5cGVcIiwgXCJ0eXBlXCIsIHBhcmFtLnR5cGUpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiAgR2V0IHRoZSBkZWZhdWx0IHZhbHVlcyBmb3IgdGhlIGdpdmVuICUldHlwZXMlJS5cbiAgICAgKlxuICAgICAqICBGb3IgZXhhbXBsZSwgYSBgYHVpbnRgYCBpcyBieSBkZWZh
26774dWx0IGBgMGBgIGFuZCBgYGJvb2xgYFxuICAgICAqICBpcyBieSBkZWZhdWx0IGBgZmFsc2VgYC5cbiAgICAgKi9cbiAgICBnZXREZWZhdWx0VmFsdWUodHlwZXMpIHtcbiAgICAgICAgY29uc3QgY29kZXJzID0gdHlwZXMubWFwKCh0eXBlKSA9PiB0aGlzLiNnZXRDb2RlcihQYXJhbVR5cGUuZnJvbSh0eXBlKSkpO1xuICAgICAgICBjb25zdCBjb2RlciA9IG5ldyBUdXBsZUNvZGVyKGNvZGVycywgXCJfXCIpO1xuICAgICAgICByZXR1cm4gY29kZXIuZGVmYXVsdFZhbHVlKCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqICBFbmNvZGUgdGhlICUldmFsdWVzJSUgYXMgdGhlICUldHlwZXMlJSBpbnRvIEFCSSBkYXRhLlxuICAgICAqXG4gICAgICogIEByZXR1cm5zIERhdGFIZXhzdHJpbmdcbiAgICAgKi9cbiAgICBlbmNvZGUodHlwZXMsIHZhbHVlcykge1xuICAgICAgICBhc3NlcnRBcmd1bWVudENvdW50KHZhbHVlcy5sZW5ndGgsIHR5cGVzLmxlbmd0aCwgXCJ0eXBlcy92YWx1ZXMgbGVuZ3RoIG1pc21hdGNoXCIpO1xuICAgICAgICBjb25zdCBjb2RlcnMgPSB0eXBlcy5tYXAoKHR5cGUpID0+IHRoaXMuI2dldENvZGVyKFBhcmFtVHlwZS5mcm9tKHR5cGUpKSk7XG4gICAgICAgIGNvbnN0IGNvZGVyID0gKG5ldyBUdXBsZUNvZGVyKGNvZGVycywgXCJfXCIpKTtcbiAgICAgICAgY29uc3Qgd3JpdGVyID0gbmV3IFdyaXRlcigpO1xuICAgICAgICBjb2Rlci5lbmNvZGUod3JpdGVyLCB2YWx1ZXMpO1xuICAgICAgICByZXR1cm4gd3JpdGVyLmRhdGE7XG4gICAgfVxuICAgIC8qKlxuICAgICAqICBEZWNvZGUgdGhlIEFCSSAlJWRhdGElJSBhcyB0aGUgJSV0eXBlcyUlIGludG8gdmFsdWVzLlxuICAgICAqXG4gICAgICogIElmICUlbG9vc2UlJSBkZWNvZGluZyBpcyBlbmFibGVkLCB0aGVuIHN0cmljdCBwYWRkaW5nIGlzXG4gICAgICogIG5vdCBlbmZvcmNlZC4gU29tZSBvbGRlciB2ZXJzaW9ucyBvZiBTb2xpZGl0eSBpbmNvcnJlY3RseVxuICAgICAqICBwYWRkZWQgZXZlbnQgZGF0YSBlbWl0dGVkIGZyb20gYGBleHRlcm5hbGBgIGZ1bmN0aW9ucy5cbiAgICAgKi9cbiAgICBkZWNvZGUodHlwZXMsIGRhdGEsIGxvb3NlKSB7XG4gICAgICAgIGNvbnN0IGNvZGVycyA9IHR5cGVzLm1hcCgodHlwZSkgPT4gdGhpcy4jZ2V0Q29kZXIoUGFyYW1UeXBlLmZyb20odHlwZSkpKTtcbiAgICAgICAgY29uc3QgY29kZXIgPSBuZXcgVHVwbGVDb2Rlcihjb2RlcnMsIFwiX1wiKTtcbiAgICAgICAgcmV0dXJuIGNvZGVyLmRlY29kZShuZXcgUmVhZGVyKGRhdGEsIGxvb3NlLCBkZWZhdWx0TWF4SW5mbGF0aW9uKSk7XG4gICAgfVxuICAgIHN0YXRpYyBfc2V0RGVmYXVsdE1heEluZmxhdGlvbih2YWx1ZSkge1xuICAgICAgICBhc3NlcnRBcmd1bWVudCh0eXBlb2YgKHZhbHVlKSA9PT0gXCJudW1iZXJcIiAmJiBOdW1iZXIuaXNJbnRlZ2VyKHZhbHVlKSwgXCJpbnZhbGlkIGRlZmF1bHRNYXhJbmZsYXRpb24gZmFjdG9yXCIsIFwidmFsdWVcIiwgdmFsdWUpO1xuICAgICAgICBkZWZhdWx0TWF4SW5mbGF0aW9uID0gdmFsdWU7XG4gICAgfVxuICAgIC8qKlxuICAgICAqICBSZXR1cm5zIHRoZSBzaGFyZWQgc2luZ2xldG9uIGluc3RhbmNlIG9mIGEgZGVmYXVsdCBbW0FiaUNvZGVyXV0uXG4gICAgICpcbiAgICAgKiAgT24gdGhlIGZpcnN0IGNhbGwsIHRoZSBpbnN0YW5jZSBpcyBjcmVhdGVkIGludGVybmFsbHkuXG4gICAgICovXG4gICAgc3RhdGljIGRlZmF1bHRBYmlDb2RlcigpIHtcbiAgICAgICAgaWYgKGRlZmF1bHRDb2RlciA9PSBudWxsKSB7XG4gICAgICAgICAgICBkZWZhdWx0Q29kZXIgPSBuZXcgQWJpQ29kZXIoKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZGVmYXVsdENvZGVyO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiAgUmV0dXJucyBhbiBldGhlcnMtY29tcGF0aWJsZSBbW0NhbGxFeGNlcHRpb25FcnJvcl1dIEVycm9yIGZvciB0aGUgZ2l2ZW5cbiAgICAgKiAgcmVzdWx0ICUlZGF0YSUlIGZvciB0aGUgW1tDYWxsRXhjZXB0aW9uQWN0aW9uXV0gJSVhY3Rpb24lJSBhZ2FpbnN0XG4gICAgICogIHRoZSBUcmFuc2FjdGlvbiAlJXR4JSUuXG4gICAgICovXG4gICAgc3RhdGljIGdldEJ1aWx0aW5DYWxsRXhjZXB0aW9uKGFjdGlvbiwgdHgsIGRhdGEpIHtcbiAgICAgICAgcmV0dXJuIGdldEJ1aWx0aW5DYWxsRXhjZXB0aW9uKGFjdGlvbiwgdHgsIGRhdGEsIEFiaUNvZGVyLmRlZmF1bHRBYmlDb2RlcigpKTtcbiAgICB9XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1hYmktY29kZXIuanMubWFwIiwiLyoqXG4gKiAgQWJvdXQgYnl0ZXMzMiBzdHJpbmdzLi4uXG4gKlxuICogIEBfZG9jbG9jOiBhcGkvdXRpbHM6Qnl0ZXMzMiBTdHJpbmdzXG4gKi9cbmltcG9ydCB7IGdldEJ5dGVzLCB0b1V0ZjhCeXRlcywgdG9VdGY4U3RyaW5nLCB6ZXJvUGFkQnl0ZXMgfSBmcm9tIFwiLi4vdXRpbHMvaW5kZXguanNcIjtcbi8qKlxuICogIEVuY29kZXMgJSV0ZXh0JSUgYXMgYSBCeXRlczMyIHN0cmluZy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGVuY29kZUJ5dGVzMzJTdHJpbmcodGV4dCkge1xuICAgIC8vIEdldCB0aGUgYnl0ZXNcbiAgICBjb25zdCBieXRlcyA9IHRvVXRmOEJ5dGVzKHRleHQpO1xuICAgIC8vIENoZWNrIHdlIGhhdmUgcm9vbSBmb3IgbnVsbC10ZXJtaW5hdGlvblxuICAgIGlmIChieXRlcy5sZW5ndGggPiAzMSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJieXRlczMyIHN0cmluZyBtdXN0IGJlIGxlc3MgdGhhbiAzMiBieXRlc1wiKTtcbiAgICB9XG4gICAgLy8gWmVyby1wYWQgKGltcGxpY2l0bHkgbnVsbC10ZXJtaW5hdGVzKVxuICAgIHJldHVybiB6ZXJvUGFkQnl0ZXMoYnl0ZXMsIDMyKTtcbn1cbi8qKlxuICogIEVuY29kZXMgdGhlIEJ5dGVzMzItZW5jb2RlZCAlJWJ5dGVzJSUgaW50byBhIHN0cmluZy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGRlY29kZUJ5dGVzMzJTdHJpbmcoX2J5dGVzKSB7XG4gICAgY29uc3QgZGF0YSA9IGdldEJ5dGVzKF9ieXRlcywgXCJieXRlc1wiKTtcbiAgICAvLyBNdXN0IGJlIDMyIGJ5dGVzIHdpdGggYSBudWxsLXRlcm1pbmF0aW9uXG4gICAgaWYgKGRhdGEubGVuZ3RoICE9PSAzMikge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJpbnZhbGlkIGJ5dGVzMzIgLSBub3QgMzIgYnl0ZXMgbG9uZ1wiKTtcbiAgICB9XG4gICAgaWYgKGRhdGFbMzFdICE9PSAwKSB7XG4gICAgICAgI
26774HRocm93IG5ldyBFcnJvcihcImludmFsaWQgYnl0ZXMzMiBzdHJpbmcgLSBubyBudWxsIHRlcm1pbmF0b3JcIik7XG4gICAgfVxuICAgIC8vIEZpbmQgdGhlIG51bGwgdGVybWluYXRpb25cbiAgICBsZXQgbGVuZ3RoID0gMzE7XG4gICAgd2hpbGUgKGRhdGFbbGVuZ3RoIC0gMV0gPT09IDApIHtcbiAgICAgICAgbGVuZ3RoLS07XG4gICAgfVxuICAgIC8vIERldGVybWluZSB0aGUgc3RyaW5nIHZhbHVlXG4gICAgcmV0dXJuIHRvVXRmOFN0cmluZyhkYXRhLnNsaWNlKDAsIGxlbmd0aCkpO1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9Ynl0ZXMzMi5qcy5tYXAiLCIvKipcbiAqICBUaGUgSW50ZXJmYWNlIGNsYXNzIGlzIGEgbG93LWxldmVsIGNsYXNzIHRoYXQgYWNjZXB0cyBhblxuICogIEFCSSBhbmQgcHJvdmlkZXMgYWxsIHRoZSBuZWNlc3NhcnkgZnVuY3Rpb25hbGl0eSB0byBlbmNvZGVcbiAqICBhbmQgZGVjb2RlIHBhcmFtYXRlcnMgdG8gYW5kIHJlc3VsdHMgZnJvbSBtZXRob2RzLCBldmVudHNcbiAqICBhbmQgZXJyb3JzLlxuICpcbiAqICBJdCBhbHNvIHByb3ZpZGVzIHNldmVyYWwgY29udmVuaWVuY2UgbWV0aG9kcyB0byBhdXRvbWF0aWNhbGx5XG4gKiAgc2VhcmNoIGFuZCBmaW5kIG1hdGNoaW5nIHRyYW5zYWN0aW9ucyBhbmQgZXZlbnRzIHRvIHBhcnNlIHRoZW0uXG4gKlxuICogIEBfc3Vic2VjdGlvbiBhcGkvYWJpOkludGVyZmFjZXMgIFtpbnRlcmZhY2VzXVxuICovXG5pbXBvcnQgeyBrZWNjYWsyNTYgfSBmcm9tIFwiLi4vY3J5cHRvL2luZGV4LmpzXCI7XG5pbXBvcnQgeyBpZCB9IGZyb20gXCIuLi9oYXNoL2luZGV4LmpzXCI7XG5pbXBvcnQgeyBjb25jYXQsIGRhdGFTbGljZSwgZ2V0QmlnSW50LCBnZXRCeXRlcywgZ2V0Qnl0ZXNDb3B5LCBoZXhsaWZ5LCB6ZXJvUGFkQnl0ZXMsIHplcm9QYWRWYWx1ZSwgaXNIZXhTdHJpbmcsIGRlZmluZVByb3BlcnRpZXMsIGFzc2VydEFyZ3VtZW50LCB0b0JlSGV4LCBhc3NlcnQgfSBmcm9tIFwiLi4vdXRpbHMvaW5kZXguanNcIjtcbmltcG9ydCB7IEFiaUNvZGVyIH0gZnJvbSBcIi4vYWJpLWNvZGVyLmpzXCI7XG5pbXBvcnQgeyBjaGVja1Jlc3VsdEVycm9ycywgUmVzdWx0IH0gZnJvbSBcIi4vY29kZXJzL2Fic3RyYWN0LWNvZGVyLmpzXCI7XG5pbXBvcnQgeyBDb25zdHJ1Y3RvckZyYWdtZW50LCBFcnJvckZyYWdtZW50LCBFdmVudEZyYWdtZW50LCBGcmFnbWVudCwgRnVuY3Rpb25GcmFnbWVudCwgUGFyYW1UeXBlIH0gZnJvbSBcIi4vZnJhZ21lbnRzLmpzXCI7XG5pbXBvcnQgeyBUeXBlZCB9IGZyb20gXCIuL3R5cGVkLmpzXCI7XG5leHBvcnQgeyBjaGVja1Jlc3VsdEVycm9ycywgUmVzdWx0IH07XG4vKipcbiAqICBXaGVuIHVzaW5nIHRoZSBbW0ludGVyZmFjZS1wYXJzZUxvZ11dIHRvIGF1dG9tYXRpY2FsbHkgbWF0Y2ggYSBMb2cgdG8gaXRzIGV2ZW50XG4gKiAgZm9yIHBhcnNpbmcsIGEgKipMb2dEZXNjcmlwdGlvbioqIGlzIHJldHVybmVkLlxuICovXG5leHBvcnQgY2xhc3MgTG9nRGVzY3JpcHRpb24ge1xuICAgIC8qKlxuICAgICAqICBUaGUgbWF0Y2hpbmcgZnJhZ21lbnQgZm9yIHRoZSBgYHRvcGljMGBgLlxuICAgICAqL1xuICAgIGZyYWdtZW50O1xuICAgIC8qKlxuICAgICAqICBUaGUgbmFtZSBvZiB0aGUgRXZlbnQuXG4gICAgICovXG4gICAgbmFtZTtcbiAgICAvKipcbiAgICAgKiAgVGhlIGZ1bGwgRXZlbnQgc2lnbmF0dXJlLlxuICAgICAqL1xuICAgIHNpZ25hdHVyZTtcbiAgICAvKipcbiAgICAgKiAgVGhlIHRvcGljIGhhc2ggZm9yIHRoZSBFdmVudC5cbiAgICAgKi9cbiAgICB0b3BpYztcbiAgICAvKipcbiAgICAgKiAgVGhlIGFyZ3VtZW50cyBwYXNzZWQgaW50byB0aGUgRXZlbnQgd2l0aCBgYGVtaXRgYC5cbiAgICAgKi9cbiAgICBhcmdzO1xuICAgIC8qKlxuICAgICAqICBAX2lnbm9yZTpcbiAgICAgKi9cbiAgICBjb25zdHJ1Y3RvcihmcmFnbWVudCwgdG9waWMsIGFyZ3MpIHtcbiAgICAgICAgY29uc3QgbmFtZSA9IGZyYWdtZW50Lm5hbWUsIHNpZ25hdHVyZSA9IGZyYWdtZW50LmZvcm1hdCgpO1xuICAgICAgICBkZWZpbmVQcm9wZXJ0aWVzKHRoaXMsIHtcbiAgICAgICAgICAgIGZyYWdtZW50LCBuYW1lLCBzaWduYXR1cmUsIHRvcGljLCBhcmdzXG4gICAgICAgIH0pO1xuICAgIH1cbn1cbi8qKlxuICogIFdoZW4gdXNpbmcgdGhlIFtbSW50ZXJmYWNlLXBhcnNlVHJhbnNhY3Rpb25dXSB0byBhdXRvbWF0aWNhbGx5IG1hdGNoXG4gKiAgYSB0cmFuc2FjdGlvbiBkYXRhIHRvIGl0cyBmdW5jdGlvbiBmb3IgcGFyc2luZyxcbiAqICBhICoqVHJhbnNhY3Rpb25EZXNjcmlwdGlvbioqIGlzIHJldHVybmVkLlxuICovXG5leHBvcnQgY2xhc3MgVHJhbnNhY3Rpb25EZXNjcmlwdGlvbiB7XG4gICAgLyoqXG4gICAgICogIFRoZSBtYXRjaGluZyBmcmFnbWVudCBmcm9tIHRoZSB0cmFuc2FjdGlvbiBgYGRhdGFgYC5cbiAgICAgKi9cbiAgICBmcmFnbWVudDtcbiAgICAvKipcbiAgICAgKiAgVGhlIG5hbWUgb2YgdGhlIEZ1bmN0aW9uIGZyb20gdGhlIHRyYW5zYWN0aW9uIGBgZGF0YWBgLlxuICAgICAqL1xuICAgIG5hbWU7XG4gICAgLyoqXG4gICAgICogIFRoZSBhcmd1bWVudHMgcGFzc2VkIHRvIHRoZSBGdW5jdGlvbiBmcm9tIHRoZSB0cmFuc2FjdGlvbiBgYGRhdGFgYC5cbiAgICAgKi9cbiAgICBhcmdzO1xuICAgIC8qKlxuICAgICAqICBUaGUgZnVsbCBGdW5jdGlvbiBzaWduYXR1cmUgZnJvbSB0aGUgdHJhbnNhY3Rpb24gYGBkYXRhYGAuXG4gICAgICovXG4gICAgc2lnbmF0dXJlO1xuICAgIC8qKlxuICAgICAqICBUaGUgc2VsZWN0b3IgZm9yIHRoZSBGdW5jdGlvbiBmcm9tIHRoZSB0cmFuc2FjdGlvbiBgYGRhdGFgYC5cbiAgICAgKi9cbiAgICBzZWxlY3RvcjtcbiAgICAvKipcbiAgICAgKiAgVGhlIGBgdmFsdWVgYCAoaW4gd2VpKSBmcm9tIHRoZSB0cmFuc2FjdGlvbi5cbiAgICAgKi9cbiAgICB2YWx1ZTtcbiAgICAvKipcbiAgICAgKiAgQF9pZ25vcmU6XG4gICAgICovXG4gICAgY29uc3RydWN0b3IoZnJhZ21lbnQsIHNlbGVjdG9yLCBhcmdzLCB2YWx1ZSkge1xuICAgICAgICBjb25zdCBuYW1lID0gZnJhZ21lbnQubmFtZSwgc2lnbmF0dXJlID0gZnJhZ21lbnQuZm9ybWF0KCk7XG4gICAgICAgIGRlZmluZVByb3BlcnRpZXModGhpcywge1xuICAgICAgICAgICAgZnJhZ21lbnQsIG5hbW
26774UsIGFyZ3MsIHNpZ25hdHVyZSwgc2VsZWN0b3IsIHZhbHVlXG4gICAgICAgIH0pO1xuICAgIH1cbn1cbi8qKlxuICogIFdoZW4gdXNpbmcgdGhlIFtbSW50ZXJmYWNlLXBhcnNlRXJyb3JdXSB0byBhdXRvbWF0aWNhbGx5IG1hdGNoIGFuXG4gKiAgZXJyb3IgZm9yIGEgY2FsbCByZXN1bHQgZm9yIHBhcnNpbmcsIGFuICoqRXJyb3JEZXNjcmlwdGlvbioqIGlzIHJldHVybmVkLlxuICovXG5leHBvcnQgY2xhc3MgRXJyb3JEZXNjcmlwdGlvbiB7XG4gICAgLyoqXG4gICAgICogIFRoZSBtYXRjaGluZyBmcmFnbWVudC5cbiAgICAgKi9cbiAgICBmcmFnbWVudDtcbiAgICAvKipcbiAgICAgKiAgVGhlIG5hbWUgb2YgdGhlIEVycm9yLlxuICAgICAqL1xuICAgIG5hbWU7XG4gICAgLyoqXG4gICAgICogIFRoZSBhcmd1bWVudHMgcGFzc2VkIHRvIHRoZSBFcnJvciB3aXRoIGBgcmV2ZXJ0YGAuXG4gICAgICovXG4gICAgYXJncztcbiAgICAvKipcbiAgICAgKiAgVGhlIGZ1bGwgRXJyb3Igc2lnbmF0dXJlLlxuICAgICAqL1xuICAgIHNpZ25hdHVyZTtcbiAgICAvKipcbiAgICAgKiAgVGhlIHNlbGVjdG9yIGZvciB0aGUgRXJyb3IuXG4gICAgICovXG4gICAgc2VsZWN0b3I7XG4gICAgLyoqXG4gICAgICogIEBfaWdub3JlOlxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yKGZyYWdtZW50LCBzZWxlY3RvciwgYXJncykge1xuICAgICAgICBjb25zdCBuYW1lID0gZnJhZ21lbnQubmFtZSwgc2lnbmF0dXJlID0gZnJhZ21lbnQuZm9ybWF0KCk7XG4gICAgICAgIGRlZmluZVByb3BlcnRpZXModGhpcywge1xuICAgICAgICAgICAgZnJhZ21lbnQsIG5hbWUsIGFyZ3MsIHNpZ25hdHVyZSwgc2VsZWN0b3JcbiAgICAgICAgfSk7XG4gICAgfVxufVxuLyoqXG4gKiAgQW4gKipJbmRleGVkKiogaXMgdXNlZCBhcyBhIHZhbHVlIHdoZW4gYSB2YWx1ZSB0aGF0IGRvZXMgbm90XG4gKiAgZml0IHdpdGhpbiBhIHRvcGljIChpLmUuIG5vdCBhIGZpeGVkLWxlbmd0aCwgMzItYnl0ZSB0eXBlKS4gSXRcbiAqICBpcyB0aGUgYGBrZWNjYWsyNTZgYCBvZiB0aGUgdmFsdWUsIGFuZCB1c2VkIGZvciB0eXBlcyBzdWNoIGFzXG4gKiAgYXJyYXlzLCB0dXBsZXMsIGJ5dGVzIGFuZCBzdHJpbmdzLlxuICovXG5leHBvcnQgY2xhc3MgSW5kZXhlZCB7XG4gICAgLyoqXG4gICAgICogIFRoZSBgYGtlY2NhazI1NmBgIG9mIHRoZSB2YWx1ZSBsb2dnZWQuXG4gICAgICovXG4gICAgaGFzaDtcbiAgICAvKipcbiAgICAgKiAgQF9pZ25vcmU6XG4gICAgICovXG4gICAgX2lzSW5kZXhlZDtcbiAgICAvKipcbiAgICAgKiAgUmV0dXJucyBgYHRydWVgYCBpZiAlJXZhbHVlJSUgaXMgYW4gKipJbmRleGVkKiouXG4gICAgICpcbiAgICAgKiAgVGhpcyBwcm92aWRlcyBhIFR5cGUgR3VhcmQgZm9yIHByb3BlcnR5IGFjY2Vzcy5cbiAgICAgKi9cbiAgICBzdGF0aWMgaXNJbmRleGVkKHZhbHVlKSB7XG4gICAgICAgIHJldHVybiAhISh2YWx1ZSAmJiB2YWx1ZS5faXNJbmRleGVkKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogIEBfaWdub3JlOlxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yKGhhc2gpIHtcbiAgICAgICAgZGVmaW5lUHJvcGVydGllcyh0aGlzLCB7IGhhc2gsIF9pc0luZGV4ZWQ6IHRydWUgfSk7XG4gICAgfVxufVxuLy8gaHR0cHM6Ly9kb2NzLnNvbGlkaXR5bGFuZy5vcmcvZW4vdjAuOC4xMy9jb250cm9sLXN0cnVjdHVyZXMuaHRtbD9oaWdobGlnaHQ9cGFuaWMjcGFuaWMtdmlhLWFzc2VydC1hbmQtZXJyb3ItdmlhLXJlcXVpcmVcbmNvbnN0IFBhbmljUmVhc29ucyA9IHtcbiAgICBcIjBcIjogXCJnZW5lcmljIHBhbmljXCIsXG4gICAgXCIxXCI6IFwiYXNzZXJ0KGZhbHNlKVwiLFxuICAgIFwiMTdcIjogXCJhcml0aG1ldGljIG92ZXJmbG93XCIsXG4gICAgXCIxOFwiOiBcImRpdmlzaW9uIG9yIG1vZHVsbyBieSB6ZXJvXCIsXG4gICAgXCIzM1wiOiBcImVudW0gb3ZlcmZsb3dcIixcbiAgICBcIjM0XCI6IFwiaW52YWxpZCBlbmNvZGVkIHN0b3JhZ2UgYnl0ZSBhcnJheSBhY2Nlc3NlZFwiLFxuICAgIFwiNDlcIjogXCJvdXQtb2YtYm91bmRzIGFycmF5IGFjY2VzczsgcG9wcGluZyBvbiBhbiBlbXB0eSBhcnJheVwiLFxuICAgIFwiNTBcIjogXCJvdX
26774Qtb2YtYm91bmRzIGFjY2VzcyBvZiBhbiBhcnJheSBvciBieXRlc05cIixcbiAgICBcIjY1XCI6IFwib3V0IG9mIG1lbW9yeVwiLFxuICAgIFwiODFcIjogXCJ1bmluaXRpYWxpemVkIGZ1bmN0aW9uXCIsXG59O1xuY29uc3QgQnVpbHRpbkVycm9ycyA9IHtcbiAgICBcIjB4MDhjMzc5YTBcIjoge1xuICAgICAgICBzaWduYXR1cmU6IFwiRXJyb3Ioc3RyaW5nKVwiLFxuICAgICAgICBuYW1lOiBcIkVycm9yXCIsXG4gICAgICAgIGlucHV0czogW1wic3RyaW5nXCJdLFxuICAgICAgICByZWFzb246IChtZXNzYWdlKSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gYHJldmVydGVkIHdpdGggcmVhc29uIHN0cmluZyAke0pTT04uc3RyaW5naWZ5KG1lc3NhZ2UpfWA7XG4gICAgICAgIH1cbiAgICB9LFxuICAgIFwiMHg0ZTQ4N2I3MVwiOiB7XG4gICAgICAgIHNpZ25hdHVyZTogXCJQYW5pYyh1aW50MjU2KVwiLFxuICAgICAgICBuYW1lOiBcIlBhbmljXCIsXG4gICAgICAgIGlucHV0czogW1widWludDI1NlwiXSxcbiAgICAgICAgcmVhc29uOiAoY29kZSkgPT4ge1xuICAgICAgICAgICAgbGV0IHJlYXNvbiA9IFwidW5rbm93biBwYW5pYyBjb2RlXCI7XG4gICAgICAgICAgICBpZiAoY29kZSA+PSAwICYmIGNvZGUgPD0gMHhmZiAmJiBQYW5pY1JlYXNvbnNbY29kZS50b1N0cmluZygpXSkge1xuICAgICAgICAgICAgICAgIHJlYXNvbiA9IFBhbmljUmVhc29uc1tjb2RlLnRvU3RyaW5nKCldO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGByZXZlcnRlZCB3aXRoIHBhbmljIGNvZGUgMHgke2NvZGUudG9TdHJpbmcoMTYpfSAoJHtyZWFzb259KWA7XG4gICAgICAgIH1cbiAgICB9XG59O1xuLyoqXG4gKiAgQW4gSW50ZXJmYWNlIGFic3RyYWN0cyBtYW55IG9mIHRoZSBsb3ctbGV2ZWwgZGV0YWlscyBmb3JcbiAqICBlbmNvZGluZyBhbmQgZGVjb2RpbmcgdGhlIGRhdGEgb24gdGhlIGJsb2NrY2hhaW4uXG4gKlxuICogIEFuIEFCSSBwcm92aWRlcyBpbmZvcm1hdGlvbiBvbiBob3cgdG8gZW5jb2RlIGRhdGEgdG8gc2VuZCB0b1xuICogIGEgQ29udHJhY3QsIGhvdyB0byBkZWNvZGUgdGhlIHJlc3VsdHMgYW5kIGV2ZW50cyBhbmQgaG93IHRvXG4gKiAgaW50ZXJwcmV0IHJldmVydCBlcnJvcnMuXG4gKlxuICogIFRoZSBBQkkgY2FuIGJlIHNwZWNpZmllZCBieSBbYW55IHN1cHBvcnRlZCBmb3JtYXRdKEludGVyZmFjZUFiaSkuXG4gKi9cbmV4cG9ydCBjbGFzcyBJbnRlcmZhY2Uge1xuICAgIC8qKlxuICAgICAqICBBbGwgdGhlIENvbnRyYWN0IEFCSSBtZW1iZXJzIChpLmUuIG1ldGhvZHMsIGV2ZW50cywgZXJyb3JzLCBldGMpLlxuICAgICAqL1xuICAgIGZyYWdtZW50cztcbiAgICAvKipcbiAgICAgKiAgVGhlIENvbnRyYWN0IGNvbnN0cnVjdG9yLlxuICAgICAqL1xuICAgIGRlcGxveTtcbiAgICAvKipcbiAgICAgKiAgVGhlIEZhbGxiYWNrIG1ldGhvZCwgaWYgYW55LlxuICAgICAqL1xuICAgIGZhbGxiYWNrO1xuICAgIC8qKlxuICAgICAqICBJZiByZWNlaXZpbmcgZXRoZXIgaXMgc3VwcG9ydGVkLlxuICAgICAqL1xuICAgIHJlY2VpdmU7XG4gICAgI2Vycm9ycztcbiAgICAjZXZlbnRzO1xuICAgICNmdW5jdGlvbnM7XG4gICAgLy8gICAgI3N0cnVjdHM6IE1hcDxzdHJpbmcsIFN0cnVjdEZyYWdtZW50PjtcbiAgICAjYWJpQ29kZXI7XG4gICAgLyoqXG4gICAgICogIENyZWF0ZSBhIG5ldyBJbnRlcmZhY2UgZm9yIHRoZSAlJWZyYWdtZW50cyUlLlxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yKGZyYWdtZW50cykge1xuICAgICAgICBsZXQgYWJpID0gW107XG4gICAgICAgIGlmICh0eXBlb2YgKGZyYWdtZW50cykgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgICAgIGFiaSA9IEpTT04ucGFyc2UoZnJhZ21lbnRzKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGFiaSA9IGZyYWdtZW50cztcbiAgICAgICAgfVxuICAgICAgICB0aGlzLiNmdW5jdGlvbnMgPSBuZXcgTWFwKCk7XG4gICAgICAgIHRoaXMuI2Vycm9ycyA9IG5ldyBNYXAoKTtcbiAgICAgICAgdGhpcy4jZXZlbnRzID0gbmV3IE1hcCgpO1xuICAgICAgICAvLyAgICAgICAgdGhpcy4jc3RydWN0cyA9IG5ldyBNYXAoKTtcbiAgICAgICAgY29uc3QgZnJhZ3MgPSBbXTtcbiAgICAgICAgZm9yIChjb25zdCBhIG9mIGFiaSkge1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBmcmFncy5wdXNoKEZyYWdtZW50LmZyb20oYSkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coYFtXYXJuaW5nXSBJbnZhbGlkIEZyYWdtZW50ICR7SlNPTi5zdHJpbmdpZnkoYSl9OmAsIGVycm9yLm1lc3NhZ2UpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGRlZmluZVByb3BlcnRpZXModGhpcywge1xuICAgICAgICAgICAgZnJhZ21lbnRzOiBPYmplY3QuZnJlZXplKGZyYWdzKVxuICAgICAgICB9KTtcbiAgICAgICAgbGV0IGZhbGxiYWNrID0gbnVsbDtcbiAgICAgICAgbGV0IHJlY2VpdmUgPSBmYWxzZTtcbiAgICAgICAgdGhpcy4jYWJpQ29kZXIgPSB0aGlzLmdldEFiaUNvZGVyKCk7XG4gICAgICAgIC8vIEFkZCBhbGwgZnJhZ21lbnRzIGJ5IHRoZWlyIHNpZ25hdHVyZVxuICAgICAgICB0aGlzLmZyYWdtZW50cy5mb3JFYWNoKChmcmFnbWVudCwgaW5kZXgpID0+IHtcbiAgICAgICAgICAgIGxldCBidWNrZXQ7XG4gICAgICAgICAgICBzd2l0Y2ggKGZyYWdtZW50LnR5cGUpIHtcbiAgICAgICAgICAgICAgICBjYXNlIFwiY29uc3RydWN0b3JcIjpcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuZGVwbG95KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhcImR1cGxpY2F0ZSBkZWZpbml0aW9uIC0gY29uc3RydWN0b3JcIik7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgLy9jaGVja05hbWVzKGZyYWdtZW50LCBcImlucHV0XCIsIGZyYWdtZW50LmlucHV0cyk7XG4gICAgICAgICAgICAgICAgICAgIGRlZmluZVByb3BlcnRpZXModGhpcywgeyBkZXBsb3k6IGZyYWdtZW50IH0pO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgY2FzZSBcImZhbGxiYWNrXCI6XG4gICAgICAgICAgICAgICAgICAgIGlmIChmcmFnbWVudC5pbnB1dHMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZWNlaXZlID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGFzc2VydEFyZ3VtZW50KCFmYWxsYmFjayB8fCBmcmFnbWVudC5wYXlhYmxlICE9PSBmYWxsYmFjay5wYXlhYmxlLCBcImNvbmZsaWN0aW5nIGZhbGxiYWNrIGZyYWdtZW50c1wiLCBgZnJhZ21lbn
26774RzWyR7aW5kZXh9XWAsIGZyYWdtZW50KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGZhbGxiYWNrID0gZnJhZ21lbnQ7XG4gICAgICAgICAgICAgICAgICAgICAgICByZWNlaXZlID0gZmFsbGJhY2sucGF5YWJsZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgY2FzZSBcImZ1bmN0aW9uXCI6XG4gICAgICAgICAgICAgICAgICAgIC8vY2hlY2tOYW1lcyhmcmFnbWVudCwgXCJpbnB1dFwiLCBmcmFnbWVudC5pbnB1dHMpO1xuICAgICAgICAgICAgICAgICAgICAvL2NoZWNrTmFtZXMoZnJhZ21lbnQsIFwib3V0cHV0XCIsICg8RnVuY3Rpb25GcmFnbWVudD5mcmFnbWVudCkub3V0cHV0cyk7XG4gICAgICAgICAgICAgICAgICAgIGJ1Y2tldCA9IHRoaXMuI2Z1bmN0aW9ucztcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSBcImV2ZW50XCI6XG4gICAgICAgICAgICAgICAgICAgIC8vY2hlY2tOYW1lcyhmcmFnbWVudCwgXCJpbnB1dFwiLCBmcmFnbWVudC5pbnB1dHMpO1xuICAgICAgICAgICAgICAgICAgICBidWNrZXQgPSB0aGlzLiNldmVudHM7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgXCJlcnJvclwiOlxuICAgICAgICAgICAgICAgICAgICBidWNrZXQgPSB0aGlzLiNlcnJvcnM7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIFR3byBpZGVudGljYWwgZW50cmllczsgaWdub3JlIGl0XG4gICAgICAgICAgICBjb25zdCBzaWduYXR1cmUgPSBmcmFnbWVudC5mb3JtYXQoKTtcbiAgICAgICAgICAgIGlmIChidWNrZXQuaGFzKHNpZ25hdHVyZSkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBidWNrZXQuc2V0KHNpZ25hdHVyZSwgZnJhZ21lbnQpO1xuICAgICAgICB9KTtcbiAgICAgICAgLy8gSWYgd2UgZG8gbm90IGhhdmUgYSBjb25zdHJ1Y3RvciBhZGQgYSBkZWZhdWx0XG4gICAgICAgIGlmICghdGhpcy5kZXBsb3kpIHtcbiAgICAgICAgICAgIGRlZmluZVByb3BlcnRpZXModGhpcywge1xuICAgICAgICAgICAgICAgIGRlcGxveTogQ29uc3RydWN0b3JGcmFnbWVudC5mcm9tKFwiY29uc3RydWN0b3IoKVwiKVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgZGVmaW5lUHJvcGVydGllcyh0aGlzLCB7IGZhbGxiYWNrLCByZWNlaXZlIH0pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiAgUmV0dXJucyB0aGUgZW50aXJlIEh1bWFuLVJlYWRhYmxlIEFCSSwgYXMgYW4gYXJyYXkgb2ZcbiAgICAgKiAgc2lnbmF0dXJlcywgb3B0aW9uYWxseSBhcyAlJW1pbmltYWwlJSBzdHJpbmdzLCB3aGljaFxuICAgICAqICByZW1vdmVzIHBhcmFtZXRlciBuYW1lcyBhbmQgdW5uZWNlZXNhcnkgc3BhY2VzLlxuICAgICAqL1xuICAgIGZvcm1hdChtaW5pbWFsKSB7XG4gICAgICAgIGNvbnN0IGZvcm1hdCA9IChtaW5pbWFsID8gXCJtaW5pbWFsXCIgOiBcImZ1bGxcIik7XG4gICAgICAgIGNvbnN0IGFiaSA9IHRoaXMuZnJhZ21lbnRzLm1hcCgoZikgPT4gZi5mb3JtYXQoZm9ybWF0KSk7XG4gICAgICAgIHJldHVybiBhYmk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqICBSZXR1cm4gdGhlIEpTT04tZW5jb2RlZCBBQkkuIFRoaXMgaXMgdGhlIGZvcm1hdCBTb2xpZGl5XG4gICAgICogIHJldHVybnMuXG4gICAgICovXG4gICAgZm9ybWF0SnNvbigpIHtcbiAgICAgICAgY29uc3QgYWJpID0gdGhpcy5mcmFnbWVudHMubWFwKChmKSA9PiBmLmZvcm1hdChcImpzb25cIikpO1xuICAgICAgICAvLyBXZSBuZWVkIHRvIHJlLWJ1bmRsZSB0aGUgSlNPTiBmcmFnbWVudHMgYSBiaXRcbiAgICAgICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KGFiaS5tYXAoKGopID0+IEpTT04ucGFyc2UoaikpKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogIFRoZSBBQkkgY29kZXIgdGhhdCB3aWxsIGJlIHVzZWQgdG8gZW5jb2RlIGFuZCBkZWNvZGUgYmluYXJ5XG4gICAgICogIGRhdGEuXG4gICAgICovXG4gICAgZ2V0QWJpQ29kZXIoKSB7XG4gICAgICAgIHJldHVybiBBYmlDb2Rlci5kZWZhdWx0QWJpQ29kZXIoKTtcbiAgICB9XG4gICAgLy8gRmluZCBhIGZ1bmN0aW9uIGRlZmluaXRpb24gYnkgYW55IG1lYW5zIG5lY2Vzc2FyeSAodW5sZXNzIGl0IGlzIGFtYmlndW91cylcbiAgICAjZ2V0RnVuY3Rpb24oa2V5LCB2YWx1ZXMsIGZvcmNlVW5pcXVlKSB7XG4gICAgICAgIC8vIFNlbGVjdG9yXG4gICAgICAgIGlmIChpc0hleFN0cmluZyhrZXkpKSB7XG4gICAgICAgICAgICBjb25zdCBzZWxlY3RvciA9IGtleS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICAgICAgZm9yIChjb25zdCBmcmFnbWVudCBvZiB0aGlzLiNmdW5jdGlvbnMudmFsdWVzKCkpIHtcbiAgICAgICAgICAgICAgICBpZiAoc2VsZWN0b3IgPT09IGZyYWdtZW50LnNlbGVjdG9yKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBmcmFnbWVudDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICAvLyBJdCBpcyBhIGJhcmUgbmFtZSwgbG9vayB1cCB0aGUgZnVuY3Rpb24gKHdpbGwgcmV0dXJuIG51bGwgaWYgYW1iaWd1b3VzKVxuICAgICAgICBpZiAoa2V5LmluZGV4T2YoXCIoXCIpID09PSAtMSkge1xuICAgICAgICAgICAgY29uc3QgbWF0Y2hpbmcgPSBbXTtcbiAgICAgICAgICAgIGZvciAoY29uc3QgW25hbWUsIGZyYWdtZW50XSBvZiB0aGlzLiNmdW5jdGlvbnMpIHtcbiAgICAgICAgICAgICAgICBpZiAobmFtZS5zcGxpdChcIihcIiAvKiBmaXg6KSAqLylbMF0gPT09IGtleSkge1xuICAgICAgICAgICAgICAgICAgICBtYXRjaGluZy5wdXNoKGZyYWdtZW50KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAodmFsdWVzKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgbGFzdFZhbHVlID0gKHZhbHVlcy5sZW5ndGggPiAwKSA/IHZhbHVlc1t2YWx1ZXMubGVuZ3RoIC0gMV0gOiBudWxsO1xuICAgICAgICAgICAgICAgIGxldCB2YWx1ZUxlbmd0aCA9IHZhbHVlcy5sZW5ndGg7XG4gICAgICAgICAgICAgICAgbGV0IGFsbG93T3B0aW9ucyA9IHRydWU7XG4gICAgICAgICAgICAgICAgaWYgKFR5cGVkLmlzVHlwZWQobGFzdFZhbHVlKSAmJiBsYXN0VmFsdWUud
26774HlwZSA9PT0gXCJvdmVycmlkZXNcIikge1xuICAgICAgICAgICAgICAgICAgICBhbGxvd09wdGlvbnMgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgdmFsdWVMZW5ndGgtLTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgLy8gUmVtb3ZlIGFsbCBtYXRjaGVzIHRoYXQgZG9uJ3QgaGF2ZSBhIGNvbXBhdGlibGUgbGVuZ3RoLiBUaGUgYXJnc1xuICAgICAgICAgICAgICAgIC8vIG1heSBjb250YWluIGFuIG92ZXJyaWRlcywgc28gdGhlIG1hdGNoIG1heSBoYXZlIG4gb3IgbiAtIDEgcGFyYW1ldGVyc1xuICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSBtYXRjaGluZy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnB1dHMgPSBtYXRjaGluZ1tpXS5pbnB1dHMubGVuZ3RoO1xuICAgICAgICAgICAgICAgICAgICBpZiAoaW5wdXRzICE9PSB2YWx1ZUxlbmd0aCAmJiAoIWFsbG93T3B0aW9ucyB8fCBpbnB1dHMgIT09IHZhbHVlTGVuZ3RoIC0gMSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG1hdGNoaW5nLnNwbGljZShpLCAxKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAvLyBSZW1vdmUgYWxsIG1hdGNoZXMgdGhhdCBkb24ndCBtYXRjaCB0aGUgVHlwZWQgc2lnbmF0dXJlXG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IG1hdGNoaW5nLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGlucHV0cyA9IG1hdGNoaW5nW2ldLmlucHV0cztcbiAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCB2YWx1ZXMubGVuZ3RoOyBqKyspIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIE5vdCBhIHR5cGVkIHZhbHVlXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIVR5cGVkLmlzVHlwZWQodmFsdWVzW2pdKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gV2UgYXJlIHBhc3QgdGhlIGlucHV0c1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGogPj0gaW5wdXRzLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh2YWx1ZXNbal0udHlwZSA9PT0gXCJvdmVycmlkZXNcIikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF0Y2hpbmcuc3BsaWNlKGksIDEpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gTWFrZSBzdXJlIHRoZSB2YWx1ZSB0eXBlIG1hdGNoZXMgdGhlIGlucHV0IHR5cGVcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh2YWx1ZXNbal0udHlwZSAhPT0gaW5wdXRzW2pdLmJhc2VUeXBlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF0Y2hpbmcuc3BsaWNlKGksIDEpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gV2UgZm91bmQgYSBzaW5nbGUgbWF0Y2hpbmcgc2lnbmF0dXJlIHdpdGggYW4gb3ZlcnJpZGVzLCBidXQgdGhlXG4gICAgICAgICAgICAvLyBsYXN0IHZhbHVlIGlzIHNvbWV0aGluZyB0aGF0IGNhbm5vdCBwb3NzaWJseSBiZSBhbiBvcHRpb25zXG4gICAgICAgICAgICBpZiAobWF0Y2hpbmcubGVuZ3RoID09PSAxICYmIHZhbHVlcyAmJiB2YWx1ZXMubGVuZ3RoICE9PSBtYXRjaGluZ1swXS5pbnB1dHMubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgbGFzdEFyZyA9IHZhbHVlc1t2YWx1ZXMubGVuZ3RoIC0gMV07XG4gICAgICAgICAgICAgICAgaWYgKGxhc3RBcmcgPT0gbnVsbCB8fCBBcnJheS5pc0FycmF5KGxhc3RBcmcpIHx8IHR5cGVvZiAobGFzdEFyZykgIT09IFwib2JqZWN0XCIpIHtcbiAgICAgICAgICAgICAgICAgICAgbWF0Y2hpbmcuc3BsaWNlKDAsIDEpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChtYXRjaGluZy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChtYXRjaGluZy5sZW5ndGggPiAxICYmIGZvcmNlVW5pcXVlKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgbWF0Y2hTdHIgPSBtYXRjaGluZy5tYXAoKG0pID0+IEpTT04uc3RyaW5naWZ5KG0uZm9ybWF0KCkpKS5qb2luKFwiLCBcIik7XG4gICAgICAgICAgICAgICAgYXNzZXJ0QXJndW1lbnQoZmFsc2UsIGBhbWJpZ3VvdXMgZnVuY3Rpb24gZGVzY3JpcHRpb24gKGkuZS4gbWF0Y2hlcyAke21hdGNoU3RyfSlgLCBcImtleVwiLCBrZXkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIG1hdGNoaW5nWzBdO1xuICAgICAgICB9XG4gICAgICAgIC8vIE5vcm1hbGl6ZSB0aGUgc2lnbmF0dXJlIGFuZCBsb29rdXAgdGhlIGZ1bmN0aW9uXG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IHRoaXMuI2Z1bmN0aW9ucy5nZXQoRnVuY3Rpb25GcmFnbWVudC5mcm9tKGtleSkuZm9ybWF0KCkpO1xuICAgICAgICBpZiAocmVzdWx0KSB7XG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiAgR2V0IHRoZSBmdW5jdGlvbiBuYW1lIGZvciAlJWtleSUlLCB3aGljaCBtYXkgYmUgYSBmdW5jdGlvbiBzZWxlY3RvcixcbiAgICAgKiAgZnVuY3Rpb24gbmFtZSBvciBmdW5jdGlvbiBzaWduYXR1cmUgdGhhdCBiZWxvbmdzIHRvIHRoZSBBQkkuXG4gICAgICovXG4gICAgZ2V0RnVuY3Rpb25OYW1lKGtleSkge1xuICAgICAgICBjb25zdCBmcmFnbWVudCA9IHRoaXMuI2dldEZ1bmN0aW9uKGtleSwgbnVsbCwgZmFsc2UpO1xuICAgICAgICBhc3NlcnRBcmd1bWVudChmcmFnbWVudCwgXCJubyBtYXRjaGluZyBmdW5jdGlvblwiLCBcImtleVwiLCBrZXkpO1xuICAgICAgICByZXR1cm4gZnJhZ21lbnQubmFtZTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogIFJldHVybnMgdHJ1ZSBpZiAlJWtleSUlIChhIGZ1bmN0aW9uIHNlbGVjdG9yLCBmdW5jdGlvbiBuYW1lIG9yXG4gICAgICogIGZ1bmN0aW9uIHNpZ25hdHVyZSkgaXMgcHJlc2VudCBpbiB0aGUgQUJJLlxuICAgICAqXG4gICAgICogIEluIHRoZSBjYXNlIG9mIGEgZnVuY3Rpb24gbmFtZSwgdGhlIG5hbWUgbWF5IGJlIGFtYmlndW91cywgc29cbiAgICAgKiAgYWNjZXNzaW5nIHRoZSBbW0Z1bmN0aW9uRnJhZ21lbn
26774RdXSBtYXkgcmVxdWlyZSByZWZpbmVtZW50LlxuICAgICAqL1xuICAgIGhhc0Z1bmN0aW9uKGtleSkge1xuICAgICAgICByZXR1cm4gISF0aGlzLiNnZXRGdW5jdGlvbihrZXksIG51bGwsIGZhbHNlKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogIEdldCB0aGUgW1tGdW5jdGlvbkZyYWdtZW50XV0gZm9yICUla2V5JSUsIHdoaWNoIG1heSBiZSBhIGZ1bmN0aW9uXG4gICAgICogIHNlbGVjdG9yLCBmdW5jdGlvbiBuYW1lIG9yIGZ1bmN0aW9uIHNpZ25hdHVyZSB0aGF0IGJlbG9uZ3MgdG8gdGhlIEFCSS5cbiAgICAgKlxuICAgICAqICBJZiAlJXZhbHVlcyUlIGlzIHByb3ZpZGVkLCBpdCB3aWxsIHVzZSB0aGUgVHlwZWQgQVBJIHRvIGhhbmRsZVxuICAgICAqICBhbWJpZ3VvdXMgY2FzZXMgd2hlcmUgbXVsdGlwbGUgZnVuY3Rpb25zIG1hdGNoIGJ5IG5hbWUuXG4gICAgICpcbiAgICAgKiAgSWYgdGhlICUla2V5JSUgYW5kICUldmFsdWVzJSUgZG8gbm90IHJlZmluZSB0byBhIHNpbmdsZSBmdW5jdGlvbiBpblxuICAgICAqICB0aGUgQUJJLCB0aGlzIHdpbGwgdGhyb3cuXG4gICAgICovXG4gICAgZ2V0RnVuY3Rpb24oa2V5LCB2YWx1ZXMpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuI2dldEZ1bmN0aW9uKGtleSwgdmFsdWVzIHx8IG51bGwsIHRydWUpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiAgSXRlcmF0ZSBvdmVyIGFsbCBmdW5jdGlvbnMsIGNhbGxpbmcgJSVjYWxsYmFjayUlLCBzb3J0ZWQgYnkgdGhlaXIgbmFtZS5cbiAgICAgKi9cbiAgICBmb3JFYWNoRnVuY3Rpb24oY2FsbGJhY2spIHtcbiAgICAgICAgY29uc3QgbmFtZXMgPSBBcnJheS5mcm9tKHRoaXMuI2Z1bmN0aW9ucy5rZXlzKCkpO1xuICAgICAgICBuYW1lcy5zb3J0KChhLCBiKSA9PiBhLmxvY2FsZUNvbXBhcmUoYikpO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IG5hbWVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBjb25zdCBuYW1lID0gbmFtZXNbaV07XG4gICAgICAgICAgICBjYWxsYmFjaygodGhpcy4jZnVuY3Rpb25zLmdldChuYW1lKSksIGkpO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8vIEZpbmQgYW4gZXZlbnQgZGVmaW5pdGlvbiBieSBhbnkgbWVhbnMgbmVjZXNzYXJ5ICh1bmxlc3MgaXQgaXMgYW1iaWd1b3VzKVxuICAgICNnZXRFdmVudChrZXksIHZhbHVlcywgZm9yY2VVbmlxdWUpIHtcbiAgICAgICAgLy8gRXZlbnRUb3BpY1xuICAgICAgICBpZiAoaXNIZXhTdHJpbmcoa2V5KSkge1xuICAgICAgICAgICAgY29uc3QgZXZlbnRUb3BpYyA9IGtleS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICAgICAgZm9yIChjb25zdCBmcmFnbWVudCBvZiB0aGlzLiNldmVudHMudmFsdWVzKCkpIHtcbiAgICAgICAgICAgICAgICBpZiAoZXZlbnRUb3BpYyA9PT0gZnJhZ21lbnQudG9waWNIYXNoKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBmcmFnbWVudDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICAvLyBJdCBpcyBhIGJhcmUgbmFtZSwgbG9vayB1cCB0aGUgZnVuY3Rpb24gKHdpbGwgcmV0dXJuIG51bGwgaWYgYW1iaWd1b3VzKVxuICAgICAgICBpZiAoa2V5LmluZGV4T2YoXCIoXCIpID09PSAtMSkge1xuICAgICAgICAgICAgY29uc3QgbWF0Y2hpbmcgPSBbXTtcbiAgICAgICAgICAgIGZvciAoY29uc3QgW25hbWUsIGZyYWdtZW50XSBvZiB0aGlzLiNldmVudHMpIHtcbiAgICAgICAgICAgICAgICBpZiAobmFtZS5zcGxpdChcIihcIiAvKiBmaXg6KSAqLylbMF0gPT09IGtleSkge1xuICAgICAgICAgICAgICAgICAgICBtYXRjaGluZy5wdXNoKGZyYWdtZW50KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAodmFsdWVzKSB7XG4gICAgICAgICAgICAgICAgLy8gUmVtb3ZlIGFsbCBtYXRjaGVzIHRoYXQgZG9uJ3QgaGF2ZSBhIGNvbXBhdGlibGUgbGVuZ3RoLlxuICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSBtYXRjaGluZy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAobWF0Y2hpbmdbaV0uaW5wdXRzLmxlbmd0aCA8IHZhbHVlcy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG1hdGNoaW5nLnNwbGljZShpLCAxKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAvLyBSZW1vdmUgYWxsIG1hdGNoZXMgdGhhdCBkb24ndCBtYXRjaCB0aGUgVHlwZWQgc2lnbmF0dXJlXG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IG1hdGNoaW5nLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGlucHV0cyA9IG1hdGNoaW5nW2ldLmlucHV0cztcbiAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCB2YWx1ZXMubGVuZ3RoOyBqKyspIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIE5vdCBhIHR5cGVkIHZhbHVlXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIVR5cGVkLmlzVHlwZWQodmFsdWVzW2pdKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gTWFrZSBzdXJlIHRoZSB2YWx1ZSB0eXBlIG1hdGNoZXMgdGhlIGlucHV0IHR5cGVcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh2YWx1ZXNbal0udHlwZSAhPT0gaW5wdXRzW2pdLmJhc2VUeXBlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF0Y2hpbmcuc3BsaWNlKGksIDEpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKG1hdGNoaW5nLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKG1hdGNoaW5nLmxlbmd0aCA+IDEgJiYgZm9yY2VVbmlxdWUpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBtYXRjaFN0ciA9IG1hdGNoaW5nLm1hcCgobSkgPT4gSlNPTi5zdHJpbmdpZnkobS5mb3JtYXQoKSkpLmpvaW4oXCIsIFwiKTtcbiAgICAgICAgICAgICAgICBhc3NlcnRBcmd1bWVudChmYWxzZSwgYGFtYmlndW91cyBldmVudCBkZXNjcmlwdGlvbiAoaS5lLiBtYXRjaGVzICR7bWF0Y2hTdHJ9KWAsIFwia2V5XCIsIGtleSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gbWF0Y2hpbmdbMF07XG4gICAgICAgI
26774H1cbiAgICAgICAgLy8gTm9ybWFsaXplIHRoZSBzaWduYXR1cmUgYW5kIGxvb2t1cCB0aGUgZnVuY3Rpb25cbiAgICAgICAgY29uc3QgcmVzdWx0ID0gdGhpcy4jZXZlbnRzLmdldChFdmVudEZyYWdtZW50LmZyb20oa2V5KS5mb3JtYXQoKSk7XG4gICAgICAgIGlmIChyZXN1bHQpIHtcbiAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIC8qKlxuICAgICAqICBHZXQgdGhlIGV2ZW50IG5hbWUgZm9yICUla2V5JSUsIHdoaWNoIG1heSBiZSBhIHRvcGljIGhhc2gsXG4gICAgICogIGV2ZW50IG5hbWUgb3IgZXZlbnQgc2lnbmF0dXJlIHRoYXQgYmVsb25ncyB0byB0aGUgQUJJLlxuICAgICAqL1xuICAgIGdldEV2ZW50TmFtZShrZXkpIHtcbiAgICAgICAgY29uc3QgZnJhZ21lbnQgPSB0aGlzLiNnZXRFdmVudChrZXksIG51bGwsIGZhbHNlKTtcbiAgICAgICAgYXNzZXJ0QXJndW1lbnQoZnJhZ21lbnQsIFwibm8gbWF0Y2hpbmcgZXZlbnRcIiwgXCJrZXlcIiwga2V5KTtcbiAgICAgICAgcmV0dXJuIGZyYWdtZW50Lm5hbWU7XG4gICAgfVxuICAgIC8qKlxuICAgICAqICBSZXR1cm5zIHRydWUgaWYgJSVrZXklJSAoYW4gZXZlbnQgdG9waWMgaGFzaCwgZXZlbnQgbmFtZSBvclxuICAgICAqICBldmVudCBzaWduYXR1cmUpIGlzIHByZXNlbnQgaW4gdGhlIEFCSS5cbiAgICAgKlxuICAgICAqICBJbiB0aGUgY2FzZSBvZiBhbiBldmVudCBuYW1lLCB0aGUgbmFtZSBtYXkgYmUgYW1iaWd1b3VzLCBzb1xuICAgICAqICBhY2Nlc3NpbmcgdGhlIFtbRXZlbnRGcmFnbWVudF1dIG1heSByZXF1aXJlIHJlZmluZW1lbnQuXG4gICAgICovXG4gICAgaGFzRXZlbnQoa2V5KSB7XG4gICAgICAgIHJldHVybiAhIXRoaXMuI2dldEV2ZW50KGtleSwgbnVsbCwgZmFsc2UpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiAgR2V0IHRoZSBbW0V2ZW50RnJhZ21lbnRdXSBmb3IgJSVrZXklJSwgd2hpY2ggbWF5IGJlIGEgdG9waWMgaGFzaCxcbiAgICAgKiAgZXZlbnQgbmFtZSBvciBldmVudCBzaWduYXR1cmUgdGhhdCBiZWxvbmdzIHRvIHRoZSBBQkkuXG4gICAgICpcbiAgICAgKiAgSWYgJSV2YWx1ZXMlJSBpcyBwcm92aWRlZCwgaXQgd2lsbCB1c2UgdGhlIFR5cGVkIEFQSSB0byBoYW5kbGVcbiAgICAgKiAgYW1iaWd1b3VzIGNhc2VzIHdoZXJlIG11bHRpcGxlIGV2ZW50cyBtYXRjaCBieSBuYW1lLlxuICAgICAqXG4gICAgICogIElmIHRoZSAlJWtleSUlIGFuZCAlJXZhbHVlcyUlIGRvIG5vdCByZWZpbmUgdG8gYSBzaW5nbGUgZXZlbnQgaW5cbiAgICAgKiAgdGhlIEFCSSwgdGhpcyB3aWxsIHRocm93LlxuICAgICAqL1xuICAgIGdldEV2ZW50KGtleSwgdmFsdWVzKSB7XG4gICAgICAgIHJldHVybiB0aGlzLiNnZXRFdmVudChrZXksIHZhbHVlcyB8fCBudWxsLCB0cnVlKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogIEl0ZXJhdGUgb3ZlciBhbGwgZXZlbnRzLCBjYWxsaW5nICUlY2FsbGJhY2slJSwgc29ydGVkIGJ5IHRoZWlyIG5hbWUuXG4gICAgICovXG4gICAgZm9yRWFjaEV2ZW50KGNhbGxiYWNrKSB7XG4gICAgICAgIGNvbnN0IG5hbWVzID0gQXJyYXkuZnJvbSh0aGlzLiNldmVudHMua2V5cygpKTtcbiAgICAgICAgbmFtZXMuc29ydCgoYSwgYikgPT4gYS5sb2NhbGVDb21wYXJlKGIpKTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBuYW1lcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgY29uc3QgbmFtZSA9IG5hbWVzW2ldO1xuICAgICAgICAgICAgY2FsbGJhY2soKHRoaXMuI2V2ZW50cy5nZXQobmFtZSkpLCBpKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiAgR2V0IHRoZSBbW0Vycm9yRnJhZ21lbnRdXSBmb3IgJSVrZXklJSwgd2hpY2ggbWF5IGJlIGFuIGVycm9yXG4gICAgICogIHNlbGVjdG9yLCBlcnJvciBuYW1lIG9yIGVycm9yIHNpZ25hdHVyZSB0aGF0IGJlbG9uZ3MgdG8gdGhlIEFCSS5cbiAgICAgKlxuICAgICAqICBJZiAlJXZhbHVlcyUlIGlzIHByb3ZpZGVkLCBpdCB3aWxsIHVzZSB0aGUgVHlwZWQgQVBJIHRvIGhhbmRsZVxuICAgICAqICBhbWJpZ3VvdXMgY2FzZXMgd2hlcmUgbXVsdGlwbGUgZXJyb3JzIG1hdGNoIGJ5IG5hbWUuXG4gICAgICpcbiAgICAgKiAgSWYgdGhlICUla2V5JSUgYW5kICUldmFsdWVzJSUgZG8gbm90IHJlZmluZSB0byBhIHNpbmdsZSBlcnJvciBpblxuICAgICAqICB0aGUgQUJJLCB0aGlzIHdpbGwgdGhyb3cuXG4gICAgICovXG4gICAgZ2V0RXJyb3Ioa2V5LCB2YWx1ZXMpIHtcbiAgICAgICAgaWYgKGlzSGV4U3RyaW5nKGtleSkpIHtcbiAgICAgICAgICAgIGNvbnN0IHNlbGVjdG9yID0ga2V5LnRvTG93ZXJDYXNlKCk7XG4gICAgICAgICAgICBpZiAoQnVpbHRpbkVycm9yc1tzZWxlY3Rvcl0pIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gRXJyb3JGcmFnbWVudC5mcm9tKEJ1aWx0aW5FcnJvcnNbc2VsZWN0b3JdLnNpZ25hdHVyZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGZyYWdtZW50IG9mIHRoaXMuI2Vycm9ycy52YWx1ZXMoKSkge1xuICAgICAgICAgICAgICAgIGlmIChzZWxlY3RvciA9PT0gZnJhZ21lbnQuc2VsZWN0b3IpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZyYWdtZW50O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgICAgIC8vIEl0IGlzIGEgYmFyZSBuYW1lLCBsb29rIHVwIHRoZSBmdW5jdGlvbiAod2lsbCByZXR1cm4gbnVsbCBpZiBhbWJpZ3VvdXMpXG4gICAgICAgIGlmIChrZXkuaW5kZXhPZihcIihcIikgPT09IC0xKSB7XG4gICAgICAgICAgICBjb25zdCBtYXRjaGluZyA9IFtdO1xuICAgICAgICAgICAgZm9yIChjb25zdCBbbmFtZSwgZnJhZ21lbnRdIG9mIHRoaXMuI2Vycm9ycykge1xuICAgICAgICAgICAgICAgIGlmIChuYW1lLnNwbGl0KFwiKFwiIC8qIGZpeDopICovKVswXSA9PT0ga2V5KSB7XG4gICAgICAgICAgICAgICAgICAgIG1hdGNoaW5nLnB1c2goZnJhZ21lbnQpO1xuICAgICAgICAgICAgICAgI
26774H1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChtYXRjaGluZy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgICAgICBpZiAoa2V5ID09PSBcIkVycm9yXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEVycm9yRnJhZ21lbnQuZnJvbShcImVycm9yIEVycm9yKHN0cmluZylcIik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChrZXkgPT09IFwiUGFuaWNcIikge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gRXJyb3JGcmFnbWVudC5mcm9tKFwiZXJyb3IgUGFuaWModWludDI1NilcIik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAobWF0Y2hpbmcubGVuZ3RoID4gMSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IG1hdGNoU3RyID0gbWF0Y2hpbmcubWFwKChtKSA9PiBKU09OLnN0cmluZ2lmeShtLmZvcm1hdCgpKSkuam9pbihcIiwgXCIpO1xuICAgICAgICAgICAgICAgIGFzc2VydEFyZ3VtZW50KGZhbHNlLCBgYW1iaWd1b3VzIGVycm9yIGRlc2NyaXB0aW9uIChpLmUuICR7bWF0Y2hTdHJ9KWAsIFwibmFtZVwiLCBrZXkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIG1hdGNoaW5nWzBdO1xuICAgICAgICB9XG4gICAgICAgIC8vIE5vcm1hbGl6ZSB0aGUgc2lnbmF0dXJlIGFuZCBsb29rdXAgdGhlIGZ1bmN0aW9uXG4gICAgICAgIGtleSA9IEVycm9yRnJhZ21lbnQuZnJvbShrZXkpLmZvcm1hdCgpO1xuICAgICAgICBpZiAoa2V5ID09PSBcIkVycm9yKHN0cmluZylcIikge1xuICAgICAgICAgICAgcmV0dXJuIEVycm9yRnJhZ21lbnQuZnJvbShcImVycm9yIEVycm9yKHN0cmluZylcIik7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGtleSA9PT0gXCJQYW5pYyh1aW50MjU2KVwiKSB7XG4gICAgICAgICAgICByZXR1cm4gRXJyb3JGcmFnbWVudC5mcm9tKFwiZXJyb3IgUGFuaWModWludDI1NilcIik7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgcmVzdWx0ID0gdGhpcy4jZXJyb3JzLmdldChrZXkpO1xuICAgICAgICBpZiAocmVzdWx0KSB7XG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiAgSXRlcmF0ZSBvdmVyIGFsbCBlcnJvcnMsIGNhbGxpbmcgJSVjYWxsYmFjayUlLCBzb3J0ZWQgYnkgdGhlaXIgbmFtZS5cbiAgICAgKi9cbiAgICBmb3JFYWNoRXJyb3IoY2FsbGJhY2spIHtcbiAgICAgICAgY29uc3QgbmFtZXMgPSBBcnJheS5mcm9tKHRoaXMuI2Vycm9ycy5rZXlzKCkpO1xuICAgICAgICBuYW1lcy5zb3J0KChhLCBiKSA9PiBhLmxvY2FsZUNvbXBhcmUoYikpO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IG5hbWVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBjb25zdCBuYW1lID0gbmFtZXNbaV07XG4gICAgICAgICAgICBjYWxsYmFjaygodGhpcy4jZXJyb3JzLmdldChuYW1lKSksIGkpO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8vIEdldCB0aGUgNC1ieXRlIHNlbGVjdG9yIHVzZWQgYnkgU29saWRpdHkgdG8gaWRlbnRpZnkgYSBmdW5jdGlvblxuICAgIC8qXG5nZXRTZWxlY3RvcihmcmFnbWVudDogRXJyb3JGcmFnbWVudCB8IEZ1bmN0aW9uRnJhZ21lbnQpOiBzdHJpbmcge1xuICAgIGlmICh0eXBlb2YoZnJhZ21lbnQpID09PSBcInN0cmluZ1wiKSB7XG4gICAgICAgIGNvbnN0IG1hdGNoZXM6IEFycmF
267745PEZyYWdtZW50PiA9IFsgXTtcblxuICAgICAgICB0cnkgeyBtYXRjaGVzLnB1c2godGhpcy5nZXRGdW5jdGlvbihmcmFnbWVudCkpOyB9IGNhdGNoIChlcnJvcikgeyB9XG4gICAgICAgIHRyeSB7IG1hdGNoZXMucHVzaCh0aGlzLmdldEVycm9yKDxzdHJpbmc+ZnJhZ21lbnQpKTsgfSBjYXRjaCAoXykgeyB9XG5cbiAgICAgICAgaWYgKG1hdGNoZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICBsb2dnZXIudGhyb3dBcmd1bWVudEVycm9yKFwidW5rbm93biBmcmFnbWVudFwiLCBcImtleVwiLCBmcmFnbWVudCk7XG4gICAgICAgIH0gZWxzZSBpZiAobWF0Y2hlcy5sZW5ndGggPiAxKSB7XG4gICAgICAgICAgICBsb2dnZXIudGhyb3dBcmd1bWVudEVycm9yKFwiYW1iaWd1b3VzIGZyYWdtZW50IG1hdGNoZXMgZnVuY3Rpb24gYW5kIGVycm9yXCIsIFwia2V5XCIsIGZyYWdtZW50KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGZyYWdtZW50ID0gbWF0Y2hlc1swXTtcbiAgICB9XG5cbiAgICByZXR1cm4gZGF0YVNsaWNlKGlkKGZyYWdtZW50LmZvcm1hdCgpKSwgMCwgNCk7XG59XG4gICAgKi9cbiAgICAvLyBHZXQgdGhlIDMyLWJ5dGUgdG9waWMgaGFzaCB1c2VkIGJ5IFNvbGlkaXR5IHRvIGlkZW50aWZ5IGFuIGV2ZW50XG4gICAgLypcbiAgICBnZXRFdmVudFRvcGljKGZyYWdtZW50OiBFdmVudEZyYWdtZW50KTogc3RyaW5nIHtcbiAgICAgICAgLy9pZiAodHlwZW9mKGZyYWdtZW50KSA9PT0gXCJzdHJpbmdcIikgeyBmcmFnbWVudCA9IHRoaXMuZ2V0RXZlbnQoZXZlbnRGcmFnbWVudCk7IH1cbiAgICAgICAgcmV0dXJuIGlkKGZyYWdtZW50LmZvcm1hdCgpKTtcbiAgICB9XG4gICAgKi9cbiAgICBfZGVjb2RlUGFyYW1zKHBhcmFtcywgZGF0YSkge1xuICAgICAgICByZXR1cm4gdGhpcy4jYWJpQ29kZXIuZGVjb2RlKHBhcmFtcywgZGF0YSk7XG4gICAgfVxuICAgIF9lbmNvZGVQYXJhbXMocGFyYW1zLCB2YWx1ZXMpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuI2FiaUNvZGVyLmVuY29kZShwYXJhbXMsIHZhbHVlcyk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqICBFbmNvZGVzIGEgYGB0eC5kYXRhYGAgb2JqZWN0IGZvciBkZXBsb3lpbmcgdGhlIENvbnRyYWN0IHdpdGhcbiAgICAgKiAgdGhlICUldmFsdWVzJSUgYXMgdGhlIGNvbnN0cnVjdG9yIGFyZ3VtZW50cy5cbiAgICAgKi9cbiAgICBlbmNvZGVEZXBsb3kodmFsdWVzKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9lbmNvZGVQYXJhbXModGhpcy5kZXBsb3kuaW5wdXRzLCB2YWx1ZXMgfHwgW10pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiAgRGVjb2RlcyB0aGUgcmVzdWx0ICUlZGF0YSUlIChlLmcuIGZyb20gYW4gYGBldGhfY2FsbGBgKSBmb3IgdGhlXG4gICAgICogIHNwZWNpZmllZCBlcnJvciAoc2VlIFtbZ2V0RXJyb3JdXSBmb3IgdmFsaWQgdmFsdWVzIGZvclxuICAgICAqICAlJWtleSUlKS5cbiAgICAgKlxuICAgICAqICBNb3N0IGRldmVsb3BlcnMgc2hvdWxkIHByZWZlciB0aGUgW1twYXJzZUNhbGxSZXN1bHRdXSBtZXRob2QgaW5zdGVhZCxcbiAgICAgKiAgd2hpY2ggd2lsbCBhdXRvbWF0aWNhbGx5IGRldGVjdCBhIGBgQ0FMTF9FWENFUFRJT05gYCBhbmQgdGhyb3cgdGhlXG4gICAgICogIGNvcnJlc3BvbmRpbmcgZXJyb3IuXG4gICAgICovXG4gICAgZGVjb2RlRXJyb3JSZXN1bHQoZnJhZ21lbnQsIGRhdGEpIHtcbiAgICAgICAgaWYgKHR5cGVvZiAoZnJhZ21lbnQpID09PSBcInN0cmluZ1wiKSB7XG4gICAgICAgICAgICBjb25zdCBmID0gdGhpcy5nZXRFcnJvcihmcmFnbWVudCk7XG4gICAgICAgICAgICBhc3NlcnRBcmd1bWVudChmLCBcInVua25vd24gZXJyb3JcIiwgXCJmcmFnbWVudFwiLCBmcmFnbWVudCk7XG4gICAgICAgICAgICBmcmFnbWVudCA9IGY7XG4gICAgICAgIH1cbiAgICAgICAgYXNzZXJ0QXJndW1lbnQoZGF0YVNsaWNlKGRhdGEsIDAsIDQpID09PSBmcmFnbWVudC5zZWxlY3RvciwgYGRhdGEgc2lnbmF0dXJlIGRvZXMgbm90IG1hdGNoIGVycm9yICR7ZnJhZ21lbnQubmFtZX0uYCwgXCJkYXRhXCIsIGRhdGEpO1xuICAgICAgICByZXR1cm4gdGhpcy5fZGVjb2RlUGFyYW1zKGZyYWdtZW50LmlucHV0cywgZGF0YVNsaWNlKGRhdGEsIDQpKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogIEVuY29kZXMgdGhlIHRyYW5zYWN0aW9uIHJldmVydCBkYXRhIGZvciBhIGNhbGwgcmVzdWx0IHRoYXRcbiAgICAgKiAgcmV2ZXJ0ZWQgZnJvbSB0aGUgdGhlIENvbnRyYWN0IHdpdGggdGhlIHNlcGNpZmllZCAlJWVycm9yJSVcbiAgICAgKiAgKHNlZSBbW2dldEVycm9yXV0gZm9yIHZhbGlkIHZhbHVlcyBmb3IgJSVmcmFnbWVudCUlKSB3aXRoIHRoZSAlJXZhbHVlcyUlLlxuICAgICAqXG4gICAgICogIFRoaXMgaXMgZ2VuZXJhbGx5IG5vdCB1c2VkIGJ5IG1vc3QgZGV2ZWxvcGVycywgdW5sZXNzIHRyeWluZyB0byBtb2NrXG4gICAgICogIGEgcmVzdWx0IGZyb20gYSBDb250cmFjdC5cbiAgICAgKi9cbiAgICBlbmNvZGVFcnJvclJlc3VsdChmcmFnbWVudCwgdmFsdWVzKSB7XG4gICAgICAgIGlmICh0eXBlb2YgKGZyYWdtZW50KSA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgICAgICAgY29uc3QgZiA9IHRoaXMuZ2V0RXJyb3IoZnJhZ21lbnQpO1xuICAgICAgICAgICAgYXNzZXJ0QXJndW1lbnQoZiwgXCJ1bmtub3duIGVycm9yXCIsIFwiZnJhZ21lbnRcIiwgZnJhZ21lbnQpO1xuICAgICAgICAgICAgZnJhZ21lbnQgPSBmO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBjb25jYXQoW1xuICAgICAgICAgICAgZnJhZ21lbnQuc2VsZWN0b3IsXG4gICAgICAgICAgICB0aGlzLl9lbmNvZGVQYXJhbXMoZnJhZ21lbnQuaW5wdXRzLCB2YWx1ZXMgfHwgW10pXG4gICAgICAgIF0pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiAgRGVjb2RlcyB0aGUgJSVkYXRhJSUgZnJvbSBhIHRyYW5zYWN0aW9uIGBgdHguZGF0YWBgIGZvclxuICAgICAqICB0aGUgZnVuY3Rpb24gc3BlY2lmaWVkIChzZWUgW1tnZXRGdW5jdGlvbl1dIGZvciB2YWxpZCB2YWx1ZXNcbiAgICAgKiAgZm9yICUlZnJhZ21lbnQlJSkuXG4gICAgICpcbiAgICAgKiAgTW9zdCBkZXZlbG9wZXJzIHNob3VsZCBwcmVmZXIgdGhlIFtbcGFyc2VUcmFuc2FjdGlvbl1dIG1ldGhvZFxuICAgICAqICBpbnN0ZWFkLCB3aGljaCB3aWxsIGF1dG9tYXRpY2FsbHkgZGV0
26774ZWN0IHRoZSBmcmFnbWVudC5cbiAgICAgKi9cbiAgICBkZWNvZGVGdW5jdGlvbkRhdGEoZnJhZ21lbnQsIGRhdGEpIHtcbiAgICAgICAgaWYgKHR5cGVvZiAoZnJhZ21lbnQpID09PSBcInN0cmluZ1wiKSB7XG4gICAgICAgICAgICBjb25zdCBmID0gdGhpcy5nZXRGdW5jdGlvbihmcmFnbWVudCk7XG4gICAgICAgICAgICBhc3NlcnRBcmd1bWVudChmLCBcInVua25vd24gZnVuY3Rpb25cIiwgXCJmcmFnbWVudFwiLCBmcmFnbWVudCk7XG4gICAgICAgICAgICBmcmFnbWVudCA9IGY7XG4gICAgICAgIH1cbiAgICAgICAgYXNzZXJ0QXJndW1lbnQoZGF0YVNsaWNlKGRhdGEsIDAsIDQpID09PSBmcmFnbWVudC5zZWxlY3RvciwgYGRhdGEgc2lnbmF0dXJlIGRvZXMgbm90IG1hdGNoIGZ1bmN0aW9uICR7ZnJhZ21lbnQubmFtZX0uYCwgXCJkYXRhXCIsIGRhdGEpO1xuICAgICAgICByZXR1cm4gdGhpcy5fZGVjb2RlUGFyYW1zKGZyYWdtZW50LmlucHV0cywgZGF0YVNsaWNlKGRhdGEsIDQpKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogIEVuY29kZXMgdGhlIGBgdHguZGF0YWBgIGZvciBhIHRyYW5zYWN0aW9uIHRoYXQgY2FsbHMgdGhlIGZ1bmN0aW9uXG4gICAgICogIHNwZWNpZmllZCAoc2VlIFtbZ2V0RnVuY3Rpb25dXSBmb3IgdmFsaWQgdmFsdWVzIGZvciAlJWZyYWdtZW50JSUpIHdpdGhcbiAgICAgKiAgdGhlICUldmFsdWVzJSUuXG4gICAgICovXG4gICAgZW5jb2RlRnVuY3Rpb25EYXRhKGZyYWdtZW50LCB2YWx1ZXMpIHtcbiAgICAgICAgaWYgKHR5cGVvZiAoZnJhZ21lbnQpID09PSBcInN0cmluZ1wiKSB7XG4gICAgICAgICAgICBjb25zdCBmID0gdGhpcy5nZXRGdW5jdGlvbihmcmFnbWVudCk7XG4gICAgICAgICAgICBhc3NlcnRBcmd1bWVudChmLCBcInVua25vd24gZnVuY3Rpb25cIiwgXCJmcmFnbWVudFwiLCBmcmFnbWVudCk7XG4gICAgICAgICAgICBmcmFnbWVudCA9IGY7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGNvbmNhdChbXG4gICAgICAgICAgICBmcmFnbWVudC5zZWxlY3RvcixcbiAgICAgICAgICAgIHRoaXMuX2VuY29kZVBhcmFtcyhmcmFnbWVudC5pbnB1dHMsIHZhbHVlcyB8fCBbXSlcbiAgICAgICAgXSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqICBEZWNvZGVzIHRoZSByZXN1bHQgJSVkYXRhJSUgKGUuZy4gZnJvbSBhbiBgYGV0aF9jYWxsYGApIGZvciB0aGVcbiAgICAgKiAgc3BlY2lmaWVkIGZ1bmN0aW9uIChzZWUgW1tnZXRGdW5jdGlvbl1dIGZvciB2YWxpZCB2YWx1ZXMgZm9yXG4gICAgICogICUla2V5JSUpLlxuICAgICAqXG4gICAgICogIE1vc3QgZGV2ZWxvcGVycyBzaG91bGQgcHJlZmVyIHRoZSBbW3BhcnNlQ2FsbFJlc3VsdF1dIG1ldGhvZCBpbnN0ZWFkLFxuICAgICAqICB3aGljaCB3aWxsIGF1dG9tYXRpY2FsbHkgZGV0ZWN0IGEgYGBDQUxMX0VYQ0VQVElPTmBgIGFuZCB0aHJvdyB0aGVcbiAgICAgKiAgY29ycmVzcG9uZGluZyBlcnJvci5cbiAgICAgKi9cbiAgICBkZWNvZGVGdW5jdGlvblJlc3VsdChmcmFnbWVudCwgZGF0YSkge1xuICAgICAgICBpZiAodHlwZW9mIChmcmFnbWVudCkgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgICAgIGNvbnN0IGYgPSB0aGlzLmdldEZ1bmN0aW9uKGZyYWdtZW50KTtcbiAgICAgICAgICAgIGFzc2VydEFyZ3VtZW50KGYsIFwidW5rbm93biBmdW5jdGlvblwiLCBcImZyYWdtZW50XCIsIGZyYWdtZW50KTtcbiAgICAgICAgICAgIGZyYWdtZW50ID0gZjtcbiAgICAgICAgfVxuICAgICAgICBsZXQgbWVzc2FnZSA9IFwiaW52YWxpZCBsZW5ndGggZm9yIHJlc3VsdCBkYXRhXCI7XG4gICAgICAgIGNvbnN0IGJ5dGVzID0gZ2V0Qnl0ZXNDb3B5KGRhdGEpO1xuICAgICAgICBpZiAoKGJ5dGVzLmxlbmd0aCAlIDMyKSA9PT0gMCkge1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy4jYWJpQ29kZXIuZGVjb2RlKGZyYWdtZW50Lm91dHB1dHMsIGJ5dGVzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgICAgIG1lc3NhZ2UgPSBcImNvdWxkIG5vdCBkZWNvZGUgcmVzdWx0IGRhdGFcIjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAvLyBDYWxsIHJldHVybmVkIGRhdGEgd2l0aCBubyBlcnJvciwgYnV0IHRoZSBkYXRhIGlzIGp1bmtcbiAgICAgICAgYXNzZXJ0KGZhbHNlLCBtZXNzYWdlLCBcIkJBRF9EQVRBXCIsIHtcbiAgICAgICAgICAgIHZhbHVlOiBoZXhsaWZ5KGJ5dGVzKSxcbiAgICAgICAgICAgIGluZm86IHsgbWV0aG9kOiBmcmFnbWVudC5uYW1lLCBzaWduYXR1cmU6IGZyYWdtZW50LmZvcm1hdCgpIH1cbiAgICAgICAgfSk7XG4gICAgfVxuICAgIG1ha2VFcnJvcihfZGF0YSwgdHgpIHtcbiAgICAgICAgY29uc3QgZGF0YSA9IGdldEJ5dGVzKF9kYXRhLCBcImRhdGFcIik7XG4gICAgICAgIGNvbnN0IGVycm9yID0gQWJpQ29kZXIuZ2V0QnVpbHRpbkNhbGxFeGNlcHRpb24oXCJjYWxsXCIsIHR4LCBkYXRhKTtcbiAgICAgICAgLy8gTm90IGEgYnVpbHQtaW4gZXJyb3I7IHRyeSBmaW5kaW5nIGEgY3VzdG9tIGVycm9yXG4gICAgICAgIGNvbnN0IGN1c3RvbVByZWZpeCA9IFwiZXhlY3V0aW9uIHJldmVydGVkICh1bmtub3duIGN1c3RvbSBlcnJvcilcIjtcbiAgICAgICAgaWYgKGVycm9yLm1lc3NhZ2Uuc3RhcnRzV2l0aChjdXN0b21QcmVmaXgpKSB7XG4gICAgICAgICAgICBjb25zdCBzZWxlY3RvciA9IGhleGxpZnkoZGF0YS5zbGljZSgwLCA0KSk7XG4gICAgICAgICAgICBjb25zdCBlZiA9IHRoaXMuZ2V0RXJyb3Ioc2VsZWN0b3IpO1xuICAgICAgICAgICAgaWYgKGVmKSB7XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgYXJncyA9IHRoaXMuI2FiaUNvZGVyLmRlY29kZShlZi5pbnB1dHMsIGRhdGEuc2xpY2UoNCkpO1xuICAgICAgICAgICAgICAgICAgICBlcnJvci5yZXZlcnQgPSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBuYW1lOiBlZi5uYW1lLCBzaWduYXR1cmU6IGVmLmZvcm1hdCgpLCBhcmdzXG4gICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgICAgIGVycm9yLnJlY
26774XNvbiA9IGVycm9yLnJldmVydC5zaWduYXR1cmU7XG4gICAgICAgICAgICAgICAgICAgIGVycm9yLm1lc3NhZ2UgPSBgZXhlY3V0aW9uIHJldmVydGVkOiAke2Vycm9yLnJlYXNvbn1gO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgICAgICBlcnJvci5tZXNzYWdlID0gYGV4ZWN1dGlvbiByZXZlcnRlZCAoY291bHQgbm90IGRlY29kZSBjdXN0b20gZXJyb3IpYDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgLy8gQWRkIHRoZSBpbnZvY2F0aW9uLCBpZiBhdmFpbGFibGVcbiAgICAgICAgY29uc3QgcGFyc2VkID0gdGhpcy5wYXJzZVRyYW5zYWN0aW9uKHR4KTtcbiAgICAgICAgaWYgKHBhcnNlZCkge1xuICAgICAgICAgICAgZXJyb3IuaW52b2NhdGlvbiA9IHtcbiAgICAgICAgICAgICAgICBtZXRob2Q6IHBhcnNlZC5uYW1lLFxuICAgICAgICAgICAgICAgIHNpZ25hdHVyZTogcGFyc2VkLnNpZ25hdHVyZSxcbiAgICAgICAgICAgICAgICBhcmdzOiBwYXJzZWQuYXJnc1xuICAgICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZXJyb3I7XG4gICAgfVxuICAgIC8qKlxuICAgICAqICBFbmNvZGVzIHRoZSByZXN1bHQgZGF0YSAoZS5nLiBmcm9tIGFuIGBgZXRoX2NhbGxgYCkgZm9yIHRoZVxuICAgICAqICBzcGVjaWZpZWQgZnVuY3Rpb24gKHNlZSBbW2dldEZ1bmN0aW9uXV0gZm9yIHZhbGlkIHZhbHVlc1xuICAgICAqICBmb3IgJSVmcmFnbWVudCUlKSB3aXRoICUldmFsdWVzJSUuXG4gICAgICpcbiAgICAgKiAgVGhpcyBpcyBnZW5lcmFsbHkgbm90IHVzZWQgYnkgbW9zdCBkZXZlbG9wZXJzLCB1bmxlc3MgdHJ5aW5nIHRvIG1vY2tcbiAgICAgKiAgYSByZXN1bHQgZnJvbSBhIENvbnRyYWN0LlxuICAgICAqL1xuICAgIGVuY29kZUZ1bmN0aW9uUmVzdWx0KGZyYWdtZW50LCB2YWx1ZXMpIHtcbiAgICAgICAgaWYgKHR5cGVvZiAoZnJhZ21lbnQpID09PSBcInN0cmluZ1wiKSB7XG4gICAgICAgICAgICBjb25zdCBmID0gdGhpcy5nZXRGdW5jdGlvbihmcmFnbWVudCk7XG4gICAgICAgICAgICBhc3NlcnRBcmd1bWVudChmLCBcInVua25vd24gZnVuY3Rpb25cIiwgXCJmcmFnbWVudFwiLCBmcmFnbWVudCk7XG4gICAgICAgICAgICBmcmFnbWVudCA9IGY7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGhleGxpZnkodGhpcy4jYWJpQ29kZXIuZW5jb2RlKGZyYWdtZW50Lm91dHB1dHMsIHZhbHVlcyB8fCBbXSkpO1xuICAgIH1cbiAgICAvKlxuICAgICAgICBzcGVsdW5rKGlucHV0czogQXJyYXk8UGFyYW1UeXBlPiwgdmFsdWVzOiBSZWFkb25seUFycmF5PGFueT4sIHByb2Nlc3NmdW5jOiAodHlwZTogc3RyaW5nLCB2YWx1ZTogYW55KSA9PiBQcm9taXNlPGFueT4pOiBQcm9taXNlPEFycmF5PGFueT4+IHtcbiAgICAgICAgICAgIGNvbnN0IHByb21pc2VzOiBBcnJheTxQcm9taXNlPD4+ID0gWyBdO1xuICAgICAgICAgICAgY29uc3QgcHJvY2VzcyA9IGZ1bmN0aW9uKHR5cGU6IFBhcmFtVHlwZSwgdmFsdWU6IGFueSk6IGFueSB7XG4gICAgICAgICAgICAgICAgaWYgKHR5cGUuYmFzZVR5cGUgPT09IFwiYXJyYXlcIikge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZGVzY2VuZCh0eXBlLmNoaWxkXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmICh0eXBlLiA9PT0gXCJhZGRyZXNzXCIpIHtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9O1xuICAgIFxuICAgICAgICAgICAgY29uc3QgZGVzY2VuZCA9IGZ1bmN0aW9uIChpbnB1dHM6IEFycmF5PFBhcmFtVHlwZT4sIHZhbHVlczogUmVhZG9ubHlBcnJheTxhbnk+KSB7XG4gICAgICAgICAgICAgICAgaWYgKGlucHV0cy5sZW5ndGggIT09IHZhbHVlcy5sZW5ndGgpIHsgdGhyb3cgbmV3IEVycm9yKFwibGVuZ3RoIG1pc21hdGNoXCIpOyB9XG4gICAgICAgICAgICAgICAgXG4gICAgICAgICAgICB9O1xuICAgIFxuICAgICAgICAgICAgY29uc3QgcmVzdWx0OiBBcnJheTxhbnk+ID0gWyBdO1xuICAgICAgICAgICAgdmFsdWVzLmZvckVhY2goKHZhbHVlLCBpbmRleCkgPT4ge1xuICAgICAgICAgICAgICAgIGlmICh2YWx1ZSA9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgIHRvcGljcy5wdXNoKG51bGwpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAocGFyYW0uYmFzZVR5cGUgPT09IFwiYXJyYXlcIiB8fCBwYXJhbS5iYXNlVHlwZSA9PT0gXCJ0dXBsZVwiKSB7XG4gICAgICAgICAgICAgICAgICAgIGxvZ2dlci50aHJvd0FyZ3VtZW50RXJyb3IoXCJmaWx0ZXJpbmcgd2l0aCB0dXBsZXMgb3IgYXJyYXlzIG5vdCBzdXBwb3J0ZWRcIiwgKFwiY29udHJhY3QuXCIgKyBwYXJhbS5uYW1lKSwgdmFsdWUpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgdG9waWNzLnB1c2godmFsdWUubWFwKCh2YWx1ZSkgPT4gZW5jb2RlVG9waWMocGFyYW0sIHZhbHVlKSkpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHRvcGljcy5wdXNoKGVuY29kZVRvcGljKHBhcmFtLCB2YWx1ZSkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgKi9cbiAgICAvLyBDcmVhdGUgdGhlIGZpbHRlciBmb3IgdGhlIGV2ZW50IHdpdGggc2VhcmNoIGNyaXRlcmlhIChlLmcuIGZvciBldGhfZmlsdGVyTG9nKVxuICAgIGVuY29kZUZpbHRlclRvcGljcyhmcmFnbWVudCwgdmFsdWVzKSB7XG4gICAgICAgIGlmICh0eXBlb2YgKGZyYWdtZW50KSA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgICAgICAgY29uc3QgZiA9IHRoaXMuZ2V0RXZlbnQoZnJhZ21lbnQpO1xuICAgICAgICAgICAgYXNzZXJ0QXJndW1lbnQoZiwgXCJ1bmtub3duIGV2ZW50XCIsIFwiZXZlbnRGcmFnbWVudFwiLCBmcmFnbWVudCk7XG4gICAgICAgICAgICBmcmFnbWVudCA9IGY7XG4gICAgICAgIH1cbiAgICAgICAgYXNzZXJ0KHZhbHVlcy5sZW5ndGggPD0gZnJhZ21lbnQuaW5wdXRzLmxlbmd0aCwgYHRvbyBtYW55IGFyZ3VtZW50cyBmb3IgJHtmcmFnbWVudC5mb3JtYXQoKX1gLCBcIlVORVhQRUNURURfQVJHVU1FTlRcIiwgeyBjb3VudDogdmFsdWVzLmxlbmd0aCwgZXhwZWN0ZWRDb3VudDogZnJhZ21lbnQuaW5wdXRzLmxlbmd0aCB9KTtcbiAgICAgICAgY29uc3QgdG9waWNzID0gW107XG4gICAgICAgIGlmICghZnJhZ21lbnQuYW5vbnltb3VzKSB7XG4gICAgICAgICAgICB0b3BpY3MucHVzaChmcmFnbWVudC50b3BpY0hhc2gpO1xuICAgICAgICB9XG4gICAgICAgIC8vIEBUT0RPOiBVc2UgdGhlIGNvZGVycyBmb3IgdGhpczsgdG8gcHJvcGVybHkgc3VwcG9ydCB0dXBsZXMsIGV0Yy5cbiAgICAgICAgY29uc3QgZW5jb2RlVG9waWMgPSAocGFyYW0sIHZhbHVlKSA9PiB7XG4gICAgICAgICAgICBpZiAocGFyYW0udHlwZSA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgICAgICAgICAgI
26774HJldHVybiBpZCh2YWx1ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChwYXJhbS50eXBlID09PSBcImJ5dGVzXCIpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4ga2VjY2FrMjU2KGhleGxpZnkodmFsdWUpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChwYXJhbS50eXBlID09PSBcImJvb2xcIiAmJiB0eXBlb2YgKHZhbHVlKSA9PT0gXCJib29sZWFuXCIpIHtcbiAgICAgICAgICAgICAgICB2YWx1ZSA9ICh2YWx1ZSA/IFwiMHgwMVwiIDogXCIweDAwXCIpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAocGFyYW0udHlwZS5tYXRjaCgvXnU/aW50LykpIHtcbiAgICAgICAgICAgICAgICB2YWx1ZSA9IHRvQmVIZXgodmFsdWUpOyAvLyBAVE9ETzogU2hvdWxkIHRoaXMgdG9Ud29zPz9cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKHBhcmFtLnR5cGUubWF0Y2goL15ieXRlcy8pKSB7XG4gICAgICAgICAgICAgICAgdmFsdWUgPSB6ZXJvUGFkQnl0ZXModmFsdWUsIDMyKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKHBhcmFtLnR5cGUgPT09IFwiYWRkcmVzc1wiKSB7XG4gICAgICAgICAgICAgICAgLy8gQ2hlY2sgYWRkcmVzc2VzIGFyZSB2YWxpZFxuICAgICAgICAgICAgICAgIHRoaXMuI2FiaUNvZGVyLmVuY29kZShbXCJhZGRyZXNzXCJdLCBbdmFsdWVdKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB6ZXJvUGFkVmFsdWUoaGV4bGlmeSh2YWx1ZSksIDMyKTtcbiAgICAgICAgfTtcbiAgICAgICAgdmFsdWVzLmZvckVhY2goKHZhbHVlLCBpbmRleCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgcGFyYW0gPSBmcmFnbWVudC5pbnB1dHNbaW5kZXhdO1xuICAgICAgICAgICAgaWYgKCFwYXJhbS5pbmRleGVkKSB7XG4gICAgICAgICAgICAgICAgYXNzZXJ0QXJndW1lbnQodmFsdWUgPT0gbnVsbCwgXCJjYW5ub3QgZmlsdGVyIG5vbi1pbmRleGVkIHBhcmFtZXRlcnM7IG11c3QgYmUgbnVsbFwiLCAoXCJjb250cmFjdC5cIiArIHBhcmFtLm5hbWUpLCB2YWx1ZSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHZhbHVlID09IG51bGwpIHtcbiAgICAgICAgICAgICAgICB0b3BpY3MucHVzaChudWxsKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKHBhcmFtLmJhc2VUeXBlID09PSBcImFycmF5XCIgfHwgcGFyYW0uYmFzZVR5cGUgPT09IFwidHVwbGVcIikge1xuICAgICAgICAgICAgICAgIGFzc2VydEFyZ3VtZW50KGZhbHNlLCBcImZpbHRlcmluZyB3aXRoIHR1cGxlcyBvciBhcnJheXMgbm90IHN1cHBvcnRlZFwiLCAoXCJjb250cmFjdC5cIiArIHBhcmFtLm5hbWUpLCB2YWx1ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSkge1xuICAgICAgICAgICAgICAgIHRvcGljcy5wdXNoKHZhbHVlLm1hcCgodmFsdWUpID0+IGVuY29kZVRvcGljKHBhcmFtLCB2YWx1ZSkpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHRvcGljcy5wdXNoKGVuY29kZVRvcGljKHBhcmFtLCB2YWx1ZSkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgLy8gVHJpbSBvZmYgdHJhaWxpbmcgbnVsbHNcbiAgICAgICAgd2hpbGUgKHRvcGljcy5sZW5ndGggJiYgdG9waWNzW3RvcGljcy5sZW5ndGggLSAxXSA9PT0gbnVsbCkge1xuICAgICAgICAgICAgdG9waWNzLnBvcCgpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0b3BpY3M7XG4gICAgfVxuICAgIGVuY29kZUV2ZW50TG9nKGZyYWdtZW50LCB2YWx1ZXMpIHtcbiAgICAgICAgaWYgKHR5cGVvZiAoZnJhZ21lbnQpID09PSBcInN0cmluZ1wiKSB7XG4gICAgICAgICAgICBjb25zdCBmID0gdGhpcy5nZXRFdmVudChmcmFnbWVudCk7XG4gICAgICAgICAgICBhc3NlcnRBcmd1bWVudChmLCBcInVua25vd24gZXZlbnRcIiwgXCJldmVudEZyYWdtZW50XCIsIGZyYWdtZW50KTtcbiAgICAgICAgICAgIGZyYWdtZW50ID0gZjtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCB0b3BpY3MgPSBbXTtcbiAgICAgICAgY29uc3QgZGF0YVR5cGVzID0gW107XG4gICAgICAgIGNvbnN0IGRhdGFWYWx1ZXMgPSBbXTtcbiAgICAgICAgaWYgKCFmcmFnbWVudC5hbm9ueW1vdXMpIHtcbiAgICAgICAgICAgIHRvcGljcy5wdXNoKGZyYWdtZW50LnRvcGljSGFzaCk7XG4gICAgICAgIH1cbiAgICAgICAgYXNzZXJ0QXJndW1lbnQodmFsdWVzLmxlbmd0aCA9PT0gZnJhZ21lbnQuaW5wdXRzLmxlbmd0aCwgXCJldmVudCBhcmd1bWVudHMvdmFsdWVzIG1pc21hdGNoXCIsIFwidmFsdWVzXCIsIHZhbHVlcyk7XG4gICAgICAgIGZyYWdtZW50LmlucHV0cy5mb3JFYWNoKChwYXJhbSwgaW5kZXgpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gdmFsdWVzW2luZGV4XTtcbiAgICAgICAgICAgIGlmIChwYXJhbS5pbmRleGVkKSB7XG4gICAgICAgICAgICAgICAgaWYgKHBhcmFtLnR5cGUgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgdG9waWNzLnB1c2goaWQodmFsdWUpKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSBpZiAocGFyYW0udHlwZSA9PT0gXCJieXRlc1wiKSB7XG4gICAgICAgICAgICAgICAgICAgIHRvcGljcy5wdXNoKGtlY2NhazI1Nih2YWx1ZSkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIGlmIChwYXJhbS5iYXNlVHlwZSA9PT0gXCJ0dXBsZVwiIHx8IHBhcmFtLmJhc2VUeXBlID09PSBcImFycmF5XCIpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gQFRPRE9cbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwibm90IGltcGxlbWVudGVkXCIpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdG9waWNzLnB1c2godGhpcy4jYWJpQ29kZXIuZW5jb2RlKFtwYXJhbS50eXBlXSwgW3ZhbHVlXSkpO1xuICAgICAgICAgICAgICAgI
26774H1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGRhdGFUeXBlcy5wdXNoKHBhcmFtKTtcbiAgICAgICAgICAgICAgICBkYXRhVmFsdWVzLnB1c2godmFsdWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGRhdGE6IHRoaXMuI2FiaUNvZGVyLmVuY29kZShkYXRhVHlwZXMsIGRhdGFWYWx1ZXMpLFxuICAgICAgICAgICAgdG9waWNzOiB0b3BpY3NcbiAgICAgICAgfTtcbiAgICB9XG4gICAgLy8gRGVjb2RlIGEgZmlsdGVyIGZvciB0aGUgZXZlbnQgYW5kIHRoZSBzZWFyY2ggY3JpdGVyaWFcbiAgICBkZWNvZGVFdmVudExvZyhmcmFnbWVudCwgZGF0YSwgdG9waWNzKSB7XG4gICAgICAgIGlmICh0eXBlb2YgKGZyYWdtZW50KSA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgICAgICAgY29uc3QgZiA9IHRoaXMuZ2V0RXZlbnQoZnJhZ21lbnQpO1xuICAgICAgICAgICAgYXNzZXJ0QXJndW1lbnQoZiwgXCJ1bmtub3duIGV2ZW50XCIsIFwiZXZlbnRGcmFnbWVudFwiLCBmcmFnbWVudCk7XG4gICAgICAgICAgICBmcmFnbWVudCA9IGY7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRvcGljcyAhPSBudWxsICYmICFmcmFnbWVudC5hbm9ueW1vdXMpIHtcbiAgICAgICAgICAgIGNvbnN0IGV2ZW50VG9waWMgPSBmcmFnbWVudC50b3BpY0hhc2g7XG4gICAgICAgICAgICBhc3NlcnRBcmd1bWVudChpc0hleFN0cmluZyh0b3BpY3NbMF0sIDMyKSAmJiB0b3BpY3NbMF0udG9Mb3dlckNhc2UoKSA9PT0gZXZlbnRUb3BpYywgXCJmcmFnbWVudC90b3BpYyBtaXNtYXRjaFwiLCBcInRvcGljc1swXVwiLCB0b3BpY3NbMF0pO1xuICAgICAgICAgICAgdG9waWNzID0gdG9waWNzLnNsaWNlKDEpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGluZGV4ZWQgPSBbXTtcbiAgICAgICAgY29uc3Qgbm9uSW5kZXhlZCA9IFtdO1xuICAgICAgICBjb25zdCBkeW5hbWljID0gW107XG4gICAgICAgIGZyYWdtZW50LmlucHV0cy5mb3JFYWNoKChwYXJhbSwgaW5kZXgpID0+IHtcbiAgICAgICAgICAgIGlmIChwYXJhbS5pbmRleGVkKSB7XG4gICAgICAgICAgICAgICAgaWYgKHBhcmFtLnR5cGUgPT09IFwic3RyaW5nXCIgfHwgcGFyYW0udHlwZSA9PT0gXCJieXRlc1wiIHx8IHBhcmFtLmJhc2VUeXBlID09PSBcInR1cGxlXCIgfHwgcGFyYW0uYmFzZVR5cGUgPT09IFwiYXJyYXlcIikge1xuICAgICAgICAgICAgICAgICAgICBpbmRleGVkLnB1c2goUGFyYW1UeXBlLmZyb20oeyB0eXBlOiBcImJ5dGVzMzJcIiwgbmFtZTogcGFyYW0ubmFtZSB9KSk7XG4gICAgICAgICAgICAgICAgICAgIGR5bmFtaWMucHVzaCh0cnVlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGluZGV4ZWQucHVzaChwYXJhbSk7XG4gICAgICAgICAgICAgICAgICAgIGR5bmFtaWMucHVzaChmYWxzZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgbm9uSW5kZXhlZC5wdXNoKHBhcmFtKTtcbiAgICAgICAgICAgICAgICBkeW5hbWljLnB1c2goZmFsc2UpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgY29uc3QgcmVzdWx0SW5kZXhlZCA9ICh0b3BpY3MgIT0gbnVsbCkgPyB0aGlzLiNhYmlDb2Rlci5kZWNvZGUoaW5kZXhlZCwgY29uY2F0KHRvcGljcykpIDogbnVsbDtcbiAgICAgICAgY29uc3QgcmVzdWx0Tm9uSW5kZXhlZCA9IHRoaXMuI2FiaUNvZGVyLmRlY29kZShub25JbmRleGVkLCBkYXRhLCB0cnVlKTtcbiAgICAgICAgLy9jb25zdCByZXN1bHQ6IChBcnJheTxhbnk+ICYgeyBbIGtleTogc3RyaW5nIF06IGFueSB9KSA9IFsgXTtcbiAgICAgICAgY29uc3QgdmFsdWVzID0gW107XG4gICAgICAgIGNvbnN0IGtleXMgPSBbXTtcbiAgICAgICAgbGV0IG5vbkluZGV4ZWRJbmRleCA9IDAsIGluZGV4ZWRJbmRleCA9IDA7XG4gICAgICAgIGZyYWdtZW50LmlucHV0cy5mb3JFYWNoKChwYXJhbSwgaW5kZXgpID0+IHtcbiAgICAgICAgICAgIGxldCB2YWx1ZSA9IG51bGw7XG4gICAgICAgICAgICBpZiAocGFyYW0uaW5kZXhlZCkge1xuICAgICAgICAgICAgICAgIGlmIChyZXN1bHRJbmRleGVkID09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSBuZXcgSW5kZXhlZChudWxsKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSBpZiAoZHluYW1pY1tpbmRleF0pIHtcbiAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSBuZXcgSW5kZXhlZChyZXN1bHRJbmRleGVkW2luZGV4ZWRJbmRleCsrXSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSByZXN1bHRJbmRleGVkW2luZGV4ZWRJbmRleCsrXTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlID0gZXJyb3I7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IHJlc3VsdE5vbkluZGV4ZWRbbm9uSW5kZXhlZEluZGV4KytdO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSBlcnJvcjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB2YWx1ZXMucHVzaCh2YWx1ZSk7XG4gICAgICAgICAgICBrZXlzLnB1c2gocGFyYW0ubmFtZSB8fCBudWxsKTtcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiBSZXN1bHQuZnJvbUl0ZW1zKHZhbHVlcywga2V5cyk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqICBQYXJzZXMgYSB0cmFuc2FjdGlvbiwgZmluZGluZyB0aGUgbWF0Y2hpbmcgZnVuY3Rpb24gYW5kIGV4dHJhY3RzXG4gICAgICogIHRoZSBwYXJhbWV0ZXIgdmFsdWVzIGFsb25nIHdpdGggb3RoZXIgdXNlZnVsIGZ1bmN0aW9uIGRldGFpbHMuXG4gICAgICpcbiAgICAgKiAgSWYgdGhlIG1hdGNoaW5nIGZ1bmN0aW9uIGNhbm5vdCBiZSBmb3VuZCwgcmV0dXJuIG51bGwuXG4gICAgICovXG4gICAgcGFyc2VUcmFuc2FjdGlvbih0eCkge1xuICAgICAgICBjb25zdCBkYXRhID0gZ2V0Qnl0ZXModHguZGF0YSwgXCJ0eC5kYXRhXCIpO1xuICAgICAgICBjb25zdCB2YWx1ZSA9IGdldEJpZ0ludCgodHgudmFsdWUgIT0gbnVsbCkgPyB0eC52YWx1ZSA6IDAsIFwidHgudmFsdWVcIik7XG4gICAgICAgIGNvbnN0IGZyYWdtZW50ID0gdGhpcy5nZXRGdW5jdGlvbihoZXhsaWZ5KGRhdGEuc2xpY2UoMCwgNCkpKTtcbiAgICAgICAgaWYgKCFmcmFnbWVudCkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgI
26774H1cbiAgICAgICAgY29uc3QgYXJncyA9IHRoaXMuI2FiaUNvZGVyLmRlY29kZShmcmFnbWVudC5pbnB1dHMsIGRhdGEuc2xpY2UoNCkpO1xuICAgICAgICByZXR1cm4gbmV3IFRyYW5zYWN0aW9uRGVzY3JpcHRpb24oZnJhZ21lbnQsIGZyYWdtZW50LnNlbGVjdG9yLCBhcmdzLCB2YWx1ZSk7XG4gICAgfVxuICAgIHBhcnNlQ2FsbFJlc3VsdChkYXRhKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIkBUT0RPXCIpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiAgUGFyc2VzIGEgcmVjZWlwdCBsb2csIGZpbmRpbmcgdGhlIG1hdGNoaW5nIGV2ZW50IGFuZCBleHRyYWN0c1xuICAgICAqICB0aGUgcGFyYW1ldGVyIHZhbHVlcyBhbG9uZyB3aXRoIG90aGVyIHVzZWZ1bCBldmVudCBkZXRhaWxzLlxuICAgICAqXG4gICAgICogIElmIHRoZSBtYXRjaGluZyBldmVudCBjYW5ub3QgYmUgZm91bmQsIHJldHVybnMgbnVsbC5cbiAgICAgKi9cbiAgICBwYXJzZUxvZyhsb2cpIHtcbiAgICAgICAgY29uc3QgZnJhZ21lbnQgPSB0aGlzLmdldEV2ZW50KGxvZy50b3BpY3NbMF0pO1xuICAgICAgICBpZiAoIWZyYWdtZW50IHx8IGZyYWdtZW50LmFub255bW91cykge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgLy8gQFRPRE86IElmIGFub255bW91cywgYW5kIHRoZSBvbmx5IG1ldGhvZCwgYW5kIHRoZSBpbnB1dCBjb3VudCBtYXRjaGVzLCBzaG91bGQgd2UgcGFyc2U/XG4gICAgICAgIC8vICAgICAgICBQcm9iYWJseSBub3QsIGJlY2F1c2UganVzdCBiZWNhdXNlIGl0IGlzIHRoZSBvbmx5IGV2ZW50IGluIHRoZSBBQkkgZG9lc1xuICAgICAgICAvLyAgICAgICAgbm90IG1lYW4gd2UgaGF2ZSB0aGUgZnVsbCBBQkk7IG1heWJlIGp1c3QgYSBmcmFnbWVudD9cbiAgICAgICAgcmV0dXJuIG5ldyBMb2dEZXNjcmlwdGlvbihmcmFnbWVudCwgZnJhZ21lbnQudG9waWNIYXNoLCB0aGlzLmRlY29kZUV2ZW50TG9nKGZyYWdtZW50LCBsb2cuZGF0YSwgbG9nLnRvcGljcykpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiAgUGFyc2VzIGEgcmV2ZXJ0IGRhdGEsIGZpbmRpbmcgdGhlIG1hdGNoaW5nIGVycm9yIGFuZCBleHRyYWN0c1xuICAgICAqICB0aGUgcGFyYW1ldGVyIHZhbHVlcyBhbG9uZyB3aXRoIG90aGVyIHVzZWZ1bCBlcnJvciBkZXRhaWxzLlxuICAgICAqXG4gICAgICogIElmIHRoZSBtYXRjaGluZyBlcnJvciBjYW5ub3QgYmUgZm91bmQsIHJldHVybnMgbnVsbC5cbiAgICAgKi9cbiAgICBwYXJzZUVycm9yKGRhdGEpIHtcbiAgICAgICAgY29uc3QgaGV4RGF0YSA9IGhleGxpZnkoZGF0YSk7XG4gICAgICAgIGNvbnN0IGZyYWdtZW50ID0gdGhpcy5nZXRFcnJvcihkYXRhU2xpY2UoaGV4RGF0YSwgMCwgNCkpO1xuICAgICAgICBpZiAoIWZyYWdtZW50KSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBhcmdzID0gdGhpcy4jYWJpQ29kZXIuZGVjb2RlKGZyYWdtZW50LmlucHV0cywgZGF0YVNsaWNlKGhleERhdGEsIDQpKTtcbiAgICAgICAgcmV0dXJuIG5ldyBFcnJvckRlc2NyaXB0aW9uKGZyYWdtZW50LCBmcmFnbWVudC5zZWxlY3RvciwgYXJncyk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqICBDcmVhdGVzIGEgbmV3IFtbSW50ZXJmYWNlXV0gZnJvbSB0aGUgQUJJICUldmFsdWUlJS5cbiAgICAgKlxuICAgICAqICBUaGUgJSV2YWx1ZSUlIG1heSBiZSBwcm92aWRlZCBhcyBhbiBleGlzdGluZyBbW0ludGVyZmFjZV1dIG9iamVjdCxcbiAgICAgKiAgYSBKU09OLWVuY29kZWQgQUJJIG9yIGFueSBIdW1hbi1SZWFkYWJsZSBBQkkgZm9ybWF0LlxuICAgICAqL1xuICAgIHN0YXRpYyBmcm9tKHZhbHVlKSB7XG4gICAgICAgIC8vIEFscmVhZHkgYW4gSW50ZXJmYWNlLCB3aGljaCBpcyBpbW11dGFibGVcbiAgICAgICAgaWYgKHZhbHVlIGluc3RhbmNlb2YgSW50ZXJmYWNlKSB7XG4gICAgICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgICAgIH1cbiAgICAgICAgLy8gSlNPTlxuICAgICAgICBpZiAodHlwZW9mICh2YWx1ZSkgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgICAgIHJldHVybiBuZXcgSW50ZXJmYWNlKEpTT04ucGFyc2UodmFsdWUpKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBBbiBJbnRlcmZhY2U7IHBvc3NpYmx5IGZyb20gYW5vdGhlciB2NiBpbnN0YW5jZVxuICAgICAgICBpZiAodHlwZW9mICh2YWx1ZS5mb3JtYXRKc29uKSA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgICAgICByZXR1cm4gbmV3IEludGVyZmFjZSh2YWx1ZS5mb3JtYXRKc29uKCkpO1xuICAgICAgICB9XG4gICAgICAgIC8vIEEgbGVnYWN5IEludGVyZmFjZTsgZnJvbSBhbiBvbGRlciB2ZXJzaW9uXG4gICAgICAgIGlmICh0eXBlb2YgKHZhbHVlLmZvcm1hdCkgPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBJbnRlcmZhY2UodmFsdWUuZm9ybWF0KFwianNvblwiKSk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gQXJyYXkgb2YgZnJhZ21lbnRzXG4gICAgICAgIHJldHVybiBuZXcgSW50ZXJmYWNlKHZhbHVlKTtcbiAgICB9XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1pbnRlcmZhY2UuanMubWFwIiwiLy9pbXBvcnQgeyByZXNvbHZlQWRkcmVzcyB9IGZyb20gXCJAZXRoZXJzcHJvamVjdC9hZGRyZXNzXCI7XG5pbXBvcnQgeyBkZWZpbmVQcm9wZXJ0aWVzLCBnZXRCaWdJbnQsIGdldE51bWJlciwgaGV4bGlmeSwgaXNCeXRlc0xpa2UsIHJlc29sdmVQcm9wZXJ0aWVzLCBhc3NlcnQsIGFzc2VydEFyZ3VtZW50LCBpc0Vycm9yLCBtYWtlRXJyb3IgfSBmcm9tIFwiLi4vdXRpbHMvaW5kZXguanNcIjtcbmltcG9ydCB7IGFjY2Vzc0xpc3RpZnkgfSBmcm9tIFwiLi4vdHJhbnNhY3Rpb24vaW5kZXguanNcIjtcbmNvbnN0IEJOXzAgPSBCaWdJbnQoMCk7XG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuZnVuY3Rpb24gZ2V0VmFsdWUodmFsdWUpIHtcbiAgICBpZiAodmFsdWUgPT0gbnVsbCkge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgcmV0dXJuIHZhbHVlO1xufVxuZnVuY3Rpb24gdG9Kc29uKHZhbHVlKSB7XG4gICAgaWYgKHZhbHVlID09IG51bGwpIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIHJldHVybi
26774B2YWx1ZS50b1N0cmluZygpO1xufVxuLy8gQFRPRE8/IDxUIGV4dGVuZHMgRmVlRGF0YSA9IHsgfT4gaW1wbGVtZW50cyBSZXF1aXJlZDxUPlxuLyoqXG4gKiAgQSAqKkZlZURhdGEqKiB3cmFwcyBhbGwgdGhlIGZlZS1yZWxhdGVkIHZhbHVlcyBhc3NvY2lhdGVkIHdpdGhcbiAqICB0aGUgbmV0d29yay5cbiAqL1xuZXhwb3J0IGNsYXNzIEZlZURhdGEge1xuICAgIC8qKlxuICAgICAqICBUaGUgZ2FzIHByaWNlIGZvciBsZWdhY3kgbmV0d29ya3MuXG4gICAgICovXG4gICAgZ2FzUHJpY2U7XG4gICAgLyoqXG4gICAgICogIFRoZSBtYXhpbXVtIGZlZSB0byBwYXkgcGVyIGdhcy5cbiAgICAgKlxuICAgICAqICBUaGUgYmFzZSBmZWUgcGVyIGdhcyBpcyBkZWZpbmVkIGJ5IHRoZSBuZXR3b3JrIGFuZCBiYXNlZCBvblxuICAgICAqICBjb25nZXN0aW9uLCBpbmNyZWFzaW5nIHRoZSBjb3N0IGR1cmluZyB0aW1lcyBvZiBoZWF2eSBsb2FkXG4gICAgICogIGFuZCBsb3dlcmluZyB3aGVuIGxlc3MgYnVzeS5cbiAgICAgKlxuICAgICAqICBUaGUgYWN0dWFsIGZlZSBwZXIgZ2FzIHdpbGwgYmUgdGhlIGJhc2UgZmVlIGZvciB0aGUgYmxvY2tcbiAgICAgKiAgYW5kIHRoZSBwcmlvcml0eSBmZWUsIHVwIHRvIHRoZSBtYXggZmVlIHBlciBnYXMuXG4gICAgICpcbiAgICAgKiAgVGhpcyB3aWxsIGJlIGBgbnVsbGBgIG9uIGxlZ2FjeSBuZXR3b3JrcyAoaS5lLiBbcHJlLUVJUC0xNTU5XShsaW5rLWVpcC0xNTU5KSlcbiAgICAgKi9cbiAgICBtYXhGZWVQZXJHYXM7XG4gICAgLyoqXG4gICAgICogIFRoZSBhZGRpdGlvbmFsIGFtb3V0IHRvIHBheSBwZXIgZ2FzIHRvIGVuY291cmFnZSBhIHZhbGlkYXRvclxuICAgICAqICB0byBpbmNsdWRlIHRoZSB0cmFuc2FjdGlvbi5cbiAgICAgKlxuICAgICAqICBUaGUgcHVycG9zZSBvZiB0aGlzIGlzIHRvIGNvbXBlbnNhdGUgdGhlIHZhbGlkYXRvciBmb3IgdGhlXG4gICAgICogIGFkanVzdGVkIHJpc2sgZm9yIGluY2x1ZGluZyBhIGdpdmVuIHRyYW5zYWN0aW9uLlxuICAgICAqXG4gICAgICogIFRoaXMgd2lsbCBiZSBgYG51bGxgYCBvbiBsZWdhY3kgbmV0d29ya3MgKGkuZS4gW3ByZS1FSVAtMTU1OV0obGluay1laXAtMTU1OSkpXG4gICAgICovXG4gICAgbWF4UHJpb3JpdHlGZWVQZXJHYXM7XG4gICAgLyoqXG4gICAgICogIENyZWF0ZXMgYSBuZXcgRmVlRGF0YSBmb3IgJSVnYXNQcmljZSUlLCAlJW1heEZlZVBlckdhcyUlIGFuZFxuICAgICAqICAlJW1heFByaW9yaXR5RmVlUGVyR2FzJSUuXG4gICAgICovXG4gICAgY29uc3RydWN0b3IoZ2FzUHJpY2UsIG1heEZlZVBlckdhcywgbWF4UHJpb3JpdHlGZWVQZXJHYXMpIHtcbiAgICAgICAgZGVmaW5lUHJvcGVydGllcyh0aGlzLCB7XG4gICAgICAgICAgICBnYXNQcmljZTogZ2V0VmFsdWUoZ2FzUHJpY2UpLFxuICAgICAgICAgICAgbWF4RmVlUGVyR2FzOiBnZXRWYWx1ZShtYXhGZWVQZXJHYXMpLFxuICAgICAgICAgICAgbWF4UHJpb3JpdHlGZWVQZXJHYXM6IGdldFZhbHVlKG1heFByaW9yaXR5RmVlUGVyR2FzKVxuICAgICAgICB9KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogIFJldHVybnMgYSBKU09OLWZyaWVuZGx5IHZhbHVlLlxuICAgICAqL1xuICAgIHRvSlNPTigpIHtcbiAgICAgICAgY29uc3QgeyBnYXNQcmljZSwgbWF4RmVlUGVyR2FzLCBtYXhQcmlvcml0eUZlZVBlckdhcyB9ID0gdGhpcztcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIF90eXBlOiBcIkZlZURhdGFcIixcbiAgICAgICAgICAgIGdhc1ByaWNlOiB0b0pzb24oZ2FzUHJpY2UpLFxuICAgICAgICAgICAgbWF4RmVlUGVyR2FzOiB0b0pzb24obWF4RmVlUGVyR2FzKSxcbiAgICAgICAgICAgIG1heFByaW9yaXR5RmVlUGVyR2FzOiB0b0pzb24obWF4UHJpb3JpdHlGZWVQZXJHYXMpLFxuICAgICAgICB9O1xuICAgIH1cbn1cbjtcbi8qKlxuICogIFJldHVybnMgYSBjb3B5IG9mICUlcmVxJSUgd2l0aCBhbGwgcHJvcGVydGllcyBjb2VyY2VkIHRvIHRoZWlyIHN0cmljdFxuICogIHR5cGVzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gY29weVJlcXVlc3QocmVxKSB7XG4gICAgY29uc3QgcmVzdWx0ID0ge307XG4gICAgLy8gVGhlc2UgY291bGQgYmUgYWRkcmVzc2VzLCBFTlMgbmFtZXMgb3IgQWRkcmVzc2FibGVzXG4gICAgaWYgKHJlcS50bykge1xuICAgICAgICByZXN1bHQudG8gPSByZXEudG87XG4gICAgfVxuICAgIGlmIChyZXEuZnJvbSkge1xuICAgICAgICByZXN1bHQuZnJvbSA9IHJlcS5mcm9tO1xuICAgIH1cbiAgICBpZiAocmVxLmRhdGEpIHtcbiAgICAgICAgcmVzdWx0LmRhdGEgPSBoZXhsaWZ5KHJlcS5kYXRhKTtcbiAgICB9XG4gICAgY29uc3QgYmlnSW50S2V5cyA9IFwiY2hhaW5JZCxnYXNMaW1pdCxnYXNQcmljZSxtYXhGZWVQZXJCbG9iR2FzLG1heEZlZVBlckdhcyxtYXhQcmlvcml0eUZlZVBlckdhcyx2YWx1ZVwiLnNwbGl0KC8sLyk7XG4gICAgZm9yIChjb25zdCBrZXkgb2YgYmlnSW50S2V5cykge1xuICAgICAgICBpZiAoIShrZXkgaW4gcmVxKSB8fCByZXFba2V5XSA9PSBudWxsKSB7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICByZXN1bHRba2V5XSA9IGdldEJpZ0ludChyZXFba2V5XSwgYHJlcXVlc3QuJHtrZXl9YCk7XG4gICAgfVxuICAgIGNvbnN0IG51bWJlcktleXMgPSBcInR5cGUsbm9uY2VcIi5zcGxpdCgvLC8pO1xuICAgIGZvciAoY29uc3Qga2V5IG9mIG51bWJlcktleXMpIHtcbiAgICAgICAgaWYgKCEoa2V5IGluIHJlcSkgfHwgcmVxW2tleV0gPT0gbnVsbCkge1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgcmVzdWx0W2tleV0gPSBnZXROdW1iZXIocmVxW2tleV0sIGByZXF1ZXN0LiR7a2V5fWApO1xuICAgIH1cbiAgICBpZiAocmVxLmFjY2Vzc0xpc3QpIHtcbiAgICAgICAgcmVzdWx0LmFjY2Vzc0xpc3QgPSBhY2Nlc3NMaXN0aWZ5KHJlcS5hY2Nlc3NMaXN0KTtcbiAgICB9XG4gICAgaWYgKHJlcS5hdXRob3JpemF0aW9uTGlzdCkge1xuICAgICAgICByZXN1bHQuYXV0aG9yaXphdGlvbkxpc3QgPSByZXEuYXV0aG9yaXphdGlvbkxpc3Quc2xpY2UoKTtcbiAgICB9XG4gICAgaWYgKFwiYmxvY2tUYWdcIiBpbiByZXEpIHtcbiAgICAgICAgcmVzdWx0LmJsb2NrVGFnID0gcmVxLmJsb2NrVGFnO1xuICAgIH1cbiAgICBpZiAoXCJlbmFibGVDY2lwUmVhZFwiIGluIHJlcSkge1xuICAgICAgICByZXN1bHQuZW5hYmxlQ2NpcFJlYWQgPSAhIXJlcS5lbmFibGVDY2lwUmVhZDtcbiAgICB9XG4gICAgaWYgKFwiY3VzdG9tRGF0YVwiIGluIHJlcSkge1xuICAgICAgICByZXN1bHQuY3VzdG9tRGF0YSA9IHJlcS5jdXN0b21EYXRhO1xuICAgIH1cbiAgICBpZiAoXCJibG9iVmVyc2lvbmVkSGFzaGVzXCIgaW4gcmVxICYmIHJlcS5ibG9iVmVyc2lvbmVkSGFzaGVzKSB7XG4gICAgICAgI
26774HJlc3VsdC5ibG9iVmVyc2lvbmVkSGFzaGVzID0gcmVxLmJsb2JWZXJzaW9uZWRIYXNoZXMuc2xpY2UoKTtcbiAgICB9XG4gICAgaWYgKFwia3pnXCIgaW4gcmVxKSB7XG4gICAgICAgIHJlc3VsdC5remcgPSByZXEua3pnO1xuICAgIH1cbiAgICBpZiAoXCJibG9iV3JhcHBlclZlcnNpb25cIiBpbiByZXEpIHtcbiAgICAgICAgcmVzdWx0LmJsb2JXcmFwcGVyVmVyc2lvbiA9IHJlcS5ibG9iV3JhcHBlclZlcnNpb247XG4gICAgfVxuICAgIGlmIChcImJsb2JzXCIgaW4gcmVxICYmIHJlcS5ibG9icykge1xuICAgICAgICByZXN1bHQuYmxvYnMgPSByZXEuYmxvYnMubWFwKChiKSA9PiB7XG4gICAgICAgICAgICBpZiAoaXNCeXRlc0xpa2UoYikpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gaGV4bGlmeShiKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBPYmplY3QuYXNzaWduKHt9LCBiKTtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG59XG4vKipcbiAqICBBICoqQmxvY2sqKiByZXByZXNlbnRzIHRoZSBkYXRhIGFzc29jaWF0ZWQgd2l0aCBhIGZ1bGwgYmxvY2sgb25cbiAqICBFdGhlcmV1bS5cbiAqL1xuZXhwb3J0IGNsYXNzIEJsb2NrIHtcbiAgICAvKipcbiAgICAgKiAgVGhlIHByb3ZpZGVyIGNvbm5lY3RlZCB0byB0aGUgYmxvY2sgdXNlZCB0byBmZXRjaCBhZGRpdGlvbmFsIGRldGFpbHNcbiAgICAgKiAgaWYgbmVjZXNzYXJ5LlxuICAgICAqL1xuICAgIHByb3ZpZGVyO1xuICAgIC8qKlxuICAgICAqICBUaGUgYmxvY2sgbnVtYmVyLCBzb21ldGltZXMgY2FsbGVkIHRoZSBibG9jayBoZWlnaHQuIFRoaXMgaXMgYVxuICAgICAqICBzZXF1ZW50aWFsIG51bWJlciB0aGF0IGlzIG9uZSBoaWdoZXIgdGhhbiB0aGUgcGFyZW50IGJsb2NrLlxuICAgICAqL1xuICAgIG51bWJlcjtcbiAgICAvKipcbiAgICAgKiAgVGhlIGJsb2NrIGhhc2guXG4gICAgICpcbiAgICAgKiAgVGhpcyBoYXNoIGluY2x1ZGVzIGFsbCBwcm9wZXJ0aWVzLCBzbyBjYW4gYmUgc2FmZWx5IHVzZWQgdG8gaWRlbnRpZnlcbiAgICAgKiAgYW4gZXhhY3Qgc2V0IG9mIGJsb2NrIHByb3BlcnRpZXMuXG4gICAgICovXG4gICAgaGFzaDtcbiAgICAvKipcbiAgICAgKiAgVGhlIHRpbWVzdGFtcCBmb3IgdGhpcyBibG9jaywgd2hpY2ggaXMgdGhlIG51bWJlciBvZiBzZWNvbmRzIHNpbmNlXG4gICAgICogIGVwb2NoIHRoYXQgdGhpcyBibG9jayB3YXMgaW5jbHVkZWQuXG4gICAgICovXG4gICAgdGltZXN0YW1wO1xuICAgIC8qKlxuICAgICAqICBUaGUgYmxvY2sgaGFzaCBvZiB0aGUgcGFyZW50IGJsb2NrLlxuICAgICAqL1xuICAgIHBhcmVudEhhc2g7XG4gICAgLyoqXG4gICAgICogIFRoZSBoYXNoIHRyZWUgcm9vdCBvZiB0aGUgcGFyZW50IGJlYWNvbiBibG9jayBmb3IgdGhlIGdpdmVuXG4gICAgICogIGV4ZWN1dGlvbiBibG9jay4gU2VlIFtbbGluay1laXAtNDc4OF1dLlxuICAgICAqL1xuICAgIHBhcmVudEJlYWNvbkJsb2NrUm9vdDtcbiAgICAvKipcbiAgICAgKiAgVGhlIG5vbmNlLlxuICAgICAqXG4gICAgICogIE9uIGxlZ2FjeSBuZXR3b3JrcywgdGhpcyBpcyB0aGUgcmFuZG9tIG51bWJlciBpbnNlcnRlZCB3aGljaFxuICAgICAqICBwZXJtaXR0ZWQgdGhlIGRpZmZpY3VsdHkgdGFyZ2V0IHRvIGJlIHJlYWNoZWQuXG4gICAgICovXG4gICAgbm9uY2U7XG4gICAgLyoqXG4gICAgICogIFRoZSBkaWZmaWN1bHR5IHRhcmdldC5cbiAgICAgKlxuICAgICAqICBPbiBsZWdhY3kgbmV0d29ya3MsIHRoaXMgaXMgdGhlIHByb29mLW9mLXdvcmsgdGFyZ2V0IHJlcXVpcmVkXG4gICAgICogIGZvciBhIGJsb2NrIHRvIG1lZXQgdGhlIHByb3RvY29sIHJ1bGVzIHRvIGJlIGluY2x1ZGVkLlxuICAgICAqXG4gICAgICogIE9uIG1vZGVybiBuZXR3b3JrcywgdGhpcyBpcyBhIHJhbmRvbSBudW1iZXIgYXJyaXZlZCBhdCB1c2luZ1xuICAgICAqICByYW5kYW8uICBAVE9ETzogRmluZCBsaW5rcz9cbiAgICAgKi9cbiAgICBkaWZmaWN1bHR5O1xuICAgIC8qKlxuICAgICAqICBUaGUgdG90YWwgZ2FzIGxpbWl0IGZvciB0aGlzIGJsb2NrLlxuICAgICAqL1xuICAgIGdhc0xpbWl0O1xuICAgIC8qKlxuICAgICAqICBUaGUgdG90YWwgZ2FzIHVzZWQgaW4gdGhpcyBibG9jay5cbiAgICAgKi9cbiAgICBnYXNVc2VkO1xuICAgIC8qKlxuICAgICAqICBUaGUgcm9vdCBoYXNoIGZvciB0aGUgZ2xvYmFsIHN0YXRlIGFmdGVyIGFwcGx5aW5nIGNoYW5nZXNcbiAgICAgKiAgaW4gdGhpcyBibG9jay5cbiAgICAgKi9cbiAgICBzdGF0ZVJvb3Q7XG4gICAgLyoqXG4gICAgICogIFRoZSBoYXNoIG9mIHRoZSB0cmFuc2FjdGlvbiByZWNlaXB0cyB0cmllLlxuICAgICAqL1xuICAgIHJlY2VpcHRzUm9vdDtcbiAgICAvKipcbiAgICAgKiAgVGhlIGhhc2ggb2YgdGhlIHRyYW5zYWN0aW9ucy5cbiAgICAgKi9cbiAgICB0cmFuc2FjdGlvbnNSb290O1xuICAgIC8qKlxuICAgICAqICBUaGUgdG90YWwgYW1vdW50IG9mIGJsb2IgZ2FzIGNvbnN1bWVkIGJ5IHRoZSB0cmFuc2FjdGlvbnNcbiAgICAgKiAgd2l0aGluIHRoZSBibG9jay4gU2VlIFtbbGluay1laXAtNDg0NF1dLlxuICAgICAqL1xuICAgIGJsb2JHYXNVc2VkO1xuICAgIC8qKlxuICAgICAqICBUaGUgcnVubmluZyB0b3RhbCBvZiBibG9iIGdhcyBjb25zdW1lZCBpbiBleGNlc3Mgb2YgdGhlXG4gICAgICogIHRhcmdldCwgcHJpb3IgdG8gdGhlIGJsb2NrLiBTZWUgW1tsaW5rLWVpcC00ODQ0XV0uXG4gICAgICovXG4gICAgZXhjZXNzQmxvYkdhcztcbiAgICAvKipcbiAgICAgKiAgVGhlIG1pbmVyIGNvaW5iYXNlIGFkZHJlc3MsIHdpaGNoIHJlY2VpdmVzIGFueSBzdWJzaWRpZXMgZm9yXG4gICAgICogIGluY2x1ZGluZyB0aGlzIGJsb2NrLlxuICAgICAqL1xuICAgIG1pbmVyO1xuICAgIC8qKlxuICAgICAqICBUaGUgbGF0ZXN0IFJBTkRBTyBtaXggb2YgdGhlIHBvc3QgYmVhY29uIHN0YXRlIG9mXG4gICAgICogIHRoZSBwcmV2aW91cyBibG9jay5cbiAgICAgKi9cbiAgICBwcmV2UmFuZGFvO1xuICAgIC8qKlxuICAgICAqICBBbnkgZXh0cmEgZGF0YSB0aGUgdmFsaWRhdG9yIHdpc2hlZCB0byBpbmNsdWRlLlxuICAgICAqL1xuICAgIGV4dHJhRGF0YTtcbiAgICAvKipcbiAgICAgKiAgVGhlIGJhc2UgZmVlIHBlciBnYXMgdGh
26774hdCBhbGwgdHJhbnNhY3Rpb25zIGluIHRoaXMgYmxvY2sgd2VyZVxuICAgICAqICBjaGFyZ2VkLlxuICAgICAqXG4gICAgICogIFRoaXMgYWRqdXN0cyBhZnRlciBlYWNoIGJsb2NrLCBkZXBlbmRpbmcgb24gaG93IGNvbmdlc3RlZCB0aGUgbmV0d29ya1xuICAgICAqICBpcy5cbiAgICAgKi9cbiAgICBiYXNlRmVlUGVyR2FzO1xuICAgICN0cmFuc2FjdGlvbnM7XG4gICAgLyoqXG4gICAgICogIENyZWF0ZSBhIG5ldyAqKkJsb2NrKiogb2JqZWN0LlxuICAgICAqXG4gICAgICogIFRoaXMgc2hvdWxkIGdlbmVyYWxseSBub3QgYmUgbmVjZXNzYXJ5IGFzIHRoZSB1bmxlc3MgaW1wbGVtZW50aW5nIGFcbiAgICAgKiAgbG93LWxldmVsIGxpYnJhcnkuXG4gICAgICovXG4gICAgY29uc3RydWN0b3IoYmxvY2ssIHByb3ZpZGVyKSB7XG4gICAgICAgIHRoaXMuI3RyYW5zYWN0aW9ucyA9IGJsb2NrLnRyYW5zYWN0aW9ucy5tYXAoKHR4KSA9PiB7XG4gICAgICAgICAgICBpZiAodHlwZW9mICh0eCkgIT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFRyYW5zYWN0aW9uUmVzcG9uc2UodHgsIHByb3ZpZGVyKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB0eDtcbiAgICAgICAgfSk7XG4gICAgICAgIGRlZmluZVByb3BlcnRpZXModGhpcywge1xuICAgICAgICAgICAgcHJvdmlkZXIsXG4gICAgICAgICAgICBoYXNoOiBnZXRWYWx1ZShibG9jay5oYXNoKSxcbiAgICAgICAgICAgIG51bWJlcjogYmxvY2subnVtYmVyLFxuICAgICAgICAgICAgdGltZXN0YW1wOiBibG9jay50aW1lc3RhbXAsXG4gICAgICAgICAgICBwYXJlbnRIYXNoOiBibG9jay5wYXJlbnRIYXNoLFxuICAgICAgICAgICAgcGFyZW50QmVhY29uQmxvY2tSb290OiBibG9jay5wYXJlbnRCZWFjb25CbG9ja1Jvb3QsXG4gICAgICAgICAgICBub25jZTogYmxvY2subm9uY2UsXG4gICAgICAgICAgICBkaWZmaWN1bHR5OiBibG9jay5kaWZmaWN1bHR5LFxuICAgICAgICAgICAgZ2FzTGltaXQ6IGJsb2NrLmdhc0xpbWl0LFxuICAgICAgICAgICAgZ2FzVXNlZDogYmxvY2suZ2FzVXNlZCxcbiAgICAgICAgICAgIGJsb2JHYXNVc2VkOiBibG9jay5ibG9iR2FzVXNlZCxcbiAgICAgICAgICAgIGV4Y2Vzc0Jsb2JHYXM6IGJsb2NrLmV4Y2Vzc0Jsb2JHYXMsXG4gICAgICAgICAgICBtaW5lcjogYmxvY2subWluZXIsXG4gICAgICAgICAgICBwcmV2UmFuZGFvOiBnZXRWYWx1ZShibG9jay5wcmV2UmFuZGFvKSxcbiAgICAgICAgICAgIGV4dHJhRGF0YTogYmxvY2suZXh0cmFEYXRhLFxuICAgICAgICAgICAgYmFzZUZlZVBlckdhczogZ2V0VmFsdWUoYmxvY2suYmFzZUZlZVBlckdhcyksXG4gICAgICAgICAgICBzdGF0ZVJvb3Q6IGJsb2NrLnN0YXRlUm9vdCxcbiAgICAgICAgICAgIHJlY2VpcHRzUm9vdDogYmxvY2sucmVjZWlwdHNSb290LFxuICAgICAgICAgICAgdHJhbnNhY3Rpb25zUm9vdDogYmxvY2sudHJhbnNhY3Rpb25zUm9vdCxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqICBSZXR1cm5zIHRoZSBsaXN0IG9mIHRyYW5zYWN0aW9uIGhhc2hlcywgaW4gdGhlIG9yZGVyXG4gICAgICogIHRoZXkgd2VyZSBleGVjdXRlZCB3aXRoaW4gdGhlIGJsb2NrLlxuICAgICAqL1xuICAgIGdldCB0cmFuc2FjdGlvbnMoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLiN0cmFuc2FjdGlvbnMubWFwKCh0eCkgPT4ge1xuICAgICAgICAgICAgaWYgKHR5cGVvZiAodHgpID09PSBcInN0cmluZ1wiKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHR4O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHR4Lmhhc2g7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiAgUmV0dXJucyB0aGUgY29tcGxldGUgdHJhbnNhY3Rpb25zLCBpbiB0aGUgb3JkZXIgdGhleVxuICAgICAqICB3ZXJlIGV4ZWN1dGVkIHdpdGhpbiB0aGUgYmxvY2suXG4gICAgICpcbiAgICAgKiAgVGhpcyBpcyBvbmx5IGF2YWlsYWJsZSBmb3IgYmxvY2tzIHdoaWNoIHByZWZldGNoZWRcbiAgICAgKiAgdHJhbnNhY3Rpb25zLCBieSBwYXNzaW5nIGBgdHJ1ZWBgIHRvICUlcHJlZmV0Y2hUeHMlJVxuICAgICAqICBpbnRvIFtbUHJvdmlkZXItZ2V0QmxvY2tdXS5cbiAgICAgKi9cbiAgICBnZXQgcHJlZmV0Y2hlZFRyYW5zYWN0aW9ucygpIHtcbiAgICAgICAgY29uc3QgdHhzID0gdGhpcy4jdHJhbnNhY3Rpb25zLnNsaWNlKCk7XG4gICAgICAgIC8vIERvZXNuJ3QgbWF0dGVyLi4uXG4gICAgICAgIGlmICh0eHMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICByZXR1cm4gW107XG4gICAgICAgIH1cbiAgICAgICAgLy8gTWFrZSBzdXJlIHdlIHByZWZldGNoZWQgdGhlIHRyYW5zYWN0aW9uc1xuICAgICAgICBhc3NlcnQodHlwZW9mICh0eHNbMF0pID09PSBcIm9iamVjdFwiLCBcInRyYW5zYWN0aW9ucyB3ZXJlIG5vdCBwcmVmZXRjaGVkIHdpdGggYmxvY2sgcmVxdWVzdFwiLCBcIlVOU1VQUE9SVEVEX09QRVJBVElPTlwiLCB7XG4gICAgICAgICAgICBvcGVyYXRpb246IFwidHJhbnNhY3Rpb25SZXNwb25zZXMoKVwiXG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gdHhzO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiAgUmV0dXJucyBhIEpTT04tZnJpZW5kbHkgdmFsdWUuXG4gICAgICovXG4gICAgdG9KU09OKCkge1xuICAgICAgICBjb25zdCB7IGJhc2VGZWVQZXJHYXMsIGRpZmZpY3VsdHksIGV4dHJhRGF0YSwgZ2FzTGltaXQsIGdhc1VzZWQsIGhhc2gsIG1pbmVyLCBwcmV2UmFuZGFvLCBub25jZSwgbnVtYmVyLCBwYXJlbnRIYXNoLCBwYXJlbnRCZWFjb25CbG9ja1Jvb3QsIHN0YXRlUm9vdCwgcmVjZWlwdHNSb290LCB0cmFuc2FjdGlvbnNSb290LCB0aW1lc3RhbXAsIHRyYW5zYWN0aW9ucyB9ID0gdGhpcztcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIF90eXBlOiBcIkJsb2NrXCIsXG4gICAgICAgICAgICBiYXNlRmVlUGVyR2FzOiB0b0pzb24oYmFzZUZlZVBlckdhcyksXG4gICAgICAgICAgICBkaWZmaWN1bHR5OiB0b0pzb24oZGlmZmljdWx0eSksXG4gICAgICAgICAgICBleHRyYURhdGEsXG4gICAgICAgICAgICBnYXNMaW1pdDogdG9Kc29uKGdhc0xpbWl0KSxcbiAgICAgICAgICAgIGdhc1VzZWQ6IHRvSnNvbihnYXNVc2VkKSxcbiAgICAgICAgICAgIGJsb2JHYXNVc2VkOiB0b0pzb24odGhpcy5ibG9iR2FzVXNlZCksXG4gICAgICAgICAgICBleGNlc3NCbG9iR2FzOiB0b0pzb24odGhpcy5leGNlc3NCbG9iR2FzKSxcbiAgICAgICAgICAgIGhhc2gsIG1pbmVyLCBwcmV2UmFuZGFvLCBub25jZSwgbnVtYmVyLCBwYXJlbnRIYXNoLCB0aW1lc3RhbXAsXG4gICAgICAgICAgICBwYXJlbnRCZWFjb25CbG9ja1Jvb3QsIHN0YXRlUm9vdCwgcmVjZWlwdHNSb290LCB0cmFuc2FjdGlvbnNSb290LFxuICAgICAgICAgICAgdHJhbnNhY3Rpb25zLFxuICAgICAgICB9O1xuICAgIH1cbiAgICBbU3ltYm9sLml0ZXJhdG9yXSgpIHtcbiAgICAgICAgbGV0IGluZGV4ID0gMDtcbiAgICAgICAgY29uc3QgdHhzID0gdGhpcy50cmFuc2FjdGlvbnM7XG4gICAgICAgI
26774HJldHVybiB7XG4gICAgICAgICAgICBuZXh0OiAoKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKGluZGV4IDwgdGhpcy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiB0eHNbaW5kZXgrK10sIGRvbmU6IGZhbHNlXG4gICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiB7IHZhbHVlOiB1bmRlZmluZWQsIGRvbmU6IHRydWUgfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogIFRoZSBudW1iZXIgb2YgdHJhbnNhY3Rpb25zIGluIHRoaXMgYmxvY2suXG4gICAgICovXG4gICAgZ2V0IGxlbmd0aCgpIHsgcmV0dXJuIHRoaXMuI3RyYW5zYWN0aW9ucy5sZW5ndGg7IH1cbiAgICAvKipcbiAgICAgKiAgVGhlIFtbbGluay1qcy1kYXRlXV0gdGhpcyBibG9jayB3YXMgaW5jbHVkZWQgYXQuXG4gICAgICovXG4gICAgZ2V0IGRhdGUoKSB7XG4gICAgICAgIGlmICh0aGlzLnRpbWVzdGFtcCA9PSBudWxsKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbmV3IERhdGUodGhpcy50aW1lc3RhbXAgKiAxMDAwKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogIEdldCB0aGUgdHJhbnNhY3Rpb24gYXQgJSVpbmRleGUlJSB3aXRoaW4gdGhpcyBibG9jay5cbiAgICAgKi9cbiAgICBhc3luYyBnZXRUcmFuc2FjdGlvbihpbmRleE9ySGFzaCkge1xuICAgICAgICAvLyBGaW5kIHRoZSBpbnRlcm5hbCB2YWx1ZSBieSBpdHMgaW5kZXggb3IgaGFzaFxuICAgICAgICBsZXQgdHggPSB1bmRlZmluZWQ7XG4gICAgICAgIGlmICh0eXBlb2YgKGluZGV4T3JIYXNoKSA9PT0gXCJudW1iZXJcIikge1xuICAgICAgICAgICAgdHggPSB0aGlzLiN0cmFuc2FjdGlvbnNbaW5kZXhPckhhc2hdO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgY29uc3QgaGFzaCA9IGluZGV4T3JIYXNoLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IHYgb2YgdGhpcy4jdHJhbnNhY3Rpb25zKSB7XG4gICAgICAgICAgICAgICAgaWYgKHR5cGVvZiAodikgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHYgIT09IGhhc2gpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHR4ID0gdjtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBpZiAodi5oYXNoICE9PSBoYXNoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB0eCA9IHY7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAodHggPT0gbnVsbCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwibm8gc3VjaCB0eFwiKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mICh0eCkgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgICAgIHJldHVybiAoYXdhaXQgdGhpcy5wcm92aWRlci5nZXRUcmFuc2FjdGlvbih0eCkpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIHR4O1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqICBJZiBhICoqQmxvY2sqKiB3YXMgZmV0Y2hlZCB3aXRoIGEgcmVxdWVzdCB0byBpbmNsdWRlIHRoZSB0cmFuc2FjdGlvbnNcbiAgICAgKiAgdGhpcyB3aWxsIGFsbG93IHN5bmNocm9ub3VzIGFjY2VzcyB0byB0aG9zZSB0cmFuc2FjdGlvbnMuXG4gICAgICpcbiAgICAgKiAgSWYgdGhlIHRyYW5zYWN0aW9ucyB3ZXJlIG5vdCBwcmVmZXRjaGVkLCB0aGlzIHdpbGwgdGhyb3cuXG4gICAgICovXG4gICAgZ2V0UHJlZmV0Y2hlZFRyYW5zYWN0aW9uKGluZGV4T3JIYXNoKSB7XG4gICAgICAgIGNvbnN0IHR4cyA9IHRoaXMucHJlZmV0Y2hlZFRyYW5zYWN0aW9ucztcbiAgICAgICAgaWYgKHR5cGVvZiAoaW5kZXhPckhhc2gpID09PSBcIm51bWJlclwiKSB7XG4gICAgICAgICAgICByZXR1cm4gdHhzW2luZGV4T3JIYXNoXTtcbiAgICAgICAgfVxuICAgICAgICBpbmRleE9ySGFzaCA9IGluZGV4T3JIYXNoLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgIGZvciAoY29uc3QgdHggb2YgdHhzKSB7XG4gICAgICAgICAgICBpZiAodHguaGFzaCA9PT0gaW5kZXhPckhhc2gpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdHg7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgYXNzZXJ0QXJndW1lbnQoZmFsc2UsIFwibm8gbWF0Y2hpbmcgdHJhbnNhY3Rpb25cIiwgXCJpbmRleE9ySGFzaFwiLCBpbmRleE9ySGFzaCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqICBSZXR1cm5zIHRydWUgaWYgdGhpcyBibG9jayBiZWVuIG1pbmVkLiBUaGlzIHByb3ZpZGVzIGEgdHlwZSBndWFyZFxuICAgICAqICBmb3IgYWxsIHByb3BlcnRpZXMgb24gYSBbW01pbmVkQmxvY2tdXS5cbiAgICAgKi9cbiAgICBpc01pbmVkKCkgeyByZXR1cm4gISF0aGlzLmhhc2g7IH1cbiAgICAvKipcbiAgICAgKiAgUmV0dXJucyB0cnVlIGlmIHRoaXMgYmxvY2sgaXMgYW4gW1tsaW5rLWVpcC0yOTMwXV0gYmxvY2suXG4gICAgICovXG4gICAgaXNMb25kb24oKSB7XG4gICAgICAgIHJldHVybiAhIXRoaXMuYmFzZUZlZVBlckdhcztcbiAgICB9XG4gICAgLyoqXG4gICAgICogIEBfaWdub3JlOlxuICAgICAqL1xuICAgIG9ycGhhbmVkRXZlbnQoKSB7XG4gICAgICAgIGlmICghdGhpcy5pc01pbmVkKCkpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlwiKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gY3JlYXRlT3JwaGFuZWRCbG9ja0ZpbHRlcih0aGlzKTtcbiAgICB9XG59XG4vLy8vLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyB
26774Mb2dcbi8qKlxuICogIEEgKipMb2cqKiBpbiBFdGhlcmV1bSByZXByZXNlbnRzIGFuIGV2ZW50IHRoYXQgaGFzIGJlZW4gaW5jbHVkZWQgaW4gYVxuICogIHRyYW5zYWN0aW9uIHVzaW5nIHRoZSBgYExPRypgYCBvcGNvZGVzLCB3aGljaCBhcmUgbW9zdCBjb21tb25seSB1c2VkIGJ5XG4gKiAgU29saWRpdHkncyBlbWl0IGZvciBhbm5vdW5jaW5nIGV2ZW50cy5cbiAqL1xuZXhwb3J0IGNsYXNzIExvZyB7XG4gICAgLyoqXG4gICAgICogIFRoZSBwcm92aWRlciBjb25uZWN0ZWQgdG8gdGhlIGxvZyB1c2VkIHRvIGZldGNoIGFkZGl0aW9uYWwgZGV0YWlsc1xuICAgICAqICBpZiBuZWNlc3NhcnkuXG4gICAgICovXG4gICAgcHJvdmlkZXI7XG4gICAgLyoqXG4gICAgICogIFRoZSB0cmFuc2FjdGlvbiBoYXNoIG9mIHRoZSB0cmFuc2FjdGlvbiB0aGlzIGxvZyBvY2N1cnJlZCBpbi4gVXNlIHRoZVxuICAgICAqICBbW0xvZy1nZXRUcmFuc2FjdGlvbl1dIHRvIGdldCB0aGUgW1tUcmFuc2FjdGlvblJlc3BvbnNlXV0uXG4gICAgICovXG4gICAgdHJhbnNhY3Rpb25IYXNoO1xuICAgIC8qKlxuICAgICAqICBUaGUgYmxvY2sgaGFzaCBvZiB0aGUgYmxvY2sgdGhpcyBsb2cgb2NjdXJyZWQgaW4uIFVzZSB0aGVcbiAgICAgKiAgW1tMb2ctZ2V0QmxvY2tdXSB0byBnZXQgdGhlIFtbQmxvY2tdXS5cbiAgICAgKi9cbiAgICBibG9ja0hhc2g7XG4gICAgLyoqXG4gICAgICogIFRoZSBibG9jayBudW1iZXIgb2YgdGhlIGJsb2NrIHRoaXMgbG9nIG9jY3VycmVkIGluLiBJdCBpcyBwcmVmZXJyZWRcbiAgICAgKiAgdG8gdXNlIHRoZSBbW0Jsb2NrLWhhc2hdXSB3aGVuIGZldGNoaW5nIHRoZSByZWxhdGVkIFtbQmxvY2tdXSxcbiAgICAgKiAgc2luY2UgaW4gdGhlIGNhc2Ugb2YgYW4gb3JwaGFuZWQgYmxvY2ssIHRoZSBibG9jayBhdCB0aGF0IGhlaWdodCBtYXlcbiAgICAgKiAgaGF2ZSBjaGFuZ2VkLlxuICAgICAqL1xuICAgIGJsb2NrTnVtYmVyO1xuICAgIC8qKlxuICAgICAqICBJZiB0aGUgKipMb2cqKiByZXByZXNlbnRzIGEgYmxvY2sgdGhhdCB3YXMgcmVtb3ZlZCBkdWUgdG8gYW4gb3JwaGFuZWRcbiAgICAgKiAgYmxvY2ssIHRoaXMgd2lsbCBiZSB0cnVlLlxuICAgICAqXG4gICAgICogIFRoaXMgY2FuIG9ubHkgaGFwcGVuIHdpdGhpbiBhbiBvcnBoYW4gZXZlbnQgbGlzdGVuZXIuXG4gICAgICovXG4gICAgcmVtb3ZlZDtcbiAgICAvKipcbiAgICAgKiAgVGhlIGFkZHJlc3Mgb2YgdGhlIGNvbnRyYWN0IHRoYXQgZW1pdHRlZCB0aGlzIGxvZy5cbiAgICAgKi9cbiAgICBhZGRyZXNzO1xuICAgIC8qKlxuICAgICAqICBUaGUgZGF0YSBpbmNsdWRlZCBpbiB0aGlzIGxvZyB3aGVuIGl0IHdhcyBlbWl0dGVkLlxuICAgICAqL1xuICAgIGRhdGE7XG4gICAgLyoqXG4gICAgICogIFRoZSBpbmRleGVkIHRvcGljcyBpbmNsdWRlZCBpbiB0aGlzIGxvZyB3aGVuIGl0IHdhcyBlbWl0dGVkLlxuICAgICAqXG4gICAgICogIEFsbCB0b3BpY3MgYXJlIGluY2x1ZGVkIGluIHRoZSBibG9vbSBmaWx0ZXJzLCBzbyB0aGV5IGNhbiBiZVxuICAgICAqICBlZmZpY2llbnRseSBmaWx0ZXJlZCB1c2luZyB0aGUgW1tQcm92aWRlci1nZXRMb2dzXV0gbWV0aG9kLlxuICAgICAqL1xuICAgIHRvcGljcztcbiAgICAvKipcbiAgICAgKiAgVGhlIGluZGV4IHdpdGhpbiB0aGUgYmxvY2sgdGhpcyBsb2cgb2NjdXJyZWQgYXQuIFRoaXMgaXMgZ2VuZXJhbGx5XG4gICAgICogIG5vdCB1c2VmdWwgdG8gZGV2ZWxvcGVycywgYnV0IGNhbiBiZSB1c2VkIHdpdGggdGhlIHZhcmlvdXMgcm9vdHNcbiAgICAgKiAgdG8gcHJvb2YgaW5jbHVzaW9uIHdpdGhpbiBhIGJsb2NrLlxuICAgICAqL1xuICAgIGluZGV4O1xuICAgIC8qKlxuICAgICAqICBUaGUgaW5kZXggd2l0aGluIHRoZSB0cmFuc2FjdGlvbiBvZiB0aGlzIGxvZy5cbiAgICAgKi9cbiAgICB0cmFuc2FjdGlvbkluZGV4O1xuICAgIC8qKlxuICAgICAqICBAX2lnbm9yZTpcbiAgICAgKi9cbiAgICBjb25zdHJ1Y3Rvcihsb2csIHByb3ZpZGVyKSB7XG4gICAgICAgIHRoaXMucHJvdmlkZXIgPSBwcm92aWRlcjtcbiAgICAgICAgY29uc3QgdG9waWNzID0gT2JqZWN0LmZyZWV6ZShsb2cudG9waWNzLnNsaWNlKCkpO1xuICAgICAgICBkZWZpbmVQcm9wZXJ0aWVzKHRoaXMsIHtcbiAgICAgICAgICAgIHRyYW5zYWN0aW9uSGFzaDogbG9nLnRyYW5zYWN0aW9uSGFzaCxcbiAgICAgICAgICAgIGJsb2NrSGFzaDogbG9nLmJsb2NrSGFzaCxcbiAgICAgICAgICAgIGJsb2NrTnVtYmVyOiBsb2cuYmxvY2tOdW1iZXIsXG4gICAgICAgICAgICByZW1vdmVkOiBsb2cucmVtb3ZlZCxcbiAgICAgICAgICAgIGFkZHJlc3M6IGxvZy5hZGRyZXNzLFxuICAgICAgICAgICAgZGF0YTogbG9nLmRhdGEsXG4gICAgICAgICAgICB0b3BpY3MsXG4gICAgICAgICAgICBpbmRleDogbG9nLmluZGV4LFxuICAgICAgICAgICAgdHJhbnNhY3Rpb25JbmRleDogbG9nLnRyYW5zYWN0aW9uSW5kZXgsXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiAgUmV0dXJucyBhIEpTT04tY29tcGF0aWJsZSBvYmplY3QuXG4gICAgICovXG4gICAgdG9KU09OKCkge1xuICAgICAgICBjb25zdCB7IGFkZHJlc3MsIGJsb2NrSGFzaCwgYmxvY2tOdW1iZXIsIGRhdGEsIGluZGV4LCByZW1vdmVkLCB0b3BpY3MsIHRyYW5zYWN0aW9uSGFzaCwgdHJhbnNhY3Rpb25JbmRleCB9ID0gdGhpcztcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIF90eXBlOiBcImxvZ1wiLFxuICAgICAgICAgICAgYWRkcmVzcywgYmxvY2tIYXNoLCBibG9ja051bWJlciwgZGF0YSwgaW5kZXgsXG4gICAgICAgICAgICByZW1vdmVkLCB0b3BpY3MsIHRyYW5zYWN0aW9uSGFzaCwgdHJhbnNhY3Rpb25JbmRleFxuICAgICAgICB9O1xuICAgIH1cbiAgICAvKipcbiAgICAgKiAgUmV0dXJucyB0aGUgYmxvY2sgdGhhdCB0aGlzIGxvZyBvY2N1cnJlZCBpbi5cbiAgICAgKi9cbiAgICBhc3luYyBnZXRCbG9jaygpIHtcbiAgICAgICAgY29uc3QgYmxvY2sgPSBhd2FpdCB0aGlzLnByb3ZpZGVyLmdldEJsb2NrKHRoaXMuYmxvY2tIYXNoKTtcbiAgICAgICAgYXNzZXJ0KCEhYmxvY2ssIFwiZmFpbGVkIHRvIGZpbmQgdHJhbnNhY3Rpb25cIiwgXCJVTktOT1dOX0VSUk9SXCIsIHt9KTtcbiAgICAgICAgcmV0dXJuIGJsb2NrO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiAgUmV0dXJucyB0aGUgdHJhbnNhY3Rpb24gdGhhdCB0aGlzIGxvZyBvY2N1cnJlZCBpbi5cbiAgICAgKi9cbiAgICBhc3luYyBnZXRUcmFuc2FjdGlvbigpIHtcbiAgICAgICAgY29uc3QgdHggPSBhd2FpdCB0aGlzLnByb3ZpZGVyLmdldFRyYW5zYWN0aW9uKHRoaXMudHJhbnNhY3Rpb25IYXNoKTtcbiAgICAgICAgYXNzZXJ0KCEhdHgsIFwiZmFpbGVkIHRvIGZpbmQgdHJhbnNhY3Rpb25cIiwgXCJVTktOT1dOX0VSUk9SXCIsIHt9KTtcbiAgICAgICAgcmV0dXJuIHR4O1xuICAgIH1cbiAgICAvKipcbiAgICAgKiAgUmV0dXJucyB0aGUgdHJhbnNhY3Rpb24gcmVjZWlwdCBmb3QgdGhlI
26774HRyYW5zYWN0aW9uIHRoYXQgdGhpc1xuICAgICAqICBsb2cgb2NjdXJyZWQgaW4uXG4gICAgICovXG4gICAgYXN5bmMgZ2V0VHJhbnNhY3Rpb25SZWNlaXB0KCkge1xuICAgICAgICBjb25zdCByZWNlaXB0ID0gYXdhaXQgdGhpcy5wcm92aWRlci5nZXRUcmFuc2FjdGlvblJlY2VpcHQodGhpcy50cmFuc2FjdGlvbkhhc2gpO1xuICAgICAgICBhc3NlcnQoISFyZWNlaXB0LCBcImZhaWxlZCB0byBmaW5kIHRyYW5zYWN0aW9uIHJlY2VpcHRcIiwgXCJVTktOT1dOX0VSUk9SXCIsIHt9KTtcbiAgICAgICAgcmV0dXJuIHJlY2VpcHQ7XG4gICAgfVxuICAgIC8qKlxuICAgICAqICBAX2lnbm9yZTpcbiAgICAgKi9cbiAgICByZW1vdmVkRXZlbnQoKSB7XG4gICAgICAgIHJldHVybiBjcmVhdGVSZW1vdmVkTG9nRmlsdGVyKHRoaXMpO1xuICAgIH1cbn1cbi8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFRyYW5zYWN0aW9uIFJlY2VpcHRcbi8qXG5leHBvcnQgaW50ZXJmYWNlIExlZ2FjeVRyYW5zYWN0aW9uUmVjZWlwdCB7XG4gICAgYnl6YW50aXVtOiBmYWxzZTtcbiAgICBzdGF0dXM6IG51bGw7XG4gICAgcm9vdDogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEJ5emFudGl1bVRyYW5zYWN0aW9uUmVjZWlwdCB7XG4gICAgYnl6YW50aXVtOiB0cnVlO1xuICAgIHN0YXR1czogbnVtYmVyO1xuICAgIHJvb3Q6IG51bGw7XG59XG4qL1xuLyoqXG4gKiAgQSAqKlRyYW5zYWN0aW9uUmVjZWlwdCoqIGluY2x1ZGVzIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gYWJvdXQgYVxuICogIHRyYW5zYWN0aW9uIHRoYXQgaXMgb25seSBhdmFpbGFibGUgYWZ0ZXIgaXQgaGFzIGJlZW4gbWluZWQuXG4gKi9cbmV4cG9ydCBjbGFzcyBUcmFuc2FjdGlvblJlY2VpcHQge1xuICAgIC8qKlxuICAgICAqICBUaGUgcHJvdmlkZXIgY29ubmVjdGVkIHRvIHRoZSBsb2cgdXNlZCB0byBmZXRjaCBhZGRpdGlvbmFsIGRldGFpbHNcbiAgICAgKiAgaWYgbmVjZXNzYXJ5LlxuICAgICAqL1xuICAgIHByb3ZpZGVyO1xuICAgIC8qKlxuICAgICAqICBUaGUgYWRkcmVzcyB0aGUgdHJhbnNhY3Rpb24gd2FzIHNlbnQgdG8uXG4gICAgICovXG4gICAgdG87XG4gICAgLyoqXG4gICAgICogIFRoZSBzZW5kZXIgb2YgdGhlIHRyYW5zYWN0aW9uLlxuICAgICAqL1xuICAgIGZyb207XG4gICAgLyoqXG4gICAgICogIFRoZSBhZGRyZXNzIG9mIHRoZSBjb250cmFjdCBpZiB0aGUgdHJhbnNhY3Rpb24gd2FzIGRpcmVjdGx5XG4gICAgICogIHJlc3BvbnNpYmxlIGZvciBkZXBsb3lpbmcgb25lLlxuICAgICAqXG4gICAgICogIFRoaXMgaXMgbm9uLW51bGwgKipvbmx5KiogaWYgdGhlIGBgdG9gYCBpcyBlbXB0eSBhbmQgdGhlIGBgZGF0YWBgXG4gICAgICogIHdhcyBzdWNjZXNzZnVsbHkgZXhlY3V0ZWQgYXMgaW5pdGNvZGUuXG4gICAgICovXG4gICAgY29udHJhY3RBZGRyZXNzO1xuICAgIC8qKlxuICAgICAqICBUaGUgdHJhbnNhY3Rpb24gaGFzaC5cbiAgICAgKi9cbiAgICBoYXNoO1xuICAgIC8qKlxuICAgICAqICBUaGUgaW5kZXggb2YgdGhpcyB0cmFuc2FjdGlvbiB3aXRoaW4gdGhlIGJsb2NrIHRyYW5zYWN0aW9ucy5cbiAgICAgKi9cbiAgICBpbmRleDtcbiAgICAvKipcbiAgICAgKiAgVGhlIGJsb2NrIGhhc2ggb2YgdGhlIFtbQmxvY2tdXSB0aGlzIHRyYW5zYWN0aW9uIHdhcyBpbmNsdWRlZCBpbi5cbiAgICAgKi9cbiAgICBibG9ja0hhc2g7XG4gICAgLyoqXG4gICAgICogIFRoZSBibG9jayBudW1iZXIgb2YgdGhlIFtbQmxvY2tdXSB0aGlzIHRyYW5zYWN0aW9uIHdhcyBpbmNsdWRlZCBpbi5cbiAgICAgKi9cbiAgICBibG9ja051bWJlcjtcbiAgICAvKipcbiAgICAgKiAgVGhlIGJsb29tIGZpbHRlciBieXRlcyB0aGF0IHJlcHJlc2VudCBhbGwgbG9ncyB0aGF0IG9jY3VycmVkIHdpdGhpblxuICAgICAqICB0aGlzIHRyYW5zYWN0aW9uLiBUaGlzIGlzIGdlbmVyYWxseSBub3QgdXNlZnVsIGZvciBtb3N0IGRldmVsb3BlcnMsXG4gICAgICogIGJ1dCBjYW4gYmUgdXNlZCB0byB2YWxpZGF0ZSB0aGUgaW5jbHVkZWQgbG9ncy5cbiAgICAgKi9cbiAgICBsb2dzQmxvb207XG4gICAgLyoqXG4gICAgICogIFRoZSBhY3R1YWwgYW1vdW50IG9mIGdhcyB1c2VkIGJ5IHRoaXMgdHJhbnNhY3Rpb24uXG4gICAgICpcbiAgICAgKiAgV2hlbiBjcmVhdGluZyBhIHRyYW5zYWN0aW9uLCB0aGUgYW1vdW50IG9mIGdhcyB0aGF0IHdpbGwgYmUgdXNlZCBjYW5cbiAgICAgKiAgb25seSBiZSBhcHByb3hpbWF0ZWQsIGJ1dCB0aGUgc2VuZGVyIG11c3QgcGF5IHRoZSBnYXMgZmVlIGZvciB0aGVcbiAgICAgKiAgZW50aXJlIGdhcyBsaW1pdC4gQWZ0ZXIgdGhlIHRyYW5zYWN0aW9uLCB0aGUgZGlmZmVyZW5jZSBpcyByZWZ1bmRlZC5cbiAgICAgKi9cbiAgICBnYXNVc2VkO1xuICAgIC8qKlxuICAgICAqICBUaGUgZ2FzIHVzZWQgZm9yIEJMT2JzLiBTZWUgW1tsaW5rLWVpcC00ODQ0XV0uXG4gICAgICovXG4gICAgYmxvYkdhc1VzZWQ7XG4gICAgLyoqXG4gICAgICogIFRoZSBhbW91bnQgb2YgZ2FzIHVzZWQgYnkgYWxsIHRyYW5zYWN0aW9ucyB3aXRoaW4gdGhlIGJsb2NrIGZvciB0aGlzXG4gICAgICogIGFuZCBhbGwgdHJhbnNhY3Rpb25zIHdpdGggYSBsb3dlciBgYGluZGV4YGAuXG4gICAgICpcbiAgICAgKiAgVGhpcyBpcyBnZW5lcmFsbHkgbm90IHVzZWZ1bCBmb3IgZGV2ZWxvcGVycyBidXQgY2FuIGJlIHVzZWQgdG9cbiAgICAgKiAgdmFsaWRhdGUgY2VydGFpbiBhc3BlY3RzIG9mIGV4ZWN1dGlvbi5cbiAgICAgKi9cbiAgICBjdW11bGF0aXZlR2FzVXNlZDtcbiAgICAvKipcbiAgICAgKiAgVGhlIGFjdHVhbCBnYXMgcHJpY2UgdXNlZCBkdXJpbmcgZXhlY3V0aW9uLlxuICAgICAqXG4gICAgICogIER1ZSB0byB0aGUgY29tcGxleGl0eSBvZiBbW2xpbmstZWlwLTE1NTldXSB0aGlzIHZhbHVlIGNhbiBvbmx5XG4gICAgICogIGJlIGNhbHVjbGF0ZWQgYWZ0ZXIgdGhlIHRyYW5zYWN0aW9uIGhhcyBiZWVuIG1pbmVkLCBzbmNlIHRoZSBiYXNlXG4gICAgICogIGZlZSBpcyBwcm90b2NvbC1lbmZvcmNlZC5cbiAgICAgKi9cbiAgICBnYXNQcmljZTtcbiAgICAvKipcbiAgICAgKiAgVGhlIHByaWNlIHBhaWQgcGVyIEJMT0IgaW4gZ2FzLiBTZWUgW1tsaW5rLWVpcC00ODQ0XV0uXG4gICAgICovXG4gICAgYmxvYkdhc1ByaWNlO1xuICAgIC8qKlxuICAgICAqICBUaGUgW1tsaW5rLWVpcC0yNzE4XV0gdHJhbnNhY3Rpb24gdHlwZS5cbiAgICAgKi9cbiAgICB0eX
26774BlO1xuICAgIC8vcmVhZG9ubHkgYnl6YW50aXVtITogYm9vbGVhbjtcbiAgICAvKipcbiAgICAgKiAgVGhlIHN0YXR1cyBvZiB0aGlzIHRyYW5zYWN0aW9uLCBpbmRpY2F0aW5nIHN1Y2Nlc3MgKGkuZS4gYGAxYGApIG9yXG4gICAgICogIGEgcmV2ZXJ0IChpLmUuIGBgMGBgKS5cbiAgICAgKlxuICAgICAqICBUaGlzIGlzIGF2YWlsYWJsZSBpbiBwb3N0LWJ5emFudGl1bSBibG9ja3MsIGJ1dCBzb21lIGJhY2tlbmRzIG1heVxuICAgICAqICBiYWNrZmlsbCB0aGlzIHZhbHVlLlxuICAgICAqL1xuICAgIHN0YXR1cztcbiAgICAvKipcbiAgICAgKiAgVGhlIHJvb3QgaGFzaCBvZiB0aGlzIHRyYW5zYWN0aW9uLlxuICAgICAqXG4gICAgICogIFRoaXMgaXMgbm8gcHJlc2VudCBhbmQgd2FzIG9ubHkgaW5jbHVkZWQgaW4gcHJlLWJ5emFudGl1bSBibG9ja3MsIGJ1dFxuICAgICAqICBjb3VsZCBiZSB1c2VkIHRvIHZhbGlkYXRlIGNlcnRhaW4gcGFydHMgb2YgdGhlIHJlY2VpcHQuXG4gICAgICovXG4gICAgcm9vdDtcbiAgICAjbG9ncztcbiAgICAvKipcbiAgICAgKiAgQF9pZ25vcmU6XG4gICAgICovXG4gICAgY29uc3RydWN0b3IodHgsIHByb3ZpZGVyKSB7XG4gICAgICAgIHRoaXMuI2xvZ3MgPSBPYmplY3QuZnJlZXplKHR4LmxvZ3MubWFwKChsb2cpID0+IHtcbiAgICAgICAgICAgIHJldHVybiBuZXcgTG9nKGxvZywgcHJvdmlkZXIpO1xuICAgICAgICB9KSk7XG4gICAgICAgIGxldCBnYXNQcmljZSA9IEJOXzA7XG4gICAgICAgIGlmICh0eC5lZmZlY3RpdmVHYXNQcmljZSAhPSBudWxsKSB7XG4gICAgICAgICAgICBnYXNQcmljZSA9IHR4LmVmZmVjdGl2ZUdhc1ByaWNlO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHR4Lmdhc1ByaWNlICE9IG51bGwpIHtcbiAgICAgICAgICAgIGdhc1ByaWNlID0gdHguZ2FzUHJpY2U7XG4gICAgICAgIH1cbiAgICAgICAgZGVmaW5lUHJvcGVydGllcyh0aGlzLCB7XG4gICAgICAgICAgICBwcm92aWRlcixcbiAgICAgICAgICAgIHRvOiB0eC50byxcbiAgICAgICAgICAgIGZyb206IHR4LmZyb20sXG4gICAgICAgICAgICBjb250cmFjdEFkZHJlc3M6IHR4LmNvbnRyYWN0QWRkcmVzcyxcbiAgICAgICAgICAgIGhhc2g6IHR4Lmhhc2gsXG4gICAgICAgICAgICBpbmRleDogdHguaW5kZXgsXG4gICAgICAgICAgICBibG9ja0hhc2g6IHR4LmJsb2NrSGFzaCxcbiAgICAgICAgICAgIGJsb2NrTnVtYmVyOiB0eC5ibG9ja051bWJlcixcbiAgICAgICAgICAgIGxvZ3NCbG9vbTogdHgubG9nc0Jsb29tLFxuICAgICAgICAgICAgZ2FzVXNlZDogdHguZ2FzVXNlZCxcbiAgICAgICAgICAgIGN1bXVsYXRpdmVHYXNVc2VkOiB0eC5jdW11bGF0aXZlR2FzVXNlZCxcbiAgICAgICAgICAgIGJsb2JHYXNVc2VkOiB0eC5ibG9iR2FzVXNlZCxcbiAgICAgICAgICAgIGdhc1ByaWNlLFxuICAgICAgICAgICAgYmxvYkdhc1ByaWNlOiB0eC5ibG9iR2FzUHJpY2UsXG4gICAgICAgICAgICB0eXBlOiB0eC50eXBlLFxuICAgICAgICAgICAgLy9ieXphbnRpdW06IHR4LmJ5emFudGl1bSxcbiAgICAgICAgICAgIHN0YXR1czogdHguc3RhdHVzLFxuICAgICAgICAgICAgcm9vdDogdHgucm9vdFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogIFRoZSBsb2dzIGZvciB0aGlzIHRyYW5zYWN0aW9uLlxuICAgICAqL1xuICAgIGdldCBsb2dzKCkgeyByZXR1cm4gdGhpcy4jbG9nczsgfVxuICAgIC8qKlxuICAgICAqICBSZXR1cm5zIGEgSlNPTi1jb21wYXRpYmxlIHJlcHJlc2VudGF0aW9uLlxuICAgICAqL1xuICAgIHRvSlNPTigpIHtcbiAgICAgICAgY29uc3QgeyB0bywgZnJvbSwgY29udHJhY3RBZGRyZXNzLCBoYXNoLCBpbmRleCwgYmxvY2tIYXNoLCBibG9ja051bWJlciwgbG9nc0Jsb29tLCBsb2dzLCAvL2J5emFudGl1bSwgXG4gICAgICAgIHN0YXR1cywgcm9vdCB9ID0gdGhpcztcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIF90eXBlOiBcIlRyYW5zYWN0aW9uUmVjZWlwdFwiLFxuICAgICAgICAgICAgYmxvY2tIYXNoLCBibG9ja051bWJlcixcbiAgICAgICAgICAgIC8vYnl6YW50aXVtLCBcbiAgICAgICAgICAgIGNvbnRyYWN0QWRkcmVzcyxcbiAgICAgICAgICAgIGN1bXVsYXRpdmVHYXNVc2VkOiB0b0pzb24odGhpcy5jdW11bGF0aXZlR2FzVXNlZCksXG4gICAgICAgICAgICBmcm9tLFxuICAgICAgICAgICAgZ2FzUHJpY2U6IHRvSnNvbih0aGlzLmdhc1ByaWNlKSxcbiAgICAgICAgICAgIGJsb2JHYXNVc2VkOiB0b0pzb24odGhpcy5ibG9iR2FzVXNlZCksXG4gICAgICAgICAgICBibG9iR2FzUHJpY2U6IHRvSnNvbih0aGlzLmJsb2JHYXNQcmljZSksXG4gICAgICAgICAgICBnYXNVc2VkOiB0b0pzb24odGhpcy5nYXNVc2VkKSxcbiAgICAgICAgICAgIGhhc2gsIGluZGV4LCBsb2dzLCBsb2dzQmxvb20sIHJvb3QsIHN0YXR1cywgdG9cbiAgICAgICAgfTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogIEBfaWdub3JlOlxuICAgICAqL1xuICAgIGdldCBsZW5ndGgoKSB7IHJldHVybiB0aGlzLmxvZ3MubGVuZ3RoOyB9XG4gICAgW1N5bWJvbC5pdGVyYXRvcl0oKSB7XG4gICAgICAgIGxldCBpbmRleCA9IDA7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBuZXh0OiAoKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKGluZGV4IDwgdGhpcy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHsgdmFsdWU6IHRoaXMubG9nc1tpbmRleCsrXSwgZG9uZTogZmFsc2UgfTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIHsgdmFsdWU6IHVuZGVmaW5lZCwgZG9uZTogdHJ1ZSB9O1xuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgIH1cbiAgICAvKipcbiAgICAgKiAgVGhlIHRvdGFsIGZlZSBmb3IgdGhpcyB0cmFuc2FjdGlvbiwgaW4gd2VpLlxuICAgICAqL1xuICAgIGdldCBmZWUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdhc1VzZWQgKiB0aGlzLmdhc1ByaWNlO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiAgUmVzb2x2ZXMgdG8gdGhlIGJsb2NrIHRoaXMgdHJhbnNhY3Rpb24gb2NjdXJyZWQgaW4uXG4gICAgICovXG4gICAgYXN5bmMgZ2V0QmxvY2soKSB7XG4gICAgICAgIGNvbnN0IGJsb2NrID0gYXdhaXQgdGhpcy5wcm92aWRlci5nZXRCbG9jayh0aGlzLmJsb2NrSGFzaCk7XG4gICAgICAgIGlmIChibG9jayA9PSBudWxsKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJUT0RPXCIpO1xuICAgICAgICB9XG4gICAgICAgI
26774HJldHVybiBibG9jaztcbiAgICB9XG4gICAgLyoqXG4gICAgICogIFJlc29sdmVzIHRvIHRoZSB0cmFuc2FjdGlvbiB0aGlzIHRyYW5zYWN0aW9uIG9jY3VycmVkIGluLlxuICAgICAqL1xuICAgIGFzeW5jIGdldFRyYW5zYWN0aW9uKCkge1xuICAgICAgICBjb25zdCB0eCA9IGF3YWl0IHRoaXMucHJvdmlkZXIuZ2V0VHJhbnNhY3Rpb24odGhpcy5oYXNoKTtcbiAgICAgICAgaWYgKHR4ID09IG51bGwpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlRPRE9cIik7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHR4O1xuICAgIH1cbiAgICAvKipcbiAgICAgKiAgUmVzb2x2ZXMgdG8gdGhlIHJldHVybiB2YWx1ZSBvZiB0aGUgZXhlY3V0aW9uIG9mIHRoaXMgdHJhbnNhY3Rpb24uXG4gICAgICpcbiAgICAgKiAgU3VwcG9ydCBmb3IgdGhpcyBmZWF0dXJlIGlzIGxpbWl0ZWQsIGFzIGl0IHJlcXVpcmVzIGFuIGFyY2hpdmUgbm9kZVxuICAgICAqICB3aXRoIHRoZSBgYGRlYnVnX2BgIG9yIGBgdHJhY2VfYGAgQVBJIGVuYWJsZWQuXG4gICAgICovXG4gICAgYXN5bmMgZ2V0UmVzdWx0KCkge1xuICAgICAgICByZXR1cm4gKGF3YWl0IHRoaXMucHJvdmlkZXIuZ2V0VHJhbnNhY3Rpb25SZXN1bHQodGhpcy5oYXNoKSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqICBSZXNvbHZlcyB0byB0aGUgbnVtYmVyIG9mIGNvbmZpcm1hdGlvbnMgdGhpcyB0cmFuc2FjdGlvbiBoYXMuXG4gICAgICovXG4gICAgYXN5bmMgY29uZmlybWF0aW9ucygpIHtcbiAgICAgICAgcmV0dXJuIChhd2FpdCB0aGlzLnByb3ZpZGVyLmdldEJsb2NrTnVtYmVyKCkpIC0gdGhpcy5ibG9ja051bWJlciArIDE7XG4gICAgfVxuICAgIC8qKlxuICAgICAqICBAX2lnbm9yZTpcbiAgICAgKi9cbiAgICByZW1vdmVkRXZlbnQoKSB7XG4gICAgICAgIHJldHVybiBjcmVhdGVSZW1vdmVkVHJhbnNhY3Rpb25GaWx0ZXIodGhpcyk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqICBAX2lnbm9yZTpcbiAgICAgKi9cbiAgICByZW9yZGVyZWRFdmVudChvdGhlcikge1xuICAgICAgICBhc3NlcnQoIW90aGVyIHx8IG90aGVyLmlzTWluZWQoKSwgXCJ1bm1pbmVkICdvdGhlcicgdHJhbnNjdGlvbiBjYW5ub3QgYmUgb3JwaGFuZWRcIiwgXCJVTlNVUFBPUlRFRF9PUEVSQVRJT05cIiwgeyBvcGVyYXRpb246IFwicmVvcmRlcmVkRXZlbnQob3RoZXIpXCIgfSk7XG4gICAgICAgIHJldHVybiBjcmVhdGVSZW9yZGVyZWRUcmFuc2FjdGlvbkZpbHRlcih0aGlzLCBvdGhlcik7XG4gICAgfVxufVxuLyoqXG4gKiAgQSAqKlRyYW5zYWN0aW9uUmVzcG9uc2UqKiBpbmNsdWRlcyBhbGwgcHJvcGVydGllcyBhYm91dCBhIHRyYW5zYWN0aW9uXG4gKiAgdGhhdCB3YXMgc2VudCB0byB0aGUgbmV0d29yaywgd2hpY2ggbWF5IG9yIG1heSBub3QgYmUgaW5jbHVkZWQgaW4gYVxuICogIGJsb2NrLlxuICpcbiAqICBUaGUgW1tUcmFuc2FjdGlvblJlc3BvbnNlLWlzTWluZWRdXSBjYW4gYmUgdXNlZCB0byBjaGVjayBpZiB0aGVcbiAqICB0cmFuc2FjdGlvbiBoYXMgYmVlbiBtaW5lZCBhcyB3ZWxsIGFzIHR5cGUgZ3VhcmQgdGhhdCB0aGUgb3RoZXJ3aXNlXG4gKiAgcG9zc2libHkgYGBudWxsYGAgcHJvcGVydGllcyBhcmUgZGVmaW5lZC5cbiAqL1xuZXhwb3J0IGNsYXNzIFRyYW5zYWN0aW9uUmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqICBUaGUgcHJvdmlkZXIgdGhpcyBpcyBjb25uZWN0ZWQgdG8sIHdoaWNoIHdpbGwgaW5mbHVlbmNlIGhvdyBpdHNcbiAgICAgKiAgbWV0aG9kcyB3aWxsIHJlc29sdmUgaXRzIGFzeW5jIGluc3BlY3Rpb24gbWV0aG9kcy5cbiAgICAgKi9cbiAgICBwcm92aWRlcjtcbiAgICAvKipcbiAgICAgKiAgVGhlIGJsb2NrIG51bWJlciBvZiB0aGUgYmxvY2sgdGhhdCB0aGlzIHRyYW5zYWN0aW9uIHdhcyBpbmNsdWRlZCBpbi5cbiAgICAgKlxuICAgICAqICBUaGlzIGlzIGBgbnVsbGBgIGZvciBwZW5kaW5nIHRyYW5zYWN0aW9ucy5cbiAgICAgKi9cbiAgICBibG9ja051bWJlcjtcbiAgICAvKipcbiAgICAgKiAgVGhlIGJsb2NrSGFzaCBvZiB0aGUgYmxvY2sgdGhhdCB0aGlzIHRyYW5zYWN0aW9uIHdhcyBpbmNsdWRlZCBpbi5cbiAgICAgKlxuICAgICAqICBUaGlzIGlzIGBgbnVsbGBgIGZvciBwZW5kaW5nIHRyYW5zYWN0aW9ucy5cbiAgICAgKi9cbiAgICBibG9ja0hhc2g7XG4gICAgLyoqXG4gICAgICogIFRoZSBpbmRleCB3aXRoaW4gdGhlIGJsb2NrIHRoYXQgdGhpcyB0cmFuc2FjdGlvbiByZXNpZGVzIGF0LlxuICAgICAqL1xuICAgIGluZGV4O1xuICAgIC8qKlxuICAgICAqICBUaGUgdHJhbnNhY3Rpb24gaGFzaC5cbiAgICAgKi9cbiAgICBoYXNoO1xuICAgIC8qKlxuICAgICAqICBUaGUgW1tsaW5rLWVpcC0yNzE4XV0gdHJhbnNhY3Rpb24gZW52ZWxvcGUgdHlwZS4gVGhpcyBpc1xuICAgICAqICBgYDBgYCBmb3IgbGVnYWN5IHRyYW5zYWN0aW9ucyB0eXBlcy5cbiAgICAgKi9cbiAgICB0eXBlO1xuICAgIC8qKlxuICAgICAqICBUaGUgcmVjZWl2ZXIgb2YgdGhpcyB0cmFuc2FjdGlvbi5cbiAgICAgKlxuICAgICAqICBJZiBgYG51bGxgYCwgdGhlbiB0aGUgdHJhbnNhY3Rpb24gaXMgYW4gaW5pdGNvZGUgdHJhbnNhY3Rpb24uXG4gICAgICogIFRoaXMgbWVhbnMgdGhlIHJlc3VsdCBvZiBleGVjdXRpbmcgdGhlIFtbZGF0YV1dIHdpbGwgYmUgZGVwbG95ZWRcbiAgICAgKiAgYXMgYSBuZXcgY29udHJhY3Qgb24gY2hhaW4gKGFzc3VtaW5nIGl0IGRvZXMgbm90IHJldmVydCkgYW5kIHRoZVxuICAgICAqICBhZGRyZXNzIG1heSBiZSBjb21wdXRlZCB1c2luZyBbW2dldENyZWF0ZUFkZHJlc3NdXS5cbiAgICAgKi9cbiAgICB0bztcbiAgICAvKipcbiAgICAgKiAgVGhlIHNlbmRlciBvZiB0aGlzIHRyYW5zYWN0aW9uLiBJdCBpcyBpbXBsaWNpdGx5IGNvbXB1dGVkXG4gICAgICogIGZyb20gdGhlIHRyYW5zYWN0aW9uIHByZS1pbWFnZSBoYXNoIChhcyB0aGUgZGlnZXN0KSBhbmQgdGhlXG4gICAgICogIFtbc2lnbmF0dXJlXV0gdXNpbmcgZWNyZWNvdmVyLlxuICAgICAqL1xuICAgIGZyb207XG4gICAgLyoqXG4gICAgICogIFRoZSBub25jZSwgd2hpY2ggaXMgdXNlZCB0byBwcmV2ZW50IHJlcGxheSBhdHRhY2tzIGFuZCBvZmZlclxuICAgICAqICBhIG1ldGhvZCB0byBlbnN1cmUgdHJhbnNhY3Rpb25zIGZyb20gYSBnaXZlbiBzZW5kZXIgYXJlIGV4cGxpY2l0bHlcbiAgICAgKiAgb3JkZXJlZC5cbiAgICAgKlxuICAgICAqICBXaGVuIHNlbmRpbmcgYSB0cmFuc2FjdGlvbiwgdGhpcyBtdXN0IGJlIGVxdWFsIHRvIHRoZSBudW1iZXIgb2ZcbiAgICAgKiAgdHJhbnNhY3Rpb25zIGV2ZXIgc2VudCBieSBbW2Zyb21dXS5cbiAgICAgKi9cbiAgICBub25jZTtcbiAgICAvKipcbiAgICAgKiAgVGhlIG1heGltdW0gdW5pdHMgb2YgZ2FzIHRoaXMgdHJhbnNhY3Rpb24gY2FuIGNvbnN1bWUuIElmIGV4ZWN1dGlvblxuICAgICAqICBleGNlZWRzIHRoaXMsIHR
26774oZSBlbnRyaWVzIHRyYW5zYWN0aW9uIGlzIHJldmVydGVkIGFuZCB0aGUgc2VuZGVyXG4gICAgICogIGlzIGNoYXJnZWQgZm9yIHRoZSBmdWxsIGFtb3VudCwgZGVzcGl0ZSBub3Qgc3RhdGUgY2hhbmdlcyBiZWluZyBtYWRlLlxuICAgICAqL1xuICAgIGdhc0xpbWl0O1xuICAgIC8qKlxuICAgICAqICBUaGUgZ2FzIHByaWNlIGNhbiBoYXZlIHZhcmlvdXMgdmFsdWVzLCBkZXBlbmRpbmcgb24gdGhlIG5ldHdvcmsuXG4gICAgICpcbiAgICAgKiAgSW4gbW9kZXJuIG5ldHdvcmtzLCBmb3IgdHJhbnNhY3Rpb25zIHRoYXQgYXJlIGluY2x1ZGVkIHRoaXMgaXNcbiAgICAgKiAgdGhlIC8vZWZmZWN0aXZlIGdhcyBwcmljZS8vICh0aGUgZmVlIHBlciBnYXMgdGhhdCB3YXMgYWN0dWFsbHlcbiAgICAgKiAgY2hhcmdlZCksIHdoaWxlIGZvciB0cmFuc2FjdGlvbnMgdGhhdCBoYXZlIG5vdCBiZWVuIGluY2x1ZGVkIHlldFxuICAgICAqICBpcyB0aGUgW1ttYXhGZWVQZXJHYXNdXS5cbiAgICAgKlxuICAgICAqICBGb3IgbGVnYWN5IHRyYW5zYWN0aW9ucywgb3IgdHJhbnNhY3Rpb25zIG9uIGxlZ2FjeSBuZXR3b3JrcywgdGhpc1xuICAgICAqICBpcyB0aGUgZmVlIHRoYXQgd2lsbCBiZSBjaGFyZ2VkIHBlciB1bml0IG9mIGdhcyB0aGUgdHJhbnNhY3Rpb25cbiAgICAgKiAgY29uc3VtZXMuXG4gICAgICovXG4gICAgZ2FzUHJpY2U7XG4gICAgLyoqXG4gICAgICogIFRoZSBtYXhpbXVtIHByaW9yaXR5IGZlZSAocGVyIHVuaXQgb2YgZ2FzKSB0byBhbGxvdyBhXG4gICAgICogIHZhbGlkYXRvciB0byBjaGFyZ2UgdGhlIHNlbmRlci4gVGhpcyBpcyBpbmNsdXNpdmUgb2YgdGhlXG4gICAgICogIFtbbWF4RmVlRmVlUGVyR2FzXV0uXG4gICAgICovXG4gICAgbWF4UHJpb3JpdHlGZWVQZXJHYXM7XG4gICAgLyoqXG4gICAgICogIFRoZSBtYXhpbXVtIGZlZSAocGVyIHVuaXQgb2YgZ2FzKSB0byBhbGxvdyB0aGlzIHRyYW5zYWN0aW9uXG4gICAgICogIHRvIGNoYXJnZSB0aGUgc2VuZGVyLlxuICAgICAqL1xuICAgIG1heEZlZVBlckdhcztcbiAgICAvKipcbiAgICAgKiAgVGhlIFtbbGluay1laXAtNDg0NF1dIG1heCBmZWUgcGVyIEJMT2IgZ2FzLlxuICAgICAqL1xuICAgIG1heEZlZVBlckJsb2JHYXM7XG4gICAgLyoqXG4gICAgICogIFRoZSBkYXRhLlxuICAgICAqL1xuICAgIGRhdGE7XG4gICAgLyoqXG4gICAgICogIFRoZSB2YWx1ZSwgaW4gd2VpLiBVc2UgW1tmb3JtYXRFdGhlcl1dIHRvIGZvcm1hdCB0aGlzIHZhbHVlXG4gICAgICogIGFzIGV0aGVyLlxuICAgICAqL1xuICAgIHZhbHVlO1xuICAgIC8qKlxuICAgICAqICBUaGUgY2hhaW4gSUQuXG4gICAgICovXG4gICAgY2hhaW5JZDtcbiAgICAvKipcbiAgICAgKiAgVGhlIHNpZ25hdHVyZS5cbiAgICAgKi9cbiAgICBzaWduYXR1cmU7XG4gICAgLyoqXG4gICAgICogIFRoZSBbW2xpbmstZWlwLTI5MzBdXSBhY2Nlc3MgbGlzdCBmb3IgdHJhbnNhY3Rpb24gdHlwZXMgdGhhdFxuICAgICAqICBzdXBwb3J0IGl0LCBvdGhlcndpc2UgYGBudWxsYGAuXG4gICAgICovXG4gICAgYWNjZXNzTGlzdDtcbiAgICAvKipcbiAgICAgKiAgVGhlIFtbbGluay1laXAtNDg0NF1dIEJMT2IgdmVyc2lvbmVkIGhhc2hlcy5cbiAgICAgKi9cbiAgICBibG9iVmVyc2lvbmVkSGFzaGVzO1xuICAgIC8qKlxuICAgICAqICBUaGUgW1tsaW5rLWVpcC03NzAyXV0gYXV0aG9yaXphdGlvbnMgKGlmIGFueSkuXG4gICAgICovXG4gICAgYXV0aG9yaXphdGlvbkxpc3Q7XG4gICAgI3N0YXJ0QmxvY2s7XG4gICAgLyoqXG4gICAgICogIEBfaWdub3JlOlxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yKHR4LCBwcm92aWRlcikge1xuICAgICAgICB0aGlzLnByb3ZpZGVyID0gcHJvdmlkZXI7XG4gICAgICAgIHRoaXMuYmxvY2tOdW1iZXIgPSAodHguYmxvY2tOdW1iZXIgIT0gbnVsbCkgPyB0eC5ibG9ja051bWJlciA6IG51bGw7XG4gICAgICAgIHRoaXMuYmxvY2tIYXNoID0gKHR4LmJsb2NrSGFzaCAhPSBudWxsKSA/IHR4LmJsb2NrSGFzaCA6IG51bGw7XG4gICAgICAgIHRoaXMuaGFzaCA9IHR4Lmhhc2g7XG4gICAgICAgIHRoaXMuaW5kZXggPSB0eC5pbmRleDtcbiAgICAgICAgdGhpcy50eXBlID0gdHgudHlwZTtcbiAgICAgICAgdGhpcy5mcm9tID0gdHguZnJvbTtcbiAgICAgICAgdGhpcy50byA9IHR4LnRvIHx8IG51bGw7XG4gICAgICAgIHRoaXMuZ2FzTGltaXQgPSB0eC5nYXNMaW1pdDtcbiAgICAgICAgdGhpcy5ub25jZSA9IHR4Lm5vbmNlO1xuICAgICAgICB0aGlzLmRhdGEgPSB0eC5kYXRhO1xuICAgICAgICB0aGlzLnZhbHVlID0gdHgudmFsdWU7XG4gICAgICAgIHRoaXMuZ2FzUHJpY2UgPSB0eC5nYXNQcmljZTtcbiAgICAgICAgdGhpcy5tYXhQcmlvcml0eUZlZVBlckdhcyA9ICh0eC5tYXhQcmlvcml0eUZlZVBlckdhcyAhPSBudWxsKSA/IHR4Lm1heFByaW9yaXR5RmVlUGVyR2FzIDogbnVsbDtcbiAgICAgICAgdGhpcy5tYXhGZWVQZXJHYXMgPSAodHgubWF4RmVlUGVyR2FzICE9IG51bGwpID8gdHgubWF4RmVlUGVyR2FzIDogbnVsbDtcbiAgICAgICAgdGhpcy5tYXhGZWVQZXJCbG9iR2FzID0gKHR4Lm1heEZlZVBlckJsb2JHYXMgIT0gbnVsbCkgPyB0eC5tYXhGZWVQZXJCbG9iR2FzIDogbnVsbDtcbiAgICAgICAgdGhpcy5jaGFpbklkID0gdHguY2hhaW5JZDtcbiAgICAgICAgdGhpcy5zaWduYXR1cmUgPSB0eC5zaWduYXR1cmU7XG4gICAgICAgIHRoaXMuYWNjZXNzTGlzdCA9ICh0eC5hY2Nlc3NMaXN0ICE9IG51bGwpID8gdHguYWNjZXNzTGlzdCA6IG51bGw7XG4gICAgICAgIHRoaXMuYmxvYlZlcnNpb25lZEhhc2hlcyA9ICh0eC5ibG9iVmVyc2lvbmVkSGFzaGVzICE9IG51bGwpID8gdHguYmxvYlZlcnNpb25lZEhhc2hlcyA6IG51bGw7XG4gICAgICAgIHRoaXMuYXV0aG9yaXphdGlvbkxpc3QgPSAodHguYXV0aG9yaXphdGlvbkxpc3QgIT0gbnVsbCkgPyB0eC5hdXRob3JpemF0aW9uTGlzdCA6IG51bGw7XG4gICAgICAgIHRoaXMuI3N0YXJ0QmxvY2sgPSAtMTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogIFJldHVybnMgYSBKU09OLWNvbXBhdGlibGUgcmVwcmVzZW50YXRpb24gb2YgdGhpcyB0cmFuc2FjdGlvbi5cbiAgICAgKi9cbiAgICB0b0pTT04oKSB7XG4gICAgICAgIGNvbnN0IHsgYmxvY2tOdW1iZXIsIGJsb2NrSGFzaCwgaW5kZXgsIGhhc2gsIHR5cGUsIHRvLCBmcm9tLCBub25jZSwgZGF0YSwgc2lnbmF0dXJlLCBhY2Nlc3NMaXN0LCBibG9iVmVyc2lvbmVkSGFzaGVzIH0gPSB0aGlzO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgX3R5cGU6IFwiVHJhbnNhY3Rpb25SZXNwb25zZVwiLFxuICAgICAgICAgICAgYWNjZXNzTGlzdCwgYmxvY2tOdW1iZXIsIGJsb2NrSGFzaCxcbiAgICAgICAgICAgIGJsb2JWZXJzaW9uZWRIYXNoZXMsXG4gICAgICAgICAgICBjaGFpbklkOiB0b0pzb24odGhpcy5jaGFpbklkKSxcbiAgICAgICAgICAgIGRhdGEsIGZyb20sXG4gICAgICAgICAgICBnYXNMaW1pdDogdG9Kc29uKHRoaXMuZ2FzTGltaXQpLFxuICAgICAgICAgICAgZ2FzUHJpY2U6IHRvSnNvbih0aGlzLmdhc1ByaWNlKSxcbiAgICAgICAgICAgIGhhc2gsXG4gICAgICAgICAgICBtYXhGZWVQZXJHYXM6IHRvSnNvbih0aGlzLm1heEZlZVBlckdhcyksXG4gICAgICAgICAgICBtYXhQcmlvcml0eUZlZVBlckdhczogdG9Kc29uKHRoaXMubWF4UHJpb3JpdHlGZWVQZXJHYXMpLFxuICAgICAgICAgICAgbWF4RmVlUGVyQmxvYkdhczogdG9Kc29uKHRoaXMubWF4RmVlUGVyQmxvYkdhcyksXG4gICAgICAgICAgICBub25jZSwgc2lnbmF0dXJlLCB0bywgaW5kZXgsIHR5cGUsXG4gICAgICAgICAgICB2YWx1ZTogdG9Kc29uKHRoaXMudmFsdWUpLFxuICAgICAgICB9O1xuICAgIH1cbiAgICAvKipcbiAgICAgKiAgUmVzb2x2ZXMgdG8gdGhlIEJsb2NrIHRoYXQgdGhpcyB0cmFuc2FjdGlvbiB3YXMgaW5jbHVkZWQgaW4uXG4gICAgICpcbiAgICAgKiAgVGhpcyB3aWxsIHJldHVybi
26774BudWxsIGlmIHRoZSB0cmFuc2FjdGlvbiBoYXMgbm90IGJlZW4gaW5jbHVkZWQgeWV0LlxuICAgICAqL1xuICAgIGFzeW5jIGdldEJsb2NrKCkge1xuICAgICAgICBsZXQgYmxvY2tOdW1iZXIgPSB0aGlzLmJsb2NrTnVtYmVyO1xuICAgICAgICBpZiAoYmxvY2tOdW1iZXIgPT0gbnVsbCkge1xuICAgICAgICAgICAgY29uc3QgdHggPSBhd2FpdCB0aGlzLmdldFRyYW5zYWN0aW9uKCk7XG4gICAgICAgICAgICBpZiAodHgpIHtcbiAgICAgICAgICAgICAgICBibG9ja051bWJlciA9IHR4LmJsb2NrTnVtYmVyO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChibG9ja051bWJlciA9PSBudWxsKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBibG9jayA9IHRoaXMucHJvdmlkZXIuZ2V0QmxvY2soYmxvY2tOdW1iZXIpO1xuICAgICAgICBpZiAoYmxvY2sgPT0gbnVsbCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiVE9ET1wiKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYmxvY2s7XG4gICAgfVxuICAgIC8qKlxuICAgICAqICBSZXNvbHZlcyB0byB0aGlzIHRyYW5zYWN0aW9uIGJlaW5nIHJlLXJlcXVlc3RlZCBmcm9tIHRoZVxuICAgICAqICBwcm92aWRlci4gVGhpcyBjYW4gYmUgdXNlZCBpZiB5b3UgaGF2ZSBhbiB1bm1pbmVkIHRyYW5zYWN0aW9uXG4gICAgICogIGFuZCB3aXNoIHRvIGdldCBhbiB1cC10by1kYXRlIHBvcHVsYXRlZCBpbnN0YW5jZS5cbiAgICAgKi9cbiAgICBhc3luYyBnZXRUcmFuc2FjdGlvbigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucHJvdmlkZXIuZ2V0VHJhbnNhY3Rpb24odGhpcy5oYXNoKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogIFJlc29sdmUgdG8gdGhlIG51bWJlciBvZiBjb25maXJtYXRpb25zIHRoaXMgdHJhbnNhY3Rpb24gaGFzLlxuICAgICAqL1xuICAgIGFzeW5jIGNvbmZpcm1hdGlvbnMoKSB7XG4gICAgICAgIGlmICh0aGlzLmJsb2NrTnVtYmVyID09IG51bGwpIHtcbiAgICAgICAgICAgIGNvbnN0IHsgdHgsIGJsb2NrTnVtYmVyIH0gPSBhd2FpdCByZXNvbHZlUHJvcGVydGllcyh7XG4gICAgICAgICAgICAgICAgdHg6IHRoaXMuZ2V0VHJhbnNhY3Rpb24oKSxcbiAgICAgICAgICAgICAgICBibG9ja051bWJlcjogdGhpcy5wcm92aWRlci5nZXRCbG9ja051bWJlcigpXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIC8vIE5vdCBtaW5lZCB5ZXQuLi5cbiAgICAgICAgICAgIGlmICh0eCA9PSBudWxsIHx8IHR4LmJsb2NrTnVtYmVyID09IG51bGwpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gMDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBibG9ja051bWJlciAtIHR4LmJsb2NrTnVtYmVyICsgMTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBibG9ja051bWJlciA9IGF3YWl0IHRoaXMucHJvdmlkZXIuZ2V0QmxvY2tOdW1iZXIoKTtcbiAgICAgICAgcmV0dXJuIGJsb2NrTnVtYmVyIC0gdGhpcy5ibG9ja051bWJlciArIDE7XG4gICAgfVxuICAgIC8qKlxuICAgICAqICBSZXNvbHZlcyBvbmNlIHRoaXMgdHJhbnNhY3Rpb24gaGFzIGJlZW4gbWluZWQgYW5kIGhhc1xuICAgICAqICAlJWNvbmZpcm1zJSUgYmxvY2tzIGluY2x1ZGluZyBpdCAoZGVmYXVsdDogYGAxYGApIHdpdGggYW5cbiAgICAgKiAgb3B0aW9uYWwgJSV0aW1lb3V0JSUuXG4gICAgICpcbiAgICAgKiAgVGhpcyBjYW4gcmVzb2x2ZSB0byBgYG51bGxgYCBvbmx5IGlmICUlY29uZmlybXMlJSBpcyBgYDBgYFxuICAgICAqICBhbmQgdGhlIHRyYW5zYWN0aW9uIGhhcyBub3QgYmVlbiBtaW5lZCwgb3RoZXJ3aXNlIHRoaXMgd2lsbFxuICAgICAqICB3YWl0IHVudGlsIGVub3VnaCBjb25maXJtYXRpb25zIGhhdmUgY29tcGxldGVkLlxuICAgICAqL1xuICAgIGFzeW5jIHdhaXQoX2NvbmZpcm1zLCBfdGltZW91dCkge1xuICAgICAgICBjb25zdCBjb25maXJtcyA9IChfY29uZmlybXMgPT0gbnVsbCkgPyAxIDogX2NvbmZpcm1zO1xuICAgICAgICBjb25zdCB0aW1lb3V0ID0gKF90aW1lb3V0ID09IG51bGwpID8gMCA6IF90aW1lb3V0O1xuICAgICAgICBsZXQgc3RhcnRCbG9jayA9IHRoaXMuI3N0YXJ0QmxvY2s7XG4gICAgICAgIGxldCBuZXh0U2NhbiA9IC0xO1xuICAgICAgICBsZXQgc3RvcFNjYW5uaW5nID0gKHN0YXJ0QmxvY2sgPT09IC0xKSA/IHRydWUgOiBmYWxzZTtcbiAgICAgICAgY29uc3QgY2hlY2tSZXBsYWNlbWVudCA9IGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgIC8vIEdldCB0aGUgY3VycmVudCB0cmFuc2FjdGlvbiBjb3VudCBmb3IgdGhpcyBzZW5kZXJcbiAgICAgICAgICAgIGlmIChzdG9wU2Nhbm5pbmcpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IHsgYmxvY2tOdW1iZXIsIG5vbmNlIH0gPSBhd2FpdCByZXNvbHZlUHJvcGVydGllcyh7XG4gICAgICAgICAgICAgICAgYmxvY2tOdW1iZXI6IHRoaXMucHJvdmlkZXIuZ2V0QmxvY2tOdW1iZXIoKSxcbiAgICAgICAgICAgICAgICBub25jZTogdGhpcy5wcm92aWRlci5nZXRUcmFuc2FjdGlvbkNvdW50KHRoaXMuZnJvbSlcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgLy8gTm8gdHJhbnNhY3Rpb24gb3Igb3VyIG5vbmNlIGhhcyBub3QgYmVlbiBtaW5lZCB5ZXQ7IGJ1dCB3ZVxuICAgICAgICAgICAgLy8gY2FuIHN0YXJ0IHNjYW5uaW5nIGxhdGVyIHdoZW4gd2UgZG8gc3RhcnRcbiAgICAgICAgICAgIGlmIChub25jZSA8IHRoaXMubm9uY2UpIHtcbiAgICAgICAgICAgICAgICBzdGFydEJsb2NrID0gYmxvY2tOdW1iZXI7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gV2Ugd2VyZSBtaW5lZDsgbm8gcmVwbGFjZW1lbnRcbiAgICAgICAgICAgIGlmIChzdG9wU2Nhbm5pbmcpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IG1pbmVkID0gYXdhaXQgdGhpcy5nZXRUcmFuc2FjdGlvbigpO1xuICAgICAgICAgICAgaWYgKG1pbmVkICYmIG1pbmVkLmJsb2NrTnVtYmVyICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBXZSB3ZXJlIHJlcGxhY2VkOyBzdGFydCBzY2FubmluZyBmb3IgdGhhdCB0cmFuc2FjdGlvblxuICAgICAgICAgICAgLy8gU3RhcnRpbmcgdG8gc2NhbjsgbG9vayBiYWNrIGEgZmV3IGV4dHJhIGJsb2NrcyBmb3Igc2FmZXR5XG4gICAgICAgICAgICBpZiAobmV4dFNjYW4gPT09IC0xKSB7XG4gICAgICAgICAgICAgICAgbmV4dFNjYW4gPSBzdGFydEJsb2NrIC0gMztcbiAgICAgICAgICAgICAgICBpZiAobmV4dFNjYW4gPCB0aGlzLiNzdGFydEJsb2NrKSB7XG4gICAgICAgICAgICAgICAgICAgIG5leHRTY2FuID0gdGhpcy4jc3RhcnRCbG9jaztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB3aGlsZSAobmV4dFNjYW4gPD0gYmxvY2tOdW1iZXIpIHtcbiAgICAgICAgICAgICAgICAvLyBHZXQgdGhlIG5leHQgYmxvY2sgdG8gc2NhblxuICAgICAgICAgICAgICAgIGlmIChzdG9wU2Nhbm5pbmcpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNvbnN0IGJsb2NrID0gYXdhaXQgdGhpcy5wcm92aWRlci5nZXRCbG9jayhuZXh0U2NhbiwgdHJ1ZSk7XG4gICAgICAgICAgICAgICAgLy8gVGhpcyBzaG91bGQgbm90IGhhcHBlbjsgYnV0IHdlJ2xsIHRyeSBhZ2FpbiBzaG9ydGx
267745XG4gICAgICAgICAgICAgICAgaWYgKGJsb2NrID09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAvLyBXZSB3ZXJlIG1pbmVkOyBubyByZXBsYWNlbWVudFxuICAgICAgICAgICAgICAgIGZvciAoY29uc3QgaGFzaCBvZiBibG9jaykge1xuICAgICAgICAgICAgICAgICAgICBpZiAoaGFzaCA9PT0gdGhpcy5oYXNoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgLy8gU2VhcmNoIGZvciB0aGUgdHJhbnNhY3Rpb24gdGhhdCByZXBsYWNlZCB1c1xuICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYmxvY2subGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgdHggPSBhd2FpdCBibG9jay5nZXRUcmFuc2FjdGlvbihpKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHR4LmZyb20gPT09IHRoaXMuZnJvbSAmJiB0eC5ub25jZSA9PT0gdGhpcy5ub25jZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gR2V0IHRoZSByZWNlaXB0XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3RvcFNjYW5uaW5nKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCByZWNlaXB0ID0gYXdhaXQgdGhpcy5wcm92aWRlci5nZXRUcmFuc2FjdGlvblJlY2VpcHQodHguaGFzaCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBUaGlzIHNob3VsZCBub3QgaGFwcGVuOyBidXQgd2UnbGwgdHJ5IGFnYWluIHNob3J0bHlcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZWNlaXB0ID09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBXZSB3aWxsIHJldHJ5IHRoaXMgb24gdGhlIG5leHQgYmxvY2sgKHRoaXMgY2FzZSBjb3VsZCBiZSBvcHRpbWl6ZWQpXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoKGJsb2NrTnVtYmVyIC0gcmVjZWlwdC5ibG9ja051bWJlciArIDEpIDwgY29uZmlybXMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBUaGUgcmVhc29uIHdlIHdlcmUgcmVwbGFjZWRcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCByZWFzb24gPSBcInJlcGxhY2VkXCI7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodHguZGF0YSA9PT0gdGhpcy5kYXRhICYmIHR4LnRvID09PSB0aGlzLnRvICYmIHR4LnZhbHVlID09PSB0aGlzLnZhbHVlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVhc29uID0gXCJyZXByaWNlZFwiO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAodHguZGF0YSA9PT0gXCIweFwiICYmIHR4LmZyb20gPT09IHR4LnRvICYmIHR4LnZhbHVlID09PSBCTl8wKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVhc29uID0gXCJjYW5jZWxsZWRcIjtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGFzc2VydChmYWxzZSwgXCJ0cmFuc2FjdGlvbiB3YXMgcmVwbGFjZWRcIiwgXCJUUkFOU0FDVElPTl9SRVBMQUNFRFwiLCB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FuY2VsbGVkOiAocmVhc29uID09PSBcInJlcGxhY2VkXCIgfHwgcmVhc29uID09PSBcImNhbmNlbGxlZFwiKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWFzb24sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVwbGFjZW1lbnQ6IHR4LnJlcGxhY2VhYmxlVHJhbnNhY3Rpb24oc3RhcnRCbG9jayksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFzaDogdHguaGFzaCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWNlaXB0XG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBuZXh0U2NhbisrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9O1xuICAgICAgICBjb25zdCBjaGVja1JlY2VpcHQgPSAocmVjZWlwdCkgPT4ge1xuICAgICAgICAgICAgaWYgKHJlY2VpcHQgPT0gbnVsbCB8fCByZWNlaXB0LnN0YXR1cyAhPT0gMCkge1xuICAgICAgICAgICAgICAgIHJldHVybiByZWNlaXB0O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgYXNzZXJ0KGZhbHNlLCBcInRyYW5zYWN0aW9uIGV4ZWN1dGlvbiByZXZlcnRlZFwiLCBcIkNBTExfRVhDRVBUSU9OXCIsIHtcbiAgICAgICAgICAgICAgICBhY3Rpb246IFwic2VuZFRyYW5zYWN0aW9uXCIsXG4gICAgICAgICAgICAgICAgZGF0YTogbnVsbCwgcmVhc29uOiBudWxsLCBpbnZvY2F0aW9uOiBudWxsLCByZXZlcnQ6IG51bGwsXG4gICAgICAgICAgICAgICAgdHJhbnNhY3Rpb246IHtcbiAgICAgICAgICAgICAgICAgICAgdG86IHJlY2VpcHQudG8sXG4gICAgICAgICAgICAgICAgICAgIGZyb206IHJlY2VpcHQuZnJvbSxcbiAgICAgICAgICAgICAgICAgICAgZGF0YTogXCJcIiAvLyBAVE9ETzogaW4gdjcsIHNwbGl0IG91dCBzZW5kVHJhbnNhY3Rpb24gcHJvcGVydGllc1xuICAgICAgICAgICAgICAgIH0sIHJlY2VpcHRcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9O1xuICAgICAgICBjb25zdCByZWNlaXB0ID0gYXdhaXQgdGhpcy5wcm92aWRlci5nZXRUcmFuc2FjdGlvblJlY2VpcHQodGhpcy5oYXNoKTtcbiAgICAgICAgaWYgKGNvbmZpcm1zID09PSAwKSB7XG4gICAgICAgICAgICByZXR1cm4gY2hlY2tSZWNlaXB0KHJlY2VpcHQpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChyZWNlaXB0KSB7XG4gICAgICAgICAgICBpZiAoY29uZmlybXMgPT09IDEgfHwgKGF3YWl0IHJlY2VpcHQuY29uZmlybWF0aW9ucygpKSA+PSBjb25maXJtcykge1xuICAgICAgICAgICAgICAgI
26774HJldHVybiBjaGVja1JlY2VpcHQocmVjZWlwdCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAvLyBDaGVjayBmb3IgYSByZXBsYWNlbWVudDsgdGhyb3dzIGlmIGEgcmVwbGFjZW1lbnQgd2FzIGZvdW5kXG4gICAgICAgICAgICBhd2FpdCBjaGVja1JlcGxhY2VtZW50KCk7XG4gICAgICAgICAgICAvLyBBbGxvdyBudWxsIG9ubHkgd2hlbiB0aGUgY29uZmlybXMgaXMgMFxuICAgICAgICAgICAgaWYgKGNvbmZpcm1zID09PSAwKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgY29uc3Qgd2FpdGVyID0gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICAgICAgLy8gTGlzdCBvZiB0aGluZ3MgdG8gY2FuY2VsIHdoZW4gd2UgaGF2ZSBhIHJlc3VsdCAob25lIHdheSBvciB0aGUgb3RoZXIpXG4gICAgICAgICAgICBjb25zdCBjYW5jZWxsZXJzID0gW107XG4gICAgICAgICAgICBjb25zdCBjYW5jZWwgPSAoKSA9PiB7IGNhbmNlbGxlcnMuZm9yRWFjaCgoYykgPT4gYygpKTsgfTtcbiAgICAgICAgICAgIC8vIE9uIGNhbmNlbCwgc3RvcCBzY2FubmluZyBmb3IgcmVwbGFjZW1lbnRzXG4gICAgICAgICAgICBjYW5jZWxsZXJzLnB1c2goKCkgPT4geyBzdG9wU2Nhbm5pbmcgPSB0cnVlOyB9KTtcbiAgICAgICAgICAgIC8vIFNldCB1cCBhbnkgdGltZW91dCByZXF1ZXN0ZWRcbiAgICAgICAgICAgIGlmICh0aW1lb3V0ID4gMCkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHRpbWVyID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGNhbmNlbCgpO1xuICAgICAgICAgICAgICAgICAgICByZWplY3QobWFrZUVycm9yKFwid2FpdCBmb3IgdHJhbnNhY3Rpb24gdGltZW91dFwiLCBcIlRJTUVPVVRcIikpO1xuICAgICAgICAgICAgICAgIH0sIHRpbWVvdXQpO1xuICAgICAgICAgICAgICAgIGNhbmNlbGxlcnMucHVzaCgoKSA9PiB7IGNsZWFyVGltZW91dCh0aW1lcik7IH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgdHhMaXN0ZW5lciA9IGFzeW5jIChyZWNlaXB0KSA9PiB7XG4gICAgICAgICAgICAgICAgLy8gRG9uZTsgcmV0dXJuIGl0IVxuICAgICAgICAgICAgICAgIGlmICgoYXdhaXQgcmVjZWlwdC5jb25maXJtYXRpb25zKCkpID49IGNvbmZpcm1zKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhbmNlbCgpO1xuICAgICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZShjaGVja1JlY2VpcHQocmVjZWlwdCkpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVqZWN0KGVycm9yKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBjYW5jZWxsZXJzLnB1c2goKCkgPT4geyB0aGlzLnByb3ZpZGVyLm9mZih0aGlzLmhhc2gsIHR4TGlzdGVuZXIpOyB9KTtcbiAgICAgICAgICAgIHRoaXMucHJvdmlkZXIub24odGhpcy5oYXNoLCB0eExpc3RlbmVyKTtcbiAgICAgICAgICAgIC8vIFdlIHN1cHBvcnQgcmVwbGFjZW1lbnQgZGV0ZWN0aW9uOyBzdGFydCBjaGVja2luZ1xuICAgICAgICAgICAgaWYgKHN0YXJ0QmxvY2sgPj0gMCkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHJlcGxhY2VMaXN0ZW5lciA9IGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIENoZWNrIGZvciBhIHJlcGxhY2VtZW50OyB0aGlzIHRocm93cyBvbmx5IGlmIG9uZSBpcyBmb3VuZFxuICAgICAgICAgICAgICAgICAgICAgICAgYXdhaXQgY2hlY2tSZXBsYWNlbWVudCgpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gV2Ugd2VyZSByZXBsYWNlZCAod2l0aCBlbm91Z2ggY29uZmlybXMpOyByZS10aHJvdyB0aGUgZXJyb3JcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpc0Vycm9yKGVycm9yLCBcIlRSQU5TQUNUSU9OX1JFUExBQ0VEXCIpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FuY2VsKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVqZWN0KGVycm9yKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgLy8gUmVzY2hldWRsZSBhIGNoZWNrIG9uIHRoZSBuZXh0IGJsb2NrXG4gICAgICAgICAgICAgICAgICAgIGlmICghc3RvcFNjYW5uaW5nKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnByb3ZpZGVyLm9uY2UoXCJibG9ja1wiLCByZXBsYWNlTGlzdGVuZXIpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICBjYW5jZWxsZXJzLnB1c2goKCkgPT4geyB0aGlzLnByb3ZpZGVyLm9mZihcImJsb2NrXCIsIHJlcGxhY2VMaXN0ZW5lcik7IH0pO1xuICAgICAgICAgICAgICAgIHRoaXMucHJvdmlkZXIub25jZShcImJsb2NrXCIsIHJlcGxhY2VMaXN0ZW5lcik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gYXdhaXQgd2FpdGVyO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiAgUmV0dXJucyBgYHRydWVgYCBpZiB0aGlzIHRyYW5zYWN0aW9uIGhhcyBiZWVuIGluY2x1ZGVkLlxuICAgICAqXG4gICAgICogIFRoaXMgaXMgZWZmZWN0aXZlIG9ubHkgYXMgb2YgdGhlIHRpbWUgdGhlIFRyYW5zYWN0aW9uUmVzcG9uc2VcbiAgICAgKiAgd2FzIGluc3RhbnRpYXRlZC4gVG8gZ2V0IHVwLXRvLWRhdGUgaW5mb3JtYXRpb24sIHVzZVxuICAgICAqICBbW2dldFRyYW5zYWN0aW9uXV0uXG4gICAgICpcbiAgICAgKiAgVGhpcyBwcm92aWRlcyBhIFR5cGUgR3VhcmQgdGhhdCB0aGlzIHRyYW5zYWN0aW9uIHdpbGwgaGF2ZVxuICAgICAqICBub24tbnVsbCBwcm9wZXJ0eSB2YWx1ZXMgZm9yIHByb3BlcnRpZXMgdGhhdCBhcmUgbnVsbCBmb3JcbiAgICAgKiAgdW5taW5lZCB0cmFuc2FjdGlvbnMuXG4gICAgICovXG4gICAgaXNNaW5lZCgpIHtcbiAgICAgICAgcmV0dXJuICh0aGlzLmJsb2NrSGFzaCAhPSBudWxsKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogIFJldHVybnMgdHJ1ZSBpZiB0aGUgdHJhbnNhY3Rpb24gaXMgYSBsZWdhY3kgKGkuZS4gYGB0eXBlID09IDBgYClcbiAgICAgKiAgdHJhbnNhY3Rpb24uXG4gICAgICpcbiAgICAgKiAgVGhpcyBwcm92aWRlcyBhIFR5cGUgR3VhcmQgdGhhdCB0aGlzIHRyYW5zYWN0aW9uIHdpbGwgaGF2ZVxuICAgICAqICB0aGUgYGBudWxsYGAtbmVzcyBmb3IgaGFyZGZvcmstc3BlY2lmaWMgcHJvcGVydGllcyBzZXQgY29ycmVjdGx5LlxuICAgICAqL1xuICAgIGlzTGVnYWN5KCkge1xuICAgICAgICByZXR1cm4gKHRoaXMudHlwZSA9PT0gMCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqICBSZXR1cm5zIHRydWUgaWYgdGhlIHRyYW5zYWN0aW9uIGlzIGEgQmVybGluIChpLmUuIGBgdHlwZSA9PSAxYGApXG4gICAgICogIHRyYW5zYWN0aW9uLiBTZWUgW1tsaW5rLWVpcC0yMDcwXV0uXG4gICAgICpcbiAgICAgKiAgVGhpcyBwcm92aWRlcyBhIFR5cGUgR3VhcmQgdGhhdCB0aGlzIHRyYW5zYWN0aW9uIHdpbGwgaGF2ZVxuICAgICAqICB0aGUgYGBudWxsYGAtbmVzcyBmb3IgaGFyZGZvcmstc3BlY2lmaWMgcHJvcGVydGllcyBzZXQgY29ycmVjdGx5LlxuICAgICAqL1xuICAgIGlzQmVybGluKCkge1xuICAgICAgICByZXR1cm4gKHRoaXMudHlwZSA9PT0gMSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqICBSZXR1cm5zIHRydWUgaWYgdGhlIHRyYW5zYWN0aW9uIGlzIGEgTG9uZG9uIChpLmUuIGBgdHlwZSA9PSAyYGApXG4gICAgICogIHRyYW5zYWN0aW9uLiBTZWUgW1tsaW5rLWVpcC0xNTU5XV0uXG4gICAgICpcbiAgICAgKiAgVGhpcyBwcm92aWRlcyBhIFR5cGUgR3VhcmQgdGhhdCB0aGlzIHRyYW5zYWN0aW9uIHdpbGwgaGF2ZVxuICAgICAqICB0aGUgYGBudWxsYGAtbmVzcyBmb3IgaGFyZGZvcmstc3BlY2lmaWMgcHJvcGVydGllcyBzZXQgY29ycmVjdGx5LlxuICAgICAqL1xuICAgIGlzTG9uZG9uKCkge1xuICAgICAgICByZXR1cm4gKHRoaXMudHlwZSA9PT0gMik7XG4gICAgfVxuICAgIC8qKlxuICAgICAqICBSZXR1cm5zIHRydWUgaWYgaHRlIH
26774RyYW5zYWN0aW9uIGlzIGEgQ2FuY3VuIChpLmUuIGBgdHlwZSA9PSAzYGApXG4gICAgICogIHRyYW5zYWN0aW9uLiBTZWUgW1tsaW5rLWVpcC00ODQ0XV0uXG4gICAgICovXG4gICAgaXNDYW5jdW4oKSB7XG4gICAgICAgIHJldHVybiAodGhpcy50eXBlID09PSAzKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogIFJldHVybnMgYSBmaWx0ZXIgd2hpY2ggY2FuIGJlIHVzZWQgdG8gbGlzdGVuIGZvciBvcnBoYW4gZXZlbnRzXG4gICAgICogIHRoYXQgZXZpY3QgdGhpcyB0cmFuc2FjdGlvbi5cbiAgICAgKi9cbiAgICByZW1vdmVkRXZlbnQoKSB7XG4gICAgICAgIGFzc2VydCh0aGlzLmlzTWluZWQoKSwgXCJ1bm1pbmVkIHRyYW5zYWN0aW9uIGNhbm90IGJlIG9ycGhhbmVkXCIsIFwiVU5TVVBQT1JURURfT1BFUkFUSU9OXCIsIHsgb3BlcmF0aW9uOiBcInJlbW92ZUV2ZW50KClcIiB9KTtcbiAgICAgICAgcmV0dXJuIGNyZWF0ZVJlbW92ZWRUcmFuc2FjdGlvbkZpbHRlcih0aGlzKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogIFJldHVybnMgYSBmaWx0ZXIgd2hpY2ggY2FuIGJlIHVzZWQgdG8gbGlzdGVuIGZvciBvcnBoYW4gZXZlbnRzXG4gICAgICogIHRoYXQgcmUtb3JkZXIgdGhpcyBldmVudCBhZ2FpbnN0ICUlb3RoZXIlJS5cbiAgICAgKi9cbiAgICByZW9yZGVyZWRFdmVudChvdGhlcikge1xuICAgICAgICBhc3NlcnQodGhpcy5pc01pbmVkKCksIFwidW5taW5lZCB0cmFuc2FjdGlvbiBjYW5vdCBiZSBvcnBoYW5lZFwiLCBcIlVOU1VQUE9SVEVEX09QRVJBVElPTlwiLCB7IG9wZXJhdGlvbjogXCJyZW1vdmVFdmVudCgpXCIgfSk7XG4gICAgICAgIGFzc2VydCghb3RoZXIgfHwgb3RoZXIuaXNNaW5lZCgpLCBcInVubWluZWQgJ290aGVyJyB0cmFuc2FjdGlvbiBjYW5vdCBiZSBvcnBoYW5lZFwiLCBcIlVOU1VQUE9SVEVEX09QRVJBVElPTlwiLCB7IG9wZXJhdGlvbjogXCJyZW1vdmVFdmVudCgpXCIgfSk7XG4gICAgICAgIHJldHVybiBjcmVhdGVSZW9yZGVyZWRUcmFuc2FjdGlvbkZpbHRlcih0aGlzLCBvdGhlcik7XG4gICAgfVxuICAgIC8qKlxuICAgICAqICBSZXR1cm5zIGEgbmV3IFRyYW5zYWN0aW9uUmVzcG9uc2UgaW5zdGFuY2Ugd2hpY2ggaGFzIHRoZSBhYmlsaXR5IHRvXG4gICAgICogIGRldGVjdCAoYW5kIHRocm93IGFuIGVycm9yKSBpZiB0aGUgdHJhbnNhY3Rpb24gaXMgcmVwbGFjZWQsIHdoaWNoXG4gICAgICogIHdpbGwgYmVnaW4gc2Nhbm5pbmcgYXQgJSVzdGFydEJsb2NrJSUuXG4gICAgICpcbiAgICAgKiAgVGhpcyBzaG91bGQgZ2VuZXJhbGx5IG5vdCBiZSB1c2VkIGJ5IGRldmVsb3BlcnMgYW5kIGlzIGludGVuZGVkXG4gICAgICogIHByaW1hcmlseSBmb3IgaW50ZXJuYWwgdXNlLiBTZXR0aW5nIGFuIGluY29ycmVjdCAlJXN0YXJ0QmxvY2slJSBjYW5cbiAgICAgKiAgaGF2ZSBkZXZhc3RhdGluZyBwZXJmb3JtYW5jZSBjb25zZXF1ZW5jZXMgaWYgdXNlZCBpbmNvcnJlY3RseS5cbiAgICAgKi9cbiAgICByZXBsYWNlYWJsZVRyYW5zYWN0aW9uKHN0YXJ0QmxvY2spIHtcbiAgICAgICAgYXNzZXJ0QXJndW1lbnQoTnVtYmVyLmlzSW50ZWdlcihzdGFydEJsb2NrKSAmJiBzdGFydEJsb2NrID49IDAsIFwiaW52YWxpZCBzdGFydEJsb2NrXCIsIFwic3RhcnRCbG9ja1wiLCBzdGFydEJsb2NrKTtcbiAgICAgICAgY29uc3QgdHggPSBuZXcgVHJhbnNhY3Rpb25SZXNwb25zZSh0aGlzLCB0aGlzLnByb3ZpZGVyKTtcbiAgICAgICAgdHguI3N0YXJ0QmxvY2sgPSBzdGFydEJsb2NrO1xuICAgICAgICByZXR1cm4gdHg7XG4gICAgfVxufVxuZnVuY3Rpb24gY3JlYXRlT3JwaGFuZWRCbG9ja0ZpbHRlcihibG9jaykge1xuICAgIHJldHVybiB7IG9ycGhhbjogXCJkcm9wLWJsb2NrXCIsIGhhc2g6IGJsb2NrLmhhc2gsIG51bWJlcjogYmxvY2subnVtYmVyIH07XG59XG5mdW5jdGlvbiBjcmVhdGVSZW9yZGVyZWRUcmFuc2FjdGlvbkZpbHRlcih0eCwgb3RoZXIpIHtcbiAgICByZXR1cm4geyBvcnBoYW46IFwicmVvcmRlci10cmFuc2FjdGlvblwiLCB0eCwgb3RoZXIgfTtcbn1cbmZ1bmN0aW9uIGNyZWF0ZVJlbW92ZWRUcmFuc2FjdGlvbkZpbHRlcih0eCkge1xuICAgIHJldHVybiB7IG9ycGhhbjogXCJkcm9wLXRyYW5zYWN0aW9uXCIsIHR4IH07XG59XG5mdW5jdGlvbiBjcmVhdGVSZW1vdmVkTG9nRmlsdGVyKGxvZykge1xuICAgIHJldHVybiB7IG9ycGhhbjogXCJkcm9wLWxvZ1wiLCBsb2c6IHtcbiAgICAgICAgICAgIHRyYW5zYWN0aW9uSGFzaDogbG9nLnRyYW5zYWN0aW9uSGFzaCxcbiAgICAgICAgICAgIGJsb2NrSGFzaDogbG9nLmJsb2NrSGFzaCxcbiAgICAgICAgICAgIGJsb2NrTnVtYmVyOiBsb2cuYmxvY2tOdW1iZXIsXG4gICAgICAgICAgICBhZGRyZXNzOiBsb2cuYWRkcmVzcyxcbiAgICAgICAgICAgIGRhdGE6IGxvZy5kYXRhLFxuICAgICAgICAgICAgdG9waWNzOiBPYmplY3QuZnJlZXplKGxvZy50b3BpY3Muc2xpY2UoKSksXG4gICAgICAgICAgICBpbmRleDogbG9nLmluZGV4XG4gICAgICAgIH0gfTtcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXByb3ZpZGVyLmpzLm1hcCIsIi8vIGltcG9ydCBmcm9tIHByb3ZpZGVyLnRzIGluc3RlYWQgb2YgaW5kZXgudHMgdG8gcHJldmVudCBjaXJjdWxhciBkZXBcbi8vIGZyb20gRXRoZXJzY2FuUHJvdmlkZXJcbmltcG9ydCB7IExvZywgVHJhbnNhY3Rpb25SZWNlaXB0LCBUcmFuc2FjdGlvblJlc3BvbnNlIH0gZnJvbSBcIi4uL3Byb3ZpZGVycy9wcm92aWRlci5qc1wiO1xuaW1wb3J0IHsgZGVmaW5lUHJvcGVydGllcywgRXZlbnRQYXlsb2FkIH0gZnJvbSBcIi4uL3V0aWxzL2luZGV4LmpzXCI7XG4vKipcbiAqICBBbiAqKkV2ZW50TG9nKiogY29udGFpbnMgYWRkaXRpb25hbCBwcm9wZXJ0aWVzIHBhcnNlZCBmcm9tIHRoZSBbW0xvZ11dLlxuICovXG5leHBvcnQgY2xhc3MgRXZlbnRMb2cgZXh0ZW5kcyBMb2cge1xuICAgIC8qKlxuICAgICAqICBUaGUgQ29udHJhY3QgSW50ZXJmYWNlLlxuICAgICAqL1xuICAgIGludGVyZmFjZTtcbiAgICAvKipcbiAgICAgKiAgVGhlIG1hdGNoaW5nIGV2ZW50LlxuICAgICAqL1xuICAgIGZyYWdtZW50O1xuICAgIC8qKlxuICAgICAqICBUaGUgcGFyc2VkIGFyZ3VtZW50cyBwYXNzZWQgdG8gdGhlIGV2ZW50IGJ5IGBgZW1pdGBgLlxuICAgICAqL1xuICAgIGFyZ3M7XG4gICAgLyoqXG4gICAgICogQF9pZ25vcmU6XG4gICAgICovXG4gICAgY29uc3RydWN0b3IobG9nLCBpZmFjZSwgZnJhZ21lbnQpIHtcbiAgICAgICAgc3VwZXIobG9nLCBsb2cucHJvdmlkZXIpO1xuICAgICAgICBjb25zdCBhcmdzID0gaWZhY2UuZGVjb2RlRXZlbnRMb2coZnJhZ21lbnQsIGxvZy5kYXRhLCBsb2cudG9waWNzKTtcbiAgICAgICAgZGVmaW5lUHJvcGVydGllcyh0aGlzLCB7
26774IGFyZ3MsIGZyYWdtZW50LCBpbnRlcmZhY2U6IGlmYWNlIH0pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiAgVGhlIG5hbWUgb2YgdGhlIGV2ZW50LlxuICAgICAqL1xuICAgIGdldCBldmVudE5hbWUoKSB7IHJldHVybiB0aGlzLmZyYWdtZW50Lm5hbWU7IH1cbiAgICAvKipcbiAgICAgKiAgVGhlIHNpZ25hdHVyZSBvZiB0aGUgZXZlbnQuXG4gICAgICovXG4gICAgZ2V0IGV2ZW50U2lnbmF0dXJlKCkgeyByZXR1cm4gdGhpcy5mcmFnbWVudC5mb3JtYXQoKTsgfVxufVxuLyoqXG4gKiAgQW4gKipFdmVudExvZyoqIGNvbnRhaW5zIGFkZGl0aW9uYWwgcHJvcGVydGllcyBwYXJzZWQgZnJvbSB0aGUgW1tMb2ddXS5cbiAqL1xuZXhwb3J0IGNsYXNzIFVuZGVjb2RlZEV2ZW50TG9nIGV4dGVuZHMgTG9nIHtcbiAgICAvKipcbiAgICAgKiAgVGhlIGVycm9yIGVuY291bnRlZCB3aGVuIHRyeWluZyB0byBkZWNvZGUgdGhlIGxvZy5cbiAgICAgKi9cbiAgICBlcnJvcjtcbiAgICAvKipcbiAgICAgKiBAX2lnbm9yZTpcbiAgICAgKi9cbiAgICBjb25zdHJ1Y3Rvcihsb2csIGVycm9yKSB7XG4gICAgICAgIHN1cGVyKGxvZywgbG9nLnByb3ZpZGVyKTtcbiAgICAgICAgZGVmaW5lUHJvcGVydGllcyh0aGlzLCB7IGVycm9yIH0pO1xuICAgIH1cbn1cbi8qKlxuICogIEEgKipDb250cmFjdFRyYW5zYWN0aW9uUmVjZWlwdCoqIGluY2x1ZGVzIHRoZSBwYXJzZWQgbG9ncyBmcm9tIGFcbiAqICBbW1RyYW5zYWN0aW9uUmVjZWlwdF1dLlxuICovXG5leHBvcnQgY2xhc3MgQ29udHJhY3RUcmFuc2FjdGlvblJlY2VpcHQgZXh0ZW5kcyBUcmFuc2FjdGlvblJlY2VpcHQge1xuICAgICNpZmFjZTtcbiAgICAvKipcbiAgICAgKiAgQF9pZ25vcmU6XG4gICAgICovXG4gICAgY29uc3RydWN0b3IoaWZhY2UsIHByb3ZpZGVyLCB0eCkge1xuICAgICAgICBzdXBlcih0eCwgcHJvdmlkZXIpO1xuICAgICAgICB0aGlzLiNpZmFjZSA9IGlmYWNlO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiAgVGhlIHBhcnNlZCBsb2dzIGZvciBhbnkgW1tMb2ddXSB3aGljaCBoYXMgYSBtYXRjaGluZyBldmVudCBpbiB0aGVcbiAgICAgKiAgQ29udHJhY3QgQUJJLlxuICAgICAqL1xuICAgIGdldCBsb2dzKCkge1xuICAgICAgICByZXR1cm4gc3VwZXIubG9ncy5tYXAoKGxvZykgPT4ge1xuICAgICAgICAgICAgY29uc3QgZnJhZ21lbnQgPSBsb2cudG9waWNzLmxlbmd0aCA/IHRoaXMuI2lmYWNlLmdldEV2ZW50KGxvZy50b3BpY3NbMF0pIDogbnVsbDtcbiAgICAgICAgICAgIGlmIChmcmFnbWVudCkge1xuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgRXZlbnRMb2cobG9nLCB0aGlzLiNpZmFjZSwgZnJhZ21lbnQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBVbmRlY29kZWRFdmVudExvZyhsb2csIGVycm9yKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gbG9nO1xuICAgICAgICB9KTtcbiAgICB9XG59XG4vKipcbiAqICBBICoqQ29udHJhY3RUcmFuc2FjdGlvblJlc3BvbnNlKiogd2lsbCByZXR1cm4gYVxuICogIFtbQ29udHJhY3RUcmFuc2FjdGlvblJlY2VpcHRdXSB3aGVuIHdhaXRlZCBvbi5cbiAqL1xuZXhwb3J0IGNsYXNzIENvbnRyYWN0VHJhbnNhY3Rpb25SZXNwb25zZSBleHRlbmRzIFRyYW5zYWN0aW9uUmVzcG9uc2Uge1xuICAgICNpZmFjZTtcbiAgICAvKipcbiAgICAgKiAgQF9pZ25vcmU6XG4gICAgICovXG4gICAgY29uc3RydWN0b3IoaWZhY2UsIHByb3ZpZGVyLCB0eCkge1xuICAgICAgICBzdXBlcih0eCwgcHJvdmlkZXIpO1xuICAgICAgICB0aGlzLiNpZmFjZSA9IGlmYWNlO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiAgUmVzb2x2ZXMgb25jZSB0aGlzIHRyYW5zYWN0aW9uIGhhcyBiZWVuIG1pbmVkIGFuZCBoYXNcbiAgICAgKiAgJSVjb25maXJtcyUlIGJsb2NrcyBpbmNsdWRpbmcgaXQgKGRlZmF1bHQ6IGBgMWBgKSB3aXRoIGFuXG4gICAgICogIG9wdGlvbmFsICUldGltZW91dCUlLlxuICAgICAqXG4gICAgICogIFRoaXMgY2FuIHJlc29sdmUgdG8gYGBudWxsYGAgb25seSBpZiAlJWNvbmZpcm1zJSUgaXMgYGAwYGBcbiAgICAgKiAgYW5kIHRoZSB0cmFuc2FjdGlvbiBoYXMgbm90IGJlZW4gbWluZWQsIG90aGVyd2lzZSB0aGlzIHdpbGxcbiAgICAgKiAgd2FpdCB1bnRpbCBlbm91Z2ggY29uZmlybWF0aW9ucyBoYXZlIGNvbXBsZXRlZC5cbiAgICAgKi9cbiAgICBhc3luYyB3YWl0KGNvbmZpcm1zLCB0aW1lb3V0KSB7XG4gICAgICAgIGNvbnN0IHJlY2VpcHQgPSBhd2FpdCBzdXBlci53YWl0KGNvbmZpcm1zLCB0aW1lb3V0KTtcbiAgICAgICAgaWYgKHJlY2VpcHQgPT0gbnVsbCkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG5ldyBDb250cmFjdFRyYW5zYWN0aW9uUmVjZWlwdCh0aGlzLiNpZmFjZSwgdGhpcy5wcm92aWRlciwgcmVjZWlwdCk7XG4gICAgfVxufVxuLyoqXG4gKiAgQSAqKkNvbnRyYWN0VW5rbm93bkV2ZW50UGF5bG9hZCoqIGlzIGluY2x1ZGVkIGFzIHRoZSBsYXN0IHBhcmFtZXRlciB0b1xuICogIENvbnRyYWN0IEV2ZW50cyB3aGVuIHRoZSBldmVudCBkb2VzIG5vdCBtYXRjaCBhbnkgZXZlbnRzIGluIHRoZSBBQkkuXG4gKi9cbmV4cG9ydCBjbGFzcyBDb250cmFjdFVua25vd25FdmVudFBheWxvYWQgZXh0ZW5kcyBFdmVudFBheWxvYWQge1xuICAgIC8qKlxuICAgICAqICBUaGUgbG9nIHdpdGggbm8gbWF0Y2hpbmcgZXZlbnRzLlxuICAgICAqL1xuICAgIGxvZztcbiAgICAvKipcbiAgICAgKiAgQF9ldmVudDpcbiAgICAgKi9cbiAgICBjb25zdHJ1Y3Rvcihjb250cmFjdCwgbGlzdGVuZXIsIGZpbHRlciwgbG9nKSB7XG4gICAgICAgIHN1cGVyKGNvbnRyYWN0LCBsaXN0ZW5lciwgZmlsdGVyKTtcbiAgICAgICAgZGVmaW5lUHJvcGVydGllcyh0aGlzLCB7IGxvZyB9KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogIFJlc29sdmVzIHRvIHRoZSBibG9jayB0aGUgZXZlbnQgb2NjdXJlZCBpbi5cbiAgICAgKi9cbiAgICBhc3luYyBnZXRCbG9jaygpIHtcbiAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMubG9nLmdldEJsb2NrKCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqICBSZXNvbHZlcyB0byB0aGUgdHJhbnNhY3Rpb24gdGhlIGV2ZW50IG9jY3VyZWQgaW4uXG4gICAgICovXG4gICAgYXN5bmMgZ2V0VHJhbnNhY3Rpb24oKSB7XG4gICAgICAgI
26774HJldHVybiBhd2FpdCB0aGlzLmxvZy5nZXRUcmFuc2FjdGlvbigpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiAgUmVzb2x2ZXMgdG8gdGhlIHRyYW5zYWN0aW9uIHJlY2VpcHQgdGhlIGV2ZW50IG9jY3VyZWQgaW4uXG4gICAgICovXG4gICAgYXN5bmMgZ2V0VHJhbnNhY3Rpb25SZWNlaXB0KCkge1xuICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5sb2cuZ2V0VHJhbnNhY3Rpb25SZWNlaXB0KCk7XG4gICAgfVxufVxuLyoqXG4gKiAgQSAqKkNvbnRyYWN0RXZlbnRQYXlsb2FkKiogaXMgaW5jbHVkZWQgYXMgdGhlIGxhc3QgcGFyYW1ldGVyIHRvXG4gKiAgQ29udHJhY3QgRXZlbnRzIHdoZW4gdGhlIGV2ZW50IGlzIGtub3duLlxuICovXG5leHBvcnQgY2xhc3MgQ29udHJhY3RFdmVudFBheWxvYWQgZXh0ZW5kcyBDb250cmFjdFVua25vd25FdmVudFBheWxvYWQge1xuICAgIC8qKlxuICAgICAqICBAX2lnbm9yZTpcbiAgICAgKi9cbiAgICBjb25zdHJ1Y3Rvcihjb250cmFjdCwgbGlzdGVuZXIsIGZpbHRlciwgZnJhZ21lbnQsIF9sb2cpIHtcbiAgICAgICAgc3VwZXIoY29udHJhY3QsIGxpc3RlbmVyLCBmaWx0ZXIsIG5ldyBFdmVudExvZyhfbG9nLCBjb250cmFjdC5pbnRlcmZhY2UsIGZyYWdtZW50KSk7XG4gICAgICAgIGNvbnN0IGFyZ3MgPSBjb250cmFjdC5pbnRlcmZhY2UuZGVjb2RlRXZlbnRMb2coZnJhZ21lbnQsIHRoaXMubG9nLmRhdGEsIHRoaXMubG9nLnRvcGljcyk7XG4gICAgICAgIGRlZmluZVByb3BlcnRpZXModGhpcywgeyBhcmdzLCBmcmFnbWVudCB9KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogIFRoZSBldmVudCBuYW1lLlxuICAgICAqL1xuICAgIGdldCBldmVudE5hbWUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmZyYWdtZW50Lm5hbWU7XG4gICAgfVxuICAgIC8qKlxuICAgICAqICBUaGUgZXZlbnQgc2lnbmF0dXJlLlxuICAgICAqL1xuICAgIGdldCBldmVudFNpZ25hdHVyZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZnJhZ21lbnQuZm9ybWF0KCk7XG4gICAgfVxufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9d3JhcHBlcnMuanMubWFwIiwiaW1wb3J0IHsgSW50ZXJmYWNlLCBUeXBlZCB9IGZyb20gXCIuLi9hYmkvaW5kZXguanNcIjtcbmltcG9ydCB7IGlzQWRkcmVzc2FibGUsIHJlc29sdmVBZGRyZXNzIH0gZnJvbSBcIi4uL2FkZHJlc3MvaW5kZXguanNcIjtcbi8vIGltcG9ydCBmcm9tIHByb3ZpZGVyLnRzIGluc3RlYWQgb2YgaW5kZXgudHMgdG8gcHJldmVudCBjaXJjdWxhciBkZXBcbi8vIGZyb20gRXRoZXJzY2FuUHJvdmlkZXJcbmltcG9ydCB7IGNvcHlSZXF1ZXN0LCBMb2cgfSBmcm9tIFwiLi4vcHJvdmlkZXJzL3Byb3ZpZGVyLmpzXCI7XG5pbXBvcnQgeyBkZWZpbmVQcm9wZXJ0aWVzLCBnZXRCaWdJbnQsIGlzQ2FsbEV4Y2VwdGlvbiwgaXNIZXhTdHJpbmcsIHJlc29sdmVQcm9wZXJ0aWVzLCBpc0Vycm9yLCBtYWtlRXJyb3IsIGFzc2VydCwgYXNzZXJ0QXJndW1lbnQgfSBmcm9tIFwiLi4vdXRpbHMvaW5kZXguanNcIjtcbmltcG9ydCB7IENvbnRyYWN0RXZlbnRQYXlsb2FkLCBDb250cmFjdFVua25vd25FdmVudFBheWxvYWQsIENvbnRyYWN0VHJhbnNhY3Rpb25SZXNwb25zZSwgRXZlbnRMb2csIFVuZGVjb2RlZEV2ZW50TG9nIH0gZnJvbSBcIi4vd3JhcHBlcnMuanNcIjtcbmNvbnN0IEJOXzAgPSBCaWdJbnQoMCk7XG5mdW5jdGlvbiBjYW5DYWxsKHZhbHVlKSB7XG4gICAgcmV0dXJuICh2YWx1ZSAmJiB0eXBlb2YgKHZhbHVlLmNhbGwpID09PSBcImZ1bmN0aW9uXCIpO1xufVxuZnVuY3Rpb24gY2FuRXN0aW1hdGUodmFsdWUpIHtcbiAgICByZXR1cm4gKHZhbHVlICYmIHR5cGVvZiAodmFsdWUuZXN0aW1hdGVHYXMpID09PSBcImZ1bmN0aW9uXCIpO1xufVxuZnVuY3Rpb24gY2FuUmVzb2x2ZSh2YWx1ZSkge1xuICAgIHJldHVybiAodmFsdWUgJiYgdHlwZW9mICh2YWx1ZS5yZXNvbHZlTmFtZSkgPT09IFwiZnVuY3Rpb25cIik7XG59XG5mdW5jdGlvbiBjYW5TZW5kKHZhbHVlKSB7XG4gICAgcmV0dXJuICh2YWx1ZSAmJiB0eXBlb2YgKHZhbHVlLnNlbmRUcmFuc2FjdGlvbikgPT09IFwiZnVuY3Rpb25cIik7XG59XG5mdW5jdGlvbiBnZXRSZXNvbHZlcih2YWx1ZSkge1xuICAgIGlmICh2YWx1ZSAhPSBudWxsKSB7XG4gICAgICAgIGlmIChjYW5SZXNvbHZlKHZhbHVlKSkge1xuICAgICAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgICAgICB9XG4gICAgICAgIGlmICh2YWx1ZS5wcm92aWRlcikge1xuICAgICAgICAgICAgcmV0dXJuIHZhbHVlLnByb3ZpZGVyO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiB1bmRlZmluZWQ7XG59XG5jbGFzcyBQcmVwYXJlZFRvcGljRmlsdGVyIHtcbiAgICAjZmlsdGVyO1xuICAgIGZyYWdtZW50O1xuICAgIGNvbnN0cnVjdG9yKGNvbnRyYWN0LCBmcmFnbWVudCwgYXJncykge1xuICAgICAgICBkZWZpbmVQcm9wZXJ0aWVzKHRoaXMsIHsgZnJhZ21lbnQgfSk7XG4gICAgICAgIGlmIChmcmFnbWVudC5pbnB1dHMubGVuZ3RoIDwgYXJncy5sZW5ndGgpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcInRvbyBtYW55IGFyZ3VtZW50c1wiKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBSZWN1cnNpdmVseSBkZXNjZW5kIGludG8gYXJncyBhbmQgcmVzb2x2ZSBhbnkgYWRkcmVzc2VzXG4gICAgICAgIGNvbnN0IHJ1bm5lciA9IGdldFJ1bm5lcihjb250cmFjdC5ydW5uZXIsIFwicmVzb2x2ZU5hbWVcIik7XG4gICAgICAgIGNvbnN0IHJlc29sdmVyID0gY2FuUmVzb2x2ZShydW5uZXIpID8gcnVubmVyIDogbnVsbDtcbiAgICAgICAgdGhpcy4jZmlsdGVyID0gKGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIGNvbnN0IHJlc29sdmVkQXJncyA9IGF3YWl0IFByb21pc2UuYWxsKGZyYWdtZW50LmlucHV0cy5tYXAoKHBhcmFtLCBpbmRleCkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IGFyZyA9IGFyZ3NbaW5kZXhdO1xuICAgICAgICAgICAgICAgIGlmIChhcmcgPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIHBhcmFtLndhbGtBc3luYyhhcmdzW2luZGV4XSwgKHR5cGUsIHZhbHVlKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0eXBlID09PSBcImFkZHJlc3NcIikge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFByb21pc2UuYWxsKHZhbHVlLm1hcCgodikgPT4gcmVzb2x2ZUFkZHJl
26774c3ModiwgcmVzb2x2ZXIpKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzb2x2ZUFkZHJlc3ModmFsdWUsIHJlc29sdmVyKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgICAgICByZXR1cm4gY29udHJhY3QuaW50ZXJmYWNlLmVuY29kZUZpbHRlclRvcGljcyhmcmFnbWVudCwgcmVzb2x2ZWRBcmdzKTtcbiAgICAgICAgfSkoKTtcbiAgICB9XG4gICAgZ2V0VG9waWNGaWx0ZXIoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLiNmaWx0ZXI7XG4gICAgfVxufVxuLy8gQSA9IEFyZ3VtZW50cyBwYXNzZWQgaW4gYXMgYSB0dXBsZVxuLy8gUiA9IFRoZSByZXN1bHQgdHlwZSBvZiB0aGUgY2FsbCAoaS5lLiBpZiBvbmx5IG9uZSByZXR1cm4gdHlwZSxcbi8vICAgICB0aGUgcXVhbGlmaWVkIHR5cGUsIG90aGVyd2lzZSBSZXN1bHQpXG4vLyBEID0gVGhlIHR5cGUgdGhlIGRlZmF1bHQgY2FsbCB3aWxsIHJldHVybiAoaS5lLiBSIGZvciB2aWV3L3B1cmUsXG4vLyAgICAgVHJhbnNhY3Rpb25SZXNwb25zZSBvdGhlcndpc2UpXG4vL2V4cG9ydCBpbnRlcmZhY2UgQ29udHJhY3RNZXRob2Q8QSBleHRlbmRzIEFycmF5PGFueT4gPSBBcnJheTxhbnk+LCBSID0gYW55LCBEIGV4dGVuZHMgUiB8IENvbnRyYWN0VHJhbnNhY3Rpb25SZXNwb25zZSA9IENvbnRyYWN0VHJhbnNhY3Rpb25SZXNwb25zZT4ge1xuZnVuY3Rpb24gZ2V0UnVubmVyKHZhbHVlLCBmZWF0dXJlKSB7XG4gICAgaWYgKHZhbHVlID09IG51bGwpIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIGlmICh0eXBlb2YgKHZhbHVlW2ZlYXR1cmVdKSA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICB9XG4gICAgaWYgKHZhbHVlLnByb3ZpZGVyICYmIHR5cGVvZiAodmFsdWUucHJvdmlkZXJbZmVhdHVyZV0pID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgcmV0dXJuIHZhbHVlLnByb3ZpZGVyO1xuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbn1cbmZ1bmN0aW9uIGdldFByb3ZpZGVyKHZhbHVlKSB7XG4gICAgaWYgKHZhbHVlID09IG51bGwpIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIHJldHVybiB2YWx1ZS5wcm92aWRlciB8fCBudWxsO1xufVxuLyoqXG4gKiAgQF9pZ25vcmU6XG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBjb3B5T3ZlcnJpZGVzKGFyZywgYWxsb3dlZCkge1xuICAgIC8vIE1ha2Ugc3VyZSB0aGUgb3ZlcnJpZGVzIHBhc3NlZCBpbiBhcmUgYSB2YWxpZCBvdmVycmlkZXMgb2JqZWN0XG4gICAgY29uc3QgX292ZXJyaWRlcyA9IFR5cGVkLmRlcmVmZXJlbmNlKGFyZywgXCJvdmVycmlkZXNcIik7XG4gICAgYXNzZXJ0QXJndW1lbnQodHlwZW9mIChfb3ZlcnJpZGVzKSA9PT0gXCJvYmplY3RcIiwgXCJpbnZhbGlkIG92ZXJyaWRlcyBwYXJhbWV0ZXJcIiwgXCJvdmVycmlkZXNcIiwgYXJnKTtcbiAgICAvLyBDcmVhdGUgYSBzaGFsbG93IGNvcHkgKHdlJ2xsIGRlZXAtaWZ5IGFueXRoaW5nIG5lZWRlZCBkdXJpbmcgbm9ybWFsaXppbmcpXG4gICAgY29uc3Qgb3ZlcnJpZGVzID0gY29weVJlcXVlc3QoX292ZXJyaWRlcyk7XG4gICAgYXNzZXJ0QXJndW1lbnQob3ZlcnJpZGVzLnRvID09IG51bGwgfHwgKGFsbG93ZWQgfHwgW10pLmluZGV4T2YoXCJ0b1wiKSA+PSAwLCBcImNhbm5vdCBvdmVycmlkZSB0b1wiLCBcIm92ZXJyaWRlcy50b1wiLCBvdmVycmlkZXMudG8pO1xuICAgIGFzc2VydEFyZ3VtZW50KG92ZXJyaWRlcy5kYXRhID09IG51bGwgfHwgKGFsbG93ZWQgfHwgW10pLmluZGV4T2YoXCJkYXRhXCIpID49IDAsIFwiY2Fubm90IG92ZXJyaWRlIGRhdGFcIiwgXCJvdmVycmlkZXMuZGF0YVwiLCBvdmVycmlkZXMuZGF0YSk7XG4gICAgLy8gUmVzb2x2ZSBhbnkgZnJvbVxuICAgIGlmIChvdmVycmlkZXMuZnJvbSkge1xuICAgICAgICBvdmVycmlkZXMuZnJvbSA9IG92ZXJyaWRlcy5mcm9tO1xuICAgIH1cbiAgICByZXR1cm4gb3ZlcnJpZGVzO1xufVxuLyoqXG4gKiAgQF9pZ25vcmU6XG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiByZXNvbHZlQXJncyhfcnVubmVyLCBpbnB1dHMsIGFyZ3MpIHtcbiAgICAvLyBSZWN1cnNpdmVseSBkZXNjZW5kIGludG8gYXJncyBhbmQgcmVzb2x2ZSBhbnkgYWRkcmVzc2VzXG4gICAgY29uc3QgcnVubmVyID0gZ2V0UnVubmVyKF9ydW5uZXIsIFwicmVzb2x2ZU5hbWVcIik7XG4gICAgY29uc3QgcmVzb2x2ZXIgPSBjYW5SZXNvbHZlKHJ1bm5lcikgPyBydW5uZXIgOiBudWxsO1xuICAgIHJldHVybiBhd2FpdCBQcm9taXNlLmFsbChpbnB1dHMubWFwKChwYXJhbSwgaW5kZXgpID0+IHtcbiAgICAgICAgcmV0dXJuIHBhcmFtLndhbGtBc3luYyhhcmdzW2luZGV4XSwgKHR5cGUsIHZhbHVlKSA9PiB7XG4gICAgICAgICAgICB2YWx1ZSA9IFR5cGVkLmRlcmVmZXJlbmNlKHZhbHVlLCB0eXBlKTtcbiAgICAgICAgICAgIGlmICh0eXBlID09PSBcImFkZHJlc3NcIikge1xuICAgICAgICAgICAgICAgIHJldHVybiByZXNvbHZlQWRkcmVzcyh2YWx1ZSwgcmVzb2x2ZXIpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgICAgICB9KTtcbiAgICB9KSk7XG59XG5mdW5jdGlvbiBidWlsZFdyYXBwZWRGYWxsYmFjayhjb250cmFjdCkge1xuICAgIGNvbnN0IHBvcHVsYXRlVHJhbnNhY3Rpb24gPSBhc3luYyBmdW5jdGlvbiAob3ZlcnJpZGVzKSB7XG4gICAgICAgIC8vIElmIGFuIG92ZXJyaWRlcyB3YXMgcGFzc2VkIGluLCBjb3B5IGl0IGFuZCBub3JtYWxpemUgdGhlIHZhbHVlc1xuICAgICAgICBjb25zdCB0eCA9IChhd2FpdCBjb3B5T3ZlcnJpZGVzKG92ZXJyaWRlcywgW1wiZGF0YVwiXSkpO1xuICAgICAgICB0eC50byA9IGF3YWl0IGNvbnRyYWN0LmdldEFkZHJlc3MoKTtcbiAgICAgICAgaWYgKHR4LmZyb20pIHtcbiAgICAgICAgICAgIHR4LmZyb20gPSBhd2FpdCByZXNvbHZlQWRkcmVzcyh0eC5mcm9tLCBnZXRSZXNvbHZlcihjb250cmFjdC5ydW5uZXIpKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBpZmFjZSA9IGNvbnRyYWN0LmludGVyZmFjZTtcbiAgICAgICAgY29uc3Qgbm9WYWx1ZSA9IChnZXRCaWdJbnQoKHR4LnZhbHVlIHx8IEJOXzApLCBcIm92ZXJyaWRlcy52YWx1ZVwiKSA9PT0gQk5fMCk7XG4gICAgICAgIGNvbnN0IG5vRGF0YSA9ICgodHguZGF0YSB8fCBcIjB4XCIp
26774ID09PSBcIjB4XCIpO1xuICAgICAgICBpZiAoaWZhY2UuZmFsbGJhY2sgJiYgIWlmYWNlLmZhbGxiYWNrLnBheWFibGUgJiYgaWZhY2UucmVjZWl2ZSAmJiAhbm9EYXRhICYmICFub1ZhbHVlKSB7XG4gICAgICAgICAgICBhc3NlcnRBcmd1bWVudChmYWxzZSwgXCJjYW5ub3Qgc2VuZCBkYXRhIHRvIHJlY2VpdmUgb3Igc2VuZCB2YWx1ZSB0byBub24tcGF5YWJsZSBmYWxsYmFja1wiLCBcIm92ZXJyaWRlc1wiLCBvdmVycmlkZXMpO1xuICAgICAgICB9XG4gICAgICAgIGFzc2VydEFyZ3VtZW50KGlmYWNlLmZhbGxiYWNrIHx8IG5vRGF0YSwgXCJjYW5ub3Qgc2VuZCBkYXRhIHRvIHJlY2VpdmUtb25seSBjb250cmFjdFwiLCBcIm92ZXJyaWRlcy5kYXRhXCIsIHR4LmRhdGEpO1xuICAgICAgICAvLyBPbmx5IGFsbG93IHBheWFibGUgY29udHJhY3RzIHRvIHNldCBub24temVybyB2YWx1ZVxuICAgICAgICBjb25zdCBwYXlhYmxlID0gaWZhY2UucmVjZWl2ZSB8fCAoaWZhY2UuZmFsbGJhY2sgJiYgaWZhY2UuZmFsbGJhY2sucGF5YWJsZSk7XG4gICAgICAgIGFzc2VydEFyZ3VtZW50KHBheWFibGUgfHwgbm9WYWx1ZSwgXCJjYW5ub3Qgc2VuZCB2YWx1ZSB0byBub24tcGF5YWJsZSBmYWxsYmFja1wiLCBcIm92ZXJyaWRlcy52YWx1ZVwiLCB0eC52YWx1ZSk7XG4gICAgICAgIC8vIE9ubHkgYWxsb3cgZmFsbGJhY2sgY29udHJhY3RzIHRvIHNldCBub24tZW1wdHkgZGF0YVxuICAgICAgICBhc3NlcnRBcmd1bWVudChpZmFjZS5mYWxsYmFjayB8fCBub0RhdGEsIFwiY2Fubm90IHNlbmQgZGF0YSB0byByZWNlaXZlLW9ubHkgY29udHJhY3RcIiwgXCJvdmVycmlkZXMuZGF0YVwiLCB0eC5kYXRhKTtcbiAgICAgICAgcmV0dXJuIHR4O1xuICAgIH07XG4gICAgY29uc3Qgc3RhdGljQ2FsbCA9IGFzeW5jIGZ1bmN0aW9uIChvdmVycmlkZXMpIHtcbiAgICAgICAgY29uc3QgcnVubmVyID0gZ2V0UnVubmVyKGNvbnRyYWN0LnJ1bm5lciwgXCJjYWxsXCIpO1xuICAgICAgICBhc3NlcnQoY2FuQ2FsbChydW5uZXIpLCBcImNvbnRyYWN0IHJ1bm5lciBkb2VzIG5vdCBzdXBwb3J0IGNhbGxpbmdcIiwgXCJVTlNVUFBPUlRFRF9PUEVSQVRJT05cIiwgeyBvcGVyYXRpb246IFwiY2FsbFwiIH0pO1xuICAgICAgICBjb25zdCB0eCA9IGF3YWl0IHBvcHVsYXRlVHJhbnNhY3Rpb24ob3ZlcnJpZGVzKTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHJldHVybiBhd2FpdCBydW5uZXIuY2FsbCh0eCk7XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICBpZiAoaXNDYWxsRXhjZXB0aW9uKGVycm9yKSAmJiBlcnJvci5kYXRhKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgY29udHJhY3QuaW50ZXJmYWNlLm1ha2VFcnJvcihlcnJvci5kYXRhLCB0eCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgICAgfVxuICAgIH07XG4gICAgY29uc3Qgc2VuZCA9IGFzeW5jIGZ1bmN0aW9uIChvdmVycmlkZXMpIHtcbiAgICAgICAgY29uc3QgcnVubmVyID0gY29udHJhY3QucnVubmVyO1xuICAgICAgICBhc3NlcnQoY2FuU2VuZChydW5uZXIpLCBcImNvbnRyYWN0IHJ1bm5lciBkb2VzIG5vdCBzdXBwb3J0IHNlbmRpbmcgdHJhbnNhY3Rpb25zXCIsIFwiVU5TVVBQT1JURURfT1BFUkFUSU9OXCIsIHsgb3BlcmF0aW9uOiBcInNlbmRUcmFuc2FjdGlvblwiIH0pO1xuICAgICAgICBjb25zdCB0eCA9IGF3YWl0IHJ1bm5lci5zZW5kVHJhbnNhY3Rpb24oYXdhaXQgcG9wdWxhdGVUcmFuc2FjdGlvbihvdmVycmlkZXMpKTtcbiAgICAgICAgY29uc3QgcHJvdmlkZXIgPSBnZXRQcm92aWRlcihjb250cmFjdC5ydW5uZXIpO1xuICAgICAgICAvLyBAVE9ETzogdGhlIHByb3ZpZGVyIGNhbiBiZSBudWxsOyBtYWtlIGEgY3VzdG9tIGR1bW15IHByb3ZpZGVyIHRoYXQgd2lsbCB0aHJvdyBhXG4gICAgICAgIC8vIG1lYW5pbmdmdWwgZXJyb3JcbiAgICAgICAgcmV0dXJuIG5ldyBDb250cmFjdFRyYW5zYWN0aW9uUmVzcG9uc2UoY29udHJhY3QuaW50ZXJmYWNlLCBwcm92aWRlciwgdHgpO1xuICAgIH07XG4gICAgY29uc3QgZXN0aW1hdGVHYXMgPSBhc3luYyBmdW5jdGlvbiAob3ZlcnJpZGVzKSB7XG4gICAgICAgIGNvbnN0IHJ1bm5lciA9IGdldFJ1bm5lcihjb250cmFjdC5ydW5uZXIsIFwiZXN0aW1hdGVHYXNcIik7XG4gICAgICAgIGFzc2VydChjYW5Fc3RpbWF0ZShydW5uZXIpLCBcImNvbnRyYWN0IHJ1bm5lciBkb2VzIG5vdCBzdXBwb3J0IGdhcyBlc3RpbWF0aW9uXCIsIFwiVU5TVVBQT1JURURfT1BFUkFUSU9OXCIsIHsgb3BlcmF0aW9uOiBcImVzdGltYXRlR2FzXCIgfSk7XG4gICAgICAgIHJldHVybiBhd2FpdCBydW5uZXIuZXN0aW1hdGVHYXMoYXdhaXQgcG9wdWxhdGVUcmFuc2FjdGlvbihvdmVycmlkZXMpKTtcbiAgICB9O1xuICAgIGNvbnN0IG1ldGhvZCA9IGFzeW5jIChvdmVycmlkZXMpID0+IHtcbiAgICAgICAgcmV0dXJuIGF3YWl0IHNlbmQob3ZlcnJpZGVzKTtcbiAgICB9O1xuICAgIGRlZmluZVByb3BlcnRpZXMobWV0aG9kLCB7XG4gICAgICAgIF9jb250cmFjdDogY29udHJhY3QsXG4gICAgICAgIGVzdGltYXRlR2FzLFxuICAgICAgICBwb3B1bGF0ZVRyYW5zYWN0aW9uLFxuICAgICAgICBzZW5kLCBzdGF0aWNDYWxsXG4gICAgfSk7XG4gICAgcmV0dXJuIG1ldGhvZDtcbn1cbmZ1bmN0aW9uIGJ1aWxkV3JhcHBlZE1ldGhvZChjb250cmFjdCwga2V5KSB7XG4gICAgY29uc3QgZ2V0RnJhZ21lbnQgPSBmdW5jdGlvbiAoLi4uYXJncykge1xuICAgICAgICBjb25zdCBmcmFnbWVudCA9IGNvbnRyYWN0LmludGVyZmFjZS5nZXRGdW5jdGlvbihrZXksIGFyZ3MpO1xuICAgICAgICBhc3NlcnQoZnJhZ21lbnQsIFwibm8gbWF0Y2hpbmcgZnJhZ21lbnRcIiwgXCJVTlNVUFBPUlRFRF9PUEVSQVRJT05cIiwge1xuICAgICAgICAgICAgb3BlcmF0aW9uOiBcImZyYWdtZW50XCIsXG4gICAgICAgICAgICBpbmZvOiB7IGtleSwgYXJncyB9XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gZnJhZ21lbnQ7XG4gICAgfTtcbiAgICBjb25zdCBwb3B1bGF0ZVRyYW5zYWN0aW9uID0gYXN5bmMgZnVuY3Rpb24gKC4uLmFyZ3MpIHtcbiAgICAgICAgY29uc3QgZnJhZ21lbnQgPSBnZXRGcmFnbWVudCguLi5hcmdzKTtcbiAgICAgICAgLy8gSWYgYW4gb3ZlcnJpZGVzIHdhcyBwYXNzZWQgaW4sIGNvcHkgaXQgYW5kIG5vcm1hbGl6ZSB0aGUgdmFsdWVzXG4gICAgICAgIGxldCBvdmVycmlkZXMgPSB7fTtcbiAgICAgICAgaWYgKGZyYWdtZW50LmlucHV0cy5sZW5ndGggKyAxID09PSBhcmdzLmxlbmd0aCkge1xuICAgICAgICAgICAgb3ZlcnJpZGVzID0gYXdhaXQgY29weU92ZXJyaWRlcyhhcmdzLnBvcCgpKTtcbiAgICAgICAgICAgIGlmIChvdmVycmlkZXMuZnJvbSkge1xuICAgICAgICAgICAgICAgIG92ZXJyaWRlcy5mcm9tID0gYXdhaXQgcmVzb2x2ZUFkZHJl
26774c3Mob3ZlcnJpZGVzLmZyb20sIGdldFJlc29sdmVyKGNvbnRyYWN0LnJ1bm5lcikpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChmcmFnbWVudC5pbnB1dHMubGVuZ3RoICE9PSBhcmdzLmxlbmd0aCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiaW50ZXJuYWwgZXJyb3I6IGZyYWdtZW50IGlucHV0cyBkb2Vzbid0IG1hdGNoIGFyZ3VtZW50czsgc2hvdWxkIG5vdCBoYXBwZW5cIik7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgcmVzb2x2ZWRBcmdzID0gYXdhaXQgcmVzb2x2ZUFyZ3MoY29udHJhY3QucnVubmVyLCBmcmFnbWVudC5pbnB1dHMsIGFyZ3MpO1xuICAgICAgICByZXR1cm4gT2JqZWN0LmFzc2lnbih7fSwgb3ZlcnJpZGVzLCBhd2FpdCByZXNvbHZlUHJvcGVydGllcyh7XG4gICAgICAgICAgICB0bzogY29udHJhY3QuZ2V0QWRkcmVzcygpLFxuICAgICAgICAgICAgZGF0YTogY29udHJhY3QuaW50ZXJmYWNlLmVuY29kZUZ1bmN0aW9uRGF0YShmcmFnbWVudCwgcmVzb2x2ZWRBcmdzKVxuICAgICAgICB9KSk7XG4gICAgfTtcbiAgICBjb25zdCBzdGF0aWNDYWxsID0gYXN5bmMgZnVuY3Rpb24gKC4uLmFyZ3MpIHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgc3RhdGljQ2FsbFJlc3VsdCguLi5hcmdzKTtcbiAgICAgICAgaWYgKHJlc3VsdC5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgICAgIHJldHVybiByZXN1bHRbMF07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9O1xuICAgIGNvbnN0IHNlbmQgPSBhc3luYyBmdW5jdGlvbiAoLi4uYXJncykge1xuICAgICAgICBjb25zdCBydW5uZXIgPSBjb250cmFjdC5ydW5uZXI7XG4gICAgICAgIGFzc2VydChjYW5TZW5kKHJ1bm5lciksIFwiY29udHJhY3QgcnVubmVyIGRvZXMgbm90IHN1cHBvcnQgc2VuZGluZyB0cmFuc2FjdGlvbnNcIiwgXCJVTlNVUFBPUlRFRF9PUEVSQVRJT05cIiwgeyBvcGVyYXRpb246IFwic2VuZFRyYW5zYWN0aW9uXCIgfSk7XG4gICAgICAgIGNvbnN0IHR4ID0gYXdhaXQgcnVubmVyLnNlbmRUcmFuc2FjdGlvbihhd2FpdCBwb3B1bGF0ZVRyYW5zYWN0aW9uKC4uLmFyZ3MpKTtcbiAgICAgICAgY29uc3QgcHJvdmlkZXIgPSBnZXRQcm92aWRlcihjb250cmFjdC5ydW5uZXIpO1xuICAgICAgICAvLyBAVE9ETzogdGhlIHByb3ZpZGVyIGNhbiBiZSBudWxsOyBtYWtlIGEgY3VzdG9tIGR1bW15IHByb3ZpZGVyIHRoYXQgd2lsbCB0aHJvdyBhXG4gICAgICAgIC8vIG1lYW5pbmdmdWwgZXJyb3JcbiAgICAgICAgcmV0dXJuIG5ldyBDb250cmFjdFRyYW5zYWN0aW9uUmVzcG9uc2UoY29udHJhY3QuaW50ZXJmYWNlLCBwcm92aWRlciwgdHgpO1xuICAgIH07XG4gICAgY29uc3QgZXN0aW1hdGVHYXMgPSBhc3luYyBmdW5jdGlvbiAoLi4uYXJncykge1xuICAgICAgICBjb25zdCBydW5uZXIgPSBnZXRSdW5uZXIoY29udHJhY3QucnVubmVyLCBcImVzdGltYXRlR2FzXCIpO1xuICAgICAgICBhc3NlcnQoY2FuRXN0aW1hdGUocnVubmVyKSwgXCJjb250cmFjdCBydW5uZXIgZG9lcyBub3Qgc3VwcG9ydCBnYXMgZXN0aW1hdGlvblwiLCBcIlVOU1VQUE9SVEVEX09QRVJBVElPTlwiLCB7IG9wZXJhdGlvbjogXCJlc3RpbWF0ZUdhc1wiIH0pO1xuICAgICAgICByZXR1cm4gYXdhaXQgcnVubmVyLmVzdGltYXRlR2FzKGF3YWl0IHBvcHVsYXRlVHJhbnNhY3Rpb24oLi4uYXJncykpO1xuICAgIH07XG4gICAgY29uc3Qgc3RhdGljQ2FsbFJlc3VsdCA9IGFzeW5jIGZ1bmN0aW9uICguLi5hcmdzKSB7XG4gICAgICAgIGNvbnN0IHJ1bm5lciA9IGdldFJ1bm5lcihjb250cmFjdC5ydW5uZXIsIFwiY2FsbFwiKTtcbiAgICAgICAgYXNzZXJ0KGNhbkNhbGwocnVubmVyKSwgXCJjb250cmFjdCBydW5uZXIgZG9lcyBub3Qgc3VwcG9ydCBjYWxsaW5nXCIsIFwiVU5TVVBQT1JURURfT1BFUkFUSU9OXCIsIHsgb3BlcmF0aW9uOiBcImNhbGxcIiB9KTtcbiAgICAgICAgY29uc3QgdHggPSBhd2FpdCBwb3B1bGF0ZVRyYW5zYWN0aW9uKC4uLmFyZ3MpO1xuICAgICAgICBsZXQgcmVzdWx0ID0gXCIweFwiO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgcmVzdWx0ID0gYXdhaXQgcnVubmVyLmNhbGwodHgpO1xuICAgICAgICB9XG4gICAgICAgIGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgaWYgKGlzQ2FsbEV4Y2VwdGlvbihlcnJvcikgJiYgZXJyb3IuZGF0YSkge1xuICAgICAgICAgICAgICAgIHRocm93IGNvbnRyYWN0LmludGVyZmFjZS5tYWtlRXJyb3IoZXJyb3IuZGF0YSwgdHgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgZnJhZ21lbnQgPSBnZXRGcmFnbWVudCguLi5hcmdzKTtcbiAgICAgICAgcmV0dXJuIGNvbnRyYWN0LmludGVyZmFjZS5kZWNvZGVGdW5jdGlvblJlc3VsdChmcmFnbWVudCwgcmVzdWx0KTtcbiAgICB9O1xuICAgIGNvbnN0IG1ldGhvZCA9IGFzeW5jICguLi5hcmdzKSA9PiB7XG4gICAgICAgIGNvbnN0IGZyYWdtZW50ID0gZ2V0RnJhZ21lbnQoLi4uYXJncyk7XG4gICAgICAgIGlmIChmcmFnbWVudC5jb25zdGFudCkge1xuICAgICAgICAgICAgcmV0dXJuIGF3YWl0IHN0YXRpY0NhbGwoLi4uYXJncyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGF3YWl0IHNlbmQoLi4uYXJncyk7XG4gICAgfTtcbiAgICBkZWZpbmVQcm9wZXJ0aWVzKG1ldGhvZCwge1xuICAgICAgICBuYW1lOiBjb250cmFjdC5pbnRlcmZhY2UuZ2V0RnVuY3Rpb25OYW1lKGtleSksXG4gICAgICAgIF9jb250cmFjdDogY29udHJhY3QsIF9rZXk6IGtleSxcbiAgICAgICAgZ2V0RnJhZ21lbnQsXG4gICAgICAgIGVzdGltYXRlR2FzLFxuICAgICAgICBwb3B1bGF0ZVRyYW5zYWN0aW9uLFxuICAgICAgICBzZW5kLCBzdGF0aWNDYWxsLCBzdGF0aWNDYWxsUmVzdWx0LFxuICAgIH0pO1xuICAgIC8vIE9ubHkgd29ya3Mgb24gbm9uLWFtYmlndW91cyBrZXlzIChyZWZpbmVkIGZyYWdtZW50IGlzIGFsd2F5cyBub24tYW1iaWd1b3VzKVxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShtZXRob2QsIFwiZnJhZ21lbn
26774RcIiwge1xuICAgICAgICBjb25maWd1cmFibGU6IGZhbHNlLFxuICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICBnZXQ6ICgpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGZyYWdtZW50ID0gY29udHJhY3QuaW50ZXJmYWNlLmdldEZ1bmN0aW9uKGtleSk7XG4gICAgICAgICAgICBhc3NlcnQoZnJhZ21lbnQsIFwibm8gbWF0Y2hpbmcgZnJhZ21lbnRcIiwgXCJVTlNVUFBPUlRFRF9PUEVSQVRJT05cIiwge1xuICAgICAgICAgICAgICAgIG9wZXJhdGlvbjogXCJmcmFnbWVudFwiLFxuICAgICAgICAgICAgICAgIGluZm86IHsga2V5IH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgcmV0dXJuIGZyYWdtZW50O1xuICAgICAgICB9XG4gICAgfSk7XG4gICAgcmV0dXJuIG1ldGhvZDtcbn1cbmZ1bmN0aW9uIGJ1aWxkV3JhcHBlZEV2ZW50KGNvbnRyYWN0LCBrZXkpIHtcbiAgICBjb25zdCBnZXRGcmFnbWVudCA9IGZ1bmN0aW9uICguLi5hcmdzKSB7XG4gICAgICAgIGNvbnN0IGZyYWdtZW50ID0gY29udHJhY3QuaW50ZXJmYWNlLmdldEV2ZW50KGtleSwgYXJncyk7XG4gICAgICAgIGFzc2VydChmcmFnbWVudCwgXCJubyBtYXRjaGluZyBmcmFnbWVudFwiLCBcIlVOU1VQUE9SVEVEX09QRVJBVElPTlwiLCB7XG4gICAgICAgICAgICBvcGVyYXRpb246IFwiZnJhZ21lbnRcIixcbiAgICAgICAgICAgIGluZm86IHsga2V5LCBhcmdzIH1cbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiBmcmFnbWVudDtcbiAgICB9O1xuICAgIGNvbnN0IG1ldGhvZCA9IGZ1bmN0aW9uICguLi5hcmdzKSB7XG4gICAgICAgIHJldHVybiBuZXcgUHJlcGFyZWRUb3BpY0ZpbHRlcihjb250cmFjdCwgZ2V0RnJhZ21lbnQoLi4uYXJncyksIGFyZ3MpO1xuICAgIH07XG4gICAgZGVmaW5lUHJvcGVydGllcyhtZXRob2QsIHtcbiAgICAgICAgbmFtZTogY29udHJhY3QuaW50ZXJmYWNlLmdldEV2ZW50TmFtZShrZXkpLFxuICAgICAgICBfY29udHJhY3Q6IGNvbnRyYWN0LCBfa2V5OiBrZXksXG4gICAgICAgIGdldEZyYWdtZW50XG4gICAgfSk7XG4gICAgLy8gT25seSB3b3JrcyBvbiBub24tYW1iaWd1b3VzIGtleXMgKHJlZmluZWQgZnJhZ21lbnQgaXMgYWx3YXlzIG5vbi1hbWJpZ3VvdXMpXG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG1ldGhvZCwgXCJmcmFnbWVudFwiLCB7XG4gICAgICAgIGNvbmZpZ3VyYWJsZTogZmFsc2UsXG4gICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgIGdldDogKCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgZnJhZ21lbnQgPSBjb250cmFjdC5pbnRlcmZhY2UuZ2V0RXZlbnQoa2V5KTtcbiAgICAgICAgICAgIGFzc2VydChmcmFnbWVudCwgXCJubyBtYXRjaGluZyBmcmFnbWVudFwiLCBcIlVOU1VQUE9SVEVEX09QRVJBVElPTlwiLCB7XG4gICAgICAgICAgICAgICAgb3BlcmF0aW9uOiBcImZyYWdtZW50XCIsXG4gICAgICAgICAgICAgICAgaW5mbzogeyBrZXkgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICByZXR1cm4gZnJhZ21lbnQ7XG4gICAgICAgIH1cbiAgICB9KTtcbiAgICByZXR1cm4gbWV0aG9kO1xufVxuLy8gVGhlIGNvbWJpbmF0aW9uIG9mIFR5cGVTY3J5cGUsIFByaXZhdGUgRmllbGRzIGFuZCBQcm94aWVzIG1ha2VzXG4vLyB0aGUgd29ybGQgZ28gYm9vbTsgc28gd2UgaGlkZSB2YXJpYWJsZXMgd2l0aCBzb21lIHRyaWNrZXJ5IGtlZXBpbmdcbi8vIGEgc3ltYm9sIGF0dGFjaGVkIHRvIGVhY2ggQmFzZUNvbnRyYWN0IHdoaWNoIGl0cyBzdWItY2xhc3MgKGV2ZW5cbi8vIHZpYSBhIFByb3h5KSBjYW4gcmVhY2ggYW5kIHVzZSB0byBsb29rIHVwIGl0cyBpbnRlcm5hbCB2YWx1ZXMuXG5jb25zdCBpbnRlcm5hbCA9IFN5bWJvbC5mb3IoXCJfZXRoZXJzSW50ZXJuYWxfY29udHJhY3RcIik7XG5jb25zdCBpbnRlcm5hbFZhbHVlcyA9IG5ldyBXZWFrTWFwKCk7XG5mdW5jdGlvbiBzZXRJbnRlcm5hbChjb250cmFjdCwgdmFsdWVzKSB7XG4gICAgaW50ZXJuYWxWYWx1ZXMuc2V0KGNvbnRyYWN0W2ludGVybmFsXSwgdmFsdWVzKTtcbn1cbmZ1bmN0aW9uIGdldEludGVybmFsKGNvbnRyYWN0KSB7XG4gICAgcmV0dXJuIGludGVybmFsVmFsdWVzLmdldChjb250cmFjdFtpbnRlcm5hbF0pO1xufVxuZnVuY3Rpb24gaXNEZWZlcnJlZCh2YWx1ZSkge1xuICAgIHJldHVybiAodmFsdWUgJiYgdHlwZW9mICh2YWx1ZSkgPT09IFwib2JqZWN0XCIgJiYgKFwiZ2V0VG9waWNGaWx0ZXJcIiBpbiB2YWx1ZSkgJiZcbiAgICAgICAgKHR5cGVvZiAodmFsdWUuZ2V0VG9waWNGaWx0ZXIpID09PSBcImZ1bmN0aW9uXCIpICYmIHZhbHVlLmZyYWdtZW50KTtcbn1cbmFzeW5jIGZ1bmN0aW9uIGdldFN1YkluZm8oY29udHJhY3QsIGV2ZW50KSB7XG4gICAgbGV0IHRvcGljcztcbiAgICBsZXQgZnJhZ21lbnQgPSBudWxsO1xuICAgIC8vIENvbnZlcnQgbmFtZWQgZXZlbnRzIHRvIHRvcGljSGFzaCBhbmQgZ2V0IHRoZSBmcmFnbWVudCBmb3JcbiAgICAvLyBldmVudHMgd2hpY2ggbmVlZCBkZWNvbnN0cnVjdGluZy5cbiAgICBpZiAoQXJyYXkuaXNBcnJheShldmVudCkpIHtcbiAgICAgICAgY29uc3QgdG9waWNIYXNoaWZ5ID0gZnVuY3Rpb24gKG5hbWUpIHtcbiAgICAgICAgICAgIGlmIChpc0hleFN0cmluZyhuYW1lLCAzMikpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbmFtZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IGZyYWdtZW50ID0gY29udHJhY3QuaW50ZXJmYWNlLmdldEV2ZW50KG5hbWUpO1xuICAgICAgICAgICAgYXNzZXJ0QXJndW1lbnQoZnJhZ21lbnQsIFwidW5rbm93biBmcmFnbWVudFwiLCBcIm5hbWVcIiwgbmFtZSk7XG4gICAgICAgICAgICByZXR1cm4gZnJhZ21lbnQudG9waWNIYXNoO1xuICAgICAgICB9O1xuICAgICAgICAvLyBBcnJheSBvZiBUb3BpY3MgYW5kIE5hbWVzOyBlLmcuIGBbIFwiMHgxMjM0Li4uODlhYlwiLCBcIlRyYW5zZmVyKGFkZHJlc3MpXCIgXWBcbiAgICAgICAgdG9waWNzID0gZXZlbnQubWFwKChlKSA9PiB7XG4gICAgICAgICAgICBpZiAoZSA9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShlKSkge1xuICAgICAgICAgICAgICAgI
26774HJldHVybiBlLm1hcCh0b3BpY0hhc2hpZnkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHRvcGljSGFzaGlmeShlKTtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIGVsc2UgaWYgKGV2ZW50ID09PSBcIipcIikge1xuICAgICAgICB0b3BpY3MgPSBbbnVsbF07XG4gICAgfVxuICAgIGVsc2UgaWYgKHR5cGVvZiAoZXZlbnQpID09PSBcInN0cmluZ1wiKSB7XG4gICAgICAgIGlmIChpc0hleFN0cmluZyhldmVudCwgMzIpKSB7XG4gICAgICAgICAgICAvLyBUb3BpYyBIYXNoXG4gICAgICAgICAgICB0b3BpY3MgPSBbZXZlbnRdO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgLy8gTmFtZSBvciBTaWduYXR1cmU7IGUuZy4gYFwiVHJhbnNmZXJcIiwgYFwiVHJhbnNmZXIoYWRkcmVzcylcImBcbiAgICAgICAgICAgIGZyYWdtZW50ID0gY29udHJhY3QuaW50ZXJmYWNlLmdldEV2ZW50KGV2ZW50KTtcbiAgICAgICAgICAgIGFzc2VydEFyZ3VtZW50KGZyYWdtZW50LCBcInVua25vd24gZnJhZ21lbnRcIiwgXCJldmVudFwiLCBldmVudCk7XG4gICAgICAgICAgICB0b3BpY3MgPSBbZnJhZ21lbnQudG9waWNIYXNoXTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBlbHNlIGlmIChpc0RlZmVycmVkKGV2ZW50KSkge1xuICAgICAgICAvLyBEZWZlcnJlZCBUb3BpYyBGaWx0ZXI7IGUuZy4gYGNvbnRyYWN0LmZpbHRlci5UcmFuc2Zlcihmcm9tKWBcbiAgICAgICAgdG9waWNzID0gYXdhaXQgZXZlbnQuZ2V0VG9waWNGaWx0ZXIoKTtcbiAgICB9XG4gICAgZWxzZSBpZiAoXCJmcmFnbWVudFwiIGluIGV2ZW50KSB7XG4gICAgICAgIC8vIENvbnRyYWN0RXZlbnQ7IGUuZy4gYGNvbnRyYWN0LmZpbHRlci5UcmFuc2ZlcmBcbiAgICAgICAgZnJhZ21lbnQgPSBldmVudC5mcmFnbWVudDtcbiAgICAgICAgdG9waWNzID0gW2ZyYWdtZW50LnRvcGljSGFzaF07XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICBhc3NlcnRBcmd1bWVudChmYWxzZSwgXCJ1bmtub3duIGV2ZW50IG5hbWVcIiwgXCJldmVudFwiLCBldmVudCk7XG4gICAgfVxuICAgIC8vIE5vcm1hbGl6ZSB0b3BpY3MgYW5kIHNvcnQgVG9waWNTZXRzXG4gICAgdG9waWNzID0gdG9waWNzLm1hcCgodCkgPT4ge1xuICAgICAgICBpZiAodCA9PSBudWxsKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICBpZiAoQXJyYXkuaXNBcnJheSh0KSkge1xuICAgICAgICAgICAgY29uc3QgaXRlbXMgPSBBcnJheS5mcm9tKG5ldyBTZXQodC5tYXAoKHQpID0+IHQudG9Mb3dlckNhc2UoKSkpLnZhbHVlcygpKTtcbiAgICAgICAgICAgIGlmIChpdGVtcy5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gaXRlbXNbMF07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpdGVtcy5zb3J0KCk7XG4gICAgICAgICAgICByZXR1cm4gaXRlbXM7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHQudG9Mb3dlckNhc2UoKTtcbiAgICB9KTtcbiAgICBjb25zdCB0YWcgPSB0b3BpY3MubWFwKCh0KSA9PiB7XG4gICAgICAgIGlmICh0ID09IG51bGwpIHtcbiAgICAgICAgICAgIHJldHVybiBcIm51bGxcIjtcbiAgICAgICAgfVxuICAgICAgICBpZiAoQXJyYXkuaXNBcnJheSh0KSkge1xuICAgICAgICAgICAgcmV0dXJuIHQuam9pbihcInxcIik7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHQ7XG4gICAgfSkuam9pbihcIiZcIik7XG4gICAgcmV0dXJuIHsgZnJhZ21lbnQsIHRhZywgdG9waWNzIH07XG59XG5hc3luYyBmdW5jdGlvbiBoYXNTdWIoY29udHJhY3QsIGV2ZW50KSB7XG4gICAgY29uc3QgeyBzdWJzIH0gPSBnZXRJbnRlcm5hbChjb250cmFjdCk7XG4gICAgcmV0dXJuIHN1YnMuZ2V0KChhd2FpdCBnZXRTdWJJbmZvKGNvbnRyYWN0LCBldmVudCkpLnRhZykgfHwgbnVsbDtcbn1cbmFzeW5jIGZ1bmN0aW9uIGdldFN1Yihjb250cmFjdCwgb3BlcmF0aW9uLCBldmVudCkge1xuICAgIC8vIE1ha2Ugc3VyZSBvdXIgcnVubmVyIGNhbiBhY3R1YWxseSBzdWJzY3JpYmUgdG8gZXZlbnRzXG4gICAgY29uc3QgcHJvdmlkZXIgPSBnZXRQcm92aWRlcihjb250cmFjdC5ydW5uZXIpO1xuICAgIGFzc2VydChwcm92aWRlciwgXCJjb250cmFjdCBydW5uZXIgZG9lcyBub3Qgc3VwcG9ydCBzdWJzY3JpYmluZ1wiLCBcIlVOU1VQUE9SVEVEX09QRVJBVElPTlwiLCB7IG9wZXJhdGlvbiB9KTtcbiAgICBjb25zdCB7IGZyYWdtZW50LCB0YWcsIHRvcGljcyB9ID0gYXdhaXQgZ2V0U3ViSW5mbyhjb250cmFjdCwgZXZlbnQpO1xuICAgIGNvbnN0IHsgYWRkciwgc3VicyB9ID0gZ2V0SW50ZXJuYWwoY29udHJhY3QpO1xuICAgIGxldCBzdWIgPSBzdWJzLmdldCh0YWcpO1xuICAgIGlmICghc3ViKSB7XG4gICAgICAgIGNvbnN0IGFkZHJlc3MgPSAoYWRkciA/IGFkZHIgOiBjb250cmFjdCk7XG4gICAgICAgIGNvbnN0IGZpbHRlciA9IHsgYWRkcmVzcywgdG9waWNzIH07XG4gICAgICAgIGNvbnN0IGxpc3RlbmVyID0gKGxvZykgPT4ge1xuICAgICAgICAgICAgbGV0IGZvdW5kRnJhZ21lbnQgPSBmcmFnbWVudDtcbiAgICAgICAgICAgIGlmIChmb3VuZEZyYWdtZW50ID09IG51bGwpIHtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICBmb3VuZEZyYWdtZW50ID0gY29udHJhY3QuaW50ZXJmYWNlLmdldEV2ZW50KGxvZy50b3BpY3NbMF0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjYXRjaCAoZXJyb3IpIHsgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gSWYgZnJhZ21lbnQgaXMgbnVsbCwgd2UgZG8gbm90IGRlY29uc3RydWN0IHRoZSBhcmdzIHRvIGVtaXRcbiAgICAgICAgICAgIGlmIChmb3VuZEZyYWdtZW50KSB7XG4gICAgICAgICAgICAgICAgY29uc3QgX2ZvdW5kRnJhZ21lbnQgPSBmb3VuZEZyYWdtZW50O1xuICAgICAgICAgICAgICAgIGNvbnN0IGFyZ3MgPSBmcmFnbWVudCA/IGNvbnRyYWN0LmludGVyZmFjZS5kZWNvZGVFdmVudExvZyhmcmFnbWVudCwgbG9nLmRhdGEsIGxvZy50b3BpY3MpIDogW107XG4gICAgICAgICAgICAgICAgZW1pdChjb250cmFjdCwgZXZlbnQsIGFyZ3MsIChsaXN0ZW5lcikgPT4ge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IENvbnRyYWN0RXZlbnRQYXlsb2FkKGNvbnRyYWN0LCBsaXN0ZW5lciwgZXZlbnQsIF9mb3VuZEZyYWdtZW50LCBsb2cpO1xuICAgICAgICAgICAgICAgI
26774H0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgZW1pdChjb250cmFjdCwgZXZlbnQsIFtdLCAobGlzdGVuZXIpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBDb250cmFjdFVua25vd25FdmVudFBheWxvYWQoY29udHJhY3QsIGxpc3RlbmVyLCBldmVudCwgbG9nKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgICAgbGV0IHN0YXJ0aW5nID0gW107XG4gICAgICAgIGNvbnN0IHN0YXJ0ID0gKCkgPT4ge1xuICAgICAgICAgICAgaWYgKHN0YXJ0aW5nLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHN0YXJ0aW5nLnB1c2gocHJvdmlkZXIub24oZmlsdGVyLCBsaXN0ZW5lcikpO1xuICAgICAgICB9O1xuICAgICAgICBjb25zdCBzdG9wID0gYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgaWYgKHN0YXJ0aW5nLmxlbmd0aCA9PSAwKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbGV0IHN0YXJ0ZWQgPSBzdGFydGluZztcbiAgICAgICAgICAgIHN0YXJ0aW5nID0gW107XG4gICAgICAgICAgICBhd2FpdCBQcm9taXNlLmFsbChzdGFydGVkKTtcbiAgICAgICAgICAgIHByb3ZpZGVyLm9mZihmaWx0ZXIsIGxpc3RlbmVyKTtcbiAgICAgICAgfTtcbiAgICAgICAgc3ViID0geyB0YWcsIGxpc3RlbmVyczogW10sIHN0YXJ0LCBzdG9wIH07XG4gICAgICAgIHN1YnMuc2V0KHRhZywgc3ViKTtcbiAgICB9XG4gICAgcmV0dXJuIHN1Yjtcbn1cbi8vIFdlIHVzZSB0aGlzIHRvIGVuc3VyZSBvbmUgZW1pdCByZXNvbHZlcyBiZWZvcmUgZmlyaW5nIHRoZSBuZXh0IHRvXG4vLyBlbnN1cmUgY29ycmVjdCBvcmRlcmluZyAobm90ZSB0aGlzIGNhbm5vdCB0aHJvdyBhbmQganVzdCBhZGRzIHRoZVxuLy8gbm90aWNlIHRvIHRoZSBldmVudCBxdWV1IHVzaW5nIHNldFRpbWVvdXQpLlxubGV0IGxhc3RFbWl0ID0gUHJvbWlzZS5yZXNvbHZlKCk7XG5hc3luYyBmdW5jdGlvbiBfZW1pdChjb250cmFjdCwgZXZlbnQsIGFyZ3MsIHBheWxvYWRGdW5jKSB7XG4gICAgYXdhaXQgbGFzdEVtaXQ7XG4gICAgY29uc3Qgc3ViID0gYXdhaXQgaGFzU3ViKGNvbnRyYWN0LCBldmVudCk7XG4gICAgaWYgKCFzdWIpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBjb25zdCBjb3VudCA9IHN1Yi5saXN0ZW5lcnMubGVuZ3RoO1xuICAgIHN1Yi5saXN0ZW5lcnMgPSBzdWIubGlzdGVuZXJzLmZpbHRlcigoeyBsaXN0ZW5lciwgb25jZSB9KSA9PiB7XG4gICAgICAgIGNvbnN0IHBhc3NBcmdzID0gQXJyYXkuZnJvbShhcmdzKTtcbiAgICAgICAgaWYgKHBheWxvYWRGdW5jKSB7XG4gICAgICAgICAgICBwYXNzQXJncy5wdXNoKHBheWxvYWRGdW5jKG9uY2UgPyBudWxsIDogbGlzdGVuZXIpKTtcbiAgICAgICAgfVxuICAgICAgICB0cnkge1xuICAgICAgICAgICAgbGlzdGVuZXIuY2FsbChjb250cmFjdCwgLi4ucGFzc0FyZ3MpO1xuICAgICAgICB9XG4gICAgICAgIGNhdGNoIChlcnJvcikgeyB9XG4gICAgICAgIHJldHVybiAhb25jZTtcbiAgICB9KTtcbiAgICBpZiAoc3ViLmxpc3RlbmVycy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgc3ViLnN0b3AoKTtcbiAgICAgICAgZ2V0SW50ZXJuYWwoY29udHJhY3QpLnN1YnMuZGVsZXRlKHN1Yi50YWcpO1xuICAgIH1cbiAgICByZXR1cm4gKGNvdW50ID4gMCk7XG59XG5hc3luYyBmdW5jdGlvbiBlbWl0KGNvbnRyYWN0LCBldmVudCwgYXJncywgcGF5bG9hZEZ1bmMpIHtcbiAgICB0cnkge1xuICAgICAgICBhd2FpdCBsYXN0RW1pdDtcbiAgICB9XG4gICAgY2F0Y2ggKGVycm9yKSB7IH1cbiAgICBjb25zdCByZXN1bHRQcm9taXNlID0gX2VtaXQoY29udHJhY3QsIGV2ZW50LCBhcmdzLCBwYXlsb2FkRnVuYyk7XG4gICAgbGFzdEVtaXQgPSByZXN1bHRQcm9taXNlO1xuICAgIHJldHVybiBhd2FpdCByZXN1bHRQcm9taXNlO1xufVxuY29uc3QgcGFzc1Byb3BlcnRpZXMgPSBbXCJ0aGVuXCJdO1xuZXhwb3J0IGNsYXNzIEJhc2VDb250cmFjdCB7XG4gICAgLyoqXG4gICAgICogIFRoZSB0YXJnZXQgdG8gY29ubmVjdCB0by5cbiAgICAgKlxuICAgICAqICBUaGlzIGNhbiBiZSBhbiBhZGRyZXNzLCBFTlMgbmFtZSBvciBhbnkgW1tBZGRyZXNzYWJsZV1dLCBzdWNoIGFzXG4gICAgICogIGFub3RoZXIgY29udHJhY3QuIFRvIGdldCB0aGUgcmVzb2x2ZWQgYWRkcmVzcywgdXNlIHRoZSBgYGdldEFkZHJlc3NgYFxuICAgICAqICBtZXRob2QuXG4gICAgICovXG4gICAgdGFyZ2V0O1xuICAgIC8qKlxuICAgICAqICBUaGUgY29udHJhY3QgSW50ZXJmYWNlLlxuICAgICAqL1xuICAgIGludGVyZmFjZTtcbiAgICAvKipcbiAgICAgKiAgVGhlIGNvbm5lY3RlZCBydW5uZXIuIFRoaXMgaXMgZ2VuZXJhbGx5IGEgW1tQcm92aWRlcl1dIG9yIGFcbiAgICAgKiAgW1tTaWduZXJdXSwgd2hpY2ggZGljdGF0ZXMgd2hhdCBvcGVyYXRpb25zIGFyZSBzdXBwb3J0ZWQuXG4gICAgICpcbiAgICAgKiAgRm9yIGV4YW1wbGUsIGEgKipDb250cmFjdCoqIGNvbm5lY3RlZCB0byBhIFtbUHJvdmlkZXJdXSBtYXlcbiAgICAgKiAgb25seSBleGVjdXRlIHJlYWQtb25seSBvcGVyYXRpb25zLlxuICAgICAqL1xuICAgIHJ1bm5lcjtcbiAgICAvKipcbiAgICAgKiAgQWxsIHRoZSBFdmVudHMgYXZhaWxhYmxlIG9uIHRoaXMgY29udHJhY3QuXG4gICAgICovXG4gICAgZmlsdGVycztcbiAgICAvKipcbiAgICAgKiAgQF9pZ25vcmU6XG4gICAgICovXG4gICAgW2ludGVybmFsXTtcbiAgICAvKipcbiAgICAgKiAgVGhlIGZhbGxiYWNrIG9yIHJlY2VpdmUgZnVuY3Rpb24gaWYgYW55LlxuICAgICAqL1xuICAgIGZhbGxiYWNrO1xuICAgIC8qKlxuICAgICAqICBDcmVhdGVzIGEgbmV3IGNvbnRyYWN0IGNvbm5lY3RlZCB0byAlJXRhcmdldCUlIHdpdGggdGhlICUlYWJpJSUgYW5kXG4gICAgICogIG9wdGlvbmFsbHkgY29ubmVjdGVkIHRvIGEgJSVydW5uZXIlJSB0byBwZXJmb3JtIG9wZXJhdGlvbnMgb24gYmVoYWxmXG4gICAgICogIG9mLlxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yKHRhcmdldCwgYWJpLCBydW5uZXIsIF9kZXBsb3lUeCkge1xuICAgICAgICBhc3NlcnRBcmd1bWVudCh0eXBlb2YgKHRhcmdldCkgPT09IFwic3RyaW5nXCIgfHwgaXNBZGRyZXNzYWJsZSh0YXJnZXQpLCBcImludmFsaWQgdmFsdWUgZm9yIENvbnRyYWN0IHRhcmdldFwiLCBcInRhcmdldFwiLCB0YXJnZXQpO1xuICAgICAgICBpZiAocnVubmVyID09IG51bGwpIHtcbiAgICAgICAgICAgI
26774HJ1bm5lciA9IG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgaWZhY2UgPSBJbnRlcmZhY2UuZnJvbShhYmkpO1xuICAgICAgICBkZWZpbmVQcm9wZXJ0aWVzKHRoaXMsIHsgdGFyZ2V0LCBydW5uZXIsIGludGVyZmFjZTogaWZhY2UgfSk7XG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCBpbnRlcm5hbCwgeyB2YWx1ZToge30gfSk7XG4gICAgICAgIGxldCBhZGRyUHJvbWlzZTtcbiAgICAgICAgbGV0IGFkZHIgPSBudWxsO1xuICAgICAgICBsZXQgZGVwbG95VHggPSBudWxsO1xuICAgICAgICBpZiAoX2RlcGxveVR4KSB7XG4gICAgICAgICAgICBjb25zdCBwcm92aWRlciA9IGdldFByb3ZpZGVyKHJ1bm5lcik7XG4gICAgICAgICAgICAvLyBAVE9ETzogdGhlIHByb3ZpZGVyIGNhbiBiZSBudWxsOyBtYWtlIGEgY3VzdG9tIGR1bW15IHByb3ZpZGVyIHRoYXQgd2lsbCB0aHJvdyBhXG4gICAgICAgICAgICAvLyBtZWFuaW5nZnVsIGVycm9yXG4gICAgICAgICAgICBkZXBsb3lUeCA9IG5ldyBDb250cmFjdFRyYW5zYWN0aW9uUmVzcG9uc2UodGhpcy5pbnRlcmZhY2UsIHByb3ZpZGVyLCBfZGVwbG95VHgpO1xuICAgICAgICB9XG4gICAgICAgIGxldCBzdWJzID0gbmV3IE1hcCgpO1xuICAgICAgICAvLyBSZXNvbHZlIHRoZSB0YXJnZXQgYXMgdGhlIGFkZHJlc3NcbiAgICAgICAgaWYgKHR5cGVvZiAodGFyZ2V0KSA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgICAgICAgaWYgKGlzSGV4U3RyaW5nKHRhcmdldCkpIHtcbiAgICAgICAgICAgICAgICBhZGRyID0gdGFyZ2V0O1xuICAgICAgICAgICAgICAgIGFkZHJQcm9taXNlID0gUHJvbWlzZS5yZXNvbHZlKHRhcmdldCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBjb25zdCByZXNvbHZlciA9IGdldFJ1bm5lcihydW5uZXIsIFwicmVzb2x2ZU5hbWVcIik7XG4gICAgICAgICAgICAgICAgaWYgKCFjYW5SZXNvbHZlKHJlc29sdmVyKSkge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBtYWtlRXJyb3IoXCJjb250cmFjdCBydW5uZXIgZG9lcyBub3Qgc3VwcG9ydCBuYW1lIHJlc29sdXRpb25cIiwgXCJVTlNVUFBPUlRFRF9PUEVSQVRJT05cIiwge1xuICAgICAgICAgICAgICAgICAgICAgICAgb3BlcmF0aW9uOiBcInJlc29sdmVOYW1lXCJcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGFkZHJQcm9taXNlID0gcmVzb2x2ZXIucmVzb2x2ZU5hbWUodGFyZ2V0KS50aGVuKChhZGRyKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChhZGRyID09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG1ha2VFcnJvcihcImFuIEVOUyBuYW1lIHVzZWQgZm9yIGEgY29udHJhY3QgdGFyZ2V0IG11c3QgYmUgY29ycmVjdGx5IGNvbmZpZ3VyZWRcIiwgXCJVTkNPTkZJR1VSRURfTkFNRVwiLCB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6IHRhcmdldFxuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZ2V0SW50ZXJuYWwodGhpcykuYWRkciA9IGFkZHI7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBhZGRyO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgYWRkclByb21pc2UgPSB0YXJnZXQuZ2V0QWRkcmVzcygpLnRoZW4oKGFkZHIpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoYWRkciA9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlRPRE9cIik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGdldEludGVybmFsKHRoaXMpLmFkZHIgPSBhZGRyO1xuICAgICAgICAgICAgICAgIHJldHVybiBhZGRyO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gU2V0IG91ciBwcml2YXRlIHZhbHVlc1xuICAgICAgICBzZXRJbnRlcm5hbCh0aGlzLCB7IGFkZHJQcm9taXNlLCBhZGRyLCBkZXBsb3lUeCwgc3VicyB9KTtcbiAgICAgICAgLy8gQWRkIHRoZSBldmVudCBmaWx0ZXJzXG4gICAgICAgIGNvbnN0IGZpbHRlcnMgPSBuZXcgUHJveHkoe30sIHtcbiAgICAgICAgICAgIGdldDogKHRhcmdldCwgcHJvcCwgcmVjZWl2ZXIpID0+IHtcbiAgICAgICAgICAgICAgICAvLyBQYXNzIGltcG9ydGFudCBjaGVja3MgKGxpa2UgYHRoZW5gIGZvciBQcm9taXNlKSB0aHJvdWdoXG4gICAgICAgICAgICAgICAgaWYgKHR5cGVvZiAocHJvcCkgPT09IFwic3ltYm9sXCIgfHwgcGFzc1Byb3BlcnRpZXMuaW5kZXhPZihwcm9wKSA+PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBSZWZsZWN0LmdldCh0YXJnZXQsIHByb3AsIHJlY2VpdmVyKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuZ2V0RXZlbnQocHJvcCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgICAgICAgICBpZiAoIWlzRXJyb3IoZXJyb3IsIFwiSU5WQUxJRF9BUkdVTUVOVFwiKSB8fCBlcnJvci5hcmd1bWVudCAhPT0gXCJrZXlcIikge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBoYXM6ICh0YXJnZXQsIHByb3ApID0+IHtcbiAgICAgICAgICAgICAgICAvLyBQYXNzIGltcG9ydGFudCBjaGVja3MgKGxpa2UgYHRoZW5gIGZvciBQcm9taXNlKSB0aHJvdWdoXG4gICAgICAgICAgICAgICAgaWYgKHBhc3NQcm9wZXJ0aWVzLmluZGV4T2YocHJvcCkgPj0gMCkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gUmVmbGVjdC5oYXModGFyZ2V0LCBwcm9wKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIFJlZmxlY3QuaGFzKHRhcmdldCwgcHJvcCkgfHwgdGhpcy5pbnRlcmZhY2UuaGFzRXZlbnQoU3RyaW5nKHByb3ApKTtcbiAgICAgICAgICAgI
26774H1cbiAgICAgICAgfSk7XG4gICAgICAgIGRlZmluZVByb3BlcnRpZXModGhpcywgeyBmaWx0ZXJzIH0pO1xuICAgICAgICBkZWZpbmVQcm9wZXJ0aWVzKHRoaXMsIHtcbiAgICAgICAgICAgIGZhbGxiYWNrOiAoKGlmYWNlLnJlY2VpdmUgfHwgaWZhY2UuZmFsbGJhY2spID8gKGJ1aWxkV3JhcHBlZEZhbGxiYWNrKHRoaXMpKSA6IG51bGwpXG4gICAgICAgIH0pO1xuICAgICAgICAvLyBSZXR1cm4gYSBQcm94eSB0aGF0IHdpbGwgcmVzcG9uZCB0byBmdW5jdGlvbnNcbiAgICAgICAgcmV0dXJuIG5ldyBQcm94eSh0aGlzLCB7XG4gICAgICAgICAgICBnZXQ6ICh0YXJnZXQsIHByb3AsIHJlY2VpdmVyKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKHR5cGVvZiAocHJvcCkgPT09IFwic3ltYm9sXCIgfHwgcHJvcCBpbiB0YXJnZXQgfHwgcGFzc1Byb3BlcnRpZXMuaW5kZXhPZihwcm9wKSA+PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBSZWZsZWN0LmdldCh0YXJnZXQsIHByb3AsIHJlY2VpdmVyKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgLy8gVW5kZWZpbmVkIHByb3BlcnRpZXMgc2hvdWxkIHJldHVybiB1bmRlZmluZWRcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGFyZ2V0LmdldEZ1bmN0aW9uKHByb3ApO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFpc0Vycm9yKGVycm9yLCBcIklOVkFMSURfQVJHVU1FTlRcIikgfHwgZXJyb3IuYXJndW1lbnQgIT09IFwia2V5XCIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IGVycm9yO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgaGFzOiAodGFyZ2V0LCBwcm9wKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKHR5cGVvZiAocHJvcCkgPT09IFwic3ltYm9sXCIgfHwgcHJvcCBpbiB0YXJnZXQgfHwgcGFzc1Byb3BlcnRpZXMuaW5kZXhPZihwcm9wKSA+PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBSZWZsZWN0Lmhhcyh0YXJnZXQsIHByb3ApO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gdGFyZ2V0LmludGVyZmFjZS5oYXNGdW5jdGlvbihwcm9wKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqICBSZXR1cm4gYSBuZXcgQ29udHJhY3QgaW5zdGFuY2Ugd2l0aCB0aGUgc2FtZSB0YXJnZXQgYW5kIEFCSSwgYnV0XG4gICAgICogIGEgZGlmZmVyZW50ICUlcnVubmVyJSUuXG4gICAgICovXG4gICAgY29ubmVjdChydW5uZXIpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBCYXNlQ29udHJhY3QodGhpcy50YXJnZXQsIHRoaXMuaW50ZXJmYWNlLCBydW5uZXIpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiAgUmV0dXJuIGEgbmV3IENvbnRyYWN0IGluc3RhbmNlIHdpdGggdGhlIHNhbWUgQUJJIGFuZCBydW5uZXIsIGJ1dFxuICAgICAqICBhIGRpZmZlcmVudCAlJXRhcmdldCUlLlxuICAgICAqL1xuICAgIGF0dGFjaCh0YXJnZXQpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBCYXNlQ29udHJhY3QodGFyZ2V0LCB0aGlzLmludGVyZmFjZSwgdGhpcy5ydW5uZXIpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiAgUmV0dXJuIHRoZSByZXNvbHZlZCBhZGRyZXNzIG9mIHRoaXMgQ29udHJhY3QuXG4gICAgICovXG4gICAgYXN5bmMgZ2V0QWRkcmVzcygpIHsgcmV0dXJuIGF3YWl0IGdldEludGVybmFsKHRoaXMpLmFkZHJQcm9taXNlOyB9XG4gICAgLyoqXG4gICAgICogIFJldHVybiB0aGUgZGVwbG95ZWQgYnl0ZWNvZGUgb3IgbnVsbCBpZiBubyBieXRlY29kZSBpcyBmb3VuZC5cbiAgICAgKi9cbiAgICBhc3luYyBnZXREZXBsb3llZENvZGUoKSB7XG4gICAgICAgIGNvbnN0IHByb3ZpZGVyID0gZ2V0UHJvdmlkZXIodGhpcy5ydW5uZXIpO1xuICAgICAgICBhc3NlcnQocHJvdmlkZXIsIFwicnVubmVyIGRvZXMgbm90IHN1cHBvcnQgLnByb3ZpZGVyXCIsIFwiVU5TVVBQT1JURURfT1BFUkFUSU9OXCIsIHsgb3BlcmF0aW9uOiBcImdldERlcGxveWVkQ29kZVwiIH0pO1xuICAgICAgICBjb25zdCBjb2RlID0gYXdhaXQgcHJvdmlkZXIuZ2V0Q29kZShhd2FpdCB0aGlzLmdldEFkZHJlc3MoKSk7XG4gICAgICAgIGlmIChjb2RlID09PSBcIjB4XCIpIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBjb2RlO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiAgUmVzb2x2ZSB0byB0aGlzIENvbnRyYWN0IG9uY2UgdGhlIGJ5dGVjb2RlIGhhcyBiZWVuIGRlcGxveWVkLCBvclxuICAgICAqICByZXNvbHZlIGltbWVkaWF0ZWx5IGlmIGFscmVhZHkgZGVwbG95ZWQuXG4gICAgICovXG4gICAgYXN5bmMgd2FpdEZvckRlcGxveW1lbnQoKSB7XG4gICAgICAgIC8vIFdlIGhhdmUgdGhlIGRlcGxveW1lbnQgdHJhbnNhY3Rpb247IGp1c3QgdXNlIHRoYXQgKHRocm93cyBpZiBkZXBsb3ltZW50IGZhaWxzKVxuICAgICAgICBjb25zdCBkZXBsb3lUeCA9IHRoaXMuZGVwbG95bWVudFRyYW5zYWN0aW9uKCk7XG4gICAgICAgIGlmIChkZXBsb3lUeCkge1xuICAgICAgICAgICAgYXdhaXQgZGVwbG95VHgud2FpdCgpO1xuICAgICAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICAgIH1cbiAgICAgICAgLy8gQ2hlY2sgZm9yIGNvZGVcbiAgICAgICAgY29uc3QgY29kZSA9IGF3YWl0IHRoaXMuZ2V0RGVwbG95ZWRDb2RlKCk7XG4gICAgICAgIGlmIChjb2RlICE9IG51bGwpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgICB9XG4gICAgICAgIC8vIE1ha2Ugc3VyZSB3ZSBjYW4gc3Vic2NyaWJlIHRvIGEgcHJvdmlkZXIgZXZlbnRcbiAgICAgICAgY29uc3QgcHJvdmlkZXIgPSBnZXRQcm92aWRlcih0aGlzLnJ1bm5lcik7XG4gICAgICAgIGFzc2VydChwcm92aWRlciAhPSBudWxsLCBcImNvbnRyYWN0IHJ1bm5lciBkb2VzIG5vdCBzdXBwb3J0IC5wcm92aWRlclwiLCBcIlVOU1VQUE9SVEVEX09QRVJBVElPTlwiLCB7IG9wZXJhdGlvbj
26774ogXCJ3YWl0Rm9yRGVwbG95bWVudFwiIH0pO1xuICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgY2hlY2tDb2RlID0gYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGNvZGUgPSBhd2FpdCB0aGlzLmdldERlcGxveWVkQ29kZSgpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoY29kZSAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzb2x2ZSh0aGlzKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBwcm92aWRlci5vbmNlKFwiYmxvY2tcIiwgY2hlY2tDb2RlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlamVjdChlcnJvcik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIGNoZWNrQ29kZSgpO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogIFJldHVybiB0aGUgdHJhbnNhY3Rpb24gdXNlZCB0byBkZXBsb3kgdGhpcyBjb250cmFjdC5cbiAgICAgKlxuICAgICAqICBUaGlzIGlzIG9ubHkgYXZhaWxhYmxlIGlmIHRoaXMgaW5zdGFuY2Ugd2FzIHJldHVybmVkIGZyb20gYVxuICAgICAqICBbW0NvbnRyYWN0RmFjdG9yeV1dLlxuICAgICAqL1xuICAgIGRlcGxveW1lbnRUcmFuc2FjdGlvbigpIHtcbiAgICAgICAgcmV0dXJuIGdldEludGVybmFsKHRoaXMpLmRlcGxveVR4O1xuICAgIH1cbiAgICAvKipcbiAgICAgKiAgUmV0dXJuIHRoZSBmdW5jdGlvbiBmb3IgYSBnaXZlbiBuYW1lLiBUaGlzIGlzIHVzZWZ1bCB3aGVuIGEgY29udHJhY3RcbiAgICAgKiAgbWV0aG9kIG5hbWUgY29uZmxpY3RzIHdpdGggYSBKYXZhU2NyaXB0IG5hbWUgc3VjaCBhcyBgYHByb3RvdHlwZWBgIG9yXG4gICAgICogIHdoZW4gdXNpbmcgYSBDb250cmFjdCBwcm9ncmFtbWF0aWNhbGx5LlxuICAgICAqL1xuICAgIGdldEZ1bmN0aW9uKGtleSkge1xuICAgICAgICBpZiAodHlwZW9mIChrZXkpICE9PSBcInN0cmluZ1wiKSB7XG4gICAgICAgICAgICBrZXkgPSBrZXkuZm9ybWF0KCk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgZnVuYyA9IGJ1aWxkV3JhcHBlZE1ldGhvZCh0aGlzLCBrZXkpO1xuICAgICAgICByZXR1cm4gZnVuYztcbiAgICB9XG4gICAgLyoqXG4gICAgICogIFJldHVybiB0aGUgZXZlbnQgZm9yIGEgZ2l2ZW4gbmFtZS4gVGhpcyBpcyB1c2VmdWwgd2hlbiBhIGNvbnRyYWN0XG4gICAgICogIGV2ZW50IG5hbWUgY29uZmxpY3RzIHdpdGggYSBKYXZhU2NyaXB0IG5hbWUgc3VjaCBhcyBgYHByb3RvdHlwZWBgIG9yXG4gICAgICogIHdoZW4gdXNpbmcgYSBDb250cmFjdCBwcm9ncmFtbWF0aWNhbGx5LlxuICAgICAqL1xuICAgIGdldEV2ZW50KGtleSkge1xuICAgICAgICBpZiAodHlwZW9mIChrZXkpICE9PSBcInN0cmluZ1wiKSB7XG4gICAgICAgICAgICBrZXkgPSBrZXkuZm9ybWF0KCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGJ1aWxkV3JhcHBlZEV2ZW50KHRoaXMsIGtleSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqICBAX2lnbm9yZTpcbiAgICAgKi9cbiAgICBhc3luYyBxdWVyeVRyYW5zYWN0aW9uKGhhc2gpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiQFRPRE9cIik7XG4gICAgfVxuICAgIC8qXG4gICAgLy8gQFRPRE86IHRoaXMgaXMgYSBub24tYmFja3dhcmRzIGNvbXBhdGlibGUgY2hhbmdlLCBidXQgd2lsbCBiZSBhZGRlZFxuICAgIC8vICAgICAgICBpbiB2NyBhbmQgaW4gYSBwb3RlbnRpYWwgU21hcnRDb250cmFjdCBjbGFzcyBpbiBhbiB1cGNvbWluZ1xuICAgIC8vICAgICAgICB2NiByZWxlYXNlXG4gICAgYXN5bmMgZ2V0VHJhbnNhY3Rpb25SZWNlaXB0KGhhc2g6IHN0cmluZyk6IFByb21pc2U8bnVsbCB8IENvbnRyYWN0VHJhbnNhY3Rpb25SZWNlaXB0PiB7XG4gICAgICAgIGNvbnN0IHByb3ZpZGVyID0gZ2V0UHJvdmlkZXIodGhpcy5ydW5uZXIpO1xuICAgICAgICBhc3NlcnQocHJvdmlkZXIsIFwiY29udHJhY3QgcnVubmVyIGRvZXMgbm90IGhhdmUgYSBwcm92aWRlclwiLFxuICAgICAgICAgICAgXCJVTlNVUFBPUlRFRF9PUEVSQVRJT05cIiwgeyBvcGVyYXRpb246IFwicXVlcnlUcmFuc2FjdGlvblwiIH0pO1xuXG4gICAgICAgIGNvbnN0IHJlY2VpcHQgPSBhd2FpdCBwcm92aWRlci5nZXRUcmFuc2FjdGlvblJlY2VpcHQoaGFzaCk7XG4gICAgICAgIGlmIChyZWNlaXB0ID09IG51bGwpIHsgcmV0dXJuIG51bGw7IH1cblxuICAgICAgICByZXR1cm4gbmV3IENvbnRyYWN0VHJhbnNhY3Rpb25SZWNlaXB0KHRoaXMuaW50ZXJmYWNlLCBwcm92aWRlciwgcmVjZWlwdCk7XG4gICAgfVxuICAgICovXG4gICAgLyoqXG4gICAgICogIFByb3ZpZGUgaGlzdG9yaWMgYWNjZXNzIHRvIGV2ZW50IGRhdGEgZm9yICUlZXZlbnQlJSBpbiB0aGUgcmFuZ2VcbiAgICAgKiAgJSVmcm9tQmxvY2slJSAoZGVmYXVsdDogYGAwYGApIHRvICUldG9CbG9jayUlIChkZWZhdWx0OiBgYFwibGF0ZXN0XCJgYClcbiAgICAgKiAgaW5jbHVzaXZlLlxuICAgICAqL1xuICAgIGFzeW5jIHF1ZXJ5RmlsdGVyKGV2ZW50LCBmcm9tQmxvY2ssIHRvQmxvY2spIHtcbiAgICAgICAgaWYgKGZyb21CbG9jayA9PSBudWxsKSB7XG4gICAgICAgICAgICBmcm9tQmxvY2sgPSAwO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0b0Jsb2NrID09IG51bGwpIHtcbiAgICAgICAgICAgIHRvQmxvY2sgPSBcImxhdGVzdFwiO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHsgYWRkciwgYWRkclByb21pc2UgfSA9IGdldEludGVybmFsKHRoaXMpO1xuICAgICAgICBjb25zdCBhZGRyZXNzID0gKGFkZHIgPyBhZGRyIDogKGF3YWl0IGFkZHJQcm9taXNlKSk7XG4gICAgICAgIGNvbnN0IHsgZnJhZ21lbnQsIHRvcGljcyB9ID0gYXdhaXQgZ2V0U3ViSW5mbyh0aGlzLCBldmVudCk7XG4gICAgICAgIGNvbnN0IGZpbHRlciA9IHsgYWRkcmVzcywgdG9waWNzLCBmcm9tQmxvY2ssIHRvQmxvY2sgfTtcbiAgICAgICAgY29uc3QgcHJvdmlkZXIgPSBnZXRQcm92aWRlcih0aGlzLnJ1bm5lcik7XG4gICAgICAgIGFzc2VydChwcm92aWRlciwgXCJjb250cmFjdCBydW5uZXIgZG9lcyBub3QgaGF2ZSBhIHByb3ZpZGVyXCIsIFwiVU5TVVBQT1JURURfT1BFUkFUSU9OXCIsIHsgb3BlcmF0aW9uOiBcInF1ZXJ5RmlsdGVyXCIgfSk7XG4gICAgICAgI
26774HJldHVybiAoYXdhaXQgcHJvdmlkZXIuZ2V0TG9ncyhmaWx0ZXIpKS5tYXAoKGxvZykgPT4ge1xuICAgICAgICAgICAgbGV0IGZvdW5kRnJhZ21lbnQgPSBmcmFnbWVudDtcbiAgICAgICAgICAgIGlmIChmb3VuZEZyYWdtZW50ID09IG51bGwpIHtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICBmb3VuZEZyYWdtZW50ID0gdGhpcy5pbnRlcmZhY2UuZ2V0RXZlbnQobG9nLnRvcGljc1swXSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNhdGNoIChlcnJvcikgeyB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoZm91bmRGcmFnbWVudCkge1xuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgRXZlbnRMb2cobG9nLCB0aGlzLmludGVyZmFjZSwgZm91bmRGcmFnbWVudCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFVuZGVjb2RlZEV2ZW50TG9nKGxvZywgZXJyb3IpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBuZXcgTG9nKGxvZywgcHJvdmlkZXIpO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogIEFkZCBhbiBldmVudCAlJWxpc3RlbmVyJSUgZm9yIHRoZSAlJWV2ZW50JSUuXG4gICAgICovXG4gICAgYXN5bmMgb24oZXZlbnQsIGxpc3RlbmVyKSB7XG4gICAgICAgIGNvbnN0IHN1YiA9IGF3YWl0IGdldFN1Yih0aGlzLCBcIm9uXCIsIGV2ZW50KTtcbiAgICAgICAgc3ViLmxpc3RlbmVycy5wdXNoKHsgbGlzdGVuZXIsIG9uY2U6IGZhbHNlIH0pO1xuICAgICAgICBzdWIuc3RhcnQoKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIC8qKlxuICAgICAqICBBZGQgYW4gZXZlbnQgJSVsaXN0ZW5lciUlIGZvciB0aGUgJSVldmVudCUlLCBidXQgcmVtb3ZlIHRoZSBsaXN0ZW5lclxuICAgICAqICBhZnRlciBpdCBpcyBmaXJlZCBvbmNlLlxuICAgICAqL1xuICAgIGFzeW5jIG9uY2UoZXZlbnQsIGxpc3RlbmVyKSB7XG4gICAgICAgIGNvbnN0IHN1YiA9IGF3YWl0IGdldFN1Yih0aGlzLCBcIm9uY2VcIiwgZXZlbnQpO1xuICAgICAgICBzdWIubGlzdGVuZXJzLnB1c2goeyBsaXN0ZW5lciwgb25jZTogdHJ1ZSB9KTtcbiAgICAgICAgc3ViLnN0YXJ0KCk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiAgRW1pdCBhbiAlJWV2ZW50JSUgY2FsbGluZyBhbGwgbGlzdGVuZXJzIHdpdGggJSVhcmdzJSUuXG4gICAgICpcbiAgICAgKiAgUmVzb2x2ZXMgdG8gYGB0cnVlYGAgaWYgYW55IGxpc3RlbmVycyB3ZXJlIGNhbGxlZC5cbiAgICAgKi9cbiAgICBhc3luYyBlbWl0KGV2ZW50LCAuLi5hcmdzKSB7XG4gICAgICAgIHJldHVybiBhd2FpdCBlbWl0KHRoaXMsIGV2ZW50LCBhcmdzLCBudWxsKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogIFJlc29sdmVzIHRvIHRoZSBudW1iZXIgb2YgbGlzdGVuZXJzIG9mICUlZXZlbnQlJSBvciB0aGUgdG90YWwgbnVtYmVyXG4gICAgICogIG9mIGxpc3RlbmVycyBpZiB1bnNwZWNpZmllZC5cbiAgICAgKi9cbiAgICBhc3luYyBsaXN0ZW5lckNvdW50KGV2ZW50KSB7XG4gICAgICAgIGlmIChldmVudCkge1xuICAgICAgICAgICAgY29uc3Qgc3ViID0gYXdhaXQgaGFzU3ViKHRoaXMsIGV2ZW50KTtcbiAgICAgICAgICAgIGlmICghc3ViKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIDA7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gc3ViLmxpc3RlbmVycy5sZW5ndGg7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgeyBzdWJzIH0gPSBnZXRJbnRlcm5hbCh0aGlzKTtcbiAgICAgICAgbGV0IHRvdGFsID0gMDtcbiAgICAgICAgZm9yIChjb25zdCB7IGxpc3RlbmVycyB9IG9mIHN1YnMudmFsdWVzKCkpIHtcbiAgICAgICAgICAgIHRvdGFsICs9IGxpc3RlbmVycy5sZW5ndGg7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRvdGFsO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiAgUmVzb2x2ZXMgdG8gdGhlIGxpc3RlbmVycyBzdWJzY3JpYmVkIHRvICUlZXZlbnQlJSBvciBhbGwgbGlzdGVuZXJzXG4gICAgICogIGlmIHVuc3BlY2lmaWVkLlxuICAgICAqL1xuICAgIGFzeW5jIGxpc3RlbmVycyhldmVudCkge1xuICAgICAgICBpZiAoZXZlbnQpIHtcbiAgICAgICAgICAgIGNvbnN0IHN1YiA9IGF3YWl0IGhhc1N1Yih0aGlzLCBldmVudCk7XG4gICAgICAgICAgICBpZiAoIXN1Yikge1xuICAgICAgICAgICAgICAgIHJldHVybiBbXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBzdWIubGlzdGVuZXJzLm1hcCgoeyBsaXN0ZW5lciB9KSA9PiBsaXN0ZW5lcik7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgeyBzdWJzIH0gPSBnZXRJbnRlcm5hbCh0aGlzKTtcbiAgICAgICAgbGV0IHJlc3VsdCA9IFtdO1xuICAgICAgICBmb3IgKGNvbnN0IHsgbGlzdGVuZXJzIH0gb2Ygc3Vicy52YWx1ZXMoKSkge1xuICAgICAgICAgICAgcmVzdWx0ID0gcmVzdWx0LmNvbmNhdChsaXN0ZW5lcnMubWFwKCh7IGxpc3RlbmVyIH0pID0+IGxpc3RlbmVyKSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG4gICAgLyoqXG4gICAgICogIFJlbW92ZSB0aGUgJSVsaXN0ZW5lciUlIGZyb20gdGhlIGxpc3RlbmVycyBmb3IgJSVldmVudCUlIG9yIHJlbW92ZVxuICAgICAqICBhbGwgbGlzdGVuZXJzIGlmIHVuc3BlY2lmaWVkLlxuICAgICAqL1xuICAgIGFzeW5jIG9mZihldmVudCwgbGlzdGVuZXIpIHtcbiAgICAgICAgY29uc3Qgc3ViID0gYXdhaXQgaGFzU3ViKHRoaXMsIGV2ZW50KTtcbiAgICAgICAgaWYgKCFzdWIpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgICB9XG4gICAgICAgIGlmIChsaXN0ZW5lcikge1xuICAgICAgICAgICAgY29uc3QgaW5kZXggPSBzdWIubGlzdGVuZXJzLm1hcCgoeyBsaXN0ZW5lciB9KSA9PiBsaXN0ZW5lcikuaW5kZXhPZihsaXN0ZW5lcik7XG4gICAgICAgICAgICBpZiAoaW5kZXggPj0gMCkge1xuICAgICAgICAgICAgICAgI
26774HN1Yi5saXN0ZW5lcnMuc3BsaWNlKGluZGV4LCAxKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAobGlzdGVuZXIgPT0gbnVsbCB8fCBzdWIubGlzdGVuZXJzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgc3ViLnN0b3AoKTtcbiAgICAgICAgICAgIGdldEludGVybmFsKHRoaXMpLnN1YnMuZGVsZXRlKHN1Yi50YWcpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiAgUmVtb3ZlIGFsbCB0aGUgbGlzdGVuZXJzIGZvciAlJWV2ZW50JSUgb3IgcmVtb3ZlIGFsbCBsaXN0ZW5lcnMgaWZcbiAgICAgKiAgdW5zcGVjaWZpZWQuXG4gICAgICovXG4gICAgYXN5bmMgcmVtb3ZlQWxsTGlzdGVuZXJzKGV2ZW50KSB7XG4gICAgICAgIGlmIChldmVudCkge1xuICAgICAgICAgICAgY29uc3Qgc3ViID0gYXdhaXQgaGFzU3ViKHRoaXMsIGV2ZW50KTtcbiAgICAgICAgICAgIGlmICghc3ViKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBzdWIuc3RvcCgpO1xuICAgICAgICAgICAgZ2V0SW50ZXJuYWwodGhpcykuc3Vicy5kZWxldGUoc3ViLnRhZyk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBjb25zdCB7IHN1YnMgfSA9IGdldEludGVybmFsKHRoaXMpO1xuICAgICAgICAgICAgZm9yIChjb25zdCB7IHRhZywgc3RvcCB9IG9mIHN1YnMudmFsdWVzKCkpIHtcbiAgICAgICAgICAgICAgICBzdG9wKCk7XG4gICAgICAgICAgICAgICAgc3Vicy5kZWxldGUodGFnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgLyoqXG4gICAgICogIEFsaWFzIGZvciBbb25dLlxuICAgICAqL1xuICAgIGFzeW5jIGFkZExpc3RlbmVyKGV2ZW50LCBsaXN0ZW5lcikge1xuICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5vbihldmVudCwgbGlzdGVuZXIpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiAgQWxpYXMgZm9yIFtvZmZdLlxuICAgICAqL1xuICAgIGFzeW5jIHJlbW92ZUxpc3RlbmVyKGV2ZW50LCBsaXN0ZW5lcikge1xuICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5vZmYoZXZlbnQsIGxpc3RlbmVyKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogIENyZWF0ZSBhIG5ldyBDbGFzcyBmb3IgdGhlICUlYWJpJSUuXG4gICAgICovXG4gICAgc3RhdGljIGJ1aWxkQ2xhc3MoYWJpKSB7XG4gICAgICAgIGNsYXNzIEN1c3RvbUNvbnRyYWN0IGV4dGVuZHMgQmFzZUNvbnRyYWN0IHtcbiAgICAgICAgICAgIGNvbnN0cnVjdG9yKGFkZHJlc3MsIHJ1bm5lciA9IG51bGwpIHtcbiAgICAgICAgICAgICAgICBzdXBlcihhZGRyZXNzLCBhYmksIHJ1bm5lcik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIEN1c3RvbUNvbnRyYWN0O1xuICAgIH1cbiAgICA7XG4gICAgLyoqXG4gICAgICogIENyZWF0ZSBhIG5ldyBCYXNlQ29udHJhY3Qgd2l0aCBhIHNwZWNpZmllZCBJbnRlcmZhY2UuXG4gICAgICovXG4gICAgc3RhdGljIGZyb20odGFyZ2V0LCBhYmksIHJ1bm5lcikge1xuICAgICAgICBpZiAocnVubmVyID09IG51bGwpIHtcbiAgICAgICAgICAgIHJ1bm5lciA9IG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgY29udHJhY3QgPSBuZXcgdGhpcyh0YXJnZXQsIGFiaSwgcnVubmVyKTtcbiAgICAgICAgcmV0dXJuIGNvbnRyYWN0O1xuICAgIH1cbn1cbmZ1bmN0aW9uIF9Db250cmFjdEJhc2UoKSB7XG4gICAgcmV0dXJuIEJhc2VDb250cmFjdDtcbn1cbi8qKlxuICogIEEgW1tCYXNlQ29udHJhY3RdXSB3aXRoIG5vI
26774HR5cGUgZ3VhcmRzIG9uIGl0cyBtZXRob2RzIG9yIGV2ZW50cy5cbiAqL1xuZXhwb3J0IGNsYXNzIENvbnRyYWN0IGV4dGVuZHMgX0NvbnRyYWN0QmFzZSgpIHtcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWNvbnRyYWN0LmpzLm1hcCIsImltcG9ydCB7IEludGVyZmFjZSB9IGZyb20gXCIuLi9hYmkvaW5kZXguanNcIjtcbmltcG9ydCB7IGdldENyZWF0ZUFkZHJlc3MgfSBmcm9tIFwiLi4vYWRkcmVzcy9pbmRleC5qc1wiO1xuaW1wb3J0IHsgY29uY2F0LCBkZWZpbmVQcm9wZXJ0aWVzLCBnZXRCeXRlcywgaGV4bGlmeSwgYXNzZXJ0LCBhc3NlcnRBcmd1bWVudCB9IGZyb20gXCIuLi91dGlscy9pbmRleC5qc1wiO1xuaW1wb3J0IHsgQmFzZUNvbnRyYWN0LCBjb3B5T3ZlcnJpZGVzLCByZXNvbHZlQXJncyB9IGZyb20gXCIuL2NvbnRyYWN0LmpzXCI7XG4vLyBBID0gQXJndW1lbnRzIHRvIHRoZSBjb25zdHJ1Y3RvclxuLy8gSSA9IEludGVyZmFjZSBvZiBkZXBsb3llZCBjb250cmFjdHNcbi8qKlxuICogIEEgKipDb250cmFjdEZhY3RvcnkqKiBpcyB1c2VkIHRvIGRlcGxveSBhIENvbnRyYWN0IHRvIHRoZSBibG9ja2NoYWluLlxuICovXG5leHBvcnQgY2xhc3MgQ29udHJhY3RGYWN0b3J5IHtcbiAgICAvKipcbiAgICAgKiAgVGhlIENvbnRyYWN0IEludGVyZmFjZS5cbiAgICAgKi9cbiAgICBpbnRlcmZhY2U7XG4gICAgLyoqXG4gICAgICogIFRoZSBDb250cmFjdCBkZXBsb3ltZW50IGJ5dGVjb2RlLiBPZnRlbiBjYWxsZWQgdGhlIGluaXRjb2RlLlxuICAgICAqL1xuICAgIGJ5dGVjb2RlO1xuICAgIC8qKlxuICAgICAqICBUaGUgQ29udHJhY3RSdW5uZXIgdG8gZGVwbG95IHRoZSBDb250cmFjdCBhcy5cbiAgICAgKi9cbiAgICBydW5uZXI7XG4gICAgLyoqXG4gICAgICogIENyZWF0ZSBhIG5ldyAqKkNvbnRyYWN0RmFjdG9yeSoqIHdpdGggJSVhYmklJSBhbmQgJSVieXRlY29kZSUlLFxuICAgICAqICBvcHRpb25hbGx5IGNvbm5lY3RlZCB0byAlJXJ1bm5lciUlLlxuICAgICAqXG4gICAgICogIFRoZSAlJWJ5dGVjb2RlJSUgbWF5IGJlIHRoZSBgYGJ5dGVjb2RlYGAgcHJvcGVydHkgd2l0aGluIHRoZVxuICAgICAqICBzdGFuZGFyZCBTb2xpZGl0eSBKU09OIG91dHB1dC5cbiAgICAgKi9cbiAgICBjb25zdHJ1Y3RvcihhYmksIGJ5dGVjb2RlLCBydW5uZXIpIHtcbiAgICAgICAgY29uc3QgaWZhY2UgPSBJbnRlcmZhY2UuZnJvbShhYmkpO1xuICAgICAgICAvLyBEZXJlZmVyZW5jZSBTb2xpZGl0eSBieXRlY29kZSBvYmplY3RzIGFuZCBhbGxvdyBhIG1pc3NpbmcgYDB4YC1wcmVmaXhcbiAgICAgICAgaWYgKGJ5dGVjb2RlIGluc3RhbmNlb2YgVWludDhBcnJheSkge1xuICAgICAgICAgICAgYnl0ZWNvZGUgPSBoZXhsaWZ5KGdldEJ5dGVzKGJ5dGVjb2RlKSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBpZiAodHlwZW9mIChieXRlY29kZSkgPT09IFwib2JqZWN0XCIpIHtcbiAgICAgICAgICAgICAgICBieXRlY29kZSA9IGJ5dGVjb2RlLm9iamVjdDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICghYnl0ZWNvZGUuc3RhcnRzV2l0aChcIjB4XCIpKSB7XG4gICAgICAgICAgICAgICAgYnl0ZWNvZGUgPSBcIjB4XCIgKyBieXRlY29kZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGJ5dGVjb2RlID0gaGV4bGlmeShnZXRCeXRlcyhieXRlY29kZSkpO1xuICAgICAgICB9XG4gICAgICAgIGRlZmluZVByb3BlcnRpZXModGhpcywge1xuICAgICAgICAgICAgYnl0ZWNvZGUsIGludGVyZmFjZTogaWZhY2UsIHJ1bm5lcjogKHJ1bm5lciB8fCBudWxsKVxuICAgICAgICB9KTtcbiAgICB9XG4gICAgYXR0YWNoKHRhcmdldCkge1xuICAgICAgICByZXR1cm4gbmV3IEJhc2VDb250cmFjdCh0YXJnZXQsIHRoaXMuaW50ZXJmYWNlLCB0aGlzLnJ1bm5lcik7XG4gICAgfVxuICAgIC8qKlxuICAgICAqICBSZXNvbHZlcyB0byB0aGUgdHJhbnNhY3Rpb24gdG8gZGVwbG95IHRoZSBjb250cmFjdCwgcGFzc2luZyAlJWFyZ3MlJVxuICAgICAqICBpbnRvIHRoZSBjb25zdHJ1Y3Rvci5cbiAgICAgKi9cbiAgICBhc3luYyBnZXREZXBsb3lUcmFuc2FjdGlvbiguLi5hcmdzKSB7XG4gICAgICAgIGxldCBvdmVycmlkZXMgPSB7fTtcbiAgICAgICAgY29uc3QgZnJhZ21lbnQgPSB0aGlzLmludGVyZmFjZS5kZXBsb3k7XG4gICAgICAgIGlmIChmcmFnbWVudC5pbnB1dHMubGVuZ3RoICsgMSA9PT0gYXJncy5sZW5ndGgpIHtcbiAgICAgICAgICAgIG92ZXJyaWRlcyA9IGF3YWl0IGNvcHlPdmVycmlkZXMoYXJncy5wb3AoKSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGZyYWdtZW50LmlucHV0cy5sZW5ndGggIT09IGFyZ3MubGVuZ3RoKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJpbmNvcnJlY3QgbnVtYmVyIG9mIGFyZ3VtZW50cyB0byBjb25zdHJ1Y3RvclwiKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCByZXNvbHZlZEFyZ3MgPSBhd2FpdCByZXNvbHZlQXJncyh0aGlzLnJ1bm5lciwgZnJhZ21lbnQuaW5wdXRzLCBhcmdzKTtcbiAgICAgICAgY29uc3QgZGF0YSA9IGNvbmNhdChbdGhpcy5ieXRlY29kZSwgdGhpcy5pbnRlcmZhY2UuZW5jb2RlRGVwbG95KHJlc29sdmVkQXJncyldKTtcbiAgICAgICAgcmV0dXJuIE9iamVjdC5hc3NpZ24oe30sIG92ZXJyaWRlcywgeyBkYXRhIH0pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiAgUmVzb2x2ZXMgdG8gdGhlIENvbnRyYWN0IGRlcGxveWVkIGJ5IHBhc3NpbmcgJSVhcmdzJSUgaW50byB0aGVcbiAgICAgKiAgY29uc3RydWN0b3IuXG4gICAgICpcbiAgICAgKiAgVGhpcyB3aWxsIHJlc29sdmUgdG8gdGhlIENvbnRyYWN0IGJlZm9yZSBpdCBoYXMgYmVlbiBkZXBsb3llZCB0byB0aGVcbiAgICAgKiAgbmV0d29yaywgc28gdGhlIFtbQmFzZUNvbnRyYWN0LXdhaXRGb3JEZXBsb3ltZW50XV0gc2hvdWxkIGJlIHVzZWQgYmVmb3JlXG4gICAgICogIHNlbmRpbmcgYW55IHRyYW5zYWN0aW9ucyB0byBpdC5cbiAgICAgKi9cbiAgICBhc3luYyBkZXBsb3koLi4uYXJncykge1xuICAgICAgICBjb25zdCB0eCA9IGF3YWl0IHRoaXMuZ2V0RGVwbG95VHJhbnNhY3Rpb24oLi4uYXJncyk7XG4gICAgICAgIGFzc2VydCh0aGlzLnJ1bm5lciAmJiB0eXBlb2YgKHRoaXMucnVubmVyLnNlbmRUcmFuc2FjdGlvbikgPT09IFwiZnVuY3Rpb25cIiwgXCJmYWN0b3J5IHJ1bm5lciBkb2VzIG5vdCBzdXBwb3J0IHNlbmRpbmcgdHJhbnNhY3Rpb25zXCIsIFwiVU5TVVBQT1JURURfT1BFUkFUSU9OXCIsIHtcbiAgICAgICAgICAgIG9wZXJhdGlvbj
26774ogXCJzZW5kVHJhbnNhY3Rpb25cIlxuICAgICAgICB9KTtcbiAgICAgICAgY29uc3Qgc2VudFR4ID0gYXdhaXQgdGhpcy5ydW5uZXIuc2VuZFRyYW5zYWN0aW9uKHR4KTtcbiAgICAgICAgY29uc3QgYWRkcmVzcyA9IGdldENyZWF0ZUFkZHJlc3Moc2VudFR4KTtcbiAgICAgICAgcmV0dXJuIG5ldyBCYXNlQ29udHJhY3QoYWRkcmVzcywgdGhpcy5pbnRlcmZhY2UsIHRoaXMucnVubmVyLCBzZW50VHgpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiAgUmV0dXJuIGEgbmV3ICoqQ29udHJhY3RGYWN0b3J5Kiogd2l0aCB0aGUgc2FtZSBBQkkgYW5kIGJ5dGVjb2RlLFxuICAgICAqICBidXQgY29ubmVjdGVkIHRvICUlcnVubmVyJSUuXG4gICAgICovXG4gICAgY29ubmVjdChydW5uZXIpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBDb250cmFjdEZhY3RvcnkodGhpcy5pbnRlcmZhY2UsIHRoaXMuYnl0ZWNvZGUsIHJ1bm5lcik7XG4gICAgfVxuICAgIC8qKlxuICAgICAqICBDcmVhdGUgYSBuZXcgKipDb250cmFjdEZhY3RvcnkqKiBmcm9tIHRoZSBzdGFuZGFyZCBTb2xpZGl0eSBKU09OIG91dHB1dC5cbiAgICAgKi9cbiAgICBzdGF0aWMgZnJvbVNvbGlkaXR5KG91dHB1dCwgcnVubmVyKSB7XG4gICAgICAgIGFzc2VydEFyZ3VtZW50KG91dHB1dCAhPSBudWxsLCBcImJhZCBjb21waWxlciBvdXRwdXRcIiwgXCJvdXRwdXRcIiwgb3V0cHV0KTtcbiAgICAgICAgaWYgKHR5cGVvZiAob3V0cHV0KSA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgICAgICAgb3V0cHV0ID0gSlNPTi5wYXJzZShvdXRwdXQpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGFiaSA9IG91dHB1dC5hYmk7XG4gICAgICAgIGxldCBieXRlY29kZSA9IFwiXCI7XG4gICAgICAgIGlmIChvdXRwdXQuYnl0ZWNvZGUpIHtcbiAgICAgICAgICAgIGJ5dGVjb2RlID0gb3V0cHV0LmJ5dGVjb2RlO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKG91dHB1dC5ldm0gJiYgb3V0cHV0LmV2bS5ieXRlY29kZSkge1xuICAgICAgICAgICAgYnl0ZWNvZGUgPSBvdXRwdXQuZXZtLmJ5dGVjb2RlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBuZXcgdGhpcyhhYmksIGJ5dGVjb2RlLCBydW5uZXIpO1xuICAgIH1cbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWZhY3RvcnkuanMubWFwIiwiLyoqXG4gKiAgRU5TIGlzIGEgc2VydmljZSB3aGljaCBhbGxvd3MgZWFzeS10by1yZW1lbWJlciBuYW1lcyB0byBtYXAgdG9cbiAqICBuZXR3b3JrIGFkZHJlc3Nlcy5cbiAqXG4gKiAgQF9zZWN0aW9uOiBhcGkvcHJvdmlkZXJzL2Vucy1yZXNvbHZlcjpFTlMgUmVzb2x2ZXIgIFthYm91dC1lbnMtcnNvbHZlcl1cbiAqL1xuaW1wb3J0IHsgZ2V0QWRkcmVzcyB9IGZyb20gXCIuLi9hZGRyZXNzL2luZGV4LmpzXCI7XG5pbXBvcnQgeyBaZXJvQWRkcmVzcyB9IGZyb20gXCIuLi9jb25zdGFudHMvaW5kZXguanNcIjtcbmltcG9ydCB7IENvbnRyYWN0IH0gZnJvbSBcIi4uL2NvbnRyYWN0L2luZGV4LmpzXCI7XG5pbXBvcnQgeyBkbnNFbmNvZGUsIGVuc05vcm1hbGl6ZSwgaXNWYWxpZE5hbWUsIG5hbWVoYXNoIH0gZnJvbSBcIi4uL2hhc2gvaW5kZXguanNcIjtcbmltcG9ydCB7IGdldEJpZ0ludCwgaGV4bGlmeSwgaXNIZXhTdHJpbmcsIHRvQmVIZXgsIGRlZmluZVByb3BlcnRpZXMsIGVuY29kZUJhc2U1OCwgYXNzZXJ0LCBhc3NlcnRBcmd1bWVudCwgaXNFcnJvciwgRmV0Y2hSZXF1ZXN0IH0gZnJvbSBcIi4uL3V0aWxzL2luZGV4LmpzXCI7XG5jb25zdCBCTl82MCA9IEJpZ0ludCg2MCk7XG4vLyBAVE9ETzogVGhpcyBzaG91bGQgdXNlIHRoZSBmZXRjaC1kYXRhOmlwZnMgZ2F0ZXdheVxuLy8gVHJpbSBvZmYgdGhlIGlwZnM6Ly8gcHJlZml4IGFuZCByZXR1cm4gdGhlIGRlZmF1bHQgZ2F0ZXdheSBVUkxcbmZ1bmN0aW9uIGdldElwZnNMaW5rKGxpbmspIHtcbiAgICBpZiAobGluay5tYXRjaCgvXmlwZnM6XFwvXFwvaXBmc1xcLy9pKSkge1xuICAgICAgICBsaW5rID0gbGluay5zdWJzdHJpbmcoMTIpO1xuICAgIH1cbiAgICBlbHNlIGlmIChsaW5rLm1hdGNoKC9eaXBmczpcXC9cXC8vaSkpIHtcbiAgICAgICAgbGluayA9IGxpbmsuc3Vic3RyaW5nKDcpO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgYXNzZXJ0QXJndW1lbnQoZmFsc2UsIFwidW5zdXBwb3J0ZWQgSVBGUyBmb3JtYXRcIiwgXCJsaW5rXCIsIGxpbmspO1xuICAgIH1cbiAgICByZXR1cm4gYGh0dHBzOi9cXC9nYXRld2F5LmlwZnMuaW8vaXBmcy8ke2xpbmt9YDtcbn1cbjtcbjtcbi8qKlxuICogIEEgcHJvdmlkZXIgcGx1Z2luIHN1cGVyLWNsYXNzIGZvciBwcm9jZXNzaW5nIG11bHRpY29pbiBhZGRyZXNzIHR5cGVzLlxuICovXG5leHBvcnQgY2xhc3MgTXVsdGljb2luUHJvdmlkZXJQbHVnaW4ge1xuICAgIC8qKlxuICAgICAqICBUaGUgbmFtZS5cbiAgICAgKi9cbiAgICBuYW1lO1xuICAgIC8qKlxuICAgICAqICBDcmVhdGVzIGEgbmV3ICoqTXVsdGljb2luUHJvdmlkZXJQbHVpbmcqKiBmb3IgJSVuYW1lJSUuXG4gICAgICovXG4gICAgY29uc3RydWN0b3IobmFtZSkge1xuICAgICAgICBkZWZpbmVQcm9wZXJ0aWVzKHRoaXMsIHsgbmFtZSB9KTtcbiAgICB9XG4gICAgY29ubmVjdChwcm92aWRlcikge1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgLyoqXG4gICAgICogIFJldHVybnMgYGB0cnVlYGAgaWYgJSVjb2luVHlwZSUlIGlzIHN1cHBvcnRlZCBieSB0aGlzIHBsdWdpbi5cbiAgICAgKi9cbiAgICBzdXBwb3J0c0NvaW5UeXBlKGNvaW5UeXBlKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogIFJlc29sdmVzIHRvIHRoZSBlbmNvZGVkICUlYWRkcmVzcyUlIGZvciAlJWNvaW5UeXBlJSUuXG4gICAgICovXG4gICAgYXN5bmMgZW5jb2RlQWRkcmVzcyhjb2luVHlwZSwgYWRkcmVzcykge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJ1bnN1cHBvcnRlZCBjb2luXCIpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiAgUmVzb2x2ZXMgdG8gdGhlIGRlY29kZWQgJSVkYXRhJSUgZm9yICUlY29pblR5cGUlJS5cbiAgICAgKi9cbiAgICBhc3luYyBkZWNvZGVBZGRyZXNzKGNvaW5UeXBlLCBkYXRhKSB7XG4gICAgICAgI
26774HRocm93IG5ldyBFcnJvcihcInVuc3VwcG9ydGVkIGNvaW5cIik7XG4gICAgfVxufVxuY29uc3QgQmFzaWNNdWx0aWNvaW5QbHVnaW5JZCA9IFwib3JnLmV0aGVycy5wbHVnaW5zLnByb3ZpZGVyLkJhc2ljTXVsdGljb2luXCI7XG4vKipcbiAqICBBICoqQmFzaWNNdWx0aWNvaW5Qcm92aWRlclBsdWdpbioqIHByb3ZpZGVzIHNlcnZpY2UgZm9yIGNvbW1vblxuICogIGNvaW4gdHlwZXMsIHdoaWNoIGRvIG5vdCByZXF1aXJlIGFkZGl0aW9uYWwgbGlicmFyaWVzIHRvIGVuY29kZSBvclxuICogIGRlY29kZS5cbiAqL1xuZXhwb3J0IGNsYXNzIEJhc2ljTXVsdGljb2luUHJvdmlkZXJQbHVnaW4gZXh0ZW5kcyBNdWx0aWNvaW5Qcm92aWRlclBsdWdpbiB7XG4gICAgLyoqXG4gICAgICogIENyZWF0ZXMgYSBuZXcgKipCYXNpY011bHRpY29pblByb3ZpZGVyUGx1Z2luKiouXG4gICAgICovXG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHN1cGVyKEJhc2ljTXVsdGljb2luUGx1Z2luSWQpO1xuICAgIH1cbn1cbmNvbnN0IG1hdGNoZXJJcGZzID0gbmV3IFJlZ0V4cChcIl4oaXBmcyk6L1xcLyguKikkXCIsIFwiaVwiKTtcbmNvbnN0IG1hdGNoZXJzID0gW1xuICAgIG5ldyBSZWdFeHAoXCJeKGh0dHBzKTovXFwvKC4qKSRcIiwgXCJpXCIpLFxuICAgIG5ldyBSZWdFeHAoXCJeKGRhdGEpOiguKikkXCIsIFwiaVwiKSxcbiAgICBtYXRjaGVySXBmcyxcbiAgICBuZXcgUmVnRXhwKFwiXmVpcDE1NTpbMC05XSsvKGVyY1swLTldKyk6KC4qKSRcIiwgXCJpXCIpLFxuXTtcbmZ1bmN0aW9uIGlzRXZtQ29pblR5cGUoY29pblR5cGUpIHtcbiAgICByZXR1cm4gKGNvaW5UeXBlID09PSBCTl82MCkgfHxcbiAgICAgICAgKGNvaW5UeXBlID49IDB4ODAwMDAwMDAgJiYgY29pblR5cGUgPD0gMHhmZmZmZmZmZik7XG59XG4vKipcbiAqICBBIGNvbm5lY3RlZCBvYmplY3QgdG8gYSByZXNvbHZlZCBFTlMgbmFtZSByZXNvbHZlciwgd2hpY2ggY2FuIGJlXG4gKiAgdXNlZCB0byBxdWVyeSBhZGRpdGlvbmFsIGRldGFpbHMuXG4gKi9cbmV4cG9ydCBjbGFzcyBFbnNSZXNvbHZlciB7XG4gICAgLyoqXG4gICAgICogIFRoZSBjb25uZWN0ZWQgcHJvdmlkZXIuXG4gICAgICovXG4gICAgcHJvdmlkZXI7XG4gICAgLyoqXG4gICAgICogIFRoZSBhZGRyZXNzIG9mIHRoZSByZXNvbHZlci5cbiAgICAgKi9cbiAgICBhZGRyZXNzO1xuICAgIC8qKlxuICAgICAqICBUaGUgbmFtZSB0aGlzIHJlc29sdmVyIHdhcyByZXNvbHZlZCBhZ2FpbnN0LlxuICAgICAqL1xuICAgIG5hbWU7XG4gICAgLy8gRm9yIEVJUC0yNTQ0IG5hbWVzLCB0aGUgYW5jZXN0b3IgdGhhdCBwcm92aWRlZCB0aGUgcmVzb2x2ZXJcbiAgICAjc3VwcG9ydHMyNTQ0O1xuICAgICNyZXNvbHZlcjtcbiAgICBjb25zdHJ1Y3Rvcihwcm92aWRlciwgYWRkcmVzcywgbmFtZSwgc3VwcG9ydHNXaWxkY2FyZCkge1xuICAgICAgICBkZWZpbmVQcm9wZXJ0aWVzKHRoaXMsIHsgcHJvdmlkZXIsIGFkZHJlc3MsIG5hbWUgfSk7XG4gICAgICAgIHRoaXMuI3N1cHBvcnRzMjU0NCA9IChzdXBwb3J0c1dpbGRjYXJkICE9IG51bGwpID8gUHJvbWlzZS5yZXNvbHZlKHN1cHBvcnRzV2lsZGNhcmQpIDogbnVsbDtcbiAgICAgICAgdGhpcy4jcmVzb2x2ZXIgPSBuZXcgQ29udHJhY3QoYWRkcmVzcywgW1xuICAgICAgICAgICAgXCJmdW5jdGlvbiBzdXBwb3J0c0ludGVyZmFjZShieXRlczQpIHZpZXcgcmV0dXJucyAoYm9vbClcIixcbiAgICAgICAgICAgIFwiZnVuY3Rpb24gcmVzb2x2ZShieXRlcywgYnl0ZXMpIHZpZXcgcmV0dXJucyAoYnl0ZXMpXCIsXG4gICAgICAgICAgICBcImZ1bmN0aW9uIGFkZHIoYnl0ZXMzMikgdmlldyByZXR1cm5zIChhZGRyZXNzKVwiLFxuICAgICAgICAgICAgXCJmdW5jdGlvbiBhZGRyKGJ5dGVzMzIsIHVpbnQpIHZpZXcgcmV0dXJucyAoYnl0ZXMpXCIsXG4gICAgICAgICAgICBcImZ1bmN0aW9uIHRleHQoYnl0ZXMzMiwgc3RyaW5nKSB2aWV3IHJldHVybnMgKHN0cmluZylcIixcbiAgICAgICAgICAgIFwiZnVuY3Rpb24gY29udGVudGhhc2goYnl0ZXMzMikgdmlldyByZXR1cm5zIChieXRlcylcIixcbiAgICAgICAgICAgIFwiZnVuY3Rpb24gbmFtZShieXRlczMyKSB2aWV3IHJldHVybnMgKHN0cmluZylcIixcbiAgICAgICAgXSwgcHJvdmlkZXIpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiAgUmVzb2x2ZXMgdG8gdHJ1ZSBpZiB0aGUgcmVzb2x2ZXIgc3VwcG9ydHMgd2lsZGNhcmQgcmVzb2x1dGlvbi5cbiAgICAgKi9cbiAgICBhc3luYyBzdXBwb3J0c1dpbGRjYXJkKCkge1xuICAgICAgICBpZiAodGhpcy4jc3VwcG9ydHMyNTQ0ID09IG51bGwpIHtcbiAgICAgICAgICAgIHRoaXMuI3N1cHBvcnRzMjU0NCA9IChhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuI3Jlc29sdmVyLnN1cHBvcnRzSW50ZXJmYWNlKFwiMHg5MDYxYjkyM1wiKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIFdpbGRjYXJkIHJlc29sdmVycyBtdXN0IHVuZGVyc3RhbmQgc3VwcG9ydHNJbnRlcmZhY2VcbiAgICAgICAgICAgICAgICAgICAgLy8gYW5kIHJldHVybiB0cnVlLlxuICAgICAgICAgICAgICAgICAgICBpZiAoaXNFcnJvcihlcnJvciwgXCJDQUxMX0VYQ0VQVElPTlwiKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIC8vIExldCBmdXR1cmUgYXR0ZW1wdHMgdHJ5IGFnYWluLi4uXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuI3N1cHBvcnRzMjU0NCA9IG51bGw7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IGVycm9yO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pKCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuI3N1cHBvcnRzMjU0NDtcbiAgICB9XG4gICAgYXN5bmMgI2ZldGNoKGZ1bmNOYW1lLCBwYXJhbXMpIHtcbiAgICAgICAgcGFyYW1zID0gKHBhcmFtcyB8fCBbXSkuc2xpY2UoKTtcbiAgICAgICAgY29uc3QgaWZhY2UgPSB0aGlzLiNyZXNvbHZlci5pbnRlcmZhY2U7XG4gICAgICAgIC8vIFRoZSBmaXJzdCBwYXJhbWV0ZXJzIGlzIGFsd2F5cyB0aGUgbm9kZWhhc2hcbiAgICAgICAgcGFyYW1zLnVuc2hpZnQobmFtZWhhc2godGhpcy5uYW1lKSk7XG4gICAgICAgIGxldCBmcmFnbWVudCA9IG51bGw7XG4gICAgICAgIGlmIChhd2FpdCB0aGlzLnN1cHBvcnRzV2lsZGNhcmQoKSkge1xuICAgICAgICAgICAgZnJhZ21lbnQgPSBpZmFjZS5nZXRGdW5jdGlvbihmdW5jTmFtZSk7XG4gICAgICAgICAgICBhc3NlcnQoZnJhZ21lbnQsIFwibWlzc2luZyBmcmFnbWVudFwiLCBcIlVOS05PV05fRVJST1JcIiwge1xuICAgICAgICAgICAgICAgIGluZm86IHsgZnVuY05hbWUgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBwYXJhbXMgPSBbXG4gICAgICAgICAgICAgICAgZG5zRW5jb2RlKHRoaXMubmFtZSwgMjU1KSxcbiAgICAgICAgICAgICAgICBpZmFjZS5lbmNvZGVGdW5jdGlvbkRhdGEoZnJhZ21lbnQsIHBhcmFtcylcbiAgICAgICAgICAgIF07XG4gICAgICAgICAgICBmdW5jTmFtZSA9IFwicmVzb2x2ZShieXRlcyxieXRlcylcIjtcbiAgICAgICAgfVxuICAgICAgICBwYXJhbXMucHVzaCh7IGVuYWJsZUNjaXBSZWFkOiB0cnVlIH0pO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy4jcmVzb2x2ZXJbZnVuY05hbWVdKC4uLnBhcmFtcyk7XG4gICAgICAgICAgICBpZiAoZnJhZ21lbnQpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gaWZhY2UuZGVjb2RlRnVuY3Rpb25SZXN1bHQoZnJhZ21lbnQsIHJlc3VsdClbMF07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICB9XG4gICAgICAgIGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgaWYgKCFpc0Vycm9yKGVycm9yLCBcIkNBTExfRVhDRVBUSU9OXCIpKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICAgICAgICB9XG4gICAgICAgI
26774H1cbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIC8qKlxuICAgICAqICBSZXNvbHZlcyB0byB0aGUgYWRkcmVzcyBmb3IgJSVjb2luVHlwZSUlIG9yIG51bGwgaWYgdGhlXG4gICAgICogIHByb3ZpZGVkICUlY29pblR5cGUlJSBoYXMgbm90IGJlZW4gY29uZmlndXJlZC5cbiAgICAgKi9cbiAgICBhc3luYyBnZXRBZGRyZXNzKF9jb2luVHlwZSkge1xuICAgICAgICBjb25zdCBjb2luVHlwZSA9IChfY29pblR5cGUgPT0gbnVsbCkgPyBCTl82MCA6IGdldEJpZ0ludChfY29pblR5cGUpO1xuICAgICAgICBpZiAoY29pblR5cGUgPT09IEJOXzYwKSB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMuI2ZldGNoKFwiYWRkcihieXRlczMyKVwiKTtcbiAgICAgICAgICAgICAgICAvLyBObyBhZGRyZXNzXG4gICAgICAgICAgICAgICAgaWYgKHJlc3VsdCA9PSBudWxsIHx8IHJlc3VsdCA9PT0gWmVyb0FkZHJlc3MpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgICAgICBpZiAoaXNFcnJvcihlcnJvciwgXCJDQUxMX0VYQ0VQVElPTlwiKSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGlzRXZtQ29pblR5cGUoY29pblR5cGUpKSB7XG4gICAgICAgICAgICBjb25zdCBkYXRhID0gYXdhaXQgdGhpcy4jZmV0Y2goXCJhZGRyKGJ5dGVzMzIsdWludClcIiwgW2NvaW5UeXBlXSk7XG4gICAgICAgICAgICBpZiAoaXNIZXhTdHJpbmcoZGF0YSwgMjApKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGdldEFkZHJl
26774c3MoZGF0YSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICAvLyBUcnkgZGVjb2RpbmcgaXRzIEVWTSBjYW5vbmljYWwgY2hhaW4gYXMgYW4gRVZNIGNoYWluIGFkZHJlc3MgZmlyc3RcbiAgICAgICAgaWYgKGNvaW5UeXBlID49IDAgJiYgY29pblR5cGUgPCAweDgwMDAwMDAwKSB7XG4gICAgICAgICAgICBsZXQgZXRoQ29pblR5cGUgPSBjb2luVHlwZSArIEJpZ0ludCgweDgwMDAwMDAwKTtcbiAgICAgICAgICAgIGNvbnN0IGRhdGEgPSBhd2FpdCB0aGlzLiNmZXRjaChcImFkZHIoYnl0ZXMzMix1aW50KVwiLCBbZXRoQ29pblR5cGVdKTtcbiAgICAgICAgICAgIGlmIChpc0hleFN0cmluZyhkYXRhLCAyMCkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZ2V0QWRkcmVzcyhkYXRhKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAvLyBAVE9ETzogYWRkIGEgbmV3IG1ldGhvZCB0byB0aGUgTXVsdGljb2luUHJvdmlkZXJQbHVnaW4gYW5kIG1vdmVcbiAgICAgICAgLy8gdGhpcyBjaGVjayBhYm92ZSB0aGUgYXV0by1ldGgtZGVjb2RpbmcgY2h1bmsgYWJvdmUgdG8gZ2l2ZSB0aGVcbiAgICAgICAgLy8gcGx1Z2luIGEgY2hhbmNlIHRvIHByb2Nlc3MgdGhlIGNvaW5UeXBlIGFuZCByZXN1bHRcbiAgICAgICAgbGV0IGNvaW5QbHVnaW4gPSBudWxsO1xuICAgICAgICBmb3IgKGNvbnN0IHBsdWdpbiBvZiB0aGlzLnByb3ZpZGVyLnBsdWdpbnMpIHtcbiAgICAgICAgICAgIGlmICghKHBsdWdpbiBpbnN0YW5jZW9mIE11bHRpY29pblByb3ZpZGVyUGx1Z2luKSkge1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGNvaW5UeXBlIDw9IDB4ODAwMDAwMDAgJiYgcGx1Z2luLnN1cHBvcnRzQ29pblR5cGUoTnVtYmVyKGNvaW5UeXBlKSkpIHtcbiAgICAgICAgICAgICAgICBjb2luUGx1Z2luID0gcGx1Z2luO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChjb2luUGx1Z2luID09IG51bGwpIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgICAgIC8vIGtlY2NhazI1NihcImFkZHIoYnl0ZXMzMix1aW50MjU2XCIpXG4gICAgICAgIGNvbnN0IGRhdGEgPSBhd2FpdCB0aGlzLiNmZXRjaChcImFkZHIoYnl0ZXMzMix1aW50KVwiLCBbY29pblR5cGVdKTtcbiAgICAgICAgLy8gTm8gYWRkcmVzc1xuICAgICAgICBpZiAoZGF0YSA9PSBudWxsIHx8IGRhdGEgPT09IFwiMHhcIikge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGNvaW5UeXBlIDwgMHg4MDAwMDAwMCkge1xuICAgICAgICAgICAgLy8gQ29tcHV0ZSB0aGUgYWRkcmVzc1xuICAgICAgICAgICAgY29uc3QgYWRkcmVzcyA9IGF3YWl0IGNvaW5QbHVnaW4uZGVjb2RlQWRkcmVzcyhOdW1iZXIoY29pblR5cGUpLCBkYXRhKTtcbiAgICAgICAgICAgIGlmIChhZGRyZXNzICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gYWRkcmVzcztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBhc3NlcnQoZmFsc2UsIGBpbnZhbGlkIGNvaW4gZGF0YWAsIFwiVU5TVVBQT1JURURfT1BFUkFUSU9OXCIsIHtcbiAgICAgICAgICAgIG9wZXJhdGlvbjogYGdldEFkZHJlc3MoJHtjb2luVHlwZX0pYCxcbiAgICAgICAgICAgIGluZm86IHsgY29pblR5cGUsIGRhdGEgfVxuICAgICAgICB9KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogIFJlc29sdmVzIHRvIHRoZSBFSVAtNjM0IHRleHQgcmVjb3JkIGZvciAlJWtleSUlLCBvciBgYG51bGxgYFxuICAgICAqICBpZiB1bmNvbmZpZ3VyZWQuXG4gICAgICovXG4gICAgYXN5bmMgZ2V0VGV4dChrZXkpIHtcbiAgICAgICAgY29uc3QgZGF0YSA9IGF3YWl0IHRoaXMuI2ZldGNoKFwidGV4dChieXRlczMyLHN0cmluZylcIiwgW2tleV0pO1xuICAgICAgICBpZiAoZGF0YSA9PSBudWxsIHx8IGRhdGEgPT09IFwiMHhcIikge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGRhdGE7XG4gICAgfVxuICAgIC8qKlxuICAgICAqICBSc29sdmVzIHRvIHRoZSBjb250ZW50LWhhc2ggb3IgYGBudWxsYGAgaWYgdW5jb25maWd1cmVkLlxuICAgICAqL1xuICAgIGFzeW5jIGdldENvbnRlbnRIYXNoKCkge1xuICAgICAgICAvLyBrZWNjYWsyNTYoXCJjb250ZW50aGFzaCgpXCIpXG4gICAgICAgIGNvbnN0IGRhdGEgPSBhd2FpdCB0aGlzLiNmZXRjaChcImNvbnRlbnRoYXNoKGJ5dGVzMzIpXCIpO1xuICAgICAgICAvLyBObyBjb250ZW50aGFzaFxuICAgICAgICBpZiAoZGF0YSA9PSBudWxsIHx8IGRhdGEgPT09IFwiMHhcIikge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgLy8gSVBGUyAoQ0lEOiAxLCBUeXBlOiA3MD1EQUctUEIsIDcyPWxpYnAycC1rZXkpXG4gICAgICAgIGNvbnN0IGlwZnMgPSBkYXRhLm1hdGNoKC9eMHgoZTMwMTAxNzB8ZTUwMTAxNzIpKChbMC05YS1mXVswLTlhLWZdKShbMC05YS1mXVswLTlhLWZdKShbMC05YS1mXSopKSQvKTtcbiAgICAgICAgaWYgKGlwZnMpIHtcbiAgICAgICAgICAgIGNvbnN0IHNjaGVtZSA9IChpcGZzWzFdID09PSBcImUzMDEwMTcwXCIpID8gXCJpcGZzXCIgOiBcImlwbnNcIjtcbiAgICAgICAgICAgIGNvbnN0IGxlbmd0aCA9IHBhcnNlSW50KGlwZnNbNF0sIDE2KTtcbiAgICAgICAgICAgIGlmIChpcGZzWzVdLmxlbmd0aCA9PT0gbGVuZ3RoICogMikge1xuICAgICAgICAgICAgICAgIHJldHVybiBgJHtzY2hlbWV9Oi9cXC8ke2VuY29kZUJhc2U1OChcIjB4XCIgKyBpcGZzWzJdKX1gO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8vIFN3YXJtIChDSUQ6IDEsIFR5cGU6IHN3YXJtLW1hbmlmZXN0OyBoYXNoL2xlbmd0aCBoYXJkLWNvZGVkIHRvIGtlY2NhazI1Ni8zMilcbiAgICAgICAgY29uc3Qgc3dhcm0gPSBkYXRhLm1hdGNoKC9eMHhlNDAxMDFmYTAxMWIyMChbMC05YS1mXSopJC8pO1xuICAgICAgICBpZiAoc3dhcm0gJiYgc3dhcm1bMV0ubGVuZ3RoID09PSA2NCkge1xuICAgICAgICAgICAgcmV0dXJuIGBieno6L1xcLyR7c3dhcm1bMV19YDtcbiAgICAgICAgfVxuICAgICAgICBhc3NlcnQoZmFsc2UsIGBpbnZhbGlkIG9yIHVuc3VwcG9ydGVkIGNvbnRlbnQgaGFzaCBkYXRhYCwgXCJVTlNVUFBPUlRFRF9PUEVSQVRJT05cIiwge1xuICAgICAgICAgICAgb3BlcmF0aW9uOiBcImdldENvbnRlbnRIYXNoKClcIixcbiAgICAgICAgICAgIGluZm86IHsgZGF0YSB9XG4gICAgICAgI
26774H0pO1xuICAgIH1cbiAgICBhc3luYyBnZXROYW1lKCkge1xuICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy4jZmV0Y2goXCJuYW1lKGJ5dGVzMzIpXCIpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiAgUmVzb2x2ZXMgdG8gdGhlIGF2YXRhciB1cmwgb3IgYGBudWxsYGAgaWYgdGhlIGF2YXRhciBpcyBlaXRoZXJcbiAgICAgKiAgdW5jb25maWd1cmVkIG9yIGluY29ycmVjdGx5IGNvbmZpZ3VyZWQgKGUuZy4gcmVmZXJlbmNlcyBhbiBORlRcbiAgICAgKiAgbm90IG93bmVkIGJ5IHRoZSBhZGRyZXNzKS5cbiAgICAgKlxuICAgICAqICBJZiBkaWFnbm9zaW5nIGlzc3VlcyB3aXRoIGNvbmZpZ3VyYXRpb25zLCB0aGUgW1tfZ2V0QXZhdGFyXV1cbiAgICAgKiAgbWV0aG9kIG1heSBiZSB1c2VmdWwuXG4gICAgICovXG4gICAgYXN5bmMgZ2V0QXZhdGFyKCkge1xuICAgICAgICBjb25zdCBhdmF0YXIgPSBhd2FpdCB0aGlzLl9nZXRBdmF0YXIoKTtcbiAgICAgICAgcmV0dXJuIGF2YXRhci51cmw7XG4gICAgfVxuICAgIC8qKlxuICAgICAqICBXaGVuIHJlc29sdmluZyBhbiBhdmF0YXIsIHRoZXJlIGFyZSBtYW55IHN0ZXBzIGludm9sdmVkLCBzdWNoXG4gICAgICogIGZldGNoaW5nIG1ldGFkYXRhIGFuZCBwb3NzaWJseSB2YWxpZGF0aW5nIG93bmVyc2hpcCBvZiBhblxuICAgICAqICBORlQuXG4gICAgICpcbiAgICAgKiAgVGhpcyBtZXRob2QgY2FuIGJlIHVzZWQgdG8gZXhhbWluZSBlYWNoIHN0ZXAgYW5kIHRoZSB2YWx1ZSBpdFxuICAgICAqICB3YXMgd29ya2luZyBmcm9tLlxuICAgICAqL1xuICAgIGFzeW5jIF9nZXRBdmF0YXIoKSB7XG4gICAgICAgIGNvbnN0IGxpbmthZ2UgPSBbeyB0eXBlOiBcIm5hbWVcIiwgdmFsdWU6IHRoaXMubmFtZSB9XTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIC8vIHRlc3QgZGF0YSBmb3IgcmljbW9vLmV0aFxuICAgICAgICAgICAgLy9jb25zdCBhdmF0YXIgPSBcImVpcDE1NToxL2VyYzcyMToweDI2NTM4NWM3ZjQxMzIyMjhBMGQ1NEVCMUE5ZTc0NjBiOTFjMGNDNjgvMjkyMzNcIjtcbiAgICAgICAgICAgIGNvbnN0IGF2YXRhciA9IGF3YWl0IHRoaXMuZ2V0VGV4dChcImF2YXRhclwiKTtcbiAgICAgICAgICAgIGlmIChhdmF0YXIgPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIGxpbmthZ2UucHVzaCh7IHR5cGU6IFwiIWF2YXRhclwiLCB2YWx1ZTogXCJcIiB9KTtcbiAgICAgICAgICAgICAgICByZXR1cm4geyB1cmw6IG51bGwsIGxpbmthZ2UgfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGxpbmthZ2UucHVzaCh7IHR5cGU6IFwiYXZhdGFyXCIsIHZhbHVlOiBhdmF0YXIgfSk7XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IG1hdGNoZXJzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgbWF0Y2ggPSBhdmF0YXIubWF0Y2gobWF0Y2hlcnNbaV0pO1xuICAgICAgICAgICAgICAgIGlmIChtYXRjaCA9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjb25zdCBzY2hlbWUgPSBtYXRjaFsxXS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICAgICAgICAgIHN3aXRjaCAoc2NoZW1lKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgXCJodHRwc1wiOlxuICAgICAgICAgICAgICAgICAgICBjYXNlIFwiZGF0YVwiOlxuICAgICAgICAgICAgICAgICAgICAgICAgbGlua2FnZS5wdXNoKHsgdHlwZTogXCJ1cmxcIiwgdmFsdWU6IGF2YXRhciB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB7IGxpbmthZ2UsIHVybDogYXZhdGFyIH07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgXCJpcGZzXCI6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVybCA9IGdldElwZnNMaW5rKGF2YXRhcik7XG4gICAgICAgICAgICAgICAgICAgICAgICBsaW5rYWdlLnB1c2goeyB0eXBlOiBcImlwZnNcIiwgdmFsdWU6IGF2YXRhciB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxpbmthZ2UucHVzaCh7IHR5cGU6IFwidXJsXCIsIHZhbHVlOiB1cmwgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4geyBsaW5rYWdlLCB1cmwgfTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBjYXNlIFwiZXJjNzIxXCI6XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgXCJlcmMxMTU1XCI6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIERlcGVuZGluZyBvbiB0aGUgRVJDIHR5cGUsIHVzZSB0b2tlblVSSSh1aW50MjU2KSBvciB1cmwodWludDI1NilcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNlbGVjdG9yID0gKHNjaGVtZSA9PT0gXCJlcmM3MjFcIikgPyBcInRva2VuVVJJKHVpbnQyNTYpXCIgOiBcInVyaSh1aW50MjU2KVwiO1xuICAgICAgICAgICAgICAgICAgICAgICAgbGlua2FnZS5wdXNoKHsgdHlwZTogc2NoZW1lLCB2YWx1ZTogYXZhdGFyIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gVGhlIG93bmVyIG9mIHRoaXMgbmFtZVxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgb3duZXIgPSBhd2FpdCB0aGlzLmdldEFkZHJlc3MoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChvd25lciA9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGlua2FnZS5wdXNoKHsgdHlwZTogXCIhb3duZXJcIiwgdmFsdWU6IFwiXCIgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHsgdXJsOiBudWxsLCBsaW5rYWdlIH07XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjb21wcyA9IChtYXRjaFsyXSB8fCBcIlwiKS5zcGxpdChcIi9cIik7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoY29tcHMubGVuZ3RoICE9PSAyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGlua2FnZS5wdXNoKHsgdHlwZTogYCEke3NjaGVtZX1jYWlwYCwgdmFsdWU6IChtYXRjaFsyXSB8fCBcIlwiKSB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4geyB1cmw6IG51bGwsIGxpbmthZ2UgfTtcbiAgICAgICAgICAgICAgICAgICAgICAgI
26774H1cbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHRva2VuSWQgPSBjb21wc1sxXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNvbnRyYWN0ID0gbmV3IENvbnRyYWN0KGNvbXBzWzBdLCBbXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gRVJDLTcyMVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiZnVuY3Rpb24gdG9rZW5VUkkodWludCkgdmlldyByZXR1cm5zIChzdHJpbmcpXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJmdW5jdGlvbiBvd25lck9mKHVpbnQpIHZpZXcgcmV0dXJucyAoYWRkcmVzcylcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBFUkMtMTE1NVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiZnVuY3Rpb24gdXJpKHVpbnQpIHZpZXcgcmV0dXJucyAoc3RyaW5nKVwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiZnVuY3Rpb24gYmFsYW5jZU9mKGFkZHJlc3MsIHVpbnQyNTYpIHZpZXcgcmV0dXJucyAodWludClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgXSwgdGhpcy5wcm92aWRlcik7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBDaGVjayB0aGF0IHRoaXMgYWNjb3VudCBvd25zIHRoZSB0b2tlblxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNjaGVtZSA9PT0gXCJlcmM3MjFcIikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHRva2VuT3duZXIgPSBhd2FpdCBjb250cmFjdC5vd25lck9mKHRva2VuSWQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChvd25lciAhPT0gdG9rZW5Pd25lcikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5rYWdlLnB1c2goeyB0eXBlOiBcIiFvd25lclwiLCB2YWx1ZTogdG9rZW5Pd25lciB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHsgdXJsOiBudWxsLCBsaW5rYWdlIH07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmthZ2UucHVzaCh7IHR5cGU6IFwib3duZXJcIiwgdmFsdWU6IHRva2VuT3duZXIgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChzY2hlbWUgPT09IFwiZXJjMTE1NVwiKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYmFsYW5jZSA9IGF3YWl0IGNvbnRyYWN0LmJhbGFuY2VPZihvd25lciwgdG9rZW5JZCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFiYWxhbmNlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmthZ2UucHVzaCh7IHR5cGU6IFwiIWJhbGFuY2VcIiwgdmFsdWU6IFwiMFwiIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4geyB1cmw6IG51bGwsIGxpbmthZ2UgfTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGlua2FnZS5wdXNoKHsgdHlwZTogXCJiYWxhbmNlXCIsIHZhbHVlOiBiYWxhbmNlLnRvU3RyaW5nKCkgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBDYWxsIHRoZSB0b2tlbiBjb250cmFjdCBmb3IgdGhlIG1ldGFkYXRhIFVSTFxuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IG1ldGFkYXRhVXJsID0gYXdhaXQgY29udHJhY3Rbc2VsZWN0b3JdKHRva2VuSWQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1ldGFkYXRhVXJsID09IG51bGwgfHwgbWV0YWRhdGFVcmwgPT09IFwiMHhcIikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmthZ2UucHVzaCh7IHR5cGU6IFwiIW1ldGFkYXRhLXVybFwiLCB2YWx1ZTogXCJcIiB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4geyB1cmw6IG51bGwsIGxpbmthZ2UgfTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGxpbmthZ2UucHVzaCh7IHR5cGU6IFwibWV0YWRhdGEtdXJsLWJhc2VcIiwgdmFsdWU6IG1ldGFkYXRhVXJsIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gRVJDLTExNTUgYWxsb3dzIGEgZ2VuZXJpYyB7aWR9IGluIHRoZSBVUkxcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzY2hlbWUgPT09IFwiZXJjMTE1NVwiKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0YWRhdGFVcmwgPSBtZXRhZGF0YVVybC5yZXBsYWNlKFwie2lkfVwiLCB0b0JlSGV4KHRva2VuSWQsIDMyKS5zdWJzdHJpbmcoMikpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmthZ2UucHVzaCh7IHR5cGU6IFwibWV0YWRhdGEtdXJsLWV4cGFuZGVkXCIsIHZhbHVlOiBtZXRhZGF0YVVybCB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRyYW5zZm9ybSBJUEZTIG1ldGFkYXRhIGxpbmtzXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAobWV0YWRhdGFVcmwubWF0Y2goL15pcGZzOi9pKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGFkYXRhVXJsID0gZ2V0SXBmc0xpbmsobWV0YWRhdGFVcmwpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgbGlua2FnZS5wdXNoKHsgdHlwZTogXCJtZXRhZGF0YS11cmxcIiwgdmFsdWU6IG1ldGFkYXRhVXJsIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gR2V0IHRoZSB0b2tlbiBtZXRhZGF0YVxuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IG1ldGFkYXRhID0ge307XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IChuZXcgRmV0Y2hSZXF1ZXN0KG1ldGFkYXRhVXJsKSkuc2VuZCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVzcG9uc2UuYXNzZXJ0T2soKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0YWRhdGEgPSByZXNwb25zZS5ib2R5SnNvbjtcbiAgICAgICAgICAgICAgICAgICAgICAgI
26774H1cbiAgICAgICAgICAgICAgICAgICAgICAgIGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmthZ2UucHVzaCh7IHR5cGU6IFwiIW1ldGFkYXRhXCIsIHZhbHVlOiByZXNwb25zZS5ib2R5VGV4dCB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGJ5dGVzID0gcmVzcG9uc2UuYm9keTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGJ5dGVzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5rYWdlLnB1c2goeyB0eXBlOiBcIiFtZXRhZGF0YVwiLCB2YWx1ZTogaGV4bGlmeShieXRlcykgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHsgdXJsOiBudWxsLCBsaW5rYWdlIH07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB7IHVybDogbnVsbCwgbGlua2FnZSB9O1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFtZXRhZGF0YSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmthZ2UucHVzaCh7IHR5cGU6IFwiIW1ldGFkYXRhXCIsIHZhbHVlOiBcIlwiIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB7IHVybDogbnVsbCwgbGlua2FnZSB9O1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgbGlua2FnZS5wdXNoKHsgdHlwZTogXCJtZXRhZGF0YVwiLCB2YWx1ZTogSlNPTi5zdHJpbmdpZnkobWV0YWRhdGEpIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gUHVsbCB0aGUgaW1hZ2UgVVJMIG91dFxuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGltYWdlVXJsID0gbWV0YWRhdGEuaW1hZ2U7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIChpbWFnZVVybCkgIT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5rYWdlLnB1c2goeyB0eXBlOiBcIiFpbWFnZVVybFwiLCB2YWx1ZTogXCJcIiB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4geyB1cmw6IG51bGwsIGxpbmthZ2UgfTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpbWFnZVVybC5tYXRjaCgvXihodHRwczpcXC9cXC98ZGF0YTopL2kpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQWxsb3dcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRyYW5zZm9ybSBJUEZTIGxpbmsgdG8gZ2F0ZXdheVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGlwZnMgPSBpbWFnZVVybC5tYXRjaChtYXRjaGVySXBmcyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGlwZnMgPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5rYWdlLnB1c2goeyB0eXBlOiBcIiFpbWFnZVVybC1pcGZzXCIsIHZhbHVlOiBpbWFnZVVybCB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHsgdXJsOiBudWxsLCBsaW5rYWdlIH07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmthZ2UucHVzaCh7IHR5cGU6IFwiaW1hZ2VVcmwtaXBmc1wiLCB2YWx1ZTogaW1hZ2VVcmwgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1hZ2VVcmwgPSBnZXRJcGZzTGluayhpbWFnZVVybCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBsaW5rYWdlLnB1c2goeyB0eXBlOiBcInVybFwiLCB2YWx1ZTogaW1hZ2VVcmwgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4geyBsaW5rYWdlLCB1cmw6IGltYWdlVXJsIH07XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKGVycm9yKSB7IH1cbiAgICAgICAgcmV0dXJuIHsgbGlua2FnZSwgdXJsOiBudWxsIH07XG4gICAgfVxuICAgIHN0YXRpYyBhc3luYyBnZXRFbnNBZGRyZXNzKHByb3ZpZGVyKSB7XG4gICAgICAgIGNvbnN0IG5ldHdvcmsgPSBhd2FpdCBwcm92aWRlci5nZXROZXR3b3JrKCk7XG4gICAgICAgIGNvbnN0IGVuc1BsdWdpbiA9IG5ldHdvcmsuZ2V0UGx1Z2luKFwib3JnLmV0aGVycy5wbHVnaW5zLm5ldHdvcmsuRW5zXCIpO1xuICAgICAgICAvLyBObyBFTlMuLi5cbiAgICAgICAgYXNzZXJ0KGVuc1BsdWdpbiwgXCJuZXR3b3JrIGRvZXMgbm90IHN1cHBvcnQgRU5TXCIsIFwiVU5TVVBQT1JURURfT1BFUkFUSU9OXCIsIHtcbiAgICAgICAgICAgIG9wZXJhdGlvbjogXCJnZXRFbnNBZGRyZXNzXCIsIGluZm86IHsgbmV0d29yayB9XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gZW5zUGx1Z2luLmFkZHJlc3M7XG4gICAgfVxuICAgIHN0YXRpYyBhc3luYyBnZXRVbml2ZXJzYWxSZXNvbHZlckFkZHJl
26774c3MocHJvdmlkZXIpIHtcbiAgICAgICAgY29uc3QgbmV0d29yayA9IGF3YWl0IHByb3ZpZGVyLmdldE5ldHdvcmsoKTtcbiAgICAgICAgY29uc3QgZW5zUGx1Z2luID0gbmV0d29yay5nZXRQbHVnaW4oXCJvcmcuZXRoZXJzLnBsdWdpbnMubmV0d29yay5FbnNcIik7XG4gICAgICAgIGlmIChlbnNQbHVnaW4gJiYgZW5zUGx1Z2luLnVuaXZlcnNhbFJlc29sdmVyKSB7XG4gICAgICAgICAgICByZXR1cm4gZW5zUGx1Z2luLnVuaXZlcnNhbFJlc29sdmVyO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICBzdGF0aWMgYXN5bmMgI2dldFJlc29sdmVyKHByb3ZpZGVyLCBuYW1lKSB7XG4gICAgICAgIGNvbnN0IGVuc0FkZHIgPSBhd2FpdCBFbnNSZXNvbHZlci5nZXRFbnNBZGRyZXNzKHByb3ZpZGVyKTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGNvbnN0IGNvbnRyYWN0ID0gbmV3IENvbnRyYWN0KGVuc0FkZHIsIFtcbiAgICAgICAgICAgICAgICBcImZ1bmN0aW9uIHJlc29sdmVyKGJ5dGVzMzIpIHZpZXcgcmV0dXJucyAoYWRkcmVzcylcIlxuICAgICAgICAgICAgXSwgcHJvdmlkZXIpO1xuICAgICAgICAgICAgY29uc3QgYWRkciA9IGF3YWl0IGNvbnRyYWN0LnJlc29sdmVyKG5hbWVoYXNoKG5hbWUpLCB7XG4gICAgICAgICAgICAgICAgZW5hYmxlQ2NpcFJlYWQ6IHRydWVcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgaWYgKGFkZHIgPT09IFplcm9BZGRyZXNzKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gYWRkcjtcbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgIC8vIEVOUyByZWdpc3RyeSBjYW5ub3QgdGhyb3cgZXJyb3JzIG9uIHJlc29sdmVyKGJ5dGVzMzIpLFxuICAgICAgICAgICAgLy8gc28gcHJvYmFibHkgYSBsaW5rIGVycm9yXG4gICAgICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgc3RhdGljIGFzeW5jIGxvb2t1cEFkZHJlc3MocHJvdmlkZXIsIGFkZHJlc3MsIF9jb2luVHlwZSkge1xuICAgICAgICBjb25zdCBjb2luVHlwZSA9IChfY29pblR5cGUgPT0gbnVsbCkgPyBCTl82MCA6IGdldEJpZ0ludChfY29pblR5cGUpO1xuICAgICAgICBpZiAoaXNFdm1Db2luVHlwZShjb2luVHlwZSkpIHtcbiAgICAgICAgICAgIGFkZHJlc3MgPSBnZXRBZGRyZXNzKGFkZHJlc3MpO1xuICAgICAgICB9XG4gICAgICAgIC8vIFdlIGhhdmUgYSBVbml2ZXJzYWwgcmVzb2x2ZXIsIHVzZSBpdFxuICAgICAgICBjb25zdCB1bml2ZXJzYWwgPSBhd2FpdCBjcmVhdGVVbml2ZXJzYWwocHJvdmlkZXIpO1xuICAgICAgICBpZiAodW5pdmVyc2FsKSB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHVuaXZlcnNhbC5yZXZlcnNlKGFkZHJlc3MsIGNvaW5UeXBlLCB7XG4gICAgICAgICAgICAgICAgICAgIGVuYWJsZUNjaXBSZWFkOiB0cnVlXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgY29uc3QgYWRkciA9IHJlc3VsdC5wcmltYXJ5O1xuICAgICAgICAgICAgICAgIGlmICghaXNWYWxpZE5hbWUoYWRkcikpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiBhZGRyO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICBpZiAoaXNFcnJvcihlLCBcIkNBTExfRVhDRVBUSU9OXCIpICYmIGUucmVhc29uID09PSBcIlJlc29sdmVyTm90Rm91bmQoYnl0ZXMpXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHRocm93IGU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgLy8gVXNlIGxlZ2FjeSByZXZlcnNlIGxvb2t1cFxuICAgICAgICBhc3NlcnQoY29pblR5cGUgPT09IEJOXzYwLCBcImxvb2t1cEFkZHJlc3MgY29pblR5cGUgcmVxdWlyZXMgRU5TIFVuaXZlcnNhbCBSZXNvbHZlclwiLCBcIlVOU1VQUE9SVEVEX09QRVJBVElPTlwiLCB7XG4gICAgICAgICAgICBvcGVyYXRpb246IFwibG9va3VwQWRkcmVzc1wiXG4gICAgICAgIH0pO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgY29uc3QgcmVzb2x2ZXIgPSBhd2FpdCBFbnNSZXNvbHZlci5mcm9tTmFtZShwcm92aWRlciwgYCR7YWRkcmVzcy50b0xvd2VyQ2FzZSgpLnN1YnN0cmluZygyKX0uYWRkci5yZXZlcnNlYCk7XG4gICAgICAgICAgICBpZiAoIXJlc29sdmVyKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCBuYW1lID0gYXdhaXQgcmVzb2x2ZXIuZ2V0TmFtZSgpO1xuICAgICAgICAgICAgaWYgKG5hbWUgPT0gbnVsbCB8fCAhaXNWYWxpZE5hbWUobmFtZSkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIEZhaWxlZCBmb3J3YXJkIHJlc29sdXRpb25cbiAgICAgICAgICAgIGNvbnN0IGNoZWNrID0gYXdhaXQgcHJvdmlkZXIucmVzb2x2ZU5hbWUobmFtZSk7XG4gICAgICAgICAgICBpZiAoY2hlY2sgIT09IGFkZHJlc3MpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBuYW1lO1xuICAgICAgICB9XG4gICAgICAgIGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgLy8gTm8gZGF0YSB3YXMgcmV0dXJuZWQgZnJvbSB0aGUgcmVzb2x2ZXJcbiAgICAgICAgICAgIGlmIChpc0Vycm9yKGVycm9yLCBcIkJBRF9EQVRBXCIpICYmIGVycm9yLnZhbHVlID09PSBcIjB4XCIpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIFNvbWV0aGluZyByZXZlcnRlZFxuICAgICAgICAgICAgaWYgKGlzRXJyb3IoZXJyb3IsIFwiQ0FMTF9FWENFUFRJT05cIikpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgI
26774H1cbiAgICAgICAgICAgIHRocm93IGVycm9yO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqICBSZXNvbHZlIHRvIHRoZSBFTlMgcmVzb2x2ZXIgZm9yICUlbmFtZSUlIHVzaW5nICUlcHJvdmlkZXIlJSBvclxuICAgICAqICBgYG51bGxgYCBpZiB1bmNvbmZpZ3VyZWQuXG4gICAgICovXG4gICAgc3RhdGljIGFzeW5jIGZyb21OYW1lKHByb3ZpZGVyLCBuYW1lKSB7XG4gICAgICAgIC8vIFdlIGhhdmUgYSBVbml2ZXJzYWwgUmVzb2x2ZXIsIHVzZSBpdFxuICAgICAgICBjb25zdCB1bml2ZXJzYWwgPSBhd2FpdCBjcmVhdGVVbml2ZXJzYWwocHJvdmlkZXIpO1xuICAgICAgICBpZiAodW5pdmVyc2FsKSB7XG4gICAgICAgICAgICBsZXQgZG5zTmFtZTtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgZG5zTmFtZSA9IGRuc0VuY29kZShlbnNOb3JtYWxpemUobmFtZSksIDI1NSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgICAgICAvLyBTaG91bGQgdGhpcyBlbWl0IGFuIGVycm9yIGluIHRoZSBwcm92aWRlciBkZWJ1ZyBldmVudD9cbiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHVuaXZlcnNhbC5yZXF1aXJlUmVzb2x2ZXIoZG5zTmFtZSk7XG4gICAgICAgICAgICByZXR1cm4gbmV3IEVuc1Jlc29sdmVyKHByb3ZpZGVyLCByZXN1bHQucmVzb2x2ZXIsIG5hbWUsIHJlc3VsdC5leHRlbmRlZCk7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IGN1cnJlbnROYW1lID0gbmFtZTtcbiAgICAgICAgd2hpbGUgKHRydWUpIHtcbiAgICAgICAgICAgIGlmIChjdXJyZW50TmFtZSA9PT0gXCJcIiB8fCBjdXJyZW50TmFtZSA9PT0gXCIuXCIpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIE9wdGltaXphdGlvbiBzaW5jZSB0aGUgZXRoIG5vZGUgY2Fubm90IGNoYW5nZSBhbmQgZG9lc1xuICAgICAgICAgICAgLy8gbm90IGhhdmUgYSB3aWxkY2FyZCByZXNvbHZlclxuICAgICAgICAgICAgaWYgKG5hbWUgIT09IFwiZXRoXCIgJiYgY3VycmVudE5hbWUgPT09IFwiZXRoXCIpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIENoZWNrIHRoZSBjdXJyZW50IG5vZGUgZm9yIGEgcmVzb2x2ZXJcbiAgICAgICAgICAgIGNvbnN0IGFkZHIgPSBhd2FpdCBFbnNSZXNvbHZlci4jZ2V0UmVzb2x2ZXIocHJvdmlkZXIsIGN1cnJlbnROYW1lKTtcbiAgICAgICAgICAgIC8vIEZvdW5kIGEgcmVzb2x2ZXIhXG4gICAgICAgICAgICBpZiAoYWRkciAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgcmVzb2x2ZXIgPSBuZXcgRW5zUmVzb2x2ZXIocHJvdmlkZXIsIGFkZHIsIG5hbWUpO1xuICAgICAgICAgICAgICAgIC8vIExlZ2FjeSByZXNvbHZlciBmb3VuZCwgdXNpbmcgRUlQLTI1NDQgc28gaXQgaXNuJ3Qgc2FmZSB0byB1c2VcbiAgICAgICAgICAgICAgICBpZiAoY3VycmVudE5hbWUgIT09IG5hbWUgJiYgIShhd2FpdCByZXNvbHZlci5zdXBwb3J0c1dpbGRjYXJkKCkpKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gcmVzb2x2ZXI7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBHZXQgdGhlIHBhcmVudCBub2RlXG4gICAgICAgICAgICBjdXJyZW50TmFtZSA9IGN1cnJlbnROYW1lLnNwbGl0KFwiLlwiKS5zbGljZSgxKS5qb2luKFwiLlwiKTtcbiAgICAgICAgfVxuICAgIH1cbn1cbmFzeW5jIGZ1bmN0aW9uIGNyZWF0ZVVuaXZlcnNhbChwcm92aWRlcikge1xuICAgIGNvbnN0IGFkZHJlc3MgPSBhd2FpdCBFbnNSZXNvbHZlci5nZXRVbml2ZXJzYWxSZXNvbHZlckFkZHJl
26774c3MocHJvdmlkZXIpO1xuICAgIGlmICghYWRkcmVzcykge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgcmV0dXJuIG5ldyBDb250cmFjdChhZGRyZXNzLCBbXG4gICAgICAgIFwiZnVuY3Rpb24gcmVxdWlyZVJlc29sdmVyKGJ5dGVzKSB2aWV3IHJldHVybnMgKChieXRlcyBuYW1lLCB1aW50MjU2IG9mZnNldCwgYnl0ZXMzMiBub2RlLCBhZGRyZXNzIHJlc29sdmVyLCBib29sIGV4dGVuZGVkKSlcIixcbiAgICAgICAgXCJmdW5jdGlvbiBmaW5kUmVzb2x2ZXIoYnl0ZXMpIHZpZXcgcmV0dXJucyAoYWRkcmVzcyByZXNvbHZlciwgYnl0ZXMzMiBub2RlLCB1aW50IG9mZnNldClcIixcbiAgICAgICAgXCJmdW5jdGlvbiByZXNvbHZlKGJ5dGVzIG5hbWUsIGJ5dGVzIGRhdGEpIHZpZXcgcmV0dXJucyAoYnl0ZXMgcmVzdWx0LCBhZGRyZXNzIHJlc29sdmVyKVwiLFxuICAgICAgICBcImZ1bmN0aW9uIHJldmVyc2UoYnl0ZXMgbmFtZSwgdWludCBjb2luVHlwZSkgdmlldyByZXR1cm5zIChzdHJpbmcgcHJpbWFyeSwgYWRkcmVzcyByZXNvbHZlciwgYWRkcmVzcyByZXZlcnNlUmVzb2x2ZXIpXCIsXG4gICAgICAgIFwiZXJyb3IgUmVzb2x2ZXJOb3RGb3VuZChieXRlcyBuYW1lKVwiLFxuICAgICAgICBcImVycm9yIFJlc29sdmVyTm90Q29udHJhY3QoYnl0ZXMgbmFtZSwgYWRkcmVzcyByZXNvbHZlcilcIixcbiAgICAgICAgXCJlcnJvciBSZXZlcnNlQWRkcmVzc01pc21hdGNoKHN0cmluZyBwcmltYXJ5LCBieXRlcyBwcmltYXJ5QWRkcmVzcylcIixcbiAgICAgICAgXCJlcnJvciBIdHRwRXJyb3IodWludDE2IHN0YXR1c0NvZGUsIHN0cmluZyBzdGF0dXNNZXNzYWdlKVwiXG4gICAgXSwgcHJvdmlkZXIpO1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9ZW5zLXJlc29sdmVyLmpzLm1hcCIsIi8qKlxuICogIEBfaWdub3JlXG4gKi9cbmltcG9ydCB7IGdldEFkZHJlc3MsIGdldENyZWF0ZUFkZHJlc3MgfSBmcm9tIFwiLi4vYWRkcmVzcy9pbmRleC5qc1wiO1xuaW1wb3J0IHsgU2lnbmF0dXJlIH0gZnJvbSBcIi4uL2NyeXB0by9pbmRleC5qc1wiO1xuaW1wb3J0IHsgYWNjZXNzTGlzdGlmeSB9IGZyb20gXCIuLi90cmFuc2FjdGlvbi9pbmRleC5qc1wiO1xuaW1wb3J0IHsgZ2V0QmlnSW50LCBnZXROdW1iZXIsIGhleGxpZnksIGlzSGV4U3RyaW5nLCB6ZXJvUGFkVmFsdWUsIGFzc2VydCwgYXNzZXJ0QXJndW1lbnQgfSBmcm9tIFwiLi4vdXRpbHMvaW5kZXguanNcIjtcbmNvbnN0IEJOXzAgPSBCaWdJbnQoMCk7XG5leHBvcnQgZnVuY3Rpb24gYWxsb3dOdWxsKGZvcm1hdCwgbnVsbFZhbHVlKSB7XG4gICAgcmV0dXJuIChmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgaWYgKHZhbHVlID09IG51bGwpIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsVmFsdWU7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZvcm1hdCh2YWx1ZSk7XG4gICAgfSk7XG59XG5leHBvcnQgZnVuY3Rpb24gYXJyYXlPZihmb3JtYXQsIGFsbG93TnVsbCkge1xuICAgIHJldHVybiAoKGFycmF5KSA9PiB7XG4gICAgICAgIGlmIChhbGxvd051bGwgJiYgYXJyYXkgPT0gbnVsbCkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFBcnJheS5pc0FycmF5KGFycmF5KSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwibm90IGFuIGFycmF5XCIpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBhcnJheS5tYXAoKGkpID0+IGZvcm1hdChpKSk7XG4gICAgfSk7XG59XG4vLyBSZXF1aXJlcyBhbiBvYmplY3Qgd2hpY2ggbWF0Y2hlcyBhIGZsZWV0IG9mIG90aGVyIGZvcm1hdHRlcnNcbi8vIEFueSBGb3JtYXRGdW5jIG1heSByZXR1cm4gYHVuZGVmaW5lZGAgdG8gaGF2ZSB0aGUgdmFsdWUgb21pdHRlZFxuLy8gZnJvbSB0aGUgcmVzdWx0IG9iamVjdC4gQ2FsbHMgcHJlc2VydmUgYHRoaXNgLlxuZXhwb3J0IGZ1bmN0aW9uIG9iamVjdChmb3JtYXQsIGFsdE5hbWVzKSB7XG4gICAgcmV0dXJuICgodmFsdWUpID0+IHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0ge307XG4gICAgICAgIGZvciAoY29uc3Qga2V5IGluIGZvcm1hdCkge1xuICAgICAgICAgICAgbGV0IHNyY0tleSA9IGtleTtcbiAgICAgICAgICAgIGlmIChhbHROYW1lcyAmJiBrZXkgaW4gYWx0TmFtZXMgJiYgIShzcmNLZXkgaW4gdmFsdWUpKSB7XG4gICAgICAgICAgICAgICAgZm9yIChjb25zdCBhbHRLZXkgb2YgYWx0TmFtZXNba2V5XSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoYWx0S2V5IGluIHZhbHVlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBzcmNLZXkgPSBhbHRLZXk7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgY29uc3QgbnYgPSBmb3JtYXRba2V5XSh2YWx1ZVtzcmNLZXldKTtcbiAgICAgICAgICAgICAgICBpZiAobnYgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgICAgICByZXN1bHRba2V5XSA9IG52O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgICAgIGNvbnN0IG1lc3NhZ2UgPSAoZXJyb3IgaW5zdGFuY2VvZiBFcnJvcikgPyBlcnJvci5tZXNzYWdlIDogXCJub3QtYW4tZXJyb3JcIjtcbiAgICAgICAgICAgICAgICBhc3NlcnQoZmFsc2UsIGBpbnZhbGlkIHZhbHVlIGZvciB2YWx1ZS4ke2tleX0gKCR7bWVzc2FnZX0pYCwgXCJCQURfREFUQVwiLCB7IHZhbHVlIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfSk7XG59XG5leHBvcnQgZnVuY3Rpb24gZm9ybWF0Qm9vbGVhbih2YWx1ZSkge1xuICAgIHN3aXRjaCAodmFsdWUpIHtcbiAgICAgICAgY2FzZSB0cnVlOlxuICAgICAgICBjYXNlIFwidHJ1ZVwiOlxuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIGNhc2UgZmFsc2U6XG4gICAgICAgIGNhc2UgXCJmYWxzZVwiOlxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBhc3NlcnRBcmd1bWVudChmYWxzZSwgYGludmFsaWQgYm9vbGVhbjsgJHtKU09OLnN0cmluZ2lmeSh2YWx1ZSl9YCwgXCJ2YWx1ZVwiLCB2YWx1ZSk7XG59XG5leHBvcnQgZnVuY3Rpb24gZm9ybWF0RGF0YSh2YWx1ZSkge1xuICAgIGFzc2VydEFyZ3VtZW50KGlzSGV4U3RyaW5nKHZhbHVlLCB0cnVlKSwgXCJpbnZhbGlkIGRhdGFcIiwgXCJ2YWx1ZVwiLCB2YWx1ZSk7XG4gICAgcmV0dXJuIHZhbHVlO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGZvcm1hdEhhc2godmFsdWUpIHtcbiAgICBhc3NlcnRBcmd1bWVudChpc0hleFN0cmluZyh2YWx1ZSwgMzIpLCBcImludmFsaWQgaGFzaFwiLCBcInZhbHVlXCIsIHZhbHVlKTtcbiAgICByZXR1cm4gdmFsdWU7XG59XG5leHBvcnQgZnVuY3Rpb24gZm9ybWF0VWludDI1Nih2YWx1ZSkge1xuICAgIGlmICghaXNIZXhTdHJpbmcodmFsdWUpKSB7XG4gICAgICAgI
26774HRocm93IG5ldyBFcnJvcihcImludmFsaWQgdWludDI1NlwiKTtcbiAgICB9XG4gICAgcmV0dXJuIHplcm9QYWRWYWx1ZSh2YWx1ZSwgMzIpO1xufVxuY29uc3QgX2Zvcm1hdExvZyA9IG9iamVjdCh7XG4gICAgYWRkcmVzczogZ2V0QWRkcmVzcyxcbiAgICBibG9ja0hhc2g6IGZvcm1hdEhhc2gsXG4gICAgYmxvY2tOdW1iZXI6IGdldE51bWJlcixcbiAgICBkYXRhOiBmb3JtYXREYXRhLFxuICAgIGluZGV4OiBnZXROdW1iZXIsXG4gICAgcmVtb3ZlZDogYWxsb3dOdWxsKGZvcm1hdEJvb2xlYW4sIGZhbHNlKSxcbiAgICB0b3BpY3M6IGFycmF5T2YoZm9ybWF0SGFzaCksXG4gICAgdHJhbnNhY3Rpb25IYXNoOiBmb3JtYXRIYXNoLFxuICAgIHRyYW5zYWN0aW9uSW5kZXg6IGdldE51bWJlcixcbn0sIHtcbiAgICBpbmRleDogW1wibG9nSW5kZXhcIl1cbn0pO1xuZXhwb3J0IGZ1bmN0aW9uIGZvcm1hdExvZyh2YWx1ZSkge1xuICAgIHJldHVybiBfZm9ybWF0TG9nKHZhbHVlKTtcbn1cbmNvbnN0IF9mb3JtYXRCbG9jayA9IG9iamVjdCh7XG4gICAgaGFzaDogYWxsb3dOdWxsKGZvcm1hdEhhc2gpLFxuICAgIHBhcmVudEhhc2g6IGZvcm1hdEhhc2gsXG4gICAgcGFyZW50QmVhY29uQmxvY2tSb290OiBhbGxvd051bGwoZm9ybWF0SGFzaCwgbnVsbCksXG4gICAgbnVtYmVyOiBnZXROdW1iZXIsXG4gICAgdGltZXN0YW1wOiBnZXROdW1iZXIsXG4gICAgbm9uY2U6IGFsbG93TnVsbChmb3JtYXREYXRhKSxcbiAgICBkaWZmaWN1bHR5OiBnZXRCaWdJbnQsXG4gICAgZ2FzTGltaXQ6IGdldEJpZ0ludCxcbiAgICBnYXNVc2VkOiBnZXRCaWdJbnQsXG4gICAgc3RhdGVSb290OiBhbGxvd051bGwoZm9ybWF0SGFzaCwgbnVsbCksXG4gICAgcmVjZWlwdHNSb290OiBhbGxvd051bGwoZm9ybWF0SGFzaCwgbnVsbCksXG4gICAgdHJhbnNhY3Rpb25zUm9vdDogYWxsb3dOdWxsKGZvcm1hdEhhc2gsIG51bGwpLFxuICAgIGJsb2JHYXNVc2VkOiBhbGxvd051bGwoZ2V0QmlnSW50LCBudWxsKSxcbiAgICBleGNlc3NCbG9iR2FzOiBhbGxvd051bGwoZ2V0QmlnSW50LCBudWxsKSxcbiAgICBtaW5lcjogYWxsb3dOdWxsKGdldEFkZHJl
26774c3MpLFxuICAgIHByZXZSYW5kYW86IGFsbG93TnVsbChmb3JtYXRIYXNoLCBudWxsKSxcbiAgICBleHRyYURhdGE6IGZvcm1hdERhdGEsXG4gICAgYmFzZUZlZVBlckdhczogYWxsb3dOdWxsKGdldEJpZ0ludClcbn0sIHtcbiAgICBwcmV2UmFuZGFvOiBbXCJtaXhIYXNoXCJdXG59KTtcbmV4cG9ydCBmdW5jdGlvbiBmb3JtYXRCbG9jayh2YWx1ZSkge1xuICAgIGNvbnN0IHJlc3VsdCA9IF9mb3JtYXRCbG9jayh2YWx1ZSk7XG4gICAgcmVzdWx0LnRyYW5zYWN0aW9ucyA9IHZhbHVlLnRyYW5zYWN0aW9ucy5tYXAoKHR4KSA9PiB7XG4gICAgICAgIGlmICh0eXBlb2YgKHR4KSA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgICAgICAgcmV0dXJuIHR4O1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmb3JtYXRUcmFuc2FjdGlvblJlc3BvbnNlKHR4KTtcbiAgICB9KTtcbiAgICByZXR1cm4gcmVzdWx0O1xufVxuY29uc3QgX2Zvcm1hdFJlY2VpcHRMb2cgPSBvYmplY3Qoe1xuICAgIHRyYW5zYWN0aW9uSW5kZXg6IGdldE51bWJlcixcbiAgICBibG9ja051bWJlcjogZ2V0TnVtYmVyLFxuICAgIHRyYW5zYWN0aW9uSGFzaDogZm9ybWF0SGFzaCxcbiAgICBhZGRyZXNzOiBnZXRBZGRyZXNzLFxuICAgIHRvcGljczogYXJyYXlPZihmb3JtYXRIYXNoKSxcbiAgICBkYXRhOiBmb3JtYXREYXRhLFxuICAgIGluZGV4OiBnZXROdW1iZXIsXG4gICAgYmxvY2tIYXNoOiBmb3JtYXRIYXNoLFxufSwge1xuICAgIGluZGV4OiBbXCJsb2dJbmRleFwiXVxufSk7XG5leHBvcnQgZnVuY3Rpb24gZm9ybWF0UmVjZWlwdExvZyh2YWx1ZSkge1xuICAgIHJldHVybiBfZm9ybWF0UmVjZWlwdExvZyh2YWx1ZSk7XG59XG5jb25zdCBfZm9ybWF0VHJhbnNhY3Rpb25SZWNlaXB0ID0gb2JqZWN0KHtcbiAgICB0bzogYWxsb3dOdWxsKGdldEFkZHJl
26774c3MsIG51bGwpLFxuICAgIGZyb206IGFsbG93TnVsbChnZXRBZGRyZXNzLCBudWxsKSxcbiAgICBjb250cmFjdEFkZHJlc3M6IGFsbG93TnVsbChnZXRBZGRyZXNzLCBudWxsKSxcbiAgICAvLyBzaG91bGQgYmUgYWxsb3dOdWxsKGhhc2gpLCBidXQgYnJva2VuLUVJUC02NTggc3VwcG9ydCBpcyBoYW5kbGVkIGluIHJlY2VpcHRcbiAgICBpbmRleDogZ2V0TnVtYmVyLFxuICAgIHJvb3Q6IGFsbG93TnVsbChoZXhsaWZ5KSxcbiAgICBnYXNVc2VkOiBnZXRCaWdJbnQsXG4gICAgYmxvYkdhc1VzZWQ6IGFsbG93TnVsbChnZXRCaWdJbnQsIG51bGwpLFxuICAgIGxvZ3NCbG9vbTogYWxsb3dOdWxsKGZvcm1hdERhdGEpLFxuICAgIGJsb2NrSGFzaDogZm9ybWF0SGFzaCxcbiAgICBoYXNoOiBmb3JtYXRIYXNoLFxuICAgIGxvZ3M6IGFycmF5T2YoZm9ybWF0UmVjZWlwdExvZyksXG4gICAgYmxvY2tOdW1iZXI6IGdldE51bWJlcixcbiAgICAvL2NvbmZpcm1hdGlvbnM6IGFsbG93TnVsbChnZXROdW1iZXIsIG51bGwpLFxuICAgIGN1bXVsYXRpdmVHYXNVc2VkOiBnZXRCaWdJbnQsXG4gICAgZWZmZWN0aXZlR2FzUHJpY2U6IGFsbG93TnVsbChnZXRCaWdJbnQpLFxuICAgIGJsb2JHYXNQcmljZTogYWxsb3dOdWxsKGdldEJpZ0ludCwgbnVsbCksXG4gICAgc3RhdHVzOiBhbGxvd051bGwoZ2V0TnVtYmVyKSxcbiAgICB0eXBlOiBhbGxvd051bGwoZ2V0TnVtYmVyLCAwKVxufSwge1xuICAgIGVmZmVjdGl2ZUdhc1ByaWNlOiBbXCJnYXNQcmljZVwiXSxcbiAgICBoYXNoOiBbXCJ0cmFuc2FjdGlvbkhhc2hcIl0sXG4gICAgaW5kZXg6IFtcInRyYW5zYWN0aW9uSW5kZXhcIl0sXG59KTtcbmV4cG9ydCBmdW5jdGlvbiBmb3JtYXRUcmFuc2FjdGlvblJlY2VpcHQodmFsdWUpIHtcbiAgICByZXR1cm4gX2Zvcm1hdFRyYW5zYWN0aW9uUmVjZWlwdCh2YWx1ZSk7XG59XG5leHBvcnQgZnVuY3Rpb24gZm9ybWF0VHJhbnNhY3Rpb25SZXNwb25zZSh2YWx1ZSkge1xuICAgIC8vIFNvbWUgY2xpZW50cyAoVGVzdFJQQykgZG8gc3RyYW5nZSB0aGluZ3MgbGlrZSByZXR1cm4gMHgwIGZvciB0aGVcbiAgICAvLyAwIGFkZHJlc3M7IGNvcnJlY3QgdGhpcyB0byBiZSBhIHJlYWwgYWRkcmVzc1xuICAgIGlmICh2YWx1ZS50byAmJiBnZXRCaWdJbnQodmFsdWUudG8pID09PSBCTl8wKSB7XG4gICAgICAgIHZhbHVlLnRvID0gXCIweDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDBcIjtcbiAgICB9XG4gICAgY29uc3QgcmVzdWx0ID0gb2JqZWN0KHtcbiAgICAgICAgaGFzaDogZm9ybWF0SGFzaCxcbiAgICAgICAgLy8gU29tZSBub2RlcyBkbyBub3QgcmV0dXJuIHRoaXMsIHVzdWFsbHkgdGVzdCBub2RlcyAobGlrZSBHYW5hY2hlKVxuICAgICAgICBpbmRleDogYWxsb3dOdWxsKGdldE51bWJlciwgdW5kZWZpbmVkKSxcbiAgICAgICAgdHlwZTogKHZhbHVlKSA9PiB7XG4gICAgICAgICAgICBpZiAodmFsdWUgPT09IFwiMHhcIiB8fCB2YWx1ZSA9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIDA7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gZ2V0TnVtYmVyKHZhbHVlKTtcbiAgICAgICAgfSxcbiAgICAgICAgYWNjZXNzTGlzdDogYWxsb3dOdWxsKGFjY2Vzc0xpc3RpZnksIG51bGwpLFxuICAgICAgICBibG9iVmVyc2lvbmVkSGFzaGVzOiBhbGxvd051bGwoYXJyYXlPZihmb3JtYXRIYXNoLCB0cnVlKSwgbnVsbCksXG4gICAgICAgIGF1dGhvcml6YXRpb25MaXN0OiBhbGxvd051bGwoYXJyYXlPZigodikgPT4ge1xuICAgICAgICAgICAgbGV0IHNpZztcbiAgICAgICAgICAgIGlmICh2LnNpZ25hdHVyZSkge1xuICAgICAgICAgICAgICAgIHNpZyA9IHYuc2lnbmF0dXJlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgbGV0IHlQYXJpdHkgPSB2LnlQYXJpdHk7XG4gICAgICAgICAgICAgICAgaWYgKHlQYXJpdHkgPT09IFwiMHgxYlwiKSB7XG4gICAgICAgICAgICAgICAgICAgIHlQYXJpdHkgPSAwO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIGlmICh5UGFyaXR5ID09PSBcIjB4MWNcIikge1xuICAgICAgICAgICAgICAgICAgICB5UGFyaXR5ID0gMTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgc2lnID0gT2JqZWN0LmFzc2lnbih7fSwgdiwgeyB5UGFyaXR5IH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICBhZGRyZXNzOiBnZXRBZGRyZXNzKHYuYWRkcmVzcyksXG4gICAgICAgICAgICAgICAgY2hhaW5JZDogZ2V0QmlnSW50KHYuY2hhaW5JZCksXG4gICAgICAgICAgICAgICAgbm9uY2U6IGdldEJpZ0ludCh2Lm5vbmNlKSxcbiAgICAgICAgICAgICAgICBzaWduYXR1cmU6IFNpZ25hdHVyZS5mcm9tKHNpZylcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sIGZhbHNlKSwgbnVsbCksXG4gICAgICAgIGJsb2NrSGFzaDogYWxsb3dOdWxsKGZvcm1hdEhhc2gsIG51bGwpLFxuICAgICAgICBibG9ja051bWJlcjogYWxsb3dOdWxsKGdldE51bWJlciwgbnVsbCksXG4gICAgICAgIHRyYW5zYWN0aW9uSW5kZXg6IGFsbG93TnVsbChnZXROdW1iZXIsIG51bGwpLFxuICAgICAgICBmcm9tOiBnZXRBZGRyZXNzLFxuICAgICAgICAvLyBlaXRoZXIgKGdhc1ByaWNlKSBvciAobWF4UHJpb3JpdHlGZWVQZXJHYXMgKyBtYXhGZWVQZXJHYXMpIG11c3QgYmUgc2V0XG4gICAgICAgIGdhc1ByaWNlOiBhbGxvd051bGwoZ2V0QmlnSW50KSxcbiAgICAgICAgbWF4UHJpb3JpdHlGZWVQZXJHYXM6IGFsbG93TnVsbChnZXRCaWdJbnQpLFxuICAgICAgICBtYXhGZWVQZXJHYXM6IGFsbG93TnVsbChnZXRCaWdJbnQpLFxuICAgICAgICBtYXhGZWVQZXJCbG9iR2FzOiBhbGxvd051bGwoZ2V0QmlnSW50LCBudWxsKSxcbiAgICAgICAgZ2FzTGltaXQ6IGdldEJpZ0ludCxcbiAgICAgICAgdG86IGFsbG93TnVsbChnZXRBZGRyZXNzLCBudWxsKSxcbiAgICAgICAgdmFsdWU6IGdldEJpZ0ludCxcbiAgICAgICAgbm9uY2U6IGdldE51bWJlcixcbiAgICAgICAgZGF0YTogZm9ybWF0RGF0YSxcbiAgICAgICAgY3JlYXRlczogYWxsb3dOdWxsKGdldEFkZHJl
26774c3MsIG51bGwpLFxuICAgICAgICBjaGFpbklkOiBhbGxvd051bGwoZ2V0QmlnSW50LCBudWxsKVxuICAgIH0sIHtcbiAgICAgICAgZGF0YTogW1wiaW5wdXRcIl0sXG4gICAgICAgIGdhc0xpbWl0OiBbXCJnYXNcIl0sXG4gICAgICAgIGluZGV4OiBbXCJ0cmFuc2FjdGlvbkluZGV4XCJdXG4gICAgfSkodmFsdWUpO1xuICAgIC8vIElmIHRvIGFuZCBjcmVhdGVzIGFyZSBlbXB0eSwgcG9wdWxhdGUgdGhlIGNyZWF0ZXMgZnJvbSB0aGUgdmFsdWVcbiAgICBpZiAocmVzdWx0LnRvID09IG51bGwgJiYgcmVzdWx0LmNyZWF0ZXMgPT0gbnVsbCkge1xuICAgICAgICByZXN1bHQuY3JlYXRlcyA9IGdldENyZWF0ZUFkZHJlc3MocmVzdWx0KTtcbiAgICB9XG4gICAgLy8gQFRPRE86IENoZWNrIGZlZSBkYXRhXG4gICAgLy8gQWRkIGFuIGFjY2VzcyBsaXN0IHRvIHN1cHBvcnRlZCB0cmFuc2FjdGlvbiB0eXBlc1xuICAgIGlmICgodmFsdWUudHlwZSA9PT0gMSB8fCB2YWx1ZS50eXBlID09PSAyKSAmJiB2YWx1ZS5hY2Nlc3NMaXN0ID09IG51bGwpIHtcbiAgICAgICAgcmVzdWx0LmFjY2Vzc0xpc3QgPSBbXTtcbiAgICB9XG4gICAgLy8gQ29tcHV0ZSB0aGUgc2lnbmF0dXJlXG4gICAgaWYgKHZhbHVlLnNpZ25hdHVyZSkge1xuICAgICAgICByZXN1bHQuc2lnbmF0dXJlID0gU2lnbmF0dXJlLmZyb20odmFsdWUuc2lnbmF0dXJlKTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIHJlc3VsdC5zaWduYXR1cmUgPSBTaWduYXR1cmUuZnJvbSh2YWx1ZSk7XG4gICAgfVxuICAgIC8vIFNvbWUgYmFja2VuZHMgb21pdCBDaGFpbklkIG9uIGxlZ2FjeSB0cmFuc2FjdGlvbnMsIGJ1dCB3ZSBjYW4gY29tcHV0ZSBpdFxuICAgIGlmIChyZXN1bHQuY2hhaW5JZCA9PSBudWxsKSB7XG4gICAgICAgIGNvbnN0IGNoYWluSWQgPSByZXN1bHQuc2lnbmF0dXJlLmxlZ2FjeUNoYWluSWQ7XG4gICAgICAgIGlmIChjaGFpbklkICE9IG51bGwpIHtcbiAgICAgICAgICAgIHJlc3VsdC5jaGFpbklkID0gY2hhaW5JZDtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvLyBAVE9ETzogY2hlY2sgY2hhaW5JRFxuICAgIC8qXG4gICAgaWYgKHZhbHVlLmNoYWluSWQgIT0gbnVsbCkge1xuICAgICAgICBsZXQgY2hhaW5JZCA9IHZhbHVlLmNoYWluSWQ7XG5cbiAgICAgICAgaWYgKGlzSGV4U3RyaW5nKGNoYWluSWQpKSB7XG4gICAgICAgICAgICBjaGFpbklkID0gQmlnTnVtYmVyLmZyb20oY2hhaW5JZCkudG9OdW1iZXIoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJlc3VsdC5jaGFpbklkID0gY2hhaW5JZDtcblxuICAgIH0gZWxzZSB7XG4gICAgICAgIGxldCBjaGFpbklkID0gdmFsdWUubmV0d29ya0lkO1xuXG4gICAgICAgIC8vIGdldGgtZXRjIHJldHVybnMgY2hhaW5JZFxuICAgICAgICBpZiAoY2hhaW5JZCA9PSBudWxsICYmIHJlc3VsdC52ID09IG51bGwpIHtcbiAgICAgICAgICAgIGNoYWluSWQgPSB2YWx1ZS5jaGFpbklkO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGlzSGV4U3RyaW5nKGNoYWluSWQpKSB7XG4gICAgICAgICAgICBjaGFpbklkID0gQmlnTnVtYmVyLmZyb20oY2hhaW5JZCkudG9OdW1iZXIoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0eXBlb2YoY2hhaW5JZCkgIT09IFwibnVtYmVyXCIgJiYgcmVzdWx0LnYgIT0gbnVsbCkge1xuICAgICAgICAgICAgY2hhaW5JZCA9IChyZXN1bHQudiAtIDM1KSAvIDI7XG4gICAgICAgICAgICBpZiAoY2hhaW5JZCA8IDApIHsgY2hhaW5JZCA9IDA7IH1cbiAgICAgICAgICAgIGNoYWluSWQgPSBwYXJzZUludChjaGFpbklkKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0eXBlb2YoY2hhaW5JZCkgIT09IFwibnVtYmVyXCIpIHsgY2hhaW5JZCA9IDA7IH1cblxuICAgICAgICByZXN1bHQuY2hhaW5JZCA9IGNoYWluSWQ7XG4gICAgfVxuICAgICovXG4gICAgLy8gMHgwMDAwLi4uIHNob3VsZCBhY3R1YWxseSBiZSBudWxsXG4gICAgaWYgKHJlc3VsdC5ibG9ja0hhc2ggJiYgZ2V0QmlnSW50KHJlc3VsdC5ibG9ja0hhc2gpID09PSBCTl8wKSB7XG4gICAgICAgIHJlc3VsdC5ibG9ja0hhc2ggPSBudWxsO1xuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9Zm9ybWF0LmpzLm1hcCIsImltcG9ydCB7IGRlZmluZVByb3BlcnRpZXMgfSBmcm9tIFwiLi4vdXRpbHMvcHJvcGVydGllcy5qc1wiO1xuaW1wb3J0IHsgYXNzZXJ0QXJndW1lbnQgfSBmcm9tIFwiLi4vdXRpbHMvaW5kZXguanNcIjtcbmNvbnN0IEVuc0FkZHJlc3MgPSBcIjB4MDAwMDAwMDAwMDBDMkUwNzRlQzY5QTBkRmIyOTk3QkE2QzdkMmUxZVwiO1xuY29uc3QgaW5zcGVjdCA9IFN5bWJvbC5mb3IoXCJub2RlanMudXRpbC5pbnNwZWN0LmN1c3RvbVwiKTtcbi8qKlxuICogIEEgKipOZXR3b3JrUGx1Z2luKiogcHJvdmlkZXMgYWRkaXRpb25hbCBmdW5jdGlvbmFsaXR5IG9uIGEgW1tOZXR3b3JrXV0uXG4gKi9cbmV4cG9ydCBjbGFzcyBOZXR3b3JrUGx1Z2luIHtcbiAgICAvKipcbiAgICAgKiAgVGhlIG5hbWUgb2YgdGhlIHBsdWdpbi5cbiAgICAgKlxuICAgICAqICBJdCBpcyByZWNvbW1lbmRlZCB0byB1c2UgcmV2ZXJzZS1kb21haW4tbm90YXRpb24sIHdoaWNoIHBlcm1pdHNcbiAgICAgKiAgdW5pcXVlIG5hbWVzIHdpdGggYSBrbm93biBhdXRob3JpdHkgYXMgd2VsbCBhcyBoaWVyYXJjaGFsIGVudHJpZXMuXG4gICAgICovXG4gICAgbmFtZTtcbiAgICAvKipcbiAgICAgKiAgQ3JlYXRlcyBhIG5ldyAqKk5ldHdvcmtQbHVnaW4qKi5cbiAgICAgKi9cbiAgICBjb25zdHJ1Y3RvcihuYW1lKSB7XG4gICAgICAgIGRlZmluZVByb3BlcnRpZXModGhpcywgeyBuYW1lIH0pO1xuICAgIH1cbiAgICBbaW5zcGVjdF0oKSB7IHJldHVybiB0aGlzLnRvU3RyaW5nKCk7IH1cbiAgICB0b1N0cmluZygpIHtcbiAgICAgICAgcmV0dXJuIGAke3RoaXMubmFtZX0geyB9YDtcbiAgICB9XG4gICAgLyoqXG4gICAgICogIENyZWF0ZXMgYSBjb3B5IG9mIHRoaXMgcGx1Z2luLlxuICAgICAqL1xuICAgIGNsb25lKCkge1xuICAgICAgICByZXR1cm4gbmV3IE5ldHdvcmtQbHVnaW4odGhpcy5uYW1lKTtcbiAgICB9XG59XG4vKipcbiAqICBBICoqR2FzQ29zdFBsdWdpbioqIGFsbG93cyBhIG5ldHdvcmsgdG8gcHJvdmlkZSBhbHRlcm5hdGl2ZSB2YWx1ZXMgd2hlblxuICogIGNvbXB1dGluZyB0aGUgaW50cmluc2ljIGdhcyByZXF1aXJlZCBmb3IgYSB0cmFuc2FjdGlvbi5cbiAqL1xuZXhwb3J0IGNsYXNzIEdhc0Nvc3RQbHVnaW4gZXh0ZW5kcyBOZXR3b3JrUGx1Z2luIHtcbiAgICAvKipcbiAgICAgKiAgVGhlIGJsb2NrIG51bWJlciB0byB0cmVhdCB0aGVzZSB2YWx1ZXMgYXMgdmFsaWQgZnJvbS5cbiAgICAgKlxuICAgICAqICBUaGlzIGFsbG93cyBhIGhhcmRmb3JrIHRvIGhhdmUgdXBkYXRlZCB2YWx1ZXMgaW5jbHVkZWQgYXMgd2VsbCBhc1xuICAgICAqICBtdWx1dGlwbGUgaGFyZGZvcmtzIHRvIGJlIHN1cHBvcnRlZC5cbiAgICAgKi9cbiAgICBlZmZlY3RpdmVCbG9jaztcbiAgICAvKipcbiAgICAgKiAgVGhlIHRyYW5zYWN0aW9ucyBiYXNlIGZlZS5cbiAgICAgKi9cbiAgICB0eEJhc2U7XG4gICAgLyoqXG4gICAgICogIFRoZSBmZWUgZm9yIGNyZWF0aW5nIGEgbmV3IGFjY291bnQuXG4gICAgICovXG4gICAgdHhDcmVhdGU7XG4gICAgLyoqXG4gICAgICogIFRoZSBmZWUgcGVyIHplcm8tYnl0ZSBpbiB0aGUgZGF0YS5cbiAgICAgKi9cbiAgICB0eERhdGFaZXJvO1xuICAgIC8qKlxuICAgICAqICBUaGUgZmVlIHBlciBub24temVyby1ieXRlIGluIHRoZSBkYXRhLlxuICAgICAqL1xuICAgIHR4RGF0YU5vbnplcm87XG4gICAgLyoqXG4gICAgICogIFRoZSBmZWUgcGVyIHN0b3JhZ2Uga2V5IGluIHRoZSBbW2xpbmstZWlwLTI5MzBdXSBhY2Nlc3MgbGlzdC5cbiAgICAgKi9cbiAgICB0eEFjY2Vzc0xpc3RTdG9yYWdlS2V5O1xuICAgIC8qKlxuICAgICAqICBUaGUgZmVlIHBlciBhZGRyZXNzIGluIHRoZSBbW2xpbmstZWlwLTI5MzBdXSBhY2Nlc3MgbGlzdC5cbiAgICAgKi9cbiAgICB0eEFjY2Vzc0xpc3RBZGRyZXNzO1xuICAgIC8qKlxuICAgICAqICBDcmVhdGVzIGEgbmV3IEdhc0Nvc3RQbHVnaW4gZnJvbSAlJWVmZmVjdGl2ZUJsb2NrJSUgdW50aWwgdGhlXG4gICAgICogIGxhdGVzdCBibG9jayBvciBhbm90aGVyIEdhc0Nvc3RQbHVnaW4gc3VwZXJjZWRlcyB0aGF0IGJsb2NrIG51bWJlcixcbiAgICAgKiAgd2l0aCB0aGUgYXNzb2NpYXRlZCAlJWNvc3RzJSUuXG4gICAgICovXG4gICAgY29uc3RydWN0b3IoZWZmZWN0aXZlQmxvY2ssIGNvc3RzKSB7XG4gICAgICAgIGlmIChlZmZlY3RpdmVCbG9jayA9PSBudWxsKSB7XG4gICAgICAgICAgICBlZmZlY3RpdmVCbG9jayA9IDA7XG4gICAgICAgI
26774H1cbiAgICAgICAgc3VwZXIoYG9yZy5ldGhlcnMubmV0d29yay5wbHVnaW5zLkdhc0Nvc3QjJHsoZWZmZWN0aXZlQmxvY2sgfHwgMCl9YCk7XG4gICAgICAgIGNvbnN0IHByb3BzID0geyBlZmZlY3RpdmVCbG9jayB9O1xuICAgICAgICBmdW5jdGlvbiBzZXQobmFtZSwgbnVsbGlzaCkge1xuICAgICAgICAgICAgbGV0IHZhbHVlID0gKGNvc3RzIHx8IHt9KVtuYW1lXTtcbiAgICAgICAgICAgIGlmICh2YWx1ZSA9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgdmFsdWUgPSBudWxsaXNoO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgYXNzZXJ0QXJndW1lbnQodHlwZW9mICh2YWx1ZSkgPT09IFwibnVtYmVyXCIsIGBpbnZhbHVkIHZhbHVlIGZvciAke25hbWV9YCwgXCJjb3N0c1wiLCBjb3N0cyk7XG4gICAgICAgICAgICBwcm9wc1tuYW1lXSA9IHZhbHVlO1xuICAgICAgICB9XG4gICAgICAgIHNldChcInR4QmFzZVwiLCAyMTAwMCk7XG4gICAgICAgIHNldChcInR4Q3JlYXRlXCIsIDMyMDAwKTtcbiAgICAgICAgc2V0KFwidHhEYXRhWmVyb1wiLCA0KTtcbiAgICAgICAgc2V0KFwidHhEYXRhTm9uemVyb1wiLCAxNik7XG4gICAgICAgIHNldChcInR4QWNjZXNzTGlzdFN0b3JhZ2VLZXlcIiwgMTkwMCk7XG4gICAgICAgIHNldChcInR4QWNjZXNzTGlzdEFkZHJlc3NcIiwgMjQwMCk7XG4gICAgICAgIGRlZmluZVByb3BlcnRpZXModGhpcywgcHJvcHMpO1xuICAgIH1cbiAgICB0b1N0cmluZygpIHtcbiAgICAgICAgcmV0dXJuIGAke3RoaXMubmFtZX0geyB0eEJhc2U6ICR7dGhpcy50eEJhc2V9LCB0eENyZWF0ZTogJHt0aGlzLnR4Q3JlYXRlfSwgdHhEYXRhWmVybzogJHt0aGlzLnR4RGF0YVplcm99LCB0eEFjY2Vzc0xpc3RTdG9yYWdlS2V5OiAke3RoaXMudHhBY2Nlc3NMaXN0U3RvcmFnZUtleX0sIHR4QWNjZXNzTGlzdEFkZHJlc3M6ICR7dGhpcy50eEFjY2Vzc0xpc3RBZGRyZXNzfSB9YDtcbiAgICB9XG4gICAgY2xvbmUoKSB7XG4gICAgICAgIHJldHVybiBuZXcgR2FzQ29zdFBsdWdpbih0aGlzLmVmZmVjdGl2ZUJsb2NrLCB0aGlzKTtcbiAgICB9XG59XG4vKipcbiAqICBBbiAqKkVuc1BsdWdpbioqIGFsbG93cyBhIFtbTmV0d29ya11dIHRvIHNwZWNpZnkgdGhlIEVOUyBSZWdpc3RyeVxuICogIENvbnRyYWN0IGFkZHJlc3MgYW5kIHR
26774oZSB0YXJnZXQgbmV0d29yayB0byB1c2Ugd2hlbiB1c2luZyB0aGF0XG4gKiAgY29udHJhY3QuXG4gKlxuICogIFZhcmlvdXMgdGVzdG5ldHMgaGF2ZSB0aGVpciBvd24gaW5zdGFuY2Ugb2YgdGhlIGNvbnRyYWN0IHRvIHVzZSwgYnV0XG4gKiAgaW4gZ2VuZXJhbCwgdGhlIG1haW5uZXQgaW5zdGFuY2Ugc3VwcG9ydHMgbXVsdGktY2hhaW4gYWRkcmVzc2VzIGFuZFxuICogIHNob3VsZCBiZSB1c2VkLlxuICovXG5leHBvcnQgY2xhc3MgRW5zUGx1Z2luIGV4dGVuZHMgTmV0d29ya1BsdWdpbiB7XG4gICAgLyoqXG4gICAgICogIFRoZSBFTlMgUmVnaXN0cnR5IENvbnRyYWN0IGFkZHJlc3MuXG4gICAgICovXG4gICAgYWRkcmVzcztcbiAgICAvKipcbiAgICAgKiAgVGhlIGNoYWluIElEIHRoYXQgdGhlIEVOUyBjb250cmFjdCBsaXZlcyBvbi5cbiAgICAgKi9cbiAgICB0YXJnZXROZXR3b3JrO1xuICAgIC8qKlxuICAgICAqICBUaGUgVW5pdmVyc2FsIFJlc29sdmVyIENvbnRyYWN0IEFkZHJlc3MuXG4gICAgICovXG4gICAgdW5pdmVyc2FsUmVzb2x2ZXI7XG4gICAgLyoqXG4gICAgICogIENyZWF0ZXMgYSBuZXcgKipFbnNQbHVnaW4qKiBjb25uZWN0ZWQgdG8gJSVhZGRyZXNzJSUgb24gdGhlXG4gICAgICogICUldGFyZ2V0TmV0d29yayUlLiBUaGUgZGVmYXVsdCBFTlMgYWRkcmVzcyBhbmQgbWFpbm5ldCBpcyB1c2VkXG4gICAgICogIGlmIHVuc3BlY2lmaWVkLlxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yKGFkZHJlc3MsIHRhcmdldE5ldHdvcmssIHVuaXZlcnNhbFJlc29sdmVyKSB7XG4gICAgICAgIHN1cGVyKFwib3JnLmV0aGVycy5wbHVnaW5zLm5ldHdvcmsuRW5zXCIpO1xuICAgICAgICBkZWZpbmVQcm9wZXJ0aWVzKHRoaXMsIHtcbiAgICAgICAgICAgIGFkZHJlc3M6IChhZGRyZXNzIHx8IEVuc0FkZHJlc3MpLFxuICAgICAgICAgICAgdGFyZ2V0TmV0d29yazogKCh0YXJnZXROZXR3b3JrID09IG51bGwpID8gMSA6IHRhcmdldE5ldHdvcmspLFxuICAgICAgICAgICAgdW5pdmVyc2FsUmVzb2x2ZXJcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHRvU3RyaW5nKCkge1xuICAgICAgICByZXR1cm4gYCR7dGhpcy5uYW1lfSB7IGFkZHJlc3M6ICR7dGhpcy5hZGRyZXNzfSwgdGFyZ2V0TmV0d29yazogJHt0aGlzLnRhcmdldE5ldHdvcmt9LCB1bml2ZXJzYWxSZXNvbHZlcjogJHt0aGlzLnVuaXZlcnNhbFJlc29sdmVyfSB9YDtcbiAgICB9XG4gICAgY2xvbmUoKSB7XG4gICAgICAgIHJldHVybiBuZXcgRW5zUGx1Z2luKHRoaXMuYWRkcmVzcywgdGhpcy50YXJnZXROZXR3b3JrLCB0aGlzLnVuaXZlcnNhbFJlc29sdmVyKTtcbiAgICB9XG59XG4vKipcbiAqICBBICoqRmVlRGF0YU5ldHdvcmtQbHVnaW4qKiBhbGxvd3MgYSBuZXR3b3JrIHRvIHByb3ZpZGUgYW5kIGFsdGVybmF0ZVxuICogIG1lYW5zIHRvIHNwZWNpZnkgaXRzIGZlZSBkYXRhLlxuICpcbiAqICBGb3IgZXhhbXBsZSwgYSBuZXR3b3JrIHdoaWNoIGRvZXMgbm90IHN1cHBvcnQgW1tsaW5rLWVpcC0xNTU5XV0gbWF5XG4gKiAgY2hvb3NlIHRvIHVzZSBhIEdhcyBTdGF0aW9uIHNpdGUgdG8gYXBwcm94aW1hdGUgdGhlIGdhcyBwcmljZS5cbiAqL1xuZXhwb3J0IGNsYXNzIEZlZURhdGFOZXR3b3JrUGx1Z2luIGV4dGVuZHMgTmV0d29ya1BsdWdpbiB7XG4gICAgI2ZlZURhdGFGdW5jO1xuICAgIC8qKlxuICAgICAqICBUaGUgZmVlIGRhdGEgZnVuY3Rpb24gcHJvdmlkZWQgdG8gdGhlIGNvbnN0cnVjdG9yLlxuICAgICAqL1xuICAgIGdldCBmZWVEYXRhRnVuYygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuI2ZlZURhdGFGdW5jO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiAgQ3JlYXRlcyBhIG5ldyAqKkZlZURhdGFOZXR3b3JrUGx1Z2luKiouXG4gICAgICovXG4gICAgY29uc3RydWN0b3IoZmVlRGF0YUZ1bmMpIHtcbiAgICAgICAgc3VwZXIoXCJvcmcuZXRoZXJzLnBsdWdpbnMubmV0d29yay5GZWVEYXRhXCIpO1xuICAgICAgICB0aGlzLiNmZWVEYXRhRnVuYyA9IGZlZURhdGFGdW5jO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiAgUmVzb2x2ZXMgdG8gdGhlIGZlZSBkYXRhLlxuICAgICAqL1xuICAgIGFzeW5jIGdldEZlZURhdGEocHJvdmlkZXIpIHtcbiAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuI2ZlZURhdGFGdW5jKHByb3ZpZGVyKTtcbiAgICB9XG4gICAgY2xvbmUoKSB7XG4gICAgICAgIHJldHVybiBuZXcgRmVlRGF0YU5ldHdvcmtQbHVnaW4odGhpcy4jZmVlRGF0YUZ1bmMpO1xuICAgIH1cbn1cbmV4cG9ydCBjbGFzcyBGZXRjaFVybEZlZURhdGFOZXR3b3JrUGx1Z2luIGV4dGVuZHMgTmV0d29ya1BsdWdpbiB7XG4gICAgI3VybDtcbiAgICAjcHJvY2Vzc0Z1bmM7XG4gICAgLyoqXG4gICAgICogIFRoZSBVUkwgdG8gaW5pdGlhbGl6ZSB0aGUgRmV0Y2hSZXF1ZXN0IHdpdGggaW4gJSVwcm9jZXNzRnVuYyUlLlxuICAgICAqL1xuICAgIGdldCB1cmwoKSB7IHJldHVybiB0aGlzLiN1cmw7IH1cbiAgICAvKipcbiAgICAgKiAgVGhlIGNhbGxiYWNrIHRvIHVzZSB3aGVuIGNvbXB1dGluZyB0aGUgRmVlRGF0YS5cbiAgICAgKi9cbiAgICBnZXQgcHJvY2Vzc0Z1bmMoKSB7IHJldHVybiB0aGlzLiNwcm9jZXNzRnVuYzsgfVxuICAgIC8qKlxuICAgICAqICBDcmVhdGVzIGEgbmV3ICoqRmV0Y2hVcmxGZWVEYXRhTmV0d29ya1BsdWdpbioqIHdoaWNoIHdpbGxcbiAgICAgKiAgYmUgdXNlZCB3aGVuIGNvbXB1dGluZyB0aGUgZmVlIGRhdGEgZm9yIHRoZSBuZXR3b3JrLlxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yKHVybCwgcHJvY2Vzc0Z1bmMpIHtcbiAgICAgICAgc3VwZXIoXCJvcmcuZXRoZXJzLnBsdWdpbnMubmV0d29yay5GZXRjaFVybEZlZURhdGFQbHVnaW5cIik7XG4gICAgICAgIHRoaXMuI3VybCA9IHVybDtcbiAgICAgICAgdGhpcy4jcHJvY2Vzc0Z1bmMgPSBwcm9jZXNzRnVuYztcbiAgICB9XG4gICAgdG9TdHJpbmcoKSB7XG4gICAgICAgIHJldHVybiBgJHt0aGlzLm5hbWV9IHsgdXJsOiAke3RoaXMudXJsfSB9YDtcbiAgICB9XG4gICAgLy8gV2UgYXJlIGltbXV0YWJsZSwgc28gd2UgY2FuIHNlcnZlIGFzIG91ciBvd24gY2xvbmVcbiAgICBjbG9uZSgpIHsgcmV0dXJuIHRoaXM7IH1cbn1cbi8qXG5leHBvcnQgY2xhc3MgQ3VzdG9tQmxvY2tOZXR3b3JrUGx1Z2luIGV4dGVuZHMgTmV0d29ya1BsdWdpbiB7XG4gICAgcmVhZG9ubHkgI2Jsb2NrRnVuYzogKHByb3ZpZGVyOiBQcm92aWRlciwgYmxvY2s6IEJsb2NrUGFyYW1zPHN0cmluZz4pID0+IEJsb2NrPHN0cmluZz47XG4gICAgcmVhZG9ubHkgI2Jsb2NrV2l0aFR4c0Z1bmM6IChwcm92aWRlcjogUHJvdmlkZXIsIGJsb2NrOiBCbG9ja1BhcmFtczxUcmFuc2FjdGlvblJlc3BvbnNlUGFyYW1zPikgPT4gQmxvY2s8VHJhbnNhY3Rpb25SZXNwb25zZT47XG5cbiAgICBjb25zdHJ1Y3RvcihibG9ja0Z1bmM6IChwcm92aWRlcjogUHJvdmlkZXIsIGJsb2NrOiBCbG9ja1BhcmFtczxzdHJpbmc+KSA9PiBCbG9jazxzdHJpbmc+LCBibG9ja1dpdGhUeHNGdW5jOiAocHJvdmlkZXI6IFByb3ZpZGVyLCBibG9jazogQmxvY2tQYXJhbXM8VHJhbnNhY3Rpb25SZXNwb25zZVBhcmFtcz4pID0+IEJsb2NrPFRyYW5zYWN0aW9uUmVzcG9uc2U+KSB7XG4gICAgICAgI
26774HN1cGVyKFwib3JnLmV0aGVycy5uZXR3b3JrLXBsdWdpbnMuY3VzdG9tLWJsb2NrXCIpO1xuICAgICAgICB0aGlzLiNibG9ja0Z1bmMgPSBibG9ja0Z1bmM7XG4gICAgICAgIHRoaXMuI2Jsb2NrV2l0aFR4c0Z1bmMgPSBibG9ja1dpdGhUeHNGdW5jO1xuICAgIH1cblxuICAgIGFzeW5jIGdldEJsb2NrKHByb3ZpZGVyOiBQcm92aWRlciwgYmxvY2s6IEJsb2NrUGFyYW1zPHN0cmluZz4pOiBQcm9taXNlPEJsb2NrPHN0cmluZz4+IHtcbiAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuI2Jsb2NrRnVuYyhwcm92aWRlciwgYmxvY2spO1xuICAgIH1cblxuICAgIGFzeW5jIGdldEJsb2NraW9ucyhwcm92aWRlcjogUHJvdmlkZXIsIGJsb2NrOiBCbG9ja1BhcmFtczxUcmFuc2FjdGlvblJlc3BvbnNlUGFyYW1zPik6IFByb21pc2U8QmxvY2s8VHJhbnNhY3Rpb25SZXNwb25zZT4+IHtcbiAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuI2Jsb2NrV2l0aFR4c0Z1bmMocHJvdmlkZXIsIGJsb2NrKTtcbiAgICB9XG5cbiAgICBjbG9uZSgpOiBDdXN0b21CbG9ja05ldHdvcmtQbHVnaW4ge1xuICAgICAgICByZXR1cm4gbmV3IEN1c3RvbUJsb2NrTmV0d29ya1BsdWdpbih0aGlzLiNibG9ja0Z1bmMsIHRoaXMuI2Jsb2NrV2l0aFR4c0Z1bmMpO1xuICAgIH1cbn1cbiovXG4vLyMgc291cmNlTWFwcGluZ1VSTD1wbHVnaW5zLW5ldHdvcmsuanMubWFwIiwiLyoqXG4gKiAgQSAqKk5ldHdvcmsqKiBlbmNhcHN1bGF0ZXMgdGhlIHZhcmlvdXMgcHJvcGVydGllcyByZXF1aXJlZCB0b1xuICogIGludGVyYWN0IHdpdGggYSBzcGVjaWZpYyBjaGFpbi5cbiAqXG4gKiAgQF9zdWJzZWN0aW9uOiBhcGkvcHJvdmlkZXJzOk5ldHdvcmtzICBbbmV0d29ya3NdXG4gKi9cbmltcG9ydCB7IGFjY2Vzc0xpc3RpZnkgfSBmcm9tIFwiLi4vdHJhbnNhY3Rpb24vaW5kZXguanNcIjtcbmltcG9ydCB7IGdldEJpZ0ludCwgYXNzZXJ0LCBhc3NlcnRBcmd1bWVudCB9IGZyb20gXCIuLi91dGlscy9pbmRleC5qc1wiO1xuaW1wb3J0IHsgRW5zUGx1Z2luLCBGZXRjaFVybEZlZURhdGFOZXR3b3JrUGx1Z2luLCBHYXNDb3N0UGx1Z2luIH0gZnJvbSBcIi4vcGx1Z2lucy1uZXR3b3JrLmpzXCI7XG5jb25zdCBpbnNwZWN0ID0gU3ltYm9sLmZvcihcIm5vZGVqcy51dGlsLmluc3BlY3QuY3VzdG9tXCIpO1xuLyogKiAqICpcbi8vIE5ldHdvcmtzIHdoaWNoIG9wZXJhdGlvbiBhZ2FpbnN0IGFuIEwyIGNhbiB1c2UgdGhpcyBwbHVnaW4gdG9cbi8vIHNwZWNpZnkgaG93IHRvIGFjY2VzcyBMMSwgZm9yIHRoZSBwdXJwb3NlIG9mIHJlc29sdmluZyBFTlMsXG4vLyBmb3IgZXhhbXBsZS5cbmV4cG9ydCBjbGFzcyBMYXllck9uZUNvbm5lY3Rpb25QbHVnaW4gZXh0ZW5kcyBOZXR3b3JrUGx1Z2luIHtcbiAgICByZWFkb25seSBwcm92aWRlciE6IFByb3ZpZGVyO1xuLy8gQFRPRE86IFJlbmFtZSB0byBDaGFpbkFjY2VzcyBhbmQgYWxsb3cgZm9yIGNvbm5lY3RpbmcgdG8gYW55IGNoYWluXG4gICAgY29uc3RydWN0b3IocHJvdmlkZXI6IFByb3ZpZGVyKSB7XG4gICAgICAgIHN1cGVyKFwib3JnLmV0aGVycy5wbHVnaW5zLmxheWVyLW9uZS1jb25uZWN0aW9uXCIpO1xuICAgICAgICBkZWZpbmVQcm9wZXJ0aWVzPExheWVyT25lQ29ubmVjdGlvblBsdWdpbj4odGhpcywgeyBwcm92aWRlciB9KTtcbiAgICB9XG5cbiAgICBjbG9uZSgpOiBMYXllck9uZUNvbm5lY3Rpb25QbHVnaW4ge1xuICAgICAgICByZXR1cm4gbmV3IExheWVyT25lQ29ubmVjdGlvblBsdWdpbih0aGlzLnByb3ZpZGVyKTtcbiAgICB9XG59XG4qL1xuY29uc3QgTmV0d29ya3MgPSBuZXcgTWFwKCk7XG4vKipcbiAqICBBICoqTmV0d29yayoqIHByb3ZpZGVzIGFjY2VzcyB0byBhIGNoYWluJ3MgcHJvcGVydGllcyBhbmQgYWxsb3dzXG4gKiAgZm9yIHBsdWctaW5zIHRvIGV4dGVuZCBmdW5jdGlvbmFsaXR5LlxuICovXG5leHBvcnQgY2xhc3MgTmV0d29yayB7XG4gICAgI25hbWU7XG4gICAgI2NoYWluSWQ7XG4gICAgI3BsdWdpbnM7XG4gICAgLyoqXG4gICAgICogIENyZWF0ZXMgYSBuZXcgKipOZXR3b3JrKiogZm9yICUlbmFtZSUlIGFuZCAlJWNoYWluSWQlJS5cbiAgICAgKi9cbiAgICBjb25zdHJ1Y3RvcihuYW1lLCBjaGFpbklkKSB7XG4gICAgICAgIHRoaXMuI25hbWUgPSBuYW1lO1xuICAgICAgICB0aGlzLiNjaGFpbklkID0gZ2V0QmlnSW50KGNoYWluSWQpO1xuICAgICAgICB0aGlzLiNwbHVnaW5zID0gbmV3IE1hcCgpO1xuICAgIH1cbiAgICBbaW5zcGVjdF0oKSB7IHJldHVybiB0aGlzLnRvU3RyaW5nKCk7IH1cbiAgICB0b1N0cmluZygpIHtcbiAgICAgICAgY29uc3QgcGx1Z2lucyA9IFtdO1xuICAgICAgICBmb3IgKGNvbnN0IHBsdWdpbiBvZiB0aGlzLiNwbHVnaW5zLnZhbHVlcygpKSB7XG4gICAgICAgICAgICBwbHVnaW5zLnB1c2gocGx1Z2luLnRvU3RyaW5nKCkpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBgTmV0d29yayB7IG5hbWU6ICR7dGhpcy5uYW1lfSwgY2hhaW5JZDogJHt0aGlzLmNoYWluSWR9LCBwbHVnaW5zOiBbICR7cGx1Z2lucy5qb2luKFwiLCBcIil9IF0gfWA7XG4gICAgfVxuICAgIC8qKlxuICAgICAqICBSZXR1cm5zIGEgSlNPTi1jb21wYXRpYmxlIHJlcHJlc2VudGF0aW9uIG9mIGEgTmV0d29yay5cbiAgICAgKi9cbiAgICB0b0pTT04oKSB7XG4gICAgICAgIHJldHVybiB7IG5hbWU6IHRoaXMubmFtZSwgY2hhaW5JZDogU3RyaW5nKHRoaXMuY2hhaW5JZCkgfTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogIFRoZSBuZXR3b3JrIGNvbW1vbiBuYW1lLlxuICAgICAqXG4gICAgICogIFRoaXMgaXMgdGhlIGNhbm9uaWNhbCBuYW1lLCBhcyBuZXR3b3JrcyBtaWdoIGhhdmUgbXVsdGlwbGVcbiAgICAgKiAgbmFtZXMuXG4gICAgICovXG4gICAgZ2V0IG5hbWUoKSB7IHJldHVybiB0aGlzLiNuYW1lOyB9XG4gICAgc2V0IG5hbWUodmFsdWUpIHsgdGhpcy4jbmFtZSA9IHZhbHVlOyB9XG4gICAgLyoqXG4gICAgICogIFRoZSBuZXR3b3JrIGNoYWluIElELlxuICAgICAqL1xuICAgIGdldCBjaGFpbklkKCkgeyByZXR1cm4gdGhpcy4jY2hhaW5JZDsgfVxuICAgIHNldCBjaGFpbklkKHZhbHVlKSB7IHRoaXMuI2NoYWluSWQgPSBnZXRCaWdJbnQodmFsdWUsIFwiY2hhaW5JZFwiKTsgfVxuICAgIC8qKlxuICAgICAqICBSZXR1cm5zIHRydWUgaWYgJSVvdGhlciUlIG1hdGNoZXMgdGhpcyBuZXR3b3JrLiBBbnkgY2hhaW4gSURcbiAgICAgKiAgbXVzdCBtYXRjaCwgYW5kIGlmIG5vIGNoYWluIElEIGlzIHByZXNlbnQsIHRoZSBuYW1lIG11c3QgbWF0Y2guXG4gICAgICpcbiAgICAgKiAgVGhpcyBtZXRob2QgZG9lcyBub3QgY3VycmVudGx5IGNoZWNrIGZvciBhZGRpdGlvbmFsIHByb3BlcnRpZXMsXG4gICAgICogIHN1Y2ggYXMgRU5TIGFkZHJlc3Mgb3IgcGx1Zy1pbiBjb21wYXRpYmlsaXR5LlxuICAgICAqL1xuICAgIG1hdGNoZXMob3RoZXIpIHtcbiAgICAgICAgaWYgKG90aGVyID09IG51bGwpIHtcbiAgICAgICAgICAgI
26774HJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIChvdGhlcikgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICh0aGlzLmNoYWluSWQgPT09IGdldEJpZ0ludChvdGhlcikpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2F0Y2ggKGVycm9yKSB7IH1cbiAgICAgICAgICAgIHJldHVybiAodGhpcy5uYW1lID09PSBvdGhlcik7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGVvZiAob3RoZXIpID09PSBcIm51bWJlclwiIHx8IHR5cGVvZiAob3RoZXIpID09PSBcImJpZ2ludFwiKSB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIHJldHVybiAodGhpcy5jaGFpbklkID09PSBnZXRCaWdJbnQob3RoZXIpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhdGNoIChlcnJvcikgeyB9XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGVvZiAob3RoZXIpID09PSBcIm9iamVjdFwiKSB7XG4gICAgICAgICAgICBpZiAob3RoZXIuY2hhaW5JZCAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICh0aGlzLmNoYWluSWQgPT09IGdldEJpZ0ludChvdGhlci5jaGFpbklkKSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNhdGNoIChlcnJvcikgeyB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKG90aGVyLm5hbWUgIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIHJldHVybiAodGhpcy5uYW1lID09PSBvdGhlci5uYW1lKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIC8qKlxuICAgICAqICBSZXR1cm5zIHRoZSBsaXN0IG9mIHBsdWdpbnMgY3VycmVudGx5IGF0dGFjaGVkIHRvIHRoaXMgTmV0d29yay5cbiAgICAgKi9cbiAgICBnZXQgcGx1Z2lucygpIHtcbiAgICAgICAgcmV0dXJuIEFycmF5LmZyb20odGhpcy4jcGx1Z2lucy52YWx1ZXMoKSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqICBBdHRhY2ggYSBuZXcgJSVwbHVnaW4lJSB0byB0aGlzIE5ldHdvcmsuIFRoZSBuZXR3b3JrIG5hbWVcbiAgICAgKiAgbXVzdCBiZSB1bmlxdWUsIGV4Y2x1ZGluZyBhbnkgZnJhZ21lbnQuXG4gICAgICovXG4gICAgYXR0YWNoUGx1Z2luKHBsdWdpbikge1xuICAgICAgICBpZiAodGhpcy4jcGx1Z2lucy5nZXQocGx1Z2luLm5hbWUpKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYGNhbm5vdCByZXBsYWNlIGV4aXN0aW5nIHBsdWdpbjogJHtwbHVnaW4ubmFtZX0gYCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy4jcGx1Z2lucy5zZXQocGx1Z2luLm5hbWUsIHBsdWdpbi5jbG9uZSgpKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIC8qKlxuICAgICAqICBSZXR1cm4gdGhlIHBsdWdpbiwgaWYgYW55LCBtYXRjaGluZyAlJW5hbWUlJSBleGFjdGx5LiBQbHVnaW5zXG4gICAgICogIHdpdGggZnJhZ21lbnRzIHdpbGwgbm90IGJlIHJldHVybmVkIHVubGVzcyAlJW5hbWUlJSBpbmNsdWRlc1xuICAgICAqICBhIGZyYWdtZW50LlxuICAgICAqL1xuICAgIGdldFBsdWdpbihuYW1lKSB7XG4gICAgICAgIHJldHVybiAodGhpcy4jcGx1Z2lucy5nZXQobmFtZSkpIHx8IG51bGw7XG4gICAgfVxuICAgIC8qKlxuICAgICAqICBHZXRzIGEgbGlzdCBvZiBhbGwgcGx1Z2lucyB0aGF0IG1hdGNoICUlbmFtZSUlLCB3aXRoIG90ciB3aXRob3V0XG4gICAgICogIGEgZnJhZ21lbnQuXG4gICAgICovXG4gICAgZ2V0UGx1Z2lucyhiYXNlbmFtZSkge1xuICAgICAgICByZXR1cm4gKHRoaXMucGx1Z2lucy5maWx0ZXIoKHApID0+IChwLm5hbWUuc3BsaXQoXCIjXCIpWzBdID09PSBiYXNlbmFtZSkpKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogIENyZWF0ZSBhIGNvcHkgb2YgdGhpcyBOZXR3b3JrLlxuICAgICAqL1xuICAgIGNsb25lKCkge1xuICAgICAgICBjb25zdCBjbG9uZSA9IG5ldyBOZXR3b3JrKHRoaXMubmFtZSwgdGhpcy5jaGFpbklkKTtcbiAgICAgICAgdGhpcy5wbHVnaW5zLmZvckVhY2goKHBsdWdpbikgPT4ge1xuICAgICAgICAgICAgY2xvbmUuYXR0YWNoUGx1Z2luKHBsdWdpbi5jbG9uZSgpKTtcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiBjbG9uZTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogIENvbXB1dGUgdGhlIGludHJpbnNpYyBnYXMgcmVxdWlyZWQgZm9yIGEgdHJhbnNhY3Rpb24uXG4gICAgICpcbiAgICAgKiAgQSBHYXNDb3N0UGx1Z2luIGNhbiBiZSBhdHRhY2hlZCB0byBvdmVycmlkZSB0aGUgZGVmYXVsdFxuICAgICAqICB2YWx1ZXMuXG4gICAgICovXG4gICAgY29tcHV0ZUludHJpbnNpY0dhcyh0eCkge1xuICAgICAgICBjb25zdCBjb3N0cyA9IHRoaXMuZ2V0UGx1Z2luKFwib3JnLmV0aGVycy5wbHVnaW5zLm5ldHdvcmsuR2FzQ29zdFwiKSB8fCAobmV3IEdhc0Nvc3RQbHVnaW4oKSk7XG4gICAgICAgIGxldCBnYXMgPSBjb3N0cy50eEJhc2U7XG4gICAgICAgIGlmICh0eC50byA9PSBudWxsKSB7XG4gICAgICAgICAgICBnYXMgKz0gY29zdHMudHhDcmVhdGU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR4LmRhdGEpIHtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAyOyBpIDwgdHguZGF0YS5sZW5ndGg7IGkgKz0gMikge1xuICAgICAgICAgICAgICAgIGlmICh0eC5kYXRhLnN1YnN0cmluZyhpLCBpICsgMikgPT09IFwiMDBcIikge1xuICAgICAgICAgICAgICAgICAgICBnYXMgKz0gY29zdHMudHhEYXRhWmVybztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGdhcyArPSBjb3N0cy50eERhdGFOb256ZXJvO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAodHguYWNjZXNzTGlzdCkge1xuICAgICAgICAgICAgY29uc3QgYWNjZXNzTGlzdCA9IGFjY2Vzc0xpc3RpZnkodHguYWNjZXNzTGlzdCk7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGFkZHIgaW4gYWNjZXNzTGlzdCkge1xuICAgICAgICAgICAgICAgIGdhcyArPSBjb3N0cy50eEFjY2Vzc0xpc3RBZGRyZXNzICsgY29zdHMudHhBY2Nlc3NMaXN0U3RvcmFnZUtleSAqIGFjY2Vzc0xpc3RbYWRkcl0uc3RvcmFnZUtleXMubGVuZ3RoO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgI
26774HJldHVybiBnYXM7XG4gICAgfVxuICAgIC8qKlxuICAgICAqICBSZXR1cm5zIGEgbmV3IE5ldHdvcmsgZm9yIHRoZSAlJW5ldHdvcmslJSBuYW1lIG9yIGNoYWluSWQuXG4gICAgICovXG4gICAgc3RhdGljIGZyb20obmV0d29yaykge1xuICAgICAgICBpbmplY3RDb21tb25OZXR3b3JrcygpO1xuICAgICAgICAvLyBEZWZhdWx0IG5ldHdvcmtcbiAgICAgICAgaWYgKG5ldHdvcmsgPT0gbnVsbCkge1xuICAgICAgICAgICAgcmV0dXJuIE5ldHdvcmsuZnJvbShcIm1haW5uZXRcIik7XG4gICAgICAgIH1cbiAgICAgICAgLy8gQ2Fub25pY2FsIG5hbWUgb3IgY2hhaW4gSURcbiAgICAgICAgaWYgKHR5cGVvZiAobmV0d29yaykgPT09IFwibnVtYmVyXCIpIHtcbiAgICAgICAgICAgIG5ldHdvcmsgPSBCaWdJbnQobmV0d29yayk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGVvZiAobmV0d29yaykgPT09IFwic3RyaW5nXCIgfHwgdHlwZW9mIChuZXR3b3JrKSA9PT0gXCJiaWdpbnRcIikge1xuICAgICAgICAgICAgY29uc3QgbmV0d29ya0Z1bmMgPSBOZXR3b3Jrcy5nZXQobmV0d29yayk7XG4gICAgICAgICAgICBpZiAobmV0d29ya0Z1bmMpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbmV0d29ya0Z1bmMoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh0eXBlb2YgKG5ldHdvcmspID09PSBcImJpZ2ludFwiKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBOZXR3b3JrKFwidW5rbm93blwiLCBuZXR3b3JrKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGFzc2VydEFyZ3VtZW50KGZhbHNlLCBcInVua25vd24gbmV0d29ya1wiLCBcIm5ldHdvcmtcIiwgbmV0d29yayk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gQ2xvbmFibGUgd2l0aCBuZXR3b3JrLWxpa2UgYWJpbGl0aWVzXG4gICAgICAgIGlmICh0eXBlb2YgKG5ldHdvcmsuY2xvbmUpID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgICAgIGNvbnN0IGNsb25lID0gbmV0d29yay5jbG9uZSgpO1xuICAgICAgICAgICAgLy9pZiAodHlwZW9mKG5ldHdvcmsubmFtZSkgIT09IFwic3RyaW5nXCIgfHwgdHlwZW9mKG5ldHdvcmsuY2hhaW5JZCkgIT09IFwibnVtYmVyXCIpIHtcbiAgICAgICAgICAgIC8vfVxuICAgICAgICAgICAgcmV0dXJuIGNsb25lO1xuICAgICAgICB9XG4gICAgICAgIC8vIE5ldHdvcmtpc2hcbiAgICAgICAgaWYgKHR5cGVvZiAobmV0d29yaykgPT09IFwib2JqZWN0XCIpIHtcbiAgICAgICAgICAgIGFzc2VydEFyZ3VtZW50KHR5cGVvZiAobmV0d29yay5uYW1lKSA9PT0gXCJzdHJpbmdcIiAmJiB0eXBlb2YgKG5ldHdvcmsuY2hhaW5JZCkgPT09IFwibnVtYmVyXCIsIFwiaW52YWxpZCBuZXR3b3JrIG9iamVjdCBuYW1lIG9yIGNoYWluSWRcIiwgXCJuZXR3b3JrXCIsIG5ldHdvcmspO1xuICAgICAgICAgICAgY29uc3QgY3VzdG9tID0gbmV3IE5ldHdvcmsoKG5ldHdvcmsubmFtZSksIChuZXR3b3JrLmNoYWluSWQpKTtcbiAgICAgICAgICAgIGNvbnN0IG4gPSBuZXR3b3JrO1xuICAgICAgICAgICAgaWYgKG4uZW5zQWRkcmVzcyB8fCBuLmVuc05ldHdvcmsgIT0gbnVsbCB8fCBuLmVuc1VuaXZlcnNhbFJlc29sdmVyKSB7XG4gICAgICAgICAgICAgICAgY3VzdG9tLmF0dGFjaFBsdWdpbihuZXcgRW5zUGx1Z2luKG4uZW5zQWRkcmVzcywgbi5lbnNOZXR3b3JrLCBuLmVuc1VuaXZlcnNhbFJlc29sdmVyKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvL2lmICgoPGFueT5uZXR3b3JrKS5sYXllck9uZUNvbm5lY3Rpb24pIHtcbiAgICAgICAgICAgIC8vICAgIGN1c3RvbS5hdHRhY2hQbHVnaW4obmV3IExheWVyT25lQ29ubmVjdGlvblBsdWdpbigoPGFueT5uZXR3b3JrKS5sYXllck9uZUNvbm5lY3Rpb24pKTtcbiAgICAgICAgICAgIC8vfVxuICAgICAgICAgICAgcmV0dXJuIGN1c3RvbTtcbiAgICAgICAgfVxuICAgICAgICBhc3NlcnRBcmd1bWVudChmYWxzZSwgXCJpbnZhbGlkIG5ldHdvcmtcIiwgXCJuZXR3b3JrXCIsIG5ldHdvcmspO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiAgUmVnaXN0ZXIgJSVuYW1lT3JDaGFpbklkJSUgd2l0aCBhIGZ1bmN0aW9uIHdoaWNoIHJldHVybnNcbiAgICAgKiAgYW4gaW5zdGFuY2Ugb2YgYSBOZXR3b3JrIHJlcHJlc2VudGluZyB0aGF0IGNoYWluLlxuICAgICAqL1xuICAgIHN0YXRpYyByZWdpc3RlcihuYW1lT3JDaGFpbklkLCBuZXR3b3JrRnVuYykge1xuICAgICAgICBpZiAodHlwZW9mIChuYW1lT3JDaGFpbklkKSA9PT0gXCJudW1iZXJcIikge1xuICAgICAgICAgICAgbmFtZU9yQ2hhaW5JZCA9IEJpZ0ludChuYW1lT3JDaGFpbklkKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBleGlzdGluZyA9IE5ldHdvcmtzLmdldChuYW1lT3JDaGFpbklkKTtcbiAgICAgICAgaWYgKGV4aXN0aW5nKSB7XG4gICAgICAgICAgICBhc3NlcnRBcmd1bWVudChmYWxzZSwgYGNvbmZsaWN0aW5nIG5ldHdvcmsgZm9yICR7SlNPTi5zdHJpbmdpZnkoZXhpc3RpbmcubmFtZSl9YCwgXCJuYW1lT3JDaGFpbklkXCIsIG5hbWVPckNoYWluSWQpO1xuICAgICAgICB9XG4gICAgICAgIE5ldHdvcmtzLnNldChuYW1lT3JDaGFpbklkLCBuZXR3b3JrRnVuYyk7XG4gICAgfVxufVxuLy8gV2UgZG9uJ3Qgd2FudCB0byBicmluZyBpbiBmb3JtYXRVbml0cyBiZWNhdXNlIGl0IGlzIGJhY2tlZCBieVxuLy8gRml4ZWROdW1iZXIgYW5kIHdlIHdhbnQgdG8ga2VlcCBOZXR3b3JrcyB0aW55LiBUaGUgdmFsdWVzXG4vLyBpbmNsdWRlZCBieSB0aGUgR2FzIFN0YXRpb25zIGFyZSBhbHNvIElFRUUgNzU0IHdpdGggbG90cyBvZlxuLy8gcm91bmRpbmcgaXNzdWVzIGFuZCBleGNlZWQgdGhlIHN0cmljdCBjaGVja3MgZm9ybWF0VW5pdHMgaGFzLlxuZnVuY3Rpb24gcGFyc2VVbml0cyhfdmFsdWUsIGRlY2ltYWxzKSB7XG4gICAgY29uc3QgdmFsdWUgPSBTdHJpbmcoX3ZhbHVlKTtcbiAgICBpZiAoIXZhbHVlLm1hdGNoKC9eWzAtOS5dKyQvKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYGludmFsaWQgZ3dlaSB2YWx1ZTogJHtfdmFsdWV9YCk7XG4gICAgfVxuICAgIC8vIEJyZWFrIGludG8gWyB3aG9sZSwgZnJhY3Rpb24gXVxuICAgIGNvbnN0IGNvbXBzID0gdmFsdWUuc3BsaXQoXCIuXCIpO1xuICAgIGlmIChjb21wcy5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgY29tcHMucHVzaChcIlwiKTtcbiAgICB9XG4gICAgLy8gTW9yZSB0aGFuIDEgZGVjaW1hbCBwb2ludCBvciB0b28gbWFueSBmcmFjdGlvbmFsIHBvc2l0aW9uc1xuICAgIGlmIChjb21wcy5sZW5ndGggIT09IDIpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBpbnZhbGlkIGd3ZWkgdmFsdWU6ICR7X3ZhbHVlfWApO1xuICAgIH1cbiAgICAvLyBQYWQgdGhlIGZyYWN0aW9uIHRvIDkgZGVjaW1hbHBsYWNlc1xuICAgIHdoaWxlIChjb21wc1sxXS5sZW5ndGggPCBkZWNpbWFscykge1xuICAgICAgICBjb21wc1sxXSArPSBcIjBcIjtcbiAgICB9XG4gICAgLy8gVG9vIG1hbnkgZGVjaW1hbHMgYW5kIHNvbWUgbm9uLXplcm8gZW5kaW5nLCB0YWtlIHRoZSBjZWlsaW5nXG4gICAgaWYgKGNvbXBzWzFdLmxlbmd0aCA+IDkpIHtcbiAgICAgICAgbGV0IGZyYWMgPSBCaWdJbnQoY29tcHNbMV0uc3Vic3RyaW5nKDAsIDkpKTtcbiAgICAgICAgaWYgKCFjb21wc1sxXS5zdWJzdHJpbmcoOSkubWF0Y2goL14wKyQvKSkge1xuICAgICAgICAgICAgZnJhYysrO1xuICAgICAgICB9XG4gICAgICAgIGNvbXBzWzFdID0gZnJhYy50b1N0cmluZygpO1xuICAgIH1cbiAgICByZXR1cm4gQmlnSW50KGNvbXBzWzBdICsgY29tcHNbMV0pO1xufVxuLy8gVXNlZCBieSBQb2x5Z29uIHRvIHVzZSBhIGdhcyBzdGF0aW9uIGZvciBmZWUgZGF0YVxuZnVuY3Rpb24gZ2V0R2FzU3RhdGlvblBsdWdpbih1cmwpIHtcbiAgICByZXR1cm4gbmV3IEZldGNoVXJsRmVlRGF0YU5ldHdvcmtQbHVnaW4odXJsLCBhc3luYyAoZmV0Y2hGZWVEYXRhLCBwcm92aWRlciwgcmVxdWVzdCkgPT4ge1xuICAgICAgICAvLyBQcmV2ZW50IENsb3VkZmxhcmUgZnJvbSBibG9ja2luZyBvdXIgcmVxdWVzdCBpbiBub2RlLmpzXG4gICAgICAgI
26774HJlcXVlc3Quc2V0SGVhZGVyKFwiVXNlci1BZ2VudFwiLCBcImV0aGVyc1wiKTtcbiAgICAgICAgbGV0IHJlc3BvbnNlO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgY29uc3QgW19yZXNwb25zZSwgX2ZlZURhdGFdID0gYXdhaXQgUHJvbWlzZS5hbGwoW1xuICAgICAgICAgICAgICAgIHJlcXVlc3Quc2VuZCgpLCBmZXRjaEZlZURhdGEoKVxuICAgICAgICAgICAgXSk7XG4gICAgICAgICAgICByZXNwb25zZSA9IF9yZXNwb25zZTtcbiAgICAgICAgICAgIGNvbnN0IHBheWxvYWQgPSByZXNwb25zZS5ib2R5SnNvbi5zdGFuZGFyZDtcbiAgICAgICAgICAgIGNvbnN0IGZlZURhdGEgPSB7XG4gICAgICAgICAgICAgICAgZ2FzUHJpY2U6IF9mZWVEYXRhLmdhc1ByaWNlLFxuICAgICAgICAgICAgICAgIG1heEZlZVBlckdhczogcGFyc2VVbml0cyhwYXlsb2FkLm1heEZlZSwgOSksXG4gICAgICAgICAgICAgICAgbWF4UHJpb3JpdHlGZWVQZXJHYXM6IHBhcnNlVW5pdHMocGF5bG9hZC5tYXhQcmlvcml0eUZlZSwgOSksXG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgcmV0dXJuIGZlZURhdGE7XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICBhc3NlcnQoZmFsc2UsIGBlcnJvciBlbmNvdW50ZXJlZCB3aXRoIHBvbHlnb24gZ2FzIHN0YXRpb24gKCR7SlNPTi5zdHJpbmdpZnkocmVxdWVzdC51cmwpfSlgLCBcIlNFUlZFUl9FUlJPUlwiLCB7IHJlcXVlc3QsIHJlc3BvbnNlLCBlcnJvciB9KTtcbiAgICAgICAgfVxuICAgIH0pO1xufVxuLy8gU2VlOiBodHRwczovL2NoYWlubGlzdC5vcmdcbmxldCBpbmplY3RlZCA9IGZhbHNlO1xuZnVuY3Rpb24gaW5qZWN0Q29tbW9uTmV0d29ya3MoKSB7XG4gICAgaWYgKGluamVjdGVkKSB7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaW5qZWN0ZWQgPSB0cnVlO1xuICAgIC8vLyBSZWdpc3RlciBwb3B1bGFyIEV0aGVyZXVtIG5ldHdvcmtzXG4gICAgZnVuY3Rpb24gcmVnaXN0ZXJFdGgobmFtZSwgY2hhaW5JZCwgb3B0aW9ucykge1xuICAgICAgICBjb25zdCBmdW5jID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgY29uc3QgbmV0d29yayA9IG5ldyBOZXR3b3JrKG5hbWUsIGNoYWluSWQpO1xuICAgICAgICAgICAgLy8gV2UgdXNlIDAgdG8gZGlzYWJsZSBFTlNcbiAgICAgICAgICAgIGlmIChvcHRpb25zLmVuc05ldHdvcmsgIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIG5ldHdvcmsuYXR0YWNoUGx1Z2luKG5ldyBFbnNQbHVnaW4obnVsbCwgb3B0aW9ucy5lbnNOZXR3b3JrLCBvcHRpb25zLmVuc1VuaXZlcnNhbFJlc29sdmVyKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBuZXR3b3JrLmF0dGFjaFBsdWdpbihuZXcgR2FzQ29zdFBsdWdpbigpKTtcbiAgICAgICAgICAgIChvcHRpb25zLnBsdWdpbnMgfHwgW10pLmZvckVhY2goKHBsdWdpbikgPT4ge1xuICAgICAgICAgICAgICAgIG5ldHdvcmsuYXR0YWNoUGx1Z2luKHBsdWdpbik7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHJldHVybiBuZXR3b3JrO1xuICAgICAgICB9O1xuICAgICAgICAvLyBSZWdpc3RlciB0aGUgbmV0d29yayBieSBuYW1lIGFuZCBjaGFpbiBJRFxuICAgICAgICBOZXR3b3JrLnJlZ2lzdGVyKG5hbWUsIGZ1bmMpO1xuICAgICAgICBOZXR3b3JrLnJlZ2lzdGVyKGNoYWluSWQsIGZ1bmMpO1xuICAgICAgICBpZiAob3B0aW9ucy5hbHROYW1lcykge1xuICAgICAgICAgICAgb3B0aW9ucy5hbHROYW1lcy5mb3JFYWNoKChuYW1lKSA9PiB7XG4gICAgICAgICAgICAgICAgTmV0d29yay5yZWdpc3RlcihuYW1lLCBmdW5jKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8vIFByb3h5IGFkZHJlc3NcbiAgICBjb25zdCBlbnNVbml2ZXJzYWxSZXNvbHZlciA9IFwiMHhlRWVFRUVlRTE0RDcxOEMyQjQ3RDk5MjNEZWFiMTMzNUUxNDRFZUVlXCI7XG4gICAgcmVnaXN0ZXJFdGgoXCJtYWlubmV0XCIsIDEsIHtcbiAgICAgICAgZW5zVW5pdmVyc2FsUmVzb2x2ZXIsIGVuc05ldHdvcms6IDEsIGFsdE5hbWVzOiBbXCJob21lc3RlYWRcIl1cbiAgICB9KTtcbiAgICByZWdpc3RlckV0aChcInJvcHN0ZW5cIiwgMywgeyBlbnNOZXR3b3JrOiAzIH0pO1xuICAgIHJlZ2lzdGVyRXRoKFwicmlua2VieVwiLCA0LCB7IGVuc05ldHdvcms6IDQgfSk7XG4gICAgcmVnaXN0ZXJFdGgoXCJnb2VybGlcIiwgNSwgeyBlbnNOZXR3b3JrOiA1IH0pO1xuICAgIHJlZ2lzdGVyRXRoKFwia292YW5cIiwgNDIsIHsgZW5zTmV0d29yazogNDIgfSk7XG4gICAgcmVnaXN0ZXJFdGgoXCJzZXBvbGlhXCIsIDExMTU1MTExLCB7XG4gICAgICAgIGVuc1VuaXZlcnNhbFJlc29sdmVyLCBlbnNOZXR3b3JrOiAxMTE1NTExMVxuICAgIH0pO1xuICAgIHJlZ2lzdGVyRXRoKFwiaG9sZXNreVwiLCAxNzAwMCwgeyBlbnNOZXR3b3JrOiAxNzAwMCB9KTtcbiAgICByZWdpc3RlckV0aChcImNsYXNzaWNcIiwgNjEsIHt9KTtcbiAgICByZWdpc3RlckV0aChcImNsYXNzaWNLb3R0aVwiLCA2LCB7fSk7XG4gICAgcmVnaXN0ZXJFdGgoXCJhcmJpdHJ1bVwiLCA0MjE2MSwge1xuICAgICAgICBlbnNOZXR3b3JrOiAxLFxuICAgIH0pO1xuICAgIHJlZ2lzdGVyRXRoKFwiYXJiaXRydW0tZ29lcmxpXCIsIDQyMTYxMywge30pO1xuICAgIHJlZ2lzdGVyRXRoKFwiYXJiaXRydW0tc2Vwb2xpYVwiLCA0MjE2MTQsIHt9KTtcbiAgICByZWdpc3RlckV0aChcImJhc2VcIiwgODQ1MywgeyBlbnNOZXR3b3JrOiAxIH0pO1xuICAgIHJlZ2lzdGVyRXRoKFwiYmFzZS1nb2VybGlcIiwgODQ1MzEsIHt9KTtcbiAgICByZWdpc3RlckV0aChcImJhc2Utc2Vwb2xpYVwiLCA4NDUzMiwge30pO1xuICAgIHJlZ2lzdGVyRXRoKFwiYm5iXCIsIDU2LCB7IGVuc05ldHdvcms6IDEgfSk7XG4gICAgcmVnaXN0ZXJFdGgoXCJibmJ0XCIsIDk3LCB7fSk7XG4gICAgcmVnaXN0ZXJFdGgoXCJmaWxlY29pblwiLCAzMTQsIHt9KTtcbiAgICByZWdpc3RlckV0aChcImZpbGVjb2luLWNhbGlicmF0aW9uXCIsIDMxNDE1OSwge30pO1xuICAgIHJlZ2lzdGVyRXRoKFwibGluZWFcIiwgNTkxNDQsIHsgZW5zTmV0d29yazogMSB9KTtcbiAgICByZWdpc3RlckV0aChcImxpbmVhLWdvZXJsaVwiLCA1OTE0MCwge30pO1xuICAgIHJlZ2lzdGVyRXRoKFwibGluZWEtc2Vwb2xpYVwiLCA1OTE0MSwge30pO1xuICAgIHJlZ2lzdGVyRXRoKFwibWF0aWNcIiwgMTM3LCB7XG4gICAgICAgIGVuc05ldHdvcms6IDEsXG4gICAgICAgI
26774HBsdWdpbnM6IFtcbiAgICAgICAgICAgIGdldEdhc1N0YXRpb25QbHVnaW4oXCJodHRwczovXFwvZ2Fzc3RhdGlvbi5wb2x5Z29uLnRlY2hub2xvZ3kvdjJcIilcbiAgICAgICAgXVxuICAgIH0pO1xuICAgIHJlZ2lzdGVyRXRoKFwibWF0aWMtYW1veVwiLCA4MDAwMiwge30pO1xuICAgIHJlZ2lzdGVyRXRoKFwibWF0aWMtbXVtYmFpXCIsIDgwMDAxLCB7XG4gICAgICAgIGFsdE5hbWVzOiBbXCJtYXRpY011bWJhaVwiLCBcIm1hdGljbXVtXCJdLFxuICAgICAgICBwbHVnaW5zOiBbXG4gICAgICAgICAgICBnZXRHYXNTdGF0aW9uUGx1Z2luKFwiaHR0cHM6L1xcL2dhc3N0YXRpb24tdGVzdG5ldC5wb2x5Z29uLnRlY2hub2xvZ3kvdjJcIilcbiAgICAgICAgXVxuICAgIH0pO1xuICAgIHJlZ2lzdGVyRXRoKFwib3B0aW1pc21cIiwgMTAsIHtcbiAgICAgICAgZW5zTmV0d29yazogMSxcbiAgICAgICAgcGx1Z2luczogW11cbiAgICB9KTtcbiAgICByZWdpc3RlckV0aChcIm9wdGltaXNtLWdvZXJsaVwiLCA0MjAsIHt9KTtcbiAgICByZWdpc3RlckV0aChcIm9wdGltaXNtLXNlcG9saWFcIiwgMTExNTU0MjAsIHt9KTtcbiAgICByZWdpc3RlckV0aChcInhkYWlcIiwgMTAwLCB7IGVuc05ldHdvcms6IDEgfSk7XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1uZXR3b3JrLmpzLm1hcCIsImltcG9ydCB7IGFzc2VydCwgaXNIZXhTdHJpbmcgfSBmcm9tIFwiLi4vdXRpbHMvaW5kZXguanNcIjtcbmZ1bmN0aW9uIGNvcHkob2JqKSB7XG4gICAgcmV0dXJuIEpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkob2JqKSk7XG59XG4vKipcbiAqICBSZXR1cm4gdGhlIHBvbGxpbmcgc3Vic2NyaWJlciBmb3IgY29tbW9uIGV2ZW50cy5cbiAqXG4gKiAgQF9kb2Nsb2M6IGFwaS9wcm92aWRlcnMvYWJzdHJhY3QtcHJvdmlkZXJcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldFBvbGxpbmdTdWJzY3JpYmVyKHByb3ZpZGVyLCBldmVudCkge1xuICAgIGlmIChldmVudCA9PT0gXCJibG9ja1wiKSB7XG4gICAgICAgIHJldHVybiBuZXcgUG9sbGluZ0Jsb2NrU3Vic2NyaWJlcihwcm92aWRlcik7XG4gICAgfVxuICAgIGlmIChpc0hleFN0cmluZyhldmVudCwgMzIpKSB7XG4gICAgICAgIHJldHVybiBuZXcgUG9sbGluZ1RyYW5zYWN0aW9uU3Vic2NyaWJlcihwcm92aWRlciwgZXZlbnQpO1xuICAgIH1cbiAgICBhc3NlcnQoZmFsc2UsIFwidW5zdXBwb3J0ZWQgcG9sbGluZyBldmVudFwiLCBcIlVOU1VQUE9SVEVEX09QRVJBVElPTlwiLCB7XG4gICAgICAgIG9wZXJhdGlvbjogXCJnZXRQb2xsaW5nU3Vic2NyaWJlclwiLCBpbmZvOiB7IGV2ZW50IH1cbiAgICB9KTtcbn1cbi8vIEBUT0RPOiByZWZhY3RvciB0aGlzXG4vKipcbiAqICBBICoqUG9sbGluZ0Jsb2NrU3Vic2NyaWJlcioqIHBvbGxzIGF0IGEgcmVndWxhciBpbnRlcnZhbCBmb3IgYSBjaGFuZ2VcbiAqICBpbiB0aGUgYmxvY2sgbnVtYmVyLlxuICpcbiAqICBAX2RvY2xvYzogYXBpL3Byb3ZpZGVycy9hYnN0cmFjdC1wcm92aWRlclxuICovXG5leHBvcnQgY2xhc3MgUG9sbGluZ0Jsb2NrU3Vic2NyaWJlciB7XG4gICAgI3Byb3ZpZGVyO1xuICAgICNwb2xsZXI7XG4gICAgI2ludGVydmFsO1xuICAgIC8vIFRoZSBtb3N0IHJlY2VudCBibG9jayB3ZSBoYXZlIHNjYW5uZWQgZm9yIGV2ZW50cy4gVGhlIHZhbHVlIC0yXG4gICAgLy8gaW5kaWNhdGVzIHdlIHN0aWxsIG5lZWQgdG8gZmV0Y2ggYW4gaW5pdGlhbCBibG9jayBudW1iZXJcbiAgICAjYmxvY2tOdW1iZXI7XG4gICAgLyoqXG4gICAgICogIENyZWF0ZSBhIG5ldyAqKlBvbGxpbmdCbG9ja1N1YnNjcmliZXIqKiBhdHRhY2hlZCB0byAlJXByb3ZpZGVyJSUuXG4gICAgICovXG4gICAgY29uc3RydWN0b3IocHJvdmlkZXIpIHtcbiAgICAgICAgdGhpcy4jcHJvdmlkZXIgPSBwcm92aWRlcjtcbiAgICAgICAgdGhpcy4jcG9sbGVyID0gbnVsbDtcbiAgICAgICAgdGhpcy4jaW50ZXJ2YWwgPSA0MDAwO1xuICAgICAgICB0aGlzLiNibG9ja051bWJlciA9IC0yO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiAgVGhlIHBvbGxpbmcgaW50ZXJ2YWwuXG4gICAgICovXG4gICAgZ2V0IHBvbGxpbmdJbnRlcnZhbCgpIHsgcmV0dXJuIHRoaXMuI2ludGVydmFsOyB9XG4gICAgc2V0IHBvbGxpbmdJbnRlcnZhbCh2YWx1ZSkgeyB0aGlzLiNpbnRlcnZhbCA9IHZhbHVlOyB9XG4gICAgYXN5bmMgI3BvbGwoKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjb25zdCBibG9ja051bWJlciA9IGF3YWl0IHRoaXMuI3Byb3ZpZGVyLmdldEJsb2NrTnVtYmVyKCk7XG4gICAgICAgICAgICAvLyBCb290c3RyYXAgcG9sbCB0byBzZXR1cCBvdXIgaW5pdGlhbCBibG9jayBudW1iZXJcbiAgICAgICAgICAgIGlmICh0aGlzLiNibG9ja051bWJlciA9PT0gLTIpIHtcbiAgICAgICAgICAgICAgICB0aGlzLiNibG9ja051bWJlciA9IGJsb2NrTnVtYmVyO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIEBUT0RPOiBQdXQgYSBjYXAgb24gdGhlIG1heGltdW0gbnVtYmVyIG9mIGV2ZW50cyBwZXIgbG9vcD9cbiAgICAgICAgICAgIGlmIChibG9ja051bWJlciAhPT0gdGhpcy4jYmxvY2tOdW1iZXIpIHtcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBiID0gdGhpcy4jYmxvY2tOdW1iZXIgKyAxOyBiIDw9IGJsb2NrTnVtYmVyOyBiKyspIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gV2UgaGF2ZSBiZWVuIHN0b3BwZWRcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuI3BvbGxlciA9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgdGhpcy4jcHJvdmlkZXIuZW1pdChcImJsb2NrXCIsIGIpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB0aGlzLiNibG9ja051bWJlciA9IGJsb2NrTnVtYmVyO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgLy8gQFRPRE86IE1pbm9yIGJ1bXAsIGFkZCBhbiBcImVycm9yXCIgZXZlbnQgdG8gbGV0IHN1YnNjcmliZXJzXG4gICAgICAgICAgICAvLyAgICAgICAga25vdyB0aGluZ3Mgd2VudCBhd3J5LlxuICAgICAgICAgICAgLy9jb25zb2xlLmxvZyhlcnJvcik7XG4gICAgICAgI
26774H1cbiAgICAgICAgLy8gV2UgaGF2ZSBiZWVuIHN0b3BwZWRcbiAgICAgICAgaWYgKHRoaXMuI3BvbGxlciA9PSBudWxsKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy4jcG9sbGVyID0gdGhpcy4jcHJvdmlkZXIuX3NldFRpbWVvdXQodGhpcy4jcG9sbC5iaW5kKHRoaXMpLCB0aGlzLiNpbnRlcnZhbCk7XG4gICAgfVxuICAgIHN0YXJ0KCkge1xuICAgICAgICBpZiAodGhpcy4jcG9sbGVyKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy4jcG9sbGVyID0gdGhpcy4jcHJvdmlkZXIuX3NldFRpbWVvdXQodGhpcy4jcG9sbC5iaW5kKHRoaXMpLCB0aGlzLiNpbnRlcnZhbCk7XG4gICAgICAgIHRoaXMuI3BvbGwoKTtcbiAgICB9XG4gICAgc3RvcCgpIHtcbiAgICAgICAgaWYgKCF0aGlzLiNwb2xsZXIpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLiNwcm92aWRlci5fY2xlYXJUaW1lb3V0KHRoaXMuI3BvbGxlcik7XG4gICAgICAgIHRoaXMuI3BvbGxlciA9IG51bGw7XG4gICAgfVxuICAgIHBhdXNlKGRyb3BXaGlsZVBhdXNlZCkge1xuICAgICAgICB0aGlzLnN0b3AoKTtcbiAgICAgICAgaWYgKGRyb3BXaGlsZVBhdXNlZCkge1xuICAgICAgICAgICAgdGhpcy4jYmxvY2tOdW1iZXIgPSAtMjtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXN1bWUoKSB7XG4gICAgICAgIHRoaXMuc3RhcnQoKTtcbiAgICB9XG59XG4vKipcbiAqICBBbiAqKk9uQmxvY2tTdWJzY3JpYmVyKiogY2FuIGJlIHN1Yi1jbGFzc2VkLCB3aXRoIGEgW1tfcG9sbF1dXG4gKiAgaW1wbG1lbnRhdGlvbiB3aGljaCB3aWxsIGJlIGNhbGxlZCBvbiBldmVyeSBuZXcgYmxvY2suXG4gKlxuICogIEBfZG9jbG9jOiBhcGkvcHJvdmlkZXJzL2Fic3RyYWN0LXByb3ZpZGVyXG4gKi9cbmV4cG9ydCBjbGFzcyBPbkJsb2NrU3Vic2NyaWJlciB7XG4gICAgI3Byb3ZpZGVyO1xuICAgICNwb2xsO1xuICAgICNydW5uaW5nO1xuICAgIC8qKlxuICAgICAqICBDcmVhdGUgYSBuZXcgKipPbkJsb2NrU3Vic2NyaWJlcioqIGF0dGFjaGVkIHRvICUlcHJvdmlkZXIlJS5cbiAgICAgKi9cbiAgICBjb25zdHJ1Y3Rvcihwcm92aWRlcikge1xuICAgICAgICB0aGlzLiNwcm92aWRlciA9IHByb3ZpZGVyO1xuICAgICAgICB0aGlzLiNydW5uaW5nID0gZmFsc2U7XG4gICAgICAgIHRoaXMuI3BvbGwgPSAoYmxvY2tOdW1iZXIpID0+IHtcbiAgICAgICAgICAgIHRoaXMuX3BvbGwoYmxvY2tOdW1iZXIsIHRoaXMuI3Byb3ZpZGVyKTtcbiAgICAgICAgfTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogIENhbGxlZCBvbiBldmVyeSBuZXcgYmxvY2suXG4gICAgICovXG4gICAgYXN5bmMgX3BvbGwoYmxvY2tOdW1iZXIsIHByb3ZpZGVyKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcInN1Yi1jbGFzc2VzIG11c3Qgb3ZlcnJpZGUgdGhpc1wiKTtcbiAgICB9XG4gICAgc3RhcnQoKSB7XG4gICAgICAgIGlmICh0aGlzLiNydW5uaW5nKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy4jcnVubmluZyA9IHRydWU7XG4gICAgICAgIHRoaXMuI3BvbGwoLTIpO1xuICAgICAgICB0aGlzLiNwcm92aWRlci5vbihcImJsb2NrXCIsIHRoaXMuI3BvbGwpO1xuICAgIH1cbiAgICBzdG9wKCkge1xuICAgICAgICBpZiAoIXRoaXMuI3J1bm5pbmcpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLiNydW5uaW5nID0gZmFsc2U7XG4gICAgICAgIHRoaXMuI3Byb3ZpZGVyLm9mZihcImJsb2NrXCIsIHRoaXMuI3BvbGwpO1xuICAgIH1cbiAgICBwYXVzZShkcm9wV2hpbGVQYXVzZWQpIHsgdGhpcy5zdG9wKCk7IH1cbiAgICByZXN1bWUoKSB7IHRoaXMuc3RhcnQoKTsgfVxufVxuZXhwb3J0IGNsYXNzIFBvbGxpbmdCbG9ja1RhZ1N1YnNjcmliZXIgZXh0ZW5kcyBPbkJsb2NrU3Vic2NyaWJlciB7XG4gICAgI3RhZztcbiAgICAjbGFzdEJsb2NrO1xuICAgIGNvbnN0cnVjdG9yKHByb3ZpZGVyLCB0YWcpIHtcbiAgICAgICAgc3VwZXIocHJvdmlkZXIpO1xuICAgICAgICB0aGlzLiN0YWcgPSB0YWc7XG4gICAgICAgIHRoaXMuI2xhc3RCbG9jayA9IC0yO1xuICAgIH1cbiAgICBwYXVzZShkcm9wV2hpbGVQYXVzZWQpIHtcbiAgICAgICAgaWYgKGRyb3BXaGlsZVBhdXNlZCkge1xuICAgICAgICAgICAgdGhpcy4jbGFzdEJsb2NrID0gLTI7XG4gICAgICAgIH1cbiAgICAgICAgc3VwZXIucGF1c2UoZHJvcFdoaWxlUGF1c2VkKTtcbiAgICB9XG4gICAgYXN5bmMgX3BvbGwoYmxvY2tOdW1iZXIsIHByb3ZpZGVyKSB7XG4gICAgICAgIGNvbnN0IGJsb2NrID0gYXdhaXQgcHJvdmlkZXIuZ2V0QmxvY2sodGhpcy4jdGFnKTtcbiAgICAgICAgaWYgKGJsb2NrID09IG51bGwpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy4jbGFzdEJsb2NrID09PSAtMikge1xuICAgICAgICAgICAgdGhpcy4jbGFzdEJsb2NrID0gYmxvY2subnVtYmVyO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGJsb2NrLm51bWJlciA+IHRoaXMuI2xhc3RCbG9jaykge1xuICAgICAgICAgICAgcHJvdmlkZXIuZW1pdCh0aGlzLiN0YWcsIGJsb2NrLm51bWJlcik7XG4gICAgICAgICAgICB0aGlzLiNsYXN0QmxvY2sgPSBibG9jay5udW1iZXI7XG4gICAgICAgIH1cbiAgICB9XG59XG4vKipcbiAqICBAX2lnbm9yZTpcbiAqXG4gKiAgQF9kb2Nsb2M6IGFwaS9wcm92aWRlcnMvYWJzdHJhY3QtcHJvdmlkZXJcbiAqL1xuZXhwb3J0IGNsYXNzIFBvbGxpbmdPcnBoYW5TdWJzY3JpYmVyIGV4dGVuZHMgT25CbG9ja1N1YnNjcmliZXIge1xuICAgICNmaWx0ZXI7XG4gICAgY29uc3RydWN0b3IocHJvdmlkZXIsIGZpbHRlcikge1xuICAgICAgICBzdXBlcihwcm92aWRlcik7XG4gICAgICAgIHRoaXMuI2ZpbHRlciA9IGNvcHkoZmlsdGVyKTtcbiAgICB9XG4gICAgYXN5bmMgX3BvbGwoYmxvY2tOdW1iZXIsIHByb3ZpZGVyKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIkBUT0RPXCIpO1xuICAgICAgICBjb25zb2xlLmxvZyh0aGlzLiNmaWx0ZXIpO1xuICAgIH1cbn1cbi8qKlxuICogIEEgKipQb2xsaW5nVHJhbnNhY3Rpb25TdWJzY3JpYmVyKiogd2lsbCBwb2xsIGZvciBhIGdpdmVuIHRyYW5zYWN0aW9uXG4gKiAgaGFzaCBmb3IgaXRzIHJlY2VpcHQuXG4gKlxuICogIEBfZG9jbG9jOiBhcGkvcHJvdmlkZXJzL2Fic3RyYWN0LXByb3ZpZGVyXG4gKi9cbmV4cG9ydCBjbGFzcyBQb2xsaW5nVHJhbnNhY3Rpb25TdWJzY3JpYmVyIGV4dGVuZHMgT25CbG9ja1N1YnNjcmliZXIge1xuICAgICNoYXNoO1xuICAgIC8qKlxuICAgICAqICBDcmVhdGUgYSBuZXcgKipQb2xsaW5nVHJhbnNhY3Rpb25TdWJzY3JpYmVyKiogYXR0YWNoZWQgdG9cbiAgICAgKiAgJSVwcm92aWRlciUlLCBsaXN0ZW5pbmcgZm9yICUlaGFzaCUlLlxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yKHByb3ZpZGVyLCBoYXNoKSB7XG4gICAgICAgI
26774HN1cGVyKHByb3ZpZGVyKTtcbiAgICAgICAgdGhpcy4jaGFzaCA9IGhhc2g7XG4gICAgfVxuICAgIGFzeW5jIF9wb2xsKGJsb2NrTnVtYmVyLCBwcm92aWRlcikge1xuICAgICAgICBjb25zdCB0eCA9IGF3YWl0IHByb3ZpZGVyLmdldFRyYW5zYWN0aW9uUmVjZWlwdCh0aGlzLiNoYXNoKTtcbiAgICAgICAgaWYgKHR4KSB7XG4gICAgICAgICAgICBwcm92aWRlci5lbWl0KHRoaXMuI2hhc2gsIHR4KTtcbiAgICAgICAgfVxuICAgIH1cbn1cbi8qKlxuICogIEEgKipQb2xsaW5nRXZlbnRTdWJzY3JpYmVyKiogd2lsbCBwb2xsIGZvciBhIGdpdmVuIGZpbHRlciBmb3IgaXRzIGxvZ3MuXG4gKlxuICogIEBfZG9jbG9jOiBhcGkvcHJvdmlkZXJzL2Fic3RyYWN0LXByb3ZpZGVyXG4gKi9cbmV4cG9ydCBjbGFzcyBQb2xsaW5nRXZlbnRTdWJzY3JpYmVyIHtcbiAgICAjcHJvdmlkZXI7XG4gICAgI2ZpbHRlcjtcbiAgICAjcG9sbGVyO1xuICAgICNydW5uaW5nO1xuICAgIC8vIFRoZSBtb3N0IHJlY2VudCBibG9jayB3ZSBoYXZlIHNjYW5uZWQgZm9yIGV2ZW50cy4gVGhlIHZhbHVlIC0yXG4gICAgLy8gaW5kaWNhdGVzIHdlIHN0aWxsIG5lZWQgdG8gZmV0Y2ggYW4gaW5pdGlhbCBibG9jayBudW1iZXJcbiAgICAjYmxvY2tOdW1iZXI7XG4gICAgLyoqXG4gICAgICogIENyZWF0ZSBhIG5ldyAqKlBvbGxpbmdUcmFuc2FjdGlvblN1YnNjcmliZXIqKiBhdHRhY2hlZCB0b1xuICAgICAqICAlJXByb3ZpZGVyJSUsIGxpc3RlbmluZyBmb3IgJSVmaWx0ZXIlJS5cbiAgICAgKi9cbiAgICBjb25zdHJ1Y3Rvcihwcm92aWRlciwgZmlsdGVyKSB7XG4gICAgICAgIHRoaXMuI3Byb3ZpZGVyID0gcHJvdmlkZXI7XG4gICAgICAgIHRoaXMuI2ZpbHRlciA9IGNvcHkoZmlsdGVyKTtcbiAgICAgICAgdGhpcy4jcG9sbGVyID0gdGhpcy4jcG9sbC5iaW5kKHRoaXMpO1xuICAgICAgICB0aGlzLiNydW5uaW5nID0gZmFsc2U7XG4gICAgICAgIHRoaXMuI2Jsb2NrTnVtYmVyID0gLTI7XG4gICAgfVxuICAgIGFzeW5jICNwb2xsKGJsb2NrTnVtYmVyKSB7XG4gICAgICAgIC8vIFRoZSBpbml0aWFsIGJsb2NrIGhhc24ndCBiZWVuIGRldGVybWluZWQgeWV0XG4gICAgICAgIGlmICh0aGlzLiNibG9ja051bWJlciA9PT0gLTIpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBmaWx0ZXIgPSBjb3B5KHRoaXMuI2ZpbHRlcik7XG4gICAgICAgIGZpbHRlci5mcm9tQmxvY2sgPSB0aGlzLiNibG9ja051bWJlciArIDE7XG4gICAgICAgIGZpbHRlci50b0Jsb2NrID0gYmxvY2tOdW1iZXI7XG4gICAgICAgIGNvbnN0IGxvZ3MgPSBhd2FpdCB0aGlzLiNwcm92aWRlci5nZXRMb2dzKGZpbHRlcik7XG4gICAgICAgIC8vIE5vIGxvZ3MgY291bGQganVzdCBtZWFuIHRoZSBub2RlIGhhcyBub3QgaW5kZXhlZCB0aGVtIHlldCxcbiAgICAgICAgLy8gc28gd2Uga2VlcCBhIHNsaWRpbmcgd2luZG93IG9mIDYwIGJsb2NrcyB0byBrZWVwIHNjYW5uaW5nXG4gICAgICAgIGlmIChsb2dzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgaWYgKHRoaXMuI2Jsb2NrTnVtYmVyIDwgYmxvY2tOdW1iZXIgLSA2MCkge1xuICAgICAgICAgICAgICAgIHRoaXMuI2Jsb2NrTnVtYmVyID0gYmxvY2tOdW1iZXIgLSA2MDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBmb3IgKGNvbnN0IGxvZyBvZiBsb2dzKSB7XG4gICAgICAgICAgICB0aGlzLiNwcm92aWRlci5lbWl0KHRoaXMuI2ZpbHRlciwgbG9nKTtcbiAgICAgICAgICAgIC8vIE9ubHkgYWR2YW5jZSB0aGUgYmxvY2sgbnVtYmVyIHdoZW4gbG9ncyB3ZXJlIGZvdW5kIHRvXG4gICAgICAgICAgICAvLyBhY2NvdW50IGZvciBuZXR3b3JrcyAobGlrZSBCTkIgYW5kIFBvbHlnb24pIHdoaWNoIG1heVxuICAgICAgICAgICAgLy8gc2FjcmlmaWNlIGV2ZW50IGNvbnNpc3RlbmN5IGZvciBibG9jayBldmVudCBzcGVlZFxuICAgICAgICAgICAgdGhpcy4jYmxvY2tOdW1iZXIgPSBsb2cuYmxvY2tOdW1iZXI7XG4gICAgICAgIH1cbiAgICB9XG4gICAgc3RhcnQoKSB7XG4gICAgICAgIGlmICh0aGlzLiNydW5uaW5nKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy4jcnVubmluZyA9IHRydWU7XG4gICAgICAgIGlmICh0aGlzLiNibG9ja051bWJlciA9PT0gLTIpIHtcbiAgICAgICAgICAgIHRoaXMuI3Byb3ZpZGVyLmdldEJsb2NrTnVtYmVyKCkudGhlbigoYmxvY2tOdW1iZXIpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLiNibG9ja051bWJlciA9IGJsb2NrTnVtYmVyO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy4jcHJvdmlkZXIub24oXCJibG9ja1wiLCB0aGlzLiNwb2xsZXIpO1xuICAgIH1cbiAgICBzdG9wKCkge1xuICAgICAgICBpZiAoIXRoaXMuI3J1bm5pbmcpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLiNydW5uaW5nID0gZmFsc2U7XG4gICAgICAgIHRoaXMuI3Byb3ZpZGVyLm9mZihcImJsb2NrXCIsIHRoaXMuI3BvbGxlcik7XG4gICAgfVxuICAgIHBhdXNlKGRyb3BXaGlsZVBhdXNlZCkge1xuICAgICAgICB0aGlzLnN0b3AoKTtcbiAgICAgICAgaWYgKGRyb3BXaGlsZVBhdXNlZCkge1xuICAgICAgICAgICAgdGhpcy4jYmxvY2tOdW1iZXIgPSAtMjtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXN1bWUoKSB7XG4gICAgICAgIHRoaXMuc3RhcnQoKTtcbiAgICB9XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1zdWJzY3JpYmVyLXBvbGxpbmcuanMubWFwIiwiLyoqXG4gKiAgVGhlIGF2YWlsYWJsZSBwcm92aWRlcnMgc2hvdWxkIHN1ZmZpY2UgZm9yIG1vc3QgZGV2ZWxvcGVycyBwdXJwb3NlcyxcbiAqICBidXQgdGhlIFtbQWJzdHJhY3RQcm92aWRlcl1dIGNsYXNzIGhhcyBtYW55IGZlYXR1cmVzIHdoaWNoIGVuYWJsZVxuICogIHN1Yi1jbGFzc2luZyBpdCBmb3Igc3BlY2lmaWMgcHVycG9zZXMuXG4gKlxuICogIEBfc2VjdGlvbjogYXBpL3Byb3ZpZGVycy9hYnN0cmFjdC1wcm92aWRlcjogU3ViY2xhc3NpbmcgUHJvdmlkZXIgIFthYnN0cmFjdC1wcm92aWRlcl1cbiAqL1xuLy8gQFRPRE9cbi8vIEV2ZW50IGNvYWxlc2NlbmNlXG4vLyAgIFdoZW4gd2UgcmVnaXN0ZXIgYW4gZXZlbnQgd2l0aCBhbiBhc3luYyB2YWx1ZSAoZS5nLiBhZGRyZXNzIGlzIGEgU2lnbmVyXG4vLyAgIG9yIEVOUyBuYW1lKSwgd2UgbmVlZCB0byBhZGQgaXQgaW1tZWlkYXRlbHkgZm9yIHRoZSBFdmVudCBBUEksIGJ1dCBhbHNvXG4vLyAgIG5lZWQgdGltZSB0byByZXNvbHZlIHRoZSBhZGRyZXNzLiBVcG9uIHJlc29sdmluZyB0aGUgYWRkcmVzcywgd2UgbmVlZCB0b1xuLy8gICBtaWdyYXRlIHRoZSBsaXN0ZW5lciB0byB0aGUgc3RhdGljIGV2ZW50LiBXZSBhbHNvIG5lZWQgdG8gbWFpbnRhaW4gYSBtYXBcbi8vICAgb2YgU2lnbmVyL0VOUyBuYW1lIHRvIGFkZHJlc3Mgc28gd2UgY2FuIHN5bmMgcmVzcG9uZCB0byBsaXN0ZW5lckNvdW50LlxuaW1wb3J0IHsgcmVzb2x2ZUFkZHJl
26774c3MgfSBmcm9tIFwiLi4vYWRkcmVzcy9pbmRleC5qc1wiO1xuaW1wb3J0IHsgVHJhbnNhY3Rpb24gfSBmcm9tIFwiLi4vdHJhbnNhY3Rpb24vaW5kZXguanNcIjtcbmltcG9ydCB7IGNvbmNhdCwgZGF0YUxlbmd0aCwgZGF0YVNsaWNlLCBoZXhsaWZ5LCBpc0hleFN0cmluZywgZ2V0QmlnSW50LCBnZXRCeXRlcywgZ2V0TnVtYmVyLCBpc0NhbGxFeGNlcHRpb24sIG1ha2VFcnJvciwgYXNzZXJ0LCBhc3NlcnRBcmd1bWVudCwgRmV0Y2hSZXF1ZXN0LCB0b0JlQXJyYXksIHRvUXVhbnRpdHksIGRlZmluZVByb3BlcnRpZXMsIEV2ZW50UGF5bG9hZCwgcmVzb2x2ZVByb3BlcnRpZXMsIHRvVXRmOFN0cmluZyB9IGZyb20gXCIuLi91dGlscy9pbmRleC5qc1wiO1xuaW1wb3J0IHsgRW5zUmVzb2x2ZXIgfSBmcm9tIFwiLi9lbnMtcmVzb2x2ZXIuanNcIjtcbmltcG9ydCB7IGZvcm1hdEJsb2NrLCBmb3JtYXRMb2csIGZvcm1hdFRyYW5zYWN0aW9uUmVjZWlwdCwgZm9ybWF0VHJhbnNhY3Rpb25SZXNwb25zZSB9IGZyb20gXCIuL2Zvcm1hdC5qc1wiO1xuaW1wb3J0IHsgTmV0d29yayB9IGZyb20gXCIuL25ldHdvcmsuanNcIjtcbmltcG9ydCB7IGNvcHlSZXF1ZXN0LCBCbG9jaywgRmVlRGF0YSwgTG9nLCBUcmFuc2FjdGlvblJlY2VpcHQsIFRyYW5zYWN0aW9uUmVzcG9uc2UgfSBmcm9tIFwiLi9wcm92aWRlci5qc1wiO1xuaW1wb3J0IHsgUG9sbGluZ0Jsb2NrU3Vic2NyaWJlciwgUG9sbGluZ0Jsb2NrVGFnU3Vic2NyaWJlciwgUG9sbGluZ0V2ZW50U3Vic2NyaWJlciwgUG9sbGluZ09ycGhhblN1YnNjcmliZXIsIFBvbGxpbmdUcmFuc2FjdGlvblN1YnNjcmliZXIgfSBmcm9tIFwiLi9zdWJzY3JpYmVyLXBvbGxpbmcuanNcIjtcbi8vIENvbnN0YW50c1xuY29uc3QgQk5fMiA9IEJpZ0ludCgyKTtcbmNvbnN0IE1BWF9DQ0lQX1JFRElSRUNUUyA9IDEwO1xuZnVuY3Rpb24gc3RhbGwoZHVyYXRpb24pIHtcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHsgc2V0VGltZW91dChyZXNvbHZlLCBkdXJhdGlvbik7IH0pO1xufVxuZnVuY3Rpb24gaXNQcm9taXNlKHZhbHVlKSB7XG4gICAgcmV0dXJuICh2YWx1ZSAmJiB0eXBlb2YgKHZhbHVlLnRoZW4pID09PSBcImZ1bmN0aW9uXCIpO1xufVxuZnVuY3Rpb24gZ2V0VGFnKHByZWZpeCwgdmFsdWUpIHtcbiAgICByZXR1cm4gcHJlZml4ICsgXCI6XCIgKyBKU09OLnN0cmluZ2lmeSh2YWx1ZSwgKGssIHYpID0+IHtcbiAgICAgICAgaWYgKHYgPT0gbnVsbCkge1xuICAgICAgICAgICAgcmV0dXJuIFwibnVsbFwiO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2YgKHYpID09PSBcImJpZ2ludFwiKSB7XG4gICAgICAgICAgICByZXR1cm4gYGJpZ2ludDoke3YudG9TdHJpbmcoKX1gO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2YgKHYpID09PSBcInN0cmluZ1wiKSB7XG4gICAgICAgICAgICByZXR1cm4gdi50b0xvd2VyQ2FzZSgpO1xuICAgICAgICB9XG4gICAgICAgIC8vIFNvcnQgb2JqZWN0IGtleXNcbiAgICAgICAgaWYgKHR5cGVvZiAodikgPT09IFwib2JqZWN0XCIgJiYgIUFycmF5LmlzQXJyYXkodikpIHtcbiAgICAgICAgICAgIGNvbnN0IGtleXMgPSBPYmplY3Qua2V5cyh2KTtcbiAgICAgICAgICAgIGtleXMuc29ydCgpO1xuICAgICAgICAgICAgcmV0dXJuIGtleXMucmVkdWNlKChhY2N1bSwga2V5KSA9PiB7XG4gICAgICAgICAgICAgICAgYWNjdW1ba2V5XSA9IHZba2V5XTtcbiAgICAgICAgICAgICAgICByZXR1cm4gYWNjdW07XG4gICAgICAgICAgICB9LCB7fSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHY7XG4gICAgfSk7XG59XG4vKipcbiAqICBBbiAqKlVubWFuYWdlZFN1YnNjcmliZXIqKiBpcyB1c2VmdWwgZm9yIGV2ZW50cyB3aGljaCBkbyBub3QgcmVxdWlyZVxuICogIGFueSBhZGRpdGlvbmFsIG1hbmFnZW1lbnQsIHN1Y2ggYXMgYGBcImRlYnVnXCJgYCB3aGljaCBvbmx5IHJlcXVpcmVzXG4gKiAgZW1pdCBpbiBzeW5jaHJvbm91cyBldmVudCBsb29wIHRyaWdnZXJlZCBjYWxscy5cbiAqL1xuZXhwb3J0IGNsYXNzIFVubWFuYWdlZFN1YnNjcmliZXIge1xuICAgIC8qKlxuICAgICAqICBUaGUgbmFtZSBmb2YgdGhlIGV2ZW50LlxuICAgICAqL1xuICAgIG5hbWU7XG4gICAgLyoqXG4gICAgICogIENyZWF0ZSBhIG5ldyBVbm1hbmFnZWRTdWJzY3JpYmVyIHdpdGggJSVuYW1lJSUuXG4gICAgICovXG4gICAgY29uc3RydWN0b3IobmFtZSkgeyBkZWZpbmVQcm9wZXJ0aWVzKHRoaXMsIHsgbmFtZSB9KTsgfVxuICAgIHN0YXJ0KCkgeyB9XG4gICAgc3RvcCgpIHsgfVxuICAgIHBhdXNlKGRyb3BXaGlsZVBhdXNlZCkgeyB9XG4gICAgcmVzdW1lKCkgeyB9XG59XG5mdW5jdGlvbiBjb3B5KHZhbHVlKSB7XG4gICAgcmV0dXJuIEpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkodmFsdWUpKTtcbn1cbmZ1bmN0aW9uIGNvbmNpc2lmeShpdGVtcykge1xuICAgIGl0ZW1zID0gQXJyYXkuZnJvbSgobmV3IFNldChpdGVtcykpLnZhbHVlcygpKTtcbiAgICBpdGVtcy5zb3J0KCk7XG4gICAgcmV0dXJuIGl0ZW1zO1xufVxuYXN5bmMgZnVuY3Rpb24gZ2V0U3Vic2NyaXB0aW9uKF9ldmVudCwgcHJvdmlkZXIpIHtcbiAgICBpZiAoX2V2ZW50ID09IG51bGwpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiaW52YWxpZCBldmVudFwiKTtcbiAgICB9XG4gICAgLy8gTm9ybWFsaXplIHRvcGljIGFycmF5IGluZm8gYW4gRXZlbnRGaWx0ZXJcbiAgICBpZiAoQXJyYXkuaXNBcnJheShfZXZlbnQpKSB7XG4gICAgICAgIF9ldmVudCA9IHsgdG9waWNzOiBfZXZlbnQgfTtcbiAgICB9XG4gICAgaWYgKHR5cGVvZiAoX2V2ZW50KSA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgICBzd2l0Y2ggKF9ldmVudCkge1xuICAgICAgICAgICAgY2FzZSBcImJsb2NrXCI6XG4gICAgICAgICAgICBjYXNlIFwiZGVidWdcIjpcbiAgICAgICAgICAgIGNhc2UgXCJlcnJvclwiOlxuICAgICAgICAgICAgY2FzZSBcImZpbmFsaXplZFwiOlxuICAgICAgICAgICAgY2FzZSBcIm5ldHdvcmtcIjpcbiAgICAgICAgICAgIGNhc2UgXCJwZW5kaW5nXCI6XG4gICAgICAgICAgICBjYXNlIFwic2FmZVwiOiB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHsgdHlwZTogX2V2ZW50LCB0YWc6IF9ldmVudCB9O1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIGlmIChpc0hleFN0cmluZyhfZXZlbnQsIDMyKSkge1xuICAgICAgICBjb25zdCBoYXNoID0gX2V2ZW50LnRvTG93ZXJDYXNlKCk7XG4gICAgICAgI
26774HJldHVybiB7IHR5cGU6IFwidHJhbnNhY3Rpb25cIiwgdGFnOiBnZXRUYWcoXCJ0eFwiLCB7IGhhc2ggfSksIGhhc2ggfTtcbiAgICB9XG4gICAgaWYgKF9ldmVudC5vcnBoYW4pIHtcbiAgICAgICAgY29uc3QgZXZlbnQgPSBfZXZlbnQ7XG4gICAgICAgIC8vIEBUT0RPOiBTaG91bGQgbG93ZXJjYXNlIGFuZCB3aGF0bm90IHRoaW5ncyBoZXJlIGluc3RlYWQgb2YgY29weS4uLlxuICAgICAgICByZXR1cm4geyB0eXBlOiBcIm9ycGhhblwiLCB0YWc6IGdldFRhZyhcIm9ycGhhblwiLCBldmVudCksIGZpbHRlcjogY29weShldmVudCkgfTtcbiAgICB9XG4gICAgaWYgKChfZXZlbnQuYWRkcmVzcyB8fCBfZXZlbnQudG9waWNzKSkge1xuICAgICAgICBjb25zdCBldmVudCA9IF9ldmVudDtcbiAgICAgICAgY29uc3QgZmlsdGVyID0ge1xuICAgICAgICAgICAgdG9waWNzOiAoKGV2ZW50LnRvcGljcyB8fCBbXSkubWFwKCh0KSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKHQgPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkodCkpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNvbmNpc2lmeSh0Lm1hcCgodCkgPT4gdC50b0xvd2VyQ2FzZSgpKSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiB0LnRvTG93ZXJDYXNlKCk7XG4gICAgICAgICAgICB9KSlcbiAgICAgICAgfTtcbiAgICAgICAgaWYgKGV2ZW50LmFkZHJlc3MpIHtcbiAgICAgICAgICAgIGNvbnN0IGFkZHJlc3NlcyA9IFtdO1xuICAgICAgICAgICAgY29uc3QgcHJvbWlzZXMgPSBbXTtcbiAgICAgICAgICAgIGNvbnN0IGFkZEFkZHJlc3MgPSAoYWRkcikgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChpc0hleFN0cmluZyhhZGRyKSkge1xuICAgICAgICAgICAgICAgICAgICBhZGRyZXNzZXMucHVzaChhZGRyKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHByb21pc2VzLnB1c2goKGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGFkZHJlc3Nlcy5wdXNoKGF3YWl0IHJlc29sdmVBZGRyZXNzKGFkZHIsIHByb3ZpZGVyKSk7XG4gICAgICAgICAgICAgICAgICAgIH0pKCkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShldmVudC5hZGRyZXNzKSkge1xuICAgICAgICAgICAgICAgIGV2ZW50LmFkZHJlc3MuZm9yRWFjaChhZGRBZGRyZXNzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGFkZEFkZHJlc3MoZXZlbnQuYWRkcmVzcyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAocHJvbWlzZXMubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgYXdhaXQgUHJvbWlzZS5hbGwocHJvbWlzZXMpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZmlsdGVyLmFkZHJlc3MgPSBjb25jaXNpZnkoYWRkcmVzc2VzLm1hcCgoYSkgPT4gYS50b0xvd2VyQ2FzZSgpKSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHsgZmlsdGVyLCB0YWc6IGdldFRhZyhcImV2ZW50XCIsIGZpbHRlciksIHR5cGU6IFwiZXZlbnRcIiB9O1xuICAgIH1cbiAgICBhc3NlcnRBcmd1bWVudChmYWxzZSwgXCJ1bmtub3duIFByb3ZpZGVyRXZlbnRcIiwgXCJldmVudFwiLCBfZXZlbnQpO1xufVxuZnVuY3Rpb24gZ2V0VGltZSgpIHsgcmV0dXJuIChuZXcgRGF0ZSgpKS5nZXRUaW1lKCk7IH1cbmNvbnN0IGRlZmF1bHRPcHRpb25zID0ge1xuICAgIGNhY2hlVGltZW91dDogMjUwLFxuICAgIHBvbGxpbmdJbnRlcnZhbDogNDAwMFxufTtcbi8qKlxuICogIEFuICoqQWJzdHJhY3RQcm92aWRlcioqIHByb3ZpZGVzIGEgYmFzZSBjbGFzcyBmb3Igb3RoZXIgc3ViLWNsYXNzZXMgdG9cbiAqICBpbXBsZW1lbnQgdGhlIFtbUHJvdmlkZXJdXSBBUEkgYnkgbm9ybWFsaXppbmcgaW5wdXQgYXJndW1lbnRzIGFuZFxuICogIGZvcm1hdHRpbmcgb3V0cHV0IHJlc3VsdHMgYXMgd2VsbCBhcyB0cmFja2luZyBldmVudHMgZm9yIGNvbnNpc3RlbnRcbiAqICBiZWhhdmlvdXIgb24gYW4gZXZlbnR1YWxseS1jb25zaXN0ZW50IG5ldHdvcmsuXG4gKi9cbmV4cG9ydCBjbGFzcyBBYnN0cmFjdFByb3ZpZGVyIHtcbiAgICAjc3VicztcbiAgICAjcGx1Z2lucztcbiAgICAvLyBudWxsPXVucGF1c2VkLCB0cnVlPXBhdXNlZCtkcm9wV2hpbGVQYXVzZWQsIGZhbHNlPXBhdXNlZFxuICAgICNwYXVzZWRTdGF0ZTtcbiAgICAjZGVzdHJveWVkO1xuICAgICNuZXR3b3JrUHJvbWlzZTtcbiAgICAjYW55TmV0d29yaztcbiAgICAjcGVyZm9ybUNhY2hlO1xuICAgIC8vIFRoZSBtb3N0IHJlY2VudCBibG9jayBudW1iZXIgaWYgcnVubmluZyBhbiBldmVudCBvciAtMSBpZiBubyBcImJsb2NrXCIgZXZlbnRcbiAgICAjbGFzdEJsb2NrTnVtYmVyO1xuICAgICNuZXh0VGltZXI7XG4gICAgI3RpbWVycztcbiAgICAjZGlzYWJsZUNjaXBSZWFkO1xuICAgICNyZXF1ZXN0UmF0ZTtcbiAgICAjcmVxdWVzdFRpbWVzO1xuICAgICNvcHRpb25zO1xuICAgIC8qKlxuICAgICAqICBDcmVhdGUgYSBuZXcgKipBYnN0cmFjdFByb3ZpZGVyKiogY29ubmVjdGVkIHRvICUlbmV0d29yayUlLCBvclxuICAgICAqICB1c2UgdGhlIHZhcmlvdXMgbmV0d29yayBkZXRlY3Rpb24gY2FwYWJpbGl0aWVzIHRvIGRpc2NvdmVyIHRoZVxuICAgICAqICBbW05ldHdvcmtdXSBpZiBuZWNlc3NhcnkuXG4gICAgICovXG4gICAgY29uc3RydWN0b3IoX25ldHdvcmssIG9wdGlvbnMpIHtcbiAgICAgICAgdGhpcy4jb3B0aW9ucyA9IE9iamVjdC5hc3NpZ24oe30sIGRlZmF1bHRPcHRpb25zLCBvcHRpb25zIHx8IHt9KTtcbiAgICAgICAgaWYgKF9uZXR3b3JrID09PSBcImFueVwiKSB7XG4gICAgICAgICAgICB0aGlzLiNhbnlOZXR3b3JrID0gdHJ1ZTtcbiAgICAgICAgICAgIHRoaXMuI25ldHdvcmtQcm9taXNlID0gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChfbmV0d29yaykge1xuICAgICAgICAgICAgY29uc3QgbmV0d29yayA9IE5ldHdvcmsuZnJvbShfbmV0d29yayk7XG4gICAgICAgICAgICB0aGlzLiNhbnlOZXR3b3JrID0gZmFsc2U7XG4gICAgICAgICAgICB0aGlzLiNuZXR3b3JrUHJvbWlzZSA9IFByb21pc2UucmVzb2x2ZShuZXR3b3JrKTtcbiAgICAgICAgICAgI
26774HNldFRpbWVvdXQoKCkgPT4geyB0aGlzLmVtaXQoXCJuZXR3b3JrXCIsIG5ldHdvcmssIG51bGwpOyB9LCAwKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuI2FueU5ldHdvcmsgPSBmYWxzZTtcbiAgICAgICAgICAgIHRoaXMuI25ldHdvcmtQcm9taXNlID0gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLiNsYXN0QmxvY2tOdW1iZXIgPSAtMTtcbiAgICAgICAgdGhpcy4jcGVyZm9ybUNhY2hlID0gbmV3IE1hcCgpO1xuICAgICAgICB0aGlzLiNzdWJzID0gbmV3IE1hcCgpO1xuICAgICAgICB0aGlzLiNwbHVnaW5zID0gbmV3IE1hcCgpO1xuICAgICAgICB0aGlzLiNwYXVzZWRTdGF0ZSA9IG51bGw7XG4gICAgICAgIHRoaXMuI2Rlc3Ryb3llZCA9IGZhbHNlO1xuICAgICAgICB0aGlzLiNuZXh0VGltZXIgPSAxO1xuICAgICAgICB0aGlzLiN0aW1lcnMgPSBuZXcgTWFwKCk7XG4gICAgICAgIHRoaXMuI2Rpc2FibGVDY2lwUmVhZCA9IGZhbHNlO1xuICAgICAgICB0aGlzLiNyZXF1ZXN0UmF0ZSA9IDA7XG4gICAgICAgIHRoaXMuI3JlcXVlc3RUaW1lcyA9IFtdO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiAgTGltaXQgdGhlIG51bWJlciBvZiByZXF1ZXN0cyBwZXIgc2Vjb25kLiAoZGVmYXVsdDogbm8gbGltaXQpXG4gICAgICovXG4gICAgZ2V0IF9yZXF1ZXN0UmF0ZSgpIHtcbiAgICAgICAgY29uc3QgdmFsdWUgPSB0aGlzLiNyZXF1ZXN0UmF0ZTtcbiAgICAgICAgaWYgKHZhbHVlID09IDApIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICB9XG4gICAgc2V0IF9yZXF1ZXN0UmF0ZSh2YWx1ZSkge1xuICAgICAgICBpZiAodmFsdWUgPT0gbnVsbCB8fCB2YWx1ZSA8IDApIHtcbiAgICAgICAgICAgIHZhbHVlID0gMDtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLiNyZXF1ZXN0UmF0ZSA9IGdldE51bWJlcih2YWx1ZSk7XG4gICAgfVxuICAgIGdldCBwb2xsaW5nSW50ZXJ2YWwoKSB7IHJldHVybiB0aGlzLiNvcHRpb25zLnBvbGxpbmdJbnRlcnZhbDsgfVxuICAgIC8qKlxuICAgICAqICBSZXR1cm5zIGBgdGhpc2BgLCB0byBhbGxvdyBhbiAqKkFic3RyYWN0UHJvdmlkZXIqKiB0byBpbXBsZW1lbnRcbiAgICAgKiAgdGhlIFtbQ29udHJhY3RSdW5uZXJdXSBpbnRlcmZhY2UuXG4gICAgICovXG4gICAgZ2V0IHByb3ZpZGVyKCkgeyByZXR1cm4gdGhpczsgfVxuICAgIC8qKlxuICAgICAqICBSZXR1cm5zIGFsbCB0aGUgcmVnaXN0ZXJlZCBwbHVnLWlucy5cbiAgICAgKi9cbiAgICBnZXQgcGx1Z2lucygpIHtcbiAgICAgICAgcmV0dXJuIEFycmF5LmZyb20odGhpcy4jcGx1Z2lucy52YWx1ZXMoKSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqICBBdHRhY2ggYSBuZXcgcGx1Zy1pbi5cbiAgICAgKi9cbiAgICBhdHRhY2hQbHVnaW4ocGx1Z2luKSB7XG4gICAgICAgIGlmICh0aGlzLiNwbHVnaW5zLmdldChwbHVnaW4ubmFtZSkpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgY2Fubm90IHJlcGxhY2UgZXhpc3RpbmcgcGx1Z2luOiAke3BsdWdpbi5uYW1lfSBgKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLiNwbHVnaW5zLnNldChwbHVnaW4ubmFtZSwgcGx1Z2luLmNvbm5lY3QodGhpcykpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgLyoqXG4gICAgICogIEdldCBhIHBsdWdpbiBieSBuYW1lLlxuICAgICAqL1xuICAgIGdldFBsdWdpbihuYW1lKSB7XG4gICAgICAgIHJldHVybiAodGhpcy4jcGx1Z2lucy5nZXQobmFtZSkpIHx8IG51bGw7XG4gICAgfVxuICAgIC8qKlxuICAgICAqICBQcmV2ZW50IGFueSBDQ0lQLXJlYWQgb3BlcmF0aW9uLCByZWdhcmRsZXNzIG9mIHdoZXRoZXIgcmVxdWVzdGVkXG4gICAgICogIGluIGEgW1tjYWxsXV0gdXNpbmcgYGBlbmFibGVDY2lwUmVhZGBgLlxuICAgICAqL1xuICAgIGdldCBkaXNhYmxlQ2NpcFJlYWQoKSB7IHJldHVybiB0aGlzLiNkaXNhYmxlQ2NpcFJlYWQ7IH1cbiAgICBzZXQgZGlzYWJsZUNjaXBSZWFkKHZhbHVlKSB7IHRoaXMuI2Rpc2FibGVDY2lwUmVhZCA9ICEhdmFsdWU7IH1cbiAgICAjZ2V0RGVsYXkoKSB7XG4gICAgICAgIGxldCByZXF1ZXN0UmF0ZSA9IHRoaXMuI3JlcXVlc3RSYXRlO1xuICAgICAgICBpZiAocmVxdWVzdFJhdGUgPT09IDApIHtcbiAgICAgICAgICAgIHJldHVybiAwO1xuICAgICAgICB9XG4gICAgICAgIC8vIFJlbW92ZSBhbGwgdG9vLW9sZCByZXF1ZXN0IHRpbWVzXG4gICAgICAgIGNvbnN0IHJlcXVlc3RzID0gdGhpcy4jcmVxdWVzdFRpbWVzO1xuICAgICAgICBjb25zdCBub3cgPSBnZXRUaW1lKCk7XG4gICAgICAgIHJlcXVlc3RzLnB1c2gobm93KTtcbiAgICAgICAgY29uc3Qgc2NhblRpbWUgPSBub3cgLSAxMDAwO1xuICAgICAgICB3aGlsZSAocmVxdWVzdHMubGVuZ3RoICYmIHJlcXVlc3RzWzBdIDwgc2NhblRpbWUpIHtcbiAgICAgICAgICAgIHJlcXVlc3RzLnNoaWZ0KCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHJlcXVlc3RzLmxlbmd0aCA8IHJlcXVlc3RSYXRlKSB7XG4gICAgICAgICAgICByZXR1cm4gMDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gKHJlcXVlc3RzWzBdICsgMTAwMCkgLSBub3c7XG4gICAgfVxuICAgIC8vIFNoYXJlcyBtdWx0aXBsZSBpZGVudGljYWwgcmVxdWVzdHMgbWFkZSBkdXJpbmcgdGhlIHNhbWUgMjUwbXNcbiAgICBhc3luYyAjcGVyZm9ybShyZXEpIHtcbiAgICAgICAgY29uc3QgdGltZW91dCA9IHRoaXMuI29wdGlvbnMuY2FjaGVUaW1lb3V0O1xuICAgICAgICAvLyBDYWNoaW5nIGRpc2FibGVkXG4gICAgICAgIGlmICh0aW1lb3V0IDwgMCkge1xuICAgICAgICAgICAgY29uc3QgZGVsYXkgPSB0aGlzLiNnZXREZWxheSgpO1xuICAgICAgICAgICAgaWYgKGRlbGF5KSB7XG4gICAgICAgICAgICAgICAgYXdhaXQgc3RhbGwoZGVsYXkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuX3BlcmZvcm0ocmVxKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBDcmVhdGUgYSB0YWdcbiAgICAgICAgY29uc3QgdGFnID0gZ2V0VGFnKHJlcS5tZXRob2QsIHJlcSk7XG4gICAgICAgIGxldCBwZXJmb3JtID0gdGhpcy4jcGVyZm9ybUNhY2hlLmdldCh0YWcpO1xuICAgICAgICBpZiAoIXBlcmZvcm0pIHtcbiAgICAgICAgICAgIGNvbnN0IGRlbGF5ID0gdGh
26774pcy4jZ2V0RGVsYXkoKTtcbiAgICAgICAgICAgIGlmIChkZWxheSkge1xuICAgICAgICAgICAgICAgIGF3YWl0IHN0YWxsKGRlbGF5KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHBlcmZvcm0gPSB0aGlzLl9wZXJmb3JtKHJlcSk7XG4gICAgICAgICAgICB0aGlzLiNwZXJmb3JtQ2FjaGUuc2V0KHRhZywgcGVyZm9ybSk7XG4gICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy4jcGVyZm9ybUNhY2hlLmdldCh0YWcpID09PSBwZXJmb3JtKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuI3BlcmZvcm1DYWNoZS5kZWxldGUodGFnKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LCB0aW1lb3V0KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYXdhaXQgcGVyZm9ybTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogIFJlc29sdmVzIHRvIHRoZSBkYXRhIGZvciBleGVjdXRpbmcgdGhlIENDSVAtcmVhZCBvcGVyYXRpb25zLlxuICAgICAqL1xuICAgIGFzeW5jIGNjaXBSZWFkRmV0Y2godHgsIGNhbGxkYXRhLCB1cmxzKSB7XG4gICAgICAgIGlmICh0aGlzLmRpc2FibGVDY2lwUmVhZCB8fCB1cmxzLmxlbmd0aCA9PT0gMCB8fCB0eC50byA9PSBudWxsKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBzZW5kZXIgPSB0eC50by50b0xvd2VyQ2FzZSgpO1xuICAgICAgICBjb25zdCBkYXRhID0gY2FsbGRhdGEudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgY29uc3QgZXJyb3JNZXNzYWdlcyA9IFtdO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHVybHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGNvbnN0IHVybCA9IHVybHNbaV07XG4gICAgICAgICAgICAvLyBVUkwgZXhwYW5zaW9uXG4gICAgICAgICAgICBjb25zdCBocmVmID0gdXJsLnJlcGxhY2UoXCJ7c2VuZGVyfVwiLCBzZW5kZXIpLnJlcGxhY2UoXCJ7ZGF0YX1cIiwgZGF0YSk7XG4gICAgICAgICAgICAvLyBJZiBubyB7ZGF0YX0gaXMgcHJlc2VudCwgdXNlIFBPU1Q7IG90aGVyd2lzZSBHRVRcbiAgICAgICAgICAgIC8vY29uc3QganNvbjogc3RyaW5nIHwgbnVsbCA9ICh1cmwuaW5kZXhPZihcIntkYXRhfVwiKSA+PSAwKSA/IG51bGw6IEpTT04uc3RyaW5naWZ5KHsgZGF0YSwgc2VuZGVyIH0pO1xuICAgICAgICAgICAgLy9jb25zdCByZXN1bHQgPSBhd2FpdCBmZXRjaEpzb24oeyB1cmw6IGhyZWYsIGVycm9yUGFzc1Rocm91Z2g6IHRydWUgfSwganNvbiwgKHZhbHVlLCByZXNwb25zZSkgPT4ge1xuICAgICAgICAgICAgLy8gICAgdmFsdWUuc3RhdHVzID0gcmVzcG9uc2Uuc3RhdHVzQ29kZTtcbiAgICAgICAgICAgIC8vICAgIHJldHVybiB2YWx1ZTtcbiAgICAgICAgICAgIC8vfSk7XG4gICAgICAgICAgICBjb25zdCByZXF1ZXN0ID0gbmV3IEZldGNoUmVxdWVzdChocmVmKTtcbiAgICAgICAgICAgIGlmICh1cmwuaW5kZXhPZihcIntkYXRhfVwiKSA9PT0gLTEpIHtcbiAgICAgICAgICAgICAgICByZXF1ZXN0LmJvZHkgPSB7IGRhdGEsIHNlbmRlciB9O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5lbWl0KFwiZGVidWdcIiwgeyBhY3Rpb246IFwic2VuZENjaXBSZWFkRmV0Y2hSZXF1ZXN0XCIsIHJlcXVlc3QsIGluZGV4OiBpLCB1cmxzIH0pO1xuICAgICAgICAgICAgbGV0IGVycm9yTWVzc2FnZSA9IFwidW5rbm93biBlcnJvclwiO1xuICAgICAgICAgICAgLy8gRmV0Y2ggdGhlIHJlc291cmNlLi4uXG4gICAgICAgICAgICBsZXQgcmVzcDtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgcmVzcCA9IGF3YWl0IHJlcXVlc3Quc2VuZCgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICAgICAgLy8gLi4ubG93LWxldmVsIGZldGNoIGVycm9yIChtaXNzaW5nIGhvc3QsIGJhZCBTU0wsIGV0Yy4pLFxuICAgICAgICAgICAgICAgIC8vIHNvIHRyeSBuZXh0IFVSTFxuICAgICAgICAgICAgICAgIGVycm9yTWVzc2FnZXMucHVzaChlcnJvci5tZXNzYWdlKTtcbiAgICAgICAgICAgICAgICB0aGlzLmVtaXQoXCJkZWJ1Z1wiLCB7IGFjdGlvbjogXCJyZWNlaXZlQ2NpcFJlYWRGZXRjaEVycm9yXCIsIHJlcXVlc3QsIHJlc3VsdDogeyBlcnJvciB9IH0pO1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBjb25zdCByZXN1bHQgPSByZXNwLmJvZHlKc29uO1xuICAgICAgICAgICAgICAgIGlmIChyZXN1bHQuZGF0YSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmVtaXQoXCJkZWJ1Z1wiLCB7IGFjdGlvbjogXCJyZWNlaXZlQ2NpcFJlYWRGZXRjaFJlc3VsdFwiLCByZXF1ZXN0LCByZXN1bHQgfSk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQuZGF0YTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKHJlc3VsdC5tZXNzYWdlKSB7XG4gICAgICAgICAgICAgICAgICAgIGVycm9yTWVzc2FnZSA9IHJlc3VsdC5tZXNzYWdlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB0aGlzLmVtaXQoXCJkZWJ1Z1wiLCB7IGFjdGlvbjogXCJyZWNlaXZlQ2NpcFJlYWRGZXRjaEVycm9yXCIsIHJlcXVlc3QsIHJlc3VsdCB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhdGNoIChlcnJvcikgeyB9XG4gICAgICAgICAgICAvLyA0eHggaW5kaWNhdGVzIHRoZSByZXN1bHQgaXMgbm90IHByZXNlbnQ7IHN0b3BcbiAgICAgICAgICAgIGFzc2VydChyZXNwLnN0YXR1c0NvZGUgPCA0MDAgfHwgcmVzcC5zdGF0dXNDb2RlID49IDUwMCwgYHJlc3BvbnNlIG5vdCBmb3VuZCBkdXJpbmcgQ0NJUCBmZXRjaDogJHtlcnJvck1lc3NhZ2V9YCwgXCJPRkZDSEFJTl9GQVVMVFwiLCB7IHJlYXNvbjogXCI0MDRfTUlTU0lOR19SRVNPVVJDRVwiLCB0cmFuc2FjdGlvbjogdHgsIGluZm86IHsgdXJsLCBlcnJvck1lc3NhZ2UgfSB9KTtcbiAgICAgICAgICAgIC8vIDV4eCBpbmRpY2F0ZXMgc2VydmVyIGlzc3VlOyB0cnkgdGhlIG5leHQgdXJsXG4gICAgICAgICAgICBlcnJvck1lc3NhZ2VzLnB1c2goZXJyb3JNZXNzYWdlKTtcbiAgICAgICAgfVxuICAgICAgICBhc3NlcnQoZmFsc2UsIGBlcnJvciBlbmNvdW50ZXJlZCBkdXJpbmcgQ0NJUCBmZXRjaDogJHtlcnJvck1lc3NhZ2VzLm1hcCgobSkgPT4gSlNPTi5zdHJpbmdpZnkobSkpLmpvaW4oXCIsIFwiKX1gLCBcIk9GRkNIQUlOX0ZBVUxUXCIsIHtcbiAgICAgICAgICAgI
26774HJlYXNvbjogXCI1MDBfU0VSVkVSX0VSUk9SXCIsXG4gICAgICAgICAgICB0cmFuc2FjdGlvbjogdHgsIGluZm86IHsgdXJscywgZXJyb3JNZXNzYWdlcyB9XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiAgUHJvdmlkZXMgdGhlIG9wcG9ydHVuaXR5IGZvciBhIHN1Yi1jbGFzcyB0byB3cmFwIGEgYmxvY2sgYmVmb3JlXG4gICAgICogIHJldHVybmluZyBpdCwgdG8gYWRkIGFkZGl0aW9uYWwgcHJvcGVydGllcyBvciBhbiBhbHRlcm5hdGVcbiAgICAgKiAgc3ViLWNsYXNzIG9mIFtbQmxvY2tdXS5cbiAgICAgKi9cbiAgICBfd3JhcEJsb2NrKHZhbHVlLCBuZXR3b3JrKSB7XG4gICAgICAgIHJldHVybiBuZXcgQmxvY2soZm9ybWF0QmxvY2sodmFsdWUpLCB0aGlzKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogIFByb3ZpZGVzIHRoZSBvcHBvcnR1bml0eSBmb3IgYSBzdWItY2xhc3MgdG8gd3JhcCBhIGxvZyBiZWZvcmVcbiAgICAgKiAgcmV0dXJuaW5nIGl0LCB0byBhZGQgYWRkaXRpb25hbCBwcm9wZXJ0aWVzIG9yIGFuIGFsdGVybmF0ZVxuICAgICAqICBzdWItY2xhc3Mgb2YgW1tMb2ddXS5cbiAgICAgKi9cbiAgICBfd3JhcExvZyh2YWx1ZSwgbmV0d29yaykge1xuICAgICAgICByZXR1cm4gbmV3IExvZyhmb3JtYXRMb2codmFsdWUpLCB0aGlzKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogIFByb3ZpZGVzIHRoZSBvcHBvcnR1bml0eSBmb3IgYSBzdWItY2xhc3MgdG8gd3JhcCBhIHRyYW5zYWN0aW9uXG4gICAgICogIHJlY2VpcHQgYmVmb3JlIHJldHVybmluZyBpdCwgdG8gYWRkIGFkZGl0aW9uYWwgcHJvcGVydGllcyBvciBhblxuICAgICAqICBhbHRlcm5hdGUgc3ViLWNsYXNzIG9mIFtbVHJhbnNhY3Rpb25SZWNlaXB0XV0uXG4gICAgICovXG4gICAgX3dyYXBUcmFuc2FjdGlvblJlY2VpcHQodmFsdWUsIG5ldHdvcmspIHtcbiAgICAgICAgcmV0dXJuIG5ldyBUcmFuc2FjdGlvblJlY2VpcHQoZm9ybWF0VHJhbnNhY3Rpb25SZWNlaXB0KHZhbHVlKSwgdGhpcyk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqICBQcm92aWRlcyB0aGUgb3Bwb3J0dW5pdHkgZm9yIGEgc3ViLWNsYXNzIHRvIHdyYXAgYSB0cmFuc2FjdGlvblxuICAgICAqICByZXNwb25zZSBiZWZvcmUgcmV0dXJuaW5nIGl0LCB0byBhZGQgYWRkaXRpb25hbCBwcm9wZXJ0aWVzIG9yIGFuXG4gICAgICogIGFsdGVybmF0ZSBzdWItY2xhc3Mgb2YgW1tUcmFuc2FjdGlvblJlc3BvbnNlXV0uXG4gICAgICovXG4gICAgX3dyYXBUcmFuc2FjdGlvblJlc3BvbnNlKHR4LCBuZXR3b3JrKSB7XG4gICAgICAgIHJldHVybiBuZXcgVHJhbnNhY3Rpb25SZXNwb25zZShmb3JtYXRUcmFuc2FjdGlvblJlc3BvbnNlKHR4KSwgdGhpcyk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqICBSZXNvbHZlcyB0byB0aGUgTmV0d29yaywgZm9yY2luZyBhIG5ldHdvcmsgZGV0ZWN0aW9uIHVzaW5nIHdoYXRldmVyXG4gICAgICogIHRlY2huaXF1ZSB0aGUgc3ViLWNsYXNzIHJlcXVpcmVzLlxuICAgICAqXG4gICAgICogIFN1Yi1jbGFzc2VzICoqbXVzdCoqIG92ZXJyaWRlIHRoaXMuXG4gICAgICovXG4gICAgX2RldGVjdE5ldHdvcmsoKSB7XG4gICAgICAgIGFzc2VydChmYWxzZSwgXCJzdWItY2xhc3NlcyBtdXN0IGltcGxlbWVudCB0aGlzXCIsIFwiVU5TVVBQT1JURURfT1BFUkFUSU9OXCIsIHtcbiAgICAgICAgICAgIG9wZXJhdGlvbjogXCJfZGV0ZWN0TmV0d29ya1wiXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiAgU3ViLWNsYXNzZXMgc2hvdWxkIHVzZSB0aGlzIHRvIHBlcmZvcm0gYWxsIGJ1aWx0LWluIG9wZXJhdGlvbnMuIEFsbFxuICAgICAqICBtZXRob2RzIHNhbml0aXplcyBhbmQgbm9ybWFsaXplcyB0aGUgdmFsdWVzIHBhc3NlZCBpbnRvIHRoaXMuXG4gICAgICpcbiAgICAgKiAgU3ViLWNsYXNzZXMgKiptdXN0Kiogb3ZlcnJpZGUgdGhpcy5cbiAgICAgKi9cbiAgICBhc3luYyBfcGVyZm9ybShyZXEpIHtcbiAgICAgICAgYXNzZXJ0KGZhbHNlLCBgdW5zdXBwb3J0ZWQgbWV0aG9kOiAke3JlcS5tZXRob2R9YCwgXCJVTlNVUFBPUlRFRF9PUEVSQVRJT05cIiwge1xuICAgICAgICAgICAgb3BlcmF0aW9uOiByZXEubWV0aG9kLFxuICAgICAgICAgICAgaW5mbzogcmVxXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICAvLyBTdGF0ZVxuICAgIGFzeW5jIGdldEJsb2NrTnVtYmVyKCkge1xuICAgICAgICBjb25zdCBibG9ja051bWJlciA9IGdldE51bWJlcihhd2FpdCB0aGlzLiNwZXJmb3JtKHsgbWV0aG9kOiBcImdldEJsb2NrTnVtYmVyXCIgfSksIFwiJXJlc3BvbnNlXCIpO1xuICAgICAgICBpZiAodGhpcy4jbGFzdEJsb2NrTnVtYmVyID49IDApIHtcbiAgICAgICAgICAgIHRoaXMuI2xhc3RCbG9ja051bWJlciA9IGJsb2NrTnVtYmVyO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBibG9ja051bWJlcjtcbiAgICB9XG4gICAgLyoqXG4gICAgICogIFJldHVybnMgb3IgcmVzb2x2ZXMgdG8gdGhlIGFkZHJlc3MgZm9yICUlYWRkcmVzcyUlLCByZXNvbHZpbmcgRU5TXG4gICAgICogIG5hbWVzIGFuZCBbW0FkZHJlc3NhYmxlXV0gb2JqZWN0cyBhbmQgcmV0dXJuaW5nIGlmIGFscmVhZHkgYW5cbiAgICAgKiAgYWRkcmVzcy5cbiAgICAgKi9cbiAgICBfZ2V0QWRkcmVzcyhhZGRyZXNzKSB7XG4gICAgICAgIHJldHVybiByZXNvbHZlQWRkcmVzcyhhZGRyZXNzLCB0aGlzKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogIFJldHVybnMgb3IgcmVzb2x2ZXMgdG8gYSB2YWxpZCBibG9jayB0YWcgZm9yICUlYmxvY2tUYWclJSwgcmVzb2x2aW5nXG4gICAgICogIG5lZ2F0aXZlIHZhbHVlcyBhbmQgcmV0dXJuaW5nIGlmIGFscmVhZHkgYSB2YWxpZCBibG9jayB0YWcuXG4gICAgICovXG4gICAgX2dldEJsb2NrVGFnKGJsb2NrVGFnKSB7XG4gICAgICAgIGlmIChibG9ja1RhZyA9PSBudWxsKSB7XG4gICAgICAgICAgICByZXR1cm4gXCJsYXRlc3RcIjtcbiAgICAgICAgfVxuICAgICAgICBzd2l0Y2ggKGJsb2NrVGFnKSB7XG4gICAgICAgICAgICBjYXNlIFwiZWFybGllc3RcIjpcbiAgICAgICAgICAgICAgICByZXR1cm4gXCIweDBcIjtcbiAgICAgICAgICAgIGNhc2UgXCJmaW5hbGl6ZWRcIjpcbiAgICAgICAgICAgIGNhc2UgXCJsYXRlc3RcIjpcbiAgICAgICAgICAgIGNhc2UgXCJwZW5kaW5nXCI6XG4gICAgICAgICAgICBjYXNlIFwic2FmZVwiOlxuICAgICAgICAgICAgICAgI
26774HJldHVybiBibG9ja1RhZztcbiAgICAgICAgfVxuICAgICAgICBpZiAoaXNIZXhTdHJpbmcoYmxvY2tUYWcpKSB7XG4gICAgICAgICAgICBpZiAoaXNIZXhTdHJpbmcoYmxvY2tUYWcsIDMyKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBibG9ja1RhZztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB0b1F1YW50aXR5KGJsb2NrVGFnKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIChibG9ja1RhZykgPT09IFwiYmlnaW50XCIpIHtcbiAgICAgICAgICAgIGJsb2NrVGFnID0gZ2V0TnVtYmVyKGJsb2NrVGFnLCBcImJsb2NrVGFnXCIpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2YgKGJsb2NrVGFnKSA9PT0gXCJudW1iZXJcIikge1xuICAgICAgICAgICAgaWYgKGJsb2NrVGFnID49IDApIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdG9RdWFudGl0eShibG9ja1RhZyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAodGhpcy4jbGFzdEJsb2NrTnVtYmVyID49IDApIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdG9RdWFudGl0eSh0aGlzLiNsYXN0QmxvY2tOdW1iZXIgKyBibG9ja1RhZyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5nZXRCbG9ja051bWJlcigpLnRoZW4oKGIpID0+IHRvUXVhbnRpdHkoYiArIGJsb2NrVGFnKSk7XG4gICAgICAgIH1cbiAgICAgICAgYXNzZXJ0QXJndW1lbnQoZmFsc2UsIFwiaW52YWxpZCBibG9ja1RhZ1wiLCBcImJsb2NrVGFnXCIsIGJsb2NrVGFnKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogIFJldHVybnMgb3IgcmVzb2x2ZXMgdG8gYSBmaWx0ZXIgZm9yICUlZmlsdGVyJSUsIHJlc29sdmluZyBhbnkgRU5TXG4gICAgICogIG5hbWVzIG9yIFtbQWRkcmVzc2FibGVdXSBvYmplY3QgYW5kIHJldHVybmluZyBpZiBhbHJlYWR5IGEgdmFsaWRcbiAgICAgKiAgZmlsdGVyLlxuICAgICAqL1xuICAgIF9nZXRGaWx0ZXIoZmlsdGVyKSB7XG4gICAgICAgIC8vIENyZWF0ZSBhIGNhbm9uaWNhbCByZXByZXNlbnRhdGlvbiBvZiB0aGUgdG9waWNzXG4gICAgICAgIGNvbnN0IHRvcGljcyA9IChmaWx0ZXIudG9waWNzIHx8IFtdKS5tYXAoKHQpID0+IHtcbiAgICAgICAgICAgIGlmICh0ID09IG51bGwpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KHQpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGNvbmNpc2lmeSh0Lm1hcCgodCkgPT4gdC50b0xvd2VyQ2FzZSgpKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gdC50b0xvd2VyQ2FzZSgpO1xuICAgICAgICB9KTtcbiAgICAgICAgY29uc3QgYmxvY2tIYXNoID0gKFwiYmxvY2tIYXNoXCIgaW4gZmlsdGVyKSA/IGZpbHRlci5ibG9ja0hhc2ggOiB1bmRlZmluZWQ7XG4gICAgICAgIGNvbnN0IHJlc29sdmUgPSAoX2FkZHJlc3MsIGZyb21CbG9jaywgdG9CbG9jaykgPT4ge1xuICAgICAgICAgICAgbGV0IGFkZHJlc3MgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICBzd2l0Y2ggKF9hZGRyZXNzLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgIGNhc2UgMDogYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgICAgICAgICBhZGRyZXNzID0gX2FkZHJlc3NbMF07XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICAgIF9hZGRyZXNzLnNvcnQoKTtcbiAgICAgICAgICAgICAgICAgICAgYWRkcmVzcyA9IF9hZGRyZXNzO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGJsb2NrSGFzaCkge1xuICAgICAgICAgICAgICAgIGlmIChmcm9tQmxvY2sgIT0gbnVsbCB8fCB0b0Jsb2NrICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiaW52YWxpZCBmaWx0ZXJcIik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgZmlsdGVyID0ge307XG4gICAgICAgICAgICBpZiAoYWRkcmVzcykge1xuICAgICAgICAgICAgICAgIGZpbHRlci5hZGRyZXNzID0gYWRkcmVzcztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh0b3BpY3MubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgZmlsdGVyLnRvcGljcyA9IHRvcGljcztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChmcm9tQmxvY2spIHtcbiAgICAgICAgICAgICAgICBmaWx0ZXIuZnJvbUJsb2NrID0gZnJvbUJsb2NrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHRvQmxvY2spIHtcbiAgICAgICAgICAgICAgICBmaWx0ZXIudG9CbG9jayA9IHRvQmxvY2s7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoYmxvY2tIYXNoKSB7XG4gICAgICAgICAgICAgICAgZmlsdGVyLmJsb2NrSGFzaCA9IGJsb2NrSGFzaDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBmaWx0ZXI7XG4gICAgICAgIH07XG4gICAgICAgIC8vIEFkZHJlc3NlcyBjb3VsZCBiZSBhc3luYyAoRU5TIG5hbWVzIG9yIEFkZHJlc3NhYmxlcylcbiAgICAgICAgbGV0IGFkZHJlc3MgPSBbXTtcbiAgICAgICAgaWYgKGZpbHRlci5hZGRyZXNzKSB7XG4gICAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShmaWx0ZXIuYWRkcmVzcykpIHtcbiAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGFkZHIgb2YgZmlsdGVyLmFkZHJlc3MpIHtcbiAgICAgICAgICAgICAgICAgICAgYWRkcmVzcy5wdXNoKHRoaXMuX2dldEFkZHJlc3MoYWRkcikpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGFkZHJlc3MucHVzaCh0aGlzLl9nZXRBZGRyZXNzKGZpbHRlci5hZGRyZXNzKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgbGV0IGZyb21CbG9jayA9IHVuZGVmaW5lZDtcbiAgICAgICAgaWYgKFwiZnJvbUJsb2NrXCIgaW4gZmlsdGVyKSB7XG4gICAgICAgICAgICBmcm9tQmxvY2sgPSB0aGlzLl9nZXRCbG9ja1RhZyhmaWx0ZXIuZnJvbUJsb2NrKTtcbiAgICAgICAgfVxuICAgICAgICBsZXQgdG9CbG9jayA9IHVuZGVmaW5lZDtcbiAgICAgICAgaWYgKFwidG9CbG9ja1wiIGluIGZpbHRlcikge1xuICAgICAgICAgICAgdG9CbG9jayA9IHRoaXMuX2dldEJsb2NrVGFnKGZpbHRlci50b0Jsb2NrKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoYWRkcmVzcy5maWx0ZXIoKGEpID0+ICh0eXBlb2YgKGEpICE9PSBcInN0cmluZ1wiKSkubGVuZ3RoIHx8XG4gICAgICAgICAgICAoZnJvbUJsb2NrICE9IG51bGwgJiYgdHlwZW9mIChmcm9tQmxvY2spICE9PSBcInN0cmluZ1wiKSB8fFxuICAgICAgICAgICAgKHRvQmxvY2sgIT0gbnVsbCAmJiB0eXBlb2YgKHRvQmxvY2spICE9PSBcInN0cmluZ1wiKSkge1xuICAgICAgICAgICAgcmV0dXJuIFByb21pc2UuYWxsKFtQcm9taXNlLmFsbChhZGRyZXNzKSwgZnJvbUJsb2NrLCB0b0Jsb2NrXSkudGhlbigocmVzdWx0KSA9PiB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlc29sdmUocmVzdWx0WzBdLCByZXN1bHRbMV0sIHJlc3VsdFsyXSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzb2x2ZShhZGRyZXNzLCBmcm9tQmxvY2ssIHRvQmxvY2spO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiAgUmV0dXJucyBvciByZXNvbHZlcyB0byBhIHRyYW5zYWN0aW9uIGZvciAlJXJlcXVlc3QlJSwgcmVzb2x2aW5nXG4gICAgICogIGFueSBFTlMgbmFtZXMgb3IgW1tBZGRyZXNzYWJsZV1dIGFuZCByZXR1cm5pbmcgaWYgYWxyZWFkeSBhIHZhbGlkXG4gICAgICogIHRyYW5zYWN0aW9uLlxuICAgICAqL1xuICAgIF9nZXRUcmFuc2FjdGlvblJlcXVlc3QoX3JlcXVlc3QpIHtcbiAgICAgICAgY29uc3QgcmVxdWVzdCA9IGNvcHlSZXF1ZXN0KF9yZXF1ZXN0KTtcbiAgICAgICAgY29uc3QgcHJvbWlzZXMgPSBbXTtcbiAgICAgICAgW1widG9cIiwgXCJmcm9tXCJdLmZvckVhY2goKGtleSkgPT4ge1xuICAgICAgICAgICAgaWYgKHJlcXVlc3Rba2V5XSA9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgYWRkciA9IHJlc29sdmVBZGRyZXNzKHJlcXVlc3Rba2V5XSwgdGh
26774pcyk7XG4gICAgICAgICAgICBpZiAoaXNQcm9taXNlKGFkZHIpKSB7XG4gICAgICAgICAgICAgICAgcHJvbWlzZXMucHVzaCgoYXN5bmMgZnVuY3Rpb24gKCkgeyByZXF1ZXN0W2tleV0gPSBhd2FpdCBhZGRyOyB9KSgpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHJlcXVlc3Rba2V5XSA9IGFkZHI7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICBpZiAocmVxdWVzdC5ibG9ja1RhZyAhPSBudWxsKSB7XG4gICAgICAgICAgICBjb25zdCBibG9ja1RhZyA9IHRoaXMuX2dldEJsb2NrVGFnKHJlcXVlc3QuYmxvY2tUYWcpO1xuICAgICAgICAgICAgaWYgKGlzUHJvbWlzZShibG9ja1RhZykpIHtcbiAgICAgICAgICAgICAgICBwcm9taXNlcy5wdXNoKChhc3luYyBmdW5jdGlvbiAoKSB7IHJlcXVlc3QuYmxvY2tUYWcgPSBhd2FpdCBibG9ja1RhZzsgfSkoKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXF1ZXN0LmJsb2NrVGFnID0gYmxvY2tUYWc7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHByb21pc2VzLmxlbmd0aCkge1xuICAgICAgICAgICAgcmV0dXJuIChhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgYXdhaXQgUHJvbWlzZS5hbGwocHJvbWlzZXMpO1xuICAgICAgICAgICAgICAgIHJldHVybiByZXF1ZXN0O1xuICAgICAgICAgICAgfSkoKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVxdWVzdDtcbiAgICB9XG4gICAgYXN5bmMgZ2V0TmV0d29yaygpIHtcbiAgICAgICAgLy8gTm8gZXhwbGljaXQgbmV0d29yayB3YXMgc2V0IGFuZCB0aGlzIGlzIG91ciBmaXJzdCB0aW1lXG4gICAgICAgIGlmICh0aGlzLiNuZXR3b3JrUHJvbWlzZSA9PSBudWxsKSB7XG4gICAgICAgICAgICAvLyBEZXRlY3QgdGhlIGN1cnJlbnQgbmV0d29yayAoc2hhcmVkIHdpdGggYWxsIGNhbGxzKVxuICAgICAgICAgICAgY29uc3QgZGV0ZWN0TmV0d29yayA9IChhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgbmV0d29yayA9IGF3YWl0IHRoaXMuX2RldGVjdE5ldHdvcmsoKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5lbWl0KFwibmV0d29ya1wiLCBuZXR3b3JrLCBudWxsKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldHdvcms7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy4jbmV0d29ya1Byb21pc2UgPT09IGRldGVjdE5ldHdvcmspIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuI25ldHdvcmtQcm9taXNlID0gbnVsbDtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KSgpO1xuICAgICAgICAgICAgdGhpcy4jbmV0d29ya1Byb21pc2UgPSBkZXRlY3ROZXR3b3JrO1xuICAgICAgICAgICAgcmV0dXJuIChhd2FpdCBkZXRlY3ROZXR3b3JrKS5jbG9uZSgpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IG5ldHdvcmtQcm9taXNlID0gdGhpcy4jbmV0d29ya1Byb21pc2U7XG4gICAgICAgIGNvbnN0IFtleHBlY3RlZCwgYWN0dWFsXSA9IGF3YWl0IFByb21pc2UuYWxsKFtcbiAgICAgICAgICAgIG5ldHdvcmtQcm9taXNlLFxuICAgICAgICAgICAgdGhpcy5fZGV0ZWN0TmV0d29yaygpIC8vIFRoZSBhY3R1YWwgY29ubmVjdGVkIG5ldHdvcmtcbiAgICAgICAgXSk7XG4gICAgICAgIGlmIChleHBlY3RlZC5jaGFpbklkICE9PSBhY3R1YWwuY2hhaW5JZCkge1xuICAgICAgICAgICAgaWYgKHRoaXMuI2FueU5ldHdvcmspIHtcbiAgICAgICAgICAgICAgICAvLyBUaGUgXCJhbnlcIiBuZXR3b3JrIGNhbiBjaGFuZ2UsIHNvIG5vdGlmeSBsaXN0ZW5lcnNcbiAgICAgICAgICAgICAgICB0aGlzLmVtaXQoXCJuZXR3b3JrXCIsIGFjdHVhbCwgZXhwZWN0ZWQpO1xuICAgICAgICAgICAgICAgIC8vIFVwZGF0ZSB0aGUgbmV0d29yayBpZiBzb21ldGhpbmcgZWxzZSBoYXNuJ3QgYWxyZWFkeSBjaGFuZ2VkIGl0XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuI25ldHdvcmtQcm9taXNlID09PSBuZXR3b3JrUHJvbWlzZSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLiNuZXR3b3JrUHJvbWlzZSA9IFByb21pc2UucmVzb2x2ZShhY3R1YWwpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIC8vIE90aGVyd2lzZSwgd2UgZG8gbm90IGFsbG93IGNoYW5nZXMgdG8gdGhlIHVuZGVybHlpbmcgbmV0d29ya1xuICAgICAgICAgICAgICAgIGFzc2VydChmYWxzZSwgYG5ldHdvcmsgY2hhbmdlZDogJHtleHBlY3RlZC5jaGFpbklkfSA9PiAke2FjdHVhbC5jaGFpbklkfSBgLCBcIk5FVFdPUktfRVJST1JcIiwge1xuICAgICAgICAgICAgICAgICAgICBldmVudDogXCJjaGFuZ2VkXCJcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZXhwZWN0ZWQuY2xvbmUoKTtcbiAgICB9XG4gICAgYXN5bmMgZ2V0RmVlRGF0YSgpIHtcbiAgICAgICAgY29uc3QgbmV0d29yayA9IGF3YWl0IHRoaXMuZ2V0TmV0d29yaygpO1xuICAgICAgICBjb25zdCBnZXRGZWVEYXRhRnVuYyA9IGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHsgX2Jsb2NrLCBnYXNQcmljZSwgcHJpb3JpdHlGZWUgfSA9IGF3YWl0IHJlc29sdmVQcm9wZXJ0aWVzKHtcbiAgICAgICAgICAgICAgICBfYmxvY2s6IHRoaXMuI2dldEJsb2NrKFwibGF0ZXN0XCIsIGZhbHNlKSxcbiAgICAgICAgICAgICAgICBnYXNQcmljZTogKChhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2YWx1ZSA9IGF3YWl0IHRoaXMuI3BlcmZvcm0oeyBtZXRob2Q6IFwiZ2V0R2FzUHJpY2VcIiB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgI
26774HJldHVybiBnZXRCaWdJbnQodmFsdWUsIFwiJXJlc3BvbnNlXCIpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGNhdGNoIChlcnJvcikgeyB9XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgICAgIH0pKCkpLFxuICAgICAgICAgICAgICAgIHByaW9yaXR5RmVlOiAoKGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gYXdhaXQgdGhpcy4jcGVyZm9ybSh7IG1ldGhvZDogXCJnZXRQcmlvcml0eUZlZVwiIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGdldEJpZ0ludCh2YWx1ZSwgXCIlcmVzcG9uc2VcIik7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgY2F0Y2ggKGVycm9yKSB7IH1cbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICAgICAgfSkoKSlcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgbGV0IG1heEZlZVBlckdhcyA9IG51bGw7XG4gICAgICAgICAgICBsZXQgbWF4UHJpb3JpdHlGZWVQZXJHYXMgPSBudWxsO1xuICAgICAgICAgICAgLy8gVGhlc2UgYXJlIHRoZSByZWNvbW1lbmRlZCBFSVAtMTU1OSBoZXVyaXN0aWNzIGZvciBmZWUgZGF0YVxuICAgICAgICAgICAgY29uc3QgYmxvY2sgPSB0aGlzLl93cmFwQmxvY2soX2Jsb2NrLCBuZXR3b3JrKTtcbiAgICAgICAgICAgIGlmIChibG9jayAmJiBibG9jay5iYXNlRmVlUGVyR2FzKSB7XG4gICAgICAgICAgICAgICAgbWF4UHJpb3JpdHlGZWVQZXJHYXMgPSAocHJpb3JpdHlGZWUgIT0gbnVsbCkgPyBwcmlvcml0eUZlZSA6IEJpZ0ludChcIjEwMDAwMDAwMDBcIik7XG4gICAgICAgICAgICAgICAgbWF4RmVlUGVyR2FzID0gKGJsb2NrLmJhc2VGZWVQZXJHYXMgKiBCTl8yKSArIG1heFByaW9yaXR5RmVlUGVyR2FzO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIG5ldyBGZWVEYXRhKGdhc1ByaWNlLCBtYXhGZWVQZXJHYXMsIG1heFByaW9yaXR5RmVlUGVyR2FzKTtcbiAgICAgICAgfTtcbiAgICAgICAgLy8gQ2hlY2sgZm9yIGEgRmVlRGF0YU5ldFdvcmtQbHVnaW5cbiAgICAgICAgY29uc3QgcGx1Z2luID0gbmV0d29yay5nZXRQbHVnaW4oXCJvcmcuZXRoZXJzLnBsdWdpbnMubmV0d29yay5GZXRjaFVybEZlZURhdGFQbHVnaW5cIik7XG4gICAgICAgIGlmIChwbHVnaW4pIHtcbiAgICAgICAgICAgIGNvbnN0IHJlcSA9IG5ldyBGZXRjaFJlcXVlc3QocGx1Z2luLnVybCk7XG4gICAgICAgICAgICBjb25zdCBmZWVEYXRhID0gYXdhaXQgcGx1Z2luLnByb2Nlc3NGdW5jKGdldEZlZURhdGFGdW5jLCB0aGlzLCByZXEpO1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBGZWVEYXRhKGZlZURhdGEuZ2FzUHJpY2UsIGZlZURhdGEubWF4RmVlUGVyR2FzLCBmZWVEYXRhLm1heFByaW9yaXR5RmVlUGVyR2FzKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYXdhaXQgZ2V0RmVlRGF0YUZ1bmMoKTtcbiAgICB9XG4gICAgYXN5bmMgZXN0aW1hdGVHYXMoX3R4KSB7XG4gICAgICAgIGxldCB0eCA9IHRoaXMuX2dldFRyYW5zYWN0aW9uUmVxdWVzdChfdHgpO1xuICAgICAgICBpZiAoaXNQcm9taXNlKHR4KSkge1xuICAgICAgICAgICAgdHggPSBhd2FpdCB0eDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZ2V0QmlnSW50KGF3YWl0IHRoaXMuI3BlcmZvcm0oe1xuICAgICAgICAgICAgbWV0aG9kOiBcImVzdGltYXRlR2FzXCIsIHRyYW5zYWN0aW9uOiB0eFxuICAgICAgICB9KSwgXCIlcmVzcG9uc2VcIik7XG4gICAgfVxuICAgIGFzeW5jICNjYWxsKHR4LCBibG9ja1RhZywgYXR0ZW1wdCkge1xuICAgICAgICBhc3NlcnQoYXR0ZW1wdCA8IE1BWF9DQ0lQX1JFRElSRUNUUywgXCJDQ0lQIHJlYWQgZXhjZWVkZWQgbWF4aW11bSByZWRpcmVjdGlvbnNcIiwgXCJPRkZDSEFJTl9GQVVMVFwiLCB7XG4gICAgICAgICAgICByZWFzb246IFwiVE9PX01BTllfUkVESVJFQ1RTXCIsXG4gICAgICAgICAgICB0cmFuc2FjdGlvbjogT2JqZWN0LmFzc2lnbih7fSwgdHgsIHsgYmxvY2tUYWcsIGVuYWJsZUNjaXBSZWFkOiB0cnVlIH0pXG4gICAgICAgIH0pO1xuICAgICAgICAvLyBUaGlzIGNhbWUgaW4gYXMgYSBQZXJmb3JtQWN0aW9uVHJhbnNhY3Rpb24sIHNvIHRvL2Zyb20gYXJlIHNhZmU7IHdlIGNhbiBjYXN0XG4gICAgICAgIGNvbnN0IHRyYW5zYWN0aW9uID0gY29weVJlcXVlc3QodHgpO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgY29uc3QgZGVsYXkgPSB0aGlzLiNnZXREZWxheSgpO1xuICAgICAgICAgICAgaWYgKGRlbGF5KSB7XG4gICAgICAgICAgICAgICAgYXdhaXQgc3RhbGwoZGVsYXkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGhleGxpZnkoYXdhaXQgdGhpcy5fcGVyZm9ybSh7IG1ldGhvZDogXCJjYWxsXCIsIHRyYW5zYWN0aW9uLCBibG9ja1RhZyB9KSk7XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICAvLyBDQ0lQIFJlYWQgT2ZmY2hhaW5Mb29rdXBcbiAgICAgICAgICAgIGlmICghdGhpcy5kaXNhYmxlQ2NpcFJlYWQgJiYgaXNDYWxsRXhjZXB0aW9uKGVycm9yKSAmJiBlcnJvci5kYXRhICYmIGF0dGVtcHQgPj0gMCAmJiBibG9ja1RhZyA9PT0gXCJsYXRlc3RcIiAmJiB0cmFuc2FjdGlvbi50byAhPSBudWxsICYmIGRhdGFTbGljZShlcnJvci5kYXRhLCAwLCA0KSA9PT0gXCIweDU1NmYxODMwXCIpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBkYXRhID0gZXJyb3IuZGF0YTtcbiAgICAgICAgICAgICAgICBjb25zdCB0eFNlbmRlciA9IGF3YWl0IHJlc29sdmVBZGRyZXNzKHRyYW5zYWN0aW9uLnRvLCB0aGlzKTtcbiAgICAgICAgICAgICAgICAvLyBQYXJzZSB0aGUgQ0NJUCBSZWFkIEFyZ3VtZW50c1xuICAgICAgICAgICAgICAgIGxldCBjY2lwQXJncztcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICBjY2lwQXJncyA9IHBhcnNlT2ZmY2hhaW5Mb29rdXAoZGF0YVNsaWNlKGVycm9yLmRhdGEsIDQpKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICAgICAgICAgIGFzc2VydChmYWxzZSwgZXJyb3IubWVzc2FnZSwgXCJPRkZDSEFJTl9GQVVMVFwiLCB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZWFzb246IFwiQkFEX0RBVEFcIiwgdHJhbnNhY3Rpb24sIGluZm86IHsgZGF0YSB9XG4gICAgICAgICAgICAgICAgICAgI
26774H0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAvLyBDaGVjayB0aGUgc2VuZGVyIG9mIHRoZSBPZmZjaGFpbkxvb2t1cCBtYXRjaGVzIHRoZSB0cmFuc2FjdGlvblxuICAgICAgICAgICAgICAgIGFzc2VydChjY2lwQXJncy5zZW5kZXIudG9Mb3dlckNhc2UoKSA9PT0gdHhTZW5kZXIudG9Mb3dlckNhc2UoKSwgXCJDQ0lQIFJlYWQgc2VuZGVyIG1pc21hdGNoXCIsIFwiQ0FMTF9FWENFUFRJT05cIiwge1xuICAgICAgICAgICAgICAgICAgICBhY3Rpb246IFwiY2FsbFwiLFxuICAgICAgICAgICAgICAgICAgICBkYXRhLFxuICAgICAgICAgICAgICAgICAgICByZWFzb246IFwiT2ZmY2hhaW5Mb29rdXBcIixcbiAgICAgICAgICAgICAgICAgICAgdHJhbnNhY3Rpb246IHRyYW5zYWN0aW9uLFxuICAgICAgICAgICAgICAgICAgICBpbnZvY2F0aW9uOiBudWxsLFxuICAgICAgICAgICAgICAgICAgICByZXZlcnQ6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHNpZ25hdHVyZTogXCJPZmZjaGFpbkxvb2t1cChhZGRyZXNzLHN0cmluZ1tdLGJ5dGVzLGJ5dGVzNCxieXRlcylcIixcbiAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiT2ZmY2hhaW5Mb29rdXBcIixcbiAgICAgICAgICAgICAgICAgICAgICAgIGFyZ3M6IGNjaXBBcmdzLmVycm9yQXJnc1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgY29uc3QgY2NpcFJlc3VsdCA9IGF3YWl0IHRoaXMuY2NpcFJlYWRGZXRjaCh0cmFuc2FjdGlvbiwgY2NpcEFyZ3MuY2FsbGRhdGEsIGNjaXBBcmdzLnVybHMpO1xuICAgICAgICAgICAgICAgIGFzc2VydChjY2lwUmVzdWx0ICE9IG51bGwsIFwiQ0NJUCBSZWFkIGZhaWxlZCB0byBmZXRjaCBkYXRhXCIsIFwiT0ZGQ0hBSU5fRkFVTFRcIiwge1xuICAgICAgICAgICAgICAgICAgICByZWFzb246IFwiRkVUQ0hfRkFJTEVEXCIsIHRyYW5zYWN0aW9uLCBpbmZvOiB7IGRhdGE6IGVycm9yLmRhdGEsIGVycm9yQXJnczogY2NpcEFyZ3MuZXJyb3JBcmdzIH1cbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICBjb25zdCB0eCA9IHtcbiAgICAgICAgICAgICAgICAgICAgdG86IHR4U2VuZGVyLFxuICAgICAgICAgICAgICAgICAgICBkYXRhOiBjb25jYXQoW2NjaXBBcmdzLnNlbGVjdG9yLCBlbmNvZGVCeXRlcyhbY2NpcFJlc3VsdCwgY2NpcEFyZ3MuZXh0cmFEYXRhXSldKVxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgdGhpcy5lbWl0KFwiZGVidWdcIiwgeyBhY3Rpb246IFwic2VuZENjaXBSZWFkQ2FsbFwiLCB0cmFuc2FjdGlvbjogdHggfSk7XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy4jY2FsbCh0eCwgYmxvY2tUYWcsIGF0dGVtcHQgKyAxKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5lbWl0KFwiZGVidWdcIiwgeyBhY3Rpb246IFwicmVjZWl2ZUNjaXBSZWFkQ2FsbFJlc3VsdFwiLCB0cmFuc2FjdGlvbjogT2JqZWN0LmFzc2lnbih7fSwgdHgpLCByZXN1bHQgfSk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmVtaXQoXCJkZWJ1Z1wiLCB7IGFjdGlvbjogXCJyZWNlaXZlQ2NpcFJlYWRDYWxsRXJyb3JcIiwgdHJhbnNhY3Rpb246IE9iamVjdC5hc3NpZ24oe30sIHR4KSwgZXJyb3IgfSk7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IGVycm9yO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRocm93IGVycm9yO1xuICAgICAgICB9XG4gICAgfVxuICAgIGFzeW5jICNjaGVja05ldHdvcmsocHJvbWlzZSkge1xuICAgICAgICBjb25zdCB7IHZhbHVlIH0gPSBhd2FpdCByZXNvbHZlUHJvcGVydGllcyh7XG4gICAgICAgICAgICBuZXR3b3JrOiB0aGlzLmdldE5ldHdvcmsoKSxcbiAgICAgICAgICAgIHZhbHVlOiBwcm9taXNlXG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgfVxuICAgIGFzeW5jIGNhbGwoX3R4KSB7XG4gICAgICAgIGNvbnN0IHsgdHgsIGJsb2NrVGFnIH0gPSBhd2FpdCByZXNvbHZlUHJvcGVydGllcyh7XG4gICAgICAgICAgICB0eDogdGhpcy5fZ2V0VHJhbnNhY3Rpb25SZXF1ZXN0KF90eCksXG4gICAgICAgICAgICBibG9ja1RhZzogdGhpcy5fZ2V0QmxvY2tUYWcoX3R4LmJsb2NrVGFnKVxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuI2NoZWNrTmV0d29yayh0aGlzLiNjYWxsKHR4LCBibG9ja1RhZywgX3R4LmVuYWJsZUNjaXBSZWFkID8gMCA6IC0xKSk7XG4gICAgfVxuICAgIC8vIEFjY291bnRcbiAgICBhc3luYyAjZ2V0QWNjb3VudFZhbHVlKHJlcXVlc3QsIF9hZGRyZXNzLCBfYmxvY2tUYWcpIHtcbiAgICAgICAgbGV0IGFkZHJlc3MgPSB0aGlzLl9nZXRBZGRyZXNzKF9hZGRyZXNzKTtcbiAgICAgICAgbGV0IGJsb2NrVGFnID0gdGhpcy5fZ2V0QmxvY2tUYWcoX2Jsb2NrVGFnKTtcbiAgICAgICAgaWYgKHR5cGVvZiAoYWRkcmVzcykgIT09IFwic3RyaW5nXCIgfHwgdHlwZW9mIChibG9ja1RhZykgIT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgICAgIFthZGRyZXNzLCBibG9ja1RhZ10gPSBhd2FpdCBQcm9taXNlLmFsbChbYWRkcmVzcywgYmxvY2tUYWddKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy4jY2hlY2tOZXR3b3JrKHRoaXMuI3BlcmZvcm0oT2JqZWN0LmFzc2lnbihyZXF1ZXN0LCB7IGFkZHJlc3MsIGJsb2NrVGFnIH0pKSk7XG4gICAgfVxuICAgIGFzeW5jIGdldEJhbGFuY2UoYWRkcmVzcywgYmxvY2tUYWcpIHtcbiAgICAgICAgcmV0dXJuIGdldEJpZ0ludChhd2FpdCB0aGlzLiNnZXRBY2NvdW50VmFsdWUoeyBtZXRob2Q6IFwiZ2V0QmFsYW5jZVwiIH0sIGFkZHJlc3MsIGJsb2NrVGFnKSwgXCIlcmVzcG9uc2VcIik7XG4gICAgfVxuICAgIGFzeW5jIGdldFRyYW5zYWN0aW9uQ291bnQoYWRkcmVzcywgYmxvY2tUYWcpIHtcbiAgICAgICAgcmV0dXJuIGdldE51bWJlcihhd2FpdCB0aGlzLiNnZXRBY2NvdW50VmFsdWUoeyBtZXRob2Q6IFwiZ2V0VHJhbnNhY3Rpb25Db3VudFwiIH0sIGFkZHJlc3MsIGJsb2NrVGFnKSwgXCIlcmVzcG9uc2VcIik7XG4gICAgfVxuICAgIGFzeW5jIGdldENvZGUoYWRkcmVzcywgYmxvY2tUYWcpIHtcbiAgICAgICAgcmV0dXJuIGhleGxpZnkoYXdhaXQgdGhpcy4jZ2V0QWNjb3VudFZhbHVlKHsgbWV0aG9kOiBcImdldENvZGVcIiB9LCBhZGRyZXNzLCBibG9ja1RhZykpO1xuICAgIH1cbiAgICBhc3luYyBnZXRTdG9yYWdlKGFkZHJlc3MsIF9wb3NpdGlvbiwgYmxvY2tUYWcpIHtcbiAgICAgICAgY29uc3QgcG9zaXRpb24gPSBnZXRCaWdJbnQoX3Bvc2l0aW9uLCBcInBvc2l0aW9uXCIpO1xuICAgICAgICByZXR1cm4gaGV4bGlmeShhd2FpdCB0aGlzLiNnZXRBY2NvdW50VmFsdWUoeyBtZXRob2Q6IFwiZ2V0U3RvcmFnZVwiLCBwb3NpdGlvbiB9LCBhZGRyZXNzLCBibG9ja1RhZykpO1xuICAgIH1cbiAgICAvLyBXcml0ZVxuICAgIGFzeW5jIGJyb2FkY2FzdFRyYW5zYWN0aW9uKHNpZ25lZFR4KSB7XG4gICAgICAgIGNvbnN0IHsgYmxvY2tOdW1iZXIsIGhhc2gsIG5ldHdvcmsgfSA9IGF3YWl0IHJlc29sdmVQcm9wZXJ0aWVzKHtcbiAgICAgICAgICAgIGJsb2NrTnVtYmVyOiB0aGlzLmdldEJsb2NrTnVtYmVyKCksXG4gICAgICAgICAgICBoYXNoOiB0aGlzLl9wZXJmb3JtKHtcbiAgICAgICAgICAgICAgICBtZXRob2Q6IFwiYnJvYWRjYXN0VHJhbnNhY3Rpb25cIixcbiAgICAgICAgICAgICAgICBzaWduZWRUcmFuc2FjdGlvbjogc2lnbmVkVHhcbiAgICAgICAgICAgI
26774H0pLFxuICAgICAgICAgICAgbmV0d29yazogdGhpcy5nZXROZXR3b3JrKClcbiAgICAgICAgfSk7XG4gICAgICAgIGNvbnN0IHR4ID0gVHJhbnNhY3Rpb24uZnJvbShzaWduZWRUeCk7XG4gICAgICAgIGlmICh0eC5oYXNoICE9PSBoYXNoKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJAVE9ETzogdGhlIHJldHVybmVkIGhhc2ggZGlkIG5vdCBtYXRjaFwiKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5fd3JhcFRyYW5zYWN0aW9uUmVzcG9uc2UodHgsIG5ldHdvcmspLnJlcGxhY2VhYmxlVHJhbnNhY3Rpb24oYmxvY2tOdW1iZXIpO1xuICAgIH1cbiAgICBhc3luYyAjZ2V0QmxvY2soYmxvY2ssIGluY2x1ZGVUcmFuc2FjdGlvbnMpIHtcbiAgICAgICAgLy8gQFRPRE86IEFkZCBDdXN0b21CbG9ja1BsdWdpbiBjaGVja1xuICAgICAgICBpZiAoaXNIZXhTdHJpbmcoYmxvY2ssIDMyKSkge1xuICAgICAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuI3BlcmZvcm0oe1xuICAgICAgICAgICAgICAgIG1ldGhvZDogXCJnZXRCbG9ja1wiLCBibG9ja0hhc2g6IGJsb2NrLCBpbmNsdWRlVHJhbnNhY3Rpb25zXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBsZXQgYmxvY2tUYWcgPSB0aGlzLl9nZXRCbG9ja1RhZyhibG9jayk7XG4gICAgICAgIGlmICh0eXBlb2YgKGJsb2NrVGFnKSAhPT0gXCJzdHJpbmdcIikge1xuICAgICAgICAgICAgYmxvY2tUYWcgPSBhd2FpdCBibG9ja1RhZztcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy4jcGVyZm9ybSh7XG4gICAgICAgICAgICBtZXRob2Q6IFwiZ2V0QmxvY2tcIiwgYmxvY2tUYWcsIGluY2x1ZGVUcmFuc2FjdGlvbnNcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIC8vIFF1ZXJpZXNcbiAgICBhc3luYyBnZXRCbG9jayhibG9jaywgcHJlZmV0Y2hUeHMpIHtcbiAgICAgICAgY29uc3QgeyBuZXR3b3JrLCBwYXJhbXMgfSA9IGF3YWl0IHJlc29sdmVQcm9wZXJ0aWVzKHtcbiAgICAgICAgICAgIG5ldHdvcms6IHRoaXMuZ2V0TmV0d29yaygpLFxuICAgICAgICAgICAgcGFyYW1zOiB0aGlzLiNnZXRCbG9jayhibG9jaywgISFwcmVmZXRjaFR4cylcbiAgICAgICAgfSk7XG4gICAgICAgIGlmIChwYXJhbXMgPT0gbnVsbCkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuX3dyYXBCbG9jayhwYXJhbXMsIG5ldHdvcmspO1xuICAgIH1cbiAgICBhc3luYyBnZXRUcmFuc2FjdGlvbihoYXNoKSB7XG4gICAgICAgIGNvbnN0IHsgbmV0d29yaywgcGFyYW1zIH0gPSBhd2FpdCByZXNvbHZlUHJvcGVydGllcyh7XG4gICAgICAgICAgICBuZXR3b3JrOiB0aGlzLmdldE5ldHdvcmsoKSxcbiAgICAgICAgICAgIHBhcmFtczogdGhpcy4jcGVyZm9ybSh7IG1ldGhvZDogXCJnZXRUcmFuc2FjdGlvblwiLCBoYXNoIH0pXG4gICAgICAgIH0pO1xuICAgICAgICBpZiAocGFyYW1zID09IG51bGwpIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLl93cmFwVHJhbnNhY3Rpb25SZXNwb25zZShwYXJhbXMsIG5ldHdvcmspO1xuICAgIH1cbiAgICBhc3luYyBnZXRUcmFuc2FjdGlvblJlY2VpcHQoaGFzaCkge1xuICAgICAgICBjb25zdCB7IG5ldHdvcmssIHBhcmFtcyB9ID0gYXdhaXQgcmVzb2x2ZVByb3BlcnRpZXMoe1xuICAgICAgICAgICAgbmV0d29yazogdGhpcy5nZXROZXR3b3JrKCksXG4gICAgICAgICAgICBwYXJhbXM6IHRoaXMuI3BlcmZvcm0oeyBtZXRob2Q6IFwiZ2V0VHJhbnNhY3Rpb25SZWNlaXB0XCIsIGhhc2ggfSlcbiAgICAgICAgfSk7XG4gICAgICAgIGlmIChwYXJhbXMgPT0gbnVsbCkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgLy8gU29tZSBiYWNrZW5kcyBkaWQgbm90IGJhY2tmaWxsIHRoZSBlZmZlY3RpdmVHYXNQcmljZSBpbnRvIG9sZCB0cmFuc2FjdGlvbnNcbiAgICAgICAgLy8gaW4gdGhlIHJlY2VpcHQsIHNvIHdlIGxvb2sgaXQgdXAgbWFudWFsbHkgYW5kIGluamVjdCBpdC5cbiAgICAgICAgaWYgKHBhcmFtcy5nYXNQcmljZSA9PSBudWxsICYmIHBhcmFtcy5lZmZlY3RpdmVHYXNQcmljZSA9PSBudWxsKSB7XG4gICAgICAgICAgICBjb25zdCB0eCA9IGF3YWl0IHRoaXMuI3BlcmZvcm0oeyBtZXRob2Q6IFwiZ2V0VHJhbnNhY3Rpb25cIiwgaGFzaCB9KTtcbiAgICAgICAgICAgIGlmICh0eCA9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwicmVwb3J0IHRoaXM7IGNvdWxkIG5vdCBmaW5kIHR4IG9yIGVmZmVjdGl2ZUdhc1ByaWNlXCIpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcGFyYW1zLmVmZmVjdGl2ZUdhc1ByaWNlID0gdHguZ2FzUHJpY2U7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuX3dyYXBUcmFuc2FjdGlvblJlY2VpcHQocGFyYW1zLCBuZXR3b3JrKTtcbiAgICB9XG4gICAgYXN5bmMgZ2V0VHJhbnNhY3Rpb25SZXN1bHQoaGFzaCkge1xuICAgICAgICBjb25zdCB7IHJlc3VsdCB9ID0gYXdhaXQgcmVzb2x2ZVByb3BlcnRpZXMoe1xuICAgICAgICAgICAgbmV0d29yazogdGhpcy5nZXROZXR3b3JrKCksXG4gICAgICAgICAgICByZXN1bHQ6IHRoaXMuI3BlcmZvcm0oeyBtZXRob2Q6IFwiZ2V0VHJhbnNhY3Rpb25SZXN1bHRcIiwgaGFzaCB9KVxuICAgICAgICB9KTtcbiAgICAgICAgaWYgKHJlc3VsdCA9PSBudWxsKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gaGV4bGlmeShyZXN1bHQpO1xuICAgIH1cbiAgICAvLyBCbG9vbS1maWx0ZXIgUXVlcmllc1xuICAgIGFzeW5jIGdldExvZ3MoX2ZpbHRlcikge1xuICAgICAgICBsZXQgZmlsdGVyID0gdGhpcy5fZ2V0RmlsdGVyKF9maWx0ZXIpO1xuICAgICAgICBpZiAoaXNQcm9taXNlKGZpbHRlcikpIHtcbiAgICAgICAgICAgIGZpbHRlciA9IGF3YWl0IGZpbHRlcjtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCB7IG5ldHdvcmssIHBhcmFtcyB9ID0gYXdhaXQgcmVzb2x2ZVByb3BlcnRpZXMoe1xuICAgICAgICAgICAgbmV0d29yazogdGhpcy5nZXROZXR3b3JrKCksXG4gICAgICAgICAgICBwYXJhbXM6IHRoaXMuI3BlcmZvcm0oeyBtZXRob2Q6IFwiZ2V0TG9nc1wiLCBmaWx0ZXIgfSlcbiAgICAgICAgfSk7XG4gICAgICAgI
26774HJldHVybiBwYXJhbXMubWFwKChwKSA9PiB0aGlzLl93cmFwTG9nKHAsIG5ldHdvcmspKTtcbiAgICB9XG4gICAgLy8gRU5TXG4gICAgX2dldFByb3ZpZGVyKGNoYWluSWQpIHtcbiAgICAgICAgYXNzZXJ0KGZhbHNlLCBcInByb3ZpZGVyIGNhbm5vdCBjb25uZWN0IHRvIHRhcmdldCBuZXR3b3JrXCIsIFwiVU5TVVBQT1JURURfT1BFUkFUSU9OXCIsIHtcbiAgICAgICAgICAgIG9wZXJhdGlvbjogXCJfZ2V0UHJvdmlkZXIoKVwiXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBhc3luYyBnZXRSZXNvbHZlcihuYW1lKSB7XG4gICAgICAgIHJldHVybiBhd2FpdCBFbnNSZXNvbHZlci5mcm9tTmFtZSh0aGlzLCBuYW1lKTtcbiAgICB9XG4gICAgYXN5bmMgZ2V0QXZhdGFyKG5hbWUpIHtcbiAgICAgICAgY29uc3QgcmVzb2x2ZXIgPSBhd2FpdCB0aGlzLmdldFJlc29sdmVyKG5hbWUpO1xuICAgICAgICBpZiAocmVzb2x2ZXIpIHtcbiAgICAgICAgICAgIHJldHVybiBhd2FpdCByZXNvbHZlci5nZXRBdmF0YXIoKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgYXN5bmMgcmVzb2x2ZU5hbWUobmFtZSwgY29pblR5cGUpIHtcbiAgICAgICAgY29uc3QgcmVzb2x2ZXIgPSBhd2FpdCB0aGlzLmdldFJlc29sdmVyKG5hbWUpO1xuICAgICAgICBpZiAocmVzb2x2ZXIpIHtcbiAgICAgICAgICAgIHJldHVybiBhd2FpdCByZXNvbHZlci5nZXRBZGRyZXNzKGNvaW5UeXBlKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgYXN5bmMgbG9va3VwQWRkcmVzcyhhZGRyZXNzLCBjb2luVHlwZSkge1xuICAgICAgICByZXR1cm4gYXdhaXQgRW5zUmVzb2x2ZXIubG9va3VwQWRkcmVzcyh0aGlzLCBhZGRyZXNzLCBjb2luVHlwZSk7XG4gICAgfVxuICAgIGFzeW5jIHdhaXRGb3JUcmFuc2FjdGlvbihoYXNoLCBfY29uZmlybXMsIHRpbWVvdXQpIHtcbiAgICAgICAgY29uc3QgY29uZmlybXMgPSAoX2NvbmZpcm1zICE9IG51bGwpID8gX2NvbmZpcm1zIDogMTtcbiAgICAgICAgaWYgKGNvbmZpcm1zID09PSAwKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5nZXRUcmFuc2FjdGlvblJlY2VpcHQoaGFzaCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKGFzeW5jIChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgICAgIGxldCB0aW1lciA9IG51bGw7XG4gICAgICAgICAgICBjb25zdCBsaXN0ZW5lciA9IChhc3luYyAoYmxvY2tOdW1iZXIpID0+IHtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCByZWNlaXB0ID0gYXdhaXQgdGhpcy5nZXRUcmFuc2FjdGlvblJlY2VpcHQoaGFzaCk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChyZWNlaXB0ICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChibG9ja051bWJlciAtIHJlY2VpcHQuYmxvY2tOdW1iZXIgKyAxID49IGNvbmZpcm1zKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZShyZWNlaXB0KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL3RoaXMub2ZmKFwiYmxvY2tcIiwgbGlzdGVuZXIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aW1lcikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGVhclRpbWVvdXQodGltZXIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aW1lciA9IG51bGw7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coXCJFRUVcIiwgZXJyb3IpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB0aGlzLm9uY2UoXCJibG9ja1wiLCBsaXN0ZW5lcik7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGlmICh0aW1lb3V0ICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICB0aW1lciA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAodGltZXIgPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHRpbWVyID0gbnVsbDtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5vZmYoXCJibG9ja1wiLCBsaXN0ZW5lcik7XG4gICAgICAgICAgICAgICAgICAgIHJlamVjdChtYWtlRXJyb3IoXCJ0aW1lb3V0XCIsIFwiVElNRU9VVFwiLCB7IHJlYXNvbjogXCJ0aW1lb3V0XCIgfSkpO1xuICAgICAgICAgICAgICAgIH0sIHRpbWVvdXQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbGlzdGVuZXIoYXdhaXQgdGhpcy5nZXRCbG9ja051bWJlcigpKTtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIGFzeW5jIHdhaXRGb3JCbG9jayhibG9ja1RhZykge1xuICAgICAgICBhc3NlcnQoZmFsc2UsIFwibm90IGltcGxlbWVudGVkIHlldFwiLCBcIk5PVF9JTVBMRU1FTlRFRFwiLCB7XG4gICAgICAgICAgICBvcGVyYXRpb246IFwid2FpdEZvckJsb2NrXCJcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqICBDbGVhciBhIHRpbWVyIGNyZWF0ZWQgdXNpbmcgdGhlIFtbX3NldFRpbWVvdXRdXSBtZXRob2QuXG4gICAgICovXG4gICAgX2NsZWFyVGltZW91dCh0aW1lcklkKSB7XG4gICAgICAgIGNvbnN0IHRpbWVyID0gdGhpcy4jdGltZXJzLmdldCh0aW1lcklkKTtcbiAgICAgICAgaWYgKCF0aW1lcikge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aW1lci50aW1lcikge1xuICAgICAgICAgICAgY2xlYXJUaW1lb3V0KHRpbWVyLnRpbWVyKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLiN0aW1lcnMuZGVsZXRlKHRpbWVySWQpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiAgQ3JlYXRlIGEgdGltZXIgdGhhdCB3aWxsIGV4ZWN1dGUgJSVmdW5jJSUgYWZ0ZXIgYXQgbGVhc3QgJSV0aW1lb3V0JSVcbiAgICAgKiAgKGluIG1zKS4gSWYgJSV0aW1lb3V0JSUgaXMgdW5zcGVjaWZpZWQsIHRoZW4gJSVmdW5jJSUgd2lsbCBleGVjdXRlXG4gICAgICogIGluIHRoZSBuZXh0IGV2ZW50IGxvb3AuXG4gICAgICpcbiAgICAgKiAgW1BhdXNpbmddKEFic3RyYWN0UHJvdmlkZXItcGF1c2VkKSB0aGUgcHJvdmlkZXIgd2lsbCBwYXVzZSBhbnlcbiAgICAgKiAgYXNzb2NpYXRlZCB0aW1lcnMuXG4gICAgICovXG4gICAgX3NldFRpbWVvdXQoX2Z1bmMsIHRpbWVvdXQpIHtcbiAgICAgICAgaWYgKHRpbWVvdXQgPT0gbnVsbCkge1xuICAgICAgICAgICAgdGltZW91dCA9IDA7XG4gICAgICAgI
26774H1cbiAgICAgICAgY29uc3QgdGltZXJJZCA9IHRoaXMuI25leHRUaW1lcisrO1xuICAgICAgICBjb25zdCBmdW5jID0gKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy4jdGltZXJzLmRlbGV0ZSh0aW1lcklkKTtcbiAgICAgICAgICAgIF9mdW5jKCk7XG4gICAgICAgIH07XG4gICAgICAgIGlmICh0aGlzLnBhdXNlZCkge1xuICAgICAgICAgICAgdGhpcy4jdGltZXJzLnNldCh0aW1lcklkLCB7IHRpbWVyOiBudWxsLCBmdW5jLCB0aW1lOiB0aW1lb3V0IH0pO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgY29uc3QgdGltZXIgPSBzZXRUaW1lb3V0KGZ1bmMsIHRpbWVvdXQpO1xuICAgICAgICAgICAgdGhpcy4jdGltZXJzLnNldCh0aW1lcklkLCB7IHRpbWVyLCBmdW5jLCB0aW1lOiBnZXRUaW1lKCkgfSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRpbWVySWQ7XG4gICAgfVxuICAgIC8qKlxuICAgICAqICBQZXJmb3JtICUlZnVuYyUlIG9uIGVhY2ggc3Vic2NyaWJlci5cbiAgICAgKi9cbiAgICBfZm9yRWFjaFN1YnNjcmliZXIoZnVuYykge1xuICAgICAgICBmb3IgKGNvbnN0IHN1YiBvZiB0aGlzLiNzdWJzLnZhbHVlcygpKSB7XG4gICAgICAgICAgICBmdW5jKHN1Yi5zdWJzY3JpYmVyKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiAgU3ViLWNsYXNzZXMgbWF5IG92ZXJyaWRlIHRoaXMgdG8gY3VzdG9taXplIHN1YnNjcmlwdGlvblxuICAgICAqICBpbXBsZW1lbnRhdGlvbnMuXG4gICAgICovXG4gICAgX2dldFN1YnNjcmliZXIoc3ViKSB7XG4gICAgICAgIHN3aXRjaCAoc3ViLnR5cGUpIHtcbiAgICAgICAgICAgIGNhc2UgXCJkZWJ1Z1wiOlxuICAgICAgICAgICAgY2FzZSBcImVycm9yXCI6XG4gICAgICAgICAgICBjYXNlIFwibmV0d29ya1wiOlxuICAgICAgICAgICAgICAgIHJldHVybiBuZXcgVW5tYW5hZ2VkU3Vic2NyaWJlcihzdWIudHlwZSk7XG4gICAgICAgICAgICBjYXNlIFwiYmxvY2tcIjoge1xuICAgICAgICAgICAgICAgIGNvbnN0IHN1YnNjcmliZXIgPSBuZXcgUG9sbGluZ0Jsb2NrU3Vic2NyaWJlcih0aGlzKTtcbiAgICAgICAgICAgICAgICBzdWJzY3JpYmVyLnBvbGxpbmdJbnRlcnZhbCA9IHRoaXMucG9sbGluZ0ludGVydmFsO1xuICAgICAgICAgICAgICAgIHJldHVybiBzdWJzY3JpYmVyO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2FzZSBcInNhZmVcIjpcbiAgICAgICAgICAgIGNhc2UgXCJmaW5hbGl6ZWRcIjpcbiAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFBvbGxpbmdCbG9ja1RhZ1N1YnNjcmliZXIodGhpcywgc3ViLnR5cGUpO1xuICAgICAgICAgICAgY2FzZSBcImV2ZW50XCI6XG4gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBQb2xsaW5nRXZlbnRTdWJzY3JpYmVyKHRoaXMsIHN1Yi5maWx0ZXIpO1xuICAgICAgICAgICAgY2FzZSBcInRyYW5zYWN0aW9uXCI6XG4gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBQb2xsaW5nVHJhbnNhY3Rpb25TdWJzY3JpYmVyKHRoaXMsIHN1Yi5oYXNoKTtcbiAgICAgICAgICAgIGNhc2UgXCJvcnBoYW5cIjpcbiAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFBvbGxpbmdPcnBoYW5TdWJzY3JpYmVyKHRoaXMsIHN1Yi5maWx0ZXIpO1xuICAgICAgICB9XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgdW5zdXBwb3J0ZWQgZXZlbnQ6ICR7c3ViLnR5cGV9YCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqICBJZiBhIFtbU3Vic2NyaWJlcl1dIGZhaWxzIGFuZCBuZWVkcyB0byByZXBsYWNlIGl0c2VsZiwgdGhpc1xuICAgICAqICBtZXRob2QgbWF5IGJlIHVzZWQuXG4gICAgICpcbiAgICAgKiAgRm9yIGV4YW1wbGUsIHRoaXMgaXMgdXNlZCBmb3IgcHJvdmlkZXJzIHdoZW4gdXNpbmcgdGhlXG4gICAgICogIGBgZXRoX2dldEZpbHRlckNoYW5nZXNgYCBtZXRob2QsIHdoaWNoIGNhbiByZXR1cm4gbnVsbCBpZiBzdGF0ZVxuICAgICAqICBmaWx0ZXJzIGFyZSBub3Qgc3VwcG9ydGVkIGJ5IHRoZSBiYWNrZW5kLCBhbGxvd2luZyB0aGUgU3Vic2NyaWJlclxuICAgICAqICB0byBzd2FwIGluIGEgW1tQb2xsaW5nRXZlbnRTdWJzY3JpYmVyXV0uXG4gICAgICovXG4gICAgX3JlY292ZXJTdWJzY3JpYmVyKG9sZFN1YiwgbmV3U3ViKSB7XG4gICAgICAgIGZvciAoY29uc3Qgc3ViIG9mIHRoaXMuI3N1YnMudmFsdWVzKCkpIHtcbiAgICAgICAgICAgIGlmIChzdWIuc3Vic2NyaWJlciA9PT0gb2xkU3ViKSB7XG4gICAgICAgICAgICAgICAgaWYgKHN1Yi5zdGFydGVkKSB7XG4gICAgICAgICAgICAgICAgICAgIHN1Yi5zdWJzY3JpYmVyLnN0b3AoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgc3ViLnN1YnNjcmliZXIgPSBuZXdTdWI7XG4gICAgICAgICAgICAgICAgaWYgKHN1Yi5zdGFydGVkKSB7XG4gICAgICAgICAgICAgICAgICAgIG5ld1N1Yi5zdGFydCgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAodGhpcy4jcGF1c2VkU3RhdGUgIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICBuZXdTdWIucGF1c2UodGhpcy4jcGF1c2VkU3RhdGUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICBhc3luYyAjaGFzU3ViKGV2ZW50LCBlbWl0QXJncykge1xuICAgICAgICBsZXQgc3ViID0gYXdhaXQgZ2V0U3Vic2NyaXB0aW9uKGV2ZW50LCB0aGlzKTtcbiAgICAgICAgLy8gVGhpcyBpcyBhIGxvZyB0aGF0IGlzIHJlbW92aW5nIGFuIGV4aXN0aW5nIGxvZzsgd2UgYWN0dWFsbHkgd2FudFxuICAgICAgICAvLyB0byBlbWl0IGFuIG9ycGhhbiBldmVudCBmb3IgdGhlIHJlbW92ZWQgbG9nXG4gICAgICAgIGlmIChzdWIudHlwZSA9PT0gXCJldmVudFwiICYmIGVtaXRBcmdzICYmIGVtaXRBcmdzLmxlbmd0aCA+IDAgJiYgZW1pdEFyZ3NbMF0ucmVtb3ZlZCA9PT0gdHJ1ZSkge1xuICAgICAgICAgICAgc3ViID0gYXdhaXQgZ2V0U3Vic2NyaXB0aW9uKHsgb3JwaGFuOiBcImRyb3AtbG9nXCIsIGxvZzogZW1pdEFyZ3NbMF0gfSwgdGhpcyk7XG4gICAgICAgI
26774H1cbiAgICAgICAgcmV0dXJuIHRoaXMuI3N1YnMuZ2V0KHN1Yi50YWcpIHx8IG51bGw7XG4gICAgfVxuICAgIGFzeW5jICNnZXRTdWIoZXZlbnQpIHtcbiAgICAgICAgY29uc3Qgc3Vic2NyaXB0aW9uID0gYXdhaXQgZ2V0U3Vic2NyaXB0aW9uKGV2ZW50LCB0aGlzKTtcbiAgICAgICAgLy8gUHJldmVudCB0YW1wZXJpbmcgd2l0aCBvdXIgdGFnIGluIGFueSBzdWJjbGFzcycgX2dldFN1YnNjcmliZXJcbiAgICAgICAgY29uc3QgdGFnID0gc3Vic2NyaXB0aW9uLnRhZztcbiAgICAgICAgbGV0IHN1YiA9IHRoaXMuI3N1YnMuZ2V0KHRhZyk7XG4gICAgICAgIGlmICghc3ViKSB7XG4gICAgICAgICAgICBjb25zdCBzdWJzY3JpYmVyID0gdGhpcy5fZ2V0U3Vic2NyaWJlcihzdWJzY3JpcHRpb24pO1xuICAgICAgICAgICAgY29uc3QgYWRkcmVzc2FibGVNYXAgPSBuZXcgV2Vha01hcCgpO1xuICAgICAgICAgICAgY29uc3QgbmFtZU1hcCA9IG5ldyBNYXAoKTtcbiAgICAgICAgICAgIHN1YiA9IHsgc3Vic2NyaWJlciwgdGFnLCBhZGRyZXNzYWJsZU1hcCwgbmFtZU1hcCwgc3RhcnRlZDogZmFsc2UsIGxpc3RlbmVyczogW10gfTtcbiAgICAgICAgICAgIHRoaXMuI3N1YnMuc2V0KHRhZywgc3ViKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gc3ViO1xuICAgIH1cbiAgICBhc3luYyBvbihldmVudCwgbGlzdGVuZXIpIHtcbiAgICAgICAgY29uc3Qgc3ViID0gYXdhaXQgdGhpcy4jZ2V0U3ViKGV2ZW50KTtcbiAgICAgICAgc3ViLmxpc3RlbmVycy5wdXNoKHsgbGlzdGVuZXIsIG9uY2U6IGZhbHNlIH0pO1xuICAgICAgICBpZiAoIXN1Yi5zdGFydGVkKSB7XG4gICAgICAgICAgICBzdWIuc3Vic2NyaWJlci5zdGFydCgpO1xuICAgICAgICAgICAgc3ViLnN0YXJ0ZWQgPSB0cnVlO1xuICAgICAgICAgICAgaWYgKHRoaXMuI3BhdXNlZFN0YXRlICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICBzdWIuc3Vic2NyaWJlci5wYXVzZSh0aGlzLiNwYXVzZWRTdGF0ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIGFzeW5jIG9uY2UoZXZlbnQsIGxpc3RlbmVyKSB7XG4gICAgICAgIGNvbnN0IHN1YiA9IGF3YWl0IHRoaXMuI2dldFN1YihldmVudCk7XG4gICAgICAgIHN1Yi5saXN0ZW5lcnMucHVzaCh7IGxpc3RlbmVyLCBvbmNlOiB0cnVlIH0pO1xuICAgICAgICBpZiAoIXN1Yi5zdGFydGVkKSB7XG4gICAgICAgICAgICBzdWIuc3Vic2NyaWJlci5zdGFydCgpO1xuICAgICAgICAgICAgc3ViLnN0YXJ0ZWQgPSB0cnVlO1xuICAgICAgICAgICAgaWYgKHRoaXMuI3BhdXNlZFN0YXRlICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICBzdWIuc3Vic2NyaWJlci5wYXVzZSh0aGlzLiNwYXVzZWRTdGF0ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIGFzeW5jIGVtaXQoZXZlbnQsIC4uLmFyZ3MpIHtcbiAgICAgICAgY29uc3Qgc3ViID0gYXdhaXQgdGhpcy4jaGFzU3ViKGV2ZW50LCBhcmdzKTtcbiAgICAgICAgLy8gSWYgdGhlcmUgaXMgbm90IHN1YnNjcmlwdGlvbiBvciBpZiBhIHJlY2VudCBlbWl0IHJlbW92ZWRcbiAgICAgICAgLy8gdGhlIGxhc3Qgb2YgdGhlbSAod2hpY2ggYWxzbyBkZWxldGVkIHRoZSBzdWIpIGRvIG5vdGhpbmdcbiAgICAgICAgaWYgKCFzdWIgfHwgc3ViLmxpc3RlbmVycy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICA7XG4gICAgICAgIGNvbnN0IGNvdW50ID0gc3ViLmxpc3RlbmVycy5sZW5ndGg7XG4gICAgICAgIHN1Yi5saXN0ZW5lcnMgPSBzdWIubGlzdGVuZXJzLmZpbHRlcigoeyBsaXN0ZW5lciwgb25jZSB9KSA9PiB7XG4gICAgICAgICAgICBjb25zdCBwYXlsb2FkID0gbmV3IEV2ZW50UGF5bG9hZCh0aGlzLCAob25jZSA/IG51bGwgOiBsaXN0ZW5lciksIGV2ZW50KTtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgbGlzdGVuZXIuY2FsbCh0aGlzLCAuLi5hcmdzLCBwYXlsb2FkKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhdGNoIChlcnJvcikgeyB9XG4gICAgICAgICAgICByZXR1cm4gIW9uY2U7XG4gICAgICAgIH0pO1xuICAgICAgICBpZiAoc3ViLmxpc3RlbmVycy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIGlmIChzdWIuc3RhcnRlZCkge1xuICAgICAgICAgICAgICAgIHN1Yi5zdWJzY3JpYmVyLnN0b3AoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuI3N1YnMuZGVsZXRlKHN1Yi50YWcpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiAoY291bnQgPiAwKTtcbiAgICB9XG4gICAgYXN5bmMgbGlzdGVuZXJDb3VudChldmVudCkge1xuICAgICAgICBpZiAoZXZlbnQpIHtcbiAgICAgICAgICAgIGNvbnN0IHN1YiA9IGF3YWl0IHRoaXMuI2hhc1N1YihldmVudCk7XG4gICAgICAgICAgICBpZiAoIXN1Yikge1xuICAgICAgICAgICAgICAgIHJldHVybiAwO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHN1Yi5saXN0ZW5lcnMubGVuZ3RoO1xuICAgICAgICB9XG4gICAgICAgIGxldCB0b3RhbCA9IDA7XG4gICAgICAgIGZvciAoY29uc3QgeyBsaXN0ZW5lcnMgfSBvZiB0aGlzLiNzdWJzLnZhbHVlcygpKSB7XG4gICAgICAgICAgICB0b3RhbCArPSBsaXN0ZW5lcnMubGVuZ3RoO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0b3RhbDtcbiAgICB9XG4gICAgYXN5bmMgbGlzdGVuZXJzKGV2ZW50KSB7XG4gICAgICAgIGlmIChldmVudCkge1xuICAgICAgICAgICAgY29uc3Qgc3ViID0gYXdhaXQgdGhpcy4jaGFzU3ViKGV2ZW50KTtcbiAgICAgICAgICAgIGlmICghc3ViKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFtdO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHN1Yi5saXN0ZW5lcnMubWFwKCh7IGxpc3RlbmVyIH0pID0+IGxpc3RlbmVyKTtcbiAgICAgICAgfVxuICAgICAgICBsZXQgcmVzdWx0ID0gW107XG4gICAgICAgIGZvciAoY29uc3QgeyBsaXN0ZW5lcnMgfSBvZiB0aGlzLiNzdWJzLnZhbHVlcygpKSB7XG4gICAgICAgICAgICByZXN1bHQgPSByZXN1bHQuY29uY2F0KGxpc3RlbmVycy5tYXAoKHsgbGlzdGVuZXIgfSkgPT4gbGlzdGVuZXIpKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbiAgICBhc3luYyBvZmYoZXZlbnQsIGxpc3RlbmVyKSB7XG4gICAgICAgIGNvbnN0IHN1YiA9IGF3YWl0IHRoaXMuI2hhc1N1YihldmVudCk7XG4gICAgICAgIGlmICghc3ViKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgICAgfVxuICAgICAgICBpZiAobGlzdGVuZXIpIHtcbiAgICAgICAgICAgIGNvbnN0IGluZGV4ID0gc3ViLmxpc3RlbmVycy5tYXAoKHsgbGlzdGVuZXIgfSkgPT4gbGlzdGVuZXIpLmluZGV4T2YobGlzdGVuZXIpO1xuICAgICAgICAgICAgaWYgKGluZGV4ID49IDApIHtcbiAgICAgICAgICAgICAgICBzdWIubGlzdGVuZXJzLnNwbGljZShpbmRleCwgMSk7XG4gICAgICAgICAgICB9XG4gICAgICAgI
26774H1cbiAgICAgICAgaWYgKCFsaXN0ZW5lciB8fCBzdWIubGlzdGVuZXJzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgaWYgKHN1Yi5zdGFydGVkKSB7XG4gICAgICAgICAgICAgICAgc3ViLnN1YnNjcmliZXIuc3RvcCgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy4jc3Vicy5kZWxldGUoc3ViLnRhZyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIGFzeW5jIHJlbW92ZUFsbExpc3RlbmVycyhldmVudCkge1xuICAgICAgICBpZiAoZXZlbnQpIHtcbiAgICAgICAgICAgIGNvbnN0IHsgdGFnLCBzdGFydGVkLCBzdWJzY3JpYmVyIH0gPSBhd2FpdCB0aGlzLiNnZXRTdWIoZXZlbnQpO1xuICAgICAgICAgICAgaWYgKHN0YXJ0ZWQpIHtcbiAgICAgICAgICAgICAgICBzdWJzY3JpYmVyLnN0b3AoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuI3N1YnMuZGVsZXRlKHRhZyk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IFt0YWcsIHsgc3RhcnRlZCwgc3Vic2NyaWJlciB9XSBvZiB0aGlzLiNzdWJzKSB7XG4gICAgICAgICAgICAgICAgaWYgKHN0YXJ0ZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgc3Vic2NyaWJlci5zdG9wKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHRoaXMuI3N1YnMuZGVsZXRlKHRhZyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIC8vIEFsaWFzIGZvciBcIm9uXCJcbiAgICBhc3luYyBhZGRMaXN0ZW5lcihldmVudCwgbGlzdGVuZXIpIHtcbiAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMub24oZXZlbnQsIGxpc3RlbmVyKTtcbiAgICB9XG4gICAgLy8gQWxpYXMgZm9yIFwib2ZmXCJcbiAgICBhc3luYyByZW1vdmVMaXN0ZW5lcihldmVudCwgbGlzdGVuZXIpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMub2ZmKGV2ZW50LCBsaXN0ZW5lcik7XG4gICAgfVxuICAgIC8qKlxuICAgICAqICBJZiB0aGlzIHByb3ZpZGVyIGhhcyBiZWVuIGRlc3Ryb3llZCB1c2luZyB0aGUgW1tkZXN0cm95XV0gbWV0aG9kLlxuICAgICAqXG4gICAgICogIE9uY2UgZGVzdHJveWVkLCBhbGwgcmVzb3VyY2VzIGFyZSByZWNsYWltZWQsIGludGVybmFsIGV2ZW50IGxvb3BzXG4gICAgICogIGFuZCB0aW1lcnMgYXJlIGNsZWFuZWQgdXAgYW5kIG5vIGZ1cnRoZXIgcmVxdWVzdHMgbWF5IGJlIHNlbnQgdG9cbiAgICAgKiAgdGhlIHByb3ZpZGVyLlxuICAgICAqL1xuICAgIGdldCBkZXN0cm95ZWQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLiNkZXN0cm95ZWQ7XG4gICAgfVxuICAgIC8qKlxuICAgICAqICBTdWItY2xhc3NlcyBtYXkgdXNlIHRoaXMgdG8gc2h1dGRvd24gYW55IHNvY2tldHMgb3IgcmVsZWFzZSB0aGVpclxuICAgICAqICByZXNvdXJjZXMgYW5kIHJlamVjdCBhbnkgcGVuZGluZyByZXF1ZXN0cy5cbiAgICAgKlxuICAgICAqICBTdWItY2xhc3NlcyAqKm11c3QqKiBjYWxsIGBgc3VwZXIuZGVzdHJveSgpYGAuXG4gICAgICovXG4gICAgZGVzdHJveSgpIHtcbiAgICAgICAgLy8gU3RvcCBhbGwgbGlzdGVuZXJzXG4gICAgICAgIHRoaXMucmVtb3ZlQWxsTGlzdGVuZXJzKCk7XG4gICAgICAgIC8vIFNodXQgZG93biBhbGwgdGllbXJzXG4gICAgICAgIGZvciAoY29uc3QgdGltZXJJZCBvZiB0aGlzLiN0aW1lcnMua2V5cygpKSB7XG4gICAgICAgICAgICB0aGlzLl9jbGVhclRpbWVvdXQodGltZXJJZCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy4jZGVzdHJveWVkID0gdHJ1ZTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogIFdoZXRoZXIgdGhlIHByb3ZpZGVyIGlzIGN1cnJlbnRseSBwYXVzZWQuXG4gICAgICpcbiAgICAgKiAgQSBwYXVzZWQgcHJvdmlkZXIgd2lsbCBub3QgZW1pdCBhbnkgZXZlbnRzLCBhbmQgZ2VuZXJhbGx5IHNob3VsZFxuICAgICAqICBub3QgbWFrZSBhbnkgcmVxdWVzdHMgdG8gdGhlIG5ldHdvcmssIGJ1dCB0aGF0IGlzIHVwIHRvIHN1Yi1jbGFzc2VzXG4gICAgICogIHRvIG1hbmFnZS5cbiAgICAgKlxuICAgICAqICBTZXR0aW5nIGBgcGF1c2VkID0gdHJ1ZWBgIGlzIGlkZW50aWNhbCB0byBjYWxsaW5nIGBgLnBhdXNlKGZhbHNlKWBgLFxuICAgICAqICB3aGljaCB3aWxsIGJ1ZmZlciBhbnkgZXZlbnRzIHRoYXQgb2NjdXIgd2hpbGUgcGF1c2VkIHVudGlsIHRoZVxuICAgICAqICBwcm92aWRlciBpcyB1bnBhdXNlZC5cbiAgICAgKi9cbiAgICBnZXQgcGF1c2VkKCkgeyByZXR1cm4gKHRoaXMuI3BhdXNlZFN0YXRlICE9IG51bGwpOyB9XG4gICAgc2V0IHBhdXNlZChwYXVzZSkge1xuICAgICAgICBpZiAoISFwYXVzZSA9PT0gdGhpcy5wYXVzZWQpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5wYXVzZWQpIHtcbiAgICAgICAgICAgIHRoaXMucmVzdW1lKCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0aGlzLnBhdXNlKGZhbHNlKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiAgUGF1c2UgdGhlIHByb3ZpZGVyLiBJZiAlJWRyb3BXaGlsZVBhdXNlZCUlLCBhbnkgZXZlbnRzIHRoYXQgb2NjdXJcbiAgICAgKiAgd2hpbGUgcGF1c2VkIGFyZSBkcm9wcGVkLCBvdGhlcndpc2UgYWxsIGV2ZW50cyB3aWxsIGJlIGVtaXR0ZWQgb25jZVxuICAgICAqICB0aGUgcHJvdmlkZXIgaXMgdW5wYXVzZWQuXG4gICAgICovXG4gICAgcGF1c2UoZHJvcFdoaWxlUGF1c2VkKSB7XG4gICAgICAgIHRoaXMuI2xhc3RCbG9ja051bWJlciA9IC0xO1xuICAgICAgICBpZiAodGhpcy4jcGF1c2VkU3RhdGUgIT0gbnVsbCkge1xuICAgICAgICAgICAgaWYgKHRoaXMuI3BhdXNlZFN0YXRlID09ICEhZHJvcFdoaWxlUGF1c2VkKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgYXNzZXJ0KGZhbHNlLCBcImNhbm5vdCBjaGFuZ2UgcGF1c2UgdHlwZTsgcmVzdW1lIGZpcnN0XCIsIFwiVU5TVVBQT1JURURfT1BFUkFUSU9OXCIsIHtcbiAgICAgICAgICAgICAgICBvcGVyYXRpb246IFwicGF1c2VcIlxuICAgICAgICAgICAgfSk7XG4gICAgICAgI
26774H1cbiAgICAgICAgdGhpcy5fZm9yRWFjaFN1YnNjcmliZXIoKHMpID0+IHMucGF1c2UoZHJvcFdoaWxlUGF1c2VkKSk7XG4gICAgICAgIHRoaXMuI3BhdXNlZFN0YXRlID0gISFkcm9wV2hpbGVQYXVzZWQ7XG4gICAgICAgIGZvciAoY29uc3QgdGltZXIgb2YgdGhpcy4jdGltZXJzLnZhbHVlcygpKSB7XG4gICAgICAgICAgICAvLyBDbGVhciB0aGUgdGltZXJcbiAgICAgICAgICAgIGlmICh0aW1lci50aW1lcikge1xuICAgICAgICAgICAgICAgIGNsZWFyVGltZW91dCh0aW1lci50aW1lcik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBSZW1haW5pbmcgdGltZSBuZWVkZWQgZm9yIHdoZW4gd2UgYmVjb21lIHVucGF1c2VkXG4gICAgICAgICAgICB0aW1lci50aW1lID0gZ2V0VGltZSgpIC0gdGltZXIudGltZTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiAgUmVzdW1lIHRoZSBwcm92aWRlci5cbiAgICAgKi9cbiAgICByZXN1bWUoKSB7XG4gICAgICAgIGlmICh0aGlzLiNwYXVzZWRTdGF0ZSA9PSBudWxsKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fZm9yRWFjaFN1YnNjcmliZXIoKHMpID0+IHMucmVzdW1lKCkpO1xuICAgICAgICB0aGlzLiNwYXVzZWRTdGF0ZSA9IG51bGw7XG4gICAgICAgIGZvciAoY29uc3QgdGltZXIgb2YgdGhpcy4jdGltZXJzLnZhbHVlcygpKSB7XG4gICAgICAgICAgICAvLyBSZW1haW5pbmcgdGltZSB3aGVuIHdlIHdlcmUgcGF1c2VkXG4gICAgICAgICAgICBsZXQgdGltZW91dCA9IHRpbWVyLnRpbWU7XG4gICAgICAgICAgICBpZiAodGltZW91dCA8IDApIHtcbiAgICAgICAgICAgICAgICB0aW1lb3V0ID0gMDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIFN0YXJ0IHRpbWUgKGluIGNhdXNlIHBhdXNlZCwgc28gd2UgY29uIGNvbXB1dGUgcmVtYWluaW5mIHRpbWUpXG4gICAgICAgICAgICB0aW1lci50aW1lID0gZ2V0VGltZSgpO1xuICAgICAgICAgICAgLy8gU3RhcnQgdGhlIHRpbWVyXG4gICAgICAgICAgICBzZXRUaW1lb3V0KHRpbWVyLmZ1bmMsIHRpbWVvdXQpO1xuICAgICAgICB9XG4gICAgfVxufVxuZnVuY3Rpb24gX3BhcnNlU3RyaW5nKHJlc3VsdCwgc3RhcnQpIHtcbiAgICB0cnkge1xuICAgICAgICBjb25zdCBieXRlcyA9IF9wYXJzZUJ5dGVzKHJlc3VsdCwgc3RhcnQpO1xuICAgICAgICBpZiAoYnl0ZXMpIHtcbiAgICAgICAgICAgIHJldHVybiB0b1V0ZjhTdHJpbmcoYnl0ZXMpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGNhdGNoIChlcnJvcikgeyB9XG4gICAgcmV0dXJuIG51bGw7XG59XG5mdW5jdGlvbiBfcGFyc2VCeXRlcyhyZXN1bHQsIHN0YXJ0KSB7XG4gICAgaWYgKHJlc3VsdCA9PT0gXCIweFwiKSB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICB0cnkge1xuICAgICAgICBjb25zdCBvZmZzZXQgPSBnZXROdW1iZXIoZGF0YVNsaWNlKHJlc3VsdCwgc3RhcnQsIHN0YXJ0ICsgMzIpKTtcbiAgICAgICAgY29uc3QgbGVuZ3RoID0gZ2V0TnVtYmVyKGRhdGFTbGljZShyZXN1bHQsIG9mZnNldCwgb2Zmc2V0ICsgMzIpKTtcbiAgICAgICAgcmV0dXJuIGRhdGFTbGljZShyZXN1bHQsIG9mZnNldCArIDMyLCBvZmZzZXQgKyAzMiArIGxlbmd0aCk7XG4gICAgfVxuICAgIGNhdGNoIChlcnJvcikgeyB9XG4gICAgcmV0dXJuIG51bGw7XG59XG5mdW5jdGlvbiBudW1QYWQodmFsdWUpIHtcbiAgICBjb25zdCByZXN1bHQgPSB0b0JlQXJyYXkodmFsdWUpO1xuICAgIGlmIChyZXN1bHQubGVuZ3RoID4gMzIpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiaW50ZXJuYWw7IHNob3VsZCBub3QgaGFwcGVuXCIpO1xuICAgIH1cbiAgICBjb25zdCBwYWRkZWQgPSBuZXcgVWludDhBcnJheSgzMik7XG4gICAgcGFkZGVkLnNldChyZXN1bHQsIDMyIC0gcmVzdWx0Lmxlbmd0aCk7XG4gICAgcmV0dXJuIHBhZGRlZDtcbn1cbmZ1bmN0aW9uIGJ5dGVzUGFkKHZhbHVlKSB7XG4gICAgaWYgKCh2YWx1ZS5sZW5ndGggJSAzMikgPT09IDApIHtcbiAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgIH1cbiAgICBjb25zdCByZXN1bHQgPSBuZXcgVWludDhBcnJheShNYXRoLmNlaWwodmFsdWUubGVuZ3RoIC8gMzIpICogMzIpO1xuICAgIHJlc3VsdC5zZXQodmFsdWUpO1xuICAgIHJldHVybiByZXN1bHQ7XG59XG5jb25zdCBlbXB0eSA9IG5ldyBVaW50OEFycmF5KFtdKTtcbi8vIEFCSSBFbmNvZGVzIGEgc2VyaWVzIG9mIChieXRlcywgYnl0ZXMsIC4uLilcbmZ1bmN0aW9uIGVuY29kZUJ5dGVzKGRhdGFzKSB7XG4gICAgY29uc3QgcmVzdWx0ID0gW107XG4gICAgbGV0IGJ5dGVDb3VudCA9IDA7XG4gICAgLy8gQWRkIHBsYWNlLWhvbGRlcnMgZm9yIHBvaW50ZXJzIGFzIHdlIGFkZCBpdGVtc1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZGF0YXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgcmVzdWx0LnB1c2goZW1wdHkpO1xuICAgICAgICBieXRlQ291bnQgKz0gMzI7XG4gICAgfVxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZGF0YXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgY29uc3QgZGF0YSA9IGdldEJ5dGVzKGRhdGFzW2ldKTtcbiAgICAgICAgLy8gVXBkYXRlIHRoZSBieXRlcyBvZmZzZXRcbiAgICAgICAgcmVzdWx0W2ldID0gbnVtUGFkKGJ5dGVDb3VudCk7XG4gICAgICAgIC8vIFRoZSBsZW5ndGggYW5kIHBhZGRlZCB2YWx1ZSBvZiBkYXRhXG4gICAgICAgIHJlc3VsdC5wdXNoKG51bVBhZChkYXRhLmxlbmd0aCkpO1xuICAgICAgICByZXN1bHQucHVzaChieXRlc1BhZChkYXRhKSk7XG4gICAgICAgIGJ5dGVDb3VudCArPSAzMiArIE1hdGguY2VpbChkYXRhLmxlbmd0aCAvIDMyKSAqIDMyO1xuICAgIH1cbiAgICByZXR1cm4gY29uY2F0KHJlc3VsdCk7XG59XG5jb25zdCB6ZXJvcyA9IFwiMHgwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwXCI7XG5mdW5jdGlvbiBwYXJzZU9mZmNoYWluTG9va3VwKGRhdGEpIHtcbiAgICBjb25zdCByZXN1bHQgPSB7XG4gICAgICAgIHNlbmRlcjogXCJcIiwgdXJsczogW10sIGNhbGxkYXRhOi
26774BcIlwiLCBzZWxlY3RvcjogXCJcIiwgZXh0cmFEYXRhOiBcIlwiLCBlcnJvckFyZ3M6IFtdXG4gICAgfTtcbiAgICBhc3NlcnQoZGF0YUxlbmd0aChkYXRhKSA+PSA1ICogMzIsIFwiaW5zdWZmaWNpZW50IE9mZmNoYWluTG9va3VwIGRhdGFcIiwgXCJPRkZDSEFJTl9GQVVMVFwiLCB7XG4gICAgICAgIHJlYXNvbjogXCJpbnN1ZmZpY2llbnQgT2ZmY2hhaW5Mb29rdXAgZGF0YVwiXG4gICAgfSk7XG4gICAgY29uc3Qgc2VuZGVyID0gZGF0YVNsaWNlKGRhdGEsIDAsIDMyKTtcbiAgICBhc3NlcnQoZGF0YVNsaWNlKHNlbmRlciwgMCwgMTIpID09PSBkYXRhU2xpY2UoemVyb3MsIDAsIDEyKSwgXCJjb3JydXB0IE9mZmNoYWluTG9va3VwIHNlbmRlclwiLCBcIk9GRkNIQUlOX0ZBVUxUXCIsIHtcbiAgICAgICAgcmVhc29uOiBcImNvcnJ1cHQgT2ZmY2hhaW5Mb29rdXAgc2VuZGVyXCJcbiAgICB9KTtcbiAgICByZXN1bHQuc2VuZGVyID0gZGF0YVNsaWNlKHNlbmRlciwgMTIpO1xuICAgIC8vIFJlYWQgdGhlIFVSTHMgZnJvbSB0aGUgcmVzcG9uc2VcbiAgICB0cnkge1xuICAgICAgICBjb25zdCB1cmxzID0gW107XG4gICAgICAgIGNvbnN0IHVybHNPZmZzZXQgPSBnZXROdW1iZXIoZGF0YVNsaWNlKGRhdGEsIDMyLCA2NCkpO1xuICAgICAgICBjb25zdCB1cmxzTGVuZ3RoID0gZ2V0TnVtYmVyKGRhdGFTbGljZShkYXRhLCB1cmxzT2Zmc2V0LCB1cmxzT2Zmc2V0ICsgMzIpKTtcbiAgICAgICAgY29uc3QgdXJsc0RhdGEgPSBkYXRhU2xpY2UoZGF0YSwgdXJsc09mZnNldCArIDMyKTtcbiAgICAgICAgZm9yIChsZXQgdSA9IDA7IHUgPCB1cmxzTGVuZ3RoOyB1KyspIHtcbiAgICAgICAgICAgIGNvbnN0IHVybCA9IF9wYXJzZVN0cmluZyh1cmxzRGF0YSwgdSAqIDMyKTtcbiAgICAgICAgICAgIGlmICh1cmwgPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcImFib3J0XCIpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdXJscy5wdXNoKHVybCk7XG4gICAgICAgIH1cbiAgICAgICAgcmVzdWx0LnVybHMgPSB1cmxzO1xuICAgIH1cbiAgICBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgYXNzZXJ0KGZhbHNlLCBcImNvcnJ1cHQgT2ZmY2hhaW5Mb29rdXAgdXJsc1wiLCBcIk9GRkNIQUlOX0ZBVUxUXCIsIHtcbiAgICAgICAgICAgIHJlYXNvbjogXCJjb3JydXB0IE9mZmNoYWluTG9va3VwIHVybHNcIlxuICAgICAgICB9KTtcbiAgICB9XG4gICAgLy8gR2V0IHRoZSBDQ0lQIGNhbGxkYXRhIHRvIGZvcndhcmRcbiAgICB0cnkge1xuICAgICAgICBjb25zdCBjYWxsZGF0YSA9IF9wYXJzZUJ5dGVzKGRhdGEsIDY0KTtcbiAgICAgICAgaWYgKGNhbGxkYXRhID09IG51bGwpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcImFib3J0XCIpO1xuICAgICAgICB9XG4gICAgICAgIHJlc3VsdC5jYWxsZGF0YSA9IGNhbGxkYXRhO1xuICAgIH1cbiAgICBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgYXNzZXJ0KGZhbHNlLCBcImNvcnJ1cHQgT2ZmY2hhaW5Mb29rdXAgY2FsbGRhdGFcIiwgXCJPRkZDSEFJTl9GQVVMVFwiLCB7XG4gICAgICAgICAgICByZWFzb246IFwiY29ycnVwdCBPZmZjaGFpbkxvb2t1cCBjYWxsZGF0YVwiXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICAvLyBHZXQgdGhlIGNhbGxiYWNrU2VsZWN0b3IgKGJ5dGVzNClcbiAgICBhc3NlcnQoZGF0YVNsaWNlKGRhdGEsIDEwMCwgMTI4KSA9PT0gZGF0YVNsaWNlKHplcm9zLCAwLCAyOCksIFwiY29ycnVwdCBPZmZjaGFpbkxvb2t1cCBjYWxsYmFhY2tTZWxlY3RvclwiLCBcIk9GRkNIQUlOX0ZBVUxUXCIsIHtcbiAgICAgICAgcmVhc29uOiBcImNvcnJ1cHQgT2ZmY2hhaW5Mb29rdXAgY2FsbGJhYWNrU2VsZWN0b3JcIlxuICAgIH0pO1xuICAgIHJlc3VsdC5zZWxlY3RvciA9IGRhdGFTbGljZShkYXRhLCA5NiwgMTAwKTtcbiAgICAvLyBHZXQgdGhlIGV4dHJhIGRhdGEgdG8gc2VuZCBiYWNrIHRvIHRoZSBjb250cmFjdCBhcyBjb250ZXh0XG4gICAgdHJ5IHtcbiAgICAgICAgY29uc3QgZXh0cmFEYXRhID0gX3BhcnNlQnl0ZXMoZGF0YSwgMTI4KTtcbiAgICAgICAgaWYgKGV4dHJhRGF0YSA9PSBudWxsKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJhYm9ydFwiKTtcbiAgICAgICAgfVxuICAgICAgICByZXN1bHQuZXh0cmFEYXRhID0gZXh0cmFEYXRhO1xuICAgIH1cbiAgICBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgYXNzZXJ0KGZhbHNlLCBcImNvcnJ1cHQgT2ZmY2hhaW5Mb29rdXAgZXh0cmFEYXRhXCIsIFwiT0ZGQ0hBSU5fRkFVTFRcIiwge1xuICAgICAgICAgICAgcmVhc29uOiBcImNvcnJ1cHQgT2ZmY2hhaW5Mb29rdXAgZXh0cmFEYXRhXCJcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHJlc3VsdC5lcnJvckFyZ3MgPSBcInNlbmRlcix1cmxzLGNhbGxkYXRhLHNlbGVjdG9yLGV4dHJhRGF0YVwiLnNwbGl0KC8sLykubWFwKChrKSA9PiByZXN1bHRba10pO1xuICAgIHJldHVybiByZXN1bHQ7XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1hYnN0cmFjdC1wcm92aWRlci5qcy5tYXAiLCIvKipcbiAqICBHZW5lcmFsbHkgdGhlIFtbV2FsbGV0XV0gYW5kIFtbSnNvblJwY1NpZ25lcl1dIGFuZCB0aGVpciBzdWItY2xhc3Nlc1xuICogIGFyZSBzdWZmaWNpZW50IGZvciBtb3N0IGRldmVsb3BlcnMsIGJ1dCB0aGlzIGlzIHByb3ZpZGVkIHRvXG4gKiAgZmFzY2lsaXRhdGUgbW9yZSBjb21wbGV4IFNpZ25lcnMuXG4gKlxuICogIEBfc2VjdGlvbjogYXBpL3Byb3ZpZGVycy9hYnN0cmFjdC1zaWduZXI6IFN1YmNsYXNzaW5nIFNpZ25lciBbYWJzdHJhY3Qtc2lnbmVyXVxuICovXG5pbXBvcnQgeyByZXNvbHZlQWRkcmVzcyB9IGZyb20gXCIuLi9hZGRyZXNzL2luZGV4LmpzXCI7XG5pbXBvcnQgeyBUcmFuc2FjdGlvbiB9IGZyb20gXCIuLi90cmFuc2FjdGlvbi9pbmRleC5qc1wiO1xuaW1wb3J0IHsgZGVmaW5lUHJvcGVydGllcywgZ2V0QmlnSW50LCByZXNvbHZlUHJvcGVydGllcywgYXNzZXJ0LCBhc3NlcnRBcmd1bWVudCB9IGZyb20gXCIuLi91dGlscy9pbmRleC5qc1wiO1xuaW1wb3J0IHsgY29weVJlcXVlc3QgfSBmcm9tIFwiLi9wcm92aWRlci5qc1wiO1xuZnVuY3Rpb24gY2hlY2tQcm92aWRlcihzaWduZXIsIG9wZXJhdGlvbikge1xuICAgIGlmIChzaWduZXIucHJvdmlkZXIpIHtcbiAgICAgICAgcmV0dXJuIHNpZ25lci5wcm92aWRlcjtcbiAgICB9XG4gICAgYXNzZXJ0KGZhbHNlLCBcIm1pc3NpbmcgcHJvdmlkZXJcIiwgXCJVTlNVUFBPUlRFRF9PUEVSQVRJT05cIiwgeyBvcGVyYXRpb24gfSk7XG59XG5hc3luYyBmdW5jdGlvbiBwb3B1bGF0ZShzaWduZXIsIHR4KSB7XG4gICAgbGV0IHBvcCA9IGNvcHlSZXF1ZXN0KHR4KTtcbiAgICBpZiAocG9wLnRvICE9IG51bGwpIHtcbiAgICAgICAgcG9wLnRvID0gcmVzb2x2ZUFkZHJl
26774c3MocG9wLnRvLCBzaWduZXIpO1xuICAgIH1cbiAgICBpZiAocG9wLmZyb20gIT0gbnVsbCkge1xuICAgICAgICBjb25zdCBmcm9tID0gcG9wLmZyb207XG4gICAgICAgIHBvcC5mcm9tID0gUHJvbWlzZS5hbGwoW1xuICAgICAgICAgICAgc2lnbmVyLmdldEFkZHJlc3MoKSxcbiAgICAgICAgICAgIHJlc29sdmVBZGRyZXNzKGZyb20sIHNpZ25lcilcbiAgICAgICAgXSkudGhlbigoW2FkZHJlc3MsIGZyb21dKSA9PiB7XG4gICAgICAgICAgICBhc3NlcnRBcmd1bWVudChhZGRyZXNzLnRvTG93ZXJDYXNlKCkgPT09IGZyb20udG9Mb3dlckNhc2UoKSwgXCJ0cmFuc2FjdGlvbiBmcm9tIG1pc21hdGNoXCIsIFwidHguZnJvbVwiLCBmcm9tKTtcbiAgICAgICAgICAgIHJldHVybiBhZGRyZXNzO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIHBvcC5mcm9tID0gc2lnbmVyLmdldEFkZHJlc3MoKTtcbiAgICB9XG4gICAgcmV0dXJuIGF3YWl0IHJlc29sdmVQcm9wZXJ0aWVzKHBvcCk7XG59XG4vKipcbiAqICBBbiAqKkFic3RyYWN0U2lnbmVyKiogaW5jbHVkZXMgbW9zdCBvZiB0ZWggZnVuY3Rpb25hbGl0eSByZXF1aXJlZFxuICogIHRvIGdldCBhIFtbU2lnbmVyXV0gd29ya2luZyBhcyBleHBlY3RlZCwgYnV0IHJlcXVpcmVzIGEgZmV3XG4gKiAgU2lnbmVyLXNwZWNpZmljIG1ldGhvZHMgYmUgb3ZlcnJpZGRlbi5cbiAqXG4gKi9cbmV4cG9ydCBjbGFzcyBBYnN0cmFjdFNpZ25lciB7XG4gICAgLyoqXG4gICAgICogIFRoZSBwcm92aWRlciB0aGlzIHNpZ25lciBpcyBjb25uZWN0ZWQgdG8uXG4gICAgICovXG4gICAgcHJvdmlkZXI7XG4gICAgLyoqXG4gICAgICogIENyZWF0ZXMgYSBuZXcgU2lnbmVyIGNvbm5lY3RlZCB0byAlJXByb3ZpZGVyJSUuXG4gICAgICovXG4gICAgY29uc3RydWN0b3IocHJvdmlkZXIpIHtcbiAgICAgICAgZGVmaW5lUHJvcGVydGllcyh0aGlzLCB7IHByb3ZpZGVyOiAocHJvdmlkZXIgfHwgbnVsbCkgfSk7XG4gICAgfVxuICAgIGFzeW5jIGdldE5vbmNlKGJsb2NrVGFnKSB7XG4gICAgICAgIHJldHVybiBjaGVja1Byb3ZpZGVyKHRoaXMsIFwiZ2V0VHJhbnNhY3Rpb25Db3VudFwiKS5nZXRUcmFuc2FjdGlvbkNvdW50KGF3YWl0IHRoaXMuZ2V0QWRkcmVzcygpLCBibG9ja1RhZyk7XG4gICAgfVxuICAgIGFzeW5jIHBvcHVsYXRlQ2FsbCh0eCkge1xuICAgICAgICBjb25zdCBwb3AgPSBhd2FpdCBwb3B1bGF0ZSh0aGlzLCB0eCk7XG4gICAgICAgIHJldHVybiBwb3A7XG4gICAgfVxuICAgIGFzeW5jIHBvcHVsYXRlVHJhbnNhY3Rpb24odHgpIHtcbiAgICAgICAgY29uc3QgcHJvdmlkZXIgPSBjaGVja1Byb3ZpZGVyKHRoaXMsIFwicG9wdWxhdGVUcmFuc2FjdGlvblwiKTtcbiAgICAgICAgY29uc3QgcG9wID0gYXdhaXQgcG9wdWxhdGUodGhpcywgdHgpO1xuICAgICAgICBpZiAocG9wLm5vbmNlID09IG51bGwpIHtcbiAgICAgICAgICAgIHBvcC5ub25jZSA9IGF3YWl0IHRoaXMuZ2V0Tm9uY2UoXCJwZW5kaW5nXCIpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChwb3AuZ2FzTGltaXQgPT0gbnVsbCkge1xuICAgICAgICAgICAgcG9wLmdhc0xpbWl0ID0gYXdhaXQgdGhpcy5lc3RpbWF0ZUdhcyhwb3ApO1xuICAgICAgICB9XG4gICAgICAgIC8vIFBvcHVsYXRlIHRoZSBjaGFpbiBJRFxuICAgICAgICBjb25zdCBuZXR3b3JrID0gYXdhaXQgKHRoaXMucHJvdmlkZXIpLmdldE5ldHdvcmsoKTtcbiAgICAgICAgaWYgKHBvcC5jaGFpbklkICE9IG51bGwpIHtcbiAgICAgICAgICAgIGNvbnN0IGNoYWluSWQgPSBnZXRCaWdJbnQocG9wLmNoYWluSWQpO1xuICAgICAgICAgICAgYXNzZXJ0QXJndW1lbnQoY2hhaW5JZCA9PT0gbmV0d29yay5jaGFpbklkLCBcInRyYW5zYWN0aW9uIGNoYWluSWQgbWlzbWF0Y2hcIiwgXCJ0eC5jaGFpbklkXCIsIHR4LmNoYWluSWQpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgcG9wLmNoYWluSWQgPSBuZXR3b3JrLmNoYWluSWQ7XG4gICAgICAgIH1cbiAgICAgICAgLy8gRG8gbm90IGFsbG93IG1peGluZyBwcmUtZWlwLTE1NTkgYW5kIGVpcC0xNTU5IHByb3BlcnRpZXNcbiAgICAgICAgY29uc3QgaGFzRWlwMTU1OSA9IChwb3AubWF4RmVlUGVyR2FzICE9IG51bGwgfHwgcG9wLm1heFByaW9yaXR5RmVlUGVyR2FzICE9IG51bGwpO1xuICAgICAgICBpZiAocG9wLmdhc1ByaWNlICE9IG51bGwgJiYgKHBvcC50eXBlID09PSAyIHx8IGhhc0VpcDE1NTkpKSB7XG4gICAgICAgICAgICBhc3NlcnRBcmd1bWVudChmYWxzZSwgXCJlaXAtMTU1OSB0cmFuc2FjdGlvbiBkbyBub3Qgc3VwcG9ydCBnYXNQcmljZVwiLCBcInR4XCIsIHR4KTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmICgocG9wLnR5cGUgPT09IDAgfHwgcG9wLnR5cGUgPT09IDEpICYmIGhhc0VpcDE1NTkpIHtcbiAgICAgICAgICAgIGFzc2VydEFyZ3VtZW50KGZhbHNlLCBcInByZS1laXAtMTU1OSB0cmFuc2FjdGlvbiBkbyBub3Qgc3VwcG9ydCBtYXhGZWVQZXJHYXMvbWF4UHJpb3JpdHlGZWVQZXJHYXNcIiwgXCJ0eFwiLCB0eCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKChwb3AudHlwZSA9PT0gMiB8fCBwb3AudHlwZSA9PSBudWxsKSAmJiAocG9wLm1heEZlZVBlckdhcyAhPSBudWxsICYmIHBvcC5tYXhQcmlvcml0eUZlZVBlckdhcyAhPSBudWxsKSkge1xuICAgICAgICAgICAgLy8gRnVsbHktZm9ybWVkIEVJUC0xNTU5IHRyYW5zYWN0aW9uIChza2lwIGdldEZlZURhdGEpXG4gICAgICAgICAgICBwb3AudHlwZSA9IDI7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAocG9wLnR5cGUgPT09IDAgfHwgcG9wLnR5cGUgPT09IDEpIHtcbiAgICAgICAgICAgIC8vIEV4cGxpY2l0IExlZ2FjeSBvciBFSVAtMjkzMCB0cmFuc2FjdGlvblxuICAgICAgICAgICAgLy8gV2UgbmVlZCB0byBnZXQgZmVlIGRhdGEgdG8gZGV0ZXJtaW5lIHRoaW5nc1xuICAgICAgICAgICAgY29uc3QgZmVlRGF0YSA9IGF3YWl0IHByb3ZpZGVyLmdldEZlZURhdGEoKTtcbiAgICAgICAgICAgIGFzc2VydChmZWVEYXRhLmdhc1ByaWNlICE9IG51bGwsIFwibmV0d29yayBkb2VzIG5vdCBzdXBwb3J0IGdhc1ByaWNlXCIsIFwiVU5TVVBQT1JURURfT1BFUkFUSU9OXCIsIHtcbiAgICAgICAgICAgICAgICBvcGVyYXRpb246IFwiZ2V0R2FzUHJpY2VcIlxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAvLyBQb3B1bGF0ZSBtaXNzaW5nIGdhc1ByaWNlXG4gICAgICAgICAgICBpZiAocG9wLmdhc1ByaWNlID09IG51bGwpIHtcbiAgICAgICAgICAgICAgICBwb3AuZ2FzUHJpY2UgPSBmZWVEYXRhLmdhc1ByaWNlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgLy8gV2UgbmVlZCB0byBnZXQgZmVlIGRhdGEgdG8gZGV0ZXJtaW5lIHRoaW5nc1xuICAgICAgICAgICAgY29uc3QgZmVlRGF0YSA9IGF3YWl0IHByb3ZpZGVyLmdldEZlZURhdGEoKTtcbiAgICAgICAgICAgIGlmIChwb3AudHlwZSA9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgLy8gV2UgbmVlZCB0byBhdXRvLWRldGVjdCB0aGUgaW50ZW5kZWQgdHlwZSBvZiB0aGlzIHRyYW5zYWN0aW9uLi4uXG4gICAgICAgICAgICAgICAgaWYgKGZlZURhdGEubWF4RmVlUGVyR2FzICE9IG51bGwgJiYgZmVlRGF0YS5tYXhQcmlvcml0eUZlZVBlckdhcyAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIFRoZSBuZXR3b3JrIHN1cHBvcnRzIEVJUC0xNTU5IVxuICAgICAgICAgICAgICAgICAgICAvLyBVcGdyYWRlIHRyYW5zYWN0aW9uIGZyb20gbnVsbCB0byBlaXAtMTU1OVxuICAgICAgICAgICAgICAgICAgICBpZiAocG9wLmF1dGhvcml6YXRpb25MaXN0ICYmIHBvcC5hdXRob3JpemF0aW9uTGlzdC5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgI
26774HBvcC50eXBlID0gNDtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHBvcC50eXBlID0gMjtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBpZiAocG9wLmdhc1ByaWNlICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFVzaW5nIGxlZ2FjeSBnYXNQcmljZSBwcm9wZXJ0eSBvbiBhbiBlaXAtMTU1OSBuZXR3b3JrLFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gc28gdXNlIGdhc1ByaWNlIGFzIGJvdGggZmVlIHByb3BlcnRpZXNcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGdhc1ByaWNlID0gcG9wLmdhc1ByaWNlO1xuICAgICAgICAgICAgICAgICAgICAgICAgZGVsZXRlIHBvcC5nYXNQcmljZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHBvcC5tYXhGZWVQZXJHYXMgPSBnYXNQcmljZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHBvcC5tYXhQcmlvcml0eUZlZVBlckdhcyA9IGdhc1ByaWNlO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gUG9wdWxhdGUgbWlzc2luZyBmZWUgZGF0YVxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBvcC5tYXhGZWVQZXJHYXMgPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvcC5tYXhGZWVQZXJHYXMgPSBmZWVEYXRhLm1heEZlZVBlckdhcztcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwb3AubWF4UHJpb3JpdHlGZWVQZXJHYXMgPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvcC5tYXhQcmlvcml0eUZlZVBlckdhcyA9IGZlZURhdGEubWF4UHJpb3JpdHlGZWVQZXJHYXM7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSBpZiAoZmVlRGF0YS5nYXNQcmljZSAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIE5ldHdvcmsgZG9lc24ndCBzdXBwb3J0IEVJUC0xNTU5Li4uXG4gICAgICAgICAgICAgICAgICAgIC8vIC4uLmJ1dCB0aGV5IGFyZSB0cnlpbmcgdG8gdXNlIEVJUC0xNTU5IHByb3BlcnRpZXNcbiAgICAgICAgICAgICAgICAgICAgYXNzZXJ0KCFoYXNFaXAxNTU5LCBcIm5ldHdvcmsgZG9lcyBub3Qgc3VwcG9ydCBFSVAtMTU1OVwiLCBcIlVOU1VQUE9SVEVEX09QRVJBVElPTlwiLCB7XG4gICAgICAgICAgICAgICAgICAgICAgICBvcGVyYXRpb246IFwicG9wdWxhdGVUcmFuc2FjdGlvblwiXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAvLyBQb3B1bGF0ZSBtaXNzaW5nIGZlZSBkYXRhXG4gICAgICAgICAgICAgICAgICAgIGlmIChwb3AuZ2FzUHJpY2UgPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcG9wLmdhc1ByaWNlID0gZmVlRGF0YS5nYXNQcmljZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAvLyBFeHBsaWNpdGx5IHNldCB1bnR5cGVkIHRyYW5zYWN0aW9uIHRvIGxlZ2FjeVxuICAgICAgICAgICAgICAgICAgICAvLyBAVE9ETzogTWF5YmUgdGhpcyBzaG9sZCBhbGxvdyB0eXBlIDE/XG4gICAgICAgICAgICAgICAgICAgIHBvcC50eXBlID0gMDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIGdldEZlZURhdGEgaGFzIGZhaWxlZCB1cy5cbiAgICAgICAgICAgICAgICAgICAgYXNzZXJ0KGZhbHNlLCBcImZhaWxlZCB0byBnZXQgY29uc2lzdGVudCBmZWUgZGF0YVwiLCBcIlVOU1VQUE9SVEVEX09QRVJBVElPTlwiLCB7XG4gICAgICAgICAgICAgICAgICAgICAgICBvcGVyYXRpb246IFwic2lnbmVyLmdldEZlZURhdGFcIlxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChwb3AudHlwZSA9PT0gMiB8fCBwb3AudHlwZSA9PT0gMyB8fCBwb3AudHlwZSA9PT0gNCkge1xuICAgICAgICAgICAgICAgIC8vIEV4cGxpY2l0bHkgdXNpbmcgRUlQLTE1NTkgb3IgRUlQLTQ4NDRcbiAgICAgICAgICAgICAgICAvLyBQb3B1bGF0ZSBtaXNzaW5nIGZlZSBkYXRhXG4gICAgICAgICAgICAgICAgaWYgKHBvcC5tYXhGZWVQZXJHYXMgPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICBwb3AubWF4RmVlUGVyR2FzID0gZmVlRGF0YS5tYXhGZWVQZXJHYXM7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChwb3AubWF4UHJpb3JpdHlGZWVQZXJHYXMgPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICBwb3AubWF4UHJpb3JpdHlGZWVQZXJHYXMgPSBmZWVEYXRhLm1heFByaW9yaXR5RmVlUGVyR2FzO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAvL0BUT09EOiBEb24ndCBhd2FpdCBhbGwgb3ZlciB0aGUgcGxhY2U7IHNhdmUgdGhlbSB1cCBmb3JcbiAgICAgICAgLy8gdGhlIGVuZCBmb3IgYmV0dGVyIGJhdGNoaW5nXG4gICAgICAgIHJldHVybiBhd2FpdCByZXNvbHZlUHJvcGVydGllcyhwb3ApO1xuICAgIH1cbiAgICBhc3luYyBwb3B1bGF0ZUF1dGhvcml6YXRpb24oX2F1dGgpIHtcbiAgICAgICAgY29uc3QgYXV0aCA9IE9iamVjdC5hc3NpZ24oe30sIF9hdXRoKTtcbiAgICAgICAgLy8gQWRkIGEgY2hhaW4gSUQgaWYgbm90IGV4cGxpY2l0bHkgc2V0IHRvIDBcbiAgICAgICAgaWYgKGF1dGguY2hhaW5JZCA9PSBudWxsKSB7XG4gICAgICAgICAgICBhdXRoLmNoYWluSWQgPSAoYXdhaXQgY2hlY2tQcm92aWRlcih0aGlzLCBcImdldE5ldHdvcmtcIikuZ2V0TmV0d29yaygpKS5jaGFpbklkO1xuICAgICAgICB9XG4gICAgICAgIC8vIEBUT0RPOiBUYWtlIGNoYWluIElEIGludG8gYWNjb3VudCB3aGVuIHBvcHVsYXRpbmcgbm9jZT9cbiAgICAgICAgaWYgKGF1dGgubm9uY2UgPT0gbnVsbCkge1xuICAgICAgICAgICAgYXV0aC5ub25jZSA9IGF3YWl0IHRoaXMuZ2V0Tm9uY2UoKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYXV0aDtcbiAgICB9XG4gICAgYXN5bmMgZXN0aW1hdGVHYXModHgpIHtcbiAgICAgICAgcmV0dXJuIGNoZWNrUHJvdmlkZXIodGhpcywgXCJlc3RpbWF0ZUdhc1wiKS5lc3RpbWF0ZUdhcyhhd2FpdCB0aGlzLnBvcHVsYXRlQ2FsbCh0eCkpO1xuICAgIH1cbiAgICBhc3luYyBjYWxsKHR4KSB7XG4gICAgICAgI
26774HJldHVybiBjaGVja1Byb3ZpZGVyKHRoaXMsIFwiY2FsbFwiKS5jYWxsKGF3YWl0IHRoaXMucG9wdWxhdGVDYWxsKHR4KSk7XG4gICAgfVxuICAgIGFzeW5jIHJlc29sdmVOYW1lKG5hbWUpIHtcbiAgICAgICAgY29uc3QgcHJvdmlkZXIgPSBjaGVja1Byb3ZpZGVyKHRoaXMsIFwicmVzb2x2ZU5hbWVcIik7XG4gICAgICAgIHJldHVybiBhd2FpdCBwcm92aWRlci5yZXNvbHZlTmFtZShuYW1lKTtcbiAgICB9XG4gICAgYXN5bmMgc2VuZFRyYW5zYWN0aW9uKHR4KSB7XG4gICAgICAgIGNvbnN0IHByb3ZpZGVyID0gY2hlY2tQcm92aWRlcih0aGlzLCBcInNlbmRUcmFuc2FjdGlvblwiKTtcbiAgICAgICAgY29uc3QgcG9wID0gYXdhaXQgdGhpcy5wb3B1bGF0ZVRyYW5zYWN0aW9uKHR4KTtcbiAgICAgICAgZGVsZXRlIHBvcC5mcm9tO1xuICAgICAgICBjb25zdCB0eE9iaiA9IFRyYW5zYWN0aW9uLmZyb20ocG9wKTtcbiAgICAgICAgcmV0dXJuIGF3YWl0IHByb3ZpZGVyLmJyb2FkY2FzdFRyYW5zYWN0aW9uKGF3YWl0IHRoaXMuc2lnblRyYW5zYWN0aW9uKHR4T2JqKSk7XG4gICAgfVxuICAgIC8vIEBUT0RPOiBpbiB2NyBtb3ZlIHRoaXMgdG8gYmUgYWJzdHJhY3RcbiAgICBhdXRob3JpemUoYXV0aG9yaXphdGlvbikge1xuICAgICAgICBhc3NlcnQoZmFsc2UsIFwiYXV0aG9yaXphdGlvbiBub3QgaW1wbGVtZW50ZWQgZm9yIHRoaXMgc2lnbmVyXCIsIFwiVU5TVVBQT1JURURfT1BFUkFUSU9OXCIsIHsgb3BlcmF0aW9uOiBcImF1dGhvcml6ZVwiIH0pO1xuICAgIH1cbn1cbi8qKlxuICogIEEgKipWb2lkU2lnbmVyKiogaXMgYSBjbGFzcyBkZXNpZ25lZCB0byBhbGxvdyBhbiBhZGRyZXNzIHRvIGJlIHVzZWRcbiAqICBpbiBhbnkgQVBJIHdoaWNoIGFjY2VwdHMgYSBTaWduZXIsIGJ1dCBmb3Igd2hpY2ggdGhlcmUgYXJlIG5vXG4gKiAgY3JlZGVudGlhbHMgYXZhaWxhYmxlIHRvIHBlcmZvcm0gYW55IGFjdHVhbCBzaWduaW5nLlxuICpcbiAqICBUaGlzIGZvciBleGFtcGxlIGFsbG93IGltcGVyc29uYXRpbmcgYW4gYWNjb3VudCBmb3IgdGhlIHB1cnBvc2Ugb2ZcbiAqICBzdGF0aWMgY2FsbHMgb3IgZXN0aW1hdGluZyBnYXMsIGJ1dCBkb2VzIG5vdCBhbGxvdyBzZW5kaW5nIHRyYW5zYWN0aW9ucy5cbiAqL1xuZXhwb3J0IGNsYXNzIFZvaWRTaWduZXIgZXh0ZW5kcyBBYnN0cmFjdFNpZ25lciB7XG4gICAgLyoqXG4gICAgICogIFRoZSBzaWduZXIgYWRkcmVzcy5cbiAgICAgKi9cbiAgICBhZGRyZXNzO1xuICAgIC8qKlxuICAgICAqICBDcmVhdGVzIGEgbmV3ICoqVm9pZFNpZ25lcioqIHdpdGggJSVhZGRyZXNzJSUgYXR0YWNoZWQgdG9cbiAgICAgKiAgJSVwcm92aWRlciUlLlxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yKGFkZHJlc3MsIHByb3ZpZGVyKSB7XG4gICAgICAgIHN1cGVyKHByb3ZpZGVyKTtcbiAgICAgICAgZGVmaW5lUHJvcGVydGllcyh0aGlzLCB7IGFkZHJlc3MgfSk7XG4gICAgfVxuICAgIGFzeW5jIGdldEFkZHJlc3MoKSB7IHJldHVybiB0aGlzLmFkZHJlc3M7IH1cbiAgICBjb25uZWN0KHByb3ZpZGVyKSB7XG4gICAgICAgIHJldHVybiBuZXcgVm9pZFNpZ25lcih0aGlzLmFkZHJlc3MsIHByb3ZpZGVyKTtcbiAgICB9XG4gICAgI3Rocm93VW5zdXBwb3J0ZWQoc3VmZml4LCBvcGVyYXRpb24pIHtcbiAgICAgICAgYXNzZXJ0KGZhbHNlLCBgVm9pZFNpZ25lciBjYW5ub3Qgc2lnbiAke3N1ZmZpeH1gLCBcIlVOU1VQUE9SVEVEX09QRVJBVElPTlwiLCB7IG9wZXJhdGlvbiB9KTtcbiAgICB9XG4gICAgYXN5bmMgc2lnblRyYW5zYWN0aW9uKHR4KSB7XG4gICAgICAgIHRoaXMuI3Rocm93VW5zdXBwb3J0ZWQoXCJ0cmFuc2FjdGlvbnNcIiwgXCJzaWduVHJhbnNhY3Rpb25cIik7XG4gICAgfVxuICAgIGFzeW5jIHNpZ25NZXNzYWdlKG1lc3NhZ2UpIHtcbiAgICAgICAgdGhpcy4jdGhyb3dVbnN1cHBvcnRlZChcIm1lc3NhZ2VzXCIsIFwic2lnbk1lc3NhZ2VcIik7XG4gICAgfVxuICAgIGFzeW5jIHNpZ25UeXBlZERhdGEoZG9tYWluLCB0eXBlcywgdmFsdWUpIHtcbiAgICAgICAgdGhpcy4jdGhyb3dVbnN1cHBvcnRlZChcInR5cGVkLWRhdGFcIiwgXCJzaWduVHlwZWREYXRhXCIpO1xuICAgIH1cbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWFic3RyYWN0LXNpZ25lci5qcy5tYXAiLCIvKipcbiAqICBUaGVyZSBhcmUgbWFueSBhd2Vzb21lIGNvbW11bml0eSBzZXJ2aWNlcyB0aGF0IHByb3ZpZGUgRXRoZXJldW1cbiAqICBub2RlcyBib3RoIGZvciBkZXZlbG9wZXJzIGp1c3Qgc3RhcnRpbmcgb3V0IGFuZCBmb3IgbGFyZ2Utc2NhbGVcbiAqICBjb21tdW5pdGllcy5cbiAqXG4gKiAgQF9zZWN0aW9uOiBhcGkvcHJvdmlkZXJzL3RoaXJkcGFydHk6IENvbW11bml0eSBQcm92aWRlcnMgIFt0aGlyZHBhcnR5XVxuICovXG4vLyBTaG93IHRoZSB0aHJvdHRsZSBtZXNzYWdlIG9ubHkgb25jZSBwZXIgc2VydmljZVxuY29uc3Qgc2hvd24gPSBuZXcgU2V0KCk7XG4vKipcbiAqICBEaXNwbGF5cyBhIHdhcm5pbmcgaW4gdGhlIGNvbnNvbGUgd2hlbiB0aGUgY29tbXVuaXR5IHJlc291cmNlIGlzXG4gKiAgYmVpbmcgdXNlZCB0b28gaGVhdmlseSBieSB0aGUgYXBwLCByZWNvbW1lbmRpbmcgdGhlIGRldmVsb3BlclxuICogIGFjcXVpcmUgdGhlaXIgb3duIGNyZWRlbnRpYWxzIGluc3RlYWQgb2YgdXNpbmcgdGhlIGNvbW11bml0eVxuICogIGNyZWRlbnRpYWxzLlxuICpcbiAqICBUaGUgbm90aWZpY2F0aW9uIHdpbGwgb25seSBvY2N1ciBvbmNlIHBlciBzZXJ2aWNlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gc2hvd1Rocm90dGxlTWVzc2FnZShzZXJ2aWNlKSB7XG4gICAgaWYgKHNob3duLmhhcyhzZXJ2aWNlKSkge1xuICAgICAgICByZXR1cm47XG4gICAgfVxuICAgIHNob3duLmFkZChzZXJ2aWNlKTtcbiAgICBjb25zb2xlLmxvZyhcIj09PT09PT09PSBOT1RJQ0UgPT09PT09PT09XCIpO1xuICAgIGNvbnNvbGUubG9nKGBSZXF1ZXN0LVJhdGUgRXhjZWVkZWQgZm9yICR7c2VydmljZX0gKHRoaXMgbWVzc2FnZSB3aWxsIG5vdCBiZSByZXBlYXRlZClgKTtcbiAgICBjb25zb2xlLmxvZyhcIlwiKTtcbiAgICBjb25zb2xlLmxvZyhcIlRoZSBkZWZhdWx0IEFQSSBrZXlzIGZvciBlYWNoIHNlcnZpY2UgYXJlIHByb3ZpZGVkIGFzIGEgaGlnaGx5LXRocm90dGxlZCxcIik7XG4gICAgY29uc29sZS5sb2coXCJjb21tdW5pdHkgcmVzb3VyY2UgZm9yIGxvdy10cmFmZmljIHByb2plY3RzIGFuZCBlYXJseSBwcm90b3R5cGluZy5cIik7XG4gICAgY29uc29sZS5sb2coXCJcIik7XG4gICAgY29uc29sZS5sb2coXCJXaGlsZSB5b3VyIGFwcGxpY2F0aW9uIHdpbGwgY29udGludWUgdG8gZnVuY3Rpb24sIHdlIGhpZ2hseSByZWNvbW1lbmRlZFwiKTtcbiAgICBjb25zb2xlLmxvZyhcInNpZ25pbmcgdXAgZm9yIHlvdXIgb3duIEFQSSBrZXlzIHRvIGltcHJvdmUgcGVyZm9ybWFuY2UsIGluY3JlYXNlIHlvdXJcIik7XG4gICAgY29uc29sZS5sb2coXCJyZXF1ZXN0IHJhdGUvbGltaXQgYW5kIGVuYWJsZSBvdGhlciBwZXJrcywgc3VjaCBhcyBtZXRyaWNzIGFuZCBhZHZhbmNlZCBBUElzLlwiKTtcbiAgICBjb25zb2xlLmxvZyhcIlwiKTtcbiAgICBjb25zb2xlLmxvZyhcIkZvciBtb3JlIGRldGFpbHM6IGh0dHBzOi9cXC9kb2NzLmV0aGVycy5vcmcvYXBpLWtleXMvXCIpO1xuICAgIGNvbnNvbGUubG9nKFwiPT09PT09PT09PT09PT09PT09PT09PT09PT1cIik7XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1jb21tdW5pdHkuanMubWFwIiwiaW1wb3J0IHsgaXNFcnJvciB9IGZyb20gXCIuLi91dGlscy9pbmRleC5qc1wiO1xuaW1wb3J0IHsgUG9sbGluZ0V2ZW50U3Vic2NyaWJlciB9IGZyb20gXCIuL3N1YnNjcmliZXItcG9sbGluZy5qc1wiO1xuZnVuY3Rpb24gY29weShvYmopIHtcbiAgICByZXR1cm4gSl
26774NPTi5wYXJzZShKU09OLnN0cmluZ2lmeShvYmopKTtcbn1cbi8qKlxuICogIFNvbWUgYmFja2VuZHMgc3VwcG9ydCBzdWJzY3JpYmluZyB0byBldmVudHMgdXNpbmcgYSBGaWx0ZXIgSUQuXG4gKlxuICogIFdoZW4gc3Vic2NyaWJpbmcgd2l0aCB0aGlzIHRlY2huaXF1ZSwgdGhlIG5vZGUgaXNzdWVzIGEgdW5pcXVlXG4gKiAgLy9GaWx0ZXIgSUQvLy4gQXQgdGhpcyBwb2ludCB0aGUgbm9kZSBkZWRpY2F0ZXMgcmVzb3VyY2VzIHRvXG4gKiAgdGhlIGZpbHRlciwgc28gdGhhdCBwZXJpb2RpYyBjYWxscyB0byBmb2xsb3cgdXAgb24gdGhlIC8vRmlsdGVyIElELy9cbiAqICB3aWxsIHJlY2VpdmUgYW55IGV2ZW50cyBzaW5jZSB0aGUgbGFzdCBjYWxsLlxuICpcbiAqICBAX2RvY2xvYzogYXBpL3Byb3ZpZGVycy9hYnN0cmFjdC1wcm92aWRlclxuICovXG5leHBvcnQgY2xhc3MgRmlsdGVySWRTdWJzY3JpYmVyIHtcbiAgICAjcHJvdmlkZXI7XG4gICAgI2ZpbHRlcklkUHJvbWlzZTtcbiAgICAjcG9sbGVyO1xuICAgICNydW5uaW5nO1xuICAgICNuZXR3b3JrO1xuICAgICNoYXVsdDtcbiAgICAvKipcbiAgICAgKiAgQ3JlYXRlcyBhIG5ldyAqKkZpbHRlcklkU3Vic2NyaWJlcioqIHdoaWNoIHdpbGwgdXNlZCBbW19zdWJzY3JpYmVdXVxuICAgICAqICBhbmQgW1tfZW1pdFJlc3VsdHNdXSB0byBzZXR1cCB0aGUgc3Vic2NyaXB0aW9uIGFuZCBwcm92aWRlIHRoZSBldmVudFxuICAgICAqICB0byB0aGUgJSVwcm92aWRlciUlLlxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yKHByb3ZpZGVyKSB7XG4gICAgICAgIHRoaXMuI3Byb3ZpZGVyID0gcHJvdmlkZXI7XG4gICAgICAgIHRoaXMuI2ZpbHRlcklkUHJvbWlzZSA9IG51bGw7XG4gICAgICAgIHRoaXMuI3BvbGxlciA9IHRoaXMuI3BvbGwuYmluZCh0aGlzKTtcbiAgICAgICAgdGhpcy4jcnVubmluZyA9IGZhbHNlO1xuICAgICAgICB0aGlzLiNuZXR3b3JrID0gbnVsbDtcbiAgICAgICAgdGhpcy4jaGF1bHQgPSBmYWxzZTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogIFN1Yi1jbGFzc2VzICoqbXVzdCoqIG92ZXJyaWRlIHRoaXMgdG8gYmVnaW4gdGhlIHN1YnNjcmlwdGlvbi5cbiAgICAgKi9cbiAgICBfc3Vic2NyaWJlKHByb3ZpZGVyKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcInN1YmNsYXNzZXMgbXVzdCBvdmVycmlkZSB0aGlzXCIpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiAgU3ViLWNsYXNzZXMgKiptdXN0Kiogb3ZlcnJpZGUgdGhpcyBoYW5kbGUgdGhlIGV2ZW50cy5cbiAgICAgKi9cbiAgICBfZW1pdFJlc3VsdHMocHJvdmlkZXIsIHJlc3VsdCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJzdWJjbGFzc2VzIG11c3Qgb3ZlcnJpZGUgdGhpc1wiKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogIFN1Yi1jbGFzc2VzICoqbXVzdCoqIG92ZXJyaWRlIHRoaXMgaGFuZGxlIHJlY292ZXJ5IG9uIGVycm9ycy5cbiAgICAgKi9cbiAgICBfcmVjb3Zlcihwcm92aWRlcikge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJzdWJjbGFzc2VzIG11c3Qgb3ZlcnJpZGUgdGhpc1wiKTtcbiAgICB9XG4gICAgYXN5bmMgI3BvbGwoYmxvY2tOdW1iZXIpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIC8vIFN1YnNjcmliZSBpZiBuZWNlc3NhcnlcbiAgICAgICAgICAgIGlmICh0aGlzLiNmaWx0ZXJJZFByb21pc2UgPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIHRoaXMuI2ZpbHRlcklkUHJvbWlzZSA9IHRoaXMuX3N1YnNjcmliZSh0aGlzLiNwcm92aWRlcik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBHZXQgdGhlIEZpbHRlciBJRFxuICAgICAgICAgICAgbGV0IGZpbHRlcklkID0gbnVsbDtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgZmlsdGVySWQgPSBhd2FpdCB0aGlzLiNmaWx0ZXJJZFByb21pc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgICAgICBpZiAoIWlzRXJyb3IoZXJyb3IsIFwiVU5TVVBQT1JURURfT1BFUkFUSU9OXCIpIHx8IGVycm9yLm9wZXJhdGlvbiAhPT0gXCJldGhfbmV3RmlsdGVyXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gVGhlIGJhY2tlbmQgZG9lcyBub3Qgc3VwcG9ydCBGaWx0ZXIgSUQ7IGRvd25ncmFkZSB0b1xuICAgICAgICAgICAgLy8gcG9sbGluZ1xuICAgICAgICAgICAgaWYgKGZpbHRlcklkID09IG51bGwpIHtcbiAgICAgICAgICAgICAgICB0aGlzLiNmaWx0ZXJJZFByb21pc2UgPSBudWxsO1xuICAgICAgICAgICAgICAgIHRoaXMuI3Byb3ZpZGVyLl9yZWNvdmVyU3Vic2NyaWJlcih0aGlzLCB0aGlzLl9yZWNvdmVyKHRoaXMuI3Byb3ZpZGVyKSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgbmV0d29yayA9IGF3YWl0IHRoaXMuI3Byb3ZpZGVyLmdldE5ldHdvcmsoKTtcbiAgICAgICAgICAgIGlmICghdGhpcy4jbmV0d29yaykge1xuICAgICAgICAgICAgICAgIHRoaXMuI25ldHdvcmsgPSBuZXR3b3JrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHRoaXMuI25ldHdvcmsuY2hhaW5JZCAhPT0gbmV0d29yay5jaGFpbklkKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiY2hhaWQgY2hhbmdlZFwiKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh0aGlzLiNoYXVsdCkge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMuI3Byb3ZpZGVyLnNlbmQoXCJldGhfZ2V0RmlsdGVyQ2hhbmdlc1wiLCBbZmlsdGVySWRdKTtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuX2VtaXRSZXN1bHRzKHRoaXMuI3Byb3ZpZGVyLCByZXN1bHQpO1xuICAgICAgICB9XG4gICAgICAgIGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgY29uc29sZS5sb2coXCJAVE9ET1wiLCBlcnJvcik7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy4jcHJvdmlkZXIub25jZShcImJsb2NrXCIsIHRoaXMuI3BvbGxlcik7XG4gICAgfVxuICAgICN0ZWFyZG93bigpIHtcbiAgICAgICAgY29uc3QgZmlsdGVySWRQcm9taXNlID0gdGhpcy4jZmlsdGVySWRQcm9taXNlO1xuICAgICAgICBpZiAoZmlsdGVySWRQcm9taXNlKSB7XG4gICAgICAgICAgICB0aGlzLiNmaWx0ZXJJZFByb21pc2UgPSBudWxsO1xuICAgICAgICAgICAgZmlsdGVySWRQcm9taXNlLnRoZW4oKGZpbHRlcklkKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuI3Byb3ZpZGVyLmRlc3Ryb3llZCkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgI
26774HRoaXMuI3Byb3ZpZGVyLnNlbmQoXCJldGhfdW5pbnN0YWxsRmlsdGVyXCIsIFtmaWx0ZXJJZF0pO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgc3RhcnQoKSB7XG4gICAgICAgIGlmICh0aGlzLiNydW5uaW5nKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy4jcnVubmluZyA9IHRydWU7XG4gICAgICAgIHRoaXMuI3BvbGwoLTIpO1xuICAgIH1cbiAgICBzdG9wKCkge1xuICAgICAgICBpZiAoIXRoaXMuI3J1bm5pbmcpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLiNydW5uaW5nID0gZmFsc2U7XG4gICAgICAgIHRoaXMuI2hhdWx0ID0gdHJ1ZTtcbiAgICAgICAgdGhpcy4jdGVhcmRvd24oKTtcbiAgICAgICAgdGhpcy4jcHJvdmlkZXIub2ZmKFwiYmxvY2tcIiwgdGhpcy4jcG9sbGVyKTtcbiAgICB9XG4gICAgcGF1c2UoZHJvcFdoaWxlUGF1c2VkKSB7XG4gICAgICAgIGlmIChkcm9wV2hpbGVQYXVzZWQpIHtcbiAgICAgICAgICAgIHRoaXMuI3RlYXJkb3duKCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy4jcHJvdmlkZXIub2ZmKFwiYmxvY2tcIiwgdGhpcy4jcG9sbGVyKTtcbiAgICB9XG4gICAgcmVzdW1lKCkgeyB0aGlzLnN0YXJ0KCk7IH1cbn1cbi8qKlxuICogIEEgKipGaWx0ZXJJZFN1YnNjcmliZXIqKiBmb3IgcmVjZWl2aW5nIGNvbnRyYWN0IGV2ZW50cy5cbiAqXG4gKiAgQF9kb2Nsb2M6IGFwaS9wcm92aWRlcnMvYWJzdHJhY3QtcHJvdmlkZXJcbiAqL1xuZXhwb3J0IGNsYXNzIEZpbHRlcklkRXZlbnRTdWJzY3JpYmVyIGV4dGVuZHMgRmlsdGVySWRTdWJzY3JpYmVyIHtcbiAgICAjZXZlbnQ7XG4gICAgLyoqXG4gICAgICogIENyZWF0ZXMgYSBuZXcgKipGaWx0ZXJJZEV2ZW50U3Vic2NyaWJlcioqIGF0dGFjaGVkIHRvICUlcHJvdmlkZXIlJVxuICAgICAqICBsaXN0ZW5pbmcgZm9yICUlZmlsdGVyJSUuXG4gICAgICovXG4gICAgY29uc3RydWN0b3IocHJvdmlkZXIsIGZpbHRlcikge1xuICAgICAgICBzdXBlcihwcm92aWRlcik7XG4gICAgICAgIHRoaXMuI2V2ZW50ID0gY29weShmaWx0ZXIpO1xuICAgIH1cbiAgICBfcmVjb3Zlcihwcm92aWRlcikge1xuICAgICAgICByZXR1cm4gbmV3IFBvbGxpbmdFdmVudFN1YnNjcmliZXIocHJvdmlkZXIsIHRoaXMuI2V2ZW50KTtcbiAgICB9XG4gICAgYXN5bmMgX3N1YnNjcmliZShwcm92aWRlcikge1xuICAgICAgICBjb25zdCBmaWx0ZXJJZCA9IGF3YWl0IHByb3ZpZGVyLnNlbmQoXCJldGhfbmV3RmlsdGVyXCIsIFt0aGlzLiNldmVudF0pO1xuICAgICAgICByZXR1cm4gZmlsdGVySWQ7XG4gICAgfVxuICAgIGFzeW5jIF9lbWl0UmVzdWx0cyhwcm92aWRlciwgcmVzdWx0cykge1xuICAgICAgICBmb3IgKGNvbnN0IHJlc3VsdCBvZiByZXN1bHRzKSB7XG4gICAgICAgICAgICBwcm92aWRlci5lbWl0KHRoaXMuI2V2ZW50LCBwcm92aWRlci5fd3JhcExvZyhyZXN1bHQsIHByb3ZpZGVyLl9uZXR3b3JrKSk7XG4gICAgICAgIH1cbiAgICB9XG59XG4vKipcbiAqICBBICoqRmlsdGVySWRTdWJzY3JpYmVyKiogZm9yIHJlY2VpdmluZyBwZW5kaW5nIHRyYW5zYWN0aW9ucyBldmVudHMuXG4gKlxuICogIEBfZG9jbG9jOiBhcGkvcHJvdmlkZXJzL2Fic3RyYWN0LXByb3ZpZGVyXG4gKi9cbmV4cG9ydCBjbGFzcyBGaWx0ZXJJZFBlbmRpbmdTdWJzY3JpYmVyIGV4dGVuZHMgRmlsdGVySWRTdWJzY3JpYmVyIHtcbiAgICBhc3luYyBfc3Vic2NyaWJlKHByb3ZpZGVyKSB7XG4gICAgICAgIHJldHVybiBhd2FpdCBwcm92aWRlci5zZW5kKFwiZXRoX25ld1BlbmRpbmdUcmFuc2FjdGlvbkZpbHRlclwiLCBbXSk7XG4gICAgfVxuICAgIGFzeW5jIF9lbWl0UmVzdWx0cyhwcm92aWRlciwgcmVzdWx0cykge1xuICAgICAgICBmb3IgKGNvbnN0IHJlc3VsdCBvZiByZXN1bHRzKSB7XG4gICAgICAgICAgICBwcm92aWRlci5lbWl0KFwicGVuZGluZ1wiLCByZXN1bHQpO1xuICAgICAgICB9XG4gICAgfVxufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9c3Vic2NyaWJlci1maWx0ZXJpZC5qcy5tYXAiLCIvKipcbiAqICBPbmUgb2YgdGhlIG1vc3QgY29tbW9uIHdheXMgdG8gaW50ZXJhY3Qgd2l0aCB0aGUgYmxvY2tjaGFpbiBpc1xuICogIGJ5IGEgbm9kZSBydW5uaW5nIGEgSlNPTi1SUEMgaW50ZXJmYWNlIHdoaWNoIGNhbiBiZSBjb25uZWN0ZWQgdG8sXG4gKiAgYmFzZWQgb24gdGhlIHRyYW5zcG9ydCwgdXNpbmc6XG4gKlxuICogIC0gSFRUUCBvciBIVFRQUyAtIFtbSnNvblJwY1Byb3ZpZGVyXV1cbiAqICAtIFdlYlNvY2tldCAtIFtbV2ViU29ja2V0UHJvdmlkZXJdXVxuICogIC0gSVBDIC0gW1tJcGNTb2NrZXRQcm92aWRlcl1dXG4gKlxuICogQF9zZWN0aW9uOiBhcGkvcHJvdmlkZXJzL2pzb25ycGM6SlNPTi1SUEMgUHJvdmlkZXIgIFthYm91dC1qc29ucnBjUHJvdmlkZXJdXG4gKi9cbi8vIEBUT0RPOlxuLy8gLSBBZGQgdGhlIGJhdGNoaW5nIEFQSVxuLy8gaHR0cHM6Ly9wbGF5Z3JvdW5kLm9wZW4tcnBjLm9yZy8/c2NoZW1hVXJsPWh0dHBzOi8vcmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbS9ldGhlcmV1bS9ldGgxLjAtYXBpcy9hc3NlbWJsZWQtc3BlYy9vcGVucnBjLmpzb24mdWlTY2hlbWElNUJhcHBCYXIlNUQlNUJ1aTpzcGxpdFZpZXclNUQ9dHJ1ZSZ1aVNjaGVtYSU1QmFwcEJhciU1RCU1QnVpOmlucHV0JTVEPWZhbHNlJnVpU2NoZW1hJTVCYXBwQmFyJTVEJTVCdWk6ZXhhbXBsZXNEcm9wZG93biU1RD1mYWxzZVxuaW1wb3J0IHsgQWJpQ29kZXIgfSBmcm9tIFwiLi4vYWJpL2luZGV4LmpzXCI7XG5pbXBvcnQgeyBnZXRBZGRyZXNzLCByZXNvbHZlQWRkcmVzcyB9IGZyb20gXCIuLi9hZGRyZXNzL2luZGV4LmpzXCI7XG5pbXBvcnQgeyBUeXBlZERhdGFFbmNvZGVyIH0gZnJvbSBcIi4uL2hhc2gvaW5kZXguanNcIjtcbmltcG9ydCB7IGFjY2Vzc0xpc3RpZnksIGF1dGhvcml6YXRpb25pZnkgfSBmcm9tIFwiLi4vdHJhbnNhY3Rpb24vaW5kZXguanNcIjtcbmltcG9ydCB7IGRlZmluZVByb3BlcnRpZXMsIGdldEJpZ0ludCwgaGV4bGlmeSwgaXNIZXhTdHJpbmcsIHRvUXVhbnRpdHksIHRvVXRmOEJ5dGVzLCBpc0Vycm9yLCBtYWtlRXJyb3IsIGFzc2VydCwgYXNzZXJ0QXJndW1lbnQsIEZldGNoUmVxdWVzdCwgcmVzb2x2ZVByb3BlcnRpZXMgfSBmcm9tIFwiLi4vdXRpbHMvaW5kZXguanNcIjtcbmltcG9ydCB7
26774IEFic3RyYWN0UHJvdmlkZXIsIFVubWFuYWdlZFN1YnNjcmliZXIgfSBmcm9tIFwiLi9hYnN0cmFjdC1wcm92aWRlci5qc1wiO1xuaW1wb3J0IHsgQWJzdHJhY3RTaWduZXIgfSBmcm9tIFwiLi9hYnN0cmFjdC1zaWduZXIuanNcIjtcbmltcG9ydCB7IE5ldHdvcmsgfSBmcm9tIFwiLi9uZXR3b3JrLmpzXCI7XG5pbXBvcnQgeyBGaWx0ZXJJZEV2ZW50U3Vic2NyaWJlciwgRmlsdGVySWRQZW5kaW5nU3Vic2NyaWJlciB9IGZyb20gXCIuL3N1YnNjcmliZXItZmlsdGVyaWQuanNcIjtcbmltcG9ydCB7IFBvbGxpbmdFdmVudFN1YnNjcmliZXIgfSBmcm9tIFwiLi9zdWJzY3JpYmVyLXBvbGxpbmcuanNcIjtcbmNvbnN0IFByaW1pdGl2ZSA9IFwiYmlnaW50LGJvb2xlYW4sZnVuY3Rpb24sbnVtYmVyLHN0cmluZyxzeW1ib2xcIi5zcGxpdCgvLC9nKTtcbi8vY29uc3QgTWV0aG9kcyA9IFwiZ2V0QWRkcmVzcyx0aGVuXCIuc3BsaXQoLywvZyk7XG5mdW5jdGlvbiBkZWVwQ29weSh2YWx1ZSkge1xuICAgIGlmICh2YWx1ZSA9PSBudWxsIHx8IFByaW1pdGl2ZS5pbmRleE9mKHR5cGVvZiAodmFsdWUpKSA+PSAwKSB7XG4gICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICB9XG4gICAgLy8gS2VlcCBhbnkgQWRkcmVzc2FibGVcbiAgICBpZiAodHlwZW9mICh2YWx1ZS5nZXRBZGRyZXNzKSA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICB9XG4gICAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG4gICAgICAgIHJldHVybiAodmFsdWUubWFwKGRlZXBDb3B5KSk7XG4gICAgfVxuICAgIGlmICh0eXBlb2YgKHZhbHVlKSA9PT0gXCJvYmplY3RcIikge1xuICAgICAgICByZXR1cm4gT2JqZWN0LmtleXModmFsdWUpLnJlZHVjZSgoYWNjdW0sIGtleSkgPT4ge1xuICAgICAgICAgICAgYWNjdW1ba2V5XSA9IHZhbHVlW2tleV07XG4gICAgICAgICAgICByZXR1cm4gYWNjdW07XG4gICAgICAgIH0sIHt9KTtcbiAgICB9XG4gICAgdGhyb3cgbmV3IEVycm9yKGBzaG91bGQgbm90IGhhcHBlbjogJHt2YWx1ZX0gKCR7dHlwZW9mICh2YWx1ZSl9KWApO1xufVxuZnVuY3Rpb24gc3RhbGwoZHVyYXRpb24pIHtcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHsgc2V0VGltZW91dChyZXNvbHZlLCBkdXJhdGlvbik7IH0pO1xufVxuZnVuY3Rpb24gZ2V0TG93ZXJDYXNlKHZhbHVlKSB7XG4gICAgaWYgKHZhbHVlKSB7XG4gICAgICAgIHJldHVybiB2YWx1ZS50b0xvd2VyQ2FzZSgpO1xuICAgIH1cbiAgICByZXR1cm4gdmFsdWU7XG59XG5mdW5jdGlvbiBpc1BvbGxhYmxlKHZhbHVlKSB7XG4gICAgcmV0dXJuICh2YWx1ZSAmJiB0eXBlb2YgKHZhbHVlLnBvbGxpbmdJbnRlcnZhbCkgPT09IFwibnVtYmVyXCIpO1xufVxuY29uc3QgZGVmYXVsdE9wdGlvbnMgPSB7XG4gICAgcG9sbGluZzogZmFsc2UsXG4gICAgc3RhdGljTmV0d29yazogbnVsbCxcbiAgICBiYXRjaFN0YWxsVGltZTogMTAsXG4gICAgYmF0Y2hNYXhTaXplOiAoMSA8PCAyMCksXG4gICAgYmF0Y2hNYXhDb3VudDogMTAwLFxuICAgIGNhY2hlVGltZW91dDogMjUwLFxuICAgIHBvbGxpbmdJbnRlcnZhbDogNDAwMFxufTtcbi8vIEBUT0RPOiBVbmNoZWNrZWQgU2lnbmVyc1xuZXhwb3J0IGNsYXNzIEpzb25ScGNTaWduZXIgZXh0ZW5kcyBBYnN0cmFjdFNpZ25lciB7XG4gICAgYWRkcmVzcztcbiAgICBjb25zdHJ1Y3Rvcihwcm92aWRlciwgYWRkcmVzcykge1xuICAgICAgICBzdXBlcihwcm92aWRlcik7XG4gICAgICAgIGFkZHJlc3MgPSBnZXRBZGRyZXNzKGFkZHJlc3MpO1xuICAgICAgICBkZWZpbmVQcm9wZXJ0aWVzKHRoaXMsIHsgYWRkcmVzcyB9KTtcbiAgICB9XG4gICAgY29ubmVjdChwcm92aWRlcikge1xuICAgICAgICBhc3NlcnQoZmFsc2UsIFwiY2Fubm90IHJlY29ubmVjdCBKc29uUnBjU2lnbmVyXCIsIFwiVU5TVVBQT1JURURfT1BFUkFUSU9OXCIsIHtcbiAgICAgICAgICAgIG9wZXJhdGlvbjogXCJzaWduZXIuY29ubmVjdFwiXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBhc3luYyBnZXRBZGRyZXNzKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5hZGRyZXNzO1xuICAgIH1cbiAgICAvLyBKU09OLVJQQyB3aWxsIGF1dG9tYXRpYWxseSBmaWxsIGluIG5vbmNlLCBldGMuIHNvIHdlIGp1c3QgY2hlY2sgZnJvbVxuICAgIGFzeW5jIHBvcHVsYXRlVHJhbnNhY3Rpb24odHgpIHtcbiAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMucG9wdWxhdGVDYWxsKHR4KTtcbiAgICB9XG4gICAgLy8gUmV0dXJucyBqdXN0IHRoZSBoYXNoIG9mIHRoZSB0cmFuc2FjdGlvbiBhZnRlciBzZW50LCB3aGljaCBpcyB3aGF0XG4gICAgLy8gdGhlIGJhcmUgSlNPTi1SUEMgQVBJIGRvZXM7XG4gICAgYXN5bmMgc2VuZFVuY2hlY2tlZFRyYW5zYWN0aW9uKF90eCkge1xuICAgICAgICBjb25zdCB0eCA9IGRlZXBDb3B5KF90eCk7XG4gICAgICAgIGNvbnN0IHByb21pc2VzID0gW107XG4gICAgICAgIC8vIE1ha2Ugc3VyZSB0aGUgZnJvbSBtYXRjaGVzIHRoZSBzZW5kZXJcbiAgICAgICAgaWYgKHR4LmZyb20pIHtcbiAgICAgICAgICAgIGNvbnN0IF9mcm9tID0gdHguZnJvbTtcbiAgICAgICAgICAgIHByb21pc2VzLnB1c2goKGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBmcm9tID0gYXdhaXQgcmVzb2x2ZUFkZHJlc3MoX2Zyb20sIHRoaXMucHJvdmlkZXIpO1xuICAgICAgICAgICAgICAgIGFzc2VydEFyZ3VtZW50KGZyb20gIT0gbnVsbCAmJiBmcm9tLnRvTG93ZXJDYXNlKCkgPT09IHRoaXMuYWRkcmVzcy50b0xvd2VyQ2FzZSgpLCBcImZyb20gYWRkcmVzcyBtaXNtYXRjaFwiLCBcInRyYW5zYWN0aW9uXCIsIF90eCk7XG4gICAgICAgICAgICAgICAgdHguZnJvbSA9IGZyb207XG4gICAgICAgICAgICB9KSgpKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHR4LmZyb20gPSB0aGlzLmFkZHJlc3M7XG4gICAgICAgIH1cbiAgICAgICAgLy8gVGhlIEpTT04tUlBDIGZvciBldGhfc2VuZFRyYW5zYWN0aW9uIHVzZXMgOTAwMDAgZ2FzOyBpZiB0aGUgdXNlclxuICAgICAgICAvLyB3aXNoZXMgdG8gdXNlIHRoaXMsIGl0IGlzIGVhc3kgdG8gc3BlY2lmeSBleHBsaWNpdGx5LCBvdGhlcndpc2VcbiAgICAgICAgLy8gd2UgbG9vayBpdCB1cCBmb3IgdGhlbS5cbiAgICAgICAgaWYgKHR4Lmdhc0xpbWl0ID09IG51bGwpIHtcbiAgICAgICAgICAgI
26774HByb21pc2VzLnB1c2goKGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgICAgICB0eC5nYXNMaW1pdCA9IGF3YWl0IHRoaXMucHJvdmlkZXIuZXN0aW1hdGVHYXMoeyAuLi50eCwgZnJvbTogdGhpcy5hZGRyZXNzIH0pO1xuICAgICAgICAgICAgfSkoKSk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gVGhlIGFkZHJlc3MgbWF5IGJlIGFuIEVOUyBuYW1lIG9yIEFkZHJlc3NhYmxlXG4gICAgICAgIGlmICh0eC50byAhPSBudWxsKSB7XG4gICAgICAgICAgICBjb25zdCBfdG8gPSB0eC50bztcbiAgICAgICAgICAgIHByb21pc2VzLnB1c2goKGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgICAgICB0eC50byA9IGF3YWl0IHJlc29sdmVBZGRyZXNzKF90bywgdGhpcy5wcm92aWRlcik7XG4gICAgICAgICAgICB9KSgpKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBXYWl0IHVudGlsIGFsbCBvZiBvdXIgcHJvcGVydGllcyBhcmUgZmlsbGVkIGluXG4gICAgICAgIGlmIChwcm9taXNlcy5sZW5ndGgpIHtcbiAgICAgICAgICAgIGF3YWl0IFByb21pc2UuYWxsKHByb21pc2VzKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBoZXhUeCA9IHRoaXMucHJvdmlkZXIuZ2V0UnBjVHJhbnNhY3Rpb24odHgpO1xuICAgICAgICByZXR1cm4gdGhpcy5wcm92aWRlci5zZW5kKFwiZXRoX3NlbmRUcmFuc2FjdGlvblwiLCBbaGV4VHhdKTtcbiAgICB9XG4gICAgYXN5bmMgc2VuZFRyYW5zYWN0aW9uKHR4KSB7XG4gICAgICAgIC8vIFRoaXMgY2Fubm90IGJlIG1pbmVkIGFueSBlYXJsaWVyIHRoYW4gYW55IHJlY2VudCBibG9ja1xuICAgICAgICBjb25zdCBibG9ja051bWJlciA9IGF3YWl0IHRoaXMucHJvdmlkZXIuZ2V0QmxvY2tOdW1iZXIoKTtcbiAgICAgICAgLy8gU2VuZCB0aGUgdHJhbnNhY3Rpb25cbiAgICAgICAgY29uc3QgaGFzaCA9IGF3YWl0IHRoaXMuc2VuZFVuY2hlY2tlZFRyYW5zYWN0aW9uKHR4KTtcbiAgICAgICAgLy8gVW5mb3J0dW5hdGVseSwgSlNPTi1SUEMgb25seSBwcm92aWRlcyBhbmQgb3BhcXVlIHRyYW5zYWN0aW9uIGhhc2hcbiAgICAgICAgLy8gZm9yIGEgcmVzcG9uc2UsIGFuZCB3ZSBuZWVkIHRoZSBhY3R1YWwgdHJhbnNhY3Rpb24sIHNvIHdlIHBvbGxcbiAgICAgICAgLy8gZm9yIGl0OyBpdCBzaG91bGQgc2hvdyB1cCB2ZXJ5IHF1aWNrbHlcbiAgICAgICAgcmV0dXJuIGF3YWl0IChuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgICAgICBjb25zdCB0aW1lb3V0cyA9IFsxMDAwLCAxMDBdO1xuICAgICAgICAgICAgbGV0IGludmFsaWRzID0gMDtcbiAgICAgICAgICAgIGNvbnN0IGNoZWNrVHggPSBhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgLy8gVHJ5IGdldHRpbmcgdGhlIHRyYW5zYWN0aW9uXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHR4ID0gYXdhaXQgdGhpcy5wcm92aWRlci5nZXRUcmFuc2FjdGlvbihoYXNoKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHR4ICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmUodHgucmVwbGFjZWFibGVUcmFuc2FjdGlvbihibG9ja051bWJlcikpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgICAgICAgICAvLyBJZiB3ZSB3ZXJlIGNhbmNlbGxlZDogc3RvcCBwb2xsaW5nLlxuICAgICAgICAgICAgICAgICAgICAvLyBJZiB0aGUgZGF0YSBpcyBiYWQ6IHRoZSBub2RlIHJldHVybnMgYmFkIHRyYW5zYWN0aW9uc1xuICAgICAgICAgICAgICAgICAgICAvLyBJZiB0aGUgbmV0d29yayBjaGFuZ2VkOiBjYWxsaW5nIGFnYWluIHdpbGwgYWxzbyBmYWlsXG4gICAgICAgICAgICAgICAgICAgIC8vIElmIHVuc3VwcG9ydGVkOiBsaWtlbHkgZGVzdHJveWVkXG4gICAgICAgICAgICAgICAgICAgIGlmIChpc0Vycm9yKGVycm9yLCBcIkNBTkNFTExFRFwiKSB8fCBpc0Vycm9yKGVycm9yLCBcIkJBRF9EQVRBXCIpIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICBpc0Vycm9yKGVycm9yLCBcIk5FVFdPUktfRVJST1JcIikgfHwgaXNFcnJvcihlcnJvciwgXCJVTlNVUFBPUlRFRF9PUEVSQVRJT05cIikpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlcnJvci5pbmZvID09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvci5pbmZvID0ge307XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBlcnJvci5pbmZvLnNlbmRUcmFuc2FjdGlvbkhhc2ggPSBoYXNoO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVqZWN0KGVycm9yKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAvLyBTdG9wLWdhcCBmb3IgbWlzYmVoYXZpbmcgYmFja2VuZHM7IHNlZSAjNDUxM1xuICAgICAgICAgICAgICAgICAgICBpZiAoaXNFcnJvcihlcnJvciwgXCJJTlZBTElEX0FSR1VNRU5UXCIpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpbnZhbGlkcysrO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGVycm9yLmluZm8gPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yLmluZm8gPSB7fTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yLmluZm8uc2VuZFRyYW5zYWN0aW9uSGFzaCA9IGhhc2g7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoaW52YWxpZHMgPiAxMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlamVjdChlcnJvcik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIC8vIE5vdGlmeSBhbnlvbmUgdGhhdCBjYXJlczsgYnV0IHdlIHdpbGwgdHJ5IGFnYWluLCBzaW5jZVxuICAgICAgICAgICAgICAgICAgICAvLyBpdCBpcyBsaWtlbHkgYW4gaW50ZXJtaXR0ZW50IHNlcnZpY2UgZXJyb3JcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5wcm92aWRlci5lbWl0KFwiZXJyb3JcIiwgbWFrZUVycm9yKFwiZmFpbGVkIHRvIGZldGNoIHRyYW5zYXRpb24gYWZ0ZXIgc2VuZGluZyAod2lsbCB0cnkgYWdhaW4pXCIsIFwiVU5LTk9XTl9FUlJPUlwiLCB7IGVycm9yIH0pKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgLy8gV2FpdCBhbm90aGVyIDQgc2Vjb25kc1xuICAgICAgICAgICAgICAgI
26774HRoaXMucHJvdmlkZXIuX3NldFRpbWVvdXQoKCkgPT4geyBjaGVja1R4KCk7IH0sIHRpbWVvdXRzLnBvcCgpIHx8IDQwMDApO1xuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIGNoZWNrVHgoKTtcbiAgICAgICAgfSkpO1xuICAgIH1cbiAgICBhc3luYyBzaWduVHJhbnNhY3Rpb24oX3R4KSB7XG4gICAgICAgIGNvbnN0IHR4ID0gZGVlcENvcHkoX3R4KTtcbiAgICAgICAgLy8gTWFrZSBzdXJlIHRoZSBmcm9tIG1hdGNoZXMgdGhlIHNlbmRlclxuICAgICAgICBpZiAodHguZnJvbSkge1xuICAgICAgICAgICAgY29uc3QgZnJvbSA9IGF3YWl0IHJlc29sdmVBZGRyZXNzKHR4LmZyb20sIHRoaXMucHJvdmlkZXIpO1xuICAgICAgICAgICAgYXNzZXJ0QXJndW1lbnQoZnJvbSAhPSBudWxsICYmIGZyb20udG9Mb3dlckNhc2UoKSA9PT0gdGhpcy5hZGRyZXNzLnRvTG93ZXJDYXNlKCksIFwiZnJvbSBhZGRyZXNzIG1pc21hdGNoXCIsIFwidHJhbnNhY3Rpb25cIiwgX3R4KTtcbiAgICAgICAgICAgIHR4LmZyb20gPSBmcm9tO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdHguZnJvbSA9IHRoaXMuYWRkcmVzcztcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBoZXhUeCA9IHRoaXMucHJvdmlkZXIuZ2V0UnBjVHJhbnNhY3Rpb24odHgpO1xuICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5wcm92aWRlci5zZW5kKFwiZXRoX3NpZ25UcmFuc2FjdGlvblwiLCBbaGV4VHhdKTtcbiAgICB9XG4gICAgYXN5bmMgc2lnbk1lc3NhZ2UoX21lc3NhZ2UpIHtcbiAgICAgICAgY29uc3QgbWVzc2FnZSA9ICgodHlwZW9mIChfbWVzc2FnZSkgPT09IFwic3RyaW5nXCIpID8gdG9VdGY4Qnl0ZXMoX21lc3NhZ2UpIDogX21lc3NhZ2UpO1xuICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5wcm92aWRlci5zZW5kKFwicGVyc29uYWxfc2lnblwiLCBbXG4gICAgICAgICAgICBoZXhsaWZ5KG1lc3NhZ2UpLCB0aGlzLmFkZHJlc3MudG9Mb3dlckNhc2UoKVxuICAgICAgICBdKTtcbiAgICB9XG4gICAgYXN5bmMgc2lnblR5cGVkRGF0YShkb21haW4sIHR5cGVzLCBfdmFsdWUpIHtcbiAgICAgICAgY29uc3QgdmFsdWUgPSBkZWVwQ29weShfdmFsdWUpO1xuICAgICAgICAvLyBQb3B1bGF0ZSBhbnkgRU5TIG5hbWVzIChpbi1wbGFjZSlcbiAgICAgICAgY29uc3QgcG9wdWxhdGVkID0gYXdhaXQgVHlwZWREYXRhRW5jb2Rlci5yZXNvbHZlTmFtZXMoZG9tYWluLCB0eXBlcywgdmFsdWUsIGFzeW5jICh2YWx1ZSkgPT4ge1xuICAgICAgICAgICAgY29uc3QgYWRkcmVzcyA9IGF3YWl0IHJlc29sdmVBZGRyZXNzKHZhbHVlKTtcbiAgICAgICAgICAgIGFzc2VydEFyZ3VtZW50KGFkZHJlc3MgIT0gbnVsbCwgXCJUeXBlZERhdGEgZG9lcyBub3Qgc3VwcG9ydCBudWxsIGFkZHJlc3NcIiwgXCJ2YWx1ZVwiLCB2YWx1ZSk7XG4gICAgICAgICAgICByZXR1cm4gYWRkcmVzcztcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiBhd2FpdCB0aGlzLnByb3ZpZGVyLnNlbmQoXCJldGhfc2lnblR5cGVkRGF0YV92NFwiLCBbXG4gICAgICAgICAgICB0aGlzLmFkZHJlc3MudG9Mb3dlckNhc2UoKSxcbiAgICAgICAgICAgIEpTT04uc3RyaW5naWZ5KFR5cGVkRGF0YUVuY29kZXIuZ2V0UGF5bG9hZChwb3B1bGF0ZWQuZG9tYWluLCB0eXBlcywgcG9wdWxhdGVkLnZhbHVlKSlcbiAgICAgICAgXSk7XG4gICAgfVxuICAgIGFzeW5jIHVubG9jayhwYXNzd29yZCkge1xuICAgICAgICByZXR1cm4gdGhpcy5wcm92aWRlci5zZW5kKFwicGVyc29uYWxfdW5sb2NrQWNjb3VudFwiLCBbXG4gICAgICAgICAgICB0aGlzLmFkZHJlc3MudG9Mb3dlckNhc2UoKSwgcGFzc3dvcmQsIG51bGxcbiAgICAgICAgXSk7XG4gICAgfVxuICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9ldGhlcmV1bS93aWtpL3dpa2kvSlNPTi1SUEMjZXRoX3NpZ25cbiAgICBhc3luYyBfbGVnYWN5U2lnbk1lc3NhZ2UoX21lc3NhZ2UpIHtcbiAgICAgICAgY29uc3QgbWVzc2FnZSA9ICgodHlwZW9mIChfbWVzc2FnZSkgPT09IFwic3RyaW5nXCIpID8gdG9VdGY4Qnl0ZXMoX21lc3NhZ2UpIDogX21lc3NhZ2UpO1xuICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5wcm92aWRlci5zZW5kKFwiZXRoX3NpZ25cIiwgW1xuICAgICAgICAgICAgdGhpcy5hZGRyZXNzLnRvTG93ZXJDYXNlKCksIGhleGxpZnkobWVzc2FnZSlcbiAgICAgICAgXSk7XG4gICAgfVxufVxuLyoqXG4gKiAgVGhlIEpzb25ScGNBcGlQcm92aWRlciBpcyBhbiBhYnN0cmFjdCBjbGFzcyBhbmQgKipNVVNUKiogYmVcbiAqICBzdWItY2xhc3NlZC5cbiAqXG4gKiAgSXQgcHJvdmlkZXMgdGhlIGJhc2UgZm9yIGFsbCBKU09OLVJQQy1iYXNlZCBQcm92aWRlciBpbnRlcmFjdGlvbi5cbiAqXG4gKiAgU3ViLWNsYXNzaW5nIE5vdGVzOlxuICogIC0gYSBzdWItY2xhc3MgTVVTVCBvdmVycmlkZSBfc2VuZFxuICogIC0gYSBzdWItY2xhc3MgTVVTVCBjYWxsIHRoZSBgX3N0YXJ0KClgIG1ldGhvZCBvbmNlIGNvbm5lY3RlZFxuICovXG5leHBvcnQgY2xhc3MgSnNvblJwY0FwaVByb3ZpZGVyIGV4dGVuZHMgQWJzdHJhY3RQcm92aWRlciB7XG4gICAgI29wdGlvbnM7XG4gICAgLy8gVGhlIG5leHQgSUQgdG8gdXNlIGZvciB0aGUgSlNPTi1SUEMgSUQgZmllbGRcbiAgICAjbmV4dElkO1xuICAgIC8vIFBheWxvYWRzIGFyZSBxdWV1ZWQgYW5kIHRyaWdnZXJlZCBpbiBiYXRjaGVzIHVzaW5nIHRoZSBkcmFpblRpbWVyXG4gICAgI3BheWxvYWRzO1xuICAgICNkcmFpblRpbWVyO1xuICAgICNub3RSZWFkeTtcbiAgICAjbmV0d29yaztcbiAgICAjcGVuZGluZ0RldGVjdE5ldHdvcms7XG4gICAgI3NjaGVkdWxlRHJhaW4oKSB7XG4gICAgICAgIGlmICh0aGlzLiNkcmFpblRpbWVyKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgLy8gSWYgd2UgYXJlbid0IHVzaW5nIGJhdGNoaW5nLCBubyBoYXJtIGluIHNlbmRpbmcgaXQgaW1tZWRpYXRlbHlcbiAgICAgICAgY29uc3Qgc3RhbGxUaW1lID0gKHRoaXMuX2dldE9wdGlvbihcImJhdGNoTWF4Q291bnRcIikgPT09IDEpID8gMCA6IHRoaXMuX2dldE9wdGlvbihcImJhdGNoU3RhbGxUaW1lXCIpO1xuICAgICAgICB0aGlzLiNkcmFpblRpbWVyID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLiNkcmFpblRpbWVyID0gbnVsbDtcbiAgICAgICAgICAgIGNvbnN0IHBheWxvYWRzID0gdGhpcy4jcGF5bG9hZHM7XG4gICAgICAgICAgICB0aGlzLiNwYXlsb2FkcyA9IFtdO1xuICAgICAgICAgICAgd2hpbGUgKHBheWxvYWRzLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgIC8vIENyZWF0ZSBwYXlsb2FkIGJhdGNoZXMgdGhhdCBzYXRpc2Z5IG91ciBiYXRjaCBjb25zdHJhaW50c1xuICAgICAgICAgICAgICAgIGNvbnN0IGJhdGNoID0gWyhwYXlsb2Fkcy5zaGlmdCgpKV07XG4gICAgICAgICAgICAgICAgd2hpbGUgKHBheWxvYWRzLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoYmF0Y2gubGVuZ3RoID09PSB0aGlzLiNvcHRpb25zLmJhdGNoTWF4Q291bnQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGJhdGNoLnB1c2goKHBheWxvYWRzLnNoaWZ0KCkpKTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgYnl0ZXMgPSBKU09OLnN0cmluZ2lmeShiYXRjaC5tYXAoKHApID0+IHAucGF5bG9hZCkpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoYnl0ZXMubGVuZ3RoID4gdGhpcy4jb3B0aW9ucy5iYXRjaE1heFNpemUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgI
26774HBheWxvYWRzLnVuc2hpZnQoKGJhdGNoLnBvcCgpKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAvLyBQcm9jZXNzIHRoZSByZXN1bHQgdG8gZWFjaCBwYXlsb2FkXG4gICAgICAgICAgICAgICAgKGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcGF5bG9hZCA9ICgoYmF0Y2gubGVuZ3RoID09PSAxKSA/IGJhdGNoWzBdLnBheWxvYWQgOiBiYXRjaC5tYXAoKHApID0+IHAucGF5bG9hZCkpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmVtaXQoXCJkZWJ1Z1wiLCB7IGFjdGlvbjogXCJzZW5kUnBjUGF5bG9hZFwiLCBwYXlsb2FkIH0pO1xuICAgICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5fc2VuZChwYXlsb2FkKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZW1pdChcImRlYnVnXCIsIHsgYWN0aW9uOiBcInJlY2VpdmVScGNSZXN1bHRcIiwgcmVzdWx0IH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gUHJvY2VzcyByZXN1bHRzIGluIGJhdGNoIG9yZGVyXG4gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IHsgcmVzb2x2ZSwgcmVqZWN0LCBwYXlsb2FkIH0gb2YgYmF0Y2gpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5kZXN0cm95ZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVqZWN0KG1ha2VFcnJvcihcInByb3ZpZGVyIGRlc3Ryb3llZDsgY2FuY2VsbGVkIHJlcXVlc3RcIiwgXCJVTlNVUFBPUlRFRF9PUEVSQVRJT05cIiwgeyBvcGVyYXRpb246IHBheWxvYWQubWV0aG9kIH0pKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEZpbmQgdGhlIG1hdGNoaW5nIHJlc3VsdFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlc3AgPSByZXN1bHQuZmlsdGVyKChyKSA9PiAoci5pZCA9PT0gcGF5bG9hZC5pZCkpWzBdO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIE5vIHJlc3VsdDsgdGhlIG5vZGUgZmFpbGVkIHVzIGluIHVuZXhwZWN0ZWQgd2F5c1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZXNwID09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZXJyb3IgPSBtYWtlRXJyb3IoXCJtaXNzaW5nIHJlc3BvbnNlIGZvciByZXF1ZXN0XCIsIFwiQkFEX0RBVEFcIiwge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6IHJlc3VsdCwgaW5mbzogeyBwYXlsb2FkIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZW1pdChcImVycm9yXCIsIGVycm9yKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVqZWN0KGVycm9yKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRoZSByZXNwb25zZSBpcyBhbiBlcnJvclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChcImVycm9yXCIgaW4gcmVzcCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWplY3QodGhpcy5nZXRScGNFcnJvcihwYXlsb2FkLCByZXNwKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBBbGwgZ29vZDsgc2VuZCB0aGUgcmVzdWx0XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZShyZXNwLnJlc3VsdCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmVtaXQoXCJkZWJ1Z1wiLCB7IGFjdGlvbjogXCJyZWNlaXZlUnBjRXJyb3JcIiwgZXJyb3IgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IHsgcmVqZWN0IH0gb2YgYmF0Y2gpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBAVE9ETzogYXVnbWVudCB0aGUgZXJyb3Igd2l0aCB0aGUgcGF5bG9hZFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlamVjdChlcnJvcik7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LCBzdGFsbFRpbWUpO1xuICAgIH1cbiAgICBjb25zdHJ1Y3RvcihuZXR3b3JrLCBvcHRpb25zKSB7XG4gICAgICAgIHN1cGVyKG5ldHdvcmssIG9wdGlvbnMpO1xuICAgICAgICB0aGlzLiNuZXh0SWQgPSAxO1xuICAgICAgICB0aGlzLiNvcHRpb25zID0gT2JqZWN0LmFzc2lnbih7fSwgZGVmYXVsdE9wdGlvbnMsIG9wdGlvbnMgfHwge30pO1xuICAgICAgICB0aGlzLiNwYXlsb2FkcyA9IFtdO1xuICAgICAgICB0aGlzLiNkcmFpblRpbWVyID0gbnVsbDtcbiAgICAgICAgdGhpcy4jbmV0d29yayA9IG51bGw7XG4gICAgICAgIHRoaXMuI3BlbmRpbmdEZXRlY3ROZXR3b3JrID0gbnVsbDtcbiAgICAgICAge1xuICAgICAgICAgICAgbGV0IHJlc29sdmUgPSBudWxsO1xuICAgICAgICAgICAgY29uc3QgcHJvbWlzZSA9IG5ldyBQcm9taXNlKChfcmVzb2x2ZSkgPT4ge1xuICAgICAgICAgICAgICAgIHJlc29sdmUgPSBfcmVzb2x2ZTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgdGhpcy4jbm90UmVhZHkgPSB7IHByb21pc2UsIHJlc29sdmUgfTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBzdGF0aWNOZXR3b3JrID0gdGhpcy5fZ2V0T3B0aW9uKFwic3RhdGljTm
26774V0d29ya1wiKTtcbiAgICAgICAgaWYgKHR5cGVvZiAoc3RhdGljTmV0d29yaykgPT09IFwiYm9vbGVhblwiKSB7XG4gICAgICAgICAgICBhc3NlcnRBcmd1bWVudCghc3RhdGljTmV0d29yayB8fCBuZXR3b3JrICE9PSBcImFueVwiLCBcInN0YXRpY05ldHdvcmsgY2Fubm90IGJlIHVzZWQgb24gc3BlY2lhbCBuZXR3b3JrICdhbnknXCIsIFwib3B0aW9uc1wiLCBvcHRpb25zKTtcbiAgICAgICAgICAgIGlmIChzdGF0aWNOZXR3b3JrICYmIG5ldHdvcmsgIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIHRoaXMuI25ldHdvcmsgPSBOZXR3b3JrLmZyb20obmV0d29yayk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoc3RhdGljTmV0d29yaykge1xuICAgICAgICAgICAgLy8gTWFrZSBzdXJlIGFueSBzdGF0aWMgbmV0d29yayBpcyBjb21wYXRiaWxlIHdpdGggdGhlIHByb3ZpZGVkIG5ldHdyb2tcbiAgICAgICAgICAgIGFzc2VydEFyZ3VtZW50KG5ldHdvcmsgPT0gbnVsbCB8fCBzdGF0aWNOZXR3b3JrLm1hdGNoZXMobmV0d29yayksIFwic3RhdGljTmV0d29yayBNVVNUIG1hdGNoIG5ldHdvcmsgb2JqZWN0XCIsIFwib3B0aW9uc1wiLCBvcHRpb25zKTtcbiAgICAgICAgICAgIHRoaXMuI25ldHdvcmsgPSBzdGF0aWNOZXR3b3JrO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqICBSZXR1cm5zIHRoZSB2YWx1ZSBhc3NvY2lhdGVkIHdpdGggdGhlIG9wdGlvbiAlJWtleSUlLlxuICAgICAqXG4gICAgICogIFN1Yi1jbGFzc2VzIGNhbiB1c2UgdGhpcyB0byBpbnF1aXJlIGFib3V0IGNvbmZpZ3VyYXRpb24gb3B0aW9ucy5cbiAgICAgKi9cbiAgICBfZ2V0T3B0aW9uKGtleSkge1xuICAgICAgICByZXR1cm4gdGhpcy4jb3B0aW9uc1trZXldO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiAgR2V0cyB0aGUgW1tOZXR3b3JrXV0gdGhpcyBwcm92aWRlciBoYXMgY29tbWl0dGVkIHRvLiBPbiBlYWNoIGNhbGwsIHRoZSBuZXR3b3JrXG4gICAgICogIGlzIGRldGVjdGVkLCBhbmQgaWYgaXQgaGFzIGNoYW5nZWQsIHRoZSBjYWxsIHdpbGwgcmVqZWN0LlxuICAgICAqL1xuICAgIGdldCBfbmV0d29yaygpIHtcbiAgICAgICAgYXNzZXJ0KHRoaXMuI25ldHdvcmssIFwibmV0d29yayBpcyBub3QgYXZhaWxhYmxlIHlldFwiLCBcIk5FVFdPUktfRVJST1JcIik7XG4gICAgICAgIHJldHVybiB0aGlzLiNuZXR3b3JrO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiAgUmVzb2x2ZXMgdG8gdGhlIG5vbi1ub3JtYWxpem
26774VkIHZhbHVlIGJ5IHBlcmZvcm1pbmcgJSVyZXElJS5cbiAgICAgKlxuICAgICAqICBTdWItY2xhc3NlcyBtYXkgb3ZlcnJpZGUgdGhpcyB0byBtb2RpZnkgYmVoYXZpb3Igb2YgYWN0aW9ucyxcbiAgICAgKiAgYW5kIHNob3VsZCBnZW5lcmFsbHkgY2FsbCBgYHN1cGVyLl9wZXJmb3JtYGAgYXMgYSBmYWxsYmFjay5cbiAgICAgKi9cbiAgICBhc3luYyBfcGVyZm9ybShyZXEpIHtcbiAgICAgICAgLy8gTGVnYWN5IG5ldHdvcmtzIGRvIG5vdCBsaWtlIHRoZSB0eXBlIGZpZWxkIGJlaW5nIHBhc3NlZCBhbG9uZyAod2hpY2hcbiAgICAgICAgLy8gaXMgZmFpciksIHNvIHdlIGRlbGV0ZSB0eXBlIGlmIGl0IGlzIDAgYW5kIGEgbm9uLUVJUC0xNTU5IG5ldHdvcmtcbiAgICAgICAgaWYgKHJlcS5tZXRob2QgPT09IFwiY2FsbFwiIHx8IHJlcS5tZXRob2QgPT09IFwiZXN0aW1hdGVHYXNcIikge1xuICAgICAgICAgICAgbGV0IHR4ID0gcmVxLnRyYW5zYWN0aW9uO1xuICAgICAgICAgICAgaWYgKHR4ICYmIHR4LnR5cGUgIT0gbnVsbCAmJiBnZXRCaWdJbnQodHgudHlwZSkpIHtcbiAgICAgICAgICAgICAgICAvLyBJZiB0aGVyZSBhcmUgbm8gRUlQLTE1NTkgb3IgbmV3ZXIgcHJvcGVydGllcywgaXQgbWlnaHQgYmUgcHJlLUVJUC0xNTU5XG4gICAgICAgICAgICAgICAgaWYgKHR4Lm1heEZlZVBlckdhcyA9PSBudWxsICYmIHR4Lm1heFByaW9yaXR5RmVlUGVyR2FzID09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZmVlRGF0YSA9IGF3YWl0IHRoaXMuZ2V0RmVlRGF0YSgpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoZmVlRGF0YS5tYXhGZWVQZXJHYXMgPT0gbnVsbCAmJiBmZWVEYXRhLm1heFByaW9yaXR5RmVlUGVyR2FzID09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIE5ldHdvcmsgZG9lc24ndCBrbm93IGFib3V0IEVJUC0xNTU5IChhbmQgaGVuY2UgdHlwZSlcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlcSA9IE9iamVjdC5hc3NpZ24oe30sIHJlcSwge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zYWN0aW9uOiBPYmplY3QuYXNzaWduKHt9LCB0eCwgeyB0eXBlOiB1bmRlZmluZWQgfSlcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHJlcXVlc3QgPSB0aGlzLmdldFJwY1JlcXVlc3QocmVxKTtcbiAgICAgICAgaWYgKHJlcXVlc3QgIT0gbnVsbCkge1xuICAgICAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuc2VuZChyZXF1ZXN0Lm1ldGhvZCwgcmVxdWVzdC5hcmdzKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gc3VwZXIuX3BlcmZvcm0ocmVxKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogIFN1Yi1jbGFzc2VzIG1heSBvdmVycmlkZSB0aGlzOyBpdCBkZXRlY3RzIHRoZSAqYWN0dWFsKiBuZXR3b3JrIHRoYXRcbiAgICAgKiAgd2UgYXJlICoqY3VycmVudGx5KiogY29ubmVjdGVkIHRvLlxuICAgICAqXG4gICAgICogIEtlZXAgaW4gbWluZCB0aGF0IFtbc2VuZF1dIG1heSBvbmx5IGJlIHVzZWQgb25jZSBbW3JlYWR5XV0sIG90aGVyd2lzZSB0aGVcbiAgICAgKiAgX3NlbmQgcHJpbWl0aXZlIG11c3QgYmUgdXNlZCBpbnN0ZWFkLlxuICAgICAqL1xuICAgIGFzeW5jIF9kZXRlY3ROZXR3b3JrKCkge1xuICAgICAgICBjb25zdCBuZXR3b3JrID0gdGhpcy5fZ2V0T3B0aW9uKFwic3RhdGljTmV0d29ya1wiKTtcbiAgICAgICAgaWYgKG5ldHdvcmspIHtcbiAgICAgICAgICAgIGlmIChuZXR3b3JrID09PSB0cnVlKSB7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuI25ldHdvcmspIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuI25ldHdvcms7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG5ldHdvcms7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuI3BlbmRpbmdEZXRlY3ROZXR3b3JrKSB7XG4gICAgICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy4jcGVuZGluZ0RldGVjdE5ldHdvcms7XG4gICAgICAgIH1cbiAgICAgICAgLy8gSWYgd2UgYXJlIHJlYWR5LCB1c2UgYGBzZW5kYGAsIHdoaWNoIGVuYWJsZWQgcmVxdWVzdHMgdG8gYmUgYmF0Y2hlZFxuICAgICAgICBpZiAodGhpcy5yZWFkeSkge1xuICAgICAgICAgICAgdGhpcy4jcGVuZGluZ0RldGVjdE5ldHdvcmsgPSAoYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IE5ldHdvcmsuZnJvbShnZXRCaWdJbnQoYXdhaXQgdGhpcy5zZW5kKFwiZXRoX2NoYWluSWRcIiwgW10pKSk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuI3BlbmRpbmdEZXRlY3ROZXR3b3JrID0gbnVsbDtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuI3BlbmRpbmdEZXRlY3ROZXR3b3JrID0gbnVsbDtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSkoKTtcbiAgICAgICAgICAgIHJldHVybiBhd2FpdCB0aGlzLiNwZW5kaW5nRGV0ZWN0TmV0d29yaztcbiAgICAgICAgfVxuICAgICAgICAvLyBXZSBhcmUgbm90IHJlYWR5IHlldDsgdXNlIHRoZSBwcmltaXRpdmUgX3NlbmRcbiAgICAgICAgdGhpcy4jcGVuZGluZ0RldGVjdE5ldHdvcmsgPSAoYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgcGF5bG9hZCA9IHtcbiAgICAgICAgICAgICAgICBpZDogdGhpcy4jbmV4dElkKyssIG1ldGhvZDogXCJldGhfY2hhaW5JZFwiLCBwYXJhbXM6IFtdLCBqc29ucnBjOiBcIjIuMFwiXG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgdGhpcy5lbWl0KFwiZGVidWdcIiwgeyBhY3Rpb246IFwic2VuZFJwY1BheWxvYWRcIiwgcGF5bG9hZCB9KTtcbiAgICAgICAgICAgIGxldCByZXN1bHQ7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgI
26774HJlc3VsdCA9IChhd2FpdCB0aGlzLl9zZW5kKHBheWxvYWQpKVswXTtcbiAgICAgICAgICAgICAgICB0aGlzLiNwZW5kaW5nRGV0ZWN0TmV0d29yayA9IG51bGw7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgICAgICB0aGlzLiNwZW5kaW5nRGV0ZWN0TmV0d29yayA9IG51bGw7XG4gICAgICAgICAgICAgICAgdGhpcy5lbWl0KFwiZGVidWdcIiwgeyBhY3Rpb246IFwicmVjZWl2ZVJwY0Vycm9yXCIsIGVycm9yIH0pO1xuICAgICAgICAgICAgICAgIHRocm93IGVycm9yO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5lbWl0KFwiZGVidWdcIiwgeyBhY3Rpb246IFwicmVjZWl2ZVJwY1Jlc3VsdFwiLCByZXN1bHQgfSk7XG4gICAgICAgICAgICBpZiAoXCJyZXN1bHRcIiBpbiByZXN1bHQpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gTmV0d29yay5mcm9tKGdldEJpZ0ludChyZXN1bHQucmVzdWx0KSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aHJvdyB0aGlzLmdldFJwY0Vycm9yKHBheWxvYWQsIHJlc3VsdCk7XG4gICAgICAgIH0pKCk7XG4gICAgICAgIHJldHVybiBhd2FpdCB0aGlzLiNwZW5kaW5nRGV0ZWN0TmV0d29yaztcbiAgICB9XG4gICAgLyoqXG4gICAgICogIFN1Yi1jbGFzc2VzICoqTVVTVCoqIGNhbGwgdGhpcy4gVW50aWwgW1tfc3RhcnRdXSBoYXMgYmVlbiBjYWxsZWQsIG5vIGNhbGxzXG4gICAgICogIHdpbGwgYmUgcGFzc2VkIHRvIFtbX3NlbmRdXSBmcm9tIFtbc2VuZF1dLiBJZiBpdCBpcyBvdmVycmlkZGVuLCB0aGVuXG4gICAgICogIGBgc3VwZXIuX3N0YXJ0KClgYCAqKk1VU1QqKiBiZSBjYWxsZWQuXG4gICAgICpcbiAgICAgKiAgQ2FsbGluZyBpdCBtdWx0aXBsZSB0aW1lcyBpcyBzYWZlIGFuZCBoYXMgbm8gZWZmZWN0LlxuICAgICAqL1xuICAgIF9zdGFydCgpIHtcbiAgICAgICAgaWYgKHRoaXMuI25vdFJlYWR5ID09IG51bGwgfHwgdGhpcy4jbm90UmVhZHkucmVzb2x2ZSA9PSBudWxsKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy4jbm90UmVhZHkucmVzb2x2ZSgpO1xuICAgICAgICB0aGlzLiNub3RSZWFkeSA9IG51bGw7XG4gICAgICAgIChhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICAvLyBCb290c3RyYXAgdGhlIG5ldHdvcmtcbiAgICAgICAgICAgIHdoaWxlICh0aGlzLiNuZXR3b3JrID09IG51bGwgJiYgIXRoaXMuZGVzdHJveWVkKSB7XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy4jbmV0d29yayA9IGF3YWl0IHRoaXMuX2RldGVjdE5ldHdvcmsoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmRlc3Ryb3llZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coXCJKc29uUnBjUHJvdmlkZXIgZmFpbGVkIHRvIGRldGVjdCBuZXR3b3JrIGFuZCBjYW5ub3Qgc3RhcnQgdXA7IHJldHJ5IGluIDFzIChwZXJoYXBzIHRoZSBVUkwgaXMgd3Jvbmcgb3IgdGhlIG5vZGUgaXMgbm90IHN0YXJ0ZWQpXCIpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmVtaXQoXCJlcnJvclwiLCBtYWtlRXJyb3IoXCJmYWlsZWQgdG8gYm9vdHN0cmFwIG5ldHdvcmsgZGV0ZWN0aW9uXCIsIFwiTkVUV09SS19FUlJPUlwiLCB7IGV2ZW50OiBcImluaXRpYWwtbmV0d29yay1kaXNjb3ZlcnlcIiwgaW5mbzogeyBlcnJvciB9IH0pKTtcbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgc3RhbGwoMTAwMCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gU3RhcnQgZGlzcGF0Y2hpbmcgcmVxdWVzdHNcbiAgICAgICAgICAgIHRoaXMuI3NjaGVkdWxlRHJhaW4oKTtcbiAgICAgICAgfSkoKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogIFJlc29sdmVzIG9uY2UgdGhlIFtbX3N0YXJ0XV0gaGFzIGJlZW4gY2FsbGVkLiBUaGlzIGNhbiBiZSB1c2VkIGluXG4gICAgICogIHN1Yi1jbGFzc2VzIHRvIGRlZmVyIHNlbmRpbmcgZGF0YSB1bnRpbCB0aGUgY29ubmVjdGlvbiBoYXMgYmVlblxuICAgICAqICBlc3RhYmxpc2hlZC5cbiAgICAgKi9cbiAgICBhc3luYyBfd2FpdFVudGlsUmVhZHkoKSB7XG4gICAgICAgIGlmICh0aGlzLiNub3RSZWFkeSA9PSBudWxsKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuI25vdFJlYWR5LnByb21pc2U7XG4gICAgfVxuICAgIC8qKlxuICAgICAqICBSZXR1cm4gYSBTdWJzY3JpYmVyIHRoYXQgd2lsbCBtYW5hZ2UgdGhlICUlc3ViJSUuXG4gICAgICpcbiAgICAgKiAgU3ViLWNsYXNzZXMgbWF5IG92ZXJyaWRlIHRoaXMgdG8gbW9kaWZ5IHRoZSBiZWhhdmlvciBvZlxuICAgICAqICBzdWJzY3JpcHRpb24gbWFuYWdlbWVudC5cbiAgICAgKi9cbiAgICBfZ2V0U3Vic2NyaWJlcihzdWIpIHtcbiAgICAgICAgLy8gUGVuZGluZyBGaWx0ZXJzIGFyZW4ndCBhdmFpbGJsZSB2aWEgcG9sbGluZ1xuICAgICAgICBpZiAoc3ViLnR5cGUgPT09IFwicGVuZGluZ1wiKSB7XG4gICAgICAgICAgICByZXR1cm4gbmV3IEZpbHRlcklkUGVuZGluZ1N1YnNjcmliZXIodGhpcyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHN1Yi50eXBlID09PSBcImV2ZW50XCIpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLl9nZXRPcHRpb24oXCJwb2xsaW5nXCIpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBQb2xsaW5nRXZlbnRTdWJzY3JpYmVyKHRoaXMsIHN1Yi5maWx0ZXIpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIG5ldyBGaWx0ZXJJZEV2ZW50U3Vic2NyaWJlcih0aGlzLCBzdWIuZmlsdGVyKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBPcnBoYW5lZCBMb2dzIGFyZSBoYW5kbGVkIGF1dG9tYXRpY2FsbHksIGJ5IHRoZSBmaWx0ZXIsIHNpbmNlXG4gICAgICAgIC8vIGxvZ3Mgd2l0aCByZW1vdmVkIGFyZSBlbWl0dGVkIGJ5IGl0XG4gICAgICAgIGlmIChzdWIudHlwZSA9PT0gXCJvcnBoYW5cIiAmJiBzdWIuZmlsdGVyLm9ycGhhbiA9PT0gXCJkcm9wLWxvZ1wiKSB7XG4gICAgICAgICAgICByZXR1cm4gbmV3IFVubWFuYWdlZFN1YnNjcmliZXIoXCJvcnBoYW5cIik7XG4gICAgICAgI
26774H1cbiAgICAgICAgcmV0dXJuIHN1cGVyLl9nZXRTdWJzY3JpYmVyKHN1Yik7XG4gICAgfVxuICAgIC8qKlxuICAgICAqICBSZXR1cm5zIHRydWUgb25seSBpZiB0aGUgW1tfc3RhcnRdXSBoYXMgYmVlbiBjYWxsZWQuXG4gICAgICovXG4gICAgZ2V0IHJlYWR5KCkgeyByZXR1cm4gdGhpcy4jbm90UmVhZHkgPT0gbnVsbDsgfVxuICAgIC8qKlxuICAgICAqICBSZXR1cm5zICUldHglJSBhcyBhIG5vcm1hbGl6ZWQgSlNPTi1SUEMgdHJhbnNhY3Rpb24gcmVxdWVzdCxcbiAgICAgKiAgd2hpY2ggaGFzIGFsbCB2YWx1ZXMgaGV4bGlmaWVkIGFuZCBhbnkgbnVtZXJpYyB2YWx1ZXMgY29udmVydGVkXG4gICAgICogIHRvIFF1YW50aXR5IHZhbHVlcy5cbiAgICAgKi9cbiAgICBnZXRScGNUcmFuc2FjdGlvbih0eCkge1xuICAgICAgICBjb25zdCByZXN1bHQgPSB7fTtcbiAgICAgICAgLy8gSlNPTi1SUEMgbm93IHJlcXVpcmVzIG51bWVyaWMgdmFsdWVzIHRvIGJlIFwicXVhbnRpdHlcIiB2YWx1ZXNcbiAgICAgICAgW1wiY2hhaW5JZFwiLCBcImdhc0xpbWl0XCIsIFwiZ2FzUHJpY2VcIiwgXCJ0eXBlXCIsIFwibWF4RmVlUGVyR2FzXCIsIFwibWF4UHJpb3JpdHlGZWVQZXJHYXNcIiwgXCJub25jZVwiLCBcInZhbHVlXCJdLmZvckVhY2goKGtleSkgPT4ge1xuICAgICAgICAgICAgaWYgKHR4W2tleV0gPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGxldCBkc3RLZXkgPSBrZXk7XG4gICAgICAgICAgICBpZiAoa2V5ID09PSBcImdhc0xpbWl0XCIpIHtcbiAgICAgICAgICAgICAgICBkc3RLZXkgPSBcImdhc1wiO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmVzdWx0W2RzdEtleV0gPSB0b1F1YW50aXR5KGdldEJpZ0ludCh0eFtrZXldLCBgdHguJHtrZXl9YCkpO1xuICAgICAgICB9KTtcbiAgICAgICAgLy8gTWFrZSBzdXJlIGFkZHJlc3NlcyBhbmQgZGF0YSBhcmUgbG93ZXJjYXNlXG4gICAgICAgIFtcImZyb21cIiwgXCJ0b1wiLCBcImRhdGFcIl0uZm9yRWFjaCgoa2V5KSA9PiB7XG4gICAgICAgICAgICBpZiAodHhba2V5XSA9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmVzdWx0W2tleV0gPSBoZXhsaWZ5KHR4W2tleV0pO1xuICAgICAgICB9KTtcbiAgICAgICAgLy8gTm9ybWFsaXplIHRoZSBhY2Nlc3MgbGlzdCBvYmplY3RcbiAgICAgICAgaWYgKHR4LmFjY2Vzc0xpc3QpIHtcbiAgICAgICAgICAgIHJlc3VsdFtcImFjY2Vzc0xpc3RcIl0gPSBhY2Nlc3NMaXN0aWZ5KHR4LmFjY2Vzc0xpc3QpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eC5ibG9iVmVyc2lvbmVkSGFzaGVzKSB7XG4gICAgICAgICAgICAvLyBAVE9ETzogUmVtb3ZlIHRoaXMgPGFueT4gY2FzZSBvbmNlIEVJUC00ODQ0IGFkZGVkIHRvIHByZXBhcmVkIHR4XG4gICAgICAgICAgICByZXN1bHRbXCJibG9iVmVyc2lvbmVkSGFzaGVzXCJdID0gdHguYmxvYlZlcnNpb25lZEhhc2hlcy5tYXAoaCA9PiBoLnRvTG93ZXJDYXNlKCkpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eC5hdXRob3JpemF0aW9uTGlzdCkge1xuICAgICAgICAgICAgcmVzdWx0W1wiYXV0aG9yaXphdGlvbkxpc3RcIl0gPSB0eC5hdXRob3JpemF0aW9uTGlzdC5tYXAoKF9hKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgYSA9IGF1dGhvcml6YXRpb25pZnkoX2EpO1xuICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICAgIGFkZHJlc3M6IGEuYWRkcmVzcyxcbiAgICAgICAgICAgICAgICAgICAgbm9uY2U6IHRvUXVhbnRpdHkoYS5ub25jZSksXG4gICAgICAgICAgICAgICAgICAgIGNoYWluSWQ6IHRvUXVhbnRpdHkoYS5jaGFpbklkKSxcbiAgICAgICAgICAgICAgICAgICAgeVBhcml0eTogdG9RdWFudGl0eShhLnNpZ25hdHVyZS55UGFyaXR5KSxcbiAgICAgICAgICAgICAgICAgICAgcjogdG9RdWFudGl0eShhLnNpZ25hdHVyZS5yKSxcbiAgICAgICAgICAgICAgICAgICAgczogdG9RdWFudGl0eShhLnNpZ25hdHVyZS5zKSxcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gQFRPRE86IGJsb2JzIHNob3VsZCBwcm9iYWJseSBhbHNvIGJlIGNvcGllZCBvdmVyLCBvcHRpb25hbGx5XG4gICAgICAgIC8vIGFjY291bnRpbmcgZm9yIHRoZSBremcgcHJvcGVydHkgdG8gYmFja2ZpbGwgYmxvYlZlcnNpb25lZEhhc2hlc1xuICAgICAgICAvLyB1c2luZyB0aGUgY29tbWl0bWVudC4gT3Igc2hvdWxkIHRoYXQgYmUgbGVmdCBhcyBhbiBleGVyY2lzZSB0b1xuICAgICAgICAvLyB0aGUgY2FsbGVyP1xuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbiAgICAvKipcbiAgICAgKiAgUmV0dXJucyB0aGUgcmVxdWVzdCBtZXRob2QgYW5kIGFyZ3VtZW50cyByZXF1aXJlZCB0byBwZXJmb3JtXG4gICAgICogICUlcmVxJSUuXG4gICAgICovXG4gICAgZ2V0UnBjUmVxdWVzdChyZXEpIHtcbiAgICAgICAgc3dpdGNoIChyZXEubWV0aG9kKSB7XG4gICAgICAgICAgICBjYXNlIFwiY2hhaW5JZFwiOlxuICAgICAgICAgICAgICAgIHJldHVybiB7IG1ldGhvZDogXCJldGhfY2hhaW5JZFwiLCBhcmdzOiBbXSB9O1xuICAgICAgICAgICAgY2FzZSBcImdldEJsb2NrTnVtYmVyXCI6XG4gICAgICAgICAgICAgICAgcmV0dXJuIHsgbWV0aG9kOiBcImV0aF9ibG9ja051bWJlclwiLCBhcmdzOiBbXSB9O1xuICAgICAgICAgICAgY2FzZSBcImdldEdhc1ByaWNlXCI6XG4gICAgICAgICAgICAgICAgcmV0dXJuIHsgbWV0aG9kOiBcImV0aF9nYXNQcmljZVwiLCBhcmdzOiBbXSB9O1xuICAgICAgICAgICAgY2FzZSBcImdldFByaW9yaXR5RmVlXCI6XG4gICAgICAgICAgICAgICAgcmV0dXJuIHsgbWV0aG9kOiBcImV0aF9tYXhQcmlvcml0eUZlZVBlckdhc1wiLCBhcmdzOiBbXSB9O1xuICAgICAgICAgICAgY2FzZSBcImdldEJhbGFuY2VcIjpcbiAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgICBtZXRob2Q6IFwiZXRoX2dldEJhbGFuY2VcIixcbiAgICAgICAgICAgICAgICAgICAgYXJnczogW2dldExvd2VyQ2FzZShyZXEuYWRkcmVzcyksIHJlcS5ibG9ja1RhZ11cbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgY2FzZSBcImdldFRyYW5zYWN0aW9uQ291bnRcIjpcbiAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgICBtZXRob2Q6IFwiZXRoX2dldFRyYW5zYWN0aW9uQ291bnRcIixcbiAgICAgICAgICAgICAgICAgICAgYXJnczogW2dldExvd2VyQ2FzZShyZXEuYWRkcmVzcyksIHJlcS5ibG9ja1RhZ11cbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgY2FzZSBcImdldENvZGVcIjpcbiAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgICBtZXRob2Q6IFwiZXRoX2dldENvZGVcIixcbiAgICAgICAgICAgICAgICAgICAgYXJnczogW2dldExvd2VyQ2FzZShyZXEuYWRkcmVzcyksIHJlcS5ibG9ja1RhZ11cbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgY2FzZSBcImdldFN0b3JhZ2VcIjpcbiAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgICBtZXRob2Q6IFwiZXRoX2dldFN0b3JhZ2VBdFwiLFxuICAgICAgICAgICAgICAgICAgICBhcmdzOiBbXG4gICAgICAgICAgICAgICAgICAgICAgICBnZXRMb3dlckNhc2UocmVxLmFkZHJlc3MpLFxuICAgICAgICAgICAgICAgICAgICAgICAgKFwiMHhcIiArIHJlcS5wb3NpdGlvbi50b1N0cmluZygxNikpLFxuICAgICAgICAgICAgICAgICAgICAgICAgcmVxLmJsb2NrVGFnXG4gICAgICAgICAgICAgICAgICAgIF1cbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgY2FzZSBcImJyb2FkY2FzdFRyYW5zYWN0aW9uXCI6XG4gICAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAgICAgbWV0aG9kOiBcImV0aF9zZW5kUmF3VHJhbnNhY3Rpb25cIixcbiAgICAgICAgICAgICAgICAgICAgYXJnczogW3JlcS5zaWduZWRUcmFuc2FjdGlvbl1cbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgY2FzZSBcImdldEJsb2NrXCI6XG4gICAgICAgICAgICAgICAgaWYgKFwiYmxvY2tUYWdcIiBpbiByZXEpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG1ldGhvZDogXCJldGhfZ2V0QmxvY2tCeU51bWJlclwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgYXJnczogW3JlcS5ibG9ja1RhZywgISFyZXEuaW5jbHVkZVRyYW5zYWN0aW9uc11cbiAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSBpZiAoXCJibG9ja0hhc2hcIiBpbiByZXEpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG1ldGhvZDogXCJldGhfZ2V0QmxvY2tCeUhhc2hcIixcbiAgICAgICAgICAgICAgICAgICAgICAgIGFyZ3M6IFtyZXEuYmxvY2tIYXNoLCAhIXJlcS5pbmNsdWRlVHJhbnNhY3Rpb25zXVxuICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgI
26774H1cbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgXCJnZXRUcmFuc2FjdGlvblwiOlxuICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICAgIG1ldGhvZDogXCJldGhfZ2V0VHJhbnNhY3Rpb25CeUhhc2hcIixcbiAgICAgICAgICAgICAgICAgICAgYXJnczogW3JlcS5oYXNoXVxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICBjYXNlIFwiZ2V0VHJhbnNhY3Rpb25SZWNlaXB0XCI6XG4gICAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAgICAgbWV0aG9kOiBcImV0aF9nZXRUcmFuc2FjdGlvblJlY2VpcHRcIixcbiAgICAgICAgICAgICAgICAgICAgYXJnczogW3JlcS5oYXNoXVxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICBjYXNlIFwiY2FsbFwiOlxuICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICAgIG1ldGhvZDogXCJldGhfY2FsbFwiLFxuICAgICAgICAgICAgICAgICAgICBhcmdzOiBbdGhpcy5nZXRScGNUcmFuc2FjdGlvbihyZXEudHJhbnNhY3Rpb24pLCByZXEuYmxvY2tUYWddXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIGNhc2UgXCJlc3RpbWF0ZUdhc1wiOiB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAgICAgbWV0aG9kOiBcImV0aF9lc3RpbWF0ZUdhc1wiLFxuICAgICAgICAgICAgICAgICAgICBhcmdzOiBbdGhpcy5nZXRScGNUcmFuc2FjdGlvbihyZXEudHJhbnNhY3Rpb24pXVxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXNlIFwiZ2V0TG9nc1wiOlxuICAgICAgICAgICAgICAgIGlmIChyZXEuZmlsdGVyICYmIHJlcS5maWx0ZXIuYWRkcmVzcyAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KHJlcS5maWx0ZXIuYWRkcmVzcykpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlcS5maWx0ZXIuYWRkcmVzcyA9IHJlcS5maWx0ZXIuYWRkcmVzcy5tYXAoZ2V0TG93ZXJDYXNlKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlcS5maWx0ZXIuYWRkcmVzcyA9IGdldExvd2VyQ2FzZShyZXEuZmlsdGVyLmFkZHJlc3MpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiB7IG1ldGhvZDogXCJldGhfZ2V0TG9nc1wiLCBhcmdzOiBbcmVxLmZpbHRlcl0gfTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgLyoqXG4gICAgICogIFJldHVybnMgYW4gZXRoZXJzLXN0eWxlIEVycm9yIGZvciB0aGUgZ2l2ZW4gSlNPTi1SUEMgZXJyb3JcbiAgICAgKiAgJSVwYXlsb2FkJSUsIGNvYWxlc2NpbmcgdGhlIHZhcmlvdXMgc3RyaW5ncyBhbmQgZXJyb3Igc2hhcGVzXG4gICAgICogIHRoYXQgZGlmZmVyZW50IG5vZGVzIHJldHVybiwgY29lcmNpbmcgdGhlbSBpbnRvIGEgbWFjaGluZS1yZWFkYWJsZVxuICAgICAqICBzdGFuZGFyZGl6ZWQgZXJyb3IuXG4gICAgICovXG4gICAgZ2V0UnBjRXJyb3IocGF5bG9hZCwgX2Vycm9yKSB7XG4gICAgICAgIGNvbnN0IHsgbWV0aG9kIH0gPSBwYXlsb2FkO1xuICAgICAgICBjb25zdCB7IGVycm9yIH0gPSBfZXJyb3I7XG4gICAgICAgIGlmIChtZXRob2QgPT09IFwiZXRoX2VzdGltYXRlR2FzXCIgJiYgZXJyb3IubWVzc2FnZSkge1xuICAgICAgICAgICAgY29uc3QgbXNnID0gZXJyb3IubWVzc2FnZTtcbiAgICAgICAgICAgIGlmICghbXNnLm1hdGNoKC9yZXZlcnQvaSkgJiYgbXNnLm1hdGNoKC9pbnN1ZmZpY2llbnQgZnVuZHMvaSkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbWFrZUVycm9yKFwiaW5zdWZmaWNpZW50IGZ1bmRzXCIsIFwiSU5TVUZGSUNJRU5UX0ZVTkRTXCIsIHtcbiAgICAgICAgICAgICAgICAgICAgdHJhbnNhY3Rpb246IChwYXlsb2FkLnBhcmFtc1swXSksXG4gICAgICAgICAgICAgICAgICAgIGluZm86IHsgcGF5bG9hZCwgZXJyb3IgfVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAobXNnLm1hdGNoKC9ub25jZS9pKSAmJiBtc2cubWF0Y2goL3RvbyBsb3cvaSkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbWFrZUVycm9yKFwibm9uY2UgaGFzIGFscmVhZHkgYmVlbiB1c2VkXCIsIFwiTk9OQ0VfRVhQSVJFRFwiLCB7XG4gICAgICAgICAgICAgICAgICAgIHRyYW5zYWN0aW9uOiAocGF5bG9hZC5wYXJhbXNbMF0pLFxuICAgICAgICAgICAgICAgICAgICBpbmZvOiB7IHBheWxvYWQsIGVycm9yIH1cbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAobWV0aG9kID09PSBcImV0aF9jYWxsXCIgfHwgbWV0aG9kID09PSBcImV0aF9lc3RpbWF0ZUdhc1wiKSB7XG4gICAgICAgICAgICBjb25zdCByZXN1bHQgPSBzcGVsdW5rRGF0YShlcnJvcik7XG4gICAgICAgICAgICBjb25zdCBlID0gQWJpQ29kZXIuZ2V0QnVpbHRpbkNhbGxFeGNlcHRpb24oKG1ldGhvZCA9PT0gXCJldGhfY2FsbFwiKSA/IFwiY2FsbFwiIDogXCJlc3RpbWF0ZUdhc1wiLCAocGF5bG9hZC5wYXJhbXNbMF0pLCAocmVzdWx0ID8gcmVzdWx0LmRhdGEgOiBudWxsKSk7XG4gICAgICAgICAgICBlLmluZm8gPSB7IGVycm9yLCBwYXlsb2FkIH07XG4gICAgICAgICAgICByZXR1cm4gZTtcbiAgICAgICAgfVxuICAgICAgICAvLyBPbmx5IGVzdGltYXRlR2FzIGFuZCBjYWxsIGNhbiByZXR1cm4gYXJiaXRyYXJ5IGNvbnRyYWN0LWRlZmluZWQgdGV4dCwgc28gbm93IHdlXG4gICAgICAgIC8vIHdlIGNhbiBwcm9jZXNzIHRleHQgc2FmZWx5LlxuICAgICAgICBjb25zdCBtZXNzYWdlID0gSlNPTi5zdHJpbmdpZnkoc3BlbHVua01lc3NhZ2UoZXJyb3IpKTtcbiAgICAgICAgaWYgKHR5cGVvZiAoZXJyb3IubWVzc2FnZSkgPT09IFwic3RyaW5nXCIgJiYgZXJyb3IubWVzc2FnZS5tYXRjaCgvdXNlciBkZW5pZWR8ZXRoZXJzLXVzZXItZGVuaWVkL2kpKSB7XG4gICAgICAgICAgICBjb25zdCBhY3Rpb25NYXAgPSB7XG4gICAgICAgICAgICAgICAgZXRoX3NpZ246IFwic2lnbk1lc3NhZ2VcIixcbiAgICAgICAgICAgICAgICBwZXJzb25hbF9zaWduOiBcInNpZ25NZXNzYWdlXCIsXG4gICAgICAgICAgICAgICAgZXRoX3NpZ25UeXBlZERhdGFfdjQ6IFwic2lnblR5cGVkRGF0YVwiLFxuICAgICAgICAgICAgICAgIGV0aF9zaWduVHJhbnNhY3Rpb246IFwic2lnblRyYW5zYWN0aW9uXCIsXG4gICAgICAgICAgICAgICAgZXRoX3NlbmRUcmFuc2FjdGlvbjogXCJzZW5kVHJhbnNhY3Rpb25cIixcbiAgICAgICAgICAgICAgICBldGhfcmVxdWVzdEFjY291bnRzOiBcInJlcXVlc3RBY2Nlc3NcIixcbiAgICAgICAgICAgICAgICB3YWxsZXRfcmVxdWVzdEFjY291bnRzOiBcInJlcXVlc3RBY2Nlc3NcIixcbiAgICAgICAgICAgI
26774H07XG4gICAgICAgICAgICByZXR1cm4gbWFrZUVycm9yKGB1c2VyIHJlamVjdGVkIGFjdGlvbmAsIFwiQUNUSU9OX1JFSkVDVEVEXCIsIHtcbiAgICAgICAgICAgICAgICBhY3Rpb246IChhY3Rpb25NYXBbbWV0aG9kXSB8fCBcInVua25vd25cIiksXG4gICAgICAgICAgICAgICAgcmVhc29uOiBcInJlamVjdGVkXCIsXG4gICAgICAgICAgICAgICAgaW5mbzogeyBwYXlsb2FkLCBlcnJvciB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobWV0aG9kID09PSBcImV0aF9zZW5kUmF3VHJhbnNhY3Rpb25cIiB8fCBtZXRob2QgPT09IFwiZXRoX3NlbmRUcmFuc2FjdGlvblwiKSB7XG4gICAgICAgICAgICBjb25zdCB0cmFuc2FjdGlvbiA9IChwYXlsb2FkLnBhcmFtc1swXSk7XG4gICAgICAgICAgICBpZiAobWVzc2FnZS5tYXRjaCgvaW5zdWZmaWNpZW50IGZ1bmRzfGJhc2UgZmVlIGV4Y2VlZHMgZ2FzIGxpbWl0L2kpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG1ha2VFcnJvcihcImluc3VmZmljaWVudCBmdW5kcyBmb3IgaW50cmluc2ljIHRyYW5zYWN0aW9uIGNvc3RcIiwgXCJJTlNVRkZJQ0lFTlRfRlVORFNcIiwge1xuICAgICAgICAgICAgICAgICAgICB0cmFuc2FjdGlvbiwgaW5mbzogeyBlcnJvciB9XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAobWVzc2FnZS5tYXRjaCgvbm9uY2UvaSkgJiYgbWVzc2FnZS5tYXRjaCgvdG9vIGxvdy9pKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBtYWtlRXJyb3IoXCJub25jZSBoYXMgYWxyZWFkeSBiZWVuIHVzZWRcIiwgXCJOT05DRV9FWFBJUkVEXCIsIHsgdHJhbnNhY3Rpb24sIGluZm86IHsgZXJyb3IgfSB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIFwicmVwbGFjZW1lbnQgdHJhbnNhY3Rpb24gdW5kZXJwcmljZWRcIlxuICAgICAgICAgICAgaWYgKG1lc3NhZ2UubWF0Y2goL3JlcGxhY2VtZW50IHRyYW5zYWN0aW9uL2kpICYmIG1lc3NhZ2UubWF0Y2goL3VuZGVycHJpY2VkL2kpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG1ha2VFcnJvcihcInJlcGxhY2VtZW50IGZlZSB0b28gbG93XCIsIFwiUkVQTEFDRU1FTlRfVU5ERVJQUklDRURcIiwgeyB0cmFuc2FjdGlvbiwgaW5mbzogeyBlcnJvciB9IH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKG1lc3NhZ2UubWF0Y2goL29ubHkgcmVwbGF5LXByb3RlY3RlZC9pKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBtYWtlRXJyb3IoXCJsZWdhY3kgcHJlLWVpcC0xNTUgdHJhbnNhY3Rpb25zIG5vdCBzdXBwb3J0ZWRcIiwgXCJVTlNVUFBPUlRFRF9PUEVSQVRJT05cIiwge1xuICAgICAgICAgICAgICAgICAgICBvcGVyYXRpb246IG1ldGhvZCwgaW5mbzogeyB0cmFuc2FjdGlvbiwgaW5mbzogeyBlcnJvciB9IH1cbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBsZXQgdW5zdXBwb3J0ZWQgPSAhIW1lc3NhZ2UubWF0Y2goL3RoZSBtZXRob2QgLiogZG9lcyBub3QgZXhpc3QvaSk7XG4gICAgICAgIGlmICghdW5zdXBwb3J0ZWQpIHtcbiAgICAgICAgICAgIGlmIChlcnJvciAmJiBlcnJvci5kZXRhaWxzICYmIGVycm9yLmRldGFpbHMuc3RhcnRzV2l0aChcIlVuYXV0aG9yaXplZCBtZXRob2Q6XCIpKSB7XG4gICAgICAgICAgICAgICAgdW5zdXBwb3J0ZWQgPSB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmICh1bnN1cHBvcnRlZCkge1xuICAgICAgICAgICAgcmV0dXJuIG1ha2VFcnJvcihcInVuc3VwcG9ydGVkIG9wZXJhdGlvblwiLCBcIlVOU1VQUE9SVEVEX09QRVJBVElPTlwiLCB7XG4gICAgICAgICAgICAgICAgb3BlcmF0aW9uOiBwYXlsb2FkLm1ldGhvZCwgaW5mbzogeyBlcnJvciwgcGF5bG9hZCB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbWFrZUVycm9yKFwiY291bGQgbm90IGNvYWxlc2NlIGVycm9yXCIsIFwiVU5LTk9XTl9FUlJPUlwiLCB7IGVycm9yLCBwYXlsb2FkIH0pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiAgUmVxdWVzdHMgdGhlICUlbWV0aG9kJSUgd2l0aCAlJXBhcmFtcyUlIHZpYSB0aGUgSlNPTi1SUEMgcHJvdG9jb2xcbiAgICAgKiAgb3ZlciB0aGUgdW5kZXJseWluZyBjaGFubmVsLiBUaGlzIGNhbiBiZSB1c2VkIHRvIGNhbGwgbWV0aG9kc1xuICAgICAqICBvbiB0aGUgYmFja2VuZCB0aGF0IGRvIG5vdCBoYXZlIGEgaGlnaC1sZXZlbCBBUEkgd2l0aGluIHRoZSBQcm92aWRlclxuICAgICAqICBBUEkuXG4gICAgICpcbiAgICAgKiAgVGhpcyBtZXRob2QgcXVldWVzIHJlcXVlc3RzIGFjY29yZGluZyB0byB0aGUgYmF0Y2ggY29uc3RyYWludHNcbiAgICAgKiAgaW4gdGhlIG9wdGlvbnMsIGFzc2lnbnMgdGhlIHJlcXVlc3QgYSB1bmlxdWUgSUQuXG4gICAgICpcbiAgICAgKiAgKipEbyBOT1Qgb3ZlcnJpZGUqKiB0aGlzIG1ldGhvZCBpbiBzdWItY2xhc3NlczsgaW5zdGVhZFxuICAgICAqICBvdmVycmlkZSBbW19zZW5kXV0gb3IgZm9yY2UgdGhlIG9wdGlvbnMgdmFsdWVzIGluIHRoZVxuICAgICAqICBjYWxsIHRvIHRoZSBjb25zdHJ1Y3RvciB0byBtb2RpZnkgdGhpcyBtZXRob2QncyBiZWhhdmlvci5cbiAgICAgKi9cbiAgICBzZW5kKG1ldGhvZCwgcGFyYW1zKSB7XG4gICAgICAgIC8vIEBUT0RPOiBjYWNoZSBjaGFpbklkPz8gcHVyZ2Ugb24gc3dpdGNoX25ldHdvcmtzXG4gICAgICAgIC8vIFdlIGhhdmUgYmVlbiBkZXN0cm95ZWQ7IG5vIG9wZXJhdGlvbnMgYXJlIHN1cHBvcnRlZCBhbnltb3JlXG4gICAgICAgIGlmICh0aGlzLmRlc3Ryb3llZCkge1xuICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KG1ha2VFcnJvcihcInByb3ZpZGVyIGRlc3Ryb3llZDsgY2FuY2VsbGVkIHJlcXVlc3RcIiwgXCJVTlNVUFBPUlRFRF9PUEVSQVRJT05cIiwgeyBvcGVyYXRpb246IG1ldGhvZCB9KSk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgaWQgPSB0aGlzLiNuZXh0SWQrKztcbiAgICAgICAgY29uc3QgcHJvbWlzZSA9IG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgICAgI
26774HRoaXMuI3BheWxvYWRzLnB1c2goe1xuICAgICAgICAgICAgICAgIHJlc29sdmUsIHJlamVjdCxcbiAgICAgICAgICAgICAgICBwYXlsb2FkOiB7IG1ldGhvZCwgcGFyYW1zLCBpZCwganNvbnJwYzogXCIyLjBcIiB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgICAgIC8vIElmIHRoZXJlIGlzIG5vdCBhIHBlbmRpbmcgZHJhaW5UaW1lciwgc2V0IG9uZVxuICAgICAgICB0aGlzLiNzY2hlZHVsZURyYWluKCk7XG4gICAgICAgIHJldHVybiBwcm9taXNlO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiAgUmVzb2x2ZXMgdG8gdGhlIFtbU2lnbmVyXV0gYWNjb3VudCBmb3IgICUlYWRkcmVzcyUlIG1hbmFnZWQgYnlcbiAgICAgKiAgdGhlIGNsaWVudC5cbiAgICAgKlxuICAgICAqICBJZiB0aGUgJSVhZGRyZXNzJSUgaXMgYSBudW1iZXIsIGl0IGlzIHVzZWQgYXMgYW4gaW5kZXggaW4gdGhlXG4gICAgICogIHRoZSBhY2NvdW50cyBmcm9tIFtbbGlzdEFjY291bnRzXV0uXG4gICAgICpcbiAgICAgKiAgVGhpcyBjYW4gb25seSBiZSB1c2VkIG9uIGNsaWVudHMgd2hpY2ggbWFuYWdlIGFjY291bnRzIChzdWNoIGFzXG4gICAgICogIEdldGggd2l0aCBpbXBvcnRlZCBhY2NvdW50IG9yIE1ldGFNYXNrKS5cbiAgICAgKlxuICAgICAqICBUaHJvd3MgaWYgdGhlIGFjY291bnQgZG9lc24ndCBleGlzdC5cbiAgICAgKi9cbiAgICBhc3luYyBnZXRTaWduZXIoYWRkcmVzcykge1xuICAgICAgICBpZiAoYWRkcmVzcyA9PSBudWxsKSB7XG4gICAgICAgICAgICBhZGRyZXNzID0gMDtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBhY2NvdW50c1Byb21pc2UgPSB0aGlzLnNlbmQoXCJldGhfYWNjb3VudHNcIiwgW10pO1xuICAgICAgICAvLyBBY2NvdW50IGluZGV4XG4gICAgICAgIGlmICh0eXBlb2YgKGFkZHJlc3MpID09PSBcIm51bWJlclwiKSB7XG4gICAgICAgICAgICBjb25zdCBhY2NvdW50cyA9IChhd2FpdCBhY2NvdW50c1Byb21pc2UpO1xuICAgICAgICAgICAgaWYgKGFkZHJlc3MgPj0gYWNjb3VudHMubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwibm8gc3VjaCBhY2NvdW50XCIpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIG5ldyBKc29uUnBjU2lnbmVyKHRoaXMsIGFjY291bnRzW2FkZHJlc3NdKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCB7IGFjY291bnRzIH0gPSBhd2FpdCByZXNvbHZlUHJvcGVydGllcyh7XG4gICAgICAgICAgICBuZXR3b3JrOiB0aGlzLmdldE5ldHdvcmsoKSxcbiAgICAgICAgICAgIGFjY291bnRzOiBhY2NvdW50c1Byb21pc2VcbiAgICAgICAgfSk7XG4gICAgICAgIC8vIEFjY291bnQgYWRkcmVzc1xuICAgICAgICBhZGRyZXNzID0gZ2V0QWRkcmVzcyhhZGRyZXNzKTtcbiAgICAgICAgZm9yIChjb25zdCBhY2NvdW50IG9mIGFjY291bnRzKSB7XG4gICAgICAgICAgICBpZiAoZ2V0QWRkcmVzcyhhY2NvdW50KSA9PT0gYWRkcmVzcykge1xuICAgICAgICAgICAgICAgIHJldHVybiBuZXcgSnNvblJwY1NpZ25lcih0aGlzLCBhZGRyZXNzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJpbnZhbGlkIGFjY291bnRcIik7XG4gICAgfVxuICAgIGFzeW5jIGxpc3RBY2NvdW50cygpIHtcbiAgICAgICAgY29uc3QgYWNjb3VudHMgPSBhd2FpdCB0aGlzLnNlbmQoXCJldGhfYWNjb3VudHNcIiwgW10pO1xuICAgICAgICByZXR1cm4gYWNjb3VudHMubWFwKChhKSA9PiBuZXcgSnNvblJwY1NpZ25lcih0aGlzLCBhKSk7XG4gICAgfVxuICAgIGRlc3Ryb3koKSB7XG4gICAgICAgIC8vIFN0b3AgcHJvY2Vzc2luZyByZXF1ZXN0c1xuICAgICAgICBpZiAodGhpcy4jZHJhaW5UaW1lcikge1xuICAgICAgICAgICAgY2xlYXJUaW1lb3V0KHRoaXMuI2RyYWluVGltZXIpO1xuICAgICAgICAgICAgdGhpcy4jZHJhaW5UaW1lciA9IG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgLy8gQ2FuY2VsIGFsbCBwZW5kaW5nIHJlcXVlc3RzXG4gICAgICAgIGZvciAoY29uc3QgeyBwYXlsb2FkLCByZWplY3QgfSBvZiB0aGlzLiNwYXlsb2Fkcykge1xuICAgICAgICAgICAgcmVqZWN0KG1ha2VFcnJvcihcInByb3ZpZGVyIGRlc3Ryb3llZDsgY2FuY2VsbGVkIHJlcXVlc3RcIiwgXCJVTlNVUFBPUlRFRF9PUEVSQVRJT05cIiwgeyBvcGVyYXRpb246IHBheWxvYWQubWV0aG9kIH0pKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLiNwYXlsb2FkcyA9IFtdO1xuICAgICAgICAvLyBQYXJlbnQgY2xlYW4tdXBcbiAgICAgICAgc3VwZXIuZGVzdHJveSgpO1xuICAgIH1cbn1cbi8vIEBUT0RPOiByZW1vdmUgdGhpcyBpbiB2NywgaXQgaXMgbm90IGV4cG9ydGVkIGJlY2F1c2UgdGhpcyBmdW5jdGlvbmFsaXR5XG4vLyBpcyBleHBvc2VkIGluIHRoZSBKc29uUnBjQXBpUHJvdmlkZXIgYnkgc2V0dGluZyBwb2xsaW5nIHRvIHRydWUuIEl0IHNob3VsZFxuLy8gYmUgc2FmZSB0byByZW1vdmUgcmVnYXJkbGVzcywgYmVjYXVzZSBpdCBpc24ndCByZWFjaGFibGUsIGJ1dCBqdXN0IGluIGNhc2UuXG4vKipcbiAqICBAX2lnbm9yZTpcbiAqL1xuZXhwb3J0IGNsYXNzIEpzb25ScGNBcGlQb2xsaW5nUHJvdmlkZXIgZXh0ZW5kcyBKc29uUnBjQXBpUHJvdmlkZXIge1xuICAgICNwb2xsaW5nSW50ZXJ2YWw7XG4gICAgY29uc3RydWN0b3IobmV0d29yaywgb3B0aW9ucykge1xuICAgICAgICBzdXBlcihuZXR3b3JrLCBvcHRpb25zKTtcbiAgICAgICAgbGV0IHBvbGxpbmdJbnRlcnZhbCA9IHRoaXMuX2dldE9wdGlvbihcInBvbGxpbmdJbnRlcnZhbFwiKTtcbiAgICAgICAgaWYgKHBvbGxpbmdJbnRlcnZhbCA9PSBudWxsKSB7XG4gICAgICAgICAgICBwb2xsaW5nSW50ZXJ2YWwgPSBkZWZhdWx0T3B0aW9ucy5wb2xsaW5nSW50ZXJ2YWw7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy4jcG9sbGluZ0ludGVydmFsID0gcG9sbGluZ0ludGVydmFsO1xuICAgIH1cbiAgICBfZ2V0U3Vic2NyaWJlcihzdWIpIHtcbiAgICAgICAgY29uc3Qgc3Vic2NyaWJlciA9IHN1cGVyLl9nZXRTdWJzY3JpYmVyKHN1Yik7XG4gICAgICAgIGlmIChpc1BvbGxhYmxlKHN1YnNjcmliZXIpKSB7XG4gICAgICAgICAgICBzdWJzY3JpYmVyLnBvbGxpbmdJbnRlcnZhbCA9IHRoaXMuI3BvbGxpbmdJbnRlcnZhbDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gc3Vic2NyaWJlcjtcbiAgICB9XG4gICAgLyoqXG4gICAgICogIFRoZSBwb2xsaW5nIGludGVydmFsIChkZWZhdWx0OiA0MDAwIG1zKVxuICAgICAqL1xuICAgIGdldCBwb2xsaW5nSW50ZXJ2YWwoKSB7IHJldHVybi
26774B0aGlzLiNwb2xsaW5nSW50ZXJ2YWw7IH1cbiAgICBzZXQgcG9sbGluZ0ludGVydmFsKHZhbHVlKSB7XG4gICAgICAgIGlmICghTnVtYmVyLmlzSW50ZWdlcih2YWx1ZSkgfHwgdmFsdWUgPCAwKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJpbnZhbGlkIGludGVydmFsXCIpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuI3BvbGxpbmdJbnRlcnZhbCA9IHZhbHVlO1xuICAgICAgICB0aGlzLl9mb3JFYWNoU3Vic2NyaWJlcigoc3ViKSA9PiB7XG4gICAgICAgICAgICBpZiAoaXNQb2xsYWJsZShzdWIpKSB7XG4gICAgICAgICAgICAgICAgc3ViLnBvbGxpbmdJbnRlcnZhbCA9IHRoaXMuI3BvbGxpbmdJbnRlcnZhbDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxufVxuLyoqXG4gKiAgVGhlIEpzb25ScGNQcm92aWRlciBpcyBvbmUgb2YgdGhlIG1vc3QgY29tbW9uIFByb3ZpZGVycyxcbiAqICB3aGljaCBwZXJmb3JtcyBhbGwgb3BlcmF0aW9ucyBvdmVyIEhUVFAgKG9yIEhUVFBTKSByZXF1ZXN0cy5cbiAqXG4gKiAgRXZlbnRzIGFyZSBwcm9jZXNzZWQgYnkgcG9sbGluZyB0aGUgYmFja2VuZCBmb3IgdGhlIGN1cnJlbnQgYmxvY2tcbiAqICBudW1iZXI7IHdoZW4gaXQgYWR2YW5jZXMsIGFsbCBibG9jay1iYXNlIGV2ZW50cyBhcmUgdGhlbiBjaGVja2VkXG4gKiAgZm9yIHVwZGF0ZXMuXG4gKi9cbmV4cG9ydCBjbGFzcyBKc29uUnBjUHJvdmlkZXIgZXh0ZW5kcyBKc29uUnBjQXBpUG9sbGluZ1Byb3ZpZGVyIHtcbiAgICAjY29ubmVjdDtcbiAgICBjb25zdHJ1Y3Rvcih1cmwsIG5ldHdvcmssIG9wdGlvbnMpIHtcbiAgICAgICAgaWYgKHVybCA9PSBudWxsKSB7XG4gICAgICAgICAgICB1cmwgPSBcImh0dHA6L1xcL2xvY2FsaG9zdDo4NTQ1XCI7XG4gICAgICAgIH1cbiAgICAgICAgc3VwZXIobmV0d29yaywgb3B0aW9ucyk7XG4gICAgICAgIGlmICh0eXBlb2YgKHVybCkgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgICAgIHRoaXMuI2Nvbm5lY3QgPSBuZXcgRmV0Y2hSZXF1ZXN0KHVybCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0aGlzLiNjb25uZWN0ID0gdXJsLmNsb25lKCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgX2dldENvbm5lY3Rpb24oKSB7XG4gICAgICAgIHJldHVybiB0aGlzLiNjb25uZWN0LmNsb25lKCk7XG4gICAgfVxuICAgIGFzeW5jIHNlbmQobWV0aG9kLCBwYXJhbXMpIHtcbiAgICAgICAgLy8gQWxsIHJlcXVlc3RzIGFyZSBvdmVyIEhUVFAsIHNvIHdlIGNhbiBqdXN0IHN0YXJ0IGhhbmRsaW5nIHJlcXVlc3RzXG4gICAgICAgIC8vIFdlIGRvIHRoaXMgaGVyZSByYXRoZXIgdGhhbiB0aGUgY29uc3RydWN0b3Igc28gdGhhdCB3ZSBkb24ndCBzZW5kIGFueVxuICAgICAgICAvLyByZXF1ZXN0cyB0byB0aGUgbmV0d29yayAoaS5lLiBldGhfY2hhaW5JZCkgdW50aWwgd2UgYWJzb2x1dGVseSBoYXZlIHRvLlxuICAgICAgICBhd2FpdCB0aGlzLl9zdGFydCgpO1xuICAgICAgICByZXR1cm4gYXdhaXQgc3VwZXIuc2VuZChtZXRob2QsIHBhcmFtcyk7XG4gICAgfVxuICAgIGFzeW5jIF9zZW5kKHBheWxvYWQpIHtcbiAgICAgICAgLy8gQ29uZmlndXJlIGEgUE9TVCBjb25uZWN0aW9uIGZvciB0aGUgcmVxdWVzdGVkIG1ldGhvZFxuICAgICAgICBjb25zdCByZXF1ZXN0ID0gdGhpcy5fZ2V0Q29ubmVjdGlvbigpO1xuICAgICAgICByZXF1ZXN0LmJvZHkgPSBKU09OLnN0cmluZ2lmeShwYXlsb2FkKTtcbiAgICAgICAgcmVxdWVzdC5zZXRIZWFkZXIoXCJjb250ZW50LXR5cGVcIiwgXCJhcHBsaWNhdGlvbi9qc29uXCIpO1xuICAgICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IHJlcXVlc3Quc2VuZCgpO1xuICAgICAgICByZXNwb25zZS5hc3NlcnRPaygpO1xuICAgICAgICBsZXQgcmVzcCA9IHJlc3BvbnNlLmJvZHlKc29uO1xuICAgICAgICBpZiAoIUFycmF5LmlzQXJyYXkocmVzcCkpIHtcbiAgICAgICAgICAgIHJlc3AgPSBbcmVzcF07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3A7XG4gICAgfVxufVxuZnVuY3Rpb24gc3BlbHVua0RhdGEodmFsdWUpIHtcbiAgICBpZiAodmFsdWUgPT0gbnVsbCkge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgLy8gVGhlc2UgKmFyZSogdGhlIGRyb2lkcyB3ZSdyZSBsb29raW5nIGZvci5cbiAgICBpZiAodHlwZW9mICh2YWx1ZS5tZXNzYWdlKSA9PT0gXCJzdHJpbmdcIiAmJiB2YWx1ZS5tZXNzYWdlLm1hdGNoKC9yZXZlcnQvaSkgJiYgaXNIZXhTdHJpbmcodmFsdWUuZGF0YSkpIHtcbiAgICAgICAgcmV0dXJuIHsgbWVzc2FnZTogdmFsdWUubWVzc2FnZSwgZGF0YTogdmFsdWUuZGF0YSB9O1xuICAgIH1cbiAgICAvLyBTcGVsdW5rIGZ1cnRoZXIuLi5cbiAgICBpZiAodHlwZW9mICh2YWx1ZSkgPT09IFwib2JqZWN0XCIpIHtcbiAgICAgICAgZm9yIChjb25zdCBrZXkgaW4gdmFsdWUpIHtcbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IHNwZWx1bmtEYXRhKHZhbHVlW2tleV0pO1xuICAgICAgICAgICAgaWYgKHJlc3VsdCkge1xuICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIC8vIE1pZ2h0IGJlIGEgSlNPTiBzdHJpbmcgd2UgY2FuIGZ1cnRoZXIgZGVzY2VuZC4uLlxuICAgIGlmICh0eXBlb2YgKHZhbHVlKSA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgcmV0dXJuIHNwZWx1bmtEYXRhKEpTT04ucGFyc2UodmFsdWUpKTtcbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZXJyb3IpIHsgfVxuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbn1cbmZ1bmN0aW9uIF9zcGVsdW5rTWVzc2FnZSh2YWx1ZSwgcmVzdWx0KSB7XG4gICAgaWYgKHZhbHVlID09IG51bGwpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICAvLyBUaGVzZSAqYXJlKiB0aGUgZHJvaWRzIHdlJ3JlIGxvb2tpbmcgZm9yLlxuICAgIGlmICh0eXBlb2YgKHZhbHVlLm1lc3NhZ2UpID09PSBcInN0cmluZ1wiKSB7XG4gICAgICAgIHJlc3VsdC5wdXNoKHZhbHVlLm1lc3NhZ2UpO1xuICAgIH1cbiAgICAvLyBTcGVsdW5rIGZ1cnRoZXIuLi5cbiAgICBpZiAodHlwZW9mICh2YWx1ZSkgPT09IFwib2JqZWN0XCIpIHtcbiAgICAgICAgZm9yIChjb25zdCBrZXkgaW4gdmFsdWUpIHtcbiAgICAgICAgICAgIF9zcGVsdW5rTWVzc2FnZSh2YWx1ZVtrZXldLCByZXN1bHQpO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8vIE1pZ2h0IGJlIGEgSlNPTiBzdHJpbmcgd2UgY2FuIGZ1cnRoZXIgZGVzY2VuZC4uLlxuICAgIGlmICh0eXBlb2YgKHZhbHVlKSA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgcmV0dXJuIF9zcG
26774VsdW5rTWVzc2FnZShKU09OLnBhcnNlKHZhbHVlKSwgcmVzdWx0KTtcbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZXJyb3IpIHsgfVxuICAgIH1cbn1cbmZ1bmN0aW9uIHNwZWx1bmtNZXNzYWdlKHZhbHVlKSB7XG4gICAgY29uc3QgcmVzdWx0ID0gW107XG4gICAgX3NwZWx1bmtNZXNzYWdlKHZhbHVlLCByZXN1bHQpO1xuICAgIHJldHVybiByZXN1bHQ7XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1wcm92aWRlci1qc29ucnBjLmpzLm1hcCIsIi8qKlxuICogIFtbbGluay1hbmtyXV0gcHJvdmlkZXMgYSB0aGlyZC1wYXJ0eSBzZXJ2aWNlIGZvciBjb25uZWN0aW5nIHRvXG4gKiAgdmFyaW91cyBibG9ja2NoYWlucyBvdmVyIEpTT04tUlBDLlxuICpcbiAqICAqKlN1cHBvcnRlZCBOZXR3b3JrcyoqXG4gKlxuICogIC0gRXRoZXJldW0gTWFpbm5ldCAoYGBtYWlubmV0YGApXG4gKiAgLSBHb2VybGkgVGVzdG5ldCAoYGBnb2VybGlgYClcbiAqICAtIFNlcG9saWEgVGVzdG5ldCAoYGBzZXBvbGlhYGApXG4gKiAgLSBBcmJpdHJ1bSAoYGBhcmJpdHJ1bWBgKVxuICogIC0gQmFzZSAoYGBiYXNlYGApXG4gKiAgLSBCYXNlIEdvZXJsaWEgVGVzdG5ldCAoYGBiYXNlLWdvZXJsaWBgKVxuICogIC0gQmFzZSBTZXBvbGlhIFRlc3RuZXQgKGBgYmFzZS1zZXBvbGlhYGApXG4gKiAgLSBCTkIgKGBgYm5iYGApXG4gKiAgLSBCTkIgVGVzdG5ldCAoYGBibmJ0YGApXG4gKiAgLSBGaWxlY29pbiAoYGBmaWxlY29pbmBgKVxuICogIC0gRmlsZWNvaW4gQ2FsaWJyYXRpb24gVGVzdG5ldCAoYGBmaWxlY29pbi1jYWxpYnJhdGlvbmBgKVxuICogIC0gT3B0aW1pc20gKGBgb3B0aW1pc21gYClcbiAqICAtIE9wdGltaXNtIEdvZXJsaSBUZXN0bmV0IChgYG9wdGltaXNtLWdvZXJsaWBgKVxuICogIC0gT3B0aW1pc20gU2Vwb2xpYSBUZXN0bmV0IChgYG9wdGltaXNtLXNlcG9saWFgYClcbiAqICAtIFBvbHlnb24gKGBgbWF0aWNgYClcbiAqICAtIFBvbHlnb24gTXVtYmFpIFRlc3RuZXQgKGBgbWF0aWMtbXVtYmFpYGApXG4gKlxuICogIEBfc3Vic2VjdGlvbjogYXBpL3Byb3ZpZGVycy90aGlyZHBhcnR5OkFua3IgIFtwcm92aWRlcnMtYW5rcl1cbiAqL1xuaW1wb3J0IHsgZGVmaW5lUHJvcGVydGllcywgRmV0Y2hSZXF1ZXN0LCBhc3NlcnRBcmd1bWVudCB9IGZyb20gXCIuLi91dGlscy9pbmRleC5qc1wiO1xuaW1wb3J0IHsgc2hvd1Rocm90dGxlTWVzc2FnZSB9IGZyb20gXCIuL2NvbW11bml0eS5qc1wiO1xuaW1wb3J0IHsgTmV0d29yayB9IGZyb20gXCIuL25ldHdvcmsuanNcIjtcbmltcG9ydCB7IEpzb25ScGNQcm92aWRlciB9IGZyb20gXCIuL3Byb3ZpZGVyLWpzb25ycGMuanNcIjtcbmNvbnN0IGRlZmF1bHRBcGlLZXkgPSBcIjlmN2Q5MjliMDE4Y2RmZmIzMzg1MTdlZmEwNmY1ODM1OWU4NmZmMWZmZDM1MGJjODg5NzM4NTIzNjU5ZTc5NzJcIjtcbmZ1bmN0aW9uIGdldEhvc3QobmFtZSkge1xuICAgIHN3aXRjaCAobmFtZSkge1xuICAgICAgICBjYXNlIFwibWFpbm5ldFwiOlxuICAgICAgICAgICAgcmV0dXJuIFwicnBjLmFua3IuY29tL2V0aFwiO1xuICAgICAgICBjYXNlIFwiZ29lcmxpXCI6XG4gICAgICAgICAgICByZXR1cm4gXCJycGMuYW5rci5jb20vZXRoX2dvZXJsaVwiO1xuICAgICAgICBjYXNlIFwic2Vwb2xpYVwiOlxuICAgICAgICAgICAgcmV0dXJuIFwicnBjLmFua3IuY29tL2V0aF9zZXBvbGlhXCI7XG4gICAgICAgIGNhc2UgXCJhcmJpdHJ1bVwiOlxuICAgICAgICAgICAgcmV0dXJuIFwicnBjLmFua3IuY29tL2FyYml0cnVtXCI7XG4gICAgICAgIGNhc2UgXCJiYXNlXCI6XG4gICAgICAgICAgICByZXR1cm4gXCJycGMuYW5rci5jb20vYmFzZVwiO1xuICAgICAgICBjYXNlIFwiYmFzZS1nb2VybGlcIjpcbiAgICAgICAgICAgIHJldHVybiBcInJwYy5hbmtyLmNvbS9iYXNlX2dvZXJsaVwiO1xuICAgICAgICBjYXNlIFwiYmFzZS1zZXBvbGlhXCI6XG4gICAgICAgICAgICByZXR1cm4gXCJycGMuYW5rci5jb20vYmFzZV9zZXBvbGlhXCI7XG4gICAgICAgIGNhc2UgXCJibmJcIjpcbiAgICAgICAgICAgIHJldHVybiBcInJwYy5hbmtyLmNvbS9ic2NcIjtcbiAgICAgICAgY2FzZSBcImJuYnRcIjpcbiAgICAgICAgICAgIHJldHVybiBcInJwYy5hbmtyLmNvbS9ic2NfdGVzdG5ldF9jaGFwZWxcIjtcbiAgICAgICAgY2FzZSBcImZpbGVjb2luXCI6XG4gICAgICAgICAgICByZXR1cm4gXCJycGMuYW5rci5jb20vZmlsZWNvaW5cIjtcbiAgICAgICAgY2FzZSBcImZpbGVjb2luLWNhbGlicmF0aW9uXCI6XG4gICAgICAgICAgICByZXR1cm4gXCJycGMuYW5rci5jb20vZmlsZWNvaW5fdGVzdG5ldFwiO1xuICAgICAgICBjYXNlIFwibWF0aWNcIjpcbiAgICAgICAgICAgIHJldHVybiBcInJwYy5hbmtyLmNvbS9wb2x5Z29uXCI7XG4gICAgICAgIGNhc2UgXCJtYXRpYy1tdW1iYWlcIjpcbiAgICAgICAgICAgIHJldHVybiBcInJwYy5hbmtyLmNvbS9wb2x5Z29uX211bWJhaVwiO1xuICAgICAgICBjYXNlIFwib3B0aW1pc21cIjpcbiAgICAgICAgICAgIHJldHVybiBcInJwYy5hbmtyLmNvbS9vcHRpbWlzbVwiO1xuICAgICAgICBjYXNlIFwib3B0aW1pc20tZ29lcmxpXCI6XG4gICAgICAgICAgICByZXR1cm4gXCJycGMuYW5rci5jb20vb3B0aW1pc21fdGVzdG5ldFwiO1xuICAgICAgICBjYXNlIFwib3B0aW1pc20tc2Vwb2xpYVwiOlxuICAgICAgICAgICAgcmV0dXJuIFwicnBjLmFua3IuY29tL29wdGltaXNtX3NlcG9saWFcIjtcbiAgICB9XG4gICAgYXNzZXJ0QXJndW1lbnQoZmFsc2UsIFwidW5zdXBwb3J0ZWQgbmV0d29ya1wiLCBcIm5ldHdvcmtcIiwgbmFtZSk7XG59XG4vKipcbiAqICBUaGUgKipBbmtyUHJvdmlkZXIqKiBjb25uZWN0cyB0byB0aGUgW1tsaW5rLWFua3JdXVxuICogIEpTT04tUlBDIGVuZC1wb2ludHMuXG4gKlxuICogIEJ5IGRlZmF1bHQsIGEgaGlnaGx5LXRocm90dGxlZCBBUEkga2V5IGlzIHVzZWQsIHdoaWNoIGlzXG4gKiAgYXBwcm9wcmlhdGUgZm9yIHF1aWNrIHByb3RvdHlwZXMgYW5kIHNpbXBsZSBzY3JpcHRzLiBUb1xuICogIGdhaW4gYWNjZXNzIHRvIGFuIGluY3JlYXNlZCByYXRlLWxpbWl0LCBpdCBpcyBoaWdobHlcbiAqICByZWNvbW1lbmRlZCB0byBbc2lnbiB1cCBoZXJlXShsaW5rLWFua3Itc2lnbnVwKS5cbiAqL1xuZXhwb3J0IGNsYXNzIEFua3JQcm92aWRlciBleHRlbmRzIEpzb25ScGNQcm92aWRlciB7XG4gICAgLyoqXG4gICAgICogIFRoZSBBUEkga2V5IGZvciB0aGUgQW5rciBjb25uZWN0aW9uLlxuICAgICAqL1xuICAgIGFwaUtleTtcbiAgICAvKipcbiAgICAgKiAgQ3JlYXRlIGEgbmV3ICoqQW5rclByb3ZpZGVyKiouXG4gICAgICpcbiAgICAgKiAgQnkgZGVmYXVsdCBjb25uZWN0aW5nIHRvIGBgbWFpbm5ldGBgIHdpdGggYSBoaWdobHkgdGhyb3R0bGVkXG4gICAgICogIEFQSSBrZXkuXG4gICAgICovXG4gICAgY29uc3RydWN0b3IoX25ldHdvcmssIGFwaUtleSkge1xuICAgICAgICBpZiAoX25ldHdvcmsgPT0gbnVsbCkge1xuICAgICAgICAgICAgX25ldHdvcmsgPSBcIm1haW5uZXRcIjtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBuZXR3b3JrID0gTmV0d29yay5mcm9tKF9uZXR3b3JrKTtcbiAgICAgICAgaWYgKGFwaUtleSA9PSBudWxsKSB7XG4gICAgICAgICAgICBhcGlLZXkgPSBkZWZh
26774dWx0QXBpS2V5O1xuICAgICAgICB9XG4gICAgICAgIC8vIEFua3IgZG9lcyBub3Qgc3VwcG9ydCBmaWx0ZXJJZCwgc28gd2UgZm9yY2UgcG9sbGluZ1xuICAgICAgICBjb25zdCBvcHRpb25zID0geyBwb2xsaW5nOiB0cnVlLCBzdGF0aWNOZXR3b3JrOiBuZXR3b3JrIH07XG4gICAgICAgIGNvbnN0IHJlcXVlc3QgPSBBbmtyUHJvdmlkZXIuZ2V0UmVxdWVzdChuZXR3b3JrLCBhcGlLZXkpO1xuICAgICAgICBzdXBlcihyZXF1ZXN0LCBuZXR3b3JrLCBvcHRpb25zKTtcbiAgICAgICAgZGVmaW5lUHJvcGVydGllcyh0aGlzLCB7IGFwaUtleSB9KTtcbiAgICB9XG4gICAgX2dldFByb3ZpZGVyKGNoYWluSWQpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHJldHVybiBuZXcgQW5rclByb3ZpZGVyKGNoYWluSWQsIHRoaXMuYXBpS2V5KTtcbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZXJyb3IpIHsgfVxuICAgICAgICByZXR1cm4gc3VwZXIuX2dldFByb3ZpZGVyKGNoYWluSWQpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiAgUmV0dXJucyBhIHByZXBhcmVkIHJlcXVlc3QgZm9yIGNvbm5lY3RpbmcgdG8gJSVuZXR3b3JrJSUgd2l0aFxuICAgICAqICAlJWFwaUtleSUlLlxuICAgICAqL1xuICAgIHN0YXRpYyBnZXRSZXF1ZXN0KG5ldHdvcmssIGFwaUtleSkge1xuICAgICAgICBpZiAoYXBpS2V5ID09IG51bGwpIHtcbiAgICAgICAgICAgIGFwaUtleSA9IGRlZmF1bHRBcGlLZXk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgcmVxdWVzdCA9IG5ldyBGZXRjaFJlcXVlc3QoYGh0dHBzOi9cXC8ke2dldEhvc3QobmV0d29yay5uYW1lKX0vJHthcGlLZXl9YCk7XG4gICAgICAgIHJlcXVlc3QuYWxsb3dHemlwID0gdHJ1ZTtcbiAgICAgICAgaWYgKGFwaUtleSA9PT0gZGVmYXVsdEFwaUtleSkge1xuICAgICAgICAgICAgcmVxdWVzdC5yZXRyeUZ1bmMgPSBhc3luYyAocmVxdWVzdCwgcmVzcG9uc2UsIGF0dGVtcHQpID0+IHtcbiAgICAgICAgICAgICAgICBzaG93VGhyb3R0bGVNZXNzYWdlKFwiQW5rclByb3ZpZGVyXCIpO1xuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVxdWVzdDtcbiAgICB9XG4gICAgZ2V0UnBjRXJyb3IocGF5bG9hZCwgZXJyb3IpIHtcbiAgICAgICAgaWYgKHBheWxvYWQubWV0aG9kID09PSBcImV0aF9zZW5kUmF3VHJhbnNhY3Rpb25cIikge1xuICAgICAgICAgICAgaWYgKGVycm9yICYmIGVycm9yLmVycm9yICYmIGVycm9yLmVycm9yLm1lc3NhZ2UgPT09IFwiSU5URVJOQUxfRVJST1I6IGNvdWxkIG5vdCByZXBsYWNlIGV4aXN0aW5nIHR4XCIpIHtcbiAgICAgICAgICAgICAgICBlcnJvci5lcnJvci5tZXNzYWdlID0gXCJyZXBsYWNlbWVudCB0cmFuc2FjdGlvbiB1bmRlcnByaWNlZFwiO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBzdXBlci5nZXRScGNFcnJvcihwYXlsb2FkLCBlcnJvcik7XG4gICAgfVxuICAgIGlzQ29tbXVuaXR5UmVzb3VyY2UoKSB7XG4gICAgICAgIHJldHVybiAodGhpcy5hcGlLZXkgPT09IGRlZmF1bHRBcGlLZXkpO1xuICAgIH1cbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXByb3ZpZGVyLWFua3IuanMubWFwIiwiLyoqXG4gKiAgW1tsaW5rLWFsY2hlbXldXSBwcm92aWRlcyBhIHRoaXJkLXBhcnR5IHNlcnZpY2UgZm9yIGNvbm5lY3RpbmcgdG9cbiAqICB2YXJpb3VzIGJsb2NrY2hhaW5zIG92ZXIgSlNPTi1SUEMuXG4gKlxuICogICoqU3VwcG9ydGVkIE5ldHdvcmtzKipcbiAqXG4gKiAgLSBFdGhlcmV1bSBNYWlubmV0IChgYG1haW5uZXRgYClcbiAqICAtIEdvZXJsaSBUZXN0bmV0IChgYGdvZXJsaWBgKVxuICogIC0gU2Vwb2xpYSBUZXN0bmV0IChgYHNlcG9saWFgYClcbiAqICAtIEFyYml0cnVtIChgYGFyYml0cnVtYGApXG4gKiAgLSBBcmJpdHJ1bSBHb2VybGkgVGVzdG5ldCAoYGBhcmJpdHJ1bS1nb2VybGlgYClcbiAqICAtIEFyYml0cnVtIFNlcG9saWEgVGVzdG5ldCAoYGBhcmJpdHJ1bS1zZXBvbGlhYGApXG4gKiAgLSBCYXNlIChgYGJhc2VgYClcbiAqICAtIEJhc2UgR29lcmxpYSBUZXN0bmV0IChgYGJhc2UtZ29lcmxpYGApXG4gKiAgLSBCYXNlIFNlcG9saWEgVGVzdG5ldCAoYGBiYXNlLXNlcG9saWFgYClcbiAqICAtIE9wdGltaXNtIChgYG9wdGltaXNtYGApXG4gKiAgLSBPcHRpbWlzbSBHb2VybGkgVGVzdG5ldCAoYGBvcHRpbWlzbS1nb2VybGlgYClcbiAqICAtIE9wdGltaXNtIFNlcG9saWEgVGVzdG5ldCAoYGBvcHRpbWlzbS1zZXBvbGlhYGApXG4gKiAgLSBQb2x5Z29uIChgYG1hdGljYGApXG4gKiAgLSBQb2x5Z29uIEFtb3kgVGVzdG5ldCAoYGBtYXRpYy1hbW95YGApXG4gKiAgLSBQb2x5Z29uIE11bWJhaSBUZXN0bmV0IChgYG1hdGljLW11bWJhaWBgKVxuICpcbiAqICBAX3N1YnNlY3Rpb246IGFwaS9wcm92aWRlcnMvdGhpcmRwYXJ0eTpBbGNoZW15ICBbcHJvdmlkZXJzLWFsY2hlbXldXG4gKi9cbmltcG9ydCB7IGRlZmluZVByb3BlcnRpZXMsIHJlc29sdmVQcm9wZXJ0aWVzLCBhc3NlcnQsIGFzc2VydEFyZ3VtZW50LCBGZXRjaFJlcXVlc3QgfSBmcm9tIFwiLi4vdXRpbHMvaW5kZXguanNcIjtcbmltcG9ydCB7IHNob3dUaHJvdHRsZU1lc3NhZ2UgfSBmcm9tIFwiLi9jb21tdW5pdHkuanNcIjtcbmltcG9ydCB7IE5ldHdvcmsgfSBmcm9tIFwiLi9uZXR3b3JrLmpzXCI7XG5pbXBvcnQgeyBKc29uUnBjUHJvdmlkZXIgfSBmcm9tIFwiLi9wcm92aWRlci1qc29ucnBjLmpzXCI7XG5jb25zdCBkZWZhdWx0QXBpS2V5ID0gXCJfZ2c3d1NTaTBLTUJzZEtuR1ZmSER1ZXE2eE1COUVrQ1wiO1xuZnVuY3Rpb24gZ2V0SG9zdChuYW1lKSB7XG4gICAgc3dpdGNoIChuYW1lKSB7XG4gICAgICAgIGNhc2UgXCJtYWlubmV0XCI6XG4gICAgICAgICAgICByZXR1cm4gXCJldGgtbWFpbm5ldC5nLmFsY2hlbXkuY29tXCI7XG4gICAgICAgIGNhc2UgXCJnb2VybGlcIjpcbiAgICAgICAgICAgIHJldHVybiBcImV0aC1nb2VybGkuZy5hbGNoZW15LmNvbVwiO1xuICAgICAgICBjYXNlIFwic2Vwb2xpYVwiOlxuICAgICAgICAgICAgcmV0dXJuIFwiZXRoLXNlcG9saWEuZy5hbGNoZW15LmNvbVwiO1xuICAgICAgICBjYXNlIFwiYXJiaXRydW1cIjpcbiAgICAgICAgICAgI
26774HJldHVybiBcImFyYi1tYWlubmV0LmcuYWxjaGVteS5jb21cIjtcbiAgICAgICAgY2FzZSBcImFyYml0cnVtLWdvZXJsaVwiOlxuICAgICAgICAgICAgcmV0dXJuIFwiYXJiLWdvZXJsaS5nLmFsY2hlbXkuY29tXCI7XG4gICAgICAgIGNhc2UgXCJhcmJpdHJ1bS1zZXBvbGlhXCI6XG4gICAgICAgICAgICByZXR1cm4gXCJhcmItc2Vwb2xpYS5nLmFsY2hlbXkuY29tXCI7XG4gICAgICAgIGNhc2UgXCJiYXNlXCI6XG4gICAgICAgICAgICByZXR1cm4gXCJiYXNlLW1haW5uZXQuZy5hbGNoZW15LmNvbVwiO1xuICAgICAgICBjYXNlIFwiYmFzZS1nb2VybGlcIjpcbiAgICAgICAgICAgIHJldHVybiBcImJhc2UtZ29lcmxpLmcuYWxjaGVteS5jb21cIjtcbiAgICAgICAgY2FzZSBcImJhc2Utc2Vwb2xpYVwiOlxuICAgICAgICAgICAgcmV0dXJuIFwiYmFzZS1zZXBvbGlhLmcuYWxjaGVteS5jb21cIjtcbiAgICAgICAgY2FzZSBcImJuYlwiOlxuICAgICAgICAgICAgcmV0dXJuIFwiYm5iLW1haW5uZXQuZy5hbGNoZW15LmNvbVwiO1xuICAgICAgICBjYXNlIFwiYm5idFwiOlxuICAgICAgICAgICAgcmV0dXJuIFwiYm5iLXRlc3RuZXQuZy5hbGNoZW15LmNvbVwiO1xuICAgICAgICBjYXNlIFwibWF0aWNcIjpcbiAgICAgICAgICAgIHJldHVybiBcInBvbHlnb24tbWFpbm5ldC5nLmFsY2hlbXkuY29tXCI7XG4gICAgICAgIGNhc2UgXCJtYXRpYy1hbW95XCI6XG4gICAgICAgICAgICByZXR1cm4gXCJwb2x5Z29uLWFtb3kuZy5hbGNoZW15LmNvbVwiO1xuICAgICAgICBjYXNlIFwibWF0aWMtbXVtYmFpXCI6XG4gICAgICAgICAgICByZXR1cm4gXCJwb2x5Z29uLW11bWJhaS5nLmFsY2hlbXkuY29tXCI7XG4gICAgICAgIGNhc2UgXCJvcHRpbWlzbVwiOlxuICAgICAgICAgICAgcmV0dXJuIFwib3B0LW1haW5uZXQuZy5hbGNoZW15LmNvbVwiO1xuICAgICAgICBjYXNlIFwib3B0aW1pc20tZ29lcmxpXCI6XG4gICAgICAgICAgICByZXR1cm4gXCJvcHQtZ29lcmxpLmcuYWxjaGVteS5jb21cIjtcbiAgICAgICAgY2FzZSBcIm9wdGltaXNtLXNlcG9saWFcIjpcbiAgICAgICAgICAgIHJldHVybiBcIm9wdC1zZXBvbGlhLmcuYWxjaGVteS5jb21cIjtcbiAgICB9XG4gICAgYXNzZXJ0QXJndW1lbnQoZmFsc2UsIFwidW5zdXBwb3J0ZWQgbmV0d29ya1wiLCBcIm5ldHdvcmtcIiwgbmFtZSk7XG59XG4vKipcbiAqICBUaGUgKipBbGNoZW15UHJvdmlkZXIqKiBjb25uZWN0cyB0byB0aGUgW1tsaW5rLWFsY2hlbXldXVxuICogIEpTT04tUlBDIGVuZC1wb2ludHMuXG4gKlxuICogIEJ5IGRlZmF1bHQsIGEgaGlnaGx5LXRocm90dGxlZCBBUEkga2V5IGlzIHVzZWQsIHdoaWNoIGlzXG4gKiAgYXBwcm9wcmlhdGUgZm9yIHF1aWNrIHByb3RvdHlwZXMgYW5kIHNpbXBsZSBzY3JpcHRzLiBUb1xuICogIGdhaW4gYWNjZXNzIHRvIGFuIGluY3JlYXNlZCByYXRlLWxpbWl0LCBpdCBpcyBoaWdobHlcbiAqICByZWNvbW1lbmRlZCB0byBbc2lnbiB1cCBoZXJlXShsaW5rLWFsY2hlbXktc2lnbnVwKS5cbiAqXG4gKiAgQF9kb2Nsb2M6IGFwaS9wcm92aWRlcnMvdGhpcmRwYXJ0eVxuICovXG5leHBvcnQgY2xhc3MgQWxjaGVteVByb3ZpZGVyIGV4dGVuZHMgSnNvblJwY1Byb3ZpZGVyIHtcbiAgICBhcGlLZXk7XG4gICAgY29uc3RydWN0b3IoX25ldHdvcmssIGFwaUtleSkge1xuICAgICAgICBpZiAoX25ldHdvcmsgPT0gbnVsbCkge1xuICAgICAgICAgICAgX25ldHdvcmsgPSBcIm1haW5uZXRcIjtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBuZXR3b3JrID0gTmV0d29yay5mcm9tKF9uZXR3b3JrKTtcbiAgICAgICAgaWYgKGFwaUtleSA9PSBudWxsKSB7XG4gICAgICAgICAgICBhcGlLZXkgPSBkZWZhdWx0QXBpS2V5O1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHJlcXVlc3QgPSBBbGNoZW15UHJvdmlkZXIuZ2V0UmVxdWVzdChuZXR3b3JrLCBhcGlLZXkpO1xuICAgICAgICBzdXBlcihyZXF1ZXN0LCBuZXR3b3JrLCB7IHN0YXRpY05ldHdvcms6IG5ldHdvcmsgfSk7XG4gICAgICAgIGRlZmluZVByb3BlcnRpZXModGhpcywgeyBhcGlLZXkgfSk7XG4gICAgfVxuICAgIF9nZXRQcm92aWRlcihjaGFpbklkKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICByZXR1cm4gbmV3IEFsY2hlbXlQcm92aWRlcihjaGFpbklkLCB0aGlzLmFwaUtleSk7XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKGVycm9yKSB7IH1cbiAgICAgICAgcmV0dXJuIHN1cGVyLl9nZXRQcm92aWRlcihjaGFpbklkKTtcbiAgICB9XG4gICAgYXN5bmMgX3BlcmZvcm0ocmVxKSB7XG4gICAgICAgIC8vIGh0dHBzOi8vZG9jcy5hbGNoZW15LmNvbS9yZWZlcmVuY2UvdHJhY2UtdHJhbnNhY3Rpb25cbiAgICAgICAgaWYgKHJlcS5tZXRob2QgPT09IFwiZ2V0VHJhbnNhY3Rpb25SZXN1bHRcIikge1xuICAgICAgICAgICAgY29uc3QgeyB0cmFjZSwgdHggfSA9IGF3YWl0IHJlc29sdmVQcm9wZXJ0aWVzKHtcbiAgICAgICAgICAgICAgICB0cmFjZTogdGhpcy5zZW5kKFwidHJhY2VfdHJhbnNhY3Rpb25cIiwgW3JlcS5oYXNoXSksXG4gICAgICAgICAgICAgICAgdHg6IHRoaXMuZ2V0VHJhbnNhY3Rpb24ocmVxLmhhc2gpXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGlmICh0cmFjZSA9PSBudWxsIHx8IHR4ID09IG51bGwpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGxldCBkYXRhO1xuICAgICAgICAgICAgbGV0IGVycm9yID0gZmFsc2U7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGRhdGEgPSB0cmFjZVswXS5yZXN1bHQub3V0cHV0O1xuICAgICAgICAgICAgICAgIGVycm9yID0gKHRyYWNlWzBdLmVycm9yID09PSBcIlJldmVydGVkXCIpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2F0Y2ggKGVycm9yKSB7IH1cbiAgICAgICAgICAgIGlmIChkYXRhKSB7XG4gICAgICAgICAgICAgICAgYXNzZXJ0KCFlcnJvciwgXCJhbiBlcnJvciBvY2N1cnJlZCBkdXJpbmcgdHJhbnNhY3Rpb24gZXhlY3V0aW9uc1wiLCBcIkNBTExfRVhDRVBUSU9OXCIsIHtcbiAgICAgICAgICAgICAgICAgICAgYWN0aW9uOiBcImdldFRyYW5zYWN0aW9uUmVzdWx0XCIsXG4gICAgICAgICAgICAgICAgICAgIGRhdGEsXG4gICAgICAgICAgICAgICAgICAgI
26774HJlYXNvbjogbnVsbCxcbiAgICAgICAgICAgICAgICAgICAgdHJhbnNhY3Rpb246IHR4LFxuICAgICAgICAgICAgICAgICAgICBpbnZvY2F0aW9uOiBudWxsLFxuICAgICAgICAgICAgICAgICAgICByZXZlcnQ6IG51bGwgLy8gQFRPRE9cbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICByZXR1cm4gZGF0YTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGFzc2VydChmYWxzZSwgXCJjb3VsZCBub3QgcGFyc2UgdHJhY2UgcmVzdWx0XCIsIFwiQkFEX0RBVEFcIiwgeyB2YWx1ZTogdHJhY2UgfSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGF3YWl0IHN1cGVyLl9wZXJmb3JtKHJlcSk7XG4gICAgfVxuICAgIGlzQ29tbXVuaXR5UmVzb3VyY2UoKSB7XG4gICAgICAgIHJldHVybiAodGhpcy5hcGlLZXkgPT09IGRlZmF1bHRBcGlLZXkpO1xuICAgIH1cbiAgICBzdGF0aWMgZ2V0UmVxdWVzdChuZXR3b3JrLCBhcGlLZXkpIHtcbiAgICAgICAgaWYgKGFwaUtleSA9PSBudWxsKSB7XG4gICAgICAgICAgICBhcGlLZXkgPSBkZWZhdWx0QXBpS2V5O1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHJlcXVlc3QgPSBuZXcgRmV0Y2hSZXF1ZXN0KGBodHRwczovXFwvJHtnZXRIb3N0KG5ldHdvcmsubmFtZSl9L3YyLyR7YXBpS2V5fWApO1xuICAgICAgICByZXF1ZXN0LmFsbG93R3ppcCA9IHRydWU7XG4gICAgICAgIGlmIChhcGlLZXkgPT09IGRlZmF1bHRBcGlLZXkpIHtcbiAgICAgICAgICAgIHJlcXVlc3QucmV0cnlGdW5jID0gYXN5bmMgKHJlcXVlc3QsIHJlc3BvbnNlLCBhdHRlbXB0KSA9PiB7XG4gICAgICAgICAgICAgICAgc2hvd1Rocm90dGxlTWVzc2FnZShcImFsY2hlbXlcIik7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXF1ZXN0O1xuICAgIH1cbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXByb3ZpZGVyLWFsY2hlbXkuanMubWFwIiwiLyoqXG4gKiAgW1tsaW5rLWNoYWluc3RhY2tdXSBwcm92aWRlcyBhIHRoaXJkLXBhcnR5IHNlcnZpY2UgZm9yIGNvbm5lY3RpbmcgdG9cbiAqICB2YXJpb3VzIGJsb2NrY2hhaW5zIG92ZXIgSlNPTi1SUEMuXG4gKlxuICogICoqU3VwcG9ydGVkIE5ldHdvcmtzKipcbiAqXG4gKiAgLSBFdGhlcmV1bSBNYWlubmV0IChgYG1haW5uZXRgYClcbiAqICAtIEFyYml0cnVtIChgYGFyYml0cnVtYGApXG4gKiAgLSBCTkIgU21hcnQgQ2hhaW4gTWFpbm5ldCAoYGBibmJgYClcbiAqICAtIFBvbHlnb24gKGBgbWF0aWNgYClcbiAqXG4gKiAgQF9zdWJzZWN0aW9uOiBhcGkvcHJvdmlkZXJzL3RoaXJkcGFydHk6Q2hhaW5zdGFjayAgW3Byb3ZpZGVycy1jaGFpbnN0YWNrXVxuICovXG5pbXBvcnQgeyBkZWZpbmVQcm9wZXJ0aWVzLCBGZXRjaFJlcXVlc3QsIGFzc2VydEFyZ3VtZW50IH0gZnJvbSBcIi4uL3V0aWxzL2luZGV4LmpzXCI7XG5pbXBvcnQgeyBzaG93VGhyb3R0bGVNZXNzYWdlIH0gZnJvbSBcIi4vY29tbXVuaXR5LmpzXCI7XG5pbXBvcnQgeyBOZXR3b3JrIH0gZnJvbSBcIi4vbmV0d29yay5qc1wiO1xuaW1wb3J0IHsgSnNvblJwY1Byb3ZpZGVyIH0gZnJvbSBcIi4vcHJvdmlkZXItanNvbnJwYy5qc1wiO1xuZnVuY3Rpb24gZ2V0QXBpS2V5KG5hbWUpIHtcbiAgICBzd2l0Y2ggKG5hbWUpIHtcbiAgICAgICAgY2FzZSBcIm1haW5uZXRcIjogcmV0dXJuIFwiMzlmMWQ2N2NlZGY4Yjc4MzEwMTBhNjY1MzI4YzkxOTdcIjtcbiAgICAgICAgY2FzZSBcImFyYml0cnVtXCI6IHJldHVybiBcIjA1NTBjMjA5ZGIzM2MzYWJmNGNjOTI3ZTFlMThjZWExXCI7XG4gICAgICAgIGNhc2UgXCJibmJcIjogcmV0dXJuIFwiOThiNWE3N2U1MzE2MTQzODczNjZmNmZjNWRhMDk3ZjhcIjtcbiAgICAgICAgY2FzZSBcIm1hdGljXCI6IHJldHVybiBcImNkOWQ0ZDcwMzc3NDcxYWE3YzE0MmVjNGE0MjA1MjQ5XCI7XG4gICAgfVxuICAgIGFzc2VydEFyZ3VtZW50KGZhbHNlLCBcInVuc3VwcG9ydGVkIG5ldHdvcmtcIiwgXCJuZXR3b3JrXCIsIG5hbW
26774UpO1xufVxuZnVuY3Rpb24gZ2V0SG9zdChuYW1lKSB7XG4gICAgc3dpdGNoIChuYW1lKSB7XG4gICAgICAgIGNhc2UgXCJtYWlubmV0XCI6XG4gICAgICAgICAgICByZXR1cm4gXCJldGhlcmV1bS1tYWlubmV0LmNvcmUuY2hhaW5zdGFjay5jb21cIjtcbiAgICAgICAgY2FzZSBcImFyYml0cnVtXCI6XG4gICAgICAgICAgICByZXR1cm4gXCJhcmJpdHJ1bS1tYWlubmV0LmNvcmUuY2hhaW5zdGFjay5jb21cIjtcbiAgICAgICAgY2FzZSBcImJuYlwiOlxuICAgICAgICAgICAgcmV0dXJuIFwiYnNjLW1haW5uZXQuY29yZS5jaGFpbnN0YWNrLmNvbVwiO1xuICAgICAgICBjYXNlIFwibWF0aWNcIjpcbiAgICAgICAgICAgIHJldHVybiBcInBvbHlnb24tbWFpbm5ldC5jb3JlLmNoYWluc3RhY2suY29tXCI7XG4gICAgfVxuICAgIGFzc2VydEFyZ3VtZW50KGZhbHNlLCBcInVuc3VwcG9ydGVkIG5ldHdvcmtcIiwgXCJuZXR3b3JrXCIsIG5hbWUpO1xufVxuLyoqXG4gKiAgVGhlICoqQ2hhaW5zdGFja1Byb3ZpZGVyKiogY29ubmVjdHMgdG8gdGhlIFtbbGluay1jaGFpbnN0YWNrXV1cbiAqICBKU09OLVJQQyBlbmQtcG9pbnRzLlxuICpcbiAqICBCeSBkZWZhdWx0LCBhIGhpZ2hseS10aHJvdHRsZWQgQVBJIGtleSBpcyB1c2VkLCB3aGljaCBpc1xuICogIGFwcHJvcHJpYXRlIGZvciBxdWljayBwcm90b3R5cGVzIGFuZCBzaW1wbGUgc2NyaXB0cy4gVG9cbiAqICBnYWluIGFjY2VzcyB0byBhbiBpbmNyZWFzZWQgcmF0ZS1saW1pdCwgaXQgaXMgaGlnaGx5XG4gKiAgcmVjb21tZW5kZWQgdG8gW3NpZ24gdXAgaGVyZV0obGluay1jaGFpbnN0YWNrKS5cbiAqL1xuZXhwb3J0IGNsYXNzIENoYWluc3RhY2tQcm92aWRlciBleHRlbmRzIEpzb25ScGNQcm92aWRlciB7XG4gICAgLyoqXG4gICAgICogIFRoZSBBUEkga2V5IGZvciB0aGUgQ2hhaW5zdGFjayBjb25uZWN0aW9uLlxuICAgICAqL1xuICAgIGFwaUtleTtcbiAgICAvKipcbiAgICAgKiAgQ3JlYXRlcyBhIG5ldyAqKkNoYWluc3RhY2tQcm92aWRlcioqLlxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yKF9uZXR3b3JrLCBhcGlLZXkpIHtcbiAgICAgICAgaWYgKF9uZXR3b3JrID09IG51bGwpIHtcbiAgICAgICAgICAgIF9uZXR3b3JrID0gXCJtYWlubmV0XCI7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgbmV0d29yayA9IE5ldHdvcmsuZnJvbShfbmV0d29yayk7XG4gICAgICAgIGlmIChhcGlLZXkgPT0gbnVsbCkge1xuICAgICAgICAgICAgYXBpS2V5ID0gZ2V0QXBpS2V5KG5ldHdvcmsubmFtZSk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgcmVxdWVzdCA9IENoYWluc3RhY2tQcm92aWRlci5nZXRSZXF1ZXN0KG5ldHdvcmssIGFwaUtleSk7XG4gICAgICAgIHN1cGVyKHJlcXVlc3QsIG5ldHdvcmssIHsgc3RhdGljTmV0d29yazogbmV0d29yayB9KTtcbiAgICAgICAgZGVmaW5lUHJvcGVydGllcyh0aGlzLCB7IGFwaUtleSB9KTtcbiAgICB9XG4gICAgX2dldFByb3ZpZGVyKGNoYWluSWQpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHJldHVybiBuZXcgQ2hhaW5zdGFja1Byb3ZpZGVyKGNoYWluSWQsIHRoaXMuYXBpS2V5KTtcbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZXJyb3IpIHsgfVxuICAgICAgICByZXR1cm4gc3VwZXIuX2dldFByb3ZpZGVyKGNoYWluSWQpO1xuICAgIH1cbiAgICBpc0NvbW11bml0eVJlc291cmNlKCkge1xuICAgICAgICByZXR1cm4gKHRoaXMuYXBpS2V5ID09PSBnZXRBcGlLZXkodGhpcy5fbmV0d29yay5uYW1lKSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqICBSZXR1cm5zIGEgcHJlcGFyZWQgcmVxdWVzdCBmb3IgY29ubmVjdGluZyB0byAlJW5ldHdvcmslJVxuICAgICAqICB3aXRoICUlYXBpS2V5JSUgYW5kICUlcHJvamVjdFNlY3JldCUlLlxuICAgICAqL1xuICAgIHN0YXRpYyBnZXRSZXF1ZXN0KG5ldHdvcmssIGFwaUtleSkge1xuICAgICAgICBpZiAoYXBpS2V5ID09IG51bGwpIHtcbiAgICAgICAgICAgIGFwaUtleSA9IGdldEFwaUtleShuZXR3b3JrLm5hbWUpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHJlcXVlc3QgPSBuZXcgRmV0Y2hSZXF1ZXN0KGBodHRwczovXFwvJHtnZXRIb3N0KG5ldHdvcmsubmFtZSl9LyR7YXBpS2V5fWApO1xuICAgICAgICByZXF1ZXN0LmFsbG93R3ppcCA9IHRydWU7XG4gICAgICAgIGlmIChhcGlLZXkgPT09IGdldEFwaUtleShuZXR3b3JrLm5hbWUpKSB7XG4gICAgICAgICAgICByZXF1ZXN0LnJldHJ5RnVuYyA9IGFzeW5jIChyZXF1ZXN0LCByZXNwb25zZSwgYXR0ZW1wdCkgPT4ge1xuICAgICAgICAgICAgICAgIHNob3dUaHJvdHRsZU1lc3NhZ2UoXCJDaGFpbnN0YWNrUHJvdmlkZXJcIik7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXF1ZXN0O1xuICAgIH1cbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXByb3ZpZGVyLWNoYWluc3RhY2suanMubWFwIiwiLyoqXG4gKiAgQWJvdXQgQ2xvdWRmbGFyZVxuICpcbiAqICBAX3N1YnNlY3Rpb246IGFwaS9wcm92aWRlcnMvdGhpcmRwYXJ0eTpDbG91ZGZsYXJlICBbcHJvdmlkZXJzLWNsb3VkZmxhcmVdXG4gKi9cbmltcG9ydCB7IGFzc2VydEFyZ3VtZW50IH0gZnJvbSBcIi4uL3V0aWxzL2luZGV4LmpzXCI7XG5pbXBvcnQgeyBOZXR3b3JrIH0gZnJvbSBcIi4vbmV0d29yay5qc1wiO1xuaW1wb3J0IHsgSnNvblJwY1Byb3ZpZGVyIH0gZnJvbSBcIi4vcHJvdmlkZXItanNvbnJwYy5qc1wiO1xuLyoqXG4gKiAgQWJvdXQgQ2xvdWRmbGFyZS4uLlxuICovXG5leHBvcnQgY2xhc3MgQ2xvdWRmbGFyZVByb3ZpZGVyIGV4dGVuZHMgSnNvblJwY1Byb3ZpZGVyIHtcbiAgICBjb25zdHJ1Y3RvcihfbmV0d29yaykge1xuICAgICAgICBpZiAoX25ldHdvcmsgPT0gbnVsbCkge1xuICAgICAgICAgICAgX25ldHdvcmsgPSBcIm1haW5uZXRcIjtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBuZXR3b3JrID0gTmV0d29yay5mcm9tKF9uZXR3b3JrKTtcbiAgICAgICAgYXNzZXJ0QXJndW1lbnQobmV0d29yay5uYW1lID09PSBcIm1haW5uZXRcIiwgXCJ1bnN1cHBvcnRlZCBuZXR3b3JrXCIsIFwibmV0d29ya1wiLCBfbmV0d29yayk7XG4gICAgICAgI
26774HN1cGVyKFwiaHR0cHM6L1xcL2Nsb3VkZmxhcmUtZXRoLmNvbS9cIiwgbmV0d29yaywgeyBzdGF0aWNOZXR3b3JrOiBuZXR3b3JrIH0pO1xuICAgIH1cbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXByb3ZpZGVyLWNsb3VkZmxhcmUuanMubWFwIiwiLyoqXG4gKiAgW1tsaW5rLWV0aGVyc2Nhbl1dIHByb3ZpZGVzIGEgdGhpcmQtcGFydHkgc2VydmljZSBmb3IgY29ubmVjdGluZyB0b1xuICogIHZhcmlvdXMgYmxvY2tjaGFpbnMgb3ZlciBhIGNvbWJpbmF0aW9uIG9mIEpTT04tUlBDIGFuZCBjdXN0b20gQVBJXG4gKiAgZW5kcG9pbnRzLlxuICpcbiAqICAqKlN1cHBvcnRlZCBOZXR3b3JrcyoqXG4gKlxuICogIC0gRXRoZXJldW0gTWFpbm5ldCAoYGBtYWlubmV0YGApXG4gKiAgLSBHb2VybGkgVGVzdG5ldCAoYGBnb2VybGlgYClcbiAqICAtIFNlcG9saWEgVGVzdG5ldCAoYGBzZXBvbGlhYGApXG4gKiAgLSBIb2xlc2t5IFRlc3RuZXQgKGBgaG9sZXNreWBgKVxuICogIC0gQXJiaXRydW0gKGBgYXJiaXRydW1gYClcbiAqICAtIEFyYml0cnVtIEdvZXJsaSBUZXN0bmV0IChgYGFyYml0cnVtLWdvZXJsaWBgKVxuICogIC0gQmFzZSAoYGBiYXNlYGApXG4gKiAgLSBCYXNlIFNlcG9saWEgVGVzdG5ldCAoYGBiYXNlLXNlcG9saWFgYClcbiAqICAtIEJOQiBTbWFydCBDaGFpbiBNYWlubmV0IChgYGJuYmBgKVxuICogIC0gQk5CIFNtYXJ0IENoYWluIFRlc3RuZXQgKGBgYm5idGBgKVxuICogIC0gT3B0aW1pc20gKGBgb3B0aW1pc21gYClcbiAqICAtIE9wdGltaXNtIEdvZXJsaSBUZXN0bmV0IChgYG9wdGltaXNtLWdvZXJsaWBgKVxuICogIC0gUG9seWdvbiAoYGBtYXRpY2BgKVxuICogIC0gUG9seWdvbiBNdW1iYWkgVGVzdG5ldCAoYGBtYXRpYy1tdW1iYWlgYClcbiAqICAtIFBvbHlnb24gQW1veSBUZXN0bmV0IChgYG1hdGljLWFtb3lgYClcbiAqXG4gKiAgQF9zdWJzZWN0aW9uIGFwaS9wcm92aWRlcnMvdGhpcmRwYXJ0eTpFdGhlcnNjYW4gIFtwcm92aWRlcnMtZXRoZXJzY2FuXVxuICovXG5pbXBvcnQgeyBBYmlDb2RlciB9IGZyb20gXCIuLi9hYmkvaW5kZXguanNcIjtcbmltcG9ydCB7IENvbnRyYWN0IH0gZnJvbSBcIi4uL2NvbnRyYWN0L2luZGV4LmpzXCI7XG5pbXBvcnQgeyBhY2Nlc3NMaXN0aWZ5LCBUcmFuc2FjdGlvbiB9IGZyb20gXCIuLi90cmFuc2FjdGlvbi9pbmRleC5qc1wiO1xuaW1wb3J0IHsgZGVmaW5lUHJvcGVydGllcywgaGV4bGlmeSwgdG9RdWFudGl0eSwgRmV0Y2hSZXF1ZXN0LCBhc3NlcnQsIGFzc2VydEFyZ3VtZW50LCBpc0Vycm9yLCBcbi8vICAgIHBhcnNlVW5pdHMsXG50b1V0ZjhTdHJpbmcgfSBmcm9tIFwiLi4vdXRpbHMvaW5kZXguanNcIjtcbmltcG9ydCB7IEFic3RyYWN0UHJvdmlkZXIgfSBmcm9tIFwiLi9hYnN0cmFjdC1wcm92aWRlci5qc1wiO1xuaW1wb3J0IHsgTmV0d29yayB9IGZyb20gXCIuL25ldHdvcmsuanNcIjtcbmltcG9ydCB7IE5ldHdvcmtQbHVnaW4gfSBmcm9tIFwiLi9wbHVnaW5zLW5ldHdvcmsuanNcIjtcbmltcG9ydCB7IHNob3dUaHJvdHRsZU1lc3NhZ2UgfSBmcm9tIFwiLi9jb21tdW5pdHkuanNcIjtcbi8vIFNlZTogaHR0cHM6Ly9kb2NzLmV0aGVyc2Nhbi5pby9zdXBwb3J0ZWQtY2hhaW5zXG5jb25zdCBTdXBwb3J0ZWQgPSAoXCIxIDExMTU1MTExIDE3MDAwIDU2MDA0OCAyNzQxIDExMTI0IDMzMTExIDMzMTM5IDQyMTcwIFwiICtcbiAgICBcIjQyMTYxIDQyMTYxNCA0MzExNCA0MzExMyA4NDUzIDg0NTMyIDgwMDY5IDgwMDk0IDE5OSAxMDI5IDgxNDU3IFwiICtcbiAgICBcIjE2ODU4Nzc3MyA1NiA5NyA0MjIyMCAxMTE0MjIyMCAyNTIgMjUyMyAxMDAgOTk5IDczNzM3MyA3NDc0NzQgXCIgK1xuICAgIFwiNTkxNDQgNTkxNDEgNTAwMCA1MDAzIDQzNTIxIDE0MyAxMDE0MyAxMjg3IDEyODQgMTI4NSAxMCBcIiArXG4gICAgXCIxMTE1NTQyMCAyMDQgNTYxMSA4MDAwMiAxMzcgNTM0MzUyIDUzNDM1MSAxMzI5IDEzMjggMTQ2IDE0NjAxIFwiICtcbiAgICBcIjk4OCAyMjAxIDE5MjMgMTkyNCAxNjcwMTMgMTY3MDAwIDEzMCAxMzAxIDQ4MCA0ODAxIDUxIDUwIDMyNCAzMDBcIikuc3BsaXQoLyAvZyk7XG5jb25zdCBUSFJPVFRMRSA9IDIwMDA7XG5mdW5jdGlvbiBpc1Byb21pc2UodmFsdWUpIHtcbiAgICByZXR1cm4gKHZhbHVlICYmIHR5cGVvZiAodmFsdWUudGhlbikgPT09IFwiZnVuY3Rpb25cIik7XG59XG5jb25zdCBFdGhlcnNjYW5QbHVnaW5JZCA9IFwib3JnLmV0aGVycy5wbHVnaW5zLnByb3ZpZGVyLkV0aGVyc2NhblwiO1xuLyoqXG4gKiAgQSBOZXR3b3JrIGNhbiBpbmNsdWRlIGFuICoqRXRoZXJzY2FuUGx1Z2luKiogdG8gcHJvdmlkZVxuICogIGEgY3VzdG9tIGJhc2UgVVJMLlxuICpcbiAqICBAX2RvY2xvYzogYXBpL3Byb3ZpZGVycy90aGlyZHBhcnR5OkV0aGVyc2NhblxuICovXG5leHBvcnQgY2xhc3MgRXRoZXJzY2FuUGx1Z2luIGV4dGVuZHMgTmV0d29ya1BsdWdpbiB7XG4gICAgLyoqXG4gICAgICogIFRoZSBFdGhlcnNjYW4gQVBJIGJhc2UgVVJMLlxuICAgICAqL1xuICAgIGJhc2VVcmw7XG4gICAgLyoqXG4gICAgICogIENyZWF0ZXMgYSBuZXcgKipFdGhlcnNjYW5Qcm92aWRlcioqIHdoaWNoIHdpbGwgdXNlXG4gICAgICogICUlYmFzZVVybCUlLlxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yKGJhc2VVcmwpIHtcbiAgICAgICAgc3VwZXIoRXRoZXJzY2FuUGx1Z2luSWQpO1xuICAgICAgICBkZWZpbmVQcm9wZXJ0aWVzKHRoaXMsIHsgYmFzZVVybCB9KTtcbiAgICB9XG4gICAgY2xvbmUoKSB7XG4gICAgICAgIHJldHVybiBuZXcgRXRoZXJzY2FuUGx1Z2luKHRoaXMuYmFzZVVybCk7XG4gICAgfVxufVxuY29uc3Qgc2tpcEtleXMgPSBbXCJlbmFibGVDY2lwUmVhZFwiXTtcbmxldCBuZXh0SWQgPSAxO1xuLyoqXG4gKiAgVGhlICoqRXRoZXJzY2FuQmFzZVByb3ZpZGVyKiogaXMgdGhlIHN1cGVyLWNsYXNzIG9mXG4gKiAgW1tFdGhlcnNjYW5Qcm92aWRlcl1dLCB3aGljaCBzaG91bGQgZ2VuZXJhbGx5IGJlIHVzZWQgaW5zdGVhZC5cbiAqXG4gKiAgU2luY2UgdGhlICoqRXRoZXJzY2FuUHJvdmlkZXIqKiBpbmNsdWRlcyBhZGRpdGlvbmFsIGNvZGUgZm9yXG4gKiAgW1tDb250cmFjdF1dIGFjY2VzcywgaW4gLy9yYXJlIGNhc2VzLy8gdGhhdCBjb250cmFjdHMgYXJlIG5vdFxuICogIHVzZWQsIHRoaXMgY2x
26774hc3MgY2FuIHJlZHVjZSBjb2RlIHNpemUuXG4gKlxuICogIEBfZG9jbG9jOiBhcGkvcHJvdmlkZXJzL3RoaXJkcGFydHk6RXRoZXJzY2FuXG4gKi9cbmV4cG9ydCBjbGFzcyBFdGhlcnNjYW5Qcm92aWRlciBleHRlbmRzIEFic3RyYWN0UHJvdmlkZXIge1xuICAgIC8qKlxuICAgICAqICBUaGUgY29ubmVjdGVkIG5ldHdvcmsuXG4gICAgICovXG4gICAgbmV0d29yaztcbiAgICAvKipcbiAgICAgKiAgVGhlIEFQSSBrZXkgb3IgbnVsbCBpZiB1c2luZyB0aGUgY29tbXVuaXR5IHByb3ZpZGVkIGJhbmR3aWR0aC5cbiAgICAgKi9cbiAgICBhcGlLZXk7XG4gICAgI3BsdWdpbjtcbiAgICAvKipcbiAgICAgKiAgQ3JlYXRlcyBhIG5ldyAqKkV0aGVyc2NhbkJhc2VQcm92aWRlcioqLlxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yKF9uZXR3b3JrLCBfYXBpS2V5KSB7XG4gICAgICAgIGNvbnN0IGFwaUtleSA9IChfYXBpS2V5ICE9IG51bGwpID8gX2FwaUtleSA6IG51bGw7XG4gICAgICAgIHN1cGVyKCk7XG4gICAgICAgIGNvbnN0IG5ldHdvcmsgPSBOZXR3b3JrLmZyb20oX25ldHdvcmspO1xuICAgICAgICBhc3NlcnRBcmd1bWVudChTdXBwb3J0ZWQuaW5kZXhPZihgJHtuZXR3b3JrLmNoYWluSWR9YCkgPj0gMCwgXCJ1bnN1cHBvcnRlZCBuZXR3b3JrXCIsIFwibmV0d29ya1wiLCBuZXR3b3JrKTtcbiAgICAgICAgdGhpcy4jcGx1Z2luID0gbmV0d29yay5nZXRQbHVnaW4oRXRoZXJzY2FuUGx1Z2luSWQpO1xuICAgICAgICBkZWZpbmVQcm9wZXJ0aWVzKHRoaXMsIHsgYXBpS2V5LCBuZXR3b3JrIH0pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiAgUmV0dXJucyB0aGUgYmFzZSBVUkwuXG4gICAgICpcbiAgICAgKiAgSWYgYW4gW1tFdGhlcnNjYW5QbHVnaW5dXSBpcyBjb25maWd1cmVkIG9uIHRoZVxuICAgICAqICBbW0V0aGVyc2NhbkJhc2VQcm92aWRlcl9uZXR3b3JrXV0sIHJldHVybnMgdGhlIHBsdWdpbidzXG4gICAgICogIGJhc2VVcmwuXG4gICAgICpcbiAgICAgKiAgRGVwcmVjYXRlZDsgZm9yIEV0aGVyc2NhbiB2MiB0aGUgYmFzZSBpcyBubyBsb25nZXIgYSBzaW1wbHlcbiAgICAgKiAgaG9zdCwgYnV0IGluc3RlYWQgYSBVUkwgaW5jbHVkaW5nIGEgY2hhaW5JZCBwYXJhbWV0ZXIuIENoYW5naW5nXG4gICAgICogIHRoaXMgdG8gcmV0dXJuIGEgVVJMIHByZWZpeCBjb3VsZCBicmVhayBzb21lIGxpYnJhcmllcywgc28gaXRcbiAgICAgKiAgaXMgbGVmdCBpbnRhY3QgYnV0IHdpbGwgYmUgcmVtb3ZlZCBpbiB0aGUgZnV0dXJlIGFzIGl0IGlzIHVudXNlZC5cbiAgICAgKi9cbiAgICBnZXRCYXNlVXJsKCkge1xuICAgICAgICBpZiAodGhpcy4jcGx1Z2luKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy4jcGx1Z2luLmJhc2VVcmw7XG4gICAgICAgIH1cbiAgICAgICAgc3dpdGNoICh0aGlzLm5ldHdvcmsubmFtZSkge1xuICAgICAgICAgICAgY2FzZSBcIm1haW5uZXRcIjpcbiAgICAgICAgICAgICAgICByZXR1cm4gXCJodHRwczovXFwvYXBpLmV0aGVyc2Nhbi5pb1wiO1xuICAgICAgICAgICAgY2FzZSBcImdvZXJsaVwiOlxuICAgICAgICAgICAgICAgIHJldHVybiBcImh0dHBzOi9cXC9hcGktZ29lcmxpLmV0aGVyc2Nhbi5pb1wiO1xuICAgICAgICAgICAgY2FzZSBcInNlcG9saWFcIjpcbiAgICAgICAgICAgICAgICByZXR1cm4gXCJodHRwczovXFwvYXBpLXNlcG9saWEuZXRoZXJzY2FuLmlvXCI7XG4gICAgICAgICAgICBjYXNlIFwiaG9sZXNreVwiOlxuICAgICAgICAgICAgICAgIHJldHVybiBcImh0dHBzOi9cXC9hcGktaG9sZXNreS5ldGhlcnNjYW4uaW9cIjtcbiAgICAgICAgICAgIGNhc2UgXCJhcmJpdHJ1bVwiOlxuICAgICAgICAgICAgICAgIHJldHVybiBcImh0dHBzOi9cXC9hcGkuYXJiaXNjYW4uaW9cIjtcbiAgICAgICAgICAgIGNhc2UgXCJhcmJpdHJ1bS1nb2VybGlcIjpcbiAgICAgICAgICAgICAgICByZXR1cm4gXCJodHRwczovXFwvYXBpLWdvZXJsaS5hcmJpc2Nhbi5pb1wiO1xuICAgICAgICAgICAgY2FzZSBcImJhc2VcIjpcbiAgICAgICAgICAgICAgICByZXR1cm4gXCJodHRwczovXFwvYXBpLmJhc2VzY2FuLm9yZ1wiO1xuICAgICAgICAgICAgY2FzZSBcImJhc2Utc2Vwb2xpYVwiOlxuICAgICAgICAgICAgICAgIHJldHVybiBcImh0dHBzOi9cXC9hcGktc2Vwb2xpYS5iYXNlc2Nhbi5vcmdcIjtcbiAgICAgICAgICAgIGNhc2UgXCJibmJcIjpcbiAgICAgICAgICAgICAgICByZXR1cm4gXCJodHRwczovXFwvYXBpLmJzY3NjYW4uY29tXCI7XG4gICAgICAgICAgICBjYXNlIFwiYm5idFwiOlxuICAgICAgICAgICAgICAgIHJldHVybiBcImh0dHBzOi9cXC9hcGktdGVzdG5ldC5ic2NzY2FuLmNvbVwiO1xuICAgICAgICAgICAgY2FzZSBcIm1hdGljXCI6XG4gICAgICAgICAgICAgICAgcmV0dXJuIFwiaHR0cHM6L1xcL2FwaS5wb2x5Z29uc2Nhbi5jb21cIjtcbiAgICAgICAgICAgIGNhc2UgXCJtYXRpYy1hbW95XCI6XG4gICAgICAgICAgICAgICAgcmV0dXJuIFwiaHR0cHM6L1xcL2FwaS1hbW95LnBvbHlnb25zY2FuLmNvbVwiO1xuICAgICAgICAgICAgY2FzZSBcIm1hdGljLW11bWJhaVwiOlxuICAgICAgICAgICAgICAgIHJldHVybiBcImh0dHBzOi9cXC9hcGktdGVzdG5ldC5wb2x5Z29uc2Nhbi5jb21cIjtcbiAgICAgICAgICAgIGNhc2UgXCJvcHRpbWlzbVwiOlxuICAgICAgICAgICAgICAgIHJldHVybiBcImh0dHBzOi9cXC9hcGktb3B0aW1pc3RpYy5ldGhlcnNjYW4uaW9cIjtcbiAgICAgICAgICAgIGNhc2UgXCJvcHRpbWlzbS1nb2VybGlcIjpcbiAgICAgICAgICAgICAgICByZXR1cm4gXCJodHRwczovXFwvYXBpLWdvZXJsaS1vcHRpbWlzdGljLmV0aGVyc2Nhbi5pb1wiO1xuICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgfVxuICAgICAgICBhc3NlcnRBcmd1bWVudChmYWxzZSwgXCJ1bnN1cHBvcnRlZCBuZXR3b3JrXCIsIFwibmV0d29ya1wiLCB0aGlzLm5ldHdvcmspO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiAgUmV0dXJucyB0aGUgVVJMIGZvciB0aGUgJSVtb2R1bGUlJSBhbmQgJSVwYXJhbXMlJS5cbiAgICAgKi9cbiAgICBnZXRVcmwobW9kdWxlLCBwYXJhbXMpIHtcbiAgICAgICAgbGV0IHF1ZXJ5ID0gT2JqZWN0LmtleXMocGFyYW1zKS5yZWR1Y2UoKGFjY3VtLCBrZXkpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gcGFyYW1zW2tleV07XG4gICAgICAgICAgICBpZiAodmFsdWUgIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIGFjY3VtICs9IGAmJHtrZXl9PSR7dmFsdWV9YDtcbiAgICAgICAgICAgI
26774H1cbiAgICAgICAgICAgIHJldHVybiBhY2N1bTtcbiAgICAgICAgfSwgXCJcIik7XG4gICAgICAgIGlmICh0aGlzLmFwaUtleSkge1xuICAgICAgICAgICAgcXVlcnkgKz0gYCZhcGlrZXk9JHt0aGlzLmFwaUtleX1gO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBgaHR0cHM6L1xcL2FwaS5ldGhlcnNjYW4uaW8vdjIvYXBpP2NoYWluaWQ9JHt0aGlzLm5ldHdvcmsuY2hhaW5JZH0mbW9kdWxlPSR7bW9kdWxlfSR7cXVlcnl9YDtcbiAgICB9XG4gICAgLyoqXG4gICAgICogIFJldHVybnMgdGhlIFVSTCBmb3IgdXNpbmcgUE9TVCByZXF1ZXN0cy5cbiAgICAgKi9cbiAgICBnZXRQb3N0VXJsKCkge1xuICAgICAgICByZXR1cm4gYGh0dHBzOi9cXC9hcGkuZXRoZXJzY2FuLmlvL3YyL2FwaT9jaGFpbmlkPSR7dGhpcy5uZXR3b3JrLmNoYWluSWR9YDtcbiAgICB9XG4gICAgLyoqXG4gICAgICogIFJldHVybnMgdGhlIHBhcmFtZXRlcnMgZm9yIHVzaW5nIFBPU1QgcmVxdWVzdHMuXG4gICAgICovXG4gICAgZ2V0UG9zdERhdGEobW9kdWxlLCBwYXJhbXMpIHtcbiAgICAgICAgcGFyYW1zLm1vZHVsZSA9IG1vZHVsZTtcbiAgICAgICAgcGFyYW1zLmFwaWtleSA9IHRoaXMuYXBpS2V5O1xuICAgICAgICBwYXJhbXMuY2hhaW5pZCA9IHRoaXMubmV0d29yay5jaGFpbklkO1xuICAgICAgICByZXR1cm4gcGFyYW1zO1xuICAgIH1cbiAgICBhc3luYyBkZXRlY3ROZXR3b3JrKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5uZXR3b3JrO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiAgUmVzb2x2ZXMgdG8gdGhlIHJlc3VsdCBvZiBjYWxsaW5nICUlbW9kdWxlJSUgd2l0aCAlJXBhcmFtcyUlLlxuICAgICAqXG4gICAgICogIElmICUlcG9zdCUlLCB0aGUgcmVxdWVzdCBpcyBtYWRlIGFzIGEgUE9TVCByZXF1ZXN0LlxuICAgICAqL1xuICAgIGFzeW5jIGZldGNoKG1vZHVsZSwgcGFyYW1zLCBwb3N0KSB7XG4gICAgICAgIGNvbnN0IGlkID0gbmV4dElkKys7XG4gICAgICAgIGNvbnN0IHVybCA9IChwb3N0ID8gdGhpcy5nZXRQb3N0VXJsKCkgOiB0aGlzLmdldFVybChtb2R1bGUsIHBhcmFtcykpO1xuICAgICAgICBjb25zdCBwYXlsb2FkID0gKHBvc3QgPyB0aGlzLmdldFBvc3REYXRhKG1vZHVsZSwgcGFyYW1zKSA6IG51bGwpO1xuICAgICAgICB0aGlzLmVtaXQoXCJkZWJ1Z1wiLCB7IGFjdGlvbjogXCJzZW5kUmVxdWVzdFwiLCBpZCwgdXJsLCBwYXlsb2FkOiBwYXlsb2FkIH0pO1xuICAgICAgICBjb25zdCByZXF1ZXN0ID0gbmV3IEZldGNoUmVxdWVzdCh1cmwpO1xuICAgICAgICByZXF1ZXN0LnNldFRocm90dGxlUGFyYW1zKHsgc2xvdEludGVydmFsOiAxMDAwIH0pO1xuICAgICAgICByZXF1ZXN0LnJldHJ5RnVuYyA9IChyZXEsIHJlc3AsIGF0dGVtcHQpID0+IHtcbiAgICAgICAgICAgIGlmICh0aGlzLmlzQ29tbXVuaXR5UmVzb3VyY2UoKSkge1xuICAgICAgICAgICAgICAgIHNob3dUaHJvdHRsZU1lc3NhZ2UoXCJFdGhlcnNjYW5cIik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHRydWUpO1xuICAgICAgICB9O1xuICAgICAgICByZXF1ZXN0LnByb2Nlc3NGdW5jID0gYXN5bmMgKHJlcXVlc3QsIHJlc3BvbnNlKSA9PiB7XG4gICAgICAgICAgICBjb25zdCByZXN1bHQgPSByZXNwb25zZS5oYXNCb2R5KCkgPyBKU09OLnBhcnNlKHRvVXRmOFN0cmluZyhyZXNwb25zZS5ib2R5KSkgOiB7fTtcbiAgICAgICAgICAgIGNvbnN0IHRocm90dGxlID0gKCh0eXBlb2YgKHJlc3VsdC5yZXN1bHQpID09PSBcInN0cmluZ1wiKSA/IHJlc3VsdC5yZXN1bHQgOiBcIlwiKS50b0xvd2VyQ2FzZSgpLmluZGV4T2YoXCJyYXRlIGxpbWl0XCIpID49IDA7XG4gICAgICAgICAgICBpZiAobW9kdWxlID09PSBcInByb3h5XCIpIHtcbiAgICAgICAgICAgICAgICAvLyBUaGlzIEpTT04gcmVzcG9uc2UgaW5kaWNhdGVzIHdlIGFyZSBiZWluZyB0aHJvdHRsZWRcbiAgICAgICAgICAgICAgICBpZiAocmVzdWx0ICYmIHJlc3VsdC5zdGF0dXMgPT0gMCAmJiByZXN1bHQubWVzc2FnZSA9PSBcIk5PVE9LXCIgJiYgdGhyb3R0bGUpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5lbWl0KFwiZGVidWdcIiwgeyBhY3Rpb246IFwicmVjZWl2ZUVycm9yXCIsIGlkLCByZWFzb246IFwicHJveHktTk9UT0tcIiwgZXJyb3I6IHJlc3VsdCB9KTtcbiAgICAgICAgICAgICAgICAgICAgcmVzcG9uc2UudGhyb3dUaHJvdHRsZUVycm9yKHJlc3VsdC5yZXN1bHQsIFRIUk9UVExFKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBpZiAodGhyb3R0bGUpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5lbWl0KFwiZGVidWdcIiwgeyBhY3Rpb246IFwicmVjZWl2ZUVycm9yXCIsIGlkLCByZWFzb246IFwibnVsbCByZXN1bHRcIiwgZXJyb3I6IHJlc3VsdC5yZXN1bHQgfSk7XG4gICAgICAgICAgICAgICAgICAgIHJlc3BvbnNlLnRocm93VGhyb3R0bGVFcnJvcihyZXN1bHQucmVzdWx0LCBUSFJPVFRMRSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHJlc3BvbnNlO1xuICAgICAgICB9O1xuICAgICAgICBpZiAocGF5bG9hZCkge1xuICAgICAgICAgICAgcmVxdWVzdC5zZXRIZWFkZXIoXCJjb250ZW50LXR5cGVcIiwgXCJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQ7IGNoYXJzZXQ9VVRGLThcIik7XG4gICAgICAgICAgICByZXF1ZXN0LmJvZHkgPSBPYmplY3Qua2V5cyhwYXlsb2FkKS5tYXAoKGspID0+IGAke2t9PSR7cGF5bG9hZFtrXX1gKS5qb2luKFwiJlwiKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IHJlcXVlc3Quc2VuZCgpO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgcmVzcG9uc2UuYXNzZXJ0T2soKTtcbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgIHRoaXMuZW1pdChcImRlYnVnXCIsIHsgYWN0aW9uOiBcInJlY2VpdmVFcnJvclwiLCBpZCwgZXJyb3IsIHJlYXNvbjogXCJhc3NlcnRPa1wiIH0pO1xuICAgICAgICAgICAgYXNzZXJ0KGZhbHNlLCBcInJlc3BvbnNlIGVycm9yXCIsIFwiU0VSVkVSX0VSUk9SXCIsIHsgcmVxdWVzdCwgcmVzcG9uc2UgfSk7XG4gICAgICAgI
26774H1cbiAgICAgICAgaWYgKCFyZXNwb25zZS5oYXNCb2R5KCkpIHtcbiAgICAgICAgICAgIHRoaXMuZW1pdChcImRlYnVnXCIsIHsgYWN0aW9uOiBcInJlY2VpdmVFcnJvclwiLCBpZCwgZXJyb3I6IFwibWlzc2luZyBib2R5XCIsIHJlYXNvbjogXCJudWxsIGJvZHlcIiB9KTtcbiAgICAgICAgICAgIGFzc2VydChmYWxzZSwgXCJtaXNzaW5nIHJlc3BvbnNlXCIsIFwiU0VSVkVSX0VSUk9SXCIsIHsgcmVxdWVzdCwgcmVzcG9uc2UgfSk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgcmVzdWx0ID0gSlNPTi5wYXJzZSh0b1V0ZjhTdHJpbmcocmVzcG9uc2UuYm9keSkpO1xuICAgICAgICBpZiAobW9kdWxlID09PSBcInByb3h5XCIpIHtcbiAgICAgICAgICAgIGlmIChyZXN1bHQuanNvbnJwYyAhPSBcIjIuMFwiKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5lbWl0KFwiZGVidWdcIiwgeyBhY3Rpb246IFwicmVjZWl2ZUVycm9yXCIsIGlkLCByZXN1bHQsIHJlYXNvbjogXCJpbnZhbGlkIEpTT04tUlBDXCIgfSk7XG4gICAgICAgICAgICAgICAgYXNzZXJ0KGZhbHNlLCBcImludmFsaWQgSlNPTi1SUEMgcmVzcG9uc2UgKG1pc3NpbmcganNvbnJwYz0nMi4wJylcIiwgXCJTRVJWRVJfRVJST1JcIiwgeyByZXF1ZXN0LCByZXNwb25zZSwgaW5mbzogeyByZXN1bHQgfSB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChyZXN1bHQuZXJyb3IpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmVtaXQoXCJkZWJ1Z1wiLCB7IGFjdGlvbjogXCJyZWNlaXZlRXJyb3JcIiwgaWQsIHJlc3VsdCwgcmVhc29uOiBcIkpTT04tUlBDIGVycm9yXCIgfSk7XG4gICAgICAgICAgICAgICAgYXNzZXJ0KGZhbHNlLCBcImVycm9yIHJlc3BvbnNlXCIsIFwiU0VSVkVSX0VSUk9SXCIsIHsgcmVxdWVzdCwgcmVzcG9uc2UsIGluZm86IHsgcmVzdWx0IH0gfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLmVtaXQoXCJkZWJ1Z1wiLCB7IGFjdGlvbjogXCJyZWNlaXZlUmVxdWVzdFwiLCBpZCwgcmVzdWx0IH0pO1xuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdC5yZXN1bHQ7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAvLyBnZXRMb2dzLCBnZXRIaXN0b3J5IGhhdmUgd2VpcmQgc3VjY2VzcyByZXNwb25zZXNcbiAgICAgICAgICAgIGlmIChyZXN1bHQuc3RhdHVzID09IDAgJiYgKHJlc3VsdC5tZXNzYWdlID09PSBcIk5vIHJlY29yZHMgZm91bmRcIiB8fCByZXN1bHQubWVzc2FnZSA9PT0gXCJObyB0cmFuc2FjdGlvbnMgZm91bmRcIikpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmVtaXQoXCJkZWJ1Z1wiLCB7IGFjdGlvbjogXCJyZWNlaXZlUmVxdWVzdFwiLCBpZCwgcmVzdWx0IH0pO1xuICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQucmVzdWx0O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHJlc3VsdC5zdGF0dXMgIT0gMSB8fCAodHlwZW9mIChyZXN1bHQubWVzc2FnZSkgPT09IFwic3RyaW5nXCIgJiYgIXJlc3VsdC5tZXNzYWdlLm1hdGNoKC9eT0svKSkpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmVtaXQoXCJkZWJ1Z1wiLCB7IGFjdGlvbjogXCJyZWNlaXZlRXJyb3JcIiwgaWQsIHJlc3VsdCB9KTtcbiAgICAgICAgICAgICAgICBhc3NlcnQoZmFsc2UsIFwiZXJyb3IgcmVzcG9uc2VcIiwgXCJTRVJWRVJfRVJST1JcIiwgeyByZXF1ZXN0LCByZXNwb25zZSwgaW5mbzogeyByZXN1bHQgfSB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuZW1pdChcImRlYnVnXCIsIHsgYWN0aW9uOiBcInJlY2VpdmVSZXF1ZXN0XCIsIGlkLCByZXN1bHQgfSk7XG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0LnJlc3VsdDtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiAgUmV0dXJucyAlJXRyYW5zYWN0aW9uJSUgbm9ybWFsaXplZCBmb3IgdGhlIEV0aGVyc2NhbiBBUEkuXG4gICAgICovXG4gICAgX2dldFRyYW5zYWN0aW9uUG9zdERhdGEodHJhbnNhY3Rpb24pIHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0ge307XG4gICAgICAgIGZvciAobGV0IGtleSBpbiB0cmFuc2FjdGlvbikge1xuICAgICAgICAgICAgaWYgKHNraXBLZXlzLmluZGV4T2Yoa2V5KSA+PSAwKSB7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAodHJhbnNhY3Rpb25ba2V5XSA9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBsZXQgdmFsdWUgPSB0cmFuc2FjdGlvbltrZXldO1xuICAgICAgICAgICAgaWYgKGtleSA9PT0gXCJ0eXBlXCIgJiYgdmFsdWUgPT09IDApIHtcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChrZXkgPT09IFwiYmxvY2tUYWdcIiAmJiB2YWx1ZSA9PT0gXCJsYXRlc3RcIikge1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gUXVhbnRpdHktdHlwZXMgcmVxdWlyZSBubyBsZWFkaW5nIHplcm8sIHVubGVzcyAwXG4gICAgICAgICAgICBpZiAoeyB0eXBlOiB0cnVlLCBnYXNMaW1pdDogdHJ1ZSwgZ2FzUHJpY2U6IHRydWUsIG1heEZlZVBlckdhczogdHJ1ZSwgbWF4UHJpb3JpdHlGZWVQZXJHYXM6IHRydWUsIG5vbmNlOiB0cnVlLCB2YWx1ZTogdHJ1ZSB9W2tleV0pIHtcbiAgICAgICAgICAgICAgICB2YWx1ZSA9IHRvUXVhbnRpdHkodmFsdWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoa2V5ID09PSBcImFjY2Vzc0xpc3RcIikge1xuICAgICAgICAgICAgICAgIHZhbHVlID0gXCJbXCIgKyBhY2Nlc3NMaXN0aWZ5KHZhbHVlKS5tYXAoKHNldCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gYHthZGRyZXNzOlwiJHtzZXQuYWRkcmVzc31cIixzdG9yYWdlS2V5czpbXCIke3NldC5zdG9yYWdlS2V5cy5qb2luKCdcIixcIicpfVwiXX1gO1xuICAgICAgICAgICAgICAgIH0pLmpvaW4oXCIsXCIpICsgXCJdXCI7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChrZXkgPT09IFwiYmxvYlZlcnNpb25lZEhhc2hlc1wiKSB7XG4gICAgICAgICAgICAgICAgaWYgKHZhbHVlLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgLy8gQFRPRE86IHVwZGF0ZSB0aGlzIG9uY2UgdGhlIEFQSSBzdXBwb3J0cyBibG9ic1xuICAgICAgICAgICAgICAgIGFzc2VydChmYWxzZSwgXCJFdGhlcnNjYW4gQVBJIGRvZXMgbm90IHN1cHBvcnQgYmxvYlZlcnNpb25lZEhhc2hlc1wiLCBcIlVOU1VQUE9SVEVEX09QRVJBVElPTlwiLCB7XG4gICAgICAgICAgICAgICAgICAgIG9wZXJhdGlvbj
26774ogXCJfZ2V0VHJhbnNhY3Rpb25Qb3N0RGF0YVwiLFxuICAgICAgICAgICAgICAgICAgICBpbmZvOiB7IHRyYW5zYWN0aW9uIH1cbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHZhbHVlID0gaGV4bGlmeSh2YWx1ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXN1bHRba2V5XSA9IHZhbHVlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuICAgIC8qKlxuICAgICAqICBUaHJvd3MgdGhlIG5vcm1hbGl6ZWQgRXRoZXJzY2FuIGVycm9yLlxuICAgICAqL1xuICAgIF9jaGVja0Vycm9yKHJlcSwgZXJyb3IsIHRyYW5zYWN0aW9uKSB7XG4gICAgICAgIC8vIFB1bGwgYW55IG1lc3NhZ2Ugb3V0IGlmLCBwb3NzaWJsZVxuICAgICAgICBsZXQgbWVzc2FnZSA9IFwiXCI7XG4gICAgICAgIGlmIChpc0Vycm9yKGVycm9yLCBcIlNFUlZFUl9FUlJPUlwiKSkge1xuICAgICAgICAgICAgLy8gQ2hlY2sgZm9yIGFuIGVycm9yIGVtaXR0ZWQgYnkgYSBwcm94eSBjYWxsXG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIG1lc3NhZ2UgPSBlcnJvci5pbmZvLnJlc3VsdC5lcnJvci5tZXNzYWdlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2F0Y2ggKGUpIHsgfVxuICAgICAgICAgICAgaWYgKCFtZXNzYWdlKSB7XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZSA9IGVycm9yLmluZm8ubWVzc2FnZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY2F0Y2ggKGUpIHsgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChyZXEubWV0aG9kID09PSBcImVzdGltYXRlR2FzXCIpIHtcbiAgICAgICAgICAgIGlmICghbWVzc2FnZS5tYXRjaCgvcmV2ZXJ0L2kpICYmIG1lc3NhZ2UubWF0Y2goL2luc3VmZmljaWVudCBmdW5kcy9pKSkge1xuICAgICAgICAgICAgICAgIGFzc2VydChmYWxzZSwgXCJpbnN1ZmZpY2llbnQgZnVuZHNcIiwgXCJJTlNVRkZJQ0lFTlRfRlVORFNcIiwge1xuICAgICAgICAgICAgICAgICAgICB0cmFuc2FjdGlvbjogcmVxLnRyYW5zYWN0aW9uXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHJlcS5tZXRob2QgPT09IFwiY2FsbFwiIHx8IHJlcS5tZXRob2QgPT09IFwiZXN0aW1hdGVHYXNcIikge1xuICAgICAgICAgICAgaWYgKG1lc3NhZ2UubWF0Y2goL2V4ZWN1dGlvbiByZXZlcnRlZC9pKSkge1xuICAgICAgICAgICAgICAgIGxldCBkYXRhID0gXCJcIjtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICBkYXRhID0gZXJyb3IuaW5mby5yZXN1bHQuZXJyb3IuZGF0YTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY2F0Y2ggKGVycm9yKSB7IH1cbiAgICAgICAgICAgICAgICBjb25zdCBlID0gQWJpQ29kZXIuZ2V0QnVpbHRpbkNhbGxFeGNlcHRpb24ocmVxLm1ldGhvZCwgcmVxLnRyYW5zYWN0aW9uLCBkYXRhKTtcbiAgICAgICAgICAgICAgICBlLmluZm8gPSB7IHJlcXVlc3Q6IHJlcSwgZXJyb3IgfTtcbiAgICAgICAgICAgICAgICB0aHJvdyBlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChtZXNzYWdlKSB7XG4gICAgICAgICAgICBpZiAocmVxLm1ldGhvZCA9PT0gXCJicm9hZGNhc3RUcmFuc2FjdGlvblwiKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgdHJhbnNhY3Rpb24gPSBUcmFuc2FjdGlvbi5mcm9tKHJlcS5zaWduZWRUcmFuc2FjdGlvbik7XG4gICAgICAgICAgICAgICAgaWYgKG1lc3NhZ2UubWF0Y2goL3JlcGxhY2VtZW50L2kpICYmIG1lc3NhZ2UubWF0Y2goL3VuZGVycHJpY2VkL2kpKSB7XG4gICAgICAgICAgICAgICAgICAgIGFzc2VydChmYWxzZSwgXCJyZXBsYWNlbWVudCBmZWUgdG9vIGxvd1wiLCBcIlJFUExBQ0VNRU5UX1VOREVSUFJJQ0VEXCIsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zYWN0aW9uXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAobWVzc2FnZS5tYXRjaCgvaW5zdWZmaWNpZW50IGZ1bmRzLykpIHtcbiAgICAgICAgICAgICAgICAgICAgYXNzZXJ0KGZhbHNlLCBcImluc3VmZmljaWVudCBmdW5kcyBmb3IgaW50cmluc2ljIHRyYW5zYWN0aW9uIGNvc3RcIiwgXCJJTlNVRkZJQ0lFTlRfRlVORFNcIiwge1xuICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNhY3Rpb25cbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChtZXNzYWdlLm1hdGNoKC9zYW1lIGhhc2ggd2FzIGFscmVhZHkgaW1wb3J0ZWR8dHJhbnNhY3Rpb24gbm9uY2UgaXMgdG9vIGxvd3xub25jZSB0b28gbG93LykpIHtcbiAgICAgICAgICAgICAgICAgICAgYXNzZXJ0KGZhbHNlLCBcIm5vbmNlIGhhcyBhbHJlYWR5IGJlZW4gdXNlZFwiLCBcIk5PTkNFX0VYUElSRURcIiwge1xuICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNhY3Rpb25cbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8vIFNvbWV0aGluZyB3ZSBjb3VsZCBub3QgcHJvY2Vzc1xuICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICB9XG4gICAgYXN5bmMgX2RldGVjdE5ldHdvcmsoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLm5ldHdvcms7XG4gICAgfVxuICAgIGFzeW5jIF9wZXJmb3JtKHJlcSkge1xuICAgICAgICBzd2l0Y2ggKHJlcS5tZXRob2QpIHtcbiAgICAgICAgICAgIGNhc2UgXCJjaGFpbklkXCI6XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMubmV0d29yay5jaGFpbklkO1xuICAgICAgICAgICAgY2FzZSBcImdldEJsb2NrTnVtYmVyXCI6XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuZmV0Y2goXCJwcm94eVwiLCB7IGFjdGlvbjogXCJldGhfYmxvY2tOdW1iZXJcIiB9KTtcbiAgICAgICAgICAgIGNhc2UgXCJnZXRHYXNQcmljZVwiOlxuICAgICAgICAgICAgICAgI
26774HJldHVybiB0aGlzLmZldGNoKFwicHJveHlcIiwgeyBhY3Rpb246IFwiZXRoX2dhc1ByaWNlXCIgfSk7XG4gICAgICAgICAgICBjYXNlIFwiZ2V0UHJpb3JpdHlGZWVcIjpcbiAgICAgICAgICAgICAgICAvLyBUaGlzIGlzIHRlbXBvcmFyeSB1bnRpbCBFdGhlcnNjYW4gY29tcGxldGVzIHN1cHBvcnRcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5uZXR3b3JrLm5hbWUgPT09IFwibWFpbm5ldFwiKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBcIjEwMDAwMDAwMDBcIjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSBpZiAodGhpcy5uZXR3b3JrLm5hbWUgPT09IFwib3B0aW1pc21cIikge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gXCIxMDAwMDAwXCI7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJmYWxsYmFjayBvbnRvIHRoZSBBYnN0cmFjdFByb3ZpZGVyIGRlZmF1bHRcIik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgLyogV29ya2luZyB3aXRoIEV0aGVyc2NhbiB0byBnZXQgdGhpcyBhZGRlZDpcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgY29uc3QgdGVzdCA9IGF3YWl0IHRoaXMuZmV0Y2goXCJwcm94eVwiLCB7XG4gICAgICAgICAgICAgICAgICAgIGFjdGlvbjogXCJldGhfbWF4UHJpb3JpdHlGZWVQZXJHYXNcIlxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKHRlc3QpO1xuICAgICAgICAgICAgICAgIHJldHVybiB0ZXN0O1xuICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKFwiREVCVUdcIiwgZSk7XG4gICAgICAgICAgICAgICAgdGhyb3cgZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgICovXG4gICAgICAgICAgICAvKiBUaGlzIG1pZ2h0IGJlIHNhZmU7IGJ1dCBkdWUgdG8gcm91bmRpbmcgbmVpdGhlciBteXNlbGZcbiAgICAgICAgICAgICAgIG9yIEV0aGVyc2NhbiBhcmUgbmVjZXNzYXJpbHkgY29tZm9ydGFibGUgd2l0aCB0aGlzLiA6KVxuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLmZldGNoKFwiZ2FzdHJhY2tlclwiLCB7IGFjdGlvbjogXCJnYXNvcmFjbGVcIiB9KTtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhyZXN1bHQpO1xuICAgICAgICAgICAgICAgIGNvbnN0IGdhc1ByaWNlID0gcGFyc2VVbml0cyhyZXN1bHQuU2FmZUdhc1ByaWNlLCBcImd3ZWlcIik7XG4gICAgICAgICAgICAgICAgY29uc3QgYmFzZUZlZSA9IHBhcnNlVW5pdHMocmVzdWx0LnN1Z2dlc3RCYXNlRmVlLCBcImd3ZWlcIik7XG4gICAgICAgICAgICAgICAgY29uc3QgcHJpb3JpdHlGZWUgPSBnYXNQcmljZSAtIGJhc2VGZWU7XG4gICAgICAgICAgICAgICAgaWYgKHByaW9yaXR5RmVlIDwgMCkgeyB0aHJvdyBuZXcgRXJyb3IoXCJuZWdhdGl2ZSBwcmlvcml0eSBmZWU7IGRlZmVyIHRvIGFic3RyYWN0IHByb3ZpZGVyIGRlZmF1bHRcIik7IH1cbiAgICAgICAgICAgICAgICByZXR1cm4gcHJpb3JpdHlGZWU7XG4gICAgICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKFwiREVCVUdcIiwgZXJyb3IpO1xuICAgICAgICAgICAgICAgIHRocm93IGVycm9yO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgKi9cbiAgICAgICAgICAgIGNhc2UgXCJnZXRCYWxhbmNlXCI6XG4gICAgICAgICAgICAgICAgLy8gUmV0dXJucyBiYXNlLTEwIHJlc3VsdFxuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmZldGNoKFwiYWNjb3VudFwiLCB7XG4gICAgICAgICAgICAgICAgICAgIGFjdGlvbjogXCJiYWxhbmNlXCIsXG4gICAgICAgICAgICAgICAgICAgIGFkZHJlc3M6IHJlcS5hZGRyZXNzLFxuICAgICAgICAgICAgICAgICAgICB0YWc6IHJlcS5ibG9ja1RhZ1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgY2FzZSBcImdldFRyYW5zYWN0aW9uQ291bnRcIjpcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5mZXRjaChcInByb3h5XCIsIHtcbiAgICAgICAgICAgICAgICAgICAgYWN0aW9uOiBcImV0aF9nZXRUcmFuc2FjdGlvbkNvdW50XCIsXG4gICAgICAgICAgICAgICAgICAgIGFkZHJlc3M6IHJlcS5hZGRyZXNzLFxuICAgICAgICAgICAgICAgICAgICB0YWc6IHJlcS5ibG9ja1RhZ1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgY2FzZSBcImdldENvZGVcIjpcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5mZXRjaChcInByb3h5XCIsIHtcbiAgICAgICAgICAgICAgICAgICAgYWN0aW9uOiBcImV0aF9nZXRDb2RlXCIsXG4gICAgICAgICAgICAgICAgICAgIGFkZHJlc3M6IHJlcS5hZGRyZXNzLFxuICAgICAgICAgICAgICAgICAgICB0YWc6IHJlcS5ibG9ja1RhZ1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgY2FzZSBcImdldFN0b3JhZ2VcIjpcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5mZXRjaChcInByb3h5XCIsIHtcbiAgICAgICAgICAgICAgICAgICAgYWN0aW9uOiBcImV0aF9nZXRTdG9yYWdlQXRcIixcbiAgICAgICAgICAgICAgICAgICAgYWRkcmVzczogcmVxLmFkZHJlc3MsXG4gICAgICAgICAgICAgICAgICAgIHBvc2l0aW9uOiByZXEucG9zaXRpb24sXG4gICAgICAgICAgICAgICAgICAgIHRhZzogcmVxLmJsb2NrVGFnXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBjYXNlIFwiYnJvYWRjYXN0VHJhbnNhY3Rpb25cIjpcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5mZXRjaChcInByb3h5XCIsIHtcbiAgICAgICAgICAgICAgICAgICAgYWN0aW9uOiBcImV0aF9zZW5kUmF3VHJhbnNhY3Rpb25cIixcbiAgICAgICAgICAgICAgICAgICAgaGV4OiByZXEuc2lnbmVkVHJhbnNhY3Rpb25cbiAgICAgICAgICAgICAgICB9LCB0cnVlKS5jYXRjaCgoZXJyb3IpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2NoZWNrRXJyb3IocmVxLCBlcnJvciwgcmVxLnNpZ25lZFRyYW5zYWN0aW9uKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGNhc2UgXCJnZXRCbG9ja1wiOlxuICAgICAgICAgICAgICAgIGlmIChcImJsb2NrVGFnXCIgaW4gcmVxKSB7XG4gICAgICAgICAgICAgICAgICAgI
26774HJldHVybiB0aGlzLmZldGNoKFwicHJveHlcIiwge1xuICAgICAgICAgICAgICAgICAgICAgICAgYWN0aW9uOiBcImV0aF9nZXRCbG9ja0J5TnVtYmVyXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICB0YWc6IHJlcS5ibG9ja1RhZyxcbiAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW46IChyZXEuaW5jbHVkZVRyYW5zYWN0aW9ucyA/IFwidHJ1ZVwiIDogXCJmYWxzZVwiKVxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgYXNzZXJ0KGZhbHNlLCBcImdldEJsb2NrIGJ5IGJsb2NrSGFzaCBub3Qgc3VwcG9ydGVkIGJ5IEV0aGVyc2NhblwiLCBcIlVOU1VQUE9SVEVEX09QRVJBVElPTlwiLCB7XG4gICAgICAgICAgICAgICAgICAgIG9wZXJhdGlvbjogXCJnZXRCbG9jayhibG9ja0hhc2gpXCJcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGNhc2UgXCJnZXRUcmFuc2FjdGlvblwiOlxuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmZldGNoKFwicHJveHlcIiwge1xuICAgICAgICAgICAgICAgICAgICBhY3Rpb246IFwiZXRoX2dldFRyYW5zYWN0aW9uQnlIYXNoXCIsXG4gICAgICAgICAgICAgICAgICAgIHR4aGFzaDogcmVxLmhhc2hcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGNhc2UgXCJnZXRUcmFuc2FjdGlvblJlY2VpcHRcIjpcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5mZXRjaChcInByb3h5XCIsIHtcbiAgICAgICAgICAgICAgICAgICAgYWN0aW9uOiBcImV0aF9nZXRUcmFuc2FjdGlvblJlY2VpcHRcIixcbiAgICAgICAgICAgICAgICAgICAgdHhoYXNoOiByZXEuaGFzaFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgY2FzZSBcImNhbGxcIjoge1xuICAgICAgICAgICAgICAgIGlmIChyZXEuYmxvY2tUYWcgIT09IFwibGF0ZXN0XCIpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiRXRoZXJzY2FuUHJvdmlkZXIgZG9lcyBub3Qgc3VwcG9ydCBibG9ja1RhZyBmb3IgY2FsbFwiKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY29uc3QgcG9zdERhdGEgPSB0aGlzLl9nZXRUcmFuc2FjdGlvblBvc3REYXRhKHJlcS50cmFuc2FjdGlvbik7XG4gICAgICAgICAgICAgICAgcG9zdERhdGEubW9kdWxlID0gXCJwcm94eVwiO1xuICAgICAgICAgICAgICAgIHBvc3REYXRhLmFjdGlvbiA9IFwiZXRoX2NhbGxcIjtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5mZXRjaChcInByb3h5XCIsIHBvc3REYXRhLCB0cnVlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl9jaGVja0Vycm9yKHJlcSwgZXJyb3IsIHJlcS50cmFuc2FjdGlvbik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2FzZSBcImVzdGltYXRlR2FzXCI6IHtcbiAgICAgICAgICAgICAgICBjb25zdCBwb3N0RGF0YSA9IHRoaXMuX2dldFRyYW5zYWN0aW9uUG9zdERhdGEocmVxLnRyYW5zYWN0aW9uKTtcbiAgICAgICAgICAgICAgICBwb3N0RGF0YS5tb2R1bGUgPSBcInByb3h5XCI7XG4gICAgICAgICAgICAgICAgcG9zdERhdGEuYWN0aW9uID0gXCJldGhfZXN0aW1hdGVHYXNcIjtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5mZXRjaChcInByb3h5XCIsIHBvc3REYXRhLCB0cnVlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl9jaGVja0Vycm9yKHJlcSwgZXJyb3IsIHJlcS50cmFuc2FjdGlvbik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLypcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgXCJnZXRMb2dzXCI6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBOZWVkcyB0byBjb21wbGFpbiBpZiBtb3JlIHRoYW4gb25lIGFkZHJlc3MgaXMgcGFzc2VkIGluXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYXJnczogUmVjb3JkPHN0cmluZywgYW55PiA9IHsgYWN0aW9uOiBcImdldExvZ3NcIiB9XG4gICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocGFyYW1zLmZpbHRlci5mcm9tQmxvY2spIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJncy5mcm9tQmxvY2sgPSBjaGVja0xvZ1RhZyhwYXJhbXMuZmlsdGVyLmZyb21CbG9jayk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBhcmFtcy5maWx0ZXIudG9CbG9jaykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmdzLnRvQmxvY2sgPSBjaGVja0xvZ1RhZyhwYXJhbXMuZmlsdGVyLnRvQmxvY2spO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwYXJhbXMuZmlsdGVyLmFkZHJlc3MpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJncy5hZGRyZXNzID0gcGFyYW1zLmZpbHRlci5hZGRyZXNzO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEBUT0RPOiBXZSBjYW4gaGFuZGxlIHNsaWdodGx5IG1vcmUgY29tcGxpY2F0ZWQgbG9ncyB1c2luZyB0aGUgbG9ncyBBUElcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocGFyYW1zLmZpbHRlci50b3BpY3MgJiYgcGFyYW1zLmZpbHRlci50b3BpY3MubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocGFyYW1zLmZpbHRlci50b3BpY3MubGVuZ3RoID4gMSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLnRocm93RXJyb3IoXCJ1bnN1cHBvcnRlZCB0b3BpYyBjb3VudFwiLCBMb2dnZXIuRXJyb3JzLlVOU1VQUE9SVEVEX09QRVJBVElPTiwgeyB0b3BpY3M6IHBhcmFtcy5maWx0ZXIudG9waWNzIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwYXJhbXMuZmlsdGVyLnRvcGljcy5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHRvcGlj
26774MCA9IHBhcmFtcy5maWx0ZXIudG9waWNzWzBdO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZih0b3BpYzApICE9PSBcInN0cmluZ1wiIHx8IHRvcGljMC5sZW5ndGggIT09IDY2KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLnRocm93RXJyb3IoXCJ1bnN1cHBvcnRlZCB0b3BpYyBmb3JtYXRcIiwgTG9nZ2VyLkVycm9ycy5VTlNVUFBPUlRFRF9PUEVSQVRJT04sIHsgdG9waWMwOiB0b3BpYzAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmdzLnRvcGljMCA9IHRvcGljMDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxvZ3M6IEFycmF5PGFueT4gPSBhd2FpdCB0aGlzLmZldGNoKFwibG9nc1wiLCBhcmdzKTtcbiAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIENhY2hlIHR4SGFzaCA9PiBibG9ja0hhc2hcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgYmxvY2tzOiB7IFt0YWc6IHN0cmluZ106IHN0cmluZyB9ID0ge307XG4gICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBBZGQgYW55IG1pc3NpbmcgYmxvY2tIYXNoIHRvIHRoZSBsb2dzXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsb2dzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxvZyA9IGxvZ3NbaV07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsb2cuYmxvY2tIYXNoICE9IG51bGwpIHsgY29udGludWU7IH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGJsb2Nrc1tsb2cuYmxvY2tOdW1iZXJdID09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGJsb2NrID0gYXdhaXQgdGhpcy5nZXRCbG9jayhsb2cuYmxvY2tOdW1iZXIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGJsb2NrKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmxvY2tzW2xvZy5ibG9ja051bWJlcl0gPSBibG9jay5oYXNoO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nLmJsb2NrSGFzaCA9IGJsb2Nrc1tsb2cuYmxvY2tOdW1iZXJdO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBsb2dzO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgKi9cbiAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHN1cGVyLl9wZXJmb3JtKHJlcSk7XG4gICAgfVxuICAgIGFzeW5jIGdldE5ldHdvcmsoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLm5ldHdvcms7XG4gICAgfVxuICAgIC8qKlxuICAgICAqICBSZXNvbHZlcyB0byB0aGUgY3VycmVudCBwcmljZSBvZiBldGhlci5cbiAgICAgKlxuICAgICAqICBUaGlzIHJldHVybnMgYGAwYGAgb24gYW55IG5ldHdvcmsgb3RoZXIgdGhhbiBgYG1haW5uZXRgYC5cbiAgICAgKi9cbiAgICBhc3luYyBnZXRFdGhlclByaWNlKCkge1xuICAgICAgICBpZiAodGhpcy5uZXR3b3JrLm5hbWUgIT09IFwibWFpbm5ldFwiKSB7XG4gICAgICAgICAgICByZXR1cm4gMC4wO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBwYXJzZUZsb2F0KChhd2FpdCB0aGlzLmZldGNoKFwic3RhdHNcIiwgeyBhY3Rpb246IFwiZXRocHJpY2VcIiB9KSkuZXRodXNkKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogIFJlc29sdmVzIHRvIGEgW0NvbnRyYWN0XV0gZm9yICUlYWRkcmVzcyUlLCB1c2luZyB0aGVcbiAgICAgKiAgRXRoZXJzY2FuIEFQSSB0byByZXRyZWl2ZSB0aGUgQ29udHJhY3QgQUJJLlxuICAgICAqL1xuICAgIGFzeW5jIGdldENvbnRyYWN0KF9hZGRyZXNzKSB7XG4gICAgICAgIGxldCBhZGRyZXNzID0gdGhpcy5fZ2V0QWRkcmVzcyhfYWRkcmVzcyk7XG4gICAgICAgIGlmIChpc1Byb21pc2UoYWRkcmVzcykpIHtcbiAgICAgICAgICAgIGFkZHJlc3MgPSBhd2FpdCBhZGRyZXNzO1xuICAgICAgICB9XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjb25zdCByZXNwID0gYXdhaXQgdGhpcy5mZXRjaChcImNvbnRyYWN0XCIsIHtcbiAgICAgICAgICAgICAgICBhY3Rpb246IFwiZ2V0YWJpXCIsIGFkZHJlc3NcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgY29uc3QgYWJpID0gSlNPTi5wYXJzZShyZXNwKTtcbiAgICAgICAgICAgIHJldHVybiBuZXcgQ29udHJhY3QoYWRkcmVzcywgYWJpLCB0aGlzKTtcbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgfVxuICAgIGlzQ29tbXVuaXR5UmVzb3VyY2UoKSB7XG4gICAgICAgIHJldHVybiAodGhpcy5hcGlLZXkgPT0gbnVsbCk7XG4gICAgfVxufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9cHJvdmlkZXItZXRoZXJzY2FuLmpzLm1hcCIsImZ1bmN0aW9uIGdldEdsb2JhbCgpIHtcbiAgICBpZiAodHlwZW9mIHNlbGYgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgIHJldHVybiBzZWxmO1xuICAgIH1cbiAgICBpZiAodHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgcmV0dXJuIHdpbmRvdztcbiAgICB9XG4gICAgaWYgKHR5cGVvZiBnbG9iYWwgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgIHJldHVybiBnbG9iYWw7XG4gICAgfVxuICAgIHRocm93IG5ldyBFcnJvcigndW5hYmxlIHRvIGxvY2F0ZSBnbG9iYWwgb2JqZWN0Jyk7XG59XG47XG5jb25zdCBfV2ViU29ja2V0ID0gZ2V0R2xvYmFsKCkuV2ViU29ja2V0O1xuZXhwb3J0IHsgX1dlYlNvY2tldCBhcyBXZWJTb2NrZXQgfTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXdzLWJyb3dzZXIuanMubWFwIiwiLyoqXG4gKiAgR2VuZXJpYyBsb25nLWxpdmVkIHNvY2tldCBwcm92aWRlci5cbiAqXG4gKiAgU3ViLWNsYXNzaW5nIG5vdGVzXG4gKiAgLSBhIHN1Yi1jbGFzcyBNVVNUIGNhbGwgdGhlIGBfc3RhcnQoKWAgbWV0aG9kIG9uY2UgY29ubmVjdGVkXG4gKiAgLSBhIHN1Yi1jbGFzcyBNVVNUIG92ZXJyaWRlIHRoZSBgX3dyaXRlKHN0cmluZylgIG1ldGhvZFxuICogIC0gYSBzdWItY2xhc3MgTVVTVCBjYWxsIGBfcHJvY2Vzc01lc3NhZ2Uoc3RyaW5nKWAgZm9yIGVhY2ggbWVzc2FnZVxuICpcbiAqICBAX3N1YnNlY3Rpb246IGFwaS9wcm92aWRlcnMvYWJzdHJhY3QtcHJvdmlkZXI6U29ja2V0IFByb3ZpZGVycyAgW2Fib3V0LXNvY2tldFByb3ZpZGVyXVxuICovXG5pbXBvcnQgeyBVbm1hbmFnZWRTdWJzY3JpYmVyIH0gZnJvbSBcIi4vYWJzdHJhY3QtcHJvdmlkZXIuanNcIjtcbmltcG9ydCB7
26774IGFzc2VydCwgYXNzZXJ0QXJndW1lbnQsIG1ha2VFcnJvciB9IGZyb20gXCIuLi91dGlscy9pbmRleC5qc1wiO1xuaW1wb3J0IHsgSnNvblJwY0FwaVByb3ZpZGVyIH0gZnJvbSBcIi4vcHJvdmlkZXItanNvbnJwYy5qc1wiO1xuLyoqXG4gKiAgQSAqKlNvY2tldFN1YnNjcmliZXIqKiB1c2VzIGEgc29ja2V0IHRyYW5zcG9ydCB0byBoYW5kbGUgZXZlbnRzIGFuZFxuICogIHNob3VsZCB1c2UgW1tfZW1pdF1dIHRvIG1hbmFnZSB0aGUgZXZlbnRzLlxuICovXG5leHBvcnQgY2xhc3MgU29ja2V0U3Vic2NyaWJlciB7XG4gICAgI3Byb3ZpZGVyO1xuICAgICNmaWx0ZXI7XG4gICAgLyoqXG4gICAgICogIFRoZSBmaWx0ZXIuXG4gICAgICovXG4gICAgZ2V0IGZpbHRlcigpIHsgcmV0dXJuIEpTT04ucGFyc2UodGhpcy4jZmlsdGVyKTsgfVxuICAgICNmaWx0ZXJJZDtcbiAgICAjcGF1c2VkO1xuICAgICNlbWl0UHJvbWlzZTtcbiAgICAvKipcbiAgICAgKiAgQ3JlYXRlcyBhIG5ldyAqKlNvY2tldFN1YnNjcmliZXIqKiBhdHRhY2hlZCB0byAlJXByb3ZpZGVyJSUgbGlzdGVuaW5nXG4gICAgICogIHRvICUlZmlsdGVyJSUuXG4gICAgICovXG4gICAgY29uc3RydWN0b3IocHJvdmlkZXIsIGZpbHRlcikge1xuICAgICAgICB0aGlzLiNwcm92aWRlciA9IHByb3ZpZGVyO1xuICAgICAgICB0aGlzLiNmaWx0ZXIgPSBKU09OLnN0cmluZ2lmeShmaWx0ZXIpO1xuICAgICAgICB0aGlzLiNmaWx0ZXJJZCA9IG51bGw7XG4gICAgICAgIHRoaXMuI3BhdXNlZCA9IG51bGw7XG4gICAgICAgIHRoaXMuI2VtaXRQcm9taXNlID0gbnVsbDtcbiAgICB9XG4gICAgc3RhcnQoKSB7XG4gICAgICAgIHRoaXMuI2ZpbHRlcklkID0gdGhpcy4jcHJvdmlkZXIuc2VuZChcImV0aF9zdWJzY3JpYmVcIiwgdGhpcy5maWx0ZXIpLnRoZW4oKGZpbHRlcklkKSA9PiB7XG4gICAgICAgICAgICA7XG4gICAgICAgICAgICB0aGlzLiNwcm92aWRlci5fcmVnaXN0ZXIoZmlsdGVySWQsIHRoaXMpO1xuICAgICAgICAgICAgcmV0dXJuIGZpbHRlcklkO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgc3RvcCgpIHtcbiAgICAgICAgKHRoaXMuI2ZpbHRlcklkKS50aGVuKChmaWx0ZXJJZCkgPT4ge1xuICAgICAgICAgICAgaWYgKHRoaXMuI3Byb3ZpZGVyLmRlc3Ryb3llZCkge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuI3Byb3ZpZGVyLnNlbmQoXCJldGhfdW5zdWJzY3JpYmVcIiwgW2ZpbHRlcklkXSk7XG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLiNmaWx0ZXJJZCA9IG51bGw7XG4gICAgfVxuICAgIC8vIEBUT0RPOiBwYXVzZSBzaG91bGQgdHJhcCB0aGUgY3VycmVudCBibG9ja051bWJlciwgdW5zdWIsIGFuZCBvbiByZXN1bWUgdXNlIGdldExvZ3NcbiAgICAvLyAgICAgICAgYW5kIHJlc3VtZVxuICAgIHBhdXNlKGRyb3BXaGlsZVBhdXNlZCkge1xuICAgICAgICBhc3NlcnQoZHJvcFdoaWxlUGF1c2VkLCBcInByZXNlcnZlIGxvZ3Mgd2hpbGUgcGF1c2VkIG5vdCBzdXBwb3J0ZWQgYnkgU29ja2V0U3Vic2NyaWJlciB5ZXRcIiwgXCJVTlNVUFBPUlRFRF9PUEVSQVRJT05cIiwgeyBvcGVyYXRpb246IFwicGF1c2UoZmFsc2UpXCIgfSk7XG4gICAgICAgIHRoaXMuI3BhdXNlZCA9ICEhZHJvcFdoaWxlUGF1c2VkO1xuICAgIH1cbiAgICByZXN1bWUoKSB7XG4gICAgICAgIHRoaXMuI3BhdXNlZCA9IG51bGw7XG4gICAgfVxuICAgIC8qKlxuICAgICAqICBAX2lnbm9yZTpcbiAgICAgKi9cbiAgICBfaGFuZGxlTWVzc2FnZShtZXNzYWdlKSB7XG4gICAgICAgIGlmICh0aGlzLiNmaWx0ZXJJZCA9PSBudWxsKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuI3BhdXNlZCA9PT0gbnVsbCkge1xuICAgICAgICAgICAgbGV0IGVtaXRQcm9taXNlID0gdGhpcy4jZW1pdFByb21pc2U7XG4gICAgICAgICAgICBpZiAoZW1pdFByb21pc2UgPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIGVtaXRQcm9taXNlID0gdGhpcy5fZW1pdCh0aGlzLiNwcm92aWRlciwgbWVzc2FnZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBlbWl0UHJvbWlzZSA9IGVtaXRQcm9taXNlLnRoZW4oYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLl9lbWl0KHRoaXMuI3Byb3ZpZGVyLCBtZXNzYWdlKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuI2VtaXRQcm9taXNlID0gZW1pdFByb21pc2UudGhlbigoKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuI2VtaXRQcm9taXNlID09PSBlbWl0UHJvbWlzZSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLiNlbWl0UHJvbWlzZSA9IG51bGw7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogIFN1Yi1jbGFzc2VzICoqbXVzdCoqIG92ZXJyaWRlIHRoaXMgdG8gZW1pdCB0aGUgZXZlbnRzIG9uIHRoZVxuICAgICAqICBwcm92aWRlci5cbiAgICAgKi9cbiAgICBhc3luYyBfZW1pdChwcm92aWRlciwgbWVzc2FnZSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJzdWItY2xhc3NlcyBtdXN0IGltcGxlbWVudGUgdGhpczsgX2VtaXRcIik7XG4gICAgfVxufVxuLyoqXG4gKiAgQSAqKlNvY2tldEJsb2NrU3Vic2NyaWJlcioqIGxpc3RlbnMgZm9yIGBgbmV3SGVhZHNgYCBldmVudHMgYW5kIGVtaXRzXG4gKiAgYGBcImJsb2NrXCJgYCBldmVudHMuXG4gKi9cbmV4cG9ydCBjbGFzcyBTb2NrZXRCbG9ja1N1YnNjcmliZXIgZXh0ZW5kcyBTb2NrZXRTdWJzY3JpYmVyIHtcbiAgICAvKipcbiAgICAgKiAgQF9pZ25vcmU6XG4gICAgICovXG4gICAgY29uc3RydWN0b3IocHJvdmlkZXIpIHtcbiAgICAgICAgc3VwZXIocHJvdmlkZXIsIFtcIm5ld0hlYWRzXCJdKTtcbiAgICB9XG4gICAgYXN5bmMgX2VtaXQocHJvdmlkZXIsIG1lc3NhZ2UpIHtcbiAgICAgICAgcHJvdmlkZXIuZW1pdChcImJsb2NrXCIsIHBhcnNlSW50KG1lc3NhZ2UubnVtYmVyKSk7XG4gICAgfVxufVxuLyoqXG4gKiAgQSAqKlNvY2tldFBlbmRpbmdTdWJzY3JpYmVyKiogbGlzdGVucyBmb3IgcGVuZGluZyB0cmFuc2FjaXRvbnMgYW5kIGVtaXRzXG4gKiAgYGBcInBlbmRpbmdcImBgIGV2ZW50cy5cbiAqL1xuZXhwb3J0IGNsYXNzIFNvY2tldFBlbmRpbmdTdWJzY3JpYmVyIGV4dGVuZHMgU29ja2V0U3Vic2NyaWJlciB7XG4gICAgLyoqXG4gICAgICogIEBfaWdub3JlOlxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yKHByb3ZpZGVyKSB7XG4gICAgICAgI
26774HN1cGVyKHByb3ZpZGVyLCBbXCJuZXdQZW5kaW5nVHJhbnNhY3Rpb25zXCJdKTtcbiAgICB9XG4gICAgYXN5bmMgX2VtaXQocHJvdmlkZXIsIG1lc3NhZ2UpIHtcbiAgICAgICAgcHJvdmlkZXIuZW1pdChcInBlbmRpbmdcIiwgbWVzc2FnZSk7XG4gICAgfVxufVxuLyoqXG4gKiAgQSAqKlNvY2tldEV2ZW50U3Vic2NyaWJlcioqIGxpc3RlbnMgZm9yIGV2ZW50IGxvZ3MuXG4gKi9cbmV4cG9ydCBjbGFzcyBTb2NrZXRFdmVudFN1YnNjcmliZXIgZXh0ZW5kcyBTb2NrZXRTdWJzY3JpYmVyIHtcbiAgICAjbG9nRmlsdGVyO1xuICAgIC8qKlxuICAgICAqICBUaGUgZmlsdGVyLlxuICAgICAqL1xuICAgIGdldCBsb2dGaWx0ZXIoKSB7IHJldHVybiBKU09OLnBhcnNlKHRoaXMuI2xvZ0ZpbHRlcik7IH1cbiAgICAvKipcbiAgICAgKiAgQF9pZ25vcmU6XG4gICAgICovXG4gICAgY29uc3RydWN0b3IocHJvdmlkZXIsIGZpbHRlcikge1xuICAgICAgICBzdXBlcihwcm92aWRlciwgW1wibG9nc1wiLCBmaWx0ZXJdKTtcbiAgICAgICAgdGhpcy4jbG9nRmlsdGVyID0gSlNPTi5zdHJpbmdpZnkoZmlsdGVyKTtcbiAgICB9XG4gICAgYXN5bmMgX2VtaXQocHJvdmlkZXIsIG1lc3NhZ2UpIHtcbiAgICAgICAgcHJvdmlkZXIuZW1pdCh0aGlzLmxvZ0ZpbHRlciwgcHJvdmlkZXIuX3dyYXBMb2cobWVzc2FnZSwgcHJvdmlkZXIuX25ldHdvcmspKTtcbiAgICB9XG59XG4vKipcbiAqICBBICoqU29ja2V0UHJvdmlkZXIqKiBpcyBiYWNrZWQgYnkgYSBsb25nLWxpdmVkIGNvbm5lY3Rpb24gb3ZlciBhXG4gKiAgc29ja2V0LCB3aGljaCBjYW4gc3Vic2NyaWJlIGFuZCByZWNlaXZlIHJlYWwtdGltZSBtZXNzYWdlcyBvdmVyXG4gKiAgaXRzIGNvbW11bmljYXRpb24gY2hhbm5lbC5cbiAqL1xuZXhwb3J0IGNsYXNzIFNvY2tldFByb3ZpZGVyIGV4dGVuZHMgSnNvblJwY0FwaVByb3ZpZGVyIHtcbiAgICAjY2FsbGJhY2tzO1xuICAgIC8vIE1hcHMgZWFjaCBmaWx0ZXJJZCB0byBpdHMgc3Vic2NyaWJlclxuICAgICNzdWJzO1xuICAgIC8vIElmIGFueSBldmVudHMgY29tZSBpbiBiZWZvcmUgYSBzdWJzY3JpYmVyIGhhcyBmaW5pc2hlZFxuICAgIC8vIHJlZ2lzdGVyaW5nLCBxdWV1ZSB0aGVtXG4gICAgI3BlbmRpbmc7XG4gICAgLyoqXG4gICAgICogIENyZWF0ZXMgYSBuZXcgKipTb2NrZXRQcm92aWRlcioqIGNvbm5lY3RlZCB0byAlJW5ldHdvcmslJS5cbiAgICAgKlxuICAgICAqICBJZiB1bnNwZWNpZmllZCwgdGhlIG5ldHdvcmsgd2lsbCBiZSBkaXNjb3ZlcmVkLlxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yKG5ldHdvcmssIF9vcHRpb25zKSB7XG4gICAgICAgIC8vIENvcHkgdGhlIG9wdGlvbnNcbiAgICAgICAgY29uc3Qgb3B0aW9ucyA9IE9iamVjdC5hc3NpZ24oe30sIChfb3B0aW9ucyAhPSBudWxsKSA/IF9vcHRpb25zIDoge30pO1xuICAgICAgICAvLyBTdXBwb3J0IGZvciBiYXRjaGVzIGlzIGdlbmVyYWxseSBub3Qgc3VwcG9ydGVkIGZvclxuICAgICAgICAvLyBjb25uZWN0aW9uLWJhc2UgcHJvdmlkZXJzOyBpZiB0aGlzIGNoYW5nZXMgaW4gdGhlIGZ1dHVyZVxuICAgICAgICAvLyB0aGUgX3NlbmQgc2hvdWxkIGJlIHVwZGF0ZWQgdG8gcmVmbGVjdCB0aGlzXG4gICAgICAgIGFzc2VydEFyZ3VtZW50KG9wdGlvbnMuYmF0Y2hNYXhDb3VudCA9PSBudWxsIHx8IG9wdGlvbnMuYmF0Y2hNYXhDb3VudCA9PT0gMSwgXCJzb2NrZXRzLWJhc2VkIHByb3ZpZGVycyBkbyBub3Qgc3VwcG9ydCBiYXRjaGVzXCIsIFwib3B0aW9ucy5iYXRjaE1heENvdW50XCIsIF9vcHRpb25zKTtcbiAgICAgICAgb3B0aW9ucy5iYXRjaE1heENvdW50ID0gMTtcbiAgICAgICAgLy8gU29ja2V0LWJhc2VkIFByb3ZpZGVycyAoZ2VuZXJhbGx5KSBjYW5ub3QgY2hhbmdlIHRoZWlyIG5ldHdvcmssXG4gICAgICAgIC8vIHNpbmNlIHRoZXkgaGF2ZSBhIGxvbmctbGl2ZWQgY29ubmVjdGlvbjsgYnV0IGxldCBwZW9wbGUgb3ZlcnJpZGVcbiAgICAgICAgLy8gdGhpcyBpZiB0aGV5IGhhdmUganVzdCBjYXVzZS5cbiAgICAgICAgaWYgKG9wdGlvbnMuc3RhdGljTmV0d29yayA9PSBudWxsKSB7XG4gICAgICAgICAgICBvcHRpb25zLnN0YXRpY05ldHdvcmsgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIHN1cGVyKG5ldHdvcmssIG9wdGlvbnMpO1xuICAgICAgICB0aGlzLiNjYWxsYmFja3MgPSBuZXcgTWFwKCk7XG4gICAgICAgIHRoaXMuI3N1YnMgPSBuZXcgTWFwKCk7XG4gICAgICAgIHRoaXMuI3BlbmRpbmcgPSBuZXcgTWFwKCk7XG4gICAgfVxuICAgIC8vIFRoaXMgdmFsdWUgaXMgb25seSB2YWxpZCBhZnRlciBfc3RhcnQgaGFzIGJlZW4gY2FsbGVkXG4gICAgLypcbiAgICBnZXQgX25ldHdvcmsoKTogTmV0d29yayB7XG4gICAgICAgIGlmICh0aGlzLiNuZXR3b3JrID09IG51bGwpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcInRoaXMgc2hvdWxkbid0IGhhcHBlblwiKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy4jbmV0d29yay5jbG9uZSgpO1xuICAgIH1cbiAgICAqL1xuICAgIF9nZXRTdWJzY3JpYmVyKHN1Yikge1xuICAgICAgICBzd2l0Y2ggKHN1Yi50eXBlKSB7XG4gICAgICAgICAgICBjYXNlIFwiY2xvc2VcIjpcbiAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFVubWFuYWdlZFN1YnNjcmliZXIoXCJjbG9zZVwiKTtcbiAgICAgICAgICAgIGNhc2UgXCJibG9ja1wiOlxuICAgICAgICAgICAgICAgIHJldHVybiBuZXcgU29ja2V0QmxvY2tTdWJzY3JpYmVyKHRoaXMpO1xuICAgICAgICAgICAgY2FzZSBcInBlbmRpbmdcIjpcbiAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFNvY2tldFBlbmRpbmdTdWJzY3JpYmVyKHRoaXMpO1xuICAgICAgICAgICAgY2FzZSBcImV2ZW50XCI6XG4gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBTb2NrZXRFdmVudFN1YnNjcmliZXIodGhpcywgc3ViLmZpbHRlcik7XG4gICAgICAgICAgICBjYXNlIFwib3JwaGFuXCI6XG4gICAgICAgICAgICAgICAgLy8gSGFuZGxlZCBhdXRvLW1hdGljYWxseSB3aXRoaW4gQWJzdHJhY3RQcm92aWRlclxuICAgICAgICAgICAgICAgIC8vIHdoZW4gdGhlIGxvZy5yZW1vdmVkID0gdHJ1ZVxuICAgICAgICAgICAgICAgIGlmIChzdWIuZmlsdGVyLm9ycGhhbiA9PT0gXCJkcm9wLWxvZ1wiKSB7XG4gICAgICAgICAgICAgICAgICAgI
26774HJldHVybiBuZXcgVW5tYW5hZ2VkU3Vic2NyaWJlcihcImRyb3AtbG9nXCIpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gc3VwZXIuX2dldFN1YnNjcmliZXIoc3ViKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogIFJlZ2lzdGVyIGEgbmV3IHN1YnNjcmliZXIuIFRoaXMgaXMgdXNlZCBpbnRlcm5hbGxlZCBieSBTdWJzY3JpYmVyc1xuICAgICAqICBhbmQgZ2VuZXJhbGx5IGlzIHVuZWNlc3NhcnkgdW5sZXNzIGV4dGVuZGluZyBjYXBhYmlsaXRpZXMuXG4gICAgICovXG4gICAgX3JlZ2lzdGVyKGZpbHRlcklkLCBzdWJzY3JpYmVyKSB7XG4gICAgICAgIHRoaXMuI3N1YnMuc2V0KGZpbHRlcklkLCBzdWJzY3JpYmVyKTtcbiAgICAgICAgY29uc3QgcGVuZGluZyA9IHRoaXMuI3BlbmRpbmcuZ2V0KGZpbHRlcklkKTtcbiAgICAgICAgaWYgKHBlbmRpbmcpIHtcbiAgICAgICAgICAgIGZvciAoY29uc3QgbWVzc2FnZSBvZiBwZW5kaW5nKSB7XG4gICAgICAgICAgICAgICAgc3Vic2NyaWJlci5faGFuZGxlTWVzc2FnZShtZXNzYWdlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuI3BlbmRpbmcuZGVsZXRlKGZpbHRlcklkKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBhc3luYyBfc2VuZChwYXlsb2FkKSB7XG4gICAgICAgIC8vIFdlYlNvY2tldCBwcm92aWRlciBkb2Vzbid0IGFjY2VwdCBiYXRjaGVzXG4gICAgICAgIGFzc2VydEFyZ3VtZW50KCFBcnJheS5pc0FycmF5KHBheWxvYWQpLCBcIldlYlNvY2tldCBkb2VzIG5vdCBzdXBwb3J0IGJhdGNoIHNlbmRcIiwgXCJwYXlsb2FkXCIsIHBheWxvYWQpO1xuICAgICAgICAvLyBAVE9ETzogc3RyaW5naWZ5IHBheWxvYWRzIGhlcmUgYW5kIHN0b3JlIHRvIHByZXZlbnQgbXV0YXRpb25zXG4gICAgICAgIC8vIFByZXBhcmUgYSBwcm9taXNlIHRvIHJlc3BvbmQgdG9cbiAgICAgICAgY29uc3QgcHJvbWlzZSA9IG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgICAgIHRoaXMuI2NhbGxiYWNrcy5zZXQocGF5bG9hZC5pZCwgeyBwYXlsb2FkLCByZXNvbHZlLCByZWplY3QgfSk7XG4gICAgICAgIH0pO1xuICAgICAgICAvLyBXYWl0IHVudGlsIHRoZSBzb2NrZXQgaXMgY29ubmVjdGVkIGJlZm9yZSB3cml0aW5nIHRvIGl0XG4gICAgICAgIGF3YWl0IHRoaXMuX3dhaXRVbnRpbFJlYWR5KCk7XG4gICAgICAgIC8vIFdyaXRlIHRoZSByZXF1ZXN0IHRvIHRoZSBzb2NrZXRcbiAgICAgICAgYXdhaXQgdGhpcy5fd3JpdGUoSlNPTi5zdHJpbmdpZnkocGF5bG9hZCkpO1xuICAgICAgICByZXR1cm4gW2F3YWl0IHByb21pc2VdO1xuICAgIH1cbiAgICAvLyBTdWItY2xhc3NlcyBtdXN0IGNhbGwgdGhpcyBvbmNlIHRoZXkgYXJlIGNvbm5lY3RlZFxuICAgIC8qXG4gICAgYXN5bmMgX3N0YXJ0KCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBpZiAodGhpcy4jcmVhZHkpIHsgcmV0dXJuOyB9XG5cbiAgICAgICAgZm9yIChjb25zdCB7IHBheWxvYWQgfSBvZiB0aGlzLiNjYWxsYmFja3MudmFsdWVzKCkpIHtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuX3dyaXRlKEpTT04uc3RyaW5naWZ5KHBheWxvYWQpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuI3JlYWR5ID0gKGFzeW5jIGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgYXdhaXQgc3VwZXIuX3N0YXJ0KCk7XG4gICAgICAgIH0pKCk7XG4gICAgfVxuICAgICovXG4gICAgLyoqXG4gICAgICogIFN1Yi1jbGFzc2VzICoqbXVzdCoqIGNhbGwgdGhpcyB3aXRoIG1lc3NhZ2VzIHJlY2VpdmVkIG92ZXIgdGhlaXJcbiAgICAgKiAgdHJhbnNwb3J0IHRvIGJlIHByb2Nlc3NlZCBhbmQgZGlzcGF0Y2hlZC5cbiAgICAgKi9cbiAgICBhc3luYyBfcHJvY2Vzc01lc3NhZ2UobWVzc2FnZSkge1xuICAgICAgICBjb25zdCByZXN1bHQgPSAoSlNPTi5wYXJzZShtZXNzYWdlKSk7XG4gICAgICAgIGlmIChyZXN1bHQgJiYgdHlwZW9mIChyZXN1bHQpID09PSBcIm9iamVjdFwiICYmIFwiaWRcIiBpbiByZXN1bHQpIHtcbiAgICAgICAgICAgIGNvbnN0IGNhbGxiYWNrID0gdGhpcy4jY2FsbGJhY2tzLmdldChyZXN1bHQuaWQpO1xuICAgICAgICAgICAgaWYgKGNhbGxiYWNrID09IG51bGwpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmVtaXQoXCJlcnJvclwiLCBtYWtlRXJyb3IoXCJyZWNlaXZlZCByZXN1bHQgZm9yIHVua25vd24gaWRcIiwgXCJVTktOT1dOX0VSUk9SXCIsIHtcbiAgICAgICAgICAgICAgICAgICAgcmVhc29uQ29kZTogXCJVTktOT1dOX0lEXCIsXG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdFxuICAgICAgICAgICAgICAgIH0pKTtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLiNjYWxsYmFja3MuZGVsZXRlKHJlc3VsdC5pZCk7XG4gICAgICAgICAgICBjYWxsYmFjay5yZXNvbHZlKHJlc3VsdCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAocmVzdWx0ICYmIHJlc3VsdC5tZXRob2QgPT09IFwiZXRoX3N1YnNjcmlwdGlvblwiKSB7XG4gICAgICAgICAgICBjb25zdCBmaWx0ZXJJZCA9IHJlc3VsdC5wYXJhbXMuc3Vic2NyaXB0aW9uO1xuICAgICAgICAgICAgY29uc3Qgc3Vic2NyaWJlciA9IHRoaXMuI3N1YnMuZ2V0KGZpbHRlcklkKTtcbiAgICAgICAgICAgIGlmIChzdWJzY3JpYmVyKSB7XG4gICAgICAgICAgICAgICAgc3Vic2NyaWJlci5faGFuZGxlTWVzc2FnZShyZXN1bHQucGFyYW1zLnJlc3VsdCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBsZXQgcGVuZGluZyA9IHRoaXMuI3BlbmRpbmcuZ2V0KGZpbHRlcklkKTtcbiAgICAgICAgICAgICAgICBpZiAocGVuZGluZyA9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgIHBlbmRpbmcgPSBbXTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy4jcGVuZGluZy5zZXQoZmlsdGVySWQsIHBlbmRpbmcpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBwZW5kaW5nLnB1c2gocmVzdWx0LnBhcmFtcy5yZXN1bHQpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5lbWl0KFwiZXJyb3JcIiwgbWFrZUVycm9yKFwicmVjZWl2ZWQgdW5leHBlY3RlZCBtZXNzYWdlXCIsIFwiVU5LTk9XTl9FUlJPUlwiLCB7XG4gICAgICAgICAgICAgICAgcmVhc29uQ29kZTogXCJVTkVYUEVDVEVEX01FU1NBR0VcIixcbiAgICAgICAgICAgICAgICByZXN1bHRcbiAgICAgICAgICAgI
26774H0pKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiAgU3ViLWNsYXNzZXMgKiptdXN0Kiogb3ZlcnJpZGUgdGhpcyB0byBzZW5kICUlbWVzc2FnZSUlIG92ZXIgdGhlaXJcbiAgICAgKiAgdHJhbnNwb3J0LlxuICAgICAqL1xuICAgIGFzeW5jIF93cml0ZShtZXNzYWdlKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcInN1Yi1jbGFzc2VzIG11c3Qgb3ZlcnJpZGUgdGhpc1wiKTtcbiAgICB9XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1wcm92aWRlci1zb2NrZXQuanMubWFwIiwiaW1wb3J0IHsgV2ViU29ja2V0IGFzIF9XZWJTb2NrZXQgfSBmcm9tIFwiLi93cy5qc1wiOyAvKi1icm93c2VyKi9cbmltcG9ydCB7IFNvY2tldFByb3ZpZGVyIH0gZnJvbSBcIi4vcHJvdmlkZXItc29ja2V0LmpzXCI7XG4vKipcbiAqICBBIEpTT04tUlBDIHByb3ZpZGVyIHdoaWNoIGlzIGJhY2tlZCBieSBhIFdlYlNvY2tldC5cbiAqXG4gKiAgV2ViU29ja2V0cyBhcmUgb2Z0ZW4gcHJlZmVycmVkIGJlY2F1c2UgdGhleSByZXRhaW4gYSBsaXZlIGNvbm5lY3Rpb25cbiAqICB0byBhIHNlcnZlciwgd2hpY2ggcGVybWl0cyBtb3JlIGluc3RhbnQgYWNjZXNzIHRvIGV2ZW50cy5cbiAqXG4gKiAgSG93ZXZlciwgdGhpcyBpbmN1cnMgaGlnaGVyIHNlcnZlciBpbmZyYXN0dXJ0dXJlIGNvc3RzLCBzbyBhZGRpdGlvbmFsXG4gKiAgcmVzb3VyY2VzIG1heSBiZSByZXF1aXJlZCB0byBob3N0IHlvdXIgb3duIFdlYlNvY2tldCBub2RlcyBhbmQgbWFueVxuICogIHRoaXJkLXBhcnR5IHNlcnZpY2VzIGNoYXJnZSBhZGRpdGlvbmFsIGZlZXMgZm9yIFdlYlNvY2tldCBlbmRwb2ludHMuXG4gKi9cbmV4cG9ydCBjbGFzcyBXZWJTb2NrZXRQcm92aWRlciBleHRlbmRzIFNvY2tldFByb3ZpZGVyIHtcbiAgICAjY29ubmVjdDtcbiAgICAjd2Vic29ja2V0O1xuICAgIGdldCB3ZWJzb2NrZXQoKSB7XG4gICAgICAgIGlmICh0aGlzLiN3ZWJzb2NrZXQgPT0gbnVsbCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwid2Vic29ja2V0IGNsb3NlZFwiKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy4jd2Vic29ja2V0O1xuICAgIH1cbiAgICBjb25zdHJ1Y3Rvcih1cmwsIG5ldHdvcmssIG9wdGlvbnMpIHtcbiAgICAgICAgc3VwZXIobmV0d29yaywgb3B0aW9ucyk7XG4gICAgICAgIGlmICh0eXBlb2YgKHVybCkgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgICAgIHRoaXMuI2Nvbm5lY3QgPSAoKSA9PiB7IHJldHVybiBuZXcgX1dlYlNvY2tldCh1cmwpOyB9O1xuICAgICAgICAgICAgdGhpcy4jd2Vic29ja2V0ID0gdGhpcy4jY29ubmVjdCgpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHR5cGVvZiAodXJsKSA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgICAgICB0aGlzLiNjb25uZWN0ID0gdXJsO1xuICAgICAgICAgICAgdGhpcy4jd2Vic29ja2V0ID0gdXJsKCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0aGlzLiNjb25uZWN0ID0gbnVsbDtcbiAgICAgICAgICAgIHRoaXMuI3dlYnNvY2tldCA9IHVybDtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLndlYnNvY2tldC5vbm9wZW4gPSBhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuX3N0YXJ0KCk7XG4gICAgICAgICAgICAgICAgdGhpcy5yZXN1bWUoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKFwiZmFpbGVkIHRvIHN0YXJ0IFdlYnNvY2tldFByb3ZpZGVyXCIsIGVycm9yKTtcbiAgICAgICAgICAgICAgICAvLyBAVE9ETzogbm93IHdoYXQ/IEF0dGVtcHQgcmVjb25uZWN0P1xuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgICB0aGlzLndlYnNvY2tldC5vbm1lc3NhZ2UgPSAobWVzc2FnZSkgPT4ge1xuICAgICAgICAgICAgdGhpcy5fcHJvY2Vzc01lc3NhZ2UobWVzc2FnZS5kYXRhKTtcbiAgICAgICAgfTtcbiAgICAgICAgLypcbiAgICAgICAgICAgICAgICB0aGlzLndlYnNvY2tldC5vbmNsb3NlID0gKGV2ZW50KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIC8vIEBUT0RPOiBXaGF0IGV2ZW50LmNvZGUgc2hvdWxkIHdlIHJlY29ubmVjdCBvbj9cbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVjb25uZWN0ID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgIGlmIChyZWNvbm5lY3QpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucGF1c2UodHJ1ZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy4jY29ubmVjdCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuI3dlYnNvY2tldCA9IHRoaXMuI2Nvbm5lY3QoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLiN3ZWJzb2NrZXQub25vcGVuID0gLi4uXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQFRPRE86IHRoaXMgcmVxdWlyZXMgdGhlIHN1cGVyIGNsYXNzIHRvIHJlYnJvYWRjYXN0OyBtb3ZlIGl0IHRoZXJlXG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9yZWNvbm5lY3QoKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICovXG4gICAgfVxuICAgIGFzeW5jIF93cml0ZShtZXNzYWdlKSB7XG4gICAgICAgIHRoaXMud2Vic29ja2V0LnNlbmQobWVzc2FnZSk7XG4gICAgfVxuICAgIGFzeW5jIGRlc3Ryb3koKSB7XG4gICAgICAgIGlmICh0aGlzLiN3ZWJzb2NrZXQgIT0gbnVsbCkge1xuICAgICAgICAgICAgdGhpcy4jd2Vic29ja2V0LmNsb3NlKCk7XG4gICAgICAgICAgICB0aGlzLiN3ZWJzb2NrZXQgPSBudWxsO1xuICAgICAgICB9XG4gICAgICAgIHN1cGVyLmRlc3Ryb3koKTtcbiAgICB9XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1wcm92aWRlci13ZWJzb2NrZXQuanMubWFwIiwiLyoqXG4gKiAgW1tsaW5rLWluZnVyYV1dIHByb3ZpZGVzIGEgdGhpcmQtcGFydHkgc2VydmljZSBmb3IgY29ubmVjdGluZyB0b1xuICogIHZhcmlvdXMgYmxvY2tjaGFpbnMgb3ZlciBKU09OLVJQQy5cbiAqXG4gKiAgKipTdXBwb3J0ZWQgTmV0d29ya3MqKlxuICpcbiAqICAtIEV0aGVyZXVtIE1haW5uZXQgKGBgbWFpbm5ldGBgKVxuICogIC0gR29lcmxpIFRlc3RuZXQgKGBgZ29lcmxpYGApXG4gKiAgLSBTZXBvbGlhIFRlc3RuZXQgKGBgc2Vwb2xpYWBgKVxuICogIC0gQXJiaXRydW0gKGBgYXJiaXRydW1gYClcbiAqICAtIEFyYml0cnVtIEdvZXJsaSBUZXN0bmV0IChgYGFyYml0cnVtLWdvZXJsaWBgKVxuICogIC0gQXJiaXRydW0gU2Vwb2xpYSBUZXN0bmV0IChgYGFyYml0cnVtLXNlcG9saWFgYClcbiAqICAtIEJhc2UgKGBgYmFzZWBgKVxuICogIC0gQmFzZSBHb2VybGlhIFRlc3RuZXQgKGBgYmFzZS1nb2VybGlgYClcbiAqICAtIEJhc2UgU2Vwb2xpYSBUZXN0bmV0IChgYGJhc2Utc2Vwb2xpYWBgKVxuICogIC0gQk5CIFNtYXJ0IENoYWluIE1haW5uZXQgKGBgYm5iYGApXG4gKiAgLSBCTkIgU21hcnQgQ2hhaW4gVGVzdG5ldCAoYGBibmJ0YGApXG4gKiAgLSBMaW5lYSAoYGBsaW5lYWBgKVxuICogIC0gTGluZWEgR29lcmxpIFRlc3RuZXQgKGBgbGluZWEtZ29lcmxpYGApXG4gKiAgLSBMaW5lYSBTZXBvbGlhIFRlc3RuZXQgKGBgbGluZWEtc2Vwb2xpYWBgKVxuICogIC0gT3B0aW1pc20gKGBgb3B0aW1pc21gYClcbiAqICAtIE9wdGltaXNtIEdvZXJsaSBUZXN0bmV0IChgYG9wdGltaXNtLWdvZXJsaWBgKVxuICogIC0gT3B0aW1pc20gU2Vwb2xpYSBUZXN0bmV0IChgYG9wdGltaXNtLXNlcG9saWFgYClcbiAqICAtIFBvbHlnb24gKGBgbWF0aWNgYClcbiAqICAtIFBvbHlnb24gQW1veSBUZXN0bmV0IChgYG1hdGljLWFtb3lgYClcbiAqICAtIFBvbHlnb24gTXVtYmFpIFRlc3RuZXQgKGBgbWF0aWMtbXVtYmFpYGApXG4gKlxuICogIEBfc3Vic2VjdGlvbj
26774ogYXBpL3Byb3ZpZGVycy90aGlyZHBhcnR5OklORlVSQSAgW3Byb3ZpZGVycy1pbmZ1cmFdXG4gKi9cbmltcG9ydCB7IGRlZmluZVByb3BlcnRpZXMsIEZldGNoUmVxdWVzdCwgYXNzZXJ0LCBhc3NlcnRBcmd1bWVudCB9IGZyb20gXCIuLi91dGlscy9pbmRleC5qc1wiO1xuaW1wb3J0IHsgc2hvd1Rocm90dGxlTWVzc2FnZSB9IGZyb20gXCIuL2NvbW11bml0eS5qc1wiO1xuaW1wb3J0IHsgTmV0d29yayB9IGZyb20gXCIuL25ldHdvcmsuanNcIjtcbmltcG9ydCB7IEpzb25ScGNQcm92aWRlciB9IGZyb20gXCIuL3Byb3ZpZGVyLWpzb25ycGMuanNcIjtcbmltcG9ydCB7IFdlYlNvY2tldFByb3ZpZGVyIH0gZnJvbSBcIi4vcHJvdmlkZXItd2Vic29ja2V0LmpzXCI7XG5jb25zdCBkZWZhdWx0UHJvamVjdElkID0gXCI4NDg0MjA3OGIwOTk0NjYzOGMwMzE1N2Y4MzQwNTIxM1wiO1xuZnVuY3Rpb24gZ2V0SG9zdChuYW1lKSB7XG4gICAgc3dpdGNoIChuYW1lKSB7XG4gICAgICAgIGNhc2UgXCJtYWlubmV0XCI6XG4gICAgICAgICAgICByZXR1cm4gXCJtYWlubmV0LmluZnVyYS5pb1wiO1xuICAgICAgICBjYXNlIFwiZ29lcmxpXCI6XG4gICAgICAgICAgICByZXR1cm4gXCJnb2VybGkuaW5mdXJhLmlvXCI7XG4gICAgICAgIGNhc2UgXCJzZXBvbGlhXCI6XG4gICAgICAgICAgICByZXR1cm4gXCJzZXBvbGlhLmluZnVyYS5pb1wiO1xuICAgICAgICBjYXNlIFwiYXJiaXRydW1cIjpcbiAgICAgICAgICAgIHJldHVybiBcImFyYml0cnVtLW1haW5uZXQuaW5mdXJhLmlvXCI7XG4gICAgICAgIGNhc2UgXCJhcmJpdHJ1bS1nb2VybGlcIjpcbiAgICAgICAgICAgIHJldHVybiBcImFyYml0cnVtLWdvZXJsaS5pbmZ1cmEuaW9cIjtcbiAgICAgICAgY2FzZSBcImFyYml0cnVtLXNlcG9saWFcIjpcbiAgICAgICAgICAgIHJldHVybiBcImFyYml0cnVtLXNlcG9saWEuaW5mdXJhLmlvXCI7XG4gICAgICAgIGNhc2UgXCJiYXNlXCI6XG4gICAgICAgICAgICByZXR1cm4gXCJiYXNlLW1haW5uZXQuaW5mdXJhLmlvXCI7XG4gICAgICAgIGNhc2UgXCJiYXNlLWdvZXJsaWFcIjogLy8gQFRPRE86IFJlbW92ZSB0aGlzIHR5cG8gaW4gdGhlIGZ1dHVyZSFcbiAgICAgICAgY2FzZSBcImJhc2UtZ29lcmxpXCI6XG4gICAgICAgICAgICByZXR1cm4gXCJiYXNlLWdvZXJsaS5pbmZ1cmEuaW9cIjtcbiAgICAgICAgY2FzZSBcImJhc2Utc2Vwb2xpYVwiOlxuICAgICAgICAgICAgcmV0dXJuIFwiYmFzZS1zZXBvbGlhLmluZnVyYS5pb1wiO1xuICAgICAgICBjYXNlIFwiYm5iXCI6XG4gICAgICAgICAgICByZXR1cm4gXCJic2MtbWFpbm5ldC5pbmZ1cmEuaW9cIjtcbiAgICAgICAgY2FzZSBcImJuYnRcIjpcbiAgICAgICAgICAgIHJldHVybiBcImJzYy10ZXN0bmV0LmluZnVyYS5pb1wiO1xuICAgICAgICBjYXNlIFwibGluZWFcIjpcbiAgICAgICAgICAgIHJldHVybiBcImxpbmVhLW1haW5uZXQuaW5mdXJhLmlvXCI7XG4gICAgICAgIGNhc2UgXCJsaW5lYS1nb2VybGlcIjpcbiAgICAgICAgICAgIHJldHVybiBcImxpbmVhLWdvZXJsaS5pbmZ1cmEuaW9cIjtcbiAgICAgICAgY2FzZSBcImxpbmVhLXNlcG9saWFcIjpcbiAgICAgICAgICAgIHJldHVybiBcImxpbmVhLXNlcG9saWEuaW5mdXJhLmlvXCI7XG4gICAgICAgIGNhc2UgXCJtYXRpY1wiOlxuICAgICAgICAgICAgcmV0dXJuIFwicG9seWdvbi1tYWlubmV0LmluZnVyYS5pb1wiO1xuICAgICAgICBjYXNlIFwibWF0aWMtYW1veVwiOlxuICAgICAgICAgICAgcmV0dXJuIFwicG9seWdvbi1hbW95LmluZnVyYS5pb1wiO1xuICAgICAgICBjYXNlIFwibWF0aWMtbXVtYmFpXCI6XG4gICAgICAgICAgICByZXR1cm4gXCJwb2x5Z29uLW11bWJhaS5pbmZ1cmEuaW9cIjtcbiAgICAgICAgY2FzZSBcIm9wdGltaXNtXCI6XG4gICAgICAgICAgICByZXR1cm4gXCJvcHRpbWlzbS1tYWlubmV0LmluZnVyYS5pb1wiO1xuICAgICAgICBjYXNlIFwib3B0aW1pc20tZ29lcmxpXCI6XG4gICAgICAgICAgICByZXR1cm4gXCJvcHRpbWlzbS1nb2VybGkuaW5mdXJhLmlvXCI7XG4gICAgICAgIGNhc2UgXCJvcHRpbWlzbS1zZXBvbGlhXCI6XG4gICAgICAgICAgICByZXR1cm4gXCJvcHRpbWlzbS1zZXBvbGlhLmluZnVyYS5pb1wiO1xuICAgIH1cbiAgICBhc3NlcnRBcmd1bWVudChmYWxzZSwgXCJ1bnN1cHBvcnRlZCBuZXR3b3JrXCIsIFwibmV0d29ya1wiLCBuYW1lKTtcbn1cbi8qKlxuICogIFRoZSAqKkluZnVyYVdlYlNvY2tldFByb3ZpZGVyKiogY29ubmVjdHMgdG8gdGhlIFtbbGluay1pbmZ1cmFdXVxuICogIFdlYlNvY2tldCBlbmQtcG9pbnRzLlxuICpcbiAqICBCeSBkZWZhdWx0LCBhIGhpZ2hseS10aHJvdHRsZWQgQVBJIGtleSBpcyB1c2VkLCB3aGljaCBpc1xuICogIGFwcHJvcHJpYXRlIGZvciBxdWljayBwcm90b3R5cGVzIGFuZCBzaW1wbGUgc2NyaXB0cy4gVG9cbiAqICBnYWluIGFjY2VzcyB0byBhbiBpbmNyZWFzZWQgcmF0ZS1saW1pdCwgaXQgaXMgaGlnaGx5XG4gKiAgcmVjb21tZW5kZWQgdG8gW3NpZ24gdXAgaGVyZV0obGluay1pbmZ1cmEtc2lnbnVwKS5cbiAqL1xuZXhwb3J0IGNsYXNzIEluZnVyYVdlYlNvY2tldFByb3ZpZGVyIGV4dGVuZHMgV2ViU29ja2V0UHJvdmlkZXIge1xuICAgIC8qKlxuICAgICAqICBUaGUgUHJvamVjdCBJRCBmb3IgdGhlIElORlVSQSBjb25uZWN0aW9uLlxuICAgICAqL1xuICAgIHByb2plY3RJZDtcbiAgICAvKipcbiAgICAgKiAgVGhlIFByb2plY3QgU2VjcmV0LlxuICAgICAqXG4gICAgICogIElmIG51bGwsIG5vIGF1dGhlbnRpY2F0ZWQgcmVxdWVzdHMgYXJlIG1hZGUuIFRoaXMgc2hvdWxkIG5vdFxuICAgICAqICBiZSB1c2VkIG91dHNpZGUgb2YgcHJpdmF0ZSBjb250ZXh0cy5cbiAgICAgKi9cbiAgICBwcm9qZWN0U2VjcmV0O1xuICAgIC8qKlxuICAgICAqICBDcmVhdGVzIGEgbmV3ICoqSW5mdXJhV2ViU29ja2V0UHJvdmlkZXIqKi5cbiAgICAgKi9cbiAgICBjb25zdHJ1Y3RvcihuZXR3b3JrLCBwcm9qZWN0SWQpIHtcbiAgICAgICAgY29uc3QgcHJvdmlkZXIgPSBuZXcgSW5mdXJhUHJvdmlkZXIobmV0d29yaywgcHJvamVjdElkKTtcbiAgICAgICAgY29uc3QgcmVxID0gcHJvdmlkZXIuX2dldENvbm5lY3Rpb24oKTtcbiAgICAgICAgYXNzZXJ0KCFyZXEuY3JlZGVudGlhbHMsIFwiSU5GVVJBIFdlYlNvY2tldCBwcm9qZWN0IHNlY3JldHMgdW5zdXBwb3J0ZWRcIiwgXCJVTlNVUFBPUlRFRF9PUEVSQVRJT05cIiwgeyBvcGVyYXRpb246IFwiSW5mdXJhUHJvdmlkZXIuZ2V0V2ViU29ja2V0UHJvdmlkZXIoKVwiIH0pO1xuICAgICAgICBjb25zdCB1cmwgPSByZXEudXJsLnJlcGxhY2UoL15odHRwL2ksIFwid3NcIikucmVwbGFjZShcIi92My9cIiwgXCIvd3MvdjMvXCIpO1xuICAgICAgICBzdXBlcih1cmwsIHByb3ZpZGVyLl9uZXR3b3JrKTtcbiAgICAgICAgZGVmaW5lUHJvcGVydGllcyh0aGlzLCB7XG4gICAgICAgICAgICBwcm9qZWN0SWQ6IHByb3ZpZGVyLnByb2plY3RJZCxcbiAgICAgICAgICAgI
26774HByb2plY3RTZWNyZXQ6IHByb3ZpZGVyLnByb2plY3RTZWNyZXRcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIGlzQ29tbXVuaXR5UmVzb3VyY2UoKSB7XG4gICAgICAgIHJldHVybiAodGhpcy5wcm9qZWN0SWQgPT09IGRlZmF1bHRQcm9qZWN0SWQpO1xuICAgIH1cbn1cbi8qKlxuICogIFRoZSAqKkluZnVyYVByb3ZpZGVyKiogY29ubmVjdHMgdG8gdGhlIFtbbGluay1pbmZ1cmFdXVxuICogIEpTT04tUlBDIGVuZC1wb2ludHMuXG4gKlxuICogIEJ5IGRlZmF1bHQsIGEgaGlnaGx5LXRocm90dGxlZCBBUEkga2V5IGlzIHVzZWQsIHdoaWNoIGlzXG4gKiAgYXBwcm9wcmlhdGUgZm9yIHF1aWNrIHByb3RvdHlwZXMgYW5kIHNpbXBsZSBzY3JpcHRzLiBUb1xuICogIGdhaW4gYWNjZXNzIHRvIGFuIGluY3JlYXNlZCByYXRlLWxpbWl0LCBpdCBpcyBoaWdobHlcbiAqICByZWNvbW1lbmRlZCB0byBbc2lnbiB1cCBoZXJlXShsaW5rLWluZnVyYS1zaWdudXApLlxuICovXG5leHBvcnQgY2xhc3MgSW5mdXJhUHJvdmlkZXIgZXh0ZW5kcyBKc29uUnBjUHJvdmlkZXIge1xuICAgIC8qKlxuICAgICAqICBUaGUgUHJvamVjdCBJRCBmb3IgdGhlIElORlVSQSBjb25uZWN0aW9uLlxuICAgICAqL1xuICAgIHByb2plY3RJZDtcbiAgICAvKipcbiAgICAgKiAgVGhlIFByb2plY3QgU2VjcmV0LlxuICAgICAqXG4gICAgICogIElmIG51bGwsIG5vIGF1dGhlbnRpY2F0ZWQgcmVxdWVzdHMgYXJlIG1hZGUuIFRoaXMgc2hvdWxkIG5vdFxuICAgICAqICBiZSB1c2VkIG91dHNpZGUgb2YgcHJpdmF0ZSBjb250ZXh0cy5cbiAgICAgKi9cbiAgICBwcm9qZWN0U2VjcmV0O1xuICAgIC8qKlxuICAgICAqICBDcmVhdGVzIGEgbmV3ICoqSW5mdXJhUHJvdmlkZXIqKi5cbiAgICAgKi9cbiAgICBjb25zdHJ1Y3RvcihfbmV0d29yaywgcHJvamVjdElkLCBwcm9qZWN0U2VjcmV0KSB7XG4gICAgICAgIGlmIChfbmV0d29yayA9PSBudWxsKSB7XG4gICAgICAgICAgICBfbmV0d29yayA9IFwibWFpbm5ldFwiO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IG5ldHdvcmsgPSBOZXR3b3JrLmZyb20oX25ldHdvcmspO1xuICAgICAgICBpZiAocHJvamVjdElkID09IG51bGwpIHtcbiAgICAgICAgICAgIHByb2plY3RJZCA9IGRlZmF1bHRQcm9qZWN0SWQ7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHByb2plY3RTZWNyZXQgPT0gbnVsbCkge1xuICAgICAgICAgICAgcHJvamVjdFNlY3JldCA9IG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgcmVxdWVzdCA9IEluZnVyYVByb3ZpZGVyLmdldFJlcXVlc3QobmV0d29yaywgcHJvamVjdElkLCBwcm9qZWN0U2VjcmV0KTtcbiAgICAgICAgc3VwZXIocmVxdWVzdCwgbmV0d29yaywgeyBzdGF0aWNOZXR3b3JrOiBuZXR3b3JrIH0pO1xuICAgICAgICBkZWZpbmVQcm9wZXJ0aWVzKHRoaXMsIHsgcHJvamVjdElkLCBwcm9qZWN0U2VjcmV0IH0pO1xuICAgIH1cbiAgICBfZ2V0UHJvdmlkZXIoY2hhaW5JZCkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBJbmZ1cmFQcm92aWRlcihjaGFpbklkLCB0aGlzLnByb2plY3RJZCwgdGhpcy5wcm9qZWN0U2VjcmV0KTtcbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZXJyb3IpIHsgfVxuICAgICAgICByZXR1cm4gc3VwZXIuX2dldFByb3ZpZGVyKGNoYWluSWQpO1xuICAgIH1cbiAgICBpc0NvbW11bml0eVJlc291cmNlKCkge1xuICAgICAgICByZXR1cm4gKHRoaXMucHJvamVjdElkID09PSBkZWZhdWx0UHJvamVjdElkKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogIENyZWF0ZXMgYSBuZXcgKipJbmZ1cmFXZWJTb2NrZXRQcm92aWRlcioqLlxuICAgICAqL1xuICAgIHN0YXRpYyBnZXRXZWJTb2NrZXRQcm92aWRlcihuZXR3b3JrLCBwcm9qZWN0SWQpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBJbmZ1cmFXZWJTb2NrZXRQcm92aWRlcihuZXR3b3JrLCBwcm9qZWN0SWQpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiAgUmV0dXJucyBhIHByZXBhcmVkIHJlcXVlc3QgZm9yIGNvbm5lY3RpbmcgdG8gJSVuZXR3b3JrJSVcbiAgICAgKiAgd2l0aCAlJXByb2plY3RJZCUlIGFuZCAlJXByb2plY3RTZWNyZXQlJS5cbiAgICAgKi9cbiAgICBzdGF0aWMgZ2V0UmVxdWVzdChuZXR3b3JrLCBwcm9qZWN0SWQsIHByb2plY3RTZWNyZXQpIHtcbiAgICAgICAgaWYgKHByb2plY3RJZCA9PSBudWxsKSB7XG4gICAgICAgICAgICBwcm9qZWN0SWQgPSBkZWZhdWx0UHJvamVjdElkO1xuICAgICAgICB9XG4gICAgICAgIGlmIChwcm9qZWN0U2VjcmV0ID09IG51bGwpIHtcbiAgICAgICAgICAgIHByb2plY3RTZWNyZXQgPSBudWxsO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHJlcXVlc3QgPSBuZXcgRmV0Y2hSZXF1ZXN0KGBodHRwczovXFwvJHtnZXRIb3N0KG5ldHdvcmsubmFtZSl9L3YzLyR7cHJvamVjdElkfWApO1xuICAgICAgICByZXF1ZXN0LmFsbG93R3ppcCA9IHRydWU7XG4gICAgICAgIGlmIChwcm9qZWN0U2VjcmV0KSB7XG4gICAgICAgICAgICByZXF1ZXN0LnNldENyZWRlbnRpYWxzKFwiXCIsIHByb2plY3RTZWNyZXQpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChwcm9qZWN0SWQgPT09IGRlZmF1bHRQcm9qZWN0SWQpIHtcbiAgICAgICAgICAgIHJlcXVlc3QucmV0cnlGdW5jID0gYXN5bmMgKHJlcXVlc3QsIHJlc3BvbnNlLCBhdHRlbXB0KSA9PiB7XG4gICAgICAgICAgICAgICAgc2hvd1Rocm90dGxlTWVzc2FnZShcIkluZnVyYVByb3ZpZGVyXCIpO1xuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVxdWVzdDtcbiAgICB9XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1wcm92aWRlci1pbmZ1cmEuanMubWFwIiwiLyoqXG4gKiAgW1tsaW5rLXF1aWNrbm9kZV1dIHByb3ZpZGVzIGEgdGhpcmQtcGFydHkgc2VydmljZSBmb3IgY29ubmVjdGluZyB0b1xuICogIHZhcmlvdXMgYmxvY2tjaGFpbnMgb3ZlciBKU09OLVJQQy5cbiAqXG4gKiAgKipTdXBwb3J0ZWQgTmV0d29ya3MqKlxuICpcbiAqICAtIEV0aGVyZXVtIE1haW5uZXQgKGBgbWFpbm5ldGBgKVxuICogIC0gR29lcmxpIFRlc3RuZXQgKGBgZ29lcmxpYGApXG4gKiAgLSBTZXBvbGlhIFRlc3RuZXQgKGBgc2Vwb2xpYWBgKVxuICogIC0gSG9sZXNreSBUZXN0bmV0IChgYGhvbGVza3lgYClcbiAqICAtIEFyYml0cnVtIChgYGFyYml0cnVtYGApXG4gKiAgLSBBcmJpdHJ1bSBHb2VybGkgVGVzdG5ldCAoYGBhcmJpdHJ1bS1nb2VybGlgYClcbiAqICAtIEFyYml0cnVtIFNlcG9saWEgVGVzdG5ldCAoYGBhcmJpdHJ1bS1zZXBvbGlhYGApXG4gKiAgLSBCYXNlIE1haW5uZXQgKGBgYmFzZWBgKTtcbiAqICAtIEJhc2UgR29lcmxpIFRlc3RuZXQgKGBgYmFzZS1nb2VybGlgYCk7XG4gKiAgLSBCYXNlIFNlcG9saWEgVGVzdG5ldCAoYGBiYXNlLXNlcG9saWFgYCk7XG4gKiAgLSBCTkIgU21hcnQgQ2hhaW4gTWFpbm5ldCAoYGBibmJgYClcbiAqICAtIEJOQiBTbWFydCBDaGFpbiBUZXN0bmV0IChgYGJuYnRgYClcbiAqICAtIE9wdGltaXNtIChgYG9wdGltaXNtYGApXG4gKiAgLSBPcHRpbWlzbSBHb2VybGkgVGVzdG5ldCAoYGBvcHRpbWlzbS1nb2VybGlgYClcbiAqICAtIE9wdGltaXNtIFNlcG9saWEgVGVzdG5ldCAoYGBvcHRpbWlzbS1zZXBvbGlhYGApXG4gKiAgLSBQb2x5Z29uIChgYG1hdGljYGApXG4gKiAgLSBQb2x5Z29uIE11bWJhaSBUZXN0bmV0IChgYG1hdGljLW11bWJhaWBgKVxuICpcbiAqICBAX3N1YnNlY3Rpb246IGFwaS9wcm92aWRlcnMvdGhpcmRwYXJ0eTpRdWlja05vZGUgIFtwcm92aWRlcnMtcXVpY2tub2RlXVxuICovXG5pbXBvcnQgeyBkZWZpbmVQcm9wZXJ0aWVzLCBGZXRjaFJlcXVlc3QsIGFzc2VydEFyZ3VtZW50IH0gZnJvbSBcIi4uL3V0aWxzL2luZGV4LmpzXCI7XG5pbXBvcnQgeyBzaG93VGhyb3R0bGVNZXNzYWdlIH0gZnJvbSBcIi4vY29tbXVuaXR5LmpzXCI7XG5pbXBvcnQgeyBOZXR3b3JrIH0gZnJvbSBcIi4vbmV0d29yay5qc1wiO1xuaW1wb3J0IHsgSnNvblJwY1Byb3ZpZGVyIH0gZnJvbSBcIi4vcHJvdmlkZXItanNvbnJwYy5qc1wiO1xuY29uc3QgZGVmYXVsdFRva2VuID0gXCI5MTliNDEyYTA1N2I1ZTljOWI2ZGNlMTkzYzVhNjAyNDJkNmVmYWRiXCI7XG5mdW5jdGlvbiBnZXRIb3N0KG5hbWUpIHtcbiAgICBzd2l0Y2ggKG5hbWUpIHtcbiAgICAgICAgY2FzZSBcIm1haW5uZXRcIjpcbiAgICAgICAgICAgI
26774HJldHVybiBcImV0aGVycy5xdWlrbm9kZS5wcm9cIjtcbiAgICAgICAgY2FzZSBcImdvZXJsaVwiOlxuICAgICAgICAgICAgcmV0dXJuIFwiZXRoZXJzLmV0aGVyZXVtLWdvZXJsaS5xdWlrbm9kZS5wcm9cIjtcbiAgICAgICAgY2FzZSBcInNlcG9saWFcIjpcbiAgICAgICAgICAgIHJldHVybiBcImV0aGVycy5ldGhlcmV1bS1zZXBvbGlhLnF1aWtub2RlLnByb1wiO1xuICAgICAgICBjYXNlIFwiaG9sZXNreVwiOlxuICAgICAgICAgICAgcmV0dXJuIFwiZXRoZXJzLmV0aGVyZXVtLWhvbGVza3kucXVpa25vZGUucHJvXCI7XG4gICAgICAgIGNhc2UgXCJhcmJpdHJ1bVwiOlxuICAgICAgICAgICAgcmV0dXJuIFwiZXRoZXJzLmFyYml0cnVtLW1haW5uZXQucXVpa25vZGUucHJvXCI7XG4gICAgICAgIGNhc2UgXCJhcmJpdHJ1bS1nb2VybGlcIjpcbiAgICAgICAgICAgIHJldHVybiBcImV0aGVycy5hcmJpdHJ1bS1nb2VybGkucXVpa25vZGUucHJvXCI7XG4gICAgICAgIGNhc2UgXCJhcmJpdHJ1bS1zZXBvbGlhXCI6XG4gICAgICAgICAgICByZXR1cm4gXCJldGhlcnMuYXJiaXRydW0tc2Vwb2xpYS5xdWlrbm9kZS5wcm9cIjtcbiAgICAgICAgY2FzZSBcImJhc2VcIjpcbiAgICAgICAgICAgIHJldHVybiBcImV0aGVycy5iYXNlLW1haW5uZXQucXVpa25vZGUucHJvXCI7XG4gICAgICAgIGNhc2UgXCJiYXNlLWdvZXJsaVwiOlxuICAgICAgICAgICAgcmV0dXJuIFwiZXRoZXJzLmJhc2UtZ29lcmxpLnF1aWtub2RlLnByb1wiO1xuICAgICAgICBjYXNlIFwiYmFzZS1zcG9saWFcIjpcbiAgICAgICAgICAgIHJldHVybiBcImV0aGVycy5iYXNlLXNlcG9saWEucXVpa25vZGUucHJvXCI7XG4gICAgICAgIGNhc2UgXCJibmJcIjpcbiAgICAgICAgICAgIHJldHVybiBcImV0aGVycy5ic2MucXVpa25vZGUucHJvXCI7XG4gICAgICAgIGNhc2UgXCJibmJ0XCI6XG4gICAgICAgICAgICByZXR1cm4gXCJldGhlcnMuYnNjLXRlc3RuZXQucXVpa25vZGUucHJvXCI7XG4gICAgICAgIGNhc2UgXCJtYXRpY1wiOlxuICAgICAgICAgICAgcmV0dXJuIFwiZXRoZXJzLm1hdGljLnF1aWtub2RlLnByb1wiO1xuICAgICAgICBjYXNlIFwibWF0aWMtbXVtYmFpXCI6XG4gICAgICAgICAgICByZXR1cm4gXCJldGhlcnMubWF0aWMtdGVzdG5ldC5xdWlrbm9kZS5wcm9cIjtcbiAgICAgICAgY2FzZSBcIm9wdGltaXNtXCI6XG4gICAgICAgICAgICByZXR1cm4gXCJldGhlcnMub3B0aW1pc20ucXVpa25vZGUucHJvXCI7XG4gICAgICAgIGNhc2UgXCJvcHRpbWlzbS1nb2VybGlcIjpcbiAgICAgICAgICAgIHJldHVybiBcImV0aGVycy5vcHRpbWlzbS1nb2VybGkucXVpa25vZGUucHJvXCI7XG4gICAgICAgIGNhc2UgXCJvcHRpbWlzbS1zZXBvbGlhXCI6XG4gICAgICAgICAgICByZXR1cm4gXCJldGhlcnMub3B0aW1pc20tc2Vwb2xpYS5xdWlrbm9kZS5wcm9cIjtcbiAgICAgICAgY2FzZSBcInhkYWlcIjpcbiAgICAgICAgICAgIHJldHVybiBcImV0aGVycy54ZGFpLnF1aWtub2RlLnByb1wiO1xuICAgIH1cbiAgICBhc3NlcnRBcmd1bWVudChmYWxzZSwgXCJ1bnN1cHBvcnRlZCBuZXR3b3JrXCIsIFwibmV0d29ya1wiLCBuYW1lKTtcbn1cbi8qXG5AVE9ETzpcbiAgVGhlc2UgbmV0d29ya3MgYXJlIG5vdCBjdXJyZW50bHkgcHJlc2VudCBpbiB0aGUgTmV0d29ya1xuICBkZWZhdWx0IGluY2x1ZGVkIG5ldHdvcmtzLiBSZXNlYXJjaCB0aGVtIGFuZCBlbnN1cmUgdGhleVxuICBhcmUgRVZNIGNvbXBhdGlibGUgYW5kIHdvcmsgd2l0aCBldGhlcnNcblxuICBodHRwOi8vZXRoZXJzLm1hdGljLWFtb3kucXVpa25vZGUucHJvXG5cbiAgaHR0cDovL2V0aGVycy5hdmFsYW5jaGUtbWFpbm5ldC5xdWlrbm9kZS5wcm9cbiAgaHR0cDovL2V0aGVycy5hdmFsYW5jaGUtdGVzdG5ldC5xdWlrbm9kZS5wcm9cbiAgaHR0cDovL2V0aGVycy5ibGFzdC1zZXBvbGlhLnF1aWtub2RlLnByb1xuICBodHRwOi8vZXRoZXJzLmNlbG8tbWFpbm5ldC5xdWlrbm9kZS5wcm9cbiAgaHR0cDovL2V0aGVycy5mYW50b20ucXVpa25vZGUucHJvXG4gIGh0dHA6Ly9ldGhlcnMuaW14LWRlbW8ucXVpa25vZGUucHJvXG4gIGh0dHA6Ly9ldGhlcnMuaW14LW1haW5uZXQucXVpa25vZGUucHJvXG4gIGh0dHA6Ly9ldGhlcnMuaW14LXRlc3RuZXQucXVpa25vZGUucHJvXG4gIGh0dHA6Ly9ldGhlcnMubmVhci1tYWlubmV0LnF1aWtub2RlLnByb1xuICBodHRwOi8vZXRoZXJzLm5lYXItdGVzdG5ldC5xdWlrbm9kZS5wcm9cbiAgaHR0cDovL2V0aGVycy5ub3ZhLW1haW5uZXQucXVpa25vZGUucHJvXG4gIGh0dHA6Ly9ldGhlcnMuc2Nyb2xsLW1haW5uZXQucXVpa25vZGUucHJvXG4gIGh0dHA6Ly9ldGhlcnMuc2Nyb2xsLXRlc3RuZXQucXVpa25vZGUucHJvXG4gIGh0dHA6Ly9ldGhlcnMudHJvbi1tYWlubmV0LnF1aWtub2RlLnByb1xuICBodHRwOi8vZXRoZXJzLnprZXZtLW1haW5uZXQucXVpa25vZGUucHJvXG4gIGh0dHA6Ly9ldGhlcnMuemtldm0tdGVzdG5ldC5xdWlrbm9kZS5wcm9cbiAgaHR0cDovL2V0aGVycy56a3N5bmMtbWFpbm5ldC5xdWlrbm9kZS5wcm9cbiAgaHR0cDovL2V0aGVycy56a3N5bmMtdGVzdG5ldC5xdWlrbm9kZS5wcm9cbiovXG4vKipcbiAqICBUaGUgKipRdWlja05vZGVQcm92aWRlcioqIGNvbm5lY3RzIHRvIHRoZSBbW2xpbmstcXVpY2tub2RlXV1cbiAqICBKU09OLVJQQyBlbmQtcG9pbnRzLlxuICpcbiAqICBCeSBkZWZhdWx0LCBhIGhpZ2hseS10aHJvdHRsZWQgQVBJIHRva2VuIGlzIHVzZWQsIHdoaWNoIGlzXG4gKiAgYXBwcm9wcmlhdGUgZm9yIHF1aWNrIHByb3RvdHlwZXMgYW5kIHNpbXBsZSBzY3JpcHRzLiBUb1xuICogIGdhaW4gYWNjZXNzIHRvIGFuIGluY3JlYXNlZCByYXRlLWxpbWl0LCBpdCBpcyBoaWdobHlcbiAqICByZWNvbW1lbmRlZCB0byBbc2lnbiB1cCBoZXJlXShsaW5rLXF1aWNrbm9kZSkuXG4gKi9cbmV4cG9ydCBjbGFzcyBRdWlja05vZGVQcm92aWRlciBleHRlbmRzIEpzb25ScGNQcm92aWRlciB7XG4gICAgLyoqXG4gICAgICogIFRoZSBBUEkgdG9rZW4uXG4gICAgICovXG4gICAgdG9rZW47XG4gICAgLyoqXG4gICAgICogIENyZWF0ZXMgYSBuZXcgKipRdWlja05vZGVQcm92aWRlcioqLlxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yKF9uZXR3b3JrLCB0b2tlbikge1xuICAgICAgICBpZiAoX25ldHdvcmsgPT0gbnVsbCkge1xuICAgICAgICAgICAgX25ldHdvcmsgPSBcIm1haW5uZXRcIjtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBuZXR3b3JrID0gTmV0d29yay5mcm9tKF9uZXR3b3JrKTtcbiAgICAgICAgaWYgKHRva2VuID09IG51bGwpIHtcbiAgICAgICAgICAgI
26774HRva2VuID0gZGVmYXVsdFRva2VuO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHJlcXVlc3QgPSBRdWlja05vZGVQcm92aWRlci5nZXRSZXF1ZXN0KG5ldHdvcmssIHRva2VuKTtcbiAgICAgICAgc3VwZXIocmVxdWVzdCwgbmV0d29yaywgeyBzdGF0aWNOZXR3b3JrOiBuZXR3b3JrIH0pO1xuICAgICAgICBkZWZpbmVQcm9wZXJ0aWVzKHRoaXMsIHsgdG9rZW4gfSk7XG4gICAgfVxuICAgIF9nZXRQcm92aWRlcihjaGFpbklkKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICByZXR1cm4gbmV3IFF1aWNrTm9kZVByb3ZpZGVyKGNoYWluSWQsIHRoaXMudG9rZW4pO1xuICAgICAgICB9XG4gICAgICAgIGNhdGNoIChlcnJvcikgeyB9XG4gICAgICAgIHJldHVybiBzdXBlci5fZ2V0UHJvdmlkZXIoY2hhaW5JZCk7XG4gICAgfVxuICAgIGlzQ29tbXVuaXR5UmVzb3VyY2UoKSB7XG4gICAgICAgIHJldHVybiAodGhpcy50b2tlbiA9PT0gZGVmYXVsdFRva2VuKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogIFJldHVybnMgYSBuZXcgcmVxdWVzdCBwcmVwYXJlZCBmb3IgJSVuZXR3b3JrJSUgYW5kIHRoZVxuICAgICAqICAlJXRva2VuJSUuXG4gICAgICovXG4gICAgc3RhdGljIGdldFJlcXVlc3QobmV0d29yaywgdG9rZW4pIHtcbiAgICAgICAgaWYgKHRva2VuID09IG51bGwpIHtcbiAgICAgICAgICAgIHRva2VuID0gZGVmYXVsdFRva2VuO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHJlcXVlc3QgPSBuZXcgRmV0Y2hSZXF1ZXN0KGBodHRwczovXFwvJHtnZXRIb3N0KG5ldHdvcmsubmFtZSl9LyR7dG9rZW59YCk7XG4gICAgICAgIHJlcXVlc3QuYWxsb3dHemlwID0gdHJ1ZTtcbiAgICAgICAgLy9pZiAocHJvamVjdFNlY3JldCkgeyByZXF1ZXN0LnNldENyZWRlbnRpYWxzKFwiXCIsIHByb2plY3RTZWNyZXQpOyB9XG4gICAgICAgIGlmICh0b2tlbiA9PT0gZGVmYXVsdFRva2VuKSB7XG4gICAgICAgICAgICByZXF1ZXN0LnJldHJ5RnVuYyA9IGFzeW5jIChyZXF1ZXN0LCByZXNwb25zZSwgYXR0ZW1wdCkgPT4ge1xuICAgICAgICAgICAgICAgIHNob3dUaHJvdHRsZU1lc3NhZ2UoXCJRdWlja05vZGVQcm92aWRlclwiKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlcXVlc3Q7XG4gICAgfVxufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9cHJvdmlkZXItcXVpY2tub2RlLmpzLm1hcCIsIi8qKlxuICogIEEgKipGYWxsYmFja1Byb3ZpZGVyKiogcHJvdmlkZXMgcmVzaWxpZW5jZSwgc2VjdXJpdHkgYW5kIHBlcmZvcm1hbmNlXG4gKiAgaW4gYSB3YXkgdGhhdCBpcyBjdXN0b21pemFibGUgYW5kIGNvbmZpZ3VyYWJsZS5cbiAqXG4gKiAgQF9zZWN0aW9uOiBhcGkvcHJvdmlkZXJzL2ZhbGxiYWNrLXByb3ZpZGVyOkZhbGxiYWNrIFByb3ZpZGVyIFthYm91dC1mYWxsYmFjay1wcm92aWRlcl1cbiAqL1xuaW1wb3J0IHsgYXNzZXJ0LCBhc3NlcnRBcmd1bWVudCwgZ2V0QmlnSW50LCBnZXROdW1iZXIsIGlzRXJyb3IgfSBmcm9tIFwiLi4vdXRpbHMvaW5kZXguanNcIjtcbmltcG9ydCB7IEFic3RyYWN0UHJvdmlkZXIgfSBmcm9tIFwiLi9hYnN0cmFjdC1wcm92aWRlci5qc1wiO1xuaW1wb3J0IHsgTmV0d29yayB9IGZyb20gXCIuL25ldHdvcmsuanNcIjtcbmNvbnN0IEJOXzEgPSBCaWdJbnQoXCIxXCIpO1xuY29uc3QgQk5fMiA9IEJpZ0ludChcIjJcIik7XG5mdW5jdGlvbiBzaHVmZmxlKGFycmF5KSB7XG4gICAgZm9yIChsZXQgaSA9IGFycmF5Lmxlbmd0aCAtIDE7IGkgPiAwOyBpLS0pIHtcbiAgICAgICAgY29uc3QgaiA9IE1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSAqIChpICsgMSkpO1xuICAgICAgICBjb25zdCB0bXAgPSBhcnJheVtpXTtcbiAgICAgICAgYXJyYXlbaV0gPSBhcnJheVtqXTtcbiAgICAgICAgYXJyYXlbal0gPSB0bXA7XG4gICAgfVxufVxuZnVuY3Rpb24gc3RhbGwoZHVyYXRpb24pIHtcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHsgc2V0VGltZW91dChyZXNvbHZlLCBkdXJhdGlvbik7IH0pO1xufVxuZnVuY3Rpb24gZ2V0VGltZSgpIHsgcmV0dXJuIChuZXcgRGF0ZSgpKS5nZXRUaW1lKCk7IH1cbmZ1bmN0aW9uIHN0cmluZ2lmeSh2YWx1ZSkge1xuICAgIHJldHVybiBKU09OLnN0cmluZ2lmeSh2YWx1ZSwgKGtleSwgdmFsdWUpID0+IHtcbiAgICAgICAgaWYgKHR5cGVvZiAodmFsdWUpID09PSBcImJpZ2ludFwiKSB7XG4gICAgICAgICAgICByZXR1cm4geyB0eXBlOiBcImJpZ2ludFwiLCB2YWx1ZTogdmFsdWUudG9TdHJpbmcoKSB9O1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICB9KTtcbn1cbjtcbmNvbnN0IGRlZmF1bHRDb25maWcgPSB7IHN0YWxsVGltZW91dDogNDAwLCBwcmlvcml0eTogMSwgd2VpZ2h0OiAxIH07XG5jb25zdCBkZWZhdWx0U3RhdGUgPSB7XG4gICAgYmxvY2tOdW1iZXI6IC0yLCByZXF1ZXN0czogMCwgbGF0ZVJlc3BvbnNlczogMCwgZXJyb3JSZXNwb25zZXM6IDAsXG4gICAgb3V0T2ZTeW5jOiAtMSwgdW5zdXBwb3J0ZWRFdmVudHM6IDAsIHJvbGxpbmdEdXJhdGlvbjogMCwgc2NvcmU6IDAsXG4gICAgX25ldHdvcms6IG51bGwsIF91cGRhdGVOdW1iZXI6IG51bGwsIF90b3RhbFRpbWU6IDAsXG4gICAgX2xhc3RGYXRhbEVycm9yOiBudWxsLCBfbGFzdEZhdGFsRXJyb3JUaW1lc3RhbXA6IDBcbn07XG5hc3luYyBmdW5jdGlvbiB3YWl0Rm9yU3luYyhjb25maWcsIGJsb2NrTnVtYmVyKSB7XG4gICAgd2hpbGUgKGNvbmZpZy5ibG9ja051bWJlciA8IDAgfHwgY29uZmlnLmJsb2NrTnVtYmVyIDwgYmxvY2tOdW1iZXIpIHtcbiAgICAgICAgaWYgKCFjb25maWcuX3VwZGF0ZU51bWJlcikge1xuICAgICAgICAgICAgY29uZmlnLl91cGRhdGVOdW1iZXIgPSAoYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGJsb2NrTnVtYmVyID0gYXdhaXQgY29uZmlnLnByb3ZpZGVyLmdldEJsb2NrTnVtYmVyKCk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChibG9ja051bWJlciA+IGNvbmZpZy5ibG9ja051bWJlcikge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlnLmJsb2NrTnVtYmVyID0gYmxvY2tOdW1iZXI7XG4gICAgICAgICAgICAgICAgICAgI
26774H1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbmZpZy5ibG9ja051bWJlciA9IC0yO1xuICAgICAgICAgICAgICAgICAgICBjb25maWcuX2xhc3RGYXRhbEVycm9yID0gZXJyb3I7XG4gICAgICAgICAgICAgICAgICAgIGNvbmZpZy5fbGFzdEZhdGFsRXJyb3JUaW1lc3RhbXAgPSBnZXRUaW1lKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNvbmZpZy5fdXBkYXRlTnVtYmVyID0gbnVsbDtcbiAgICAgICAgICAgIH0pKCk7XG4gICAgICAgIH1cbiAgICAgICAgYXdhaXQgY29uZmlnLl91cGRhdGVOdW1iZXI7XG4gICAgICAgIGNvbmZpZy5vdXRPZlN5bmMrKztcbiAgICAgICAgaWYgKGNvbmZpZy5fbGFzdEZhdGFsRXJyb3IpIHtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgfVxufVxuZnVuY3Rpb24gX25vcm1hbGl6ZSh2YWx1ZSkge1xuICAgIGlmICh2YWx1ZSA9PSBudWxsKSB7XG4gICAgICAgIHJldHVybiBcIm51bGxcIjtcbiAgICB9XG4gICAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG4gICAgICAgIHJldHVybiBcIltcIiArICh2YWx1ZS5tYXAoX25vcm1hbGl6ZSkpLmpvaW4oXCIsXCIpICsgXCJdXCI7XG4gICAgfVxuICAgIGlmICh0eXBlb2YgKHZhbHVlKSA9PT0gXCJvYmplY3RcIiAmJiB0eXBlb2YgKHZhbHVlLnRvSlNPTikgPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICByZXR1cm4gX25vcm1hbGl6ZSh2YWx1ZS50b0pTT04oKSk7XG4gICAgfVxuICAgIHN3aXRjaCAodHlwZW9mICh2YWx1ZSkpIHtcbiAgICAgICAgY2FzZSBcImJvb2xlYW5cIjpcbiAgICAgICAgY2FzZSBcInN5bWJvbFwiOlxuICAgICAgICAgICAgcmV0dXJuIHZhbHVlLnRvU3RyaW5nKCk7XG4gICAgICAgIGNhc2UgXCJiaWdpbnRcIjpcbiAgICAgICAgY2FzZSBcIm51bWJlclwiOlxuICAgICAgICAgICAgcmV0dXJuIEJpZ0ludCh2YWx1ZSkudG9TdHJpbmcoKTtcbiAgICAgICAgY2FzZSBcInN0cmluZ1wiOlxuICAgICAgICAgICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KHZhbHVlKTtcbiAgICAgICAgY2FzZSBcIm9iamVjdFwiOiB7XG4gICAgICAgICAgICBjb25zdCBrZXlzID0gT2JqZWN0LmtleXModmFsdWUpO1xuICAgICAgICAgICAga2V5cy5zb3J0KCk7XG4gICAgICAgICAgICByZXR1cm4gXCJ7XCIgKyBrZXlzLm1hcCgoaykgPT4gYCR7SlNPTi5zdHJpbmdpZnkoayl9OiR7X25vcm1hbGl6ZSh2YWx1ZVtrXSl9YCkuam9pbihcIixcIikgKyBcIn1cIjtcbiAgICAgICAgfVxuICAgIH1cbiAgICBjb25zb2xlLmxvZyhcIkNvdWxkIG5vdCBzZXJpYWxpemVcIiwgdmFsdWUpO1xuICAgIHRocm93IG5ldyBFcnJvcihcIkhtbS4uLlwiKTtcbn1cbmZ1bmN0aW9uIG5vcm1hbGl6ZVJlc3VsdChtZXRob2QsIHZhbHVlKSB7XG4gICAgaWYgKFwiZXJyb3JcIiBpbiB2YWx1ZSkge1xuICAgICAgICBjb25zdCBlcnJvciA9IHZhbHVlLmVycm9yO1xuICAgICAgICBsZXQgdGFnO1xuICAgICAgICBpZiAoaXNFcnJvcihlcnJvciwgXCJDQUxMX0VYQ0VQVElPTlwiKSkge1xuICAgICAgICAgICAgdGFnID0gX25vcm1hbGl6ZShPYmplY3QuYXNzaWduKHt9LCBlcnJvciwge1xuICAgICAgICAgICAgICAgIHNob3J0TWVzc2FnZTogdW5kZWZpbmVkLCByZWFzb246IHVuZGVmaW5lZCwgaW5mbzogdW5kZWZpbmVkXG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0YWcgPSBfbm9ybWFsaXplKGVycm9yKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4geyB0YWcsIHZhbHVlOiBlcnJvciB9O1xuICAgIH1cbiAgICBjb25zdCByZXN1bHQgPSB2YWx1ZS5yZXN1bHQ7XG4gICAgcmV0dXJuIHsgdGFnOiBfbm9ybWFsaXplKHJlc3VsdCksIHZhbHVlOiByZXN1bHQgfTtcbn1cbi8vIFRoaXMgc3RyYXRlZ3kgcGlja3MgdGhlIGhpZ2hlc3Qgd2VpZ2h0IHJlc3VsdCwgYXMgbG9uZyBhcyB0aGUgd2VpZ2h0IGlzXG4vLyBlcXVhbCB0byBvciBncmVhdGVyIHRoYW4gcXVvcnVtXG5mdW5jdGlvbiBjaGVja1F1b3J1bShxdW9ydW0sIHJlc3VsdHMpIHtcbiAgICBjb25zdCB0YWxseSA9IG5ldyBNYXAoKTtcbiAgICBmb3IgKGNvbnN0IHsgdmFsdWUsIHRhZywgd2VpZ2h0IH0gb2YgcmVzdWx0cykge1xuICAgICAgICBjb25zdCB0ID0gdGFsbHkuZ2V0KHRhZykgfHwgeyB2YWx1ZSwgd2VpZ2h0OiAwIH07XG4gICAgICAgIHQud2VpZ2h0ICs9IHdlaWdodDtcbiAgICAgICAgdGFsbHkuc2V0KHRhZywgdCk7XG4gICAgfVxuICAgIGxldCBiZXN0ID0gbnVsbDtcbiAgICBmb3IgKGNvbnN0IHIgb2YgdGFsbHkudmFsdWVzKCkpIHtcbiAgICAgICAgaWYgKHIud2VpZ2h0ID49IHF1b3J1bSAmJiAoIWJlc3QgfHwgci53ZWlnaHQgPiBiZXN0LndlaWdodCkpIHtcbiAgICAgICAgICAgIGJlc3QgPSByO1xuICAgICAgICB9XG4gICAgfVxuICAgIGlmIChiZXN0KSB7XG4gICAgICAgIHJldHVybiBiZXN0LnZhbHVlO1xuICAgIH1cbiAgICByZXR1cm4gdW5kZWZpbmVkO1xufVxuZnVuY3Rpb24gZ2V0TWVkaWFuKHF1b3J1bSwgcmVzdWx0cykge1xuICAgIGxldCByZXN1bHRXZWlnaHQgPSAwO1xuICAgIGNvbnN0IGVycm9yTWFwID0gbmV3IE1hcCgpO1xuICAgIGxldCBiZXN0RXJyb3IgPSBudWxsO1xuICAgIGNvbnN0IHZhbHVlcyA9IFtdO1xuICAgIGZvciAoY29uc3QgeyB2YWx1ZSwgdGFnLCB3ZWlnaHQgfSBvZiByZXN1bHRzKSB7XG4gICAgICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgICAgICAgICBjb25zdCBlID0gZXJyb3JNYXAuZ2V0KHRhZykgfHwgeyB2YWx1ZSwgd2VpZ2h0OiAwIH07XG4gICAgICAgICAgICBlLndlaWdodCArPSB3ZWlnaHQ7XG4gICAgICAgICAgICBlcnJvck1hcC5zZXQodGFnLCBlKTtcbiAgICAgICAgICAgIGlmIChiZXN0RXJyb3IgPT0gbnVsbCB8fCBlLndlaWdodCA+IGJlc3RFcnJvci53ZWlnaHQpIHtcbiAgICAgICAgICAgICAgICBiZXN0RXJyb3IgPSBlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdmFsdWVzLnB1c2goQmlnSW50KHZhbHVlKSk7XG4gICAgICAgICAgICByZXN1bHRXZWlnaHQgKz0gd2VpZ2h0O1xuICAgICAgICB9XG4gICAgfVxuICAgIGlmIChyZXN1bHRXZWlnaHQgPCBxdW9ydW0pIHtcbiAgICAgICAgLy8gV2UgaGF2ZSBxdW9ydW0gZm9yIGFuIGVycm9yXG4gICAgICAgIGlmIChiZXN0RXJyb3IgJiYgYmVzdEVycm9yLndlaWdodCA+PSBxdW9ydW0pIHtcbiAgICAgICAgICAgI
26774HJldHVybiBiZXN0RXJyb3IudmFsdWU7XG4gICAgICAgIH1cbiAgICAgICAgLy8gV2UgZG8gbm90IGhhdmUgcXVvcnVtIGZvciBhIHJlc3VsdFxuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cbiAgICAvLyBHZXQgdGhlIHNvcnRlZCB2YWx1ZXNcbiAgICB2YWx1ZXMuc29ydCgoYSwgYikgPT4gKChhIDwgYikgPyAtMSA6IChiID4gYSkgPyAxIDogMCkpO1xuICAgIGNvbnN0IG1pZCA9IE1hdGguZmxvb3IodmFsdWVzLmxlbmd0aCAvIDIpO1xuICAgIC8vIE9kZC1sZW5ndGg7IHRha2UgdGhlIG1pZGRsZSB2YWx1ZVxuICAgIGlmICh2YWx1ZXMubGVuZ3RoICUgMikge1xuICAgICAgICByZXR1cm4gdmFsdWVzW21pZF07XG4gICAgfVxuICAgIC8vIEV2ZW4gbGVuZ3RoOyB0YWtlIHRoZSBjZWlsaW5nIG9mIHRoZSBtZWFuIG9mIHRoZSBjZW50ZXIgdHdvIHZhbHVlc1xuICAgIHJldHVybiAodmFsdWVzW21pZCAtIDFdICsgdmFsdWVzW21pZF0gKyBCTl8xKSAvIEJOXzI7XG59XG5mdW5jdGlvbiBnZXRBbnlSZXN1bHQocXVvcnVtLCByZXN1bHRzKSB7XG4gICAgLy8gSWYgYW55IHZhbHVlIG9yIGVycm9yIG1lZXRzIHF1b3J1bSwgdGhhdCBpcyBvdXIgcHJlZmVycmVkIHJlc3VsdFxuICAgIGNvbnN0IHJlc3VsdCA9IGNoZWNrUXVvcnVtKHF1b3J1bSwgcmVzdWx0cyk7XG4gICAgaWYgKHJlc3VsdCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuICAgIC8vIE90aGVyd2lzZSwgZG8gd2UgaGF2ZSBhbnkgcmVzdWx0P1xuICAgIGZvciAoY29uc3QgciBvZiByZXN1bHRzKSB7XG4gICAgICAgIGlmIChyLnZhbHVlKSB7XG4gICAgICAgICAgICByZXR1cm4gci52YWx1ZTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvLyBOb3BlIVxuICAgIHJldHVybiB1bmRlZmluZWQ7XG59XG5mdW5jdGlvbiBnZXRGdXp6eU1vZGUocXVvcnVtLCByZXN1bHRzKSB7XG4gICAgaWYgKHF1b3J1bSA9PT0gMSkge1xuICAgICAgICByZXR1cm4gZ2V0TnVtYmVyKGdldE1lZGlhbihxdW9ydW0sIHJlc3VsdHMpLCBcIiVpbnRlcm5hbFwiKTtcbiAgICB9XG4gICAgY29uc3QgdGFsbHkgPSBuZXcgTWFwKCk7XG4gICAgY29uc3QgYWRkID0gKHJlc3VsdCwgd2VpZ2h0KSA9PiB7XG4gICAgICAgIGNvbnN0IHQgPSB0YWxseS5nZXQocmVzdWx0KSB8fCB7IHJlc3VsdCwgd2VpZ2h0OiAwIH07XG4gICAgICAgIHQud2VpZ2h0ICs9IHdlaWdodDtcbiAgICAgICAgdGFsbHkuc2V0KHJlc3VsdCwgdCk7XG4gICAgfTtcbiAgICBmb3IgKGNvbnN0IHsgd2VpZ2h0LCB2YWx1ZSB9IG9mIHJlc3VsdHMpIHtcbiAgICAgICAgY29uc3QgciA9IGdldE51bWJlcih2YWx1ZSk7XG4gICAgICAgIGFkZChyIC0gMSwgd2VpZ2h0KTtcbiAgICAgICAgYWRkKHIsIHdlaWdodCk7XG4gICAgICAgIGFkZChyICsgMSwgd2VpZ2h0KTtcbiAgICB9XG4gICAgbGV0IGJlc3RXZWlnaHQgPSAwO1xuICAgIGxldCBiZXN0UmVzdWx0ID0gdW5kZWZpbmVkO1xuICAgIGZvciAoY29uc3QgeyB3ZWlnaHQsIHJlc3VsdCB9IG9mIHRhbGx5LnZhbHVlcygpKSB7XG4gICAgICAgIC8vIFVzZSB0aGlzIHJlc3VsdCwgaWYgdGhpcyByZXN1bHQgbWVldHMgcXVvcnVtIGFuZCBoYXMgZWl0aGVyOlxuICAgICAgICAvLyAtIGEgYmV0dGVyIHdlaWdodFxuICAgICAgICAvLyAtIG9yIGVxdWFsIHdlaWdodCwgYnV0IHRoZSByZXN1bHQgaXMgbGFyZ2VyXG4gICAgICAgIGlmICh3ZWlnaHQgPj0gcXVvcnVtICYmICh3ZWlnaHQgPiBiZXN0V2VpZ2h0IHx8IChiZXN0UmVzdWx0ICE9IG51bGwgJiYgd2VpZ2h0ID09PSBiZXN0V2VpZ2h0ICYmIHJlc3VsdCA+IGJlc3RSZXN1bHQpKSkge1xuICAgICAgICAgICAgYmVzdFdlaWdodCA9IHdlaWdodDtcbiAgICAgICAgICAgIGJlc3RSZXN1bHQgPSByZXN1bHQ7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGJlc3RSZXN1bHQ7XG59XG4vKipcbiAqICBBICoqRmFsbGJhY2tQcm92aWRlcioqIG1hbmFnZXMgc2V2ZXJhbCBbW1Byb3ZpZGVyc11dIHByb3ZpZGluZ1xuICogIHJlc2lsaWVuY2UgYnkgc3dpdGNoaW5nIGJldHdlZW4gc2xvdyBvciBtaXNiZWhhdmluZyBub2Rlcywgc2VjdXJpdHlcbiAqICBieSByZXF1aXJpbmcgbXVsdGlwbGUgYmFja2VuZHMgdG8gYWdncmVlIGFuZCBwZXJmb3JtYW5jZSBieSBhbGxvd2luZ1xuICogIGZhc3RlciBiYWNrZW5kcyB0byByZXNwb25kIGVhcmxpZXIuXG4gKlxuICovXG5leHBvcnQgY2xhc3MgRmFsbGJhY2tQcm92aWRlciBleHRlbmRzIEFic3RyYWN0UHJvdmlkZXIge1xuICAgIC8qKlxuICAgICAqICBUaGUgbnVtYmVyIG9mIGJhY2tlbmRzIHRoYXQgbXVzdCBhZ3JlZSBvbiBhIHZhbHVlIGJlZm9yZSBpdCBpc1xuICAgICAqICBhY2NwZXRlZC5cbiAgICAgKi9cbiAgICBxdW9ydW07XG4gICAgLyoqXG4gICAgICogIEBfaWdub3JlOlxuICAgICAqL1xuICAgIGV2ZW50UXVvcnVtO1xuICAgIC8qKlxuICAgICAqICBAX2lnbm9yZTpcbiAgICAgKi9cbiAgICBldmVudFdvcmtlcnM7XG4gICAgI2NvbmZpZ3M7XG4gICAgI2hlaWdodDtcbiAgICAjaW5pdGlhbFN5bmNQcm9taXNlO1xuICAgIC8qKlxuICAgICAqICBDcmVhdGVzIGEgbmV3ICoqRmFsbGJhY2tQcm92aWRlcioqIHdpdGggJSVwcm92aWRlcnMlJSBjb25uZWN0ZWQgdG9cbiAgICAgKiAgJSVuZXR3b3JrJSUuXG4gICAgICpcbiAgICAgKiAgSWYgYSBbW1Byb3ZpZGVyXV0gaXMgaW5jbHVkZWQgaW4gJSVwcm92aWRlcnMlJSwgZGVmYXVsdHMgYXJlIHVzZWRcbiAgICAgKiAgZm9yIHRoZSBjb25maWd1cmF0aW9uLlxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yKHByb3ZpZGVycywgbmV0d29yaywgb3B0aW9ucykge1xuICAgICAgICBzdXBlcihuZXR3b3JrLCBvcHRpb25zKTtcbiAgICAgICAgdGhpcy4jY29uZmlncyA9IHByb3ZpZGVycy5tYXAoKHApID0+IHtcbiAgICAgICAgICAgIGlmIChwIGluc3RhbmNlb2YgQWJzdHJhY3RQcm92aWRlcikge1xuICAgICAgICAgICAgICAgIHJldHVybiBPYmplY3QuYXNzaWduKHsgcHJvdmlkZXI6IHAgfSwgZGVmYXVsdENvbmZpZywgZGVmYXVsdFN0YXRl
26774KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybiBPYmplY3QuYXNzaWduKHt9LCBkZWZhdWx0Q29uZmlnLCBwLCBkZWZhdWx0U3RhdGUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy4jaGVpZ2h0ID0gLTI7XG4gICAgICAgIHRoaXMuI2luaXRpYWxTeW5jUHJvbWlzZSA9IG51bGw7XG4gICAgICAgIGlmIChvcHRpb25zICYmIG9wdGlvbnMucXVvcnVtICE9IG51bGwpIHtcbiAgICAgICAgICAgIHRoaXMucXVvcnVtID0gb3B0aW9ucy5xdW9ydW07XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0aGlzLnF1b3J1bSA9IE1hdGguY2VpbCh0aGlzLiNjb25maWdzLnJlZHVjZSgoYWNjdW0sIGNvbmZpZykgPT4ge1xuICAgICAgICAgICAgICAgIGFjY3VtICs9IGNvbmZpZy53ZWlnaHQ7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGFjY3VtO1xuICAgICAgICAgICAgfSwgMCkgLyAyKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmV2ZW50UXVvcnVtID0gMTtcbiAgICAgICAgdGhpcy5ldmVudFdvcmtlcnMgPSAxO1xuICAgICAgICBhc3NlcnRBcmd1bWVudCh0aGlzLnF1b3J1bSA8PSB0aGlzLiNjb25maWdzLnJlZHVjZSgoYSwgYykgPT4gKGEgKyBjLndlaWdodCksIDApLCBcInF1b3J1bSBleGNlZWQgcHJvdmlkZXIgd2VpZ2h0XCIsIFwicXVvcnVtXCIsIHRoaXMucXVvcnVtKTtcbiAgICB9XG4gICAgZ2V0IHByb3ZpZGVyQ29uZmlncygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuI2NvbmZpZ3MubWFwKChjKSA9PiB7XG4gICAgICAgICAgICBjb25zdCByZXN1bHQgPSBPYmplY3QuYXNzaWduKHt9LCBjKTtcbiAgICAgICAgICAgIGZvciAoY29uc3Qga2V5IGluIHJlc3VsdCkge1xuICAgICAgICAgICAgICAgIGlmIChrZXlbMF0gPT09IFwiX1wiKSB7XG4gICAgICAgICAgICAgICAgICAgIGRlbGV0ZSByZXN1bHRba2V5XTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgYXN5bmMgX2RldGVjdE5ldHdvcmsoKSB7XG4gICAgICAgIHJldHVybiBOZXR3b3JrLmZyb20oZ2V0QmlnSW50KGF3YWl0IHRoaXMuX3BlcmZvcm0oeyBtZXRob2Q6IFwiY2hhaW5JZFwiIH0pKSk7XG4gICAgfVxuICAgIC8vIEBUT0RPOiBBZGQgc3VwcG9ydCB0byBzZWxlY3QgcHJvdmlkZXJzIHRvIGJlIHRoZSBldmVudCBzdWJzY3JpYmVyXG4gICAgLy9fZ2V0U3Vic2NyaWJlcihzdWI6IFN1YnNjcmlwdGlvbik6IFN1YnNjcmliZXIge1xuICAgIC8vICAgIHRocm93IG5ldyBFcnJvcihcIkBUT0RPXCIpO1xuICAgIC8vfVxuICAgIC8qKlxuICAgICAqICBUcmFuc2Zvcm1zIGEgJSVyZXElJSBpbnRvIHRoZSBjb3JyZWN0IG1ldGhvZCBjYWxsIG9uICUlcHJvdmlkZXIlJS5cbiAgICAgKi9cbiAgICBhc3luYyBfdHJhbnNsYXRlUGVyZm9ybShwcm92aWRlciwgcmVxKSB7XG4gICAgICAgIHN3aXRjaCAocmVxLm1ldGhvZCkge1xuICAgICAgICAgICAgY2FzZSBcImJyb2FkY2FzdFRyYW5zYWN0aW9uXCI6XG4gICAgICAgICAgICAgICAgcmV0dXJuIGF3YWl0IHByb3ZpZGVyLmJyb2FkY2FzdFRyYW5zYWN0aW9uKHJlcS5zaWduZWRUcmFuc2FjdGlvbik7XG4gICAgICAgICAgICBjYXNlIFwiY2FsbFwiOlxuICAgICAgICAgICAgICAgIHJldHVybiBhd2FpdCBwcm92aWRlci5jYWxsKE9iamVjdC5hc3NpZ24oe30sIHJlcS50cmFuc2FjdGlvbiwgeyBibG9ja1RhZzogcmVxLmJsb2NrVGFnIH0pKTtcbiAgICAgICAgICAgIGNhc2UgXCJjaGFpbklkXCI6XG4gICAgICAgICAgICAgICAgcmV0dXJuIChhd2FpdCBwcm92aWRlci5nZXROZXR3b3JrKCkpLmNoYWluSWQ7XG4gICAgICAgICAgICBjYXNlIFwiZXN0aW1hdGVHYXNcIjpcbiAgICAgICAgICAgICAgICByZXR1cm4gYXdhaXQgcHJvdmlkZXIuZXN0aW1hdGVHYXMocmVxLnRyYW5zYWN0aW9uKTtcbiAgICAgICAgICAgIGNhc2UgXCJnZXRCYWxhbmNlXCI6XG4gICAgICAgICAgICAgICAgcmV0dXJuIGF3YWl0IHByb3ZpZGVyLmdldEJhbGFuY2UocmVxLmFkZHJlc3MsIHJlcS5ibG9ja1RhZyk7XG4gICAgICAgICAgICBjYXNlIFwiZ2V0QmxvY2tcIjoge1xuICAgICAgICAgICAgICAgIGNvbnN0IGJsb2NrID0gKFwiYmxvY2tIYXNoXCIgaW4gcmVxKSA/IHJlcS5ibG9ja0hhc2ggOiByZXEuYmxvY2tUYWc7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGF3YWl0IHByb3ZpZGVyLmdldEJsb2NrKGJsb2NrLCByZXEuaW5jbHVkZVRyYW5zYWN0aW9ucyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXNlIFwiZ2V0QmxvY2tOdW1iZXJcIjpcbiAgICAgICAgICAgICAgICByZXR1cm4gYXdhaXQgcHJvdmlkZXIuZ2V0QmxvY2tOdW1iZXIoKTtcbiAgICAgICAgICAgIGNhc2UgXCJnZXRDb2RlXCI6XG4gICAgICAgICAgICAgICAgcmV0dXJuIGF3YWl0IHByb3ZpZGVyLmdldENvZGUocmVxLmFkZHJlc3MsIHJlcS5ibG9ja1RhZyk7XG4gICAgICAgICAgICBjYXNlIFwiZ2V0R2FzUHJpY2VcIjpcbiAgICAgICAgICAgICAgICByZXR1cm4gKGF3YWl0IHByb3ZpZGVyLmdldEZlZURhdGEoKSkuZ2FzUHJpY2U7XG4gICAgICAgICAgICBjYXNlIFwiZ2V0UHJpb3JpdHlGZWVcIjpcbiAgICAgICAgICAgICAgICByZXR1cm4gKGF3YWl0IHByb3ZpZGVyLmdldEZlZURhdGEoKSkubWF4UHJpb3JpdHlGZWVQZXJHYXM7XG4gICAgICAgICAgICBjYXNlIFwiZ2V0TG9nc1wiOlxuICAgICAgICAgICAgICAgIHJldHVybiBhd2FpdCBwcm92aWRlci5nZXRMb2dzKHJlcS5maWx0ZXIpO1xuICAgICAgICAgICAgY2FzZSBcImdldFN0b3JhZ2VcIjpcbiAgICAgICAgICAgICAgICByZXR1cm4gYXdhaXQgcHJvdmlkZXIuZ2V0U3RvcmFnZShyZXEuYWRkcmVzcywgcmVxLnBvc2l0aW9uLCByZXEuYmxvY2tUYWcpO1xuICAgICAgICAgICAgY2FzZSBcImdldFRyYW5zYWN0aW9uXCI6XG4gICAgICAgICAgICAgICAgcmV0dXJuIGF3YWl0IHByb3ZpZGVyLmdldFRyYW5zYWN0aW9uKHJlcS5oYXNoKTtcbiAgICAgICAgICAgIGNhc2UgXCJnZXRUcmFuc2FjdGlvbkNvdW50XCI6XG4gICAgICAgICAgICAgICAgcmV0dXJuIGF3YWl0IHByb3ZpZGVyLmdldFRyYW5zYWN0aW9uQ291bnQocmVxLmFkZHJlc3MsIHJlcS5ibG9ja1RhZyk7XG4gICAgICAgICAgICBjYXNlIFwiZ2V0VHJhbnNhY3Rpb25SZWNlaXB0XCI6XG4gICAgICAgICAgICAgICAgcmV0dXJuIGF3YWl0IHByb3ZpZGVyLmdldFRyYW5zYWN0aW9uUmVjZWlwdChyZXEuaGFzaCk7XG4gICAgICAgICAgICBjYXNlIFwiZ2V0VHJhbnNhY3Rpb25SZXN1bHRcIjpcbiAgICAgICAgICAgICAgICByZXR1cm4gYXdhaXQgcHJvdmlkZXIuZ2V0VHJhbnNhY3Rpb25SZXN1bHQocmVxLmhhc2gpO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8vIEdyYWIgdGhlIG5leHQgKHJhbmRvbSkgY29uZmlnIHRoYXQgaXMgbm90IGFscmVhZHkgcGFydCBvZlxuICAgIC8vIHRoZSBydW5uaW5nIHNldFxuICAgICNnZXROZXh0Q29uZmlnKHJ1bm5pbmcpIHtcbiAgICAgICAgLy8gQFRPRE86IE1heWJlIGRvIGEgY2hlY2sgaGVyZSB0byBmYXZvdXIgKGhlYXZpbHkpIHByb3ZpZGVycyB0aGF0XG4gICAgICAgIC8vICAgICAgICBkbyBub3QgcmVxdWlyZSB3YWl0Rm9yU3luYyBhbmQgZGlzZmF2b3VyIHByb3ZpZGVycyB0aGF0XG4gICAgICAgIC8vICAgICAgICBzZWVtIGRvd24taXNoIG9yIGFyZSBiZWhhdmluZyBzbG93bHlcbiAgICAgICAgY29uc3QgY29uZmlncyA9IEFycmF5LmZyb20ocnVubmluZykubWFwKChyKSA9PiByLmNvbmZpZyk7XG4gICAgICAgIC8vIFNodWZmbGUgdGhlIHN0YXRlcywgc29ydGVkIGJ5IHByaW9yaXR5XG4gICAgICAgIGNvbnN0IGFsbENvbmZpZ3MgPSB0aGlzLiNjb25maWdzLnNsaWNlKCk7XG4gICAgICAgI
26774HNodWZmbGUoYWxsQ29uZmlncyk7XG4gICAgICAgIGFsbENvbmZpZ3Muc29ydCgoYSwgYikgPT4gKGEucHJpb3JpdHkgLSBiLnByaW9yaXR5KSk7XG4gICAgICAgIGZvciAoY29uc3QgY29uZmlnIG9mIGFsbENvbmZpZ3MpIHtcbiAgICAgICAgICAgIGlmIChjb25maWcuX2xhc3RGYXRhbEVycm9yKSB7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoY29uZmlncy5pbmRleE9mKGNvbmZpZykgPT09IC0xKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGNvbmZpZztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgLy8gQWRkcyBhIG5ldyBydW5uZXIgKGlmIGF2YWlsYWJsZSkgdG8gcnVubmluZy5cbiAgICAjYWRkUnVubmVyKHJ1bm5pbmcsIHJlcSkge1xuICAgICAgICBjb25zdCBjb25maWcgPSB0aGlzLiNnZXROZXh0Q29uZmlnKHJ1bm5pbmcpO1xuICAgICAgICAvLyBObyBydW5uZXJzIGF2YWlsYWJsZVxuICAgICAgICBpZiAoY29uZmlnID09IG51bGwpIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgICAgIC8vIENyZWF0ZSBhIG5ldyBydW5uZXJcbiAgICAgICAgY29uc3QgcnVubmVyID0ge1xuICAgICAgICAgICAgY29uZmlnLCByZXN1bHQ6IG51bGwsIGRpZEJ1bXA6IGZhbHNlLFxuICAgICAgICAgICAgcGVyZm9ybTogbnVsbCwgc3RhbGxlcjogbnVsbFxuICAgICAgICB9O1xuICAgICAgICBjb25zdCBub3cgPSBnZXRUaW1lKCk7XG4gICAgICAgIC8vIFN0YXJ0IHBlcmZvcm1pbmcgdGhpcyBvcGVyYXRpb25cbiAgICAgICAgcnVubmVyLnBlcmZvcm0gPSAoYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBjb25maWcucmVxdWVzdHMrKztcbiAgICAgICAgICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLl90cmFuc2xhdGVQZXJmb3JtKGNvbmZpZy5wcm92aWRlciwgcmVxKTtcbiAgICAgICAgICAgICAgICBydW5uZXIucmVzdWx0ID0geyByZXN1bHQgfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgICAgIGNvbmZpZy5lcnJvclJlc3BvbnNlcysrO1xuICAgICAgICAgICAgICAgIHJ1bm5lci5yZXN1bHQgPSB7IGVycm9yIH07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCBkdCA9IChnZXRUaW1lKCkgLSBub3cpO1xuICAgICAgICAgICAgY29uZmlnLl90b3RhbFRpbWUgKz0gZHQ7XG4gICAgICAgICAgICBjb25maWcucm9sbGluZ0R1cmF0aW9uID0gMC45NSAqIGNvbmZpZy5yb2xsaW5nRHVyYXRpb24gKyAwLjA1ICogZHQ7XG4gICAgICAgICAgICBydW5uZXIucGVyZm9ybSA9IG51bGw7XG4gICAgICAgIH0pKCk7XG4gICAgICAgIC8vIFN0YXJ0IGEgc3RhbGxlcjsgd2hlbiB0aGlzIHRpbWVzIG91dCwgaXQncyB0aW1lIH
26774RvIGZvcmNlXG4gICAgICAgIC8vIGtpY2tpbmcgb2ZmIGFub3RoZXIgcnVubmVyIGJlY2F1c2Ugd2UgYXJlIHRha2luZyB0b28gbG9uZ1xuICAgICAgICBydW5uZXIuc3RhbGxlciA9IChhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICBhd2FpdCBzdGFsbChjb25maWcuc3RhbGxUaW1lb3V0KTtcbiAgICAgICAgICAgIHJ1bm5lci5zdGFsbGVyID0gbnVsbDtcbiAgICAgICAgfSkoKTtcbiAgICAgICAgcnVubmluZy5hZGQocnVubmVyKTtcbiAgICAgICAgcmV0dXJuIHJ1bm5lcjtcbiAgICB9XG4gICAgLy8gSW5pdGlhbGl6ZXMgdGhlIGJsb2NrTnVtYmVyIGFuZCBuZXR3b3JrIGZvciBlYWNoIHJ1bm5lciBhbmRcbiAgICAvLyBibG9ja3MgdW50aWwgaW5pdGlhbGl6ZWRcbiAgICBhc3luYyAjaW5pdGlhbFN5bmMoKSB7XG4gICAgICAgIGxldCBpbml0aWFsU3luYyA9IHRoaXMuI2luaXRpYWxTeW5jUHJvbWlzZTtcbiAgICAgICAgaWYgKCFpbml0aWFsU3luYykge1xuICAgICAgICAgICAgY29uc3QgcHJvbWlzZXMgPSBbXTtcbiAgICAgICAgICAgIHRoaXMuI2NvbmZpZ3MuZm9yRWFjaCgoY29uZmlnKSA9PiB7XG4gICAgICAgICAgICAgICAgcHJvbWlzZXMucHVzaCgoYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBhd2FpdCB3YWl0Rm9yU3luYyhjb25maWcsIDApO1xuICAgICAgICAgICAgICAgICAgICBpZiAoIWNvbmZpZy5fbGFzdEZhdGFsRXJyb3IpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZy5fbmV0d29yayA9IGF3YWl0IGNvbmZpZy5wcm92aWRlci5nZXROZXR3b3JrKCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KSgpKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgdGhpcy4jaW5pdGlhbFN5bmNQcm9taXNlID0gaW5pdGlhbFN5bmMgPSAoYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgICAgIC8vIFdhaXQgZm9yIGFsbCBwcm92aWRlcnMgdG8gaGF2ZSBhIGJsb2NrIG51bWJlciBhbmQgbmV0d29ya1xuICAgICAgICAgICAgICAgIGF3YWl0IFByb21pc2UuYWxsKHByb21pc2VzKTtcbiAgICAgICAgICAgICAgICAvLyBDaGVjayBhbGwgdGhlIG5ldHdvcmtzIG1hdGNoXG4gICAgICAgICAgICAgICAgbGV0IGNoYWluSWQgPSBudWxsO1xuICAgICAgICAgICAgICAgIGZvciAoY29uc3QgY29uZmlnIG9mIHRoaXMuI2NvbmZpZ3MpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGNvbmZpZy5fbGFzdEZhdGFsRXJyb3IpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IG5ldHdvcmsgPSAoY29uZmlnLl9uZXR3b3JrKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGNoYWluSWQgPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY2hhaW5JZCA9IG5ldHdvcmsuY2hhaW5JZDtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChuZXR3b3JrLmNoYWluSWQgIT09IGNoYWluSWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGFzc2VydChmYWxzZSwgXCJjYW5ub3QgbWl4IHByb3ZpZGVycyBvbiBkaWZmZXJlbnQgbmV0d29ya3NcIiwgXCJVTlNVUFBPUlRFRF9PUEVSQVRJT05cIiwge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wZXJhdGlvbjogXCJuZXcgRmFsbGJhY2tQcm92aWRlclwiXG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pKCk7XG4gICAgICAgIH1cbiAgICAgICAgYXdhaXQgaW5pdGlhbFN5bmM7XG4gICAgfVxuICAgIGFzeW5jICNjaGVja1F1b3J1bShydW5uaW5nLCByZXEpIHtcbiAgICAgICAgLy8gR2V0IGFsbCB0aGUgcmVzdWx0IG9iamVjdHNcbiAgICAgICAgY29uc3QgcmVzdWx0cyA9IFtdO1xuICAgICAgICBmb3IgKGNvbnN0IHJ1bm5lciBvZiBydW5uaW5nKSB7XG4gICAgICAgICAgICBpZiAocnVubmVyLnJlc3VsdCAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgeyB0YWcsIHZhbHVlIH0gPSBub3JtYWxpemVSZXN1bHQocmVxLm1ldGhvZCwgcnVubmVyLnJlc3VsdCk7XG4gICAgICAgICAgICAgICAgcmVzdWx0cy5wdXNoKHsgdGFnLCB2YWx1ZSwgd2VpZ2h0OiBydW5uZXIuY29uZmlnLndlaWdodCB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAvLyBBcmUgdGhlcmUgZW5vdWdoIHJlc3VsdHMgdG8gZXZlbnQgbWVldCBxdW9ydW0/XG4gICAgICAgIGlmIChyZXN1bHRzLnJlZHVjZSgoYSwgcikgPT4gKGEgKyByLndlaWdodCksIDApIDwgdGhpcy5xdW9ydW0pIHtcbiAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgIH1cbiAgICAgICAgc3dpdGNoIChyZXEubWV0aG9kKSB7XG4gICAgICAgICAgICBjYXNlIFwiZ2V0QmxvY2tOdW1iZXJcIjoge1xuICAgICAgICAgICAgICAgIC8vIFdlIG5lZWQgdG8gZ2V0IHRoZSBib290c3RyYXAgYmxvY2sgaGVpZ2h0XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuI2hlaWdodCA9PT0gLTIpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy4jaGVpZ2h0ID0gTWF0aC5jZWlsKGdldE51bWJlcihnZXRNZWRpYW4odGhpcy5xdW9ydW0sIHRoaXMuI2NvbmZpZ3MuZmlsdGVyKChjKSA9PiAoIWMuX2xhc3RGYXRhbEVycm9yKSkubWFwKChjKSA9PiAoe1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6IGMuYmxvY2tOdW1iZXIsXG4gICAgICAgICAgICAgICAgICAgICAgICB0YWc6IGdldE51bWJlcihjLmJsb2NrTnVtYmVyKS50b1N0cmluZygpLFxuICAgICAgICAgICAgICAgICAgICAgICAgd2VpZ2h0OiBjLndlaWdodFxuICAgICAgICAgICAgICAgICAgICB9KSkpKSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIC8vIEZpbmQgdGhlIG1vZGUgYWNyb3NzIGFsbCB0aGUgcHJvdmlkZXJzLCBhbGxvd2luZyBmb3JcbiAgICAgICAgICAgICAgICAvLyBhIGxpdHRsZSBkcmlmdCBiZXR3ZWVuIGJsb2NrIGhlaWdodHNcbiAgICAgICAgICAgICAgICBjb25zdCBtb2RlID0gZ2V0RnV6enlNb2RlKHRoaXMucXVvcnVtLCByZXN1bHRzKTtcbiAgICAgICAgICAgICAgICBpZiAobW9kZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgICAgI
26774HJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChtb2RlID4gdGhpcy4jaGVpZ2h0KSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuI2hlaWdodCA9IG1vZGU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLiNoZWlnaHQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXNlIFwiZ2V0R2FzUHJpY2VcIjpcbiAgICAgICAgICAgIGNhc2UgXCJnZXRQcmlvcml0eUZlZVwiOlxuICAgICAgICAgICAgY2FzZSBcImVzdGltYXRlR2FzXCI6XG4gICAgICAgICAgICAgICAgcmV0dXJuIGdldE1lZGlhbih0aGlzLnF1b3J1bSwgcmVzdWx0cyk7XG4gICAgICAgICAgICBjYXNlIFwiZ2V0QmxvY2tcIjpcbiAgICAgICAgICAgICAgICAvLyBQZW5kaW5nIGJsb2NrcyBhcmUgaW4gdGhlIG1lbXBvb2wgYW5kIGFscmVhZHlcbiAgICAgICAgICAgICAgICAvLyBxdWl0ZSB1bnRydXN0d29ydGh5OyBqdXN0IGdyYWIgYW55dGhpbmdcbiAgICAgICAgICAgICAgICBpZiAoXCJibG9ja1RhZ1wiIGluIHJlcSAmJiByZXEuYmxvY2tUYWcgPT09IFwicGVuZGluZ1wiKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBnZXRBbnlSZXN1bHQodGhpcy5xdW9ydW0sIHJlc3VsdHMpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gY2hlY2tRdW9ydW0odGhpcy5xdW9ydW0sIHJlc3VsdHMpO1xuICAgICAgICAgICAgY2FzZSBcImNhbGxcIjpcbiAgICAgICAgICAgIGNhc2UgXCJjaGFpbklkXCI6XG4gICAgICAgICAgICBjYXNlIFwiZ2V0QmFsYW5jZVwiOlxuICAgICAgICAgICAgY2FzZSBcImdldFRyYW5zYWN0aW9uQ291bnRcIjpcbiAgICAgICAgICAgIGNhc2UgXCJnZXRDb2RlXCI6XG4gICAgICAgICAgICBjYXNlIFwiZ2V0U3RvcmFnZVwiOlxuICAgICAgICAgICAgY2FzZSBcImdldFRyYW5zYWN0aW9uXCI6XG4gICAgICAgICAgICBjYXNlIFwiZ2V0VHJhbnNhY3Rpb25SZWNlaXB0XCI6XG4gICAgICAgICAgICBjYXNlIFwiZ2V0TG9nc1wiOlxuICAgICAgICAgICAgICAgIHJldHVybiBjaGVja1F1b3J1bSh0aGlzLnF1b3J1bSwgcmVzdWx0cyk7XG4gICAgICAgICAgICBjYXNlIFwiYnJvYWRjYXN0VHJhbnNhY3Rpb25cIjpcbiAgICAgICAgICAgICAgICByZXR1cm4gZ2V0QW55UmVzdWx0KHRoaXMucXVvcnVtLCByZXN1bHRzKTtcbiAgICAgICAgfVxuICAgICAgICBhc3NlcnQoZmFsc2UsIFwidW5zdXBwb3J0ZWQgbWV0aG9kXCIsIFwiVU5TVVBQT1JURURfT1BFUkFUSU9OXCIsIHtcbiAgICAgICAgICAgIG9wZXJhdGlvbjogYF9wZXJmb3JtKCR7c3RyaW5naWZ5KHJlcS5tZXRob2QpfSlgXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBhc3luYyAjd2FpdEZvclF1b3J1bShydW5uaW5nLCByZXEpIHtcbiAgICAgICAgaWYgKHJ1bm5pbmcuc2l6ZSA9PT0gMCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwibm8gcnVubmVycz8hXCIpO1xuICAgICAgICB9XG4gICAgICAgIC8vIEFueSBwcm9taXNlcyB0aGF0IGFyZSBpbnRlcmVzdGluZyB0byB3YXRjaCBmb3I7IGFuIGV4cGlyZWQgc3RhbGxcbiAgICAgICAgLy8gb3IgYSBzdWNjZXNzZnVsIHBlcmZvcm1cbiAgICAgICAgY29uc3QgaW50ZXJlc3RpbmcgPSBbXTtcbiAgICAgICAgbGV0IG5ld1J1bm5lcnMgPSAwO1xuICAgICAgICBmb3IgKGNvbnN0IHJ1bm5lciBvZiBydW5uaW5nKSB7XG4gICAgICAgICAgICAvLyBObyByZXNwb25zZXMsIHlldDsga2VlcCBhbiBleWUgb24gaXRcbiAgICAgICAgICAgIGlmIChydW5uZXIucGVyZm9ybSkge1xuICAgICAgICAgICAgICAgIGludGVyZXN0aW5nLnB1c2gocnVubmVyLnBlcmZvcm0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gU3RpbGwgc3RhbGxpbmcuLi5cbiAgICAgICAgICAgIGlmIChydW5uZXIuc3RhbGxlcikge1xuICAgICAgICAgICAgICAgIGludGVyZXN0aW5nLnB1c2gocnVubmVyLnN0YWxsZXIpO1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gVGhpcyBydW5uZXIgaGFzIGFscmVhZHkgdHJpZ2dlcmVkIGFub3RoZXIgcnVubmVyXG4gICAgICAgICAgICBpZiAocnVubmVyLmRpZEJ1bXApIHtcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIEdvdCBhIHJlc3BvbnNlIChyZXN1bHQgb3IgZXJyb3IpIG9yIHN0YWxsZWQ7IGtpY2sgb2ZmIGFub3RoZXIgcnVubmVyXG4gICAgICAgICAgICBydW5uZXIuZGlkQnVtcCA9IHRydWU7XG4gICAgICAgICAgICBuZXdSdW5uZXJzKys7XG4gICAgICAgIH1cbiAgICAgICAgLy8gQ2hlY2sgaWYgd2UgaGF2ZSByZWFjaGVkIHF1b3J1bSBvbiBhIHJlc3VsdCAob3IgZXJyb3IpXG4gICAgICAgIGNvbnN0IHZhbHVlID0gYXdhaXQgdGhpcy4jY2hlY2tRdW9ydW0ocnVubmluZywgcmVxKTtcbiAgICAgICAgaWYgKHZhbHVlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgdmFsdWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgICAgIH1cbiAgICAgICAgLy8gQWRkIGFueSBuZXcgcnVubmVycywgYmVjYXVzZSBhIHN0YWxsZXIgdGltZWQgb3V0IG9yIGEgcmVzdWx0XG4gICAgICAgIC8vIG9yIGVycm9yIHJlc3BvbnNlIGNhbWUgaW4uXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbmV3UnVubmVyczsgaSsrKSB7XG4gICAgICAgICAgICB0aGlzLiNhZGRSdW5uZXIocnVubmluZywgcmVxKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBBbGwgcHJvdmlkZXJzIGhhdmUgcmV0dXJuZWQsIGFuZCB3ZSBoYXZlIG5vIHJlc3VsdFxuICAgICAgICBhc3NlcnQoaW50ZXJlc3RpbmcubGVuZ3RoID4gMCwgXCJxdW9ydW0gbm90IG1ldFwiLCBcIlNFUlZFUl9FUlJPUlwiLCB7XG4gICAgICAgICAgICByZXF1ZXN0OiBcIiVzdWItcmVxdWVzdHNcIixcbiAgICAgICAgICAgIGluZm86IHsgcmVxdWVzdDogcmVxLCByZXN1bHRzOiBBcnJheS5mcm9tKHJ1bm5pbmcpLm1hcCgocikgPT4gc3RyaW5naWZ5KHIucmVzdWx0KSkgfVxuICAgICAgICB9KTtcbiAgICAgICAgLy8gV2FpdCBmb3Igc29tZW9uZSB0byBlaXRoZXIgY29tcGxldGUgaXRzIHBlcmZvcm0gb3Igc3RhbGwgb3V0XG4gICAgICAgIGF3YWl0IFByb21pc2UucmFjZShpbnRlcmVzdGluZyk7XG4gICAgICAgIC8vIFRoaXMgaXMgcmVjdXJzaXZlLCBidXQgYXQgd29yc3QgY2FzZSB0aGUgZGVwdGggaXMgMnggdGhlXG4gICAgICAgIC8vIG51bWJlciBvZiBwcm92aWRlcnMgKG
26774VhY2ggaGFzIGEgcGVyZm9ybSBhbmQgYSBzdGFsbGVyKVxuICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy4jd2FpdEZvclF1b3J1bShydW5uaW5nLCByZXEpO1xuICAgIH1cbiAgICBhc3luYyBfcGVyZm9ybShyZXEpIHtcbiAgICAgICAgLy8gQnJvYWRjYXN0aW5nIGEgdHJhbnNhY3Rpb24gaXMgcmFyZSAoaXNoKSBhbmQgYWxyZWFkeSBpbmN1cnNcbiAgICAgICAgLy8gYSBjb3N0IG9uIHRoZSB1c2VyLCBzbyBzcGFtbWluZyBpcyBzYWZlLWlzaC4gSnVzdCBzZW5kIGl0IHRvXG4gICAgICAgIC8vIGV2ZXJ5IGJhY2tlbmQuXG4gICAgICAgIGlmIChyZXEubWV0aG9kID09PSBcImJyb2FkY2FzdFRyYW5zYWN0aW9uXCIpIHtcbiAgICAgICAgICAgIC8vIE9uY2UgYW55IGJyb2FkY2FzdCBwcm92aWRlcyBhIHBvc2l0aXZlIHJlc3VsdCwgdXNlIGl0LiBOb1xuICAgICAgICAgICAgLy8gbmVlZCB0byB3YWl0IGZvciBhbnlvbmUgZWxzZVxuICAgICAgICAgICAgY29uc3QgcmVzdWx0cyA9IHRoaXMuI2NvbmZpZ3MubWFwKChjKSA9PiBudWxsKTtcbiAgICAgICAgICAgIGNvbnN0IGJyb2FkY2FzdHMgPSB0aGlzLiNjb25maWdzLm1hcChhc3luYyAoeyBwcm92aWRlciwgd2VpZ2h0IH0sIGluZGV4KSA9PiB7XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgcHJvdmlkZXIuX3BlcmZvcm0ocmVxKTtcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0c1tpbmRleF0gPSBPYmplY3QuYXNzaWduKG5vcm1hbGl6ZVJlc3VsdChyZXEubWV0aG9kLCB7IHJlc3VsdCB9KSwgeyB3ZWlnaHQgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgICAgICAgICByZXN1bHRzW2luZGV4XSA9IE9iamVjdC5hc3NpZ24obm9ybWFsaXplUmVzdWx0KHJlcS5tZXRob2QsIHsgZXJyb3IgfSksIHsgd2VpZ2h0IH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgLy8gQXMgZWFjaCBwcm9taXNlIGZpbmlzaGVzLi4uXG4gICAgICAgICAgICB3aGlsZSAodHJ1ZSkge1xuICAgICAgICAgICAgICAgIC8vIENoZWNrIGZvciBhIHZhbGlkIGJyb2FkY2FzdCByZXN1bHRcbiAgICAgICAgICAgICAgICBjb25zdCBkb25lID0gcmVzdWx0cy5maWx0ZXIoKHIpID0+IChyICE9IG51bGwpKTtcbiAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IHsgdmFsdWUgfSBvZiBkb25lKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICghKHZhbHVlIGluc3RhbmNlb2YgRXJyb3IpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgLy8gQ2hlY2sgZm9yIGEgbGVnaXQgYnJvYWRjYXN0IGVycm9yIChvbmUgd2hpY2ggd2UgY2Fubm90XG4gICAgICAgICAgICAgICAgLy8gcmVjb3ZlciBmcm9tOyBzb21lIG5vZGVzIG1heSByZXR1cm4gdGhlIGZvbGxvd2luZyByZWRcbiAgICAgICAgICAgICAgICAvLyBoZXJyaW5nIGV2ZW50czpcbiAgICAgICAgICAgICAgICAvLyAtIGFscmVkeSBzZWVuZCAoVU5LTk9XTl9FUlJPUilcbiAgICAgICAgICAgICAgICAvLyAtIE5PTkNFX0VYUElSRURcbiAgICAgICAgICAgICAgICAvLyAtIFJFUExBQ0VNRU5UX1VOREVSUFJJQ0VEXG4gICAgICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gY2hlY2tRdW9ydW0odGhpcy5xdW9ydW0sIHJlc3VsdHMuZmlsdGVyKChyKSA9PiAociAhPSBudWxsKSkpO1xuICAgICAgICAgICAgICAgIGlmIChpc0Vycm9yKHJlc3VsdCwgXCJJTlNVRkZJQ0lFTlRfRlVORFNcIikpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgcmVzdWx0O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAvLyBLaWNrIG9mZiB0aGUgbmV4dCBwcm92aWRlciAoaWYgYW55KVxuICAgICAgICAgICAgICAgIGNvbnN0IHdhaXRpbmcgPSBicm9hZGNhc3RzLmZpbHRlcigoYiwgaSkgPT4gKHJlc3VsdHNbaV0gPT0gbnVsbCkpO1xuICAgICAgICAgICAgICAgIGlmICh3YWl0aW5nLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgYXdhaXQgUHJvbWlzZS5yYWNlKHdhaXRpbmcpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gVXNlIHN0YW5kYXJkIHF1b3J1bSByZXN1bHRzOyBhbnkgcmVzdWx0IHdhcyByZXR1cm5lZCBhYm92ZSxcbiAgICAgICAgICAgIC8vIHNvIHRoaXMgd2lsbCBmaW5kIGFueSBlcnJvciB0aGF0IG1ldCBxdW9ydW0gaWYgYW55XG4gICAgICAgICAgICBjb25zdCByZXN1bHQgPSBnZXRBbnlSZXN1bHQodGhpcy5xdW9ydW0sIHJlc3VsdHMpO1xuICAgICAgICAgICAgYXNzZXJ0KHJlc3VsdCAhPT0gdW5kZWZpbmVkLCBcInByb2JsZW0gbXVsdGktYnJvYWRjYXN0aW5nXCIsIFwiU0VSVkVSX0VSUk9SXCIsIHtcbiAgICAgICAgICAgICAgICByZXF1ZXN0OiBcIiVzdWItcmVxdWVzdHNcIixcbiAgICAgICAgICAgICAgICBpbmZvOiB7IHJlcXVlc3Q6IHJlcSwgcmVzdWx0czogcmVzdWx0cy5tYXAoc3RyaW5naWZ5KSB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGlmIChyZXN1bHQgaW5zdGFuY2VvZiBFcnJvcikge1xuICAgICAgICAgICAgICAgIHRocm93IHJlc3VsdDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgIH1cbiAgICAgICAgYXdhaXQgdGhpcy4jaW5pdGlhbFN5bmMoKTtcbiAgICAgICAgLy8gQm9vdHN0cmFwIGVub3VnaCBydW5uZXJzIHRvIG1lZXQgcXVvcnVtXG4gICAgICAgIGNvbnN0IHJ1bm5pbmcgPSBuZXcgU2V0KCk7XG4gICAgICAgIGxldCBpbmZsaWdodFF1b3J1bSA9IDA7XG4gICAgICAgIHdoaWxlICh0cnVlKSB7XG4gICAgICAgICAgICBjb25zdCBydW5uZXIgPSB0aGlzLiNhZGRSdW5uZXIocnVubmluZywgcmVxKTtcbiAgICAgICAgICAgIGlmIChydW5uZXIgPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaW5mbGlnaHRRdW9ydW0gKz0gcnVubmVyLmNvbmZpZy53ZWlnaHQ7XG4gICAgICAgICAgICBpZiAoaW5mbGlnaHRRdW9ydW0gPj0gdGh
26774pcy5xdW9ydW0pIHtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLiN3YWl0Rm9yUXVvcnVtKHJ1bm5pbmcsIHJlcSk7XG4gICAgICAgIC8vIFRyYWNrIHJlcXVlc3RzIHNlbnQgdG8gYSBwcm92aWRlciB0aGF0IGFyZSBzdGlsbFxuICAgICAgICAvLyBvdXRzdGFuZGluZyBhZnRlciBxdW9ydW0gaGFzIGJlZW4gb3RoZXJ3aXNlIGZvdW5kXG4gICAgICAgIGZvciAoY29uc3QgcnVubmVyIG9mIHJ1bm5pbmcpIHtcbiAgICAgICAgICAgIGlmIChydW5uZXIucGVyZm9ybSAmJiBydW5uZXIucmVzdWx0ID09IG51bGwpIHtcbiAgICAgICAgICAgICAgICBydW5uZXIuY29uZmlnLmxhdGVSZXNwb25zZXMrKztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbiAgICBhc3luYyBkZXN0cm95KCkge1xuICAgICAgICBmb3IgKGNvbnN0IHsgcHJvdmlkZXIgfSBvZiB0aGlzLiNjb25maWdzKSB7XG4gICAgICAgICAgICBwcm92aWRlci5kZXN0cm95KCk7XG4gICAgICAgIH1cbiAgICAgICAgc3VwZXIuZGVzdHJveSgpO1xuICAgIH1cbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXByb3ZpZGVyLWZhbGxiYWNrLmpzLm1hcCIsImltcG9ydCB7IGFzc2VydCB9IGZyb20gXCIuLi91dGlscy9pbmRleC5qc1wiO1xuaW1wb3J0IHsgQW5rclByb3ZpZGVyIH0gZnJvbSBcIi4vcHJvdmlkZXItYW5rci5qc1wiO1xuaW1wb3J0IHsgQWxjaGVteVByb3ZpZGVyIH0gZnJvbSBcIi4vcHJvdmlkZXItYWxjaGVteS5qc1wiO1xuLy9pbXBvcnQgeyBCbG9ja3Njb3V0UHJvdmlkZXIgfSBmcm9tIFwiLi9wcm92aWRlci1ibG9ja3Njb3V0LmpzXCI7XG5pbXBvcnQgeyBDaGFpbnN0YWNrUHJvdmlkZXIgfSBmcm9tIFwiLi9wcm92aWRlci1jaGFpbnN0YWNrLmpzXCI7XG5pbXBvcnQgeyBDbG91ZGZsYXJlUHJvdmlkZXIgfSBmcm9tIFwiLi9wcm92aWRlci1jbG91ZGZsYXJlLmpzXCI7XG5pbXBvcnQgeyBFdGhlcnNjYW5Qcm92aWRlciB9IGZyb20gXCIuL3Byb3ZpZGVyLWV0aGVyc2Nhbi5qc1wiO1xuaW1wb3J0IHsgSW5mdXJhUHJvdmlkZXIgfSBmcm9tIFwiLi9wcm92aWRlci1pbmZ1cmEuanNcIjtcbi8vaW1wb3J0IHsgUG9ja2V0UHJvdmlkZXIgfSBmcm9tIFwiLi9wcm92aWRlci1wb2NrZXQuanNcIjtcbmltcG9ydCB7IFF1aWNrTm9kZVByb3ZpZGVyIH0gZnJvbSBcIi4vcHJvdmlkZXItcXVpY2tub2RlLmpzXCI7XG5pbXBvcnQgeyBGYWxsYmFja1Byb3ZpZGVyIH0gZnJvbSBcIi4vcHJvdmlkZXItZmFsbGJhY2suanNcIjtcbmltcG9ydCB7IEpzb25ScGNQcm92aWRlciB9IGZyb20gXCIuL3Byb3ZpZGVyLWpzb25ycGMuanNcIjtcbmltcG9ydCB7IE5ldHdvcmsgfSBmcm9tIFwiLi9uZXR3b3JrLmpzXCI7XG5pbXBvcnQgeyBXZWJTb2NrZXRQcm92aWRlciB9IGZyb20gXCIuL3Byb3ZpZGVyLXdlYnNvY2tldC5qc1wiO1xuZnVuY3Rpb24gaXNXZWJTb2NrZXRMaWtlKHZhbHVlKSB7XG4gICAgcmV0dXJuICh2YWx1ZSAmJiB0eXBlb2YgKHZhbHVlLnNlbmQpID09PSBcImZ1bmN0aW9uXCIgJiZcbiAgICAgICAgdHlwZW9mICh2YWx1ZS5jbG9zZSkgPT09IFwiZnVuY3Rpb25cIik7XG59XG5jb25zdCBUZXN0bmV0cyA9IFwiZ29lcmxpIGtvdmFuIHNlcG9saWEgY2xhc3NpY0tvdHRpIG9wdGltaXNtLWdvZXJsaSBhcmJpdHJ1bS1nb2VybGkgbWF0aWMtbXVtYmFpIGJuYnRcIi5zcGxpdChcIiBcIik7XG4vKipcbiAqICBSZXR1cm5zIGEgZGVmYXVsdCBwcm92aWRlciBmb3IgJSVuZXR3b3JrJSUuXG4gKlxuICogIElmICUlbmV0d29yayUlIGlzIGEgW1tXZWJTb2NrZXRMaWtlXV0gb3Igc3RyaW5nIHRoYXQgYmVnaW5zIHdpdGhcbiAqICBgYFwid3M6XCJgYCBvciBgYFwid3NzOlwiYGAsIGEgW1tXZWJTb2NrZXRQcm92aWRlcl1dIGlzIHJldHVybmVkIGJhY2tlZFxuICogIGJ5IHRoYXQgV2ViU29ja2V0IG9yIFVSTC5cbiAqXG4gKiAgSWYgJSVuZXR3b3JrJSUgaXMgYSBzdHJpbmcgdGhhdCBiZWdpbnMgd2l0aCBgYFwiSFRUUDpcImBgIG9yIGBgXCJIVFRQUzpcImBgLFxuICogIGEgW1tKc29uUnBjUHJvdmlkZXJdXSBpcyByZXR1cm5lZCBjb25uZWN0ZWQgdG8gdGhhdCBVUkwuXG4gKlxuICogIE90aGVyd2lzZSwgYSBkZWZhdWx0IHByb3ZpZGVyIGlzIGNyZWF0ZWQgYmFja2VkIGJ5IHdlbGwta25vd24gcHVibGljXG4gKiAgV2ViMyBiYWNrZW5kcyAoc3VjaCBhcyBbW2xpbmstaW5mdXJhXV0pIHVzaW5nIGNvbW11bml0eS1wcm92aWRlZCBBUElcbiAqICBrZXlzLlxuICpcbiAqICBUaGUgJSVvcHRpb25zJSUgYWxsb3dzIHNwZWNpZnlpbmcgY3VzdG9tIEFQSSBrZXlzIHBlciBiYWNrZW5kIChzZXR0aW5nXG4gKiAgYW4gQVBJIGtleSB0byBgYFwiLVwiYGAgd2lsbCBvbWl0IHRoYXQgcHJvdmlkZXIpIGFuZCBgYG9wdGlvbnMuZXhjbHVzaXZlYGBcbiAqICBjYW4gYmUgc2V0IHRvIGVpdGhlciBhIGJhY2tlbmQgbmFtZSBvciBhbmQgYXJyYXkgb2YgYmFja2VuZCBuYW1lcywgd2hpY2hcbiAqICB3aWxsIHdoaXRlbGlzdCAqKm9ubHkqKiB0aG9zZSBiYWNrZW5kcy5cbiAqXG4gKiAgQ3VycmVudCBiYWNrZW5kIHN0cmluZ3Mgc3VwcG9ydGVkIGFyZTpcbiAqICAtIGBgXCJhbGNoZW15XCJgYFxuICogIC0gYGBcImFua3JcImBgXG4gKiAgLSBgYFwiY2xvdWRmbGFyZVwiYGBcbiAqICAtIGBgXCJjaGFpbnN0YWNrXCJgYFxuICogIC0gYGBcImV0aGVyc2NhblwiYGBcbiAqICAtIGBgXCJpbmZ1cmFcImBgXG4gKiAgLSBgYFwicHVibGljUG9seWdvblwiYGBcbiAqICAtIGBgXCJxdWlja25vZGVcImBgXG4gKlxuICogIEBleGFtcGxlOlxuICogICAgLy8gQ29ubmVjdCB0byBhIGxvY2FsIEdldGggbm9kZVxuICogICAgcHJvdmlkZXIgPSBnZXREZWZhdWx0UHJvdmlkZXIoXCJodHRwOi8vbG9jYWxob3N0Ojg1NDUvXCIpO1xuICpcbiAqICAgIC8vIENvbm5lY3QgdG8gRXRoZXJldW0gbWFpbm5ldCB3aXRoIGFueSBjdXJyZW50IGFuZCBmdXR1cmVcbiAqICAgIC8vIHRoaXJkLXBhcnR5IHNlcnZpY2VzIGF2YWlsYWJsZVxuICogICAgcHJvdmlkZXIgPSBnZXREZWZhdWx0UHJvdmlkZXIoXCJtYWlubmV0XCIpO1xuICpcbiAqICAgIC8vIENvbm5lY3QgdG8gUG9seWdvbiwgYnV0IG9ubHkgYWxsb3cgRXRoZXJzY2FuIGFuZFxuICogICAgLy8gSU5GVVJBIGFuZCB1c2UgXCJNWV9BUElfS0VZXCIgaW4gY2FsbHMgdG8gRXRoZXJzY2FuLlxuICogICAgcHJvdmlkZXIgPSBnZXREZWZhdWx0UHJvdmlkZXIoXCJtYXRpY1wiLCB7XG4gKiAgICAgIGV0aGVyc2NhbjogXCJNWV9BUElfS0VZXCIsXG4gKiAgICAgIGV4Y2x1c2l2ZTogWyBcImV0aGVyc2NhblwiLCBcImluZnVyYVwiIF1cbiAqICAgIH0pO1xuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0RGVmYXVsdFByb3ZpZGVyKG5ldHdvcmssIG9wdGlvbnMpIHtcbiAgICBpZiAob3B0aW9ucyA9PSBudWxsKSB7XG4gICAgICAgIG9wdGlvbnMgPSB7fTtcbiAgICB9XG4gICAgY29uc3QgYWxsb3dTZXJ2aWNlID0gKG5hbWUpID0+IHtcbiAgICAgICAgaWYgKG9wdGlvbnNbbmFtZV0gPT09IFwiLVwiKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgI
26774H1cbiAgICAgICAgaWYgKHR5cGVvZiAob3B0aW9ucy5leGNsdXNpdmUpID09PSBcInN0cmluZ1wiKSB7XG4gICAgICAgICAgICByZXR1cm4gKG5hbWUgPT09IG9wdGlvbnMuZXhjbHVzaXZlKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShvcHRpb25zLmV4Y2x1c2l2ZSkpIHtcbiAgICAgICAgICAgIHJldHVybiAob3B0aW9ucy5leGNsdXNpdmUuaW5kZXhPZihuYW1lKSAhPT0gLTEpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH07XG4gICAgaWYgKHR5cGVvZiAobmV0d29yaykgPT09IFwic3RyaW5nXCIgJiYgbmV0d29yay5tYXRjaCgvXmh0dHBzPzovKSkge1xuICAgICAgICByZXR1cm4gbmV3IEpzb25ScGNQcm92aWRlcihuZXR3b3JrKTtcbiAgICB9XG4gICAgaWYgKHR5cGVvZiAobmV0d29yaykgPT09IFwic3RyaW5nXCIgJiYgbmV0d29yay5tYXRjaCgvXndzcz86LykgfHwgaXNXZWJTb2NrZXRMaWtlKG5ldHdvcmspKSB7XG4gICAgICAgIHJldHVybiBuZXcgV2ViU29ja2V0UHJvdmlkZXIobmV0d29yayk7XG4gICAgfVxuICAgIC8vIEdldCB0aGUgbmV0d29yayBhbmQgbmFtZSwgaWYgcG9zc2libGVcbiAgICBsZXQgc3RhdGljTmV0d29yayA9IG51bGw7XG4gICAgdHJ5IHtcbiAgICAgICAgc3RhdGljTmV0d29yayA9IE5ldHdvcmsuZnJvbShuZXR3b3JrKTtcbiAgICB9XG4gICAgY2F0Y2ggKGVycm9yKSB7IH1cbiAgICBjb25zdCBwcm92aWRlcnMgPSBbXTtcbiAgICBpZiAoYWxsb3dTZXJ2aWNlKFwicHVibGljUG9seWdvblwiKSAmJiBzdGF0aWNOZXR3b3JrKSB7XG4gICAgICAgIGlmIChzdGF0aWNOZXR3b3JrLm5hbWUgPT09IFwibWF0aWNcIikge1xuICAgICAgICAgICAgcHJvdmlkZXJzLnB1c2gobmV3IEpzb25ScGNQcm92aWRlcihcImh0dHBzOi9cXC9wb2x5Z29uLXJwYy5jb20vXCIsIHN0YXRpY05ldHdvcmssIHsgc3RhdGljTmV0d29yayB9KSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoc3RhdGljTmV0d29yay5uYW1lID09PSBcIm1hdGljLWFtb3lcIikge1xuICAgICAgICAgICAgcHJvdmlkZXJzLnB1c2gobmV3IEpzb25ScGNQcm92aWRlcihcImh0dHBzOi9cXC9ycGMtYW1veS5wb2x5Z29uLnRlY2hub2xvZ3kvXCIsIHN0YXRpY05ldHdvcmssIHsgc3RhdGljTmV0d29yayB9KSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgaWYgKGFsbG93U2VydmljZShcImFsY2hlbXlcIikpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHByb3ZpZGVycy5wdXNoKG5ldyBBbGNoZW15UHJvdmlkZXIobmV0d29yaywgb3B0aW9ucy5hbGNoZW15KSk7XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKGVycm9yKSB7IH1cbiAgICB9XG4gICAgaWYgKGFsbG93U2VydmljZShcImFua3JcIikgJiYgb3B0aW9ucy5hbmtyICE9IG51bGwpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHByb3ZpZGVycy5wdXNoKG5ldyBBbmtyUHJvdmlkZXIobmV0d29yaywgb3B0aW9ucy5hbmtyKSk7XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKGVycm9yKSB7IH1cbiAgICB9XG4gICAgLyogVGVtcG9yYXJpbHkgcmVtb3ZlIHVudGlsIGN1c3RvbSBlcnJvciBpc3N1ZSBpcyBmaXhlZFxuICAgICAgICBpZiAoYWxsb3dTZXJ2aWNlKFwiYmxvY2tzY291dFwiKSkge1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBwcm92aWRlcnMucHVzaChuZXcgQmxvY2tzY291dFByb3ZpZGVyKG5ldHdvcmssIG9wdGlvbnMuYmxvY2tzY291dCkpO1xuICAgICAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHsgfVxuICAgICAgICB9XG4gICAgKi9cbiAgICBpZiAoYWxsb3dTZXJ2aWNlKFwiY2hhaW5zdGFja1wiKSkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgcHJvdmlkZXJzLnB1c2gobmV3IENoYWluc3RhY2tQcm92aWRlcihuZXR3b3JrLCBvcHRpb25zLmNoYWluc3RhY2spKTtcbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZXJyb3IpIHsgfVxuICAgIH1cbiAgICBpZiAoYWxsb3dTZXJ2aWNlKFwiY2xvdWRmbGFyZVwiKSkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgcHJvdmlkZXJzLnB1c2gobmV3IENsb3VkZmxhcmVQcm92aWRlcihuZXR3b3JrKSk7XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKGVycm9yKSB7IH1cbiAgICB9XG4gICAgaWYgKGFsbG93U2VydmljZShcImV0aGVyc2NhblwiKSkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgcHJvdmlkZXJzLnB1c2gobmV3IEV0aGVyc2NhblByb3ZpZGVyKG5ldHdvcmssIG9wdGlvbnMuZXRoZXJzY2FuKSk7XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKGVycm9yKSB7IH1cbiAgICB9XG4gICAgaWYgKGFsbG93U2VydmljZShcImluZnVyYVwiKSkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgbGV0IHByb2plY3RJZCA9IG9wdGlvbnMuaW5mdXJhO1xuICAgICAgICAgICAgbGV0IHByb2plY3RTZWNyZXQgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICBpZiAodHlwZW9mIChwcm9qZWN0SWQpID09PSBcIm9iamVjdFwiKSB7XG4gICAgICAgICAgICAgICAgcHJvamVjdFNlY3JldCA9IHByb2plY3RJZC5wcm9qZWN0U2VjcmV0O1xuICAgICAgICAgICAgICAgIHByb2plY3RJZCA9IHByb2plY3RJZC5wcm9qZWN0SWQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBwcm92aWRlcnMucHVzaChuZXcgSW5mdXJhUHJvdmlkZXIobmV0d29yaywgcHJvamVjdElkLCBwcm9qZWN0U2VjcmV0KSk7XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKGVycm9yKSB7IH1cbiAgICB9XG4gICAgLypcbiAgICAgICAgaWYgKG9wdGlvbnMucG9ja2V0ICE9PSBcIi1cIikge1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBsZXQgYXBwSWQgPSBvcHRpb25zLnBvY2tldDtcbiAgICAgICAgICAgICAgICBsZXQgc2VjcmV0S2V5OiB1bmRlZmluZWQgfCBzdHJpbmcgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgbGV0IGxvYWRCYWxhbmNlcjogdW5kZWZpbmVkIHwgYm9vbGVhbiA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mKGFwcElkKSA9PT0gXCJvYmplY3RcIikge1xuICAgICAgICAgICAgICAgICAgICBsb2FkQmFsYW5jZXIgPSAhIWFwcElkLmxvYWRCYWxhbmNlcjtcbiAgICAgICAgICAgICAgICAgICAgc2VjcmV0S2V5ID0gYXBwSWQuc2VjcmV0S2V5O1xuICAgICAgICAgICAgICAgICAgICBhcHBJZCA9IGFwcElkLmFwcElkO1xuICAgICAgICAgICAgICAgI
26774H1cbiAgICAgICAgICAgICAgICBwcm92aWRlcnMucHVzaChuZXcgUG9ja2V0UHJvdmlkZXIobmV0d29yaywgYXBwSWQsIHNlY3JldEtleSwgbG9hZEJhbGFuY2VyKSk7XG4gICAgICAgICAgICB9IGNhdGNoIChlcnJvcikgeyBjb25zb2xlLmxvZyhlcnJvcik7IH1cbiAgICAgICAgfVxuICAgICovXG4gICAgaWYgKGFsbG93U2VydmljZShcInF1aWNrbm9kZVwiKSkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgbGV0IHRva2VuID0gb3B0aW9ucy5xdWlja25vZGU7XG4gICAgICAgICAgICBwcm92aWRlcnMucHVzaChuZXcgUXVpY2tOb2RlUHJvdmlkZXIobmV0d29yaywgdG9rZW4pKTtcbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZXJyb3IpIHsgfVxuICAgIH1cbiAgICBhc3NlcnQocHJvdmlkZXJzLmxlbmd0aCwgXCJ1bnN1cHBvcnRlZCBkZWZhdWx0IG5ldHdvcmtcIiwgXCJVTlNVUFBPUlRFRF9PUEVSQVRJT05cIiwge1xuICAgICAgICBvcGVyYXRpb246IFwiZ2V0RGVmYXVsdFByb3ZpZGVyXCJcbiAgICB9KTtcbiAgICAvLyBObyBuZWVkIGZvciBhIEZhbGxiYWNrUHJvdmlkZXJcbiAgICBpZiAocHJvdmlkZXJzLmxlbmd0aCA9PT0gMSkge1xuICAgICAgICByZXR1cm4gcHJvdmlkZXJzWzBdO1xuICAgIH1cbiAgICAvLyBXZSB1c2UgdGhlIGZsb29yIGJlY2F1c2UgcHVibGljIHRoaXJkLXBhcnR5IHByb3ZpZGVycyBjYW4gYmUgdW5yZWxpYWJsZSxcbiAgICAvLyBzbyBhIGxvdyBudW1iZXIgb2YgcHJvdmlkZXJzIHdpdGggYSBsYXJnZSBxdW9ydW0gd2lsbCBmYWlsIHRvbyBvZnRlblxuICAgIGxldCBxdW9ydW0gPSBNYXRoLmZsb29yKHByb3ZpZGVycy5sZW5ndGggLyAyKTtcbiAgICBpZiAocXVvcnVtID4gMikge1xuICAgICAgICBxdW9ydW0gPSAyO1xuICAgIH1cbiAgICAvLyBUZXN0bmV0cyBkb24ndCBuZWVkIGFzIHN0cm9uZyBhIHNlY3VyaXR5IGdhdXJhbnRlZSBhbmQgc3BlZWQgaXNcbiAgICAvLyBtb3JlIHVzZWZ1bCBkdXJpbmcgdGVzdGluZ1xuICAgIGlmIChzdGF0aWNOZXR3b3JrICYmIFRlc3RuZXRzLmluZGV4T2Yoc3RhdGljTmV0d29yay5uYW1lKSAhPT0gLTEpIHtcbiAgICAgICAgcXVvcnVtID0gMTtcbiAgICB9XG4gICAgLy8gUHJvdmlkZWQgb3ZlcnJpZGUgcW9ydW0gdGFrZXMgcHJpb3JpdHlcbiAgICBpZiAob3B0aW9ucyAmJiBvcHRpb25zLnF1b3J1bSkge1xuICAgICAgICBxdW9ydW0gPSBvcHRpb25zLnF1b3J1bTtcbiAgICB9XG4gICAgcmV0dXJuIG5ldyBGYWxsYmFja1Byb3ZpZGVyKHByb3ZpZGVycywgdW5kZWZpbmVkLCB7IHF1b3J1bSB9KTtcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWRlZmF1bHQtcHJvdmlkZXIuanMubWFwIiwiaW1wb3J0IHsgZGVmaW5lUHJvcGVydGllcyB9IGZyb20gXCIuLi91dGlscy9pbmRleC5qc1wiO1xuaW1wb3J0IHsgQWJzdHJhY3RTaWduZXIgfSBmcm9tIFwiLi9hYnN0cmFjdC1zaWduZXIuanNcIjtcbi8qKlxuICogIEEgKipOb25jZU1hbmFnZXIqKiB3cmFwcyBhbm90aGVyIFtbU2lnbmVyXV0gYW5kIGF1dG9tYXRpY2FsbHkgbWFuYWdlc1xuICogIHRoZSBub25jZSwgZW5zdXJpbmcgc2VyaWFsaXplZCBhbmQgc2VxdWVudGlhbCBub25jZXMgYXJlIHVzZWQgZHVyaW5nXG4gKiAgdHJhbnNhY3Rpb24uXG4gKi9cbmV4cG9ydCBjbGFzcyBOb25jZU1hbmFnZXIgZXh0ZW5kcyBBYnN0cmFjdFNpZ25lciB7XG4gICAgLyoqXG4gICAgICogIFRoZSBTaWduZXIgYmVpbmcgbWFuYWdlZC5cbiAgICAgKi9cbiAgICBzaWduZXI7XG4gICAgI25vbmNlUHJvbWlzZTtcbiAgICAjZGVsdGE7XG4gICAgLyoqXG4gICAgICogIENyZWF0ZXMgYSBuZXcgKipOb25jZU1hbmFnZXIqKiB0byBtYW5hZ2UgJSVzaWduZXIlJS5cbiAgICAgKi9cbiAgICBjb25zdHJ1Y3RvcihzaWduZXIpIHtcbiAgICAgICAgc3VwZXIoc2lnbmVyLnByb3ZpZGVyKTtcbiAgICAgICAgZGVmaW5lUHJvcGVydGllcyh0aGlzLCB7IHNpZ25lciB9KTtcbiAgICAgICAgdGhpcy4jbm9uY2VQcm9taXNlID0gbnVsbDtcbiAgICAgICAgdGhpcy4jZGVsdGEgPSAwO1xuICAgIH1cbiAgICBhc3luYyBnZXRBZGRyZXNzKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5zaWduZXIuZ2V0QWRkcmVzcygpO1xuICAgIH1cbiAgICBjb25uZWN0KHByb3ZpZGVyKSB7XG4gICAgICAgIHJldHVybiBuZXcgTm9uY2VNYW5hZ2VyKHRoaXMuc2lnbmVyLmNvbm5lY3QocHJvdmlkZXIpKTtcbiAgICB9XG4gICAgYXN5bmMgZ2V0Tm9uY2UoYmxvY2tUYWcpIHtcbiAgICAgICAgaWYgKGJsb2NrVGFnID09PSBcInBlbmRpbmdcIikge1xuICAgICAgICAgICAgaWYgKHRoaXMuI25vbmNlUHJvbWlzZSA9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgdGhpcy4jbm9uY2VQcm9taXNlID0gc3VwZXIuZ2V0Tm9uY2UoXCJwZW5kaW5nXCIpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgZGVsdGEgPSB0aGlzLiNkZWx0YTtcbiAgICAgICAgICAgIHJldHVybiAoYXdhaXQgdGhpcy4jbm9uY2VQcm9taXNlKSArIGRlbHRhO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBzdXBlci5nZXROb25jZShibG9ja1RhZyk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqICBNYW51YWxseSBpbmNyZW1lbnQgdGhlIG5vbmNlLiBUaGlzIG1heSBiZSB1c2VmdWwgd2hlbiBtYW5hZ25nXG4gICAgICogIG9mZmxpbmUgdHJhbnNhY3Rpb25zLlxuICAgICAqL1xuICAgIGluY3JlbWVudCgpIHtcbiAgICAgICAgdGhpcy4jZGVsdGErKztcbiAgICB9XG4gICAgLyoqXG4gICAgICogIFJlc2V0cyB0aGUgbm9uY2UsIGNhdXNpbmcgdGhlICoqTm9uY2VNYW5hZ2VyKiogdG8gcmVsb2FkIHRoZSBjdXJyZW50XG4gICAgICogIG5vbmNlIGZyb20gdGhlIGJsb2NrY2hhaW4gb24gdGhlIG5leHQgdHJhbnNhY3Rpb24uXG4gICAgICovXG4gICAgcmVzZXQoKSB7XG4gICAgICAgIHRoaXMuI2RlbHRhID0gMDtcbiAgICAgICAgdGhpcy4jbm9uY2VQcm9taXNlID0gbnVsbDtcbiAgICB9XG4gICAgYXN5bmMgc2VuZFRyYW5zYWN0aW9uKHR4KSB7XG4gICAgICAgIGNvbnN0IG5vbmNlUHJvbWlzZSA9IHRoaXMuZ2V0Tm9uY2UoXCJwZW5kaW5nXCIpO1xuICAgICAgICB0aGlzLmluY3JlbWVudCgpO1xuICAgICAgICB0eCA9IGF3YWl0IHRoaXMuc2lnbmVyLnBvcHVsYXRlVHJhbnNhY3Rpb24odHgpO1xuICAgICAgICB0eC5ub25jZSA9IGF3YWl0IG5vbmNlUHJvbWlzZTtcbiAgICAgICAgLy8gQFRPRE86IE1heWJlIGhhbmRsZSBpbnRlcmVzdGluZy9yZWNvdmVyYWJsZSBlcnJvcnM/XG4gICAgICAgIC8vIExpa2UgZG9uJ3QgaW5jcmVtZW50IGlmIHRoZSB0eCB3YXMgY2VydGFpbmx5IG5vdCBzZW50XG4gICAgICAgI
26774HJldHVybiBhd2FpdCB0aGlzLnNpZ25lci5zZW5kVHJhbnNhY3Rpb24odHgpO1xuICAgIH1cbiAgICBzaWduVHJhbnNhY3Rpb24odHgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc2lnbmVyLnNpZ25UcmFuc2FjdGlvbih0eCk7XG4gICAgfVxuICAgIHNpZ25NZXNzYWdlKG1lc3NhZ2UpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc2lnbmVyLnNpZ25NZXNzYWdlKG1lc3NhZ2UpO1xuICAgIH1cbiAgICBzaWduVHlwZWREYXRhKGRvbWFpbiwgdHlwZXMsIHZhbHVlKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnNpZ25lci5zaWduVHlwZWREYXRhKGRvbWFpbiwgdHlwZXMsIHZhbHVlKTtcbiAgICB9XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1zaWduZXItbm9uY2VtYW5hZ2VyLmpzLm1hcCIsImltcG9ydCB7IGFzc2VydEFyZ3VtZW50LCBtYWtlRXJyb3IgfSBmcm9tIFwiLi4vdXRpbHMvaW5kZXguanNcIjtcbmltcG9ydCB7IEpzb25ScGNBcGlQb2xsaW5nUHJvdmlkZXIgfSBmcm9tIFwiLi9wcm92aWRlci1qc29ucnBjLmpzXCI7XG47XG4vKipcbiAqICBBICoqQnJvd3NlclByb3ZpZGVyKiogaXMgaW50ZW5kZWQgdG8gd3JhcCBhbiBpbmplY3RlZCBwcm92aWRlciB3aGljaFxuICogIGFkaGVyZXMgdG8gdGhlIFtbbGluay1laXAtMTE5M11dIHN0YW5kYXJkLCB3aGljaCBtb3N0IChpZiBub3QgYWxsKVxuICogIGN1cnJlbnRseSBkby5cbiAqL1xuZXhwb3J0IGNsYXNzIEJyb3dzZXJQcm92aWRlciBleHRlbmRzIEpzb25ScGNBcGlQb2xsaW5nUHJvdmlkZXIge1xuICAgICNyZXF1ZXN0O1xuICAgICNwcm92aWRlckluZm87XG4gICAgLyoqXG4gICAgICogIENvbm5lY3QgdG8gdGhlICUlZXRoZXJldW0lJSBwcm92aWRlciwgb3B0aW9uYWxseSBmb3JjaW5nIHRoZVxuICAgICAqICAlJW5ldHdvcmslJS5cbiAgICAgKi9cbiAgICBjb25zdHJ1Y3RvcihldGhlcmV1bSwgbmV0d29yaywgX29wdGlvbnMpIHtcbiAgICAgICAgLy8gQ29weSB0aGUgb3B0aW9uc1xuICAgICAgICBjb25zdCBvcHRpb25zID0gT2JqZWN0LmFzc2lnbih7fSwgKChfb3B0aW9ucyAhPSBudWxsKSA/IF9vcHRpb25zIDoge30pLCB7IGJhdGNoTWF4Q291bnQ6IDEgfSk7XG4gICAgICAgIGFzc2VydEFyZ3VtZW50KGV0aGVyZXVtICYmIGV0aGVyZXVtLnJlcXVlc3QsIFwiaW52YWxpZCBFSVAtMTE5MyBwcm92aWRlclwiLCBcImV0aGVyZXVtXCIsIGV0aGVyZXVtKTtcbiAgICAgICAgc3VwZXIobmV0d29yaywgb3B0aW9ucyk7XG4gICAgICAgIHRoaXMuI3Byb3ZpZGVySW5mbyA9IG51bGw7XG4gICAgICAgIGlmIChfb3B0aW9ucyAmJiBfb3B0aW9ucy5wcm92aWRlckluZm8pIHtcbiAgICAgICAgICAgIHRoaXMuI3Byb3ZpZGVySW5mbyA9IF9vcHRpb25zLnByb3ZpZGVySW5mbztcbiAgICAgICAgfVxuICAgICAgICB0aGlzLiNyZXF1ZXN0ID0gYXN5bmMgKG1ldGhvZCwgcGFyYW1zKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBwYXlsb2FkID0geyBtZXRob2QsIHBhcmFtcyB9O1xuICAgICAgICAgICAgdGhpcy5lbWl0KFwiZGVidWdcIiwgeyBhY3Rpb246IFwic2VuZEVpcDExOTNSZXF1ZXN0XCIsIH
26774BheWxvYWQgfSk7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGV0aGVyZXVtLnJlcXVlc3QocGF5bG9hZCk7XG4gICAgICAgICAgICAgICAgdGhpcy5lbWl0KFwiZGVidWdcIiwgeyBhY3Rpb246IFwicmVjZWl2ZUVpcDExOTNSZXN1bHRcIiwgcmVzdWx0IH0pO1xuICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGVycm9yID0gbmV3IEVycm9yKGUubWVzc2FnZSk7XG4gICAgICAgICAgICAgICAgZXJyb3IuY29kZSA9IGUuY29kZTtcbiAgICAgICAgICAgICAgICBlcnJvci5kYXRhID0gZS5kYXRhO1xuICAgICAgICAgICAgICAgIGVycm9yLnBheWxvYWQgPSBwYXlsb2FkO1xuICAgICAgICAgICAgICAgIHRoaXMuZW1pdChcImRlYnVnXCIsIHsgYWN0aW9uOiBcInJlY2VpdmVFaXAxMTkzRXJyb3JcIiwgZXJyb3IgfSk7XG4gICAgICAgICAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgfVxuICAgIGdldCBwcm92aWRlckluZm8oKSB7XG4gICAgICAgIHJldHVybiB0aGlzLiNwcm92aWRlckluZm87XG4gICAgfVxuICAgIGFzeW5jIHNlbmQobWV0aG9kLCBwYXJhbXMpIHtcbiAgICAgICAgYXdhaXQgdGhpcy5fc3RhcnQoKTtcbiAgICAgICAgcmV0dXJuIGF3YWl0IHN1cGVyLnNlbmQobWV0aG9kLCBwYXJhbXMpO1xuICAgIH1cbiAgICBhc3luYyBfc2VuZChwYXlsb2FkKSB7XG4gICAgICAgIGFzc2VydEFyZ3VtZW50KCFBcnJheS5pc0FycmF5KHBheWxvYWQpLCBcIkVJUC0xMTkzIGRvZXMgbm90IHN1cHBvcnQgYmF0Y2ggcmVxdW
26774VzdFwiLCBcInBheWxvYWRcIiwgcGF5bG9hZCk7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLiNyZXF1ZXN0KHBheWxvYWQubWV0aG9kLCBwYXlsb2FkLnBhcmFtcyB8fCBbXSk7XG4gICAgICAgICAgICByZXR1cm4gW3sgaWQ6IHBheWxvYWQuaWQsIHJlc3VsdCB9XTtcbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZSkge1xuICAgICAgICAgICAgcmV0dXJuIFt7XG4gICAgICAgICAgICAgICAgICAgIGlkOiBwYXlsb2FkLmlkLFxuICAgICAgICAgICAgICAgICAgICBlcnJvcjogeyBjb2RlOiBlLmNvZGUsIGRhdGE6IGUuZGF0YSwgbWVzc2FnZTogZS5tZXNzYWdlIH1cbiAgICAgICAgICAgICAgICB9XTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBnZXRScGNFcnJvcihwYXlsb2FkLCBlcnJvcikge1xuICAgICAgICBlcnJvciA9IEpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkoZXJyb3IpKTtcbiAgICAgICAgLy8gRUlQLTExOTMgZ2l2ZXMgdXMgc29tZSBtYWNoaW5lLXJlYWRhYmxlIGVycm9yIGNvZGVzLCBzbyByZXdyaXRlXG4gICAgICAgIC8vIHRoZW0gaW50byBFdGhlcnMgc3RhbmRhcmQgZXJyb3JzLlxuICAgICAgICBzd2l0Y2ggKGVycm9yLmVycm9yLmNvZGUgfHwgLTEpIHtcbiAgICAgICAgICAgIGNhc2UgNDAwMTpcbiAgICAgICAgICAgICAgICBlcnJvci5lcnJvci5tZXNzYWdlID0gYGV0aGVycy11c2VyLWRlbmllZDogJHtlcnJvci5lcnJvci5tZXNzYWdlfWA7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIDQyMDA6XG4gICAgICAgICAgICAgICAgZXJyb3IuZXJyb3IubWVzc2FnZSA9IGBldGhlcnMtdW5zdXBwb3J0ZWQ6ICR7ZXJyb3IuZXJyb3IubWVzc2FnZX1gO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBzdXBlci5nZXRScGNFcnJvcihwYXlsb2FkLCBlcnJvcik7XG4gICAgfVxuICAgIC8qKlxuICAgICAqICBSZXNvbHZlcyB0byBgYHRydWVgYCBpZiB0aGUgcHJvdmlkZXIgbWFuYWdlcyB0aGUgJSVhZGRyZXNzJSUuXG4gICAgICovXG4gICAgYXN5bmMgaGFzU2lnbmVyKGFkZHJlc3MpIHtcbiAgICAgICAgaWYgKGFkZHJlc3MgPT0gbnVsbCkge1xuICAgICAgICAgICAgYWRkcmVzcyA9IDA7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgYWNjb3VudHMgPSBhd2FpdCB0aGlzLnNlbmQoXCJldGhfYWNjb3VudHNcIiwgW10pO1xuICAgICAgICBpZiAodHlwZW9mIChhZGRyZXNzKSA9PT0gXCJudW1iZXJcIikge1xuICAgICAgICAgICAgcmV0dXJuIChhY2NvdW50cy5sZW5ndGggPiBhZGRyZXNzKTtcbiAgICAgICAgfVxuICAgICAgICBhZGRyZXNzID0gYWRkcmVzcy50b0xvd2VyQ2FzZSgpO1xuICAgICAgICByZXR1cm4gYWNjb3VudHMuZmlsdGVyKChhKSA9PiAoYS50b0xvd2VyQ2FzZSgpID09PSBhZGRyZXNzKSkubGVuZ3RoICE9PSAwO1xuICAgIH1cbiAgICBhc3luYyBnZXRTaWduZXIoYWRkcmVzcykge1xuICAgICAgICBpZiAoYWRkcmVzcyA9PSBudWxsKSB7XG4gICAgICAgICAgICBhZGRyZXNzID0gMDtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIShhd2FpdCB0aGlzLmhhc1NpZ25lcihhZGRyZXNzKSkpIHtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgYXdhaXQgdGhpcy4jcmVxdWVzdChcImV0aF9yZXF1ZXN0QWNjb3VudHNcIiwgW10pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgcGF5bG9hZCA9IGVycm9yLnBheWxvYWQ7XG4gICAgICAgICAgICAgICAgdGhyb3cgdGhpcy5nZXRScGNFcnJvcihwYXlsb2FkLCB7IGlkOiBwYXlsb2FkLmlkLCBlcnJvciB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYXdhaXQgc3VwZXIuZ2V0U2lnbmVyKGFkZHJlc3MpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiAgRGlzY292ZXIgYW5kIGNvbm5lY3QgdG8gYSBQcm92aWRlciBpbiB0aGUgQnJvd3NlciB1c2luZyB0aGVcbiAgICAgKiAgW1tsaW5rLWVpcC02OTYzXV0gZGlzY292ZXJ5IG1lY2hhbmlzbS4gSWYgbm8gcHJvdmlkZXJzIGFyZVxuICAgICAqICBwcmVzZW50LCBgYG51bGxgYCBpcyByZXNvbHZlZC5cbiAgICAgKi9cbiAgICBzdGF0aWMgYXN5bmMgZGlzY292ZXIob3B0aW9ucykge1xuICAgICAgICBpZiAob3B0aW9ucyA9PSBudWxsKSB7XG4gICAgICAgICAgICBvcHRpb25zID0ge307XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG9wdGlvbnMucHJvdmlkZXIpIHtcbiAgICAgICAgICAgIHJldHVybiBuZXcgQnJvd3NlclByb3ZpZGVyKG9wdGlvbnMucHJvdmlkZXIpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGNvbnRleHQgPSBvcHRpb25zLndpbmRvdyA/IG9wdGlvbnMud2luZG93IDpcbiAgICAgICAgICAgICh0eXBlb2YgKHdpbmRvdykgIT09IFwidW5kZWZpbmVkXCIpID8gd2luZG93IDogbnVsbDtcbiAgICAgICAgaWYgKGNvbnRleHQgPT0gbnVsbCkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgYW55UHJvdmlkZXIgPSBvcHRpb25zLmFueVByb3ZpZGVyO1xuICAgICAgICBpZiAoYW55UHJvdmlkZXIgJiYgY29udGV4dC5ldGhlcmV1bSkge1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBCcm93c2VyUHJvdmlkZXIoY29udGV4dC5ldGhlcmV1bSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCEoXCJhZGRFdmVudExpc3RlbmVyXCIgaW4gY29udGV4dCAmJiBcImRpc3BhdGNoRXZlbnRcIiBpbiBjb250ZXh0XG4gICAgICAgICAgICAmJiBcInJlbW92ZUV2ZW50TGlzdGVuZXJcIiBpbiBjb250ZXh0KSkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgdGltZW91dCA9IG9wdGlvbnMudGltZW91dCA/IG9wdGlvbnMudGltZW91dCA6IDMwMDtcbiAgICAgICAgaWYgKHRpbWVvdXQgPT09IDApIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBhd2FpdCAobmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICAgICAgbGV0IGZvdW5kID0gW107XG4gICAgICAgICAgICBjb25zdCBhZGRQcm92aWRlciA9IChldmVudCkgPT4ge1xuICAgICAgICAgICAgICAgIGZvdW5kLnB1c2goZXZlbnQuZGV0YWlsKTtcbiAgICAgICAgICAgICAgICBpZiAoYW55UHJvdmlkZXIpIHtcbiAgICAgICAgICAgICAgICAgICAgZmluYWxpemUoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgY29uc3QgZmluYWxpemUgPSAoKSA9PiB7XG4gICAgICAgICAgICAgICAgY2xlYXJUaW1lb3V0KHRpbWVyKTtcbiAgICAgICAgICAgICAgICBpZiAoZm91bmQubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIElmIGZ
26774pbHRlcmluZyBpcyBwcm92aWRlZDpcbiAgICAgICAgICAgICAgICAgICAgaWYgKG9wdGlvbnMgJiYgb3B0aW9ucy5maWx0ZXIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIENhbGwgZmlsdGVyLCB3aXRoIGEgY29waWVzIG9mIGZvdW5kIHByb3ZpZGVyIGluZm9zXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBmaWx0ZXJlZCA9IG9wdGlvbnMuZmlsdGVyKGZvdW5kLm1hcChpID0+IE9iamVjdC5hc3NpZ24oe30sIChpLmluZm8pKSkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZpbHRlcmVkID09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBObyBwcm92aWRlciBzZWxlY3RlZFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmUobnVsbCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChmaWx0ZXJlZCBpbnN0YW5jZW9mIEJyb3dzZXJQcm92aWRlcikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEN1c3RvbSBwcm92aWRlciBjcmVhdGVkXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZShmaWx0ZXJlZCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBGaW5kIHRoZSBtYXRjaGluZyBwcm92aWRlclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBtYXRjaCA9IG51bGw7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZpbHRlcmVkLnV1aWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbWF0Y2hlcyA9IGZvdW5kLmZpbHRlcihmID0+IChmaWx0ZXJlZC51dWlkID09PSBmLmluZm8udXVpZCkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBAVE9ETzogV2hhdCBzaG91bGQgaGFwcGVuIGlmIG11bHRpcGxlIHZhbHVlc1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAgICAgICAgZm9yIHRoZSBzYW1lIFVVSUQ/XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hdGNoID0gbWF0Y2hlc1swXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1hdGNoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHsgcHJvdmlkZXIsIGluZm8gfSA9IG1hdGNoO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlKG5ldyBCcm93c2VyUHJvdmlkZXIocHJvdmlkZXIsIHVuZGVmaW5lZCwge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvdmlkZXJJbmZvOiBpbmZvXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlamVjdChtYWtlRXJyb3IoXCJmaWx0ZXIgcmV0dXJuZWQgdW5rbm93biBpbmZvXCIsIFwiVU5TVVBQT1JURURfT1BFUkFUSU9OXCIsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiBmaWx0ZXJlZFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gUGljayB0aGUgZmlyc3QgZm91bmQgcHJvdmlkZXJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHsgcHJvdmlkZXIsIGluZm8gfSA9IGZvdW5kWzBdO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZShuZXcgQnJvd3NlclByb3ZpZGVyKHByb3ZpZGVyLCB1bmRlZmluZWQsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm92aWRlckluZm86IGluZm9cbiAgICAgICAgICAgICAgICAgICAgICAgIH0pKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gTm90aGluZyBmb3VuZFxuICAgICAgICAgICAgICAgICAgICByZXNvbHZlKG51bGwpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjb250ZXh0LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJlaXA2OTYzOmFubm91bmNlUHJvdmlkZXJcIiwgYWRkUHJvdmlkZXIpO1xuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIGNvbnN0IHRpbWVyID0gc2V0VGltZW91dCgoKSA9PiB7IGZpbmFsaXplKCk7IH0sIHRpbWVvdXQpO1xuICAgICAgICAgICAgY29udGV4dC5hZGRFdmVudExpc3RlbmVyKFwiZWlwNjk2Mzphbm5vdW5jZVByb3ZpZGVyXCIsIGFkZFByb3ZpZGVyKTtcbiAgICAgICAgICAgIGNvbnRleHQuZGlzcGF0Y2hFdmVudChuZXcgRXZlbnQoXCJlaXA2OTYzOnJlcXVlc3RQcm92aWRlclwiKSk7XG4gICAgICAgIH0pKTtcbiAgICB9XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1wcm92aWRlci1icm93c2VyLmpzLm1hcCIsIi8qKlxuICogIFtbbGluay1ibG9ja3Njb3V0XV0gcHJvdmlkZXMgYSB0aGlyZC1wYXJ0eSBzZXJ2aWNlIGZvciBjb25uZWN0aW5nIHRvXG4gKiAgdmFyaW91cyBibG9ja2NoYWlucyBvdmVyIEpTT04tUlBDLlxuICpcbiAqICAqKlN1cHBvcnRlZCBOZXR3b3JrcyoqXG4gKlxuICogIC0gRXRoZXJldW0gTWFpbm5ldCAoYGBtYWlubmV0YGApXG4gKiAgLSBTZXBvbGlhIFRlc3RuZXQgKGBgc2Vwb2xpYWBgKVxuICogIC0gSG9sZXNreSBUZXN0bmV0IChgYGhvbGVza3lgYClcbiAqICAtIEV0aGVyZXVtIENsYXNzaWMgKGBgY2xhc3NpY2BgKVxuICogIC0gQXJiaXRydW0gKGBgYXJiaXRydW1gYClcbiAqICAtIEJhc2UgKGBgYmFzZWBgKVxuICogIC0gQmFzZSBTZXBvbGlhIFRlc3RuZXQgKGBgYmFzZS1zZXBvbGlhYGApXG4gKiAgLSBHbm9zaXMgKGBgeGRhaWBgKVxuICogIC0gT3B0aW1pc20gKGBgb3B0aW1pc21gYClcbiAqICAtIE9wdGltaXNtIFNlcG9saWEgVGVzdG5ldCAoYGBvcHRpbWlzbS1zZXBvbGlhYGApXG4gKiAgLSBQb2x5Z29uIChgYG1hdGljYGApXG4gKlxuICogIEBfc3Vic2VjdGlvbj
26774ogYXBpL3Byb3ZpZGVycy90aGlyZHBhcnR5OkJsb2Nrc2NvdXQgIFtwcm92aWRlcnMtYmxvY2tzY291dF1cbiAqL1xuaW1wb3J0IHsgYXNzZXJ0QXJndW1lbnQsIGRlZmluZVByb3BlcnRpZXMsIEZldGNoUmVxdWVzdCwgaXNIZXhTdHJpbmcgfSBmcm9tIFwiLi4vdXRpbHMvaW5kZXguanNcIjtcbmltcG9ydCB7IE5ldHdvcmsgfSBmcm9tIFwiLi9uZXR3b3JrLmpzXCI7XG5pbXBvcnQgeyBKc29uUnBjUHJvdmlkZXIgfSBmcm9tIFwiLi9wcm92aWRlci1qc29ucnBjLmpzXCI7XG5mdW5jdGlvbiBnZXRVcmwobmFtZSkge1xuICAgIHN3aXRjaCAobmFtZSkge1xuICAgICAgICBjYXNlIFwibWFpbm5ldFwiOlxuICAgICAgICAgICAgcmV0dXJuIFwiaHR0cHM6L1xcL2V0aC5ibG9ja3Njb3V0LmNvbS9hcGkvZXRoLXJwY1wiO1xuICAgICAgICBjYXNlIFwic2Vwb2xpYVwiOlxuICAgICAgICAgICAgcmV0dXJuIFwiaHR0cHM6L1xcL2V0aC1zZXBvbGlhLmJsb2Nrc2NvdXQuY29tL2FwaS9ldGgtcnBjXCI7XG4gICAgICAgIGNhc2UgXCJob2xlc2t5XCI6XG4gICAgICAgICAgICByZXR1cm4gXCJodHRwczovXFwvZXRoLWhvbGVza3kuYmxvY2tzY291dC5jb20vYXBpL2V0aC1ycGNcIjtcbiAgICAgICAgY2FzZSBcImNsYXNzaWNcIjpcbiAgICAgICAgICAgIHJldHVybiBcImh0dHBzOi9cXC9ldGMuYmxvY2tzY291dC5jb20vYXBpL2V0aC1ycGNcIjtcbiAgICAgICAgY2FzZSBcImFyYml0cnVtXCI6XG4gICAgICAgICAgICByZXR1cm4gXCJodHRwczovXFwvYXJiaXRydW0uYmxvY2tzY291dC5jb20vYXBpL2V0aC1ycGNcIjtcbiAgICAgICAgY2FzZSBcImJhc2VcIjpcbiAgICAgICAgICAgIHJldHVybiBcImh0dHBzOi9cXC9iYXNlLmJsb2Nrc2NvdXQuY29tL2FwaS9ldGgtcnBjXCI7XG4gICAgICAgIGNhc2UgXCJiYXNlLXNlcG9saWFcIjpcbiAgICAgICAgICAgIHJldHVybiBcImh0dHBzOi9cXC9iYXNlLXNlcG9saWEuYmxvY2tzY291dC5jb20vYXBpL2V0aC1ycGNcIjtcbiAgICAgICAgY2FzZSBcIm1hdGljXCI6XG4gICAgICAgICAgICByZXR1cm4gXCJodHRwczovXFwvcG9seWdvbi5ibG9ja3Njb3V0LmNvbS9hcGkvZXRoLXJwY1wiO1xuICAgICAgICBjYXNlIFwib3B0aW1pc21cIjpcbiAgICAgICAgICAgIHJldHVybiBcImh0dHBzOi9cXC9vcHRpbWlzbS5ibG9ja3Njb3V0LmNvbS9hcGkvZXRoLXJwY1wiO1xuICAgICAgICBjYXNlIFwib3B0aW1pc20tc2Vwb2xpYVwiOlxuICAgICAgICAgICAgcmV0dXJuIFwiaHR0cHM6L1xcL29wdGltaXNtLXNlcG9saWEuYmxvY2tzY291dC5jb20vYXBpL2V0aC1ycGNcIjtcbiAgICAgICAgY2FzZSBcInhkYWlcIjpcbiAgICAgICAgICAgIHJldHVybiBcImh0dHBzOi9cXC9nbm9zaXMuYmxvY2tzY291dC5jb20vYXBpL2V0aC1ycGNcIjtcbiAgICB9XG4gICAgYXNzZXJ0QXJndW1lbnQoZmFsc2UsIFwidW5zdXBwb3J0ZWQgbmV0d29ya1wiLCBcIm5ldHdvcmtcIiwgbmFtZSk7XG59XG5jb25zdCBkZWZhdWx0QXBpS2V5ID0gXCJwcm9hcGlfZ3djQUFhZ3lRS0o0cjJLckFBVHl5Q3NoaXlVRXBXZnIyeDdhS0RPV0ZjNTZaWThtQkZjVDlLWnVQNUNlMmpJZnJfa0h6VW1cIjtcbi8qKlxuICogIFRoZSAqKkJsb2Nrc2NvdXRQcm92aWRlcioqIGNvbm5lY3RzIHRvIHRoZSBbW2xpbmstYmxvY2tzY291dF1dXG4gKiAgSlNPTi1SUEMgZW5kLXBvaW50cy5cbiAqXG4gKiAgQnkgZGVmYXVsdCwgYSBoaWdobHktdGhyb3R0bGVkIEFQSSBrZXkgaXMgdXNlZCwgd2hpY2ggaXNcbiAqICBhcHByb3ByaWF0ZSBmb3IgcXVpY2sgcHJvdG90eXBlcyBhbmQgc2ltcGxlIHNjcmlwdHMuIFRvXG4gKiAgZ2FpbiBhY2Nlc3MgdG8gYW4gaW5jcmVhc2VkIHJhdGUtbGltaXQsIGl0IGlzIGhpZ2hseVxuICogIHJlY29tbWVuZGVkIHRvIFtzaWduIHVwIGhlcmVdKGxpbmstYmxvY2tzY291dC1zaWdudXApLlxuICovXG5leHBvcnQgY2xhc3MgQmxvY2tzY291dFByb3ZpZGVyIGV4dGVuZHMgSnNvblJwY1Byb3ZpZGVyIHtcbiAgICAvKipcbiAgICAgKiAgVGhlIEFQSSBrZXkuXG4gICAgICovXG4gICAgYXBpS2V5O1xuICAgIC8qKlxuICAgICAqICBDcmVhdGVzIGEgbmV3ICoqQmxvY2tzY291dFByb3ZpZGVyKiouXG4gICAgICovXG4gICAgY29uc3RydWN0b3IoX25ldHdvcmssIGFwaUtleSkge1xuICAgICAgICBpZiAoX25ldHdvcmsgPT0gbnVsbCkge1xuICAgICAgICAgICAgX25ldHdvcmsgPSBcIm1haW5uZXRcIjtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBuZXR3b3JrID0gTmV0d29yay5mcm9tKF9uZXR3b3JrKTtcbiAgICAgICAgaWYgKGFwaUtleSA9PSBudWxsKSB7XG4gICAgICAgICAgICBhcGlLZXkgPSBkZWZhdWx0QXBpS2V5O1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHJlcXVlc3QgPSBCbG9ja3Njb3V0UHJvdmlkZXIuZ2V0UmVxdWVzdChuZXR3b3JrKTtcbiAgICAgICAgc3VwZXIocmVxdWVzdCwgbmV0d29yaywgeyBzdGF0aWNOZXR3b3JrOiBuZXR3b3JrIH0pO1xuICAgICAgICBkZWZpbmVQcm9wZXJ0aWVzKHRoaXMsIHsgYXBpS2V5IH0pO1xuICAgIH1cbiAgICBfZ2V0UHJvdmlkZXIoY2hhaW5JZCkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBCbG9ja3Njb3V0UHJvdmlkZXIoY2hhaW5JZCwgdGhpcy5hcGlLZXkpO1xuICAgICAgICB9XG4gICAgICAgIGNhdGNoIChlcnJvcikgeyB9XG4gICAgICAgIHJldHVybiBzdXBlci5fZ2V0UHJvdmlkZXIoY2hhaW5JZCk7XG4gICAgfVxuICAgIGlzQ29tbXVuaXR5UmVzb3VyY2UoKSB7XG4gICAgICAgIHJldHVybiAodGhpcy5hcGlLZXkgPT09IG51bGwpO1xuICAgIH1cbiAgICBnZXRScGNSZXF1ZXN0KHJlcSkge1xuICAgICAgICAvLyBCbG9ja3Njb3V0IGVuZm9yY2VzIHRoZSBUQUcgYXJndW1lbnQgZm9yIGVzdGltYXRlR2FzXG4gICAgICAgIGNvbnN0IHJlc3AgPSBzdXBlci5nZXRScGNSZXF1ZXN0KHJlcSk7XG4gICAgICAgIGlmIChyZXNwICYmIHJlc3AubWV0aG9kID09PSBcImV0aF9lc3RpbWF0ZUdhc1wiICYmIHJlc3AuYXJncy5sZW5ndGggPT0gMSkge1xuICAgICAgICAgICAgcmVzcC5hcmdzID0gcmVzcC5hcmdzLnNsaWNlKCk7XG4gICAgICAgICAgICByZXNwLmFyZ3MucHVzaChcImxhdGVzdFwiKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVz
26774cDtcbiAgICB9XG4gICAgZ2V0UnBjRXJyb3IocGF5bG9hZCwgX2Vycm9yKSB7XG4gICAgICAgIGNvbnN0IGVycm9yID0gX2Vycm9yID8gX2Vycm9yLmVycm9yIDogbnVsbDtcbiAgICAgICAgLy8gQmxvY2tzY291dCBjdXJyZW50bHkgZHJvcHMgdGhlIFZNIHJlc3VsdCBhbmQgcmVwbGFjZXMgaXQgd2l0aCBhXG4gICAgICAgIC8vIGh1bWFuLXJlYWRhYmxlIHN0cmluZywgc28gd2UgbmVlZCB0byBtYWtlIGl0IG1hY2hpbmUtcmVhZGFibGUuXG4gICAgICAgIGlmIChlcnJvciAmJiBlcnJvci5jb2RlID09PSAtMzIwMTUgJiYgIWlzSGV4U3RyaW5nKGVycm9yLmRhdGEgfHwgXCJcIiwgdHJ1ZSkpIHtcbiAgICAgICAgICAgIGNvbnN0IHBhbmljQ29kZXMgPSB7XG4gICAgICAgICAgICAgICAgXCJhc3NlcnQoZmFsc2UpXCI6IFwiMDFcIixcbiAgICAgICAgICAgICAgICBcImFyaXRobWV0aWMgdW5kZXJmbG93IG9yIG92ZXJmbG93XCI6IFwiMTFcIixcbiAgICAgICAgICAgICAgICBcImRpdmlzaW9uIG9yIG1vZHVsbyBieSB6ZXJvXCI6IFwiMTJcIixcbiAgICAgICAgICAgICAgICBcIm91dC1vZi1ib3VuZHMgYXJyYXkgYWNjZXNzOyBwb3BwaW5nIG9uIGFuIGVtcHR5IGFycmF5XCI6IFwiMzFcIixcbiAgICAgICAgICAgICAgICBcIm91dC1vZi1ib3VuZHMgYWNjZXNzIG9mIGFuIGFycmF5IG9yIGJ5dGVzTlwiOiBcIjMyXCJcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBsZXQgcGFuaWNDb2RlID0gXCJcIjtcbiAgICAgICAgICAgIGlmIChlcnJvci5tZXNzYWdlID09PSBcIlZNIGV4ZWN1dGlvbiBlcnJvci5cIikge1xuICAgICAgICAgICAgICAgIC8vIGV0aF9jYWxsIHBhc3NlcyB0aGlzIG1lc3NhZ2VcbiAgICAgICAgICAgICAgICBwYW5pY0NvZGUgPSBwYW5pY0NvZGVzW2Vycm9yLmRhdGFdIHx8IFwiXCI7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChwYW5pY0NvZGVzW2Vycm9yLm1lc3NhZ2UgfHwgXCJcIl0pIHtcbiAgICAgICAgICAgICAgICBwYW5pY0NvZGUgPSBwYW5pY0NvZGVzW2Vycm9yLm1lc3NhZ2UgfHwgXCJcIl07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAocGFuaWNDb2RlKSB7XG4gICAgICAgICAgICAgICAgZXJyb3IubWVzc2FnZSArPSBgIChyZXZlcnRlZDogJHtlcnJvci5kYXRhfSlgO1xuICAgICAgICAgICAgICAgIGVycm9yLmRhdGEgPSBcIjB4NGU0ODdiNzEwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMFwiICsgcGFuaWNDb2RlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGVycm9yICYmIGVycm9yLmNvZGUgPT09IC0zMjAwMCkge1xuICAgICAgICAgICAgaWYgKGVycm9yLm1lc3NhZ2UgPT09IFwid3JvbmcgdHJhbnNhY3Rpb24gbm9uY2VcIikge1xuICAgICAgICAgICAgICAgIGVycm9yLm1lc3NhZ2UgKz0gXCIgKG5vbmNlIHRvbyBsb3cpXCI7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHN1cGVyLmdldFJwY0Vycm9yKHBheWxvYWQsIF9lcnJvcik7XG4gICAgfVxuICAgIC8qKlxuICAgICAqICBSZXR1cm5zIGEgcHJlcGFyZWQgcmVxdWVzdCBmb3IgY29ubmVjdGluZyB0byAlJW5ldHdvcmslJVxuICAgICAqICB3aXRoICUlYXBpS2V5JSUuXG4gICAgICovXG4gICAgc3RhdGljIGdldFJlcXVlc3QobmV0d29yaykge1xuICAgICAgICBjb25zdCByZXF1ZXN0ID0gbmV3IEZldGNoUmVxdWVzdChnZXRVcmwobmV0d29yay5uYW1lKSk7XG4gICAgICAgIHJlcXVlc3QuYWxsb3dHemlwID0gdHJ1ZTtcbiAgICAgICAgcmV0dXJuIHJlcXVlc3Q7XG4gICAgfVxufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9cHJvdmlkZXItYmxvY2tzY291dC5qcy5tYXAiLCIvKipcbiAqICBbW2xpbmstcG9ja2V0XV0gcHJvdmlkZXMgYSB0aGlyZC1wYXJ0eSBzZXJ2aWNlIGZvciBjb25uZWN0aW5nIHRvXG4gKiAgdmFyaW91cyBibG9ja2NoYWlucyBvdmVyIEpTT04tUlBDLlxuICpcbiAqICAqKlN1cHBvcnRlZCBOZXR3b3JrcyoqXG4gKlxuICogIC0gRXRoZXJldW0gTWFpbm5ldCAoYGBtYWlubmV0YGApXG4gKiAgLSBHb2VybGkgVGVzdG5ldCAoYGBnb2VybGlgYClcbiAqICAtIFBvbHlnb24gKGBgbWF0aWNgYClcbiAqICAtIEFyYml0cnVtIChgYGFyYml0cnVtYGApXG4gKlxuICogIEBfc3Vic2VjdGlvbjogYXBpL3Byb3ZpZGVycy90aGlyZHBhcnR5OlBvY2tldCAgW3Byb3ZpZGVycy1wb2NrZXRdXG4gKi9cbmltcG9ydCB7IGRlZmluZVByb3BlcnRpZXMsIEZldGNoUmVxdWVzdCwgYXNzZXJ0QXJndW1lbnQgfSBmcm9tIFwiLi4vdXRpbHMvaW5kZXguanNcIjtcbmltcG9ydCB7IHNob3dUaHJvdHRsZU1lc3NhZ2UgfSBmcm9tIFwiLi9jb21tdW5pdHkuanNcIjtcbmltcG9ydCB7IE5ldHdvcmsgfSBmcm9tIFwiLi9uZXR3b3JrLmpzXCI7XG5pbXBvcnQgeyBKc29uUnBjUHJvdmlkZXIgfSBmcm9tIFwiLi9wcm92aWRlci1qc29ucnBjLmpzXCI7XG5jb25zdCBkZWZhdWx0QXBwbGljYXRpb25JZCA9IFwiNjJlMWFkNTFiMzdiOGUwMDM5NGJkYTNiXCI7XG5mdW5jdGlvbiBnZXRIb3N0KG5hbWUpIHtcbiAgICBzd2l0Y2ggKG5hbWUpIHtcbiAgICAgICAgY2FzZSBcIm1haW5uZXRcIjpcbiAgICAgICAgICAgIHJldHVybiBcImV0aC1tYWlubmV0LmdhdGV3YXkucG9rdC5uZXR3b3JrXCI7XG4gICAgICAgIGNhc2UgXCJnb2VybGlcIjpcbiAgICAgICAgICAgIHJldHVybiBcImV0aC1nb2VybGkuZ2F0ZXdheS5wb2t0Lm5ldHdvcmtcIjtcbiAgICAgICAgY2FzZSBcIm1hdGljXCI6XG4gICAgICAgICAgICByZXR1cm4gXCJwb2x5LW1haW5uZXQuZ2F0ZXdheS5wb2t0Lm5ldHdvcmtcIjtcbiAgICAgICAgY2FzZSBcIm1hdGljLW11bWJhaVwiOlxuICAgICAgICAgICAgcmV0dXJuIFwicG9seWdvbi1tdW1iYWktcnBjLmdhdGV3YXkucG9rdC5uZXR3b3JrXCI7XG4gICAgfVxuICAgIGFzc2VydEFyZ3VtZW50KGZhbHNlLCBcInVuc3VwcG9ydGVkIG5ldHdvcmtcIiwgXCJuZXR3b3JrXCIsIG5hbW
26774UpO1xufVxuLyoqXG4gKiAgVGhlICoqUG9ja2V0UHJvdmlkZXIqKiBjb25uZWN0cyB0byB0aGUgW1tsaW5rLXBvY2tldF1dXG4gKiAgSlNPTi1SUEMgZW5kLXBvaW50cy5cbiAqXG4gKiAgQnkgZGVmYXVsdCwgYSBoaWdobHktdGhyb3R0bGVkIEFQSSBrZXkgaXMgdXNlZCwgd2hpY2ggaXNcbiAqICBhcHByb3ByaWF0ZSBmb3IgcXVpY2sgcHJvdG90eXBlcyBhbmQgc2ltcGxlIHNjcmlwdHMuIFRvXG4gKiAgZ2FpbiBhY2Nlc3MgdG8gYW4gaW5jcmVhc2VkIHJhdGUtbGltaXQsIGl0IGlzIGhpZ2hseVxuICogIHJlY29tbWVuZGVkIHRvIFtzaWduIHVwIGhlcmVdKGxpbmstcG9ja2V0LXNpZ251cCkuXG4gKi9cbmV4cG9ydCBjbGFzcyBQb2NrZXRQcm92aWRlciBleHRlbmRzIEpzb25ScGNQcm92aWRlciB7XG4gICAgLyoqXG4gICAgICogIFRoZSBBcHBsaWNhdGlvbiBJRCBmb3IgdGhlIFBvY2tldCBjb25uZWN0aW9uLlxuICAgICAqL1xuICAgIGFwcGxpY2F0aW9uSWQ7XG4gICAgLyoqXG4gICAgICogIFRoZSBBcHBsaWNhdGlvbiBTZWNyZXQgZm9yIG1ha2luZyBhdXRoZW50aWNhdGVkIHJlcXVlc3RzXG4gICAgICogIHRvIHRoZSBQb2NrZXQgY29ubmVjdGlvbi5cbiAgICAgKi9cbiAgICBhcHBsaWNhdGlvblNlY3JldDtcbiAgICAvKipcbiAgICAgKiAgQ3JlYXRlIGEgbmV3ICoqUG9ja2V0UHJvdmlkZXIqKi5cbiAgICAgKlxuICAgICAqICBCeSBkZWZhdWx0IGNvbm5lY3RpbmcgdG8gYGBtYWlubmV0YGAgd2l0aCBhIGhpZ2hseSB0aHJvdHRsZWRcbiAgICAgKiAgQVBJIGtleS5cbiAgICAgKi9cbiAgICBjb25zdHJ1Y3RvcihfbmV0d29yaywgYXBwbGljYXRpb25JZCwgYXBwbGljYXRpb25TZWNyZXQpIHtcbiAgICAgICAgaWYgKF9uZXR3b3JrID09IG51bGwpIHtcbiAgICAgICAgICAgIF9uZXR3b3JrID0gXCJtYWlubmV0XCI7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgbmV0d29yayA9IE5ldHdvcmsuZnJvbShfbmV0d29yayk7XG4gICAgICAgIGlmIChhcHBsaWNhdGlvbklkID09IG51bGwpIHtcbiAgICAgICAgICAgIGFwcGxpY2F0aW9uSWQgPSBkZWZhdWx0QXBwbGljYXRpb25JZDtcbiAgICAgICAgfVxuICAgICAgICBpZiAoYXBwbGljYXRpb25TZWNyZXQgPT0gbnVsbCkge1xuICAgICAgICAgICAgYXBwbGljYXRpb25TZWNyZXQgPSBudWxsO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IG9wdGlvbnMgPSB7IHN0YXRpY05ldHdvcms6IG5ldHdvcmsgfTtcbiAgICAgICAgY29uc3QgcmVxdWVzdCA9IFBvY2tldFByb3ZpZGVyLmdldFJlcXVlc3QobmV0d29yaywgYXBwbGljYXRpb25JZCwgYXBwbGljYXRpb25TZWNyZXQpO1xuICAgICAgICBzdXBlcihyZXF1ZXN0LCBuZXR3b3JrLCBvcHRpb25zKTtcbiAgICAgICAgZGVmaW5lUHJvcGVydGllcyh0aGlzLCB7IGFwcGxpY2F0aW9uSWQsIGFwcGxpY2F0aW9uU2VjcmV0IH0pO1xuICAgIH1cbiAgICBfZ2V0UHJvdmlkZXIoY2hhaW5JZCkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBQb2NrZXRQcm92aWRlcihjaGFpbklkLCB0aGlzLmFwcGxpY2F0aW9uSWQsIHRoaXMuYXBwbGljYXRpb25TZWNyZXQpO1xuICAgICAgICB9XG4gICAgICAgIGNhdGNoIChlcnJvcikgeyB9XG4gICAgICAgIHJldHVybiBzdXBlci5fZ2V0UHJvdmlkZXIoY2hhaW5JZCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqICBSZXR1cm5zIGEgcHJlcGFyZWQgcmVxdWVzdCBmb3IgY29ubmVjdGluZyB0byAlJW5ldHdvcmslJSB3aXRoXG4gICAgICogICUlYXBwbGljYXRpb25JZCUlLlxuICAgICAqL1xuICAgIHN0YXRpYyBnZXRSZXF1ZXN0KG5ldHdvcmssIGFwcGxpY2F0aW9uSWQsIGFwcGxpY2F0aW9uU2VjcmV0KSB7XG4gICAgICAgIGlmIChhcHBsaWNhdGlvbklkID09IG51bGwpIHtcbiAgICAgICAgICAgIGFwcGxpY2F0aW9uSWQgPSBkZWZhdWx0QXBwbGljYXRpb25JZDtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCByZXF1ZXN0ID0gbmV3IEZldGNoUmVxdWVzdChgaHR0cHM6L1xcLyR7Z2V0SG9zdChuZXR3b3JrLm5hbWUpfS92MS9sYi8ke2FwcGxpY2F0aW9uSWR9YCk7XG4gICAgICAgIHJlcXVlc3QuYWxsb3dHemlwID0gdHJ1ZTtcbiAgICAgICAgaWYgKGFwcGxpY2F0aW9uU2VjcmV0KSB7XG4gICAgICAgICAgICByZXF1ZXN0LnNldENyZWRlbnRpYWxzKFwiXCIsIGFwcGxpY2F0aW9uU2VjcmV0KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoYXBwbGljYXRpb25JZCA9PT0gZGVmYXVsdEFwcGxpY2F0aW9uSWQpIHtcbiAgICAgICAgICAgIHJlcXVlc3QucmV0cnlGdW5jID0gYXN5bmMgKHJlcXVlc3QsIHJlc3BvbnNlLCBhdHRlbXB0KSA9PiB7XG4gICAgICAgICAgICAgICAgc2hvd1Rocm90dGxlTWVzc2FnZShcIlBvY2tldFByb3ZpZGVyXCIpO1xuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVxdWVzdDtcbiAgICB9XG4gICAgaXNDb21tdW5pdHlSZXNvdXJjZSgpIHtcbiAgICAgICAgcmV0dXJuICh0aGlzLmFwcGxpY2F0aW9uSWQgPT09IGRlZmF1bHRBcHBsaWNhdGlvbklkKTtcbiAgICB9XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1wcm92aWRlci1wb2NrZXQuanMubWFwIiwiY29uc3QgSXBjU29ja2V0UHJvdmlkZXIgPSB1bmRlZmluZWQ7XG5leHBvcnQgeyBJcGNTb2NrZXRQcm92aWRlciB9O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9cHJvdmlkZXItaXBjc29ja2V0LWJyb3dzZXIuanMubWFwIiwiaW1wb3J0IHsgZ2V0QWRkcmVzcywgcmVzb2x2ZUFkZHJlc3MgfSBmcm9tIFwiLi4vYWRkcmVzcy9pbmRleC5qc1wiO1xuaW1wb3J0IHsgaGFzaEF1dGhvcml6YXRpb24sIGhhc2hNZXNzYWdlLCBUeXBlZERhdGFFbmNvZGVyIH0gZnJvbSBcIi4uL2hhc2gvaW5kZXguanNcIjtcbmltcG9ydCB7IEFic3RyYWN0U2lnbmVyLCBjb3B5UmVxdWVzdCB9IGZyb20gXCIuLi9wcm92aWRlcnMvaW5kZXguanNcIjtcbmltcG9ydCB7IGNvbXB1dGVBZGRyZXNzLCBUcmFuc2FjdGlvbiB9IGZyb20gXCIuLi90cmFuc2FjdGlvbi9pbmRleC5qc1wiO1xuaW1wb3J0IHsgZGVmaW5lUHJvcGVydGllcywgZ2V0QmlnSW50LCByZXNvbHZlUHJv
26774cGVydGllcywgYXNzZXJ0LCBhc3NlcnRBcmd1bWVudCB9IGZyb20gXCIuLi91dGlscy9pbmRleC5qc1wiO1xuLyoqXG4gKiAgVGhlICoqQmFzZVdhbGxldCoqIGlzIGEgc3RyZWFtLWxpbmVkIGltcGxlbWVudGF0aW9uIG9mIGFcbiAqICBbW1NpZ25lcl1dIHRoYXQgb3BlcmF0ZXMgd2l0aCBhIHByaXZhdGUga2V5LlxuICpcbiAqICBJdCBpcyBwcmVmZXJyZWQgdG8gdXNlIHRoZSBbW1dhbGxldF1dIGNsYXNzLCBhcyBpdCBvZmZlcnNcbiAqICBhZGRpdGlvbmFsIGZ1bmN0aW9uYWxpdHkgYW5kIHNpbXBsaWZpZXMgbG9hZGluZyBhIHZhcmlldHlcbiAqICBvZiBKU09OIGZvcm1hdHMsIE1uZW1vbmljIFBocmFzZXMsIGV0Yy5cbiAqXG4gKiAgVGhpcyBjbGFzcyBtYXkgYmUgb2YgdXNlIGZvciB0aG9zZSBhdHRlbXB0aW5nIHRvIGltcGxlbWVudFxuICogIGEgbWluaW1hbCBTaWduZXIuXG4gKi9cbmV4cG9ydCBjbGFzcyBCYXNlV2FsbGV0IGV4dGVuZHMgQWJzdHJhY3RTaWduZXIge1xuICAgIC8qKlxuICAgICAqICBUaGUgd2FsbGV0IGFkZHJlc3MuXG4gICAgICovXG4gICAgYWRkcmVzcztcbiAgICAjc2lnbmluZ0tleTtcbiAgICAvKipcbiAgICAgKiAgQ3JlYXRlcyBhIG5ldyBCYXNlV2FsbGV0IGZvciAlJXByaXZhdGVLZXklJSwgb3B0aW9uYWxseVxuICAgICAqICBjb25uZWN0ZWQgdG8gJSVwcm92aWRlciUlLlxuICAgICAqXG4gICAgICogIElmICUlcHJvdmlkZXIlJSBpcyBub3Qgc3BlY2lmaWVkLCBvbmx5IG9mZmxpbmUgbWV0aG9kcyBjYW5cbiAgICAgKiAgYmUgdXNlZC5cbiAgICAgKi9cbiAgICBjb25zdHJ1Y3Rvcihwcml2YXRlS2V5LCBwcm92aWRlcikge1xuICAgICAgICBzdXBlcihwcm92aWRlcik7XG4gICAgICAgIGFzc2VydEFyZ3VtZW50KHByaXZhdGVLZXkgJiYgdHlwZW9mIChwcml2YXRlS2V5LnNpZ24pID09PSBcImZ1bmN0aW9uXCIsIFwiaW52YWxpZCBwcml2YXRlIGtleVwiLCBcInByaXZhdGVLZXlcIiwgXCJbIFJFREFDVEVEIF1cIik7XG4gICAgICAgIHRoaXMuI3NpZ25pbmdLZXkgPSBwcml2YXRlS2V5O1xuICAgICAgICBjb25zdCBhZGRyZXNzID0gY29tcHV0ZUFkZHJlc3ModGhpcy5zaWduaW5nS2V5LnB1YmxpY0tleSk7XG4gICAgICAgIGRlZmluZVByb3BlcnRpZXModGhpcywgeyBhZGRyZXNzIH0pO1xuICAgIH1cbiAgICAvLyBTdG9yZSBwcml2YXRlIHZhbHVlcyBiZWhpbmQgZ2V0dGVycyB0byByZWR1Y2UgdmlzaWJpbGl0eVxuICAgIC8vIGluIGNvbnNvbGUubG9nXG4gICAgLyoqXG4gICAgICogIFRoZSBbW1NpZ25pbmdLZXldXSB1c2VkIGZvciBzaWduaW5nIHBheWxvYWRzLlxuICAgICAqL1xuICAgIGdldCBzaWduaW5nS2V5KCkgeyByZXR1cm4gdGhpcy4jc2lnbmluZ0tleTsgfVxuICAgIC8qKlxuICAgICAqICBUaGUgcHJpdmF0ZSBrZXkgZm9yIHRoaXMgd2FsbGV0LlxuICAgICAqL1xuICAgIGdldCBwcml2YXRlS2V5KCkgeyByZXR1cm4gdGhpcy5zaWduaW5nS2V5LnByaXZhdGVLZXk7IH1cbiAgICBhc3luYyBnZXRBZGRyZXNzKCkgeyByZXR1cm4gdGhpcy5hZGRyZXNzOyB9XG4gICAgY29ubmVjdChwcm92aWRlcikge1xuICAgICAgICByZXR1cm4gbmV3IEJhc2VXYWxsZXQodGhpcy4jc2lnbmluZ0tleSwgcHJvdmlkZXIpO1xuICAgIH1cbiAgICBhc3luYyBzaWduVHJhbnNhY3Rpb24odHgpIHtcbiAgICAgICAgdHggPSBjb3B5UmVxdWVzdCh0eCk7XG4gICAgICAgIC8vIFJlcGxhY2UgYW55IEFkZHJlc3NhYmxlIG9yIEVOUyBuYW1lIHdpdGggYW4gYWRkcmVzc1xuICAgICAgICBjb25zdCB7IHRvLCBmcm9tIH0gPSBhd2FpdCByZXNvbHZlUHJvcGVydGllcyh7XG4gICAgICAgICAgICB0bzogKHR4LnRvID8gcmVzb2x2ZUFkZHJlc3ModHgudG8sIHRoaXMpIDogdW5kZWZpbmVkKSxcbiAgICAgICAgICAgIGZyb206ICh0eC5mcm9tID8gcmVzb2x2ZUFkZHJlc3ModHguZnJvbSwgdGhpcykgOiB1bmRlZmluZWQpXG4gICAgICAgIH0pO1xuICAgICAgICBpZiAodG8gIT0gbnVsbCkge1xuICAgICAgICAgICAgdHgudG8gPSB0bztcbiAgICAgICAgfVxuICAgICAgICBpZiAoZnJvbSAhPSBudWxsKSB7XG4gICAgICAgICAgICB0eC5mcm9tID0gZnJvbTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHguZnJvbSAhPSBudWxsKSB7XG4gICAgICAgICAgICBhc3NlcnRBcmd1bWVudChnZXRBZGRyZXNzKCh0eC5mcm9tKSkgPT09IHRoaXMuYWRkcmVzcywgXCJ0cmFuc2FjdGlvbiBmcm9tIGFkZHJlc3MgbWlzbWF0Y2hcIiwgXCJ0eC5mcm9tXCIsIHR4LmZyb20pO1xuICAgICAgICAgICAgZGVsZXRlIHR4LmZyb207XG4gICAgICAgIH1cbiAgICAgICAgLy8gQnVpbGQgdGhlIHRyYW5zYWN0aW9uXG4gICAgICAgIGNvbnN0IGJ0eCA9IFRyYW5zYWN0aW9uLmZyb20odHgpO1xuICAgICAgICBidHguc2lnbmF0dXJlID0gdGhpcy5zaWduaW5nS2V5LnNpZ24oYnR4LnVuc2lnbmVkSGFzaCk7XG4gICAgICAgIHJldHVybiBidHguc2VyaWFsaXplZDtcbiAgICB9XG4gICAgYXN5bmMgc2lnbk1lc3NhZ2UobWVzc2FnZSkge1xuICAgICAgICByZXR1cm4gdGhpcy5zaWduTWVzc2FnZVN5bmMobWVzc2FnZSk7XG4gICAgfVxuICAgIC8vIEBUT0RPOiBBZGQgYSBzZWNpYWxpemVkIHNpZ25UeCBhbmQgc2lnblR5cGVkIHN5bmMgdGhhdCBlbmZvcmNlc1xuICAgIC8vIGFsbCBwYXJhbWV0ZXJzIGFyZSBrbm93bj9cbiAgICAvKipcbiAgICAgKiAgUmV0dXJucyB0aGUgc2lnbmF0dXJlIGZvciAlJW1lc3NhZ2UlJSBzaWduZWQgd2l0aCB0aGlzIHdhbGxldC5cbiAgICAgKi9cbiAgICBzaWduTWVzc2FnZVN5bmMobWVzc2FnZSkge1xuICAgICAgICByZXR1cm4gdGhpcy5zaWduaW5nS2V5LnNpZ24oaGFzaE1lc3NhZ2UobWVzc2FnZSkpLnNlcmlhbGl6ZWQ7XG4gICAgfVxuICAgIC8qKlxuICAgICAqICBSZXR1cm5zIHRoZSBBdXRob3JpemF0aW9uIGZvciAlJWF1dGglJS5cbiAgICAgKi9cbiAgICBhdXRob3JpemVTeW5jKGF1dGgpIHtcbiAgICAgICAgYXNzZXJ0QXJndW1lbnQodHlwZW9mIChhdXRoLmFkZHJlc3MpID09PSBcInN0cmluZ1wiLCBcImludmFsaWQgYWRkcmVzcyBmb3IgYXV0aG9yaXplU3luY1wiLCBcImF1dGguYWRkcmVzc1wiLCBhdXRoKTtcbiAgICAgICAgY29uc3Qgc2lnbmF0dXJlID0gdGhpcy5zaWduaW5nS2V5LnNpZ24oaGFzaEF1dGhvcml6YXRpb24oYXV0aCkpO1xuICAgICAgICByZXR1cm4gT2JqZWN0LmFzc2lnbih7fSwge1xuICAgICAgICAgICAgYWRkcmVzczogZ2V0QWRkcmVzcyhhdXRoLmFkZHJlc3MpLFxuICAgICAgICAgICAgbm9uY2U6IGdldEJpZ0ludChhdXRoLm5vbmNlIHx8IDApLFxuICAgICAgICAgICAgY2hhaW5JZDogZ2V0QmlnSW50KGF1dGguY2hhaW5JZCB8fCAwKSxcbiAgICAgICAgfSwgeyBzaWduYXR1cmUgfSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqICBSZXNvbHZlcyB0byB0aGUgQXV0aG9yaXphdGlvbiBmb3IgJSVhdXRoJSUuXG4gICAgICovXG4gICAgYXN5bmMgYXV0aG9yaXplKGF1dGgpIHtcbiAgICAgICAgYXV0aCA9IE9iamVjdC5hc3NpZ24oe30sIGF1dGgsIHtcbiAgICAgICAgICAgIGFkZHJlc3M6IGF3YWl0IHJlc29sdmVBZGRyZXNzKGF1dGguYWRkcmVzcywgdGhpcylcbiAgICAgICAgfSk7XG4gICAgICAgI
26774HJldHVybiB0aGlzLmF1dGhvcml6ZVN5bmMoYXdhaXQgdGhpcy5wb3B1bGF0ZUF1dGhvcml6YXRpb24oYXV0aCkpO1xuICAgIH1cbiAgICBhc3luYyBzaWduVHlwZWREYXRhKGRvbWFpbiwgdHlwZXMsIHZhbHVlKSB7XG4gICAgICAgIC8vIFBvcHVsYXRlIGFueSBFTlMgbmFtZXNcbiAgICAgICAgY29uc3QgcG9wdWxhdGVkID0gYXdhaXQgVHlwZWREYXRhRW5jb2Rlci5yZXNvbHZlTmFtZXMoZG9tYWluLCB0eXBlcywgdmFsdWUsIGFzeW5jIChuYW1lKSA9PiB7XG4gICAgICAgICAgICAvLyBAVE9ETzogdGhpcyBzaG91bGQgdXNlIHJlc29sdmVOYW1lOyBhZGRyZXNzZXMgZG9uJ3RcbiAgICAgICAgICAgIC8vICAgICAgICBuZWVkIGEgcHJvdmlkZXJcbiAgICAgICAgICAgIGFzc2VydCh0aGlzLnByb3ZpZGVyICE9IG51bGwsIFwiY2Fubm90IHJlc29sdmUgRU5TIG5hbWVzIHdpdGhvdXQgYSBwcm92aWRlclwiLCBcIlVOU1VQUE9SVEVEX09QRVJBVElPTlwiLCB7XG4gICAgICAgICAgICAgICAgb3BlcmF0aW9uOiBcInJlc29sdmVOYW1lXCIsXG4gICAgICAgICAgICAgICAgaW5mbzogeyBuYW1lIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgY29uc3QgYWRkcmVzcyA9IGF3YWl0IHRoaXMucHJvdmlkZXIucmVzb2x2ZU5hbWUobmFtZSk7XG4gICAgICAgICAgICBhc3NlcnQoYWRkcmVzcyAhPSBudWxsLCBcInVuY29uZmlndXJlZCBFTlMgbmFtZVwiLCBcIlVOQ09ORklHVVJFRF9OQU1FXCIsIHtcbiAgICAgICAgICAgICAgICB2YWx1ZTogbmFtZVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICByZXR1cm4gYWRkcmVzcztcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiB0aGlzLnNpZ25pbmdLZXkuc2lnbihUeXBlZERhdGFFbmNvZGVyLmhhc2gocG9wdWxhdGVkLmRvbWFpbiwgdHlwZXMsIHBvcHVsYXRlZC52YWx1ZSkpLnNlcmlhbGl6ZWQ7XG4gICAgfVxufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9YmFzZS13YWxsZXQuanMubWFwIiwiaW1wb3J0IHsgYXNzZXJ0QXJndW1lbnQgfSBmcm9tIFwiLi4vdXRpbHMvaW5kZXguanNcIjtcbmNvbnN0IHN1YnNDaHJzID0gXCIgISMkJSYnKCkqKywtLi88PT4/QFtdXl9ge3x9flwiO1xuY29uc3QgV29yZCA9IC9eW2Etel0qJC9pO1xuZnVuY3Rpb24gdW5mb2xkKHdvcmRzLCBzZXApIHtcbiAgICBsZXQgaW5pdGlhbCA9IDk3O1xuICAgIHJldHVybiB3b3Jkcy5yZWR1Y2UoKGFjY3VtLCB3b3JkKSA9PiB7XG4gICAgICAgIGlmICh3b3JkID09PSBzZXApIHtcbiAgICAgICAgICAgIGluaXRpYWwrKztcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmICh3b3JkLm1hdGNoKFdvcmQpKSB7XG4gICAgICAgICAgICBhY2N1bS5wdXNoKFN0cmluZy5mcm9tQ2hhckNvZGUoaW5pdGlhbCkgKyB3b3JkKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGluaXRpYWwgPSA5NztcbiAgICAgICAgICAgIGFjY3VtLnB1c2god29yZCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGFjY3VtO1xuICAgIH0sIFtdKTtcbn1cbi8qKlxuICogIEBfaWdub3JlXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBkZWNvZGUoZGF0YSwgc3Vicykge1xuICAgIC8vIFJlcGxhY2UgYWxsIHRoZSBzdWJzdGl0dXRpb25zIHdpdGggdGhlaXIgZXhwYW5kZWQgZm9ybVxuICAgIGZvciAobGV0IGkgPSBzdWJzQ2hycy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xuICAgICAgICBkYXRhID0gZGF0YS5zcGxpdChzdWJzQ2hyc1tpXSkuam9pbihzdWJzLnN1YnN0cmluZygyICogaSwgMiAqIGkgKyAyKSk7XG4gICAgfVxuICAgIC8vIEdldCBhbGwgdGxlIGNsdW1wczsgZWFjaCBzdWZmaXgsIGZpcnN0LWluY3JlbWVudCBhbmQgc2Vjb25kLWluY3JlbWVudFxuICAgIGNvbnN0IGNsdW1wcyA9IFtdO1xuICAgIGNvbnN0IGxlZnRvdmVyID0gZGF0YS5yZXBsYWNlKC8oOnwoWzAtOV0pfChbQS1aXVthLXpdKikpL2csIChhbGwsIGl0ZW0sIHNlbWksIHdvcmQpID0+IHtcbiAgICAgICAgaWYgKHNlbWkpIHtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSBwYXJzZUludChzZW1pKTsgaSA+PSAwOyBpLS0pIHtcbiAgICAgICAgICAgICAgICBjbHVtcHMucHVzaChcIjtcIik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBjbHVtcHMucHVzaChpdGVtLnRvTG93ZXJDYXNlKCkpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBcIlwiO1xuICAgIH0pO1xuICAgIC8qIGM4IGlnbm9yZSBzdGFydCAqL1xuICAgIGlmIChsZWZ0b3Zlcikge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYGxlZnRvdmVyczogJHtKU09OLnN0cmluZ2lmeShsZWZ0b3Zlcil9YCk7XG4gICAgfVxuICAgIC8qIGM4IGlnbm9yZSBzdG9wICovXG4gICAgcmV0dXJuIHVuZm9sZCh1bmZvbGQoY2x1bXBzLCBcIjtcIiksIFwiOlwiKTtcbn1cbi8qKlxuICogIEBfaWdub3JlXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBkZWNvZGVPd2woZGF0YSkge1xuICAgIGFzc2VydEFyZ3VtZW50KGRhdGFbMF0gPT09IFwiMFwiLCBcInVuc3VwcG9ydGVkIGF1d2wgZGF0YVwiLCBcImRhdGFcIiwgZGF0YSk7XG4gICAgcmV0dXJuIGRlY29kZShkYXRhLnN1YnN0cmluZygxICsgMiAqIHN1YnNDaHJzLmxlbmd0aCksIGRhdGEuc3Vic3RyaW5nKDEsIDEgKyAyICogc3Vic0NocnMubGVuZ3RoKSk7XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1kZWNvZGUtb3dsLmpzLm1hcCIsImltcG9ydCB7IGRlZmluZVByb3BlcnRpZXMgfSBmcm9tIFwiLi4vdXRpbHMvaW5kZXguanNcIjtcbi8qKlxuICogIEEgV29yZGxpc3QgcmVwcmVzZW50cyBhIGNvbGxlY3Rpb24gb2YgbGFuZ3VhZ2Utc3BlY2lmaWNcbiAqICB3b3JkcyB1c2VkIHRvIGVuY29kZSBhbmQgZGV2b2NlIFtbbGluay1iaXAtMzldXSBlbmNvZGVkIGRhdGFcbiAqICBieSBtYXBwaW5nIHdvcmRzIHRvIDExLWJpdCB2YWx1ZXMgYW5kIHZpY2UgdmVyc2EuXG4gKi9cbmV4cG9ydCBjbGFzcyBXb3JkbGlzdCB7XG4gICAgbG9jYWxlO1xuICAgIC8qKlxuICAgICAqICBDcmVhdGVzIGEgbmV3IFdvcmRsaXN0IGluc3RhbmNlLlxuICAgICAqXG4gICAgICogIFN1Yi1jbGFzc2VzIE1VU1QgY2FsbCB0aGlzIGlmIHRoZXkgcHJvdmlkZSB0aGVpciBvd24gY29uc3RydWN0b3IsXG4gICAgICogIHBhc3NpbmcgaW4gdGhlIGxvY2FsZSBzdHJpbmcgb2YgdGhlIGxhbmd1YWdlLlxuICAgICAqXG4gICAgICogIEdlbmVyYWxseSB0aGVyZSBpcyBubyBuZWVkIHRvIGNyZWF0ZSBpbnN0YW5jZXMgb2YgYSBXb3JkbGlzdCxcbiAgICAgKiAgc2luY2UgZWFjaCBsYW5ndWFnZS1zcGVjaWZpYyBXb3JkbGlzdCBjcmVhdGVzIGFuIGluc3RhbmNlIGFuZFxuICAgICAqICB0aGVyZSBpcyBubyBzdGF0ZSBrZXB0IGludGVybmFsbHksIHNvIHRoZXkgYXJlIHNhZmUgdG8gc2hhcmUuXG4gICAgICovXG4gICAgY29uc3RydWN0b3IobG9jYWxlKSB7XG4gICAgICAgIGRlZmluZVByb3BlcnRpZXModGhpcywgeyBsb2NhbGUgfSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqICBTdWItY2xhc3NlcyBtYXkgb3ZlcnJpZGUgdGhpcyB0byBwcm92aWRlIGEgbGFuZ3VhZ2Utc3BlY2lmaWNcbiAgICAgKiAgbWV0aG9kIGZvciBzcGxpdGluZyAlJXBocmFzZSUlIGludG8gaW5kaXZpZHVhbCB3b3Jkcy5cbiAgICAgKlxuICAgICAqICBCeSBkZWZh
26774dWx0LCAlJXBocmFzZSUlIGlzIHNwbGl0IHVzaW5nIGFueSBzZXF1ZW5jZXMgb2ZcbiAgICAgKiAgd2hpdGUtc3BhY2UgYXMgZGVmaW5lZCBieSByZWd1bGFyIGV4cHJlc3Npb25zIChpLmUuIGBgL1xccysvYGApLlxuICAgICAqL1xuICAgIHNwbGl0KHBocmFzZSkge1xuICAgICAgICByZXR1cm4gcGhyYXNlLnRvTG93ZXJDYXNlKCkuc3BsaXQoL1xccysvZyk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqICBTdWItY2xhc3NlcyBtYXkgb3ZlcnJpZGUgdGhpcyB0byBwcm92aWRlciBhIGxhbmd1YWdlLXNwZWNpZmljXG4gICAgICogIG1ldGhvZCBmb3Igam9pbmluZyAlJXdvcmRzJSUgaW50byBhIHBocmFzZS5cbiAgICAgKlxuICAgICAqICBCeSBkZWZhdWx0LCAlJXdvcmRzJSUgYXJlIGpvaW5lZCBieSBhIHNpbmdsZSBzcGFjZS5cbiAgICAgKi9cbiAgICBqb2luKHdvcmRzKSB7XG4gICAgICAgIHJldHVybiB3b3Jkcy5qb2luKFwiIFwiKTtcbiAgICB9XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD13b3JkbGlzdC5qcy5tYXAiLCIvLyBVc2UgdGhlIGVuY29kZS1sYXRpbi5qcyBzY3JpcHQgdG8gY3JlYXRlIHRoZSBuZWNlc3Nhcnlcbi8vIGRhdGEgZmlsZXMgdG8gYmUgY29uc3VtZWQgYnkgdGhpcyBjbGFzc1xuaW1wb3J0IHsgaWQgfSBmcm9tIFwiLi4vaGFzaC9pbmRleC5qc1wiO1xuaW1wb3J0IHsgYXNzZXJ0QXJndW1lbnQgfSBmcm9tIFwiLi4vdXRpbHMvaW5kZXguanNcIjtcbmltcG9ydCB7IGRlY29kZU93bCB9IGZyb20gXCIuL2RlY29kZS1vd2wuanNcIjtcbmltcG9ydCB7IFdvcmRsaXN0IH0gZnJvbSBcIi4vd29yZGxpc3QuanNcIjtcbi8qKlxuICogIEFuIE9XTCBmb3JtYXQgV29yZGxpc3QgaXMgYW4gZW5jb2RpbmcgbWV0aG9kIHRoYXQgZXhwbG9pdHNcbiAqICB0aGUgZ2VuZXJhbCBsb2NhbGl0eSBvZiBhbHBoYWJldGljYWxseSBzb3J0ZWQgd29yZHMgdG9cbiAqICBhY2hpZXZlIGEgc2ltcGxlIGJ1dCBlZmZlY3RpdmUgbWVhbnMgb2YgY29tcHJlc3Npb24uXG4gKlxuICogIFRoaXMgY2xhc3MgaXMgZ2VuZXJhbGx5IG5vdCB1c2VmdWwgdG8gbW9zdCBkZXZlbG9wZXJzIGFzXG4gKiAgaXQgaXMgdXNlZCBtYWlubHkgaW50ZXJuYWxseSB0byBrZWVwIFdvcmRsaXN0cyBmb3IgbGFuZ3VhZ2VzXG4gKiAgYmFzZWQgb24gQVNDSUktNyBzbWFsbC5cbiAqXG4gKiAgSWYgbmVjZXNzYXJ5LCB0aGVyZSBhcmUgdG9vbHMgd2l0aGluIHRoZSBgYGdlbmVyYXRpb24vYGAgZm9sZGVyXG4gKiAgdG8gY3JlYXRlIHRoZSBuZWNlc3NhcnkgZGF0YS5cbiAqL1xuZXhwb3J0IGNsYXNzIFdvcmRsaXN0T3dsIGV4dGVuZHMgV29yZGxpc3Qge1xuICAgICNkYXRhO1xuICAgICNjaGVja3N1bTtcbiAgICAvKipcbiAgICAgKiAgQ3JlYXRlcyBhIG5ldyBXb3JkbGlzdCBmb3IgJSVsb2NhbGUlJSB1c2luZyB0aGUgT1dMICUlZGF0YSUlXG4gICAgICogIGFuZCB2YWxpZGF0ZWQgYWdhaW5zdCB0aGUgJSVjaGVja3N1bSUlLlxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yKGxvY2FsZSwgZGF0YSwgY2hlY2tzdW0pIHtcbiAgICAgICAgc3VwZXIobG9jYWxlKTtcbiAgICAgICAgdGhpcy4jZGF0YSA9IGRhdGE7XG4gICAgICAgIHRoaXMuI2NoZWNrc3VtID0gY2hlY2tzdW07XG4gICAgICAgIHRoaXMuI3dvcmRzID0gbnVsbDtcbiAgICB9XG4gICAgLyoqXG4gICAgICogIFRoZSBPV0wtZW5jb2RlZCBkYXRhLlxuICAgICAqL1xuICAgIGdldCBfZGF0YSgpIHsgcmV0dXJuIHRoaXMuI2RhdGE7IH1cbiAgICAvKipcbiAgICAgKiAgRGVjb2RlIGFsbCB0aGUgd29yZHMgZm9yIHRoZSB3b3JkbGlzdC5cbiAgICAgKi9cbiAgICBfZGVjb2RlV29yZHMoKSB7XG4gICAgICAgIHJldHVybiBkZWNvZGVPd2wodGhpcy4jZGF0YSk7XG4gICAgfVxuICAgICN3b3JkcztcbiAgICAjbG9hZFdvcmRzKCkge1xuICAgICAgICBpZiAodGhpcy4jd29yZHMgPT0gbnVsbCkge1xuICAgICAgICAgICAgY29uc3Qgd29yZHMgPSB0aGlzLl9kZWNvZGVXb3JkcygpO1xuICAgICAgICAgICAgLy8gVmVyaWZ5IHRoZSBjb21wdXRlZCBsaXN0IG1hdGNoZXMgdGhlIG9mZmljaWFsIGxpc3RcbiAgICAgICAgICAgIGNvbnN0IGNoZWNrc3VtID0gaWQod29yZHMuam9pbihcIlxcblwiKSArIFwiXFxuXCIpO1xuICAgICAgICAgICAgLyogYzggaWdub3JlIHN0YXJ0ICovXG4gICAgICAgICAgICBpZiAoY2hlY2tzdW0gIT09IHRoaXMuI2NoZWNrc3VtKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBCSVAzOSBXb3JkbGlzdCBmb3IgJHt0aGlzLmxvY2FsZX0gRkFJTEVEYCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvKiBjOCBpZ25vcmUgc3RvcCAqL1xuICAgICAgICAgICAgdGhpcy4jd29yZHMgPSB3b3JkcztcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy4jd29yZHM7XG4gICAgfVxuICAgIGdldFdvcmQoaW5kZXgpIHtcbiAgICAgICAgY29uc3Qgd29yZHMgPSB0aGlzLiNsb2FkV29yZHMoKTtcbiAgICAgICAgYXNzZXJ0QXJndW1lbnQoaW5kZXggPj0gMCAmJiBpbmRleCA8IHdvcmRzLmxlbmd0aCwgYGludmFsaWQgd29yZCBpbmRleDogJHtpbmRleH1gLCBcImluZGV4XCIsIGluZGV4KTtcbiAgICAgICAgcmV0dXJuIHdvcmRzW2luZGV4XTtcbiAgICB9XG4gICAgZ2V0V29yZEluZGV4KHdvcmQpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuI2xvYWRXb3JkcygpLmluZGV4T2Yod29yZCk7XG4gICAgfVxufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9d29yZGxpc3Qtb3dsLmpzLm1hcCIsImltcG9ydCB7IFdvcmRsaXN0T3dsIH0gZnJvbSBcIi4vd29yZGxpc3Qtb3dsLmpzXCI7XG5jb25zdCB3b3JkcyA9IFwiMGVybGVvbmFsb3JlbnNlaW5jZXJlZ2VzdGljaXRTdGFudmV0ZWFyY3Rzc2kjY2gyQXRoY2smdG5lTGwwQW5kI0lsLnlMZU91dE89U3xTJWIvcmFAU3VyZFUnMENlW0NpZHxDb3VudEN1J0hpZT1JZE91LC1RdWkqUm9bVFRdVCVUKltUdSQwQXB0REQtdEQqW0p1LE0uVWx0VjwpVmkpMFJvYi0wRmFpckYlZFJhaWQwQShFRW50UmVlMEVhZDBNUlJwJXRTIV9
26774ybUJ1bUNvaG9sRXJ0SSZMTGV5TG93TW8sT31QaGFSZWFkeVNvVCBXYXlzMEE+dXJBeihnT25nT3VudFUnZDBBbHksQ2glQ2l8RyBHIUdyeUltJEshTm91bilOdSRPYCBTdyBUJm5hVGlxdWVYaWV0eVkxQXJ0T2xvZ3lQZT9QIVBybz1SaWwxQ2hDdC1FYUVuYUd1ZU1NZWRNJU15T3VuZFI8K1JlLFJpPVJvd1RUZWZhQFRpLFR3JWswS1BlQFNhdWx0U2V0U2ksU3VtZVRobWEwSCE+T21UYXtUJmRULnVkZVRyYUAwQ3RdRC5HdSxOdFRoJVRvVHVtbjBFcmErT2NhZG9PaWQwQWtlQSpBeUVzb21lRnVsS3c/ZDBJczpCeUNoZWwlQyNEK0dMPClMYyN5fk1ib29OPGFObiBSUmVseVJnYShSKmxTZVMtU2tldFR0ITNBXkFuQXV0eUNhdSdDb21lRWZGJWVHKEhhPUgoZExpZT1Mb3dMdE5eTmVmLi9UcmF5VHQgVHdlJlkjZDNDeWMhREtlTmRPbG9neVJkUmBUdCBfe0FkZUFtZUFua2V0QSxFYWtFW0luZE9vZE9bb21PdSdVZVVyVXNoX3JkQXREeUlsTWJOZU51c09rTyxSZCBSKGdScm93U3NUdG9tVW4pWFlfe2V0QShBbmRBW0E9RWFkRWV6ZUl7SWQrSWVmSWdodEluZ0lza09jY29saU9rJk9uemVPb21PYCBPd25Vc2gyQmIhRGR5RCt0RmYkb0lsZExiTGtMIXROZCFOayBSZCZSZyBSLFNTKGVbU3lUdCBZIFp6OkJiYStCKEIhQ3R1c0dlS2V+TG1NIGFNcE5OJE4pbE5keU5uI05vZU52YXNOeSNQYWIhUC4kUHRhKFJSYiNSZFJnb1JwZXRScnlSdFNlU2hTKG8vIVN1JFRUJG9nVF5UZWcleVR0IVVnaHRVJ1V0XVZlM0lsKGdMIHlNfE5zdXNOdHVyeVJlJFJ0YShfaXJBbGtBbXBdQW4rQW9zQXB0IEFyK0EnQXRFYXBFe0VlJ0VmRXJyeUUsSXsmSWVmSWxkSW19eU9pKU9vJ1IjLVV7IVVua1VybjBHP05uYW0jUmMhVGl6JlR5VmlsX2ltQXBBcmlmeUF3QXlFPEVya0V2IEl7SXxJZmZJbWJJbi1JcE97T2dPJ09gT3VkT3duVWJVbXBVLCBVdF5fXkEsQyN1dERlRmZlZUlsSW5MIUBMJUx1bW5NYihlTWVNZiV0TS1NbSNNcDx5TmMgdE5kdUBOZmlybU5nKltOfUBOc2lkIE50cm9sTnYoKU9rT2xQcCBQeVIkUmVSblIqQC9UdCNVXlVudHJ5VXAhVXInVXMoViBZbz5fe0FkIUFmdEFtQX1Bc2hBdCBBd2xBenlFYW1FZC5FZWtFd0l7ZXRJbWVJc3BJdC1PcE9bT3VeT3dkVWNpJFVlbFVpJ1VtYiFVbl5Vc2hZWSwkMkJlTHR1KlBQYm8/ZFJpb3VzUnJ8UnRhKFI9U2hdL29tVGUzQyE6RE1hK01wTilOZyBSKGdTaFVnaHQgV25ZM0FsQmE+QnJpc0NhZGVDZW1iIENpZGVDbChlQyVhPkMqYSdFckYmJ0YoZUZ5RyplTGF5TGl2IE08ZE1pJ05pJE50aSxOeVA/dFAmZFBvcy5QYFB1dHlSaT1TY3JpYmVTIHRTaWduU2tTcGFpci9yb3lUYWlsVGVAVmVsb3BWaSlWbz4zQWdyYW1BbEFtI2RBcnlDZUUnbEV0RmYgRy4kR24ueUxlbW1hTm4gTm9zYXVyUmVAUnRTYWcqZVNjb3YgU2VhJ1NoU21pW1MlZCBTcGxheS88KVYgdFZpZGVWJSlaenk1Q3QlQ3VtfEd+THBoKE1hKE5hPk5rZXlOJU9yU2VVYiFWZV9mdEFnI0FtYUEsLUF3RWFtRVtJZnRJbGxJbmtJcEk9T3BVbVkyQ2tNYk5lUihnL1ReVHkxQXJmMU5hbS06RyBHIVJseVJuUmBTaWx5L1N5MUhvT2xvZ3lPbm9teTBHZUl0VWNhPjFGJXQwRzFHaHRUaCAyQm93RCBFQHItRWc8dEVtfEVwaDx0RXZhdCVJPlNlMEI/a0JvZHlCcmEpRXIrT3RdUGxveVBvdyBQdHkwQWIhQUBERCFbRCUnRW15RXJneUYlKUdhK0coZUg8KUpveUxpLE91Z2hSLWhSb2xsU3UqVCBUaSpUcnlWZWxvcGUxSXNvZGUwVSRVaXAwQUEnT2RlT3NdUiVVcHQwQ2FwZVNheVMmKVRhPjBFcm4kSC1zMUlkJilJbE9rZU9sPTFBQEFtcCFDZVtDaDwrQy5lQ2x1ZGVDdSdFY3U+RXJjaSdIYXUsSGliLkkhSSxJdE90LVA8ZFBlQFBpKlBsYShQbydQKltUJmRUcmEwRUVicm93OkJyLUNlQ3VsdHlEZUludElgfkwnTWVNaWx5TW91c05OY3lOdGFzeVJtU2hdVFQkVGggVGlndWVVbHRWJS5lM0F0dSpCcnU/eUQgJEVFZEVsTWEhTikvaXYkVF5WIFczQiBDdF1FbGRHdSpMZUxtTHQgTiROZE5lTmcgTmlzaFJlUm1SLFNjJFNoVFR9W1hfZ0FtZUFzaEF0QXYlRWVJZ2h0SXBPYXRPe08lT3cgVWlkVXNoWV9tQ3VzR0lsTGR+b3dPZE90UilSZSxSK3RSa1J0dX1SdW1Sdz9kU3NpbC8gVW5kWF9naSFBbWVFcXV8RXNoSSZkSW4rT2dPbnRPLE93bk96JlUuMkVsTk5ueVJuYSlSeVR1KjpEK3RJbkxheHl+IHlNZVBSYStSYmErUmQmUmwtUm18U1NwVGVUaCBVK1plM04gJE5pdXNOKk50IU51KGUvdSoyTywwQW50RnRHZyFOZyBSYWZmZVJsVmVfZEFuKUEqQVtJZGVJbXAnT2JlT29tT3J5Tz1Pd1VlX3REZGVbTGRPZE8nUmlsbGFTcGVsU3NpcFYgblduX2JBKUEoQW50QXBlQVtBdi55RWF0RSZJZEllZkl0T2MgeU91cE93VW50X3JkRVtJZGVJbHRJdD9OM006Qi5JckxmTW0gTSwgTmRQcHlSYiVSZFJzaFI9LFRWZVdrWj9kM0FkQWxgQXJ0QXZ5RCtob2dJZ2h0fm9MbWV0THBOUm8zRGQmR2h+TnRQUmUvJXk1QmJ5Q2tleUxkTGVMaWRheX5vd01lTmV5T2RQZVJuUnIlUidTcC4kL1RlbFVyViA1QkdlTTxNYiFNJU5kKmROZ3J5TnRSZCFScnlSdFNiPGQzQnJpZDoxRU9uMEVhRW50aWZ5TGUyTiVlNExMZWckTH1bMEErSXRhPk0mJ011fVBhQFBvJ1Bybz1QdWwnMENoQ2x1ZGVDb21lQyphJ0RleEQtYT5EbyVEdSxyeUY8dEZsLXRGJW1IYSFIIC5JdGkkSmVASnVyeU1hPk4gTm9jfFB1dFF1aXJ5UzxlU2VAU2lkZVNwaSovJGxUYUBUIGUsVG9WZSxWLmVWb2w9M09uMEw8ZE9sYT5TdWUwRW0xT3J5OkNrZXRHdT9SWnozQWxvdXNBbnN+eVdlbDlCSW5LZVVyfXlZNUQrSSlNcE5nIU5pJU5rLzpOZz9vbzNFbkVwVF51cFkzQ2tERH15TmROZ2RvbVNzVFReJlRlVHQmV2k0RWVJZmVPe093OkJCZWxCJURkIER5S2VNcE5ndWErUHRvcFIrVCBUKFVnaFVuZHJ5VmFXV25Xc3UuWSBaeTNBZCBBZkFybkE9Q3R1KkZ0R0ckRyZkSXN1Kk0jTmROZ2BOc09wP2RTcyNUdCBWZWwzQXJCIHR5QnI/eUMmJ0ZlRnRHaHRLZU1iTS5Oa09uUXVpZC9UdCFWZVo/ZDVBZEFuQiwgQyRDa0ctTmVseU5nT3BUdCB5VWRVbitWZVkkNUNreUdnYStNYiBOP05eWHVyeTNSLXM6Q2goZURHLUd9dElkSWxJbkolS2VNbSROTmErTmRhPk5nb05zXU51JFAhUmIhUl5SZyhSKGVSa2V0UnJpYStTa1NzLyBUXlQgaSRUaFRyaXhUdCBYaW11bVplM0Fkb3dBbkFzdSpBdENoPC1EJERpYUxvZHlMdE1iIE0leU50XU51UmN5UitSLlJyeVNoU3NhK1QkVGhvZDNEZCFEbmlnaHRMa35dTS1OZE5pbXVtTiVOdT5SYWMhUnIlUyB5U3MvYWtlWFhlZFh0dSo1QmkhRGVsRGlmeU1NfE4uJU5rZXlOLCBOYE9uUiRSZVJuKGdTcXUub1RoIFRdVCVVbnRhKFUnVmVWaWU1Q2hGZihMZUx0aXBseVNjIVNldW1TaHJvb21TLS9UdSQzU2VsZi8geVRoOkk9TWVQayhScm93L3lUXVR1KjNBckNrRWRHYXRpPUchQElgIFBoZXdSPS9UVHcla1V0ciRWIFdzWHQzQ2VHaHQ1QiFJJ00oZWVPZCFSbSRSYFNlVGFiIVRlVGgoZ1RpKVZlbFc1QyE/TWIgUidUOkswRXlKZUBMaStTY3UqUyA9VGEoVmlvdXMwQ3VyRTxUb2IgME9yMUZGIEZpKVQmMkwxQXkwREk9WW1wLTBJdDBDZUVJI0woZUx5MUVuRXJhSW5dUG8nVF0xQW4rQi5DaD9kRCBEKD95RzxJfElnKCRQaDwwVHItaDBIIDBUZG8lVCBUcHV0VHNpZGUwQWxFbkVyME5OIDBZZyYwLyAwT306Q3REZCFHZUlyTGEpTG1OZGFOZWxOLU5gIFAgUmFkZVJ8UmtScm90UnR5U3NUXlRoVGl8VHJvbFR0IG5VJ1ZlWW18M0EpQW51dEFyQXM8dEwtPE5OJHR5TmNpbE9wIVBwIFJmZUBSbS5ScyNUMk99T3RvUmEnWXMtJDBBbm9Dbi1DdHUqRSlHR2UjfkxvdE5rT30gUGUvb2xUXlp6YV8pQX10QSwtQT5BeUVhJ0VkK1V7VWdVbisyRW1FdEludEw/TGVMaSlOZE55T2xQdWw/UnRdUy5dU3NpYiEvVGF0b1R0IHlWIHR5V2QgVyBfQGkpQWknRWQtdEVmIEVwYSpFc3xFdHR5RXZ8SSlJZGVJbT95SW50SSUueUlzI0l2YT5JemVPYiFtTylbT2R1KU9mLk9ncmFtT2plQE9tbz5Pb2ZPcCB0eU9zcCBPPkBPdWRPdmlkZTJCbC1EZChnfkxwTCdNcGsoTl5QaWxQcHlSXmEnUi55UnBvJ1InU2hUWnohM1JhbWlkOjk5QWwueUFudHVtQXJ0
26774IEUsXUl7SXRJek8+OkJiLkNjbyNDZUNrRD9EaW9JbEluSSd+eU1wTl5OZG9tTitQaWRSZVRlVGggViZXWiUzQWR5QWxBcyNCZWxCdWlsZEMkbENlaT1DaXBlQyVkQ3ljIUR1KUYhQEYlbUZ1J0ddRyp0R3VsP0plQExheExlYSdMaWVmTHlNYShNZW1iIE0oZE1vPU5kIE5ld050T3AmUGFpclBlYXRQbGEpUCV0UXVpKlNjdWVTZW1iIVNpLFNvdXIpU3AjJ1N1bHRUaSpUKmF0VHVyblVuXVZlJFZpZXdXP2QyWWBtMEJCYiNDZUNoRGVEK0YhR2h0R2lkTmdPdFBwIVNrVHUkViRWIDVBZEEsQm90QnUsQ2tldE08KU9mT2tpZU9tU2VUYT5VZ2hVbmRVPlkkNUJiIERlR0xlTk53YXlSJDpERGQhRH1bRmVJbExhZExtI0wjTHRMdT5NZU1wIU5kVGlzZnlUb3NoaVUpVXNhK1ZlWTFBIUFuQSpBdHQgRX1IZW1lSG9vbEkmKUlbJXNPcnBdT3V0UmFwUmUmUmlwdFJ1YjFBQXJeQXMjQXRDI2RDKnRDdF1DdXIueUVkRWtHbXxMZUB+TSg/TmklTidOdCYpUmllc1J2aSlTc11UdCFUdXBWJl9kb3dBZnRBbGxvd0EqRWRFbGxFcmlmZkllbGRJZnRJfUlwSXYgT3tPZU9vdE9wT3J0T3VsZCBPPVJpbXBSdWdVZmYhWTBCbChnQ2tEZUUrR2h0R25MfExrfnlMdiBNaWw/TXAhTilOZ1ImLyBUdWE+WFplMUE+RXReSUlsbEluSXJ0VWxsMEFiQW1FZXBFbmQgSSlJZGVJZ2h0SW1PZzxPdE93VXNoMEFsbEFydEkhT2tlT29gMEF7QWtlQXBJZmZPdzBBcENjIENpJENrRGFGdEw/TGRpIExpZEx1dF1MPU1lI2VOZ09uUnJ5UnRVbFVuZFVwVXIpVWAwQSlBKkF0aSRBd25FYWtFY2kkRWVkRWxsRW5kSCBlSSlJZCBJa2VJbklyLkwuT2lsT25zJU8jT3J0T3RSYXlSZWFkUihnWTBVYSpVZWV6ZVVpcipsX2IhQWRpdW1BZmZBK0FpcnNBbXBBbmRBcnRBPkF5RWFrRWVsRW1FcEUqb0l7SWxsSW5nT3tPbWFeT31Pb2xPcnlPPVJhPmd5UmVldFJpa2VSI2dSdWdnIVVkfFVmZlVtYiFZITBCamVAQm0uQndheUMpW0NoRGQmRmYgRz9HKyxJdE1tIE5ObnlOJ3RQIFBwbHlQKm1lUmVSZmEpUitScHJpJ1Jyb3VuZFI9eVNwZUAvYSgxQWxsb3dBbXBBcEFybUU/RWV0SWZ0SW1JbmdJdF5PcmQxTWJvbE1wdG9tUnVwL2VtOkIhQ2shR0lsTHxMa05rUGVSK3RTay9lVHRvb1hpM0FeQW1+Tk48dE5uaXNOdFJtL1h0X25rQXRFbWVFbkUleUUqRXlJbmdJc091Z2h0UmVlUmk9Um93VW1iVW5kIDBDa2V0RGVHIEx0TWIgTWVOeVBSZWRTc3VlVCE1QSxCYWNjb0RheURkbCBFR2VgIEkhdEsmTWF0b00lcm93TmVOZ3VlTmlnaHRPbE9gUFAtUHAhUl5SbmFkb1J0b2knU3NUJFVyaSxXP2RXIFduWV97QWRlQWZmLUFnLUEoQW5zZiBBcEFzaEE9bEF5RWF0RWVFbmRJJEliZUl7SWdnIEltSXBPcGh5T3ViIVV7VWVVbHlVbXBldFUsVWBZMkJlSXRdTWIhTmFOfWxSa2V5Um5SdCExRWw9RW50eUkpSW5JLE8xUGVQLSQ6NUx5NUIqbGxhMEFiIUF3YSpDIUNvdiBEIERvRmFpckZvbGRIYXBweUlmJW1JcXVlSXRJdiAnS25vd25Mb3tUaWxVc3UkVmVpbDFEYT5HcmFkZUhvbGRPblAgU2V0MUI8R2UwQStFRWRFZnVsRSFbVSQwSWwueTpDPHRDdXVtR3VlTGlkTCF5TD1OTmlzaFAlUmlvdXMvVWx0M0gtIUw9dE5kJU50dSpOdWVSYlJpZnlSc11SeVMnbFQgPDNBYiFCcjx0Q2lvdXNDdCV5RGVvRXd+YStOdGErT2woUnR1JFJ1c1NhUy5TdSRUJFZpZDVDJEkpSWRMYzxvTHVtZVRlWWErOkdlRyNJdExrfkxudXROdFJmYSpSbVJyaSVTaFNwL2VUIFZlWTNBbGBBcCNBckEnbEFgIEJEZChnRWsmZElyZExjb21lL1RfIUF0RWF0RWVsRW5FKklwSXNwIDBEZURgRmVMZH5OTmRvd05lTmdOa05uIE50IFJlU2RvbVNlU2hUfVs1TGZNPE5kIE9kT2xSZFJrUmxkUnJ5UmBfcEV7RSwhSSxJPk9uZzo6UmQzQXJ+b3c5VVVuZ1VgOjNCcmFSbzlOZU9cIjtcbmNvbnN0IGNoZWNrc3VtID0gXCIweDNjOGFjYzFlN2IwOGQ4ZTc2ZjlmZGEwMTVlZjQ4ZGM4YzcxMGE3M2NiN2UwZjc3YjJjMThhOWI1YTdhZGRlNjBcIjtcbmxldCB3b3JkbGlzdCA9IG51bGw7XG4vKipcbiAqICBUaGUgW1tsaW5rLWJpcDM5LWVuXV0gZm9yIFttbmVtb25pYyBwaHJhc2VzXShsaW5rLWJpcC0zOSkuXG4gKlxuICogIEBfZG9jbG9jOiBhcGkvd29yZGxpc3RzXG4gKi9cbmV4cG9ydCBjbGFzcyBMYW5nRW4gZXh0ZW5kcyBXb3JkbGlzdE93bCB7XG4gICAgLyoqXG4gICAgICogIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2Ugb2YgdGhlIEVuZ2xpc2ggbGFuZ3VhZ2UgV29yZGxpc3QuXG4gICAgICpcbiAgICAgKiAgVGhpcyBzaG91bGQgYmUgdW5uZWNlc3NhcnkgbW9zdCBvZiB0aGUgdGltZSBhcyB0aGUgZXhwb3J0ZWRcbiAgICAgKiAgW1tsYW5nRW5dXSBzaG91bGQgc3VmZmljZS5cbiAgICAgKlxuICAgICAqICBAX2lnbm9yZTpcbiAgICAgKi9cbiAgICBjb25zdHJ1Y3RvcigpIHsgc3VwZXIoXCJlblwiLCB3b3JkcywgY2hlY2tzdW0pOyB9XG4gICAgLyoqXG4gICAgICogIFJldHVybnMgYSBzaW5nbGV0b24gaW5zdGFuY2Ugb2YgYSBgYExhbmdFbmBgLCBjcmVhdGluZyBpdFxuICAgICAqICBpZiB0aGlzIGlzIHRoZSBmaXJzdCB0aW1lIGJlaW5nIGNhbGxlZC5cbiAgICAgKi9cbiAgICBzdGF0aWMgd29yZGxpc3QoKSB7XG4gICAgICAgIGlmICh3b3JkbGlzdCA9PSBudWxsKSB7XG4gICAgICAgICAgICB3b3JkbGlzdCA9IG5ldyBMYW5nRW4oKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gd29yZGxpc3Q7XG4gICAgfVxufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9bGFuZy1lbi5qcy5tYXAiLCJpbXBvcnQgeyBwYmtkZjIsIHNoYTI1NiB9IGZyb20gXCIuLi9jcnlwdG8vaW5kZXguanNcIjtcbmltcG9ydCB7IGRlZmluZVByb3BlcnRpZXMsIGdldEJ5dGVzLCBoZXhsaWZ5LCBhc3NlcnROb3JtYWxpemUsIGFzc2VydFByaXZhdGUsIGFzc2VydEFyZ3VtZW50LCB0b1V0ZjhCeXRlcyB9IGZyb20gXCIuLi91dGlscy9pbmRleC5qc1wiO1xuaW1wb3J0IHsgTGFuZ0VuIH0gZnJvbSBcIi4uL3dvcmRsaXN0cy9sYW5nLWVuLmpzXCI7XG4vLyBSZXR1cm5zIGEgYnl0ZSB3aXRoIHRoZSBNU0IgYml0cyBzZXRcbmZ1bmN0aW9uIGdldFVwcGVyTWFzayhiaXRzKSB7XG4gICAgcmV0dXJuICgoMSA8PCBiaXRzKSAtIDEpIDw8ICg4IC0gYml0cykgJiAweGZmO1xufVxuLy8gUmV0dXJucyBhIGJ5dGUgd2l0aCB0aGUgTFNCIGJpdHMgc2V0XG5mdW5jdGlvbiBnZXRMb3dlck1hc2soYml0cykge1xuICAgIHJldHVybiAoKDEgPDwgYml0cykgLSAxKSAmIDB4ZmY7XG59XG5mdW5jdGlvbiBtbmVtb25pY1RvRW50cm9weShtbmVtb25pYywgd29yZGxpc3QpIHtcbiAgICBhc3NlcnROb3JtYWxpemUoXCJORktEXCIpO1xuICAgIGlmICh3b3JkbGlzdCA9PSBudWxsKSB7XG4gICAgICAgI
26774HdvcmRsaXN0ID0gTGFuZ0VuLndvcmRsaXN0KCk7XG4gICAgfVxuICAgIGNvbnN0IHdvcmRzID0gd29yZGxpc3Quc3BsaXQobW5lbW9uaWMpO1xuICAgIGFzc2VydEFyZ3VtZW50KCh3b3Jkcy5sZW5ndGggJSAzKSA9PT0gMCAmJiB3b3Jkcy5sZW5ndGggPj0gMTIgJiYgd29yZHMubGVuZ3RoIDw9IDI0LCBcImludmFsaWQgbW5lbW9uaWMgbGVuZ3RoXCIsIFwibW5lbW9uaWNcIiwgXCJbIFJFREFDVEVEIF1cIik7XG4gICAgY29uc3QgZW50cm9weSA9IG5ldyBVaW50OEFycmF5KE1hdGguY2VpbCgxMSAqIHdvcmRzLmxlbmd0aCAvIDgpKTtcbiAgICBsZXQgb2Zmc2V0ID0gMDtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHdvcmRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGxldCBpbmRleCA9IHdvcmRsaXN0LmdldFdvcmRJbmRleCh3b3Jkc1tpXS5ub3JtYWxpemUoXCJORktEXCIpKTtcbiAgICAgICAgYXNzZXJ0QXJndW1lbnQoaW5kZXggPj0gMCwgYGludmFsaWQgbW5lbW9uaWMgd29yZCBhdCBpbmRleCAke2l9YCwgXCJtbmVtb25pY1wiLCBcIlsgUkVEQUNURUQgXVwiKTtcbiAgICAgICAgZm9yIChsZXQgYml0ID0gMDsgYml0IDwgMTE7IGJpdCsrKSB7XG4gICAgICAgICAgICBpZiAoaW5kZXggJiAoMSA8PCAoMTAgLSBiaXQpKSkge1xuICAgICAgICAgICAgICAgIGVudHJvcHlbb2Zmc2V0ID4+IDNdIHw9ICgxIDw8ICg3IC0gKG9mZnNldCAlIDgpKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBvZmZzZXQrKztcbiAgICAgICAgfVxuICAgIH1cbiAgICBjb25zdCBlbnRyb3B5Qml0cyA9IDMyICogd29yZHMubGVuZ3RoIC8gMztcbiAgICBjb25zdCBjaGVja3N1bUJpdHMgPSB3b3Jkcy5sZW5ndGggLyAzO1xuICAgIGNvbnN0IGNoZWNrc3VtTWFzayA9IGdldFVwcGVyTWFzayhjaGVja3N1bUJpdHMpO1xuICAgIGNvbnN0IGNoZWNrc3VtID0gZ2V0Qnl0ZXMoc2hhMjU2KGVudHJvcHkuc2xpY2UoMCwgZW50cm9weUJpdHMgLyA4KSkpWzBdICYgY2hlY2tzdW1NYXNrO1xuICAgIGFzc2VydEFyZ3VtZW50KGNoZWNrc3VtID09PSAoZW50cm9weVtlbnRyb3B5Lmxlbmd0aCAtIDFdICYgY2hlY2tzdW1NYXNrKSwgXCJpbnZhbGlkIG1uZW1vbmljIGNoZWNrc3VtXCIsIFwibW5lbW9uaWNcIiwgXCJbIFJFREFDVEVEIF1cIik7XG4gICAgcmV0dXJuIGhleGxpZnkoZW50cm9weS5zbGljZSgwLCBlbnRyb3B5Qml0cyAvIDgpKTtcbn1cbmZ1bmN0aW9uIGVudHJvcHlUb01uZW1vbmljKGVudHJvcHksIHdvcmRsaXN0KSB7XG4gICAgYXNzZXJ0QXJndW1lbnQoKGVudHJvcHkubGVuZ3RoICUgNCkgPT09IDAgJiYgZW50cm9weS5sZW5ndGggPj0gMTYgJiYgZW50cm9weS5sZW5ndGggPD0gMzIsIFwiaW52YWxpZCBlbnRyb3B5IHNpemVcIiwgXCJlbnRyb3B5XCIsIFwiWyBSRURBQ1RFRCBdXCIpO1xuICAgIGlmICh3b3JkbGlzdCA9PSBudWxsKSB7XG4gICAgICAgIHdvcmRsaXN0ID0gTGFuZ0VuLndvcmRsaXN0KCk7XG4gICAgfVxuICAgIGNvbnN0IGluZGljZXMgPSBbMF07XG4gICAgbGV0IHJlbWFpbmluZ0JpdHMgPSAxMTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGVudHJvcHkubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgLy8gQ29uc3VtZSB0aGUgd2hvbGUgYnl0ZSAod2l0aCBzdGlsbCBtb3JlIHRvIGdvKVxuICAgICAgICBpZiAocmVtYWluaW5nQml0cyA+IDgpIHtcbiAgICAgICAgICAgIGluZGljZXNbaW5kaWNlcy5sZW5ndGggLSAxXSA8PD0gODtcbiAgICAgICAgICAgIGluZGljZXNbaW5kaWNlcy5sZW5ndGggLSAxXSB8PSBlbnRyb3B5W2ldO1xuICAgICAgICAgICAgcmVtYWluaW5nQml0cyAtPSA4O1xuICAgICAgICAgICAgLy8gVGhpcyBieXRlIHdpbGwgY29tcGxldGUgYW4gMTEtYml0IGluZGV4XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBpbmRpY2VzW2luZGljZXMubGVuZ3RoIC0gMV0gPDw9IHJlbWFpbmluZ0JpdHM7XG4gICAgICAgICAgICBpbmRpY2VzW2luZGljZXMubGVuZ3RoIC0gMV0gfD0gZW50cm9weVtpXSA+PiAoOCAtIHJlbWFpbmluZ0JpdHMpO1xuICAgICAgICAgICAgLy8gU3RhcnQgdGhlIG5leHQgd29yZFxuICAgICAgICAgICAgaW5kaWNlcy5wdXNoKGVudHJvcHlbaV0gJiBnZXRMb3dlck1hc2soOCAtIHJlbWFpbmluZ0JpdHMpKTtcbiAgICAgICAgICAgIHJlbWFpbmluZ0JpdHMgKz0gMztcbiAgICAgICAgfVxuICAgIH1cbiAgICAvLyBDb21wdXRlIHRoZSBjaGVja3N1bSBiaXRzXG4gICAgY29uc3QgY2hlY2tzdW1CaXRzID0gZW50cm9weS5sZW5ndGggLyA0O1xuICAgIGNvbnN0IGNoZWNrc3VtID0gcGFyc2VJbnQoc2hhMjU2KGVudHJvcHkpLnN1YnN0cmluZygyLCA0KSwgMTYpICYgZ2V0VXBwZXJNYXNrKGNoZWNrc3VtQml0cyk7XG4gICAgLy8gU2hpZnQgdGhlIGNoZWNrc3VtIGludG8gdGhlIHdvcmQgaW5kaWNlc1xuICAgIGluZGljZXNbaW5kaWNlcy5sZW5ndGggLSAxXSA8PD0gY2hlY2tzdW1CaXRzO1xuICAgIGluZGljZXNbaW5kaWNlcy5sZW5ndGggLSAxXSB8PSAoY2hlY2tzdW0gPj4gKDggLSBjaGVja3N1bUJpdHMpKTtcbiAgICByZXR1cm4gd29yZGxpc3Quam9pbihpbmRpY2VzLm1hcCgoaW5kZXgpID0+IHdvcmRsaXN0LmdldFdvcmQoaW5kZXgpKSk7XG59XG5jb25zdCBfZ3VhcmQgPSB7fTtcbi8qKlxuICogIEEgKipNbmVtb25pYyoqIHdyYXBzIGFsbCBwcm9wZXJ0aWVzIHJlcXVpcmVkIHRvIGNvbXB1dGUgW1tsaW5rLWJpcC0zOV1dXG4gKiAgc2VlZHMgYW5kIGNvbnZlcnQgYmV0d2VlbiBwaHJhc2VzIGFuZCBlbnRyb3B5LlxuICovXG5leHBvcnQgY2xhc3MgTW5lbW9uaWMge1xuICAgIC8qKlxuICAgICAqICBUaGUgbW5lbW9uaWMgcGhyYXNlIG9mIDEyLCAxNSwgMTgsIDIxIG9yIDI0IHdvcmRzLlxuICAgICAqXG4gICAgICogIFVzZSB0aGUgW1t3b3JkbGlzdF1dIGBgc3BsaXRgYCBtZXRob2QgdG8gZ2V0IHRoZSBpbmRpdmlkdWFsIHdvcmRzLlxuICAgICAqL1xuICAgIHBocmFzZTtcbiAgICAvKipcbiAgICAgKiAgVGhlIHBhc3N3b3JkIHVzZWQgZm9yIHRoaXMgbW5lbW9uaWMuIElmIG5vIHBhc3N3b3JkIGlzIHVzZWQgdGhpc1xuICAgICAqICBpcyB0aGUgZW1wdHkgc3RyaW5nIChpLmUuIGBgXCJcImBgKSBhcyBwZXIgdGhlIHNwZWNpZmljYXRpb24uXG4gICAgICovXG4gICAgcGFzc3dvcmQ7XG4gICAgLyoqXG4gICAgICogIFRoZSB3b3JkbGlzdCBmb3IgdGhpcyBtbm
26774Vtb25pYy5cbiAgICAgKi9cbiAgICB3b3JkbGlzdDtcbiAgICAvKipcbiAgICAgKiAgVGhlIHVuZGVybHlpbmcgZW50cm9weSB3aGljaCB0aGUgbW5lbW9uaWMgZW5jb2Rlcy5cbiAgICAgKi9cbiAgICBlbnRyb3B5O1xuICAgIC8qKlxuICAgICAqICBAcHJpdmF0ZVxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yKGd1YXJkLCBlbnRyb3B5LCBwaHJhc2UsIHBhc3N3b3JkLCB3b3JkbGlzdCkge1xuICAgICAgICBpZiAocGFzc3dvcmQgPT0gbnVsbCkge1xuICAgICAgICAgICAgcGFzc3dvcmQgPSBcIlwiO1xuICAgICAgICB9XG4gICAgICAgIGlmICh3b3JkbGlzdCA9PSBudWxsKSB7XG4gICAgICAgICAgICB3b3JkbGlzdCA9IExhbmdFbi53b3JkbGlzdCgpO1xuICAgICAgICB9XG4gICAgICAgIGFzc2VydFByaXZhdGUoZ3VhcmQsIF9ndWFyZCwgXCJNbmVtb25pY1wiKTtcbiAgICAgICAgZGVmaW5lUHJvcGVydGllcyh0aGlzLCB7IHBocmFzZSwgcGFzc3dvcmQsIHdvcmRsaXN0LCBlbnRyb3B5IH0pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiAgUmV0dXJucyB0aGUgc2VlZCBmb3IgdGhlIG1uZW1vbmljLlxuICAgICAqL1xuICAgIGNvbXB1dGVTZWVkKCkge1xuICAgICAgICBjb25zdCBzYWx0ID0gdG9VdGY4Qnl0ZXMoXCJtbmVtb25pY1wiICsgdGhpcy5wYXNzd29yZCwgXCJORktEXCIpO1xuICAgICAgICByZXR1cm4gcGJrZGYyKHRvVXRmOEJ5dGVzKHRoaXMucGhyYXNlLCBcIk5GS0RcIiksIHNhbHQsIDIwNDgsIDY0LCBcInNoYTUxMlwiKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogIENyZWF0ZXMgYSBuZXcgTW5lbW9uaWMgZm9yIHRoZSAlJXBocmFzZSUlLlxuICAgICAqXG4gICAgICogIFRoZSBkZWZhdWx0ICUlcGFzc3dvcmQlJSBpcyB0aGUgZW1wdHkgc3RyaW5nIGFuZCB0aGUgZGVmYXVsdFxuICAgICAqICB3b3JkbGlzdCBpcyB0aGUgW0VuZ2xpc2ggd29yZGxpc3RzXShMYW5nRW4pLlxuICAgICAqL1xuICAgIHN0YXRpYyBmcm9tUGhyYXNlKHBocmFzZSwgcGFzc3dvcmQsIHdvcmRsaXN0KSB7XG4gICAgICAgIC8vIE5vcm1hbGl6ZSB0aGUgY2FzZSBhbmQgc3BhY2U7IHRocm93cyBpZiBpbnZhbGlkXG4gICAgICAgIGNvbnN0IGVudHJvcHkgPSBtbmVtb25pY1RvRW50cm9weShwaHJhc2UsIHdvcmRsaXN0KTtcbiAgICAgICAgcGhyYXNlID0gZW50cm9weVRvTW5lbW9uaWMoZ2V0Qnl0ZXMoZW50cm9weSksIHdvcmRsaXN0KTtcbiAgICAgICAgcmV0dXJuIG5ldyBNbmVtb25pYyhfZ3VhcmQsIGVudHJvcHksIHBocmFzZSwgcGFzc3dvcmQsIHdvcmRsaXN0KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogIENyZWF0ZSBhIG5ldyAqKk1uZW1vbmljKiogZnJvbSB0aGUgJSVlbnRyb3B5JSUuXG4gICAgICpcbiAgICAgKiAgVGhlIGRlZmF1bHQgJSVwYXNzd29yZCUlIGlzIHRoZSBlbXB0eSBzdHJpbmcgYW5kIHRoZSBkZWZhdWx0XG4gICAgICogIHdvcmRsaXN0IGlzIHRoZSBbRW5nbGlzaCB3b3JkbGlzdHNdKExhbmdFbikuXG4gICAgICovXG4gICAgc3RhdGljIGZyb21FbnRyb3B5KF9lbnRyb3B5LCBwYXNzd29yZCwgd29yZGxpc3QpIHtcbiAgICAgICAgY29uc3QgZW50cm9weSA9IGdldEJ5dGVzKF9lbnRyb3B5LCBcImVudHJvcHlcIik7XG4gICAgICAgIGNvbnN0IHBocmFzZSA9IGVudHJvcHlUb01uZW1vbmljKGVudHJvcHksIHdvcmRsaXN0KTtcbiAgICAgICAgcmV0dXJuIG5ldyBNbmVtb25pYyhfZ3VhcmQsIGhleGxpZnkoZW50cm9weSksIHBocmFzZSwgcGFzc3dvcmQsIHdvcmRsaXN0KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogIFJldHVybnMgdGhlIHBocmFzZSBmb3IgJSVtbmVtb25pYyUlLlxuICAgICAqL1xuICAgIHN0YXRpYyBlbnRyb3B5VG9QaHJhc2UoX2VudHJvcHksIHdvcmRsaXN0KSB7XG4gICAgICAgIGNvbnN0IGVudHJvcHkgPSBnZXRCeXRlcyhfZW50cm9weSwgXCJlbnRyb3B5XCIpO1xuICAgICAgICByZXR1cm4gZW50cm9weVRvTW5lbW9uaWMoZW50cm9weSwgd29yZGxpc3QpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiAgUmV0dXJucyB0aGUgZW50cm9weSBmb3IgJSVwaHJhc2UlJS5cbiAgICAgKi9cbiAgICBzdGF0aWMgcGhyYXNlVG9FbnRyb3B5KHBocmFzZSwgd29yZGxpc3QpIHtcbiAgICAgICAgcmV0dXJuIG1uZW1vbmljVG9FbnRyb3B5KHBocmFzZSwgd29yZGxpc3QpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiAgUmV0dXJucyB0cnVlIGlmICUlcGhyYXNlJSUgaXMgYSB2YWxpZCBbW2xpbmstYmlwLTM5XV0gcGhyYXNlLlxuICAgICAqXG4gICAgICogIFRoaXMgY2hlY2tzIGFsbCB0aGUgcHJvdmlkZWQgd29yZHMgYmVsb25nIHRvIHRoZSAlJXdvcmRsaXN0JSUsXG4gICAgICogIHRoYXQgdGhlIGxlbmd0aCBpcyB2YWxpZCBhbmQgdGhlIGNoZWNrc3VtIGlzIGNvcnJlY3QuXG4gICAgICovXG4gICAgc3RhdGljIGlzVmFsaWRNbmVtb25pYyhwaHJhc2UsIHdvcmRsaXN0KSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBtbmVtb25pY1RvRW50cm9weShwaHJhc2UsIHdvcmRsaXN0KTtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIGNhdGNoIChlcnJvcikgeyB9XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1tbmVtb25pYy5qcy5tYXAiLCIvKiEgTUlUIExpY2Vuc2UuIENvcHlyaWdodCAyMDE1LTIwMjIgUmljaGFyZCBNb29yZSA8bWVAcmljbW9vLmNvbT4uIFNlZSBMSUNFTlNFLnR4dC4gKi9cbnZhciBfX2NsYXNzUHJpdmF0ZUZpZWxkR2V0ID0gKHRoaXMgJiYgdGhpcy5fX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KSB8fCBmdW5jdGlvbiAocmVjZWl2ZXIsIHN0YXRlLCBraW5kLCBmKSB7XG4gICAgaWYgKGtpbmQgPT09IFwiYVwiICYmICFmKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiUHJpdmF0ZSBhY2Nlc3NvciB3YXMgZGVmaW5lZCB3aXRob3V0IGEgZ2V0dGVyXCIpO1xuICAgIGlmICh0eXBlb2Ygc3RhdGUgPT09IFwiZnVuY3Rpb25cIiA/IHJlY2VpdmVyICE9PSBzdGF0ZSB8fCAhZiA6ICFzdGF0ZS5oYXMocmVjZWl2ZXIpKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiQ2Fubm90IHJlYWQgcHJpdmF0ZSBtZW1iZXIgZnJvbSBhbiBvYmplY3Qgd2hvc2UgY2xhc3MgZGlkIG5vdCBkZWNsYXJlIGl0XCIpO1xuICAgIHJldHVybi
26774BraW5kID09PSBcIm1cIiA/IGYgOiBraW5kID09PSBcImFcIiA/IGYuY2FsbChyZWNlaXZlcikgOiBmID8gZi52YWx1ZSA6IHN0YXRlLmdldChyZWNlaXZlcik7XG59O1xudmFyIF9fY2xhc3NQcml2YXRlRmllbGRTZXQgPSAodGhpcyAmJiB0aGlzLl9fY2xhc3NQcml2YXRlRmllbGRTZXQpIHx8IGZ1bmN0aW9uIChyZWNlaXZlciwgc3RhdGUsIHZhbHVlLCBraW5kLCBmKSB7XG4gICAgaWYgKGtpbmQgPT09IFwibVwiKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiUHJpdmF0ZSBtZXRob2QgaXMgbm90IHdyaXRhYmxlXCIpO1xuICAgIGlmIChraW5kID09PSBcImFcIiAmJiAhZikgdGhyb3cgbmV3IFR5cGVFcnJvcihcIlByaXZhdGUgYWNjZXNzb3Igd2FzIGRlZmluZWQgd2l0aG91dCBhIHNldHRlclwiKTtcbiAgICBpZiAodHlwZW9mIHN0YXRlID09PSBcImZ1bmN0aW9uXCIgPyByZWNlaXZlciAhPT0gc3RhdGUgfHwgIWYgOiAhc3RhdGUuaGFzKHJlY2VpdmVyKSkgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkNhbm5vdCB3cml0ZSBwcml2YXRlIG1lbWJlciB0byBhbiBvYmplY3Qgd2hvc2UgY2xhc3MgZGlkIG5vdCBkZWNsYXJlIGl0XCIpO1xuICAgIHJldHVybiAoa2luZCA9PT0gXCJhXCIgPyBmLmNhbGwocmVjZWl2ZXIsIHZhbHVlKSA6IGYgPyBmLnZhbHVlID0gdmFsdWUgOiBzdGF0ZS5zZXQocmVjZWl2ZXIsIHZhbHVlKSksIHZhbHVlO1xufTtcbnZhciBfQUVTX2tleSwgX0FFU19LZCwgX0FFU19LZTtcbi8vIE51bWJlciBvZiByb3VuZHMgYnkga2V5c2l6ZVxuY29uc3QgbnVtYmVyT2ZSb3VuZHMgPSB7IDE2OiAxMCwgMjQ6IDEyLCAzMjogMTQgfTtcbi8vIFJvdW5kIGNvbnN0YW50IHdvcmRzXG5jb25zdCByY29uID0gWzB4MDEsIDB4MDIsIDB4MDQsIDB4MDgsIDB4MTAsIDB4MjAsIDB4NDAsIDB4ODAsIDB4MWIsIDB4MzYsIDB4NmMsIDB4ZDgsIDB4YWIsIDB4NGQsIDB4OWEsIDB4MmYsIDB4NWUsIDB4YmMsIDB4NjMsIDB4YzYsIDB4OTcsIDB4MzUsIDB4NmEsIDB4ZDQsIDB4YjMsIDB4N2QsIDB4ZmEsIDB4ZWYsIDB4YzUsIDB4OTFdO1xuLy8gUy1ib3ggYW5kIEludmVyc2UgUy1ib3ggKFMgaXMgZm9yIFN1YnN0aXR1dGlvbilcbmNvbnN0IFMgPSBbMHg2MywgMHg3YywgMHg3NywgMHg3YiwgMHhmMiwgMHg2YiwgMHg2ZiwgMHhjNSwgMHgzMCwgMHgwMSwgMHg2NywgMHgyYiwgMHhmZSwgMHhkNywgMHhhYiwgMHg3NiwgMHhjYSwgMHg4MiwgMHhjOSwgMHg3ZCwgMHhmYSwgMHg1OSwgMHg0NywgMHhmMCwgMHhhZCwgMHhkNCwgMHhhMiwgMHhhZiwgMHg5YywgMHhhNCwgMHg3MiwgMHhjMCwgMHhiNywgMHhmZCwgMHg5MywgMHgyNiwgMHgzNiwgMHgzZiwgMHhmNywgMHhjYywgMHgzNCwgMHhhNSwgMHhlNSwgMHhmMSwgMHg3MSwgMHhkOCwgMHgzMSwgMHgxNSwgMHgwNCwgMHhjNywgMHgyMywgMHhjMywgMHgxOCwgMHg5NiwgMHgwNSwgMHg5YSwgMHgwNywgMHgxMiwgMHg4MCwgMHhlMiwgMHhlYiwgMHgyNywgMHhiMiwgMHg3NSwgMHgwOSwgMHg4MywgMHgyYywgMHgxYSwgMHgxYiwgMHg2ZSwgMHg1YSwgMHhhMCwgMHg1MiwgMHgzYiwgMHhkNiwgMHhiMywgMHgyOSwgMHhlMywgMHgyZiwgMHg4NCwgMHg1MywgMHhkMSwgMHgwMCwgMHhlZCwgMHgyMCwgMHhmYywgMHhiMSwgMHg1YiwgMHg2YSwgMHhjYiwgMHhiZSwgMHgzOSwgMHg0YSwgMHg0YywgMHg1OCwgMHhjZiwgMHhkMCwgMHhlZiwgMHhhYSwgMHhmYiwgMHg0MywgMHg0ZCwgMHgzMywgMHg4NSwgMHg0NSwgMHhmOSwgMHgwMiwgMHg3ZiwgMHg1MCwgMHgzYywgMHg5ZiwgMHhhOCwgMHg1MSwgMHhhMywgMHg0MCwgMHg4ZiwgMHg5MiwgMHg5ZCwgMHgzOCwgMHhmNSwgMHhiYywgMHhiNiwgMHhkYSwgMHgyMSwgMHgxMCwgMHhmZiwgMHhmMywgMHhkMiwgMHhjZCwgMHgwYywgMHgxMywgMHhlYywgMHg1ZiwgMHg5NywgMHg0NCwgMHgxNywgMHhjNCwgMHhhNywgMHg3ZSwgMHgzZCwgMHg2NCwgMHg1ZCwgMHgxOSwgMHg3MywgMHg2MCwgMHg4MSwgMHg0ZiwgMHhkYywgMHgyMiwgMHgyYSwgMHg5MCwgMHg4OCwgMHg0NiwgMHhlZSwgMHhiOCwgMHgxNCwgMHhkZSwgMHg1ZSwgMHgwYiwgMHhkYiwgMHhlMCwgMHgzMiwgMHgzYSwgMHgwYSwgMHg0OSwgMHgwNiwgMHgyNCwgMHg1YywgMHhjMiwgMHhkMywgMHhhYywgMHg2MiwgMHg5MSwgMHg5NSwgMHhlNCwgMHg3OSwgMHhlNywgMHhjOCwgMHgzNywgMHg2ZCwgMHg4ZCwgMHhkNSwgMHg0ZSwgMHhhOSwgMHg2YywgMHg1NiwgMHhmNCwgMHhlYSwgMHg2NSwgMHg3YSwgMHhhZSwgMHgwOCwgMHhiYSwgMHg3OCwgMHgyNSwgMHgyZSwgMHgxYywgMHhhNiwgMHhiNCwgMHhjNiwgMHhlOCwgMHhkZCwgMHg3NCwgMHgxZiwgMHg0YiwgMHhiZCwgMHg4YiwgMHg4YSwgMHg3MCwgMHgzZSwgMHhiNSwgMHg2NiwgMHg0OCwgMHgwMywgMHhmNiwgMHgwZSwgMHg2MSwgMHgzNSwgMHg1NywgMHhiOSwgMHg4NiwgMHhjMSwgMHgxZCwgMHg5ZSwgMHhlMSwgMHhmOCwgMHg5OCwgMHgxMSwgMHg2OSwgMHhkOSwgMHg4ZSwgMHg5NCwgMHg5YiwgMHgxZSwgMHg4NywgMHhlO
26774SwgMHhjZSwgMHg1NSwgMHgyOCwgMHhkZiwgMHg4YywgMHhhMSwgMHg4OSwgMHgwZCwgMHhiZiwgMHhlNiwgMHg0MiwgMHg2OCwgMHg0MSwgMHg5OSwgMHgyZCwgMHgwZiwgMHhiMCwgMHg1NCwgMHhiYiwgMHgxNl07XG5jb25zdCBTaSA9IFsweDUyLCAweDA5LCAweDZhLCAweGQ1LCAweDMwLCAweDM2LCAweGE1LCAweDM4LCAweGJmLCAweDQwLCAweGEzLCAweDllLCAweDgxLCAweGYzLCAweGQ3LCAweGZiLCAweDdjLCAweGUzLCAweDM5LCAweDgyLCAweDliLCAweDJmLCAweGZmLCAweDg3LCAweDM0LCAweDhlLCAweDQzLCAweDQ0LCAweGM0LCAweGRlLCAweGU5LCAweGNiLCAweDU0LCAweDdiLCAweDk0LCAweDMyLCAweGE2LCAweGMyLCAweDIzLCAweDNkLCAweGVlLCAweDRjLCAweDk1LCAweDBiLCAweDQyLCAweGZhLCAweGMzLCAweDRlLCAweDA4LCAweDJlLCAweGExLCAweDY2LCAweDI4LCAweGQ5LCAweDI0LCAweGIyLCAweDc2LCAweDViLCAweGEyLCAweDQ5LCAweDZkLCAweDhiLCAweGQxLCAweDI1LCAweDcyLCAweGY4LCAweGY2LCAweDY0LCAweDg2LCAweDY4LCAweDk4LCAweDE2LCAweGQ0LCAweGE0LCAweDVjLCAweGNjLCAweDVkLCAweDY1LCAweGI2LCAweDkyLCAweDZjLCAweDcwLCAweDQ4LCAweDUwLCAweGZkLCAweGVkLCAweGI5LCAweGRhLCAweDVlLCAweDE1LCAweDQ2LCAweDU3LCAweGE3LCAweDhkLCAweDlkLCAweDg0LCAweDkwLCAweGQ4LCAweGFiLCAweDAwLCAweDhjLCAweGJjLCAweGQzLCAweDBhLCAweGY3LCAweGU0LCAweDU4LCAweDA1LCAweGI4LCAweGIzLCAweDQ1LCAweDA2LCAweGQwLCAweDJjLCAweDFlLCAweDhmLCAweGNhLCAweDNmLCAweDBmLCAweDAyLCAweGMxLCAweGFmLCAweGJkLCAweDAzLCAweDAxLCAweDEzLCAweDhhLCAweDZiLCAweDNhLCAweDkxLCAweDExLCAweDQxLCAweDRmLCAweDY3LCAweGRjLCAweGVhLCAweDk3LCAweGYyLCAweGNmLCAweGNlLCAweGYwLCAweGI0LCAweGU2LCAweDczLCAweDk2LCAweGFjLCAweDc0LCAweDIyLCAweGU3LCAweGFkLCAweDM1LCAweDg1LCAweGUyLCAweGY5LCAweDM3LCAweGU4LCAweDFjLCAweDc1LCAweGRmLCAweDZlLCAweDQ3LCAweGYxLCAweDFhLCAweDcxLCAweDFkLCAweDI5LCAweGM1LCAweDg5LCAweDZmLCAweGI3LCAweDYyLCAweDBlLCAweGFhLCAweDE4LCAweGJlLCAweDFiLCAweGZjLCAweDU2LCAweDNlLCAweDRiLCAweGM2LCAweGQyLCAweDc5LCAweDIwLCAweDlhLCAweGRiLCAweGMwLCAweGZlLCAweDc4LCAweGNkLCAweDVhLCAweGY0LCAweDFmLCAweGRkLCAweGE4LCAweDMzLCAweDg4LCAweDA3LCAweGM3LCAweDMxLCAweGIxLCAweDEyLCAweDEwLCAweDU5LCAweDI3LCAweDgwLCAweGVjLCAweDVmLCAweDYwLCAweDUxLCAweDdmLCAweGE5LCAweDE5LCAweGI1LCAweDRhLCAweDBkLCAweDJkLCAweGU1LCAweDdhLCAweDlmLCAweDkzLCAweGM5LCAweDljLCAweGVmLCAweGEwLCAweGUwLCAweDNiLCAweDRkLCAweGFlLCAweDJhLCAweGY1LCAweGIwLCAweGM4LCAweGViLCAweGJiLCAweDNjLCAweDgzLCAweDUzLCAweDk5LCAweDYxLCAweDE3LCAweDJiLCAweDA0LCAweDdlLCAweGJhLCAweDc3LCAweGQ2LCAweDI2LCAweGUxLCAweDY5LCAweDE0LCAweDYzLCAweDU1LCAweDIxLCAweDBjLCAweDdkXTtcbi8vIFRyYW5zZm9ybWF0aW9ucyBmb3IgZW5jcnlwdGlvblxuY29uc3QgVDEgPSBbMHhjNjYzNjNhNSwgMHhmODdjN2M4NCwgMHhlZTc3Nzc5OSwgMHhmNjdiN2I4ZCwgMHhmZmYyZjIwZCwgMHhkNjZiNmJiZCwgMHhkZTZmNmZiMSwgMHg5MWM1YzU1NCwgMHg2MDMwMzA1MCwgMHgwMjAxMDEwMywgMHhjZTY3NjdhOSwgMHg1NjJiMmI3ZCwgMHhlN2ZlZmUxOSwgMHhiNWQ3ZDc2MiwgMHg0ZGFiYWJlNiwgMHhlYzc2NzY5YSwgMHg4ZmNhY2E0NSwgMHgxZjgyODI5ZCwgMHg4OWM5Yzk0MCwgMHhmYTdkN2Q4NywgMHhlZmZhZmExNSwgMHhiMjU5NTllYiwgMHg4ZTQ3NDdjOSwgMHhmYmYwZjAwYiwgMHg0MWFkYWRlYywgMHhiM2Q0ZDQ2NywgMHg1ZmEyYTJmZCwgMHg0NWFmYWZlYSwgMHgyMzljOWNiZiwgMHg1M2E0YTRmNywgMHhlNDcyNzI5NiwgMHg5YmMwYzA1YiwgMHg3NWI3YjdjMiwgMHhlMWZkZmQxYywgMHgzZDkzOTNhZSwgMHg0YzI2MjY2YSwgMHg2YzM2MzY1YSwgMHg3ZTNmM2Y0MSwgMHhmNWY3ZjcwMiwgMHg4M2NjY2M0ZiwgMHg2ODM0MzQ1YywgMHg1MWE1YTVmNCwgMHhkMWU1ZTUzNCwgMHhmOWYxZjEwOCwgMHhlMjcxNzE5MywgMHhhYmQ4ZDg3MywgMHg2MjMxMzE1MywgMHgyYTE1MTUzZiwgMHgwODA0MDQwYywgMHg5NWM3Yzc1MiwgMHg0NjIzMjM2NSwgMHg5ZGMzYzM1ZSwgMHgzMDE4MTgyOCwgMHgzNzk2OTZhMSwgMHgwYTA1MDUwZiwgMHgyZjlhOWFiNSwgMHgwZTA3MDcwOSwgMHgyNDEyMTIzNiwgMHgxYjgwODA5YiwgMHhkZmUyZTIzZCwgMHhjZGViZWIyNiwgMHg0ZTI3Mjc2OSwgMHg3ZmIyYjJjZCwgMHhlYTc1NzU5ZiwgMHgxMjA5MDkxYiwgMHgxZDgzODM5ZSwgMHg1ODJjMmM3NCwgMHgzNDFhMWEyZSwgMHgzNjFiMWIyZCwgMHhkYzZlNmViMiwgMHhiNDVhNWFlZSwgMHg1YmEwYTBmYiwgMHhhNDUyNTJmNiwgMHg3NjNiM2I0ZCwgMHhiN2Q2ZDY2MSwgMHg3ZGIzYjNjZSwgMHg1MjI5Mjk3YiwgMHhkZGUzZTMzZSwgMHg1ZTJmMmY3MSwgMHgxMzg0ODQ5NywgMHhhNjUzNTNmNSwgMHhiOWQxZDE2OCwgMHgwMDAwMDAwMCwgMHhjMWVkZWQyYywgMHg0MDIwMjA2MCwgMHhlM2ZjZmMxZiwgMHg3OWIxYjFjOCwgMHhiNjViNWJlZCwgMHhkNDZhNmFiZSwgMHg4ZGNiY2I0NiwgMHg2N2JlYmVkOSwgMHg3MjM5Mzk0YiwgMHg5NDRhNGFkZSwgMHg5ODRjNGNkNCwgMHhiMDU4NThlOCwgMHg4NWNmY2Y0YSwgMHhiYmQwZDA2YiwgMHhjNWVmZWYyYSwgMHg0ZmFhYWFlNSwgMHhlZGZiZmIxNiwgMHg4NjQzNDNjNSwgMHg5YTRkNGRkNywgMHg2NjMzMzM1NSwgMHgxMTg1ODU5NCwgMHg4YTQ1NDVjZiwgMHhlOWY5ZjkxMCwgMHgwNDAyMDIwNiwgMHhmZTdmN2Y4MSwgMHhhMDUwNTBmMCwgMHg3ODNjM2M0NCwgMHgyNTlmOWZiYSwgMHg0YmE4YThlMywgMHhhMjUxNTFmMywgMHg1ZGEzYTNmZSwgMHg4MDQwNDBjMCwgMHgwNThmOGY4YSwgMHgzZjkyOTJhZCwgMHgyMTlkOWRiYywgMHg3MDM4Mzg0OCwgMHhmMWY1ZjUwNCwgMHg2M2JjYmNkZiwgMHg3N2I2YjZjMSwgMHhhZmRhZGE3NSwgMHg0MjIxMjE2MywgMHgyMDEwMTAzMCwgMHhlNWZmZmYxYSwgMHhmZGYzZjMwZSwgMHhiZmQyZDI2ZCwgMHg4MWNkY2Q0YywgMHgxODBjMGMxNCwgMHgyNjEzMTMzNSwgMHhjM2VjZWMyZiwgMHhiZTVmNWZlMSwgMHgzNTk3OTdhMiwgMHg4ODQ0NDRjYywgMHgyZTE3MTczOSwgMHg5M2M0YzQ1NywgMHg1NWE3YTdmMiwgMHhmYzdlN2U4MiwgMHg3YTNkM2Q0NywgMHhjODY0NjRhYywgMHhiYTVkNWRlNywgMHgzMjE5MTkyYiwgMHhlNjczNzM5NSwgMHhjMDYwNjBhMCwgMHgxOTgxODE5OCwgMHg5ZTRmNGZkMSwgMHhhM2RjZGM3ZiwgMHg0NDIyMjI2NiwgMHg1NDJhMmE3ZSwgMHgzYjkwOTBhYiwgMHgwYjg4ODg4MywgMHg4YzQ2NDZjYSwgMHhjN2VlZWUyOSwgMHg2YmI4YjhkMywgMHgyODE0MTQzYywgMHhhN2RlZGU3OSwgMHhiYzVlNWVlMiwgMHgxNjBiMGIxZCwgMHhhZGRiZGI3NiwgMHhkYmUwZTAzYiwgMHg2NDMyMzI1NiwgMHg3NDNhM2E0ZSwgMHgxNDBhMGExZSwgMHg5MjQ5NDlkYiwgMHgwYzA2MDYwYSwgMHg0ODI0MjQ2YywgMHhiODVjNWNlNCwgMHg5ZmMyYzI1ZCwgMHhiZGQzZDM2ZSwgMHg0M2FjYWNlZiwgMHhjNDYyNjJhNiwgMHgzOTkxOTFhOCwgMHgzMTk1OTVhNCwgMHhkM2U0ZTQzNywgMHhmMjc5Nzk4YiwgMHhkNWU3ZTczMiwgMHg4YmM4Yzg0MywgMHg2ZTM3Mzc1OSwgMHhkYTZkNmRiNywgMHgwMThkOGQ4YywgMHhiMWQ1ZDU2NCwgMHg5YzRlNGVkMiwgMHg0OWE5YTllMCwgMHhkODZjNmNiNCwgMHhhYzU2NTZmYSwgMHhmM2Y0ZjQwNywgMHhjZmVhZWEyNSwgMHhjYTY1NjVhZiwgMHhmNDdhN2E4ZSwgMHg0N2FlYWVlOSwgMHgxMDA4MDgxOCwgMHg2ZmJhYmFkNSwgMHhmMDc4Nzg4OCwgMHg0YTI1MjU2ZiwgMHg1YzJlMmU3MiwgMHgzODFjMWMyNCwgMHg1N2E2YTZmMSwgMHg3M2I0YjRjNywgMHg5N2M2YzY1MSwgMHhjYmU4ZTgyMywgMHhhMWRkZGQ3YywgMHhlODc0NzQ5YywgMHgzZTFmMWYyMSwgMHg5NjRiNGJkZCwgMHg2MWJkYmRkYywgMHgwZDhiOGI4NiwgMHgwZjhhOGE4NSwgMHhlMDcwNzA5MCwgMHg3YzNlM2U0MiwgMHg3MWI1YjVjNCwgMHhjYzY2NjZhYSwgMHg5MDQ4NDhkOCwgMHgwNjAzMDMwNSwgMHhmN2Y2ZjYwMSwgMHgxYzBlMGUxMiwgMHhjMjYxNjFhMywgMHg2YTM1MzU1ZiwgMHhhZTU3NTdmOSwgMHg2OWI5YjlkMCwgMHgxNzg2ODY5MSwgMHg5OWMxYzE1OCwgMHgzYTFkMWQyNywgMHgyNzllOWViOSwgMHhkOWUxZTEzOCwgMHhlYmY4ZjgxMywgMHgyYjk4OThiMywgMHgyMjExMTEzMywgMHhkMjY5NjliYiwgMHhhOWQ5ZDk3MCwgMHgwNzhlOGU4OSwgMHgzMzk0OTRhNywgMHgyZDliOWJiNiwgMHgzYzFlMWUyMiwgMHgxNTg3ODc5MiwgMHhjOWU5ZTkyMCwgMHg4N2NlY2U0OSwgMHhhYTU1NTVmZiwgMHg1MDI4Mjg3OCwgMHhhNWRmZGY3YSwgMHgwMzhjOGM4ZiwgMHg1OWExYTFmOCwgMHgwOTg5ODk4MCwgMHgxYTBkMGQxNywgMHg2NWJmYmZkYSwgMHhkN2U2ZTYzMSwgMHg4NDQyNDJjNiwgMHhkMDY4NjhiOCwgMHg4MjQxNDFjMywgMHgyOTk5OTliMCwgMHg1YTJ
26774kMmQ3NywgMHgxZTBmMGYxMSwgMHg3YmIwYjBjYiwgMHhhODU0NTRmYywgMHg2ZGJiYmJkNiwgMHgyYzE2MTYzYV07XG5jb25zdCBUMiA9IFsweGE1YzY2MzYzLCAweDg0Zjg3YzdjLCAweDk5ZWU3Nzc3LCAweDhkZjY3YjdiLCAweDBkZmZmMmYyLCAweGJkZDY2YjZiLCAweGIxZGU2ZjZmLCAweDU0OTFjNWM1LCAweDUwNjAzMDMwLCAweDAzMDIwMTAxLCAweGE5Y2U2NzY3LCAweDdkNTYyYjJiLCAweDE5ZTdmZWZlLCAweDYyYjVkN2Q3LCAweGU2NGRhYmFiLCAweDlhZWM3Njc2LCAweDQ1OGZjYWNhLCAweDlkMWY4MjgyLCAweDQwODljOWM5LCAweDg3ZmE3ZDdkLCAweDE1ZWZmYWZhLCAweGViYjI1OTU5LCAweGM5OGU0NzQ3LCAweDBiZmJmMGYwLCAweGVjNDFhZGFkLCAweDY3YjNkNGQ0LCAweGZkNWZhMmEyLCAweGVhNDVhZmFmLCAweGJmMjM5YzljLCAweGY3NTNhNGE0LCAweDk2ZTQ3MjcyLCAweDViOWJjMGMwLCAweGMyNzViN2I3LCAweDFjZTFmZGZkLCAweGFlM2Q5MzkzLCAweDZhNGMyNjI2LCAweDVhNmMzNjM2LCAweDQxN2UzZjNmLCAweDAyZjVmN2Y3LCAweDRmODNjY2NjLCAweDVjNjgzNDM0LCAweGY0NTFhNWE1LCAweDM0ZDFlNWU1LCAweDA4ZjlmMWYxLCAweDkzZTI3MTcxLCAweDczYWJkOGQ4LCAweDUzNjIzMTMxLCAweDNmMmExNTE1LCAweDBjMDgwNDA0LCAweDUyOTVjN2M3LCAweDY1NDYyMzIzLCAweDVlOWRjM2MzLCAweDI4MzAxODE4LCAweGExMzc5Njk2LCAweDBmMGEwNTA1LCAweGI1MmY5YTlhLCAweDA5MGUwNzA3LCAweDM2MjQxMjEyLCAweDliMWI4MDgwLCAweDNkZGZlMmUyLCAweDI2Y2RlYmViLCAweDY5NGUyNzI3LCAweGNkN2ZiMmIyLCAweDlmZWE3NTc1LCAweDFiMTIwOTA5LCAweDllMWQ4MzgzLCAweDc0NTgyYzJjLCAweDJlMzQxYTFhLCAweDJkMzYxYjFiLCAweGIyZGM2ZTZlLCAweGVlYjQ1YTVhLCAweGZiNWJhMGEwLCAweGY2YTQ1MjUyLCAweDRkNzYzYjNiLCAweDYxYjdkNmQ2LCAweGNl
26774N2RiM2IzLCAweDdiNTIyOTI5LCAweDNlZGRlM2UzLCAweDcxNWUyZjJmLCAweDk3MTM4NDg0LCAweGY1YTY1MzUzLCAweDY4YjlkMWQxLCAweDAwMDAwMDAwLCAweDJjYzFlZGVkLCAweDYwNDAyMDIwLCAweDFmZTNmY2ZjLCAweGM4NzliMWIxLCAweGVkYjY1YjViLCAweGJlZDQ2YTZhLCAweDQ2OGRjYmNiLCAweGQ5NjdiZWJlLCAweDRiNzIzOTM5LCAweGRlOTQ0YTRhLCAweGQ0OTg0YzRjLCAweGU4YjA1ODU4LCAweDRhODVjZmNmLCAweDZiYmJkMGQwLCAweDJhYzVlZmVmLCAweGU1NGZhYWFhLCAweDE2ZWRmYmZiLCAweGM1ODY0MzQzLCAweGQ3OWE0ZDRkLCAweDU1NjYzMzMzLCAweDk0MTE4NTg1LCAweGNmOGE0NTQ1LCAweDEwZTlmOWY5LCAweDA2MDQwMjAyLCAweDgxZmU3ZjdmLCAweGYwYTA1MDUwLCAweDQ0NzgzYzNjLCAweGJhMjU5ZjlmLCAweGUzNGJhOGE4LCAweGYzYTI1MTUxLCAweGZlNWRhM2EzLCAweGMwODA0MDQwLCAweDhhMDU4ZjhmLCAweGFkM2Y5MjkyLCAweGJjMjE5ZDlkLCAweDQ4NzAzODM4LCAweDA0ZjFmNWY1LCAweGRmNjNiY2JjLCAweGMxNzdiNmI2LCAweDc1YWZkYWRhLCAweDYzNDIyMTIxLCAweDMwMjAxMDEwLCAweDFhZTVmZmZmLCAweDBlZmRmM2YzLCAweDZkYmZkMmQyLCAweDRjODFjZGNkLCAweDE0MTgwYzBjLCAweDM1MjYxMzEzLCAweDJmYzNlY2VjLCAweGUxYmU1ZjVmLCAweGEyMzU5Nzk3LCAweGNjODg0NDQ0LCAweDM5MmUxNzE3LCAweDU3OTNjNGM0LCAweGYyNTVhN2E3LCAweDgyZmM3ZTdlLCAweDQ3N2EzZDNkLCAweGFjYzg2NDY0LCAweGU3YmE1ZDVkLCAweDJiMzIxOTE5LCAweDk1ZTY3MzczLCAweGEwYzA2MDYwLCAweDk4MTk4MTgxLCAweGQxOWU0ZjRmLCAweDdmYTNkY2RjLCAweDY2NDQyMjIyLCAweDdlNTQyYTJhLCAweGFiM2I5MDkwLCAweDgzMGI4ODg4LCAweGNhOGM0NjQ2LCAweDI5YzdlZWVlLCAweGQzNmJiOGI4LCAweDNjMjgxNDE0LCAweDc5YTdkZWRlLCAweGUyYmM1ZTVlLCAweDFkMTYwYjBiLCAweDc2YWRkYmRiLCAweDNiZGJlMGUwLCAweDU2NjQzMjMyLCAweDRlNzQzYTNhLCAweDFlMTQwYTBhLCAweGRiOTI0OTQ5LCAweDBhMGMwNjA2LCAweDZjNDgyNDI0LCAweGU0Yjg1YzVjLCAweDVkOWZjMmMyLCAweDZlYmRkM2QzLCAweGVmNDNhY2FjLCAweGE2YzQ2MjYyLCAweGE4Mzk5MTkxLCAweGE0MzE5NTk1LCAweDM3ZDNlNGU0LCAweDhiZjI3OTc5LCAweDMyZDVlN2U3LCAweDQzOGJjOGM4LCAweDU5NmUzNzM3LCAweGI3ZGE2ZDZkLCAweDhjMDE4ZDhkLCAweDY0YjFkNWQ1LCAweGQyOWM0ZTRlLCAweGUwNDlhOWE5LCAweGI0ZDg2YzZjLCAweGZhYWM1NjU2LCAweDA3ZjNmNGY0LCAweDI1Y2ZlYWVhLCAweGFmY2E2NTY1LCAweDhlZjQ3YTdhLCAweGU5NDdhZWFlLCAweDE4MTAwODA4LCAweGQ1NmZiYWJhLCAweDg4ZjA3ODc4LCAweDZmNGEyNTI1LCAweDcyNWMyZTJlLCAweDI0MzgxYzFjLCAweGYxNTdhNmE2LCAweGM3NzNiNGI0LCAweDUxOTdjNmM2LCAweDIzY2JlOGU4LCAweDdjYTFkZGRkLCAweDljZTg3NDc0LCAweDIxM2UxZjFmLCAweGRkOTY0YjRiLCAweGRjNjFiZGJkLCAweDg2MGQ4YjhiLCAweDg1MGY4YThhLCAweDkwZTA3MDcwLCAweDQyN2MzZTNlLCAweGM0NzFiNWI1LCAweGFhY2M2NjY2LCAweGQ4OTA0ODQ4LCAweDA1MDYwMzAzLCAweDAxZjdmNmY2LCAweDEyMWMwZTBlLCAweGEzYzI2MTYxLCAweDVmNmEzNTM1LCAweGY5YWU1NzU3LCAweGQwNjliOWI5LCAweDkxMTc4Njg2LCAweDU4OTljMWMxLCAweDI3M2ExZDFkLCAweGI5Mjc5ZTllLCAweDM4ZDllMWUxLCAweDEzZWJmOGY4LCAweGIzMmI5ODk4LCAweDMzMjIxMTExLCAweGJiZDI2OTY5LCAweDcwYTlkOWQ5LCAweDg5MDc4ZThlLCAweGE3MzM5NDk0LCAweGI2MmQ5YjliLCAweDIyM2MxZTFlLCAweDkyMTU4Nzg3LCAweDIwYzllOWU5LCAweDQ5ODdjZWNlLCAweGZmYWE1NTU1LCAweDc4NTAyODI4LCAweDdhYTVkZmRmLCAweDhmMDM4YzhjLCAweGY4NTlhMWExLCAweDgwMDk4OTg5LCAweDE3MWEwZDBkLCAweGRhNjViZmJmLCAweDMxZDdlNmU2LCAweGM2ODQ0MjQyLCAweGI4ZDA2ODY4LCAweGMzODI0MTQxLCAweGIwMjk5OTk5LCAweDc3NWEyZDJkLCAweDExMWUwZjBmLCAweGNiN2JiMGIwLCAweGZjYTg1NDU0LCAweGQ2NmRiYmJiLCAweDNhMmMxNjE2XTtcbmNvbnN0IFQzID0gWzB4NjNhNWM2NjMsIDB4N2M4NGY4N2MsIDB4Nzc5OWVlNzcsIDB4N2I4ZGY2N2IsIDB4ZjIwZGZmZjIsIDB4NmJiZGQ2NmIsIDB4NmZiMWRlNmYsIDB4YzU1NDkxYzUsIDB4MzA1MDYwMzAsIDB4MDEwMzAyMDEsIDB4NjdhOWNlNjcsIDB4MmI3ZDU2MmIsIDB4ZmUxOWU3ZmUsIDB4ZDc2MmI1ZDcsIDB4YWJlNjRkYWIsIDB4NzY5YWVjNzYsIDB4Y2E0NThmY2EsIDB4ODI5ZDFmODIsIDB4Yzk0MDg5YzksIDB4N2Q4N2ZhN2QsIDB4ZmExNWVmZmEsIDB4NTllYmIyNTksIDB4NDdjOThlNDcsIDB4ZjAwYmZiZjAsIDB4YWRlYzQxYWQsIDB4ZDQ2N2IzZDQsIDB4YTJmZDVmYTIsIDB4YWZlYTQ1YWYsIDB4OWNiZjIzOWMsIDB4YTRmNzUzYTQsIDB4NzI5NmU0NzIsIDB4YzA1YjliYzAsIDB4YjdjMjc1YjcsIDB4ZmQxY2UxZmQsIDB4OTNhZTNkOTMsIDB4MjY2YTRjMjYsIDB4MzY1YTZjMzYsIDB4M2Y0MTdlM2YsIDB4ZjcwMmY1ZjcsIDB4Y2M0ZjgzY2MsIDB4MzQ1YzY4MzQsIDB4YTVmNDUxYTUsIDB4ZTUzNGQxZTUsIDB4ZjEwOGY5ZjEsIDB4NzE5M2UyNzEsIDB4ZDg3M2FiZDgsIDB4MzE1MzYyMzEsIDB4MTUzZjJhMTUsIDB4MDQwYzA4MDQsIDB4Yzc1Mjk1YzcsIDB4MjM2NTQ2MjMsIDB4YzM1ZTlkYzMsIDB4MTgyODMwMTgsIDB4OTZhMTM3OTYsIDB4MDUwZjBhMDUsIDB4OWFiNTJmOWEsIDB4MDcwOTBlMDcsIDB4MTIzNjI0MTIsIDB4ODA5YjFiODAsIDB4ZTIzZGRmZTIsIDB4ZWIyNmNkZWIsIDB4Mjc2OTRlMjcsIDB4YjJjZDdmYjIsIDB4NzU5ZmVhNzUsIDB4MDkxYjEyMDksIDB4ODM5ZTFkODMsIDB4MmM3NDU4MmMsIDB4MWEyZTM0MWEsIDB4MWIyZDM2MWIsIDB4NmViMmRjNmUsIDB4NWFlZWI0NWEsIDB4YTBmYjViYTAsIDB4NTJmNmE0NTIsIDB4M2I0ZDc2M2IsIDB4ZDY2MWI3ZDYsIDB4YjNjZTdkYjMsIDB4Mjk3YjUyMjksIDB4ZTMzZWRkZTMsIDB4MmY3MTVlMmYsIDB4ODQ5NzEzODQsIDB4NTNmNWE2NTMsIDB4ZDE2OGI5ZDEsIDB4MDAwMDAwMDAsIDB4ZWQyY2MxZWQsIDB4MjA2MDQwMjAsIDB4ZmMxZmUzZmMsIDB4YjFjODc5YjEsIDB4NWJlZGI2NWIsIDB4NmFiZWQ0NmEsIDB4Y2I0NjhkY2IsIDB4YmVkOTY3YmUsIDB4Mzk0YjcyMzksIDB4NGFkZTk0NGEsIDB4NGNkNDk4NGMsIDB4NThlOGIwNTgsIDB4Y2Y0YTg1Y2YsIDB4ZDA2YmJiZDAsIDB4ZWYyYWM1ZWYsIDB4YWFlNTRmYWEsIDB4ZmIxNmVk
26774ZmIsIDB4NDNjNTg2NDMsIDB4NGRkNzlhNGQsIDB4MzM1NTY2MzMsIDB4ODU5NDExODUsIDB4NDVjZjhhNDUsIDB4ZjkxMGU5ZjksIDB4MDIwNjA0MDIsIDB4N2Y4MWZlN2YsIDB4NTBmMGEwNTAsIDB4M2M0NDc4M2MsIDB4OWZiYTI1OWYsIDB4YThlMzRiYTgsIDB4NTFmM2EyNTEsIDB4YTNmZTVkYTMsIDB4NDBjMDgwNDAsIDB4OGY4YTA1OGYsIDB4OTJhZDNmOTIsIDB4OWRiYzIxOWQsIDB4Mzg0ODcwMzgsIDB4ZjUwNGYxZjUsIDB4YmNkZjYzYmMsIDB4YjZjMTc3YjYsIDB4ZGE3NWFmZGEsIDB4MjE2MzQyMjEsIDB4MTAzMDIwMTAsIDB4ZmYxYWU1ZmYsIDB4ZjMwZWZkZjMsIDB4ZDI2ZGJmZDIsIDB4Y2Q0YzgxY2QsIDB4MGMxNDE4MGMsIDB4MTMzNTI2MTMsIDB4ZWMyZmMzZWMsIDB4NWZlMWJlNWYsIDB4OTdhMjM1OTcsIDB4NDRjYzg4NDQsIDB4MTczOTJlMTcsIDB4YzQ1NzkzYzQsIDB4YTdmMjU1YTcsIDB4N2U4MmZjN2UsIDB4M2Q0NzdhM2QsIDB4NjRhY2M4NjQsIDB4NWRlN2JhNWQsIDB4MTkyYjMyMTksIDB4NzM5NWU2NzMsIDB4NjBhMGMwNjAsIDB4ODE5ODE5ODEsIDB4NGZkMTllNGYsIDB4ZGM3ZmEzZGMsIDB4MjI2NjQ0MjIsIDB4MmE3ZTU0MmEsIDB4OTBhYjNiOTAsIDB4ODg4MzBiODgsIDB4NDZjYThjNDYsIDB4ZWUyOWM3ZWUsIDB4YjhkMzZiYjgsIDB4MTQzYzI4MTQsIDB4ZGU3OWE3ZGUsIDB4NWVlMmJjNWUsIDB4MGIxZDE2MGIsIDB4ZGI3NmFkZGIsIDB4ZTAzYmRiZTAsIDB4MzI1NjY0MzIsIDB4M2E0ZTc0M2EsIDB4MGExZTE0MGEsIDB4NDlkYjkyNDksIDB4MDYwYTBjMDYsIDB4MjQ2YzQ4MjQsIDB4NWNlNGI4NWMsIDB4YzI1ZDlmYzIsIDB4ZDM2ZWJkZDMsIDB4YWNlZjQzYWMsIDB4NjJhNmM0NjIsIDB4OTFhODM5OTEsIDB4OTVhNDMxOTUsIDB4ZTQzN2QzZTQsIDB4Nzk4YmYyNzksIDB4ZTczMmQ1ZTcsIDB4Yzg0MzhiYzgsIDB4Mzc1OTZlMzcsIDB4NmRiN2RhNmQsIDB4OGQ4YzAxOGQsIDB4ZDU2NGIxZDUsIDB4NGVkMjljNGUsIDB4YTllMDQ5YTksIDB4NmNiNGQ4NmMsIDB4NTZmYWFjNTYsIDB4ZjQwN2YzZjQsIDB4ZWEyNWNmZWEsIDB4NjVhZmNhNjUsIDB4N2E4ZWY0N2EsIDB4YWVlOTQ3YWUsIDB4MDgxODEwMDgsIDB4YmFkNTZmYmEsIDB4Nzg4OGYwNzgsIDB4MjU2ZjRhMjUsIDB4MmU3MjVjMmUsIDB4MWMyNDM4MWMsIDB4YTZmMTU3YTYsIDB4YjRjNzczYjQsIDB4YzY1MTk3YzYsIDB4ZTgyM2NiZTgsIDB4ZGQ3Y2ExZGQsIDB4NzQ5Y2U4NzQsIDB4MWYyMTNlMWYsIDB4NGJkZDk2NGIsIDB4YmRkYzYxYmQsIDB4OGI4NjBkOGIsIDB4OGE4NTBmOGEsIDB4NzA5MGUwNzAsIDB4M2U0MjdjM2UsIDB4YjVjNDcxYjUsIDB4NjZhYWNjNjYsIDB4NDhkODkwNDgsIDB4MDMwNTA2MDMsIDB4ZjYwMWY3ZjYsIDB4MGUxMjFjMGUsIDB4NjFhM2MyNjEsIDB4MzU1ZjZhMzUsIDB4NTdmOWFlNTcsIDB4YjlkMDY5YjksIDB4ODY5MTE3ODYsIDB4YzE1ODk5YzEsIDB4MWQyNzNhMWQsIDB4OWViOTI3OWUsIDB4ZTEzOGQ5ZTEsIDB4ZjgxM2ViZjgsIDB4OThiMzJiOTgsIDB4MTEzMzIyMTEsIDB4NjliYmQyNjksIDB4ZDk3MGE5ZDksIDB4OGU4OTA3OGUsIDB4OTRhNzMzOTQsIDB4OWJiNjJkOWIsIDB4MWUyMjNjMWUsIDB4ODc5MjE1ODcsIDB4ZTkyMGM5ZTksIDB4Y2U0OTg3Y2UsIDB4NTVmZmFhNTUsIDB4Mjg3ODUwMjgsIDB4ZGY3YWE1ZGYsIDB4OGM4ZjAzOGMsIDB4YTFmODU5YTEsIDB4ODk4MDA5ODksIDB4MGQxNzFhMGQsIDB4YmZkYTY1YmYsIDB4ZTYzMWQ3ZTYsIDB4NDJjNjg0NDIsIDB4NjhiOGQwNjgsIDB4NDFjMzgyNDEsIDB4OTliMDI5OTksIDB4MmQ3NzVhMmQsIDB4MGYxMTFlMGYsIDB4YjBjYjdiYjAsIDB4NTRmY2E4NTQsIDB4YmJkNjZkYmIsIDB4MTYzYTJjMTZdO1xuY29uc3QgVDQgPSBbMHg2MzYzYTVjNiwgMHg3YzdjODRmOCwgMHg3Nzc3OTllZSwgMHg3YjdiOGRmNiwgMHhmMmYyMGRmZiwgMHg2YjZiYmRkNiwgMHg2ZjZmYjFkZSwgMHhjNWM1NTQ5MSwgMHgzMDMwNTA2MCwgMHgwMTAxMDMwMiwgMHg2NzY3YTljZSwgMHgyYjJiN2Q1NiwgMHhmZWZlMTllNywgMHhkN2Q3NjJiNSwgMHhhYmFiZTY0ZCwgMHg3Njc2OWFlYywgMHhjYWNhNDU4ZiwgMHg4MjgyOWQxZiwgMHhjOWM5NDA4OSwgMHg3ZDdkODdmYSwgMHhmYWZhMTVlZiwgMHg1OTU5ZWJiMiwgMHg0NzQ3Yzk4ZSwgMHhmMGYwMGJmYiwgMHhhZGFkZWM0MSwgMHhkNGQ0NjdiMywgMHhhMmEyZmQ1ZiwgMHhhZmFmZWE0NSwgMHg5YzljYmYyMywgMHhhNGE0Zjc1MywgMHg3MjcyOTZlNCwgMHhjMGMwNWI5YiwgMHhiN2I3YzI3NSwgMHhmZGZkMWNlMSwgMHg5MzkzYWUzZCwgMHgyNjI2NmE0YywgMHgzNjM2NWE2YywgMHgzZjNmNDE3ZSwgMHhmN2Y3MDJmNSwgMHhjY2NjNGY4MywgMHgzNDM0NWM2OCwgMHhhNWE1ZjQ1MSwgMHhlNWU1MzRkMSwgMHhmMWYxMDhmOSwgMHg3MTcxOTNlMiwgMHhkOGQ4NzNhYiwgMHgzMTMxNTM2MiwgMHgxNTE1M2YyYSwgMHgwNDA0MGMwOCwgMHhjN2M3NTI5NSwgMHgyMzIzNjU0NiwgMHhjM2MzNWU5ZCwgMHgxODE4MjgzMCwgMHg5Njk2YTEzNywgMHgwNTA1MGYwYSwgMHg5YTlhYjUyZiwgMHgwNzA3MDkwZSwgMHgxMjEyMzYyNCwgMHg4MDgwOWIxYiwgMHhlMmUyM2RkZiwgMHhlYmViMjZjZCwgMHgyNzI3Njk0ZSwgMHhiMmIyY2Q3ZiwgMHg3NTc1OWZlYSwgMHgwOTA5MWIxMiwgMHg4MzgzOWUxZCwgMHgyYzJjNzQ1OCwgMHgxYTFhMmUzNCwgMHgxYjFiMmQzNiwgMHg2ZTZlYjJkYywgMHg1YTVhZWViNCwgMHhhMGEwZmI1YiwgMHg1MjUyZjZhNCwgMHgzYjNiNGQ3NiwgMHhkNmQ2NjFiNywgMHhiM2IzY2U3ZCwgMHgyOTI5N2I1MiwgMHhlM2UzM2VkZCwgMHgyZjJmNzE1ZSwgMHg4NDg0OTcxMywgMHg1MzUzZjVhNiwgMHhkMWQxNjhiOSwgMHgwMDAwMDAwMCwgMHhlZGVkMmNjMSwgMHgyMDIwNjA0MCwgMHhmY2ZjMWZlMywgMHhiMWIxYzg3OSwgMHg1YjViZWRiNiwgMHg2YTZhYmVkNCwgMHhjYmNiNDY4ZCwgMHhiZWJlZDk2NywgMHgzOTM5NGI3MiwgMHg0YTRhZGU5NCwgMHg0YzRjZDQ5OCwgMHg1ODU4ZThiMCwgMHhjZmNmNGE4NSwgMHhkMGQwNmJiYiwgMHhlZmVmMmFjNSwgMHhhYWFhZTU0ZiwgMHhmYmZiMTZlZCwgMHg0MzQzYzU4NiwgMHg0ZDRkZDc5YSwgMHgzMzMzNTU2NiwgMHg4NTg1OTQxMSwgMHg0NTQ1Y2Y4YSwgMHhmOWY5MTBlOSwgMHgwMjAyMDYwNCwgMHg3ZjdmODFmZSwgMHg1MDUwZjBhMCwgMHgzYzNjNDQ3OCwgMHg5ZjlmYmEyNSwgMHhhOGE4ZTM0YiwgMHg1MTUxZjNhMiwgMHhhM2EzZmU1ZCwgMHg0MDQwYzA4MCwgMHg4ZjhmOGEwNSwgMHg5MjkyYWQzZiwgMHg5ZDlkYmMyMSwgMHgzODM4NDg3MCwgMHhmNWY1MDRmMSwgMHhiY2JjZGY2MywgMHhiNmI2YzE3NywgMHhkYWRhNzVhZiwgMHgyMTIxNjM0MiwgMHgxMDEwMzAyMCwgMHhmZmZmMWFlNSwgMHhmM2YzMGVmZCwgMHhkMmQyNmRiZiwgMHhjZGNkNGM4MSwgMHgwYzBjMTQxOCwgMHgxMzEzMzUyNiwgMHhlY2VjMmZjMywgMHg1ZjVmZTFiZSwgMHg5Nzk3YTIzNSwgMHg0NDQ0Y2M4OCwgMHgxNzE3MzkyZSwgMHhjNGM0NTc5MywgMHhhN2E3ZjI1NSwgMHg3ZTdlODJmYywgMHgzZDNkNDc3YSwgMHg2NDY0YWNjOCwgMHg1ZDVkZTdiYSwgMHgxOTE5MmIzMiwgMHg3MzczOTVlNiwgMHg2MDYwYTBjMCwgMHg4MTgxOTgxOSwgMHg0ZjRmZDE5ZSwgMHhkY2RjN2ZhMywgMHgyMjIyNjY0NCwgMHgyYTJhN2U1NCwgMHg5MDkwYWIzYiwgMHg4ODg4ODMwYiwgMHg0NjQ2Y2E4YywgMHhlZWVlMjljNywgMHhiOGI4ZDM2YiwgMHgxNDE0M2MyOCwgMHhkZWRlNzlhNywgMHg1ZTVlZTJiYywgMHgwYjBiMWQxNiwgMHhkYmRiNzZhZCwgMHhlMGUwM2JkYiwgMHgzMjMyNTY2NCwgMHgzYTNhNGU3NCwgMHgwYTBhMWUxNCwgMHg0OTQ5ZGI5MiwgMHgwNjA2MGEwYywgMHgyNDI0NmM0OCwgMHg1YzVjZTRiOCwgMHhjMmMyNWQ5ZiwgMHhkM2QzNmViZCwgMHhhY2FjZWY0MywgMHg2MjYyYTZjNCwgMHg5MTkxYTgzOSwgMHg5NTk1YTQzMSwgMHhlNGU0MzdkMywgMHg3OTc5OGJmMiwgMHhlN2U3MzJkNSwgMHhjOGM4NDM4YiwgMHgzNzM3NTk2ZSwgMHg2ZDZkYjdkYSwgMHg4ZDhkOGMwMSwgMHhkNWQ1NjRiMSwgMHg0ZTRlZDI5YywgMHhhOWE5ZTA0OSwgMHg2YzZjYjRkOCwgMHg1NjU2ZmFhYywgMHhmNGY0MDdmMywgMHhlYWVhMjVjZiwgMHg2NTY1YWZjYSwgMHg3YTdhOGVmNCwgMHhhZWFlZTk0NywgMHgwODA4MTgxMCwgMHhiYWJhZDU2ZiwgMHg3ODc4ODhmMCwgMHgyNTI1NmY0YSwgMHgyZTJlNzI1YywgMHgxYzFjMjQzOCwgMHhhNmE2ZjE1NywgMHhiNGI0Yzc3MywgMHhjNmM2NTE5NywgMHhlOGU4MjNjYiwgMHhkZGRkN2NhMSwgMHg3NDc0OWNlOCwgMHgxZjFmMjEzZSwgMHg0YjRiZGQ5NiwgMHhiZGJkZGM2MSwgMHg4YjhiODYwZCwgMHg4YThhODUwZiwgMHg3MDcwOTBlMCwgMHgzZTNlNDI3YywgMHhiNWI1YzQ3MSwgMHg2NjY2YWFjYywgMHg0ODQ4ZDg5MCwgMHgwMzAzMDUwNiwgMHhmNmY2MDFmNywgMHgwZTBlMTIxYywgMHg2MTYxYTNjMiwgMHgzNTM1NWY2YSwgMHg1NzU3ZjlhZSwgMHhiOWI5ZDA2OSwgMHg4Njg2OTExNywgMHhjMWMxNTg5OSwgMHgxZDFkMjczYSwgMHg5ZTllYjkyNywgMHhlMWUxMzhkOSwgMHhmOGY4MTNlYiwgMHg5ODk4YjMyYiwgMHgxMTExMzMyMiwgMHg2OTY5YmJkMiwgMHhkOWQ5NzBhOSwgMHg4ZThlODkwNywgMHg5NDk0YTczMywgMHg5YjliYjYyZCwgMHgxZTFlMjIzYywgMHg4Nzg3OTIxNSwgMHhlOWU5MjBjOSwgMHhjZWNlNDk4NywgMHg1NTU1ZmZhYSwgMHgyODI4Nzg1MCwgMHhkZmRmN2FhNSwgMHg4YzhjOGYwMywgMHhhMWExZjg1OSwgMHg4OTg5ODAwOSwgMHgwZDBkMTcxYSwgMHhiZmJmZGE2NSwgMHhlNmU2MzFkNywgMHg0MjQyYzY4NCwgMHg2ODY4YjhkMCwgMHg0MTQxYzM4MiwgMHg5OTk5YjAyOSwgMHgyZDJkNzc1YSwgMHgwZjBmMTExZSwgMHhiMGIwY2I3YiwgMHg1NDU0ZmNhOCwgMHhiYmJiZDY2ZCwgMHgxNjE2M2EyY107XG4vLyBUcmFuc2Zvcm1hdGlvbnMgZm9yIGRlY3J5cHRpb25cbmNvbnN0IFQ1ID0gWzB4NTFmNGE3NTAsIDB4N2U0MTY1NTMsIDB4MWExN2E0YzMsIDB4M2EyNzVlOTYsIDB4M2JhYjZiY2IsIDB4MWY5ZDQ1ZjEsIDB4YWNmYTU4YWIsIDB4NGJlMzAzOTMsIDB4MjAzMGZhNTUsIDB4YWQ3NjZkZjYsIDB4ODhjYzc2OTEsIDB4ZjUwMjRjMjUsIDB4NGZlNWQ3ZmMsIDB4YzUyYWNiZDcsIDB4MjYzNTQ0ODA
26774sIDB4YjU2MmEzOGYsIDB4ZGViMTVhNDksIDB4MjViYTFiNjcsIDB4NDVlYTBlOTgsIDB4NWRmZWMwZTEsIDB4YzMyZjc1MDIsIDB4ODE0Y2YwMTIsIDB4OGQ0Njk3YTMsIDB4NmJkM2Y5YzYsIDB4MDM4ZjVmZTcsIDB4MTU5MjljOTUsIDB4YmY2ZDdhZWIsIDB4OTU1MjU5ZGEsIDB4ZDRiZTgzMmQsIDB4NTg3NDIxZDMsIDB4NDllMDY5MjksIDB4OGVjOWM4NDQsIDB4NzVjMjg5NmEsIDB4ZjQ4ZTc5NzgsIDB4OTk1ODNlNmIsIDB4MjdiOTcxZGQsIDB4YmVlMTRmYjYsIDB4ZjA4OGFkMTcsIDB4YzkyMGFjNjYsIDB4N2RjZTNhYjQsIDB4NjNkZjRhMTgsIDB4ZTUxYTMxODIsIDB4OTc1MTMzNjAsIDB4NjI1MzdmNDUsIDB4YjE2NDc3ZTAsIDB4YmI2YmFlODQsIDB4ZmU4MWEwMWMsIDB4ZjkwODJiOTQsIDB4NzA0ODY4NTgsIDB4OGY0NWZkMTksIDB4OTRkZTZjODcsIDB4NTI3YmY4YjcsIDB4YWI3M2QzMjMsIDB4NzI0YjAyZTIsIDB4ZTMxZjhmNTcsIDB4NjY1NWFiMmEsIDB4YjJlYjI4MDcsIDB4MmZiNWMyMDMsIDB4ODZjNTdiOWEsIDB4ZDMzNzA4YTUsIDB4MzAyODg3ZjIsIDB4MjNiZmE1YjIsIDB4MDIwMzZhYmEsIDB4ZWQxNjgyNWMsIDB4OGFjZjFjMmIsIDB4YTc3OWI0OTIsIDB4ZjMwN2YyZjAsIDB4NGU2OWUyYTEsIDB4NjVkYWY0Y2QsIDB4MDYwNWJlZDUsIDB4ZDEzNDYyMWYsIDB4YzRhNmZlOGEsIDB4MzQyZTUzOWQsIDB4YTJmMzU1YTAsIDB4MDU4YWUxMzIsIDB4YTRmNmViNzUsIDB4MGI4M2VjMzksIDB4NDA2MGVmYWEsIDB4NWU3MTlmMDYsIDB4YmQ2ZTEwNTEsIDB4M2UyMThhZjksIDB4OTZkZDA2M2QsIDB4ZGQzZTA1YWUsIDB4NGRlNmJkNDYsIDB4OTE1NDhkYjUsIDB4NzFjNDVkMDUsIDB4MDQwNmQ0NmYsIDB4NjA1MDE1ZmYsIDB4MTk5OGZiMjQsIDB4ZDZiZGU5OTcsIDB4ODk0MDQzY2MsIDB4NjdkOTllNzcsIDB4YjBlODQyYmQsIDB4MDc4OThiODgsIDB4ZTcxOTViMzgsIDB4NzljOGVlZGIsIDB4YTE3YzBhNDcsIDB4N2M0MjBmZTksIDB4Zjg4NDFlYzksIDB4MDAwMDAwMDAsIDB4MDk4MDg2ODMsIDB4MzIyYmVkNDgsIDB4MWUxMTcwYWMsIDB4NmM1YTcyNGUsIDB4ZmQwZWZmZmIsIDB4MGY4NTM4NTYsIDB4M2RhZWQ1MWUsIDB4MzYyZDM5MjcsIDB4MGEwZmQ5NjQsIDB4Njg1Y2E2MjEsIDB4OWI1YjU0ZDEsIDB4MjQzNjJlM2EsIDB4MGMwYTY3YjEsIDB4OTM1N2U3MGYsIDB4YjRlZTk2ZDIsIDB4MWI5YjkxOWUsIDB4ODBjMGM1NGYsIDB4NjFkYzIwYTIsIDB4NWE3NzRiNjksIDB4MWMxMjFhMTYsIDB4ZTI5M2JhMGEsIDB4YzBhMDJhZTUsIDB4M2MyMmUwNDMsIDB4MTIxYjE3MWQsIDB4MGUwOTBkMGIsIDB4ZjI4YmM3YWQsIDB4MmRiNmE4YjksIDB4MTQxZWE5YzgsIDB4NTdmMTE5ODUsIDB4YWY3NTA3NGMsIDB4ZWU5OWRkYmIsIDB4YTM3ZjYwZmQsIDB4ZjcwMTI2OWYsIDB4NWM3MmY1YmMsIDB4NDQ2NjNiYzUsIDB4NWJmYjdlMzQsIDB4OGI0MzI5NzYsIDB4Y2IyM2M2ZGMsIDB4YjZlZGZjNjgsIDB4YjhlNGYxNjMsIDB4ZDczMWRjY2EsIDB4NDI2Mzg1MTAsIDB4MTM5NzIyNDAsIDB4ODRjNjExMjAsIDB4ODU0YTI0N2QsIDB4ZDJiYjNkZjgsIDB4YWVmOTMyMTEsIDB4YzcyOWExNmQsIDB4MWQ5ZTJmNGIsIDB4ZGNiMjMwZjMsIDB4MGQ4NjUyZWMsIDB4NzdjMWUzZDAsIDB4MmJiMzE2NmMsIDB4YTk3MGI5OTksIDB4MTE5NDQ4ZmEsIDB4NDdlOTY0MjIsIDB4YThmYzhjYzQsIDB4YTBmMDNmMWEsIDB4NTY3ZDJjZDgsIDB4MjIzMzkwZWYsIDB4ODc0OTRlYzcsIDB4ZDkzOGQxYzEsIDB4OGNjYWEyZmUsIDB4OThkNDBiMzYsIDB4YTZmNTgxY2YsIDB4YTU3YWRlMjgsIDB4ZGFiNzhlMjYsIDB4M2ZhZGJmYTQsIDB4MmMzYTlkZTQsIDB4NTA3ODkyMGQsIDB4NmE1ZmNjOWIsIDB4NTQ3ZTQ2NjIsIDB4ZjY4ZDEzYzIsIDB4OTBkOGI4ZTgsIDB4MmUzOWY3NWUsIDB4ODJjM2FmZjUsIDB4OWY1ZDgwYmUsIDB4NjlkMDkzN2MsIDB4NmZkNTJkYTksIDB4Y2YyNTEyYjMsIDB4YzhhYzk5M2IsIDB4MTAxODdkYTcsIDB4ZTg5YzYzNmUsIDB4ZGIzYmJiN2IsIDB4Y2QyNjc4MDksIDB4NmU1OTE4ZjQsIDB4ZWM5YWI3MDEsIDB4ODM0ZjlhYTgsIDB4ZTY5NTZlNjUsIDB4YWFmZmU2N2UsIDB4MjFiY2NmMDgsIDB4ZWYxNWU4ZTYsIDB4YmFlNzliZDksIDB4NGE2ZjM2Y2UsIDB4ZWE5ZjA5ZDQsIDB4MjliMDdjZDYsIDB4MzFhNGIyYWYsIDB4MmEzZjIzMzEsIDB4YzZhNTk0MzAsIDB4MzVhMjY2YzAsIDB4NzQ0ZWJjMzcsIDB4ZmM4MmNhYTYsIDB4ZTA5MGQwYjAsIDB4MzNhN2Q4MTUsIDB4ZjEwNDk4NGEsIDB4NDFlY2RhZjcsIDB4N2ZjZDUwMGUsIDB4MTc5MWY2MmYsIDB4NzY0ZGQ2OGQsIDB4NDNlZmIwNGQsIDB4Y2NhYTRkNTQsIDB4ZTQ5NjA0ZGYsIDB4OWVkMWI1ZTMsIDB4NGM2YTg4MWIsIDB4YzEyYzFmYjgsIDB4NDY2NTUxN2YsIDB4OWQ1ZWVhMDQsIDB4MDE4YzM1NWQsIDB4ZmE4Nzc0NzMsIDB4ZmIwYjQxMmUsIDB4YjM2NzFkNWEsIDB4OTJkYmQyNTIsIDB4ZTkxMDU2MzMsIDB4NmRkNjQ3MTMsIDB4OWFkNzYxOGMsIDB4MzdhMTBjN2EsIDB4NTlmODE0OGUsIDB4ZWIxMzNjODksIDB4Y2VhOTI3ZWUsIDB4Yjc2MWM5MzUsIDB4ZTExY2U1ZWQsIDB4N2E0N2IxM2MsIDB4OWNkMmRmNTksIDB4NTVmMjczM2YsIDB4MTgxNGNlNzksIDB4NzNjNzM3YmYsIDB4NTNmN2NkZWEsIDB4NWZmZGFhNWIsIDB4ZGYzZDZmMTQsIDB4Nzg0NGRiODYsIDB4Y2FhZmYzODEsIDB4Yjk2OGM0M2UsIDB4MzgyNDM0MmMsIDB4YzJhMzQwNWYsIDB4MTYxZGMzNzIsIDB4YmNlMjI1MGMsIDB4MjgzYzQ5OGIsIDB4ZmYwZDk1NDEsIDB4MzlhODAxNzEsIDB4MDgwY2IzZGUsIDB4ZDhiNGU0OWMsIDB4NjQ1NmMxOTAsIDB4N2JjYjg0NjEsIDB4ZDUzMmI2NzAsIDB4NDg2YzVjNzQsIDB4ZDBiODU3NDJdO1xuY29uc3QgVDYgPSBbMHg1MDUxZjRhNywgMHg1MzdlNDE2NSwgMHhjMzFhMTdhNCwgMHg5NjNhMjc1ZSwgMHhjYjNiYWI2YiwgMHhmMTFmOWQ0NSwgMHhhYmFjZmE1OCwgMHg5MzRiZTMwMywgMHg1NTIwMzBmYSwgMHhmNmFkNzY2ZCwgMHg5MTg4Y2M3NiwgMHgyNWY1MDI0YywgMHhmYzRmZTVkNywgMHhkN2M1MmFjYiwgMHg4MDI2MzU0NCwgMHg4ZmI1NjJhMywgMHg0OWRlYjE1YSwgMHg2NzI1YmExYiwgMHg5ODQ1ZWEwZSwgMHhlMTVkZmVjMCwgMHgwMmMzMmY3NSwgMHgxMjgxNGNmMCwgMHhhMzhkNDY5NywgMHhjNjZiZDNmOSwgMHhlNzAzOGY1ZiwgMHg5NTE1OTI5YywgMHhlYmJmNmQ3YSwgMHhkYTk1NTI1OSwgMHgyZGQ0YmU4MywgMHhkMzU4NzQyMSwgMHgyOTQ5ZTA2OSwgMHg0NDhlYzljOCwgMHg2YTc1YzI4OSwgMHg3OGY0OGU3OSwgMHg2Yjk5NTgzZSwgMHhkZDI3Yjk3MSwgMHhiNmJlZTE0ZiwgMHgxN2YwODhhZCwgMHg2NmM5MjBhYywgMHhiNDdkY2UzYSwgMHgxODYzZGY0YSwgMHg4MmU1MWEzMSwgMHg2MDk3NTEzMywgMHg0NTYyNTM3ZiwgMHhlMGIxNjQ3NywgMHg4NGJiNmJhZSwgMHgxY2ZlODFhMCwgMHg5NGY5MDgyYiwgMHg1ODcwNDg2OCwgMHgxOThmNDVmZCwgMHg4Nzk0
26774ZGU2YywgMHhiNzUyN2JmOCwgMHgyM2FiNzNkMywgMHhlMjcyNGIwMiwgMHg1N2UzMWY4ZiwgMHgyYTY2NTVhYiwgMHgwN2IyZWIyOCwgMHgwMzJmYjVjMiwgMHg5YTg2YzU3YiwgMHhhNWQzMzcwOCwgMHhmMjMwMjg4NywgMHhiMjIzYmZhNSwgMHhiYTAyMDM2YSwgMHg1Y2VkMTY4MiwgMHgyYjhhY2YxYywgMHg5MmE3NzliNCwgMHhmMGYzMDdmMiwgMHhhMTRlNjllMiwgMHhjZDY1ZGFmNCwgMHhkNTA2MDViZSwgMHgxZmQxMzQ2MiwgMHg4YWM0YTZmZSwgMHg5ZDM0MmU1MywgMHhhMGEyZjM1NSwgMHgzMjA1OGFlMSwgMHg3NWE0ZjZlYiwgMHgzOTBiODNlYywgMHhhYTQwNjBlZiwgMHgwNjVlNzE5ZiwgMHg1MWJkNmUxMCwgMHhmOTNlMjE4YSwgMHgzZDk2ZGQwNiwgMHhhZWRkM2UwNSwgMHg0NjRkZTZiZCwgMHhiNTkxNTQ4ZCwgMHgwNTcxYzQ1ZCwgMHg2ZjA0MDZkNCwgMHhmZjYwNTAxNSwgMHgyNDE5OThmYiwgMHg5N2Q2YmRlOSwgMHhjYzg5NDA0MywgMHg3NzY3ZDk5ZSwgMHhiZGIwZTg0MiwgMHg4ODA3ODk4YiwgMHgzOGU3MTk1YiwgMHhkYjc5YzhlZSwgMHg0N2ExN2MwYSwgMHhlOTdjNDIwZiwgMHhjOWY4ODQxZSwgMHgwMDAwMDAwMCwgMHg4MzA5ODA4NiwgMHg0ODMyMmJlZCwgMHhhYzFlMTE3MCwgMHg0ZTZjNWE3MiwgMHhmYmZkMGVmZiwgMHg1NjBmODUzOCwgMHgxZTNkYWVkNSwgMHgyNzM2MmQzOSwgMHg2NDBhMGZkOSwgMHgyMTY4NWNhNiwgMHhkMTliNWI1NCwgMHgzYTI0MzYyZSwgMHhiMTBjMGE2NywgMHgwZjkzNTdlNywgMHhkMmI0ZWU5NiwgMHg5ZTFiOWI5MSwgMHg0ZjgwYzBjNSwgMHhhMjYxZGMyMCwgMHg2OTVhNzc0YiwgMHgxNjFjMTIxYSwgMHgwYWUyOTNiYSwgMHhlNWMwYTAyYSwgMHg0MzNjMjJlMCwgMHgxZDEyMWIxNywgMHgwYjBlMDkwZCwgMHhhZGYyOGJjNywgMHhiOTJkYjZhOCwgMHhjODE0MWVhOSwgMHg4NTU3ZjExOSwgMHg0Y2FmNzUwNywgMHhiYmVlOTlkZCwgMHhmZGEzN2Y2MCwgMHg5ZmY3MDEyNiwgMHhiYzVjNzJmNSwgMHhjNTQ0NjYzYiwgMHgzNDViZmI3ZSwgMHg3NjhiNDMyOSwgMHhkY2NiMjNjNiwgMHg2OGI2ZWRmYywgMHg2M2I4ZTRmMSwgMHhjYWQ3MzFkYywgMHgxMDQyNjM4NSwgMHg0MDEzOTcyMiwgMHgyMDg0YzYxMSwgMHg3ZDg1NGEyNCwgMHhmOGQyYmIzZCwgMHgxMWFlZjkzMiwgMHg2ZGM3MjlhMSwgMHg0YjFkOWUyZiwgMHhmM2RjYjIzMCwgMHhlYzBkODY1MiwgMHhkMDc3YzFlMywgMHg2YzJiYjMxNiwgMHg5OWE5NzBiOSwgMHhmYTExOTQ0OCwgMHgyMjQ3ZTk2NCwgMHhjNGE4ZmM4YywgMHgxYWEwZjAzZiwgMHhkODU2N2QyYywgMHhlZjIyMzM5MCwgMHhjNzg3NDk0ZSwgMHhjMWQ5MzhkMSwgMHhmZThjY2FhMiwgMHgzNjk4ZDQwYiwgMHhjZmE2ZjU4MSwgMHgyOGE1N2FkZSwgMHgyNmRhYjc4ZSwgMHhhNDNmYWRiZiwgMHhlNDJjM2E5ZCwgMHgwZDUwNzg5MiwgMHg5YjZhNWZjYywgMHg2MjU0N2U0NiwgMHhjMmY2OGQxMywgMHhlODkwZDhiOCwgMHg1ZTJlMzlmNywgMHhmNTgyYzNhZiwgMHhiZTlmNWQ4MCwgMHg3YzY5ZDA5MywgMHhhOTZmZDUyZCwgMHhiM2NmMjUxMiwgMHgzYmM4YWM5OSwgMHhhNzEwMTg3ZCwgMHg2ZWU4OWM2MywgMHg3YmRiM2JiYiwgMHgwOWNkMjY3OCwgMHhmNDZlNTkxOCwgMHgwMWVjOWFiNywgMHhhODgzNGY5YSwgMHg2NWU2OTU2ZSwgMHg3ZWFhZmZlNiwgMHgwODIxYmNjZiwgMHhlNmVmMTVlOCwgMHhkOWJhZTc5YiwgMHhjZTRhNmYzNiwgMHhkNGVhOWYwOSwgMHhkNjI5YjA3YywgMHhhZjMxYTRiMiwgMHgzMTJhM2YyMywgMHgzMGM2YTU5NCwgMHhjMDM1YTI2NiwgMHgzNzc0NGViYywgMHhhNmZjODJjYSwgMHhiMGUwOTBkMCwgMHgxNTMzYTdkOCwgMHg0YWYxMDQ5OCwgMHhmNzQxZWNkYSwgMHgwZTdmY2Q1MCwgMHgyZjE3OTFmNiwgMHg4ZDc2NGRkNiwgMHg0ZDQzZWZiMCwgMHg1NGNjYWE0ZCwgMHhkZmU0OTYwNCwgMHhlMzllZDFiNSwgMHgxYjRjNmE4OCwgMHhiOGMxMmMxZiwgMHg3ZjQ2NjU1MSwgMHgwNDlkNWVlYSwgMHg1ZDAxOGMzNSwgMHg3M2ZhODc3NCwgMHgyZWZiMGI0MSwgMHg1YWIzNjcxZCwgMHg1MjkyZGJkMiwgMHgzM2U5MTA1NiwgMHgxMzZkZDY0NywgMHg4YzlhZDc2MSwgMHg3YTM3YTEwYywgMHg4ZTU5ZjgxNCwgMHg4OWViMTMzYywgMHhlZWNlYTkyNywgMHgzNWI3NjFjOSwgMHhlZGUxMWNlNSwgMHgzYzdhNDdiMSwgMHg1OTljZDJkZiwgMHgzZjU1ZjI3MywgMHg3OTE4MTRjZSwgMHhiZjczYzczNywgMHhlYTUzZjdjZCwgMHg1YjVmZmRhYSwgMHgxNGRmM2Q2ZiwgMHg4Njc4NDRkYiwgMHg4MWNhYWZmMywgMHgzZWI5NjhjNCwgMHgyYzM4MjQzNCwgMHg1ZmMyYTM0MCwgMHg3MjE2MWRjMywgMHgwY2JjZTIyNSwgMHg4YjI4M2M0OSwgMHg0MWZmMGQ5NSwgMHg3MTM5YTgwMSwgMHhkZTA4MGNiMywgMHg5Y2Q4YjRlNCwgMHg5MDY0NTZjMSwgMHg2MTdiY2I4NCwgMHg3MGQ1MzJiNiwgMHg3NDQ4NmM1YywgMHg0MmQwYjg1N107XG5jb25zdCBUNyA9IFsweGE3NTA1MWY0LCAweDY1NTM3ZTQxLCAweGE0YzMxYTE3LCAweDVlOTYzYTI3LCAweDZiY2IzYmFiLCAweDQ1ZjExZjlkLCAweDU4YWJhY2ZhLCAweDAzOTM0YmUzLCAweGZhNTUyMDMwLCAweDZkZjZhZDc2LCAweDc2OTE4OGNjLCAweDRjMjVmNTAyLCAweGQ3ZmM0ZmU1LCAweGNiZDdjNTJhLCAweDQ0ODAyNjM1LCAweGEzOGZiNTYyLCAweDVhNDlkZWIxLCAweDFiNjcyNWJhLCAweDBlOTg0NWVhLCAweGMwZTE1ZGZlLCAweDc1MDJjMzJmLCAweGYwMTI4MTRjLCAweDk3YTM4ZDQ2LCAweGY5YzY2YmQzLCAweDVmZTcwMzhmLCAweDljOTUxNTkyLCAweDdhZWJiZjZkLCAweDU5ZGE5NTUyLCAweDgzMmRkNGJlLCAweDIxZDM1ODc0LCAweDY5Mjk0OWUwLCAweGM4NDQ4ZWM5LCAweDg5NmE3NWMyLCAweDc5NzhmNDhlLCAweDNlNmI5OTU4LCAweDcxZGQyN2I5LCAweDRmYjZiZWUxLCAweGFkMTdmMDg4LCAweGFjNjZjOTIwLCAweDNhYjQ3ZGNlLCAweDRhMTg2M2RmLCAweDMxODJlNTFhLCAweDMzNjA5NzUxLCAweDdmNDU2MjUzLCAweDc3ZTBiMTY0LCAweGFlODRiYjZiLCAweGEwMWNmZTgxLCAweDJiOTRmOTA4LCAweDY4NTg3MDQ4LCAweGZkMTk4ZjQ1LCAweDZjODc5NGRlLCAweGY4Yjc1MjdiLCAweGQzMjNhYjczLCAweDAyZTI3MjRiLCAweDhmNTdlMzFmLCAweGFiMmE2NjU1LCAweDI4MDdiMmViLCAweGMyMDMyZmI1LCAweDdiOWE4NmM1LCAweDA4YTVkMzM3LCA
26774weDg3ZjIzMDI4LCAweGE1YjIyM2JmLCAweDZhYmEwMjAzLCAweDgyNWNlZDE2LCAweDFjMmI4YWNmLCAweGI0OTJhNzc5LCAweGYyZjBmMzA3LCAweGUyYTE0ZTY5LCAweGY0Y2Q2NWRhLCAweGJlZDUwNjA1LCAweDYyMWZkMTM0LCAweGZlOGFjNGE2LCAweDUzOWQzNDJlLCAweDU1YTBhMmYzLCAweGUxMzIwNThhLCAweGViNzVhNGY2LCAweGVjMzkwYjgzLCAweGVmYWE0MDYwLCAweDlmMDY1ZTcxLCAweDEwNTFiZDZlLCAweDhhZjkzZTIxLCAweDA2M2Q5NmRkLCAweDA1YWVkZDNlLCAweGJkNDY0ZGU2LCAweDhkYjU5MTU0LCAweDVkMDU3MWM0LCAweGQ0NmYwNDA2LCAweDE1ZmY2MDUwLCAweGZiMjQxOTk4LCAweGU5OTdkNmJkLCAweDQzY2M4OTQwLCAweDllNzc2N2Q5LCAweDQyYmRiMGU4LCAweDhiODgwNzg5LCAweDViMzhlNzE5LCAweGVlZGI3OWM4LCAweDBhNDdhMTdjLCAweDBmZTk3YzQyLCAweDFlYzlmODg0LCAweDAwMDAwMDAwLCAweDg2ODMwOTgwLCAweGVkNDgzMjJiLCAweDcwYWMxZTExLCAweDcyNGU2YzVhLCAweGZmZmJmZDBlLCAweDM4NTYwZjg1LCAweGQ1MWUzZGFlLCAweDM5MjczNjJkLCAweGQ5NjQwYTBmLCAweGE2MjE2ODVjLCAweDU0ZDE5YjViLCAweDJlM2EyNDM2LCAweDY3YjEwYzBhLCAweGU3MGY5MzU3LCAweDk2ZDJiNGVlLCAweDkxOWUxYjliLCAweGM1NGY4MGMwLCAweDIwYTI2MWRjLCAweDRiNjk1YTc3LCAweDFhMTYxYzEyLCAweGJhMGFlMjkzLCAweDJhZTVjMGEwLCAweGUwNDMzYzIyLCAweDE3MWQxMjFiLCAweDBkMGIwZTA5LCAweGM3YWRmMjhiLCAweGE4YjkyZGI2LCAweGE5YzgxNDFlLCAweDE5ODU1N2YxLCAweDA3NGNhZjc1LCAweGRkYmJlZTk5LCAweDYwZmRhMzdmLCAweDI2OWZmNzAxLCAweGY1YmM1YzcyLCAweDNiYzU0NDY2LCAweDdlMzQ1YmZiLCAweDI5NzY4YjQzLCAweGM2ZGNjYjIzLCAweGZjNjhiNmVkLCAweGYxNjNiOGU0LCAweGRjY2FkNzMxLCAweDg1MTA0MjYzLCAweDIyNDAxMzk3LCAweDExMjA4NGM2LCAweDI0N2Q4NTRhLCAweDNkZjhkMmJiLCAweDMyMTFhZWY5LCAweGExNmRjNzI5LCAweDJmNGIxZDllLCAweDMwZjNkY2IyLCAweDUyZWMwZDg2LCAweGUzZDA3N2MxLCAweDE2NmMyYmIzLCAweGI5OTlhOTcwLCAweDQ4ZmExMTk0LCAweDY0MjI0N2U5LCAweDhjYzRhOGZjLCAweDNmMWFhMGYwLCAweDJjZDg1NjdkLCAweDkwZWYyMjMzLCAweDRlYzc4NzQ5LCAweGQxYzFkOTM4LCAweGEyZmU4Y2NhLCAweDBiMzY5OGQ0LCAweDgxY2ZhNmY1LCAweGRlMjhhNTdhLCAweDhlMjZkYWI3LCAweGJmYTQzZmFkLCAweDlkZTQyYzNhLCAweDkyMGQ1MDc4LCAweGNjOWI2YTVmLCAweDQ2NjI1NDdlLCAweDEzYzJmNjhkLCAweGI4ZTg5MGQ4LCAweGY3NWUyZTM5LCAweGFmZjU4MmMzLCAweDgwYmU5ZjVkLCAweDkzN2M2OWQwLCAweDJkYTk2ZmQ1LCAweDEyYjNjZjI1LCAweDk5M2JjOGFjLCAweDdkYTcxMDE4LCAweDYzNmVlODljLCAweGJiN2JkYjNiLCAweDc4MDljZDI2LCAweDE4ZjQ2ZTU5LCAweGI3MDFlYzlhLCAweDlhYTg4MzRmLCAweDZlNjVlNjk1LCAweGU2N2VhYWZmLCAweGNmMDgyMWJjLCAweGU4ZTZlZjE1LCAweDliZDliYWU3LCAweDM2Y2U0YTZmLCAweDA5ZDRlYTlmLCAweDdjZDYyOWIwLCAweGIyYWYzMWE0LCAweDIzMzEyYTNmLCAweDk0MzBjNmE1LCAweDY2YzAzNWEyLCAweGJjMzc3NDRlLCAweGNhYTZmYzgyLCAweGQwYjBlMDkwLCAweGQ4MTUzM2E3LCAweDk4NGFmMTA0LCAweGRhZjc0MWVjLCAweDUwMGU3ZmNkLCAweGY2MmYxNzkxLCAweGQ2OGQ3NjRkLCAweGIwNGQ0M2VmLCAweDRkNTRjY2FhLCAweDA0ZGZlNDk2LCAweGI1ZTM5ZWQxLCAweDg4MWI0YzZhLCAweDFmYjhjMTJjLCAweDUxN2Y0NjY1LCAweGVhMDQ5ZDVlLCAweDM1NWQwMThjLCAweDc0NzNmYTg3LCAweDQxMmVmYjBiLCAweDFkNWFiMzY3LCAweGQyNTI5MmRiLCAweDU2MzNlOTEwLCAweDQ3MTM2ZGQ2LCAweDYxOGM5YWQ3LCA
26774weDBjN2EzN2ExLCAweDE0OGU1OWY4LCAweDNjODllYjEzLCAweDI3ZWVjZWE5LCAweGM5MzViNzYxLCAweGU1ZWRlMTFjLCAweGIxM2M3YTQ3LCAweGRmNTk5Y2QyLCAweDczM2Y1NWYyLCAweGNlNzkxODE0LCAweDM3YmY3M2M3LCAweGNkZWE1M2Y3LCAweGFhNWI1ZmZkLCAweDZmMTRkZjNkLCAweGRiODY3ODQ0LCAweGYzODFjYWFmLCAweGM0M2ViOTY4LCAweDM0MmMzODI0LCAweDQwNWZjMmEzLCAweGMzNzIxNjFkLCAweDI1MGNiY2UyLCAweDQ5OGIyODNjLCAweDk1NDFmZjBkLCAweDAxNzEzOWE4LCAweGIzZGUwODBjLCAweGU0OWNkOGI0LCAweGMxOTA2NDU2LCAweDg0NjE3YmNiLCAweGI2NzBkNTMyLCAweDVjNzQ0ODZjLCAweDU3NDJkMGI4XTtcbmNvbnN0IFQ4ID0gWzB4ZjRhNzUwNTEsIDB4NDE2NTUzN2UsIDB4MTdhNGMzMWEsIDB4Mjc1ZTk2M2EsIDB4YWI2YmNiM2IsIDB4OWQ0NWYxMWYsIDB4ZmE1OGFiYWMsIDB4ZTMwMzkzNGIsIDB4MzBmYTU1MjAsIDB4NzY2ZGY2YWQsIDB4Y2M3NjkxODgsIDB4MDI0YzI1ZjUsIDB4ZTVkN2ZjNGYsIDB4MmFjYmQ3YzUsIDB4MzU0NDgwMjYsIDB4NjJhMzhmYjUsIDB4YjE1YTQ5ZGUsIDB4YmExYjY3MjUsIDB4ZWEwZTk4NDUsIDB4ZmVjMGUxNWQsIDB4MmY3NTAyYzMsIDB4NGNmMDEyODEsIDB4NDY5N2EzOGQsIDB4ZDNmOWM2NmIsIDB4OGY1ZmU3MDMsIDB4OTI5Yzk1MTUsIDB4NmQ3YWViYmYsIDB4NTI1OWRhOTUsIDB4YmU4MzJkZDQsIDB4NzQyMWQzNTgsIDB4ZTA2OTI5NDksIDB4YzljODQ0OGUsIDB4YzI4OTZhNzUsIDB4OGU3OTc4ZjQsIDB4NTgzZTZiOTksIDB4Yjk3MWRkMjcsIDB4ZTE0ZmI2YmUsIDB4ODhhZDE3ZjAsIDB4MjBhYzY2YzksIDB4Y2UzYWI0N2QsIDB4ZGY0YTE4NjMsIDB4MWEzMTgyZTUsIDB4NTEzMzYwOTcsIDB4NTM3ZjQ1NjIsIDB4NjQ3N2UwYjEsIDB4NmJhZTg0YmIsIDB4ODFhMDFjZmUsIDB4MDgyYjk0ZjksIDB4NDg2ODU4NzAsIDB4NDVmZDE5OGYsIDB4ZGU2Yzg3OTQsIDB4N2JmOGI3NTIsIDB4NzNkMzIzYWIsIDB4NGIwMmUyNzIsIDB4MWY4ZjU3ZTMsIDB4NTVhYjJhNjYsIDB4ZWIyODA3YjIsIDB4YjVjMjAzMmYsIDB4YzU3YjlhODYsIDB4MzcwOGE1ZDMsIDB4Mjg4N2YyMzAsIDB4YmZhNWIyMjMsIDB4MDM2YWJhMDIsIDB4MTY4MjVjZWQsIDB4Y2YxYzJiOGEsIDB4NzliNDkyYTcsIDB4MDdmMmYwZjMsIDB4NjllMmExNGUsIDB4ZGFmNGNkNjUsIDB4MDViZWQ1MDYsIDB4MzQ2MjFmZDEsIDB4YTZmZThhYzQsIDB4MmU1MzlkMzQsIDB4ZjM1NWEwYTIsIDB4OGFlMTMyMDUsIDB4ZjZlYjc1YTQsIDB4ODNlYzM5MGIsIDB4NjBlZmFhNDAsIDB4NzE5ZjA2NWUsIDB4NmUxMDUxYmQsIDB4MjE4YWY5M2UsIDB4ZGQwNjNkOTYsIDB4M2UwNWFlZGQsIDB4ZTZiZDQ2NGQsIDB4NTQ4ZGI1OTEsIDB4YzQ1ZDA1NzEsIDB4MDZkNDZmMDQsIDB4NTAxNWZmNjAsIDB4OThmYjI0MTksIDB4YmRlOTk3ZDYsIDB4NDA0M2NjODksIDB4ZDk5ZTc3NjcsIDB4ZTg0MmJkYjAsIDB4ODk4Yjg4MDcsIDB4MTk1YjM4ZTcsIDB4YzhlZWRiNzksIDB4N2MwYTQ3YTEsIDB4NDIwZmU5N2MsIDB4ODQxZWM5ZjgsIDB4MDAwMDAwMDAsIDB4ODA4NjgzMDksIDB4MmJlZDQ4MzIsIDB4MTE3MGFjMWUsIDB4NWE3MjRlNmMsIDB4MGVmZmZiZmQsIDB4ODUzODU2MGYsIDB4YWVkNTFlM2QsIDB4MmQzOTI3MzYsIDB4MGZkOTY0MGEsIDB4NWNhNjIxNjgsIDB4NWI1NGQxOWIsIDB4MzYyZTNhMjQsIDB4MGE2N2IxMGMsIDB4NTdlNzBmOTMsIDB4ZWU5NmQyYjQsIDB4OWI5MTllMWIsIDB4YzBjNTRmODAsIDB4ZGMyMGEyNjEsIDB4Nzc0YjY5NWEsIDB4MTIxYTE2MWMsIDB4OTNiYTBhZTIsIDB4YTAyYWU1YzAsIDB4MjJlMDQzM2MsIDB4MWIxNzFkMTIsIDB4MDkwZDBiMGUsIDB4OGJjN2FkZjIsIDB4YjZhOGI5MmQsIDB4MWVhOWM4MTQsIDB4ZjExOTg1NTcsIDB4NzUwNzRjYWYsIDB4OTlkZGJiZWUsIDB4N2Y2MGZkYTMsIDB4MDEyNjlmZjcsIDB4NzJmNWJjNWMsIDB4NjYzYmM1NDQsIDB4ZmI3ZTM0NWIsIDB4NDMyOTc2OGIsIDB4MjNjNmRjY2IsIDB4ZWRmYzY4YjYsIDB4ZTRmMTYzYjgsIDB4MzFkY2NhZDcsIDB4NjM4NTEwNDIsIDB4OTcyMjQwMTMsIDB4YzYxMTIwODQsIDB4NGEyNDdkODUsIDB4YmIzZGY4ZDIsIDB4ZjkzMjExYWUsIDB4MjlhMTZkYzcsIDB4OWUyZjRiMWQsIDB4YjIzMGYzZGMsIDB4ODY1MmVjMGQsIDB4YzFlM2QwNzcsIDB4YjMxNjZjMmIsIDB4NzBiOTk5YTksIDB4OTQ0OGZhMTEsIDB4ZTk2NDIyNDcsIDB4ZmM4Y2M0YTgsIDB4ZjAzZjFhYTAsIDB4N2QyY2Q4NTYsIDB4MzM5MGVmMjIsIDB4NDk0ZWM3ODcsIDB4MzhkMWMxZDksIDB4Y2FhMmZlOGMsIDB4ZDQwYjM2OTgsIDB4ZjU4MWNmYTYsIDB4N2FkZTI4YTUsIDB4Yjc4ZTI2ZGEsIDB4YWRiZmE0M2YsIDB4M2E5ZGU0MmMsIDB4Nzg5MjBkNTAsIDB4NWZjYzliNmEsIDB4N2U0NjYyNTQsIDB4OGQxM2MyZjYsIDB4ZDhiOGU4OTAsIDB4MzlmNzVlMmUsIDB4YzNhZmY1ODIsIDB4NWQ4MGJlOWYsIDB4ZDA5MzdjNjksIDB4ZDUyZGE5NmYsIDB4MjUxMmIzY2YsIDB4YWM5OTNiYzgsIDB4MTg3ZGE3MTAsIDB4OWM2MzZlZTgsIDB4M2JiYjdiZGIsIDB4MjY3ODA5Y2QsIDB4NTkxOGY0NmUsIDB4OWFiNzAxZWMsIDB4NGY5YWE4ODMsIDB4OTU2ZTY1ZTYsIDB4ZmZlNjdlYWEsIDB4YmNjZjA4MjEsIDB4MTVlOGU2ZWYsIDB4ZTc5YmQ5YmEsIDB4NmYzNmNlNGEsIDB4OWYwOWQ0ZWEsIDB4YjA3Y2Q2MjksIDB4YTRiMmFmMzEsIDB4M2YyMzMxMmEsIDB4YTU5NDMwYzYsIDB4YTI2NmMwMzUsIDB4NGViYzM3NzQsIDB4ODJjYWE2ZmMsIDB4OTBkMGIwZTAsIDB4YTdkODE1MzMsIDB4MDQ5ODRhZjEsIDB4ZWNkYWY3NDEsIDB4Y2Q1MDBlN2YsIDB4OTFmNjJmMTcsIDB4NGRkNjhkNzYsIDB4ZWZiMDRkNDMsIDB4YWE0ZDU0Y2MsIDB4OTYwNGRmZTQsIDB4ZDFiNWUzOWUsIDB4NmE4ODFiNGMsIDB4MmMxZmI4YzEsIDB4NjU1MTdmNDYsIDB4NWVlYTA0OWQsIDB4OGMzNTVkMDEsIDB4ODc3NDczZmEsIDB4MGI0MTJlZmIsIDB4NjcxZDVhYjMsIDB4ZGJkMjUyOTIsIDB4MTA1NjMzZTksIDB4ZDY0NzEzNmQsIDB4ZDc2MThjOWEsIDB4YTEwYzdhMzcsIDB4ZjgxNDhlNTksIDB4MTMzYzg5ZWIsIDB4YTkyN2VlY2UsIDB4NjFjOTM1YjcsIDB4MWNlNWVkZTEsIDB4NDdiMTNjN2EsIDB4ZDJkZjU5OWMsIDB4ZjI3MzNmNTUsIDB4MTRjZTc5MTgsIDB4YzczN2JmNzMsIDB4ZjdjZGVhNTMsIDB4ZmRhYTViNWYsIDB4M2Q2ZjE0ZGYsIDB4NDRkYjg2NzgsIDB4YWZmMzgxY2EsIDB4NjhjNDNlYjksIDB4MjQzNDJjMzgsIDB4YTM0MDVmYzIsIDB4MWRjMzcyMTYsIDB4ZTIyNTBjYmMsI
26774DB4M2M0OThiMjgsIDB4MGQ5NTQxZmYsIDB4YTgwMTcxMzksIDB4MGNiM2RlMDgsIDB4YjRlNDljZDgsIDB4NTZjMTkwNjQsIDB4Y2I4NDYxN2IsIDB4MzJiNjcwZDUsIDB4NmM1Yzc0NDgsIDB4Yjg1NzQyZDBdO1xuLy8gVHJhbnNmb3JtYXRpb25zIGZvciBkZWNyeXB0aW9uIGtleSBleHBhbnNpb25cbmNvbnN0IFUxID0gWzB4MDAwMDAwMDAsIDB4MGUwOTBkMGIsIDB4MWMxMjFhMTYsIDB4MTIxYjE3MWQsIDB4MzgyNDM0MmMsIDB4MzYyZDM5MjcsIDB4MjQzNjJlM2EsIDB4MmEzZjIzMzEsIDB4NzA0ODY4NTgsIDB4N2U0MTY1NTMsIDB4NmM1YTcyNGUsIDB4NjI1MzdmNDUsIDB4NDg2YzVjNzQsIDB4NDY2NTUxN2YsIDB4NTQ3ZTQ2NjIsIDB4NWE3NzRiNjksIDB4ZTA5MGQwYjAsIDB4ZWU5OWRkYmIsIDB4ZmM4MmNhYTYsIDB4ZjI4YmM3YWQsIDB4ZDhiNGU0OWMsIDB4ZDZiZGU5OTcsIDB4YzRhNmZlOGEsIDB4Y2FhZmYzODEsIDB4OTBkOGI4ZTgsIDB4OWVkMWI1ZTMsIDB4OGNjYWEyZmUsIDB4ODJjM2FmZjUsIDB4YThmYzhjYzQsIDB4YTZmNTgxY2YsIDB4YjRlZTk2ZDIsIDB4YmFlNzliZDksIDB4ZGIzYmJiN2IsIDB4ZDUzMmI2NzAsIDB4YzcyOWExNmQsIDB4YzkyMGFjNjYsIDB4ZTMxZjhmNTcsIDB4ZWQxNjgyNWMsIDB4ZmYwZDk1NDEsIDB4ZjEwNDk4NGEsIDB4YWI3M2QzMjMsIDB4YTU3YWRlMjgsIDB4Yjc2MWM5MzUsIDB4Yjk2OGM0M2UsIDB4OTM1N2U3MGYsIDB4OWQ1ZWVhMDQsIDB4OGY0NWZkMTksIDB4ODE0Y2YwMTIsIDB4M2JhYjZiY2IsIDB4MzVhMjY2YzAsIDB4MjdiOTcxZGQsIDB4MjliMDdjZDYsIDB4MDM4ZjVmZTcsIDB4MGQ4NjUyZWMsIDB4MWY5ZDQ1ZjEsIDB4MTE5NDQ4ZmEsIDB4NGJlMzAzOTMsIDB4NDVlYTBlOTgsIDB4NTdmMTE5ODUsIDB4NTlmODE0OGUsIDB4NzNjNzM3YmYsIDB4N2RjZTNhYjQsIDB4NmZkNTJkYTksIDB4NjFkYzIwYTIsIDB4YWQ3NjZkZjYsIDB4YTM3ZjYwZmQsIDB4YjE2NDc3ZTAsIDB4YmY2ZDdhZWIsIDB4OTU1MjU5ZGEsIDB4OWI1YjU0ZDEsIDB4ODk0MDQzY2MsIDB4ODc0OTRlYzcsIDB4ZGQzZTA1YWUsIDB4ZDMzNzA4YTUsIDB4YzEyYzFmYjgsIDB4Y2YyNTEyYjMsIDB4ZTUxYTMxODIsIDB4ZWIxMzNjODksIDB4ZjkwODJiOTQsIDB4ZjcwMTI2OWYsIDB4NGRlNmJkNDYsIDB4NDNlZmIwNGQsIDB4NTFmNGE3NTAsIDB4NWZmZGFhNWIsIDB4NzVjMjg5NmEsIDB4N2JjYjg0NjEsIDB4NjlkMDkzN2MsIDB4NjdkOTllNzcsIDB4M2RhZWQ1MWUsIDB4MzNhN2Q4MTUsIDB4MjFiY2NmMDgsIDB4MmZiNWMyMDMsIDB4MDU4YWUxMzIsIDB4MGI4M2VjMzksIDB4MTk5OGZiMjQsIDB4MTc5MWY2MmYsIDB4NzY0ZGQ2OGQsIDB4Nzg0NGRiODYsIDB4NmE1ZmNjOWIsIDB4NjQ1NmMxOTAsIDB4NGU2OWUyYTEsIDB4NDA2MGVmYWEsIDB4NTI3YmY4YjcsIDB4NWM3MmY1YmMsIDB4MDYwNWJlZDUsIDB4MDgwY2IzZGUsIDB4MWExN2E0YzMsIDB4MTQxZWE5YzgsIDB4M2UyMThhZjksIDB4MzAyODg3ZjIsIDB4MjIzMzkwZWYsIDB4MmMzYTlkZTQsIDB4OTZkZDA2M2QsIDB4OThkNDBiMzYsIDB4OGFjZjFjMmIsIDB4ODRjNjExMjAsIDB4YWVmOTMyMTEsIDB4YTBmMDNmMWEsIDB4YjJlYjI4MDcsIDB4YmNlMjI1MGMsIDB4ZTY5NTZlNjUsIDB4ZTg5YzYzNmUsIDB4ZmE4Nzc0NzMsIDB4ZjQ4ZTc5NzgsIDB4ZGViMTVhNDksIDB4ZDBiODU3NDIsIDB4YzJhMzQwNWYsIDB4Y2NhYTRkNTQsIDB4NDFlY2RhZjcsIDB4NGZlNWQ3ZmMsIDB4NWRmZWMwZTEsIDB4NTNmN2NkZWEsIDB4NzljOGVlZGIsIDB4NzdjMWUzZDAsIDB4NjVkYWY0Y2QsIDB4NmJkM2Y5YzYsIDB4MzFhNGIyYWYsIDB4M2ZhZGJmYTQsIDB4MmRiNmE4YjksIDB4MjNiZmE1YjIsIDB4MDk4MDg2ODMsIDB4MDc4OThiODgsIDB4MTU5MjljOTUsIDB4MWI5YjkxOWUsIDB4YTE3YzBhNDcsIDB4YWY3NTA3NGMsIDB4YmQ2ZTEwNTEsIDB4YjM2NzFkNWEsIDB4OTk1ODNlNmIsIDB4OTc1MTMzNjAsIDB4ODU0YTI0N2QsIDB4OGI0MzI5NzYsIDB4ZDEzNDYyMWYsIDB4ZGYzZDZmMTQsIDB4Y2QyNjc4MDksIDB4YzMyZjc1MDIsIDB4ZTkxMDU2MzMsIDB4ZTcxOTViMzgsIDB4ZjUwMjRjMjUsIDB4ZmIwYjQxMmUsIDB4OWFkNzYxOGMsIDB4OTRkZTZjODcsIDB4ODZjNTdiOWEsIDB4ODhjYzc2OTEsIDB4YTJmMzU1YTAsIDB4YWNmYTU4YWIsIDB4YmVlMTRmYjYsIDB4YjBlODQyYmQsIDB4ZWE5ZjA5ZDQsIDB4ZTQ5NjA0ZGYsIDB4ZjY4ZDEzYzIsIDB4Zjg4NDFlYzksIDB4ZDJiYjNkZjgsIDB4ZGNiMjMwZjMsIDB4Y2VhOTI3ZWUsIDB4YzBhMDJhZTUsIDB4N2E0N2IxM2MsIDB4NzQ0ZWJjMzcsIDB4NjY1NWFiMmEsIDB4Njg1Y2E2MjEsIDB4NDI2Mzg1MTAsIDB4NGM2YTg4MWIsIDB4NWU3MTlmMDYsIDB4NTA3ODkyMGQsIDB4MGEwZmQ5NjQsIDB4MDQwNmQ0NmYsIDB4MTYxZGMzNzIsIDB4MTgxNGNlNzksIDB4MzIyYmVkNDgsIDB4M2MyMmUwNDMsIDB4MmUzOWY3NWUsIDB4MjAzMGZhNTUsIDB4ZWM5YWI3MDEsIDB4ZTI5M2JhMGEsIDB4ZjA4OGFkMTcsIDB4ZmU4MWEwMWMsIDB4ZDRiZTgzMmQsIDB4ZGFiNzhlMjYsIDB4YzhhYzk5M2IsIDB4YzZhNTk0MzAsIDB4OWNkMmRmNTksIDB4OTJkYmQyNTIsIDB4ODBjMGM1NGYsIDB4OGVjOWM4NDQsIDB4YTRmNmViNzUsIDB4YWFmZmU2N2UsIDB4YjhlNGYxNjMsIDB4YjZlZGZjNjgsIDB4MGMwYTY3YjEsIDB4MDIwMzZhYmEsIDB4MTAxODdkYTcsIDB4MWUxMTcwYWMsIDB4MzQyZTUzOWQsIDB4M2EyNzVlOTYsIDB4MjgzYzQ5OGIsIDB4MjYzNTQ0ODAsIDB4N2M0MjBmZTksIDB4NzI0YjAyZTIsIDB4NjA1MDE1ZmYsIDB4NmU1OTE4ZjQsIDB4NDQ2NjNiYzUsIDB4NGE2ZjM2Y2UsIDB4NTg3NDIxZDMsIDB4NTY3ZDJjZDgsIDB4MzdhMTBjN2EsIDB4MzlhODAxNzEsIDB4MmJiMzE2NmMsIDB4MjViYTFiNjcsIDB4MGY4NTM4NTYsIDB4MDE4YzM1NWQsIDB4MTM5NzIyNDAsIDB4MWQ5ZTJmNGIsIDB4NDdlOTY0MjIsIDB4NDllMDY5MjksIDB4NWJmYjdlMzQsIDB4NTVmMjczM2YsIDB4N2ZjZDUwMGUsIDB4NzFjNDVkMDUsIDB4NjNkZjRhMTgsIDB4NmRkNjQ3MTMsIDB4ZDczMWRjY2EsIDB4ZDkzOGQxYzEsIDB4Y2IyM2M2ZGMsIDB4YzUyYWNiZDcsIDB4ZWYxNWU4ZTYsIDB4ZTExY2U1ZWQsIDB4ZjMwN2YyZjAsIDB4ZmQwZWZmZmIsIDB4YTc3OWI0OTIsIDB4YTk3MGI5OTksIDB4YmI2YmFlODQsIDB4YjU2MmEzOGYsIDB4OWY1ZDgwYmUsIDB4OTE1NDhkYjUsIDB4ODM0ZjlhYTgsIDB4OGQ0Njk3YTNdO1xuY29uc3QgVTIgPSBbMHgwMDAwMDAwMCwgMHgwYjBlMDkwZCwgMHgxNjFjMTIxYSwgMHgxZDEyMWIxNywgMHgyYzM4MjQzNCwgMHgyNzM2MmQzOSwgMHgzYTI0MzYyZSwgMHgzMTJhM2YyMywgMHg1ODcwNDg2OCwgMHg1MzdlNDE2NSwgMHg0ZTZjNWE3MiwgMHg0NTYyNTM3ZiwgMHg3NDQ4NmM1YywgMHg3ZjQ2NjU1MSwgMHg2MjU0N2U0NiwgMHg2OTVhNzc0YiwgMHhiMGUwOTBkMCwgMHhiYmVlOTlkZCwgMHhhNmZjODJjYSwgMHhhZGYyOGJjNywgMHg5Y2Q4YjRlNCwgMHg5N2Q2YmRlOSwgMHg4YWM0YTZmZSwgMHg4MWNhYWZmMywgMHhlODkwZDhiOCwgMHhlMzllZDFiNSwgMHhmZThjY2FhMiwgMHhmNTgyYzNhZiwgMHhjNGE4ZmM4YywgMHhjZmE2ZjU4MSwgMHhkMmI0ZWU5NiwgMHhkOWJhZTc5YiwgMHg3YmRiM2JiYiwgMHg3MGQ1MzJiNiwgMHg2ZGM3MjlhMSwgMHg2NmM5MjBhYywgMHg1N2UzMWY4ZiwgMHg1Y2VkMTY4MiwgMHg0MWZmMGQ5NSwgMHg0YWYxMDQ5OCwgMHgyM2FiNzNkMywgMHgyOGE1N2FkZSwgMHgzNWI3NjFjOSwgMHgzZWI5NjhjNCwgMHgwZjkzNTdlNywgMHgwNDlkNWVlYSwgMHgxOThmNDVmZCwgMHgxMjgxNGNmMCwgMHhjYjNiYWI2YiwgMHhjMDM1YTI2NiwgMHhkZDI3Yjk3MSwgMHhkNjI5Y
26774jA3YywgMHhlNzAzOGY1ZiwgMHhlYzBkODY1MiwgMHhmMTFmOWQ0NSwgMHhmYTExOTQ0OCwgMHg5MzRiZTMwMywgMHg5ODQ1ZWEwZSwgMHg4NTU3ZjExOSwgMHg4ZTU5ZjgxNCwgMHhiZjczYzczNywgMHhiNDdkY2UzYSwgMHhhOTZmZDUyZCwgMHhhMjYxZGMyMCwgMHhmNmFkNzY2ZCwgMHhmZGEzN2Y2MCwgMHhlMGIxNjQ3NywgMHhlYmJmNmQ3YSwgMHhkYTk1NTI1OSwgMHhkMTliNWI1NCwgMHhjYzg5NDA0MywgMHhjNzg3NDk0ZSwgMHhhZWRkM2UwNSwgMHhhNWQzMzcwOCwgMHhiOGMxMmMxZiwgMHhiM2NmMjUxMiwgMHg4MmU1MWEzMSwgMHg4OWViMTMzYywgMHg5NGY5MDgyYiwgMHg5ZmY3MDEyNiwgMHg0NjRkZTZiZCwgMHg0ZDQzZWZiMCwgMHg1MDUxZjRhNywgMHg1YjVmZmRhYSwgMHg2YTc1YzI4OSwgMHg2MTdiY2I4NCwgMHg3YzY5ZDA5MywgMHg3NzY3ZDk5ZSwgMHgxZTNkYWVkNSwgMHgxNTMzYTdkOCwgMHgwODIxYmNjZiwgMHgwMzJmYjVjMiwgMHgzMjA1OGFlMSwgMHgzOTBiODNlYywgMHgyNDE5OThmYiwgMHgyZjE3OTFmNiwgMHg4ZDc2NGRkNiwgMHg4Njc4NDRkYiwgMHg5YjZhNWZjYywgMHg5MDY0NTZjMSwgMHhhMTRlNjllMiwgMHhhYTQwNjBlZiwgMHhiNzUyN2JmOCwgMHhiYzVjNzJmNSwgMHhkNTA2MDViZSwgMHhkZTA4MGNiMywgMHhjMzFhMTdhNCwgMHhjODE0MWVhOSwgMHhmOTNlMjE4YSwgMHhmMjMwMjg4NywgMHhlZjIyMzM5MCwgMHhlNDJjM2E5ZCwgMHgzZDk2ZGQwNiwgMHgzNjk4ZDQwYiwgMHgyYjhhY2YxYywgMHgyMDg0YzYxMSwgMHgxMWFlZjkzMiwgMHgxYWEwZjAzZiwgMHgwN2IyZWIyOCwgMHgwY2JjZTIyNSwgMHg2NWU2OTU2ZSwgMHg2ZWU4OWM2MywgMHg3M2ZhODc3NCwgMHg3OGY0OGU3OSwgMHg0OWRlYjE1YSwgMHg0MmQwYjg1NywgMHg1ZmMyYTM0MCwgMHg1NGNjYWE0ZCwgMHhmNzQxZWNkYSwgMHhmYzRmZTVkNywgMHhlMTVkZmVjMCwgMHhlYTUzZjdjZCwgMHhkYjc5YzhlZSwgMHhkMDc3YzFlMywgMHhjZDY1ZGFmNCwgMHhjNjZiZDNmOSwgMHhhZjMxYTRiMiwgMHhhNDNmYWRiZiwgMHhiOTJkYjZhOCwgMHhiMjIzYmZhNSwgMHg4MzA5ODA4NiwgMHg4ODA3ODk4YiwgMHg5NTE1OTI5YywgMHg5ZTFiOWI5MSwgMHg0N2ExN2MwYSwgMHg0Y2FmNzUwNywgMHg1MWJkNmUxMCwgMHg1YWIzNjcxZCwgMHg2Yjk5NTgzZSwgMHg2MDk3NTEzMywgMHg3ZDg1NGEyNCwgMHg3NjhiNDMyOSwgMHgxZmQxMzQ2MiwgMHgxNGRmM2Q2ZiwgMHgwOWNkMjY3OCwgMHgwMmMzMmY3NSwgMHgzM2U5MTA1NiwgMHgzOGU3MTk1YiwgMHgyNWY1MDI0YywgMHgyZWZiMGI0MSwgMHg4YzlhZDc2MSwgMHg4Nzk0ZGU2YywgMHg5YTg2YzU3YiwgMHg5MTg4Y2M3NiwgMHhhMGEyZjM1NSwgMHhhYmFjZmE1OCwgMHhiNmJlZTE0ZiwgMHhiZGIwZTg0MiwgMHhkNGVhOWYwOSwgMHhkZmU0OTYwNCwgMHhjMmY2OGQxMywgMHhjOWY4ODQxZSwgMHhmOGQyYmIzZCwgMHhmM2RjYjIzMCwgMHhlZWNlYTkyNywgMHhlNWMwYTAyYSwgMHgzYzdhNDdiMSwgMHgzNzc0NGViYywgMHgyYTY2NTVhYiwgMHgyMTY4NWNhNiwgMHgxMDQyNjM4NSwgMHgxYjRjNmE4OCwgMHgwNjVlNzE5ZiwgMHgwZDUwNzg5MiwgMHg2NDBhMGZkOSwgMHg2ZjA0MDZkNCwgMHg3MjE2MWRjMywgMHg3OTE4MTRjZSwgMHg0ODMyMmJlZCwgMHg0MzNjMjJlMCwgMHg1ZTJlMzlmNywgMHg1NTIwMzBmYSwgMHgwMWVjOWFiNywgMHgwYWUyOTNiYSwgMHgxN2YwODhhZCwgMHgxY2ZlODFhMCwgMHgyZGQ0YmU4MywgMHgyNmR
26774hYjc4ZSwgMHgzYmM4YWM5OSwgMHgzMGM2YTU5NCwgMHg1OTljZDJkZiwgMHg1MjkyZGJkMiwgMHg0ZjgwYzBjNSwgMHg0NDhlYzljOCwgMHg3NWE0ZjZlYiwgMHg3ZWFhZmZlNiwgMHg2M2I4ZTRmMSwgMHg2OGI2ZWRmYywgMHhiMTBjMGE2NywgMHhiYTAyMDM2YSwgMHhhNzEwMTg3ZCwgMHhhYzFlMTE3MCwgMHg5ZDM0MmU1MywgMHg5NjNhMjc1ZSwgMHg4YjI4M2M0OSwgMHg4MDI2MzU0NCwgMHhlOTdjNDIwZiwgMHhlMjcyNGIwMiwgMHhmZjYwNTAxNSwgMHhmNDZlNTkxOCwgMHhjNTQ0NjYzYiwgMHhjZTRhNmYzNiwgMHhkMzU4NzQyMSwgMHhkODU2N2QyYywgMHg3YTM3YTEwYywgMHg3MTM5YTgwMSwgMHg2YzJiYjMxNiwgMHg2NzI1YmExYiwgMHg1NjBmODUzOCwgMHg1ZDAxOGMzNSwgMHg0MDEzOTcyMiwgMHg0YjFkOWUyZiwgMHgyMjQ3ZTk2NCwgMHgyOTQ5ZTA2OSwgMHgzNDViZmI3ZSwgMHgzZjU1ZjI3MywgMHgwZTdmY2Q1MCwgMHgwNTcxYzQ1ZCwgMHgxODYzZGY0YSwgMHgxMzZkZDY0NywgMHhjYWQ3MzFkYywgMHhjMWQ5MzhkMSwgMHhkY2NiMjNjNiwgMHhkN2M1MmFjYiwgMHhlNmVmMTVlOCwgMHhlZGUxMWNlNSwgMHhmMGYzMDdmMiwgMHhmYmZkMGVmZiwgMHg5MmE3NzliNCwgMHg5OWE5NzBiOSwgMHg4NGJiNmJhZSwgMHg4ZmI1NjJhMywgMHhiZTlmNWQ4MCwgMHhiNTkxNTQ4ZCwgMHhhODgzNGY5YSwgMHhhMzhkNDY5N107XG5jb25zdCBVMyA9IFsweDAwMDAwMDAwLCAweDBkMGIwZTA5LCAweDFhMTYxYzEyLCAweDE3MWQxMjFiLCAweDM0MmMzODI0LCAweDM5MjczNjJkLCAweDJlM2EyNDM2LCAweDIzMzEyYTNmLCAweDY4NTg3MDQ4LCAweDY1NTM3ZTQxLCAweDcyNGU2YzVhLCAweDdmNDU2MjUzLCAweDVjNzQ0ODZjLCAweDUxN2Y0NjY1LCAweDQ2NjI1NDdlLCAweDRiNjk1YTc3LCAweGQwYjBlMDkwLCAweGRkYmJlZTk5LCAweGNhYTZmYzgyLCAweGM3YWRmMjhiLCAweGU0OWNkOGI0LCAweGU5OTdkNmJkLCAweGZlOGFjNGE2LCAweGYzODFjYWFmLCAweGI4ZTg5MGQ4LCAweGI1ZTM5ZWQxLCAweGEyZmU4Y2NhLCAweGFmZjU4MmMzLCAweDhjYzRhOGZjLCAweDgxY2ZhNmY1LCAweDk2ZDJiNGVlLCAweDliZDliYWU3LCAweGJiN2JkYjNiLCAweGI2NzBkNTMyLCAweGExNmRjNzI5LCAweGFjNjZjOTIwLCAweDhmNTdlMzFmLCAweDgyNWNlZDE2LCAweDk1NDFmZjBkLCAweDk4NGFmMTA0LCAweGQzMjNhYjczLCAweGRlMjhhNTdhLCAweGM5MzViNzYxLCAweGM0M2ViOTY4LCAweGU3MGY5MzU3LCAweGVhMDQ5ZDVlLCAweGZkMTk4ZjQ1LCAweGYwMTI4MTRjLCAweDZiY2IzYmFiLCAweDY2YzAzNWEyLCAweDcxZGQyN2I5LCAweDdjZDYyOWIwLCAweDVmZTcwMzhmLCAweDUyZWMwZDg2LCAweDQ1ZjExZjlkLCAweDQ4ZmExMTk0LCAweDAzOTM0YmUzLCAweDBlOTg0NWVhLCAweDE5ODU1N2YxLCAweDE0OGU1OWY4LCAweDM3YmY3M2M3LCAweDNhYjQ3ZGNlLCAweDJkYTk2ZmQ1LCAweDIwYTI2MWRjLCAweDZkZjZhZDc2LCAweDYwZmRhMzdmLCAweDc3ZTBiMTY0LCAweDdhZWJiZjZkLCAweDU5ZGE5NTUyLCAweDU0ZDE5YjViLCAweDQzY2M4OTQwLCAweDRlYzc4NzQ5LCAweDA1YWVkZDNlLCAweDA4YTVkMzM3LCAweDFmYjhjMTJjLCAweDEyYjNjZjI1LCAweDMxODJlNTFhLCAweDNjODllYjEzLCAweDJiOTRmOTA4LCAweDI2OWZmNzAxLCAweGJkNDY0ZGU2LCAweGIwNGQ0M2VmLCAweGE3NTA1MWY0LCAweGFhNWI1ZmZkLCAweDg5NmE3NWMyLCAweDg0NjE3YmNiLCAweDkzN2M2OWQwLCAweDllNzc2N2Q5LCAweGQ1MWUzZGFlLCAweGQ4MTUzM2E3LCAweGNmMDgyMWJjLCAweGMyMDMyZmI1LCAweGUxMzIwNThhLCAweGVjMzkwYjgzLCAweGZiMjQxOTk4LCAweGY2MmYxNzkxLCAweGQ2OGQ3NjRkLCAweGRiODY3ODQ0LCAweGNjOWI2YTVmLCAweGMxOTA2NDU2LCAweGUyYTE0ZTY5LCAweGVmYWE0MDYwLCAweGY4Yjc1MjdiLCAweGY1YmM1YzcyLCAweGJlZDUwNjA1LCAweGIzZGUwODBjLCAweGE0YzMxYTE3LCAweGE5YzgxNDFlLCAweDhhZjkzZTIxLCAweDg3ZjIzMDI4LCAweDkwZWYyMjMzLCAweDlkZTQyYzNhLCAweDA2M2Q5NmRkLCAweDBiMzY5OGQ0LCAweDFjMmI4YWNmLCAweDExMjA4NGM2LCAweDMyMTFhZWY5LCAweDNmMWFhMGYwLCAweDI4MDdiMmViLCAweDI1MGNiY2UyLCAweDZlNjVlNjk1LCAweDYzNmVlODljLCAweDc0NzNmYTg3LCAweDc5NzhmNDhlLCAweDVhNDlkZWIxLCAweDU3NDJkMGI4LCAweDQwNWZjMmEzLCAweDRkNTRjY2FhLCAweGRhZjc0MWVjLCAweGQ3ZmM0ZmU1LCAweGMwZTE1ZGZlLCAweGNkZWE1M2Y3LCAweGVlZGI3OWM4LCAweGUzZDA3N2MxLCAweGY0Y2Q2NWRhLCAweGY5YzY2YmQzLCAweGIyYWYzMWE0LCAweGJmYTQzZmFkLCAweGE4YjkyZGI2LCAweGE1YjIyM2JmLCAweDg2ODMwOTgwLCAweDhiODgwNzg5LCAweDljOTUxNTkyLCAweDkxOWUxYjliLCAweDBhNDdhMTdjLCAweDA3NGNhZjc1LCAweDEwNTFiZDZlLCAweDFkNWFiMzY3LCAweDNlNmI5OTU4LCAweDMzNjA5NzUxLCAweDI0N2Q4NTRhLCAweDI5NzY4YjQzLCAweDYyMWZkMTM0LCAweDZmMTRkZjNkLCAweDc4MDljZDI2LCAweDc1MDJjMzJmLCAweDU2MzNlOTEwLCAweDViMzhlNzE5LCAweDRjMjVmNTAyLCAweDQxMmVmYjBiLCAweDYxOGM5YWQ3LCA
26774weDZjODc5NGRlLCAweDdiOWE4NmM1LCAweDc2OTE4OGNjLCAweDU1YTBhMmYzLCAweDU4YWJhY2ZhLCAweDRmYjZiZWUxLCAweDQyYmRiMGU4LCAweDA5ZDRlYTlmLCAweDA0ZGZlNDk2LCAweDEzYzJmNjhkLCAweDFlYzlmODg0LCAweDNkZjhkMmJiLCAweDMwZjNkY2IyLCAweDI3ZWVjZWE5LCAweDJhZTVjMGEwLCAweGIxM2M3YTQ3LCAweGJjMzc3NDRlLCAweGFiMmE2NjU1LCAweGE2MjE2ODVjLCAweDg1MTA0MjYzLCAweDg4MWI0YzZhLCAweDlmMDY1ZTcxLCAweDkyMGQ1MDc4LCAweGQ5NjQwYTBmLCAweGQ0NmYwNDA2LCAweGMzNzIxNjFkLCAweGNlNzkxODE0LCAweGVkNDgzMjJiLCAweGUwNDMzYzIyLCAweGY3NWUyZTM5LCAweGZhNTUyMDMwLCAweGI3MDFlYzlhLCAweGJhMGFlMjkzLCAweGFkMTdmMDg4LCAweGEwMWNmZTgxLCAweDgzMmRkNGJlLCAweDhlMjZkYWI3LCAweDk5M2JjOGFjLCAweDk0MzBjNmE1LCAweGRmNTk5Y2QyLCAweGQyNTI5MmRiLCAweGM1NGY4MGMwLCAweGM4NDQ4ZWM5LCAweGViNzVhNGY2LCAweGU2N2VhYWZmLCAweGYxNjNiOGU0LCAweGZjNjhiNmVkLCAweDY3YjEwYzBhLCAweDZhYmEwMjAzLCAweDdkYTcxMDE4LCAweDcwYWMxZTExLCAweDUzOWQzNDJlLCAweDVlOTYzYTI3LCAweDQ5OGIyODNjLCAweDQ0ODAyNjM1LCAweDBmZTk3YzQyLCAweDAyZTI3MjRiLCAweDE1ZmY2MDUwLCAweDE4ZjQ2ZTU5LCAweDNiYzU0NDY2LCAweDM2Y2U0YTZmLCAweDIxZDM1ODc0LCAweDJjZDg1NjdkLCAweDBjN2EzN2ExLCAweDAxNzEzOWE4LCAweDE2NmMyYmIzLCAweDFiNjcyNWJhLCAweDM4NTYwZjg1LCAweDM1NWQwMThjLCAweDIyNDAxMzk3LCAweDJmNGIxZDllLCAweDY0MjI0N2U5LCAweDY5Mjk0OWUwLCAweDdlMzQ1YmZiLCAweDczM2Y1NWYyLCAweDUwMGU3ZmNkLCAweDVkMDU3MWM0LCAweDRhMTg2M2RmLCAweDQ3MTM2ZGQ2LCAweGRjY2FkNzMxLCAweGQxYzFkOTM4LCAweGM2ZGNjYjIzLCAweGNiZDdjNTJhLCAweGU4ZTZlZjE1LCAweGU1ZWRlMTFjLCAweGYyZjBmMzA3LCAweGZmZmJmZDBlLCAweGI0OTJhNzc5LCAweGI5OTlhOTcwLCAweGFlODRiYjZiLCAweGEzOGZiNTYyLCAweDgwYmU5ZjVkLCAweDhkYjU5MTU0LCAweDlhYTg4MzRmLCAweDk3YTM4ZDQ2XTtcbmNvbnN0IFU0ID0gWzB4MDAwMDAwMDAsIDB4MDkwZDBiMGUsIDB4MTIxYTE2MWMsIDB4MWIxNzFkMTIsIDB4MjQzNDJjMzgsIDB4MmQzOTI3MzYsIDB4MzYyZTNhMjQsIDB4M2YyMzMxMmEsIDB4NDg2ODU4NzAsIDB4NDE2NTUzN2UsIDB4NWE3MjRlNmMsIDB4NTM3ZjQ1NjIsIDB4NmM1Yzc0NDgsIDB4NjU1MTdmNDYsIDB4N2U0NjYyNTQsIDB4Nzc0YjY5NWEsIDB4OTBkMGIwZTAsIDB4OTlkZGJiZWUsIDB4ODJjYWE2ZmMsIDB4OGJjN2FkZjIsIDB4YjRlNDljZDgsIDB4YmRlOTk3ZDYsIDB4YTZmZThhYzQsIDB4YWZmMzgxY2EsIDB4ZDhiOGU4OTAsIDB4ZDFiNWUzOWUsIDB4Y2FhMmZlOGMsIDB4YzNhZmY1ODIsIDB4ZmM4Y2M0YTgsIDB4ZjU4MWNmYTYsIDB4ZWU5NmQyYjQsIDB4ZTc5YmQ5YmEsIDB4M2JiYjdiZGIsIDB4MzJiNjcwZDUsIDB4MjlhMTZkYzcsIDB4MjBhYzY2YzksIDB4MWY4ZjU3ZTMsIDB4MTY4MjVjZWQsIDB4MGQ5NTQxZmYsIDB4MDQ5ODRhZjEsIDB4NzNkMzIzYWIsIDB4N2FkZTI4YTUsIDB4NjFjOTM1YjcsIDB4NjhjNDNlYjksIDB4NTdlNzBmOTMsIDB4NWVlYTA0OWQsIDB4NDVmZDE5OGYsIDB4NGNmMDEyODEsIDB4YWI2YmNiM2IsIDB4YTI2NmMwMzUsIDB4Yjk3MWRkMjcsIDB4YjA3Y2Q2MjksIDB4OGY1ZmU3MDMsIDB4ODY1MmVjMGQsIDB4OWQ0NWYxMWYsIDB4OTQ0OGZhMTEsIDB4ZTMwMzkzNGIsIDB4ZWEwZTk4NDUsIDB4ZjExOTg1NTcsIDB4ZjgxNDhlNTksIDB4YzczN2JmNzMsIDB4Y2UzYWI0N2QsIDB4ZDUyZGE5NmYsIDB4ZGMyMGEyNjEsIDB4NzY2ZGY2YWQsIDB4N2Y2MGZkYTMsIDB4NjQ3N2UwYjEsIDB4NmQ3YWViYmYsIDB4NTI1OWRhOTUsIDB4NWI1NGQxOWIsIDB4NDA0M2NjODksIDB4N
26774Dk0ZWM3ODcsIDB4M2UwNWFlZGQsIDB4MzcwOGE1ZDMsIDB4MmMxZmI4YzEsIDB4MjUxMmIzY2YsIDB4MWEzMTgyZTUsIDB4MTMzYzg5ZWIsIDB4MDgyYjk0ZjksIDB4MDEyNjlmZjcsIDB4ZTZiZDQ2NGQsIDB4ZWZiMDRkNDMsIDB4ZjRhNzUwNTEsIDB4ZmRhYTViNWYsIDB4YzI4OTZhNzUsIDB4Y2I4NDYxN2IsIDB4ZDA5MzdjNjksIDB4ZDk5ZTc3NjcsIDB4YWVkNTFlM2QsIDB4YTdkODE1MzMsIDB4YmNjZjA4MjEsIDB4YjVjMjAzMmYsIDB4OGFlMTMyMDUsIDB4ODNlYzM5MGIsIDB4OThmYjI0MTksIDB4OTFmNjJmMTcsIDB4NGRkNjhkNzYsIDB4NDRkYjg2NzgsIDB4NWZjYzliNmEsIDB4NTZjMTkwNjQsIDB4NjllMmExNGUsIDB4NjBlZmFhNDAsIDB4N2JmOGI3NTIsIDB4NzJmNWJjNWMsIDB4MDViZWQ1MDYsIDB4MGNiM2RlMDgsIDB4MTdhNGMzMWEsIDB4MWVhOWM4MTQsIDB4MjE4YWY5M2UsIDB4Mjg4N2YyMzAsIDB4MzM5MGVmMjIsIDB4M2E5ZGU0MmMsIDB4ZGQwNjNkOTYsIDB4ZDQwYjM2OTgsIDB4Y2YxYzJiOGEsIDB4YzYxMTIwODQsIDB4ZjkzMjExYWUsIDB4ZjAzZjFhYTAsIDB4ZWIyODA3YjIsIDB4ZTIyNTBjYmMsIDB4OTU2ZTY1ZTYsIDB4OWM2MzZlZTgsIDB4ODc3NDczZmEsIDB4OGU3OTc4ZjQsIDB4YjE1YTQ5ZGUsIDB4Yjg1NzQyZDAsIDB4YTM0MDVmYzIsIDB4YWE0ZDU0Y2MsIDB4ZWNkYWY3NDEsIDB4ZTVkN2ZjNGYsIDB4ZmVjMGUxNWQsIDB4ZjdjZGVhNTMsIDB4YzhlZWRiNzksIDB4YzFlM2QwNzcsIDB4ZGFmNGNkNjUsIDB4ZDNmOWM2NmIsIDB4YTRiMmFmMzEsIDB4YWRiZmE0M2YsIDB4YjZhOGI5MmQsIDB4YmZhNWIyMjMsIDB4ODA4NjgzMDksIDB4ODk4Yjg4MDcsIDB4OTI5Yzk1MTUsIDB4OWI5MTllMWIsIDB4N2MwYTQ3YTEsIDB4NzUwNzRjYWYsIDB4NmUxMDUxYmQsIDB4NjcxZDVhYjMsIDB4NTgzZTZiOTksIDB4NTEzMzYwOTcsIDB4NGEyNDdkODUsIDB4NDMyOTc2OGIsIDB4MzQ2MjFmZDEsIDB4M2Q2ZjE0ZGYsIDB4MjY3ODA5Y2QsIDB4MmY3NTAyYzMsIDB4MTA1NjMzZTksIDB4MTk1YjM4ZTcsIDB4MDI0YzI1ZjUsIDB4MGI0MTJlZmIsIDB4ZDc2MThjOWEsIDB4ZGU2Yzg3OTQsIDB4YzU3YjlhODYsIDB4Y2M3NjkxODgsIDB4ZjM1NWEwYTIsIDB4ZmE1OGFiYWMsIDB4ZTE0ZmI2YmUsIDB4ZTg0MmJkYjAsIDB4OWYwOWQ0ZWEsIDB4OTYwNGRmZTQsIDB4OGQxM2MyZjYsIDB4ODQxZWM5ZjgsIDB4YmIzZGY4ZDIsIDB4YjIzMGYzZGMsIDB4YTkyN2VlY2UsIDB4YTAyYWU1YzAsIDB4NDdiMTNjN2EsIDB4NGViYzM3NzQsIDB4NTVhYjJhNjYsIDB4NWNhNjIxNjgsIDB4NjM4NTEwNDIsIDB4NmE4ODFiNGMsIDB4NzE5ZjA2NWUsIDB4Nzg5MjBkNTAsIDB4MGZkOTY0MGEsIDB4MDZkNDZmMDQsIDB4MWRjMzcyMTYsIDB4MTRjZTc5MTgsIDB4MmJlZDQ4MzIsIDB4MjJlMDQzM2MsIDB4MzlmNzVlMmUsIDB4MzBmYTU1MjAsIDB4OWFiNzAxZWMsIDB4OTNiYTBhZTIsIDB4ODhhZDE3ZjAsIDB4ODFhMDFjZmUsIDB4YmU4MzJkZDQsIDB4Yjc4ZTI2ZGEsIDB4YWM5OTNiYzgsIDB4YTU5NDMwYzYsIDB4ZDJkZjU5OWMsIDB4ZGJkMjUyOTIsIDB4YzBjNTRmODAsIDB4YzljODQ0OGUsIDB4ZjZlYjc1YTQsIDB4ZmZlNjdlYWEsIDB4ZTRmMTYzYjgsIDB4ZWRmYzY4YjYsIDB4MGE2N2IxMGMsIDB4MDM2YWJhMDIsIDB4MTg3ZGE3MTAsIDB4MTE3MGFjMWUsIDB4MmU1MzlkMzQsIDB4Mjc1ZTk2M2EsIDB4M2M0OThiMjgsIDB4MzU0NDgwMjYsIDB4NDIwZmU5N2MsIDB4NGIwMmUyNzIsIDB4NTAxNWZmNjAsIDB4NTkxOGY0NmUsIDB4NjYzYmM1NDQsIDB4NmYzNmNlNGEsIDB4NzQyMWQzNTgsIDB4N2QyY2Q4NTYsIDB4YTEwYzdhMzcsIDB4YTgwMTcxMzksIDB4YjMxNjZjMmIsIDB4YmExYjY3MjUsIDB4ODUzODU2MGYsIDB4OGMzNTVkMDEsIDB4OTcyMjQwMTMsIDB4OWUyZjRiMWQsIDB4ZTk2NDIyNDcsIDB4ZTA2OTI5NDksIDB4ZmI3ZTM0NWIsIDB4ZjI3MzNmNTUsIDB4Y2Q1MDBlN2YsIDB4YzQ1ZDA1NzEsIDB4ZGY0YTE4NjMsIDB4ZDY0NzEzNmQsIDB4MzFkY2NhZDcsIDB4MzhkMWMxZDksIDB4MjNjNmRjY2IsIDB4MmFjYmQ3YzUsIDB4MTVlOGU2ZWYsIDB4MWNlNWVkZTEsIDB4MDdmMmYwZjMsIDB4MGVmZmZiZmQsIDB4NzliNDkyYTcsIDB4NzBiOTk5YTksIDB4NmJhZTg0YmIsIDB4NjJhMzhmYjUsIDB4NWQ4MGJlOWYsIDB4NTQ4ZGI1OTEsIDB4NGY5YWE4ODMsIDB4NDY5N2EzOGRdO1xuZnVuY3Rpb24gY29udmVydFRvSW50MzIoYnl0ZXMpIHtcbiAgICBjb25zdCByZXN1bHQgPSBbXTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGJ5dGVzLmxlbmd0aDsgaSArPSA0KSB7XG4gICAgICAgIHJlc3VsdC5wdXNoKChieXRlc1tpXSA8PCAyNCkgfCAoYnl0ZXNbaSArIDFdIDw8IDE2KSB8IChieXRlc1tpICsgMl0gPDwgOCkgfCBieXRlc1tpICsgM10pO1xuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xufVxuZXhwb3J0IGNsYXNzIEFFUyB7XG4gICAgZ2V0IGtleSgpIHsgcmV0dXJuIF9fY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX0FFU19rZXksIFwiZlwiKS5zbGljZSgpOyB9XG4gICAgY29uc3RydWN0b3Ioa2V5KSB7XG4gICAgICAgIF9BRVNfa2V5LnNldCh0aGlzLCB2b2lkIDApO1xuICAgICAgICBfQUVTX0tkLnNldCh0aGlzLCB2b2lkIDApO1xuICAgICAgICBfQUVTX0tlLnNldCh0aGlzLCB2b2lkIDApO1xuICAgICAgICBpZiAoISh0aGlzIGluc3RhbmNlb2YgQUVTKSkge1xuICAgICAgICAgICAgdGhyb3cgRXJyb3IoJ0FFUyBtdXN0IGJlIGluc3Rhbml0YXRlZCB3aXRoIGBuZXdgJyk7XG4gICAgICAgIH1cbiAgICAgICAgX19jbGFzc1ByaXZhdGVGaWVsZFNldCh0aGlzLCBfQUVTX2tleSwgbmV3IFVpbnQ4QXJyYXkoa2V5KSwgXCJmXCIpO1xuICAgICAgICBjb25zdCByb3VuZHMgPSBudW1iZXJPZlJvdW5kc1t0aGlzLmtleS5sZW5ndGhdO1xuICAgICAgICBpZiAocm91bmRzID09IG51bGwpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ2ludmFsaWQga2V5IHNpemUgKG11c3QgYmUgMTYsIDI0IG9yIDMyIGJ5dGVzKScpO1xuICAgICAgICB9XG4gICAgICAgIC8vIGVuY3J5cHRpb24gcm91bmQga2V5c1xuICAgICAgICBfX2NsYXNzUHJpdmF0ZUZpZWxkU2V0KHRoaXMsIF9BRVNfS2UsIFtdLCBcImZcIik7XG4gICAgICAgIC8vIGRlY3J5cHRpb24gcm91bmQga2V5c1xuICAgICAgICBfX2NsYXNzUHJpdmF0ZUZpZWxkU2V0KHRoaXMsIF9BRVNfS2QsIFtdLCBcImZcIik7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDw9IHJvdW5kczsgaSsrKSB7XG4gICAgICAgICAgICBfX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9BRVNfS2UsIFwiZlwiKS5wdXNoKFswLCAwLCAwLCAwXSk7XG4gICAgICAgICAgICBfX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9BRVNfS2QsIFwiZlwiKS5wdXNoKFswLCAwLCAwLCAwXSk7XG4gICAgICAgI
26774H1cbiAgICAgICAgY29uc3Qgcm91bmRLZXlDb3VudCA9IChyb3VuZHMgKyAxKSAqIDQ7XG4gICAgICAgIGNvbnN0IEtDID0gdGhpcy5rZXkubGVuZ3RoIC8gNDtcbiAgICAgICAgLy8gY29udmVydCB0aGUga2V5IGludG8gaW50c1xuICAgICAgICBjb25zdCB0ayA9IGNvbnZlcnRUb0ludDMyKHRoaXMua2V5KTtcbiAgICAgICAgLy8gY29weSB2YWx1ZXMgaW50byByb3VuZCBrZXkgYXJyYXlzXG4gICAgICAgIGxldCBpbmRleDtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBLQzsgaSsrKSB7XG4gICAgICAgICAgICBpbmRleCA9IGkgPj4gMjtcbiAgICAgICAgICAgIF9fY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX0FFU19LZSwgXCJmXCIpW2luZGV4XVtpICUgNF0gPSB0a1tpXTtcbiAgICAgICAgICAgIF9fY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX0FFU19LZCwgXCJmXCIpW3JvdW5kcyAtIGluZGV4XVtpICUgNF0gPSB0a1tpXTtcbiAgICAgICAgfVxuICAgICAgICAvLyBrZXkgZXhwYW5zaW9uIChmaXBzLTE5NyBzZWN0aW9uIDUuMilcbiAgICAgICAgbGV0IHJjb25wb2ludGVyID0gMDtcbiAgICAgICAgbGV0IHQgPSBLQywgdHQ7XG4gICAgICAgIHdoaWxlICh0IDwgcm91bmRLZXlDb3VudCkge1xuICAgICAgICAgICAgdHQgPSB0a1tLQyAtIDFdO1xuICAgICAgICAgICAgdGtbMF0gXj0gKChTWyh0dCA+PiAxNikgJiAweEZGXSA8PCAyNCkgXlxuICAgICAgICAgICAgICAgIChTWyh0dCA+PiA4KSAmIDB4RkZdIDw8IDE2KSBeXG4gICAgICAgICAgICAgICAgKFNbdHQgJiAweEZGXSA8PCA4KSBeXG4gICAgICAgICAgICAgICAgU1sodHQgPj4gMjQpICYgMHhGRl0gXlxuICAgICAgICAgICAgICAgIChyY29uW3Jjb25wb2ludGVyXSA8PCAyNCkpO1xuICAgICAgICAgICAgcmNvbnBvaW50ZXIgKz0gMTtcbiAgICAgICAgICAgIC8vIGtleSBleHBhbnNpb24gKGZvciBub24tMjU2IGJpdClcbiAgICAgICAgICAgIGlmIChLQyAhPSA4KSB7XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDE7IGkgPCBLQzsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgIHRrW2ldIF49IHRrW2kgLSAxXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgLy8ga2V5IGV4cGFuc2lvbiBmb3IgMjU2LWJpdCBrZXlzIGlzIFwic2xpZ2h0bHkgZGlmZmVyZW50XCIgKGZpcHMtMTk3KVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDE7IGkgPCAoS0MgLyAyKTsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgIHRrW2ldIF49IHRrW2kgLSAxXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdHQgPSB0a1soS0MgLyAyKSAtIDFdO1xuICAgICAgICAgICAgICAgIHRrW0tDIC8gMl0gXj0gKFNbdHQgJiAweEZGXSBeXG4gICAgICAgICAgICAgICAgICAgIChTWyh0dCA+PiA4KSAmIDB4RkZdIDw8IDgpIF5cbiAgICAgICAgICAgICAgICAgICAgKFNbKHR0ID4+IDE2KSAmIDB4RkZdIDw8IDE2KSBeXG4gICAgICAgICAgICAgICAgICAgIChTWyh0dCA+PiAyNCkgJiAweEZGXSA8PCAyNCkpO1xuICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAoS0MgLyAyKSArIDE7IGkgPCBLQzsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgIHRrW2ldIF49IHRrW2kgLSAxXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBjb3B5IHZhbHVlcyBpbnRvIHJvdW5kIGtleSBhcnJheXNcbiAgICAgICAgICAgIGxldCBpID0gMCwgciwgYztcbiAgICAgICAgICAgIHdoaWxlIChpIDwgS0MgJiYgdCA8IHJvdW5kS2V5Q291bnQpIHtcbiAgICAgICAgICAgICAgICByID0gdCA+PiAyO1xuICAgICAgICAgICAgICAgIGMgPSB0ICUgNDtcbiAgICAgICAgICAgICAgICBfX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9BRVNfS2UsIFwiZlwiKVtyXVtjXSA9IHRrW2ldO1xuICAgICAgICAgICAgICAgIF9fY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX0FFU19LZCwgXCJmXCIpW3JvdW5kcyAtIHJdW2NdID0gdGtbaSsrXTtcbiAgICAgICAgICAgICAgICB0Kys7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgLy8gaW52ZXJzZS1jaXBoZXItaWZ5IHRoZSBkZWNyeXB0aW9uIHJvdW5kIGtleSAoZmlwcy0xOTcgc2VjdGlvbiA1LjMpXG4gICAgICAgIGZvciAobGV0IHIgPSAxOyByIDwgcm91bmRzOyByKyspIHtcbiAgICAgICAgICAgIGZvciAobGV0IGMgPSAwOyBjIDwgNDsgYysrKSB7XG4gICAgICAgICAgICAgICAgdHQgPSBfX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9BRVNfS2QsIFwiZlwiKVtyXVtjXTtcbiAgICAgICAgICAgICAgICBfX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9BRVNfS2QsIFwiZlwiKVtyXVtjXSA9IChVMVsodHQgPj4gMjQpICYgMHhGRl0gXlxuICAgICAgICAgICAgICAgICAgICBVMlsodHQgPj4gMTYpICYgMHhGRl0gXlxuICAgICAgICAgICAgICAgICAgICBVM1sodHQgPj4gOCkgJiAweEZGXSBeXG4gICAgICAgICAgICAgICAgICAgIFU0W3R0ICYgMHhGRl0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIGVuY3J5cHQocGxhaW50ZXh0KSB7XG4gICAgICAgIGlmIChwbGFpbnRleHQubGVuZ3RoICE9IDE2KSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdpbnZhbGlkIHBsYWludGV4dCBzaXplIChtdXN0IGJlIDE2IGJ5dGVzKScpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHJvdW5kcyA9IF9fY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX0FFU19LZSwgXCJmXCIpLmxlbmd0aCAtIDE7XG4gICAgICAgIGNvbnN0IGEgPSBbMCwgMCwgMCwgMF07XG4gICAgICAgIC8vIGNvbnZlcnQgcGxhaW50ZXh0IHRvIChpbnRzIF4ga2V5KVxuICAgICAgICBsZXQgdCA9IGNvbnZlcnRUb0ludDMyKHBsYWludGV4dCk7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgNDsgaSsrKSB7XG4gICAgICAgICAgICB0W2ldIF49IF9fY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX0FFU19LZSwgXCJmXCIpWzBdW2ldO1xuICAgICAgICB9XG4gICAgICAgIC8vIGFwcGx5IHJvdW5kIHRyYW5zZm9ybXNcbiAgICAgICAgZm9yIChsZXQgciA9IDE7IHIgPCByb3VuZHM7IHIrKykge1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCA0OyBpKyspIHtcbiAgICAgICAgICAgICAgICBhW2ldID0gKFQxWyh0W2ldID4+IDI0KSAmIDB4ZmZdIF5cbiAgICAgICAgICAgICAgICAgICAgVDJbKHRbKGkgKyAxKSAlIDRdID4+IDE2KSAmIDB4ZmZdIF5cbiAgICAgICAgICAgICAgICAgICAgVDNbKHRbKGkgKyAyKSAlIDRdID4+IDgpICYgMHhmZl0gXlxuICAgICAgICAgICAgICAgICAgICBUNFt0WyhpICsgMykgJSA0XSAmIDB4ZmZdIF5cbiAgICAgICAgICAgICAgICAgICAgX19jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfQUVTX0tlLCBcImZcIilbcl1baV0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdCA9IGEuc2xpY2UoKTtcbiAgICAgICAgfVxuICAgICAgICAvLyB0aGUgbGFzdCByb3VuZCBpcyBzcGVjaWFsXG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IG5ldyBVaW50OEFycmF5KDE2KTtcbiAgICAgICAgbGV0IHR0ID0gMDtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCA0OyBpKyspIHtcbiAgICAgICAgICAgI
26774HR0ID0gX19jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfQUVTX0tlLCBcImZcIilbcm91bmRzXVtpXTtcbiAgICAgICAgICAgIHJlc3VsdFs0ICogaV0gPSAoU1sodFtpXSA+PiAyNCkgJiAweGZmXSBeICh0dCA+PiAyNCkpICYgMHhmZjtcbiAgICAgICAgICAgIHJlc3VsdFs0ICogaSArIDFdID0gKFNbKHRbKGkgKyAxKSAlIDRdID4+IDE2KSAmIDB4ZmZdIF4gKHR0ID4+IDE2KSkgJiAweGZmO1xuICAgICAgICAgICAgcmVzdWx0WzQgKiBpICsgMl0gPSAoU1sodFsoaSArIDIpICUgNF0gPj4gOCkgJiAweGZmXSBeICh0dCA+PiA4KSkgJiAweGZmO1xuICAgICAgICAgICAgcmVzdWx0WzQgKiBpICsgM10gPSAoU1t0WyhpICsgMykgJSA0XSAmIDB4ZmZdIF4gdHQpICYgMHhmZjtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbiAgICBkZWNyeXB0KGNpcGhlcnRleHQpIHtcbiAgICAgICAgaWYgKGNpcGhlcnRleHQubGVuZ3RoICE9IDE2KSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdpbnZhbGlkIGNpcGhlcnRleHQgc2l6ZSAobXVzdCBiZSAxNiBieXRlcyknKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCByb3VuZHMgPSBfX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9BRVNfS2QsIFwiZlwiKS5sZW5ndGggLSAxO1xuICAgICAgICBjb25zdCBhID0gWzAsIDAsIDAsIDBdO1xuICAgICAgICAvLyBjb252ZXJ0IHBsYWludGV4dCB0byAoaW50cyBeIGtleSlcbiAgICAgICAgbGV0IHQgPSBjb252ZXJ0VG9JbnQzMihjaXBoZXJ0ZXh0KTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCA0OyBpKyspIHtcbiAgICAgICAgICAgIHRbaV0gXj0gX19jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfQUVTX0tkLCBcImZcIilbMF1baV07XG4gICAgICAgIH1cbiAgICAgICAgLy8gYXBwbHkgcm91bmQgdHJhbnNmb3Jtc1xuICAgICAgICBmb3IgKGxldCByID0gMTsgciA8IHJvdW5kczsgcisrKSB7XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IDQ7IGkrKykge1xuICAgICAgICAgICAgICAgIGFbaV0gPSAoVDVbKHRbaV0gPj4gMjQpICYgMHhmZl0gXlxuICAgICAgICAgICAgICAgICAgICBUNlsodFsoaSArIDMpICUgNF0gPj4gMTYpICYgMHhmZl0gXlxuICAgICAgICAgICAgICAgICAgICBUN1sodFsoaSArIDIpICUgNF0gPj4gOCkgJiAweGZmXSBeXG4gICAgICAgICAgICAgICAgICAgIFQ4W3RbKGkgKyAxKSAlIDRdICYgMHhmZl0gXlxuICAgICAgICAgICAgICAgICAgICBfX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9BRVNfS2QsIFwiZlwiKVtyXVtpXSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0ID0gYS5zbGljZSgpO1xuICAgICAgICB9XG4gICAgICAgIC8vIHRoZSBsYXN0IHJvdW5kIGlzIHNwZWNpYWxcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gbmV3IFVpbnQ4QXJyYXkoMTYpO1xuICAgICAgICBsZXQgdHQgPSAwO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IDQ7IGkrKykge1xuICAgICAgICAgICAgdHQgPSBfX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9BRVNfS2QsIFwiZlwiKVtyb3VuZHNdW2ldO1xuICAgICAgICAgICAgcmVzdWx0WzQgKiBpXSA9IChTaVsodFtpXSA+PiAyNCkgJiAweGZmXSBeICh0dCA+PiAyNCkpICYgMHhmZjtcbiAgICAgICAgICAgIHJlc3VsdFs0ICogaSArIDFdID0gKFNpWyh0WyhpICsgMykgJSA0XSA+PiAxNikgJiAweGZmXSBeICh0dCA+PiAxNikpICYgMHhmZjtcbiAgICAgICAgICAgIHJlc3VsdFs0ICogaSArIDJdID0gKFNpWyh0WyhpICsgMikgJSA0XSA+PiA4KSAmIDB4ZmZdIF4gKHR0ID4+IDgpKSAmIDB4ZmY7XG4gICAgICAgICAgICByZXN1bHRbNCAqIGkgKyAzXSA9IChTaVt0WyhpICsgMSkgJSA0XSAmIDB4ZmZdIF4gdHQpICYgMHhmZjtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbn1cbl9BRVNfa2V5ID0gbmV3IFdlYWtNYXAoKSwgX0FFU19LZCA9IG5ldyBXZWFrTWFwKCksIF9BRVNfS2UgPSBuZXcgV2Vha01hcCgpO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9YWVzLmpzLm1hcCIsImltcG9ydCB7IEFFUyB9IGZyb20gXCIuL2Flcy5qc1wiO1xuZXhwb3J0IGNsYXNzIE1vZGVPZk9wZXJhdGlvbiB7XG4gICAgY29uc3RydWN0b3IobmFtZSwga2V5LCBjbHMpIHtcbiAgICAgICAgaWYgKGNscyAmJiAhKHRoaXMgaW5zdGFuY2VvZiBjbHMpKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYCR7bmFtZX0gbXVzdCBiZSBpbnN0YW50aWF0ZWQgd2l0aCBcIm5ld1wiYCk7XG4gICAgICAgIH1cbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnRpZXModGhpcywge1xuICAgICAgICAgICAgYWVzOiB7IGVudW1lcmFibGU6IHRydWUsIHZhbHVlOiBuZXcgQUVTKGtleSkgfSxcbiAgICAgICAgICAgIG5hbWU6IHsgZW51bWVyYWJsZTogdHJ1ZSwgdmFsdWU6IG5hbWUgfVxuICAgICAgICB9KTtcbiAgICB9XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1tb2RlLmpzLm1hcCIsIi8vIENpcGhlciBCbG9jayBDaGFpbmluZ1xudmFyIF9fY2xhc3NQcml2YXRlRmllbGRTZXQgPSAodGhpcyAmJiB0aGlzLl9fY2xhc3NQcml2YXRlRmllbGRTZXQpIHx8IGZ1bmN0aW9uIChyZWNlaXZlciwgc3RhdGUsIHZhbHVlLCBraW5kLCBmKSB7XG4gICAgaWYgKGtpbmQgPT09IFwibVwiKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiUHJpdmF0ZSBtZXRob2QgaXMgbm90IHdyaXRhYmxlXCIpO1xuICAgIGlmIChraW5kID09PSBcImFcIiAmJiAhZikgdGhyb3cgbmV3IFR5cGVFcnJvcihcIlByaXZhdGUgYWNjZXNzb3Igd2FzIGRlZmluZWQgd2l0aG91dCBhIHNldHRlclwiKTtcbiAgICBpZiAodHlwZW9mIHN0YXRlID09PSBcImZ1bmN0aW9uXCIgPyByZWNlaXZlciAhPT0gc3RhdGUgfHwgIWYgOiAhc3RhdGUuaGFzKHJlY2VpdmVyKSkgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkNhbm5vdCB3cml0ZSBwcml2YXRlIG1lbWJlciB0byBhbiBvYmplY3Qgd2hvc2UgY2xhc3MgZGlkIG5vdCBkZWNsYXJlIGl0XCIpO1xuICAgIHJldHVybiAoa2luZCA9PT0gXCJhXCIgPyBmLmNhbGwocmVjZWl2ZXIsIHZhbHVlKSA6IGYgPyBmLnZhbHVlID0gdmFsdWUgOiBzdGF0ZS5zZXQocmVjZWl2ZXIsIHZhbHVlKSksIHZhbHVlO1xufTtcbnZhciBfX2NsYXNzUHJpdmF0ZUZpZWxkR2V0ID0gKHRoaXMgJiYgdGhpcy5fX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KSB8fCBmdW5jdGlvbiAocmVjZWl2ZXIsIHN0YXRlLCBraW5kLCBmKSB7XG4gICAgaWYgKGtpbmQgPT09IFwiYVwiICYmICFmKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiUHJpdmF0ZSBhY2Nlc3NvciB3YXMgZGVmaW5lZCB3aXRob3V0IGEgZ2V0dGVyXCIpO1xuICAgIGlmICh0eXBlb2Ygc3RhdGUgPT09IFwiZnVuY3Rpb25cIiA/IHJlY2VpdmVyICE9PSBzdGF0ZSB8fCAhZiA6ICFzdGF0ZS5oYXMocmVjZWl2ZXIpKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiQ2Fubm90IHJlYWQgcHJpdmF0ZSBtZW1iZXIgZnJvbSBhbiBvYmplY3Qgd2hvc2UgY2xhc3MgZGlkIG5vdCBkZWNsYXJlIGl0XCIpO1xuICAgIHJldHVybi
26774BraW5kID09PSBcIm1cIiA/IGYgOiBraW5kID09PSBcImFcIiA/IGYuY2FsbChyZWNlaXZlcikgOiBmID8gZi52YWx1ZSA6IHN0YXRlLmdldChyZWNlaXZlcik7XG59O1xudmFyIF9DQkNfaXYsIF9DQkNfbGFzdEJsb2NrO1xuaW1wb3J0IHsgTW9kZU9mT3BlcmF0aW9uIH0gZnJvbSBcIi4vbW9kZS5qc1wiO1xuZXhwb3J0IGNsYXNzIENCQyBleHRlbmRzIE1vZGVPZk9wZXJhdGlvbiB7XG4gICAgY29uc3RydWN0b3Ioa2V5LCBpdikge1xuICAgICAgICBzdXBlcihcIkVDQ1wiLCBrZXksIENCQyk7XG4gICAgICAgIF9DQkNfaXYuc2V0KHRoaXMsIHZvaWQgMCk7XG4gICAgICAgIF9DQkNfbGFzdEJsb2NrLnNldCh0aGlzLCB2b2lkIDApO1xuICAgICAgICBpZiAoaXYpIHtcbiAgICAgICAgICAgIGlmIChpdi5sZW5ndGggJSAxNikge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJpbnZhbGlkIGl2IHNpemUgKG11c3QgYmUgMTYgYnl0ZXMpXCIpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgX19jbGFzc1ByaXZhdGVGaWVsZFNldCh0aGlzLCBfQ0JDX2l2LCBuZXcgVWludDhBcnJheShpdiksIFwiZlwiKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIF9fY2xhc3NQcml2YXRlRmllbGRTZXQodGhpcywgX0NCQ19pdiwgbmV3IFVpbnQ4QXJyYXkoMTYpLCBcImZcIik7XG4gICAgICAgIH1cbiAgICAgICAgX19jbGFzc1ByaXZhdGVGaWVsZFNldCh0aGlzLCBfQ0JDX2xhc3RCbG9jaywgdGhpcy5pdiwgXCJmXCIpO1xuICAgIH1cbiAgICBnZXQgaXYoKSB7IHJldHVybiBuZXcgVWludDhBcnJheShfX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9DQkNfaXYsIFwiZlwiKSk7IH1cbiAgICBlbmNyeXB0KHBsYWludGV4dCkge1xuICAgICAgICBpZiAocGxhaW50ZXh0Lmxlbmd0aCAlIDE2KSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFwiaW52YWxpZCBwbGFpbnRleHQgc2l6ZSAobXVzdCBiZSBtdWx0aXBsZSBvZiAxNiBieXRlcylcIik7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgY2lwaGVydGV4dCA9IG5ldyBVaW50OEFycmF5KHBsYWludGV4dC5sZW5ndGgpO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHBsYWludGV4dC5sZW5ndGg7IGkgKz0gMTYpIHtcbiAgICAgICAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgMTY7IGorKykge1xuICAgICAgICAgICAgICAgIF9fY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX0NCQ19sYXN0QmxvY2ssIFwiZlwiKVtqXSBePSBwbGFpbnRleHRbaSArIGpdO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgX19jbGFzc1ByaXZhdGVGaWVsZFNldCh0aGlzLCBfQ0JDX2xhc3RCbG9jaywgdGhpcy5hZXMuZW5jcnlwdChfX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9DQkNfbGFzdEJsb2NrLCBcImZcIikpLCBcImZcIik7XG4gICAgICAgICAgICBjaXBoZXJ0ZXh0LnNldChfX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9DQkNfbGFzdEJsb2NrLCBcImZcIiksIGkpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBjaXBoZXJ0ZXh0O1xuICAgIH1cbiAgICBkZWNyeXB0KGNpcGhlcnRleHQpIHtcbiAgICAgICAgaWYgKGNpcGhlcnRleHQubGVuZ3RoICUgMTYpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJpbnZhbGlkIGNpcGhlcnRleHQgc2l6ZSAobXVzdCBiZSBtdWx0aXBsZSBvZiAxNiBieXRlcylcIik7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgcGxhaW50ZXh0ID0gbmV3IFVpbnQ4QXJyYXkoY2lwaGVydGV4dC5sZW5ndGgpO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNpcGhlcnRleHQubGVuZ3RoOyBpICs9IDE2KSB7XG4gICAgICAgICAgICBjb25zdCBibG9jayA9IHRoaXMuYWVzLmRlY3J5cHQoY2lwaGVydGV4dC5zdWJhcnJheShpLCBpICsgMTYpKTtcbiAgICAgICAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgMTY7IGorKykge1xuICAgICAgICAgICAgICAgIHBsYWludGV4dFtpICsgal0gPSBibG9ja1tqXSBeIF9fY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX0NCQ19sYXN0QmxvY2ssIFwiZlwiKVtqXTtcbiAgICAgICAgICAgICAgICBfX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9DQkNfbGFzdEJsb2NrLCBcImZcIilbal0gPSBjaXBoZXJ0ZXh0W2kgKyBqXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcGxhaW50ZXh0O1xuICAgIH1cbn1cbl9DQkNfaXYgPSBuZXcgV2Vha01hcCgpLCBfQ0JDX2xhc3RCbG9jayA9IG5ldyBXZWFrTWFwKCk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1tb2RlLWNiYy5qcy5tYXAiLCIvLyBDb3VudGVyIE1vZGVcbnZhciBfX2NsYXNzUHJpdmF0ZUZpZWxkU2V0ID0gKHRoaXMgJiYgdGhpcy5fX2NsYXNzUHJpdmF0ZUZpZWxkU2V0KSB8fCBmdW5jdGlvbiAocmVjZWl2ZXIsIHN0YXRlLCB2YWx1ZSwga2luZCwgZikge1xuICAgIGlmIChraW5kID09PSBcIm1cIikgdGhyb3cgbmV3IFR5cGVFcnJvcihcIlByaXZhdGUgbWV0aG9kIGlzIG5vdCB3cml0YWJsZVwiKTtcbiAgICBpZiAoa2luZCA9PT0gXCJhXCIgJiYgIWYpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJQcml2YXRlIGFjY2Vzc29yIHdhcyBkZWZpbmVkIHdpdGhvdXQgYSBzZXR0ZXJcIik7XG4gICAgaWYgKHR5cGVvZiBzdGF0ZSA9PT0gXCJmdW5jdGlvblwiID8gcmVjZWl2ZXIgIT09IHN0YXRlIHx8ICFmIDogIXN0YXRlLmhhcyhyZWNlaXZlcikpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJDYW5ub3Qgd3JpdGUgcHJpdmF0ZSBtZW1iZXIgdG8gYW4gb2JqZWN0IHdob3NlIGNsYXNzIGRpZCBub3QgZGVjbGFyZSBpdFwiKTtcbiAgICByZXR1cm4gKGtpbmQgPT09IFwiYVwiID8gZi5jYWxsKHJlY2VpdmVyLCB2YWx1ZSkgOiBmID8gZi52YWx1ZSA9IHZhbHVlIDogc3RhdGUuc2V0KHJlY2VpdmVyLCB2YWx1ZSkpLCB2YWx1ZTtcbn07XG52YXIgX19jbGFzc1ByaXZhdGVGaWVsZEdldCA9ICh0aGlzICYmIHRoaXMuX19jbGFzc1ByaXZhdGVGaWVsZEdldCkgfHwgZnVuY3Rpb24gKHJlY2VpdmVyLCBzdGF0ZSwga2luZCwgZikge1xuICAgIGlmIChraW5kID09PSBcImFcIiAmJiAhZikgdGhyb3cgbmV3IFR5cGVFcnJvcihcIlByaXZhdGUgYWNjZXNzb3Igd2FzIGRlZmluZWQgd2l0aG91dCBh
26774IGdldHRlclwiKTtcbiAgICBpZiAodHlwZW9mIHN0YXRlID09PSBcImZ1bmN0aW9uXCIgPyByZWNlaXZlciAhPT0gc3RhdGUgfHwgIWYgOiAhc3RhdGUuaGFzKHJlY2VpdmVyKSkgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkNhbm5vdCByZWFkIHByaXZhdGUgbWVtYmVyIGZyb20gYW4gb2JqZWN0IHdob3NlIGNsYXNzIGRpZCBub3QgZGVjbGFyZSBpdFwiKTtcbiAgICByZXR1cm4ga2luZCA9PT0gXCJtXCIgPyBmIDoga2luZCA9PT0gXCJhXCIgPyBmLmNhbGwocmVjZWl2ZXIpIDogZiA/IGYudmFsdWUgOiBzdGF0ZS5nZXQocmVjZWl2ZXIpO1xufTtcbnZhciBfQ1RSX3JlbWFpbmluZywgX0NUUl9yZW1haW5pbmdJbmRleCwgX0NUUl9jb3VudGVyO1xuaW1wb3J0IHsgTW9kZU9mT3BlcmF0aW9uIH0gZnJvbSBcIi4vbW9kZS5qc1wiO1xuZXhwb3J0IGNsYXNzIENUUiBleHRlbmRzIE1vZGVPZk9wZXJhdGlvbiB7XG4gICAgY29uc3RydWN0b3Ioa2V5LCBpbml0aWFsVmFsdWUpIHtcbiAgICAgICAgc3VwZXIoXCJDVFJcIiwga2V5LCBDVFIpO1xuICAgICAgICAvLyBSZW1haW5pbmcgYnl0ZXMgZm9yIHRoZSBvbmUtdGltZSBwYWRcbiAgICAgICAgX0NUUl9yZW1haW5pbmcuc2V0KHRoaXMsIHZvaWQgMCk7XG4gICAgICAgIF9DVFJfcmVtYWluaW5nSW5kZXguc2V0KHRoaXMsIHZvaWQgMCk7XG4gICAgICAgIC8vIFRoZSBjdXJyZW50IGNvdW50ZXJcbiAgICAgICAgX0NUUl9jb3VudGVyLnNldCh0aGlzLCB2b2lkIDApO1xuICAgICAgICBfX2NsYXNzUHJpdmF0ZUZpZWxkU2V0KHRoaXMsIF9DVFJfY291bnRlciwgbmV3IFVpbnQ4QXJyYXkoMTYpLCBcImZcIik7XG4gICAgICAgIF9fY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX0NUUl9jb3VudGVyLCBcImZcIikuZmlsbCgwKTtcbiAgICAgICAgX19jbGFzc1ByaXZhdGVGaWVsZFNldCh0aGlzLCBfQ1RSX3JlbWFpbmluZywgX19jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfQ1RSX2NvdW50ZXIsIFwiZlwiKSwgXCJmXCIpOyAvLyBUaGlzIHdpbGwgYmUgZGlzY2FyZGVkIGltbWVkaWF0ZWx5XG4gICAgICAgIF9fY2xhc3NQcml2YXRlRmllbGRTZXQodGhpcywgX0NUUl9yZW1haW5pbmdJbmRleCwgMTYsIFwiZlwiKTtcbiAgICAgICAgaWYgKGluaXRpYWxWYWx1ZSA9PSBudWxsKSB7XG4gICAgICAgICAgICBpbml0aWFsVmFsdWUgPSAxO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2YgKGluaXRpYWxWYWx1ZSkgPT09IFwibnVtYmVyXCIpIHtcbiAgICAgICAgICAgIHRoaXMuc2V0Q291bnRlclZhbHVlKGluaXRpYWxWYWx1ZSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0aGlzLnNldENvdW50ZXJCeXRlcyhpbml0aWFsVmFsdWUpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGdldCBjb3VudGVyKCkgeyByZXR1cm4gbmV3IFVpbnQ4QXJyYXkoX19jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfQ1RSX2NvdW50ZXIsIFwiZlwiKSk7IH1cbiAgICBzZXRDb3VudGVyVmFsdWUodmFsdWUpIHtcbiAgICAgICAgaWYgKCFOdW1iZXIuaXNJbnRlZ2VyKHZhbHVlKSB8fCB2YWx1ZSA8IDAgfHwgdmFsdWUgPiBOdW1iZXIuTUFYX1NBRkVfSU5URUdFUikge1xuICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcImludmFsaWQgY291bnRlciBpbml0aWFsIGludGVnZXIgdmFsdWVcIik7XG4gICAgICAgIH1cbiAgICAgICAgZm9yIChsZXQgaW5kZXggPSAxNTsgaW5kZXggPj0gMDsgLS1pbmRleCkge1xuICAgICAgICAgICAgX19jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfQ1RSX2NvdW50ZXIsIFwiZlwiKVtpbmRleF0gPSB2YWx1ZSAlIDI1NjtcbiAgICAgICAgICAgIHZhbHVlID0gTWF0aC5mbG9vcih2YWx1ZSAvIDI1Nik7XG4gICAgICAgIH1cbiAgICB9XG4gICAgc2V0Q291bnRlckJ5dGVzKHZhbHVlKSB7XG4gICAgICAgIGlmICh2YWx1ZS5sZW5ndGggIT09IDE2KSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFwiaW52YWxpZCBjb3VudGVyIGluaXRpYWwgVWludDhBcnJheSB2YWx1ZSBsZW5ndGhcIik7XG4gICAgICAgIH1cbiAgICAgICAgX19jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfQ1RSX2NvdW50ZXIsIFwiZlwiKS5zZXQodmFsdWUpO1xuICAgIH1cbiAgICBpbmNyZW1lbnQoKSB7XG4gICAgICAgIGZvciAobGV0IGkgPSAxNTsgaSA+PSAwOyBpLS0pIHtcbiAgICAgICAgICAgIGlmIChfX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9DVFJfY291bnRlciwgXCJmXCIpW2ldID09PSAyNTUpIHtcbiAgICAgICAgICAgICAgICBfX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9DVFJfY291bnRlciwgXCJmXCIpW2ldID0gMDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIF9fY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX0NUUl9jb3VudGVyLCBcImZcIilbaV0rKztcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICBlbmNyeXB0KHBsYWludGV4dCkge1xuICAgICAgICB2Y
26774XIgX2EsIF9iO1xuICAgICAgICBjb25zdCBjcnlwdHRleHQgPSBuZXcgVWludDhBcnJheShwbGFpbnRleHQpO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNyeXB0dGV4dC5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgaWYgKF9fY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX0NUUl9yZW1haW5pbmdJbmRleCwgXCJmXCIpID09PSAxNikge1xuICAgICAgICAgICAgICAgIF9fY2xhc3NQcml2YXRlRmllbGRTZXQodGhpcywgX0NUUl9yZW1haW5pbmcsIHRoaXMuYWVzLmVuY3J5cHQoX19jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfQ1RSX2NvdW50ZXIsIFwiZlwiKSksIFwiZlwiKTtcbiAgICAgICAgICAgICAgICBfX2NsYXNzUHJpdmF0ZUZpZWxkU2V0KHRoaXMsIF9DVFJfcmVtYWluaW5nSW5kZXgsIDAsIFwiZlwiKTtcbiAgICAgICAgICAgICAgICB0aGlzLmluY3JlbWVudCgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY3J5cHR0ZXh0W2ldIF49IF9fY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX0NUUl9yZW1haW5pbmcsIFwiZlwiKVtfX2NsYXNzUHJpdmF0ZUZpZWxkU2V0KHRoaXMsIF9DVFJfcmVtYWluaW5nSW5kZXgsIChfYiA9IF9fY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX0NUUl9yZW1haW5pbmdJbmRleCwgXCJmXCIpLCBfYSA9IF9iKyssIF9iKSwgXCJmXCIpLCBfYV07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGNyeXB0dGV4dDtcbiAgICB9XG4gICAgZGVjcnlwdChjaXBoZXJ0ZXh0KSB7XG4gICAgICAgIHJldHVybiB0aGlzLmVuY3J5cHQoY2lwaGVydGV4dCk7XG4gICAgfVxufVxuX0NUUl9yZW1haW5pbmcgPSBuZXcgV2Vha01hcCgpLCBfQ1RSX3JlbWFpbmluZ0luZGV4ID0gbmV3IFdlYWtNYXAoKSwgX0NUUl9jb3VudGVyID0gbmV3IFdlYWtNYXAoKTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPW1vZGUtY3RyLmpzLm1hcCIsImV4cG9ydCBmdW5jdGlvbiBwa2NzN1BhZChkYXRhKSB7XG4gICAgY29uc3QgcGFkZGVyID0gMTYgLSAoZGF0YS5sZW5ndGggJSAxNik7XG4gICAgY29uc3QgcmVzdWx0ID0gbmV3IFVpbnQ4QXJyYXkoZGF0YS5sZW5ndGggKyBwYWRkZXIpO1xuICAgIHJlc3VsdC5zZXQoZGF0YSk7XG4gICAgZm9yIChsZXQgaSA9IGRhdGEubGVuZ3RoOyBpIDwgcmVzdWx0Lmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHJlc3VsdFtpXSA9IHBhZGRlcjtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbn1cbmV4cG9ydCBmdW5jdGlvbiBwa2NzN1N0cmlwKGRhdGEpIHtcbiAgICBpZiAoZGF0YS5sZW5ndGggPCAxNikge1xuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdQS0NTIzcgaW52YWxpZCBsZW5ndGgnKTtcbiAgICB9XG4gICAgY29uc3QgcGFkZGVyID0gZGF0YVtkYXRhLmxlbmd0aCAtIDFdO1xuICAgIGlmIChwYWRkZXIgPiAxNikge1xuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdQS0NTIzcgcGFkZGluZyBieXRlIG91dCBvZiByYW5nZScpO1xuICAgIH1cbiAgICBjb25zdCBsZW5ndGggPSBkYXRhLmxlbmd0aCAtIHBhZGRlcjtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHBhZGRlcjsgaSsrKSB7XG4gICAgICAgIGlmIChkYXRhW2xlbmd0aCArIGldICE9PSBwYWRkZXIpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1BLQ1MjNyBpbnZhbGlkIHBhZGRpbmcgYnl0ZScpO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBuZXcgVWludDhBcnJheShkYXRhLnN1YmFycmF5KDAsIGxlbmd0aCkpO1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9cGFkZGluZy5qcy5tYXAiLCIvKipcbiAqICBAX2lnbm9yZVxuICovXG5pbXBvcnQgeyBnZXRCeXRlc0NvcHksIGFzc2VydEFyZ3VtZW50LCB0b1V0ZjhCeXRlcyB9IGZyb20gXCIuLi91dGlscy9pbmRleC5qc1wiO1xuZXhwb3J0IGZ1bmN0aW9uIGxvb3NlQXJyYXlpZnkoaGV4U3RyaW5nKSB7XG4gICAgaWYgKHR5cGVvZiAoaGV4U3RyaW5nKSA9PT0gXCJzdHJpbmdcIiAmJiAhaGV4U3RyaW5nLnN0YXJ0c1dpdGgoXCIweFwiKSkge1xuICAgICAgICBoZXhTdHJpbmcgPSBcIjB4XCIgKyBoZXhTdHJpbmc7XG4gICAgfVxuICAgIHJldHVybiBnZXRCeXRlc0NvcHkoaGV4U3RyaW5nKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiB6cGFkKHZhbHVlLCBsZW5ndGgpIHtcbiAgICB2YWx1ZSA9IFN0cmluZyh2YWx1ZSk7XG4gICAgd2hpbGUgKHZhbHVlLmxlbmd0aCA8IGxlbmd0aCkge1xuICAgICAgICB2YWx1ZSA9ICcwJyArIHZhbHVlO1xuICAgIH1cbiAgICByZXR1cm4gdmFsdWU7XG59XG5leHBvcnQgZnVuY3Rpb24gZ2V0UGFzc3dvcmQocGFzc3dvcmQpIHtcbiAgICBpZiAodHlwZW9mIChwYXNzd29yZCkgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIHJldHVybiB0b1V0ZjhCeXRlcyhwYXNzd29yZCwgXCJORktDXCIpO1xuICAgIH1cbiAgICByZXR1cm4gZ2V0Qnl0ZXNDb3B5KHBhc3N3b3JkKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBzcGVsdW5rKG9iamVjdCwgX3BhdGgpIHtcbiAgICBjb25zdCBtYXRjaCA9IF9wYXRoLm1hdGNoKC9eKFthLXowLTkkXy4tXSopKDooW2Etel0rKSk/KCEpPyQvaSk7XG4gICAgYXNzZXJ0QXJndW1lbnQobWF0Y2ggIT0gbnVsbCwgXCJpbnZhbGlkIHBhdGhcIiwgXCJwYXRoXCIsIF9wYXRoKTtcbiAgICBjb25zdCBwYXRoID0gbWF0Y2hbMV07XG4gICAgY29uc3QgdHlwZSA9IG1hdGNoWzNdO1xuICAgIGNvbnN0IHJlcWQgPSAobWF0Y2hbNF0gPT09IFwiIVwiKTtcbiAgICBsZXQgY3VyID0gb2JqZWN0O1xuICAgIGZvciAoY29uc3QgY29tcCBvZiBwYXRoLnRvTG93ZXJDYXNlKCkuc3BsaXQoJy4nKSkge1xuICAgICAgICAvLyBTZWFyY2ggZm9yIGEgY2hpbGQgb2JqZWN0IHdpdGggYSBjYXNlLWluc2Vuc2l0aXZlIG1hdGNoaW5nIGtleVxuICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShjdXIpKSB7XG4gICAgICAgICAgICBpZiAoIWNvbXAubWF0Y2goL15bMC05XSskLykpIHtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGN1ciA9IGN1cltwYXJzZUludChjb21wKV07XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAodHlwZW9mIChjdXIpID09PSBcIm9iamVjdFwiKSB7XG4gICAgICAgICAgICBsZXQgZm91bmQgPSBudWxsO1xuICAgICAgICAgICAgZm9yIChjb25zdCBrZXkgaW4gY3VyKSB7XG4gICAgICAgICAgICAgICAgaWYgKGtleS50b0xvd2VyQ2FzZSgpID09PSBjb21wKSB7XG4gICAgICAgICAgICAgICAgICAgIGZvdW5kID0gY3VyW2tleV07XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgI
26774H1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGN1ciA9IGZvdW5kO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgY3VyID0gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICBpZiAoY3VyID09IG51bGwpIHtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgfVxuICAgIGFzc2VydEFyZ3VtZW50KCFyZXFkIHx8IGN1ciAhPSBudWxsLCBcIm1pc3NpbmcgcmVxdWlyZWQgdmFsdWVcIiwgXCJwYXRoXCIsIHBhdGgpO1xuICAgIGlmICh0eXBlICYmIGN1ciAhPSBudWxsKSB7XG4gICAgICAgIGlmICh0eXBlID09PSBcImludFwiKSB7XG4gICAgICAgICAgICBpZiAodHlwZW9mIChjdXIpID09PSBcInN0cmluZ1wiICYmIGN1ci5tYXRjaCgvXi0/WzAtOV0rJC8pKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHBhcnNlSW50KGN1cik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChOdW1iZXIuaXNTYWZlSW50ZWdlcihjdXIpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGN1cjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZSA9PT0gXCJudW1iZXJcIikge1xuICAgICAgICAgICAgaWYgKHR5cGVvZiAoY3VyKSA9PT0gXCJzdHJpbmdcIiAmJiBjdXIubWF0Y2goL14tP1swLTkuXSokLykpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gcGFyc2VGbG9hdChjdXIpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlID09PSBcImRhdGFcIikge1xuICAgICAgICAgICAgaWYgKHR5cGVvZiAoY3VyKSA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgICAgICAgICAgIHJldHVybiBsb29zZUFycmF5aWZ5KGN1cik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGUgPT09IFwiYXJyYXlcIiAmJiBBcnJheS5pc0FycmF5KGN1cikpIHtcbiAgICAgICAgICAgIHJldHVybiBjdXI7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGUgPT09IHR5cGVvZiAoY3VyKSkge1xuICAgICAgICAgICAgcmV0dXJuIGN1cjtcbiAgICAgICAgfVxuICAgICAgICBhc3NlcnRBcmd1bWVudChmYWxzZSwgYHdyb25nIHR5cGUgZm91bmQgZm9yICR7dHlwZX0gYCwgXCJwYXRoXCIsIHBhdGgpO1xuICAgIH1cbiAgICByZXR1cm4gY3VyO1xufVxuLypcbmV4cG9ydCBmdW5jdGlvbiBmb2xsb3cob2JqZWN0OiBhbnksIHBhdGg6IHN0cmluZyk6IG51bGwgfCBzdHJpbmcge1xuICAgIGxldCBjdXJyZW50Q2hpbGQgPSBvYmplY3Q7XG5cbiAgICBmb3IgKGNvbnN0IGNvbXAgb2YgcGF0aC50b0xvd2VyQ2FzZSgpLnNwbGl0KCcvJykpIHtcblxuICAgICAgICAvLyBTZWFyY2ggZm9yIGEgY2hpbGQgb2JqZWN0IHdpdGggYSBjYXNlLWluc2Vuc2l0aXZlIG1hdGNoaW5nIGtleVxuICAgICAgICBsZXQgbWF0Y2hpbmdDaGlsZCA9IG51bGw7XG4gICAgICAgIGZvciAoY29uc3Qga2V5IGluIGN1cnJlbnRDaGlsZCkge1xuICAgICAgICAgICAgIGlmIChrZXkudG9Mb3dlckNhc2UoKSA9PT0gY29tcCkge1xuICAgICAgICAgICAgICAgICBtYXRjaGluZ0NoaWxkID0gY3VycmVudENoaWxkW2tleV07XG4gICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChtYXRjaGluZ0NoaWxkID09PSBudWxsKSB7IHJldHVybiBudWxsOyB9XG5cbiAgICAgICAgY3VycmVudENoaWxkID0gbWF0Y2hpbmdDaGlsZDtcbiAgICB9XG5cbiAgICByZXR1cm4gY3VycmVudENoaWxkO1xufVxuXG4vLyBcInBhdGgvdG8vc29tZXRoaW5nOnR5cGUhXCJcbmV4cG9ydCBmdW5jdGlvbiBmb2xsb3dSZXF1aXJlZChkYXRhOiBhbnksIHBhdGg6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgY29uc3QgdmFsdWUgPSBmb2xsb3coZGF0YSwgcGF0aCk7XG4gICAgaWYgKHZhbHVlICE9IG51bGwpIHsgcmV0dXJuIHZhbHVlOyB9XG4gICAgcmV0dXJuIGxvZ2dlci50aHJvd0FyZ3VtZW50RXJyb3IoXCJpbnZhbGlkIHZhbHVlXCIsIGBkYXRhOiR7IHBhdGggfWAsXG4gICAgSlNPTi5zdHJpbmdpZnkoZGF0YSkpO1xufVxuKi9cbi8vIFNlZTogaHR0cHM6Ly93d3cuaWV0Zi5vcmcvcmZjL3JmYzQxMjIudHh0IChTZWN0aW9uIDQuNClcbi8qXG5leHBvcnQgZnVuY3Rpb24gdXVpZFY0KHJhbmRvbUJ5dGVzOiBCeXRlc0xpa2UpOiBzdHJpbmcge1xuICAgIGNvbnN0IGJ5dGVzID0gZ2V0Qnl0ZXMocmFuZG9tQnl0ZXMsIFwicmFuZG9tQnl0ZXNcIik7XG5cbiAgICAvLyBTZWN0aW9uOiA0LjEuMzpcbiAgICAvLyAtIHRpbWVfaGlfYW5kX3ZlcnNpb25bMTI6MTZdID0gMGIwMTAwXG4gICAgYnl0ZXNbNl0gPSAoYnl0ZXNbNl0gJiAweDBmKSB8IDB4NDA7XG5cbiAgICAvLyBTZWN0aW9uIDQuNFxuICAgIC8vIC0gY2xvY2tfc2VxX2hpX2FuZF9yZXNlcnZlZFs2XSA9IDBiMFxuICAgIC8vIC0gY2xvY2tfc2VxX2hpX2FuZF9yZXNlcnZlZFs3XSA9IDBiMVxuICAgIGJ5dGVzWzhdID0gKGJ5dGVzWzhdICYgMHgzZikgfCAweDgwO1xuXG4gICAgY29uc3QgdmFsdWUgPSBoZXhsaWZ5KGJ5dGVzKTtcblxuICAgIHJldHVybiBbXG4gICAgICAgdmFsdWUuc3Vic3RyaW5nKDIsIDEwKSxcbiAgICAgICB2YWx1ZS5zdWJzdHJpbmcoMTAsIDE0KSxcbiAgICAgICB2YWx1ZS5zdWJzdHJpbmcoMTQsIDE4KSxcbiAgICAgICB2YWx1ZS5zdWJzdHJpbmcoMTgsIDIyKSxcbiAgICAgICB2YWx1ZS5zdWJzdHJpbmcoMjIsIDM0KSxcbiAgICBdLmpvaW4oXCItXCIpO1xufVxuKi9cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXV0aWxzLmpzLm1hcCIsIi8qKlxuICogIFRoZSBKU09OIFdhbGxldCBmb3JtYXRzIGFsbG93IGEgc2ltcGxlIHdheSB0byBzdG9yZSB0aGUgcHJpdmF0ZVxuICogIGtleXMgbmVlZGVkIGluIEV0aGVyZXVtIGFsb25nIHdpdGggcmVsYXRlZCBpbmZvcm1hdGlvbiBhbmQgYWxsb3dzXG4gKiAgZm9yIGV4dGVuc2libGUgZm9ybXMgb2YgZW5jcnlwdGlvbi5cbiAqXG4gKiAgVGhlc2UgdXRpbGl0aWVzIGZhY2lsaXRhdGUgZGVjcnlwdGluZyBhbmQgZW5jcnlwdGluZyB0aGUgbW9zdCBjb21tb25cbiAqICBKU09OIFdhbGxldCBmb3JtYXRzLlxuICpcbiAqICBAX3N1YnNlY3Rpb246IGFwaS93YWxsZXQ6SlNPTiBXYWxsZXRzICBbanNvbi13YWxsZXRzXVxuICovXG5pbXBvcnQgeyBDVFIgfSBmcm9tIFwiYWVzLWpzXCI7XG5pbXBvcnQgeyBnZXRBZGRyZXNzIH0gZnJvbSBcIi4uL2FkZHJlc3MvaW5kZXguanNcIjtcbmltcG9ydCB7
26774IGtlY2NhazI1NiwgcGJrZGYyLCByYW5kb21CeXRlcywgc2NyeXB0LCBzY3J5cHRTeW5jIH0gZnJvbSBcIi4uL2NyeXB0by9pbmRleC5qc1wiO1xuaW1wb3J0IHsgY29tcHV0ZUFkZHJlc3MgfSBmcm9tIFwiLi4vdHJhbnNhY3Rpb24vaW5kZXguanNcIjtcbmltcG9ydCB7IGNvbmNhdCwgZ2V0Qnl0ZXMsIGhleGxpZnksIHV1aWRWNCwgYXNzZXJ0LCBhc3NlcnRBcmd1bWVudCB9IGZyb20gXCIuLi91dGlscy9pbmRleC5qc1wiO1xuaW1wb3J0IHsgZ2V0UGFzc3dvcmQsIHNwZWx1bmssIHpwYWQgfSBmcm9tIFwiLi91dGlscy5qc1wiO1xuaW1wb3J0IHsgdmVyc2lvbiB9IGZyb20gXCIuLi9fdmVyc2lvbi5qc1wiO1xuY29uc3QgZGVmYXVsdFBhdGggPSBcIm0vNDQnLzYwJy8wJy8wLzBcIjtcbi8qKlxuICogIFJldHVybnMgdHJ1ZSBpZiAlJWpzb24lJSBpcyBhIHZhbGlkIEpTT04gS2V5c3RvcmUgV2FsbGV0LlxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNLZXlzdG9yZUpzb24oanNvbikge1xuICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IGRhdGEgPSBKU09OLnBhcnNlKGpzb24pO1xuICAgICAgICBjb25zdCB2ZXJzaW9uID0gKChkYXRhLnZlcnNpb24gIT0gbnVsbCkgPyBwYXJzZUludChkYXRhLnZlcnNpb24pIDogMCk7XG4gICAgICAgIGlmICh2ZXJzaW9uID09PSAzKSB7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBjYXRjaCAoZXJyb3IpIHsgfVxuICAgIHJldHVybiBmYWxzZTtcbn1cbmZ1bmN0aW9uIGRlY3J5cHQoZGF0YSwga2V5LCBjaXBoZXJ0ZXh0KSB7XG4gICAgY29uc3QgY2lwaGVyID0gc3BlbHVuayhkYXRhLCBcImNyeXB0by5jaXBoZXI6c3RyaW5nXCIpO1xuICAgIGlmIChjaXBoZXIgPT09IFwiYWVzLTEyOC1jdHJcIikge1xuICAgICAgICBjb25zdCBpdiA9IHNwZWx1bmsoZGF0YSwgXCJjcnlwdG8uY2lwaGVycGFyYW1zLml2OmRhdGEhXCIpO1xuICAgICAgICBjb25zdCBhZXNDdHIgPSBuZXcgQ1RSKGtleSwgaXYpO1xuICAgICAgICByZXR1cm4gaGV4bGlmeShhZXNDdHIuZGVjcnlwdChjaXBoZXJ0ZXh0KSk7XG4gICAgfVxuICAgIGFzc2VydChmYWxzZSwgXCJ1bnN1cHBvcnRlZCBjaXBoZXJcIiwgXCJVTlNVUFBPUlRFRF9PUEVSQVRJT05cIiwge1xuICAgICAgICBvcGVyYXRpb246IFwiZGVjcnlwdFwiXG4gICAgfSk7XG59XG5mdW5jdGlvbiBnZXRBY2NvdW50KGRhdGEsIF9rZXkpIHtcbiAgICBjb25zdCBrZXkgPSBnZXRCeXRlcyhfa2V5KTtcbiAgICBjb25zdCBjaXBoZXJ0ZXh0ID0gc3BlbHVuayhkYXRhLCBcImNyeXB0by5jaXBoZXJ0ZXh0OmRhdGEhXCIpO1xuICAgIGNvbnN0IGNvbXB1dGVkTUFDID0gaGV4bGlmeShrZWNjYWsyNTYoY29uY2F0KFtrZXkuc2xpY2UoMTYsIDMyKSwgY2lwaGVydGV4dF0pKSkuc3Vic3RyaW5nKDIpO1xuICAgIGFzc2VydEFyZ3VtZW50KGNvbXB1dGVkTUFDID09PSBzcGVsdW5rKGRhdGEsIFwiY3J5cHRvLm1hYzpzdHJpbmchXCIpLnRvTG93ZXJDYXNlKCksIFwiaW5jb3JyZWN0IHBhc3N3b3JkXCIsIFwicGFzc3dvcmRcIiwgXCJbIFJFREFDVEVEIF1cIik7XG4gICAgY29uc3QgcHJpdmF0ZUtleSA9IGRlY3J5cHQoZGF0YSwga2V5LnNsaWNlKDAsIDE2KSwgY2lwaGVydGV4dCk7XG4gICAgY29uc3QgYWRkcmVzcyA9IGNvbXB1dGVBZGRyZXNzKHByaXZhdGVLZXkpO1xuICAgIGlmIChkYXRhLmFkZHJlc3MpIHtcbiAgICAgICAgbGV0IGNoZWNrID0gZGF0YS5hZGRyZXNzLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgIGlmICghY2hlY2suc3RhcnRzV2l0aChcIjB4XCIpKSB7XG4gICAgICAgICAgICBjaGVjayA9IFwiMHhcIiArIGNoZWNrO1xuICAgICAgICB9XG4gICAgICAgIGFzc2VydEFyZ3VtZW50KGdldEFkZHJl
26774c3MoY2hlY2spID09PSBhZGRyZXNzLCBcImtleXN0b3JlIGFkZHJlc3MvcHJpdmF0ZUtleSBtaXNtYXRjaFwiLCBcImFkZHJlc3NcIiwgZGF0YS5hZGRyZXNzKTtcbiAgICB9XG4gICAgY29uc3QgYWNjb3VudCA9IHsgYWRkcmVzcywgcHJpdmF0ZUtleSB9O1xuICAgIC8vIFZlcnNpb24gMC4xIHgtZXRoZXJzIG1ldGFkYXRhIG11c3QgY29udGFpbiBhbiBlbmNyeXB0ZWQgbW5lbW9uaWMgcGhyYXNlXG4gICAgY29uc3QgdmVyc2lvbiA9IHNwZWx1bmsoZGF0YSwgXCJ4LWV0aGVycy52ZXJzaW9uOnN0cmluZ1wiKTtcbiAgICBpZiAodmVyc2lvbiA9PT0gXCIwLjFcIikge1xuICAgICAgICBjb25zdCBtbmVtb25pY0tleSA9IGtleS5zbGljZSgzMiwgNjQpO1xuICAgICAgICBjb25zdCBtbmVtb25pY0NpcGhlcnRleHQgPSBzcGVsdW5rKGRhdGEsIFwieC1ldGhlcnMubW5lbW9uaWNDaXBoZXJ0ZXh0OmRhdGEhXCIpO1xuICAgICAgICBjb25zdCBtbmVtb25pY0l2ID0gc3BlbHVuayhkYXRhLCBcIngtZXRoZXJzLm1uZW1vbmljQ291bnRlcjpkYXRhIVwiKTtcbiAgICAgICAgY29uc3QgbW5lbW9uaWNBZXNDdHIgPSBuZXcgQ1RSKG1uZW1vbmljS2V5LCBtbmVtb25pY0l2KTtcbiAgICAgICAgYWNjb3VudC5tbmVtb25pYyA9IHtcbiAgICAgICAgICAgIHBhdGg6IChzcGVsdW5rKGRhdGEsIFwieC1ldGhlcnMucGF0aDpzdHJpbmdcIikgfHwgZGVmYXVsdFBhdGgpLFxuICAgICAgICAgICAgbG9jYWxlOiAoc3BlbHVuayhkYXRhLCBcIngtZXRoZXJzLmxvY2FsZTpzdHJpbmdcIikgfHwgXCJlblwiKSxcbiAgICAgICAgICAgIGVudHJvcHk6IGhleGxpZnkoZ2V0Qnl0ZXMobW5lbW9uaWNBZXNDdHIuZGVjcnlwdChtbmVtb25pY0NpcGhlcnRleHQpKSlcbiAgICAgICAgfTtcbiAgICB9XG4gICAgcmV0dXJuIGFjY291bnQ7XG59XG5mdW5jdGlvbiBnZXREZWNyeXB0S2RmUGFyYW1zKGRhdGEpIHtcbiAgICBjb25zdCBrZGYgPSBzcGVsdW5rKGRhdGEsIFwiY3J5cHRvLmtkZjpzdHJpbmdcIik7XG4gICAgaWYgKGtkZiAmJiB0eXBlb2YgKGtkZikgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgaWYgKGtkZi50b0xvd2VyQ2FzZSgpID09PSBcInNjcnlwdFwiKSB7XG4gICAgICAgICAgICBjb25zdCBzYWx0ID0gc3BlbHVuayhkYXRhLCBcImNyeXB0by5rZGZwYXJhbXMuc2FsdDpkYXRhIVwiKTtcbiAgICAgICAgICAgIGNvbnN0IE4gPSBzcGVsdW5rKGRhdGEsIFwiY3J5cHRvLmtkZnBhcmFtcy5uOmludCFcIik7XG4gICAgICAgICAgICBjb25zdCByID0gc3BlbHVuayhkYXRhLCBcImNyeXB0by5rZGZwYXJhbXMucjppbnQhXCIpO1xuICAgICAgICAgICAgY29uc3QgcCA9IHNwZWx1bmsoZGF0YSwgXCJjcnlwdG8ua2RmcGFyYW1zLnA6aW50IVwiKTtcbiAgICAgICAgICAgIC8vIE1ha2Ugc3VyZSBOIGlzIGEgcG93ZXIgb2YgMlxuICAgICAgICAgICAgYXNzZXJ0QXJndW1lbnQoTiA+IDAgJiYgKE4gJiAoTiAtIDEpKSA9PT0gMCwgXCJpbnZhbGlkIGtkZi5OXCIsIFwia2RmLk5cIiwgTik7XG4gICAgICAgICAgICBhc3NlcnRBcmd1bWVudChyID4gMCAmJiBwID4gMCwgXCJpbnZhbGlkIGtkZlwiLCBcImtkZlwiLCBrZGYpO1xuICAgICAgICAgICAgY29uc3QgZGtMZW4gPSBzcGVsdW5rKGRhdGEsIFwiY3J5cHRvLmtkZnBhcmFtcy5ka2xlbjppbnQhXCIpO1xuICAgICAgICAgICAgYXNzZXJ0QXJndW1lbnQoZGtMZW4gPT09IDMyLCBcImludmFsaWQga2RmLmRrbGVuXCIsIFwia2RmLmRmbGVuXCIsIGRrTGVuKTtcbiAgICAgICAgICAgIHJldHVybiB7IG5hbWU6IFwic2NyeXB0XCIsIHNhbHQsIE4sIHIsIHAsIGRrTGVuOiA2NCB9O1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGtkZi50b0xvd2VyQ2FzZSgpID09PSBcInBia2RmMlwiKSB7XG4gICAgICAgICAgICBjb25zdCBzYWx0ID0gc3BlbHVuayhkYXRhLCBcImNyeXB0by5rZGZwYXJhbXMuc2FsdDpkYXRhIVwiKTtcbiAgICAgICAgICAgIGNvbnN0IHByZiA9IHNwZWx1bmsoZGF0YSwgXCJjcnlwdG8ua2RmcGFyYW1zLnByZjpzdHJpbmchXCIpO1xuICAgICAgICAgICAgY29uc3QgYWxnb3JpdGhtID0gcHJmLnNwbGl0KFwiLVwiKS5wb3AoKTtcbiAgICAgICAgICAgIGFzc2VydEFyZ3VtZW50KGFsZ29yaXRobSA9PT0gXCJzaGEyNTZcIiB8fCBhbGdvcml0aG0gPT09IFwic2hhNTEyXCIsIFwiaW52YWxpZCBrZGYucGRmXCIsIFwia2RmLnBkZlwiLCBwcmYpO1xuICAgICAgICAgICAgY29uc3QgY291bnQgPSBzcGVsdW5rKGRhdGEsIFwiY3J5cHRvLmtkZnBhcmFtcy5jOmludCFcIik7XG4gICAgICAgICAgICBjb25zdCBka0xlbiA9IHNwZWx1bmsoZGF0YSwgXCJjcnlwdG8ua2RmcGFyYW1zLmRrbGVuOmludCFcIik7XG4gICAgICAgICAgICBhc3NlcnRBcmd1bWVudChka0xlbiA9PT0gMzIsIFwiaW52YWxpZCBrZGYuZGtsZW5cIiwgXCJrZGYuZGtsZW5cIiwgZGtMZW4pO1xuICAgICAgICAgICAgcmV0dXJuIHsgbmFtZTogXCJwYmtkZjJcIiwgc2FsdCwgY291bnQsIGRrTGVuLCBhbGdvcml0aG0gfTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBhc3NlcnRBcmd1bWVudChmYWxzZSwgXCJ1bnN1cHBvcnRlZCBrZXktZGVyaXZhdGlvbiBmdW5jdGlvblwiLCBcImtkZlwiLCBrZGYpO1xufVxuLyoqXG4gKiAgUmV0dXJucyB0aGUgYWNjb3VudCBkZXRhaWxzIGZvciB0aGUgSlNPTiBLZXlzdG9yZSBXYWxsZXQgJSVqc29uJSVcbiAqICB1c2luZyAlJXBhc3N3b3JkJSUuXG4gKlxuICogIEl0IGlzIHByZWZlcnJlZCB0byB1c2UgdGhlIFthc3luYyB2ZXJzaW9uXShkZWNyeXB0S2V5c3RvcmVKc29uKVxuICogIGluc3RlYWQsIHdoaWNoIGFsbG93cyBhIFtbUHJvZ3Jlc3NDYWxsYmFja11dIHRvIGtlZXAgdGhlIHVzZXIgaW5mb3JtZWRcbiAqICBhcyB0byB0aGUgZGVjcnlwdGlvbiBzdGF0dXMuXG4gKlxuICogIFRoaXMgbWV0aG9kIHdpbGwgYmxvY2sgdGhlIGV2ZW50IGxvb3AgKGZyZWV6aW5nIGFsbCBVSSkgdW50aWwgZGVjcnlwdGlvblxuICogIGlzIGNvbXBsZXRlLCB3aGljaCBjYW4gdGFrZSBxdWl0ZSBzb21lIHRpbWUsIGRlcGVuZGluZyBvbiB0aGUgd2FsbGV0XG4gKiAgcGFyYW10ZXJzIGFuZCBwbGF0Zm9ybS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGRlY3J5cHRLZXlzdG9yZUpzb25TeW5jKGpzb24sIF9wYXNzd29yZCkge1xuICAgIGNvbnN0IGRhdGEgPSBKU09OLnBhcnNlKGpzb24pO1xuICAgIGNvbnN0IHBhc3N3b3JkID0gZ2V0UGFzc3dvcmQoX3Bhc3N3b3JkKTtcbiAgICBjb25zdCBwYXJhbXMgPSBnZXREZWNyeXB0S2RmUGFyYW1zKGRhdGEpO1xuICAgIGlmIChwYXJhbXMubmFtZSA9PT0gXCJwYmtkZjJcIikge1xuICAgICAgICBjb25zdCB7IHNhbHQsIGNvdW50LCBka0xlb
26774iwgYWxnb3JpdGhtIH0gPSBwYXJhbXM7XG4gICAgICAgIGNvbnN0IGtleSA9IHBia2RmMihwYXNzd29yZCwgc2FsdCwgY291bnQsIGRrTGVuLCBhbGdvcml0aG0pO1xuICAgICAgICByZXR1cm4gZ2V0QWNjb3VudChkYXRhLCBrZXkpO1xuICAgIH1cbiAgICBhc3NlcnQocGFyYW1zLm5hbWUgPT09IFwic2NyeXB0XCIsIFwiY2Fubm90IGJlIHJlYWNoZWRcIiwgXCJVTktOT1dOX0VSUk9SXCIsIHsgcGFyYW1zIH0pO1xuICAgIGNvbnN0IHsgc2FsdCwgTiwgciwgcCwgZGtMZW4gfSA9IHBhcmFtcztcbiAgICBjb25zdCBrZXkgPSBzY3J5cHRTeW5jKHBhc3N3b3JkLCBzYWx0LCBOLCByLCBwLCBka0xlbik7XG4gICAgcmV0dXJuIGdldEFjY291bnQoZGF0YSwga2V5KTtcbn1cbmZ1bmN0aW9uIHN0YWxsKGR1cmF0aW9uKSB7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7IHNldFRpbWVvdXQoKCkgPT4geyByZXNvbHZlKCk7IH0sIGR1cmF0aW9uKTsgfSk7XG59XG4vKipcbiAqICBSZXNvbHZlcyB0byB0aGUgZGVjcnlwdGVkIEpTT04gS2V5c3RvcmUgV2FsbGV0ICUlanNvbiUlIHVzaW5nIHRoZVxuICogICUlcGFzc3dvcmQlJS5cbiAqXG4gKiAgSWYgcHJvdmlkZWQsICUlcHJvZ3Jlc3MlJSB3aWxsIGJlIGNhbGxlZCBwZXJpb2RpY2FsbHkgZHVyaW5nIHRoZVxuICogIGRlY3JweXRpb24gdG8gcHJvdmlkZSBmZWVkYmFjaywgYW5kIGlmIHRoZSBmdW5jdGlvbiByZXR1cm5zXG4gKiAgYGBmYWxzZWBgIHdpbGwgaGFsdCBkZWNyeXB0aW9uLlxuICpcbiAqICBUaGUgJSVwcm9ncmVzc0NhbGxiYWNrJSUgd2lsbCAqKmFsd2F5cyoqIHJlY2VpdmUgYGAwYGAgYmVmb3JlXG4gKiAgZGVjcnlwdGlvbiBiZWdpbnMgYW5kIGBgMWBgIHdoZW4gY29tcGxldGUuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBkZWNyeXB0S2V5c3RvcmVKc29uKGpzb24sIF9wYXNzd29yZCwgcHJvZ3Jlc3MpIHtcbiAgICBjb25zdCBkYXRhID0gSlNPTi5wYXJzZShqc29uKTtcbiAgICBjb25zdCBwYXNzd29yZCA9IGdldFBhc3N3b3JkKF9wYXNzd29yZCk7XG4gICAgY29uc3QgcGFyYW1zID0gZ2V0RGVjcnlwdEtkZlBhcmFtcyhkYXRhKTtcbiAgICBpZiAocGFyYW1zLm5hbWUgPT09IFwicGJrZGYyXCIpIHtcbiAgICAgICAgaWYgKHByb2dyZXNzKSB7XG4gICAgICAgICAgICBwcm9ncmVzcygwKTtcbiAgICAgICAgICAgIGF3YWl0IHN0YWxsKDApO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHsgc2FsdCwgY291bnQsIGRrTGVuLCBhbGdvcml0aG0gfSA9IHBhcmFtcztcbiAgICAgICAgY29uc3Qga2V5ID0gcGJrZGYyKHBhc3N3b3JkLCBzYWx0LCBjb3VudCwgZGtMZW4sIGFsZ29yaXRobSk7XG4gICAgICAgIGlmIChwcm9ncmVzcykge1xuICAgICAgICAgICAgcHJvZ3Jlc3MoMSk7XG4gICAgICAgICAgICBhd2FpdCBzdGFsbCgwKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZ2V0QWNjb3VudChkYXRhLCBrZXkpO1xuICAgIH1cbiAgICBhc3NlcnQocGFyYW1zLm5hbWUgPT09IFwic2NyeXB0XCIsIFwiY2Fubm90IGJlIHJlYWNoZWRcIiwgXCJVTktOT1dOX0VSUk9SXCIsIHsgcGFyYW1zIH0pO1xuICAgIGNvbnN0IHsgc2FsdCwgTiwgciwgcCwgZGtMZW4gfSA9IHBhcmFtcztcbiAgICBjb25zdCBrZXkgPSBhd2FpdCBzY3J5cHQocGFzc3dvcmQsIHNhbHQsIE4sIHIsIHAsIGRrTGVuLCBwcm9ncmVzcyk7XG4gICAgcmV0dXJuIGdldEFjY291bnQoZGF0YSwga2V5KTtcbn1cbmZ1bmN0aW9uIGdldEVuY3J5cHRLZGZQYXJhbXMob3B0aW9ucykge1xuICAgIC8vIENoZWNrL2dlbmVyYXRlIHRoZSBzYWx0XG4gICAgY29uc3Qgc2FsdCA9IChvcHRpb25zLnNhbHQgIT0gbnVsbCkgPyBnZXRCeXRlcyhvcHRpb25zLnNhbHQsIFwib3B0aW9ucy5zYWx0XCIpIDogcmFuZG9tQnl0ZXMoMzIpO1xuICAgIC8vIE92ZXJyaWRlIHRoZSBzY3J5cHQgcGFzc3dvcmQtYmFzZWQga2V5IGRlcml2YXRpb24gZnVuY3Rpb24gcGFyYW1ldGVyc1xuICAgIGxldCBOID0gKDEgPDwgMTcpLCByID0gOCwgcCA9IDE7XG4gICAgaWYgKG9wdGlvbnMuc2NyeXB0KSB7XG4gICAgICAgIGlmIChvcHRpb25zLnNjcnlwdC5OKSB7XG4gICAgICAgICAgICBOID0gb3B0aW9ucy5zY3J5cHQuTjtcbiAgICAgICAgfVxuICAgICAgICBpZiAob3B0aW9ucy5zY3J5cHQucikge1xuICAgICAgICAgICAgciA9IG9wdGlvbnMuc2NyeXB0LnI7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG9wdGlvbnMuc2NyeXB0LnApIHtcbiAgICAgICAgICAgIHAgPSBvcHRpb25zLnNjcnlwdC5wO1xuICAgICAgICB9XG4gICAgfVxuICAgIGFzc2VydEFyZ3VtZW50KHR5cGVvZiAoTikgPT09IFwibnVtYmVyXCIgJiYgTiA+IDAgJiYgTnVtYmVyLmlzU2FmZUludGVnZXIoTikgJiYgKEJpZ0ludChOKSAmIEJpZ0ludChOIC0gMSkpID09PSBCaWdJbnQoMCksIFwiaW52YWxpZCBzY3J5cHQgTiBwYXJhbWV0ZXJcIiwgXCJvcHRpb25zLk5cIiwgTik7XG4gICAgYXNzZXJ0QXJndW1lbnQodHlwZW9mIChyKSA9PT0gXCJudW1iZXJcIiAmJiByID4gMCAmJiBOdW1iZXIuaXNTYWZlSW50ZWdlcihyKSwgXCJpbnZhbGlkIHNjcnlwdCByIHBhcmFtZXRlclwiLCBcIm9wdGlvbnMuclwiLCByKTtcbiAgICBhc3NlcnRBcmd1bWVudCh0eXBlb2YgKHApID09PSBcIm51bWJlclwiICYmIHAgPiAwICYmIE51bWJlci5pc1NhZmVJbnRlZ2VyKHApLCBcImludmFsaWQgc2NyeXB0IHAgcGFyYW1ldGVyXCIsIFwib3B0aW9ucy5wXCIsIHApO1xuICAgIHJldHVybiB7IG5hbWU6IFwic2NyeXB0XCIsIGRrTGVuOiAzMiwgc2FsdCwgTiwgciwgcCB9O1xufVxuZnVuY3Rpb24gX2VuY3J5cHRLZXlzdG9yZShrZXksIGtkZiwgYWNjb3VudCwgb3B0aW9ucykge1xuICAgIGNvbnN0IHByaXZhdGVLZXkgPSBnZXRCeXRlcyhhY2NvdW50LnByaXZhdGVLZXksIFwicHJpdmF0ZUtleVwiKTtcbiAgICAvLyBPdmVycmlkZSBpbml0aWFsaXphdGlvbiB2ZWN0b3JcbiAgICBjb25zdCBpdiA9IChvcHRpb25zLml2ICE9IG51bGwpID8gZ2V0Qnl0ZXMob3B0aW9ucy5pdiwgXCJvcHRpb25zLml2XCIpIDogcmFuZG9tQnl0ZXMoMTYpO1xuICAgIGFzc2VydEFyZ3VtZW50KGl2Lmxlbmd0aCA9PT0gMTYsIFwiaW52YWxpZCBvcHRpb25zLml2IGxlbmd0aFwiLCBcIm9wdGlvbnMuaXZcIiwgb3B0aW9ucy5pdik7XG4gICAgLy8gT3ZlcnJpZGUgdGhlIHV1aWRcbiAgICBjb25zdCB1dWlkUmFuZG9tID0gKG9wdGlvbnMudXVpZCAhPSBudWxsKSA/IGdldEJ5dGVzKG9wdGlvbnMudXVpZCwgXCJvcHRpb25zLnV1aWRcIikgOiByYW5kb21CeXRlcygxNik7XG4gICAgYXNzZXJ0QXJndW1lbnQodXVpZFJhbmRvbS5sZW5ndGggPT09IDE2LCBcImludmFsaWQgb3B0aW9ucy51dWlkIGxlbmd0aFwiLCBcIm9wdGlvbnMudXVpZFwiLCBvcHRpb25zLml2KTtcbiAgICAvLyBUaGlzIHdpbGwgYmUgdXNlZCB0byBlbmNyeXB0IHRoZSB3YWxsZXQgKGFzIHBlciBXZWIzIHNlY3JldCBzdG9yYWdlKVxuICAgIC8vIC0gMzIgYnl0ZXMgICBBcyBub3JtYWwgZm9yIHRoZSBXZWIzIHNlY3JldCBzdG9yYWdlIChkZXJpdmVkS2V5LCBtYW
26774NQcmVmaXgpXG4gICAgLy8gLSAzMiBieXRlcyAgIEFFUyBrZXkgdG8gZW5jcnlwdCBtbmVtb25pYyB3aXRoIChyZXF1aXJlZCBoZXJlIHRvIGJlIEV0aGVycyBXYWxsZXQpXG4gICAgY29uc3QgZGVyaXZlZEtleSA9IGtleS5zbGljZSgwLCAxNik7XG4gICAgY29uc3QgbWFjUHJlZml4ID0ga2V5LnNsaWNlKDE2LCAzMik7XG4gICAgLy8gRW5jcnlwdCB0aGUgcHJpdmF0ZSBrZXlcbiAgICBjb25zdCBhZXNDdHIgPSBuZXcgQ1RSKGRlcml2ZWRLZXksIGl2KTtcbiAgICBjb25zdCBjaXBoZXJ0ZXh0ID0gZ2V0Qnl0ZXMoYWVzQ3RyLmVuY3J5cHQocHJpdmF0ZUtleSkpO1xuICAgIC8vIENvbXB1dGUgdGhlIG1lc3NhZ2UgYXV0aGVudGljYXRpb24gY29kZSwgdXNlZCB0byBjaGVjayB0aGUgcGFzc3dvcmRcbiAgICBjb25zdCBtYWMgPSBrZWNjYWsyNTYoY29uY2F0KFttYWNQcmVmaXgsIGNpcGhlcnRleHRdKSk7XG4gICAgLy8gU2VlOiBodHRwczovL2dpdGh1Yi5jb20vZXRoZXJldW0vd2lraS93aWtpL1dlYjMtU2VjcmV0LVN0b3JhZ2UtRGVmaW5pdGlvblxuICAgIGNvbnN0IGRhdGEgPSB7XG4gICAgICAgIGFkZHJlc3M6IGFjY291bnQuYWRkcmVzcy5zdWJzdHJpbmcoMikudG9Mb3dlckNhc2UoKSxcbiAgICAgICAgaWQ6IHV1aWRWNCh1dWlkUmFuZG9tKSxcbiAgICAgICAgdmVyc2lvbjogMyxcbiAgICAgICAgQ3J5cHRvOiB7XG4gICAgICAgICAgICBjaXBoZXI6IFwiYWVzLTEyOC1jdHJcIixcbiAgICAgICAgICAgIGNpcGhlcnBhcmFtczoge1xuICAgICAgICAgICAgICAgIGl2OiBoZXhsaWZ5KGl2KS5zdWJzdHJpbmcoMiksXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgY2lwaGVydGV4dDogaGV4bGlmeShjaXBoZXJ0ZXh0KS5zdWJzdHJpbmcoMiksXG4gICAgICAgICAgICBrZGY6IFwic2NyeXB0XCIsXG4gICAgICAgICAgICBrZGZwYXJhbXM6IHtcbiAgICAgICAgICAgICAgICBzYWx0OiBoZXhsaWZ5KGtkZi5zYWx0KS5zdWJzdHJpbmcoMiksXG4gICAgICAgICAgICAgICAgbjoga2RmLk4sXG4gICAgICAgICAgICAgICAgZGtsZW46IDMyLFxuICAgICAgICAgICAgICAgIHA6IGtkZi5wLFxuICAgICAgICAgICAgICAgIHI6IGtkZi5yXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgbWFjOiBtYWMuc3Vic3RyaW5nKDIpXG4gICAgICAgIH1cbiAgICB9O1xuICAgIC8vIElmIHdlIGhhdmUgYSBtbmVtb25pYywgZW5jcnlwdCBpdCBpbnRvIHRoZSBKU09OIHdhbGxldFxuICAgIGlmIChhY2NvdW50Lm1uZW1vbmljKSB7XG4gICAgICAgIGNvbnN0IGNsaWVudCA9IChvcHRpb25zLmNsaWVudCAhPSBudWxsKSA/IG9wdGlvbnMuY2xpZW50IDogYGV0aGVycy8ke3ZlcnNpb259YDtcbiAgICAgICAgY29uc3QgcGF0aCA9IGFjY291bnQubW5lbW9uaWMucGF0aCB8fCBkZWZhdWx0UGF0aDtcbiAgICAgICAgY29uc3QgbG9jYWxlID0gYWNjb3VudC5tbmVtb25pYy5sb2NhbGUgfHwgXCJlblwiO1xuICAgICAgICBjb25zdCBtbmVtb25pY0tleSA9IGtleS5zbGljZSgzMiwgNjQpO1xuICAgICAgICBjb25zdCBlbnRyb3B5ID0gZ2V0Qnl0ZXMoYWNjb3VudC5tbmVtb25pYy5lbnRyb3B5LCBcImFjY291bnQubW5lbW9uaWMuZW50cm9weVwiKTtcbiAgICAgICAgY29uc3QgbW5lbW9uaWNJdiA9IHJhbmRvbUJ5dGVzKDE2KTtcbiAgICAgICAgY29uc3QgbW5lbW9uaWNBZXNDdHIgPSBuZXcgQ1RSKG1uZW1vbmljS2V5LCBtbmVtb25pY0l2KTtcbiAgICAgICAgY29uc3QgbW5lbW9uaWNDaXBoZXJ0ZXh0ID0gZ2V0Qnl0ZXMobW5lbW9uaWNBZXNDdHIuZW5jcnlwdChlbnRyb3B5KSk7XG4gICAgICAgIGNvbnN0IG5vdyA9IG5ldyBEYXRlKCk7XG4gICAgICAgIGNvbnN0IHRpbWVzdGFtcCA9IChub3cuZ2V0VVRDRnVsbFllYXIoKSArIFwiLVwiICtcbiAgICAgICAgICAgIHpwYWQobm93LmdldFVUQ01vbnRoKCkgKyAxLCAyKSArIFwiLVwiICtcbiAgICAgICAgICAgIHpwYWQobm93LmdldFVUQ0RhdGUoKSwgMikgKyBcIlRcIiArXG4gICAgICAgICAgICB6cGFkKG5vdy5nZXRVVENIb3VycygpLCAyKSArIFwiLVwiICtcbiAgICAgICAgICAgIHpwYWQobm93LmdldFVUQ01pbnV0ZXMoKSwgMikgKyBcIi1cIiArXG4gICAgICAgICAgICB6cGFkKG5vdy5nZXRVVENTZWNvbmRzKCksIDIpICsgXCIuMFpcIik7XG4gICAgICAgIGNvbnN0IGdldGhGaWxlbmFtZSA9IChcIlVUQy0tXCIgKyB0aW1lc3RhbXAgKyBcIi0tXCIgKyBkYXRhLmFkZHJlc3MpO1xuICAgICAgICBkYXRhW1wieC1ldGhlcnNcIl0gPSB7XG4gICAgICAgICAgICBjbGllbnQsIGdldGhGaWxlbmFtZSwgcGF0aCwgbG9jYWxlLFxuICAgICAgICAgICAgbW5lbW9uaWNDb3VudGVyOiBoZXhsaWZ5KG1uZW1vbmljSXYpLnN1YnN0cmluZygyKSxcbiAgICAgICAgICAgIG1uZW1vbmljQ2lwaGVydGV4dDogaGV4bGlmeShtbmVtb25pY0NpcGhlcnRleHQpLnN1YnN0cmluZygyKSxcbiAgICAgICAgICAgIHZlcnNpb246IFwiMC4xXCJcbiAgICAgICAgfTtcbiAgICB9XG4gICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KGRhdGEpO1xufVxuLyoqXG4gKiAgUmV0dXJuIHRoZSBKU09OIEtleXN0b3JlIFdhbGxldCBmb3IgJSVhY2NvdW50JSUgZW5jcnlwdGVkIHdpdGhcbiAqICAlJXBhc3N3b3JkJSUuXG4gKlxuICogIFRoZSAlJW9wdGlvbnMlJSBjYW4gYmUgdXNlZCB0byB0dW5lIHRoZSBwYXNzd29yZC1iYXNlZCBrZXlcbiAqICBkZXJpdmF0aW9uIGZ1bmN0aW9uIHBhcmFtZXRlcnMsIGV4cGxpY2l0bHkgc2V0IHRoZSByYW5kb20gdmFsdWVzXG4gKiAgdXNlZC4gQW55IHByb3ZpZGVkIFtbUHJvZ3Jlc3NDYWxsYmFja11dIGlzIGlnbm9yZC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGVuY3J5cHRLZXlzdG9yZUpzb25TeW5jKGFjY291bnQsIHBhc3N3b3JkLCBvcHRpb25zKSB7XG4gICAgaWYgKG9wdGlvbnMgPT0gbnVsbCkge1xuICAgICAgICBvcHRpb25zID0ge307XG4gICAgfVxuICAgIGNvbnN0IHBhc3N3b3JkQnl0ZXMgPSBnZXRQYXNzd29yZChwYXNzd29yZCk7XG4gICAgY29uc3Qga2RmID0gZ2V0RW5jcnlwdEtkZlBhcmFtcyhvcHRpb25zKTtcbiAgICBjb25zdCBrZXkgPSBzY3J5cHRTeW5jK
26774HBhc3N3b3JkQnl0ZXMsIGtkZi5zYWx0LCBrZGYuTiwga2RmLnIsIGtkZi5wLCA2NCk7XG4gICAgcmV0dXJuIF9lbmNyeXB0S2V5c3RvcmUoZ2V0Qnl0ZXMoa2V5KSwga2RmLCBhY2NvdW50LCBvcHRpb25zKTtcbn1cbi8qKlxuICogIFJlc29sdmVkIHRvIHRoZSBKU09OIEtleXN0b3JlIFdhbGxldCBmb3IgJSVhY2NvdW50JSUgZW5jcnlwdGVkXG4gKiAgd2l0aCAlJXBhc3N3b3JkJSUuXG4gKlxuICogIFRoZSAlJW9wdGlvbnMlJSBjYW4gYmUgdXNlZCB0byB0dW5lIHRoZSBwYXNzd29yZC1iYXNlZCBrZXlcbiAqICBkZXJpdmF0aW9uIGZ1bmN0aW9uIHBhcmFtZXRlcnMsIGV4cGxpY2l0bHkgc2V0IHRoZSByYW5kb20gdmFsdWVzXG4gKiAgdXNlZCBhbmQgcHJvdmlkZSBhIFtbUHJvZ3Jlc3NDYWxsYmFja11dIHRvIHJlY2VpdmUgcGVyaW9kaWMgdXBkYXRlc1xuICogIG9uIHRoZSBjb21wbGV0aW9uIHN0YXR1cy4uXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBlbmNyeXB0S2V5c3RvcmVKc29uKGFjY291bnQsIHBhc3N3b3JkLCBvcHRpb25zKSB7XG4gICAgaWYgKG9wdGlvbnMgPT0gbnVsbCkge1xuICAgICAgICBvcHRpb25zID0ge307XG4gICAgfVxuICAgIGNvbnN0IHBhc3N3b3JkQnl0ZXMgPSBnZXRQYXNzd29yZChwYXNzd29yZCk7XG4gICAgY29uc3Qga2RmID0gZ2V0RW5jcnlwdEtkZlBhcmFtcyhvcHRpb25zKTtcbiAgICBjb25zdCBrZXkgPSBhd2FpdCBzY3J5cHQocGFzc3dvcmRCeXRlcywga2RmLnNhbHQsIGtkZi5OLCBrZGYuciwga2RmLnAsIDY0LCBvcHRpb25zLnByb2dyZXNzQ2FsbGJhY2spO1xuICAgIHJldHVybiBfZW5jcnlwdEtleXN0b3JlKGdldEJ5dGVzKGtleSksIGtkZiwgYWNjb3VudCwgb3B0aW9ucyk7XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1qc29uLWtleXN0b3JlLmpzLm1hcCIsIi8qKlxuICogIEV4cGxhaW4gSEQgV2FsbGV0cy4uXG4gKlxuICogIEBfc3Vic2VjdGlvbjogYXBpL3dhbGxldDpIRCBXYWxsZXRzICBbaGQtd2FsbGV0c11cbiAqL1xuaW1wb3J0IHsgY29tcHV0ZUhtYWMsIHJhbmRvbUJ5dGVzLCByaXBlbWQxNjAsIFNpZ25pbmdLZXksIHNoYTI1NiB9IGZyb20gXCIuLi9jcnlwdG8vaW5kZXguanNcIjtcbmltcG9ydCB7IFZvaWRTaWduZXIgfSBmcm9tIFwiLi4vcHJvdmlkZXJzL2luZGV4LmpzXCI7XG5pbXBvcnQgeyBjb21wdXRlQWRkcmVzcyB9IGZyb20gXCIuLi90cmFuc2FjdGlvbi9pbmRleC5qc1wiO1xuaW1wb3J0IHsgY29uY2F0LCBkYXRhU2xpY2UsIGRlY29kZUJhc2U1OCwgZGVmaW5lUHJvcGVydGllcywgZW5jb2RlQmFzZTU4LCBnZXRCeXRlcywgaGV4bGlmeSwgaXNCeXRlc0xpa2UsIGdldE51bWJlciwgdG9CZUFycmF5LCB0b0JpZ0ludCwgdG9CZUhleCwgYXNzZXJ0UHJpdmF0ZSwgYXNzZXJ0LCBhc3NlcnRBcmd1bWVudCB9IGZyb20gXCIuLi91dGlscy9pbmRleC5qc1wiO1xuaW1wb3J0IHsgTGFuZ0VuIH0gZnJvbSBcIi4uL3dvcmRsaXN0cy9sYW5nLWVuLmpzXCI7XG5pbXBvcnQgeyBCYXNlV2FsbGV0IH0gZnJvbSBcIi4vYmFzZS13YWxsZXQuanNcIjtcbmltcG9ydCB7IE1uZW1vbmljIH0gZnJvbSBcIi4vbW5lbW9uaWMuanNcIjtcbmltcG9ydCB7IGVuY3J5cHRLZXlzdG9yZUpzb24sIGVuY3J5cHRLZXlzdG9yZUpzb25TeW5jLCB9IGZyb20gXCIuL2pzb24ta2V5c3RvcmUuanNcIjtcbi8qKlxuICogIFRoZSBkZWZhdWx0IGRlcml2YXRpb24gcGF0aCBmb3IgRXRoZXJldW0gSEQgTm9kZXMuIChpLmUuIGBgXCJtLzQ0Jy82MCcvMCcvMC8wXCJgYClcbiAqL1xuZXhwb3J0IGNvbnN0IGRlZmF1bHRQYXRoID0gXCJtLzQ0Jy82MCcvMCcvMC8wXCI7XG4vLyBcIkJpdGNvaW4gc2VlZFwiXG5jb25zdCBNYXN0ZXJTZWNyZXQgPSBuZXcgVWludDhBcnJheShbNjYsIDEwNSwgMTE2LCA5OSwgMTExLCAxMDUsIDExMCwgMzIsIDExNSwgMTAxLCAxMDEsIDEwMF0pO1xuY29uc3QgSGFyZGVuZWRCaXQgPSAweDgwMDAwMDAwO1xuY29uc3QgTiA9IEJpZ0ludChcIjB4ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmViYWFlZGNlNmFmNDhhMDNiYmZkMjVlOGNkMDM2NDE0MVwiKTtcbmNvbnN0IE5pYmJsZXMgPSBcIjAxMjM0NTY3ODlhYmNkZWZcIjtcbmZ1bmN0aW9uIHpwYWQodmFsdWUsIGxlbmd0aCkge1xuICAgIGxldCByZXN1bHQgPSBcIlwiO1xuICAgIHdoaWxlICh2YWx1ZSkge1xuICAgICAgICByZXN1bHQgPSBOaWJibGVzW3ZhbHVlICUgMTZdICsgcmVzdWx0O1xuICAgICAgICB2YWx1ZSA9IE1hdGgudHJ1bmModmFsdWUgLyAxNik7XG4gICAgfVxuICAgIHdoaWxlIChyZXN1bHQubGVuZ3RoIDwgbGVuZ3RoICogMikge1xuICAgICAgICByZXN1bHQgPSBcIjBcIiArIHJlc3VsdDtcbiAgICB9XG4gICAgcmV0dXJuIFwiMHhcIiArIHJlc3VsdDtcbn1cbmZ1bmN0aW9uIGVuY29kZUJhc2U1OENoZWNrKF92YWx1ZSkge1xuICAgIGNvbnN0IHZhbHVlID0gZ2V0Qnl0ZXMoX3ZhbHVlKTtcbiAgICBjb25zdCBjaGVjayA9IGRhdGFTbGljZShzaGEyNTYoc2hhMjU2KHZhbHVlKSksIDAsIDQpO1xuICAgIGNvbnN0IGJ5dGVzID0gY29uY2F0KFt2YWx1ZSwgY2hlY2tdKTtcbiAgICByZXR1cm4gZW5jb2RlQmFzZTU4KGJ5dGVzKTtcbn1cbmNvbnN0IF9ndWFyZCA9IHt9O1xuZnVuY3Rpb24gc2VyX0koaW5kZXgsIGNoYWluQ29kZSwgcHVibGljS2V5LCBwcml2YXRlS2V5KSB7XG4gICAgY29uc3QgZGF0YSA9IG5ldyBVaW50OEFycmF5KDM3KTtcbiAgICBpZiAoaW5kZXggJiBIYXJkZW5lZEJpdCkge1xuICAgICAgICBhc3NlcnQocHJpdmF0ZUtleSAhPSBudWxsLCBcImNhbm5vdCBkZXJpdmUgY2hpbGQgb2YgbmV1dGVyZWQgbm9kZVwiLCBcIlVOU1VQUE9SVEVEX09QRVJBVElPTlwiLCB7XG4gICAgICAgICAgICBvcGVyYXRpb246IFwiZGVyaXZlQ2hpbGRcIlxuICAgICAgICB9KTtcbiAgICAgICAgLy8gRGF0YSA9IDB4MDAgfHwgc2VyXzI1NihrX3BhcilcbiAgICAgICAgZGF0YS5zZXQoZ2V0Qnl0ZXMocHJpdmF0ZUtleSksIDEpO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgLy8gRGF0YSA9IHNlcl9wKHBvaW50KGtfcGFyKSlcbiAgICAgICAgZGF0YS5zZXQoZ2V0Qnl0ZXMocHVibGljS2V5KSk7XG4gICAgfVxuICAgIC8vIERhdGEgKz0gc2VyXzMyKGkpXG4gICAgZm9yIChsZXQgaSA9IDI0OyBpID49IDA7IGkgLT0gOCkge1xuICAgICAgICBkYXRhWzMzICsgKGkgPj4gMyldID0gKChpbmRleCA+PiAoMjQgLSBpKSkgJiAweGZmKTtcbiAgICB9XG4gICAgY29uc3QgSSA9IGdldEJ5dGVzKGNvbXB1dGVIbWFjKFwic2hhNTEyXCIsIGNoYWluQ29kZSwgZGF0YSkpO1xuICAgIHJldHVybi
26774B7IElMOiBJLnNsaWNlKDAsIDMyKSwgSVI6IEkuc2xpY2UoMzIpIH07XG59XG5mdW5jdGlvbiBkZXJpdmVQYXRoKG5vZGUsIHBhdGgpIHtcbiAgICBjb25zdCBjb21wb25lbnRzID0gcGF0aC5zcGxpdChcIi9cIik7XG4gICAgYXNzZXJ0QXJndW1lbnQoY29tcG9uZW50cy5sZW5ndGggPiAwLCBcImludmFsaWQgcGF0aFwiLCBcInBhdGhcIiwgcGF0aCk7XG4gICAgaWYgKGNvbXBvbmVudHNbMF0gPT09IFwibVwiKSB7XG4gICAgICAgIGFzc2VydEFyZ3VtZW50KG5vZGUuZGVwdGggPT09IDAsIGBjYW5ub3QgZGVyaXZlIHJvb3QgcGF0aCAoaS5lLiBwYXRoIHN0YXJ0aW5nIHdpdGggXCJtL1wiKSBmb3IgYSBub2RlIGF0IG5vbi16ZXJvIGRlcHRoICR7bm9kZS5kZXB0aH1gLCBcInBhdGhcIiwgcGF0aCk7XG4gICAgICAgIGNvbXBvbmVudHMuc2hpZnQoKTtcbiAgICB9XG4gICAgbGV0IHJlc3VsdCA9IG5vZGU7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjb21wb25lbnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGNvbnN0IGNvbXBvbmVudCA9IGNvbXBvbmVudHNbaV07XG4gICAgICAgIGlmIChjb21wb25lbnQubWF0Y2goL15bMC05XSsnJC8pKSB7XG4gICAgICAgICAgICBjb25zdCBpbmRleCA9IHBhcnNlSW50KGNvbXBvbmVudC5zdWJzdHJpbmcoMCwgY29tcG9uZW50Lmxlbmd0aCAtIDEpKTtcbiAgICAgICAgICAgIGFzc2VydEFyZ3VtZW50KGluZGV4IDwgSGFyZGVuZWRCaXQsIFwiaW52YWxpZCBwYXRoIGluZGV4XCIsIGBwYXRoWyR7aX1dYCwgY29tcG9uZW50KTtcbiAgICAgICAgICAgIHJlc3VsdCA9IHJlc3VsdC5kZXJpdmVDaGlsZChIYXJkZW5lZEJpdCArIGluZGV4KTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChjb21wb25lbnQubWF0Y2goL15bMC05XSskLykpIHtcbiAgICAgICAgICAgIGNvbnN0IGluZGV4ID0gcGFyc2VJbnQoY29tcG9uZW50KTtcbiAgICAgICAgICAgIGFzc2VydEFyZ3VtZW50KGluZGV4IDwgSGFyZGVuZWRCaXQsIFwiaW52YWxpZCBwYXRoIGluZGV4XCIsIGBwYXRoWyR7aX1dYCwgY29tcG9uZW50KTtcbiAgICAgICAgICAgIHJlc3VsdCA9IHJlc3VsdC5kZXJpdmVDaGlsZChpbmRleCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBhc3NlcnRBcmd1bWVudChmYWxzZSwgXCJpbnZhbGlkIHBhdGggY29tcG9uZW50XCIsIGBwYXRoWyR7aX1dYCwgY29tcG9uZW50KTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xufVxuLyoqXG4gKiAgQW4gKipIRE5vZGVXYWxsZXQqKiBpcyBhIFtbU2lnbmVyXV0gYmFja2VkIGJ5IHRoZSBwcml2YXRlIGtleSBkZXJpdmVkXG4gKiAgZnJvbSBhbiBIRCBOb2RlIHVzaW5nIHRoZSBbW2xpbmstYmlwLTMyXV0gc3RhbnRhcmQuXG4gKlxuICogIEFuIEhEIE5vZGUgZm9ybXMgYSBoaWVyYXJjaGFsIHN0cnVjdHVyZSB3aXRoIGVhY2ggSEQgTm9kZSBoYXZpbmcgYVxuICogIHByaXZhdGUga2V5IGFuZCB0aGUgYWJpbGl0eSB0byBkZXJpdmUgY2hpbGQgSEQgTm9kZXMsIGRlZmluZWQgYnlcbiAqICBhIHBhdGggaW5kaWNhdGluZyB0aGUgaW5kZXggb2YgZWFjaCBjaGlsZC5cbiAqL1xuZXhwb3J0IGNsYXNzIEhETm9kZVdhbGxldCBleHRlbmRzIEJhc2VXYWxsZXQge1xuICAgIC8qKlxuICAgICAqICBUaGUgY29tcHJlc3NlZCBwdWJsaWMga2V5LlxuICAgICAqL1xuICAgIHB1YmxpY0tleTtcbiAgICAvKipcbiAgICAgKiAgVGhlIGZpbmdlcnByaW50LlxuICAgICAqXG4gICAgICogIEEgZmluZ2VycHJpbnQgYWxsb3dzIHF1aWNrIHFheSB0byBkZXRlY3QgcGFyZW50IGFuZCBjaGlsZCBub2RlcyxcbiAgICAgKiAgYnV0IGRldmVsb3BlcnMgc2hvdWxkIGJlIHByZXBhcmVkIHRvIGRlYWwgd2l0aCBjb2xsaXNpb25zIGFzIGl0XG4gICAgICogIGlzIG9ubHkgNCBieXRlcy5cbiAgICAgKi9cbiAgICBmaW5nZXJwcmludDtcbiAgICAvKipcbiAgICAgKiAgVGhlIHBhcmVudCBmaW5nZXJwcmludC5cbiAgICAgKi9cbiAgICBwYXJlbnRGaW5nZXJwcmludDtcbiAgICAvKipcbiAgICAgKiAgVGhlIG1uZW1vbmljIHVzZWQgdG8gY3JlYXRlIHRoaXMgSEQgTm9kZSwgaWYgYXZhaWxhYmxlLlxuICAgICAqXG4gICAgICogIFNvdXJjZXMgc3VjaCBhcyBleHRlbmRlZCBrZXlzIGRvIG5vdCBlbmNvZGUgdGhlIG1uZW1vbmljLCBpblxuICAgICAqICB3aGljaCBjYXNlIHRoaXMgd2lsbCBiZSBgYG51bGxgYC5cbiAgICAgKi9cbiAgICBtbmVtb25pYztcbiAgICAvKipcbiAgICAgKiAgVGhlIGNoYWluY29kZSwgd2hpY2ggaXMgZWZmZWN0aXZlbHkgYSBwdWJsaWMga2V5IHVzZWRcbiAgICAgKiAgdG8gZGVyaXZlIGNoaWxkcmVuLlxuICAgICAqL1xuICAgIGNoYWluQ29kZTtcbiAgICAvKipcbiAgICAgKiAgVGhlIGRlcml2YXRpb24gcGF0aCBvZiB0aGlzIHdhbGxldC5cbiAgICAgKlxuICAgICAqICBTaW5jZSBleHRlbmRlZCBrZXlzIGRvIG5vdCBwcm92aWRlIGZ1bGwgcGF0aCBkZXRhaWxzLCB0aGlzXG4gICAgICogIG1heSBiZSBgYG51bGxgYCwgaWYgaW5zdGFudGlhdGVkIGZyb20gYSBzb3VyY2UgdGhhdCBkb2VzIG5vdFxuICAgICAqICBlbmNvZGUgaXQuXG4gICAgICovXG4gICAgcGF0aDtcbiAgICAvKipcbiAgICAgKiAgVGhlIGNoaWxkIGluZGV4IG9mIHRoaXMgd2FsbGV0LiBWYWx1ZXMgb3ZlciBgYDIgKlxcKiAzMWBgIGluZGljYXRlXG4gICAgICogIHRoZSBub2RlIGlzIGhhcmRlbmVkLlxuICAgICAqL1xuICAgIGluZGV4O1xuICAgIC8qKlxuICAgICAqICBUaGUgZGVwdGggb2YgdGhpcyB3YWxsZXQsIHdoaWNoIGlzIHRoZSBudW1iZXIgb2YgY29tcG9uZW50c1xuICAgICAqICBpbiBpdHMgcGF0aC5cbiAgICAgKi9cbiAgICBkZXB0aDtcbiAgICAvKipcbiAgICAgKiAgQHByaXZhdGVcbiAgICAgKi9cbiAgICBjb25zdHJ1Y3RvcihndWFyZCwgc2lnbmluZ0tleSwgcGFyZW50RmluZ2VycHJpbnQsIGNoYWluQ29kZSwgcGF0aCwgaW5kZXgsIGRlcHRoLCBtbmVtb25pYywgcHJvdmlkZXIpIHtcbiAgICAgICAgc3VwZXIoc2lnbmluZ0tleSwgcHJvdmlkZXIpO1xuICAgICAgICBhc3NlcnRQcml2YXRlKGd1YXJkLCBfZ3VhcmQsIFwiSEROb2RlV2FsbGV0XCIpO1xuICAgICAgICBkZWZpbmVQcm9wZXJ0aWVzKHRoaXMsIHsgcHVibGljS2V5OiBzaWduaW5nS2V5LmNvbXByZXNzZWRQdWJsaWNLZXkgfSk7XG4gICAgICAgIGNvbnN0IGZpbmdlcnByaW50ID0gZGF0YVNsaWNlKHJpcGVtZDE2MChzaGEyNTYodGhpcy5wdWJsaWNLZXkpKSwgMCwgNCk7XG4gICAgICAgIGRlZmluZVByb3BlcnRpZXModGhpcywge1xuICAgICAgICAgICAgcGFyZW50RmluZ2VycHJpbnQsIGZpbmdlcnByaW50LFxuICAgICAgICAgICAgY2hhaW5Db2RlLCBwYXRoLCBpbmRleCwgZGVwdGhcbiAgICAgICAgfSk7XG4gICAgICAgIGRlZmluZVByb3BlcnRpZXModGhpcywgeyBtbmVtb25pYyB9KTtcbiAgICB9XG4gICAgY29ubmVjdChwcm92aWRlcikge1xuICAgICAgICByZXR1cm4gbmV3IEhETm9kZVdhbGxldChfZ3VhcmQsIHRoaXMuc2lnbmluZ0tleSwgdGhpcy5wYXJlbnRGaW5nZXJwcmludCwgdGhpcy5jaGFpbkNvZGUsIHRoaXMucGF0aCwgdGhpcy5pbmRleCwgdGhpcy5kZXB0aCwgdGhpcy5tbmVtb25pYywgcHJvdmlkZXIpO1xuICAgIH1cbiAgICAjYWNjb3VudCgpIHtcbiAgICAgICAgY29uc3QgYWNjb3VudCA9IHsgYWRkcmVzczogdGhpcy5hZGRyZXNzLCBwcml2YXRlS2V5OiB0aGlzLnByaXZhdGVLZXkgfTtcbiAgICAgICAgY29uc3QgbSA9IHRoaXMubW5lbW9uaWM7XG4gICAgICAgIGlmICh0aGlzLnBhdGggJiYgbSAmJiBtLndvcmRsaXN0LmxvY2FsZSA9PT0gXCJlblwiICYmIG0ucGFzc3dvcmQgPT09IFwiXCIpIHtcbiAgICAgICAgICAgIGFjY291bnQubW5lbW9uaWMgPSB7XG4gICAgICAgICAgICAgICAgcGF0aDogdGhpcy5wYXRoLFxuICAgICAgICAgICAgICAgIGxvY2FsZTogXCJlblwiLFxuICAgICAgICAgICAgICAgIGVudHJvcHk6IG0uZW50cm9weVxuICAgICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYWNjb3VudDtcbiAgICB9XG4gICAgLyoqXG4gICAgICogIFJlc29sdmVzIHRvIGEgW0pTT04g
26774S2V5c3RvcmUgV2FsbGV0XShqc29uLXdhbGxldHMpIGVuY3J5cHRlZCB3aXRoXG4gICAgICogICUlcGFzc3dvcmQlJS5cbiAgICAgKlxuICAgICAqICBJZiAlJXByb2dyZXNzQ2FsbGJhY2slJSBpcyBzcGVjaWZpZWQsIGl0IHdpbGwgcmVjZWl2ZSBwZXJpb2RpY1xuICAgICAqICB1cGRhdGVzIGFzIHRoZSBlbmNyeXB0aW9uIHByb2Nlc3MgcHJvZ3Jlc2VzLlxuICAgICAqL1xuICAgIGFzeW5jIGVuY3J5cHQocGFzc3dvcmQsIHByb2dyZXNzQ2FsbGJhY2spIHtcbiAgICAgICAgcmV0dXJuIGF3YWl0IGVuY3J5cHRLZXlzdG9yZUpzb24odGhpcy4jYWNjb3VudCgpLCBwYXNzd29yZCwgeyBwcm9ncmVzc0NhbGxiYWNrIH0pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiAgUmV0dXJucyBhIFtKU09OIEtleXN0b3JlIFdhbGxldF0oanNvbi13YWxsZXRzKSBlbmNyeXBlZCB3aXRoXG4gICAgICogICUlcGFzc3dvcmQlJS5cbiAgICAgKlxuICAgICAqICBJdCBpcyBwcmVmZXJyZWQgdG8gdXNlIHRoZSBbYXN5bmMgdmVyc2lvbl0oZW5jcnlwdCkgaW5zdGVhZCxcbiAgICAgKiAgd2hpY2ggYWxsb3dzIGEgW1tQcm9ncmVzc0NhbGxiYWNrXV0gdG8ga2VlcCB0aGUgdXNlciBpbmZvcm1lZC5cbiAgICAgKlxuICAgICAqICBUaGlzIG1ldGhvZCB3aWxsIGJsb2NrIHRoZSBldmVudCBsb29wIChmcmVlemluZyBhbGwgVUkpIHVudGlsXG4gICAgICogIGl0IGlzIGNvbXBsZXRlLCB3aGljaCBtYXkgYmUgYSBub24tdHJpdmlhbCBkdXJhdGlvbi5cbiAgICAgKi9cbiAgICBlbmNyeXB0U3luYyhwYXNzd29yZCkge1xuICAgICAgICByZXR1cm4gZW5jcnlwdEtleXN0b3JlSnNvblN5bmModGhpcy4jYWNjb3VudCgpLCBwYXNzd29yZCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqICBUaGUgZXh0ZW5kZWQga2V5LlxuICAgICAqXG4gICAgICogIFRoaXMga2V5IHdpbGwgYmVnaW4gd2l0aCB0aGUgcHJlZml4IGBgeHByaXZgYCBhbmQgY2FuIGJlIHVzZWQgdG9cbiAgICAgKiAgcmVjb25zdHJ1Y3QgdGhpcyBIRCBOb2RlIHRvIGRlcml2ZSBpdHMgY2hpbGRyZW4uXG4gICAgICovXG4gICAgZ2V0IGV4dGVuZGVkS2V5KCkge1xuICAgICAgICAvLyBXZSBvbmx5IHN1cHBvcnQgdGhlIG1haW5uZXQgdmFsdWVzIGZvciBub3csIGJ1dCBpZiBhbnlvbmUgbmVlZHNcbiAgICAgICAgLy8gdGVzdG5ldCB2YWx1ZXMsIGxldCBtZSBrbm93LiBJIGJlbGlldmUgY3VycmVudCBzZW50aW1lbnQgaXMgdGhhdFxuICAgICAgICAvLyB3ZSBzaG91bGQgYWx3YXlzIHVzZSBtYWlubmV0LCBhbmQgdXNlIEJJUC00NCB0byBkZXJpdmUgdGhlIG5ldHdvcmtcbiAgICAgICAgLy8gICAtIE1haW5uZXQ6IHB1YmxpYz0weDA0ODhCMjFFLCBwcml2YXRlPTB4MDQ4OEFERTRcbiAgICAgICAgLy8gICAtIFRlc3RuZXQ6IHB1YmxpYz0weDA0MzU4N0NGLCBwcml2YXRlPTB4MDQzNTgzOTRcbiAgICAgICAgYXNzZXJ0KHRoaXMuZGVwdGggPCAyNTYsIFwiRGVwdGggdG9vIGRlZXBcIiwgXCJVTlNVUFBPUlRFRF9PUEVSQVRJT05cIiwgeyBvcGVyYXRpb246IFwiZXh0ZW5kZWRLZXlcIiB9KTtcbiAgICAgICAgcmV0dXJuIGVuY29kZUJhc2U1OENoZWNrKGNvbmNhdChbXG4gICAgICAgICAgICBcIjB4MDQ4OEFERTRcIiwgenBhZCh0aGlzLmRlcHRoLCAxKSwgdGhpcy5wYXJlbnRGaW5nZXJwcmludCxcbiAgICAgICAgICAgIHpwYWQodGhpcy5pbmRleCwgNCksIHRoaXMuY2hhaW5Db2RlLFxuICAgICAgICAgICAgY29uY2F0KFtcIjB4MDBcIiwgdGhpcy5wcml2YXRlS2V5XSlcbiAgICAgICAgXSkpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiAgUmV0dXJucyB0cnVlIGlmIHRoaXMgd2FsbGV0IGhhcyBhIHBhdGgsIHByb3ZpZGluZyBhIFR5cGUgR3VhcmRcbiAgICAgKiAgdGhhdCB0aGUgcGF0aCBpcyBub24tbnVsbC5cbiAgICAgKi9cbiAgICBoYXNQYXRoKCkgeyByZXR1cm4gKHRoaXMucGF0aCAhPSBudWxsKTsgfVxuICAgIC8qKlxuICAgICAqICBSZXR1cm5zIGEgbmV1dGVyZWQgSEQgTm9kZSwgd2hpY2ggcmVtb3ZlcyB0aGUgcHJpdmF0ZSBkZXRhaWxzXG4gICAgICogIG9mIGFuIEhEIE5vZGUuXG4gICAgICpcbiAgICAgKiAgQSBuZXV0ZXJlZCBub2RlIGhhcyBubyBwcml2YXRlIGtleSwgYnV0IGNhbiBiZSB1c2VkIHRvIGRlcml2ZVxuICAgICAqICBjaGlsZCBhZGRyZXNzZXMgYW5kIG90aGVyIHB1YmxpYyBkYXRhIGFib3V0IHRoZSBIRCBOb2RlLlxuICAgICAqL1xuICAgIG5ldXRlcigpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBIRE5vZGVWb2lkV2FsbGV0KF9ndWFyZCwgdGhpcy5hZGRyZXNzLCB0aGlzLnB1YmxpY0tleSwgdGhpcy5wYXJlbnRGaW5nZXJwcmludCwgdGhpcy5jaGFpbkNvZGUsIHRoaXMucGF0aCwgdGhpcy5pbmRleCwgdGhpcy5kZXB0aCwgdGhpcy5wcm92aWRlcik7XG4gICAgfVxuICAgIC8qKlxuICAgICAqICBSZXR1cm4gdGhlIGNoaWxkIGZvciAlJWluZGV4JSUuXG4gICAgICovXG4gICAgZGVyaXZlQ2hpbGQoX2luZGV4KSB7XG4gICAgICAgIGNvbnN0IGluZGV4ID0gZ2V0TnVtYmVyKF9pbmRleCwgXCJpbmRleFwiKTtcbiAgICAgICAgYXNzZXJ0QXJndW1lbnQoaW5kZXggPD0gMHhmZmZmZmZmZiwgXCJpbnZhbGlkIGluZGV4XCIsIFwiaW5kZXhcIiwgaW5kZXgpO1xuICAgICAgICAvLyBCYXNlIHBhdGhcbiAgICAgICAgbGV0IHBhdGggPSB0aGlzLnBhdGg7XG4gICAgICAgIGlmIChwYXRoKSB7XG4gICAgICAgICAgICBwYXRoICs9IFwiL1wiICsgKGluZGV4ICYgfkhhcmRlbmVkQml0KTtcbiAgICAgICAgICAgIGlmIChpbmRleCAmIEhhcmRlbmVkQml0KSB7XG4gICAgICAgICAgICAgICAgcGF0aCArPSBcIidcIjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBjb25zdCB7IElSLCBJTCB9ID0gc2VyX0koaW5kZXgsIHRoaXMuY2hhaW5Db2RlLCB0aGlzLnB1YmxpY0tleSwgdGhpcy5wcml2YXRlS2V5KTtcbiAgICAgICAgY29uc3Qga2kgPSBuZXcgU2lnbmluZ0tleSh0b0JlSGV4KCh0b0JpZ0ludChJTCkgKyBCaWdJbnQodGhpcy5wcml2YXRlS2V5KSkgJSBOLCAzMikpO1xuICAgICAgICByZXR1cm4gbmV3IEhETm9kZVdhbGxldChfZ3VhcmQsIGtpLCB0aGlzLmZpbmdlcnByaW50LCBoZXhsaWZ5KElSKSwgcGF0aCwgaW5kZXgsIHRoaXMuZGVwdGggKyAxLCB0aGlzLm1uZW1vbmljLCB0aGlzLnByb3ZpZGVyKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogIFJldHVybi
26774B0aGUgSEROb2RlIGZvciAlJXBhdGglJSBmcm9tIHRoaXMgbm9kZS5cbiAgICAgKi9cbiAgICBkZXJpdmVQYXRoKHBhdGgpIHtcbiAgICAgICAgcmV0dXJuIGRlcml2ZVBhdGgodGhpcywgcGF0aCk7XG4gICAgfVxuICAgIHN0YXRpYyAjZnJvbVNlZWQoX3NlZWQsIG1uZW1vbmljKSB7XG4gICAgICAgIGFzc2VydEFyZ3VtZW50KGlzQnl0ZXNMaWtlKF9zZWVkKSwgXCJpbnZhbGlkIHNlZWRcIiwgXCJzZWVkXCIsIFwiW1JFREFDVEVEXVwiKTtcbiAgICAgICAgY29uc3Qgc2VlZCA9IGdldEJ5dGVzKF9zZWVkLCBcInNlZWRcIik7XG4gICAgICAgIGFzc2VydEFyZ3VtZW50KHNlZWQubGVuZ3RoID49IDE2ICYmIHNlZWQubGVuZ3RoIDw9IDY0LCBcImludmFsaWQgc2VlZFwiLCBcInNlZWRcIiwgXCJbUkVEQUNURURdXCIpO1xuICAgICAgICBjb25zdCBJID0gZ2V0Qnl0ZXMoY29tcHV0ZUhtYWMoXCJzaGE1MTJcIiwgTWFzdGVyU2VjcmV0LCBzZWVkKSk7XG4gICAgICAgIGNvbnN0IHNpZ25pbmdLZXkgPSBuZXcgU2lnbmluZ0tleShoZXhsaWZ5KEkuc2xpY2UoMCwgMzIpKSk7XG4gICAgICAgIHJldHVybiBuZXcgSEROb2RlV2FsbGV0KF9ndWFyZCwgc2lnbmluZ0tleSwgXCIweDAwMDAwMDAwXCIsIGhleGxpZnkoSS5zbGljZSgzMikpLCBcIm1cIiwgMCwgMCwgbW5lbW9uaWMsIG51bGwpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiAgQ3JlYXRlcyBhIG5ldyBIRCBOb2RlIGZyb20gJSVleHRlbmRlZEtleSUlLlxuICAgICAqXG4gICAgICogIElmIHRoZSAlJWV4dGVuZGVkS2V5JSUgd2lsbCBlaXRoZXIgaGF2ZSBhIHByZWZpeCBvciBgYHhwdWJgYCBvclxuICAgICAqICBgYHhwcml2YGAsIHJldHVybmluZyBhIG5ldXRlcmVkIEhEIE5vZGUgKFtbSEROb2RlVm9pZFdhbGxldF1dKVxuICAgICAqICBvciBmdWxsIEhEIE5vZGUgKFtbSEROb2RlV2FsbGV0KSByZXNwZWN0aXZlbHkuXG4gICAgICovXG4gICAgc3RhdGljIGZyb21FeHRlbmRlZEtleShleHRlbmRlZEtleSkge1xuICAgICAgICBjb25zdCBieXRlcyA9IHRvQmVBcnJheShkZWNvZGVCYXNlNTgoZXh0ZW5kZWRLZXkpKTsgLy8gQFRPRE86IHJlZGFjdFxuICAgICAgICBhc3NlcnRBcmd1bWVudChieXRlcy5sZW5ndGggPT09IDgyIHx8IGVuY29kZUJhc2U1OENoZWNrKGJ5dGVzLnNsaWNlKDAsIDc4KSkgPT09IGV4dGVuZGVkS2V5LCBcImludmFsaWQgZXh0ZW5kZWQga2V5XCIsIFwiZXh0ZW5kZWRLZXlcIiwgXCJbIFJFREFDVEVEIF1cIik7XG4gICAgICAgIGNvbnN0IGRlcHRoID0gYnl0ZXNbNF07XG4gICAgICAgIGNvbnN0IHBhcmVudEZpbmdlcnByaW50ID0gaGV4bGlmeShieXRlcy5zbGljZSg1LCA5KSk7XG4gICAgICAgIGNvbnN0IGluZGV4ID0gcGFyc2VJbnQoaGV4bGlmeShieXRlcy5zbGljZSg5LCAxMykpLnN1YnN0cmluZygyKSwgMTYpO1xuICAgICAgICBjb25zdCBjaGFpbkNvZGUgPSBoZXhsaWZ5KGJ5dGVzLnNsaWNlKDEzLCA0NSkpO1xuICAgICAgICBjb25zdCBrZXkgPSBieXRlcy5zbGljZSg0NSwgNzgpO1xuICAgICAgICBzd2l0Y2ggKGhleGxpZnkoYnl0ZXMuc2xpY2UoMCwgNCkpKSB7XG4gICAgICAgICAgICAvLyBQdWJsaWMgS2V5XG4gICAgICAgICAgICBjYXNlIFwiMHgwNDg4YjIxZVwiOlxuICAgICAgICAgICAgY2FzZSBcIjB4MDQzNTg3Y2ZcIjoge1xuICAgICAgICAgICAgICAgIGNvbnN0IHB1YmxpY0tleSA9IGhleGxpZnkoa2V5KTtcbiAgICAgICAgICAgICAgICByZXR1cm4gbmV3IEhETm9kZVZvaWRXYWxsZXQoX2d1YXJkLCBjb21wdXRlQWRkcmVzcyhwdWJsaWNLZXkpLCBwdWJsaWNLZXksIHBhcmVudEZpbmdlcnByaW50LCBjaGFpbkNvZGUsIG51bGwsIGluZGV4LCBkZXB0aCwgbnVsbCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBQcml2YXRlIEtleVxuICAgICAgICAgICAgY2FzZSBcIjB4MDQ4OGFkZTRcIjpcbiAgICAgICAgICAgIGNhc2UgXCIweDA0MzU4Mzk0IFwiOlxuICAgICAgICAgICAgICAgIGlmIChrZXlbMF0gIT09IDApIHtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiBuZXcgSEROb2RlV2FsbGV0KF9ndWFyZCwgbmV3IFNpZ25pbmdLZXkoa2V5LnNsaWNlKDEpKSwgcGFyZW50RmluZ2VycHJpbnQsIGNoYWluQ29kZSwgbnVsbCwgaW5kZXgsIGRlcHRoLCBudWxsLCBudWxsKTtcbiAgICAgICAgfVxuICAgICAgICBhc3NlcnRBcmd1bWVudChmYWxzZSwgXCJpbnZhbGlkIGV4dGVuZGVkIGtleSBwcmVmaXhcIiwgXCJleHRlbmRlZEtleVwiLCBcIlsgUkVEQUNURUQgXVwiKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogIENyZWF0ZXMgYSBuZXcgcmFuZG9tIEhETm9kZS5cbiAgICAgKi9cbiAgICBzdGF0aWMgY3JlYXRlUmFuZG9tKHBhc3N3b3JkLCBwYXRoLCB3b3JkbGlzdCkge1xuICAgICAgICBpZiAocGFzc3dvcmQgPT0gbnVsbCkge1xuICAgICAgICAgICAgcGFzc3dvcmQgPSBcIlwiO1xuICAgICAgICB9XG4gICAgICAgIGlmIChwYXRoID09IG51bGwpIHtcbiAgICAgICAgICAgIHBhdGggPSBkZWZhdWx0UGF0aDtcbiAgICAgICAgfVxuICAgICAgICBpZiAod29yZGxpc3QgPT0gbnVsbCkge1xuICAgICAgICAgICAgd29yZGxpc3QgPSBMYW5nRW4ud29yZGxpc3QoKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBtbmVtb25pYyA9IE1uZW1vbmljLmZyb21FbnRyb3B5KHJhbmRvbUJ5dGVzKDE2KSwgcGFzc3dvcmQsIHdvcmRsaXN0KTtcbiAgICAgICAgcmV0dXJuIEhETm9kZVdhbGxldC4jZnJvbVNlZWQobW5lbW9uaWMuY29tcHV0ZVNlZWQoKSwgbW5lbW9uaWMpLmRlcml2ZVBhdGgocGF0aCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqICBDcmVhdGUgYW4gSEQgTm9kZSBmcm9tICUlbW5lbW9uaWMlJS5cbiAgICAgKi9cbiAgICBzdGF0aWMgZnJvbU1uZW1vbmljKG1uZW1vbmljLCBwYXRoKSB7XG4gICAgICAgIGlmICghcGF0aCkge1xuICAgICAgICAgICAgcGF0aCA9IGRlZmF1bHRQYXRoO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBIRE5vZGVXYWxsZXQuI2Zyb21TZWVkKG1uZW1vbmljLmNvbXB1dGVTZWVkKCksIG1uZW1vbmljKS5kZXJpdmVQYXRoKHBhdGgpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiAgQ3JlYXRlcyBhbiBIRCBOb2RlIGZyb20gYSBtbmVtb25pYyAlJXBocmFzZSUlLlxuICAgICAqL1xuICAgIHN0YXRpYyBmcm9tUGhyYXNlKHBocmFzZSwgcGFzc3dvcmQsIHBhdGgsIHdvcmRsaXN0KSB7XG4gICAgICAgIGlmIChwYXNzd29yZCA9PSBudWxsKSB7XG4gICAgICAgICAgICBwYXNzd29yZCA9IFwiXCI7XG4gICAgICAgI
26774H1cbiAgICAgICAgaWYgKHBhdGggPT0gbnVsbCkge1xuICAgICAgICAgICAgcGF0aCA9IGRlZmF1bHRQYXRoO1xuICAgICAgICB9XG4gICAgICAgIGlmICh3b3JkbGlzdCA9PSBudWxsKSB7XG4gICAgICAgICAgICB3b3JkbGlzdCA9IExhbmdFbi53b3JkbGlzdCgpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IG1uZW1vbmljID0gTW5lbW9uaWMuZnJvbVBocmFzZShwaHJhc2UsIHBhc3N3b3JkLCB3b3JkbGlzdCk7XG4gICAgICAgIHJldHVybiBIRE5vZGVXYWxsZXQuI2Zyb21TZWVkKG1uZW1vbmljLmNvbXB1dGVTZWVkKCksIG1uZW1vbmljKS5kZXJpdmVQYXRoKHBhdGgpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiAgQ3JlYXRlcyBhbiBIRCBOb2RlIGZyb20gYSAlJXNlZWQlJS5cbiAgICAgKi9cbiAgICBzdGF0aWMgZnJvbVNlZWQoc2VlZCkge1xuICAgICAgICByZXR1cm4gSEROb2RlV2FsbGV0LiNmcm9tU2VlZChzZWVkLCBudWxsKTtcbiAgICB9XG59XG4vKipcbiAqICBBICoqSEROb2RlVm9pZFdhbGxldCoqIGNhbm5vdCBzaWduLCBidXQgcHJvdmlkZXMgYWNjZXNzIHRvXG4gKiAgdGhlIGNoaWxkcmVuIG5vZGVzIG9mIGEgW1tsaW5rLWJpcC0zMl1dIEhEIHdhbGxldCBhZGRyZXNzZXMuXG4gKlxuICogIFRoZSBjYW4gYmUgY3JlYXRlZCBieSB1c2luZyBhbiBleHRlbmRlZCBgYHhwdWJgYCBrZXkgdG9cbiAqICBbW0hETm9kZVdhbGxldF9mcm9tRXh0ZW5kZWRLZXldXSBvciBieVxuICogIFtudWV0ZXJpbmddKEhETm9kZVdhbGxldC1uZXV0ZXIpIGEgW1tIRE5vZGVXYWxsZXRdXS5cbiAqL1xuZXhwb3J0IGNsYXNzIEhETm9kZVZvaWRXYWxsZXQgZXh0ZW5kcyBWb2lkU2lnbmVyIHtcbiAgICAvKipcbiAgICAgKiAgVGhlIGNvbXByZXNzZWQgcHVibGljIGtleS5cbiAgICAgKi9cbiAgICBwdWJsaWNLZXk7XG4gICAgLyoqXG4gICAgICogIFRoZSBmaW5nZXJwcmludC5cbiAgICAgKlxuICAgICAqICBBIGZpbmdlcnByaW50IGFsbG93cyBxdWljayBxYXkgdG8gZGV0ZWN0IHBhcmVudCBhbmQgY2hpbGQgbm9kZXMsXG4gICAgICogIGJ1dCBkZXZlbG9wZXJzIHNob3VsZCBiZSBwcmVwYXJlZCB0byBkZWFsIHdpdGggY29sbGlzaW9ucyBhcyBpdFxuICAgICAqICBpcyBvbmx5IDQgYnl0ZXMuXG4gICAgICovXG4gICAgZmluZ2VycHJpbnQ7XG4gICAgLyoqXG4gICAgICogIFRoZSBwYXJlbnQgbm9kZSBmaW5nZXJwcmludC5cbiAgICAgKi9cbiAgICBwYXJlbnRGaW5nZXJwcmludDtcbiAgICAvKipcbiAgICAgKiAgVGhlIGNoYWluY29kZSwgd2hpY2ggaXMgZWZmZWN0aXZlbHkgYSBwdWJsaWMga2V5IHVzZWRcbiAgICAgKiAgdG8gZGVyaXZlIGNoaWxkcmVuLlxuICAgICAqL1xuICAgIGNoYWluQ29kZTtcbiAgICAvKipcbiAgICAgKiAgVGhlIGRlcml2YXRpb24gcGF0aCBvZiB0aGlzIHdhbGxldC5cbiAgICAgKlxuICAgICAqICBTaW5jZSBleHRlbmRlZCBrZXlzIGRvIG5vdCBwcm92aWRlciBmdWxsIHBhdGggZGV0YWlscywgdGhpc1xuICAgICAqICBtYXkgYmUgYGBudWxsYGAsIGlmIGluc3RhbnRpYXRlZCBmcm9tIGEgc291cmNlIHRoYXQgZG9lcyBub3RcbiAgICAgKiAgZW5vY2RlIGl0LlxuICAgICAqL1xuICAgIHBhdGg7XG4gICAgLyoqXG4gICAgICogIFRoZSBjaGlsZCBpbmRleCBvZiB0aGlzIHdhbGxldC4gVmFsdWVzIG92ZXIgYGAyICpcXCogMzFgYCBpbmRpY2F0ZVxuICAgICAqICB0aGUgbm9kZSBpcyBoYXJkZW5lZC5cbiAgICAgKi9cbiAgICBpbmRleDtcbiAgICAvKipcbiAgICAgKiAgVGhlIGRlcHRoIG9mIHRoaXMgd2FsbGV0LCB3aGljaCBpcyB0aGUgbnVtYmVyIG9mIGNvbXBvbmVudHNcbiAgICAgKiAgaW4gaXRzIHBhdGguXG4gICAgICovXG4gICAgZGVwdGg7XG4gICAgLyoqXG4gICAgICogIEBwcml2YXRlXG4gICAgICovXG4gICAgY29uc3RydWN0b3IoZ3VhcmQsIGFkZHJlc3MsIHB1YmxpY0tleSwgcGFyZW50RmluZ2VycHJpbnQsIGNoYWluQ29kZSwgcGF0aCwgaW5kZXgsIGRlcHRoLCBwcm92aWRlcikge1xuICAgICAgICBzdXBlcihhZGRyZXNzLCBwcm92aWRlcik7XG4gICAgICAgIGFzc2VydFByaXZhdGUoZ3VhcmQsIF9ndWFyZCwgXCJIRE5vZGVWb2lkV2FsbGV0XCIpO1xuICAgICAgICBkZWZpbmVQcm9wZXJ0aWVzKHRoaXMsIHsgcHVibGljS2V5IH0pO1xuICAgICAgICBjb25zdCBmaW5nZXJwcmludCA9IGRhdGFTbGljZShyaXBlbWQxNjAoc2hhMjU2KHB1YmxpY0tleSkpLCAwLCA0KTtcbiAgICAgICAgZGVmaW5lUHJvcGVydGllcyh0aGlzLCB7XG4gICAgICAgICAgICBwdWJsaWNLZXksIGZpbmdlcnByaW50LCBwYXJlbnRGaW5nZXJwcmludCwgY2hhaW5Db2RlLCBwYXRoLCBpbmRleCwgZGVwdGhcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIGNvbm5lY3QocHJvdmlkZXIpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBIRE5vZGVWb2lkV2FsbGV0KF9ndWFyZCwgdGhpcy5hZGRyZXNzLCB0aGlzLnB1YmxpY0tleSwgdGhpcy5wYXJlbnRGaW5nZXJwcmludCwgdGhpcy5jaGFpbkNvZGUsIHRoaXMucGF0aCwgdGhpcy5pbmRleCwgdGhpcy5kZXB0aCwgcHJvdmlkZXIpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiAgVGhlIGV4dGVuZGVkIGtleS5cbiAgICAgKlxuICAgICAqICBUaGlzIGtleSB3aWxsIGJlZ2luIHdpdGggdGhlIHByZWZpeCBgYHhwdWJgYCBhbmQgY2FuIGJlIHVzZWQgdG9cbiAgICAgKiAgcmVjb25zdHJ1Y3QgdGhpcyBuZXV0ZXJlZCBrZXkgdG8gZGVyaXZlIGl0cyBjaGlsZHJlbiBhZGRyZXNzZXMuXG4gICAgICovXG4gICAgZ2V0IGV4dGVuZGVkS2V5KCkge1xuICAgICAgICAvLyBXZSBvbmx5IHN1cHBvcnQgdGhlIG1haW5uZXQgdmFsdWVzIGZvciBub3csIGJ1dCBpZiBhbnlvbmUgbmVlZHNcbiAgICAgICAgLy8gdGVzdG5ldCB2YWx1ZXMsIGxldCBtZSBrbm93LiBJIGJlbGlldmUgY3VycmVudCBzZW50aW1lbnQgaXMgdGhhdFxuICAgICAgICAvLyB3ZSBzaG91bGQgYWx3YXlzIHVzZSBtYWlubmV0LCBhbmQgdXNlIEJJUC00NCB0byBkZXJpdmUgdGhlIG5ldHdvcmtcbiAgICAgICAgLy8gICAtIE1haW5uZXQ6IHB1YmxpYz0weDA0ODhCMjFFLCBwcml2YXRlPTB4MDQ4OEFERTRcbiAgICAgICAgLy8gICAtIFRlc3RuZXQ6IHB1YmxpYz0weDA0MzU4N0NGLCBwcml2YXRlPTB4MDQzNTgzOTRcbiAgICAgICAgYXNzZXJ0KHRoaXMuZGVwdGggPCAyNTYsIFwiRGVwdGggdG9vIGRlZXBcIiwgXCJVTlNVUFBPUlRFRF9PUEVSQVRJT05cIiwgeyBvcGVyYXRpb246IFwiZXh0ZW5kZWRLZXlcIiB9KTtcbiAgICAgICAgcmV0dXJuIGVuY29kZUJhc2U1OENoZWNrKGNvbmNhdChbXG4gICAgICAgICAgICBcIjB4MDQ4OEIyMUVcIixcbiAgICAgICAgICAgI
26774HpwYWQodGhpcy5kZXB0aCwgMSksXG4gICAgICAgICAgICB0aGlzLnBhcmVudEZpbmdlcnByaW50LFxuICAgICAgICAgICAgenBhZCh0aGlzLmluZGV4LCA0KSxcbiAgICAgICAgICAgIHRoaXMuY2hhaW5Db2RlLFxuICAgICAgICAgICAgdGhpcy5wdWJsaWNLZXksXG4gICAgICAgIF0pKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogIFJldHVybnMgdHJ1ZSBpZiB0aGlzIHdhbGxldCBoYXMgYSBwYXRoLCBwcm92aWRpbmcgYSBUeXBlIEd1YXJkXG4gICAgICogIHRoYXQgdGhlIHBhdGggaXMgbm9uLW51bGwuXG4gICAgICovXG4gICAgaGFzUGF0aCgpIHsgcmV0dXJuICh0aGlzLnBhdGggIT0gbnVsbCk7IH1cbiAgICAvKipcbiAgICAgKiAgUmV0dXJuIHRoZSBjaGlsZCBmb3IgJSVpbmRleCUlLlxuICAgICAqL1xuICAgIGRlcml2ZUNoaWxkKF9pbmRleCkge1xuICAgICAgICBjb25zdCBpbmRleCA9IGdldE51bWJlcihfaW5kZXgsIFwiaW5kZXhcIik7XG4gICAgICAgIGFzc2VydEFyZ3VtZW50KGluZGV4IDw9IDB4ZmZmZmZmZmYsIFwiaW52YWxpZCBpbmRleFwiLCBcImluZGV4XCIsIGluZGV4KTtcbiAgICAgICAgLy8gQmFzZSBwYXRoXG4gICAgICAgIGxldCBwYXRoID0gdGhpcy5wYXRoO1xuICAgICAgICBpZiAocGF0aCkge1xuICAgICAgICAgICAgcGF0aCArPSBcIi9cIiArIChpbmRleCAmIH5IYXJkZW5lZEJpdCk7XG4gICAgICAgICAgICBpZiAoaW5kZXggJiBIYXJkZW5lZEJpdCkge1xuICAgICAgICAgICAgICAgIHBhdGggKz0gXCInXCI7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgeyBJUiwgSUwgfSA9IHNlcl9JKGluZGV4LCB0aGlzLmNoYWluQ29kZSwgdGhpcy5wdWJsaWNLZXksIG51bGwpO1xuICAgICAgICBjb25zdCBLaSA9IFNpZ25pbmdLZXkuYWRkUG9pbnRzKElMLCB0aGlzLnB1YmxpY0tleSwgdHJ1ZSk7XG4gICAgICAgIGNvbnN0IGFkZHJlc3MgPSBjb21wdXRlQWRkcmVzcyhLaSk7XG4gICAgICAgIHJldHVybiBuZXcgSEROb2RlVm9pZFdhbGxldChfZ3VhcmQsIGFkZHJlc3MsIEtpLCB0aGlzLmZpbmdlcnByaW50LCBoZXhsaWZ5KElSKSwgcGF0aCwgaW5kZXgsIHRoaXMuZGVwdGggKyAxLCB0aGlzLnByb3ZpZGVyKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogIFJldHVybiB0aGUgc2lnbmVyIGZvciAlJXBhdGglJSBmcm9tIHRoaXMgbm9kZS5cbiAgICAgKi9cbiAgICBkZXJpdmVQYXRoKHBhdGgpIHtcbiAgICAgICAgcmV0dXJuIGRlcml2ZVBhdGgodGhpcywgcGF0aCk7XG4gICAgfVxufVxuLypcbmV4cG9ydCBjbGFzcyBIRE5vZGVXYWxsZXRNYW5hZ2VyIHtcbiAgICAjcm9vdDogSEROb2RlV2FsbGV0O1xuXG4gICAgY29uc3RydWN0b3IocGhyYXNlOiBzdHJpbmcsIHBhc3N3b3JkPzogbnVsbCB8IHN0cmluZywgcGF0aD86IG51bGwgfCBzdHJpbmcsIGxvY2FsZT86IG51bGwgfCBXb3JkbGlzdCkge1xuICAgICAgICBpZiAocGFzc3dvcmQgPT0gbnVsbCkgeyBwYXNzd29yZCA9IFwiXCI7IH1cbiAgICAgICAgaWYgKHBhdGggPT0gbnVsbCkgeyBwYXRoID0gXCJtLzQ0Jy82MCcvMCcvMFwiOyB9XG4gICAgICAgIGlmIChsb2NhbGUgPT0gbnVsbCkgeyBsb2NhbGUgPSBMYW5nRW4ud29yZGxpc3QoKTsgfVxuICAgICAgICB0aGlzLiNyb290ID0gSEROb2RlV2FsbGV0LmZyb21QaHJhc2UocGhyYXNlLCBwYXNzd29yZCwgcGF0aCwgbG9jYWxlKTtcbiAgICB9XG5cbiAgICBnZXRTaWduZXIoaW5kZXg/OiBudW1iZXIpOiBIRE5vZGVXYWxsZXQge1xuICAgICAgICByZXR1cm4gdGhpcy4jcm9vdC5kZXJpdmVDaGlsZCgoaW5kZXggPT0gbnVsbCkgPyAwOiBpbmRleCk7XG4gICAgfVxufVxuKi9cbi8qKlxuICogIFJldHVybnMgdGhlIFtbbGluay1iaXAtMzJdXSBwYXRoIGZvciB0aGUgYWNjb3VudCBhdCAlJWluZGV4JSUuXG4gKlxuICogIFRoaXMgaXMgdGhlIHBhdHRlcm4gdXNlZCBieSB3YWxsZXRzIGxpa2UgTGVkZ2VyLlxuICpcbiAqICBUaGVyZSBpcyBhbHNvIGFuIFthbHRlcm5hdGUgcGF0dGVybl0oZ2V0SW5kZXhlZEFjY291bnRQYXRoKSB1c2VkIGJ5XG4gKiAgc29tZSBzb2Z0d2FyZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldEFjY291bnRQYXRoKF9pbmRleCkge1xuICAgIGNvbnN0IGluZGV4ID0gZ2V0TnVtYmVyKF9pbmRleCwgXCJpbmRleFwiKTtcbiAgICBhc3NlcnRBcmd1bWVudChpbmRleCA+PSAwICYmIGluZGV4IDwgSGFyZGVuZWRCaXQsIFwiaW52YWxpZCBhY2NvdW50IGluZGV4XCIsIFwiaW5kZXhcIiwgaW5kZXgpO1xuICAgIHJldHVybiBgbS80NCcvNjAnLyR7aW5kZXh9Jy8wLzBgO1xufVxuLyoqXG4gKiAgUmV0dXJucyB0aGUgcGF0aCB1c2luZyBhbiBhbHRlcm5hdGl2ZSBwYXR0ZXJuIGZvciBkZXJpdmluZyBhY2NvdW50cyxcbiAqICBhdCAlJWluZGV4JSUuXG4gKlxuICogIFRoaXMgZGVyaXZhdGlvbiBwYXRoIHVzZXMgdGhlIC8vaW5kZXgvLyBjb21wb25lbnQgcmF0aGVyIHRoYW4gdGhlXG4gKiAgLy9hY2NvdW50Ly8gY29tcG9uZW50IHRvIGRlcml2ZSBzZXF1ZW50aWFsIGFjY291bnRzLlxuICpcbiAqICBUaGlzIGlzIHRoZSBwYXR0ZXJuIHVzZWQgYnkgd2FsbGV0cyBsaWtlIE1ldGFNYXNrLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0SW5kZXhlZEFjY291bnRQYXRoKF9pbmRleCkge1xuICAgIGNvbnN0IGluZGV4ID0gZ2V0TnVtYmVyKF9pbmRleCwgXCJpbmRleFwiKTtcbiAgICBhc3NlcnRBcmd1bWVudChpbmRleCA+PSAwICYmIGluZGV4IDwgSGFyZGVuZWRCaXQsIFwiaW52YWxpZCBhY2NvdW50IGluZGV4XCIsIFwiaW5kZXhcIiwgaW5kZXgpO1xuICAgIHJldHVybiBgbS80NCcvNjAnLzAnLzAvJHtpbmRleH1gO1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9aGR3YWxsZXQuanMubWFwIiwiLyoqXG4gKiAgQF9zdWJzZWN0aW9uOiBhcGkvd2FsbGV0OkpTT04gV2FsbGV0cyAgW2pzb24td2FsbGV0c11cbiAqL1xuaW1wb3J0IHsgQ0JDLCBwa2NzN1N0cmlwIH0gZnJvbSBcImFlcy1qc1wiO1xuaW1wb3J0IHsgZ2V0QWRkcmVzcyB9IGZyb20gXCIuLi9hZGRyZXNzL2luZGV4LmpzXCI7XG5pbXBvcnQgeyBwYmtkZjIgfSBmcm9tIFwiLi4vY3J5cHRvL2luZGV4LmpzXCI7XG5pbXBvcnQgeyBpZCB9IGZyb20gXCIuLi9oYXNoL2luZGV4LmpzXCI7XG5pbXBvcnQgeyBnZXRCeXRlcywgYXNzZXJ0QXJndW1lbnQgfSBmcm9tIFwiLi4vdXRpbHMvaW5kZXguanNcIjtcbmltcG9ydCB7
26774IGdldFBhc3N3b3JkLCBsb29zZUFycmF5aWZ5LCBzcGVsdW5rIH0gZnJvbSBcIi4vdXRpbHMuanNcIjtcbi8qKlxuICogIFJldHVybnMgdHJ1ZSBpZiAlJWpzb24lJSBpcyBhIHZhbGlkIEpTT04gQ3Jvd2RzYWxlIHdhbGxldC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzQ3Jvd2RzYWxlSnNvbihqc29uKSB7XG4gICAgdHJ5IHtcbiAgICAgICAgY29uc3QgZGF0YSA9IEpTT04ucGFyc2UoanNvbik7XG4gICAgICAgIGlmIChkYXRhLmVuY3NlZWQpIHtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgfVxuICAgIGNhdGNoIChlcnJvcikgeyB9XG4gICAgcmV0dXJuIGZhbHNlO1xufVxuLy8gU2VlOiBodHRwczovL2dpdGh1Yi5jb20vZXRoZXJldW0vcHlldGhzYWxldG9vbFxuLyoqXG4gKiAgQmVmb3JlIEV0aGVyZXVtIGxhdW5jaGVkLCBpdCB3YXMgbmVjZXNzYXJ5IHRvIGNyZWF0ZSBhIHdhbGxldFxuICogIGZvcm1hdCBmb3IgYmFja2VycyB0byB1c2UsIHdoaWNoIHdvdWxkIGJlIHVzZWQgdG8gcmVjZWl2ZSBldGhlclxuICogIGFzIGEgcmV3YXJkIGZvciBjb250cmlidXRpbmcgdG8gdGhlIHByb2plY3QuXG4gKlxuICogIFRoZSBbW2xpbmstY3Jvd2RzYWxlXV0gZm9ybWF0IGlzIG5vdyBvYnNvbGV0ZSwgYnV0IGl0IGlzIHN0aWxsXG4gKiAgdXNlZnVsIHRvIHN1cHBvcnQgYW5kIHRoZSBhZGRpdGlvbmFsIGNvZGUgaXMgZmFpcmx5IHRyaXZpYWwgYXNcbiAqICBhbGwgdGhlIHByaW1pdGl2ZXMgcmVxdWlyZWQgYXJlIHVzZWQgdGhyb3VnaCBjb3JlIHBvcnRpb25zIG9mXG4gKiAgdGhlIGxpYnJhcnkuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBkZWNyeXB0Q3Jvd2RzYWxlSnNvbihqc29uLCBfcGFzc3dvcmQpIHtcbiAgICBjb25zdCBkYXRhID0gSlNPTi5wYXJzZShqc29uKTtcbiAgICBjb25zdCBwYXNzd29yZCA9IGdldFBhc3N3b3JkKF9wYXNzd29yZCk7XG4gICAgLy8gRXRoZXJldW0gQWRkcmVzc1xuICAgIGNvbnN0IGFkZHJlc3MgPSBnZXRBZGRyZXNzKHNwZWx1bmsoZGF0YSwgXCJldGhhZGRyOnN0cmluZyFcIikpO1xuICAgIC8vIEVuY3J5cHRlZCBTZWVkXG4gICAgY29uc3QgZW5jc2VlZCA9IGxvb3NlQXJyYXlpZnkoc3BlbHVuayhkYXRhLCBcImVuY3NlZWQ6c3RyaW5nIVwiKSk7XG4gICAgYXNzZXJ0QXJndW1lbnQoZW5jc2VlZCAmJiAoZW5jc2VlZC5sZW5ndGggJSAxNikgPT09IDAsIFwiaW52YWxpZCBlbmNzZWVkXCIsIFwianNvblwiLCBqc29uKTtcbiAgICBjb25zdCBrZXkgPSBnZXRCeXRlcyhwYmtkZjIocGFzc3dvcmQsIHBhc3N3b3JkLCAyMDAwLCAzMiwgXCJzaGEyNTZcIikpLnNsaWNlKDAsIDE2KTtcbiAgICBjb25zdCBpdiA9IGVuY3NlZWQuc2xpY2UoMCwgMTYpO1xuICAgIGNvbnN0IGVuY3J5cHRlZFNlZWQgPSBlbmNzZWVkLnNsaWNlKDE2KTtcbiAgICAvLyBEZWNyeXB0IHRoZSBzZWVkXG4gICAgY29uc3QgYWVzQ2JjID0gbmV3IENCQyhrZXksIGl2KTtcbiAgICBjb25zdCBzZWVkID0gcGtjczdTdHJpcChnZXRCeXRlcyhhZXNDYmMuZGVjcnlwdChlbmNyeXB0ZWRTZWVkKSkpO1xuICAgIC8vIFRoaXMgd2FsbGV0IGZvcm1hdCBpcyB3ZWlyZC4uLiBDb252ZXJ0IHRoZSBiaW5hcnkgZW5jb2RlZCBoZXggdG8gYSBzdHJpbmcuXG4gICAgbGV0IHNlZWRIZXggPSBcIlwiO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgc2VlZC5sZW5ndGg7IGkrKykge1xuICAgICAgICBzZWVkSGV4ICs9IFN0cmluZy5mcm9tQ2hhckNvZGUoc2VlZFtpXSk7XG4gICAgfVxuICAgIHJldHVybiB7IGFkZHJlc3MsIHByaXZhdGVLZXk6IGlkKHNlZWRIZXgpIH07XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1qc29uLWNyb3dkc2FsZS5qcy5tYXAiLCJpbXBvcnQgeyBTaWduaW5nS2V5IH0gZnJvbSBcIi4uL2NyeXB0by9pbmRleC5qc1wiO1xuaW1wb3J0IHsgYXNzZXJ0QXJndW1lbnQgfSBmcm9tIFwiLi4vdXRpbHMvaW5kZXguanNcIjtcbmltcG9ydCB7IEJhc2VXYWxsZXQgfSBmcm9tIFwiLi9iYXNlLXdhbGxldC5qc1wiO1xuaW1wb3J0IHsgSEROb2RlV2FsbGV0IH0gZnJvbSBcIi4vaGR3YWxsZXQuanNcIjtcbmltcG9ydCB7IGRlY3J5cHRDcm93ZHNhbGVKc29uLCBpc0Nyb3dkc2FsZUpzb24gfSBmcm9tIFwiLi9qc29uLWNyb3dkc2FsZS5qc1wiO1xuaW1wb3J0IHsgZGVjcnlwdEtleXN0b3JlSnNvbiwgZGVjcnlwdEtleXN0b3JlSnNvblN5bmMsIGVuY3J5cHRLZXlzdG9yZUpzb24sIGVuY3J5cHRLZXlzdG9yZUpzb25TeW5jLCBpc0tleXN0b3JlSnNvbiB9IGZyb20gXCIuL2pzb24ta2V5c3RvcmUuanNcIjtcbmltcG9ydCB7IE1uZW1vbmljIH0gZnJvbSBcIi4vbW5lbW9uaWMuanNcIjtcbmZ1bmN0aW9uIHN0YWxsKGR1cmF0aW9uKSB7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7IHNldFRpbWVvdXQoKCkgPT4geyByZXNvbHZlKCk7IH0sIGR1cmF0aW9uKTsgfSk7XG59XG4vKipcbiAqICBBICoqV2FsbGV0KiogbWFuYWdlcyBhIHNpbmdsZSBwcml2YXRlIGtleSB3aGljaCBpcyB1c2VkIHRvIHNpZ25cbiAqICB0cmFuc2FjdGlvbnMsIG1lc3NhZ2VzIGFuZCBvdGhlciBjb21tb24gcGF5bG9hZHMuXG4gKlxuICogIFRoaXMgY2xhc3MgaXMgZ2VuZXJhbGx5IHRoZSBtYWluIGVudHJ5IHBvaW50IGZvciBkZXZlbG9wZXJzXG4gKiAgdGhhdCB3aXNoIHRvIHVzZSBhIHByaXZhdGUga2V5IGRpcmVjdGx5LCBhcyBpdCBjYW4gY3JlYXRlXG4gKiAgaW5zdGFuY2VzIGZyb20gYSBsYXJnZSB2YXJpZXR5IG9mIGNvbW1vbiBzb3VyY2VzLCBpbmNsdWRpbmdcbiAqICByYXcgcHJpdmF0ZSBrZXksIFtbbGluay1iaXAtMzldXSBtbmVtb25pY3MgYW5kIGVuY3J5cHRlIEpTT05cbiAqICB3YWxsZXRzLlxuICovXG5leHBvcnQgY2xhc3MgV2FsbGV0IGV4dGVuZHMgQmFzZVdhbGxldCB7XG4gICAgLyoqXG4gICAgICogIENyZWF0ZSBhIG5ldyB3YWxsZXQgZm9yIHRoZSBwcml2YXRlICUla2V5JSUsIG9wdGlvbmFsbHkgY29ubmVjdGVkXG4gICAgICogIHRvICUlcHJvdmlkZXIlJS5cbiAgICAgKi9cbiAgICBjb25zdHJ1Y3RvcihrZXksIHByb3ZpZGVyKSB7XG4gICAgICAgIGlmICh0eXBlb2YgKGtleSkgPT09IFwic3RyaW5nXCIgJiYgIWtleS5zdGFydHNXaXRoKFwiMHhcIikpIHtcbiAgICAgICAgICAgIGtleSA9IFwiMHhcIiArIGtleTtcbiAgICAgICAgfVxuICAgICAgICBsZXQgc2lnbmluZ0tleSA9ICh0eXBlb2YgKGtleSkgPT09IFwic3RyaW5nXCIpID8gbmV3IFNpZ25pbmdLZXkoa2V5KSA6IGtleTtcbiAgICAgICAgc3VwZXIoc2lnbmluZ0tleSwgcHJvdmlkZXIpO1xuICAgIH1cbiAgICBjb25uZWN0KHByb3ZpZGVyKSB7XG4gICAgICAgI
26774HJldHVybiBuZXcgV2FsbGV0KHRoaXMuc2lnbmluZ0tleSwgcHJvdmlkZXIpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiAgUmVzb2x2ZXMgdG8gYSBbSlNPTiBLZXlzdG9yZSBXYWxsZXRdKGpzb24td2FsbGV0cykgZW5jcnlwdGVkIHdpdGhcbiAgICAgKiAgJSVwYXNzd29yZCUlLlxuICAgICAqXG4gICAgICogIElmICUlcHJvZ3Jlc3NDYWxsYmFjayUlIGlzIHNwZWNpZmllZCwgaXQgd2lsbCByZWNlaXZlIHBlcmlvZGljXG4gICAgICogIHVwZGF0ZXMgYXMgdGhlIGVuY3J5cHRpb24gcHJvY2VzcyBwcm9ncmVzZXMuXG4gICAgICovXG4gICAgYXN5bmMgZW5jcnlwdChwYXNzd29yZCwgcHJvZ3Jlc3NDYWxsYmFjaykge1xuICAgICAgICBjb25zdCBhY2NvdW50ID0geyBhZGRyZXNzOiB0aGlzLmFkZHJlc3MsIHByaXZhdGVLZXk6IHRoaXMucHJpdmF0ZUtleSB9O1xuICAgICAgICByZXR1cm4gYXdhaXQgZW5jcnlwdEtleXN0b3JlSnNvbihhY2NvdW50LCBwYXNzd29yZCwgeyBwcm9ncmVzc0NhbGxiYWNrIH0pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiAgUmV0dXJucyBhIFtKU09OIEtleXN0b3JlIFdhbGxldF0oanNvbi13YWxsZXRzKSBlbmNyeXBlZCB3aXRoXG4gICAgICogICUlcGFzc3dvcmQlJS5cbiAgICAgKlxuICAgICAqICBJdCBpcyBwcmVmZXJyZWQgdG8gdXNlIHRoZSBbYXN5bmMgdmVyc2lvbl0oZW5jcnlwdCkgaW5zdGVhZCxcbiAgICAgKiAgd2hpY2ggYWxsb3dzIGEgW1tQcm9ncmVzc0NhbGxiYWNrXV0gdG8ga2VlcCB0aGUgdXNlciBpbmZvcm1lZC5cbiAgICAgKlxuICAgICAqICBUaGlzIG1ldGhvZCB3aWxsIGJsb2NrIHRoZSBldmVudCBsb29wIChmcmVlemluZyBhbGwgVUkpIHVudGlsXG4gICAgICogIGl0IGlzIGNvbXBsZXRlLCB3aGljaCBtYXkgYmUgYSBub24tdHJpdmlhbCBkdXJhdGlvbi5cbiAgICAgKi9cbiAgICBlbmNyeXB0U3luYyhwYXNzd29yZCkge1xuICAgICAgICBjb25zdCBhY2NvdW50ID0geyBhZGRyZXNzOiB0aGlzLmFkZHJlc3MsIHByaXZhdGVLZXk6IHRoaXMucHJpdmF0ZUtleSB9O1xuICAgICAgICByZXR1cm4gZW5jcnlwdEtleXN0b3JlSnNvblN5bmMoYWNjb3VudCwgcGFzc3dvcmQpO1xuICAgIH1cbiAgICBzdGF0aWMgI2Zyb21BY2NvdW50KGFjY291bnQpIHtcbiAgICAgICAgYXNzZXJ0QXJndW1lbnQoYWNjb3VudCwgXCJpbnZhbGlkIEpTT04gd2FsbGV0XCIsIFwianNvblwiLCBcIlsgUkVEQUNURUQgXVwiKTtcbiAgICAgICAgaWYgKFwibW5lbW9uaWNcIiBpbiBhY2NvdW50ICYmIGFjY291bnQubW5lbW9uaWMgJiYgYWNjb3VudC5tbmVtb25pYy5sb2NhbGUgPT09IFwiZW5cIikge1xuICAgICAgICAgICAgY29uc3QgbW5lbW9uaWMgPSBNbmVtb25pYy5mcm9tRW50cm9weShhY2NvdW50Lm1uZW1vbmljLmVudHJvcHkpO1xuICAgICAgICAgICAgY29uc3Qgd2FsbGV0ID0gSEROb2RlV2FsbGV0LmZyb21NbmVtb25pYyhtbm
26774Vtb25pYywgYWNjb3VudC5tbmVtb25pYy5wYXRoKTtcbiAgICAgICAgICAgIGlmICh3YWxsZXQuYWRkcmVzcyA9PT0gYWNjb3VudC5hZGRyZXNzICYmIHdhbGxldC5wcml2YXRlS2V5ID09PSBhY2NvdW50LnByaXZhdGVLZXkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gd2FsbGV0O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc29sZS5sb2coXCJXQVJOSU5HOiBKU09OIG1pc21hdGNoIGFkZHJlc3MvcHJpdmF0ZUtleSAhPSBtbmVtb25pYzsgZmFsbGJhY2sgb250byBwcml2YXRlIGtleVwiKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCB3YWxsZXQgPSBuZXcgV2FsbGV0KGFjY291bnQucHJpdmF0ZUtleSk7XG4gICAgICAgIGFzc2VydEFyZ3VtZW50KHdhbGxldC5hZGRyZXNzID09PSBhY2NvdW50LmFkZHJlc3MsIFwiYWRkcmVzcy9wcml2YXRlS2V5IG1pc21hdGNoXCIsIFwianNvblwiLCBcIlsgUkVEQUNURUQgXVwiKTtcbiAgICAgICAgcmV0dXJuIHdhbGxldDtcbiAgICB9XG4gICAgLyoqXG4gICAgICogIENyZWF0ZXMgKGFzeW5jaHJvbm91c2x5KSBhICoqV2FsbGV0KiogYnkgZGVjcnlwdGluZyB0aGUgJSVqc29uJSVcbiAgICAgKiAgd2l0aCAlJXBhc3N3b3JkJSUuXG4gICAgICpcbiAgICAgKiAgSWYgJSVwcm9ncmVzcyUlIGlzIHByb3ZpZGVkLCBpdCBpcyBjYWxsZWQgcGVyaW9kaWNhbGx5IGR1cmluZ1xuICAgICAqICBkZWNyeXB0aW9uIHNvIHRoYXQgYW55IFVJIGNhbiBiZSB1cGRhdGVkLlxuICAgICAqL1xuICAgIHN0YXRpYyBhc3luYyBmcm9tRW5jcnlwdGVkSnNvbihqc29uLCBwYXNzd29yZCwgcHJvZ3Jlc3MpIHtcbiAgICAgICAgbGV0IGFjY291bnQgPSBudWxsO1xuICAgICAgICBpZiAoaXNLZXlzdG9yZUpzb24oanNvbikpIHtcbiAgICAgICAgICAgIGFjY291bnQgPSBhd2FpdCBkZWNyeXB0S2V5c3RvcmVKc29uKGpzb24sIHBhc3N3b3JkLCBwcm9ncmVzcyk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoaXNDcm93ZHNhbGVKc29uKGpzb24pKSB7XG4gICAgICAgICAgICBpZiAocHJvZ3Jlc3MpIHtcbiAgICAgICAgICAgICAgICBwcm9ncmVzcygwKTtcbiAgICAgICAgICAgICAgICBhd2FpdCBzdGFsbCgwKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGFjY291bnQgPSBkZWNyeXB0Q3Jvd2RzYWxlSnNvbihqc29uLCBwYXNzd29yZCk7XG4gICAgICAgICAgICBpZiAocHJvZ3Jlc3MpIHtcbiAgICAgICAgICAgICAgICBwcm9ncmVzcygxKTtcbiAgICAgICAgICAgICAgICBhd2FpdCBzdGFsbCgwKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gV2FsbGV0LiNmcm9tQWNjb3VudChhY2NvdW50KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogIENyZWF0ZXMgYSAqKldhbGxldCoqIGJ5IGRlY3J5cHRpbmcgdGhlICUlanNvbiUlIHdpdGggJSVwYXNzd29yZCUlLlxuICAgICAqXG4gICAgICogIFRoZSBbW2Zyb21FbmNyeXB0ZWRKc29uXV0gbWV0aG9kIGlzIHByZWZlcnJlZCwgYXMgdGhpcyBtZXRob2RcbiAgICAgKiAgd2lsbCBsb2NrIHVwIGFuZCBmcmVlemUgdGhlIFVJIGR1cmluZyBkZWNyeXB0aW9uLCB3aGljaCBtYXkgdGFrZVxuICAgICAqICBzb21lIHRpbWUuXG4gICAgICovXG4gICAgc3RhdGljIGZyb21FbmNyeXB0ZWRKc29uU3luYyhqc29uLCBwYXNzd29yZCkge1xuICAgICAgICBsZXQgYWNjb3VudCA9IG51bGw7XG4gICAgICAgIGlmIChpc0tleXN0b3JlSnNvbihqc29uKSkge1xuICAgICAgICAgICAgYWNjb3VudCA9IGRlY3J5cHRLZXlzdG9yZUpzb25TeW5jKGpzb24sIHBhc3N3b3JkKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChpc0Nyb3dkc2FsZUpzb24oanNvbikpIHtcbiAgICAgICAgICAgIGFjY291bnQgPSBkZWNyeXB0Q3Jvd2RzYWxlSnNvbihqc29uLCBwYXNzd29yZCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBhc3NlcnRBcmd1bWVudChmYWxzZSwgXCJpbnZhbGlkIEpTT04gd2FsbGV0XCIsIFwianNvblwiLCBcIlsgUkVEQUNURUQgXVwiKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gV2FsbGV0LiNmcm9tQWNjb3VudChhY2NvdW50KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogIENyZWF0ZXMgYSBuZXcgcmFuZG9tIFtbSEROb2RlV2FsbGV0XV0gdXNpbmcgdGhlIGF2YWlsYWJsZVxuICAgICAqICBbY3J5cHRvZ3JhcGh
26774pYyByYW5kb20gc291cmNlXShyYW5kb21CeXRlcykuXG4gICAgICpcbiAgICAgKiAgSWYgdGhlcmUgaXMgbm8gY3J5dG9ncmFwaGljIHJhbmRvbSBzb3VyY2UsIHRoaXMgd2lsbCB0aHJvdy5cbiAgICAgKi9cbiAgICBzdGF0aWMgY3JlYXRlUmFuZG9tKHByb3ZpZGVyKSB7XG4gICAgICAgIGNvbnN0IHdhbGxldCA9IEhETm9kZVdhbGxldC5jcmVhdGVSYW5kb20oKTtcbiAgICAgICAgaWYgKHByb3ZpZGVyKSB7XG4gICAgICAgICAgICByZXR1cm4gd2FsbGV0LmNvbm5lY3QocHJvdmlkZXIpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB3YWxsZXQ7XG4gICAgfVxuICAgIC8qKlxuICAgICAqICBDcmVhdGVzIGEgW1tIRE5vZGVXYWxsZXRdXSBmb3IgJSVwaHJhc2UlJS5cbiAgICAgKi9cbiAgICBzdGF0aWMgZnJvbVBocmFzZShwaHJhc2UsIHByb3ZpZGVyKSB7XG4gICAgICAgIGNvbnN0IHdhbGxldCA9IEhETm9kZVdhbGxldC5mcm9tUGhyYXNlKHBocmFzZSk7XG4gICAgICAgIGlmIChwcm92aWRlcikge1xuICAgICAgICAgICAgcmV0dXJuIHdhbGxldC5jb25uZWN0KHByb3ZpZGVyKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gd2FsbGV0O1xuICAgIH1cbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXdhbGxldC5qcy5tYXAiLCJjb25zdCBCYXNlNjQgPSBcIikhQCMkJV4mKihBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6LV9cIjtcbi8qKlxuICogIEBfaWdub3JlXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBkZWNvZGVCaXRzKHdpZHRoLCBkYXRhKSB7XG4gICAgY29uc3QgbWF4VmFsdWUgPSAoMSA8PCB3aWR0aCkgLSAxO1xuICAgIGNvbnN0IHJlc3VsdCA9IFtdO1xuICAgIGxldCBhY2N1bSA9IDAsIGJpdHMgPSAwLCBmbG9vZCA9IDA7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBkYXRhLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIC8vIEFjY3VtdWxhdGUgNiBiaXRzIG9mIGRhdGFcbiAgICAgICAgYWNjdW0gPSAoKGFjY3VtIDw8IDYpIHwgQmFzZTY0LmluZGV4T2YoZGF0YVtpXSkpO1xuICAgICAgICBiaXRzICs9IDY7XG4gICAgICAgIC8vIFdoaWxlIHdlIGhhdmUgZW5vdWdoIGZvciBhIHdvcmQuLi5cbiAgICAgICAgd2hpbGUgKGJpdHMgPj0gd2lkdGgpIHtcbiAgICAgICAgICAgIC8vIC4uLnJlYWQgdGhlIHdvcmRcbiAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gKGFjY3VtID4+IChiaXRzIC0gd2lkdGgpKTtcbiAgICAgICAgICAgIGFjY3VtICY9ICgxIDw8IChiaXRzIC0gd2lkdGgpKSAtIDE7XG4gICAgICAgICAgICBiaXRzIC09IHdpZHRoO1xuICAgICAgICAgICAgLy8gQSB2YWx1ZSBvZiAwIGluZGljYXRlcyB3ZSBleGNlZWRlZCBtYXhWYWx1ZSwgaXRcbiAgICAgICAgICAgIC8vIGZsb29kcyBvdmVyIGludG8gdGhlIG5leHQgdmFsdWVcbiAgICAgICAgICAgIGlmICh2YWx1ZSA9PT0gMCkge1xuICAgICAgICAgICAgICAgIGZsb29kICs9IG1heFZhbHVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgcmVzdWx0LnB1c2godmFsdWUgKyBmbG9vZCk7XG4gICAgICAgICAgICAgICAgZmxvb2QgPSAwO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1iaXQtcmVhZGVyLmpzLm1hcCIsImltcG9ydCB7IGFzc2VydEFyZ3VtZW50IH0gZnJvbSBcIi4uL3V0aWxzL2luZGV4LmpzXCI7XG5pbXBvcnQgeyBkZWNvZGVCaXRzIH0gZnJvbSBcIi4vYml0LXJlYWRlci5qc1wiO1xuaW1wb3J0IHsgZGVjb2RlT3dsIH0gZnJvbSBcIi4vZGVjb2RlLW93bC5qc1wiO1xuLyoqXG4gKiAgQF9pZ25vcmVcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGRlY29kZU93bEEoZGF0YSwgYWNjZW50cykge1xuICAgIGxldCB3b3JkcyA9IGRlY29kZU93bChkYXRhKS5qb2luKFwiLFwiKTtcbiAgICAvLyBJbmplY3QgdGhlIGFjY2VudHNcbiAgICBhY2NlbnRzLnNwbGl0KC8sL2cpLmZvckVhY2goKGFjY2VudCkgPT4ge1xuICAgICAgICBjb25zdCBtYXRjaCA9IGFjY2VudC5tYXRjaCgvXihbYS16XSopKFswLTldKykoWzAtOV0pKC4qKSQvKTtcbiAgICAgICAgYXNzZXJ0QXJndW1lbnQobWF0Y2ggIT09IG51bGwsIFwiaW50ZXJuYWwgZXJyb3IgcGFyc2luZyBhY2NlbnRzXCIsIFwiYWNjZW50c1wiLCBhY2NlbnRzKTtcbiAgICAgICAgbGV0IHBvc09mZnNldCA9IDA7XG4gICAgICAgIGNvbnN0IHBvc2l0aW9ucyA9IGRlY29kZUJpdHMocGFyc2VJbnQobWF0Y2hbM10pLCBtYXRjaFs0XSk7XG4gICAgICAgIGNvbnN0IGNoYXJDb2RlID0gcGFyc2VJbnQobWF0Y2hbMl0pO1xuICAgICAgICBjb25zdCByZWdleCA9IG5ldyBSZWdFeHAoYChbJHttYXRjaFsxXX1dKWAsIFwiZ1wiKTtcbiAgICAgICAgd29yZHMgPSB3b3Jkcy5yZXBsYWNlKHJlZ2V4LCAoYWxsLCBsZXR0ZXIpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHJlbSA9IC0tcG9zaXRpb25zW3Bvc09mZnNldF07XG4gICAgICAgICAgICBpZiAocmVtID09PSAwKSB7XG4gICAgICAgICAgICAgICAgbGV0dGVyID0gU3RyaW5nLmZyb21DaGFyQ29kZShsZXR0ZXIuY2hhckNvZGVBdCgwKSwgY2hhckNvZGUpO1xuICAgICAgICAgICAgICAgIHBvc09mZnNldCsrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGxldHRlcjtcbiAgICAgICAgfSk7XG4gICAgfSk7XG4gICAgcmV0dXJuIHdvcmRzLnNwbGl0KFwiLFwiKTtcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWRlY29kZS1vd2xhLmpzLm1hcCIsImltcG9ydCB7IFdvcmRsaXN0T3dsIH0gZnJvbSBcIi4vd29yZGxpc3Qtb3dsLmpzXCI7XG5pbXBvcnQgeyBkZWNvZGVPd2xBIH0gZnJvbSBcIi4vZGVjb2RlLW93bGEuanNcIjtcbi8qKlxuICogIEFuIE9XTC1BIGZvcm1hdCBXb3JkbGlzdCBleHRlbmRzIHRoZSBPV0wgZm9ybWF0IHRvIGFkZCBhblxuICogIG92ZXJsYXkgb250byBhbiBPV0wgZm9ybWF0IFdvcmRsaXN0IHRvIHN1cHBvcnQgZGlhY3JpdGljXG4gKiAgbWFya3MuXG4gKlxuICogIFRoaXMgY2xhc3MgaXMgZ2VuZXJhbGx5IG5vdCB1c2VmdWwgdG8gbW9zdCBkZXZlbG9wZXJzIGFzXG4gKiAgaXQgaXMgdXNlZCBtYWlubHkgaW50ZXJuYWxseSB0byBrZWVwIFdvcmRsaXN0cyBmb3IgbGFuZ3VhZ2VzXG4gKiAgYmFzZWQgb24gbGF0aW4tMSBzbWFsbC5cbiAqXG4gKiAgSWYgbmVjZXNzYXJ5LCB0aGVyZSBhcmUgdG9vbHMgd2l0aGluIHRoZSBgYGdlbmVyYXRpb24vYGAgZm9sZGVyXG4gKiAgdG8gY3JlYXRlIHRoZSBuZWNlc3NhcnkgZGF0YS5cbiAqL1xuZXhwb3J0IGNsYXNzIFdvcmRsaXN0T3dsQSBleHRlbmRzIFdvcmRsaXN0T3dsIHtcbiAgICAjYWNjZW50O1xuICAgIC8qKlxuICAgICAqICBDcmVhdGVzIGEgbmV3IFdvcmRsaXN0IGZvciAlJWxvY2FsZSUlIHVzaW5nIHRoZSBPV0xBICUlZGF0YSUlXG4gICAgICogIGFuZCAlJWFjY2VudCUlIGRhdGEgYW5kIHZhbGlkYXRlZCBhZ2FpbnN0IHRoZSAlJWNoZWNrc3VtJSUuXG4gICAgICovXG4gICAgY29uc3RydWN0b3IobG9jYWxlLCBkYXRhLCBhY2NlbnQsIGNoZWNrc3VtKSB7XG4gICAgICAgI
26774HN1cGVyKGxvY2FsZSwgZGF0YSwgY2hlY2tzdW0pO1xuICAgICAgICB0aGlzLiNhY2NlbnQgPSBhY2NlbnQ7XG4gICAgfVxuICAgIC8qKlxuICAgICAqICBUaGUgT1dMQS1lbmNvZGVkIGFjY2VudCBkYXRhLlxuICAgICAqL1xuICAgIGdldCBfYWNjZW50KCkgeyByZXR1cm4gdGhpcy4jYWNjZW50OyB9XG4gICAgLyoqXG4gICAgICogIERlY29kZSBhbGwgdGhlIHdvcmRzIGZvciB0aGUgd29yZGxpc3QuXG4gICAgICovXG4gICAgX2RlY29kZVdvcmRzKCkge1xuICAgICAgICByZXR1cm4gZGVjb2RlT3dsQSh0aGlzLl9kYXRhLCB0aGlzLl9hY2NlbnQpO1xuICAgIH1cbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXdvcmRsaXN0LW93bGEuanMubWFwIiwiaW1wb3J0IHsgTGFuZ0VuIH0gZnJvbSBcIi4vbGFuZy1lbi5qc1wiO1xuZXhwb3J0IGNvbnN0IHdvcmRsaXN0cyA9IHtcbiAgICBlbjogTGFuZ0VuLndvcmRsaXN0KCksXG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9d29yZGxpc3RzLWJyb3dzZXIuanMubWFwIiwiLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cbi8vXG5leHBvcnQgeyB2ZXJzaW9uIH0gZnJvbSBcIi4vX3ZlcnNpb24uanNcIjtcbmV4cG9ydCB7IGRlY29kZUJ5dGVzMzJTdHJpbmcsIGVuY29kZUJ5dGVzMzJTdHJpbmcsIEFiaUNvZGVyLCBDb25zdHJ1Y3RvckZyYWdtZW50LCBFcnJvckZyYWdtZW50LCBFdmVudEZyYWdtZW50LCBGcmFnbWVudCwgRmFsbGJhY2tGcmFnbWVudCwgRnVuY3Rpb25GcmFnbWVudCwgTmFtZWRGcmFnbWVudCwgUGFyYW1UeXBlLCBTdHJ1Y3RGcmFnbWVudCwgY2hlY2tSZXN1bHRFcnJvcnMsIEVycm9yRGVzY3JpcHRpb24sIEluZGV4ZWQsIEludGVyZmFjZSwgTG9nRGVzY3JpcHRpb24sIFJlc3VsdCwgVHJhbnNhY3Rpb25EZXNjcmlwdGlvbiwgVHlwZWQsIH0gZnJvbSBcIi4vYWJpL2luZGV4LmpzXCI7XG5leHBvcnQgeyBnZXRBZGRyZXNzLCBnZXRJY2FwQWRkcmVzcywgZ2V0Q3JlYXRlQWRkcmVzcywgZ2V0Q3JlYXRlMkFkZHJlc3MsIGlzQWRkcmVzc2FibGUsIGlzQWRkcmVzcywgcmVzb2x2ZUFkZHJlc3MgfSBmcm9tIFwiLi9hZGRyZXNzL2luZGV4LmpzXCI7XG5leHBvcnQgeyBaZXJvQWRkcmVzcywgV2VpUGVyRXRoZXIsIE1heFVpbnQyNTYsIE1pbkludDI1NiwgTWF4SW50MjU2LCBOLCBaZXJvSGFzaCwgRXRoZXJTeW1ib2wsIE1lc3NhZ2VQcmVmaXggfSBmcm9tIFwiLi9jb25zdGFudHMvaW5kZXguanNcIjtcbmV4cG9ydCB7IEJhc2VDb250cmFjdCwgQ29udHJhY3QsIENvbnRyYWN0RmFjdG9yeSwgQ29udHJhY3RFdmVudFBheWxvYWQsIENvbnRyYWN0VHJhbnNhY3Rpb25SZWNlaXB0LCBDb250cmFjdFRyYW5zYWN0aW9uUmVzcG9uc2UsIENvbnRyYWN0VW5rbm93bkV2ZW50UGF5bG9hZCwgRXZlbnRMb2csIFVuZGVjb2RlZEV2ZW50TG9nIH0gZnJvbSBcIi4vY29udHJhY3QvaW5kZXguanNcIjtcbmV4cG9ydCB7IGNvbXB1dGVIbWFjLCByYW5kb21CeXRlcywga2VjY2FrMjU2LCByaXBlbWQxNjAsIHNoYTI1Niwgc2hhNTEyLCBwYmtkZjIsIHNjcnlwdCwgc2NyeXB0U3luYywgbG9jaywgU2lnbmF0dXJlLCBTaWduaW5nS2V5IH0gZnJvbSBcIi4vY3J5cHRvL2luZGV4LmpzXCI7XG5leHBvcnQgeyBpZCwgZW5zTm9ybWFsaXplLCBpc1ZhbGlkTmFtZSwgbmFtZWhhc2gsIGRuc0VuY29kZSwgaGFzaEF1dGhvcml6YXRpb24sIHZlcmlmeUF1dGhvcml6YXRpb24sIGhhc2hNZXNzYWdlLCB2ZXJpZnlNZXNzYWdlLCBzb2xpZGl0eVBhY2tlZCwgc29saWRpdHlQYWNrZWRLZWNjYWsyNTYsIHNvbGlkaXR5UGFja2VkU2hhMjU2LCBUeXBlZERhdGFFbmNvZGVyLCB2ZXJpZnlUeXBlZERhdGEgfSBmcm9tIFwiLi9oYXNoL2luZGV4LmpzXCI7XG5leHBvcnQgeyBnZXREZWZhdWx0UHJvdmlkZXIsIEJsb2NrLCBGZWVEYXRhLCBMb2csIFRyYW5zYWN0aW9uUmVjZWlwdCwgVHJhbnNhY3Rpb25SZXNwb25zZSwgQWJzdHJhY3RTaWduZXIsIE5vbmNlTWFuYWdlciwgVm9pZFNpZ25lciwgQWJzdHJhY3RQcm92aWRlciwgRmFsbGJhY2tQcm92aWRlciwgSnNvblJwY0FwaVByb3ZpZGVyLCBKc29uUnBjUHJvdmlkZXIsIEpzb25ScGNTaWduZXIsIEJyb3dzZXJQcm92aWRlciwgQWxjaGVteVByb3ZpZGVyLCBBbmtyUHJvdmlkZXIsIEJsb2Nrc2NvdXRQcm92aWRlciwgQ2hhaW5zdGFja1Byb3ZpZGVyLCBDbG91ZGZsYXJlUHJvdmlkZXIsIEV0aGVyc2NhblByb3ZpZGVyLCBJbmZ1cmFQcm92aWRlciwgSW5mdXJhV2ViU29ja2V0UHJvdmlkZXIsIFBvY2tldFByb3ZpZGVyLCBRdWlja05vZGVQcm92aWRlciwgSXBjU29ja2V0UHJvdmlkZXIsIFNvY2tldFByb3ZpZGVyLCBXZWJTb2NrZXRQcm92aWRlciwgRW5zUmVzb2x2ZXIsIE5ldHdvcmssIEVuc1BsdWdpbiwgRXRoZXJzY2FuUGx1Z2luLCBGZWVEYXRhTmV0d29ya1BsdWdpbiwgRmV0Y2hVcmxGZWVEYXRhTmV0d29ya1BsdWdpbiwgR2FzQ29zdFBsdWdpbiwgTmV0d29ya1BsdWdpbiwgTXVsdGljb2luUHJvdmlkZXJQbHVnaW4sIFNvY2tldEJsb2NrU3Vic2NyaWJlciwgU29ja2V0RXZlbnRTdWJzY3JpYmVyLCBTb2NrZXRQZW5kaW5nU3Vic2NyaWJlciwgU29ja2V0U3Vic2NyaWJlciwgVW5tYW5hZ2VkU3Vic2NyaWJlciwgY29weVJlcXVlc3QsIHNob3dUaHJvdHRsZU1lc3NhZ2UgfSBmcm9tIFwiLi9wcm92aWRlcnMvaW5kZXguanNcIjtcbmV4cG9ydCB7IGFjY2Vzc0xpc3RpZnksIGF1dGhvcml6YXRpb25pZnksIGNvbXB1dGVBZGRyZXNzLCByZWNvdmVyQWRkcmVzcywgVHJhbnNhY3Rpb24gfSBmcm9tIFwiLi90cmFuc2FjdGlvbi9pbmRleC5qc1wiO1xuZXhwb3J0IHsgZGVjb2RlQmFzZTU4LCBlbmNvZGVCYXNlNTgsIGRlY29kZUJhc2U2NCwgZW5jb2RlQmFzZTY0LCBjb25jYXQsIGRhdGFMZW5ndGgsIGRhdGFTbGljZSwgZ2V0Qnl0ZXMsIGdldEJ5dGVzQ29weSwgaGV4bGlmeSwgaXNIZXhTdHJpbmcsIGlzQnl0ZXNMaWtlLCBzdHJpcFplcm9zTGVmdCwgemVyb1BhZEJ5dGVzLCB6ZXJvUGFkVmFsdWUsIGRlZmluZVByb3BlcnRpZXMsIHJlc29sdmVQcm9wZXJ0aWVzLCBhc3NlcnQsIGFzc2VydEFyZ3VtZW50LCBhc3NlcnRBcmd1bWVudENvdW50LCBhc3NlcnROb3JtYWxpemUsIGFzc2VydFByaXZhdGUsIG1ha2VFcnJvciwgaXNDYWxsRXhjZXB0aW9uLCBpc0Vycm9yLCBFdmVudFBheWxvYWQsIEZldGNoUmVxdWVzdCwgRmV0Y2hSZXNwb25zZSwgRmV0Y2hDYW5jZWxTaWduYWwsIEZpeGVkTnVtYmVyLCBnZXRCaWdJbnQsIGdldE51bWJlciwgZ2V0VWludCwgdG9CZUFycmF5LCB0b0JpZ0ludCwgdG9CZUhleCwgdG9OdW1iZXIsIHRvUXVhbnRpdHksIGZyb21Ud29zLCB0b1R3b3MsIG1hc2ssIGZvcm1hdEV0aGVyLCBwYXJzZUV0aGVyLCBmb3JtYXRVbml0cywgcGFyc2VVbml0cywgdG9VdGY4Qnl0ZXMsIHRvVXRmOENvZGVQb2ludHMsIHRvVXRmOFN0cmluZywgVXRmOEVycm9yRnVuY3MsIGRlY29kZVJscCwgZW5jb2RlUmxwLCB1dWlkVjQsIH0gZnJvbSBcIi4vdXRpbHMvaW5kZXguanNcIjtcbmV4cG9ydCB7
26774IE1uZW1vbmljLCBCYXNlV2FsbGV0LCBIRE5vZGVXYWxsZXQsIEhETm9kZVZvaWRXYWxsZXQsIFdhbGxldCwgZGVmYXVsdFBhdGgsIGdldEFjY291bnRQYXRoLCBnZXRJbmRleGVkQWNjb3VudFBhdGgsIGlzQ3Jvd2RzYWxlSnNvbiwgaXNLZXlzdG9yZUpzb24sIGRlY3J5cHRDcm93ZHNhbGVKc29uLCBkZWNyeXB0S2V5c3RvcmVKc29uU3luYywgZGVjcnlwdEtleXN0b3JlSnNvbiwgZW5jcnlwdEtleXN0b3JlSnNvbiwgZW5jcnlwdEtleXN0b3JlSnNvblN5bmMsIH0gZnJvbSBcIi4vd2FsbGV0L2luZGV4LmpzXCI7XG5leHBvcnQgeyBXb3JkbGlzdCwgTGFuZ0VuLCBXb3JkbGlzdE93bCwgV29yZGxpc3RPd2xBLCB3b3JkbGlzdHMgfSBmcm9tIFwiLi93b3JkbGlzdHMvaW5kZXguanNcIjtcbi8vIGR1bW15IGNoYW5nZTsgdG8gcGljay11cCB3cyBzZWN1cml0eSBpc3N1ZSBjaGFuZ2VzXG4vLyMgc291cmNlTWFwcGluZ1VSTD1ldGhlcnMuanMubWFwIiwiLyoqXG4gKiAgVGhlIEFwcGxpY2F0aW9uIFByb2dyYW1taW5nIEludGVyZmFjZSAoQVBJKSBpcyB0aGUgY29sbGVjdGlvbiBvZlxuICogIGZ1bmN0aW9ucywgY2xhc3NlcyBhbmQgdHlwZXMgb2ZmZXJlZCBieSB0aGUgRXRoZXJzIGxpYnJhcnkuXG4gKlxuICogIEBfc2VjdGlvbjogYXBpOkFwcGxpY2F0aW9uIFByb2dyYW1taW5nIEludGVyZmFjZSAgW2Fib3V0LWFwaV1cbiAqICBAX25hdlRpdGxlOiBBUElcbiAqL1xuaW1wb3J0ICogYXMgZXRoZXJzIGZyb20gXCIuL2V0aGVycy5qc1wiO1xuZXhwb3J0IHsgZXRoZXJzIH07XG5leHBvcnQgKiBmcm9tIFwiLi9ldGhlcnMuanNcIjtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWluZGV4LmpzLm1hcCJdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFJQSxJQUFhLFVBQVU7Ozs7Ozs7O0FDQ3ZCLFN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BQUs7R0FDVixLQUFLLEtBQUs7R0FDVixNQUFNLE1BQU0sSUFBSSxNQUFNLEtBQUssU0FBUyxJQUFJO0dBQ3hDLEtBQUssSUFBSSxNQUFNLEtBQUssS0FBSyxTQUFTLElBQUk7R0FDdEMsS0FBSyxNQUFNO0VBQ2Y7RUFFQSxDQUFDLENBQUUsR0FBRyxJQUFJLEdBQUcsTUFBTyxJQUFJLElBQUksS0FBSyxLQUFLLEdBQUcsS0FBSyxLQUFLLEdBQUcsS0FBSyxHQUFHLEtBQUssQ0FBQztFQUNwRSxDQUFDLENBQUUsR0FBRyxJQUFJLEdBQUcsTUFBTyxJQUFJLElBQUksS0FBSyxLQUFLLEdBQUcsS0FBSyxLQUFLLEdBQUcsS0FBSyxHQUFHLEtBQUssQ0FBQztFQUNwRSxDQUFDLENBQUUsR0FBRyxJQUFJLEdBQUcsTUFBTyxJQUFJLElBQUksS0FBSyxLQUFLLEdBQUcsS0FBSyxLQUFLLEdBQUcsS0FBSyxHQUFHLEtBQUssQ0FBQztFQUNwRSxDQUFDLENBQUUsR0FBRyxJQUFJLEdBQUcsTUFBTyxJQUFJLElBQUksS0FBSyxLQUFLLEdBQUcsS0FBSyxLQUFLLEdBQUcsS0FBSyxHQUFHLEtBQUssQ0FBQztFQUNwRSxDQUFDLENBQUUsR0FBRyxJQUFJLEdBQUcsTUFBTyxJQUFJLElBQUksS0FBSyxLQUFLLEdBQUcsS0FBSyxLQUFLLEdBQUcsS0FBSyxHQUFHLEtBQUssQ0FBQztFQUNwRSxDQUFDLENBQUUsR0FBRyxJQUFJLEdBQUcsTUFBTyxJQUFJLElBQUksS0FBSyxLQUFLLEdBQUcsS0FBSyxLQUFLLEdBQUcsS0FBSyxHQUFHLEtBQUssQ0FBQztFQUNwRSxDQUFDLENBQUUsR0FBRyxJQUFJLEdBQUcsTUFBTyxJQUFJLElBQUksS0FBSyxLQUFLLEdBQUcsS0FBSyxLQUFLLEdBQUcsS0FBSyxHQUFHLEtBQUssQ0FBQztFQUNwRSxDQUFDLENBQUUsR0FBRyxJQUFJLEdBQUcsTUFBTyxJQUFJLElBQUksS0FBSyxLQUFLLEdBQUcsS0FBSyxLQUFLLEdBQUcsS0FBSyxHQUFHLEtBQUssQ0FBQztFQUNwRSxLQUFLLEl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UFLLE1BQU0sS0FBSyxNQUFNLEtBQUssTUFBTSxLQUFLLE1BQU0sS0FBSyxNQUFNLEtBQUssTUFBTSxLQUFLLE1BQU07Q0FFL0ssS0FBSyxJQUFJLElBQUksR0FBRyxJQUFJLEdBQUcsS0FBSyxHQUFHO0VBQzNCLE9BQU8sS0FBSyxNQUFNLE1BQU0sR0FBRyxDQUFDO0VBQzVCLE9BQU8sS0FBSyxNQUFNLE1BQU0sR0FBRyxDQUFDO0VBQzVCLE9BQU8sS0FBSyxNQUFNLE1BQU0sR0FBRyxFQUFFO0VBQzdCLE9BQU8sS0FBSyxNQUFNLE1BQU0sR0FBRyxFQUFFO0VBQzdCLE9BQU8sS0FBSyxNQUFNLE1BQU0sR0FBRyxDQUFDO0VBQzVCLE9BQU8sS0FBSyxNQUFNLE1BQU0sR0FBRyxDQUFDO0VBQzVCLE9BQU8sS0FBSyxNQUFNLE1BQU0sR0FBRyxFQUFFO0VBQzdCLE9BQU8sS0FBSyxNQUFNLE1BQU0sR0FBRyxFQUFFO0VBQzdCLE9BQU8sS0FBSyxNQUFNLE1BQU0sR0FBRyxDQUFDO0VBQzVCLE9BQU8sS0FBSyxNQUFNLE1BQU0sR0FBRyxDQUFDO0VBQzVCLE9BQU8sS0FBSyxNQUFNLE1BQU0sR0FBRyxFQUFFO0VBQzdCLE9BQU8sS0FBSyxNQUFNLE1BQU0sR0FBRyxFQUFFO0VBQzdCLE9BQU8sS0FBSyxNQUFNLE1BQU0sR0FBRyxDQUFDO0VBQzVCLE9BQU8sS0FBSyxNQUFNLE1BQU0sR0FBRyxDQUFDO0VBQzVCLE9BQU8sS0FBSyxNQUFNLE1BQU0sR0FBRyxFQUFFO0VBQzdCLE9BQU8sS0FBSyxNQUFNLE1BQU0sR0FBRyxFQUFFO0VBQzdCLE9BQU8sS0FBSyxNQUFNLE1BQU0sR0FBRyxDQUFDO0VBQzVCLE9BQU8sS0FBSyxNQUFNLE1BQU0sR0FBRyxDQUFDO0VBQzVCLE9BQU8sS0FBSyxNQUFNLE1BQU0sR0FBRyxFQUFFO0VBQzdCLE9BQU8sS0FBSyxNQUFNLE1BQU0sR0FBRyxFQUFFO0VBQzdCLE9BQU8sS0FBSyxNQUFNLE1BQU0sR0FBRyxDQUFDO0VBQzVCLE9BQU8sS0FBSyxNQUFNLE1BQU0sR0FBRyxDQUFDO0VBQzVCLE9BQU8sS0FBSyxNQUFNLE1BQU0sR0FBRyxFQUFFO0VBQzdCLE9BQU8sS0FBSyxNQUFNLE1BQU0sR0FBRyxFQUFFO0VBQzdCLE9BQU8sS0FBSyxNQUFNLE1BQU0sR0FBRyxDQUFDO0VBQzVCLE9BQU8sS0FBSyxNQUFNLE1BQU0sR0FBRyxDQUFDO0VBQzVCLE9BQU8sS0FBSyxNQUFNLE1BQU0sR0FBRyxFQUFFO0VBQzdCLE9BQU8sS0FBSyxNQUFNLE1BQU0sR0FBRyxFQUFFO0VBQzdCLE9BQU8sS0FBSyxNQUFNLE1BQU0sR0FBRyxDQUFDO0VBQzVCLE9BQU8sS0FBSyxNQUFNLE1BQU0sR0FBRyxDQUFDO0VBQzVCLE9BQU8sS0FBSyxNQUFNLE1BQU0sR0FBRyxFQUFFO0VBQzdCLE9BQU8sS0FBSyxNQUFNLE1BQU0sR0FBRyxFQUFFO0NBQ2pDO0NBRUEsSUFBSSxRQUFTLE1BQU0sTUFBTztDQUMxQixJQUFJLFFBQVMsTUFBTSxNQUFPO0NBQzFCLElBQUksUUFBUyxNQUFNLE1BQU87Q0FDMUIsSUFBSSxRQUFTLE1BQU0sTUFBTztDQUMxQixJQUFJLFFBQVMsTUFBTSxNQUFPO0NBQzFCLElBQUksUUFBUyxNQUFNLE1BQU87Q0FDMUIsSUFBSSxRQUFTLE1BQU0sTUFBTztDQUMxQixJQUFJLFFBQVMsTUFBTSxNQUFPO0NBQzFCLElBQUksUUFBUyxNQUFNLE1BQU87Q0FDMUIsSUFBSSxRQUFTLE1BQU0sTUFBTztDQUMxQixJQUFJLFFBQVMsTUFBTSxNQUFPO0NBQzFCLElBQUksUUFBUyxNQUFNLE1BQU87Q0FDMUIsSUFBSSxRQUFTLE1BQU0sTUFBTztDQUMxQixJQUFJLFFBQVMsTUFBTSxNQUFPO0NBQzFCLElBQUksUUFBUyxNQUFNLE1BQU87Q0FDMUIsSUFBSSxRQUFTLE1BQU0sTUFBTztBQUM5QjtBQUNBLFNBQVMsU0FBUyxPQUFPLElBQUksS0FBSyxJQUFJLEdBQUc7Q0FFckMsSUFBSSxPQUFPLEtBQUs7Q0FDaEIsSUFBSSxPQUFPLEtBQUssS0FBSztDQUNyQixLQUFLLElBQUksSUFBS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HQUFHLE1BQU0sS0FBSyxHQUFHO0dBQ3hDLElBQUksS0FBSyxHQUFHLElBQUksSUFBSSxFQUFFO0dBQ3RCLElBQUksS0FBSyxHQUFHLElBQUksSUFBSSxFQUFFO0dBQ3RCLElBQUksS0FBSyxHQUFHLElBQUksSUFBSSxFQUFFO0dBQ3RCLElBQUksS0FBSyxHQUFHLElBQUksSUFBSSxFQUFFO0dBQ3RCLEtBQUssR0FBRyxJQUFJLElBQUksRUFBRTtHQUNsQixLQUFLLEdBQUcsSUFBSSxJQUFJLEVBQUU7R0FDbEIsS0FBSyxHQUFHLElBQUksSUFBSSxFQUFFO0dBQ2xCLEtBQUssR0FBRyxJQUFJLEdBQUcsRUFBRTtHQUNqQixLQUFLLEdBQUcsSUFBSSxJQUFJLEVBQUU7R0FDbEIsS0FBSyxHQUFHLElBQUksSUFBSSxFQUFFO0dBQ2xCLEtBQUssR0FBRyxJQUFJLElBQUksRUFBRTtHQUNsQixLQUFLLEdBQUcsSUFBSSxJQUFJLEVBQUU7R0FDbEIsS0FBSyxHQUFHLElBQUksSUFBSSxFQUFFO0dBQ2xCLEtBQUssR0FBRyxJQUFJLElBQUksRUFBRTtHQUNsQixLQUFLLEdBQUcsSUFBSSxJQUFJLEVBQUU7R0FDbEIsS0FBSyxHQUFHLElBQUksR0FBRyxFQUFFO0dBQ2pCLEtBQUssR0FBRyxJQUFJLElBQUksRUFBRTtHQUNsQixLQUFLLEdBQUcsSUFBSSxHQUFHLEVBQUU7R0FDakIsS0FBSyxHQUFHLElBQUksSUFBSSxFQUFFO0dBQ2xCLEtBQUssR0FBRyxJQUFJLElBQUksRUFBRTtHQUNsQixLQUFLLEdBQUcsSUFBSSxJQUFJLEVBQUU7R0FDbEIsS0FBSyxHQUFHLElBQUksSUFBSSxFQUFFO0dBQ2xCLEtBQUssR0FBRyxJQUFJLElBQUksRUFBRTtHQUNsQixLQUFLLEdBQUcsSUFBSSxJQUFJLEVBQUU7R0FDbEIsS0FBSyxHQUFHLElBQUksSUFBSSxFQUFFO0dBQ2xCLEtBQUssR0FBRyxJQUFJLElBQUksRUFBRTtHQUNsQixLQUFLLEdBQUcsSUFBSSxJQUFJLEVBQUU7R0FDbEIsS0FBSyxHQUFHLElBQUksSUFBSSxFQUFFO0dBQ2xCLEtBQUssR0FBRyxJQUFJLElBQUksRUFBRTtHQUNsQixLQUFLLEdBQUcsSUFBSSxJQUFJLEVBQUU7R0FDbEIsS0FBSyxHQUFHLElBQUksSUFBSSxFQUFFO0dBQ2xCLE9BQU8sSUFBSSxNQUFNLElBQUksSUFBSSxFQUFFO0VBQy9CO0VBS0EsSUFBSSxPQUFPO0dBQ1AsZUFBZSxLQUFLO0dBQ3BCLE1BQU0sRUFBRSxJQUFJLElBQUksSUFBSSxJQUFJLElBQUksT0FBTztHQUNuQyxNQUFNLEVBQUUsSUFBSSxJQUFJLElBQUksSUFBSSxJQUFJLE9BQU87R0FDbkMsSUFBSSxLQUFLLEdBQUcsTUFBTSxLQUFLLEdBQUcsTUFBTSxLQUFLLEdBQUc7R0FDeEMsTUFBTSxJQUFJLE1BQU07R0FDaEIsTUFBTSxLQUFLLEdBQUcsSUFBSSxNQUFNLEdBQUcsR0FBRztHQUM5QixJQUFJLEtBQUssR0FBRyxJQUFJLElBQUksRUFBRTtHQUN0QixJQUFJLEtBQUssR0FBRyxJQUFJLElBQUksRUFBRTtHQUN0QixJQUFJLEtBQUssR0FBRyxJQUFJLElBQUksRUFBRTtHQUN0QixJQUFJLEtBQUssR0FBRyxJQUFJLElBQUksRUFBRTtHQUN0QixJQUFJLEtBQUssR0FBRyxJQUFJLElBQUksRUFBRTtHQUN0QixLQUFLLEdBQUcsSUFBSSxJQUFJLEVBQUU7R0FDbEIsS0FBSyxHQUFHLElBQUksSUFBSSxFQUFFO0dBQ2xCLEtBQUssR0FBRyxJQUFJLElBQUksRUFBRTtHQUNsQixLQUFLLEdBQUcsSUFBSSxJQUFJLEVBQUU7R0FDbEIsSUFBSSxLQUFLLEdBQUcsSUFBSSxJQUFJLEVBQUU7R0FDdEIsS0FBSyxHQUFHLElBQUksSUFBSSxFQUFFO0dBQ2xCLEtBQUssR0FBRyxJQUFJLElBQUksRUFBRTtHQUNsQixLQUFLLEdBQUcsSUFBSSxJQUFJLEVBQUU7R0FDbEIsS0FBSyxHQUFHLElBQUksSUFBSSxFQUFFO0dBQ2xCLEtBQUssR0FBRyxJQUFJLElBQUksRUFBRTtHQUNsQixLQUFLLEdBQUcsSUFBSSxJQUFJLEVBQUU7R0FDbEIsS0FBSyxHQUFHLElBQUksSUFBSSxFQUFFO0dBQ2xCLEtBQUssR0FBRyxJQUFJLElBQUksRUFBRTtHQUNsQixLQUFLLEdBQUcsSUFBSSxHQUFHLEVBQUU7R0FDakIsS0FBSyxHQUFHLElBQUksSUFBSSxFQUFFO0dBQ2xCLEtBQUssR0FBRyxJQUFJLElBQUksRUFBRTtHQUNsQixLQUFLLEdBQUcsSUFBSSxJQUFJLEVBQUU7R0FDbEIsS0FBSyxHQUFHLElBQUksSUFBSSxFQUFFO0dBQ2xCLEtBQUssR0FBRyxJQUFJLElBQUksRUFBRTtHQUNsQixLQUFLLEdBQUcsSUFBSSxJQUFJLEVBQUU7R0FDbEIsS0FBSyxHQUFHLElBQUksSUFBSSxFQUFFO0dBQ2xCLEtBQUssR0FBRyxJQUFJLEdBQUcsRUFBRTtHQUNqQixLQUFLLEdBQUcsSUFBSSxJQUFJLEVBQUU7R0FDbEIsS0FBSyxHQUFHLElBQUksSUFBSSxFQUFFO0dBQ2xCLEtBQUssR0FBRyxJQUFJLElBQUksRUFBRTtHQUNsQixLQUFLLEdBQUcsSUFBSSxHQUFHLEVBQUU7R0FDakIsS0FBSyxHQUFHLElBQUksSUFBSSxFQUFFO0dBQ2xCLEtBQUssR0FBRyxJQUFJLElBQUksRUFBRTtHQUNsQixLQUFLLEdBQUcsSUFBSSxJQUFJLEVBQUU7R0FDbEIsS0FBSyxHQUFHLElBQUksSUFBSSxFQUFFO0dBQ2xCLEtBQUssR0FBRyxJQUFJLElBQUksRUFBRTtHQUNsQixLQUFLLEdBQUcsSUFBSSxJQUFJLEVBQUU7R0FDbEIsS0FBSyxHQUFHLElBQUksSUFBSSxFQUFFO0dBQ2xCLEtBQUssR0FBRyxJQUFJLElBQUksRUFBRTtHQUNsQixLQUFLLEdBQUcsSUFBSSxJQUFJLEVBQUU7R0FDbEIsT0FBTyxJQUFJLE1BQU0sSUFBSSxJQUFJLEVBQUU7RUFDL0I7RUFDQSxTQUFTLE9BQU87R0FDWixPQUFPLEtBQUssSUFBSSxNQUFNLE9BQU8sQ0FBQztFQUNsQztFQUNBLE1BQU07R0FDRixPQUFPLEtBQUssT0FBTyxNQUFNLElBQUk7RUFDakM7RUFDQSxLQUF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ztFQUFFLE9BQU8sRUFBRSxHQUFHLENBQUM7Q0FBRzs7OztDQUlsQyxPQUFPLE9BQU8sR0FBRztFQUFFLE9BQU8sRUFBRSxHQUFHLEVBQUU7Q0FBRzs7OztDQUlwQyxPQUFPLE9BQU8sR0FBRztFQUFFLE9BQU8sRUFBRSxHQUFHLEVBQUU7Q0FBRzs7OztDQUlwQyxPQUFPLE9BQU8sR0FBRztFQUFFLE9BQU8sRUFBRSxHQUFHLEVBQUU7Q0FBRzs7OztDQUlwQyxPQUFPLE9BQU8sR0FBRztFQUFFLE9BQU8sRUFBRSxHQUFHLEVBQUU7Q0FBRzs7OztDQUlwQyxPQUFPLE9BQU8sR0FBRztFQUFFLE9BQU8sRUFBRSxHQUFHLEVBQUU7Q0FBRzs7OztDQUlwQyxPQUFPLE9BQU8sR0FBRztFQUFFLE9BQU8sRUFBRSxHQUFHLEVBQUU7Q0FBRzs7OztDQUlwQyxPQUFPLE9BQU8sR0FBRztFQUFFLE9BQU8sRUFBRSxHQUFHLEVBQUU7Q0FBRzs7OztDQUlwQyxPQUFPLE9BQU8sR0FBRztFQUFFLE9BQU8sRUFBRSxHQUFHLEVBQUU7Q0FBRzs7OztDQUlwQyxPQUFPLE9BQU8sR0FBRztFQUFFLE9BQU8sRUFBRSxHQUFHLEVBQUU7Q0FBRzs7OztDQUlwQyxPQUFPLE9BQU8sR0FBRztFQUFFLE9BQU8sRUFBRSxHQUFHLEVBQUU7Q0FBRzs7OztDQUlwQyxPQUFPLE9BQU8sR0FBRztFQUFFLE9BQU8sRUFBRSxHQUFHLEVBQUU7Q0FBRzs7OztDQUlwQyxPQUFPLFFBQVEsR0FBRztFQUFFLE9BQU8sRUFBRSxHQUFHLEdBQUc7Q0FBRzs7OztDQUl0QyxPQUFPLFFBQVEsR0FBRztFQUFFLE9BQU8sRUFBRSxHQUFHLEdBQUc7Q0FBRzs7OztDQUl0QyxPQUFPLFFBQVEsR0FBRztFQUFFLE9BQU8sRUFBRSxHQUFHLEdBQUc7Q0FBRzs7OztDQUl0QyxPQUFPLFFBQVEsR0FBRztFQUFFLE9BQU8sRUFBRSxHQUFHLEdBQUc7Q0FBRzs7OztDQUl0QyxPQUFPLFFBQVEsR0FBRztFQUFFLE9BQU8sRUFBRSxHQUFHLEdBQUc7Q0FBRzs7OztDQUl0QyxPQUFPLFFBQVEsR0FBRztFQUFFLE9BQU8sRUFBRSxHQUFHLEdBQUc7Q0FBRzs7OztDQUl0QyxPQUFPLFFBQVEsR0FBRztFQUFFLE9BQU8sRUFBRSxHQUFHLEdBQUc7Q0FBRzs7OztDQUl0QyxPQUFPLFFBQVEsR0FBRztFQUFFLE9BQU8sRUFBRSxHQUFHLEdBQUc7Q0FBRzs7OztDQUl0QyxPQUFPLFFBQVEsR0FBRztFQUFFLE9BQU8sRUFBRSxHQUFHLEdBQUc7Q0FBRzs7OztDQUl0QyxPQUFPLFFBQVEsR0FBRztFQUFFLE9BQU8sRUFBRSxHQUFHLEdBQUc7Q0FBRzs7OztDQUl0QyxPQUFPLFFBQVEsR0FBRztFQUFFLE9BQU8sRUFBRSxHQUFHLEdBQUc7Q0FBRzs7OztDQUl0QyxPQUFPLFFBQVEsR0FBRztFQUFFLE9BQU8sRUFBRSxHQUFHLEdBQUc7Q0FBRzs7OztDQUl0QyxPQUFPLFFBQVEsR0FBRztFQUFFLE9BQU8sRUFBRSxHQUFHLEdBQUc7Q0FBRzs7OztDQUl0QyxPQUFPLFFBQVEsR0FBRztFQUFFLE9BQU8sRUFBRSxHQUFHLEdBQUc7Q0FBRzs7OztDQUl0QyxPQUFPLFFBQVEsR0FBRztFQUFFLE9BQU8sRUFBRSxHQUFHLEdBQUc7Q0FBRzs7OztDQUl0QyxPQUFPLFFBQVEsR0FBRztFQUFFLE9BQU8sRUFBRSxHQUFHLEdBQUc7Q0FBRzs7OztDQUl0QyxPQUFPLFFBQVEsR0FBRztFQUFFLE9BQU8sRUFBRSxHQUFHLEdBQUc7Q0FBRzs7OztDQUl0QyxPQUFPLFFBQVEsR0FBRztFQUFFLE9BQU8sRUFBRSxHQUFHLEdBQUc7Q0FBRzs7OztDQUl0QyxPQUFPLFFBQVEsR0FBRztFQUFFLE9BQU8sRUFBRSxHQUFHLEdBQUc7Q0FBRzs7OztDQUl0QyxPQUFPLFFBQVEsR0FBRztFQUFFLE9BQU8sRUFBRSxHQUFHLEdBQUc7Q0FBRzs7OztDQUl0QyxPQUFPLEtBQUssR0FBRztFQUFFLE9BQU8sRUFBRSxHQUFHLEdBQUc7Q0FBRzs7OztDQUluQyxPQUFPLEtBQUssR0FBRztFQUFFLE9BQU8sRUFBRSxHQUFHLEVBQUU7Q0FBRzs7OztDQUlsQyxPQUFPLE1BQU0sR0FBRztFQUFFLE9BQU8sRUFBRSxHQUFHLEdBQUc7Q0FBRzs7OztDQUlwQyxPQUFPLE1BQU0sR0FBRztFQUFFLE9BQU8sRUFBRSxHQUFHLEdBQUc7Q0FBRzs7OztDQUlwQyxPQUFPLE1BQU0sR0FBRztFQUFFLE9BQU8sRUFBRSxHQUFHLEdBQUc7Q0FBRzs7OztDQUlwQyxPQUFPLE1BQU0sR0FBRztFQUFFLE9BQU8sRUFBRSxHQUFHLEdBQUc7Q0FBRzs7OztDQUlwQyxPQUFPLE1BQU0sR0FBRztFQUFFLE9BQU8sRUFBRSxHQUFHLEdBQUc7Q0FBRzs7OztDQUlwQyxPQUFPLE1BQU0sR0FBRztFQUFFLE9BQU8sRUFBRSxHQUFHLEdBQUc7Q0FBRzs7OztDQUlwQyxPQUFPLE1BQU0sR0FBRztFQUFFLE9BQU8sRUFBRSxHQU
26774FHLEdBQUc7Q0FBRzs7OztDQUlwQyxPQUFPLE1BQU0sR0FBRztFQUFFLE9BQU8sRUFBRSxHQUFHLEdBQUc7Q0FBRzs7OztDQUlwQyxPQUFPLE1BQU0sR0FBRztFQUFFLE9BQU8sRUFBRSxHQUFHLEdBQUc7Q0FBRzs7OztDQUlwQyxPQUFPLE1BQU0sR0FBRztFQUFFLE9BQU8sRUFBRSxHQUFHLEdBQUc7Q0FBRzs7OztDQUlwQyxPQUFPLE1BQU0sR0FBRztFQUFFLE9BQU8sRUFBRSxHQUFHLEdBQUc7Q0FBRzs7OztDQUlwQyxPQUFPLE9BQU8sR0FBRztFQUFFLE9BQU8sRUFBRSxHQUFHLElBQUk7Q0FBRzs7OztDQUl0QyxPQUFPLE9BQU8sR0FBRztFQUFFLE9BQU8sRUFBRSxHQUFHLElBQUk7Q0FBRzs7OztDQUl0QyxPQUFPLE9BQU8sR0FBRztFQUFFLE9BQU8sRUFBRSxHQUFHLElBQUk7Q0FBRzs7OztDQUl0QyxPQUFPLE9BQU8sR0FBRztFQUFFLE9BQU8sRUFBRSxHQUFHLElBQUk7Q0FBRzs7OztDQUl0QyxPQUFPLE9BQU8sR0FBRztFQUFFLE9BQU8sRUFBRSxHQUFHLElBQUk7Q0FBRzs7OztDQUl0QyxPQUFPLE9BQU8sR0FBRztFQUFFLE9BQU8sRUFBRSxHQUFHLElBQUk7Q0FBRzs7OztDQUl0QyxPQUFPLE9BQU8sR0FBRztFQUFFLE9BQU8sRUFBRSxHQUFHLElBQUk7Q0FBRzs7OztDQUl0QyxPQUFPLE9BQU8sR0FBRztFQUFFLE9BQU8sRUFBRSxHQUFHLElBQUk7Q0FBRzs7OztDQUl0QyxPQUFPLE9BQU8sR0FBRztFQUFFLE9BQU8sRUFBRSxHQUFHLElBQUk7Q0FBRzs7OztDQUl0QyxPQUFPLE9BQU8sR0FBRztFQUFFLE9BQU8sRUFBRSxHQUFHLElBQUk7Q0FBRzs7OztDQUl0QyxPQUFPLE9BQU8sR0FBRztFQUFFLE9BQU8sRUFBRSxHQUFHLElBQUk7Q0FBRzs7OztDQUl0QyxPQUFPLE9BQU8sR0FBRztFQUFFLE9BQU8sRUFBRSxHQUFHLElBQUk7Q0FBRzs7OztDQUl0QyxPQUFPLE9BQU8sR0FBRztFQUFFLE9BQU8sRUFBRSxHQUFHLElBQUk7Q0FBRzs7OztDQUl0QyxPQUFPLE9BQU8sR0FBRztFQUFFLE9BQU8sRUFBRSxHQUFHLElBQUk7Q0FBRzs7OztDQUl0QyxPQUFPLE9BQU8sR0FBRztFQUFFLE9BQU8sRUFBRSxHQUFHLElBQUk7Q0FBRzs7OztDQUl0QyxPQUFPLE9BQU8sR0FBRztFQUFFLE9BQU8sRUFBRSxHQUFHLElBQUk7Q0FBRzs7OztDQUl0QyxPQUFPLE9BQU8sR0FBRztFQUFFLE9BQU8sRUFBRSxHQUFHLElBQUk7Q0FBRzs7OztDQUl0QyxPQUFPLE9BQU8sR0FBRztFQUFFLE9BQU8sRUFBRSxHQUFHLElBQUk7Q0FBRzs7OztDQUl0QyxPQUFPLE9BQU8sR0FBRztFQUFFLE9BQU8sRUFBRSxHQUFHLElBQUk7Q0FBRzs7OztDQUl0QyxPQUFPLE9BQU8sR0FBRztFQUFFLE9BQU8sRUFBRSxHQUFHLElBQUk7Q0FBRzs7OztDQUl0QyxPQUFPLElBQUksR0FBRztFQUFFLE9BQU8sRUFBRSxHQUFHLElBQUk7Q0FBRzs7OztDQUluQyxPQUFPLE9BQU8sR0FBRztFQUFFLE9BQU8sRUFBRSxHQUFHLENBQUM7Q0FBRzs7OztDQUluQyxPQUFPLE9BQU8sR0FBRztFQUFFLE9BQU8sRUFBRSxHQUFHLENBQUM7Q0FBRzs7OztDQUluQyxPQUFPLE9BQU8sR0FBRztFQUFFLE9BQU8sRUFBRSxHQUFHLENBQUM7Q0FBRzs7OztDQUluQyxPQUFPLE9BQU8sR0FBRztFQUFFLE9BQU8sRUFBRSxHQUFHLENBQUM7Q0FBRzs7OztDQUluQyxPQUFPLE9BQU8sR0FBRztFQUFFLE9BQU8sRUFBRSxHQUFHLENBQUM7Q0FBRzs7OztDQUluQyxPQUFPLE9BQU8sR0FBRztFQUFFLE9BQU8sRUFBRSxHQUFHLENBQUM7Q0FBRzs7OztDQUluQyxPQUFPLE9BQU8sR0FBRztFQUFFLE9BQU8sRUFBRSxHQUFHLENBQUM7Q0FBRzs7OztDQUluQyxPQUFPLE9BQU8sR0FBRztFQUFFLE9BQU8sRUFBRSxHQUFHLENBQUM7Q0FBRzs7OztDQUluQyxPQUFPLE9BQU8sR0FBRztFQUFFLE9BQU8sRUFBRSxHQUFHLENBQUM7Q0FBRzs7OztDQUluQyxPQUFPLFFBQVEsR0FBRztFQUFFLE9BQU8sRUFBRSxHQUFHLEVBQUU7Q0FBRzs7OztDQUlyQyxPQUFPLFFBQVEsR0FBRztFQUFFLE9BQU8sRUFBRSxHQUFHLEVBQUU7Q0FBRzs7OztDQUlyQyxPQUFPLFFBQVEsR0FBRztFQUFFLE9BQU8sRUFBRSxHQUFHLEVBQUU7Q0FBRzs7OztDQUlyQyxPQUFPLFFBQVEsR0FBRztFQUFFLE9BQU8sRUFBRSxHQUFHLEVBQUU7Q0FBRzs7OztDQUlyQyxPQUFPLFFBQVEsR0FBRztFQUFFLE9BQU8sRUFBRSxHQUFHLEVBQUU7Q0FBRzs7OztDQUlyQyxPQUFPLFFBQVEsR0FBRztFQUFFLE9BQU8sRUFBRSxHQUFHLEVBQUU7Q0FBRzs7OztDQUlyQyxPQUFPLFFBQVEsR0FBRztFQUFFLE9BQU8sRUFBRSxHQUFHLEVBQUU7Q0FBRzs7OztDQUlyQyxPQUFPLFFBQVEsR0FBRztFQUFFLE9BQU8sRUFBRSxHQUFHLEVBQUU7Q0FBRzs7OztDQUlyQyxPQUFPLFFBQVEsR0FBRztFQUFFLE9BQU8sRUFBRSxHQUFHLEVBQUU7Q0FBRzs7OztDQUlyQyxPQUFPLFFBQVEsR0FBRztFQUFFLE9BQU8sRUFBRSxHQUFHLEVBQUU7Q0FBRzs7OztDQUlyQyxPQUFPLFFBQVEsR0FBRztFQUFFLE9BQU8sRUFBRSxHQUFHLEVBQUU7Q0FBRzs7OztDQUlyQyxPQUFPLFFBQVEsR0FBRztFQUFFLE9BQU8sRUFBRSxHQUFHLEVBQUU7Q0FBRzs7OztDQUlyQyxPQUFPLFFBQVEsR0FBRztFQUFFLE9BQU8sRUFBRSxHQUFHLEVBQUU7Q0FBRzs7OztDQUlyQyxPQUFPLFFBQVEsR0FBRztFQUFFLE9BQU8sRUFBRSxHQUFHLEVBQUU7Q0FBRzs7OztDQUlyQyxPQUFPLFFBQVEsR0FBRztFQUFFLE9BQU8sRUFBRSxHQUFHLEVBQUU7Q0FBRzs7OztDQUlyQyxPQUFPLFFBQVEsR0FBRztFQUFFLE9BQU8sRUFBRSxHQUFHLEVBQUU7Q0FBRzs7OztDQUlyQyxPQUFPLFFBQVEsR0FBRztFQUFFLE9BQU8sRUFBRSxHQUFHLEVBQUU7Q0FBRzs7OztDQUlyQyxPQUFPLFFBQVEsR0FBRztFQUFFLE9BQU8sRUFBRSxHQUFHLEVBQUU7Q0FBRzs7OztDQUlyQyxPQUFPLFFBQVEsR0FBRztFQUFFLE9BQU8sRUFBRSxHQUFHLEVBQUU7Q0FBRzs7OztDQUlyQyxPQUFPLFFBQVEsR0FBRztFQUFFLE9BQU8sRUFBRSxHQUFHLEVBQUU7Q0FBRzs7OztDQUlyQyxPQUFPLFFBQVEsR0FBRztFQUFFLE9BQU8sRUFBRSxHQUFHLEVBQUU7Q0FBRzs7OztDQUlyQyxPQUFPLFFBQVEsR0FBRztFQUFFLE9BQU8sRUFBRSxHQUFHLEVBQUU7Q0FBRzs7OztDQUlyQyxPQUFPLFFBQVEsR0FBRztFQUFFLE9BQU8sRUFBRSxHQU
26774FHLEVBQUU7Q0FBRzs7OztDQUlyQyxPQUFPLFFBQVEsR0FBRztFQUFFLE9BQU8sSUFBSSxNQUFNLFFBQVEsV0FBVyxDQUFDO0NBQUc7Ozs7Q0FJNUQsT0FBTyxLQUFLLEdBQUc7RUFBRSxPQUFPLElBQUksTUFBTSxRQUFRLFFBQVEsQ0FBQyxDQUFDLENBQUM7Q0FBRzs7OztDQUl4RCxPQUFPLE1BQU0sR0FBRztFQUFFLE9BQU8sSUFBSSxNQUFNLFFBQVEsU0FBUyxDQUFDO0NBQUc7Ozs7Q0FJeEQsT0FBTyxPQUFPLEdBQUc7RUFBRSxPQUFPLElBQUksTUFBTSxRQUFRLFVBQVUsQ0FBQztDQUFHOzs7O0NBSTFELE9BQU8sTUFBTSxHQUFHLFNBQVM7RUFDckIsTUFBTSxJQUFJLE1BQU0scUJBQXFCO0NBRXpDOzs7O0NBSUEsT0FBTyxNQUFNLEdBQUcsTUFBTTtFQUNsQixNQUFNLElBQUksTUFBTSxxQkFBcUI7Q0FFekM7Ozs7Q0FJQSxPQUFPLFVBQVUsR0FBRztFQUNoQixPQUFPLElBQUksTUFBTSxRQUFRLGFBQWEsT0FBTyxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUM7Q0FDOUQ7Ozs7Q0FJQSxPQUFPLFFBQVEsT0FBTztFQUNsQixPQUFRLFNBQ0QsT0FBUSxVQUFXLFlBQ25CLGtCQUFrQixTQUNsQixNQUFNLGlCQUFpQjtDQUNsQzs7Ozs7Ozs7Q0FRQSxPQUFPLFlBQVksT0FBTyxNQUFNO0VBQzVCLElBQUksTUFBTSxRQUFRLEtBQUssR0FBRztHQUN0QixJQUFJLE1BQU0sU0FBUyxNQUNmLE1BQU0sSUFBSSxNQUFNLDBCQUEwQixLQUFLLFFBQVEsTUFBTSxNQUFNO0dBRXZFLE9BQU8sTUFBTTtFQUNqQjtFQUNBLE9BQU87Q0FDWDtBQUNKOzs7Ozs7QUNqbEJBLElBQWEsZUFBYixjQUFrQyxNQUFNO0NBQ3BDLFlBQVksV0FBVztFQUNuQixNQUFNLFdBQVcsV0FBVyxXQUFXLEtBQUs7Q0FDaEQ7Q0FDQSxlQUFlO0VBQ1gsT0FBTztDQUNYO0NBQ0EsT0FBTyxRQUFRLFFBQVE7RUFDbkIsSUFBSSxRQ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7Q0FBRSxJQUFJO0NBQUksSUFBSTtDQUFJLElBQUk7QUFBRztBQUVoRCxJQUFNLE9BQU87Q0FBQztDQUFNO0NBQU07Q0FBTTtDQUFNO0NBQU07Q0FBTTtDQUFNO0NBQU07Q0FBTTtDQUFNO0NBQU07Q0FBTTtDQUFNO0NBQU07Q0FBTTtDQUFNO0NBQU07Q0FBTTtDQUFNO0NBQU07Q0FBTTtDQUFNO0NBQU07Q0FBTTtDQUFNO0NBQU07Q0FBTTtDQUFNO0NBQU07QUFBSTtBQUVoTSxJQUFNLElBQUk7Q0FBQztDQUFNO0NBQU07Q0FBTTtDQUFNO0NBQU07Q0FBTTtDQUFNO0NBQU07Q0FBTTtDQUFNO0NBQU07Q0FBTTtDQUFNO0NBQU07Q0FBTTtDQUFNO0NBQU07Q0FBTTtDQUFNO0NBQU07Q0FBTTtDQUFNO0NBQU07Q0FBTTtDQUFNO0NBQU07Q0FBTTtDQUFNO0NBQU07Q0FBTTtDQUFNO0NBQU07Q0FBTTtDQUFNO0NBQU07Q0FBTTtDQUFNO0NBQU07Q0FBTTtDQUFNO0NBQU07Q0FBTTtDQUFNO0NBQU07Q0FBTTtDQUFNO0NBQU07Q0FBTTtDQUFNO0NBQU07Q0FBTTtDQUFNO0NBQU07Q0FBTTtDQUFNO0NBQU07Q0FBTTtDQUFNO0NBQU07Q0FBTTtDQUFNO0NBQU07Q0FBTTtDQUFNO0NBQU07Q0FBTTtDQUFNO0NBQU07Q0FBTTtDQUFNO0NBQU07Q0FBTTtDQUFNO0NBQU07Q0FBTTtDQUFNO0NBQU07Q0FBTTtDQUFNO0NBQU07Q0FBTTtDQUFNO0NBQU07Q0FBTTtDQUFNO0NBQU07Q0FBTTtDQUFNO0NBQU07Q0FBTTtDQUFNO0NBQU07Q0FBTTtDQUFNO0NBQU07Q0FBTTtDQUFNO0NBQU07Q0FBTTtDQUFNO0NBQU07Q0FBTTtDQUFNO0NBQU07Q0FBTTtDQUFNO0NBQU07Q0FBTTtDQUFNO0NBQU07Q0FBTTtDQUFNO0NBQU07Q0FBTTtDQUFNO0NBQU07Q0FBTTtDQUFNO0NBQU07Q0FBTTtDQUFNO0NBQU07Q0FBTTtDQUFNO0NBQU07Q0FBTTtDQUFNO0NBQU07Q0FBTTtDQUFNO0NBQU07Q0FBTTtDQUFNO0NBQU07Q0FBTTtDQUFNO0NBQU07Q0FBTTtDQUFNO0NBQU07Q0FBTTtDQUFNO0NBQU07Q0FBTTtDQUFNO0NBQU07Q0FBTTtDQUFNO0NBQU07Q0FBTTtDQUFNO0NBQU07Q0FBTTtDQUFNO0NBQU07Q0FBTTtDQUFNO0NBQU07Q0FBTTtDQUFNO0NBQU07Q0FBTTtDQUFNO0NBQU07Q0FBTTtDQUFNO0NBQU07Q0FBTTtDQUFNO0NBQU07Q0FBTTtDQUFNO0NBQU07Q0FBTTtDQUFNO0NBQU07Q0FBTTtDQUFNO0NBQU07Q0FBTTtDQUFNO0NBQU07Q0FBTTtDQUFNO0NBQU07Q0FBTTtDQUFNO0NBQU07Q0FBTTtDQUFNO0NBQU07Q0FBTTtDQUFNO0NBQU07Q0FBTTtDQUFNO0NBQU07Q0FBTTtDQUFNO0NBQU07Q0FBTTtDQUFNO0NBQU07Q0FBTTtDQUFNO0NBQU07Q0FBTTtDQUFNO0NBQU07Q0FBTTtDQUFNO0NBQU07Q0FBTTtDQUFNO0NBQU07Q0FBTTtDQUFNO0NBQU07Q0FBTTtDQUFNO0NBQU07Q0FBTTtDQUFNO0NBQU07Q0FBTTtDQUFNO0NBQU07Q0FBTTtDQUFNO0NBQU07Q0FBTTtDQUFNO0NBQU07Q0FBTTtDQUFNO0NBQU07Q0FBTTtDQUFNO0NBQU07Q0FBTTtDQUFNO0NBQU07Q0FBTTtDQUFNO0NBQU07Q0FBTTtDQUFNO0NBQU07Q0FBTTtDQUFNO0NBQU07Q0FBTTtDQUFNO0NBQU07Q0FBTTtBQUFJO0FBQ3pnRCxJQUFNLEtBQUs7Q0FBQztDQUFNO0NBQU07Q0FBTTtDQUFNO0NBQU07Q0FBTTtDQUFNO0NBQU07Q0FBTTtDQUFNO0NBQU07Q0FBTTtDQUFNO0NBQU07Q0FBTTtDQUFNO0NBQU07Q0FBTTtDQUFNO0NBQU07Q0FBTTtDQUFNO0NBQU07Q0FBTTtDQUFNO0NBQU07Q0FBTTtDQUFNO0NBQU07Q0FBTTtDQUFNO0NBQU07Q0FBTTtDQUFNO0NBQU07Q0FBTTtDQUFNO0NBQU07Q0FBTTtDQUFNO0NBQU07Q0FBTTtDQUFNO0NBQU07Q0FBTTtDQUFNO0NBQU07Q0FBTTtDQUFNO0NBQU07Q0FBTTtDQUFNO0NBQU07Q0FBTTtDQUFNO0NBQU07Q0FBTTtDQUFNO0NBQU07Q0FBTTtDQUFNO0NBQU07Q0FBTTtDQUFNO0NBQU07Q0FBTTtDQUFNO0NBQU07Q0FBTTtDQUFNO0NBQU07Q0FBTTtDQUFNO0NBQU07Q0FBTTtDQUFNO0NBQU07Q0FBTTtDQUFNO0NBQU07Q0FBTTtDQUFNO0NBQU07Q0FBTTtDQUFNO0NBQU07Q0FBTTtDQUFNO0NBQU07Q0FBTTtDQUFNO0NBQU07Q0FBTTtDQUFNO0NBQU07Q0FBTTtDQUFNO0NBQU07Q0FBTTtDQUFNO0NBQU07Q0FBTTtDQUFNO0NBQU07Q0FBTTtDQUFNO0NBQU07Q0FBTTtDQUFNO0NBQU07Q0FBTTtDQUFNO0NBQU07Q0FBTTtDQUFNO0NBQU07Q0FBTTtDQUFNO0NBQU07Q0FBTTtDQUFNO0NBQU07Q0FBTTtDQUFNO0NBQU07Q0FBTTtDQUFNO0NBQU07Q0FBTTtDQUFNO0NBQU07Q0FBTTtDQUFNO0NBQU07Q0FBTTtDQUFNO0NBQU07Q0FBTTtDQUFNO0NBQU07Q0FBTTtDQUFNO0NBQU07Q0FBTTtDQUFNO0NBQU07Q0FBTTtDQUFNO0NBQU07Q0FBTTtDQUFNO0NBQU07Q0FBTTtDQUFNO0NBQU07Q0FBTTtDQUFNO0NBQU07Q0FBTTtDQUFNO0NBQU07Q0FBTTtDQUFNO0NBQU07Q0FBTTtDQUFNO0NBQU07Q0FBTTtDQUFNO0NBQU07Q0FBTTtDQUFNO0NBQU07Q0FBTTtDQUFNO0NBQU07Q0FBTTtDQUFNO0NBQU07Q0FBTTtDQUFNO0NBQU07Q0FBTTtDQUFNO0NBQU07Q0FBTTtDQUFNO0NBQU07Q0FBTTtDQUFNO0NBQU07Q0FBTTtDQUFNO0NBQU07Q0FBTTtDQUFNO0NBQU07Q0FBTTtDQUFNO0NBQU07Q0FBTTtDQUFNO0NBQU07Q0FBTTtDQUFNO0NBQU07Q0FBTTtDQUFNO0NBQU07Q0FBTTtDQUFNO0NBQU07Q0FBTTtDQUFNO0NBQU07Q0FBTTtDQUFNO0NBQU07Q0FBTTtDQUFNO0NBQU07Q0FBTTtDQUFNO0NBQU07Q0FBTTtDQUFNO0NBQU07Q0FBTTtDQUFNO0NBQU07Q0FBTTtDQUFNO0NBQU07Q0FBTTtDQUFNO0NBQU07Q0FBTTtDQUFNO0NBQU07Q0FBTTtDQUFNO0NBQU07Q0FBTTtDQUFNO0NBQU07Q0FBTTtDQUFNO0NBQU07Q0FBTTtDQUFNO0NBQU07Q0FBTTtDQUFNO0NBQU07Q0FBTTtBQUFJO0FBRTFnRCxJQUFNLEtBQUs7Q0FBQztDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtBQUFVO0FBQzFnRyxJQUFNLEtBQUs7Q0FBQztDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtBQUFVO0FBQzFnRyxJQUFNLEtBQUs7Q0FBQztDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtBQUFVO0FBQzFnRyxJQUFNLEtBQUs7Q0FBQztDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtBQUFVO0FBRTFnRyxJQUFNLEtBQUs7Q0FBQztDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtBQUFVO0FBQzFnRyxJQUFNLEtBQUs7Q0FBQztDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtBQUFVO0FBQzFnRyxJQUFNLEtBQUs7Q0FBQztDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FB
26774WTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtBQUFVO0FBQzFnRyxJQUFNLEtBQUs7Q0FBQztDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtBQUFVO0FBRTFnRyxJQUFNLEtBQUs7Q0FBQztDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtBQUFVO0FBQzFnRyxJQUFNLEtBQUs7Q0FBQztDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtBQUFVO0FBQzFnRyxJQUFNLEtBQUs7Q0FBQztDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtBQUFVO0FBQzFnRyxJQUFNLEtBQUs7Q0FBQztDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtDQUFZO0NBQVk7Q0FBWTtBQUFVO0FBQzFnRyxTQUFTLGVBQWUsT0FBTztDQUMzQixNQUFNLFNBQVMsQ0FBQztDQUNoQixLQUFLLElBQUksSUFBSSxHQUFHLElBQUksTUFBTSxRQUFRLEtBQUssR0FDbkMsT0FBTyxLQUFNLE1BQU0sTUFBTSxLQUFPLE1BQU0sSUFBSSxNQUFNLEtBQU8sTUFBTSxJQUFJLE1BQU0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RO0VBQzVCLEtBQUssVUFBVTtDQUNuQjs7OztDQUlBLElBQUksVUFBVTtFQUFFLE9BQU8sS0FBSztDQUFTOzs7O0NBSXJDLGVBQWU7RUFDWCxPQUFPLFdBQVcsS0FBSyxPQUFPLEtBQUssT0FBTztDQUM5QztBQUNKOzs7QUNqQ0EsSUFBYSxZQUFZLEVBQ3JCLElBQUksT0FBTyxTQUFTLEVBQ3hCIiwieF9nb29nbGVfaWdub3JlTGlzdCI6WzAsMSwyLDMsNCw1LDYsNyw4LDksMTAsMTEsMTIsMTMsMTQsMTUsMTYsMTcsMTgsMTksMjAsMjEsMjIsMjMsMjQsMjUsMjYsMjcsMjgsMjksMzAsMzEsMzIsMzMsMzQsMzUsMzYsMzcsMzgsMzksNDAsNDEsNDIsNDMsNDQsNDUsNDYsNDcsNDgsNDksNTAsNTEsNTIsNTMsNTQsNTUsNTYsNTcsNTgsNTksNjAsNjEsNjIsNjMsNjQsNjUsNjYsNjcsNjgsNjksNzAsNzEsNzIsNzMsNzQsNzUsNzYsNzcsNzgsNzksODAsODEsODIsODMsODQsODUsODYsODcsODgsODksOTAsOTEsOTIsOTMsOTQsOTUsOTYsOTcsOTgsOTksMTAwLDEwMSwxMDIsMTAzLDEwNCwxMDUsMTA2LDEwNywxMDgsMTA5LDExMCwxMTEsMTEyLDExMywxMTQsMTE1LDExNiwxMTcsMTE4LDExOSwxMjAsMTIxLDEyMiwxMjMsMTI0LDEyNSwxMjYsMTI3LDEyOCwxMjksMTMwLDEzMV19
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.