f_00000d 53 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541
  1. export function encodeNormMsg(message) {
  2. let bb = popByteBuffer();
  3. _encodeNormMsg(message, bb);
  4. return toUint8Array(bb);
  5. }
  6. function _encodeNormMsg(message, bb) {
  7. let $sub = message.sub;
  8. if ($sub !== void 0) {
  9. writeVarint32(bb, 10);
  10. writeString(bb, $sub);
  11. }
  12. let $msg = message.msg;
  13. if ($msg !== void 0) {
  14. writeVarint32(bb, 18);
  15. writeString(bb, $msg);
  16. }
  17. let $error = message.error;
  18. if ($error !== void 0) {
  19. writeVarint32(bb, 26);
  20. writeString(bb, $error);
  21. }
  22. let $type = message.type;
  23. if ($type !== void 0) {
  24. writeVarint32(bb, 34);
  25. writeString(bb, $type);
  26. }
  27. let $fva11 = message.fva11;
  28. if ($fva11 !== void 0) {
  29. writeVarint32(bb, 45);
  30. writeFloat(bb, $fva11);
  31. }
  32. let $fva12 = message.fva12;
  33. if ($fva12 !== void 0) {
  34. writeVarint32(bb, 53);
  35. writeFloat(bb, $fva12);
  36. }
  37. let $iva11 = message.iva11;
  38. if ($iva11 !== void 0) {
  39. writeVarint32(bb, 56);
  40. writeVarint64(bb, intToLong($iva11));
  41. }
  42. let $iva12 = message.iva12;
  43. if ($iva12 !== void 0) {
  44. writeVarint32(bb, 64);
  45. writeVarint64(bb, intToLong($iva12));
  46. }
  47. }
  48. export function decodeNormMsg(binary) {
  49. return _decodeNormMsg(wrapByteBuffer(binary));
  50. }
  51. function _decodeNormMsg(bb) {
  52. let message = {};
  53. end_of_message:
  54. while (!isAtEnd(bb)) {
  55. let tag = readVarint32(bb);
  56. switch (tag >>> 3) {
  57. case 0:
  58. break end_of_message;
  59. case 1: {
  60. message.sub = readString(bb, readVarint32(bb));
  61. break;
  62. }
  63. case 2: {
  64. message.msg = readString(bb, readVarint32(bb));
  65. break;
  66. }
  67. case 3: {
  68. message.error = readString(bb, readVarint32(bb));
  69. break;
  70. }
  71. case 4: {
  72. message.type = readString(bb, readVarint32(bb));
  73. break;
  74. }
  75. case 5: {
  76. message.fva11 = readFloat(bb);
  77. break;
  78. }
  79. case 6: {
  80. message.fva12 = readFloat(bb);
  81. break;
  82. }
  83. case 7: {
  84. message.iva11 = readVarint32(bb);
  85. break;
  86. }
  87. case 8: {
  88. message.iva12 = readVarint32(bb);
  89. break;
  90. }
  91. default:
  92. skipUnknownField(bb, tag & 7);
  93. }
  94. }
  95. return message;
  96. }
  97. function pushTemporaryLength(bb) {
  98. let length = readVarint32(bb);
  99. let limit = bb.limit;
  100. bb.limit = bb.offset + length;
  101. return limit;
  102. }
  103. function skipUnknownField(bb, type) {
  104. switch (type) {
  105. case 0:
  106. while (readByte(bb) & 128) {
  107. }
  108. break;
  109. case 2:
  110. skip(bb, readVarint32(bb));
  111. break;
  112. case 5:
  113. skip(bb, 4);
  114. break;
  115. case 1:
  116. skip(bb, 8);
  117. break;
  118. default:
  119. throw new Error("Unimplemented type: " + type);
  120. }
  121. }
  122. function stringToLong(value) {
  123. return {
  124. low: value.charCodeAt(0) | value.charCodeAt(1) << 16,
  125. high: value.charCodeAt(2) | value.charCodeAt(3) << 16,
  126. unsigned: false
  127. };
  128. }
  129. function longToString(value) {
  130. let low = value.low;
  131. let high = value.high;
  132. return String.fromCharCode(
  133. low & 65535,
  134. low >>> 16,
  135. high & 65535,
  136. high >>> 16
  137. );
  138. }
  139. let f32 = new Float32Array(1);
  140. let f32_u8 = new Uint8Array(f32.buffer);
  141. let f64 = new Float64Array(1);
  142. let f64_u8 = new Uint8Array(f64.buffer);
  143. function intToLong(value) {
  144. value |= 0;
  145. return {
  146. low: value,
  147. high: value >> 31,
  148. unsigned: value >= 0
  149. };
  150. }
  151. let bbStack = [];
  152. function popByteBuffer() {
  153. const bb = bbStack.pop();
  154. if (!bb)
  155. return { bytes: new Uint8Array(64), offset: 0, limit: 0 };
  156. bb.offset = bb.limit = 0;
  157. return bb;
  158. }
  159. function pushByteBuffer(bb) {
  160. bbStack.push(bb);
  161. }
  162. function wrapByteBuffer(bytes) {
  163. return { bytes, offset: 0, limit: bytes.length };
  164. }
  165. function toUint8Array(bb) {
  166. let bytes = bb.bytes;
  167. let limit = bb.limit;
  168. return bytes.length === limit ? bytes : bytes.subarray(0, limit);
  169. }
  170. function skip(bb, offset) {
  171. if (bb.offset + offset > bb.limit) {
  172. throw new Error("Skip past limit");
  173. }
  174. bb.offset += offset;
  175. }
  176. function isAtEnd(bb) {
  177. return bb.offset >= bb.limit;
  178. }
  179. function grow(bb, count) {
  180. let bytes = bb.bytes;
  181. let offset = bb.offset;
  182. let limit = bb.limit;
  183. let finalOffset = offset + count;
  184. if (finalOffset > bytes.length) {
  185. let newBytes = new Uint8Array(finalOffset * 2);
  186. newBytes.set(bytes);
  187. bb.bytes = newBytes;
  188. }
  189. bb.offset = finalOffset;
  190. if (finalOffset > limit) {
  191. bb.limit = finalOffset;
  192. }
  193. return offset;
  194. }
  195. function advance(bb, count) {
  196. let offset = bb.offset;
  197. if (offset + count > bb.limit) {
  198. throw new Error("Read past limit");
  199. }
  200. bb.offset += count;
  201. return offset;
  202. }
  203. function readBytes(bb, count) {
  204. let offset = advance(bb, count);
  205. return bb.bytes.subarray(offset, offset + count);
  206. }
  207. function writeBytes(bb, buffer) {
  208. let offset = grow(bb, buffer.length);
  209. bb.bytes.set(buffer, offset);
  210. }
  211. function readString(bb, count) {
  212. let offset = advance(bb, count);
  213. let fromCharCode = String.fromCharCode;
  214. let bytes = bb.bytes;
  215. let invalid = "�";
  216. let text = "";
  217. for (let i = 0; i < count; i++) {
  218. let c1 = bytes[i + offset], c2, c3, c4, c;
  219. if ((c1 & 128) === 0) {
  220. text += fromCharCode(c1);
  221. } else if ((c1 & 224) === 192) {
  222. if (i + 1 >= count)
  223. text += invalid;
  224. else {
  225. c2 = bytes[i + offset + 1];
  226. if ((c2 & 192) !== 128)
  227. text += invalid;
  228. else {
  229. c = (c1 & 31) << 6 | c2 & 63;
  230. if (c < 128)
  231. text += invalid;
  232. else {
  233. text += fromCharCode(c);
  234. i++;
  235. }
  236. }
  237. }
  238. } else if ((c1 & 240) == 224) {
  239. if (i + 2 >= count)
  240. text += invalid;
  241. else {
  242. c2 = bytes[i + offset + 1];
  243. c3 = bytes[i + offset + 2];
  244. if (((c2 | c3 << 8) & 49344) !== 32896)
  245. text += invalid;
  246. else {
  247. c = (c1 & 15) << 12 | (c2 & 63) << 6 | c3 & 63;
  248. if (c < 2048 || c >= 55296 && c <= 57343)
  249. text += invalid;
  250. else {
  251. text += fromCharCode(c);
  252. i += 2;
  253. }
  254. }
  255. }
  256. } else if ((c1 & 248) == 240) {
  257. if (i + 3 >= count)
  258. text += invalid;
  259. else {
  260. c2 = bytes[i + offset + 1];
  261. c3 = bytes[i + offset + 2];
  262. c4 = bytes[i + offset + 3];
  263. if (((c2 | c3 << 8 | c4 << 16) & 12632256) !== 8421504)
  264. text += invalid;
  265. else {
  266. c = (c1 & 7) << 18 | (c2 & 63) << 12 | (c3 & 63) << 6 | c4 & 63;
  267. if (c < 65536 || c > 1114111)
  268. text += invalid;
  269. else {
  270. c -= 65536;
  271. text += fromCharCode((c >> 10) + 55296, (c & 1023) + 56320);
  272. i += 3;
  273. }
  274. }
  275. }
  276. } else
  277. text += invalid;
  278. }
  279. return text;
  280. }
  281. function writeString(bb, text) {
  282. let n = text.length;
  283. let byteCount = 0;
  284. for (let i = 0; i < n; i++) {
  285. let c = text.charCodeAt(i);
  286. if (c >= 55296 && c <= 56319 && i + 1 < n) {
  287. c = (c << 10) + text.charCodeAt(++i) - 56613888;
  288. }
  289. byteCount += c < 128 ? 1 : c < 2048 ? 2 : c < 65536 ? 3 : 4;
  290. }
  291. writeVarint32(bb, byteCount);
  292. let offset = grow(bb, byteCount);
  293. let bytes = bb.bytes;
  294. for (let i = 0; i < n; i++) {
  295. let c = text.charCodeAt(i);
  296. if (c >= 55296 && c <= 56319 && i + 1 < n) {
  297. c = (c << 10) + text.charCodeAt(++i) - 56613888;
  298. }
  299. if (c < 128) {
  300. bytes[offset++] = c;
  301. } else {
  302. if (c < 2048) {
  303. bytes[offset++] = c >> 6 & 31 | 192;
  304. } else {
  305. if (c < 65536) {
  306. bytes[offset++] = c >> 12 & 15 | 224;
  307. } else {
  308. bytes[offset++] = c >> 18 & 7 | 240;
  309. bytes[offset++] = c >> 12 & 63 | 128;
  310. }
  311. bytes[offset++] = c >> 6 & 63 | 128;
  312. }
  313. bytes[offset++] = c & 63 | 128;
  314. }
  315. }
  316. }
  317. function writeByteBuffer(bb, buffer) {
  318. let offset = grow(bb, buffer.limit);
  319. let from = bb.bytes;
  320. let to = buffer.bytes;
  321. for (let i = 0, n = buffer.limit; i < n; i++) {
  322. from[i + offset] = to[i];
  323. }
  324. }
  325. function readByte(bb) {
  326. return bb.bytes[advance(bb, 1)];
  327. }
  328. function writeByte(bb, value) {
  329. let offset = grow(bb, 1);
  330. bb.bytes[offset] = value;
  331. }
  332. function readFloat(bb) {
  333. let offset = advance(bb, 4);
  334. let bytes = bb.bytes;
  335. f32_u8[0] = bytes[offset++];
  336. f32_u8[1] = bytes[offset++];
  337. f32_u8[2] = bytes[offset++];
  338. f32_u8[3] = bytes[offset++];
  339. return f32[0];
  340. }
  341. function writeFloat(bb, value) {
  342. let offset = grow(bb, 4);
  343. let bytes = bb.bytes;
  344. f32[0] = value;
  345. bytes[offset++] = f32_u8[0];
  346. bytes[offset++] = f32_u8[1];
  347. bytes[offset++] = f32_u8[2];
  348. bytes[offset++] = f32_u8[3];
  349. }
  350. function readDouble(bb) {
  351. let offset = advance(bb, 8);
  352. let bytes = bb.bytes;
  353. f64_u8[0] = bytes[offset++];
  354. f64_u8[1] = bytes[offset++];
  355. f64_u8[2] = bytes[offset++];
  356. f64_u8[3] = bytes[offset++];
  357. f64_u8[4] = bytes[offset++];
  358. f64_u8[5] = bytes[offset++];
  359. f64_u8[6] = bytes[offset++];
  360. f64_u8[7] = bytes[offset++];
  361. return f64[0];
  362. }
  363. function writeDouble(bb, value) {
  364. let offset = grow(bb, 8);
  365. let bytes = bb.bytes;
  366. f64[0] = value;
  367. bytes[offset++] = f64_u8[0];
  368. bytes[offset++] = f64_u8[1];
  369. bytes[offset++] = f64_u8[2];
  370. bytes[offset++] = f64_u8[3];
  371. bytes[offset++] = f64_u8[4];
  372. bytes[offset++] = f64_u8[5];
  373. bytes[offset++] = f64_u8[6];
  374. bytes[offset++] = f64_u8[7];
  375. }
  376. function readInt32(bb) {
  377. let offset = advance(bb, 4);
  378. let bytes = bb.bytes;
  379. return bytes[offset] | bytes[offset + 1] << 8 | bytes[offset + 2] << 16 | bytes[offset + 3] << 24;
  380. }
  381. function writeInt32(bb, value) {
  382. let offset = grow(bb, 4);
  383. let bytes = bb.bytes;
  384. bytes[offset] = value;
  385. bytes[offset + 1] = value >> 8;
  386. bytes[offset + 2] = value >> 16;
  387. bytes[offset + 3] = value >> 24;
  388. }
  389. function readInt64(bb, unsigned) {
  390. return {
  391. low: readInt32(bb),
  392. high: readInt32(bb),
  393. unsigned
  394. };
  395. }
  396. function writeInt64(bb, value) {
  397. writeInt32(bb, value.low);
  398. writeInt32(bb, value.high);
  399. }
  400. function readVarint32(bb) {
  401. let c = 0;
  402. let value = 0;
  403. let b;
  404. do {
  405. b = readByte(bb);
  406. if (c < 32)
  407. value |= (b & 127) << c;
  408. c += 7;
  409. } while (b & 128);
  410. return value;
  411. }
  412. function writeVarint32(bb, value) {
  413. value >>>= 0;
  414. while (value >= 128) {
  415. writeByte(bb, value & 127 | 128);
  416. value >>>= 7;
  417. }
  418. writeByte(bb, value);
  419. }
  420. function readVarint64(bb, unsigned) {
  421. let part0 = 0;
  422. let part1 = 0;
  423. let part2 = 0;
  424. let b;
  425. b = readByte(bb);
  426. part0 = b & 127;
  427. if (b & 128) {
  428. b = readByte(bb);
  429. part0 |= (b & 127) << 7;
  430. if (b & 128) {
  431. b = readByte(bb);
  432. part0 |= (b & 127) << 14;
  433. if (b & 128) {
  434. b = readByte(bb);
  435. part0 |= (b & 127) << 21;
  436. if (b & 128) {
  437. b = readByte(bb);
  438. part1 = b & 127;
  439. if (b & 128) {
  440. b = readByte(bb);
  441. part1 |= (b & 127) << 7;
  442. if (b & 128) {
  443. b = readByte(bb);
  444. part1 |= (b & 127) << 14;
  445. if (b & 128) {
  446. b = readByte(bb);
  447. part1 |= (b & 127) << 21;
  448. if (b & 128) {
  449. b = readByte(bb);
  450. part2 = b & 127;
  451. if (b & 128) {
  452. b = readByte(bb);
  453. part2 |= (b & 127) << 7;
  454. }
  455. }
  456. }
  457. }
  458. }
  459. }
  460. }
  461. }
  462. }
  463. return {
  464. low: part0 | part1 << 28,
  465. high: part1 >>> 4 | part2 << 24,
  466. unsigned
  467. };
  468. }
  469. function writeVarint64(bb, value) {
  470. let part0 = value.low >>> 0;
  471. let part1 = (value.low >>> 28 | value.high << 4) >>> 0;
  472. let part2 = value.high >>> 24;
  473. let size = part2 === 0 ? part1 === 0 ? part0 < 1 << 14 ? part0 < 1 << 7 ? 1 : 2 : part0 < 1 << 21 ? 3 : 4 : part1 < 1 << 14 ? part1 < 1 << 7 ? 5 : 6 : part1 < 1 << 21 ? 7 : 8 : part2 < 1 << 7 ? 9 : 10;
  474. let offset = grow(bb, size);
  475. let bytes = bb.bytes;
  476. switch (size) {
  477. case 10:
  478. bytes[offset + 9] = part2 >>> 7 & 1;
  479. break;
  480. case 9:
  481. bytes[offset + 8] = size !== 9 ? part2 | 128 : part2 & 127;
  482. break;
  483. case 8:
  484. bytes[offset + 7] = size !== 8 ? part1 >>> 21 | 128 : part1 >>> 21 & 127;
  485. break;
  486. case 7:
  487. bytes[offset + 6] = size !== 7 ? part1 >>> 14 | 128 : part1 >>> 14 & 127;
  488. break;
  489. case 6:
  490. bytes[offset + 5] = size !== 6 ? part1 >>> 7 | 128 : part1 >>> 7 & 127;
  491. break;
  492. case 5:
  493. bytes[offset + 4] = size !== 5 ? part1 | 128 : part1 & 127;
  494. break;
  495. case 4:
  496. bytes[offset + 3] = size !== 4 ? part0 >>> 21 | 128 : part0 >>> 21 & 127;
  497. break;
  498. case 3:
  499. bytes[offset + 2] = size !== 3 ? part0 >>> 14 | 128 : part0 >>> 14 & 127;
  500. break;
  501. case 2:
  502. bytes[offset + 1] = size !== 2 ? part0 >>> 7 | 128 : part0 >>> 7 & 127;
  503. break;
  504. case 1:
  505. bytes[offset] = size !== 1 ? part0 | 128 : part0 & 127;
  506. }
  507. }
  508. function readVarint32ZigZag(bb) {
  509. let value = readVarint32(bb);
  510. return value >>> 1 ^ -(value & 1);
  511. }
  512. function writeVarint32ZigZag(bb, value) {
  513. writeVarint32(bb, value << 1 ^ value >> 31);
  514. }
  515. function readVarint64ZigZag(bb) {
  516. let value = readVarint64(
  517. bb,
  518. /* unsigned */
  519. false
  520. );
  521. let low = value.low;
  522. let high = value.high;
  523. let flip = -(low & 1);
  524. return {
  525. low: (low >>> 1 | high << 31) ^ flip,
  526. high: high >>> 1 ^ flip,
  527. unsigned: false
  528. };
  529. }
  530. function writeVarint64ZigZag(bb, value) {
  531. let low = value.low;
  532. let high = value.high;
  533. let flip = high >> 31;
  534. writeVarint64(bb, {
  535. low: low << 1 ^ flip,
  536. high: (high << 1 | low >>> 31) ^ flip,
  537. unsigned: false
  538. });
  539. }
  540. //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIm1lc3NhZ2UudHMiXSwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IGludGVyZmFjZSBOb3JtTXNnIHtcclxuICBzdWI/OiBzdHJpbmc7XHJcbiAgbXNnPzogc3RyaW5nO1xyXG4gIGVycm9yPzogc3RyaW5nO1xyXG4gIHR5cGU/OiBzdHJpbmc7XHJcbiAgZnZhMTE/OiBudW1iZXI7XHJcbiAgZnZhMTI/OiBudW1iZXI7XHJcbiAgaXZhMTE/OiBudW1iZXI7XHJcbiAgaXZhMTI/OiBudW1iZXI7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBlbmNvZGVOb3JtTXNnKG1lc3NhZ2U6IE5vcm1Nc2cpOiBVaW50OEFycmF5IHtcclxuICBsZXQgYmIgPSBwb3BCeXRlQnVmZmVyKCk7XHJcbiAgX2VuY29kZU5vcm1Nc2cobWVzc2FnZSwgYmIpO1xyXG4gIHJldHVybiB0b1VpbnQ4QXJyYXkoYmIpO1xyXG59XHJcblxyXG5mdW5jdGlvbiBfZW5jb2RlTm9ybU1zZyhtZXNzYWdlOiBOb3JtTXNnLCBiYjogQnl0ZUJ1ZmZlcik6IHZvaWQge1xyXG4gIC8vIG9wdGlvbmFsIHN0cmluZyBzdWIgPSAxO1xyXG4gIGxldCAkc3ViID0gbWVzc2FnZS5zdWI7XHJcbiAgaWYgKCRzdWIgIT09IHVuZGVmaW5lZCkge1xyXG4gICAgd3JpdGVWYXJpbnQzMihiYiwgMTApO1xyXG4gICAgd3JpdGVTdHJpbmcoYmIsICRzdWIpO1xyXG4gIH1cclxuXHJcbiAgLy8gb3B0aW9uYWwgc3RyaW5nIG1zZyA9IDI7XHJcbiAgbGV0ICRtc2cgPSBtZXNzYWdlLm1zZztcclxuICBpZiAoJG1zZyAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICB3cml0ZVZhcmludDMyKGJiLCAxOCk7XHJcbiAgICB3cml0ZVN0cmluZyhiYiwgJG1zZyk7XHJcbiAgfVxyXG5cclxuICAvLyBvcHRpb25hbCBzdHJpbmcgZXJyb3IgPSAzO1xyXG4gIGxldCAkZXJyb3IgPSBtZXNzYWdlLmVycm9yO1xyXG4gIGlmICgkZXJyb3IgIT09IHVuZGVmaW5lZCkge1xyXG4gICAgd3JpdGVWYXJpbnQzMihiYiwgMjYpO1xyXG4gICAgd3JpdGVTdHJpbmcoYmIsICRlcnJvcik7XHJcbiAgfVxyXG5cclxuICAvLyBvcHRpb25hbCBzdHJpbmcgdHlwZSA9IDQ7XHJcbiAgbGV0ICR0eXBlID0gbWVzc2FnZS50eXBlO1xyXG4gIGlmICgkdHlwZSAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICB3cml0ZVZhcmludDMyKGJiLCAzNCk7XHJcbiAgICB3cml0ZVN0cmluZyhiYiwgJHR5cGUpO1xyXG4gIH1cclxuXHJcbiAgLy8gb3B0aW9uYWwgZmxvYXQgZnZhMTEgPSA1O1xyXG4gIGxldCAkZnZhMTEgPSBtZXNzYWdlLmZ2YTExO1xyXG4gIGlmICgkZnZhMTEgIT09IHVuZGVmaW5lZCkge1xyXG4gICAgd3JpdGVWYXJpbnQzMihiYiwgNDUpO1xyXG4gICAgd3JpdGVGbG9hdChiYiwgJGZ2YTExKTtcclxuICB9XHJcblxyXG4gIC8vIG9wdGlvbmFsIGZsb2F0IGZ2YTEyID0gNjtcclxuICBsZXQgJGZ2YTEyID0gbWVzc2FnZS5mdmExMjtcclxuICBpZiAoJGZ2YTEyICE9PSB1bmRlZmluZWQpIHtcclxuICAgIHdyaXRlVmFyaW50MzIoYmIsIDUzKTtcclxuICAgIHdyaXRlRmxvYXQoYmIsICRmdmExMik7XHJcbiAgfVxyXG5cclxuICAvLyBvcHRpb25hbCBpbnQzMiBpdmExMSA9IDc7XHJcbiAgbGV0ICRpdmExMSA9IG1lc3NhZ2UuaXZhMTE7XHJcbiAgaWYgKCRpdmExMSAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICB3cml0ZVZhcmludDMyKGJiLCA1Nik7XHJcbiAgICB3cml0ZVZhcmludDY0KGJiLCBpbnRUb0xvbmcoJGl2YTExKSk7XHJcbiAgfVxyXG5cclxuICAvLyBvcHRpb25hbCBpbnQzMiBpdmExMiA9IDg7XHJcbiAgbGV0ICRpdmExMiA9IG1lc3NhZ2UuaXZhMTI7XHJcbiAgaWYgKCRpdmExMiAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICB3cml0ZVZhcmludDMyKGJiLCA2NCk7XHJcbiAgICB3cml0ZVZhcmludDY0KGJiLCBpbnRUb0xvbmcoJGl2YTEyKSk7XHJcbiAgfVxyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gZGVjb2RlTm9ybU1zZyhiaW5hcnk6IFVpbnQ4QXJyYXkpOiBOb3JtTXNnIHtcclxuICByZXR1cm4gX2RlY29kZU5vcm1Nc2cod3JhcEJ5dGVCdWZmZXIoYmluYXJ5KSk7XHJcbn1cclxuXHJcbmZ1bmN0aW9uIF9kZWNvZGVOb3JtTXNnKGJiOiBCeXRlQnVmZmVyKTogTm9ybU1zZyB7XHJcbiAgbGV0IG1lc3NhZ2U6IE5vcm1Nc2cgPSB7fSBhcyBhbnk7XHJcblxyXG4gIGVuZF9vZl9tZXNzYWdlOiB3aGlsZSAoIWlzQXRFbmQoYmIpKSB7XHJcbiAgICBsZXQgdGFnID0gcmVhZFZhcmludDMyKGJiKTtcclxuXHJcbiAgICBzd2l0Y2ggKHRhZyA+Pj4gMykge1xyXG4gICAgICBjYXNlIDA6XHJcbiAgICAgICAgYnJlYWsgZW5kX29mX21lc3NhZ2U7XHJcblxyXG4gICAgICAvLyBvcHRpb25hbCBzdHJpbmcgc3ViID0gMTtcclxuICAgICAgY2FzZSAxOiB7XHJcbiAgICAgICAgbWVzc2FnZS5zdWIgPSByZWFkU3RyaW5nKGJiLCByZWFkVmFyaW50MzIoYmIpKTtcclxuICAgICAgICBicmVhaztcclxuICAgICAgfVxyXG5cclxuICAgICAgLy8gb3B0aW9uYWwgc3RyaW5nIG1zZyA9IDI7XHJcbiAgICAgIGNhc2UgMjoge1xyXG4gICAgICAgIG1lc3NhZ2UubXNnID0gcmVhZFN0cmluZyhiYiwgcmVhZFZhcmludDMyKGJiKSk7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIC8vIG9wdGlvbmFsIHN0cmluZyBlcnJvciA9IDM7XHJcbiAgICAgIGNhc2UgMzoge1xyXG4gICAgICAgIG1lc3NhZ2UuZXJyb3IgPSByZWFkU3RyaW5nKGJiLCByZWFkVmFyaW50MzIoYmIpKTtcclxuICAgICAgICBicmVhaztcclxuICAgICAgfVxyXG5cclxuICAgICAgLy8gb3B0aW9uYWwgc3RyaW5nIHR5cGUgPSA0O1xyXG4gICAgICBjYXNlIDQ6IHtcclxuICAgICAgICBtZXNzYWdlLnR5cGUgPSByZWFkU3RyaW5nKGJiLCByZWFkVmFyaW50MzIoYmIpKTtcclxuICAgICAgICBicmVhaztcclxuICAgICAgfVxyXG5cclxuICAgICAgLy8gb3B0aW9uYWwgZmxvYXQgZnZhMTEgPSA1O1xyXG4gICAgICBjYXNlIDU6IHtcclxuICAgICAgICBtZXNzYWdlLmZ2YTExID0gcmVhZEZsb2F0KGJiKTtcclxuICAgICAgICBicmVhaztcclxuICAgICAgfVxyXG5cclxuICAgICAgLy8gb3B0aW9uYWwgZmxvYXQgZnZhMTIgPSA2O1xyXG4gICAgICBjYXNlIDY6IHtcclxuICAgICAgICBtZXNzYWdlLmZ2YTEyID0gcmVhZEZsb2F0KGJiKTtcclxuICAgICAgICBicmVhaztcclxuICAgICAgfVxyXG5cclxuICAgICAgLy8gb3B0aW9uYWwgaW50MzIgaXZhMTEgPSA3O1xyXG4gICAgICBjYXNlIDc6IHtcclxuICAgICAgICBtZXNzYWdlLml2YTExID0gcmVhZFZhcmludDMyKGJiKTtcclxuICAgICAgICBicmVhaztcclxuICAgICAgfVxyXG5cclxuICAgICAgLy8gb3B0aW9uYWwgaW50MzIgaXZhMTIgPSA4O1xyXG4gICAgICBjYXNlIDg6IHtcclxuICAgICAgICBtZXNzYWdlLml2YTEyID0gcmVhZFZhcmludDMyKGJiKTtcclxuICAgICAgICBicmVhaztcclxuICAgICAgfVxyXG5cclxuICAgICAgZGVmYXVsdDpcclxuICAgICAgICBza2lwVW5rbm93bkZpZWxkKGJiLCB0YWcgJiA3KTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHJldHVybiBtZXNzYWdlO1xyXG59XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIExvbmcge1xyXG4gIGxvdzogbnVtYmVyO1xyXG4gIGhpZ2g6IG51bWJlcjtcclxuICB1bnNpZ25lZDogYm9vbGVhbjtcclxufVxyXG5cclxuaW50ZXJmYWNlIEJ5dGVCdWZmZXIge1xyXG4gIGJ5dGVzOiBVaW50OEFycmF5O1xyXG4gIG9mZnNldDogbnVtYmVyO1xyXG4gIGxpbWl0OiBudW1iZXI7XHJcbn1cclxuXHJcbmZ1bmN0aW9uIHB1c2hUZW1wb3JhcnlMZW5ndGgoYmI6IEJ5dGVCdWZmZXIpOiBudW1iZXIge1xyXG4gIGxldCBsZW5ndGggPSByZWFkVmFyaW50MzIoYmIpO1xyXG4gIGxldCBsaW1pdCA9IGJiLmxpbWl0O1xyXG4gIGJiLmxpbWl0ID0gYmIub2Zmc2V0ICsgbGVuZ3RoO1xyXG4gIHJldHVybiBsaW1pdDtcclxufVxyXG5cclxuZnVuY3Rpb24gc2tpcFVua25vd25GaWVsZChiYjogQnl0ZUJ1ZmZlciwgdHlwZTogbnVtYmVyKTogdm9pZCB7XHJcbiAgc3dpdGNoICh0eXBlKSB7XHJcbiAgICBjYXNlIDA6XHJcbiAgICAgIHdoaWxlIChyZWFkQnl0ZShiYikgJiAweDgwKSB7fVxyXG4gICAgICBicmVhaztcclxuICAgIGNhc2UgMjpcclxuICAgICAgc2tpcChiYiwgcmVhZFZhcmludDMyKGJiKSk7XHJcbiAgICAgIGJyZWFrO1xyXG4gICAgY2FzZSA1OlxyXG4gICAgICBza2lwKGJiLCA0KTtcclxuICAgICAgYnJlYWs7XHJcbiAgICBjYXNlIDE6XHJcbiAgICAgIHNraXAoYmIsIDgpO1xyXG4gICAgICBicmVhaztcclxuICAgIGRlZmF1bHQ6XHJcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIlVuaW1wbGVtZW50ZWQgdHlwZTogXCIgKyB0eXBlKTtcclxuICB9XHJcbn1cclxuXHJcbmZ1bmN0aW9uIHN0cmluZ1RvTG9uZyh2YWx1ZTogc3RyaW5nKTogTG9uZyB7XHJcbiAgcmV0dXJuIHtcclxuICAgIGxvdzogdmFsdWUuY2hhckNvZGVBdCgwKSB8ICh2YWx1ZS5jaGFyQ29kZUF0KDEpIDw8IDE2KSxcclxuICAgIGhpZ2g6IHZhbHVlLmNoYXJDb2RlQXQoMikgfCAodmFsdWUuY2hhckNvZGVBdCgzKSA8PCAxNiksXHJcbiAgICB1bnNpZ25lZDogZmFsc2UsXHJcbiAgfTtcclxufVxyXG5cclxuZnVuY3Rpb24gbG9uZ1RvU3RyaW5nKHZhbHVlOiBMb25nKTogc3RyaW5nIHtcclxuICBsZXQgbG93ID0gdmFsdWUubG93O1xyXG4gIGxldCBoaWdoID0gdmFsdWUuaGlnaDtcclxuICByZXR1cm4gU3RyaW5nLmZyb21DaGFyQ29kZShcclxuICAgIGxvdyAmIDB4ZmZmZixcclxuICAgIGxvdyA+Pj4gMTYsXHJcbiAgICBoaWdoICYgMHhmZmZmLFxyXG4gICAgaGlnaCA+Pj4gMTZcclxuICApO1xyXG59XHJcblxyXG4vLyBUaGUgY29kZSBiZWxvdyB3YXMgbW9kaWZpZWQgZnJvbSBodHRwczovL2dpdGh1Yi5jb20vcHJvdG9idWZqcy9ieXRlYnVmZmVyLmpzXHJcbi8vIHdoaWNoIGlzIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSAyLjAuXHJcblxyXG5sZXQgZjMyID0gbmV3IEZsb2F0MzJBcnJheSgxKTtcclxubGV0IGYzMl91OCA9IG5ldyBVaW50OEFycmF5KGYzMi5idWZmZXIpO1xyXG5cclxubGV0IGY2NCA9IG5ldyBGbG9hdDY0QXJyYXkoMSk7XHJcbmxldCBmNjRfdTggPSBuZXcgVWludDhBcnJheShmNjQuYnVmZmVyKTtcclxuXHJcbmZ1bmN0aW9uIGludFRvTG9uZyh2YWx1ZTogbnVtYmVyKTogTG9uZyB7XHJcbiAgdmFsdWUgfD0gMDtcclxuICByZXR1cm4ge1xyXG4gICAgbG93OiB2YWx1ZSxcclxuICAgIGhpZ2g6IHZhbHVlID4+IDMxLFxyXG4gICAgdW5zaWduZWQ6IHZhbHVlID49IDAsXHJcbiAgfTtcclxufVxyXG5cclxubGV0IGJiU3RhY2s6IEJ5dGVCdWZmZXJbXSA9IFtdO1xyXG5cclxuZnVuY3Rpb24gcG9wQnl0ZUJ1ZmZlcigpOiBCeXRlQnVmZmVyIHtcclxuICBjb25zdCBiYiA9IGJiU3RhY2sucG9wKCk7XHJcbiAgaWYgKCFiYikgcmV0dXJuIHsgYnl0ZXM6IG5ldyBVaW50OEFycmF5KDY0KSwgb2Zmc2V0OiAwLCBsaW1pdDogMCB9O1xyXG4gIGJiLm9mZnNldCA9IGJiLmxpbWl0ID0gMDtcclxuICByZXR1cm4gYmI7XHJcbn1cclxuXHJcbmZ1bmN0aW9uIHB1c2hCeXRlQnVmZmVyKGJiOiBCeXRlQnVmZmVyKTogdm9pZCB7XHJcbiAgYmJTdGFjay5wdXNoKGJiKTtcclxufVxyXG5cclxuZnVuY3Rpb24gd3JhcEJ5dGVCdWZmZXIoYnl0ZXM6IFVpbnQ4QXJyYXkpOiBCeXRlQnVmZmVyIHtcclxuICByZXR1cm4geyBieXRlcywgb2Zmc2V0OiAwLCBsaW1pdDogYnl0ZXMubGVuZ3RoIH07XHJcbn1cclxuXHJcbmZ1bmN0aW9uIHRvVWludDhBcnJheShiYjogQnl0ZUJ1ZmZlcik6IFVpbnQ4QXJyYXkge1xyXG4gIGxldCBieXRlcyA9IGJiLmJ5dGVzO1xyXG4gIGxldCBsaW1pdCA9IGJiLmxpbWl0O1xyXG4gIHJldHVybiBieXRlcy5sZW5ndGggPT09IGxpbWl0ID8gYnl0ZXMgOiBieXRlcy5zdWJhcnJheSgwLCBsaW1pdCk7XHJcbn1cclxuXHJcbmZ1bmN0aW9uIHNraXAoYmI6IEJ5dGVCdWZmZXIsIG9mZnNldDogbnVtYmVyKTogdm9pZCB7XHJcbiAgaWYgKGJiLm9mZnNldCArIG9mZnNldCA+IGJiLmxpbWl0KSB7XHJcbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJTa2lwIHBhc3QgbGltaXRcIik7XHJcbiAgfVxyXG4gIGJiLm9mZnNldCArPSBvZmZzZXQ7XHJcbn1cclxuXHJcbmZ1bmN0aW9uIGlzQXRFbmQoYmI6IEJ5dGVCdWZmZXIpOiBib29sZWFuIHtcclxuICByZXR1cm4gYmIub2Zmc2V0ID49IGJiLmxpbWl0O1xyXG59XHJcblxyXG5mdW5jdGlvbiBncm93KGJiOiBCeXRlQnVmZmVyLCBjb3VudDogbnVtYmVyKTogbnVtYmVyIHtcclxuICBsZXQgYnl0ZXMgPSBiYi5ieXRlcztcclxuICBsZXQgb2Zmc2V0ID0gYmIub2Zmc2V0O1xyXG4gIGxldCBsaW1pdCA9IGJiLmxpbWl0O1xyXG4gIGxldCBmaW5hbE9mZnNldCA9IG9mZnNldCArIGNvdW50O1xyXG4gIGlmIChmaW5hbE9mZnNldCA+IGJ5dGVzLmxlbmd0aCkge1xyXG4gICAgbGV0IG5ld0J5dGVzID0gbmV3IFVpbnQ4QXJyYXkoZmluYWxPZmZzZXQgKiAyKTtcclxuICAgIG5ld0J5dGVzLnNldChieXRlcyk7XHJcbiAgICBiYi5ieXRlcyA9IG5ld0J5dGVzO1xyXG4gIH1cclxuICBiYi5vZmZzZXQgPSBmaW5hbE9mZnNldDtcclxuICBpZiAoZmluYWxPZmZzZXQgPiBsaW1pdCkge1xyXG4gICAgYmIubGltaXQgPSBmaW5hbE9mZnNldDtcclxuICB9XHJcbiAgcmV0dXJuIG9mZnNldDtcclxufVxyXG5cclxuZnVuY3Rpb24gYWR2YW5jZShiYjogQnl0ZUJ1ZmZlciwgY291bnQ6IG51bWJlcik6IG51bWJlciB7XHJcbiAgbGV0IG9mZnNldCA9IGJiLm9mZnNldDtcclxuICBpZiAob2Zmc2V0ICsgY291bnQgPiBiYi5saW1pdCkge1xyXG4gICAgdGhyb3cgbmV3IEVycm9yKFwiUmVhZCBwYXN0IGxpbWl0XCIpO1xyXG4gIH1cclxuICBiYi5vZmZzZXQgKz0gY291bnQ7XHJcbiAgcmV0dXJuIG9mZnNldDtcclxufVxyXG5cclxuZnVuY3Rpb24gcmVhZEJ5dGVzKGJiOiBCeXRlQnVmZmVyLCBjb3VudDogbnVtYmVyKTogVWludDhBcnJheSB7XHJcbiAgbGV0IG9mZnNldCA9IGFkdmFuY2UoYmIsIGNvdW50KTtcclxuICByZXR1cm4gYmIuYnl0ZXMuc3ViYXJyYXkob2Zmc2V0LCBvZmZzZXQgKyBjb3VudCk7XHJcbn1cclxuXHJcbmZ1bmN0aW9uIHdyaXRlQnl0ZXMoYmI6IEJ5dGVCdWZmZXIsIGJ1ZmZlcjogVWludDhBcnJheSk6IHZvaWQge1xyXG4gIGxldCBvZmZzZXQgPSBncm93KGJiLCBidWZmZXIubGVuZ3RoKTtcclxuICBiYi5ieXRlcy5zZXQoYnVmZmVyLCBvZmZzZXQpO1xyXG59XHJcblxyXG5mdW5jdGlvbiByZWFkU3RyaW5nKGJiOiBCeXRlQnVmZmVyLCBjb3VudDogbnVtYmVyKTogc3RyaW5nIHtcclxuICAvLyBTYWRseSBhIGhhbmQtY29kZWQgVVRGOCBkZWNvZGVyIGlzIG11Y2ggZmFzdGVyIHRoYW4gc3ViYXJyYXkrVGV4dERlY29kZXIgaW4gVjhcclxuICBsZXQgb2Zmc2V0ID0gYWR2YW5jZShiYiwgY291bnQpO1xyXG4gIGxldCBmcm9tQ2hhckNvZGUgPSBTdHJpbmcuZnJvbUNoYXJDb2RlO1xyXG4gIGxldCBieXRlcyA9IGJiLmJ5dGVzO1xyXG4gIGxldCBpbnZhbGlkID0gXCJcXHVGRkZEXCI7XHJcbiAgbGV0IHRleHQgPSBcIlwiO1xyXG5cclxuICBmb3IgKGxldCBpID0gMDsgaSA8IGNvdW50OyBpKyspIHtcclxuICAgIGxldCBjMSA9IGJ5dGVzW2kgKyBvZmZzZXRdLFxyXG4gICAgICBjMjogbnVtYmVyLFxyXG4gICAgICBjMzogbnVtYmVyLFxyXG4gICAgICBjNDogbnVtYmVyLFxyXG4gICAgICBjOiBudW1iZXI7XHJcblxyXG4gICAgLy8gMSBieXRlXHJcbiAgICBpZiAoKGMxICYgMHg4MCkgPT09IDApIHtcclxuICAgICAgdGV4dCArPSBmcm9tQ2hhckNvZGUoYzEpO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIDIgYnl0ZXNcclxuICAgIGVsc2UgaWYgKChjMSAmIDB4ZTApID09PSAweGMwKSB7XHJcbiAgICAgIGlmIChpICsgMSA+PSBjb3VudCkgdGV4dCArPSBpbnZhbGlkO1xyXG4gICAgICBlbHNlIHtcclxuICAgICAgICBjMiA9IGJ5dGVzW2kgKyBvZmZzZXQgKyAxXTtcclxuICAgICAgICBpZiAoKGMyICYgMHhjMCkgIT09IDB4ODApIHRleHQgKz0gaW52YWxpZDtcclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgIGMgPSAoKGMxICYgMHgxZikgPDwgNikgfCAoYzIgJiAweDNmKTtcclxuICAgICAgICAgIGlmIChjIDwgMHg4MCkgdGV4dCArPSBpbnZhbGlkO1xyXG4gICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIHRleHQgKz0gZnJvbUNoYXJDb2RlKGMpO1xyXG4gICAgICAgICAgICBpKys7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLy8gMyBieXRlc1xyXG4gICAgZWxzZSBpZiAoKGMxICYgMHhmMCkgPT0gMHhlMCkge1xyXG4gICAgICBpZiAoaSArIDIgPj0gY291bnQpIHRleHQgKz0gaW52YWxpZDtcclxuICAgICAgZWxzZSB7XHJcbiAgICAgICAgYzIgPSBieXRlc1tpICsgb2Zmc2V0ICsgMV07XHJcbiAgICAgICAgYzMgPSBieXRlc1tpICsgb2Zmc2V0ICsgMl07XHJcbiAgICAgICAgaWYgKCgoYzIgfCAoYzMgPDwgOCkpICYgMHhjMGMwKSAhPT0gMHg4MDgwKSB0ZXh0ICs9IGludmFsaWQ7XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICBjID0gKChjMSAmIDB4MGYpIDw8IDEyKSB8ICgoYzIgJiAweDNmKSA8PCA2KSB8IChjMyAmIDB4M2YpO1xyXG4gICAgICAgICAgaWYgKGMgPCAweDA4MDAgfHwgKGMgPj0gMHhkODAwICYmIGMgPD0gMHhkZmZmKSkgdGV4dCArPSBpbnZhbGlkO1xyXG4gICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIHRleHQgKz0gZnJvbUNoYXJDb2RlKGMpO1xyXG4gICAgICAgICAgICBpICs9IDI7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLy8gNCBieXRlc1xyXG4gICAgZWxzZSBpZiAoKGMxICYgMHhmOCkgPT0gMHhmMCkge1xyXG4gICAgICBpZiAoaSArIDMgPj0gY291bnQpIHRleHQgKz0gaW52YWxpZDtcclxuICAgICAgZWxzZSB7XHJcbiAgICAgICAgYzIgPSBieXRlc1tpICsgb2Zmc2V0ICsgMV07XHJcbiAgICAgICAgYzMgPSBieXRlc1tpICsgb2Zmc2V0ICsgMl07XHJcbiAgICAgICAgYzQgPSBieXRlc1tpICsgb2Zmc2V0ICsgM107XHJcbiAgICAgICAgaWYgKCgoYzIgfCAoYzMgPDwgOCkgfCAoYzQgPDwgMTYpKSAmIDB4YzBjMGMwKSAhPT0gMHg4MDgwODApXHJcbiAgICAgICAgICB0ZXh0ICs9IGludmFsaWQ7XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICBjID1cclxuICAgICAgICAgICAgKChjMSAmIDB4MDcpIDw8IDB4MTIpIHxcclxuICAgICAgICAgICAgKChjMiAmIDB4M2YpIDw8IDB4MGMpIHxcclxuICAgICAgICAgICAgKChjMyAmIDB4M2YpIDw8IDB4MDYpIHxcclxuICAgICAgICAgICAgKGM0ICYgMHgzZik7XHJcbiAgICAgICAgICBpZiAoYyA8IDB4MTAwMDAgfHwgYyA+IDB4MTBmZmZmKSB0ZXh0ICs9IGludmFsaWQ7XHJcbiAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgYyAtPSAweDEwMDAwO1xyXG4gICAgICAgICAgICB0ZXh0ICs9IGZyb21DaGFyQ29kZSgoYyA+PiAxMCkgKyAweGQ4MDAsIChjICYgMHgzZmYpICsgMHhkYzAwKTtcclxuICAgICAgICAgICAgaSArPSAzO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfSBlbHNlIHRleHQgKz0gaW52YWxpZDtcclxuICB9XHJcblxyXG4gIHJldHVybiB0ZXh0O1xyXG59XHJcblxyXG5mdW5jdGlvbiB3cml0ZVN0cmluZyhiYjogQnl0ZUJ1ZmZlciwgdGV4dDogc3RyaW5nKTogdm9pZCB7XHJcbiAgLy8gU2FkbHkgYSBoYW5kLWNvZGVkIFVURjggZW5jb2RlciBpcyBtdWNoIGZhc3RlciB0aGFuIFRleHRFbmNvZGVyK3NldCBpbiBWOFxyXG4gIGxldCBuID0gdGV4dC5sZW5ndGg7XHJcbiAgbGV0IGJ5dGVDb3VudCA9IDA7XHJcblxyXG4gIC8vIFdyaXRlIHRoZSBieXRlIGNvdW50IGZpcnN0XHJcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBuOyBpKyspIHtcclxuICAgIGxldCBjID0gdGV4dC5jaGFyQ29kZUF0KGkpO1xyXG4gICAgaWYgKGMgPj0gMHhkODAwICYmIGMgPD0gMHhkYmZmICYmIGkgKyAxIDwgbikge1xyXG4gICAgICBjID0gKGMgPDwgMTApICsgdGV4dC5jaGFyQ29kZUF0KCsraSkgLSAweDM1ZmRjMDA7XHJcbiAgICB9XHJcbiAgICBieXRlQ291bnQgKz0gYyA8IDB4ODAgPyAxIDogYyA8IDB4ODAwID8gMiA6IGMgPCAweDEwMDAwID8gMyA6IDQ7XHJcbiAgfVxyXG4gIHdyaXRlVmFyaW50MzIoYmIsIGJ5dGVDb3VudCk7XHJcblxyXG4gIGxldCBvZmZzZXQgPSBncm93KGJiLCBieXRlQ291bnQpO1xyXG4gIGxldCBieXRlcyA9IGJiLmJ5dGVzO1xyXG5cclxuICAvLyBUaGVuIHdyaXRlIHRoZSBieXRlc1xyXG4gIGZvciAobGV0IGkgPSAwOyBpIDwgbjsgaSsrKSB7XHJcbiAgICBsZXQgYyA9IHRleHQuY2hhckNvZGVBdChpKTtcclxuICAgIGlmIChjID49IDB4ZDgwMCAmJiBjIDw9IDB4ZGJmZiAmJiBpICsgMSA8IG4pIHtcclxuICAgICAgYyA9IChjIDw8IDEwKSArIHRleHQuY2hhckNvZGVBdCgrK2kpIC0gMHgzNWZkYzAwO1xyXG4gICAgfVxyXG4gICAgaWYgKGMgPCAweDgwKSB7XHJcbiAgICAgIGJ5dGVzW29mZnNldCsrXSA9IGM7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBpZiAoYyA8IDB4ODAwKSB7XHJcbiAgICAgICAgYnl0ZXNbb2Zmc2V0KytdID0gKChjID4+IDYpICYgMHgxZikgfCAweGMwO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIGlmIChjIDwgMHgxMDAwMCkge1xyXG4gICAgICAgICAgYnl0ZXNbb2Zmc2V0KytdID0gKChjID4+IDEyKSAmIDB4MGYpIHwgMHhlMDtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgYnl0ZXNbb2Zmc2V0KytdID0gKChjID4+IDE4KSAmIDB4MDcpIHwgMHhmMDtcclxuICAgICAgICAgIGJ5dGVzW29mZnNldCsrXSA9ICgoYyA+PiAxMikgJiAweDNmKSB8IDB4ODA7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGJ5dGVzW29mZnNldCsrXSA9ICgoYyA+PiA2KSAmIDB4M2YpIHwgMHg4MDtcclxuICAgICAgfVxyXG4gICAgICBieXRlc1tvZmZzZXQrK10gPSAoYyAmIDB4M2YpIHwgMHg4MDtcclxuICAgIH1cclxuICB9XHJcbn1cclxuXHJcbmZ1bmN0aW9uIHdyaXRlQnl0ZUJ1ZmZlcihiYjogQnl0ZUJ1ZmZlciwgYnVmZmVyOiBCeXRlQnVmZmVyKTogdm9pZCB7XHJcbiAgbGV0IG9mZnNldCA9IGdyb3coYmIsIGJ1ZmZlci5saW1pdCk7XHJcbiAgbGV0IGZyb20gPSBiYi5ieXRlcztcclxuICBsZXQgdG8gPSBidWZmZXIuYnl0ZXM7XHJcblxyXG4gIC8vIFRoaXMgZm9yIGxvb3AgaXMgbXVjaCBmYXN0ZXIgdGhhbiBzdWJhcnJheStzZXQgb24gVjhcclxuICBmb3IgKGxldCBpID0gMCwgbiA9IGJ1ZmZlci5saW1pdDsgaSA8IG47IGkrKykge1xyXG4gICAgZnJvbVtpICsgb2Zmc2V0XSA9IHRvW2ldO1xyXG4gIH1cclxufVxyXG5cclxuZnVuY3Rpb24gcmVhZEJ5dGUoYmI6IEJ5dGVCdWZmZXIpOiBudW1iZXIge1xyXG4gIHJldHVybiBiYi5ieXRlc1thZHZhbmNlKGJiLCAxKV07XHJcbn1cclxuXHJcbmZ1bmN0aW9uIHdyaXRlQnl0ZShiYjogQnl0ZUJ1ZmZlciwgdmFsdWU6IG51bWJlcik6IHZvaWQge1xyXG4gIGxldCBvZmZzZXQgPSBncm93KGJiLCAxKTtcclxuICBiYi5ieXRlc1tvZmZzZXRdID0gdmFsdWU7XHJcbn1cclxuXHJcbmZ1bmN0aW9uIHJlYWRGbG9hdChiYjogQnl0ZUJ1ZmZlcik6IG51bWJlciB7XHJcbiAgbGV0IG9mZnNldCA9IGFkdmFuY2UoYmIsIDQpO1xyXG4gIGxldCBieXRlcyA9IGJiLmJ5dGVzO1xyXG5cclxuICAvLyBNYW51YWwgY29weWluZyBpcyBtdWNoIGZhc3RlciB0aGFuIHN1YmFycmF5K3NldCBpbiBWOFxyXG4gIGYzMl91OFswXSA9IGJ5dGVzW29mZnNldCsrXTtcclxuICBmMzJfdThbMV0gPSBieXRlc1tvZmZzZXQrK107XHJcbiAgZjMyX3U4WzJdID0gYnl0ZXNbb2Zmc2V0KytdO1xyXG4gIGYzMl91OFszXSA9IGJ5dGVzW29mZnNldCsrXTtcclxuICByZXR1cm4gZjMyWzBdO1xyXG59XHJcblxyXG5mdW5jdGlvbiB3cml0ZUZsb2F0KGJiOiBCeXRlQnVmZmVyLCB2YWx1ZTogbnVtYmVyKTogdm9pZCB7XHJcbiAgbGV0IG9mZnNldCA9IGdyb3coYmIsIDQpO1xyXG4gIGxldCBieXRlcyA9IGJiLmJ5dGVzO1xyXG4gIGYzMlswXSA9IHZhbHVlO1xyXG5cclxuICAvLyBNYW51YWwgY29weWluZyBpcyBtdWNoIGZhc3RlciB0aGFuIHN1YmFycmF5K3NldCBpbiBWOFxyXG4gIGJ5dGVzW29mZnNldCsrXSA9IGYzMl91OFswXTtcclxuICBieXRlc1tvZmZzZXQrK10gPSBmMzJfdThbMV07XHJcbiAgYnl0ZXNbb2Zmc2V0KytdID0gZjMyX3U4WzJdO1xyXG4gIGJ5dGVzW29mZnNldCsrXSA9IGYzMl91OFszXTtcclxufVxyXG5cclxuZnVuY3Rpb24gcmVhZERvdWJsZShiYjogQnl0ZUJ1ZmZlcik6IG51bWJlciB7XHJcbiAgbGV0IG9mZnNldCA9IGFkdmFuY2UoYmIsIDgpO1xyXG4gIGxldCBieXRlcyA9IGJiLmJ5dGVzO1xyXG5cclxuICAvLyBNYW51YWwgY29weWluZyBpcyBtdWNoIGZhc3RlciB0aGFuIHN1YmFycmF5K3NldCBpbiBWOFxyXG4gIGY2NF91OFswXSA9IGJ5dGVzW29mZnNldCsrXTtcclxuICBmNjRfdThbMV0gPSBieXRlc1tvZmZzZXQrK107XHJcbiAgZjY0X3U4WzJdID0gYnl0ZXNbb2Zmc2V0KytdO1xyXG4gIGY2NF91OFszXSA9IGJ5dGVzW29mZnNldCsrXTtcclxuICBmNjRfdThbNF0gPSBieXRlc1tvZmZzZXQrK107XHJcbiAgZjY0X3U4WzVdID0gYnl0ZXNbb2Zmc2V0KytdO1xyXG4gIGY2NF91OFs2XSA9IGJ5dGVzW29mZnNldCsrXTtcclxuICBmNjRfdThbN10gPSBieXRlc1tvZmZzZXQrK107XHJcbiAgcmV0dXJuIGY2NFswXTtcclxufVxyXG5cclxuZnVuY3Rpb24gd3JpdGVEb3VibGUoYmI6IEJ5dGVCdWZmZXIsIHZhbHVlOiBudW1iZXIpOiB2b2lkIHtcclxuICBsZXQgb2Zmc2V0ID0gZ3JvdyhiYiwgOCk7XHJcbiAgbGV0IGJ5dGVzID0gYmIuYnl0ZXM7XHJcbiAgZjY0WzBdID0gdmFsdWU7XHJcblxyXG4gIC8vIE1hbnVhbCBjb3B5aW5nIGlzIG11Y2ggZmFzdGVyIHRoYW4gc3ViYXJyYXkrc2V0IGluIFY4XHJcbiAgYnl0ZXNbb2Zmc2V0KytdID0gZjY0X3U4WzBdO1xyXG4gIGJ5dGVzW29mZnNldCsrXSA9IGY2NF91OFsxXTtcclxuICBieXRlc1tvZmZzZXQrK10gPSBmNjRfdThbMl07XHJcbiAgYnl0ZXNbb2Zmc2V0KytdID0gZjY0X3U4WzNdO1xyXG4gIGJ5dGVzW29mZnNldCsrXSA9IGY2NF91OFs0XTtcclxuICBieXRlc1tvZmZzZXQrK10gPSBmNjRfdThbNV07XHJcbiAgYnl0ZXNbb2Zmc2V0KytdID0gZjY0X3U4WzZdO1xyXG4gIGJ5dGVzW29mZnNldCsrXSA9IGY2NF91OFs3XTtcclxufVxyXG5cclxuZnVuY3Rpb24gcmVhZEludDMyKGJiOiBCeXRlQnVmZmVyKTogbnVtYmVyIHtcclxuICBsZXQgb2Zmc2V0ID0gYWR2YW5jZShiYiwgNCk7XHJcbiAgbGV0IGJ5dGVzID0gYmIuYnl0ZXM7XHJcbiAgcmV0dXJuIChcclxuICAgIGJ5dGVzW29mZnNldF0gfFxyXG4gICAgKGJ5dGVzW29mZnNldCArIDFdIDw8IDgpIHxcclxuICAgIChieXRlc1tvZmZzZXQgKyAyXSA8PCAxNikgfFxyXG4gICAgKGJ5dGVzW29mZnNldCArIDNdIDw8IDI0KVxyXG4gICk7XHJcbn1cclxuXHJcbmZ1bmN0aW9uIHdyaXRlSW50MzIoYmI6IEJ5dGVCdWZmZXIsIHZhbHVlOiBudW1iZXIpOiB2b2lkIHtcclxuICBsZXQgb2Zmc2V0ID0gZ3JvdyhiYiwgNCk7XHJcbiAgbGV0IGJ5dGVzID0gYmIuYnl0ZXM7XHJcbiAgYnl0ZXNbb2Zmc2V0XSA9IHZhbHVlO1xyXG4gIGJ5dGVzW29mZnNldCArIDFdID0gdmFsdWUgPj4gODtcclxuICBieXRlc1tvZmZzZXQgKyAyXSA9IHZhbHVlID4+IDE2O1xyXG4gIGJ5dGVzW29mZnNldCArIDNdID0gdmFsdWUgPj4gMjQ7XHJcbn1cclxuXHJcbmZ1bmN0aW9uIHJlYWRJbnQ2NChiYjogQnl0ZUJ1ZmZlciwgdW5zaWduZWQ6IGJvb2xlYW4pOiBMb25nIHtcclxuICByZXR1cm4ge1xyXG4gICAgbG93OiByZWFkSW50MzIoYmIpLFxyXG4gICAgaGlnaDogcmVhZEludDMyKGJiKSxcclxuICAgIHVuc2lnbmVkLFxyXG4gIH07XHJcbn1cclxuXHJcbmZ1bmN0aW9uIHdyaXRlSW50NjQoYmI6IEJ5dGVCdWZmZXIsIHZhbHVlOiBMb25nKTogdm9pZCB7XHJcbiAgd3JpdGVJbnQzMihiYiwgdmFsdWUubG93KTtcclxuICB3cml0ZUludDMyKGJiLCB2YWx1ZS5oaWdoKTtcclxufVxyXG5cclxuZnVuY3Rpb24gcmVhZFZhcmludDMyKGJiOiBCeXRlQnVmZmVyKTogbnVtYmVyIHtcclxuICBsZXQgYyA9IDA7XHJcbiAgbGV0IHZhbHVlID0gMDtcclxuICBsZXQgYjogbnVtYmVyO1xyXG4gIGRvIHtcclxuICAgIGIgPSByZWFkQnl0ZShiYik7XHJcbiAgICBpZiAoYyA8IDMyKSB2YWx1ZSB8PSAoYiAmIDB4N2YpIDw8IGM7XHJcbiAgICBjICs9IDc7XHJcbiAgfSB3aGlsZSAoYiAmIDB4ODApO1xyXG4gIHJldHVybiB2YWx1ZTtcclxufVxyXG5cclxuZnVuY3Rpb24gd3JpdGVWYXJpbnQzMihiYjogQnl0ZUJ1ZmZlciwgdmFsdWU6IG51bWJlcik6IHZvaWQge1xyXG4gIHZhbHVlID4+Pj0gMDtcclxuICB3aGlsZSAodmFsdWUgPj0gMHg4MCkge1xyXG4gICAgd3JpdGVCeXRlKGJiLCAodmFsdWUgJiAweDdmKSB8IDB4ODApO1xyXG4gICAgdmFsdWUgPj4+PSA3O1xyXG4gIH1cclxuICB3cml0ZUJ5dGUoYmIsIHZhbHVlKTtcclxufVxyXG5cclxuZnVuY3Rpb24gcmVhZFZhcmludDY0KGJiOiBCeXRlQnVmZmVyLCB1bnNpZ25lZDogYm9vbGVhbik6IExvbmcge1xyXG4gIGxldCBwYXJ0MCA9IDA7XHJcbiAgbGV0IHBhcnQxID0gMDtcclxuICBsZXQgcGFydDIgPSAwO1xyXG4gIGxldCBiOiBudW1iZXI7XHJcblxyXG4gIGIgPSByZWFkQnl0ZShiYik7XHJcbiAgcGFydDAgPSBiICYgMHg3ZjtcclxuICBpZiAoYiAmIDB4ODApIHtcclxuICAgIGIgPSByZWFkQnl0ZShiYik7XHJcbiAgICBwYXJ0MCB8PSAoYiAmIDB4N2YpIDw8IDc7XHJcbiAgICBpZiAoYiAmIDB4ODApIHtcclxuICAgICAgYiA9IHJlYWRCeXRlKGJiKTtcclxuICAgICAgcGFydDAgfD0gKGIgJiAweDdmKSA8PCAxNDtcclxuICAgICAgaWYgKGIgJiAweDgwKSB7XHJcbiAgICAgICAgYiA9IHJlYWRCeXRlKGJiKTtcclxuICAgICAgICBwYXJ0MCB8PSAoYiAmIDB4N2YpIDw8IDIxO1xyXG4gICAgICAgIGlmIChiICYgMHg4MCkge1xyXG4gICAgICAgICAgYiA9IHJlYWRCeXRlKGJiKTtcclxuICAgICAgICAgIHBhcnQxID0gYiAmIDB4N2Y7XHJcbiAgICAgICAgICBpZiAoYiAmIDB4ODApIHtcclxuICAgICAgICAgICAgYiA9IHJlYWRCeXRlKGJiKTtcclxuICAgICAgICAgICAgcGFydDEgfD0gKGIgJiAweDdmKSA8PCA3O1xyXG4gICAgICAgICAgICBpZiAoYiAmIDB4ODApIHtcclxuICAgICAgICAgICAgICBiID0gcmVhZEJ5dGUoYmIpO1xyXG4gICAgICAgICAgICAgIHBhcnQxIHw9IChiICYgMHg3ZikgPDwgMTQ7XHJcbiAgICAgICAgICAgICAgaWYgKGIgJiAweDgwKSB7XHJcbiAgICAgICAgICAgICAgICBiID0gcmVhZEJ5dGUoYmIpO1xyXG4gICAgICAgICAgICAgICAgcGFydDEgfD0gKGIgJiAweDdmKSA8PCAyMTtcclxuICAgICAgICAgICAgICAgIGlmIChiICYgMHg4MCkge1xyXG4gICAgICAgICAgICAgICAgICBiID0gcmVhZEJ5dGUoYmIpO1xyXG4gICAgICAgICAgICAgICAgICBwYXJ0MiA9IGIgJiAweDdmO1xyXG4gICAgICAgICAgICAgICAgICBpZiAoYiAmIDB4ODApIHtcclxuICAgICAgICAgICAgICAgICAgICBiID0gcmVhZEJ5dGUoYmIpO1xyXG4gICAgICAgICAgICAgICAgICAgIHBhcnQyIHw9IChiICYgMHg3ZikgPDwgNztcclxuICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcmV0dXJuIHtcclxuICAgIGxvdzogcGFydDAgfCAocGFydDEgPDwgMjgpLFxyXG4gICAgaGlnaDogKHBhcnQxID4+PiA0KSB8IChwYXJ0MiA8PCAyNCksXHJcbiAgICB1bnNpZ25lZCxcclxuICB9O1xyXG59XHJcblxyXG5mdW5jdGlvbiB3cml0ZVZhcmludDY0KGJiOiBCeXRlQnVmZmVyLCB2YWx1ZTogTG9uZyk6IHZvaWQge1xyXG4gIGxldCBwYXJ0MCA9IHZhbHVlLmxvdyA+Pj4gMDtcclxuICBsZXQgcGFydDEgPSAoKHZhbHVlLmxvdyA+Pj4gMjgpIHwgKHZhbHVlLmhpZ2ggPDwgNCkpID4+PiAwO1xyXG4gIGxldCBwYXJ0MiA9IHZhbHVlLmhpZ2ggPj4+IDI0O1xyXG5cclxuICAvLyByZWY6IHNyYy9nb29nbGUvcHJvdG9idWYvaW8vY29kZWRfc3RyZWFtLmNjXHJcbiAgbGV0IHNpemUgPVxyXG4gICAgcGFydDIgPT09IDBcclxuICAgICAgPyBwYXJ0MSA9PT0gMFxyXG4gICAgICAgID8gcGFydDAgPCAxIDw8IDE0XHJcbiAgICAgICAgICA/IHBhcnQwIDwgMSA8PCA3XHJcbiAgICAgICAgICAgID8gMVxyXG4gICAgICAgICAgICA6IDJcclxuICAgICAgICAgIDogcGFydDAgPCAxIDw8IDIxXHJcbiAgICAgICAgICA/IDNcclxuICAgICAgICAgIDogNFxyXG4gICAgICAgIDogcGFydDEgPCAxIDw8IDE0XHJcbiAgICAgICAgPyBwYXJ0MSA8IDEgPDwgN1xyXG4gICAgICAgICAgPyA1XHJcbiAgICAgICAgICA6IDZcclxuICAgICAgICA6IHBhcnQxIDwgMSA8PCAyMVxyXG4gICAgICAgID8gN1xyXG4gICAgICAgIDogOFxyXG4gICAgICA6IHBhcnQyIDwgMSA8PCA3XHJcbiAgICAgID8gOVxyXG4gICAgICA6IDEwO1xyXG5cclxuICBsZXQgb2Zmc2V0ID0gZ3JvdyhiYiwgc2l6ZSk7XHJcbiAgbGV0IGJ5dGVzID0gYmIuYnl0ZXM7XHJcblxyXG4gIHN3aXRjaCAoc2l6ZSkge1xyXG4gICAgY2FzZSAxMDpcclxuICAgICAgYnl0ZXNbb2Zmc2V0ICsgOV0gPSAocGFydDIgPj4+IDcpICYgMHgwMTtcclxuICAgICAgYnJlYWs7XHJcbiAgICBjYXNlIDk6XHJcbiAgICAgIGJ5dGVzW29mZnNldCArIDhdID0gc2l6ZSAhPT0gOSA/IHBhcnQyIHwgMHg4MCA6IHBhcnQyICYgMHg3ZjtcclxuICAgICAgYnJlYWs7XHJcbiAgICBjYXNlIDg6XHJcbiAgICAgIGJ5dGVzW29mZnNldCArIDddID1cclxuICAgICAgICBzaXplICE9PSA4ID8gKHBhcnQxID4+PiAyMSkgfCAweDgwIDogKHBhcnQxID4+PiAyMSkgJiAweDdmO1xyXG4gICAgICBicmVhaztcclxuICAgIGNhc2UgNzpcclxuICAgICAgYnl0ZXNbb2Zmc2V0ICsgNl0gPVxyXG4gICAgICAgIHNpemUgIT09IDcgPyAocGFydDEgPj4+IDE0KSB8IDB4ODAgOiAocGFydDEgPj4+IDE0KSAmIDB4N2Y7XHJcbiAgICAgIGJyZWFrO1xyXG4gICAgY2FzZSA2OlxyXG4gICAgICBieXRlc1tvZmZzZXQgKyA1XSA9XHJcbiAgICAgICAgc2l6ZSAhPT0gNiA/IChwYXJ0MSA+Pj4gNykgfCAweDgwIDogKHBhcnQxID4+PiA3KSAmIDB4N2Y7XHJcbiAgICAgIGJyZWFrO1xyXG4gICAgY2FzZSA1OlxyXG4gICAgICBieXRlc1tvZmZzZXQgKyA0XSA9IHNpemUgIT09IDUgPyBwYXJ0MSB8IDB4ODAgOiBwYXJ0MSAmIDB4N2Y7XHJcbiAgICAgIGJyZWFrO1xyXG4gICAgY2FzZSA0OlxyXG4gICAgICBieXRlc1tvZmZzZXQgKyAzXSA9XHJcbiAgICAgICAgc2l6ZSAhPT0gNCA/IChwYXJ0MCA+Pj4gMjEpIHwgMHg4MCA6IChwYXJ0MCA+Pj4gMjEpICYgMHg3ZjtcclxuICAgICAgYnJlYWs7XHJcbiAgICBjYXNlIDM6XHJcbiAgICAgIGJ5dGVzW29mZnNldCArIDJdID1cclxuICAgICAgICBzaXplICE9PSAzID8gKHBhcnQwID4+PiAxNCkgfCAweDgwIDogKHBhcnQwID4+PiAxNCkgJiAweDdmO1xyXG4gICAgICBicmVhaztcclxuICAgIGNhc2UgMjpcclxuICAgICAgYnl0ZXNbb2Zmc2V0ICsgMV0gPVxyXG4gICAgICAgIHNpemUgIT09IDIgPyAocGFydDAgPj4+IDcpIHwgMHg4MCA6IChwYXJ0MCA+Pj4gNykgJiAweDdmO1xyXG4gICAgICBicmVhaztcclxuICAgIGNhc2UgMTpcclxuICAgICAgYnl0ZXNbb2Zmc2V0XSA9IHNpemUgIT09IDEgPyBwYXJ0MCB8IDB4ODAgOiBwYXJ0MCAmIDB4N2Y7XHJcbiAgfVxyXG59XHJcblxyXG5mdW5jdGlvbiByZWFkVmFyaW50MzJaaWdaYWcoYmI6IEJ5dGVCdWZmZXIpOiBudW1iZXIge1xyXG4gIGxldCB2YWx1ZSA9IHJlYWRWYXJpbnQzMihiYik7XHJcblxyXG4gIC8vIHJlZjogc3JjL2dvb2dsZS9wcm90b2J1Zi93aXJlX2Zvcm1hdF9saXRlLmhcclxuICByZXR1cm4gKHZhbHVlID4+PiAxKSBeIC0odmFsdWUgJiAxKTtcclxufVxyXG5cclxuZnVuY3Rpb24gd3JpdGVWYXJpbnQzMlppZ1phZyhiYjogQnl0ZUJ1ZmZlciwgdmFsdWU6IG51bWJlcik6IHZvaWQge1xyXG4gIC8vIHJlZjogc3JjL2dvb2dsZS9wcm90b2J1Zi93aXJlX2Zvcm1hdF9saXRlLmhcclxuICB3cml0ZVZhcmludDMyKGJiLCAodmFsdWUgPDwgMSkgXiAodmFsdWUgPj4gMzEpKTtcclxufVxyXG5cclxuZnVuY3Rpb24gcmVhZFZhcmludDY0WmlnWmFnKGJiOiBCeXRlQnVmZmVyKTogTG9uZyB7XHJcbiAgbGV0IHZhbHVlID0gcmVhZFZhcmludDY0KGJiLCAvKiB1bnNpZ25lZCAqLyBmYWxzZSk7XHJcbiAgbGV0IGxvdyA9IHZhbHVlLmxvdztcclxuICBsZXQgaGlnaCA9IHZhbHVlLmhpZ2g7XHJcbiAgbGV0IGZsaXAgPSAtKGxvdyAmIDEpO1xyXG5cclxuICAvLyByZWY6IHNyYy9nb29nbGUvcHJvdG9idWYvd2lyZV9mb3JtYXRfbGl0ZS5oXHJcbiAgcmV0dXJuIHtcclxuICAgIGxvdzogKChsb3cgPj4+IDEpIHwgKGhpZ2ggPDwgMzEpKSBeIGZsaXAsXHJcbiAgICBoaWdoOiAoaGlnaCA+Pj4gMSkgXiBmbGlwLFxyXG4gICAgdW5zaWduZWQ6IGZhbHNlLFxyXG4gIH07XHJcbn1cclxuXHJcbmZ1bmN0aW9uIHdyaXRlVmFyaW50NjRaaWdaYWcoYmI6IEJ5dGVCdWZmZXIsIHZhbHVlOiBMb25nKTogdm9pZCB7XHJcbiAgbGV0IGxvdyA9IHZhbHVlLmxvdztcclxuICBsZXQgaGlnaCA9IHZhbHVlLmhpZ2g7XHJcbiAgbGV0IGZsaXAgPSBoaWdoID4+IDMxO1xyXG5cclxuICAvLyByZWY6IHNyYy9nb29nbGUvcHJvdG9idWYvd2lyZV9mb3JtYXRfbGl0ZS5oXHJcbiAgd3JpdGVWYXJpbnQ2NChiYiwge1xyXG4gICAgbG93OiAobG93IDw8IDEpIF4gZmxpcCxcclxuICAgIGhpZ2g6ICgoaGlnaCA8PCAxKSB8IChsb3cgPj4+IDMxKSkgXiBmbGlwLFxyXG4gICAgdW5zaWduZWQ6IGZhbHNlLFxyXG4gIH0pO1xyXG59XHJcbiJdLCJtYXBwaW5ncyI6IkFBV08sZ0JBQVMsY0FBYyxTQUE4QjtBQUMxRCxNQUFJLEtBQUssY0FBYztBQUN2QixpQkFBZSxTQUFTLEVBQUU7QUFDMUIsU0FBTyxhQUFhLEVBQUU7QUFDeEI7QUFFQSxTQUFTLGVBQWUsU0FBa0IsSUFBc0I7QUFFOUQsTUFBSSxPQUFPLFFBQVE7QUFDbkIsTUFBSSxTQUFTLFFBQVc7QUFDdEIsa0JBQWMsSUFBSSxFQUFFO0FBQ3BCLGdCQUFZLElBQUksSUFBSTtBQUFBLEVBQ3RCO0FBR0EsTUFBSSxPQUFPLFFBQVE7QUFDbkIsTUFBSSxTQUFTLFFBQVc7QUFDdEIsa0JBQWMsSUFBSSxFQUFFO0FBQ3BCLGdCQUFZLElBQUksSUFBSTtBQUFBLEVBQ3RCO0FBR0EsTUFBSSxTQUFTLFFBQVE7QUFDckIsTUFBSSxXQUFXLFFBQVc7QUFDeEIsa0JBQWMsSUFBSSxFQUFFO0FBQ3BCLGdCQUFZLElBQUksTUFBTTtBQUFBLEVBQ3hCO0FBR0EsTUFBSSxRQUFRLFFBQVE7QUFDcEIsTUFBSSxVQUFVLFFBQVc7QUFDdkIsa0JBQWMsSUFBSSxFQUFFO0FBQ3BCLGdCQUFZLElBQUksS0FBSztBQUFBLEVBQ3ZCO0FBR0EsTUFBSSxTQUFTLFFBQVE7QUFDckIsTUFBSSxXQUFXLFFBQVc7QUFDeEIsa0JBQWMsSUFBSSxFQUFFO0FBQ3BCLGVBQVcsSUFBSSxNQUFNO0FBQUEsRUFDdkI7QUFHQSxNQUFJLFNBQVMsUUFBUTtBQUNyQixNQUFJLFdBQVcsUUFBVztBQUN4QixrQkFBYyxJQUFJLEVBQUU7QUFDcEIsZUFBVyxJQUFJLE1BQU07QUFBQSxFQUN2QjtBQUdBLE1BQUksU0FBUyxRQUFRO0FBQ3JCLE1BQUksV0FBVyxRQUFXO0FBQ3hCLGtCQUFjLElBQUksRUFBRTtBQUNwQixrQkFBYyxJQUFJLFVBQVUsTUFBTSxDQUFDO0FBQUEsRUFDckM7QUFH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