You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

32438 line
3.7MB

  1. (self["webpackChunk"] = self["webpackChunk"] || []).push([["vendors-node_modules_xlsx_xlsx_js"],{
  2. /***/ "./node_modules/xlsx/dist/cpexcel.js":
  3. /*!*******************************************!*\
  4. !*** ./node_modules/xlsx/dist/cpexcel.js ***!
  5. \*******************************************/
  6. /***/ (function(module) {
  7. /*! cpexcel.js (C) 2013-present SheetJS -- http://sheetjs.com */
  8. /*jshint -W100 */
  9. var cptable = {version:"1.15.0"};
  10. cptable[437] = (function(){ var d = "\u0000\u0001\u0002\u0003\u0004\u0005\u0006\u0007\b\t\n\u000b\f\r\u000e\u000f\u0010\u0011\u0012\u0013\u0014\u0015\u0016\u0017\u0018\u0019\u001a\u001b\u001c\u001d\u001e\u001f !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~ÇüéâäàåçêëèïîìÄÅÉæÆôöòûùÿÖÜ¢£¥₧ƒáíóúñѪº¿⌐¬½¼¡«»░▒▓│┤╡╢╖╕╣║╗╝╜╛┐└┴┬├─┼╞╟╚╔╩╦╠═╬╧╨╤╥╙╘╒╓╫╪┘┌█▄▌▐▀αßΓπΣσµτΦΘΩδ∞φε∩≡±≥≤⌠⌡÷≈°∙·√ⁿ²■ ", D = [], e = {}; for(var i=0;i!=d.length;++i) { if(d.charCodeAt(i) !== 0xFFFD) e[d.charAt(i)] = i; D[i] = d.charAt(i); } return {"enc": e, "dec": D }; })();
  11. cptable[620] = (function(){ var d = "\u0000\u0001\u0002\u0003\u0004\u0005\u0006\u0007\b\t\n\u000b\f\r\u000e\u000f\u0010\u0011\u0012\u0013\u0014\u0015\u0016\u0017\u0018\u0019\u001a\u001b\u001c\u001d\u001e\u001f !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~ÇüéâäàąçêëèïîćÄĄĘęłôöĆûùŚÖÜ¢Ł¥śƒŹŻóÓńŃźż¿⌐¬½¼¡«»░▒▓│┤╡╢╖╕╣║╗╝╜╛┐└┴┬├─┼╞╟╚╔╩╦╠═╬╧╨╤╥╙╘╒╓╫╪┘┌█▄▌▐▀αßΓπΣσµτΦΘΩδ∞φε∩≡±≥≤⌠⌡÷≈°∙·√ⁿ²■ ", D = [], e = {}; for(var i=0;i!=d.length;++i) { if(d.charCodeAt(i) !== 0xFFFD) e[d.charAt(i)] = i; D[i] = d.charAt(i); } return {"enc": e, "dec": D }; })();
  12. cptable[737] = (function(){ var d = "\u0000\u0001\u0002\u0003\u0004\u0005\u0006\u0007\b\t\n\u000b\f\r\u000e\u000f\u0010\u0011\u0012\u0013\u0014\u0015\u0016\u0017\u0018\u0019\u001a\u001b\u001c\u001d\u001e\u001f !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~ΑΒΓΔΕΖΗΘΙΚΛΜΝΞΟΠΡΣΤΥΦΧΨΩαβγδεζηθικλμνξοπρσςτυφχψ░▒▓│┤╡╢╖╕╣║╗╝╜╛┐└┴┬├─┼╞╟╚╔╩╦╠═╬╧╨╤╥╙╘╒╓╫╪┘┌█▄▌▐▀ωάέήϊίόύϋώΆΈΉΊΌΎΏ±≥≤ΪΫ÷≈°∙·√ⁿ²■ ", D = [], e = {}; for(var i=0;i!=d.length;++i) { if(d.charCodeAt(i) !== 0xFFFD) e[d.charAt(i)] = i; D[i] = d.charAt(i); } return {"enc": e, "dec": D }; })();
  13. cptable[850] = (function(){ var d = "\u0000\u0001\u0002\u0003\u0004\u0005\u0006\u0007\b\t\n\u000b\f\r\u000e\u000f\u0010\u0011\u0012\u0013\u0014\u0015\u0016\u0017\u0018\u0019\u001a\u001b\u001c\u001d\u001e\u001f !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~ÇüéâäàåçêëèïîìÄÅÉæÆôöòûùÿÖÜø£Ø׃áíóúñѪº¿®¬½¼¡«»░▒▓│┤ÁÂÀ©╣║╗╝¢¥┐└┴┬├─┼ãÃ╚╔╩╦╠═╬¤ðÐÊËÈıÍÎÏ┘┌█▄¦Ì▀ÓßÔÒõÕµþÞÚÛÙýݯ´­±‗¾¶§÷¸°¨·¹³²■ ", D = [], e = {}; for(var i=0;i!=d.length;++i) { if(d.charCodeAt(i) !== 0xFFFD) e[d.charAt(i)] = i; D[i] = d.charAt(i); } return {"enc": e, "dec": D }; })();
  14. cptable[852] = (function(){ var d = "\u0000\u0001\u0002\u0003\u0004\u0005\u0006\u0007\b\t\n\u000b\f\r\u000e\u000f\u0010\u0011\u0012\u0013\u0014\u0015\u0016\u0017\u0018\u0019\u001a\u001b\u001c\u001d\u001e\u001f !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~ÇüéâäůćçłëŐőîŹÄĆÉĹĺôöĽľŚśÖÜŤťŁ×čáíóúĄąŽžĘ꬟Ⱥ«»░▒▓│┤ÁÂĚŞ╣║╗╝Żż┐└┴┬├─┼Ăă╚╔╩╦╠═╬¤đĐĎËďŇÍÎě┘┌█▄ŢŮ▀ÓßÔŃńňŠšŔÚŕŰýÝţ´­˝˛ˇ˘§÷¸°¨˙űŘř■ ", D = [], e = {}; for(var i=0;i!=d.length;++i) { if(d.charCodeAt(i) !== 0xFFFD) e[d.charAt(i)] = i; D[i] = d.charAt(i); } return {"enc": e, "dec": D }; })();
  15. cptable[857] = (function(){ var d = "\u0000\u0001\u0002\u0003\u0004\u0005\u0006\u0007\b\t\n\u000b\f\r\u000e\u000f\u0010\u0011\u0012\u0013\u0014\u0015\u0016\u0017\u0018\u0019\u001a\u001b\u001c\u001d\u001e\u001f !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~ÇüéâäàåçêëèïîıÄÅÉæÆôöòûùİÖÜø£ØŞşáíóúñÑĞ𿮬½¼¡«»░▒▓│┤ÁÂÀ©╣║╗╝¢¥┐└┴┬├─┼ãÃ╚╔╩╦╠═╬¤ºªÊËÈ�ÍÎÏ┘┌█▄¦Ì▀ÓßÔÒõÕµ�×ÚÛÙìÿ¯´­±�¾¶§÷¸°¨·¹³²■ ", D = [], e = {}; for(var i=0;i!=d.length;++i) { if(d.charCodeAt(i) !== 0xFFFD) e[d.charAt(i)] = i; D[i] = d.charAt(i); } return {"enc": e, "dec": D }; })();
  16. cptable[861] = (function(){ var d = "\u0000\u0001\u0002\u0003\u0004\u0005\u0006\u0007\b\t\n\u000b\f\r\u000e\u000f\u0010\u0011\u0012\u0013\u0014\u0015\u0016\u0017\u0018\u0019\u001a\u001b\u001c\u001d\u001e\u001f !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~ÇüéâäàåçêëèÐðÞÄÅÉæÆôöþûÝýÖÜø£Ø₧ƒáíóúÁÍÓÚ¿⌐¬½¼¡«»░▒▓│┤╡╢╖╕╣║╗╝╜╛┐└┴┬├─┼╞╟╚╔╩╦╠═╬╧╨╤╥╙╘╒╓╫╪┘┌█▄▌▐▀αßΓπΣσµτΦΘΩδ∞φε∩≡±≥≤⌠⌡÷≈°∙·√ⁿ²■ ", D = [], e = {}; for(var i=0;i!=d.length;++i) { if(d.charCodeAt(i) !== 0xFFFD) e[d.charAt(i)] = i; D[i] = d.charAt(i); } return {"enc": e, "dec": D }; })();
  17. cptable[865] = (function(){ var d = "\u0000\u0001\u0002\u0003\u0004\u0005\u0006\u0007\b\t\n\u000b\f\r\u000e\u000f\u0010\u0011\u0012\u0013\u0014\u0015\u0016\u0017\u0018\u0019\u001a\u001b\u001c\u001d\u001e\u001f !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~ÇüéâäàåçêëèïîìÄÅÉæÆôöòûùÿÖÜø£Ø₧ƒáíóúñѪº¿⌐¬½¼¡«¤░▒▓│┤╡╢╖╕╣║╗╝╜╛┐└┴┬├─┼╞╟╚╔╩╦╠═╬╧╨╤╥╙╘╒╓╫╪┘┌█▄▌▐▀αßΓπΣσµτΦΘΩδ∞φε∩≡±≥≤⌠⌡÷≈°∙·√ⁿ²■ ", D = [], e = {}; for(var i=0;i!=d.length;++i) { if(d.charCodeAt(i) !== 0xFFFD) e[d.charAt(i)] = i; D[i] = d.charAt(i); } return {"enc": e, "dec": D }; })();
  18. cptable[866] = (function(){ var d = "\u0000\u0001\u0002\u0003\u0004\u0005\u0006\u0007\b\t\n\u000b\f\r\u000e\u000f\u0010\u0011\u0012\u0013\u0014\u0015\u0016\u0017\u0018\u0019\u001a\u001b\u001c\u001d\u001e\u001f !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~АБВГДЕЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯабвгдежзийклмноп░▒▓│┤╡╢╖╕╣║╗╝╜╛┐└┴┬├─┼╞╟╚╔╩╦╠═╬╧╨╤╥╙╘╒╓╫╪┘┌█▄▌▐▀рстуфхцчшщъыьэюяЁёЄєЇїЎў°∙·√№¤■ ", D = [], e = {}; for(var i=0;i!=d.length;++i) { if(d.charCodeAt(i) !== 0xFFFD) e[d.charAt(i)] = i; D[i] = d.charAt(i); } return {"enc": e, "dec": D }; })();
  19. cptable[874] = (function(){ var d = "\u0000\u0001\u0002\u0003\u0004\u0005\u0006\u0007\b\t\n\u000b\f\r\u000e\u000f\u0010\u0011\u0012\u0013\u0014\u0015\u0016\u0017\u0018\u0019\u001a\u001b\u001c\u001d\u001e\u001f !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~€����…�����������‘’“”•–—�������� กขฃคฅฆงจฉชซฌญฎฏฐฑฒณดตถทธนบปผฝพฟภมยรฤลฦวศษสหฬอฮฯะัาำิีึืฺุู����฿เแโใไๅๆ็่้๊๋์ํ๎๏๐๑๒๓๔๕๖๗๘๙๚๛����", D = [], e = {}; for(var i=0;i!=d.length;++i) { if(d.charCodeAt(i) !== 0xFFFD) e[d.charAt(i)] = i; D[i] = d.charAt(i); } return {"enc": e, "dec": D }; })();
  20. cptable[895] = (function(){ var d = "\u0000\u0001\u0002\u0003\u0004\u0005\u0006\u0007\b\t\n\u000b\f\r\u000e\u000f\u0010\u0011\u0012\u0013\u0014\u0015\u0016\u0017\u0018\u0019\u001a\u001b\u001c\u001d\u001e\u001f !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~ČüéďäĎŤčěĚĹÍľǪÄÁÉžŽôöÓůÚýÖÜŠĽÝŘťáíóúňŇŮÔšřŕŔ¼§«»░▒▓│┤╡╢╖╕╣║╗╝╜╛┐└┴┬├─┼╞╟╚╔╩╦╠═╬╧╨╤╥╙╘╒╓╫╪┘┌█▄▌▐▀αßΓπΣσµτΦΘΩδ∞φε∩≡±≥≤⌠⌡÷≈°∙·√ⁿ²■ ", D = [], e = {}; for(var i=0;i!=d.length;++i) { if(d.charCodeAt(i) !== 0xFFFD) e[d.charAt(i)] = i; D[i] = d.charAt(i); } return {"enc": e, "dec": D }; })();
  21. cptable[932] = (function(){ var d = [], e = {}, D = [], j;
  22. D[0] = "\u0000\u0001\u0002\u0003\u0004\u0005\u0006\u0007\b\t\n\u000b\f\r\u000e\u000f\u0010\u0011\u0012\u0013\u0014\u0015\u0016\u0017\u0018\u0019\u001a\u001b\u001c\u001d\u001e\u001f !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~���������������������������������。「」、・ヲァィゥェォャュョッーアイウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホマミムメモヤユヨラリルレロワン゙゚��������������������������������".split("");
  23. for(j = 0; j != D[0].length; ++j) if(D[0][j].charCodeAt(0) !== 0xFFFD) { e[D[0][j]] = 0 + j; d[0 + j] = D[0][j];}
  24. D[129] = "���������������������������������������������������������������� 、。,.・:;?!゛゜´`¨^ ̄_ヽヾゝゞ〃仝々〆〇ー―‐/\~∥|…‥‘’“”()〔〕[]{}〈〉《》「」『』【】+-±×�÷=≠<>≦≧∞∴♂♀°′″℃¥$¢£%#&*@§☆★○●◎◇◆□■△▲▽▼※〒→←↑↓〓�����������∈∋⊆⊇⊂⊃∪∩��������∧∨¬⇒⇔∀∃�����������∠⊥⌒∂∇≡≒≪≫√∽∝∵∫∬�������ʼn♯♭♪†‡¶����◯���".split("");
  25. for(j = 0; j != D[129].length; ++j) if(D[129][j].charCodeAt(0) !== 0xFFFD) { e[D[129][j]] = 33024 + j; d[33024 + j] = D[129][j];}
  26. D[130] = "�������������������������������������������������������������������������������0123456789�������ABCDEFGHIJKLMNOPQRSTUVWXYZ�������abcdefghijklmnopqrstuvwxyz����ぁあぃいぅうぇえぉおかがきぎくぐけげこごさざしじすずせぜそぞただちぢっつづてでとどなにぬねのはばぱひびぴふぶぷへべぺほぼぽまみむめもゃやゅゆょよらりるれろゎわゐゑをん��������������".split("");
  27. for(j = 0; j != D[130].length; ++j) if(D[130][j].charCodeAt(0) !== 0xFFFD) { e[D[130][j]] = 33280 + j; d[33280 + j] = D[130][j];}
  28. D[131] = "����������������������������������������������������������������ァアィイゥウェエォオカガキギクグケゲコゴサザシジスズセゼソゾタダチヂッツヅテデトドナニヌネノハバパヒビピフブプヘベペホボポマミ�ムメモャヤュユョヨラリルレロヮワヰヱヲンヴヵヶ��������ΑΒΓΔΕΖΗΘΙΚΛΜΝΞΟΠΡΣΤΥΦΧΨΩ��������αβγδεζηθικλμνξοπρστυφχψω�����������������������������������������".split("");
  29. for(j = 0; j != D[131].length; ++j) if(D[131][j].charCodeAt(0) !== 0xFFFD) { e[D[131][j]] = 33536 + j; d[33536 + j] = D[131][j];}
  30. D[132] = "����������������������������������������������������������������АБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯ���������������абвгдеёжзийклмн�опрстуфхцчшщъыьэюя�������������─│┌┐┘└├┬┤┴┼━┃┏┓┛┗┣┳┫┻╋┠┯┨┷┿┝┰┥┸╂�����������������������������������������������������������������".split("");
  31. for(j = 0; j != D[132].length; ++j) if(D[132][j].charCodeAt(0) !== 0xFFFD) { e[D[132][j]] = 33792 + j; d[33792 + j] = D[132][j];}
  32. D[135] = "����������������������������������������������������������������①②③④⑤⑥⑦⑧⑨⑩⑪⑫⑬⑭⑮⑯⑰⑱⑲⑳ⅠⅡⅢⅣⅤⅥⅦⅧⅨⅩ�㍉㌔㌢㍍㌘㌧㌃㌶㍑㍗㌍㌦㌣㌫㍊㌻㎜㎝㎞㎎㎏㏄㎡��������㍻�〝〟№㏍℡㊤㊥㊦㊧㊨㈱㈲㈹㍾㍽㍼≒≡∫∮∑√⊥∠∟⊿∵∩∪���������������������������������������������������������������������������������������������������".split("");
  33. for(j = 0; j != D[135].length; ++j) if(D[135][j].charCodeAt(0) !== 0xFFFD) { e[D[135][j]] = 34560 + j; d[34560 + j] = D[135][j];}
  34. D[136] = "���������������������������������������������������������������������������������������������������������������������������������������������������������������亜唖娃阿哀愛挨姶逢葵茜穐悪握渥旭葦芦鯵梓圧斡扱宛姐虻飴絢綾鮎或粟袷安庵按暗案闇鞍杏以伊位依偉囲夷委威尉惟意慰易椅為畏異移維緯胃萎衣謂違遺医井亥域育郁磯一壱溢逸稲茨芋鰯允印咽員因姻引飲淫胤蔭���".split("");
  35. for(j = 0; j != D[136].length; ++j) if(D[136][j].charCodeAt(0) !== 0xFFFD) { e[D[136][j]] = 34816 + j; d[34816 + j] = D[136][j];}
  36. D[137] = "����������������������������������������������������������������院陰隠韻吋右宇烏羽迂雨卯鵜窺丑碓臼渦嘘唄欝蔚鰻姥厩浦瓜閏噂云運雲荏餌叡営嬰影映曳栄永泳洩瑛盈穎頴英衛詠鋭液疫益駅悦謁越閲榎厭円�園堰奄宴延怨掩援沿演炎焔煙燕猿縁艶苑薗遠鉛鴛塩於汚甥凹央奥往応押旺横欧殴王翁襖鴬鴎黄岡沖荻億屋憶臆桶牡乙俺卸恩温穏音下化仮何伽価佳加可嘉夏嫁家寡科暇果架歌河火珂禍禾稼箇花苛茄荷華菓蝦課嘩貨迦過霞蚊俄峨我牙画臥芽蛾賀雅餓駕介会解回塊壊廻快怪悔恢懐戒拐改���".split("");
  37. for(j = 0; j != D[137].length; ++j) if(D[137][j].charCodeAt(0) !== 0xFFFD) { e[D[137][j]] = 35072 + j; d[35072 + j] = D[137][j];}
  38. D[138] = "����������������������������������������������������������������魁晦械海灰界皆絵芥蟹開階貝凱劾外咳害崖慨概涯碍蓋街該鎧骸浬馨蛙垣柿蛎鈎劃嚇各廓拡撹格核殻獲確穫覚角赫較郭閣隔革学岳楽額顎掛笠樫�橿梶鰍潟割喝恰括活渇滑葛褐轄且鰹叶椛樺鞄株兜竃蒲釜鎌噛鴨栢茅萱粥刈苅瓦乾侃冠寒刊勘勧巻喚堪姦完官寛干幹患感慣憾換敢柑桓棺款歓汗漢澗潅環甘監看竿管簡緩缶翰肝艦莞観諌貫還鑑間閑関陥韓館舘丸含岸巌玩癌眼岩翫贋雁頑顔願企伎危喜器基奇嬉寄岐希幾忌揮机旗既期棋棄���".split("");
  39. for(j = 0; j != D[138].length; ++j) if(D[138][j].charCodeAt(0) !== 0xFFFD) { e[D[138][j]] = 35328 + j; d[35328 + j] = D[138][j];}
  40. D[139] = "����������������������������������������������������������������機帰毅気汽畿祈季稀紀徽規記貴起軌輝飢騎鬼亀偽儀妓宜戯技擬欺犠疑祇義蟻誼議掬菊鞠吉吃喫桔橘詰砧杵黍却客脚虐逆丘久仇休及吸宮弓急救�朽求汲泣灸球究窮笈級糾給旧牛去居巨拒拠挙渠虚許距鋸漁禦魚亨享京供侠僑兇競共凶協匡卿叫喬境峡強彊怯恐恭挟教橋況狂狭矯胸脅興蕎郷鏡響饗驚仰凝尭暁業局曲極玉桐粁僅勤均巾錦斤欣欽琴禁禽筋緊芹菌衿襟謹近金吟銀九倶句区狗玖矩苦躯駆駈駒具愚虞喰空偶寓遇隅串櫛釧屑屈���".split("");
  41. for(j = 0; j != D[139].length; ++j) if(D[139][j].charCodeAt(0) !== 0xFFFD) { e[D[139][j]] = 35584 + j; d[35584 + j] = D[139][j];}
  42. D[140] = "����������������������������������������������������������������掘窟沓靴轡窪熊隈粂栗繰桑鍬勲君薫訓群軍郡卦袈祁係傾刑兄啓圭珪型契形径恵慶慧憩掲携敬景桂渓畦稽系経継繋罫茎荊蛍計詣警軽頚鶏芸迎鯨�劇戟撃激隙桁傑欠決潔穴結血訣月件倹倦健兼券剣喧圏堅嫌建憲懸拳捲検権牽犬献研硯絹県肩見謙賢軒遣鍵険顕験鹸元原厳幻弦減源玄現絃舷言諺限乎個古呼固姑孤己庫弧戸故枯湖狐糊袴股胡菰虎誇跨鈷雇顧鼓五互伍午呉吾娯後御悟梧檎瑚碁語誤護醐乞鯉交佼侯候倖光公功効勾厚口向���".split("");
  43. for(j = 0; j != D[140].length; ++j) if(D[140][j].charCodeAt(0) !== 0xFFFD) { e[D[140][j]] = 35840 + j; d[35840 + j] = D[140][j];}
  44. D[141] = "����������������������������������������������������������������后喉坑垢好孔孝宏工巧巷幸広庚康弘恒慌抗拘控攻昂晃更杭校梗構江洪浩港溝甲皇硬稿糠紅紘絞綱耕考肯肱腔膏航荒行衡講貢購郊酵鉱砿鋼閤降�項香高鴻剛劫号合壕拷濠豪轟麹克刻告国穀酷鵠黒獄漉腰甑忽惚骨狛込此頃今困坤墾婚恨懇昏昆根梱混痕紺艮魂些佐叉唆嵯左差査沙瑳砂詐鎖裟坐座挫債催再最哉塞妻宰彩才採栽歳済災采犀砕砦祭斎細菜裁載際剤在材罪財冴坂阪堺榊肴咲崎埼碕鷺作削咋搾昨朔柵窄策索錯桜鮭笹匙冊刷���".split("");
  45. for(j = 0; j != D[141].length; ++j) if(D[141][j].charCodeAt(0) !== 0xFFFD) { e[D[141][j]] = 36096 + j; d[36096 + j] = D[141][j];}
  46. D[142] = "����������������������������������������������������������������察拶撮擦札殺薩雑皐鯖捌錆鮫皿晒三傘参山惨撒散桟燦珊産算纂蚕讃賛酸餐斬暫残仕仔伺使刺司史嗣四士始姉姿子屍市師志思指支孜斯施旨枝止�死氏獅祉私糸紙紫肢脂至視詞詩試誌諮資賜雌飼歯事似侍児字寺慈持時次滋治爾璽痔磁示而耳自蒔辞汐鹿式識鴫竺軸宍雫七叱執失嫉室悉湿漆疾質実蔀篠偲柴芝屡蕊縞舎写射捨赦斜煮社紗者謝車遮蛇邪借勺尺杓灼爵酌釈錫若寂弱惹主取守手朱殊狩珠種腫趣酒首儒受呪寿授樹綬需囚収周���".split("");
  47. for(j = 0; j != D[142].length; ++j) if(D[142][j].charCodeAt(0) !== 0xFFFD) { e[D[142][j]] = 36352 + j; d[36352 + j] = D[142][j];}
  48. D[143] = "����������������������������������������������������������������宗就州修愁拾洲秀秋終繍習臭舟蒐衆襲讐蹴輯週酋酬集醜什住充十従戎柔汁渋獣縦重銃叔夙宿淑祝縮粛塾熟出術述俊峻春瞬竣舜駿准循旬楯殉淳�準潤盾純巡遵醇順処初所暑曙渚庶緒署書薯藷諸助叙女序徐恕鋤除傷償勝匠升召哨商唱嘗奨妾娼宵将小少尚庄床廠彰承抄招掌捷昇昌昭晶松梢樟樵沼消渉湘焼焦照症省硝礁祥称章笑粧紹肖菖蒋蕉衝裳訟証詔詳象賞醤鉦鍾鐘障鞘上丈丞乗冗剰城場壌嬢常情擾条杖浄状畳穣蒸譲醸錠嘱埴飾���".split("");
  49. for(j = 0; j != D[143].length; ++j) if(D[143][j].charCodeAt(0) !== 0xFFFD) { e[D[143][j]] = 36608 + j; d[36608 + j] = D[143][j];}
  50. D[144] = "����������������������������������������������������������������拭植殖燭織職色触食蝕辱尻伸信侵唇娠寝審心慎振新晋森榛浸深申疹真神秦紳臣芯薪親診身辛進針震人仁刃塵壬尋甚尽腎訊迅陣靭笥諏須酢図厨�逗吹垂帥推水炊睡粋翠衰遂酔錐錘随瑞髄崇嵩数枢趨雛据杉椙菅頗雀裾澄摺寸世瀬畝是凄制勢姓征性成政整星晴棲栖正清牲生盛精聖声製西誠誓請逝醒青静斉税脆隻席惜戚斥昔析石積籍績脊責赤跡蹟碩切拙接摂折設窃節説雪絶舌蝉仙先千占宣専尖川戦扇撰栓栴泉浅洗染潜煎煽旋穿箭線���".split("");
  51. for(j = 0; j != D[144].length; ++j) if(D[144][j].charCodeAt(0) !== 0xFFFD) { e[D[144][j]] = 36864 + j; d[36864 + j] = D[144][j];}
  52. D[145] = "����������������������������������������������������������������繊羨腺舛船薦詮賎践選遷銭銑閃鮮前善漸然全禅繕膳糎噌塑岨措曾曽楚狙疏疎礎祖租粗素組蘇訴阻遡鼠僧創双叢倉喪壮奏爽宋層匝惣想捜掃挿掻�操早曹巣槍槽漕燥争痩相窓糟総綜聡草荘葬蒼藻装走送遭鎗霜騒像増憎臓蔵贈造促側則即息捉束測足速俗属賊族続卒袖其揃存孫尊損村遜他多太汰詑唾堕妥惰打柁舵楕陀駄騨体堆対耐岱帯待怠態戴替泰滞胎腿苔袋貸退逮隊黛鯛代台大第醍題鷹滝瀧卓啄宅托択拓沢濯琢託鐸濁諾茸凧蛸只���".split("");
  53. for(j = 0; j != D[145].length; ++j) if(D[145][j].charCodeAt(0) !== 0xFFFD) { e[D[145][j]] = 37120 + j; d[37120 + j] = D[145][j];}
  54. D[146] = "����������������������������������������������������������������叩但達辰奪脱巽竪辿棚谷狸鱈樽誰丹単嘆坦担探旦歎淡湛炭短端箪綻耽胆蛋誕鍛団壇弾断暖檀段男談値知地弛恥智池痴稚置致蜘遅馳築畜竹筑蓄�逐秩窒茶嫡着中仲宙忠抽昼柱注虫衷註酎鋳駐樗瀦猪苧著貯丁兆凋喋寵帖帳庁弔張彫徴懲挑暢朝潮牒町眺聴脹腸蝶調諜超跳銚長頂鳥勅捗直朕沈珍賃鎮陳津墜椎槌追鎚痛通塚栂掴槻佃漬柘辻蔦綴鍔椿潰坪壷嬬紬爪吊釣鶴亭低停偵剃貞呈堤定帝底庭廷弟悌抵挺提梯汀碇禎程締艇訂諦蹄逓���".split("");
  55. for(j = 0; j != D[146].length; ++j) if(D[146][j].charCodeAt(0) !== 0xFFFD) { e[D[146][j]] = 37376 + j; d[37376 + j] = D[146][j];}
  56. D[147] = "����������������������������������������������������������������邸鄭釘鼎泥摘擢敵滴的笛適鏑溺哲徹撤轍迭鉄典填天展店添纏甜貼転顛点伝殿澱田電兎吐堵塗妬屠徒斗杜渡登菟賭途都鍍砥砺努度土奴怒倒党冬�凍刀唐塔塘套宕島嶋悼投搭東桃梼棟盗淘湯涛灯燈当痘祷等答筒糖統到董蕩藤討謄豆踏逃透鐙陶頭騰闘働動同堂導憧撞洞瞳童胴萄道銅峠鴇匿得徳涜特督禿篤毒独読栃橡凸突椴届鳶苫寅酉瀞噸屯惇敦沌豚遁頓呑曇鈍奈那内乍凪薙謎灘捺鍋楢馴縄畷南楠軟難汝二尼弐迩匂賑肉虹廿日乳入���".split("");
  57. for(j = 0; j != D[147].length; ++j) if(D[147][j].charCodeAt(0) !== 0xFFFD) { e[D[147][j]] = 37632 + j; d[37632 + j] = D[147][j];}
  58. D[148] = "����������������������������������������������������������������如尿韮任妊忍認濡禰祢寧葱猫熱年念捻撚燃粘乃廼之埜嚢悩濃納能脳膿農覗蚤巴把播覇杷波派琶破婆罵芭馬俳廃拝排敗杯盃牌背肺輩配倍培媒梅�楳煤狽買売賠陪這蝿秤矧萩伯剥博拍柏泊白箔粕舶薄迫曝漠爆縛莫駁麦函箱硲箸肇筈櫨幡肌畑畠八鉢溌発醗髪伐罰抜筏閥鳩噺塙蛤隼伴判半反叛帆搬斑板氾汎版犯班畔繁般藩販範釆煩頒飯挽晩番盤磐蕃蛮匪卑否妃庇彼悲扉批披斐比泌疲皮碑秘緋罷肥被誹費避非飛樋簸備尾微枇毘琵眉美���".split("");
  59. for(j = 0; j != D[148].length; ++j) if(D[148][j].charCodeAt(0) !== 0xFFFD) { e[D[148][j]] = 37888 + j; d[37888 + j] = D[148][j];}
  60. D[149] = "����������������������������������������������������������������鼻柊稗匹疋髭彦膝菱肘弼必畢筆逼桧姫媛紐百謬俵彪標氷漂瓢票表評豹廟描病秒苗錨鋲蒜蛭鰭品彬斌浜瀕貧賓頻敏瓶不付埠夫婦富冨布府怖扶敷�斧普浮父符腐膚芙譜負賦赴阜附侮撫武舞葡蕪部封楓風葺蕗伏副復幅服福腹複覆淵弗払沸仏物鮒分吻噴墳憤扮焚奮粉糞紛雰文聞丙併兵塀幣平弊柄並蔽閉陛米頁僻壁癖碧別瞥蔑箆偏変片篇編辺返遍便勉娩弁鞭保舗鋪圃捕歩甫補輔穂募墓慕戊暮母簿菩倣俸包呆報奉宝峰峯崩庖抱捧放方朋���".split("");
  61. for(j = 0; j != D[149].length; ++j) if(D[149][j].charCodeAt(0) !== 0xFFFD) { e[D[149][j]] = 38144 + j; d[38144 + j] = D[149][j];}
  62. D[150] = "����������������������������������������������������������������法泡烹砲縫胞芳萌蓬蜂褒訪豊邦鋒飽鳳鵬乏亡傍剖坊妨帽忘忙房暴望某棒冒紡肪膨謀貌貿鉾防吠頬北僕卜墨撲朴牧睦穆釦勃没殆堀幌奔本翻凡盆�摩磨魔麻埋妹昧枚毎哩槙幕膜枕鮪柾鱒桝亦俣又抹末沫迄侭繭麿万慢満漫蔓味未魅巳箕岬密蜜湊蓑稔脈妙粍民眠務夢無牟矛霧鵡椋婿娘冥名命明盟迷銘鳴姪牝滅免棉綿緬面麺摸模茂妄孟毛猛盲網耗蒙儲木黙目杢勿餅尤戻籾貰問悶紋門匁也冶夜爺耶野弥矢厄役約薬訳躍靖柳薮鑓愉愈油癒���".split("");
  63. for(j = 0; j != D[150].length; ++j) if(D[150][j].charCodeAt(0) !== 0xFFFD) { e[D[150][j]] = 38400 + j; d[38400 + j] = D[150][j];}
  64. D[151] = "����������������������������������������������������������������諭輸唯佑優勇友宥幽悠憂揖有柚湧涌猶猷由祐裕誘遊邑郵雄融夕予余与誉輿預傭幼妖容庸揚揺擁曜楊様洋溶熔用窯羊耀葉蓉要謡踊遥陽養慾抑欲�沃浴翌翼淀羅螺裸来莱頼雷洛絡落酪乱卵嵐欄濫藍蘭覧利吏履李梨理璃痢裏裡里離陸律率立葎掠略劉流溜琉留硫粒隆竜龍侶慮旅虜了亮僚両凌寮料梁涼猟療瞭稜糧良諒遼量陵領力緑倫厘林淋燐琳臨輪隣鱗麟瑠塁涙累類令伶例冷励嶺怜玲礼苓鈴隷零霊麗齢暦歴列劣烈裂廉恋憐漣煉簾練聯���".split("");
  65. for(j = 0; j != D[151].length; ++j) if(D[151][j].charCodeAt(0) !== 0xFFFD) { e[D[151][j]] = 38656 + j; d[38656 + j] = D[151][j];}
  66. D[152] = "����������������������������������������������������������������蓮連錬呂魯櫓炉賂路露労婁廊弄朗楼榔浪漏牢狼篭老聾蝋郎六麓禄肋録論倭和話歪賄脇惑枠鷲亙亘鰐詫藁蕨椀湾碗腕��������������������������������������������弌丐丕个丱丶丼丿乂乖乘亂亅豫亊舒弍于亞亟亠亢亰亳亶从仍仄仆仂仗仞仭仟价伉佚估佛佝佗佇佶侈侏侘佻佩佰侑佯來侖儘俔俟俎俘俛俑俚俐俤俥倚倨倔倪倥倅伜俶倡倩倬俾俯們倆偃假會偕偐偈做偖偬偸傀傚傅傴傲���".split("");
  67. for(j = 0; j != D[152].length; ++j) if(D[152][j].charCodeAt(0) !== 0xFFFD) { e[D[152][j]] = 38912 + j; d[38912 + j] = D[152][j];}
  68. D[153] = "����������������������������������������������������������������僉僊傳僂僖僞僥僭僣僮價僵儉儁儂儖儕儔儚儡儺儷儼儻儿兀兒兌兔兢竸兩兪兮冀冂囘册冉冏冑冓冕冖冤冦冢冩冪冫决冱冲冰况冽凅凉凛几處凩凭�凰凵凾刄刋刔刎刧刪刮刳刹剏剄剋剌剞剔剪剴剩剳剿剽劍劔劒剱劈劑辨辧劬劭劼劵勁勍勗勞勣勦飭勠勳勵勸勹匆匈甸匍匐匏匕匚匣匯匱匳匸區卆卅丗卉卍凖卞卩卮夘卻卷厂厖厠厦厥厮厰厶參簒雙叟曼燮叮叨叭叺吁吽呀听吭吼吮吶吩吝呎咏呵咎呟呱呷呰咒呻咀呶咄咐咆哇咢咸咥咬哄哈咨���".split("");
  69. for(j = 0; j != D[153].length; ++j) if(D[153][j].charCodeAt(0) !== 0xFFFD) { e[D[153][j]] = 39168 + j; d[39168 + j] = D[153][j];}
  70. D[154] = "����������������������������������������������������������������咫哂咤咾咼哘哥哦唏唔哽哮哭哺哢唹啀啣啌售啜啅啖啗唸唳啝喙喀咯喊喟啻啾喘喞單啼喃喩喇喨嗚嗅嗟嗄嗜嗤嗔嘔嗷嘖嗾嗽嘛嗹噎噐營嘴嘶嘲嘸�噫噤嘯噬噪嚆嚀嚊嚠嚔嚏嚥嚮嚶嚴囂嚼囁囃囀囈囎囑囓囗囮囹圀囿圄圉圈國圍圓團圖嗇圜圦圷圸坎圻址坏坩埀垈坡坿垉垓垠垳垤垪垰埃埆埔埒埓堊埖埣堋堙堝塲堡塢塋塰毀塒堽塹墅墹墟墫墺壞墻墸墮壅壓壑壗壙壘壥壜壤壟壯壺壹壻壼壽夂夊夐夛梦夥夬夭夲夸夾竒奕奐奎奚奘奢奠奧奬奩���".split("");
  71. for(j = 0; j != D[154].length; ++j) if(D[154][j].charCodeAt(0) !== 0xFFFD) { e[D[154][j]] = 39424 + j; d[39424 + j] = D[154][j];}
  72. D[155] = "����������������������������������������������������������������奸妁妝佞侫妣妲姆姨姜妍姙姚娥娟娑娜娉娚婀婬婉娵娶婢婪媚媼媾嫋嫂媽嫣嫗嫦嫩嫖嫺嫻嬌嬋嬖嬲嫐嬪嬶嬾孃孅孀孑孕孚孛孥孩孰孳孵學斈孺宀�它宦宸寃寇寉寔寐寤實寢寞寥寫寰寶寳尅將專對尓尠尢尨尸尹屁屆屎屓屐屏孱屬屮乢屶屹岌岑岔妛岫岻岶岼岷峅岾峇峙峩峽峺峭嶌峪崋崕崗嵜崟崛崑崔崢崚崙崘嵌嵒嵎嵋嵬嵳嵶嶇嶄嶂嶢嶝嶬嶮嶽嶐嶷嶼巉巍巓巒巖巛巫已巵帋帚帙帑帛帶帷幄幃幀幎幗幔幟幢幤幇幵并幺麼广庠廁廂廈廐廏���".split("");
  73. for(j = 0; j != D[155].length; ++j) if(D[155][j].charCodeAt(0) !== 0xFFFD) { e[D[155][j]] = 39680 + j; d[39680 + j] = D[155][j];}
  74. D[156] = "����������������������������������������������������������������廖廣廝廚廛廢廡廨廩廬廱廳廰廴廸廾弃弉彝彜弋弑弖弩弭弸彁彈彌彎弯彑彖彗彙彡彭彳彷徃徂彿徊很徑徇從徙徘徠徨徭徼忖忻忤忸忱忝悳忿怡恠�怙怐怩怎怱怛怕怫怦怏怺恚恁恪恷恟恊恆恍恣恃恤恂恬恫恙悁悍惧悃悚悄悛悖悗悒悧悋惡悸惠惓悴忰悽惆悵惘慍愕愆惶惷愀惴惺愃愡惻惱愍愎慇愾愨愧慊愿愼愬愴愽慂慄慳慷慘慙慚慫慴慯慥慱慟慝慓慵憙憖憇憬憔憚憊憑憫憮懌懊應懷懈懃懆憺懋罹懍懦懣懶懺懴懿懽懼懾戀戈戉戍戌戔戛���".split("");
  75. for(j = 0; j != D[156].length; ++j) if(D[156][j].charCodeAt(0) !== 0xFFFD) { e[D[156][j]] = 39936 + j; d[39936 + j] = D[156][j];}
  76. D[157] = "����������������������������������������������������������������戞戡截戮戰戲戳扁扎扞扣扛扠扨扼抂抉找抒抓抖拔抃抔拗拑抻拏拿拆擔拈拜拌拊拂拇抛拉挌拮拱挧挂挈拯拵捐挾捍搜捏掖掎掀掫捶掣掏掉掟掵捫�捩掾揩揀揆揣揉插揶揄搖搴搆搓搦搶攝搗搨搏摧摯摶摎攪撕撓撥撩撈撼據擒擅擇撻擘擂擱擧舉擠擡抬擣擯攬擶擴擲擺攀擽攘攜攅攤攣攫攴攵攷收攸畋效敖敕敍敘敞敝敲數斂斃變斛斟斫斷旃旆旁旄旌旒旛旙无旡旱杲昊昃旻杳昵昶昴昜晏晄晉晁晞晝晤晧晨晟晢晰暃暈暎暉暄暘暝曁暹曉暾暼���".split("");
  77. for(j = 0; j != D[157].length; ++j) if(D[157][j].charCodeAt(0) !== 0xFFFD) { e[D[157][j]] = 40192 + j; d[40192 + j] = D[157][j];}
  78. D[158] = "����������������������������������������������������������������曄暸曖曚曠昿曦曩曰曵曷朏朖朞朦朧霸朮朿朶杁朸朷杆杞杠杙杣杤枉杰枩杼杪枌枋枦枡枅枷柯枴柬枳柩枸柤柞柝柢柮枹柎柆柧檜栞框栩桀桍栲桎�梳栫桙档桷桿梟梏梭梔條梛梃檮梹桴梵梠梺椏梍桾椁棊椈棘椢椦棡椌棍棔棧棕椶椒椄棗棣椥棹棠棯椨椪椚椣椡棆楹楷楜楸楫楔楾楮椹楴椽楙椰楡楞楝榁楪榲榮槐榿槁槓榾槎寨槊槝榻槃榧樮榑榠榜榕榴槞槨樂樛槿權槹槲槧樅榱樞槭樔槫樊樒櫁樣樓橄樌橲樶橸橇橢橙橦橈樸樢檐檍檠檄檢檣���".split("");
  79. for(j = 0; j != D[158].length; ++j) if(D[158][j].charCodeAt(0) !== 0xFFFD) { e[D[158][j]] = 40448 + j; d[40448 + j] = D[158][j];}
  80. D[159] = "����������������������������������������������������������������檗蘗檻櫃櫂檸檳檬櫞櫑櫟檪櫚櫪櫻欅蘖櫺欒欖鬱欟欸欷盜欹飮歇歃歉歐歙歔歛歟歡歸歹歿殀殄殃殍殘殕殞殤殪殫殯殲殱殳殷殼毆毋毓毟毬毫毳毯�麾氈氓气氛氤氣汞汕汢汪沂沍沚沁沛汾汨汳沒沐泄泱泓沽泗泅泝沮沱沾沺泛泯泙泪洟衍洶洫洽洸洙洵洳洒洌浣涓浤浚浹浙涎涕濤涅淹渕渊涵淇淦涸淆淬淞淌淨淒淅淺淙淤淕淪淮渭湮渮渙湲湟渾渣湫渫湶湍渟湃渺湎渤滿渝游溂溪溘滉溷滓溽溯滄溲滔滕溏溥滂溟潁漑灌滬滸滾漿滲漱滯漲滌���".split("");
  81. for(j = 0; j != D[159].length; ++j) if(D[159][j].charCodeAt(0) !== 0xFFFD) { e[D[159][j]] = 40704 + j; d[40704 + j] = D[159][j];}
  82. D[224] = "����������������������������������������������������������������漾漓滷澆潺潸澁澀潯潛濳潭澂潼潘澎澑濂潦澳澣澡澤澹濆澪濟濕濬濔濘濱濮濛瀉瀋濺瀑瀁瀏濾瀛瀚潴瀝瀘瀟瀰瀾瀲灑灣炙炒炯烱炬炸炳炮烟烋烝�烙焉烽焜焙煥煕熈煦煢煌煖煬熏燻熄熕熨熬燗熹熾燒燉燔燎燠燬燧燵燼燹燿爍爐爛爨爭爬爰爲爻爼爿牀牆牋牘牴牾犂犁犇犒犖犢犧犹犲狃狆狄狎狒狢狠狡狹狷倏猗猊猜猖猝猴猯猩猥猾獎獏默獗獪獨獰獸獵獻獺珈玳珎玻珀珥珮珞璢琅瑯琥珸琲琺瑕琿瑟瑙瑁瑜瑩瑰瑣瑪瑶瑾璋璞璧瓊瓏瓔珱���".split("");
  83. for(j = 0; j != D[224].length; ++j) if(D[224][j].charCodeAt(0) !== 0xFFFD) { e[D[224][j]] = 57344 + j; d[57344 + j] = D[224][j];}
  84. D[225] = "����������������������������������������������������������������瓠瓣瓧瓩瓮瓲瓰瓱瓸瓷甄甃甅甌甎甍甕甓甞甦甬甼畄畍畊畉畛畆畚畩畤畧畫畭畸當疆疇畴疊疉疂疔疚疝疥疣痂疳痃疵疽疸疼疱痍痊痒痙痣痞痾痿�痼瘁痰痺痲痳瘋瘍瘉瘟瘧瘠瘡瘢瘤瘴瘰瘻癇癈癆癜癘癡癢癨癩癪癧癬癰癲癶癸發皀皃皈皋皎皖皓皙皚皰皴皸皹皺盂盍盖盒盞盡盥盧盪蘯盻眈眇眄眩眤眞眥眦眛眷眸睇睚睨睫睛睥睿睾睹瞎瞋瞑瞠瞞瞰瞶瞹瞿瞼瞽瞻矇矍矗矚矜矣矮矼砌砒礦砠礪硅碎硴碆硼碚碌碣碵碪碯磑磆磋磔碾碼磅磊磬���".split("");
  85. for(j = 0; j != D[225].length; ++j) if(D[225][j].charCodeAt(0) !== 0xFFFD) { e[D[225][j]] = 57600 + j; d[57600 + j] = D[225][j];}
  86. D[226] = "����������������������������������������������������������������磧磚磽磴礇礒礑礙礬礫祀祠祗祟祚祕祓祺祿禊禝禧齋禪禮禳禹禺秉秕秧秬秡秣稈稍稘稙稠稟禀稱稻稾稷穃穗穉穡穢穩龝穰穹穽窈窗窕窘窖窩竈窰�窶竅竄窿邃竇竊竍竏竕竓站竚竝竡竢竦竭竰笂笏笊笆笳笘笙笞笵笨笶筐筺笄筍笋筌筅筵筥筴筧筰筱筬筮箝箘箟箍箜箚箋箒箏筝箙篋篁篌篏箴篆篝篩簑簔篦篥籠簀簇簓篳篷簗簍篶簣簧簪簟簷簫簽籌籃籔籏籀籐籘籟籤籖籥籬籵粃粐粤粭粢粫粡粨粳粲粱粮粹粽糀糅糂糘糒糜糢鬻糯糲糴糶糺紆���".split("");
  87. for(j = 0; j != D[226].length; ++j) if(D[226][j].charCodeAt(0) !== 0xFFFD) { e[D[226][j]] = 57856 + j; d[57856 + j] = D[226][j];}
  88. D[227] = "����������������������������������������������������������������紂紜紕紊絅絋紮紲紿紵絆絳絖絎絲絨絮絏絣經綉絛綏絽綛綺綮綣綵緇綽綫總綢綯緜綸綟綰緘緝緤緞緻緲緡縅縊縣縡縒縱縟縉縋縢繆繦縻縵縹繃縷�縲縺繧繝繖繞繙繚繹繪繩繼繻纃緕繽辮繿纈纉續纒纐纓纔纖纎纛纜缸缺罅罌罍罎罐网罕罔罘罟罠罨罩罧罸羂羆羃羈羇羌羔羞羝羚羣羯羲羹羮羶羸譱翅翆翊翕翔翡翦翩翳翹飜耆耄耋耒耘耙耜耡耨耿耻聊聆聒聘聚聟聢聨聳聲聰聶聹聽聿肄肆肅肛肓肚肭冐肬胛胥胙胝胄胚胖脉胯胱脛脩脣脯腋���".split("");
  89. for(j = 0; j != D[227].length; ++j) if(D[227][j].charCodeAt(0) !== 0xFFFD) { e[D[227][j]] = 58112 + j; d[58112 + j] = D[227][j];}
  90. D[228] = "����������������������������������������������������������������隋腆脾腓腑胼腱腮腥腦腴膃膈膊膀膂膠膕膤膣腟膓膩膰膵膾膸膽臀臂膺臉臍臑臙臘臈臚臟臠臧臺臻臾舁舂舅與舊舍舐舖舩舫舸舳艀艙艘艝艚艟艤�艢艨艪艫舮艱艷艸艾芍芒芫芟芻芬苡苣苟苒苴苳苺莓范苻苹苞茆苜茉苙茵茴茖茲茱荀茹荐荅茯茫茗茘莅莚莪莟莢莖茣莎莇莊荼莵荳荵莠莉莨菴萓菫菎菽萃菘萋菁菷萇菠菲萍萢萠莽萸蔆菻葭萪萼蕚蒄葷葫蒭葮蒂葩葆萬葯葹萵蓊葢蒹蒿蒟蓙蓍蒻蓚蓐蓁蓆蓖蒡蔡蓿蓴蔗蔘蔬蔟蔕蔔蓼蕀蕣蕘蕈���".split("");
  91. for(j = 0; j != D[228].length; ++j) if(D[228][j].charCodeAt(0) !== 0xFFFD) { e[D[228][j]] = 58368 + j; d[58368 + j] = D[228][j];}
  92. D[229] = "����������������������������������������������������������������蕁蘂蕋蕕薀薤薈薑薊薨蕭薔薛藪薇薜蕷蕾薐藉薺藏薹藐藕藝藥藜藹蘊蘓蘋藾藺蘆蘢蘚蘰蘿虍乕虔號虧虱蚓蚣蚩蚪蚋蚌蚶蚯蛄蛆蚰蛉蠣蚫蛔蛞蛩蛬�蛟蛛蛯蜒蜆蜈蜀蜃蛻蜑蜉蜍蛹蜊蜴蜿蜷蜻蜥蜩蜚蝠蝟蝸蝌蝎蝴蝗蝨蝮蝙蝓蝣蝪蠅螢螟螂螯蟋螽蟀蟐雖螫蟄螳蟇蟆螻蟯蟲蟠蠏蠍蟾蟶蟷蠎蟒蠑蠖蠕蠢蠡蠱蠶蠹蠧蠻衄衂衒衙衞衢衫袁衾袞衵衽袵衲袂袗袒袮袙袢袍袤袰袿袱裃裄裔裘裙裝裹褂裼裴裨裲褄褌褊褓襃褞褥褪褫襁襄褻褶褸襌褝襠襞���".split("");
  93. for(j = 0; j != D[229].length; ++j) if(D[229][j].charCodeAt(0) !== 0xFFFD) { e[D[229][j]] = 58624 + j; d[58624 + j] = D[229][j];}
  94. D[230] = "����������������������������������������������������������������襦襤襭襪襯襴襷襾覃覈覊覓覘覡覩覦覬覯覲覺覽覿觀觚觜觝觧觴觸訃訖訐訌訛訝訥訶詁詛詒詆詈詼詭詬詢誅誂誄誨誡誑誥誦誚誣諄諍諂諚諫諳諧�諤諱謔諠諢諷諞諛謌謇謚諡謖謐謗謠謳鞫謦謫謾謨譁譌譏譎證譖譛譚譫譟譬譯譴譽讀讌讎讒讓讖讙讚谺豁谿豈豌豎豐豕豢豬豸豺貂貉貅貊貍貎貔豼貘戝貭貪貽貲貳貮貶賈賁賤賣賚賽賺賻贄贅贊贇贏贍贐齎贓賍贔贖赧赭赱赳趁趙跂趾趺跏跚跖跌跛跋跪跫跟跣跼踈踉跿踝踞踐踟蹂踵踰踴蹊���".split("");
  95. for(j = 0; j != D[230].length; ++j) if(D[230][j].charCodeAt(0) !== 0xFFFD) { e[D[230][j]] = 58880 + j; d[58880 + j] = D[230][j];}
  96. D[231] = "����������������������������������������������������������������蹇蹉蹌蹐蹈蹙蹤蹠踪蹣蹕蹶蹲蹼躁躇躅躄躋躊躓躑躔躙躪躡躬躰軆躱躾軅軈軋軛軣軼軻軫軾輊輅輕輒輙輓輜輟輛輌輦輳輻輹轅轂輾轌轉轆轎轗轜�轢轣轤辜辟辣辭辯辷迚迥迢迪迯邇迴逅迹迺逑逕逡逍逞逖逋逧逶逵逹迸遏遐遑遒逎遉逾遖遘遞遨遯遶隨遲邂遽邁邀邊邉邏邨邯邱邵郢郤扈郛鄂鄒鄙鄲鄰酊酖酘酣酥酩酳酲醋醉醂醢醫醯醪醵醴醺釀釁釉釋釐釖釟釡釛釼釵釶鈞釿鈔鈬鈕鈑鉞鉗鉅鉉鉤鉈銕鈿鉋鉐銜銖銓銛鉚鋏銹銷鋩錏鋺鍄錮���".split("");
  97. for(j = 0; j != D[231].length; ++j) if(D[231][j].charCodeAt(0) !== 0xFFFD) { e[D[231][j]] = 59136 + j; d[59136 + j] = D[231][j];}
  98. D[232] = "����������������������������������������������������������������錙錢錚錣錺錵錻鍜鍠鍼鍮鍖鎰鎬鎭鎔鎹鏖鏗鏨鏥鏘鏃鏝鏐鏈鏤鐚鐔鐓鐃鐇鐐鐶鐫鐵鐡鐺鑁鑒鑄鑛鑠鑢鑞鑪鈩鑰鑵鑷鑽鑚鑼鑾钁鑿閂閇閊閔閖閘閙�閠閨閧閭閼閻閹閾闊濶闃闍闌闕闔闖關闡闥闢阡阨阮阯陂陌陏陋陷陜陞陝陟陦陲陬隍隘隕隗險隧隱隲隰隴隶隸隹雎雋雉雍襍雜霍雕雹霄霆霈霓霎霑霏霖霙霤霪霰霹霽霾靄靆靈靂靉靜靠靤靦靨勒靫靱靹鞅靼鞁靺鞆鞋鞏鞐鞜鞨鞦鞣鞳鞴韃韆韈韋韜韭齏韲竟韶韵頏頌頸頤頡頷頽顆顏顋顫顯顰���".split("");
  99. for(j = 0; j != D[232].length; ++j) if(D[232][j].charCodeAt(0) !== 0xFFFD) { e[D[232][j]] = 59392 + j; d[59392 + j] = D[232][j];}
  100. D[233] = "����������������������������������������������������������������顱顴顳颪颯颱颶飄飃飆飩飫餃餉餒餔餘餡餝餞餤餠餬餮餽餾饂饉饅饐饋饑饒饌饕馗馘馥馭馮馼駟駛駝駘駑駭駮駱駲駻駸騁騏騅駢騙騫騷驅驂驀驃�騾驕驍驛驗驟驢驥驤驩驫驪骭骰骼髀髏髑髓體髞髟髢髣髦髯髫髮髴髱髷髻鬆鬘鬚鬟鬢鬣鬥鬧鬨鬩鬪鬮鬯鬲魄魃魏魍魎魑魘魴鮓鮃鮑鮖鮗鮟鮠鮨鮴鯀鯊鮹鯆鯏鯑鯒鯣鯢鯤鯔鯡鰺鯲鯱鯰鰕鰔鰉鰓鰌鰆鰈鰒鰊鰄鰮鰛鰥鰤鰡鰰鱇鰲鱆鰾鱚鱠鱧鱶鱸鳧鳬鳰鴉鴈鳫鴃鴆鴪鴦鶯鴣鴟鵄鴕鴒鵁鴿鴾鵆鵈���".split("");
  101. for(j = 0; j != D[233].length; ++j) if(D[233][j].charCodeAt(0) !== 0xFFFD) { e[D[233][j]] = 59648 + j; d[59648 + j] = D[233][j];}
  102. D[234] = "����������������������������������������������������������������鵝鵞鵤鵑鵐鵙鵲鶉鶇鶫鵯鵺鶚鶤鶩鶲鷄鷁鶻鶸鶺鷆鷏鷂鷙鷓鷸鷦鷭鷯鷽鸚鸛鸞鹵鹹鹽麁麈麋麌麒麕麑麝麥麩麸麪麭靡黌黎黏黐黔黜點黝黠黥黨黯�黴黶黷黹黻黼黽鼇鼈皷鼕鼡鼬鼾齊齒齔齣齟齠齡齦齧齬齪齷齲齶龕龜龠堯槇遙瑤凜熙�������������������������������������������������������������������������������������������".split("");
  103. for(j = 0; j != D[234].length; ++j) if(D[234][j].charCodeAt(0) !== 0xFFFD) { e[D[234][j]] = 59904 + j; d[59904 + j] = D[234][j];}
  104. D[237] = "����������������������������������������������������������������纊褜鍈銈蓜俉炻昱棈鋹曻彅丨仡仼伀伃伹佖侒侊侚侔俍偀倢俿倞偆偰偂傔僴僘兊兤冝冾凬刕劜劦勀勛匀匇匤卲厓厲叝﨎咜咊咩哿喆坙坥垬埈埇﨏�塚增墲夋奓奛奝奣妤妺孖寀甯寘寬尞岦岺峵崧嵓﨑嵂嵭嶸嶹巐弡弴彧德忞恝悅悊惞惕愠惲愑愷愰憘戓抦揵摠撝擎敎昀昕昻昉昮昞昤晥晗晙晴晳暙暠暲暿曺朎朗杦枻桒柀栁桄棏﨓楨﨔榘槢樰橫橆橳橾櫢櫤毖氿汜沆汯泚洄涇浯涖涬淏淸淲淼渹湜渧渼溿澈澵濵瀅瀇瀨炅炫焏焄煜煆煇凞燁燾犱���".split("");
  105. for(j = 0; j != D[237].length; ++j) if(D[237][j].charCodeAt(0) !== 0xFFFD) { e[D[237][j]] = 60672 + j; d[60672 + j] = D[237][j];}
  106. D[238] = "����������������������������������������������������������������犾猤猪獷玽珉珖珣珒琇珵琦琪琩琮瑢璉璟甁畯皂皜皞皛皦益睆劯砡硎硤硺礰礼神祥禔福禛竑竧靖竫箞精絈絜綷綠緖繒罇羡羽茁荢荿菇菶葈蒴蕓蕙�蕫﨟薰蘒﨡蠇裵訒訷詹誧誾諟諸諶譓譿賰賴贒赶﨣軏﨤逸遧郞都鄕鄧釚釗釞釭釮釤釥鈆鈐鈊鈺鉀鈼鉎鉙鉑鈹鉧銧鉷鉸鋧鋗鋙鋐﨧鋕鋠鋓錥錡鋻﨨錞鋿錝錂鍰鍗鎤鏆鏞鏸鐱鑅鑈閒隆﨩隝隯霳霻靃靍靏靑靕顗顥飯飼餧館馞驎髙髜魵魲鮏鮱鮻鰀鵰鵫鶴鸙黑��ⅰⅱⅲⅳⅴⅵⅶⅷⅸⅹ¬¦'"���".split("");
  107. for(j = 0; j != D[238].length; ++j) if(D[238][j].charCodeAt(0) !== 0xFFFD) { e[D[238][j]] = 60928 + j; d[60928 + j] = D[238][j];}
  108. D[250] = "����������������������������������������������������������������ⅰⅱⅲⅳⅴⅵⅶⅷⅸⅹⅠⅡⅢⅣⅤⅥⅦⅧⅨⅩ¬¦'"㈱№℡∵纊褜鍈銈蓜俉炻昱棈鋹曻彅丨仡仼伀伃伹佖侒侊侚侔俍偀倢俿倞偆偰偂傔僴僘兊�兤冝冾凬刕劜劦勀勛匀匇匤卲厓厲叝﨎咜咊咩哿喆坙坥垬埈埇﨏塚增墲夋奓奛奝奣妤妺孖寀甯寘寬尞岦岺峵崧嵓﨑嵂嵭嶸嶹巐弡弴彧德忞恝悅悊惞惕愠惲愑愷愰憘戓抦揵摠撝擎敎昀昕昻昉昮昞昤晥晗晙晴晳暙暠暲暿曺朎朗杦枻桒柀栁桄棏﨓楨﨔榘槢樰橫橆橳橾櫢櫤毖氿汜沆汯泚洄涇浯���".split("");
  109. for(j = 0; j != D[250].length; ++j) if(D[250][j].charCodeAt(0) !== 0xFFFD) { e[D[250][j]] = 64000 + j; d[64000 + j] = D[250][j];}
  110. D[251] = "����������������������������������������������������������������涖涬淏淸淲淼渹湜渧渼溿澈澵濵瀅瀇瀨炅炫焏焄煜煆煇凞燁燾犱犾猤猪獷玽珉珖珣珒琇珵琦琪琩琮瑢璉璟甁畯皂皜皞皛皦益睆劯砡硎硤硺礰礼神�祥禔福禛竑竧靖竫箞精絈絜綷綠緖繒罇羡羽茁荢荿菇菶葈蒴蕓蕙蕫﨟薰蘒﨡蠇裵訒訷詹誧誾諟諸諶譓譿賰賴贒赶﨣軏﨤逸遧郞都鄕鄧釚釗釞釭釮釤釥鈆鈐鈊鈺鉀鈼鉎鉙鉑鈹鉧銧鉷鉸鋧鋗鋙鋐﨧鋕鋠鋓錥錡鋻﨨錞鋿錝錂鍰鍗鎤鏆鏞鏸鐱鑅鑈閒隆﨩隝隯霳霻靃靍靏靑靕顗顥飯飼餧館馞驎髙���".split("");
  111. for(j = 0; j != D[251].length; ++j) if(D[251][j].charCodeAt(0) !== 0xFFFD) { e[D[251][j]] = 64256 + j; d[64256 + j] = D[251][j];}
  112. D[252] = "����������������������������������������������������������������髜魵魲鮏鮱鮻鰀鵰鵫鶴鸙黑������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������".split("");
  113. for(j = 0; j != D[252].length; ++j) if(D[252][j].charCodeAt(0) !== 0xFFFD) { e[D[252][j]] = 64512 + j; d[64512 + j] = D[252][j];}
  114. return {"enc": e, "dec": d }; })();
  115. cptable[936] = (function(){ var d = [], e = {}, D = [], j;
  116. D[0] = "\u0000\u0001\u0002\u0003\u0004\u0005\u0006\u0007\b\t\n\u000b\f\r\u000e\u000f\u0010\u0011\u0012\u0013\u0014\u0015\u0016\u0017\u0018\u0019\u001a\u001b\u001c\u001d\u001e\u001f !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~€�������������������������������������������������������������������������������������������������������������������������������".split("");
  117. for(j = 0; j != D[0].length; ++j) if(D[0][j].charCodeAt(0) !== 0xFFFD) { e[D[0][j]] = 0 + j; d[0 + j] = D[0][j];}
  118. D[129] = "����������������������������������������������������������������丂丄丅丆丏丒丗丟丠両丣並丩丮丯丱丳丵丷丼乀乁乂乄乆乊乑乕乗乚乛乢乣乤乥乧乨乪乫乬乭乮乯乲乴乵乶乷乸乹乺乻乼乽乿亀亁亂亃亄亅亇亊�亐亖亗亙亜亝亞亣亪亯亰亱亴亶亷亸亹亼亽亾仈仌仏仐仒仚仛仜仠仢仦仧仩仭仮仯仱仴仸仹仺仼仾伀伂伃伄伅伆伇伈伋伌伒伓伔伕伖伜伝伡伣伨伩伬伭伮伱伳伵伷伹伻伾伿佀佁佂佄佅佇佈佉佊佋佌佒佔佖佡佢佦佨佪佫佭佮佱佲併佷佸佹佺佽侀侁侂侅來侇侊侌侎侐侒侓侕侖侘侙侚侜侞侟価侢�".split("");
  119. for(j = 0; j != D[129].length; ++j) if(D[129][j].charCodeAt(0) !== 0xFFFD) { e[D[129][j]] = 33024 + j; d[33024 + j] = D[129][j];}
  120. D[130] = "����������������������������������������������������������������侤侫侭侰侱侲侳侴侶侷侸侹侺侻侼侽侾俀俁係俆俇俈俉俋俌俍俒俓俔俕俖俙俛俠俢俤俥俧俫俬俰俲俴俵俶俷俹俻俼俽俿倀倁倂倃倄倅倆倇倈倉倊�個倎倐們倓倕倖倗倛倝倞倠倢倣値倧倫倯倰倱倲倳倴倵倶倷倸倹倻倽倿偀偁偂偄偅偆偉偊偋偍偐偑偒偓偔偖偗偘偙偛偝偞偟偠偡偢偣偤偦偧偨偩偪偫偭偮偯偰偱偲偳側偵偸偹偺偼偽傁傂傃傄傆傇傉傊傋傌傎傏傐傑傒傓傔傕傖傗傘備傚傛傜傝傞傟傠傡傢傤傦傪傫傭傮傯傰傱傳傴債傶傷傸傹傼�".split("");
  121. for(j = 0; j != D[130].length; ++j) if(D[130][j].charCodeAt(0) !== 0xFFFD) { e[D[130][j]] = 33280 + j; d[33280 + j] = D[130][j];}
  122. D[131] = "����������������������������������������������������������������傽傾傿僀僁僂僃僄僅僆僇僈僉僊僋僌働僎僐僑僒僓僔僕僗僘僙僛僜僝僞僟僠僡僢僣僤僥僨僩僪僫僯僰僱僲僴僶僷僸價僺僼僽僾僿儀儁儂儃億儅儈�儉儊儌儍儎儏儐儑儓儔儕儖儗儘儙儚儛儜儝儞償儠儢儣儤儥儦儧儨儩優儫儬儭儮儯儰儱儲儳儴儵儶儷儸儹儺儻儼儽儾兂兇兊兌兎兏児兒兓兗兘兙兛兝兞兟兠兡兣兤兦內兩兪兯兲兺兾兿冃冄円冇冊冋冎冏冐冑冓冔冘冚冝冞冟冡冣冦冧冨冩冪冭冮冴冸冹冺冾冿凁凂凃凅凈凊凍凎凐凒凓凔凕凖凗�".split("");
  123. for(j = 0; j != D[131].length; ++j) if(D[131][j].charCodeAt(0) !== 0xFFFD) { e[D[131][j]] = 33536 + j; d[33536 + j] = D[131][j];}
  124. D[132] = "����������������������������������������������������������������凘凙凚凜凞凟凢凣凥処凧凨凩凪凬凮凱凲凴凷凾刄刅刉刋刌刏刐刓刔刕刜刞刟刡刢刣別刦刧刪刬刯刱刲刴刵刼刾剄剅剆則剈剉剋剎剏剒剓剕剗剘�剙剚剛剝剟剠剢剣剤剦剨剫剬剭剮剰剱剳剴創剶剷剸剹剺剻剼剾劀劃劄劅劆劇劉劊劋劌劍劎劏劑劒劔劕劖劗劘劙劚劜劤劥劦劧劮劯劰労劵劶劷劸効劺劻劼劽勀勁勂勄勅勆勈勊勌勍勎勏勑勓勔動勗務勚勛勜勝勞勠勡勢勣勥勦勧勨勩勪勫勬勭勮勯勱勲勳勴勵勶勷勸勻勼勽匁匂匃匄匇匉匊匋匌匎�".split("");
  125. for(j = 0; j != D[132].length; ++j) if(D[132][j].charCodeAt(0) !== 0xFFFD) { e[D[132][j]] = 33792 + j; d[33792 + j] = D[132][j];}
  126. D[133] = "����������������������������������������������������������������匑匒匓匔匘匛匜匞匟匢匤匥匧匨匩匫匬匭匯匰匱匲匳匴匵匶匷匸匼匽區卂卄卆卋卌卍卐協単卙卛卝卥卨卪卬卭卲卶卹卻卼卽卾厀厁厃厇厈厊厎厏�厐厑厒厓厔厖厗厙厛厜厞厠厡厤厧厪厫厬厭厯厰厱厲厳厴厵厷厸厹厺厼厽厾叀參叄叅叆叇収叏叐叒叓叕叚叜叝叞叡叢叧叴叺叾叿吀吂吅吇吋吔吘吙吚吜吢吤吥吪吰吳吶吷吺吽吿呁呂呄呅呇呉呌呍呎呏呑呚呝呞呟呠呡呣呥呧呩呪呫呬呭呮呯呰呴呹呺呾呿咁咃咅咇咈咉咊咍咑咓咗咘咜咞咟咠咡�".split("");
  127. for(j = 0; j != D[133].length; ++j) if(D[133][j].charCodeAt(0) !== 0xFFFD) { e[D[133][j]] = 34048 + j; d[34048 + j] = D[133][j];}
  128. D[134] = "����������������������������������������������������������������咢咥咮咰咲咵咶咷咹咺咼咾哃哅哊哋哖哘哛哠員哢哣哤哫哬哯哰哱哴哵哶哷哸哹哻哾唀唂唃唄唅唈唊唋唌唍唎唒唓唕唖唗唘唙唚唜唝唞唟唡唥唦�唨唩唫唭唲唴唵唶唸唹唺唻唽啀啂啅啇啈啋啌啍啎問啑啒啓啔啗啘啙啚啛啝啞啟啠啢啣啨啩啫啯啰啱啲啳啴啹啺啽啿喅喆喌喍喎喐喒喓喕喖喗喚喛喞喠喡喢喣喤喥喦喨喩喪喫喬喭單喯喰喲喴営喸喺喼喿嗀嗁嗂嗃嗆嗇嗈嗊嗋嗎嗏嗐嗕嗗嗘嗙嗚嗛嗞嗠嗢嗧嗩嗭嗮嗰嗱嗴嗶嗸嗹嗺嗻嗼嗿嘂嘃嘄嘅�".split("");
  129. for(j = 0; j != D[134].length; ++j) if(D[134][j].charCodeAt(0) !== 0xFFFD) { e[D[134][j]] = 34304 + j; d[34304 + j] = D[134][j];}
  130. D[135] = "����������������������������������������������������������������嘆嘇嘊嘋嘍嘐嘑嘒嘓嘔嘕嘖嘗嘙嘚嘜嘝嘠嘡嘢嘥嘦嘨嘩嘪嘫嘮嘯嘰嘳嘵嘷嘸嘺嘼嘽嘾噀噁噂噃噄噅噆噇噈噉噊噋噏噐噑噒噓噕噖噚噛噝噞噟噠噡�噣噥噦噧噭噮噯噰噲噳噴噵噷噸噹噺噽噾噿嚀嚁嚂嚃嚄嚇嚈嚉嚊嚋嚌嚍嚐嚑嚒嚔嚕嚖嚗嚘嚙嚚嚛嚜嚝嚞嚟嚠嚡嚢嚤嚥嚦嚧嚨嚩嚪嚫嚬嚭嚮嚰嚱嚲嚳嚴嚵嚶嚸嚹嚺嚻嚽嚾嚿囀囁囂囃囄囅囆囇囈囉囋囌囍囎囏囐囑囒囓囕囖囘囙囜団囥囦囧囨囩囪囬囮囯囲図囶囷囸囻囼圀圁圂圅圇國圌圍圎圏圐圑�".split("");
  131. for(j = 0; j != D[135].length; ++j) if(D[135][j].charCodeAt(0) !== 0xFFFD) { e[D[135][j]] = 34560 + j; d[34560 + j] = D[135][j];}
  132. D[136] = "����������������������������������������������������������������園圓圔圕圖圗團圙圚圛圝圞圠圡圢圤圥圦圧圫圱圲圴圵圶圷圸圼圽圿坁坃坄坅坆坈坉坋坒坓坔坕坖坘坙坢坣坥坧坬坮坰坱坲坴坵坸坹坺坽坾坿垀�垁垇垈垉垊垍垎垏垐垑垔垕垖垗垘垙垚垜垝垞垟垥垨垪垬垯垰垱垳垵垶垷垹垺垻垼垽垾垿埀埁埄埅埆埇埈埉埊埌埍埐埑埓埖埗埛埜埞埡埢埣埥埦埧埨埩埪埫埬埮埰埱埲埳埵埶執埻埼埾埿堁堃堄堅堈堉堊堌堎堏堐堒堓堔堖堗堘堚堛堜堝堟堢堣堥堦堧堨堩堫堬堭堮堯報堲堳場堶堷堸堹堺堻堼堽�".split("");
  133. for(j = 0; j != D[136].length; ++j) if(D[136][j].charCodeAt(0) !== 0xFFFD) { e[D[136][j]] = 34816 + j; d[34816 + j] = D[136][j];}
  134. D[137] = "����������������������������������������������������������������堾堿塀塁塂塃塅塆塇塈塉塊塋塎塏塐塒塓塕塖塗塙塚塛塜塝塟塠塡塢塣塤塦塧塨塩塪塭塮塯塰塱塲塳塴塵塶塷塸塹塺塻塼塽塿墂墄墆墇墈墊墋墌�墍墎墏墐墑墔墕墖増墘墛墜墝墠墡墢墣墤墥墦墧墪墫墬墭墮墯墰墱墲墳墴墵墶墷墸墹墺墻墽墾墿壀壂壃壄壆壇壈壉壊壋壌壍壎壏壐壒壓壔壖壗壘壙壚壛壜壝壞壟壠壡壢壣壥壦壧壨壩壪壭壯壱売壴壵壷壸壺壻壼壽壾壿夀夁夃夅夆夈変夊夋夌夎夐夑夒夓夗夘夛夝夞夠夡夢夣夦夨夬夰夲夳夵夶夻�".split("");
  135. for(j = 0; j != D[137].length; ++j) if(D[137][j].charCodeAt(0) !== 0xFFFD) { e[D[137][j]] = 35072 + j; d[35072 + j] = D[137][j];}
  136. D[138] = "����������������������������������������������������������������夽夾夿奀奃奅奆奊奌奍奐奒奓奙奛奜奝奞奟奡奣奤奦奧奨奩奪奫奬奭奮奯奰奱奲奵奷奺奻奼奾奿妀妅妉妋妌妎妏妐妑妔妕妘妚妛妜妝妟妠妡妢妦�妧妬妭妰妱妳妴妵妶妷妸妺妼妽妿姀姁姂姃姄姅姇姈姉姌姍姎姏姕姖姙姛姞姟姠姡姢姤姦姧姩姪姫姭姮姯姰姱姲姳姴姵姶姷姸姺姼姽姾娀娂娊娋娍娎娏娐娒娔娕娖娗娙娚娛娝娞娡娢娤娦娧娨娪娫娬娭娮娯娰娳娵娷娸娹娺娻娽娾娿婁婂婃婄婅婇婈婋婌婍婎婏婐婑婒婓婔婖婗婘婙婛婜婝婞婟婠�".split("");
  137. for(j = 0; j != D[138].length; ++j) if(D[138][j].charCodeAt(0) !== 0xFFFD) { e[D[138][j]] = 35328 + j; d[35328 + j] = D[138][j];}
  138. D[139] = "����������������������������������������������������������������婡婣婤婥婦婨婩婫婬婭婮婯婰婱婲婳婸婹婻婼婽婾媀媁媂媃媄媅媆媇媈媉媊媋媌媍媎媏媐媑媓媔媕媖媗媘媙媜媝媞媟媠媡媢媣媤媥媦媧媨媩媫媬�媭媮媯媰媱媴媶媷媹媺媻媼媽媿嫀嫃嫄嫅嫆嫇嫈嫊嫋嫍嫎嫏嫐嫑嫓嫕嫗嫙嫚嫛嫝嫞嫟嫢嫤嫥嫧嫨嫪嫬嫭嫮嫯嫰嫲嫳嫴嫵嫶嫷嫸嫹嫺嫻嫼嫽嫾嫿嬀嬁嬂嬃嬄嬅嬆嬇嬈嬊嬋嬌嬍嬎嬏嬐嬑嬒嬓嬔嬕嬘嬙嬚嬛嬜嬝嬞嬟嬠嬡嬢嬣嬤嬥嬦嬧嬨嬩嬪嬫嬬嬭嬮嬯嬰嬱嬳嬵嬶嬸嬹嬺嬻嬼嬽嬾嬿孁孂孃孄孅孆孇�".split("");
  139. for(j = 0; j != D[139].length; ++j) if(D[139][j].charCodeAt(0) !== 0xFFFD) { e[D[139][j]] = 35584 + j; d[35584 + j] = D[139][j];}
  140. D[140] = "����������������������������������������������������������������孈孉孊孋孌孍孎孏孒孖孞孠孡孧孨孫孭孮孯孲孴孶孷學孹孻孼孾孿宂宆宊宍宎宐宑宒宔宖実宧宨宩宬宭宮宯宱宲宷宺宻宼寀寁寃寈寉寊寋寍寎寏�寑寔寕寖寗寘寙寚寛寜寠寢寣實寧審寪寫寬寭寯寱寲寳寴寵寶寷寽対尀専尃尅將專尋尌對導尐尒尓尗尙尛尞尟尠尡尣尦尨尩尪尫尭尮尯尰尲尳尵尶尷屃屄屆屇屌屍屒屓屔屖屗屘屚屛屜屝屟屢層屧屨屩屪屫屬屭屰屲屳屴屵屶屷屸屻屼屽屾岀岃岄岅岆岇岉岊岋岎岏岒岓岕岝岞岟岠岡岤岥岦岧岨�".split("");
  141. for(j = 0; j != D[140].length; ++j) if(D[140][j].charCodeAt(0) !== 0xFFFD) { e[D[140][j]] = 35840 + j; d[35840 + j] = D[140][j];}
  142. D[141] = "����������������������������������������������������������������岪岮岯岰岲岴岶岹岺岻岼岾峀峂峃峅峆峇峈峉峊峌峍峎峏峐峑峓峔峕峖峗峘峚峛峜峝峞峟峠峢峣峧峩峫峬峮峯峱峲峳峴峵島峷峸峹峺峼峽峾峿崀�崁崄崅崈崉崊崋崌崍崏崐崑崒崓崕崗崘崙崚崜崝崟崠崡崢崣崥崨崪崫崬崯崰崱崲崳崵崶崷崸崹崺崻崼崿嵀嵁嵂嵃嵄嵅嵆嵈嵉嵍嵎嵏嵐嵑嵒嵓嵔嵕嵖嵗嵙嵚嵜嵞嵟嵠嵡嵢嵣嵤嵥嵦嵧嵨嵪嵭嵮嵰嵱嵲嵳嵵嵶嵷嵸嵹嵺嵻嵼嵽嵾嵿嶀嶁嶃嶄嶅嶆嶇嶈嶉嶊嶋嶌嶍嶎嶏嶐嶑嶒嶓嶔嶕嶖嶗嶘嶚嶛嶜嶞嶟嶠�".split("");
  143. for(j = 0; j != D[141].length; ++j) if(D[141][j].charCodeAt(0) !== 0xFFFD) { e[D[141][j]] = 36096 + j; d[36096 + j] = D[141][j];}
  144. D[142] = "����������������������������������������������������������������嶡嶢嶣嶤嶥嶦嶧嶨嶩嶪嶫嶬嶭嶮嶯嶰嶱嶲嶳嶴嶵嶶嶸嶹嶺嶻嶼嶽嶾嶿巀巁巂巃巄巆巇巈巉巊巋巌巎巏巐巑巒巓巔巕巖巗巘巙巚巜巟巠巣巤巪巬巭�巰巵巶巸巹巺巻巼巿帀帄帇帉帊帋帍帎帒帓帗帞帟帠帡帢帣帤帥帨帩帪師帬帯帰帲帳帴帵帶帹帺帾帿幀幁幃幆幇幈幉幊幋幍幎幏幐幑幒幓幖幗幘幙幚幜幝幟幠幣幤幥幦幧幨幩幪幫幬幭幮幯幰幱幵幷幹幾庁庂広庅庈庉庌庍庎庒庘庛庝庡庢庣庤庨庩庪庫庬庮庯庰庱庲庴庺庻庼庽庿廀廁廂廃廄廅�".split("");
  145. for(j = 0; j != D[142].length; ++j) if(D[142][j].charCodeAt(0) !== 0xFFFD) { e[D[142][j]] = 36352 + j; d[36352 + j] = D[142][j];}
  146. D[143] = "����������������������������������������������������������������廆廇廈廋廌廍廎廏廐廔廕廗廘廙廚廜廝廞廟廠廡廢廣廤廥廦廧廩廫廬廭廮廯廰廱廲廳廵廸廹廻廼廽弅弆弇弉弌弍弎弐弒弔弖弙弚弜弝弞弡弢弣弤�弨弫弬弮弰弲弳弴張弶強弸弻弽弾弿彁彂彃彄彅彆彇彈彉彊彋彌彍彎彏彑彔彙彚彛彜彞彟彠彣彥彧彨彫彮彯彲彴彵彶彸彺彽彾彿徃徆徍徎徏徑従徔徖徚徛徝從徟徠徢徣徤徥徦徧復徫徬徯徰徱徲徳徴徶徸徹徺徻徾徿忀忁忂忇忈忊忋忎忓忔忕忚忛応忞忟忢忣忥忦忨忩忬忯忰忲忳忴忶忷忹忺忼怇�".split("");
  147. for(j = 0; j != D[143].length; ++j) if(D[143][j].charCodeAt(0) !== 0xFFFD) { e[D[143][j]] = 36608 + j; d[36608 + j] = D[143][j];}
  148. D[144] = "����������������������������������������������������������������怈怉怋怌怐怑怓怗怘怚怞怟怢怣怤怬怭怮怰怱怲怳怴怶怷怸怹怺怽怾恀恄恅恆恇恈恉恊恌恎恏恑恓恔恖恗恘恛恜恞恟恠恡恥恦恮恱恲恴恵恷恾悀�悁悂悅悆悇悈悊悋悎悏悐悑悓悕悗悘悙悜悞悡悢悤悥悧悩悪悮悰悳悵悶悷悹悺悽悾悿惀惁惂惃惄惇惈惉惌惍惎惏惐惒惓惔惖惗惙惛惞惡惢惣惤惥惪惱惲惵惷惸惻惼惽惾惿愂愃愄愅愇愊愋愌愐愑愒愓愔愖愗愘愙愛愜愝愞愡愢愥愨愩愪愬愭愮愯愰愱愲愳愴愵愶愷愸愹愺愻愼愽愾慀慁慂慃慄慅慆�".split("");
  149. for(j = 0; j != D[144].length; ++j) if(D[144][j].charCodeAt(0) !== 0xFFFD) { e[D[144][j]] = 36864 + j; d[36864 + j] = D[144][j];}
  150. D[145] = "����������������������������������������������������������������慇慉態慍慏慐慒慓慔慖慗慘慙慚慛慜慞慟慠慡慣慤慥慦慩慪慫慬慭慮慯慱慲慳慴慶慸慹慺慻慼慽慾慿憀憁憂憃憄憅憆憇憈憉憊憌憍憏憐憑憒憓憕�憖憗憘憙憚憛憜憞憟憠憡憢憣憤憥憦憪憫憭憮憯憰憱憲憳憴憵憶憸憹憺憻憼憽憿懀懁懃懄懅懆懇應懌懍懎懏懐懓懕懖懗懘懙懚懛懜懝懞懟懠懡懢懣懤懥懧懨懩懪懫懬懭懮懯懰懱懲懳懴懶懷懸懹懺懻懼懽懾戀戁戂戃戄戅戇戉戓戔戙戜戝戞戠戣戦戧戨戩戫戭戯戰戱戲戵戶戸戹戺戻戼扂扄扅扆扊�".split("");
  151. for(j = 0; j != D[145].length; ++j) if(D[145][j].charCodeAt(0) !== 0xFFFD) { e[D[145][j]] = 37120 + j; d[37120 + j] = D[145][j];}
  152. D[146] = "����������������������������������������������������������������扏扐払扖扗扙扚扜扝扞扟扠扡扢扤扥扨扱扲扴扵扷扸扺扻扽抁抂抃抅抆抇抈抋抌抍抎抏抐抔抙抜抝択抣抦抧抩抪抭抮抯抰抲抳抴抶抷抸抺抾拀拁�拃拋拏拑拕拝拞拠拡拤拪拫拰拲拵拸拹拺拻挀挃挄挅挆挊挋挌挍挏挐挒挓挔挕挗挘挙挜挦挧挩挬挭挮挰挱挳挴挵挶挷挸挻挼挾挿捀捁捄捇捈捊捑捒捓捔捖捗捘捙捚捛捜捝捠捤捥捦捨捪捫捬捯捰捲捳捴捵捸捹捼捽捾捿掁掃掄掅掆掋掍掑掓掔掕掗掙掚掛掜掝掞掟採掤掦掫掯掱掲掵掶掹掻掽掿揀�".split("");
  153. for(j = 0; j != D[146].length; ++j) if(D[146][j].charCodeAt(0) !== 0xFFFD) { e[D[146][j]] = 37376 + j; d[37376 + j] = D[146][j];}
  154. D[147] = "����������������������������������������������������������������揁揂揃揅揇揈揊揋揌揑揓揔揕揗揘揙揚換揜揝揟揢揤揥揦揧揨揫揬揮揯揰揱揳揵揷揹揺揻揼揾搃搄搆搇搈搉搊損搎搑搒搕搖搗搘搙搚搝搟搢搣搤�搥搧搨搩搫搮搯搰搱搲搳搵搶搷搸搹搻搼搾摀摂摃摉摋摌摍摎摏摐摑摓摕摖摗摙摚摛摜摝摟摠摡摢摣摤摥摦摨摪摫摬摮摯摰摱摲摳摴摵摶摷摻摼摽摾摿撀撁撃撆撈撉撊撋撌撍撎撏撐撓撔撗撘撚撛撜撝撟撠撡撢撣撥撦撧撨撪撫撯撱撲撳撴撶撹撻撽撾撿擁擃擄擆擇擈擉擊擋擌擏擑擓擔擕擖擙據�".split("");
  155. for(j = 0; j != D[147].length; ++j) if(D[147][j].charCodeAt(0) !== 0xFFFD) { e[D[147][j]] = 37632 + j; d[37632 + j] = D[147][j];}
  156. D[148] = "����������������������������������������������������������������擛擜擝擟擠擡擣擥擧擨擩擪擫擬擭擮擯擰擱擲擳擴擵擶擷擸擹擺擻擼擽擾擿攁攂攃攄攅攆攇攈攊攋攌攍攎攏攐攑攓攔攕攖攗攙攚攛攜攝攞攟攠攡�攢攣攤攦攧攨攩攪攬攭攰攱攲攳攷攺攼攽敀敁敂敃敄敆敇敊敋敍敎敐敒敓敔敗敘敚敜敟敠敡敤敥敧敨敩敪敭敮敯敱敳敵敶數敹敺敻敼敽敾敿斀斁斂斃斄斅斆斈斉斊斍斎斏斒斔斕斖斘斚斝斞斠斢斣斦斨斪斬斮斱斲斳斴斵斶斷斸斺斻斾斿旀旂旇旈旉旊旍旐旑旓旔旕旘旙旚旛旜旝旞旟旡旣旤旪旫�".split("");
  157. for(j = 0; j != D[148].length; ++j) if(D[148][j].charCodeAt(0) !== 0xFFFD) { e[D[148][j]] = 37888 + j; d[37888 + j] = D[148][j];}
  158. D[149] = "����������������������������������������������������������������旲旳旴旵旸旹旻旼旽旾旿昁昄昅昇昈昉昋昍昐昑昒昖昗昘昚昛昜昞昡昢昣昤昦昩昪昫昬昮昰昲昳昷昸昹昺昻昽昿晀時晄晅晆晇晈晉晊晍晎晐晑晘�晙晛晜晝晞晠晢晣晥晧晩晪晫晬晭晱晲晳晵晸晹晻晼晽晿暀暁暃暅暆暈暉暊暋暍暎暏暐暒暓暔暕暘暙暚暛暜暞暟暠暡暢暣暤暥暦暩暪暫暬暭暯暰暱暲暳暵暶暷暸暺暻暼暽暿曀曁曂曃曄曅曆曇曈曉曊曋曌曍曎曏曐曑曒曓曔曕曖曗曘曚曞曟曠曡曢曣曤曥曧曨曪曫曬曭曮曯曱曵曶書曺曻曽朁朂會�".split("");
  159. for(j = 0; j != D[149].length; ++j) if(D[149][j].charCodeAt(0) !== 0xFFFD) { e[D[149][j]] = 38144 + j; d[38144 + j] = D[149][j];}
  160. D[150] = "����������������������������������������������������������������朄朅朆朇朌朎朏朑朒朓朖朘朙朚朜朞朠朡朢朣朤朥朧朩朮朰朲朳朶朷朸朹朻朼朾朿杁杄杅杇杊杋杍杒杔杕杗杘杙杚杛杝杢杣杤杦杧杫杬杮東杴杶�杸杹杺杻杽枀枂枃枅枆枈枊枌枍枎枏枑枒枓枔枖枙枛枟枠枡枤枦枩枬枮枱枲枴枹枺枻枼枽枾枿柀柂柅柆柇柈柉柊柋柌柍柎柕柖柗柛柟柡柣柤柦柧柨柪柫柭柮柲柵柶柷柸柹柺査柼柾栁栂栃栄栆栍栐栒栔栕栘栙栚栛栜栞栟栠栢栣栤栥栦栧栨栫栬栭栮栯栰栱栴栵栶栺栻栿桇桋桍桏桒桖桗桘桙桚桛�".split("");
  161. for(j = 0; j != D[150].length; ++j) if(D[150][j].charCodeAt(0) !== 0xFFFD) { e[D[150][j]] = 38400 + j; d[38400 + j] = D[150][j];}
  162. D[151] = "����������������������������������������������������������������桜桝桞桟桪桬桭桮桯桰桱桲桳桵桸桹桺桻桼桽桾桿梀梂梄梇梈梉梊梋梌梍梎梐梑梒梔梕梖梘梙梚梛梜條梞梟梠梡梣梤梥梩梪梫梬梮梱梲梴梶梷梸�梹梺梻梼梽梾梿棁棃棄棅棆棇棈棊棌棎棏棐棑棓棔棖棗棙棛棜棝棞棟棡棢棤棥棦棧棨棩棪棫棬棭棯棲棳棴棶棷棸棻棽棾棿椀椂椃椄椆椇椈椉椊椌椏椑椓椔椕椖椗椘椙椚椛検椝椞椡椢椣椥椦椧椨椩椪椫椬椮椯椱椲椳椵椶椷椸椺椻椼椾楀楁楃楄楅楆楇楈楉楊楋楌楍楎楏楐楑楒楓楕楖楘楙楛楜楟�".split("");
  163. for(j = 0; j != D[151].length; ++j) if(D[151][j].charCodeAt(0) !== 0xFFFD) { e[D[151][j]] = 38656 + j; d[38656 + j] = D[151][j];}
  164. D[152] = "����������������������������������������������������������������楡楢楤楥楧楨楩楪楬業楯楰楲楳楴極楶楺楻楽楾楿榁榃榅榊榋榌榎榏榐榑榒榓榖榗榙榚榝榞榟榠榡榢榣榤榥榦榩榪榬榮榯榰榲榳榵榶榸榹榺榼榽�榾榿槀槂槃槄槅槆槇槈槉構槍槏槑槒槓槕槖槗様槙槚槜槝槞槡槢槣槤槥槦槧槨槩槪槫槬槮槯槰槱槳槴槵槶槷槸槹槺槻槼槾樀樁樂樃樄樅樆樇樈樉樋樌樍樎樏樐樑樒樓樔樕樖標樚樛樜樝樞樠樢樣樤樥樦樧権樫樬樭樮樰樲樳樴樶樷樸樹樺樻樼樿橀橁橂橃橅橆橈橉橊橋橌橍橎橏橑橒橓橔橕橖橗橚�".split("");
  165. for(j = 0; j != D[152].length; ++j) if(D[152][j].charCodeAt(0) !== 0xFFFD) { e[D[152][j]] = 38912 + j; d[38912 + j] = D[152][j];}
  166. D[153] = "����������������������������������������������������������������橜橝橞機橠橢橣橤橦橧橨橩橪橫橬橭橮橯橰橲橳橴橵橶橷橸橺橻橽橾橿檁檂檃檅檆檇檈檉檊檋檌檍檏檒檓檔檕檖檘檙檚檛檜檝檞檟檡檢檣檤檥檦�檧檨檪檭檮檯檰檱檲檳檴檵檶檷檸檹檺檻檼檽檾檿櫀櫁櫂櫃櫄櫅櫆櫇櫈櫉櫊櫋櫌櫍櫎櫏櫐櫑櫒櫓櫔櫕櫖櫗櫘櫙櫚櫛櫜櫝櫞櫟櫠櫡櫢櫣櫤櫥櫦櫧櫨櫩櫪櫫櫬櫭櫮櫯櫰櫱櫲櫳櫴櫵櫶櫷櫸櫹櫺櫻櫼櫽櫾櫿欀欁欂欃欄欅欆欇欈欉權欋欌欍欎欏欐欑欒欓欔欕欖欗欘欙欚欛欜欝欞欟欥欦欨欩欪欫欬欭欮�".split("");
  167. for(j = 0; j != D[153].length; ++j) if(D[153][j].charCodeAt(0) !== 0xFFFD) { e[D[153][j]] = 39168 + j; d[39168 + j] = D[153][j];}
  168. D[154] = "����������������������������������������������������������������欯欰欱欳欴欵欶欸欻欼欽欿歀歁歂歄歅歈歊歋歍歎歏歐歑歒歓歔歕歖歗歘歚歛歜歝歞歟歠歡歨歩歫歬歭歮歯歰歱歲歳歴歵歶歷歸歺歽歾歿殀殅殈�殌殎殏殐殑殔殕殗殘殙殜殝殞殟殠殢殣殤殥殦殧殨殩殫殬殭殮殯殰殱殲殶殸殹殺殻殼殽殾毀毃毄毆毇毈毉毊毌毎毐毑毘毚毜毝毞毟毠毢毣毤毥毦毧毨毩毬毭毮毰毱毲毴毶毷毸毺毻毼毾毿氀氁氂氃氄氈氉氊氋氌氎氒気氜氝氞氠氣氥氫氬氭氱氳氶氷氹氺氻氼氾氿汃汄汅汈汋汌汍汎汏汑汒汓汖汘�".split("");
  169. for(j = 0; j != D[154].length; ++j) if(D[154][j].charCodeAt(0) !== 0xFFFD) { e[D[154][j]] = 39424 + j; d[39424 + j] = D[154][j];}
  170. D[155] = "����������������������������������������������������������������汙汚汢汣汥汦汧汫汬汭汮汯汱汳汵汷汸決汻汼汿沀沄沇沊沋沍沎沑沒沕沖沗沘沚沜沝沞沠沢沨沬沯沰沴沵沶沷沺泀況泂泃泆泇泈泋泍泎泏泑泒泘�泙泚泜泝泟泤泦泧泩泬泭泲泴泹泿洀洂洃洅洆洈洉洊洍洏洐洑洓洔洕洖洘洜洝洟洠洡洢洣洤洦洨洩洬洭洯洰洴洶洷洸洺洿浀浂浄浉浌浐浕浖浗浘浛浝浟浡浢浤浥浧浨浫浬浭浰浱浲浳浵浶浹浺浻浽浾浿涀涁涃涄涆涇涊涋涍涏涐涒涖涗涘涙涚涜涢涥涬涭涰涱涳涴涶涷涹涺涻涼涽涾淁淂淃淈淉淊�".split("");
  171. for(j = 0; j != D[155].length; ++j) if(D[155][j].charCodeAt(0) !== 0xFFFD) { e[D[155][j]] = 39680 + j; d[39680 + j] = D[155][j];}
  172. D[156] = "����������������������������������������������������������������淍淎淏淐淒淓淔淕淗淚淛淜淟淢淣淥淧淨淩淪淭淯淰淲淴淵淶淸淺淽淾淿渀渁渂渃渄渆渇済渉渋渏渒渓渕渘渙減渜渞渟渢渦渧渨渪測渮渰渱渳渵�渶渷渹渻渼渽渾渿湀湁湂湅湆湇湈湉湊湋湌湏湐湑湒湕湗湙湚湜湝湞湠湡湢湣湤湥湦湧湨湩湪湬湭湯湰湱湲湳湴湵湶湷湸湹湺湻湼湽満溁溂溄溇溈溊溋溌溍溎溑溒溓溔溕準溗溙溚溛溝溞溠溡溣溤溦溨溩溫溬溭溮溰溳溵溸溹溼溾溿滀滃滄滅滆滈滉滊滌滍滎滐滒滖滘滙滛滜滝滣滧滪滫滬滭滮滯�".split("");
  173. for(j = 0; j != D[156].length; ++j) if(D[156][j].charCodeAt(0) !== 0xFFFD) { e[D[156][j]] = 39936 + j; d[39936 + j] = D[156][j];}
  174. D[157] = "����������������������������������������������������������������滰滱滲滳滵滶滷滸滺滻滼滽滾滿漀漁漃漄漅漇漈漊漋漌漍漎漐漑漒漖漗漘漙漚漛漜漝漞漟漡漢漣漥漦漧漨漬漮漰漲漴漵漷漸漹漺漻漼漽漿潀潁潂�潃潄潅潈潉潊潌潎潏潐潑潒潓潔潕潖潗潙潚潛潝潟潠潡潣潤潥潧潨潩潪潫潬潯潰潱潳潵潶潷潹潻潽潾潿澀澁澂澃澅澆澇澊澋澏澐澑澒澓澔澕澖澗澘澙澚澛澝澞澟澠澢澣澤澥澦澨澩澪澫澬澭澮澯澰澱澲澴澵澷澸澺澻澼澽澾澿濁濃濄濅濆濇濈濊濋濌濍濎濏濐濓濔濕濖濗濘濙濚濛濜濝濟濢濣濤濥�".split("");
  175. for(j = 0; j != D[157].length; ++j) if(D[157][j].charCodeAt(0) !== 0xFFFD) { e[D[157][j]] = 40192 + j; d[40192 + j] = D[157][j];}
  176. D[158] = "����������������������������������������������������������������濦濧濨濩濪濫濬濭濰濱濲濳濴濵濶濷濸濹濺濻濼濽濾濿瀀瀁瀂瀃瀄瀅瀆瀇瀈瀉瀊瀋瀌瀍瀎瀏瀐瀒瀓瀔瀕瀖瀗瀘瀙瀜瀝瀞瀟瀠瀡瀢瀤瀥瀦瀧瀨瀩瀪�瀫瀬瀭瀮瀯瀰瀱瀲瀳瀴瀶瀷瀸瀺瀻瀼瀽瀾瀿灀灁灂灃灄灅灆灇灈灉灊灋灍灎灐灑灒灓灔灕灖灗灘灙灚灛灜灝灟灠灡灢灣灤灥灦灧灨灩灪灮灱灲灳灴灷灹灺灻災炁炂炃炄炆炇炈炋炌炍炏炐炑炓炗炘炚炛炞炟炠炡炢炣炤炥炦炧炨炩炪炰炲炴炵炶為炾炿烄烅烆烇烉烋烌烍烎烏烐烑烒烓烔烕烖烗烚�".split("");
  177. for(j = 0; j != D[158].length; ++j) if(D[158][j].charCodeAt(0) !== 0xFFFD) { e[D[158][j]] = 40448 + j; d[40448 + j] = D[158][j];}
  178. D[159] = "����������������������������������������������������������������烜烝烞烠烡烢烣烥烪烮烰烱烲烳烴烵烶烸烺烻烼烾烿焀焁焂焃焄焅焆焇焈焋焌焍焎焏焑焒焔焗焛焜焝焞焟焠無焢焣焤焥焧焨焩焪焫焬焭焮焲焳焴�焵焷焸焹焺焻焼焽焾焿煀煁煂煃煄煆煇煈煉煋煍煏煐煑煒煓煔煕煖煗煘煙煚煛煝煟煠煡煢煣煥煩煪煫煬煭煯煰煱煴煵煶煷煹煻煼煾煿熀熁熂熃熅熆熇熈熉熋熌熍熎熐熑熒熓熕熖熗熚熛熜熝熞熡熢熣熤熥熦熧熩熪熫熭熮熯熰熱熲熴熶熷熸熺熻熼熽熾熿燀燁燂燄燅燆燇燈燉燊燋燌燍燏燐燑燒燓�".split("");
  179. for(j = 0; j != D[159].length; ++j) if(D[159][j].charCodeAt(0) !== 0xFFFD) { e[D[159][j]] = 40704 + j; d[40704 + j] = D[159][j];}
  180. D[160] = "����������������������������������������������������������������燖燗燘燙燚燛燜燝燞營燡燢燣燤燦燨燩燪燫燬燭燯燰燱燲燳燴燵燶燷燸燺燻燼燽燾燿爀爁爂爃爄爅爇爈爉爊爋爌爍爎爏爐爑爒爓爔爕爖爗爘爙爚�爛爜爞爟爠爡爢爣爤爥爦爧爩爫爭爮爯爲爳爴爺爼爾牀牁牂牃牄牅牆牉牊牋牎牏牐牑牓牔牕牗牘牚牜牞牠牣牤牥牨牪牫牬牭牰牱牳牴牶牷牸牻牼牽犂犃犅犆犇犈犉犌犎犐犑犓犔犕犖犗犘犙犚犛犜犝犞犠犡犢犣犤犥犦犧犨犩犪犫犮犱犲犳犵犺犻犼犽犾犿狀狅狆狇狉狊狋狌狏狑狓狔狕狖狘狚狛�".split("");
  181. for(j = 0; j != D[160].length; ++j) if(D[160][j].charCodeAt(0) !== 0xFFFD) { e[D[160][j]] = 40960 + j; d[40960 + j] = D[160][j];}
  182. D[161] = "����������������������������������������������������������������������������������������������������������������������������������������������������������������� 、。·ˉˇ¨〃々—~‖…‘’“”〔〕〈〉《》「」『』〖〗【】±×÷∶∧∨∑∏∪∩∈∷√⊥∥∠⌒⊙∫∮≡≌≈∽∝≠≮≯≤≥∞∵∴♂♀°′″℃$¤¢£‰§№☆★○●◎◇◆□■△▲※→←↑↓〓�".split("");
  183. for(j = 0; j != D[161].length; ++j) if(D[161][j].charCodeAt(0) !== 0xFFFD) { e[D[161][j]] = 41216 + j; d[41216 + j] = D[161][j];}
  184. D[162] = "�����������������������������������������������������������������������������������������������������������������������������������������������������������������ⅰⅱⅲⅳⅴⅵⅶⅷⅸⅹ������⒈⒉⒊⒋⒌⒍⒎⒏⒐⒑⒒⒓⒔⒕⒖⒗⒘⒙⒚⒛⑴⑵⑶⑷⑸⑹⑺⑻⑼⑽⑾⑿⒀⒁⒂⒃⒄⒅⒆⒇①②③④⑤⑥⑦⑧⑨⑩��㈠㈡㈢㈣㈤㈥㈦㈧㈨㈩��ⅠⅡⅢⅣⅤⅥⅦⅧⅨⅩⅪⅫ���".split("");
  185. for(j = 0; j != D[162].length; ++j) if(D[162][j].charCodeAt(0) !== 0xFFFD) { e[D[162][j]] = 41472 + j; d[41472 + j] = D[162][j];}
  186. D[163] = "�����������������������������������������������������������������������������������������������������������������������������������������������������������������!"#¥%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|} ̄�".split("");
  187. for(j = 0; j != D[163].length; ++j) if(D[163][j].charCodeAt(0) !== 0xFFFD) { e[D[163][j]] = 41728 + j; d[41728 + j] = D[163][j];}
  188. D[164] = "�����������������������������������������������������������������������������������������������������������������������������������������������������������������ぁあぃいぅうぇえぉおかがきぎくぐけげこごさざしじすずせぜそぞただちぢっつづてでとどなにぬねのはばぱひびぴふぶぷへべぺほぼぽまみむめもゃやゅゆょよらりるれろゎわゐゑをん������������".split("");
  189. for(j = 0; j != D[164].length; ++j) if(D[164][j].charCodeAt(0) !== 0xFFFD) { e[D[164][j]] = 41984 + j; d[41984 + j] = D[164][j];}
  190. D[165] = "�����������������������������������������������������������������������������������������������������������������������������������������������������������������ァアィイゥウェエォオカガキギクグケゲコゴサザシジスズセゼソゾタダチヂッツヅテデトドナニヌネノハバパヒビピフブプヘベペホボポマミムメモャヤュユョヨラリルレロヮワヰヱヲンヴヵヶ���������".split("");
  191. for(j = 0; j != D[165].length; ++j) if(D[165][j].charCodeAt(0) !== 0xFFFD) { e[D[165][j]] = 42240 + j; d[42240 + j] = D[165][j];}
  192. D[166] = "�����������������������������������������������������������������������������������������������������������������������������������������������������������������ΑΒΓΔΕΖΗΘΙΚΛΜΝΞΟΠΡΣΤΥΦΧΨΩ��������αβγδεζηθικλμνξοπρστυφχψω�������︵︶︹︺︿﹀︽︾﹁﹂﹃﹄��︻︼︷︸︱�︳︴����������".split("");
  193. for(j = 0; j != D[166].length; ++j) if(D[166][j].charCodeAt(0) !== 0xFFFD) { e[D[166][j]] = 42496 + j; d[42496 + j] = D[166][j];}
  194. D[167] = "�����������������������������������������������������������������������������������������������������������������������������������������������������������������АБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯ���������������абвгдеёжзийклмнопрстуфхцчшщъыьэюя��������������".split("");
  195. for(j = 0; j != D[167].length; ++j) if(D[167][j].charCodeAt(0) !== 0xFFFD) { e[D[167][j]] = 42752 + j; d[42752 + j] = D[167][j];}
  196. D[168] = "����������������������������������������������������������������ˊˋ˙–―‥‵℅℉↖↗↘↙∕∟∣≒≦≧⊿═║╒╓╔╕╖╗╘╙╚╛╜╝╞╟╠╡╢╣╤╥╦╧╨╩╪╫╬╭╮╯╰╱╲╳▁▂▃▄▅▆▇�█▉▊▋▌▍▎▏▓▔▕▼▽◢◣◤◥☉⊕〒〝〞�����������āáǎàēéěèīíǐìōóǒòūúǔùǖǘǚǜüêɑ�ńň�ɡ����ㄅㄆㄇㄈㄉㄊㄋㄌㄍㄎㄏㄐㄑㄒㄓㄔㄕㄖㄗㄘㄙㄚㄛㄜㄝㄞㄟㄠㄡㄢㄣㄤㄥㄦㄧㄨㄩ����������������������".split("");
  197. for(j = 0; j != D[168].length; ++j) if(D[168][j].charCodeAt(0) !== 0xFFFD) { e[D[168][j]] = 43008 + j; d[43008 + j] = D[168][j];}
  198. D[169] = "����������������������������������������������������������������〡〢〣〤〥〦〧〨〩㊣㎎㎏㎜㎝㎞㎡㏄㏎㏑㏒㏕︰¬¦�℡㈱�‐���ー゛゜ヽヾ〆ゝゞ﹉﹊﹋﹌﹍﹎﹏﹐﹑﹒﹔﹕﹖﹗﹙﹚﹛﹜﹝﹞﹟﹠﹡�﹢﹣﹤﹥﹦﹨﹩﹪﹫�������������〇�������������─━│┃┄┅┆┇┈┉┊┋┌┍┎┏┐┑┒┓└┕┖┗┘┙┚┛├┝┞┟┠┡┢┣┤┥┦┧┨┩┪┫┬┭┮┯┰┱┲┳┴┵┶┷┸┹┺┻┼┽┾┿╀╁╂╃╄╅╆╇╈╉╊╋����������������".split("");
  199. for(j = 0; j != D[169].length; ++j) if(D[169][j].charCodeAt(0) !== 0xFFFD) { e[D[169][j]] = 43264 + j; d[43264 + j] = D[169][j];}
  200. D[170] = "����������������������������������������������������������������狜狝狟狢狣狤狥狦狧狪狫狵狶狹狽狾狿猀猂猄猅猆猇猈猉猋猌猍猏猐猑猒猔猘猙猚猟猠猣猤猦猧猨猭猯猰猲猳猵猶猺猻猼猽獀獁獂獃獄獅獆獇獈�獉獊獋獌獎獏獑獓獔獕獖獘獙獚獛獜獝獞獟獡獢獣獤獥獦獧獨獩獪獫獮獰獱�����������������������������������������������������������������������������������������������".split("");
  201. for(j = 0; j != D[170].length; ++j) if(D[170][j].charCodeAt(0) !== 0xFFFD) { e[D[170][j]] = 43520 + j; d[43520 + j] = D[170][j];}
  202. D[171] = "����������������������������������������������������������������獲獳獴獵獶獷獸獹獺獻獼獽獿玀玁玂玃玅玆玈玊玌玍玏玐玒玓玔玕玗玘玙玚玜玝玞玠玡玣玤玥玦玧玨玪玬玭玱玴玵玶玸玹玼玽玾玿珁珃珄珅珆珇�珋珌珎珒珓珔珕珖珗珘珚珛珜珝珟珡珢珣珤珦珨珪珫珬珮珯珰珱珳珴珵珶珷�����������������������������������������������������������������������������������������������".split("");
  203. for(j = 0; j != D[171].length; ++j) if(D[171][j].charCodeAt(0) !== 0xFFFD) { e[D[171][j]] = 43776 + j; d[43776 + j] = D[171][j];}
  204. D[172] = "����������������������������������������������������������������珸珹珺珻珼珽現珿琀琁琂琄琇琈琋琌琍琎琑琒琓琔琕琖琗琘琙琜琝琞琟琠琡琣琤琧琩琫琭琯琱琲琷琸琹琺琻琽琾琿瑀瑂瑃瑄瑅瑆瑇瑈瑉瑊瑋瑌瑍�瑎瑏瑐瑑瑒瑓瑔瑖瑘瑝瑠瑡瑢瑣瑤瑥瑦瑧瑨瑩瑪瑫瑬瑮瑯瑱瑲瑳瑴瑵瑸瑹瑺�����������������������������������������������������������������������������������������������".split("");
  205. for(j = 0; j != D[172].length; ++j) if(D[172][j].charCodeAt(0) !== 0xFFFD) { e[D[172][j]] = 44032 + j; d[44032 + j] = D[172][j];}
  206. D[173] = "����������������������������������������������������������������瑻瑼瑽瑿璂璄璅璆璈璉璊璌璍璏璑璒璓璔璕璖璗璘璙璚璛璝璟璠璡璢璣璤璥璦璪璫璬璭璮璯環璱璲璳璴璵璶璷璸璹璻璼璽璾璿瓀瓁瓂瓃瓄瓅瓆瓇�瓈瓉瓊瓋瓌瓍瓎瓏瓐瓑瓓瓔瓕瓖瓗瓘瓙瓚瓛瓝瓟瓡瓥瓧瓨瓩瓪瓫瓬瓭瓰瓱瓲�����������������������������������������������������������������������������������������������".split("");
  207. for(j = 0; j != D[173].length; ++j) if(D[173][j].charCodeAt(0) !== 0xFFFD) { e[D[173][j]] = 44288 + j; d[44288 + j] = D[173][j];}
  208. D[174] = "����������������������������������������������������������������瓳瓵瓸瓹瓺瓻瓼瓽瓾甀甁甂甃甅甆甇甈甉甊甋甌甎甐甒甔甕甖甗甛甝甞甠甡產産甤甦甧甪甮甴甶甹甼甽甿畁畂畃畄畆畇畉畊畍畐畑畒畓畕畖畗畘�畝畞畟畠畡畢畣畤畧畨畩畫畬畭畮畯異畱畳畵當畷畺畻畼畽畾疀疁疂疄疅疇�����������������������������������������������������������������������������������������������".split("");
  209. for(j = 0; j != D[174].length; ++j) if(D[174][j].charCodeAt(0) !== 0xFFFD) { e[D[174][j]] = 44544 + j; d[44544 + j] = D[174][j];}
  210. D[175] = "����������������������������������������������������������������疈疉疊疌疍疎疐疓疕疘疛疜疞疢疦疧疨疩疪疭疶疷疺疻疿痀痁痆痋痌痎痏痐痑痓痗痙痚痜痝痟痠痡痥痩痬痭痮痯痲痳痵痶痷痸痺痻痽痾瘂瘄瘆瘇�瘈瘉瘋瘍瘎瘏瘑瘒瘓瘔瘖瘚瘜瘝瘞瘡瘣瘧瘨瘬瘮瘯瘱瘲瘶瘷瘹瘺瘻瘽癁療癄�����������������������������������������������������������������������������������������������".split("");
  211. for(j = 0; j != D[175].length; ++j) if(D[175][j].charCodeAt(0) !== 0xFFFD) { e[D[175][j]] = 44800 + j; d[44800 + j] = D[175][j];}
  212. D[176] = "����������������������������������������������������������������癅癆癇癈癉癊癋癎癏癐癑癒癓癕癗癘癙癚癛癝癟癠癡癢癤癥癦癧癨癩癪癬癭癮癰癱癲癳癴癵癶癷癹発發癿皀皁皃皅皉皊皌皍皏皐皒皔皕皗皘皚皛�皜皝皞皟皠皡皢皣皥皦皧皨皩皪皫皬皭皯皰皳皵皶皷皸皹皺皻皼皽皾盀盁盃啊阿埃挨哎唉哀皑癌蔼矮艾碍爱隘鞍氨安俺按暗岸胺案肮昂盎凹敖熬翱袄傲奥懊澳芭捌扒叭吧笆八疤巴拔跋靶把耙坝霸罢爸白柏百摆佰败拜稗斑班搬扳般颁板版扮拌伴瓣半办绊邦帮梆榜膀绑棒磅蚌镑傍谤苞胞包褒剥�".split("");
  213. for(j = 0; j != D[176].length; ++j) if(D[176][j].charCodeAt(0) !== 0xFFFD) { e[D[176][j]] = 45056 + j; d[45056 + j] = D[176][j];}
  214. D[177] = "����������������������������������������������������������������盄盇盉盋盌盓盕盙盚盜盝盞盠盡盢監盤盦盧盨盩盪盫盬盭盰盳盵盶盷盺盻盽盿眀眂眃眅眆眊県眎眏眐眑眒眓眔眕眖眗眘眛眜眝眞眡眣眤眥眧眪眫�眬眮眰眱眲眳眴眹眻眽眾眿睂睄睅睆睈睉睊睋睌睍睎睏睒睓睔睕睖睗睘睙睜薄雹保堡饱宝抱报暴豹鲍爆杯碑悲卑北辈背贝钡倍狈备惫焙被奔苯本笨崩绷甭泵蹦迸逼鼻比鄙笔彼碧蓖蔽毕毙毖币庇痹闭敝弊必辟壁臂避陛鞭边编贬扁便变卞辨辩辫遍标彪膘表鳖憋别瘪彬斌濒滨宾摈兵冰柄丙秉饼炳�".split("");
  215. for(j = 0; j != D[177].length; ++j) if(D[177][j].charCodeAt(0) !== 0xFFFD) { e[D[177][j]] = 45312 + j; d[45312 + j] = D[177][j];}
  216. D[178] = "����������������������������������������������������������������睝睞睟睠睤睧睩睪睭睮睯睰睱睲睳睴睵睶睷睸睺睻睼瞁瞂瞃瞆瞇瞈瞉瞊瞋瞏瞐瞓瞔瞕瞖瞗瞘瞙瞚瞛瞜瞝瞞瞡瞣瞤瞦瞨瞫瞭瞮瞯瞱瞲瞴瞶瞷瞸瞹瞺�瞼瞾矀矁矂矃矄矅矆矇矈矉矊矋矌矎矏矐矑矒矓矔矕矖矘矙矚矝矞矟矠矡矤病并玻菠播拨钵波博勃搏铂箔伯帛舶脖膊渤泊驳捕卜哺补埠不布步簿部怖擦猜裁材才财睬踩采彩菜蔡餐参蚕残惭惨灿苍舱仓沧藏操糙槽曹草厕策侧册测层蹭插叉茬茶查碴搽察岔差诧拆柴豺搀掺蝉馋谗缠铲产阐颤昌猖�".split("");
  217. for(j = 0; j != D[178].length; ++j) if(D[178][j].charCodeAt(0) !== 0xFFFD) { e[D[178][j]] = 45568 + j; d[45568 + j] = D[178][j];}
  218. D[179] = "����������������������������������������������������������������矦矨矪矯矰矱矲矴矵矷矹矺矻矼砃砄砅砆砇砈砊砋砎砏砐砓砕砙砛砞砠砡砢砤砨砪砫砮砯砱砲砳砵砶砽砿硁硂硃硄硆硈硉硊硋硍硏硑硓硔硘硙硚�硛硜硞硟硠硡硢硣硤硥硦硧硨硩硯硰硱硲硳硴硵硶硸硹硺硻硽硾硿碀碁碂碃场尝常长偿肠厂敞畅唱倡超抄钞朝嘲潮巢吵炒车扯撤掣彻澈郴臣辰尘晨忱沉陈趁衬撑称城橙成呈乘程惩澄诚承逞骋秤吃痴持匙池迟弛驰耻齿侈尺赤翅斥炽充冲虫崇宠抽酬畴踌稠愁筹仇绸瞅丑臭初出橱厨躇锄雏滁除楚�".split("");
  219. for(j = 0; j != D[179].length; ++j) if(D[179][j].charCodeAt(0) !== 0xFFFD) { e[D[179][j]] = 45824 + j; d[45824 + j] = D[179][j];}
  220. D[180] = "����������������������������������������������������������������碄碅碆碈碊碋碏碐碒碔碕碖碙碝碞碠碢碤碦碨碩碪碫碬碭碮碯碵碶碷碸確碻碼碽碿磀磂磃磄磆磇磈磌磍磎磏磑磒磓磖磗磘磚磛磜磝磞磟磠磡磢磣�磤磥磦磧磩磪磫磭磮磯磰磱磳磵磶磸磹磻磼磽磾磿礀礂礃礄礆礇礈礉礊礋礌础储矗搐触处揣川穿椽传船喘串疮窗幢床闯创吹炊捶锤垂春椿醇唇淳纯蠢戳绰疵茨磁雌辞慈瓷词此刺赐次聪葱囱匆从丛凑粗醋簇促蹿篡窜摧崔催脆瘁粹淬翠村存寸磋撮搓措挫错搭达答瘩打大呆歹傣戴带殆代贷袋待逮�".split("");
  221. for(j = 0; j != D[180].length; ++j) if(D[180][j].charCodeAt(0) !== 0xFFFD) { e[D[180][j]] = 46080 + j; d[46080 + j] = D[180][j];}
  222. D[181] = "����������������������������������������������������������������礍礎礏礐礑礒礔礕礖礗礘礙礚礛礜礝礟礠礡礢礣礥礦礧礨礩礪礫礬礭礮礯礰礱礲礳礵礶礷礸礹礽礿祂祃祄祅祇祊祋祌祍祎祏祐祑祒祔祕祘祙祡祣�祤祦祩祪祫祬祮祰祱祲祳祴祵祶祹祻祼祽祾祿禂禃禆禇禈禉禋禌禍禎禐禑禒怠耽担丹单郸掸胆旦氮但惮淡诞弹蛋当挡党荡档刀捣蹈倒岛祷导到稻悼道盗德得的蹬灯登等瞪凳邓堤低滴迪敌笛狄涤翟嫡抵底地蒂第帝弟递缔颠掂滇碘点典靛垫电佃甸店惦奠淀殿碉叼雕凋刁掉吊钓调跌爹碟蝶迭谍叠�".split("");
  223. for(j = 0; j != D[181].length; ++j) if(D[181][j].charCodeAt(0) !== 0xFFFD) { e[D[181][j]] = 46336 + j; d[46336 + j] = D[181][j];}
  224. D[182] = "����������������������������������������������������������������禓禔禕禖禗禘禙禛禜禝禞禟禠禡禢禣禤禥禦禨禩禪禫禬禭禮禯禰禱禲禴禵禶禷禸禼禿秂秄秅秇秈秊秌秎秏秐秓秔秖秗秙秚秛秜秝秞秠秡秢秥秨秪�秬秮秱秲秳秴秵秶秷秹秺秼秾秿稁稄稅稇稈稉稊稌稏稐稑稒稓稕稖稘稙稛稜丁盯叮钉顶鼎锭定订丢东冬董懂动栋侗恫冻洞兜抖斗陡豆逗痘都督毒犊独读堵睹赌杜镀肚度渡妒端短锻段断缎堆兑队对墩吨蹲敦顿囤钝盾遁掇哆多夺垛躲朵跺舵剁惰堕蛾峨鹅俄额讹娥恶厄扼遏鄂饿恩而儿耳尔饵洱二�".split("");
  225. for(j = 0; j != D[182].length; ++j) if(D[182][j].charCodeAt(0) !== 0xFFFD) { e[D[182][j]] = 46592 + j; d[46592 + j] = D[182][j];}
  226. D[183] = "����������������������������������������������������������������稝稟稡稢稤稥稦稧稨稩稪稫稬稭種稯稰稱稲稴稵稶稸稺稾穀穁穂穃穄穅穇穈穉穊穋穌積穎穏穐穒穓穔穕穖穘穙穚穛穜穝穞穟穠穡穢穣穤穥穦穧穨�穩穪穫穬穭穮穯穱穲穳穵穻穼穽穾窂窅窇窉窊窋窌窎窏窐窓窔窙窚窛窞窡窢贰发罚筏伐乏阀法珐藩帆番翻樊矾钒繁凡烦反返范贩犯饭泛坊芳方肪房防妨仿访纺放菲非啡飞肥匪诽吠肺废沸费芬酚吩氛分纷坟焚汾粉奋份忿愤粪丰封枫蜂峰锋风疯烽逢冯缝讽奉凤佛否夫敷肤孵扶拂辐幅氟符伏俘服�".split("");
  227. for(j = 0; j != D[183].length; ++j) if(D[183][j].charCodeAt(0) !== 0xFFFD) { e[D[183][j]] = 46848 + j; d[46848 + j] = D[183][j];}
  228. D[184] = "����������������������������������������������������������������窣窤窧窩窪窫窮窯窰窱窲窴窵窶窷窸窹窺窻窼窽窾竀竁竂竃竄竅竆竇竈竉竊竌竍竎竏竐竑竒竓竔竕竗竘竚竛竜竝竡竢竤竧竨竩竪竫竬竮竰竱竲竳�竴竵競竷竸竻竼竾笀笁笂笅笇笉笌笍笎笐笒笓笖笗笘笚笜笝笟笡笢笣笧笩笭浮涪福袱弗甫抚辅俯釜斧脯腑府腐赴副覆赋复傅付阜父腹负富讣附妇缚咐噶嘎该改概钙盖溉干甘杆柑竿肝赶感秆敢赣冈刚钢缸肛纲岗港杠篙皋高膏羔糕搞镐稿告哥歌搁戈鸽胳疙割革葛格蛤阁隔铬个各给根跟耕更庚羹�".split("");
  229. for(j = 0; j != D[184].length; ++j) if(D[184][j].charCodeAt(0) !== 0xFFFD) { e[D[184][j]] = 47104 + j; d[47104 + j] = D[184][j];}
  230. D[185] = "����������������������������������������������������������������笯笰笲笴笵笶笷笹笻笽笿筀筁筂筃筄筆筈筊筍筎筓筕筗筙筜筞筟筡筣筤筥筦筧筨筩筪筫筬筭筯筰筳筴筶筸筺筼筽筿箁箂箃箄箆箇箈箉箊箋箌箎箏�箑箒箓箖箘箙箚箛箞箟箠箣箤箥箮箯箰箲箳箵箶箷箹箺箻箼箽箾箿節篂篃範埂耿梗工攻功恭龚供躬公宫弓巩汞拱贡共钩勾沟苟狗垢构购够辜菇咕箍估沽孤姑鼓古蛊骨谷股故顾固雇刮瓜剐寡挂褂乖拐怪棺关官冠观管馆罐惯灌贯光广逛瑰规圭硅归龟闺轨鬼诡癸桂柜跪贵刽辊滚棍锅郭国果裹过哈�".split("");
  231. for(j = 0; j != D[185].length; ++j) if(D[185][j].charCodeAt(0) !== 0xFFFD) { e[D[185][j]] = 47360 + j; d[47360 + j] = D[185][j];}
  232. D[186] = "����������������������������������������������������������������篅篈築篊篋篍篎篏篐篒篔篕篖篗篘篛篜篞篟篠篢篣篤篧篨篩篫篬篭篯篰篲篳篴篵篶篸篹篺篻篽篿簀簁簂簃簄簅簆簈簉簊簍簎簐簑簒簓簔簕簗簘簙�簚簛簜簝簞簠簡簢簣簤簥簨簩簫簬簭簮簯簰簱簲簳簴簵簶簷簹簺簻簼簽簾籂骸孩海氦亥害骇酣憨邯韩含涵寒函喊罕翰撼捍旱憾悍焊汗汉夯杭航壕嚎豪毫郝好耗号浩呵喝荷菏核禾和何合盒貉阂河涸赫褐鹤贺嘿黑痕很狠恨哼亨横衡恒轰哄烘虹鸿洪宏弘红喉侯猴吼厚候后呼乎忽瑚壶葫胡蝴狐糊湖�".split("");
  233. for(j = 0; j != D[186].length; ++j) if(D[186][j].charCodeAt(0) !== 0xFFFD) { e[D[186][j]] = 47616 + j; d[47616 + j] = D[186][j];}
  234. D[187] = "����������������������������������������������������������������籃籄籅籆籇籈籉籊籋籌籎籏籐籑籒籓籔籕籖籗籘籙籚籛籜籝籞籟籠籡籢籣籤籥籦籧籨籩籪籫籬籭籮籯籰籱籲籵籶籷籸籹籺籾籿粀粁粂粃粄粅粆粇�粈粊粋粌粍粎粏粐粓粔粖粙粚粛粠粡粣粦粧粨粩粫粬粭粯粰粴粵粶粷粸粺粻弧虎唬护互沪户花哗华猾滑画划化话槐徊怀淮坏欢环桓还缓换患唤痪豢焕涣宦幻荒慌黄磺蝗簧皇凰惶煌晃幌恍谎灰挥辉徽恢蛔回毁悔慧卉惠晦贿秽会烩汇讳诲绘荤昏婚魂浑混豁活伙火获或惑霍货祸击圾基机畸稽积箕�".split("");
  235. for(j = 0; j != D[187].length; ++j) if(D[187][j].charCodeAt(0) !== 0xFFFD) { e[D[187][j]] = 47872 + j; d[47872 + j] = D[187][j];}
  236. D[188] = "����������������������������������������������������������������粿糀糂糃糄糆糉糋糎糏糐糑糒糓糔糘糚糛糝糞糡糢糣糤糥糦糧糩糪糫糬糭糮糰糱糲糳糴糵糶糷糹糺糼糽糾糿紀紁紂紃約紅紆紇紈紉紋紌納紎紏紐�紑紒紓純紕紖紗紘紙級紛紜紝紞紟紡紣紤紥紦紨紩紪紬紭紮細紱紲紳紴紵紶肌饥迹激讥鸡姬绩缉吉极棘辑籍集及急疾汲即嫉级挤几脊己蓟技冀季伎祭剂悸济寄寂计记既忌际妓继纪嘉枷夹佳家加荚颊贾甲钾假稼价架驾嫁歼监坚尖笺间煎兼肩艰奸缄茧检柬碱硷拣捡简俭剪减荐槛鉴践贱见键箭件�".split("");
  237. for(j = 0; j != D[188].length; ++j) if(D[188][j].charCodeAt(0) !== 0xFFFD) { e[D[188][j]] = 48128 + j; d[48128 + j] = D[188][j];}
  238. D[189] = "����������������������������������������������������������������紷紸紹紺紻紼紽紾紿絀絁終絃組絅絆絇絈絉絊絋経絍絎絏結絑絒絓絔絕絖絗絘絙絚絛絜絝絞絟絠絡絢絣絤絥給絧絨絩絪絫絬絭絯絰統絲絳絴絵絶�絸絹絺絻絼絽絾絿綀綁綂綃綄綅綆綇綈綉綊綋綌綍綎綏綐綑綒經綔綕綖綗綘健舰剑饯渐溅涧建僵姜将浆江疆蒋桨奖讲匠酱降蕉椒礁焦胶交郊浇骄娇嚼搅铰矫侥脚狡角饺缴绞剿教酵轿较叫窖揭接皆秸街阶截劫节桔杰捷睫竭洁结解姐戒藉芥界借介疥诫届巾筋斤金今津襟紧锦仅谨进靳晋禁近烬浸�".split("");
  239. for(j = 0; j != D[189].length; ++j) if(D[189][j].charCodeAt(0) !== 0xFFFD) { e[D[189][j]] = 48384 + j; d[48384 + j] = D[189][j];}
  240. D[190] = "����������������������������������������������������������������継続綛綜綝綞綟綠綡綢綣綤綥綧綨綩綪綫綬維綯綰綱網綳綴綵綶綷綸綹綺綻綼綽綾綿緀緁緂緃緄緅緆緇緈緉緊緋緌緍緎総緐緑緒緓緔緕緖緗緘緙�線緛緜緝緞緟締緡緢緣緤緥緦緧編緩緪緫緬緭緮緯緰緱緲緳練緵緶緷緸緹緺尽劲荆兢茎睛晶鲸京惊精粳经井警景颈静境敬镜径痉靖竟竞净炯窘揪究纠玖韭久灸九酒厩救旧臼舅咎就疚鞠拘狙疽居驹菊局咀矩举沮聚拒据巨具距踞锯俱句惧炬剧捐鹃娟倦眷卷绢撅攫抉掘倔爵觉决诀绝均菌钧军君峻�".split("");
  241. for(j = 0; j != D[190].length; ++j) if(D[190][j].charCodeAt(0) !== 0xFFFD) { e[D[190][j]] = 48640 + j; d[48640 + j] = D[190][j];}
  242. D[191] = "����������������������������������������������������������������緻緼緽緾緿縀縁縂縃縄縅縆縇縈縉縊縋縌縍縎縏縐縑縒縓縔縕縖縗縘縙縚縛縜縝縞縟縠縡縢縣縤縥縦縧縨縩縪縫縬縭縮縯縰縱縲縳縴縵縶縷縸縹�縺縼總績縿繀繂繃繄繅繆繈繉繊繋繌繍繎繏繐繑繒繓織繕繖繗繘繙繚繛繜繝俊竣浚郡骏喀咖卡咯开揩楷凯慨刊堪勘坎砍看康慷糠扛抗亢炕考拷烤靠坷苛柯棵磕颗科壳咳可渴克刻客课肯啃垦恳坑吭空恐孔控抠口扣寇枯哭窟苦酷库裤夸垮挎跨胯块筷侩快宽款匡筐狂框矿眶旷况亏盔岿窥葵奎魁傀�".split("");
  243. for(j = 0; j != D[191].length; ++j) if(D[191][j].charCodeAt(0) !== 0xFFFD) { e[D[191][j]] = 48896 + j; d[48896 + j] = D[191][j];}
  244. D[192] = "����������������������������������������������������������������繞繟繠繡繢繣繤繥繦繧繨繩繪繫繬繭繮繯繰繱繲繳繴繵繶繷繸繹繺繻繼繽繾繿纀纁纃纄纅纆纇纈纉纊纋續纍纎纏纐纑纒纓纔纕纖纗纘纙纚纜纝纞�纮纴纻纼绖绤绬绹缊缐缞缷缹缻缼缽缾缿罀罁罃罆罇罈罉罊罋罌罍罎罏罒罓馈愧溃坤昆捆困括扩廓阔垃拉喇蜡腊辣啦莱来赖蓝婪栏拦篮阑兰澜谰揽览懒缆烂滥琅榔狼廊郎朗浪捞劳牢老佬姥酪烙涝勒乐雷镭蕾磊累儡垒擂肋类泪棱楞冷厘梨犁黎篱狸离漓理李里鲤礼莉荔吏栗丽厉励砾历利傈例俐�".split("");
  245. for(j = 0; j != D[192].length; ++j) if(D[192][j].charCodeAt(0) !== 0xFFFD) { e[D[192][j]] = 49152 + j; d[49152 + j] = D[192][j];}
  246. D[193] = "����������������������������������������������������������������罖罙罛罜罝罞罠罣罤罥罦罧罫罬罭罯罰罳罵罶罷罸罺罻罼罽罿羀羂羃羄羅羆羇羈羉羋羍羏羐羑羒羓羕羖羗羘羙羛羜羠羢羣羥羦羨義羪羫羬羭羮羱�羳羴羵羶羷羺羻羾翀翂翃翄翆翇翈翉翋翍翏翐翑習翓翖翗翙翚翛翜翝翞翢翣痢立粒沥隶力璃哩俩联莲连镰廉怜涟帘敛脸链恋炼练粮凉梁粱良两辆量晾亮谅撩聊僚疗燎寥辽潦了撂镣廖料列裂烈劣猎琳林磷霖临邻鳞淋凛赁吝拎玲菱零龄铃伶羚凌灵陵岭领另令溜琉榴硫馏留刘瘤流柳六龙聋咙笼窿�".split("");
  247. for(j = 0; j != D[193].length; ++j) if(D[193][j].charCodeAt(0) !== 0xFFFD) { e[D[193][j]] = 49408 + j; d[49408 + j] = D[193][j];}
  248. D[194] = "����������������������������������������������������������������翤翧翨翪翫翬翭翯翲翴翵翶翷翸翹翺翽翾翿耂耇耈耉耊耎耏耑耓耚耛耝耞耟耡耣耤耫耬耭耮耯耰耲耴耹耺耼耾聀聁聄聅聇聈聉聎聏聐聑聓聕聖聗�聙聛聜聝聞聟聠聡聢聣聤聥聦聧聨聫聬聭聮聯聰聲聳聴聵聶職聸聹聺聻聼聽隆垄拢陇楼娄搂篓漏陋芦卢颅庐炉掳卤虏鲁麓碌露路赂鹿潞禄录陆戮驴吕铝侣旅履屡缕虑氯律率滤绿峦挛孪滦卵乱掠略抡轮伦仑沦纶论萝螺罗逻锣箩骡裸落洛骆络妈麻玛码蚂马骂嘛吗埋买麦卖迈脉瞒馒蛮满蔓曼慢漫�".split("");
  249. for(j = 0; j != D[194].length; ++j) if(D[194][j].charCodeAt(0) !== 0xFFFD) { e[D[194][j]] = 49664 + j; d[49664 + j] = D[194][j];}
  250. D[195] = "����������������������������������������������������������������聾肁肂肅肈肊肍肎肏肐肑肒肔肕肗肙肞肣肦肧肨肬肰肳肵肶肸肹肻胅胇胈胉胊胋胏胐胑胒胓胔胕胘胟胠胢胣胦胮胵胷胹胻胾胿脀脁脃脄脅脇脈脋�脌脕脗脙脛脜脝脟脠脡脢脣脤脥脦脧脨脩脪脫脭脮脰脳脴脵脷脹脺脻脼脽脿谩芒茫盲氓忙莽猫茅锚毛矛铆卯茂冒帽貌贸么玫枚梅酶霉煤没眉媒镁每美昧寐妹媚门闷们萌蒙檬盟锰猛梦孟眯醚靡糜迷谜弥米秘觅泌蜜密幂棉眠绵冕免勉娩缅面苗描瞄藐秒渺庙妙蔑灭民抿皿敏悯闽明螟鸣铭名命谬摸�".split("");
  251. for(j = 0; j != D[195].length; ++j) if(D[195][j].charCodeAt(0) !== 0xFFFD) { e[D[195][j]] = 49920 + j; d[49920 + j] = D[195][j];}
  252. D[196] = "����������������������������������������������������������������腀腁腂腃腄腅腇腉腍腎腏腒腖腗腘腛腜腝腞腟腡腢腣腤腦腨腪腫腬腯腲腳腵腶腷腸膁膃膄膅膆膇膉膋膌膍膎膐膒膓膔膕膖膗膙膚膞膟膠膡膢膤膥�膧膩膫膬膭膮膯膰膱膲膴膵膶膷膸膹膼膽膾膿臄臅臇臈臉臋臍臎臏臐臑臒臓摹蘑模膜磨摩魔抹末莫墨默沫漠寞陌谋牟某拇牡亩姆母墓暮幕募慕木目睦牧穆拿哪呐钠那娜纳氖乃奶耐奈南男难囊挠脑恼闹淖呢馁内嫩能妮霓倪泥尼拟你匿腻逆溺蔫拈年碾撵捻念娘酿鸟尿捏聂孽啮镊镍涅您柠狞凝宁�".split("");
  253. for(j = 0; j != D[196].length; ++j) if(D[196][j].charCodeAt(0) !== 0xFFFD) { e[D[196][j]] = 50176 + j; d[50176 + j] = D[196][j];}
  254. D[197] = "����������������������������������������������������������������臔臕臖臗臘臙臚臛臜臝臞臟臠臡臢臤臥臦臨臩臫臮臯臰臱臲臵臶臷臸臹臺臽臿舃與興舉舊舋舎舏舑舓舕舖舗舘舙舚舝舠舤舥舦舧舩舮舲舺舼舽舿�艀艁艂艃艅艆艈艊艌艍艎艐艑艒艓艔艕艖艗艙艛艜艝艞艠艡艢艣艤艥艦艧艩拧泞牛扭钮纽脓浓农弄奴努怒女暖虐疟挪懦糯诺哦欧鸥殴藕呕偶沤啪趴爬帕怕琶拍排牌徘湃派攀潘盘磐盼畔判叛乓庞旁耪胖抛咆刨炮袍跑泡呸胚培裴赔陪配佩沛喷盆砰抨烹澎彭蓬棚硼篷膨朋鹏捧碰坯砒霹批披劈琵毗�".split("");
  255. for(j = 0; j != D[197].length; ++j) if(D[197][j].charCodeAt(0) !== 0xFFFD) { e[D[197][j]] = 50432 + j; d[50432 + j] = D[197][j];}
  256. D[198] = "����������������������������������������������������������������艪艫艬艭艱艵艶艷艸艻艼芀芁芃芅芆芇芉芌芐芓芔芕芖芚芛芞芠芢芣芧芲芵芶芺芻芼芿苀苂苃苅苆苉苐苖苙苚苝苢苧苨苩苪苬苭苮苰苲苳苵苶苸�苺苼苽苾苿茀茊茋茍茐茒茓茖茘茙茝茞茟茠茡茢茣茤茥茦茩茪茮茰茲茷茻茽啤脾疲皮匹痞僻屁譬篇偏片骗飘漂瓢票撇瞥拼频贫品聘乒坪苹萍平凭瓶评屏坡泼颇婆破魄迫粕剖扑铺仆莆葡菩蒲埔朴圃普浦谱曝瀑期欺栖戚妻七凄漆柒沏其棋奇歧畦崎脐齐旗祈祁骑起岂乞企启契砌器气迄弃汽泣讫掐�".split("");
  257. for(j = 0; j != D[198].length; ++j) if(D[198][j].charCodeAt(0) !== 0xFFFD) { e[D[198][j]] = 50688 + j; d[50688 + j] = D[198][j];}
  258. D[199] = "����������������������������������������������������������������茾茿荁荂荄荅荈荊荋荌荍荎荓荕荖荗荘荙荝荢荰荱荲荳荴荵荶荹荺荾荿莀莁莂莃莄莇莈莊莋莌莍莏莐莑莔莕莖莗莙莚莝莟莡莢莣莤莥莦莧莬莭莮�莯莵莻莾莿菂菃菄菆菈菉菋菍菎菐菑菒菓菕菗菙菚菛菞菢菣菤菦菧菨菫菬菭恰洽牵扦钎铅千迁签仟谦乾黔钱钳前潜遣浅谴堑嵌欠歉枪呛腔羌墙蔷强抢橇锹敲悄桥瞧乔侨巧鞘撬翘峭俏窍切茄且怯窃钦侵亲秦琴勤芹擒禽寝沁青轻氢倾卿清擎晴氰情顷请庆琼穷秋丘邱球求囚酋泅趋区蛆曲躯屈驱渠�".split("");
  259. for(j = 0; j != D[199].length; ++j) if(D[199][j].charCodeAt(0) !== 0xFFFD) { e[D[199][j]] = 50944 + j; d[50944 + j] = D[199][j];}
  260. D[200] = "����������������������������������������������������������������菮華菳菴菵菶菷菺菻菼菾菿萀萂萅萇萈萉萊萐萒萓萔萕萖萗萙萚萛萞萟萠萡萢萣萩萪萫萬萭萮萯萰萲萳萴萵萶萷萹萺萻萾萿葀葁葂葃葄葅葇葈葉�葊葋葌葍葎葏葐葒葓葔葕葖葘葝葞葟葠葢葤葥葦葧葨葪葮葯葰葲葴葷葹葻葼取娶龋趣去圈颧权醛泉全痊拳犬券劝缺炔瘸却鹊榷确雀裙群然燃冉染瓤壤攘嚷让饶扰绕惹热壬仁人忍韧任认刃妊纫扔仍日戎茸蓉荣融熔溶容绒冗揉柔肉茹蠕儒孺如辱乳汝入褥软阮蕊瑞锐闰润若弱撒洒萨腮鳃塞赛三叁�".split("");
  261. for(j = 0; j != D[200].length; ++j) if(D[200][j].charCodeAt(0) !== 0xFFFD) { e[D[200][j]] = 51200 + j; d[51200 + j] = D[200][j];}
  262. D[201] = "����������������������������������������������������������������葽葾葿蒀蒁蒃蒄蒅蒆蒊蒍蒏蒐蒑蒒蒓蒔蒕蒖蒘蒚蒛蒝蒞蒟蒠蒢蒣蒤蒥蒦蒧蒨蒩蒪蒫蒬蒭蒮蒰蒱蒳蒵蒶蒷蒻蒼蒾蓀蓂蓃蓅蓆蓇蓈蓋蓌蓎蓏蓒蓔蓕蓗�蓘蓙蓚蓛蓜蓞蓡蓢蓤蓧蓨蓩蓪蓫蓭蓮蓯蓱蓲蓳蓴蓵蓶蓷蓸蓹蓺蓻蓽蓾蔀蔁蔂伞散桑嗓丧搔骚扫嫂瑟色涩森僧莎砂杀刹沙纱傻啥煞筛晒珊苫杉山删煽衫闪陕擅赡膳善汕扇缮墒伤商赏晌上尚裳梢捎稍烧芍勺韶少哨邵绍奢赊蛇舌舍赦摄射慑涉社设砷申呻伸身深娠绅神沈审婶甚肾慎渗声生甥牲升绳�".split("");
  263. for(j = 0; j != D[201].length; ++j) if(D[201][j].charCodeAt(0) !== 0xFFFD) { e[D[201][j]] = 51456 + j; d[51456 + j] = D[201][j];}
  264. D[202] = "����������������������������������������������������������������蔃蔄蔅蔆蔇蔈蔉蔊蔋蔍蔎蔏蔐蔒蔔蔕蔖蔘蔙蔛蔜蔝蔞蔠蔢蔣蔤蔥蔦蔧蔨蔩蔪蔭蔮蔯蔰蔱蔲蔳蔴蔵蔶蔾蔿蕀蕁蕂蕄蕅蕆蕇蕋蕌蕍蕎蕏蕐蕑蕒蕓蕔蕕�蕗蕘蕚蕛蕜蕝蕟蕠蕡蕢蕣蕥蕦蕧蕩蕪蕫蕬蕭蕮蕯蕰蕱蕳蕵蕶蕷蕸蕼蕽蕿薀薁省盛剩胜圣师失狮施湿诗尸虱十石拾时什食蚀实识史矢使屎驶始式示士世柿事拭誓逝势是嗜噬适仕侍释饰氏市恃室视试收手首守寿授售受瘦兽蔬枢梳殊抒输叔舒淑疏书赎孰熟薯暑曙署蜀黍鼠属术述树束戍竖墅庶数漱�".split("");
  265. for(j = 0; j != D[202].length; ++j) if(D[202][j].charCodeAt(0) !== 0xFFFD) { e[D[202][j]] = 51712 + j; d[51712 + j] = D[202][j];}
  266. D[203] = "����������������������������������������������������������������薂薃薆薈薉薊薋薌薍薎薐薑薒薓薔薕薖薗薘薙薚薝薞薟薠薡薢薣薥薦薧薩薫薬薭薱薲薳薴薵薶薸薺薻薼薽薾薿藀藂藃藄藅藆藇藈藊藋藌藍藎藑藒�藔藖藗藘藙藚藛藝藞藟藠藡藢藣藥藦藧藨藪藫藬藭藮藯藰藱藲藳藴藵藶藷藸恕刷耍摔衰甩帅栓拴霜双爽谁水睡税吮瞬顺舜说硕朔烁斯撕嘶思私司丝死肆寺嗣四伺似饲巳松耸怂颂送宋讼诵搜艘擞嗽苏酥俗素速粟僳塑溯宿诉肃酸蒜算虽隋随绥髓碎岁穗遂隧祟孙损笋蓑梭唆缩琐索锁所塌他它她塔�".split("");
  267. for(j = 0; j != D[203].length; ++j) if(D[203][j].charCodeAt(0) !== 0xFFFD) { e[D[203][j]] = 51968 + j; d[51968 + j] = D[203][j];}
  268. D[204] = "����������������������������������������������������������������藹藺藼藽藾蘀蘁蘂蘃蘄蘆蘇蘈蘉蘊蘋蘌蘍蘎蘏蘐蘒蘓蘔蘕蘗蘘蘙蘚蘛蘜蘝蘞蘟蘠蘡蘢蘣蘤蘥蘦蘨蘪蘫蘬蘭蘮蘯蘰蘱蘲蘳蘴蘵蘶蘷蘹蘺蘻蘽蘾蘿虀�虁虂虃虄虅虆虇虈虉虊虋虌虒虓處虖虗虘虙虛虜虝號虠虡虣虤虥虦虧虨虩虪獭挞蹋踏胎苔抬台泰酞太态汰坍摊贪瘫滩坛檀痰潭谭谈坦毯袒碳探叹炭汤塘搪堂棠膛唐糖倘躺淌趟烫掏涛滔绦萄桃逃淘陶讨套特藤腾疼誊梯剔踢锑提题蹄啼体替嚏惕涕剃屉天添填田甜恬舔腆挑条迢眺跳贴铁帖厅听烃�".split("");
  269. for(j = 0; j != D[204].length; ++j) if(D[204][j].charCodeAt(0) !== 0xFFFD) { e[D[204][j]] = 52224 + j; d[52224 + j] = D[204][j];}
  270. D[205] = "����������������������������������������������������������������虭虯虰虲虳虴虵虶虷虸蚃蚄蚅蚆蚇蚈蚉蚎蚏蚐蚑蚒蚔蚖蚗蚘蚙蚚蚛蚞蚟蚠蚡蚢蚥蚦蚫蚭蚮蚲蚳蚷蚸蚹蚻蚼蚽蚾蚿蛁蛂蛃蛅蛈蛌蛍蛒蛓蛕蛖蛗蛚蛜�蛝蛠蛡蛢蛣蛥蛦蛧蛨蛪蛫蛬蛯蛵蛶蛷蛺蛻蛼蛽蛿蜁蜄蜅蜆蜋蜌蜎蜏蜐蜑蜔蜖汀廷停亭庭挺艇通桐酮瞳同铜彤童桶捅筒统痛偷投头透凸秃突图徒途涂屠土吐兔湍团推颓腿蜕褪退吞屯臀拖托脱鸵陀驮驼椭妥拓唾挖哇蛙洼娃瓦袜歪外豌弯湾玩顽丸烷完碗挽晚皖惋宛婉万腕汪王亡枉网往旺望忘妄威�".split("");
  271. for(j = 0; j != D[205].length; ++j) if(D[205][j].charCodeAt(0) !== 0xFFFD) { e[D[205][j]] = 52480 + j; d[52480 + j] = D[205][j];}
  272. D[206] = "����������������������������������������������������������������蜙蜛蜝蜟蜠蜤蜦蜧蜨蜪蜫蜬蜭蜯蜰蜲蜳蜵蜶蜸蜹蜺蜼蜽蝀蝁蝂蝃蝄蝅蝆蝊蝋蝍蝏蝐蝑蝒蝔蝕蝖蝘蝚蝛蝜蝝蝞蝟蝡蝢蝦蝧蝨蝩蝪蝫蝬蝭蝯蝱蝲蝳蝵�蝷蝸蝹蝺蝿螀螁螄螆螇螉螊螌螎螏螐螑螒螔螕螖螘螙螚螛螜螝螞螠螡螢螣螤巍微危韦违桅围唯惟为潍维苇萎委伟伪尾纬未蔚味畏胃喂魏位渭谓尉慰卫瘟温蚊文闻纹吻稳紊问嗡翁瓮挝蜗涡窝我斡卧握沃巫呜钨乌污诬屋无芜梧吾吴毋武五捂午舞伍侮坞戊雾晤物勿务悟误昔熙析西硒矽晰嘻吸锡牺�".split("");
  273. for(j = 0; j != D[206].length; ++j) if(D[206][j].charCodeAt(0) !== 0xFFFD) { e[D[206][j]] = 52736 + j; d[52736 + j] = D[206][j];}
  274. D[207] = "����������������������������������������������������������������螥螦螧螩螪螮螰螱螲螴螶螷螸螹螻螼螾螿蟁蟂蟃蟄蟅蟇蟈蟉蟌蟍蟎蟏蟐蟔蟕蟖蟗蟘蟙蟚蟜蟝蟞蟟蟡蟢蟣蟤蟦蟧蟨蟩蟫蟬蟭蟯蟰蟱蟲蟳蟴蟵蟶蟷蟸�蟺蟻蟼蟽蟿蠀蠁蠂蠄蠅蠆蠇蠈蠉蠋蠌蠍蠎蠏蠐蠑蠒蠔蠗蠘蠙蠚蠜蠝蠞蠟蠠蠣稀息希悉膝夕惜熄烯溪汐犀檄袭席习媳喜铣洗系隙戏细瞎虾匣霞辖暇峡侠狭下厦夏吓掀锨先仙鲜纤咸贤衔舷闲涎弦嫌显险现献县腺馅羡宪陷限线相厢镶香箱襄湘乡翔祥详想响享项巷橡像向象萧硝霄削哮嚣销消宵淆晓�".split("");
  275. for(j = 0; j != D[207].length; ++j) if(D[207][j].charCodeAt(0) !== 0xFFFD) { e[D[207][j]] = 52992 + j; d[52992 + j] = D[207][j];}
  276. D[208] = "����������������������������������������������������������������蠤蠥蠦蠧蠨蠩蠪蠫蠬蠭蠮蠯蠰蠱蠳蠴蠵蠶蠷蠸蠺蠻蠽蠾蠿衁衂衃衆衇衈衉衊衋衎衏衐衑衒術衕衖衘衚衛衜衝衞衟衠衦衧衪衭衯衱衳衴衵衶衸衹衺�衻衼袀袃袆袇袉袊袌袎袏袐袑袓袔袕袗袘袙袚袛袝袞袟袠袡袣袥袦袧袨袩袪小孝校肖啸笑效楔些歇蝎鞋协挟携邪斜胁谐写械卸蟹懈泄泻谢屑薪芯锌欣辛新忻心信衅星腥猩惺兴刑型形邢行醒幸杏性姓兄凶胸匈汹雄熊休修羞朽嗅锈秀袖绣墟戌需虚嘘须徐许蓄酗叙旭序畜恤絮婿绪续轩喧宣悬旋玄�".split("");
  277. for(j = 0; j != D[208].length; ++j) if(D[208][j].charCodeAt(0) !== 0xFFFD) { e[D[208][j]] = 53248 + j; d[53248 + j] = D[208][j];}
  278. D[209] = "����������������������������������������������������������������袬袮袯袰袲袳袴袵袶袸袹袺袻袽袾袿裀裃裄裇裈裊裋裌裍裏裐裑裓裖裗裚裛補裝裞裠裡裦裧裩裪裫裬裭裮裯裲裵裶裷裺裻製裿褀褁褃褄褅褆複褈�褉褋褌褍褎褏褑褔褕褖褗褘褜褝褞褟褠褢褣褤褦褧褨褩褬褭褮褯褱褲褳褵褷选癣眩绚靴薛学穴雪血勋熏循旬询寻驯巡殉汛训讯逊迅压押鸦鸭呀丫芽牙蚜崖衙涯雅哑亚讶焉咽阉烟淹盐严研蜒岩延言颜阎炎沿奄掩眼衍演艳堰燕厌砚雁唁彦焰宴谚验殃央鸯秧杨扬佯疡羊洋阳氧仰痒养样漾邀腰妖瑶�".split("");
  279. for(j = 0; j != D[209].length; ++j) if(D[209][j].charCodeAt(0) !== 0xFFFD) { e[D[209][j]] = 53504 + j; d[53504 + j] = D[209][j];}
  280. D[210] = "����������������������������������������������������������������褸褹褺褻褼褽褾褿襀襂襃襅襆襇襈襉襊襋襌襍襎襏襐襑襒襓襔襕襖襗襘襙襚襛襜襝襠襡襢襣襤襥襧襨襩襪襫襬襭襮襯襰襱襲襳襴襵襶襷襸襹襺襼�襽襾覀覂覄覅覇覈覉覊見覌覍覎規覐覑覒覓覔覕視覗覘覙覚覛覜覝覞覟覠覡摇尧遥窑谣姚咬舀药要耀椰噎耶爷野冶也页掖业叶曳腋夜液一壹医揖铱依伊衣颐夷遗移仪胰疑沂宜姨彝椅蚁倚已乙矣以艺抑易邑屹亿役臆逸肄疫亦裔意毅忆义益溢诣议谊译异翼翌绎茵荫因殷音阴姻吟银淫寅饮尹引隐�".split("");
  281. for(j = 0; j != D[210].length; ++j) if(D[210][j].charCodeAt(0) !== 0xFFFD) { e[D[210][j]] = 53760 + j; d[53760 + j] = D[210][j];}
  282. D[211] = "����������������������������������������������������������������覢覣覤覥覦覧覨覩親覫覬覭覮覯覰覱覲観覴覵覶覷覸覹覺覻覼覽覾覿觀觃觍觓觔觕觗觘觙觛觝觟觠觡觢觤觧觨觩觪觬觭觮觰觱觲觴觵觶觷觸觹觺�觻觼觽觾觿訁訂訃訄訅訆計訉訊訋訌訍討訏訐訑訒訓訔訕訖託記訙訚訛訜訝印英樱婴鹰应缨莹萤营荧蝇迎赢盈影颖硬映哟拥佣臃痈庸雍踊蛹咏泳涌永恿勇用幽优悠忧尤由邮铀犹油游酉有友右佑釉诱又幼迂淤于盂榆虞愚舆余俞逾鱼愉渝渔隅予娱雨与屿禹宇语羽玉域芋郁吁遇喻峪御愈欲狱育誉�".split("");
  283. for(j = 0; j != D[211].length; ++j) if(D[211][j].charCodeAt(0) !== 0xFFFD) { e[D[211][j]] = 54016 + j; d[54016 + j] = D[211][j];}
  284. D[212] = "����������������������������������������������������������������訞訟訠訡訢訣訤訥訦訧訨訩訪訫訬設訮訯訰許訲訳訴訵訶訷訸訹診註証訽訿詀詁詂詃詄詅詆詇詉詊詋詌詍詎詏詐詑詒詓詔評詖詗詘詙詚詛詜詝詞�詟詠詡詢詣詤詥試詧詨詩詪詫詬詭詮詯詰話該詳詴詵詶詷詸詺詻詼詽詾詿誀浴寓裕预豫驭鸳渊冤元垣袁原援辕园员圆猿源缘远苑愿怨院曰约越跃钥岳粤月悦阅耘云郧匀陨允运蕴酝晕韵孕匝砸杂栽哉灾宰载再在咱攒暂赞赃脏葬遭糟凿藻枣早澡蚤躁噪造皂灶燥责择则泽贼怎增憎曾赠扎喳渣札轧�".split("");
  285. for(j = 0; j != D[212].length; ++j) if(D[212][j].charCodeAt(0) !== 0xFFFD) { e[D[212][j]] = 54272 + j; d[54272 + j] = D[212][j];}
  286. D[213] = "����������������������������������������������������������������誁誂誃誄誅誆誇誈誋誌認誎誏誐誑誒誔誕誖誗誘誙誚誛誜誝語誟誠誡誢誣誤誥誦誧誨誩說誫説読誮誯誰誱課誳誴誵誶誷誸誹誺誻誼誽誾調諀諁諂�諃諄諅諆談諈諉諊請諌諍諎諏諐諑諒諓諔諕論諗諘諙諚諛諜諝諞諟諠諡諢諣铡闸眨栅榨咋乍炸诈摘斋宅窄债寨瞻毡詹粘沾盏斩辗崭展蘸栈占战站湛绽樟章彰漳张掌涨杖丈帐账仗胀瘴障招昭找沼赵照罩兆肇召遮折哲蛰辙者锗蔗这浙珍斟真甄砧臻贞针侦枕疹诊震振镇阵蒸挣睁征狰争怔整拯正政�".split("");
  287. for(j = 0; j != D[213].length; ++j) if(D[213][j].charCodeAt(0) !== 0xFFFD) { e[D[213][j]] = 54528 + j; d[54528 + j] = D[213][j];}
  288. D[214] = "����������������������������������������������������������������諤諥諦諧諨諩諪諫諬諭諮諯諰諱諲諳諴諵諶諷諸諹諺諻諼諽諾諿謀謁謂謃謄謅謆謈謉謊謋謌謍謎謏謐謑謒謓謔謕謖謗謘謙謚講謜謝謞謟謠謡謢謣�謤謥謧謨謩謪謫謬謭謮謯謰謱謲謳謴謵謶謷謸謹謺謻謼謽謾謿譀譁譂譃譄譅帧症郑证芝枝支吱蜘知肢脂汁之织职直植殖执值侄址指止趾只旨纸志挚掷至致置帜峙制智秩稚质炙痔滞治窒中盅忠钟衷终种肿重仲众舟周州洲诌粥轴肘帚咒皱宙昼骤珠株蛛朱猪诸诛逐竹烛煮拄瞩嘱主著柱助蛀贮铸筑�".split("");
  289. for(j = 0; j != D[214].length; ++j) if(D[214][j].charCodeAt(0) !== 0xFFFD) { e[D[214][j]] = 54784 + j; d[54784 + j] = D[214][j];}
  290. D[215] = "����������������������������������������������������������������譆譇譈證譊譋譌譍譎譏譐譑譒譓譔譕譖譗識譙譚譛譜譝譞譟譠譡譢譣譤譥譧譨譩譪譫譭譮譯議譱譲譳譴譵譶護譸譹譺譻譼譽譾譿讀讁讂讃讄讅讆�讇讈讉變讋讌讍讎讏讐讑讒讓讔讕讖讗讘讙讚讛讜讝讞讟讬讱讻诇诐诪谉谞住注祝驻抓爪拽专砖转撰赚篆桩庄装妆撞壮状椎锥追赘坠缀谆准捉拙卓桌琢茁酌啄着灼浊兹咨资姿滋淄孜紫仔籽滓子自渍字鬃棕踪宗综总纵邹走奏揍租足卒族祖诅阻组钻纂嘴醉最罪尊遵昨左佐柞做作坐座������".split("");
  291. for(j = 0; j != D[215].length; ++j) if(D[215][j].charCodeAt(0) !== 0xFFFD) { e[D[215][j]] = 55040 + j; d[55040 + j] = D[215][j];}
  292. D[216] = "����������������������������������������������������������������谸谹谺谻谼谽谾谿豀豂豃豄豅豈豊豋豍豎豏豐豑豒豓豔豖豗豘豙豛豜豝豞豟豠豣豤豥豦豧豨豩豬豭豮豯豰豱豲豴豵豶豷豻豼豽豾豿貀貁貃貄貆貇�貈貋貍貎貏貐貑貒貓貕貖貗貙貚貛貜貝貞貟負財貢貣貤貥貦貧貨販貪貫責貭亍丌兀丐廿卅丕亘丞鬲孬噩丨禺丿匕乇夭爻卮氐囟胤馗毓睾鼗丶亟鼐乜乩亓芈孛啬嘏仄厍厝厣厥厮靥赝匚叵匦匮匾赜卦卣刂刈刎刭刳刿剀剌剞剡剜蒯剽劂劁劐劓冂罔亻仃仉仂仨仡仫仞伛仳伢佤仵伥伧伉伫佞佧攸佚佝�".split("");
  293. for(j = 0; j != D[216].length; ++j) if(D[216][j].charCodeAt(0) !== 0xFFFD) { e[D[216][j]] = 55296 + j; d[55296 + j] = D[216][j];}
  294. D[217] = "����������������������������������������������������������������貮貯貰貱貲貳貴貵貶買貸貹貺費貼貽貾貿賀賁賂賃賄賅賆資賈賉賊賋賌賍賎賏賐賑賒賓賔賕賖賗賘賙賚賛賜賝賞賟賠賡賢賣賤賥賦賧賨賩質賫賬�賭賮賯賰賱賲賳賴賵賶賷賸賹賺賻購賽賾賿贀贁贂贃贄贅贆贇贈贉贊贋贌贍佟佗伲伽佶佴侑侉侃侏佾佻侪佼侬侔俦俨俪俅俚俣俜俑俟俸倩偌俳倬倏倮倭俾倜倌倥倨偾偃偕偈偎偬偻傥傧傩傺僖儆僭僬僦僮儇儋仝氽佘佥俎龠汆籴兮巽黉馘冁夔勹匍訇匐凫夙兕亠兖亳衮袤亵脔裒禀嬴蠃羸冫冱冽冼�".split("");
  295. for(j = 0; j != D[217].length; ++j) if(D[217][j].charCodeAt(0) !== 0xFFFD) { e[D[217][j]] = 55552 + j; d[55552 + j] = D[217][j];}
  296. D[218] = "����������������������������������������������������������������贎贏贐贑贒贓贔贕贖贗贘贙贚贛贜贠赑赒赗赟赥赨赩赪赬赮赯赱赲赸赹赺赻赼赽赾赿趀趂趃趆趇趈趉趌趍趎趏趐趒趓趕趖趗趘趙趚趛趜趝趞趠趡�趢趤趥趦趧趨趩趪趫趬趭趮趯趰趲趶趷趹趻趽跀跁跂跅跇跈跉跊跍跐跒跓跔凇冖冢冥讠讦讧讪讴讵讷诂诃诋诏诎诒诓诔诖诘诙诜诟诠诤诨诩诮诰诳诶诹诼诿谀谂谄谇谌谏谑谒谔谕谖谙谛谘谝谟谠谡谥谧谪谫谮谯谲谳谵谶卩卺阝阢阡阱阪阽阼陂陉陔陟陧陬陲陴隈隍隗隰邗邛邝邙邬邡邴邳邶邺�".split("");
  297. for(j = 0; j != D[218].length; ++j) if(D[218][j].charCodeAt(0) !== 0xFFFD) { e[D[218][j]] = 55808 + j; d[55808 + j] = D[218][j];}
  298. D[219] = "����������������������������������������������������������������跕跘跙跜跠跡跢跥跦跧跩跭跮跰跱跲跴跶跼跾跿踀踁踂踃踄踆踇踈踋踍踎踐踑踒踓踕踖踗踘踙踚踛踜踠踡踤踥踦踧踨踫踭踰踲踳踴踶踷踸踻踼踾�踿蹃蹅蹆蹌蹍蹎蹏蹐蹓蹔蹕蹖蹗蹘蹚蹛蹜蹝蹞蹟蹠蹡蹢蹣蹤蹥蹧蹨蹪蹫蹮蹱邸邰郏郅邾郐郄郇郓郦郢郜郗郛郫郯郾鄄鄢鄞鄣鄱鄯鄹酃酆刍奂劢劬劭劾哿勐勖勰叟燮矍廴凵凼鬯厶弁畚巯坌垩垡塾墼壅壑圩圬圪圳圹圮圯坜圻坂坩垅坫垆坼坻坨坭坶坳垭垤垌垲埏垧垴垓垠埕埘埚埙埒垸埴埯埸埤埝�".split("");
  299. for(j = 0; j != D[219].length; ++j) if(D[219][j].charCodeAt(0) !== 0xFFFD) { e[D[219][j]] = 56064 + j; d[56064 + j] = D[219][j];}
  300. D[220] = "����������������������������������������������������������������蹳蹵蹷蹸蹹蹺蹻蹽蹾躀躂躃躄躆躈躉躊躋躌躍躎躑躒躓躕躖躗躘躙躚躛躝躟躠躡躢躣躤躥躦躧躨躩躪躭躮躰躱躳躴躵躶躷躸躹躻躼躽躾躿軀軁軂�軃軄軅軆軇軈軉車軋軌軍軏軐軑軒軓軔軕軖軗軘軙軚軛軜軝軞軟軠軡転軣軤堋堍埽埭堀堞堙塄堠塥塬墁墉墚墀馨鼙懿艹艽艿芏芊芨芄芎芑芗芙芫芸芾芰苈苊苣芘芷芮苋苌苁芩芴芡芪芟苄苎芤苡茉苷苤茏茇苜苴苒苘茌苻苓茑茚茆茔茕苠苕茜荑荛荜茈莒茼茴茱莛荞茯荏荇荃荟荀茗荠茭茺茳荦荥�".split("");
  301. for(j = 0; j != D[220].length; ++j) if(D[220][j].charCodeAt(0) !== 0xFFFD) { e[D[220][j]] = 56320 + j; d[56320 + j] = D[220][j];}
  302. D[221] = "����������������������������������������������������������������軥軦軧軨軩軪軫軬軭軮軯軰軱軲軳軴軵軶軷軸軹軺軻軼軽軾軿輀輁輂較輄輅輆輇輈載輊輋輌輍輎輏輐輑輒輓輔輕輖輗輘輙輚輛輜輝輞輟輠輡輢輣�輤輥輦輧輨輩輪輫輬輭輮輯輰輱輲輳輴輵輶輷輸輹輺輻輼輽輾輿轀轁轂轃轄荨茛荩荬荪荭荮莰荸莳莴莠莪莓莜莅荼莶莩荽莸荻莘莞莨莺莼菁萁菥菘堇萘萋菝菽菖萜萸萑萆菔菟萏萃菸菹菪菅菀萦菰菡葜葑葚葙葳蒇蒈葺蒉葸萼葆葩葶蒌蒎萱葭蓁蓍蓐蓦蒽蓓蓊蒿蒺蓠蒡蒹蒴蒗蓥蓣蔌甍蔸蓰蔹蔟蔺�".split("");
  303. for(j = 0; j != D[221].length; ++j) if(D[221][j].charCodeAt(0) !== 0xFFFD) { e[D[221][j]] = 56576 + j; d[56576 + j] = D[221][j];}
  304. D[222] = "����������������������������������������������������������������轅轆轇轈轉轊轋轌轍轎轏轐轑轒轓轔轕轖轗轘轙轚轛轜轝轞轟轠轡轢轣轤轥轪辀辌辒辝辠辡辢辤辥辦辧辪辬辭辮辯農辳辴辵辷辸辺辻込辿迀迃迆�迉迊迋迌迍迏迒迖迗迚迠迡迣迧迬迯迱迲迴迵迶迺迻迼迾迿逇逈逌逎逓逕逘蕖蔻蓿蓼蕙蕈蕨蕤蕞蕺瞢蕃蕲蕻薤薨薇薏蕹薮薜薅薹薷薰藓藁藜藿蘧蘅蘩蘖蘼廾弈夼奁耷奕奚奘匏尢尥尬尴扌扪抟抻拊拚拗拮挢拶挹捋捃掭揶捱捺掎掴捭掬掊捩掮掼揲揸揠揿揄揞揎摒揆掾摅摁搋搛搠搌搦搡摞撄摭撖�".split("");
  305. for(j = 0; j != D[222].length; ++j) if(D[222][j].charCodeAt(0) !== 0xFFFD) { e[D[222][j]] = 56832 + j; d[56832 + j] = D[222][j];}
  306. D[223] = "����������������������������������������������������������������這逜連逤逥逧逨逩逪逫逬逰週進逳逴逷逹逺逽逿遀遃遅遆遈遉遊運遌過達違遖遙遚遜遝遞遟遠遡遤遦遧適遪遫遬遯遰遱遲遳遶遷選遹遺遻遼遾邁�還邅邆邇邉邊邌邍邎邏邐邒邔邖邘邚邜邞邟邠邤邥邧邨邩邫邭邲邷邼邽邿郀摺撷撸撙撺擀擐擗擤擢攉攥攮弋忒甙弑卟叱叽叩叨叻吒吖吆呋呒呓呔呖呃吡呗呙吣吲咂咔呷呱呤咚咛咄呶呦咝哐咭哂咴哒咧咦哓哔呲咣哕咻咿哌哙哚哜咩咪咤哝哏哞唛哧唠哽唔哳唢唣唏唑唧唪啧喏喵啉啭啁啕唿啐唼�".split("");
  307. for(j = 0; j != D[223].length; ++j) if(D[223][j].charCodeAt(0) !== 0xFFFD) { e[D[223][j]] = 57088 + j; d[57088 + j] = D[223][j];}
  308. D[224] = "����������������������������������������������������������������郂郃郆郈郉郋郌郍郒郔郕郖郘郙郚郞郟郠郣郤郥郩郪郬郮郰郱郲郳郵郶郷郹郺郻郼郿鄀鄁鄃鄅鄆鄇鄈鄉鄊鄋鄌鄍鄎鄏鄐鄑鄒鄓鄔鄕鄖鄗鄘鄚鄛鄜�鄝鄟鄠鄡鄤鄥鄦鄧鄨鄩鄪鄫鄬鄭鄮鄰鄲鄳鄴鄵鄶鄷鄸鄺鄻鄼鄽鄾鄿酀酁酂酄唷啖啵啶啷唳唰啜喋嗒喃喱喹喈喁喟啾嗖喑啻嗟喽喾喔喙嗪嗷嗉嘟嗑嗫嗬嗔嗦嗝嗄嗯嗥嗲嗳嗌嗍嗨嗵嗤辔嘞嘈嘌嘁嘤嘣嗾嘀嘧嘭噘嘹噗嘬噍噢噙噜噌噔嚆噤噱噫噻噼嚅嚓嚯囔囗囝囡囵囫囹囿圄圊圉圜帏帙帔帑帱帻帼�".split("");
  309. for(j = 0; j != D[224].length; ++j) if(D[224][j].charCodeAt(0) !== 0xFFFD) { e[D[224][j]] = 57344 + j; d[57344 + j] = D[224][j];}
  310. D[225] = "����������������������������������������������������������������酅酇酈酑酓酔酕酖酘酙酛酜酟酠酦酧酨酫酭酳酺酻酼醀醁醂醃醄醆醈醊醎醏醓醔醕醖醗醘醙醜醝醞醟醠醡醤醥醦醧醨醩醫醬醰醱醲醳醶醷醸醹醻�醼醽醾醿釀釁釂釃釄釅釆釈釋釐釒釓釔釕釖釗釘釙釚釛針釞釟釠釡釢釣釤釥帷幄幔幛幞幡岌屺岍岐岖岈岘岙岑岚岜岵岢岽岬岫岱岣峁岷峄峒峤峋峥崂崃崧崦崮崤崞崆崛嵘崾崴崽嵬嵛嵯嵝嵫嵋嵊嵩嵴嶂嶙嶝豳嶷巅彳彷徂徇徉後徕徙徜徨徭徵徼衢彡犭犰犴犷犸狃狁狎狍狒狨狯狩狲狴狷猁狳猃狺�".split("");
  311. for(j = 0; j != D[225].length; ++j) if(D[225][j].charCodeAt(0) !== 0xFFFD) { e[D[225][j]] = 57600 + j; d[57600 + j] = D[225][j];}
  312. D[226] = "����������������������������������������������������������������釦釧釨釩釪釫釬釭釮釯釰釱釲釳釴釵釶釷釸釹釺釻釼釽釾釿鈀鈁鈂鈃鈄鈅鈆鈇鈈鈉鈊鈋鈌鈍鈎鈏鈐鈑鈒鈓鈔鈕鈖鈗鈘鈙鈚鈛鈜鈝鈞鈟鈠鈡鈢鈣鈤�鈥鈦鈧鈨鈩鈪鈫鈬鈭鈮鈯鈰鈱鈲鈳鈴鈵鈶鈷鈸鈹鈺鈻鈼鈽鈾鈿鉀鉁鉂鉃鉄鉅狻猗猓猡猊猞猝猕猢猹猥猬猸猱獐獍獗獠獬獯獾舛夥飧夤夂饣饧饨饩饪饫饬饴饷饽馀馄馇馊馍馐馑馓馔馕庀庑庋庖庥庠庹庵庾庳赓廒廑廛廨廪膺忄忉忖忏怃忮怄忡忤忾怅怆忪忭忸怙怵怦怛怏怍怩怫怊怿怡恸恹恻恺恂�".split("");
  313. for(j = 0; j != D[226].length; ++j) if(D[226][j].charCodeAt(0) !== 0xFFFD) { e[D[226][j]] = 57856 + j; d[57856 + j] = D[226][j];}
  314. D[227] = "����������������������������������������������������������������鉆鉇鉈鉉鉊鉋鉌鉍鉎鉏鉐鉑鉒鉓鉔鉕鉖鉗鉘鉙鉚鉛鉜鉝鉞鉟鉠鉡鉢鉣鉤鉥鉦鉧鉨鉩鉪鉫鉬鉭鉮鉯鉰鉱鉲鉳鉵鉶鉷鉸鉹鉺鉻鉼鉽鉾鉿銀銁銂銃銄銅�銆銇銈銉銊銋銌銍銏銐銑銒銓銔銕銖銗銘銙銚銛銜銝銞銟銠銡銢銣銤銥銦銧恪恽悖悚悭悝悃悒悌悛惬悻悱惝惘惆惚悴愠愦愕愣惴愀愎愫慊慵憬憔憧憷懔懵忝隳闩闫闱闳闵闶闼闾阃阄阆阈阊阋阌阍阏阒阕阖阗阙阚丬爿戕氵汔汜汊沣沅沐沔沌汨汩汴汶沆沩泐泔沭泷泸泱泗沲泠泖泺泫泮沱泓泯泾�".split("");
  315. for(j = 0; j != D[227].length; ++j) if(D[227][j].charCodeAt(0) !== 0xFFFD) { e[D[227][j]] = 58112 + j; d[58112 + j] = D[227][j];}
  316. D[228] = "����������������������������������������������������������������銨銩銪銫銬銭銯銰銱銲銳銴銵銶銷銸銹銺銻銼銽銾銿鋀鋁鋂鋃鋄鋅鋆鋇鋉鋊鋋鋌鋍鋎鋏鋐鋑鋒鋓鋔鋕鋖鋗鋘鋙鋚鋛鋜鋝鋞鋟鋠鋡鋢鋣鋤鋥鋦鋧鋨�鋩鋪鋫鋬鋭鋮鋯鋰鋱鋲鋳鋴鋵鋶鋷鋸鋹鋺鋻鋼鋽鋾鋿錀錁錂錃錄錅錆錇錈錉洹洧洌浃浈洇洄洙洎洫浍洮洵洚浏浒浔洳涑浯涞涠浞涓涔浜浠浼浣渚淇淅淞渎涿淠渑淦淝淙渖涫渌涮渫湮湎湫溲湟溆湓湔渲渥湄滟溱溘滠漭滢溥溧溽溻溷滗溴滏溏滂溟潢潆潇漤漕滹漯漶潋潴漪漉漩澉澍澌潸潲潼潺濑�".split("");
  317. for(j = 0; j != D[228].length; ++j) if(D[228][j].charCodeAt(0) !== 0xFFFD) { e[D[228][j]] = 58368 + j; d[58368 + j] = D[228][j];}
  318. D[229] = "����������������������������������������������������������������錊錋錌錍錎錏錐錑錒錓錔錕錖錗錘錙錚錛錜錝錞錟錠錡錢錣錤錥錦錧錨錩錪錫錬錭錮錯錰錱録錳錴錵錶錷錸錹錺錻錼錽錿鍀鍁鍂鍃鍄鍅鍆鍇鍈鍉�鍊鍋鍌鍍鍎鍏鍐鍑鍒鍓鍔鍕鍖鍗鍘鍙鍚鍛鍜鍝鍞鍟鍠鍡鍢鍣鍤鍥鍦鍧鍨鍩鍫濉澧澹澶濂濡濮濞濠濯瀚瀣瀛瀹瀵灏灞宀宄宕宓宥宸甯骞搴寤寮褰寰蹇謇辶迓迕迥迮迤迩迦迳迨逅逄逋逦逑逍逖逡逵逶逭逯遄遑遒遐遨遘遢遛暹遴遽邂邈邃邋彐彗彖彘尻咫屐屙孱屣屦羼弪弩弭艴弼鬻屮妁妃妍妩妪妣�".split("");
  319. for(j = 0; j != D[229].length; ++j) if(D[229][j].charCodeAt(0) !== 0xFFFD) { e[D[229][j]] = 58624 + j; d[58624 + j] = D[229][j];}
  320. D[230] = "����������������������������������������������������������������鍬鍭鍮鍯鍰鍱鍲鍳鍴鍵鍶鍷鍸鍹鍺鍻鍼鍽鍾鍿鎀鎁鎂鎃鎄鎅鎆鎇鎈鎉鎊鎋鎌鎍鎎鎐鎑鎒鎓鎔鎕鎖鎗鎘鎙鎚鎛鎜鎝鎞鎟鎠鎡鎢鎣鎤鎥鎦鎧鎨鎩鎪鎫�鎬鎭鎮鎯鎰鎱鎲鎳鎴鎵鎶鎷鎸鎹鎺鎻鎼鎽鎾鎿鏀鏁鏂鏃鏄鏅鏆鏇鏈鏉鏋鏌鏍妗姊妫妞妤姒妲妯姗妾娅娆姝娈姣姘姹娌娉娲娴娑娣娓婀婧婊婕娼婢婵胬媪媛婷婺媾嫫媲嫒嫔媸嫠嫣嫱嫖嫦嫘嫜嬉嬗嬖嬲嬷孀尕尜孚孥孳孑孓孢驵驷驸驺驿驽骀骁骅骈骊骐骒骓骖骘骛骜骝骟骠骢骣骥骧纟纡纣纥纨纩�".split("");
  321. for(j = 0; j != D[230].length; ++j) if(D[230][j].charCodeAt(0) !== 0xFFFD) { e[D[230][j]] = 58880 + j; d[58880 + j] = D[230][j];}
  322. D[231] = "����������������������������������������������������������������鏎鏏鏐鏑鏒鏓鏔鏕鏗鏘鏙鏚鏛鏜鏝鏞鏟鏠鏡鏢鏣鏤鏥鏦鏧鏨鏩鏪鏫鏬鏭鏮鏯鏰鏱鏲鏳鏴鏵鏶鏷鏸鏹鏺鏻鏼鏽鏾鏿鐀鐁鐂鐃鐄鐅鐆鐇鐈鐉鐊鐋鐌鐍�鐎鐏鐐鐑鐒鐓鐔鐕鐖鐗鐘鐙鐚鐛鐜鐝鐞鐟鐠鐡鐢鐣鐤鐥鐦鐧鐨鐩鐪鐫鐬鐭鐮纭纰纾绀绁绂绉绋绌绐绔绗绛绠绡绨绫绮绯绱绲缍绶绺绻绾缁缂缃缇缈缋缌缏缑缒缗缙缜缛缟缡缢缣缤缥缦缧缪缫缬缭缯缰缱缲缳缵幺畿巛甾邕玎玑玮玢玟珏珂珑玷玳珀珉珈珥珙顼琊珩珧珞玺珲琏琪瑛琦琥琨琰琮琬�".split("");
  323. for(j = 0; j != D[231].length; ++j) if(D[231][j].charCodeAt(0) !== 0xFFFD) { e[D[231][j]] = 59136 + j; d[59136 + j] = D[231][j];}
  324. D[232] = "����������������������������������������������������������������鐯鐰鐱鐲鐳鐴鐵鐶鐷鐸鐹鐺鐻鐼鐽鐿鑀鑁鑂鑃鑄鑅鑆鑇鑈鑉鑊鑋鑌鑍鑎鑏鑐鑑鑒鑓鑔鑕鑖鑗鑘鑙鑚鑛鑜鑝鑞鑟鑠鑡鑢鑣鑤鑥鑦鑧鑨鑩鑪鑬鑭鑮鑯�鑰鑱鑲鑳鑴鑵鑶鑷鑸鑹鑺鑻鑼鑽鑾鑿钀钁钂钃钄钑钖钘铇铏铓铔铚铦铻锜锠琛琚瑁瑜瑗瑕瑙瑷瑭瑾璜璎璀璁璇璋璞璨璩璐璧瓒璺韪韫韬杌杓杞杈杩枥枇杪杳枘枧杵枨枞枭枋杷杼柰栉柘栊柩枰栌柙枵柚枳柝栀柃枸柢栎柁柽栲栳桠桡桎桢桄桤梃栝桕桦桁桧桀栾桊桉栩梵梏桴桷梓桫棂楮棼椟椠棹�".split("");
  325. for(j = 0; j != D[232].length; ++j) if(D[232][j].charCodeAt(0) !== 0xFFFD) { e[D[232][j]] = 59392 + j; d[59392 + j] = D[232][j];}
  326. D[233] = "����������������������������������������������������������������锧锳锽镃镈镋镕镚镠镮镴镵長镸镹镺镻镼镽镾門閁閂閃閄閅閆閇閈閉閊開閌閍閎閏閐閑閒間閔閕閖閗閘閙閚閛閜閝閞閟閠閡関閣閤閥閦閧閨閩閪�閫閬閭閮閯閰閱閲閳閴閵閶閷閸閹閺閻閼閽閾閿闀闁闂闃闄闅闆闇闈闉闊闋椤棰椋椁楗棣椐楱椹楠楂楝榄楫榀榘楸椴槌榇榈槎榉楦楣楹榛榧榻榫榭槔榱槁槊槟榕槠榍槿樯槭樗樘橥槲橄樾檠橐橛樵檎橹樽樨橘橼檑檐檩檗檫猷獒殁殂殇殄殒殓殍殚殛殡殪轫轭轱轲轳轵轶轸轷轹轺轼轾辁辂辄辇辋�".split("");
  327. for(j = 0; j != D[233].length; ++j) if(D[233][j].charCodeAt(0) !== 0xFFFD) { e[D[233][j]] = 59648 + j; d[59648 + j] = D[233][j];}
  328. D[234] = "����������������������������������������������������������������闌闍闎闏闐闑闒闓闔闕闖闗闘闙闚闛關闝闞闟闠闡闢闣闤闥闦闧闬闿阇阓阘阛阞阠阣阤阥阦阧阨阩阫阬阭阯阰阷阸阹阺阾陁陃陊陎陏陑陒陓陖陗�陘陙陚陜陝陞陠陣陥陦陫陭陮陯陰陱陳陸陹険陻陼陽陾陿隀隁隂隃隄隇隉隊辍辎辏辘辚軎戋戗戛戟戢戡戥戤戬臧瓯瓴瓿甏甑甓攴旮旯旰昊昙杲昃昕昀炅曷昝昴昱昶昵耆晟晔晁晏晖晡晗晷暄暌暧暝暾曛曜曦曩贲贳贶贻贽赀赅赆赈赉赇赍赕赙觇觊觋觌觎觏觐觑牮犟牝牦牯牾牿犄犋犍犏犒挈挲掰�".split("");
  329. for(j = 0; j != D[234].length; ++j) if(D[234][j].charCodeAt(0) !== 0xFFFD) { e[D[234][j]] = 59904 + j; d[59904 + j] = D[234][j];}
  330. D[235] = "����������������������������������������������������������������隌階隑隒隓隕隖隚際隝隞隟隠隡隢隣隤隥隦隨隩險隫隬隭隮隯隱隲隴隵隷隸隺隻隿雂雃雈雊雋雐雑雓雔雖雗雘雙雚雛雜雝雞雟雡離難雤雥雦雧雫�雬雭雮雰雱雲雴雵雸雺電雼雽雿霂霃霅霊霋霌霐霑霒霔霕霗霘霙霚霛霝霟霠搿擘耄毪毳毽毵毹氅氇氆氍氕氘氙氚氡氩氤氪氲攵敕敫牍牒牖爰虢刖肟肜肓肼朊肽肱肫肭肴肷胧胨胩胪胛胂胄胙胍胗朐胝胫胱胴胭脍脎胲胼朕脒豚脶脞脬脘脲腈腌腓腴腙腚腱腠腩腼腽腭腧塍媵膈膂膑滕膣膪臌朦臊膻�".split("");
  331. for(j = 0; j != D[235].length; ++j) if(D[235][j].charCodeAt(0) !== 0xFFFD) { e[D[235][j]] = 60160 + j; d[60160 + j] = D[235][j];}
  332. D[236] = "����������������������������������������������������������������霡霢霣霤霥霦霧霨霩霫霬霮霯霱霳霴霵霶霷霺霻霼霽霿靀靁靂靃靄靅靆靇靈靉靊靋靌靍靎靏靐靑靔靕靗靘靚靜靝靟靣靤靦靧靨靪靫靬靭靮靯靰靱�靲靵靷靸靹靺靻靽靾靿鞀鞁鞂鞃鞄鞆鞇鞈鞉鞊鞌鞎鞏鞐鞓鞕鞖鞗鞙鞚鞛鞜鞝臁膦欤欷欹歃歆歙飑飒飓飕飙飚殳彀毂觳斐齑斓於旆旄旃旌旎旒旖炀炜炖炝炻烀炷炫炱烨烊焐焓焖焯焱煳煜煨煅煲煊煸煺熘熳熵熨熠燠燔燧燹爝爨灬焘煦熹戾戽扃扈扉礻祀祆祉祛祜祓祚祢祗祠祯祧祺禅禊禚禧禳忑忐�".split("");
  333. for(j = 0; j != D[236].length; ++j) if(D[236][j].charCodeAt(0) !== 0xFFFD) { e[D[236][j]] = 60416 + j; d[60416 + j] = D[236][j];}
  334. D[237] = "����������������������������������������������������������������鞞鞟鞡鞢鞤鞥鞦鞧鞨鞩鞪鞬鞮鞰鞱鞳鞵鞶鞷鞸鞹鞺鞻鞼鞽鞾鞿韀韁韂韃韄韅韆韇韈韉韊韋韌韍韎韏韐韑韒韓韔韕韖韗韘韙韚韛韜韝韞韟韠韡韢韣�韤韥韨韮韯韰韱韲韴韷韸韹韺韻韼韽韾響頀頁頂頃頄項順頇須頉頊頋頌頍頎怼恝恚恧恁恙恣悫愆愍慝憩憝懋懑戆肀聿沓泶淼矶矸砀砉砗砘砑斫砭砜砝砹砺砻砟砼砥砬砣砩硎硭硖硗砦硐硇硌硪碛碓碚碇碜碡碣碲碹碥磔磙磉磬磲礅磴礓礤礞礴龛黹黻黼盱眄眍盹眇眈眚眢眙眭眦眵眸睐睑睇睃睚睨�".split("");
  335. for(j = 0; j != D[237].length; ++j) if(D[237][j].charCodeAt(0) !== 0xFFFD) { e[D[237][j]] = 60672 + j; d[60672 + j] = D[237][j];}
  336. D[238] = "����������������������������������������������������������������頏預頑頒頓頔頕頖頗領頙頚頛頜頝頞頟頠頡頢頣頤頥頦頧頨頩頪頫頬頭頮頯頰頱頲頳頴頵頶頷頸頹頺頻頼頽頾頿顀顁顂顃顄顅顆顇顈顉顊顋題額�顎顏顐顑顒顓顔顕顖顗願顙顚顛顜顝類顟顠顡顢顣顤顥顦顧顨顩顪顫顬顭顮睢睥睿瞍睽瞀瞌瞑瞟瞠瞰瞵瞽町畀畎畋畈畛畲畹疃罘罡罟詈罨罴罱罹羁罾盍盥蠲钅钆钇钋钊钌钍钏钐钔钗钕钚钛钜钣钤钫钪钭钬钯钰钲钴钶钷钸钹钺钼钽钿铄铈铉铊铋铌铍铎铐铑铒铕铖铗铙铘铛铞铟铠铢铤铥铧铨铪�".split("");
  337. for(j = 0; j != D[238].length; ++j) if(D[238][j].charCodeAt(0) !== 0xFFFD) { e[D[238][j]] = 60928 + j; d[60928 + j] = D[238][j];}
  338. D[239] = "����������������������������������������������������������������顯顰顱顲顳顴颋颎颒颕颙颣風颩颪颫颬颭颮颯颰颱颲颳颴颵颶颷颸颹颺颻颼颽颾颿飀飁飂飃飄飅飆飇飈飉飊飋飌飍飏飐飔飖飗飛飜飝飠飡飢飣飤�飥飦飩飪飫飬飭飮飯飰飱飲飳飴飵飶飷飸飹飺飻飼飽飾飿餀餁餂餃餄餅餆餇铩铫铮铯铳铴铵铷铹铼铽铿锃锂锆锇锉锊锍锎锏锒锓锔锕锖锘锛锝锞锟锢锪锫锩锬锱锲锴锶锷锸锼锾锿镂锵镄镅镆镉镌镎镏镒镓镔镖镗镘镙镛镞镟镝镡镢镤镥镦镧镨镩镪镫镬镯镱镲镳锺矧矬雉秕秭秣秫稆嵇稃稂稞稔�".split("");
  339. for(j = 0; j != D[239].length; ++j) if(D[239][j].charCodeAt(0) !== 0xFFFD) { e[D[239][j]] = 61184 + j; d[61184 + j] = D[239][j];}
  340. D[240] = "����������������������������������������������������������������餈餉養餋餌餎餏餑餒餓餔餕餖餗餘餙餚餛餜餝餞餟餠餡餢餣餤餥餦餧館餩餪餫餬餭餯餰餱餲餳餴餵餶餷餸餹餺餻餼餽餾餿饀饁饂饃饄饅饆饇饈饉�饊饋饌饍饎饏饐饑饒饓饖饗饘饙饚饛饜饝饞饟饠饡饢饤饦饳饸饹饻饾馂馃馉稹稷穑黏馥穰皈皎皓皙皤瓞瓠甬鸠鸢鸨鸩鸪鸫鸬鸲鸱鸶鸸鸷鸹鸺鸾鹁鹂鹄鹆鹇鹈鹉鹋鹌鹎鹑鹕鹗鹚鹛鹜鹞鹣鹦鹧鹨鹩鹪鹫鹬鹱鹭鹳疒疔疖疠疝疬疣疳疴疸痄疱疰痃痂痖痍痣痨痦痤痫痧瘃痱痼痿瘐瘀瘅瘌瘗瘊瘥瘘瘕瘙�".split("");
  341. for(j = 0; j != D[240].length; ++j) if(D[240][j].charCodeAt(0) !== 0xFFFD) { e[D[240][j]] = 61440 + j; d[61440 + j] = D[240][j];}
  342. D[241] = "����������������������������������������������������������������馌馎馚馛馜馝馞馟馠馡馢馣馤馦馧馩馪馫馬馭馮馯馰馱馲馳馴馵馶馷馸馹馺馻馼馽馾馿駀駁駂駃駄駅駆駇駈駉駊駋駌駍駎駏駐駑駒駓駔駕駖駗駘�駙駚駛駜駝駞駟駠駡駢駣駤駥駦駧駨駩駪駫駬駭駮駯駰駱駲駳駴駵駶駷駸駹瘛瘼瘢瘠癀瘭瘰瘿瘵癃瘾瘳癍癞癔癜癖癫癯翊竦穸穹窀窆窈窕窦窠窬窨窭窳衤衩衲衽衿袂袢裆袷袼裉裢裎裣裥裱褚裼裨裾裰褡褙褓褛褊褴褫褶襁襦襻疋胥皲皴矜耒耔耖耜耠耢耥耦耧耩耨耱耋耵聃聆聍聒聩聱覃顸颀颃�".split("");
  343. for(j = 0; j != D[241].length; ++j) if(D[241][j].charCodeAt(0) !== 0xFFFD) { e[D[241][j]] = 61696 + j; d[61696 + j] = D[241][j];}
  344. D[242] = "����������������������������������������������������������������駺駻駼駽駾駿騀騁騂騃騄騅騆騇騈騉騊騋騌騍騎騏騐騑騒験騔騕騖騗騘騙騚騛騜騝騞騟騠騡騢騣騤騥騦騧騨騩騪騫騬騭騮騯騰騱騲騳騴騵騶騷騸�騹騺騻騼騽騾騿驀驁驂驃驄驅驆驇驈驉驊驋驌驍驎驏驐驑驒驓驔驕驖驗驘驙颉颌颍颏颔颚颛颞颟颡颢颥颦虍虔虬虮虿虺虼虻蚨蚍蚋蚬蚝蚧蚣蚪蚓蚩蚶蛄蚵蛎蚰蚺蚱蚯蛉蛏蚴蛩蛱蛲蛭蛳蛐蜓蛞蛴蛟蛘蛑蜃蜇蛸蜈蜊蜍蜉蜣蜻蜞蜥蜮蜚蜾蝈蜴蜱蜩蜷蜿螂蜢蝽蝾蝻蝠蝰蝌蝮螋蝓蝣蝼蝤蝙蝥螓螯螨蟒�".split("");
  345. for(j = 0; j != D[242].length; ++j) if(D[242][j].charCodeAt(0) !== 0xFFFD) { e[D[242][j]] = 61952 + j; d[61952 + j] = D[242][j];}
  346. D[243] = "����������������������������������������������������������������驚驛驜驝驞驟驠驡驢驣驤驥驦驧驨驩驪驫驲骃骉骍骎骔骕骙骦骩骪骫骬骭骮骯骲骳骴骵骹骻骽骾骿髃髄髆髇髈髉髊髍髎髏髐髒體髕髖髗髙髚髛髜�髝髞髠髢髣髤髥髧髨髩髪髬髮髰髱髲髳髴髵髶髷髸髺髼髽髾髿鬀鬁鬂鬄鬅鬆蟆螈螅螭螗螃螫蟥螬螵螳蟋蟓螽蟑蟀蟊蟛蟪蟠蟮蠖蠓蟾蠊蠛蠡蠹蠼缶罂罄罅舐竺竽笈笃笄笕笊笫笏筇笸笪笙笮笱笠笥笤笳笾笞筘筚筅筵筌筝筠筮筻筢筲筱箐箦箧箸箬箝箨箅箪箜箢箫箴篑篁篌篝篚篥篦篪簌篾篼簏簖簋�".split("");
  347. for(j = 0; j != D[243].length; ++j) if(D[243][j].charCodeAt(0) !== 0xFFFD) { e[D[243][j]] = 62208 + j; d[62208 + j] = D[243][j];}
  348. D[244] = "����������������������������������������������������������������鬇鬉鬊鬋鬌鬍鬎鬐鬑鬒鬔鬕鬖鬗鬘鬙鬚鬛鬜鬝鬞鬠鬡鬢鬤鬥鬦鬧鬨鬩鬪鬫鬬鬭鬮鬰鬱鬳鬴鬵鬶鬷鬸鬹鬺鬽鬾鬿魀魆魊魋魌魎魐魒魓魕魖魗魘魙魚�魛魜魝魞魟魠魡魢魣魤魥魦魧魨魩魪魫魬魭魮魯魰魱魲魳魴魵魶魷魸魹魺魻簟簪簦簸籁籀臾舁舂舄臬衄舡舢舣舭舯舨舫舸舻舳舴舾艄艉艋艏艚艟艨衾袅袈裘裟襞羝羟羧羯羰羲籼敉粑粝粜粞粢粲粼粽糁糇糌糍糈糅糗糨艮暨羿翎翕翥翡翦翩翮翳糸絷綦綮繇纛麸麴赳趄趔趑趱赧赭豇豉酊酐酎酏酤�".split("");
  349. for(j = 0; j != D[244].length; ++j) if(D[244][j].charCodeAt(0) !== 0xFFFD) { e[D[244][j]] = 62464 + j; d[62464 + j] = D[244][j];}
  350. D[245] = "����������������������������������������������������������������魼魽魾魿鮀鮁鮂鮃鮄鮅鮆鮇鮈鮉鮊鮋鮌鮍鮎鮏鮐鮑鮒鮓鮔鮕鮖鮗鮘鮙鮚鮛鮜鮝鮞鮟鮠鮡鮢鮣鮤鮥鮦鮧鮨鮩鮪鮫鮬鮭鮮鮯鮰鮱鮲鮳鮴鮵鮶鮷鮸鮹鮺�鮻鮼鮽鮾鮿鯀鯁鯂鯃鯄鯅鯆鯇鯈鯉鯊鯋鯌鯍鯎鯏鯐鯑鯒鯓鯔鯕鯖鯗鯘鯙鯚鯛酢酡酰酩酯酽酾酲酴酹醌醅醐醍醑醢醣醪醭醮醯醵醴醺豕鹾趸跫踅蹙蹩趵趿趼趺跄跖跗跚跞跎跏跛跆跬跷跸跣跹跻跤踉跽踔踝踟踬踮踣踯踺蹀踹踵踽踱蹉蹁蹂蹑蹒蹊蹰蹶蹼蹯蹴躅躏躔躐躜躞豸貂貊貅貘貔斛觖觞觚觜�".split("");
  351. for(j = 0; j != D[245].length; ++j) if(D[245][j].charCodeAt(0) !== 0xFFFD) { e[D[245][j]] = 62720 + j; d[62720 + j] = D[245][j];}
  352. D[246] = "����������������������������������������������������������������鯜鯝鯞鯟鯠鯡鯢鯣鯤鯥鯦鯧鯨鯩鯪鯫鯬鯭鯮鯯鯰鯱鯲鯳鯴鯵鯶鯷鯸鯹鯺鯻鯼鯽鯾鯿鰀鰁鰂鰃鰄鰅鰆鰇鰈鰉鰊鰋鰌鰍鰎鰏鰐鰑鰒鰓鰔鰕鰖鰗鰘鰙鰚�鰛鰜鰝鰞鰟鰠鰡鰢鰣鰤鰥鰦鰧鰨鰩鰪鰫鰬鰭鰮鰯鰰鰱鰲鰳鰴鰵鰶鰷鰸鰹鰺鰻觥觫觯訾謦靓雩雳雯霆霁霈霏霎霪霭霰霾龀龃龅龆龇龈龉龊龌黾鼋鼍隹隼隽雎雒瞿雠銎銮鋈錾鍪鏊鎏鐾鑫鱿鲂鲅鲆鲇鲈稣鲋鲎鲐鲑鲒鲔鲕鲚鲛鲞鲟鲠鲡鲢鲣鲥鲦鲧鲨鲩鲫鲭鲮鲰鲱鲲鲳鲴鲵鲶鲷鲺鲻鲼鲽鳄鳅鳆鳇鳊鳋�".split("");
  353. for(j = 0; j != D[246].length; ++j) if(D[246][j].charCodeAt(0) !== 0xFFFD) { e[D[246][j]] = 62976 + j; d[62976 + j] = D[246][j];}
  354. D[247] = "����������������������������������������������������������������鰼鰽鰾鰿鱀鱁鱂鱃鱄鱅鱆鱇鱈鱉鱊鱋鱌鱍鱎鱏鱐鱑鱒鱓鱔鱕鱖鱗鱘鱙鱚鱛鱜鱝鱞鱟鱠鱡鱢鱣鱤鱥鱦鱧鱨鱩鱪鱫鱬鱭鱮鱯鱰鱱鱲鱳鱴鱵鱶鱷鱸鱹鱺�鱻鱽鱾鲀鲃鲄鲉鲊鲌鲏鲓鲖鲗鲘鲙鲝鲪鲬鲯鲹鲾鲿鳀鳁鳂鳈鳉鳑鳒鳚鳛鳠鳡鳌鳍鳎鳏鳐鳓鳔鳕鳗鳘鳙鳜鳝鳟鳢靼鞅鞑鞒鞔鞯鞫鞣鞲鞴骱骰骷鹘骶骺骼髁髀髅髂髋髌髑魅魃魇魉魈魍魑飨餍餮饕饔髟髡髦髯髫髻髭髹鬈鬏鬓鬟鬣麽麾縻麂麇麈麋麒鏖麝麟黛黜黝黠黟黢黩黧黥黪黯鼢鼬鼯鼹鼷鼽鼾齄�".split("");
  355. for(j = 0; j != D[247].length; ++j) if(D[247][j].charCodeAt(0) !== 0xFFFD) { e[D[247][j]] = 63232 + j; d[63232 + j] = D[247][j];}
  356. D[248] = "����������������������������������������������������������������鳣鳤鳥鳦鳧鳨鳩鳪鳫鳬鳭鳮鳯鳰鳱鳲鳳鳴鳵鳶鳷鳸鳹鳺鳻鳼鳽鳾鳿鴀鴁鴂鴃鴄鴅鴆鴇鴈鴉鴊鴋鴌鴍鴎鴏鴐鴑鴒鴓鴔鴕鴖鴗鴘鴙鴚鴛鴜鴝鴞鴟鴠鴡�鴢鴣鴤鴥鴦鴧鴨鴩鴪鴫鴬鴭鴮鴯鴰鴱鴲鴳鴴鴵鴶鴷鴸鴹鴺鴻鴼鴽鴾鴿鵀鵁鵂�����������������������������������������������������������������������������������������������".split("");
  357. for(j = 0; j != D[248].length; ++j) if(D[248][j].charCodeAt(0) !== 0xFFFD) { e[D[248][j]] = 63488 + j; d[63488 + j] = D[248][j];}
  358. D[249] = "����������������������������������������������������������������鵃鵄鵅鵆鵇鵈鵉鵊鵋鵌鵍鵎鵏鵐鵑鵒鵓鵔鵕鵖鵗鵘鵙鵚鵛鵜鵝鵞鵟鵠鵡鵢鵣鵤鵥鵦鵧鵨鵩鵪鵫鵬鵭鵮鵯鵰鵱鵲鵳鵴鵵鵶鵷鵸鵹鵺鵻鵼鵽鵾鵿鶀鶁�鶂鶃鶄鶅鶆鶇鶈鶉鶊鶋鶌鶍鶎鶏鶐鶑鶒鶓鶔鶕鶖鶗鶘鶙鶚鶛鶜鶝鶞鶟鶠鶡鶢�����������������������������������������������������������������������������������������������".split("");
  359. for(j = 0; j != D[249].length; ++j) if(D[249][j].charCodeAt(0) !== 0xFFFD) { e[D[249][j]] = 63744 + j; d[63744 + j] = D[249][j];}
  360. D[250] = "����������������������������������������������������������������鶣鶤鶥鶦鶧鶨鶩鶪鶫鶬鶭鶮鶯鶰鶱鶲鶳鶴鶵鶶鶷鶸鶹鶺鶻鶼鶽鶾鶿鷀鷁鷂鷃鷄鷅鷆鷇鷈鷉鷊鷋鷌鷍鷎鷏鷐鷑鷒鷓鷔鷕鷖鷗鷘鷙鷚鷛鷜鷝鷞鷟鷠鷡�鷢鷣鷤鷥鷦鷧鷨鷩鷪鷫鷬鷭鷮鷯鷰鷱鷲鷳鷴鷵鷶鷷鷸鷹鷺鷻鷼鷽鷾鷿鸀鸁鸂�����������������������������������������������������������������������������������������������".split("");
  361. for(j = 0; j != D[250].length; ++j) if(D[250][j].charCodeAt(0) !== 0xFFFD) { e[D[250][j]] = 64000 + j; d[64000 + j] = D[250][j];}
  362. D[251] = "����������������������������������������������������������������鸃鸄鸅鸆鸇鸈鸉鸊鸋鸌鸍鸎鸏鸐鸑鸒鸓鸔鸕鸖鸗鸘鸙鸚鸛鸜鸝鸞鸤鸧鸮鸰鸴鸻鸼鹀鹍鹐鹒鹓鹔鹖鹙鹝鹟鹠鹡鹢鹥鹮鹯鹲鹴鹵鹶鹷鹸鹹鹺鹻鹼鹽麀�麁麃麄麅麆麉麊麌麍麎麏麐麑麔麕麖麗麘麙麚麛麜麞麠麡麢麣麤麥麧麨麩麪�����������������������������������������������������������������������������������������������".split("");
  363. for(j = 0; j != D[251].length; ++j) if(D[251][j].charCodeAt(0) !== 0xFFFD) { e[D[251][j]] = 64256 + j; d[64256 + j] = D[251][j];}
  364. D[252] = "����������������������������������������������������������������麫麬麭麮麯麰麱麲麳麵麶麷麹麺麼麿黀黁黂黃黅黆黇黈黊黋黌黐黒黓黕黖黗黙黚點黡黣黤黦黨黫黬黭黮黰黱黲黳黴黵黶黷黸黺黽黿鼀鼁鼂鼃鼄鼅�鼆鼇鼈鼉鼊鼌鼏鼑鼒鼔鼕鼖鼘鼚鼛鼜鼝鼞鼟鼡鼣鼤鼥鼦鼧鼨鼩鼪鼫鼭鼮鼰鼱�����������������������������������������������������������������������������������������������".split("");
  365. for(j = 0; j != D[252].length; ++j) if(D[252][j].charCodeAt(0) !== 0xFFFD) { e[D[252][j]] = 64512 + j; d[64512 + j] = D[252][j];}
  366. D[253] = "����������������������������������������������������������������鼲鼳鼴鼵鼶鼸鼺鼼鼿齀齁齂齃齅齆齇齈齉齊齋齌齍齎齏齒齓齔齕齖齗齘齙齚齛齜齝齞齟齠齡齢齣齤齥齦齧齨齩齪齫齬齭齮齯齰齱齲齳齴齵齶齷齸�齹齺齻齼齽齾龁龂龍龎龏龐龑龒龓龔龕龖龗龘龜龝龞龡龢龣龤龥郎凉秊裏隣�����������������������������������������������������������������������������������������������".split("");
  367. for(j = 0; j != D[253].length; ++j) if(D[253][j].charCodeAt(0) !== 0xFFFD) { e[D[253][j]] = 64768 + j; d[64768 + j] = D[253][j];}
  368. D[254] = "����������������������������������������������������������������兀嗀﨎﨏﨑﨓﨔礼﨟蘒﨡﨣﨤﨧﨨﨩��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������".split("");
  369. for(j = 0; j != D[254].length; ++j) if(D[254][j].charCodeAt(0) !== 0xFFFD) { e[D[254][j]] = 65024 + j; d[65024 + j] = D[254][j];}
  370. return {"enc": e, "dec": d }; })();
  371. cptable[949] = (function(){ var d = [], e = {}, D = [], j;
  372. D[0] = "\u0000\u0001\u0002\u0003\u0004\u0005\u0006\u0007\b\t\n\u000b\f\r\u000e\u000f\u0010\u0011\u0012\u0013\u0014\u0015\u0016\u0017\u0018\u0019\u001a\u001b\u001c\u001d\u001e\u001f !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~��������������������������������������������������������������������������������������������������������������������������������".split("");
  373. for(j = 0; j != D[0].length; ++j) if(D[0][j].charCodeAt(0) !== 0xFFFD) { e[D[0][j]] = 0 + j; d[0 + j] = D[0][j];}
  374. D[129] = "�����������������������������������������������������������������갂갃갅갆갋갌갍갎갏갘갞갟갡갢갣갥갦갧갨갩갪갫갮갲갳갴������갵갶갷갺갻갽갾갿걁걂걃걄걅걆걇걈걉걊걌걎걏걐걑걒걓걕������걖걗걙걚걛걝걞걟걠걡걢걣걤걥걦걧걨걩걪걫걬걭걮걯걲걳걵걶걹걻걼걽걾걿겂겇겈겍겎겏겑겒겓겕겖겗겘겙겚겛겞겢겣겤겥겦겧겫겭겮겱겲겳겴겵겶겷겺겾겿곀곂곃곅곆곇곉곊곋곍곎곏곐곑곒곓곔곖곘곙곚곛곜곝곞곟곢곣곥곦곩곫곭곮곲곴곷곸곹곺곻곾곿괁괂괃괅괇괈괉괊괋괎괐괒괓�".split("");
  375. for(j = 0; j != D[129].length; ++j) if(D[129][j].charCodeAt(0) !== 0xFFFD) { e[D[129][j]] = 33024 + j; d[33024 + j] = D[129][j];}
  376. D[130] = "�����������������������������������������������������������������괔괕괖괗괙괚괛괝괞괟괡괢괣괤괥괦괧괨괪괫괮괯괰괱괲괳������괶괷괹괺괻괽괾괿굀굁굂굃굆굈굊굋굌굍굎굏굑굒굓굕굖굗������굙굚굛굜굝굞굟굠굢굤굥굦굧굨굩굪굫굮굯굱굲굷굸굹굺굾궀궃궄궅궆궇궊궋궍궎궏궑궒궓궔궕궖궗궘궙궚궛궞궟궠궡궢궣궥궦궧궨궩궪궫궬궭궮궯궰궱궲궳궴궵궶궸궹궺궻궼궽궾궿귂귃귅귆귇귉귊귋귌귍귎귏귒귔귕귖귗귘귙귚귛귝귞귟귡귢귣귥귦귧귨귩귪귫귬귭귮귯귰귱귲귳귴귵귶귷�".split("");
  377. for(j = 0; j != D[130].length; ++j) if(D[130][j].charCodeAt(0) !== 0xFFFD) { e[D[130][j]] = 33280 + j; d[33280 + j] = D[130][j];}
  378. D[131] = "�����������������������������������������������������������������귺귻귽귾긂긃긄긅긆긇긊긌긎긏긐긑긒긓긕긖긗긘긙긚긛긜������긝긞긟긠긡긢긣긤긥긦긧긨긩긪긫긬긭긮긯긲긳긵긶긹긻긼������긽긾긿깂깄깇깈깉깋깏깑깒깓깕깗깘깙깚깛깞깢깣깤깦깧깪깫깭깮깯깱깲깳깴깵깶깷깺깾깿꺀꺁꺂꺃꺆꺇꺈꺉꺊꺋꺍꺎꺏꺐꺑꺒꺓꺔꺕꺖꺗꺘꺙꺚꺛꺜꺝꺞꺟꺠꺡꺢꺣꺤꺥꺦꺧꺨꺩꺪꺫꺬꺭꺮꺯꺰꺱꺲꺳꺴꺵꺶꺷꺸꺹꺺꺻꺿껁껂껃껅껆껇껈껉껊껋껎껒껓껔껕껖껗껚껛껝껞껟껠껡껢껣껤껥�".split("");
  379. for(j = 0; j != D[131].length; ++j) if(D[131][j].charCodeAt(0) !== 0xFFFD) { e[D[131][j]] = 33536 + j; d[33536 + j] = D[131][j];}
  380. D[132] = "�����������������������������������������������������������������껦껧껩껪껬껮껯껰껱껲껳껵껶껷껹껺껻껽껾껿꼀꼁꼂꼃꼄꼅������꼆꼉꼊꼋꼌꼎꼏꼑꼒꼓꼔꼕꼖꼗꼘꼙꼚꼛꼜꼝꼞꼟꼠꼡꼢꼣������꼤꼥꼦꼧꼨꼩꼪꼫꼮꼯꼱꼳꼵꼶꼷꼸꼹꼺꼻꼾꽀꽄꽅꽆꽇꽊꽋꽌꽍꽎꽏꽑꽒꽓꽔꽕꽖꽗꽘꽙꽚꽛꽞꽟꽠꽡꽢꽣꽦꽧꽨꽩꽪꽫꽬꽭꽮꽯꽰꽱꽲꽳꽴꽵꽶꽷꽸꽺꽻꽼꽽꽾꽿꾁꾂꾃꾅꾆꾇꾉꾊꾋꾌꾍꾎꾏꾒꾓꾔꾖꾗꾘꾙꾚꾛꾝꾞꾟꾠꾡꾢꾣꾤꾥꾦꾧꾨꾩꾪꾫꾬꾭꾮꾯꾰꾱꾲꾳꾴꾵꾶꾷꾺꾻꾽꾾�".split("");
  381. for(j = 0; j != D[132].length; ++j) if(D[132][j].charCodeAt(0) !== 0xFFFD) { e[D[132][j]] = 33792 + j; d[33792 + j] = D[132][j];}
  382. D[133] = "�����������������������������������������������������������������꾿꿁꿂꿃꿄꿅꿆꿊꿌꿏꿐꿑꿒꿓꿕꿖꿗꿘꿙꿚꿛꿝꿞꿟꿠꿡������꿢꿣꿤꿥꿦꿧꿪꿫꿬꿭꿮꿯꿲꿳꿵꿶꿷꿹꿺꿻꿼꿽꿾꿿뀂뀃������뀅뀆뀇뀈뀉뀊뀋뀍뀎뀏뀑뀒뀓뀕뀖뀗뀘뀙뀚뀛뀞뀟뀠뀡뀢뀣뀤뀥뀦뀧뀩뀪뀫뀬뀭뀮뀯뀰뀱뀲뀳뀴뀵뀶뀷뀸뀹뀺뀻뀼뀽뀾뀿끀끁끂끃끆끇끉끋끍끏끐끑끒끖끘끚끛끜끞끟끠끡끢끣끤끥끦끧끨끩끪끫끬끭끮끯끰끱끲끳끴끵끶끷끸끹끺끻끾끿낁낂낃낅낆낇낈낉낊낋낎낐낒낓낔낕낖낗낛낝낞낣낤�".split("");
  383. for(j = 0; j != D[133].length; ++j) if(D[133][j].charCodeAt(0) !== 0xFFFD) { e[D[133][j]] = 34048 + j; d[34048 + j] = D[133][j];}
  384. D[134] = "�����������������������������������������������������������������낥낦낧낪낰낲낶낷낹낺낻낽낾낿냀냁냂냃냆냊냋냌냍냎냏냒������냓냕냖냗냙냚냛냜냝냞냟냡냢냣냤냦냧냨냩냪냫냬냭냮냯냰������냱냲냳냴냵냶냷냸냹냺냻냼냽냾냿넀넁넂넃넄넅넆넇넊넍넎넏넑넔넕넖넗넚넞넟넠넡넢넦넧넩넪넫넭넮넯넰넱넲넳넶넺넻넼넽넾넿녂녃녅녆녇녉녊녋녌녍녎녏녒녓녖녗녙녚녛녝녞녟녡녢녣녤녥녦녧녨녩녪녫녬녭녮녯녰녱녲녳녴녵녶녷녺녻녽녾녿놁놃놄놅놆놇놊놌놎놏놐놑놕놖놗놙놚놛놝�".split("");
  385. for(j = 0; j != D[134].length; ++j) if(D[134][j].charCodeAt(0) !== 0xFFFD) { e[D[134][j]] = 34304 + j; d[34304 + j] = D[134][j];}
  386. D[135] = "�����������������������������������������������������������������놞놟놠놡놢놣놤놥놦놧놩놪놫놬놭놮놯놰놱놲놳놴놵놶놷놸������놹놺놻놼놽놾놿뇀뇁뇂뇃뇄뇅뇆뇇뇈뇉뇊뇋뇍뇎뇏뇑뇒뇓뇕������뇖뇗뇘뇙뇚뇛뇞뇠뇡뇢뇣뇤뇥뇦뇧뇪뇫뇭뇮뇯뇱뇲뇳뇴뇵뇶뇷뇸뇺뇼뇾뇿눀눁눂눃눆눇눉눊눍눎눏눐눑눒눓눖눘눚눛눜눝눞눟눡눢눣눤눥눦눧눨눩눪눫눬눭눮눯눰눱눲눳눵눶눷눸눹눺눻눽눾눿뉀뉁뉂뉃뉄뉅뉆뉇뉈뉉뉊뉋뉌뉍뉎뉏뉐뉑뉒뉓뉔뉕뉖뉗뉙뉚뉛뉝뉞뉟뉡뉢뉣뉤뉥뉦뉧뉪뉫뉬뉭뉮�".split("");
  387. for(j = 0; j != D[135].length; ++j) if(D[135][j].charCodeAt(0) !== 0xFFFD) { e[D[135][j]] = 34560 + j; d[34560 + j] = D[135][j];}
  388. D[136] = "�����������������������������������������������������������������뉯뉰뉱뉲뉳뉶뉷뉸뉹뉺뉻뉽뉾뉿늀늁늂늃늆늇늈늊늋늌늍늎������늏늒늓늕늖늗늛늜늝늞늟늢늤늧늨늩늫늭늮늯늱늲늳늵늶늷������늸늹늺늻늼늽늾늿닀닁닂닃닄닅닆닇닊닋닍닎닏닑닓닔닕닖닗닚닜닞닟닠닡닣닧닩닪닰닱닲닶닼닽닾댂댃댅댆댇댉댊댋댌댍댎댏댒댖댗댘댙댚댛댝댞댟댠댡댢댣댤댥댦댧댨댩댪댫댬댭댮댯댰댱댲댳댴댵댶댷댸댹댺댻댼댽댾댿덀덁덂덃덄덅덆덇덈덉덊덋덌덍덎덏덐덑덒덓덗덙덚덝덠덡덢덣�".split("");
  389. for(j = 0; j != D[136].length; ++j) if(D[136][j].charCodeAt(0) !== 0xFFFD) { e[D[136][j]] = 34816 + j; d[34816 + j] = D[136][j];}
  390. D[137] = "�����������������������������������������������������������������덦덨덪덬덭덯덲덳덵덶덷덹덺덻덼덽덾덿뎂뎆뎇뎈뎉뎊뎋뎍������뎎뎏뎑뎒뎓뎕뎖뎗뎘뎙뎚뎛뎜뎝뎞뎟뎢뎣뎤뎥뎦뎧뎩뎪뎫뎭������뎮뎯뎰뎱뎲뎳뎴뎵뎶뎷뎸뎹뎺뎻뎼뎽뎾뎿돀돁돂돃돆돇돉돊돍돏돑돒돓돖돘돚돜돞돟돡돢돣돥돦돧돩돪돫돬돭돮돯돰돱돲돳돴돵돶돷돸돹돺돻돽돾돿됀됁됂됃됄됅됆됇됈됉됊됋됌됍됎됏됑됒됓됔됕됖됗됙됚됛됝됞됟됡됢됣됤됥됦됧됪됬됭됮됯됰됱됲됳됵됶됷됸됹됺됻됼됽됾됿둀둁둂둃둄�".split("");
  391. for(j = 0; j != D[137].length; ++j) if(D[137][j].charCodeAt(0) !== 0xFFFD) { e[D[137][j]] = 35072 + j; d[35072 + j] = D[137][j];}
  392. D[138] = "�����������������������������������������������������������������둅둆둇둈둉둊둋둌둍둎둏둒둓둕둖둗둙둚둛둜둝둞둟둢둤둦������둧둨둩둪둫둭둮둯둰둱둲둳둴둵둶둷둸둹둺둻둼둽둾둿뒁뒂������뒃뒄뒅뒆뒇뒉뒊뒋뒌뒍뒎뒏뒐뒑뒒뒓뒔뒕뒖뒗뒘뒙뒚뒛뒜뒞뒟뒠뒡뒢뒣뒥뒦뒧뒩뒪뒫뒭뒮뒯뒰뒱뒲뒳뒴뒶뒸뒺뒻뒼뒽뒾뒿듁듂듃듅듆듇듉듊듋듌듍듎듏듑듒듓듔듖듗듘듙듚듛듞듟듡듢듥듧듨듩듪듫듮듰듲듳듴듵듶듷듹듺듻듼듽듾듿딀딁딂딃딄딅딆딇딈딉딊딋딌딍딎딏딐딑딒딓딖딗딙딚딝�".split("");
  393. for(j = 0; j != D[138].length; ++j) if(D[138][j].charCodeAt(0) !== 0xFFFD) { e[D[138][j]] = 35328 + j; d[35328 + j] = D[138][j];}
  394. D[139] = "�����������������������������������������������������������������딞딟딠딡딢딣딦딫딬딭딮딯딲딳딵딶딷딹딺딻딼딽딾딿땂땆������땇땈땉땊땎땏땑땒땓땕땖땗땘땙땚땛땞땢땣땤땥땦땧땨땩땪������땫땬땭땮땯땰땱땲땳땴땵땶땷땸땹땺땻땼땽땾땿떀떁떂떃떄떅떆떇떈떉떊떋떌떍떎떏떐떑떒떓떔떕떖떗떘떙떚떛떜떝떞떟떢떣떥떦떧떩떬떭떮떯떲떶떷떸떹떺떾떿뗁뗂뗃뗅뗆뗇뗈뗉뗊뗋뗎뗒뗓뗔뗕뗖뗗뗙뗚뗛뗜뗝뗞뗟뗠뗡뗢뗣뗤뗥뗦뗧뗨뗩뗪뗫뗭뗮뗯뗰뗱뗲뗳뗴뗵뗶뗷뗸뗹뗺뗻뗼뗽뗾뗿�".split("");
  395. for(j = 0; j != D[139].length; ++j) if(D[139][j].charCodeAt(0) !== 0xFFFD) { e[D[139][j]] = 35584 + j; d[35584 + j] = D[139][j];}
  396. D[140] = "�����������������������������������������������������������������똀똁똂똃똄똅똆똇똈똉똊똋똌똍똎똏똒똓똕똖똗똙똚똛똜똝������똞똟똠똡똢똣똤똦똧똨똩똪똫똭똮똯똰똱똲똳똵똶똷똸똹똺������똻똼똽똾똿뙀뙁뙂뙃뙄뙅뙆뙇뙉뙊뙋뙌뙍뙎뙏뙐뙑뙒뙓뙔뙕뙖뙗뙘뙙뙚뙛뙜뙝뙞뙟뙠뙡뙢뙣뙥뙦뙧뙩뙪뙫뙬뙭뙮뙯뙰뙱뙲뙳뙴뙵뙶뙷뙸뙹뙺뙻뙼뙽뙾뙿뚀뚁뚂뚃뚄뚅뚆뚇뚈뚉뚊뚋뚌뚍뚎뚏뚐뚑뚒뚓뚔뚕뚖뚗뚘뚙뚚뚛뚞뚟뚡뚢뚣뚥뚦뚧뚨뚩뚪뚭뚮뚯뚰뚲뚳뚴뚵뚶뚷뚸뚹뚺뚻뚼뚽뚾뚿뛀뛁뛂�".split("");
  397. for(j = 0; j != D[140].length; ++j) if(D[140][j].charCodeAt(0) !== 0xFFFD) { e[D[140][j]] = 35840 + j; d[35840 + j] = D[140][j];}
  398. D[141] = "�����������������������������������������������������������������뛃뛄뛅뛆뛇뛈뛉뛊뛋뛌뛍뛎뛏뛐뛑뛒뛓뛕뛖뛗뛘뛙뛚뛛뛜뛝������뛞뛟뛠뛡뛢뛣뛤뛥뛦뛧뛨뛩뛪뛫뛬뛭뛮뛯뛱뛲뛳뛵뛶뛷뛹뛺������뛻뛼뛽뛾뛿뜂뜃뜄뜆뜇뜈뜉뜊뜋뜌뜍뜎뜏뜐뜑뜒뜓뜔뜕뜖뜗뜘뜙뜚뜛뜜뜝뜞뜟뜠뜡뜢뜣뜤뜥뜦뜧뜪뜫뜭뜮뜱뜲뜳뜴뜵뜶뜷뜺뜼뜽뜾뜿띀띁띂띃띅띆띇띉띊띋띍띎띏띐띑띒띓띖띗띘띙띚띛띜띝띞띟띡띢띣띥띦띧띩띪띫띬띭띮띯띲띴띶띷띸띹띺띻띾띿랁랂랃랅랆랇랈랉랊랋랎랓랔랕랚랛랝랞�".split("");
  399. for(j = 0; j != D[141].length; ++j) if(D[141][j].charCodeAt(0) !== 0xFFFD) { e[D[141][j]] = 36096 + j; d[36096 + j] = D[141][j];}
  400. D[142] = "�����������������������������������������������������������������랟랡랢랣랤랥랦랧랪랮랯랰랱랲랳랶랷랹랺랻랼랽랾랿럀럁������럂럃럄럅럆럈럊럋럌럍럎럏럐럑럒럓럔럕럖럗럘럙럚럛럜럝������럞럟럠럡럢럣럤럥럦럧럨럩럪럫럮럯럱럲럳럵럶럷럸럹럺럻럾렂렃렄렅렆렊렋렍렎렏렑렒렓렔렕렖렗렚렜렞렟렠렡렢렣렦렧렩렪렫렭렮렯렰렱렲렳렶렺렻렼렽렾렿롁롂롃롅롆롇롈롉롊롋롌롍롎롏롐롒롔롕롖롗롘롙롚롛롞롟롡롢롣롥롦롧롨롩롪롫롮롰롲롳롴롵롶롷롹롺롻롽롾롿뢀뢁뢂뢃뢄�".split("");
  401. for(j = 0; j != D[142].length; ++j) if(D[142][j].charCodeAt(0) !== 0xFFFD) { e[D[142][j]] = 36352 + j; d[36352 + j] = D[142][j];}
  402. D[143] = "�����������������������������������������������������������������뢅뢆뢇뢈뢉뢊뢋뢌뢎뢏뢐뢑뢒뢓뢔뢕뢖뢗뢘뢙뢚뢛뢜뢝뢞뢟������뢠뢡뢢뢣뢤뢥뢦뢧뢩뢪뢫뢬뢭뢮뢯뢱뢲뢳뢵뢶뢷뢹뢺뢻뢼뢽������뢾뢿룂룄룆룇룈룉룊룋룍룎룏룑룒룓룕룖룗룘룙룚룛룜룞룠룢룣룤룥룦룧룪룫룭룮룯룱룲룳룴룵룶룷룺룼룾룿뤀뤁뤂뤃뤅뤆뤇뤈뤉뤊뤋뤌뤍뤎뤏뤐뤑뤒뤓뤔뤕뤖뤗뤙뤚뤛뤜뤝뤞뤟뤡뤢뤣뤤뤥뤦뤧뤨뤩뤪뤫뤬뤭뤮뤯뤰뤱뤲뤳뤴뤵뤶뤷뤸뤹뤺뤻뤾뤿륁륂륃륅륆륇륈륉륊륋륍륎륐륒륓륔륕륖륗�".split("");
  403. for(j = 0; j != D[143].length; ++j) if(D[143][j].charCodeAt(0) !== 0xFFFD) { e[D[143][j]] = 36608 + j; d[36608 + j] = D[143][j];}
  404. D[144] = "�����������������������������������������������������������������륚륛륝륞륟륡륢륣륤륥륦륧륪륬륮륯륰륱륲륳륶륷륹륺륻륽������륾륿릀릁릂릃릆릈릋릌릏릐릑릒릓릔릕릖릗릘릙릚릛릜릝릞������릟릠릡릢릣릤릥릦릧릨릩릪릫릮릯릱릲릳릵릶릷릸릹릺릻릾맀맂맃맄맅맆맇맊맋맍맓맔맕맖맗맚맜맟맠맢맦맧맩맪맫맭맮맯맰맱맲맳맶맻맼맽맾맿먂먃먄먅먆먇먉먊먋먌먍먎먏먐먑먒먓먔먖먗먘먙먚먛먜먝먞먟먠먡먢먣먤먥먦먧먨먩먪먫먬먭먮먯먰먱먲먳먴먵먶먷먺먻먽먾먿멁멃멄멅멆�".split("");
  405. for(j = 0; j != D[144].length; ++j) if(D[144][j].charCodeAt(0) !== 0xFFFD) { e[D[144][j]] = 36864 + j; d[36864 + j] = D[144][j];}
  406. D[145] = "�����������������������������������������������������������������멇멊멌멏멐멑멒멖멗멙멚멛멝멞멟멠멡멢멣멦멪멫멬멭멮멯������멲멳멵멶멷멹멺멻멼멽멾멿몀몁몂몆몈몉몊몋몍몎몏몐몑몒������몓몔몕몖몗몘몙몚몛몜몝몞몟몠몡몢몣몤몥몦몧몪몭몮몯몱몳몴몵몶몷몺몼몾몿뫀뫁뫂뫃뫅뫆뫇뫉뫊뫋뫌뫍뫎뫏뫐뫑뫒뫓뫔뫕뫖뫗뫚뫛뫜뫝뫞뫟뫠뫡뫢뫣뫤뫥뫦뫧뫨뫩뫪뫫뫬뫭뫮뫯뫰뫱뫲뫳뫴뫵뫶뫷뫸뫹뫺뫻뫽뫾뫿묁묂묃묅묆묇묈묉묊묋묌묎묐묒묓묔묕묖묗묙묚묛묝묞묟묡묢묣묤묥묦묧�".split("");
  407. for(j = 0; j != D[145].length; ++j) if(D[145][j].charCodeAt(0) !== 0xFFFD) { e[D[145][j]] = 37120 + j; d[37120 + j] = D[145][j];}
  408. D[146] = "�����������������������������������������������������������������묨묪묬묭묮묯묰묱묲묳묷묹묺묿뭀뭁뭂뭃뭆뭈뭊뭋뭌뭎뭑뭒������뭓뭕뭖뭗뭙뭚뭛뭜뭝뭞뭟뭠뭢뭤뭥뭦뭧뭨뭩뭪뭫뭭뭮뭯뭰뭱������뭲뭳뭴뭵뭶뭷뭸뭹뭺뭻뭼뭽뭾뭿뮀뮁뮂뮃뮄뮅뮆뮇뮉뮊뮋뮍뮎뮏뮑뮒뮓뮔뮕뮖뮗뮘뮙뮚뮛뮜뮝뮞뮟뮠뮡뮢뮣뮥뮦뮧뮩뮪뮫뮭뮮뮯뮰뮱뮲뮳뮵뮶뮸뮹뮺뮻뮼뮽뮾뮿믁믂믃믅믆믇믉믊믋믌믍믎믏믑믒믔믕믖믗믘믙믚믛믜믝믞믟믠믡믢믣믤믥믦믧믨믩믪믫믬믭믮믯믰믱믲믳믴믵믶믷믺믻믽믾밁�".split("");
  409. for(j = 0; j != D[146].length; ++j) if(D[146][j].charCodeAt(0) !== 0xFFFD) { e[D[146][j]] = 37376 + j; d[37376 + j] = D[146][j];}
  410. D[147] = "�����������������������������������������������������������������밃밄밅밆밇밊밎밐밒밓밙밚밠밡밢밣밦밨밪밫밬밮밯밲밳밵������밶밷밹밺밻밼밽밾밿뱂뱆뱇뱈뱊뱋뱎뱏뱑뱒뱓뱔뱕뱖뱗뱘뱙������뱚뱛뱜뱞뱟뱠뱡뱢뱣뱤뱥뱦뱧뱨뱩뱪뱫뱬뱭뱮뱯뱰뱱뱲뱳뱴뱵뱶뱷뱸뱹뱺뱻뱼뱽뱾뱿벀벁벂벃벆벇벉벊벍벏벐벑벒벓벖벘벛벜벝벞벟벢벣벥벦벩벪벫벬벭벮벯벲벶벷벸벹벺벻벾벿볁볂볃볅볆볇볈볉볊볋볌볎볒볓볔볖볗볙볚볛볝볞볟볠볡볢볣볤볥볦볧볨볩볪볫볬볭볮볯볰볱볲볳볷볹볺볻볽�".split("");
  411. for(j = 0; j != D[147].length; ++j) if(D[147][j].charCodeAt(0) !== 0xFFFD) { e[D[147][j]] = 37632 + j; d[37632 + j] = D[147][j];}
  412. D[148] = "�����������������������������������������������������������������볾볿봀봁봂봃봆봈봊봋봌봍봎봏봑봒봓봕봖봗봘봙봚봛봜봝������봞봟봠봡봢봣봥봦봧봨봩봪봫봭봮봯봰봱봲봳봴봵봶봷봸봹������봺봻봼봽봾봿뵁뵂뵃뵄뵅뵆뵇뵊뵋뵍뵎뵏뵑뵒뵓뵔뵕뵖뵗뵚뵛뵜뵝뵞뵟뵠뵡뵢뵣뵥뵦뵧뵩뵪뵫뵬뵭뵮뵯뵰뵱뵲뵳뵴뵵뵶뵷뵸뵹뵺뵻뵼뵽뵾뵿붂붃붅붆붋붌붍붎붏붒붔붖붗붘붛붝붞붟붠붡붢붣붥붦붧붨붩붪붫붬붭붮붯붱붲붳붴붵붶붷붹붺붻붼붽붾붿뷀뷁뷂뷃뷄뷅뷆뷇뷈뷉뷊뷋뷌뷍뷎뷏뷐뷑�".split("");
  413. for(j = 0; j != D[148].length; ++j) if(D[148][j].charCodeAt(0) !== 0xFFFD) { e[D[148][j]] = 37888 + j; d[37888 + j] = D[148][j];}
  414. D[149] = "�����������������������������������������������������������������뷒뷓뷖뷗뷙뷚뷛뷝뷞뷟뷠뷡뷢뷣뷤뷥뷦뷧뷨뷪뷫뷬뷭뷮뷯뷱������뷲뷳뷵뷶뷷뷹뷺뷻뷼뷽뷾뷿븁븂븄븆븇븈븉븊븋븎븏븑븒븓������븕븖븗븘븙븚븛븞븠븡븢븣븤븥븦븧븨븩븪븫븬븭븮븯븰븱븲븳븴븵븶븷븸븹븺븻븼븽븾븿빀빁빂빃빆빇빉빊빋빍빏빐빑빒빓빖빘빜빝빞빟빢빣빥빦빧빩빫빬빭빮빯빲빶빷빸빹빺빾빿뺁뺂뺃뺅뺆뺇뺈뺉뺊뺋뺎뺒뺓뺔뺕뺖뺗뺚뺛뺜뺝뺞뺟뺠뺡뺢뺣뺤뺥뺦뺧뺩뺪뺫뺬뺭뺮뺯뺰뺱뺲뺳뺴뺵뺶뺷�".split("");
  415. for(j = 0; j != D[149].length; ++j) if(D[149][j].charCodeAt(0) !== 0xFFFD) { e[D[149][j]] = 38144 + j; d[38144 + j] = D[149][j];}
  416. D[150] = "�����������������������������������������������������������������뺸뺹뺺뺻뺼뺽뺾뺿뻀뻁뻂뻃뻄뻅뻆뻇뻈뻉뻊뻋뻌뻍뻎뻏뻒뻓������뻕뻖뻙뻚뻛뻜뻝뻞뻟뻡뻢뻦뻧뻨뻩뻪뻫뻭뻮뻯뻰뻱뻲뻳뻴뻵������뻶뻷뻸뻹뻺뻻뻼뻽뻾뻿뼀뼂뼃뼄뼅뼆뼇뼊뼋뼌뼍뼎뼏뼐뼑뼒뼓뼔뼕뼖뼗뼚뼞뼟뼠뼡뼢뼣뼤뼥뼦뼧뼨뼩뼪뼫뼬뼭뼮뼯뼰뼱뼲뼳뼴뼵뼶뼷뼸뼹뼺뼻뼼뼽뼾뼿뽂뽃뽅뽆뽇뽉뽊뽋뽌뽍뽎뽏뽒뽓뽔뽖뽗뽘뽙뽚뽛뽜뽝뽞뽟뽠뽡뽢뽣뽤뽥뽦뽧뽨뽩뽪뽫뽬뽭뽮뽯뽰뽱뽲뽳뽴뽵뽶뽷뽸뽹뽺뽻뽼뽽뽾뽿뾀뾁뾂�".split("");
  417. for(j = 0; j != D[150].length; ++j) if(D[150][j].charCodeAt(0) !== 0xFFFD) { e[D[150][j]] = 38400 + j; d[38400 + j] = D[150][j];}
  418. D[151] = "�����������������������������������������������������������������뾃뾄뾅뾆뾇뾈뾉뾊뾋뾌뾍뾎뾏뾐뾑뾒뾓뾕뾖뾗뾘뾙뾚뾛뾜뾝������뾞뾟뾠뾡뾢뾣뾤뾥뾦뾧뾨뾩뾪뾫뾬뾭뾮뾯뾱뾲뾳뾴뾵뾶뾷뾸������뾹뾺뾻뾼뾽뾾뾿뿀뿁뿂뿃뿄뿆뿇뿈뿉뿊뿋뿎뿏뿑뿒뿓뿕뿖뿗뿘뿙뿚뿛뿝뿞뿠뿢뿣뿤뿥뿦뿧뿨뿩뿪뿫뿬뿭뿮뿯뿰뿱뿲뿳뿴뿵뿶뿷뿸뿹뿺뿻뿼뿽뿾뿿쀀쀁쀂쀃쀄쀅쀆쀇쀈쀉쀊쀋쀌쀍쀎쀏쀐쀑쀒쀓쀔쀕쀖쀗쀘쀙쀚쀛쀜쀝쀞쀟쀠쀡쀢쀣쀤쀥쀦쀧쀨쀩쀪쀫쀬쀭쀮쀯쀰쀱쀲쀳쀴쀵쀶쀷쀸쀹쀺쀻쀽쀾쀿�".split("");
  419. for(j = 0; j != D[151].length; ++j) if(D[151][j].charCodeAt(0) !== 0xFFFD) { e[D[151][j]] = 38656 + j; d[38656 + j] = D[151][j];}
  420. D[152] = "�����������������������������������������������������������������쁀쁁쁂쁃쁄쁅쁆쁇쁈쁉쁊쁋쁌쁍쁎쁏쁐쁒쁓쁔쁕쁖쁗쁙쁚쁛������쁝쁞쁟쁡쁢쁣쁤쁥쁦쁧쁪쁫쁬쁭쁮쁯쁰쁱쁲쁳쁴쁵쁶쁷쁸쁹������쁺쁻쁼쁽쁾쁿삀삁삂삃삄삅삆삇삈삉삊삋삌삍삎삏삒삓삕삖삗삙삚삛삜삝삞삟삢삤삦삧삨삩삪삫삮삱삲삷삸삹삺삻삾샂샃샄샆샇샊샋샍샎샏샑샒샓샔샕샖샗샚샞샟샠샡샢샣샦샧샩샪샫샭샮샯샰샱샲샳샶샸샺샻샼샽샾샿섁섂섃섅섆섇섉섊섋섌섍섎섏섑섒섓섔섖섗섘섙섚섛섡섢섥섨섩섪섫섮�".split("");
  421. for(j = 0; j != D[152].length; ++j) if(D[152][j].charCodeAt(0) !== 0xFFFD) { e[D[152][j]] = 38912 + j; d[38912 + j] = D[152][j];}
  422. D[153] = "�����������������������������������������������������������������섲섳섴섵섷섺섻섽섾섿셁셂셃셄셅셆셇셊셎셏셐셑셒셓셖셗������셙셚셛셝셞셟셠셡셢셣셦셪셫셬셭셮셯셱셲셳셵셶셷셹셺셻������셼셽셾셿솀솁솂솃솄솆솇솈솉솊솋솏솑솒솓솕솗솘솙솚솛솞솠솢솣솤솦솧솪솫솭솮솯솱솲솳솴솵솶솷솸솹솺솻솼솾솿쇀쇁쇂쇃쇅쇆쇇쇉쇊쇋쇍쇎쇏쇐쇑쇒쇓쇕쇖쇙쇚쇛쇜쇝쇞쇟쇡쇢쇣쇥쇦쇧쇩쇪쇫쇬쇭쇮쇯쇲쇴쇵쇶쇷쇸쇹쇺쇻쇾쇿숁숂숃숅숆숇숈숉숊숋숎숐숒숓숔숕숖숗숚숛숝숞숡숢숣�".split("");
  423. for(j = 0; j != D[153].length; ++j) if(D[153][j].charCodeAt(0) !== 0xFFFD) { e[D[153][j]] = 39168 + j; d[39168 + j] = D[153][j];}
  424. D[154] = "�����������������������������������������������������������������숤숥숦숧숪숬숮숰숳숵숶숷숸숹숺숻숼숽숾숿쉀쉁쉂쉃쉄쉅������쉆쉇쉉쉊쉋쉌쉍쉎쉏쉒쉓쉕쉖쉗쉙쉚쉛쉜쉝쉞쉟쉡쉢쉣쉤쉦������쉧쉨쉩쉪쉫쉮쉯쉱쉲쉳쉵쉶쉷쉸쉹쉺쉻쉾슀슂슃슄슅슆슇슊슋슌슍슎슏슑슒슓슔슕슖슗슙슚슜슞슟슠슡슢슣슦슧슩슪슫슮슯슰슱슲슳슶슸슺슻슼슽슾슿싀싁싂싃싄싅싆싇싈싉싊싋싌싍싎싏싐싑싒싓싔싕싖싗싘싙싚싛싞싟싡싢싥싦싧싨싩싪싮싰싲싳싴싵싷싺싽싾싿쌁쌂쌃쌄쌅쌆쌇쌊쌋쌎쌏�".split("");
  425. for(j = 0; j != D[154].length; ++j) if(D[154][j].charCodeAt(0) !== 0xFFFD) { e[D[154][j]] = 39424 + j; d[39424 + j] = D[154][j];}
  426. D[155] = "�����������������������������������������������������������������쌐쌑쌒쌖쌗쌙쌚쌛쌝쌞쌟쌠쌡쌢쌣쌦쌧쌪쌫쌬쌭쌮쌯쌰쌱쌲������쌳쌴쌵쌶쌷쌸쌹쌺쌻쌼쌽쌾쌿썀썁썂썃썄썆썇썈썉썊썋썌썍������썎썏썐썑썒썓썔썕썖썗썘썙썚썛썜썝썞썟썠썡썢썣썤썥썦썧썪썫썭썮썯썱썳썴썵썶썷썺썻썾썿쎀쎁쎂쎃쎅쎆쎇쎉쎊쎋쎍쎎쎏쎐쎑쎒쎓쎔쎕쎖쎗쎘쎙쎚쎛쎜쎝쎞쎟쎠쎡쎢쎣쎤쎥쎦쎧쎨쎩쎪쎫쎬쎭쎮쎯쎰쎱쎲쎳쎴쎵쎶쎷쎸쎹쎺쎻쎼쎽쎾쎿쏁쏂쏃쏄쏅쏆쏇쏈쏉쏊쏋쏌쏍쏎쏏쏐쏑쏒쏓쏔쏕쏖쏗쏚�".split("");
  427. for(j = 0; j != D[155].length; ++j) if(D[155][j].charCodeAt(0) !== 0xFFFD) { e[D[155][j]] = 39680 + j; d[39680 + j] = D[155][j];}
  428. D[156] = "�����������������������������������������������������������������쏛쏝쏞쏡쏣쏤쏥쏦쏧쏪쏫쏬쏮쏯쏰쏱쏲쏳쏶쏷쏹쏺쏻쏼쏽쏾������쏿쐀쐁쐂쐃쐄쐅쐆쐇쐉쐊쐋쐌쐍쐎쐏쐑쐒쐓쐔쐕쐖쐗쐘쐙쐚������쐛쐜쐝쐞쐟쐠쐡쐢쐣쐥쐦쐧쐨쐩쐪쐫쐭쐮쐯쐱쐲쐳쐵쐶쐷쐸쐹쐺쐻쐾쐿쑀쑁쑂쑃쑄쑅쑆쑇쑉쑊쑋쑌쑍쑎쑏쑐쑑쑒쑓쑔쑕쑖쑗쑘쑙쑚쑛쑜쑝쑞쑟쑠쑡쑢쑣쑦쑧쑩쑪쑫쑭쑮쑯쑰쑱쑲쑳쑶쑷쑸쑺쑻쑼쑽쑾쑿쒁쒂쒃쒄쒅쒆쒇쒈쒉쒊쒋쒌쒍쒎쒏쒐쒑쒒쒓쒕쒖쒗쒘쒙쒚쒛쒝쒞쒟쒠쒡쒢쒣쒤쒥쒦쒧쒨쒩�".split("");
  429. for(j = 0; j != D[156].length; ++j) if(D[156][j].charCodeAt(0) !== 0xFFFD) { e[D[156][j]] = 39936 + j; d[39936 + j] = D[156][j];}
  430. D[157] = "�����������������������������������������������������������������쒪쒫쒬쒭쒮쒯쒰쒱쒲쒳쒴쒵쒶쒷쒹쒺쒻쒽쒾쒿쓀쓁쓂쓃쓄쓅������쓆쓇쓈쓉쓊쓋쓌쓍쓎쓏쓐쓑쓒쓓쓔쓕쓖쓗쓘쓙쓚쓛쓜쓝쓞쓟������쓠쓡쓢쓣쓤쓥쓦쓧쓨쓪쓫쓬쓭쓮쓯쓲쓳쓵쓶쓷쓹쓻쓼쓽쓾씂씃씄씅씆씇씈씉씊씋씍씎씏씑씒씓씕씖씗씘씙씚씛씝씞씟씠씡씢씣씤씥씦씧씪씫씭씮씯씱씲씳씴씵씶씷씺씼씾씿앀앁앂앃앆앇앋앏앐앑앒앖앚앛앜앟앢앣앥앦앧앩앪앫앬앭앮앯앲앶앷앸앹앺앻앾앿얁얂얃얅얆얈얉얊얋얎얐얒얓얔�".split("");
  431. for(j = 0; j != D[157].length; ++j) if(D[157][j].charCodeAt(0) !== 0xFFFD) { e[D[157][j]] = 40192 + j; d[40192 + j] = D[157][j];}
  432. D[158] = "�����������������������������������������������������������������얖얙얚얛얝얞얟얡얢얣얤얥얦얧얨얪얫얬얭얮얯얰얱얲얳얶������얷얺얿엀엁엂엃엋엍엏엒엓엕엖엗엙엚엛엜엝엞엟엢엤엦엧������엨엩엪엫엯엱엲엳엵엸엹엺엻옂옃옄옉옊옋옍옎옏옑옒옓옔옕옖옗옚옝옞옟옠옡옢옣옦옧옩옪옫옯옱옲옶옸옺옼옽옾옿왂왃왅왆왇왉왊왋왌왍왎왏왒왖왗왘왙왚왛왞왟왡왢왣왤왥왦왧왨왩왪왫왭왮왰왲왳왴왵왶왷왺왻왽왾왿욁욂욃욄욅욆욇욊욌욎욏욐욑욒욓욖욗욙욚욛욝욞욟욠욡욢욣욦�".split("");
  433. for(j = 0; j != D[158].length; ++j) if(D[158][j].charCodeAt(0) !== 0xFFFD) { e[D[158][j]] = 40448 + j; d[40448 + j] = D[158][j];}
  434. D[159] = "�����������������������������������������������������������������욨욪욫욬욭욮욯욲욳욵욶욷욻욼욽욾욿웂웄웆웇웈웉웊웋웎������웏웑웒웓웕웖웗웘웙웚웛웞웟웢웣웤웥웦웧웪웫웭웮웯웱웲������웳웴웵웶웷웺웻웼웾웿윀윁윂윃윆윇윉윊윋윍윎윏윐윑윒윓윖윘윚윛윜윝윞윟윢윣윥윦윧윩윪윫윬윭윮윯윲윴윶윸윹윺윻윾윿읁읂읃읅읆읇읈읉읋읎읐읙읚읛읝읞읟읡읢읣읤읥읦읧읩읪읬읭읮읯읰읱읲읳읶읷읹읺읻읿잀잁잂잆잋잌잍잏잒잓잕잙잛잜잝잞잟잢잧잨잩잪잫잮잯잱잲잳잵잶잷�".split("");
  435. for(j = 0; j != D[159].length; ++j) if(D[159][j].charCodeAt(0) !== 0xFFFD) { e[D[159][j]] = 40704 + j; d[40704 + j] = D[159][j];}
  436. D[160] = "�����������������������������������������������������������������잸잹잺잻잾쟂쟃쟄쟅쟆쟇쟊쟋쟍쟏쟑쟒쟓쟔쟕쟖쟗쟙쟚쟛쟜������쟞쟟쟠쟡쟢쟣쟥쟦쟧쟩쟪쟫쟭쟮쟯쟰쟱쟲쟳쟴쟵쟶쟷쟸쟹쟺������쟻쟼쟽쟾쟿젂젃젅젆젇젉젋젌젍젎젏젒젔젗젘젙젚젛젞젟젡젢젣젥젦젧젨젩젪젫젮젰젲젳젴젵젶젷젹젺젻젽젾젿졁졂졃졄졅졆졇졊졋졎졏졐졑졒졓졕졖졗졘졙졚졛졜졝졞졟졠졡졢졣졤졥졦졧졨졩졪졫졬졭졮졯졲졳졵졶졷졹졻졼졽졾졿좂좄좈좉좊좎좏좐좑좒좓좕좖좗좘좙좚좛좜좞좠좢좣좤�".split("");
  437. for(j = 0; j != D[160].length; ++j) if(D[160][j].charCodeAt(0) !== 0xFFFD) { e[D[160][j]] = 40960 + j; d[40960 + j] = D[160][j];}
  438. D[161] = "�����������������������������������������������������������������좥좦좧좩좪좫좬좭좮좯좰좱좲좳좴좵좶좷좸좹좺좻좾좿죀죁������죂죃죅죆죇죉죊죋죍죎죏죐죑죒죓죖죘죚죛죜죝죞죟죢죣죥������죦죧죨죩죪죫죬죭죮죯죰죱죲죳죴죶죷죸죹죺죻죾죿줁줂줃줇줈줉줊줋줎 、。·‥…¨〃­―∥\∼‘’“”〔〕〈〉《》「」『』【】±×÷≠≤≥∞∴°′″℃Å¢£¥♂♀∠⊥⌒∂∇≡≒§※☆★○●◎◇◆□■△▲▽▼→←↑↓↔〓≪≫√∽∝∵∫∬∈∋⊆⊇⊂⊃∪∩∧∨¬�".split("");
  439. for(j = 0; j != D[161].length; ++j) if(D[161][j].charCodeAt(0) !== 0xFFFD) { e[D[161][j]] = 41216 + j; d[41216 + j] = D[161][j];}
  440. D[162] = "�����������������������������������������������������������������줐줒줓줔줕줖줗줙줚줛줜줝줞줟줠줡줢줣줤줥줦줧줨줩줪줫������줭줮줯줰줱줲줳줵줶줷줸줹줺줻줼줽줾줿쥀쥁쥂쥃쥄쥅쥆쥇������쥈쥉쥊쥋쥌쥍쥎쥏쥒쥓쥕쥖쥗쥙쥚쥛쥜쥝쥞쥟쥢쥤쥥쥦쥧쥨쥩쥪쥫쥭쥮쥯⇒⇔∀∃´~ˇ˘˝˚˙¸˛¡¿ː∮∑∏¤℉‰◁◀▷▶♤♠♡♥♧♣⊙◈▣◐◑▒▤▥▨▧▦▩♨☏☎☜☞¶†‡↕↗↙↖↘♭♩♪♬㉿㈜№㏇™㏂㏘℡€®������������������������".split("");
  441. for(j = 0; j != D[162].length; ++j) if(D[162][j].charCodeAt(0) !== 0xFFFD) { e[D[162][j]] = 41472 + j; d[41472 + j] = D[162][j];}
  442. D[163] = "�����������������������������������������������������������������쥱쥲쥳쥵쥶쥷쥸쥹쥺쥻쥽쥾쥿즀즁즂즃즄즅즆즇즊즋즍즎즏������즑즒즓즔즕즖즗즚즜즞즟즠즡즢즣즤즥즦즧즨즩즪즫즬즭즮������즯즰즱즲즳즴즵즶즷즸즹즺즻즼즽즾즿짂짃짅짆짉짋짌짍짎짏짒짔짗짘짛!"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[₩]^_`abcdefghijklmnopqrstuvwxyz{|} ̄�".split("");
  443. for(j = 0; j != D[163].length; ++j) if(D[163][j].charCodeAt(0) !== 0xFFFD) { e[D[163][j]] = 41728 + j; d[41728 + j] = D[163][j];}
  444. D[164] = "�����������������������������������������������������������������짞짟짡짣짥짦짨짩짪짫짮짲짳짴짵짶짷짺짻짽짾짿쨁쨂쨃쨄������쨅쨆쨇쨊쨎쨏쨐쨑쨒쨓쨕쨖쨗쨙쨚쨛쨜쨝쨞쨟쨠쨡쨢쨣쨤쨥������쨦쨧쨨쨪쨫쨬쨭쨮쨯쨰쨱쨲쨳쨴쨵쨶쨷쨸쨹쨺쨻쨼쨽쨾쨿쩀쩁쩂쩃쩄쩅쩆ㄱㄲㄳㄴㄵㄶㄷㄸㄹㄺㄻㄼㄽㄾㄿㅀㅁㅂㅃㅄㅅㅆㅇㅈㅉㅊㅋㅌㅍㅎㅏㅐㅑㅒㅓㅔㅕㅖㅗㅘㅙㅚㅛㅜㅝㅞㅟㅠㅡㅢㅣㅤㅥㅦㅧㅨㅩㅪㅫㅬㅭㅮㅯㅰㅱㅲㅳㅴㅵㅶㅷㅸㅹㅺㅻㅼㅽㅾㅿㆀㆁㆂㆃㆄㆅㆆㆇㆈㆉㆊㆋㆌㆍㆎ�".split("");
  445. for(j = 0; j != D[164].length; ++j) if(D[164][j].charCodeAt(0) !== 0xFFFD) { e[D[164][j]] = 41984 + j; d[41984 + j] = D[164][j];}
  446. D[165] = "�����������������������������������������������������������������쩇쩈쩉쩊쩋쩎쩏쩑쩒쩓쩕쩖쩗쩘쩙쩚쩛쩞쩢쩣쩤쩥쩦쩧쩩쩪������쩫쩬쩭쩮쩯쩰쩱쩲쩳쩴쩵쩶쩷쩸쩹쩺쩻쩼쩾쩿쪀쪁쪂쪃쪅쪆������쪇쪈쪉쪊쪋쪌쪍쪎쪏쪐쪑쪒쪓쪔쪕쪖쪗쪙쪚쪛쪜쪝쪞쪟쪠쪡쪢쪣쪤쪥쪦쪧ⅰⅱⅲⅳⅴⅵⅶⅷⅸⅹ�����ⅠⅡⅢⅣⅤⅥⅦⅧⅨⅩ�������ΑΒΓΔΕΖΗΘΙΚΛΜΝΞΟΠΡΣΤΥΦΧΨΩ��������αβγδεζηθικλμνξοπρστυφχψω�������".split("");
  447. for(j = 0; j != D[165].length; ++j) if(D[165][j].charCodeAt(0) !== 0xFFFD) { e[D[165][j]] = 42240 + j; d[42240 + j] = D[165][j];}
  448. D[166] = "�����������������������������������������������������������������쪨쪩쪪쪫쪬쪭쪮쪯쪰쪱쪲쪳쪴쪵쪶쪷쪸쪹쪺쪻쪾쪿쫁쫂쫃쫅������쫆쫇쫈쫉쫊쫋쫎쫐쫒쫔쫕쫖쫗쫚쫛쫜쫝쫞쫟쫡쫢쫣쫤쫥쫦쫧������쫨쫩쫪쫫쫭쫮쫯쫰쫱쫲쫳쫵쫶쫷쫸쫹쫺쫻쫼쫽쫾쫿쬀쬁쬂쬃쬄쬅쬆쬇쬉쬊─│┌┐┘└├┬┤┴┼━┃┏┓┛┗┣┳┫┻╋┠┯┨┷┿┝┰┥┸╂┒┑┚┙┖┕┎┍┞┟┡┢┦┧┩┪┭┮┱┲┵┶┹┺┽┾╀╁╃╄╅╆╇╈╉╊���������������������������".split("");
  449. for(j = 0; j != D[166].length; ++j) if(D[166][j].charCodeAt(0) !== 0xFFFD) { e[D[166][j]] = 42496 + j; d[42496 + j] = D[166][j];}
  450. D[167] = "�����������������������������������������������������������������쬋쬌쬍쬎쬏쬑쬒쬓쬕쬖쬗쬙쬚쬛쬜쬝쬞쬟쬢쬣쬤쬥쬦쬧쬨쬩������쬪쬫쬬쬭쬮쬯쬰쬱쬲쬳쬴쬵쬶쬷쬸쬹쬺쬻쬼쬽쬾쬿쭀쭂쭃쭄������쭅쭆쭇쭊쭋쭍쭎쭏쭑쭒쭓쭔쭕쭖쭗쭚쭛쭜쭞쭟쭠쭡쭢쭣쭥쭦쭧쭨쭩쭪쭫쭬㎕㎖㎗ℓ㎘㏄㎣㎤㎥㎦㎙㎚㎛㎜㎝㎞㎟㎠㎡㎢㏊㎍㎎㎏㏏㎈㎉㏈㎧㎨㎰㎱㎲㎳㎴㎵㎶㎷㎸㎹㎀㎁㎂㎃㎄㎺㎻㎼㎽㎾㎿㎐㎑㎒㎓㎔Ω㏀㏁㎊㎋㎌㏖㏅㎭㎮㎯㏛㎩㎪㎫㎬㏝㏐㏓㏃㏉㏜㏆����������������".split("");
  451. for(j = 0; j != D[167].length; ++j) if(D[167][j].charCodeAt(0) !== 0xFFFD) { e[D[167][j]] = 42752 + j; d[42752 + j] = D[167][j];}
  452. D[168] = "�����������������������������������������������������������������쭭쭮쭯쭰쭱쭲쭳쭴쭵쭶쭷쭺쭻쭼쭽쭾쭿쮀쮁쮂쮃쮄쮅쮆쮇쮈������쮉쮊쮋쮌쮍쮎쮏쮐쮑쮒쮓쮔쮕쮖쮗쮘쮙쮚쮛쮝쮞쮟쮠쮡쮢쮣������쮤쮥쮦쮧쮨쮩쮪쮫쮬쮭쮮쮯쮰쮱쮲쮳쮴쮵쮶쮷쮹쮺쮻쮼쮽쮾쮿쯀쯁쯂쯃쯄ÆЪĦ�IJ�ĿŁØŒºÞŦŊ�㉠㉡㉢㉣㉤㉥㉦㉧㉨㉩㉪㉫㉬㉭㉮㉯㉰㉱㉲㉳㉴㉵㉶㉷㉸㉹㉺㉻ⓐⓑⓒⓓⓔⓕⓖⓗⓘⓙⓚⓛⓜⓝⓞⓟⓠⓡⓢⓣⓤⓥⓦⓧⓨⓩ①②③④⑤⑥⑦⑧⑨⑩⑪⑫⑬⑭⑮½⅓⅔¼¾⅛⅜⅝⅞�".split("");
  453. for(j = 0; j != D[168].length; ++j) if(D[168][j].charCodeAt(0) !== 0xFFFD) { e[D[168][j]] = 43008 + j; d[43008 + j] = D[168][j];}
  454. D[169] = "�����������������������������������������������������������������쯅쯆쯇쯈쯉쯊쯋쯌쯍쯎쯏쯐쯑쯒쯓쯕쯖쯗쯘쯙쯚쯛쯜쯝쯞쯟������쯠쯡쯢쯣쯥쯦쯨쯪쯫쯬쯭쯮쯯쯰쯱쯲쯳쯴쯵쯶쯷쯸쯹쯺쯻쯼������쯽쯾쯿찀찁찂찃찄찅찆찇찈찉찊찋찎찏찑찒찓찕찖찗찘찙찚찛찞찟찠찣찤æđðħıijĸŀłøœßþŧŋʼn㈀㈁㈂㈃㈄㈅㈆㈇㈈㈉㈊㈋㈌㈍㈎㈏㈐㈑㈒㈓㈔㈕㈖㈗㈘㈙㈚㈛⒜⒝⒞⒟⒠⒡⒢⒣⒤⒥⒦⒧⒨⒩⒪⒫⒬⒭⒮⒯⒰⒱⒲⒳⒴⒵⑴⑵⑶⑷⑸⑹⑺⑻⑼⑽⑾⑿⒀⒁⒂¹²³⁴ⁿ₁₂₃₄�".split("");
  455. for(j = 0; j != D[169].length; ++j) if(D[169][j].charCodeAt(0) !== 0xFFFD) { e[D[169][j]] = 43264 + j; d[43264 + j] = D[169][j];}
  456. D[170] = "�����������������������������������������������������������������찥찦찪찫찭찯찱찲찳찴찵찶찷찺찿챀챁챂챃챆챇챉챊챋챍챎������챏챐챑챒챓챖챚챛챜챝챞챟챡챢챣챥챧챩챪챫챬챭챮챯챱챲������챳챴챶챷챸챹챺챻챼챽챾챿첀첁첂첃첄첅첆첇첈첉첊첋첌첍첎첏첐첑첒첓ぁあぃいぅうぇえぉおかがきぎくぐけげこごさざしじすずせぜそぞただちぢっつづてでとどなにぬねのはばぱひびぴふぶぷへべぺほぼぽまみむめもゃやゅゆょよらりるれろゎわゐゑをん������������".split("");
  457. for(j = 0; j != D[170].length; ++j) if(D[170][j].charCodeAt(0) !== 0xFFFD) { e[D[170][j]] = 43520 + j; d[43520 + j] = D[170][j];}
  458. D[171] = "�����������������������������������������������������������������첔첕첖첗첚첛첝첞첟첡첢첣첤첥첦첧첪첮첯첰첱첲첳첶첷첹������첺첻첽첾첿쳀쳁쳂쳃쳆쳈쳊쳋쳌쳍쳎쳏쳑쳒쳓쳕쳖쳗쳘쳙쳚������쳛쳜쳝쳞쳟쳠쳡쳢쳣쳥쳦쳧쳨쳩쳪쳫쳭쳮쳯쳱쳲쳳쳴쳵쳶쳷쳸쳹쳺쳻쳼쳽ァアィイゥウェエォオカガキギクグケゲコゴサザシジスズセゼソゾタダチヂッツヅテデトドナニヌネノハバパヒビピフブプヘベペホボポマミムメモャヤュユョヨラリルレロヮワヰヱヲンヴヵヶ���������".split("");
  459. for(j = 0; j != D[171].length; ++j) if(D[171][j].charCodeAt(0) !== 0xFFFD) { e[D[171][j]] = 43776 + j; d[43776 + j] = D[171][j];}
  460. D[172] = "�����������������������������������������������������������������쳾쳿촀촂촃촄촅촆촇촊촋촍촎촏촑촒촓촔촕촖촗촚촜촞촟촠������촡촢촣촥촦촧촩촪촫촭촮촯촰촱촲촳촴촵촶촷촸촺촻촼촽촾������촿쵀쵁쵂쵃쵄쵅쵆쵇쵈쵉쵊쵋쵌쵍쵎쵏쵐쵑쵒쵓쵔쵕쵖쵗쵘쵙쵚쵛쵝쵞쵟АБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯ���������������абвгдеёжзийклмнопрстуфхцчшщъыьэюя��������������".split("");
  461. for(j = 0; j != D[172].length; ++j) if(D[172][j].charCodeAt(0) !== 0xFFFD) { e[D[172][j]] = 44032 + j; d[44032 + j] = D[172][j];}
  462. D[173] = "�����������������������������������������������������������������쵡쵢쵣쵥쵦쵧쵨쵩쵪쵫쵮쵰쵲쵳쵴쵵쵶쵷쵹쵺쵻쵼쵽쵾쵿춀������춁춂춃춄춅춆춇춉춊춋춌춍춎춏춐춑춒춓춖춗춙춚춛춝춞춟������춠춡춢춣춦춨춪춫춬춭춮춯춱춲춳춴춵춶춷춸춹춺춻춼춽춾춿췀췁췂췃췅�����������������������������������������������������������������������������������������������".split("");
  463. for(j = 0; j != D[173].length; ++j) if(D[173][j].charCodeAt(0) !== 0xFFFD) { e[D[173][j]] = 44288 + j; d[44288 + j] = D[173][j];}
  464. D[174] = "�����������������������������������������������������������������췆췇췈췉췊췋췍췎췏췑췒췓췔췕췖췗췘췙췚췛췜췝췞췟췠췡������췢췣췤췥췦췧췩췪췫췭췮췯췱췲췳췴췵췶췷췺췼췾췿츀츁츂������츃츅츆츇츉츊츋츍츎츏츐츑츒츓츕츖츗츘츚츛츜츝츞츟츢츣츥츦츧츩츪츫�����������������������������������������������������������������������������������������������".split("");
  465. for(j = 0; j != D[174].length; ++j) if(D[174][j].charCodeAt(0) !== 0xFFFD) { e[D[174][j]] = 44544 + j; d[44544 + j] = D[174][j];}
  466. D[175] = "�����������������������������������������������������������������츬츭츮츯츲츴츶츷츸츹츺츻츼츽츾츿칀칁칂칃칄칅칆칇칈칉������칊칋칌칍칎칏칐칑칒칓칔칕칖칗칚칛칝칞칢칣칤칥칦칧칪칬������칮칯칰칱칲칳칶칷칹칺칻칽칾칿캀캁캂캃캆캈캊캋캌캍캎캏캒캓캕캖캗캙�����������������������������������������������������������������������������������������������".split("");
  467. for(j = 0; j != D[175].length; ++j) if(D[175][j].charCodeAt(0) !== 0xFFFD) { e[D[175][j]] = 44800 + j; d[44800 + j] = D[175][j];}
  468. D[176] = "�����������������������������������������������������������������캚캛캜캝캞캟캢캦캧캨캩캪캫캮캯캰캱캲캳캴캵캶캷캸캹캺������캻캼캽캾캿컀컂컃컄컅컆컇컈컉컊컋컌컍컎컏컐컑컒컓컔컕������컖컗컘컙컚컛컜컝컞컟컠컡컢컣컦컧컩컪컭컮컯컰컱컲컳컶컺컻컼컽컾컿가각간갇갈갉갊감갑값갓갔강갖갗같갚갛개객갠갤갬갭갯갰갱갸갹갼걀걋걍걔걘걜거걱건걷걸걺검겁것겄겅겆겉겊겋게겐겔겜겝겟겠겡겨격겪견겯결겸겹겻겼경곁계곈곌곕곗고곡곤곧골곪곬곯곰곱곳공곶과곽관괄괆�".split("");
  469. for(j = 0; j != D[176].length; ++j) if(D[176][j].charCodeAt(0) !== 0xFFFD) { e[D[176][j]] = 45056 + j; d[45056 + j] = D[176][j];}
  470. D[177] = "�����������������������������������������������������������������켂켃켅켆켇켉켊켋켌켍켎켏켒켔켖켗켘켙켚켛켝켞켟켡켢켣������켥켦켧켨켩켪켫켮켲켳켴켵켶켷켹켺켻켼켽켾켿콀콁콂콃콄������콅콆콇콈콉콊콋콌콍콎콏콐콑콒콓콖콗콙콚콛콝콞콟콠콡콢콣콦콨콪콫콬괌괍괏광괘괜괠괩괬괭괴괵괸괼굄굅굇굉교굔굘굡굣구국군굳굴굵굶굻굼굽굿궁궂궈궉권궐궜궝궤궷귀귁귄귈귐귑귓규균귤그극근귿글긁금급긋긍긔기긱긴긷길긺김깁깃깅깆깊까깍깎깐깔깖깜깝깟깠깡깥깨깩깬깰깸�".split("");
  471. for(j = 0; j != D[177].length; ++j) if(D[177][j].charCodeAt(0) !== 0xFFFD) { e[D[177][j]] = 45312 + j; d[45312 + j] = D[177][j];}
  472. D[178] = "�����������������������������������������������������������������콭콮콯콲콳콵콶콷콹콺콻콼콽콾콿쾁쾂쾃쾄쾆쾇쾈쾉쾊쾋쾍������쾎쾏쾐쾑쾒쾓쾔쾕쾖쾗쾘쾙쾚쾛쾜쾝쾞쾟쾠쾢쾣쾤쾥쾦쾧쾩������쾪쾫쾬쾭쾮쾯쾱쾲쾳쾴쾵쾶쾷쾸쾹쾺쾻쾼쾽쾾쾿쿀쿁쿂쿃쿅쿆쿇쿈쿉쿊쿋깹깻깼깽꺄꺅꺌꺼꺽꺾껀껄껌껍껏껐껑께껙껜껨껫껭껴껸껼꼇꼈꼍꼐꼬꼭꼰꼲꼴꼼꼽꼿꽁꽂꽃꽈꽉꽐꽜꽝꽤꽥꽹꾀꾄꾈꾐꾑꾕꾜꾸꾹꾼꿀꿇꿈꿉꿋꿍꿎꿔꿜꿨꿩꿰꿱꿴꿸뀀뀁뀄뀌뀐뀔뀜뀝뀨끄끅끈끊끌끎끓끔끕끗끙�".split("");
  473. for(j = 0; j != D[178].length; ++j) if(D[178][j].charCodeAt(0) !== 0xFFFD) { e[D[178][j]] = 45568 + j; d[45568 + j] = D[178][j];}
  474. D[179] = "�����������������������������������������������������������������쿌쿍쿎쿏쿐쿑쿒쿓쿔쿕쿖쿗쿘쿙쿚쿛쿜쿝쿞쿟쿢쿣쿥쿦쿧쿩������쿪쿫쿬쿭쿮쿯쿲쿴쿶쿷쿸쿹쿺쿻쿽쿾쿿퀁퀂퀃퀅퀆퀇퀈퀉퀊������퀋퀌퀍퀎퀏퀐퀒퀓퀔퀕퀖퀗퀙퀚퀛퀜퀝퀞퀟퀠퀡퀢퀣퀤퀥퀦퀧퀨퀩퀪퀫퀬끝끼끽낀낄낌낍낏낑나낙낚난낟날낡낢남납낫났낭낮낯낱낳내낵낸낼냄냅냇냈냉냐냑냔냘냠냥너넉넋넌널넒넓넘넙넛넜넝넣네넥넨넬넴넵넷넸넹녀녁년녈념녑녔녕녘녜녠노녹논놀놂놈놉놋농높놓놔놘놜놨뇌뇐뇔뇜뇝�".split("");
  475. for(j = 0; j != D[179].length; ++j) if(D[179][j].charCodeAt(0) !== 0xFFFD) { e[D[179][j]] = 45824 + j; d[45824 + j] = D[179][j];}
  476. D[180] = "�����������������������������������������������������������������퀮퀯퀰퀱퀲퀳퀶퀷퀹퀺퀻퀽퀾퀿큀큁큂큃큆큈큊큋큌큍큎큏������큑큒큓큕큖큗큙큚큛큜큝큞큟큡큢큣큤큥큦큧큨큩큪큫큮큯������큱큲큳큵큶큷큸큹큺큻큾큿킀킂킃킄킅킆킇킈킉킊킋킌킍킎킏킐킑킒킓킔뇟뇨뇩뇬뇰뇹뇻뇽누눅눈눋눌눔눕눗눙눠눴눼뉘뉜뉠뉨뉩뉴뉵뉼늄늅늉느늑는늘늙늚늠늡늣능늦늪늬늰늴니닉닌닐닒님닙닛닝닢다닥닦단닫달닭닮닯닳담답닷닸당닺닻닿대댁댄댈댐댑댓댔댕댜더덕덖던덛덜덞덟덤덥�".split("");
  477. for(j = 0; j != D[180].length; ++j) if(D[180][j].charCodeAt(0) !== 0xFFFD) { e[D[180][j]] = 46080 + j; d[46080 + j] = D[180][j];}
  478. D[181] = "�����������������������������������������������������������������킕킖킗킘킙킚킛킜킝킞킟킠킡킢킣킦킧킩킪킫킭킮킯킰킱킲������킳킶킸킺킻킼킽킾킿탂탃탅탆탇탊탋탌탍탎탏탒탖탗탘탙탚������탛탞탟탡탢탣탥탦탧탨탩탪탫탮탲탳탴탵탶탷탹탺탻탼탽탾탿턀턁턂턃턄덧덩덫덮데덱덴델뎀뎁뎃뎄뎅뎌뎐뎔뎠뎡뎨뎬도독돈돋돌돎돐돔돕돗동돛돝돠돤돨돼됐되된될됨됩됫됴두둑둔둘둠둡둣둥둬뒀뒈뒝뒤뒨뒬뒵뒷뒹듀듄듈듐듕드득든듣들듦듬듭듯등듸디딕딘딛딜딤딥딧딨딩딪따딱딴딸�".split("");
  479. for(j = 0; j != D[181].length; ++j) if(D[181][j].charCodeAt(0) !== 0xFFFD) { e[D[181][j]] = 46336 + j; d[46336 + j] = D[181][j];}
  480. D[182] = "�����������������������������������������������������������������턅턆턇턈턉턊턋턌턎턏턐턑턒턓턔턕턖턗턘턙턚턛턜턝턞턟������턠턡턢턣턤턥턦턧턨턩턪턫턬턭턮턯턲턳턵턶턷턹턻턼턽턾������턿텂텆텇텈텉텊텋텎텏텑텒텓텕텖텗텘텙텚텛텞텠텢텣텤텥텦텧텩텪텫텭땀땁땃땄땅땋때땍땐땔땜땝땟땠땡떠떡떤떨떪떫떰떱떳떴떵떻떼떽뗀뗄뗌뗍뗏뗐뗑뗘뗬또똑똔똘똥똬똴뙈뙤뙨뚜뚝뚠뚤뚫뚬뚱뛔뛰뛴뛸뜀뜁뜅뜨뜩뜬뜯뜰뜸뜹뜻띄띈띌띔띕띠띤띨띰띱띳띵라락란랄람랍랏랐랑랒랖랗�".split("");
  481. for(j = 0; j != D[182].length; ++j) if(D[182][j].charCodeAt(0) !== 0xFFFD) { e[D[182][j]] = 46592 + j; d[46592 + j] = D[182][j];}
  482. D[183] = "�����������������������������������������������������������������텮텯텰텱텲텳텴텵텶텷텸텹텺텻텽텾텿톀톁톂톃톅톆톇톉톊������톋톌톍톎톏톐톑톒톓톔톕톖톗톘톙톚톛톜톝톞톟톢톣톥톦톧������톩톪톫톬톭톮톯톲톴톶톷톸톹톻톽톾톿퇁퇂퇃퇄퇅퇆퇇퇈퇉퇊퇋퇌퇍퇎퇏래랙랜랠램랩랫랬랭랴략랸럇량러럭런럴럼럽럿렀렁렇레렉렌렐렘렙렛렝려력련렬렴렵렷렸령례롄롑롓로록론롤롬롭롯롱롸롼뢍뢨뢰뢴뢸룀룁룃룅료룐룔룝룟룡루룩룬룰룸룹룻룽뤄뤘뤠뤼뤽륀륄륌륏륑류륙륜률륨륩�".split("");
  483. for(j = 0; j != D[183].length; ++j) if(D[183][j].charCodeAt(0) !== 0xFFFD) { e[D[183][j]] = 46848 + j; d[46848 + j] = D[183][j];}
  484. D[184] = "�����������������������������������������������������������������퇐퇑퇒퇓퇔퇕퇖퇗퇙퇚퇛퇜퇝퇞퇟퇠퇡퇢퇣퇤퇥퇦퇧퇨퇩퇪������퇫퇬퇭퇮퇯퇰퇱퇲퇳퇵퇶퇷퇹퇺퇻퇼퇽퇾퇿툀툁툂툃툄툅툆������툈툊툋툌툍툎툏툑툒툓툔툕툖툗툘툙툚툛툜툝툞툟툠툡툢툣툤툥툦툧툨툩륫륭르륵른를름릅릇릉릊릍릎리릭린릴림립릿링마막만많맏말맑맒맘맙맛망맞맡맣매맥맨맬맴맵맷맸맹맺먀먁먈먕머먹먼멀멂멈멉멋멍멎멓메멕멘멜멤멥멧멨멩며멱면멸몃몄명몇몌모목몫몬몰몲몸몹못몽뫄뫈뫘뫙뫼�".split("");
  485. for(j = 0; j != D[184].length; ++j) if(D[184][j].charCodeAt(0) !== 0xFFFD) { e[D[184][j]] = 47104 + j; d[47104 + j] = D[184][j];}
  486. D[185] = "�����������������������������������������������������������������툪툫툮툯툱툲툳툵툶툷툸툹툺툻툾퉀퉂퉃퉄퉅퉆퉇퉉퉊퉋퉌������퉍퉎퉏퉐퉑퉒퉓퉔퉕퉖퉗퉘퉙퉚퉛퉝퉞퉟퉠퉡퉢퉣퉥퉦퉧퉨������퉩퉪퉫퉬퉭퉮퉯퉰퉱퉲퉳퉴퉵퉶퉷퉸퉹퉺퉻퉼퉽퉾퉿튂튃튅튆튇튉튊튋튌묀묄묍묏묑묘묜묠묩묫무묵묶문묻물묽묾뭄뭅뭇뭉뭍뭏뭐뭔뭘뭡뭣뭬뮈뮌뮐뮤뮨뮬뮴뮷므믄믈믐믓미믹민믿밀밂밈밉밋밌밍및밑바박밖밗반받발밝밞밟밤밥밧방밭배백밴밸뱀뱁뱃뱄뱅뱉뱌뱍뱐뱝버벅번벋벌벎범법벗�".split("");
  487. for(j = 0; j != D[185].length; ++j) if(D[185][j].charCodeAt(0) !== 0xFFFD) { e[D[185][j]] = 47360 + j; d[47360 + j] = D[185][j];}
  488. D[186] = "�����������������������������������������������������������������튍튎튏튒튓튔튖튗튘튙튚튛튝튞튟튡튢튣튥튦튧튨튩튪튫튭������튮튯튰튲튳튴튵튶튷튺튻튽튾틁틃틄틅틆틇틊틌틍틎틏틐틑������틒틓틕틖틗틙틚틛틝틞틟틠틡틢틣틦틧틨틩틪틫틬틭틮틯틲틳틵틶틷틹틺벙벚베벡벤벧벨벰벱벳벴벵벼벽변별볍볏볐병볕볘볜보복볶본볼봄봅봇봉봐봔봤봬뵀뵈뵉뵌뵐뵘뵙뵤뵨부북분붇불붉붊붐붑붓붕붙붚붜붤붰붸뷔뷕뷘뷜뷩뷰뷴뷸븀븃븅브븍븐블븜븝븟비빅빈빌빎빔빕빗빙빚빛빠빡빤�".split("");
  489. for(j = 0; j != D[186].length; ++j) if(D[186][j].charCodeAt(0) !== 0xFFFD) { e[D[186][j]] = 47616 + j; d[47616 + j] = D[186][j];}
  490. D[187] = "�����������������������������������������������������������������틻틼틽틾틿팂팄팆팇팈팉팊팋팏팑팒팓팕팗팘팙팚팛팞팢팣������팤팦팧팪팫팭팮팯팱팲팳팴팵팶팷팺팾팿퍀퍁퍂퍃퍆퍇퍈퍉������퍊퍋퍌퍍퍎퍏퍐퍑퍒퍓퍔퍕퍖퍗퍘퍙퍚퍛퍜퍝퍞퍟퍠퍡퍢퍣퍤퍥퍦퍧퍨퍩빨빪빰빱빳빴빵빻빼빽뺀뺄뺌뺍뺏뺐뺑뺘뺙뺨뻐뻑뻔뻗뻘뻠뻣뻤뻥뻬뼁뼈뼉뼘뼙뼛뼜뼝뽀뽁뽄뽈뽐뽑뽕뾔뾰뿅뿌뿍뿐뿔뿜뿟뿡쀼쁑쁘쁜쁠쁨쁩삐삑삔삘삠삡삣삥사삭삯산삳살삵삶삼삽삿샀상샅새색샌샐샘샙샛샜생샤�".split("");
  491. for(j = 0; j != D[187].length; ++j) if(D[187][j].charCodeAt(0) !== 0xFFFD) { e[D[187][j]] = 47872 + j; d[47872 + j] = D[187][j];}
  492. D[188] = "�����������������������������������������������������������������퍪퍫퍬퍭퍮퍯퍰퍱퍲퍳퍴퍵퍶퍷퍸퍹퍺퍻퍾퍿펁펂펃펅펆펇������펈펉펊펋펎펒펓펔펕펖펗펚펛펝펞펟펡펢펣펤펥펦펧펪펬펮������펯펰펱펲펳펵펶펷펹펺펻펽펾펿폀폁폂폃폆폇폊폋폌폍폎폏폑폒폓폔폕폖샥샨샬샴샵샷샹섀섄섈섐섕서석섞섟선섣설섦섧섬섭섯섰성섶세섹센셀셈셉셋셌셍셔셕션셜셤셥셧셨셩셰셴셸솅소속솎손솔솖솜솝솟송솥솨솩솬솰솽쇄쇈쇌쇔쇗쇘쇠쇤쇨쇰쇱쇳쇼쇽숀숄숌숍숏숑수숙순숟술숨숩숫숭�".split("");
  493. for(j = 0; j != D[188].length; ++j) if(D[188][j].charCodeAt(0) !== 0xFFFD) { e[D[188][j]] = 48128 + j; d[48128 + j] = D[188][j];}
  494. D[189] = "�����������������������������������������������������������������폗폙폚폛폜폝폞폟폠폢폤폥폦폧폨폩폪폫폮폯폱폲폳폵폶폷������폸폹폺폻폾퐀퐂퐃퐄퐅퐆퐇퐉퐊퐋퐌퐍퐎퐏퐐퐑퐒퐓퐔퐕퐖������퐗퐘퐙퐚퐛퐜퐞퐟퐠퐡퐢퐣퐤퐥퐦퐧퐨퐩퐪퐫퐬퐭퐮퐯퐰퐱퐲퐳퐴퐵퐶퐷숯숱숲숴쉈쉐쉑쉔쉘쉠쉥쉬쉭쉰쉴쉼쉽쉿슁슈슉슐슘슛슝스슥슨슬슭슴습슷승시식신싣실싫심십싯싱싶싸싹싻싼쌀쌈쌉쌌쌍쌓쌔쌕쌘쌜쌤쌥쌨쌩썅써썩썬썰썲썸썹썼썽쎄쎈쎌쏀쏘쏙쏜쏟쏠쏢쏨쏩쏭쏴쏵쏸쐈쐐쐤쐬쐰�".split("");
  495. for(j = 0; j != D[189].length; ++j) if(D[189][j].charCodeAt(0) !== 0xFFFD) { e[D[189][j]] = 48384 + j; d[48384 + j] = D[189][j];}
  496. D[190] = "�����������������������������������������������������������������퐸퐹퐺퐻퐼퐽퐾퐿푁푂푃푅푆푇푈푉푊푋푌푍푎푏푐푑푒푓������푔푕푖푗푘푙푚푛푝푞푟푡푢푣푥푦푧푨푩푪푫푬푮푰푱푲������푳푴푵푶푷푺푻푽푾풁풃풄풅풆풇풊풌풎풏풐풑풒풓풕풖풗풘풙풚풛풜풝쐴쐼쐽쑈쑤쑥쑨쑬쑴쑵쑹쒀쒔쒜쒸쒼쓩쓰쓱쓴쓸쓺쓿씀씁씌씐씔씜씨씩씬씰씸씹씻씽아악안앉않알앍앎앓암압앗았앙앝앞애액앤앨앰앱앳앴앵야약얀얄얇얌얍얏양얕얗얘얜얠얩어억언얹얻얼얽얾엄업없엇었엉엊엌엎�".split("");
  497. for(j = 0; j != D[190].length; ++j) if(D[190][j].charCodeAt(0) !== 0xFFFD) { e[D[190][j]] = 48640 + j; d[48640 + j] = D[190][j];}
  498. D[191] = "�����������������������������������������������������������������풞풟풠풡풢풣풤풥풦풧풨풪풫풬풭풮풯풰풱풲풳풴풵풶풷풸������풹풺풻풼풽풾풿퓀퓁퓂퓃퓄퓅퓆퓇퓈퓉퓊퓋퓍퓎퓏퓑퓒퓓퓕������퓖퓗퓘퓙퓚퓛퓝퓞퓠퓡퓢퓣퓤퓥퓦퓧퓩퓪퓫퓭퓮퓯퓱퓲퓳퓴퓵퓶퓷퓹퓺퓼에엑엔엘엠엡엣엥여역엮연열엶엷염엽엾엿였영옅옆옇예옌옐옘옙옛옜오옥온올옭옮옰옳옴옵옷옹옻와왁완왈왐왑왓왔왕왜왝왠왬왯왱외왹왼욀욈욉욋욍요욕욘욜욤욥욧용우욱운울욹욺움웁웃웅워웍원월웜웝웠웡웨�".split("");
  499. for(j = 0; j != D[191].length; ++j) if(D[191][j].charCodeAt(0) !== 0xFFFD) { e[D[191][j]] = 48896 + j; d[48896 + j] = D[191][j];}
  500. D[192] = "�����������������������������������������������������������������퓾퓿픀픁픂픃픅픆픇픉픊픋픍픎픏픐픑픒픓픖픘픙픚픛픜픝������픞픟픠픡픢픣픤픥픦픧픨픩픪픫픬픭픮픯픰픱픲픳픴픵픶픷������픸픹픺픻픾픿핁핂핃핅핆핇핈핉핊핋핎핐핒핓핔핕핖핗핚핛핝핞핟핡핢핣웩웬웰웸웹웽위윅윈윌윔윕윗윙유육윤율윰윱윳융윷으윽은을읊음읍읏응읒읓읔읕읖읗의읜읠읨읫이익인일읽읾잃임입잇있잉잊잎자작잔잖잗잘잚잠잡잣잤장잦재잭잰잴잼잽잿쟀쟁쟈쟉쟌쟎쟐쟘쟝쟤쟨쟬저적전절젊�".split("");
  501. for(j = 0; j != D[192].length; ++j) if(D[192][j].charCodeAt(0) !== 0xFFFD) { e[D[192][j]] = 49152 + j; d[49152 + j] = D[192][j];}
  502. D[193] = "�����������������������������������������������������������������핤핦핧핪핬핮핯핰핱핲핳핶핷핹핺핻핽핾핿햀햁햂햃햆햊햋������햌햍햎햏햑햒햓햔햕햖햗햘햙햚햛햜햝햞햟햠햡햢햣햤햦햧������햨햩햪햫햬햭햮햯햰햱햲햳햴햵햶햷햸햹햺햻햼햽햾햿헀헁헂헃헄헅헆헇점접젓정젖제젝젠젤젬젭젯젱져젼졀졈졉졌졍졔조족존졸졺좀좁좃종좆좇좋좌좍좔좝좟좡좨좼좽죄죈죌죔죕죗죙죠죡죤죵주죽준줄줅줆줌줍줏중줘줬줴쥐쥑쥔쥘쥠쥡쥣쥬쥰쥴쥼즈즉즌즐즘즙즛증지직진짇질짊짐집짓�".split("");
  503. for(j = 0; j != D[193].length; ++j) if(D[193][j].charCodeAt(0) !== 0xFFFD) { e[D[193][j]] = 49408 + j; d[49408 + j] = D[193][j];}
  504. D[194] = "�����������������������������������������������������������������헊헋헍헎헏헑헓헔헕헖헗헚헜헞헟헠헡헢헣헦헧헩헪헫헭헮������헯헰헱헲헳헶헸헺헻헼헽헾헿혂혃혅혆혇혉혊혋혌혍혎혏혒������혖혗혘혙혚혛혝혞혟혡혢혣혥혦혧혨혩혪혫혬혮혯혰혱혲혳혴혵혶혷혺혻징짖짙짚짜짝짠짢짤짧짬짭짯짰짱째짹짼쨀쨈쨉쨋쨌쨍쨔쨘쨩쩌쩍쩐쩔쩜쩝쩟쩠쩡쩨쩽쪄쪘쪼쪽쫀쫄쫌쫍쫏쫑쫓쫘쫙쫠쫬쫴쬈쬐쬔쬘쬠쬡쭁쭈쭉쭌쭐쭘쭙쭝쭤쭸쭹쮜쮸쯔쯤쯧쯩찌찍찐찔찜찝찡찢찧차착찬찮찰참찹찻�".split("");
  505. for(j = 0; j != D[194].length; ++j) if(D[194][j].charCodeAt(0) !== 0xFFFD) { e[D[194][j]] = 49664 + j; d[49664 + j] = D[194][j];}
  506. D[195] = "�����������������������������������������������������������������혽혾혿홁홂홃홄홆홇홊홌홎홏홐홒홓홖홗홙홚홛홝홞홟홠홡������홢홣홤홥홦홨홪홫홬홭홮홯홲홳홵홶홷홸홹홺홻홼홽홾홿횀������횁횂횄횆횇횈횉횊횋횎횏횑횒횓횕횖횗횘횙횚횛횜횞횠횢횣횤횥횦횧횩횪찼창찾채책챈챌챔챕챗챘챙챠챤챦챨챰챵처척천철첨첩첫첬청체첵첸첼쳄쳅쳇쳉쳐쳔쳤쳬쳰촁초촉촌촐촘촙촛총촤촨촬촹최쵠쵤쵬쵭쵯쵱쵸춈추축춘출춤춥춧충춰췄췌췐취췬췰췸췹췻췽츄츈츌츔츙츠측츤츨츰츱츳층�".split("");
  507. for(j = 0; j != D[195].length; ++j) if(D[195][j].charCodeAt(0) !== 0xFFFD) { e[D[195][j]] = 49920 + j; d[49920 + j] = D[195][j];}
  508. D[196] = "�����������������������������������������������������������������횫횭횮횯횱횲횳횴횵횶횷횸횺횼횽횾횿훀훁훂훃훆훇훉훊훋������훍훎훏훐훒훓훕훖훘훚훛훜훝훞훟훡훢훣훥훦훧훩훪훫훬훭������훮훯훱훲훳훴훶훷훸훹훺훻훾훿휁휂휃휅휆휇휈휉휊휋휌휍휎휏휐휒휓휔치칙친칟칠칡침칩칫칭카칵칸칼캄캅캇캉캐캑캔캘캠캡캣캤캥캬캭컁커컥컨컫컬컴컵컷컸컹케켁켄켈켐켑켓켕켜켠켤켬켭켯켰켱켸코콕콘콜콤콥콧콩콰콱콴콸쾀쾅쾌쾡쾨쾰쿄쿠쿡쿤쿨쿰쿱쿳쿵쿼퀀퀄퀑퀘퀭퀴퀵퀸퀼�".split("");
  509. for(j = 0; j != D[196].length; ++j) if(D[196][j].charCodeAt(0) !== 0xFFFD) { e[D[196][j]] = 50176 + j; d[50176 + j] = D[196][j];}
  510. D[197] = "�����������������������������������������������������������������휕휖휗휚휛휝휞휟휡휢휣휤휥휦휧휪휬휮휯휰휱휲휳휶휷휹������휺휻휽휾휿흀흁흂흃흅흆흈흊흋흌흍흎흏흒흓흕흚흛흜흝흞������흟흢흤흦흧흨흪흫흭흮흯흱흲흳흵흶흷흸흹흺흻흾흿힀힂힃힄힅힆힇힊힋큄큅큇큉큐큔큘큠크큭큰클큼큽킁키킥킨킬킴킵킷킹타탁탄탈탉탐탑탓탔탕태택탠탤탬탭탯탰탱탸턍터턱턴털턺텀텁텃텄텅테텍텐텔템텝텟텡텨텬텼톄톈토톡톤톨톰톱톳통톺톼퇀퇘퇴퇸툇툉툐투툭툰툴툼툽툿퉁퉈퉜�".split("");
  511. for(j = 0; j != D[197].length; ++j) if(D[197][j].charCodeAt(0) !== 0xFFFD) { e[D[197][j]] = 50432 + j; d[50432 + j] = D[197][j];}
  512. D[198] = "�����������������������������������������������������������������힍힎힏힑힒힓힔힕힖힗힚힜힞힟힠힡힢힣������������������������������������������������������������������������������퉤튀튁튄튈튐튑튕튜튠튤튬튱트특튼튿틀틂틈틉틋틔틘틜틤틥티틱틴틸팀팁팃팅파팍팎판팔팖팜팝팟팠팡팥패팩팬팰팸팹팻팼팽퍄퍅퍼퍽펀펄펌펍펏펐펑페펙펜펠펨펩펫펭펴편펼폄폅폈평폐폘폡폣포폭폰폴폼폽폿퐁�".split("");
  513. for(j = 0; j != D[198].length; ++j) if(D[198][j].charCodeAt(0) !== 0xFFFD) { e[D[198][j]] = 50688 + j; d[50688 + j] = D[198][j];}
  514. D[199] = "�����������������������������������������������������������������������������������������������������������������������������������������������������������������퐈퐝푀푄표푠푤푭푯푸푹푼푿풀풂품풉풋풍풔풩퓌퓐퓔퓜퓟퓨퓬퓰퓸퓻퓽프픈플픔픕픗피픽핀필핌핍핏핑하학한할핥함합핫항해핵핸핼햄햅햇했행햐향허헉헌헐헒험헙헛헝헤헥헨헬헴헵헷헹혀혁현혈혐협혓혔형혜혠�".split("");
  515. for(j = 0; j != D[199].length; ++j) if(D[199][j].charCodeAt(0) !== 0xFFFD) { e[D[199][j]] = 50944 + j; d[50944 + j] = D[199][j];}
  516. D[200] = "�����������������������������������������������������������������������������������������������������������������������������������������������������������������혤혭호혹혼홀홅홈홉홋홍홑화확환활홧황홰홱홴횃횅회획횐횔횝횟횡효횬횰횹횻후훅훈훌훑훔훗훙훠훤훨훰훵훼훽휀휄휑휘휙휜휠휨휩휫휭휴휵휸휼흄흇흉흐흑흔흖흗흘흙흠흡흣흥흩희흰흴흼흽힁히힉힌힐힘힙힛힝�".split("");
  517. for(j = 0; j != D[200].length; ++j) if(D[200][j].charCodeAt(0) !== 0xFFFD) { e[D[200][j]] = 51200 + j; d[51200 + j] = D[200][j];}
  518. D[202] = "�����������������������������������������������������������������������������������������������������������������������������������������������������������������伽佳假價加可呵哥嘉嫁家暇架枷柯歌珂痂稼苛茄街袈訶賈跏軻迦駕刻却各恪慤殼珏脚覺角閣侃刊墾奸姦干幹懇揀杆柬桿澗癎看磵稈竿簡肝艮艱諫間乫喝曷渴碣竭葛褐蝎鞨勘坎堪嵌感憾戡敢柑橄減甘疳監瞰紺邯鑑鑒龕�".split("");
  519. for(j = 0; j != D[202].length; ++j) if(D[202][j].charCodeAt(0) !== 0xFFFD) { e[D[202][j]] = 51712 + j; d[51712 + j] = D[202][j];}
  520. D[203] = "�����������������������������������������������������������������������������������������������������������������������������������������������������������������匣岬甲胛鉀閘剛堈姜岡崗康强彊慷江畺疆糠絳綱羌腔舡薑襁講鋼降鱇介价個凱塏愷愾慨改槪漑疥皆盖箇芥蓋豈鎧開喀客坑更粳羹醵倨去居巨拒据據擧渠炬祛距踞車遽鉅鋸乾件健巾建愆楗腱虔蹇鍵騫乞傑杰桀儉劍劒檢�".split("");
  521. for(j = 0; j != D[203].length; ++j) if(D[203][j].charCodeAt(0) !== 0xFFFD) { e[D[203][j]] = 51968 + j; d[51968 + j] = D[203][j];}
  522. D[204] = "�����������������������������������������������������������������������������������������������������������������������������������������������������������������瞼鈐黔劫怯迲偈憩揭擊格檄激膈覡隔堅牽犬甄絹繭肩見譴遣鵑抉決潔結缺訣兼慊箝謙鉗鎌京俓倞傾儆勁勍卿坰境庚徑慶憬擎敬景暻更梗涇炅烱璟璥瓊痙硬磬竟競絅經耕耿脛莖警輕逕鏡頃頸驚鯨係啓堺契季屆悸戒桂械�".split("");
  523. for(j = 0; j != D[204].length; ++j) if(D[204][j].charCodeAt(0) !== 0xFFFD) { e[D[204][j]] = 52224 + j; d[52224 + j] = D[204][j];}
  524. D[205] = "�����������������������������������������������������������������������������������������������������������������������������������������������������������������棨溪界癸磎稽系繫繼計誡谿階鷄古叩告呱固姑孤尻庫拷攷故敲暠枯槁沽痼皐睾稿羔考股膏苦苽菰藁蠱袴誥賈辜錮雇顧高鼓哭斛曲梏穀谷鵠困坤崑昆梱棍滾琨袞鯤汨滑骨供公共功孔工恐恭拱控攻珙空蚣貢鞏串寡戈果瓜�".split("");
  525. for(j = 0; j != D[205].length; ++j) if(D[205][j].charCodeAt(0) !== 0xFFFD) { e[D[205][j]] = 52480 + j; d[52480 + j] = D[205][j];}
  526. D[206] = "�����������������������������������������������������������������������������������������������������������������������������������������������������������������科菓誇課跨過鍋顆廓槨藿郭串冠官寬慣棺款灌琯瓘管罐菅觀貫關館刮恝括适侊光匡壙廣曠洸炚狂珖筐胱鑛卦掛罫乖傀塊壞怪愧拐槐魁宏紘肱轟交僑咬喬嬌嶠巧攪敎校橋狡皎矯絞翹膠蕎蛟較轎郊餃驕鮫丘久九仇俱具勾�".split("");
  527. for(j = 0; j != D[206].length; ++j) if(D[206][j].charCodeAt(0) !== 0xFFFD) { e[D[206][j]] = 52736 + j; d[52736 + j] = D[206][j];}
  528. D[207] = "�����������������������������������������������������������������������������������������������������������������������������������������������������������������區口句咎嘔坵垢寇嶇廐懼拘救枸柩構歐毆毬求溝灸狗玖球瞿矩究絿耉臼舅舊苟衢謳購軀逑邱鉤銶駒驅鳩鷗龜國局菊鞠鞫麴君窘群裙軍郡堀屈掘窟宮弓穹窮芎躬倦券勸卷圈拳捲權淃眷厥獗蕨蹶闕机櫃潰詭軌饋句晷歸貴�".split("");
  529. for(j = 0; j != D[207].length; ++j) if(D[207][j].charCodeAt(0) !== 0xFFFD) { e[D[207][j]] = 52992 + j; d[52992 + j] = D[207][j];}
  530. D[208] = "�����������������������������������������������������������������������������������������������������������������������������������������������������������������鬼龜叫圭奎揆槻珪硅窺竅糾葵規赳逵閨勻均畇筠菌鈞龜橘克剋劇戟棘極隙僅劤勤懃斤根槿瑾筋芹菫覲謹近饉契今妗擒昑檎琴禁禽芩衾衿襟金錦伋及急扱汲級給亘兢矜肯企伎其冀嗜器圻基埼夔奇妓寄岐崎己幾忌技旗旣�".split("");
  531. for(j = 0; j != D[208].length; ++j) if(D[208][j].charCodeAt(0) !== 0xFFFD) { e[D[208][j]] = 53248 + j; d[53248 + j] = D[208][j];}
  532. D[209] = "�����������������������������������������������������������������������������������������������������������������������������������������������������������������朞期杞棋棄機欺氣汽沂淇玘琦琪璂璣畸畿碁磯祁祇祈祺箕紀綺羈耆耭肌記譏豈起錡錤飢饑騎騏驥麒緊佶吉拮桔金喫儺喇奈娜懦懶拏拿癩羅蘿螺裸邏那樂洛烙珞落諾酪駱亂卵暖欄煖爛蘭難鸞捏捺南嵐枏楠湳濫男藍襤拉�".split("");
  533. for(j = 0; j != D[209].length; ++j) if(D[209][j].charCodeAt(0) !== 0xFFFD) { e[D[209][j]] = 53504 + j; d[53504 + j] = D[209][j];}
  534. D[210] = "�����������������������������������������������������������������������������������������������������������������������������������������������������������������納臘蠟衲囊娘廊朗浪狼郎乃來內奈柰耐冷女年撚秊念恬拈捻寧寗努勞奴弩怒擄櫓爐瑙盧老蘆虜路露駑魯鷺碌祿綠菉錄鹿論壟弄濃籠聾膿農惱牢磊腦賂雷尿壘屢樓淚漏累縷陋嫩訥杻紐勒肋凜凌稜綾能菱陵尼泥匿溺多茶�".split("");
  535. for(j = 0; j != D[210].length; ++j) if(D[210][j].charCodeAt(0) !== 0xFFFD) { e[D[210][j]] = 53760 + j; d[53760 + j] = D[210][j];}
  536. D[211] = "�����������������������������������������������������������������������������������������������������������������������������������������������������������������丹亶但單團壇彖斷旦檀段湍短端簞緞蛋袒鄲鍛撻澾獺疸達啖坍憺擔曇淡湛潭澹痰聃膽蕁覃談譚錟沓畓答踏遝唐堂塘幢戇撞棠當糖螳黨代垈坮大對岱帶待戴擡玳臺袋貸隊黛宅德悳倒刀到圖堵塗導屠島嶋度徒悼挑掉搗桃�".split("");
  537. for(j = 0; j != D[211].length; ++j) if(D[211][j].charCodeAt(0) !== 0xFFFD) { e[D[211][j]] = 54016 + j; d[54016 + j] = D[211][j];}
  538. D[212] = "�����������������������������������������������������������������������������������������������������������������������������������������������������������������棹櫂淘渡滔濤燾盜睹禱稻萄覩賭跳蹈逃途道都鍍陶韜毒瀆牘犢獨督禿篤纛讀墩惇敦旽暾沌焞燉豚頓乭突仝冬凍動同憧東桐棟洞潼疼瞳童胴董銅兜斗杜枓痘竇荳讀豆逗頭屯臀芚遁遯鈍得嶝橙燈登等藤謄鄧騰喇懶拏癩羅�".split("");
  539. for(j = 0; j != D[212].length; ++j) if(D[212][j].charCodeAt(0) !== 0xFFFD) { e[D[212][j]] = 54272 + j; d[54272 + j] = D[212][j];}
  540. D[213] = "�����������������������������������������������������������������������������������������������������������������������������������������������������������������蘿螺裸邏樂洛烙珞絡落諾酪駱丹亂卵欄欒瀾爛蘭鸞剌辣嵐擥攬欖濫籃纜藍襤覽拉臘蠟廊朗浪狼琅瑯螂郞來崍徠萊冷掠略亮倆兩凉梁樑粮粱糧良諒輛量侶儷勵呂廬慮戾旅櫚濾礪藜蠣閭驢驪麗黎力曆歷瀝礫轢靂憐戀攣漣�".split("");
  541. for(j = 0; j != D[213].length; ++j) if(D[213][j].charCodeAt(0) !== 0xFFFD) { e[D[213][j]] = 54528 + j; d[54528 + j] = D[213][j];}
  542. D[214] = "�����������������������������������������������������������������������������������������������������������������������������������������������������������������煉璉練聯蓮輦連鍊冽列劣洌烈裂廉斂殮濂簾獵令伶囹寧岺嶺怜玲笭羚翎聆逞鈴零靈領齡例澧禮醴隷勞怒撈擄櫓潞瀘爐盧老蘆虜路輅露魯鷺鹵碌祿綠菉錄鹿麓論壟弄朧瀧瓏籠聾儡瀨牢磊賂賚賴雷了僚寮廖料燎療瞭聊蓼�".split("");
  543. for(j = 0; j != D[214].length; ++j) if(D[214][j].charCodeAt(0) !== 0xFFFD) { e[D[214][j]] = 54784 + j; d[54784 + j] = D[214][j];}
  544. D[215] = "�����������������������������������������������������������������������������������������������������������������������������������������������������������������遼鬧龍壘婁屢樓淚漏瘻累縷蔞褸鏤陋劉旒柳榴流溜瀏琉瑠留瘤硫謬類六戮陸侖倫崙淪綸輪律慄栗率隆勒肋凜凌楞稜綾菱陵俚利厘吏唎履悧李梨浬犁狸理璃異痢籬罹羸莉裏裡里釐離鯉吝潾燐璘藺躪隣鱗麟林淋琳臨霖砬�".split("");
  545. for(j = 0; j != D[215].length; ++j) if(D[215][j].charCodeAt(0) !== 0xFFFD) { e[D[215][j]] = 55040 + j; d[55040 + j] = D[215][j];}
  546. D[216] = "�����������������������������������������������������������������������������������������������������������������������������������������������������������������立笠粒摩瑪痲碼磨馬魔麻寞幕漠膜莫邈万卍娩巒彎慢挽晩曼滿漫灣瞞萬蔓蠻輓饅鰻唜抹末沫茉襪靺亡妄忘忙望網罔芒茫莽輞邙埋妹媒寐昧枚梅每煤罵買賣邁魅脈貊陌驀麥孟氓猛盲盟萌冪覓免冕勉棉沔眄眠綿緬面麵滅�".split("");
  547. for(j = 0; j != D[216].length; ++j) if(D[216][j].charCodeAt(0) !== 0xFFFD) { e[D[216][j]] = 55296 + j; d[55296 + j] = D[216][j];}
  548. D[217] = "�����������������������������������������������������������������������������������������������������������������������������������������������������������������蔑冥名命明暝椧溟皿瞑茗蓂螟酩銘鳴袂侮冒募姆帽慕摸摹暮某模母毛牟牡瑁眸矛耗芼茅謀謨貌木沐牧目睦穆鶩歿沒夢朦蒙卯墓妙廟描昴杳渺猫竗苗錨務巫憮懋戊拇撫无楙武毋無珷畝繆舞茂蕪誣貿霧鵡墨默們刎吻問文�".split("");
  549. for(j = 0; j != D[217].length; ++j) if(D[217][j].charCodeAt(0) !== 0xFFFD) { e[D[217][j]] = 55552 + j; d[55552 + j] = D[217][j];}
  550. D[218] = "�����������������������������������������������������������������������������������������������������������������������������������������������������������������汶紊紋聞蚊門雯勿沕物味媚尾嵋彌微未梶楣渼湄眉米美薇謎迷靡黴岷悶愍憫敏旻旼民泯玟珉緡閔密蜜謐剝博拍搏撲朴樸泊珀璞箔粕縛膊舶薄迫雹駁伴半反叛拌搬攀斑槃泮潘班畔瘢盤盼磐磻礬絆般蟠返頒飯勃拔撥渤潑�".split("");
  551. for(j = 0; j != D[218].length; ++j) if(D[218][j].charCodeAt(0) !== 0xFFFD) { e[D[218][j]] = 55808 + j; d[55808 + j] = D[218][j];}
  552. D[219] = "�����������������������������������������������������������������������������������������������������������������������������������������������������������������發跋醱鉢髮魃倣傍坊妨尨幇彷房放方旁昉枋榜滂磅紡肪膀舫芳蒡蚌訪謗邦防龐倍俳北培徘拜排杯湃焙盃背胚裴裵褙賠輩配陪伯佰帛柏栢白百魄幡樊煩燔番磻繁蕃藩飜伐筏罰閥凡帆梵氾汎泛犯範范法琺僻劈壁擘檗璧癖�".split("");
  553. for(j = 0; j != D[219].length; ++j) if(D[219][j].charCodeAt(0) !== 0xFFFD) { e[D[219][j]] = 56064 + j; d[56064 + j] = D[219][j];}
  554. D[220] = "�����������������������������������������������������������������������������������������������������������������������������������������������������������������碧蘗闢霹便卞弁變辨辯邊別瞥鱉鼈丙倂兵屛幷昞昺柄棅炳甁病秉竝輧餠騈保堡報寶普步洑湺潽珤甫菩補褓譜輔伏僕匐卜宓復服福腹茯蔔複覆輹輻馥鰒本乶俸奉封峯峰捧棒烽熢琫縫蓬蜂逢鋒鳳不付俯傅剖副否咐埠夫婦�".split("");
  555. for(j = 0; j != D[220].length; ++j) if(D[220][j].charCodeAt(0) !== 0xFFFD) { e[D[220][j]] = 56320 + j; d[56320 + j] = D[220][j];}
  556. D[221] = "�����������������������������������������������������������������������������������������������������������������������������������������������������������������孚孵富府復扶敷斧浮溥父符簿缶腐腑膚艀芙莩訃負賦賻赴趺部釜阜附駙鳧北分吩噴墳奔奮忿憤扮昐汾焚盆粉糞紛芬賁雰不佛弗彿拂崩朋棚硼繃鵬丕備匕匪卑妃婢庇悲憊扉批斐枇榧比毖毗毘沸泌琵痺砒碑秕秘粃緋翡肥�".split("");
  557. for(j = 0; j != D[221].length; ++j) if(D[221][j].charCodeAt(0) !== 0xFFFD) { e[D[221][j]] = 56576 + j; d[56576 + j] = D[221][j];}
  558. D[222] = "�����������������������������������������������������������������������������������������������������������������������������������������������������������������脾臂菲蜚裨誹譬費鄙非飛鼻嚬嬪彬斌檳殯浜濱瀕牝玭貧賓頻憑氷聘騁乍事些仕伺似使俟僿史司唆嗣四士奢娑寫寺射巳師徙思捨斜斯柶査梭死沙泗渣瀉獅砂社祀祠私篩紗絲肆舍莎蓑蛇裟詐詞謝賜赦辭邪飼駟麝削數朔索�".split("");
  559. for(j = 0; j != D[222].length; ++j) if(D[222][j].charCodeAt(0) !== 0xFFFD) { e[D[222][j]] = 56832 + j; d[56832 + j] = D[222][j];}
  560. D[223] = "�����������������������������������������������������������������������������������������������������������������������������������������������������������������傘刪山散汕珊産疝算蒜酸霰乷撒殺煞薩三參杉森渗芟蔘衫揷澁鈒颯上傷像償商喪嘗孀尙峠常床庠廂想桑橡湘爽牀狀相祥箱翔裳觴詳象賞霜塞璽賽嗇塞穡索色牲生甥省笙墅壻嶼序庶徐恕抒捿敍暑曙書栖棲犀瑞筮絮緖署�".split("");
  561. for(j = 0; j != D[223].length; ++j) if(D[223][j].charCodeAt(0) !== 0xFFFD) { e[D[223][j]] = 57088 + j; d[57088 + j] = D[223][j];}
  562. D[224] = "�����������������������������������������������������������������������������������������������������������������������������������������������������������������胥舒薯西誓逝鋤黍鼠夕奭席惜昔晳析汐淅潟石碩蓆釋錫仙僊先善嬋宣扇敾旋渲煽琁瑄璇璿癬禪線繕羨腺膳船蘚蟬詵跣選銑鐥饍鮮卨屑楔泄洩渫舌薛褻設說雪齧剡暹殲纖蟾贍閃陝攝涉燮葉城姓宬性惺成星晟猩珹盛省筬�".split("");
  563. for(j = 0; j != D[224].length; ++j) if(D[224][j].charCodeAt(0) !== 0xFFFD) { e[D[224][j]] = 57344 + j; d[57344 + j] = D[224][j];}
  564. D[225] = "�����������������������������������������������������������������������������������������������������������������������������������������������������������������聖聲腥誠醒世勢歲洗稅笹細說貰召嘯塑宵小少巢所掃搔昭梳沼消溯瀟炤燒甦疏疎瘙笑篠簫素紹蔬蕭蘇訴逍遡邵銷韶騷俗屬束涑粟續謖贖速孫巽損蓀遜飡率宋悚松淞訟誦送頌刷殺灑碎鎖衰釗修受嗽囚垂壽嫂守岫峀帥愁�".split("");
  565. for(j = 0; j != D[225].length; ++j) if(D[225][j].charCodeAt(0) !== 0xFFFD) { e[D[225][j]] = 57600 + j; d[57600 + j] = D[225][j];}
  566. D[226] = "�����������������������������������������������������������������������������������������������������������������������������������������������������������������戍手授搜收數樹殊水洙漱燧狩獸琇璲瘦睡秀穗竪粹綏綬繡羞脩茱蒐蓚藪袖誰讐輸遂邃酬銖銹隋隧隨雖需須首髓鬚叔塾夙孰宿淑潚熟琡璹肅菽巡徇循恂旬栒楯橓殉洵淳珣盾瞬筍純脣舜荀蓴蕣詢諄醇錞順馴戌術述鉥崇崧�".split("");
  567. for(j = 0; j != D[226].length; ++j) if(D[226][j].charCodeAt(0) !== 0xFFFD) { e[D[226][j]] = 57856 + j; d[57856 + j] = D[226][j];}
  568. D[227] = "�����������������������������������������������������������������������������������������������������������������������������������������������������������������嵩瑟膝蝨濕拾習褶襲丞乘僧勝升承昇繩蠅陞侍匙嘶始媤尸屎屍市弑恃施是時枾柴猜矢示翅蒔蓍視試詩諡豕豺埴寔式息拭植殖湜熄篒蝕識軾食飾伸侁信呻娠宸愼新晨燼申神紳腎臣莘薪藎蜃訊身辛辰迅失室實悉審尋心沁�".split("");
  569. for(j = 0; j != D[227].length; ++j) if(D[227][j].charCodeAt(0) !== 0xFFFD) { e[D[227][j]] = 58112 + j; d[58112 + j] = D[227][j];}
  570. D[228] = "�����������������������������������������������������������������������������������������������������������������������������������������������������������������沈深瀋甚芯諶什十拾雙氏亞俄兒啞娥峨我牙芽莪蛾衙訝阿雅餓鴉鵝堊岳嶽幄惡愕握樂渥鄂鍔顎鰐齷安岸按晏案眼雁鞍顔鮟斡謁軋閼唵岩巖庵暗癌菴闇壓押狎鴨仰央怏昻殃秧鴦厓哀埃崖愛曖涯碍艾隘靄厄扼掖液縊腋額�".split("");
  571. for(j = 0; j != D[228].length; ++j) if(D[228][j].charCodeAt(0) !== 0xFFFD) { e[D[228][j]] = 58368 + j; d[58368 + j] = D[228][j];}
  572. D[229] = "�����������������������������������������������������������������������������������������������������������������������������������������������������������������櫻罌鶯鸚也倻冶夜惹揶椰爺耶若野弱掠略約若葯蒻藥躍亮佯兩凉壤孃恙揚攘敭暘梁楊樣洋瀁煬痒瘍禳穰糧羊良襄諒讓釀陽量養圄御於漁瘀禦語馭魚齬億憶抑檍臆偃堰彦焉言諺孼蘖俺儼嚴奄掩淹嶪業円予余勵呂女如廬�".split("");
  573. for(j = 0; j != D[229].length; ++j) if(D[229][j].charCodeAt(0) !== 0xFFFD) { e[D[229][j]] = 58624 + j; d[58624 + j] = D[229][j];}
  574. D[230] = "�����������������������������������������������������������������������������������������������������������������������������������������������������������������旅歟汝濾璵礖礪與艅茹輿轝閭餘驪麗黎亦力域役易曆歷疫繹譯轢逆驛嚥堧姸娟宴年延憐戀捐挻撚椽沇沿涎涓淵演漣烟然煙煉燃燕璉硏硯秊筵緣練縯聯衍軟輦蓮連鉛鍊鳶列劣咽悅涅烈熱裂說閱厭廉念捻染殮炎焰琰艶苒�".split("");
  575. for(j = 0; j != D[230].length; ++j) if(D[230][j].charCodeAt(0) !== 0xFFFD) { e[D[230][j]] = 58880 + j; d[58880 + j] = D[230][j];}
  576. D[231] = "�����������������������������������������������������������������������������������������������������������������������������������������������������������������簾閻髥鹽曄獵燁葉令囹塋寧嶺嶸影怜映暎楹榮永泳渶潁濚瀛瀯煐營獰玲瑛瑩瓔盈穎纓羚聆英詠迎鈴鍈零霙靈領乂倪例刈叡曳汭濊猊睿穢芮藝蘂禮裔詣譽豫醴銳隸霓預五伍俉傲午吾吳嗚塢墺奧娛寤悟惡懊敖旿晤梧汚澳�".split("");
  577. for(j = 0; j != D[231].length; ++j) if(D[231][j].charCodeAt(0) !== 0xFFFD) { e[D[231][j]] = 59136 + j; d[59136 + j] = D[231][j];}
  578. D[232] = "�����������������������������������������������������������������������������������������������������������������������������������������������������������������烏熬獒筽蜈誤鰲鼇屋沃獄玉鈺溫瑥瘟穩縕蘊兀壅擁瓮甕癰翁邕雍饔渦瓦窩窪臥蛙蝸訛婉完宛梡椀浣玩琓琬碗緩翫脘腕莞豌阮頑曰往旺枉汪王倭娃歪矮外嵬巍猥畏了僚僥凹堯夭妖姚寥寮尿嶢拗搖撓擾料曜樂橈燎燿瑤療�".split("");
  579. for(j = 0; j != D[232].length; ++j) if(D[232][j].charCodeAt(0) !== 0xFFFD) { e[D[232][j]] = 59392 + j; d[59392 + j] = D[232][j];}
  580. D[233] = "�����������������������������������������������������������������������������������������������������������������������������������������������������������������窈窯繇繞耀腰蓼蟯要謠遙遼邀饒慾欲浴縟褥辱俑傭冗勇埇墉容庸慂榕涌湧溶熔瑢用甬聳茸蓉踊鎔鏞龍于佑偶優又友右宇寓尤愚憂旴牛玗瑀盂祐禑禹紆羽芋藕虞迂遇郵釪隅雨雩勖彧旭昱栯煜稶郁頊云暈橒殞澐熉耘芸蕓�".split("");
  581. for(j = 0; j != D[233].length; ++j) if(D[233][j].charCodeAt(0) !== 0xFFFD) { e[D[233][j]] = 59648 + j; d[59648 + j] = D[233][j];}
  582. D[234] = "�����������������������������������������������������������������������������������������������������������������������������������������������������������������運隕雲韻蔚鬱亐熊雄元原員圓園垣媛嫄寃怨愿援沅洹湲源爰猿瑗苑袁轅遠阮院願鴛月越鉞位偉僞危圍委威尉慰暐渭爲瑋緯胃萎葦蔿蝟衛褘謂違韋魏乳侑儒兪劉唯喩孺宥幼幽庾悠惟愈愉揄攸有杻柔柚柳楡楢油洧流游溜�".split("");
  583. for(j = 0; j != D[234].length; ++j) if(D[234][j].charCodeAt(0) !== 0xFFFD) { e[D[234][j]] = 59904 + j; d[59904 + j] = D[234][j];}
  584. D[235] = "�����������������������������������������������������������������������������������������������������������������������������������������������������������������濡猶猷琉瑜由留癒硫紐維臾萸裕誘諛諭踰蹂遊逾遺酉釉鍮類六堉戮毓肉育陸倫允奫尹崙淪潤玧胤贇輪鈗閏律慄栗率聿戎瀜絨融隆垠恩慇殷誾銀隱乙吟淫蔭陰音飮揖泣邑凝應膺鷹依倚儀宜意懿擬椅毅疑矣義艤薏蟻衣誼�".split("");
  585. for(j = 0; j != D[235].length; ++j) if(D[235][j].charCodeAt(0) !== 0xFFFD) { e[D[235][j]] = 60160 + j; d[60160 + j] = D[235][j];}
  586. D[236] = "�����������������������������������������������������������������������������������������������������������������������������������������������������������������議醫二以伊利吏夷姨履已弛彛怡易李梨泥爾珥理異痍痢移罹而耳肄苡荑裏裡貽貳邇里離飴餌匿溺瀷益翊翌翼謚人仁刃印吝咽因姻寅引忍湮燐璘絪茵藺蚓認隣靭靷鱗麟一佚佾壹日溢逸鎰馹任壬妊姙恁林淋稔臨荏賃入卄�".split("");
  587. for(j = 0; j != D[236].length; ++j) if(D[236][j].charCodeAt(0) !== 0xFFFD) { e[D[236][j]] = 60416 + j; d[60416 + j] = D[236][j];}
  588. D[237] = "�����������������������������������������������������������������������������������������������������������������������������������������������������������������立笠粒仍剩孕芿仔刺咨姉姿子字孜恣慈滋炙煮玆瓷疵磁紫者自茨蔗藉諮資雌作勺嚼斫昨灼炸爵綽芍酌雀鵲孱棧殘潺盞岑暫潛箴簪蠶雜丈仗匠場墻壯奬將帳庄張掌暲杖樟檣欌漿牆狀獐璋章粧腸臟臧莊葬蔣薔藏裝贓醬長�".split("");
  589. for(j = 0; j != D[237].length; ++j) if(D[237][j].charCodeAt(0) !== 0xFFFD) { e[D[237][j]] = 60672 + j; d[60672 + j] = D[237][j];}
  590. D[238] = "�����������������������������������������������������������������������������������������������������������������������������������������������������������������障再哉在宰才材栽梓渽滓災縡裁財載齋齎爭箏諍錚佇低儲咀姐底抵杵楮樗沮渚狙猪疽箸紵苧菹著藷詛貯躇這邸雎齟勣吊嫡寂摘敵滴狄炙的積笛籍績翟荻謫賊赤跡蹟迪迹適鏑佃佺傳全典前剪塡塼奠專展廛悛戰栓殿氈澱�".split("");
  591. for(j = 0; j != D[238].length; ++j) if(D[238][j].charCodeAt(0) !== 0xFFFD) { e[D[238][j]] = 60928 + j; d[60928 + j] = D[238][j];}
  592. D[239] = "�����������������������������������������������������������������������������������������������������������������������������������������������������������������煎琠田甸畑癲筌箋箭篆纏詮輾轉鈿銓錢鐫電顚顫餞切截折浙癤竊節絶占岾店漸点粘霑鮎點接摺蝶丁井亭停偵呈姃定幀庭廷征情挺政整旌晶晸柾楨檉正汀淀淨渟湞瀞炡玎珽町睛碇禎程穽精綎艇訂諪貞鄭酊釘鉦鋌錠霆靖�".split("");
  593. for(j = 0; j != D[239].length; ++j) if(D[239][j].charCodeAt(0) !== 0xFFFD) { e[D[239][j]] = 61184 + j; d[61184 + j] = D[239][j];}
  594. D[240] = "�����������������������������������������������������������������������������������������������������������������������������������������������������������������靜頂鼎制劑啼堤帝弟悌提梯濟祭第臍薺製諸蹄醍除際霽題齊俎兆凋助嘲弔彫措操早晁曺曹朝條棗槽漕潮照燥爪璪眺祖祚租稠窕粗糟組繰肇藻蚤詔調趙躁造遭釣阻雕鳥族簇足鏃存尊卒拙猝倧宗從悰慫棕淙琮種終綜縱腫�".split("");
  595. for(j = 0; j != D[240].length; ++j) if(D[240][j].charCodeAt(0) !== 0xFFFD) { e[D[240][j]] = 61440 + j; d[61440 + j] = D[240][j];}
  596. D[241] = "�����������������������������������������������������������������������������������������������������������������������������������������������������������������踪踵鍾鐘佐坐左座挫罪主住侏做姝胄呪周嗾奏宙州廚晝朱柱株注洲湊澍炷珠疇籌紂紬綢舟蛛註誅走躊輳週酎酒鑄駐竹粥俊儁准埈寯峻晙樽浚準濬焌畯竣蠢逡遵雋駿茁中仲衆重卽櫛楫汁葺增憎曾拯烝甑症繒蒸證贈之只�".split("");
  597. for(j = 0; j != D[241].length; ++j) if(D[241][j].charCodeAt(0) !== 0xFFFD) { e[D[241][j]] = 61696 + j; d[61696 + j] = D[241][j];}
  598. D[242] = "�����������������������������������������������������������������������������������������������������������������������������������������������������������������咫地址志持指摯支旨智枝枳止池沚漬知砥祉祗紙肢脂至芝芷蜘誌識贄趾遲直稙稷織職唇嗔塵振搢晉晋桭榛殄津溱珍瑨璡畛疹盡眞瞋秦縉縝臻蔯袗診賑軫辰進鎭陣陳震侄叱姪嫉帙桎瓆疾秩窒膣蛭質跌迭斟朕什執潗緝輯�".split("");
  599. for(j = 0; j != D[242].length; ++j) if(D[242][j].charCodeAt(0) !== 0xFFFD) { e[D[242][j]] = 61952 + j; d[61952 + j] = D[242][j];}
  600. D[243] = "�����������������������������������������������������������������������������������������������������������������������������������������������������������������鏶集徵懲澄且侘借叉嗟嵯差次此磋箚茶蹉車遮捉搾着窄錯鑿齪撰澯燦璨瓚竄簒纂粲纘讚贊鑽餐饌刹察擦札紮僭參塹慘慙懺斬站讒讖倉倡創唱娼廠彰愴敞昌昶暢槍滄漲猖瘡窓脹艙菖蒼債埰寀寨彩採砦綵菜蔡采釵冊柵策�".split("");
  601. for(j = 0; j != D[243].length; ++j) if(D[243][j].charCodeAt(0) !== 0xFFFD) { e[D[243][j]] = 62208 + j; d[62208 + j] = D[243][j];}
  602. D[244] = "�����������������������������������������������������������������������������������������������������������������������������������������������������������������責凄妻悽處倜刺剔尺慽戚拓擲斥滌瘠脊蹠陟隻仟千喘天川擅泉淺玔穿舛薦賤踐遷釧闡阡韆凸哲喆徹撤澈綴輟轍鐵僉尖沾添甛瞻簽籤詹諂堞妾帖捷牒疊睫諜貼輒廳晴淸聽菁請靑鯖切剃替涕滯締諦逮遞體初剿哨憔抄招梢�".split("");
  603. for(j = 0; j != D[244].length; ++j) if(D[244][j].charCodeAt(0) !== 0xFFFD) { e[D[244][j]] = 62464 + j; d[62464 + j] = D[244][j];}
  604. D[245] = "�����������������������������������������������������������������������������������������������������������������������������������������������������������������椒楚樵炒焦硝礁礎秒稍肖艸苕草蕉貂超酢醋醮促囑燭矗蜀觸寸忖村邨叢塚寵悤憁摠總聰蔥銃撮催崔最墜抽推椎楸樞湫皺秋芻萩諏趨追鄒酋醜錐錘鎚雛騶鰍丑畜祝竺筑築縮蓄蹙蹴軸逐春椿瑃出朮黜充忠沖蟲衝衷悴膵萃�".split("");
  605. for(j = 0; j != D[245].length; ++j) if(D[245][j].charCodeAt(0) !== 0xFFFD) { e[D[245][j]] = 62720 + j; d[62720 + j] = D[245][j];}
  606. D[246] = "�����������������������������������������������������������������������������������������������������������������������������������������������������������������贅取吹嘴娶就炊翠聚脆臭趣醉驟鷲側仄厠惻測層侈値嗤峙幟恥梔治淄熾痔痴癡稚穉緇緻置致蚩輜雉馳齒則勅飭親七柒漆侵寢枕沈浸琛砧針鍼蟄秤稱快他咤唾墮妥惰打拖朶楕舵陀馱駝倬卓啄坼度托拓擢晫柝濁濯琢琸託�".split("");
  607. for(j = 0; j != D[246].length; ++j) if(D[246][j].charCodeAt(0) !== 0xFFFD) { e[D[246][j]] = 62976 + j; d[62976 + j] = D[246][j];}
  608. D[247] = "�����������������������������������������������������������������������������������������������������������������������������������������������������������������鐸呑嘆坦彈憚歎灘炭綻誕奪脫探眈耽貪塔搭榻宕帑湯糖蕩兌台太怠態殆汰泰笞胎苔跆邰颱宅擇澤撑攄兎吐土討慟桶洞痛筒統通堆槌腿褪退頹偸套妬投透鬪慝特闖坡婆巴把播擺杷波派爬琶破罷芭跛頗判坂板版瓣販辦鈑�".split("");
  609. for(j = 0; j != D[247].length; ++j) if(D[247][j].charCodeAt(0) !== 0xFFFD) { e[D[247][j]] = 63232 + j; d[63232 + j] = D[247][j];}
  610. D[248] = "�����������������������������������������������������������������������������������������������������������������������������������������������������������������阪八叭捌佩唄悖敗沛浿牌狽稗覇貝彭澎烹膨愎便偏扁片篇編翩遍鞭騙貶坪平枰萍評吠嬖幣廢弊斃肺蔽閉陛佈包匍匏咆哺圃布怖抛抱捕暴泡浦疱砲胞脯苞葡蒲袍褒逋鋪飽鮑幅暴曝瀑爆輻俵剽彪慓杓標漂瓢票表豹飇飄驃�".split("");
  611. for(j = 0; j != D[248].length; ++j) if(D[248][j].charCodeAt(0) !== 0xFFFD) { e[D[248][j]] = 63488 + j; d[63488 + j] = D[248][j];}
  612. D[249] = "�����������������������������������������������������������������������������������������������������������������������������������������������������������������品稟楓諷豊風馮彼披疲皮被避陂匹弼必泌珌畢疋筆苾馝乏逼下何厦夏廈昰河瑕荷蝦賀遐霞鰕壑學虐謔鶴寒恨悍旱汗漢澣瀚罕翰閑閒限韓割轄函含咸啣喊檻涵緘艦銜陷鹹合哈盒蛤閤闔陜亢伉姮嫦巷恒抗杭桁沆港缸肛航�".split("");
  613. for(j = 0; j != D[249].length; ++j) if(D[249][j].charCodeAt(0) !== 0xFFFD) { e[D[249][j]] = 63744 + j; d[63744 + j] = D[249][j];}
  614. D[250] = "�����������������������������������������������������������������������������������������������������������������������������������������������������������������行降項亥偕咳垓奚孩害懈楷海瀣蟹解該諧邂駭骸劾核倖幸杏荇行享向嚮珦鄕響餉饗香噓墟虛許憲櫶獻軒歇險驗奕爀赫革俔峴弦懸晛泫炫玄玹現眩睍絃絢縣舷衒見賢鉉顯孑穴血頁嫌俠協夾峽挾浹狹脅脇莢鋏頰亨兄刑型�".split("");
  615. for(j = 0; j != D[250].length; ++j) if(D[250][j].charCodeAt(0) !== 0xFFFD) { e[D[250][j]] = 64000 + j; d[64000 + j] = D[250][j];}
  616. D[251] = "�����������������������������������������������������������������������������������������������������������������������������������������������������������������形泂滎瀅灐炯熒珩瑩荊螢衡逈邢鎣馨兮彗惠慧暳蕙蹊醯鞋乎互呼壕壺好岵弧戶扈昊晧毫浩淏湖滸澔濠濩灝狐琥瑚瓠皓祜糊縞胡芦葫蒿虎號蝴護豪鎬頀顥惑或酷婚昏混渾琿魂忽惚笏哄弘汞泓洪烘紅虹訌鴻化和嬅樺火畵�".split("");
  617. for(j = 0; j != D[251].length; ++j) if(D[251][j].charCodeAt(0) !== 0xFFFD) { e[D[251][j]] = 64256 + j; d[64256 + j] = D[251][j];}
  618. D[252] = "�����������������������������������������������������������������������������������������������������������������������������������������������������������������禍禾花華話譁貨靴廓擴攫確碻穫丸喚奐宦幻患換歡晥桓渙煥環紈還驩鰥活滑猾豁闊凰幌徨恍惶愰慌晃晄榥況湟滉潢煌璜皇篁簧荒蝗遑隍黃匯回廻徊恢悔懷晦會檜淮澮灰獪繪膾茴蛔誨賄劃獲宖橫鐄哮嚆孝效斅曉梟涍淆�".split("");
  619. for(j = 0; j != D[252].length; ++j) if(D[252][j].charCodeAt(0) !== 0xFFFD) { e[D[252][j]] = 64512 + j; d[64512 + j] = D[252][j];}
  620. D[253] = "�����������������������������������������������������������������������������������������������������������������������������������������������������������������爻肴酵驍侯候厚后吼喉嗅帿後朽煦珝逅勛勳塤壎焄熏燻薰訓暈薨喧暄煊萱卉喙毁彙徽揮暉煇諱輝麾休携烋畦虧恤譎鷸兇凶匈洶胸黑昕欣炘痕吃屹紇訖欠欽歆吸恰洽翕興僖凞喜噫囍姬嬉希憙憘戱晞曦熙熹熺犧禧稀羲詰�".split("");
  621. for(j = 0; j != D[253].length; ++j) if(D[253][j].charCodeAt(0) !== 0xFFFD) { e[D[253][j]] = 64768 + j; d[64768 + j] = D[253][j];}
  622. return {"enc": e, "dec": d }; })();
  623. cptable[950] = (function(){ var d = [], e = {}, D = [], j;
  624. D[0] = "\u0000\u0001\u0002\u0003\u0004\u0005\u0006\u0007\b\t\n\u000b\f\r\u000e\u000f\u0010\u0011\u0012\u0013\u0014\u0015\u0016\u0017\u0018\u0019\u001a\u001b\u001c\u001d\u001e\u001f !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~��������������������������������������������������������������������������������������������������������������������������������".split("");
  625. for(j = 0; j != D[0].length; ++j) if(D[0][j].charCodeAt(0) !== 0xFFFD) { e[D[0][j]] = 0 + j; d[0 + j] = D[0][j];}
  626. D[161] = "���������������������������������������������������������������� ,、。.‧;:?!︰…‥﹐﹑﹒·﹔﹕﹖﹗|–︱—︳╴︴﹏()︵︶{}︷︸〔〕︹︺【】︻︼《》︽︾〈〉︿﹀「」﹁﹂『』﹃﹄﹙﹚����������������������������������﹛﹜﹝﹞‘’“”〝〞‵′#&*※§〃○●△▲◎☆★◇◆□■▽▼㊣℅¯ ̄_ˍ﹉﹊﹍﹎﹋﹌﹟﹠﹡+-×÷±√<>=≦≧≠∞≒≡﹢﹣﹤﹥﹦~∩∪⊥∠∟⊿㏒㏑∫∮∵∴♀♂⊕⊙↑↓←→↖↗↙↘∥∣/�".split("");
  627. for(j = 0; j != D[161].length; ++j) if(D[161][j].charCodeAt(0) !== 0xFFFD) { e[D[161][j]] = 41216 + j; d[41216 + j] = D[161][j];}
  628. D[162] = "����������������������������������������������������������������\∕﹨$¥〒¢£%@℃℉﹩﹪﹫㏕㎜㎝㎞㏎㎡㎎㎏㏄°兙兛兞兝兡兣嗧瓩糎▁▂▃▄▅▆▇█▏▎▍▌▋▊▉┼┴┬┤├▔─│▕┌┐└┘╭����������������������������������╮╰╯═╞╪╡◢◣◥◤╱╲╳0123456789ⅠⅡⅢⅣⅤⅥⅦⅧⅨⅩ〡〢〣〤〥〦〧〨〩十卄卅ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuv�".split("");
  629. for(j = 0; j != D[162].length; ++j) if(D[162][j].charCodeAt(0) !== 0xFFFD) { e[D[162][j]] = 41472 + j; d[41472 + j] = D[162][j];}
  630. D[163] = "����������������������������������������������������������������wxyzΑΒΓΔΕΖΗΘΙΚΛΜΝΞΟΠΡΣΤΥΦΧΨΩαβγδεζηθικλμνξοπρστυφχψωㄅㄆㄇㄈㄉㄊㄋㄌㄍㄎㄏ����������������������������������ㄐㄑㄒㄓㄔㄕㄖㄗㄘㄙㄚㄛㄜㄝㄞㄟㄠㄡㄢㄣㄤㄥㄦㄧㄨㄩ˙ˉˊˇˋ���������������������������������€������������������������������".split("");
  631. for(j = 0; j != D[163].length; ++j) if(D[163][j].charCodeAt(0) !== 0xFFFD) { e[D[163][j]] = 41728 + j; d[41728 + j] = D[163][j];}
  632. D[164] = "����������������������������������������������������������������一乙丁七乃九了二人儿入八几刀刁力匕十卜又三下丈上丫丸凡久么也乞于亡兀刃勺千叉口土士夕大女子孑孓寸小尢尸山川工己已巳巾干廾弋弓才����������������������������������丑丐不中丰丹之尹予云井互五亢仁什仃仆仇仍今介仄元允內六兮公冗凶分切刈勻勾勿化匹午升卅卞厄友及反壬天夫太夭孔少尤尺屯巴幻廿弔引心戈戶手扎支文斗斤方日曰月木欠止歹毋比毛氏水火爪父爻片牙牛犬王丙�".split("");
  633. for(j = 0; j != D[164].length; ++j) if(D[164][j].charCodeAt(0) !== 0xFFFD) { e[D[164][j]] = 41984 + j; d[41984 + j] = D[164][j];}
  634. D[165] = "����������������������������������������������������������������世丕且丘主乍乏乎以付仔仕他仗代令仙仞充兄冉冊冬凹出凸刊加功包匆北匝仟半卉卡占卯卮去可古右召叮叩叨叼司叵叫另只史叱台句叭叻四囚外����������������������������������央失奴奶孕它尼巨巧左市布平幼弁弘弗必戊打扔扒扑斥旦朮本未末札正母民氐永汁汀氾犯玄玉瓜瓦甘生用甩田由甲申疋白皮皿目矛矢石示禾穴立丞丟乒乓乩亙交亦亥仿伉伙伊伕伍伐休伏仲件任仰仳份企伋光兇兆先全�".split("");
  635. for(j = 0; j != D[165].length; ++j) if(D[165][j].charCodeAt(0) !== 0xFFFD) { e[D[165][j]] = 42240 + j; d[42240 + j] = D[165][j];}
  636. D[166] = "����������������������������������������������������������������共再冰列刑划刎刖劣匈匡匠印危吉吏同吊吐吁吋各向名合吃后吆吒因回囝圳地在圭圬圯圩夙多夷夸妄奸妃好她如妁字存宇守宅安寺尖屹州帆并年����������������������������������式弛忙忖戎戌戍成扣扛托收早旨旬旭曲曳有朽朴朱朵次此死氖汝汗汙江池汐汕污汛汍汎灰牟牝百竹米糸缶羊羽老考而耒耳聿肉肋肌臣自至臼舌舛舟艮色艾虫血行衣西阡串亨位住佇佗佞伴佛何估佐佑伽伺伸佃佔似但佣�".split("");
  637. for(j = 0; j != D[166].length; ++j) if(D[166][j].charCodeAt(0) !== 0xFFFD) { e[D[166][j]] = 42496 + j; d[42496 + j] = D[166][j];}
  638. D[167] = "����������������������������������������������������������������作你伯低伶余佝佈佚兌克免兵冶冷別判利刪刨劫助努劬匣即卵吝吭吞吾否呎吧呆呃吳呈呂君吩告吹吻吸吮吵吶吠吼呀吱含吟听囪困囤囫坊坑址坍����������������������������������均坎圾坐坏圻壯夾妝妒妨妞妣妙妖妍妤妓妊妥孝孜孚孛完宋宏尬局屁尿尾岐岑岔岌巫希序庇床廷弄弟彤形彷役忘忌志忍忱快忸忪戒我抄抗抖技扶抉扭把扼找批扳抒扯折扮投抓抑抆改攻攸旱更束李杏材村杜杖杞杉杆杠�".split("");
  639. for(j = 0; j != D[167].length; ++j) if(D[167][j].charCodeAt(0) !== 0xFFFD) { e[D[167][j]] = 42752 + j; d[42752 + j] = D[167][j];}
  640. D[168] = "����������������������������������������������������������������杓杗步每求汞沙沁沈沉沅沛汪決沐汰沌汨沖沒汽沃汲汾汴沆汶沍沔沘沂灶灼災灸牢牡牠狄狂玖甬甫男甸皂盯矣私秀禿究系罕肖肓肝肘肛肚育良芒����������������������������������芋芍見角言谷豆豕貝赤走足身車辛辰迂迆迅迄巡邑邢邪邦那酉釆里防阮阱阪阬並乖乳事些亞享京佯依侍佳使佬供例來侃佰併侈佩佻侖佾侏侑佺兔兒兕兩具其典冽函刻券刷刺到刮制剁劾劻卒協卓卑卦卷卸卹取叔受味呵�".split("");
  641. for(j = 0; j != D[168].length; ++j) if(D[168][j].charCodeAt(0) !== 0xFFFD) { e[D[168][j]] = 43008 + j; d[43008 + j] = D[168][j];}
  642. D[169] = "����������������������������������������������������������������咖呸咕咀呻呷咄咒咆呼咐呱呶和咚呢周咋命咎固垃坷坪坩坡坦坤坼夜奉奇奈奄奔妾妻委妹妮姑姆姐姍始姓姊妯妳姒姅孟孤季宗定官宜宙宛尚屈居����������������������������������屆岷岡岸岩岫岱岳帘帚帖帕帛帑幸庚店府底庖延弦弧弩往征彿彼忝忠忽念忿怏怔怯怵怖怪怕怡性怩怫怛或戕房戾所承拉拌拄抿拂抹拒招披拓拔拋拈抨抽押拐拙拇拍抵拚抱拘拖拗拆抬拎放斧於旺昔易昌昆昂明昀昏昕昊�".split("");
  643. for(j = 0; j != D[169].length; ++j) if(D[169][j].charCodeAt(0) !== 0xFFFD) { e[D[169][j]] = 43264 + j; d[43264 + j] = D[169][j];}
  644. D[170] = "����������������������������������������������������������������昇服朋杭枋枕東果杳杷枇枝林杯杰板枉松析杵枚枓杼杪杲欣武歧歿氓氛泣注泳沱泌泥河沽沾沼波沫法泓沸泄油況沮泗泅泱沿治泡泛泊沬泯泜泖泠����������������������������������炕炎炒炊炙爬爭爸版牧物狀狎狙狗狐玩玨玟玫玥甽疝疙疚的盂盲直知矽社祀祁秉秈空穹竺糾罔羌羋者肺肥肢肱股肫肩肴肪肯臥臾舍芳芝芙芭芽芟芹花芬芥芯芸芣芰芾芷虎虱初表軋迎返近邵邸邱邶采金長門阜陀阿阻附�".split("");
  645. for(j = 0; j != D[170].length; ++j) if(D[170][j].charCodeAt(0) !== 0xFFFD) { e[D[170][j]] = 43520 + j; d[43520 + j] = D[170][j];}
  646. D[171] = "����������������������������������������������������������������陂隹雨青非亟亭亮信侵侯便俠俑俏保促侶俘俟俊俗侮俐俄係俚俎俞侷兗冒冑冠剎剃削前剌剋則勇勉勃勁匍南卻厚叛咬哀咨哎哉咸咦咳哇哂咽咪品����������������������������������哄哈咯咫咱咻咩咧咿囿垂型垠垣垢城垮垓奕契奏奎奐姜姘姿姣姨娃姥姪姚姦威姻孩宣宦室客宥封屎屏屍屋峙峒巷帝帥帟幽庠度建弈弭彥很待徊律徇後徉怒思怠急怎怨恍恰恨恢恆恃恬恫恪恤扁拜挖按拼拭持拮拽指拱拷�".split("");
  647. for(j = 0; j != D[171].length; ++j) if(D[171][j].charCodeAt(0) !== 0xFFFD) { e[D[171][j]] = 43776 + j; d[43776 + j] = D[171][j];}
  648. D[172] = "����������������������������������������������������������������拯括拾拴挑挂政故斫施既春昭映昧是星昨昱昤曷柿染柱柔某柬架枯柵柩柯柄柑枴柚查枸柏柞柳枰柙柢柝柒歪殃殆段毒毗氟泉洋洲洪流津洌洱洞洗����������������������������������活洽派洶洛泵洹洧洸洩洮洵洎洫炫為炳炬炯炭炸炮炤爰牲牯牴狩狠狡玷珊玻玲珍珀玳甚甭畏界畎畋疫疤疥疢疣癸皆皇皈盈盆盃盅省盹相眉看盾盼眇矜砂研砌砍祆祉祈祇禹禺科秒秋穿突竿竽籽紂紅紀紉紇約紆缸美羿耄�".split("");
  649. for(j = 0; j != D[172].length; ++j) if(D[172][j].charCodeAt(0) !== 0xFFFD) { e[D[172][j]] = 44032 + j; d[44032 + j] = D[172][j];}
  650. D[173] = "����������������������������������������������������������������耐耍耑耶胖胥胚胃胄背胡胛胎胞胤胝致舢苧范茅苣苛苦茄若茂茉苒苗英茁苜苔苑苞苓苟苯茆虐虹虻虺衍衫要觔計訂訃貞負赴赳趴軍軌述迦迢迪迥����������������������������������迭迫迤迨郊郎郁郃酋酊重閂限陋陌降面革韋韭音頁風飛食首香乘亳倌倍倣俯倦倥俸倩倖倆值借倚倒們俺倀倔倨俱倡個候倘俳修倭倪俾倫倉兼冤冥冢凍凌准凋剖剜剔剛剝匪卿原厝叟哨唐唁唷哼哥哲唆哺唔哩哭員唉哮哪�".split("");
  651. for(j = 0; j != D[173].length; ++j) if(D[173][j].charCodeAt(0) !== 0xFFFD) { e[D[173][j]] = 44288 + j; d[44288 + j] = D[173][j];}
  652. D[174] = "����������������������������������������������������������������哦唧唇哽唏圃圄埂埔埋埃堉夏套奘奚娑娘娜娟娛娓姬娠娣娩娥娌娉孫屘宰害家宴宮宵容宸射屑展屐峭峽峻峪峨峰島崁峴差席師庫庭座弱徒徑徐恙����������������������������������恣恥恐恕恭恩息悄悟悚悍悔悌悅悖扇拳挈拿捎挾振捕捂捆捏捉挺捐挽挪挫挨捍捌效敉料旁旅時晉晏晃晒晌晅晁書朔朕朗校核案框桓根桂桔栩梳栗桌桑栽柴桐桀格桃株桅栓栘桁殊殉殷氣氧氨氦氤泰浪涕消涇浦浸海浙涓�".split("");
  653. for(j = 0; j != D[174].length; ++j) if(D[174][j].charCodeAt(0) !== 0xFFFD) { e[D[174][j]] = 44544 + j; d[44544 + j] = D[174][j];}
  654. D[175] = "����������������������������������������������������������������浬涉浮浚浴浩涌涊浹涅浥涔烊烘烤烙烈烏爹特狼狹狽狸狷玆班琉珮珠珪珞畔畝畜畚留疾病症疲疳疽疼疹痂疸皋皰益盍盎眩真眠眨矩砰砧砸砝破砷����������������������������������砥砭砠砟砲祕祐祠祟祖神祝祗祚秤秣秧租秦秩秘窄窈站笆笑粉紡紗紋紊素索純紐紕級紜納紙紛缺罟羔翅翁耆耘耕耙耗耽耿胱脂胰脅胭胴脆胸胳脈能脊胼胯臭臬舀舐航舫舨般芻茫荒荔荊茸荐草茵茴荏茲茹茶茗荀茱茨荃�".split("");
  655. for(j = 0; j != D[175].length; ++j) if(D[175][j].charCodeAt(0) !== 0xFFFD) { e[D[175][j]] = 44800 + j; d[44800 + j] = D[175][j];}
  656. D[176] = "����������������������������������������������������������������虔蚊蚪蚓蚤蚩蚌蚣蚜衰衷袁袂衽衹記訐討訌訕訊託訓訖訏訑豈豺豹財貢起躬軒軔軏辱送逆迷退迺迴逃追逅迸邕郡郝郢酒配酌釘針釗釜釙閃院陣陡����������������������������������陛陝除陘陞隻飢馬骨高鬥鬲鬼乾偺偽停假偃偌做偉健偶偎偕偵側偷偏倏偯偭兜冕凰剪副勒務勘動匐匏匙匿區匾參曼商啪啦啄啞啡啃啊唱啖問啕唯啤唸售啜唬啣唳啁啗圈國圉域堅堊堆埠埤基堂堵執培夠奢娶婁婉婦婪婀�".split("");
  657. for(j = 0; j != D[176].length; ++j) if(D[176][j].charCodeAt(0) !== 0xFFFD) { e[D[176][j]] = 45056 + j; d[45056 + j] = D[176][j];}
  658. D[177] = "����������������������������������������������������������������娼婢婚婆婊孰寇寅寄寂宿密尉專將屠屜屝崇崆崎崛崖崢崑崩崔崙崤崧崗巢常帶帳帷康庸庶庵庾張強彗彬彩彫得徙從徘御徠徜恿患悉悠您惋悴惦悽����������������������������������情悻悵惜悼惘惕惆惟悸惚惇戚戛扈掠控捲掖探接捷捧掘措捱掩掉掃掛捫推掄授掙採掬排掏掀捻捩捨捺敝敖救教敗啟敏敘敕敔斜斛斬族旋旌旎晝晚晤晨晦晞曹勗望梁梯梢梓梵桿桶梱梧梗械梃棄梭梆梅梔條梨梟梡梂欲殺�".split("");
  659. for(j = 0; j != D[177].length; ++j) if(D[177][j].charCodeAt(0) !== 0xFFFD) { e[D[177][j]] = 45312 + j; d[45312 + j] = D[177][j];}
  660. D[178] = "����������������������������������������������������������������毫毬氫涎涼淳淙液淡淌淤添淺清淇淋涯淑涮淞淹涸混淵淅淒渚涵淚淫淘淪深淮淨淆淄涪淬涿淦烹焉焊烽烯爽牽犁猜猛猖猓猙率琅琊球理現琍瓠瓶����������������������������������瓷甜產略畦畢異疏痔痕疵痊痍皎盔盒盛眷眾眼眶眸眺硫硃硎祥票祭移窒窕笠笨笛第符笙笞笮粒粗粕絆絃統紮紹紼絀細紳組累終紲紱缽羞羚翌翎習耜聊聆脯脖脣脫脩脰脤舂舵舷舶船莎莞莘荸莢莖莽莫莒莊莓莉莠荷荻荼�".split("");
  661. for(j = 0; j != D[178].length; ++j) if(D[178][j].charCodeAt(0) !== 0xFFFD) { e[D[178][j]] = 45568 + j; d[45568 + j] = D[178][j];}
  662. D[179] = "����������������������������������������������������������������莆莧處彪蛇蛀蚶蛄蚵蛆蛋蚱蚯蛉術袞袈被袒袖袍袋覓規訪訝訣訥許設訟訛訢豉豚販責貫貨貪貧赧赦趾趺軛軟這逍通逗連速逝逐逕逞造透逢逖逛途����������������������������������部郭都酗野釵釦釣釧釭釩閉陪陵陳陸陰陴陶陷陬雀雪雩章竟頂頃魚鳥鹵鹿麥麻傢傍傅備傑傀傖傘傚最凱割剴創剩勞勝勛博厥啻喀喧啼喊喝喘喂喜喪喔喇喋喃喳單喟唾喲喚喻喬喱啾喉喫喙圍堯堪場堤堰報堡堝堠壹壺奠�".split("");
  663. for(j = 0; j != D[179].length; ++j) if(D[179][j].charCodeAt(0) !== 0xFFFD) { e[D[179][j]] = 45824 + j; d[45824 + j] = D[179][j];}
  664. D[180] = "����������������������������������������������������������������婷媚婿媒媛媧孳孱寒富寓寐尊尋就嵌嵐崴嵇巽幅帽幀幃幾廊廁廂廄弼彭復循徨惑惡悲悶惠愜愣惺愕惰惻惴慨惱愎惶愉愀愒戟扉掣掌描揀揩揉揆揍����������������������������������插揣提握揖揭揮捶援揪換摒揚揹敞敦敢散斑斐斯普晰晴晶景暑智晾晷曾替期朝棺棕棠棘棗椅棟棵森棧棹棒棲棣棋棍植椒椎棉棚楮棻款欺欽殘殖殼毯氮氯氬港游湔渡渲湧湊渠渥渣減湛湘渤湖湮渭渦湯渴湍渺測湃渝渾滋�".split("");
  665. for(j = 0; j != D[180].length; ++j) if(D[180][j].charCodeAt(0) !== 0xFFFD) { e[D[180][j]] = 46080 + j; d[46080 + j] = D[180][j];}
  666. D[181] = "����������������������������������������������������������������溉渙湎湣湄湲湩湟焙焚焦焰無然煮焜牌犄犀猶猥猴猩琺琪琳琢琥琵琶琴琯琛琦琨甥甦畫番痢痛痣痙痘痞痠登發皖皓皴盜睏短硝硬硯稍稈程稅稀窘����������������������������������窗窖童竣等策筆筐筒答筍筋筏筑粟粥絞結絨絕紫絮絲絡給絢絰絳善翔翕耋聒肅腕腔腋腑腎脹腆脾腌腓腴舒舜菩萃菸萍菠菅萋菁華菱菴著萊菰萌菌菽菲菊萸萎萄菜萇菔菟虛蛟蛙蛭蛔蛛蛤蛐蛞街裁裂袱覃視註詠評詞証詁�".split("");
  667. for(j = 0; j != D[181].length; ++j) if(D[181][j].charCodeAt(0) !== 0xFFFD) { e[D[181][j]] = 46336 + j; d[46336 + j] = D[181][j];}
  668. D[182] = "����������������������������������������������������������������詔詛詐詆訴診訶詖象貂貯貼貳貽賁費賀貴買貶貿貸越超趁跎距跋跚跑跌跛跆軻軸軼辜逮逵週逸進逶鄂郵鄉郾酣酥量鈔鈕鈣鈉鈞鈍鈐鈇鈑閔閏開閑����������������������������������間閒閎隊階隋陽隅隆隍陲隄雁雅雄集雇雯雲韌項順須飧飪飯飩飲飭馮馭黃黍黑亂傭債傲傳僅傾催傷傻傯僇剿剷剽募勦勤勢勣匯嗟嗨嗓嗦嗎嗜嗇嗑嗣嗤嗯嗚嗡嗅嗆嗥嗉園圓塞塑塘塗塚塔填塌塭塊塢塒塋奧嫁嫉嫌媾媽媼�".split("");
  669. for(j = 0; j != D[182].length; ++j) if(D[182][j].charCodeAt(0) !== 0xFFFD) { e[D[182][j]] = 46592 + j; d[46592 + j] = D[182][j];}
  670. D[183] = "����������������������������������������������������������������媳嫂媲嵩嵯幌幹廉廈弒彙徬微愚意慈感想愛惹愁愈慎慌慄慍愾愴愧愍愆愷戡戢搓搾搞搪搭搽搬搏搜搔損搶搖搗搆敬斟新暗暉暇暈暖暄暘暍會榔業����������������������������������楚楷楠楔極椰概楊楨楫楞楓楹榆楝楣楛歇歲毀殿毓毽溢溯滓溶滂源溝滇滅溥溘溼溺溫滑準溜滄滔溪溧溴煎煙煩煤煉照煜煬煦煌煥煞煆煨煖爺牒猷獅猿猾瑯瑚瑕瑟瑞瑁琿瑙瑛瑜當畸瘀痰瘁痲痱痺痿痴痳盞盟睛睫睦睞督�".split("");
  671. for(j = 0; j != D[183].length; ++j) if(D[183][j].charCodeAt(0) !== 0xFFFD) { e[D[183][j]] = 46848 + j; d[46848 + j] = D[183][j];}
  672. D[184] = "����������������������������������������������������������������睹睪睬睜睥睨睢矮碎碰碗碘碌碉硼碑碓硿祺祿禁萬禽稜稚稠稔稟稞窟窠筷節筠筮筧粱粳粵經絹綑綁綏絛置罩罪署義羨群聖聘肆肄腱腰腸腥腮腳腫����������������������������������腹腺腦舅艇蒂葷落萱葵葦葫葉葬葛萼萵葡董葩葭葆虞虜號蛹蜓蜈蜇蜀蛾蛻蜂蜃蜆蜊衙裟裔裙補裘裝裡裊裕裒覜解詫該詳試詩詰誇詼詣誠話誅詭詢詮詬詹詻訾詨豢貊貉賊資賈賄貲賃賂賅跡跟跨路跳跺跪跤跦躲較載軾輊�".split("");
  673. for(j = 0; j != D[184].length; ++j) if(D[184][j].charCodeAt(0) !== 0xFFFD) { e[D[184][j]] = 47104 + j; d[47104 + j] = D[184][j];}
  674. D[185] = "����������������������������������������������������������������辟農運遊道遂達逼違遐遇遏過遍遑逾遁鄒鄗酬酪酩釉鈷鉗鈸鈽鉀鈾鉛鉋鉤鉑鈴鉉鉍鉅鈹鈿鉚閘隘隔隕雍雋雉雊雷電雹零靖靴靶預頑頓頊頒頌飼飴����������������������������������飽飾馳馱馴髡鳩麂鼎鼓鼠僧僮僥僖僭僚僕像僑僱僎僩兢凳劃劂匱厭嗾嘀嘛嘗嗽嘔嘆嘉嘍嘎嗷嘖嘟嘈嘐嗶團圖塵塾境墓墊塹墅塽壽夥夢夤奪奩嫡嫦嫩嫗嫖嫘嫣孵寞寧寡寥實寨寢寤察對屢嶄嶇幛幣幕幗幔廓廖弊彆彰徹慇�".split("");
  675. for(j = 0; j != D[185].length; ++j) if(D[185][j].charCodeAt(0) !== 0xFFFD) { e[D[185][j]] = 47360 + j; d[47360 + j] = D[185][j];}
  676. D[186] = "����������������������������������������������������������������愿態慷慢慣慟慚慘慵截撇摘摔撤摸摟摺摑摧搴摭摻敲斡旗旖暢暨暝榜榨榕槁榮槓構榛榷榻榫榴槐槍榭槌榦槃榣歉歌氳漳演滾漓滴漩漾漠漬漏漂漢����������������������������������滿滯漆漱漸漲漣漕漫漯澈漪滬漁滲滌滷熔熙煽熊熄熒爾犒犖獄獐瑤瑣瑪瑰瑭甄疑瘧瘍瘋瘉瘓盡監瞄睽睿睡磁碟碧碳碩碣禎福禍種稱窪窩竭端管箕箋筵算箝箔箏箸箇箄粹粽精綻綰綜綽綾綠緊綴網綱綺綢綿綵綸維緒緇綬�".split("");
  677. for(j = 0; j != D[186].length; ++j) if(D[186][j].charCodeAt(0) !== 0xFFFD) { e[D[186][j]] = 47616 + j; d[47616 + j] = D[186][j];}
  678. D[187] = "����������������������������������������������������������������罰翠翡翟聞聚肇腐膀膏膈膊腿膂臧臺與舔舞艋蓉蒿蓆蓄蒙蒞蒲蒜蓋蒸蓀蓓蒐蒼蓑蓊蜿蜜蜻蜢蜥蜴蜘蝕蜷蜩裳褂裴裹裸製裨褚裯誦誌語誣認誡誓誤����������������������������������說誥誨誘誑誚誧豪貍貌賓賑賒赫趙趕跼輔輒輕輓辣遠遘遜遣遙遞遢遝遛鄙鄘鄞酵酸酷酴鉸銀銅銘銖鉻銓銜銨鉼銑閡閨閩閣閥閤隙障際雌雒需靼鞅韶頗領颯颱餃餅餌餉駁骯骰髦魁魂鳴鳶鳳麼鼻齊億儀僻僵價儂儈儉儅凜�".split("");
  679. for(j = 0; j != D[187].length; ++j) if(D[187][j].charCodeAt(0) !== 0xFFFD) { e[D[187][j]] = 47872 + j; d[47872 + j] = D[187][j];}
  680. D[188] = "����������������������������������������������������������������劇劈劉劍劊勰厲嘮嘻嘹嘲嘿嘴嘩噓噎噗噴嘶嘯嘰墀墟增墳墜墮墩墦奭嬉嫻嬋嫵嬌嬈寮寬審寫層履嶝嶔幢幟幡廢廚廟廝廣廠彈影德徵慶慧慮慝慕憂����������������������������������慼慰慫慾憧憐憫憎憬憚憤憔憮戮摩摯摹撞撲撈撐撰撥撓撕撩撒撮播撫撚撬撙撢撳敵敷數暮暫暴暱樣樟槨樁樞標槽模樓樊槳樂樅槭樑歐歎殤毅毆漿潼澄潑潦潔澆潭潛潸潮澎潺潰潤澗潘滕潯潠潟熟熬熱熨牖犛獎獗瑩璋璃�".split("");
  681. for(j = 0; j != D[188].length; ++j) if(D[188][j].charCodeAt(0) !== 0xFFFD) { e[D[188][j]] = 48128 + j; d[48128 + j] = D[188][j];}
  682. D[189] = "����������������������������������������������������������������瑾璀畿瘠瘩瘟瘤瘦瘡瘢皚皺盤瞎瞇瞌瞑瞋磋磅確磊碾磕碼磐稿稼穀稽稷稻窯窮箭箱範箴篆篇篁箠篌糊締練緯緻緘緬緝編緣線緞緩綞緙緲緹罵罷羯����������������������������������翩耦膛膜膝膠膚膘蔗蔽蔚蓮蔬蔭蔓蔑蔣蔡蔔蓬蔥蓿蔆螂蝴蝶蝠蝦蝸蝨蝙蝗蝌蝓衛衝褐複褒褓褕褊誼諒談諄誕請諸課諉諂調誰論諍誶誹諛豌豎豬賠賞賦賤賬賭賢賣賜質賡赭趟趣踫踐踝踢踏踩踟踡踞躺輝輛輟輩輦輪輜輞�".split("");
  683. for(j = 0; j != D[189].length; ++j) if(D[189][j].charCodeAt(0) !== 0xFFFD) { e[D[189][j]] = 48384 + j; d[48384 + j] = D[189][j];}
  684. D[190] = "����������������������������������������������������������������輥適遮遨遭遷鄰鄭鄧鄱醇醉醋醃鋅銻銷鋪銬鋤鋁銳銼鋒鋇鋰銲閭閱霄霆震霉靠鞍鞋鞏頡頫頜颳養餓餒餘駝駐駟駛駑駕駒駙骷髮髯鬧魅魄魷魯鴆鴉����������������������������������鴃麩麾黎墨齒儒儘儔儐儕冀冪凝劑劓勳噙噫噹噩噤噸噪器噥噱噯噬噢噶壁墾壇壅奮嬝嬴學寰導彊憲憑憩憊懍憶憾懊懈戰擅擁擋撻撼據擄擇擂操撿擒擔撾整曆曉暹曄曇暸樽樸樺橙橫橘樹橄橢橡橋橇樵機橈歙歷氅濂澱澡�".split("");
  685. for(j = 0; j != D[190].length; ++j) if(D[190][j].charCodeAt(0) !== 0xFFFD) { e[D[190][j]] = 48640 + j; d[48640 + j] = D[190][j];}
  686. D[191] = "����������������������������������������������������������������濃澤濁澧澳激澹澶澦澠澴熾燉燐燒燈燕熹燎燙燜燃燄獨璜璣璘璟璞瓢甌甍瘴瘸瘺盧盥瞠瞞瞟瞥磨磚磬磧禦積穎穆穌穋窺篙簑築篤篛篡篩篦糕糖縊����������������������������������縑縈縛縣縞縝縉縐罹羲翰翱翮耨膳膩膨臻興艘艙蕊蕙蕈蕨蕩蕃蕉蕭蕪蕞螃螟螞螢融衡褪褲褥褫褡親覦諦諺諫諱謀諜諧諮諾謁謂諷諭諳諶諼豫豭貓賴蹄踱踴蹂踹踵輻輯輸輳辨辦遵遴選遲遼遺鄴醒錠錶鋸錳錯錢鋼錫錄錚�".split("");
  687. for(j = 0; j != D[191].length; ++j) if(D[191][j].charCodeAt(0) !== 0xFFFD) { e[D[191][j]] = 48896 + j; d[48896 + j] = D[191][j];}
  688. D[192] = "����������������������������������������������������������������錐錦錡錕錮錙閻隧隨險雕霎霑霖霍霓霏靛靜靦鞘頰頸頻頷頭頹頤餐館餞餛餡餚駭駢駱骸骼髻髭鬨鮑鴕鴣鴦鴨鴒鴛默黔龍龜優償儡儲勵嚎嚀嚐嚅嚇����������������������������������嚏壕壓壑壎嬰嬪嬤孺尷屨嶼嶺嶽嶸幫彌徽應懂懇懦懋戲戴擎擊擘擠擰擦擬擱擢擭斂斃曙曖檀檔檄檢檜櫛檣橾檗檐檠歜殮毚氈濘濱濟濠濛濤濫濯澀濬濡濩濕濮濰燧營燮燦燥燭燬燴燠爵牆獰獲璩環璦璨癆療癌盪瞳瞪瞰瞬�".split("");
  689. for(j = 0; j != D[192].length; ++j) if(D[192][j].charCodeAt(0) !== 0xFFFD) { e[D[192][j]] = 49152 + j; d[49152 + j] = D[192][j];}
  690. D[193] = "����������������������������������������������������������������瞧瞭矯磷磺磴磯礁禧禪穗窿簇簍篾篷簌篠糠糜糞糢糟糙糝縮績繆縷縲繃縫總縱繅繁縴縹繈縵縿縯罄翳翼聱聲聰聯聳臆臃膺臂臀膿膽臉膾臨舉艱薪����������������������������������薄蕾薜薑薔薯薛薇薨薊虧蟀蟑螳蟒蟆螫螻螺蟈蟋褻褶襄褸褽覬謎謗謙講謊謠謝謄謐豁谿豳賺賽購賸賻趨蹉蹋蹈蹊轄輾轂轅輿避遽還邁邂邀鄹醣醞醜鍍鎂錨鍵鍊鍥鍋錘鍾鍬鍛鍰鍚鍔闊闋闌闈闆隱隸雖霜霞鞠韓顆颶餵騁�".split("");
  691. for(j = 0; j != D[193].length; ++j) if(D[193][j].charCodeAt(0) !== 0xFFFD) { e[D[193][j]] = 49408 + j; d[49408 + j] = D[193][j];}
  692. D[194] = "����������������������������������������������������������������駿鮮鮫鮪鮭鴻鴿麋黏點黜黝黛鼾齋叢嚕嚮壙壘嬸彝懣戳擴擲擾攆擺擻擷斷曜朦檳檬櫃檻檸櫂檮檯歟歸殯瀉瀋濾瀆濺瀑瀏燻燼燾燸獷獵璧璿甕癖癘����������������������������������癒瞽瞿瞻瞼礎禮穡穢穠竄竅簫簧簪簞簣簡糧織繕繞繚繡繒繙罈翹翻職聶臍臏舊藏薩藍藐藉薰薺薹薦蟯蟬蟲蟠覆覲觴謨謹謬謫豐贅蹙蹣蹦蹤蹟蹕軀轉轍邇邃邈醫醬釐鎔鎊鎖鎢鎳鎮鎬鎰鎘鎚鎗闔闖闐闕離雜雙雛雞霤鞣鞦�".split("");
  693. for(j = 0; j != D[194].length; ++j) if(D[194][j].charCodeAt(0) !== 0xFFFD) { e[D[194][j]] = 49664 + j; d[49664 + j] = D[194][j];}
  694. D[195] = "����������������������������������������������������������������鞭韹額顏題顎顓颺餾餿餽餮馥騎髁鬃鬆魏魎魍鯊鯉鯽鯈鯀鵑鵝鵠黠鼕鼬儳嚥壞壟壢寵龐廬懲懷懶懵攀攏曠曝櫥櫝櫚櫓瀛瀟瀨瀚瀝瀕瀘爆爍牘犢獸����������������������������������獺璽瓊瓣疇疆癟癡矇礙禱穫穩簾簿簸簽簷籀繫繭繹繩繪羅繳羶羹羸臘藩藝藪藕藤藥藷蟻蠅蠍蟹蟾襠襟襖襞譁譜識證譚譎譏譆譙贈贊蹼蹲躇蹶蹬蹺蹴轔轎辭邊邋醱醮鏡鏑鏟鏃鏈鏜鏝鏖鏢鏍鏘鏤鏗鏨關隴難霪霧靡韜韻類�".split("");
  695. for(j = 0; j != D[195].length; ++j) if(D[195][j].charCodeAt(0) !== 0xFFFD) { e[D[195][j]] = 49920 + j; d[49920 + j] = D[195][j];}
  696. D[196] = "����������������������������������������������������������������願顛颼饅饉騖騙鬍鯨鯧鯖鯛鶉鵡鵲鵪鵬麒麗麓麴勸嚨嚷嚶嚴嚼壤孀孃孽寶巉懸懺攘攔攙曦朧櫬瀾瀰瀲爐獻瓏癢癥礦礪礬礫竇競籌籃籍糯糰辮繽繼����������������������������������纂罌耀臚艦藻藹蘑藺蘆蘋蘇蘊蠔蠕襤覺觸議譬警譯譟譫贏贍躉躁躅躂醴釋鐘鐃鏽闡霰飄饒饑馨騫騰騷騵鰓鰍鹹麵黨鼯齟齣齡儷儸囁囀囂夔屬巍懼懾攝攜斕曩櫻欄櫺殲灌爛犧瓖瓔癩矓籐纏續羼蘗蘭蘚蠣蠢蠡蠟襪襬覽譴�".split("");
  697. for(j = 0; j != D[196].length; ++j) if(D[196][j].charCodeAt(0) !== 0xFFFD) { e[D[196][j]] = 50176 + j; d[50176 + j] = D[196][j];}
  698. D[197] = "����������������������������������������������������������������護譽贓躊躍躋轟辯醺鐮鐳鐵鐺鐸鐲鐫闢霸霹露響顧顥饗驅驃驀騾髏魔魑鰭鰥鶯鶴鷂鶸麝黯鼙齜齦齧儼儻囈囊囉孿巔巒彎懿攤權歡灑灘玀瓤疊癮癬����������������������������������禳籠籟聾聽臟襲襯觼讀贖贗躑躓轡酈鑄鑑鑒霽霾韃韁顫饕驕驍髒鬚鱉鰱鰾鰻鷓鷗鼴齬齪龔囌巖戀攣攫攪曬欐瓚竊籤籣籥纓纖纔臢蘸蘿蠱變邐邏鑣鑠鑤靨顯饜驚驛驗髓體髑鱔鱗鱖鷥麟黴囑壩攬灞癱癲矗罐羈蠶蠹衢讓讒�".split("");
  699. for(j = 0; j != D[197].length; ++j) if(D[197][j].charCodeAt(0) !== 0xFFFD) { e[D[197][j]] = 50432 + j; d[50432 + j] = D[197][j];}
  700. D[198] = "����������������������������������������������������������������讖艷贛釀鑪靂靈靄韆顰驟鬢魘鱟鷹鷺鹼鹽鼇齷齲廳欖灣籬籮蠻觀躡釁鑲鑰顱饞髖鬣黌灤矚讚鑷韉驢驥纜讜躪釅鑽鑾鑼鱷鱸黷豔鑿鸚爨驪鬱鸛鸞籲���������������������������������������������������������������������������������������������������������������������������������".split("");
  701. for(j = 0; j != D[198].length; ++j) if(D[198][j].charCodeAt(0) !== 0xFFFD) { e[D[198][j]] = 50688 + j; d[50688 + j] = D[198][j];}
  702. D[201] = "����������������������������������������������������������������乂乜凵匚厂万丌乇亍囗兀屮彳丏冇与丮亓仂仉仈冘勼卬厹圠夃夬尐巿旡殳毌气爿丱丼仨仜仩仡仝仚刌匜卌圢圣夗夯宁宄尒尻屴屳帄庀庂忉戉扐氕����������������������������������氶汃氿氻犮犰玊禸肊阞伎优伬仵伔仱伀价伈伝伂伅伢伓伄仴伒冱刓刉刐劦匢匟卍厊吇囡囟圮圪圴夼妀奼妅奻奾奷奿孖尕尥屼屺屻屾巟幵庄异弚彴忕忔忏扜扞扤扡扦扢扙扠扚扥旯旮朾朹朸朻机朿朼朳氘汆汒汜汏汊汔汋�".split("");
  703. for(j = 0; j != D[201].length; ++j) if(D[201][j].charCodeAt(0) !== 0xFFFD) { e[D[201][j]] = 51456 + j; d[51456 + j] = D[201][j];}
  704. D[202] = "����������������������������������������������������������������汌灱牞犴犵玎甪癿穵网艸艼芀艽艿虍襾邙邗邘邛邔阢阤阠阣佖伻佢佉体佤伾佧佒佟佁佘伭伳伿佡冏冹刜刞刡劭劮匉卣卲厎厏吰吷吪呔呅吙吜吥吘����������������������������������吽呏呁吨吤呇囮囧囥坁坅坌坉坋坒夆奀妦妘妠妗妎妢妐妏妧妡宎宒尨尪岍岏岈岋岉岒岊岆岓岕巠帊帎庋庉庌庈庍弅弝彸彶忒忑忐忭忨忮忳忡忤忣忺忯忷忻怀忴戺抃抌抎抏抔抇扱扻扺扰抁抈扷扽扲扴攷旰旴旳旲旵杅杇�".split("");
  705. for(j = 0; j != D[202].length; ++j) if(D[202][j].charCodeAt(0) !== 0xFFFD) { e[D[202][j]] = 51712 + j; d[51712 + j] = D[202][j];}
  706. D[203] = "����������������������������������������������������������������杙杕杌杈杝杍杚杋毐氙氚汸汧汫沄沋沏汱汯汩沚汭沇沕沜汦汳汥汻沎灴灺牣犿犽狃狆狁犺狅玕玗玓玔玒町甹疔疕皁礽耴肕肙肐肒肜芐芏芅芎芑芓����������������������������������芊芃芄豸迉辿邟邡邥邞邧邠阰阨阯阭丳侘佼侅佽侀侇佶佴侉侄佷佌侗佪侚佹侁佸侐侜侔侞侒侂侕佫佮冞冼冾刵刲刳剆刱劼匊匋匼厒厔咇呿咁咑咂咈呫呺呾呥呬呴呦咍呯呡呠咘呣呧呤囷囹坯坲坭坫坱坰坶垀坵坻坳坴坢�".split("");
  707. for(j = 0; j != D[203].length; ++j) if(D[203][j].charCodeAt(0) !== 0xFFFD) { e[D[203][j]] = 51968 + j; d[51968 + j] = D[203][j];}
  708. D[204] = "����������������������������������������������������������������坨坽夌奅妵妺姏姎妲姌姁妶妼姃姖妱妽姀姈妴姇孢孥宓宕屄屇岮岤岠岵岯岨岬岟岣岭岢岪岧岝岥岶岰岦帗帔帙弨弢弣弤彔徂彾彽忞忥怭怦怙怲怋����������������������������������怴怊怗怳怚怞怬怢怍怐怮怓怑怌怉怜戔戽抭抴拑抾抪抶拊抮抳抯抻抩抰抸攽斨斻昉旼昄昒昈旻昃昋昍昅旽昑昐曶朊枅杬枎枒杶杻枘枆构杴枍枌杺枟枑枙枃杽极杸杹枔欥殀歾毞氝沓泬泫泮泙沶泔沭泧沷泐泂沺泃泆泭泲�".split("");
  709. for(j = 0; j != D[204].length; ++j) if(D[204][j].charCodeAt(0) !== 0xFFFD) { e[D[204][j]] = 52224 + j; d[52224 + j] = D[204][j];}
  710. D[205] = "����������������������������������������������������������������泒泝沴沊沝沀泞泀洰泍泇沰泹泏泩泑炔炘炅炓炆炄炑炖炂炚炃牪狖狋狘狉狜狒狔狚狌狑玤玡玭玦玢玠玬玝瓝瓨甿畀甾疌疘皯盳盱盰盵矸矼矹矻矺����������������������������������矷祂礿秅穸穻竻籵糽耵肏肮肣肸肵肭舠芠苀芫芚芘芛芵芧芮芼芞芺芴芨芡芩苂芤苃芶芢虰虯虭虮豖迒迋迓迍迖迕迗邲邴邯邳邰阹阽阼阺陃俍俅俓侲俉俋俁俔俜俙侻侳俛俇俖侺俀侹俬剄剉勀勂匽卼厗厖厙厘咺咡咭咥哏�".split("");
  711. for(j = 0; j != D[205].length; ++j) if(D[205][j].charCodeAt(0) !== 0xFFFD) { e[D[205][j]] = 52480 + j; d[52480 + j] = D[205][j];}
  712. D[206] = "����������������������������������������������������������������哃茍咷咮哖咶哅哆咠呰咼咢咾呲哞咰垵垞垟垤垌垗垝垛垔垘垏垙垥垚垕壴复奓姡姞姮娀姱姝姺姽姼姶姤姲姷姛姩姳姵姠姾姴姭宨屌峐峘峌峗峋峛����������������������������������峞峚峉峇峊峖峓峔峏峈峆峎峟峸巹帡帢帣帠帤庰庤庢庛庣庥弇弮彖徆怷怹恔恲恞恅恓恇恉恛恌恀恂恟怤恄恘恦恮扂扃拏挍挋拵挎挃拫拹挏挌拸拶挀挓挔拺挕拻拰敁敃斪斿昶昡昲昵昜昦昢昳昫昺昝昴昹昮朏朐柁柲柈枺�".split("");
  713. for(j = 0; j != D[206].length; ++j) if(D[206][j].charCodeAt(0) !== 0xFFFD) { e[D[206][j]] = 52736 + j; d[52736 + j] = D[206][j];}
  714. D[207] = "����������������������������������������������������������������柜枻柸柘柀枷柅柫柤柟枵柍枳柷柶柮柣柂枹柎柧柰枲柼柆柭柌枮柦柛柺柉柊柃柪柋欨殂殄殶毖毘毠氠氡洨洴洭洟洼洿洒洊泚洳洄洙洺洚洑洀洝浂����������������������������������洁洘洷洃洏浀洇洠洬洈洢洉洐炷炟炾炱炰炡炴炵炩牁牉牊牬牰牳牮狊狤狨狫狟狪狦狣玅珌珂珈珅玹玶玵玴珫玿珇玾珃珆玸珋瓬瓮甮畇畈疧疪癹盄眈眃眄眅眊盷盻盺矧矨砆砑砒砅砐砏砎砉砃砓祊祌祋祅祄秕种秏秖秎窀�".split("");
  715. for(j = 0; j != D[207].length; ++j) if(D[207][j].charCodeAt(0) !== 0xFFFD) { e[D[207][j]] = 52992 + j; d[52992 + j] = D[207][j];}
  716. D[208] = "����������������������������������������������������������������穾竑笀笁籺籸籹籿粀粁紃紈紁罘羑羍羾耇耎耏耔耷胘胇胠胑胈胂胐胅胣胙胜胊胕胉胏胗胦胍臿舡芔苙苾苹茇苨茀苕茺苫苖苴苬苡苲苵茌苻苶苰苪����������������������������������苤苠苺苳苭虷虴虼虳衁衎衧衪衩觓訄訇赲迣迡迮迠郱邽邿郕郅邾郇郋郈釔釓陔陏陑陓陊陎倞倅倇倓倢倰倛俵俴倳倷倬俶俷倗倜倠倧倵倯倱倎党冔冓凊凄凅凈凎剡剚剒剞剟剕剢勍匎厞唦哢唗唒哧哳哤唚哿唄唈哫唑唅哱�".split("");
  717. for(j = 0; j != D[208].length; ++j) if(D[208][j].charCodeAt(0) !== 0xFFFD) { e[D[208][j]] = 53248 + j; d[53248 + j] = D[208][j];}
  718. D[209] = "����������������������������������������������������������������唊哻哷哸哠唎唃唋圁圂埌堲埕埒垺埆垽垼垸垶垿埇埐垹埁夎奊娙娖娭娮娕娏娗娊娞娳孬宧宭宬尃屖屔峬峿峮峱峷崀峹帩帨庨庮庪庬弳弰彧恝恚恧����������������������������������恁悢悈悀悒悁悝悃悕悛悗悇悜悎戙扆拲挐捖挬捄捅挶捃揤挹捋捊挼挩捁挴捘捔捙挭捇挳捚捑挸捗捀捈敊敆旆旃旄旂晊晟晇晑朒朓栟栚桉栲栳栻桋桏栖栱栜栵栫栭栯桎桄栴栝栒栔栦栨栮桍栺栥栠欬欯欭欱欴歭肂殈毦毤�".split("");
  719. for(j = 0; j != D[209].length; ++j) if(D[209][j].charCodeAt(0) !== 0xFFFD) { e[D[209][j]] = 53504 + j; d[53504 + j] = D[209][j];}
  720. D[210] = "����������������������������������������������������������������毨毣毢毧氥浺浣浤浶洍浡涒浘浢浭浯涑涍淯浿涆浞浧浠涗浰浼浟涂涘洯浨涋浾涀涄洖涃浻浽浵涐烜烓烑烝烋缹烢烗烒烞烠烔烍烅烆烇烚烎烡牂牸����������������������������������牷牶猀狺狴狾狶狳狻猁珓珙珥珖玼珧珣珩珜珒珛珔珝珚珗珘珨瓞瓟瓴瓵甡畛畟疰痁疻痄痀疿疶疺皊盉眝眛眐眓眒眣眑眕眙眚眢眧砣砬砢砵砯砨砮砫砡砩砳砪砱祔祛祏祜祓祒祑秫秬秠秮秭秪秜秞秝窆窉窅窋窌窊窇竘笐�".split("");
  721. for(j = 0; j != D[210].length; ++j) if(D[210][j].charCodeAt(0) !== 0xFFFD) { e[D[210][j]] = 53760 + j; d[53760 + j] = D[210][j];}
  722. D[211] = "����������������������������������������������������������������笄笓笅笏笈笊笎笉笒粄粑粊粌粈粍粅紞紝紑紎紘紖紓紟紒紏紌罜罡罞罠罝罛羖羒翃翂翀耖耾耹胺胲胹胵脁胻脀舁舯舥茳茭荄茙荑茥荖茿荁茦茜茢����������������������������������荂荎茛茪茈茼荍茖茤茠茷茯茩荇荅荌荓茞茬荋茧荈虓虒蚢蚨蚖蚍蚑蚞蚇蚗蚆蚋蚚蚅蚥蚙蚡蚧蚕蚘蚎蚝蚐蚔衃衄衭衵衶衲袀衱衿衯袃衾衴衼訒豇豗豻貤貣赶赸趵趷趶軑軓迾迵适迿迻逄迼迶郖郠郙郚郣郟郥郘郛郗郜郤酐�".split("");
  723. for(j = 0; j != D[211].length; ++j) if(D[211][j].charCodeAt(0) !== 0xFFFD) { e[D[211][j]] = 54016 + j; d[54016 + j] = D[211][j];}
  724. D[212] = "����������������������������������������������������������������酎酏釕釢釚陜陟隼飣髟鬯乿偰偪偡偞偠偓偋偝偲偈偍偁偛偊偢倕偅偟偩偫偣偤偆偀偮偳偗偑凐剫剭剬剮勖勓匭厜啵啶唼啍啐唴唪啑啢唶唵唰啒啅����������������������������������唌唲啥啎唹啈唭唻啀啋圊圇埻堔埢埶埜埴堀埭埽堈埸堋埳埏堇埮埣埲埥埬埡堎埼堐埧堁堌埱埩埰堍堄奜婠婘婕婧婞娸娵婭婐婟婥婬婓婤婗婃婝婒婄婛婈媎娾婍娹婌婰婩婇婑婖婂婜孲孮寁寀屙崞崋崝崚崠崌崨崍崦崥崏�".split("");
  725. for(j = 0; j != D[212].length; ++j) if(D[212][j].charCodeAt(0) !== 0xFFFD) { e[D[212][j]] = 54272 + j; d[54272 + j] = D[212][j];}
  726. D[213] = "����������������������������������������������������������������崰崒崣崟崮帾帴庱庴庹庲庳弶弸徛徖徟悊悐悆悾悰悺惓惔惏惤惙惝惈悱惛悷惊悿惃惍惀挲捥掊掂捽掽掞掭掝掗掫掎捯掇掐据掯捵掜捭掮捼掤挻掟����������������������������������捸掅掁掑掍捰敓旍晥晡晛晙晜晢朘桹梇梐梜桭桮梮梫楖桯梣梬梩桵桴梲梏桷梒桼桫桲梪梀桱桾梛梖梋梠梉梤桸桻梑梌梊桽欶欳欷欸殑殏殍殎殌氪淀涫涴涳湴涬淩淢涷淶淔渀淈淠淟淖涾淥淜淝淛淴淊涽淭淰涺淕淂淏淉�".split("");
  727. for(j = 0; j != D[213].length; ++j) if(D[213][j].charCodeAt(0) !== 0xFFFD) { e[D[213][j]] = 54528 + j; d[54528 + j] = D[213][j];}
  728. D[214] = "����������������������������������������������������������������淐淲淓淽淗淍淣涻烺焍烷焗烴焌烰焄烳焐烼烿焆焓焀烸烶焋焂焎牾牻牼牿猝猗猇猑猘猊猈狿猏猞玈珶珸珵琄琁珽琇琀珺珼珿琌琋珴琈畤畣痎痒痏����������������������������������痋痌痑痐皏皉盓眹眯眭眱眲眴眳眽眥眻眵硈硒硉硍硊硌砦硅硐祤祧祩祪祣祫祡离秺秸秶秷窏窔窐笵筇笴笥笰笢笤笳笘笪笝笱笫笭笯笲笸笚笣粔粘粖粣紵紽紸紶紺絅紬紩絁絇紾紿絊紻紨罣羕羜羝羛翊翋翍翐翑翇翏翉耟�".split("");
  729. for(j = 0; j != D[214].length; ++j) if(D[214][j].charCodeAt(0) !== 0xFFFD) { e[D[214][j]] = 54784 + j; d[54784 + j] = D[214][j];}
  730. D[215] = "����������������������������������������������������������������耞耛聇聃聈脘脥脙脛脭脟脬脞脡脕脧脝脢舑舸舳舺舴舲艴莐莣莨莍荺荳莤荴莏莁莕莙荵莔莩荽莃莌莝莛莪莋荾莥莯莈莗莰荿莦莇莮荶莚虙虖蚿蚷����������������������������������蛂蛁蛅蚺蚰蛈蚹蚳蚸蛌蚴蚻蚼蛃蚽蚾衒袉袕袨袢袪袚袑袡袟袘袧袙袛袗袤袬袌袓袎覂觖觙觕訰訧訬訞谹谻豜豝豽貥赽赻赹趼跂趹趿跁軘軞軝軜軗軠軡逤逋逑逜逌逡郯郪郰郴郲郳郔郫郬郩酖酘酚酓酕釬釴釱釳釸釤釹釪�".split("");
  731. for(j = 0; j != D[215].length; ++j) if(D[215][j].charCodeAt(0) !== 0xFFFD) { e[D[215][j]] = 55040 + j; d[55040 + j] = D[215][j];}
  732. D[216] = "����������������������������������������������������������������釫釷釨釮镺閆閈陼陭陫陱陯隿靪頄飥馗傛傕傔傞傋傣傃傌傎傝偨傜傒傂傇兟凔匒匑厤厧喑喨喥喭啷噅喢喓喈喏喵喁喣喒喤啽喌喦啿喕喡喎圌堩堷����������������������������������堙堞堧堣堨埵塈堥堜堛堳堿堶堮堹堸堭堬堻奡媯媔媟婺媢媞婸媦婼媥媬媕媮娷媄媊媗媃媋媩婻婽媌媜媏媓媝寪寍寋寔寑寊寎尌尰崷嵃嵫嵁嵋崿崵嵑嵎嵕崳崺嵒崽崱嵙嵂崹嵉崸崼崲崶嵀嵅幄幁彘徦徥徫惉悹惌惢惎惄愔�".split("");
  733. for(j = 0; j != D[216].length; ++j) if(D[216][j].charCodeAt(0) !== 0xFFFD) { e[D[216][j]] = 55296 + j; d[55296 + j] = D[216][j];}
  734. D[217] = "����������������������������������������������������������������惲愊愖愅惵愓惸惼惾惁愃愘愝愐惿愄愋扊掔掱掰揎揥揨揯揃撝揳揊揠揶揕揲揵摡揟掾揝揜揄揘揓揂揇揌揋揈揰揗揙攲敧敪敤敜敨敥斌斝斞斮旐旒����������������������������������晼晬晻暀晱晹晪晲朁椌棓椄棜椪棬棪棱椏棖棷棫棤棶椓椐棳棡椇棌椈楰梴椑棯棆椔棸棐棽棼棨椋椊椗棎棈棝棞棦棴棑椆棔棩椕椥棇欹欻欿欼殔殗殙殕殽毰毲毳氰淼湆湇渟湉溈渼渽湅湢渫渿湁湝湳渜渳湋湀湑渻渃渮湞�".split("");
  735. for(j = 0; j != D[217].length; ++j) if(D[217][j].charCodeAt(0) !== 0xFFFD) { e[D[217][j]] = 55552 + j; d[55552 + j] = D[217][j];}
  736. D[218] = "����������������������������������������������������������������湨湜湡渱渨湠湱湫渹渢渰湓湥渧湸湤湷湕湹湒湦渵渶湚焠焞焯烻焮焱焣焥焢焲焟焨焺焛牋牚犈犉犆犅犋猒猋猰猢猱猳猧猲猭猦猣猵猌琮琬琰琫琖����������������������������������琚琡琭琱琤琣琝琩琠琲瓻甯畯畬痧痚痡痦痝痟痤痗皕皒盚睆睇睄睍睅睊睎睋睌矞矬硠硤硥硜硭硱硪确硰硩硨硞硢祴祳祲祰稂稊稃稌稄窙竦竤筊笻筄筈筌筎筀筘筅粢粞粨粡絘絯絣絓絖絧絪絏絭絜絫絒絔絩絑絟絎缾缿罥�".split("");
  737. for(j = 0; j != D[218].length; ++j) if(D[218][j].charCodeAt(0) !== 0xFFFD) { e[D[218][j]] = 55808 + j; d[55808 + j] = D[218][j];}
  738. D[219] = "����������������������������������������������������������������罦羢羠羡翗聑聏聐胾胔腃腊腒腏腇脽腍脺臦臮臷臸臹舄舼舽舿艵茻菏菹萣菀菨萒菧菤菼菶萐菆菈菫菣莿萁菝菥菘菿菡菋菎菖菵菉萉萏菞萑萆菂菳����������������������������������菕菺菇菑菪萓菃菬菮菄菻菗菢萛菛菾蛘蛢蛦蛓蛣蛚蛪蛝蛫蛜蛬蛩蛗蛨蛑衈衖衕袺裗袹袸裀袾袶袼袷袽袲褁裉覕覘覗觝觚觛詎詍訹詙詀詗詘詄詅詒詈詑詊詌詏豟貁貀貺貾貰貹貵趄趀趉跘跓跍跇跖跜跏跕跙跈跗跅軯軷軺�".split("");
  739. for(j = 0; j != D[219].length; ++j) if(D[219][j].charCodeAt(0) !== 0xFFFD) { e[D[219][j]] = 56064 + j; d[56064 + j] = D[219][j];}
  740. D[220] = "����������������������������������������������������������������軹軦軮軥軵軧軨軶軫軱軬軴軩逭逴逯鄆鄬鄄郿郼鄈郹郻鄁鄀鄇鄅鄃酡酤酟酢酠鈁鈊鈥鈃鈚鈦鈏鈌鈀鈒釿釽鈆鈄鈧鈂鈜鈤鈙鈗鈅鈖镻閍閌閐隇陾隈����������������������������������隉隃隀雂雈雃雱雰靬靰靮頇颩飫鳦黹亃亄亶傽傿僆傮僄僊傴僈僂傰僁傺傱僋僉傶傸凗剺剸剻剼嗃嗛嗌嗐嗋嗊嗝嗀嗔嗄嗩喿嗒喍嗏嗕嗢嗖嗈嗲嗍嗙嗂圔塓塨塤塏塍塉塯塕塎塝塙塥塛堽塣塱壼嫇嫄嫋媺媸媱媵媰媿嫈媻嫆�".split("");
  741. for(j = 0; j != D[220].length; ++j) if(D[220][j].charCodeAt(0) !== 0xFFFD) { e[D[220][j]] = 56320 + j; d[56320 + j] = D[220][j];}
  742. D[221] = "����������������������������������������������������������������媷嫀嫊媴媶嫍媹媐寖寘寙尟尳嵱嵣嵊嵥嵲嵬嵞嵨嵧嵢巰幏幎幊幍幋廅廌廆廋廇彀徯徭惷慉慊愫慅愶愲愮慆愯慏愩慀戠酨戣戥戤揅揱揫搐搒搉搠搤����������������������������������搳摃搟搕搘搹搷搢搣搌搦搰搨摁搵搯搊搚摀搥搧搋揧搛搮搡搎敯斒旓暆暌暕暐暋暊暙暔晸朠楦楟椸楎楢楱椿楅楪椹楂楗楙楺楈楉椵楬椳椽楥棰楸椴楩楀楯楄楶楘楁楴楌椻楋椷楜楏楑椲楒椯楻椼歆歅歃歂歈歁殛嗀毻毼�".split("");
  743. for(j = 0; j != D[221].length; ++j) if(D[221][j].charCodeAt(0) !== 0xFFFD) { e[D[221][j]] = 56576 + j; d[56576 + j] = D[221][j];}
  744. D[222] = "����������������������������������������������������������������毹毷毸溛滖滈溏滀溟溓溔溠溱溹滆滒溽滁溞滉溷溰滍溦滏溲溾滃滜滘溙溒溎溍溤溡溿溳滐滊溗溮溣煇煔煒煣煠煁煝煢煲煸煪煡煂煘煃煋煰煟煐煓����������������������������������煄煍煚牏犍犌犑犐犎猼獂猻猺獀獊獉瑄瑊瑋瑒瑑瑗瑀瑏瑐瑎瑂瑆瑍瑔瓡瓿瓾瓽甝畹畷榃痯瘏瘃痷痾痼痹痸瘐痻痶痭痵痽皙皵盝睕睟睠睒睖睚睩睧睔睙睭矠碇碚碔碏碄碕碅碆碡碃硹碙碀碖硻祼禂祽祹稑稘稙稒稗稕稢稓�".split("");
  745. for(j = 0; j != D[222].length; ++j) if(D[222][j].charCodeAt(0) !== 0xFFFD) { e[D[222][j]] = 56832 + j; d[56832 + j] = D[222][j];}
  746. D[223] = "����������������������������������������������������������������稛稐窣窢窞竫筦筤筭筴筩筲筥筳筱筰筡筸筶筣粲粴粯綈綆綀綍絿綅絺綎絻綃絼綌綔綄絽綒罭罫罧罨罬羦羥羧翛翜耡腤腠腷腜腩腛腢腲朡腞腶腧腯����������������������������������腄腡舝艉艄艀艂艅蓱萿葖葶葹蒏蒍葥葑葀蒆葧萰葍葽葚葙葴葳葝蔇葞萷萺萴葺葃葸萲葅萩菙葋萯葂萭葟葰萹葎葌葒葯蓅蒎萻葇萶萳葨葾葄萫葠葔葮葐蜋蜄蛷蜌蛺蛖蛵蝍蛸蜎蜉蜁蛶蜍蜅裖裋裍裎裞裛裚裌裐覅覛觟觥觤�".split("");
  747. for(j = 0; j != D[223].length; ++j) if(D[223][j].charCodeAt(0) !== 0xFFFD) { e[D[223][j]] = 57088 + j; d[57088 + j] = D[223][j];}
  748. D[224] = "����������������������������������������������������������������觡觠觢觜触詶誆詿詡訿詷誂誄詵誃誁詴詺谼豋豊豥豤豦貆貄貅賌赨赩趑趌趎趏趍趓趔趐趒跰跠跬跱跮跐跩跣跢跧跲跫跴輆軿輁輀輅輇輈輂輋遒逿����������������������������������遄遉逽鄐鄍鄏鄑鄖鄔鄋鄎酮酯鉈鉒鈰鈺鉦鈳鉥鉞銃鈮鉊鉆鉭鉬鉏鉠鉧鉯鈶鉡鉰鈱鉔鉣鉐鉲鉎鉓鉌鉖鈲閟閜閞閛隒隓隑隗雎雺雽雸雵靳靷靸靲頏頍頎颬飶飹馯馲馰馵骭骫魛鳪鳭鳧麀黽僦僔僗僨僳僛僪僝僤僓僬僰僯僣僠�".split("");
  749. for(j = 0; j != D[224].length; ++j) if(D[224][j].charCodeAt(0) !== 0xFFFD) { e[D[224][j]] = 57344 + j; d[57344 + j] = D[224][j];}
  750. D[225] = "����������������������������������������������������������������凘劀劁勩勫匰厬嘧嘕嘌嘒嗼嘏嘜嘁嘓嘂嗺嘝嘄嗿嗹墉塼墐墘墆墁塿塴墋塺墇墑墎塶墂墈塻墔墏壾奫嫜嫮嫥嫕嫪嫚嫭嫫嫳嫢嫠嫛嫬嫞嫝嫙嫨嫟孷寠����������������������������������寣屣嶂嶀嵽嶆嵺嶁嵷嶊嶉嶈嵾嵼嶍嵹嵿幘幙幓廘廑廗廎廜廕廙廒廔彄彃彯徶愬愨慁慞慱慳慒慓慲慬憀慴慔慺慛慥愻慪慡慖戩戧戫搫摍摛摝摴摶摲摳摽摵摦撦摎撂摞摜摋摓摠摐摿搿摬摫摙摥摷敳斠暡暠暟朅朄朢榱榶槉�".split("");
  751. for(j = 0; j != D[225].length; ++j) if(D[225][j].charCodeAt(0) !== 0xFFFD) { e[D[225][j]] = 57600 + j; d[57600 + j] = D[225][j];}
  752. D[226] = "����������������������������������������������������������������榠槎榖榰榬榼榑榙榎榧榍榩榾榯榿槄榽榤槔榹槊榚槏榳榓榪榡榞槙榗榐槂榵榥槆歊歍歋殞殟殠毃毄毾滎滵滱漃漥滸漷滻漮漉潎漙漚漧漘漻漒滭漊����������������������������������漶潳滹滮漭潀漰漼漵滫漇漎潃漅滽滶漹漜滼漺漟漍漞漈漡熇熐熉熀熅熂熏煻熆熁熗牄牓犗犕犓獃獍獑獌瑢瑳瑱瑵瑲瑧瑮甀甂甃畽疐瘖瘈瘌瘕瘑瘊瘔皸瞁睼瞅瞂睮瞀睯睾瞃碲碪碴碭碨硾碫碞碥碠碬碢碤禘禊禋禖禕禔禓�".split("");
  753. for(j = 0; j != D[226].length; ++j) if(D[226][j].charCodeAt(0) !== 0xFFFD) { e[D[226][j]] = 57856 + j; d[57856 + j] = D[226][j];}
  754. D[227] = "����������������������������������������������������������������禗禈禒禐稫穊稰稯稨稦窨窫窬竮箈箜箊箑箐箖箍箌箛箎箅箘劄箙箤箂粻粿粼粺綧綷緂綣綪緁緀緅綝緎緄緆緋緌綯綹綖綼綟綦綮綩綡緉罳翢翣翥翞����������������������������������耤聝聜膉膆膃膇膍膌膋舕蒗蒤蒡蒟蒺蓎蓂蒬蒮蒫蒹蒴蓁蓍蒪蒚蒱蓐蒝蒧蒻蒢蒔蓇蓌蒛蒩蒯蒨蓖蒘蒶蓏蒠蓗蓔蓒蓛蒰蒑虡蜳蜣蜨蝫蝀蜮蜞蜡蜙蜛蝃蜬蝁蜾蝆蜠蜲蜪蜭蜼蜒蜺蜱蜵蝂蜦蜧蜸蜤蜚蜰蜑裷裧裱裲裺裾裮裼裶裻�".split("");
  755. for(j = 0; j != D[227].length; ++j) if(D[227][j].charCodeAt(0) !== 0xFFFD) { e[D[227][j]] = 58112 + j; d[58112 + j] = D[227][j];}
  756. D[228] = "����������������������������������������������������������������裰裬裫覝覡覟覞觩觫觨誫誙誋誒誏誖谽豨豩賕賏賗趖踉踂跿踍跽踊踃踇踆踅跾踀踄輐輑輎輍鄣鄜鄠鄢鄟鄝鄚鄤鄡鄛酺酲酹酳銥銤鉶銛鉺銠銔銪銍����������������������������������銦銚銫鉹銗鉿銣鋮銎銂銕銢鉽銈銡銊銆銌銙銧鉾銇銩銝銋鈭隞隡雿靘靽靺靾鞃鞀鞂靻鞄鞁靿韎韍頖颭颮餂餀餇馝馜駃馹馻馺駂馽駇骱髣髧鬾鬿魠魡魟鳱鳲鳵麧僿儃儰僸儆儇僶僾儋儌僽儊劋劌勱勯噈噂噌嘵噁噊噉噆噘�".split("");
  757. for(j = 0; j != D[228].length; ++j) if(D[228][j].charCodeAt(0) !== 0xFFFD) { e[D[228][j]] = 58368 + j; d[58368 + j] = D[228][j];}
  758. D[229] = "����������������������������������������������������������������噚噀嘳嘽嘬嘾嘸嘪嘺圚墫墝墱墠墣墯墬墥墡壿嫿嫴嫽嫷嫶嬃嫸嬂嫹嬁嬇嬅嬏屧嶙嶗嶟嶒嶢嶓嶕嶠嶜嶡嶚嶞幩幝幠幜緳廛廞廡彉徲憋憃慹憱憰憢憉����������������������������������憛憓憯憭憟憒憪憡憍慦憳戭摮摰撖撠撅撗撜撏撋撊撌撣撟摨撱撘敶敺敹敻斲斳暵暰暩暲暷暪暯樀樆樗槥槸樕槱槤樠槿槬槢樛樝槾樧槲槮樔槷槧橀樈槦槻樍槼槫樉樄樘樥樏槶樦樇槴樖歑殥殣殢殦氁氀毿氂潁漦潾澇濆澒�".split("");
  759. for(j = 0; j != D[229].length; ++j) if(D[229][j].charCodeAt(0) !== 0xFFFD) { e[D[229][j]] = 58624 + j; d[58624 + j] = D[229][j];}
  760. D[230] = "����������������������������������������������������������������澍澉澌潢潏澅潚澖潶潬澂潕潲潒潐潗澔澓潝漀潡潫潽潧澐潓澋潩潿澕潣潷潪潻熲熯熛熰熠熚熩熵熝熥熞熤熡熪熜熧熳犘犚獘獒獞獟獠獝獛獡獚獙����������������������������������獢璇璉璊璆璁瑽璅璈瑼瑹甈甇畾瘥瘞瘙瘝瘜瘣瘚瘨瘛皜皝皞皛瞍瞏瞉瞈磍碻磏磌磑磎磔磈磃磄磉禚禡禠禜禢禛歶稹窲窴窳箷篋箾箬篎箯箹篊箵糅糈糌糋緷緛緪緧緗緡縃緺緦緶緱緰緮緟罶羬羰羭翭翫翪翬翦翨聤聧膣膟�".split("");
  761. for(j = 0; j != D[230].length; ++j) if(D[230][j].charCodeAt(0) !== 0xFFFD) { e[D[230][j]] = 58880 + j; d[58880 + j] = D[230][j];}
  762. D[231] = "����������������������������������������������������������������膞膕膢膙膗舖艏艓艒艐艎艑蔤蔻蔏蔀蔩蔎蔉蔍蔟蔊蔧蔜蓻蔫蓺蔈蔌蓴蔪蓲蔕蓷蓫蓳蓼蔒蓪蓩蔖蓾蔨蔝蔮蔂蓽蔞蓶蔱蔦蓧蓨蓰蓯蓹蔘蔠蔰蔋蔙蔯虢����������������������������������蝖蝣蝤蝷蟡蝳蝘蝔蝛蝒蝡蝚蝑蝞蝭蝪蝐蝎蝟蝝蝯蝬蝺蝮蝜蝥蝏蝻蝵蝢蝧蝩衚褅褌褔褋褗褘褙褆褖褑褎褉覢覤覣觭觰觬諏諆誸諓諑諔諕誻諗誾諀諅諘諃誺誽諙谾豍貏賥賟賙賨賚賝賧趠趜趡趛踠踣踥踤踮踕踛踖踑踙踦踧�".split("");
  763. for(j = 0; j != D[231].length; ++j) if(D[231][j].charCodeAt(0) !== 0xFFFD) { e[D[231][j]] = 59136 + j; d[59136 + j] = D[231][j];}
  764. D[232] = "����������������������������������������������������������������踔踒踘踓踜踗踚輬輤輘輚輠輣輖輗遳遰遯遧遫鄯鄫鄩鄪鄲鄦鄮醅醆醊醁醂醄醀鋐鋃鋄鋀鋙銶鋏鋱鋟鋘鋩鋗鋝鋌鋯鋂鋨鋊鋈鋎鋦鋍鋕鋉鋠鋞鋧鋑鋓����������������������������������銵鋡鋆銴镼閬閫閮閰隤隢雓霅霈霂靚鞊鞎鞈韐韏頞頝頦頩頨頠頛頧颲餈飺餑餔餖餗餕駜駍駏駓駔駎駉駖駘駋駗駌骳髬髫髳髲髱魆魃魧魴魱魦魶魵魰魨魤魬鳼鳺鳽鳿鳷鴇鴀鳹鳻鴈鴅鴄麃黓鼏鼐儜儓儗儚儑凞匴叡噰噠噮�".split("");
  765. for(j = 0; j != D[232].length; ++j) if(D[232][j].charCodeAt(0) !== 0xFFFD) { e[D[232][j]] = 59392 + j; d[59392 + j] = D[232][j];}
  766. D[233] = "����������������������������������������������������������������噳噦噣噭噲噞噷圜圛壈墽壉墿墺壂墼壆嬗嬙嬛嬡嬔嬓嬐嬖嬨嬚嬠嬞寯嶬嶱嶩嶧嶵嶰嶮嶪嶨嶲嶭嶯嶴幧幨幦幯廩廧廦廨廥彋徼憝憨憖懅憴懆懁懌憺����������������������������������憿憸憌擗擖擐擏擉撽撉擃擛擳擙攳敿敼斢曈暾曀曊曋曏暽暻暺曌朣樴橦橉橧樲橨樾橝橭橶橛橑樨橚樻樿橁橪橤橐橏橔橯橩橠樼橞橖橕橍橎橆歕歔歖殧殪殫毈毇氄氃氆澭濋澣濇澼濎濈潞濄澽澞濊澨瀄澥澮澺澬澪濏澿澸�".split("");
  767. for(j = 0; j != D[233].length; ++j) if(D[233][j].charCodeAt(0) !== 0xFFFD) { e[D[233][j]] = 59648 + j; d[59648 + j] = D[233][j];}
  768. D[234] = "����������������������������������������������������������������澢濉澫濍澯澲澰燅燂熿熸燖燀燁燋燔燊燇燏熽燘熼燆燚燛犝犞獩獦獧獬獥獫獪瑿璚璠璔璒璕璡甋疀瘯瘭瘱瘽瘳瘼瘵瘲瘰皻盦瞚瞝瞡瞜瞛瞢瞣瞕瞙����������������������������������瞗磝磩磥磪磞磣磛磡磢磭磟磠禤穄穈穇窶窸窵窱窷篞篣篧篝篕篥篚篨篹篔篪篢篜篫篘篟糒糔糗糐糑縒縡縗縌縟縠縓縎縜縕縚縢縋縏縖縍縔縥縤罃罻罼罺羱翯耪耩聬膱膦膮膹膵膫膰膬膴膲膷膧臲艕艖艗蕖蕅蕫蕍蕓蕡蕘�".split("");
  769. for(j = 0; j != D[234].length; ++j) if(D[234][j].charCodeAt(0) !== 0xFFFD) { e[D[234][j]] = 59904 + j; d[59904 + j] = D[234][j];}
  770. D[235] = "����������������������������������������������������������������蕀蕆蕤蕁蕢蕄蕑蕇蕣蔾蕛蕱蕎蕮蕵蕕蕧蕠薌蕦蕝蕔蕥蕬虣虥虤螛螏螗螓螒螈螁螖螘蝹螇螣螅螐螑螝螄螔螜螚螉褞褦褰褭褮褧褱褢褩褣褯褬褟觱諠����������������������������������諢諲諴諵諝謔諤諟諰諈諞諡諨諿諯諻貑貒貐賵賮賱賰賳赬赮趥趧踳踾踸蹀蹅踶踼踽蹁踰踿躽輶輮輵輲輹輷輴遶遹遻邆郺鄳鄵鄶醓醐醑醍醏錧錞錈錟錆錏鍺錸錼錛錣錒錁鍆錭錎錍鋋錝鋺錥錓鋹鋷錴錂錤鋿錩錹錵錪錔錌�".split("");
  771. for(j = 0; j != D[235].length; ++j) if(D[235][j].charCodeAt(0) !== 0xFFFD) { e[D[235][j]] = 60160 + j; d[60160 + j] = D[235][j];}
  772. D[236] = "����������������������������������������������������������������錋鋾錉錀鋻錖閼闍閾閹閺閶閿閵閽隩雔霋霒霐鞙鞗鞔韰韸頵頯頲餤餟餧餩馞駮駬駥駤駰駣駪駩駧骹骿骴骻髶髺髹髷鬳鮀鮅鮇魼魾魻鮂鮓鮒鮐魺鮕����������������������������������魽鮈鴥鴗鴠鴞鴔鴩鴝鴘鴢鴐鴙鴟麈麆麇麮麭黕黖黺鼒鼽儦儥儢儤儠儩勴嚓嚌嚍嚆嚄嚃噾嚂噿嚁壖壔壏壒嬭嬥嬲嬣嬬嬧嬦嬯嬮孻寱寲嶷幬幪徾徻懃憵憼懧懠懥懤懨懞擯擩擣擫擤擨斁斀斶旚曒檍檖檁檥檉檟檛檡檞檇檓檎�".split("");
  773. for(j = 0; j != D[236].length; ++j) if(D[236][j].charCodeAt(0) !== 0xFFFD) { e[D[236][j]] = 60416 + j; d[60416 + j] = D[236][j];}
  774. D[237] = "����������������������������������������������������������������檕檃檨檤檑橿檦檚檅檌檒歛殭氉濌澩濴濔濣濜濭濧濦濞濲濝濢濨燡燱燨燲燤燰燢獳獮獯璗璲璫璐璪璭璱璥璯甐甑甒甏疄癃癈癉癇皤盩瞵瞫瞲瞷瞶����������������������������������瞴瞱瞨矰磳磽礂磻磼磲礅磹磾礄禫禨穜穛穖穘穔穚窾竀竁簅簏篲簀篿篻簎篴簋篳簂簉簃簁篸篽簆篰篱簐簊糨縭縼繂縳顈縸縪繉繀繇縩繌縰縻縶繄縺罅罿罾罽翴翲耬膻臄臌臊臅臇膼臩艛艚艜薃薀薏薧薕薠薋薣蕻薤薚薞�".split("");
  775. for(j = 0; j != D[237].length; ++j) if(D[237][j].charCodeAt(0) !== 0xFFFD) { e[D[237][j]] = 60672 + j; d[60672 + j] = D[237][j];}
  776. D[238] = "����������������������������������������������������������������蕷蕼薉薡蕺蕸蕗薎薖薆薍薙薝薁薢薂薈薅蕹蕶薘薐薟虨螾螪螭蟅螰螬螹螵螼螮蟉蟃蟂蟌螷螯蟄蟊螴螶螿螸螽蟞螲褵褳褼褾襁襒褷襂覭覯覮觲觳謞����������������������������������謘謖謑謅謋謢謏謒謕謇謍謈謆謜謓謚豏豰豲豱豯貕貔賹赯蹎蹍蹓蹐蹌蹇轃轀邅遾鄸醚醢醛醙醟醡醝醠鎡鎃鎯鍤鍖鍇鍼鍘鍜鍶鍉鍐鍑鍠鍭鎏鍌鍪鍹鍗鍕鍒鍏鍱鍷鍻鍡鍞鍣鍧鎀鍎鍙闇闀闉闃闅閷隮隰隬霠霟霘霝霙鞚鞡鞜�".split("");
  777. for(j = 0; j != D[238].length; ++j) if(D[238][j].charCodeAt(0) !== 0xFFFD) { e[D[238][j]] = 60928 + j; d[60928 + j] = D[238][j];}
  778. D[239] = "����������������������������������������������������������������鞞鞝韕韔韱顁顄顊顉顅顃餥餫餬餪餳餲餯餭餱餰馘馣馡騂駺駴駷駹駸駶駻駽駾駼騃骾髾髽鬁髼魈鮚鮨鮞鮛鮦鮡鮥鮤鮆鮢鮠鮯鴳鵁鵧鴶鴮鴯鴱鴸鴰����������������������������������鵅鵂鵃鴾鴷鵀鴽翵鴭麊麉麍麰黈黚黻黿鼤鼣鼢齔龠儱儭儮嚘嚜嚗嚚嚝嚙奰嬼屩屪巀幭幮懘懟懭懮懱懪懰懫懖懩擿攄擽擸攁攃擼斔旛曚曛曘櫅檹檽櫡櫆檺檶檷櫇檴檭歞毉氋瀇瀌瀍瀁瀅瀔瀎濿瀀濻瀦濼濷瀊爁燿燹爃燽獶�".split("");
  779. for(j = 0; j != D[239].length; ++j) if(D[239][j].charCodeAt(0) !== 0xFFFD) { e[D[239][j]] = 61184 + j; d[61184 + j] = D[239][j];}
  780. D[240] = "����������������������������������������������������������������璸瓀璵瓁璾璶璻瓂甔甓癜癤癙癐癓癗癚皦皽盬矂瞺磿礌礓礔礉礐礒礑禭禬穟簜簩簙簠簟簭簝簦簨簢簥簰繜繐繖繣繘繢繟繑繠繗繓羵羳翷翸聵臑臒����������������������������������臐艟艞薴藆藀藃藂薳薵薽藇藄薿藋藎藈藅薱薶藒蘤薸薷薾虩蟧蟦蟢蟛蟫蟪蟥蟟蟳蟤蟔蟜蟓蟭蟘蟣螤蟗蟙蠁蟴蟨蟝襓襋襏襌襆襐襑襉謪謧謣謳謰謵譇謯謼謾謱謥謷謦謶謮謤謻謽謺豂豵貙貘貗賾贄贂贀蹜蹢蹠蹗蹖蹞蹥蹧�".split("");
  781. for(j = 0; j != D[240].length; ++j) if(D[240][j].charCodeAt(0) !== 0xFFFD) { e[D[240][j]] = 61440 + j; d[61440 + j] = D[240][j];}
  782. D[241] = "����������������������������������������������������������������蹛蹚蹡蹝蹩蹔轆轇轈轋鄨鄺鄻鄾醨醥醧醯醪鎵鎌鎒鎷鎛鎝鎉鎧鎎鎪鎞鎦鎕鎈鎙鎟鎍鎱鎑鎲鎤鎨鎴鎣鎥闒闓闑隳雗雚巂雟雘雝霣霢霥鞬鞮鞨鞫鞤鞪����������������������������������鞢鞥韗韙韖韘韺顐顑顒颸饁餼餺騏騋騉騍騄騑騊騅騇騆髀髜鬈鬄鬅鬩鬵魊魌魋鯇鯆鯃鮿鯁鮵鮸鯓鮶鯄鮹鮽鵜鵓鵏鵊鵛鵋鵙鵖鵌鵗鵒鵔鵟鵘鵚麎麌黟鼁鼀鼖鼥鼫鼪鼩鼨齌齕儴儵劖勷厴嚫嚭嚦嚧嚪嚬壚壝壛夒嬽嬾嬿巃幰�".split("");
  783. for(j = 0; j != D[241].length; ++j) if(D[241][j].charCodeAt(0) !== 0xFFFD) { e[D[241][j]] = 61696 + j; d[61696 + j] = D[241][j];}
  784. D[242] = "����������������������������������������������������������������徿懻攇攐攍攉攌攎斄旞旝曞櫧櫠櫌櫑櫙櫋櫟櫜櫐櫫櫏櫍櫞歠殰氌瀙瀧瀠瀖瀫瀡瀢瀣瀩瀗瀤瀜瀪爌爊爇爂爅犥犦犤犣犡瓋瓅璷瓃甖癠矉矊矄矱礝礛����������������������������������礡礜礗礞禰穧穨簳簼簹簬簻糬糪繶繵繸繰繷繯繺繲繴繨罋罊羃羆羷翽翾聸臗臕艤艡艣藫藱藭藙藡藨藚藗藬藲藸藘藟藣藜藑藰藦藯藞藢蠀蟺蠃蟶蟷蠉蠌蠋蠆蟼蠈蟿蠊蠂襢襚襛襗襡襜襘襝襙覈覷覶觶譐譈譊譀譓譖譔譋譕�".split("");
  785. for(j = 0; j != D[242].length; ++j) if(D[242][j].charCodeAt(0) !== 0xFFFD) { e[D[242][j]] = 61952 + j; d[61952 + j] = D[242][j];}
  786. D[243] = "����������������������������������������������������������������譑譂譒譗豃豷豶貚贆贇贉趬趪趭趫蹭蹸蹳蹪蹯蹻軂轒轑轏轐轓辴酀鄿醰醭鏞鏇鏏鏂鏚鏐鏹鏬鏌鏙鎩鏦鏊鏔鏮鏣鏕鏄鏎鏀鏒鏧镽闚闛雡霩霫霬霨霦����������������������������������鞳鞷鞶韝韞韟顜顙顝顗颿颽颻颾饈饇饃馦馧騚騕騥騝騤騛騢騠騧騣騞騜騔髂鬋鬊鬎鬌鬷鯪鯫鯠鯞鯤鯦鯢鯰鯔鯗鯬鯜鯙鯥鯕鯡鯚鵷鶁鶊鶄鶈鵱鶀鵸鶆鶋鶌鵽鵫鵴鵵鵰鵩鶅鵳鵻鶂鵯鵹鵿鶇鵨麔麑黀黼鼭齀齁齍齖齗齘匷嚲�".split("");
  787. for(j = 0; j != D[243].length; ++j) if(D[243][j].charCodeAt(0) !== 0xFFFD) { e[D[243][j]] = 62208 + j; d[62208 + j] = D[243][j];}
  788. D[244] = "����������������������������������������������������������������嚵嚳壣孅巆巇廮廯忀忁懹攗攖攕攓旟曨曣曤櫳櫰櫪櫨櫹櫱櫮櫯瀼瀵瀯瀷瀴瀱灂瀸瀿瀺瀹灀瀻瀳灁爓爔犨獽獼璺皫皪皾盭矌矎矏矍矲礥礣礧礨礤礩����������������������������������禲穮穬穭竷籉籈籊籇籅糮繻繾纁纀羺翿聹臛臙舋艨艩蘢藿蘁藾蘛蘀藶蘄蘉蘅蘌藽蠙蠐蠑蠗蠓蠖襣襦覹觷譠譪譝譨譣譥譧譭趮躆躈躄轙轖轗轕轘轚邍酃酁醷醵醲醳鐋鐓鏻鐠鐏鐔鏾鐕鐐鐨鐙鐍鏵鐀鏷鐇鐎鐖鐒鏺鐉鏸鐊鏿�".split("");
  789. for(j = 0; j != D[244].length; ++j) if(D[244][j].charCodeAt(0) !== 0xFFFD) { e[D[244][j]] = 62464 + j; d[62464 + j] = D[244][j];}
  790. D[245] = "����������������������������������������������������������������鏼鐌鏶鐑鐆闞闠闟霮霯鞹鞻韽韾顠顢顣顟飁飂饐饎饙饌饋饓騲騴騱騬騪騶騩騮騸騭髇髊髆鬐鬒鬑鰋鰈鯷鰅鰒鯸鱀鰇鰎鰆鰗鰔鰉鶟鶙鶤鶝鶒鶘鶐鶛����������������������������������鶠鶔鶜鶪鶗鶡鶚鶢鶨鶞鶣鶿鶩鶖鶦鶧麙麛麚黥黤黧黦鼰鼮齛齠齞齝齙龑儺儹劘劗囃嚽嚾孈孇巋巏廱懽攛欂櫼欃櫸欀灃灄灊灈灉灅灆爝爚爙獾甗癪矐礭礱礯籔籓糲纊纇纈纋纆纍罍羻耰臝蘘蘪蘦蘟蘣蘜蘙蘧蘮蘡蘠蘩蘞蘥�".split("");
  791. for(j = 0; j != D[245].length; ++j) if(D[245][j].charCodeAt(0) !== 0xFFFD) { e[D[245][j]] = 62720 + j; d[62720 + j] = D[245][j];}
  792. D[246] = "����������������������������������������������������������������蠩蠝蠛蠠蠤蠜蠫衊襭襩襮襫觺譹譸譅譺譻贐贔趯躎躌轞轛轝酆酄酅醹鐿鐻鐶鐩鐽鐼鐰鐹鐪鐷鐬鑀鐱闥闤闣霵霺鞿韡顤飉飆飀饘饖騹騽驆驄驂驁騺����������������������������������騿髍鬕鬗鬘鬖鬺魒鰫鰝鰜鰬鰣鰨鰩鰤鰡鶷鶶鶼鷁鷇鷊鷏鶾鷅鷃鶻鶵鷎鶹鶺鶬鷈鶱鶭鷌鶳鷍鶲鹺麜黫黮黭鼛鼘鼚鼱齎齥齤龒亹囆囅囋奱孋孌巕巑廲攡攠攦攢欋欈欉氍灕灖灗灒爞爟犩獿瓘瓕瓙瓗癭皭礵禴穰穱籗籜籙籛籚�".split("");
  793. for(j = 0; j != D[246].length; ++j) if(D[246][j].charCodeAt(0) !== 0xFFFD) { e[D[246][j]] = 62976 + j; d[62976 + j] = D[246][j];}
  794. D[247] = "����������������������������������������������������������������糴糱纑罏羇臞艫蘴蘵蘳蘬蘲蘶蠬蠨蠦蠪蠥襱覿覾觻譾讄讂讆讅譿贕躕躔躚躒躐躖躗轠轢酇鑌鑐鑊鑋鑏鑇鑅鑈鑉鑆霿韣顪顩飋饔饛驎驓驔驌驏驈驊����������������������������������驉驒驐髐鬙鬫鬻魖魕鱆鱈鰿鱄鰹鰳鱁鰼鰷鰴鰲鰽鰶鷛鷒鷞鷚鷋鷐鷜鷑鷟鷩鷙鷘鷖鷵鷕鷝麶黰鼵鼳鼲齂齫龕龢儽劙壨壧奲孍巘蠯彏戁戃戄攩攥斖曫欑欒欏毊灛灚爢玂玁玃癰矔籧籦纕艬蘺虀蘹蘼蘱蘻蘾蠰蠲蠮蠳襶襴襳觾�".split("");
  795. for(j = 0; j != D[247].length; ++j) if(D[247][j].charCodeAt(0) !== 0xFFFD) { e[D[247][j]] = 63232 + j; d[63232 + j] = D[247][j];}
  796. D[248] = "����������������������������������������������������������������讌讎讋讈豅贙躘轤轣醼鑢鑕鑝鑗鑞韄韅頀驖驙鬞鬟鬠鱒鱘鱐鱊鱍鱋鱕鱙鱌鱎鷻鷷鷯鷣鷫鷸鷤鷶鷡鷮鷦鷲鷰鷢鷬鷴鷳鷨鷭黂黐黲黳鼆鼜鼸鼷鼶齃齏����������������������������������齱齰齮齯囓囍孎屭攭曭曮欓灟灡灝灠爣瓛瓥矕礸禷禶籪纗羉艭虃蠸蠷蠵衋讔讕躞躟躠躝醾醽釂鑫鑨鑩雥靆靃靇韇韥驞髕魙鱣鱧鱦鱢鱞鱠鸂鷾鸇鸃鸆鸅鸀鸁鸉鷿鷽鸄麠鼞齆齴齵齶囔攮斸欘欙欗欚灢爦犪矘矙礹籩籫糶纚�".split("");
  797. for(j = 0; j != D[248].length; ++j) if(D[248][j].charCodeAt(0) !== 0xFFFD) { e[D[248][j]] = 63488 + j; d[63488 + j] = D[248][j];}
  798. D[249] = "����������������������������������������������������������������纘纛纙臠臡虆虇虈襹襺襼襻觿讘讙躥躤躣鑮鑭鑯鑱鑳靉顲饟鱨鱮鱭鸋鸍鸐鸏鸒鸑麡黵鼉齇齸齻齺齹圞灦籯蠼趲躦釃鑴鑸鑶鑵驠鱴鱳鱱鱵鸔鸓黶鼊����������������������������������龤灨灥糷虪蠾蠽蠿讞貜躩軉靋顳顴飌饡馫驤驦驧鬤鸕鸗齈戇欞爧虌躨钂钀钁驩驨鬮鸙爩虋讟钃鱹麷癵驫鱺鸝灩灪麤齾齉龘碁銹裏墻恒粧嫺╔╦╗╠╬╣╚╩╝╒╤╕╞╪╡╘╧╛╓╥╖╟╫╢╙╨╜║═╭╮╰╯▓�".split("");
  799. for(j = 0; j != D[249].length; ++j) if(D[249][j].charCodeAt(0) !== 0xFFFD) { e[D[249][j]] = 63744 + j; d[63744 + j] = D[249][j];}
  800. return {"enc": e, "dec": d }; })();
  801. cptable[1250] = (function(){ var d = "\u0000\u0001\u0002\u0003\u0004\u0005\u0006\u0007\b\t\n\u000b\f\r\u000e\u000f\u0010\u0011\u0012\u0013\u0014\u0015\u0016\u0017\u0018\u0019\u001a\u001b\u001c\u001d\u001e\u001f !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~€�‚�„…†‡�‰Š‹ŚŤŽŹ�‘’“”•–—�™š›śťžź ˇ˘Ł¤Ą¦§¨©Ş«¬­®Ż°±˛ł´µ¶·¸ąş»Ľ˝ľżŔÁÂĂÄĹĆÇČÉĘËĚÍÎĎĐŃŇÓÔŐÖ×ŘŮÚŰÜÝŢßŕáâăäĺćçčéęëěíîďđńňóôőö÷řůúűüýţ˙", D = [], e = {}; for(var i=0;i!=d.length;++i) { if(d.charCodeAt(i) !== 0xFFFD) e[d.charAt(i)] = i; D[i] = d.charAt(i); } return {"enc": e, "dec": D }; })();
  802. cptable[1251] = (function(){ var d = "\u0000\u0001\u0002\u0003\u0004\u0005\u0006\u0007\b\t\n\u000b\f\r\u000e\u000f\u0010\u0011\u0012\u0013\u0014\u0015\u0016\u0017\u0018\u0019\u001a\u001b\u001c\u001d\u001e\u001f !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~ЂЃ‚ѓ„…†‡€‰Љ‹ЊЌЋЏђ‘’“”•–—�™љ›њќћџ ЎўЈ¤Ґ¦§Ё©Є«¬­®Ї°±Ііґµ¶·ё№є»јЅѕїАБВГДЕЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯабвгдежзийклмнопрстуфхцчшщъыьэюя", D = [], e = {}; for(var i=0;i!=d.length;++i) { if(d.charCodeAt(i) !== 0xFFFD) e[d.charAt(i)] = i; D[i] = d.charAt(i); } return {"enc": e, "dec": D }; })();
  803. cptable[1252] = (function(){ var d = "\u0000\u0001\u0002\u0003\u0004\u0005\u0006\u0007\b\t\n\u000b\f\r\u000e\u000f\u0010\u0011\u0012\u0013\u0014\u0015\u0016\u0017\u0018\u0019\u001a\u001b\u001c\u001d\u001e\u001f !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~€�‚ƒ„…†‡ˆ‰Š‹Œ�Ž��‘’“”•–—˜™š›œ�žŸ ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ", D = [], e = {}; for(var i=0;i!=d.length;++i) { if(d.charCodeAt(i) !== 0xFFFD) e[d.charAt(i)] = i; D[i] = d.charAt(i); } return {"enc": e, "dec": D }; })();
  804. cptable[1253] = (function(){ var d = "\u0000\u0001\u0002\u0003\u0004\u0005\u0006\u0007\b\t\n\u000b\f\r\u000e\u000f\u0010\u0011\u0012\u0013\u0014\u0015\u0016\u0017\u0018\u0019\u001a\u001b\u001c\u001d\u001e\u001f !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~€�‚ƒ„…†‡�‰�‹�����‘’“”•–—�™�›���� ΅Ά£¤¥¦§¨©�«¬­®―°±²³΄µ¶·ΈΉΊ»Ό½ΎΏΐΑΒΓΔΕΖΗΘΙΚΛΜΝΞΟΠΡ�ΣΤΥΦΧΨΩΪΫάέήίΰαβγδεζηθικλμνξοπρςστυφχψωϊϋόύώ�", D = [], e = {}; for(var i=0;i!=d.length;++i) { if(d.charCodeAt(i) !== 0xFFFD) e[d.charAt(i)] = i; D[i] = d.charAt(i); } return {"enc": e, "dec": D }; })();
  805. cptable[1254] = (function(){ var d = "\u0000\u0001\u0002\u0003\u0004\u0005\u0006\u0007\b\t\n\u000b\f\r\u000e\u000f\u0010\u0011\u0012\u0013\u0014\u0015\u0016\u0017\u0018\u0019\u001a\u001b\u001c\u001d\u001e\u001f !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~€�‚ƒ„…†‡ˆ‰Š‹Œ����‘’“”•–—˜™š›œ��Ÿ ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏĞÑÒÓÔÕÖ×ØÙÚÛÜİŞßàáâãäåæçèéêëìíîïğñòóôõö÷øùúûüışÿ", D = [], e = {}; for(var i=0;i!=d.length;++i) { if(d.charCodeAt(i) !== 0xFFFD) e[d.charAt(i)] = i; D[i] = d.charAt(i); } return {"enc": e, "dec": D }; })();
  806. cptable[1255] = (function(){ var d = "\u0000\u0001\u0002\u0003\u0004\u0005\u0006\u0007\b\t\n\u000b\f\r\u000e\u000f\u0010\u0011\u0012\u0013\u0014\u0015\u0016\u0017\u0018\u0019\u001a\u001b\u001c\u001d\u001e\u001f !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~€�‚ƒ„…†‡ˆ‰�‹�����‘’“”•–—˜™�›���� ¡¢£₪¥¦§¨©×«¬­®¯°±²³´µ¶·¸¹÷»¼½¾¿ְֱֲֳִֵֶַָֹ�ֻּֽ־ֿ׀ׁׂ׃װױײ׳״�������אבגדהוזחטיךכלםמןנסעףפץצקרשת��‎‏�", D = [], e = {}; for(var i=0;i!=d.length;++i) { if(d.charCodeAt(i) !== 0xFFFD) e[d.charAt(i)] = i; D[i] = d.charAt(i); } return {"enc": e, "dec": D }; })();
  807. cptable[1256] = (function(){ var d = "\u0000\u0001\u0002\u0003\u0004\u0005\u0006\u0007\b\t\n\u000b\f\r\u000e\u000f\u0010\u0011\u0012\u0013\u0014\u0015\u0016\u0017\u0018\u0019\u001a\u001b\u001c\u001d\u001e\u001f !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~€پ‚ƒ„…†‡ˆ‰ٹ‹Œچژڈگ‘’“”•–—ک™ڑ›œ‌‍ں ،¢£¤¥¦§¨©ھ«¬­®¯°±²³´µ¶·¸¹؛»¼½¾؟ہءآأؤإئابةتثجحخدذرزسشصض×طظعغـفقكàلâمنهوçèéêëىيîïًٌٍَôُِ÷ّùْûü‎‏ے", D = [], e = {}; for(var i=0;i!=d.length;++i) { if(d.charCodeAt(i) !== 0xFFFD) e[d.charAt(i)] = i; D[i] = d.charAt(i); } return {"enc": e, "dec": D }; })();
  808. cptable[1257] = (function(){ var d = "\u0000\u0001\u0002\u0003\u0004\u0005\u0006\u0007\b\t\n\u000b\f\r\u000e\u000f\u0010\u0011\u0012\u0013\u0014\u0015\u0016\u0017\u0018\u0019\u001a\u001b\u001c\u001d\u001e\u001f !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~€�‚�„…†‡�‰�‹�¨ˇ¸�‘’“”•–—�™�›�¯˛� �¢£¤�¦§Ø©Ŗ«¬­®Æ°±²³´µ¶·ø¹ŗ»¼½¾æĄĮĀĆÄÅĘĒČÉŹĖĢĶĪĻŠŃŅÓŌÕÖ×ŲŁŚŪÜŻŽßąįāćäåęēčéźėģķīļšńņóōõö÷ųłśūüżž˙", D = [], e = {}; for(var i=0;i!=d.length;++i) { if(d.charCodeAt(i) !== 0xFFFD) e[d.charAt(i)] = i; D[i] = d.charAt(i); } return {"enc": e, "dec": D }; })();
  809. cptable[1258] = (function(){ var d = "\u0000\u0001\u0002\u0003\u0004\u0005\u0006\u0007\b\t\n\u000b\f\r\u000e\u000f\u0010\u0011\u0012\u0013\u0014\u0015\u0016\u0017\u0018\u0019\u001a\u001b\u001c\u001d\u001e\u001f !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~€�‚ƒ„…†‡ˆ‰�‹Œ����‘’“”•–—˜™�›œ��Ÿ ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂĂÄÅÆÇÈÉÊË̀ÍÎÏĐÑ̉ÓÔƠÖ×ØÙÚÛÜỮßàáâăäåæçèéêë́íîïđṇ̃óôơö÷øùúûüư₫ÿ", D = [], e = {}; for(var i=0;i!=d.length;++i) { if(d.charCodeAt(i) !== 0xFFFD) e[d.charAt(i)] = i; D[i] = d.charAt(i); } return {"enc": e, "dec": D }; })();
  810. cptable[10000] = (function(){ var d = "\u0000\u0001\u0002\u0003\u0004\u0005\u0006\u0007\b\t\n\u000b\f\r\u000e\u000f\u0010\u0011\u0012\u0013\u0014\u0015\u0016\u0017\u0018\u0019\u001a\u001b\u001c\u001d\u001e\u001f !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~ÄÅÇÉÑÖÜáàâäãåçéèêëíìîïñóòôöõúùûü†°¢£§•¶ß®©™´¨≠ÆØ∞±≤≥¥µ∂∑∏π∫ªºΩæø¿¡¬√ƒ≈∆«»… ÀÃÕŒœ–—“”‘’÷◊ÿŸ⁄¤‹›fifl‡·‚„‰ÂÊÁËÈÍÎÏÌÓÔ�ÒÚÛÙıˆ˜¯˘˙˚¸˝˛ˇ", D = [], e = {}; for(var i=0;i!=d.length;++i) { if(d.charCodeAt(i) !== 0xFFFD) e[d.charAt(i)] = i; D[i] = d.charAt(i); } return {"enc": e, "dec": D }; })();
  811. cptable[10006] = (function(){ var d = "\u0000\u0001\u0002\u0003\u0004\u0005\u0006\u0007\b\t\n\u000b\f\r\u000e\u000f\u0010\u0011\u0012\u0013\u0014\u0015\u0016\u0017\u0018\u0019\u001a\u001b\u001c\u001d\u001e\u001f !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~Ĺ²É³ÖÜ΅àâä΄¨çéèê룙î‰ôö¦­ùûü†ΓΔΘΛΞΠß®©ΣΪ§≠°·Α±≤≥¥ΒΕΖΗΙΚΜΦΫΨΩάΝ¬ΟΡ≈Τ«»… ΥΧΆΈœ–―“”‘’÷ΉΊΌΎέήίόΏύαβψδεφγηιξκλμνοπώρστθωςχυζϊϋΐΰ�", D = [], e = {}; for(var i=0;i!=d.length;++i) { if(d.charCodeAt(i) !== 0xFFFD) e[d.charAt(i)] = i; D[i] = d.charAt(i); } return {"enc": e, "dec": D }; })();
  812. cptable[10007] = (function(){ var d = "\u0000\u0001\u0002\u0003\u0004\u0005\u0006\u0007\b\t\n\u000b\f\r\u000e\u000f\u0010\u0011\u0012\u0013\u0014\u0015\u0016\u0017\u0018\u0019\u001a\u001b\u001c\u001d\u001e\u001f !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~АБВГДЕЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯ†°¢£§•¶І®©™Ђђ≠Ѓѓ∞±≤≥іµ∂ЈЄєЇїЉљЊњјЅ¬√ƒ≈∆«»… ЋћЌќѕ–—“”‘’÷„ЎўЏџ№Ёёяабвгдежзийклмнопрстуфхцчшщъыьэю¤", D = [], e = {}; for(var i=0;i!=d.length;++i) { if(d.charCodeAt(i) !== 0xFFFD) e[d.charAt(i)] = i; D[i] = d.charAt(i); } return {"enc": e, "dec": D }; })();
  813. cptable[10008] = (function(){ var d = [], e = {}, D = [], j;
  814. D[0] = "\u0000\u0001\u0002\u0003\u0004\u0005\u0006\u0007\b\t\n\u000b\f\r\u000e\u000f\u0010\u0011\u0012\u0013\u0014\u0015\u0016\u0017\u0018\u0019\u001a\u001b\u001c\u001d\u001e\u001f !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~€���������������������������������������������������������������������������������������".split("");
  815. for(j = 0; j != D[0].length; ++j) if(D[0][j].charCodeAt(0) !== 0xFFFD) { e[D[0][j]] = 0 + j; d[0 + j] = D[0][j];}
  816. D[161] = "����������������������������������������������������������������������������������������������������������������������������������������������������������������� 、。・ˉˇ¨〃々―~�…‘’“”〔〕〈〉《》「」『』〖〗【】±×÷∶∧∨∑∏∪∩∈∷√⊥∥∠⌒⊙∫∮≡≌≈∽∝≠≮≯≤≥∞∵∴♂♀°′″℃$¤¢£‰§№☆★○●◎◇◆□■△▲※→←↑↓〓�".split("");
  817. for(j = 0; j != D[161].length; ++j) if(D[161][j].charCodeAt(0) !== 0xFFFD) { e[D[161][j]] = 41216 + j; d[41216 + j] = D[161][j];}
  818. D[162] = "���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������⒈⒉⒊⒋⒌⒍⒎⒏⒐⒑⒒⒓⒔⒕⒖⒗⒘⒙⒚⒛⑴⑵⑶⑷⑸⑹⑺⑻⑼⑽⑾⑿⒀⒁⒂⒃⒄⒅⒆⒇①②③④⑤⑥⑦⑧⑨⑩��㈠㈡㈢㈣㈤㈥㈦㈧㈨㈩��ⅠⅡⅢⅣⅤⅥⅦⅧⅨⅩⅪⅫ���".split("");
  819. for(j = 0; j != D[162].length; ++j) if(D[162][j].charCodeAt(0) !== 0xFFFD) { e[D[162][j]] = 41472 + j; d[41472 + j] = D[162][j];}
  820. D[163] = "�����������������������������������������������������������������������������������������������������������������������������������������������������������������!"#¥%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|} ̄�".split("");
  821. for(j = 0; j != D[163].length; ++j) if(D[163][j].charCodeAt(0) !== 0xFFFD) { e[D[163][j]] = 41728 + j; d[41728 + j] = D[163][j];}
  822. D[164] = "�����������������������������������������������������������������������������������������������������������������������������������������������������������������ぁあぃいぅうぇえぉおかがきぎくぐけげこごさざしじすずせぜそぞただちぢっつづてでとどなにぬねのはばぱひびぴふぶぷへべぺほぼぽまみむめもゃやゅゆょよらりるれろゎわゐゑをん������������".split("");
  823. for(j = 0; j != D[164].length; ++j) if(D[164][j].charCodeAt(0) !== 0xFFFD) { e[D[164][j]] = 41984 + j; d[41984 + j] = D[164][j];}
  824. D[165] = "�����������������������������������������������������������������������������������������������������������������������������������������������������������������ァアィイゥウェエォオカガキギクグケゲコゴサザシジスズセゼソゾタダチヂッツヅテデトドナニヌネノハバパヒビピフブプヘベペホボポマミムメモャヤュユョヨラリルレロヮワヰヱヲンヴヵヶ���������".split("");
  825. for(j = 0; j != D[165].length; ++j) if(D[165][j].charCodeAt(0) !== 0xFFFD) { e[D[165][j]] = 42240 + j; d[42240 + j] = D[165][j];}
  826. D[166] = "�����������������������������������������������������������������������������������������������������������������������������������������������������������������ΑΒΓΔΕΖΗΘΙΚΛΜΝΞΟΠΡΣΤΥΦΧΨΩ��������αβγδεζηθικλμνξοπρστυφχψω���������������������������������������".split("");
  827. for(j = 0; j != D[166].length; ++j) if(D[166][j].charCodeAt(0) !== 0xFFFD) { e[D[166][j]] = 42496 + j; d[42496 + j] = D[166][j];}
  828. D[167] = "�����������������������������������������������������������������������������������������������������������������������������������������������������������������АБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯ���������������абвгдеёжзийклмнопрстуфхцчшщъыьэюя��������������".split("");
  829. for(j = 0; j != D[167].length; ++j) if(D[167][j].charCodeAt(0) !== 0xFFFD) { e[D[167][j]] = 42752 + j; d[42752 + j] = D[167][j];}
  830. D[168] = "�����������������������������������������������������������������������������������������������������������������������������������������������������������������āáǎàēéěèīíǐìōóǒòūúǔùǖǘǚǜüê����������ㄅㄆㄇㄈㄉㄊㄋㄌㄍㄎㄏㄐㄑㄒㄓㄔㄕㄖㄗㄘㄙㄚㄛㄜㄝㄞㄟㄠㄡㄢㄣㄤㄥㄦㄧㄨㄩ����������������������".split("");
  831. for(j = 0; j != D[168].length; ++j) if(D[168][j].charCodeAt(0) !== 0xFFFD) { e[D[168][j]] = 43008 + j; d[43008 + j] = D[168][j];}
  832. D[169] = "��������������������������������������������������������������������������������������������������������������������������������������������������������������������─━│┃┄┅┆┇┈┉┊┋┌┍┎┏┐┑┒┓└┕┖┗┘┙┚┛├┝┞┟┠┡┢┣┤┥┦┧┨┩┪┫┬┭┮┯┰┱┲┳┴┵┶┷┸┹┺┻┼┽┾┿╀╁╂╃╄╅╆╇╈╉╊╋����������������".split("");
  833. for(j = 0; j != D[169].length; ++j) if(D[169][j].charCodeAt(0) !== 0xFFFD) { e[D[169][j]] = 43264 + j; d[43264 + j] = D[169][j];}
  834. D[176] = "�����������������������������������������������������������������������������������������������������������������������������������������������������������������啊阿埃挨哎唉哀皑癌蔼矮艾碍爱隘鞍氨安俺按暗岸胺案肮昂盎凹敖熬翱袄傲奥懊澳芭捌扒叭吧笆八疤巴拔跋靶把耙坝霸罢爸白柏百摆佰败拜稗斑班搬扳般颁板版扮拌伴瓣半办绊邦帮梆榜膀绑棒磅蚌镑傍谤苞胞包褒剥�".split("");
  835. for(j = 0; j != D[176].length; ++j) if(D[176][j].charCodeAt(0) !== 0xFFFD) { e[D[176][j]] = 45056 + j; d[45056 + j] = D[176][j];}
  836. D[177] = "�����������������������������������������������������������������������������������������������������������������������������������������������������������������薄雹保堡饱宝抱报暴豹鲍爆杯碑悲卑北辈背贝钡倍狈备惫焙被奔苯本笨崩绷甭泵蹦迸逼鼻比鄙笔彼碧蓖蔽毕毙毖币庇痹闭敝弊必辟壁臂避陛鞭边编贬扁便变卞辨辩辫遍标彪膘表鳖憋别瘪彬斌濒滨宾摈兵冰柄丙秉饼炳�".split("");
  837. for(j = 0; j != D[177].length; ++j) if(D[177][j].charCodeAt(0) !== 0xFFFD) { e[D[177][j]] = 45312 + j; d[45312 + j] = D[177][j];}
  838. D[178] = "�����������������������������������������������������������������������������������������������������������������������������������������������������������������病并玻菠播拨钵波博勃搏铂箔伯帛舶脖膊渤泊驳捕卜哺补埠不布步簿部怖擦猜裁材才财睬踩采彩菜蔡餐参蚕残惭惨灿苍舱仓沧藏操糙槽曹草厕策侧册测层蹭插叉茬茶查碴搽察岔差诧拆柴豺搀掺蝉馋谗缠铲产阐颤昌猖�".split("");
  839. for(j = 0; j != D[178].length; ++j) if(D[178][j].charCodeAt(0) !== 0xFFFD) { e[D[178][j]] = 45568 + j; d[45568 + j] = D[178][j];}
  840. D[179] = "�����������������������������������������������������������������������������������������������������������������������������������������������������������������场尝常长偿肠厂敞畅唱倡超抄钞朝嘲潮巢吵炒车扯撤掣彻澈郴臣辰尘晨忱沉陈趁衬撑称城橙成呈乘程惩澄诚承逞骋秤吃痴持匙池迟弛驰耻齿侈尺赤翅斥炽充冲虫崇宠抽酬畴踌稠愁筹仇绸瞅丑臭初出橱厨躇锄雏滁除楚�".split("");
  841. for(j = 0; j != D[179].length; ++j) if(D[179][j].charCodeAt(0) !== 0xFFFD) { e[D[179][j]] = 45824 + j; d[45824 + j] = D[179][j];}
  842. D[180] = "�����������������������������������������������������������������������������������������������������������������������������������������������������������������础储矗搐触处揣川穿椽传船喘串疮窗幢床闯创吹炊捶锤垂春椿醇唇淳纯蠢戳绰疵茨磁雌辞慈瓷词此刺赐次聪葱囱匆从丛凑粗醋簇促蹿篡窜摧崔催脆瘁粹淬翠村存寸磋撮搓措挫错搭达答瘩打大呆歹傣戴带殆代贷袋待逮�".split("");
  843. for(j = 0; j != D[180].length; ++j) if(D[180][j].charCodeAt(0) !== 0xFFFD) { e[D[180][j]] = 46080 + j; d[46080 + j] = D[180][j];}
  844. D[181] = "�����������������������������������������������������������������������������������������������������������������������������������������������������������������怠耽担丹单郸掸胆旦氮但惮淡诞弹蛋当挡党荡档刀捣蹈倒岛祷导到稻悼道盗德得的蹬灯登等瞪凳邓堤低滴迪敌笛狄涤翟嫡抵底地蒂第帝弟递缔颠掂滇碘点典靛垫电佃甸店惦奠淀殿碉叼雕凋刁掉吊钓调跌爹碟蝶迭谍叠�".split("");
  845. for(j = 0; j != D[181].length; ++j) if(D[181][j].charCodeAt(0) !== 0xFFFD) { e[D[181][j]] = 46336 + j; d[46336 + j] = D[181][j];}
  846. D[182] = "�����������������������������������������������������������������������������������������������������������������������������������������������������������������丁盯叮钉顶鼎锭定订丢东冬董懂动栋侗恫冻洞兜抖斗陡豆逗痘都督毒犊独读堵睹赌杜镀肚度渡妒端短锻段断缎堆兑队对墩吨蹲敦顿囤钝盾遁掇哆多夺垛躲朵跺舵剁惰堕蛾峨鹅俄额讹娥恶厄扼遏鄂饿恩而儿耳尔饵洱二�".split("");
  847. for(j = 0; j != D[182].length; ++j) if(D[182][j].charCodeAt(0) !== 0xFFFD) { e[D[182][j]] = 46592 + j; d[46592 + j] = D[182][j];}
  848. D[183] = "�����������������������������������������������������������������������������������������������������������������������������������������������������������������贰发罚筏伐乏阀法珐藩帆番翻樊矾钒繁凡烦反返范贩犯饭泛坊芳方肪房防妨仿访纺放菲非啡飞肥匪诽吠肺废沸费芬酚吩氛分纷坟焚汾粉奋份忿愤粪丰封枫蜂峰锋风疯烽逢冯缝讽奉凤佛否夫敷肤孵扶拂辐幅氟符伏俘服�".split("");
  849. for(j = 0; j != D[183].length; ++j) if(D[183][j].charCodeAt(0) !== 0xFFFD) { e[D[183][j]] = 46848 + j; d[46848 + j] = D[183][j];}
  850. D[184] = "�����������������������������������������������������������������������������������������������������������������������������������������������������������������浮涪福袱弗甫抚辅俯釜斧脯腑府腐赴副覆赋复傅付阜父腹负富讣附妇缚咐噶嘎该改概钙盖溉干甘杆柑竿肝赶感秆敢赣冈刚钢缸肛纲岗港杠篙皋高膏羔糕搞镐稿告哥歌搁戈鸽胳疙割革葛格蛤阁隔铬个各给根跟耕更庚羹�".split("");
  851. for(j = 0; j != D[184].length; ++j) if(D[184][j].charCodeAt(0) !== 0xFFFD) { e[D[184][j]] = 47104 + j; d[47104 + j] = D[184][j];}
  852. D[185] = "�����������������������������������������������������������������������������������������������������������������������������������������������������������������埂耿梗工攻功恭龚供躬公宫弓巩汞拱贡共钩勾沟苟狗垢构购够辜菇咕箍估沽孤姑鼓古蛊骨谷股故顾固雇刮瓜剐寡挂褂乖拐怪棺关官冠观管馆罐惯灌贯光广逛瑰规圭硅归龟闺轨鬼诡癸桂柜跪贵刽辊滚棍锅郭国果裹过哈�".split("");
  853. for(j = 0; j != D[185].length; ++j) if(D[185][j].charCodeAt(0) !== 0xFFFD) { e[D[185][j]] = 47360 + j; d[47360 + j] = D[185][j];}
  854. D[186] = "�����������������������������������������������������������������������������������������������������������������������������������������������������������������骸孩海氦亥害骇酣憨邯韩含涵寒函喊罕翰撼捍旱憾悍焊汗汉夯杭航壕嚎豪毫郝好耗号浩呵喝荷菏核禾和何合盒貉阂河涸赫褐鹤贺嘿黑痕很狠恨哼亨横衡恒轰哄烘虹鸿洪宏弘红喉侯猴吼厚候后呼乎忽瑚壶葫胡蝴狐糊湖�".split("");
  855. for(j = 0; j != D[186].length; ++j) if(D[186][j].charCodeAt(0) !== 0xFFFD) { e[D[186][j]] = 47616 + j; d[47616 + j] = D[186][j];}
  856. D[187] = "�����������������������������������������������������������������������������������������������������������������������������������������������������������������弧虎唬护互沪户花哗华猾滑画划化话槐徊怀淮坏欢环桓还缓换患唤痪豢焕涣宦幻荒慌黄磺蝗簧皇凰惶煌晃幌恍谎灰挥辉徽恢蛔回毁悔慧卉惠晦贿秽会烩汇讳诲绘荤昏婚魂浑混豁活伙火获或惑霍货祸击圾基机畸稽积箕�".split("");
  857. for(j = 0; j != D[187].length; ++j) if(D[187][j].charCodeAt(0) !== 0xFFFD) { e[D[187][j]] = 47872 + j; d[47872 + j] = D[187][j];}
  858. D[188] = "�����������������������������������������������������������������������������������������������������������������������������������������������������������������肌饥迹激讥鸡姬绩缉吉极棘辑籍集及急疾汲即嫉级挤几脊己蓟技冀季伎祭剂悸济寄寂计记既忌际妓继纪嘉枷夹佳家加荚颊贾甲钾假稼价架驾嫁歼监坚尖笺间煎兼肩艰奸缄茧检柬碱硷拣捡简俭剪减荐槛鉴践贱见键箭件�".split("");
  859. for(j = 0; j != D[188].length; ++j) if(D[188][j].charCodeAt(0) !== 0xFFFD) { e[D[188][j]] = 48128 + j; d[48128 + j] = D[188][j];}
  860. D[189] = "�����������������������������������������������������������������������������������������������������������������������������������������������������������������健舰剑饯渐溅涧建僵姜将浆江疆蒋桨奖讲匠酱降蕉椒礁焦胶交郊浇骄娇嚼搅铰矫侥脚狡角饺缴绞剿教酵轿较叫窖揭接皆秸街阶截劫节桔杰捷睫竭洁结解姐戒藉芥界借介疥诫届巾筋斤金今津襟紧锦仅谨进靳晋禁近烬浸�".split("");
  861. for(j = 0; j != D[189].length; ++j) if(D[189][j].charCodeAt(0) !== 0xFFFD) { e[D[189][j]] = 48384 + j; d[48384 + j] = D[189][j];}
  862. D[190] = "�����������������������������������������������������������������������������������������������������������������������������������������������������������������尽劲荆兢茎睛晶鲸京惊精粳经井警景颈静境敬镜径痉靖竟竞净炯窘揪究纠玖韭久灸九酒厩救旧臼舅咎就疚鞠拘狙疽居驹菊局咀矩举沮聚拒据巨具距踞锯俱句惧炬剧捐鹃娟倦眷卷绢撅攫抉掘倔爵觉决诀绝均菌钧军君峻�".split("");
  863. for(j = 0; j != D[190].length; ++j) if(D[190][j].charCodeAt(0) !== 0xFFFD) { e[D[190][j]] = 48640 + j; d[48640 + j] = D[190][j];}
  864. D[191] = "�����������������������������������������������������������������������������������������������������������������������������������������������������������������俊竣浚郡骏喀咖卡咯开揩楷凯慨刊堪勘坎砍看康慷糠扛抗亢炕考拷烤靠坷苛柯棵磕颗科壳咳可渴克刻客课肯啃垦恳坑吭空恐孔控抠口扣寇枯哭窟苦酷库裤夸垮挎跨胯块筷侩快宽款匡筐狂框矿眶旷况亏盔岿窥葵奎魁傀�".split("");
  865. for(j = 0; j != D[191].length; ++j) if(D[191][j].charCodeAt(0) !== 0xFFFD) { e[D[191][j]] = 48896 + j; d[48896 + j] = D[191][j];}
  866. D[192] = "�����������������������������������������������������������������������������������������������������������������������������������������������������������������馈愧溃坤昆捆困括扩廓阔垃拉喇蜡腊辣啦莱来赖蓝婪栏拦篮阑兰澜谰揽览懒缆烂滥琅榔狼廊郎朗浪捞劳牢老佬姥酪烙涝勒乐雷镭蕾磊累儡垒擂肋类泪棱楞冷厘梨犁黎篱狸离漓理李里鲤礼莉荔吏栗丽厉励砾历利傈例俐�".split("");
  867. for(j = 0; j != D[192].length; ++j) if(D[192][j].charCodeAt(0) !== 0xFFFD) { e[D[192][j]] = 49152 + j; d[49152 + j] = D[192][j];}
  868. D[193] = "�����������������������������������������������������������������������������������������������������������������������������������������������������������������痢立粒沥隶力璃哩俩联莲连镰廉怜涟帘敛脸链恋炼练粮凉梁粱良两辆量晾亮谅撩聊僚疗燎寥辽潦了撂镣廖料列裂烈劣猎琳林磷霖临邻鳞淋凛赁吝拎玲菱零龄铃伶羚凌灵陵岭领另令溜琉榴硫馏留刘瘤流柳六龙聋咙笼窿�".split("");
  869. for(j = 0; j != D[193].length; ++j) if(D[193][j].charCodeAt(0) !== 0xFFFD) { e[D[193][j]] = 49408 + j; d[49408 + j] = D[193][j];}
  870. D[194] = "�����������������������������������������������������������������������������������������������������������������������������������������������������������������隆垄拢陇楼娄搂篓漏陋芦卢颅庐炉掳卤虏鲁麓碌露路赂鹿潞禄录陆戮驴吕铝侣旅履屡缕虑氯律率滤绿峦挛孪滦卵乱掠略抡轮伦仑沦纶论萝螺罗逻锣箩骡裸落洛骆络妈麻玛码蚂马骂嘛吗埋买麦卖迈脉瞒馒蛮满蔓曼慢漫�".split("");
  871. for(j = 0; j != D[194].length; ++j) if(D[194][j].charCodeAt(0) !== 0xFFFD) { e[D[194][j]] = 49664 + j; d[49664 + j] = D[194][j];}
  872. D[195] = "�����������������������������������������������������������������������������������������������������������������������������������������������������������������谩芒茫盲氓忙莽猫茅锚毛矛铆卯茂冒帽貌贸么玫枚梅酶霉煤没眉媒镁每美昧寐妹媚门闷们萌蒙檬盟锰猛梦孟眯醚靡糜迷谜弥米秘觅泌蜜密幂棉眠绵冕免勉娩缅面苗描瞄藐秒渺庙妙蔑灭民抿皿敏悯闽明螟鸣铭名命谬摸�".split("");
  873. for(j = 0; j != D[195].length; ++j) if(D[195][j].charCodeAt(0) !== 0xFFFD) { e[D[195][j]] = 49920 + j; d[49920 + j] = D[195][j];}
  874. D[196] = "�����������������������������������������������������������������������������������������������������������������������������������������������������������������摹蘑模膜磨摩魔抹末莫墨默沫漠寞陌谋牟某拇牡亩姆母墓暮幕募慕木目睦牧穆拿哪呐钠那娜纳氖乃奶耐奈南男难囊挠脑恼闹淖呢馁内嫩能妮霓倪泥尼拟你匿腻逆溺蔫拈年碾撵捻念娘酿鸟尿捏聂孽啮镊镍涅您柠狞凝宁�".split("");
  875. for(j = 0; j != D[196].length; ++j) if(D[196][j].charCodeAt(0) !== 0xFFFD) { e[D[196][j]] = 50176 + j; d[50176 + j] = D[196][j];}
  876. D[197] = "�����������������������������������������������������������������������������������������������������������������������������������������������������������������拧泞牛扭钮纽脓浓农弄奴努怒女暖虐疟挪懦糯诺哦欧鸥殴藕呕偶沤啪趴爬帕怕琶拍排牌徘湃派攀潘盘磐盼畔判叛乓庞旁耪胖抛咆刨炮袍跑泡呸胚培裴赔陪配佩沛喷盆砰抨烹澎彭蓬棚硼篷膨朋鹏捧碰坯砒霹批披劈琵毗�".split("");
  877. for(j = 0; j != D[197].length; ++j) if(D[197][j].charCodeAt(0) !== 0xFFFD) { e[D[197][j]] = 50432 + j; d[50432 + j] = D[197][j];}
  878. D[198] = "�����������������������������������������������������������������������������������������������������������������������������������������������������������������啤脾疲皮匹痞僻屁譬篇偏片骗飘漂瓢票撇瞥拼频贫品聘乒坪苹萍平凭瓶评屏坡泼颇婆破魄迫粕剖扑铺仆莆葡菩蒲埔朴圃普浦谱曝瀑期欺栖戚妻七凄漆柒沏其棋奇歧畦崎脐齐旗祈祁骑起岂乞企启契砌器气迄弃汽泣讫掐�".split("");
  879. for(j = 0; j != D[198].length; ++j) if(D[198][j].charCodeAt(0) !== 0xFFFD) { e[D[198][j]] = 50688 + j; d[50688 + j] = D[198][j];}
  880. D[199] = "�����������������������������������������������������������������������������������������������������������������������������������������������������������������恰洽牵扦钎铅千迁签仟谦乾黔钱钳前潜遣浅谴堑嵌欠歉枪呛腔羌墙蔷强抢橇锹敲悄桥瞧乔侨巧鞘撬翘峭俏窍切茄且怯窃钦侵亲秦琴勤芹擒禽寝沁青轻氢倾卿清擎晴氰情顷请庆琼穷秋丘邱球求囚酋泅趋区蛆曲躯屈驱渠�".split("");
  881. for(j = 0; j != D[199].length; ++j) if(D[199][j].charCodeAt(0) !== 0xFFFD) { e[D[199][j]] = 50944 + j; d[50944 + j] = D[199][j];}
  882. D[200] = "�����������������������������������������������������������������������������������������������������������������������������������������������������������������取娶龋趣去圈颧权醛泉全痊拳犬券劝缺炔瘸却鹊榷确雀裙群然燃冉染瓤壤攘嚷让饶扰绕惹热壬仁人忍韧任认刃妊纫扔仍日戎茸蓉荣融熔溶容绒冗揉柔肉茹蠕儒孺如辱乳汝入褥软阮蕊瑞锐闰润若弱撒洒萨腮鳃塞赛三叁�".split("");
  883. for(j = 0; j != D[200].length; ++j) if(D[200][j].charCodeAt(0) !== 0xFFFD) { e[D[200][j]] = 51200 + j; d[51200 + j] = D[200][j];}
  884. D[201] = "�����������������������������������������������������������������������������������������������������������������������������������������������������������������伞散桑嗓丧搔骚扫嫂瑟色涩森僧莎砂杀刹沙纱傻啥煞筛晒珊苫杉山删煽衫闪陕擅赡膳善汕扇缮墒伤商赏晌上尚裳梢捎稍烧芍勺韶少哨邵绍奢赊蛇舌舍赦摄射慑涉社设砷申呻伸身深娠绅神沈审婶甚肾慎渗声生甥牲升绳�".split("");
  885. for(j = 0; j != D[201].length; ++j) if(D[201][j].charCodeAt(0) !== 0xFFFD) { e[D[201][j]] = 51456 + j; d[51456 + j] = D[201][j];}
  886. D[202] = "�����������������������������������������������������������������������������������������������������������������������������������������������������������������省盛剩胜圣师失狮施湿诗尸虱十石拾时什食蚀实识史矢使屎驶始式示士世柿事拭誓逝势是嗜噬适仕侍释饰氏市恃室视试收手首守寿授售受瘦兽蔬枢梳殊抒输叔舒淑疏书赎孰熟薯暑曙署蜀黍鼠属术述树束戍竖墅庶数漱�".split("");
  887. for(j = 0; j != D[202].length; ++j) if(D[202][j].charCodeAt(0) !== 0xFFFD) { e[D[202][j]] = 51712 + j; d[51712 + j] = D[202][j];}
  888. D[203] = "�����������������������������������������������������������������������������������������������������������������������������������������������������������������恕刷耍摔衰甩帅栓拴霜双爽谁水睡税吮瞬顺舜说硕朔烁斯撕嘶思私司丝死肆寺嗣四伺似饲巳松耸怂颂送宋讼诵搜艘擞嗽苏酥俗素速粟僳塑溯宿诉肃酸蒜算虽隋随绥髓碎岁穗遂隧祟孙损笋蓑梭唆缩琐索锁所塌他它她塔�".split("");
  889. for(j = 0; j != D[203].length; ++j) if(D[203][j].charCodeAt(0) !== 0xFFFD) { e[D[203][j]] = 51968 + j; d[51968 + j] = D[203][j];}
  890. D[204] = "�����������������������������������������������������������������������������������������������������������������������������������������������������������������獭挞蹋踏胎苔抬台泰酞太态汰坍摊贪瘫滩坛檀痰潭谭谈坦毯袒碳探叹炭汤塘搪堂棠膛唐糖倘躺淌趟烫掏涛滔绦萄桃逃淘陶讨套特藤腾疼誊梯剔踢锑提题蹄啼体替嚏惕涕剃屉天添填田甜恬舔腆挑条迢眺跳贴铁帖厅听烃�".split("");
  891. for(j = 0; j != D[204].length; ++j) if(D[204][j].charCodeAt(0) !== 0xFFFD) { e[D[204][j]] = 52224 + j; d[52224 + j] = D[204][j];}
  892. D[205] = "�����������������������������������������������������������������������������������������������������������������������������������������������������������������汀廷停亭庭挺艇通桐酮瞳同铜彤童桶捅筒统痛偷投头透凸秃突图徒途涂屠土吐兔湍团推颓腿蜕褪退吞屯臀拖托脱鸵陀驮驼椭妥拓唾挖哇蛙洼娃瓦袜歪外豌弯湾玩顽丸烷完碗挽晚皖惋宛婉万腕汪王亡枉网往旺望忘妄威�".split("");
  893. for(j = 0; j != D[205].length; ++j) if(D[205][j].charCodeAt(0) !== 0xFFFD) { e[D[205][j]] = 52480 + j; d[52480 + j] = D[205][j];}
  894. D[206] = "�����������������������������������������������������������������������������������������������������������������������������������������������������������������巍微危韦违桅围唯惟为潍维苇萎委伟伪尾纬未蔚味畏胃喂魏位渭谓尉慰卫瘟温蚊文闻纹吻稳紊问嗡翁瓮挝蜗涡窝我斡卧握沃巫呜钨乌污诬屋无芜梧吾吴毋武五捂午舞伍侮坞戊雾晤物勿务悟误昔熙析西硒矽晰嘻吸锡牺�".split("");
  895. for(j = 0; j != D[206].length; ++j) if(D[206][j].charCodeAt(0) !== 0xFFFD) { e[D[206][j]] = 52736 + j; d[52736 + j] = D[206][j];}
  896. D[207] = "�����������������������������������������������������������������������������������������������������������������������������������������������������������������稀息希悉膝夕惜熄烯溪汐犀檄袭席习媳喜铣洗系隙戏细瞎虾匣霞辖暇峡侠狭下厦夏吓掀锨先仙鲜纤咸贤衔舷闲涎弦嫌显险现献县腺馅羡宪陷限线相厢镶香箱襄湘乡翔祥详想响享项巷橡像向象萧硝霄削哮嚣销消宵淆晓�".split("");
  897. for(j = 0; j != D[207].length; ++j) if(D[207][j].charCodeAt(0) !== 0xFFFD) { e[D[207][j]] = 52992 + j; d[52992 + j] = D[207][j];}
  898. D[208] = "�����������������������������������������������������������������������������������������������������������������������������������������������������������������小孝校肖啸笑效楔些歇蝎鞋协挟携邪斜胁谐写械卸蟹懈泄泻谢屑薪芯锌欣辛新忻心信衅星腥猩惺兴刑型形邢行醒幸杏性姓兄凶胸匈汹雄熊休修羞朽嗅锈秀袖绣墟戌需虚嘘须徐许蓄酗叙旭序畜恤絮婿绪续轩喧宣悬旋玄�".split("");
  899. for(j = 0; j != D[208].length; ++j) if(D[208][j].charCodeAt(0) !== 0xFFFD) { e[D[208][j]] = 53248 + j; d[53248 + j] = D[208][j];}
  900. D[209] = "�����������������������������������������������������������������������������������������������������������������������������������������������������������������选癣眩绚靴薛学穴雪血勋熏循旬询寻驯巡殉汛训讯逊迅压押鸦鸭呀丫芽牙蚜崖衙涯雅哑亚讶焉咽阉烟淹盐严研蜒岩延言颜阎炎沿奄掩眼衍演艳堰燕厌砚雁唁彦焰宴谚验殃央鸯秧杨扬佯疡羊洋阳氧仰痒养样漾邀腰妖瑶�".split("");
  901. for(j = 0; j != D[209].length; ++j) if(D[209][j].charCodeAt(0) !== 0xFFFD) { e[D[209][j]] = 53504 + j; d[53504 + j] = D[209][j];}
  902. D[210] = "�����������������������������������������������������������������������������������������������������������������������������������������������������������������摇尧遥窑谣姚咬舀药要耀椰噎耶爷野冶也页掖业叶曳腋夜液一壹医揖铱依伊衣颐夷遗移仪胰疑沂宜姨彝椅蚁倚已乙矣以艺抑易邑屹亿役臆逸肄疫亦裔意毅忆义益溢诣议谊译异翼翌绎茵荫因殷音阴姻吟银淫寅饮尹引隐�".split("");
  903. for(j = 0; j != D[210].length; ++j) if(D[210][j].charCodeAt(0) !== 0xFFFD) { e[D[210][j]] = 53760 + j; d[53760 + j] = D[210][j];}
  904. D[211] = "�����������������������������������������������������������������������������������������������������������������������������������������������������������������印英樱婴鹰应缨莹萤营荧蝇迎赢盈影颖硬映哟拥佣臃痈庸雍踊蛹咏泳涌永恿勇用幽优悠忧尤由邮铀犹油游酉有友右佑釉诱又幼迂淤于盂榆虞愚舆余俞逾鱼愉渝渔隅予娱雨与屿禹宇语羽玉域芋郁吁遇喻峪御愈欲狱育誉�".split("");
  905. for(j = 0; j != D[211].length; ++j) if(D[211][j].charCodeAt(0) !== 0xFFFD) { e[D[211][j]] = 54016 + j; d[54016 + j] = D[211][j];}
  906. D[212] = "�����������������������������������������������������������������������������������������������������������������������������������������������������������������浴寓裕预豫驭鸳渊冤元垣袁原援辕园员圆猿源缘远苑愿怨院曰约越跃钥岳粤月悦阅耘云郧匀陨允运蕴酝晕韵孕匝砸杂栽哉灾宰载再在咱攒暂赞赃脏葬遭糟凿藻枣早澡蚤躁噪造皂灶燥责择则泽贼怎增憎曾赠扎喳渣札轧�".split("");
  907. for(j = 0; j != D[212].length; ++j) if(D[212][j].charCodeAt(0) !== 0xFFFD) { e[D[212][j]] = 54272 + j; d[54272 + j] = D[212][j];}
  908. D[213] = "�����������������������������������������������������������������������������������������������������������������������������������������������������������������铡闸眨栅榨咋乍炸诈摘斋宅窄债寨瞻毡詹粘沾盏斩辗崭展蘸栈占战站湛绽樟章彰漳张掌涨杖丈帐账仗胀瘴障招昭找沼赵照罩兆肇召遮折哲蛰辙者锗蔗这浙珍斟真甄砧臻贞针侦枕疹诊震振镇阵蒸挣睁征狰争怔整拯正政�".split("");
  909. for(j = 0; j != D[213].length; ++j) if(D[213][j].charCodeAt(0) !== 0xFFFD) { e[D[213][j]] = 54528 + j; d[54528 + j] = D[213][j];}
  910. D[214] = "�����������������������������������������������������������������������������������������������������������������������������������������������������������������帧症郑证芝枝支吱蜘知肢脂汁之织职直植殖执值侄址指止趾只旨纸志挚掷至致置帜峙制智秩稚质炙痔滞治窒中盅忠钟衷终种肿重仲众舟周州洲诌粥轴肘帚咒皱宙昼骤珠株蛛朱猪诸诛逐竹烛煮拄瞩嘱主著柱助蛀贮铸筑�".split("");
  911. for(j = 0; j != D[214].length; ++j) if(D[214][j].charCodeAt(0) !== 0xFFFD) { e[D[214][j]] = 54784 + j; d[54784 + j] = D[214][j];}
  912. D[215] = "�����������������������������������������������������������������������������������������������������������������������������������������������������������������住注祝驻抓爪拽专砖转撰赚篆桩庄装妆撞壮状椎锥追赘坠缀谆准捉拙卓桌琢茁酌啄着灼浊兹咨资姿滋淄孜紫仔籽滓子自渍字鬃棕踪宗综总纵邹走奏揍租足卒族祖诅阻组钻纂嘴醉最罪尊遵昨左佐柞做作坐座������".split("");
  913. for(j = 0; j != D[215].length; ++j) if(D[215][j].charCodeAt(0) !== 0xFFFD) { e[D[215][j]] = 55040 + j; d[55040 + j] = D[215][j];}
  914. D[216] = "�����������������������������������������������������������������������������������������������������������������������������������������������������������������亍丌兀丐廿卅丕亘丞鬲孬噩丨禺丿匕乇夭爻卮氐囟胤馗毓睾鼗丶亟鼐乜乩亓芈孛啬嘏仄厍厝厣厥厮靥赝匚叵匦匮匾赜卦卣刂刈刎刭刳刿剀剌剞剡剜蒯剽劂劁劐劓冂罔亻仃仉仂仨仡仫仞伛仳伢佤仵伥伧伉伫佞佧攸佚佝�".split("");
  915. for(j = 0; j != D[216].length; ++j) if(D[216][j].charCodeAt(0) !== 0xFFFD) { e[D[216][j]] = 55296 + j; d[55296 + j] = D[216][j];}
  916. D[217] = "�����������������������������������������������������������������������������������������������������������������������������������������������������������������佟佗伲伽佶佴侑侉侃侏佾佻侪佼侬侔俦俨俪俅俚俣俜俑俟俸倩偌俳倬倏倮倭俾倜倌倥倨偾偃偕偈偎偬偻傥傧傩傺僖儆僭僬僦僮儇儋仝氽佘佥俎龠汆籴兮巽黉馘冁夔勹匍訇匐凫夙兕亠兖亳衮袤亵脔裒禀嬴蠃羸冫冱冽冼�".split("");
  917. for(j = 0; j != D[217].length; ++j) if(D[217][j].charCodeAt(0) !== 0xFFFD) { e[D[217][j]] = 55552 + j; d[55552 + j] = D[217][j];}
  918. D[218] = "�����������������������������������������������������������������������������������������������������������������������������������������������������������������凇冖冢冥讠讦讧讪讴讵讷诂诃诋诏诎诒诓诔诖诘诙诜诟诠诤诨诩诮诰诳诶诹诼诿谀谂谄谇谌谏谑谒谔谕谖谙谛谘谝谟谠谡谥谧谪谫谮谯谲谳谵谶卩卺阝阢阡阱阪阽阼陂陉陔陟陧陬陲陴隈隍隗隰邗邛邝邙邬邡邴邳邶邺�".split("");
  919. for(j = 0; j != D[218].length; ++j) if(D[218][j].charCodeAt(0) !== 0xFFFD) { e[D[218][j]] = 55808 + j; d[55808 + j] = D[218][j];}
  920. D[219] = "�����������������������������������������������������������������������������������������������������������������������������������������������������������������邸邰郏郅邾郐郄郇郓郦郢郜郗郛郫郯郾鄄鄢鄞鄣鄱鄯鄹酃酆刍奂劢劬劭劾哿勐勖勰叟燮矍廴凵凼鬯厶弁畚巯坌垩垡塾墼壅壑圩圬圪圳圹圮圯坜圻坂坩垅坫垆坼坻坨坭坶坳垭垤垌垲埏垧垴垓垠埕埘埚埙埒垸埴埯埸埤埝�".split("");
  921. for(j = 0; j != D[219].length; ++j) if(D[219][j].charCodeAt(0) !== 0xFFFD) { e[D[219][j]] = 56064 + j; d[56064 + j] = D[219][j];}
  922. D[220] = "�����������������������������������������������������������������������������������������������������������������������������������������������������������������堋堍埽埭堀堞堙塄堠塥塬墁墉墚墀馨鼙懿艹艽艿芏芊芨芄芎芑芗芙芫芸芾芰苈苊苣芘芷芮苋苌苁芩芴芡芪芟苄苎芤苡茉苷苤茏茇苜苴苒苘茌苻苓茑茚茆茔茕苠苕茜荑荛荜茈莒茼茴茱莛荞茯荏荇荃荟荀茗荠茭茺茳荦荥�".split("");
  923. for(j = 0; j != D[220].length; ++j) if(D[220][j].charCodeAt(0) !== 0xFFFD) { e[D[220][j]] = 56320 + j; d[56320 + j] = D[220][j];}
  924. D[221] = "�����������������������������������������������������������������������������������������������������������������������������������������������������������������荨茛荩荬荪荭荮莰荸莳莴莠莪莓莜莅荼莶莩荽莸荻莘莞莨莺莼菁萁菥菘堇萘萋菝菽菖萜萸萑萆菔菟萏萃菸菹菪菅菀萦菰菡葜葑葚葙葳蒇蒈葺蒉葸萼葆葩葶蒌蒎萱葭蓁蓍蓐蓦蒽蓓蓊蒿蒺蓠蒡蒹蒴蒗蓥蓣蔌甍蔸蓰蔹蔟蔺�".split("");
  925. for(j = 0; j != D[221].length; ++j) if(D[221][j].charCodeAt(0) !== 0xFFFD) { e[D[221][j]] = 56576 + j; d[56576 + j] = D[221][j];}
  926. D[222] = "�����������������������������������������������������������������������������������������������������������������������������������������������������������������蕖蔻蓿蓼蕙蕈蕨蕤蕞蕺瞢蕃蕲蕻薤薨薇薏蕹薮薜薅薹薷薰藓藁藜藿蘧蘅蘩蘖蘼廾弈夼奁耷奕奚奘匏尢尥尬尴扌扪抟抻拊拚拗拮挢拶挹捋捃掭揶捱捺掎掴捭掬掊捩掮掼揲揸揠揿揄揞揎摒揆掾摅摁搋搛搠搌搦搡摞撄摭撖�".split("");
  927. for(j = 0; j != D[222].length; ++j) if(D[222][j].charCodeAt(0) !== 0xFFFD) { e[D[222][j]] = 56832 + j; d[56832 + j] = D[222][j];}
  928. D[223] = "�����������������������������������������������������������������������������������������������������������������������������������������������������������������摺撷撸撙撺擀擐擗擤擢攉攥攮弋忒甙弑卟叱叽叩叨叻吒吖吆呋呒呓呔呖呃吡呗呙吣吲咂咔呷呱呤咚咛咄呶呦咝哐咭哂咴哒咧咦哓哔呲咣哕咻咿哌哙哚哜咩咪咤哝哏哞唛哧唠哽唔哳唢唣唏唑唧唪啧喏喵啉啭啁啕唿啐唼�".split("");
  929. for(j = 0; j != D[223].length; ++j) if(D[223][j].charCodeAt(0) !== 0xFFFD) { e[D[223][j]] = 57088 + j; d[57088 + j] = D[223][j];}
  930. D[224] = "�����������������������������������������������������������������������������������������������������������������������������������������������������������������唷啖啵啶啷唳唰啜喋嗒喃喱喹喈喁喟啾嗖喑啻嗟喽喾喔喙嗪嗷嗉嘟嗑嗫嗬嗔嗦嗝嗄嗯嗥嗲嗳嗌嗍嗨嗵嗤辔嘞嘈嘌嘁嘤嘣嗾嘀嘧嘭噘嘹噗嘬噍噢噙噜噌噔嚆噤噱噫噻噼嚅嚓嚯囔囗囝囡囵囫囹囿圄圊圉圜帏帙帔帑帱帻帼�".split("");
  931. for(j = 0; j != D[224].length; ++j) if(D[224][j].charCodeAt(0) !== 0xFFFD) { e[D[224][j]] = 57344 + j; d[57344 + j] = D[224][j];}
  932. D[225] = "�����������������������������������������������������������������������������������������������������������������������������������������������������������������帷幄幔幛幞幡岌屺岍岐岖岈岘岙岑岚岜岵岢岽岬岫岱岣峁岷峄峒峤峋峥崂崃崧崦崮崤崞崆崛嵘崾崴崽嵬嵛嵯嵝嵫嵋嵊嵩嵴嶂嶙嶝豳嶷巅彳彷徂徇徉後徕徙徜徨徭徵徼衢彡犭犰犴犷犸狃狁狎狍狒狨狯狩狲狴狷猁狳猃狺�".split("");
  933. for(j = 0; j != D[225].length; ++j) if(D[225][j].charCodeAt(0) !== 0xFFFD) { e[D[225][j]] = 57600 + j; d[57600 + j] = D[225][j];}
  934. D[226] = "�����������������������������������������������������������������������������������������������������������������������������������������������������������������狻猗猓猡猊猞猝猕猢猹猥猬猸猱獐獍獗獠獬獯獾舛夥飧夤夂饣饧饨饩饪饫饬饴饷饽馀馄馇馊馍馐馑馓馔馕庀庑庋庖庥庠庹庵庾庳赓廒廑廛廨廪膺忄忉忖忏怃忮怄忡忤忾怅怆忪忭忸怙怵怦怛怏怍怩怫怊怿怡恸恹恻恺恂�".split("");
  935. for(j = 0; j != D[226].length; ++j) if(D[226][j].charCodeAt(0) !== 0xFFFD) { e[D[226][j]] = 57856 + j; d[57856 + j] = D[226][j];}
  936. D[227] = "�����������������������������������������������������������������������������������������������������������������������������������������������������������������恪恽悖悚悭悝悃悒悌悛惬悻悱惝惘惆惚悴愠愦愕愣惴愀愎愫慊慵憬憔憧憷懔懵忝隳闩闫闱闳闵闶闼闾阃阄阆阈阊阋阌阍阏阒阕阖阗阙阚丬爿戕氵汔汜汊沣沅沐沔沌汨汩汴汶沆沩泐泔沭泷泸泱泗沲泠泖泺泫泮沱泓泯泾�".split("");
  937. for(j = 0; j != D[227].length; ++j) if(D[227][j].charCodeAt(0) !== 0xFFFD) { e[D[227][j]] = 58112 + j; d[58112 + j] = D[227][j];}
  938. D[228] = "�����������������������������������������������������������������������������������������������������������������������������������������������������������������洹洧洌浃浈洇洄洙洎洫浍洮洵洚浏浒浔洳涑浯涞涠浞涓涔浜浠浼浣渚淇淅淞渎涿淠渑淦淝淙渖涫渌涮渫湮湎湫溲湟溆湓湔渲渥湄滟溱溘滠漭滢溥溧溽溻溷滗溴滏溏滂溟潢潆潇漤漕滹漯漶潋潴漪漉漩澉澍澌潸潲潼潺濑�".split("");
  939. for(j = 0; j != D[228].length; ++j) if(D[228][j].charCodeAt(0) !== 0xFFFD) { e[D[228][j]] = 58368 + j; d[58368 + j] = D[228][j];}
  940. D[229] = "�����������������������������������������������������������������������������������������������������������������������������������������������������������������濉澧澹澶濂濡濮濞濠濯瀚瀣瀛瀹瀵灏灞宀宄宕宓宥宸甯骞搴寤寮褰寰蹇謇辶迓迕迥迮迤迩迦迳迨逅逄逋逦逑逍逖逡逵逶逭逯遄遑遒遐遨遘遢遛暹遴遽邂邈邃邋彐彗彖彘尻咫屐屙孱屣屦羼弪弩弭艴弼鬻屮妁妃妍妩妪妣�".split("");
  941. for(j = 0; j != D[229].length; ++j) if(D[229][j].charCodeAt(0) !== 0xFFFD) { e[D[229][j]] = 58624 + j; d[58624 + j] = D[229][j];}
  942. D[230] = "�����������������������������������������������������������������������������������������������������������������������������������������������������������������妗姊妫妞妤姒妲妯姗妾娅娆姝娈姣姘姹娌娉娲娴娑娣娓婀婧婊婕娼婢婵胬媪媛婷婺媾嫫媲嫒嫔媸嫠嫣嫱嫖嫦嫘嫜嬉嬗嬖嬲嬷孀尕尜孚孥孳孑孓孢驵驷驸驺驿驽骀骁骅骈骊骐骒骓骖骘骛骜骝骟骠骢骣骥骧纟纡纣纥纨纩�".split("");
  943. for(j = 0; j != D[230].length; ++j) if(D[230][j].charCodeAt(0) !== 0xFFFD) { e[D[230][j]] = 58880 + j; d[58880 + j] = D[230][j];}
  944. D[231] = "�����������������������������������������������������������������������������������������������������������������������������������������������������������������纭纰纾绀绁绂绉绋绌绐绔绗绛绠绡绨绫绮绯绱绲缍绶绺绻绾缁缂缃缇缈缋缌缏缑缒缗缙缜缛缟缡缢缣缤缥缦缧缪缫缬缭缯缰缱缲缳缵幺畿巛甾邕玎玑玮玢玟珏珂珑玷玳珀珉珈珥珙顼琊珩珧珞玺珲琏琪瑛琦琥琨琰琮琬�".split("");
  945. for(j = 0; j != D[231].length; ++j) if(D[231][j].charCodeAt(0) !== 0xFFFD) { e[D[231][j]] = 59136 + j; d[59136 + j] = D[231][j];}
  946. D[232] = "�����������������������������������������������������������������������������������������������������������������������������������������������������������������琛琚瑁瑜瑗瑕瑙瑷瑭瑾璜璎璀璁璇璋璞璨璩璐璧瓒璺韪韫韬杌杓杞杈杩枥枇杪杳枘枧杵枨枞枭枋杷杼柰栉柘栊柩枰栌柙枵柚枳柝栀柃枸柢栎柁柽栲栳桠桡桎桢桄桤梃栝桕桦桁桧桀栾桊桉栩梵梏桴桷梓桫棂楮棼椟椠棹�".split("");
  947. for(j = 0; j != D[232].length; ++j) if(D[232][j].charCodeAt(0) !== 0xFFFD) { e[D[232][j]] = 59392 + j; d[59392 + j] = D[232][j];}
  948. D[233] = "�����������������������������������������������������������������������������������������������������������������������������������������������������������������椤棰椋椁楗棣椐楱椹楠楂楝榄楫榀榘楸椴槌榇榈槎榉楦楣楹榛榧榻榫榭槔榱槁槊槟榕槠榍槿樯槭樗樘橥槲橄樾檠橐橛樵檎橹樽樨橘橼檑檐檩檗檫猷獒殁殂殇殄殒殓殍殚殛殡殪轫轭轱轲轳轵轶轸轷轹轺轼轾辁辂辄辇辋�".split("");
  949. for(j = 0; j != D[233].length; ++j) if(D[233][j].charCodeAt(0) !== 0xFFFD) { e[D[233][j]] = 59648 + j; d[59648 + j] = D[233][j];}
  950. D[234] = "�����������������������������������������������������������������������������������������������������������������������������������������������������������������辍辎辏辘辚軎戋戗戛戟戢戡戥戤戬臧瓯瓴瓿甏甑甓攴旮旯旰昊昙杲昃昕昀炅曷昝昴昱昶昵耆晟晔晁晏晖晡晗晷暄暌暧暝暾曛曜曦曩贲贳贶贻贽赀赅赆赈赉赇赍赕赙觇觊觋觌觎觏觐觑牮犟牝牦牯牾牿犄犋犍犏犒挈挲掰�".split("");
  951. for(j = 0; j != D[234].length; ++j) if(D[234][j].charCodeAt(0) !== 0xFFFD) { e[D[234][j]] = 59904 + j; d[59904 + j] = D[234][j];}
  952. D[235] = "�����������������������������������������������������������������������������������������������������������������������������������������������������������������搿擘耄毪毳毽毵毹氅氇氆氍氕氘氙氚氡氩氤氪氲攵敕敫牍牒牖爰虢刖肟肜肓肼朊肽肱肫肭肴肷胧胨胩胪胛胂胄胙胍胗朐胝胫胱胴胭脍脎胲胼朕脒豚脶脞脬脘脲腈腌腓腴腙腚腱腠腩腼腽腭腧塍媵膈膂膑滕膣膪臌朦臊膻�".split("");
  953. for(j = 0; j != D[235].length; ++j) if(D[235][j].charCodeAt(0) !== 0xFFFD) { e[D[235][j]] = 60160 + j; d[60160 + j] = D[235][j];}
  954. D[236] = "�����������������������������������������������������������������������������������������������������������������������������������������������������������������臁膦欤欷欹歃歆歙飑飒飓飕飙飚殳彀毂觳斐齑斓於旆旄旃旌旎旒旖炀炜炖炝炻烀炷炫炱烨烊焐焓焖焯焱煳煜煨煅煲煊煸煺熘熳熵熨熠燠燔燧燹爝爨灬焘煦熹戾戽扃扈扉礻祀祆祉祛祜祓祚祢祗祠祯祧祺禅禊禚禧禳忑忐�".split("");
  955. for(j = 0; j != D[236].length; ++j) if(D[236][j].charCodeAt(0) !== 0xFFFD) { e[D[236][j]] = 60416 + j; d[60416 + j] = D[236][j];}
  956. D[237] = "�����������������������������������������������������������������������������������������������������������������������������������������������������������������怼恝恚恧恁恙恣悫愆愍慝憩憝懋懑戆肀聿沓泶淼矶矸砀砉砗砘砑斫砭砜砝砹砺砻砟砼砥砬砣砩硎硭硖硗砦硐硇硌硪碛碓碚碇碜碡碣碲碹碥磔磙磉磬磲礅磴礓礤礞礴龛黹黻黼盱眄眍盹眇眈眚眢眙眭眦眵眸睐睑睇睃睚睨�".split("");
  957. for(j = 0; j != D[237].length; ++j) if(D[237][j].charCodeAt(0) !== 0xFFFD) { e[D[237][j]] = 60672 + j; d[60672 + j] = D[237][j];}
  958. D[238] = "�����������������������������������������������������������������������������������������������������������������������������������������������������������������睢睥睿瞍睽瞀瞌瞑瞟瞠瞰瞵瞽町畀畎畋畈畛畲畹疃罘罡罟詈罨罴罱罹羁罾盍盥蠲钅钆钇钋钊钌钍钏钐钔钗钕钚钛钜钣钤钫钪钭钬钯钰钲钴钶钷钸钹钺钼钽钿铄铈铉铊铋铌铍铎铐铑铒铕铖铗铙铘铛铞铟铠铢铤铥铧铨铪�".split("");
  959. for(j = 0; j != D[238].length; ++j) if(D[238][j].charCodeAt(0) !== 0xFFFD) { e[D[238][j]] = 60928 + j; d[60928 + j] = D[238][j];}
  960. D[239] = "�����������������������������������������������������������������������������������������������������������������������������������������������������������������铩铫铮铯铳铴铵铷铹铼铽铿锃锂锆锇锉锊锍锎锏锒锓锔锕锖锘锛锝锞锟锢锪锫锩锬锱锲锴锶锷锸锼锾锿镂锵镄镅镆镉镌镎镏镒镓镔镖镗镘镙镛镞镟镝镡镢镤镥镦镧镨镩镪镫镬镯镱镲镳锺矧矬雉秕秭秣秫稆嵇稃稂稞稔�".split("");
  961. for(j = 0; j != D[239].length; ++j) if(D[239][j].charCodeAt(0) !== 0xFFFD) { e[D[239][j]] = 61184 + j; d[61184 + j] = D[239][j];}
  962. D[240] = "�����������������������������������������������������������������������������������������������������������������������������������������������������������������稹稷穑黏馥穰皈皎皓皙皤瓞瓠甬鸠鸢鸨鸩鸪鸫鸬鸲鸱鸶鸸鸷鸹鸺鸾鹁鹂鹄鹆鹇鹈鹉鹋鹌鹎鹑鹕鹗鹚鹛鹜鹞鹣鹦鹧鹨鹩鹪鹫鹬鹱鹭鹳疒疔疖疠疝疬疣疳疴疸痄疱疰痃痂痖痍痣痨痦痤痫痧瘃痱痼痿瘐瘀瘅瘌瘗瘊瘥瘘瘕瘙�".split("");
  963. for(j = 0; j != D[240].length; ++j) if(D[240][j].charCodeAt(0) !== 0xFFFD) { e[D[240][j]] = 61440 + j; d[61440 + j] = D[240][j];}
  964. D[241] = "�����������������������������������������������������������������������������������������������������������������������������������������������������������������瘛瘼瘢瘠癀瘭瘰瘿瘵癃瘾瘳癍癞癔癜癖癫癯翊竦穸穹窀窆窈窕窦窠窬窨窭窳衤衩衲衽衿袂袢裆袷袼裉裢裎裣裥裱褚裼裨裾裰褡褙褓褛褊褴褫褶襁襦襻疋胥皲皴矜耒耔耖耜耠耢耥耦耧耩耨耱耋耵聃聆聍聒聩聱覃顸颀颃�".split("");
  965. for(j = 0; j != D[241].length; ++j) if(D[241][j].charCodeAt(0) !== 0xFFFD) { e[D[241][j]] = 61696 + j; d[61696 + j] = D[241][j];}
  966. D[242] = "�����������������������������������������������������������������������������������������������������������������������������������������������������������������颉颌颍颏颔颚颛颞颟颡颢颥颦虍虔虬虮虿虺虼虻蚨蚍蚋蚬蚝蚧蚣蚪蚓蚩蚶蛄蚵蛎蚰蚺蚱蚯蛉蛏蚴蛩蛱蛲蛭蛳蛐蜓蛞蛴蛟蛘蛑蜃蜇蛸蜈蜊蜍蜉蜣蜻蜞蜥蜮蜚蜾蝈蜴蜱蜩蜷蜿螂蜢蝽蝾蝻蝠蝰蝌蝮螋蝓蝣蝼蝤蝙蝥螓螯螨蟒�".split("");
  967. for(j = 0; j != D[242].length; ++j) if(D[242][j].charCodeAt(0) !== 0xFFFD) { e[D[242][j]] = 61952 + j; d[61952 + j] = D[242][j];}
  968. D[243] = "�����������������������������������������������������������������������������������������������������������������������������������������������������������������蟆螈螅螭螗螃螫蟥螬螵螳蟋蟓螽蟑蟀蟊蟛蟪蟠蟮蠖蠓蟾蠊蠛蠡蠹蠼缶罂罄罅舐竺竽笈笃笄笕笊笫笏筇笸笪笙笮笱笠笥笤笳笾笞筘筚筅筵筌筝筠筮筻筢筲筱箐箦箧箸箬箝箨箅箪箜箢箫箴篑篁篌篝篚篥篦篪簌篾篼簏簖簋�".split("");
  969. for(j = 0; j != D[243].length; ++j) if(D[243][j].charCodeAt(0) !== 0xFFFD) { e[D[243][j]] = 62208 + j; d[62208 + j] = D[243][j];}
  970. D[244] = "�����������������������������������������������������������������������������������������������������������������������������������������������������������������簟簪簦簸籁籀臾舁舂舄臬衄舡舢舣舭舯舨舫舸舻舳舴舾艄艉艋艏艚艟艨衾袅袈裘裟襞羝羟羧羯羰羲籼敉粑粝粜粞粢粲粼粽糁糇糌糍糈糅糗糨艮暨羿翎翕翥翡翦翩翮翳糸絷綦綮繇纛麸麴赳趄趔趑趱赧赭豇豉酊酐酎酏酤�".split("");
  971. for(j = 0; j != D[244].length; ++j) if(D[244][j].charCodeAt(0) !== 0xFFFD) { e[D[244][j]] = 62464 + j; d[62464 + j] = D[244][j];}
  972. D[245] = "�����������������������������������������������������������������������������������������������������������������������������������������������������������������酢酡酰酩酯酽酾酲酴酹醌醅醐醍醑醢醣醪醭醮醯醵醴醺豕鹾趸跫踅蹙蹩趵趿趼趺跄跖跗跚跞跎跏跛跆跬跷跸跣跹跻跤踉跽踔踝踟踬踮踣踯踺蹀踹踵踽踱蹉蹁蹂蹑蹒蹊蹰蹶蹼蹯蹴躅躏躔躐躜躞豸貂貊貅貘貔斛觖觞觚觜�".split("");
  973. for(j = 0; j != D[245].length; ++j) if(D[245][j].charCodeAt(0) !== 0xFFFD) { e[D[245][j]] = 62720 + j; d[62720 + j] = D[245][j];}
  974. D[246] = "�����������������������������������������������������������������������������������������������������������������������������������������������������������������觥觫觯訾謦靓雩雳雯霆霁霈霏霎霪霭霰霾龀龃龅龆龇龈龉龊龌黾鼋鼍隹隼隽雎雒瞿雠銎銮鋈錾鍪鏊鎏鐾鑫鱿鲂鲅鲆鲇鲈稣鲋鲎鲐鲑鲒鲔鲕鲚鲛鲞鲟鲠鲡鲢鲣鲥鲦鲧鲨鲩鲫鲭鲮鲰鲱鲲鲳鲴鲵鲶鲷鲺鲻鲼鲽鳄鳅鳆鳇鳊鳋�".split("");
  975. for(j = 0; j != D[246].length; ++j) if(D[246][j].charCodeAt(0) !== 0xFFFD) { e[D[246][j]] = 62976 + j; d[62976 + j] = D[246][j];}
  976. D[247] = "�����������������������������������������������������������������������������������������������������������������������������������������������������������������鳌鳍鳎鳏鳐鳓鳔鳕鳗鳘鳙鳜鳝鳟鳢靼鞅鞑鞒鞔鞯鞫鞣鞲鞴骱骰骷鹘骶骺骼髁髀髅髂髋髌髑魅魃魇魉魈魍魑飨餍餮饕饔髟髡髦髯髫髻髭髹鬈鬏鬓鬟鬣麽麾縻麂麇麈麋麒鏖麝麟黛黜黝黠黟黢黩黧黥黪黯鼢鼬鼯鼹鼷鼽鼾齄�".split("");
  977. for(j = 0; j != D[247].length; ++j) if(D[247][j].charCodeAt(0) !== 0xFFFD) { e[D[247][j]] = 63232 + j; d[63232 + j] = D[247][j];}
  978. return {"enc": e, "dec": d }; })();
  979. cptable[10029] = (function(){ var d = "\u0000\u0001\u0002\u0003\u0004\u0005\u0006\u0007\b\t\n\u000b\f\r\u000e\u000f\u0010\u0011\u0012\u0013\u0014\u0015\u0016\u0017\u0018\u0019\u001a\u001b\u001c\u001d\u001e\u001f !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~ÄĀāÉĄÖÜáąČäčĆć鏟ĎíďĒēĖóėôöõúĚěü†°Ę£§•¶ß®©™ę¨≠ģĮįĪ≤≥īĶ∂∑łĻļĽľĹĺŅņѬ√ńŇ∆«»… ňŐÕőŌ–—“”‘’÷◊ōŔŕŘ‹›řŖŗŠ‚„šŚśÁŤťÍŽžŪÓÔūŮÚůŰűŲųÝýķŻŁżĢˇ", D = [], e = {}; for(var i=0;i!=d.length;++i) { if(d.charCodeAt(i) !== 0xFFFD) e[d.charAt(i)] = i; D[i] = d.charAt(i); } return {"enc": e, "dec": D }; })();
  980. cptable[10079] = (function(){ var d = "\u0000\u0001\u0002\u0003\u0004\u0005\u0006\u0007\b\t\n\u000b\f\r\u000e\u000f\u0010\u0011\u0012\u0013\u0014\u0015\u0016\u0017\u0018\u0019\u001a\u001b\u001c\u001d\u001e\u001f !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~ÄÅÇÉÑÖÜáàâäãåçéèêëíìîïñóòôöõúùûüÝ°¢£§•¶ß®©™´¨≠ÆØ∞±≤≥¥µ∂∑∏π∫ªºΩæø¿¡¬√ƒ≈∆«»… ÀÃÕŒœ–—“”‘’÷◊ÿŸ⁄¤ÐðÞþý·‚„‰ÂÊÁËÈÍÎÏÌÓÔ�ÒÚÛÙıˆ˜¯˘˙˚¸˝˛ˇ", D = [], e = {}; for(var i=0;i!=d.length;++i) { if(d.charCodeAt(i) !== 0xFFFD) e[d.charAt(i)] = i; D[i] = d.charAt(i); } return {"enc": e, "dec": D }; })();
  981. cptable[10081] = (function(){ var d = "\u0000\u0001\u0002\u0003\u0004\u0005\u0006\u0007\b\t\n\u000b\f\r\u000e\u000f\u0010\u0011\u0012\u0013\u0014\u0015\u0016\u0017\u0018\u0019\u001a\u001b\u001c\u001d\u001e\u001f !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~ÄÅÇÉÑÖÜáàâäãåçéèêëíìîïñóòôöõúùûü†°¢£§•¶ß®©™´¨≠ÆØ∞±≤≥¥µ∂∑∏π∫ªºΩæø¿¡¬√ƒ≈∆«»… ÀÃÕŒœ–—“”‘’÷◊ÿŸĞğİıŞş‡·‚„‰ÂÊÁËÈÍÎÏÌÓÔ�ÒÚÛÙ�ˆ˜¯˘˙˚¸˝˛ˇ", D = [], e = {}; for(var i=0;i!=d.length;++i) { if(d.charCodeAt(i) !== 0xFFFD) e[d.charAt(i)] = i; D[i] = d.charAt(i); } return {"enc": e, "dec": D }; })();
  982. cptable[28591] = (function(){ var d = "\u0000\u0001\u0002\u0003\u0004\u0005\u0006\u0007\b\t\n\u000b\f\r\u000e\u000f\u0010\u0011\u0012\u0013\u0014\u0015\u0016\u0017\u0018\u0019\u001a\u001b\u001c\u001d\u001e\u001f !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œžŸ ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ", D = [], e = {}; for(var i=0;i!=d.length;++i) { if(d.charCodeAt(i) !== 0xFFFD) e[d.charAt(i)] = i; D[i] = d.charAt(i); } return {"enc": e, "dec": D }; })();
  983. // eslint-disable-next-line no-undef
  984. if ( true && module.exports && typeof DO_NOT_EXPORT_CODEPAGE === 'undefined') module.exports = cptable;
  985. /*! cputils.js (C) 2013-present SheetJS -- http://sheetjs.com */
  986. /* vim: set ft=javascript: */
  987. /*jshint newcap: false */
  988. (function(root, factory) {
  989. /*jshint ignore:start */
  990. /*eslint-disable */
  991. "use strict";
  992. if(typeof cptable === "undefined") {
  993. if(true){
  994. var cpt = cptable;
  995. if ( true && module.exports && typeof DO_NOT_EXPORT_CODEPAGE === 'undefined') module.exports = factory(cpt);
  996. else root.cptable = factory(cpt);
  997. } else {}
  998. } else cptable = factory(cptable);
  999. /*eslint-enable */
  1000. /*jshint ignore:end */
  1001. }(this, function(cpt){
  1002. "use strict";
  1003. /*global module, Buffer */
  1004. var magic = {
  1005. "1200":"utf16le",
  1006. "1201":"utf16be",
  1007. "12000":"utf32le",
  1008. "12001":"utf32be",
  1009. "16969":"utf64le",
  1010. "20127":"ascii",
  1011. "65000":"utf7",
  1012. "65001":"utf8"
  1013. };
  1014. var sbcs_cache = [874,1250,1251,1252,1253,1254,1255,1256,10000];
  1015. var dbcs_cache = [932,936,949,950];
  1016. var magic_cache = [65001];
  1017. var magic_decode = {};
  1018. var magic_encode = {};
  1019. var cpdcache = {};
  1020. var cpecache = {};
  1021. var sfcc = function sfcc(x) { return String.fromCharCode(x); };
  1022. var cca = function cca(x) { return x.charCodeAt(0); };
  1023. var has_buf = (typeof Buffer !== 'undefined');
  1024. var Buffer_from = function(){};
  1025. if(has_buf) {
  1026. var nbfs = !Buffer.from;
  1027. if(!nbfs) try { Buffer.from("foo", "utf8"); } catch(e) { nbfs = true; }
  1028. Buffer_from = nbfs ? function(buf, enc) { return (enc) ? new Buffer(buf, enc) : new Buffer(buf); } : Buffer.from.bind(Buffer);
  1029. // $FlowIgnore
  1030. if(!Buffer.allocUnsafe) Buffer.allocUnsafe = function(n) { return new Buffer(n); };
  1031. var mdl = 1024, mdb = Buffer.allocUnsafe(mdl);
  1032. var make_EE = function make_EE(E){
  1033. var EE = Buffer.allocUnsafe(65536);
  1034. for(var i = 0; i < 65536;++i) EE[i] = 0;
  1035. var keys = Object.keys(E), len = keys.length;
  1036. for(var ee = 0, e = keys[ee]; ee < len; ++ee) {
  1037. if(!(e = keys[ee])) continue;
  1038. EE[e.charCodeAt(0)] = E[e];
  1039. }
  1040. return EE;
  1041. };
  1042. var sbcs_encode = function make_sbcs_encode(cp) {
  1043. var EE = make_EE(cpt[cp].enc);
  1044. return function sbcs_e(data, ofmt) {
  1045. var len = data.length;
  1046. var out, i=0, j=0, D=0, w=0;
  1047. if(typeof data === 'string') {
  1048. out = Buffer.allocUnsafe(len);
  1049. for(i = 0; i < len; ++i) out[i] = EE[data.charCodeAt(i)];
  1050. } else if(Buffer.isBuffer(data)) {
  1051. out = Buffer.allocUnsafe(2*len);
  1052. j = 0;
  1053. for(i = 0; i < len; ++i) {
  1054. D = data[i];
  1055. if(D < 128) out[j++] = EE[D];
  1056. else if(D < 224) { out[j++] = EE[((D&31)<<6)+(data[i+1]&63)]; ++i; }
  1057. else if(D < 240) { out[j++] = EE[((D&15)<<12)+((data[i+1]&63)<<6)+(data[i+2]&63)]; i+=2; }
  1058. else {
  1059. w = ((D&7)<<18)+((data[i+1]&63)<<12)+((data[i+2]&63)<<6)+(data[i+3]&63); i+=3;
  1060. if(w < 65536) out[j++] = EE[w];
  1061. else { w -= 65536; out[j++] = EE[0xD800 + ((w>>10)&1023)]; out[j++] = EE[0xDC00 + (w&1023)]; }
  1062. }
  1063. }
  1064. out = out.slice(0,j);
  1065. } else {
  1066. out = Buffer.allocUnsafe(len);
  1067. for(i = 0; i < len; ++i) out[i] = EE[data[i].charCodeAt(0)];
  1068. }
  1069. if(!ofmt || ofmt === 'buf') return out;
  1070. if(ofmt !== 'arr') return out.toString('binary');
  1071. return [].slice.call(out);
  1072. };
  1073. };
  1074. var sbcs_decode = function make_sbcs_decode(cp) {
  1075. var D = cpt[cp].dec;
  1076. var DD = Buffer.allocUnsafe(131072), d=0, c="";
  1077. for(d=0;d<D.length;++d) {
  1078. if(!(c=D[d])) continue;
  1079. var w = c.charCodeAt(0);
  1080. DD[2*d] = w&255; DD[2*d+1] = w>>8;
  1081. }
  1082. return function sbcs_d(data) {
  1083. var len = data.length, i=0, j=0;
  1084. if(2 * len > mdl) { mdl = 2 * len; mdb = Buffer.allocUnsafe(mdl); }
  1085. if(Buffer.isBuffer(data)) {
  1086. for(i = 0; i < len; i++) {
  1087. j = 2*data[i];
  1088. mdb[2*i] = DD[j]; mdb[2*i+1] = DD[j+1];
  1089. }
  1090. } else if(typeof data === "string") {
  1091. for(i = 0; i < len; i++) {
  1092. j = 2*data.charCodeAt(i);
  1093. mdb[2*i] = DD[j]; mdb[2*i+1] = DD[j+1];
  1094. }
  1095. } else {
  1096. for(i = 0; i < len; i++) {
  1097. j = 2*data[i];
  1098. mdb[2*i] = DD[j]; mdb[2*i+1] = DD[j+1];
  1099. }
  1100. }
  1101. return mdb.slice(0, 2 * len).toString('ucs2');
  1102. };
  1103. };
  1104. var dbcs_encode = function make_dbcs_encode(cp) {
  1105. var E = cpt[cp].enc;
  1106. var EE = Buffer.allocUnsafe(131072);
  1107. for(var i = 0; i < 131072; ++i) EE[i] = 0;
  1108. var keys = Object.keys(E);
  1109. for(var ee = 0, e = keys[ee]; ee < keys.length; ++ee) {
  1110. if(!(e = keys[ee])) continue;
  1111. var f = e.charCodeAt(0);
  1112. EE[2*f] = E[e] & 255; EE[2*f+1] = E[e]>>8;
  1113. }
  1114. return function dbcs_e(data, ofmt) {
  1115. var len = data.length, out = Buffer.allocUnsafe(2*len), i=0, j=0, jj=0, k=0, D=0;
  1116. if(typeof data === 'string') {
  1117. for(i = k = 0; i < len; ++i) {
  1118. j = data.charCodeAt(i)*2;
  1119. out[k++] = EE[j+1] || EE[j]; if(EE[j+1] > 0) out[k++] = EE[j];
  1120. }
  1121. out = out.slice(0,k);
  1122. } else if(Buffer.isBuffer(data)) {
  1123. for(i = k = 0; i < len; ++i) {
  1124. D = data[i];
  1125. if(D < 128) j = D;
  1126. else if(D < 224) { j = ((D&31)<<6)+(data[i+1]&63); ++i; }
  1127. else if(D < 240) { j = ((D&15)<<12)+((data[i+1]&63)<<6)+(data[i+2]&63); i+=2; }
  1128. else { j = ((D&7)<<18)+((data[i+1]&63)<<12)+((data[i+2]&63)<<6)+(data[i+3]&63); i+=3; }
  1129. if(j<65536) { j*=2; out[k++] = EE[j+1] || EE[j]; if(EE[j+1] > 0) out[k++] = EE[j]; }
  1130. else { jj = j-65536;
  1131. j=2*(0xD800 + ((jj>>10)&1023)); out[k++] = EE[j+1] || EE[j]; if(EE[j+1] > 0) out[k++] = EE[j];
  1132. j=2*(0xDC00 + (jj&1023)); out[k++] = EE[j+1] || EE[j]; if(EE[j+1] > 0) out[k++] = EE[j];
  1133. }
  1134. }
  1135. out = out.slice(0,k);
  1136. } else {
  1137. for(i = k = 0; i < len; i++) {
  1138. j = data[i].charCodeAt(0)*2;
  1139. out[k++] = EE[j+1] || EE[j]; if(EE[j+1] > 0) out[k++] = EE[j];
  1140. }
  1141. }
  1142. if(!ofmt || ofmt === 'buf') return out;
  1143. if(ofmt !== 'arr') return out.toString('binary');
  1144. return [].slice.call(out);
  1145. };
  1146. };
  1147. var dbcs_decode = function make_dbcs_decode(cp) {
  1148. var D = cpt[cp].dec;
  1149. var DD = Buffer.allocUnsafe(131072), d=0, c, w=0, j=0, i=0;
  1150. for(i = 0; i < 65536; ++i) { DD[2*i] = 0xFF; DD[2*i+1] = 0xFD;}
  1151. for(d = 0; d < D.length; ++d) {
  1152. if(!(c=D[d])) continue;
  1153. w = c.charCodeAt(0);
  1154. j = 2*d;
  1155. DD[j] = w&255; DD[j+1] = w>>8;
  1156. }
  1157. return function dbcs_d(data) {
  1158. var len = data.length, out = Buffer.allocUnsafe(2*len), i=0, j=0, k=0;
  1159. if(Buffer.isBuffer(data)) {
  1160. for(i = 0; i < len; i++) {
  1161. j = 2*data[i];
  1162. if(DD[j]===0xFF && DD[j+1]===0xFD) { j=2*((data[i]<<8)+data[i+1]); ++i; }
  1163. out[k++] = DD[j]; out[k++] = DD[j+1];
  1164. }
  1165. } else if(typeof data === "string") {
  1166. for(i = 0; i < len; i++) {
  1167. j = 2*data.charCodeAt(i);
  1168. if(DD[j]===0xFF && DD[j+1]===0xFD) { j=2*((data.charCodeAt(i)<<8)+data.charCodeAt(i+1)); ++i; }
  1169. out[k++] = DD[j]; out[k++] = DD[j+1];
  1170. }
  1171. } else {
  1172. for(i = 0; i < len; i++) {
  1173. j = 2*data[i];
  1174. if(DD[j]===0xFF && DD[j+1]===0xFD) { j=2*((data[i]<<8)+data[i+1]); ++i; }
  1175. out[k++] = DD[j]; out[k++] = DD[j+1];
  1176. }
  1177. }
  1178. return out.slice(0,k).toString('ucs2');
  1179. };
  1180. };
  1181. magic_decode[65001] = function utf8_d(data) {
  1182. if(typeof data === "string") return utf8_d(data.split("").map(cca));
  1183. var len = data.length, w = 0, ww = 0;
  1184. if(4 * len > mdl) { mdl = 4 * len; mdb = Buffer.allocUnsafe(mdl); }
  1185. var i = 0;
  1186. if(len >= 3 && data[0] == 0xEF) if(data[1] == 0xBB && data[2] == 0xBF) i = 3;
  1187. for(var j = 1, k = 0, D = 0; i < len; i+=j) {
  1188. j = 1; D = data[i];
  1189. if(D < 128) w = D;
  1190. else if(D < 224) { w=(D&31)*64+(data[i+1]&63); j=2; }
  1191. else if(D < 240) { w=((D&15)<<12)+(data[i+1]&63)*64+(data[i+2]&63); j=3; }
  1192. else { w=(D&7)*262144+((data[i+1]&63)<<12)+(data[i+2]&63)*64+(data[i+3]&63); j=4; }
  1193. if(w < 65536) { mdb[k++] = w&255; mdb[k++] = w>>8; }
  1194. else {
  1195. w -= 65536; ww = 0xD800 + ((w>>10)&1023); w = 0xDC00 + (w&1023);
  1196. mdb[k++] = ww&255; mdb[k++] = ww>>>8; mdb[k++] = w&255; mdb[k++] = (w>>>8)&255;
  1197. }
  1198. }
  1199. return mdb.slice(0,k).toString('ucs2');
  1200. };
  1201. magic_encode[65001] = function utf8_e(data, ofmt) {
  1202. if(has_buf && Buffer.isBuffer(data)) {
  1203. if(!ofmt || ofmt === 'buf') return data;
  1204. if(ofmt !== 'arr') return data.toString('binary');
  1205. return [].slice.call(data);
  1206. }
  1207. var len = data.length, w = 0, ww = 0, j = 0;
  1208. var direct = typeof data === "string";
  1209. if(4 * len > mdl) { mdl = 4 * len; mdb = Buffer.allocUnsafe(mdl); }
  1210. for(var i = 0; i < len; ++i) {
  1211. w = direct ? data.charCodeAt(i) : data[i].charCodeAt(0);
  1212. if(w <= 0x007F) mdb[j++] = w;
  1213. else if(w <= 0x07FF) {
  1214. mdb[j++] = 192 + (w >> 6);
  1215. mdb[j++] = 128 + (w&63);
  1216. } else if(w >= 0xD800 && w <= 0xDFFF) {
  1217. w -= 0xD800; ++i;
  1218. ww = (direct ? data.charCodeAt(i) : data[i].charCodeAt(0)) - 0xDC00 + (w << 10);
  1219. mdb[j++] = 240 + ((ww>>>18) & 0x07);
  1220. mdb[j++] = 144 + ((ww>>>12) & 0x3F);
  1221. mdb[j++] = 128 + ((ww>>>6) & 0x3F);
  1222. mdb[j++] = 128 + (ww & 0x3F);
  1223. } else {
  1224. mdb[j++] = 224 + (w >> 12);
  1225. mdb[j++] = 128 + ((w >> 6)&63);
  1226. mdb[j++] = 128 + (w&63);
  1227. }
  1228. }
  1229. if(!ofmt || ofmt === 'buf') return mdb.slice(0,j);
  1230. if(ofmt !== 'arr') return mdb.slice(0,j).toString('binary');
  1231. return [].slice.call(mdb, 0, j);
  1232. };
  1233. }
  1234. var encache = function encache() {
  1235. if(has_buf) {
  1236. if(cpdcache[sbcs_cache[0]]) return;
  1237. var i=0, s=0;
  1238. for(i = 0; i < sbcs_cache.length; ++i) {
  1239. s = sbcs_cache[i];
  1240. if(cpt[s]) {
  1241. cpdcache[s] = sbcs_decode(s);
  1242. cpecache[s] = sbcs_encode(s);
  1243. }
  1244. }
  1245. for(i = 0; i < dbcs_cache.length; ++i) {
  1246. s = dbcs_cache[i];
  1247. if(cpt[s]) {
  1248. cpdcache[s] = dbcs_decode(s);
  1249. cpecache[s] = dbcs_encode(s);
  1250. }
  1251. }
  1252. for(i = 0; i < magic_cache.length; ++i) {
  1253. s = magic_cache[i];
  1254. if(magic_decode[s]) cpdcache[s] = magic_decode[s];
  1255. if(magic_encode[s]) cpecache[s] = magic_encode[s];
  1256. }
  1257. }
  1258. };
  1259. var null_enc = function(data, ofmt) { void ofmt; return ""; };
  1260. var cp_decache = function cp_decache(cp) { delete cpdcache[cp]; delete cpecache[cp]; };
  1261. var decache = function decache() {
  1262. if(has_buf) {
  1263. if(!cpdcache[sbcs_cache[0]]) return;
  1264. sbcs_cache.forEach(cp_decache);
  1265. dbcs_cache.forEach(cp_decache);
  1266. magic_cache.forEach(cp_decache);
  1267. }
  1268. last_enc = null_enc; last_cp = 0;
  1269. };
  1270. var cache = {
  1271. encache: encache,
  1272. decache: decache,
  1273. sbcs: sbcs_cache,
  1274. dbcs: dbcs_cache
  1275. };
  1276. encache();
  1277. var BM = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
  1278. var SetD = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789'(),-./:?";
  1279. var last_enc = null_enc, last_cp = 0;
  1280. var encode = function encode(cp, data, ofmt) {
  1281. if(cp === last_cp && last_enc) { return last_enc(data, ofmt); }
  1282. if(cpecache[cp]) { last_enc = cpecache[last_cp=cp]; return last_enc(data, ofmt); }
  1283. if(has_buf && Buffer.isBuffer(data)) data = data.toString('utf8');
  1284. var len = data.length;
  1285. var out = has_buf ? Buffer.allocUnsafe(4*len) : [], w=0, i=0, j = 0, ww=0;
  1286. var C = cpt[cp], E, M = "";
  1287. var isstr = typeof data === 'string';
  1288. if(C && (E=C.enc)) for(i = 0; i < len; ++i, ++j) {
  1289. w = E[isstr? data.charAt(i) : data[i]];
  1290. if(w > 255) {
  1291. out[j] = w>>8;
  1292. out[++j] = w&255;
  1293. } else out[j] = w&255;
  1294. }
  1295. else if((M=magic[cp])) switch(M) {
  1296. case "utf8":
  1297. if(has_buf && isstr) { out = Buffer_from(data, M); j = out.length; break; }
  1298. for(i = 0; i < len; ++i, ++j) {
  1299. w = isstr ? data.charCodeAt(i) : data[i].charCodeAt(0);
  1300. if(w <= 0x007F) out[j] = w;
  1301. else if(w <= 0x07FF) {
  1302. out[j] = 192 + (w >> 6);
  1303. out[++j] = 128 + (w&63);
  1304. } else if(w >= 0xD800 && w <= 0xDFFF) {
  1305. w -= 0xD800;
  1306. ww = (isstr ? data.charCodeAt(++i) : data[++i].charCodeAt(0)) - 0xDC00 + (w << 10);
  1307. out[j] = 240 + ((ww>>>18) & 0x07);
  1308. out[++j] = 144 + ((ww>>>12) & 0x3F);
  1309. out[++j] = 128 + ((ww>>>6) & 0x3F);
  1310. out[++j] = 128 + (ww & 0x3F);
  1311. } else {
  1312. out[j] = 224 + (w >> 12);
  1313. out[++j] = 128 + ((w >> 6)&63);
  1314. out[++j] = 128 + (w&63);
  1315. }
  1316. }
  1317. break;
  1318. case "ascii":
  1319. if(has_buf && typeof data === "string") { out = Buffer_from(data, M); j = out.length; break; }
  1320. for(i = 0; i < len; ++i, ++j) {
  1321. w = isstr ? data.charCodeAt(i) : data[i].charCodeAt(0);
  1322. if(w <= 0x007F) out[j] = w;
  1323. else throw new Error("bad ascii " + w);
  1324. }
  1325. break;
  1326. case "utf16le":
  1327. if(has_buf && typeof data === "string") { out = Buffer_from(data, M); j = out.length; break; }
  1328. for(i = 0; i < len; ++i) {
  1329. w = isstr ? data.charCodeAt(i) : data[i].charCodeAt(0);
  1330. out[j++] = w&255;
  1331. out[j++] = w>>8;
  1332. }
  1333. break;
  1334. case "utf16be":
  1335. for(i = 0; i < len; ++i) {
  1336. w = isstr ? data.charCodeAt(i) : data[i].charCodeAt(0);
  1337. out[j++] = w>>8;
  1338. out[j++] = w&255;
  1339. }
  1340. break;
  1341. case "utf32le":
  1342. for(i = 0; i < len; ++i) {
  1343. w = isstr ? data.charCodeAt(i) : data[i].charCodeAt(0);
  1344. if(w >= 0xD800 && w <= 0xDFFF) w = 0x10000 + ((w - 0xD800) << 10) + (data[++i].charCodeAt(0) - 0xDC00);
  1345. out[j++] = w&255; w >>= 8;
  1346. out[j++] = w&255; w >>= 8;
  1347. out[j++] = w&255; w >>= 8;
  1348. out[j++] = w&255;
  1349. }
  1350. break;
  1351. case "utf32be":
  1352. for(i = 0; i < len; ++i) {
  1353. w = isstr ? data.charCodeAt(i) : data[i].charCodeAt(0);
  1354. if(w >= 0xD800 && w <= 0xDFFF) w = 0x10000 + ((w - 0xD800) << 10) + (data[++i].charCodeAt(0) - 0xDC00);
  1355. out[j+3] = w&255; w >>= 8;
  1356. out[j+2] = w&255; w >>= 8;
  1357. out[j+1] = w&255; w >>= 8;
  1358. out[j] = w&255;
  1359. j+=4;
  1360. }
  1361. break;
  1362. case "utf7":
  1363. for(i = 0; i < len; i++) {
  1364. var c = isstr ? data.charAt(i) : data[i].charAt(0);
  1365. if(c === "+") { out[j++] = 0x2b; out[j++] = 0x2d; continue; }
  1366. if(SetD.indexOf(c) > -1) { out[j++] = c.charCodeAt(0); continue; }
  1367. var tt = encode(1201, c);
  1368. out[j++] = 0x2b;
  1369. out[j++] = BM.charCodeAt(tt[0]>>2);
  1370. out[j++] = BM.charCodeAt(((tt[0]&0x03)<<4) + ((tt[1]||0)>>4));
  1371. out[j++] = BM.charCodeAt(((tt[1]&0x0F)<<2) + ((tt[2]||0)>>6));
  1372. out[j++] = 0x2d;
  1373. }
  1374. break;
  1375. default: throw new Error("Unsupported magic: " + cp + " " + magic[cp]);
  1376. }
  1377. else throw new Error("Unrecognized CP: " + cp);
  1378. out = out.slice(0,j);
  1379. if(!has_buf) return (ofmt == 'str') ? (out).map(sfcc).join("") : out;
  1380. if(!ofmt || ofmt === 'buf') return out;
  1381. if(ofmt !== 'arr') return out.toString('binary');
  1382. return [].slice.call(out);
  1383. };
  1384. var decode = function decode(cp, data) {
  1385. var F; if((F=cpdcache[cp])) return F(data);
  1386. if(typeof data === "string") return decode(cp, data.split("").map(cca));
  1387. var len = data.length, out = new Array(len), s="", w=0, i=0, j=1, k=0, ww=0;
  1388. var C = cpt[cp], D, M="";
  1389. if(C && (D=C.dec)) {
  1390. for(i = 0; i < len; i+=j) {
  1391. j = 2;
  1392. s = D[(data[i]<<8)+ data[i+1]];
  1393. if(!s) {
  1394. j = 1;
  1395. s = D[data[i]];
  1396. }
  1397. if(!s) throw new Error('Unrecognized code: ' + data[i] + ' ' + data[i+j-1] + ' ' + i + ' ' + j + ' ' + D[data[i]]);
  1398. out[k++] = s;
  1399. }
  1400. }
  1401. else if((M=magic[cp])) switch(M) {
  1402. case "utf8":
  1403. if(len >= 3 && data[0] == 0xEF) if(data[1] == 0xBB && data[2] == 0xBF) i = 3;
  1404. for(; i < len; i+=j) {
  1405. j = 1;
  1406. if(data[i] < 128) w = data[i];
  1407. else if(data[i] < 224) { w=(data[i]&31)*64+(data[i+1]&63); j=2; }
  1408. else if(data[i] < 240) { w=((data[i]&15)<<12)+(data[i+1]&63)*64+(data[i+2]&63); j=3; }
  1409. else { w=(data[i]&7)*262144+((data[i+1]&63)<<12)+(data[i+2]&63)*64+(data[i+3]&63); j=4; }
  1410. if(w < 65536) { out[k++] = String.fromCharCode(w); }
  1411. else {
  1412. w -= 65536; ww = 0xD800 + ((w>>10)&1023); w = 0xDC00 + (w&1023);
  1413. out[k++] = String.fromCharCode(ww); out[k++] = String.fromCharCode(w);
  1414. }
  1415. }
  1416. break;
  1417. case "ascii":
  1418. if(has_buf && Buffer.isBuffer(data)) return data.toString(M);
  1419. for(i = 0; i < len; i++) out[i] = String.fromCharCode(data[i]);
  1420. k = len; break;
  1421. case "utf16le":
  1422. if(len >= 2 && data[0] == 0xFF) if(data[1] == 0xFE) i = 2;
  1423. if(has_buf && Buffer.isBuffer(data)) return data.toString(M);
  1424. j = 2;
  1425. for(; i+1 < len; i+=j) {
  1426. out[k++] = String.fromCharCode((data[i+1]<<8) + data[i]);
  1427. }
  1428. break;
  1429. case "utf16be":
  1430. if(len >= 2 && data[0] == 0xFE) if(data[1] == 0xFF) i = 2;
  1431. j = 2;
  1432. for(; i+1 < len; i+=j) {
  1433. out[k++] = String.fromCharCode((data[i]<<8) + data[i+1]);
  1434. }
  1435. break;
  1436. case "utf32le":
  1437. if(len >= 4 && data[0] == 0xFF) if(data[1] == 0xFE && data[2] === 0 && data[3] === 0) i = 4;
  1438. j = 4;
  1439. for(; i < len; i+=j) {
  1440. w = (data[i+3]<<24) + (data[i+2]<<16) + (data[i+1]<<8) + (data[i]);
  1441. if(w > 0xFFFF) {
  1442. w -= 0x10000;
  1443. out[k++] = String.fromCharCode(0xD800 + ((w >> 10) & 0x3FF));
  1444. out[k++] = String.fromCharCode(0xDC00 + (w & 0x3FF));
  1445. }
  1446. else out[k++] = String.fromCharCode(w);
  1447. }
  1448. break;
  1449. case "utf32be":
  1450. if(len >= 4 && data[3] == 0xFF) if(data[2] == 0xFE && data[1] === 0 && data[0] === 0) i = 4;
  1451. j = 4;
  1452. for(; i < len; i+=j) {
  1453. w = (data[i]<<24) + (data[i+1]<<16) + (data[i+2]<<8) + (data[i+3]);
  1454. if(w > 0xFFFF) {
  1455. w -= 0x10000;
  1456. out[k++] = String.fromCharCode(0xD800 + ((w >> 10) & 0x3FF));
  1457. out[k++] = String.fromCharCode(0xDC00 + (w & 0x3FF));
  1458. }
  1459. else out[k++] = String.fromCharCode(w);
  1460. }
  1461. break;
  1462. case "utf7":
  1463. if(len >= 4 && data[0] == 0x2B && data[1] == 0x2F && data[2] == 0x76) {
  1464. if(len >= 5 && data[3] == 0x38 && data[4] == 0x2D) i = 5;
  1465. else if(data[3] == 0x38 || data[3] == 0x39 || data[3] == 0x2B || data[3] == 0x2F) i = 4;
  1466. }
  1467. for(; i < len; i+=j) {
  1468. if(data[i] !== 0x2b) { j=1; out[k++] = String.fromCharCode(data[i]); continue; }
  1469. j=1;
  1470. if(data[i+1] === 0x2d) { j = 2; out[k++] = "+"; continue; }
  1471. // eslint-disable-next-line no-useless-escape
  1472. while(String.fromCharCode(data[i+j]).match(/[A-Za-z0-9+\/]/)) j++;
  1473. var dash = 0;
  1474. if(data[i+j] === 0x2d) { ++j; dash=1; }
  1475. var tt = [];
  1476. var o64 = "";
  1477. var c1=0, c2=0, c3=0;
  1478. var e1=0, e2=0, e3=0, e4=0;
  1479. for(var l = 1; l < j - dash;) {
  1480. e1 = BM.indexOf(String.fromCharCode(data[i+l++]));
  1481. e2 = BM.indexOf(String.fromCharCode(data[i+l++]));
  1482. c1 = e1 << 2 | e2 >> 4;
  1483. tt.push(c1);
  1484. e3 = BM.indexOf(String.fromCharCode(data[i+l++]));
  1485. if(e3 === -1) break;
  1486. c2 = (e2 & 15) << 4 | e3 >> 2;
  1487. tt.push(c2);
  1488. e4 = BM.indexOf(String.fromCharCode(data[i+l++]));
  1489. if(e4 === -1) break;
  1490. c3 = (e3 & 3) << 6 | e4;
  1491. if(e4 < 64) tt.push(c3);
  1492. }
  1493. o64 = decode(1201, tt);
  1494. for(l = 0; l < o64.length; ++l) out[k++] = o64.charAt(l);
  1495. }
  1496. break;
  1497. default: throw new Error("Unsupported magic: " + cp + " " + magic[cp]);
  1498. }
  1499. else throw new Error("Unrecognized CP: " + cp);
  1500. return out.slice(0,k).join("");
  1501. };
  1502. var hascp = function hascp(cp) { return !!(cpt[cp] || magic[cp]); };
  1503. cpt.utils = { decode: decode, encode: encode, hascp: hascp, magic: magic, cache:cache };
  1504. return cpt;
  1505. }));
  1506. /***/ }),
  1507. /***/ "./node_modules/xlsx/jszip.js":
  1508. /*!************************************!*\
  1509. !*** ./node_modules/xlsx/jszip.js ***!
  1510. \************************************/
  1511. /***/ ((module, exports, __webpack_require__) => {
  1512. var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;/*
  1513. JSZip - A Javascript class for generating and reading zip files
  1514. <http://stuartk.com/jszip>
  1515. (c) 2009-2014 Stuart Knightley <stuart [at] stuartk.com>
  1516. Dual licenced under the MIT license or GPLv3. See https://raw.github.com/Stuk/jszip/master/LICENSE.markdown.
  1517. JSZip uses the library pako released under the MIT license :
  1518. https://github.com/nodeca/pako/blob/master/LICENSE
  1519. Note: since JSZip 3 removed critical functionality, this version assigns to the
  1520. `JSZipSync` variable. Another JSZip version can be loaded in parallel.
  1521. */
  1522. (function(e){
  1523. if( true&&"undefined"==typeof DO_NOT_EXPORT_JSZIP)module.exports=e();
  1524. else if( true&&"undefined"==typeof DO_NOT_EXPORT_JSZIP){JSZipSync=e();!(__WEBPACK_AMD_DEFINE_ARRAY__ = [], __WEBPACK_AMD_DEFINE_FACTORY__ = (e),
  1525. __WEBPACK_AMD_DEFINE_RESULT__ = (typeof __WEBPACK_AMD_DEFINE_FACTORY__ === 'function' ?
  1526. (__WEBPACK_AMD_DEFINE_FACTORY__.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__)) : __WEBPACK_AMD_DEFINE_FACTORY__),
  1527. __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));}
  1528. else{
  1529. var f;
  1530. "undefined"!=typeof globalThis?f=globalThis:
  1531. "undefined"!=typeof window?f=window:
  1532. "undefined"!=typeof __webpack_require__.g?f=__webpack_require__.g:
  1533. "undefined"!=typeof $ && $.global?f=$.global:
  1534. "undefined"!=typeof self&&(f=self),f.JSZipSync=e()
  1535. }
  1536. }(function(){var define,module,exports;return (function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=undefined;if(!u&&a)return require(o,!0);if(i)return i(o,!0);throw new Error("Cannot find module '"+o+"'")}var f=n[o]={exports:{}};t[o][0].call(f.exports,function(e){var n=t[o][1][e];return s(n?n:e)},f,f.exports,e,t,n,r)}return n[o].exports}var i=undefined;for(var o=0;o<r.length;o++)s(r[o]);return s})({1:[function(_dereq_,module,exports){
  1537. 'use strict';
  1538. // private property
  1539. var _keyStr = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=";
  1540. // public method for encoding
  1541. exports.encode = function(input, utf8) {
  1542. var output = "";
  1543. var chr1, chr2, chr3, enc1, enc2, enc3, enc4;
  1544. var i = 0;
  1545. while (i < input.length) {
  1546. chr1 = input.charCodeAt(i++);
  1547. chr2 = input.charCodeAt(i++);
  1548. chr3 = input.charCodeAt(i++);
  1549. enc1 = chr1 >> 2;
  1550. enc2 = ((chr1 & 3) << 4) | (chr2 >> 4);
  1551. enc3 = ((chr2 & 15) << 2) | (chr3 >> 6);
  1552. enc4 = chr3 & 63;
  1553. if (isNaN(chr2)) {
  1554. enc3 = enc4 = 64;
  1555. }
  1556. else if (isNaN(chr3)) {
  1557. enc4 = 64;
  1558. }
  1559. output = output + _keyStr.charAt(enc1) + _keyStr.charAt(enc2) + _keyStr.charAt(enc3) + _keyStr.charAt(enc4);
  1560. }
  1561. return output;
  1562. };
  1563. // public method for decoding
  1564. exports.decode = function(input, utf8) {
  1565. var output = "";
  1566. var chr1, chr2, chr3;
  1567. var enc1, enc2, enc3, enc4;
  1568. var i = 0;
  1569. input = input.replace(/[^A-Za-z0-9\+\/\=]/g, "");
  1570. while (i < input.length) {
  1571. enc1 = _keyStr.indexOf(input.charAt(i++));
  1572. enc2 = _keyStr.indexOf(input.charAt(i++));
  1573. enc3 = _keyStr.indexOf(input.charAt(i++));
  1574. enc4 = _keyStr.indexOf(input.charAt(i++));
  1575. chr1 = (enc1 << 2) | (enc2 >> 4);
  1576. chr2 = ((enc2 & 15) << 4) | (enc3 >> 2);
  1577. chr3 = ((enc3 & 3) << 6) | enc4;
  1578. output = output + String.fromCharCode(chr1);
  1579. if (enc3 != 64) {
  1580. output = output + String.fromCharCode(chr2);
  1581. }
  1582. if (enc4 != 64) {
  1583. output = output + String.fromCharCode(chr3);
  1584. }
  1585. }
  1586. return output;
  1587. };
  1588. },{}],2:[function(_dereq_,module,exports){
  1589. 'use strict';
  1590. function CompressedObject() {
  1591. this.compressedSize = 0;
  1592. this.uncompressedSize = 0;
  1593. this.crc32 = 0;
  1594. this.compressionMethod = null;
  1595. this.compressedContent = null;
  1596. }
  1597. CompressedObject.prototype = {
  1598. /**
  1599. * Return the decompressed content in an unspecified format.
  1600. * The format will depend on the decompressor.
  1601. * @return {Object} the decompressed content.
  1602. */
  1603. getContent: function() {
  1604. return null; // see implementation
  1605. },
  1606. /**
  1607. * Return the compressed content in an unspecified format.
  1608. * The format will depend on the compressed conten source.
  1609. * @return {Object} the compressed content.
  1610. */
  1611. getCompressedContent: function() {
  1612. return null; // see implementation
  1613. }
  1614. };
  1615. module.exports = CompressedObject;
  1616. },{}],3:[function(_dereq_,module,exports){
  1617. 'use strict';
  1618. exports.STORE = {
  1619. magic: "\x00\x00",
  1620. compress: function(content) {
  1621. return content; // no compression
  1622. },
  1623. uncompress: function(content) {
  1624. return content; // no compression
  1625. },
  1626. compressInputType: null,
  1627. uncompressInputType: null
  1628. };
  1629. exports.DEFLATE = _dereq_('./flate');
  1630. },{"./flate":8}],4:[function(_dereq_,module,exports){
  1631. 'use strict';
  1632. var utils = _dereq_('./utils');
  1633. var table = [
  1634. 0x00000000, 0x77073096, 0xEE0E612C, 0x990951BA,
  1635. 0x076DC419, 0x706AF48F, 0xE963A535, 0x9E6495A3,
  1636. 0x0EDB8832, 0x79DCB8A4, 0xE0D5E91E, 0x97D2D988,
  1637. 0x09B64C2B, 0x7EB17CBD, 0xE7B82D07, 0x90BF1D91,
  1638. 0x1DB71064, 0x6AB020F2, 0xF3B97148, 0x84BE41DE,
  1639. 0x1ADAD47D, 0x6DDDE4EB, 0xF4D4B551, 0x83D385C7,
  1640. 0x136C9856, 0x646BA8C0, 0xFD62F97A, 0x8A65C9EC,
  1641. 0x14015C4F, 0x63066CD9, 0xFA0F3D63, 0x8D080DF5,
  1642. 0x3B6E20C8, 0x4C69105E, 0xD56041E4, 0xA2677172,
  1643. 0x3C03E4D1, 0x4B04D447, 0xD20D85FD, 0xA50AB56B,
  1644. 0x35B5A8FA, 0x42B2986C, 0xDBBBC9D6, 0xACBCF940,
  1645. 0x32D86CE3, 0x45DF5C75, 0xDCD60DCF, 0xABD13D59,
  1646. 0x26D930AC, 0x51DE003A, 0xC8D75180, 0xBFD06116,
  1647. 0x21B4F4B5, 0x56B3C423, 0xCFBA9599, 0xB8BDA50F,
  1648. 0x2802B89E, 0x5F058808, 0xC60CD9B2, 0xB10BE924,
  1649. 0x2F6F7C87, 0x58684C11, 0xC1611DAB, 0xB6662D3D,
  1650. 0x76DC4190, 0x01DB7106, 0x98D220BC, 0xEFD5102A,
  1651. 0x71B18589, 0x06B6B51F, 0x9FBFE4A5, 0xE8B8D433,
  1652. 0x7807C9A2, 0x0F00F934, 0x9609A88E, 0xE10E9818,
  1653. 0x7F6A0DBB, 0x086D3D2D, 0x91646C97, 0xE6635C01,
  1654. 0x6B6B51F4, 0x1C6C6162, 0x856530D8, 0xF262004E,
  1655. 0x6C0695ED, 0x1B01A57B, 0x8208F4C1, 0xF50FC457,
  1656. 0x65B0D9C6, 0x12B7E950, 0x8BBEB8EA, 0xFCB9887C,
  1657. 0x62DD1DDF, 0x15DA2D49, 0x8CD37CF3, 0xFBD44C65,
  1658. 0x4DB26158, 0x3AB551CE, 0xA3BC0074, 0xD4BB30E2,
  1659. 0x4ADFA541, 0x3DD895D7, 0xA4D1C46D, 0xD3D6F4FB,
  1660. 0x4369E96A, 0x346ED9FC, 0xAD678846, 0xDA60B8D0,
  1661. 0x44042D73, 0x33031DE5, 0xAA0A4C5F, 0xDD0D7CC9,
  1662. 0x5005713C, 0x270241AA, 0xBE0B1010, 0xC90C2086,
  1663. 0x5768B525, 0x206F85B3, 0xB966D409, 0xCE61E49F,
  1664. 0x5EDEF90E, 0x29D9C998, 0xB0D09822, 0xC7D7A8B4,
  1665. 0x59B33D17, 0x2EB40D81, 0xB7BD5C3B, 0xC0BA6CAD,
  1666. 0xEDB88320, 0x9ABFB3B6, 0x03B6E20C, 0x74B1D29A,
  1667. 0xEAD54739, 0x9DD277AF, 0x04DB2615, 0x73DC1683,
  1668. 0xE3630B12, 0x94643B84, 0x0D6D6A3E, 0x7A6A5AA8,
  1669. 0xE40ECF0B, 0x9309FF9D, 0x0A00AE27, 0x7D079EB1,
  1670. 0xF00F9344, 0x8708A3D2, 0x1E01F268, 0x6906C2FE,
  1671. 0xF762575D, 0x806567CB, 0x196C3671, 0x6E6B06E7,
  1672. 0xFED41B76, 0x89D32BE0, 0x10DA7A5A, 0x67DD4ACC,
  1673. 0xF9B9DF6F, 0x8EBEEFF9, 0x17B7BE43, 0x60B08ED5,
  1674. 0xD6D6A3E8, 0xA1D1937E, 0x38D8C2C4, 0x4FDFF252,
  1675. 0xD1BB67F1, 0xA6BC5767, 0x3FB506DD, 0x48B2364B,
  1676. 0xD80D2BDA, 0xAF0A1B4C, 0x36034AF6, 0x41047A60,
  1677. 0xDF60EFC3, 0xA867DF55, 0x316E8EEF, 0x4669BE79,
  1678. 0xCB61B38C, 0xBC66831A, 0x256FD2A0, 0x5268E236,
  1679. 0xCC0C7795, 0xBB0B4703, 0x220216B9, 0x5505262F,
  1680. 0xC5BA3BBE, 0xB2BD0B28, 0x2BB45A92, 0x5CB36A04,
  1681. 0xC2D7FFA7, 0xB5D0CF31, 0x2CD99E8B, 0x5BDEAE1D,
  1682. 0x9B64C2B0, 0xEC63F226, 0x756AA39C, 0x026D930A,
  1683. 0x9C0906A9, 0xEB0E363F, 0x72076785, 0x05005713,
  1684. 0x95BF4A82, 0xE2B87A14, 0x7BB12BAE, 0x0CB61B38,
  1685. 0x92D28E9B, 0xE5D5BE0D, 0x7CDCEFB7, 0x0BDBDF21,
  1686. 0x86D3D2D4, 0xF1D4E242, 0x68DDB3F8, 0x1FDA836E,
  1687. 0x81BE16CD, 0xF6B9265B, 0x6FB077E1, 0x18B74777,
  1688. 0x88085AE6, 0xFF0F6A70, 0x66063BCA, 0x11010B5C,
  1689. 0x8F659EFF, 0xF862AE69, 0x616BFFD3, 0x166CCF45,
  1690. 0xA00AE278, 0xD70DD2EE, 0x4E048354, 0x3903B3C2,
  1691. 0xA7672661, 0xD06016F7, 0x4969474D, 0x3E6E77DB,
  1692. 0xAED16A4A, 0xD9D65ADC, 0x40DF0B66, 0x37D83BF0,
  1693. 0xA9BCAE53, 0xDEBB9EC5, 0x47B2CF7F, 0x30B5FFE9,
  1694. 0xBDBDF21C, 0xCABAC28A, 0x53B39330, 0x24B4A3A6,
  1695. 0xBAD03605, 0xCDD70693, 0x54DE5729, 0x23D967BF,
  1696. 0xB3667A2E, 0xC4614AB8, 0x5D681B02, 0x2A6F2B94,
  1697. 0xB40BBE37, 0xC30C8EA1, 0x5A05DF1B, 0x2D02EF8D
  1698. ];
  1699. /**
  1700. *
  1701. * Javascript crc32
  1702. * http://www.webtoolkit.info/
  1703. *
  1704. */
  1705. module.exports = function crc32(input, crc) {
  1706. if (typeof input === "undefined" || !input.length) {
  1707. return 0;
  1708. }
  1709. var isArray = utils.getTypeOf(input) !== "string";
  1710. if (typeof(crc) == "undefined") {
  1711. crc = 0;
  1712. }
  1713. var x = 0;
  1714. var y = 0;
  1715. var b = 0;
  1716. crc = crc ^ (-1);
  1717. for (var i = 0, iTop = input.length; i < iTop; i++) {
  1718. b = isArray ? input[i] : input.charCodeAt(i);
  1719. y = (crc ^ b) & 0xFF;
  1720. x = table[y];
  1721. crc = (crc >>> 8) ^ x;
  1722. }
  1723. return crc ^ (-1);
  1724. };
  1725. // vim: set shiftwidth=4 softtabstop=4:
  1726. },{"./utils":21}],5:[function(_dereq_,module,exports){
  1727. 'use strict';
  1728. var utils = _dereq_('./utils');
  1729. function DataReader(data) {
  1730. this.data = null; // type : see implementation
  1731. this.length = 0;
  1732. this.index = 0;
  1733. }
  1734. DataReader.prototype = {
  1735. /**
  1736. * Check that the offset will not go too far.
  1737. * @param {string} offset the additional offset to check.
  1738. * @throws {Error} an Error if the offset is out of bounds.
  1739. */
  1740. checkOffset: function(offset) {
  1741. this.checkIndex(this.index + offset);
  1742. },
  1743. /**
  1744. * Check that the specifed index will not be too far.
  1745. * @param {string} newIndex the index to check.
  1746. * @throws {Error} an Error if the index is out of bounds.
  1747. */
  1748. checkIndex: function(newIndex) {
  1749. if (this.length < newIndex || newIndex < 0) {
  1750. throw new Error("End of data reached (data length = " + this.length + ", asked index = " + (newIndex) + "). Corrupted zip ?");
  1751. }
  1752. },
  1753. /**
  1754. * Change the index.
  1755. * @param {number} newIndex The new index.
  1756. * @throws {Error} if the new index is out of the data.
  1757. */
  1758. setIndex: function(newIndex) {
  1759. this.checkIndex(newIndex);
  1760. this.index = newIndex;
  1761. },
  1762. /**
  1763. * Skip the next n bytes.
  1764. * @param {number} n the number of bytes to skip.
  1765. * @throws {Error} if the new index is out of the data.
  1766. */
  1767. skip: function(n) {
  1768. this.setIndex(this.index + n);
  1769. },
  1770. /**
  1771. * Get the byte at the specified index.
  1772. * @param {number} i the index to use.
  1773. * @return {number} a byte.
  1774. */
  1775. byteAt: function(i) {
  1776. // see implementations
  1777. },
  1778. /**
  1779. * Get the next number with a given byte size.
  1780. * @param {number} size the number of bytes to read.
  1781. * @return {number} the corresponding number.
  1782. */
  1783. readInt: function(size) {
  1784. var result = 0,
  1785. i;
  1786. this.checkOffset(size);
  1787. for (i = this.index + size - 1; i >= this.index; i--) {
  1788. result = (result << 8) + this.byteAt(i);
  1789. }
  1790. this.index += size;
  1791. return result;
  1792. },
  1793. /**
  1794. * Get the next string with a given byte size.
  1795. * @param {number} size the number of bytes to read.
  1796. * @return {string} the corresponding string.
  1797. */
  1798. readString: function(size) {
  1799. return utils.transformTo("string", this.readData(size));
  1800. },
  1801. /**
  1802. * Get raw data without conversion, <size> bytes.
  1803. * @param {number} size the number of bytes to read.
  1804. * @return {Object} the raw data, implementation specific.
  1805. */
  1806. readData: function(size) {
  1807. // see implementations
  1808. },
  1809. /**
  1810. * Find the last occurence of a zip signature (4 bytes).
  1811. * @param {string} sig the signature to find.
  1812. * @return {number} the index of the last occurence, -1 if not found.
  1813. */
  1814. lastIndexOfSignature: function(sig) {
  1815. // see implementations
  1816. },
  1817. /**
  1818. * Get the next date.
  1819. * @return {Date} the date.
  1820. */
  1821. readDate: function() {
  1822. var dostime = this.readInt(4);
  1823. return new Date(
  1824. ((dostime >> 25) & 0x7f) + 1980, // year
  1825. ((dostime >> 21) & 0x0f) - 1, // month
  1826. (dostime >> 16) & 0x1f, // day
  1827. (dostime >> 11) & 0x1f, // hour
  1828. (dostime >> 5) & 0x3f, // minute
  1829. (dostime & 0x1f) << 1); // second
  1830. }
  1831. };
  1832. module.exports = DataReader;
  1833. },{"./utils":21}],6:[function(_dereq_,module,exports){
  1834. 'use strict';
  1835. exports.base64 = false;
  1836. exports.binary = false;
  1837. exports.dir = false;
  1838. exports.createFolders = false;
  1839. exports.date = null;
  1840. exports.compression = null;
  1841. exports.comment = null;
  1842. },{}],7:[function(_dereq_,module,exports){
  1843. 'use strict';
  1844. var utils = _dereq_('./utils');
  1845. /**
  1846. * @deprecated
  1847. * This function will be removed in a future version without replacement.
  1848. */
  1849. exports.string2binary = function(str) {
  1850. return utils.string2binary(str);
  1851. };
  1852. /**
  1853. * @deprecated
  1854. * This function will be removed in a future version without replacement.
  1855. */
  1856. exports.string2Uint8Array = function(str) {
  1857. return utils.transformTo("uint8array", str);
  1858. };
  1859. /**
  1860. * @deprecated
  1861. * This function will be removed in a future version without replacement.
  1862. */
  1863. exports.uint8Array2String = function(array) {
  1864. return utils.transformTo("string", array);
  1865. };
  1866. /**
  1867. * @deprecated
  1868. * This function will be removed in a future version without replacement.
  1869. */
  1870. exports.string2Blob = function(str) {
  1871. var buffer = utils.transformTo("arraybuffer", str);
  1872. return utils.arrayBuffer2Blob(buffer);
  1873. };
  1874. /**
  1875. * @deprecated
  1876. * This function will be removed in a future version without replacement.
  1877. */
  1878. exports.arrayBuffer2Blob = function(buffer) {
  1879. return utils.arrayBuffer2Blob(buffer);
  1880. };
  1881. /**
  1882. * @deprecated
  1883. * This function will be removed in a future version without replacement.
  1884. */
  1885. exports.transformTo = function(outputType, input) {
  1886. return utils.transformTo(outputType, input);
  1887. };
  1888. /**
  1889. * @deprecated
  1890. * This function will be removed in a future version without replacement.
  1891. */
  1892. exports.getTypeOf = function(input) {
  1893. return utils.getTypeOf(input);
  1894. };
  1895. /**
  1896. * @deprecated
  1897. * This function will be removed in a future version without replacement.
  1898. */
  1899. exports.checkSupport = function(type) {
  1900. return utils.checkSupport(type);
  1901. };
  1902. /**
  1903. * @deprecated
  1904. * This value will be removed in a future version without replacement.
  1905. */
  1906. exports.MAX_VALUE_16BITS = utils.MAX_VALUE_16BITS;
  1907. /**
  1908. * @deprecated
  1909. * This value will be removed in a future version without replacement.
  1910. */
  1911. exports.MAX_VALUE_32BITS = utils.MAX_VALUE_32BITS;
  1912. /**
  1913. * @deprecated
  1914. * This function will be removed in a future version without replacement.
  1915. */
  1916. exports.pretty = function(str) {
  1917. return utils.pretty(str);
  1918. };
  1919. /**
  1920. * @deprecated
  1921. * This function will be removed in a future version without replacement.
  1922. */
  1923. exports.findCompression = function(compressionMethod) {
  1924. return utils.findCompression(compressionMethod);
  1925. };
  1926. /**
  1927. * @deprecated
  1928. * This function will be removed in a future version without replacement.
  1929. */
  1930. exports.isRegExp = function (object) {
  1931. return utils.isRegExp(object);
  1932. };
  1933. },{"./utils":21}],8:[function(_dereq_,module,exports){
  1934. 'use strict';
  1935. var USE_TYPEDARRAY = (typeof Uint8Array !== 'undefined') && (typeof Uint16Array !== 'undefined') && (typeof Uint32Array !== 'undefined');
  1936. var pako = _dereq_("pako");
  1937. exports.uncompressInputType = USE_TYPEDARRAY ? "uint8array" : "array";
  1938. exports.compressInputType = USE_TYPEDARRAY ? "uint8array" : "array";
  1939. exports.magic = "\x08\x00";
  1940. exports.compress = function(input) {
  1941. return pako.deflateRaw(input);
  1942. };
  1943. exports.uncompress = function(input) {
  1944. return pako.inflateRaw(input);
  1945. };
  1946. },{"pako":24}],9:[function(_dereq_,module,exports){
  1947. 'use strict';
  1948. var base64 = _dereq_('./base64');
  1949. /**
  1950. Usage:
  1951. zip = new JSZip();
  1952. zip.file("hello.txt", "Hello, World!").file("tempfile", "nothing");
  1953. zip.folder("images").file("smile.gif", base64Data, {base64: true});
  1954. zip.file("Xmas.txt", "Ho ho ho !", {date : new Date("December 25, 2007 00:00:01")});
  1955. zip.remove("tempfile");
  1956. base64zip = zip.generate();
  1957. **/
  1958. /**
  1959. * Representation a of zip file in js
  1960. * @constructor
  1961. * @param {String=|ArrayBuffer=|Uint8Array=} data the data to load, if any (optional).
  1962. * @param {Object=} options the options for creating this objects (optional).
  1963. */
  1964. function JSZipSync(data, options) {
  1965. // if this constructor is used without `new`, it adds `new` before itself:
  1966. if(!(this instanceof JSZipSync)) return new JSZipSync(data, options);
  1967. // object containing the files :
  1968. // {
  1969. // "folder/" : {...},
  1970. // "folder/data.txt" : {...}
  1971. // }
  1972. this.files = {};
  1973. this.comment = null;
  1974. // Where we are in the hierarchy
  1975. this.root = "";
  1976. if (data) {
  1977. this.load(data, options);
  1978. }
  1979. this.clone = function() {
  1980. var newObj = new JSZipSync();
  1981. for (var i in this) {
  1982. if (typeof this[i] !== "function") {
  1983. newObj[i] = this[i];
  1984. }
  1985. }
  1986. return newObj;
  1987. };
  1988. }
  1989. JSZipSync.prototype = _dereq_('./object');
  1990. JSZipSync.prototype.load = _dereq_('./load');
  1991. JSZipSync.support = _dereq_('./support');
  1992. JSZipSync.defaults = _dereq_('./defaults');
  1993. /**
  1994. * @deprecated
  1995. * This namespace will be removed in a future version without replacement.
  1996. */
  1997. JSZipSync.utils = _dereq_('./deprecatedPublicUtils');
  1998. JSZipSync.base64 = {
  1999. /**
  2000. * @deprecated
  2001. * This method will be removed in a future version without replacement.
  2002. */
  2003. encode : function(input) {
  2004. return base64.encode(input);
  2005. },
  2006. /**
  2007. * @deprecated
  2008. * This method will be removed in a future version without replacement.
  2009. */
  2010. decode : function(input) {
  2011. return base64.decode(input);
  2012. }
  2013. };
  2014. JSZipSync.compressions = _dereq_('./compressions');
  2015. module.exports = JSZipSync;
  2016. },{"./base64":1,"./compressions":3,"./defaults":6,"./deprecatedPublicUtils":7,"./load":10,"./object":13,"./support":17}],10:[function(_dereq_,module,exports){
  2017. 'use strict';
  2018. var base64 = _dereq_('./base64');
  2019. var ZipEntries = _dereq_('./zipEntries');
  2020. module.exports = function(data, options) {
  2021. var files, zipEntries, i, input;
  2022. options = options || {};
  2023. if (options.base64) {
  2024. data = base64.decode(data);
  2025. }
  2026. zipEntries = new ZipEntries(data, options);
  2027. files = zipEntries.files;
  2028. for (i = 0; i < files.length; i++) {
  2029. input = files[i];
  2030. this.file(input.fileName, input.decompressed, {
  2031. binary: true,
  2032. optimizedBinaryString: true,
  2033. date: input.date,
  2034. dir: input.dir,
  2035. comment : input.fileComment.length ? input.fileComment : null,
  2036. createFolders: options.createFolders
  2037. });
  2038. }
  2039. if (zipEntries.zipComment.length) {
  2040. this.comment = zipEntries.zipComment;
  2041. }
  2042. return this;
  2043. };
  2044. },{"./base64":1,"./zipEntries":22}],11:[function(_dereq_,module,exports){
  2045. (function (Buffer){
  2046. 'use strict';
  2047. var Buffer_from = /*::(*/function(){}/*:: :any)*/;
  2048. if(typeof Buffer !== 'undefined') {
  2049. var nbfs = !Buffer.from;
  2050. if(!nbfs) try { Buffer.from("foo", "utf8"); } catch(e) { nbfs = true; }
  2051. Buffer_from = nbfs ? function(buf, enc) { return (enc) ? new Buffer(buf, enc) : new Buffer(buf); } : Buffer.from.bind(Buffer);
  2052. // $FlowIgnore
  2053. if(!Buffer.alloc) Buffer.alloc = function(n) { return new Buffer(n); };
  2054. }
  2055. module.exports = function(data, encoding){
  2056. return typeof data == 'number' ? Buffer.alloc(data) : Buffer_from(data, encoding);
  2057. };
  2058. module.exports.test = function(b){
  2059. return Buffer.isBuffer(b);
  2060. };
  2061. }).call(this,(typeof Buffer !== "undefined" ? Buffer : undefined))
  2062. },{}],12:[function(_dereq_,module,exports){
  2063. 'use strict';
  2064. var Uint8ArrayReader = _dereq_('./uint8ArrayReader');
  2065. function NodeBufferReader(data) {
  2066. this.data = data;
  2067. this.length = this.data.length;
  2068. this.index = 0;
  2069. }
  2070. NodeBufferReader.prototype = new Uint8ArrayReader();
  2071. /**
  2072. * @see DataReader.readData
  2073. */
  2074. NodeBufferReader.prototype.readData = function(size) {
  2075. this.checkOffset(size);
  2076. var result = this.data.slice(this.index, this.index + size);
  2077. this.index += size;
  2078. return result;
  2079. };
  2080. module.exports = NodeBufferReader;
  2081. },{"./uint8ArrayReader":18}],13:[function(_dereq_,module,exports){
  2082. 'use strict';
  2083. var support = _dereq_('./support');
  2084. var utils = _dereq_('./utils');
  2085. var crc32 = _dereq_('./crc32');
  2086. var signature = _dereq_('./signature');
  2087. var defaults = _dereq_('./defaults');
  2088. var base64 = _dereq_('./base64');
  2089. var compressions = _dereq_('./compressions');
  2090. var CompressedObject = _dereq_('./compressedObject');
  2091. var nodeBuffer = _dereq_('./nodeBuffer');
  2092. var utf8 = _dereq_('./utf8');
  2093. var StringWriter = _dereq_('./stringWriter');
  2094. var Uint8ArrayWriter = _dereq_('./uint8ArrayWriter');
  2095. /**
  2096. * Returns the raw data of a ZipObject, decompress the content if necessary.
  2097. * @param {ZipObject} file the file to use.
  2098. * @return {String|ArrayBuffer|Uint8Array|Buffer} the data.
  2099. */
  2100. var getRawData = function(file) {
  2101. if (file._data instanceof CompressedObject) {
  2102. file._data = file._data.getContent();
  2103. file.options.binary = true;
  2104. file.options.base64 = false;
  2105. if (utils.getTypeOf(file._data) === "uint8array") {
  2106. var copy = file._data;
  2107. // when reading an arraybuffer, the CompressedObject mechanism will keep it and subarray() a Uint8Array.
  2108. // if we request a file in the same format, we might get the same Uint8Array or its ArrayBuffer (the original zip file).
  2109. file._data = new Uint8Array(copy.length);
  2110. // with an empty Uint8Array, Opera fails with a "Offset larger than array size"
  2111. if (copy.length !== 0) {
  2112. file._data.set(copy, 0);
  2113. }
  2114. }
  2115. }
  2116. return file._data;
  2117. };
  2118. /**
  2119. * Returns the data of a ZipObject in a binary form. If the content is an unicode string, encode it.
  2120. * @param {ZipObject} file the file to use.
  2121. * @return {String|ArrayBuffer|Uint8Array|Buffer} the data.
  2122. */
  2123. var getBinaryData = function(file) {
  2124. var result = getRawData(file),
  2125. type = utils.getTypeOf(result);
  2126. if (type === "string") {
  2127. if (!file.options.binary) {
  2128. // unicode text !
  2129. // unicode string => binary string is a painful process, check if we can avoid it.
  2130. if (support.nodebuffer) {
  2131. return nodeBuffer(result, "utf-8");
  2132. }
  2133. }
  2134. return file.asBinary();
  2135. }
  2136. return result;
  2137. };
  2138. /**
  2139. * Transform this._data into a string.
  2140. * @param {function} filter a function String -> String, applied if not null on the result.
  2141. * @return {String} the string representing this._data.
  2142. */
  2143. var dataToString = function(asUTF8) {
  2144. var result = getRawData(this);
  2145. if (result === null || typeof result === "undefined") {
  2146. return "";
  2147. }
  2148. // if the data is a base64 string, we decode it before checking the encoding !
  2149. if (this.options.base64) {
  2150. result = base64.decode(result);
  2151. }
  2152. if (asUTF8 && this.options.binary) {
  2153. // JSZip.prototype.utf8decode supports arrays as input
  2154. // skip to array => string step, utf8decode will do it.
  2155. result = out.utf8decode(result);
  2156. }
  2157. else {
  2158. // no utf8 transformation, do the array => string step.
  2159. result = utils.transformTo("string", result);
  2160. }
  2161. if (!asUTF8 && !this.options.binary) {
  2162. result = utils.transformTo("string", out.utf8encode(result));
  2163. }
  2164. return result;
  2165. };
  2166. /**
  2167. * A simple object representing a file in the zip file.
  2168. * @constructor
  2169. * @param {string} name the name of the file
  2170. * @param {String|ArrayBuffer|Uint8Array|Buffer} data the data
  2171. * @param {Object} options the options of the file
  2172. */
  2173. var ZipObject = function(name, data, options) {
  2174. this.name = name;
  2175. this.dir = options.dir;
  2176. this.date = options.date;
  2177. this.comment = options.comment;
  2178. this._data = data;
  2179. this.options = options;
  2180. /*
  2181. * This object contains initial values for dir and date.
  2182. * With them, we can check if the user changed the deprecated metadata in
  2183. * `ZipObject#options` or not.
  2184. */
  2185. this._initialMetadata = {
  2186. dir : options.dir,
  2187. date : options.date
  2188. };
  2189. };
  2190. ZipObject.prototype = {
  2191. /**
  2192. * Return the content as UTF8 string.
  2193. * @return {string} the UTF8 string.
  2194. */
  2195. asText: function() {
  2196. return dataToString.call(this, true);
  2197. },
  2198. /**
  2199. * Returns the binary content.
  2200. * @return {string} the content as binary.
  2201. */
  2202. asBinary: function() {
  2203. return dataToString.call(this, false);
  2204. },
  2205. /**
  2206. * Returns the content as a nodejs Buffer.
  2207. * @return {Buffer} the content as a Buffer.
  2208. */
  2209. asNodeBuffer: function() {
  2210. var result = getBinaryData(this);
  2211. return utils.transformTo("nodebuffer", result);
  2212. },
  2213. /**
  2214. * Returns the content as an Uint8Array.
  2215. * @return {Uint8Array} the content as an Uint8Array.
  2216. */
  2217. asUint8Array: function() {
  2218. var result = getBinaryData(this);
  2219. return utils.transformTo("uint8array", result);
  2220. },
  2221. /**
  2222. * Returns the content as an ArrayBuffer.
  2223. * @return {ArrayBuffer} the content as an ArrayBufer.
  2224. */
  2225. asArrayBuffer: function() {
  2226. return this.asUint8Array().buffer;
  2227. }
  2228. };
  2229. /**
  2230. * Transform an integer into a string in hexadecimal.
  2231. * @private
  2232. * @param {number} dec the number to convert.
  2233. * @param {number} bytes the number of bytes to generate.
  2234. * @returns {string} the result.
  2235. */
  2236. var decToHex = function(dec, bytes) {
  2237. var hex = "",
  2238. i;
  2239. for (i = 0; i < bytes; i++) {
  2240. hex += String.fromCharCode(dec & 0xff);
  2241. dec = dec >>> 8;
  2242. }
  2243. return hex;
  2244. };
  2245. /**
  2246. * Merge the objects passed as parameters into a new one.
  2247. * @private
  2248. * @param {...Object} var_args All objects to merge.
  2249. * @return {Object} a new object with the data of the others.
  2250. */
  2251. var extend = function() {
  2252. var result = {}, i, attr;
  2253. for (i = 0; i < arguments.length; i++) { // arguments is not enumerable in some browsers
  2254. for (attr in arguments[i]) {
  2255. if (arguments[i].hasOwnProperty(attr) && typeof result[attr] === "undefined") {
  2256. result[attr] = arguments[i][attr];
  2257. }
  2258. }
  2259. }
  2260. return result;
  2261. };
  2262. /**
  2263. * Transforms the (incomplete) options from the user into the complete
  2264. * set of options to create a file.
  2265. * @private
  2266. * @param {Object} o the options from the user.
  2267. * @return {Object} the complete set of options.
  2268. */
  2269. var prepareFileAttrs = function(o) {
  2270. o = o || {};
  2271. if (o.base64 === true && (o.binary === null || o.binary === undefined)) {
  2272. o.binary = true;
  2273. }
  2274. o = extend(o, defaults);
  2275. o.date = o.date || new Date();
  2276. if (o.compression !== null) o.compression = o.compression.toUpperCase();
  2277. return o;
  2278. };
  2279. /**
  2280. * Add a file in the current folder.
  2281. * @private
  2282. * @param {string} name the name of the file
  2283. * @param {String|ArrayBuffer|Uint8Array|Buffer} data the data of the file
  2284. * @param {Object} o the options of the file
  2285. * @return {Object} the new file.
  2286. */
  2287. var fileAdd = function(name, data, o) {
  2288. // be sure sub folders exist
  2289. var dataType = utils.getTypeOf(data),
  2290. parent;
  2291. o = prepareFileAttrs(o);
  2292. if (o.createFolders && (parent = parentFolder(name))) {
  2293. folderAdd.call(this, parent, true);
  2294. }
  2295. if (o.dir || data === null || typeof data === "undefined") {
  2296. o.base64 = false;
  2297. o.binary = false;
  2298. data = null;
  2299. }
  2300. else if (dataType === "string") {
  2301. if (o.binary && !o.base64) {
  2302. // optimizedBinaryString == true means that the file has already been filtered with a 0xFF mask
  2303. if (o.optimizedBinaryString !== true) {
  2304. // this is a string, not in a base64 format.
  2305. // Be sure that this is a correct "binary string"
  2306. data = utils.string2binary(data);
  2307. }
  2308. }
  2309. }
  2310. else { // arraybuffer, uint8array, ...
  2311. o.base64 = false;
  2312. o.binary = true;
  2313. if (!dataType && !(data instanceof CompressedObject)) {
  2314. throw new Error("The data of '" + name + "' is in an unsupported format !");
  2315. }
  2316. // special case : it's way easier to work with Uint8Array than with ArrayBuffer
  2317. if (dataType === "arraybuffer") {
  2318. data = utils.transformTo("uint8array", data);
  2319. }
  2320. }
  2321. var object = new ZipObject(name, data, o);
  2322. this.files[name] = object;
  2323. return object;
  2324. };
  2325. /**
  2326. * Find the parent folder of the path.
  2327. * @private
  2328. * @param {string} path the path to use
  2329. * @return {string} the parent folder, or ""
  2330. */
  2331. var parentFolder = function (path) {
  2332. if (path.slice(-1) == '/') {
  2333. path = path.substring(0, path.length - 1);
  2334. }
  2335. var lastSlash = path.lastIndexOf('/');
  2336. return (lastSlash > 0) ? path.substring(0, lastSlash) : "";
  2337. };
  2338. /**
  2339. * Add a (sub) folder in the current folder.
  2340. * @private
  2341. * @param {string} name the folder's name
  2342. * @param {boolean=} [createFolders] If true, automatically create sub
  2343. * folders. Defaults to false.
  2344. * @return {Object} the new folder.
  2345. */
  2346. var folderAdd = function(name, createFolders) {
  2347. // Check the name ends with a /
  2348. if (name.slice(-1) != "/") {
  2349. name += "/"; // IE doesn't like substr(-1)
  2350. }
  2351. createFolders = (typeof createFolders !== 'undefined') ? createFolders : false;
  2352. // Does this folder already exist?
  2353. if (!this.files[name]) {
  2354. fileAdd.call(this, name, null, {
  2355. dir: true,
  2356. createFolders: createFolders
  2357. });
  2358. }
  2359. return this.files[name];
  2360. };
  2361. /**
  2362. * Generate a JSZip.CompressedObject for a given zipOject.
  2363. * @param {ZipObject} file the object to read.
  2364. * @param {JSZip.compression} compression the compression to use.
  2365. * @return {JSZip.CompressedObject} the compressed result.
  2366. */
  2367. var generateCompressedObjectFrom = function(file, compression) {
  2368. var result = new CompressedObject(),
  2369. content;
  2370. // the data has not been decompressed, we might reuse things !
  2371. if (file._data instanceof CompressedObject) {
  2372. result.uncompressedSize = file._data.uncompressedSize;
  2373. result.crc32 = file._data.crc32;
  2374. if (result.uncompressedSize === 0 || file.dir) {
  2375. compression = compressions['STORE'];
  2376. result.compressedContent = "";
  2377. result.crc32 = 0;
  2378. }
  2379. else if (file._data.compressionMethod === compression.magic) {
  2380. result.compressedContent = file._data.getCompressedContent();
  2381. }
  2382. else {
  2383. content = file._data.getContent();
  2384. // need to decompress / recompress
  2385. result.compressedContent = compression.compress(utils.transformTo(compression.compressInputType, content));
  2386. }
  2387. }
  2388. else {
  2389. // have uncompressed data
  2390. content = getBinaryData(file);
  2391. if (!content || content.length === 0 || file.dir) {
  2392. compression = compressions['STORE'];
  2393. content = "";
  2394. }
  2395. result.uncompressedSize = content.length;
  2396. result.crc32 = crc32(content);
  2397. result.compressedContent = compression.compress(utils.transformTo(compression.compressInputType, content));
  2398. }
  2399. result.compressedSize = result.compressedContent.length;
  2400. result.compressionMethod = compression.magic;
  2401. return result;
  2402. };
  2403. /**
  2404. * Generate the various parts used in the construction of the final zip file.
  2405. * @param {string} name the file name.
  2406. * @param {ZipObject} file the file content.
  2407. * @param {JSZip.CompressedObject} compressedObject the compressed object.
  2408. * @param {number} offset the current offset from the start of the zip file.
  2409. * @return {object} the zip parts.
  2410. */
  2411. var generateZipParts = function(name, file, compressedObject, offset) {
  2412. var data = compressedObject.compressedContent,
  2413. utfEncodedFileName = utils.transformTo("string", utf8.utf8encode(file.name)),
  2414. comment = file.comment || "",
  2415. utfEncodedComment = utils.transformTo("string", utf8.utf8encode(comment)),
  2416. useUTF8ForFileName = utfEncodedFileName.length !== file.name.length,
  2417. useUTF8ForComment = utfEncodedComment.length !== comment.length,
  2418. o = file.options,
  2419. dosTime,
  2420. dosDate,
  2421. extraFields = "",
  2422. unicodePathExtraField = "",
  2423. unicodeCommentExtraField = "",
  2424. dir, date;
  2425. // handle the deprecated options.dir
  2426. if (file._initialMetadata.dir !== file.dir) {
  2427. dir = file.dir;
  2428. } else {
  2429. dir = o.dir;
  2430. }
  2431. // handle the deprecated options.date
  2432. if(file._initialMetadata.date !== file.date) {
  2433. date = file.date;
  2434. } else {
  2435. date = o.date;
  2436. }
  2437. dosTime = date.getHours();
  2438. dosTime = dosTime << 6;
  2439. dosTime = dosTime | date.getMinutes();
  2440. dosTime = dosTime << 5;
  2441. dosTime = dosTime | date.getSeconds() / 2;
  2442. dosDate = date.getFullYear() - 1980;
  2443. dosDate = dosDate << 4;
  2444. dosDate = dosDate | (date.getMonth() + 1);
  2445. dosDate = dosDate << 5;
  2446. dosDate = dosDate | date.getDate();
  2447. if (useUTF8ForFileName) {
  2448. // set the unicode path extra field. unzip needs at least one extra
  2449. // field to correctly handle unicode path, so using the path is as good
  2450. // as any other information. This could improve the situation with
  2451. // other archive managers too.
  2452. // This field is usually used without the utf8 flag, with a non
  2453. // unicode path in the header (winrar, winzip). This helps (a bit)
  2454. // with the messy Windows' default compressed folders feature but
  2455. // breaks on p7zip which doesn't seek the unicode path extra field.
  2456. // So for now, UTF-8 everywhere !
  2457. unicodePathExtraField =
  2458. // Version
  2459. decToHex(1, 1) +
  2460. // NameCRC32
  2461. decToHex(crc32(utfEncodedFileName), 4) +
  2462. // UnicodeName
  2463. utfEncodedFileName;
  2464. extraFields +=
  2465. // Info-ZIP Unicode Path Extra Field
  2466. "\x75\x70" +
  2467. // size
  2468. decToHex(unicodePathExtraField.length, 2) +
  2469. // content
  2470. unicodePathExtraField;
  2471. }
  2472. if(useUTF8ForComment) {
  2473. unicodeCommentExtraField =
  2474. // Version
  2475. decToHex(1, 1) +
  2476. // CommentCRC32
  2477. decToHex(this.crc32(utfEncodedComment), 4) +
  2478. // UnicodeName
  2479. utfEncodedComment;
  2480. extraFields +=
  2481. // Info-ZIP Unicode Path Extra Field
  2482. "\x75\x63" +
  2483. // size
  2484. decToHex(unicodeCommentExtraField.length, 2) +
  2485. // content
  2486. unicodeCommentExtraField;
  2487. }
  2488. var header = "";
  2489. // version needed to extract
  2490. header += "\x0A\x00";
  2491. // general purpose bit flag
  2492. // set bit 11 if utf8
  2493. header += (useUTF8ForFileName || useUTF8ForComment) ? "\x00\x08" : "\x00\x00";
  2494. // compression method
  2495. header += compressedObject.compressionMethod;
  2496. // last mod file time
  2497. header += decToHex(dosTime, 2);
  2498. // last mod file date
  2499. header += decToHex(dosDate, 2);
  2500. // crc-32
  2501. header += decToHex(compressedObject.crc32, 4);
  2502. // compressed size
  2503. header += decToHex(compressedObject.compressedSize, 4);
  2504. // uncompressed size
  2505. header += decToHex(compressedObject.uncompressedSize, 4);
  2506. // file name length
  2507. header += decToHex(utfEncodedFileName.length, 2);
  2508. // extra field length
  2509. header += decToHex(extraFields.length, 2);
  2510. var fileRecord = signature.LOCAL_FILE_HEADER + header + utfEncodedFileName + extraFields;
  2511. var dirRecord = signature.CENTRAL_FILE_HEADER +
  2512. // version made by (00: DOS)
  2513. "\x14\x00" +
  2514. // file header (common to file and central directory)
  2515. header +
  2516. // file comment length
  2517. decToHex(utfEncodedComment.length, 2) +
  2518. // disk number start
  2519. "\x00\x00" +
  2520. // internal file attributes TODO
  2521. "\x00\x00" +
  2522. // external file attributes
  2523. (dir === true ? "\x10\x00\x00\x00" : "\x00\x00\x00\x00") +
  2524. // relative offset of local header
  2525. decToHex(offset, 4) +
  2526. // file name
  2527. utfEncodedFileName +
  2528. // extra field
  2529. extraFields +
  2530. // file comment
  2531. utfEncodedComment;
  2532. return {
  2533. fileRecord: fileRecord,
  2534. dirRecord: dirRecord,
  2535. compressedObject: compressedObject
  2536. };
  2537. };
  2538. // return the actual prototype of JSZip
  2539. var out = {
  2540. /**
  2541. * Read an existing zip and merge the data in the current JSZip object.
  2542. * The implementation is in jszip-load.js, don't forget to include it.
  2543. * @param {String|ArrayBuffer|Uint8Array|Buffer} stream The stream to load
  2544. * @param {Object} options Options for loading the stream.
  2545. * options.base64 : is the stream in base64 ? default : false
  2546. * @return {JSZip} the current JSZip object
  2547. */
  2548. load: function(stream, options) {
  2549. throw new Error("Load method is not defined. Is the file jszip-load.js included ?");
  2550. },
  2551. /**
  2552. * Filter nested files/folders with the specified function.
  2553. * @param {Function} search the predicate to use :
  2554. * function (relativePath, file) {...}
  2555. * It takes 2 arguments : the relative path and the file.
  2556. * @return {Array} An array of matching elements.
  2557. */
  2558. filter: function(search) {
  2559. var result = [],
  2560. filename, relativePath, file, fileClone;
  2561. for (filename in this.files) {
  2562. if (!this.files.hasOwnProperty(filename)) {
  2563. continue;
  2564. }
  2565. file = this.files[filename];
  2566. // return a new object, don't let the user mess with our internal objects :)
  2567. fileClone = new ZipObject(file.name, file._data, extend(file.options));
  2568. relativePath = filename.slice(this.root.length, filename.length);
  2569. if (filename.slice(0, this.root.length) === this.root && // the file is in the current root
  2570. search(relativePath, fileClone)) { // and the file matches the function
  2571. result.push(fileClone);
  2572. }
  2573. }
  2574. return result;
  2575. },
  2576. /**
  2577. * Add a file to the zip file, or search a file.
  2578. * @param {string|RegExp} name The name of the file to add (if data is defined),
  2579. * the name of the file to find (if no data) or a regex to match files.
  2580. * @param {String|ArrayBuffer|Uint8Array|Buffer} data The file data, either raw or base64 encoded
  2581. * @param {Object} o File options
  2582. * @return {JSZip|Object|Array} this JSZip object (when adding a file),
  2583. * a file (when searching by string) or an array of files (when searching by regex).
  2584. */
  2585. file: function(name, data, o) {
  2586. if (arguments.length === 1) {
  2587. if (utils.isRegExp(name)) {
  2588. var regexp = name;
  2589. return this.filter(function(relativePath, file) {
  2590. return !file.dir && regexp.test(relativePath);
  2591. });
  2592. }
  2593. else { // text
  2594. return this.filter(function(relativePath, file) {
  2595. return !file.dir && relativePath === name;
  2596. })[0] || null;
  2597. }
  2598. }
  2599. else { // more than one argument : we have data !
  2600. name = this.root + name;
  2601. fileAdd.call(this, name, data, o);
  2602. }
  2603. return this;
  2604. },
  2605. /**
  2606. * Add a directory to the zip file, or search.
  2607. * @param {String|RegExp} arg The name of the directory to add, or a regex to search folders.
  2608. * @return {JSZip} an object with the new directory as the root, or an array containing matching folders.
  2609. */
  2610. folder: function(arg) {
  2611. if (!arg) {
  2612. return this;
  2613. }
  2614. if (utils.isRegExp(arg)) {
  2615. return this.filter(function(relativePath, file) {
  2616. return file.dir && arg.test(relativePath);
  2617. });
  2618. }
  2619. // else, name is a new folder
  2620. var name = this.root + arg;
  2621. var newFolder = folderAdd.call(this, name);
  2622. // Allow chaining by returning a new object with this folder as the root
  2623. var ret = this.clone();
  2624. ret.root = newFolder.name;
  2625. return ret;
  2626. },
  2627. /**
  2628. * Delete a file, or a directory and all sub-files, from the zip
  2629. * @param {string} name the name of the file to delete
  2630. * @return {JSZip} this JSZip object
  2631. */
  2632. remove: function(name) {
  2633. name = this.root + name;
  2634. var file = this.files[name];
  2635. if (!file) {
  2636. // Look for any folders
  2637. if (name.slice(-1) != "/") {
  2638. name += "/";
  2639. }
  2640. file = this.files[name];
  2641. }
  2642. if (file && !file.dir) {
  2643. // file
  2644. delete this.files[name];
  2645. } else {
  2646. // maybe a folder, delete recursively
  2647. var kids = this.filter(function(relativePath, file) {
  2648. return file.name.slice(0, name.length) === name;
  2649. });
  2650. for (var i = 0; i < kids.length; i++) {
  2651. delete this.files[kids[i].name];
  2652. }
  2653. }
  2654. return this;
  2655. },
  2656. /**
  2657. * Generate the complete zip file
  2658. * @param {Object} options the options to generate the zip file :
  2659. * - base64, (deprecated, use type instead) true to generate base64.
  2660. * - compression, "STORE" by default.
  2661. * - type, "base64" by default. Values are : string, base64, uint8array, arraybuffer, blob.
  2662. * @return {String|Uint8Array|ArrayBuffer|Buffer|Blob} the zip file
  2663. */
  2664. generate: function(options) {
  2665. options = extend(options || {}, {
  2666. base64: true,
  2667. compression: "STORE",
  2668. type: "base64",
  2669. comment: null
  2670. });
  2671. utils.checkSupport(options.type);
  2672. var zipData = [],
  2673. localDirLength = 0,
  2674. centralDirLength = 0,
  2675. writer, i,
  2676. utfEncodedComment = utils.transformTo("string", this.utf8encode(options.comment || this.comment || ""));
  2677. // first, generate all the zip parts.
  2678. for (var name in this.files) {
  2679. if (!this.files.hasOwnProperty(name)) {
  2680. continue;
  2681. }
  2682. var file = this.files[name];
  2683. var compressionName = file.options.compression || options.compression.toUpperCase();
  2684. var compression = compressions[compressionName];
  2685. if (!compression) {
  2686. throw new Error(compressionName + " is not a valid compression method !");
  2687. }
  2688. var compressedObject = generateCompressedObjectFrom.call(this, file, compression);
  2689. var zipPart = generateZipParts.call(this, name, file, compressedObject, localDirLength);
  2690. localDirLength += zipPart.fileRecord.length + compressedObject.compressedSize;
  2691. centralDirLength += zipPart.dirRecord.length;
  2692. zipData.push(zipPart);
  2693. }
  2694. var dirEnd = "";
  2695. // end of central dir signature
  2696. dirEnd = signature.CENTRAL_DIRECTORY_END +
  2697. // number of this disk
  2698. "\x00\x00" +
  2699. // number of the disk with the start of the central directory
  2700. "\x00\x00" +
  2701. // total number of entries in the central directory on this disk
  2702. decToHex(zipData.length, 2) +
  2703. // total number of entries in the central directory
  2704. decToHex(zipData.length, 2) +
  2705. // size of the central directory 4 bytes
  2706. decToHex(centralDirLength, 4) +
  2707. // offset of start of central directory with respect to the starting disk number
  2708. decToHex(localDirLength, 4) +
  2709. // .ZIP file comment length
  2710. decToHex(utfEncodedComment.length, 2) +
  2711. // .ZIP file comment
  2712. utfEncodedComment;
  2713. // we have all the parts (and the total length)
  2714. // time to create a writer !
  2715. var typeName = options.type.toLowerCase();
  2716. if(typeName==="uint8array"||typeName==="arraybuffer"||typeName==="blob"||typeName==="nodebuffer") {
  2717. writer = new Uint8ArrayWriter(localDirLength + centralDirLength + dirEnd.length);
  2718. }else{
  2719. writer = new StringWriter(localDirLength + centralDirLength + dirEnd.length);
  2720. }
  2721. for (i = 0; i < zipData.length; i++) {
  2722. writer.append(zipData[i].fileRecord);
  2723. writer.append(zipData[i].compressedObject.compressedContent);
  2724. }
  2725. for (i = 0; i < zipData.length; i++) {
  2726. writer.append(zipData[i].dirRecord);
  2727. }
  2728. writer.append(dirEnd);
  2729. var zip = writer.finalize();
  2730. switch(options.type.toLowerCase()) {
  2731. // case "zip is an Uint8Array"
  2732. case "uint8array" :
  2733. case "arraybuffer" :
  2734. case "nodebuffer" :
  2735. return utils.transformTo(options.type.toLowerCase(), zip);
  2736. case "blob" :
  2737. return utils.arrayBuffer2Blob(utils.transformTo("arraybuffer", zip));
  2738. // case "zip is a string"
  2739. case "base64" :
  2740. return (options.base64) ? base64.encode(zip) : zip;
  2741. default : // case "string" :
  2742. return zip;
  2743. }
  2744. },
  2745. /**
  2746. * @deprecated
  2747. * This method will be removed in a future version without replacement.
  2748. */
  2749. crc32: function (input, crc) {
  2750. return crc32(input, crc);
  2751. },
  2752. /**
  2753. * @deprecated
  2754. * This method will be removed in a future version without replacement.
  2755. */
  2756. utf8encode: function (string) {
  2757. return utils.transformTo("string", utf8.utf8encode(string));
  2758. },
  2759. /**
  2760. * @deprecated
  2761. * This method will be removed in a future version without replacement.
  2762. */
  2763. utf8decode: function (input) {
  2764. return utf8.utf8decode(input);
  2765. }
  2766. };
  2767. module.exports = out;
  2768. },{"./base64":1,"./compressedObject":2,"./compressions":3,"./crc32":4,"./defaults":6,"./nodeBuffer":11,"./signature":14,"./stringWriter":16,"./support":17,"./uint8ArrayWriter":19,"./utf8":20,"./utils":21}],14:[function(_dereq_,module,exports){
  2769. 'use strict';
  2770. exports.LOCAL_FILE_HEADER = "PK\x03\x04";
  2771. exports.CENTRAL_FILE_HEADER = "PK\x01\x02";
  2772. exports.CENTRAL_DIRECTORY_END = "PK\x05\x06";
  2773. exports.ZIP64_CENTRAL_DIRECTORY_LOCATOR = "PK\x06\x07";
  2774. exports.ZIP64_CENTRAL_DIRECTORY_END = "PK\x06\x06";
  2775. exports.DATA_DESCRIPTOR = "PK\x07\x08";
  2776. },{}],15:[function(_dereq_,module,exports){
  2777. 'use strict';
  2778. var DataReader = _dereq_('./dataReader');
  2779. var utils = _dereq_('./utils');
  2780. function StringReader(data, optimizedBinaryString) {
  2781. this.data = data;
  2782. if (!optimizedBinaryString) {
  2783. this.data = utils.string2binary(this.data);
  2784. }
  2785. this.length = this.data.length;
  2786. this.index = 0;
  2787. }
  2788. StringReader.prototype = new DataReader();
  2789. /**
  2790. * @see DataReader.byteAt
  2791. */
  2792. StringReader.prototype.byteAt = function(i) {
  2793. return this.data.charCodeAt(i);
  2794. };
  2795. /**
  2796. * @see DataReader.lastIndexOfSignature
  2797. */
  2798. StringReader.prototype.lastIndexOfSignature = function(sig) {
  2799. return this.data.lastIndexOf(sig);
  2800. };
  2801. /**
  2802. * @see DataReader.readData
  2803. */
  2804. StringReader.prototype.readData = function(size) {
  2805. this.checkOffset(size);
  2806. // this will work because the constructor applied the "& 0xff" mask.
  2807. var result = this.data.slice(this.index, this.index + size);
  2808. this.index += size;
  2809. return result;
  2810. };
  2811. module.exports = StringReader;
  2812. },{"./dataReader":5,"./utils":21}],16:[function(_dereq_,module,exports){
  2813. 'use strict';
  2814. var utils = _dereq_('./utils');
  2815. /**
  2816. * An object to write any content to a string.
  2817. * @constructor
  2818. */
  2819. var StringWriter = function() {
  2820. this.data = [];
  2821. };
  2822. StringWriter.prototype = {
  2823. /**
  2824. * Append any content to the current string.
  2825. * @param {Object} input the content to add.
  2826. */
  2827. append: function(input) {
  2828. input = utils.transformTo("string", input);
  2829. this.data.push(input);
  2830. },
  2831. /**
  2832. * Finalize the construction an return the result.
  2833. * @return {string} the generated string.
  2834. */
  2835. finalize: function() {
  2836. return this.data.join("");
  2837. }
  2838. };
  2839. module.exports = StringWriter;
  2840. },{"./utils":21}],17:[function(_dereq_,module,exports){
  2841. (function (Buffer){
  2842. 'use strict';
  2843. exports.base64 = true;
  2844. exports.array = true;
  2845. exports.string = true;
  2846. exports.arraybuffer = typeof ArrayBuffer !== "undefined" && typeof Uint8Array !== "undefined";
  2847. // contains true if JSZip can read/generate nodejs Buffer, false otherwise.
  2848. // Browserify will provide a Buffer implementation for browsers, which is
  2849. // an augmented Uint8Array (i.e., can be used as either Buffer or U8).
  2850. exports.nodebuffer = typeof Buffer !== "undefined";
  2851. // contains true if JSZip can read/generate Uint8Array, false otherwise.
  2852. exports.uint8array = typeof Uint8Array !== "undefined";
  2853. if (typeof ArrayBuffer === "undefined") {
  2854. exports.blob = false;
  2855. }
  2856. else {
  2857. var buffer = new ArrayBuffer(0);
  2858. try {
  2859. exports.blob = new Blob([buffer], {
  2860. type: "application/zip"
  2861. }).size === 0;
  2862. }
  2863. catch (e) {
  2864. try {
  2865. var Builder = window.BlobBuilder || window.WebKitBlobBuilder || window.MozBlobBuilder || window.MSBlobBuilder;
  2866. var builder = new Builder();
  2867. builder.append(buffer);
  2868. exports.blob = builder.getBlob('application/zip').size === 0;
  2869. }
  2870. catch (e) {
  2871. exports.blob = false;
  2872. }
  2873. }
  2874. }
  2875. }).call(this,(typeof Buffer !== "undefined" ? Buffer : undefined))
  2876. },{}],18:[function(_dereq_,module,exports){
  2877. 'use strict';
  2878. var DataReader = _dereq_('./dataReader');
  2879. function Uint8ArrayReader(data) {
  2880. if (data) {
  2881. this.data = data;
  2882. this.length = this.data.length;
  2883. this.index = 0;
  2884. }
  2885. }
  2886. Uint8ArrayReader.prototype = new DataReader();
  2887. /**
  2888. * @see DataReader.byteAt
  2889. */
  2890. Uint8ArrayReader.prototype.byteAt = function(i) {
  2891. return this.data[i];
  2892. };
  2893. /**
  2894. * @see DataReader.lastIndexOfSignature
  2895. */
  2896. Uint8ArrayReader.prototype.lastIndexOfSignature = function(sig) {
  2897. var sig0 = sig.charCodeAt(0),
  2898. sig1 = sig.charCodeAt(1),
  2899. sig2 = sig.charCodeAt(2),
  2900. sig3 = sig.charCodeAt(3);
  2901. for (var i = this.length - 4; i >= 0; --i) {
  2902. if (this.data[i] === sig0 && this.data[i + 1] === sig1 && this.data[i + 2] === sig2 && this.data[i + 3] === sig3) {
  2903. return i;
  2904. }
  2905. }
  2906. return -1;
  2907. };
  2908. /**
  2909. * @see DataReader.readData
  2910. */
  2911. Uint8ArrayReader.prototype.readData = function(size) {
  2912. this.checkOffset(size);
  2913. if(size === 0) {
  2914. // in IE10, when using subarray(idx, idx), we get the array [0x00] instead of [].
  2915. return new Uint8Array(0);
  2916. }
  2917. var result = this.data.subarray(this.index, this.index + size);
  2918. this.index += size;
  2919. return result;
  2920. };
  2921. module.exports = Uint8ArrayReader;
  2922. },{"./dataReader":5}],19:[function(_dereq_,module,exports){
  2923. 'use strict';
  2924. var utils = _dereq_('./utils');
  2925. /**
  2926. * An object to write any content to an Uint8Array.
  2927. * @constructor
  2928. * @param {number} length The length of the array.
  2929. */
  2930. var Uint8ArrayWriter = function(length) {
  2931. this.data = new Uint8Array(length);
  2932. this.index = 0;
  2933. };
  2934. Uint8ArrayWriter.prototype = {
  2935. /**
  2936. * Append any content to the current array.
  2937. * @param {Object} input the content to add.
  2938. */
  2939. append: function(input) {
  2940. if (input.length !== 0) {
  2941. // with an empty Uint8Array, Opera fails with a "Offset larger than array size"
  2942. input = utils.transformTo("uint8array", input);
  2943. this.data.set(input, this.index);
  2944. this.index += input.length;
  2945. }
  2946. },
  2947. /**
  2948. * Finalize the construction an return the result.
  2949. * @return {Uint8Array} the generated array.
  2950. */
  2951. finalize: function() {
  2952. return this.data;
  2953. }
  2954. };
  2955. module.exports = Uint8ArrayWriter;
  2956. },{"./utils":21}],20:[function(_dereq_,module,exports){
  2957. 'use strict';
  2958. var utils = _dereq_('./utils');
  2959. var support = _dereq_('./support');
  2960. var nodeBuffer = _dereq_('./nodeBuffer');
  2961. /**
  2962. * The following functions come from pako, from pako/lib/utils/strings
  2963. * released under the MIT license, see pako https://github.com/nodeca/pako/
  2964. */
  2965. // Table with utf8 lengths (calculated by first byte of sequence)
  2966. // Note, that 5 & 6-byte values and some 4-byte values can not be represented in JS,
  2967. // because max possible codepoint is 0x10ffff
  2968. var _utf8len = new Array(256);
  2969. for (var i=0; i<256; i++) {
  2970. _utf8len[i] = (i >= 252 ? 6 : i >= 248 ? 5 : i >= 240 ? 4 : i >= 224 ? 3 : i >= 192 ? 2 : 1);
  2971. }
  2972. _utf8len[254]=_utf8len[254]=1; // Invalid sequence start
  2973. // convert string to array (typed, when possible)
  2974. var string2buf = function (str) {
  2975. var buf, c, c2, m_pos, i, str_len = str.length, buf_len = 0;
  2976. // count binary size
  2977. for (m_pos = 0; m_pos < str_len; m_pos++) {
  2978. c = str.charCodeAt(m_pos);
  2979. if (((c & 0xfc00) === 0xd800) && (m_pos+1 < str_len)) {
  2980. c2 = str.charCodeAt(m_pos+1);
  2981. if ((c2 & 0xfc00) === 0xdc00) {
  2982. c = 0x10000 + ((c - 0xd800) << 10) + (c2 - 0xdc00);
  2983. m_pos++;
  2984. }
  2985. }
  2986. buf_len += (c < 0x80) ? 1 : ((c < 0x800) ? 2 : ((c < 0x10000) ? 3 : 4));
  2987. }
  2988. // allocate buffer
  2989. if (support.uint8array) {
  2990. buf = new Uint8Array(buf_len);
  2991. } else {
  2992. buf = new Array(buf_len);
  2993. }
  2994. // convert
  2995. for (i=0, m_pos = 0; i < buf_len; m_pos++) {
  2996. c = str.charCodeAt(m_pos);
  2997. if ((c & 0xfc00) === 0xd800 && (m_pos+1 < str_len)) {
  2998. c2 = str.charCodeAt(m_pos+1);
  2999. if ((c2 & 0xfc00) === 0xdc00) {
  3000. c = 0x10000 + ((c - 0xd800) << 10) + (c2 - 0xdc00);
  3001. m_pos++;
  3002. }
  3003. }
  3004. if (c < 0x80) {
  3005. /* one byte */
  3006. buf[i++] = c;
  3007. } else if (c < 0x800) {
  3008. /* two bytes */
  3009. buf[i++] = 0xC0 | (c >>> 6);
  3010. buf[i++] = 0x80 | (c & 0x3f);
  3011. } else if (c < 0x10000) {
  3012. /* three bytes */
  3013. buf[i++] = 0xE0 | (c >>> 12);
  3014. buf[i++] = 0x80 | ((c >>> 6) & 0x3f);
  3015. buf[i++] = 0x80 | (c & 0x3f);
  3016. } else {
  3017. /* four bytes */
  3018. buf[i++] = 0xf0 | (c >>> 18);
  3019. buf[i++] = 0x80 | ((c >>> 12) & 0x3f);
  3020. buf[i++] = 0x80 | ((c >>> 6) & 0x3f);
  3021. buf[i++] = 0x80 | (c & 0x3f);
  3022. }
  3023. }
  3024. return buf;
  3025. };
  3026. // Calculate max possible position in utf8 buffer,
  3027. // that will not break sequence. If that's not possible
  3028. // - (very small limits) return max size as is.
  3029. //
  3030. // buf[] - utf8 bytes array
  3031. // max - length limit (mandatory);
  3032. var utf8border = function(buf, max) {
  3033. var pos;
  3034. max = max || buf.length;
  3035. if (max > buf.length) { max = buf.length; }
  3036. // go back from last position, until start of sequence found
  3037. pos = max-1;
  3038. while (pos >= 0 && (buf[pos] & 0xC0) === 0x80) { pos--; }
  3039. // Fuckup - very small and broken sequence,
  3040. // return max, because we should return something anyway.
  3041. if (pos < 0) { return max; }
  3042. // If we came to start of buffer - that means vuffer is too small,
  3043. // return max too.
  3044. if (pos === 0) { return max; }
  3045. return (pos + _utf8len[buf[pos]] > max) ? pos : max;
  3046. };
  3047. // convert array to string
  3048. var buf2string = function (buf) {
  3049. var str, i, out, c, c_len;
  3050. var len = buf.length;
  3051. // Reserve max possible length (2 words per char)
  3052. // NB: by unknown reasons, Array is significantly faster for
  3053. // String.fromCharCode.apply than Uint16Array.
  3054. var utf16buf = new Array(len*2);
  3055. for (out=0, i=0; i<len;) {
  3056. c = buf[i++];
  3057. // quick process ascii
  3058. if (c < 0x80) { utf16buf[out++] = c; continue; }
  3059. c_len = _utf8len[c];
  3060. // skip 5 & 6 byte codes
  3061. if (c_len > 4) { utf16buf[out++] = 0xfffd; i += c_len-1; continue; }
  3062. // apply mask on first byte
  3063. c &= c_len === 2 ? 0x1f : c_len === 3 ? 0x0f : 0x07;
  3064. // join the rest
  3065. while (c_len > 1 && i < len) {
  3066. c = (c << 6) | (buf[i++] & 0x3f);
  3067. c_len--;
  3068. }
  3069. // terminated by end of string?
  3070. if (c_len > 1) { utf16buf[out++] = 0xfffd; continue; }
  3071. if (c < 0x10000) {
  3072. utf16buf[out++] = c;
  3073. } else {
  3074. c -= 0x10000;
  3075. utf16buf[out++] = 0xd800 | ((c >> 10) & 0x3ff);
  3076. utf16buf[out++] = 0xdc00 | (c & 0x3ff);
  3077. }
  3078. }
  3079. // shrinkBuf(utf16buf, out)
  3080. if (utf16buf.length !== out) {
  3081. if(utf16buf.subarray) {
  3082. utf16buf = utf16buf.subarray(0, out);
  3083. } else {
  3084. utf16buf.length = out;
  3085. }
  3086. }
  3087. // return String.fromCharCode.apply(null, utf16buf);
  3088. return utils.applyFromCharCode(utf16buf);
  3089. };
  3090. // That's all for the pako functions.
  3091. /**
  3092. * Transform a javascript string into an array (typed if possible) of bytes,
  3093. * UTF-8 encoded.
  3094. * @param {String} str the string to encode
  3095. * @return {Array|Uint8Array|Buffer} the UTF-8 encoded string.
  3096. */
  3097. exports.utf8encode = function utf8encode(str) {
  3098. if (support.nodebuffer) {
  3099. return nodeBuffer(str, "utf-8");
  3100. }
  3101. return string2buf(str);
  3102. };
  3103. /**
  3104. * Transform a bytes array (or a representation) representing an UTF-8 encoded
  3105. * string into a javascript string.
  3106. * @param {Array|Uint8Array|Buffer} buf the data de decode
  3107. * @return {String} the decoded string.
  3108. */
  3109. exports.utf8decode = function utf8decode(buf) {
  3110. if (support.nodebuffer) {
  3111. return utils.transformTo("nodebuffer", buf).toString("utf-8");
  3112. }
  3113. buf = utils.transformTo(support.uint8array ? "uint8array" : "array", buf);
  3114. // return buf2string(buf);
  3115. // Chrome prefers to work with "small" chunks of data
  3116. // for the method buf2string.
  3117. // Firefox and Chrome has their own shortcut, IE doesn't seem to really care.
  3118. var result = [], k = 0, len = buf.length, chunk = 65536;
  3119. while (k < len) {
  3120. var nextBoundary = utf8border(buf, Math.min(k + chunk, len));
  3121. if (support.uint8array) {
  3122. result.push(buf2string(buf.subarray(k, nextBoundary)));
  3123. } else {
  3124. result.push(buf2string(buf.slice(k, nextBoundary)));
  3125. }
  3126. k = nextBoundary;
  3127. }
  3128. return result.join("");
  3129. };
  3130. // vim: set shiftwidth=4 softtabstop=4:
  3131. },{"./nodeBuffer":11,"./support":17,"./utils":21}],21:[function(_dereq_,module,exports){
  3132. 'use strict';
  3133. var support = _dereq_('./support');
  3134. var compressions = _dereq_('./compressions');
  3135. var nodeBuffer = _dereq_('./nodeBuffer');
  3136. /**
  3137. * Convert a string to a "binary string" : a string containing only char codes between 0 and 255.
  3138. * @param {string} str the string to transform.
  3139. * @return {String} the binary string.
  3140. */
  3141. exports.string2binary = function(str) {
  3142. var result = "";
  3143. for (var i = 0; i < str.length; i++) {
  3144. result += String.fromCharCode(str.charCodeAt(i) & 0xff);
  3145. }
  3146. return result;
  3147. };
  3148. exports.arrayBuffer2Blob = function(buffer) {
  3149. exports.checkSupport("blob");
  3150. try {
  3151. // Blob constructor
  3152. return new Blob([buffer], {
  3153. type: "application/zip"
  3154. });
  3155. }
  3156. catch (e) {
  3157. try {
  3158. // deprecated, browser only, old way
  3159. var Builder = window.BlobBuilder || window.WebKitBlobBuilder || window.MozBlobBuilder || window.MSBlobBuilder;
  3160. var builder = new Builder();
  3161. builder.append(buffer);
  3162. return builder.getBlob('application/zip');
  3163. }
  3164. catch (e) {
  3165. // well, fuck ?!
  3166. throw new Error("Bug : can't construct the Blob.");
  3167. }
  3168. }
  3169. };
  3170. /**
  3171. * The identity function.
  3172. * @param {Object} input the input.
  3173. * @return {Object} the same input.
  3174. */
  3175. function identity(input) {
  3176. return input;
  3177. }
  3178. /**
  3179. * Fill in an array with a string.
  3180. * @param {String} str the string to use.
  3181. * @param {Array|ArrayBuffer|Uint8Array|Buffer} array the array to fill in (will be mutated).
  3182. * @return {Array|ArrayBuffer|Uint8Array|Buffer} the updated array.
  3183. */
  3184. function stringToArrayLike(str, array) {
  3185. for (var i = 0; i < str.length; ++i) {
  3186. array[i] = str.charCodeAt(i) & 0xFF;
  3187. }
  3188. return array;
  3189. }
  3190. /**
  3191. * Transform an array-like object to a string.
  3192. * @param {Array|ArrayBuffer|Uint8Array|Buffer} array the array to transform.
  3193. * @return {String} the result.
  3194. */
  3195. function arrayLikeToString(array) {
  3196. // Performances notes :
  3197. // --------------------
  3198. // String.fromCharCode.apply(null, array) is the fastest, see
  3199. // see http://jsperf.com/converting-a-uint8array-to-a-string/2
  3200. // but the stack is limited (and we can get huge arrays !).
  3201. //
  3202. // result += String.fromCharCode(array[i]); generate too many strings !
  3203. //
  3204. // This code is inspired by http://jsperf.com/arraybuffer-to-string-apply-performance/2
  3205. var chunk = 65536;
  3206. var result = [],
  3207. len = array.length,
  3208. type = exports.getTypeOf(array),
  3209. k = 0,
  3210. canUseApply = true;
  3211. try {
  3212. switch(type) {
  3213. case "uint8array":
  3214. String.fromCharCode.apply(null, new Uint8Array(0));
  3215. break;
  3216. case "nodebuffer":
  3217. String.fromCharCode.apply(null, nodeBuffer(0));
  3218. break;
  3219. }
  3220. } catch(e) {
  3221. canUseApply = false;
  3222. }
  3223. // no apply : slow and painful algorithm
  3224. // default browser on android 4.*
  3225. if (!canUseApply) {
  3226. var resultStr = "";
  3227. for(var i = 0; i < array.length;i++) {
  3228. resultStr += String.fromCharCode(array[i]);
  3229. }
  3230. return resultStr;
  3231. }
  3232. while (k < len && chunk > 1) {
  3233. try {
  3234. if (type === "array" || type === "nodebuffer") {
  3235. result.push(String.fromCharCode.apply(null, array.slice(k, Math.min(k + chunk, len))));
  3236. }
  3237. else {
  3238. result.push(String.fromCharCode.apply(null, array.subarray(k, Math.min(k + chunk, len))));
  3239. }
  3240. k += chunk;
  3241. }
  3242. catch (e) {
  3243. chunk = Math.floor(chunk / 2);
  3244. }
  3245. }
  3246. return result.join("");
  3247. }
  3248. exports.applyFromCharCode = arrayLikeToString;
  3249. /**
  3250. * Copy the data from an array-like to an other array-like.
  3251. * @param {Array|ArrayBuffer|Uint8Array|Buffer} arrayFrom the origin array.
  3252. * @param {Array|ArrayBuffer|Uint8Array|Buffer} arrayTo the destination array which will be mutated.
  3253. * @return {Array|ArrayBuffer|Uint8Array|Buffer} the updated destination array.
  3254. */
  3255. function arrayLikeToArrayLike(arrayFrom, arrayTo) {
  3256. for (var i = 0; i < arrayFrom.length; i++) {
  3257. arrayTo[i] = arrayFrom[i];
  3258. }
  3259. return arrayTo;
  3260. }
  3261. // a matrix containing functions to transform everything into everything.
  3262. var transform = {};
  3263. // string to ?
  3264. transform["string"] = {
  3265. "string": identity,
  3266. "array": function(input) {
  3267. return stringToArrayLike(input, new Array(input.length));
  3268. },
  3269. "arraybuffer": function(input) {
  3270. return transform["string"]["uint8array"](input).buffer;
  3271. },
  3272. "uint8array": function(input) {
  3273. return stringToArrayLike(input, new Uint8Array(input.length));
  3274. },
  3275. "nodebuffer": function(input) {
  3276. return stringToArrayLike(input, nodeBuffer(input.length));
  3277. }
  3278. };
  3279. // array to ?
  3280. transform["array"] = {
  3281. "string": arrayLikeToString,
  3282. "array": identity,
  3283. "arraybuffer": function(input) {
  3284. return (new Uint8Array(input)).buffer;
  3285. },
  3286. "uint8array": function(input) {
  3287. return new Uint8Array(input);
  3288. },
  3289. "nodebuffer": function(input) {
  3290. return nodeBuffer(input);
  3291. }
  3292. };
  3293. // arraybuffer to ?
  3294. transform["arraybuffer"] = {
  3295. "string": function(input) {
  3296. return arrayLikeToString(new Uint8Array(input));
  3297. },
  3298. "array": function(input) {
  3299. return arrayLikeToArrayLike(new Uint8Array(input), new Array(input.byteLength));
  3300. },
  3301. "arraybuffer": identity,
  3302. "uint8array": function(input) {
  3303. return new Uint8Array(input);
  3304. },
  3305. "nodebuffer": function(input) {
  3306. return nodeBuffer(new Uint8Array(input));
  3307. }
  3308. };
  3309. // uint8array to ?
  3310. transform["uint8array"] = {
  3311. "string": arrayLikeToString,
  3312. "array": function(input) {
  3313. return arrayLikeToArrayLike(input, new Array(input.length));
  3314. },
  3315. "arraybuffer": function(input) {
  3316. return input.buffer;
  3317. },
  3318. "uint8array": identity,
  3319. "nodebuffer": function(input) {
  3320. return nodeBuffer(input);
  3321. }
  3322. };
  3323. // nodebuffer to ?
  3324. transform["nodebuffer"] = {
  3325. "string": arrayLikeToString,
  3326. "array": function(input) {
  3327. return arrayLikeToArrayLike(input, new Array(input.length));
  3328. },
  3329. "arraybuffer": function(input) {
  3330. return transform["nodebuffer"]["uint8array"](input).buffer;
  3331. },
  3332. "uint8array": function(input) {
  3333. return arrayLikeToArrayLike(input, new Uint8Array(input.length));
  3334. },
  3335. "nodebuffer": identity
  3336. };
  3337. /**
  3338. * Transform an input into any type.
  3339. * The supported output type are : string, array, uint8array, arraybuffer, nodebuffer.
  3340. * If no output type is specified, the unmodified input will be returned.
  3341. * @param {String} outputType the output type.
  3342. * @param {String|Array|ArrayBuffer|Uint8Array|Buffer} input the input to convert.
  3343. * @throws {Error} an Error if the browser doesn't support the requested output type.
  3344. */
  3345. exports.transformTo = function(outputType, input) {
  3346. if (!input) {
  3347. // undefined, null, etc
  3348. // an empty string won't harm.
  3349. input = "";
  3350. }
  3351. if (!outputType) {
  3352. return input;
  3353. }
  3354. exports.checkSupport(outputType);
  3355. var inputType = exports.getTypeOf(input);
  3356. var result = transform[inputType][outputType](input);
  3357. return result;
  3358. };
  3359. /**
  3360. * Return the type of the input.
  3361. * The type will be in a format valid for JSZip.utils.transformTo : string, array, uint8array, arraybuffer.
  3362. * @param {Object} input the input to identify.
  3363. * @return {String} the (lowercase) type of the input.
  3364. */
  3365. exports.getTypeOf = function(input) {
  3366. if (typeof input === "string") {
  3367. return "string";
  3368. }
  3369. if (Object.prototype.toString.call(input) === "[object Array]") {
  3370. return "array";
  3371. }
  3372. if (support.nodebuffer && nodeBuffer.test(input)) {
  3373. return "nodebuffer";
  3374. }
  3375. if (support.uint8array && input instanceof Uint8Array) {
  3376. return "uint8array";
  3377. }
  3378. if (support.arraybuffer && input instanceof ArrayBuffer) {
  3379. return "arraybuffer";
  3380. }
  3381. };
  3382. /**
  3383. * Throw an exception if the type is not supported.
  3384. * @param {String} type the type to check.
  3385. * @throws {Error} an Error if the browser doesn't support the requested type.
  3386. */
  3387. exports.checkSupport = function(type) {
  3388. var supported = support[type.toLowerCase()];
  3389. if (!supported) {
  3390. throw new Error(type + " is not supported by this browser");
  3391. }
  3392. };
  3393. exports.MAX_VALUE_16BITS = 65535;
  3394. exports.MAX_VALUE_32BITS = -1; // well, "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF" is parsed as -1
  3395. /**
  3396. * Prettify a string read as binary.
  3397. * @param {string} str the string to prettify.
  3398. * @return {string} a pretty string.
  3399. */
  3400. exports.pretty = function(str) {
  3401. var res = '',
  3402. code, i;
  3403. for (i = 0; i < (str || "").length; i++) {
  3404. code = str.charCodeAt(i);
  3405. res += '\\x' + (code < 16 ? "0" : "") + code.toString(16).toUpperCase();
  3406. }
  3407. return res;
  3408. };
  3409. /**
  3410. * Find a compression registered in JSZip.
  3411. * @param {string} compressionMethod the method magic to find.
  3412. * @return {Object|null} the JSZip compression object, null if none found.
  3413. */
  3414. exports.findCompression = function(compressionMethod) {
  3415. for (var method in compressions) {
  3416. if (!compressions.hasOwnProperty(method)) {
  3417. continue;
  3418. }
  3419. if (compressions[method].magic === compressionMethod) {
  3420. return compressions[method];
  3421. }
  3422. }
  3423. return null;
  3424. };
  3425. /**
  3426. * Cross-window, cross-Node-context regular expression detection
  3427. * @param {Object} object Anything
  3428. * @return {Boolean} true if the object is a regular expression,
  3429. * false otherwise
  3430. */
  3431. exports.isRegExp = function (object) {
  3432. return Object.prototype.toString.call(object) === "[object RegExp]";
  3433. };
  3434. },{"./compressions":3,"./nodeBuffer":11,"./support":17}],22:[function(_dereq_,module,exports){
  3435. 'use strict';
  3436. var StringReader = _dereq_('./stringReader');
  3437. var NodeBufferReader = _dereq_('./nodeBufferReader');
  3438. var Uint8ArrayReader = _dereq_('./uint8ArrayReader');
  3439. var utils = _dereq_('./utils');
  3440. var sig = _dereq_('./signature');
  3441. var ZipEntry = _dereq_('./zipEntry');
  3442. var support = _dereq_('./support');
  3443. var jszipProto = _dereq_('./object');
  3444. // class ZipEntries {{{
  3445. /**
  3446. * All the entries in the zip file.
  3447. * @constructor
  3448. * @param {String|ArrayBuffer|Uint8Array} data the binary stream to load.
  3449. * @param {Object} loadOptions Options for loading the stream.
  3450. */
  3451. function ZipEntries(data, loadOptions) {
  3452. this.files = [];
  3453. this.loadOptions = loadOptions;
  3454. if (data) {
  3455. this.load(data);
  3456. }
  3457. }
  3458. ZipEntries.prototype = {
  3459. /**
  3460. * Check that the reader is on the speficied signature.
  3461. * @param {string} expectedSignature the expected signature.
  3462. * @throws {Error} if it is an other signature.
  3463. */
  3464. checkSignature: function(expectedSignature) {
  3465. var signature = this.reader.readString(4);
  3466. if (signature !== expectedSignature) {
  3467. throw new Error("Corrupted zip or bug : unexpected signature " + "(" + utils.pretty(signature) + ", expected " + utils.pretty(expectedSignature) + ")");
  3468. }
  3469. },
  3470. /**
  3471. * Read the end of the central directory.
  3472. */
  3473. readBlockEndOfCentral: function() {
  3474. this.diskNumber = this.reader.readInt(2);
  3475. this.diskWithCentralDirStart = this.reader.readInt(2);
  3476. this.centralDirRecordsOnThisDisk = this.reader.readInt(2);
  3477. this.centralDirRecords = this.reader.readInt(2);
  3478. this.centralDirSize = this.reader.readInt(4);
  3479. this.centralDirOffset = this.reader.readInt(4);
  3480. this.zipCommentLength = this.reader.readInt(2);
  3481. // warning : the encoding depends of the system locale
  3482. // On a linux machine with LANG=en_US.utf8, this field is utf8 encoded.
  3483. // On a windows machine, this field is encoded with the localized windows code page.
  3484. this.zipComment = this.reader.readString(this.zipCommentLength);
  3485. // To get consistent behavior with the generation part, we will assume that
  3486. // this is utf8 encoded.
  3487. this.zipComment = jszipProto.utf8decode(this.zipComment);
  3488. },
  3489. /**
  3490. * Read the end of the Zip 64 central directory.
  3491. * Not merged with the method readEndOfCentral :
  3492. * The end of central can coexist with its Zip64 brother,
  3493. * I don't want to read the wrong number of bytes !
  3494. */
  3495. readBlockZip64EndOfCentral: function() {
  3496. this.zip64EndOfCentralSize = this.reader.readInt(8);
  3497. this.versionMadeBy = this.reader.readString(2);
  3498. this.versionNeeded = this.reader.readInt(2);
  3499. this.diskNumber = this.reader.readInt(4);
  3500. this.diskWithCentralDirStart = this.reader.readInt(4);
  3501. this.centralDirRecordsOnThisDisk = this.reader.readInt(8);
  3502. this.centralDirRecords = this.reader.readInt(8);
  3503. this.centralDirSize = this.reader.readInt(8);
  3504. this.centralDirOffset = this.reader.readInt(8);
  3505. this.zip64ExtensibleData = {};
  3506. var extraDataSize = this.zip64EndOfCentralSize - 44,
  3507. index = 0,
  3508. extraFieldId,
  3509. extraFieldLength,
  3510. extraFieldValue;
  3511. while (index < extraDataSize) {
  3512. extraFieldId = this.reader.readInt(2);
  3513. extraFieldLength = this.reader.readInt(4);
  3514. extraFieldValue = this.reader.readString(extraFieldLength);
  3515. this.zip64ExtensibleData[extraFieldId] = {
  3516. id: extraFieldId,
  3517. length: extraFieldLength,
  3518. value: extraFieldValue
  3519. };
  3520. }
  3521. },
  3522. /**
  3523. * Read the end of the Zip 64 central directory locator.
  3524. */
  3525. readBlockZip64EndOfCentralLocator: function() {
  3526. this.diskWithZip64CentralDirStart = this.reader.readInt(4);
  3527. this.relativeOffsetEndOfZip64CentralDir = this.reader.readInt(8);
  3528. this.disksCount = this.reader.readInt(4);
  3529. if (this.disksCount > 1) {
  3530. throw new Error("Multi-volumes zip are not supported");
  3531. }
  3532. },
  3533. /**
  3534. * Read the local files, based on the offset read in the central part.
  3535. */
  3536. readLocalFiles: function() {
  3537. var i, file;
  3538. for (i = 0; i < this.files.length; i++) {
  3539. file = this.files[i];
  3540. this.reader.setIndex(file.localHeaderOffset);
  3541. this.checkSignature(sig.LOCAL_FILE_HEADER);
  3542. file.readLocalPart(this.reader);
  3543. file.handleUTF8();
  3544. }
  3545. },
  3546. /**
  3547. * Read the central directory.
  3548. */
  3549. readCentralDir: function() {
  3550. var file;
  3551. this.reader.setIndex(this.centralDirOffset);
  3552. while (this.reader.readString(4) === sig.CENTRAL_FILE_HEADER) {
  3553. file = new ZipEntry({
  3554. zip64: this.zip64
  3555. }, this.loadOptions);
  3556. file.readCentralPart(this.reader);
  3557. this.files.push(file);
  3558. }
  3559. },
  3560. /**
  3561. * Read the end of central directory.
  3562. */
  3563. readEndOfCentral: function() {
  3564. var offset = this.reader.lastIndexOfSignature(sig.CENTRAL_DIRECTORY_END);
  3565. if (offset === -1) {
  3566. throw new Error("Corrupted zip : can't find end of central directory");
  3567. }
  3568. this.reader.setIndex(offset);
  3569. this.checkSignature(sig.CENTRAL_DIRECTORY_END);
  3570. this.readBlockEndOfCentral();
  3571. /* extract from the zip spec :
  3572. 4) If one of the fields in the end of central directory
  3573. record is too small to hold required data, the field
  3574. should be set to -1 (0xFFFF or 0xFFFFFFFF) and the
  3575. ZIP64 format record should be created.
  3576. 5) The end of central directory record and the
  3577. Zip64 end of central directory locator record must
  3578. reside on the same disk when splitting or spanning
  3579. an archive.
  3580. */
  3581. if (this.diskNumber === utils.MAX_VALUE_16BITS || this.diskWithCentralDirStart === utils.MAX_VALUE_16BITS || this.centralDirRecordsOnThisDisk === utils.MAX_VALUE_16BITS || this.centralDirRecords === utils.MAX_VALUE_16BITS || this.centralDirSize === utils.MAX_VALUE_32BITS || this.centralDirOffset === utils.MAX_VALUE_32BITS) {
  3582. this.zip64 = true;
  3583. /*
  3584. Warning : the zip64 extension is supported, but ONLY if the 64bits integer read from
  3585. the zip file can fit into a 32bits integer. This cannot be solved : Javascript represents
  3586. all numbers as 64-bit double precision IEEE 754 floating point numbers.
  3587. So, we have 53bits for integers and bitwise operations treat everything as 32bits.
  3588. see https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Operators/Bitwise_Operators
  3589. and http://www.ecma-international.org/publications/files/ECMA-ST/ECMA-262.pdf section 8.5
  3590. */
  3591. // should look for a zip64 EOCD locator
  3592. offset = this.reader.lastIndexOfSignature(sig.ZIP64_CENTRAL_DIRECTORY_LOCATOR);
  3593. if (offset === -1) {
  3594. throw new Error("Corrupted zip : can't find the ZIP64 end of central directory locator");
  3595. }
  3596. this.reader.setIndex(offset);
  3597. this.checkSignature(sig.ZIP64_CENTRAL_DIRECTORY_LOCATOR);
  3598. this.readBlockZip64EndOfCentralLocator();
  3599. // now the zip64 EOCD record
  3600. this.reader.setIndex(this.relativeOffsetEndOfZip64CentralDir);
  3601. this.checkSignature(sig.ZIP64_CENTRAL_DIRECTORY_END);
  3602. this.readBlockZip64EndOfCentral();
  3603. }
  3604. },
  3605. prepareReader: function(data) {
  3606. var type = utils.getTypeOf(data);
  3607. if (type === "string" && !support.uint8array) {
  3608. this.reader = new StringReader(data, this.loadOptions.optimizedBinaryString);
  3609. }
  3610. else if (type === "nodebuffer") {
  3611. this.reader = new NodeBufferReader(data);
  3612. }
  3613. else {
  3614. this.reader = new Uint8ArrayReader(utils.transformTo("uint8array", data));
  3615. }
  3616. },
  3617. /**
  3618. * Read a zip file and create ZipEntries.
  3619. * @param {String|ArrayBuffer|Uint8Array|Buffer} data the binary string representing a zip file.
  3620. */
  3621. load: function(data) {
  3622. this.prepareReader(data);
  3623. this.readEndOfCentral();
  3624. this.readCentralDir();
  3625. this.readLocalFiles();
  3626. }
  3627. };
  3628. // }}} end of ZipEntries
  3629. module.exports = ZipEntries;
  3630. },{"./nodeBufferReader":12,"./object":13,"./signature":14,"./stringReader":15,"./support":17,"./uint8ArrayReader":18,"./utils":21,"./zipEntry":23}],23:[function(_dereq_,module,exports){
  3631. 'use strict';
  3632. var StringReader = _dereq_('./stringReader');
  3633. var utils = _dereq_('./utils');
  3634. var CompressedObject = _dereq_('./compressedObject');
  3635. var jszipProto = _dereq_('./object');
  3636. // class ZipEntry {{{
  3637. /**
  3638. * An entry in the zip file.
  3639. * @constructor
  3640. * @param {Object} options Options of the current file.
  3641. * @param {Object} loadOptions Options for loading the stream.
  3642. */
  3643. function ZipEntry(options, loadOptions) {
  3644. this.options = options;
  3645. this.loadOptions = loadOptions;
  3646. }
  3647. ZipEntry.prototype = {
  3648. /**
  3649. * say if the file is encrypted.
  3650. * @return {boolean} true if the file is encrypted, false otherwise.
  3651. */
  3652. isEncrypted: function() {
  3653. // bit 1 is set
  3654. return (this.bitFlag & 0x0001) === 0x0001;
  3655. },
  3656. /**
  3657. * say if the file has utf-8 filename/comment.
  3658. * @return {boolean} true if the filename/comment is in utf-8, false otherwise.
  3659. */
  3660. useUTF8: function() {
  3661. // bit 11 is set
  3662. return (this.bitFlag & 0x0800) === 0x0800;
  3663. },
  3664. /**
  3665. * Prepare the function used to generate the compressed content from this ZipFile.
  3666. * @param {DataReader} reader the reader to use.
  3667. * @param {number} from the offset from where we should read the data.
  3668. * @param {number} length the length of the data to read.
  3669. * @return {Function} the callback to get the compressed content (the type depends of the DataReader class).
  3670. */
  3671. prepareCompressedContent: function(reader, from, length) {
  3672. return function() {
  3673. var previousIndex = reader.index;
  3674. reader.setIndex(from);
  3675. var compressedFileData = reader.readData(length);
  3676. reader.setIndex(previousIndex);
  3677. return compressedFileData;
  3678. };
  3679. },
  3680. /**
  3681. * Prepare the function used to generate the uncompressed content from this ZipFile.
  3682. * @param {DataReader} reader the reader to use.
  3683. * @param {number} from the offset from where we should read the data.
  3684. * @param {number} length the length of the data to read.
  3685. * @param {JSZip.compression} compression the compression used on this file.
  3686. * @param {number} uncompressedSize the uncompressed size to expect.
  3687. * @return {Function} the callback to get the uncompressed content (the type depends of the DataReader class).
  3688. */
  3689. prepareContent: function(reader, from, length, compression, uncompressedSize) {
  3690. return function() {
  3691. var compressedFileData = utils.transformTo(compression.uncompressInputType, this.getCompressedContent());
  3692. var uncompressedFileData = compression.uncompress(compressedFileData);
  3693. if (uncompressedFileData.length !== uncompressedSize) {
  3694. throw new Error("Bug : uncompressed data size mismatch");
  3695. }
  3696. return uncompressedFileData;
  3697. };
  3698. },
  3699. /**
  3700. * Read the local part of a zip file and add the info in this object.
  3701. * @param {DataReader} reader the reader to use.
  3702. */
  3703. readLocalPart: function(reader) {
  3704. var compression, localExtraFieldsLength;
  3705. // we already know everything from the central dir !
  3706. // If the central dir data are false, we are doomed.
  3707. // On the bright side, the local part is scary : zip64, data descriptors, both, etc.
  3708. // The less data we get here, the more reliable this should be.
  3709. // Let's skip the whole header and dash to the data !
  3710. reader.skip(22);
  3711. // in some zip created on windows, the filename stored in the central dir contains \ instead of /.
  3712. // Strangely, the filename here is OK.
  3713. // I would love to treat these zip files as corrupted (see http://www.info-zip.org/FAQ.html#backslashes
  3714. // or APPNOTE#4.4.17.1, "All slashes MUST be forward slashes '/'") but there are a lot of bad zip generators...
  3715. // Search "unzip mismatching "local" filename continuing with "central" filename version" on
  3716. // the internet.
  3717. //
  3718. // I think I see the logic here : the central directory is used to display
  3719. // content and the local directory is used to extract the files. Mixing / and \
  3720. // may be used to display \ to windows users and use / when extracting the files.
  3721. // Unfortunately, this lead also to some issues : http://seclists.org/fulldisclosure/2009/Sep/394
  3722. this.fileNameLength = reader.readInt(2);
  3723. localExtraFieldsLength = reader.readInt(2); // can't be sure this will be the same as the central dir
  3724. this.fileName = reader.readString(this.fileNameLength);
  3725. reader.skip(localExtraFieldsLength);
  3726. if (this.compressedSize == -1 || this.uncompressedSize == -1) {
  3727. throw new Error("Bug or corrupted zip : didn't get enough informations from the central directory " + "(compressedSize == -1 || uncompressedSize == -1)");
  3728. }
  3729. compression = utils.findCompression(this.compressionMethod);
  3730. if (compression === null) { // no compression found
  3731. throw new Error("Corrupted zip : compression " + utils.pretty(this.compressionMethod) + " unknown (inner file : " + this.fileName + ")");
  3732. }
  3733. this.decompressed = new CompressedObject();
  3734. this.decompressed.compressedSize = this.compressedSize;
  3735. this.decompressed.uncompressedSize = this.uncompressedSize;
  3736. this.decompressed.crc32 = this.crc32;
  3737. this.decompressed.compressionMethod = this.compressionMethod;
  3738. this.decompressed.getCompressedContent = this.prepareCompressedContent(reader, reader.index, this.compressedSize, compression);
  3739. this.decompressed.getContent = this.prepareContent(reader, reader.index, this.compressedSize, compression, this.uncompressedSize);
  3740. // we need to compute the crc32...
  3741. if (this.loadOptions.checkCRC32) {
  3742. this.decompressed = utils.transformTo("string", this.decompressed.getContent());
  3743. if (jszipProto.crc32(this.decompressed) !== this.crc32) {
  3744. throw new Error("Corrupted zip : CRC32 mismatch");
  3745. }
  3746. }
  3747. },
  3748. /**
  3749. * Read the central part of a zip file and add the info in this object.
  3750. * @param {DataReader} reader the reader to use.
  3751. */
  3752. readCentralPart: function(reader) {
  3753. this.versionMadeBy = reader.readString(2);
  3754. this.versionNeeded = reader.readInt(2);
  3755. this.bitFlag = reader.readInt(2);
  3756. this.compressionMethod = reader.readString(2);
  3757. this.date = reader.readDate();
  3758. this.crc32 = reader.readInt(4);
  3759. this.compressedSize = reader.readInt(4);
  3760. this.uncompressedSize = reader.readInt(4);
  3761. this.fileNameLength = reader.readInt(2);
  3762. this.extraFieldsLength = reader.readInt(2);
  3763. this.fileCommentLength = reader.readInt(2);
  3764. this.diskNumberStart = reader.readInt(2);
  3765. this.internalFileAttributes = reader.readInt(2);
  3766. this.externalFileAttributes = reader.readInt(4);
  3767. this.localHeaderOffset = reader.readInt(4);
  3768. if (this.isEncrypted()) {
  3769. throw new Error("Encrypted zip are not supported");
  3770. }
  3771. this.fileName = reader.readString(this.fileNameLength);
  3772. this.readExtraFields(reader);
  3773. this.parseZIP64ExtraField(reader);
  3774. this.fileComment = reader.readString(this.fileCommentLength);
  3775. // warning, this is true only for zip with madeBy == DOS (plateform dependent feature)
  3776. this.dir = this.externalFileAttributes & 0x00000010 ? true : false;
  3777. },
  3778. /**
  3779. * Parse the ZIP64 extra field and merge the info in the current ZipEntry.
  3780. * @param {DataReader} reader the reader to use.
  3781. */
  3782. parseZIP64ExtraField: function(reader) {
  3783. if (!this.extraFields[0x0001]) {
  3784. return;
  3785. }
  3786. // should be something, preparing the extra reader
  3787. var extraReader = new StringReader(this.extraFields[0x0001].value);
  3788. // I really hope that these 64bits integer can fit in 32 bits integer, because js
  3789. // won't let us have more.
  3790. if (this.uncompressedSize === utils.MAX_VALUE_32BITS) {
  3791. this.uncompressedSize = extraReader.readInt(8);
  3792. }
  3793. if (this.compressedSize === utils.MAX_VALUE_32BITS) {
  3794. this.compressedSize = extraReader.readInt(8);
  3795. }
  3796. if (this.localHeaderOffset === utils.MAX_VALUE_32BITS) {
  3797. this.localHeaderOffset = extraReader.readInt(8);
  3798. }
  3799. if (this.diskNumberStart === utils.MAX_VALUE_32BITS) {
  3800. this.diskNumberStart = extraReader.readInt(4);
  3801. }
  3802. },
  3803. /**
  3804. * Read the central part of a zip file and add the info in this object.
  3805. * @param {DataReader} reader the reader to use.
  3806. */
  3807. readExtraFields: function(reader) {
  3808. var start = reader.index,
  3809. extraFieldId,
  3810. extraFieldLength,
  3811. extraFieldValue;
  3812. this.extraFields = this.extraFields || {};
  3813. while (reader.index < start + this.extraFieldsLength) {
  3814. extraFieldId = reader.readInt(2);
  3815. extraFieldLength = reader.readInt(2);
  3816. extraFieldValue = reader.readString(extraFieldLength);
  3817. this.extraFields[extraFieldId] = {
  3818. id: extraFieldId,
  3819. length: extraFieldLength,
  3820. value: extraFieldValue
  3821. };
  3822. }
  3823. },
  3824. /**
  3825. * Apply an UTF8 transformation if needed.
  3826. */
  3827. handleUTF8: function() {
  3828. if (this.useUTF8()) {
  3829. this.fileName = jszipProto.utf8decode(this.fileName);
  3830. this.fileComment = jszipProto.utf8decode(this.fileComment);
  3831. } else {
  3832. var upath = this.findExtraFieldUnicodePath();
  3833. if (upath !== null) {
  3834. this.fileName = upath;
  3835. }
  3836. var ucomment = this.findExtraFieldUnicodeComment();
  3837. if (ucomment !== null) {
  3838. this.fileComment = ucomment;
  3839. }
  3840. }
  3841. },
  3842. /**
  3843. * Find the unicode path declared in the extra field, if any.
  3844. * @return {String} the unicode path, null otherwise.
  3845. */
  3846. findExtraFieldUnicodePath: function() {
  3847. var upathField = this.extraFields[0x7075];
  3848. if (upathField) {
  3849. var extraReader = new StringReader(upathField.value);
  3850. // wrong version
  3851. if (extraReader.readInt(1) !== 1) {
  3852. return null;
  3853. }
  3854. // the crc of the filename changed, this field is out of date.
  3855. if (jszipProto.crc32(this.fileName) !== extraReader.readInt(4)) {
  3856. return null;
  3857. }
  3858. return jszipProto.utf8decode(extraReader.readString(upathField.length - 5));
  3859. }
  3860. return null;
  3861. },
  3862. /**
  3863. * Find the unicode comment declared in the extra field, if any.
  3864. * @return {String} the unicode comment, null otherwise.
  3865. */
  3866. findExtraFieldUnicodeComment: function() {
  3867. var ucommentField = this.extraFields[0x6375];
  3868. if (ucommentField) {
  3869. var extraReader = new StringReader(ucommentField.value);
  3870. // wrong version
  3871. if (extraReader.readInt(1) !== 1) {
  3872. return null;
  3873. }
  3874. // the crc of the comment changed, this field is out of date.
  3875. if (jszipProto.crc32(this.fileComment) !== extraReader.readInt(4)) {
  3876. return null;
  3877. }
  3878. return jszipProto.utf8decode(extraReader.readString(ucommentField.length - 5));
  3879. }
  3880. return null;
  3881. }
  3882. };
  3883. module.exports = ZipEntry;
  3884. },{"./compressedObject":2,"./object":13,"./stringReader":15,"./utils":21}],24:[function(_dereq_,module,exports){
  3885. // Top level file is just a mixin of submodules & constants
  3886. 'use strict';
  3887. var assign = _dereq_('./lib/utils/common').assign;
  3888. var deflate = _dereq_('./lib/deflate');
  3889. var inflate = _dereq_('./lib/inflate');
  3890. var constants = _dereq_('./lib/zlib/constants');
  3891. var pako = {};
  3892. assign(pako, deflate, inflate, constants);
  3893. module.exports = pako;
  3894. },{"./lib/deflate":25,"./lib/inflate":26,"./lib/utils/common":27,"./lib/zlib/constants":30}],25:[function(_dereq_,module,exports){
  3895. 'use strict';
  3896. var zlib_deflate = _dereq_('./zlib/deflate.js');
  3897. var utils = _dereq_('./utils/common');
  3898. var strings = _dereq_('./utils/strings');
  3899. var msg = _dereq_('./zlib/messages');
  3900. var zstream = _dereq_('./zlib/zstream');
  3901. /* Public constants ==========================================================*/
  3902. /* ===========================================================================*/
  3903. var Z_NO_FLUSH = 0;
  3904. var Z_FINISH = 4;
  3905. var Z_OK = 0;
  3906. var Z_STREAM_END = 1;
  3907. var Z_DEFAULT_COMPRESSION = -1;
  3908. var Z_DEFAULT_STRATEGY = 0;
  3909. var Z_DEFLATED = 8;
  3910. /* ===========================================================================*/
  3911. /**
  3912. * class Deflate
  3913. *
  3914. * Generic JS-style wrapper for zlib calls. If you don't need
  3915. * streaming behaviour - use more simple functions: [[deflate]],
  3916. * [[deflateRaw]] and [[gzip]].
  3917. **/
  3918. /* internal
  3919. * Deflate.chunks -> Array
  3920. *
  3921. * Chunks of output data, if [[Deflate#onData]] not overriden.
  3922. **/
  3923. /**
  3924. * Deflate.result -> Uint8Array|Array
  3925. *
  3926. * Compressed result, generated by default [[Deflate#onData]]
  3927. * and [[Deflate#onEnd]] handlers. Filled after you push last chunk
  3928. * (call [[Deflate#push]] with `Z_FINISH` / `true` param).
  3929. **/
  3930. /**
  3931. * Deflate.err -> Number
  3932. *
  3933. * Error code after deflate finished. 0 (Z_OK) on success.
  3934. * You will not need it in real life, because deflate errors
  3935. * are possible only on wrong options or bad `onData` / `onEnd`
  3936. * custom handlers.
  3937. **/
  3938. /**
  3939. * Deflate.msg -> String
  3940. *
  3941. * Error message, if [[Deflate.err]] != 0
  3942. **/
  3943. /**
  3944. * new Deflate(options)
  3945. * - options (Object): zlib deflate options.
  3946. *
  3947. * Creates new deflator instance with specified params. Throws exception
  3948. * on bad params. Supported options:
  3949. *
  3950. * - `level`
  3951. * - `windowBits`
  3952. * - `memLevel`
  3953. * - `strategy`
  3954. *
  3955. * [http://zlib.net/manual.html#Advanced](http://zlib.net/manual.html#Advanced)
  3956. * for more information on these.
  3957. *
  3958. * Additional options, for internal needs:
  3959. *
  3960. * - `chunkSize` - size of generated data chunks (16K by default)
  3961. * - `raw` (Boolean) - do raw deflate
  3962. * - `gzip` (Boolean) - create gzip wrapper
  3963. * - `to` (String) - if equal to 'string', then result will be "binary string"
  3964. * (each char code [0..255])
  3965. * - `header` (Object) - custom header for gzip
  3966. * - `text` (Boolean) - true if compressed data believed to be text
  3967. * - `time` (Number) - modification time, unix timestamp
  3968. * - `os` (Number) - operation system code
  3969. * - `extra` (Array) - array of bytes with extra data (max 65536)
  3970. * - `name` (String) - file name (binary string)
  3971. * - `comment` (String) - comment (binary string)
  3972. * - `hcrc` (Boolean) - true if header crc should be added
  3973. *
  3974. * ##### Example:
  3975. *
  3976. * ```javascript
  3977. * var pako = require('pako')
  3978. * , chunk1 = Uint8Array([1,2,3,4,5,6,7,8,9])
  3979. * , chunk2 = Uint8Array([10,11,12,13,14,15,16,17,18,19]);
  3980. *
  3981. * var deflate = new pako.Deflate({ level: 3});
  3982. *
  3983. * deflate.push(chunk1, false);
  3984. * deflate.push(chunk2, true); // true -> last chunk
  3985. *
  3986. * if (deflate.err) { throw new Error(deflate.err); }
  3987. *
  3988. * console.log(deflate.result);
  3989. * ```
  3990. **/
  3991. var Deflate = function(options) {
  3992. this.options = utils.assign({
  3993. level: Z_DEFAULT_COMPRESSION,
  3994. method: Z_DEFLATED,
  3995. chunkSize: 16384,
  3996. windowBits: 15,
  3997. memLevel: 8,
  3998. strategy: Z_DEFAULT_STRATEGY,
  3999. to: ''
  4000. }, options || {});
  4001. var opt = this.options;
  4002. if (opt.raw && (opt.windowBits > 0)) {
  4003. opt.windowBits = -opt.windowBits;
  4004. }
  4005. else if (opt.gzip && (opt.windowBits > 0) && (opt.windowBits < 16)) {
  4006. opt.windowBits += 16;
  4007. }
  4008. this.err = 0; // error code, if happens (0 = Z_OK)
  4009. this.msg = ''; // error message
  4010. this.ended = false; // used to avoid multiple onEnd() calls
  4011. this.chunks = []; // chunks of compressed data
  4012. this.strm = new zstream();
  4013. this.strm.avail_out = 0;
  4014. var status = zlib_deflate.deflateInit2(
  4015. this.strm,
  4016. opt.level,
  4017. opt.method,
  4018. opt.windowBits,
  4019. opt.memLevel,
  4020. opt.strategy
  4021. );
  4022. if (status !== Z_OK) {
  4023. throw new Error(msg[status]);
  4024. }
  4025. if (opt.header) {
  4026. zlib_deflate.deflateSetHeader(this.strm, opt.header);
  4027. }
  4028. };
  4029. /**
  4030. * Deflate#push(data[, mode]) -> Boolean
  4031. * - data (Uint8Array|Array|String): input data. Strings will be converted to
  4032. * utf8 byte sequence.
  4033. * - mode (Number|Boolean): 0..6 for corresponding Z_NO_FLUSH..Z_TREE modes.
  4034. * See constants. Skipped or `false` means Z_NO_FLUSH, `true` meansh Z_FINISH.
  4035. *
  4036. * Sends input data to deflate pipe, generating [[Deflate#onData]] calls with
  4037. * new compressed chunks. Returns `true` on success. The last data block must have
  4038. * mode Z_FINISH (or `true`). That flush internal pending buffers and call
  4039. * [[Deflate#onEnd]].
  4040. *
  4041. * On fail call [[Deflate#onEnd]] with error code and return false.
  4042. *
  4043. * We strongly recommend to use `Uint8Array` on input for best speed (output
  4044. * array format is detected automatically). Also, don't skip last param and always
  4045. * use the same type in your code (boolean or number). That will improve JS speed.
  4046. *
  4047. * For regular `Array`-s make sure all elements are [0..255].
  4048. *
  4049. * ##### Example
  4050. *
  4051. * ```javascript
  4052. * push(chunk, false); // push one of data chunks
  4053. * ...
  4054. * push(chunk, true); // push last chunk
  4055. * ```
  4056. **/
  4057. Deflate.prototype.push = function(data, mode) {
  4058. var strm = this.strm;
  4059. var chunkSize = this.options.chunkSize;
  4060. var status, _mode;
  4061. if (this.ended) { return false; }
  4062. _mode = (mode === ~~mode) ? mode : ((mode === true) ? Z_FINISH : Z_NO_FLUSH);
  4063. // Convert data if needed
  4064. if (typeof data === 'string') {
  4065. // If we need to compress text, change encoding to utf8.
  4066. strm.input = strings.string2buf(data);
  4067. } else {
  4068. strm.input = data;
  4069. }
  4070. strm.next_in = 0;
  4071. strm.avail_in = strm.input.length;
  4072. do {
  4073. if (strm.avail_out === 0) {
  4074. strm.output = new utils.Buf8(chunkSize);
  4075. strm.next_out = 0;
  4076. strm.avail_out = chunkSize;
  4077. }
  4078. status = zlib_deflate.deflate(strm, _mode); /* no bad return value */
  4079. if (status !== Z_STREAM_END && status !== Z_OK) {
  4080. this.onEnd(status);
  4081. this.ended = true;
  4082. return false;
  4083. }
  4084. if (strm.avail_out === 0 || (strm.avail_in === 0 && _mode === Z_FINISH)) {
  4085. if (this.options.to === 'string') {
  4086. this.onData(strings.buf2binstring(utils.shrinkBuf(strm.output, strm.next_out)));
  4087. } else {
  4088. this.onData(utils.shrinkBuf(strm.output, strm.next_out));
  4089. }
  4090. }
  4091. } while ((strm.avail_in > 0 || strm.avail_out === 0) && status !== Z_STREAM_END);
  4092. // Finalize on the last chunk.
  4093. if (_mode === Z_FINISH) {
  4094. status = zlib_deflate.deflateEnd(this.strm);
  4095. this.onEnd(status);
  4096. this.ended = true;
  4097. return status === Z_OK;
  4098. }
  4099. return true;
  4100. };
  4101. /**
  4102. * Deflate#onData(chunk) -> Void
  4103. * - chunk (Uint8Array|Array|String): ouput data. Type of array depends
  4104. * on js engine support. When string output requested, each chunk
  4105. * will be string.
  4106. *
  4107. * By default, stores data blocks in `chunks[]` property and glue
  4108. * those in `onEnd`. Override this handler, if you need another behaviour.
  4109. **/
  4110. Deflate.prototype.onData = function(chunk) {
  4111. this.chunks.push(chunk);
  4112. };
  4113. /**
  4114. * Deflate#onEnd(status) -> Void
  4115. * - status (Number): deflate status. 0 (Z_OK) on success,
  4116. * other if not.
  4117. *
  4118. * Called once after you tell deflate that input stream complete
  4119. * or error happenned. By default - join collected chunks,
  4120. * free memory and fill `results` / `err` properties.
  4121. **/
  4122. Deflate.prototype.onEnd = function(status) {
  4123. // On success - join
  4124. if (status === Z_OK) {
  4125. if (this.options.to === 'string') {
  4126. this.result = this.chunks.join('');
  4127. } else {
  4128. this.result = utils.flattenChunks(this.chunks);
  4129. }
  4130. }
  4131. this.chunks = [];
  4132. this.err = status;
  4133. this.msg = this.strm.msg;
  4134. };
  4135. /**
  4136. * deflate(data[, options]) -> Uint8Array|Array|String
  4137. * - data (Uint8Array|Array|String): input data to compress.
  4138. * - options (Object): zlib deflate options.
  4139. *
  4140. * Compress `data` with deflate alrorythm and `options`.
  4141. *
  4142. * Supported options are:
  4143. *
  4144. * - level
  4145. * - windowBits
  4146. * - memLevel
  4147. * - strategy
  4148. *
  4149. * [http://zlib.net/manual.html#Advanced](http://zlib.net/manual.html#Advanced)
  4150. * for more information on these.
  4151. *
  4152. * Sugar (options):
  4153. *
  4154. * - `raw` (Boolean) - say that we work with raw stream, if you don't wish to specify
  4155. * negative windowBits implicitly.
  4156. * - `to` (String) - if equal to 'string', then result will be "binary string"
  4157. * (each char code [0..255])
  4158. *
  4159. * ##### Example:
  4160. *
  4161. * ```javascript
  4162. * var pako = require('pako')
  4163. * , data = Uint8Array([1,2,3,4,5,6,7,8,9]);
  4164. *
  4165. * console.log(pako.deflate(data));
  4166. * ```
  4167. **/
  4168. function deflate(input, options) {
  4169. var deflator = new Deflate(options);
  4170. deflator.push(input, true);
  4171. // That will never happens, if you don't cheat with options :)
  4172. if (deflator.err) { throw deflator.msg; }
  4173. return deflator.result;
  4174. }
  4175. /**
  4176. * deflateRaw(data[, options]) -> Uint8Array|Array|String
  4177. * - data (Uint8Array|Array|String): input data to compress.
  4178. * - options (Object): zlib deflate options.
  4179. *
  4180. * The same as [[deflate]], but creates raw data, without wrapper
  4181. * (header and adler32 crc).
  4182. **/
  4183. function deflateRaw(input, options) {
  4184. options = options || {};
  4185. options.raw = true;
  4186. return deflate(input, options);
  4187. }
  4188. /**
  4189. * gzip(data[, options]) -> Uint8Array|Array|String
  4190. * - data (Uint8Array|Array|String): input data to compress.
  4191. * - options (Object): zlib deflate options.
  4192. *
  4193. * The same as [[deflate]], but create gzip wrapper instead of
  4194. * deflate one.
  4195. **/
  4196. function gzip(input, options) {
  4197. options = options || {};
  4198. options.gzip = true;
  4199. return deflate(input, options);
  4200. }
  4201. exports.Deflate = Deflate;
  4202. exports.deflate = deflate;
  4203. exports.deflateRaw = deflateRaw;
  4204. exports.gzip = gzip;
  4205. },{"./utils/common":27,"./utils/strings":28,"./zlib/deflate.js":32,"./zlib/messages":37,"./zlib/zstream":39}],26:[function(_dereq_,module,exports){
  4206. 'use strict';
  4207. var zlib_inflate = _dereq_('./zlib/inflate.js');
  4208. var utils = _dereq_('./utils/common');
  4209. var strings = _dereq_('./utils/strings');
  4210. var c = _dereq_('./zlib/constants');
  4211. var msg = _dereq_('./zlib/messages');
  4212. var zstream = _dereq_('./zlib/zstream');
  4213. var gzheader = _dereq_('./zlib/gzheader');
  4214. /**
  4215. * class Inflate
  4216. *
  4217. * Generic JS-style wrapper for zlib calls. If you don't need
  4218. * streaming behaviour - use more simple functions: [[inflate]]
  4219. * and [[inflateRaw]].
  4220. **/
  4221. /* internal
  4222. * inflate.chunks -> Array
  4223. *
  4224. * Chunks of output data, if [[Inflate#onData]] not overriden.
  4225. **/
  4226. /**
  4227. * Inflate.result -> Uint8Array|Array|String
  4228. *
  4229. * Uncompressed result, generated by default [[Inflate#onData]]
  4230. * and [[Inflate#onEnd]] handlers. Filled after you push last chunk
  4231. * (call [[Inflate#push]] with `Z_FINISH` / `true` param).
  4232. **/
  4233. /**
  4234. * Inflate.err -> Number
  4235. *
  4236. * Error code after inflate finished. 0 (Z_OK) on success.
  4237. * Should be checked if broken data possible.
  4238. **/
  4239. /**
  4240. * Inflate.msg -> String
  4241. *
  4242. * Error message, if [[Inflate.err]] != 0
  4243. **/
  4244. /**
  4245. * new Inflate(options)
  4246. * - options (Object): zlib inflate options.
  4247. *
  4248. * Creates new inflator instance with specified params. Throws exception
  4249. * on bad params. Supported options:
  4250. *
  4251. * - `windowBits`
  4252. *
  4253. * [http://zlib.net/manual.html#Advanced](http://zlib.net/manual.html#Advanced)
  4254. * for more information on these.
  4255. *
  4256. * Additional options, for internal needs:
  4257. *
  4258. * - `chunkSize` - size of generated data chunks (16K by default)
  4259. * - `raw` (Boolean) - do raw inflate
  4260. * - `to` (String) - if equal to 'string', then result will be converted
  4261. * from utf8 to utf16 (javascript) string. When string output requested,
  4262. * chunk length can differ from `chunkSize`, depending on content.
  4263. *
  4264. * By default, when no options set, autodetect deflate/gzip data format via
  4265. * wrapper header.
  4266. *
  4267. * ##### Example:
  4268. *
  4269. * ```javascript
  4270. * var pako = require('pako')
  4271. * , chunk1 = Uint8Array([1,2,3,4,5,6,7,8,9])
  4272. * , chunk2 = Uint8Array([10,11,12,13,14,15,16,17,18,19]);
  4273. *
  4274. * var inflate = new pako.Inflate({ level: 3});
  4275. *
  4276. * inflate.push(chunk1, false);
  4277. * inflate.push(chunk2, true); // true -> last chunk
  4278. *
  4279. * if (inflate.err) { throw new Error(inflate.err); }
  4280. *
  4281. * console.log(inflate.result);
  4282. * ```
  4283. **/
  4284. var Inflate = function(options) {
  4285. this.options = utils.assign({
  4286. chunkSize: 16384,
  4287. windowBits: 0,
  4288. to: ''
  4289. }, options || {});
  4290. var opt = this.options;
  4291. // Force window size for `raw` data, if not set directly,
  4292. // because we have no header for autodetect.
  4293. if (opt.raw && (opt.windowBits >= 0) && (opt.windowBits < 16)) {
  4294. opt.windowBits = -opt.windowBits;
  4295. if (opt.windowBits === 0) { opt.windowBits = -15; }
  4296. }
  4297. // If `windowBits` not defined (and mode not raw) - set autodetect flag for gzip/deflate
  4298. if ((opt.windowBits >= 0) && (opt.windowBits < 16) &&
  4299. !(options && options.windowBits)) {
  4300. opt.windowBits += 32;
  4301. }
  4302. // Gzip header has no info about windows size, we can do autodetect only
  4303. // for deflate. So, if window size not set, force it to max when gzip possible
  4304. if ((opt.windowBits > 15) && (opt.windowBits < 48)) {
  4305. // bit 3 (16) -> gzipped data
  4306. // bit 4 (32) -> autodetect gzip/deflate
  4307. if ((opt.windowBits & 15) === 0) {
  4308. opt.windowBits |= 15;
  4309. }
  4310. }
  4311. this.err = 0; // error code, if happens (0 = Z_OK)
  4312. this.msg = ''; // error message
  4313. this.ended = false; // used to avoid multiple onEnd() calls
  4314. this.chunks = []; // chunks of compressed data
  4315. this.strm = new zstream();
  4316. this.strm.avail_out = 0;
  4317. var status = zlib_inflate.inflateInit2(
  4318. this.strm,
  4319. opt.windowBits
  4320. );
  4321. if (status !== c.Z_OK) {
  4322. throw new Error(msg[status]);
  4323. }
  4324. this.header = new gzheader();
  4325. zlib_inflate.inflateGetHeader(this.strm, this.header);
  4326. };
  4327. /**
  4328. * Inflate#push(data[, mode]) -> Boolean
  4329. * - data (Uint8Array|Array|String): input data
  4330. * - mode (Number|Boolean): 0..6 for corresponding Z_NO_FLUSH..Z_TREE modes.
  4331. * See constants. Skipped or `false` means Z_NO_FLUSH, `true` meansh Z_FINISH.
  4332. *
  4333. * Sends input data to inflate pipe, generating [[Inflate#onData]] calls with
  4334. * new output chunks. Returns `true` on success. The last data block must have
  4335. * mode Z_FINISH (or `true`). That flush internal pending buffers and call
  4336. * [[Inflate#onEnd]].
  4337. *
  4338. * On fail call [[Inflate#onEnd]] with error code and return false.
  4339. *
  4340. * We strongly recommend to use `Uint8Array` on input for best speed (output
  4341. * format is detected automatically). Also, don't skip last param and always
  4342. * use the same type in your code (boolean or number). That will improve JS speed.
  4343. *
  4344. * For regular `Array`-s make sure all elements are [0..255].
  4345. *
  4346. * ##### Example
  4347. *
  4348. * ```javascript
  4349. * push(chunk, false); // push one of data chunks
  4350. * ...
  4351. * push(chunk, true); // push last chunk
  4352. * ```
  4353. **/
  4354. Inflate.prototype.push = function(data, mode) {
  4355. var strm = this.strm;
  4356. var chunkSize = this.options.chunkSize;
  4357. var status, _mode;
  4358. var next_out_utf8, tail, utf8str;
  4359. if (this.ended) { return false; }
  4360. _mode = (mode === ~~mode) ? mode : ((mode === true) ? c.Z_FINISH : c.Z_NO_FLUSH);
  4361. // Convert data if needed
  4362. if (typeof data === 'string') {
  4363. // Only binary strings can be decompressed on practice
  4364. strm.input = strings.binstring2buf(data);
  4365. } else {
  4366. strm.input = data;
  4367. }
  4368. strm.next_in = 0;
  4369. strm.avail_in = strm.input.length;
  4370. do {
  4371. if (strm.avail_out === 0) {
  4372. strm.output = new utils.Buf8(chunkSize);
  4373. strm.next_out = 0;
  4374. strm.avail_out = chunkSize;
  4375. }
  4376. status = zlib_inflate.inflate(strm, c.Z_NO_FLUSH); /* no bad return value */
  4377. if (status !== c.Z_STREAM_END && status !== c.Z_OK) {
  4378. this.onEnd(status);
  4379. this.ended = true;
  4380. return false;
  4381. }
  4382. if (strm.next_out) {
  4383. if (strm.avail_out === 0 || status === c.Z_STREAM_END || (strm.avail_in === 0 && _mode === c.Z_FINISH)) {
  4384. if (this.options.to === 'string') {
  4385. next_out_utf8 = strings.utf8border(strm.output, strm.next_out);
  4386. tail = strm.next_out - next_out_utf8;
  4387. utf8str = strings.buf2string(strm.output, next_out_utf8);
  4388. // move tail
  4389. strm.next_out = tail;
  4390. strm.avail_out = chunkSize - tail;
  4391. if (tail) { utils.arraySet(strm.output, strm.output, next_out_utf8, tail, 0); }
  4392. this.onData(utf8str);
  4393. } else {
  4394. this.onData(utils.shrinkBuf(strm.output, strm.next_out));
  4395. }
  4396. }
  4397. }
  4398. } while ((strm.avail_in > 0) && status !== c.Z_STREAM_END);
  4399. if (status === c.Z_STREAM_END) {
  4400. _mode = c.Z_FINISH;
  4401. }
  4402. // Finalize on the last chunk.
  4403. if (_mode === c.Z_FINISH) {
  4404. status = zlib_inflate.inflateEnd(this.strm);
  4405. this.onEnd(status);
  4406. this.ended = true;
  4407. return status === c.Z_OK;
  4408. }
  4409. return true;
  4410. };
  4411. /**
  4412. * Inflate#onData(chunk) -> Void
  4413. * - chunk (Uint8Array|Array|String): ouput data. Type of array depends
  4414. * on js engine support. When string output requested, each chunk
  4415. * will be string.
  4416. *
  4417. * By default, stores data blocks in `chunks[]` property and glue
  4418. * those in `onEnd`. Override this handler, if you need another behaviour.
  4419. **/
  4420. Inflate.prototype.onData = function(chunk) {
  4421. this.chunks.push(chunk);
  4422. };
  4423. /**
  4424. * Inflate#onEnd(status) -> Void
  4425. * - status (Number): inflate status. 0 (Z_OK) on success,
  4426. * other if not.
  4427. *
  4428. * Called once after you tell inflate that input stream complete
  4429. * or error happenned. By default - join collected chunks,
  4430. * free memory and fill `results` / `err` properties.
  4431. **/
  4432. Inflate.prototype.onEnd = function(status) {
  4433. // On success - join
  4434. if (status === c.Z_OK) {
  4435. if (this.options.to === 'string') {
  4436. // Glue & convert here, until we teach pako to send
  4437. // utf8 alligned strings to onData
  4438. this.result = this.chunks.join('');
  4439. } else {
  4440. this.result = utils.flattenChunks(this.chunks);
  4441. }
  4442. }
  4443. this.chunks = [];
  4444. this.err = status;
  4445. this.msg = this.strm.msg;
  4446. };
  4447. /**
  4448. * inflate(data[, options]) -> Uint8Array|Array|String
  4449. * - data (Uint8Array|Array|String): input data to decompress.
  4450. * - options (Object): zlib inflate options.
  4451. *
  4452. * Decompress `data` with inflate/ungzip and `options`. Autodetect
  4453. * format via wrapper header by default. That's why we don't provide
  4454. * separate `ungzip` method.
  4455. *
  4456. * Supported options are:
  4457. *
  4458. * - windowBits
  4459. *
  4460. * [http://zlib.net/manual.html#Advanced](http://zlib.net/manual.html#Advanced)
  4461. * for more information.
  4462. *
  4463. * Sugar (options):
  4464. *
  4465. * - `raw` (Boolean) - say that we work with raw stream, if you don't wish to specify
  4466. * negative windowBits implicitly.
  4467. * - `to` (String) - if equal to 'string', then result will be converted
  4468. * from utf8 to utf16 (javascript) string. When string output requested,
  4469. * chunk length can differ from `chunkSize`, depending on content.
  4470. *
  4471. *
  4472. * ##### Example:
  4473. *
  4474. * ```javascript
  4475. * var pako = require('pako')
  4476. * , input = pako.deflate([1,2,3,4,5,6,7,8,9])
  4477. * , output;
  4478. *
  4479. * try {
  4480. * output = pako.inflate(input);
  4481. * } catch (err)
  4482. * console.log(err);
  4483. * }
  4484. * ```
  4485. **/
  4486. function inflate(input, options) {
  4487. var inflator = new Inflate(options);
  4488. inflator.push(input, true);
  4489. // That will never happens, if you don't cheat with options :)
  4490. if (inflator.err) { throw inflator.msg; }
  4491. return inflator.result;
  4492. }
  4493. /**
  4494. * inflateRaw(data[, options]) -> Uint8Array|Array|String
  4495. * - data (Uint8Array|Array|String): input data to decompress.
  4496. * - options (Object): zlib inflate options.
  4497. *
  4498. * The same as [[inflate]], but creates raw data, without wrapper
  4499. * (header and adler32 crc).
  4500. **/
  4501. function inflateRaw(input, options) {
  4502. options = options || {};
  4503. options.raw = true;
  4504. return inflate(input, options);
  4505. }
  4506. /**
  4507. * ungzip(data[, options]) -> Uint8Array|Array|String
  4508. * - data (Uint8Array|Array|String): input data to decompress.
  4509. * - options (Object): zlib inflate options.
  4510. *
  4511. * Just shortcut to [[inflate]], because it autodetects format
  4512. * by header.content. Done for convenience.
  4513. **/
  4514. exports.Inflate = Inflate;
  4515. exports.inflate = inflate;
  4516. exports.inflateRaw = inflateRaw;
  4517. exports.ungzip = inflate;
  4518. },{"./utils/common":27,"./utils/strings":28,"./zlib/constants":30,"./zlib/gzheader":33,"./zlib/inflate.js":35,"./zlib/messages":37,"./zlib/zstream":39}],27:[function(_dereq_,module,exports){
  4519. 'use strict';
  4520. var TYPED_OK = (typeof Uint8Array !== 'undefined') &&
  4521. (typeof Uint16Array !== 'undefined') &&
  4522. (typeof Int32Array !== 'undefined');
  4523. exports.assign = function (obj /*from1, from2, from3, ...*/) {
  4524. var sources = Array.prototype.slice.call(arguments, 1);
  4525. while (sources.length) {
  4526. var source = sources.shift();
  4527. if (!source) { continue; }
  4528. if (typeof(source) !== 'object') {
  4529. throw new TypeError(source + 'must be non-object');
  4530. }
  4531. for (var p in source) {
  4532. if (source.hasOwnProperty(p)) {
  4533. obj[p] = source[p];
  4534. }
  4535. }
  4536. }
  4537. return obj;
  4538. };
  4539. // reduce buffer size, avoiding mem copy
  4540. exports.shrinkBuf = function (buf, size) {
  4541. if (buf.length === size) { return buf; }
  4542. if (buf.subarray) { return buf.subarray(0, size); }
  4543. buf.length = size;
  4544. return buf;
  4545. };
  4546. var fnTyped = {
  4547. arraySet: function (dest, src, src_offs, len, dest_offs) {
  4548. if (src.subarray && dest.subarray) {
  4549. dest.set(src.subarray(src_offs, src_offs+len), dest_offs);
  4550. return;
  4551. }
  4552. // Fallback to ordinary array
  4553. for(var i=0; i<len; i++) {
  4554. dest[dest_offs + i] = src[src_offs + i];
  4555. }
  4556. },
  4557. // Join array of chunks to single array.
  4558. flattenChunks: function(chunks) {
  4559. var i, l, len, pos, chunk, result;
  4560. // calculate data length
  4561. len = 0;
  4562. for (i=0, l=chunks.length; i<l; i++) {
  4563. len += chunks[i].length;
  4564. }
  4565. // join chunks
  4566. result = new Uint8Array(len);
  4567. pos = 0;
  4568. for (i=0, l=chunks.length; i<l; i++) {
  4569. chunk = chunks[i];
  4570. result.set(chunk, pos);
  4571. pos += chunk.length;
  4572. }
  4573. return result;
  4574. }
  4575. };
  4576. var fnUntyped = {
  4577. arraySet: function (dest, src, src_offs, len, dest_offs) {
  4578. for(var i=0; i<len; i++) {
  4579. dest[dest_offs + i] = src[src_offs + i];
  4580. }
  4581. },
  4582. // Join array of chunks to single array.
  4583. flattenChunks: function(chunks) {
  4584. return [].concat.apply([], chunks);
  4585. }
  4586. };
  4587. // Enable/Disable typed arrays use, for testing
  4588. //
  4589. exports.setTyped = function (on) {
  4590. if (on) {
  4591. exports.Buf8 = Uint8Array;
  4592. exports.Buf16 = Uint16Array;
  4593. exports.Buf32 = Int32Array;
  4594. exports.assign(exports, fnTyped);
  4595. } else {
  4596. exports.Buf8 = Array;
  4597. exports.Buf16 = Array;
  4598. exports.Buf32 = Array;
  4599. exports.assign(exports, fnUntyped);
  4600. }
  4601. };
  4602. exports.setTyped(TYPED_OK);
  4603. },{}],28:[function(_dereq_,module,exports){
  4604. // String encode/decode helpers
  4605. 'use strict';
  4606. var utils = _dereq_('./common');
  4607. // Quick check if we can use fast array to bin string conversion
  4608. //
  4609. // - apply(Array) can fail on Android 2.2
  4610. // - apply(Uint8Array) can fail on iOS 5.1 Safary
  4611. //
  4612. var STR_APPLY_OK = true;
  4613. var STR_APPLY_UIA_OK = true;
  4614. try { String.fromCharCode.apply(null, [0]); } catch(__) { STR_APPLY_OK = false; }
  4615. try { String.fromCharCode.apply(null, new Uint8Array(1)); } catch(__) { STR_APPLY_UIA_OK = false; }
  4616. // Table with utf8 lengths (calculated by first byte of sequence)
  4617. // Note, that 5 & 6-byte values and some 4-byte values can not be represented in JS,
  4618. // because max possible codepoint is 0x10ffff
  4619. var _utf8len = new utils.Buf8(256);
  4620. for (var i=0; i<256; i++) {
  4621. _utf8len[i] = (i >= 252 ? 6 : i >= 248 ? 5 : i >= 240 ? 4 : i >= 224 ? 3 : i >= 192 ? 2 : 1);
  4622. }
  4623. _utf8len[254]=_utf8len[254]=1; // Invalid sequence start
  4624. // convert string to array (typed, when possible)
  4625. exports.string2buf = function (str) {
  4626. var buf, c, c2, m_pos, i, str_len = str.length, buf_len = 0;
  4627. // count binary size
  4628. for (m_pos = 0; m_pos < str_len; m_pos++) {
  4629. c = str.charCodeAt(m_pos);
  4630. if ((c & 0xfc00) === 0xd800 && (m_pos+1 < str_len)) {
  4631. c2 = str.charCodeAt(m_pos+1);
  4632. if ((c2 & 0xfc00) === 0xdc00) {
  4633. c = 0x10000 + ((c - 0xd800) << 10) + (c2 - 0xdc00);
  4634. m_pos++;
  4635. }
  4636. }
  4637. buf_len += c < 0x80 ? 1 : c < 0x800 ? 2 : c < 0x10000 ? 3 : 4;
  4638. }
  4639. // allocate buffer
  4640. buf = new utils.Buf8(buf_len);
  4641. // convert
  4642. for (i=0, m_pos = 0; i < buf_len; m_pos++) {
  4643. c = str.charCodeAt(m_pos);
  4644. if ((c & 0xfc00) === 0xd800 && (m_pos+1 < str_len)) {
  4645. c2 = str.charCodeAt(m_pos+1);
  4646. if ((c2 & 0xfc00) === 0xdc00) {
  4647. c = 0x10000 + ((c - 0xd800) << 10) + (c2 - 0xdc00);
  4648. m_pos++;
  4649. }
  4650. }
  4651. if (c < 0x80) {
  4652. /* one byte */
  4653. buf[i++] = c;
  4654. } else if (c < 0x800) {
  4655. /* two bytes */
  4656. buf[i++] = 0xC0 | (c >>> 6);
  4657. buf[i++] = 0x80 | (c & 0x3f);
  4658. } else if (c < 0x10000) {
  4659. /* three bytes */
  4660. buf[i++] = 0xE0 | (c >>> 12);
  4661. buf[i++] = 0x80 | (c >>> 6 & 0x3f);
  4662. buf[i++] = 0x80 | (c & 0x3f);
  4663. } else {
  4664. /* four bytes */
  4665. buf[i++] = 0xf0 | (c >>> 18);
  4666. buf[i++] = 0x80 | (c >>> 12 & 0x3f);
  4667. buf[i++] = 0x80 | (c >>> 6 & 0x3f);
  4668. buf[i++] = 0x80 | (c & 0x3f);
  4669. }
  4670. }
  4671. return buf;
  4672. };
  4673. // Helper (used in 2 places)
  4674. function buf2binstring(buf, len) {
  4675. // use fallback for big arrays to avoid stack overflow
  4676. if (len < 65537) {
  4677. if ((buf.subarray && STR_APPLY_UIA_OK) || (!buf.subarray && STR_APPLY_OK)) {
  4678. return String.fromCharCode.apply(null, utils.shrinkBuf(buf, len));
  4679. }
  4680. }
  4681. var result = '';
  4682. for(var i=0; i < len; i++) {
  4683. result += String.fromCharCode(buf[i]);
  4684. }
  4685. return result;
  4686. }
  4687. // Convert byte array to binary string
  4688. exports.buf2binstring = function(buf) {
  4689. return buf2binstring(buf, buf.length);
  4690. };
  4691. // Convert binary string (typed, when possible)
  4692. exports.binstring2buf = function(str) {
  4693. var buf = new utils.Buf8(str.length);
  4694. for(var i=0, len=buf.length; i < len; i++) {
  4695. buf[i] = str.charCodeAt(i);
  4696. }
  4697. return buf;
  4698. };
  4699. // convert array to string
  4700. exports.buf2string = function (buf, max) {
  4701. var i, out, c, c_len;
  4702. var len = max || buf.length;
  4703. // Reserve max possible length (2 words per char)
  4704. // NB: by unknown reasons, Array is significantly faster for
  4705. // String.fromCharCode.apply than Uint16Array.
  4706. var utf16buf = new Array(len*2);
  4707. for (out=0, i=0; i<len;) {
  4708. c = buf[i++];
  4709. // quick process ascii
  4710. if (c < 0x80) { utf16buf[out++] = c; continue; }
  4711. c_len = _utf8len[c];
  4712. // skip 5 & 6 byte codes
  4713. if (c_len > 4) { utf16buf[out++] = 0xfffd; i += c_len-1; continue; }
  4714. // apply mask on first byte
  4715. c &= c_len === 2 ? 0x1f : c_len === 3 ? 0x0f : 0x07;
  4716. // join the rest
  4717. while (c_len > 1 && i < len) {
  4718. c = (c << 6) | (buf[i++] & 0x3f);
  4719. c_len--;
  4720. }
  4721. // terminated by end of string?
  4722. if (c_len > 1) { utf16buf[out++] = 0xfffd; continue; }
  4723. if (c < 0x10000) {
  4724. utf16buf[out++] = c;
  4725. } else {
  4726. c -= 0x10000;
  4727. utf16buf[out++] = 0xd800 | ((c >> 10) & 0x3ff);
  4728. utf16buf[out++] = 0xdc00 | (c & 0x3ff);
  4729. }
  4730. }
  4731. return buf2binstring(utf16buf, out);
  4732. };
  4733. // Calculate max possible position in utf8 buffer,
  4734. // that will not break sequence. If that's not possible
  4735. // - (very small limits) return max size as is.
  4736. //
  4737. // buf[] - utf8 bytes array
  4738. // max - length limit (mandatory);
  4739. exports.utf8border = function(buf, max) {
  4740. var pos;
  4741. max = max || buf.length;
  4742. if (max > buf.length) { max = buf.length; }
  4743. // go back from last position, until start of sequence found
  4744. pos = max-1;
  4745. while (pos >= 0 && (buf[pos] & 0xC0) === 0x80) { pos--; }
  4746. // Fuckup - very small and broken sequence,
  4747. // return max, because we should return something anyway.
  4748. if (pos < 0) { return max; }
  4749. // If we came to start of buffer - that means vuffer is too small,
  4750. // return max too.
  4751. if (pos === 0) { return max; }
  4752. return (pos + _utf8len[buf[pos]] > max) ? pos : max;
  4753. };
  4754. },{"./common":27}],29:[function(_dereq_,module,exports){
  4755. 'use strict';
  4756. // Note: adler32 takes 12% for level 0 and 2% for level 6.
  4757. // It doesn't worth to make additional optimizationa as in original.
  4758. // Small size is preferable.
  4759. function adler32(adler, buf, len, pos) {
  4760. var s1 = (adler & 0xffff) |0
  4761. , s2 = ((adler >>> 16) & 0xffff) |0
  4762. , n = 0;
  4763. while (len !== 0) {
  4764. // Set limit ~ twice less than 5552, to keep
  4765. // s2 in 31-bits, because we force signed ints.
  4766. // in other case %= will fail.
  4767. n = len > 2000 ? 2000 : len;
  4768. len -= n;
  4769. do {
  4770. s1 = (s1 + buf[pos++]) |0;
  4771. s2 = (s2 + s1) |0;
  4772. } while (--n);
  4773. s1 %= 65521;
  4774. s2 %= 65521;
  4775. }
  4776. return (s1 | (s2 << 16)) |0;
  4777. }
  4778. module.exports = adler32;
  4779. },{}],30:[function(_dereq_,module,exports){
  4780. module.exports = {
  4781. /* Allowed flush values; see deflate() and inflate() below for details */
  4782. Z_NO_FLUSH: 0,
  4783. Z_PARTIAL_FLUSH: 1,
  4784. Z_SYNC_FLUSH: 2,
  4785. Z_FULL_FLUSH: 3,
  4786. Z_FINISH: 4,
  4787. Z_BLOCK: 5,
  4788. Z_TREES: 6,
  4789. /* Return codes for the compression/decompression functions. Negative values
  4790. * are errors, positive values are used for special but normal events.
  4791. */
  4792. Z_OK: 0,
  4793. Z_STREAM_END: 1,
  4794. Z_NEED_DICT: 2,
  4795. Z_ERRNO: -1,
  4796. Z_STREAM_ERROR: -2,
  4797. Z_DATA_ERROR: -3,
  4798. //Z_MEM_ERROR: -4,
  4799. Z_BUF_ERROR: -5,
  4800. //Z_VERSION_ERROR: -6,
  4801. /* compression levels */
  4802. Z_NO_COMPRESSION: 0,
  4803. Z_BEST_SPEED: 1,
  4804. Z_BEST_COMPRESSION: 9,
  4805. Z_DEFAULT_COMPRESSION: -1,
  4806. Z_FILTERED: 1,
  4807. Z_HUFFMAN_ONLY: 2,
  4808. Z_RLE: 3,
  4809. Z_FIXED: 4,
  4810. Z_DEFAULT_STRATEGY: 0,
  4811. /* Possible values of the data_type field (though see inflate()) */
  4812. Z_BINARY: 0,
  4813. Z_TEXT: 1,
  4814. //Z_ASCII: 1, // = Z_TEXT (deprecated)
  4815. Z_UNKNOWN: 2,
  4816. /* The deflate compression method */
  4817. Z_DEFLATED: 8
  4818. //Z_NULL: null // Use -1 or null inline, depending on var type
  4819. };
  4820. },{}],31:[function(_dereq_,module,exports){
  4821. 'use strict';
  4822. // Note: we can't get significant speed boost here.
  4823. // So write code to minimize size - no pregenerated tables
  4824. // and array tools dependencies.
  4825. // Use ordinary array, since untyped makes no boost here
  4826. function makeTable() {
  4827. var c, table = [];
  4828. for(var n =0; n < 256; n++){
  4829. c = n;
  4830. for(var k =0; k < 8; k++){
  4831. c = ((c&1) ? (0xEDB88320 ^ (c >>> 1)) : (c >>> 1));
  4832. }
  4833. table[n] = c;
  4834. }
  4835. return table;
  4836. }
  4837. // Create table on load. Just 255 signed longs. Not a problem.
  4838. var crcTable = makeTable();
  4839. function crc32(crc, buf, len, pos) {
  4840. var t = crcTable
  4841. , end = pos + len;
  4842. crc = crc ^ (-1);
  4843. for (var i = pos; i < end; i++ ) {
  4844. crc = (crc >>> 8) ^ t[(crc ^ buf[i]) & 0xFF];
  4845. }
  4846. return (crc ^ (-1)); // >>> 0;
  4847. }
  4848. module.exports = crc32;
  4849. },{}],32:[function(_dereq_,module,exports){
  4850. 'use strict';
  4851. var utils = _dereq_('../utils/common');
  4852. var trees = _dereq_('./trees');
  4853. var adler32 = _dereq_('./adler32');
  4854. var crc32 = _dereq_('./crc32');
  4855. var msg = _dereq_('./messages');
  4856. /* Public constants ==========================================================*/
  4857. /* ===========================================================================*/
  4858. /* Allowed flush values; see deflate() and inflate() below for details */
  4859. var Z_NO_FLUSH = 0;
  4860. var Z_PARTIAL_FLUSH = 1;
  4861. //var Z_SYNC_FLUSH = 2;
  4862. var Z_FULL_FLUSH = 3;
  4863. var Z_FINISH = 4;
  4864. var Z_BLOCK = 5;
  4865. //var Z_TREES = 6;
  4866. /* Return codes for the compression/decompression functions. Negative values
  4867. * are errors, positive values are used for special but normal events.
  4868. */
  4869. var Z_OK = 0;
  4870. var Z_STREAM_END = 1;
  4871. //var Z_NEED_DICT = 2;
  4872. //var Z_ERRNO = -1;
  4873. var Z_STREAM_ERROR = -2;
  4874. var Z_DATA_ERROR = -3;
  4875. //var Z_MEM_ERROR = -4;
  4876. var Z_BUF_ERROR = -5;
  4877. //var Z_VERSION_ERROR = -6;
  4878. /* compression levels */
  4879. //var Z_NO_COMPRESSION = 0;
  4880. //var Z_BEST_SPEED = 1;
  4881. //var Z_BEST_COMPRESSION = 9;
  4882. var Z_DEFAULT_COMPRESSION = -1;
  4883. var Z_FILTERED = 1;
  4884. var Z_HUFFMAN_ONLY = 2;
  4885. var Z_RLE = 3;
  4886. var Z_FIXED = 4;
  4887. var Z_DEFAULT_STRATEGY = 0;
  4888. /* Possible values of the data_type field (though see inflate()) */
  4889. //var Z_BINARY = 0;
  4890. //var Z_TEXT = 1;
  4891. //var Z_ASCII = 1; // = Z_TEXT
  4892. var Z_UNKNOWN = 2;
  4893. /* The deflate compression method */
  4894. var Z_DEFLATED = 8;
  4895. /*============================================================================*/
  4896. var MAX_MEM_LEVEL = 9;
  4897. /* Maximum value for memLevel in deflateInit2 */
  4898. var MAX_WBITS = 15;
  4899. /* 32K LZ77 window */
  4900. var DEF_MEM_LEVEL = 8;
  4901. var LENGTH_CODES = 29;
  4902. /* number of length codes, not counting the special END_BLOCK code */
  4903. var LITERALS = 256;
  4904. /* number of literal bytes 0..255 */
  4905. var L_CODES = LITERALS + 1 + LENGTH_CODES;
  4906. /* number of Literal or Length codes, including the END_BLOCK code */
  4907. var D_CODES = 30;
  4908. /* number of distance codes */
  4909. var BL_CODES = 19;
  4910. /* number of codes used to transfer the bit lengths */
  4911. var HEAP_SIZE = 2*L_CODES + 1;
  4912. /* maximum heap size */
  4913. var MAX_BITS = 15;
  4914. /* All codes must not exceed MAX_BITS bits */
  4915. var MIN_MATCH = 3;
  4916. var MAX_MATCH = 258;
  4917. var MIN_LOOKAHEAD = (MAX_MATCH + MIN_MATCH + 1);
  4918. var PRESET_DICT = 0x20;
  4919. var INIT_STATE = 42;
  4920. var EXTRA_STATE = 69;
  4921. var NAME_STATE = 73;
  4922. var COMMENT_STATE = 91;
  4923. var HCRC_STATE = 103;
  4924. var BUSY_STATE = 113;
  4925. var FINISH_STATE = 666;
  4926. var BS_NEED_MORE = 1; /* block not completed, need more input or more output */
  4927. var BS_BLOCK_DONE = 2; /* block flush performed */
  4928. var BS_FINISH_STARTED = 3; /* finish started, need only more output at next deflate */
  4929. var BS_FINISH_DONE = 4; /* finish done, accept no more input or output */
  4930. var OS_CODE = 0x03; // Unix :) . Don't detect, use this default.
  4931. function err(strm, errorCode) {
  4932. strm.msg = msg[errorCode];
  4933. return errorCode;
  4934. }
  4935. function rank(f) {
  4936. return ((f) << 1) - ((f) > 4 ? 9 : 0);
  4937. }
  4938. function zero(buf) { var len = buf.length; while (--len >= 0) { buf[len] = 0; } }
  4939. /* =========================================================================
  4940. * Flush as much pending output as possible. All deflate() output goes
  4941. * through this function so some applications may wish to modify it
  4942. * to avoid allocating a large strm->output buffer and copying into it.
  4943. * (See also read_buf()).
  4944. */
  4945. function flush_pending(strm) {
  4946. var s = strm.state;
  4947. //_tr_flush_bits(s);
  4948. var len = s.pending;
  4949. if (len > strm.avail_out) {
  4950. len = strm.avail_out;
  4951. }
  4952. if (len === 0) { return; }
  4953. utils.arraySet(strm.output, s.pending_buf, s.pending_out, len, strm.next_out);
  4954. strm.next_out += len;
  4955. s.pending_out += len;
  4956. strm.total_out += len;
  4957. strm.avail_out -= len;
  4958. s.pending -= len;
  4959. if (s.pending === 0) {
  4960. s.pending_out = 0;
  4961. }
  4962. }
  4963. function flush_block_only (s, last) {
  4964. trees._tr_flush_block(s, (s.block_start >= 0 ? s.block_start : -1), s.strstart - s.block_start, last);
  4965. s.block_start = s.strstart;
  4966. flush_pending(s.strm);
  4967. }
  4968. function put_byte(s, b) {
  4969. s.pending_buf[s.pending++] = b;
  4970. }
  4971. /* =========================================================================
  4972. * Put a short in the pending buffer. The 16-bit value is put in MSB order.
  4973. * IN assertion: the stream state is correct and there is enough room in
  4974. * pending_buf.
  4975. */
  4976. function putShortMSB(s, b) {
  4977. // put_byte(s, (Byte)(b >> 8));
  4978. // put_byte(s, (Byte)(b & 0xff));
  4979. s.pending_buf[s.pending++] = (b >>> 8) & 0xff;
  4980. s.pending_buf[s.pending++] = b & 0xff;
  4981. }
  4982. /* ===========================================================================
  4983. * Read a new buffer from the current input stream, update the adler32
  4984. * and total number of bytes read. All deflate() input goes through
  4985. * this function so some applications may wish to modify it to avoid
  4986. * allocating a large strm->input buffer and copying from it.
  4987. * (See also flush_pending()).
  4988. */
  4989. function read_buf(strm, buf, start, size) {
  4990. var len = strm.avail_in;
  4991. if (len > size) { len = size; }
  4992. if (len === 0) { return 0; }
  4993. strm.avail_in -= len;
  4994. utils.arraySet(buf, strm.input, strm.next_in, len, start);
  4995. if (strm.state.wrap === 1) {
  4996. strm.adler = adler32(strm.adler, buf, len, start);
  4997. }
  4998. else if (strm.state.wrap === 2) {
  4999. strm.adler = crc32(strm.adler, buf, len, start);
  5000. }
  5001. strm.next_in += len;
  5002. strm.total_in += len;
  5003. return len;
  5004. }
  5005. /* ===========================================================================
  5006. * Set match_start to the longest match starting at the given string and
  5007. * return its length. Matches shorter or equal to prev_length are discarded,
  5008. * in which case the result is equal to prev_length and match_start is
  5009. * garbage.
  5010. * IN assertions: cur_match is the head of the hash chain for the current
  5011. * string (strstart) and its distance is <= MAX_DIST, and prev_length >= 1
  5012. * OUT assertion: the match length is not greater than s->lookahead.
  5013. */
  5014. function longest_match(s, cur_match) {
  5015. var chain_length = s.max_chain_length; /* max hash chain length */
  5016. var scan = s.strstart; /* current string */
  5017. var match; /* matched string */
  5018. var len; /* length of current match */
  5019. var best_len = s.prev_length; /* best match length so far */
  5020. var nice_match = s.nice_match; /* stop if match long enough */
  5021. var limit = (s.strstart > (s.w_size - MIN_LOOKAHEAD)) ?
  5022. s.strstart - (s.w_size - MIN_LOOKAHEAD) : 0/*NIL*/;
  5023. var _win = s.window; // shortcut
  5024. var wmask = s.w_mask;
  5025. var prev = s.prev;
  5026. /* Stop when cur_match becomes <= limit. To simplify the code,
  5027. * we prevent matches with the string of window index 0.
  5028. */
  5029. var strend = s.strstart + MAX_MATCH;
  5030. var scan_end1 = _win[scan + best_len - 1];
  5031. var scan_end = _win[scan + best_len];
  5032. /* The code is optimized for HASH_BITS >= 8 and MAX_MATCH-2 multiple of 16.
  5033. * It is easy to get rid of this optimization if necessary.
  5034. */
  5035. // Assert(s->hash_bits >= 8 && MAX_MATCH == 258, "Code too clever");
  5036. /* Do not waste too much time if we already have a good match: */
  5037. if (s.prev_length >= s.good_match) {
  5038. chain_length >>= 2;
  5039. }
  5040. /* Do not look for matches beyond the end of the input. This is necessary
  5041. * to make deflate deterministic.
  5042. */
  5043. if (nice_match > s.lookahead) { nice_match = s.lookahead; }
  5044. // Assert((ulg)s->strstart <= s->window_size-MIN_LOOKAHEAD, "need lookahead");
  5045. do {
  5046. // Assert(cur_match < s->strstart, "no future");
  5047. match = cur_match;
  5048. /* Skip to next match if the match length cannot increase
  5049. * or if the match length is less than 2. Note that the checks below
  5050. * for insufficient lookahead only occur occasionally for performance
  5051. * reasons. Therefore uninitialized memory will be accessed, and
  5052. * conditional jumps will be made that depend on those values.
  5053. * However the length of the match is limited to the lookahead, so
  5054. * the output of deflate is not affected by the uninitialized values.
  5055. */
  5056. if (_win[match + best_len] !== scan_end ||
  5057. _win[match + best_len - 1] !== scan_end1 ||
  5058. _win[match] !== _win[scan] ||
  5059. _win[++match] !== _win[scan + 1]) {
  5060. continue;
  5061. }
  5062. /* The check at best_len-1 can be removed because it will be made
  5063. * again later. (This heuristic is not always a win.)
  5064. * It is not necessary to compare scan[2] and match[2] since they
  5065. * are always equal when the other bytes match, given that
  5066. * the hash keys are equal and that HASH_BITS >= 8.
  5067. */
  5068. scan += 2;
  5069. match++;
  5070. // Assert(*scan == *match, "match[2]?");
  5071. /* We check for insufficient lookahead only every 8th comparison;
  5072. * the 256th check will be made at strstart+258.
  5073. */
  5074. do {
  5075. /*jshint noempty:false*/
  5076. } while (_win[++scan] === _win[++match] && _win[++scan] === _win[++match] &&
  5077. _win[++scan] === _win[++match] && _win[++scan] === _win[++match] &&
  5078. _win[++scan] === _win[++match] && _win[++scan] === _win[++match] &&
  5079. _win[++scan] === _win[++match] && _win[++scan] === _win[++match] &&
  5080. scan < strend);
  5081. // Assert(scan <= s->window+(unsigned)(s->window_size-1), "wild scan");
  5082. len = MAX_MATCH - (strend - scan);
  5083. scan = strend - MAX_MATCH;
  5084. if (len > best_len) {
  5085. s.match_start = cur_match;
  5086. best_len = len;
  5087. if (len >= nice_match) {
  5088. break;
  5089. }
  5090. scan_end1 = _win[scan + best_len - 1];
  5091. scan_end = _win[scan + best_len];
  5092. }
  5093. } while ((cur_match = prev[cur_match & wmask]) > limit && --chain_length !== 0);
  5094. if (best_len <= s.lookahead) {
  5095. return best_len;
  5096. }
  5097. return s.lookahead;
  5098. }
  5099. /* ===========================================================================
  5100. * Fill the window when the lookahead becomes insufficient.
  5101. * Updates strstart and lookahead.
  5102. *
  5103. * IN assertion: lookahead < MIN_LOOKAHEAD
  5104. * OUT assertions: strstart <= window_size-MIN_LOOKAHEAD
  5105. * At least one byte has been read, or avail_in == 0; reads are
  5106. * performed for at least two bytes (required for the zip translate_eol
  5107. * option -- not supported here).
  5108. */
  5109. function fill_window(s) {
  5110. var _w_size = s.w_size;
  5111. var p, n, m, more, str;
  5112. //Assert(s->lookahead < MIN_LOOKAHEAD, "already enough lookahead");
  5113. do {
  5114. more = s.window_size - s.lookahead - s.strstart;
  5115. // JS ints have 32 bit, block below not needed
  5116. /* Deal with !@#$% 64K limit: */
  5117. //if (sizeof(int) <= 2) {
  5118. // if (more == 0 && s->strstart == 0 && s->lookahead == 0) {
  5119. // more = wsize;
  5120. //
  5121. // } else if (more == (unsigned)(-1)) {
  5122. // /* Very unlikely, but possible on 16 bit machine if
  5123. // * strstart == 0 && lookahead == 1 (input done a byte at time)
  5124. // */
  5125. // more--;
  5126. // }
  5127. //}
  5128. /* If the window is almost full and there is insufficient lookahead,
  5129. * move the upper half to the lower one to make room in the upper half.
  5130. */
  5131. if (s.strstart >= _w_size + (_w_size - MIN_LOOKAHEAD)) {
  5132. utils.arraySet(s.window, s.window, _w_size, _w_size, 0);
  5133. s.match_start -= _w_size;
  5134. s.strstart -= _w_size;
  5135. /* we now have strstart >= MAX_DIST */
  5136. s.block_start -= _w_size;
  5137. /* Slide the hash table (could be avoided with 32 bit values
  5138. at the expense of memory usage). We slide even when level == 0
  5139. to keep the hash table consistent if we switch back to level > 0
  5140. later. (Using level 0 permanently is not an optimal usage of
  5141. zlib, so we don't care about this pathological case.)
  5142. */
  5143. n = s.hash_size;
  5144. p = n;
  5145. do {
  5146. m = s.head[--p];
  5147. s.head[p] = (m >= _w_size ? m - _w_size : 0);
  5148. } while (--n);
  5149. n = _w_size;
  5150. p = n;
  5151. do {
  5152. m = s.prev[--p];
  5153. s.prev[p] = (m >= _w_size ? m - _w_size : 0);
  5154. /* If n is not on any hash chain, prev[n] is garbage but
  5155. * its value will never be used.
  5156. */
  5157. } while (--n);
  5158. more += _w_size;
  5159. }
  5160. if (s.strm.avail_in === 0) {
  5161. break;
  5162. }
  5163. /* If there was no sliding:
  5164. * strstart <= WSIZE+MAX_DIST-1 && lookahead <= MIN_LOOKAHEAD - 1 &&
  5165. * more == window_size - lookahead - strstart
  5166. * => more >= window_size - (MIN_LOOKAHEAD-1 + WSIZE + MAX_DIST-1)
  5167. * => more >= window_size - 2*WSIZE + 2
  5168. * In the BIG_MEM or MMAP case (not yet supported),
  5169. * window_size == input_size + MIN_LOOKAHEAD &&
  5170. * strstart + s->lookahead <= input_size => more >= MIN_LOOKAHEAD.
  5171. * Otherwise, window_size == 2*WSIZE so more >= 2.
  5172. * If there was sliding, more >= WSIZE. So in all cases, more >= 2.
  5173. */
  5174. //Assert(more >= 2, "more < 2");
  5175. n = read_buf(s.strm, s.window, s.strstart + s.lookahead, more);
  5176. s.lookahead += n;
  5177. /* Initialize the hash value now that we have some input: */
  5178. if (s.lookahead + s.insert >= MIN_MATCH) {
  5179. str = s.strstart - s.insert;
  5180. s.ins_h = s.window[str];
  5181. /* UPDATE_HASH(s, s->ins_h, s->window[str + 1]); */
  5182. s.ins_h = ((s.ins_h << s.hash_shift) ^ s.window[str + 1]) & s.hash_mask;
  5183. //#if MIN_MATCH != 3
  5184. // Call update_hash() MIN_MATCH-3 more times
  5185. //#endif
  5186. while (s.insert) {
  5187. /* UPDATE_HASH(s, s->ins_h, s->window[str + MIN_MATCH-1]); */
  5188. s.ins_h = ((s.ins_h << s.hash_shift) ^ s.window[str + MIN_MATCH-1]) & s.hash_mask;
  5189. s.prev[str & s.w_mask] = s.head[s.ins_h];
  5190. s.head[s.ins_h] = str;
  5191. str++;
  5192. s.insert--;
  5193. if (s.lookahead + s.insert < MIN_MATCH) {
  5194. break;
  5195. }
  5196. }
  5197. }
  5198. /* If the whole input has less than MIN_MATCH bytes, ins_h is garbage,
  5199. * but this is not important since only literal bytes will be emitted.
  5200. */
  5201. } while (s.lookahead < MIN_LOOKAHEAD && s.strm.avail_in !== 0);
  5202. /* If the WIN_INIT bytes after the end of the current data have never been
  5203. * written, then zero those bytes in order to avoid memory check reports of
  5204. * the use of uninitialized (or uninitialised as Julian writes) bytes by
  5205. * the longest match routines. Update the high water mark for the next
  5206. * time through here. WIN_INIT is set to MAX_MATCH since the longest match
  5207. * routines allow scanning to strstart + MAX_MATCH, ignoring lookahead.
  5208. */
  5209. // if (s.high_water < s.window_size) {
  5210. // var curr = s.strstart + s.lookahead;
  5211. // var init = 0;
  5212. //
  5213. // if (s.high_water < curr) {
  5214. // /* Previous high water mark below current data -- zero WIN_INIT
  5215. // * bytes or up to end of window, whichever is less.
  5216. // */
  5217. // init = s.window_size - curr;
  5218. // if (init > WIN_INIT)
  5219. // init = WIN_INIT;
  5220. // zmemzero(s->window + curr, (unsigned)init);
  5221. // s->high_water = curr + init;
  5222. // }
  5223. // else if (s->high_water < (ulg)curr + WIN_INIT) {
  5224. // /* High water mark at or above current data, but below current data
  5225. // * plus WIN_INIT -- zero out to current data plus WIN_INIT, or up
  5226. // * to end of window, whichever is less.
  5227. // */
  5228. // init = (ulg)curr + WIN_INIT - s->high_water;
  5229. // if (init > s->window_size - s->high_water)
  5230. // init = s->window_size - s->high_water;
  5231. // zmemzero(s->window + s->high_water, (unsigned)init);
  5232. // s->high_water += init;
  5233. // }
  5234. // }
  5235. //
  5236. // Assert((ulg)s->strstart <= s->window_size - MIN_LOOKAHEAD,
  5237. // "not enough room for search");
  5238. }
  5239. /* ===========================================================================
  5240. * Copy without compression as much as possible from the input stream, return
  5241. * the current block state.
  5242. * This function does not insert new strings in the dictionary since
  5243. * uncompressible data is probably not useful. This function is used
  5244. * only for the level=0 compression option.
  5245. * NOTE: this function should be optimized to avoid extra copying from
  5246. * window to pending_buf.
  5247. */
  5248. function deflate_stored(s, flush) {
  5249. /* Stored blocks are limited to 0xffff bytes, pending_buf is limited
  5250. * to pending_buf_size, and each stored block has a 5 byte header:
  5251. */
  5252. var max_block_size = 0xffff;
  5253. if (max_block_size > s.pending_buf_size - 5) {
  5254. max_block_size = s.pending_buf_size - 5;
  5255. }
  5256. /* Copy as much as possible from input to output: */
  5257. for (;;) {
  5258. /* Fill the window as much as possible: */
  5259. if (s.lookahead <= 1) {
  5260. //Assert(s->strstart < s->w_size+MAX_DIST(s) ||
  5261. // s->block_start >= (long)s->w_size, "slide too late");
  5262. // if (!(s.strstart < s.w_size + (s.w_size - MIN_LOOKAHEAD) ||
  5263. // s.block_start >= s.w_size)) {
  5264. // throw new Error("slide too late");
  5265. // }
  5266. fill_window(s);
  5267. if (s.lookahead === 0 && flush === Z_NO_FLUSH) {
  5268. return BS_NEED_MORE;
  5269. }
  5270. if (s.lookahead === 0) {
  5271. break;
  5272. }
  5273. /* flush the current block */
  5274. }
  5275. //Assert(s->block_start >= 0L, "block gone");
  5276. // if (s.block_start < 0) throw new Error("block gone");
  5277. s.strstart += s.lookahead;
  5278. s.lookahead = 0;
  5279. /* Emit a stored block if pending_buf will be full: */
  5280. var max_start = s.block_start + max_block_size;
  5281. if (s.strstart === 0 || s.strstart >= max_start) {
  5282. /* strstart == 0 is possible when wraparound on 16-bit machine */
  5283. s.lookahead = s.strstart - max_start;
  5284. s.strstart = max_start;
  5285. /*** FLUSH_BLOCK(s, 0); ***/
  5286. flush_block_only(s, false);
  5287. if (s.strm.avail_out === 0) {
  5288. return BS_NEED_MORE;
  5289. }
  5290. /***/
  5291. }
  5292. /* Flush if we may have to slide, otherwise block_start may become
  5293. * negative and the data will be gone:
  5294. */
  5295. if (s.strstart - s.block_start >= (s.w_size - MIN_LOOKAHEAD)) {
  5296. /*** FLUSH_BLOCK(s, 0); ***/
  5297. flush_block_only(s, false);
  5298. if (s.strm.avail_out === 0) {
  5299. return BS_NEED_MORE;
  5300. }
  5301. /***/
  5302. }
  5303. }
  5304. s.insert = 0;
  5305. if (flush === Z_FINISH) {
  5306. /*** FLUSH_BLOCK(s, 1); ***/
  5307. flush_block_only(s, true);
  5308. if (s.strm.avail_out === 0) {
  5309. return BS_FINISH_STARTED;
  5310. }
  5311. /***/
  5312. return BS_FINISH_DONE;
  5313. }
  5314. if (s.strstart > s.block_start) {
  5315. /*** FLUSH_BLOCK(s, 0); ***/
  5316. flush_block_only(s, false);
  5317. if (s.strm.avail_out === 0) {
  5318. return BS_NEED_MORE;
  5319. }
  5320. /***/
  5321. }
  5322. return BS_NEED_MORE;
  5323. }
  5324. /* ===========================================================================
  5325. * Compress as much as possible from the input stream, return the current
  5326. * block state.
  5327. * This function does not perform lazy evaluation of matches and inserts
  5328. * new strings in the dictionary only for unmatched strings or for short
  5329. * matches. It is used only for the fast compression options.
  5330. */
  5331. function deflate_fast(s, flush) {
  5332. var hash_head; /* head of the hash chain */
  5333. var bflush; /* set if current block must be flushed */
  5334. for (;;) {
  5335. /* Make sure that we always have enough lookahead, except
  5336. * at the end of the input file. We need MAX_MATCH bytes
  5337. * for the next match, plus MIN_MATCH bytes to insert the
  5338. * string following the next match.
  5339. */
  5340. if (s.lookahead < MIN_LOOKAHEAD) {
  5341. fill_window(s);
  5342. if (s.lookahead < MIN_LOOKAHEAD && flush === Z_NO_FLUSH) {
  5343. return BS_NEED_MORE;
  5344. }
  5345. if (s.lookahead === 0) {
  5346. break; /* flush the current block */
  5347. }
  5348. }
  5349. /* Insert the string window[strstart .. strstart+2] in the
  5350. * dictionary, and set hash_head to the head of the hash chain:
  5351. */
  5352. hash_head = 0/*NIL*/;
  5353. if (s.lookahead >= MIN_MATCH) {
  5354. /*** INSERT_STRING(s, s.strstart, hash_head); ***/
  5355. s.ins_h = ((s.ins_h << s.hash_shift) ^ s.window[s.strstart + MIN_MATCH - 1]) & s.hash_mask;
  5356. hash_head = s.prev[s.strstart & s.w_mask] = s.head[s.ins_h];
  5357. s.head[s.ins_h] = s.strstart;
  5358. /***/
  5359. }
  5360. /* Find the longest match, discarding those <= prev_length.
  5361. * At this point we have always match_length < MIN_MATCH
  5362. */
  5363. if (hash_head !== 0/*NIL*/ && ((s.strstart - hash_head) <= (s.w_size - MIN_LOOKAHEAD))) {
  5364. /* To simplify the code, we prevent matches with the string
  5365. * of window index 0 (in particular we have to avoid a match
  5366. * of the string with itself at the start of the input file).
  5367. */
  5368. s.match_length = longest_match(s, hash_head);
  5369. /* longest_match() sets match_start */
  5370. }
  5371. if (s.match_length >= MIN_MATCH) {
  5372. // check_match(s, s.strstart, s.match_start, s.match_length); // for debug only
  5373. /*** _tr_tally_dist(s, s.strstart - s.match_start,
  5374. s.match_length - MIN_MATCH, bflush); ***/
  5375. bflush = trees._tr_tally(s, s.strstart - s.match_start, s.match_length - MIN_MATCH);
  5376. s.lookahead -= s.match_length;
  5377. /* Insert new strings in the hash table only if the match length
  5378. * is not too large. This saves time but degrades compression.
  5379. */
  5380. if (s.match_length <= s.max_lazy_match/*max_insert_length*/ && s.lookahead >= MIN_MATCH) {
  5381. s.match_length--; /* string at strstart already in table */
  5382. do {
  5383. s.strstart++;
  5384. /*** INSERT_STRING(s, s.strstart, hash_head); ***/
  5385. s.ins_h = ((s.ins_h << s.hash_shift) ^ s.window[s.strstart + MIN_MATCH - 1]) & s.hash_mask;
  5386. hash_head = s.prev[s.strstart & s.w_mask] = s.head[s.ins_h];
  5387. s.head[s.ins_h] = s.strstart;
  5388. /***/
  5389. /* strstart never exceeds WSIZE-MAX_MATCH, so there are
  5390. * always MIN_MATCH bytes ahead.
  5391. */
  5392. } while (--s.match_length !== 0);
  5393. s.strstart++;
  5394. } else
  5395. {
  5396. s.strstart += s.match_length;
  5397. s.match_length = 0;
  5398. s.ins_h = s.window[s.strstart];
  5399. /* UPDATE_HASH(s, s.ins_h, s.window[s.strstart+1]); */
  5400. s.ins_h = ((s.ins_h << s.hash_shift) ^ s.window[s.strstart + 1]) & s.hash_mask;
  5401. //#if MIN_MATCH != 3
  5402. // Call UPDATE_HASH() MIN_MATCH-3 more times
  5403. //#endif
  5404. /* If lookahead < MIN_MATCH, ins_h is garbage, but it does not
  5405. * matter since it will be recomputed at next deflate call.
  5406. */
  5407. }
  5408. } else {
  5409. /* No match, output a literal byte */
  5410. //Tracevv((stderr,"%c", s.window[s.strstart]));
  5411. /*** _tr_tally_lit(s, s.window[s.strstart], bflush); ***/
  5412. bflush = trees._tr_tally(s, 0, s.window[s.strstart]);
  5413. s.lookahead--;
  5414. s.strstart++;
  5415. }
  5416. if (bflush) {
  5417. /*** FLUSH_BLOCK(s, 0); ***/
  5418. flush_block_only(s, false);
  5419. if (s.strm.avail_out === 0) {
  5420. return BS_NEED_MORE;
  5421. }
  5422. /***/
  5423. }
  5424. }
  5425. s.insert = ((s.strstart < (MIN_MATCH-1)) ? s.strstart : MIN_MATCH-1);
  5426. if (flush === Z_FINISH) {
  5427. /*** FLUSH_BLOCK(s, 1); ***/
  5428. flush_block_only(s, true);
  5429. if (s.strm.avail_out === 0) {
  5430. return BS_FINISH_STARTED;
  5431. }
  5432. /***/
  5433. return BS_FINISH_DONE;
  5434. }
  5435. if (s.last_lit) {
  5436. /*** FLUSH_BLOCK(s, 0); ***/
  5437. flush_block_only(s, false);
  5438. if (s.strm.avail_out === 0) {
  5439. return BS_NEED_MORE;
  5440. }
  5441. /***/
  5442. }
  5443. return BS_BLOCK_DONE;
  5444. }
  5445. /* ===========================================================================
  5446. * Same as above, but achieves better compression. We use a lazy
  5447. * evaluation for matches: a match is finally adopted only if there is
  5448. * no better match at the next window position.
  5449. */
  5450. function deflate_slow(s, flush) {
  5451. var hash_head; /* head of hash chain */
  5452. var bflush; /* set if current block must be flushed */
  5453. var max_insert;
  5454. /* Process the input block. */
  5455. for (;;) {
  5456. /* Make sure that we always have enough lookahead, except
  5457. * at the end of the input file. We need MAX_MATCH bytes
  5458. * for the next match, plus MIN_MATCH bytes to insert the
  5459. * string following the next match.
  5460. */
  5461. if (s.lookahead < MIN_LOOKAHEAD) {
  5462. fill_window(s);
  5463. if (s.lookahead < MIN_LOOKAHEAD && flush === Z_NO_FLUSH) {
  5464. return BS_NEED_MORE;
  5465. }
  5466. if (s.lookahead === 0) { break; } /* flush the current block */
  5467. }
  5468. /* Insert the string window[strstart .. strstart+2] in the
  5469. * dictionary, and set hash_head to the head of the hash chain:
  5470. */
  5471. hash_head = 0/*NIL*/;
  5472. if (s.lookahead >= MIN_MATCH) {
  5473. /*** INSERT_STRING(s, s.strstart, hash_head); ***/
  5474. s.ins_h = ((s.ins_h << s.hash_shift) ^ s.window[s.strstart + MIN_MATCH - 1]) & s.hash_mask;
  5475. hash_head = s.prev[s.strstart & s.w_mask] = s.head[s.ins_h];
  5476. s.head[s.ins_h] = s.strstart;
  5477. /***/
  5478. }
  5479. /* Find the longest match, discarding those <= prev_length.
  5480. */
  5481. s.prev_length = s.match_length;
  5482. s.prev_match = s.match_start;
  5483. s.match_length = MIN_MATCH-1;
  5484. if (hash_head !== 0/*NIL*/ && s.prev_length < s.max_lazy_match &&
  5485. s.strstart - hash_head <= (s.w_size-MIN_LOOKAHEAD)/*MAX_DIST(s)*/) {
  5486. /* To simplify the code, we prevent matches with the string
  5487. * of window index 0 (in particular we have to avoid a match
  5488. * of the string with itself at the start of the input file).
  5489. */
  5490. s.match_length = longest_match(s, hash_head);
  5491. /* longest_match() sets match_start */
  5492. if (s.match_length <= 5 &&
  5493. (s.strategy === Z_FILTERED || (s.match_length === MIN_MATCH && s.strstart - s.match_start > 4096/*TOO_FAR*/))) {
  5494. /* If prev_match is also MIN_MATCH, match_start is garbage
  5495. * but we will ignore the current match anyway.
  5496. */
  5497. s.match_length = MIN_MATCH-1;
  5498. }
  5499. }
  5500. /* If there was a match at the previous step and the current
  5501. * match is not better, output the previous match:
  5502. */
  5503. if (s.prev_length >= MIN_MATCH && s.match_length <= s.prev_length) {
  5504. max_insert = s.strstart + s.lookahead - MIN_MATCH;
  5505. /* Do not insert strings in hash table beyond this. */
  5506. //check_match(s, s.strstart-1, s.prev_match, s.prev_length);
  5507. /***_tr_tally_dist(s, s.strstart - 1 - s.prev_match,
  5508. s.prev_length - MIN_MATCH, bflush);***/
  5509. bflush = trees._tr_tally(s, s.strstart - 1- s.prev_match, s.prev_length - MIN_MATCH);
  5510. /* Insert in hash table all strings up to the end of the match.
  5511. * strstart-1 and strstart are already inserted. If there is not
  5512. * enough lookahead, the last two strings are not inserted in
  5513. * the hash table.
  5514. */
  5515. s.lookahead -= s.prev_length-1;
  5516. s.prev_length -= 2;
  5517. do {
  5518. if (++s.strstart <= max_insert) {
  5519. /*** INSERT_STRING(s, s.strstart, hash_head); ***/
  5520. s.ins_h = ((s.ins_h << s.hash_shift) ^ s.window[s.strstart + MIN_MATCH - 1]) & s.hash_mask;
  5521. hash_head = s.prev[s.strstart & s.w_mask] = s.head[s.ins_h];
  5522. s.head[s.ins_h] = s.strstart;
  5523. /***/
  5524. }
  5525. } while (--s.prev_length !== 0);
  5526. s.match_available = 0;
  5527. s.match_length = MIN_MATCH-1;
  5528. s.strstart++;
  5529. if (bflush) {
  5530. /*** FLUSH_BLOCK(s, 0); ***/
  5531. flush_block_only(s, false);
  5532. if (s.strm.avail_out === 0) {
  5533. return BS_NEED_MORE;
  5534. }
  5535. /***/
  5536. }
  5537. } else if (s.match_available) {
  5538. /* If there was no match at the previous position, output a
  5539. * single literal. If there was a match but the current match
  5540. * is longer, truncate the previous match to a single literal.
  5541. */
  5542. //Tracevv((stderr,"%c", s->window[s->strstart-1]));
  5543. /*** _tr_tally_lit(s, s.window[s.strstart-1], bflush); ***/
  5544. bflush = trees._tr_tally(s, 0, s.window[s.strstart-1]);
  5545. if (bflush) {
  5546. /*** FLUSH_BLOCK_ONLY(s, 0) ***/
  5547. flush_block_only(s, false);
  5548. /***/
  5549. }
  5550. s.strstart++;
  5551. s.lookahead--;
  5552. if (s.strm.avail_out === 0) {
  5553. return BS_NEED_MORE;
  5554. }
  5555. } else {
  5556. /* There is no previous match to compare with, wait for
  5557. * the next step to decide.
  5558. */
  5559. s.match_available = 1;
  5560. s.strstart++;
  5561. s.lookahead--;
  5562. }
  5563. }
  5564. //Assert (flush != Z_NO_FLUSH, "no flush?");
  5565. if (s.match_available) {
  5566. //Tracevv((stderr,"%c", s->window[s->strstart-1]));
  5567. /*** _tr_tally_lit(s, s.window[s.strstart-1], bflush); ***/
  5568. bflush = trees._tr_tally(s, 0, s.window[s.strstart-1]);
  5569. s.match_available = 0;
  5570. }
  5571. s.insert = s.strstart < MIN_MATCH-1 ? s.strstart : MIN_MATCH-1;
  5572. if (flush === Z_FINISH) {
  5573. /*** FLUSH_BLOCK(s, 1); ***/
  5574. flush_block_only(s, true);
  5575. if (s.strm.avail_out === 0) {
  5576. return BS_FINISH_STARTED;
  5577. }
  5578. /***/
  5579. return BS_FINISH_DONE;
  5580. }
  5581. if (s.last_lit) {
  5582. /*** FLUSH_BLOCK(s, 0); ***/
  5583. flush_block_only(s, false);
  5584. if (s.strm.avail_out === 0) {
  5585. return BS_NEED_MORE;
  5586. }
  5587. /***/
  5588. }
  5589. return BS_BLOCK_DONE;
  5590. }
  5591. /* ===========================================================================
  5592. * For Z_RLE, simply look for runs of bytes, generate matches only of distance
  5593. * one. Do not maintain a hash table. (It will be regenerated if this run of
  5594. * deflate switches away from Z_RLE.)
  5595. */
  5596. function deflate_rle(s, flush) {
  5597. var bflush; /* set if current block must be flushed */
  5598. var prev; /* byte at distance one to match */
  5599. var scan, strend; /* scan goes up to strend for length of run */
  5600. var _win = s.window;
  5601. for (;;) {
  5602. /* Make sure that we always have enough lookahead, except
  5603. * at the end of the input file. We need MAX_MATCH bytes
  5604. * for the longest run, plus one for the unrolled loop.
  5605. */
  5606. if (s.lookahead <= MAX_MATCH) {
  5607. fill_window(s);
  5608. if (s.lookahead <= MAX_MATCH && flush === Z_NO_FLUSH) {
  5609. return BS_NEED_MORE;
  5610. }
  5611. if (s.lookahead === 0) { break; } /* flush the current block */
  5612. }
  5613. /* See how many times the previous byte repeats */
  5614. s.match_length = 0;
  5615. if (s.lookahead >= MIN_MATCH && s.strstart > 0) {
  5616. scan = s.strstart - 1;
  5617. prev = _win[scan];
  5618. if (prev === _win[++scan] && prev === _win[++scan] && prev === _win[++scan]) {
  5619. strend = s.strstart + MAX_MATCH;
  5620. do {
  5621. /*jshint noempty:false*/
  5622. } while (prev === _win[++scan] && prev === _win[++scan] &&
  5623. prev === _win[++scan] && prev === _win[++scan] &&
  5624. prev === _win[++scan] && prev === _win[++scan] &&
  5625. prev === _win[++scan] && prev === _win[++scan] &&
  5626. scan < strend);
  5627. s.match_length = MAX_MATCH - (strend - scan);
  5628. if (s.match_length > s.lookahead) {
  5629. s.match_length = s.lookahead;
  5630. }
  5631. }
  5632. //Assert(scan <= s->window+(uInt)(s->window_size-1), "wild scan");
  5633. }
  5634. /* Emit match if have run of MIN_MATCH or longer, else emit literal */
  5635. if (s.match_length >= MIN_MATCH) {
  5636. //check_match(s, s.strstart, s.strstart - 1, s.match_length);
  5637. /*** _tr_tally_dist(s, 1, s.match_length - MIN_MATCH, bflush); ***/
  5638. bflush = trees._tr_tally(s, 1, s.match_length - MIN_MATCH);
  5639. s.lookahead -= s.match_length;
  5640. s.strstart += s.match_length;
  5641. s.match_length = 0;
  5642. } else {
  5643. /* No match, output a literal byte */
  5644. //Tracevv((stderr,"%c", s->window[s->strstart]));
  5645. /*** _tr_tally_lit(s, s.window[s.strstart], bflush); ***/
  5646. bflush = trees._tr_tally(s, 0, s.window[s.strstart]);
  5647. s.lookahead--;
  5648. s.strstart++;
  5649. }
  5650. if (bflush) {
  5651. /*** FLUSH_BLOCK(s, 0); ***/
  5652. flush_block_only(s, false);
  5653. if (s.strm.avail_out === 0) {
  5654. return BS_NEED_MORE;
  5655. }
  5656. /***/
  5657. }
  5658. }
  5659. s.insert = 0;
  5660. if (flush === Z_FINISH) {
  5661. /*** FLUSH_BLOCK(s, 1); ***/
  5662. flush_block_only(s, true);
  5663. if (s.strm.avail_out === 0) {
  5664. return BS_FINISH_STARTED;
  5665. }
  5666. /***/
  5667. return BS_FINISH_DONE;
  5668. }
  5669. if (s.last_lit) {
  5670. /*** FLUSH_BLOCK(s, 0); ***/
  5671. flush_block_only(s, false);
  5672. if (s.strm.avail_out === 0) {
  5673. return BS_NEED_MORE;
  5674. }
  5675. /***/
  5676. }
  5677. return BS_BLOCK_DONE;
  5678. }
  5679. /* ===========================================================================
  5680. * For Z_HUFFMAN_ONLY, do not look for matches. Do not maintain a hash table.
  5681. * (It will be regenerated if this run of deflate switches away from Huffman.)
  5682. */
  5683. function deflate_huff(s, flush) {
  5684. var bflush; /* set if current block must be flushed */
  5685. for (;;) {
  5686. /* Make sure that we have a literal to write. */
  5687. if (s.lookahead === 0) {
  5688. fill_window(s);
  5689. if (s.lookahead === 0) {
  5690. if (flush === Z_NO_FLUSH) {
  5691. return BS_NEED_MORE;
  5692. }
  5693. break; /* flush the current block */
  5694. }
  5695. }
  5696. /* Output a literal byte */
  5697. s.match_length = 0;
  5698. //Tracevv((stderr,"%c", s->window[s->strstart]));
  5699. /*** _tr_tally_lit(s, s.window[s.strstart], bflush); ***/
  5700. bflush = trees._tr_tally(s, 0, s.window[s.strstart]);
  5701. s.lookahead--;
  5702. s.strstart++;
  5703. if (bflush) {
  5704. /*** FLUSH_BLOCK(s, 0); ***/
  5705. flush_block_only(s, false);
  5706. if (s.strm.avail_out === 0) {
  5707. return BS_NEED_MORE;
  5708. }
  5709. /***/
  5710. }
  5711. }
  5712. s.insert = 0;
  5713. if (flush === Z_FINISH) {
  5714. /*** FLUSH_BLOCK(s, 1); ***/
  5715. flush_block_only(s, true);
  5716. if (s.strm.avail_out === 0) {
  5717. return BS_FINISH_STARTED;
  5718. }
  5719. /***/
  5720. return BS_FINISH_DONE;
  5721. }
  5722. if (s.last_lit) {
  5723. /*** FLUSH_BLOCK(s, 0); ***/
  5724. flush_block_only(s, false);
  5725. if (s.strm.avail_out === 0) {
  5726. return BS_NEED_MORE;
  5727. }
  5728. /***/
  5729. }
  5730. return BS_BLOCK_DONE;
  5731. }
  5732. /* Values for max_lazy_match, good_match and max_chain_length, depending on
  5733. * the desired pack level (0..9). The values given below have been tuned to
  5734. * exclude worst case performance for pathological files. Better values may be
  5735. * found for specific files.
  5736. */
  5737. var Config = function (good_length, max_lazy, nice_length, max_chain, func) {
  5738. this.good_length = good_length;
  5739. this.max_lazy = max_lazy;
  5740. this.nice_length = nice_length;
  5741. this.max_chain = max_chain;
  5742. this.func = func;
  5743. };
  5744. var configuration_table;
  5745. configuration_table = [
  5746. /* good lazy nice chain */
  5747. new Config(0, 0, 0, 0, deflate_stored), /* 0 store only */
  5748. new Config(4, 4, 8, 4, deflate_fast), /* 1 max speed, no lazy matches */
  5749. new Config(4, 5, 16, 8, deflate_fast), /* 2 */
  5750. new Config(4, 6, 32, 32, deflate_fast), /* 3 */
  5751. new Config(4, 4, 16, 16, deflate_slow), /* 4 lazy matches */
  5752. new Config(8, 16, 32, 32, deflate_slow), /* 5 */
  5753. new Config(8, 16, 128, 128, deflate_slow), /* 6 */
  5754. new Config(8, 32, 128, 256, deflate_slow), /* 7 */
  5755. new Config(32, 128, 258, 1024, deflate_slow), /* 8 */
  5756. new Config(32, 258, 258, 4096, deflate_slow) /* 9 max compression */
  5757. ];
  5758. /* ===========================================================================
  5759. * Initialize the "longest match" routines for a new zlib stream
  5760. */
  5761. function lm_init(s) {
  5762. s.window_size = 2 * s.w_size;
  5763. /*** CLEAR_HASH(s); ***/
  5764. zero(s.head); // Fill with NIL (= 0);
  5765. /* Set the default configuration parameters:
  5766. */
  5767. s.max_lazy_match = configuration_table[s.level].max_lazy;
  5768. s.good_match = configuration_table[s.level].good_length;
  5769. s.nice_match = configuration_table[s.level].nice_length;
  5770. s.max_chain_length = configuration_table[s.level].max_chain;
  5771. s.strstart = 0;
  5772. s.block_start = 0;
  5773. s.lookahead = 0;
  5774. s.insert = 0;
  5775. s.match_length = s.prev_length = MIN_MATCH - 1;
  5776. s.match_available = 0;
  5777. s.ins_h = 0;
  5778. }
  5779. function DeflateState() {
  5780. this.strm = null; /* pointer back to this zlib stream */
  5781. this.status = 0; /* as the name implies */
  5782. this.pending_buf = null; /* output still pending */
  5783. this.pending_buf_size = 0; /* size of pending_buf */
  5784. this.pending_out = 0; /* next pending byte to output to the stream */
  5785. this.pending = 0; /* nb of bytes in the pending buffer */
  5786. this.wrap = 0; /* bit 0 true for zlib, bit 1 true for gzip */
  5787. this.gzhead = null; /* gzip header information to write */
  5788. this.gzindex = 0; /* where in extra, name, or comment */
  5789. this.method = Z_DEFLATED; /* can only be DEFLATED */
  5790. this.last_flush = -1; /* value of flush param for previous deflate call */
  5791. this.w_size = 0; /* LZ77 window size (32K by default) */
  5792. this.w_bits = 0; /* log2(w_size) (8..16) */
  5793. this.w_mask = 0; /* w_size - 1 */
  5794. this.window = null;
  5795. /* Sliding window. Input bytes are read into the second half of the window,
  5796. * and move to the first half later to keep a dictionary of at least wSize
  5797. * bytes. With this organization, matches are limited to a distance of
  5798. * wSize-MAX_MATCH bytes, but this ensures that IO is always
  5799. * performed with a length multiple of the block size.
  5800. */
  5801. this.window_size = 0;
  5802. /* Actual size of window: 2*wSize, except when the user input buffer
  5803. * is directly used as sliding window.
  5804. */
  5805. this.prev = null;
  5806. /* Link to older string with same hash index. To limit the size of this
  5807. * array to 64K, this link is maintained only for the last 32K strings.
  5808. * An index in this array is thus a window index modulo 32K.
  5809. */
  5810. this.head = null; /* Heads of the hash chains or NIL. */
  5811. this.ins_h = 0; /* hash index of string to be inserted */
  5812. this.hash_size = 0; /* number of elements in hash table */
  5813. this.hash_bits = 0; /* log2(hash_size) */
  5814. this.hash_mask = 0; /* hash_size-1 */
  5815. this.hash_shift = 0;
  5816. /* Number of bits by which ins_h must be shifted at each input
  5817. * step. It must be such that after MIN_MATCH steps, the oldest
  5818. * byte no longer takes part in the hash key, that is:
  5819. * hash_shift * MIN_MATCH >= hash_bits
  5820. */
  5821. this.block_start = 0;
  5822. /* Window position at the beginning of the current output block. Gets
  5823. * negative when the window is moved backwards.
  5824. */
  5825. this.match_length = 0; /* length of best match */
  5826. this.prev_match = 0; /* previous match */
  5827. this.match_available = 0; /* set if previous match exists */
  5828. this.strstart = 0; /* start of string to insert */
  5829. this.match_start = 0; /* start of matching string */
  5830. this.lookahead = 0; /* number of valid bytes ahead in window */
  5831. this.prev_length = 0;
  5832. /* Length of the best match at previous step. Matches not greater than this
  5833. * are discarded. This is used in the lazy match evaluation.
  5834. */
  5835. this.max_chain_length = 0;
  5836. /* To speed up deflation, hash chains are never searched beyond this
  5837. * length. A higher limit improves compression ratio but degrades the
  5838. * speed.
  5839. */
  5840. this.max_lazy_match = 0;
  5841. /* Attempt to find a better match only when the current match is strictly
  5842. * smaller than this value. This mechanism is used only for compression
  5843. * levels >= 4.
  5844. */
  5845. // That's alias to max_lazy_match, don't use directly
  5846. //this.max_insert_length = 0;
  5847. /* Insert new strings in the hash table only if the match length is not
  5848. * greater than this length. This saves time but degrades compression.
  5849. * max_insert_length is used only for compression levels <= 3.
  5850. */
  5851. this.level = 0; /* compression level (1..9) */
  5852. this.strategy = 0; /* favor or force Huffman coding*/
  5853. this.good_match = 0;
  5854. /* Use a faster search when the previous match is longer than this */
  5855. this.nice_match = 0; /* Stop searching when current match exceeds this */
  5856. /* used by trees.c: */
  5857. /* Didn't use ct_data typedef below to suppress compiler warning */
  5858. // struct ct_data_s dyn_ltree[HEAP_SIZE]; /* literal and length tree */
  5859. // struct ct_data_s dyn_dtree[2*D_CODES+1]; /* distance tree */
  5860. // struct ct_data_s bl_tree[2*BL_CODES+1]; /* Huffman tree for bit lengths */
  5861. // Use flat array of DOUBLE size, with interleaved fata,
  5862. // because JS does not support effective
  5863. this.dyn_ltree = new utils.Buf16(HEAP_SIZE * 2);
  5864. this.dyn_dtree = new utils.Buf16((2*D_CODES+1) * 2);
  5865. this.bl_tree = new utils.Buf16((2*BL_CODES+1) * 2);
  5866. zero(this.dyn_ltree);
  5867. zero(this.dyn_dtree);
  5868. zero(this.bl_tree);
  5869. this.l_desc = null; /* desc. for literal tree */
  5870. this.d_desc = null; /* desc. for distance tree */
  5871. this.bl_desc = null; /* desc. for bit length tree */
  5872. //ush bl_count[MAX_BITS+1];
  5873. this.bl_count = new utils.Buf16(MAX_BITS+1);
  5874. /* number of codes at each bit length for an optimal tree */
  5875. //int heap[2*L_CODES+1]; /* heap used to build the Huffman trees */
  5876. this.heap = new utils.Buf16(2*L_CODES+1); /* heap used to build the Huffman trees */
  5877. zero(this.heap);
  5878. this.heap_len = 0; /* number of elements in the heap */
  5879. this.heap_max = 0; /* element of largest frequency */
  5880. /* The sons of heap[n] are heap[2*n] and heap[2*n+1]. heap[0] is not used.
  5881. * The same heap array is used to build all trees.
  5882. */
  5883. this.depth = new utils.Buf16(2*L_CODES+1); //uch depth[2*L_CODES+1];
  5884. zero(this.depth);
  5885. /* Depth of each subtree used as tie breaker for trees of equal frequency
  5886. */
  5887. this.l_buf = 0; /* buffer index for literals or lengths */
  5888. this.lit_bufsize = 0;
  5889. /* Size of match buffer for literals/lengths. There are 4 reasons for
  5890. * limiting lit_bufsize to 64K:
  5891. * - frequencies can be kept in 16 bit counters
  5892. * - if compression is not successful for the first block, all input
  5893. * data is still in the window so we can still emit a stored block even
  5894. * when input comes from standard input. (This can also be done for
  5895. * all blocks if lit_bufsize is not greater than 32K.)
  5896. * - if compression is not successful for a file smaller than 64K, we can
  5897. * even emit a stored file instead of a stored block (saving 5 bytes).
  5898. * This is applicable only for zip (not gzip or zlib).
  5899. * - creating new Huffman trees less frequently may not provide fast
  5900. * adaptation to changes in the input data statistics. (Take for
  5901. * example a binary file with poorly compressible code followed by
  5902. * a highly compressible string table.) Smaller buffer sizes give
  5903. * fast adaptation but have of course the overhead of transmitting
  5904. * trees more frequently.
  5905. * - I can't count above 4
  5906. */
  5907. this.last_lit = 0; /* running index in l_buf */
  5908. this.d_buf = 0;
  5909. /* Buffer index for distances. To simplify the code, d_buf and l_buf have
  5910. * the same number of elements. To use different lengths, an extra flag
  5911. * array would be necessary.
  5912. */
  5913. this.opt_len = 0; /* bit length of current block with optimal trees */
  5914. this.static_len = 0; /* bit length of current block with static trees */
  5915. this.matches = 0; /* number of string matches in current block */
  5916. this.insert = 0; /* bytes at end of window left to insert */
  5917. this.bi_buf = 0;
  5918. /* Output buffer. bits are inserted starting at the bottom (least
  5919. * significant bits).
  5920. */
  5921. this.bi_valid = 0;
  5922. /* Number of valid bits in bi_buf. All bits above the last valid bit
  5923. * are always zero.
  5924. */
  5925. // Used for window memory init. We safely ignore it for JS. That makes
  5926. // sense only for pointers and memory check tools.
  5927. //this.high_water = 0;
  5928. /* High water mark offset in window for initialized bytes -- bytes above
  5929. * this are set to zero in order to avoid memory check warnings when
  5930. * longest match routines access bytes past the input. This is then
  5931. * updated to the new high water mark.
  5932. */
  5933. }
  5934. function deflateResetKeep(strm) {
  5935. var s;
  5936. if (!strm || !strm.state) {
  5937. return err(strm, Z_STREAM_ERROR);
  5938. }
  5939. strm.total_in = strm.total_out = 0;
  5940. strm.data_type = Z_UNKNOWN;
  5941. s = strm.state;
  5942. s.pending = 0;
  5943. s.pending_out = 0;
  5944. if (s.wrap < 0) {
  5945. s.wrap = -s.wrap;
  5946. /* was made negative by deflate(..., Z_FINISH); */
  5947. }
  5948. s.status = (s.wrap ? INIT_STATE : BUSY_STATE);
  5949. strm.adler = (s.wrap === 2) ?
  5950. 0 // crc32(0, Z_NULL, 0)
  5951. :
  5952. 1; // adler32(0, Z_NULL, 0)
  5953. s.last_flush = Z_NO_FLUSH;
  5954. trees._tr_init(s);
  5955. return Z_OK;
  5956. }
  5957. function deflateReset(strm) {
  5958. var ret = deflateResetKeep(strm);
  5959. if (ret === Z_OK) {
  5960. lm_init(strm.state);
  5961. }
  5962. return ret;
  5963. }
  5964. function deflateSetHeader(strm, head) {
  5965. if (!strm || !strm.state) { return Z_STREAM_ERROR; }
  5966. if (strm.state.wrap !== 2) { return Z_STREAM_ERROR; }
  5967. strm.state.gzhead = head;
  5968. return Z_OK;
  5969. }
  5970. function deflateInit2(strm, level, method, windowBits, memLevel, strategy) {
  5971. if (!strm) { // === Z_NULL
  5972. return Z_STREAM_ERROR;
  5973. }
  5974. var wrap = 1;
  5975. if (level === Z_DEFAULT_COMPRESSION) {
  5976. level = 6;
  5977. }
  5978. if (windowBits < 0) { /* suppress zlib wrapper */
  5979. wrap = 0;
  5980. windowBits = -windowBits;
  5981. }
  5982. else if (windowBits > 15) {
  5983. wrap = 2; /* write gzip wrapper instead */
  5984. windowBits -= 16;
  5985. }
  5986. if (memLevel < 1 || memLevel > MAX_MEM_LEVEL || method !== Z_DEFLATED ||
  5987. windowBits < 8 || windowBits > 15 || level < 0 || level > 9 ||
  5988. strategy < 0 || strategy > Z_FIXED) {
  5989. return err(strm, Z_STREAM_ERROR);
  5990. }
  5991. if (windowBits === 8) {
  5992. windowBits = 9;
  5993. }
  5994. /* until 256-byte window bug fixed */
  5995. var s = new DeflateState();
  5996. strm.state = s;
  5997. s.strm = strm;
  5998. s.wrap = wrap;
  5999. s.gzhead = null;
  6000. s.w_bits = windowBits;
  6001. s.w_size = 1 << s.w_bits;
  6002. s.w_mask = s.w_size - 1;
  6003. s.hash_bits = memLevel + 7;
  6004. s.hash_size = 1 << s.hash_bits;
  6005. s.hash_mask = s.hash_size - 1;
  6006. s.hash_shift = ~~((s.hash_bits + MIN_MATCH - 1) / MIN_MATCH);
  6007. s.window = new utils.Buf8(s.w_size * 2);
  6008. s.head = new utils.Buf16(s.hash_size);
  6009. s.prev = new utils.Buf16(s.w_size);
  6010. // Don't need mem init magic for JS.
  6011. //s.high_water = 0; /* nothing written to s->window yet */
  6012. s.lit_bufsize = 1 << (memLevel + 6); /* 16K elements by default */
  6013. s.pending_buf_size = s.lit_bufsize * 4;
  6014. s.pending_buf = new utils.Buf8(s.pending_buf_size);
  6015. s.d_buf = s.lit_bufsize >> 1;
  6016. s.l_buf = (1 + 2) * s.lit_bufsize;
  6017. s.level = level;
  6018. s.strategy = strategy;
  6019. s.method = method;
  6020. return deflateReset(strm);
  6021. }
  6022. function deflateInit(strm, level) {
  6023. return deflateInit2(strm, level, Z_DEFLATED, MAX_WBITS, DEF_MEM_LEVEL, Z_DEFAULT_STRATEGY);
  6024. }
  6025. function deflate(strm, flush) {
  6026. var old_flush, s;
  6027. var beg, val; // for gzip header write only
  6028. if (!strm || !strm.state ||
  6029. flush > Z_BLOCK || flush < 0) {
  6030. return strm ? err(strm, Z_STREAM_ERROR) : Z_STREAM_ERROR;
  6031. }
  6032. s = strm.state;
  6033. if (!strm.output ||
  6034. (!strm.input && strm.avail_in !== 0) ||
  6035. (s.status === FINISH_STATE && flush !== Z_FINISH)) {
  6036. return err(strm, (strm.avail_out === 0) ? Z_BUF_ERROR : Z_STREAM_ERROR);
  6037. }
  6038. s.strm = strm; /* just in case */
  6039. old_flush = s.last_flush;
  6040. s.last_flush = flush;
  6041. /* Write the header */
  6042. if (s.status === INIT_STATE) {
  6043. if (s.wrap === 2) { // GZIP header
  6044. strm.adler = 0; //crc32(0L, Z_NULL, 0);
  6045. put_byte(s, 31);
  6046. put_byte(s, 139);
  6047. put_byte(s, 8);
  6048. if (!s.gzhead) { // s->gzhead == Z_NULL
  6049. put_byte(s, 0);
  6050. put_byte(s, 0);
  6051. put_byte(s, 0);
  6052. put_byte(s, 0);
  6053. put_byte(s, 0);
  6054. put_byte(s, s.level === 9 ? 2 :
  6055. (s.strategy >= Z_HUFFMAN_ONLY || s.level < 2 ?
  6056. 4 : 0));
  6057. put_byte(s, OS_CODE);
  6058. s.status = BUSY_STATE;
  6059. }
  6060. else {
  6061. put_byte(s, (s.gzhead.text ? 1 : 0) +
  6062. (s.gzhead.hcrc ? 2 : 0) +
  6063. (!s.gzhead.extra ? 0 : 4) +
  6064. (!s.gzhead.name ? 0 : 8) +
  6065. (!s.gzhead.comment ? 0 : 16)
  6066. );
  6067. put_byte(s, s.gzhead.time & 0xff);
  6068. put_byte(s, (s.gzhead.time >> 8) & 0xff);
  6069. put_byte(s, (s.gzhead.time >> 16) & 0xff);
  6070. put_byte(s, (s.gzhead.time >> 24) & 0xff);
  6071. put_byte(s, s.level === 9 ? 2 :
  6072. (s.strategy >= Z_HUFFMAN_ONLY || s.level < 2 ?
  6073. 4 : 0));
  6074. put_byte(s, s.gzhead.os & 0xff);
  6075. if (s.gzhead.extra && s.gzhead.extra.length) {
  6076. put_byte(s, s.gzhead.extra.length & 0xff);
  6077. put_byte(s, (s.gzhead.extra.length >> 8) & 0xff);
  6078. }
  6079. if (s.gzhead.hcrc) {
  6080. strm.adler = crc32(strm.adler, s.pending_buf, s.pending, 0);
  6081. }
  6082. s.gzindex = 0;
  6083. s.status = EXTRA_STATE;
  6084. }
  6085. }
  6086. else // DEFLATE header
  6087. {
  6088. var header = (Z_DEFLATED + ((s.w_bits - 8) << 4)) << 8;
  6089. var level_flags = -1;
  6090. if (s.strategy >= Z_HUFFMAN_ONLY || s.level < 2) {
  6091. level_flags = 0;
  6092. } else if (s.level < 6) {
  6093. level_flags = 1;
  6094. } else if (s.level === 6) {
  6095. level_flags = 2;
  6096. } else {
  6097. level_flags = 3;
  6098. }
  6099. header |= (level_flags << 6);
  6100. if (s.strstart !== 0) { header |= PRESET_DICT; }
  6101. header += 31 - (header % 31);
  6102. s.status = BUSY_STATE;
  6103. putShortMSB(s, header);
  6104. /* Save the adler32 of the preset dictionary: */
  6105. if (s.strstart !== 0) {
  6106. putShortMSB(s, strm.adler >>> 16);
  6107. putShortMSB(s, strm.adler & 0xffff);
  6108. }
  6109. strm.adler = 1; // adler32(0L, Z_NULL, 0);
  6110. }
  6111. }
  6112. //#ifdef GZIP
  6113. if (s.status === EXTRA_STATE) {
  6114. if (s.gzhead.extra/* != Z_NULL*/) {
  6115. beg = s.pending; /* start of bytes to update crc */
  6116. while (s.gzindex < (s.gzhead.extra.length & 0xffff)) {
  6117. if (s.pending === s.pending_buf_size) {
  6118. if (s.gzhead.hcrc && s.pending > beg) {
  6119. strm.adler = crc32(strm.adler, s.pending_buf, s.pending - beg, beg);
  6120. }
  6121. flush_pending(strm);
  6122. beg = s.pending;
  6123. if (s.pending === s.pending_buf_size) {
  6124. break;
  6125. }
  6126. }
  6127. put_byte(s, s.gzhead.extra[s.gzindex] & 0xff);
  6128. s.gzindex++;
  6129. }
  6130. if (s.gzhead.hcrc && s.pending > beg) {
  6131. strm.adler = crc32(strm.adler, s.pending_buf, s.pending - beg, beg);
  6132. }
  6133. if (s.gzindex === s.gzhead.extra.length) {
  6134. s.gzindex = 0;
  6135. s.status = NAME_STATE;
  6136. }
  6137. }
  6138. else {
  6139. s.status = NAME_STATE;
  6140. }
  6141. }
  6142. if (s.status === NAME_STATE) {
  6143. if (s.gzhead.name/* != Z_NULL*/) {
  6144. beg = s.pending; /* start of bytes to update crc */
  6145. //int val;
  6146. do {
  6147. if (s.pending === s.pending_buf_size) {
  6148. if (s.gzhead.hcrc && s.pending > beg) {
  6149. strm.adler = crc32(strm.adler, s.pending_buf, s.pending - beg, beg);
  6150. }
  6151. flush_pending(strm);
  6152. beg = s.pending;
  6153. if (s.pending === s.pending_buf_size) {
  6154. val = 1;
  6155. break;
  6156. }
  6157. }
  6158. // JS specific: little magic to add zero terminator to end of string
  6159. if (s.gzindex < s.gzhead.name.length) {
  6160. val = s.gzhead.name.charCodeAt(s.gzindex++) & 0xff;
  6161. } else {
  6162. val = 0;
  6163. }
  6164. put_byte(s, val);
  6165. } while (val !== 0);
  6166. if (s.gzhead.hcrc && s.pending > beg){
  6167. strm.adler = crc32(strm.adler, s.pending_buf, s.pending - beg, beg);
  6168. }
  6169. if (val === 0) {
  6170. s.gzindex = 0;
  6171. s.status = COMMENT_STATE;
  6172. }
  6173. }
  6174. else {
  6175. s.status = COMMENT_STATE;
  6176. }
  6177. }
  6178. if (s.status === COMMENT_STATE) {
  6179. if (s.gzhead.comment/* != Z_NULL*/) {
  6180. beg = s.pending; /* start of bytes to update crc */
  6181. //int val;
  6182. do {
  6183. if (s.pending === s.pending_buf_size) {
  6184. if (s.gzhead.hcrc && s.pending > beg) {
  6185. strm.adler = crc32(strm.adler, s.pending_buf, s.pending - beg, beg);
  6186. }
  6187. flush_pending(strm);
  6188. beg = s.pending;
  6189. if (s.pending === s.pending_buf_size) {
  6190. val = 1;
  6191. break;
  6192. }
  6193. }
  6194. // JS specific: little magic to add zero terminator to end of string
  6195. if (s.gzindex < s.gzhead.comment.length) {
  6196. val = s.gzhead.comment.charCodeAt(s.gzindex++) & 0xff;
  6197. } else {
  6198. val = 0;
  6199. }
  6200. put_byte(s, val);
  6201. } while (val !== 0);
  6202. if (s.gzhead.hcrc && s.pending > beg) {
  6203. strm.adler = crc32(strm.adler, s.pending_buf, s.pending - beg, beg);
  6204. }
  6205. if (val === 0) {
  6206. s.status = HCRC_STATE;
  6207. }
  6208. }
  6209. else {
  6210. s.status = HCRC_STATE;
  6211. }
  6212. }
  6213. if (s.status === HCRC_STATE) {
  6214. if (s.gzhead.hcrc) {
  6215. if (s.pending + 2 > s.pending_buf_size) {
  6216. flush_pending(strm);
  6217. }
  6218. if (s.pending + 2 <= s.pending_buf_size) {
  6219. put_byte(s, strm.adler & 0xff);
  6220. put_byte(s, (strm.adler >> 8) & 0xff);
  6221. strm.adler = 0; //crc32(0L, Z_NULL, 0);
  6222. s.status = BUSY_STATE;
  6223. }
  6224. }
  6225. else {
  6226. s.status = BUSY_STATE;
  6227. }
  6228. }
  6229. //#endif
  6230. /* Flush as much pending output as possible */
  6231. if (s.pending !== 0) {
  6232. flush_pending(strm);
  6233. if (strm.avail_out === 0) {
  6234. /* Since avail_out is 0, deflate will be called again with
  6235. * more output space, but possibly with both pending and
  6236. * avail_in equal to zero. There won't be anything to do,
  6237. * but this is not an error situation so make sure we
  6238. * return OK instead of BUF_ERROR at next call of deflate:
  6239. */
  6240. s.last_flush = -1;
  6241. return Z_OK;
  6242. }
  6243. /* Make sure there is something to do and avoid duplicate consecutive
  6244. * flushes. For repeated and useless calls with Z_FINISH, we keep
  6245. * returning Z_STREAM_END instead of Z_BUF_ERROR.
  6246. */
  6247. } else if (strm.avail_in === 0 && rank(flush) <= rank(old_flush) &&
  6248. flush !== Z_FINISH) {
  6249. return err(strm, Z_BUF_ERROR);
  6250. }
  6251. /* User must not provide more input after the first FINISH: */
  6252. if (s.status === FINISH_STATE && strm.avail_in !== 0) {
  6253. return err(strm, Z_BUF_ERROR);
  6254. }
  6255. /* Start a new block or continue the current one.
  6256. */
  6257. if (strm.avail_in !== 0 || s.lookahead !== 0 ||
  6258. (flush !== Z_NO_FLUSH && s.status !== FINISH_STATE)) {
  6259. var bstate = (s.strategy === Z_HUFFMAN_ONLY) ? deflate_huff(s, flush) :
  6260. (s.strategy === Z_RLE ? deflate_rle(s, flush) :
  6261. configuration_table[s.level].func(s, flush));
  6262. if (bstate === BS_FINISH_STARTED || bstate === BS_FINISH_DONE) {
  6263. s.status = FINISH_STATE;
  6264. }
  6265. if (bstate === BS_NEED_MORE || bstate === BS_FINISH_STARTED) {
  6266. if (strm.avail_out === 0) {
  6267. s.last_flush = -1;
  6268. /* avoid BUF_ERROR next call, see above */
  6269. }
  6270. return Z_OK;
  6271. /* If flush != Z_NO_FLUSH && avail_out == 0, the next call
  6272. * of deflate should use the same flush parameter to make sure
  6273. * that the flush is complete. So we don't have to output an
  6274. * empty block here, this will be done at next call. This also
  6275. * ensures that for a very small output buffer, we emit at most
  6276. * one empty block.
  6277. */
  6278. }
  6279. if (bstate === BS_BLOCK_DONE) {
  6280. if (flush === Z_PARTIAL_FLUSH) {
  6281. trees._tr_align(s);
  6282. }
  6283. else if (flush !== Z_BLOCK) { /* FULL_FLUSH or SYNC_FLUSH */
  6284. trees._tr_stored_block(s, 0, 0, false);
  6285. /* For a full flush, this empty block will be recognized
  6286. * as a special marker by inflate_sync().
  6287. */
  6288. if (flush === Z_FULL_FLUSH) {
  6289. /*** CLEAR_HASH(s); ***/ /* forget history */
  6290. zero(s.head); // Fill with NIL (= 0);
  6291. if (s.lookahead === 0) {
  6292. s.strstart = 0;
  6293. s.block_start = 0;
  6294. s.insert = 0;
  6295. }
  6296. }
  6297. }
  6298. flush_pending(strm);
  6299. if (strm.avail_out === 0) {
  6300. s.last_flush = -1; /* avoid BUF_ERROR at next call, see above */
  6301. return Z_OK;
  6302. }
  6303. }
  6304. }
  6305. //Assert(strm->avail_out > 0, "bug2");
  6306. //if (strm.avail_out <= 0) { throw new Error("bug2");}
  6307. if (flush !== Z_FINISH) { return Z_OK; }
  6308. if (s.wrap <= 0) { return Z_STREAM_END; }
  6309. /* Write the trailer */
  6310. if (s.wrap === 2) {
  6311. put_byte(s, strm.adler & 0xff);
  6312. put_byte(s, (strm.adler >> 8) & 0xff);
  6313. put_byte(s, (strm.adler >> 16) & 0xff);
  6314. put_byte(s, (strm.adler >> 24) & 0xff);
  6315. put_byte(s, strm.total_in & 0xff);
  6316. put_byte(s, (strm.total_in >> 8) & 0xff);
  6317. put_byte(s, (strm.total_in >> 16) & 0xff);
  6318. put_byte(s, (strm.total_in >> 24) & 0xff);
  6319. }
  6320. else
  6321. {
  6322. putShortMSB(s, strm.adler >>> 16);
  6323. putShortMSB(s, strm.adler & 0xffff);
  6324. }
  6325. flush_pending(strm);
  6326. /* If avail_out is zero, the application will call deflate again
  6327. * to flush the rest.
  6328. */
  6329. if (s.wrap > 0) { s.wrap = -s.wrap; }
  6330. /* write the trailer only once! */
  6331. return s.pending !== 0 ? Z_OK : Z_STREAM_END;
  6332. }
  6333. function deflateEnd(strm) {
  6334. var status;
  6335. if (!strm/*== Z_NULL*/ || !strm.state/*== Z_NULL*/) {
  6336. return Z_STREAM_ERROR;
  6337. }
  6338. status = strm.state.status;
  6339. if (status !== INIT_STATE &&
  6340. status !== EXTRA_STATE &&
  6341. status !== NAME_STATE &&
  6342. status !== COMMENT_STATE &&
  6343. status !== HCRC_STATE &&
  6344. status !== BUSY_STATE &&
  6345. status !== FINISH_STATE
  6346. ) {
  6347. return err(strm, Z_STREAM_ERROR);
  6348. }
  6349. strm.state = null;
  6350. return status === BUSY_STATE ? err(strm, Z_DATA_ERROR) : Z_OK;
  6351. }
  6352. /* =========================================================================
  6353. * Copy the source state to the destination state
  6354. */
  6355. //function deflateCopy(dest, source) {
  6356. //
  6357. //}
  6358. exports.deflateInit = deflateInit;
  6359. exports.deflateInit2 = deflateInit2;
  6360. exports.deflateReset = deflateReset;
  6361. exports.deflateResetKeep = deflateResetKeep;
  6362. exports.deflateSetHeader = deflateSetHeader;
  6363. exports.deflate = deflate;
  6364. exports.deflateEnd = deflateEnd;
  6365. exports.deflateInfo = 'pako deflate (from Nodeca project)';
  6366. /* Not implemented
  6367. exports.deflateBound = deflateBound;
  6368. exports.deflateCopy = deflateCopy;
  6369. exports.deflateSetDictionary = deflateSetDictionary;
  6370. exports.deflateParams = deflateParams;
  6371. exports.deflatePending = deflatePending;
  6372. exports.deflatePrime = deflatePrime;
  6373. exports.deflateTune = deflateTune;
  6374. */
  6375. },{"../utils/common":27,"./adler32":29,"./crc32":31,"./messages":37,"./trees":38}],33:[function(_dereq_,module,exports){
  6376. 'use strict';
  6377. function GZheader() {
  6378. /* true if compressed data believed to be text */
  6379. this.text = 0;
  6380. /* modification time */
  6381. this.time = 0;
  6382. /* extra flags (not used when writing a gzip file) */
  6383. this.xflags = 0;
  6384. /* operating system */
  6385. this.os = 0;
  6386. /* pointer to extra field or Z_NULL if none */
  6387. this.extra = null;
  6388. /* extra field length (valid if extra != Z_NULL) */
  6389. this.extra_len = 0; // Actually, we don't need it in JS,
  6390. // but leave for few code modifications
  6391. //
  6392. // Setup limits is not necessary because in js we should not preallocate memory
  6393. // for inflate use constant limit in 65536 bytes
  6394. //
  6395. /* space at extra (only when reading header) */
  6396. // this.extra_max = 0;
  6397. /* pointer to zero-terminated file name or Z_NULL */
  6398. this.name = '';
  6399. /* space at name (only when reading header) */
  6400. // this.name_max = 0;
  6401. /* pointer to zero-terminated comment or Z_NULL */
  6402. this.comment = '';
  6403. /* space at comment (only when reading header) */
  6404. // this.comm_max = 0;
  6405. /* true if there was or will be a header crc */
  6406. this.hcrc = 0;
  6407. /* true when done reading gzip header (not used when writing a gzip file) */
  6408. this.done = false;
  6409. }
  6410. module.exports = GZheader;
  6411. },{}],34:[function(_dereq_,module,exports){
  6412. 'use strict';
  6413. // See state defs from inflate.js
  6414. var BAD = 30; /* got a data error -- remain here until reset */
  6415. var TYPE = 12; /* i: waiting for type bits, including last-flag bit */
  6416. /*
  6417. Decode literal, length, and distance codes and write out the resulting
  6418. literal and match bytes until either not enough input or output is
  6419. available, an end-of-block is encountered, or a data error is encountered.
  6420. When large enough input and output buffers are supplied to inflate(), for
  6421. example, a 16K input buffer and a 64K output buffer, more than 95% of the
  6422. inflate execution time is spent in this routine.
  6423. Entry assumptions:
  6424. state.mode === LEN
  6425. strm.avail_in >= 6
  6426. strm.avail_out >= 258
  6427. start >= strm.avail_out
  6428. state.bits < 8
  6429. On return, state.mode is one of:
  6430. LEN -- ran out of enough output space or enough available input
  6431. TYPE -- reached end of block code, inflate() to interpret next block
  6432. BAD -- error in block data
  6433. Notes:
  6434. - The maximum input bits used by a length/distance pair is 15 bits for the
  6435. length code, 5 bits for the length extra, 15 bits for the distance code,
  6436. and 13 bits for the distance extra. This totals 48 bits, or six bytes.
  6437. Therefore if strm.avail_in >= 6, then there is enough input to avoid
  6438. checking for available input while decoding.
  6439. - The maximum bytes that a single length/distance pair can output is 258
  6440. bytes, which is the maximum length that can be coded. inflate_fast()
  6441. requires strm.avail_out >= 258 for each loop to avoid checking for
  6442. output space.
  6443. */
  6444. module.exports = function inflate_fast(strm, start) {
  6445. var state;
  6446. var _in; /* local strm.input */
  6447. var last; /* have enough input while in < last */
  6448. var _out; /* local strm.output */
  6449. var beg; /* inflate()'s initial strm.output */
  6450. var end; /* while out < end, enough space available */
  6451. //#ifdef INFLATE_STRICT
  6452. var dmax; /* maximum distance from zlib header */
  6453. //#endif
  6454. var wsize; /* window size or zero if not using window */
  6455. var whave; /* valid bytes in the window */
  6456. var wnext; /* window write index */
  6457. var window; /* allocated sliding window, if wsize != 0 */
  6458. var hold; /* local strm.hold */
  6459. var bits; /* local strm.bits */
  6460. var lcode; /* local strm.lencode */
  6461. var dcode; /* local strm.distcode */
  6462. var lmask; /* mask for first level of length codes */
  6463. var dmask; /* mask for first level of distance codes */
  6464. var here; /* retrieved table entry */
  6465. var op; /* code bits, operation, extra bits, or */
  6466. /* window position, window bytes to copy */
  6467. var len; /* match length, unused bytes */
  6468. var dist; /* match distance */
  6469. var from; /* where to copy match from */
  6470. var from_source;
  6471. var input, output; // JS specific, because we have no pointers
  6472. /* copy state to local variables */
  6473. state = strm.state;
  6474. //here = state.here;
  6475. _in = strm.next_in;
  6476. input = strm.input;
  6477. last = _in + (strm.avail_in - 5);
  6478. _out = strm.next_out;
  6479. output = strm.output;
  6480. beg = _out - (start - strm.avail_out);
  6481. end = _out + (strm.avail_out - 257);
  6482. //#ifdef INFLATE_STRICT
  6483. dmax = state.dmax;
  6484. //#endif
  6485. wsize = state.wsize;
  6486. whave = state.whave;
  6487. wnext = state.wnext;
  6488. window = state.window;
  6489. hold = state.hold;
  6490. bits = state.bits;
  6491. lcode = state.lencode;
  6492. dcode = state.distcode;
  6493. lmask = (1 << state.lenbits) - 1;
  6494. dmask = (1 << state.distbits) - 1;
  6495. /* decode literals and length/distances until end-of-block or not enough
  6496. input data or output space */
  6497. top:
  6498. do {
  6499. if (bits < 15) {
  6500. hold += input[_in++] << bits;
  6501. bits += 8;
  6502. hold += input[_in++] << bits;
  6503. bits += 8;
  6504. }
  6505. here = lcode[hold & lmask];
  6506. dolen:
  6507. for (;;) { // Goto emulation
  6508. op = here >>> 24/*here.bits*/;
  6509. hold >>>= op;
  6510. bits -= op;
  6511. op = (here >>> 16) & 0xff/*here.op*/;
  6512. if (op === 0) { /* literal */
  6513. //Tracevv((stderr, here.val >= 0x20 && here.val < 0x7f ?
  6514. // "inflate: literal '%c'\n" :
  6515. // "inflate: literal 0x%02x\n", here.val));
  6516. output[_out++] = here & 0xffff/*here.val*/;
  6517. }
  6518. else if (op & 16) { /* length base */
  6519. len = here & 0xffff/*here.val*/;
  6520. op &= 15; /* number of extra bits */
  6521. if (op) {
  6522. if (bits < op) {
  6523. hold += input[_in++] << bits;
  6524. bits += 8;
  6525. }
  6526. len += hold & ((1 << op) - 1);
  6527. hold >>>= op;
  6528. bits -= op;
  6529. }
  6530. //Tracevv((stderr, "inflate: length %u\n", len));
  6531. if (bits < 15) {
  6532. hold += input[_in++] << bits;
  6533. bits += 8;
  6534. hold += input[_in++] << bits;
  6535. bits += 8;
  6536. }
  6537. here = dcode[hold & dmask];
  6538. dodist:
  6539. for (;;) { // goto emulation
  6540. op = here >>> 24/*here.bits*/;
  6541. hold >>>= op;
  6542. bits -= op;
  6543. op = (here >>> 16) & 0xff/*here.op*/;
  6544. if (op & 16) { /* distance base */
  6545. dist = here & 0xffff/*here.val*/;
  6546. op &= 15; /* number of extra bits */
  6547. if (bits < op) {
  6548. hold += input[_in++] << bits;
  6549. bits += 8;
  6550. if (bits < op) {
  6551. hold += input[_in++] << bits;
  6552. bits += 8;
  6553. }
  6554. }
  6555. dist += hold & ((1 << op) - 1);
  6556. //#ifdef INFLATE_STRICT
  6557. if (dist > dmax) {
  6558. strm.msg = 'invalid distance too far back';
  6559. state.mode = BAD;
  6560. break top;
  6561. }
  6562. //#endif
  6563. hold >>>= op;
  6564. bits -= op;
  6565. //Tracevv((stderr, "inflate: distance %u\n", dist));
  6566. op = _out - beg; /* max distance in output */
  6567. if (dist > op) { /* see if copy from window */
  6568. op = dist - op; /* distance back in window */
  6569. if (op > whave) {
  6570. if (state.sane) {
  6571. strm.msg = 'invalid distance too far back';
  6572. state.mode = BAD;
  6573. break top;
  6574. }
  6575. // (!) This block is disabled in zlib defailts,
  6576. // don't enable it for binary compatibility
  6577. //#ifdef INFLATE_ALLOW_INVALID_DISTANCE_TOOFAR_ARRR
  6578. // if (len <= op - whave) {
  6579. // do {
  6580. // output[_out++] = 0;
  6581. // } while (--len);
  6582. // continue top;
  6583. // }
  6584. // len -= op - whave;
  6585. // do {
  6586. // output[_out++] = 0;
  6587. // } while (--op > whave);
  6588. // if (op === 0) {
  6589. // from = _out - dist;
  6590. // do {
  6591. // output[_out++] = output[from++];
  6592. // } while (--len);
  6593. // continue top;
  6594. // }
  6595. //#endif
  6596. }
  6597. from = 0; // window index
  6598. from_source = window;
  6599. if (wnext === 0) { /* very common case */
  6600. from += wsize - op;
  6601. if (op < len) { /* some from window */
  6602. len -= op;
  6603. do {
  6604. output[_out++] = window[from++];
  6605. } while (--op);
  6606. from = _out - dist; /* rest from output */
  6607. from_source = output;
  6608. }
  6609. }
  6610. else if (wnext < op) { /* wrap around window */
  6611. from += wsize + wnext - op;
  6612. op -= wnext;
  6613. if (op < len) { /* some from end of window */
  6614. len -= op;
  6615. do {
  6616. output[_out++] = window[from++];
  6617. } while (--op);
  6618. from = 0;
  6619. if (wnext < len) { /* some from start of window */
  6620. op = wnext;
  6621. len -= op;
  6622. do {
  6623. output[_out++] = window[from++];
  6624. } while (--op);
  6625. from = _out - dist; /* rest from output */
  6626. from_source = output;
  6627. }
  6628. }
  6629. }
  6630. else { /* contiguous in window */
  6631. from += wnext - op;
  6632. if (op < len) { /* some from window */
  6633. len -= op;
  6634. do {
  6635. output[_out++] = window[from++];
  6636. } while (--op);
  6637. from = _out - dist; /* rest from output */
  6638. from_source = output;
  6639. }
  6640. }
  6641. while (len > 2) {
  6642. output[_out++] = from_source[from++];
  6643. output[_out++] = from_source[from++];
  6644. output[_out++] = from_source[from++];
  6645. len -= 3;
  6646. }
  6647. if (len) {
  6648. output[_out++] = from_source[from++];
  6649. if (len > 1) {
  6650. output[_out++] = from_source[from++];
  6651. }
  6652. }
  6653. }
  6654. else {
  6655. from = _out - dist; /* copy direct from output */
  6656. do { /* minimum length is three */
  6657. output[_out++] = output[from++];
  6658. output[_out++] = output[from++];
  6659. output[_out++] = output[from++];
  6660. len -= 3;
  6661. } while (len > 2);
  6662. if (len) {
  6663. output[_out++] = output[from++];
  6664. if (len > 1) {
  6665. output[_out++] = output[from++];
  6666. }
  6667. }
  6668. }
  6669. }
  6670. else if ((op & 64) === 0) { /* 2nd level distance code */
  6671. here = dcode[(here & 0xffff)/*here.val*/ + (hold & ((1 << op) - 1))];
  6672. continue dodist;
  6673. }
  6674. else {
  6675. strm.msg = 'invalid distance code';
  6676. state.mode = BAD;
  6677. break top;
  6678. }
  6679. break; // need to emulate goto via "continue"
  6680. }
  6681. }
  6682. else if ((op & 64) === 0) { /* 2nd level length code */
  6683. here = lcode[(here & 0xffff)/*here.val*/ + (hold & ((1 << op) - 1))];
  6684. continue dolen;
  6685. }
  6686. else if (op & 32) { /* end-of-block */
  6687. //Tracevv((stderr, "inflate: end of block\n"));
  6688. state.mode = TYPE;
  6689. break top;
  6690. }
  6691. else {
  6692. strm.msg = 'invalid literal/length code';
  6693. state.mode = BAD;
  6694. break top;
  6695. }
  6696. break; // need to emulate goto via "continue"
  6697. }
  6698. } while (_in < last && _out < end);
  6699. /* return unused bytes (on entry, bits < 8, so in won't go too far back) */
  6700. len = bits >> 3;
  6701. _in -= len;
  6702. bits -= len << 3;
  6703. hold &= (1 << bits) - 1;
  6704. /* update state and return */
  6705. strm.next_in = _in;
  6706. strm.next_out = _out;
  6707. strm.avail_in = (_in < last ? 5 + (last - _in) : 5 - (_in - last));
  6708. strm.avail_out = (_out < end ? 257 + (end - _out) : 257 - (_out - end));
  6709. state.hold = hold;
  6710. state.bits = bits;
  6711. return;
  6712. };
  6713. },{}],35:[function(_dereq_,module,exports){
  6714. 'use strict';
  6715. var utils = _dereq_('../utils/common');
  6716. var adler32 = _dereq_('./adler32');
  6717. var crc32 = _dereq_('./crc32');
  6718. var inflate_fast = _dereq_('./inffast');
  6719. var inflate_table = _dereq_('./inftrees');
  6720. var CODES = 0;
  6721. var LENS = 1;
  6722. var DISTS = 2;
  6723. /* Public constants ==========================================================*/
  6724. /* ===========================================================================*/
  6725. /* Allowed flush values; see deflate() and inflate() below for details */
  6726. //var Z_NO_FLUSH = 0;
  6727. //var Z_PARTIAL_FLUSH = 1;
  6728. //var Z_SYNC_FLUSH = 2;
  6729. //var Z_FULL_FLUSH = 3;
  6730. var Z_FINISH = 4;
  6731. var Z_BLOCK = 5;
  6732. var Z_TREES = 6;
  6733. /* Return codes for the compression/decompression functions. Negative values
  6734. * are errors, positive values are used for special but normal events.
  6735. */
  6736. var Z_OK = 0;
  6737. var Z_STREAM_END = 1;
  6738. var Z_NEED_DICT = 2;
  6739. //var Z_ERRNO = -1;
  6740. var Z_STREAM_ERROR = -2;
  6741. var Z_DATA_ERROR = -3;
  6742. var Z_MEM_ERROR = -4;
  6743. var Z_BUF_ERROR = -5;
  6744. //var Z_VERSION_ERROR = -6;
  6745. /* The deflate compression method */
  6746. var Z_DEFLATED = 8;
  6747. /* STATES ====================================================================*/
  6748. /* ===========================================================================*/
  6749. var HEAD = 1; /* i: waiting for magic header */
  6750. var FLAGS = 2; /* i: waiting for method and flags (gzip) */
  6751. var TIME = 3; /* i: waiting for modification time (gzip) */
  6752. var OS = 4; /* i: waiting for extra flags and operating system (gzip) */
  6753. var EXLEN = 5; /* i: waiting for extra length (gzip) */
  6754. var EXTRA = 6; /* i: waiting for extra bytes (gzip) */
  6755. var NAME = 7; /* i: waiting for end of file name (gzip) */
  6756. var COMMENT = 8; /* i: waiting for end of comment (gzip) */
  6757. var HCRC = 9; /* i: waiting for header crc (gzip) */
  6758. var DICTID = 10; /* i: waiting for dictionary check value */
  6759. var DICT = 11; /* waiting for inflateSetDictionary() call */
  6760. var TYPE = 12; /* i: waiting for type bits, including last-flag bit */
  6761. var TYPEDO = 13; /* i: same, but skip check to exit inflate on new block */
  6762. var STORED = 14; /* i: waiting for stored size (length and complement) */
  6763. var COPY_ = 15; /* i/o: same as COPY below, but only first time in */
  6764. var COPY = 16; /* i/o: waiting for input or output to copy stored block */
  6765. var TABLE = 17; /* i: waiting for dynamic block table lengths */
  6766. var LENLENS = 18; /* i: waiting for code length code lengths */
  6767. var CODELENS = 19; /* i: waiting for length/lit and distance code lengths */
  6768. var LEN_ = 20; /* i: same as LEN below, but only first time in */
  6769. var LEN = 21; /* i: waiting for length/lit/eob code */
  6770. var LENEXT = 22; /* i: waiting for length extra bits */
  6771. var DIST = 23; /* i: waiting for distance code */
  6772. var DISTEXT = 24; /* i: waiting for distance extra bits */
  6773. var MATCH = 25; /* o: waiting for output space to copy string */
  6774. var LIT = 26; /* o: waiting for output space to write literal */
  6775. var CHECK = 27; /* i: waiting for 32-bit check value */
  6776. var LENGTH = 28; /* i: waiting for 32-bit length (gzip) */
  6777. var DONE = 29; /* finished check, done -- remain here until reset */
  6778. var BAD = 30; /* got a data error -- remain here until reset */
  6779. var MEM = 31; /* got an inflate() memory error -- remain here until reset */
  6780. var SYNC = 32; /* looking for synchronization bytes to restart inflate() */
  6781. /* ===========================================================================*/
  6782. var ENOUGH_LENS = 852;
  6783. var ENOUGH_DISTS = 592;
  6784. //var ENOUGH = (ENOUGH_LENS+ENOUGH_DISTS);
  6785. var MAX_WBITS = 15;
  6786. /* 32K LZ77 window */
  6787. var DEF_WBITS = MAX_WBITS;
  6788. function ZSWAP32(q) {
  6789. return (((q >>> 24) & 0xff) +
  6790. ((q >>> 8) & 0xff00) +
  6791. ((q & 0xff00) << 8) +
  6792. ((q & 0xff) << 24));
  6793. }
  6794. function InflateState() {
  6795. this.mode = 0; /* current inflate mode */
  6796. this.last = false; /* true if processing last block */
  6797. this.wrap = 0; /* bit 0 true for zlib, bit 1 true for gzip */
  6798. this.havedict = false; /* true if dictionary provided */
  6799. this.flags = 0; /* gzip header method and flags (0 if zlib) */
  6800. this.dmax = 0; /* zlib header max distance (INFLATE_STRICT) */
  6801. this.check = 0; /* protected copy of check value */
  6802. this.total = 0; /* protected copy of output count */
  6803. // TODO: may be {}
  6804. this.head = null; /* where to save gzip header information */
  6805. /* sliding window */
  6806. this.wbits = 0; /* log base 2 of requested window size */
  6807. this.wsize = 0; /* window size or zero if not using window */
  6808. this.whave = 0; /* valid bytes in the window */
  6809. this.wnext = 0; /* window write index */
  6810. this.window = null; /* allocated sliding window, if needed */
  6811. /* bit accumulator */
  6812. this.hold = 0; /* input bit accumulator */
  6813. this.bits = 0; /* number of bits in "in" */
  6814. /* for string and stored block copying */
  6815. this.length = 0; /* literal or length of data to copy */
  6816. this.offset = 0; /* distance back to copy string from */
  6817. /* for table and code decoding */
  6818. this.extra = 0; /* extra bits needed */
  6819. /* fixed and dynamic code tables */
  6820. this.lencode = null; /* starting table for length/literal codes */
  6821. this.distcode = null; /* starting table for distance codes */
  6822. this.lenbits = 0; /* index bits for lencode */
  6823. this.distbits = 0; /* index bits for distcode */
  6824. /* dynamic table building */
  6825. this.ncode = 0; /* number of code length code lengths */
  6826. this.nlen = 0; /* number of length code lengths */
  6827. this.ndist = 0; /* number of distance code lengths */
  6828. this.have = 0; /* number of code lengths in lens[] */
  6829. this.next = null; /* next available space in codes[] */
  6830. this.lens = new utils.Buf16(320); /* temporary storage for code lengths */
  6831. this.work = new utils.Buf16(288); /* work area for code table building */
  6832. /*
  6833. because we don't have pointers in js, we use lencode and distcode directly
  6834. as buffers so we don't need codes
  6835. */
  6836. //this.codes = new utils.Buf32(ENOUGH); /* space for code tables */
  6837. this.lendyn = null; /* dynamic table for length/literal codes (JS specific) */
  6838. this.distdyn = null; /* dynamic table for distance codes (JS specific) */
  6839. this.sane = 0; /* if false, allow invalid distance too far */
  6840. this.back = 0; /* bits back of last unprocessed length/lit */
  6841. this.was = 0; /* initial length of match */
  6842. }
  6843. function inflateResetKeep(strm) {
  6844. var state;
  6845. if (!strm || !strm.state) { return Z_STREAM_ERROR; }
  6846. state = strm.state;
  6847. strm.total_in = strm.total_out = state.total = 0;
  6848. strm.msg = ''; /*Z_NULL*/
  6849. if (state.wrap) { /* to support ill-conceived Java test suite */
  6850. strm.adler = state.wrap & 1;
  6851. }
  6852. state.mode = HEAD;
  6853. state.last = 0;
  6854. state.havedict = 0;
  6855. state.dmax = 32768;
  6856. state.head = null/*Z_NULL*/;
  6857. state.hold = 0;
  6858. state.bits = 0;
  6859. //state.lencode = state.distcode = state.next = state.codes;
  6860. state.lencode = state.lendyn = new utils.Buf32(ENOUGH_LENS);
  6861. state.distcode = state.distdyn = new utils.Buf32(ENOUGH_DISTS);
  6862. state.sane = 1;
  6863. state.back = -1;
  6864. //Tracev((stderr, "inflate: reset\n"));
  6865. return Z_OK;
  6866. }
  6867. function inflateReset(strm) {
  6868. var state;
  6869. if (!strm || !strm.state) { return Z_STREAM_ERROR; }
  6870. state = strm.state;
  6871. state.wsize = 0;
  6872. state.whave = 0;
  6873. state.wnext = 0;
  6874. return inflateResetKeep(strm);
  6875. }
  6876. function inflateReset2(strm, windowBits) {
  6877. var wrap;
  6878. var state;
  6879. /* get the state */
  6880. if (!strm || !strm.state) { return Z_STREAM_ERROR; }
  6881. state = strm.state;
  6882. /* extract wrap request from windowBits parameter */
  6883. if (windowBits < 0) {
  6884. wrap = 0;
  6885. windowBits = -windowBits;
  6886. }
  6887. else {
  6888. wrap = (windowBits >> 4) + 1;
  6889. if (windowBits < 48) {
  6890. windowBits &= 15;
  6891. }
  6892. }
  6893. /* set number of window bits, free window if different */
  6894. if (windowBits && (windowBits < 8 || windowBits > 15)) {
  6895. return Z_STREAM_ERROR;
  6896. }
  6897. if (state.window !== null && state.wbits !== windowBits) {
  6898. state.window = null;
  6899. }
  6900. /* update state and reset the rest of it */
  6901. state.wrap = wrap;
  6902. state.wbits = windowBits;
  6903. return inflateReset(strm);
  6904. }
  6905. function inflateInit2(strm, windowBits) {
  6906. var ret;
  6907. var state;
  6908. if (!strm) { return Z_STREAM_ERROR; }
  6909. //strm.msg = Z_NULL; /* in case we return an error */
  6910. state = new InflateState();
  6911. //if (state === Z_NULL) return Z_MEM_ERROR;
  6912. //Tracev((stderr, "inflate: allocated\n"));
  6913. strm.state = state;
  6914. state.window = null/*Z_NULL*/;
  6915. ret = inflateReset2(strm, windowBits);
  6916. if (ret !== Z_OK) {
  6917. strm.state = null/*Z_NULL*/;
  6918. }
  6919. return ret;
  6920. }
  6921. function inflateInit(strm) {
  6922. return inflateInit2(strm, DEF_WBITS);
  6923. }
  6924. /*
  6925. Return state with length and distance decoding tables and index sizes set to
  6926. fixed code decoding. Normally this returns fixed tables from inffixed.h.
  6927. If BUILDFIXED is defined, then instead this routine builds the tables the
  6928. first time it's called, and returns those tables the first time and
  6929. thereafter. This reduces the size of the code by about 2K bytes, in
  6930. exchange for a little execution time. However, BUILDFIXED should not be
  6931. used for threaded applications, since the rewriting of the tables and virgin
  6932. may not be thread-safe.
  6933. */
  6934. var virgin = true;
  6935. var lenfix, distfix; // We have no pointers in JS, so keep tables separate
  6936. function fixedtables(state) {
  6937. /* build fixed huffman tables if first call (may not be thread safe) */
  6938. if (virgin) {
  6939. var sym;
  6940. lenfix = new utils.Buf32(512);
  6941. distfix = new utils.Buf32(32);
  6942. /* literal/length table */
  6943. sym = 0;
  6944. while (sym < 144) { state.lens[sym++] = 8; }
  6945. while (sym < 256) { state.lens[sym++] = 9; }
  6946. while (sym < 280) { state.lens[sym++] = 7; }
  6947. while (sym < 288) { state.lens[sym++] = 8; }
  6948. inflate_table(LENS, state.lens, 0, 288, lenfix, 0, state.work, {bits: 9});
  6949. /* distance table */
  6950. sym = 0;
  6951. while (sym < 32) { state.lens[sym++] = 5; }
  6952. inflate_table(DISTS, state.lens, 0, 32, distfix, 0, state.work, {bits: 5});
  6953. /* do this just once */
  6954. virgin = false;
  6955. }
  6956. state.lencode = lenfix;
  6957. state.lenbits = 9;
  6958. state.distcode = distfix;
  6959. state.distbits = 5;
  6960. }
  6961. /*
  6962. Update the window with the last wsize (normally 32K) bytes written before
  6963. returning. If window does not exist yet, create it. This is only called
  6964. when a window is already in use, or when output has been written during this
  6965. inflate call, but the end of the deflate stream has not been reached yet.
  6966. It is also called to create a window for dictionary data when a dictionary
  6967. is loaded.
  6968. Providing output buffers larger than 32K to inflate() should provide a speed
  6969. advantage, since only the last 32K of output is copied to the sliding window
  6970. upon return from inflate(), and since all distances after the first 32K of
  6971. output will fall in the output data, making match copies simpler and faster.
  6972. The advantage may be dependent on the size of the processor's data caches.
  6973. */
  6974. function updatewindow(strm, src, end, copy) {
  6975. var dist;
  6976. var state = strm.state;
  6977. /* if it hasn't been done already, allocate space for the window */
  6978. if (state.window === null) {
  6979. state.wsize = 1 << state.wbits;
  6980. state.wnext = 0;
  6981. state.whave = 0;
  6982. state.window = new utils.Buf8(state.wsize);
  6983. }
  6984. /* copy state->wsize or less output bytes into the circular window */
  6985. if (copy >= state.wsize) {
  6986. utils.arraySet(state.window,src, end - state.wsize, state.wsize, 0);
  6987. state.wnext = 0;
  6988. state.whave = state.wsize;
  6989. }
  6990. else {
  6991. dist = state.wsize - state.wnext;
  6992. if (dist > copy) {
  6993. dist = copy;
  6994. }
  6995. //zmemcpy(state->window + state->wnext, end - copy, dist);
  6996. utils.arraySet(state.window,src, end - copy, dist, state.wnext);
  6997. copy -= dist;
  6998. if (copy) {
  6999. //zmemcpy(state->window, end - copy, copy);
  7000. utils.arraySet(state.window,src, end - copy, copy, 0);
  7001. state.wnext = copy;
  7002. state.whave = state.wsize;
  7003. }
  7004. else {
  7005. state.wnext += dist;
  7006. if (state.wnext === state.wsize) { state.wnext = 0; }
  7007. if (state.whave < state.wsize) { state.whave += dist; }
  7008. }
  7009. }
  7010. return 0;
  7011. }
  7012. function inflate(strm, flush) {
  7013. var state;
  7014. var input, output; // input/output buffers
  7015. var next; /* next input INDEX */
  7016. var put; /* next output INDEX */
  7017. var have, left; /* available input and output */
  7018. var hold; /* bit buffer */
  7019. var bits; /* bits in bit buffer */
  7020. var _in, _out; /* save starting available input and output */
  7021. var copy; /* number of stored or match bytes to copy */
  7022. var from; /* where to copy match bytes from */
  7023. var from_source;
  7024. var here = 0; /* current decoding table entry */
  7025. var here_bits, here_op, here_val; // paked "here" denormalized (JS specific)
  7026. //var last; /* parent table entry */
  7027. var last_bits, last_op, last_val; // paked "last" denormalized (JS specific)
  7028. var len; /* length to copy for repeats, bits to drop */
  7029. var ret; /* return code */
  7030. var hbuf = new utils.Buf8(4); /* buffer for gzip header crc calculation */
  7031. var opts;
  7032. var n; // temporary var for NEED_BITS
  7033. var order = /* permutation of code lengths */
  7034. [16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15];
  7035. if (!strm || !strm.state || !strm.output ||
  7036. (!strm.input && strm.avail_in !== 0)) {
  7037. return Z_STREAM_ERROR;
  7038. }
  7039. state = strm.state;
  7040. if (state.mode === TYPE) { state.mode = TYPEDO; } /* skip check */
  7041. //--- LOAD() ---
  7042. put = strm.next_out;
  7043. output = strm.output;
  7044. left = strm.avail_out;
  7045. next = strm.next_in;
  7046. input = strm.input;
  7047. have = strm.avail_in;
  7048. hold = state.hold;
  7049. bits = state.bits;
  7050. //---
  7051. _in = have;
  7052. _out = left;
  7053. ret = Z_OK;
  7054. inf_leave: // goto emulation
  7055. for (;;) {
  7056. switch (state.mode) {
  7057. case HEAD:
  7058. if (state.wrap === 0) {
  7059. state.mode = TYPEDO;
  7060. break;
  7061. }
  7062. //=== NEEDBITS(16);
  7063. while (bits < 16) {
  7064. if (have === 0) { break inf_leave; }
  7065. have--;
  7066. hold += input[next++] << bits;
  7067. bits += 8;
  7068. }
  7069. //===//
  7070. if ((state.wrap & 2) && hold === 0x8b1f) { /* gzip header */
  7071. state.check = 0/*crc32(0L, Z_NULL, 0)*/;
  7072. //=== CRC2(state.check, hold);
  7073. hbuf[0] = hold & 0xff;
  7074. hbuf[1] = (hold >>> 8) & 0xff;
  7075. state.check = crc32(state.check, hbuf, 2, 0);
  7076. //===//
  7077. //=== INITBITS();
  7078. hold = 0;
  7079. bits = 0;
  7080. //===//
  7081. state.mode = FLAGS;
  7082. break;
  7083. }
  7084. state.flags = 0; /* expect zlib header */
  7085. if (state.head) {
  7086. state.head.done = false;
  7087. }
  7088. if (!(state.wrap & 1) || /* check if zlib header allowed */
  7089. (((hold & 0xff)/*BITS(8)*/ << 8) + (hold >> 8)) % 31) {
  7090. strm.msg = 'incorrect header check';
  7091. state.mode = BAD;
  7092. break;
  7093. }
  7094. if ((hold & 0x0f)/*BITS(4)*/ !== Z_DEFLATED) {
  7095. strm.msg = 'unknown compression method';
  7096. state.mode = BAD;
  7097. break;
  7098. }
  7099. //--- DROPBITS(4) ---//
  7100. hold >>>= 4;
  7101. bits -= 4;
  7102. //---//
  7103. len = (hold & 0x0f)/*BITS(4)*/ + 8;
  7104. if (state.wbits === 0) {
  7105. state.wbits = len;
  7106. }
  7107. else if (len > state.wbits) {
  7108. strm.msg = 'invalid window size';
  7109. state.mode = BAD;
  7110. break;
  7111. }
  7112. state.dmax = 1 << len;
  7113. //Tracev((stderr, "inflate: zlib header ok\n"));
  7114. strm.adler = state.check = 1/*adler32(0L, Z_NULL, 0)*/;
  7115. state.mode = hold & 0x200 ? DICTID : TYPE;
  7116. //=== INITBITS();
  7117. hold = 0;
  7118. bits = 0;
  7119. //===//
  7120. break;
  7121. case FLAGS:
  7122. //=== NEEDBITS(16); */
  7123. while (bits < 16) {
  7124. if (have === 0) { break inf_leave; }
  7125. have--;
  7126. hold += input[next++] << bits;
  7127. bits += 8;
  7128. }
  7129. //===//
  7130. state.flags = hold;
  7131. if ((state.flags & 0xff) !== Z_DEFLATED) {
  7132. strm.msg = 'unknown compression method';
  7133. state.mode = BAD;
  7134. break;
  7135. }
  7136. if (state.flags & 0xe000) {
  7137. strm.msg = 'unknown header flags set';
  7138. state.mode = BAD;
  7139. break;
  7140. }
  7141. if (state.head) {
  7142. state.head.text = ((hold >> 8) & 1);
  7143. }
  7144. if (state.flags & 0x0200) {
  7145. //=== CRC2(state.check, hold);
  7146. hbuf[0] = hold & 0xff;
  7147. hbuf[1] = (hold >>> 8) & 0xff;
  7148. state.check = crc32(state.check, hbuf, 2, 0);
  7149. //===//
  7150. }
  7151. //=== INITBITS();
  7152. hold = 0;
  7153. bits = 0;
  7154. //===//
  7155. state.mode = TIME;
  7156. /* falls through */
  7157. case TIME:
  7158. //=== NEEDBITS(32); */
  7159. while (bits < 32) {
  7160. if (have === 0) { break inf_leave; }
  7161. have--;
  7162. hold += input[next++] << bits;
  7163. bits += 8;
  7164. }
  7165. //===//
  7166. if (state.head) {
  7167. state.head.time = hold;
  7168. }
  7169. if (state.flags & 0x0200) {
  7170. //=== CRC4(state.check, hold)
  7171. hbuf[0] = hold & 0xff;
  7172. hbuf[1] = (hold >>> 8) & 0xff;
  7173. hbuf[2] = (hold >>> 16) & 0xff;
  7174. hbuf[3] = (hold >>> 24) & 0xff;
  7175. state.check = crc32(state.check, hbuf, 4, 0);
  7176. //===
  7177. }
  7178. //=== INITBITS();
  7179. hold = 0;
  7180. bits = 0;
  7181. //===//
  7182. state.mode = OS;
  7183. /* falls through */
  7184. case OS:
  7185. //=== NEEDBITS(16); */
  7186. while (bits < 16) {
  7187. if (have === 0) { break inf_leave; }
  7188. have--;
  7189. hold += input[next++] << bits;
  7190. bits += 8;
  7191. }
  7192. //===//
  7193. if (state.head) {
  7194. state.head.xflags = (hold & 0xff);
  7195. state.head.os = (hold >> 8);
  7196. }
  7197. if (state.flags & 0x0200) {
  7198. //=== CRC2(state.check, hold);
  7199. hbuf[0] = hold & 0xff;
  7200. hbuf[1] = (hold >>> 8) & 0xff;
  7201. state.check = crc32(state.check, hbuf, 2, 0);
  7202. //===//
  7203. }
  7204. //=== INITBITS();
  7205. hold = 0;
  7206. bits = 0;
  7207. //===//
  7208. state.mode = EXLEN;
  7209. /* falls through */
  7210. case EXLEN:
  7211. if (state.flags & 0x0400) {
  7212. //=== NEEDBITS(16); */
  7213. while (bits < 16) {
  7214. if (have === 0) { break inf_leave; }
  7215. have--;
  7216. hold += input[next++] << bits;
  7217. bits += 8;
  7218. }
  7219. //===//
  7220. state.length = hold;
  7221. if (state.head) {
  7222. state.head.extra_len = hold;
  7223. }
  7224. if (state.flags & 0x0200) {
  7225. //=== CRC2(state.check, hold);
  7226. hbuf[0] = hold & 0xff;
  7227. hbuf[1] = (hold >>> 8) & 0xff;
  7228. state.check = crc32(state.check, hbuf, 2, 0);
  7229. //===//
  7230. }
  7231. //=== INITBITS();
  7232. hold = 0;
  7233. bits = 0;
  7234. //===//
  7235. }
  7236. else if (state.head) {
  7237. state.head.extra = null/*Z_NULL*/;
  7238. }
  7239. state.mode = EXTRA;
  7240. /* falls through */
  7241. case EXTRA:
  7242. if (state.flags & 0x0400) {
  7243. copy = state.length;
  7244. if (copy > have) { copy = have; }
  7245. if (copy) {
  7246. if (state.head) {
  7247. len = state.head.extra_len - state.length;
  7248. if (!state.head.extra) {
  7249. // Use untyped array for more conveniend processing later
  7250. state.head.extra = new Array(state.head.extra_len);
  7251. }
  7252. utils.arraySet(
  7253. state.head.extra,
  7254. input,
  7255. next,
  7256. // extra field is limited to 65536 bytes
  7257. // - no need for additional size check
  7258. copy,
  7259. /*len + copy > state.head.extra_max - len ? state.head.extra_max : copy,*/
  7260. len
  7261. );
  7262. //zmemcpy(state.head.extra + len, next,
  7263. // len + copy > state.head.extra_max ?
  7264. // state.head.extra_max - len : copy);
  7265. }
  7266. if (state.flags & 0x0200) {
  7267. state.check = crc32(state.check, input, copy, next);
  7268. }
  7269. have -= copy;
  7270. next += copy;
  7271. state.length -= copy;
  7272. }
  7273. if (state.length) { break inf_leave; }
  7274. }
  7275. state.length = 0;
  7276. state.mode = NAME;
  7277. /* falls through */
  7278. case NAME:
  7279. if (state.flags & 0x0800) {
  7280. if (have === 0) { break inf_leave; }
  7281. copy = 0;
  7282. do {
  7283. // TODO: 2 or 1 bytes?
  7284. len = input[next + copy++];
  7285. /* use constant limit because in js we should not preallocate memory */
  7286. if (state.head && len &&
  7287. (state.length < 65536 /*state.head.name_max*/)) {
  7288. state.head.name += String.fromCharCode(len);
  7289. }
  7290. } while (len && copy < have);
  7291. if (state.flags & 0x0200) {
  7292. state.check = crc32(state.check, input, copy, next);
  7293. }
  7294. have -= copy;
  7295. next += copy;
  7296. if (len) { break inf_leave; }
  7297. }
  7298. else if (state.head) {
  7299. state.head.name = null;
  7300. }
  7301. state.length = 0;
  7302. state.mode = COMMENT;
  7303. /* falls through */
  7304. case COMMENT:
  7305. if (state.flags & 0x1000) {
  7306. if (have === 0) { break inf_leave; }
  7307. copy = 0;
  7308. do {
  7309. len = input[next + copy++];
  7310. /* use constant limit because in js we should not preallocate memory */
  7311. if (state.head && len &&
  7312. (state.length < 65536 /*state.head.comm_max*/)) {
  7313. state.head.comment += String.fromCharCode(len);
  7314. }
  7315. } while (len && copy < have);
  7316. if (state.flags & 0x0200) {
  7317. state.check = crc32(state.check, input, copy, next);
  7318. }
  7319. have -= copy;
  7320. next += copy;
  7321. if (len) { break inf_leave; }
  7322. }
  7323. else if (state.head) {
  7324. state.head.comment = null;
  7325. }
  7326. state.mode = HCRC;
  7327. /* falls through */
  7328. case HCRC:
  7329. if (state.flags & 0x0200) {
  7330. //=== NEEDBITS(16); */
  7331. while (bits < 16) {
  7332. if (have === 0) { break inf_leave; }
  7333. have--;
  7334. hold += input[next++] << bits;
  7335. bits += 8;
  7336. }
  7337. //===//
  7338. if (hold !== (state.check & 0xffff)) {
  7339. strm.msg = 'header crc mismatch';
  7340. state.mode = BAD;
  7341. break;
  7342. }
  7343. //=== INITBITS();
  7344. hold = 0;
  7345. bits = 0;
  7346. //===//
  7347. }
  7348. if (state.head) {
  7349. state.head.hcrc = ((state.flags >> 9) & 1);
  7350. state.head.done = true;
  7351. }
  7352. strm.adler = state.check = 0 /*crc32(0L, Z_NULL, 0)*/;
  7353. state.mode = TYPE;
  7354. break;
  7355. case DICTID:
  7356. //=== NEEDBITS(32); */
  7357. while (bits < 32) {
  7358. if (have === 0) { break inf_leave; }
  7359. have--;
  7360. hold += input[next++] << bits;
  7361. bits += 8;
  7362. }
  7363. //===//
  7364. strm.adler = state.check = ZSWAP32(hold);
  7365. //=== INITBITS();
  7366. hold = 0;
  7367. bits = 0;
  7368. //===//
  7369. state.mode = DICT;
  7370. /* falls through */
  7371. case DICT:
  7372. if (state.havedict === 0) {
  7373. //--- RESTORE() ---
  7374. strm.next_out = put;
  7375. strm.avail_out = left;
  7376. strm.next_in = next;
  7377. strm.avail_in = have;
  7378. state.hold = hold;
  7379. state.bits = bits;
  7380. //---
  7381. return Z_NEED_DICT;
  7382. }
  7383. strm.adler = state.check = 1/*adler32(0L, Z_NULL, 0)*/;
  7384. state.mode = TYPE;
  7385. /* falls through */
  7386. case TYPE:
  7387. if (flush === Z_BLOCK || flush === Z_TREES) { break inf_leave; }
  7388. /* falls through */
  7389. case TYPEDO:
  7390. if (state.last) {
  7391. //--- BYTEBITS() ---//
  7392. hold >>>= bits & 7;
  7393. bits -= bits & 7;
  7394. //---//
  7395. state.mode = CHECK;
  7396. break;
  7397. }
  7398. //=== NEEDBITS(3); */
  7399. while (bits < 3) {
  7400. if (have === 0) { break inf_leave; }
  7401. have--;
  7402. hold += input[next++] << bits;
  7403. bits += 8;
  7404. }
  7405. //===//
  7406. state.last = (hold & 0x01)/*BITS(1)*/;
  7407. //--- DROPBITS(1) ---//
  7408. hold >>>= 1;
  7409. bits -= 1;
  7410. //---//
  7411. switch ((hold & 0x03)/*BITS(2)*/) {
  7412. case 0: /* stored block */
  7413. //Tracev((stderr, "inflate: stored block%s\n",
  7414. // state.last ? " (last)" : ""));
  7415. state.mode = STORED;
  7416. break;
  7417. case 1: /* fixed block */
  7418. fixedtables(state);
  7419. //Tracev((stderr, "inflate: fixed codes block%s\n",
  7420. // state.last ? " (last)" : ""));
  7421. state.mode = LEN_; /* decode codes */
  7422. if (flush === Z_TREES) {
  7423. //--- DROPBITS(2) ---//
  7424. hold >>>= 2;
  7425. bits -= 2;
  7426. //---//
  7427. break inf_leave;
  7428. }
  7429. break;
  7430. case 2: /* dynamic block */
  7431. //Tracev((stderr, "inflate: dynamic codes block%s\n",
  7432. // state.last ? " (last)" : ""));
  7433. state.mode = TABLE;
  7434. break;
  7435. case 3:
  7436. strm.msg = 'invalid block type';
  7437. state.mode = BAD;
  7438. }
  7439. //--- DROPBITS(2) ---//
  7440. hold >>>= 2;
  7441. bits -= 2;
  7442. //---//
  7443. break;
  7444. case STORED:
  7445. //--- BYTEBITS() ---// /* go to byte boundary */
  7446. hold >>>= bits & 7;
  7447. bits -= bits & 7;
  7448. //---//
  7449. //=== NEEDBITS(32); */
  7450. while (bits < 32) {
  7451. if (have === 0) { break inf_leave; }
  7452. have--;
  7453. hold += input[next++] << bits;
  7454. bits += 8;
  7455. }
  7456. //===//
  7457. if ((hold & 0xffff) !== ((hold >>> 16) ^ 0xffff)) {
  7458. strm.msg = 'invalid stored block lengths';
  7459. state.mode = BAD;
  7460. break;
  7461. }
  7462. state.length = hold & 0xffff;
  7463. //Tracev((stderr, "inflate: stored length %u\n",
  7464. // state.length));
  7465. //=== INITBITS();
  7466. hold = 0;
  7467. bits = 0;
  7468. //===//
  7469. state.mode = COPY_;
  7470. if (flush === Z_TREES) { break inf_leave; }
  7471. /* falls through */
  7472. case COPY_:
  7473. state.mode = COPY;
  7474. /* falls through */
  7475. case COPY:
  7476. copy = state.length;
  7477. if (copy) {
  7478. if (copy > have) { copy = have; }
  7479. if (copy > left) { copy = left; }
  7480. if (copy === 0) { break inf_leave; }
  7481. //--- zmemcpy(put, next, copy); ---
  7482. utils.arraySet(output, input, next, copy, put);
  7483. //---//
  7484. have -= copy;
  7485. next += copy;
  7486. left -= copy;
  7487. put += copy;
  7488. state.length -= copy;
  7489. break;
  7490. }
  7491. //Tracev((stderr, "inflate: stored end\n"));
  7492. state.mode = TYPE;
  7493. break;
  7494. case TABLE:
  7495. //=== NEEDBITS(14); */
  7496. while (bits < 14) {
  7497. if (have === 0) { break inf_leave; }
  7498. have--;
  7499. hold += input[next++] << bits;
  7500. bits += 8;
  7501. }
  7502. //===//
  7503. state.nlen = (hold & 0x1f)/*BITS(5)*/ + 257;
  7504. //--- DROPBITS(5) ---//
  7505. hold >>>= 5;
  7506. bits -= 5;
  7507. //---//
  7508. state.ndist = (hold & 0x1f)/*BITS(5)*/ + 1;
  7509. //--- DROPBITS(5) ---//
  7510. hold >>>= 5;
  7511. bits -= 5;
  7512. //---//
  7513. state.ncode = (hold & 0x0f)/*BITS(4)*/ + 4;
  7514. //--- DROPBITS(4) ---//
  7515. hold >>>= 4;
  7516. bits -= 4;
  7517. //---//
  7518. //#ifndef PKZIP_BUG_WORKAROUND
  7519. if (state.nlen > 286 || state.ndist > 30) {
  7520. strm.msg = 'too many length or distance symbols';
  7521. state.mode = BAD;
  7522. break;
  7523. }
  7524. //#endif
  7525. //Tracev((stderr, "inflate: table sizes ok\n"));
  7526. state.have = 0;
  7527. state.mode = LENLENS;
  7528. /* falls through */
  7529. case LENLENS:
  7530. while (state.have < state.ncode) {
  7531. //=== NEEDBITS(3);
  7532. while (bits < 3) {
  7533. if (have === 0) { break inf_leave; }
  7534. have--;
  7535. hold += input[next++] << bits;
  7536. bits += 8;
  7537. }
  7538. //===//
  7539. state.lens[order[state.have++]] = (hold & 0x07);//BITS(3);
  7540. //--- DROPBITS(3) ---//
  7541. hold >>>= 3;
  7542. bits -= 3;
  7543. //---//
  7544. }
  7545. while (state.have < 19) {
  7546. state.lens[order[state.have++]] = 0;
  7547. }
  7548. // We have separate tables & no pointers. 2 commented lines below not needed.
  7549. //state.next = state.codes;
  7550. //state.lencode = state.next;
  7551. // Switch to use dynamic table
  7552. state.lencode = state.lendyn;
  7553. state.lenbits = 7;
  7554. opts = {bits: state.lenbits};
  7555. ret = inflate_table(CODES, state.lens, 0, 19, state.lencode, 0, state.work, opts);
  7556. state.lenbits = opts.bits;
  7557. if (ret) {
  7558. strm.msg = 'invalid code lengths set';
  7559. state.mode = BAD;
  7560. break;
  7561. }
  7562. //Tracev((stderr, "inflate: code lengths ok\n"));
  7563. state.have = 0;
  7564. state.mode = CODELENS;
  7565. /* falls through */
  7566. case CODELENS:
  7567. while (state.have < state.nlen + state.ndist) {
  7568. for (;;) {
  7569. here = state.lencode[hold & ((1 << state.lenbits) - 1)];/*BITS(state.lenbits)*/
  7570. here_bits = here >>> 24;
  7571. here_op = (here >>> 16) & 0xff;
  7572. here_val = here & 0xffff;
  7573. if ((here_bits) <= bits) { break; }
  7574. //--- PULLBYTE() ---//
  7575. if (have === 0) { break inf_leave; }
  7576. have--;
  7577. hold += input[next++] << bits;
  7578. bits += 8;
  7579. //---//
  7580. }
  7581. if (here_val < 16) {
  7582. //--- DROPBITS(here.bits) ---//
  7583. hold >>>= here_bits;
  7584. bits -= here_bits;
  7585. //---//
  7586. state.lens[state.have++] = here_val;
  7587. }
  7588. else {
  7589. if (here_val === 16) {
  7590. //=== NEEDBITS(here.bits + 2);
  7591. n = here_bits + 2;
  7592. while (bits < n) {
  7593. if (have === 0) { break inf_leave; }
  7594. have--;
  7595. hold += input[next++] << bits;
  7596. bits += 8;
  7597. }
  7598. //===//
  7599. //--- DROPBITS(here.bits) ---//
  7600. hold >>>= here_bits;
  7601. bits -= here_bits;
  7602. //---//
  7603. if (state.have === 0) {
  7604. strm.msg = 'invalid bit length repeat';
  7605. state.mode = BAD;
  7606. break;
  7607. }
  7608. len = state.lens[state.have - 1];
  7609. copy = 3 + (hold & 0x03);//BITS(2);
  7610. //--- DROPBITS(2) ---//
  7611. hold >>>= 2;
  7612. bits -= 2;
  7613. //---//
  7614. }
  7615. else if (here_val === 17) {
  7616. //=== NEEDBITS(here.bits + 3);
  7617. n = here_bits + 3;
  7618. while (bits < n) {
  7619. if (have === 0) { break inf_leave; }
  7620. have--;
  7621. hold += input[next++] << bits;
  7622. bits += 8;
  7623. }
  7624. //===//
  7625. //--- DROPBITS(here.bits) ---//
  7626. hold >>>= here_bits;
  7627. bits -= here_bits;
  7628. //---//
  7629. len = 0;
  7630. copy = 3 + (hold & 0x07);//BITS(3);
  7631. //--- DROPBITS(3) ---//
  7632. hold >>>= 3;
  7633. bits -= 3;
  7634. //---//
  7635. }
  7636. else {
  7637. //=== NEEDBITS(here.bits + 7);
  7638. n = here_bits + 7;
  7639. while (bits < n) {
  7640. if (have === 0) { break inf_leave; }
  7641. have--;
  7642. hold += input[next++] << bits;
  7643. bits += 8;
  7644. }
  7645. //===//
  7646. //--- DROPBITS(here.bits) ---//
  7647. hold >>>= here_bits;
  7648. bits -= here_bits;
  7649. //---//
  7650. len = 0;
  7651. copy = 11 + (hold & 0x7f);//BITS(7);
  7652. //--- DROPBITS(7) ---//
  7653. hold >>>= 7;
  7654. bits -= 7;
  7655. //---//
  7656. }
  7657. if (state.have + copy > state.nlen + state.ndist) {
  7658. strm.msg = 'invalid bit length repeat';
  7659. state.mode = BAD;
  7660. break;
  7661. }
  7662. while (copy--) {
  7663. state.lens[state.have++] = len;
  7664. }
  7665. }
  7666. }
  7667. /* handle error breaks in while */
  7668. if (state.mode === BAD) { break; }
  7669. /* check for end-of-block code (better have one) */
  7670. if (state.lens[256] === 0) {
  7671. strm.msg = 'invalid code -- missing end-of-block';
  7672. state.mode = BAD;
  7673. break;
  7674. }
  7675. /* build code tables -- note: do not change the lenbits or distbits
  7676. values here (9 and 6) without reading the comments in inftrees.h
  7677. concerning the ENOUGH constants, which depend on those values */
  7678. state.lenbits = 9;
  7679. opts = {bits: state.lenbits};
  7680. ret = inflate_table(LENS, state.lens, 0, state.nlen, state.lencode, 0, state.work, opts);
  7681. // We have separate tables & no pointers. 2 commented lines below not needed.
  7682. // state.next_index = opts.table_index;
  7683. state.lenbits = opts.bits;
  7684. // state.lencode = state.next;
  7685. if (ret) {
  7686. strm.msg = 'invalid literal/lengths set';
  7687. state.mode = BAD;
  7688. break;
  7689. }
  7690. state.distbits = 6;
  7691. //state.distcode.copy(state.codes);
  7692. // Switch to use dynamic table
  7693. state.distcode = state.distdyn;
  7694. opts = {bits: state.distbits};
  7695. ret = inflate_table(DISTS, state.lens, state.nlen, state.ndist, state.distcode, 0, state.work, opts);
  7696. // We have separate tables & no pointers. 2 commented lines below not needed.
  7697. // state.next_index = opts.table_index;
  7698. state.distbits = opts.bits;
  7699. // state.distcode = state.next;
  7700. if (ret) {
  7701. strm.msg = 'invalid distances set';
  7702. state.mode = BAD;
  7703. break;
  7704. }
  7705. //Tracev((stderr, 'inflate: codes ok\n'));
  7706. state.mode = LEN_;
  7707. if (flush === Z_TREES) { break inf_leave; }
  7708. /* falls through */
  7709. case LEN_:
  7710. state.mode = LEN;
  7711. /* falls through */
  7712. case LEN:
  7713. if (have >= 6 && left >= 258) {
  7714. //--- RESTORE() ---
  7715. strm.next_out = put;
  7716. strm.avail_out = left;
  7717. strm.next_in = next;
  7718. strm.avail_in = have;
  7719. state.hold = hold;
  7720. state.bits = bits;
  7721. //---
  7722. inflate_fast(strm, _out);
  7723. //--- LOAD() ---
  7724. put = strm.next_out;
  7725. output = strm.output;
  7726. left = strm.avail_out;
  7727. next = strm.next_in;
  7728. input = strm.input;
  7729. have = strm.avail_in;
  7730. hold = state.hold;
  7731. bits = state.bits;
  7732. //---
  7733. if (state.mode === TYPE) {
  7734. state.back = -1;
  7735. }
  7736. break;
  7737. }
  7738. state.back = 0;
  7739. for (;;) {
  7740. here = state.lencode[hold & ((1 << state.lenbits) -1)]; /*BITS(state.lenbits)*/
  7741. here_bits = here >>> 24;
  7742. here_op = (here >>> 16) & 0xff;
  7743. here_val = here & 0xffff;
  7744. if (here_bits <= bits) { break; }
  7745. //--- PULLBYTE() ---//
  7746. if (have === 0) { break inf_leave; }
  7747. have--;
  7748. hold += input[next++] << bits;
  7749. bits += 8;
  7750. //---//
  7751. }
  7752. if (here_op && (here_op & 0xf0) === 0) {
  7753. last_bits = here_bits;
  7754. last_op = here_op;
  7755. last_val = here_val;
  7756. for (;;) {
  7757. here = state.lencode[last_val +
  7758. ((hold & ((1 << (last_bits + last_op)) -1))/*BITS(last.bits + last.op)*/ >> last_bits)];
  7759. here_bits = here >>> 24;
  7760. here_op = (here >>> 16) & 0xff;
  7761. here_val = here & 0xffff;
  7762. if ((last_bits + here_bits) <= bits) { break; }
  7763. //--- PULLBYTE() ---//
  7764. if (have === 0) { break inf_leave; }
  7765. have--;
  7766. hold += input[next++] << bits;
  7767. bits += 8;
  7768. //---//
  7769. }
  7770. //--- DROPBITS(last.bits) ---//
  7771. hold >>>= last_bits;
  7772. bits -= last_bits;
  7773. //---//
  7774. state.back += last_bits;
  7775. }
  7776. //--- DROPBITS(here.bits) ---//
  7777. hold >>>= here_bits;
  7778. bits -= here_bits;
  7779. //---//
  7780. state.back += here_bits;
  7781. state.length = here_val;
  7782. if (here_op === 0) {
  7783. //Tracevv((stderr, here.val >= 0x20 && here.val < 0x7f ?
  7784. // "inflate: literal '%c'\n" :
  7785. // "inflate: literal 0x%02x\n", here.val));
  7786. state.mode = LIT;
  7787. break;
  7788. }
  7789. if (here_op & 32) {
  7790. //Tracevv((stderr, "inflate: end of block\n"));
  7791. state.back = -1;
  7792. state.mode = TYPE;
  7793. break;
  7794. }
  7795. if (here_op & 64) {
  7796. strm.msg = 'invalid literal/length code';
  7797. state.mode = BAD;
  7798. break;
  7799. }
  7800. state.extra = here_op & 15;
  7801. state.mode = LENEXT;
  7802. /* falls through */
  7803. case LENEXT:
  7804. if (state.extra) {
  7805. //=== NEEDBITS(state.extra);
  7806. n = state.extra;
  7807. while (bits < n) {
  7808. if (have === 0) { break inf_leave; }
  7809. have--;
  7810. hold += input[next++] << bits;
  7811. bits += 8;
  7812. }
  7813. //===//
  7814. state.length += hold & ((1 << state.extra) -1)/*BITS(state.extra)*/;
  7815. //--- DROPBITS(state.extra) ---//
  7816. hold >>>= state.extra;
  7817. bits -= state.extra;
  7818. //---//
  7819. state.back += state.extra;
  7820. }
  7821. //Tracevv((stderr, "inflate: length %u\n", state.length));
  7822. state.was = state.length;
  7823. state.mode = DIST;
  7824. /* falls through */
  7825. case DIST:
  7826. for (;;) {
  7827. here = state.distcode[hold & ((1 << state.distbits) -1)];/*BITS(state.distbits)*/
  7828. here_bits = here >>> 24;
  7829. here_op = (here >>> 16) & 0xff;
  7830. here_val = here & 0xffff;
  7831. if ((here_bits) <= bits) { break; }
  7832. //--- PULLBYTE() ---//
  7833. if (have === 0) { break inf_leave; }
  7834. have--;
  7835. hold += input[next++] << bits;
  7836. bits += 8;
  7837. //---//
  7838. }
  7839. if ((here_op & 0xf0) === 0) {
  7840. last_bits = here_bits;
  7841. last_op = here_op;
  7842. last_val = here_val;
  7843. for (;;) {
  7844. here = state.distcode[last_val +
  7845. ((hold & ((1 << (last_bits + last_op)) -1))/*BITS(last.bits + last.op)*/ >> last_bits)];
  7846. here_bits = here >>> 24;
  7847. here_op = (here >>> 16) & 0xff;
  7848. here_val = here & 0xffff;
  7849. if ((last_bits + here_bits) <= bits) { break; }
  7850. //--- PULLBYTE() ---//
  7851. if (have === 0) { break inf_leave; }
  7852. have--;
  7853. hold += input[next++] << bits;
  7854. bits += 8;
  7855. //---//
  7856. }
  7857. //--- DROPBITS(last.bits) ---//
  7858. hold >>>= last_bits;
  7859. bits -= last_bits;
  7860. //---//
  7861. state.back += last_bits;
  7862. }
  7863. //--- DROPBITS(here.bits) ---//
  7864. hold >>>= here_bits;
  7865. bits -= here_bits;
  7866. //---//
  7867. state.back += here_bits;
  7868. if (here_op & 64) {
  7869. strm.msg = 'invalid distance code';
  7870. state.mode = BAD;
  7871. break;
  7872. }
  7873. state.offset = here_val;
  7874. state.extra = (here_op) & 15;
  7875. state.mode = DISTEXT;
  7876. /* falls through */
  7877. case DISTEXT:
  7878. if (state.extra) {
  7879. //=== NEEDBITS(state.extra);
  7880. n = state.extra;
  7881. while (bits < n) {
  7882. if (have === 0) { break inf_leave; }
  7883. have--;
  7884. hold += input[next++] << bits;
  7885. bits += 8;
  7886. }
  7887. //===//
  7888. state.offset += hold & ((1 << state.extra) -1)/*BITS(state.extra)*/;
  7889. //--- DROPBITS(state.extra) ---//
  7890. hold >>>= state.extra;
  7891. bits -= state.extra;
  7892. //---//
  7893. state.back += state.extra;
  7894. }
  7895. //#ifdef INFLATE_STRICT
  7896. if (state.offset > state.dmax) {
  7897. strm.msg = 'invalid distance too far back';
  7898. state.mode = BAD;
  7899. break;
  7900. }
  7901. //#endif
  7902. //Tracevv((stderr, "inflate: distance %u\n", state.offset));
  7903. state.mode = MATCH;
  7904. /* falls through */
  7905. case MATCH:
  7906. if (left === 0) { break inf_leave; }
  7907. copy = _out - left;
  7908. if (state.offset > copy) { /* copy from window */
  7909. copy = state.offset - copy;
  7910. if (copy > state.whave) {
  7911. if (state.sane) {
  7912. strm.msg = 'invalid distance too far back';
  7913. state.mode = BAD;
  7914. break;
  7915. }
  7916. // (!) This block is disabled in zlib defailts,
  7917. // don't enable it for binary compatibility
  7918. //#ifdef INFLATE_ALLOW_INVALID_DISTANCE_TOOFAR_ARRR
  7919. // Trace((stderr, "inflate.c too far\n"));
  7920. // copy -= state.whave;
  7921. // if (copy > state.length) { copy = state.length; }
  7922. // if (copy > left) { copy = left; }
  7923. // left -= copy;
  7924. // state.length -= copy;
  7925. // do {
  7926. // output[put++] = 0;
  7927. // } while (--copy);
  7928. // if (state.length === 0) { state.mode = LEN; }
  7929. // break;
  7930. //#endif
  7931. }
  7932. if (copy > state.wnext) {
  7933. copy -= state.wnext;
  7934. from = state.wsize - copy;
  7935. }
  7936. else {
  7937. from = state.wnext - copy;
  7938. }
  7939. if (copy > state.length) { copy = state.length; }
  7940. from_source = state.window;
  7941. }
  7942. else { /* copy from output */
  7943. from_source = output;
  7944. from = put - state.offset;
  7945. copy = state.length;
  7946. }
  7947. if (copy > left) { copy = left; }
  7948. left -= copy;
  7949. state.length -= copy;
  7950. do {
  7951. output[put++] = from_source[from++];
  7952. } while (--copy);
  7953. if (state.length === 0) { state.mode = LEN; }
  7954. break;
  7955. case LIT:
  7956. if (left === 0) { break inf_leave; }
  7957. output[put++] = state.length;
  7958. left--;
  7959. state.mode = LEN;
  7960. break;
  7961. case CHECK:
  7962. if (state.wrap) {
  7963. //=== NEEDBITS(32);
  7964. while (bits < 32) {
  7965. if (have === 0) { break inf_leave; }
  7966. have--;
  7967. // Use '|' insdead of '+' to make sure that result is signed
  7968. hold |= input[next++] << bits;
  7969. bits += 8;
  7970. }
  7971. //===//
  7972. _out -= left;
  7973. strm.total_out += _out;
  7974. state.total += _out;
  7975. if (_out) {
  7976. strm.adler = state.check =
  7977. /*UPDATE(state.check, put - _out, _out);*/
  7978. (state.flags ? crc32(state.check, output, _out, put - _out) : adler32(state.check, output, _out, put - _out));
  7979. }
  7980. _out = left;
  7981. // NB: crc32 stored as signed 32-bit int, ZSWAP32 returns signed too
  7982. if ((state.flags ? hold : ZSWAP32(hold)) !== state.check) {
  7983. strm.msg = 'incorrect data check';
  7984. state.mode = BAD;
  7985. break;
  7986. }
  7987. //=== INITBITS();
  7988. hold = 0;
  7989. bits = 0;
  7990. //===//
  7991. //Tracev((stderr, "inflate: check matches trailer\n"));
  7992. }
  7993. state.mode = LENGTH;
  7994. /* falls through */
  7995. case LENGTH:
  7996. if (state.wrap && state.flags) {
  7997. //=== NEEDBITS(32);
  7998. while (bits < 32) {
  7999. if (have === 0) { break inf_leave; }
  8000. have--;
  8001. hold += input[next++] << bits;
  8002. bits += 8;
  8003. }
  8004. //===//
  8005. if (hold !== (state.total & 0xffffffff)) {
  8006. strm.msg = 'incorrect length check';
  8007. state.mode = BAD;
  8008. break;
  8009. }
  8010. //=== INITBITS();
  8011. hold = 0;
  8012. bits = 0;
  8013. //===//
  8014. //Tracev((stderr, "inflate: length matches trailer\n"));
  8015. }
  8016. state.mode = DONE;
  8017. /* falls through */
  8018. case DONE:
  8019. ret = Z_STREAM_END;
  8020. break inf_leave;
  8021. case BAD:
  8022. ret = Z_DATA_ERROR;
  8023. break inf_leave;
  8024. case MEM:
  8025. return Z_MEM_ERROR;
  8026. case SYNC:
  8027. /* falls through */
  8028. default:
  8029. return Z_STREAM_ERROR;
  8030. }
  8031. }
  8032. // inf_leave <- here is real place for "goto inf_leave", emulated via "break inf_leave"
  8033. /*
  8034. Return from inflate(), updating the total counts and the check value.
  8035. If there was no progress during the inflate() call, return a buffer
  8036. error. Call updatewindow() to create and/or update the window state.
  8037. Note: a memory error from inflate() is non-recoverable.
  8038. */
  8039. //--- RESTORE() ---
  8040. strm.next_out = put;
  8041. strm.avail_out = left;
  8042. strm.next_in = next;
  8043. strm.avail_in = have;
  8044. state.hold = hold;
  8045. state.bits = bits;
  8046. //---
  8047. if (state.wsize || (_out !== strm.avail_out && state.mode < BAD &&
  8048. (state.mode < CHECK || flush !== Z_FINISH))) {
  8049. if (updatewindow(strm, strm.output, strm.next_out, _out - strm.avail_out)) {
  8050. state.mode = MEM;
  8051. return Z_MEM_ERROR;
  8052. }
  8053. }
  8054. _in -= strm.avail_in;
  8055. _out -= strm.avail_out;
  8056. strm.total_in += _in;
  8057. strm.total_out += _out;
  8058. state.total += _out;
  8059. if (state.wrap && _out) {
  8060. strm.adler = state.check = /*UPDATE(state.check, strm.next_out - _out, _out);*/
  8061. (state.flags ? crc32(state.check, output, _out, strm.next_out - _out) : adler32(state.check, output, _out, strm.next_out - _out));
  8062. }
  8063. strm.data_type = state.bits + (state.last ? 64 : 0) +
  8064. (state.mode === TYPE ? 128 : 0) +
  8065. (state.mode === LEN_ || state.mode === COPY_ ? 256 : 0);
  8066. if (((_in === 0 && _out === 0) || flush === Z_FINISH) && ret === Z_OK) {
  8067. ret = Z_BUF_ERROR;
  8068. }
  8069. return ret;
  8070. }
  8071. function inflateEnd(strm) {
  8072. if (!strm || !strm.state /*|| strm->zfree == (free_func)0*/) {
  8073. return Z_STREAM_ERROR;
  8074. }
  8075. var state = strm.state;
  8076. if (state.window) {
  8077. state.window = null;
  8078. }
  8079. strm.state = null;
  8080. return Z_OK;
  8081. }
  8082. function inflateGetHeader(strm, head) {
  8083. var state;
  8084. /* check state */
  8085. if (!strm || !strm.state) { return Z_STREAM_ERROR; }
  8086. state = strm.state;
  8087. if ((state.wrap & 2) === 0) { return Z_STREAM_ERROR; }
  8088. /* save header structure */
  8089. state.head = head;
  8090. head.done = false;
  8091. return Z_OK;
  8092. }
  8093. exports.inflateReset = inflateReset;
  8094. exports.inflateReset2 = inflateReset2;
  8095. exports.inflateResetKeep = inflateResetKeep;
  8096. exports.inflateInit = inflateInit;
  8097. exports.inflateInit2 = inflateInit2;
  8098. exports.inflate = inflate;
  8099. exports.inflateEnd = inflateEnd;
  8100. exports.inflateGetHeader = inflateGetHeader;
  8101. exports.inflateInfo = 'pako inflate (from Nodeca project)';
  8102. /* Not implemented
  8103. exports.inflateCopy = inflateCopy;
  8104. exports.inflateGetDictionary = inflateGetDictionary;
  8105. exports.inflateMark = inflateMark;
  8106. exports.inflatePrime = inflatePrime;
  8107. exports.inflateSetDictionary = inflateSetDictionary;
  8108. exports.inflateSync = inflateSync;
  8109. exports.inflateSyncPoint = inflateSyncPoint;
  8110. exports.inflateUndermine = inflateUndermine;
  8111. */
  8112. },{"../utils/common":27,"./adler32":29,"./crc32":31,"./inffast":34,"./inftrees":36}],36:[function(_dereq_,module,exports){
  8113. 'use strict';
  8114. var utils = _dereq_('../utils/common');
  8115. var MAXBITS = 15;
  8116. var ENOUGH_LENS = 852;
  8117. var ENOUGH_DISTS = 592;
  8118. //var ENOUGH = (ENOUGH_LENS+ENOUGH_DISTS);
  8119. var CODES = 0;
  8120. var LENS = 1;
  8121. var DISTS = 2;
  8122. var lbase = [ /* Length codes 257..285 base */
  8123. 3, 4, 5, 6, 7, 8, 9, 10, 11, 13, 15, 17, 19, 23, 27, 31,
  8124. 35, 43, 51, 59, 67, 83, 99, 115, 131, 163, 195, 227, 258, 0, 0
  8125. ];
  8126. var lext = [ /* Length codes 257..285 extra */
  8127. 16, 16, 16, 16, 16, 16, 16, 16, 17, 17, 17, 17, 18, 18, 18, 18,
  8128. 19, 19, 19, 19, 20, 20, 20, 20, 21, 21, 21, 21, 16, 72, 78
  8129. ];
  8130. var dbase = [ /* Distance codes 0..29 base */
  8131. 1, 2, 3, 4, 5, 7, 9, 13, 17, 25, 33, 49, 65, 97, 129, 193,
  8132. 257, 385, 513, 769, 1025, 1537, 2049, 3073, 4097, 6145,
  8133. 8193, 12289, 16385, 24577, 0, 0
  8134. ];
  8135. var dext = [ /* Distance codes 0..29 extra */
  8136. 16, 16, 16, 16, 17, 17, 18, 18, 19, 19, 20, 20, 21, 21, 22, 22,
  8137. 23, 23, 24, 24, 25, 25, 26, 26, 27, 27,
  8138. 28, 28, 29, 29, 64, 64
  8139. ];
  8140. module.exports = function inflate_table(type, lens, lens_index, codes, table, table_index, work, opts)
  8141. {
  8142. var bits = opts.bits;
  8143. //here = opts.here; /* table entry for duplication */
  8144. var len = 0; /* a code's length in bits */
  8145. var sym = 0; /* index of code symbols */
  8146. var min = 0, max = 0; /* minimum and maximum code lengths */
  8147. var root = 0; /* number of index bits for root table */
  8148. var curr = 0; /* number of index bits for current table */
  8149. var drop = 0; /* code bits to drop for sub-table */
  8150. var left = 0; /* number of prefix codes available */
  8151. var used = 0; /* code entries in table used */
  8152. var huff = 0; /* Huffman code */
  8153. var incr; /* for incrementing code, index */
  8154. var fill; /* index for replicating entries */
  8155. var low; /* low bits for current root entry */
  8156. var mask; /* mask for low root bits */
  8157. var next; /* next available space in table */
  8158. var base = null; /* base value table to use */
  8159. var base_index = 0;
  8160. // var shoextra; /* extra bits table to use */
  8161. var end; /* use base and extra for symbol > end */
  8162. var count = new utils.Buf16(MAXBITS+1); //[MAXBITS+1]; /* number of codes of each length */
  8163. var offs = new utils.Buf16(MAXBITS+1); //[MAXBITS+1]; /* offsets in table for each length */
  8164. var extra = null;
  8165. var extra_index = 0;
  8166. var here_bits, here_op, here_val;
  8167. /*
  8168. Process a set of code lengths to create a canonical Huffman code. The
  8169. code lengths are lens[0..codes-1]. Each length corresponds to the
  8170. symbols 0..codes-1. The Huffman code is generated by first sorting the
  8171. symbols by length from short to long, and retaining the symbol order
  8172. for codes with equal lengths. Then the code starts with all zero bits
  8173. for the first code of the shortest length, and the codes are integer
  8174. increments for the same length, and zeros are appended as the length
  8175. increases. For the deflate format, these bits are stored backwards
  8176. from their more natural integer increment ordering, and so when the
  8177. decoding tables are built in the large loop below, the integer codes
  8178. are incremented backwards.
  8179. This routine assumes, but does not check, that all of the entries in
  8180. lens[] are in the range 0..MAXBITS. The caller must assure this.
  8181. 1..MAXBITS is interpreted as that code length. zero means that that
  8182. symbol does not occur in this code.
  8183. The codes are sorted by computing a count of codes for each length,
  8184. creating from that a table of starting indices for each length in the
  8185. sorted table, and then entering the symbols in order in the sorted
  8186. table. The sorted table is work[], with that space being provided by
  8187. the caller.
  8188. The length counts are used for other purposes as well, i.e. finding
  8189. the minimum and maximum length codes, determining if there are any
  8190. codes at all, checking for a valid set of lengths, and looking ahead
  8191. at length counts to determine sub-table sizes when building the
  8192. decoding tables.
  8193. */
  8194. /* accumulate lengths for codes (assumes lens[] all in 0..MAXBITS) */
  8195. for (len = 0; len <= MAXBITS; len++) {
  8196. count[len] = 0;
  8197. }
  8198. for (sym = 0; sym < codes; sym++) {
  8199. count[lens[lens_index + sym]]++;
  8200. }
  8201. /* bound code lengths, force root to be within code lengths */
  8202. root = bits;
  8203. for (max = MAXBITS; max >= 1; max--) {
  8204. if (count[max] !== 0) { break; }
  8205. }
  8206. if (root > max) {
  8207. root = max;
  8208. }
  8209. if (max === 0) { /* no symbols to code at all */
  8210. //table.op[opts.table_index] = 64; //here.op = (var char)64; /* invalid code marker */
  8211. //table.bits[opts.table_index] = 1; //here.bits = (var char)1;
  8212. //table.val[opts.table_index++] = 0; //here.val = (var short)0;
  8213. table[table_index++] = (1 << 24) | (64 << 16) | 0;
  8214. //table.op[opts.table_index] = 64;
  8215. //table.bits[opts.table_index] = 1;
  8216. //table.val[opts.table_index++] = 0;
  8217. table[table_index++] = (1 << 24) | (64 << 16) | 0;
  8218. opts.bits = 1;
  8219. return 0; /* no symbols, but wait for decoding to report error */
  8220. }
  8221. for (min = 1; min < max; min++) {
  8222. if (count[min] !== 0) { break; }
  8223. }
  8224. if (root < min) {
  8225. root = min;
  8226. }
  8227. /* check for an over-subscribed or incomplete set of lengths */
  8228. left = 1;
  8229. for (len = 1; len <= MAXBITS; len++) {
  8230. left <<= 1;
  8231. left -= count[len];
  8232. if (left < 0) {
  8233. return -1;
  8234. } /* over-subscribed */
  8235. }
  8236. if (left > 0 && (type === CODES || max !== 1)) {
  8237. return -1; /* incomplete set */
  8238. }
  8239. /* generate offsets into symbol table for each length for sorting */
  8240. offs[1] = 0;
  8241. for (len = 1; len < MAXBITS; len++) {
  8242. offs[len + 1] = offs[len] + count[len];
  8243. }
  8244. /* sort symbols by length, by symbol order within each length */
  8245. for (sym = 0; sym < codes; sym++) {
  8246. if (lens[lens_index + sym] !== 0) {
  8247. work[offs[lens[lens_index + sym]]++] = sym;
  8248. }
  8249. }
  8250. /*
  8251. Create and fill in decoding tables. In this loop, the table being
  8252. filled is at next and has curr index bits. The code being used is huff
  8253. with length len. That code is converted to an index by dropping drop
  8254. bits off of the bottom. For codes where len is less than drop + curr,
  8255. those top drop + curr - len bits are incremented through all values to
  8256. fill the table with replicated entries.
  8257. root is the number of index bits for the root table. When len exceeds
  8258. root, sub-tables are created pointed to by the root entry with an index
  8259. of the low root bits of huff. This is saved in low to check for when a
  8260. new sub-table should be started. drop is zero when the root table is
  8261. being filled, and drop is root when sub-tables are being filled.
  8262. When a new sub-table is needed, it is necessary to look ahead in the
  8263. code lengths to determine what size sub-table is needed. The length
  8264. counts are used for this, and so count[] is decremented as codes are
  8265. entered in the tables.
  8266. used keeps track of how many table entries have been allocated from the
  8267. provided *table space. It is checked for LENS and DIST tables against
  8268. the constants ENOUGH_LENS and ENOUGH_DISTS to guard against changes in
  8269. the initial root table size constants. See the comments in inftrees.h
  8270. for more information.
  8271. sym increments through all symbols, and the loop terminates when
  8272. all codes of length max, i.e. all codes, have been processed. This
  8273. routine permits incomplete codes, so another loop after this one fills
  8274. in the rest of the decoding tables with invalid code markers.
  8275. */
  8276. /* set up for code type */
  8277. // poor man optimization - use if-else instead of switch,
  8278. // to avoid deopts in old v8
  8279. if (type === CODES) {
  8280. base = extra = work; /* dummy value--not used */
  8281. end = 19;
  8282. } else if (type === LENS) {
  8283. base = lbase;
  8284. base_index -= 257;
  8285. extra = lext;
  8286. extra_index -= 257;
  8287. end = 256;
  8288. } else { /* DISTS */
  8289. base = dbase;
  8290. extra = dext;
  8291. end = -1;
  8292. }
  8293. /* initialize opts for loop */
  8294. huff = 0; /* starting code */
  8295. sym = 0; /* starting code symbol */
  8296. len = min; /* starting code length */
  8297. next = table_index; /* current table to fill in */
  8298. curr = root; /* current table index bits */
  8299. drop = 0; /* current bits to drop from code for index */
  8300. low = -1; /* trigger new sub-table when len > root */
  8301. used = 1 << root; /* use root table entries */
  8302. mask = used - 1; /* mask for comparing low */
  8303. /* check available table space */
  8304. if ((type === LENS && used > ENOUGH_LENS) ||
  8305. (type === DISTS && used > ENOUGH_DISTS)) {
  8306. return 1;
  8307. }
  8308. var i=0;
  8309. /* process all codes and make table entries */
  8310. for (;;) {
  8311. i++;
  8312. /* create table entry */
  8313. here_bits = len - drop;
  8314. if (work[sym] < end) {
  8315. here_op = 0;
  8316. here_val = work[sym];
  8317. }
  8318. else if (work[sym] > end) {
  8319. here_op = extra[extra_index + work[sym]];
  8320. here_val = base[base_index + work[sym]];
  8321. }
  8322. else {
  8323. here_op = 32 + 64; /* end of block */
  8324. here_val = 0;
  8325. }
  8326. /* replicate for those indices with low len bits equal to huff */
  8327. incr = 1 << (len - drop);
  8328. fill = 1 << curr;
  8329. min = fill; /* save offset to next table */
  8330. do {
  8331. fill -= incr;
  8332. table[next + (huff >> drop) + fill] = (here_bits << 24) | (here_op << 16) | here_val |0;
  8333. } while (fill !== 0);
  8334. /* backwards increment the len-bit code huff */
  8335. incr = 1 << (len - 1);
  8336. while (huff & incr) {
  8337. incr >>= 1;
  8338. }
  8339. if (incr !== 0) {
  8340. huff &= incr - 1;
  8341. huff += incr;
  8342. } else {
  8343. huff = 0;
  8344. }
  8345. /* go to next symbol, update count, len */
  8346. sym++;
  8347. if (--count[len] === 0) {
  8348. if (len === max) { break; }
  8349. len = lens[lens_index + work[sym]];
  8350. }
  8351. /* create new sub-table if needed */
  8352. if (len > root && (huff & mask) !== low) {
  8353. /* if first time, transition to sub-tables */
  8354. if (drop === 0) {
  8355. drop = root;
  8356. }
  8357. /* increment past last table */
  8358. next += min; /* here min is 1 << curr */
  8359. /* determine length of next table */
  8360. curr = len - drop;
  8361. left = 1 << curr;
  8362. while (curr + drop < max) {
  8363. left -= count[curr + drop];
  8364. if (left <= 0) { break; }
  8365. curr++;
  8366. left <<= 1;
  8367. }
  8368. /* check for enough space */
  8369. used += 1 << curr;
  8370. if ((type === LENS && used > ENOUGH_LENS) ||
  8371. (type === DISTS && used > ENOUGH_DISTS)) {
  8372. return 1;
  8373. }
  8374. /* point entry in root table to sub-table */
  8375. low = huff & mask;
  8376. /*table.op[low] = curr;
  8377. table.bits[low] = root;
  8378. table.val[low] = next - opts.table_index;*/
  8379. table[low] = (root << 24) | (curr << 16) | (next - table_index) |0;
  8380. }
  8381. }
  8382. /* fill in remaining table entry if code is incomplete (guaranteed to have
  8383. at most one remaining entry, since if the code is incomplete, the
  8384. maximum code length that was allowed to get this far is one bit) */
  8385. if (huff !== 0) {
  8386. //table.op[next + huff] = 64; /* invalid code marker */
  8387. //table.bits[next + huff] = len - drop;
  8388. //table.val[next + huff] = 0;
  8389. table[next + huff] = ((len - drop) << 24) | (64 << 16) |0;
  8390. }
  8391. /* set return parameters */
  8392. //opts.table_index += used;
  8393. opts.bits = root;
  8394. return 0;
  8395. };
  8396. },{"../utils/common":27}],37:[function(_dereq_,module,exports){
  8397. 'use strict';
  8398. module.exports = {
  8399. '2': 'need dictionary', /* Z_NEED_DICT 2 */
  8400. '1': 'stream end', /* Z_STREAM_END 1 */
  8401. '0': '', /* Z_OK 0 */
  8402. '-1': 'file error', /* Z_ERRNO (-1) */
  8403. '-2': 'stream error', /* Z_STREAM_ERROR (-2) */
  8404. '-3': 'data error', /* Z_DATA_ERROR (-3) */
  8405. '-4': 'insufficient memory', /* Z_MEM_ERROR (-4) */
  8406. '-5': 'buffer error', /* Z_BUF_ERROR (-5) */
  8407. '-6': 'incompatible version' /* Z_VERSION_ERROR (-6) */
  8408. };
  8409. },{}],38:[function(_dereq_,module,exports){
  8410. 'use strict';
  8411. var utils = _dereq_('../utils/common');
  8412. /* Public constants ==========================================================*/
  8413. /* ===========================================================================*/
  8414. //var Z_FILTERED = 1;
  8415. //var Z_HUFFMAN_ONLY = 2;
  8416. //var Z_RLE = 3;
  8417. var Z_FIXED = 4;
  8418. //var Z_DEFAULT_STRATEGY = 0;
  8419. /* Possible values of the data_type field (though see inflate()) */
  8420. var Z_BINARY = 0;
  8421. var Z_TEXT = 1;
  8422. //var Z_ASCII = 1; // = Z_TEXT
  8423. var Z_UNKNOWN = 2;
  8424. /*============================================================================*/
  8425. function zero(buf) { var len = buf.length; while (--len >= 0) { buf[len] = 0; } }
  8426. // From zutil.h
  8427. var STORED_BLOCK = 0;
  8428. var STATIC_TREES = 1;
  8429. var DYN_TREES = 2;
  8430. /* The three kinds of block type */
  8431. var MIN_MATCH = 3;
  8432. var MAX_MATCH = 258;
  8433. /* The minimum and maximum match lengths */
  8434. // From deflate.h
  8435. /* ===========================================================================
  8436. * Internal compression state.
  8437. */
  8438. var LENGTH_CODES = 29;
  8439. /* number of length codes, not counting the special END_BLOCK code */
  8440. var LITERALS = 256;
  8441. /* number of literal bytes 0..255 */
  8442. var L_CODES = LITERALS + 1 + LENGTH_CODES;
  8443. /* number of Literal or Length codes, including the END_BLOCK code */
  8444. var D_CODES = 30;
  8445. /* number of distance codes */
  8446. var BL_CODES = 19;
  8447. /* number of codes used to transfer the bit lengths */
  8448. var HEAP_SIZE = 2*L_CODES + 1;
  8449. /* maximum heap size */
  8450. var MAX_BITS = 15;
  8451. /* All codes must not exceed MAX_BITS bits */
  8452. var Buf_size = 16;
  8453. /* size of bit buffer in bi_buf */
  8454. /* ===========================================================================
  8455. * Constants
  8456. */
  8457. var MAX_BL_BITS = 7;
  8458. /* Bit length codes must not exceed MAX_BL_BITS bits */
  8459. var END_BLOCK = 256;
  8460. /* end of block literal code */
  8461. var REP_3_6 = 16;
  8462. /* repeat previous bit length 3-6 times (2 bits of repeat count) */
  8463. var REPZ_3_10 = 17;
  8464. /* repeat a zero length 3-10 times (3 bits of repeat count) */
  8465. var REPZ_11_138 = 18;
  8466. /* repeat a zero length 11-138 times (7 bits of repeat count) */
  8467. var extra_lbits = /* extra bits for each length code */
  8468. [0,0,0,0,0,0,0,0,1,1,1,1,2,2,2,2,3,3,3,3,4,4,4,4,5,5,5,5,0];
  8469. var extra_dbits = /* extra bits for each distance code */
  8470. [0,0,0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,8,8,9,9,10,10,11,11,12,12,13,13];
  8471. var extra_blbits = /* extra bits for each bit length code */
  8472. [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,3,7];
  8473. var bl_order =
  8474. [16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15];
  8475. /* The lengths of the bit length codes are sent in order of decreasing
  8476. * probability, to avoid transmitting the lengths for unused bit length codes.
  8477. */
  8478. /* ===========================================================================
  8479. * Local data. These are initialized only once.
  8480. */
  8481. // We pre-fill arrays with 0 to avoid uninitialized gaps
  8482. var DIST_CODE_LEN = 512; /* see definition of array dist_code below */
  8483. // !!!! Use flat array insdead of structure, Freq = i*2, Len = i*2+1
  8484. var static_ltree = new Array((L_CODES+2) * 2);
  8485. zero(static_ltree);
  8486. /* The static literal tree. Since the bit lengths are imposed, there is no
  8487. * need for the L_CODES extra codes used during heap construction. However
  8488. * The codes 286 and 287 are needed to build a canonical tree (see _tr_init
  8489. * below).
  8490. */
  8491. var static_dtree = new Array(D_CODES * 2);
  8492. zero(static_dtree);
  8493. /* The static distance tree. (Actually a trivial tree since all codes use
  8494. * 5 bits.)
  8495. */
  8496. var _dist_code = new Array(DIST_CODE_LEN);
  8497. zero(_dist_code);
  8498. /* Distance codes. The first 256 values correspond to the distances
  8499. * 3 .. 258, the last 256 values correspond to the top 8 bits of
  8500. * the 15 bit distances.
  8501. */
  8502. var _length_code = new Array(MAX_MATCH-MIN_MATCH+1);
  8503. zero(_length_code);
  8504. /* length code for each normalized match length (0 == MIN_MATCH) */
  8505. var base_length = new Array(LENGTH_CODES);
  8506. zero(base_length);
  8507. /* First normalized length for each code (0 = MIN_MATCH) */
  8508. var base_dist = new Array(D_CODES);
  8509. zero(base_dist);
  8510. /* First normalized distance for each code (0 = distance of 1) */
  8511. var StaticTreeDesc = function (static_tree, extra_bits, extra_base, elems, max_length) {
  8512. this.static_tree = static_tree; /* static tree or NULL */
  8513. this.extra_bits = extra_bits; /* extra bits for each code or NULL */
  8514. this.extra_base = extra_base; /* base index for extra_bits */
  8515. this.elems = elems; /* max number of elements in the tree */
  8516. this.max_length = max_length; /* max bit length for the codes */
  8517. // show if `static_tree` has data or dummy - needed for monomorphic objects
  8518. this.has_stree = static_tree && static_tree.length;
  8519. };
  8520. var static_l_desc;
  8521. var static_d_desc;
  8522. var static_bl_desc;
  8523. var TreeDesc = function(dyn_tree, stat_desc) {
  8524. this.dyn_tree = dyn_tree; /* the dynamic tree */
  8525. this.max_code = 0; /* largest code with non zero frequency */
  8526. this.stat_desc = stat_desc; /* the corresponding static tree */
  8527. };
  8528. function d_code(dist) {
  8529. return dist < 256 ? _dist_code[dist] : _dist_code[256 + (dist >>> 7)];
  8530. }
  8531. /* ===========================================================================
  8532. * Output a short LSB first on the stream.
  8533. * IN assertion: there is enough room in pendingBuf.
  8534. */
  8535. function put_short (s, w) {
  8536. // put_byte(s, (uch)((w) & 0xff));
  8537. // put_byte(s, (uch)((ush)(w) >> 8));
  8538. s.pending_buf[s.pending++] = (w) & 0xff;
  8539. s.pending_buf[s.pending++] = (w >>> 8) & 0xff;
  8540. }
  8541. /* ===========================================================================
  8542. * Send a value on a given number of bits.
  8543. * IN assertion: length <= 16 and value fits in length bits.
  8544. */
  8545. function send_bits(s, value, length) {
  8546. if (s.bi_valid > (Buf_size - length)) {
  8547. s.bi_buf |= (value << s.bi_valid) & 0xffff;
  8548. put_short(s, s.bi_buf);
  8549. s.bi_buf = value >> (Buf_size - s.bi_valid);
  8550. s.bi_valid += length - Buf_size;
  8551. } else {
  8552. s.bi_buf |= (value << s.bi_valid) & 0xffff;
  8553. s.bi_valid += length;
  8554. }
  8555. }
  8556. function send_code(s, c, tree) {
  8557. send_bits(s, tree[c*2]/*.Code*/, tree[c*2 + 1]/*.Len*/);
  8558. }
  8559. /* ===========================================================================
  8560. * Reverse the first len bits of a code, using straightforward code (a faster
  8561. * method would use a table)
  8562. * IN assertion: 1 <= len <= 15
  8563. */
  8564. function bi_reverse(code, len) {
  8565. var res = 0;
  8566. do {
  8567. res |= code & 1;
  8568. code >>>= 1;
  8569. res <<= 1;
  8570. } while (--len > 0);
  8571. return res >>> 1;
  8572. }
  8573. /* ===========================================================================
  8574. * Flush the bit buffer, keeping at most 7 bits in it.
  8575. */
  8576. function bi_flush(s) {
  8577. if (s.bi_valid === 16) {
  8578. put_short(s, s.bi_buf);
  8579. s.bi_buf = 0;
  8580. s.bi_valid = 0;
  8581. } else if (s.bi_valid >= 8) {
  8582. s.pending_buf[s.pending++] = s.bi_buf & 0xff;
  8583. s.bi_buf >>= 8;
  8584. s.bi_valid -= 8;
  8585. }
  8586. }
  8587. /* ===========================================================================
  8588. * Compute the optimal bit lengths for a tree and update the total bit length
  8589. * for the current block.
  8590. * IN assertion: the fields freq and dad are set, heap[heap_max] and
  8591. * above are the tree nodes sorted by increasing frequency.
  8592. * OUT assertions: the field len is set to the optimal bit length, the
  8593. * array bl_count contains the frequencies for each bit length.
  8594. * The length opt_len is updated; static_len is also updated if stree is
  8595. * not null.
  8596. */
  8597. function gen_bitlen(s, desc)
  8598. // deflate_state *s;
  8599. // tree_desc *desc; /* the tree descriptor */
  8600. {
  8601. var tree = desc.dyn_tree;
  8602. var max_code = desc.max_code;
  8603. var stree = desc.stat_desc.static_tree;
  8604. var has_stree = desc.stat_desc.has_stree;
  8605. var extra = desc.stat_desc.extra_bits;
  8606. var base = desc.stat_desc.extra_base;
  8607. var max_length = desc.stat_desc.max_length;
  8608. var h; /* heap index */
  8609. var n, m; /* iterate over the tree elements */
  8610. var bits; /* bit length */
  8611. var xbits; /* extra bits */
  8612. var f; /* frequency */
  8613. var overflow = 0; /* number of elements with bit length too large */
  8614. for (bits = 0; bits <= MAX_BITS; bits++) {
  8615. s.bl_count[bits] = 0;
  8616. }
  8617. /* In a first pass, compute the optimal bit lengths (which may
  8618. * overflow in the case of the bit length tree).
  8619. */
  8620. tree[s.heap[s.heap_max]*2 + 1]/*.Len*/ = 0; /* root of the heap */
  8621. for (h = s.heap_max+1; h < HEAP_SIZE; h++) {
  8622. n = s.heap[h];
  8623. bits = tree[tree[n*2 +1]/*.Dad*/ * 2 + 1]/*.Len*/ + 1;
  8624. if (bits > max_length) {
  8625. bits = max_length;
  8626. overflow++;
  8627. }
  8628. tree[n*2 + 1]/*.Len*/ = bits;
  8629. /* We overwrite tree[n].Dad which is no longer needed */
  8630. if (n > max_code) { continue; } /* not a leaf node */
  8631. s.bl_count[bits]++;
  8632. xbits = 0;
  8633. if (n >= base) {
  8634. xbits = extra[n-base];
  8635. }
  8636. f = tree[n * 2]/*.Freq*/;
  8637. s.opt_len += f * (bits + xbits);
  8638. if (has_stree) {
  8639. s.static_len += f * (stree[n*2 + 1]/*.Len*/ + xbits);
  8640. }
  8641. }
  8642. if (overflow === 0) { return; }
  8643. // Trace((stderr,"\nbit length overflow\n"));
  8644. /* This happens for example on obj2 and pic of the Calgary corpus */
  8645. /* Find the first bit length which could increase: */
  8646. do {
  8647. bits = max_length-1;
  8648. while (s.bl_count[bits] === 0) { bits--; }
  8649. s.bl_count[bits]--; /* move one leaf down the tree */
  8650. s.bl_count[bits+1] += 2; /* move one overflow item as its brother */
  8651. s.bl_count[max_length]--;
  8652. /* The brother of the overflow item also moves one step up,
  8653. * but this does not affect bl_count[max_length]
  8654. */
  8655. overflow -= 2;
  8656. } while (overflow > 0);
  8657. /* Now recompute all bit lengths, scanning in increasing frequency.
  8658. * h is still equal to HEAP_SIZE. (It is simpler to reconstruct all
  8659. * lengths instead of fixing only the wrong ones. This idea is taken
  8660. * from 'ar' written by Haruhiko Okumura.)
  8661. */
  8662. for (bits = max_length; bits !== 0; bits--) {
  8663. n = s.bl_count[bits];
  8664. while (n !== 0) {
  8665. m = s.heap[--h];
  8666. if (m > max_code) { continue; }
  8667. if (tree[m*2 + 1]/*.Len*/ !== bits) {
  8668. // Trace((stderr,"code %d bits %d->%d\n", m, tree[m].Len, bits));
  8669. s.opt_len += (bits - tree[m*2 + 1]/*.Len*/)*tree[m*2]/*.Freq*/;
  8670. tree[m*2 + 1]/*.Len*/ = bits;
  8671. }
  8672. n--;
  8673. }
  8674. }
  8675. }
  8676. /* ===========================================================================
  8677. * Generate the codes for a given tree and bit counts (which need not be
  8678. * optimal).
  8679. * IN assertion: the array bl_count contains the bit length statistics for
  8680. * the given tree and the field len is set for all tree elements.
  8681. * OUT assertion: the field code is set for all tree elements of non
  8682. * zero code length.
  8683. */
  8684. function gen_codes(tree, max_code, bl_count)
  8685. // ct_data *tree; /* the tree to decorate */
  8686. // int max_code; /* largest code with non zero frequency */
  8687. // ushf *bl_count; /* number of codes at each bit length */
  8688. {
  8689. var next_code = new Array(MAX_BITS+1); /* next code value for each bit length */
  8690. var code = 0; /* running code value */
  8691. var bits; /* bit index */
  8692. var n; /* code index */
  8693. /* The distribution counts are first used to generate the code values
  8694. * without bit reversal.
  8695. */
  8696. for (bits = 1; bits <= MAX_BITS; bits++) {
  8697. next_code[bits] = code = (code + bl_count[bits-1]) << 1;
  8698. }
  8699. /* Check that the bit counts in bl_count are consistent. The last code
  8700. * must be all ones.
  8701. */
  8702. //Assert (code + bl_count[MAX_BITS]-1 == (1<<MAX_BITS)-1,
  8703. // "inconsistent bit counts");
  8704. //Tracev((stderr,"\ngen_codes: max_code %d ", max_code));
  8705. for (n = 0; n <= max_code; n++) {
  8706. var len = tree[n*2 + 1]/*.Len*/;
  8707. if (len === 0) { continue; }
  8708. /* Now reverse the bits */
  8709. tree[n*2]/*.Code*/ = bi_reverse(next_code[len]++, len);
  8710. //Tracecv(tree != static_ltree, (stderr,"\nn %3d %c l %2d c %4x (%x) ",
  8711. // n, (isgraph(n) ? n : ' '), len, tree[n].Code, next_code[len]-1));
  8712. }
  8713. }
  8714. /* ===========================================================================
  8715. * Initialize the various 'constant' tables.
  8716. */
  8717. function tr_static_init() {
  8718. var n; /* iterates over tree elements */
  8719. var bits; /* bit counter */
  8720. var length; /* length value */
  8721. var code; /* code value */
  8722. var dist; /* distance index */
  8723. var bl_count = new Array(MAX_BITS+1);
  8724. /* number of codes at each bit length for an optimal tree */
  8725. // do check in _tr_init()
  8726. //if (static_init_done) return;
  8727. /* For some embedded targets, global variables are not initialized: */
  8728. /*#ifdef NO_INIT_GLOBAL_POINTERS
  8729. static_l_desc.static_tree = static_ltree;
  8730. static_l_desc.extra_bits = extra_lbits;
  8731. static_d_desc.static_tree = static_dtree;
  8732. static_d_desc.extra_bits = extra_dbits;
  8733. static_bl_desc.extra_bits = extra_blbits;
  8734. #endif*/
  8735. /* Initialize the mapping length (0..255) -> length code (0..28) */
  8736. length = 0;
  8737. for (code = 0; code < LENGTH_CODES-1; code++) {
  8738. base_length[code] = length;
  8739. for (n = 0; n < (1<<extra_lbits[code]); n++) {
  8740. _length_code[length++] = code;
  8741. }
  8742. }
  8743. //Assert (length == 256, "tr_static_init: length != 256");
  8744. /* Note that the length 255 (match length 258) can be represented
  8745. * in two different ways: code 284 + 5 bits or code 285, so we
  8746. * overwrite length_code[255] to use the best encoding:
  8747. */
  8748. _length_code[length-1] = code;
  8749. /* Initialize the mapping dist (0..32K) -> dist code (0..29) */
  8750. dist = 0;
  8751. for (code = 0 ; code < 16; code++) {
  8752. base_dist[code] = dist;
  8753. for (n = 0; n < (1<<extra_dbits[code]); n++) {
  8754. _dist_code[dist++] = code;
  8755. }
  8756. }
  8757. //Assert (dist == 256, "tr_static_init: dist != 256");
  8758. dist >>= 7; /* from now on, all distances are divided by 128 */
  8759. for ( ; code < D_CODES; code++) {
  8760. base_dist[code] = dist << 7;
  8761. for (n = 0; n < (1<<(extra_dbits[code]-7)); n++) {
  8762. _dist_code[256 + dist++] = code;
  8763. }
  8764. }
  8765. //Assert (dist == 256, "tr_static_init: 256+dist != 512");
  8766. /* Construct the codes of the static literal tree */
  8767. for (bits = 0; bits <= MAX_BITS; bits++) {
  8768. bl_count[bits] = 0;
  8769. }
  8770. n = 0;
  8771. while (n <= 143) {
  8772. static_ltree[n*2 + 1]/*.Len*/ = 8;
  8773. n++;
  8774. bl_count[8]++;
  8775. }
  8776. while (n <= 255) {
  8777. static_ltree[n*2 + 1]/*.Len*/ = 9;
  8778. n++;
  8779. bl_count[9]++;
  8780. }
  8781. while (n <= 279) {
  8782. static_ltree[n*2 + 1]/*.Len*/ = 7;
  8783. n++;
  8784. bl_count[7]++;
  8785. }
  8786. while (n <= 287) {
  8787. static_ltree[n*2 + 1]/*.Len*/ = 8;
  8788. n++;
  8789. bl_count[8]++;
  8790. }
  8791. /* Codes 286 and 287 do not exist, but we must include them in the
  8792. * tree construction to get a canonical Huffman tree (longest code
  8793. * all ones)
  8794. */
  8795. gen_codes(static_ltree, L_CODES+1, bl_count);
  8796. /* The static distance tree is trivial: */
  8797. for (n = 0; n < D_CODES; n++) {
  8798. static_dtree[n*2 + 1]/*.Len*/ = 5;
  8799. static_dtree[n*2]/*.Code*/ = bi_reverse(n, 5);
  8800. }
  8801. // Now data ready and we can init static trees
  8802. static_l_desc = new StaticTreeDesc(static_ltree, extra_lbits, LITERALS+1, L_CODES, MAX_BITS);
  8803. static_d_desc = new StaticTreeDesc(static_dtree, extra_dbits, 0, D_CODES, MAX_BITS);
  8804. static_bl_desc =new StaticTreeDesc(new Array(0), extra_blbits, 0, BL_CODES, MAX_BL_BITS);
  8805. //static_init_done = true;
  8806. }
  8807. /* ===========================================================================
  8808. * Initialize a new block.
  8809. */
  8810. function init_block(s) {
  8811. var n; /* iterates over tree elements */
  8812. /* Initialize the trees. */
  8813. for (n = 0; n < L_CODES; n++) { s.dyn_ltree[n*2]/*.Freq*/ = 0; }
  8814. for (n = 0; n < D_CODES; n++) { s.dyn_dtree[n*2]/*.Freq*/ = 0; }
  8815. for (n = 0; n < BL_CODES; n++) { s.bl_tree[n*2]/*.Freq*/ = 0; }
  8816. s.dyn_ltree[END_BLOCK*2]/*.Freq*/ = 1;
  8817. s.opt_len = s.static_len = 0;
  8818. s.last_lit = s.matches = 0;
  8819. }
  8820. /* ===========================================================================
  8821. * Flush the bit buffer and align the output on a byte boundary
  8822. */
  8823. function bi_windup(s)
  8824. {
  8825. if (s.bi_valid > 8) {
  8826. put_short(s, s.bi_buf);
  8827. } else if (s.bi_valid > 0) {
  8828. //put_byte(s, (Byte)s->bi_buf);
  8829. s.pending_buf[s.pending++] = s.bi_buf;
  8830. }
  8831. s.bi_buf = 0;
  8832. s.bi_valid = 0;
  8833. }
  8834. /* ===========================================================================
  8835. * Copy a stored block, storing first the length and its
  8836. * one's complement if requested.
  8837. */
  8838. function copy_block(s, buf, len, header)
  8839. //DeflateState *s;
  8840. //charf *buf; /* the input data */
  8841. //unsigned len; /* its length */
  8842. //int header; /* true if block header must be written */
  8843. {
  8844. bi_windup(s); /* align on byte boundary */
  8845. if (header) {
  8846. put_short(s, len);
  8847. put_short(s, ~len);
  8848. }
  8849. // while (len--) {
  8850. // put_byte(s, *buf++);
  8851. // }
  8852. utils.arraySet(s.pending_buf, s.window, buf, len, s.pending);
  8853. s.pending += len;
  8854. }
  8855. /* ===========================================================================
  8856. * Compares to subtrees, using the tree depth as tie breaker when
  8857. * the subtrees have equal frequency. This minimizes the worst case length.
  8858. */
  8859. function smaller(tree, n, m, depth) {
  8860. var _n2 = n*2;
  8861. var _m2 = m*2;
  8862. return (tree[_n2]/*.Freq*/ < tree[_m2]/*.Freq*/ ||
  8863. (tree[_n2]/*.Freq*/ === tree[_m2]/*.Freq*/ && depth[n] <= depth[m]));
  8864. }
  8865. /* ===========================================================================
  8866. * Restore the heap property by moving down the tree starting at node k,
  8867. * exchanging a node with the smallest of its two sons if necessary, stopping
  8868. * when the heap property is re-established (each father smaller than its
  8869. * two sons).
  8870. */
  8871. function pqdownheap(s, tree, k)
  8872. // deflate_state *s;
  8873. // ct_data *tree; /* the tree to restore */
  8874. // int k; /* node to move down */
  8875. {
  8876. var v = s.heap[k];
  8877. var j = k << 1; /* left son of k */
  8878. while (j <= s.heap_len) {
  8879. /* Set j to the smallest of the two sons: */
  8880. if (j < s.heap_len &&
  8881. smaller(tree, s.heap[j+1], s.heap[j], s.depth)) {
  8882. j++;
  8883. }
  8884. /* Exit if v is smaller than both sons */
  8885. if (smaller(tree, v, s.heap[j], s.depth)) { break; }
  8886. /* Exchange v with the smallest son */
  8887. s.heap[k] = s.heap[j];
  8888. k = j;
  8889. /* And continue down the tree, setting j to the left son of k */
  8890. j <<= 1;
  8891. }
  8892. s.heap[k] = v;
  8893. }
  8894. // inlined manually
  8895. // var SMALLEST = 1;
  8896. /* ===========================================================================
  8897. * Send the block data compressed using the given Huffman trees
  8898. */
  8899. function compress_block(s, ltree, dtree)
  8900. // deflate_state *s;
  8901. // const ct_data *ltree; /* literal tree */
  8902. // const ct_data *dtree; /* distance tree */
  8903. {
  8904. var dist; /* distance of matched string */
  8905. var lc; /* match length or unmatched char (if dist == 0) */
  8906. var lx = 0; /* running index in l_buf */
  8907. var code; /* the code to send */
  8908. var extra; /* number of extra bits to send */
  8909. if (s.last_lit !== 0) {
  8910. do {
  8911. dist = (s.pending_buf[s.d_buf + lx*2] << 8) | (s.pending_buf[s.d_buf + lx*2 + 1]);
  8912. lc = s.pending_buf[s.l_buf + lx];
  8913. lx++;
  8914. if (dist === 0) {
  8915. send_code(s, lc, ltree); /* send a literal byte */
  8916. //Tracecv(isgraph(lc), (stderr," '%c' ", lc));
  8917. } else {
  8918. /* Here, lc is the match length - MIN_MATCH */
  8919. code = _length_code[lc];
  8920. send_code(s, code+LITERALS+1, ltree); /* send the length code */
  8921. extra = extra_lbits[code];
  8922. if (extra !== 0) {
  8923. lc -= base_length[code];
  8924. send_bits(s, lc, extra); /* send the extra length bits */
  8925. }
  8926. dist--; /* dist is now the match distance - 1 */
  8927. code = d_code(dist);
  8928. //Assert (code < D_CODES, "bad d_code");
  8929. send_code(s, code, dtree); /* send the distance code */
  8930. extra = extra_dbits[code];
  8931. if (extra !== 0) {
  8932. dist -= base_dist[code];
  8933. send_bits(s, dist, extra); /* send the extra distance bits */
  8934. }
  8935. } /* literal or match pair ? */
  8936. /* Check that the overlay between pending_buf and d_buf+l_buf is ok: */
  8937. //Assert((uInt)(s->pending) < s->lit_bufsize + 2*lx,
  8938. // "pendingBuf overflow");
  8939. } while (lx < s.last_lit);
  8940. }
  8941. send_code(s, END_BLOCK, ltree);
  8942. }
  8943. /* ===========================================================================
  8944. * Construct one Huffman tree and assigns the code bit strings and lengths.
  8945. * Update the total bit length for the current block.
  8946. * IN assertion: the field freq is set for all tree elements.
  8947. * OUT assertions: the fields len and code are set to the optimal bit length
  8948. * and corresponding code. The length opt_len is updated; static_len is
  8949. * also updated if stree is not null. The field max_code is set.
  8950. */
  8951. function build_tree(s, desc)
  8952. // deflate_state *s;
  8953. // tree_desc *desc; /* the tree descriptor */
  8954. {
  8955. var tree = desc.dyn_tree;
  8956. var stree = desc.stat_desc.static_tree;
  8957. var has_stree = desc.stat_desc.has_stree;
  8958. var elems = desc.stat_desc.elems;
  8959. var n, m; /* iterate over heap elements */
  8960. var max_code = -1; /* largest code with non zero frequency */
  8961. var node; /* new node being created */
  8962. /* Construct the initial heap, with least frequent element in
  8963. * heap[SMALLEST]. The sons of heap[n] are heap[2*n] and heap[2*n+1].
  8964. * heap[0] is not used.
  8965. */
  8966. s.heap_len = 0;
  8967. s.heap_max = HEAP_SIZE;
  8968. for (n = 0; n < elems; n++) {
  8969. if (tree[n * 2]/*.Freq*/ !== 0) {
  8970. s.heap[++s.heap_len] = max_code = n;
  8971. s.depth[n] = 0;
  8972. } else {
  8973. tree[n*2 + 1]/*.Len*/ = 0;
  8974. }
  8975. }
  8976. /* The pkzip format requires that at least one distance code exists,
  8977. * and that at least one bit should be sent even if there is only one
  8978. * possible code. So to avoid special checks later on we force at least
  8979. * two codes of non zero frequency.
  8980. */
  8981. while (s.heap_len < 2) {
  8982. node = s.heap[++s.heap_len] = (max_code < 2 ? ++max_code : 0);
  8983. tree[node * 2]/*.Freq*/ = 1;
  8984. s.depth[node] = 0;
  8985. s.opt_len--;
  8986. if (has_stree) {
  8987. s.static_len -= stree[node*2 + 1]/*.Len*/;
  8988. }
  8989. /* node is 0 or 1 so it does not have extra bits */
  8990. }
  8991. desc.max_code = max_code;
  8992. /* The elements heap[heap_len/2+1 .. heap_len] are leaves of the tree,
  8993. * establish sub-heaps of increasing lengths:
  8994. */
  8995. for (n = (s.heap_len >> 1/*int /2*/); n >= 1; n--) { pqdownheap(s, tree, n); }
  8996. /* Construct the Huffman tree by repeatedly combining the least two
  8997. * frequent nodes.
  8998. */
  8999. node = elems; /* next internal node of the tree */
  9000. do {
  9001. //pqremove(s, tree, n); /* n = node of least frequency */
  9002. /*** pqremove ***/
  9003. n = s.heap[1/*SMALLEST*/];
  9004. s.heap[1/*SMALLEST*/] = s.heap[s.heap_len--];
  9005. pqdownheap(s, tree, 1/*SMALLEST*/);
  9006. /***/
  9007. m = s.heap[1/*SMALLEST*/]; /* m = node of next least frequency */
  9008. s.heap[--s.heap_max] = n; /* keep the nodes sorted by frequency */
  9009. s.heap[--s.heap_max] = m;
  9010. /* Create a new node father of n and m */
  9011. tree[node * 2]/*.Freq*/ = tree[n * 2]/*.Freq*/ + tree[m * 2]/*.Freq*/;
  9012. s.depth[node] = (s.depth[n] >= s.depth[m] ? s.depth[n] : s.depth[m]) + 1;
  9013. tree[n*2 + 1]/*.Dad*/ = tree[m*2 + 1]/*.Dad*/ = node;
  9014. /* and insert the new node in the heap */
  9015. s.heap[1/*SMALLEST*/] = node++;
  9016. pqdownheap(s, tree, 1/*SMALLEST*/);
  9017. } while (s.heap_len >= 2);
  9018. s.heap[--s.heap_max] = s.heap[1/*SMALLEST*/];
  9019. /* At this point, the fields freq and dad are set. We can now
  9020. * generate the bit lengths.
  9021. */
  9022. gen_bitlen(s, desc);
  9023. /* The field len is now set, we can generate the bit codes */
  9024. gen_codes(tree, max_code, s.bl_count);
  9025. }
  9026. /* ===========================================================================
  9027. * Scan a literal or distance tree to determine the frequencies of the codes
  9028. * in the bit length tree.
  9029. */
  9030. function scan_tree(s, tree, max_code)
  9031. // deflate_state *s;
  9032. // ct_data *tree; /* the tree to be scanned */
  9033. // int max_code; /* and its largest code of non zero frequency */
  9034. {
  9035. var n; /* iterates over all tree elements */
  9036. var prevlen = -1; /* last emitted length */
  9037. var curlen; /* length of current code */
  9038. var nextlen = tree[0*2 + 1]/*.Len*/; /* length of next code */
  9039. var count = 0; /* repeat count of the current code */
  9040. var max_count = 7; /* max repeat count */
  9041. var min_count = 4; /* min repeat count */
  9042. if (nextlen === 0) {
  9043. max_count = 138;
  9044. min_count = 3;
  9045. }
  9046. tree[(max_code+1)*2 + 1]/*.Len*/ = 0xffff; /* guard */
  9047. for (n = 0; n <= max_code; n++) {
  9048. curlen = nextlen;
  9049. nextlen = tree[(n+1)*2 + 1]/*.Len*/;
  9050. if (++count < max_count && curlen === nextlen) {
  9051. continue;
  9052. } else if (count < min_count) {
  9053. s.bl_tree[curlen * 2]/*.Freq*/ += count;
  9054. } else if (curlen !== 0) {
  9055. if (curlen !== prevlen) { s.bl_tree[curlen * 2]/*.Freq*/++; }
  9056. s.bl_tree[REP_3_6*2]/*.Freq*/++;
  9057. } else if (count <= 10) {
  9058. s.bl_tree[REPZ_3_10*2]/*.Freq*/++;
  9059. } else {
  9060. s.bl_tree[REPZ_11_138*2]/*.Freq*/++;
  9061. }
  9062. count = 0;
  9063. prevlen = curlen;
  9064. if (nextlen === 0) {
  9065. max_count = 138;
  9066. min_count = 3;
  9067. } else if (curlen === nextlen) {
  9068. max_count = 6;
  9069. min_count = 3;
  9070. } else {
  9071. max_count = 7;
  9072. min_count = 4;
  9073. }
  9074. }
  9075. }
  9076. /* ===========================================================================
  9077. * Send a literal or distance tree in compressed form, using the codes in
  9078. * bl_tree.
  9079. */
  9080. function send_tree(s, tree, max_code)
  9081. // deflate_state *s;
  9082. // ct_data *tree; /* the tree to be scanned */
  9083. // int max_code; /* and its largest code of non zero frequency */
  9084. {
  9085. var n; /* iterates over all tree elements */
  9086. var prevlen = -1; /* last emitted length */
  9087. var curlen; /* length of current code */
  9088. var nextlen = tree[0*2 + 1]/*.Len*/; /* length of next code */
  9089. var count = 0; /* repeat count of the current code */
  9090. var max_count = 7; /* max repeat count */
  9091. var min_count = 4; /* min repeat count */
  9092. /* tree[max_code+1].Len = -1; */ /* guard already set */
  9093. if (nextlen === 0) {
  9094. max_count = 138;
  9095. min_count = 3;
  9096. }
  9097. for (n = 0; n <= max_code; n++) {
  9098. curlen = nextlen;
  9099. nextlen = tree[(n+1)*2 + 1]/*.Len*/;
  9100. if (++count < max_count && curlen === nextlen) {
  9101. continue;
  9102. } else if (count < min_count) {
  9103. do { send_code(s, curlen, s.bl_tree); } while (--count !== 0);
  9104. } else if (curlen !== 0) {
  9105. if (curlen !== prevlen) {
  9106. send_code(s, curlen, s.bl_tree);
  9107. count--;
  9108. }
  9109. //Assert(count >= 3 && count <= 6, " 3_6?");
  9110. send_code(s, REP_3_6, s.bl_tree);
  9111. send_bits(s, count-3, 2);
  9112. } else if (count <= 10) {
  9113. send_code(s, REPZ_3_10, s.bl_tree);
  9114. send_bits(s, count-3, 3);
  9115. } else {
  9116. send_code(s, REPZ_11_138, s.bl_tree);
  9117. send_bits(s, count-11, 7);
  9118. }
  9119. count = 0;
  9120. prevlen = curlen;
  9121. if (nextlen === 0) {
  9122. max_count = 138;
  9123. min_count = 3;
  9124. } else if (curlen === nextlen) {
  9125. max_count = 6;
  9126. min_count = 3;
  9127. } else {
  9128. max_count = 7;
  9129. min_count = 4;
  9130. }
  9131. }
  9132. }
  9133. /* ===========================================================================
  9134. * Construct the Huffman tree for the bit lengths and return the index in
  9135. * bl_order of the last bit length code to send.
  9136. */
  9137. function build_bl_tree(s) {
  9138. var max_blindex; /* index of last bit length code of non zero freq */
  9139. /* Determine the bit length frequencies for literal and distance trees */
  9140. scan_tree(s, s.dyn_ltree, s.l_desc.max_code);
  9141. scan_tree(s, s.dyn_dtree, s.d_desc.max_code);
  9142. /* Build the bit length tree: */
  9143. build_tree(s, s.bl_desc);
  9144. /* opt_len now includes the length of the tree representations, except
  9145. * the lengths of the bit lengths codes and the 5+5+4 bits for the counts.
  9146. */
  9147. /* Determine the number of bit length codes to send. The pkzip format
  9148. * requires that at least 4 bit length codes be sent. (appnote.txt says
  9149. * 3 but the actual value used is 4.)
  9150. */
  9151. for (max_blindex = BL_CODES-1; max_blindex >= 3; max_blindex--) {
  9152. if (s.bl_tree[bl_order[max_blindex]*2 + 1]/*.Len*/ !== 0) {
  9153. break;
  9154. }
  9155. }
  9156. /* Update opt_len to include the bit length tree and counts */
  9157. s.opt_len += 3*(max_blindex+1) + 5+5+4;
  9158. //Tracev((stderr, "\ndyn trees: dyn %ld, stat %ld",
  9159. // s->opt_len, s->static_len));
  9160. return max_blindex;
  9161. }
  9162. /* ===========================================================================
  9163. * Send the header for a block using dynamic Huffman trees: the counts, the
  9164. * lengths of the bit length codes, the literal tree and the distance tree.
  9165. * IN assertion: lcodes >= 257, dcodes >= 1, blcodes >= 4.
  9166. */
  9167. function send_all_trees(s, lcodes, dcodes, blcodes)
  9168. // deflate_state *s;
  9169. // int lcodes, dcodes, blcodes; /* number of codes for each tree */
  9170. {
  9171. var rank; /* index in bl_order */
  9172. //Assert (lcodes >= 257 && dcodes >= 1 && blcodes >= 4, "not enough codes");
  9173. //Assert (lcodes <= L_CODES && dcodes <= D_CODES && blcodes <= BL_CODES,
  9174. // "too many codes");
  9175. //Tracev((stderr, "\nbl counts: "));
  9176. send_bits(s, lcodes-257, 5); /* not +255 as stated in appnote.txt */
  9177. send_bits(s, dcodes-1, 5);
  9178. send_bits(s, blcodes-4, 4); /* not -3 as stated in appnote.txt */
  9179. for (rank = 0; rank < blcodes; rank++) {
  9180. //Tracev((stderr, "\nbl code %2d ", bl_order[rank]));
  9181. send_bits(s, s.bl_tree[bl_order[rank]*2 + 1]/*.Len*/, 3);
  9182. }
  9183. //Tracev((stderr, "\nbl tree: sent %ld", s->bits_sent));
  9184. send_tree(s, s.dyn_ltree, lcodes-1); /* literal tree */
  9185. //Tracev((stderr, "\nlit tree: sent %ld", s->bits_sent));
  9186. send_tree(s, s.dyn_dtree, dcodes-1); /* distance tree */
  9187. //Tracev((stderr, "\ndist tree: sent %ld", s->bits_sent));
  9188. }
  9189. /* ===========================================================================
  9190. * Check if the data type is TEXT or BINARY, using the following algorithm:
  9191. * - TEXT if the two conditions below are satisfied:
  9192. * a) There are no non-portable control characters belonging to the
  9193. * "black list" (0..6, 14..25, 28..31).
  9194. * b) There is at least one printable character belonging to the
  9195. * "white list" (9 {TAB}, 10 {LF}, 13 {CR}, 32..255).
  9196. * - BINARY otherwise.
  9197. * - The following partially-portable control characters form a
  9198. * "gray list" that is ignored in this detection algorithm:
  9199. * (7 {BEL}, 8 {BS}, 11 {VT}, 12 {FF}, 26 {SUB}, 27 {ESC}).
  9200. * IN assertion: the fields Freq of dyn_ltree are set.
  9201. */
  9202. function detect_data_type(s) {
  9203. /* black_mask is the bit mask of black-listed bytes
  9204. * set bits 0..6, 14..25, and 28..31
  9205. * 0xf3ffc07f = binary 11110011111111111100000001111111
  9206. */
  9207. var black_mask = 0xf3ffc07f;
  9208. var n;
  9209. /* Check for non-textual ("black-listed") bytes. */
  9210. for (n = 0; n <= 31; n++, black_mask >>>= 1) {
  9211. if ((black_mask & 1) && (s.dyn_ltree[n*2]/*.Freq*/ !== 0)) {
  9212. return Z_BINARY;
  9213. }
  9214. }
  9215. /* Check for textual ("white-listed") bytes. */
  9216. if (s.dyn_ltree[9 * 2]/*.Freq*/ !== 0 || s.dyn_ltree[10 * 2]/*.Freq*/ !== 0 ||
  9217. s.dyn_ltree[13 * 2]/*.Freq*/ !== 0) {
  9218. return Z_TEXT;
  9219. }
  9220. for (n = 32; n < LITERALS; n++) {
  9221. if (s.dyn_ltree[n * 2]/*.Freq*/ !== 0) {
  9222. return Z_TEXT;
  9223. }
  9224. }
  9225. /* There are no "black-listed" or "white-listed" bytes:
  9226. * this stream either is empty or has tolerated ("gray-listed") bytes only.
  9227. */
  9228. return Z_BINARY;
  9229. }
  9230. var static_init_done = false;
  9231. /* ===========================================================================
  9232. * Initialize the tree data structures for a new zlib stream.
  9233. */
  9234. function _tr_init(s)
  9235. {
  9236. if (!static_init_done) {
  9237. tr_static_init();
  9238. static_init_done = true;
  9239. }
  9240. s.l_desc = new TreeDesc(s.dyn_ltree, static_l_desc);
  9241. s.d_desc = new TreeDesc(s.dyn_dtree, static_d_desc);
  9242. s.bl_desc = new TreeDesc(s.bl_tree, static_bl_desc);
  9243. s.bi_buf = 0;
  9244. s.bi_valid = 0;
  9245. /* Initialize the first block of the first file: */
  9246. init_block(s);
  9247. }
  9248. /* ===========================================================================
  9249. * Send a stored block
  9250. */
  9251. function _tr_stored_block(s, buf, stored_len, last)
  9252. //DeflateState *s;
  9253. //charf *buf; /* input block */
  9254. //ulg stored_len; /* length of input block */
  9255. //int last; /* one if this is the last block for a file */
  9256. {
  9257. send_bits(s, (STORED_BLOCK<<1)+(last ? 1 : 0), 3); /* send block type */
  9258. copy_block(s, buf, stored_len, true); /* with header */
  9259. }
  9260. /* ===========================================================================
  9261. * Send one empty static block to give enough lookahead for inflate.
  9262. * This takes 10 bits, of which 7 may remain in the bit buffer.
  9263. */
  9264. function _tr_align(s) {
  9265. send_bits(s, STATIC_TREES<<1, 3);
  9266. send_code(s, END_BLOCK, static_ltree);
  9267. bi_flush(s);
  9268. }
  9269. /* ===========================================================================
  9270. * Determine the best encoding for the current block: dynamic trees, static
  9271. * trees or store, and output the encoded block to the zip file.
  9272. */
  9273. function _tr_flush_block(s, buf, stored_len, last)
  9274. //DeflateState *s;
  9275. //charf *buf; /* input block, or NULL if too old */
  9276. //ulg stored_len; /* length of input block */
  9277. //int last; /* one if this is the last block for a file */
  9278. {
  9279. var opt_lenb, static_lenb; /* opt_len and static_len in bytes */
  9280. var max_blindex = 0; /* index of last bit length code of non zero freq */
  9281. /* Build the Huffman trees unless a stored block is forced */
  9282. if (s.level > 0) {
  9283. /* Check if the file is binary or text */
  9284. if (s.strm.data_type === Z_UNKNOWN) {
  9285. s.strm.data_type = detect_data_type(s);
  9286. }
  9287. /* Construct the literal and distance trees */
  9288. build_tree(s, s.l_desc);
  9289. // Tracev((stderr, "\nlit data: dyn %ld, stat %ld", s->opt_len,
  9290. // s->static_len));
  9291. build_tree(s, s.d_desc);
  9292. // Tracev((stderr, "\ndist data: dyn %ld, stat %ld", s->opt_len,
  9293. // s->static_len));
  9294. /* At this point, opt_len and static_len are the total bit lengths of
  9295. * the compressed block data, excluding the tree representations.
  9296. */
  9297. /* Build the bit length tree for the above two trees, and get the index
  9298. * in bl_order of the last bit length code to send.
  9299. */
  9300. max_blindex = build_bl_tree(s);
  9301. /* Determine the best encoding. Compute the block lengths in bytes. */
  9302. opt_lenb = (s.opt_len+3+7) >>> 3;
  9303. static_lenb = (s.static_len+3+7) >>> 3;
  9304. // Tracev((stderr, "\nopt %lu(%lu) stat %lu(%lu) stored %lu lit %u ",
  9305. // opt_lenb, s->opt_len, static_lenb, s->static_len, stored_len,
  9306. // s->last_lit));
  9307. if (static_lenb <= opt_lenb) { opt_lenb = static_lenb; }
  9308. } else {
  9309. // Assert(buf != (char*)0, "lost buf");
  9310. opt_lenb = static_lenb = stored_len + 5; /* force a stored block */
  9311. }
  9312. if ((stored_len+4 <= opt_lenb) && (buf !== -1)) {
  9313. /* 4: two words for the lengths */
  9314. /* The test buf != NULL is only necessary if LIT_BUFSIZE > WSIZE.
  9315. * Otherwise we can't have processed more than WSIZE input bytes since
  9316. * the last block flush, because compression would have been
  9317. * successful. If LIT_BUFSIZE <= WSIZE, it is never too late to
  9318. * transform a block into a stored block.
  9319. */
  9320. _tr_stored_block(s, buf, stored_len, last);
  9321. } else if (s.strategy === Z_FIXED || static_lenb === opt_lenb) {
  9322. send_bits(s, (STATIC_TREES<<1) + (last ? 1 : 0), 3);
  9323. compress_block(s, static_ltree, static_dtree);
  9324. } else {
  9325. send_bits(s, (DYN_TREES<<1) + (last ? 1 : 0), 3);
  9326. send_all_trees(s, s.l_desc.max_code+1, s.d_desc.max_code+1, max_blindex+1);
  9327. compress_block(s, s.dyn_ltree, s.dyn_dtree);
  9328. }
  9329. // Assert (s->compressed_len == s->bits_sent, "bad compressed size");
  9330. /* The above check is made mod 2^32, for files larger than 512 MB
  9331. * and uLong implemented on 32 bits.
  9332. */
  9333. init_block(s);
  9334. if (last) {
  9335. bi_windup(s);
  9336. }
  9337. // Tracev((stderr,"\ncomprlen %lu(%lu) ", s->compressed_len>>3,
  9338. // s->compressed_len-7*last));
  9339. }
  9340. /* ===========================================================================
  9341. * Save the match info and tally the frequency counts. Return true if
  9342. * the current block must be flushed.
  9343. */
  9344. function _tr_tally(s, dist, lc)
  9345. // deflate_state *s;
  9346. // unsigned dist; /* distance of matched string */
  9347. // unsigned lc; /* match length-MIN_MATCH or unmatched char (if dist==0) */
  9348. {
  9349. //var out_length, in_length, dcode;
  9350. s.pending_buf[s.d_buf + s.last_lit * 2] = (dist >>> 8) & 0xff;
  9351. s.pending_buf[s.d_buf + s.last_lit * 2 + 1] = dist & 0xff;
  9352. s.pending_buf[s.l_buf + s.last_lit] = lc & 0xff;
  9353. s.last_lit++;
  9354. if (dist === 0) {
  9355. /* lc is the unmatched char */
  9356. s.dyn_ltree[lc*2]/*.Freq*/++;
  9357. } else {
  9358. s.matches++;
  9359. /* Here, lc is the match length - MIN_MATCH */
  9360. dist--; /* dist = match distance - 1 */
  9361. //Assert((ush)dist < (ush)MAX_DIST(s) &&
  9362. // (ush)lc <= (ush)(MAX_MATCH-MIN_MATCH) &&
  9363. // (ush)d_code(dist) < (ush)D_CODES, "_tr_tally: bad match");
  9364. s.dyn_ltree[(_length_code[lc]+LITERALS+1) * 2]/*.Freq*/++;
  9365. s.dyn_dtree[d_code(dist) * 2]/*.Freq*/++;
  9366. }
  9367. // (!) This block is disabled in zlib defailts,
  9368. // don't enable it for binary compatibility
  9369. //#ifdef TRUNCATE_BLOCK
  9370. // /* Try to guess if it is profitable to stop the current block here */
  9371. // if ((s.last_lit & 0x1fff) === 0 && s.level > 2) {
  9372. // /* Compute an upper bound for the compressed length */
  9373. // out_length = s.last_lit*8;
  9374. // in_length = s.strstart - s.block_start;
  9375. //
  9376. // for (dcode = 0; dcode < D_CODES; dcode++) {
  9377. // out_length += s.dyn_dtree[dcode*2]/*.Freq*/ * (5 + extra_dbits[dcode]);
  9378. // }
  9379. // out_length >>>= 3;
  9380. // //Tracev((stderr,"\nlast_lit %u, in %ld, out ~%ld(%ld%%) ",
  9381. // // s->last_lit, in_length, out_length,
  9382. // // 100L - out_length*100L/in_length));
  9383. // if (s.matches < (s.last_lit>>1)/*int /2*/ && out_length < (in_length>>1)/*int /2*/) {
  9384. // return true;
  9385. // }
  9386. // }
  9387. //#endif
  9388. return (s.last_lit === s.lit_bufsize-1);
  9389. /* We avoid equality with lit_bufsize because of wraparound at 64K
  9390. * on 16 bit machines and because stored blocks are restricted to
  9391. * 64K-1 bytes.
  9392. */
  9393. }
  9394. exports._tr_init = _tr_init;
  9395. exports._tr_stored_block = _tr_stored_block;
  9396. exports._tr_flush_block = _tr_flush_block;
  9397. exports._tr_tally = _tr_tally;
  9398. exports._tr_align = _tr_align;
  9399. },{"../utils/common":27}],39:[function(_dereq_,module,exports){
  9400. 'use strict';
  9401. function ZStream() {
  9402. /* next input byte */
  9403. this.input = null; // JS specific, because we have no pointers
  9404. this.next_in = 0;
  9405. /* number of bytes available at input */
  9406. this.avail_in = 0;
  9407. /* total number of input bytes read so far */
  9408. this.total_in = 0;
  9409. /* next output byte should be put there */
  9410. this.output = null; // JS specific, because we have no pointers
  9411. this.next_out = 0;
  9412. /* remaining free space at output */
  9413. this.avail_out = 0;
  9414. /* total number of bytes output so far */
  9415. this.total_out = 0;
  9416. /* last error message, NULL if no error */
  9417. this.msg = ''/*Z_NULL*/;
  9418. /* not visible by applications */
  9419. this.state = null;
  9420. /* best guess about the data type: binary or text */
  9421. this.data_type = 2/*Z_UNKNOWN*/;
  9422. /* adler32 value of the uncompressed data */
  9423. this.adler = 0;
  9424. }
  9425. module.exports = ZStream;
  9426. },{}]},{},[9])
  9427. (9)
  9428. }));
  9429. /***/ }),
  9430. /***/ "./node_modules/xlsx/xlsx.js":
  9431. /*!***********************************!*\
  9432. !*** ./node_modules/xlsx/xlsx.js ***!
  9433. \***********************************/
  9434. /***/ ((module, exports, __webpack_require__) => {
  9435. /*! xlsx.js (C) 2013-present SheetJS -- http://sheetjs.com */
  9436. /* vim: set ts=2: */
  9437. /*exported XLSX */
  9438. /*global global, exports, module, require:false, process:false, Buffer:false, ArrayBuffer:false */
  9439. var XLSX = {};
  9440. function make_xlsx_lib(XLSX){
  9441. XLSX.version = '0.17.1';
  9442. var current_codepage = 1200, current_ansi = 1252;
  9443. /*global cptable:true, window */
  9444. if(true) {
  9445. if(typeof cptable === 'undefined') {
  9446. if(typeof __webpack_require__.g !== 'undefined') __webpack_require__.g.cptable = __webpack_require__(/*! ./dist/cpexcel.js */ "./node_modules/xlsx/dist/cpexcel.js");
  9447. else if(typeof window !== 'undefined') window.cptable = __webpack_require__(/*! ./dist/cpexcel.js */ "./node_modules/xlsx/dist/cpexcel.js");
  9448. }
  9449. }
  9450. var VALID_ANSI = [ 874, 932, 936, 949, 950 ];
  9451. for(var i = 0; i <= 8; ++i) VALID_ANSI.push(1250 + i);
  9452. /* ECMA-376 Part I 18.4.1 charset to codepage mapping */
  9453. var CS2CP = ({
  9454. 0: 1252, /* ANSI */
  9455. 1: 65001, /* DEFAULT */
  9456. 2: 65001, /* SYMBOL */
  9457. 77: 10000, /* MAC */
  9458. 128: 932, /* SHIFTJIS */
  9459. 129: 949, /* HANGUL */
  9460. 130: 1361, /* JOHAB */
  9461. 134: 936, /* GB2312 */
  9462. 136: 950, /* CHINESEBIG5 */
  9463. 161: 1253, /* GREEK */
  9464. 162: 1254, /* TURKISH */
  9465. 163: 1258, /* VIETNAMESE */
  9466. 177: 1255, /* HEBREW */
  9467. 178: 1256, /* ARABIC */
  9468. 186: 1257, /* BALTIC */
  9469. 204: 1251, /* RUSSIAN */
  9470. 222: 874, /* THAI */
  9471. 238: 1250, /* EASTEUROPE */
  9472. 255: 1252, /* OEM */
  9473. 69: 6969 /* MISC */
  9474. });
  9475. var set_ansi = function(cp) { if(VALID_ANSI.indexOf(cp) == -1) return; current_ansi = CS2CP[0] = cp; };
  9476. function reset_ansi() { set_ansi(1252); }
  9477. var set_cp = function(cp) { current_codepage = cp; set_ansi(cp); };
  9478. function reset_cp() { set_cp(1200); reset_ansi(); }
  9479. function char_codes(data) { var o = []; for(var i = 0, len = data.length; i < len; ++i) o[i] = data.charCodeAt(i); return o; }
  9480. function utf16leread(data) {
  9481. var o = [];
  9482. for(var i = 0; i < (data.length>>1); ++i) o[i] = String.fromCharCode(data.charCodeAt(2*i) + (data.charCodeAt(2*i+1)<<8));
  9483. return o.join("");
  9484. }
  9485. function utf16beread(data) {
  9486. var o = [];
  9487. for(var i = 0; i < (data.length>>1); ++i) o[i] = String.fromCharCode(data.charCodeAt(2*i+1) + (data.charCodeAt(2*i)<<8));
  9488. return o.join("");
  9489. }
  9490. var debom = function(data) {
  9491. var c1 = data.charCodeAt(0), c2 = data.charCodeAt(1);
  9492. if(c1 == 0xFF && c2 == 0xFE) return utf16leread(data.slice(2));
  9493. if(c1 == 0xFE && c2 == 0xFF) return utf16beread(data.slice(2));
  9494. if(c1 == 0xFEFF) return data.slice(1);
  9495. return data;
  9496. };
  9497. var _getchar = function _gc1(x) { return String.fromCharCode(x); };
  9498. var _getansi = function _ga1(x) { return String.fromCharCode(x); };
  9499. if(typeof cptable !== 'undefined') {
  9500. set_cp = function(cp) { current_codepage = cp; set_ansi(cp); };
  9501. debom = function(data) {
  9502. if(data.charCodeAt(0) === 0xFF && data.charCodeAt(1) === 0xFE) { return cptable.utils.decode(1200, char_codes(data.slice(2))); }
  9503. return data;
  9504. };
  9505. _getchar = function _gc2(x) {
  9506. if(current_codepage === 1200) return String.fromCharCode(x);
  9507. return cptable.utils.decode(current_codepage, [x&255,x>>8])[0];
  9508. };
  9509. _getansi = function _ga2(x) {
  9510. return cptable.utils.decode(current_ansi, [x])[0];
  9511. };
  9512. }
  9513. var DENSE = null;
  9514. var DIF_XL = true;
  9515. var Base64 = (function make_b64(){
  9516. var map = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=";
  9517. return {
  9518. encode: function(input) {
  9519. var o = "";
  9520. var c1=0, c2=0, c3=0, e1=0, e2=0, e3=0, e4=0;
  9521. for(var i = 0; i < input.length; ) {
  9522. c1 = input.charCodeAt(i++);
  9523. e1 = (c1 >> 2);
  9524. c2 = input.charCodeAt(i++);
  9525. e2 = ((c1 & 3) << 4) | (c2 >> 4);
  9526. c3 = input.charCodeAt(i++);
  9527. e3 = ((c2 & 15) << 2) | (c3 >> 6);
  9528. e4 = (c3 & 63);
  9529. if (isNaN(c2)) { e3 = e4 = 64; }
  9530. else if (isNaN(c3)) { e4 = 64; }
  9531. o += map.charAt(e1) + map.charAt(e2) + map.charAt(e3) + map.charAt(e4);
  9532. }
  9533. return o;
  9534. },
  9535. decode: function b64_decode(input) {
  9536. var o = "";
  9537. var c1=0, c2=0, c3=0, e1=0, e2=0, e3=0, e4=0;
  9538. input = input.replace(/[^\w\+\/\=]/g, "");
  9539. for(var i = 0; i < input.length;) {
  9540. e1 = map.indexOf(input.charAt(i++));
  9541. e2 = map.indexOf(input.charAt(i++));
  9542. c1 = (e1 << 2) | (e2 >> 4);
  9543. o += String.fromCharCode(c1);
  9544. e3 = map.indexOf(input.charAt(i++));
  9545. c2 = ((e2 & 15) << 4) | (e3 >> 2);
  9546. if (e3 !== 64) { o += String.fromCharCode(c2); }
  9547. e4 = map.indexOf(input.charAt(i++));
  9548. c3 = ((e3 & 3) << 6) | e4;
  9549. if (e4 !== 64) { o += String.fromCharCode(c3); }
  9550. }
  9551. return o;
  9552. }
  9553. };
  9554. })();
  9555. var has_buf = (typeof Buffer !== 'undefined' && typeof process !== 'undefined' && typeof process.versions !== 'undefined' && !!process.versions.node);
  9556. var Buffer_from = function(){};
  9557. if(typeof Buffer !== 'undefined') {
  9558. var nbfs = !Buffer.from;
  9559. if(!nbfs) try { Buffer.from("foo", "utf8"); } catch(e) { nbfs = true; }
  9560. Buffer_from = nbfs ? function(buf, enc) { return (enc) ? new Buffer(buf, enc) : new Buffer(buf); } : Buffer.from.bind(Buffer);
  9561. // $FlowIgnore
  9562. if(!Buffer.alloc) Buffer.alloc = function(n) { return new Buffer(n); };
  9563. // $FlowIgnore
  9564. if(!Buffer.allocUnsafe) Buffer.allocUnsafe = function(n) { return new Buffer(n); };
  9565. }
  9566. function new_raw_buf(len) {
  9567. /* jshint -W056 */
  9568. return has_buf ? Buffer.alloc(len) : new Array(len);
  9569. /* jshint +W056 */
  9570. }
  9571. function new_unsafe_buf(len) {
  9572. /* jshint -W056 */
  9573. return has_buf ? Buffer.allocUnsafe(len) : new Array(len);
  9574. /* jshint +W056 */
  9575. }
  9576. var s2a = function s2a(s) {
  9577. if(has_buf) return Buffer_from(s, "binary");
  9578. return s.split("").map(function(x){ return x.charCodeAt(0) & 0xff; });
  9579. };
  9580. function s2ab(s) {
  9581. if(typeof ArrayBuffer === 'undefined') return s2a(s);
  9582. var buf = new ArrayBuffer(s.length), view = new Uint8Array(buf);
  9583. for (var i=0; i!=s.length; ++i) view[i] = s.charCodeAt(i) & 0xFF;
  9584. return buf;
  9585. }
  9586. function a2s(data) {
  9587. if(Array.isArray(data)) return data.map(function(c) { return String.fromCharCode(c); }).join("");
  9588. var o = []; for(var i = 0; i < data.length; ++i) o[i] = String.fromCharCode(data[i]); return o.join("");
  9589. }
  9590. function a2u(data) {
  9591. if(typeof Uint8Array === 'undefined') throw new Error("Unsupported");
  9592. return new Uint8Array(data);
  9593. }
  9594. function ab2a(data) {
  9595. if(typeof ArrayBuffer == 'undefined') throw new Error("Unsupported");
  9596. if(data instanceof ArrayBuffer) return ab2a(new Uint8Array(data));
  9597. var o = new Array(data.length);
  9598. for(var i = 0; i < data.length; ++i) o[i] = data[i];
  9599. return o;
  9600. }
  9601. var bconcat = function(bufs) { return [].concat.apply([], bufs); };
  9602. var chr0 = /\u0000/g, chr1 = /[\u0001-\u0006]/g;
  9603. /* ssf.js (C) 2013-present SheetJS -- http://sheetjs.com */
  9604. /*jshint -W041 */
  9605. var SSF = ({});
  9606. var make_ssf = function make_ssf(SSF){
  9607. SSF.version = '0.11.2';
  9608. function _strrev(x) { var o = "", i = x.length-1; while(i>=0) o += x.charAt(i--); return o; }
  9609. function fill(c,l) { var o = ""; while(o.length < l) o+=c; return o; }
  9610. function pad0(v,d){var t=""+v; return t.length>=d?t:fill('0',d-t.length)+t;}
  9611. function pad_(v,d){var t=""+v;return t.length>=d?t:fill(' ',d-t.length)+t;}
  9612. function rpad_(v,d){var t=""+v; return t.length>=d?t:t+fill(' ',d-t.length);}
  9613. function pad0r1(v,d){var t=""+Math.round(v); return t.length>=d?t:fill('0',d-t.length)+t;}
  9614. function pad0r2(v,d){var t=""+v; return t.length>=d?t:fill('0',d-t.length)+t;}
  9615. var p2_32 = Math.pow(2,32);
  9616. function pad0r(v,d){if(v>p2_32||v<-p2_32) return pad0r1(v,d); var i = Math.round(v); return pad0r2(i,d); }
  9617. function isgeneral(s, i) { i = i || 0; return s.length >= 7 + i && (s.charCodeAt(i)|32) === 103 && (s.charCodeAt(i+1)|32) === 101 && (s.charCodeAt(i+2)|32) === 110 && (s.charCodeAt(i+3)|32) === 101 && (s.charCodeAt(i+4)|32) === 114 && (s.charCodeAt(i+5)|32) === 97 && (s.charCodeAt(i+6)|32) === 108; }
  9618. var days = [
  9619. ['Sun', 'Sunday'],
  9620. ['Mon', 'Monday'],
  9621. ['Tue', 'Tuesday'],
  9622. ['Wed', 'Wednesday'],
  9623. ['Thu', 'Thursday'],
  9624. ['Fri', 'Friday'],
  9625. ['Sat', 'Saturday']
  9626. ];
  9627. var months = [
  9628. ['J', 'Jan', 'January'],
  9629. ['F', 'Feb', 'February'],
  9630. ['M', 'Mar', 'March'],
  9631. ['A', 'Apr', 'April'],
  9632. ['M', 'May', 'May'],
  9633. ['J', 'Jun', 'June'],
  9634. ['J', 'Jul', 'July'],
  9635. ['A', 'Aug', 'August'],
  9636. ['S', 'Sep', 'September'],
  9637. ['O', 'Oct', 'October'],
  9638. ['N', 'Nov', 'November'],
  9639. ['D', 'Dec', 'December']
  9640. ];
  9641. function init_table(t) {
  9642. t[0]= 'General';
  9643. t[1]= '0';
  9644. t[2]= '0.00';
  9645. t[3]= '#,##0';
  9646. t[4]= '#,##0.00';
  9647. t[9]= '0%';
  9648. t[10]= '0.00%';
  9649. t[11]= '0.00E+00';
  9650. t[12]= '# ?/?';
  9651. t[13]= '# ??/??';
  9652. t[14]= 'm/d/yy';
  9653. t[15]= 'd-mmm-yy';
  9654. t[16]= 'd-mmm';
  9655. t[17]= 'mmm-yy';
  9656. t[18]= 'h:mm AM/PM';
  9657. t[19]= 'h:mm:ss AM/PM';
  9658. t[20]= 'h:mm';
  9659. t[21]= 'h:mm:ss';
  9660. t[22]= 'm/d/yy h:mm';
  9661. t[37]= '#,##0 ;(#,##0)';
  9662. t[38]= '#,##0 ;[Red](#,##0)';
  9663. t[39]= '#,##0.00;(#,##0.00)';
  9664. t[40]= '#,##0.00;[Red](#,##0.00)';
  9665. t[45]= 'mm:ss';
  9666. t[46]= '[h]:mm:ss';
  9667. t[47]= 'mmss.0';
  9668. t[48]= '##0.0E+0';
  9669. t[49]= '@';
  9670. t[56]= '"上午/下午 "hh"時"mm"分"ss"秒 "';
  9671. }
  9672. var table_fmt = {};
  9673. init_table(table_fmt);
  9674. /* Defaults determined by systematically testing in Excel 2019 */
  9675. /* These formats appear to default to other formats in the table */
  9676. var default_map = [];
  9677. var defi = 0;
  9678. // 5 -> 37 ... 8 -> 40
  9679. for(defi = 5; defi <= 8; ++defi) default_map[defi] = 32 + defi;
  9680. // 23 -> 0 ... 26 -> 0
  9681. for(defi = 23; defi <= 26; ++defi) default_map[defi] = 0;
  9682. // 27 -> 14 ... 31 -> 14
  9683. for(defi = 27; defi <= 31; ++defi) default_map[defi] = 14;
  9684. // 50 -> 14 ... 58 -> 14
  9685. for(defi = 50; defi <= 58; ++defi) default_map[defi] = 14;
  9686. // 59 -> 1 ... 62 -> 4
  9687. for(defi = 59; defi <= 62; ++defi) default_map[defi] = defi - 58;
  9688. // 67 -> 9 ... 68 -> 10
  9689. for(defi = 67; defi <= 68; ++defi) default_map[defi] = defi - 58;
  9690. // 72 -> 14 ... 75 -> 17
  9691. for(defi = 72; defi <= 75; ++defi) default_map[defi] = defi - 58;
  9692. // 69 -> 12 ... 71 -> 14
  9693. for(defi = 67; defi <= 68; ++defi) default_map[defi] = defi - 57;
  9694. // 76 -> 20 ... 78 -> 22
  9695. for(defi = 76; defi <= 78; ++defi) default_map[defi] = defi - 56;
  9696. // 79 -> 45 ... 81 -> 47
  9697. for(defi = 79; defi <= 81; ++defi) default_map[defi] = defi - 34;
  9698. // 82 -> 0 ... 65536 -> 0 (omitted)
  9699. /* These formats technically refer to Accounting formats with no equivalent */
  9700. var default_str = [];
  9701. // 5 -- Currency, 0 decimal, black negative
  9702. default_str[5] = default_str[63] = '"$"#,##0_);\\("$"#,##0\\)';
  9703. // 6 -- Currency, 0 decimal, red negative
  9704. default_str[6] = default_str[64] = '"$"#,##0_);[Red]\\("$"#,##0\\)';
  9705. // 7 -- Currency, 2 decimal, black negative
  9706. default_str[7] = default_str[65] = '"$"#,##0.00_);\\("$"#,##0.00\\)';
  9707. // 8 -- Currency, 2 decimal, red negative
  9708. default_str[8] = default_str[66] = '"$"#,##0.00_);[Red]\\("$"#,##0.00\\)';
  9709. // 41 -- Accounting, 0 decimal, No Symbol
  9710. default_str[41] = '_(* #,##0_);_(* \\(#,##0\\);_(* "-"_);_(@_)';
  9711. // 42 -- Accounting, 0 decimal, $ Symbol
  9712. default_str[42] = '_("$"* #,##0_);_("$"* \\(#,##0\\);_("$"* "-"_);_(@_)';
  9713. // 43 -- Accounting, 2 decimal, No Symbol
  9714. default_str[43] = '_(* #,##0.00_);_(* \\(#,##0.00\\);_(* "-"??_);_(@_)';
  9715. // 44 -- Accounting, 2 decimal, $ Symbol
  9716. default_str[44] = '_("$"* #,##0.00_);_("$"* \\(#,##0.00\\);_("$"* "-"??_);_(@_)';
  9717. function frac(x, D, mixed) {
  9718. var sgn = x < 0 ? -1 : 1;
  9719. var B = x * sgn;
  9720. var P_2 = 0, P_1 = 1, P = 0;
  9721. var Q_2 = 1, Q_1 = 0, Q = 0;
  9722. var A = Math.floor(B);
  9723. while(Q_1 < D) {
  9724. A = Math.floor(B);
  9725. P = A * P_1 + P_2;
  9726. Q = A * Q_1 + Q_2;
  9727. if((B - A) < 0.00000005) break;
  9728. B = 1 / (B - A);
  9729. P_2 = P_1; P_1 = P;
  9730. Q_2 = Q_1; Q_1 = Q;
  9731. }
  9732. if(Q > D) { if(Q_1 > D) { Q = Q_2; P = P_2; } else { Q = Q_1; P = P_1; } }
  9733. if(!mixed) return [0, sgn * P, Q];
  9734. var q = Math.floor(sgn * P/Q);
  9735. return [q, sgn*P - q*Q, Q];
  9736. }
  9737. function parse_date_code(v,opts,b2) {
  9738. if(v > 2958465 || v < 0) return null;
  9739. var date = (v|0), time = Math.floor(86400 * (v - date)), dow=0;
  9740. var dout=[];
  9741. var out={D:date, T:time, u:86400*(v-date)-time,y:0,m:0,d:0,H:0,M:0,S:0,q:0};
  9742. if(Math.abs(out.u) < 1e-6) out.u = 0;
  9743. if(opts && opts.date1904) date += 1462;
  9744. if(out.u > 0.9999) {
  9745. out.u = 0;
  9746. if(++time == 86400) { out.T = time = 0; ++date; ++out.D; }
  9747. }
  9748. if(date === 60) {dout = b2 ? [1317,10,29] : [1900,2,29]; dow=3;}
  9749. else if(date === 0) {dout = b2 ? [1317,8,29] : [1900,1,0]; dow=6;}
  9750. else {
  9751. if(date > 60) --date;
  9752. /* 1 = Jan 1 1900 in Gregorian */
  9753. var d = new Date(1900, 0, 1);
  9754. d.setDate(d.getDate() + date - 1);
  9755. dout = [d.getFullYear(), d.getMonth()+1,d.getDate()];
  9756. dow = d.getDay();
  9757. if(date < 60) dow = (dow + 6) % 7;
  9758. if(b2) dow = fix_hijri(d, dout);
  9759. }
  9760. out.y = dout[0]; out.m = dout[1]; out.d = dout[2];
  9761. out.S = time % 60; time = Math.floor(time / 60);
  9762. out.M = time % 60; time = Math.floor(time / 60);
  9763. out.H = time;
  9764. out.q = dow;
  9765. return out;
  9766. }
  9767. SSF.parse_date_code = parse_date_code;
  9768. var basedate = new Date(1899, 11, 31, 0, 0, 0);
  9769. var dnthresh = basedate.getTime();
  9770. var base1904 = new Date(1900, 2, 1, 0, 0, 0);
  9771. function datenum_local(v, date1904) {
  9772. var epoch = v.getTime();
  9773. if(date1904) epoch -= 1461*24*60*60*1000;
  9774. else if(v >= base1904) epoch += 24*60*60*1000;
  9775. return (epoch - (dnthresh + (v.getTimezoneOffset() - basedate.getTimezoneOffset()) * 60000)) / (24 * 60 * 60 * 1000);
  9776. }
  9777. /* The longest 32-bit integer text is "-4294967296", exactly 11 chars */
  9778. function general_fmt_int(v) { return v.toString(10); }
  9779. SSF._general_int = general_fmt_int;
  9780. /* ECMA-376 18.8.30 numFmt*/
  9781. /* Note: `toPrecision` uses standard form when prec > E and E >= -6 */
  9782. var general_fmt_num = (function make_general_fmt_num() {
  9783. var trailing_zeroes_and_decimal = /(?:\.0*|(\.\d*[1-9])0+)$/;
  9784. function strip_decimal(o) {
  9785. return (o.indexOf(".") == -1) ? o : o.replace(trailing_zeroes_and_decimal, "$1");
  9786. }
  9787. /* General Exponential always shows 2 digits exp and trims the mantissa */
  9788. var mantissa_zeroes_and_decimal = /(?:\.0*|(\.\d*[1-9])0+)[Ee]/;
  9789. var exp_with_single_digit = /(E[+-])(\d)$/;
  9790. function normalize_exp(o) {
  9791. if(o.indexOf("E") == -1) return o;
  9792. return o.replace(mantissa_zeroes_and_decimal,"$1E").replace(exp_with_single_digit,"$10$2");
  9793. }
  9794. /* exponent >= -9 and <= 9 */
  9795. function small_exp(v) {
  9796. var w = (v<0?12:11);
  9797. var o = strip_decimal(v.toFixed(12)); if(o.length <= w) return o;
  9798. o = v.toPrecision(10); if(o.length <= w) return o;
  9799. return v.toExponential(5);
  9800. }
  9801. /* exponent >= 11 or <= -10 likely exponential */
  9802. function large_exp(v) {
  9803. var o = strip_decimal(v.toFixed(11));
  9804. return (o.length > (v<0?12:11) || o === "0" || o === "-0") ? v.toPrecision(6) : o;
  9805. }
  9806. function general_fmt_num_base(v) {
  9807. var V = Math.floor(Math.log(Math.abs(v))*Math.LOG10E), o;
  9808. if(V >= -4 && V <= -1) o = v.toPrecision(10+V);
  9809. else if(Math.abs(V) <= 9) o = small_exp(v);
  9810. else if(V === 10) o = v.toFixed(10).substr(0,12);
  9811. else o = large_exp(v);
  9812. return strip_decimal(normalize_exp(o.toUpperCase()));
  9813. }
  9814. return general_fmt_num_base;
  9815. })();
  9816. SSF._general_num = general_fmt_num;
  9817. /*
  9818. "General" rules:
  9819. - text is passed through ("@")
  9820. - booleans are rendered as TRUE/FALSE
  9821. - "up to 11 characters" displayed for numbers
  9822. - Default date format (code 14) used for Dates
  9823. TODO: technically the display depends on the width of the cell
  9824. */
  9825. function general_fmt(v, opts) {
  9826. switch(typeof v) {
  9827. case 'string': return v;
  9828. case 'boolean': return v ? "TRUE" : "FALSE";
  9829. case 'number': return (v|0) === v ? v.toString(10) : general_fmt_num(v);
  9830. case 'undefined': return "";
  9831. case 'object':
  9832. if(v == null) return "";
  9833. if(v instanceof Date) return format(14, datenum_local(v, opts && opts.date1904), opts);
  9834. }
  9835. throw new Error("unsupported value in General format: " + v);
  9836. }
  9837. SSF._general = general_fmt;
  9838. function fix_hijri(date, o) {
  9839. /* TODO: properly adjust y/m/d and */
  9840. o[0] -= 581;
  9841. var dow = date.getDay();
  9842. if(date < 60) dow = (dow + 6) % 7;
  9843. return dow;
  9844. }
  9845. //var THAI_DIGITS = "\u0E50\u0E51\u0E52\u0E53\u0E54\u0E55\u0E56\u0E57\u0E58\u0E59".split("");
  9846. /*jshint -W086 */
  9847. function write_date(type, fmt, val, ss0) {
  9848. var o="", ss=0, tt=0, y = val.y, out, outl = 0;
  9849. switch(type) {
  9850. case 98: /* 'b' buddhist year */
  9851. y = val.y + 543;
  9852. /* falls through */
  9853. case 121: /* 'y' year */
  9854. switch(fmt.length) {
  9855. case 1: case 2: out = y % 100; outl = 2; break;
  9856. default: out = y % 10000; outl = 4; break;
  9857. } break;
  9858. case 109: /* 'm' month */
  9859. switch(fmt.length) {
  9860. case 1: case 2: out = val.m; outl = fmt.length; break;
  9861. case 3: return months[val.m-1][1];
  9862. case 5: return months[val.m-1][0];
  9863. default: return months[val.m-1][2];
  9864. } break;
  9865. case 100: /* 'd' day */
  9866. switch(fmt.length) {
  9867. case 1: case 2: out = val.d; outl = fmt.length; break;
  9868. case 3: return days[val.q][0];
  9869. default: return days[val.q][1];
  9870. } break;
  9871. case 104: /* 'h' 12-hour */
  9872. switch(fmt.length) {
  9873. case 1: case 2: out = 1+(val.H+11)%12; outl = fmt.length; break;
  9874. default: throw 'bad hour format: ' + fmt;
  9875. } break;
  9876. case 72: /* 'H' 24-hour */
  9877. switch(fmt.length) {
  9878. case 1: case 2: out = val.H; outl = fmt.length; break;
  9879. default: throw 'bad hour format: ' + fmt;
  9880. } break;
  9881. case 77: /* 'M' minutes */
  9882. switch(fmt.length) {
  9883. case 1: case 2: out = val.M; outl = fmt.length; break;
  9884. default: throw 'bad minute format: ' + fmt;
  9885. } break;
  9886. case 115: /* 's' seconds */
  9887. if(fmt != 's' && fmt != 'ss' && fmt != '.0' && fmt != '.00' && fmt != '.000') throw 'bad second format: ' + fmt;
  9888. if(val.u === 0 && (fmt == "s" || fmt == "ss")) return pad0(val.S, fmt.length);
  9889. if(ss0 >= 2) tt = ss0 === 3 ? 1000 : 100;
  9890. else tt = ss0 === 1 ? 10 : 1;
  9891. ss = Math.round((tt)*(val.S + val.u));
  9892. if(ss >= 60*tt) ss = 0;
  9893. if(fmt === 's') return ss === 0 ? "0" : ""+ss/tt;
  9894. o = pad0(ss,2 + ss0);
  9895. if(fmt === 'ss') return o.substr(0,2);
  9896. return "." + o.substr(2,fmt.length-1);
  9897. case 90: /* 'Z' absolute time */
  9898. switch(fmt) {
  9899. case '[h]': case '[hh]': out = val.D*24+val.H; break;
  9900. case '[m]': case '[mm]': out = (val.D*24+val.H)*60+val.M; break;
  9901. case '[s]': case '[ss]': out = ((val.D*24+val.H)*60+val.M)*60+Math.round(val.S+val.u); break;
  9902. default: throw 'bad abstime format: ' + fmt;
  9903. } outl = fmt.length === 3 ? 1 : 2; break;
  9904. case 101: /* 'e' era */
  9905. out = y; outl = 1; break;
  9906. }
  9907. var outstr = outl > 0 ? pad0(out, outl) : "";
  9908. return outstr;
  9909. }
  9910. /*jshint +W086 */
  9911. function commaify(s) {
  9912. var w = 3;
  9913. if(s.length <= w) return s;
  9914. var j = (s.length % w), o = s.substr(0,j);
  9915. for(; j!=s.length; j+=w) o+=(o.length > 0 ? "," : "") + s.substr(j,w);
  9916. return o;
  9917. }
  9918. var write_num = (function make_write_num(){
  9919. var pct1 = /%/g;
  9920. function write_num_pct(type, fmt, val){
  9921. var sfmt = fmt.replace(pct1,""), mul = fmt.length - sfmt.length;
  9922. return write_num(type, sfmt, val * Math.pow(10,2*mul)) + fill("%",mul);
  9923. }
  9924. function write_num_cm(type, fmt, val){
  9925. var idx = fmt.length - 1;
  9926. while(fmt.charCodeAt(idx-1) === 44) --idx;
  9927. return write_num(type, fmt.substr(0,idx), val / Math.pow(10,3*(fmt.length-idx)));
  9928. }
  9929. function write_num_exp(fmt, val){
  9930. var o;
  9931. var idx = fmt.indexOf("E") - fmt.indexOf(".") - 1;
  9932. if(fmt.match(/^#+0.0E\+0$/)) {
  9933. if(val == 0) return "0.0E+0";
  9934. else if(val < 0) return "-" + write_num_exp(fmt, -val);
  9935. var period = fmt.indexOf("."); if(period === -1) period=fmt.indexOf('E');
  9936. var ee = Math.floor(Math.log(val)*Math.LOG10E)%period;
  9937. if(ee < 0) ee += period;
  9938. o = (val/Math.pow(10,ee)).toPrecision(idx+1+(period+ee)%period);
  9939. if(o.indexOf("e") === -1) {
  9940. var fakee = Math.floor(Math.log(val)*Math.LOG10E);
  9941. if(o.indexOf(".") === -1) o = o.charAt(0) + "." + o.substr(1) + "E+" + (fakee - o.length+ee);
  9942. else o += "E+" + (fakee - ee);
  9943. while(o.substr(0,2) === "0.") {
  9944. o = o.charAt(0) + o.substr(2,period) + "." + o.substr(2+period);
  9945. o = o.replace(/^0+([1-9])/,"$1").replace(/^0+\./,"0.");
  9946. }
  9947. o = o.replace(/\+-/,"-");
  9948. }
  9949. o = o.replace(/^([+-]?)(\d*)\.(\d*)[Ee]/,function($$,$1,$2,$3) { return $1 + $2 + $3.substr(0,(period+ee)%period) + "." + $3.substr(ee) + "E"; });
  9950. } else o = val.toExponential(idx);
  9951. if(fmt.match(/E\+00$/) && o.match(/e[+-]\d$/)) o = o.substr(0,o.length-1) + "0" + o.charAt(o.length-1);
  9952. if(fmt.match(/E\-/) && o.match(/e\+/)) o = o.replace(/e\+/,"e");
  9953. return o.replace("e","E");
  9954. }
  9955. var frac1 = /# (\?+)( ?)\/( ?)(\d+)/;
  9956. function write_num_f1(r, aval, sign) {
  9957. var den = parseInt(r[4],10), rr = Math.round(aval * den), base = Math.floor(rr/den);
  9958. var myn = (rr - base*den), myd = den;
  9959. return sign + (base === 0 ? "" : ""+base) + " " + (myn === 0 ? fill(" ", r[1].length + 1 + r[4].length) : pad_(myn,r[1].length) + r[2] + "/" + r[3] + pad0(myd,r[4].length));
  9960. }
  9961. function write_num_f2(r, aval, sign) {
  9962. return sign + (aval === 0 ? "" : ""+aval) + fill(" ", r[1].length + 2 + r[4].length);
  9963. }
  9964. var dec1 = /^#*0*\.([0#]+)/;
  9965. var closeparen = /\).*[0#]/;
  9966. var phone = /\(###\) ###\\?-####/;
  9967. function hashq(str) {
  9968. var o = "", cc;
  9969. for(var i = 0; i != str.length; ++i) switch((cc=str.charCodeAt(i))) {
  9970. case 35: break;
  9971. case 63: o+= " "; break;
  9972. case 48: o+= "0"; break;
  9973. default: o+= String.fromCharCode(cc);
  9974. }
  9975. return o;
  9976. }
  9977. function rnd(val, d) { var dd = Math.pow(10,d); return ""+(Math.round(val * dd)/dd); }
  9978. function dec(val, d) {
  9979. var _frac = val - Math.floor(val), dd = Math.pow(10,d);
  9980. if (d < ('' + Math.round(_frac * dd)).length) return 0;
  9981. return Math.round(_frac * dd);
  9982. }
  9983. function carry(val, d) {
  9984. if (d < ('' + Math.round((val-Math.floor(val))*Math.pow(10,d))).length) {
  9985. return 1;
  9986. }
  9987. return 0;
  9988. }
  9989. function flr(val) {
  9990. if(val < 2147483647 && val > -2147483648) return ""+(val >= 0 ? (val|0) : (val-1|0));
  9991. return ""+Math.floor(val);
  9992. }
  9993. function write_num_flt(type, fmt, val) {
  9994. if(type.charCodeAt(0) === 40 && !fmt.match(closeparen)) {
  9995. var ffmt = fmt.replace(/\( */,"").replace(/ \)/,"").replace(/\)/,"");
  9996. if(val >= 0) return write_num_flt('n', ffmt, val);
  9997. return '(' + write_num_flt('n', ffmt, -val) + ')';
  9998. }
  9999. if(fmt.charCodeAt(fmt.length - 1) === 44) return write_num_cm(type, fmt, val);
  10000. if(fmt.indexOf('%') !== -1) return write_num_pct(type, fmt, val);
  10001. if(fmt.indexOf('E') !== -1) return write_num_exp(fmt, val);
  10002. if(fmt.charCodeAt(0) === 36) return "$"+write_num_flt(type,fmt.substr(fmt.charAt(1)==' '?2:1),val);
  10003. var o;
  10004. var r, ri, ff, aval = Math.abs(val), sign = val < 0 ? "-" : "";
  10005. if(fmt.match(/^00+$/)) return sign + pad0r(aval,fmt.length);
  10006. if(fmt.match(/^[#?]+$/)) {
  10007. o = pad0r(val,0); if(o === "0") o = "";
  10008. return o.length > fmt.length ? o : hashq(fmt.substr(0,fmt.length-o.length)) + o;
  10009. }
  10010. if((r = fmt.match(frac1))) return write_num_f1(r, aval, sign);
  10011. if(fmt.match(/^#+0+$/)) return sign + pad0r(aval,fmt.length - fmt.indexOf("0"));
  10012. if((r = fmt.match(dec1))) {
  10013. o = rnd(val, r[1].length).replace(/^([^\.]+)$/,"$1."+hashq(r[1])).replace(/\.$/,"."+hashq(r[1])).replace(/\.(\d*)$/,function($$, $1) { return "." + $1 + fill("0", hashq(r[1]).length-$1.length); });
  10014. return fmt.indexOf("0.") !== -1 ? o : o.replace(/^0\./,".");
  10015. }
  10016. fmt = fmt.replace(/^#+([0.])/, "$1");
  10017. if((r = fmt.match(/^(0*)\.(#*)$/))) {
  10018. return sign + rnd(aval, r[2].length).replace(/\.(\d*[1-9])0*$/,".$1").replace(/^(-?\d*)$/,"$1.").replace(/^0\./,r[1].length?"0.":".");
  10019. }
  10020. if((r = fmt.match(/^#{1,3},##0(\.?)$/))) return sign + commaify(pad0r(aval,0));
  10021. if((r = fmt.match(/^#,##0\.([#0]*0)$/))) {
  10022. return val < 0 ? "-" + write_num_flt(type, fmt, -val) : commaify(""+(Math.floor(val) + carry(val, r[1].length))) + "." + pad0(dec(val, r[1].length),r[1].length);
  10023. }
  10024. if((r = fmt.match(/^#,#*,#0/))) return write_num_flt(type,fmt.replace(/^#,#*,/,""),val);
  10025. if((r = fmt.match(/^([0#]+)(\\?-([0#]+))+$/))) {
  10026. o = _strrev(write_num_flt(type, fmt.replace(/[\\-]/g,""), val));
  10027. ri = 0;
  10028. return _strrev(_strrev(fmt.replace(/\\/g,"")).replace(/[0#]/g,function(x){return ri<o.length?o.charAt(ri++):x==='0'?'0':"";}));
  10029. }
  10030. if(fmt.match(phone)) {
  10031. o = write_num_flt(type, "##########", val);
  10032. return "(" + o.substr(0,3) + ") " + o.substr(3, 3) + "-" + o.substr(6);
  10033. }
  10034. var oa = "";
  10035. if((r = fmt.match(/^([#0?]+)( ?)\/( ?)([#0?]+)/))) {
  10036. ri = Math.min(r[4].length,7);
  10037. ff = frac(aval, Math.pow(10,ri)-1, false);
  10038. o = "" + sign;
  10039. oa = write_num("n", r[1], ff[1]);
  10040. if(oa.charAt(oa.length-1) == " ") oa = oa.substr(0,oa.length-1) + "0";
  10041. o += oa + r[2] + "/" + r[3];
  10042. oa = rpad_(ff[2],ri);
  10043. if(oa.length < r[4].length) oa = hashq(r[4].substr(r[4].length-oa.length)) + oa;
  10044. o += oa;
  10045. return o;
  10046. }
  10047. if((r = fmt.match(/^# ([#0?]+)( ?)\/( ?)([#0?]+)/))) {
  10048. ri = Math.min(Math.max(r[1].length, r[4].length),7);
  10049. ff = frac(aval, Math.pow(10,ri)-1, true);
  10050. return sign + (ff[0]||(ff[1] ? "" : "0")) + " " + (ff[1] ? pad_(ff[1],ri) + r[2] + "/" + r[3] + rpad_(ff[2],ri): fill(" ", 2*ri+1 + r[2].length + r[3].length));
  10051. }
  10052. if((r = fmt.match(/^[#0?]+$/))) {
  10053. o = pad0r(val, 0);
  10054. if(fmt.length <= o.length) return o;
  10055. return hashq(fmt.substr(0,fmt.length-o.length)) + o;
  10056. }
  10057. if((r = fmt.match(/^([#0?]+)\.([#0]+)$/))) {
  10058. o = "" + val.toFixed(Math.min(r[2].length,10)).replace(/([^0])0+$/,"$1");
  10059. ri = o.indexOf(".");
  10060. var lres = fmt.indexOf(".") - ri, rres = fmt.length - o.length - lres;
  10061. return hashq(fmt.substr(0,lres) + o + fmt.substr(fmt.length-rres));
  10062. }
  10063. if((r = fmt.match(/^00,000\.([#0]*0)$/))) {
  10064. ri = dec(val, r[1].length);
  10065. return val < 0 ? "-" + write_num_flt(type, fmt, -val) : commaify(flr(val)).replace(/^\d,\d{3}$/,"0$&").replace(/^\d*$/,function($$) { return "00," + ($$.length < 3 ? pad0(0,3-$$.length) : "") + $$; }) + "." + pad0(ri,r[1].length);
  10066. }
  10067. switch(fmt) {
  10068. case "###,##0.00": return write_num_flt(type, "#,##0.00", val);
  10069. case "###,###":
  10070. case "##,###":
  10071. case "#,###": var x = commaify(pad0r(aval,0)); return x !== "0" ? sign + x : "";
  10072. case "###,###.00": return write_num_flt(type, "###,##0.00",val).replace(/^0\./,".");
  10073. case "#,###.00": return write_num_flt(type, "#,##0.00",val).replace(/^0\./,".");
  10074. default:
  10075. }
  10076. throw new Error("unsupported format |" + fmt + "|");
  10077. }
  10078. function write_num_cm2(type, fmt, val){
  10079. var idx = fmt.length - 1;
  10080. while(fmt.charCodeAt(idx-1) === 44) --idx;
  10081. return write_num(type, fmt.substr(0,idx), val / Math.pow(10,3*(fmt.length-idx)));
  10082. }
  10083. function write_num_pct2(type, fmt, val){
  10084. var sfmt = fmt.replace(pct1,""), mul = fmt.length - sfmt.length;
  10085. return write_num(type, sfmt, val * Math.pow(10,2*mul)) + fill("%",mul);
  10086. }
  10087. function write_num_exp2(fmt, val){
  10088. var o;
  10089. var idx = fmt.indexOf("E") - fmt.indexOf(".") - 1;
  10090. if(fmt.match(/^#+0.0E\+0$/)) {
  10091. if(val == 0) return "0.0E+0";
  10092. else if(val < 0) return "-" + write_num_exp2(fmt, -val);
  10093. var period = fmt.indexOf("."); if(period === -1) period=fmt.indexOf('E');
  10094. var ee = Math.floor(Math.log(val)*Math.LOG10E)%period;
  10095. if(ee < 0) ee += period;
  10096. o = (val/Math.pow(10,ee)).toPrecision(idx+1+(period+ee)%period);
  10097. if(!o.match(/[Ee]/)) {
  10098. var fakee = Math.floor(Math.log(val)*Math.LOG10E);
  10099. if(o.indexOf(".") === -1) o = o.charAt(0) + "." + o.substr(1) + "E+" + (fakee - o.length+ee);
  10100. else o += "E+" + (fakee - ee);
  10101. o = o.replace(/\+-/,"-");
  10102. }
  10103. o = o.replace(/^([+-]?)(\d*)\.(\d*)[Ee]/,function($$,$1,$2,$3) { return $1 + $2 + $3.substr(0,(period+ee)%period) + "." + $3.substr(ee) + "E"; });
  10104. } else o = val.toExponential(idx);
  10105. if(fmt.match(/E\+00$/) && o.match(/e[+-]\d$/)) o = o.substr(0,o.length-1) + "0" + o.charAt(o.length-1);
  10106. if(fmt.match(/E\-/) && o.match(/e\+/)) o = o.replace(/e\+/,"e");
  10107. return o.replace("e","E");
  10108. }
  10109. function write_num_int(type, fmt, val) {
  10110. if(type.charCodeAt(0) === 40 && !fmt.match(closeparen)) {
  10111. var ffmt = fmt.replace(/\( */,"").replace(/ \)/,"").replace(/\)/,"");
  10112. if(val >= 0) return write_num_int('n', ffmt, val);
  10113. return '(' + write_num_int('n', ffmt, -val) + ')';
  10114. }
  10115. if(fmt.charCodeAt(fmt.length - 1) === 44) return write_num_cm2(type, fmt, val);
  10116. if(fmt.indexOf('%') !== -1) return write_num_pct2(type, fmt, val);
  10117. if(fmt.indexOf('E') !== -1) return write_num_exp2(fmt, val);
  10118. if(fmt.charCodeAt(0) === 36) return "$"+write_num_int(type,fmt.substr(fmt.charAt(1)==' '?2:1),val);
  10119. var o;
  10120. var r, ri, ff, aval = Math.abs(val), sign = val < 0 ? "-" : "";
  10121. if(fmt.match(/^00+$/)) return sign + pad0(aval,fmt.length);
  10122. if(fmt.match(/^[#?]+$/)) {
  10123. o = (""+val); if(val === 0) o = "";
  10124. return o.length > fmt.length ? o : hashq(fmt.substr(0,fmt.length-o.length)) + o;
  10125. }
  10126. if((r = fmt.match(frac1))) return write_num_f2(r, aval, sign);
  10127. if(fmt.match(/^#+0+$/)) return sign + pad0(aval,fmt.length - fmt.indexOf("0"));
  10128. if((r = fmt.match(dec1))) {
  10129. o = (""+val).replace(/^([^\.]+)$/,"$1."+hashq(r[1])).replace(/\.$/,"."+hashq(r[1]));
  10130. o = o.replace(/\.(\d*)$/,function($$, $1) {
  10131. return "." + $1 + fill("0", hashq(r[1]).length-$1.length); });
  10132. return fmt.indexOf("0.") !== -1 ? o : o.replace(/^0\./,".");
  10133. }
  10134. fmt = fmt.replace(/^#+([0.])/, "$1");
  10135. if((r = fmt.match(/^(0*)\.(#*)$/))) {
  10136. return sign + (""+aval).replace(/\.(\d*[1-9])0*$/,".$1").replace(/^(-?\d*)$/,"$1.").replace(/^0\./,r[1].length?"0.":".");
  10137. }
  10138. if((r = fmt.match(/^#{1,3},##0(\.?)$/))) return sign + commaify((""+aval));
  10139. if((r = fmt.match(/^#,##0\.([#0]*0)$/))) {
  10140. return val < 0 ? "-" + write_num_int(type, fmt, -val) : commaify((""+val)) + "." + fill('0',r[1].length);
  10141. }
  10142. if((r = fmt.match(/^#,#*,#0/))) return write_num_int(type,fmt.replace(/^#,#*,/,""),val);
  10143. if((r = fmt.match(/^([0#]+)(\\?-([0#]+))+$/))) {
  10144. o = _strrev(write_num_int(type, fmt.replace(/[\\-]/g,""), val));
  10145. ri = 0;
  10146. return _strrev(_strrev(fmt.replace(/\\/g,"")).replace(/[0#]/g,function(x){return ri<o.length?o.charAt(ri++):x==='0'?'0':"";}));
  10147. }
  10148. if(fmt.match(phone)) {
  10149. o = write_num_int(type, "##########", val);
  10150. return "(" + o.substr(0,3) + ") " + o.substr(3, 3) + "-" + o.substr(6);
  10151. }
  10152. var oa = "";
  10153. if((r = fmt.match(/^([#0?]+)( ?)\/( ?)([#0?]+)/))) {
  10154. ri = Math.min(r[4].length,7);
  10155. ff = frac(aval, Math.pow(10,ri)-1, false);
  10156. o = "" + sign;
  10157. oa = write_num("n", r[1], ff[1]);
  10158. if(oa.charAt(oa.length-1) == " ") oa = oa.substr(0,oa.length-1) + "0";
  10159. o += oa + r[2] + "/" + r[3];
  10160. oa = rpad_(ff[2],ri);
  10161. if(oa.length < r[4].length) oa = hashq(r[4].substr(r[4].length-oa.length)) + oa;
  10162. o += oa;
  10163. return o;
  10164. }
  10165. if((r = fmt.match(/^# ([#0?]+)( ?)\/( ?)([#0?]+)/))) {
  10166. ri = Math.min(Math.max(r[1].length, r[4].length),7);
  10167. ff = frac(aval, Math.pow(10,ri)-1, true);
  10168. return sign + (ff[0]||(ff[1] ? "" : "0")) + " " + (ff[1] ? pad_(ff[1],ri) + r[2] + "/" + r[3] + rpad_(ff[2],ri): fill(" ", 2*ri+1 + r[2].length + r[3].length));
  10169. }
  10170. if((r = fmt.match(/^[#0?]+$/))) {
  10171. o = "" + val;
  10172. if(fmt.length <= o.length) return o;
  10173. return hashq(fmt.substr(0,fmt.length-o.length)) + o;
  10174. }
  10175. if((r = fmt.match(/^([#0]+)\.([#0]+)$/))) {
  10176. o = "" + val.toFixed(Math.min(r[2].length,10)).replace(/([^0])0+$/,"$1");
  10177. ri = o.indexOf(".");
  10178. var lres = fmt.indexOf(".") - ri, rres = fmt.length - o.length - lres;
  10179. return hashq(fmt.substr(0,lres) + o + fmt.substr(fmt.length-rres));
  10180. }
  10181. if((r = fmt.match(/^00,000\.([#0]*0)$/))) {
  10182. return val < 0 ? "-" + write_num_int(type, fmt, -val) : commaify(""+val).replace(/^\d,\d{3}$/,"0$&").replace(/^\d*$/,function($$) { return "00," + ($$.length < 3 ? pad0(0,3-$$.length) : "") + $$; }) + "." + pad0(0,r[1].length);
  10183. }
  10184. switch(fmt) {
  10185. case "###,###":
  10186. case "##,###":
  10187. case "#,###": var x = commaify(""+aval); return x !== "0" ? sign + x : "";
  10188. default:
  10189. if(fmt.match(/\.[0#?]*$/)) return write_num_int(type, fmt.slice(0,fmt.lastIndexOf(".")), val) + hashq(fmt.slice(fmt.lastIndexOf(".")));
  10190. }
  10191. throw new Error("unsupported format |" + fmt + "|");
  10192. }
  10193. return function write_num(type, fmt, val) {
  10194. return (val|0) === val ? write_num_int(type, fmt, val) : write_num_flt(type, fmt, val);
  10195. };})();
  10196. function split_fmt(fmt) {
  10197. var out = [];
  10198. var in_str = false/*, cc*/;
  10199. for(var i = 0, j = 0; i < fmt.length; ++i) switch((/*cc=*/fmt.charCodeAt(i))) {
  10200. case 34: /* '"' */
  10201. in_str = !in_str; break;
  10202. case 95: case 42: case 92: /* '_' '*' '\\' */
  10203. ++i; break;
  10204. case 59: /* ';' */
  10205. out[out.length] = fmt.substr(j,i-j);
  10206. j = i+1;
  10207. }
  10208. out[out.length] = fmt.substr(j);
  10209. if(in_str === true) throw new Error("Format |" + fmt + "| unterminated string ");
  10210. return out;
  10211. }
  10212. SSF._split = split_fmt;
  10213. var abstime = /\[[HhMmSs\u0E0A\u0E19\u0E17]*\]/;
  10214. function fmt_is_date(fmt) {
  10215. var i = 0, /*cc = 0,*/ c = "", o = "";
  10216. while(i < fmt.length) {
  10217. switch((c = fmt.charAt(i))) {
  10218. case 'G': if(isgeneral(fmt, i)) i+= 6; i++; break;
  10219. case '"': for(;(/*cc=*/fmt.charCodeAt(++i)) !== 34 && i < fmt.length;){/*empty*/} ++i; break;
  10220. case '\\': i+=2; break;
  10221. case '_': i+=2; break;
  10222. case '@': ++i; break;
  10223. case 'B': case 'b':
  10224. if(fmt.charAt(i+1) === "1" || fmt.charAt(i+1) === "2") return true;
  10225. /* falls through */
  10226. case 'M': case 'D': case 'Y': case 'H': case 'S': case 'E':
  10227. /* falls through */
  10228. case 'm': case 'd': case 'y': case 'h': case 's': case 'e': case 'g': return true;
  10229. case 'A': case 'a': case '上':
  10230. if(fmt.substr(i, 3).toUpperCase() === "A/P") return true;
  10231. if(fmt.substr(i, 5).toUpperCase() === "AM/PM") return true;
  10232. if(fmt.substr(i, 5).toUpperCase() === "上午/下午") return true;
  10233. ++i; break;
  10234. case '[':
  10235. o = c;
  10236. while(fmt.charAt(i++) !== ']' && i < fmt.length) o += fmt.charAt(i);
  10237. if(o.match(abstime)) return true;
  10238. break;
  10239. case '.':
  10240. /* falls through */
  10241. case '0': case '#':
  10242. while(i < fmt.length && ("0#?.,E+-%".indexOf(c=fmt.charAt(++i)) > -1 || (c=='\\' && fmt.charAt(i+1) == "-" && "0#".indexOf(fmt.charAt(i+2))>-1))){/* empty */}
  10243. break;
  10244. case '?': while(fmt.charAt(++i) === c){/* empty */} break;
  10245. case '*': ++i; if(fmt.charAt(i) == ' ' || fmt.charAt(i) == '*') ++i; break;
  10246. case '(': case ')': ++i; break;
  10247. case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9':
  10248. while(i < fmt.length && "0123456789".indexOf(fmt.charAt(++i)) > -1){/* empty */} break;
  10249. case ' ': ++i; break;
  10250. default: ++i; break;
  10251. }
  10252. }
  10253. return false;
  10254. }
  10255. SSF.is_date = fmt_is_date;
  10256. function eval_fmt(fmt, v, opts, flen) {
  10257. var out = [], o = "", i = 0, c = "", lst='t', dt, j, cc;
  10258. var hr='H';
  10259. /* Tokenize */
  10260. while(i < fmt.length) {
  10261. switch((c = fmt.charAt(i))) {
  10262. case 'G': /* General */
  10263. if(!isgeneral(fmt, i)) throw new Error('unrecognized character ' + c + ' in ' +fmt);
  10264. out[out.length] = {t:'G', v:'General'}; i+=7; break;
  10265. case '"': /* Literal text */
  10266. for(o="";(cc=fmt.charCodeAt(++i)) !== 34 && i < fmt.length;) o += String.fromCharCode(cc);
  10267. out[out.length] = {t:'t', v:o}; ++i; break;
  10268. case '\\': var w = fmt.charAt(++i), t = (w === "(" || w === ")") ? w : 't';
  10269. out[out.length] = {t:t, v:w}; ++i; break;
  10270. case '_': out[out.length] = {t:'t', v:" "}; i+=2; break;
  10271. case '@': /* Text Placeholder */
  10272. out[out.length] = {t:'T', v:v}; ++i; break;
  10273. case 'B': case 'b':
  10274. if(fmt.charAt(i+1) === "1" || fmt.charAt(i+1) === "2") {
  10275. if(dt==null) { dt=parse_date_code(v, opts, fmt.charAt(i+1) === "2"); if(dt==null) return ""; }
  10276. out[out.length] = {t:'X', v:fmt.substr(i,2)}; lst = c; i+=2; break;
  10277. }
  10278. /* falls through */
  10279. case 'M': case 'D': case 'Y': case 'H': case 'S': case 'E':
  10280. c = c.toLowerCase();
  10281. /* falls through */
  10282. case 'm': case 'd': case 'y': case 'h': case 's': case 'e': case 'g':
  10283. if(v < 0) return "";
  10284. if(dt==null) { dt=parse_date_code(v, opts); if(dt==null) return ""; }
  10285. o = c; while(++i < fmt.length && fmt.charAt(i).toLowerCase() === c) o+=c;
  10286. if(c === 'm' && lst.toLowerCase() === 'h') c = 'M';
  10287. if(c === 'h') c = hr;
  10288. out[out.length] = {t:c, v:o}; lst = c; break;
  10289. case 'A': case 'a': case '上':
  10290. var q={t:c, v:c};
  10291. if(dt==null) dt=parse_date_code(v, opts);
  10292. if(fmt.substr(i, 3).toUpperCase() === "A/P") { if(dt!=null) q.v = dt.H >= 12 ? "P" : "A"; q.t = 'T'; hr='h';i+=3;}
  10293. else if(fmt.substr(i,5).toUpperCase() === "AM/PM") { if(dt!=null) q.v = dt.H >= 12 ? "PM" : "AM"; q.t = 'T'; i+=5; hr='h'; }
  10294. else if(fmt.substr(i,5).toUpperCase() === "上午/下午") { if(dt!=null) q.v = dt.H >= 12 ? "下午" : "上午"; q.t = 'T'; i+=5; hr='h'; }
  10295. else { q.t = "t"; ++i; }
  10296. if(dt==null && q.t === 'T') return "";
  10297. out[out.length] = q; lst = c; break;
  10298. case '[':
  10299. o = c;
  10300. while(fmt.charAt(i++) !== ']' && i < fmt.length) o += fmt.charAt(i);
  10301. if(o.slice(-1) !== ']') throw 'unterminated "[" block: |' + o + '|';
  10302. if(o.match(abstime)) {
  10303. if(dt==null) { dt=parse_date_code(v, opts); if(dt==null) return ""; }
  10304. out[out.length] = {t:'Z', v:o.toLowerCase()};
  10305. lst = o.charAt(1);
  10306. } else if(o.indexOf("$") > -1) {
  10307. o = (o.match(/\$([^-\[\]]*)/)||[])[1]||"$";
  10308. if(!fmt_is_date(fmt)) out[out.length] = {t:'t',v:o};
  10309. }
  10310. break;
  10311. /* Numbers */
  10312. case '.':
  10313. if(dt != null) {
  10314. o = c; while(++i < fmt.length && (c=fmt.charAt(i)) === "0") o += c;
  10315. out[out.length] = {t:'s', v:o}; break;
  10316. }
  10317. /* falls through */
  10318. case '0': case '#':
  10319. o = c; while(++i < fmt.length && "0#?.,E+-%".indexOf(c=fmt.charAt(i)) > -1) o += c;
  10320. out[out.length] = {t:'n', v:o}; break;
  10321. case '?':
  10322. o = c; while(fmt.charAt(++i) === c) o+=c;
  10323. out[out.length] = {t:c, v:o}; lst = c; break;
  10324. case '*': ++i; if(fmt.charAt(i) == ' ' || fmt.charAt(i) == '*') ++i; break; // **
  10325. case '(': case ')': out[out.length] = {t:(flen===1?'t':c), v:c}; ++i; break;
  10326. case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9':
  10327. o = c; while(i < fmt.length && "0123456789".indexOf(fmt.charAt(++i)) > -1) o+=fmt.charAt(i);
  10328. out[out.length] = {t:'D', v:o}; break;
  10329. case ' ': out[out.length] = {t:c, v:c}; ++i; break;
  10330. case '$': out[out.length] = {t:'t', v:'$'}; ++i; break;
  10331. default:
  10332. if(",$-+/():!^&'~{}<>=€acfijklopqrtuvwxzP".indexOf(c) === -1) throw new Error('unrecognized character ' + c + ' in ' + fmt);
  10333. out[out.length] = {t:'t', v:c}; ++i; break;
  10334. }
  10335. }
  10336. /* Scan for date/time parts */
  10337. var bt = 0, ss0 = 0, ssm;
  10338. for(i=out.length-1, lst='t'; i >= 0; --i) {
  10339. switch(out[i].t) {
  10340. case 'h': case 'H': out[i].t = hr; lst='h'; if(bt < 1) bt = 1; break;
  10341. case 's':
  10342. if((ssm=out[i].v.match(/\.0+$/))) ss0=Math.max(ss0,ssm[0].length-1);
  10343. if(bt < 3) bt = 3;
  10344. /* falls through */
  10345. case 'd': case 'y': case 'M': case 'e': lst=out[i].t; break;
  10346. case 'm': if(lst === 's') { out[i].t = 'M'; if(bt < 2) bt = 2; } break;
  10347. case 'X': /*if(out[i].v === "B2");*/
  10348. break;
  10349. case 'Z':
  10350. if(bt < 1 && out[i].v.match(/[Hh]/)) bt = 1;
  10351. if(bt < 2 && out[i].v.match(/[Mm]/)) bt = 2;
  10352. if(bt < 3 && out[i].v.match(/[Ss]/)) bt = 3;
  10353. }
  10354. }
  10355. /* time rounding depends on presence of minute / second / usec fields */
  10356. switch(bt) {
  10357. case 0: break;
  10358. case 1:
  10359. if(dt.u >= 0.5) { dt.u = 0; ++dt.S; }
  10360. if(dt.S >= 60) { dt.S = 0; ++dt.M; }
  10361. if(dt.M >= 60) { dt.M = 0; ++dt.H; }
  10362. break;
  10363. case 2:
  10364. if(dt.u >= 0.5) { dt.u = 0; ++dt.S; }
  10365. if(dt.S >= 60) { dt.S = 0; ++dt.M; }
  10366. break;
  10367. }
  10368. /* replace fields */
  10369. var nstr = "", jj;
  10370. for(i=0; i < out.length; ++i) {
  10371. switch(out[i].t) {
  10372. case 't': case 'T': case ' ': case 'D': break;
  10373. case 'X': out[i].v = ""; out[i].t = ";"; break;
  10374. case 'd': case 'm': case 'y': case 'h': case 'H': case 'M': case 's': case 'e': case 'b': case 'Z':
  10375. out[i].v = write_date(out[i].t.charCodeAt(0), out[i].v, dt, ss0);
  10376. out[i].t = 't'; break;
  10377. case 'n': case '?':
  10378. jj = i+1;
  10379. while(out[jj] != null && (
  10380. (c=out[jj].t) === "?" || c === "D" ||
  10381. ((c === " " || c === "t") && out[jj+1] != null && (out[jj+1].t === '?' || out[jj+1].t === "t" && out[jj+1].v === '/')) ||
  10382. (out[i].t === '(' && (c === ' ' || c === 'n' || c === ')')) ||
  10383. (c === 't' && (out[jj].v === '/' || out[jj].v === ' ' && out[jj+1] != null && out[jj+1].t == '?'))
  10384. )) {
  10385. out[i].v += out[jj].v;
  10386. out[jj] = {v:"", t:";"}; ++jj;
  10387. }
  10388. nstr += out[i].v;
  10389. i = jj-1; break;
  10390. case 'G': out[i].t = 't'; out[i].v = general_fmt(v,opts); break;
  10391. }
  10392. }
  10393. var vv = "", myv, ostr;
  10394. if(nstr.length > 0) {
  10395. if(nstr.charCodeAt(0) == 40) /* '(' */ {
  10396. myv = (v<0&&nstr.charCodeAt(0) === 45 ? -v : v);
  10397. ostr = write_num('n', nstr, myv);
  10398. } else {
  10399. myv = (v<0 && flen > 1 ? -v : v);
  10400. ostr = write_num('n', nstr, myv);
  10401. if(myv < 0 && out[0] && out[0].t == 't') {
  10402. ostr = ostr.substr(1);
  10403. out[0].v = "-" + out[0].v;
  10404. }
  10405. }
  10406. jj=ostr.length-1;
  10407. var decpt = out.length;
  10408. for(i=0; i < out.length; ++i) if(out[i] != null && out[i].t != 't' && out[i].v.indexOf(".") > -1) { decpt = i; break; }
  10409. var lasti=out.length;
  10410. if(decpt === out.length && ostr.indexOf("E") === -1) {
  10411. for(i=out.length-1; i>= 0;--i) {
  10412. if(out[i] == null || 'n?'.indexOf(out[i].t) === -1) continue;
  10413. if(jj>=out[i].v.length-1) { jj -= out[i].v.length; out[i].v = ostr.substr(jj+1, out[i].v.length); }
  10414. else if(jj < 0) out[i].v = "";
  10415. else { out[i].v = ostr.substr(0, jj+1); jj = -1; }
  10416. out[i].t = 't';
  10417. lasti = i;
  10418. }
  10419. if(jj>=0 && lasti<out.length) out[lasti].v = ostr.substr(0,jj+1) + out[lasti].v;
  10420. }
  10421. else if(decpt !== out.length && ostr.indexOf("E") === -1) {
  10422. jj = ostr.indexOf(".")-1;
  10423. for(i=decpt; i>= 0; --i) {
  10424. if(out[i] == null || 'n?'.indexOf(out[i].t) === -1) continue;
  10425. j=out[i].v.indexOf(".")>-1&&i===decpt?out[i].v.indexOf(".")-1:out[i].v.length-1;
  10426. vv = out[i].v.substr(j+1);
  10427. for(; j>=0; --j) {
  10428. if(jj>=0 && (out[i].v.charAt(j) === "0" || out[i].v.charAt(j) === "#")) vv = ostr.charAt(jj--) + vv;
  10429. }
  10430. out[i].v = vv;
  10431. out[i].t = 't';
  10432. lasti = i;
  10433. }
  10434. if(jj>=0 && lasti<out.length) out[lasti].v = ostr.substr(0,jj+1) + out[lasti].v;
  10435. jj = ostr.indexOf(".")+1;
  10436. for(i=decpt; i<out.length; ++i) {
  10437. if(out[i] == null || ('n?('.indexOf(out[i].t) === -1 && i !== decpt)) continue;
  10438. j=out[i].v.indexOf(".")>-1&&i===decpt?out[i].v.indexOf(".")+1:0;
  10439. vv = out[i].v.substr(0,j);
  10440. for(; j<out[i].v.length; ++j) {
  10441. if(jj<ostr.length) vv += ostr.charAt(jj++);
  10442. }
  10443. out[i].v = vv;
  10444. out[i].t = 't';
  10445. lasti = i;
  10446. }
  10447. }
  10448. }
  10449. for(i=0; i<out.length; ++i) if(out[i] != null && 'n?'.indexOf(out[i].t)>-1) {
  10450. myv = (flen >1 && v < 0 && i>0 && out[i-1].v === "-" ? -v:v);
  10451. out[i].v = write_num(out[i].t, out[i].v, myv);
  10452. out[i].t = 't';
  10453. }
  10454. var retval = "";
  10455. for(i=0; i !== out.length; ++i) if(out[i] != null) retval += out[i].v;
  10456. return retval;
  10457. }
  10458. SSF._eval = eval_fmt;
  10459. var cfregex = /\[[=<>]/;
  10460. var cfregex2 = /\[(=|>[=]?|<[>=]?)(-?\d+(?:\.\d*)?)\]/;
  10461. function chkcond(v, rr) {
  10462. if(rr == null) return false;
  10463. var thresh = parseFloat(rr[2]);
  10464. switch(rr[1]) {
  10465. case "=": if(v == thresh) return true; break;
  10466. case ">": if(v > thresh) return true; break;
  10467. case "<": if(v < thresh) return true; break;
  10468. case "<>": if(v != thresh) return true; break;
  10469. case ">=": if(v >= thresh) return true; break;
  10470. case "<=": if(v <= thresh) return true; break;
  10471. }
  10472. return false;
  10473. }
  10474. function choose_fmt(f, v) {
  10475. var fmt = split_fmt(f);
  10476. var l = fmt.length, lat = fmt[l-1].indexOf("@");
  10477. if(l<4 && lat>-1) --l;
  10478. if(fmt.length > 4) throw new Error("cannot find right format for |" + fmt.join("|") + "|");
  10479. if(typeof v !== "number") return [4, fmt.length === 4 || lat>-1?fmt[fmt.length-1]:"@"];
  10480. switch(fmt.length) {
  10481. case 1: fmt = lat>-1 ? ["General", "General", "General", fmt[0]] : [fmt[0], fmt[0], fmt[0], "@"]; break;
  10482. case 2: fmt = lat>-1 ? [fmt[0], fmt[0], fmt[0], fmt[1]] : [fmt[0], fmt[1], fmt[0], "@"]; break;
  10483. case 3: fmt = lat>-1 ? [fmt[0], fmt[1], fmt[0], fmt[2]] : [fmt[0], fmt[1], fmt[2], "@"]; break;
  10484. case 4: break;
  10485. }
  10486. var ff = v > 0 ? fmt[0] : v < 0 ? fmt[1] : fmt[2];
  10487. if(fmt[0].indexOf("[") === -1 && fmt[1].indexOf("[") === -1) return [l, ff];
  10488. if(fmt[0].match(cfregex) != null || fmt[1].match(cfregex) != null) {
  10489. var m1 = fmt[0].match(cfregex2);
  10490. var m2 = fmt[1].match(cfregex2);
  10491. return chkcond(v, m1) ? [l, fmt[0]] : chkcond(v, m2) ? [l, fmt[1]] : [l, fmt[m1 != null && m2 != null ? 2 : 1]];
  10492. }
  10493. return [l, ff];
  10494. }
  10495. function format(fmt,v,o) {
  10496. if(o == null) o = {};
  10497. var sfmt = "";
  10498. switch(typeof fmt) {
  10499. case "string":
  10500. if(fmt == "m/d/yy" && o.dateNF) sfmt = o.dateNF;
  10501. else sfmt = fmt;
  10502. break;
  10503. case "number":
  10504. if(fmt == 14 && o.dateNF) sfmt = o.dateNF;
  10505. else sfmt = (o.table != null ? (o.table) : table_fmt)[fmt];
  10506. if(sfmt == null) sfmt = (o.table && o.table[default_map[fmt]]) || table_fmt[default_map[fmt]];
  10507. if(sfmt == null) sfmt = default_str[fmt] || "General";
  10508. break;
  10509. }
  10510. if(isgeneral(sfmt,0)) return general_fmt(v, o);
  10511. if(v instanceof Date) v = datenum_local(v, o.date1904);
  10512. var f = choose_fmt(sfmt, v);
  10513. if(isgeneral(f[1])) return general_fmt(v, o);
  10514. if(v === true) v = "TRUE"; else if(v === false) v = "FALSE";
  10515. else if(v === "" || v == null) return "";
  10516. return eval_fmt(f[1], v, o, f[0]);
  10517. }
  10518. function load_entry(fmt, idx) {
  10519. if(typeof idx != 'number') {
  10520. idx = +idx || -1;
  10521. for(var i = 0; i < 0x0188; ++i) {
  10522. if(table_fmt[i] == undefined) { if(idx < 0) idx = i; continue; }
  10523. if(table_fmt[i] == fmt) { idx = i; break; }
  10524. }
  10525. if(idx < 0) idx = 0x187;
  10526. }
  10527. table_fmt[idx] = fmt;
  10528. return idx;
  10529. }
  10530. SSF.load = load_entry;
  10531. SSF._table = table_fmt;
  10532. SSF.get_table = function get_table() { return table_fmt; };
  10533. SSF.load_table = function load_table(tbl) {
  10534. for(var i=0; i!=0x0188; ++i)
  10535. if(tbl[i] !== undefined) load_entry(tbl[i], i);
  10536. };
  10537. SSF.init_table = init_table;
  10538. SSF.format = format;
  10539. };
  10540. make_ssf(SSF);
  10541. /* map from xlml named formats to SSF TODO: localize */
  10542. var XLMLFormatMap/*{[string]:string}*/ = ({
  10543. "General Number": "General",
  10544. "General Date": SSF._table[22],
  10545. "Long Date": "dddd, mmmm dd, yyyy",
  10546. "Medium Date": SSF._table[15],
  10547. "Short Date": SSF._table[14],
  10548. "Long Time": SSF._table[19],
  10549. "Medium Time": SSF._table[18],
  10550. "Short Time": SSF._table[20],
  10551. "Currency": '"$"#,##0.00_);[Red]\\("$"#,##0.00\\)',
  10552. "Fixed": SSF._table[2],
  10553. "Standard": SSF._table[4],
  10554. "Percent": SSF._table[10],
  10555. "Scientific": SSF._table[11],
  10556. "Yes/No": '"Yes";"Yes";"No";@',
  10557. "True/False": '"True";"True";"False";@',
  10558. "On/Off": '"Yes";"Yes";"No";@'
  10559. });
  10560. var SSFImplicit/*{[number]:string}*/ = ({
  10561. "5": '"$"#,##0_);\\("$"#,##0\\)',
  10562. "6": '"$"#,##0_);[Red]\\("$"#,##0\\)',
  10563. "7": '"$"#,##0.00_);\\("$"#,##0.00\\)',
  10564. "8": '"$"#,##0.00_);[Red]\\("$"#,##0.00\\)',
  10565. "23": 'General', "24": 'General', "25": 'General', "26": 'General',
  10566. "27": 'm/d/yy', "28": 'm/d/yy', "29": 'm/d/yy', "30": 'm/d/yy', "31": 'm/d/yy',
  10567. "32": 'h:mm:ss', "33": 'h:mm:ss', "34": 'h:mm:ss', "35": 'h:mm:ss',
  10568. "36": 'm/d/yy',
  10569. "41": '_(* #,##0_);_(* \(#,##0\);_(* "-"_);_(@_)',
  10570. "42": '_("$"* #,##0_);_("$"* \(#,##0\);_("$"* "-"_);_(@_)',
  10571. "43": '_(* #,##0.00_);_(* \(#,##0.00\);_(* "-"??_);_(@_)',
  10572. "44": '_("$"* #,##0.00_);_("$"* \(#,##0.00\);_("$"* "-"??_);_(@_)',
  10573. "50": 'm/d/yy', "51": 'm/d/yy', "52": 'm/d/yy', "53": 'm/d/yy', "54": 'm/d/yy',
  10574. "55": 'm/d/yy', "56": 'm/d/yy', "57": 'm/d/yy', "58": 'm/d/yy',
  10575. "59": '0',
  10576. "60": '0.00',
  10577. "61": '#,##0',
  10578. "62": '#,##0.00',
  10579. "63": '"$"#,##0_);\\("$"#,##0\\)',
  10580. "64": '"$"#,##0_);[Red]\\("$"#,##0\\)',
  10581. "65": '"$"#,##0.00_);\\("$"#,##0.00\\)',
  10582. "66": '"$"#,##0.00_);[Red]\\("$"#,##0.00\\)',
  10583. "67": '0%',
  10584. "68": '0.00%',
  10585. "69": '# ?/?',
  10586. "70": '# ??/??',
  10587. "71": 'm/d/yy',
  10588. "72": 'm/d/yy',
  10589. "73": 'd-mmm-yy',
  10590. "74": 'd-mmm',
  10591. "75": 'mmm-yy',
  10592. "76": 'h:mm',
  10593. "77": 'h:mm:ss',
  10594. "78": 'm/d/yy h:mm',
  10595. "79": 'mm:ss',
  10596. "80": '[h]:mm:ss',
  10597. "81": 'mmss.0'
  10598. });
  10599. /* dateNF parse TODO: move to SSF */
  10600. var dateNFregex = /[dD]+|[mM]+|[yYeE]+|[Hh]+|[Ss]+/g;
  10601. function dateNF_regex(dateNF) {
  10602. var fmt = typeof dateNF == "number" ? SSF._table[dateNF] : dateNF;
  10603. fmt = fmt.replace(dateNFregex, "(\\d+)");
  10604. return new RegExp("^" + fmt + "$");
  10605. }
  10606. function dateNF_fix(str, dateNF, match) {
  10607. var Y = -1, m = -1, d = -1, H = -1, M = -1, S = -1;
  10608. (dateNF.match(dateNFregex)||[]).forEach(function(n, i) {
  10609. var v = parseInt(match[i+1], 10);
  10610. switch(n.toLowerCase().charAt(0)) {
  10611. case 'y': Y = v; break; case 'd': d = v; break;
  10612. case 'h': H = v; break; case 's': S = v; break;
  10613. case 'm': if(H >= 0) M = v; else m = v; break;
  10614. }
  10615. });
  10616. if(S >= 0 && M == -1 && m >= 0) { M = m; m = -1; }
  10617. var datestr = (("" + (Y>=0?Y: new Date().getFullYear())).slice(-4) + "-" + ("00" + (m>=1?m:1)).slice(-2) + "-" + ("00" + (d>=1?d:1)).slice(-2));
  10618. if(datestr.length == 7) datestr = "0" + datestr;
  10619. if(datestr.length == 8) datestr = "20" + datestr;
  10620. var timestr = (("00" + (H>=0?H:0)).slice(-2) + ":" + ("00" + (M>=0?M:0)).slice(-2) + ":" + ("00" + (S>=0?S:0)).slice(-2));
  10621. if(H == -1 && M == -1 && S == -1) return datestr;
  10622. if(Y == -1 && m == -1 && d == -1) return timestr;
  10623. return datestr + "T" + timestr;
  10624. }
  10625. var DO_NOT_EXPORT_CFB = true;
  10626. /* cfb.js (C) 2013-present SheetJS -- http://sheetjs.com */
  10627. /* vim: set ts=2: */
  10628. /*jshint eqnull:true */
  10629. /*exported CFB */
  10630. /*global Uint8Array:false, Uint16Array:false */
  10631. /* crc32.js (C) 2014-present SheetJS -- http://sheetjs.com */
  10632. /* vim: set ts=2: */
  10633. /*exported CRC32 */
  10634. var CRC32;
  10635. (function (factory) {
  10636. /*jshint ignore:start */
  10637. /*eslint-disable */
  10638. factory(CRC32 = {});
  10639. /*eslint-enable */
  10640. /*jshint ignore:end */
  10641. }(function(CRC32) {
  10642. CRC32.version = '1.2.0';
  10643. /* see perf/crc32table.js */
  10644. /*global Int32Array */
  10645. function signed_crc_table() {
  10646. var c = 0, table = new Array(256);
  10647. for(var n =0; n != 256; ++n){
  10648. c = n;
  10649. c = ((c&1) ? (-306674912 ^ (c >>> 1)) : (c >>> 1));
  10650. c = ((c&1) ? (-306674912 ^ (c >>> 1)) : (c >>> 1));
  10651. c = ((c&1) ? (-306674912 ^ (c >>> 1)) : (c >>> 1));
  10652. c = ((c&1) ? (-306674912 ^ (c >>> 1)) : (c >>> 1));
  10653. c = ((c&1) ? (-306674912 ^ (c >>> 1)) : (c >>> 1));
  10654. c = ((c&1) ? (-306674912 ^ (c >>> 1)) : (c >>> 1));
  10655. c = ((c&1) ? (-306674912 ^ (c >>> 1)) : (c >>> 1));
  10656. c = ((c&1) ? (-306674912 ^ (c >>> 1)) : (c >>> 1));
  10657. table[n] = c;
  10658. }
  10659. return typeof Int32Array !== 'undefined' ? new Int32Array(table) : table;
  10660. }
  10661. var T = signed_crc_table();
  10662. function crc32_bstr(bstr, seed) {
  10663. var C = seed ^ -1, L = bstr.length - 1;
  10664. for(var i = 0; i < L;) {
  10665. C = (C>>>8) ^ T[(C^bstr.charCodeAt(i++))&0xFF];
  10666. C = (C>>>8) ^ T[(C^bstr.charCodeAt(i++))&0xFF];
  10667. }
  10668. if(i === L) C = (C>>>8) ^ T[(C ^ bstr.charCodeAt(i))&0xFF];
  10669. return C ^ -1;
  10670. }
  10671. function crc32_buf(buf, seed) {
  10672. if(buf.length > 10000) return crc32_buf_8(buf, seed);
  10673. var C = seed ^ -1, L = buf.length - 3;
  10674. for(var i = 0; i < L;) {
  10675. C = (C>>>8) ^ T[(C^buf[i++])&0xFF];
  10676. C = (C>>>8) ^ T[(C^buf[i++])&0xFF];
  10677. C = (C>>>8) ^ T[(C^buf[i++])&0xFF];
  10678. C = (C>>>8) ^ T[(C^buf[i++])&0xFF];
  10679. }
  10680. while(i < L+3) C = (C>>>8) ^ T[(C^buf[i++])&0xFF];
  10681. return C ^ -1;
  10682. }
  10683. function crc32_buf_8(buf, seed) {
  10684. var C = seed ^ -1, L = buf.length - 7;
  10685. for(var i = 0; i < L;) {
  10686. C = (C>>>8) ^ T[(C^buf[i++])&0xFF];
  10687. C = (C>>>8) ^ T[(C^buf[i++])&0xFF];
  10688. C = (C>>>8) ^ T[(C^buf[i++])&0xFF];
  10689. C = (C>>>8) ^ T[(C^buf[i++])&0xFF];
  10690. C = (C>>>8) ^ T[(C^buf[i++])&0xFF];
  10691. C = (C>>>8) ^ T[(C^buf[i++])&0xFF];
  10692. C = (C>>>8) ^ T[(C^buf[i++])&0xFF];
  10693. C = (C>>>8) ^ T[(C^buf[i++])&0xFF];
  10694. }
  10695. while(i < L+7) C = (C>>>8) ^ T[(C^buf[i++])&0xFF];
  10696. return C ^ -1;
  10697. }
  10698. function crc32_str(str, seed) {
  10699. var C = seed ^ -1;
  10700. for(var i = 0, L=str.length, c, d; i < L;) {
  10701. c = str.charCodeAt(i++);
  10702. if(c < 0x80) {
  10703. C = (C>>>8) ^ T[(C ^ c)&0xFF];
  10704. } else if(c < 0x800) {
  10705. C = (C>>>8) ^ T[(C ^ (192|((c>>6)&31)))&0xFF];
  10706. C = (C>>>8) ^ T[(C ^ (128|(c&63)))&0xFF];
  10707. } else if(c >= 0xD800 && c < 0xE000) {
  10708. c = (c&1023)+64; d = str.charCodeAt(i++)&1023;
  10709. C = (C>>>8) ^ T[(C ^ (240|((c>>8)&7)))&0xFF];
  10710. C = (C>>>8) ^ T[(C ^ (128|((c>>2)&63)))&0xFF];
  10711. C = (C>>>8) ^ T[(C ^ (128|((d>>6)&15)|((c&3)<<4)))&0xFF];
  10712. C = (C>>>8) ^ T[(C ^ (128|(d&63)))&0xFF];
  10713. } else {
  10714. C = (C>>>8) ^ T[(C ^ (224|((c>>12)&15)))&0xFF];
  10715. C = (C>>>8) ^ T[(C ^ (128|((c>>6)&63)))&0xFF];
  10716. C = (C>>>8) ^ T[(C ^ (128|(c&63)))&0xFF];
  10717. }
  10718. }
  10719. return C ^ -1;
  10720. }
  10721. CRC32.table = T;
  10722. CRC32.bstr = crc32_bstr;
  10723. CRC32.buf = crc32_buf;
  10724. CRC32.str = crc32_str;
  10725. }));
  10726. /* [MS-CFB] v20171201 */
  10727. var CFB = (function _CFB(){
  10728. var exports = {};
  10729. exports.version = '1.1.4';
  10730. /* [MS-CFB] 2.6.4 */
  10731. function namecmp(l, r) {
  10732. var L = l.split("/"), R = r.split("/");
  10733. for(var i = 0, c = 0, Z = Math.min(L.length, R.length); i < Z; ++i) {
  10734. if((c = L[i].length - R[i].length)) return c;
  10735. if(L[i] != R[i]) return L[i] < R[i] ? -1 : 1;
  10736. }
  10737. return L.length - R.length;
  10738. }
  10739. function dirname(p) {
  10740. if(p.charAt(p.length - 1) == "/") return (p.slice(0,-1).indexOf("/") === -1) ? p : dirname(p.slice(0, -1));
  10741. var c = p.lastIndexOf("/");
  10742. return (c === -1) ? p : p.slice(0, c+1);
  10743. }
  10744. function filename(p) {
  10745. if(p.charAt(p.length - 1) == "/") return filename(p.slice(0, -1));
  10746. var c = p.lastIndexOf("/");
  10747. return (c === -1) ? p : p.slice(c+1);
  10748. }
  10749. /* -------------------------------------------------------------------------- */
  10750. /* DOS Date format:
  10751. high|YYYYYYYm.mmmddddd.HHHHHMMM.MMMSSSSS|low
  10752. add 1980 to stored year
  10753. stored second should be doubled
  10754. */
  10755. /* write JS date to buf as a DOS date */
  10756. function write_dos_date(buf, date) {
  10757. if(typeof date === "string") date = new Date(date);
  10758. var hms = date.getHours();
  10759. hms = hms << 6 | date.getMinutes();
  10760. hms = hms << 5 | (date.getSeconds()>>>1);
  10761. buf.write_shift(2, hms);
  10762. var ymd = (date.getFullYear() - 1980);
  10763. ymd = ymd << 4 | (date.getMonth()+1);
  10764. ymd = ymd << 5 | date.getDate();
  10765. buf.write_shift(2, ymd);
  10766. }
  10767. /* read four bytes from buf and interpret as a DOS date */
  10768. function parse_dos_date(buf) {
  10769. var hms = buf.read_shift(2) & 0xFFFF;
  10770. var ymd = buf.read_shift(2) & 0xFFFF;
  10771. var val = new Date();
  10772. var d = ymd & 0x1F; ymd >>>= 5;
  10773. var m = ymd & 0x0F; ymd >>>= 4;
  10774. val.setMilliseconds(0);
  10775. val.setFullYear(ymd + 1980);
  10776. val.setMonth(m-1);
  10777. val.setDate(d);
  10778. var S = hms & 0x1F; hms >>>= 5;
  10779. var M = hms & 0x3F; hms >>>= 6;
  10780. val.setHours(hms);
  10781. val.setMinutes(M);
  10782. val.setSeconds(S<<1);
  10783. return val;
  10784. }
  10785. function parse_extra_field(blob) {
  10786. prep_blob(blob, 0);
  10787. var o = {};
  10788. var flags = 0;
  10789. while(blob.l <= blob.length - 4) {
  10790. var type = blob.read_shift(2);
  10791. var sz = blob.read_shift(2), tgt = blob.l + sz;
  10792. var p = {};
  10793. switch(type) {
  10794. /* UNIX-style Timestamps */
  10795. case 0x5455: {
  10796. flags = blob.read_shift(1);
  10797. if(flags & 1) p.mtime = blob.read_shift(4);
  10798. /* for some reason, CD flag corresponds to LFH */
  10799. if(sz > 5) {
  10800. if(flags & 2) p.atime = blob.read_shift(4);
  10801. if(flags & 4) p.ctime = blob.read_shift(4);
  10802. }
  10803. if(p.mtime) p.mt = new Date(p.mtime*1000);
  10804. }
  10805. break;
  10806. }
  10807. blob.l = tgt;
  10808. o[type] = p;
  10809. }
  10810. return o;
  10811. }
  10812. var fs;
  10813. function get_fs() { return fs || (fs = __webpack_require__(/*! fs */ "?58fb")); }
  10814. function parse(file, options) {
  10815. if(file[0] == 0x50 && file[1] == 0x4b) return parse_zip(file, options);
  10816. if(file.length < 512) throw new Error("CFB file size " + file.length + " < 512");
  10817. var mver = 3;
  10818. var ssz = 512;
  10819. var nmfs = 0; // number of mini FAT sectors
  10820. var difat_sec_cnt = 0;
  10821. var dir_start = 0;
  10822. var minifat_start = 0;
  10823. var difat_start = 0;
  10824. var fat_addrs = []; // locations of FAT sectors
  10825. /* [MS-CFB] 2.2 Compound File Header */
  10826. var blob = file.slice(0,512);
  10827. prep_blob(blob, 0);
  10828. /* major version */
  10829. var mv = check_get_mver(blob);
  10830. mver = mv[0];
  10831. switch(mver) {
  10832. case 3: ssz = 512; break; case 4: ssz = 4096; break;
  10833. case 0: if(mv[1] == 0) return parse_zip(file, options);
  10834. /* falls through */
  10835. default: throw new Error("Major Version: Expected 3 or 4 saw " + mver);
  10836. }
  10837. /* reprocess header */
  10838. if(ssz !== 512) { blob = file.slice(0,ssz); prep_blob(blob, 28 /* blob.l */); }
  10839. /* Save header for final object */
  10840. var header = file.slice(0,ssz);
  10841. check_shifts(blob, mver);
  10842. // Number of Directory Sectors
  10843. var dir_cnt = blob.read_shift(4, 'i');
  10844. if(mver === 3 && dir_cnt !== 0) throw new Error('# Directory Sectors: Expected 0 saw ' + dir_cnt);
  10845. // Number of FAT Sectors
  10846. blob.l += 4;
  10847. // First Directory Sector Location
  10848. dir_start = blob.read_shift(4, 'i');
  10849. // Transaction Signature
  10850. blob.l += 4;
  10851. // Mini Stream Cutoff Size
  10852. blob.chk('00100000', 'Mini Stream Cutoff Size: ');
  10853. // First Mini FAT Sector Location
  10854. minifat_start = blob.read_shift(4, 'i');
  10855. // Number of Mini FAT Sectors
  10856. nmfs = blob.read_shift(4, 'i');
  10857. // First DIFAT sector location
  10858. difat_start = blob.read_shift(4, 'i');
  10859. // Number of DIFAT Sectors
  10860. difat_sec_cnt = blob.read_shift(4, 'i');
  10861. // Grab FAT Sector Locations
  10862. for(var q = -1, j = 0; j < 109; ++j) { /* 109 = (512 - blob.l)>>>2; */
  10863. q = blob.read_shift(4, 'i');
  10864. if(q<0) break;
  10865. fat_addrs[j] = q;
  10866. }
  10867. /** Break the file up into sectors */
  10868. var sectors = sectorify(file, ssz);
  10869. sleuth_fat(difat_start, difat_sec_cnt, sectors, ssz, fat_addrs);
  10870. /** Chains */
  10871. var sector_list = make_sector_list(sectors, dir_start, fat_addrs, ssz);
  10872. sector_list[dir_start].name = "!Directory";
  10873. if(nmfs > 0 && minifat_start !== ENDOFCHAIN) sector_list[minifat_start].name = "!MiniFAT";
  10874. sector_list[fat_addrs[0]].name = "!FAT";
  10875. sector_list.fat_addrs = fat_addrs;
  10876. sector_list.ssz = ssz;
  10877. /* [MS-CFB] 2.6.1 Compound File Directory Entry */
  10878. var files = {}, Paths = [], FileIndex = [], FullPaths = [];
  10879. read_directory(dir_start, sector_list, sectors, Paths, nmfs, files, FileIndex, minifat_start);
  10880. build_full_paths(FileIndex, FullPaths, Paths);
  10881. Paths.shift();
  10882. var o = {
  10883. FileIndex: FileIndex,
  10884. FullPaths: FullPaths
  10885. };
  10886. // $FlowIgnore
  10887. if(options && options.raw) o.raw = {header: header, sectors: sectors};
  10888. return o;
  10889. } // parse
  10890. /* [MS-CFB] 2.2 Compound File Header -- read up to major version */
  10891. function check_get_mver(blob) {
  10892. if(blob[blob.l] == 0x50 && blob[blob.l + 1] == 0x4b) return [0, 0];
  10893. // header signature 8
  10894. blob.chk(HEADER_SIGNATURE, 'Header Signature: ');
  10895. // clsid 16
  10896. //blob.chk(HEADER_CLSID, 'CLSID: ');
  10897. blob.l += 16;
  10898. // minor version 2
  10899. var mver = blob.read_shift(2, 'u');
  10900. return [blob.read_shift(2,'u'), mver];
  10901. }
  10902. function check_shifts(blob, mver) {
  10903. var shift = 0x09;
  10904. // Byte Order
  10905. //blob.chk('feff', 'Byte Order: '); // note: some writers put 0xffff
  10906. blob.l += 2;
  10907. // Sector Shift
  10908. switch((shift = blob.read_shift(2))) {
  10909. case 0x09: if(mver != 3) throw new Error('Sector Shift: Expected 9 saw ' + shift); break;
  10910. case 0x0c: if(mver != 4) throw new Error('Sector Shift: Expected 12 saw ' + shift); break;
  10911. default: throw new Error('Sector Shift: Expected 9 or 12 saw ' + shift);
  10912. }
  10913. // Mini Sector Shift
  10914. blob.chk('0600', 'Mini Sector Shift: ');
  10915. // Reserved
  10916. blob.chk('000000000000', 'Reserved: ');
  10917. }
  10918. /** Break the file up into sectors */
  10919. function sectorify(file, ssz) {
  10920. var nsectors = Math.ceil(file.length/ssz)-1;
  10921. var sectors = [];
  10922. for(var i=1; i < nsectors; ++i) sectors[i-1] = file.slice(i*ssz,(i+1)*ssz);
  10923. sectors[nsectors-1] = file.slice(nsectors*ssz);
  10924. return sectors;
  10925. }
  10926. /* [MS-CFB] 2.6.4 Red-Black Tree */
  10927. function build_full_paths(FI, FP, Paths) {
  10928. var i = 0, L = 0, R = 0, C = 0, j = 0, pl = Paths.length;
  10929. var dad = [], q = [];
  10930. for(; i < pl; ++i) { dad[i]=q[i]=i; FP[i]=Paths[i]; }
  10931. for(; j < q.length; ++j) {
  10932. i = q[j];
  10933. L = FI[i].L; R = FI[i].R; C = FI[i].C;
  10934. if(dad[i] === i) {
  10935. if(L !== -1 /*NOSTREAM*/ && dad[L] !== L) dad[i] = dad[L];
  10936. if(R !== -1 && dad[R] !== R) dad[i] = dad[R];
  10937. }
  10938. if(C !== -1 /*NOSTREAM*/) dad[C] = i;
  10939. if(L !== -1 && i != dad[i]) { dad[L] = dad[i]; if(q.lastIndexOf(L) < j) q.push(L); }
  10940. if(R !== -1 && i != dad[i]) { dad[R] = dad[i]; if(q.lastIndexOf(R) < j) q.push(R); }
  10941. }
  10942. for(i=1; i < pl; ++i) if(dad[i] === i) {
  10943. if(R !== -1 /*NOSTREAM*/ && dad[R] !== R) dad[i] = dad[R];
  10944. else if(L !== -1 && dad[L] !== L) dad[i] = dad[L];
  10945. }
  10946. for(i=1; i < pl; ++i) {
  10947. if(FI[i].type === 0 /* unknown */) continue;
  10948. j = i;
  10949. if(j != dad[j]) do {
  10950. j = dad[j];
  10951. FP[i] = FP[j] + "/" + FP[i];
  10952. } while (j !== 0 && -1 !== dad[j] && j != dad[j]);
  10953. dad[i] = -1;
  10954. }
  10955. FP[0] += "/";
  10956. for(i=1; i < pl; ++i) {
  10957. if(FI[i].type !== 2 /* stream */) FP[i] += "/";
  10958. }
  10959. }
  10960. function get_mfat_entry(entry, payload, mini) {
  10961. var start = entry.start, size = entry.size;
  10962. //return (payload.slice(start*MSSZ, start*MSSZ + size));
  10963. var o = [];
  10964. var idx = start;
  10965. while(mini && size > 0 && idx >= 0) {
  10966. o.push(payload.slice(idx * MSSZ, idx * MSSZ + MSSZ));
  10967. size -= MSSZ;
  10968. idx = __readInt32LE(mini, idx * 4);
  10969. }
  10970. if(o.length === 0) return (new_buf(0));
  10971. return (bconcat(o).slice(0, entry.size));
  10972. }
  10973. /** Chase down the rest of the DIFAT chain to build a comprehensive list
  10974. DIFAT chains by storing the next sector number as the last 32 bits */
  10975. function sleuth_fat(idx, cnt, sectors, ssz, fat_addrs) {
  10976. var q = ENDOFCHAIN;
  10977. if(idx === ENDOFCHAIN) {
  10978. if(cnt !== 0) throw new Error("DIFAT chain shorter than expected");
  10979. } else if(idx !== -1 /*FREESECT*/) {
  10980. var sector = sectors[idx], m = (ssz>>>2)-1;
  10981. if(!sector) return;
  10982. for(var i = 0; i < m; ++i) {
  10983. if((q = __readInt32LE(sector,i*4)) === ENDOFCHAIN) break;
  10984. fat_addrs.push(q);
  10985. }
  10986. sleuth_fat(__readInt32LE(sector,ssz-4),cnt - 1, sectors, ssz, fat_addrs);
  10987. }
  10988. }
  10989. /** Follow the linked list of sectors for a given starting point */
  10990. function get_sector_list(sectors, start, fat_addrs, ssz, chkd) {
  10991. var buf = [], buf_chain = [];
  10992. if(!chkd) chkd = [];
  10993. var modulus = ssz - 1, j = 0, jj = 0;
  10994. for(j=start; j>=0;) {
  10995. chkd[j] = true;
  10996. buf[buf.length] = j;
  10997. buf_chain.push(sectors[j]);
  10998. var addr = fat_addrs[Math.floor(j*4/ssz)];
  10999. jj = ((j*4) & modulus);
  11000. if(ssz < 4 + jj) throw new Error("FAT boundary crossed: " + j + " 4 "+ssz);
  11001. if(!sectors[addr]) break;
  11002. j = __readInt32LE(sectors[addr], jj);
  11003. }
  11004. return {nodes: buf, data:__toBuffer([buf_chain])};
  11005. }
  11006. /** Chase down the sector linked lists */
  11007. function make_sector_list(sectors, dir_start, fat_addrs, ssz) {
  11008. var sl = sectors.length, sector_list = ([]);
  11009. var chkd = [], buf = [], buf_chain = [];
  11010. var modulus = ssz - 1, i=0, j=0, k=0, jj=0;
  11011. for(i=0; i < sl; ++i) {
  11012. buf = ([]);
  11013. k = (i + dir_start); if(k >= sl) k-=sl;
  11014. if(chkd[k]) continue;
  11015. buf_chain = [];
  11016. var seen = [];
  11017. for(j=k; j>=0;) {
  11018. seen[j] = true;
  11019. chkd[j] = true;
  11020. buf[buf.length] = j;
  11021. buf_chain.push(sectors[j]);
  11022. var addr = fat_addrs[Math.floor(j*4/ssz)];
  11023. jj = ((j*4) & modulus);
  11024. if(ssz < 4 + jj) throw new Error("FAT boundary crossed: " + j + " 4 "+ssz);
  11025. if(!sectors[addr]) break;
  11026. j = __readInt32LE(sectors[addr], jj);
  11027. if(seen[j]) break;
  11028. }
  11029. sector_list[k] = ({nodes: buf, data:__toBuffer([buf_chain])});
  11030. }
  11031. return sector_list;
  11032. }
  11033. /* [MS-CFB] 2.6.1 Compound File Directory Entry */
  11034. function read_directory(dir_start, sector_list, sectors, Paths, nmfs, files, FileIndex, mini) {
  11035. var minifat_store = 0, pl = (Paths.length?2:0);
  11036. var sector = sector_list[dir_start].data;
  11037. var i = 0, namelen = 0, name;
  11038. for(; i < sector.length; i+= 128) {
  11039. var blob = sector.slice(i, i+128);
  11040. prep_blob(blob, 64);
  11041. namelen = blob.read_shift(2);
  11042. name = __utf16le(blob,0,namelen-pl);
  11043. Paths.push(name);
  11044. var o = ({
  11045. name: name,
  11046. type: blob.read_shift(1),
  11047. color: blob.read_shift(1),
  11048. L: blob.read_shift(4, 'i'),
  11049. R: blob.read_shift(4, 'i'),
  11050. C: blob.read_shift(4, 'i'),
  11051. clsid: blob.read_shift(16),
  11052. state: blob.read_shift(4, 'i'),
  11053. start: 0,
  11054. size: 0
  11055. });
  11056. var ctime = blob.read_shift(2) + blob.read_shift(2) + blob.read_shift(2) + blob.read_shift(2);
  11057. if(ctime !== 0) o.ct = read_date(blob, blob.l-8);
  11058. var mtime = blob.read_shift(2) + blob.read_shift(2) + blob.read_shift(2) + blob.read_shift(2);
  11059. if(mtime !== 0) o.mt = read_date(blob, blob.l-8);
  11060. o.start = blob.read_shift(4, 'i');
  11061. o.size = blob.read_shift(4, 'i');
  11062. if(o.size < 0 && o.start < 0) { o.size = o.type = 0; o.start = ENDOFCHAIN; o.name = ""; }
  11063. if(o.type === 5) { /* root */
  11064. minifat_store = o.start;
  11065. if(nmfs > 0 && minifat_store !== ENDOFCHAIN) sector_list[minifat_store].name = "!StreamData";
  11066. /*minifat_size = o.size;*/
  11067. } else if(o.size >= 4096 /* MSCSZ */) {
  11068. o.storage = 'fat';
  11069. if(sector_list[o.start] === undefined) sector_list[o.start] = get_sector_list(sectors, o.start, sector_list.fat_addrs, sector_list.ssz);
  11070. sector_list[o.start].name = o.name;
  11071. o.content = (sector_list[o.start].data.slice(0,o.size));
  11072. } else {
  11073. o.storage = 'minifat';
  11074. if(o.size < 0) o.size = 0;
  11075. else if(minifat_store !== ENDOFCHAIN && o.start !== ENDOFCHAIN && sector_list[minifat_store]) {
  11076. o.content = get_mfat_entry(o, sector_list[minifat_store].data, (sector_list[mini]||{}).data);
  11077. }
  11078. }
  11079. if(o.content) prep_blob(o.content, 0);
  11080. files[name] = o;
  11081. FileIndex.push(o);
  11082. }
  11083. }
  11084. function read_date(blob, offset) {
  11085. return new Date(( ( (__readUInt32LE(blob,offset+4)/1e7)*Math.pow(2,32)+__readUInt32LE(blob,offset)/1e7 ) - 11644473600)*1000);
  11086. }
  11087. function read_file(filename, options) {
  11088. get_fs();
  11089. return parse(fs.readFileSync(filename), options);
  11090. }
  11091. function read(blob, options) {
  11092. switch(options && options.type || "base64") {
  11093. case "file": return read_file(blob, options);
  11094. case "base64": return parse(s2a(Base64.decode(blob)), options);
  11095. case "binary": return parse(s2a(blob), options);
  11096. }
  11097. return parse(blob, options);
  11098. }
  11099. function init_cfb(cfb, opts) {
  11100. var o = opts || {}, root = o.root || "Root Entry";
  11101. if(!cfb.FullPaths) cfb.FullPaths = [];
  11102. if(!cfb.FileIndex) cfb.FileIndex = [];
  11103. if(cfb.FullPaths.length !== cfb.FileIndex.length) throw new Error("inconsistent CFB structure");
  11104. if(cfb.FullPaths.length === 0) {
  11105. cfb.FullPaths[0] = root + "/";
  11106. cfb.FileIndex[0] = ({ name: root, type: 5 });
  11107. }
  11108. if(o.CLSID) cfb.FileIndex[0].clsid = o.CLSID;
  11109. seed_cfb(cfb);
  11110. }
  11111. function seed_cfb(cfb) {
  11112. var nm = "\u0001Sh33tJ5";
  11113. if(CFB.find(cfb, "/" + nm)) return;
  11114. var p = new_buf(4); p[0] = 55; p[1] = p[3] = 50; p[2] = 54;
  11115. cfb.FileIndex.push(({ name: nm, type: 2, content:p, size:4, L:69, R:69, C:69 }));
  11116. cfb.FullPaths.push(cfb.FullPaths[0] + nm);
  11117. rebuild_cfb(cfb);
  11118. }
  11119. function rebuild_cfb(cfb, f) {
  11120. init_cfb(cfb);
  11121. var gc = false, s = false;
  11122. for(var i = cfb.FullPaths.length - 1; i >= 0; --i) {
  11123. var _file = cfb.FileIndex[i];
  11124. switch(_file.type) {
  11125. case 0:
  11126. if(s) gc = true;
  11127. else { cfb.FileIndex.pop(); cfb.FullPaths.pop(); }
  11128. break;
  11129. case 1: case 2: case 5:
  11130. s = true;
  11131. if(isNaN(_file.R * _file.L * _file.C)) gc = true;
  11132. if(_file.R > -1 && _file.L > -1 && _file.R == _file.L) gc = true;
  11133. break;
  11134. default: gc = true; break;
  11135. }
  11136. }
  11137. if(!gc && !f) return;
  11138. var now = new Date(1987, 1, 19), j = 0;
  11139. var data = [];
  11140. for(i = 0; i < cfb.FullPaths.length; ++i) {
  11141. if(cfb.FileIndex[i].type === 0) continue;
  11142. data.push([cfb.FullPaths[i], cfb.FileIndex[i]]);
  11143. }
  11144. for(i = 0; i < data.length; ++i) {
  11145. var dad = dirname(data[i][0]);
  11146. s = false;
  11147. for(j = 0; j < data.length; ++j) if(data[j][0] === dad) s = true;
  11148. if(!s) data.push([dad, ({
  11149. name: filename(dad).replace("/",""),
  11150. type: 1,
  11151. clsid: HEADER_CLSID,
  11152. ct: now, mt: now,
  11153. content: null
  11154. })]);
  11155. }
  11156. data.sort(function(x,y) { return namecmp(x[0], y[0]); });
  11157. cfb.FullPaths = []; cfb.FileIndex = [];
  11158. for(i = 0; i < data.length; ++i) { cfb.FullPaths[i] = data[i][0]; cfb.FileIndex[i] = data[i][1]; }
  11159. for(i = 0; i < data.length; ++i) {
  11160. var elt = cfb.FileIndex[i];
  11161. var nm = cfb.FullPaths[i];
  11162. elt.name = filename(nm).replace("/","");
  11163. elt.L = elt.R = elt.C = -(elt.color = 1);
  11164. elt.size = elt.content ? elt.content.length : 0;
  11165. elt.start = 0;
  11166. elt.clsid = (elt.clsid || HEADER_CLSID);
  11167. if(i === 0) {
  11168. elt.C = data.length > 1 ? 1 : -1;
  11169. elt.size = 0;
  11170. elt.type = 5;
  11171. } else if(nm.slice(-1) == "/") {
  11172. for(j=i+1;j < data.length; ++j) if(dirname(cfb.FullPaths[j])==nm) break;
  11173. elt.C = j >= data.length ? -1 : j;
  11174. for(j=i+1;j < data.length; ++j) if(dirname(cfb.FullPaths[j])==dirname(nm)) break;
  11175. elt.R = j >= data.length ? -1 : j;
  11176. elt.type = 1;
  11177. } else {
  11178. if(dirname(cfb.FullPaths[i+1]||"") == dirname(nm)) elt.R = i + 1;
  11179. elt.type = 2;
  11180. }
  11181. }
  11182. }
  11183. function _write(cfb, options) {
  11184. var _opts = options || {};
  11185. rebuild_cfb(cfb);
  11186. if(_opts.fileType == 'zip') return write_zip(cfb, _opts);
  11187. var L = (function(cfb){
  11188. var mini_size = 0, fat_size = 0;
  11189. for(var i = 0; i < cfb.FileIndex.length; ++i) {
  11190. var file = cfb.FileIndex[i];
  11191. if(!file.content) continue;
  11192. var flen = file.content.length;
  11193. if(flen > 0){
  11194. if(flen < 0x1000) mini_size += (flen + 0x3F) >> 6;
  11195. else fat_size += (flen + 0x01FF) >> 9;
  11196. }
  11197. }
  11198. var dir_cnt = (cfb.FullPaths.length +3) >> 2;
  11199. var mini_cnt = (mini_size + 7) >> 3;
  11200. var mfat_cnt = (mini_size + 0x7F) >> 7;
  11201. var fat_base = mini_cnt + fat_size + dir_cnt + mfat_cnt;
  11202. var fat_cnt = (fat_base + 0x7F) >> 7;
  11203. var difat_cnt = fat_cnt <= 109 ? 0 : Math.ceil((fat_cnt-109)/0x7F);
  11204. while(((fat_base + fat_cnt + difat_cnt + 0x7F) >> 7) > fat_cnt) difat_cnt = ++fat_cnt <= 109 ? 0 : Math.ceil((fat_cnt-109)/0x7F);
  11205. var L = [1, difat_cnt, fat_cnt, mfat_cnt, dir_cnt, fat_size, mini_size, 0];
  11206. cfb.FileIndex[0].size = mini_size << 6;
  11207. L[7] = (cfb.FileIndex[0].start=L[0]+L[1]+L[2]+L[3]+L[4]+L[5])+((L[6]+7) >> 3);
  11208. return L;
  11209. })(cfb);
  11210. var o = new_buf(L[7] << 9);
  11211. var i = 0, T = 0;
  11212. {
  11213. for(i = 0; i < 8; ++i) o.write_shift(1, HEADER_SIG[i]);
  11214. for(i = 0; i < 8; ++i) o.write_shift(2, 0);
  11215. o.write_shift(2, 0x003E);
  11216. o.write_shift(2, 0x0003);
  11217. o.write_shift(2, 0xFFFE);
  11218. o.write_shift(2, 0x0009);
  11219. o.write_shift(2, 0x0006);
  11220. for(i = 0; i < 3; ++i) o.write_shift(2, 0);
  11221. o.write_shift(4, 0);
  11222. o.write_shift(4, L[2]);
  11223. o.write_shift(4, L[0] + L[1] + L[2] + L[3] - 1);
  11224. o.write_shift(4, 0);
  11225. o.write_shift(4, 1<<12);
  11226. o.write_shift(4, L[3] ? L[0] + L[1] + L[2] - 1: ENDOFCHAIN);
  11227. o.write_shift(4, L[3]);
  11228. o.write_shift(-4, L[1] ? L[0] - 1: ENDOFCHAIN);
  11229. o.write_shift(4, L[1]);
  11230. for(i = 0; i < 109; ++i) o.write_shift(-4, i < L[2] ? L[1] + i : -1);
  11231. }
  11232. if(L[1]) {
  11233. for(T = 0; T < L[1]; ++T) {
  11234. for(; i < 236 + T * 127; ++i) o.write_shift(-4, i < L[2] ? L[1] + i : -1);
  11235. o.write_shift(-4, T === L[1] - 1 ? ENDOFCHAIN : T + 1);
  11236. }
  11237. }
  11238. var chainit = function(w) {
  11239. for(T += w; i<T-1; ++i) o.write_shift(-4, i+1);
  11240. if(w) { ++i; o.write_shift(-4, ENDOFCHAIN); }
  11241. };
  11242. T = i = 0;
  11243. for(T+=L[1]; i<T; ++i) o.write_shift(-4, consts.DIFSECT);
  11244. for(T+=L[2]; i<T; ++i) o.write_shift(-4, consts.FATSECT);
  11245. chainit(L[3]);
  11246. chainit(L[4]);
  11247. var j = 0, flen = 0;
  11248. var file = cfb.FileIndex[0];
  11249. for(; j < cfb.FileIndex.length; ++j) {
  11250. file = cfb.FileIndex[j];
  11251. if(!file.content) continue;
  11252. flen = file.content.length;
  11253. if(flen < 0x1000) continue;
  11254. file.start = T;
  11255. chainit((flen + 0x01FF) >> 9);
  11256. }
  11257. chainit((L[6] + 7) >> 3);
  11258. while(o.l & 0x1FF) o.write_shift(-4, consts.ENDOFCHAIN);
  11259. T = i = 0;
  11260. for(j = 0; j < cfb.FileIndex.length; ++j) {
  11261. file = cfb.FileIndex[j];
  11262. if(!file.content) continue;
  11263. flen = file.content.length;
  11264. if(!flen || flen >= 0x1000) continue;
  11265. file.start = T;
  11266. chainit((flen + 0x3F) >> 6);
  11267. }
  11268. while(o.l & 0x1FF) o.write_shift(-4, consts.ENDOFCHAIN);
  11269. for(i = 0; i < L[4]<<2; ++i) {
  11270. var nm = cfb.FullPaths[i];
  11271. if(!nm || nm.length === 0) {
  11272. for(j = 0; j < 17; ++j) o.write_shift(4, 0);
  11273. for(j = 0; j < 3; ++j) o.write_shift(4, -1);
  11274. for(j = 0; j < 12; ++j) o.write_shift(4, 0);
  11275. continue;
  11276. }
  11277. file = cfb.FileIndex[i];
  11278. if(i === 0) file.start = file.size ? file.start - 1 : ENDOFCHAIN;
  11279. var _nm = (i === 0 && _opts.root) || file.name;
  11280. flen = 2*(_nm.length+1);
  11281. o.write_shift(64, _nm, "utf16le");
  11282. o.write_shift(2, flen);
  11283. o.write_shift(1, file.type);
  11284. o.write_shift(1, file.color);
  11285. o.write_shift(-4, file.L);
  11286. o.write_shift(-4, file.R);
  11287. o.write_shift(-4, file.C);
  11288. if(!file.clsid) for(j = 0; j < 4; ++j) o.write_shift(4, 0);
  11289. else o.write_shift(16, file.clsid, "hex");
  11290. o.write_shift(4, file.state || 0);
  11291. o.write_shift(4, 0); o.write_shift(4, 0);
  11292. o.write_shift(4, 0); o.write_shift(4, 0);
  11293. o.write_shift(4, file.start);
  11294. o.write_shift(4, file.size); o.write_shift(4, 0);
  11295. }
  11296. for(i = 1; i < cfb.FileIndex.length; ++i) {
  11297. file = cfb.FileIndex[i];
  11298. if(file.size >= 0x1000) {
  11299. o.l = (file.start+1) << 9;
  11300. for(j = 0; j < file.size; ++j) o.write_shift(1, file.content[j]);
  11301. for(; j & 0x1FF; ++j) o.write_shift(1, 0);
  11302. }
  11303. }
  11304. for(i = 1; i < cfb.FileIndex.length; ++i) {
  11305. file = cfb.FileIndex[i];
  11306. if(file.size > 0 && file.size < 0x1000) {
  11307. for(j = 0; j < file.size; ++j) o.write_shift(1, file.content[j]);
  11308. for(; j & 0x3F; ++j) o.write_shift(1, 0);
  11309. }
  11310. }
  11311. while(o.l < o.length) o.write_shift(1, 0);
  11312. return o;
  11313. }
  11314. /* [MS-CFB] 2.6.4 (Unicode 3.0.1 case conversion) */
  11315. function find(cfb, path) {
  11316. var UCFullPaths = cfb.FullPaths.map(function(x) { return x.toUpperCase(); });
  11317. var UCPaths = UCFullPaths.map(function(x) { var y = x.split("/"); return y[y.length - (x.slice(-1) == "/" ? 2 : 1)]; });
  11318. var k = false;
  11319. if(path.charCodeAt(0) === 47 /* "/" */) { k = true; path = UCFullPaths[0].slice(0, -1) + path; }
  11320. else k = path.indexOf("/") !== -1;
  11321. var UCPath = path.toUpperCase();
  11322. var w = k === true ? UCFullPaths.indexOf(UCPath) : UCPaths.indexOf(UCPath);
  11323. if(w !== -1) return cfb.FileIndex[w];
  11324. var m = !UCPath.match(chr1);
  11325. UCPath = UCPath.replace(chr0,'');
  11326. if(m) UCPath = UCPath.replace(chr1,'!');
  11327. for(w = 0; w < UCFullPaths.length; ++w) {
  11328. if((m ? UCFullPaths[w].replace(chr1,'!') : UCFullPaths[w]).replace(chr0,'') == UCPath) return cfb.FileIndex[w];
  11329. if((m ? UCPaths[w].replace(chr1,'!') : UCPaths[w]).replace(chr0,'') == UCPath) return cfb.FileIndex[w];
  11330. }
  11331. return null;
  11332. }
  11333. /** CFB Constants */
  11334. var MSSZ = 64; /* Mini Sector Size = 1<<6 */
  11335. //var MSCSZ = 4096; /* Mini Stream Cutoff Size */
  11336. /* 2.1 Compound File Sector Numbers and Types */
  11337. var ENDOFCHAIN = -2;
  11338. /* 2.2 Compound File Header */
  11339. var HEADER_SIGNATURE = 'd0cf11e0a1b11ae1';
  11340. var HEADER_SIG = [0xD0, 0xCF, 0x11, 0xE0, 0xA1, 0xB1, 0x1A, 0xE1];
  11341. var HEADER_CLSID = '00000000000000000000000000000000';
  11342. var consts = {
  11343. /* 2.1 Compund File Sector Numbers and Types */
  11344. MAXREGSECT: -6,
  11345. DIFSECT: -4,
  11346. FATSECT: -3,
  11347. ENDOFCHAIN: ENDOFCHAIN,
  11348. FREESECT: -1,
  11349. /* 2.2 Compound File Header */
  11350. HEADER_SIGNATURE: HEADER_SIGNATURE,
  11351. HEADER_MINOR_VERSION: '3e00',
  11352. MAXREGSID: -6,
  11353. NOSTREAM: -1,
  11354. HEADER_CLSID: HEADER_CLSID,
  11355. /* 2.6.1 Compound File Directory Entry */
  11356. EntryTypes: ['unknown','storage','stream','lockbytes','property','root']
  11357. };
  11358. function write_file(cfb, filename, options) {
  11359. get_fs();
  11360. var o = _write(cfb, options);
  11361. fs.writeFileSync(filename, o);
  11362. }
  11363. function a2s(o) {
  11364. var out = new Array(o.length);
  11365. for(var i = 0; i < o.length; ++i) out[i] = String.fromCharCode(o[i]);
  11366. return out.join("");
  11367. }
  11368. function write(cfb, options) {
  11369. var o = _write(cfb, options);
  11370. switch(options && options.type) {
  11371. case "file": get_fs(); fs.writeFileSync(options.filename, (o)); return o;
  11372. case "binary": return a2s(o);
  11373. case "base64": return Base64.encode(a2s(o));
  11374. }
  11375. return o;
  11376. }
  11377. /* node < 8.1 zlib does not expose bytesRead, so default to pure JS */
  11378. var _zlib;
  11379. function use_zlib(zlib) { try {
  11380. var InflateRaw = zlib.InflateRaw;
  11381. var InflRaw = new InflateRaw();
  11382. InflRaw._processChunk(new Uint8Array([3, 0]), InflRaw._finishFlushFlag);
  11383. if(InflRaw.bytesRead) _zlib = zlib;
  11384. else throw new Error("zlib does not expose bytesRead");
  11385. } catch(e) {console.error("cannot use native zlib: " + (e.message || e)); } }
  11386. function _inflateRawSync(payload, usz) {
  11387. if(!_zlib) return _inflate(payload, usz);
  11388. var InflateRaw = _zlib.InflateRaw;
  11389. var InflRaw = new InflateRaw();
  11390. var out = InflRaw._processChunk(payload.slice(payload.l), InflRaw._finishFlushFlag);
  11391. payload.l += InflRaw.bytesRead;
  11392. return out;
  11393. }
  11394. function _deflateRawSync(payload) {
  11395. return _zlib ? _zlib.deflateRawSync(payload) : _deflate(payload);
  11396. }
  11397. var CLEN_ORDER = [ 16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15 ];
  11398. /* LEN_ID = [ 257, 258, 259, 260, 261, 262, 263, 264, 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, 275, 276, 277, 278, 279, 280, 281, 282, 283, 284, 285 ]; */
  11399. var LEN_LN = [ 3, 4, 5, 6, 7, 8, 9, 10, 11, 13 , 15, 17, 19, 23, 27, 31, 35, 43, 51, 59, 67, 83, 99, 115, 131, 163, 195, 227, 258 ];
  11400. /* DST_ID = [ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29 ]; */
  11401. var DST_LN = [ 1, 2, 3, 4, 5, 7, 9, 13, 17, 25, 33, 49, 65, 97, 129, 193, 257, 385, 513, 769, 1025, 1537, 2049, 3073, 4097, 6145, 8193, 12289, 16385, 24577 ];
  11402. function bit_swap_8(n) { var t = (((((n<<1)|(n<<11)) & 0x22110) | (((n<<5)|(n<<15)) & 0x88440))); return ((t>>16) | (t>>8) |t)&0xFF; }
  11403. var use_typed_arrays = typeof Uint8Array !== 'undefined';
  11404. var bitswap8 = use_typed_arrays ? new Uint8Array(1<<8) : [];
  11405. for(var q = 0; q < (1<<8); ++q) bitswap8[q] = bit_swap_8(q);
  11406. function bit_swap_n(n, b) {
  11407. var rev = bitswap8[n & 0xFF];
  11408. if(b <= 8) return rev >>> (8-b);
  11409. rev = (rev << 8) | bitswap8[(n>>8)&0xFF];
  11410. if(b <= 16) return rev >>> (16-b);
  11411. rev = (rev << 8) | bitswap8[(n>>16)&0xFF];
  11412. return rev >>> (24-b);
  11413. }
  11414. /* helpers for unaligned bit reads */
  11415. function read_bits_2(buf, bl) { var w = (bl&7), h = (bl>>>3); return ((buf[h]|(w <= 6 ? 0 : buf[h+1]<<8))>>>w)& 0x03; }
  11416. function read_bits_3(buf, bl) { var w = (bl&7), h = (bl>>>3); return ((buf[h]|(w <= 5 ? 0 : buf[h+1]<<8))>>>w)& 0x07; }
  11417. function read_bits_4(buf, bl) { var w = (bl&7), h = (bl>>>3); return ((buf[h]|(w <= 4 ? 0 : buf[h+1]<<8))>>>w)& 0x0F; }
  11418. function read_bits_5(buf, bl) { var w = (bl&7), h = (bl>>>3); return ((buf[h]|(w <= 3 ? 0 : buf[h+1]<<8))>>>w)& 0x1F; }
  11419. function read_bits_7(buf, bl) { var w = (bl&7), h = (bl>>>3); return ((buf[h]|(w <= 1 ? 0 : buf[h+1]<<8))>>>w)& 0x7F; }
  11420. /* works up to n = 3 * 8 + 1 = 25 */
  11421. function read_bits_n(buf, bl, n) {
  11422. var w = (bl&7), h = (bl>>>3), f = ((1<<n)-1);
  11423. var v = buf[h] >>> w;
  11424. if(n < 8 - w) return v & f;
  11425. v |= buf[h+1]<<(8-w);
  11426. if(n < 16 - w) return v & f;
  11427. v |= buf[h+2]<<(16-w);
  11428. if(n < 24 - w) return v & f;
  11429. v |= buf[h+3]<<(24-w);
  11430. return v & f;
  11431. }
  11432. /* until ArrayBuffer#realloc is a thing, fake a realloc */
  11433. function realloc(b, sz) {
  11434. var L = b.length, M = 2*L > sz ? 2*L : sz + 5, i = 0;
  11435. if(L >= sz) return b;
  11436. if(has_buf) {
  11437. var o = new_unsafe_buf(M);
  11438. // $FlowIgnore
  11439. if(b.copy) b.copy(o);
  11440. else for(; i < b.length; ++i) o[i] = b[i];
  11441. return o;
  11442. } else if(use_typed_arrays) {
  11443. var a = new Uint8Array(M);
  11444. if(a.set) a.set(b);
  11445. else for(; i < b.length; ++i) a[i] = b[i];
  11446. return a;
  11447. }
  11448. b.length = M;
  11449. return b;
  11450. }
  11451. /* zero-filled arrays for older browsers */
  11452. function zero_fill_array(n) {
  11453. var o = new Array(n);
  11454. for(var i = 0; i < n; ++i) o[i] = 0;
  11455. return o;
  11456. }var _deflate = (function() {
  11457. var _deflateRaw = (function() {
  11458. return function deflateRaw(data, out) {
  11459. var boff = 0;
  11460. while(boff < data.length) {
  11461. var L = Math.min(0xFFFF, data.length - boff);
  11462. var h = boff + L == data.length;
  11463. /* TODO: this is only type 0 stored */
  11464. out.write_shift(1, +h);
  11465. out.write_shift(2, L);
  11466. out.write_shift(2, (~L) & 0xFFFF);
  11467. while(L-- > 0) out[out.l++] = data[boff++];
  11468. }
  11469. return out.l;
  11470. };
  11471. })();
  11472. return function(data) {
  11473. var buf = new_buf(50+Math.floor(data.length*1.1));
  11474. var off = _deflateRaw(data, buf);
  11475. return buf.slice(0, off);
  11476. };
  11477. })();
  11478. /* modified inflate function also moves original read head */
  11479. /* build tree (used for literals and lengths) */
  11480. function build_tree(clens, cmap, MAX) {
  11481. var maxlen = 1, w = 0, i = 0, j = 0, ccode = 0, L = clens.length;
  11482. var bl_count = use_typed_arrays ? new Uint16Array(32) : zero_fill_array(32);
  11483. for(i = 0; i < 32; ++i) bl_count[i] = 0;
  11484. for(i = L; i < MAX; ++i) clens[i] = 0;
  11485. L = clens.length;
  11486. var ctree = use_typed_arrays ? new Uint16Array(L) : zero_fill_array(L); // []
  11487. /* build code tree */
  11488. for(i = 0; i < L; ++i) {
  11489. bl_count[(w = clens[i])]++;
  11490. if(maxlen < w) maxlen = w;
  11491. ctree[i] = 0;
  11492. }
  11493. bl_count[0] = 0;
  11494. for(i = 1; i <= maxlen; ++i) bl_count[i+16] = (ccode = (ccode + bl_count[i-1])<<1);
  11495. for(i = 0; i < L; ++i) {
  11496. ccode = clens[i];
  11497. if(ccode != 0) ctree[i] = bl_count[ccode+16]++;
  11498. }
  11499. /* cmap[maxlen + 4 bits] = (off&15) + (lit<<4) reverse mapping */
  11500. var cleni = 0;
  11501. for(i = 0; i < L; ++i) {
  11502. cleni = clens[i];
  11503. if(cleni != 0) {
  11504. ccode = bit_swap_n(ctree[i], maxlen)>>(maxlen-cleni);
  11505. for(j = (1<<(maxlen + 4 - cleni)) - 1; j>=0; --j)
  11506. cmap[ccode|(j<<cleni)] = (cleni&15) | (i<<4);
  11507. }
  11508. }
  11509. return maxlen;
  11510. }
  11511. var fix_lmap = use_typed_arrays ? new Uint16Array(512) : zero_fill_array(512);
  11512. var fix_dmap = use_typed_arrays ? new Uint16Array(32) : zero_fill_array(32);
  11513. if(!use_typed_arrays) {
  11514. for(var i = 0; i < 512; ++i) fix_lmap[i] = 0;
  11515. for(i = 0; i < 32; ++i) fix_dmap[i] = 0;
  11516. }
  11517. (function() {
  11518. var dlens = [];
  11519. var i = 0;
  11520. for(;i<32; i++) dlens.push(5);
  11521. build_tree(dlens, fix_dmap, 32);
  11522. var clens = [];
  11523. i = 0;
  11524. for(; i<=143; i++) clens.push(8);
  11525. for(; i<=255; i++) clens.push(9);
  11526. for(; i<=279; i++) clens.push(7);
  11527. for(; i<=287; i++) clens.push(8);
  11528. build_tree(clens, fix_lmap, 288);
  11529. })();
  11530. var dyn_lmap = use_typed_arrays ? new Uint16Array(32768) : zero_fill_array(32768);
  11531. var dyn_dmap = use_typed_arrays ? new Uint16Array(32768) : zero_fill_array(32768);
  11532. var dyn_cmap = use_typed_arrays ? new Uint16Array(128) : zero_fill_array(128);
  11533. var dyn_len_1 = 1, dyn_len_2 = 1;
  11534. /* 5.5.3 Expanding Huffman Codes */
  11535. function dyn(data, boff) {
  11536. /* nomenclature from RFC1951 refers to bit values; these are offset by the implicit constant */
  11537. var _HLIT = read_bits_5(data, boff) + 257; boff += 5;
  11538. var _HDIST = read_bits_5(data, boff) + 1; boff += 5;
  11539. var _HCLEN = read_bits_4(data, boff) + 4; boff += 4;
  11540. var w = 0;
  11541. /* grab and store code lengths */
  11542. var clens = use_typed_arrays ? new Uint8Array(19) : zero_fill_array(19);
  11543. var ctree = [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ];
  11544. var maxlen = 1;
  11545. var bl_count = use_typed_arrays ? new Uint8Array(8) : zero_fill_array(8);
  11546. var next_code = use_typed_arrays ? new Uint8Array(8) : zero_fill_array(8);
  11547. var L = clens.length; /* 19 */
  11548. for(var i = 0; i < _HCLEN; ++i) {
  11549. clens[CLEN_ORDER[i]] = w = read_bits_3(data, boff);
  11550. if(maxlen < w) maxlen = w;
  11551. bl_count[w]++;
  11552. boff += 3;
  11553. }
  11554. /* build code tree */
  11555. var ccode = 0;
  11556. bl_count[0] = 0;
  11557. for(i = 1; i <= maxlen; ++i) next_code[i] = ccode = (ccode + bl_count[i-1])<<1;
  11558. for(i = 0; i < L; ++i) if((ccode = clens[i]) != 0) ctree[i] = next_code[ccode]++;
  11559. /* cmap[7 bits from stream] = (off&7) + (lit<<3) */
  11560. var cleni = 0;
  11561. for(i = 0; i < L; ++i) {
  11562. cleni = clens[i];
  11563. if(cleni != 0) {
  11564. ccode = bitswap8[ctree[i]]>>(8-cleni);
  11565. for(var j = (1<<(7-cleni))-1; j>=0; --j) dyn_cmap[ccode|(j<<cleni)] = (cleni&7) | (i<<3);
  11566. }
  11567. }
  11568. /* read literal and dist codes at once */
  11569. var hcodes = [];
  11570. maxlen = 1;
  11571. for(; hcodes.length < _HLIT + _HDIST;) {
  11572. ccode = dyn_cmap[read_bits_7(data, boff)];
  11573. boff += ccode & 7;
  11574. switch((ccode >>>= 3)) {
  11575. case 16:
  11576. w = 3 + read_bits_2(data, boff); boff += 2;
  11577. ccode = hcodes[hcodes.length - 1];
  11578. while(w-- > 0) hcodes.push(ccode);
  11579. break;
  11580. case 17:
  11581. w = 3 + read_bits_3(data, boff); boff += 3;
  11582. while(w-- > 0) hcodes.push(0);
  11583. break;
  11584. case 18:
  11585. w = 11 + read_bits_7(data, boff); boff += 7;
  11586. while(w -- > 0) hcodes.push(0);
  11587. break;
  11588. default:
  11589. hcodes.push(ccode);
  11590. if(maxlen < ccode) maxlen = ccode;
  11591. break;
  11592. }
  11593. }
  11594. /* build literal / length trees */
  11595. var h1 = hcodes.slice(0, _HLIT), h2 = hcodes.slice(_HLIT);
  11596. for(i = _HLIT; i < 286; ++i) h1[i] = 0;
  11597. for(i = _HDIST; i < 30; ++i) h2[i] = 0;
  11598. dyn_len_1 = build_tree(h1, dyn_lmap, 286);
  11599. dyn_len_2 = build_tree(h2, dyn_dmap, 30);
  11600. return boff;
  11601. }
  11602. /* return [ data, bytesRead ] */
  11603. function inflate(data, usz) {
  11604. /* shortcircuit for empty buffer [0x03, 0x00] */
  11605. if(data[0] == 3 && !(data[1] & 0x3)) { return [new_raw_buf(usz), 2]; }
  11606. /* bit offset */
  11607. var boff = 0;
  11608. /* header includes final bit and type bits */
  11609. var header = 0;
  11610. var outbuf = new_unsafe_buf(usz ? usz : (1<<18));
  11611. var woff = 0;
  11612. var OL = outbuf.length>>>0;
  11613. var max_len_1 = 0, max_len_2 = 0;
  11614. while((header&1) == 0) {
  11615. header = read_bits_3(data, boff); boff += 3;
  11616. if((header >>> 1) == 0) {
  11617. /* Stored block */
  11618. if(boff & 7) boff += 8 - (boff&7);
  11619. /* 2 bytes sz, 2 bytes bit inverse */
  11620. var sz = data[boff>>>3] | data[(boff>>>3)+1]<<8;
  11621. boff += 32;
  11622. /* push sz bytes */
  11623. if(!usz && OL < woff + sz) { outbuf = realloc(outbuf, woff + sz); OL = outbuf.length; }
  11624. if(typeof data.copy === 'function') {
  11625. // $FlowIgnore
  11626. data.copy(outbuf, woff, boff>>>3, (boff>>>3)+sz);
  11627. woff += sz; boff += 8*sz;
  11628. } else while(sz-- > 0) { outbuf[woff++] = data[boff>>>3]; boff += 8; }
  11629. continue;
  11630. } else if((header >>> 1) == 1) {
  11631. /* Fixed Huffman */
  11632. max_len_1 = 9; max_len_2 = 5;
  11633. } else {
  11634. /* Dynamic Huffman */
  11635. boff = dyn(data, boff);
  11636. max_len_1 = dyn_len_1; max_len_2 = dyn_len_2;
  11637. }
  11638. if(!usz && (OL < woff + 32767)) { outbuf = realloc(outbuf, woff + 32767); OL = outbuf.length; }
  11639. for(;;) { // while(true) is apparently out of vogue in modern JS circles
  11640. /* ingest code and move read head */
  11641. var bits = read_bits_n(data, boff, max_len_1);
  11642. var code = (header>>>1) == 1 ? fix_lmap[bits] : dyn_lmap[bits];
  11643. boff += code & 15; code >>>= 4;
  11644. /* 0-255 are literals, 256 is end of block token, 257+ are copy tokens */
  11645. if(((code>>>8)&0xFF) === 0) outbuf[woff++] = code;
  11646. else if(code == 256) break;
  11647. else {
  11648. code -= 257;
  11649. var len_eb = (code < 8) ? 0 : ((code-4)>>2); if(len_eb > 5) len_eb = 0;
  11650. var tgt = woff + LEN_LN[code];
  11651. /* length extra bits */
  11652. if(len_eb > 0) {
  11653. tgt += read_bits_n(data, boff, len_eb);
  11654. boff += len_eb;
  11655. }
  11656. /* dist code */
  11657. bits = read_bits_n(data, boff, max_len_2);
  11658. code = (header>>>1) == 1 ? fix_dmap[bits] : dyn_dmap[bits];
  11659. boff += code & 15; code >>>= 4;
  11660. var dst_eb = (code < 4 ? 0 : (code-2)>>1);
  11661. var dst = DST_LN[code];
  11662. /* dist extra bits */
  11663. if(dst_eb > 0) {
  11664. dst += read_bits_n(data, boff, dst_eb);
  11665. boff += dst_eb;
  11666. }
  11667. /* in the common case, manual byte copy is faster than TA set / Buffer copy */
  11668. if(!usz && OL < tgt) { outbuf = realloc(outbuf, tgt); OL = outbuf.length; }
  11669. while(woff < tgt) { outbuf[woff] = outbuf[woff - dst]; ++woff; }
  11670. }
  11671. }
  11672. }
  11673. return [usz ? outbuf : outbuf.slice(0, woff), (boff+7)>>>3];
  11674. }
  11675. function _inflate(payload, usz) {
  11676. var data = payload.slice(payload.l||0);
  11677. var out = inflate(data, usz);
  11678. payload.l += out[1];
  11679. return out[0];
  11680. }
  11681. function warn_or_throw(wrn, msg) {
  11682. if(wrn) { if(typeof console !== 'undefined') console.error(msg); }
  11683. else throw new Error(msg);
  11684. }
  11685. function parse_zip(file, options) {
  11686. var blob = file;
  11687. prep_blob(blob, 0);
  11688. var FileIndex = [], FullPaths = [];
  11689. var o = {
  11690. FileIndex: FileIndex,
  11691. FullPaths: FullPaths
  11692. };
  11693. init_cfb(o, { root: options.root });
  11694. /* find end of central directory, start just after signature */
  11695. var i = blob.length - 4;
  11696. while((blob[i] != 0x50 || blob[i+1] != 0x4b || blob[i+2] != 0x05 || blob[i+3] != 0x06) && i >= 0) --i;
  11697. blob.l = i + 4;
  11698. /* parse end of central directory */
  11699. blob.l += 4;
  11700. var fcnt = blob.read_shift(2);
  11701. blob.l += 6;
  11702. var start_cd = blob.read_shift(4);
  11703. /* parse central directory */
  11704. blob.l = start_cd;
  11705. for(i = 0; i < fcnt; ++i) {
  11706. /* trust local file header instead of CD entry */
  11707. blob.l += 20;
  11708. var csz = blob.read_shift(4);
  11709. var usz = blob.read_shift(4);
  11710. var namelen = blob.read_shift(2);
  11711. var efsz = blob.read_shift(2);
  11712. var fcsz = blob.read_shift(2);
  11713. blob.l += 8;
  11714. var offset = blob.read_shift(4);
  11715. var EF = parse_extra_field(blob.slice(blob.l+namelen, blob.l+namelen+efsz));
  11716. blob.l += namelen + efsz + fcsz;
  11717. var L = blob.l;
  11718. blob.l = offset + 4;
  11719. parse_local_file(blob, csz, usz, o, EF);
  11720. blob.l = L;
  11721. }
  11722. return o;
  11723. }
  11724. /* head starts just after local file header signature */
  11725. function parse_local_file(blob, csz, usz, o, EF) {
  11726. /* [local file header] */
  11727. blob.l += 2;
  11728. var flags = blob.read_shift(2);
  11729. var meth = blob.read_shift(2);
  11730. var date = parse_dos_date(blob);
  11731. if(flags & 0x2041) throw new Error("Unsupported ZIP encryption");
  11732. var crc32 = blob.read_shift(4);
  11733. var _csz = blob.read_shift(4);
  11734. var _usz = blob.read_shift(4);
  11735. var namelen = blob.read_shift(2);
  11736. var efsz = blob.read_shift(2);
  11737. // TODO: flags & (1<<11) // UTF8
  11738. var name = ""; for(var i = 0; i < namelen; ++i) name += String.fromCharCode(blob[blob.l++]);
  11739. if(efsz) {
  11740. var ef = parse_extra_field(blob.slice(blob.l, blob.l + efsz));
  11741. if((ef[0x5455]||{}).mt) date = ef[0x5455].mt;
  11742. if(((EF||{})[0x5455]||{}).mt) date = EF[0x5455].mt;
  11743. }
  11744. blob.l += efsz;
  11745. /* [encryption header] */
  11746. /* [file data] */
  11747. var data = blob.slice(blob.l, blob.l + _csz);
  11748. switch(meth) {
  11749. case 8: data = _inflateRawSync(blob, _usz); break;
  11750. case 0: break;
  11751. default: throw new Error("Unsupported ZIP Compression method " + meth);
  11752. }
  11753. /* [data descriptor] */
  11754. var wrn = false;
  11755. if(flags & 8) {
  11756. crc32 = blob.read_shift(4);
  11757. if(crc32 == 0x08074b50) { crc32 = blob.read_shift(4); wrn = true; }
  11758. _csz = blob.read_shift(4);
  11759. _usz = blob.read_shift(4);
  11760. }
  11761. if(_csz != csz) warn_or_throw(wrn, "Bad compressed size: " + csz + " != " + _csz);
  11762. if(_usz != usz) warn_or_throw(wrn, "Bad uncompressed size: " + usz + " != " + _usz);
  11763. var _crc32 = CRC32.buf(data, 0);
  11764. if((crc32>>0) != (_crc32>>0)) warn_or_throw(wrn, "Bad CRC32 checksum: " + crc32 + " != " + _crc32);
  11765. cfb_add(o, name, data, {unsafe: true, mt: date});
  11766. }
  11767. function write_zip(cfb, options) {
  11768. var _opts = options || {};
  11769. var out = [], cdirs = [];
  11770. var o = new_buf(1);
  11771. var method = (_opts.compression ? 8 : 0), flags = 0;
  11772. var desc = false;
  11773. if(desc) flags |= 8;
  11774. var i = 0, j = 0;
  11775. var start_cd = 0, fcnt = 0;
  11776. var root = cfb.FullPaths[0], fp = root, fi = cfb.FileIndex[0];
  11777. var crcs = [];
  11778. var sz_cd = 0;
  11779. for(i = 1; i < cfb.FullPaths.length; ++i) {
  11780. fp = cfb.FullPaths[i].slice(root.length); fi = cfb.FileIndex[i];
  11781. if(!fi.size || !fi.content || fp == "\u0001Sh33tJ5") continue;
  11782. var start = start_cd;
  11783. /* TODO: CP437 filename */
  11784. var namebuf = new_buf(fp.length);
  11785. for(j = 0; j < fp.length; ++j) namebuf.write_shift(1, fp.charCodeAt(j) & 0x7F);
  11786. namebuf = namebuf.slice(0, namebuf.l);
  11787. crcs[fcnt] = CRC32.buf(fi.content, 0);
  11788. var outbuf = fi.content;
  11789. if(method == 8) outbuf = _deflateRawSync(outbuf);
  11790. /* local file header */
  11791. o = new_buf(30);
  11792. o.write_shift(4, 0x04034b50);
  11793. o.write_shift(2, 20);
  11794. o.write_shift(2, flags);
  11795. o.write_shift(2, method);
  11796. /* TODO: last mod file time/date */
  11797. if(fi.mt) write_dos_date(o, fi.mt);
  11798. else o.write_shift(4, 0);
  11799. o.write_shift(-4, (flags & 8) ? 0 : crcs[fcnt]);
  11800. o.write_shift(4, (flags & 8) ? 0 : outbuf.length);
  11801. o.write_shift(4, (flags & 8) ? 0 : fi.content.length);
  11802. o.write_shift(2, namebuf.length);
  11803. o.write_shift(2, 0);
  11804. start_cd += o.length;
  11805. out.push(o);
  11806. start_cd += namebuf.length;
  11807. out.push(namebuf);
  11808. /* TODO: encryption header ? */
  11809. start_cd += outbuf.length;
  11810. out.push(outbuf);
  11811. /* data descriptor */
  11812. if(flags & 8) {
  11813. o = new_buf(12);
  11814. o.write_shift(-4, crcs[fcnt]);
  11815. o.write_shift(4, outbuf.length);
  11816. o.write_shift(4, fi.content.length);
  11817. start_cd += o.l;
  11818. out.push(o);
  11819. }
  11820. /* central directory */
  11821. o = new_buf(46);
  11822. o.write_shift(4, 0x02014b50);
  11823. o.write_shift(2, 0);
  11824. o.write_shift(2, 20);
  11825. o.write_shift(2, flags);
  11826. o.write_shift(2, method);
  11827. o.write_shift(4, 0); /* TODO: last mod file time/date */
  11828. o.write_shift(-4, crcs[fcnt]);
  11829. o.write_shift(4, outbuf.length);
  11830. o.write_shift(4, fi.content.length);
  11831. o.write_shift(2, namebuf.length);
  11832. o.write_shift(2, 0);
  11833. o.write_shift(2, 0);
  11834. o.write_shift(2, 0);
  11835. o.write_shift(2, 0);
  11836. o.write_shift(4, 0);
  11837. o.write_shift(4, start);
  11838. sz_cd += o.l;
  11839. cdirs.push(o);
  11840. sz_cd += namebuf.length;
  11841. cdirs.push(namebuf);
  11842. ++fcnt;
  11843. }
  11844. /* end of central directory */
  11845. o = new_buf(22);
  11846. o.write_shift(4, 0x06054b50);
  11847. o.write_shift(2, 0);
  11848. o.write_shift(2, 0);
  11849. o.write_shift(2, fcnt);
  11850. o.write_shift(2, fcnt);
  11851. o.write_shift(4, sz_cd);
  11852. o.write_shift(4, start_cd);
  11853. o.write_shift(2, 0);
  11854. return bconcat(([bconcat((out)), bconcat(cdirs), o]));
  11855. }
  11856. function cfb_new(opts) {
  11857. var o = ({});
  11858. init_cfb(o, opts);
  11859. return o;
  11860. }
  11861. function cfb_add(cfb, name, content, opts) {
  11862. var unsafe = opts && opts.unsafe;
  11863. if(!unsafe) init_cfb(cfb);
  11864. var file = !unsafe && CFB.find(cfb, name);
  11865. if(!file) {
  11866. var fpath = cfb.FullPaths[0];
  11867. if(name.slice(0, fpath.length) == fpath) fpath = name;
  11868. else {
  11869. if(fpath.slice(-1) != "/") fpath += "/";
  11870. fpath = (fpath + name).replace("//","/");
  11871. }
  11872. file = ({name: filename(name), type: 2});
  11873. cfb.FileIndex.push(file);
  11874. cfb.FullPaths.push(fpath);
  11875. if(!unsafe) CFB.utils.cfb_gc(cfb);
  11876. }
  11877. file.content = (content);
  11878. file.size = content ? content.length : 0;
  11879. if(opts) {
  11880. if(opts.CLSID) file.clsid = opts.CLSID;
  11881. if(opts.mt) file.mt = opts.mt;
  11882. if(opts.ct) file.ct = opts.ct;
  11883. }
  11884. return file;
  11885. }
  11886. function cfb_del(cfb, name) {
  11887. init_cfb(cfb);
  11888. var file = CFB.find(cfb, name);
  11889. if(file) for(var j = 0; j < cfb.FileIndex.length; ++j) if(cfb.FileIndex[j] == file) {
  11890. cfb.FileIndex.splice(j, 1);
  11891. cfb.FullPaths.splice(j, 1);
  11892. return true;
  11893. }
  11894. return false;
  11895. }
  11896. function cfb_mov(cfb, old_name, new_name) {
  11897. init_cfb(cfb);
  11898. var file = CFB.find(cfb, old_name);
  11899. if(file) for(var j = 0; j < cfb.FileIndex.length; ++j) if(cfb.FileIndex[j] == file) {
  11900. cfb.FileIndex[j].name = filename(new_name);
  11901. cfb.FullPaths[j] = new_name;
  11902. return true;
  11903. }
  11904. return false;
  11905. }
  11906. function cfb_gc(cfb) { rebuild_cfb(cfb, true); }
  11907. exports.find = find;
  11908. exports.read = read;
  11909. exports.parse = parse;
  11910. exports.write = write;
  11911. exports.writeFile = write_file;
  11912. exports.utils = {
  11913. cfb_new: cfb_new,
  11914. cfb_add: cfb_add,
  11915. cfb_del: cfb_del,
  11916. cfb_mov: cfb_mov,
  11917. cfb_gc: cfb_gc,
  11918. ReadShift: ReadShift,
  11919. CheckField: CheckField,
  11920. prep_blob: prep_blob,
  11921. bconcat: bconcat,
  11922. use_zlib: use_zlib,
  11923. _deflateRaw: _deflate,
  11924. _inflateRaw: _inflate,
  11925. consts: consts
  11926. };
  11927. return exports;
  11928. })();
  11929. if( true && typeof DO_NOT_EXPORT_CFB === 'undefined') { module.exports = CFB; }
  11930. var _fs;
  11931. if(true) try { _fs = __webpack_require__(/*! fs */ "?58fb"); } catch(e) {}
  11932. /* normalize data for blob ctor */
  11933. function blobify(data) {
  11934. if(typeof data === "string") return s2ab(data);
  11935. if(Array.isArray(data)) return a2u(data);
  11936. return data;
  11937. }
  11938. /* write or download file */
  11939. function write_dl(fname, payload, enc) {
  11940. /*global IE_SaveFile, Blob, navigator, saveAs, document, File, chrome */
  11941. if(typeof _fs !== 'undefined' && _fs.writeFileSync) return enc ? _fs.writeFileSync(fname, payload, enc) : _fs.writeFileSync(fname, payload);
  11942. var data = (enc == "utf8") ? utf8write(payload) : payload;
  11943. if(typeof IE_SaveFile !== 'undefined') return IE_SaveFile(data, fname);
  11944. if(typeof Blob !== 'undefined') {
  11945. var blob = new Blob([blobify(data)], {type:"application/octet-stream"});
  11946. if(typeof navigator !== 'undefined' && navigator.msSaveBlob) return navigator.msSaveBlob(blob, fname);
  11947. if(typeof saveAs !== 'undefined') return saveAs(blob, fname);
  11948. if(typeof URL !== 'undefined' && typeof document !== 'undefined' && document.createElement && URL.createObjectURL) {
  11949. var url = URL.createObjectURL(blob);
  11950. if(typeof chrome === 'object' && typeof (chrome.downloads||{}).download == "function") {
  11951. if(URL.revokeObjectURL && typeof setTimeout !== 'undefined') setTimeout(function() { URL.revokeObjectURL(url); }, 60000);
  11952. return chrome.downloads.download({ url: url, filename: fname, saveAs: true});
  11953. }
  11954. var a = document.createElement("a");
  11955. if(a.download != null) {
  11956. a.download = fname; a.href = url; document.body.appendChild(a); a.click();
  11957. document.body.removeChild(a);
  11958. if(URL.revokeObjectURL && typeof setTimeout !== 'undefined') setTimeout(function() { URL.revokeObjectURL(url); }, 60000);
  11959. return url;
  11960. }
  11961. }
  11962. }
  11963. // $FlowIgnore
  11964. if(typeof $ !== 'undefined' && typeof File !== 'undefined' && typeof Folder !== 'undefined') try { // extendscript
  11965. // $FlowIgnore
  11966. var out = File(fname); out.open("w"); out.encoding = "binary";
  11967. if(Array.isArray(payload)) payload = a2s(payload);
  11968. out.write(payload); out.close(); return payload;
  11969. } catch(e) { if(!e.message || !e.message.match(/onstruct/)) throw e; }
  11970. throw new Error("cannot save file " + fname);
  11971. }
  11972. /* read binary data from file */
  11973. function read_binary(path) {
  11974. if(typeof _fs !== 'undefined') return _fs.readFileSync(path);
  11975. // $FlowIgnore
  11976. if(typeof $ !== 'undefined' && typeof File !== 'undefined' && typeof Folder !== 'undefined') try { // extendscript
  11977. // $FlowIgnore
  11978. var infile = File(path); infile.open("r"); infile.encoding = "binary";
  11979. var data = infile.read(); infile.close();
  11980. return data;
  11981. } catch(e) { if(!e.message || !e.message.match(/onstruct/)) throw e; }
  11982. throw new Error("Cannot access file " + path);
  11983. }
  11984. function keys(o) {
  11985. var ks = Object.keys(o), o2 = [];
  11986. for(var i = 0; i < ks.length; ++i) if(Object.prototype.hasOwnProperty.call(o, ks[i])) o2.push(ks[i]);
  11987. return o2;
  11988. }
  11989. function evert_key(obj, key) {
  11990. var o = ([]), K = keys(obj);
  11991. for(var i = 0; i !== K.length; ++i) if(o[obj[K[i]][key]] == null) o[obj[K[i]][key]] = K[i];
  11992. return o;
  11993. }
  11994. function evert(obj) {
  11995. var o = ([]), K = keys(obj);
  11996. for(var i = 0; i !== K.length; ++i) o[obj[K[i]]] = K[i];
  11997. return o;
  11998. }
  11999. function evert_num(obj) {
  12000. var o = ([]), K = keys(obj);
  12001. for(var i = 0; i !== K.length; ++i) o[obj[K[i]]] = parseInt(K[i],10);
  12002. return o;
  12003. }
  12004. function evert_arr(obj) {
  12005. var o = ([]), K = keys(obj);
  12006. for(var i = 0; i !== K.length; ++i) {
  12007. if(o[obj[K[i]]] == null) o[obj[K[i]]] = [];
  12008. o[obj[K[i]]].push(K[i]);
  12009. }
  12010. return o;
  12011. }
  12012. var basedate = new Date(1899, 11, 30, 0, 0, 0); // 2209161600000
  12013. function datenum(v, date1904) {
  12014. var epoch = v.getTime();
  12015. if(date1904) epoch -= 1462*24*60*60*1000;
  12016. var dnthresh = basedate.getTime() + (v.getTimezoneOffset() - basedate.getTimezoneOffset()) * 60000;
  12017. return (epoch - dnthresh) / (24 * 60 * 60 * 1000);
  12018. }
  12019. var refdate = new Date();
  12020. var dnthresh = basedate.getTime() + (refdate.getTimezoneOffset() - basedate.getTimezoneOffset()) * 60000;
  12021. var refoffset = refdate.getTimezoneOffset();
  12022. function numdate(v) {
  12023. var out = new Date();
  12024. out.setTime(v * 24 * 60 * 60 * 1000 + dnthresh);
  12025. if (out.getTimezoneOffset() !== refoffset) {
  12026. out.setTime(out.getTime() + (out.getTimezoneOffset() - refoffset) * 60000);
  12027. }
  12028. return out;
  12029. }
  12030. /* ISO 8601 Duration */
  12031. function parse_isodur(s) {
  12032. var sec = 0, mt = 0, time = false;
  12033. var m = s.match(/P([0-9\.]+Y)?([0-9\.]+M)?([0-9\.]+D)?T([0-9\.]+H)?([0-9\.]+M)?([0-9\.]+S)?/);
  12034. if(!m) throw new Error("|" + s + "| is not an ISO8601 Duration");
  12035. for(var i = 1; i != m.length; ++i) {
  12036. if(!m[i]) continue;
  12037. mt = 1;
  12038. if(i > 3) time = true;
  12039. switch(m[i].slice(m[i].length-1)) {
  12040. case 'Y':
  12041. throw new Error("Unsupported ISO Duration Field: " + m[i].slice(m[i].length-1));
  12042. case 'D': mt *= 24;
  12043. /* falls through */
  12044. case 'H': mt *= 60;
  12045. /* falls through */
  12046. case 'M':
  12047. if(!time) throw new Error("Unsupported ISO Duration Field: M");
  12048. else mt *= 60;
  12049. /* falls through */
  12050. case 'S': break;
  12051. }
  12052. sec += mt * parseInt(m[i], 10);
  12053. }
  12054. return sec;
  12055. }
  12056. var good_pd_date = new Date('2017-02-19T19:06:09.000Z');
  12057. if(isNaN(good_pd_date.getFullYear())) good_pd_date = new Date('2/19/17');
  12058. var good_pd = good_pd_date.getFullYear() == 2017;
  12059. /* parses a date as a local date */
  12060. function parseDate(str, fixdate) {
  12061. var d = new Date(str);
  12062. if(good_pd) {
  12063. if(fixdate > 0) d.setTime(d.getTime() + d.getTimezoneOffset() * 60 * 1000);
  12064. else if(fixdate < 0) d.setTime(d.getTime() - d.getTimezoneOffset() * 60 * 1000);
  12065. return d;
  12066. }
  12067. if(str instanceof Date) return str;
  12068. if(good_pd_date.getFullYear() == 1917 && !isNaN(d.getFullYear())) {
  12069. var s = d.getFullYear();
  12070. if(str.indexOf("" + s) > -1) return d;
  12071. d.setFullYear(d.getFullYear() + 100); return d;
  12072. }
  12073. var n = str.match(/\d+/g)||["2017","2","19","0","0","0"];
  12074. var out = new Date(+n[0], +n[1] - 1, +n[2], (+n[3]||0), (+n[4]||0), (+n[5]||0));
  12075. if(str.indexOf("Z") > -1) out = new Date(out.getTime() - out.getTimezoneOffset() * 60 * 1000);
  12076. return out;
  12077. }
  12078. function cc2str(arr) {
  12079. var o = "";
  12080. for(var i = 0; i != arr.length; ++i) o += String.fromCharCode(arr[i]);
  12081. return o;
  12082. }
  12083. function dup(o) {
  12084. if(typeof JSON != 'undefined' && !Array.isArray(o)) return JSON.parse(JSON.stringify(o));
  12085. if(typeof o != 'object' || o == null) return o;
  12086. if(o instanceof Date) return new Date(o.getTime());
  12087. var out = {};
  12088. for(var k in o) if(Object.prototype.hasOwnProperty.call(o, k)) out[k] = dup(o[k]);
  12089. return out;
  12090. }
  12091. function fill(c,l) { var o = ""; while(o.length < l) o+=c; return o; }
  12092. /* TODO: stress test */
  12093. function fuzzynum(s) {
  12094. var v = Number(s);
  12095. if(!isNaN(v)) return v;
  12096. if(!/\d/.test(s)) return v;
  12097. var wt = 1;
  12098. var ss = s.replace(/([\d]),([\d])/g,"$1$2").replace(/[$]/g,"").replace(/[%]/g, function() { wt *= 100; return "";});
  12099. if(!isNaN(v = Number(ss))) return v / wt;
  12100. ss = ss.replace(/[(](.*)[)]/,function($$, $1) { wt = -wt; return $1;});
  12101. if(!isNaN(v = Number(ss))) return v / wt;
  12102. return v;
  12103. }
  12104. function fuzzydate(s) {
  12105. var o = new Date(s), n = new Date(NaN);
  12106. var y = o.getYear(), m = o.getMonth(), d = o.getDate();
  12107. if(isNaN(d)) return n;
  12108. if(y < 0 || y > 8099) return n;
  12109. if((m > 0 || d > 1) && y != 101) return o;
  12110. if(s.toLowerCase().match(/jan|feb|mar|apr|may|jun|jul|aug|sep|oct|nov|dec/)) return o;
  12111. if(s.match(/[^-0-9:,\/\\]/)) return n;
  12112. return o;
  12113. }
  12114. var safe_split_regex = "abacaba".split(/(:?b)/i).length == 5;
  12115. function split_regex(str, re, def) {
  12116. if(safe_split_regex || typeof re == "string") return str.split(re);
  12117. var p = str.split(re), o = [p[0]];
  12118. for(var i = 1; i < p.length; ++i) { o.push(def); o.push(p[i]); }
  12119. return o;
  12120. }
  12121. function getdatastr(data) {
  12122. if(!data) return null;
  12123. if(data.data) return debom(data.data);
  12124. if(data.asNodeBuffer && has_buf) return debom(data.asNodeBuffer().toString('binary'));
  12125. if(data.asBinary) return debom(data.asBinary());
  12126. if(data._data && data._data.getContent) return debom(cc2str(Array.prototype.slice.call(data._data.getContent(),0)));
  12127. if(data.content && data.type) return debom(cc2str(data.content));
  12128. return null;
  12129. }
  12130. function getdatabin(data) {
  12131. if(!data) return null;
  12132. if(data.data) return char_codes(data.data);
  12133. if(data.asNodeBuffer && has_buf) return data.asNodeBuffer();
  12134. if(data._data && data._data.getContent) {
  12135. var o = data._data.getContent();
  12136. if(typeof o == "string") return char_codes(o);
  12137. return Array.prototype.slice.call(o);
  12138. }
  12139. if(data.content && data.type) return data.content;
  12140. return null;
  12141. }
  12142. function getdata(data) { return (data && data.name.slice(-4) === ".bin") ? getdatabin(data) : getdatastr(data); }
  12143. /* Part 2 Section 10.1.2 "Mapping Content Types" Names are case-insensitive */
  12144. /* OASIS does not comment on filename case sensitivity */
  12145. function safegetzipfile(zip, file) {
  12146. var k = zip.FullPaths || keys(zip.files);
  12147. var f = file.toLowerCase(), g = f.replace(/\//g,'\\');
  12148. for(var i=0; i<k.length; ++i) {
  12149. var n = k[i].toLowerCase();
  12150. if(f == n || g == n) return zip.files[k[i]];
  12151. }
  12152. return null;
  12153. }
  12154. function getzipfile(zip, file) {
  12155. var o = safegetzipfile(zip, file);
  12156. if(o == null) throw new Error("Cannot find file " + file + " in zip");
  12157. return o;
  12158. }
  12159. function getzipdata(zip, file, safe) {
  12160. if(!safe) return getdata(getzipfile(zip, file));
  12161. if(!file) return null;
  12162. try { return getzipdata(zip, file); } catch(e) { return null; }
  12163. }
  12164. function getzipstr(zip, file, safe) {
  12165. if(!safe) return getdatastr(getzipfile(zip, file));
  12166. if(!file) return null;
  12167. try { return getzipstr(zip, file); } catch(e) { return null; }
  12168. }
  12169. function zipentries(zip) {
  12170. var k = zip.FullPaths || keys(zip.files), o = [];
  12171. for(var i = 0; i < k.length; ++i) if(k[i].slice(-1) != '/') o.push(k[i]);
  12172. return o.sort();
  12173. }
  12174. function zip_add_file(zip, path, content) {
  12175. if(zip.FullPaths) CFB.utils.cfb_add(zip, path, content);
  12176. else zip.file(path, content);
  12177. }
  12178. var jszip;
  12179. /*global JSZipSync:true */
  12180. if(typeof JSZipSync !== 'undefined') jszip = JSZipSync;
  12181. if(true) {
  12182. if( true && module.exports) {
  12183. if(typeof jszip === 'undefined') jszip = __webpack_require__(/*! ./jszip.js */ "./node_modules/xlsx/jszip.js");
  12184. }
  12185. }
  12186. function zip_new() {
  12187. if(!jszip) return CFB.utils.cfb_new();
  12188. return new jszip();
  12189. }
  12190. function zip_read(d, o) {
  12191. var zip;
  12192. if(jszip) switch(o.type) {
  12193. case "base64": zip = new jszip(d, { base64:true }); break;
  12194. case "binary": case "array": zip = new jszip(d, { base64:false }); break;
  12195. case "buffer": zip = new jszip(d); break;
  12196. default: throw new Error("Unrecognized type " + o.type);
  12197. }
  12198. else switch(o.type) {
  12199. case "base64": zip = CFB.read(d, { type: "base64" }); break;
  12200. case "binary": zip = CFB.read(d, { type: "binary" }); break;
  12201. case "buffer": case "array": zip = CFB.read(d, { type: "buffer" }); break;
  12202. default: throw new Error("Unrecognized type " + o.type);
  12203. }
  12204. return zip;
  12205. }
  12206. function resolve_path(path, base) {
  12207. if(path.charAt(0) == "/") return path.slice(1);
  12208. var result = base.split('/');
  12209. if(base.slice(-1) != "/") result.pop(); // folder path
  12210. var target = path.split('/');
  12211. while (target.length !== 0) {
  12212. var step = target.shift();
  12213. if (step === '..') result.pop();
  12214. else if (step !== '.') result.push(step);
  12215. }
  12216. return result.join('/');
  12217. }
  12218. var XML_HEADER = '<?xml version="1.0" encoding="UTF-8" standalone="yes"?>\r\n';
  12219. var attregexg=/([^"\s?>\/]+)\s*=\s*((?:")([^"]*)(?:")|(?:')([^']*)(?:')|([^'">\s]+))/g;
  12220. var tagregex=/<[\/\?]?[a-zA-Z0-9:_-]+(?:\s+[^"\s?>\/]+\s*=\s*(?:"[^"]*"|'[^']*'|[^'">\s=]+))*\s*[\/\?]?>/mg;
  12221. if(!(XML_HEADER.match(tagregex))) tagregex = /<[^>]*>/g;
  12222. var nsregex=/<\w*:/, nsregex2 = /<(\/?)\w+:/;
  12223. function parsexmltag(tag, skip_root, skip_LC) {
  12224. var z = ({});
  12225. var eq = 0, c = 0;
  12226. for(; eq !== tag.length; ++eq) if((c = tag.charCodeAt(eq)) === 32 || c === 10 || c === 13) break;
  12227. if(!skip_root) z[0] = tag.slice(0, eq);
  12228. if(eq === tag.length) return z;
  12229. var m = tag.match(attregexg), j=0, v="", i=0, q="", cc="", quot = 1;
  12230. if(m) for(i = 0; i != m.length; ++i) {
  12231. cc = m[i];
  12232. for(c=0; c != cc.length; ++c) if(cc.charCodeAt(c) === 61) break;
  12233. q = cc.slice(0,c).trim();
  12234. while(cc.charCodeAt(c+1) == 32) ++c;
  12235. quot = ((eq=cc.charCodeAt(c+1)) == 34 || eq == 39) ? 1 : 0;
  12236. v = cc.slice(c+1+quot, cc.length-quot);
  12237. for(j=0;j!=q.length;++j) if(q.charCodeAt(j) === 58) break;
  12238. if(j===q.length) {
  12239. if(q.indexOf("_") > 0) q = q.slice(0, q.indexOf("_")); // from ods
  12240. z[q] = v;
  12241. if(!skip_LC) z[q.toLowerCase()] = v;
  12242. }
  12243. else {
  12244. var k = (j===5 && q.slice(0,5)==="xmlns"?"xmlns":"")+q.slice(j+1);
  12245. if(z[k] && q.slice(j-3,j) == "ext") continue; // from ods
  12246. z[k] = v;
  12247. if(!skip_LC) z[k.toLowerCase()] = v;
  12248. }
  12249. }
  12250. return z;
  12251. }
  12252. function strip_ns(x) { return x.replace(nsregex2, "<$1"); }
  12253. var encodings = {
  12254. '&quot;': '"',
  12255. '&apos;': "'",
  12256. '&gt;': '>',
  12257. '&lt;': '<',
  12258. '&amp;': '&'
  12259. };
  12260. var rencoding = evert(encodings);
  12261. //var rencstr = "&<>'\"".split("");
  12262. // TODO: CP remap (need to read file version to determine OS)
  12263. var unescapexml = (function() {
  12264. /* 22.4.2.4 bstr (Basic String) */
  12265. var encregex = /&(?:quot|apos|gt|lt|amp|#x?([\da-fA-F]+));/ig, coderegex = /_x([\da-fA-F]{4})_/ig;
  12266. return function unescapexml(text) {
  12267. var s = text + '', i = s.indexOf("<![CDATA[");
  12268. if(i == -1) return s.replace(encregex, function($$, $1) { return encodings[$$]||String.fromCharCode(parseInt($1,$$.indexOf("x")>-1?16:10))||$$; }).replace(coderegex,function(m,c) {return String.fromCharCode(parseInt(c,16));});
  12269. var j = s.indexOf("]]>");
  12270. return unescapexml(s.slice(0, i)) + s.slice(i+9,j) + unescapexml(s.slice(j+3));
  12271. };
  12272. })();
  12273. var decregex=/[&<>'"]/g, charegex = /[\u0000-\u0008\u000b-\u001f]/g;
  12274. function escapexml(text){
  12275. var s = text + '';
  12276. return s.replace(decregex, function(y) { return rencoding[y]; }).replace(charegex,function(s) { return "_x" + ("000"+s.charCodeAt(0).toString(16)).slice(-4) + "_";});
  12277. }
  12278. function escapexmltag(text){ return escapexml(text).replace(/ /g,"_x0020_"); }
  12279. var htmlcharegex = /[\u0000-\u001f]/g;
  12280. function escapehtml(text){
  12281. var s = text + '';
  12282. return s.replace(decregex, function(y) { return rencoding[y]; }).replace(/\n/g, "<br/>").replace(htmlcharegex,function(s) { return "&#x" + ("000"+s.charCodeAt(0).toString(16)).slice(-4) + ";"; });
  12283. }
  12284. function escapexlml(text){
  12285. var s = text + '';
  12286. return s.replace(decregex, function(y) { return rencoding[y]; }).replace(htmlcharegex,function(s) { return "&#x" + (s.charCodeAt(0).toString(16)).toUpperCase() + ";"; });
  12287. }
  12288. /* TODO: handle codepages */
  12289. var xlml_fixstr = (function() {
  12290. var entregex = /&#(\d+);/g;
  12291. function entrepl($$,$1) { return String.fromCharCode(parseInt($1,10)); }
  12292. return function xlml_fixstr(str) { return str.replace(entregex,entrepl); };
  12293. })();
  12294. var xlml_unfixstr = (function() {
  12295. return function xlml_unfixstr(str) { return str.replace(/(\r\n|[\r\n])/g,"\&#10;"); };
  12296. })();
  12297. function parsexmlbool(value) {
  12298. switch(value) {
  12299. case 1: case true: case '1': case 'true': case 'TRUE': return true;
  12300. /* case '0': case 'false': case 'FALSE':*/
  12301. default: return false;
  12302. }
  12303. }
  12304. var utf8read = function utf8reada(orig) {
  12305. var out = "", i = 0, c = 0, d = 0, e = 0, f = 0, w = 0;
  12306. while (i < orig.length) {
  12307. c = orig.charCodeAt(i++);
  12308. if (c < 128) { out += String.fromCharCode(c); continue; }
  12309. d = orig.charCodeAt(i++);
  12310. if (c>191 && c<224) { f = ((c & 31) << 6); f |= (d & 63); out += String.fromCharCode(f); continue; }
  12311. e = orig.charCodeAt(i++);
  12312. if (c < 240) { out += String.fromCharCode(((c & 15) << 12) | ((d & 63) << 6) | (e & 63)); continue; }
  12313. f = orig.charCodeAt(i++);
  12314. w = (((c & 7) << 18) | ((d & 63) << 12) | ((e & 63) << 6) | (f & 63))-65536;
  12315. out += String.fromCharCode(0xD800 + ((w>>>10)&1023));
  12316. out += String.fromCharCode(0xDC00 + (w&1023));
  12317. }
  12318. return out;
  12319. };
  12320. var utf8write = function(orig) {
  12321. var out = [], i = 0, c = 0, d = 0;
  12322. while(i < orig.length) {
  12323. c = orig.charCodeAt(i++);
  12324. switch(true) {
  12325. case c < 128: out.push(String.fromCharCode(c)); break;
  12326. case c < 2048:
  12327. out.push(String.fromCharCode(192 + (c >> 6)));
  12328. out.push(String.fromCharCode(128 + (c & 63)));
  12329. break;
  12330. case c >= 55296 && c < 57344:
  12331. c -= 55296; d = orig.charCodeAt(i++) - 56320 + (c<<10);
  12332. out.push(String.fromCharCode(240 + ((d >>18) & 7)));
  12333. out.push(String.fromCharCode(144 + ((d >>12) & 63)));
  12334. out.push(String.fromCharCode(128 + ((d >> 6) & 63)));
  12335. out.push(String.fromCharCode(128 + (d & 63)));
  12336. break;
  12337. default:
  12338. out.push(String.fromCharCode(224 + (c >> 12)));
  12339. out.push(String.fromCharCode(128 + ((c >> 6) & 63)));
  12340. out.push(String.fromCharCode(128 + (c & 63)));
  12341. }
  12342. }
  12343. return out.join("");
  12344. };
  12345. if(has_buf) {
  12346. var utf8readb = function utf8readb(data) {
  12347. var out = Buffer.alloc(2*data.length), w, i, j = 1, k = 0, ww=0, c;
  12348. for(i = 0; i < data.length; i+=j) {
  12349. j = 1;
  12350. if((c=data.charCodeAt(i)) < 128) w = c;
  12351. else if(c < 224) { w = (c&31)*64+(data.charCodeAt(i+1)&63); j=2; }
  12352. else if(c < 240) { w=(c&15)*4096+(data.charCodeAt(i+1)&63)*64+(data.charCodeAt(i+2)&63); j=3; }
  12353. else { j = 4;
  12354. w = (c & 7)*262144+(data.charCodeAt(i+1)&63)*4096+(data.charCodeAt(i+2)&63)*64+(data.charCodeAt(i+3)&63);
  12355. w -= 65536; ww = 0xD800 + ((w>>>10)&1023); w = 0xDC00 + (w&1023);
  12356. }
  12357. if(ww !== 0) { out[k++] = ww&255; out[k++] = ww>>>8; ww = 0; }
  12358. out[k++] = w%256; out[k++] = w>>>8;
  12359. }
  12360. return out.slice(0,k).toString('ucs2');
  12361. };
  12362. var corpus = "foo bar baz\u00e2\u0098\u0083\u00f0\u009f\u008d\u00a3";
  12363. if(utf8read(corpus) == utf8readb(corpus)) utf8read = utf8readb;
  12364. var utf8readc = function utf8readc(data) { return Buffer_from(data, 'binary').toString('utf8'); };
  12365. if(utf8read(corpus) == utf8readc(corpus)) utf8read = utf8readc;
  12366. utf8write = function(data) { return Buffer_from(data, 'utf8').toString("binary"); };
  12367. }
  12368. // matches <foo>...</foo> extracts content
  12369. var matchtag = (function() {
  12370. var mtcache = ({});
  12371. return function matchtag(f,g) {
  12372. var t = f+"|"+(g||"");
  12373. if(mtcache[t]) return mtcache[t];
  12374. return (mtcache[t] = new RegExp('<(?:\\w+:)?'+f+'(?: xml:space="preserve")?(?:[^>]*)>([\\s\\S]*?)</(?:\\w+:)?'+f+'>',((g||""))));
  12375. };
  12376. })();
  12377. var htmldecode = (function() {
  12378. var entities = [
  12379. ['nbsp', ' '], ['middot', '·'],
  12380. ['quot', '"'], ['apos', "'"], ['gt', '>'], ['lt', '<'], ['amp', '&']
  12381. ].map(function(x) { return [new RegExp('&' + x[0] + ';', "ig"), x[1]]; });
  12382. return function htmldecode(str) {
  12383. var o = str
  12384. // Remove new lines and spaces from start of content
  12385. .replace(/^[\t\n\r ]+/, "")
  12386. // Remove new lines and spaces from end of content
  12387. .replace(/[\t\n\r ]+$/,"")
  12388. // Added line which removes any white space characters after and before html tags
  12389. .replace(/>\s+/g,">").replace(/\s+</g,"<")
  12390. // Replace remaining new lines and spaces with space
  12391. .replace(/[\t\n\r ]+/g, " ")
  12392. // Replace <br> tags with new lines
  12393. .replace(/<\s*[bB][rR]\s*\/?>/g,"\n")
  12394. // Strip HTML elements
  12395. .replace(/<[^>]*>/g,"");
  12396. for(var i = 0; i < entities.length; ++i) o = o.replace(entities[i][0], entities[i][1]);
  12397. return o;
  12398. };
  12399. })();
  12400. var vtregex = (function(){ var vt_cache = {};
  12401. return function vt_regex(bt) {
  12402. if(vt_cache[bt] !== undefined) return vt_cache[bt];
  12403. return (vt_cache[bt] = new RegExp("<(?:vt:)?" + bt + ">([\\s\\S]*?)</(?:vt:)?" + bt + ">", 'g') );
  12404. };})();
  12405. var vtvregex = /<\/?(?:vt:)?variant>/g, vtmregex = /<(?:vt:)([^>]*)>([\s\S]*)</;
  12406. function parseVector(data, opts) {
  12407. var h = parsexmltag(data);
  12408. var matches = data.match(vtregex(h.baseType))||[];
  12409. var res = [];
  12410. if(matches.length != h.size) {
  12411. if(opts.WTF) throw new Error("unexpected vector length " + matches.length + " != " + h.size);
  12412. return res;
  12413. }
  12414. matches.forEach(function(x) {
  12415. var v = x.replace(vtvregex,"").match(vtmregex);
  12416. if(v) res.push({v:utf8read(v[2]), t:v[1]});
  12417. });
  12418. return res;
  12419. }
  12420. var wtregex = /(^\s|\s$|\n)/;
  12421. function writetag(f,g) { return '<' + f + (g.match(wtregex)?' xml:space="preserve"' : "") + '>' + g + '</' + f + '>'; }
  12422. function wxt_helper(h) { return keys(h).map(function(k) { return " " + k + '="' + h[k] + '"';}).join(""); }
  12423. function writextag(f,g,h) { return '<' + f + ((h != null) ? wxt_helper(h) : "") + ((g != null) ? (g.match(wtregex)?' xml:space="preserve"' : "") + '>' + g + '</' + f : "/") + '>';}
  12424. function write_w3cdtf(d, t) { try { return d.toISOString().replace(/\.\d*/,""); } catch(e) { if(t) throw e; } return ""; }
  12425. function write_vt(s, xlsx) {
  12426. switch(typeof s) {
  12427. case 'string':
  12428. var o = writextag('vt:lpwstr', escapexml(s));
  12429. if(xlsx) o = o.replace(/&quot;/g, "_x0022_");
  12430. return o;
  12431. case 'number': return writextag((s|0)==s?'vt:i4':'vt:r8', escapexml(String(s)));
  12432. case 'boolean': return writextag('vt:bool',s?'true':'false');
  12433. }
  12434. if(s instanceof Date) return writextag('vt:filetime', write_w3cdtf(s));
  12435. throw new Error("Unable to serialize " + s);
  12436. }
  12437. var XMLNS = ({
  12438. 'dc': 'http://purl.org/dc/elements/1.1/',
  12439. 'dcterms': 'http://purl.org/dc/terms/',
  12440. 'dcmitype': 'http://purl.org/dc/dcmitype/',
  12441. 'mx': 'http://schemas.microsoft.com/office/mac/excel/2008/main',
  12442. 'r': 'http://schemas.openxmlformats.org/officeDocument/2006/relationships',
  12443. 'sjs': 'http://schemas.openxmlformats.org/package/2006/sheetjs/core-properties',
  12444. 'vt': 'http://schemas.openxmlformats.org/officeDocument/2006/docPropsVTypes',
  12445. 'xsi': 'http://www.w3.org/2001/XMLSchema-instance',
  12446. 'xsd': 'http://www.w3.org/2001/XMLSchema'
  12447. });
  12448. XMLNS.main = [
  12449. 'http://schemas.openxmlformats.org/spreadsheetml/2006/main',
  12450. 'http://purl.oclc.org/ooxml/spreadsheetml/main',
  12451. 'http://schemas.microsoft.com/office/excel/2006/main',
  12452. 'http://schemas.microsoft.com/office/excel/2006/2'
  12453. ];
  12454. var XLMLNS = ({
  12455. 'o': 'urn:schemas-microsoft-com:office:office',
  12456. 'x': 'urn:schemas-microsoft-com:office:excel',
  12457. 'ss': 'urn:schemas-microsoft-com:office:spreadsheet',
  12458. 'dt': 'uuid:C2F41010-65B3-11d1-A29F-00AA00C14882',
  12459. 'mv': 'http://macVmlSchemaUri',
  12460. 'v': 'urn:schemas-microsoft-com:vml',
  12461. 'html': 'http://www.w3.org/TR/REC-html40'
  12462. });
  12463. function read_double_le(b, idx) {
  12464. var s = 1 - 2 * (b[idx + 7] >>> 7);
  12465. var e = ((b[idx + 7] & 0x7f) << 4) + ((b[idx + 6] >>> 4) & 0x0f);
  12466. var m = (b[idx+6]&0x0f);
  12467. for(var i = 5; i >= 0; --i) m = m * 256 + b[idx + i];
  12468. if(e == 0x7ff) return m == 0 ? (s * Infinity) : NaN;
  12469. if(e == 0) e = -1022;
  12470. else { e -= 1023; m += Math.pow(2,52); }
  12471. return s * Math.pow(2, e - 52) * m;
  12472. }
  12473. function write_double_le(b, v, idx) {
  12474. var bs = ((((v < 0) || (1/v == -Infinity)) ? 1 : 0) << 7), e = 0, m = 0;
  12475. var av = bs ? (-v) : v;
  12476. if(!isFinite(av)) { e = 0x7ff; m = isNaN(v) ? 0x6969 : 0; }
  12477. else if(av == 0) e = m = 0;
  12478. else {
  12479. e = Math.floor(Math.log(av) / Math.LN2);
  12480. m = av * Math.pow(2, 52 - e);
  12481. if((e <= -1023) && (!isFinite(m) || (m < Math.pow(2,52)))) { e = -1022; }
  12482. else { m -= Math.pow(2,52); e+=1023; }
  12483. }
  12484. for(var i = 0; i <= 5; ++i, m/=256) b[idx + i] = m & 0xff;
  12485. b[idx + 6] = ((e & 0x0f) << 4) | (m & 0xf);
  12486. b[idx + 7] = (e >> 4) | bs;
  12487. }
  12488. var __toBuffer = function(bufs) { var x=[],w=10240; for(var i=0;i<bufs[0].length;++i) if(bufs[0][i]) for(var j=0,L=bufs[0][i].length;j<L;j+=w) x.push.apply(x, bufs[0][i].slice(j,j+w)); return x; };
  12489. var ___toBuffer = __toBuffer;
  12490. var __utf16le = function(b,s,e) { var ss=[]; for(var i=s; i<e; i+=2) ss.push(String.fromCharCode(__readUInt16LE(b,i))); return ss.join("").replace(chr0,''); };
  12491. var ___utf16le = __utf16le;
  12492. var __hexlify = function(b,s,l) { var ss=[]; for(var i=s; i<s+l; ++i) ss.push(("0" + b[i].toString(16)).slice(-2)); return ss.join(""); };
  12493. var ___hexlify = __hexlify;
  12494. var __utf8 = function(b,s,e) { var ss=[]; for(var i=s; i<e; i++) ss.push(String.fromCharCode(__readUInt8(b,i))); return ss.join(""); };
  12495. var ___utf8 = __utf8;
  12496. var __lpstr = function(b,i) { var len = __readUInt32LE(b,i); return len > 0 ? __utf8(b, i+4,i+4+len-1) : "";};
  12497. var ___lpstr = __lpstr;
  12498. var __cpstr = function(b,i) { var len = __readUInt32LE(b,i); return len > 0 ? __utf8(b, i+4,i+4+len-1) : "";};
  12499. var ___cpstr = __cpstr;
  12500. var __lpwstr = function(b,i) { var len = 2*__readUInt32LE(b,i); return len > 0 ? __utf8(b, i+4,i+4+len-1) : "";};
  12501. var ___lpwstr = __lpwstr;
  12502. var __lpp4, ___lpp4;
  12503. __lpp4 = ___lpp4 = function lpp4_(b,i) { var len = __readUInt32LE(b,i); return len > 0 ? __utf16le(b, i+4,i+4+len) : "";};
  12504. var __8lpp4 = function(b,i) { var len = __readUInt32LE(b,i); return len > 0 ? __utf8(b, i+4,i+4+len) : "";};
  12505. var ___8lpp4 = __8lpp4;
  12506. var __double, ___double;
  12507. __double = ___double = function(b, idx) { return read_double_le(b, idx);};
  12508. var is_buf = function is_buf_a(a) { return Array.isArray(a); };
  12509. if(has_buf) {
  12510. __utf16le = function(b,s,e) { if(!Buffer.isBuffer(b)) return ___utf16le(b,s,e); return b.toString('utf16le',s,e).replace(chr0,'')/*.replace(chr1,'!')*/; };
  12511. __hexlify = function(b,s,l) { return Buffer.isBuffer(b) ? b.toString('hex',s,s+l) : ___hexlify(b,s,l); };
  12512. __lpstr = function lpstr_b(b, i) { if(!Buffer.isBuffer(b)) return ___lpstr(b, i); var len = b.readUInt32LE(i); return len > 0 ? b.toString('utf8',i+4,i+4+len-1) : "";};
  12513. __cpstr = function cpstr_b(b, i) { if(!Buffer.isBuffer(b)) return ___cpstr(b, i); var len = b.readUInt32LE(i); return len > 0 ? b.toString('utf8',i+4,i+4+len-1) : "";};
  12514. __lpwstr = function lpwstr_b(b, i) { if(!Buffer.isBuffer(b)) return ___lpwstr(b, i); var len = 2*b.readUInt32LE(i); return b.toString('utf16le',i+4,i+4+len-1);};
  12515. __lpp4 = function lpp4_b(b, i) { if(!Buffer.isBuffer(b)) return ___lpp4(b, i); var len = b.readUInt32LE(i); return b.toString('utf16le',i+4,i+4+len);};
  12516. __8lpp4 = function lpp4_8b(b, i) { if(!Buffer.isBuffer(b)) return ___8lpp4(b, i); var len = b.readUInt32LE(i); return b.toString('utf8',i+4,i+4+len);};
  12517. __utf8 = function utf8_b(b, s, e) { return (Buffer.isBuffer(b)) ? b.toString('utf8',s,e) : ___utf8(b,s,e); };
  12518. __toBuffer = function(bufs) { return (bufs[0].length > 0 && Buffer.isBuffer(bufs[0][0])) ? Buffer.concat(bufs[0]) : ___toBuffer(bufs);};
  12519. bconcat = function(bufs) { return Buffer.isBuffer(bufs[0]) ? Buffer.concat(bufs) : [].concat.apply([], bufs); };
  12520. __double = function double_(b, i) { if(Buffer.isBuffer(b)) return b.readDoubleLE(i); return ___double(b,i); };
  12521. is_buf = function is_buf_b(a) { return Buffer.isBuffer(a) || Array.isArray(a); };
  12522. }
  12523. /* from js-xls */
  12524. if(typeof cptable !== 'undefined') {
  12525. __utf16le = function(b,s,e) { return cptable.utils.decode(1200, b.slice(s,e)).replace(chr0, ''); };
  12526. __utf8 = function(b,s,e) { return cptable.utils.decode(65001, b.slice(s,e)); };
  12527. __lpstr = function(b,i) { var len = __readUInt32LE(b,i); return len > 0 ? cptable.utils.decode(current_ansi, b.slice(i+4, i+4+len-1)) : "";};
  12528. __cpstr = function(b,i) { var len = __readUInt32LE(b,i); return len > 0 ? cptable.utils.decode(current_codepage, b.slice(i+4, i+4+len-1)) : "";};
  12529. __lpwstr = function(b,i) { var len = 2*__readUInt32LE(b,i); return len > 0 ? cptable.utils.decode(1200, b.slice(i+4,i+4+len-1)) : "";};
  12530. __lpp4 = function(b,i) { var len = __readUInt32LE(b,i); return len > 0 ? cptable.utils.decode(1200, b.slice(i+4,i+4+len)) : "";};
  12531. __8lpp4 = function(b,i) { var len = __readUInt32LE(b,i); return len > 0 ? cptable.utils.decode(65001, b.slice(i+4,i+4+len)) : "";};
  12532. }
  12533. var __readUInt8 = function(b, idx) { return b[idx]; };
  12534. var __readUInt16LE = function(b, idx) { return (b[idx+1]*(1<<8))+b[idx]; };
  12535. var __readInt16LE = function(b, idx) { var u = (b[idx+1]*(1<<8))+b[idx]; return (u < 0x8000) ? u : ((0xffff - u + 1) * -1); };
  12536. var __readUInt32LE = function(b, idx) { return b[idx+3]*(1<<24)+(b[idx+2]<<16)+(b[idx+1]<<8)+b[idx]; };
  12537. var __readInt32LE = function(b, idx) { return (b[idx+3]<<24)|(b[idx+2]<<16)|(b[idx+1]<<8)|b[idx]; };
  12538. var __readInt32BE = function(b, idx) { return (b[idx]<<24)|(b[idx+1]<<16)|(b[idx+2]<<8)|b[idx+3]; };
  12539. function ReadShift(size, t) {
  12540. var o="", oI, oR, oo=[], w, vv, i, loc;
  12541. switch(t) {
  12542. case 'dbcs':
  12543. loc = this.l;
  12544. if(has_buf && Buffer.isBuffer(this)) o = this.slice(this.l, this.l+2*size).toString("utf16le");
  12545. else for(i = 0; i < size; ++i) { o+=String.fromCharCode(__readUInt16LE(this, loc)); loc+=2; }
  12546. size *= 2;
  12547. break;
  12548. case 'utf8': o = __utf8(this, this.l, this.l + size); break;
  12549. case 'utf16le': size *= 2; o = __utf16le(this, this.l, this.l + size); break;
  12550. case 'wstr':
  12551. if(typeof cptable !== 'undefined') o = cptable.utils.decode(current_codepage, this.slice(this.l, this.l+2*size));
  12552. else return ReadShift.call(this, size, 'dbcs');
  12553. size = 2 * size; break;
  12554. /* [MS-OLEDS] 2.1.4 LengthPrefixedAnsiString */
  12555. case 'lpstr-ansi': o = __lpstr(this, this.l); size = 4 + __readUInt32LE(this, this.l); break;
  12556. case 'lpstr-cp': o = __cpstr(this, this.l); size = 4 + __readUInt32LE(this, this.l); break;
  12557. /* [MS-OLEDS] 2.1.5 LengthPrefixedUnicodeString */
  12558. case 'lpwstr': o = __lpwstr(this, this.l); size = 4 + 2 * __readUInt32LE(this, this.l); break;
  12559. /* [MS-OFFCRYPTO] 2.1.2 Length-Prefixed Padded Unicode String (UNICODE-LP-P4) */
  12560. case 'lpp4': size = 4 + __readUInt32LE(this, this.l); o = __lpp4(this, this.l); if(size & 0x02) size += 2; break;
  12561. /* [MS-OFFCRYPTO] 2.1.3 Length-Prefixed UTF-8 String (UTF-8-LP-P4) */
  12562. case '8lpp4': size = 4 + __readUInt32LE(this, this.l); o = __8lpp4(this, this.l); if(size & 0x03) size += 4 - (size & 0x03); break;
  12563. case 'cstr': size = 0; o = "";
  12564. while((w=__readUInt8(this, this.l + size++))!==0) oo.push(_getchar(w));
  12565. o = oo.join(""); break;
  12566. case '_wstr': size = 0; o = "";
  12567. while((w=__readUInt16LE(this,this.l +size))!==0){oo.push(_getchar(w));size+=2;}
  12568. size+=2; o = oo.join(""); break;
  12569. /* sbcs and dbcs support continue records in the SST way TODO codepages */
  12570. case 'dbcs-cont': o = ""; loc = this.l;
  12571. for(i = 0; i < size; ++i) {
  12572. if(this.lens && this.lens.indexOf(loc) !== -1) {
  12573. w = __readUInt8(this, loc);
  12574. this.l = loc + 1;
  12575. vv = ReadShift.call(this, size-i, w ? 'dbcs-cont' : 'sbcs-cont');
  12576. return oo.join("") + vv;
  12577. }
  12578. oo.push(_getchar(__readUInt16LE(this, loc)));
  12579. loc+=2;
  12580. } o = oo.join(""); size *= 2; break;
  12581. case 'cpstr':
  12582. if(typeof cptable !== 'undefined') {
  12583. o = cptable.utils.decode(current_codepage, this.slice(this.l, this.l + size));
  12584. break;
  12585. }
  12586. /* falls through */
  12587. case 'sbcs-cont': o = ""; loc = this.l;
  12588. for(i = 0; i != size; ++i) {
  12589. if(this.lens && this.lens.indexOf(loc) !== -1) {
  12590. w = __readUInt8(this, loc);
  12591. this.l = loc + 1;
  12592. vv = ReadShift.call(this, size-i, w ? 'dbcs-cont' : 'sbcs-cont');
  12593. return oo.join("") + vv;
  12594. }
  12595. oo.push(_getchar(__readUInt8(this, loc)));
  12596. loc+=1;
  12597. } o = oo.join(""); break;
  12598. default:
  12599. switch(size) {
  12600. case 1: oI = __readUInt8(this, this.l); this.l++; return oI;
  12601. case 2: oI = (t === 'i' ? __readInt16LE : __readUInt16LE)(this, this.l); this.l += 2; return oI;
  12602. case 4: case -4:
  12603. if(t === 'i' || ((this[this.l+3] & 0x80)===0)) { oI = ((size > 0) ? __readInt32LE : __readInt32BE)(this, this.l); this.l += 4; return oI; }
  12604. else { oR = __readUInt32LE(this, this.l); this.l += 4; } return oR;
  12605. case 8: case -8:
  12606. if(t === 'f') {
  12607. if(size == 8) oR = __double(this, this.l);
  12608. else oR = __double([this[this.l+7],this[this.l+6],this[this.l+5],this[this.l+4],this[this.l+3],this[this.l+2],this[this.l+1],this[this.l+0]], 0);
  12609. this.l += 8; return oR;
  12610. } else size = 8;
  12611. /* falls through */
  12612. case 16: o = __hexlify(this, this.l, size); break;
  12613. }}
  12614. this.l+=size; return o;
  12615. }
  12616. var __writeUInt32LE = function(b, val, idx) { b[idx] = (val & 0xFF); b[idx+1] = ((val >>> 8) & 0xFF); b[idx+2] = ((val >>> 16) & 0xFF); b[idx+3] = ((val >>> 24) & 0xFF); };
  12617. var __writeInt32LE = function(b, val, idx) { b[idx] = (val & 0xFF); b[idx+1] = ((val >> 8) & 0xFF); b[idx+2] = ((val >> 16) & 0xFF); b[idx+3] = ((val >> 24) & 0xFF); };
  12618. var __writeUInt16LE = function(b, val, idx) { b[idx] = (val & 0xFF); b[idx+1] = ((val >>> 8) & 0xFF); };
  12619. function WriteShift(t, val, f) {
  12620. var size = 0, i = 0;
  12621. if(f === 'dbcs') {
  12622. for(i = 0; i != val.length; ++i) __writeUInt16LE(this, val.charCodeAt(i), this.l + 2 * i);
  12623. size = 2 * val.length;
  12624. } else if(f === 'sbcs') {
  12625. if(typeof cptable !== 'undefined' && current_ansi == 874) {
  12626. /* TODO: use tables directly, don't encode */
  12627. for(i = 0; i != val.length; ++i) {
  12628. var cppayload = cptable.utils.encode(current_ansi, val.charAt(i));
  12629. this[this.l + i] = cppayload[0];
  12630. }
  12631. } else {
  12632. val = val.replace(/[^\x00-\x7F]/g, "_");
  12633. for(i = 0; i != val.length; ++i) this[this.l + i] = (val.charCodeAt(i) & 0xFF);
  12634. }
  12635. size = val.length;
  12636. } else if(f === 'hex') {
  12637. for(; i < t; ++i) {
  12638. this[this.l++] = (parseInt(val.slice(2*i, 2*i+2), 16)||0);
  12639. } return this;
  12640. } else if(f === 'utf16le') {
  12641. var end = Math.min(this.l + t, this.length);
  12642. for(i = 0; i < Math.min(val.length, t); ++i) {
  12643. var cc = val.charCodeAt(i);
  12644. this[this.l++] = (cc & 0xff);
  12645. this[this.l++] = (cc >> 8);
  12646. }
  12647. while(this.l < end) this[this.l++] = 0;
  12648. return this;
  12649. } else switch(t) {
  12650. case 1: size = 1; this[this.l] = val&0xFF; break;
  12651. case 2: size = 2; this[this.l] = val&0xFF; val >>>= 8; this[this.l+1] = val&0xFF; break;
  12652. case 3: size = 3; this[this.l] = val&0xFF; val >>>= 8; this[this.l+1] = val&0xFF; val >>>= 8; this[this.l+2] = val&0xFF; break;
  12653. case 4: size = 4; __writeUInt32LE(this, val, this.l); break;
  12654. case 8: size = 8; if(f === 'f') { write_double_le(this, val, this.l); break; }
  12655. /* falls through */
  12656. case 16: break;
  12657. case -4: size = 4; __writeInt32LE(this, val, this.l); break;
  12658. }
  12659. this.l += size; return this;
  12660. }
  12661. function CheckField(hexstr, fld) {
  12662. var m = __hexlify(this,this.l,hexstr.length>>1);
  12663. if(m !== hexstr) throw new Error(fld + 'Expected ' + hexstr + ' saw ' + m);
  12664. this.l += hexstr.length>>1;
  12665. }
  12666. function prep_blob(blob, pos) {
  12667. blob.l = pos;
  12668. blob.read_shift = ReadShift;
  12669. blob.chk = CheckField;
  12670. blob.write_shift = WriteShift;
  12671. }
  12672. function parsenoop(blob, length) { blob.l += length; }
  12673. function new_buf(sz) {
  12674. var o = new_raw_buf(sz);
  12675. prep_blob(o, 0);
  12676. return o;
  12677. }
  12678. /* [MS-XLSB] 2.1.4 Record */
  12679. function recordhopper(data, cb, opts) {
  12680. if(!data) return;
  12681. var tmpbyte, cntbyte, length;
  12682. prep_blob(data, data.l || 0);
  12683. var L = data.length, RT = 0, tgt = 0;
  12684. while(data.l < L) {
  12685. RT = data.read_shift(1);
  12686. if(RT & 0x80) RT = (RT & 0x7F) + ((data.read_shift(1) & 0x7F)<<7);
  12687. var R = XLSBRecordEnum[RT] || XLSBRecordEnum[0xFFFF];
  12688. tmpbyte = data.read_shift(1);
  12689. length = tmpbyte & 0x7F;
  12690. for(cntbyte = 1; cntbyte <4 && (tmpbyte & 0x80); ++cntbyte) length += ((tmpbyte = data.read_shift(1)) & 0x7F)<<(7*cntbyte);
  12691. tgt = data.l + length;
  12692. var d = (R.f||parsenoop)(data, length, opts);
  12693. data.l = tgt;
  12694. if(cb(d, R.n, RT)) return;
  12695. }
  12696. }
  12697. /* control buffer usage for fixed-length buffers */
  12698. function buf_array() {
  12699. var bufs = [], blksz = has_buf ? 256 : 2048;
  12700. var newblk = function ba_newblk(sz) {
  12701. var o = (new_buf(sz));
  12702. prep_blob(o, 0);
  12703. return o;
  12704. };
  12705. var curbuf = newblk(blksz);
  12706. var endbuf = function ba_endbuf() {
  12707. if(!curbuf) return;
  12708. if(curbuf.length > curbuf.l) { curbuf = curbuf.slice(0, curbuf.l); curbuf.l = curbuf.length; }
  12709. if(curbuf.length > 0) bufs.push(curbuf);
  12710. curbuf = null;
  12711. };
  12712. var next = function ba_next(sz) {
  12713. if(curbuf && (sz < (curbuf.length - curbuf.l))) return curbuf;
  12714. endbuf();
  12715. return (curbuf = newblk(Math.max(sz+1, blksz)));
  12716. };
  12717. var end = function ba_end() {
  12718. endbuf();
  12719. return __toBuffer([bufs]);
  12720. };
  12721. var push = function ba_push(buf) { endbuf(); curbuf = buf; if(curbuf.l == null) curbuf.l = curbuf.length; next(blksz); };
  12722. return ({ next:next, push:push, end:end, _bufs:bufs });
  12723. }
  12724. function write_record(ba, type, payload, length) {
  12725. var t = +XLSBRE[type], l;
  12726. if(isNaN(t)) return; // TODO: throw something here?
  12727. if(!length) length = XLSBRecordEnum[t].p || (payload||[]).length || 0;
  12728. l = 1 + (t >= 0x80 ? 1 : 0) + 1/* + length*/;
  12729. if(length >= 0x80) ++l; if(length >= 0x4000) ++l; if(length >= 0x200000) ++l;
  12730. var o = ba.next(l);
  12731. if(t <= 0x7F) o.write_shift(1, t);
  12732. else {
  12733. o.write_shift(1, (t & 0x7F) + 0x80);
  12734. o.write_shift(1, (t >> 7));
  12735. }
  12736. for(var i = 0; i != 4; ++i) {
  12737. if(length >= 0x80) { o.write_shift(1, (length & 0x7F)+0x80); length >>= 7; }
  12738. else { o.write_shift(1, length); break; }
  12739. }
  12740. if(length > 0 && is_buf(payload)) ba.push(payload);
  12741. }
  12742. /* XLS ranges enforced */
  12743. function shift_cell_xls(cell, tgt, opts) {
  12744. var out = dup(cell);
  12745. if(tgt.s) {
  12746. if(out.cRel) out.c += tgt.s.c;
  12747. if(out.rRel) out.r += tgt.s.r;
  12748. } else {
  12749. if(out.cRel) out.c += tgt.c;
  12750. if(out.rRel) out.r += tgt.r;
  12751. }
  12752. if(!opts || opts.biff < 12) {
  12753. while(out.c >= 0x100) out.c -= 0x100;
  12754. while(out.r >= 0x10000) out.r -= 0x10000;
  12755. }
  12756. return out;
  12757. }
  12758. function shift_range_xls(cell, range, opts) {
  12759. var out = dup(cell);
  12760. out.s = shift_cell_xls(out.s, range.s, opts);
  12761. out.e = shift_cell_xls(out.e, range.s, opts);
  12762. return out;
  12763. }
  12764. function encode_cell_xls(c, biff) {
  12765. if(c.cRel && c.c < 0) { c = dup(c); while(c.c < 0) c.c += (biff > 8) ? 0x4000 : 0x100; }
  12766. if(c.rRel && c.r < 0) { c = dup(c); while(c.r < 0) c.r += (biff > 8) ? 0x100000 : ((biff > 5) ? 0x10000 : 0x4000); }
  12767. var s = encode_cell(c);
  12768. if(!c.cRel && c.cRel != null) s = fix_col(s);
  12769. if(!c.rRel && c.rRel != null) s = fix_row(s);
  12770. return s;
  12771. }
  12772. function encode_range_xls(r, opts) {
  12773. if(r.s.r == 0 && !r.s.rRel) {
  12774. if(r.e.r == (opts.biff >= 12 ? 0xFFFFF : (opts.biff >= 8 ? 0x10000 : 0x4000)) && !r.e.rRel) {
  12775. return (r.s.cRel ? "" : "$") + encode_col(r.s.c) + ":" + (r.e.cRel ? "" : "$") + encode_col(r.e.c);
  12776. }
  12777. }
  12778. if(r.s.c == 0 && !r.s.cRel) {
  12779. if(r.e.c == (opts.biff >= 12 ? 0x3FFF : 0xFF) && !r.e.cRel) {
  12780. return (r.s.rRel ? "" : "$") + encode_row(r.s.r) + ":" + (r.e.rRel ? "" : "$") + encode_row(r.e.r);
  12781. }
  12782. }
  12783. return encode_cell_xls(r.s, opts.biff) + ":" + encode_cell_xls(r.e, opts.biff);
  12784. }
  12785. var OFFCRYPTO = {};
  12786. var make_offcrypto = function(O, _crypto) {
  12787. var crypto;
  12788. if(typeof _crypto !== 'undefined') crypto = _crypto;
  12789. else if(true) {
  12790. try { crypto = __webpack_require__(/*! crypto */ "?e708"); }
  12791. catch(e) { crypto = null; }
  12792. }
  12793. O.rc4 = function(key, data) {
  12794. var S = new Array(256);
  12795. var c = 0, i = 0, j = 0, t = 0;
  12796. for(i = 0; i != 256; ++i) S[i] = i;
  12797. for(i = 0; i != 256; ++i) {
  12798. j = (j + S[i] + (key[i%key.length]).charCodeAt(0))&255;
  12799. t = S[i]; S[i] = S[j]; S[j] = t;
  12800. }
  12801. // $FlowIgnore
  12802. i = j = 0; var out = new_raw_buf(data.length);
  12803. for(c = 0; c != data.length; ++c) {
  12804. i = (i + 1)&255;
  12805. j = (j + S[i])%256;
  12806. t = S[i]; S[i] = S[j]; S[j] = t;
  12807. out[c] = (data[c] ^ S[(S[i]+S[j])&255]);
  12808. }
  12809. return out;
  12810. };
  12811. O.md5 = function(hex) {
  12812. if(!crypto) throw new Error("Unsupported crypto");
  12813. return crypto.createHash('md5').update(hex).digest('hex');
  12814. };
  12815. };
  12816. /*global crypto:true */
  12817. make_offcrypto(OFFCRYPTO, typeof crypto !== "undefined" ? crypto : undefined);
  12818. function decode_row(rowstr) { return parseInt(unfix_row(rowstr),10) - 1; }
  12819. function encode_row(row) { return "" + (row + 1); }
  12820. function fix_row(cstr) { return cstr.replace(/([A-Z]|^)(\d+)$/,"$1$$$2"); }
  12821. function unfix_row(cstr) { return cstr.replace(/\$(\d+)$/,"$1"); }
  12822. function decode_col(colstr) { var c = unfix_col(colstr), d = 0, i = 0; for(; i !== c.length; ++i) d = 26*d + c.charCodeAt(i) - 64; return d - 1; }
  12823. function encode_col(col) { if(col < 0) throw new Error("invalid column " + col); var s=""; for(++col; col; col=Math.floor((col-1)/26)) s = String.fromCharCode(((col-1)%26) + 65) + s; return s; }
  12824. function fix_col(cstr) { return cstr.replace(/^([A-Z])/,"$$$1"); }
  12825. function unfix_col(cstr) { return cstr.replace(/^\$([A-Z])/,"$1"); }
  12826. function split_cell(cstr) { return cstr.replace(/(\$?[A-Z]*)(\$?\d*)/,"$1,$2").split(","); }
  12827. //function decode_cell(cstr) { var splt = split_cell(cstr); return { c:decode_col(splt[0]), r:decode_row(splt[1]) }; }
  12828. function decode_cell(cstr) {
  12829. var R = 0, C = 0;
  12830. for(var i = 0; i < cstr.length; ++i) {
  12831. var cc = cstr.charCodeAt(i);
  12832. if(cc >= 48 && cc <= 57) R = 10 * R + (cc - 48);
  12833. else if(cc >= 65 && cc <= 90) C = 26 * C + (cc - 64);
  12834. }
  12835. return { c: C - 1, r:R - 1 };
  12836. }
  12837. //function encode_cell(cell) { return encode_col(cell.c) + encode_row(cell.r); }
  12838. function encode_cell(cell) {
  12839. var col = cell.c + 1;
  12840. var s="";
  12841. for(; col; col=((col-1)/26)|0) s = String.fromCharCode(((col-1)%26) + 65) + s;
  12842. return s + (cell.r + 1);
  12843. }
  12844. function decode_range(range) {
  12845. var idx = range.indexOf(":");
  12846. if(idx == -1) return { s: decode_cell(range), e: decode_cell(range) };
  12847. return { s: decode_cell(range.slice(0, idx)), e: decode_cell(range.slice(idx + 1)) };
  12848. }
  12849. function encode_range(cs,ce) {
  12850. if(typeof ce === 'undefined' || typeof ce === 'number') {
  12851. return encode_range(cs.s, cs.e);
  12852. }
  12853. if(typeof cs !== 'string') cs = encode_cell((cs));
  12854. if(typeof ce !== 'string') ce = encode_cell((ce));
  12855. return cs == ce ? cs : cs + ":" + ce;
  12856. }
  12857. function safe_decode_range(range) {
  12858. var o = {s:{c:0,r:0},e:{c:0,r:0}};
  12859. var idx = 0, i = 0, cc = 0;
  12860. var len = range.length;
  12861. for(idx = 0; i < len; ++i) {
  12862. if((cc=range.charCodeAt(i)-64) < 1 || cc > 26) break;
  12863. idx = 26*idx + cc;
  12864. }
  12865. o.s.c = --idx;
  12866. for(idx = 0; i < len; ++i) {
  12867. if((cc=range.charCodeAt(i)-48) < 0 || cc > 9) break;
  12868. idx = 10*idx + cc;
  12869. }
  12870. o.s.r = --idx;
  12871. if(i === len || range.charCodeAt(++i) === 58) { o.e.c=o.s.c; o.e.r=o.s.r; return o; }
  12872. for(idx = 0; i != len; ++i) {
  12873. if((cc=range.charCodeAt(i)-64) < 1 || cc > 26) break;
  12874. idx = 26*idx + cc;
  12875. }
  12876. o.e.c = --idx;
  12877. for(idx = 0; i != len; ++i) {
  12878. if((cc=range.charCodeAt(i)-48) < 0 || cc > 9) break;
  12879. idx = 10*idx + cc;
  12880. }
  12881. o.e.r = --idx;
  12882. return o;
  12883. }
  12884. function safe_format_cell(cell, v) {
  12885. var q = (cell.t == 'd' && v instanceof Date);
  12886. if(cell.z != null) try { return (cell.w = SSF.format(cell.z, q ? datenum(v) : v)); } catch(e) { }
  12887. try { return (cell.w = SSF.format((cell.XF||{}).numFmtId||(q ? 14 : 0), q ? datenum(v) : v)); } catch(e) { return ''+v; }
  12888. }
  12889. function format_cell(cell, v, o) {
  12890. if(cell == null || cell.t == null || cell.t == 'z') return "";
  12891. if(cell.w !== undefined) return cell.w;
  12892. if(cell.t == 'd' && !cell.z && o && o.dateNF) cell.z = o.dateNF;
  12893. if(v == undefined) return safe_format_cell(cell, cell.v);
  12894. return safe_format_cell(cell, v);
  12895. }
  12896. function sheet_to_workbook(sheet, opts) {
  12897. var n = opts && opts.sheet ? opts.sheet : "Sheet1";
  12898. var sheets = {}; sheets[n] = sheet;
  12899. return { SheetNames: [n], Sheets: sheets };
  12900. }
  12901. function sheet_add_aoa(_ws, data, opts) {
  12902. var o = opts || {};
  12903. var dense = _ws ? Array.isArray(_ws) : o.dense;
  12904. if(DENSE != null && dense == null) dense = DENSE;
  12905. var ws = _ws || (dense ? ([]) : ({}));
  12906. var _R = 0, _C = 0;
  12907. if(ws && o.origin != null) {
  12908. if(typeof o.origin == 'number') _R = o.origin;
  12909. else {
  12910. var _origin = typeof o.origin == "string" ? decode_cell(o.origin) : o.origin;
  12911. _R = _origin.r; _C = _origin.c;
  12912. }
  12913. if(!ws["!ref"]) ws["!ref"] = "A1:A1";
  12914. }
  12915. var range = ({s: {c:10000000, r:10000000}, e: {c:0, r:0}});
  12916. if(ws['!ref']) {
  12917. var _range = safe_decode_range(ws['!ref']);
  12918. range.s.c = _range.s.c;
  12919. range.s.r = _range.s.r;
  12920. range.e.c = Math.max(range.e.c, _range.e.c);
  12921. range.e.r = Math.max(range.e.r, _range.e.r);
  12922. if(_R == -1) range.e.r = _R = _range.e.r + 1;
  12923. }
  12924. for(var R = 0; R != data.length; ++R) {
  12925. if(!data[R]) continue;
  12926. if(!Array.isArray(data[R])) throw new Error("aoa_to_sheet expects an array of arrays");
  12927. for(var C = 0; C != data[R].length; ++C) {
  12928. if(typeof data[R][C] === 'undefined') continue;
  12929. var cell = ({v: data[R][C] });
  12930. var __R = _R + R, __C = _C + C;
  12931. if(range.s.r > __R) range.s.r = __R;
  12932. if(range.s.c > __C) range.s.c = __C;
  12933. if(range.e.r < __R) range.e.r = __R;
  12934. if(range.e.c < __C) range.e.c = __C;
  12935. if(data[R][C] && typeof data[R][C] === 'object' && !Array.isArray(data[R][C]) && !(data[R][C] instanceof Date)) cell = data[R][C];
  12936. else {
  12937. if(Array.isArray(cell.v)) { cell.f = data[R][C][1]; cell.v = cell.v[0]; }
  12938. if(cell.v === null) { if(cell.f) cell.t = 'n'; else if(!o.sheetStubs) continue; else cell.t = 'z'; }
  12939. else if(typeof cell.v === 'number') cell.t = 'n';
  12940. else if(typeof cell.v === 'boolean') cell.t = 'b';
  12941. else if(cell.v instanceof Date) {
  12942. cell.z = o.dateNF || SSF._table[14];
  12943. if(o.cellDates) { cell.t = 'd'; cell.w = SSF.format(cell.z, datenum(cell.v)); }
  12944. else { cell.t = 'n'; cell.v = datenum(cell.v); cell.w = SSF.format(cell.z, cell.v); }
  12945. }
  12946. else cell.t = 's';
  12947. }
  12948. if(dense) {
  12949. if(!ws[__R]) ws[__R] = [];
  12950. if(ws[__R][__C] && ws[__R][__C].z) cell.z = ws[__R][__C].z;
  12951. ws[__R][__C] = cell;
  12952. } else {
  12953. var cell_ref = encode_cell(({c:__C,r:__R}));
  12954. if(ws[cell_ref] && ws[cell_ref].z) cell.z = ws[cell_ref].z;
  12955. ws[cell_ref] = cell;
  12956. }
  12957. }
  12958. }
  12959. if(range.s.c < 10000000) ws['!ref'] = encode_range(range);
  12960. return ws;
  12961. }
  12962. function aoa_to_sheet(data, opts) { return sheet_add_aoa(null, data, opts); }
  12963. function write_UInt32LE(x, o) {
  12964. if (!o) o = new_buf(4);
  12965. o.write_shift(4, x);
  12966. return o;
  12967. }
  12968. /* [MS-XLSB] 2.5.168 */
  12969. function parse_XLWideString(data) {
  12970. var cchCharacters = data.read_shift(4);
  12971. return cchCharacters === 0 ? "" : data.read_shift(cchCharacters, 'dbcs');
  12972. }
  12973. function write_XLWideString(data, o) {
  12974. var _null = false; if (o == null) { _null = true; o = new_buf(4 + 2 * data.length); }
  12975. o.write_shift(4, data.length);
  12976. if (data.length > 0) o.write_shift(0, data, 'dbcs');
  12977. return _null ? o.slice(0, o.l) : o;
  12978. }
  12979. /* [MS-XLSB] 2.5.91 */
  12980. //function parse_LPWideString(data) {
  12981. // var cchCharacters = data.read_shift(2);
  12982. // return cchCharacters === 0 ? "" : data.read_shift(cchCharacters, "utf16le");
  12983. //}
  12984. /* [MS-XLSB] 2.5.143 */
  12985. function parse_StrRun(data) {
  12986. return { ich: data.read_shift(2), ifnt: data.read_shift(2) };
  12987. }
  12988. function write_StrRun(run, o) {
  12989. if (!o) o = new_buf(4);
  12990. o.write_shift(2, run.ich || 0);
  12991. o.write_shift(2, run.ifnt || 0);
  12992. return o;
  12993. }
  12994. /* [MS-XLSB] 2.5.121 */
  12995. function parse_RichStr(data, length) {
  12996. var start = data.l;
  12997. var flags = data.read_shift(1);
  12998. var str = parse_XLWideString(data);
  12999. var rgsStrRun = [];
  13000. var z = ({ t: str, h: str });
  13001. if ((flags & 1) !== 0) { /* fRichStr */
  13002. /* TODO: formatted string */
  13003. var dwSizeStrRun = data.read_shift(4);
  13004. for (var i = 0; i != dwSizeStrRun; ++i) rgsStrRun.push(parse_StrRun(data));
  13005. z.r = rgsStrRun;
  13006. }
  13007. else z.r = [{ ich: 0, ifnt: 0 }];
  13008. //if((flags & 2) !== 0) { /* fExtStr */
  13009. // /* TODO: phonetic string */
  13010. //}
  13011. data.l = start + length;
  13012. return z;
  13013. }
  13014. function write_RichStr(str, o) {
  13015. /* TODO: formatted string */
  13016. var _null = false; if (o == null) { _null = true; o = new_buf(15 + 4 * str.t.length); }
  13017. o.write_shift(1, 0);
  13018. write_XLWideString(str.t, o);
  13019. return _null ? o.slice(0, o.l) : o;
  13020. }
  13021. /* [MS-XLSB] 2.4.328 BrtCommentText (RichStr w/1 run) */
  13022. var parse_BrtCommentText = parse_RichStr;
  13023. function write_BrtCommentText(str, o) {
  13024. /* TODO: formatted string */
  13025. var _null = false; if (o == null) { _null = true; o = new_buf(23 + 4 * str.t.length); }
  13026. o.write_shift(1, 1);
  13027. write_XLWideString(str.t, o);
  13028. o.write_shift(4, 1);
  13029. write_StrRun({ ich: 0, ifnt: 0 }, o);
  13030. return _null ? o.slice(0, o.l) : o;
  13031. }
  13032. /* [MS-XLSB] 2.5.9 */
  13033. function parse_XLSBCell(data) {
  13034. var col = data.read_shift(4);
  13035. var iStyleRef = data.read_shift(2);
  13036. iStyleRef += data.read_shift(1) << 16;
  13037. data.l++; //var fPhShow = data.read_shift(1);
  13038. return { c: col, iStyleRef: iStyleRef };
  13039. }
  13040. function write_XLSBCell(cell, o) {
  13041. if (o == null) o = new_buf(8);
  13042. o.write_shift(-4, cell.c);
  13043. o.write_shift(3, cell.iStyleRef || cell.s);
  13044. o.write_shift(1, 0); /* fPhShow */
  13045. return o;
  13046. }
  13047. /* Short XLSB Cell does not include column */
  13048. function parse_XLSBShortCell(data) {
  13049. var iStyleRef = data.read_shift(2);
  13050. iStyleRef += data.read_shift(1) <<16;
  13051. data.l++; //var fPhShow = data.read_shift(1);
  13052. return { c:-1, iStyleRef: iStyleRef };
  13053. }
  13054. function write_XLSBShortCell(cell, o) {
  13055. if(o == null) o = new_buf(4);
  13056. o.write_shift(3, cell.iStyleRef || cell.s);
  13057. o.write_shift(1, 0); /* fPhShow */
  13058. return o;
  13059. }
  13060. /* [MS-XLSB] 2.5.21 */
  13061. var parse_XLSBCodeName = parse_XLWideString;
  13062. var write_XLSBCodeName = write_XLWideString;
  13063. /* [MS-XLSB] 2.5.166 */
  13064. function parse_XLNullableWideString(data) {
  13065. var cchCharacters = data.read_shift(4);
  13066. return cchCharacters === 0 || cchCharacters === 0xFFFFFFFF ? "" : data.read_shift(cchCharacters, 'dbcs');
  13067. }
  13068. function write_XLNullableWideString(data, o) {
  13069. var _null = false; if (o == null) { _null = true; o = new_buf(127); }
  13070. o.write_shift(4, data.length > 0 ? data.length : 0xFFFFFFFF);
  13071. if (data.length > 0) o.write_shift(0, data, 'dbcs');
  13072. return _null ? o.slice(0, o.l) : o;
  13073. }
  13074. /* [MS-XLSB] 2.5.165 */
  13075. var parse_XLNameWideString = parse_XLWideString;
  13076. //var write_XLNameWideString = write_XLWideString;
  13077. /* [MS-XLSB] 2.5.114 */
  13078. var parse_RelID = parse_XLNullableWideString;
  13079. var write_RelID = write_XLNullableWideString;
  13080. /* [MS-XLS] 2.5.217 ; [MS-XLSB] 2.5.122 */
  13081. function parse_RkNumber(data) {
  13082. var b = data.slice(data.l, data.l + 4);
  13083. var fX100 = (b[0] & 1), fInt = (b[0] & 2);
  13084. data.l += 4;
  13085. b[0] &= 0xFC; // b[0] &= ~3;
  13086. var RK = fInt === 0 ? __double([0, 0, 0, 0, b[0], b[1], b[2], b[3]], 0) : __readInt32LE(b, 0) >> 2;
  13087. return fX100 ? (RK / 100) : RK;
  13088. }
  13089. function write_RkNumber(data, o) {
  13090. if (o == null) o = new_buf(4);
  13091. var fX100 = 0, fInt = 0, d100 = data * 100;
  13092. if ((data == (data | 0)) && (data >= -(1 << 29)) && (data < (1 << 29))) { fInt = 1; }
  13093. else if ((d100 == (d100 | 0)) && (d100 >= -(1 << 29)) && (d100 < (1 << 29))) { fInt = 1; fX100 = 1; }
  13094. if (fInt) o.write_shift(-4, ((fX100 ? d100 : data) << 2) + (fX100 + 2));
  13095. else throw new Error("unsupported RkNumber " + data); // TODO
  13096. }
  13097. /* [MS-XLSB] 2.5.117 RfX */
  13098. function parse_RfX(data ) {
  13099. var cell = ({ s: {}, e: {} });
  13100. cell.s.r = data.read_shift(4);
  13101. cell.e.r = data.read_shift(4);
  13102. cell.s.c = data.read_shift(4);
  13103. cell.e.c = data.read_shift(4);
  13104. return cell;
  13105. }
  13106. function write_RfX(r, o) {
  13107. if (!o) o = new_buf(16);
  13108. o.write_shift(4, r.s.r);
  13109. o.write_shift(4, r.e.r);
  13110. o.write_shift(4, r.s.c);
  13111. o.write_shift(4, r.e.c);
  13112. return o;
  13113. }
  13114. /* [MS-XLSB] 2.5.153 UncheckedRfX */
  13115. var parse_UncheckedRfX = parse_RfX;
  13116. var write_UncheckedRfX = write_RfX;
  13117. /* [MS-XLSB] 2.5.155 UncheckedSqRfX */
  13118. //function parse_UncheckedSqRfX(data) {
  13119. // var cnt = data.read_shift(4);
  13120. // var out = [];
  13121. // for(var i = 0; i < cnt; ++i) {
  13122. // var rng = parse_UncheckedRfX(data);
  13123. // out.push(encode_range(rng));
  13124. // }
  13125. // return out.join(",");
  13126. //}
  13127. //function write_UncheckedSqRfX(sqrfx) {
  13128. // var parts = sqrfx.split(/\s*,\s*/);
  13129. // var o = new_buf(4); o.write_shift(4, parts.length);
  13130. // var out = [o];
  13131. // parts.forEach(function(rng) {
  13132. // out.push(write_UncheckedRfX(safe_decode_range(rng)));
  13133. // });
  13134. // return bconcat(out);
  13135. //}
  13136. /* [MS-XLS] 2.5.342 ; [MS-XLSB] 2.5.171 */
  13137. /* TODO: error checking, NaN and Infinity values are not valid Xnum */
  13138. function parse_Xnum(data) {
  13139. if(data.length - data.l < 8) throw "XLS Xnum Buffer underflow";
  13140. return data.read_shift(8, 'f');
  13141. }
  13142. function write_Xnum(data, o) { return (o || new_buf(8)).write_shift(8, data, 'f'); }
  13143. /* [MS-XLSB] 2.4.324 BrtColor */
  13144. function parse_BrtColor(data) {
  13145. var out = {};
  13146. var d = data.read_shift(1);
  13147. //var fValidRGB = d & 1;
  13148. var xColorType = d >>> 1;
  13149. var index = data.read_shift(1);
  13150. var nTS = data.read_shift(2, 'i');
  13151. var bR = data.read_shift(1);
  13152. var bG = data.read_shift(1);
  13153. var bB = data.read_shift(1);
  13154. data.l++; //var bAlpha = data.read_shift(1);
  13155. switch (xColorType) {
  13156. case 0: out.auto = 1; break;
  13157. case 1:
  13158. out.index = index;
  13159. var icv = XLSIcv[index];
  13160. /* automatic pseudo index 81 */
  13161. if (icv) out.rgb = rgb2Hex(icv);
  13162. break;
  13163. case 2:
  13164. /* if(!fValidRGB) throw new Error("invalid"); */
  13165. out.rgb = rgb2Hex([bR, bG, bB]);
  13166. break;
  13167. case 3: out.theme = index; break;
  13168. }
  13169. if (nTS != 0) out.tint = nTS > 0 ? nTS / 32767 : nTS / 32768;
  13170. return out;
  13171. }
  13172. function write_BrtColor(color, o) {
  13173. if (!o) o = new_buf(8);
  13174. if (!color || color.auto) { o.write_shift(4, 0); o.write_shift(4, 0); return o; }
  13175. if (color.index != null) {
  13176. o.write_shift(1, 0x02);
  13177. o.write_shift(1, color.index);
  13178. } else if (color.theme != null) {
  13179. o.write_shift(1, 0x06);
  13180. o.write_shift(1, color.theme);
  13181. } else {
  13182. o.write_shift(1, 0x05);
  13183. o.write_shift(1, 0);
  13184. }
  13185. var nTS = color.tint || 0;
  13186. if (nTS > 0) nTS *= 32767;
  13187. else if (nTS < 0) nTS *= 32768;
  13188. o.write_shift(2, nTS);
  13189. if (!color.rgb || color.theme != null) {
  13190. o.write_shift(2, 0);
  13191. o.write_shift(1, 0);
  13192. o.write_shift(1, 0);
  13193. } else {
  13194. var rgb = (color.rgb || 'FFFFFF');
  13195. if (typeof rgb == 'number') rgb = ("000000" + rgb.toString(16)).slice(-6);
  13196. o.write_shift(1, parseInt(rgb.slice(0, 2), 16));
  13197. o.write_shift(1, parseInt(rgb.slice(2, 4), 16));
  13198. o.write_shift(1, parseInt(rgb.slice(4, 6), 16));
  13199. o.write_shift(1, 0xFF);
  13200. }
  13201. return o;
  13202. }
  13203. /* [MS-XLSB] 2.5.52 */
  13204. function parse_FontFlags(data) {
  13205. var d = data.read_shift(1);
  13206. data.l++;
  13207. var out = {
  13208. fBold: d & 0x01,
  13209. fItalic: d & 0x02,
  13210. fUnderline: d & 0x04,
  13211. fStrikeout: d & 0x08,
  13212. fOutline: d & 0x10,
  13213. fShadow: d & 0x20,
  13214. fCondense: d & 0x40,
  13215. fExtend: d & 0x80
  13216. };
  13217. return out;
  13218. }
  13219. function write_FontFlags(font, o) {
  13220. if (!o) o = new_buf(2);
  13221. var grbit =
  13222. (font.italic ? 0x02 : 0) |
  13223. (font.strike ? 0x08 : 0) |
  13224. (font.outline ? 0x10 : 0) |
  13225. (font.shadow ? 0x20 : 0) |
  13226. (font.condense ? 0x40 : 0) |
  13227. (font.extend ? 0x80 : 0);
  13228. o.write_shift(1, grbit);
  13229. o.write_shift(1, 0);
  13230. return o;
  13231. }
  13232. /* [MS-OLEDS] 2.3.1 and 2.3.2 */
  13233. function parse_ClipboardFormatOrString(o, w) {
  13234. // $FlowIgnore
  13235. var ClipFmt = { 2: "BITMAP", 3: "METAFILEPICT", 8: "DIB", 14: "ENHMETAFILE" };
  13236. var m = o.read_shift(4);
  13237. switch (m) {
  13238. case 0x00000000: return "";
  13239. case 0xffffffff: case 0xfffffffe: return ClipFmt[o.read_shift(4)] || "";
  13240. }
  13241. if (m > 0x190) throw new Error("Unsupported Clipboard: " + m.toString(16));
  13242. o.l -= 4;
  13243. return o.read_shift(0, w == 1 ? "lpstr" : "lpwstr");
  13244. }
  13245. function parse_ClipboardFormatOrAnsiString(o) { return parse_ClipboardFormatOrString(o, 1); }
  13246. function parse_ClipboardFormatOrUnicodeString(o) { return parse_ClipboardFormatOrString(o, 2); }
  13247. /* [MS-OLEPS] 2.2 PropertyType */
  13248. //var VT_EMPTY = 0x0000;
  13249. //var VT_NULL = 0x0001;
  13250. var VT_I2 = 0x0002;
  13251. var VT_I4 = 0x0003;
  13252. //var VT_R4 = 0x0004;
  13253. //var VT_R8 = 0x0005;
  13254. //var VT_CY = 0x0006;
  13255. //var VT_DATE = 0x0007;
  13256. //var VT_BSTR = 0x0008;
  13257. //var VT_ERROR = 0x000A;
  13258. var VT_BOOL = 0x000B;
  13259. var VT_VARIANT = 0x000C;
  13260. //var VT_DECIMAL = 0x000E;
  13261. //var VT_I1 = 0x0010;
  13262. //var VT_UI1 = 0x0011;
  13263. //var VT_UI2 = 0x0012;
  13264. var VT_UI4 = 0x0013;
  13265. //var VT_I8 = 0x0014;
  13266. //var VT_UI8 = 0x0015;
  13267. //var VT_INT = 0x0016;
  13268. //var VT_UINT = 0x0017;
  13269. var VT_LPSTR = 0x001E;
  13270. //var VT_LPWSTR = 0x001F;
  13271. var VT_FILETIME = 0x0040;
  13272. var VT_BLOB = 0x0041;
  13273. //var VT_STREAM = 0x0042;
  13274. //var VT_STORAGE = 0x0043;
  13275. //var VT_STREAMED_Object = 0x0044;
  13276. //var VT_STORED_Object = 0x0045;
  13277. //var VT_BLOB_Object = 0x0046;
  13278. var VT_CF = 0x0047;
  13279. //var VT_CLSID = 0x0048;
  13280. //var VT_VERSIONED_STREAM = 0x0049;
  13281. var VT_VECTOR = 0x1000;
  13282. //var VT_ARRAY = 0x2000;
  13283. var VT_STRING = 0x0050; // 2.3.3.1.11 VtString
  13284. var VT_USTR = 0x0051; // 2.3.3.1.12 VtUnalignedString
  13285. var VT_CUSTOM = [VT_STRING, VT_USTR];
  13286. /* [MS-OSHARED] 2.3.3.2.2.1 Document Summary Information PIDDSI */
  13287. var DocSummaryPIDDSI = {
  13288. 0x01: { n: 'CodePage', t: VT_I2 },
  13289. 0x02: { n: 'Category', t: VT_STRING },
  13290. 0x03: { n: 'PresentationFormat', t: VT_STRING },
  13291. 0x04: { n: 'ByteCount', t: VT_I4 },
  13292. 0x05: { n: 'LineCount', t: VT_I4 },
  13293. 0x06: { n: 'ParagraphCount', t: VT_I4 },
  13294. 0x07: { n: 'SlideCount', t: VT_I4 },
  13295. 0x08: { n: 'NoteCount', t: VT_I4 },
  13296. 0x09: { n: 'HiddenCount', t: VT_I4 },
  13297. 0x0a: { n: 'MultimediaClipCount', t: VT_I4 },
  13298. 0x0b: { n: 'ScaleCrop', t: VT_BOOL },
  13299. 0x0c: { n: 'HeadingPairs', t: VT_VECTOR | VT_VARIANT },
  13300. 0x0d: { n: 'TitlesOfParts', t: VT_VECTOR | VT_LPSTR },
  13301. 0x0e: { n: 'Manager', t: VT_STRING },
  13302. 0x0f: { n: 'Company', t: VT_STRING },
  13303. 0x10: { n: 'LinksUpToDate', t: VT_BOOL },
  13304. 0x11: { n: 'CharacterCount', t: VT_I4 },
  13305. 0x13: { n: 'SharedDoc', t: VT_BOOL },
  13306. 0x16: { n: 'HyperlinksChanged', t: VT_BOOL },
  13307. 0x17: { n: 'AppVersion', t: VT_I4, p: 'version' },
  13308. 0x18: { n: 'DigSig', t: VT_BLOB },
  13309. 0x1A: { n: 'ContentType', t: VT_STRING },
  13310. 0x1B: { n: 'ContentStatus', t: VT_STRING },
  13311. 0x1C: { n: 'Language', t: VT_STRING },
  13312. 0x1D: { n: 'Version', t: VT_STRING },
  13313. 0xFF: {}
  13314. };
  13315. /* [MS-OSHARED] 2.3.3.2.1.1 Summary Information Property Set PIDSI */
  13316. var SummaryPIDSI = {
  13317. 0x01: { n: 'CodePage', t: VT_I2 },
  13318. 0x02: { n: 'Title', t: VT_STRING },
  13319. 0x03: { n: 'Subject', t: VT_STRING },
  13320. 0x04: { n: 'Author', t: VT_STRING },
  13321. 0x05: { n: 'Keywords', t: VT_STRING },
  13322. 0x06: { n: 'Comments', t: VT_STRING },
  13323. 0x07: { n: 'Template', t: VT_STRING },
  13324. 0x08: { n: 'LastAuthor', t: VT_STRING },
  13325. 0x09: { n: 'RevNumber', t: VT_STRING },
  13326. 0x0A: { n: 'EditTime', t: VT_FILETIME },
  13327. 0x0B: { n: 'LastPrinted', t: VT_FILETIME },
  13328. 0x0C: { n: 'CreatedDate', t: VT_FILETIME },
  13329. 0x0D: { n: 'ModifiedDate', t: VT_FILETIME },
  13330. 0x0E: { n: 'PageCount', t: VT_I4 },
  13331. 0x0F: { n: 'WordCount', t: VT_I4 },
  13332. 0x10: { n: 'CharCount', t: VT_I4 },
  13333. 0x11: { n: 'Thumbnail', t: VT_CF },
  13334. 0x12: { n: 'Application', t: VT_STRING },
  13335. 0x13: { n: 'DocSecurity', t: VT_I4 },
  13336. 0xFF: {}
  13337. };
  13338. /* [MS-OLEPS] 2.18 */
  13339. var SpecialProperties = {
  13340. 0x80000000: { n: 'Locale', t: VT_UI4 },
  13341. 0x80000003: { n: 'Behavior', t: VT_UI4 },
  13342. 0x72627262: {}
  13343. };
  13344. (function() {
  13345. for(var y in SpecialProperties) if(Object.prototype.hasOwnProperty.call(SpecialProperties, y))
  13346. DocSummaryPIDDSI[y] = SummaryPIDSI[y] = SpecialProperties[y];
  13347. })();
  13348. var DocSummaryRE = evert_key(DocSummaryPIDDSI, "n");
  13349. var SummaryRE = evert_key(SummaryPIDSI, "n");
  13350. /* [MS-XLS] 2.4.63 Country/Region codes */
  13351. var CountryEnum = {
  13352. 0x0001: "US", // United States
  13353. 0x0002: "CA", // Canada
  13354. 0x0003: "", // Latin America (except Brazil)
  13355. 0x0007: "RU", // Russia
  13356. 0x0014: "EG", // Egypt
  13357. 0x001E: "GR", // Greece
  13358. 0x001F: "NL", // Netherlands
  13359. 0x0020: "BE", // Belgium
  13360. 0x0021: "FR", // France
  13361. 0x0022: "ES", // Spain
  13362. 0x0024: "HU", // Hungary
  13363. 0x0027: "IT", // Italy
  13364. 0x0029: "CH", // Switzerland
  13365. 0x002B: "AT", // Austria
  13366. 0x002C: "GB", // United Kingdom
  13367. 0x002D: "DK", // Denmark
  13368. 0x002E: "SE", // Sweden
  13369. 0x002F: "NO", // Norway
  13370. 0x0030: "PL", // Poland
  13371. 0x0031: "DE", // Germany
  13372. 0x0034: "MX", // Mexico
  13373. 0x0037: "BR", // Brazil
  13374. 0x003d: "AU", // Australia
  13375. 0x0040: "NZ", // New Zealand
  13376. 0x0042: "TH", // Thailand
  13377. 0x0051: "JP", // Japan
  13378. 0x0052: "KR", // Korea
  13379. 0x0054: "VN", // Viet Nam
  13380. 0x0056: "CN", // China
  13381. 0x005A: "TR", // Turkey
  13382. 0x0069: "JS", // Ramastan
  13383. 0x00D5: "DZ", // Algeria
  13384. 0x00D8: "MA", // Morocco
  13385. 0x00DA: "LY", // Libya
  13386. 0x015F: "PT", // Portugal
  13387. 0x0162: "IS", // Iceland
  13388. 0x0166: "FI", // Finland
  13389. 0x01A4: "CZ", // Czech Republic
  13390. 0x0376: "TW", // Taiwan
  13391. 0x03C1: "LB", // Lebanon
  13392. 0x03C2: "JO", // Jordan
  13393. 0x03C3: "SY", // Syria
  13394. 0x03C4: "IQ", // Iraq
  13395. 0x03C5: "KW", // Kuwait
  13396. 0x03C6: "SA", // Saudi Arabia
  13397. 0x03CB: "AE", // United Arab Emirates
  13398. 0x03CC: "IL", // Israel
  13399. 0x03CE: "QA", // Qatar
  13400. 0x03D5: "IR", // Iran
  13401. 0xFFFF: "US" // United States
  13402. };
  13403. /* [MS-XLS] 2.5.127 */
  13404. var XLSFillPattern = [
  13405. null,
  13406. 'solid',
  13407. 'mediumGray',
  13408. 'darkGray',
  13409. 'lightGray',
  13410. 'darkHorizontal',
  13411. 'darkVertical',
  13412. 'darkDown',
  13413. 'darkUp',
  13414. 'darkGrid',
  13415. 'darkTrellis',
  13416. 'lightHorizontal',
  13417. 'lightVertical',
  13418. 'lightDown',
  13419. 'lightUp',
  13420. 'lightGrid',
  13421. 'lightTrellis',
  13422. 'gray125',
  13423. 'gray0625'
  13424. ];
  13425. function rgbify(arr) { return arr.map(function(x) { return [(x>>16)&255,(x>>8)&255,x&255]; }); }
  13426. /* [MS-XLS] 2.5.161 */
  13427. /* [MS-XLSB] 2.5.75 Icv */
  13428. var _XLSIcv = rgbify([
  13429. /* Color Constants */
  13430. 0x000000,
  13431. 0xFFFFFF,
  13432. 0xFF0000,
  13433. 0x00FF00,
  13434. 0x0000FF,
  13435. 0xFFFF00,
  13436. 0xFF00FF,
  13437. 0x00FFFF,
  13438. /* Overridable Defaults */
  13439. 0x000000,
  13440. 0xFFFFFF,
  13441. 0xFF0000,
  13442. 0x00FF00,
  13443. 0x0000FF,
  13444. 0xFFFF00,
  13445. 0xFF00FF,
  13446. 0x00FFFF,
  13447. 0x800000,
  13448. 0x008000,
  13449. 0x000080,
  13450. 0x808000,
  13451. 0x800080,
  13452. 0x008080,
  13453. 0xC0C0C0,
  13454. 0x808080,
  13455. 0x9999FF,
  13456. 0x993366,
  13457. 0xFFFFCC,
  13458. 0xCCFFFF,
  13459. 0x660066,
  13460. 0xFF8080,
  13461. 0x0066CC,
  13462. 0xCCCCFF,
  13463. 0x000080,
  13464. 0xFF00FF,
  13465. 0xFFFF00,
  13466. 0x00FFFF,
  13467. 0x800080,
  13468. 0x800000,
  13469. 0x008080,
  13470. 0x0000FF,
  13471. 0x00CCFF,
  13472. 0xCCFFFF,
  13473. 0xCCFFCC,
  13474. 0xFFFF99,
  13475. 0x99CCFF,
  13476. 0xFF99CC,
  13477. 0xCC99FF,
  13478. 0xFFCC99,
  13479. 0x3366FF,
  13480. 0x33CCCC,
  13481. 0x99CC00,
  13482. 0xFFCC00,
  13483. 0xFF9900,
  13484. 0xFF6600,
  13485. 0x666699,
  13486. 0x969696,
  13487. 0x003366,
  13488. 0x339966,
  13489. 0x003300,
  13490. 0x333300,
  13491. 0x993300,
  13492. 0x993366,
  13493. 0x333399,
  13494. 0x333333,
  13495. /* Other entries to appease BIFF8/12 */
  13496. 0xFFFFFF, /* 0x40 icvForeground ?? */
  13497. 0x000000, /* 0x41 icvBackground ?? */
  13498. 0x000000, /* 0x42 icvFrame ?? */
  13499. 0x000000, /* 0x43 icv3D ?? */
  13500. 0x000000, /* 0x44 icv3DText ?? */
  13501. 0x000000, /* 0x45 icv3DHilite ?? */
  13502. 0x000000, /* 0x46 icv3DShadow ?? */
  13503. 0x000000, /* 0x47 icvHilite ?? */
  13504. 0x000000, /* 0x48 icvCtlText ?? */
  13505. 0x000000, /* 0x49 icvCtlScrl ?? */
  13506. 0x000000, /* 0x4A icvCtlInv ?? */
  13507. 0x000000, /* 0x4B icvCtlBody ?? */
  13508. 0x000000, /* 0x4C icvCtlFrame ?? */
  13509. 0x000000, /* 0x4D icvCtlFore ?? */
  13510. 0x000000, /* 0x4E icvCtlBack ?? */
  13511. 0x000000, /* 0x4F icvCtlNeutral */
  13512. 0x000000, /* 0x50 icvInfoBk ?? */
  13513. 0x000000 /* 0x51 icvInfoText ?? */
  13514. ]);
  13515. var XLSIcv = dup(_XLSIcv);
  13516. /* [MS-XLSB] 2.5.97.2 */
  13517. var BErr = {
  13518. 0x00: "#NULL!",
  13519. 0x07: "#DIV/0!",
  13520. 0x0F: "#VALUE!",
  13521. 0x17: "#REF!",
  13522. 0x1D: "#NAME?",
  13523. 0x24: "#NUM!",
  13524. 0x2A: "#N/A",
  13525. 0x2B: "#GETTING_DATA",
  13526. 0xFF: "#WTF?"
  13527. };
  13528. var RBErr = evert_num(BErr);
  13529. /* Parts enumerated in OPC spec, MS-XLSB and MS-XLSX */
  13530. /* 12.3 Part Summary <SpreadsheetML> */
  13531. /* 14.2 Part Summary <DrawingML> */
  13532. /* [MS-XLSX] 2.1 Part Enumerations ; [MS-XLSB] 2.1.7 Part Enumeration */
  13533. var ct2type/*{[string]:string}*/ = ({
  13534. /* Workbook */
  13535. "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet.main+xml": "workbooks",
  13536. /* Worksheet */
  13537. "application/vnd.ms-excel.binIndexWs": "TODO", /* Binary Index */
  13538. /* Macrosheet */
  13539. "application/vnd.ms-excel.intlmacrosheet": "TODO",
  13540. "application/vnd.ms-excel.binIndexMs": "TODO", /* Binary Index */
  13541. /* File Properties */
  13542. "application/vnd.openxmlformats-package.core-properties+xml": "coreprops",
  13543. "application/vnd.openxmlformats-officedocument.custom-properties+xml": "custprops",
  13544. "application/vnd.openxmlformats-officedocument.extended-properties+xml": "extprops",
  13545. /* Custom Data Properties */
  13546. "application/vnd.openxmlformats-officedocument.customXmlProperties+xml": "TODO",
  13547. "application/vnd.openxmlformats-officedocument.spreadsheetml.customProperty": "TODO",
  13548. /* PivotTable */
  13549. "application/vnd.ms-excel.pivotTable": "TODO",
  13550. "application/vnd.openxmlformats-officedocument.spreadsheetml.pivotTable+xml": "TODO",
  13551. /* Chart Objects */
  13552. "application/vnd.openxmlformats-officedocument.drawingml.chart+xml": "TODO",
  13553. /* Chart Colors */
  13554. "application/vnd.ms-office.chartcolorstyle+xml": "TODO",
  13555. /* Chart Style */
  13556. "application/vnd.ms-office.chartstyle+xml": "TODO",
  13557. /* Chart Advanced */
  13558. "application/vnd.ms-office.chartex+xml": "TODO",
  13559. /* Calculation Chain */
  13560. "application/vnd.ms-excel.calcChain": "calcchains",
  13561. "application/vnd.openxmlformats-officedocument.spreadsheetml.calcChain+xml": "calcchains",
  13562. /* Printer Settings */
  13563. "application/vnd.openxmlformats-officedocument.spreadsheetml.printerSettings": "TODO",
  13564. /* ActiveX */
  13565. "application/vnd.ms-office.activeX": "TODO",
  13566. "application/vnd.ms-office.activeX+xml": "TODO",
  13567. /* Custom Toolbars */
  13568. "application/vnd.ms-excel.attachedToolbars": "TODO",
  13569. /* External Data Connections */
  13570. "application/vnd.ms-excel.connections": "TODO",
  13571. "application/vnd.openxmlformats-officedocument.spreadsheetml.connections+xml": "TODO",
  13572. /* External Links */
  13573. "application/vnd.ms-excel.externalLink": "links",
  13574. "application/vnd.openxmlformats-officedocument.spreadsheetml.externalLink+xml": "links",
  13575. /* Metadata */
  13576. "application/vnd.ms-excel.sheetMetadata": "TODO",
  13577. "application/vnd.openxmlformats-officedocument.spreadsheetml.sheetMetadata+xml": "TODO",
  13578. /* PivotCache */
  13579. "application/vnd.ms-excel.pivotCacheDefinition": "TODO",
  13580. "application/vnd.ms-excel.pivotCacheRecords": "TODO",
  13581. "application/vnd.openxmlformats-officedocument.spreadsheetml.pivotCacheDefinition+xml": "TODO",
  13582. "application/vnd.openxmlformats-officedocument.spreadsheetml.pivotCacheRecords+xml": "TODO",
  13583. /* Query Table */
  13584. "application/vnd.ms-excel.queryTable": "TODO",
  13585. "application/vnd.openxmlformats-officedocument.spreadsheetml.queryTable+xml": "TODO",
  13586. /* Shared Workbook */
  13587. "application/vnd.ms-excel.userNames": "TODO",
  13588. "application/vnd.ms-excel.revisionHeaders": "TODO",
  13589. "application/vnd.ms-excel.revisionLog": "TODO",
  13590. "application/vnd.openxmlformats-officedocument.spreadsheetml.revisionHeaders+xml": "TODO",
  13591. "application/vnd.openxmlformats-officedocument.spreadsheetml.revisionLog+xml": "TODO",
  13592. "application/vnd.openxmlformats-officedocument.spreadsheetml.userNames+xml": "TODO",
  13593. /* Single Cell Table */
  13594. "application/vnd.ms-excel.tableSingleCells": "TODO",
  13595. "application/vnd.openxmlformats-officedocument.spreadsheetml.tableSingleCells+xml": "TODO",
  13596. /* Slicer */
  13597. "application/vnd.ms-excel.slicer": "TODO",
  13598. "application/vnd.ms-excel.slicerCache": "TODO",
  13599. "application/vnd.ms-excel.slicer+xml": "TODO",
  13600. "application/vnd.ms-excel.slicerCache+xml": "TODO",
  13601. /* Sort Map */
  13602. "application/vnd.ms-excel.wsSortMap": "TODO",
  13603. /* Table */
  13604. "application/vnd.ms-excel.table": "TODO",
  13605. "application/vnd.openxmlformats-officedocument.spreadsheetml.table+xml": "TODO",
  13606. /* Themes */
  13607. "application/vnd.openxmlformats-officedocument.theme+xml": "themes",
  13608. /* Theme Override */
  13609. "application/vnd.openxmlformats-officedocument.themeOverride+xml": "TODO",
  13610. /* Timeline */
  13611. "application/vnd.ms-excel.Timeline+xml": "TODO", /* verify */
  13612. "application/vnd.ms-excel.TimelineCache+xml": "TODO", /* verify */
  13613. /* VBA */
  13614. "application/vnd.ms-office.vbaProject": "vba",
  13615. "application/vnd.ms-office.vbaProjectSignature": "vba",
  13616. /* Volatile Dependencies */
  13617. "application/vnd.ms-office.volatileDependencies": "TODO",
  13618. "application/vnd.openxmlformats-officedocument.spreadsheetml.volatileDependencies+xml": "TODO",
  13619. /* Control Properties */
  13620. "application/vnd.ms-excel.controlproperties+xml": "TODO",
  13621. /* Data Model */
  13622. "application/vnd.openxmlformats-officedocument.model+data": "TODO",
  13623. /* Survey */
  13624. "application/vnd.ms-excel.Survey+xml": "TODO",
  13625. /* Drawing */
  13626. "application/vnd.openxmlformats-officedocument.drawing+xml": "drawings",
  13627. "application/vnd.openxmlformats-officedocument.drawingml.chartshapes+xml": "TODO",
  13628. "application/vnd.openxmlformats-officedocument.drawingml.diagramColors+xml": "TODO",
  13629. "application/vnd.openxmlformats-officedocument.drawingml.diagramData+xml": "TODO",
  13630. "application/vnd.openxmlformats-officedocument.drawingml.diagramLayout+xml": "TODO",
  13631. "application/vnd.openxmlformats-officedocument.drawingml.diagramStyle+xml": "TODO",
  13632. /* VML */
  13633. "application/vnd.openxmlformats-officedocument.vmlDrawing": "TODO",
  13634. "application/vnd.openxmlformats-package.relationships+xml": "rels",
  13635. "application/vnd.openxmlformats-officedocument.oleObject": "TODO",
  13636. /* Image */
  13637. "image/png": "TODO",
  13638. "sheet": "js"
  13639. });
  13640. var CT_LIST = (function(){
  13641. var o = {
  13642. workbooks: {
  13643. xlsx: "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet.main+xml",
  13644. xlsm: "application/vnd.ms-excel.sheet.macroEnabled.main+xml",
  13645. xlsb: "application/vnd.ms-excel.sheet.binary.macroEnabled.main",
  13646. xlam: "application/vnd.ms-excel.addin.macroEnabled.main+xml",
  13647. xltx: "application/vnd.openxmlformats-officedocument.spreadsheetml.template.main+xml"
  13648. },
  13649. strs: { /* Shared Strings */
  13650. xlsx: "application/vnd.openxmlformats-officedocument.spreadsheetml.sharedStrings+xml",
  13651. xlsb: "application/vnd.ms-excel.sharedStrings"
  13652. },
  13653. comments: { /* Comments */
  13654. xlsx: "application/vnd.openxmlformats-officedocument.spreadsheetml.comments+xml",
  13655. xlsb: "application/vnd.ms-excel.comments"
  13656. },
  13657. sheets: { /* Worksheet */
  13658. xlsx: "application/vnd.openxmlformats-officedocument.spreadsheetml.worksheet+xml",
  13659. xlsb: "application/vnd.ms-excel.worksheet"
  13660. },
  13661. charts: { /* Chartsheet */
  13662. xlsx: "application/vnd.openxmlformats-officedocument.spreadsheetml.chartsheet+xml",
  13663. xlsb: "application/vnd.ms-excel.chartsheet"
  13664. },
  13665. dialogs: { /* Dialogsheet */
  13666. xlsx: "application/vnd.openxmlformats-officedocument.spreadsheetml.dialogsheet+xml",
  13667. xlsb: "application/vnd.ms-excel.dialogsheet"
  13668. },
  13669. macros: { /* Macrosheet (Excel 4.0 Macros) */
  13670. xlsx: "application/vnd.ms-excel.macrosheet+xml",
  13671. xlsb: "application/vnd.ms-excel.macrosheet"
  13672. },
  13673. styles: { /* Styles */
  13674. xlsx: "application/vnd.openxmlformats-officedocument.spreadsheetml.styles+xml",
  13675. xlsb: "application/vnd.ms-excel.styles"
  13676. }
  13677. };
  13678. keys(o).forEach(function(k) { ["xlsm", "xlam"].forEach(function(v) { if(!o[k][v]) o[k][v] = o[k].xlsx; }); });
  13679. keys(o).forEach(function(k){ keys(o[k]).forEach(function(v) { ct2type[o[k][v]] = k; }); });
  13680. return o;
  13681. })();
  13682. var type2ct/*{[string]:Array<string>}*/ = evert_arr(ct2type);
  13683. XMLNS.CT = 'http://schemas.openxmlformats.org/package/2006/content-types';
  13684. function new_ct() {
  13685. return ({
  13686. workbooks:[], sheets:[], charts:[], dialogs:[], macros:[],
  13687. rels:[], strs:[], comments:[], links:[],
  13688. coreprops:[], extprops:[], custprops:[], themes:[], styles:[],
  13689. calcchains:[], vba: [], drawings: [],
  13690. TODO:[], xmlns: "" });
  13691. }
  13692. function parse_ct(data) {
  13693. var ct = new_ct();
  13694. if(!data || !data.match) return ct;
  13695. var ctext = {};
  13696. (data.match(tagregex)||[]).forEach(function(x) {
  13697. var y = parsexmltag(x);
  13698. switch(y[0].replace(nsregex,"<")) {
  13699. case '<?xml': break;
  13700. case '<Types': ct.xmlns = y['xmlns' + (y[0].match(/<(\w+):/)||["",""])[1] ]; break;
  13701. case '<Default': ctext[y.Extension] = y.ContentType; break;
  13702. case '<Override':
  13703. if(ct[ct2type[y.ContentType]] !== undefined) ct[ct2type[y.ContentType]].push(y.PartName);
  13704. break;
  13705. }
  13706. });
  13707. if(ct.xmlns !== XMLNS.CT) throw new Error("Unknown Namespace: " + ct.xmlns);
  13708. ct.calcchain = ct.calcchains.length > 0 ? ct.calcchains[0] : "";
  13709. ct.sst = ct.strs.length > 0 ? ct.strs[0] : "";
  13710. ct.style = ct.styles.length > 0 ? ct.styles[0] : "";
  13711. ct.defaults = ctext;
  13712. delete ct.calcchains;
  13713. return ct;
  13714. }
  13715. var CTYPE_XML_ROOT = writextag('Types', null, {
  13716. 'xmlns': XMLNS.CT,
  13717. 'xmlns:xsd': XMLNS.xsd,
  13718. 'xmlns:xsi': XMLNS.xsi
  13719. });
  13720. var CTYPE_DEFAULTS = [
  13721. ['xml', 'application/xml'],
  13722. ['bin', 'application/vnd.ms-excel.sheet.binary.macroEnabled.main'],
  13723. ['vml', 'application/vnd.openxmlformats-officedocument.vmlDrawing'],
  13724. ['data', 'application/vnd.openxmlformats-officedocument.model+data'],
  13725. /* from test files */
  13726. ['bmp', 'image/bmp'],
  13727. ['png', 'image/png'],
  13728. ['gif', 'image/gif'],
  13729. ['emf', 'image/x-emf'],
  13730. ['wmf', 'image/x-wmf'],
  13731. ['jpg', 'image/jpeg'], ['jpeg', 'image/jpeg'],
  13732. ['tif', 'image/tiff'], ['tiff', 'image/tiff'],
  13733. ['pdf', 'application/pdf'],
  13734. ['rels', type2ct.rels[0]]
  13735. ].map(function(x) {
  13736. return writextag('Default', null, {'Extension':x[0], 'ContentType': x[1]});
  13737. });
  13738. function write_ct(ct, opts) {
  13739. var o = [], v;
  13740. o[o.length] = (XML_HEADER);
  13741. o[o.length] = (CTYPE_XML_ROOT);
  13742. o = o.concat(CTYPE_DEFAULTS);
  13743. /* only write first instance */
  13744. var f1 = function(w) {
  13745. if(ct[w] && ct[w].length > 0) {
  13746. v = ct[w][0];
  13747. o[o.length] = (writextag('Override', null, {
  13748. 'PartName': (v[0] == '/' ? "":"/") + v,
  13749. 'ContentType': CT_LIST[w][opts.bookType || 'xlsx']
  13750. }));
  13751. }
  13752. };
  13753. /* book type-specific */
  13754. var f2 = function(w) {
  13755. (ct[w]||[]).forEach(function(v) {
  13756. o[o.length] = (writextag('Override', null, {
  13757. 'PartName': (v[0] == '/' ? "":"/") + v,
  13758. 'ContentType': CT_LIST[w][opts.bookType || 'xlsx']
  13759. }));
  13760. });
  13761. };
  13762. /* standard type */
  13763. var f3 = function(t) {
  13764. (ct[t]||[]).forEach(function(v) {
  13765. o[o.length] = (writextag('Override', null, {
  13766. 'PartName': (v[0] == '/' ? "":"/") + v,
  13767. 'ContentType': type2ct[t][0]
  13768. }));
  13769. });
  13770. };
  13771. f1('workbooks');
  13772. f2('sheets');
  13773. f2('charts');
  13774. f3('themes');
  13775. ['strs', 'styles'].forEach(f1);
  13776. ['coreprops', 'extprops', 'custprops'].forEach(f3);
  13777. f3('vba');
  13778. f3('comments');
  13779. f3('drawings');
  13780. if(o.length>2){ o[o.length] = ('</Types>'); o[1]=o[1].replace("/>",">"); }
  13781. return o.join("");
  13782. }
  13783. /* 9.3 Relationships */
  13784. var RELS = ({
  13785. WB: "http://schemas.openxmlformats.org/officeDocument/2006/relationships/officeDocument",
  13786. SHEET: "http://sheetjs.openxmlformats.org/officeDocument/2006/relationships/officeDocument",
  13787. HLINK: "http://schemas.openxmlformats.org/officeDocument/2006/relationships/hyperlink",
  13788. VML: "http://schemas.openxmlformats.org/officeDocument/2006/relationships/vmlDrawing",
  13789. XPATH: "http://schemas.openxmlformats.org/officeDocument/2006/relationships/externalLinkPath",
  13790. XMISS: "http://schemas.microsoft.com/office/2006/relationships/xlExternalLinkPath/xlPathMissing",
  13791. XLINK: "http://schemas.openxmlformats.org/officeDocument/2006/relationships/externalLink",
  13792. CXML: "http://schemas.openxmlformats.org/officeDocument/2006/relationships/customXml",
  13793. CXMLP: "http://schemas.openxmlformats.org/officeDocument/2006/relationships/customXmlProps",
  13794. VBA: "http://schemas.microsoft.com/office/2006/relationships/vbaProject"
  13795. });
  13796. /* 9.3.3 Representing Relationships */
  13797. function get_rels_path(file) {
  13798. var n = file.lastIndexOf("/");
  13799. return file.slice(0,n+1) + '_rels/' + file.slice(n+1) + ".rels";
  13800. }
  13801. function parse_rels(data, currentFilePath) {
  13802. var rels = {"!id":{}};
  13803. if (!data) return rels;
  13804. if (currentFilePath.charAt(0) !== '/') {
  13805. currentFilePath = '/'+currentFilePath;
  13806. }
  13807. var hash = {};
  13808. (data.match(tagregex)||[]).forEach(function(x) {
  13809. var y = parsexmltag(x);
  13810. /* 9.3.2.2 OPC_Relationships */
  13811. if (y[0] === '<Relationship') {
  13812. var rel = {}; rel.Type = y.Type; rel.Target = y.Target; rel.Id = y.Id; rel.TargetMode = y.TargetMode;
  13813. var canonictarget = y.TargetMode === 'External' ? y.Target : resolve_path(y.Target, currentFilePath);
  13814. rels[canonictarget] = rel;
  13815. hash[y.Id] = rel;
  13816. }
  13817. });
  13818. rels["!id"] = hash;
  13819. return rels;
  13820. }
  13821. XMLNS.RELS = 'http://schemas.openxmlformats.org/package/2006/relationships';
  13822. var RELS_ROOT = writextag('Relationships', null, {
  13823. //'xmlns:ns0': XMLNS.RELS,
  13824. 'xmlns': XMLNS.RELS
  13825. });
  13826. /* TODO */
  13827. function write_rels(rels) {
  13828. var o = [XML_HEADER, RELS_ROOT];
  13829. keys(rels['!id']).forEach(function(rid) {
  13830. o[o.length] = (writextag('Relationship', null, rels['!id'][rid]));
  13831. });
  13832. if(o.length>2){ o[o.length] = ('</Relationships>'); o[1]=o[1].replace("/>",">"); }
  13833. return o.join("");
  13834. }
  13835. var RELS_EXTERN = [RELS.HLINK, RELS.XPATH, RELS.XMISS];
  13836. function add_rels(rels, rId, f, type, relobj, targetmode) {
  13837. if(!relobj) relobj = {};
  13838. if(!rels['!id']) rels['!id'] = {};
  13839. if(rId < 0) for(rId = 1; rels['!id']['rId' + rId]; ++rId){/* empty */}
  13840. relobj.Id = 'rId' + rId;
  13841. relobj.Type = type;
  13842. relobj.Target = f;
  13843. if(targetmode) relobj.TargetMode = targetmode;
  13844. else if(RELS_EXTERN.indexOf(relobj.Type) > -1) relobj.TargetMode = "External";
  13845. if(rels['!id'][relobj.Id]) throw new Error("Cannot rewrite rId " + rId);
  13846. rels['!id'][relobj.Id] = relobj;
  13847. rels[('/' + relobj.Target).replace("//","/")] = relobj;
  13848. return rId;
  13849. }
  13850. /* Open Document Format for Office Applications (OpenDocument) Version 1.2 */
  13851. /* Part 3 Section 4 Manifest File */
  13852. var CT_ODS = "application/vnd.oasis.opendocument.spreadsheet";
  13853. function parse_manifest(d, opts) {
  13854. var str = xlml_normalize(d);
  13855. var Rn;
  13856. var FEtag;
  13857. while((Rn = xlmlregex.exec(str))) switch(Rn[3]) {
  13858. case 'manifest': break; // 4.2 <manifest:manifest>
  13859. case 'file-entry': // 4.3 <manifest:file-entry>
  13860. FEtag = parsexmltag(Rn[0], false);
  13861. if(FEtag.path == '/' && FEtag.type !== CT_ODS) throw new Error("This OpenDocument is not a spreadsheet");
  13862. break;
  13863. case 'encryption-data': // 4.4 <manifest:encryption-data>
  13864. case 'algorithm': // 4.5 <manifest:algorithm>
  13865. case 'start-key-generation': // 4.6 <manifest:start-key-generation>
  13866. case 'key-derivation': // 4.7 <manifest:key-derivation>
  13867. throw new Error("Unsupported ODS Encryption");
  13868. default: if(opts && opts.WTF) throw Rn;
  13869. }
  13870. }
  13871. function write_manifest(manifest) {
  13872. var o = [XML_HEADER];
  13873. o.push('<manifest:manifest xmlns:manifest="urn:oasis:names:tc:opendocument:xmlns:manifest:1.0" manifest:version="1.2">\n');
  13874. o.push(' <manifest:file-entry manifest:full-path="/" manifest:version="1.2" manifest:media-type="application/vnd.oasis.opendocument.spreadsheet"/>\n');
  13875. for(var i = 0; i < manifest.length; ++i) o.push(' <manifest:file-entry manifest:full-path="' + manifest[i][0] + '" manifest:media-type="' + manifest[i][1] + '"/>\n');
  13876. o.push('</manifest:manifest>');
  13877. return o.join("");
  13878. }
  13879. /* Part 3 Section 6 Metadata Manifest File */
  13880. function write_rdf_type(file, res, tag) {
  13881. return [
  13882. ' <rdf:Description rdf:about="' + file + '">\n',
  13883. ' <rdf:type rdf:resource="http://docs.oasis-open.org/ns/office/1.2/meta/' + (tag || "odf") + '#' + res + '"/>\n',
  13884. ' </rdf:Description>\n'
  13885. ].join("");
  13886. }
  13887. function write_rdf_has(base, file) {
  13888. return [
  13889. ' <rdf:Description rdf:about="' + base + '">\n',
  13890. ' <ns0:hasPart xmlns:ns0="http://docs.oasis-open.org/ns/office/1.2/meta/pkg#" rdf:resource="' + file + '"/>\n',
  13891. ' </rdf:Description>\n'
  13892. ].join("");
  13893. }
  13894. function write_rdf(rdf) {
  13895. var o = [XML_HEADER];
  13896. o.push('<rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#">\n');
  13897. for(var i = 0; i != rdf.length; ++i) {
  13898. o.push(write_rdf_type(rdf[i][0], rdf[i][1]));
  13899. o.push(write_rdf_has("",rdf[i][0]));
  13900. }
  13901. o.push(write_rdf_type("","Document", "pkg"));
  13902. o.push('</rdf:RDF>');
  13903. return o.join("");
  13904. }
  13905. /* TODO: pull properties */
  13906. var write_meta_ods = (function() {
  13907. var payload = '<?xml version="1.0" encoding="UTF-8" standalone="yes"?><office:document-meta xmlns:office="urn:oasis:names:tc:opendocument:xmlns:office:1.0" xmlns:meta="urn:oasis:names:tc:opendocument:xmlns:meta:1.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:xlink="http://www.w3.org/1999/xlink" office:version="1.2"><office:meta><meta:generator>Sheet' + 'JS ' + XLSX.version + '</meta:generator></office:meta></office:document-meta>';
  13908. return function wmo() {
  13909. return payload;
  13910. };
  13911. })();
  13912. /* ECMA-376 Part II 11.1 Core Properties Part */
  13913. /* [MS-OSHARED] 2.3.3.2.[1-2].1 (PIDSI/PIDDSI) */
  13914. var CORE_PROPS = [
  13915. ["cp:category", "Category"],
  13916. ["cp:contentStatus", "ContentStatus"],
  13917. ["cp:keywords", "Keywords"],
  13918. ["cp:lastModifiedBy", "LastAuthor"],
  13919. ["cp:lastPrinted", "LastPrinted"],
  13920. ["cp:revision", "RevNumber"],
  13921. ["cp:version", "Version"],
  13922. ["dc:creator", "Author"],
  13923. ["dc:description", "Comments"],
  13924. ["dc:identifier", "Identifier"],
  13925. ["dc:language", "Language"],
  13926. ["dc:subject", "Subject"],
  13927. ["dc:title", "Title"],
  13928. ["dcterms:created", "CreatedDate", 'date'],
  13929. ["dcterms:modified", "ModifiedDate", 'date']
  13930. ];
  13931. XMLNS.CORE_PROPS = "http://schemas.openxmlformats.org/package/2006/metadata/core-properties";
  13932. RELS.CORE_PROPS = 'http://schemas.openxmlformats.org/package/2006/relationships/metadata/core-properties';
  13933. var CORE_PROPS_REGEX = (function() {
  13934. var r = new Array(CORE_PROPS.length);
  13935. for(var i = 0; i < CORE_PROPS.length; ++i) {
  13936. var f = CORE_PROPS[i];
  13937. var g = "(?:"+ f[0].slice(0,f[0].indexOf(":")) +":)"+ f[0].slice(f[0].indexOf(":")+1);
  13938. r[i] = new RegExp("<" + g + "[^>]*>([\\s\\S]*?)<\/" + g + ">");
  13939. }
  13940. return r;
  13941. })();
  13942. function parse_core_props(data) {
  13943. var p = {};
  13944. data = utf8read(data);
  13945. for(var i = 0; i < CORE_PROPS.length; ++i) {
  13946. var f = CORE_PROPS[i], cur = data.match(CORE_PROPS_REGEX[i]);
  13947. if(cur != null && cur.length > 0) p[f[1]] = unescapexml(cur[1]);
  13948. if(f[2] === 'date' && p[f[1]]) p[f[1]] = parseDate(p[f[1]]);
  13949. }
  13950. return p;
  13951. }
  13952. var CORE_PROPS_XML_ROOT = writextag('cp:coreProperties', null, {
  13953. //'xmlns': XMLNS.CORE_PROPS,
  13954. 'xmlns:cp': XMLNS.CORE_PROPS,
  13955. 'xmlns:dc': XMLNS.dc,
  13956. 'xmlns:dcterms': XMLNS.dcterms,
  13957. 'xmlns:dcmitype': XMLNS.dcmitype,
  13958. 'xmlns:xsi': XMLNS.xsi
  13959. });
  13960. function cp_doit(f, g, h, o, p) {
  13961. if(p[f] != null || g == null || g === "") return;
  13962. p[f] = g;
  13963. g = escapexml(g);
  13964. o[o.length] = (h ? writextag(f,g,h) : writetag(f,g));
  13965. }
  13966. function write_core_props(cp, _opts) {
  13967. var opts = _opts || {};
  13968. var o = [XML_HEADER, CORE_PROPS_XML_ROOT], p = {};
  13969. if(!cp && !opts.Props) return o.join("");
  13970. if(cp) {
  13971. if(cp.CreatedDate != null) cp_doit("dcterms:created", typeof cp.CreatedDate === "string" ? cp.CreatedDate : write_w3cdtf(cp.CreatedDate, opts.WTF), {"xsi:type":"dcterms:W3CDTF"}, o, p);
  13972. if(cp.ModifiedDate != null) cp_doit("dcterms:modified", typeof cp.ModifiedDate === "string" ? cp.ModifiedDate : write_w3cdtf(cp.ModifiedDate, opts.WTF), {"xsi:type":"dcterms:W3CDTF"}, o, p);
  13973. }
  13974. for(var i = 0; i != CORE_PROPS.length; ++i) {
  13975. var f = CORE_PROPS[i];
  13976. var v = opts.Props && opts.Props[f[1]] != null ? opts.Props[f[1]] : cp ? cp[f[1]] : null;
  13977. if(v === true) v = "1";
  13978. else if(v === false) v = "0";
  13979. else if(typeof v == "number") v = String(v);
  13980. if(v != null) cp_doit(f[0], v, null, o, p);
  13981. }
  13982. if(o.length>2){ o[o.length] = ('</cp:coreProperties>'); o[1]=o[1].replace("/>",">"); }
  13983. return o.join("");
  13984. }
  13985. /* 15.2.12.3 Extended File Properties Part */
  13986. /* [MS-OSHARED] 2.3.3.2.[1-2].1 (PIDSI/PIDDSI) */
  13987. var EXT_PROPS = [
  13988. ["Application", "Application", "string"],
  13989. ["AppVersion", "AppVersion", "string"],
  13990. ["Company", "Company", "string"],
  13991. ["DocSecurity", "DocSecurity", "string"],
  13992. ["Manager", "Manager", "string"],
  13993. ["HyperlinksChanged", "HyperlinksChanged", "bool"],
  13994. ["SharedDoc", "SharedDoc", "bool"],
  13995. ["LinksUpToDate", "LinksUpToDate", "bool"],
  13996. ["ScaleCrop", "ScaleCrop", "bool"],
  13997. ["HeadingPairs", "HeadingPairs", "raw"],
  13998. ["TitlesOfParts", "TitlesOfParts", "raw"]
  13999. ];
  14000. XMLNS.EXT_PROPS = "http://schemas.openxmlformats.org/officeDocument/2006/extended-properties";
  14001. RELS.EXT_PROPS = 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/extended-properties';
  14002. var PseudoPropsPairs = [
  14003. "Worksheets", "SheetNames",
  14004. "NamedRanges", "DefinedNames",
  14005. "Chartsheets", "ChartNames"
  14006. ];
  14007. function load_props_pairs(HP, TOP, props, opts) {
  14008. var v = [];
  14009. if(typeof HP == "string") v = parseVector(HP, opts);
  14010. else for(var j = 0; j < HP.length; ++j) v = v.concat(HP[j].map(function(hp) { return {v:hp}; }));
  14011. var parts = (typeof TOP == "string") ? parseVector(TOP, opts).map(function (x) { return x.v; }) : TOP;
  14012. var idx = 0, len = 0;
  14013. if(parts.length > 0) for(var i = 0; i !== v.length; i += 2) {
  14014. len = +(v[i+1].v);
  14015. switch(v[i].v) {
  14016. case "Worksheets":
  14017. case "工作表":
  14018. case "Листы":
  14019. case "أوراق العمل":
  14020. case "ワークシート":
  14021. case "גליונות עבודה":
  14022. case "Arbeitsblätter":
  14023. case "Çalışma Sayfaları":
  14024. case "Feuilles de calcul":
  14025. case "Fogli di lavoro":
  14026. case "Folhas de cálculo":
  14027. case "Planilhas":
  14028. case "Regneark":
  14029. case "Hojas de cálculo":
  14030. case "Werkbladen":
  14031. props.Worksheets = len;
  14032. props.SheetNames = parts.slice(idx, idx + len);
  14033. break;
  14034. case "Named Ranges":
  14035. case "Rangos con nombre":
  14036. case "名前付き一覧":
  14037. case "Benannte Bereiche":
  14038. case "Navngivne områder":
  14039. props.NamedRanges = len;
  14040. props.DefinedNames = parts.slice(idx, idx + len);
  14041. break;
  14042. case "Charts":
  14043. case "Diagramme":
  14044. props.Chartsheets = len;
  14045. props.ChartNames = parts.slice(idx, idx + len);
  14046. break;
  14047. }
  14048. idx += len;
  14049. }
  14050. }
  14051. function parse_ext_props(data, p, opts) {
  14052. var q = {}; if(!p) p = {};
  14053. data = utf8read(data);
  14054. EXT_PROPS.forEach(function(f) {
  14055. var xml = (data.match(matchtag(f[0]))||[])[1];
  14056. switch(f[2]) {
  14057. case "string": if(xml) p[f[1]] = unescapexml(xml); break;
  14058. case "bool": p[f[1]] = xml === "true"; break;
  14059. case "raw":
  14060. var cur = data.match(new RegExp("<" + f[0] + "[^>]*>([\\s\\S]*?)<\/" + f[0] + ">"));
  14061. if(cur && cur.length > 0) q[f[1]] = cur[1];
  14062. break;
  14063. }
  14064. });
  14065. if(q.HeadingPairs && q.TitlesOfParts) load_props_pairs(q.HeadingPairs, q.TitlesOfParts, p, opts);
  14066. return p;
  14067. }
  14068. var EXT_PROPS_XML_ROOT = writextag('Properties', null, {
  14069. 'xmlns': XMLNS.EXT_PROPS,
  14070. 'xmlns:vt': XMLNS.vt
  14071. });
  14072. function write_ext_props(cp) {
  14073. var o = [], W = writextag;
  14074. if(!cp) cp = {};
  14075. cp.Application = "SheetJS";
  14076. o[o.length] = (XML_HEADER);
  14077. o[o.length] = (EXT_PROPS_XML_ROOT);
  14078. EXT_PROPS.forEach(function(f) {
  14079. if(cp[f[1]] === undefined) return;
  14080. var v;
  14081. switch(f[2]) {
  14082. case 'string': v = escapexml(String(cp[f[1]])); break;
  14083. case 'bool': v = cp[f[1]] ? 'true' : 'false'; break;
  14084. }
  14085. if(v !== undefined) o[o.length] = (W(f[0], v));
  14086. });
  14087. /* TODO: HeadingPairs, TitlesOfParts */
  14088. o[o.length] = (W('HeadingPairs', W('vt:vector', W('vt:variant', '<vt:lpstr>Worksheets</vt:lpstr>')+W('vt:variant', W('vt:i4', String(cp.Worksheets))), {size:2, baseType:"variant"})));
  14089. o[o.length] = (W('TitlesOfParts', W('vt:vector', cp.SheetNames.map(function(s) { return "<vt:lpstr>" + escapexml(s) + "</vt:lpstr>"; }).join(""), {size: cp.Worksheets, baseType:"lpstr"})));
  14090. if(o.length>2){ o[o.length] = ('</Properties>'); o[1]=o[1].replace("/>",">"); }
  14091. return o.join("");
  14092. }
  14093. /* 15.2.12.2 Custom File Properties Part */
  14094. XMLNS.CUST_PROPS = "http://schemas.openxmlformats.org/officeDocument/2006/custom-properties";
  14095. RELS.CUST_PROPS = 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/custom-properties';
  14096. var custregex = /<[^>]+>[^<]*/g;
  14097. function parse_cust_props(data, opts) {
  14098. var p = {}, name = "";
  14099. var m = data.match(custregex);
  14100. if(m) for(var i = 0; i != m.length; ++i) {
  14101. var x = m[i], y = parsexmltag(x);
  14102. switch(y[0]) {
  14103. case '<?xml': break;
  14104. case '<Properties': break;
  14105. case '<property': name = unescapexml(y.name); break;
  14106. case '</property>': name = null; break;
  14107. default: if (x.indexOf('<vt:') === 0) {
  14108. var toks = x.split('>');
  14109. var type = toks[0].slice(4), text = toks[1];
  14110. /* 22.4.2.32 (CT_Variant). Omit the binary types from 22.4 (Variant Types) */
  14111. switch(type) {
  14112. case 'lpstr': case 'bstr': case 'lpwstr':
  14113. p[name] = unescapexml(text);
  14114. break;
  14115. case 'bool':
  14116. p[name] = parsexmlbool(text);
  14117. break;
  14118. case 'i1': case 'i2': case 'i4': case 'i8': case 'int': case 'uint':
  14119. p[name] = parseInt(text, 10);
  14120. break;
  14121. case 'r4': case 'r8': case 'decimal':
  14122. p[name] = parseFloat(text);
  14123. break;
  14124. case 'filetime': case 'date':
  14125. p[name] = parseDate(text);
  14126. break;
  14127. case 'cy': case 'error':
  14128. p[name] = unescapexml(text);
  14129. break;
  14130. default:
  14131. if(type.slice(-1) == '/') break;
  14132. if(opts.WTF && typeof console !== 'undefined') console.warn('Unexpected', x, type, toks);
  14133. }
  14134. } else if(x.slice(0,2) === "</") {/* empty */
  14135. } else if(opts.WTF) throw new Error(x);
  14136. }
  14137. }
  14138. return p;
  14139. }
  14140. var CUST_PROPS_XML_ROOT = writextag('Properties', null, {
  14141. 'xmlns': XMLNS.CUST_PROPS,
  14142. 'xmlns:vt': XMLNS.vt
  14143. });
  14144. function write_cust_props(cp) {
  14145. var o = [XML_HEADER, CUST_PROPS_XML_ROOT];
  14146. if(!cp) return o.join("");
  14147. var pid = 1;
  14148. keys(cp).forEach(function custprop(k) { ++pid;
  14149. o[o.length] = (writextag('property', write_vt(cp[k], true), {
  14150. 'fmtid': '{D5CDD505-2E9C-101B-9397-08002B2CF9AE}',
  14151. 'pid': pid,
  14152. 'name': escapexml(k)
  14153. }));
  14154. });
  14155. if(o.length>2){ o[o.length] = '</Properties>'; o[1]=o[1].replace("/>",">"); }
  14156. return o.join("");
  14157. }
  14158. /* Common Name -> XLML Name */
  14159. var XLMLDocPropsMap = {
  14160. Title: 'Title',
  14161. Subject: 'Subject',
  14162. Author: 'Author',
  14163. Keywords: 'Keywords',
  14164. Comments: 'Description',
  14165. LastAuthor: 'LastAuthor',
  14166. RevNumber: 'Revision',
  14167. Application: 'AppName',
  14168. /* TotalTime: 'TotalTime', */
  14169. LastPrinted: 'LastPrinted',
  14170. CreatedDate: 'Created',
  14171. ModifiedDate: 'LastSaved',
  14172. /* Pages */
  14173. /* Words */
  14174. /* Characters */
  14175. Category: 'Category',
  14176. /* PresentationFormat */
  14177. Manager: 'Manager',
  14178. Company: 'Company',
  14179. /* Guid */
  14180. /* HyperlinkBase */
  14181. /* Bytes */
  14182. /* Lines */
  14183. /* Paragraphs */
  14184. /* CharactersWithSpaces */
  14185. AppVersion: 'Version',
  14186. ContentStatus: 'ContentStatus', /* NOTE: missing from schema */
  14187. Identifier: 'Identifier', /* NOTE: missing from schema */
  14188. Language: 'Language' /* NOTE: missing from schema */
  14189. };
  14190. var evert_XLMLDPM = evert(XLMLDocPropsMap);
  14191. function xlml_set_prop(Props, tag, val) {
  14192. tag = evert_XLMLDPM[tag] || tag;
  14193. Props[tag] = val;
  14194. }
  14195. function xlml_write_docprops(Props, opts) {
  14196. var o = [];
  14197. keys(XLMLDocPropsMap).map(function(m) {
  14198. for(var i = 0; i < CORE_PROPS.length; ++i) if(CORE_PROPS[i][1] == m) return CORE_PROPS[i];
  14199. for(i = 0; i < EXT_PROPS.length; ++i) if(EXT_PROPS[i][1] == m) return EXT_PROPS[i];
  14200. throw m;
  14201. }).forEach(function(p) {
  14202. if(Props[p[1]] == null) return;
  14203. var m = opts && opts.Props && opts.Props[p[1]] != null ? opts.Props[p[1]] : Props[p[1]];
  14204. switch(p[2]) {
  14205. case 'date': m = new Date(m).toISOString().replace(/\.\d*Z/,"Z"); break;
  14206. }
  14207. if(typeof m == 'number') m = String(m);
  14208. else if(m === true || m === false) { m = m ? "1" : "0"; }
  14209. else if(m instanceof Date) m = new Date(m).toISOString().replace(/\.\d*Z/,"");
  14210. o.push(writetag(XLMLDocPropsMap[p[1]] || p[1], m));
  14211. });
  14212. return writextag('DocumentProperties', o.join(""), {xmlns:XLMLNS.o });
  14213. }
  14214. function xlml_write_custprops(Props, Custprops) {
  14215. var BLACKLIST = ["Worksheets","SheetNames"];
  14216. var T = 'CustomDocumentProperties';
  14217. var o = [];
  14218. if(Props) keys(Props).forEach(function(k) {
  14219. if(!Object.prototype.hasOwnProperty.call(Props, k)) return;
  14220. for(var i = 0; i < CORE_PROPS.length; ++i) if(k == CORE_PROPS[i][1]) return;
  14221. for(i = 0; i < EXT_PROPS.length; ++i) if(k == EXT_PROPS[i][1]) return;
  14222. for(i = 0; i < BLACKLIST.length; ++i) if(k == BLACKLIST[i]) return;
  14223. var m = Props[k];
  14224. var t = "string";
  14225. if(typeof m == 'number') { t = "float"; m = String(m); }
  14226. else if(m === true || m === false) { t = "boolean"; m = m ? "1" : "0"; }
  14227. else m = String(m);
  14228. o.push(writextag(escapexmltag(k), m, {"dt:dt":t}));
  14229. });
  14230. if(Custprops) keys(Custprops).forEach(function(k) {
  14231. if(!Object.prototype.hasOwnProperty.call(Custprops, k)) return;
  14232. if(Props && Object.prototype.hasOwnProperty.call(Props, k)) return;
  14233. var m = Custprops[k];
  14234. var t = "string";
  14235. if(typeof m == 'number') { t = "float"; m = String(m); }
  14236. else if(m === true || m === false) { t = "boolean"; m = m ? "1" : "0"; }
  14237. else if(m instanceof Date) { t = "dateTime.tz"; m = m.toISOString(); }
  14238. else m = String(m);
  14239. o.push(writextag(escapexmltag(k), m, {"dt:dt":t}));
  14240. });
  14241. return '<' + T + ' xmlns="' + XLMLNS.o + '">' + o.join("") + '</' + T + '>';
  14242. }
  14243. /* [MS-DTYP] 2.3.3 FILETIME */
  14244. /* [MS-OLEDS] 2.1.3 FILETIME (Packet Version) */
  14245. /* [MS-OLEPS] 2.8 FILETIME (Packet Version) */
  14246. function parse_FILETIME(blob) {
  14247. var dwLowDateTime = blob.read_shift(4), dwHighDateTime = blob.read_shift(4);
  14248. return new Date(((dwHighDateTime/1e7*Math.pow(2,32) + dwLowDateTime/1e7) - 11644473600)*1000).toISOString().replace(/\.000/,"");
  14249. }
  14250. function write_FILETIME(time) {
  14251. var date = (typeof time == "string") ? new Date(Date.parse(time)) : time;
  14252. var t = date.getTime() / 1000 + 11644473600;
  14253. var l = t % Math.pow(2,32), h = (t - l) / Math.pow(2,32);
  14254. l *= 1e7; h *= 1e7;
  14255. var w = (l / Math.pow(2,32)) | 0;
  14256. if(w > 0) { l = l % Math.pow(2,32); h += w; }
  14257. var o = new_buf(8); o.write_shift(4, l); o.write_shift(4, h); return o;
  14258. }
  14259. /* [MS-OSHARED] 2.3.3.1.4 Lpstr */
  14260. function parse_lpstr(blob, type, pad) {
  14261. var start = blob.l;
  14262. var str = blob.read_shift(0, 'lpstr-cp');
  14263. if(pad) while((blob.l - start) & 3) ++blob.l;
  14264. return str;
  14265. }
  14266. /* [MS-OSHARED] 2.3.3.1.6 Lpwstr */
  14267. function parse_lpwstr(blob, type, pad) {
  14268. var str = blob.read_shift(0, 'lpwstr');
  14269. if(pad) blob.l += (4 - ((str.length+1) & 3)) & 3;
  14270. return str;
  14271. }
  14272. /* [MS-OSHARED] 2.3.3.1.11 VtString */
  14273. /* [MS-OSHARED] 2.3.3.1.12 VtUnalignedString */
  14274. function parse_VtStringBase(blob, stringType, pad) {
  14275. if(stringType === 0x1F /*VT_LPWSTR*/) return parse_lpwstr(blob);
  14276. return parse_lpstr(blob, stringType, pad);
  14277. }
  14278. function parse_VtString(blob, t, pad) { return parse_VtStringBase(blob, t, pad === false ? 0: 4); }
  14279. function parse_VtUnalignedString(blob, t) { if(!t) throw new Error("VtUnalignedString must have positive length"); return parse_VtStringBase(blob, t, 0); }
  14280. /* [MS-OSHARED] 2.3.3.1.9 VtVecUnalignedLpstrValue */
  14281. function parse_VtVecUnalignedLpstrValue(blob) {
  14282. var length = blob.read_shift(4);
  14283. var ret = [];
  14284. for(var i = 0; i != length; ++i) ret[i] = blob.read_shift(0, 'lpstr-cp').replace(chr0,'');
  14285. return ret;
  14286. }
  14287. /* [MS-OSHARED] 2.3.3.1.10 VtVecUnalignedLpstr */
  14288. function parse_VtVecUnalignedLpstr(blob) {
  14289. return parse_VtVecUnalignedLpstrValue(blob);
  14290. }
  14291. /* [MS-OSHARED] 2.3.3.1.13 VtHeadingPair */
  14292. function parse_VtHeadingPair(blob) {
  14293. var headingString = parse_TypedPropertyValue(blob, VT_USTR);
  14294. var headerParts = parse_TypedPropertyValue(blob, VT_I4);
  14295. return [headingString, headerParts];
  14296. }
  14297. /* [MS-OSHARED] 2.3.3.1.14 VtVecHeadingPairValue */
  14298. function parse_VtVecHeadingPairValue(blob) {
  14299. var cElements = blob.read_shift(4);
  14300. var out = [];
  14301. for(var i = 0; i != cElements / 2; ++i) out.push(parse_VtHeadingPair(blob));
  14302. return out;
  14303. }
  14304. /* [MS-OSHARED] 2.3.3.1.15 VtVecHeadingPair */
  14305. function parse_VtVecHeadingPair(blob) {
  14306. // NOTE: When invoked, wType & padding were already consumed
  14307. return parse_VtVecHeadingPairValue(blob);
  14308. }
  14309. /* [MS-OLEPS] 2.18.1 Dictionary (uses 2.17, 2.16) */
  14310. function parse_dictionary(blob,CodePage) {
  14311. var cnt = blob.read_shift(4);
  14312. var dict = ({});
  14313. for(var j = 0; j != cnt; ++j) {
  14314. var pid = blob.read_shift(4);
  14315. var len = blob.read_shift(4);
  14316. dict[pid] = blob.read_shift(len, (CodePage === 0x4B0 ?'utf16le':'utf8')).replace(chr0,'').replace(chr1,'!');
  14317. if(CodePage === 0x4B0 && (len % 2)) blob.l += 2;
  14318. }
  14319. if(blob.l & 3) blob.l = (blob.l>>2+1)<<2;
  14320. return dict;
  14321. }
  14322. /* [MS-OLEPS] 2.9 BLOB */
  14323. function parse_BLOB(blob) {
  14324. var size = blob.read_shift(4);
  14325. var bytes = blob.slice(blob.l,blob.l+size);
  14326. blob.l += size;
  14327. if((size & 3) > 0) blob.l += (4 - (size & 3)) & 3;
  14328. return bytes;
  14329. }
  14330. /* [MS-OLEPS] 2.11 ClipboardData */
  14331. function parse_ClipboardData(blob) {
  14332. // TODO
  14333. var o = {};
  14334. o.Size = blob.read_shift(4);
  14335. //o.Format = blob.read_shift(4);
  14336. blob.l += o.Size + 3 - (o.Size - 1) % 4;
  14337. return o;
  14338. }
  14339. /* [MS-OLEPS] 2.15 TypedPropertyValue */
  14340. function parse_TypedPropertyValue(blob, type, _opts) {
  14341. var t = blob.read_shift(2), ret, opts = _opts||{};
  14342. blob.l += 2;
  14343. if(type !== VT_VARIANT)
  14344. if(t !== type && VT_CUSTOM.indexOf(type)===-1) throw new Error('Expected type ' + type + ' saw ' + t);
  14345. switch(type === VT_VARIANT ? t : type) {
  14346. case 0x02 /*VT_I2*/: ret = blob.read_shift(2, 'i'); if(!opts.raw) blob.l += 2; return ret;
  14347. case 0x03 /*VT_I4*/: ret = blob.read_shift(4, 'i'); return ret;
  14348. case 0x0B /*VT_BOOL*/: return blob.read_shift(4) !== 0x0;
  14349. case 0x13 /*VT_UI4*/: ret = blob.read_shift(4); return ret;
  14350. case 0x1E /*VT_LPSTR*/: return parse_lpstr(blob, t, 4).replace(chr0,'');
  14351. case 0x1F /*VT_LPWSTR*/: return parse_lpwstr(blob);
  14352. case 0x40 /*VT_FILETIME*/: return parse_FILETIME(blob);
  14353. case 0x41 /*VT_BLOB*/: return parse_BLOB(blob);
  14354. case 0x47 /*VT_CF*/: return parse_ClipboardData(blob);
  14355. case 0x50 /*VT_STRING*/: return parse_VtString(blob, t, !opts.raw).replace(chr0,'');
  14356. case 0x51 /*VT_USTR*/: return parse_VtUnalignedString(blob, t/*, 4*/).replace(chr0,'');
  14357. case 0x100C /*VT_VECTOR|VT_VARIANT*/: return parse_VtVecHeadingPair(blob);
  14358. case 0x101E /*VT_LPSTR*/: return parse_VtVecUnalignedLpstr(blob);
  14359. default: throw new Error("TypedPropertyValue unrecognized type " + type + " " + t);
  14360. }
  14361. }
  14362. function write_TypedPropertyValue(type, value) {
  14363. var o = new_buf(4), p = new_buf(4);
  14364. o.write_shift(4, type == 0x50 ? 0x1F : type);
  14365. switch(type) {
  14366. case 0x03 /*VT_I4*/: p.write_shift(-4, value); break;
  14367. case 0x05 /*VT_I4*/: p = new_buf(8); p.write_shift(8, value, 'f'); break;
  14368. case 0x0B /*VT_BOOL*/: p.write_shift(4, value ? 0x01 : 0x00); break;
  14369. case 0x40 /*VT_FILETIME*/: p = write_FILETIME(value); break;
  14370. case 0x1F /*VT_LPWSTR*/:
  14371. case 0x50 /*VT_STRING*/:
  14372. p = new_buf(4 + 2 * (value.length + 1) + (value.length % 2 ? 0 : 2));
  14373. p.write_shift(4, value.length + 1);
  14374. p.write_shift(0, value, "dbcs");
  14375. while(p.l != p.length) p.write_shift(1, 0);
  14376. break;
  14377. default: throw new Error("TypedPropertyValue unrecognized type " + type + " " + value);
  14378. }
  14379. return bconcat([o, p]);
  14380. }
  14381. /* [MS-OLEPS] 2.20 PropertySet */
  14382. function parse_PropertySet(blob, PIDSI) {
  14383. var start_addr = blob.l;
  14384. var size = blob.read_shift(4);
  14385. var NumProps = blob.read_shift(4);
  14386. var Props = [], i = 0;
  14387. var CodePage = 0;
  14388. var Dictionary = -1, DictObj = ({});
  14389. for(i = 0; i != NumProps; ++i) {
  14390. var PropID = blob.read_shift(4);
  14391. var Offset = blob.read_shift(4);
  14392. Props[i] = [PropID, Offset + start_addr];
  14393. }
  14394. Props.sort(function(x,y) { return x[1] - y[1]; });
  14395. var PropH = {};
  14396. for(i = 0; i != NumProps; ++i) {
  14397. if(blob.l !== Props[i][1]) {
  14398. var fail = true;
  14399. if(i>0 && PIDSI) switch(PIDSI[Props[i-1][0]].t) {
  14400. case 0x02 /*VT_I2*/: if(blob.l+2 === Props[i][1]) { blob.l+=2; fail = false; } break;
  14401. case 0x50 /*VT_STRING*/: if(blob.l <= Props[i][1]) { blob.l=Props[i][1]; fail = false; } break;
  14402. case 0x100C /*VT_VECTOR|VT_VARIANT*/: if(blob.l <= Props[i][1]) { blob.l=Props[i][1]; fail = false; } break;
  14403. }
  14404. if((!PIDSI||i==0) && blob.l <= Props[i][1]) { fail=false; blob.l = Props[i][1]; }
  14405. if(fail) throw new Error("Read Error: Expected address " + Props[i][1] + ' at ' + blob.l + ' :' + i);
  14406. }
  14407. if(PIDSI) {
  14408. var piddsi = PIDSI[Props[i][0]];
  14409. PropH[piddsi.n] = parse_TypedPropertyValue(blob, piddsi.t, {raw:true});
  14410. if(piddsi.p === 'version') PropH[piddsi.n] = String(PropH[piddsi.n] >> 16) + "." + ("0000" + String(PropH[piddsi.n] & 0xFFFF)).slice(-4);
  14411. if(piddsi.n == "CodePage") switch(PropH[piddsi.n]) {
  14412. case 0: PropH[piddsi.n] = 1252;
  14413. /* falls through */
  14414. case 874:
  14415. case 932:
  14416. case 936:
  14417. case 949:
  14418. case 950:
  14419. case 1250:
  14420. case 1251:
  14421. case 1253:
  14422. case 1254:
  14423. case 1255:
  14424. case 1256:
  14425. case 1257:
  14426. case 1258:
  14427. case 10000:
  14428. case 1200:
  14429. case 1201:
  14430. case 1252:
  14431. case 65000: case -536:
  14432. case 65001: case -535:
  14433. set_cp(CodePage = (PropH[piddsi.n]>>>0) & 0xFFFF); break;
  14434. default: throw new Error("Unsupported CodePage: " + PropH[piddsi.n]);
  14435. }
  14436. } else {
  14437. if(Props[i][0] === 0x1) {
  14438. CodePage = PropH.CodePage = (parse_TypedPropertyValue(blob, VT_I2));
  14439. set_cp(CodePage);
  14440. if(Dictionary !== -1) {
  14441. var oldpos = blob.l;
  14442. blob.l = Props[Dictionary][1];
  14443. DictObj = parse_dictionary(blob,CodePage);
  14444. blob.l = oldpos;
  14445. }
  14446. } else if(Props[i][0] === 0) {
  14447. if(CodePage === 0) { Dictionary = i; blob.l = Props[i+1][1]; continue; }
  14448. DictObj = parse_dictionary(blob,CodePage);
  14449. } else {
  14450. var name = DictObj[Props[i][0]];
  14451. var val;
  14452. /* [MS-OSHARED] 2.3.3.2.3.1.2 + PROPVARIANT */
  14453. switch(blob[blob.l]) {
  14454. case 0x41 /*VT_BLOB*/: blob.l += 4; val = parse_BLOB(blob); break;
  14455. case 0x1E /*VT_LPSTR*/: blob.l += 4; val = parse_VtString(blob, blob[blob.l-4]).replace(/\u0000+$/,""); break;
  14456. case 0x1F /*VT_LPWSTR*/: blob.l += 4; val = parse_VtString(blob, blob[blob.l-4]).replace(/\u0000+$/,""); break;
  14457. case 0x03 /*VT_I4*/: blob.l += 4; val = blob.read_shift(4, 'i'); break;
  14458. case 0x13 /*VT_UI4*/: blob.l += 4; val = blob.read_shift(4); break;
  14459. case 0x05 /*VT_R8*/: blob.l += 4; val = blob.read_shift(8, 'f'); break;
  14460. case 0x0B /*VT_BOOL*/: blob.l += 4; val = parsebool(blob, 4); break;
  14461. case 0x40 /*VT_FILETIME*/: blob.l += 4; val = parseDate(parse_FILETIME(blob)); break;
  14462. default: throw new Error("unparsed value: " + blob[blob.l]);
  14463. }
  14464. PropH[name] = val;
  14465. }
  14466. }
  14467. }
  14468. blob.l = start_addr + size; /* step ahead to skip padding */
  14469. return PropH;
  14470. }
  14471. var XLSPSSkip = [ "CodePage", "Thumbnail", "_PID_LINKBASE", "_PID_HLINKS", "SystemIdentifier", "FMTID" ].concat(PseudoPropsPairs);
  14472. function guess_property_type(val) {
  14473. switch(typeof val) {
  14474. case "boolean": return 0x0B;
  14475. case "number": return ((val|0)==val) ? 0x03 : 0x05;
  14476. case "string": return 0x1F;
  14477. case "object": if(val instanceof Date) return 0x40; break;
  14478. }
  14479. return -1;
  14480. }
  14481. function write_PropertySet(entries, RE, PIDSI) {
  14482. var hdr = new_buf(8), piao = [], prop = [];
  14483. var sz = 8, i = 0;
  14484. var pr = new_buf(8), pio = new_buf(8);
  14485. pr.write_shift(4, 0x0002);
  14486. pr.write_shift(4, 0x04B0);
  14487. pio.write_shift(4, 0x0001);
  14488. prop.push(pr); piao.push(pio);
  14489. sz += 8 + pr.length;
  14490. if(!RE) {
  14491. pio = new_buf(8);
  14492. pio.write_shift(4, 0);
  14493. piao.unshift(pio);
  14494. var bufs = [new_buf(4)];
  14495. bufs[0].write_shift(4, entries.length);
  14496. for(i = 0; i < entries.length; ++i) {
  14497. var value = entries[i][0];
  14498. pr = new_buf(4 + 4 + 2 * (value.length + 1) + (value.length % 2 ? 0 : 2));
  14499. pr.write_shift(4, i+2);
  14500. pr.write_shift(4, value.length + 1);
  14501. pr.write_shift(0, value, "dbcs");
  14502. while(pr.l != pr.length) pr.write_shift(1, 0);
  14503. bufs.push(pr);
  14504. }
  14505. pr = bconcat(bufs);
  14506. prop.unshift(pr);
  14507. sz += 8 + pr.length;
  14508. }
  14509. for(i = 0; i < entries.length; ++i) {
  14510. if(RE && !RE[entries[i][0]]) continue;
  14511. if(XLSPSSkip.indexOf(entries[i][0]) > -1) continue;
  14512. if(entries[i][1] == null) continue;
  14513. var val = entries[i][1], idx = 0;
  14514. if(RE) {
  14515. idx = +RE[entries[i][0]];
  14516. var pinfo = (PIDSI)[idx];
  14517. if(pinfo.p == "version" && typeof val == "string") {
  14518. var arr = val.split(".");
  14519. val = ((+arr[0])<<16) + ((+arr[1])||0);
  14520. }
  14521. pr = write_TypedPropertyValue(pinfo.t, val);
  14522. } else {
  14523. var T = guess_property_type(val);
  14524. if(T == -1) { T = 0x1F; val = String(val); }
  14525. pr = write_TypedPropertyValue(T, val);
  14526. }
  14527. prop.push(pr);
  14528. pio = new_buf(8);
  14529. pio.write_shift(4, !RE ? 2+i : idx);
  14530. piao.push(pio);
  14531. sz += 8 + pr.length;
  14532. }
  14533. var w = 8 * (prop.length + 1);
  14534. for(i = 0; i < prop.length; ++i) { piao[i].write_shift(4, w); w += prop[i].length; }
  14535. hdr.write_shift(4, sz);
  14536. hdr.write_shift(4, prop.length);
  14537. return bconcat([hdr].concat(piao).concat(prop));
  14538. }
  14539. /* [MS-OLEPS] 2.21 PropertySetStream */
  14540. function parse_PropertySetStream(file, PIDSI, clsid) {
  14541. var blob = file.content;
  14542. if(!blob) return ({});
  14543. prep_blob(blob, 0);
  14544. var NumSets, FMTID0, FMTID1, Offset0, Offset1 = 0;
  14545. blob.chk('feff', 'Byte Order: ');
  14546. /*var vers = */blob.read_shift(2); // TODO: check version
  14547. var SystemIdentifier = blob.read_shift(4);
  14548. var CLSID = blob.read_shift(16);
  14549. if(CLSID !== CFB.utils.consts.HEADER_CLSID && CLSID !== clsid) throw new Error("Bad PropertySet CLSID " + CLSID);
  14550. NumSets = blob.read_shift(4);
  14551. if(NumSets !== 1 && NumSets !== 2) throw new Error("Unrecognized #Sets: " + NumSets);
  14552. FMTID0 = blob.read_shift(16); Offset0 = blob.read_shift(4);
  14553. if(NumSets === 1 && Offset0 !== blob.l) throw new Error("Length mismatch: " + Offset0 + " !== " + blob.l);
  14554. else if(NumSets === 2) { FMTID1 = blob.read_shift(16); Offset1 = blob.read_shift(4); }
  14555. var PSet0 = parse_PropertySet(blob, PIDSI);
  14556. var rval = ({ SystemIdentifier: SystemIdentifier });
  14557. for(var y in PSet0) rval[y] = PSet0[y];
  14558. //rval.blob = blob;
  14559. rval.FMTID = FMTID0;
  14560. //rval.PSet0 = PSet0;
  14561. if(NumSets === 1) return rval;
  14562. if(Offset1 - blob.l == 2) blob.l += 2;
  14563. if(blob.l !== Offset1) throw new Error("Length mismatch 2: " + blob.l + " !== " + Offset1);
  14564. var PSet1;
  14565. try { PSet1 = parse_PropertySet(blob, null); } catch(e) {/* empty */}
  14566. for(y in PSet1) rval[y] = PSet1[y];
  14567. rval.FMTID = [FMTID0, FMTID1]; // TODO: verify FMTID0/1
  14568. return rval;
  14569. }
  14570. function write_PropertySetStream(entries, clsid, RE, PIDSI, entries2, clsid2) {
  14571. var hdr = new_buf(entries2 ? 68 : 48);
  14572. var bufs = [hdr];
  14573. hdr.write_shift(2, 0xFFFE);
  14574. hdr.write_shift(2, 0x0000); /* TODO: type 1 props */
  14575. hdr.write_shift(4, 0x32363237);
  14576. hdr.write_shift(16, CFB.utils.consts.HEADER_CLSID, "hex");
  14577. hdr.write_shift(4, (entries2 ? 2 : 1));
  14578. hdr.write_shift(16, clsid, "hex");
  14579. hdr.write_shift(4, (entries2 ? 68 : 48));
  14580. var ps0 = write_PropertySet(entries, RE, PIDSI);
  14581. bufs.push(ps0);
  14582. if(entries2) {
  14583. var ps1 = write_PropertySet(entries2, null, null);
  14584. hdr.write_shift(16, clsid2, "hex");
  14585. hdr.write_shift(4, 68 + ps0.length);
  14586. bufs.push(ps1);
  14587. }
  14588. return bconcat(bufs);
  14589. }
  14590. function parsenoop2(blob, length) { blob.read_shift(length); return null; }
  14591. function writezeroes(n, o) { if(!o) o=new_buf(n); for(var j=0; j<n; ++j) o.write_shift(1, 0); return o; }
  14592. function parslurp(blob, length, cb) {
  14593. var arr = [], target = blob.l + length;
  14594. while(blob.l < target) arr.push(cb(blob, target - blob.l));
  14595. if(target !== blob.l) throw new Error("Slurp error");
  14596. return arr;
  14597. }
  14598. function parsebool(blob, length) { return blob.read_shift(length) === 0x1; }
  14599. function writebool(v, o) { if(!o) o=new_buf(2); o.write_shift(2, +!!v); return o; }
  14600. function parseuint16(blob) { return blob.read_shift(2, 'u'); }
  14601. function writeuint16(v, o) { if(!o) o=new_buf(2); o.write_shift(2, v); return o; }
  14602. function parseuint16a(blob, length) { return parslurp(blob,length,parseuint16);}
  14603. /* --- 2.5 Structures --- */
  14604. /* [MS-XLS] 2.5.10 Bes (boolean or error) */
  14605. function parse_Bes(blob) {
  14606. var v = blob.read_shift(1), t = blob.read_shift(1);
  14607. return t === 0x01 ? v : v === 0x01;
  14608. }
  14609. function write_Bes(v, t, o) {
  14610. if(!o) o = new_buf(2);
  14611. o.write_shift(1, +v);
  14612. o.write_shift(1, ((t == 'e') ? 1 : 0));
  14613. return o;
  14614. }
  14615. /* [MS-XLS] 2.5.240 ShortXLUnicodeString */
  14616. function parse_ShortXLUnicodeString(blob, length, opts) {
  14617. var cch = blob.read_shift(opts && opts.biff >= 12 ? 2 : 1);
  14618. var encoding = 'sbcs-cont';
  14619. var cp = current_codepage;
  14620. if(opts && opts.biff >= 8) current_codepage = 1200;
  14621. if(!opts || opts.biff == 8 ) {
  14622. var fHighByte = blob.read_shift(1);
  14623. if(fHighByte) { encoding = 'dbcs-cont'; }
  14624. } else if(opts.biff == 12) {
  14625. encoding = 'wstr';
  14626. }
  14627. if(opts.biff >= 2 && opts.biff <= 5) encoding = 'cpstr';
  14628. var o = cch ? blob.read_shift(cch, encoding) : "";
  14629. current_codepage = cp;
  14630. return o;
  14631. }
  14632. /* 2.5.293 XLUnicodeRichExtendedString */
  14633. function parse_XLUnicodeRichExtendedString(blob) {
  14634. var cp = current_codepage;
  14635. current_codepage = 1200;
  14636. var cch = blob.read_shift(2), flags = blob.read_shift(1);
  14637. var /*fHighByte = flags & 0x1,*/ fExtSt = flags & 0x4, fRichSt = flags & 0x8;
  14638. var width = 1 + (flags & 0x1); // 0x0 -> utf8, 0x1 -> dbcs
  14639. var cRun = 0, cbExtRst;
  14640. var z = {};
  14641. if(fRichSt) cRun = blob.read_shift(2);
  14642. if(fExtSt) cbExtRst = blob.read_shift(4);
  14643. var encoding = width == 2 ? 'dbcs-cont' : 'sbcs-cont';
  14644. var msg = cch === 0 ? "" : blob.read_shift(cch, encoding);
  14645. if(fRichSt) blob.l += 4 * cRun; //TODO: parse this
  14646. if(fExtSt) blob.l += cbExtRst; //TODO: parse this
  14647. z.t = msg;
  14648. if(!fRichSt) { z.raw = "<t>" + z.t + "</t>"; z.r = z.t; }
  14649. current_codepage = cp;
  14650. return z;
  14651. }
  14652. function write_XLUnicodeRichExtendedString(xlstr) {
  14653. var str = (xlstr.t||""), nfmts = 1;
  14654. var hdr = new_buf(3 + (nfmts > 1 ? 2 : 0));
  14655. hdr.write_shift(2, str.length);
  14656. hdr.write_shift(1, (nfmts > 1 ? 0x08 : 0x00) | 0x01);
  14657. if(nfmts > 1) hdr.write_shift(2, nfmts);
  14658. var otext = new_buf(2 * str.length);
  14659. otext.write_shift(2 * str.length, str, 'utf16le');
  14660. var out = [hdr, otext];
  14661. return bconcat(out);
  14662. }
  14663. /* 2.5.296 XLUnicodeStringNoCch */
  14664. function parse_XLUnicodeStringNoCch(blob, cch, opts) {
  14665. var retval;
  14666. if(opts) {
  14667. if(opts.biff >= 2 && opts.biff <= 5) return blob.read_shift(cch, 'cpstr');
  14668. if(opts.biff >= 12) return blob.read_shift(cch, 'dbcs-cont');
  14669. }
  14670. var fHighByte = blob.read_shift(1);
  14671. if(fHighByte===0) { retval = blob.read_shift(cch, 'sbcs-cont'); }
  14672. else { retval = blob.read_shift(cch, 'dbcs-cont'); }
  14673. return retval;
  14674. }
  14675. /* 2.5.294 XLUnicodeString */
  14676. function parse_XLUnicodeString(blob, length, opts) {
  14677. var cch = blob.read_shift(opts && opts.biff == 2 ? 1 : 2);
  14678. if(cch === 0) { blob.l++; return ""; }
  14679. return parse_XLUnicodeStringNoCch(blob, cch, opts);
  14680. }
  14681. /* BIFF5 override */
  14682. function parse_XLUnicodeString2(blob, length, opts) {
  14683. if(opts.biff > 5) return parse_XLUnicodeString(blob, length, opts);
  14684. var cch = blob.read_shift(1);
  14685. if(cch === 0) { blob.l++; return ""; }
  14686. return blob.read_shift(cch, (opts.biff <= 4 || !blob.lens ) ? 'cpstr' : 'sbcs-cont');
  14687. }
  14688. /* TODO: BIFF5 and lower, codepage awareness */
  14689. function write_XLUnicodeString(str, opts, o) {
  14690. if(!o) o = new_buf(3 + 2 * str.length);
  14691. o.write_shift(2, str.length);
  14692. o.write_shift(1, 1);
  14693. o.write_shift(31, str, 'utf16le');
  14694. return o;
  14695. }
  14696. /* [MS-XLS] 2.5.61 ControlInfo */
  14697. function parse_ControlInfo(blob) {
  14698. var flags = blob.read_shift(1);
  14699. blob.l++;
  14700. var accel = blob.read_shift(2);
  14701. blob.l += 2;
  14702. return [flags, accel];
  14703. }
  14704. /* [MS-OSHARED] 2.3.7.6 URLMoniker TODO: flags */
  14705. function parse_URLMoniker(blob) {
  14706. var len = blob.read_shift(4), start = blob.l;
  14707. var extra = false;
  14708. if(len > 24) {
  14709. /* look ahead */
  14710. blob.l += len - 24;
  14711. if(blob.read_shift(16) === "795881f43b1d7f48af2c825dc4852763") extra = true;
  14712. blob.l = start;
  14713. }
  14714. var url = blob.read_shift((extra?len-24:len)>>1, 'utf16le').replace(chr0,"");
  14715. if(extra) blob.l += 24;
  14716. return url;
  14717. }
  14718. /* [MS-OSHARED] 2.3.7.8 FileMoniker TODO: all fields */
  14719. function parse_FileMoniker(blob) {
  14720. blob.l += 2; //var cAnti = blob.read_shift(2);
  14721. var ansiPath = blob.read_shift(0, 'lpstr-ansi');
  14722. blob.l += 2; //var endServer = blob.read_shift(2);
  14723. if(blob.read_shift(2) != 0xDEAD) throw new Error("Bad FileMoniker");
  14724. var sz = blob.read_shift(4);
  14725. if(sz === 0) return ansiPath.replace(/\\/g,"/");
  14726. var bytes = blob.read_shift(4);
  14727. if(blob.read_shift(2) != 3) throw new Error("Bad FileMoniker");
  14728. var unicodePath = blob.read_shift(bytes>>1, 'utf16le').replace(chr0,"");
  14729. return unicodePath;
  14730. }
  14731. /* [MS-OSHARED] 2.3.7.2 HyperlinkMoniker TODO: all the monikers */
  14732. function parse_HyperlinkMoniker(blob, length) {
  14733. var clsid = blob.read_shift(16); length -= 16;
  14734. switch(clsid) {
  14735. case "e0c9ea79f9bace118c8200aa004ba90b": return parse_URLMoniker(blob, length);
  14736. case "0303000000000000c000000000000046": return parse_FileMoniker(blob, length);
  14737. default: throw new Error("Unsupported Moniker " + clsid);
  14738. }
  14739. }
  14740. /* [MS-OSHARED] 2.3.7.9 HyperlinkString */
  14741. function parse_HyperlinkString(blob) {
  14742. var len = blob.read_shift(4);
  14743. var o = len > 0 ? blob.read_shift(len, 'utf16le').replace(chr0, "") : "";
  14744. return o;
  14745. }
  14746. /* [MS-OSHARED] 2.3.7.1 Hyperlink Object */
  14747. function parse_Hyperlink(blob, length) {
  14748. var end = blob.l + length;
  14749. var sVer = blob.read_shift(4);
  14750. if(sVer !== 2) throw new Error("Unrecognized streamVersion: " + sVer);
  14751. var flags = blob.read_shift(2);
  14752. blob.l += 2;
  14753. var displayName, targetFrameName, moniker, oleMoniker, Loc="", guid, fileTime;
  14754. if(flags & 0x0010) displayName = parse_HyperlinkString(blob, end - blob.l);
  14755. if(flags & 0x0080) targetFrameName = parse_HyperlinkString(blob, end - blob.l);
  14756. if((flags & 0x0101) === 0x0101) moniker = parse_HyperlinkString(blob, end - blob.l);
  14757. if((flags & 0x0101) === 0x0001) oleMoniker = parse_HyperlinkMoniker(blob, end - blob.l);
  14758. if(flags & 0x0008) Loc = parse_HyperlinkString(blob, end - blob.l);
  14759. if(flags & 0x0020) guid = blob.read_shift(16);
  14760. if(flags & 0x0040) fileTime = parse_FILETIME(blob/*, 8*/);
  14761. blob.l = end;
  14762. var target = targetFrameName||moniker||oleMoniker||"";
  14763. if(target && Loc) target+="#"+Loc;
  14764. if(!target) target = "#" + Loc;
  14765. var out = ({Target:target});
  14766. if(guid) out.guid = guid;
  14767. if(fileTime) out.time = fileTime;
  14768. if(displayName) out.Tooltip = displayName;
  14769. return out;
  14770. }
  14771. function write_Hyperlink(hl) {
  14772. var out = new_buf(512), i = 0;
  14773. var Target = hl.Target;
  14774. var F = Target.indexOf("#") > -1 ? 0x1f : 0x17;
  14775. switch(Target.charAt(0)) { case "#": F=0x1c; break; case ".": F&=~2; break; }
  14776. out.write_shift(4,2); out.write_shift(4, F);
  14777. var data = [8,6815827,6619237,4849780,83]; for(i = 0; i < data.length; ++i) out.write_shift(4, data[i]);
  14778. if(F == 0x1C) {
  14779. Target = Target.slice(1);
  14780. out.write_shift(4, Target.length + 1);
  14781. for(i = 0; i < Target.length; ++i) out.write_shift(2, Target.charCodeAt(i));
  14782. out.write_shift(2, 0);
  14783. } else if(F & 0x02) {
  14784. data = "e0 c9 ea 79 f9 ba ce 11 8c 82 00 aa 00 4b a9 0b".split(" ");
  14785. for(i = 0; i < data.length; ++i) out.write_shift(1, parseInt(data[i], 16));
  14786. out.write_shift(4, 2*(Target.length + 1));
  14787. for(i = 0; i < Target.length; ++i) out.write_shift(2, Target.charCodeAt(i));
  14788. out.write_shift(2, 0);
  14789. } else {
  14790. data = "03 03 00 00 00 00 00 00 c0 00 00 00 00 00 00 46".split(" ");
  14791. for(i = 0; i < data.length; ++i) out.write_shift(1, parseInt(data[i], 16));
  14792. var P = 0;
  14793. while(Target.slice(P*3,P*3+3)=="../"||Target.slice(P*3,P*3+3)=="..\\") ++P;
  14794. out.write_shift(2, P);
  14795. out.write_shift(4, Target.length + 1);
  14796. for(i = 0; i < Target.length; ++i) out.write_shift(1, Target.charCodeAt(i) & 0xFF);
  14797. out.write_shift(1, 0);
  14798. out.write_shift(2, 0xFFFF);
  14799. out.write_shift(2, 0xDEAD);
  14800. for(i = 0; i < 6; ++i) out.write_shift(4, 0);
  14801. }
  14802. return out.slice(0, out.l);
  14803. }
  14804. /* 2.5.178 LongRGBA */
  14805. function parse_LongRGBA(blob) { var r = blob.read_shift(1), g = blob.read_shift(1), b = blob.read_shift(1), a = blob.read_shift(1); return [r,g,b,a]; }
  14806. /* 2.5.177 LongRGB */
  14807. function parse_LongRGB(blob, length) { var x = parse_LongRGBA(blob, length); x[3] = 0; return x; }
  14808. /* [MS-XLS] 2.5.19 */
  14809. function parse_XLSCell(blob) {
  14810. var rw = blob.read_shift(2); // 0-indexed
  14811. var col = blob.read_shift(2);
  14812. var ixfe = blob.read_shift(2);
  14813. return ({r:rw, c:col, ixfe:ixfe});
  14814. }
  14815. function write_XLSCell(R, C, ixfe, o) {
  14816. if(!o) o = new_buf(6);
  14817. o.write_shift(2, R);
  14818. o.write_shift(2, C);
  14819. o.write_shift(2, ixfe||0);
  14820. return o;
  14821. }
  14822. /* [MS-XLS] 2.5.134 */
  14823. function parse_frtHeader(blob) {
  14824. var rt = blob.read_shift(2);
  14825. var flags = blob.read_shift(2); // TODO: parse these flags
  14826. blob.l += 8;
  14827. return {type: rt, flags: flags};
  14828. }
  14829. function parse_OptXLUnicodeString(blob, length, opts) { return length === 0 ? "" : parse_XLUnicodeString2(blob, length, opts); }
  14830. /* [MS-XLS] 2.5.344 */
  14831. function parse_XTI(blob, length, opts) {
  14832. var w = opts.biff > 8 ? 4 : 2;
  14833. var iSupBook = blob.read_shift(w), itabFirst = blob.read_shift(w,'i'), itabLast = blob.read_shift(w,'i');
  14834. return [iSupBook, itabFirst, itabLast];
  14835. }
  14836. /* [MS-XLS] 2.5.218 */
  14837. function parse_RkRec(blob) {
  14838. var ixfe = blob.read_shift(2);
  14839. var RK = parse_RkNumber(blob);
  14840. return [ixfe, RK];
  14841. }
  14842. /* [MS-XLS] 2.5.1 */
  14843. function parse_AddinUdf(blob, length, opts) {
  14844. blob.l += 4; length -= 4;
  14845. var l = blob.l + length;
  14846. var udfName = parse_ShortXLUnicodeString(blob, length, opts);
  14847. var cb = blob.read_shift(2);
  14848. l -= blob.l;
  14849. if(cb !== l) throw new Error("Malformed AddinUdf: padding = " + l + " != " + cb);
  14850. blob.l += cb;
  14851. return udfName;
  14852. }
  14853. /* [MS-XLS] 2.5.209 TODO: Check sizes */
  14854. function parse_Ref8U(blob) {
  14855. var rwFirst = blob.read_shift(2);
  14856. var rwLast = blob.read_shift(2);
  14857. var colFirst = blob.read_shift(2);
  14858. var colLast = blob.read_shift(2);
  14859. return {s:{c:colFirst, r:rwFirst}, e:{c:colLast,r:rwLast}};
  14860. }
  14861. function write_Ref8U(r, o) {
  14862. if(!o) o = new_buf(8);
  14863. o.write_shift(2, r.s.r);
  14864. o.write_shift(2, r.e.r);
  14865. o.write_shift(2, r.s.c);
  14866. o.write_shift(2, r.e.c);
  14867. return o;
  14868. }
  14869. /* [MS-XLS] 2.5.211 */
  14870. function parse_RefU(blob) {
  14871. var rwFirst = blob.read_shift(2);
  14872. var rwLast = blob.read_shift(2);
  14873. var colFirst = blob.read_shift(1);
  14874. var colLast = blob.read_shift(1);
  14875. return {s:{c:colFirst, r:rwFirst}, e:{c:colLast,r:rwLast}};
  14876. }
  14877. /* [MS-XLS] 2.5.207 */
  14878. var parse_Ref = parse_RefU;
  14879. /* [MS-XLS] 2.5.143 */
  14880. function parse_FtCmo(blob) {
  14881. blob.l += 4;
  14882. var ot = blob.read_shift(2);
  14883. var id = blob.read_shift(2);
  14884. var flags = blob.read_shift(2);
  14885. blob.l+=12;
  14886. return [id, ot, flags];
  14887. }
  14888. /* [MS-XLS] 2.5.149 */
  14889. function parse_FtNts(blob) {
  14890. var out = {};
  14891. blob.l += 4;
  14892. blob.l += 16; // GUID TODO
  14893. out.fSharedNote = blob.read_shift(2);
  14894. blob.l += 4;
  14895. return out;
  14896. }
  14897. /* [MS-XLS] 2.5.142 */
  14898. function parse_FtCf(blob) {
  14899. var out = {};
  14900. blob.l += 4;
  14901. blob.cf = blob.read_shift(2);
  14902. return out;
  14903. }
  14904. /* [MS-XLS] 2.5.140 - 2.5.154 and friends */
  14905. function parse_FtSkip(blob) { blob.l += 2; blob.l += blob.read_shift(2); }
  14906. var FtTab = {
  14907. 0x00: parse_FtSkip, /* FtEnd */
  14908. 0x04: parse_FtSkip, /* FtMacro */
  14909. 0x05: parse_FtSkip, /* FtButton */
  14910. 0x06: parse_FtSkip, /* FtGmo */
  14911. 0x07: parse_FtCf, /* FtCf */
  14912. 0x08: parse_FtSkip, /* FtPioGrbit */
  14913. 0x09: parse_FtSkip, /* FtPictFmla */
  14914. 0x0A: parse_FtSkip, /* FtCbls */
  14915. 0x0B: parse_FtSkip, /* FtRbo */
  14916. 0x0C: parse_FtSkip, /* FtSbs */
  14917. 0x0D: parse_FtNts, /* FtNts */
  14918. 0x0E: parse_FtSkip, /* FtSbsFmla */
  14919. 0x0F: parse_FtSkip, /* FtGboData */
  14920. 0x10: parse_FtSkip, /* FtEdoData */
  14921. 0x11: parse_FtSkip, /* FtRboData */
  14922. 0x12: parse_FtSkip, /* FtCblsData */
  14923. 0x13: parse_FtSkip, /* FtLbsData */
  14924. 0x14: parse_FtSkip, /* FtCblsFmla */
  14925. 0x15: parse_FtCmo
  14926. };
  14927. function parse_FtArray(blob, length) {
  14928. var tgt = blob.l + length;
  14929. var fts = [];
  14930. while(blob.l < tgt) {
  14931. var ft = blob.read_shift(2);
  14932. blob.l-=2;
  14933. try {
  14934. fts.push(FtTab[ft](blob, tgt - blob.l));
  14935. } catch(e) { blob.l = tgt; return fts; }
  14936. }
  14937. if(blob.l != tgt) blob.l = tgt; //throw new Error("bad Object Ft-sequence");
  14938. return fts;
  14939. }
  14940. /* --- 2.4 Records --- */
  14941. /* [MS-XLS] 2.4.21 */
  14942. function parse_BOF(blob, length) {
  14943. var o = {BIFFVer:0, dt:0};
  14944. o.BIFFVer = blob.read_shift(2); length -= 2;
  14945. if(length >= 2) { o.dt = blob.read_shift(2); blob.l -= 2; }
  14946. switch(o.BIFFVer) {
  14947. case 0x0600: /* BIFF8 */
  14948. case 0x0500: /* BIFF5 */
  14949. case 0x0400: /* BIFF4 */
  14950. case 0x0300: /* BIFF3 */
  14951. case 0x0200: /* BIFF2 */
  14952. case 0x0002: case 0x0007: /* BIFF2 */
  14953. break;
  14954. default: if(length > 6) throw new Error("Unexpected BIFF Ver " + o.BIFFVer);
  14955. }
  14956. blob.read_shift(length);
  14957. return o;
  14958. }
  14959. function write_BOF(wb, t, o) {
  14960. var h = 0x0600, w = 16;
  14961. switch(o.bookType) {
  14962. case 'biff8': break;
  14963. case 'biff5': h = 0x0500; w = 8; break;
  14964. case 'biff4': h = 0x0004; w = 6; break;
  14965. case 'biff3': h = 0x0003; w = 6; break;
  14966. case 'biff2': h = 0x0002; w = 4; break;
  14967. case 'xla': break;
  14968. default: throw new Error("unsupported BIFF version");
  14969. }
  14970. var out = new_buf(w);
  14971. out.write_shift(2, h);
  14972. out.write_shift(2, t);
  14973. if(w > 4) out.write_shift(2, 0x7262);
  14974. if(w > 6) out.write_shift(2, 0x07CD);
  14975. if(w > 8) {
  14976. out.write_shift(2, 0xC009);
  14977. out.write_shift(2, 0x0001);
  14978. out.write_shift(2, 0x0706);
  14979. out.write_shift(2, 0x0000);
  14980. }
  14981. return out;
  14982. }
  14983. /* [MS-XLS] 2.4.146 */
  14984. function parse_InterfaceHdr(blob, length) {
  14985. if(length === 0) return 0x04b0;
  14986. if((blob.read_shift(2))!==0x04b0){/* empty */}
  14987. return 0x04b0;
  14988. }
  14989. /* [MS-XLS] 2.4.349 */
  14990. function parse_WriteAccess(blob, length, opts) {
  14991. if(opts.enc) { blob.l += length; return ""; }
  14992. var l = blob.l;
  14993. // TODO: make sure XLUnicodeString doesnt overrun
  14994. var UserName = parse_XLUnicodeString2(blob, 0, opts);
  14995. blob.read_shift(length + l - blob.l);
  14996. return UserName;
  14997. }
  14998. function write_WriteAccess(s, opts) {
  14999. var b8 = !opts || opts.biff == 8;
  15000. var o = new_buf(b8 ? 112 : 54);
  15001. o.write_shift(opts.biff == 8 ? 2 : 1, 7);
  15002. if(b8) o.write_shift(1, 0);
  15003. o.write_shift(4, 0x33336853);
  15004. o.write_shift(4, (0x00534A74 | (b8 ? 0 : 0x20000000)));
  15005. while(o.l < o.length) o.write_shift(1, (b8 ? 0 : 32));
  15006. return o;
  15007. }
  15008. /* [MS-XLS] 2.4.351 */
  15009. function parse_WsBool(blob, length, opts) {
  15010. var flags = opts && opts.biff == 8 || length == 2 ? blob.read_shift(2) : (blob.l += length, 0);
  15011. return { fDialog: flags & 0x10 };
  15012. }
  15013. /* [MS-XLS] 2.4.28 */
  15014. function parse_BoundSheet8(blob, length, opts) {
  15015. var pos = blob.read_shift(4);
  15016. var hidden = blob.read_shift(1) & 0x03;
  15017. var dt = blob.read_shift(1);
  15018. switch(dt) {
  15019. case 0: dt = 'Worksheet'; break;
  15020. case 1: dt = 'Macrosheet'; break;
  15021. case 2: dt = 'Chartsheet'; break;
  15022. case 6: dt = 'VBAModule'; break;
  15023. }
  15024. var name = parse_ShortXLUnicodeString(blob, 0, opts);
  15025. if(name.length === 0) name = "Sheet1";
  15026. return { pos:pos, hs:hidden, dt:dt, name:name };
  15027. }
  15028. function write_BoundSheet8(data, opts) {
  15029. var w = (!opts || opts.biff >= 8 ? 2 : 1);
  15030. var o = new_buf(8 + w * data.name.length);
  15031. o.write_shift(4, data.pos);
  15032. o.write_shift(1, data.hs || 0);
  15033. o.write_shift(1, data.dt);
  15034. o.write_shift(1, data.name.length);
  15035. if(opts.biff >= 8) o.write_shift(1, 1);
  15036. o.write_shift(w * data.name.length, data.name, opts.biff < 8 ? 'sbcs' : 'utf16le');
  15037. var out = o.slice(0, o.l);
  15038. out.l = o.l; return out;
  15039. }
  15040. /* [MS-XLS] 2.4.265 TODO */
  15041. function parse_SST(blob, length) {
  15042. var end = blob.l + length;
  15043. var cnt = blob.read_shift(4);
  15044. var ucnt = blob.read_shift(4);
  15045. var strs = ([]);
  15046. for(var i = 0; i != ucnt && blob.l < end; ++i) {
  15047. strs.push(parse_XLUnicodeRichExtendedString(blob));
  15048. }
  15049. strs.Count = cnt; strs.Unique = ucnt;
  15050. return strs;
  15051. }
  15052. function write_SST(sst, opts) {
  15053. var header = new_buf(8);
  15054. header.write_shift(4, sst.Count);
  15055. header.write_shift(4, sst.Unique);
  15056. var strs = [];
  15057. for(var j = 0; j < sst.length; ++j) strs[j] = write_XLUnicodeRichExtendedString(sst[j], opts);
  15058. var o = bconcat([header].concat(strs));
  15059. o.parts = [header.length].concat(strs.map(function(str) { return str.length; }));
  15060. return o;
  15061. }
  15062. /* [MS-XLS] 2.4.107 */
  15063. function parse_ExtSST(blob, length) {
  15064. var extsst = {};
  15065. extsst.dsst = blob.read_shift(2);
  15066. blob.l += length-2;
  15067. return extsst;
  15068. }
  15069. /* [MS-XLS] 2.4.221 TODO: check BIFF2-4 */
  15070. function parse_Row(blob) {
  15071. var z = ({});
  15072. z.r = blob.read_shift(2);
  15073. z.c = blob.read_shift(2);
  15074. z.cnt = blob.read_shift(2) - z.c;
  15075. var miyRw = blob.read_shift(2);
  15076. blob.l += 4; // reserved(2), unused(2)
  15077. var flags = blob.read_shift(1); // various flags
  15078. blob.l += 3; // reserved(8), ixfe(12), flags(4)
  15079. if(flags & 0x07) z.level = flags & 0x07;
  15080. // collapsed: flags & 0x10
  15081. if(flags & 0x20) z.hidden = true;
  15082. if(flags & 0x40) z.hpt = miyRw / 20;
  15083. return z;
  15084. }
  15085. /* [MS-XLS] 2.4.125 */
  15086. function parse_ForceFullCalculation(blob) {
  15087. var header = parse_frtHeader(blob);
  15088. if(header.type != 0x08A3) throw new Error("Invalid Future Record " + header.type);
  15089. var fullcalc = blob.read_shift(4);
  15090. return fullcalc !== 0x0;
  15091. }
  15092. /* [MS-XLS] 2.4.215 rt */
  15093. function parse_RecalcId(blob) {
  15094. blob.read_shift(2);
  15095. return blob.read_shift(4);
  15096. }
  15097. /* [MS-XLS] 2.4.87 */
  15098. function parse_DefaultRowHeight(blob, length, opts) {
  15099. var f = 0;
  15100. if(!(opts && opts.biff == 2)) {
  15101. f = blob.read_shift(2);
  15102. }
  15103. var miyRw = blob.read_shift(2);
  15104. if((opts && opts.biff == 2)) {
  15105. f = 1 - (miyRw >> 15); miyRw &= 0x7fff;
  15106. }
  15107. var fl = {Unsynced:f&1,DyZero:(f&2)>>1,ExAsc:(f&4)>>2,ExDsc:(f&8)>>3};
  15108. return [fl, miyRw];
  15109. }
  15110. /* [MS-XLS] 2.4.345 TODO */
  15111. function parse_Window1(blob) {
  15112. var xWn = blob.read_shift(2), yWn = blob.read_shift(2), dxWn = blob.read_shift(2), dyWn = blob.read_shift(2);
  15113. var flags = blob.read_shift(2), iTabCur = blob.read_shift(2), iTabFirst = blob.read_shift(2);
  15114. var ctabSel = blob.read_shift(2), wTabRatio = blob.read_shift(2);
  15115. return { Pos: [xWn, yWn], Dim: [dxWn, dyWn], Flags: flags, CurTab: iTabCur,
  15116. FirstTab: iTabFirst, Selected: ctabSel, TabRatio: wTabRatio };
  15117. }
  15118. function write_Window1() {
  15119. var o = new_buf(18);
  15120. o.write_shift(2, 0);
  15121. o.write_shift(2, 0);
  15122. o.write_shift(2, 0x7260);
  15123. o.write_shift(2, 0x44c0);
  15124. o.write_shift(2, 0x38);
  15125. o.write_shift(2, 0);
  15126. o.write_shift(2, 0);
  15127. o.write_shift(2, 1);
  15128. o.write_shift(2, 0x01f4);
  15129. return o;
  15130. }
  15131. /* [MS-XLS] 2.4.346 TODO */
  15132. function parse_Window2(blob, length, opts) {
  15133. if(opts && opts.biff >= 2 && opts.biff < 5) return {};
  15134. var f = blob.read_shift(2);
  15135. return { RTL: f & 0x40 };
  15136. }
  15137. function write_Window2(view) {
  15138. var o = new_buf(18), f = 0x6b6;
  15139. if(view && view.RTL) f |= 0x40;
  15140. o.write_shift(2, f);
  15141. o.write_shift(4, 0);
  15142. o.write_shift(4, 64);
  15143. o.write_shift(4, 0);
  15144. o.write_shift(4, 0);
  15145. return o;
  15146. }
  15147. /* [MS-XLS] 2.4.189 TODO */
  15148. function parse_Pane(/*blob, length, opts*/) {
  15149. }
  15150. /* [MS-XLS] 2.4.122 TODO */
  15151. function parse_Font(blob, length, opts) {
  15152. var o = {
  15153. dyHeight: blob.read_shift(2),
  15154. fl: blob.read_shift(2)
  15155. };
  15156. switch((opts && opts.biff) || 8) {
  15157. case 2: break;
  15158. case 3: case 4: blob.l += 2; break;
  15159. default: blob.l += 10; break;
  15160. }
  15161. o.name = parse_ShortXLUnicodeString(blob, 0, opts);
  15162. return o;
  15163. }
  15164. function write_Font(data, opts) {
  15165. var name = data.name || "Arial";
  15166. var b5 = (opts && (opts.biff == 5)), w = (b5 ? (15 + name.length) : (16 + 2 * name.length));
  15167. var o = new_buf(w);
  15168. o.write_shift(2, (data.sz || 12) * 20);
  15169. o.write_shift(4, 0);
  15170. o.write_shift(2, 400);
  15171. o.write_shift(4, 0);
  15172. o.write_shift(2, 0);
  15173. o.write_shift(1, name.length);
  15174. if(!b5) o.write_shift(1, 1);
  15175. o.write_shift((b5 ? 1 : 2) * name.length, name, (b5 ? "sbcs" : "utf16le"));
  15176. return o;
  15177. }
  15178. /* [MS-XLS] 2.4.149 */
  15179. function parse_LabelSst(blob) {
  15180. var cell = parse_XLSCell(blob);
  15181. cell.isst = blob.read_shift(4);
  15182. return cell;
  15183. }
  15184. function write_LabelSst(R, C, v, os ) {
  15185. var o = new_buf(10);
  15186. write_XLSCell(R, C, os, o);
  15187. o.write_shift(4, v);
  15188. return o;
  15189. }
  15190. /* [MS-XLS] 2.4.148 */
  15191. function parse_Label(blob, length, opts) {
  15192. var target = blob.l + length;
  15193. var cell = parse_XLSCell(blob, 6);
  15194. if(opts.biff == 2) blob.l++;
  15195. var str = parse_XLUnicodeString(blob, target - blob.l, opts);
  15196. cell.val = str;
  15197. return cell;
  15198. }
  15199. function write_Label(R, C, v, os, opts) {
  15200. var b8 = !opts || opts.biff == 8;
  15201. var o = new_buf(6 + 2 + (+b8) + (1 + b8) * v.length);
  15202. write_XLSCell(R, C, os, o);
  15203. o.write_shift(2, v.length);
  15204. if(b8) o.write_shift(1, 1);
  15205. o.write_shift((1 + b8) * v.length, v, b8 ? 'utf16le' : 'sbcs');
  15206. return o;
  15207. }
  15208. /* [MS-XLS] 2.4.126 Number Formats */
  15209. function parse_Format(blob, length, opts) {
  15210. var numFmtId = blob.read_shift(2);
  15211. var fmtstr = parse_XLUnicodeString2(blob, 0, opts);
  15212. return [numFmtId, fmtstr];
  15213. }
  15214. function write_Format(i, f, opts, o) {
  15215. var b5 = (opts && (opts.biff == 5));
  15216. if(!o) o = new_buf(b5 ? (3 + f.length) : (5 + 2 * f.length));
  15217. o.write_shift(2, i);
  15218. o.write_shift((b5 ? 1 : 2), f.length);
  15219. if(!b5) o.write_shift(1, 1);
  15220. o.write_shift((b5 ? 1 : 2) * f.length, f, (b5 ? 'sbcs' : 'utf16le'));
  15221. var out = (o.length > o.l) ? o.slice(0, o.l) : o;
  15222. if(out.l == null) out.l = out.length;
  15223. return out;
  15224. }
  15225. var parse_BIFF2Format = parse_XLUnicodeString2;
  15226. /* [MS-XLS] 2.4.90 */
  15227. function parse_Dimensions(blob, length, opts) {
  15228. var end = blob.l + length;
  15229. var w = opts.biff == 8 || !opts.biff ? 4 : 2;
  15230. var r = blob.read_shift(w), R = blob.read_shift(w);
  15231. var c = blob.read_shift(2), C = blob.read_shift(2);
  15232. blob.l = end;
  15233. return {s: {r:r, c:c}, e: {r:R, c:C}};
  15234. }
  15235. function write_Dimensions(range, opts) {
  15236. var w = opts.biff == 8 || !opts.biff ? 4 : 2;
  15237. var o = new_buf(2*w + 6);
  15238. o.write_shift(w, range.s.r);
  15239. o.write_shift(w, range.e.r + 1);
  15240. o.write_shift(2, range.s.c);
  15241. o.write_shift(2, range.e.c + 1);
  15242. o.write_shift(2, 0);
  15243. return o;
  15244. }
  15245. /* [MS-XLS] 2.4.220 */
  15246. function parse_RK(blob) {
  15247. var rw = blob.read_shift(2), col = blob.read_shift(2);
  15248. var rkrec = parse_RkRec(blob);
  15249. return {r:rw, c:col, ixfe:rkrec[0], rknum:rkrec[1]};
  15250. }
  15251. /* [MS-XLS] 2.4.175 */
  15252. function parse_MulRk(blob, length) {
  15253. var target = blob.l + length - 2;
  15254. var rw = blob.read_shift(2), col = blob.read_shift(2);
  15255. var rkrecs = [];
  15256. while(blob.l < target) rkrecs.push(parse_RkRec(blob));
  15257. if(blob.l !== target) throw new Error("MulRK read error");
  15258. var lastcol = blob.read_shift(2);
  15259. if(rkrecs.length != lastcol - col + 1) throw new Error("MulRK length mismatch");
  15260. return {r:rw, c:col, C:lastcol, rkrec:rkrecs};
  15261. }
  15262. /* [MS-XLS] 2.4.174 */
  15263. function parse_MulBlank(blob, length) {
  15264. var target = blob.l + length - 2;
  15265. var rw = blob.read_shift(2), col = blob.read_shift(2);
  15266. var ixfes = [];
  15267. while(blob.l < target) ixfes.push(blob.read_shift(2));
  15268. if(blob.l !== target) throw new Error("MulBlank read error");
  15269. var lastcol = blob.read_shift(2);
  15270. if(ixfes.length != lastcol - col + 1) throw new Error("MulBlank length mismatch");
  15271. return {r:rw, c:col, C:lastcol, ixfe:ixfes};
  15272. }
  15273. /* [MS-XLS] 2.5.20 2.5.249 TODO: interpret values here */
  15274. function parse_CellStyleXF(blob, length, style, opts) {
  15275. var o = {};
  15276. var a = blob.read_shift(4), b = blob.read_shift(4);
  15277. var c = blob.read_shift(4), d = blob.read_shift(2);
  15278. o.patternType = XLSFillPattern[c >> 26];
  15279. if(!opts.cellStyles) return o;
  15280. o.alc = a & 0x07;
  15281. o.fWrap = (a >> 3) & 0x01;
  15282. o.alcV = (a >> 4) & 0x07;
  15283. o.fJustLast = (a >> 7) & 0x01;
  15284. o.trot = (a >> 8) & 0xFF;
  15285. o.cIndent = (a >> 16) & 0x0F;
  15286. o.fShrinkToFit = (a >> 20) & 0x01;
  15287. o.iReadOrder = (a >> 22) & 0x02;
  15288. o.fAtrNum = (a >> 26) & 0x01;
  15289. o.fAtrFnt = (a >> 27) & 0x01;
  15290. o.fAtrAlc = (a >> 28) & 0x01;
  15291. o.fAtrBdr = (a >> 29) & 0x01;
  15292. o.fAtrPat = (a >> 30) & 0x01;
  15293. o.fAtrProt = (a >> 31) & 0x01;
  15294. o.dgLeft = b & 0x0F;
  15295. o.dgRight = (b >> 4) & 0x0F;
  15296. o.dgTop = (b >> 8) & 0x0F;
  15297. o.dgBottom = (b >> 12) & 0x0F;
  15298. o.icvLeft = (b >> 16) & 0x7F;
  15299. o.icvRight = (b >> 23) & 0x7F;
  15300. o.grbitDiag = (b >> 30) & 0x03;
  15301. o.icvTop = c & 0x7F;
  15302. o.icvBottom = (c >> 7) & 0x7F;
  15303. o.icvDiag = (c >> 14) & 0x7F;
  15304. o.dgDiag = (c >> 21) & 0x0F;
  15305. o.icvFore = d & 0x7F;
  15306. o.icvBack = (d >> 7) & 0x7F;
  15307. o.fsxButton = (d >> 14) & 0x01;
  15308. return o;
  15309. }
  15310. //function parse_CellXF(blob, length, opts) {return parse_CellStyleXF(blob,length,0, opts);}
  15311. //function parse_StyleXF(blob, length, opts) {return parse_CellStyleXF(blob,length,1, opts);}
  15312. /* [MS-XLS] 2.4.353 TODO: actually do this right */
  15313. function parse_XF(blob, length, opts) {
  15314. var o = {};
  15315. o.ifnt = blob.read_shift(2); o.numFmtId = blob.read_shift(2); o.flags = blob.read_shift(2);
  15316. o.fStyle = (o.flags >> 2) & 0x01;
  15317. length -= 6;
  15318. o.data = parse_CellStyleXF(blob, length, o.fStyle, opts);
  15319. return o;
  15320. }
  15321. function write_XF(data, ixfeP, opts, o) {
  15322. var b5 = (opts && (opts.biff == 5));
  15323. if(!o) o = new_buf(b5 ? 16 : 20);
  15324. o.write_shift(2, 0);
  15325. if(data.style) {
  15326. o.write_shift(2, (data.numFmtId||0));
  15327. o.write_shift(2, 0xFFF4);
  15328. } else {
  15329. o.write_shift(2, (data.numFmtId||0));
  15330. o.write_shift(2, (ixfeP<<4));
  15331. }
  15332. o.write_shift(4, 0);
  15333. o.write_shift(4, 0);
  15334. if(!b5) o.write_shift(4, 0);
  15335. o.write_shift(2, 0);
  15336. return o;
  15337. }
  15338. /* [MS-XLS] 2.4.134 */
  15339. function parse_Guts(blob) {
  15340. blob.l += 4;
  15341. var out = [blob.read_shift(2), blob.read_shift(2)];
  15342. if(out[0] !== 0) out[0]--;
  15343. if(out[1] !== 0) out[1]--;
  15344. if(out[0] > 7 || out[1] > 7) throw new Error("Bad Gutters: " + out.join("|"));
  15345. return out;
  15346. }
  15347. function write_Guts(guts) {
  15348. var o = new_buf(8);
  15349. o.write_shift(4, 0);
  15350. o.write_shift(2, guts[0] ? guts[0] + 1 : 0);
  15351. o.write_shift(2, guts[1] ? guts[1] + 1 : 0);
  15352. return o;
  15353. }
  15354. /* [MS-XLS] 2.4.24 */
  15355. function parse_BoolErr(blob, length, opts) {
  15356. var cell = parse_XLSCell(blob, 6);
  15357. if(opts.biff == 2) ++blob.l;
  15358. var val = parse_Bes(blob, 2);
  15359. cell.val = val;
  15360. cell.t = (val === true || val === false) ? 'b' : 'e';
  15361. return cell;
  15362. }
  15363. function write_BoolErr(R, C, v, os, opts, t) {
  15364. var o = new_buf(8);
  15365. write_XLSCell(R, C, os, o);
  15366. write_Bes(v, t, o);
  15367. return o;
  15368. }
  15369. /* [MS-XLS] 2.4.180 Number */
  15370. function parse_Number(blob) {
  15371. var cell = parse_XLSCell(blob, 6);
  15372. var xnum = parse_Xnum(blob, 8);
  15373. cell.val = xnum;
  15374. return cell;
  15375. }
  15376. function write_Number(R, C, v, os) {
  15377. var o = new_buf(14);
  15378. write_XLSCell(R, C, os, o);
  15379. write_Xnum(v, o);
  15380. return o;
  15381. }
  15382. var parse_XLHeaderFooter = parse_OptXLUnicodeString; // TODO: parse 2.4.136
  15383. /* [MS-XLS] 2.4.271 */
  15384. function parse_SupBook(blob, length, opts) {
  15385. var end = blob.l + length;
  15386. var ctab = blob.read_shift(2);
  15387. var cch = blob.read_shift(2);
  15388. opts.sbcch = cch;
  15389. if(cch == 0x0401 || cch == 0x3A01) return [cch, ctab];
  15390. if(cch < 0x01 || cch >0xff) throw new Error("Unexpected SupBook type: "+cch);
  15391. var virtPath = parse_XLUnicodeStringNoCch(blob, cch);
  15392. /* TODO: 2.5.277 Virtual Path */
  15393. var rgst = [];
  15394. while(end > blob.l) rgst.push(parse_XLUnicodeString(blob));
  15395. return [cch, ctab, virtPath, rgst];
  15396. }
  15397. /* [MS-XLS] 2.4.105 TODO */
  15398. function parse_ExternName(blob, length, opts) {
  15399. var flags = blob.read_shift(2);
  15400. var body;
  15401. var o = ({
  15402. fBuiltIn: flags & 0x01,
  15403. fWantAdvise: (flags >>> 1) & 0x01,
  15404. fWantPict: (flags >>> 2) & 0x01,
  15405. fOle: (flags >>> 3) & 0x01,
  15406. fOleLink: (flags >>> 4) & 0x01,
  15407. cf: (flags >>> 5) & 0x3FF,
  15408. fIcon: flags >>> 15 & 0x01
  15409. });
  15410. if(opts.sbcch === 0x3A01) body = parse_AddinUdf(blob, length-2, opts);
  15411. //else throw new Error("unsupported SupBook cch: " + opts.sbcch);
  15412. o.body = body || blob.read_shift(length-2);
  15413. if(typeof body === "string") o.Name = body;
  15414. return o;
  15415. }
  15416. /* [MS-XLS] 2.4.150 TODO */
  15417. var XLSLblBuiltIn = [
  15418. "_xlnm.Consolidate_Area",
  15419. "_xlnm.Auto_Open",
  15420. "_xlnm.Auto_Close",
  15421. "_xlnm.Extract",
  15422. "_xlnm.Database",
  15423. "_xlnm.Criteria",
  15424. "_xlnm.Print_Area",
  15425. "_xlnm.Print_Titles",
  15426. "_xlnm.Recorder",
  15427. "_xlnm.Data_Form",
  15428. "_xlnm.Auto_Activate",
  15429. "_xlnm.Auto_Deactivate",
  15430. "_xlnm.Sheet_Title",
  15431. "_xlnm._FilterDatabase"
  15432. ];
  15433. function parse_Lbl(blob, length, opts) {
  15434. var target = blob.l + length;
  15435. var flags = blob.read_shift(2);
  15436. var chKey = blob.read_shift(1);
  15437. var cch = blob.read_shift(1);
  15438. var cce = blob.read_shift(opts && opts.biff == 2 ? 1 : 2);
  15439. var itab = 0;
  15440. if(!opts || opts.biff >= 5) {
  15441. if(opts.biff != 5) blob.l += 2;
  15442. itab = blob.read_shift(2);
  15443. if(opts.biff == 5) blob.l += 2;
  15444. blob.l += 4;
  15445. }
  15446. var name = parse_XLUnicodeStringNoCch(blob, cch, opts);
  15447. if(flags & 0x20) name = XLSLblBuiltIn[name.charCodeAt(0)];
  15448. var npflen = target - blob.l; if(opts && opts.biff == 2) --npflen;
  15449. var rgce = (target == blob.l || cce === 0 || !(npflen > 0)) ? [] : parse_NameParsedFormula(blob, npflen, opts, cce);
  15450. return {
  15451. chKey: chKey,
  15452. Name: name,
  15453. itab: itab,
  15454. rgce: rgce
  15455. };
  15456. }
  15457. /* [MS-XLS] 2.4.106 TODO: verify filename encoding */
  15458. function parse_ExternSheet(blob, length, opts) {
  15459. if(opts.biff < 8) return parse_BIFF5ExternSheet(blob, length, opts);
  15460. var o = [], target = blob.l + length, len = blob.read_shift(opts.biff > 8 ? 4 : 2);
  15461. while(len-- !== 0) o.push(parse_XTI(blob, opts.biff > 8 ? 12 : 6, opts));
  15462. // [iSupBook, itabFirst, itabLast];
  15463. if(blob.l != target) throw new Error("Bad ExternSheet: " + blob.l + " != " + target);
  15464. return o;
  15465. }
  15466. function parse_BIFF5ExternSheet(blob, length, opts) {
  15467. if(blob[blob.l + 1] == 0x03) blob[blob.l]++;
  15468. var o = parse_ShortXLUnicodeString(blob, length, opts);
  15469. return o.charCodeAt(0) == 0x03 ? o.slice(1) : o;
  15470. }
  15471. /* [MS-XLS] 2.4.176 TODO: check older biff */
  15472. function parse_NameCmt(blob, length, opts) {
  15473. if(opts.biff < 8) { blob.l += length; return; }
  15474. var cchName = blob.read_shift(2);
  15475. var cchComment = blob.read_shift(2);
  15476. var name = parse_XLUnicodeStringNoCch(blob, cchName, opts);
  15477. var comment = parse_XLUnicodeStringNoCch(blob, cchComment, opts);
  15478. return [name, comment];
  15479. }
  15480. /* [MS-XLS] 2.4.260 */
  15481. function parse_ShrFmla(blob, length, opts) {
  15482. var ref = parse_RefU(blob, 6);
  15483. blob.l++;
  15484. var cUse = blob.read_shift(1);
  15485. length -= 8;
  15486. return [parse_SharedParsedFormula(blob, length, opts), cUse, ref];
  15487. }
  15488. /* [MS-XLS] 2.4.4 TODO */
  15489. function parse_Array(blob, length, opts) {
  15490. var ref = parse_Ref(blob, 6);
  15491. /* TODO: fAlwaysCalc */
  15492. switch(opts.biff) {
  15493. case 2: blob.l ++; length -= 7; break;
  15494. case 3: case 4: blob.l += 2; length -= 8; break;
  15495. default: blob.l += 6; length -= 12;
  15496. }
  15497. return [ref, parse_ArrayParsedFormula(blob, length, opts, ref)];
  15498. }
  15499. /* [MS-XLS] 2.4.173 */
  15500. function parse_MTRSettings(blob) {
  15501. var fMTREnabled = blob.read_shift(4) !== 0x00;
  15502. var fUserSetThreadCount = blob.read_shift(4) !== 0x00;
  15503. var cUserThreadCount = blob.read_shift(4);
  15504. return [fMTREnabled, fUserSetThreadCount, cUserThreadCount];
  15505. }
  15506. /* [MS-XLS] 2.5.186 TODO: BIFF5 */
  15507. function parse_NoteSh(blob, length, opts) {
  15508. if(opts.biff < 8) return;
  15509. var row = blob.read_shift(2), col = blob.read_shift(2);
  15510. var flags = blob.read_shift(2), idObj = blob.read_shift(2);
  15511. var stAuthor = parse_XLUnicodeString2(blob, 0, opts);
  15512. if(opts.biff < 8) blob.read_shift(1);
  15513. return [{r:row,c:col}, stAuthor, idObj, flags];
  15514. }
  15515. /* [MS-XLS] 2.4.179 */
  15516. function parse_Note(blob, length, opts) {
  15517. /* TODO: Support revisions */
  15518. return parse_NoteSh(blob, length, opts);
  15519. }
  15520. /* [MS-XLS] 2.4.168 */
  15521. function parse_MergeCells(blob, length) {
  15522. var merges = [];
  15523. var cmcs = blob.read_shift(2);
  15524. while (cmcs--) merges.push(parse_Ref8U(blob,length));
  15525. return merges;
  15526. }
  15527. function write_MergeCells(merges) {
  15528. var o = new_buf(2 + merges.length * 8);
  15529. o.write_shift(2, merges.length);
  15530. for(var i = 0; i < merges.length; ++i) write_Ref8U(merges[i], o);
  15531. return o;
  15532. }
  15533. /* [MS-XLS] 2.4.181 TODO: parse all the things! */
  15534. function parse_Obj(blob, length, opts) {
  15535. if(opts && opts.biff < 8) return parse_BIFF5Obj(blob, length, opts);
  15536. var cmo = parse_FtCmo(blob, 22); // id, ot, flags
  15537. var fts = parse_FtArray(blob, length-22, cmo[1]);
  15538. return { cmo: cmo, ft:fts };
  15539. }
  15540. /* from older spec */
  15541. var parse_BIFF5OT = [];
  15542. parse_BIFF5OT[0x08] = function(blob, length) {
  15543. var tgt = blob.l + length;
  15544. blob.l += 10; // todo
  15545. var cf = blob.read_shift(2);
  15546. blob.l += 4;
  15547. blob.l += 2; //var cbPictFmla = blob.read_shift(2);
  15548. blob.l += 2;
  15549. blob.l += 2; //var grbit = blob.read_shift(2);
  15550. blob.l += 4;
  15551. var cchName = blob.read_shift(1);
  15552. blob.l += cchName; // TODO: stName
  15553. blob.l = tgt; // TODO: fmla
  15554. return { fmt:cf };
  15555. };
  15556. function parse_BIFF5Obj(blob, length, opts) {
  15557. blob.l += 4; //var cnt = blob.read_shift(4);
  15558. var ot = blob.read_shift(2);
  15559. var id = blob.read_shift(2);
  15560. var grbit = blob.read_shift(2);
  15561. blob.l += 2; //var colL = blob.read_shift(2);
  15562. blob.l += 2; //var dxL = blob.read_shift(2);
  15563. blob.l += 2; //var rwT = blob.read_shift(2);
  15564. blob.l += 2; //var dyT = blob.read_shift(2);
  15565. blob.l += 2; //var colR = blob.read_shift(2);
  15566. blob.l += 2; //var dxR = blob.read_shift(2);
  15567. blob.l += 2; //var rwB = blob.read_shift(2);
  15568. blob.l += 2; //var dyB = blob.read_shift(2);
  15569. blob.l += 2; //var cbMacro = blob.read_shift(2);
  15570. blob.l += 6;
  15571. length -= 36;
  15572. var fts = [];
  15573. fts.push((parse_BIFF5OT[ot]||parsenoop)(blob, length, opts));
  15574. return { cmo: [id, ot, grbit], ft:fts };
  15575. }
  15576. /* [MS-XLS] 2.4.329 TODO: parse properly */
  15577. function parse_TxO(blob, length, opts) {
  15578. var s = blob.l;
  15579. var texts = "";
  15580. try {
  15581. blob.l += 4;
  15582. var ot = (opts.lastobj||{cmo:[0,0]}).cmo[1];
  15583. var controlInfo; // eslint-disable-line no-unused-vars
  15584. if([0,5,7,11,12,14].indexOf(ot) == -1) blob.l += 6;
  15585. else controlInfo = parse_ControlInfo(blob, 6, opts);
  15586. var cchText = blob.read_shift(2);
  15587. /*var cbRuns = */blob.read_shift(2);
  15588. /*var ifntEmpty = */parseuint16(blob, 2);
  15589. var len = blob.read_shift(2);
  15590. blob.l += len;
  15591. //var fmla = parse_ObjFmla(blob, s + length - blob.l);
  15592. for(var i = 1; i < blob.lens.length-1; ++i) {
  15593. if(blob.l-s != blob.lens[i]) throw new Error("TxO: bad continue record");
  15594. var hdr = blob[blob.l];
  15595. var t = parse_XLUnicodeStringNoCch(blob, blob.lens[i+1]-blob.lens[i]-1);
  15596. texts += t;
  15597. if(texts.length >= (hdr ? cchText : 2*cchText)) break;
  15598. }
  15599. if(texts.length !== cchText && texts.length !== cchText*2) {
  15600. throw new Error("cchText: " + cchText + " != " + texts.length);
  15601. }
  15602. blob.l = s + length;
  15603. /* [MS-XLS] 2.5.272 TxORuns */
  15604. // var rgTxoRuns = [];
  15605. // for(var j = 0; j != cbRuns/8-1; ++j) blob.l += 8;
  15606. // var cchText2 = blob.read_shift(2);
  15607. // if(cchText2 !== cchText) throw new Error("TxOLastRun mismatch: " + cchText2 + " " + cchText);
  15608. // blob.l += 6;
  15609. // if(s + length != blob.l) throw new Error("TxO " + (s + length) + ", at " + blob.l);
  15610. return { t: texts };
  15611. } catch(e) { blob.l = s + length; return { t: texts }; }
  15612. }
  15613. /* [MS-XLS] 2.4.140 */
  15614. function parse_HLink(blob, length) {
  15615. var ref = parse_Ref8U(blob, 8);
  15616. blob.l += 16; /* CLSID */
  15617. var hlink = parse_Hyperlink(blob, length-24);
  15618. return [ref, hlink];
  15619. }
  15620. function write_HLink(hl) {
  15621. var O = new_buf(24);
  15622. var ref = decode_cell(hl[0]);
  15623. O.write_shift(2, ref.r); O.write_shift(2, ref.r);
  15624. O.write_shift(2, ref.c); O.write_shift(2, ref.c);
  15625. var clsid = "d0 c9 ea 79 f9 ba ce 11 8c 82 00 aa 00 4b a9 0b".split(" ");
  15626. for(var i = 0; i < 16; ++i) O.write_shift(1, parseInt(clsid[i], 16));
  15627. return bconcat([O, write_Hyperlink(hl[1])]);
  15628. }
  15629. /* [MS-XLS] 2.4.141 */
  15630. function parse_HLinkTooltip(blob, length) {
  15631. blob.read_shift(2);
  15632. var ref = parse_Ref8U(blob, 8);
  15633. var wzTooltip = blob.read_shift((length-10)/2, 'dbcs-cont');
  15634. wzTooltip = wzTooltip.replace(chr0,"");
  15635. return [ref, wzTooltip];
  15636. }
  15637. function write_HLinkTooltip(hl) {
  15638. var TT = hl[1].Tooltip;
  15639. var O = new_buf(10 + 2 * (TT.length + 1));
  15640. O.write_shift(2, 0x0800);
  15641. var ref = decode_cell(hl[0]);
  15642. O.write_shift(2, ref.r); O.write_shift(2, ref.r);
  15643. O.write_shift(2, ref.c); O.write_shift(2, ref.c);
  15644. for(var i = 0; i < TT.length; ++i) O.write_shift(2, TT.charCodeAt(i));
  15645. O.write_shift(2, 0);
  15646. return O;
  15647. }
  15648. /* [MS-XLS] 2.4.63 */
  15649. function parse_Country(blob) {
  15650. var o = [0,0], d;
  15651. d = blob.read_shift(2); o[0] = CountryEnum[d] || d;
  15652. d = blob.read_shift(2); o[1] = CountryEnum[d] || d;
  15653. return o;
  15654. }
  15655. function write_Country(o) {
  15656. if(!o) o = new_buf(4);
  15657. o.write_shift(2, 0x01);
  15658. o.write_shift(2, 0x01);
  15659. return o;
  15660. }
  15661. /* [MS-XLS] 2.4.50 ClrtClient */
  15662. function parse_ClrtClient(blob) {
  15663. var ccv = blob.read_shift(2);
  15664. var o = [];
  15665. while(ccv-->0) o.push(parse_LongRGB(blob, 8));
  15666. return o;
  15667. }
  15668. /* [MS-XLS] 2.4.188 */
  15669. function parse_Palette(blob) {
  15670. var ccv = blob.read_shift(2);
  15671. var o = [];
  15672. while(ccv-->0) o.push(parse_LongRGB(blob, 8));
  15673. return o;
  15674. }
  15675. /* [MS-XLS] 2.4.354 */
  15676. function parse_XFCRC(blob) {
  15677. blob.l += 2;
  15678. var o = {cxfs:0, crc:0};
  15679. o.cxfs = blob.read_shift(2);
  15680. o.crc = blob.read_shift(4);
  15681. return o;
  15682. }
  15683. /* [MS-XLS] 2.4.53 TODO: parse flags */
  15684. /* [MS-XLSB] 2.4.323 TODO: parse flags */
  15685. function parse_ColInfo(blob, length, opts) {
  15686. if(!opts.cellStyles) return parsenoop(blob, length);
  15687. var w = opts && opts.biff >= 12 ? 4 : 2;
  15688. var colFirst = blob.read_shift(w);
  15689. var colLast = blob.read_shift(w);
  15690. var coldx = blob.read_shift(w);
  15691. var ixfe = blob.read_shift(w);
  15692. var flags = blob.read_shift(2);
  15693. if(w == 2) blob.l += 2;
  15694. var o = ({s:colFirst, e:colLast, w:coldx, ixfe:ixfe, flags:flags});
  15695. if(opts.biff >= 5 || !opts.biff) o.level = (flags >> 8) & 0x7;
  15696. return o;
  15697. }
  15698. /* [MS-XLS] 2.4.257 */
  15699. function parse_Setup(blob, length) {
  15700. var o = {};
  15701. if(length < 32) return o;
  15702. blob.l += 16;
  15703. o.header = parse_Xnum(blob, 8);
  15704. o.footer = parse_Xnum(blob, 8);
  15705. blob.l += 2;
  15706. return o;
  15707. }
  15708. /* [MS-XLS] 2.4.261 */
  15709. function parse_ShtProps(blob, length, opts) {
  15710. var def = {area:false};
  15711. if(opts.biff != 5) { blob.l += length; return def; }
  15712. var d = blob.read_shift(1); blob.l += 3;
  15713. if((d & 0x10)) def.area = true;
  15714. return def;
  15715. }
  15716. /* [MS-XLS] 2.4.241 */
  15717. function write_RRTabId(n) {
  15718. var out = new_buf(2 * n);
  15719. for(var i = 0; i < n; ++i) out.write_shift(2, i+1);
  15720. return out;
  15721. }
  15722. var parse_Blank = parse_XLSCell; /* [MS-XLS] 2.4.20 Just the cell */
  15723. var parse_Scl = parseuint16a; /* [MS-XLS] 2.4.247 num, den */
  15724. var parse_String = parse_XLUnicodeString; /* [MS-XLS] 2.4.268 */
  15725. /* --- Specific to versions before BIFF8 --- */
  15726. function parse_ImData(blob) {
  15727. var cf = blob.read_shift(2);
  15728. var env = blob.read_shift(2);
  15729. var lcb = blob.read_shift(4);
  15730. var o = {fmt:cf, env:env, len:lcb, data:blob.slice(blob.l,blob.l+lcb)};
  15731. blob.l += lcb;
  15732. return o;
  15733. }
  15734. /* BIFF2_??? where ??? is the name from [XLS] */
  15735. function parse_BIFF2STR(blob, length, opts) {
  15736. var cell = parse_XLSCell(blob, 6);
  15737. ++blob.l;
  15738. var str = parse_XLUnicodeString2(blob, length-7, opts);
  15739. cell.t = 'str';
  15740. cell.val = str;
  15741. return cell;
  15742. }
  15743. function parse_BIFF2NUM(blob) {
  15744. var cell = parse_XLSCell(blob, 6);
  15745. ++blob.l;
  15746. var num = parse_Xnum(blob, 8);
  15747. cell.t = 'n';
  15748. cell.val = num;
  15749. return cell;
  15750. }
  15751. function write_BIFF2NUM(r, c, val) {
  15752. var out = new_buf(15);
  15753. write_BIFF2Cell(out, r, c);
  15754. out.write_shift(8, val, 'f');
  15755. return out;
  15756. }
  15757. function parse_BIFF2INT(blob) {
  15758. var cell = parse_XLSCell(blob, 6);
  15759. ++blob.l;
  15760. var num = blob.read_shift(2);
  15761. cell.t = 'n';
  15762. cell.val = num;
  15763. return cell;
  15764. }
  15765. function write_BIFF2INT(r, c, val) {
  15766. var out = new_buf(9);
  15767. write_BIFF2Cell(out, r, c);
  15768. out.write_shift(2, val);
  15769. return out;
  15770. }
  15771. function parse_BIFF2STRING(blob) {
  15772. var cch = blob.read_shift(1);
  15773. if(cch === 0) { blob.l++; return ""; }
  15774. return blob.read_shift(cch, 'sbcs-cont');
  15775. }
  15776. /* TODO: convert to BIFF8 font struct */
  15777. function parse_BIFF2FONTXTRA(blob, length) {
  15778. blob.l += 6; // unknown
  15779. blob.l += 2; // font weight "bls"
  15780. blob.l += 1; // charset
  15781. blob.l += 3; // unknown
  15782. blob.l += 1; // font family
  15783. blob.l += length - 13;
  15784. }
  15785. /* TODO: parse rich text runs */
  15786. function parse_RString(blob, length, opts) {
  15787. var end = blob.l + length;
  15788. var cell = parse_XLSCell(blob, 6);
  15789. var cch = blob.read_shift(2);
  15790. var str = parse_XLUnicodeStringNoCch(blob, cch, opts);
  15791. blob.l = end;
  15792. cell.t = 'str';
  15793. cell.val = str;
  15794. return cell;
  15795. }
  15796. /* from js-harb (C) 2014-present SheetJS */
  15797. var DBF = (function() {
  15798. var dbf_codepage_map = {
  15799. /* Code Pages Supported by Visual FoxPro */
  15800. 0x01: 437, 0x02: 850,
  15801. 0x03: 1252, 0x04: 10000,
  15802. 0x64: 852, 0x65: 866,
  15803. 0x66: 865, 0x67: 861,
  15804. 0x68: 895, 0x69: 620,
  15805. 0x6A: 737, 0x6B: 857,
  15806. 0x78: 950, 0x79: 949,
  15807. 0x7A: 936, 0x7B: 932,
  15808. 0x7C: 874, 0x7D: 1255,
  15809. 0x7E: 1256, 0x96: 10007,
  15810. 0x97: 10029, 0x98: 10006,
  15811. 0xC8: 1250, 0xC9: 1251,
  15812. 0xCA: 1254, 0xCB: 1253,
  15813. /* shapefile DBF extension */
  15814. 0x00: 20127, 0x08: 865,
  15815. 0x09: 437, 0x0A: 850,
  15816. 0x0B: 437, 0x0D: 437,
  15817. 0x0E: 850, 0x0F: 437,
  15818. 0x10: 850, 0x11: 437,
  15819. 0x12: 850, 0x13: 932,
  15820. 0x14: 850, 0x15: 437,
  15821. 0x16: 850, 0x17: 865,
  15822. 0x18: 437, 0x19: 437,
  15823. 0x1A: 850, 0x1B: 437,
  15824. 0x1C: 863, 0x1D: 850,
  15825. 0x1F: 852, 0x22: 852,
  15826. 0x23: 852, 0x24: 860,
  15827. 0x25: 850, 0x26: 866,
  15828. 0x37: 850, 0x40: 852,
  15829. 0x4D: 936, 0x4E: 949,
  15830. 0x4F: 950, 0x50: 874,
  15831. 0x57: 1252, 0x58: 1252,
  15832. 0x59: 1252, 0x6C: 863,
  15833. 0x86: 737, 0x87: 852,
  15834. 0x88: 857, 0xCC: 1257,
  15835. 0xFF: 16969
  15836. };
  15837. var dbf_reverse_map = evert({
  15838. 0x01: 437, 0x02: 850,
  15839. 0x03: 1252, 0x04: 10000,
  15840. 0x64: 852, 0x65: 866,
  15841. 0x66: 865, 0x67: 861,
  15842. 0x68: 895, 0x69: 620,
  15843. 0x6A: 737, 0x6B: 857,
  15844. 0x78: 950, 0x79: 949,
  15845. 0x7A: 936, 0x7B: 932,
  15846. 0x7C: 874, 0x7D: 1255,
  15847. 0x7E: 1256, 0x96: 10007,
  15848. 0x97: 10029, 0x98: 10006,
  15849. 0xC8: 1250, 0xC9: 1251,
  15850. 0xCA: 1254, 0xCB: 1253,
  15851. 0x00: 20127
  15852. });
  15853. var DBF_SUPPORTED_VERSIONS = [0x02, 0x03, 0x30, 0x31, 0x83, 0x8B, 0x8C, 0xF5];
  15854. /* TODO: find an actual specification */
  15855. function dbf_to_aoa(buf, opts) {
  15856. var out = [];
  15857. var d = (new_raw_buf(1));
  15858. switch(opts.type) {
  15859. case 'base64': d = s2a(Base64.decode(buf)); break;
  15860. case 'binary': d = s2a(buf); break;
  15861. case 'buffer':
  15862. case 'array': d = buf; break;
  15863. }
  15864. prep_blob(d, 0);
  15865. /* header */
  15866. var ft = d.read_shift(1);
  15867. var memo = !!(ft & 0x88);
  15868. var vfp = false, l7 = false;
  15869. switch(ft) {
  15870. case 0x02: break; // dBASE II
  15871. case 0x03: break; // dBASE III
  15872. case 0x30: vfp = true; memo = true; break; // VFP
  15873. case 0x31: vfp = true; memo = true; break; // VFP with autoincrement
  15874. // 0x43 dBASE IV SQL table files
  15875. // 0x63 dBASE IV SQL system files
  15876. case 0x83: break; // dBASE III with memo
  15877. case 0x8B: break; // dBASE IV with memo
  15878. case 0x8C: l7 = true; break; // dBASE Level 7 with memo
  15879. // case 0xCB dBASE IV SQL table files with memo
  15880. case 0xF5: break; // FoxPro 2.x with memo
  15881. // case 0xFB FoxBASE
  15882. default: throw new Error("DBF Unsupported Version: " + ft.toString(16));
  15883. }
  15884. var nrow = 0, fpos = 0x0209;
  15885. if(ft == 0x02) nrow = d.read_shift(2);
  15886. d.l += 3; // dBASE II stores DDMMYY date, others use YYMMDD
  15887. if(ft != 0x02) nrow = d.read_shift(4);
  15888. if(nrow > 1048576) nrow = 1e6;
  15889. if(ft != 0x02) fpos = d.read_shift(2); // header length
  15890. var rlen = d.read_shift(2); // record length
  15891. var /*flags = 0,*/ current_cp = opts.codepage || 1252;
  15892. if(ft != 0x02) { // 20 reserved bytes
  15893. d.l+=16;
  15894. /*flags = */d.read_shift(1);
  15895. //if(memo && ((flags & 0x02) === 0)) throw new Error("DBF Flags " + flags.toString(16) + " ft " + ft.toString(16));
  15896. /* codepage present in FoxPro and dBASE Level 7 */
  15897. if(d[d.l] !== 0) current_cp = dbf_codepage_map[d[d.l]];
  15898. d.l+=1;
  15899. d.l+=2;
  15900. }
  15901. if(l7) d.l += 36; // Level 7: 32 byte "Language driver name", 4 byte reserved
  15902. var fields = [], field = ({});
  15903. var hend = Math.min(d.length, (ft == 0x02 ? 0x209 : (fpos - 10 - (vfp ? 264 : 0))));
  15904. var ww = l7 ? 32 : 11;
  15905. while(d.l < hend && d[d.l] != 0x0d) {
  15906. field = ({});
  15907. field.name = cptable.utils.decode(current_cp, d.slice(d.l, d.l+ww)).replace(/[\u0000\r\n].*$/g,"");
  15908. d.l += ww;
  15909. field.type = String.fromCharCode(d.read_shift(1));
  15910. if(ft != 0x02 && !l7) field.offset = d.read_shift(4);
  15911. field.len = d.read_shift(1);
  15912. if(ft == 0x02) field.offset = d.read_shift(2);
  15913. field.dec = d.read_shift(1);
  15914. if(field.name.length) fields.push(field);
  15915. if(ft != 0x02) d.l += l7 ? 13 : 14;
  15916. switch(field.type) {
  15917. case 'B': // Double (VFP) / Binary (dBASE L7)
  15918. if((!vfp || field.len != 8) && opts.WTF) console.log('Skipping ' + field.name + ':' + field.type);
  15919. break;
  15920. case 'G': // General (FoxPro and dBASE L7)
  15921. case 'P': // Picture (FoxPro and dBASE L7)
  15922. if(opts.WTF) console.log('Skipping ' + field.name + ':' + field.type);
  15923. break;
  15924. case '+': // Autoincrement (dBASE L7 only)
  15925. case '0': // _NullFlags (VFP only)
  15926. case '@': // Timestamp (dBASE L7 only)
  15927. case 'C': // Character (dBASE II)
  15928. case 'D': // Date (dBASE III)
  15929. case 'F': // Float (dBASE IV)
  15930. case 'I': // Long (VFP and dBASE L7)
  15931. case 'L': // Logical (dBASE II)
  15932. case 'M': // Memo (dBASE III)
  15933. case 'N': // Number (dBASE II)
  15934. case 'O': // Double (dBASE L7 only)
  15935. case 'T': // Datetime (VFP only)
  15936. case 'Y': // Currency (VFP only)
  15937. break;
  15938. default: throw new Error('Unknown Field Type: ' + field.type);
  15939. }
  15940. }
  15941. if(d[d.l] !== 0x0D) d.l = fpos-1;
  15942. if(d.read_shift(1) !== 0x0D) throw new Error("DBF Terminator not found " + d.l + " " + d[d.l]);
  15943. d.l = fpos;
  15944. /* data */
  15945. var R = 0, C = 0;
  15946. out[0] = [];
  15947. for(C = 0; C != fields.length; ++C) out[0][C] = fields[C].name;
  15948. while(nrow-- > 0) {
  15949. if(d[d.l] === 0x2A) {
  15950. // TODO: record marked as deleted -- create a hidden row?
  15951. d.l+=rlen;
  15952. continue;
  15953. }
  15954. ++d.l;
  15955. out[++R] = []; C = 0;
  15956. for(C = 0; C != fields.length; ++C) {
  15957. var dd = d.slice(d.l, d.l+fields[C].len); d.l+=fields[C].len;
  15958. prep_blob(dd, 0);
  15959. var s = cptable.utils.decode(current_cp, dd);
  15960. switch(fields[C].type) {
  15961. case 'C':
  15962. // NOTE: it is conventional to write ' / / ' for empty dates
  15963. if(s.trim().length) out[R][C] = s.replace(/\s+$/,"");
  15964. break;
  15965. case 'D':
  15966. if(s.length === 8) out[R][C] = new Date(+s.slice(0,4), +s.slice(4,6)-1, +s.slice(6,8));
  15967. else out[R][C] = s;
  15968. break;
  15969. case 'F': out[R][C] = parseFloat(s.trim()); break;
  15970. case '+': case 'I': out[R][C] = l7 ? dd.read_shift(-4, 'i') ^ 0x80000000 : dd.read_shift(4, 'i'); break;
  15971. case 'L': switch(s.trim().toUpperCase()) {
  15972. case 'Y': case 'T': out[R][C] = true; break;
  15973. case 'N': case 'F': out[R][C] = false; break;
  15974. case '': case '?': break;
  15975. default: throw new Error("DBF Unrecognized L:|" + s + "|");
  15976. } break;
  15977. case 'M': /* TODO: handle memo files */
  15978. if(!memo) throw new Error("DBF Unexpected MEMO for type " + ft.toString(16));
  15979. out[R][C] = "##MEMO##" + (l7 ? parseInt(s.trim(), 10): dd.read_shift(4));
  15980. break;
  15981. case 'N':
  15982. s = s.replace(/\u0000/g,"").trim();
  15983. // NOTE: dBASE II interprets " . " as 0
  15984. if(s && s != ".") out[R][C] = +s || 0; break;
  15985. case '@':
  15986. // NOTE: dBASE specs appear to be incorrect
  15987. out[R][C] = new Date(dd.read_shift(-8, 'f') - 0x388317533400);
  15988. break;
  15989. case 'T': out[R][C] = new Date((dd.read_shift(4) - 0x253D8C) * 0x5265C00 + dd.read_shift(4)); break;
  15990. case 'Y': out[R][C] = dd.read_shift(4,'i')/1e4; break;
  15991. case 'O': out[R][C] = -dd.read_shift(-8, 'f'); break;
  15992. case 'B': if(vfp && fields[C].len == 8) { out[R][C] = dd.read_shift(8,'f'); break; }
  15993. /* falls through */
  15994. case 'G': case 'P': dd.l += fields[C].len; break;
  15995. case '0':
  15996. if(fields[C].name === '_NullFlags') break;
  15997. /* falls through */
  15998. default: throw new Error("DBF Unsupported data type " + fields[C].type);
  15999. }
  16000. }
  16001. }
  16002. if(ft != 0x02) if(d.l < d.length && d[d.l++] != 0x1A) throw new Error("DBF EOF Marker missing " + (d.l-1) + " of " + d.length + " " + d[d.l-1].toString(16));
  16003. if(opts && opts.sheetRows) out = out.slice(0, opts.sheetRows);
  16004. return out;
  16005. }
  16006. function dbf_to_sheet(buf, opts) {
  16007. var o = opts || {};
  16008. if(!o.dateNF) o.dateNF = "yyyymmdd";
  16009. return aoa_to_sheet(dbf_to_aoa(buf, o), o);
  16010. }
  16011. function dbf_to_workbook(buf, opts) {
  16012. try { return sheet_to_workbook(dbf_to_sheet(buf, opts), opts); }
  16013. catch(e) { if(opts && opts.WTF) throw e; }
  16014. return ({SheetNames:[],Sheets:{}});
  16015. }
  16016. var _RLEN = { 'B': 8, 'C': 250, 'L': 1, 'D': 8, '?': 0, '': 0 };
  16017. function sheet_to_dbf(ws, opts) {
  16018. var o = opts || {};
  16019. if(+o.codepage >= 0) set_cp(+o.codepage);
  16020. if(o.type == "string") throw new Error("Cannot write DBF to JS string");
  16021. var ba = buf_array();
  16022. var aoa = sheet_to_json(ws, {header:1, raw:true, cellDates:true});
  16023. var headers = aoa[0], data = aoa.slice(1);
  16024. var i = 0, j = 0, hcnt = 0, rlen = 1;
  16025. for(i = 0; i < headers.length; ++i) {
  16026. if(i == null) continue;
  16027. ++hcnt;
  16028. if(typeof headers[i] === 'number') headers[i] = headers[i].toString(10);
  16029. if(typeof headers[i] !== 'string') throw new Error("DBF Invalid column name " + headers[i] + " |" + (typeof headers[i]) + "|");
  16030. if(headers.indexOf(headers[i]) !== i) for(j=0; j<1024;++j)
  16031. if(headers.indexOf(headers[i] + "_" + j) == -1) { headers[i] += "_" + j; break; }
  16032. }
  16033. var range = safe_decode_range(ws['!ref']);
  16034. var coltypes = [];
  16035. for(i = 0; i <= range.e.c - range.s.c; ++i) {
  16036. var col = [];
  16037. for(j=0; j < data.length; ++j) {
  16038. if(data[j][i] != null) col.push(data[j][i]);
  16039. }
  16040. if(col.length == 0 || headers[i] == null) { coltypes[i] = '?'; continue; }
  16041. var guess = '', _guess = '';
  16042. for(j = 0; j < col.length; ++j) {
  16043. switch(typeof col[j]) {
  16044. /* TODO: check if L2 compat is desired */
  16045. case 'number': _guess = 'B'; break;
  16046. case 'string': _guess = 'C'; break;
  16047. case 'boolean': _guess = 'L'; break;
  16048. case 'object': _guess = col[j] instanceof Date ? 'D' : 'C'; break;
  16049. default: _guess = 'C';
  16050. }
  16051. guess = guess && guess != _guess ? 'C' : _guess;
  16052. if(guess == 'C') break;
  16053. }
  16054. rlen += _RLEN[guess] || 0;
  16055. coltypes[i] = guess;
  16056. }
  16057. var h = ba.next(32);
  16058. h.write_shift(4, 0x13021130);
  16059. h.write_shift(4, data.length);
  16060. h.write_shift(2, 296 + 32 * hcnt);
  16061. h.write_shift(2, rlen);
  16062. for(i=0; i < 4; ++i) h.write_shift(4, 0);
  16063. h.write_shift(4, 0x00000000 | ((+dbf_reverse_map[current_ansi] || 0x03)<<8));
  16064. for(i = 0, j = 0; i < headers.length; ++i) {
  16065. if(headers[i] == null) continue;
  16066. var hf = ba.next(32);
  16067. var _f = (headers[i].slice(-10) + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00").slice(0, 11);
  16068. hf.write_shift(1, _f, "sbcs");
  16069. hf.write_shift(1, coltypes[i] == '?' ? 'C' : coltypes[i], "sbcs");
  16070. hf.write_shift(4, j);
  16071. hf.write_shift(1, _RLEN[coltypes[i]] || 0);
  16072. hf.write_shift(1, 0);
  16073. hf.write_shift(1, 0x02);
  16074. hf.write_shift(4, 0);
  16075. hf.write_shift(1, 0);
  16076. hf.write_shift(4, 0);
  16077. hf.write_shift(4, 0);
  16078. j += _RLEN[coltypes[i]] || 0;
  16079. }
  16080. var hb = ba.next(264);
  16081. hb.write_shift(4, 0x0000000D);
  16082. for(i=0; i < 65;++i) hb.write_shift(4, 0x00000000);
  16083. for(i=0; i < data.length; ++i) {
  16084. var rout = ba.next(rlen);
  16085. rout.write_shift(1, 0);
  16086. for(j=0; j<headers.length; ++j) {
  16087. if(headers[j] == null) continue;
  16088. switch(coltypes[j]) {
  16089. case 'L': rout.write_shift(1, data[i][j] == null ? 0x3F : data[i][j] ? 0x54 : 0x46); break;
  16090. case 'B': rout.write_shift(8, data[i][j]||0, 'f'); break;
  16091. case 'D':
  16092. if(!data[i][j]) rout.write_shift(8, "00000000", "sbcs");
  16093. else {
  16094. rout.write_shift(4, ("0000"+data[i][j].getFullYear()).slice(-4), "sbcs");
  16095. rout.write_shift(2, ("00"+(data[i][j].getMonth()+1)).slice(-2), "sbcs");
  16096. rout.write_shift(2, ("00"+data[i][j].getDate()).slice(-2), "sbcs");
  16097. } break;
  16098. case 'C':
  16099. var _s = String(data[i][j]||"");
  16100. rout.write_shift(1, _s, "sbcs");
  16101. for(hcnt=0; hcnt < 250-_s.length; ++hcnt) rout.write_shift(1, 0x20); break;
  16102. }
  16103. }
  16104. // data
  16105. }
  16106. ba.next(1).write_shift(1, 0x1A);
  16107. return ba.end();
  16108. }
  16109. return {
  16110. versions: DBF_SUPPORTED_VERSIONS,
  16111. to_workbook: dbf_to_workbook,
  16112. to_sheet: dbf_to_sheet,
  16113. from_sheet: sheet_to_dbf
  16114. };
  16115. })();
  16116. var SYLK = (function() {
  16117. /* TODO: stress test sequences */
  16118. var sylk_escapes = ({
  16119. AA:'À', BA:'Á', CA:'Â', DA:195, HA:'Ä', JA:197,
  16120. AE:'È', BE:'É', CE:'Ê', HE:'Ë',
  16121. AI:'Ì', BI:'Í', CI:'Î', HI:'Ï',
  16122. AO:'Ò', BO:'Ó', CO:'Ô', DO:213, HO:'Ö',
  16123. AU:'Ù', BU:'Ú', CU:'Û', HU:'Ü',
  16124. Aa:'à', Ba:'á', Ca:'â', Da:227, Ha:'ä', Ja:229,
  16125. Ae:'è', Be:'é', Ce:'ê', He:'ë',
  16126. Ai:'ì', Bi:'í', Ci:'î', Hi:'ï',
  16127. Ao:'ò', Bo:'ó', Co:'ô', Do:245, Ho:'ö',
  16128. Au:'ù', Bu:'ú', Cu:'û', Hu:'ü',
  16129. KC:'Ç', Kc:'ç', q:'æ', z:'œ', a:'Æ', j:'Œ',
  16130. DN:209, Dn:241, Hy:255,
  16131. S:169, c:170, R:174, B:180,
  16132. 0:176, 1:177, 2:178,
  16133. 3:179, 5:181, 6:182,
  16134. 7:183, Q:185, k:186, b:208, i:216, l:222, s:240, y:248,
  16135. "!":161, '"':162, "#":163, "(":164, "%":165, "'":167, "H ":168,
  16136. "+":171, ";":187, "<":188, "=":189, ">":190, "?":191, "{":223
  16137. });
  16138. var sylk_char_regex = new RegExp("\u001BN(" + keys(sylk_escapes).join("|").replace(/\|\|\|/, "|\\||").replace(/([?()+])/g,"\\$1") + "|\\|)", "gm");
  16139. var sylk_char_fn = function(_, $1){ var o = sylk_escapes[$1]; return typeof o == "number" ? _getansi(o) : o; };
  16140. var decode_sylk_char = function($$, $1, $2) { var newcc = (($1.charCodeAt(0) - 0x20)<<4) | ($2.charCodeAt(0) - 0x30); return newcc == 59 ? $$ : _getansi(newcc); };
  16141. sylk_escapes["|"] = 254;
  16142. /* TODO: find an actual specification */
  16143. function sylk_to_aoa(d, opts) {
  16144. switch(opts.type) {
  16145. case 'base64': return sylk_to_aoa_str(Base64.decode(d), opts);
  16146. case 'binary': return sylk_to_aoa_str(d, opts);
  16147. case 'buffer': return sylk_to_aoa_str(d.toString('binary'), opts);
  16148. case 'array': return sylk_to_aoa_str(cc2str(d), opts);
  16149. }
  16150. throw new Error("Unrecognized type " + opts.type);
  16151. }
  16152. function sylk_to_aoa_str(str, opts) {
  16153. var records = str.split(/[\n\r]+/), R = -1, C = -1, ri = 0, rj = 0, arr = [];
  16154. var formats = [];
  16155. var next_cell_format = null;
  16156. var sht = {}, rowinfo = [], colinfo = [], cw = [];
  16157. var Mval = 0, j;
  16158. if(+opts.codepage >= 0) set_cp(+opts.codepage);
  16159. for (; ri !== records.length; ++ri) {
  16160. Mval = 0;
  16161. var rstr=records[ri].trim().replace(/\x1B([\x20-\x2F])([\x30-\x3F])/g, decode_sylk_char).replace(sylk_char_regex, sylk_char_fn);
  16162. var record=rstr.replace(/;;/g, "\u0000").split(";").map(function(x) { return x.replace(/\u0000/g, ";"); });
  16163. var RT=record[0], val;
  16164. if(rstr.length > 0) switch(RT) {
  16165. case 'ID': break; /* header */
  16166. case 'E': break; /* EOF */
  16167. case 'B': break; /* dimensions */
  16168. case 'O': break; /* options? */
  16169. case 'P':
  16170. if(record[1].charAt(0) == 'P')
  16171. formats.push(rstr.slice(3).replace(/;;/g, ";"));
  16172. break;
  16173. case 'C':
  16174. var C_seen_K = false, C_seen_X = false, C_seen_S = false, C_seen_E = false, _R = -1, _C = -1;
  16175. for(rj=1; rj<record.length; ++rj) switch(record[rj].charAt(0)) {
  16176. case 'A': break; // TODO: comment
  16177. case 'X': C = parseInt(record[rj].slice(1))-1; C_seen_X = true; break;
  16178. case 'Y':
  16179. R = parseInt(record[rj].slice(1))-1; if(!C_seen_X) C = 0;
  16180. for(j = arr.length; j <= R; ++j) arr[j] = [];
  16181. break;
  16182. case 'K':
  16183. val = record[rj].slice(1);
  16184. if(val.charAt(0) === '"') val = val.slice(1,val.length - 1);
  16185. else if(val === 'TRUE') val = true;
  16186. else if(val === 'FALSE') val = false;
  16187. else if(!isNaN(fuzzynum(val))) {
  16188. val = fuzzynum(val);
  16189. if(next_cell_format !== null && SSF.is_date(next_cell_format)) val = numdate(val);
  16190. } else if(!isNaN(fuzzydate(val).getDate())) {
  16191. val = parseDate(val);
  16192. }
  16193. if(typeof cptable !== 'undefined' && typeof val == "string" && ((opts||{}).type != "string") && (opts||{}).codepage) val = cptable.utils.decode(opts.codepage, val);
  16194. C_seen_K = true;
  16195. break;
  16196. case 'E':
  16197. C_seen_E = true;
  16198. var formula = rc_to_a1(record[rj].slice(1), {r:R,c:C});
  16199. arr[R][C] = [arr[R][C], formula];
  16200. break;
  16201. case 'S':
  16202. C_seen_S = true;
  16203. arr[R][C] = [arr[R][C], "S5S"];
  16204. break;
  16205. case 'G': break; // unknown
  16206. case 'R': _R = parseInt(record[rj].slice(1))-1; break;
  16207. case 'C': _C = parseInt(record[rj].slice(1))-1; break;
  16208. default: if(opts && opts.WTF) throw new Error("SYLK bad record " + rstr);
  16209. }
  16210. if(C_seen_K) {
  16211. if(arr[R][C] && arr[R][C].length == 2) arr[R][C][0] = val;
  16212. else arr[R][C] = val;
  16213. next_cell_format = null;
  16214. }
  16215. if(C_seen_S) {
  16216. if(C_seen_E) throw new Error("SYLK shared formula cannot have own formula");
  16217. var shrbase = _R > -1 && arr[_R][_C];
  16218. if(!shrbase || !shrbase[1]) throw new Error("SYLK shared formula cannot find base");
  16219. arr[R][C][1] = shift_formula_str(shrbase[1], {r: R - _R, c: C - _C});
  16220. }
  16221. break;
  16222. case 'F':
  16223. var F_seen = 0;
  16224. for(rj=1; rj<record.length; ++rj) switch(record[rj].charAt(0)) {
  16225. case 'X': C = parseInt(record[rj].slice(1))-1; ++F_seen; break;
  16226. case 'Y':
  16227. R = parseInt(record[rj].slice(1))-1; /*C = 0;*/
  16228. for(j = arr.length; j <= R; ++j) arr[j] = [];
  16229. break;
  16230. case 'M': Mval = parseInt(record[rj].slice(1)) / 20; break;
  16231. case 'F': break; /* ??? */
  16232. case 'G': break; /* hide grid */
  16233. case 'P':
  16234. next_cell_format = formats[parseInt(record[rj].slice(1))];
  16235. break;
  16236. case 'S': break; /* cell style */
  16237. case 'D': break; /* column */
  16238. case 'N': break; /* font */
  16239. case 'W':
  16240. cw = record[rj].slice(1).split(" ");
  16241. for(j = parseInt(cw[0], 10); j <= parseInt(cw[1], 10); ++j) {
  16242. Mval = parseInt(cw[2], 10);
  16243. colinfo[j-1] = Mval === 0 ? {hidden:true}: {wch:Mval}; process_col(colinfo[j-1]);
  16244. } break;
  16245. case 'C': /* default column format */
  16246. C = parseInt(record[rj].slice(1))-1;
  16247. if(!colinfo[C]) colinfo[C] = {};
  16248. break;
  16249. case 'R': /* row properties */
  16250. R = parseInt(record[rj].slice(1))-1;
  16251. if(!rowinfo[R]) rowinfo[R] = {};
  16252. if(Mval > 0) { rowinfo[R].hpt = Mval; rowinfo[R].hpx = pt2px(Mval); }
  16253. else if(Mval === 0) rowinfo[R].hidden = true;
  16254. break;
  16255. default: if(opts && opts.WTF) throw new Error("SYLK bad record " + rstr);
  16256. }
  16257. if(F_seen < 1) next_cell_format = null; break;
  16258. default: if(opts && opts.WTF) throw new Error("SYLK bad record " + rstr);
  16259. }
  16260. }
  16261. if(rowinfo.length > 0) sht['!rows'] = rowinfo;
  16262. if(colinfo.length > 0) sht['!cols'] = colinfo;
  16263. if(opts && opts.sheetRows) arr = arr.slice(0, opts.sheetRows);
  16264. return [arr, sht];
  16265. }
  16266. function sylk_to_sheet(d, opts) {
  16267. var aoasht = sylk_to_aoa(d, opts);
  16268. var aoa = aoasht[0], ws = aoasht[1];
  16269. var o = aoa_to_sheet(aoa, opts);
  16270. keys(ws).forEach(function(k) { o[k] = ws[k]; });
  16271. return o;
  16272. }
  16273. function sylk_to_workbook(d, opts) { return sheet_to_workbook(sylk_to_sheet(d, opts), opts); }
  16274. function write_ws_cell_sylk(cell, ws, R, C) {
  16275. var o = "C;Y" + (R+1) + ";X" + (C+1) + ";K";
  16276. switch(cell.t) {
  16277. case 'n':
  16278. o += (cell.v||0);
  16279. if(cell.f && !cell.F) o += ";E" + a1_to_rc(cell.f, {r:R, c:C}); break;
  16280. case 'b': o += cell.v ? "TRUE" : "FALSE"; break;
  16281. case 'e': o += cell.w || cell.v; break;
  16282. case 'd': o += '"' + (cell.w || cell.v) + '"'; break;
  16283. case 's': o += '"' + cell.v.replace(/"/g,"") + '"'; break;
  16284. }
  16285. return o;
  16286. }
  16287. function write_ws_cols_sylk(out, cols) {
  16288. cols.forEach(function(col, i) {
  16289. var rec = "F;W" + (i+1) + " " + (i+1) + " ";
  16290. if(col.hidden) rec += "0";
  16291. else {
  16292. if(typeof col.width == 'number') col.wpx = width2px(col.width);
  16293. if(typeof col.wpx == 'number') col.wch = px2char(col.wpx);
  16294. if(typeof col.wch == 'number') rec += Math.round(col.wch);
  16295. }
  16296. if(rec.charAt(rec.length - 1) != " ") out.push(rec);
  16297. });
  16298. }
  16299. function write_ws_rows_sylk(out, rows) {
  16300. rows.forEach(function(row, i) {
  16301. var rec = "F;";
  16302. if(row.hidden) rec += "M0;";
  16303. else if(row.hpt) rec += "M" + 20 * row.hpt + ";";
  16304. else if(row.hpx) rec += "M" + 20 * px2pt(row.hpx) + ";";
  16305. if(rec.length > 2) out.push(rec + "R" + (i+1));
  16306. });
  16307. }
  16308. function sheet_to_sylk(ws, opts) {
  16309. var preamble = ["ID;PWXL;N;E"], o = [];
  16310. var r = safe_decode_range(ws['!ref']), cell;
  16311. var dense = Array.isArray(ws);
  16312. var RS = "\r\n";
  16313. preamble.push("P;PGeneral");
  16314. preamble.push("F;P0;DG0G8;M255");
  16315. if(ws['!cols']) write_ws_cols_sylk(preamble, ws['!cols']);
  16316. if(ws['!rows']) write_ws_rows_sylk(preamble, ws['!rows']);
  16317. preamble.push("B;Y" + (r.e.r - r.s.r + 1) + ";X" + (r.e.c - r.s.c + 1) + ";D" + [r.s.c,r.s.r,r.e.c,r.e.r].join(" "));
  16318. for(var R = r.s.r; R <= r.e.r; ++R) {
  16319. for(var C = r.s.c; C <= r.e.c; ++C) {
  16320. var coord = encode_cell({r:R,c:C});
  16321. cell = dense ? (ws[R]||[])[C]: ws[coord];
  16322. if(!cell || (cell.v == null && (!cell.f || cell.F))) continue;
  16323. o.push(write_ws_cell_sylk(cell, ws, R, C, opts));
  16324. }
  16325. }
  16326. return preamble.join(RS) + RS + o.join(RS) + RS + "E" + RS;
  16327. }
  16328. return {
  16329. to_workbook: sylk_to_workbook,
  16330. to_sheet: sylk_to_sheet,
  16331. from_sheet: sheet_to_sylk
  16332. };
  16333. })();
  16334. var DIF = (function() {
  16335. function dif_to_aoa(d, opts) {
  16336. switch(opts.type) {
  16337. case 'base64': return dif_to_aoa_str(Base64.decode(d), opts);
  16338. case 'binary': return dif_to_aoa_str(d, opts);
  16339. case 'buffer': return dif_to_aoa_str(d.toString('binary'), opts);
  16340. case 'array': return dif_to_aoa_str(cc2str(d), opts);
  16341. }
  16342. throw new Error("Unrecognized type " + opts.type);
  16343. }
  16344. function dif_to_aoa_str(str, opts) {
  16345. var records = str.split('\n'), R = -1, C = -1, ri = 0, arr = [];
  16346. for (; ri !== records.length; ++ri) {
  16347. if (records[ri].trim() === 'BOT') { arr[++R] = []; C = 0; continue; }
  16348. if (R < 0) continue;
  16349. var metadata = records[ri].trim().split(",");
  16350. var type = metadata[0], value = metadata[1];
  16351. ++ri;
  16352. var data = records[ri].trim();
  16353. switch (+type) {
  16354. case -1:
  16355. if (data === 'BOT') { arr[++R] = []; C = 0; continue; }
  16356. else if (data !== 'EOD') throw new Error("Unrecognized DIF special command " + data);
  16357. break;
  16358. case 0:
  16359. if(data === 'TRUE') arr[R][C] = true;
  16360. else if(data === 'FALSE') arr[R][C] = false;
  16361. else if(!isNaN(fuzzynum(value))) arr[R][C] = fuzzynum(value);
  16362. else if(!isNaN(fuzzydate(value).getDate())) arr[R][C] = parseDate(value);
  16363. else arr[R][C] = value;
  16364. ++C; break;
  16365. case 1:
  16366. data = data.slice(1,data.length-1);
  16367. arr[R][C++] = data !== '' ? data : null;
  16368. break;
  16369. }
  16370. if (data === 'EOD') break;
  16371. }
  16372. if(opts && opts.sheetRows) arr = arr.slice(0, opts.sheetRows);
  16373. return arr;
  16374. }
  16375. function dif_to_sheet(str, opts) { return aoa_to_sheet(dif_to_aoa(str, opts), opts); }
  16376. function dif_to_workbook(str, opts) { return sheet_to_workbook(dif_to_sheet(str, opts), opts); }
  16377. var sheet_to_dif = (function() {
  16378. var push_field = function pf(o, topic, v, n, s) {
  16379. o.push(topic);
  16380. o.push(v + "," + n);
  16381. o.push('"' + s.replace(/"/g,'""') + '"');
  16382. };
  16383. var push_value = function po(o, type, v, s) {
  16384. o.push(type + "," + v);
  16385. o.push(type == 1 ? '"' + s.replace(/"/g,'""') + '"' : s);
  16386. };
  16387. return function sheet_to_dif(ws) {
  16388. var o = [];
  16389. var r = safe_decode_range(ws['!ref']), cell;
  16390. var dense = Array.isArray(ws);
  16391. push_field(o, "TABLE", 0, 1, "sheetjs");
  16392. push_field(o, "VECTORS", 0, r.e.r - r.s.r + 1,"");
  16393. push_field(o, "TUPLES", 0, r.e.c - r.s.c + 1,"");
  16394. push_field(o, "DATA", 0, 0,"");
  16395. for(var R = r.s.r; R <= r.e.r; ++R) {
  16396. push_value(o, -1, 0, "BOT");
  16397. for(var C = r.s.c; C <= r.e.c; ++C) {
  16398. var coord = encode_cell({r:R,c:C});
  16399. cell = dense ? (ws[R]||[])[C] : ws[coord];
  16400. if(!cell) { push_value(o, 1, 0, ""); continue;}
  16401. switch(cell.t) {
  16402. case 'n':
  16403. var val = DIF_XL ? cell.w : cell.v;
  16404. if(!val && cell.v != null) val = cell.v;
  16405. if(val == null) {
  16406. if(DIF_XL && cell.f && !cell.F) push_value(o, 1, 0, "=" + cell.f);
  16407. else push_value(o, 1, 0, "");
  16408. }
  16409. else push_value(o, 0, val, "V");
  16410. break;
  16411. case 'b':
  16412. push_value(o, 0, cell.v ? 1 : 0, cell.v ? "TRUE" : "FALSE");
  16413. break;
  16414. case 's':
  16415. push_value(o, 1, 0, (!DIF_XL || isNaN(cell.v)) ? cell.v : '="' + cell.v + '"');
  16416. break;
  16417. case 'd':
  16418. if(!cell.w) cell.w = SSF.format(cell.z || SSF._table[14], datenum(parseDate(cell.v)));
  16419. if(DIF_XL) push_value(o, 0, cell.w, "V");
  16420. else push_value(o, 1, 0, cell.w);
  16421. break;
  16422. default: push_value(o, 1, 0, "");
  16423. }
  16424. }
  16425. }
  16426. push_value(o, -1, 0, "EOD");
  16427. var RS = "\r\n";
  16428. var oo = o.join(RS);
  16429. //while((oo.length & 0x7F) != 0) oo += "\0";
  16430. return oo;
  16431. };
  16432. })();
  16433. return {
  16434. to_workbook: dif_to_workbook,
  16435. to_sheet: dif_to_sheet,
  16436. from_sheet: sheet_to_dif
  16437. };
  16438. })();
  16439. var ETH = (function() {
  16440. function decode(s) { return s.replace(/\\b/g,"\\").replace(/\\c/g,":").replace(/\\n/g,"\n"); }
  16441. function encode(s) { return s.replace(/\\/g, "\\b").replace(/:/g, "\\c").replace(/\n/g,"\\n"); }
  16442. function eth_to_aoa(str, opts) {
  16443. var records = str.split('\n'), R = -1, C = -1, ri = 0, arr = [];
  16444. for (; ri !== records.length; ++ri) {
  16445. var record = records[ri].trim().split(":");
  16446. if(record[0] !== 'cell') continue;
  16447. var addr = decode_cell(record[1]);
  16448. if(arr.length <= addr.r) for(R = arr.length; R <= addr.r; ++R) if(!arr[R]) arr[R] = [];
  16449. R = addr.r; C = addr.c;
  16450. switch(record[2]) {
  16451. case 't': arr[R][C] = decode(record[3]); break;
  16452. case 'v': arr[R][C] = +record[3]; break;
  16453. case 'vtf': var _f = record[record.length - 1];
  16454. /* falls through */
  16455. case 'vtc':
  16456. switch(record[3]) {
  16457. case 'nl': arr[R][C] = +record[4] ? true : false; break;
  16458. default: arr[R][C] = +record[4]; break;
  16459. }
  16460. if(record[2] == 'vtf') arr[R][C] = [arr[R][C], _f];
  16461. }
  16462. }
  16463. if(opts && opts.sheetRows) arr = arr.slice(0, opts.sheetRows);
  16464. return arr;
  16465. }
  16466. function eth_to_sheet(d, opts) { return aoa_to_sheet(eth_to_aoa(d, opts), opts); }
  16467. function eth_to_workbook(d, opts) { return sheet_to_workbook(eth_to_sheet(d, opts), opts); }
  16468. var header = [
  16469. "socialcalc:version:1.5",
  16470. "MIME-Version: 1.0",
  16471. "Content-Type: multipart/mixed; boundary=SocialCalcSpreadsheetControlSave"
  16472. ].join("\n");
  16473. var sep = [
  16474. "--SocialCalcSpreadsheetControlSave",
  16475. "Content-type: text/plain; charset=UTF-8"
  16476. ].join("\n") + "\n";
  16477. /* TODO: the other parts */
  16478. var meta = [
  16479. "# SocialCalc Spreadsheet Control Save",
  16480. "part:sheet"
  16481. ].join("\n");
  16482. var end = "--SocialCalcSpreadsheetControlSave--";
  16483. function sheet_to_eth_data(ws) {
  16484. if(!ws || !ws['!ref']) return "";
  16485. var o = [], oo = [], cell, coord = "";
  16486. var r = decode_range(ws['!ref']);
  16487. var dense = Array.isArray(ws);
  16488. for(var R = r.s.r; R <= r.e.r; ++R) {
  16489. for(var C = r.s.c; C <= r.e.c; ++C) {
  16490. coord = encode_cell({r:R,c:C});
  16491. cell = dense ? (ws[R]||[])[C] : ws[coord];
  16492. if(!cell || cell.v == null || cell.t === 'z') continue;
  16493. oo = ["cell", coord, 't'];
  16494. switch(cell.t) {
  16495. case 's': case 'str': oo.push(encode(cell.v)); break;
  16496. case 'n':
  16497. if(!cell.f) { oo[2]='v'; oo[3]=cell.v; }
  16498. else { oo[2]='vtf'; oo[3]='n'; oo[4]=cell.v; oo[5]=encode(cell.f); }
  16499. break;
  16500. case 'b':
  16501. oo[2] = 'vt'+(cell.f?'f':'c'); oo[3]='nl'; oo[4]=cell.v?"1":"0";
  16502. oo[5] = encode(cell.f||(cell.v?'TRUE':'FALSE'));
  16503. break;
  16504. case 'd':
  16505. var t = datenum(parseDate(cell.v));
  16506. oo[2] = 'vtc'; oo[3] = 'nd'; oo[4] = ""+t;
  16507. oo[5] = cell.w || SSF.format(cell.z || SSF._table[14], t);
  16508. break;
  16509. case 'e': continue;
  16510. }
  16511. o.push(oo.join(":"));
  16512. }
  16513. }
  16514. o.push("sheet:c:" + (r.e.c-r.s.c+1) + ":r:" + (r.e.r-r.s.r+1) + ":tvf:1");
  16515. o.push("valueformat:1:text-wiki");
  16516. //o.push("copiedfrom:" + ws['!ref']); // clipboard only
  16517. return o.join("\n");
  16518. }
  16519. function sheet_to_eth(ws) {
  16520. return [header, sep, meta, sep, sheet_to_eth_data(ws), end].join("\n");
  16521. // return ["version:1.5", sheet_to_eth_data(ws)].join("\n"); // clipboard form
  16522. }
  16523. return {
  16524. to_workbook: eth_to_workbook,
  16525. to_sheet: eth_to_sheet,
  16526. from_sheet: sheet_to_eth
  16527. };
  16528. })();
  16529. var PRN = (function() {
  16530. function set_text_arr(data, arr, R, C, o) {
  16531. if(o.raw) arr[R][C] = data;
  16532. else if(data === ""){/* empty */}
  16533. else if(data === 'TRUE') arr[R][C] = true;
  16534. else if(data === 'FALSE') arr[R][C] = false;
  16535. else if(!isNaN(fuzzynum(data))) arr[R][C] = fuzzynum(data);
  16536. else if(!isNaN(fuzzydate(data).getDate())) arr[R][C] = parseDate(data);
  16537. else arr[R][C] = data;
  16538. }
  16539. function prn_to_aoa_str(f, opts) {
  16540. var o = opts || {};
  16541. var arr = ([]);
  16542. if(!f || f.length === 0) return arr;
  16543. var lines = f.split(/[\r\n]/);
  16544. var L = lines.length - 1;
  16545. while(L >= 0 && lines[L].length === 0) --L;
  16546. var start = 10, idx = 0;
  16547. var R = 0;
  16548. for(; R <= L; ++R) {
  16549. idx = lines[R].indexOf(" ");
  16550. if(idx == -1) idx = lines[R].length; else idx++;
  16551. start = Math.max(start, idx);
  16552. }
  16553. for(R = 0; R <= L; ++R) {
  16554. arr[R] = [];
  16555. /* TODO: confirm that widths are always 10 */
  16556. var C = 0;
  16557. set_text_arr(lines[R].slice(0, start).trim(), arr, R, C, o);
  16558. for(C = 1; C <= (lines[R].length - start)/10 + 1; ++C)
  16559. set_text_arr(lines[R].slice(start+(C-1)*10,start+C*10).trim(),arr,R,C,o);
  16560. }
  16561. if(o.sheetRows) arr = arr.slice(0, o.sheetRows);
  16562. return arr;
  16563. }
  16564. // List of accepted CSV separators
  16565. var guess_seps = {
  16566. 0x2C: ',',
  16567. 0x09: "\t",
  16568. 0x3B: ';'
  16569. };
  16570. // CSV separator weights to be used in case of equal numbers
  16571. var guess_sep_weights = {
  16572. 0x2C: 3,
  16573. 0x09: 2,
  16574. 0x3B: 1
  16575. };
  16576. function guess_sep(str) {
  16577. var cnt = {}, instr = false, end = 0, cc = 0;
  16578. for(;end < str.length;++end) {
  16579. if((cc=str.charCodeAt(end)) == 0x22) instr = !instr;
  16580. else if(!instr && cc in guess_seps) cnt[cc] = (cnt[cc]||0)+1;
  16581. }
  16582. cc = [];
  16583. for(end in cnt) if ( Object.prototype.hasOwnProperty.call(cnt, end) ) {
  16584. cc.push([ cnt[end], end ]);
  16585. }
  16586. if ( !cc.length ) {
  16587. cnt = guess_sep_weights;
  16588. for(end in cnt) if ( Object.prototype.hasOwnProperty.call(cnt, end) ) {
  16589. cc.push([ cnt[end], end ]);
  16590. }
  16591. }
  16592. cc.sort(function(a, b) { return a[0] - b[0] || guess_sep_weights[a[1]] - guess_sep_weights[b[1]]; });
  16593. return guess_seps[cc.pop()[1]];
  16594. }
  16595. function dsv_to_sheet_str(str, opts) {
  16596. var o = opts || {};
  16597. var sep = "";
  16598. if(DENSE != null && o.dense == null) o.dense = DENSE;
  16599. var ws = o.dense ? ([]) : ({});
  16600. var range = ({s: {c:0, r:0}, e: {c:0, r:0}});
  16601. if(str.slice(0,4) == "sep=") {
  16602. // If the line ends in \r\n
  16603. if(str.charCodeAt(5) == 13 && str.charCodeAt(6) == 10 ) {
  16604. sep = str.charAt(4); str = str.slice(7);
  16605. }
  16606. // If line ends in \r OR \n
  16607. else if(str.charCodeAt(5) == 13 || str.charCodeAt(5) == 10 ) {
  16608. sep = str.charAt(4); str = str.slice(6);
  16609. }
  16610. else sep = guess_sep(str.slice(0,1024));
  16611. }
  16612. else sep = guess_sep(str.slice(0,1024));
  16613. var R = 0, C = 0, v = 0;
  16614. var start = 0, end = 0, sepcc = sep.charCodeAt(0), instr = false, cc=0;
  16615. str = str.replace(/\r\n/mg, "\n");
  16616. var _re = o.dateNF != null ? dateNF_regex(o.dateNF) : null;
  16617. function finish_cell() {
  16618. var s = str.slice(start, end);
  16619. var cell = ({});
  16620. if(s.charAt(0) == '"' && s.charAt(s.length - 1) == '"') s = s.slice(1,-1).replace(/""/g,'"');
  16621. if(s.length === 0) cell.t = 'z';
  16622. else if(o.raw) { cell.t = 's'; cell.v = s; }
  16623. else if(s.trim().length === 0) { cell.t = 's'; cell.v = s; }
  16624. else if(s.charCodeAt(0) == 0x3D) {
  16625. if(s.charCodeAt(1) == 0x22 && s.charCodeAt(s.length - 1) == 0x22) { cell.t = 's'; cell.v = s.slice(2,-1).replace(/""/g,'"'); }
  16626. else if(fuzzyfmla(s)) { cell.t = 'n'; cell.f = s.slice(1); }
  16627. else { cell.t = 's'; cell.v = s; } }
  16628. else if(s == "TRUE") { cell.t = 'b'; cell.v = true; }
  16629. else if(s == "FALSE") { cell.t = 'b'; cell.v = false; }
  16630. else if(!isNaN(v = fuzzynum(s))) { cell.t = 'n'; if(o.cellText !== false) cell.w = s; cell.v = v; }
  16631. else if(!isNaN(fuzzydate(s).getDate()) || _re && s.match(_re)) {
  16632. cell.z = o.dateNF || SSF._table[14];
  16633. var k = 0;
  16634. if(_re && s.match(_re)){ s=dateNF_fix(s, o.dateNF, (s.match(_re)||[])); k=1; }
  16635. if(o.cellDates) { cell.t = 'd'; cell.v = parseDate(s, k); }
  16636. else { cell.t = 'n'; cell.v = datenum(parseDate(s, k)); }
  16637. if(o.cellText !== false) cell.w = SSF.format(cell.z, cell.v instanceof Date ? datenum(cell.v):cell.v);
  16638. if(!o.cellNF) delete cell.z;
  16639. } else {
  16640. cell.t = 's';
  16641. cell.v = s;
  16642. }
  16643. if(cell.t == 'z'){}
  16644. else if(o.dense) { if(!ws[R]) ws[R] = []; ws[R][C] = cell; }
  16645. else ws[encode_cell({c:C,r:R})] = cell;
  16646. start = end+1;
  16647. if(range.e.c < C) range.e.c = C;
  16648. if(range.e.r < R) range.e.r = R;
  16649. if(cc == sepcc) ++C; else { C = 0; ++R; if(o.sheetRows && o.sheetRows <= R) return true; }
  16650. }
  16651. outer: for(;end < str.length;++end) switch((cc=str.charCodeAt(end))) {
  16652. case 0x22: instr = !instr; break;
  16653. case sepcc: case 0x0a: case 0x0d: if(!instr && finish_cell()) break outer; break;
  16654. default: break;
  16655. }
  16656. if(end - start > 0) finish_cell();
  16657. ws['!ref'] = encode_range(range);
  16658. return ws;
  16659. }
  16660. function prn_to_sheet_str(str, opts) {
  16661. if(!(opts && opts.PRN)) return dsv_to_sheet_str(str, opts);
  16662. if(str.slice(0,4) == "sep=") return dsv_to_sheet_str(str, opts);
  16663. if(str.indexOf("\t") >= 0 || str.indexOf(",") >= 0 || str.indexOf(";") >= 0) return dsv_to_sheet_str(str, opts);
  16664. return aoa_to_sheet(prn_to_aoa_str(str, opts), opts);
  16665. }
  16666. function prn_to_sheet(d, opts) {
  16667. var str = "", bytes = opts.type == 'string' ? [0,0,0,0] : firstbyte(d, opts);
  16668. switch(opts.type) {
  16669. case 'base64': str = Base64.decode(d); break;
  16670. case 'binary': str = d; break;
  16671. case 'buffer':
  16672. if(opts.codepage == 65001) str = d.toString('utf8');
  16673. else if(opts.codepage && typeof cptable !== 'undefined') str = cptable.utils.decode(opts.codepage, d);
  16674. else str = d.toString('binary');
  16675. break;
  16676. case 'array': str = cc2str(d); break;
  16677. case 'string': str = d; break;
  16678. default: throw new Error("Unrecognized type " + opts.type);
  16679. }
  16680. if(bytes[0] == 0xEF && bytes[1] == 0xBB && bytes[2] == 0xBF) str = utf8read(str.slice(3));
  16681. else if((opts.type == 'binary') && typeof cptable !== 'undefined' && opts.codepage) str = cptable.utils.decode(opts.codepage, cptable.utils.encode(28591,str));
  16682. if(str.slice(0,19) == "socialcalc:version:") return ETH.to_sheet(opts.type == 'string' ? str : utf8read(str), opts);
  16683. return prn_to_sheet_str(str, opts);
  16684. }
  16685. function prn_to_workbook(d, opts) { return sheet_to_workbook(prn_to_sheet(d, opts), opts); }
  16686. function sheet_to_prn(ws) {
  16687. var o = [];
  16688. var r = safe_decode_range(ws['!ref']), cell;
  16689. var dense = Array.isArray(ws);
  16690. for(var R = r.s.r; R <= r.e.r; ++R) {
  16691. var oo = [];
  16692. for(var C = r.s.c; C <= r.e.c; ++C) {
  16693. var coord = encode_cell({r:R,c:C});
  16694. cell = dense ? (ws[R]||[])[C] : ws[coord];
  16695. if(!cell || cell.v == null) { oo.push(" "); continue; }
  16696. var w = (cell.w || (format_cell(cell), cell.w) || "").slice(0,10);
  16697. while(w.length < 10) w += " ";
  16698. oo.push(w + (C === 0 ? " " : ""));
  16699. }
  16700. o.push(oo.join(""));
  16701. }
  16702. return o.join("\n");
  16703. }
  16704. return {
  16705. to_workbook: prn_to_workbook,
  16706. to_sheet: prn_to_sheet,
  16707. from_sheet: sheet_to_prn
  16708. };
  16709. })();
  16710. /* Excel defaults to SYLK but warns if data is not valid */
  16711. function read_wb_ID(d, opts) {
  16712. var o = opts || {}, OLD_WTF = !!o.WTF; o.WTF = true;
  16713. try {
  16714. var out = SYLK.to_workbook(d, o);
  16715. o.WTF = OLD_WTF;
  16716. return out;
  16717. } catch(e) {
  16718. o.WTF = OLD_WTF;
  16719. if(!e.message.match(/SYLK bad record ID/) && OLD_WTF) throw e;
  16720. return PRN.to_workbook(d, opts);
  16721. }
  16722. }
  16723. var WK_ = (function() {
  16724. function lotushopper(data, cb, opts) {
  16725. if(!data) return;
  16726. prep_blob(data, data.l || 0);
  16727. var Enum = opts.Enum || WK1Enum;
  16728. while(data.l < data.length) {
  16729. var RT = data.read_shift(2);
  16730. var R = Enum[RT] || Enum[0xFF];
  16731. var length = data.read_shift(2);
  16732. var tgt = data.l + length;
  16733. var d = (R.f||parsenoop)(data, length, opts);
  16734. data.l = tgt;
  16735. if(cb(d, R.n, RT)) return;
  16736. }
  16737. }
  16738. function lotus_to_workbook(d, opts) {
  16739. switch(opts.type) {
  16740. case 'base64': return lotus_to_workbook_buf(s2a(Base64.decode(d)), opts);
  16741. case 'binary': return lotus_to_workbook_buf(s2a(d), opts);
  16742. case 'buffer':
  16743. case 'array': return lotus_to_workbook_buf(d, opts);
  16744. }
  16745. throw "Unsupported type " + opts.type;
  16746. }
  16747. function lotus_to_workbook_buf(d, opts) {
  16748. if(!d) return d;
  16749. var o = opts || {};
  16750. if(DENSE != null && o.dense == null) o.dense = DENSE;
  16751. var s = ((o.dense ? [] : {})), n = "Sheet1", sidx = 0;
  16752. var sheets = {}, snames = [n];
  16753. var refguess = {s: {r:0, c:0}, e: {r:0, c:0} };
  16754. var sheetRows = o.sheetRows || 0;
  16755. if(d[2] == 0x02) o.Enum = WK1Enum;
  16756. else if(d[2] == 0x1a) o.Enum = WK3Enum;
  16757. else if(d[2] == 0x0e) { o.Enum = WK3Enum; o.qpro = true; d.l = 0; }
  16758. else throw new Error("Unrecognized LOTUS BOF " + d[2]);
  16759. lotushopper(d, function(val, Rn, RT) {
  16760. if(d[2] == 0x02) switch(RT) {
  16761. case 0x00:
  16762. o.vers = val;
  16763. if(val >= 0x1000) o.qpro = true;
  16764. break;
  16765. case 0x06: refguess = val; break; /* RANGE */
  16766. case 0x0F: /* LABEL */
  16767. if(!o.qpro) val[1].v = val[1].v.slice(1);
  16768. /* falls through */
  16769. case 0x0D: /* INTEGER */
  16770. case 0x0E: /* NUMBER */
  16771. case 0x10: /* FORMULA */
  16772. case 0x33: /* STRING */
  16773. /* TODO: actual translation of the format code */
  16774. if(RT == 0x0E && (val[2] & 0x70) == 0x70 && (val[2] & 0x0F) > 1 && (val[2] & 0x0F) < 15) {
  16775. val[1].z = o.dateNF || SSF._table[14];
  16776. if(o.cellDates) { val[1].t = 'd'; val[1].v = numdate(val[1].v); }
  16777. }
  16778. if(o.dense) {
  16779. if(!s[val[0].r]) s[val[0].r] = [];
  16780. s[val[0].r][val[0].c] = val[1];
  16781. } else s[encode_cell(val[0])] = val[1];
  16782. break;
  16783. } else switch(RT) {
  16784. case 0x16: /* LABEL16 */
  16785. val[1].v = val[1].v.slice(1);
  16786. /* falls through */
  16787. case 0x17: /* NUMBER17 */
  16788. case 0x18: /* NUMBER18 */
  16789. case 0x19: /* FORMULA19 */
  16790. case 0x25: /* NUMBER25 */
  16791. case 0x27: /* NUMBER27 */
  16792. case 0x28: /* FORMULA28 */
  16793. if(val[3] > sidx) {
  16794. s["!ref"] = encode_range(refguess);
  16795. sheets[n] = s;
  16796. s = (o.dense ? [] : {});
  16797. refguess = {s: {r:0, c:0}, e: {r:0, c:0} };
  16798. sidx = val[3]; n = "Sheet" + (sidx + 1);
  16799. snames.push(n);
  16800. }
  16801. if(sheetRows > 0 && val[0].r >= sheetRows) break;
  16802. if(o.dense) {
  16803. if(!s[val[0].r]) s[val[0].r] = [];
  16804. s[val[0].r][val[0].c] = val[1];
  16805. } else s[encode_cell(val[0])] = val[1];
  16806. if(refguess.e.c < val[0].c) refguess.e.c = val[0].c;
  16807. if(refguess.e.r < val[0].r) refguess.e.r = val[0].r;
  16808. break;
  16809. default: break;
  16810. }
  16811. }, o);
  16812. s["!ref"] = encode_range(refguess);
  16813. sheets[n] = s;
  16814. return { SheetNames: snames, Sheets:sheets };
  16815. }
  16816. function parse_RANGE(blob) {
  16817. var o = {s:{c:0,r:0},e:{c:0,r:0}};
  16818. o.s.c = blob.read_shift(2);
  16819. o.s.r = blob.read_shift(2);
  16820. o.e.c = blob.read_shift(2);
  16821. o.e.r = blob.read_shift(2);
  16822. if(o.s.c == 0xFFFF) o.s.c = o.e.c = o.s.r = o.e.r = 0;
  16823. return o;
  16824. }
  16825. function parse_cell(blob, length, opts) {
  16826. var o = [{c:0,r:0}, {t:'n',v:0}, 0];
  16827. if(opts.qpro && opts.vers != 0x5120) {
  16828. o[0].c = blob.read_shift(1);
  16829. blob.l++;
  16830. o[0].r = blob.read_shift(2);
  16831. blob.l+=2;
  16832. } else {
  16833. o[2] = blob.read_shift(1);
  16834. o[0].c = blob.read_shift(2); o[0].r = blob.read_shift(2);
  16835. }
  16836. return o;
  16837. }
  16838. function parse_LABEL(blob, length, opts) {
  16839. var tgt = blob.l + length;
  16840. var o = parse_cell(blob, length, opts);
  16841. o[1].t = 's';
  16842. if(opts.vers == 0x5120) {
  16843. blob.l++;
  16844. var len = blob.read_shift(1);
  16845. o[1].v = blob.read_shift(len, 'utf8');
  16846. return o;
  16847. }
  16848. if(opts.qpro) blob.l++;
  16849. o[1].v = blob.read_shift(tgt - blob.l, 'cstr');
  16850. return o;
  16851. }
  16852. function parse_INTEGER(blob, length, opts) {
  16853. var o = parse_cell(blob, length, opts);
  16854. o[1].v = blob.read_shift(2, 'i');
  16855. return o;
  16856. }
  16857. function parse_NUMBER(blob, length, opts) {
  16858. var o = parse_cell(blob, length, opts);
  16859. o[1].v = blob.read_shift(8, 'f');
  16860. return o;
  16861. }
  16862. function parse_FORMULA(blob, length, opts) {
  16863. var tgt = blob.l + length;
  16864. var o = parse_cell(blob, length, opts);
  16865. /* TODO: formula */
  16866. o[1].v = blob.read_shift(8, 'f');
  16867. if(opts.qpro) blob.l = tgt;
  16868. else {
  16869. var flen = blob.read_shift(2);
  16870. blob.l += flen;
  16871. }
  16872. return o;
  16873. }
  16874. function parse_cell_3(blob) {
  16875. var o = [{c:0,r:0}, {t:'n',v:0}, 0];
  16876. o[0].r = blob.read_shift(2); o[3] = blob[blob.l++]; o[0].c = blob[blob.l++];
  16877. return o;
  16878. }
  16879. function parse_LABEL_16(blob, length) {
  16880. var o = parse_cell_3(blob, length);
  16881. o[1].t = 's';
  16882. o[1].v = blob.read_shift(length - 4, 'cstr');
  16883. return o;
  16884. }
  16885. function parse_NUMBER_18(blob, length) {
  16886. var o = parse_cell_3(blob, length);
  16887. o[1].v = blob.read_shift(2);
  16888. var v = o[1].v >> 1;
  16889. /* TODO: figure out all of the corner cases */
  16890. if(o[1].v & 0x1) {
  16891. switch(v & 0x07) {
  16892. case 1: v = (v >> 3) * 500; break;
  16893. case 2: v = (v >> 3) / 20; break;
  16894. case 4: v = (v >> 3) / 2000; break;
  16895. case 6: v = (v >> 3) / 16; break;
  16896. case 7: v = (v >> 3) / 64; break;
  16897. default: throw "unknown NUMBER_18 encoding " + (v & 0x07);
  16898. }
  16899. }
  16900. o[1].v = v;
  16901. return o;
  16902. }
  16903. function parse_NUMBER_17(blob, length) {
  16904. var o = parse_cell_3(blob, length);
  16905. var v1 = blob.read_shift(4);
  16906. var v2 = blob.read_shift(4);
  16907. var e = blob.read_shift(2);
  16908. if(e == 0xFFFF) { o[1].v = 0; return o; }
  16909. var s = e & 0x8000; e = (e&0x7FFF) - 16446;
  16910. o[1].v = (s*2 - 1) * ((e > 0 ? (v2 << e) : (v2 >>> -e)) + (e > -32 ? (v1 << (e + 32)) : (v1 >>> -(e + 32))));
  16911. return o;
  16912. }
  16913. function parse_FORMULA_19(blob, length) {
  16914. var o = parse_NUMBER_17(blob, 14);
  16915. blob.l += length - 14; /* TODO: formula */
  16916. return o;
  16917. }
  16918. function parse_NUMBER_25(blob, length) {
  16919. var o = parse_cell_3(blob, length);
  16920. var v1 = blob.read_shift(4);
  16921. o[1].v = v1 >> 6;
  16922. return o;
  16923. }
  16924. function parse_NUMBER_27(blob, length) {
  16925. var o = parse_cell_3(blob, length);
  16926. var v1 = blob.read_shift(8,'f');
  16927. o[1].v = v1;
  16928. return o;
  16929. }
  16930. function parse_FORMULA_28(blob, length) {
  16931. var o = parse_NUMBER_27(blob, 14);
  16932. blob.l += length - 10; /* TODO: formula */
  16933. return o;
  16934. }
  16935. var WK1Enum = {
  16936. 0x0000: { n:"BOF", f:parseuint16 },
  16937. 0x0001: { n:"EOF" },
  16938. 0x0002: { n:"CALCMODE" },
  16939. 0x0003: { n:"CALCORDER" },
  16940. 0x0004: { n:"SPLIT" },
  16941. 0x0005: { n:"SYNC" },
  16942. 0x0006: { n:"RANGE", f:parse_RANGE },
  16943. 0x0007: { n:"WINDOW1" },
  16944. 0x0008: { n:"COLW1" },
  16945. 0x0009: { n:"WINTWO" },
  16946. 0x000A: { n:"COLW2" },
  16947. 0x000B: { n:"NAME" },
  16948. 0x000C: { n:"BLANK" },
  16949. 0x000D: { n:"INTEGER", f:parse_INTEGER },
  16950. 0x000E: { n:"NUMBER", f:parse_NUMBER },
  16951. 0x000F: { n:"LABEL", f:parse_LABEL },
  16952. 0x0010: { n:"FORMULA", f:parse_FORMULA },
  16953. 0x0018: { n:"TABLE" },
  16954. 0x0019: { n:"ORANGE" },
  16955. 0x001A: { n:"PRANGE" },
  16956. 0x001B: { n:"SRANGE" },
  16957. 0x001C: { n:"FRANGE" },
  16958. 0x001D: { n:"KRANGE1" },
  16959. 0x0020: { n:"HRANGE" },
  16960. 0x0023: { n:"KRANGE2" },
  16961. 0x0024: { n:"PROTEC" },
  16962. 0x0025: { n:"FOOTER" },
  16963. 0x0026: { n:"HEADER" },
  16964. 0x0027: { n:"SETUP" },
  16965. 0x0028: { n:"MARGINS" },
  16966. 0x0029: { n:"LABELFMT" },
  16967. 0x002A: { n:"TITLES" },
  16968. 0x002B: { n:"SHEETJS" },
  16969. 0x002D: { n:"GRAPH" },
  16970. 0x002E: { n:"NGRAPH" },
  16971. 0x002F: { n:"CALCCOUNT" },
  16972. 0x0030: { n:"UNFORMATTED" },
  16973. 0x0031: { n:"CURSORW12" },
  16974. 0x0032: { n:"WINDOW" },
  16975. 0x0033: { n:"STRING", f:parse_LABEL },
  16976. 0x0037: { n:"PASSWORD" },
  16977. 0x0038: { n:"LOCKED" },
  16978. 0x003C: { n:"QUERY" },
  16979. 0x003D: { n:"QUERYNAME" },
  16980. 0x003E: { n:"PRINT" },
  16981. 0x003F: { n:"PRINTNAME" },
  16982. 0x0040: { n:"GRAPH2" },
  16983. 0x0041: { n:"GRAPHNAME" },
  16984. 0x0042: { n:"ZOOM" },
  16985. 0x0043: { n:"SYMSPLIT" },
  16986. 0x0044: { n:"NSROWS" },
  16987. 0x0045: { n:"NSCOLS" },
  16988. 0x0046: { n:"RULER" },
  16989. 0x0047: { n:"NNAME" },
  16990. 0x0048: { n:"ACOMM" },
  16991. 0x0049: { n:"AMACRO" },
  16992. 0x004A: { n:"PARSE" },
  16993. 0x00FF: { n:"", f:parsenoop }
  16994. };
  16995. var WK3Enum = {
  16996. 0x0000: { n:"BOF" },
  16997. 0x0001: { n:"EOF" },
  16998. 0x0003: { n:"??" },
  16999. 0x0004: { n:"??" },
  17000. 0x0005: { n:"??" },
  17001. 0x0006: { n:"??" },
  17002. 0x0007: { n:"??" },
  17003. 0x0009: { n:"??" },
  17004. 0x000a: { n:"??" },
  17005. 0x000b: { n:"??" },
  17006. 0x000c: { n:"??" },
  17007. 0x000e: { n:"??" },
  17008. 0x000f: { n:"??" },
  17009. 0x0010: { n:"??" },
  17010. 0x0011: { n:"??" },
  17011. 0x0012: { n:"??" },
  17012. 0x0013: { n:"??" },
  17013. 0x0015: { n:"??" },
  17014. 0x0016: { n:"LABEL16", f:parse_LABEL_16},
  17015. 0x0017: { n:"NUMBER17", f:parse_NUMBER_17 },
  17016. 0x0018: { n:"NUMBER18", f:parse_NUMBER_18 },
  17017. 0x0019: { n:"FORMULA19", f:parse_FORMULA_19},
  17018. 0x001a: { n:"??" },
  17019. 0x001b: { n:"??" },
  17020. 0x001c: { n:"??" },
  17021. 0x001d: { n:"??" },
  17022. 0x001e: { n:"??" },
  17023. 0x001f: { n:"??" },
  17024. 0x0021: { n:"??" },
  17025. 0x0025: { n:"NUMBER25", f:parse_NUMBER_25 },
  17026. 0x0027: { n:"NUMBER27", f:parse_NUMBER_27 },
  17027. 0x0028: { n:"FORMULA28", f:parse_FORMULA_28 },
  17028. 0x00FF: { n:"", f:parsenoop }
  17029. };
  17030. return {
  17031. to_workbook: lotus_to_workbook
  17032. };
  17033. })();
  17034. /* 18.4.7 rPr CT_RPrElt */
  17035. function parse_rpr(rpr) {
  17036. var font = {}, m = rpr.match(tagregex), i = 0;
  17037. var pass = false;
  17038. if(m) for(;i!=m.length; ++i) {
  17039. var y = parsexmltag(m[i]);
  17040. switch(y[0].replace(/\w*:/g,"")) {
  17041. /* 18.8.12 condense CT_BooleanProperty */
  17042. /* ** not required . */
  17043. case '<condense': break;
  17044. /* 18.8.17 extend CT_BooleanProperty */
  17045. /* ** not required . */
  17046. case '<extend': break;
  17047. /* 18.8.36 shadow CT_BooleanProperty */
  17048. /* ** not required . */
  17049. case '<shadow':
  17050. if(!y.val) break;
  17051. /* falls through */
  17052. case '<shadow>':
  17053. case '<shadow/>': font.shadow = 1; break;
  17054. case '</shadow>': break;
  17055. /* 18.4.1 charset CT_IntProperty TODO */
  17056. case '<charset':
  17057. if(y.val == '1') break;
  17058. font.cp = CS2CP[parseInt(y.val, 10)];
  17059. break;
  17060. /* 18.4.2 outline CT_BooleanProperty TODO */
  17061. case '<outline':
  17062. if(!y.val) break;
  17063. /* falls through */
  17064. case '<outline>':
  17065. case '<outline/>': font.outline = 1; break;
  17066. case '</outline>': break;
  17067. /* 18.4.5 rFont CT_FontName */
  17068. case '<rFont': font.name = y.val; break;
  17069. /* 18.4.11 sz CT_FontSize */
  17070. case '<sz': font.sz = y.val; break;
  17071. /* 18.4.10 strike CT_BooleanProperty */
  17072. case '<strike':
  17073. if(!y.val) break;
  17074. /* falls through */
  17075. case '<strike>':
  17076. case '<strike/>': font.strike = 1; break;
  17077. case '</strike>': break;
  17078. /* 18.4.13 u CT_UnderlineProperty */
  17079. case '<u':
  17080. if(!y.val) break;
  17081. switch(y.val) {
  17082. case 'double': font.uval = "double"; break;
  17083. case 'singleAccounting': font.uval = "single-accounting"; break;
  17084. case 'doubleAccounting': font.uval = "double-accounting"; break;
  17085. }
  17086. /* falls through */
  17087. case '<u>':
  17088. case '<u/>': font.u = 1; break;
  17089. case '</u>': break;
  17090. /* 18.8.2 b */
  17091. case '<b':
  17092. if(y.val == '0') break;
  17093. /* falls through */
  17094. case '<b>':
  17095. case '<b/>': font.b = 1; break;
  17096. case '</b>': break;
  17097. /* 18.8.26 i */
  17098. case '<i':
  17099. if(y.val == '0') break;
  17100. /* falls through */
  17101. case '<i>':
  17102. case '<i/>': font.i = 1; break;
  17103. case '</i>': break;
  17104. /* 18.3.1.15 color CT_Color TODO: tint, theme, auto, indexed */
  17105. case '<color':
  17106. if(y.rgb) font.color = y.rgb.slice(2,8);
  17107. break;
  17108. /* 18.8.18 family ST_FontFamily */
  17109. case '<family': font.family = y.val; break;
  17110. /* 18.4.14 vertAlign CT_VerticalAlignFontProperty TODO */
  17111. case '<vertAlign': font.valign = y.val; break;
  17112. /* 18.8.35 scheme CT_FontScheme TODO */
  17113. case '<scheme': break;
  17114. /* 18.2.10 extLst CT_ExtensionList ? */
  17115. case '<extLst': case '<extLst>': case '</extLst>': break;
  17116. case '<ext': pass = true; break;
  17117. case '</ext>': pass = false; break;
  17118. default:
  17119. if(y[0].charCodeAt(1) !== 47 && !pass) throw new Error('Unrecognized rich format ' + y[0]);
  17120. }
  17121. }
  17122. return font;
  17123. }
  17124. var parse_rs = (function() {
  17125. var tregex = matchtag("t"), rpregex = matchtag("rPr");
  17126. /* 18.4.4 r CT_RElt */
  17127. function parse_r(r) {
  17128. /* 18.4.12 t ST_Xstring */
  17129. var t = r.match(tregex)/*, cp = 65001*/;
  17130. if(!t) return {t:"s", v:""};
  17131. var o = ({t:'s', v:unescapexml(t[1])});
  17132. var rpr = r.match(rpregex);
  17133. if(rpr) o.s = parse_rpr(rpr[1]);
  17134. return o;
  17135. }
  17136. var rregex = /<(?:\w+:)?r>/g, rend = /<\/(?:\w+:)?r>/;
  17137. return function parse_rs(rs) {
  17138. return rs.replace(rregex,"").split(rend).map(parse_r).filter(function(r) { return r.v; });
  17139. };
  17140. })();
  17141. /* Parse a list of <r> tags */
  17142. var rs_to_html = (function parse_rs_factory() {
  17143. var nlregex = /(\r\n|\n)/g;
  17144. function parse_rpr2(font, intro, outro) {
  17145. var style = [];
  17146. if(font.u) style.push("text-decoration: underline;");
  17147. if(font.uval) style.push("text-underline-style:" + font.uval + ";");
  17148. if(font.sz) style.push("font-size:" + font.sz + "pt;");
  17149. if(font.outline) style.push("text-effect: outline;");
  17150. if(font.shadow) style.push("text-shadow: auto;");
  17151. intro.push('<span style="' + style.join("") + '">');
  17152. if(font.b) { intro.push("<b>"); outro.push("</b>"); }
  17153. if(font.i) { intro.push("<i>"); outro.push("</i>"); }
  17154. if(font.strike) { intro.push("<s>"); outro.push("</s>"); }
  17155. var align = font.valign || "";
  17156. if(align == "superscript" || align == "super") align = "sup";
  17157. else if(align == "subscript") align = "sub";
  17158. if(align != "") { intro.push("<" + align + ">"); outro.push("</" + align + ">"); }
  17159. outro.push("</span>");
  17160. return font;
  17161. }
  17162. /* 18.4.4 r CT_RElt */
  17163. function r_to_html(r) {
  17164. var terms = [[],r.v,[]];
  17165. if(!r.v) return "";
  17166. if(r.s) parse_rpr2(r.s, terms[0], terms[2]);
  17167. return terms[0].join("") + terms[1].replace(nlregex,'<br/>') + terms[2].join("");
  17168. }
  17169. return function parse_rs(rs) {
  17170. return rs.map(r_to_html).join("");
  17171. };
  17172. })();
  17173. /* 18.4.8 si CT_Rst */
  17174. var sitregex = /<(?:\w+:)?t[^>]*>([^<]*)<\/(?:\w+:)?t>/g, sirregex = /<(?:\w+:)?r>/;
  17175. var sirphregex = /<(?:\w+:)?rPh.*?>([\s\S]*?)<\/(?:\w+:)?rPh>/g;
  17176. function parse_si(x, opts) {
  17177. var html = opts ? opts.cellHTML : true;
  17178. var z = {};
  17179. if(!x) return { t: "" };
  17180. //var y;
  17181. /* 18.4.12 t ST_Xstring (Plaintext String) */
  17182. // TODO: is whitespace actually valid here?
  17183. if(x.match(/^\s*<(?:\w+:)?t[^>]*>/)) {
  17184. z.t = unescapexml(utf8read(x.slice(x.indexOf(">")+1).split(/<\/(?:\w+:)?t>/)[0]||""));
  17185. z.r = utf8read(x);
  17186. if(html) z.h = escapehtml(z.t);
  17187. }
  17188. /* 18.4.4 r CT_RElt (Rich Text Run) */
  17189. else if((/*y = */x.match(sirregex))) {
  17190. z.r = utf8read(x);
  17191. z.t = unescapexml(utf8read((x.replace(sirphregex, '').match(sitregex)||[]).join("").replace(tagregex,"")));
  17192. if(html) z.h = rs_to_html(parse_rs(z.r));
  17193. }
  17194. /* 18.4.3 phoneticPr CT_PhoneticPr (TODO: needed for Asian support) */
  17195. /* 18.4.6 rPh CT_PhoneticRun (TODO: needed for Asian support) */
  17196. return z;
  17197. }
  17198. /* 18.4 Shared String Table */
  17199. var sstr0 = /<(?:\w+:)?sst([^>]*)>([\s\S]*)<\/(?:\w+:)?sst>/;
  17200. var sstr1 = /<(?:\w+:)?(?:si|sstItem)>/g;
  17201. var sstr2 = /<\/(?:\w+:)?(?:si|sstItem)>/;
  17202. function parse_sst_xml(data, opts) {
  17203. var s = ([]), ss = "";
  17204. if(!data) return s;
  17205. /* 18.4.9 sst CT_Sst */
  17206. var sst = data.match(sstr0);
  17207. if(sst) {
  17208. ss = sst[2].replace(sstr1,"").split(sstr2);
  17209. for(var i = 0; i != ss.length; ++i) {
  17210. var o = parse_si(ss[i].trim(), opts);
  17211. if(o != null) s[s.length] = o;
  17212. }
  17213. sst = parsexmltag(sst[1]); s.Count = sst.count; s.Unique = sst.uniqueCount;
  17214. }
  17215. return s;
  17216. }
  17217. RELS.SST = "http://schemas.openxmlformats.org/officeDocument/2006/relationships/sharedStrings";
  17218. var straywsregex = /^\s|\s$|[\t\n\r]/;
  17219. function write_sst_xml(sst, opts) {
  17220. if(!opts.bookSST) return "";
  17221. var o = [XML_HEADER];
  17222. o[o.length] = (writextag('sst', null, {
  17223. xmlns: XMLNS.main[0],
  17224. count: sst.Count,
  17225. uniqueCount: sst.Unique
  17226. }));
  17227. for(var i = 0; i != sst.length; ++i) { if(sst[i] == null) continue;
  17228. var s = sst[i];
  17229. var sitag = "<si>";
  17230. if(s.r) sitag += s.r;
  17231. else {
  17232. sitag += "<t";
  17233. if(!s.t) s.t = "";
  17234. if(s.t.match(straywsregex)) sitag += ' xml:space="preserve"';
  17235. sitag += ">" + escapexml(s.t) + "</t>";
  17236. }
  17237. sitag += "</si>";
  17238. o[o.length] = (sitag);
  17239. }
  17240. if(o.length>2){ o[o.length] = ('</sst>'); o[1]=o[1].replace("/>",">"); }
  17241. return o.join("");
  17242. }
  17243. /* [MS-XLSB] 2.4.221 BrtBeginSst */
  17244. function parse_BrtBeginSst(data) {
  17245. return [data.read_shift(4), data.read_shift(4)];
  17246. }
  17247. /* [MS-XLSB] 2.1.7.45 Shared Strings */
  17248. function parse_sst_bin(data, opts) {
  17249. var s = ([]);
  17250. var pass = false;
  17251. recordhopper(data, function hopper_sst(val, R_n, RT) {
  17252. switch(RT) {
  17253. case 0x009F: /* 'BrtBeginSst' */
  17254. s.Count = val[0]; s.Unique = val[1]; break;
  17255. case 0x0013: /* 'BrtSSTItem' */
  17256. s.push(val); break;
  17257. case 0x00A0: /* 'BrtEndSst' */
  17258. return true;
  17259. case 0x0023: /* 'BrtFRTBegin' */
  17260. pass = true; break;
  17261. case 0x0024: /* 'BrtFRTEnd' */
  17262. pass = false; break;
  17263. default:
  17264. if(R_n.indexOf("Begin") > 0){/* empty */}
  17265. else if(R_n.indexOf("End") > 0){/* empty */}
  17266. if(!pass || opts.WTF) throw new Error("Unexpected record " + RT + " " + R_n);
  17267. }
  17268. });
  17269. return s;
  17270. }
  17271. function write_BrtBeginSst(sst, o) {
  17272. if(!o) o = new_buf(8);
  17273. o.write_shift(4, sst.Count);
  17274. o.write_shift(4, sst.Unique);
  17275. return o;
  17276. }
  17277. var write_BrtSSTItem = write_RichStr;
  17278. function write_sst_bin(sst) {
  17279. var ba = buf_array();
  17280. write_record(ba, "BrtBeginSst", write_BrtBeginSst(sst));
  17281. for(var i = 0; i < sst.length; ++i) write_record(ba, "BrtSSTItem", write_BrtSSTItem(sst[i]));
  17282. /* FRTSST */
  17283. write_record(ba, "BrtEndSst");
  17284. return ba.end();
  17285. }
  17286. function _JS2ANSI(str) {
  17287. if(typeof cptable !== 'undefined') return cptable.utils.encode(current_ansi, str);
  17288. var o = [], oo = str.split("");
  17289. for(var i = 0; i < oo.length; ++i) o[i] = oo[i].charCodeAt(0);
  17290. return o;
  17291. }
  17292. /* [MS-OFFCRYPTO] 2.1.4 Version */
  17293. function parse_CRYPTOVersion(blob, length) {
  17294. var o = {};
  17295. o.Major = blob.read_shift(2);
  17296. o.Minor = blob.read_shift(2);
  17297. if(length >= 4) blob.l += length - 4;
  17298. return o;
  17299. }
  17300. /* [MS-OFFCRYPTO] 2.1.5 DataSpaceVersionInfo */
  17301. function parse_DataSpaceVersionInfo(blob) {
  17302. var o = {};
  17303. o.id = blob.read_shift(0, 'lpp4');
  17304. o.R = parse_CRYPTOVersion(blob, 4);
  17305. o.U = parse_CRYPTOVersion(blob, 4);
  17306. o.W = parse_CRYPTOVersion(blob, 4);
  17307. return o;
  17308. }
  17309. /* [MS-OFFCRYPTO] 2.1.6.1 DataSpaceMapEntry Structure */
  17310. function parse_DataSpaceMapEntry(blob) {
  17311. var len = blob.read_shift(4);
  17312. var end = blob.l + len - 4;
  17313. var o = {};
  17314. var cnt = blob.read_shift(4);
  17315. var comps = [];
  17316. /* [MS-OFFCRYPTO] 2.1.6.2 DataSpaceReferenceComponent Structure */
  17317. while(cnt-- > 0) comps.push({ t: blob.read_shift(4), v: blob.read_shift(0, 'lpp4') });
  17318. o.name = blob.read_shift(0, 'lpp4');
  17319. o.comps = comps;
  17320. if(blob.l != end) throw new Error("Bad DataSpaceMapEntry: " + blob.l + " != " + end);
  17321. return o;
  17322. }
  17323. /* [MS-OFFCRYPTO] 2.1.6 DataSpaceMap */
  17324. function parse_DataSpaceMap(blob) {
  17325. var o = [];
  17326. blob.l += 4; // must be 0x8
  17327. var cnt = blob.read_shift(4);
  17328. while(cnt-- > 0) o.push(parse_DataSpaceMapEntry(blob));
  17329. return o;
  17330. }
  17331. /* [MS-OFFCRYPTO] 2.1.7 DataSpaceDefinition */
  17332. function parse_DataSpaceDefinition(blob) {
  17333. var o = [];
  17334. blob.l += 4; // must be 0x8
  17335. var cnt = blob.read_shift(4);
  17336. while(cnt-- > 0) o.push(blob.read_shift(0, 'lpp4'));
  17337. return o;
  17338. }
  17339. /* [MS-OFFCRYPTO] 2.1.8 DataSpaceDefinition */
  17340. function parse_TransformInfoHeader(blob) {
  17341. var o = {};
  17342. /*var len = */blob.read_shift(4);
  17343. blob.l += 4; // must be 0x1
  17344. o.id = blob.read_shift(0, 'lpp4');
  17345. o.name = blob.read_shift(0, 'lpp4');
  17346. o.R = parse_CRYPTOVersion(blob, 4);
  17347. o.U = parse_CRYPTOVersion(blob, 4);
  17348. o.W = parse_CRYPTOVersion(blob, 4);
  17349. return o;
  17350. }
  17351. function parse_Primary(blob) {
  17352. /* [MS-OFFCRYPTO] 2.2.6 IRMDSTransformInfo */
  17353. var hdr = parse_TransformInfoHeader(blob);
  17354. /* [MS-OFFCRYPTO] 2.1.9 EncryptionTransformInfo */
  17355. hdr.ename = blob.read_shift(0, '8lpp4');
  17356. hdr.blksz = blob.read_shift(4);
  17357. hdr.cmode = blob.read_shift(4);
  17358. if(blob.read_shift(4) != 0x04) throw new Error("Bad !Primary record");
  17359. return hdr;
  17360. }
  17361. /* [MS-OFFCRYPTO] 2.3.2 Encryption Header */
  17362. function parse_EncryptionHeader(blob, length) {
  17363. var tgt = blob.l + length;
  17364. var o = {};
  17365. o.Flags = (blob.read_shift(4) & 0x3F);
  17366. blob.l += 4;
  17367. o.AlgID = blob.read_shift(4);
  17368. var valid = false;
  17369. switch(o.AlgID) {
  17370. case 0x660E: case 0x660F: case 0x6610: valid = (o.Flags == 0x24); break;
  17371. case 0x6801: valid = (o.Flags == 0x04); break;
  17372. case 0: valid = (o.Flags == 0x10 || o.Flags == 0x04 || o.Flags == 0x24); break;
  17373. default: throw 'Unrecognized encryption algorithm: ' + o.AlgID;
  17374. }
  17375. if(!valid) throw new Error("Encryption Flags/AlgID mismatch");
  17376. o.AlgIDHash = blob.read_shift(4);
  17377. o.KeySize = blob.read_shift(4);
  17378. o.ProviderType = blob.read_shift(4);
  17379. blob.l += 8;
  17380. o.CSPName = blob.read_shift((tgt-blob.l)>>1, 'utf16le');
  17381. blob.l = tgt;
  17382. return o;
  17383. }
  17384. /* [MS-OFFCRYPTO] 2.3.3 Encryption Verifier */
  17385. function parse_EncryptionVerifier(blob, length) {
  17386. var o = {}, tgt = blob.l + length;
  17387. blob.l += 4; // SaltSize must be 0x10
  17388. o.Salt = blob.slice(blob.l, blob.l+16); blob.l += 16;
  17389. o.Verifier = blob.slice(blob.l, blob.l+16); blob.l += 16;
  17390. /*var sz = */blob.read_shift(4);
  17391. o.VerifierHash = blob.slice(blob.l, tgt); blob.l = tgt;
  17392. return o;
  17393. }
  17394. /* [MS-OFFCRYPTO] 2.3.4.* EncryptionInfo Stream */
  17395. function parse_EncryptionInfo(blob) {
  17396. var vers = parse_CRYPTOVersion(blob);
  17397. switch(vers.Minor) {
  17398. case 0x02: return [vers.Minor, parse_EncInfoStd(blob, vers)];
  17399. case 0x03: return [vers.Minor, parse_EncInfoExt(blob, vers)];
  17400. case 0x04: return [vers.Minor, parse_EncInfoAgl(blob, vers)];
  17401. }
  17402. throw new Error("ECMA-376 Encrypted file unrecognized Version: " + vers.Minor);
  17403. }
  17404. /* [MS-OFFCRYPTO] 2.3.4.5 EncryptionInfo Stream (Standard Encryption) */
  17405. function parse_EncInfoStd(blob) {
  17406. var flags = blob.read_shift(4);
  17407. if((flags & 0x3F) != 0x24) throw new Error("EncryptionInfo mismatch");
  17408. var sz = blob.read_shift(4);
  17409. //var tgt = blob.l + sz;
  17410. var hdr = parse_EncryptionHeader(blob, sz);
  17411. var verifier = parse_EncryptionVerifier(blob, blob.length - blob.l);
  17412. return { t:"Std", h:hdr, v:verifier };
  17413. }
  17414. /* [MS-OFFCRYPTO] 2.3.4.6 EncryptionInfo Stream (Extensible Encryption) */
  17415. function parse_EncInfoExt() { throw new Error("File is password-protected: ECMA-376 Extensible"); }
  17416. /* [MS-OFFCRYPTO] 2.3.4.10 EncryptionInfo Stream (Agile Encryption) */
  17417. function parse_EncInfoAgl(blob) {
  17418. var KeyData = ["saltSize","blockSize","keyBits","hashSize","cipherAlgorithm","cipherChaining","hashAlgorithm","saltValue"];
  17419. blob.l+=4;
  17420. var xml = blob.read_shift(blob.length - blob.l, 'utf8');
  17421. var o = {};
  17422. xml.replace(tagregex, function xml_agile(x) {
  17423. var y = parsexmltag(x);
  17424. switch(strip_ns(y[0])) {
  17425. case '<?xml': break;
  17426. case '<encryption': case '</encryption>': break;
  17427. case '<keyData': KeyData.forEach(function(k) { o[k] = y[k]; }); break;
  17428. case '<dataIntegrity': o.encryptedHmacKey = y.encryptedHmacKey; o.encryptedHmacValue = y.encryptedHmacValue; break;
  17429. case '<keyEncryptors>': case '<keyEncryptors': o.encs = []; break;
  17430. case '</keyEncryptors>': break;
  17431. case '<keyEncryptor': o.uri = y.uri; break;
  17432. case '</keyEncryptor>': break;
  17433. case '<encryptedKey': o.encs.push(y); break;
  17434. default: throw y[0];
  17435. }
  17436. });
  17437. return o;
  17438. }
  17439. /* [MS-OFFCRYPTO] 2.3.5.1 RC4 CryptoAPI Encryption Header */
  17440. function parse_RC4CryptoHeader(blob, length) {
  17441. var o = {};
  17442. var vers = o.EncryptionVersionInfo = parse_CRYPTOVersion(blob, 4); length -= 4;
  17443. if(vers.Minor != 2) throw new Error('unrecognized minor version code: ' + vers.Minor);
  17444. if(vers.Major > 4 || vers.Major < 2) throw new Error('unrecognized major version code: ' + vers.Major);
  17445. o.Flags = blob.read_shift(4); length -= 4;
  17446. var sz = blob.read_shift(4); length -= 4;
  17447. o.EncryptionHeader = parse_EncryptionHeader(blob, sz); length -= sz;
  17448. o.EncryptionVerifier = parse_EncryptionVerifier(blob, length);
  17449. return o;
  17450. }
  17451. /* [MS-OFFCRYPTO] 2.3.6.1 RC4 Encryption Header */
  17452. function parse_RC4Header(blob) {
  17453. var o = {};
  17454. var vers = o.EncryptionVersionInfo = parse_CRYPTOVersion(blob, 4);
  17455. if(vers.Major != 1 || vers.Minor != 1) throw 'unrecognized version code ' + vers.Major + ' : ' + vers.Minor;
  17456. o.Salt = blob.read_shift(16);
  17457. o.EncryptedVerifier = blob.read_shift(16);
  17458. o.EncryptedVerifierHash = blob.read_shift(16);
  17459. return o;
  17460. }
  17461. /* [MS-OFFCRYPTO] 2.3.7.1 Binary Document Password Verifier Derivation */
  17462. function crypto_CreatePasswordVerifier_Method1(Password) {
  17463. var Verifier = 0x0000, PasswordArray;
  17464. var PasswordDecoded = _JS2ANSI(Password);
  17465. var len = PasswordDecoded.length + 1, i, PasswordByte;
  17466. var Intermediate1, Intermediate2, Intermediate3;
  17467. PasswordArray = new_raw_buf(len);
  17468. PasswordArray[0] = PasswordDecoded.length;
  17469. for(i = 1; i != len; ++i) PasswordArray[i] = PasswordDecoded[i-1];
  17470. for(i = len-1; i >= 0; --i) {
  17471. PasswordByte = PasswordArray[i];
  17472. Intermediate1 = ((Verifier & 0x4000) === 0x0000) ? 0 : 1;
  17473. Intermediate2 = (Verifier << 1) & 0x7FFF;
  17474. Intermediate3 = Intermediate1 | Intermediate2;
  17475. Verifier = Intermediate3 ^ PasswordByte;
  17476. }
  17477. return Verifier ^ 0xCE4B;
  17478. }
  17479. /* [MS-OFFCRYPTO] 2.3.7.2 Binary Document XOR Array Initialization */
  17480. var crypto_CreateXorArray_Method1 = (function() {
  17481. var PadArray = [0xBB, 0xFF, 0xFF, 0xBA, 0xFF, 0xFF, 0xB9, 0x80, 0x00, 0xBE, 0x0F, 0x00, 0xBF, 0x0F, 0x00];
  17482. var InitialCode = [0xE1F0, 0x1D0F, 0xCC9C, 0x84C0, 0x110C, 0x0E10, 0xF1CE, 0x313E, 0x1872, 0xE139, 0xD40F, 0x84F9, 0x280C, 0xA96A, 0x4EC3];
  17483. var XorMatrix = [0xAEFC, 0x4DD9, 0x9BB2, 0x2745, 0x4E8A, 0x9D14, 0x2A09, 0x7B61, 0xF6C2, 0xFDA5, 0xEB6B, 0xC6F7, 0x9DCF, 0x2BBF, 0x4563, 0x8AC6, 0x05AD, 0x0B5A, 0x16B4, 0x2D68, 0x5AD0, 0x0375, 0x06EA, 0x0DD4, 0x1BA8, 0x3750, 0x6EA0, 0xDD40, 0xD849, 0xA0B3, 0x5147, 0xA28E, 0x553D, 0xAA7A, 0x44D5, 0x6F45, 0xDE8A, 0xAD35, 0x4A4B, 0x9496, 0x390D, 0x721A, 0xEB23, 0xC667, 0x9CEF, 0x29FF, 0x53FE, 0xA7FC, 0x5FD9, 0x47D3, 0x8FA6, 0x0F6D, 0x1EDA, 0x3DB4, 0x7B68, 0xF6D0, 0xB861, 0x60E3, 0xC1C6, 0x93AD, 0x377B, 0x6EF6, 0xDDEC, 0x45A0, 0x8B40, 0x06A1, 0x0D42, 0x1A84, 0x3508, 0x6A10, 0xAA51, 0x4483, 0x8906, 0x022D, 0x045A, 0x08B4, 0x1168, 0x76B4, 0xED68, 0xCAF1, 0x85C3, 0x1BA7, 0x374E, 0x6E9C, 0x3730, 0x6E60, 0xDCC0, 0xA9A1, 0x4363, 0x86C6, 0x1DAD, 0x3331, 0x6662, 0xCCC4, 0x89A9, 0x0373, 0x06E6, 0x0DCC, 0x1021, 0x2042, 0x4084, 0x8108, 0x1231, 0x2462, 0x48C4];
  17484. var Ror = function(Byte) { return ((Byte/2) | (Byte*128)) & 0xFF; };
  17485. var XorRor = function(byte1, byte2) { return Ror(byte1 ^ byte2); };
  17486. var CreateXorKey_Method1 = function(Password) {
  17487. var XorKey = InitialCode[Password.length - 1];
  17488. var CurrentElement = 0x68;
  17489. for(var i = Password.length-1; i >= 0; --i) {
  17490. var Char = Password[i];
  17491. for(var j = 0; j != 7; ++j) {
  17492. if(Char & 0x40) XorKey ^= XorMatrix[CurrentElement];
  17493. Char *= 2; --CurrentElement;
  17494. }
  17495. }
  17496. return XorKey;
  17497. };
  17498. return function(password) {
  17499. var Password = _JS2ANSI(password);
  17500. var XorKey = CreateXorKey_Method1(Password);
  17501. var Index = Password.length;
  17502. var ObfuscationArray = new_raw_buf(16);
  17503. for(var i = 0; i != 16; ++i) ObfuscationArray[i] = 0x00;
  17504. var Temp, PasswordLastChar, PadIndex;
  17505. if((Index & 1) === 1) {
  17506. Temp = XorKey >> 8;
  17507. ObfuscationArray[Index] = XorRor(PadArray[0], Temp);
  17508. --Index;
  17509. Temp = XorKey & 0xFF;
  17510. PasswordLastChar = Password[Password.length - 1];
  17511. ObfuscationArray[Index] = XorRor(PasswordLastChar, Temp);
  17512. }
  17513. while(Index > 0) {
  17514. --Index;
  17515. Temp = XorKey >> 8;
  17516. ObfuscationArray[Index] = XorRor(Password[Index], Temp);
  17517. --Index;
  17518. Temp = XorKey & 0xFF;
  17519. ObfuscationArray[Index] = XorRor(Password[Index], Temp);
  17520. }
  17521. Index = 15;
  17522. PadIndex = 15 - Password.length;
  17523. while(PadIndex > 0) {
  17524. Temp = XorKey >> 8;
  17525. ObfuscationArray[Index] = XorRor(PadArray[PadIndex], Temp);
  17526. --Index;
  17527. --PadIndex;
  17528. Temp = XorKey & 0xFF;
  17529. ObfuscationArray[Index] = XorRor(Password[Index], Temp);
  17530. --Index;
  17531. --PadIndex;
  17532. }
  17533. return ObfuscationArray;
  17534. };
  17535. })();
  17536. /* [MS-OFFCRYPTO] 2.3.7.3 Binary Document XOR Data Transformation Method 1 */
  17537. var crypto_DecryptData_Method1 = function(password, Data, XorArrayIndex, XorArray, O) {
  17538. /* If XorArray is set, use it; if O is not set, make changes in-place */
  17539. if(!O) O = Data;
  17540. if(!XorArray) XorArray = crypto_CreateXorArray_Method1(password);
  17541. var Index, Value;
  17542. for(Index = 0; Index != Data.length; ++Index) {
  17543. Value = Data[Index];
  17544. Value ^= XorArray[XorArrayIndex];
  17545. Value = ((Value>>5) | (Value<<3)) & 0xFF;
  17546. O[Index] = Value;
  17547. ++XorArrayIndex;
  17548. }
  17549. return [O, XorArrayIndex, XorArray];
  17550. };
  17551. var crypto_MakeXorDecryptor = function(password) {
  17552. var XorArrayIndex = 0, XorArray = crypto_CreateXorArray_Method1(password);
  17553. return function(Data) {
  17554. var O = crypto_DecryptData_Method1("", Data, XorArrayIndex, XorArray);
  17555. XorArrayIndex = O[1];
  17556. return O[0];
  17557. };
  17558. };
  17559. /* 2.5.343 */
  17560. function parse_XORObfuscation(blob, length, opts, out) {
  17561. var o = ({ key: parseuint16(blob), verificationBytes: parseuint16(blob) });
  17562. if(opts.password) o.verifier = crypto_CreatePasswordVerifier_Method1(opts.password);
  17563. out.valid = o.verificationBytes === o.verifier;
  17564. if(out.valid) out.insitu = crypto_MakeXorDecryptor(opts.password);
  17565. return o;
  17566. }
  17567. /* 2.4.117 */
  17568. function parse_FilePassHeader(blob, length, oo) {
  17569. var o = oo || {}; o.Info = blob.read_shift(2); blob.l -= 2;
  17570. if(o.Info === 1) o.Data = parse_RC4Header(blob, length);
  17571. else o.Data = parse_RC4CryptoHeader(blob, length);
  17572. return o;
  17573. }
  17574. function parse_FilePass(blob, length, opts) {
  17575. var o = ({ Type: opts.biff >= 8 ? blob.read_shift(2) : 0 }); /* wEncryptionType */
  17576. if(o.Type) parse_FilePassHeader(blob, length-2, o);
  17577. else parse_XORObfuscation(blob, opts.biff >= 8 ? length : length - 2, opts, o);
  17578. return o;
  17579. }
  17580. var RTF = (function() {
  17581. function rtf_to_sheet(d, opts) {
  17582. switch(opts.type) {
  17583. case 'base64': return rtf_to_sheet_str(Base64.decode(d), opts);
  17584. case 'binary': return rtf_to_sheet_str(d, opts);
  17585. case 'buffer': return rtf_to_sheet_str(d.toString('binary'), opts);
  17586. case 'array': return rtf_to_sheet_str(cc2str(d), opts);
  17587. }
  17588. throw new Error("Unrecognized type " + opts.type);
  17589. }
  17590. function rtf_to_sheet_str(str, opts) {
  17591. var o = opts || {};
  17592. var ws = o.dense ? ([]) : ({});
  17593. var range = ({s: {c:0, r:0}, e: {c:0, r:0}});
  17594. // TODO: parse
  17595. if(!str.match(/\\trowd/)) throw new Error("RTF missing table");
  17596. ws['!ref'] = encode_range(range);
  17597. return ws;
  17598. }
  17599. function rtf_to_workbook(d, opts) { return sheet_to_workbook(rtf_to_sheet(d, opts), opts); }
  17600. /* TODO: this is a stub */
  17601. function sheet_to_rtf(ws) {
  17602. var o = ["{\\rtf1\\ansi"];
  17603. var r = safe_decode_range(ws['!ref']), cell;
  17604. var dense = Array.isArray(ws);
  17605. for(var R = r.s.r; R <= r.e.r; ++R) {
  17606. o.push("\\trowd\\trautofit1");
  17607. for(var C = r.s.c; C <= r.e.c; ++C) o.push("\\cellx" + (C+1));
  17608. o.push("\\pard\\intbl");
  17609. for(C = r.s.c; C <= r.e.c; ++C) {
  17610. var coord = encode_cell({r:R,c:C});
  17611. cell = dense ? (ws[R]||[])[C]: ws[coord];
  17612. if(!cell || cell.v == null && (!cell.f || cell.F)) continue;
  17613. o.push(" " + (cell.w || (format_cell(cell), cell.w)));
  17614. o.push("\\cell");
  17615. }
  17616. o.push("\\pard\\intbl\\row");
  17617. }
  17618. return o.join("") + "}";
  17619. }
  17620. return {
  17621. to_workbook: rtf_to_workbook,
  17622. to_sheet: rtf_to_sheet,
  17623. from_sheet: sheet_to_rtf
  17624. };
  17625. })();
  17626. function hex2RGB(h) {
  17627. var o = h.slice(h[0]==="#"?1:0).slice(0,6);
  17628. return [parseInt(o.slice(0,2),16),parseInt(o.slice(2,4),16),parseInt(o.slice(4,6),16)];
  17629. }
  17630. function rgb2Hex(rgb) {
  17631. for(var i=0,o=1; i!=3; ++i) o = o*256 + (rgb[i]>255?255:rgb[i]<0?0:rgb[i]);
  17632. return o.toString(16).toUpperCase().slice(1);
  17633. }
  17634. function rgb2HSL(rgb) {
  17635. var R = rgb[0]/255, G = rgb[1]/255, B=rgb[2]/255;
  17636. var M = Math.max(R, G, B), m = Math.min(R, G, B), C = M - m;
  17637. if(C === 0) return [0, 0, R];
  17638. var H6 = 0, S = 0, L2 = (M + m);
  17639. S = C / (L2 > 1 ? 2 - L2 : L2);
  17640. switch(M){
  17641. case R: H6 = ((G - B) / C + 6)%6; break;
  17642. case G: H6 = ((B - R) / C + 2); break;
  17643. case B: H6 = ((R - G) / C + 4); break;
  17644. }
  17645. return [H6 / 6, S, L2 / 2];
  17646. }
  17647. function hsl2RGB(hsl){
  17648. var H = hsl[0], S = hsl[1], L = hsl[2];
  17649. var C = S * 2 * (L < 0.5 ? L : 1 - L), m = L - C/2;
  17650. var rgb = [m,m,m], h6 = 6*H;
  17651. var X;
  17652. if(S !== 0) switch(h6|0) {
  17653. case 0: case 6: X = C * h6; rgb[0] += C; rgb[1] += X; break;
  17654. case 1: X = C * (2 - h6); rgb[0] += X; rgb[1] += C; break;
  17655. case 2: X = C * (h6 - 2); rgb[1] += C; rgb[2] += X; break;
  17656. case 3: X = C * (4 - h6); rgb[1] += X; rgb[2] += C; break;
  17657. case 4: X = C * (h6 - 4); rgb[2] += C; rgb[0] += X; break;
  17658. case 5: X = C * (6 - h6); rgb[2] += X; rgb[0] += C; break;
  17659. }
  17660. for(var i = 0; i != 3; ++i) rgb[i] = Math.round(rgb[i]*255);
  17661. return rgb;
  17662. }
  17663. /* 18.8.3 bgColor tint algorithm */
  17664. function rgb_tint(hex, tint) {
  17665. if(tint === 0) return hex;
  17666. var hsl = rgb2HSL(hex2RGB(hex));
  17667. if (tint < 0) hsl[2] = hsl[2] * (1 + tint);
  17668. else hsl[2] = 1 - (1 - hsl[2]) * (1 - tint);
  17669. return rgb2Hex(hsl2RGB(hsl));
  17670. }
  17671. /* 18.3.1.13 width calculations */
  17672. /* [MS-OI29500] 2.1.595 Column Width & Formatting */
  17673. var DEF_MDW = 6, MAX_MDW = 15, MIN_MDW = 1, MDW = DEF_MDW;
  17674. function width2px(width) { return Math.floor(( width + (Math.round(128/MDW))/256 )* MDW ); }
  17675. function px2char(px) { return (Math.floor((px - 5)/MDW * 100 + 0.5))/100; }
  17676. function char2width(chr) { return (Math.round((chr * MDW + 5)/MDW*256))/256; }
  17677. //function px2char_(px) { return (((px - 5)/MDW * 100 + 0.5))/100; }
  17678. //function char2width_(chr) { return (((chr * MDW + 5)/MDW*256))/256; }
  17679. function cycle_width(collw) { return char2width(px2char(width2px(collw))); }
  17680. /* XLSX/XLSB/XLS specify width in units of MDW */
  17681. function find_mdw_colw(collw) {
  17682. var delta = Math.abs(collw - cycle_width(collw)), _MDW = MDW;
  17683. if(delta > 0.005) for(MDW=MIN_MDW; MDW<MAX_MDW; ++MDW) if(Math.abs(collw - cycle_width(collw)) <= delta) { delta = Math.abs(collw - cycle_width(collw)); _MDW = MDW; }
  17684. MDW = _MDW;
  17685. }
  17686. /* XLML specifies width in terms of pixels */
  17687. /*function find_mdw_wpx(wpx) {
  17688. var delta = Infinity, guess = 0, _MDW = MIN_MDW;
  17689. for(MDW=MIN_MDW; MDW<MAX_MDW; ++MDW) {
  17690. guess = char2width_(px2char_(wpx))*256;
  17691. guess = (guess) % 1;
  17692. if(guess > 0.5) guess--;
  17693. if(Math.abs(guess) < delta) { delta = Math.abs(guess); _MDW = MDW; }
  17694. }
  17695. MDW = _MDW;
  17696. }*/
  17697. function process_col(coll) {
  17698. if(coll.width) {
  17699. coll.wpx = width2px(coll.width);
  17700. coll.wch = px2char(coll.wpx);
  17701. coll.MDW = MDW;
  17702. } else if(coll.wpx) {
  17703. coll.wch = px2char(coll.wpx);
  17704. coll.width = char2width(coll.wch);
  17705. coll.MDW = MDW;
  17706. } else if(typeof coll.wch == 'number') {
  17707. coll.width = char2width(coll.wch);
  17708. coll.wpx = width2px(coll.width);
  17709. coll.MDW = MDW;
  17710. }
  17711. if(coll.customWidth) delete coll.customWidth;
  17712. }
  17713. var DEF_PPI = 96, PPI = DEF_PPI;
  17714. function px2pt(px) { return px * 96 / PPI; }
  17715. function pt2px(pt) { return pt * PPI / 96; }
  17716. /* [MS-EXSPXML3] 2.4.54 ST_enmPattern */
  17717. var XLMLPatternTypeMap = {
  17718. "None": "none",
  17719. "Solid": "solid",
  17720. "Gray50": "mediumGray",
  17721. "Gray75": "darkGray",
  17722. "Gray25": "lightGray",
  17723. "HorzStripe": "darkHorizontal",
  17724. "VertStripe": "darkVertical",
  17725. "ReverseDiagStripe": "darkDown",
  17726. "DiagStripe": "darkUp",
  17727. "DiagCross": "darkGrid",
  17728. "ThickDiagCross": "darkTrellis",
  17729. "ThinHorzStripe": "lightHorizontal",
  17730. "ThinVertStripe": "lightVertical",
  17731. "ThinReverseDiagStripe": "lightDown",
  17732. "ThinHorzCross": "lightGrid"
  17733. };
  17734. /* 18.8.5 borders CT_Borders */
  17735. function parse_borders(t, styles, themes, opts) {
  17736. styles.Borders = [];
  17737. var border = {};
  17738. var pass = false;
  17739. (t[0].match(tagregex)||[]).forEach(function(x) {
  17740. var y = parsexmltag(x);
  17741. switch(strip_ns(y[0])) {
  17742. case '<borders': case '<borders>': case '</borders>': break;
  17743. /* 18.8.4 border CT_Border */
  17744. case '<border': case '<border>': case '<border/>':
  17745. border = {};
  17746. if(y.diagonalUp) border.diagonalUp = parsexmlbool(y.diagonalUp);
  17747. if(y.diagonalDown) border.diagonalDown = parsexmlbool(y.diagonalDown);
  17748. styles.Borders.push(border);
  17749. break;
  17750. case '</border>': break;
  17751. /* note: not in spec, appears to be CT_BorderPr */
  17752. case '<left/>': break;
  17753. case '<left': case '<left>': break;
  17754. case '</left>': break;
  17755. /* note: not in spec, appears to be CT_BorderPr */
  17756. case '<right/>': break;
  17757. case '<right': case '<right>': break;
  17758. case '</right>': break;
  17759. /* 18.8.43 top CT_BorderPr */
  17760. case '<top/>': break;
  17761. case '<top': case '<top>': break;
  17762. case '</top>': break;
  17763. /* 18.8.6 bottom CT_BorderPr */
  17764. case '<bottom/>': break;
  17765. case '<bottom': case '<bottom>': break;
  17766. case '</bottom>': break;
  17767. /* 18.8.13 diagonal CT_BorderPr */
  17768. case '<diagonal': case '<diagonal>': case '<diagonal/>': break;
  17769. case '</diagonal>': break;
  17770. /* 18.8.25 horizontal CT_BorderPr */
  17771. case '<horizontal': case '<horizontal>': case '<horizontal/>': break;
  17772. case '</horizontal>': break;
  17773. /* 18.8.44 vertical CT_BorderPr */
  17774. case '<vertical': case '<vertical>': case '<vertical/>': break;
  17775. case '</vertical>': break;
  17776. /* 18.8.37 start CT_BorderPr */
  17777. case '<start': case '<start>': case '<start/>': break;
  17778. case '</start>': break;
  17779. /* 18.8.16 end CT_BorderPr */
  17780. case '<end': case '<end>': case '<end/>': break;
  17781. case '</end>': break;
  17782. /* 18.8.? color CT_Color */
  17783. case '<color': case '<color>':
  17784. break;
  17785. case '<color/>': case '</color>': break;
  17786. /* 18.2.10 extLst CT_ExtensionList ? */
  17787. case '<extLst': case '<extLst>': case '</extLst>': break;
  17788. case '<ext': pass = true; break;
  17789. case '</ext>': pass = false; break;
  17790. default: if(opts && opts.WTF) {
  17791. if(!pass) throw new Error('unrecognized ' + y[0] + ' in borders');
  17792. }
  17793. }
  17794. });
  17795. }
  17796. /* 18.8.21 fills CT_Fills */
  17797. function parse_fills(t, styles, themes, opts) {
  17798. styles.Fills = [];
  17799. var fill = {};
  17800. var pass = false;
  17801. (t[0].match(tagregex)||[]).forEach(function(x) {
  17802. var y = parsexmltag(x);
  17803. switch(strip_ns(y[0])) {
  17804. case '<fills': case '<fills>': case '</fills>': break;
  17805. /* 18.8.20 fill CT_Fill */
  17806. case '<fill>': case '<fill': case '<fill/>':
  17807. fill = {}; styles.Fills.push(fill); break;
  17808. case '</fill>': break;
  17809. /* 18.8.24 gradientFill CT_GradientFill */
  17810. case '<gradientFill>': break;
  17811. case '<gradientFill':
  17812. case '</gradientFill>': styles.Fills.push(fill); fill = {}; break;
  17813. /* 18.8.32 patternFill CT_PatternFill */
  17814. case '<patternFill': case '<patternFill>':
  17815. if(y.patternType) fill.patternType = y.patternType;
  17816. break;
  17817. case '<patternFill/>': case '</patternFill>': break;
  17818. /* 18.8.3 bgColor CT_Color */
  17819. case '<bgColor':
  17820. if(!fill.bgColor) fill.bgColor = {};
  17821. if(y.indexed) fill.bgColor.indexed = parseInt(y.indexed, 10);
  17822. if(y.theme) fill.bgColor.theme = parseInt(y.theme, 10);
  17823. if(y.tint) fill.bgColor.tint = parseFloat(y.tint);
  17824. /* Excel uses ARGB strings */
  17825. if(y.rgb) fill.bgColor.rgb = y.rgb.slice(-6);
  17826. break;
  17827. case '<bgColor/>': case '</bgColor>': break;
  17828. /* 18.8.19 fgColor CT_Color */
  17829. case '<fgColor':
  17830. if(!fill.fgColor) fill.fgColor = {};
  17831. if(y.theme) fill.fgColor.theme = parseInt(y.theme, 10);
  17832. if(y.tint) fill.fgColor.tint = parseFloat(y.tint);
  17833. /* Excel uses ARGB strings */
  17834. if(y.rgb != null) fill.fgColor.rgb = y.rgb.slice(-6);
  17835. break;
  17836. case '<fgColor/>': case '</fgColor>': break;
  17837. /* 18.8.38 stop CT_GradientStop */
  17838. case '<stop': case '<stop/>': break;
  17839. case '</stop>': break;
  17840. /* 18.8.? color CT_Color */
  17841. case '<color': case '<color/>': break;
  17842. case '</color>': break;
  17843. /* 18.2.10 extLst CT_ExtensionList ? */
  17844. case '<extLst': case '<extLst>': case '</extLst>': break;
  17845. case '<ext': pass = true; break;
  17846. case '</ext>': pass = false; break;
  17847. default: if(opts && opts.WTF) {
  17848. if(!pass) throw new Error('unrecognized ' + y[0] + ' in fills');
  17849. }
  17850. }
  17851. });
  17852. }
  17853. /* 18.8.23 fonts CT_Fonts */
  17854. function parse_fonts(t, styles, themes, opts) {
  17855. styles.Fonts = [];
  17856. var font = {};
  17857. var pass = false;
  17858. (t[0].match(tagregex)||[]).forEach(function(x) {
  17859. var y = parsexmltag(x);
  17860. switch(strip_ns(y[0])) {
  17861. case '<fonts': case '<fonts>': case '</fonts>': break;
  17862. /* 18.8.22 font CT_Font */
  17863. case '<font': case '<font>': break;
  17864. case '</font>': case '<font/>':
  17865. styles.Fonts.push(font);
  17866. font = {};
  17867. break;
  17868. /* 18.8.29 name CT_FontName */
  17869. case '<name': if(y.val) font.name = utf8read(y.val); break;
  17870. case '<name/>': case '</name>': break;
  17871. /* 18.8.2 b CT_BooleanProperty */
  17872. case '<b': font.bold = y.val ? parsexmlbool(y.val) : 1; break;
  17873. case '<b/>': font.bold = 1; break;
  17874. /* 18.8.26 i CT_BooleanProperty */
  17875. case '<i': font.italic = y.val ? parsexmlbool(y.val) : 1; break;
  17876. case '<i/>': font.italic = 1; break;
  17877. /* 18.4.13 u CT_UnderlineProperty */
  17878. case '<u':
  17879. switch(y.val) {
  17880. case "none": font.underline = 0x00; break;
  17881. case "single": font.underline = 0x01; break;
  17882. case "double": font.underline = 0x02; break;
  17883. case "singleAccounting": font.underline = 0x21; break;
  17884. case "doubleAccounting": font.underline = 0x22; break;
  17885. } break;
  17886. case '<u/>': font.underline = 1; break;
  17887. /* 18.4.10 strike CT_BooleanProperty */
  17888. case '<strike': font.strike = y.val ? parsexmlbool(y.val) : 1; break;
  17889. case '<strike/>': font.strike = 1; break;
  17890. /* 18.4.2 outline CT_BooleanProperty */
  17891. case '<outline': font.outline = y.val ? parsexmlbool(y.val) : 1; break;
  17892. case '<outline/>': font.outline = 1; break;
  17893. /* 18.8.36 shadow CT_BooleanProperty */
  17894. case '<shadow': font.shadow = y.val ? parsexmlbool(y.val) : 1; break;
  17895. case '<shadow/>': font.shadow = 1; break;
  17896. /* 18.8.12 condense CT_BooleanProperty */
  17897. case '<condense': font.condense = y.val ? parsexmlbool(y.val) : 1; break;
  17898. case '<condense/>': font.condense = 1; break;
  17899. /* 18.8.17 extend CT_BooleanProperty */
  17900. case '<extend': font.extend = y.val ? parsexmlbool(y.val) : 1; break;
  17901. case '<extend/>': font.extend = 1; break;
  17902. /* 18.4.11 sz CT_FontSize */
  17903. case '<sz': if(y.val) font.sz = +y.val; break;
  17904. case '<sz/>': case '</sz>': break;
  17905. /* 18.4.14 vertAlign CT_VerticalAlignFontProperty */
  17906. case '<vertAlign': if(y.val) font.vertAlign = y.val; break;
  17907. case '<vertAlign/>': case '</vertAlign>': break;
  17908. /* 18.8.18 family CT_FontFamily */
  17909. case '<family': if(y.val) font.family = parseInt(y.val,10); break;
  17910. case '<family/>': case '</family>': break;
  17911. /* 18.8.35 scheme CT_FontScheme */
  17912. case '<scheme': if(y.val) font.scheme = y.val; break;
  17913. case '<scheme/>': case '</scheme>': break;
  17914. /* 18.4.1 charset CT_IntProperty */
  17915. case '<charset':
  17916. if(y.val == '1') break;
  17917. y.codepage = CS2CP[parseInt(y.val, 10)];
  17918. break;
  17919. /* 18.?.? color CT_Color */
  17920. case '<color':
  17921. if(!font.color) font.color = {};
  17922. if(y.auto) font.color.auto = parsexmlbool(y.auto);
  17923. if(y.rgb) font.color.rgb = y.rgb.slice(-6);
  17924. else if(y.indexed) {
  17925. font.color.index = parseInt(y.indexed, 10);
  17926. var icv = XLSIcv[font.color.index];
  17927. if(font.color.index == 81) icv = XLSIcv[1];
  17928. if(!icv) throw new Error(x);
  17929. font.color.rgb = icv[0].toString(16) + icv[1].toString(16) + icv[2].toString(16);
  17930. } else if(y.theme) {
  17931. font.color.theme = parseInt(y.theme, 10);
  17932. if(y.tint) font.color.tint = parseFloat(y.tint);
  17933. if(y.theme && themes.themeElements && themes.themeElements.clrScheme) {
  17934. font.color.rgb = rgb_tint(themes.themeElements.clrScheme[font.color.theme].rgb, font.color.tint || 0);
  17935. }
  17936. }
  17937. break;
  17938. case '<color/>': case '</color>': break;
  17939. /* note: sometimes mc:AlternateContent appears bare */
  17940. case '<AlternateContent': pass = true; break;
  17941. case '</AlternateContent>': pass = false; break;
  17942. /* 18.2.10 extLst CT_ExtensionList ? */
  17943. case '<extLst': case '<extLst>': case '</extLst>': break;
  17944. case '<ext': pass = true; break;
  17945. case '</ext>': pass = false; break;
  17946. default: if(opts && opts.WTF) {
  17947. if(!pass) throw new Error('unrecognized ' + y[0] + ' in fonts');
  17948. }
  17949. }
  17950. });
  17951. }
  17952. /* 18.8.31 numFmts CT_NumFmts */
  17953. function parse_numFmts(t, styles, opts) {
  17954. styles.NumberFmt = [];
  17955. var k/*Array<number>*/ = (keys(SSF._table));
  17956. for(var i=0; i < k.length; ++i) styles.NumberFmt[k[i]] = SSF._table[k[i]];
  17957. var m = t[0].match(tagregex);
  17958. if(!m) return;
  17959. for(i=0; i < m.length; ++i) {
  17960. var y = parsexmltag(m[i]);
  17961. switch(strip_ns(y[0])) {
  17962. case '<numFmts': case '</numFmts>': case '<numFmts/>': case '<numFmts>': break;
  17963. case '<numFmt': {
  17964. var f=unescapexml(utf8read(y.formatCode)), j=parseInt(y.numFmtId,10);
  17965. styles.NumberFmt[j] = f;
  17966. if(j>0) {
  17967. if(j > 0x188) {
  17968. for(j = 0x188; j > 0x3c; --j) if(styles.NumberFmt[j] == null) break;
  17969. styles.NumberFmt[j] = f;
  17970. }
  17971. SSF.load(f,j);
  17972. }
  17973. } break;
  17974. case '</numFmt>': break;
  17975. default: if(opts.WTF) throw new Error('unrecognized ' + y[0] + ' in numFmts');
  17976. }
  17977. }
  17978. }
  17979. function write_numFmts(NF) {
  17980. var o = ["<numFmts>"];
  17981. [[5,8],[23,26],[41,44],[/*63*/50,/*66],[164,*/392]].forEach(function(r) {
  17982. for(var i = r[0]; i <= r[1]; ++i) if(NF[i] != null) o[o.length] = (writextag('numFmt',null,{numFmtId:i,formatCode:escapexml(NF[i])}));
  17983. });
  17984. if(o.length === 1) return "";
  17985. o[o.length] = ("</numFmts>");
  17986. o[0] = writextag('numFmts', null, { count:o.length-2 }).replace("/>", ">");
  17987. return o.join("");
  17988. }
  17989. /* 18.8.10 cellXfs CT_CellXfs */
  17990. var cellXF_uint = [ "numFmtId", "fillId", "fontId", "borderId", "xfId" ];
  17991. var cellXF_bool = [ "applyAlignment", "applyBorder", "applyFill", "applyFont", "applyNumberFormat", "applyProtection", "pivotButton", "quotePrefix" ];
  17992. function parse_cellXfs(t, styles, opts) {
  17993. styles.CellXf = [];
  17994. var xf;
  17995. var pass = false;
  17996. (t[0].match(tagregex)||[]).forEach(function(x) {
  17997. var y = parsexmltag(x), i = 0;
  17998. switch(strip_ns(y[0])) {
  17999. case '<cellXfs': case '<cellXfs>': case '<cellXfs/>': case '</cellXfs>': break;
  18000. /* 18.8.45 xf CT_Xf */
  18001. case '<xf': case '<xf/>':
  18002. xf = y;
  18003. delete xf[0];
  18004. for(i = 0; i < cellXF_uint.length; ++i) if(xf[cellXF_uint[i]])
  18005. xf[cellXF_uint[i]] = parseInt(xf[cellXF_uint[i]], 10);
  18006. for(i = 0; i < cellXF_bool.length; ++i) if(xf[cellXF_bool[i]])
  18007. xf[cellXF_bool[i]] = parsexmlbool(xf[cellXF_bool[i]]);
  18008. if(xf.numFmtId > 0x188) {
  18009. for(i = 0x188; i > 0x3c; --i) if(styles.NumberFmt[xf.numFmtId] == styles.NumberFmt[i]) { xf.numFmtId = i; break; }
  18010. }
  18011. styles.CellXf.push(xf); break;
  18012. case '</xf>': break;
  18013. /* 18.8.1 alignment CT_CellAlignment */
  18014. case '<alignment': case '<alignment/>':
  18015. var alignment = {};
  18016. if(y.vertical) alignment.vertical = y.vertical;
  18017. if(y.horizontal) alignment.horizontal = y.horizontal;
  18018. if(y.textRotation != null) alignment.textRotation = y.textRotation;
  18019. if(y.indent) alignment.indent = y.indent;
  18020. if(y.wrapText) alignment.wrapText = parsexmlbool(y.wrapText);
  18021. xf.alignment = alignment;
  18022. break;
  18023. case '</alignment>': break;
  18024. /* 18.8.33 protection CT_CellProtection */
  18025. case '<protection':
  18026. break;
  18027. case '</protection>': case '<protection/>': break;
  18028. /* note: sometimes mc:AlternateContent appears bare */
  18029. case '<AlternateContent': pass = true; break;
  18030. case '</AlternateContent>': pass = false; break;
  18031. /* 18.2.10 extLst CT_ExtensionList ? */
  18032. case '<extLst': case '<extLst>': case '</extLst>': break;
  18033. case '<ext': pass = true; break;
  18034. case '</ext>': pass = false; break;
  18035. default: if(opts && opts.WTF) {
  18036. if(!pass) throw new Error('unrecognized ' + y[0] + ' in cellXfs');
  18037. }
  18038. }
  18039. });
  18040. }
  18041. function write_cellXfs(cellXfs) {
  18042. var o = [];
  18043. o[o.length] = (writextag('cellXfs',null));
  18044. cellXfs.forEach(function(c) {
  18045. o[o.length] = (writextag('xf', null, c));
  18046. });
  18047. o[o.length] = ("</cellXfs>");
  18048. if(o.length === 2) return "";
  18049. o[0] = writextag('cellXfs',null, {count:o.length-2}).replace("/>",">");
  18050. return o.join("");
  18051. }
  18052. /* 18.8 Styles CT_Stylesheet*/
  18053. var parse_sty_xml= (function make_pstyx() {
  18054. var numFmtRegex = /<(?:\w+:)?numFmts([^>]*)>[\S\s]*?<\/(?:\w+:)?numFmts>/;
  18055. var cellXfRegex = /<(?:\w+:)?cellXfs([^>]*)>[\S\s]*?<\/(?:\w+:)?cellXfs>/;
  18056. var fillsRegex = /<(?:\w+:)?fills([^>]*)>[\S\s]*?<\/(?:\w+:)?fills>/;
  18057. var fontsRegex = /<(?:\w+:)?fonts([^>]*)>[\S\s]*?<\/(?:\w+:)?fonts>/;
  18058. var bordersRegex = /<(?:\w+:)?borders([^>]*)>[\S\s]*?<\/(?:\w+:)?borders>/;
  18059. return function parse_sty_xml(data, themes, opts) {
  18060. var styles = {};
  18061. if(!data) return styles;
  18062. data = data.replace(/<!--([\s\S]*?)-->/mg,"").replace(/<!DOCTYPE[^\[]*\[[^\]]*\]>/gm,"");
  18063. /* 18.8.39 styleSheet CT_Stylesheet */
  18064. var t;
  18065. /* 18.8.31 numFmts CT_NumFmts ? */
  18066. if((t=data.match(numFmtRegex))) parse_numFmts(t, styles, opts);
  18067. /* 18.8.23 fonts CT_Fonts ? */
  18068. if((t=data.match(fontsRegex))) parse_fonts(t, styles, themes, opts);
  18069. /* 18.8.21 fills CT_Fills ? */
  18070. if((t=data.match(fillsRegex))) parse_fills(t, styles, themes, opts);
  18071. /* 18.8.5 borders CT_Borders ? */
  18072. if((t=data.match(bordersRegex))) parse_borders(t, styles, themes, opts);
  18073. /* 18.8.9 cellStyleXfs CT_CellStyleXfs ? */
  18074. /* 18.8.8 cellStyles CT_CellStyles ? */
  18075. /* 18.8.10 cellXfs CT_CellXfs ? */
  18076. if((t=data.match(cellXfRegex))) parse_cellXfs(t, styles, opts);
  18077. /* 18.8.15 dxfs CT_Dxfs ? */
  18078. /* 18.8.42 tableStyles CT_TableStyles ? */
  18079. /* 18.8.11 colors CT_Colors ? */
  18080. /* 18.2.10 extLst CT_ExtensionList ? */
  18081. return styles;
  18082. };
  18083. })();
  18084. var STYLES_XML_ROOT = writextag('styleSheet', null, {
  18085. 'xmlns': XMLNS.main[0],
  18086. 'xmlns:vt': XMLNS.vt
  18087. });
  18088. RELS.STY = "http://schemas.openxmlformats.org/officeDocument/2006/relationships/styles";
  18089. function write_sty_xml(wb, opts) {
  18090. var o = [XML_HEADER, STYLES_XML_ROOT], w;
  18091. if(wb.SSF && (w = write_numFmts(wb.SSF)) != null) o[o.length] = w;
  18092. o[o.length] = ('<fonts count="1"><font><sz val="12"/><color theme="1"/><name val="Calibri"/><family val="2"/><scheme val="minor"/></font></fonts>');
  18093. o[o.length] = ('<fills count="2"><fill><patternFill patternType="none"/></fill><fill><patternFill patternType="gray125"/></fill></fills>');
  18094. o[o.length] = ('<borders count="1"><border><left/><right/><top/><bottom/><diagonal/></border></borders>');
  18095. o[o.length] = ('<cellStyleXfs count="1"><xf numFmtId="0" fontId="0" fillId="0" borderId="0"/></cellStyleXfs>');
  18096. if((w = write_cellXfs(opts.cellXfs))) o[o.length] = (w);
  18097. o[o.length] = ('<cellStyles count="1"><cellStyle name="Normal" xfId="0" builtinId="0"/></cellStyles>');
  18098. o[o.length] = ('<dxfs count="0"/>');
  18099. o[o.length] = ('<tableStyles count="0" defaultTableStyle="TableStyleMedium9" defaultPivotStyle="PivotStyleMedium4"/>');
  18100. if(o.length>2){ o[o.length] = ('</styleSheet>'); o[1]=o[1].replace("/>",">"); }
  18101. return o.join("");
  18102. }
  18103. /* [MS-XLSB] 2.4.657 BrtFmt */
  18104. function parse_BrtFmt(data, length) {
  18105. var numFmtId = data.read_shift(2);
  18106. var stFmtCode = parse_XLWideString(data,length-2);
  18107. return [numFmtId, stFmtCode];
  18108. }
  18109. function write_BrtFmt(i, f, o) {
  18110. if(!o) o = new_buf(6 + 4 * f.length);
  18111. o.write_shift(2, i);
  18112. write_XLWideString(f, o);
  18113. var out = (o.length > o.l) ? o.slice(0, o.l) : o;
  18114. if(o.l == null) o.l = o.length;
  18115. return out;
  18116. }
  18117. /* [MS-XLSB] 2.4.659 BrtFont TODO */
  18118. function parse_BrtFont(data, length, opts) {
  18119. var out = ({});
  18120. out.sz = data.read_shift(2) / 20;
  18121. var grbit = parse_FontFlags(data, 2, opts);
  18122. if(grbit.fItalic) out.italic = 1;
  18123. if(grbit.fCondense) out.condense = 1;
  18124. if(grbit.fExtend) out.extend = 1;
  18125. if(grbit.fShadow) out.shadow = 1;
  18126. if(grbit.fOutline) out.outline = 1;
  18127. if(grbit.fStrikeout) out.strike = 1;
  18128. var bls = data.read_shift(2);
  18129. if(bls === 0x02BC) out.bold = 1;
  18130. switch(data.read_shift(2)) {
  18131. /* case 0: out.vertAlign = "baseline"; break; */
  18132. case 1: out.vertAlign = "superscript"; break;
  18133. case 2: out.vertAlign = "subscript"; break;
  18134. }
  18135. var underline = data.read_shift(1);
  18136. if(underline != 0) out.underline = underline;
  18137. var family = data.read_shift(1);
  18138. if(family > 0) out.family = family;
  18139. var bCharSet = data.read_shift(1);
  18140. if(bCharSet > 0) out.charset = bCharSet;
  18141. data.l++;
  18142. out.color = parse_BrtColor(data, 8);
  18143. switch(data.read_shift(1)) {
  18144. /* case 0: out.scheme = "none": break; */
  18145. case 1: out.scheme = "major"; break;
  18146. case 2: out.scheme = "minor"; break;
  18147. }
  18148. out.name = parse_XLWideString(data, length - 21);
  18149. return out;
  18150. }
  18151. function write_BrtFont(font, o) {
  18152. if(!o) o = new_buf(25+4*32);
  18153. o.write_shift(2, font.sz * 20);
  18154. write_FontFlags(font, o);
  18155. o.write_shift(2, font.bold ? 0x02BC : 0x0190);
  18156. var sss = 0;
  18157. if(font.vertAlign == "superscript") sss = 1;
  18158. else if(font.vertAlign == "subscript") sss = 2;
  18159. o.write_shift(2, sss);
  18160. o.write_shift(1, font.underline || 0);
  18161. o.write_shift(1, font.family || 0);
  18162. o.write_shift(1, font.charset || 0);
  18163. o.write_shift(1, 0);
  18164. write_BrtColor(font.color, o);
  18165. var scheme = 0;
  18166. if(font.scheme == "major") scheme = 1;
  18167. if(font.scheme == "minor") scheme = 2;
  18168. o.write_shift(1, scheme);
  18169. write_XLWideString(font.name, o);
  18170. return o.length > o.l ? o.slice(0, o.l) : o;
  18171. }
  18172. /* [MS-XLSB] 2.4.650 BrtFill */
  18173. var XLSBFillPTNames = [
  18174. "none",
  18175. "solid",
  18176. "mediumGray",
  18177. "darkGray",
  18178. "lightGray",
  18179. "darkHorizontal",
  18180. "darkVertical",
  18181. "darkDown",
  18182. "darkUp",
  18183. "darkGrid",
  18184. "darkTrellis",
  18185. "lightHorizontal",
  18186. "lightVertical",
  18187. "lightDown",
  18188. "lightUp",
  18189. "lightGrid",
  18190. "lightTrellis",
  18191. "gray125",
  18192. "gray0625"
  18193. ];
  18194. var rev_XLSBFillPTNames = (evert(XLSBFillPTNames));
  18195. /* TODO: gradient fill representation */
  18196. var parse_BrtFill = parsenoop;
  18197. function write_BrtFill(fill, o) {
  18198. if(!o) o = new_buf(4*3 + 8*7 + 16*1);
  18199. var fls = rev_XLSBFillPTNames[fill.patternType];
  18200. if(fls == null) fls = 0x28;
  18201. o.write_shift(4, fls);
  18202. var j = 0;
  18203. if(fls != 0x28) {
  18204. /* TODO: custom FG Color */
  18205. write_BrtColor({auto:1}, o);
  18206. /* TODO: custom BG Color */
  18207. write_BrtColor({auto:1}, o);
  18208. for(; j < 12; ++j) o.write_shift(4, 0);
  18209. } else {
  18210. for(; j < 4; ++j) o.write_shift(4, 0);
  18211. for(; j < 12; ++j) o.write_shift(4, 0); /* TODO */
  18212. /* iGradientType */
  18213. /* xnumDegree */
  18214. /* xnumFillToLeft */
  18215. /* xnumFillToRight */
  18216. /* xnumFillToTop */
  18217. /* xnumFillToBottom */
  18218. /* cNumStop */
  18219. /* xfillGradientStop */
  18220. }
  18221. return o.length > o.l ? o.slice(0, o.l) : o;
  18222. }
  18223. /* [MS-XLSB] 2.4.824 BrtXF */
  18224. function parse_BrtXF(data, length) {
  18225. var tgt = data.l + length;
  18226. var ixfeParent = data.read_shift(2);
  18227. var ifmt = data.read_shift(2);
  18228. data.l = tgt;
  18229. return {ixfe:ixfeParent, numFmtId:ifmt };
  18230. }
  18231. function write_BrtXF(data, ixfeP, o) {
  18232. if(!o) o = new_buf(16);
  18233. o.write_shift(2, ixfeP||0);
  18234. o.write_shift(2, data.numFmtId||0);
  18235. o.write_shift(2, 0); /* iFont */
  18236. o.write_shift(2, 0); /* iFill */
  18237. o.write_shift(2, 0); /* ixBorder */
  18238. o.write_shift(1, 0); /* trot */
  18239. o.write_shift(1, 0); /* indent */
  18240. var flow = 0;
  18241. o.write_shift(1, flow); /* flags */
  18242. o.write_shift(1, 0); /* flags */
  18243. o.write_shift(1, 0); /* xfGrbitAtr */
  18244. o.write_shift(1, 0);
  18245. return o;
  18246. }
  18247. /* [MS-XLSB] 2.5.4 Blxf TODO */
  18248. function write_Blxf(data, o) {
  18249. if(!o) o = new_buf(10);
  18250. o.write_shift(1, 0); /* dg */
  18251. o.write_shift(1, 0);
  18252. o.write_shift(4, 0); /* color */
  18253. o.write_shift(4, 0); /* color */
  18254. return o;
  18255. }
  18256. /* [MS-XLSB] 2.4.302 BrtBorder TODO */
  18257. var parse_BrtBorder = parsenoop;
  18258. function write_BrtBorder(border, o) {
  18259. if(!o) o = new_buf(51);
  18260. o.write_shift(1, 0); /* diagonal */
  18261. write_Blxf(null, o); /* top */
  18262. write_Blxf(null, o); /* bottom */
  18263. write_Blxf(null, o); /* left */
  18264. write_Blxf(null, o); /* right */
  18265. write_Blxf(null, o); /* diag */
  18266. return o.length > o.l ? o.slice(0, o.l) : o;
  18267. }
  18268. /* [MS-XLSB] 2.4.763 BrtStyle TODO */
  18269. function write_BrtStyle(style, o) {
  18270. if(!o) o = new_buf(12+4*10);
  18271. o.write_shift(4, style.xfId);
  18272. o.write_shift(2, 1);
  18273. o.write_shift(1, +style.builtinId);
  18274. o.write_shift(1, 0); /* iLevel */
  18275. write_XLNullableWideString(style.name || "", o);
  18276. return o.length > o.l ? o.slice(0, o.l) : o;
  18277. }
  18278. /* [MS-XLSB] 2.4.272 BrtBeginTableStyles */
  18279. function write_BrtBeginTableStyles(cnt, defTableStyle, defPivotStyle) {
  18280. var o = new_buf(4+256*2*4);
  18281. o.write_shift(4, cnt);
  18282. write_XLNullableWideString(defTableStyle, o);
  18283. write_XLNullableWideString(defPivotStyle, o);
  18284. return o.length > o.l ? o.slice(0, o.l) : o;
  18285. }
  18286. /* [MS-XLSB] 2.1.7.50 Styles */
  18287. function parse_sty_bin(data, themes, opts) {
  18288. var styles = {};
  18289. styles.NumberFmt = ([]);
  18290. for(var y in SSF._table) styles.NumberFmt[y] = SSF._table[y];
  18291. styles.CellXf = [];
  18292. styles.Fonts = [];
  18293. var state = [];
  18294. var pass = false;
  18295. recordhopper(data, function hopper_sty(val, R_n, RT) {
  18296. switch(RT) {
  18297. case 0x002C: /* 'BrtFmt' */
  18298. styles.NumberFmt[val[0]] = val[1]; SSF.load(val[1], val[0]);
  18299. break;
  18300. case 0x002B: /* 'BrtFont' */
  18301. styles.Fonts.push(val);
  18302. if(val.color.theme != null && themes && themes.themeElements && themes.themeElements.clrScheme) {
  18303. val.color.rgb = rgb_tint(themes.themeElements.clrScheme[val.color.theme].rgb, val.color.tint || 0);
  18304. }
  18305. break;
  18306. case 0x0401: /* 'BrtKnownFonts' */ break;
  18307. case 0x002D: /* 'BrtFill' */
  18308. break;
  18309. case 0x002E: /* 'BrtBorder' */
  18310. break;
  18311. case 0x002F: /* 'BrtXF' */
  18312. if(state[state.length - 1] == "BrtBeginCellXFs") {
  18313. styles.CellXf.push(val);
  18314. }
  18315. break;
  18316. case 0x0030: /* 'BrtStyle' */
  18317. case 0x01FB: /* 'BrtDXF' */
  18318. case 0x023C: /* 'BrtMRUColor' */
  18319. case 0x01DB: /* 'BrtIndexedColor': */
  18320. break;
  18321. case 0x0493: /* 'BrtDXF14' */
  18322. case 0x0836: /* 'BrtDXF15' */
  18323. case 0x046A: /* 'BrtSlicerStyleElement' */
  18324. case 0x0200: /* 'BrtTableStyleElement' */
  18325. case 0x082F: /* 'BrtTimelineStyleElement' */
  18326. case 0x0C00: /* 'BrtUid' */
  18327. break;
  18328. case 0x0023: /* 'BrtFRTBegin' */
  18329. pass = true; break;
  18330. case 0x0024: /* 'BrtFRTEnd' */
  18331. pass = false; break;
  18332. case 0x0025: /* 'BrtACBegin' */
  18333. state.push(R_n); pass = true; break;
  18334. case 0x0026: /* 'BrtACEnd' */
  18335. state.pop(); pass = false; break;
  18336. default:
  18337. if((R_n||"").indexOf("Begin") > 0) state.push(R_n);
  18338. else if((R_n||"").indexOf("End") > 0) state.pop();
  18339. else if(!pass || (opts.WTF && state[state.length-1] != "BrtACBegin")) throw new Error("Unexpected record " + RT + " " + R_n);
  18340. }
  18341. });
  18342. return styles;
  18343. }
  18344. function write_FMTS_bin(ba, NF) {
  18345. if(!NF) return;
  18346. var cnt = 0;
  18347. [[5,8],[23,26],[41,44],[/*63*/50,/*66],[164,*/392]].forEach(function(r) {
  18348. for(var i = r[0]; i <= r[1]; ++i) if(NF[i] != null) ++cnt;
  18349. });
  18350. if(cnt == 0) return;
  18351. write_record(ba, "BrtBeginFmts", write_UInt32LE(cnt));
  18352. [[5,8],[23,26],[41,44],[/*63*/50,/*66],[164,*/392]].forEach(function(r) {
  18353. for(var i = r[0]; i <= r[1]; ++i) if(NF[i] != null) write_record(ba, "BrtFmt", write_BrtFmt(i, NF[i]));
  18354. });
  18355. write_record(ba, "BrtEndFmts");
  18356. }
  18357. function write_FONTS_bin(ba) {
  18358. var cnt = 1;
  18359. if(cnt == 0) return;
  18360. write_record(ba, "BrtBeginFonts", write_UInt32LE(cnt));
  18361. write_record(ba, "BrtFont", write_BrtFont({
  18362. sz:12,
  18363. color: {theme:1},
  18364. name: "Calibri",
  18365. family: 2,
  18366. scheme: "minor"
  18367. }));
  18368. /* 1*65491BrtFont [ACFONTS] */
  18369. write_record(ba, "BrtEndFonts");
  18370. }
  18371. function write_FILLS_bin(ba) {
  18372. var cnt = 2;
  18373. if(cnt == 0) return;
  18374. write_record(ba, "BrtBeginFills", write_UInt32LE(cnt));
  18375. write_record(ba, "BrtFill", write_BrtFill({patternType:"none"}));
  18376. write_record(ba, "BrtFill", write_BrtFill({patternType:"gray125"}));
  18377. /* 1*65431BrtFill */
  18378. write_record(ba, "BrtEndFills");
  18379. }
  18380. function write_BORDERS_bin(ba) {
  18381. var cnt = 1;
  18382. if(cnt == 0) return;
  18383. write_record(ba, "BrtBeginBorders", write_UInt32LE(cnt));
  18384. write_record(ba, "BrtBorder", write_BrtBorder({}));
  18385. /* 1*65430BrtBorder */
  18386. write_record(ba, "BrtEndBorders");
  18387. }
  18388. function write_CELLSTYLEXFS_bin(ba) {
  18389. var cnt = 1;
  18390. write_record(ba, "BrtBeginCellStyleXFs", write_UInt32LE(cnt));
  18391. write_record(ba, "BrtXF", write_BrtXF({
  18392. numFmtId: 0,
  18393. fontId: 0,
  18394. fillId: 0,
  18395. borderId: 0
  18396. }, 0xFFFF));
  18397. /* 1*65430(BrtXF *FRT) */
  18398. write_record(ba, "BrtEndCellStyleXFs");
  18399. }
  18400. function write_CELLXFS_bin(ba, data) {
  18401. write_record(ba, "BrtBeginCellXFs", write_UInt32LE(data.length));
  18402. data.forEach(function(c) { write_record(ba, "BrtXF", write_BrtXF(c,0)); });
  18403. /* 1*65430(BrtXF *FRT) */
  18404. write_record(ba, "BrtEndCellXFs");
  18405. }
  18406. function write_STYLES_bin(ba) {
  18407. var cnt = 1;
  18408. write_record(ba, "BrtBeginStyles", write_UInt32LE(cnt));
  18409. write_record(ba, "BrtStyle", write_BrtStyle({
  18410. xfId:0,
  18411. builtinId:0,
  18412. name:"Normal"
  18413. }));
  18414. /* 1*65430(BrtStyle *FRT) */
  18415. write_record(ba, "BrtEndStyles");
  18416. }
  18417. function write_DXFS_bin(ba) {
  18418. var cnt = 0;
  18419. write_record(ba, "BrtBeginDXFs", write_UInt32LE(cnt));
  18420. /* *2147483647(BrtDXF *FRT) */
  18421. write_record(ba, "BrtEndDXFs");
  18422. }
  18423. function write_TABLESTYLES_bin(ba) {
  18424. var cnt = 0;
  18425. write_record(ba, "BrtBeginTableStyles", write_BrtBeginTableStyles(cnt, "TableStyleMedium9", "PivotStyleMedium4"));
  18426. /* *TABLESTYLE */
  18427. write_record(ba, "BrtEndTableStyles");
  18428. }
  18429. function write_COLORPALETTE_bin() {
  18430. return;
  18431. /* BrtBeginColorPalette [INDEXEDCOLORS] [MRUCOLORS] BrtEndColorPalette */
  18432. }
  18433. /* [MS-XLSB] 2.1.7.50 Styles */
  18434. function write_sty_bin(wb, opts) {
  18435. var ba = buf_array();
  18436. write_record(ba, "BrtBeginStyleSheet");
  18437. write_FMTS_bin(ba, wb.SSF);
  18438. write_FONTS_bin(ba, wb);
  18439. write_FILLS_bin(ba, wb);
  18440. write_BORDERS_bin(ba, wb);
  18441. write_CELLSTYLEXFS_bin(ba, wb);
  18442. write_CELLXFS_bin(ba, opts.cellXfs);
  18443. write_STYLES_bin(ba, wb);
  18444. write_DXFS_bin(ba, wb);
  18445. write_TABLESTYLES_bin(ba, wb);
  18446. write_COLORPALETTE_bin(ba, wb);
  18447. /* FRTSTYLESHEET*/
  18448. write_record(ba, "BrtEndStyleSheet");
  18449. return ba.end();
  18450. }
  18451. RELS.THEME = "http://schemas.openxmlformats.org/officeDocument/2006/relationships/theme";
  18452. /* Even though theme layout is dk1 lt1 dk2 lt2, true order is lt1 dk1 lt2 dk2 */
  18453. var XLSXThemeClrScheme = [
  18454. '</a:lt1>', '</a:dk1>', '</a:lt2>', '</a:dk2>',
  18455. '</a:accent1>', '</a:accent2>', '</a:accent3>',
  18456. '</a:accent4>', '</a:accent5>', '</a:accent6>',
  18457. '</a:hlink>', '</a:folHlink>'
  18458. ];
  18459. /* 20.1.6.2 clrScheme CT_ColorScheme */
  18460. function parse_clrScheme(t, themes, opts) {
  18461. themes.themeElements.clrScheme = [];
  18462. var color = {};
  18463. (t[0].match(tagregex)||[]).forEach(function(x) {
  18464. var y = parsexmltag(x);
  18465. switch(y[0]) {
  18466. /* 20.1.6.2 clrScheme (Color Scheme) CT_ColorScheme */
  18467. case '<a:clrScheme': case '</a:clrScheme>': break;
  18468. /* 20.1.2.3.32 srgbClr CT_SRgbColor */
  18469. case '<a:srgbClr':
  18470. color.rgb = y.val; break;
  18471. /* 20.1.2.3.33 sysClr CT_SystemColor */
  18472. case '<a:sysClr':
  18473. color.rgb = y.lastClr; break;
  18474. /* 20.1.4.1.1 accent1 (Accent 1) */
  18475. /* 20.1.4.1.2 accent2 (Accent 2) */
  18476. /* 20.1.4.1.3 accent3 (Accent 3) */
  18477. /* 20.1.4.1.4 accent4 (Accent 4) */
  18478. /* 20.1.4.1.5 accent5 (Accent 5) */
  18479. /* 20.1.4.1.6 accent6 (Accent 6) */
  18480. /* 20.1.4.1.9 dk1 (Dark 1) */
  18481. /* 20.1.4.1.10 dk2 (Dark 2) */
  18482. /* 20.1.4.1.15 folHlink (Followed Hyperlink) */
  18483. /* 20.1.4.1.19 hlink (Hyperlink) */
  18484. /* 20.1.4.1.22 lt1 (Light 1) */
  18485. /* 20.1.4.1.23 lt2 (Light 2) */
  18486. case '<a:dk1>': case '</a:dk1>':
  18487. case '<a:lt1>': case '</a:lt1>':
  18488. case '<a:dk2>': case '</a:dk2>':
  18489. case '<a:lt2>': case '</a:lt2>':
  18490. case '<a:accent1>': case '</a:accent1>':
  18491. case '<a:accent2>': case '</a:accent2>':
  18492. case '<a:accent3>': case '</a:accent3>':
  18493. case '<a:accent4>': case '</a:accent4>':
  18494. case '<a:accent5>': case '</a:accent5>':
  18495. case '<a:accent6>': case '</a:accent6>':
  18496. case '<a:hlink>': case '</a:hlink>':
  18497. case '<a:folHlink>': case '</a:folHlink>':
  18498. if (y[0].charAt(1) === '/') {
  18499. themes.themeElements.clrScheme[XLSXThemeClrScheme.indexOf(y[0])] = color;
  18500. color = {};
  18501. } else {
  18502. color.name = y[0].slice(3, y[0].length - 1);
  18503. }
  18504. break;
  18505. default: if(opts && opts.WTF) throw new Error('Unrecognized ' + y[0] + ' in clrScheme');
  18506. }
  18507. });
  18508. }
  18509. /* 20.1.4.1.18 fontScheme CT_FontScheme */
  18510. function parse_fontScheme() { }
  18511. /* 20.1.4.1.15 fmtScheme CT_StyleMatrix */
  18512. function parse_fmtScheme() { }
  18513. var clrsregex = /<a:clrScheme([^>]*)>[\s\S]*<\/a:clrScheme>/;
  18514. var fntsregex = /<a:fontScheme([^>]*)>[\s\S]*<\/a:fontScheme>/;
  18515. var fmtsregex = /<a:fmtScheme([^>]*)>[\s\S]*<\/a:fmtScheme>/;
  18516. /* 20.1.6.10 themeElements CT_BaseStyles */
  18517. function parse_themeElements(data, themes, opts) {
  18518. themes.themeElements = {};
  18519. var t;
  18520. [
  18521. /* clrScheme CT_ColorScheme */
  18522. ['clrScheme', clrsregex, parse_clrScheme],
  18523. /* fontScheme CT_FontScheme */
  18524. ['fontScheme', fntsregex, parse_fontScheme],
  18525. /* fmtScheme CT_StyleMatrix */
  18526. ['fmtScheme', fmtsregex, parse_fmtScheme]
  18527. ].forEach(function(m) {
  18528. if(!(t=data.match(m[1]))) throw new Error(m[0] + ' not found in themeElements');
  18529. m[2](t, themes, opts);
  18530. });
  18531. }
  18532. var themeltregex = /<a:themeElements([^>]*)>[\s\S]*<\/a:themeElements>/;
  18533. /* 14.2.7 Theme Part */
  18534. function parse_theme_xml(data, opts) {
  18535. /* 20.1.6.9 theme CT_OfficeStyleSheet */
  18536. if(!data || data.length === 0) return parse_theme_xml(write_theme());
  18537. var t;
  18538. var themes = {};
  18539. /* themeElements CT_BaseStyles */
  18540. if(!(t=data.match(themeltregex))) throw new Error('themeElements not found in theme');
  18541. parse_themeElements(t[0], themes, opts);
  18542. themes.raw = data;
  18543. return themes;
  18544. }
  18545. function write_theme(Themes, opts) {
  18546. if(opts && opts.themeXLSX) return opts.themeXLSX;
  18547. if(Themes && typeof Themes.raw == "string") return Themes.raw;
  18548. var o = [XML_HEADER];
  18549. o[o.length] = '<a:theme xmlns:a="http://schemas.openxmlformats.org/drawingml/2006/main" name="Office Theme">';
  18550. o[o.length] = '<a:themeElements>';
  18551. o[o.length] = '<a:clrScheme name="Office">';
  18552. o[o.length] = '<a:dk1><a:sysClr val="windowText" lastClr="000000"/></a:dk1>';
  18553. o[o.length] = '<a:lt1><a:sysClr val="window" lastClr="FFFFFF"/></a:lt1>';
  18554. o[o.length] = '<a:dk2><a:srgbClr val="1F497D"/></a:dk2>';
  18555. o[o.length] = '<a:lt2><a:srgbClr val="EEECE1"/></a:lt2>';
  18556. o[o.length] = '<a:accent1><a:srgbClr val="4F81BD"/></a:accent1>';
  18557. o[o.length] = '<a:accent2><a:srgbClr val="C0504D"/></a:accent2>';
  18558. o[o.length] = '<a:accent3><a:srgbClr val="9BBB59"/></a:accent3>';
  18559. o[o.length] = '<a:accent4><a:srgbClr val="8064A2"/></a:accent4>';
  18560. o[o.length] = '<a:accent5><a:srgbClr val="4BACC6"/></a:accent5>';
  18561. o[o.length] = '<a:accent6><a:srgbClr val="F79646"/></a:accent6>';
  18562. o[o.length] = '<a:hlink><a:srgbClr val="0000FF"/></a:hlink>';
  18563. o[o.length] = '<a:folHlink><a:srgbClr val="800080"/></a:folHlink>';
  18564. o[o.length] = '</a:clrScheme>';
  18565. o[o.length] = '<a:fontScheme name="Office">';
  18566. o[o.length] = '<a:majorFont>';
  18567. o[o.length] = '<a:latin typeface="Cambria"/>';
  18568. o[o.length] = '<a:ea typeface=""/>';
  18569. o[o.length] = '<a:cs typeface=""/>';
  18570. o[o.length] = '<a:font script="Jpan" typeface="MS Pゴシック"/>';
  18571. o[o.length] = '<a:font script="Hang" typeface="맑은 고딕"/>';
  18572. o[o.length] = '<a:font script="Hans" typeface="宋体"/>';
  18573. o[o.length] = '<a:font script="Hant" typeface="新細明體"/>';
  18574. o[o.length] = '<a:font script="Arab" typeface="Times New Roman"/>';
  18575. o[o.length] = '<a:font script="Hebr" typeface="Times New Roman"/>';
  18576. o[o.length] = '<a:font script="Thai" typeface="Tahoma"/>';
  18577. o[o.length] = '<a:font script="Ethi" typeface="Nyala"/>';
  18578. o[o.length] = '<a:font script="Beng" typeface="Vrinda"/>';
  18579. o[o.length] = '<a:font script="Gujr" typeface="Shruti"/>';
  18580. o[o.length] = '<a:font script="Khmr" typeface="MoolBoran"/>';
  18581. o[o.length] = '<a:font script="Knda" typeface="Tunga"/>';
  18582. o[o.length] = '<a:font script="Guru" typeface="Raavi"/>';
  18583. o[o.length] = '<a:font script="Cans" typeface="Euphemia"/>';
  18584. o[o.length] = '<a:font script="Cher" typeface="Plantagenet Cherokee"/>';
  18585. o[o.length] = '<a:font script="Yiii" typeface="Microsoft Yi Baiti"/>';
  18586. o[o.length] = '<a:font script="Tibt" typeface="Microsoft Himalaya"/>';
  18587. o[o.length] = '<a:font script="Thaa" typeface="MV Boli"/>';
  18588. o[o.length] = '<a:font script="Deva" typeface="Mangal"/>';
  18589. o[o.length] = '<a:font script="Telu" typeface="Gautami"/>';
  18590. o[o.length] = '<a:font script="Taml" typeface="Latha"/>';
  18591. o[o.length] = '<a:font script="Syrc" typeface="Estrangelo Edessa"/>';
  18592. o[o.length] = '<a:font script="Orya" typeface="Kalinga"/>';
  18593. o[o.length] = '<a:font script="Mlym" typeface="Kartika"/>';
  18594. o[o.length] = '<a:font script="Laoo" typeface="DokChampa"/>';
  18595. o[o.length] = '<a:font script="Sinh" typeface="Iskoola Pota"/>';
  18596. o[o.length] = '<a:font script="Mong" typeface="Mongolian Baiti"/>';
  18597. o[o.length] = '<a:font script="Viet" typeface="Times New Roman"/>';
  18598. o[o.length] = '<a:font script="Uigh" typeface="Microsoft Uighur"/>';
  18599. o[o.length] = '<a:font script="Geor" typeface="Sylfaen"/>';
  18600. o[o.length] = '</a:majorFont>';
  18601. o[o.length] = '<a:minorFont>';
  18602. o[o.length] = '<a:latin typeface="Calibri"/>';
  18603. o[o.length] = '<a:ea typeface=""/>';
  18604. o[o.length] = '<a:cs typeface=""/>';
  18605. o[o.length] = '<a:font script="Jpan" typeface="MS Pゴシック"/>';
  18606. o[o.length] = '<a:font script="Hang" typeface="맑은 고딕"/>';
  18607. o[o.length] = '<a:font script="Hans" typeface="宋体"/>';
  18608. o[o.length] = '<a:font script="Hant" typeface="新細明體"/>';
  18609. o[o.length] = '<a:font script="Arab" typeface="Arial"/>';
  18610. o[o.length] = '<a:font script="Hebr" typeface="Arial"/>';
  18611. o[o.length] = '<a:font script="Thai" typeface="Tahoma"/>';
  18612. o[o.length] = '<a:font script="Ethi" typeface="Nyala"/>';
  18613. o[o.length] = '<a:font script="Beng" typeface="Vrinda"/>';
  18614. o[o.length] = '<a:font script="Gujr" typeface="Shruti"/>';
  18615. o[o.length] = '<a:font script="Khmr" typeface="DaunPenh"/>';
  18616. o[o.length] = '<a:font script="Knda" typeface="Tunga"/>';
  18617. o[o.length] = '<a:font script="Guru" typeface="Raavi"/>';
  18618. o[o.length] = '<a:font script="Cans" typeface="Euphemia"/>';
  18619. o[o.length] = '<a:font script="Cher" typeface="Plantagenet Cherokee"/>';
  18620. o[o.length] = '<a:font script="Yiii" typeface="Microsoft Yi Baiti"/>';
  18621. o[o.length] = '<a:font script="Tibt" typeface="Microsoft Himalaya"/>';
  18622. o[o.length] = '<a:font script="Thaa" typeface="MV Boli"/>';
  18623. o[o.length] = '<a:font script="Deva" typeface="Mangal"/>';
  18624. o[o.length] = '<a:font script="Telu" typeface="Gautami"/>';
  18625. o[o.length] = '<a:font script="Taml" typeface="Latha"/>';
  18626. o[o.length] = '<a:font script="Syrc" typeface="Estrangelo Edessa"/>';
  18627. o[o.length] = '<a:font script="Orya" typeface="Kalinga"/>';
  18628. o[o.length] = '<a:font script="Mlym" typeface="Kartika"/>';
  18629. o[o.length] = '<a:font script="Laoo" typeface="DokChampa"/>';
  18630. o[o.length] = '<a:font script="Sinh" typeface="Iskoola Pota"/>';
  18631. o[o.length] = '<a:font script="Mong" typeface="Mongolian Baiti"/>';
  18632. o[o.length] = '<a:font script="Viet" typeface="Arial"/>';
  18633. o[o.length] = '<a:font script="Uigh" typeface="Microsoft Uighur"/>';
  18634. o[o.length] = '<a:font script="Geor" typeface="Sylfaen"/>';
  18635. o[o.length] = '</a:minorFont>';
  18636. o[o.length] = '</a:fontScheme>';
  18637. o[o.length] = '<a:fmtScheme name="Office">';
  18638. o[o.length] = '<a:fillStyleLst>';
  18639. o[o.length] = '<a:solidFill><a:schemeClr val="phClr"/></a:solidFill>';
  18640. o[o.length] = '<a:gradFill rotWithShape="1">';
  18641. o[o.length] = '<a:gsLst>';
  18642. o[o.length] = '<a:gs pos="0"><a:schemeClr val="phClr"><a:tint val="50000"/><a:satMod val="300000"/></a:schemeClr></a:gs>';
  18643. o[o.length] = '<a:gs pos="35000"><a:schemeClr val="phClr"><a:tint val="37000"/><a:satMod val="300000"/></a:schemeClr></a:gs>';
  18644. o[o.length] = '<a:gs pos="100000"><a:schemeClr val="phClr"><a:tint val="15000"/><a:satMod val="350000"/></a:schemeClr></a:gs>';
  18645. o[o.length] = '</a:gsLst>';
  18646. o[o.length] = '<a:lin ang="16200000" scaled="1"/>';
  18647. o[o.length] = '</a:gradFill>';
  18648. o[o.length] = '<a:gradFill rotWithShape="1">';
  18649. o[o.length] = '<a:gsLst>';
  18650. o[o.length] = '<a:gs pos="0"><a:schemeClr val="phClr"><a:tint val="100000"/><a:shade val="100000"/><a:satMod val="130000"/></a:schemeClr></a:gs>';
  18651. o[o.length] = '<a:gs pos="100000"><a:schemeClr val="phClr"><a:tint val="50000"/><a:shade val="100000"/><a:satMod val="350000"/></a:schemeClr></a:gs>';
  18652. o[o.length] = '</a:gsLst>';
  18653. o[o.length] = '<a:lin ang="16200000" scaled="0"/>';
  18654. o[o.length] = '</a:gradFill>';
  18655. o[o.length] = '</a:fillStyleLst>';
  18656. o[o.length] = '<a:lnStyleLst>';
  18657. o[o.length] = '<a:ln w="9525" cap="flat" cmpd="sng" algn="ctr"><a:solidFill><a:schemeClr val="phClr"><a:shade val="95000"/><a:satMod val="105000"/></a:schemeClr></a:solidFill><a:prstDash val="solid"/></a:ln>';
  18658. o[o.length] = '<a:ln w="25400" cap="flat" cmpd="sng" algn="ctr"><a:solidFill><a:schemeClr val="phClr"/></a:solidFill><a:prstDash val="solid"/></a:ln>';
  18659. o[o.length] = '<a:ln w="38100" cap="flat" cmpd="sng" algn="ctr"><a:solidFill><a:schemeClr val="phClr"/></a:solidFill><a:prstDash val="solid"/></a:ln>';
  18660. o[o.length] = '</a:lnStyleLst>';
  18661. o[o.length] = '<a:effectStyleLst>';
  18662. o[o.length] = '<a:effectStyle>';
  18663. o[o.length] = '<a:effectLst>';
  18664. o[o.length] = '<a:outerShdw blurRad="40000" dist="20000" dir="5400000" rotWithShape="0"><a:srgbClr val="000000"><a:alpha val="38000"/></a:srgbClr></a:outerShdw>';
  18665. o[o.length] = '</a:effectLst>';
  18666. o[o.length] = '</a:effectStyle>';
  18667. o[o.length] = '<a:effectStyle>';
  18668. o[o.length] = '<a:effectLst>';
  18669. o[o.length] = '<a:outerShdw blurRad="40000" dist="23000" dir="5400000" rotWithShape="0"><a:srgbClr val="000000"><a:alpha val="35000"/></a:srgbClr></a:outerShdw>';
  18670. o[o.length] = '</a:effectLst>';
  18671. o[o.length] = '</a:effectStyle>';
  18672. o[o.length] = '<a:effectStyle>';
  18673. o[o.length] = '<a:effectLst>';
  18674. o[o.length] = '<a:outerShdw blurRad="40000" dist="23000" dir="5400000" rotWithShape="0"><a:srgbClr val="000000"><a:alpha val="35000"/></a:srgbClr></a:outerShdw>';
  18675. o[o.length] = '</a:effectLst>';
  18676. o[o.length] = '<a:scene3d><a:camera prst="orthographicFront"><a:rot lat="0" lon="0" rev="0"/></a:camera><a:lightRig rig="threePt" dir="t"><a:rot lat="0" lon="0" rev="1200000"/></a:lightRig></a:scene3d>';
  18677. o[o.length] = '<a:sp3d><a:bevelT w="63500" h="25400"/></a:sp3d>';
  18678. o[o.length] = '</a:effectStyle>';
  18679. o[o.length] = '</a:effectStyleLst>';
  18680. o[o.length] = '<a:bgFillStyleLst>';
  18681. o[o.length] = '<a:solidFill><a:schemeClr val="phClr"/></a:solidFill>';
  18682. o[o.length] = '<a:gradFill rotWithShape="1">';
  18683. o[o.length] = '<a:gsLst>';
  18684. o[o.length] = '<a:gs pos="0"><a:schemeClr val="phClr"><a:tint val="40000"/><a:satMod val="350000"/></a:schemeClr></a:gs>';
  18685. o[o.length] = '<a:gs pos="40000"><a:schemeClr val="phClr"><a:tint val="45000"/><a:shade val="99000"/><a:satMod val="350000"/></a:schemeClr></a:gs>';
  18686. o[o.length] = '<a:gs pos="100000"><a:schemeClr val="phClr"><a:shade val="20000"/><a:satMod val="255000"/></a:schemeClr></a:gs>';
  18687. o[o.length] = '</a:gsLst>';
  18688. o[o.length] = '<a:path path="circle"><a:fillToRect l="50000" t="-80000" r="50000" b="180000"/></a:path>';
  18689. o[o.length] = '</a:gradFill>';
  18690. o[o.length] = '<a:gradFill rotWithShape="1">';
  18691. o[o.length] = '<a:gsLst>';
  18692. o[o.length] = '<a:gs pos="0"><a:schemeClr val="phClr"><a:tint val="80000"/><a:satMod val="300000"/></a:schemeClr></a:gs>';
  18693. o[o.length] = '<a:gs pos="100000"><a:schemeClr val="phClr"><a:shade val="30000"/><a:satMod val="200000"/></a:schemeClr></a:gs>';
  18694. o[o.length] = '</a:gsLst>';
  18695. o[o.length] = '<a:path path="circle"><a:fillToRect l="50000" t="50000" r="50000" b="50000"/></a:path>';
  18696. o[o.length] = '</a:gradFill>';
  18697. o[o.length] = '</a:bgFillStyleLst>';
  18698. o[o.length] = '</a:fmtScheme>';
  18699. o[o.length] = '</a:themeElements>';
  18700. o[o.length] = '<a:objectDefaults>';
  18701. o[o.length] = '<a:spDef>';
  18702. o[o.length] = '<a:spPr/><a:bodyPr/><a:lstStyle/><a:style><a:lnRef idx="1"><a:schemeClr val="accent1"/></a:lnRef><a:fillRef idx="3"><a:schemeClr val="accent1"/></a:fillRef><a:effectRef idx="2"><a:schemeClr val="accent1"/></a:effectRef><a:fontRef idx="minor"><a:schemeClr val="lt1"/></a:fontRef></a:style>';
  18703. o[o.length] = '</a:spDef>';
  18704. o[o.length] = '<a:lnDef>';
  18705. o[o.length] = '<a:spPr/><a:bodyPr/><a:lstStyle/><a:style><a:lnRef idx="2"><a:schemeClr val="accent1"/></a:lnRef><a:fillRef idx="0"><a:schemeClr val="accent1"/></a:fillRef><a:effectRef idx="1"><a:schemeClr val="accent1"/></a:effectRef><a:fontRef idx="minor"><a:schemeClr val="tx1"/></a:fontRef></a:style>';
  18706. o[o.length] = '</a:lnDef>';
  18707. o[o.length] = '</a:objectDefaults>';
  18708. o[o.length] = '<a:extraClrSchemeLst/>';
  18709. o[o.length] = '</a:theme>';
  18710. return o.join("");
  18711. }
  18712. /* [MS-XLS] 2.4.326 TODO: payload is a zip file */
  18713. function parse_Theme(blob, length, opts) {
  18714. var end = blob.l + length;
  18715. var dwThemeVersion = blob.read_shift(4);
  18716. if(dwThemeVersion === 124226) return;
  18717. if(!opts.cellStyles || !jszip) { blob.l = end; return; }
  18718. var data = blob.slice(blob.l);
  18719. blob.l = end;
  18720. var zip; try { zip = new jszip(data); } catch(e) { return; }
  18721. var themeXML = getzipstr(zip, "theme/theme/theme1.xml", true);
  18722. if(!themeXML) return;
  18723. return parse_theme_xml(themeXML, opts);
  18724. }
  18725. /* 2.5.49 */
  18726. function parse_ColorTheme(blob) { return blob.read_shift(4); }
  18727. /* 2.5.155 */
  18728. function parse_FullColorExt(blob) {
  18729. var o = {};
  18730. o.xclrType = blob.read_shift(2);
  18731. o.nTintShade = blob.read_shift(2);
  18732. switch(o.xclrType) {
  18733. case 0: blob.l += 4; break;
  18734. case 1: o.xclrValue = parse_IcvXF(blob, 4); break;
  18735. case 2: o.xclrValue = parse_LongRGBA(blob, 4); break;
  18736. case 3: o.xclrValue = parse_ColorTheme(blob, 4); break;
  18737. case 4: blob.l += 4; break;
  18738. }
  18739. blob.l += 8;
  18740. return o;
  18741. }
  18742. /* 2.5.164 TODO: read 7 bits*/
  18743. function parse_IcvXF(blob, length) {
  18744. return parsenoop(blob, length);
  18745. }
  18746. /* 2.5.280 */
  18747. function parse_XFExtGradient(blob, length) {
  18748. return parsenoop(blob, length);
  18749. }
  18750. /* [MS-XLS] 2.5.108 */
  18751. function parse_ExtProp(blob) {
  18752. var extType = blob.read_shift(2);
  18753. var cb = blob.read_shift(2) - 4;
  18754. var o = [extType];
  18755. switch(extType) {
  18756. case 0x04: case 0x05: case 0x07: case 0x08:
  18757. case 0x09: case 0x0A: case 0x0B: case 0x0D:
  18758. o[1] = parse_FullColorExt(blob, cb); break;
  18759. case 0x06: o[1] = parse_XFExtGradient(blob, cb); break;
  18760. case 0x0E: case 0x0F: o[1] = blob.read_shift(cb === 1 ? 1 : 2); break;
  18761. default: throw new Error("Unrecognized ExtProp type: " + extType + " " + cb);
  18762. }
  18763. return o;
  18764. }
  18765. /* 2.4.355 */
  18766. function parse_XFExt(blob, length) {
  18767. var end = blob.l + length;
  18768. blob.l += 2;
  18769. var ixfe = blob.read_shift(2);
  18770. blob.l += 2;
  18771. var cexts = blob.read_shift(2);
  18772. var ext = [];
  18773. while(cexts-- > 0) ext.push(parse_ExtProp(blob, end-blob.l));
  18774. return {ixfe:ixfe, ext:ext};
  18775. }
  18776. /* xf is an XF, see parse_XFExt for xfext */
  18777. function update_xfext(xf, xfext) {
  18778. xfext.forEach(function(xfe) {
  18779. switch(xfe[0]) { /* 2.5.108 extPropData */
  18780. case 0x04: break; /* foreground color */
  18781. case 0x05: break; /* background color */
  18782. case 0x06: break; /* gradient fill */
  18783. case 0x07: break; /* top cell border color */
  18784. case 0x08: break; /* bottom cell border color */
  18785. case 0x09: break; /* left cell border color */
  18786. case 0x0a: break; /* right cell border color */
  18787. case 0x0b: break; /* diagonal cell border color */
  18788. case 0x0d: /* text color */
  18789. break;
  18790. case 0x0e: break; /* font scheme */
  18791. case 0x0f: break; /* indentation level */
  18792. }
  18793. });
  18794. }
  18795. /* 18.6 Calculation Chain */
  18796. function parse_cc_xml(data) {
  18797. var d = [];
  18798. if(!data) return d;
  18799. var i = 1;
  18800. (data.match(tagregex)||[]).forEach(function(x) {
  18801. var y = parsexmltag(x);
  18802. switch(y[0]) {
  18803. case '<?xml': break;
  18804. /* 18.6.2 calcChain CT_CalcChain 1 */
  18805. case '<calcChain': case '<calcChain>': case '</calcChain>': break;
  18806. /* 18.6.1 c CT_CalcCell 1 */
  18807. case '<c': delete y[0]; if(y.i) i = y.i; else y.i = i; d.push(y); break;
  18808. }
  18809. });
  18810. return d;
  18811. }
  18812. //function write_cc_xml(data, opts) { }
  18813. /* [MS-XLSB] 2.6.4.1 */
  18814. function parse_BrtCalcChainItem$(data) {
  18815. var out = {};
  18816. out.i = data.read_shift(4);
  18817. var cell = {};
  18818. cell.r = data.read_shift(4);
  18819. cell.c = data.read_shift(4);
  18820. out.r = encode_cell(cell);
  18821. var flags = data.read_shift(1);
  18822. if(flags & 0x2) out.l = '1';
  18823. if(flags & 0x8) out.a = '1';
  18824. return out;
  18825. }
  18826. /* 18.6 Calculation Chain */
  18827. function parse_cc_bin(data, name, opts) {
  18828. var out = [];
  18829. var pass = false;
  18830. recordhopper(data, function hopper_cc(val, R_n, RT) {
  18831. switch(RT) {
  18832. case 0x003F: /* 'BrtCalcChainItem$' */
  18833. out.push(val); break;
  18834. default:
  18835. if((R_n||"").indexOf("Begin") > 0){/* empty */}
  18836. else if((R_n||"").indexOf("End") > 0){/* empty */}
  18837. else if(!pass || opts.WTF) throw new Error("Unexpected record " + RT + " " + R_n);
  18838. }
  18839. });
  18840. return out;
  18841. }
  18842. //function write_cc_bin(data, opts) { }
  18843. /* 18.14 Supplementary Workbook Data */
  18844. function parse_xlink_xml() {
  18845. //var opts = _opts || {};
  18846. //if(opts.WTF) throw "XLSX External Link";
  18847. }
  18848. /* [MS-XLSB] 2.1.7.25 External Link */
  18849. function parse_xlink_bin(data, rel, name, _opts) {
  18850. if(!data) return data;
  18851. var opts = _opts || {};
  18852. var pass = false, end = false;
  18853. recordhopper(data, function xlink_parse(val, R_n, RT) {
  18854. if(end) return;
  18855. switch(RT) {
  18856. case 0x0167: /* 'BrtSupTabs' */
  18857. case 0x016B: /* 'BrtExternTableStart' */
  18858. case 0x016C: /* 'BrtExternTableEnd' */
  18859. case 0x016E: /* 'BrtExternRowHdr' */
  18860. case 0x016F: /* 'BrtExternCellBlank' */
  18861. case 0x0170: /* 'BrtExternCellReal' */
  18862. case 0x0171: /* 'BrtExternCellBool' */
  18863. case 0x0172: /* 'BrtExternCellError' */
  18864. case 0x0173: /* 'BrtExternCellString' */
  18865. case 0x01D8: /* 'BrtExternValueMeta' */
  18866. case 0x0241: /* 'BrtSupNameStart' */
  18867. case 0x0242: /* 'BrtSupNameValueStart' */
  18868. case 0x0243: /* 'BrtSupNameValueEnd' */
  18869. case 0x0244: /* 'BrtSupNameNum' */
  18870. case 0x0245: /* 'BrtSupNameErr' */
  18871. case 0x0246: /* 'BrtSupNameSt' */
  18872. case 0x0247: /* 'BrtSupNameNil' */
  18873. case 0x0248: /* 'BrtSupNameBool' */
  18874. case 0x0249: /* 'BrtSupNameFmla' */
  18875. case 0x024A: /* 'BrtSupNameBits' */
  18876. case 0x024B: /* 'BrtSupNameEnd' */
  18877. break;
  18878. case 0x0023: /* 'BrtFRTBegin' */
  18879. pass = true; break;
  18880. case 0x0024: /* 'BrtFRTEnd' */
  18881. pass = false; break;
  18882. default:
  18883. if((R_n||"").indexOf("Begin") > 0){/* empty */}
  18884. else if((R_n||"").indexOf("End") > 0){/* empty */}
  18885. else if(!pass || opts.WTF) throw new Error("Unexpected record " + RT.toString(16) + " " + R_n);
  18886. }
  18887. }, opts);
  18888. }
  18889. /* 20.5 DrawingML - SpreadsheetML Drawing */
  18890. RELS.IMG = "http://schemas.openxmlformats.org/officeDocument/2006/relationships/image";
  18891. RELS.DRAW = "http://schemas.openxmlformats.org/officeDocument/2006/relationships/drawing";
  18892. /* 20.5.2.35 wsDr CT_Drawing */
  18893. function parse_drawing(data, rels) {
  18894. if(!data) return "??";
  18895. /*
  18896. Chartsheet Drawing:
  18897. - 20.5.2.35 wsDr CT_Drawing
  18898. - 20.5.2.1 absoluteAnchor CT_AbsoluteAnchor
  18899. - 20.5.2.16 graphicFrame CT_GraphicalObjectFrame
  18900. - 20.1.2.2.16 graphic CT_GraphicalObject
  18901. - 20.1.2.2.17 graphicData CT_GraphicalObjectData
  18902. - chart reference
  18903. the actual type is based on the URI of the graphicData
  18904. TODO: handle embedded charts and other types of graphics
  18905. */
  18906. var id = (data.match(/<c:chart [^>]*r:id="([^"]*)"/)||["",""])[1];
  18907. return rels['!id'][id].Target;
  18908. }
  18909. /* L.5.5.2 SpreadsheetML Comments + VML Schema */
  18910. var _shapeid = 1024;
  18911. function write_comments_vml(rId, comments) {
  18912. var csize = [21600, 21600];
  18913. /* L.5.2.1.2 Path Attribute */
  18914. var bbox = ["m0,0l0",csize[1],csize[0],csize[1],csize[0],"0xe"].join(",");
  18915. var o = [
  18916. writextag("xml", null, { 'xmlns:v': XLMLNS.v, 'xmlns:o': XLMLNS.o, 'xmlns:x': XLMLNS.x, 'xmlns:mv': XLMLNS.mv }).replace(/\/>/,">"),
  18917. writextag("o:shapelayout", writextag("o:idmap", null, {'v:ext':"edit", 'data':rId}), {'v:ext':"edit"}),
  18918. writextag("v:shapetype", [
  18919. writextag("v:stroke", null, {joinstyle:"miter"}),
  18920. writextag("v:path", null, {gradientshapeok:"t", 'o:connecttype':"rect"})
  18921. ].join(""), {id:"_x0000_t202", 'o:spt':202, coordsize:csize.join(","),path:bbox})
  18922. ];
  18923. while(_shapeid < rId * 1000) _shapeid += 1000;
  18924. comments.forEach(function(x) {
  18925. var c = decode_cell(x[0]);
  18926. var fillopts = {'color2':"#BEFF82", 'type':"gradient"};
  18927. if(fillopts.type == "gradient") fillopts.angle = "-180";
  18928. var fillparm = fillopts.type == "gradient" ? writextag("o:fill", null, {type:"gradientUnscaled", 'v:ext':"view"}) : null;
  18929. var fillxml = writextag('v:fill', fillparm, fillopts);
  18930. var shadata = ({on:"t", 'obscured':"t"});
  18931. ++_shapeid;
  18932. o = o.concat([
  18933. '<v:shape' + wxt_helper({
  18934. id:'_x0000_s' + _shapeid,
  18935. type:"#_x0000_t202",
  18936. style:"position:absolute; margin-left:80pt;margin-top:5pt;width:104pt;height:64pt;z-index:10" + (x[1].hidden ? ";visibility:hidden" : "") ,
  18937. fillcolor:"#ECFAD4",
  18938. strokecolor:"#edeaa1"
  18939. }) + '>',
  18940. fillxml,
  18941. writextag("v:shadow", null, shadata),
  18942. writextag("v:path", null, {'o:connecttype':"none"}),
  18943. '<v:textbox><div style="text-align:left"></div></v:textbox>',
  18944. '<x:ClientData ObjectType="Note">',
  18945. '<x:MoveWithCells/>',
  18946. '<x:SizeWithCells/>',
  18947. /* Part 4 19.4.2.3 Anchor (Anchor) */
  18948. writetag('x:Anchor', [c.c+1, 0, c.r+1, 0, c.c+3, 20, c.r+5, 20].join(",")),
  18949. writetag('x:AutoFill', "False"),
  18950. writetag('x:Row', String(c.r)),
  18951. writetag('x:Column', String(c.c)),
  18952. x[1].hidden ? '' : '<x:Visible/>',
  18953. '</x:ClientData>',
  18954. '</v:shape>'
  18955. ]); });
  18956. o.push('</xml>');
  18957. return o.join("");
  18958. }
  18959. RELS.CMNT = "http://schemas.openxmlformats.org/officeDocument/2006/relationships/comments";
  18960. function sheet_insert_comments(sheet, comments) {
  18961. var dense = Array.isArray(sheet);
  18962. var cell;
  18963. comments.forEach(function(comment) {
  18964. var r = decode_cell(comment.ref);
  18965. if(dense) {
  18966. if(!sheet[r.r]) sheet[r.r] = [];
  18967. cell = sheet[r.r][r.c];
  18968. } else cell = sheet[comment.ref];
  18969. if (!cell) {
  18970. cell = ({t:"z"});
  18971. if(dense) sheet[r.r][r.c] = cell;
  18972. else sheet[comment.ref] = cell;
  18973. var range = safe_decode_range(sheet["!ref"]||"BDWGO1000001:A1");
  18974. if(range.s.r > r.r) range.s.r = r.r;
  18975. if(range.e.r < r.r) range.e.r = r.r;
  18976. if(range.s.c > r.c) range.s.c = r.c;
  18977. if(range.e.c < r.c) range.e.c = r.c;
  18978. var encoded = encode_range(range);
  18979. if (encoded !== sheet["!ref"]) sheet["!ref"] = encoded;
  18980. }
  18981. if (!cell.c) cell.c = [];
  18982. var o = ({a: comment.author, t: comment.t, r: comment.r});
  18983. if(comment.h) o.h = comment.h;
  18984. cell.c.push(o);
  18985. });
  18986. }
  18987. /* 18.7 Comments */
  18988. function parse_comments_xml(data, opts) {
  18989. /* 18.7.6 CT_Comments */
  18990. if(data.match(/<(?:\w+:)?comments *\/>/)) return [];
  18991. var authors = [];
  18992. var commentList = [];
  18993. var authtag = data.match(/<(?:\w+:)?authors>([\s\S]*)<\/(?:\w+:)?authors>/);
  18994. if(authtag && authtag[1]) authtag[1].split(/<\/\w*:?author>/).forEach(function(x) {
  18995. if(x === "" || x.trim() === "") return;
  18996. var a = x.match(/<(?:\w+:)?author[^>]*>(.*)/);
  18997. if(a) authors.push(a[1]);
  18998. });
  18999. var cmnttag = data.match(/<(?:\w+:)?commentList>([\s\S]*)<\/(?:\w+:)?commentList>/);
  19000. if(cmnttag && cmnttag[1]) cmnttag[1].split(/<\/\w*:?comment>/).forEach(function(x) {
  19001. if(x === "" || x.trim() === "") return;
  19002. var cm = x.match(/<(?:\w+:)?comment[^>]*>/);
  19003. if(!cm) return;
  19004. var y = parsexmltag(cm[0]);
  19005. var comment = ({ author: y.authorId && authors[y.authorId] || "sheetjsghost", ref: y.ref, guid: y.guid });
  19006. var cell = decode_cell(y.ref);
  19007. if(opts.sheetRows && opts.sheetRows <= cell.r) return;
  19008. var textMatch = x.match(/<(?:\w+:)?text>([\s\S]*)<\/(?:\w+:)?text>/);
  19009. var rt = !!textMatch && !!textMatch[1] && parse_si(textMatch[1]) || {r:"",t:"",h:""};
  19010. comment.r = rt.r;
  19011. if(rt.r == "<t></t>") rt.t = rt.h = "";
  19012. comment.t = rt.t.replace(/\r\n/g,"\n").replace(/\r/g,"\n");
  19013. if(opts.cellHTML) comment.h = rt.h;
  19014. commentList.push(comment);
  19015. });
  19016. return commentList;
  19017. }
  19018. var CMNT_XML_ROOT = writextag('comments', null, { 'xmlns': XMLNS.main[0] });
  19019. function write_comments_xml(data) {
  19020. var o = [XML_HEADER, CMNT_XML_ROOT];
  19021. var iauthor = [];
  19022. o.push("<authors>");
  19023. data.forEach(function(x) { x[1].forEach(function(w) { var a = escapexml(w.a);
  19024. if(iauthor.indexOf(a) > -1) return;
  19025. iauthor.push(a);
  19026. o.push("<author>" + a + "</author>");
  19027. }); });
  19028. o.push("</authors>");
  19029. o.push("<commentList>");
  19030. data.forEach(function(d) {
  19031. d[1].forEach(function(c) {
  19032. /* 18.7.3 CT_Comment */
  19033. o.push('<comment ref="' + d[0] + '" authorId="' + iauthor.indexOf(escapexml(c.a)) + '"><text>');
  19034. o.push(writetag("t", c.t == null ? "" : escapexml(c.t)));
  19035. o.push('</text></comment>');
  19036. });
  19037. });
  19038. o.push("</commentList>");
  19039. if(o.length>2) { o[o.length] = ('</comments>'); o[1]=o[1].replace("/>",">"); }
  19040. return o.join("");
  19041. }
  19042. /* [MS-XLSB] 2.4.28 BrtBeginComment */
  19043. function parse_BrtBeginComment(data) {
  19044. var out = {};
  19045. out.iauthor = data.read_shift(4);
  19046. var rfx = parse_UncheckedRfX(data, 16);
  19047. out.rfx = rfx.s;
  19048. out.ref = encode_cell(rfx.s);
  19049. data.l += 16; /*var guid = parse_GUID(data); */
  19050. return out;
  19051. }
  19052. function write_BrtBeginComment(data, o) {
  19053. if(o == null) o = new_buf(36);
  19054. o.write_shift(4, data[1].iauthor);
  19055. write_UncheckedRfX((data[0]), o);
  19056. o.write_shift(4, 0);
  19057. o.write_shift(4, 0);
  19058. o.write_shift(4, 0);
  19059. o.write_shift(4, 0);
  19060. return o;
  19061. }
  19062. /* [MS-XLSB] 2.4.327 BrtCommentAuthor */
  19063. var parse_BrtCommentAuthor = parse_XLWideString;
  19064. function write_BrtCommentAuthor(data) { return write_XLWideString(data.slice(0, 54)); }
  19065. /* [MS-XLSB] 2.1.7.8 Comments */
  19066. function parse_comments_bin(data, opts) {
  19067. var out = [];
  19068. var authors = [];
  19069. var c = {};
  19070. var pass = false;
  19071. recordhopper(data, function hopper_cmnt(val, R_n, RT) {
  19072. switch(RT) {
  19073. case 0x0278: /* 'BrtCommentAuthor' */
  19074. authors.push(val); break;
  19075. case 0x027B: /* 'BrtBeginComment' */
  19076. c = val; break;
  19077. case 0x027D: /* 'BrtCommentText' */
  19078. c.t = val.t; c.h = val.h; c.r = val.r; break;
  19079. case 0x027C: /* 'BrtEndComment' */
  19080. c.author = authors[c.iauthor];
  19081. delete (c).iauthor;
  19082. if(opts.sheetRows && c.rfx && opts.sheetRows <= c.rfx.r) break;
  19083. if(!c.t) c.t = "";
  19084. delete c.rfx; out.push(c); break;
  19085. case 0x0C00: /* 'BrtUid' */
  19086. break;
  19087. case 0x0023: /* 'BrtFRTBegin' */
  19088. pass = true; break;
  19089. case 0x0024: /* 'BrtFRTEnd' */
  19090. pass = false; break;
  19091. case 0x0025: /* 'BrtACBegin' */ break;
  19092. case 0x0026: /* 'BrtACEnd' */ break;
  19093. default:
  19094. if((R_n||"").indexOf("Begin") > 0){/* empty */}
  19095. else if((R_n||"").indexOf("End") > 0){/* empty */}
  19096. else if(!pass || opts.WTF) throw new Error("Unexpected record " + RT + " " + R_n);
  19097. }
  19098. });
  19099. return out;
  19100. }
  19101. function write_comments_bin(data) {
  19102. var ba = buf_array();
  19103. var iauthor = [];
  19104. write_record(ba, "BrtBeginComments");
  19105. write_record(ba, "BrtBeginCommentAuthors");
  19106. data.forEach(function(comment) {
  19107. comment[1].forEach(function(c) {
  19108. if(iauthor.indexOf(c.a) > -1) return;
  19109. iauthor.push(c.a.slice(0,54));
  19110. write_record(ba, "BrtCommentAuthor", write_BrtCommentAuthor(c.a));
  19111. });
  19112. });
  19113. write_record(ba, "BrtEndCommentAuthors");
  19114. write_record(ba, "BrtBeginCommentList");
  19115. data.forEach(function(comment) {
  19116. comment[1].forEach(function(c) {
  19117. c.iauthor = iauthor.indexOf(c.a);
  19118. var range = {s:decode_cell(comment[0]),e:decode_cell(comment[0])};
  19119. write_record(ba, "BrtBeginComment", write_BrtBeginComment([range, c]));
  19120. if(c.t && c.t.length > 0) write_record(ba, "BrtCommentText", write_BrtCommentText(c));
  19121. write_record(ba, "BrtEndComment");
  19122. delete c.iauthor;
  19123. });
  19124. });
  19125. write_record(ba, "BrtEndCommentList");
  19126. write_record(ba, "BrtEndComments");
  19127. return ba.end();
  19128. }
  19129. var CT_VBA = "application/vnd.ms-office.vbaProject";
  19130. function make_vba_xls(cfb) {
  19131. var newcfb = CFB.utils.cfb_new({root:"R"});
  19132. cfb.FullPaths.forEach(function(p, i) {
  19133. if(p.slice(-1) === "/" || !p.match(/_VBA_PROJECT_CUR/)) return;
  19134. var newpath = p.replace(/^[^\/]*/,"R").replace(/\/_VBA_PROJECT_CUR\u0000*/, "");
  19135. CFB.utils.cfb_add(newcfb, newpath, cfb.FileIndex[i].content);
  19136. });
  19137. return CFB.write(newcfb);
  19138. }
  19139. function fill_vba_xls(cfb, vba) {
  19140. vba.FullPaths.forEach(function(p, i) {
  19141. if(i == 0) return;
  19142. var newpath = p.replace(/[^\/]*[\/]/, "/_VBA_PROJECT_CUR/");
  19143. if(newpath.slice(-1) !== "/") CFB.utils.cfb_add(cfb, newpath, vba.FileIndex[i].content);
  19144. });
  19145. }
  19146. var VBAFMTS = [ "xlsb", "xlsm", "xlam", "biff8", "xla" ];
  19147. RELS.DS = "http://schemas.openxmlformats.org/officeDocument/2006/relationships/dialogsheet";
  19148. RELS.MS = "http://schemas.microsoft.com/office/2006/relationships/xlMacrosheet";
  19149. /* macro and dialog sheet stubs */
  19150. function parse_ds_bin() { return {'!type':'dialog'}; }
  19151. function parse_ds_xml() { return {'!type':'dialog'}; }
  19152. function parse_ms_bin() { return {'!type':'macro'}; }
  19153. function parse_ms_xml() { return {'!type':'macro'}; }
  19154. /* TODO: it will be useful to parse the function str */
  19155. var rc_to_a1 = (function(){
  19156. var rcregex = /(^|[^A-Za-z_])R(\[?-?\d+\]|[1-9]\d*|)C(\[?-?\d+\]|[1-9]\d*|)(?![A-Za-z0-9_])/g;
  19157. var rcbase = ({r:0,c:0});
  19158. function rcfunc($$,$1,$2,$3) {
  19159. var cRel = false, rRel = false;
  19160. if($2.length == 0) rRel = true;
  19161. else if($2.charAt(0) == "[") { rRel = true; $2 = $2.slice(1, -1); }
  19162. if($3.length == 0) cRel = true;
  19163. else if($3.charAt(0) == "[") { cRel = true; $3 = $3.slice(1, -1); }
  19164. var R = $2.length>0?parseInt($2,10)|0:0, C = $3.length>0?parseInt($3,10)|0:0;
  19165. if(cRel) C += rcbase.c; else --C;
  19166. if(rRel) R += rcbase.r; else --R;
  19167. return $1 + (cRel ? "" : "$") + encode_col(C) + (rRel ? "" : "$") + encode_row(R);
  19168. }
  19169. return function rc_to_a1(fstr, base) {
  19170. rcbase = base;
  19171. return fstr.replace(rcregex, rcfunc);
  19172. };
  19173. })();
  19174. var crefregex = /(^|[^._A-Z0-9])([$]?)([A-Z]{1,2}|[A-W][A-Z]{2}|X[A-E][A-Z]|XF[A-D])([$]?)(10[0-3]\d{4}|104[0-7]\d{3}|1048[0-4]\d{2}|10485[0-6]\d|104857[0-6]|[1-9]\d{0,5})(?![_.\(A-Za-z0-9])/g;
  19175. var a1_to_rc =(function(){
  19176. return function a1_to_rc(fstr, base) {
  19177. return fstr.replace(crefregex, function($0, $1, $2, $3, $4, $5) {
  19178. var c = decode_col($3) - ($2 ? 0 : base.c);
  19179. var r = decode_row($5) - ($4 ? 0 : base.r);
  19180. var R = (r == 0 ? "" : !$4 ? "[" + r + "]" : (r+1));
  19181. var C = (c == 0 ? "" : !$2 ? "[" + c + "]" : (c+1));
  19182. return $1 + "R" + R + "C" + C;
  19183. });
  19184. };
  19185. })();
  19186. /* no defined name can collide with a valid cell address A1:XFD1048576 ... except LOG10! */
  19187. function shift_formula_str(f, delta) {
  19188. return f.replace(crefregex, function($0, $1, $2, $3, $4, $5) {
  19189. return $1+($2=="$" ? $2+$3 : encode_col(decode_col($3)+delta.c))+($4=="$" ? $4+$5 : encode_row(decode_row($5) + delta.r));
  19190. });
  19191. }
  19192. function shift_formula_xlsx(f, range, cell) {
  19193. var r = decode_range(range), s = r.s, c = decode_cell(cell);
  19194. var delta = {r:c.r - s.r, c:c.c - s.c};
  19195. return shift_formula_str(f, delta);
  19196. }
  19197. /* TODO: parse formula */
  19198. function fuzzyfmla(f) {
  19199. if(f.length == 1) return false;
  19200. return true;
  19201. }
  19202. function _xlfn(f) {
  19203. return f.replace(/_xlfn\./g,"");
  19204. }
  19205. function parseread1(blob) { blob.l+=1; return; }
  19206. /* [MS-XLS] 2.5.51 */
  19207. function parse_ColRelU(blob, length) {
  19208. var c = blob.read_shift(length == 1 ? 1 : 2);
  19209. return [c & 0x3FFF, (c >> 14) & 1, (c >> 15) & 1];
  19210. }
  19211. /* [MS-XLS] 2.5.198.105 ; [MS-XLSB] 2.5.97.89 */
  19212. function parse_RgceArea(blob, length, opts) {
  19213. var w = 2;
  19214. if(opts) {
  19215. if(opts.biff >= 2 && opts.biff <= 5) return parse_RgceArea_BIFF2(blob, length, opts);
  19216. else if(opts.biff == 12) w = 4;
  19217. }
  19218. var r=blob.read_shift(w), R=blob.read_shift(w);
  19219. var c=parse_ColRelU(blob, 2);
  19220. var C=parse_ColRelU(blob, 2);
  19221. return { s:{r:r, c:c[0], cRel:c[1], rRel:c[2]}, e:{r:R, c:C[0], cRel:C[1], rRel:C[2]} };
  19222. }
  19223. /* BIFF 2-5 encodes flags in the row field */
  19224. function parse_RgceArea_BIFF2(blob) {
  19225. var r=parse_ColRelU(blob, 2), R=parse_ColRelU(blob, 2);
  19226. var c=blob.read_shift(1);
  19227. var C=blob.read_shift(1);
  19228. return { s:{r:r[0], c:c, cRel:r[1], rRel:r[2]}, e:{r:R[0], c:C, cRel:R[1], rRel:R[2]} };
  19229. }
  19230. /* [MS-XLS] 2.5.198.105 ; [MS-XLSB] 2.5.97.90 */
  19231. function parse_RgceAreaRel(blob, length, opts) {
  19232. if(opts.biff < 8) return parse_RgceArea_BIFF2(blob, length, opts);
  19233. var r=blob.read_shift(opts.biff == 12 ? 4 : 2), R=blob.read_shift(opts.biff == 12 ? 4 : 2);
  19234. var c=parse_ColRelU(blob, 2);
  19235. var C=parse_ColRelU(blob, 2);
  19236. return { s:{r:r, c:c[0], cRel:c[1], rRel:c[2]}, e:{r:R, c:C[0], cRel:C[1], rRel:C[2]} };
  19237. }
  19238. /* [MS-XLS] 2.5.198.109 ; [MS-XLSB] 2.5.97.91 */
  19239. function parse_RgceLoc(blob, length, opts) {
  19240. if(opts && opts.biff >= 2 && opts.biff <= 5) return parse_RgceLoc_BIFF2(blob, length, opts);
  19241. var r = blob.read_shift(opts && opts.biff == 12 ? 4 : 2);
  19242. var c = parse_ColRelU(blob, 2);
  19243. return {r:r, c:c[0], cRel:c[1], rRel:c[2]};
  19244. }
  19245. function parse_RgceLoc_BIFF2(blob) {
  19246. var r = parse_ColRelU(blob, 2);
  19247. var c = blob.read_shift(1);
  19248. return {r:r[0], c:c, cRel:r[1], rRel:r[2]};
  19249. }
  19250. /* [MS-XLS] 2.5.198.107, 2.5.47 */
  19251. function parse_RgceElfLoc(blob) {
  19252. var r = blob.read_shift(2);
  19253. var c = blob.read_shift(2);
  19254. return {r:r, c:c & 0xFF, fQuoted:!!(c & 0x4000), cRel:c>>15, rRel:c>>15 };
  19255. }
  19256. /* [MS-XLS] 2.5.198.111 ; [MS-XLSB] 2.5.97.92 TODO */
  19257. function parse_RgceLocRel(blob, length, opts) {
  19258. var biff = opts && opts.biff ? opts.biff : 8;
  19259. if(biff >= 2 && biff <= 5) return parse_RgceLocRel_BIFF2(blob, length, opts);
  19260. var r = blob.read_shift(biff >= 12 ? 4 : 2);
  19261. var cl = blob.read_shift(2);
  19262. var cRel = (cl & 0x4000) >> 14, rRel = (cl & 0x8000) >> 15;
  19263. cl &= 0x3FFF;
  19264. if(rRel == 1) while(r > 0x7FFFF) r -= 0x100000;
  19265. if(cRel == 1) while(cl > 0x1FFF) cl = cl - 0x4000;
  19266. return {r:r,c:cl,cRel:cRel,rRel:rRel};
  19267. }
  19268. function parse_RgceLocRel_BIFF2(blob) {
  19269. var rl = blob.read_shift(2);
  19270. var c = blob.read_shift(1);
  19271. var rRel = (rl & 0x8000) >> 15, cRel = (rl & 0x4000) >> 14;
  19272. rl &= 0x3FFF;
  19273. if(rRel == 1 && rl >= 0x2000) rl = rl - 0x4000;
  19274. if(cRel == 1 && c >= 0x80) c = c - 0x100;
  19275. return {r:rl,c:c,cRel:cRel,rRel:rRel};
  19276. }
  19277. /* [MS-XLS] 2.5.198.27 ; [MS-XLSB] 2.5.97.18 */
  19278. function parse_PtgArea(blob, length, opts) {
  19279. var type = (blob[blob.l++] & 0x60) >> 5;
  19280. var area = parse_RgceArea(blob, opts.biff >= 2 && opts.biff <= 5 ? 6 : 8, opts);
  19281. return [type, area];
  19282. }
  19283. /* [MS-XLS] 2.5.198.28 ; [MS-XLSB] 2.5.97.19 */
  19284. function parse_PtgArea3d(blob, length, opts) {
  19285. var type = (blob[blob.l++] & 0x60) >> 5;
  19286. var ixti = blob.read_shift(2, 'i');
  19287. var w = 8;
  19288. if(opts) switch(opts.biff) {
  19289. case 5: blob.l += 12; w = 6; break;
  19290. case 12: w = 12; break;
  19291. }
  19292. var area = parse_RgceArea(blob, w, opts);
  19293. return [type, ixti, area];
  19294. }
  19295. /* [MS-XLS] 2.5.198.29 ; [MS-XLSB] 2.5.97.20 */
  19296. function parse_PtgAreaErr(blob, length, opts) {
  19297. var type = (blob[blob.l++] & 0x60) >> 5;
  19298. blob.l += opts && (opts.biff > 8) ? 12 : (opts.biff < 8 ? 6 : 8);
  19299. return [type];
  19300. }
  19301. /* [MS-XLS] 2.5.198.30 ; [MS-XLSB] 2.5.97.21 */
  19302. function parse_PtgAreaErr3d(blob, length, opts) {
  19303. var type = (blob[blob.l++] & 0x60) >> 5;
  19304. var ixti = blob.read_shift(2);
  19305. var w = 8;
  19306. if(opts) switch(opts.biff) {
  19307. case 5: blob.l += 12; w = 6; break;
  19308. case 12: w = 12; break;
  19309. }
  19310. blob.l += w;
  19311. return [type, ixti];
  19312. }
  19313. /* [MS-XLS] 2.5.198.31 ; [MS-XLSB] 2.5.97.22 */
  19314. function parse_PtgAreaN(blob, length, opts) {
  19315. var type = (blob[blob.l++] & 0x60) >> 5;
  19316. var area = parse_RgceAreaRel(blob, length - 1, opts);
  19317. return [type, area];
  19318. }
  19319. /* [MS-XLS] 2.5.198.32 ; [MS-XLSB] 2.5.97.23 */
  19320. function parse_PtgArray(blob, length, opts) {
  19321. var type = (blob[blob.l++] & 0x60) >> 5;
  19322. blob.l += opts.biff == 2 ? 6 : opts.biff == 12 ? 14 : 7;
  19323. return [type];
  19324. }
  19325. /* [MS-XLS] 2.5.198.33 ; [MS-XLSB] 2.5.97.24 */
  19326. function parse_PtgAttrBaxcel(blob) {
  19327. var bitSemi = blob[blob.l+1] & 0x01; /* 1 = volatile */
  19328. var bitBaxcel = 1;
  19329. blob.l += 4;
  19330. return [bitSemi, bitBaxcel];
  19331. }
  19332. /* [MS-XLS] 2.5.198.34 ; [MS-XLSB] 2.5.97.25 */
  19333. function parse_PtgAttrChoose(blob, length, opts) {
  19334. blob.l +=2;
  19335. var offset = blob.read_shift(opts && opts.biff == 2 ? 1 : 2);
  19336. var o = [];
  19337. /* offset is 1 less than the number of elements */
  19338. for(var i = 0; i <= offset; ++i) o.push(blob.read_shift(opts && opts.biff == 2 ? 1 : 2));
  19339. return o;
  19340. }
  19341. /* [MS-XLS] 2.5.198.35 ; [MS-XLSB] 2.5.97.26 */
  19342. function parse_PtgAttrGoto(blob, length, opts) {
  19343. var bitGoto = (blob[blob.l+1] & 0xFF) ? 1 : 0;
  19344. blob.l += 2;
  19345. return [bitGoto, blob.read_shift(opts && opts.biff == 2 ? 1 : 2)];
  19346. }
  19347. /* [MS-XLS] 2.5.198.36 ; [MS-XLSB] 2.5.97.27 */
  19348. function parse_PtgAttrIf(blob, length, opts) {
  19349. var bitIf = (blob[blob.l+1] & 0xFF) ? 1 : 0;
  19350. blob.l += 2;
  19351. return [bitIf, blob.read_shift(opts && opts.biff == 2 ? 1 : 2)];
  19352. }
  19353. /* [MS-XLSB] 2.5.97.28 */
  19354. function parse_PtgAttrIfError(blob) {
  19355. var bitIf = (blob[blob.l+1] & 0xFF) ? 1 : 0;
  19356. blob.l += 2;
  19357. return [bitIf, blob.read_shift(2)];
  19358. }
  19359. /* [MS-XLS] 2.5.198.37 ; [MS-XLSB] 2.5.97.29 */
  19360. function parse_PtgAttrSemi(blob, length, opts) {
  19361. var bitSemi = (blob[blob.l+1] & 0xFF) ? 1 : 0;
  19362. blob.l += opts && opts.biff == 2 ? 3 : 4;
  19363. return [bitSemi];
  19364. }
  19365. /* [MS-XLS] 2.5.198.40 ; [MS-XLSB] 2.5.97.32 */
  19366. function parse_PtgAttrSpaceType(blob) {
  19367. var type = blob.read_shift(1), cch = blob.read_shift(1);
  19368. return [type, cch];
  19369. }
  19370. /* [MS-XLS] 2.5.198.38 ; [MS-XLSB] 2.5.97.30 */
  19371. function parse_PtgAttrSpace(blob) {
  19372. blob.read_shift(2);
  19373. return parse_PtgAttrSpaceType(blob, 2);
  19374. }
  19375. /* [MS-XLS] 2.5.198.39 ; [MS-XLSB] 2.5.97.31 */
  19376. function parse_PtgAttrSpaceSemi(blob) {
  19377. blob.read_shift(2);
  19378. return parse_PtgAttrSpaceType(blob, 2);
  19379. }
  19380. /* [MS-XLS] 2.5.198.84 ; [MS-XLSB] 2.5.97.68 TODO */
  19381. function parse_PtgRef(blob, length, opts) {
  19382. //var ptg = blob[blob.l] & 0x1F;
  19383. var type = (blob[blob.l] & 0x60)>>5;
  19384. blob.l += 1;
  19385. var loc = parse_RgceLoc(blob, 0, opts);
  19386. return [type, loc];
  19387. }
  19388. /* [MS-XLS] 2.5.198.88 ; [MS-XLSB] 2.5.97.72 TODO */
  19389. function parse_PtgRefN(blob, length, opts) {
  19390. var type = (blob[blob.l] & 0x60)>>5;
  19391. blob.l += 1;
  19392. var loc = parse_RgceLocRel(blob, 0, opts);
  19393. return [type, loc];
  19394. }
  19395. /* [MS-XLS] 2.5.198.85 ; [MS-XLSB] 2.5.97.69 TODO */
  19396. function parse_PtgRef3d(blob, length, opts) {
  19397. var type = (blob[blob.l] & 0x60)>>5;
  19398. blob.l += 1;
  19399. var ixti = blob.read_shift(2); // XtiIndex
  19400. if(opts && opts.biff == 5) blob.l += 12;
  19401. var loc = parse_RgceLoc(blob, 0, opts); // TODO: or RgceLocRel
  19402. return [type, ixti, loc];
  19403. }
  19404. /* [MS-XLS] 2.5.198.62 ; [MS-XLSB] 2.5.97.45 TODO */
  19405. function parse_PtgFunc(blob, length, opts) {
  19406. //var ptg = blob[blob.l] & 0x1F;
  19407. var type = (blob[blob.l] & 0x60)>>5;
  19408. blob.l += 1;
  19409. var iftab = blob.read_shift(opts && opts.biff <= 3 ? 1 : 2);
  19410. return [FtabArgc[iftab], Ftab[iftab], type];
  19411. }
  19412. /* [MS-XLS] 2.5.198.63 ; [MS-XLSB] 2.5.97.46 TODO */
  19413. function parse_PtgFuncVar(blob, length, opts) {
  19414. var type = blob[blob.l++];
  19415. var cparams = blob.read_shift(1), tab = opts && opts.biff <= 3 ? [(type == 0x58 ? -1 : 0), blob.read_shift(1)]: parsetab(blob);
  19416. return [cparams, (tab[0] === 0 ? Ftab : Cetab)[tab[1]]];
  19417. }
  19418. function parsetab(blob) {
  19419. return [blob[blob.l+1]>>7, blob.read_shift(2) & 0x7FFF];
  19420. }
  19421. /* [MS-XLS] 2.5.198.41 ; [MS-XLSB] 2.5.97.33 */
  19422. function parse_PtgAttrSum(blob, length, opts) {
  19423. blob.l += opts && opts.biff == 2 ? 3 : 4; return;
  19424. }
  19425. /* [MS-XLS] 2.5.198.58 ; [MS-XLSB] 2.5.97.40 */
  19426. function parse_PtgExp(blob, length, opts) {
  19427. blob.l++;
  19428. if(opts && opts.biff == 12) return [blob.read_shift(4, 'i'), 0];
  19429. var row = blob.read_shift(2);
  19430. var col = blob.read_shift(opts && opts.biff == 2 ? 1 : 2);
  19431. return [row, col];
  19432. }
  19433. /* [MS-XLS] 2.5.198.57 ; [MS-XLSB] 2.5.97.39 */
  19434. function parse_PtgErr(blob) { blob.l++; return BErr[blob.read_shift(1)]; }
  19435. /* [MS-XLS] 2.5.198.66 ; [MS-XLSB] 2.5.97.49 */
  19436. function parse_PtgInt(blob) { blob.l++; return blob.read_shift(2); }
  19437. /* [MS-XLS] 2.5.198.42 ; [MS-XLSB] 2.5.97.34 */
  19438. function parse_PtgBool(blob) { blob.l++; return blob.read_shift(1)!==0;}
  19439. /* [MS-XLS] 2.5.198.79 ; [MS-XLSB] 2.5.97.63 */
  19440. function parse_PtgNum(blob) { blob.l++; return parse_Xnum(blob, 8); }
  19441. /* [MS-XLS] 2.5.198.89 ; [MS-XLSB] 2.5.97.74 */
  19442. function parse_PtgStr(blob, length, opts) { blob.l++; return parse_ShortXLUnicodeString(blob, length-1, opts); }
  19443. /* [MS-XLS] 2.5.192.112 + 2.5.192.11{3,4,5,6,7} */
  19444. /* [MS-XLSB] 2.5.97.93 + 2.5.97.9{4,5,6,7} */
  19445. function parse_SerAr(blob, biff) {
  19446. var val = [blob.read_shift(1)];
  19447. if(biff == 12) switch(val[0]) {
  19448. case 0x02: val[0] = 0x04; break; /* SerBool */
  19449. case 0x04: val[0] = 0x10; break; /* SerErr */
  19450. case 0x00: val[0] = 0x01; break; /* SerNum */
  19451. case 0x01: val[0] = 0x02; break; /* SerStr */
  19452. }
  19453. switch(val[0]) {
  19454. case 0x04: /* SerBool -- boolean */
  19455. val[1] = parsebool(blob, 1) ? 'TRUE' : 'FALSE';
  19456. if(biff != 12) blob.l += 7; break;
  19457. case 0x25: /* appears to be an alias */
  19458. case 0x10: /* SerErr -- error */
  19459. val[1] = BErr[blob[blob.l]];
  19460. blob.l += ((biff == 12) ? 4 : 8); break;
  19461. case 0x00: /* SerNil -- honestly, I'm not sure how to reproduce this */
  19462. blob.l += 8; break;
  19463. case 0x01: /* SerNum -- Xnum */
  19464. val[1] = parse_Xnum(blob, 8); break;
  19465. case 0x02: /* SerStr -- XLUnicodeString (<256 chars) */
  19466. val[1] = parse_XLUnicodeString2(blob, 0, {biff:biff > 0 && biff < 8 ? 2 : biff}); break;
  19467. default: throw new Error("Bad SerAr: " + val[0]); /* Unreachable */
  19468. }
  19469. return val;
  19470. }
  19471. /* [MS-XLS] 2.5.198.61 ; [MS-XLSB] 2.5.97.44 */
  19472. function parse_PtgExtraMem(blob, cce, opts) {
  19473. var count = blob.read_shift((opts.biff == 12) ? 4 : 2);
  19474. var out = [];
  19475. for(var i = 0; i != count; ++i) out.push(((opts.biff == 12) ? parse_UncheckedRfX : parse_Ref8U)(blob, 8));
  19476. return out;
  19477. }
  19478. /* [MS-XLS] 2.5.198.59 ; [MS-XLSB] 2.5.97.41 */
  19479. function parse_PtgExtraArray(blob, length, opts) {
  19480. var rows = 0, cols = 0;
  19481. if(opts.biff == 12) {
  19482. rows = blob.read_shift(4); // DRw
  19483. cols = blob.read_shift(4); // DCol
  19484. } else {
  19485. cols = 1 + blob.read_shift(1); //DColByteU
  19486. rows = 1 + blob.read_shift(2); //DRw
  19487. }
  19488. if(opts.biff >= 2 && opts.biff < 8) { --rows; if(--cols == 0) cols = 0x100; }
  19489. // $FlowIgnore
  19490. for(var i = 0, o = []; i != rows && (o[i] = []); ++i)
  19491. for(var j = 0; j != cols; ++j) o[i][j] = parse_SerAr(blob, opts.biff);
  19492. return o;
  19493. }
  19494. /* [MS-XLS] 2.5.198.76 ; [MS-XLSB] 2.5.97.60 */
  19495. function parse_PtgName(blob, length, opts) {
  19496. var type = (blob.read_shift(1) >>> 5) & 0x03;
  19497. var w = (!opts || (opts.biff >= 8)) ? 4 : 2;
  19498. var nameindex = blob.read_shift(w);
  19499. switch(opts.biff) {
  19500. case 2: blob.l += 5; break;
  19501. case 3: case 4: blob.l += 8; break;
  19502. case 5: blob.l += 12; break;
  19503. }
  19504. return [type, 0, nameindex];
  19505. }
  19506. /* [MS-XLS] 2.5.198.77 ; [MS-XLSB] 2.5.97.61 */
  19507. function parse_PtgNameX(blob, length, opts) {
  19508. if(opts.biff == 5) return parse_PtgNameX_BIFF5(blob, length, opts);
  19509. var type = (blob.read_shift(1) >>> 5) & 0x03;
  19510. var ixti = blob.read_shift(2); // XtiIndex
  19511. var nameindex = blob.read_shift(4);
  19512. return [type, ixti, nameindex];
  19513. }
  19514. function parse_PtgNameX_BIFF5(blob) {
  19515. var type = (blob.read_shift(1) >>> 5) & 0x03;
  19516. var ixti = blob.read_shift(2, 'i'); // XtiIndex
  19517. blob.l += 8;
  19518. var nameindex = blob.read_shift(2);
  19519. blob.l += 12;
  19520. return [type, ixti, nameindex];
  19521. }
  19522. /* [MS-XLS] 2.5.198.70 ; [MS-XLSB] 2.5.97.54 */
  19523. function parse_PtgMemArea(blob, length, opts) {
  19524. var type = (blob.read_shift(1) >>> 5) & 0x03;
  19525. blob.l += (opts && opts.biff == 2 ? 3 : 4);
  19526. var cce = blob.read_shift(opts && opts.biff == 2 ? 1 : 2);
  19527. return [type, cce];
  19528. }
  19529. /* [MS-XLS] 2.5.198.72 ; [MS-XLSB] 2.5.97.56 */
  19530. function parse_PtgMemFunc(blob, length, opts) {
  19531. var type = (blob.read_shift(1) >>> 5) & 0x03;
  19532. var cce = blob.read_shift(opts && opts.biff == 2 ? 1 : 2);
  19533. return [type, cce];
  19534. }
  19535. /* [MS-XLS] 2.5.198.86 ; [MS-XLSB] 2.5.97.69 */
  19536. function parse_PtgRefErr(blob, length, opts) {
  19537. var type = (blob.read_shift(1) >>> 5) & 0x03;
  19538. blob.l += 4;
  19539. if(opts.biff < 8) blob.l--;
  19540. if(opts.biff == 12) blob.l += 2;
  19541. return [type];
  19542. }
  19543. /* [MS-XLS] 2.5.198.87 ; [MS-XLSB] 2.5.97.71 */
  19544. function parse_PtgRefErr3d(blob, length, opts) {
  19545. var type = (blob[blob.l++] & 0x60) >> 5;
  19546. var ixti = blob.read_shift(2);
  19547. var w = 4;
  19548. if(opts) switch(opts.biff) {
  19549. case 5: w = 15; break;
  19550. case 12: w = 6; break;
  19551. }
  19552. blob.l += w;
  19553. return [type, ixti];
  19554. }
  19555. /* [MS-XLS] 2.5.198.71 ; [MS-XLSB] 2.5.97.55 */
  19556. var parse_PtgMemErr = parsenoop;
  19557. /* [MS-XLS] 2.5.198.73 ; [MS-XLSB] 2.5.97.57 */
  19558. var parse_PtgMemNoMem = parsenoop;
  19559. /* [MS-XLS] 2.5.198.92 */
  19560. var parse_PtgTbl = parsenoop;
  19561. function parse_PtgElfLoc(blob, length, opts) {
  19562. blob.l += 2;
  19563. return [parse_RgceElfLoc(blob, 4, opts)];
  19564. }
  19565. function parse_PtgElfNoop(blob) {
  19566. blob.l += 6;
  19567. return [];
  19568. }
  19569. /* [MS-XLS] 2.5.198.46 */
  19570. var parse_PtgElfCol = parse_PtgElfLoc;
  19571. /* [MS-XLS] 2.5.198.47 */
  19572. var parse_PtgElfColS = parse_PtgElfNoop;
  19573. /* [MS-XLS] 2.5.198.48 */
  19574. var parse_PtgElfColSV = parse_PtgElfNoop;
  19575. /* [MS-XLS] 2.5.198.49 */
  19576. var parse_PtgElfColV = parse_PtgElfLoc;
  19577. /* [MS-XLS] 2.5.198.50 */
  19578. function parse_PtgElfLel(blob) {
  19579. blob.l += 2;
  19580. return [parseuint16(blob), blob.read_shift(2) & 0x01];
  19581. }
  19582. /* [MS-XLS] 2.5.198.51 */
  19583. var parse_PtgElfRadical = parse_PtgElfLoc;
  19584. /* [MS-XLS] 2.5.198.52 */
  19585. var parse_PtgElfRadicalLel = parse_PtgElfLel;
  19586. /* [MS-XLS] 2.5.198.53 */
  19587. var parse_PtgElfRadicalS = parse_PtgElfNoop;
  19588. /* [MS-XLS] 2.5.198.54 */
  19589. var parse_PtgElfRw = parse_PtgElfLoc;
  19590. /* [MS-XLS] 2.5.198.55 */
  19591. var parse_PtgElfRwV = parse_PtgElfLoc;
  19592. /* [MS-XLSB] 2.5.97.52 TODO */
  19593. var PtgListRT = [
  19594. "Data",
  19595. "All",
  19596. "Headers",
  19597. "??",
  19598. "?Data2",
  19599. "??",
  19600. "?DataHeaders",
  19601. "??",
  19602. "Totals",
  19603. "??",
  19604. "??",
  19605. "??",
  19606. "?DataTotals",
  19607. "??",
  19608. "??",
  19609. "??",
  19610. "?Current"
  19611. ];
  19612. function parse_PtgList(blob) {
  19613. blob.l += 2;
  19614. var ixti = blob.read_shift(2);
  19615. var flags = blob.read_shift(2);
  19616. var idx = blob.read_shift(4);
  19617. var c = blob.read_shift(2);
  19618. var C = blob.read_shift(2);
  19619. var rt = PtgListRT[(flags >> 2) & 0x1F];
  19620. return {ixti: ixti, coltype:(flags&0x3), rt:rt, idx:idx, c:c, C:C};
  19621. }
  19622. /* [MS-XLS] 2.5.198.91 ; [MS-XLSB] 2.5.97.76 */
  19623. function parse_PtgSxName(blob) {
  19624. blob.l += 2;
  19625. return [blob.read_shift(4)];
  19626. }
  19627. /* [XLS] old spec */
  19628. function parse_PtgSheet(blob, length, opts) {
  19629. blob.l += 5;
  19630. blob.l += 2;
  19631. blob.l += (opts.biff == 2 ? 1 : 4);
  19632. return ["PTGSHEET"];
  19633. }
  19634. function parse_PtgEndSheet(blob, length, opts) {
  19635. blob.l += (opts.biff == 2 ? 4 : 5);
  19636. return ["PTGENDSHEET"];
  19637. }
  19638. function parse_PtgMemAreaN(blob) {
  19639. var type = (blob.read_shift(1) >>> 5) & 0x03;
  19640. var cce = blob.read_shift(2);
  19641. return [type, cce];
  19642. }
  19643. function parse_PtgMemNoMemN(blob) {
  19644. var type = (blob.read_shift(1) >>> 5) & 0x03;
  19645. var cce = blob.read_shift(2);
  19646. return [type, cce];
  19647. }
  19648. function parse_PtgAttrNoop(blob) {
  19649. blob.l += 4;
  19650. return [0, 0];
  19651. }
  19652. /* [MS-XLS] 2.5.198.25 ; [MS-XLSB] 2.5.97.16 */
  19653. var PtgTypes = {
  19654. 0x01: { n:'PtgExp', f:parse_PtgExp },
  19655. 0x02: { n:'PtgTbl', f:parse_PtgTbl },
  19656. 0x03: { n:'PtgAdd', f:parseread1 },
  19657. 0x04: { n:'PtgSub', f:parseread1 },
  19658. 0x05: { n:'PtgMul', f:parseread1 },
  19659. 0x06: { n:'PtgDiv', f:parseread1 },
  19660. 0x07: { n:'PtgPower', f:parseread1 },
  19661. 0x08: { n:'PtgConcat', f:parseread1 },
  19662. 0x09: { n:'PtgLt', f:parseread1 },
  19663. 0x0A: { n:'PtgLe', f:parseread1 },
  19664. 0x0B: { n:'PtgEq', f:parseread1 },
  19665. 0x0C: { n:'PtgGe', f:parseread1 },
  19666. 0x0D: { n:'PtgGt', f:parseread1 },
  19667. 0x0E: { n:'PtgNe', f:parseread1 },
  19668. 0x0F: { n:'PtgIsect', f:parseread1 },
  19669. 0x10: { n:'PtgUnion', f:parseread1 },
  19670. 0x11: { n:'PtgRange', f:parseread1 },
  19671. 0x12: { n:'PtgUplus', f:parseread1 },
  19672. 0x13: { n:'PtgUminus', f:parseread1 },
  19673. 0x14: { n:'PtgPercent', f:parseread1 },
  19674. 0x15: { n:'PtgParen', f:parseread1 },
  19675. 0x16: { n:'PtgMissArg', f:parseread1 },
  19676. 0x17: { n:'PtgStr', f:parse_PtgStr },
  19677. 0x1A: { n:'PtgSheet', f:parse_PtgSheet },
  19678. 0x1B: { n:'PtgEndSheet', f:parse_PtgEndSheet },
  19679. 0x1C: { n:'PtgErr', f:parse_PtgErr },
  19680. 0x1D: { n:'PtgBool', f:parse_PtgBool },
  19681. 0x1E: { n:'PtgInt', f:parse_PtgInt },
  19682. 0x1F: { n:'PtgNum', f:parse_PtgNum },
  19683. 0x20: { n:'PtgArray', f:parse_PtgArray },
  19684. 0x21: { n:'PtgFunc', f:parse_PtgFunc },
  19685. 0x22: { n:'PtgFuncVar', f:parse_PtgFuncVar },
  19686. 0x23: { n:'PtgName', f:parse_PtgName },
  19687. 0x24: { n:'PtgRef', f:parse_PtgRef },
  19688. 0x25: { n:'PtgArea', f:parse_PtgArea },
  19689. 0x26: { n:'PtgMemArea', f:parse_PtgMemArea },
  19690. 0x27: { n:'PtgMemErr', f:parse_PtgMemErr },
  19691. 0x28: { n:'PtgMemNoMem', f:parse_PtgMemNoMem },
  19692. 0x29: { n:'PtgMemFunc', f:parse_PtgMemFunc },
  19693. 0x2A: { n:'PtgRefErr', f:parse_PtgRefErr },
  19694. 0x2B: { n:'PtgAreaErr', f:parse_PtgAreaErr },
  19695. 0x2C: { n:'PtgRefN', f:parse_PtgRefN },
  19696. 0x2D: { n:'PtgAreaN', f:parse_PtgAreaN },
  19697. 0x2E: { n:'PtgMemAreaN', f:parse_PtgMemAreaN },
  19698. 0x2F: { n:'PtgMemNoMemN', f:parse_PtgMemNoMemN },
  19699. 0x39: { n:'PtgNameX', f:parse_PtgNameX },
  19700. 0x3A: { n:'PtgRef3d', f:parse_PtgRef3d },
  19701. 0x3B: { n:'PtgArea3d', f:parse_PtgArea3d },
  19702. 0x3C: { n:'PtgRefErr3d', f:parse_PtgRefErr3d },
  19703. 0x3D: { n:'PtgAreaErr3d', f:parse_PtgAreaErr3d },
  19704. 0xFF: {}
  19705. };
  19706. /* These are duplicated in the PtgTypes table */
  19707. var PtgDupes = {
  19708. 0x40: 0x20, 0x60: 0x20,
  19709. 0x41: 0x21, 0x61: 0x21,
  19710. 0x42: 0x22, 0x62: 0x22,
  19711. 0x43: 0x23, 0x63: 0x23,
  19712. 0x44: 0x24, 0x64: 0x24,
  19713. 0x45: 0x25, 0x65: 0x25,
  19714. 0x46: 0x26, 0x66: 0x26,
  19715. 0x47: 0x27, 0x67: 0x27,
  19716. 0x48: 0x28, 0x68: 0x28,
  19717. 0x49: 0x29, 0x69: 0x29,
  19718. 0x4A: 0x2A, 0x6A: 0x2A,
  19719. 0x4B: 0x2B, 0x6B: 0x2B,
  19720. 0x4C: 0x2C, 0x6C: 0x2C,
  19721. 0x4D: 0x2D, 0x6D: 0x2D,
  19722. 0x4E: 0x2E, 0x6E: 0x2E,
  19723. 0x4F: 0x2F, 0x6F: 0x2F,
  19724. 0x58: 0x22, 0x78: 0x22,
  19725. 0x59: 0x39, 0x79: 0x39,
  19726. 0x5A: 0x3A, 0x7A: 0x3A,
  19727. 0x5B: 0x3B, 0x7B: 0x3B,
  19728. 0x5C: 0x3C, 0x7C: 0x3C,
  19729. 0x5D: 0x3D, 0x7D: 0x3D
  19730. };
  19731. (function(){for(var y in PtgDupes) PtgTypes[y] = PtgTypes[PtgDupes[y]];})();
  19732. var Ptg18 = {
  19733. 0x01: { n:'PtgElfLel', f:parse_PtgElfLel },
  19734. 0x02: { n:'PtgElfRw', f:parse_PtgElfRw },
  19735. 0x03: { n:'PtgElfCol', f:parse_PtgElfCol },
  19736. 0x06: { n:'PtgElfRwV', f:parse_PtgElfRwV },
  19737. 0x07: { n:'PtgElfColV', f:parse_PtgElfColV },
  19738. 0x0A: { n:'PtgElfRadical', f:parse_PtgElfRadical },
  19739. 0x0B: { n:'PtgElfRadicalS', f:parse_PtgElfRadicalS },
  19740. 0x0D: { n:'PtgElfColS', f:parse_PtgElfColS },
  19741. 0x0F: { n:'PtgElfColSV', f:parse_PtgElfColSV },
  19742. 0x10: { n:'PtgElfRadicalLel', f:parse_PtgElfRadicalLel },
  19743. 0x19: { n:'PtgList', f:parse_PtgList },
  19744. 0x1D: { n:'PtgSxName', f:parse_PtgSxName },
  19745. 0xFF: {}
  19746. };
  19747. var Ptg19 = {
  19748. 0x00: { n:'PtgAttrNoop', f:parse_PtgAttrNoop },
  19749. 0x01: { n:'PtgAttrSemi', f:parse_PtgAttrSemi },
  19750. 0x02: { n:'PtgAttrIf', f:parse_PtgAttrIf },
  19751. 0x04: { n:'PtgAttrChoose', f:parse_PtgAttrChoose },
  19752. 0x08: { n:'PtgAttrGoto', f:parse_PtgAttrGoto },
  19753. 0x10: { n:'PtgAttrSum', f:parse_PtgAttrSum },
  19754. 0x20: { n:'PtgAttrBaxcel', f:parse_PtgAttrBaxcel },
  19755. 0x40: { n:'PtgAttrSpace', f:parse_PtgAttrSpace },
  19756. 0x41: { n:'PtgAttrSpaceSemi', f:parse_PtgAttrSpaceSemi },
  19757. 0x80: { n:'PtgAttrIfError', f:parse_PtgAttrIfError },
  19758. 0xFF: {}
  19759. };
  19760. Ptg19[0x21] = Ptg19[0x20];
  19761. /* [MS-XLS] 2.5.198.103 ; [MS-XLSB] 2.5.97.87 */
  19762. function parse_RgbExtra(blob, length, rgce, opts) {
  19763. if(opts.biff < 8) return parsenoop(blob, length);
  19764. var target = blob.l + length;
  19765. var o = [];
  19766. for(var i = 0; i !== rgce.length; ++i) {
  19767. switch(rgce[i][0]) {
  19768. case 'PtgArray': /* PtgArray -> PtgExtraArray */
  19769. rgce[i][1] = parse_PtgExtraArray(blob, 0, opts);
  19770. o.push(rgce[i][1]);
  19771. break;
  19772. case 'PtgMemArea': /* PtgMemArea -> PtgExtraMem */
  19773. rgce[i][2] = parse_PtgExtraMem(blob, rgce[i][1], opts);
  19774. o.push(rgce[i][2]);
  19775. break;
  19776. case 'PtgExp': /* PtgExp -> PtgExtraCol */
  19777. if(opts && opts.biff == 12) {
  19778. rgce[i][1][1] = blob.read_shift(4);
  19779. o.push(rgce[i][1]);
  19780. } break;
  19781. case 'PtgList': /* TODO: PtgList -> PtgExtraList */
  19782. case 'PtgElfRadicalS': /* TODO: PtgElfRadicalS -> PtgExtraElf */
  19783. case 'PtgElfColS': /* TODO: PtgElfColS -> PtgExtraElf */
  19784. case 'PtgElfColSV': /* TODO: PtgElfColSV -> PtgExtraElf */
  19785. throw "Unsupported " + rgce[i][0];
  19786. default: break;
  19787. }
  19788. }
  19789. length = target - blob.l;
  19790. /* note: this is technically an error but Excel disregards */
  19791. //if(target !== blob.l && blob.l !== target - length) throw new Error(target + " != " + blob.l);
  19792. if(length !== 0) o.push(parsenoop(blob, length));
  19793. return o;
  19794. }
  19795. /* [MS-XLS] 2.5.198.104 ; [MS-XLSB] 2.5.97.88 */
  19796. function parse_Rgce(blob, length, opts) {
  19797. var target = blob.l + length;
  19798. var R, id, ptgs = [];
  19799. while(target != blob.l) {
  19800. length = target - blob.l;
  19801. id = blob[blob.l];
  19802. R = PtgTypes[id];
  19803. if(id === 0x18 || id === 0x19) R = (id === 0x18 ? Ptg18 : Ptg19)[blob[blob.l + 1]];
  19804. if(!R || !R.f) { /*ptgs.push*/(parsenoop(blob, length)); }
  19805. else { ptgs.push([R.n, R.f(blob, length, opts)]); }
  19806. }
  19807. return ptgs;
  19808. }
  19809. function stringify_array(f) {
  19810. var o = [];
  19811. for(var i = 0; i < f.length; ++i) {
  19812. var x = f[i], r = [];
  19813. for(var j = 0; j < x.length; ++j) {
  19814. var y = x[j];
  19815. if(y) switch(y[0]) {
  19816. // TODO: handle embedded quotes
  19817. case 0x02:
  19818. r.push('"' + y[1].replace(/"/g,'""') + '"'); break;
  19819. default: r.push(y[1]);
  19820. } else r.push("");
  19821. }
  19822. o.push(r.join(","));
  19823. }
  19824. return o.join(";");
  19825. }
  19826. /* [MS-XLS] 2.2.2 ; [MS-XLSB] 2.2.2 TODO */
  19827. var PtgBinOp = {
  19828. PtgAdd: "+",
  19829. PtgConcat: "&",
  19830. PtgDiv: "/",
  19831. PtgEq: "=",
  19832. PtgGe: ">=",
  19833. PtgGt: ">",
  19834. PtgLe: "<=",
  19835. PtgLt: "<",
  19836. PtgMul: "*",
  19837. PtgNe: "<>",
  19838. PtgPower: "^",
  19839. PtgSub: "-"
  19840. };
  19841. // List of invalid characters needs to be tested further
  19842. var quoteCharacters = new RegExp(/[^\w\u4E00-\u9FFF\u3040-\u30FF]/);
  19843. function formula_quote_sheet_name(sname, opts) {
  19844. if(!sname && !(opts && opts.biff <= 5 && opts.biff >= 2)) throw new Error("empty sheet name");
  19845. if (quoteCharacters.test(sname)) return "'" + sname + "'";
  19846. return sname;
  19847. }
  19848. function get_ixti_raw(supbooks, ixti, opts) {
  19849. if(!supbooks) return "SH33TJSERR0";
  19850. if(opts.biff > 8 && (!supbooks.XTI || !supbooks.XTI[ixti])) return supbooks.SheetNames[ixti];
  19851. if(!supbooks.XTI) return "SH33TJSERR6";
  19852. var XTI = supbooks.XTI[ixti];
  19853. if(opts.biff < 8) {
  19854. if(ixti > 10000) ixti-= 65536;
  19855. if(ixti < 0) ixti = -ixti;
  19856. return ixti == 0 ? "" : supbooks.XTI[ixti - 1];
  19857. }
  19858. if(!XTI) return "SH33TJSERR1";
  19859. var o = "";
  19860. if(opts.biff > 8) switch(supbooks[XTI[0]][0]) {
  19861. case 0x0165: /* 'BrtSupSelf' */
  19862. o = XTI[1] == -1 ? "#REF" : supbooks.SheetNames[XTI[1]];
  19863. return XTI[1] == XTI[2] ? o : o + ":" + supbooks.SheetNames[XTI[2]];
  19864. case 0x0166: /* 'BrtSupSame' */
  19865. if(opts.SID != null) return supbooks.SheetNames[opts.SID];
  19866. return "SH33TJSSAME" + supbooks[XTI[0]][0];
  19867. case 0x0163: /* 'BrtSupBookSrc' */
  19868. /* falls through */
  19869. default: return "SH33TJSSRC" + supbooks[XTI[0]][0];
  19870. }
  19871. switch(supbooks[XTI[0]][0][0]) {
  19872. case 0x0401:
  19873. o = XTI[1] == -1 ? "#REF" : (supbooks.SheetNames[XTI[1]] || "SH33TJSERR3");
  19874. return XTI[1] == XTI[2] ? o : o + ":" + supbooks.SheetNames[XTI[2]];
  19875. case 0x3A01: return supbooks[XTI[0]].slice(1).map(function(name) { return name.Name; }).join(";;"); //return "SH33TJSERR8";
  19876. default:
  19877. if(!supbooks[XTI[0]][0][3]) return "SH33TJSERR2";
  19878. o = XTI[1] == -1 ? "#REF" : (supbooks[XTI[0]][0][3][XTI[1]] || "SH33TJSERR4");
  19879. return XTI[1] == XTI[2] ? o : o + ":" + supbooks[XTI[0]][0][3][XTI[2]];
  19880. }
  19881. }
  19882. function get_ixti(supbooks, ixti, opts) {
  19883. return formula_quote_sheet_name(get_ixti_raw(supbooks, ixti, opts), opts);
  19884. }
  19885. function stringify_formula(formula/*Array<any>*/, range, cell, supbooks, opts) {
  19886. var biff = (opts && opts.biff) || 8;
  19887. var _range = /*range != null ? range :*/ {s:{c:0, r:0},e:{c:0, r:0}};
  19888. var stack = [], e1, e2, c, ixti=0, nameidx=0, r, sname="";
  19889. if(!formula[0] || !formula[0][0]) return "";
  19890. var last_sp = -1, sp = "";
  19891. for(var ff = 0, fflen = formula[0].length; ff < fflen; ++ff) {
  19892. var f = formula[0][ff];
  19893. switch(f[0]) {
  19894. case 'PtgUminus': /* [MS-XLS] 2.5.198.93 */
  19895. stack.push("-" + stack.pop()); break;
  19896. case 'PtgUplus': /* [MS-XLS] 2.5.198.95 */
  19897. stack.push("+" + stack.pop()); break;
  19898. case 'PtgPercent': /* [MS-XLS] 2.5.198.81 */
  19899. stack.push(stack.pop() + "%"); break;
  19900. case 'PtgAdd': /* [MS-XLS] 2.5.198.26 */
  19901. case 'PtgConcat': /* [MS-XLS] 2.5.198.43 */
  19902. case 'PtgDiv': /* [MS-XLS] 2.5.198.45 */
  19903. case 'PtgEq': /* [MS-XLS] 2.5.198.56 */
  19904. case 'PtgGe': /* [MS-XLS] 2.5.198.64 */
  19905. case 'PtgGt': /* [MS-XLS] 2.5.198.65 */
  19906. case 'PtgLe': /* [MS-XLS] 2.5.198.68 */
  19907. case 'PtgLt': /* [MS-XLS] 2.5.198.69 */
  19908. case 'PtgMul': /* [MS-XLS] 2.5.198.75 */
  19909. case 'PtgNe': /* [MS-XLS] 2.5.198.78 */
  19910. case 'PtgPower': /* [MS-XLS] 2.5.198.82 */
  19911. case 'PtgSub': /* [MS-XLS] 2.5.198.90 */
  19912. e1 = stack.pop(); e2 = stack.pop();
  19913. if(last_sp >= 0) {
  19914. switch(formula[0][last_sp][1][0]) {
  19915. case 0:
  19916. // $FlowIgnore
  19917. sp = fill(" ", formula[0][last_sp][1][1]); break;
  19918. case 1:
  19919. // $FlowIgnore
  19920. sp = fill("\r", formula[0][last_sp][1][1]); break;
  19921. default:
  19922. sp = "";
  19923. // $FlowIgnore
  19924. if(opts.WTF) throw new Error("Unexpected PtgAttrSpaceType " + formula[0][last_sp][1][0]);
  19925. }
  19926. e2 = e2 + sp;
  19927. last_sp = -1;
  19928. }
  19929. stack.push(e2+PtgBinOp[f[0]]+e1);
  19930. break;
  19931. case 'PtgIsect': /* [MS-XLS] 2.5.198.67 */
  19932. e1 = stack.pop(); e2 = stack.pop();
  19933. stack.push(e2+" "+e1);
  19934. break;
  19935. case 'PtgUnion': /* [MS-XLS] 2.5.198.94 */
  19936. e1 = stack.pop(); e2 = stack.pop();
  19937. stack.push(e2+","+e1);
  19938. break;
  19939. case 'PtgRange': /* [MS-XLS] 2.5.198.83 */
  19940. e1 = stack.pop(); e2 = stack.pop();
  19941. stack.push(e2+":"+e1);
  19942. break;
  19943. case 'PtgAttrChoose': /* [MS-XLS] 2.5.198.34 */
  19944. break;
  19945. case 'PtgAttrGoto': /* [MS-XLS] 2.5.198.35 */
  19946. break;
  19947. case 'PtgAttrIf': /* [MS-XLS] 2.5.198.36 */
  19948. break;
  19949. case 'PtgAttrIfError': /* [MS-XLSB] 2.5.97.28 */
  19950. break;
  19951. case 'PtgRef': /* [MS-XLS] 2.5.198.84 */
  19952. c = shift_cell_xls((f[1][1]), _range, opts);
  19953. stack.push(encode_cell_xls(c, biff));
  19954. break;
  19955. case 'PtgRefN': /* [MS-XLS] 2.5.198.88 */
  19956. c = cell ? shift_cell_xls((f[1][1]), cell, opts) : (f[1][1]);
  19957. stack.push(encode_cell_xls(c, biff));
  19958. break;
  19959. case 'PtgRef3d': /* [MS-XLS] 2.5.198.85 */
  19960. ixti = f[1][1]; c = shift_cell_xls((f[1][2]), _range, opts);
  19961. sname = get_ixti(supbooks, ixti, opts);
  19962. var w = sname; /* IE9 fails on defined names */ // eslint-disable-line no-unused-vars
  19963. stack.push(sname + "!" + encode_cell_xls(c, biff));
  19964. break;
  19965. case 'PtgFunc': /* [MS-XLS] 2.5.198.62 */
  19966. case 'PtgFuncVar': /* [MS-XLS] 2.5.198.63 */
  19967. /* f[1] = [argc, func, type] */
  19968. var argc = (f[1][0]), func = (f[1][1]);
  19969. if(!argc) argc = 0;
  19970. argc &= 0x7F;
  19971. var args = argc == 0 ? [] : stack.slice(-argc);
  19972. stack.length -= argc;
  19973. if(func === 'User') func = args.shift();
  19974. stack.push(func + "(" + args.join(",") + ")");
  19975. break;
  19976. case 'PtgBool': /* [MS-XLS] 2.5.198.42 */
  19977. stack.push(f[1] ? "TRUE" : "FALSE"); break;
  19978. case 'PtgInt': /* [MS-XLS] 2.5.198.66 */
  19979. stack.push(f[1]); break;
  19980. case 'PtgNum': /* [MS-XLS] 2.5.198.79 TODO: precision? */
  19981. stack.push(String(f[1])); break;
  19982. case 'PtgStr': /* [MS-XLS] 2.5.198.89 */
  19983. // $FlowIgnore
  19984. stack.push('"' + f[1].replace(/"/g, '""') + '"'); break;
  19985. case 'PtgErr': /* [MS-XLS] 2.5.198.57 */
  19986. stack.push(f[1]); break;
  19987. case 'PtgAreaN': /* [MS-XLS] 2.5.198.31 TODO */
  19988. r = shift_range_xls(f[1][1], cell ? {s:cell} : _range, opts);
  19989. stack.push(encode_range_xls((r), opts));
  19990. break;
  19991. case 'PtgArea': /* [MS-XLS] 2.5.198.27 TODO: fixed points */
  19992. r = shift_range_xls(f[1][1], _range, opts);
  19993. stack.push(encode_range_xls((r), opts));
  19994. break;
  19995. case 'PtgArea3d': /* [MS-XLS] 2.5.198.28 TODO */
  19996. ixti = f[1][1]; r = f[1][2];
  19997. sname = get_ixti(supbooks, ixti, opts);
  19998. stack.push(sname + "!" + encode_range_xls((r), opts));
  19999. break;
  20000. case 'PtgAttrSum': /* [MS-XLS] 2.5.198.41 */
  20001. stack.push("SUM(" + stack.pop() + ")");
  20002. break;
  20003. case 'PtgAttrBaxcel': /* [MS-XLS] 2.5.198.33 */
  20004. case 'PtgAttrSemi': /* [MS-XLS] 2.5.198.37 */
  20005. break;
  20006. case 'PtgName': /* [MS-XLS] 2.5.198.76 ; [MS-XLSB] 2.5.97.60 TODO: revisions */
  20007. /* f[1] = type, 0, nameindex */
  20008. nameidx = (f[1][2]);
  20009. var lbl = (supbooks.names||[])[nameidx-1] || (supbooks[0]||[])[nameidx];
  20010. var name = lbl ? lbl.Name : "SH33TJSNAME" + String(nameidx);
  20011. if(name in XLSXFutureFunctions) name = XLSXFutureFunctions[name];
  20012. stack.push(name);
  20013. break;
  20014. case 'PtgNameX': /* [MS-XLS] 2.5.198.77 ; [MS-XLSB] 2.5.97.61 TODO: revisions */
  20015. /* f[1] = type, ixti, nameindex */
  20016. var bookidx = (f[1][1]); nameidx = (f[1][2]); var externbook;
  20017. /* TODO: Properly handle missing values -- this should be using get_ixti_raw primarily */
  20018. if(opts.biff <= 5) {
  20019. if(bookidx < 0) bookidx = -bookidx;
  20020. if(supbooks[bookidx]) externbook = supbooks[bookidx][nameidx];
  20021. } else {
  20022. var o = "";
  20023. if(((supbooks[bookidx]||[])[0]||[])[0] == 0x3A01){/* empty */}
  20024. else if(((supbooks[bookidx]||[])[0]||[])[0] == 0x0401){
  20025. if(supbooks[bookidx][nameidx] && supbooks[bookidx][nameidx].itab > 0) {
  20026. o = supbooks.SheetNames[supbooks[bookidx][nameidx].itab-1] + "!";
  20027. }
  20028. }
  20029. else o = supbooks.SheetNames[nameidx-1]+ "!";
  20030. if(supbooks[bookidx] && supbooks[bookidx][nameidx]) o += supbooks[bookidx][nameidx].Name;
  20031. else if(supbooks[0] && supbooks[0][nameidx]) o += supbooks[0][nameidx].Name;
  20032. else {
  20033. var ixtidata = get_ixti_raw(supbooks, bookidx, opts).split(";;");
  20034. if(ixtidata[nameidx - 1]) o = ixtidata[nameidx - 1]; // TODO: confirm this is correct
  20035. else o += "SH33TJSERRX";
  20036. }
  20037. stack.push(o);
  20038. break;
  20039. }
  20040. if(!externbook) externbook = {Name: "SH33TJSERRY"};
  20041. stack.push(externbook.Name);
  20042. break;
  20043. case 'PtgParen': /* [MS-XLS] 2.5.198.80 */
  20044. var lp = '(', rp = ')';
  20045. if(last_sp >= 0) {
  20046. sp = "";
  20047. switch(formula[0][last_sp][1][0]) {
  20048. // $FlowIgnore
  20049. case 2: lp = fill(" ", formula[0][last_sp][1][1]) + lp; break;
  20050. // $FlowIgnore
  20051. case 3: lp = fill("\r", formula[0][last_sp][1][1]) + lp; break;
  20052. // $FlowIgnore
  20053. case 4: rp = fill(" ", formula[0][last_sp][1][1]) + rp; break;
  20054. // $FlowIgnore
  20055. case 5: rp = fill("\r", formula[0][last_sp][1][1]) + rp; break;
  20056. default:
  20057. // $FlowIgnore
  20058. if(opts.WTF) throw new Error("Unexpected PtgAttrSpaceType " + formula[0][last_sp][1][0]);
  20059. }
  20060. last_sp = -1;
  20061. }
  20062. stack.push(lp + stack.pop() + rp); break;
  20063. case 'PtgRefErr': /* [MS-XLS] 2.5.198.86 */
  20064. stack.push('#REF!'); break;
  20065. case 'PtgRefErr3d': /* [MS-XLS] 2.5.198.87 */
  20066. stack.push('#REF!'); break;
  20067. case 'PtgExp': /* [MS-XLS] 2.5.198.58 TODO */
  20068. c = {c:(f[1][1]),r:(f[1][0])};
  20069. var q = ({c: cell.c, r:cell.r});
  20070. if(supbooks.sharedf[encode_cell(c)]) {
  20071. var parsedf = (supbooks.sharedf[encode_cell(c)]);
  20072. stack.push(stringify_formula(parsedf, _range, q, supbooks, opts));
  20073. }
  20074. else {
  20075. var fnd = false;
  20076. for(e1=0;e1!=supbooks.arrayf.length; ++e1) {
  20077. /* TODO: should be something like range_has */
  20078. e2 = supbooks.arrayf[e1];
  20079. if(c.c < e2[0].s.c || c.c > e2[0].e.c) continue;
  20080. if(c.r < e2[0].s.r || c.r > e2[0].e.r) continue;
  20081. stack.push(stringify_formula(e2[1], _range, q, supbooks, opts));
  20082. fnd = true;
  20083. break;
  20084. }
  20085. if(!fnd) stack.push(f[1]);
  20086. }
  20087. break;
  20088. case 'PtgArray': /* [MS-XLS] 2.5.198.32 TODO */
  20089. stack.push("{" + stringify_array(f[1]) + "}");
  20090. break;
  20091. case 'PtgMemArea': /* [MS-XLS] 2.5.198.70 TODO: confirm this is a non-display */
  20092. //stack.push("(" + f[2].map(encode_range).join(",") + ")");
  20093. break;
  20094. case 'PtgAttrSpace': /* [MS-XLS] 2.5.198.38 */
  20095. case 'PtgAttrSpaceSemi': /* [MS-XLS] 2.5.198.39 */
  20096. last_sp = ff;
  20097. break;
  20098. case 'PtgTbl': /* [MS-XLS] 2.5.198.92 TODO */
  20099. break;
  20100. case 'PtgMemErr': /* [MS-XLS] 2.5.198.71 */
  20101. break;
  20102. case 'PtgMissArg': /* [MS-XLS] 2.5.198.74 */
  20103. stack.push("");
  20104. break;
  20105. case 'PtgAreaErr': /* [MS-XLS] 2.5.198.29 */
  20106. stack.push("#REF!"); break;
  20107. case 'PtgAreaErr3d': /* [MS-XLS] 2.5.198.30 */
  20108. stack.push("#REF!"); break;
  20109. case 'PtgList': /* [MS-XLSB] 2.5.97.52 */
  20110. // $FlowIgnore
  20111. stack.push("Table" + f[1].idx + "[#" + f[1].rt + "]");
  20112. break;
  20113. case 'PtgMemAreaN':
  20114. case 'PtgMemNoMemN':
  20115. case 'PtgAttrNoop':
  20116. case 'PtgSheet':
  20117. case 'PtgEndSheet':
  20118. break;
  20119. case 'PtgMemFunc': /* [MS-XLS] 2.5.198.72 TODO */
  20120. break;
  20121. case 'PtgMemNoMem': /* [MS-XLS] 2.5.198.73 TODO */
  20122. break;
  20123. case 'PtgElfCol': /* [MS-XLS] 2.5.198.46 */
  20124. case 'PtgElfColS': /* [MS-XLS] 2.5.198.47 */
  20125. case 'PtgElfColSV': /* [MS-XLS] 2.5.198.48 */
  20126. case 'PtgElfColV': /* [MS-XLS] 2.5.198.49 */
  20127. case 'PtgElfLel': /* [MS-XLS] 2.5.198.50 */
  20128. case 'PtgElfRadical': /* [MS-XLS] 2.5.198.51 */
  20129. case 'PtgElfRadicalLel': /* [MS-XLS] 2.5.198.52 */
  20130. case 'PtgElfRadicalS': /* [MS-XLS] 2.5.198.53 */
  20131. case 'PtgElfRw': /* [MS-XLS] 2.5.198.54 */
  20132. case 'PtgElfRwV': /* [MS-XLS] 2.5.198.55 */
  20133. throw new Error("Unsupported ELFs");
  20134. case 'PtgSxName': /* [MS-XLS] 2.5.198.91 TODO -- find a test case */
  20135. throw new Error('Unrecognized Formula Token: ' + String(f));
  20136. default: throw new Error('Unrecognized Formula Token: ' + String(f));
  20137. }
  20138. var PtgNonDisp = ['PtgAttrSpace', 'PtgAttrSpaceSemi', 'PtgAttrGoto'];
  20139. if(opts.biff != 3) if(last_sp >= 0 && PtgNonDisp.indexOf(formula[0][ff][0]) == -1) {
  20140. f = formula[0][last_sp];
  20141. var _left = true;
  20142. switch(f[1][0]) {
  20143. /* note: some bad XLSB files omit the PtgParen */
  20144. case 4: _left = false;
  20145. /* falls through */
  20146. case 0:
  20147. // $FlowIgnore
  20148. sp = fill(" ", f[1][1]); break;
  20149. case 5: _left = false;
  20150. /* falls through */
  20151. case 1:
  20152. // $FlowIgnore
  20153. sp = fill("\r", f[1][1]); break;
  20154. default:
  20155. sp = "";
  20156. // $FlowIgnore
  20157. if(opts.WTF) throw new Error("Unexpected PtgAttrSpaceType " + f[1][0]);
  20158. }
  20159. stack.push((_left ? sp : "") + stack.pop() + (_left ? "" : sp));
  20160. last_sp = -1;
  20161. }
  20162. }
  20163. if(stack.length > 1 && opts.WTF) throw new Error("bad formula stack");
  20164. return stack[0];
  20165. }
  20166. /* [MS-XLS] 2.5.198.1 TODO */
  20167. function parse_ArrayParsedFormula(blob, length, opts) {
  20168. var target = blob.l + length, len = opts.biff == 2 ? 1 : 2;
  20169. var rgcb, cce = blob.read_shift(len); // length of rgce
  20170. if(cce == 0xFFFF) return [[],parsenoop(blob, length-2)];
  20171. var rgce = parse_Rgce(blob, cce, opts);
  20172. if(length !== cce + len) rgcb = parse_RgbExtra(blob, length - cce - len, rgce, opts);
  20173. blob.l = target;
  20174. return [rgce, rgcb];
  20175. }
  20176. /* [MS-XLS] 2.5.198.3 TODO */
  20177. function parse_XLSCellParsedFormula(blob, length, opts) {
  20178. var target = blob.l + length, len = opts.biff == 2 ? 1 : 2;
  20179. var rgcb, cce = blob.read_shift(len); // length of rgce
  20180. if(cce == 0xFFFF) return [[],parsenoop(blob, length-2)];
  20181. var rgce = parse_Rgce(blob, cce, opts);
  20182. if(length !== cce + len) rgcb = parse_RgbExtra(blob, length - cce - len, rgce, opts);
  20183. blob.l = target;
  20184. return [rgce, rgcb];
  20185. }
  20186. /* [MS-XLS] 2.5.198.21 */
  20187. function parse_NameParsedFormula(blob, length, opts, cce) {
  20188. var target = blob.l + length;
  20189. var rgce = parse_Rgce(blob, cce, opts);
  20190. var rgcb;
  20191. if(target !== blob.l) rgcb = parse_RgbExtra(blob, target - blob.l, rgce, opts);
  20192. return [rgce, rgcb];
  20193. }
  20194. /* [MS-XLS] 2.5.198.118 TODO */
  20195. function parse_SharedParsedFormula(blob, length, opts) {
  20196. var target = blob.l + length;
  20197. var rgcb, cce = blob.read_shift(2); // length of rgce
  20198. var rgce = parse_Rgce(blob, cce, opts);
  20199. if(cce == 0xFFFF) return [[],parsenoop(blob, length-2)];
  20200. if(length !== cce + 2) rgcb = parse_RgbExtra(blob, target - cce - 2, rgce, opts);
  20201. return [rgce, rgcb];
  20202. }
  20203. /* [MS-XLS] 2.5.133 TODO: how to emit empty strings? */
  20204. function parse_FormulaValue(blob) {
  20205. var b;
  20206. if(__readUInt16LE(blob,blob.l + 6) !== 0xFFFF) return [parse_Xnum(blob),'n'];
  20207. switch(blob[blob.l]) {
  20208. case 0x00: blob.l += 8; return ["String", 's'];
  20209. case 0x01: b = blob[blob.l+2] === 0x1; blob.l += 8; return [b,'b'];
  20210. case 0x02: b = blob[blob.l+2]; blob.l += 8; return [b,'e'];
  20211. case 0x03: blob.l += 8; return ["",'s'];
  20212. }
  20213. return [];
  20214. }
  20215. function write_FormulaValue(value) {
  20216. if(value == null) {
  20217. // Blank String Value
  20218. var o = new_buf(8);
  20219. o.write_shift(1, 0x03);
  20220. o.write_shift(1, 0);
  20221. o.write_shift(2, 0);
  20222. o.write_shift(2, 0);
  20223. o.write_shift(2, 0xFFFF);
  20224. return o;
  20225. } else if(typeof value == "number") return write_Xnum(value);
  20226. return write_Xnum(0);
  20227. }
  20228. /* [MS-XLS] 2.4.127 TODO */
  20229. function parse_Formula(blob, length, opts) {
  20230. var end = blob.l + length;
  20231. var cell = parse_XLSCell(blob, 6);
  20232. if(opts.biff == 2) ++blob.l;
  20233. var val = parse_FormulaValue(blob,8);
  20234. var flags = blob.read_shift(1);
  20235. if(opts.biff != 2) {
  20236. blob.read_shift(1);
  20237. if(opts.biff >= 5) {
  20238. /*var chn = */blob.read_shift(4);
  20239. }
  20240. }
  20241. var cbf = parse_XLSCellParsedFormula(blob, end - blob.l, opts);
  20242. return {cell:cell, val:val[0], formula:cbf, shared: (flags >> 3) & 1, tt:val[1]};
  20243. }
  20244. function write_Formula(cell, R, C, opts, os) {
  20245. // Cell
  20246. var o1 = write_XLSCell(R, C, os);
  20247. // FormulaValue
  20248. var o2 = write_FormulaValue(cell.v);
  20249. // flags + cache
  20250. var o3 = new_buf(6);
  20251. var flags = 0x01 | 0x20;
  20252. o3.write_shift(2, flags);
  20253. o3.write_shift(4, 0);
  20254. // CellParsedFormula
  20255. var bf = new_buf(cell.bf.length);
  20256. for(var i = 0; i < cell.bf.length; ++i) bf[i] = cell.bf[i];
  20257. var out = bconcat([o1, o2, o3, bf]);
  20258. return out;
  20259. }
  20260. /* XLSB Parsed Formula records have the same shape */
  20261. function parse_XLSBParsedFormula(data, length, opts) {
  20262. var cce = data.read_shift(4);
  20263. var rgce = parse_Rgce(data, cce, opts);
  20264. var cb = data.read_shift(4);
  20265. var rgcb = cb > 0 ? parse_RgbExtra(data, cb, rgce, opts) : null;
  20266. return [rgce, rgcb];
  20267. }
  20268. /* [MS-XLSB] 2.5.97.1 ArrayParsedFormula */
  20269. var parse_XLSBArrayParsedFormula = parse_XLSBParsedFormula;
  20270. /* [MS-XLSB] 2.5.97.4 CellParsedFormula */
  20271. var parse_XLSBCellParsedFormula = parse_XLSBParsedFormula;
  20272. /* [MS-XLSB] 2.5.97.8 DVParsedFormula */
  20273. //var parse_XLSBDVParsedFormula = parse_XLSBParsedFormula;
  20274. /* [MS-XLSB] 2.5.97.9 FRTParsedFormula */
  20275. //var parse_XLSBFRTParsedFormula = parse_XLSBParsedFormula2;
  20276. /* [MS-XLSB] 2.5.97.12 NameParsedFormula */
  20277. var parse_XLSBNameParsedFormula = parse_XLSBParsedFormula;
  20278. /* [MS-XLSB] 2.5.97.98 SharedParsedFormula */
  20279. var parse_XLSBSharedParsedFormula = parse_XLSBParsedFormula;
  20280. /* [MS-XLS] 2.5.198.4 */
  20281. var Cetab = {
  20282. 0x0000: 'BEEP',
  20283. 0x0001: 'OPEN',
  20284. 0x0002: 'OPEN.LINKS',
  20285. 0x0003: 'CLOSE.ALL',
  20286. 0x0004: 'SAVE',
  20287. 0x0005: 'SAVE.AS',
  20288. 0x0006: 'FILE.DELETE',
  20289. 0x0007: 'PAGE.SETUP',
  20290. 0x0008: 'PRINT',
  20291. 0x0009: 'PRINTER.SETUP',
  20292. 0x000A: 'QUIT',
  20293. 0x000B: 'NEW.WINDOW',
  20294. 0x000C: 'ARRANGE.ALL',
  20295. 0x000D: 'WINDOW.SIZE',
  20296. 0x000E: 'WINDOW.MOVE',
  20297. 0x000F: 'FULL',
  20298. 0x0010: 'CLOSE',
  20299. 0x0011: 'RUN',
  20300. 0x0016: 'SET.PRINT.AREA',
  20301. 0x0017: 'SET.PRINT.TITLES',
  20302. 0x0018: 'SET.PAGE.BREAK',
  20303. 0x0019: 'REMOVE.PAGE.BREAK',
  20304. 0x001A: 'FONT',
  20305. 0x001B: 'DISPLAY',
  20306. 0x001C: 'PROTECT.DOCUMENT',
  20307. 0x001D: 'PRECISION',
  20308. 0x001E: 'A1.R1C1',
  20309. 0x001F: 'CALCULATE.NOW',
  20310. 0x0020: 'CALCULATION',
  20311. 0x0022: 'DATA.FIND',
  20312. 0x0023: 'EXTRACT',
  20313. 0x0024: 'DATA.DELETE',
  20314. 0x0025: 'SET.DATABASE',
  20315. 0x0026: 'SET.CRITERIA',
  20316. 0x0027: 'SORT',
  20317. 0x0028: 'DATA.SERIES',
  20318. 0x0029: 'TABLE',
  20319. 0x002A: 'FORMAT.NUMBER',
  20320. 0x002B: 'ALIGNMENT',
  20321. 0x002C: 'STYLE',
  20322. 0x002D: 'BORDER',
  20323. 0x002E: 'CELL.PROTECTION',
  20324. 0x002F: 'COLUMN.WIDTH',
  20325. 0x0030: 'UNDO',
  20326. 0x0031: 'CUT',
  20327. 0x0032: 'COPY',
  20328. 0x0033: 'PASTE',
  20329. 0x0034: 'CLEAR',
  20330. 0x0035: 'PASTE.SPECIAL',
  20331. 0x0036: 'EDIT.DELETE',
  20332. 0x0037: 'INSERT',
  20333. 0x0038: 'FILL.RIGHT',
  20334. 0x0039: 'FILL.DOWN',
  20335. 0x003D: 'DEFINE.NAME',
  20336. 0x003E: 'CREATE.NAMES',
  20337. 0x003F: 'FORMULA.GOTO',
  20338. 0x0040: 'FORMULA.FIND',
  20339. 0x0041: 'SELECT.LAST.CELL',
  20340. 0x0042: 'SHOW.ACTIVE.CELL',
  20341. 0x0043: 'GALLERY.AREA',
  20342. 0x0044: 'GALLERY.BAR',
  20343. 0x0045: 'GALLERY.COLUMN',
  20344. 0x0046: 'GALLERY.LINE',
  20345. 0x0047: 'GALLERY.PIE',
  20346. 0x0048: 'GALLERY.SCATTER',
  20347. 0x0049: 'COMBINATION',
  20348. 0x004A: 'PREFERRED',
  20349. 0x004B: 'ADD.OVERLAY',
  20350. 0x004C: 'GRIDLINES',
  20351. 0x004D: 'SET.PREFERRED',
  20352. 0x004E: 'AXES',
  20353. 0x004F: 'LEGEND',
  20354. 0x0050: 'ATTACH.TEXT',
  20355. 0x0051: 'ADD.ARROW',
  20356. 0x0052: 'SELECT.CHART',
  20357. 0x0053: 'SELECT.PLOT.AREA',
  20358. 0x0054: 'PATTERNS',
  20359. 0x0055: 'MAIN.CHART',
  20360. 0x0056: 'OVERLAY',
  20361. 0x0057: 'SCALE',
  20362. 0x0058: 'FORMAT.LEGEND',
  20363. 0x0059: 'FORMAT.TEXT',
  20364. 0x005A: 'EDIT.REPEAT',
  20365. 0x005B: 'PARSE',
  20366. 0x005C: 'JUSTIFY',
  20367. 0x005D: 'HIDE',
  20368. 0x005E: 'UNHIDE',
  20369. 0x005F: 'WORKSPACE',
  20370. 0x0060: 'FORMULA',
  20371. 0x0061: 'FORMULA.FILL',
  20372. 0x0062: 'FORMULA.ARRAY',
  20373. 0x0063: 'DATA.FIND.NEXT',
  20374. 0x0064: 'DATA.FIND.PREV',
  20375. 0x0065: 'FORMULA.FIND.NEXT',
  20376. 0x0066: 'FORMULA.FIND.PREV',
  20377. 0x0067: 'ACTIVATE',
  20378. 0x0068: 'ACTIVATE.NEXT',
  20379. 0x0069: 'ACTIVATE.PREV',
  20380. 0x006A: 'UNLOCKED.NEXT',
  20381. 0x006B: 'UNLOCKED.PREV',
  20382. 0x006C: 'COPY.PICTURE',
  20383. 0x006D: 'SELECT',
  20384. 0x006E: 'DELETE.NAME',
  20385. 0x006F: 'DELETE.FORMAT',
  20386. 0x0070: 'VLINE',
  20387. 0x0071: 'HLINE',
  20388. 0x0072: 'VPAGE',
  20389. 0x0073: 'HPAGE',
  20390. 0x0074: 'VSCROLL',
  20391. 0x0075: 'HSCROLL',
  20392. 0x0076: 'ALERT',
  20393. 0x0077: 'NEW',
  20394. 0x0078: 'CANCEL.COPY',
  20395. 0x0079: 'SHOW.CLIPBOARD',
  20396. 0x007A: 'MESSAGE',
  20397. 0x007C: 'PASTE.LINK',
  20398. 0x007D: 'APP.ACTIVATE',
  20399. 0x007E: 'DELETE.ARROW',
  20400. 0x007F: 'ROW.HEIGHT',
  20401. 0x0080: 'FORMAT.MOVE',
  20402. 0x0081: 'FORMAT.SIZE',
  20403. 0x0082: 'FORMULA.REPLACE',
  20404. 0x0083: 'SEND.KEYS',
  20405. 0x0084: 'SELECT.SPECIAL',
  20406. 0x0085: 'APPLY.NAMES',
  20407. 0x0086: 'REPLACE.FONT',
  20408. 0x0087: 'FREEZE.PANES',
  20409. 0x0088: 'SHOW.INFO',
  20410. 0x0089: 'SPLIT',
  20411. 0x008A: 'ON.WINDOW',
  20412. 0x008B: 'ON.DATA',
  20413. 0x008C: 'DISABLE.INPUT',
  20414. 0x008E: 'OUTLINE',
  20415. 0x008F: 'LIST.NAMES',
  20416. 0x0090: 'FILE.CLOSE',
  20417. 0x0091: 'SAVE.WORKBOOK',
  20418. 0x0092: 'DATA.FORM',
  20419. 0x0093: 'COPY.CHART',
  20420. 0x0094: 'ON.TIME',
  20421. 0x0095: 'WAIT',
  20422. 0x0096: 'FORMAT.FONT',
  20423. 0x0097: 'FILL.UP',
  20424. 0x0098: 'FILL.LEFT',
  20425. 0x0099: 'DELETE.OVERLAY',
  20426. 0x009B: 'SHORT.MENUS',
  20427. 0x009F: 'SET.UPDATE.STATUS',
  20428. 0x00A1: 'COLOR.PALETTE',
  20429. 0x00A2: 'DELETE.STYLE',
  20430. 0x00A3: 'WINDOW.RESTORE',
  20431. 0x00A4: 'WINDOW.MAXIMIZE',
  20432. 0x00A6: 'CHANGE.LINK',
  20433. 0x00A7: 'CALCULATE.DOCUMENT',
  20434. 0x00A8: 'ON.KEY',
  20435. 0x00A9: 'APP.RESTORE',
  20436. 0x00AA: 'APP.MOVE',
  20437. 0x00AB: 'APP.SIZE',
  20438. 0x00AC: 'APP.MINIMIZE',
  20439. 0x00AD: 'APP.MAXIMIZE',
  20440. 0x00AE: 'BRING.TO.FRONT',
  20441. 0x00AF: 'SEND.TO.BACK',
  20442. 0x00B9: 'MAIN.CHART.TYPE',
  20443. 0x00BA: 'OVERLAY.CHART.TYPE',
  20444. 0x00BB: 'SELECT.END',
  20445. 0x00BC: 'OPEN.MAIL',
  20446. 0x00BD: 'SEND.MAIL',
  20447. 0x00BE: 'STANDARD.FONT',
  20448. 0x00BF: 'CONSOLIDATE',
  20449. 0x00C0: 'SORT.SPECIAL',
  20450. 0x00C1: 'GALLERY.3D.AREA',
  20451. 0x00C2: 'GALLERY.3D.COLUMN',
  20452. 0x00C3: 'GALLERY.3D.LINE',
  20453. 0x00C4: 'GALLERY.3D.PIE',
  20454. 0x00C5: 'VIEW.3D',
  20455. 0x00C6: 'GOAL.SEEK',
  20456. 0x00C7: 'WORKGROUP',
  20457. 0x00C8: 'FILL.GROUP',
  20458. 0x00C9: 'UPDATE.LINK',
  20459. 0x00CA: 'PROMOTE',
  20460. 0x00CB: 'DEMOTE',
  20461. 0x00CC: 'SHOW.DETAIL',
  20462. 0x00CE: 'UNGROUP',
  20463. 0x00CF: 'OBJECT.PROPERTIES',
  20464. 0x00D0: 'SAVE.NEW.OBJECT',
  20465. 0x00D1: 'SHARE',
  20466. 0x00D2: 'SHARE.NAME',
  20467. 0x00D3: 'DUPLICATE',
  20468. 0x00D4: 'APPLY.STYLE',
  20469. 0x00D5: 'ASSIGN.TO.OBJECT',
  20470. 0x00D6: 'OBJECT.PROTECTION',
  20471. 0x00D7: 'HIDE.OBJECT',
  20472. 0x00D8: 'SET.EXTRACT',
  20473. 0x00D9: 'CREATE.PUBLISHER',
  20474. 0x00DA: 'SUBSCRIBE.TO',
  20475. 0x00DB: 'ATTRIBUTES',
  20476. 0x00DC: 'SHOW.TOOLBAR',
  20477. 0x00DE: 'PRINT.PREVIEW',
  20478. 0x00DF: 'EDIT.COLOR',
  20479. 0x00E0: 'SHOW.LEVELS',
  20480. 0x00E1: 'FORMAT.MAIN',
  20481. 0x00E2: 'FORMAT.OVERLAY',
  20482. 0x00E3: 'ON.RECALC',
  20483. 0x00E4: 'EDIT.SERIES',
  20484. 0x00E5: 'DEFINE.STYLE',
  20485. 0x00F0: 'LINE.PRINT',
  20486. 0x00F3: 'ENTER.DATA',
  20487. 0x00F9: 'GALLERY.RADAR',
  20488. 0x00FA: 'MERGE.STYLES',
  20489. 0x00FB: 'EDITION.OPTIONS',
  20490. 0x00FC: 'PASTE.PICTURE',
  20491. 0x00FD: 'PASTE.PICTURE.LINK',
  20492. 0x00FE: 'SPELLING',
  20493. 0x0100: 'ZOOM',
  20494. 0x0103: 'INSERT.OBJECT',
  20495. 0x0104: 'WINDOW.MINIMIZE',
  20496. 0x0109: 'SOUND.NOTE',
  20497. 0x010A: 'SOUND.PLAY',
  20498. 0x010B: 'FORMAT.SHAPE',
  20499. 0x010C: 'EXTEND.POLYGON',
  20500. 0x010D: 'FORMAT.AUTO',
  20501. 0x0110: 'GALLERY.3D.BAR',
  20502. 0x0111: 'GALLERY.3D.SURFACE',
  20503. 0x0112: 'FILL.AUTO',
  20504. 0x0114: 'CUSTOMIZE.TOOLBAR',
  20505. 0x0115: 'ADD.TOOL',
  20506. 0x0116: 'EDIT.OBJECT',
  20507. 0x0117: 'ON.DOUBLECLICK',
  20508. 0x0118: 'ON.ENTRY',
  20509. 0x0119: 'WORKBOOK.ADD',
  20510. 0x011A: 'WORKBOOK.MOVE',
  20511. 0x011B: 'WORKBOOK.COPY',
  20512. 0x011C: 'WORKBOOK.OPTIONS',
  20513. 0x011D: 'SAVE.WORKSPACE',
  20514. 0x0120: 'CHART.WIZARD',
  20515. 0x0121: 'DELETE.TOOL',
  20516. 0x0122: 'MOVE.TOOL',
  20517. 0x0123: 'WORKBOOK.SELECT',
  20518. 0x0124: 'WORKBOOK.ACTIVATE',
  20519. 0x0125: 'ASSIGN.TO.TOOL',
  20520. 0x0127: 'COPY.TOOL',
  20521. 0x0128: 'RESET.TOOL',
  20522. 0x0129: 'CONSTRAIN.NUMERIC',
  20523. 0x012A: 'PASTE.TOOL',
  20524. 0x012E: 'WORKBOOK.NEW',
  20525. 0x0131: 'SCENARIO.CELLS',
  20526. 0x0132: 'SCENARIO.DELETE',
  20527. 0x0133: 'SCENARIO.ADD',
  20528. 0x0134: 'SCENARIO.EDIT',
  20529. 0x0135: 'SCENARIO.SHOW',
  20530. 0x0136: 'SCENARIO.SHOW.NEXT',
  20531. 0x0137: 'SCENARIO.SUMMARY',
  20532. 0x0138: 'PIVOT.TABLE.WIZARD',
  20533. 0x0139: 'PIVOT.FIELD.PROPERTIES',
  20534. 0x013A: 'PIVOT.FIELD',
  20535. 0x013B: 'PIVOT.ITEM',
  20536. 0x013C: 'PIVOT.ADD.FIELDS',
  20537. 0x013E: 'OPTIONS.CALCULATION',
  20538. 0x013F: 'OPTIONS.EDIT',
  20539. 0x0140: 'OPTIONS.VIEW',
  20540. 0x0141: 'ADDIN.MANAGER',
  20541. 0x0142: 'MENU.EDITOR',
  20542. 0x0143: 'ATTACH.TOOLBARS',
  20543. 0x0144: 'VBAActivate',
  20544. 0x0145: 'OPTIONS.CHART',
  20545. 0x0148: 'VBA.INSERT.FILE',
  20546. 0x014A: 'VBA.PROCEDURE.DEFINITION',
  20547. 0x0150: 'ROUTING.SLIP',
  20548. 0x0152: 'ROUTE.DOCUMENT',
  20549. 0x0153: 'MAIL.LOGON',
  20550. 0x0156: 'INSERT.PICTURE',
  20551. 0x0157: 'EDIT.TOOL',
  20552. 0x0158: 'GALLERY.DOUGHNUT',
  20553. 0x015E: 'CHART.TREND',
  20554. 0x0160: 'PIVOT.ITEM.PROPERTIES',
  20555. 0x0162: 'WORKBOOK.INSERT',
  20556. 0x0163: 'OPTIONS.TRANSITION',
  20557. 0x0164: 'OPTIONS.GENERAL',
  20558. 0x0172: 'FILTER.ADVANCED',
  20559. 0x0175: 'MAIL.ADD.MAILER',
  20560. 0x0176: 'MAIL.DELETE.MAILER',
  20561. 0x0177: 'MAIL.REPLY',
  20562. 0x0178: 'MAIL.REPLY.ALL',
  20563. 0x0179: 'MAIL.FORWARD',
  20564. 0x017A: 'MAIL.NEXT.LETTER',
  20565. 0x017B: 'DATA.LABEL',
  20566. 0x017C: 'INSERT.TITLE',
  20567. 0x017D: 'FONT.PROPERTIES',
  20568. 0x017E: 'MACRO.OPTIONS',
  20569. 0x017F: 'WORKBOOK.HIDE',
  20570. 0x0180: 'WORKBOOK.UNHIDE',
  20571. 0x0181: 'WORKBOOK.DELETE',
  20572. 0x0182: 'WORKBOOK.NAME',
  20573. 0x0184: 'GALLERY.CUSTOM',
  20574. 0x0186: 'ADD.CHART.AUTOFORMAT',
  20575. 0x0187: 'DELETE.CHART.AUTOFORMAT',
  20576. 0x0188: 'CHART.ADD.DATA',
  20577. 0x0189: 'AUTO.OUTLINE',
  20578. 0x018A: 'TAB.ORDER',
  20579. 0x018B: 'SHOW.DIALOG',
  20580. 0x018C: 'SELECT.ALL',
  20581. 0x018D: 'UNGROUP.SHEETS',
  20582. 0x018E: 'SUBTOTAL.CREATE',
  20583. 0x018F: 'SUBTOTAL.REMOVE',
  20584. 0x0190: 'RENAME.OBJECT',
  20585. 0x019C: 'WORKBOOK.SCROLL',
  20586. 0x019D: 'WORKBOOK.NEXT',
  20587. 0x019E: 'WORKBOOK.PREV',
  20588. 0x019F: 'WORKBOOK.TAB.SPLIT',
  20589. 0x01A0: 'FULL.SCREEN',
  20590. 0x01A1: 'WORKBOOK.PROTECT',
  20591. 0x01A4: 'SCROLLBAR.PROPERTIES',
  20592. 0x01A5: 'PIVOT.SHOW.PAGES',
  20593. 0x01A6: 'TEXT.TO.COLUMNS',
  20594. 0x01A7: 'FORMAT.CHARTTYPE',
  20595. 0x01A8: 'LINK.FORMAT',
  20596. 0x01A9: 'TRACER.DISPLAY',
  20597. 0x01AE: 'TRACER.NAVIGATE',
  20598. 0x01AF: 'TRACER.CLEAR',
  20599. 0x01B0: 'TRACER.ERROR',
  20600. 0x01B1: 'PIVOT.FIELD.GROUP',
  20601. 0x01B2: 'PIVOT.FIELD.UNGROUP',
  20602. 0x01B3: 'CHECKBOX.PROPERTIES',
  20603. 0x01B4: 'LABEL.PROPERTIES',
  20604. 0x01B5: 'LISTBOX.PROPERTIES',
  20605. 0x01B6: 'EDITBOX.PROPERTIES',
  20606. 0x01B7: 'PIVOT.REFRESH',
  20607. 0x01B8: 'LINK.COMBO',
  20608. 0x01B9: 'OPEN.TEXT',
  20609. 0x01BA: 'HIDE.DIALOG',
  20610. 0x01BB: 'SET.DIALOG.FOCUS',
  20611. 0x01BC: 'ENABLE.OBJECT',
  20612. 0x01BD: 'PUSHBUTTON.PROPERTIES',
  20613. 0x01BE: 'SET.DIALOG.DEFAULT',
  20614. 0x01BF: 'FILTER',
  20615. 0x01C0: 'FILTER.SHOW.ALL',
  20616. 0x01C1: 'CLEAR.OUTLINE',
  20617. 0x01C2: 'FUNCTION.WIZARD',
  20618. 0x01C3: 'ADD.LIST.ITEM',
  20619. 0x01C4: 'SET.LIST.ITEM',
  20620. 0x01C5: 'REMOVE.LIST.ITEM',
  20621. 0x01C6: 'SELECT.LIST.ITEM',
  20622. 0x01C7: 'SET.CONTROL.VALUE',
  20623. 0x01C8: 'SAVE.COPY.AS',
  20624. 0x01CA: 'OPTIONS.LISTS.ADD',
  20625. 0x01CB: 'OPTIONS.LISTS.DELETE',
  20626. 0x01CC: 'SERIES.AXES',
  20627. 0x01CD: 'SERIES.X',
  20628. 0x01CE: 'SERIES.Y',
  20629. 0x01CF: 'ERRORBAR.X',
  20630. 0x01D0: 'ERRORBAR.Y',
  20631. 0x01D1: 'FORMAT.CHART',
  20632. 0x01D2: 'SERIES.ORDER',
  20633. 0x01D3: 'MAIL.LOGOFF',
  20634. 0x01D4: 'CLEAR.ROUTING.SLIP',
  20635. 0x01D5: 'APP.ACTIVATE.MICROSOFT',
  20636. 0x01D6: 'MAIL.EDIT.MAILER',
  20637. 0x01D7: 'ON.SHEET',
  20638. 0x01D8: 'STANDARD.WIDTH',
  20639. 0x01D9: 'SCENARIO.MERGE',
  20640. 0x01DA: 'SUMMARY.INFO',
  20641. 0x01DB: 'FIND.FILE',
  20642. 0x01DC: 'ACTIVE.CELL.FONT',
  20643. 0x01DD: 'ENABLE.TIPWIZARD',
  20644. 0x01DE: 'VBA.MAKE.ADDIN',
  20645. 0x01E0: 'INSERTDATATABLE',
  20646. 0x01E1: 'WORKGROUP.OPTIONS',
  20647. 0x01E2: 'MAIL.SEND.MAILER',
  20648. 0x01E5: 'AUTOCORRECT',
  20649. 0x01E9: 'POST.DOCUMENT',
  20650. 0x01EB: 'PICKLIST',
  20651. 0x01ED: 'VIEW.SHOW',
  20652. 0x01EE: 'VIEW.DEFINE',
  20653. 0x01EF: 'VIEW.DELETE',
  20654. 0x01FD: 'SHEET.BACKGROUND',
  20655. 0x01FE: 'INSERT.MAP.OBJECT',
  20656. 0x01FF: 'OPTIONS.MENONO',
  20657. 0x0205: 'MSOCHECKS',
  20658. 0x0206: 'NORMAL',
  20659. 0x0207: 'LAYOUT',
  20660. 0x0208: 'RM.PRINT.AREA',
  20661. 0x0209: 'CLEAR.PRINT.AREA',
  20662. 0x020A: 'ADD.PRINT.AREA',
  20663. 0x020B: 'MOVE.BRK',
  20664. 0x0221: 'HIDECURR.NOTE',
  20665. 0x0222: 'HIDEALL.NOTES',
  20666. 0x0223: 'DELETE.NOTE',
  20667. 0x0224: 'TRAVERSE.NOTES',
  20668. 0x0225: 'ACTIVATE.NOTES',
  20669. 0x026C: 'PROTECT.REVISIONS',
  20670. 0x026D: 'UNPROTECT.REVISIONS',
  20671. 0x0287: 'OPTIONS.ME',
  20672. 0x028D: 'WEB.PUBLISH',
  20673. 0x029B: 'NEWWEBQUERY',
  20674. 0x02A1: 'PIVOT.TABLE.CHART',
  20675. 0x02F1: 'OPTIONS.SAVE',
  20676. 0x02F3: 'OPTIONS.SPELL',
  20677. 0x0328: 'HIDEALL.INKANNOTS'
  20678. };
  20679. /* [MS-XLS] 2.5.198.17 */
  20680. /* [MS-XLSB] 2.5.97.10 */
  20681. var Ftab = {
  20682. 0x0000: 'COUNT',
  20683. 0x0001: 'IF',
  20684. 0x0002: 'ISNA',
  20685. 0x0003: 'ISERROR',
  20686. 0x0004: 'SUM',
  20687. 0x0005: 'AVERAGE',
  20688. 0x0006: 'MIN',
  20689. 0x0007: 'MAX',
  20690. 0x0008: 'ROW',
  20691. 0x0009: 'COLUMN',
  20692. 0x000A: 'NA',
  20693. 0x000B: 'NPV',
  20694. 0x000C: 'STDEV',
  20695. 0x000D: 'DOLLAR',
  20696. 0x000E: 'FIXED',
  20697. 0x000F: 'SIN',
  20698. 0x0010: 'COS',
  20699. 0x0011: 'TAN',
  20700. 0x0012: 'ATAN',
  20701. 0x0013: 'PI',
  20702. 0x0014: 'SQRT',
  20703. 0x0015: 'EXP',
  20704. 0x0016: 'LN',
  20705. 0x0017: 'LOG10',
  20706. 0x0018: 'ABS',
  20707. 0x0019: 'INT',
  20708. 0x001A: 'SIGN',
  20709. 0x001B: 'ROUND',
  20710. 0x001C: 'LOOKUP',
  20711. 0x001D: 'INDEX',
  20712. 0x001E: 'REPT',
  20713. 0x001F: 'MID',
  20714. 0x0020: 'LEN',
  20715. 0x0021: 'VALUE',
  20716. 0x0022: 'TRUE',
  20717. 0x0023: 'FALSE',
  20718. 0x0024: 'AND',
  20719. 0x0025: 'OR',
  20720. 0x0026: 'NOT',
  20721. 0x0027: 'MOD',
  20722. 0x0028: 'DCOUNT',
  20723. 0x0029: 'DSUM',
  20724. 0x002A: 'DAVERAGE',
  20725. 0x002B: 'DMIN',
  20726. 0x002C: 'DMAX',
  20727. 0x002D: 'DSTDEV',
  20728. 0x002E: 'VAR',
  20729. 0x002F: 'DVAR',
  20730. 0x0030: 'TEXT',
  20731. 0x0031: 'LINEST',
  20732. 0x0032: 'TREND',
  20733. 0x0033: 'LOGEST',
  20734. 0x0034: 'GROWTH',
  20735. 0x0035: 'GOTO',
  20736. 0x0036: 'HALT',
  20737. 0x0037: 'RETURN',
  20738. 0x0038: 'PV',
  20739. 0x0039: 'FV',
  20740. 0x003A: 'NPER',
  20741. 0x003B: 'PMT',
  20742. 0x003C: 'RATE',
  20743. 0x003D: 'MIRR',
  20744. 0x003E: 'IRR',
  20745. 0x003F: 'RAND',
  20746. 0x0040: 'MATCH',
  20747. 0x0041: 'DATE',
  20748. 0x0042: 'TIME',
  20749. 0x0043: 'DAY',
  20750. 0x0044: 'MONTH',
  20751. 0x0045: 'YEAR',
  20752. 0x0046: 'WEEKDAY',
  20753. 0x0047: 'HOUR',
  20754. 0x0048: 'MINUTE',
  20755. 0x0049: 'SECOND',
  20756. 0x004A: 'NOW',
  20757. 0x004B: 'AREAS',
  20758. 0x004C: 'ROWS',
  20759. 0x004D: 'COLUMNS',
  20760. 0x004E: 'OFFSET',
  20761. 0x004F: 'ABSREF',
  20762. 0x0050: 'RELREF',
  20763. 0x0051: 'ARGUMENT',
  20764. 0x0052: 'SEARCH',
  20765. 0x0053: 'TRANSPOSE',
  20766. 0x0054: 'ERROR',
  20767. 0x0055: 'STEP',
  20768. 0x0056: 'TYPE',
  20769. 0x0057: 'ECHO',
  20770. 0x0058: 'SET.NAME',
  20771. 0x0059: 'CALLER',
  20772. 0x005A: 'DEREF',
  20773. 0x005B: 'WINDOWS',
  20774. 0x005C: 'SERIES',
  20775. 0x005D: 'DOCUMENTS',
  20776. 0x005E: 'ACTIVE.CELL',
  20777. 0x005F: 'SELECTION',
  20778. 0x0060: 'RESULT',
  20779. 0x0061: 'ATAN2',
  20780. 0x0062: 'ASIN',
  20781. 0x0063: 'ACOS',
  20782. 0x0064: 'CHOOSE',
  20783. 0x0065: 'HLOOKUP',
  20784. 0x0066: 'VLOOKUP',
  20785. 0x0067: 'LINKS',
  20786. 0x0068: 'INPUT',
  20787. 0x0069: 'ISREF',
  20788. 0x006A: 'GET.FORMULA',
  20789. 0x006B: 'GET.NAME',
  20790. 0x006C: 'SET.VALUE',
  20791. 0x006D: 'LOG',
  20792. 0x006E: 'EXEC',
  20793. 0x006F: 'CHAR',
  20794. 0x0070: 'LOWER',
  20795. 0x0071: 'UPPER',
  20796. 0x0072: 'PROPER',
  20797. 0x0073: 'LEFT',
  20798. 0x0074: 'RIGHT',
  20799. 0x0075: 'EXACT',
  20800. 0x0076: 'TRIM',
  20801. 0x0077: 'REPLACE',
  20802. 0x0078: 'SUBSTITUTE',
  20803. 0x0079: 'CODE',
  20804. 0x007A: 'NAMES',
  20805. 0x007B: 'DIRECTORY',
  20806. 0x007C: 'FIND',
  20807. 0x007D: 'CELL',
  20808. 0x007E: 'ISERR',
  20809. 0x007F: 'ISTEXT',
  20810. 0x0080: 'ISNUMBER',
  20811. 0x0081: 'ISBLANK',
  20812. 0x0082: 'T',
  20813. 0x0083: 'N',
  20814. 0x0084: 'FOPEN',
  20815. 0x0085: 'FCLOSE',
  20816. 0x0086: 'FSIZE',
  20817. 0x0087: 'FREADLN',
  20818. 0x0088: 'FREAD',
  20819. 0x0089: 'FWRITELN',
  20820. 0x008A: 'FWRITE',
  20821. 0x008B: 'FPOS',
  20822. 0x008C: 'DATEVALUE',
  20823. 0x008D: 'TIMEVALUE',
  20824. 0x008E: 'SLN',
  20825. 0x008F: 'SYD',
  20826. 0x0090: 'DDB',
  20827. 0x0091: 'GET.DEF',
  20828. 0x0092: 'REFTEXT',
  20829. 0x0093: 'TEXTREF',
  20830. 0x0094: 'INDIRECT',
  20831. 0x0095: 'REGISTER',
  20832. 0x0096: 'CALL',
  20833. 0x0097: 'ADD.BAR',
  20834. 0x0098: 'ADD.MENU',
  20835. 0x0099: 'ADD.COMMAND',
  20836. 0x009A: 'ENABLE.COMMAND',
  20837. 0x009B: 'CHECK.COMMAND',
  20838. 0x009C: 'RENAME.COMMAND',
  20839. 0x009D: 'SHOW.BAR',
  20840. 0x009E: 'DELETE.MENU',
  20841. 0x009F: 'DELETE.COMMAND',
  20842. 0x00A0: 'GET.CHART.ITEM',
  20843. 0x00A1: 'DIALOG.BOX',
  20844. 0x00A2: 'CLEAN',
  20845. 0x00A3: 'MDETERM',
  20846. 0x00A4: 'MINVERSE',
  20847. 0x00A5: 'MMULT',
  20848. 0x00A6: 'FILES',
  20849. 0x00A7: 'IPMT',
  20850. 0x00A8: 'PPMT',
  20851. 0x00A9: 'COUNTA',
  20852. 0x00AA: 'CANCEL.KEY',
  20853. 0x00AB: 'FOR',
  20854. 0x00AC: 'WHILE',
  20855. 0x00AD: 'BREAK',
  20856. 0x00AE: 'NEXT',
  20857. 0x00AF: 'INITIATE',
  20858. 0x00B0: 'REQUEST',
  20859. 0x00B1: 'POKE',
  20860. 0x00B2: 'EXECUTE',
  20861. 0x00B3: 'TERMINATE',
  20862. 0x00B4: 'RESTART',
  20863. 0x00B5: 'HELP',
  20864. 0x00B6: 'GET.BAR',
  20865. 0x00B7: 'PRODUCT',
  20866. 0x00B8: 'FACT',
  20867. 0x00B9: 'GET.CELL',
  20868. 0x00BA: 'GET.WORKSPACE',
  20869. 0x00BB: 'GET.WINDOW',
  20870. 0x00BC: 'GET.DOCUMENT',
  20871. 0x00BD: 'DPRODUCT',
  20872. 0x00BE: 'ISNONTEXT',
  20873. 0x00BF: 'GET.NOTE',
  20874. 0x00C0: 'NOTE',
  20875. 0x00C1: 'STDEVP',
  20876. 0x00C2: 'VARP',
  20877. 0x00C3: 'DSTDEVP',
  20878. 0x00C4: 'DVARP',
  20879. 0x00C5: 'TRUNC',
  20880. 0x00C6: 'ISLOGICAL',
  20881. 0x00C7: 'DCOUNTA',
  20882. 0x00C8: 'DELETE.BAR',
  20883. 0x00C9: 'UNREGISTER',
  20884. 0x00CC: 'USDOLLAR',
  20885. 0x00CD: 'FINDB',
  20886. 0x00CE: 'SEARCHB',
  20887. 0x00CF: 'REPLACEB',
  20888. 0x00D0: 'LEFTB',
  20889. 0x00D1: 'RIGHTB',
  20890. 0x00D2: 'MIDB',
  20891. 0x00D3: 'LENB',
  20892. 0x00D4: 'ROUNDUP',
  20893. 0x00D5: 'ROUNDDOWN',
  20894. 0x00D6: 'ASC',
  20895. 0x00D7: 'DBCS',
  20896. 0x00D8: 'RANK',
  20897. 0x00DB: 'ADDRESS',
  20898. 0x00DC: 'DAYS360',
  20899. 0x00DD: 'TODAY',
  20900. 0x00DE: 'VDB',
  20901. 0x00DF: 'ELSE',
  20902. 0x00E0: 'ELSE.IF',
  20903. 0x00E1: 'END.IF',
  20904. 0x00E2: 'FOR.CELL',
  20905. 0x00E3: 'MEDIAN',
  20906. 0x00E4: 'SUMPRODUCT',
  20907. 0x00E5: 'SINH',
  20908. 0x00E6: 'COSH',
  20909. 0x00E7: 'TANH',
  20910. 0x00E8: 'ASINH',
  20911. 0x00E9: 'ACOSH',
  20912. 0x00EA: 'ATANH',
  20913. 0x00EB: 'DGET',
  20914. 0x00EC: 'CREATE.OBJECT',
  20915. 0x00ED: 'VOLATILE',
  20916. 0x00EE: 'LAST.ERROR',
  20917. 0x00EF: 'CUSTOM.UNDO',
  20918. 0x00F0: 'CUSTOM.REPEAT',
  20919. 0x00F1: 'FORMULA.CONVERT',
  20920. 0x00F2: 'GET.LINK.INFO',
  20921. 0x00F3: 'TEXT.BOX',
  20922. 0x00F4: 'INFO',
  20923. 0x00F5: 'GROUP',
  20924. 0x00F6: 'GET.OBJECT',
  20925. 0x00F7: 'DB',
  20926. 0x00F8: 'PAUSE',
  20927. 0x00FB: 'RESUME',
  20928. 0x00FC: 'FREQUENCY',
  20929. 0x00FD: 'ADD.TOOLBAR',
  20930. 0x00FE: 'DELETE.TOOLBAR',
  20931. 0x00FF: 'User',
  20932. 0x0100: 'RESET.TOOLBAR',
  20933. 0x0101: 'EVALUATE',
  20934. 0x0102: 'GET.TOOLBAR',
  20935. 0x0103: 'GET.TOOL',
  20936. 0x0104: 'SPELLING.CHECK',
  20937. 0x0105: 'ERROR.TYPE',
  20938. 0x0106: 'APP.TITLE',
  20939. 0x0107: 'WINDOW.TITLE',
  20940. 0x0108: 'SAVE.TOOLBAR',
  20941. 0x0109: 'ENABLE.TOOL',
  20942. 0x010A: 'PRESS.TOOL',
  20943. 0x010B: 'REGISTER.ID',
  20944. 0x010C: 'GET.WORKBOOK',
  20945. 0x010D: 'AVEDEV',
  20946. 0x010E: 'BETADIST',
  20947. 0x010F: 'GAMMALN',
  20948. 0x0110: 'BETAINV',
  20949. 0x0111: 'BINOMDIST',
  20950. 0x0112: 'CHIDIST',
  20951. 0x0113: 'CHIINV',
  20952. 0x0114: 'COMBIN',
  20953. 0x0115: 'CONFIDENCE',
  20954. 0x0116: 'CRITBINOM',
  20955. 0x0117: 'EVEN',
  20956. 0x0118: 'EXPONDIST',
  20957. 0x0119: 'FDIST',
  20958. 0x011A: 'FINV',
  20959. 0x011B: 'FISHER',
  20960. 0x011C: 'FISHERINV',
  20961. 0x011D: 'FLOOR',
  20962. 0x011E: 'GAMMADIST',
  20963. 0x011F: 'GAMMAINV',
  20964. 0x0120: 'CEILING',
  20965. 0x0121: 'HYPGEOMDIST',
  20966. 0x0122: 'LOGNORMDIST',
  20967. 0x0123: 'LOGINV',
  20968. 0x0124: 'NEGBINOMDIST',
  20969. 0x0125: 'NORMDIST',
  20970. 0x0126: 'NORMSDIST',
  20971. 0x0127: 'NORMINV',
  20972. 0x0128: 'NORMSINV',
  20973. 0x0129: 'STANDARDIZE',
  20974. 0x012A: 'ODD',
  20975. 0x012B: 'PERMUT',
  20976. 0x012C: 'POISSON',
  20977. 0x012D: 'TDIST',
  20978. 0x012E: 'WEIBULL',
  20979. 0x012F: 'SUMXMY2',
  20980. 0x0130: 'SUMX2MY2',
  20981. 0x0131: 'SUMX2PY2',
  20982. 0x0132: 'CHITEST',
  20983. 0x0133: 'CORREL',
  20984. 0x0134: 'COVAR',
  20985. 0x0135: 'FORECAST',
  20986. 0x0136: 'FTEST',
  20987. 0x0137: 'INTERCEPT',
  20988. 0x0138: 'PEARSON',
  20989. 0x0139: 'RSQ',
  20990. 0x013A: 'STEYX',
  20991. 0x013B: 'SLOPE',
  20992. 0x013C: 'TTEST',
  20993. 0x013D: 'PROB',
  20994. 0x013E: 'DEVSQ',
  20995. 0x013F: 'GEOMEAN',
  20996. 0x0140: 'HARMEAN',
  20997. 0x0141: 'SUMSQ',
  20998. 0x0142: 'KURT',
  20999. 0x0143: 'SKEW',
  21000. 0x0144: 'ZTEST',
  21001. 0x0145: 'LARGE',
  21002. 0x0146: 'SMALL',
  21003. 0x0147: 'QUARTILE',
  21004. 0x0148: 'PERCENTILE',
  21005. 0x0149: 'PERCENTRANK',
  21006. 0x014A: 'MODE',
  21007. 0x014B: 'TRIMMEAN',
  21008. 0x014C: 'TINV',
  21009. 0x014E: 'MOVIE.COMMAND',
  21010. 0x014F: 'GET.MOVIE',
  21011. 0x0150: 'CONCATENATE',
  21012. 0x0151: 'POWER',
  21013. 0x0152: 'PIVOT.ADD.DATA',
  21014. 0x0153: 'GET.PIVOT.TABLE',
  21015. 0x0154: 'GET.PIVOT.FIELD',
  21016. 0x0155: 'GET.PIVOT.ITEM',
  21017. 0x0156: 'RADIANS',
  21018. 0x0157: 'DEGREES',
  21019. 0x0158: 'SUBTOTAL',
  21020. 0x0159: 'SUMIF',
  21021. 0x015A: 'COUNTIF',
  21022. 0x015B: 'COUNTBLANK',
  21023. 0x015C: 'SCENARIO.GET',
  21024. 0x015D: 'OPTIONS.LISTS.GET',
  21025. 0x015E: 'ISPMT',
  21026. 0x015F: 'DATEDIF',
  21027. 0x0160: 'DATESTRING',
  21028. 0x0161: 'NUMBERSTRING',
  21029. 0x0162: 'ROMAN',
  21030. 0x0163: 'OPEN.DIALOG',
  21031. 0x0164: 'SAVE.DIALOG',
  21032. 0x0165: 'VIEW.GET',
  21033. 0x0166: 'GETPIVOTDATA',
  21034. 0x0167: 'HYPERLINK',
  21035. 0x0168: 'PHONETIC',
  21036. 0x0169: 'AVERAGEA',
  21037. 0x016A: 'MAXA',
  21038. 0x016B: 'MINA',
  21039. 0x016C: 'STDEVPA',
  21040. 0x016D: 'VARPA',
  21041. 0x016E: 'STDEVA',
  21042. 0x016F: 'VARA',
  21043. 0x0170: 'BAHTTEXT',
  21044. 0x0171: 'THAIDAYOFWEEK',
  21045. 0x0172: 'THAIDIGIT',
  21046. 0x0173: 'THAIMONTHOFYEAR',
  21047. 0x0174: 'THAINUMSOUND',
  21048. 0x0175: 'THAINUMSTRING',
  21049. 0x0176: 'THAISTRINGLENGTH',
  21050. 0x0177: 'ISTHAIDIGIT',
  21051. 0x0178: 'ROUNDBAHTDOWN',
  21052. 0x0179: 'ROUNDBAHTUP',
  21053. 0x017A: 'THAIYEAR',
  21054. 0x017B: 'RTD',
  21055. 0x017C: 'CUBEVALUE',
  21056. 0x017D: 'CUBEMEMBER',
  21057. 0x017E: 'CUBEMEMBERPROPERTY',
  21058. 0x017F: 'CUBERANKEDMEMBER',
  21059. 0x0180: 'HEX2BIN',
  21060. 0x0181: 'HEX2DEC',
  21061. 0x0182: 'HEX2OCT',
  21062. 0x0183: 'DEC2BIN',
  21063. 0x0184: 'DEC2HEX',
  21064. 0x0185: 'DEC2OCT',
  21065. 0x0186: 'OCT2BIN',
  21066. 0x0187: 'OCT2HEX',
  21067. 0x0188: 'OCT2DEC',
  21068. 0x0189: 'BIN2DEC',
  21069. 0x018A: 'BIN2OCT',
  21070. 0x018B: 'BIN2HEX',
  21071. 0x018C: 'IMSUB',
  21072. 0x018D: 'IMDIV',
  21073. 0x018E: 'IMPOWER',
  21074. 0x018F: 'IMABS',
  21075. 0x0190: 'IMSQRT',
  21076. 0x0191: 'IMLN',
  21077. 0x0192: 'IMLOG2',
  21078. 0x0193: 'IMLOG10',
  21079. 0x0194: 'IMSIN',
  21080. 0x0195: 'IMCOS',
  21081. 0x0196: 'IMEXP',
  21082. 0x0197: 'IMARGUMENT',
  21083. 0x0198: 'IMCONJUGATE',
  21084. 0x0199: 'IMAGINARY',
  21085. 0x019A: 'IMREAL',
  21086. 0x019B: 'COMPLEX',
  21087. 0x019C: 'IMSUM',
  21088. 0x019D: 'IMPRODUCT',
  21089. 0x019E: 'SERIESSUM',
  21090. 0x019F: 'FACTDOUBLE',
  21091. 0x01A0: 'SQRTPI',
  21092. 0x01A1: 'QUOTIENT',
  21093. 0x01A2: 'DELTA',
  21094. 0x01A3: 'GESTEP',
  21095. 0x01A4: 'ISEVEN',
  21096. 0x01A5: 'ISODD',
  21097. 0x01A6: 'MROUND',
  21098. 0x01A7: 'ERF',
  21099. 0x01A8: 'ERFC',
  21100. 0x01A9: 'BESSELJ',
  21101. 0x01AA: 'BESSELK',
  21102. 0x01AB: 'BESSELY',
  21103. 0x01AC: 'BESSELI',
  21104. 0x01AD: 'XIRR',
  21105. 0x01AE: 'XNPV',
  21106. 0x01AF: 'PRICEMAT',
  21107. 0x01B0: 'YIELDMAT',
  21108. 0x01B1: 'INTRATE',
  21109. 0x01B2: 'RECEIVED',
  21110. 0x01B3: 'DISC',
  21111. 0x01B4: 'PRICEDISC',
  21112. 0x01B5: 'YIELDDISC',
  21113. 0x01B6: 'TBILLEQ',
  21114. 0x01B7: 'TBILLPRICE',
  21115. 0x01B8: 'TBILLYIELD',
  21116. 0x01B9: 'PRICE',
  21117. 0x01BA: 'YIELD',
  21118. 0x01BB: 'DOLLARDE',
  21119. 0x01BC: 'DOLLARFR',
  21120. 0x01BD: 'NOMINAL',
  21121. 0x01BE: 'EFFECT',
  21122. 0x01BF: 'CUMPRINC',
  21123. 0x01C0: 'CUMIPMT',
  21124. 0x01C1: 'EDATE',
  21125. 0x01C2: 'EOMONTH',
  21126. 0x01C3: 'YEARFRAC',
  21127. 0x01C4: 'COUPDAYBS',
  21128. 0x01C5: 'COUPDAYS',
  21129. 0x01C6: 'COUPDAYSNC',
  21130. 0x01C7: 'COUPNCD',
  21131. 0x01C8: 'COUPNUM',
  21132. 0x01C9: 'COUPPCD',
  21133. 0x01CA: 'DURATION',
  21134. 0x01CB: 'MDURATION',
  21135. 0x01CC: 'ODDLPRICE',
  21136. 0x01CD: 'ODDLYIELD',
  21137. 0x01CE: 'ODDFPRICE',
  21138. 0x01CF: 'ODDFYIELD',
  21139. 0x01D0: 'RANDBETWEEN',
  21140. 0x01D1: 'WEEKNUM',
  21141. 0x01D2: 'AMORDEGRC',
  21142. 0x01D3: 'AMORLINC',
  21143. 0x01D4: 'CONVERT',
  21144. 0x02D4: 'SHEETJS',
  21145. 0x01D5: 'ACCRINT',
  21146. 0x01D6: 'ACCRINTM',
  21147. 0x01D7: 'WORKDAY',
  21148. 0x01D8: 'NETWORKDAYS',
  21149. 0x01D9: 'GCD',
  21150. 0x01DA: 'MULTINOMIAL',
  21151. 0x01DB: 'LCM',
  21152. 0x01DC: 'FVSCHEDULE',
  21153. 0x01DD: 'CUBEKPIMEMBER',
  21154. 0x01DE: 'CUBESET',
  21155. 0x01DF: 'CUBESETCOUNT',
  21156. 0x01E0: 'IFERROR',
  21157. 0x01E1: 'COUNTIFS',
  21158. 0x01E2: 'SUMIFS',
  21159. 0x01E3: 'AVERAGEIF',
  21160. 0x01E4: 'AVERAGEIFS'
  21161. };
  21162. var FtabArgc = {
  21163. 0x0002: 1, /* ISNA */
  21164. 0x0003: 1, /* ISERROR */
  21165. 0x000A: 0, /* NA */
  21166. 0x000F: 1, /* SIN */
  21167. 0x0010: 1, /* COS */
  21168. 0x0011: 1, /* TAN */
  21169. 0x0012: 1, /* ATAN */
  21170. 0x0013: 0, /* PI */
  21171. 0x0014: 1, /* SQRT */
  21172. 0x0015: 1, /* EXP */
  21173. 0x0016: 1, /* LN */
  21174. 0x0017: 1, /* LOG10 */
  21175. 0x0018: 1, /* ABS */
  21176. 0x0019: 1, /* INT */
  21177. 0x001A: 1, /* SIGN */
  21178. 0x001B: 2, /* ROUND */
  21179. 0x001E: 2, /* REPT */
  21180. 0x001F: 3, /* MID */
  21181. 0x0020: 1, /* LEN */
  21182. 0x0021: 1, /* VALUE */
  21183. 0x0022: 0, /* TRUE */
  21184. 0x0023: 0, /* FALSE */
  21185. 0x0026: 1, /* NOT */
  21186. 0x0027: 2, /* MOD */
  21187. 0x0028: 3, /* DCOUNT */
  21188. 0x0029: 3, /* DSUM */
  21189. 0x002A: 3, /* DAVERAGE */
  21190. 0x002B: 3, /* DMIN */
  21191. 0x002C: 3, /* DMAX */
  21192. 0x002D: 3, /* DSTDEV */
  21193. 0x002F: 3, /* DVAR */
  21194. 0x0030: 2, /* TEXT */
  21195. 0x0035: 1, /* GOTO */
  21196. 0x003D: 3, /* MIRR */
  21197. 0x003F: 0, /* RAND */
  21198. 0x0041: 3, /* DATE */
  21199. 0x0042: 3, /* TIME */
  21200. 0x0043: 1, /* DAY */
  21201. 0x0044: 1, /* MONTH */
  21202. 0x0045: 1, /* YEAR */
  21203. 0x0046: 1, /* WEEKDAY */
  21204. 0x0047: 1, /* HOUR */
  21205. 0x0048: 1, /* MINUTE */
  21206. 0x0049: 1, /* SECOND */
  21207. 0x004A: 0, /* NOW */
  21208. 0x004B: 1, /* AREAS */
  21209. 0x004C: 1, /* ROWS */
  21210. 0x004D: 1, /* COLUMNS */
  21211. 0x004F: 2, /* ABSREF */
  21212. 0x0050: 2, /* RELREF */
  21213. 0x0053: 1, /* TRANSPOSE */
  21214. 0x0055: 0, /* STEP */
  21215. 0x0056: 1, /* TYPE */
  21216. 0x0059: 0, /* CALLER */
  21217. 0x005A: 1, /* DEREF */
  21218. 0x005E: 0, /* ACTIVE.CELL */
  21219. 0x005F: 0, /* SELECTION */
  21220. 0x0061: 2, /* ATAN2 */
  21221. 0x0062: 1, /* ASIN */
  21222. 0x0063: 1, /* ACOS */
  21223. 0x0065: 3, /* HLOOKUP */
  21224. 0x0066: 3, /* VLOOKUP */
  21225. 0x0069: 1, /* ISREF */
  21226. 0x006A: 1, /* GET.FORMULA */
  21227. 0x006C: 2, /* SET.VALUE */
  21228. 0x006F: 1, /* CHAR */
  21229. 0x0070: 1, /* LOWER */
  21230. 0x0071: 1, /* UPPER */
  21231. 0x0072: 1, /* PROPER */
  21232. 0x0075: 2, /* EXACT */
  21233. 0x0076: 1, /* TRIM */
  21234. 0x0077: 4, /* REPLACE */
  21235. 0x0079: 1, /* CODE */
  21236. 0x007E: 1, /* ISERR */
  21237. 0x007F: 1, /* ISTEXT */
  21238. 0x0080: 1, /* ISNUMBER */
  21239. 0x0081: 1, /* ISBLANK */
  21240. 0x0082: 1, /* T */
  21241. 0x0083: 1, /* N */
  21242. 0x0085: 1, /* FCLOSE */
  21243. 0x0086: 1, /* FSIZE */
  21244. 0x0087: 1, /* FREADLN */
  21245. 0x0088: 2, /* FREAD */
  21246. 0x0089: 2, /* FWRITELN */
  21247. 0x008A: 2, /* FWRITE */
  21248. 0x008C: 1, /* DATEVALUE */
  21249. 0x008D: 1, /* TIMEVALUE */
  21250. 0x008E: 3, /* SLN */
  21251. 0x008F: 4, /* SYD */
  21252. 0x0090: 4, /* DDB */
  21253. 0x00A1: 1, /* DIALOG.BOX */
  21254. 0x00A2: 1, /* CLEAN */
  21255. 0x00A3: 1, /* MDETERM */
  21256. 0x00A4: 1, /* MINVERSE */
  21257. 0x00A5: 2, /* MMULT */
  21258. 0x00AC: 1, /* WHILE */
  21259. 0x00AF: 2, /* INITIATE */
  21260. 0x00B0: 2, /* REQUEST */
  21261. 0x00B1: 3, /* POKE */
  21262. 0x00B2: 2, /* EXECUTE */
  21263. 0x00B3: 1, /* TERMINATE */
  21264. 0x00B8: 1, /* FACT */
  21265. 0x00BA: 1, /* GET.WORKSPACE */
  21266. 0x00BD: 3, /* DPRODUCT */
  21267. 0x00BE: 1, /* ISNONTEXT */
  21268. 0x00C3: 3, /* DSTDEVP */
  21269. 0x00C4: 3, /* DVARP */
  21270. 0x00C5: 1, /* TRUNC */
  21271. 0x00C6: 1, /* ISLOGICAL */
  21272. 0x00C7: 3, /* DCOUNTA */
  21273. 0x00C9: 1, /* UNREGISTER */
  21274. 0x00CF: 4, /* REPLACEB */
  21275. 0x00D2: 3, /* MIDB */
  21276. 0x00D3: 1, /* LENB */
  21277. 0x00D4: 2, /* ROUNDUP */
  21278. 0x00D5: 2, /* ROUNDDOWN */
  21279. 0x00D6: 1, /* ASC */
  21280. 0x00D7: 1, /* DBCS */
  21281. 0x00E1: 0, /* END.IF */
  21282. 0x00E5: 1, /* SINH */
  21283. 0x00E6: 1, /* COSH */
  21284. 0x00E7: 1, /* TANH */
  21285. 0x00E8: 1, /* ASINH */
  21286. 0x00E9: 1, /* ACOSH */
  21287. 0x00EA: 1, /* ATANH */
  21288. 0x00EB: 3, /* DGET */
  21289. 0x00F4: 1, /* INFO */
  21290. 0x00F7: 4, /* DB */
  21291. 0x00FC: 2, /* FREQUENCY */
  21292. 0x0101: 1, /* EVALUATE */
  21293. 0x0105: 1, /* ERROR.TYPE */
  21294. 0x010F: 1, /* GAMMALN */
  21295. 0x0111: 4, /* BINOMDIST */
  21296. 0x0112: 2, /* CHIDIST */
  21297. 0x0113: 2, /* CHIINV */
  21298. 0x0114: 2, /* COMBIN */
  21299. 0x0115: 3, /* CONFIDENCE */
  21300. 0x0116: 3, /* CRITBINOM */
  21301. 0x0117: 1, /* EVEN */
  21302. 0x0118: 3, /* EXPONDIST */
  21303. 0x0119: 3, /* FDIST */
  21304. 0x011A: 3, /* FINV */
  21305. 0x011B: 1, /* FISHER */
  21306. 0x011C: 1, /* FISHERINV */
  21307. 0x011D: 2, /* FLOOR */
  21308. 0x011E: 4, /* GAMMADIST */
  21309. 0x011F: 3, /* GAMMAINV */
  21310. 0x0120: 2, /* CEILING */
  21311. 0x0121: 4, /* HYPGEOMDIST */
  21312. 0x0122: 3, /* LOGNORMDIST */
  21313. 0x0123: 3, /* LOGINV */
  21314. 0x0124: 3, /* NEGBINOMDIST */
  21315. 0x0125: 4, /* NORMDIST */
  21316. 0x0126: 1, /* NORMSDIST */
  21317. 0x0127: 3, /* NORMINV */
  21318. 0x0128: 1, /* NORMSINV */
  21319. 0x0129: 3, /* STANDARDIZE */
  21320. 0x012A: 1, /* ODD */
  21321. 0x012B: 2, /* PERMUT */
  21322. 0x012C: 3, /* POISSON */
  21323. 0x012D: 3, /* TDIST */
  21324. 0x012E: 4, /* WEIBULL */
  21325. 0x012F: 2, /* SUMXMY2 */
  21326. 0x0130: 2, /* SUMX2MY2 */
  21327. 0x0131: 2, /* SUMX2PY2 */
  21328. 0x0132: 2, /* CHITEST */
  21329. 0x0133: 2, /* CORREL */
  21330. 0x0134: 2, /* COVAR */
  21331. 0x0135: 3, /* FORECAST */
  21332. 0x0136: 2, /* FTEST */
  21333. 0x0137: 2, /* INTERCEPT */
  21334. 0x0138: 2, /* PEARSON */
  21335. 0x0139: 2, /* RSQ */
  21336. 0x013A: 2, /* STEYX */
  21337. 0x013B: 2, /* SLOPE */
  21338. 0x013C: 4, /* TTEST */
  21339. 0x0145: 2, /* LARGE */
  21340. 0x0146: 2, /* SMALL */
  21341. 0x0147: 2, /* QUARTILE */
  21342. 0x0148: 2, /* PERCENTILE */
  21343. 0x014B: 2, /* TRIMMEAN */
  21344. 0x014C: 2, /* TINV */
  21345. 0x0151: 2, /* POWER */
  21346. 0x0156: 1, /* RADIANS */
  21347. 0x0157: 1, /* DEGREES */
  21348. 0x015A: 2, /* COUNTIF */
  21349. 0x015B: 1, /* COUNTBLANK */
  21350. 0x015E: 4, /* ISPMT */
  21351. 0x015F: 3, /* DATEDIF */
  21352. 0x0160: 1, /* DATESTRING */
  21353. 0x0161: 2, /* NUMBERSTRING */
  21354. 0x0168: 1, /* PHONETIC */
  21355. 0x0170: 1, /* BAHTTEXT */
  21356. 0x0171: 1, /* THAIDAYOFWEEK */
  21357. 0x0172: 1, /* THAIDIGIT */
  21358. 0x0173: 1, /* THAIMONTHOFYEAR */
  21359. 0x0174: 1, /* THAINUMSOUND */
  21360. 0x0175: 1, /* THAINUMSTRING */
  21361. 0x0176: 1, /* THAISTRINGLENGTH */
  21362. 0x0177: 1, /* ISTHAIDIGIT */
  21363. 0x0178: 1, /* ROUNDBAHTDOWN */
  21364. 0x0179: 1, /* ROUNDBAHTUP */
  21365. 0x017A: 1, /* THAIYEAR */
  21366. 0x017E: 3, /* CUBEMEMBERPROPERTY */
  21367. 0x0181: 1, /* HEX2DEC */
  21368. 0x0188: 1, /* OCT2DEC */
  21369. 0x0189: 1, /* BIN2DEC */
  21370. 0x018C: 2, /* IMSUB */
  21371. 0x018D: 2, /* IMDIV */
  21372. 0x018E: 2, /* IMPOWER */
  21373. 0x018F: 1, /* IMABS */
  21374. 0x0190: 1, /* IMSQRT */
  21375. 0x0191: 1, /* IMLN */
  21376. 0x0192: 1, /* IMLOG2 */
  21377. 0x0193: 1, /* IMLOG10 */
  21378. 0x0194: 1, /* IMSIN */
  21379. 0x0195: 1, /* IMCOS */
  21380. 0x0196: 1, /* IMEXP */
  21381. 0x0197: 1, /* IMARGUMENT */
  21382. 0x0198: 1, /* IMCONJUGATE */
  21383. 0x0199: 1, /* IMAGINARY */
  21384. 0x019A: 1, /* IMREAL */
  21385. 0x019E: 4, /* SERIESSUM */
  21386. 0x019F: 1, /* FACTDOUBLE */
  21387. 0x01A0: 1, /* SQRTPI */
  21388. 0x01A1: 2, /* QUOTIENT */
  21389. 0x01A4: 1, /* ISEVEN */
  21390. 0x01A5: 1, /* ISODD */
  21391. 0x01A6: 2, /* MROUND */
  21392. 0x01A8: 1, /* ERFC */
  21393. 0x01A9: 2, /* BESSELJ */
  21394. 0x01AA: 2, /* BESSELK */
  21395. 0x01AB: 2, /* BESSELY */
  21396. 0x01AC: 2, /* BESSELI */
  21397. 0x01AE: 3, /* XNPV */
  21398. 0x01B6: 3, /* TBILLEQ */
  21399. 0x01B7: 3, /* TBILLPRICE */
  21400. 0x01B8: 3, /* TBILLYIELD */
  21401. 0x01BB: 2, /* DOLLARDE */
  21402. 0x01BC: 2, /* DOLLARFR */
  21403. 0x01BD: 2, /* NOMINAL */
  21404. 0x01BE: 2, /* EFFECT */
  21405. 0x01BF: 6, /* CUMPRINC */
  21406. 0x01C0: 6, /* CUMIPMT */
  21407. 0x01C1: 2, /* EDATE */
  21408. 0x01C2: 2, /* EOMONTH */
  21409. 0x01D0: 2, /* RANDBETWEEN */
  21410. 0x01D4: 3, /* CONVERT */
  21411. 0x01DC: 2, /* FVSCHEDULE */
  21412. 0x01DF: 1, /* CUBESETCOUNT */
  21413. 0x01E0: 2, /* IFERROR */
  21414. 0xFFFF: 0
  21415. };
  21416. /* [MS-XLSX] 2.2.3 Functions */
  21417. /* [MS-XLSB] 2.5.97.10 Ftab */
  21418. var XLSXFutureFunctions = {
  21419. "_xlfn.ACOT": "ACOT",
  21420. "_xlfn.ACOTH": "ACOTH",
  21421. "_xlfn.AGGREGATE": "AGGREGATE",
  21422. "_xlfn.ARABIC": "ARABIC",
  21423. "_xlfn.AVERAGEIF": "AVERAGEIF",
  21424. "_xlfn.AVERAGEIFS": "AVERAGEIFS",
  21425. "_xlfn.BASE": "BASE",
  21426. "_xlfn.BETA.DIST": "BETA.DIST",
  21427. "_xlfn.BETA.INV": "BETA.INV",
  21428. "_xlfn.BINOM.DIST": "BINOM.DIST",
  21429. "_xlfn.BINOM.DIST.RANGE": "BINOM.DIST.RANGE",
  21430. "_xlfn.BINOM.INV": "BINOM.INV",
  21431. "_xlfn.BITAND": "BITAND",
  21432. "_xlfn.BITLSHIFT": "BITLSHIFT",
  21433. "_xlfn.BITOR": "BITOR",
  21434. "_xlfn.BITRSHIFT": "BITRSHIFT",
  21435. "_xlfn.BITXOR": "BITXOR",
  21436. "_xlfn.CEILING.MATH": "CEILING.MATH",
  21437. "_xlfn.CEILING.PRECISE": "CEILING.PRECISE",
  21438. "_xlfn.CHISQ.DIST": "CHISQ.DIST",
  21439. "_xlfn.CHISQ.DIST.RT": "CHISQ.DIST.RT",
  21440. "_xlfn.CHISQ.INV": "CHISQ.INV",
  21441. "_xlfn.CHISQ.INV.RT": "CHISQ.INV.RT",
  21442. "_xlfn.CHISQ.TEST": "CHISQ.TEST",
  21443. "_xlfn.COMBINA": "COMBINA",
  21444. "_xlfn.CONCAT": "CONCAT",
  21445. "_xlfn.CONFIDENCE.NORM": "CONFIDENCE.NORM",
  21446. "_xlfn.CONFIDENCE.T": "CONFIDENCE.T",
  21447. "_xlfn.COT": "COT",
  21448. "_xlfn.COTH": "COTH",
  21449. "_xlfn.COUNTIFS": "COUNTIFS",
  21450. "_xlfn.COVARIANCE.P": "COVARIANCE.P",
  21451. "_xlfn.COVARIANCE.S": "COVARIANCE.S",
  21452. "_xlfn.CSC": "CSC",
  21453. "_xlfn.CSCH": "CSCH",
  21454. "_xlfn.DAYS": "DAYS",
  21455. "_xlfn.DECIMAL": "DECIMAL",
  21456. "_xlfn.ECMA.CEILING": "ECMA.CEILING",
  21457. "_xlfn.ERF.PRECISE": "ERF.PRECISE",
  21458. "_xlfn.ERFC.PRECISE": "ERFC.PRECISE",
  21459. "_xlfn.EXPON.DIST": "EXPON.DIST",
  21460. "_xlfn.F.DIST": "F.DIST",
  21461. "_xlfn.F.DIST.RT": "F.DIST.RT",
  21462. "_xlfn.F.INV": "F.INV",
  21463. "_xlfn.F.INV.RT": "F.INV.RT",
  21464. "_xlfn.F.TEST": "F.TEST",
  21465. "_xlfn.FILTERXML": "FILTERXML",
  21466. "_xlfn.FLOOR.MATH": "FLOOR.MATH",
  21467. "_xlfn.FLOOR.PRECISE": "FLOOR.PRECISE",
  21468. "_xlfn.FORECAST.ETS": "FORECAST.ETS",
  21469. "_xlfn.FORECAST.ETS.CONFINT": "FORECAST.ETS.CONFINT",
  21470. "_xlfn.FORECAST.ETS.SEASONALITY": "FORECAST.ETS.SEASONALITY",
  21471. "_xlfn.FORECAST.ETS.STAT": "FORECAST.ETS.STAT",
  21472. "_xlfn.FORECAST.LINEAR": "FORECAST.LINEAR",
  21473. "_xlfn.FORMULATEXT": "FORMULATEXT",
  21474. "_xlfn.GAMMA": "GAMMA",
  21475. "_xlfn.GAMMA.DIST": "GAMMA.DIST",
  21476. "_xlfn.GAMMA.INV": "GAMMA.INV",
  21477. "_xlfn.GAMMALN.PRECISE": "GAMMALN.PRECISE",
  21478. "_xlfn.GAUSS": "GAUSS",
  21479. "_xlfn.HYPGEOM.DIST": "HYPGEOM.DIST",
  21480. "_xlfn.IFERROR": "IFERROR",
  21481. "_xlfn.IFNA": "IFNA",
  21482. "_xlfn.IFS": "IFS",
  21483. "_xlfn.IMCOSH": "IMCOSH",
  21484. "_xlfn.IMCOT": "IMCOT",
  21485. "_xlfn.IMCSC": "IMCSC",
  21486. "_xlfn.IMCSCH": "IMCSCH",
  21487. "_xlfn.IMSEC": "IMSEC",
  21488. "_xlfn.IMSECH": "IMSECH",
  21489. "_xlfn.IMSINH": "IMSINH",
  21490. "_xlfn.IMTAN": "IMTAN",
  21491. "_xlfn.ISFORMULA": "ISFORMULA",
  21492. "_xlfn.ISO.CEILING": "ISO.CEILING",
  21493. "_xlfn.ISOWEEKNUM": "ISOWEEKNUM",
  21494. "_xlfn.LOGNORM.DIST": "LOGNORM.DIST",
  21495. "_xlfn.LOGNORM.INV": "LOGNORM.INV",
  21496. "_xlfn.MAXIFS": "MAXIFS",
  21497. "_xlfn.MINIFS": "MINIFS",
  21498. "_xlfn.MODE.MULT": "MODE.MULT",
  21499. "_xlfn.MODE.SNGL": "MODE.SNGL",
  21500. "_xlfn.MUNIT": "MUNIT",
  21501. "_xlfn.NEGBINOM.DIST": "NEGBINOM.DIST",
  21502. "_xlfn.NETWORKDAYS.INTL": "NETWORKDAYS.INTL",
  21503. "_xlfn.NIGBINOM": "NIGBINOM",
  21504. "_xlfn.NORM.DIST": "NORM.DIST",
  21505. "_xlfn.NORM.INV": "NORM.INV",
  21506. "_xlfn.NORM.S.DIST": "NORM.S.DIST",
  21507. "_xlfn.NORM.S.INV": "NORM.S.INV",
  21508. "_xlfn.NUMBERVALUE": "NUMBERVALUE",
  21509. "_xlfn.PDURATION": "PDURATION",
  21510. "_xlfn.PERCENTILE.EXC": "PERCENTILE.EXC",
  21511. "_xlfn.PERCENTILE.INC": "PERCENTILE.INC",
  21512. "_xlfn.PERCENTRANK.EXC": "PERCENTRANK.EXC",
  21513. "_xlfn.PERCENTRANK.INC": "PERCENTRANK.INC",
  21514. "_xlfn.PERMUTATIONA": "PERMUTATIONA",
  21515. "_xlfn.PHI": "PHI",
  21516. "_xlfn.POISSON.DIST": "POISSON.DIST",
  21517. "_xlfn.QUARTILE.EXC": "QUARTILE.EXC",
  21518. "_xlfn.QUARTILE.INC": "QUARTILE.INC",
  21519. "_xlfn.QUERYSTRING": "QUERYSTRING",
  21520. "_xlfn.RANK.AVG": "RANK.AVG",
  21521. "_xlfn.RANK.EQ": "RANK.EQ",
  21522. "_xlfn.RRI": "RRI",
  21523. "_xlfn.SEC": "SEC",
  21524. "_xlfn.SECH": "SECH",
  21525. "_xlfn.SHEET": "SHEET",
  21526. "_xlfn.SHEETS": "SHEETS",
  21527. "_xlfn.SKEW.P": "SKEW.P",
  21528. "_xlfn.STDEV.P": "STDEV.P",
  21529. "_xlfn.STDEV.S": "STDEV.S",
  21530. "_xlfn.SUMIFS": "SUMIFS",
  21531. "_xlfn.SWITCH": "SWITCH",
  21532. "_xlfn.T.DIST": "T.DIST",
  21533. "_xlfn.T.DIST.2T": "T.DIST.2T",
  21534. "_xlfn.T.DIST.RT": "T.DIST.RT",
  21535. "_xlfn.T.INV": "T.INV",
  21536. "_xlfn.T.INV.2T": "T.INV.2T",
  21537. "_xlfn.T.TEST": "T.TEST",
  21538. "_xlfn.TEXTJOIN": "TEXTJOIN",
  21539. "_xlfn.UNICHAR": "UNICHAR",
  21540. "_xlfn.UNICODE": "UNICODE",
  21541. "_xlfn.VAR.P": "VAR.P",
  21542. "_xlfn.VAR.S": "VAR.S",
  21543. "_xlfn.WEBSERVICE": "WEBSERVICE",
  21544. "_xlfn.WEIBULL.DIST": "WEIBULL.DIST",
  21545. "_xlfn.WORKDAY.INTL": "WORKDAY.INTL",
  21546. "_xlfn.XOR": "XOR",
  21547. "_xlfn.Z.TEST": "Z.TEST"
  21548. };
  21549. /* Part 3 TODO: actually parse formulae */
  21550. function ods_to_csf_formula(f) {
  21551. if(f.slice(0,3) == "of:") f = f.slice(3);
  21552. /* 5.2 Basic Expressions */
  21553. if(f.charCodeAt(0) == 61) {
  21554. f = f.slice(1);
  21555. if(f.charCodeAt(0) == 61) f = f.slice(1);
  21556. }
  21557. f = f.replace(/COM\.MICROSOFT\./g, "");
  21558. /* Part 3 Section 5.8 References */
  21559. f = f.replace(/\[((?:\.[A-Z]+[0-9]+)(?::\.[A-Z]+[0-9]+)?)\]/g, function($$, $1) { return $1.replace(/\./g,""); });
  21560. /* TODO: something other than this */
  21561. f = f.replace(/\[.(#[A-Z]*[?!])\]/g, "$1");
  21562. return f.replace(/[;~]/g,",").replace(/\|/g,";");
  21563. }
  21564. function csf_to_ods_formula(f) {
  21565. var o = "of:=" + f.replace(crefregex, "$1[.$2$3$4$5]").replace(/\]:\[/g,":");
  21566. /* TODO: something other than this */
  21567. return o.replace(/;/g, "|").replace(/,/g,";");
  21568. }
  21569. function ods_to_csf_3D(r) {
  21570. var a = r.split(":");
  21571. var s = a[0].split(".")[0];
  21572. return [s, a[0].split(".")[1] + (a.length > 1 ? (":" + (a[1].split(".")[1] || a[1].split(".")[0])) : "")];
  21573. }
  21574. function csf_to_ods_3D(r) {
  21575. return r.replace(/\./,"!");
  21576. }
  21577. var strs = {}; // shared strings
  21578. var _ssfopts = {}; // spreadsheet formatting options
  21579. RELS.WS = [
  21580. "http://schemas.openxmlformats.org/officeDocument/2006/relationships/worksheet",
  21581. "http://purl.oclc.org/ooxml/officeDocument/relationships/worksheet"
  21582. ];
  21583. /*global Map */
  21584. var browser_has_Map = typeof Map !== 'undefined';
  21585. function get_sst_id(sst, str, rev) {
  21586. var i = 0, len = sst.length;
  21587. if(rev) {
  21588. if(browser_has_Map ? rev.has(str) : Object.prototype.hasOwnProperty.call(rev, str)) {
  21589. var revarr = browser_has_Map ? rev.get(str) : rev[str];
  21590. for(; i < revarr.length; ++i) {
  21591. if(sst[revarr[i]].t === str) { sst.Count ++; return revarr[i]; }
  21592. }
  21593. }
  21594. } else for(; i < len; ++i) {
  21595. if(sst[i].t === str) { sst.Count ++; return i; }
  21596. }
  21597. sst[len] = ({t:str}); sst.Count ++; sst.Unique ++;
  21598. if(rev) {
  21599. if(browser_has_Map) {
  21600. if(!rev.has(str)) rev.set(str, []);
  21601. rev.get(str).push(len);
  21602. } else {
  21603. if(!Object.prototype.hasOwnProperty.call(rev, str)) rev[str] = [];
  21604. rev[str].push(len);
  21605. }
  21606. }
  21607. return len;
  21608. }
  21609. function col_obj_w(C, col) {
  21610. var p = ({min:C+1,max:C+1});
  21611. /* wch (chars), wpx (pixels) */
  21612. var wch = -1;
  21613. if(col.MDW) MDW = col.MDW;
  21614. if(col.width != null) p.customWidth = 1;
  21615. else if(col.wpx != null) wch = px2char(col.wpx);
  21616. else if(col.wch != null) wch = col.wch;
  21617. if(wch > -1) { p.width = char2width(wch); p.customWidth = 1; }
  21618. else if(col.width != null) p.width = col.width;
  21619. if(col.hidden) p.hidden = true;
  21620. return p;
  21621. }
  21622. function default_margins(margins, mode) {
  21623. if(!margins) return;
  21624. var defs = [0.7, 0.7, 0.75, 0.75, 0.3, 0.3];
  21625. if(mode == 'xlml') defs = [1, 1, 1, 1, 0.5, 0.5];
  21626. if(margins.left == null) margins.left = defs[0];
  21627. if(margins.right == null) margins.right = defs[1];
  21628. if(margins.top == null) margins.top = defs[2];
  21629. if(margins.bottom == null) margins.bottom = defs[3];
  21630. if(margins.header == null) margins.header = defs[4];
  21631. if(margins.footer == null) margins.footer = defs[5];
  21632. }
  21633. function get_cell_style(styles, cell, opts) {
  21634. var z = opts.revssf[cell.z != null ? cell.z : "General"];
  21635. var i = 0x3c, len = styles.length;
  21636. if(z == null && opts.ssf) {
  21637. for(; i < 0x188; ++i) if(opts.ssf[i] == null) {
  21638. SSF.load(cell.z, i);
  21639. // $FlowIgnore
  21640. opts.ssf[i] = cell.z;
  21641. opts.revssf[cell.z] = z = i;
  21642. break;
  21643. }
  21644. }
  21645. for(i = 0; i != len; ++i) if(styles[i].numFmtId === z) return i;
  21646. styles[len] = {
  21647. numFmtId:z,
  21648. fontId:0,
  21649. fillId:0,
  21650. borderId:0,
  21651. xfId:0,
  21652. applyNumberFormat:1
  21653. };
  21654. return len;
  21655. }
  21656. function safe_format(p, fmtid, fillid, opts, themes, styles) {
  21657. try {
  21658. if(opts.cellNF) p.z = SSF._table[fmtid];
  21659. } catch(e) { if(opts.WTF) throw e; }
  21660. if(p.t === 'z') return;
  21661. if(p.t === 'd' && typeof p.v === 'string') p.v = parseDate(p.v);
  21662. if(!opts || opts.cellText !== false) try {
  21663. if(SSF._table[fmtid] == null) SSF.load(SSFImplicit[fmtid] || "General", fmtid);
  21664. if(p.t === 'e') p.w = p.w || BErr[p.v];
  21665. else if(fmtid === 0) {
  21666. if(p.t === 'n') {
  21667. if((p.v|0) === p.v) p.w = SSF._general_int(p.v);
  21668. else p.w = SSF._general_num(p.v);
  21669. }
  21670. else if(p.t === 'd') {
  21671. var dd = datenum(p.v);
  21672. if((dd|0) === dd) p.w = SSF._general_int(dd);
  21673. else p.w = SSF._general_num(dd);
  21674. }
  21675. else if(p.v === undefined) return "";
  21676. else p.w = SSF._general(p.v,_ssfopts);
  21677. }
  21678. else if(p.t === 'd') p.w = SSF.format(fmtid,datenum(p.v),_ssfopts);
  21679. else p.w = SSF.format(fmtid,p.v,_ssfopts);
  21680. } catch(e) { if(opts.WTF) throw e; }
  21681. if(!opts.cellStyles) return;
  21682. if(fillid != null) try {
  21683. p.s = styles.Fills[fillid];
  21684. if (p.s.fgColor && p.s.fgColor.theme && !p.s.fgColor.rgb) {
  21685. p.s.fgColor.rgb = rgb_tint(themes.themeElements.clrScheme[p.s.fgColor.theme].rgb, p.s.fgColor.tint || 0);
  21686. if(opts.WTF) p.s.fgColor.raw_rgb = themes.themeElements.clrScheme[p.s.fgColor.theme].rgb;
  21687. }
  21688. if (p.s.bgColor && p.s.bgColor.theme) {
  21689. p.s.bgColor.rgb = rgb_tint(themes.themeElements.clrScheme[p.s.bgColor.theme].rgb, p.s.bgColor.tint || 0);
  21690. if(opts.WTF) p.s.bgColor.raw_rgb = themes.themeElements.clrScheme[p.s.bgColor.theme].rgb;
  21691. }
  21692. } catch(e) { if(opts.WTF && styles.Fills) throw e; }
  21693. }
  21694. function check_ws(ws, sname, i) {
  21695. if(ws && ws['!ref']) {
  21696. var range = safe_decode_range(ws['!ref']);
  21697. if(range.e.c < range.s.c || range.e.r < range.s.r) throw new Error("Bad range (" + i + "): " + ws['!ref']);
  21698. }
  21699. }
  21700. function parse_ws_xml_dim(ws, s) {
  21701. var d = safe_decode_range(s);
  21702. if(d.s.r<=d.e.r && d.s.c<=d.e.c && d.s.r>=0 && d.s.c>=0) ws["!ref"] = encode_range(d);
  21703. }
  21704. var mergecregex = /<(?:\w:)?mergeCell ref="[A-Z0-9:]+"\s*[\/]?>/g;
  21705. var sheetdataregex = /<(?:\w+:)?sheetData[^>]*>([\s\S]*)<\/(?:\w+:)?sheetData>/;
  21706. var hlinkregex = /<(?:\w:)?hyperlink [^>]*>/mg;
  21707. var dimregex = /"(\w*:\w*)"/;
  21708. var colregex = /<(?:\w:)?col\b[^>]*[\/]?>/g;
  21709. var afregex = /<(?:\w:)?autoFilter[^>]*([\/]|>([\s\S]*)<\/(?:\w:)?autoFilter)>/g;
  21710. var marginregex= /<(?:\w:)?pageMargins[^>]*\/>/g;
  21711. var sheetprregex = /<(?:\w:)?sheetPr\b(?:[^>a-z][^>]*)?\/>/;
  21712. var svsregex = /<(?:\w:)?sheetViews[^>]*(?:[\/]|>([\s\S]*)<\/(?:\w:)?sheetViews)>/;
  21713. /* 18.3 Worksheets */
  21714. function parse_ws_xml(data, opts, idx, rels, wb, themes, styles) {
  21715. if(!data) return data;
  21716. if(!rels) rels = {'!id':{}};
  21717. if(DENSE != null && opts.dense == null) opts.dense = DENSE;
  21718. /* 18.3.1.99 worksheet CT_Worksheet */
  21719. var s = opts.dense ? ([]) : ({});
  21720. var refguess = ({s: {r:2000000, c:2000000}, e: {r:0, c:0} });
  21721. var data1 = "", data2 = "";
  21722. var mtch = data.match(sheetdataregex);
  21723. if(mtch) {
  21724. data1 = data.slice(0, mtch.index);
  21725. data2 = data.slice(mtch.index + mtch[0].length);
  21726. } else data1 = data2 = data;
  21727. /* 18.3.1.82 sheetPr CT_SheetPr */
  21728. var sheetPr = data1.match(sheetprregex);
  21729. if(sheetPr) parse_ws_xml_sheetpr(sheetPr[0], s, wb, idx);
  21730. /* 18.3.1.35 dimension CT_SheetDimension */
  21731. var ridx = (data1.match(/<(?:\w*:)?dimension/)||{index:-1}).index;
  21732. if(ridx > 0) {
  21733. var ref = data1.slice(ridx,ridx+50).match(dimregex);
  21734. if(ref) parse_ws_xml_dim(s, ref[1]);
  21735. }
  21736. /* 18.3.1.88 sheetViews CT_SheetViews */
  21737. var svs = data1.match(svsregex);
  21738. if(svs && svs[1]) parse_ws_xml_sheetviews(svs[1], wb);
  21739. /* 18.3.1.17 cols CT_Cols */
  21740. var columns = [];
  21741. if(opts.cellStyles) {
  21742. /* 18.3.1.13 col CT_Col */
  21743. var cols = data1.match(colregex);
  21744. if(cols) parse_ws_xml_cols(columns, cols);
  21745. }
  21746. /* 18.3.1.80 sheetData CT_SheetData ? */
  21747. if(mtch) parse_ws_xml_data(mtch[1], s, opts, refguess, themes, styles);
  21748. /* 18.3.1.2 autoFilter CT_AutoFilter */
  21749. var afilter = data2.match(afregex);
  21750. if(afilter) s['!autofilter'] = parse_ws_xml_autofilter(afilter[0]);
  21751. /* 18.3.1.55 mergeCells CT_MergeCells */
  21752. var merges = [];
  21753. var _merge = data2.match(mergecregex);
  21754. if(_merge) for(ridx = 0; ridx != _merge.length; ++ridx)
  21755. merges[ridx] = safe_decode_range(_merge[ridx].slice(_merge[ridx].indexOf("\"")+1));
  21756. /* 18.3.1.48 hyperlinks CT_Hyperlinks */
  21757. var hlink = data2.match(hlinkregex);
  21758. if(hlink) parse_ws_xml_hlinks(s, hlink, rels);
  21759. /* 18.3.1.62 pageMargins CT_PageMargins */
  21760. var margins = data2.match(marginregex);
  21761. if(margins) s['!margins'] = parse_ws_xml_margins(parsexmltag(margins[0]));
  21762. if(!s["!ref"] && refguess.e.c >= refguess.s.c && refguess.e.r >= refguess.s.r) s["!ref"] = encode_range(refguess);
  21763. if(opts.sheetRows > 0 && s["!ref"]) {
  21764. var tmpref = safe_decode_range(s["!ref"]);
  21765. if(opts.sheetRows <= +tmpref.e.r) {
  21766. tmpref.e.r = opts.sheetRows - 1;
  21767. if(tmpref.e.r > refguess.e.r) tmpref.e.r = refguess.e.r;
  21768. if(tmpref.e.r < tmpref.s.r) tmpref.s.r = tmpref.e.r;
  21769. if(tmpref.e.c > refguess.e.c) tmpref.e.c = refguess.e.c;
  21770. if(tmpref.e.c < tmpref.s.c) tmpref.s.c = tmpref.e.c;
  21771. s["!fullref"] = s["!ref"];
  21772. s["!ref"] = encode_range(tmpref);
  21773. }
  21774. }
  21775. if(columns.length > 0) s["!cols"] = columns;
  21776. if(merges.length > 0) s["!merges"] = merges;
  21777. return s;
  21778. }
  21779. function write_ws_xml_merges(merges) {
  21780. if(merges.length === 0) return "";
  21781. var o = '<mergeCells count="' + merges.length + '">';
  21782. for(var i = 0; i != merges.length; ++i) o += '<mergeCell ref="' + encode_range(merges[i]) + '"/>';
  21783. return o + '</mergeCells>';
  21784. }
  21785. /* 18.3.1.82-3 sheetPr CT_ChartsheetPr / CT_SheetPr */
  21786. function parse_ws_xml_sheetpr(sheetPr, s, wb, idx) {
  21787. var data = parsexmltag(sheetPr);
  21788. if(!wb.Sheets[idx]) wb.Sheets[idx] = {};
  21789. if(data.codeName) wb.Sheets[idx].CodeName = unescapexml(utf8read(data.codeName));
  21790. }
  21791. function write_ws_xml_sheetpr(ws, wb, idx, opts, o) {
  21792. var needed = false;
  21793. var props = {}, payload = null;
  21794. if(opts.bookType !== 'xlsx' && wb.vbaraw) {
  21795. var cname = wb.SheetNames[idx];
  21796. try { if(wb.Workbook) cname = wb.Workbook.Sheets[idx].CodeName || cname; } catch(e) {}
  21797. needed = true;
  21798. props.codeName = utf8write(escapexml(cname));
  21799. }
  21800. if(ws && ws["!outline"]) {
  21801. var outlineprops = {summaryBelow:1, summaryRight:1};
  21802. if(ws["!outline"].above) outlineprops.summaryBelow = 0;
  21803. if(ws["!outline"].left) outlineprops.summaryRight = 0;
  21804. payload = (payload||"") + writextag('outlinePr', null, outlineprops);
  21805. }
  21806. if(!needed && !payload) return;
  21807. o[o.length] = (writextag('sheetPr', payload, props));
  21808. }
  21809. /* 18.3.1.85 sheetProtection CT_SheetProtection */
  21810. var sheetprot_deffalse = ["objects", "scenarios", "selectLockedCells", "selectUnlockedCells"];
  21811. var sheetprot_deftrue = [
  21812. "formatColumns", "formatRows", "formatCells",
  21813. "insertColumns", "insertRows", "insertHyperlinks",
  21814. "deleteColumns", "deleteRows",
  21815. "sort", "autoFilter", "pivotTables"
  21816. ];
  21817. function write_ws_xml_protection(sp) {
  21818. // algorithmName, hashValue, saltValue, spinCount
  21819. var o = ({sheet:1});
  21820. sheetprot_deffalse.forEach(function(n) { if(sp[n] != null && sp[n]) o[n] = "1"; });
  21821. sheetprot_deftrue.forEach(function(n) { if(sp[n] != null && !sp[n]) o[n] = "0"; });
  21822. /* TODO: algorithm */
  21823. if(sp.password) o.password = crypto_CreatePasswordVerifier_Method1(sp.password).toString(16).toUpperCase();
  21824. return writextag('sheetProtection', null, o);
  21825. }
  21826. function parse_ws_xml_hlinks(s, data, rels) {
  21827. var dense = Array.isArray(s);
  21828. for(var i = 0; i != data.length; ++i) {
  21829. var val = parsexmltag(utf8read(data[i]), true);
  21830. if(!val.ref) return;
  21831. var rel = ((rels || {})['!id']||[])[val.id];
  21832. if(rel) {
  21833. val.Target = rel.Target;
  21834. if(val.location) val.Target += "#"+val.location;
  21835. } else {
  21836. val.Target = "#" + val.location;
  21837. rel = {Target: val.Target, TargetMode: 'Internal'};
  21838. }
  21839. val.Rel = rel;
  21840. if(val.tooltip) { val.Tooltip = val.tooltip; delete val.tooltip; }
  21841. var rng = safe_decode_range(val.ref);
  21842. for(var R=rng.s.r;R<=rng.e.r;++R) for(var C=rng.s.c;C<=rng.e.c;++C) {
  21843. var addr = encode_cell({c:C,r:R});
  21844. if(dense) {
  21845. if(!s[R]) s[R] = [];
  21846. if(!s[R][C]) s[R][C] = {t:"z",v:undefined};
  21847. s[R][C].l = val;
  21848. } else {
  21849. if(!s[addr]) s[addr] = {t:"z",v:undefined};
  21850. s[addr].l = val;
  21851. }
  21852. }
  21853. }
  21854. }
  21855. function parse_ws_xml_margins(margin) {
  21856. var o = {};
  21857. ["left", "right", "top", "bottom", "header", "footer"].forEach(function(k) {
  21858. if(margin[k]) o[k] = parseFloat(margin[k]);
  21859. });
  21860. return o;
  21861. }
  21862. function write_ws_xml_margins(margin) {
  21863. default_margins(margin);
  21864. return writextag('pageMargins', null, margin);
  21865. }
  21866. function parse_ws_xml_cols(columns, cols) {
  21867. var seencol = false;
  21868. for(var coli = 0; coli != cols.length; ++coli) {
  21869. var coll = parsexmltag(cols[coli], true);
  21870. if(coll.hidden) coll.hidden = parsexmlbool(coll.hidden);
  21871. var colm=parseInt(coll.min, 10)-1, colM=parseInt(coll.max,10)-1;
  21872. delete coll.min; delete coll.max; coll.width = +coll.width;
  21873. if(!seencol && coll.width) { seencol = true; find_mdw_colw(coll.width); }
  21874. process_col(coll);
  21875. while(colm <= colM) columns[colm++] = dup(coll);
  21876. }
  21877. }
  21878. function write_ws_xml_cols(ws, cols) {
  21879. var o = ["<cols>"], col;
  21880. for(var i = 0; i != cols.length; ++i) {
  21881. if(!(col = cols[i])) continue;
  21882. o[o.length] = (writextag('col', null, col_obj_w(i, col)));
  21883. }
  21884. o[o.length] = "</cols>";
  21885. return o.join("");
  21886. }
  21887. function parse_ws_xml_autofilter(data) {
  21888. var o = { ref: (data.match(/ref="([^"]*)"/)||[])[1]};
  21889. return o;
  21890. }
  21891. function write_ws_xml_autofilter(data, ws, wb, idx) {
  21892. var ref = typeof data.ref == "string" ? data.ref : encode_range(data.ref);
  21893. if(!wb.Workbook) wb.Workbook = ({Sheets:[]});
  21894. if(!wb.Workbook.Names) wb.Workbook.Names = [];
  21895. var names = wb.Workbook.Names;
  21896. var range = decode_range(ref);
  21897. if(range.s.r == range.e.r) { range.e.r = decode_range(ws["!ref"]).e.r; ref = encode_range(range); }
  21898. for(var i = 0; i < names.length; ++i) {
  21899. var name = names[i];
  21900. if(name.Name != '_xlnm._FilterDatabase') continue;
  21901. if(name.Sheet != idx) continue;
  21902. name.Ref = "'" + wb.SheetNames[idx] + "'!" + ref; break;
  21903. }
  21904. if(i == names.length) names.push({ Name: '_xlnm._FilterDatabase', Sheet: idx, Ref: "'" + wb.SheetNames[idx] + "'!" + ref });
  21905. return writextag("autoFilter", null, {ref:ref});
  21906. }
  21907. /* 18.3.1.88 sheetViews CT_SheetViews */
  21908. /* 18.3.1.87 sheetView CT_SheetView */
  21909. var sviewregex = /<(?:\w:)?sheetView(?:[^>a-z][^>]*)?\/?>/;
  21910. function parse_ws_xml_sheetviews(data, wb) {
  21911. if(!wb.Views) wb.Views = [{}];
  21912. (data.match(sviewregex)||[]).forEach(function(r, i) {
  21913. var tag = parsexmltag(r);
  21914. // $FlowIgnore
  21915. if(!wb.Views[i]) wb.Views[i] = {};
  21916. // $FlowIgnore
  21917. if(+tag.zoomScale) wb.Views[i].zoom = +tag.zoomScale;
  21918. // $FlowIgnore
  21919. if(parsexmlbool(tag.rightToLeft)) wb.Views[i].RTL = true;
  21920. });
  21921. }
  21922. function write_ws_xml_sheetviews(ws, opts, idx, wb) {
  21923. var sview = ({workbookViewId:"0"});
  21924. // $FlowIgnore
  21925. if((((wb||{}).Workbook||{}).Views||[])[0]) sview.rightToLeft = wb.Workbook.Views[0].RTL ? "1" : "0";
  21926. return writextag("sheetViews", writextag("sheetView", null, sview), {});
  21927. }
  21928. function write_ws_xml_cell(cell, ref, ws, opts) {
  21929. if(cell.v === undefined && typeof cell.f !== "string" || cell.t === 'z') return "";
  21930. var vv = "";
  21931. var oldt = cell.t, oldv = cell.v;
  21932. if(cell.t !== "z") switch(cell.t) {
  21933. case 'b': vv = cell.v ? "1" : "0"; break;
  21934. case 'n': vv = ''+cell.v; break;
  21935. case 'e': vv = BErr[cell.v]; break;
  21936. case 'd':
  21937. if(opts && opts.cellDates) vv = parseDate(cell.v, -1).toISOString();
  21938. else {
  21939. cell = dup(cell);
  21940. cell.t = 'n';
  21941. vv = ''+(cell.v = datenum(parseDate(cell.v)));
  21942. }
  21943. if(typeof cell.z === 'undefined') cell.z = SSF._table[14];
  21944. break;
  21945. default: vv = cell.v; break;
  21946. }
  21947. var v = writetag('v', escapexml(vv)), o = ({r:ref});
  21948. /* TODO: cell style */
  21949. var os = get_cell_style(opts.cellXfs, cell, opts);
  21950. if(os !== 0) o.s = os;
  21951. switch(cell.t) {
  21952. case 'n': break;
  21953. case 'd': o.t = "d"; break;
  21954. case 'b': o.t = "b"; break;
  21955. case 'e': o.t = "e"; break;
  21956. case 'z': break;
  21957. default: if(cell.v == null) { delete cell.t; break; }
  21958. if(opts && opts.bookSST) {
  21959. v = writetag('v', ''+get_sst_id(opts.Strings, cell.v, opts.revStrings));
  21960. o.t = "s"; break;
  21961. }
  21962. o.t = "str"; break;
  21963. }
  21964. if(cell.t != oldt) { cell.t = oldt; cell.v = oldv; }
  21965. if(typeof cell.f == "string" && cell.f) {
  21966. var ff = cell.F && cell.F.slice(0, ref.length) == ref ? {t:"array", ref:cell.F} : null;
  21967. v = writextag('f', escapexml(cell.f), ff) + (cell.v != null ? v : "");
  21968. }
  21969. if(cell.l) ws['!links'].push([ref, cell.l]);
  21970. if(cell.c) ws['!comments'].push([ref, cell.c]);
  21971. return writextag('c', v, o);
  21972. }
  21973. var parse_ws_xml_data = (function() {
  21974. var cellregex = /<(?:\w+:)?c[ \/>]/, rowregex = /<\/(?:\w+:)?row>/;
  21975. var rregex = /r=["']([^"']*)["']/, isregex = /<(?:\w+:)?is>([\S\s]*?)<\/(?:\w+:)?is>/;
  21976. var refregex = /ref=["']([^"']*)["']/;
  21977. var match_v = matchtag("v"), match_f = matchtag("f");
  21978. return function parse_ws_xml_data(sdata, s, opts, guess, themes, styles) {
  21979. var ri = 0, x = "", cells = [], cref = [], idx=0, i=0, cc=0, d="", p;
  21980. var tag, tagr = 0, tagc = 0;
  21981. var sstr, ftag;
  21982. var fmtid = 0, fillid = 0;
  21983. var do_format = Array.isArray(styles.CellXf), cf;
  21984. var arrayf = [];
  21985. var sharedf = [];
  21986. var dense = Array.isArray(s);
  21987. var rows = [], rowobj = {}, rowrite = false;
  21988. var sheetStubs = !!opts.sheetStubs;
  21989. for(var marr = sdata.split(rowregex), mt = 0, marrlen = marr.length; mt != marrlen; ++mt) {
  21990. x = marr[mt].trim();
  21991. var xlen = x.length;
  21992. if(xlen === 0) continue;
  21993. /* 18.3.1.73 row CT_Row */
  21994. for(ri = 0; ri < xlen; ++ri) if(x.charCodeAt(ri) === 62) break; ++ri;
  21995. tag = parsexmltag(x.slice(0,ri), true);
  21996. tagr = tag.r != null ? parseInt(tag.r, 10) : tagr+1; tagc = -1;
  21997. if(opts.sheetRows && opts.sheetRows < tagr) continue;
  21998. if(guess.s.r > tagr - 1) guess.s.r = tagr - 1;
  21999. if(guess.e.r < tagr - 1) guess.e.r = tagr - 1;
  22000. if(opts && opts.cellStyles) {
  22001. rowobj = {}; rowrite = false;
  22002. if(tag.ht) { rowrite = true; rowobj.hpt = parseFloat(tag.ht); rowobj.hpx = pt2px(rowobj.hpt); }
  22003. if(tag.hidden == "1") { rowrite = true; rowobj.hidden = true; }
  22004. if(tag.outlineLevel != null) { rowrite = true; rowobj.level = +tag.outlineLevel; }
  22005. if(rowrite) rows[tagr-1] = rowobj;
  22006. }
  22007. /* 18.3.1.4 c CT_Cell */
  22008. cells = x.slice(ri).split(cellregex);
  22009. for(var rslice = 0; rslice != cells.length; ++rslice) if(cells[rslice].trim().charAt(0) != "<") break;
  22010. cells = cells.slice(rslice);
  22011. for(ri = 0; ri != cells.length; ++ri) {
  22012. x = cells[ri].trim();
  22013. if(x.length === 0) continue;
  22014. cref = x.match(rregex); idx = ri; i=0; cc=0;
  22015. x = "<c " + (x.slice(0,1)=="<"?">":"") + x;
  22016. if(cref != null && cref.length === 2) {
  22017. idx = 0; d=cref[1];
  22018. for(i=0; i != d.length; ++i) {
  22019. if((cc=d.charCodeAt(i)-64) < 1 || cc > 26) break;
  22020. idx = 26*idx + cc;
  22021. }
  22022. --idx;
  22023. tagc = idx;
  22024. } else ++tagc;
  22025. for(i = 0; i != x.length; ++i) if(x.charCodeAt(i) === 62) break; ++i;
  22026. tag = parsexmltag(x.slice(0,i), true);
  22027. if(!tag.r) tag.r = encode_cell({r:tagr-1, c:tagc});
  22028. d = x.slice(i);
  22029. p = ({t:""});
  22030. if((cref=d.match(match_v))!= null && cref[1] !== '') p.v=unescapexml(cref[1]);
  22031. if(opts.cellFormula) {
  22032. if((cref=d.match(match_f))!= null && cref[1] !== '') {
  22033. /* TODO: match against XLSXFutureFunctions */
  22034. p.f=unescapexml(utf8read(cref[1])).replace(/\r\n/g, "\n");
  22035. if(!opts.xlfn) p.f = _xlfn(p.f);
  22036. if(cref[0].indexOf('t="array"') > -1) {
  22037. p.F = (d.match(refregex)||[])[1];
  22038. if(p.F.indexOf(":") > -1) arrayf.push([safe_decode_range(p.F), p.F]);
  22039. } else if(cref[0].indexOf('t="shared"') > -1) {
  22040. // TODO: parse formula
  22041. ftag = parsexmltag(cref[0]);
  22042. var ___f = unescapexml(utf8read(cref[1]));
  22043. if(!opts.xlfn) ___f = _xlfn(___f);
  22044. sharedf[parseInt(ftag.si, 10)] = [ftag, ___f, tag.r];
  22045. }
  22046. } else if((cref=d.match(/<f[^>]*\/>/))) {
  22047. ftag = parsexmltag(cref[0]);
  22048. if(sharedf[ftag.si]) p.f = shift_formula_xlsx(sharedf[ftag.si][1], sharedf[ftag.si][2]/*[0].ref*/, tag.r);
  22049. }
  22050. /* TODO: factor out contains logic */
  22051. var _tag = decode_cell(tag.r);
  22052. for(i = 0; i < arrayf.length; ++i)
  22053. if(_tag.r >= arrayf[i][0].s.r && _tag.r <= arrayf[i][0].e.r)
  22054. if(_tag.c >= arrayf[i][0].s.c && _tag.c <= arrayf[i][0].e.c)
  22055. p.F = arrayf[i][1];
  22056. }
  22057. if(tag.t == null && p.v === undefined) {
  22058. if(p.f || p.F) {
  22059. p.v = 0; p.t = "n";
  22060. } else if(!sheetStubs) continue;
  22061. else p.t = "z";
  22062. }
  22063. else p.t = tag.t || "n";
  22064. if(guess.s.c > tagc) guess.s.c = tagc;
  22065. if(guess.e.c < tagc) guess.e.c = tagc;
  22066. /* 18.18.11 t ST_CellType */
  22067. switch(p.t) {
  22068. case 'n':
  22069. if(p.v == "" || p.v == null) {
  22070. if(!sheetStubs) continue;
  22071. p.t = 'z';
  22072. } else p.v = parseFloat(p.v);
  22073. break;
  22074. case 's':
  22075. if(typeof p.v == 'undefined') {
  22076. if(!sheetStubs) continue;
  22077. p.t = 'z';
  22078. } else {
  22079. sstr = strs[parseInt(p.v, 10)];
  22080. p.v = sstr.t;
  22081. p.r = sstr.r;
  22082. if(opts.cellHTML) p.h = sstr.h;
  22083. }
  22084. break;
  22085. case 'str':
  22086. p.t = "s";
  22087. p.v = (p.v!=null) ? utf8read(p.v) : '';
  22088. if(opts.cellHTML) p.h = escapehtml(p.v);
  22089. break;
  22090. case 'inlineStr':
  22091. cref = d.match(isregex);
  22092. p.t = 's';
  22093. if(cref != null && (sstr = parse_si(cref[1]))) {
  22094. p.v = sstr.t;
  22095. if(opts.cellHTML) p.h = sstr.h;
  22096. } else p.v = "";
  22097. break;
  22098. case 'b': p.v = parsexmlbool(p.v); break;
  22099. case 'd':
  22100. if(opts.cellDates) p.v = parseDate(p.v, 1);
  22101. else { p.v = datenum(parseDate(p.v, 1)); p.t = 'n'; }
  22102. break;
  22103. /* error string in .w, number in .v */
  22104. case 'e':
  22105. if(!opts || opts.cellText !== false) p.w = p.v;
  22106. p.v = RBErr[p.v]; break;
  22107. }
  22108. /* formatting */
  22109. fmtid = fillid = 0;
  22110. cf = null;
  22111. if(do_format && tag.s !== undefined) {
  22112. cf = styles.CellXf[tag.s];
  22113. if(cf != null) {
  22114. if(cf.numFmtId != null) fmtid = cf.numFmtId;
  22115. if(opts.cellStyles) {
  22116. if(cf.fillId != null) fillid = cf.fillId;
  22117. }
  22118. }
  22119. }
  22120. safe_format(p, fmtid, fillid, opts, themes, styles);
  22121. if(opts.cellDates && do_format && p.t == 'n' && SSF.is_date(SSF._table[fmtid])) { p.t = 'd'; p.v = numdate(p.v); }
  22122. if(dense) {
  22123. var _r = decode_cell(tag.r);
  22124. if(!s[_r.r]) s[_r.r] = [];
  22125. s[_r.r][_r.c] = p;
  22126. } else s[tag.r] = p;
  22127. }
  22128. }
  22129. if(rows.length > 0) s['!rows'] = rows;
  22130. }; })();
  22131. function write_ws_xml_data(ws, opts, idx, wb) {
  22132. var o = [], r = [], range = safe_decode_range(ws['!ref']), cell="", ref, rr = "", cols = [], R=0, C=0, rows = ws['!rows'];
  22133. var dense = Array.isArray(ws);
  22134. var params = ({r:rr}), row, height = -1;
  22135. for(C = range.s.c; C <= range.e.c; ++C) cols[C] = encode_col(C);
  22136. for(R = range.s.r; R <= range.e.r; ++R) {
  22137. r = [];
  22138. rr = encode_row(R);
  22139. for(C = range.s.c; C <= range.e.c; ++C) {
  22140. ref = cols[C] + rr;
  22141. var _cell = dense ? (ws[R]||[])[C]: ws[ref];
  22142. if(_cell === undefined) continue;
  22143. if((cell = write_ws_xml_cell(_cell, ref, ws, opts, idx, wb)) != null) r.push(cell);
  22144. }
  22145. if(r.length > 0 || (rows && rows[R])) {
  22146. params = ({r:rr});
  22147. if(rows && rows[R]) {
  22148. row = rows[R];
  22149. if(row.hidden) params.hidden = 1;
  22150. height = -1;
  22151. if(row.hpx) height = px2pt(row.hpx);
  22152. else if(row.hpt) height = row.hpt;
  22153. if(height > -1) { params.ht = height; params.customHeight = 1; }
  22154. if(row.level) { params.outlineLevel = row.level; }
  22155. }
  22156. o[o.length] = (writextag('row', r.join(""), params));
  22157. }
  22158. }
  22159. if(rows) for(; R < rows.length; ++R) {
  22160. if(rows && rows[R]) {
  22161. params = ({r:R+1});
  22162. row = rows[R];
  22163. if(row.hidden) params.hidden = 1;
  22164. height = -1;
  22165. if (row.hpx) height = px2pt(row.hpx);
  22166. else if (row.hpt) height = row.hpt;
  22167. if (height > -1) { params.ht = height; params.customHeight = 1; }
  22168. if (row.level) { params.outlineLevel = row.level; }
  22169. o[o.length] = (writextag('row', "", params));
  22170. }
  22171. }
  22172. return o.join("");
  22173. }
  22174. var WS_XML_ROOT = writextag('worksheet', null, {
  22175. 'xmlns': XMLNS.main[0],
  22176. 'xmlns:r': XMLNS.r
  22177. });
  22178. function write_ws_xml(idx, opts, wb, rels) {
  22179. var o = [XML_HEADER, WS_XML_ROOT];
  22180. var s = wb.SheetNames[idx], sidx = 0, rdata = "";
  22181. var ws = wb.Sheets[s];
  22182. if(ws == null) ws = {};
  22183. var ref = ws['!ref'] || 'A1';
  22184. var range = safe_decode_range(ref);
  22185. if(range.e.c > 0x3FFF || range.e.r > 0xFFFFF) {
  22186. if(opts.WTF) throw new Error("Range " + ref + " exceeds format limit A1:XFD1048576");
  22187. range.e.c = Math.min(range.e.c, 0x3FFF);
  22188. range.e.r = Math.min(range.e.c, 0xFFFFF);
  22189. ref = encode_range(range);
  22190. }
  22191. if(!rels) rels = {};
  22192. ws['!comments'] = [];
  22193. var _drawing = [];
  22194. write_ws_xml_sheetpr(ws, wb, idx, opts, o);
  22195. o[o.length] = (writextag('dimension', null, {'ref': ref}));
  22196. o[o.length] = write_ws_xml_sheetviews(ws, opts, idx, wb);
  22197. /* TODO: store in WB, process styles */
  22198. if(opts.sheetFormat) o[o.length] = (writextag('sheetFormatPr', null, {
  22199. defaultRowHeight:opts.sheetFormat.defaultRowHeight||'16',
  22200. baseColWidth:opts.sheetFormat.baseColWidth||'10',
  22201. outlineLevelRow:opts.sheetFormat.outlineLevelRow||'7'
  22202. }));
  22203. if(ws['!cols'] != null && ws['!cols'].length > 0) o[o.length] = (write_ws_xml_cols(ws, ws['!cols']));
  22204. o[sidx = o.length] = '<sheetData/>';
  22205. ws['!links'] = [];
  22206. if(ws['!ref'] != null) {
  22207. rdata = write_ws_xml_data(ws, opts, idx, wb, rels);
  22208. if(rdata.length > 0) o[o.length] = (rdata);
  22209. }
  22210. if(o.length>sidx+1) { o[o.length] = ('</sheetData>'); o[sidx]=o[sidx].replace("/>",">"); }
  22211. /* sheetCalcPr */
  22212. if(ws['!protect'] != null) o[o.length] = write_ws_xml_protection(ws['!protect']);
  22213. /* protectedRanges */
  22214. /* scenarios */
  22215. if(ws['!autofilter'] != null) o[o.length] = write_ws_xml_autofilter(ws['!autofilter'], ws, wb, idx);
  22216. /* sortState */
  22217. /* dataConsolidate */
  22218. /* customSheetViews */
  22219. if(ws['!merges'] != null && ws['!merges'].length > 0) o[o.length] = (write_ws_xml_merges(ws['!merges']));
  22220. /* phoneticPr */
  22221. /* conditionalFormatting */
  22222. /* dataValidations */
  22223. var relc = -1, rel, rId = -1;
  22224. if(ws['!links'].length > 0) {
  22225. o[o.length] = "<hyperlinks>";
  22226. ws['!links'].forEach(function(l) {
  22227. if(!l[1].Target) return;
  22228. rel = ({"ref":l[0]});
  22229. if(l[1].Target.charAt(0) != "#") {
  22230. rId = add_rels(rels, -1, escapexml(l[1].Target).replace(/#.*$/, ""), RELS.HLINK);
  22231. rel["r:id"] = "rId"+rId;
  22232. }
  22233. if((relc = l[1].Target.indexOf("#")) > -1) rel.location = escapexml(l[1].Target.slice(relc+1));
  22234. if(l[1].Tooltip) rel.tooltip = escapexml(l[1].Tooltip);
  22235. o[o.length] = writextag("hyperlink",null,rel);
  22236. });
  22237. o[o.length] = "</hyperlinks>";
  22238. }
  22239. delete ws['!links'];
  22240. /* printOptions */
  22241. if(ws['!margins'] != null) o[o.length] = write_ws_xml_margins(ws['!margins']);
  22242. /* pageSetup */
  22243. /* headerFooter */
  22244. /* rowBreaks */
  22245. /* colBreaks */
  22246. /* customProperties */
  22247. /* cellWatches */
  22248. if(!opts || opts.ignoreEC || (opts.ignoreEC == (void 0))) o[o.length] = writetag("ignoredErrors", writextag("ignoredError", null, {numberStoredAsText:1, sqref:ref}));
  22249. /* smartTags */
  22250. if(_drawing.length > 0) {
  22251. rId = add_rels(rels, -1, "../drawings/drawing" + (idx+1) + ".xml", RELS.DRAW);
  22252. o[o.length] = writextag("drawing", null, {"r:id":"rId" + rId});
  22253. ws['!drawing'] = _drawing;
  22254. }
  22255. if(ws['!comments'].length > 0) {
  22256. rId = add_rels(rels, -1, "../drawings/vmlDrawing" + (idx+1) + ".vml", RELS.VML);
  22257. o[o.length] = writextag("legacyDrawing", null, {"r:id":"rId" + rId});
  22258. ws['!legacy'] = rId;
  22259. }
  22260. /* legacyDrawingHF */
  22261. /* picture */
  22262. /* oleObjects */
  22263. /* controls */
  22264. /* webPublishItems */
  22265. /* tableParts */
  22266. /* extLst */
  22267. if(o.length>1) { o[o.length] = ('</worksheet>'); o[1]=o[1].replace("/>",">"); }
  22268. return o.join("");
  22269. }
  22270. /* [MS-XLSB] 2.4.726 BrtRowHdr */
  22271. function parse_BrtRowHdr(data, length) {
  22272. var z = ({});
  22273. var tgt = data.l + length;
  22274. z.r = data.read_shift(4);
  22275. data.l += 4; // TODO: ixfe
  22276. var miyRw = data.read_shift(2);
  22277. data.l += 1; // TODO: top/bot padding
  22278. var flags = data.read_shift(1);
  22279. data.l = tgt;
  22280. if(flags & 0x07) z.level = flags & 0x07;
  22281. if(flags & 0x10) z.hidden = true;
  22282. if(flags & 0x20) z.hpt = miyRw / 20;
  22283. return z;
  22284. }
  22285. function write_BrtRowHdr(R, range, ws) {
  22286. var o = new_buf(17+8*16);
  22287. var row = (ws['!rows']||[])[R]||{};
  22288. o.write_shift(4, R);
  22289. o.write_shift(4, 0); /* TODO: ixfe */
  22290. var miyRw = 0x0140;
  22291. if(row.hpx) miyRw = px2pt(row.hpx) * 20;
  22292. else if(row.hpt) miyRw = row.hpt * 20;
  22293. o.write_shift(2, miyRw);
  22294. o.write_shift(1, 0); /* top/bot padding */
  22295. var flags = 0x0;
  22296. if(row.level) flags |= row.level;
  22297. if(row.hidden) flags |= 0x10;
  22298. if(row.hpx || row.hpt) flags |= 0x20;
  22299. o.write_shift(1, flags);
  22300. o.write_shift(1, 0); /* phonetic guide */
  22301. /* [MS-XLSB] 2.5.8 BrtColSpan explains the mechanism */
  22302. var ncolspan = 0, lcs = o.l;
  22303. o.l += 4;
  22304. var caddr = {r:R, c:0};
  22305. for(var i = 0; i < 16; ++i) {
  22306. if((range.s.c > ((i+1) << 10)) || (range.e.c < (i << 10))) continue;
  22307. var first = -1, last = -1;
  22308. for(var j = (i<<10); j < ((i+1)<<10); ++j) {
  22309. caddr.c = j;
  22310. var cell = Array.isArray(ws) ? (ws[caddr.r]||[])[caddr.c] : ws[encode_cell(caddr)];
  22311. if(cell) { if(first < 0) first = j; last = j; }
  22312. }
  22313. if(first < 0) continue;
  22314. ++ncolspan;
  22315. o.write_shift(4, first);
  22316. o.write_shift(4, last);
  22317. }
  22318. var l = o.l;
  22319. o.l = lcs;
  22320. o.write_shift(4, ncolspan);
  22321. o.l = l;
  22322. return o.length > o.l ? o.slice(0, o.l) : o;
  22323. }
  22324. function write_row_header(ba, ws, range, R) {
  22325. var o = write_BrtRowHdr(R, range, ws);
  22326. if((o.length > 17) || (ws['!rows']||[])[R]) write_record(ba, 'BrtRowHdr', o);
  22327. }
  22328. /* [MS-XLSB] 2.4.820 BrtWsDim */
  22329. var parse_BrtWsDim = parse_UncheckedRfX;
  22330. var write_BrtWsDim = write_UncheckedRfX;
  22331. /* [MS-XLSB] 2.4.821 BrtWsFmtInfo */
  22332. function parse_BrtWsFmtInfo() {
  22333. }
  22334. //function write_BrtWsFmtInfo(ws, o) { }
  22335. /* [MS-XLSB] 2.4.823 BrtWsProp */
  22336. function parse_BrtWsProp(data, length) {
  22337. var z = {};
  22338. /* TODO: pull flags */
  22339. data.l += 19;
  22340. z.name = parse_XLSBCodeName(data, length - 19);
  22341. return z;
  22342. }
  22343. function write_BrtWsProp(str, o) {
  22344. if(o == null) o = new_buf(84+4*str.length);
  22345. for(var i = 0; i < 3; ++i) o.write_shift(1,0);
  22346. write_BrtColor({auto:1}, o);
  22347. o.write_shift(-4,-1);
  22348. o.write_shift(-4,-1);
  22349. write_XLSBCodeName(str, o);
  22350. return o.slice(0, o.l);
  22351. }
  22352. /* [MS-XLSB] 2.4.306 BrtCellBlank */
  22353. function parse_BrtCellBlank(data) {
  22354. var cell = parse_XLSBCell(data);
  22355. return [cell];
  22356. }
  22357. function write_BrtCellBlank(cell, ncell, o) {
  22358. if(o == null) o = new_buf(8);
  22359. return write_XLSBCell(ncell, o);
  22360. }
  22361. function parse_BrtShortBlank(data) {
  22362. var cell = parse_XLSBShortCell(data);
  22363. return [cell];
  22364. }
  22365. function write_BrtShortBlank(cell, ncell, o) {
  22366. if(o == null) o = new_buf(4);
  22367. return write_XLSBShortCell(ncell, o);
  22368. }
  22369. /* [MS-XLSB] 2.4.307 BrtCellBool */
  22370. function parse_BrtCellBool(data) {
  22371. var cell = parse_XLSBCell(data);
  22372. var fBool = data.read_shift(1);
  22373. return [cell, fBool, 'b'];
  22374. }
  22375. function write_BrtCellBool(cell, ncell, o) {
  22376. if(o == null) o = new_buf(9);
  22377. write_XLSBCell(ncell, o);
  22378. o.write_shift(1, cell.v ? 1 : 0);
  22379. return o;
  22380. }
  22381. function parse_BrtShortBool(data) {
  22382. var cell = parse_XLSBShortCell(data);
  22383. var fBool = data.read_shift(1);
  22384. return [cell, fBool, 'b'];
  22385. }
  22386. function write_BrtShortBool(cell, ncell, o) {
  22387. if(o == null) o = new_buf(5);
  22388. write_XLSBShortCell(ncell, o);
  22389. o.write_shift(1, cell.v ? 1 : 0);
  22390. return o;
  22391. }
  22392. /* [MS-XLSB] 2.4.308 BrtCellError */
  22393. function parse_BrtCellError(data) {
  22394. var cell = parse_XLSBCell(data);
  22395. var bError = data.read_shift(1);
  22396. return [cell, bError, 'e'];
  22397. }
  22398. function write_BrtCellError(cell, ncell, o) {
  22399. if(o == null) o = new_buf(9);
  22400. write_XLSBCell(ncell, o);
  22401. o.write_shift(1, cell.v);
  22402. return o;
  22403. }
  22404. function parse_BrtShortError(data) {
  22405. var cell = parse_XLSBShortCell(data);
  22406. var bError = data.read_shift(1);
  22407. return [cell, bError, 'e'];
  22408. }
  22409. function write_BrtShortError(cell, ncell, o) {
  22410. if(o == null) o = new_buf(8);
  22411. write_XLSBShortCell(ncell, o);
  22412. o.write_shift(1, cell.v);
  22413. o.write_shift(2, 0);
  22414. o.write_shift(1, 0);
  22415. return o;
  22416. }
  22417. /* [MS-XLSB] 2.4.311 BrtCellIsst */
  22418. function parse_BrtCellIsst(data) {
  22419. var cell = parse_XLSBCell(data);
  22420. var isst = data.read_shift(4);
  22421. return [cell, isst, 's'];
  22422. }
  22423. function write_BrtCellIsst(cell, ncell, o) {
  22424. if(o == null) o = new_buf(12);
  22425. write_XLSBCell(ncell, o);
  22426. o.write_shift(4, ncell.v);
  22427. return o;
  22428. }
  22429. function parse_BrtShortIsst(data) {
  22430. var cell = parse_XLSBShortCell(data);
  22431. var isst = data.read_shift(4);
  22432. return [cell, isst, 's'];
  22433. }
  22434. function write_BrtShortIsst(cell, ncell, o) {
  22435. if(o == null) o = new_buf(8);
  22436. write_XLSBShortCell(ncell, o);
  22437. o.write_shift(4, ncell.v);
  22438. return o;
  22439. }
  22440. /* [MS-XLSB] 2.4.313 BrtCellReal */
  22441. function parse_BrtCellReal(data) {
  22442. var cell = parse_XLSBCell(data);
  22443. var value = parse_Xnum(data);
  22444. return [cell, value, 'n'];
  22445. }
  22446. function write_BrtCellReal(cell, ncell, o) {
  22447. if(o == null) o = new_buf(16);
  22448. write_XLSBCell(ncell, o);
  22449. write_Xnum(cell.v, o);
  22450. return o;
  22451. }
  22452. function parse_BrtShortReal(data) {
  22453. var cell = parse_XLSBShortCell(data);
  22454. var value = parse_Xnum(data);
  22455. return [cell, value, 'n'];
  22456. }
  22457. function write_BrtShortReal(cell, ncell, o) {
  22458. if(o == null) o = new_buf(12);
  22459. write_XLSBShortCell(ncell, o);
  22460. write_Xnum(cell.v, o);
  22461. return o;
  22462. }
  22463. /* [MS-XLSB] 2.4.314 BrtCellRk */
  22464. function parse_BrtCellRk(data) {
  22465. var cell = parse_XLSBCell(data);
  22466. var value = parse_RkNumber(data);
  22467. return [cell, value, 'n'];
  22468. }
  22469. function write_BrtCellRk(cell, ncell, o) {
  22470. if(o == null) o = new_buf(12);
  22471. write_XLSBCell(ncell, o);
  22472. write_RkNumber(cell.v, o);
  22473. return o;
  22474. }
  22475. function parse_BrtShortRk(data) {
  22476. var cell = parse_XLSBShortCell(data);
  22477. var value = parse_RkNumber(data);
  22478. return [cell, value, 'n'];
  22479. }
  22480. function write_BrtShortRk(cell, ncell, o) {
  22481. if(o == null) o = new_buf(8);
  22482. write_XLSBShortCell(ncell, o);
  22483. write_RkNumber(cell.v, o);
  22484. return o;
  22485. }
  22486. /* [MS-XLSB] 2.4.317 BrtCellSt */
  22487. function parse_BrtCellSt(data) {
  22488. var cell = parse_XLSBCell(data);
  22489. var value = parse_XLWideString(data);
  22490. return [cell, value, 'str'];
  22491. }
  22492. function write_BrtCellSt(cell, ncell, o) {
  22493. if(o == null) o = new_buf(12 + 4 * cell.v.length);
  22494. write_XLSBCell(ncell, o);
  22495. write_XLWideString(cell.v, o);
  22496. return o.length > o.l ? o.slice(0, o.l) : o;
  22497. }
  22498. function parse_BrtShortSt(data) {
  22499. var cell = parse_XLSBShortCell(data);
  22500. var value = parse_XLWideString(data);
  22501. return [cell, value, 'str'];
  22502. }
  22503. function write_BrtShortSt(cell, ncell, o) {
  22504. if(o == null) o = new_buf(8 + 4 * cell.v.length);
  22505. write_XLSBShortCell(ncell, o);
  22506. write_XLWideString(cell.v, o);
  22507. return o.length > o.l ? o.slice(0, o.l) : o;
  22508. }
  22509. /* [MS-XLSB] 2.4.653 BrtFmlaBool */
  22510. function parse_BrtFmlaBool(data, length, opts) {
  22511. var end = data.l + length;
  22512. var cell = parse_XLSBCell(data);
  22513. cell.r = opts['!row'];
  22514. var value = data.read_shift(1);
  22515. var o = [cell, value, 'b'];
  22516. if(opts.cellFormula) {
  22517. data.l += 2;
  22518. var formula = parse_XLSBCellParsedFormula(data, end - data.l, opts);
  22519. o[3] = stringify_formula(formula, null/*range*/, cell, opts.supbooks, opts);/* TODO */
  22520. }
  22521. else data.l = end;
  22522. return o;
  22523. }
  22524. /* [MS-XLSB] 2.4.654 BrtFmlaError */
  22525. function parse_BrtFmlaError(data, length, opts) {
  22526. var end = data.l + length;
  22527. var cell = parse_XLSBCell(data);
  22528. cell.r = opts['!row'];
  22529. var value = data.read_shift(1);
  22530. var o = [cell, value, 'e'];
  22531. if(opts.cellFormula) {
  22532. data.l += 2;
  22533. var formula = parse_XLSBCellParsedFormula(data, end - data.l, opts);
  22534. o[3] = stringify_formula(formula, null/*range*/, cell, opts.supbooks, opts);/* TODO */
  22535. }
  22536. else data.l = end;
  22537. return o;
  22538. }
  22539. /* [MS-XLSB] 2.4.655 BrtFmlaNum */
  22540. function parse_BrtFmlaNum(data, length, opts) {
  22541. var end = data.l + length;
  22542. var cell = parse_XLSBCell(data);
  22543. cell.r = opts['!row'];
  22544. var value = parse_Xnum(data);
  22545. var o = [cell, value, 'n'];
  22546. if(opts.cellFormula) {
  22547. data.l += 2;
  22548. var formula = parse_XLSBCellParsedFormula(data, end - data.l, opts);
  22549. o[3] = stringify_formula(formula, null/*range*/, cell, opts.supbooks, opts);/* TODO */
  22550. }
  22551. else data.l = end;
  22552. return o;
  22553. }
  22554. /* [MS-XLSB] 2.4.656 BrtFmlaString */
  22555. function parse_BrtFmlaString(data, length, opts) {
  22556. var end = data.l + length;
  22557. var cell = parse_XLSBCell(data);
  22558. cell.r = opts['!row'];
  22559. var value = parse_XLWideString(data);
  22560. var o = [cell, value, 'str'];
  22561. if(opts.cellFormula) {
  22562. data.l += 2;
  22563. var formula = parse_XLSBCellParsedFormula(data, end - data.l, opts);
  22564. o[3] = stringify_formula(formula, null/*range*/, cell, opts.supbooks, opts);/* TODO */
  22565. }
  22566. else data.l = end;
  22567. return o;
  22568. }
  22569. /* [MS-XLSB] 2.4.682 BrtMergeCell */
  22570. var parse_BrtMergeCell = parse_UncheckedRfX;
  22571. var write_BrtMergeCell = write_UncheckedRfX;
  22572. /* [MS-XLSB] 2.4.107 BrtBeginMergeCells */
  22573. function write_BrtBeginMergeCells(cnt, o) {
  22574. if(o == null) o = new_buf(4);
  22575. o.write_shift(4, cnt);
  22576. return o;
  22577. }
  22578. /* [MS-XLSB] 2.4.662 BrtHLink */
  22579. function parse_BrtHLink(data, length) {
  22580. var end = data.l + length;
  22581. var rfx = parse_UncheckedRfX(data, 16);
  22582. var relId = parse_XLNullableWideString(data);
  22583. var loc = parse_XLWideString(data);
  22584. var tooltip = parse_XLWideString(data);
  22585. var display = parse_XLWideString(data);
  22586. data.l = end;
  22587. var o = ({rfx:rfx, relId:relId, loc:loc, display:display});
  22588. if(tooltip) o.Tooltip = tooltip;
  22589. return o;
  22590. }
  22591. function write_BrtHLink(l, rId) {
  22592. var o = new_buf(50+4*(l[1].Target.length + (l[1].Tooltip || "").length));
  22593. write_UncheckedRfX({s:decode_cell(l[0]), e:decode_cell(l[0])}, o);
  22594. write_RelID("rId" + rId, o);
  22595. var locidx = l[1].Target.indexOf("#");
  22596. var loc = locidx == -1 ? "" : l[1].Target.slice(locidx+1);
  22597. write_XLWideString(loc || "", o);
  22598. write_XLWideString(l[1].Tooltip || "", o);
  22599. write_XLWideString("", o);
  22600. return o.slice(0, o.l);
  22601. }
  22602. /* [MS-XLSB] 2.4.692 BrtPane */
  22603. function parse_BrtPane(/*data, length, opts*/) {
  22604. }
  22605. /* [MS-XLSB] 2.4.6 BrtArrFmla */
  22606. function parse_BrtArrFmla(data, length, opts) {
  22607. var end = data.l + length;
  22608. var rfx = parse_RfX(data, 16);
  22609. var fAlwaysCalc = data.read_shift(1);
  22610. var o = [rfx]; o[2] = fAlwaysCalc;
  22611. if(opts.cellFormula) {
  22612. var formula = parse_XLSBArrayParsedFormula(data, end - data.l, opts);
  22613. o[1] = formula;
  22614. } else data.l = end;
  22615. return o;
  22616. }
  22617. /* [MS-XLSB] 2.4.750 BrtShrFmla */
  22618. function parse_BrtShrFmla(data, length, opts) {
  22619. var end = data.l + length;
  22620. var rfx = parse_UncheckedRfX(data, 16);
  22621. var o = [rfx];
  22622. if(opts.cellFormula) {
  22623. var formula = parse_XLSBSharedParsedFormula(data, end - data.l, opts);
  22624. o[1] = formula;
  22625. data.l = end;
  22626. } else data.l = end;
  22627. return o;
  22628. }
  22629. /* [MS-XLSB] 2.4.323 BrtColInfo */
  22630. /* TODO: once XLS ColInfo is set, combine the functions */
  22631. function write_BrtColInfo(C, col, o) {
  22632. if(o == null) o = new_buf(18);
  22633. var p = col_obj_w(C, col);
  22634. o.write_shift(-4, C);
  22635. o.write_shift(-4, C);
  22636. o.write_shift(4, (p.width || 10) * 256);
  22637. o.write_shift(4, 0/*ixfe*/); // style
  22638. var flags = 0;
  22639. if(col.hidden) flags |= 0x01;
  22640. if(typeof p.width == 'number') flags |= 0x02;
  22641. if(col.level) flags |= (col.level << 8);
  22642. o.write_shift(2, flags); // bit flag
  22643. return o;
  22644. }
  22645. /* [MS-XLSB] 2.4.678 BrtMargins */
  22646. var BrtMarginKeys = ["left","right","top","bottom","header","footer"];
  22647. function parse_BrtMargins(data) {
  22648. var margins = ({});
  22649. BrtMarginKeys.forEach(function(k) { margins[k] = parse_Xnum(data, 8); });
  22650. return margins;
  22651. }
  22652. function write_BrtMargins(margins, o) {
  22653. if(o == null) o = new_buf(6*8);
  22654. default_margins(margins);
  22655. BrtMarginKeys.forEach(function(k) { write_Xnum((margins)[k], o); });
  22656. return o;
  22657. }
  22658. /* [MS-XLSB] 2.4.299 BrtBeginWsView */
  22659. function parse_BrtBeginWsView(data) {
  22660. var f = data.read_shift(2);
  22661. data.l += 28;
  22662. return { RTL: f & 0x20 };
  22663. }
  22664. function write_BrtBeginWsView(ws, Workbook, o) {
  22665. if(o == null) o = new_buf(30);
  22666. var f = 0x39c;
  22667. if((((Workbook||{}).Views||[])[0]||{}).RTL) f |= 0x20;
  22668. o.write_shift(2, f); // bit flag
  22669. o.write_shift(4, 0);
  22670. o.write_shift(4, 0); // view first row
  22671. o.write_shift(4, 0); // view first col
  22672. o.write_shift(1, 0); // gridline color ICV
  22673. o.write_shift(1, 0);
  22674. o.write_shift(2, 0);
  22675. o.write_shift(2, 100); // zoom scale
  22676. o.write_shift(2, 0);
  22677. o.write_shift(2, 0);
  22678. o.write_shift(2, 0);
  22679. o.write_shift(4, 0); // workbook view id
  22680. return o;
  22681. }
  22682. /* [MS-XLSB] 2.4.309 BrtCellIgnoreEC */
  22683. function write_BrtCellIgnoreEC(ref) {
  22684. var o = new_buf(24);
  22685. o.write_shift(4, 4);
  22686. o.write_shift(4, 1);
  22687. write_UncheckedRfX(ref, o);
  22688. return o;
  22689. }
  22690. /* [MS-XLSB] 2.4.748 BrtSheetProtection */
  22691. function write_BrtSheetProtection(sp, o) {
  22692. if(o == null) o = new_buf(16*4+2);
  22693. o.write_shift(2, sp.password ? crypto_CreatePasswordVerifier_Method1(sp.password) : 0);
  22694. o.write_shift(4, 1); // this record should not be written if no protection
  22695. [
  22696. ["objects", false], // fObjects
  22697. ["scenarios", false], // fScenarios
  22698. ["formatCells", true], // fFormatCells
  22699. ["formatColumns", true], // fFormatColumns
  22700. ["formatRows", true], // fFormatRows
  22701. ["insertColumns", true], // fInsertColumns
  22702. ["insertRows", true], // fInsertRows
  22703. ["insertHyperlinks", true], // fInsertHyperlinks
  22704. ["deleteColumns", true], // fDeleteColumns
  22705. ["deleteRows", true], // fDeleteRows
  22706. ["selectLockedCells", false], // fSelLockedCells
  22707. ["sort", true], // fSort
  22708. ["autoFilter", true], // fAutoFilter
  22709. ["pivotTables", true], // fPivotTables
  22710. ["selectUnlockedCells", false] // fSelUnlockedCells
  22711. ].forEach(function(n) {
  22712. if(n[1]) o.write_shift(4, sp[n[0]] != null && !sp[n[0]] ? 1 : 0);
  22713. else o.write_shift(4, sp[n[0]] != null && sp[n[0]] ? 0 : 1);
  22714. });
  22715. return o;
  22716. }
  22717. function parse_BrtDVal(/*data, length, opts*/) {
  22718. }
  22719. function parse_BrtDVal14(/*data, length, opts*/) {
  22720. }
  22721. /* [MS-XLSB] 2.1.7.61 Worksheet */
  22722. function parse_ws_bin(data, _opts, idx, rels, wb, themes, styles) {
  22723. if(!data) return data;
  22724. var opts = _opts || {};
  22725. if(!rels) rels = {'!id':{}};
  22726. if(DENSE != null && opts.dense == null) opts.dense = DENSE;
  22727. var s = (opts.dense ? [] : {});
  22728. var ref;
  22729. var refguess = {s: {r:2000000, c:2000000}, e: {r:0, c:0} };
  22730. var state = [];
  22731. var pass = false, end = false;
  22732. var row, p, cf, R, C, addr, sstr, rr, cell;
  22733. var merges = [];
  22734. opts.biff = 12;
  22735. opts['!row'] = 0;
  22736. var ai = 0, af = false;
  22737. var arrayf = [];
  22738. var sharedf = {};
  22739. var supbooks = opts.supbooks || wb.supbooks || ([[]]);
  22740. supbooks.sharedf = sharedf;
  22741. supbooks.arrayf = arrayf;
  22742. supbooks.SheetNames = wb.SheetNames || wb.Sheets.map(function(x) { return x.name; });
  22743. if(!opts.supbooks) {
  22744. opts.supbooks = supbooks;
  22745. if(wb.Names) for(var i = 0; i < wb.Names.length; ++i) supbooks[0][i+1] = wb.Names[i];
  22746. }
  22747. var colinfo = [], rowinfo = [];
  22748. var seencol = false;
  22749. XLSBRecordEnum[0x0010] = { n:"BrtShortReal", f:parse_BrtShortReal };
  22750. recordhopper(data, function ws_parse(val, R_n, RT) {
  22751. if(end) return;
  22752. switch(RT) {
  22753. case 0x0094: /* 'BrtWsDim' */
  22754. ref = val; break;
  22755. case 0x0000: /* 'BrtRowHdr' */
  22756. row = val;
  22757. if(opts.sheetRows && opts.sheetRows <= row.r) end=true;
  22758. rr = encode_row(R = row.r);
  22759. opts['!row'] = row.r;
  22760. if(val.hidden || val.hpt || val.level != null) {
  22761. if(val.hpt) val.hpx = pt2px(val.hpt);
  22762. rowinfo[val.r] = val;
  22763. }
  22764. break;
  22765. case 0x0002: /* 'BrtCellRk' */
  22766. case 0x0003: /* 'BrtCellError' */
  22767. case 0x0004: /* 'BrtCellBool' */
  22768. case 0x0005: /* 'BrtCellReal' */
  22769. case 0x0006: /* 'BrtCellSt' */
  22770. case 0x0007: /* 'BrtCellIsst' */
  22771. case 0x0008: /* 'BrtFmlaString' */
  22772. case 0x0009: /* 'BrtFmlaNum' */
  22773. case 0x000A: /* 'BrtFmlaBool' */
  22774. case 0x000B: /* 'BrtFmlaError' */
  22775. case 0x000D: /* 'BrtShortRk' */
  22776. case 0x000E: /* 'BrtShortError' */
  22777. case 0x000F: /* 'BrtShortBool' */
  22778. case 0x0010: /* 'BrtShortReal' */
  22779. case 0x0011: /* 'BrtShortSt' */
  22780. case 0x0012: /* 'BrtShortIsst' */
  22781. p = ({t:val[2]});
  22782. switch(val[2]) {
  22783. case 'n': p.v = val[1]; break;
  22784. case 's': sstr = strs[val[1]]; p.v = sstr.t; p.r = sstr.r; break;
  22785. case 'b': p.v = val[1] ? true : false; break;
  22786. case 'e': p.v = val[1]; if(opts.cellText !== false) p.w = BErr[p.v]; break;
  22787. case 'str': p.t = 's'; p.v = val[1]; break;
  22788. }
  22789. if((cf = styles.CellXf[val[0].iStyleRef])) safe_format(p,cf.numFmtId,null,opts, themes, styles);
  22790. C = val[0].c == -1 ? C + 1 : val[0].c;
  22791. if(opts.dense) { if(!s[R]) s[R] = []; s[R][C] = p; }
  22792. else s[encode_col(C) + rr] = p;
  22793. if(opts.cellFormula) {
  22794. af = false;
  22795. for(ai = 0; ai < arrayf.length; ++ai) {
  22796. var aii = arrayf[ai];
  22797. if(row.r >= aii[0].s.r && row.r <= aii[0].e.r)
  22798. if(C >= aii[0].s.c && C <= aii[0].e.c) {
  22799. p.F = encode_range(aii[0]); af = true;
  22800. }
  22801. }
  22802. if(!af && val.length > 3) p.f = val[3];
  22803. }
  22804. if(refguess.s.r > row.r) refguess.s.r = row.r;
  22805. if(refguess.s.c > C) refguess.s.c = C;
  22806. if(refguess.e.r < row.r) refguess.e.r = row.r;
  22807. if(refguess.e.c < C) refguess.e.c = C;
  22808. if(opts.cellDates && cf && p.t == 'n' && SSF.is_date(SSF._table[cf.numFmtId])) {
  22809. var _d = SSF.parse_date_code(p.v); if(_d) { p.t = 'd'; p.v = new Date(_d.y, _d.m-1,_d.d,_d.H,_d.M,_d.S,_d.u); }
  22810. }
  22811. break;
  22812. case 0x0001: /* 'BrtCellBlank' */
  22813. case 0x000C: /* 'BrtShortBlank' */
  22814. if(!opts.sheetStubs || pass) break;
  22815. p = ({t:'z',v:undefined});
  22816. C = val[0].c == -1 ? C + 1 : val[0].c;
  22817. if(opts.dense) { if(!s[R]) s[R] = []; s[R][C] = p; }
  22818. else s[encode_col(C) + rr] = p;
  22819. if(refguess.s.r > row.r) refguess.s.r = row.r;
  22820. if(refguess.s.c > C) refguess.s.c = C;
  22821. if(refguess.e.r < row.r) refguess.e.r = row.r;
  22822. if(refguess.e.c < C) refguess.e.c = C;
  22823. break;
  22824. case 0x00B0: /* 'BrtMergeCell' */
  22825. merges.push(val); break;
  22826. case 0x01EE: /* 'BrtHLink' */
  22827. var rel = rels['!id'][val.relId];
  22828. if(rel) {
  22829. val.Target = rel.Target;
  22830. if(val.loc) val.Target += "#"+val.loc;
  22831. val.Rel = rel;
  22832. } else if(val.relId == '') {
  22833. val.Target = "#" + val.loc;
  22834. }
  22835. for(R=val.rfx.s.r;R<=val.rfx.e.r;++R) for(C=val.rfx.s.c;C<=val.rfx.e.c;++C) {
  22836. if(opts.dense) {
  22837. if(!s[R]) s[R] = [];
  22838. if(!s[R][C]) s[R][C] = {t:'z',v:undefined};
  22839. s[R][C].l = val;
  22840. } else {
  22841. addr = encode_cell({c:C,r:R});
  22842. if(!s[addr]) s[addr] = {t:'z',v:undefined};
  22843. s[addr].l = val;
  22844. }
  22845. }
  22846. break;
  22847. case 0x01AA: /* 'BrtArrFmla' */
  22848. if(!opts.cellFormula) break;
  22849. arrayf.push(val);
  22850. cell = ((opts.dense ? s[R][C] : s[encode_col(C) + rr]));
  22851. cell.f = stringify_formula(val[1], refguess, {r:row.r, c:C}, supbooks, opts);
  22852. cell.F = encode_range(val[0]);
  22853. break;
  22854. case 0x01AB: /* 'BrtShrFmla' */
  22855. if(!opts.cellFormula) break;
  22856. sharedf[encode_cell(val[0].s)] = val[1];
  22857. cell = (opts.dense ? s[R][C] : s[encode_col(C) + rr]);
  22858. cell.f = stringify_formula(val[1], refguess, {r:row.r, c:C}, supbooks, opts);
  22859. break;
  22860. /* identical to 'ColInfo' in XLS */
  22861. case 0x003C: /* 'BrtColInfo' */
  22862. if(!opts.cellStyles) break;
  22863. while(val.e >= val.s) {
  22864. colinfo[val.e--] = { width: val.w/256, hidden: !!(val.flags & 0x01), level: val.level };
  22865. if(!seencol) { seencol = true; find_mdw_colw(val.w/256); }
  22866. process_col(colinfo[val.e+1]);
  22867. }
  22868. break;
  22869. case 0x00A1: /* 'BrtBeginAFilter' */
  22870. s['!autofilter'] = { ref:encode_range(val) };
  22871. break;
  22872. case 0x01DC: /* 'BrtMargins' */
  22873. s['!margins'] = val;
  22874. break;
  22875. case 0x0093: /* 'BrtWsProp' */
  22876. if(!wb.Sheets[idx]) wb.Sheets[idx] = {};
  22877. if(val.name) wb.Sheets[idx].CodeName = val.name;
  22878. break;
  22879. case 0x0089: /* 'BrtBeginWsView' */
  22880. if(!wb.Views) wb.Views = [{}];
  22881. if(!wb.Views[0]) wb.Views[0] = {};
  22882. if(val.RTL) wb.Views[0].RTL = true;
  22883. break;
  22884. case 0x01E5: /* 'BrtWsFmtInfo' */
  22885. break;
  22886. case 0x0040: /* 'BrtDVal' */
  22887. case 0x041D: /* 'BrtDVal14' */
  22888. break;
  22889. case 0x0097: /* 'BrtPane' */
  22890. break;
  22891. case 0x0098: /* 'BrtSel' */
  22892. case 0x00AF: /* 'BrtAFilterDateGroupItem' */
  22893. case 0x0284: /* 'BrtActiveX' */
  22894. case 0x0271: /* 'BrtBigName' */
  22895. case 0x0232: /* 'BrtBkHim' */
  22896. case 0x018C: /* 'BrtBrk' */
  22897. case 0x0458: /* 'BrtCFIcon' */
  22898. case 0x047A: /* 'BrtCFRuleExt' */
  22899. case 0x01D7: /* 'BrtCFVO' */
  22900. case 0x041A: /* 'BrtCFVO14' */
  22901. case 0x0289: /* 'BrtCellIgnoreEC' */
  22902. case 0x0451: /* 'BrtCellIgnoreEC14' */
  22903. case 0x0031: /* 'BrtCellMeta' */
  22904. case 0x024D: /* 'BrtCellSmartTagProperty' */
  22905. case 0x025F: /* 'BrtCellWatch' */
  22906. case 0x0234: /* 'BrtColor' */
  22907. case 0x041F: /* 'BrtColor14' */
  22908. case 0x00A8: /* 'BrtColorFilter' */
  22909. case 0x00AE: /* 'BrtCustomFilter' */
  22910. case 0x049C: /* 'BrtCustomFilter14' */
  22911. case 0x01F3: /* 'BrtDRef' */
  22912. case 0x01FB: /* 'BrtDXF' */
  22913. case 0x0226: /* 'BrtDrawing' */
  22914. case 0x00AB: /* 'BrtDynamicFilter' */
  22915. case 0x00A7: /* 'BrtFilter' */
  22916. case 0x0499: /* 'BrtFilter14' */
  22917. case 0x00A9: /* 'BrtIconFilter' */
  22918. case 0x049D: /* 'BrtIconFilter14' */
  22919. case 0x0227: /* 'BrtLegacyDrawing' */
  22920. case 0x0228: /* 'BrtLegacyDrawingHF' */
  22921. case 0x0295: /* 'BrtListPart' */
  22922. case 0x027F: /* 'BrtOleObject' */
  22923. case 0x01DE: /* 'BrtPageSetup' */
  22924. case 0x0219: /* 'BrtPhoneticInfo' */
  22925. case 0x01DD: /* 'BrtPrintOptions' */
  22926. case 0x0218: /* 'BrtRangeProtection' */
  22927. case 0x044F: /* 'BrtRangeProtection14' */
  22928. case 0x02A8: /* 'BrtRangeProtectionIso' */
  22929. case 0x0450: /* 'BrtRangeProtectionIso14' */
  22930. case 0x0400: /* 'BrtRwDescent' */
  22931. case 0x0297: /* 'BrtSheetCalcProp' */
  22932. case 0x0217: /* 'BrtSheetProtection' */
  22933. case 0x02A6: /* 'BrtSheetProtectionIso' */
  22934. case 0x01F8: /* 'BrtSlc' */
  22935. case 0x0413: /* 'BrtSparkline' */
  22936. case 0x01AC: /* 'BrtTable' */
  22937. case 0x00AA: /* 'BrtTop10Filter' */
  22938. case 0x0C00: /* 'BrtUid' */
  22939. case 0x0032: /* 'BrtValueMeta' */
  22940. case 0x0816: /* 'BrtWebExtension' */
  22941. case 0x0415: /* 'BrtWsFmtInfoEx14' */
  22942. break;
  22943. case 0x0023: /* 'BrtFRTBegin' */
  22944. pass = true; break;
  22945. case 0x0024: /* 'BrtFRTEnd' */
  22946. pass = false; break;
  22947. case 0x0025: /* 'BrtACBegin' */
  22948. state.push(R_n); pass = true; break;
  22949. case 0x0026: /* 'BrtACEnd' */
  22950. state.pop(); pass = false; break;
  22951. default:
  22952. if((R_n||"").indexOf("Begin") > 0){/* empty */}
  22953. else if((R_n||"").indexOf("End") > 0){/* empty */}
  22954. else if(!pass || opts.WTF) throw new Error("Unexpected record " + RT + " " + R_n);
  22955. }
  22956. }, opts);
  22957. delete opts.supbooks;
  22958. delete opts['!row'];
  22959. if(!s["!ref"] && (refguess.s.r < 2000000 || ref && (ref.e.r > 0 || ref.e.c > 0 || ref.s.r > 0 || ref.s.c > 0))) s["!ref"] = encode_range(ref || refguess);
  22960. if(opts.sheetRows && s["!ref"]) {
  22961. var tmpref = safe_decode_range(s["!ref"]);
  22962. if(opts.sheetRows <= +tmpref.e.r) {
  22963. tmpref.e.r = opts.sheetRows - 1;
  22964. if(tmpref.e.r > refguess.e.r) tmpref.e.r = refguess.e.r;
  22965. if(tmpref.e.r < tmpref.s.r) tmpref.s.r = tmpref.e.r;
  22966. if(tmpref.e.c > refguess.e.c) tmpref.e.c = refguess.e.c;
  22967. if(tmpref.e.c < tmpref.s.c) tmpref.s.c = tmpref.e.c;
  22968. s["!fullref"] = s["!ref"];
  22969. s["!ref"] = encode_range(tmpref);
  22970. }
  22971. }
  22972. if(merges.length > 0) s["!merges"] = merges;
  22973. if(colinfo.length > 0) s["!cols"] = colinfo;
  22974. if(rowinfo.length > 0) s["!rows"] = rowinfo;
  22975. return s;
  22976. }
  22977. /* TODO: something useful -- this is a stub */
  22978. function write_ws_bin_cell(ba, cell, R, C, opts, ws, last_seen) {
  22979. if(cell.v === undefined) return false;
  22980. var vv = "";
  22981. switch(cell.t) {
  22982. case 'b': vv = cell.v ? "1" : "0"; break;
  22983. case 'd': // no BrtCellDate :(
  22984. cell = dup(cell);
  22985. cell.z = cell.z || SSF._table[14];
  22986. cell.v = datenum(parseDate(cell.v)); cell.t = 'n';
  22987. break;
  22988. /* falls through */
  22989. case 'n': case 'e': vv = ''+cell.v; break;
  22990. default: vv = cell.v; break;
  22991. }
  22992. var o = ({r:R, c:C});
  22993. /* TODO: cell style */
  22994. o.s = get_cell_style(opts.cellXfs, cell, opts);
  22995. if(cell.l) ws['!links'].push([encode_cell(o), cell.l]);
  22996. if(cell.c) ws['!comments'].push([encode_cell(o), cell.c]);
  22997. switch(cell.t) {
  22998. case 's': case 'str':
  22999. if(opts.bookSST) {
  23000. vv = get_sst_id(opts.Strings, (cell.v), opts.revStrings);
  23001. o.t = "s"; o.v = vv;
  23002. if(last_seen) write_record(ba, "BrtShortIsst", write_BrtShortIsst(cell, o));
  23003. else write_record(ba, "BrtCellIsst", write_BrtCellIsst(cell, o));
  23004. } else {
  23005. o.t = "str";
  23006. if(last_seen) write_record(ba, "BrtShortSt", write_BrtShortSt(cell, o));
  23007. else write_record(ba, "BrtCellSt", write_BrtCellSt(cell, o));
  23008. }
  23009. return true;
  23010. case 'n':
  23011. /* TODO: determine threshold for Real vs RK */
  23012. if(cell.v == (cell.v | 0) && cell.v > -1000 && cell.v < 1000) {
  23013. if(last_seen) write_record(ba, "BrtShortRk", write_BrtShortRk(cell, o));
  23014. else write_record(ba, "BrtCellRk", write_BrtCellRk(cell, o));
  23015. } else {
  23016. if(last_seen) write_record(ba, "BrtShortReal", write_BrtShortReal(cell, o));
  23017. else write_record(ba, "BrtCellReal", write_BrtCellReal(cell, o));
  23018. } return true;
  23019. case 'b':
  23020. o.t = "b";
  23021. if(last_seen) write_record(ba, "BrtShortBool", write_BrtShortBool(cell, o));
  23022. else write_record(ba, "BrtCellBool", write_BrtCellBool(cell, o));
  23023. return true;
  23024. case 'e':
  23025. o.t = "e";
  23026. if(last_seen) write_record(ba, "BrtShortError", write_BrtShortError(cell, o));
  23027. else write_record(ba, "BrtCellError", write_BrtCellError(cell, o));
  23028. return true;
  23029. }
  23030. if(last_seen) write_record(ba, "BrtShortBlank", write_BrtShortBlank(cell, o));
  23031. else write_record(ba, "BrtCellBlank", write_BrtCellBlank(cell, o));
  23032. return true;
  23033. }
  23034. function write_CELLTABLE(ba, ws, idx, opts) {
  23035. var range = safe_decode_range(ws['!ref'] || "A1"), ref, rr = "", cols = [];
  23036. write_record(ba, 'BrtBeginSheetData');
  23037. var dense = Array.isArray(ws);
  23038. var cap = range.e.r;
  23039. if(ws['!rows']) cap = Math.max(range.e.r, ws['!rows'].length - 1);
  23040. for(var R = range.s.r; R <= cap; ++R) {
  23041. rr = encode_row(R);
  23042. /* [ACCELLTABLE] */
  23043. /* BrtRowHdr */
  23044. write_row_header(ba, ws, range, R);
  23045. var last_seen = false;
  23046. if(R <= range.e.r) for(var C = range.s.c; C <= range.e.c; ++C) {
  23047. /* *16384CELL */
  23048. if(R === range.s.r) cols[C] = encode_col(C);
  23049. ref = cols[C] + rr;
  23050. var cell = dense ? (ws[R]||[])[C] : ws[ref];
  23051. if(!cell) { last_seen = false; continue; }
  23052. /* write cell */
  23053. last_seen = write_ws_bin_cell(ba, cell, R, C, opts, ws, last_seen);
  23054. }
  23055. }
  23056. write_record(ba, 'BrtEndSheetData');
  23057. }
  23058. function write_MERGECELLS(ba, ws) {
  23059. if(!ws || !ws['!merges']) return;
  23060. write_record(ba, 'BrtBeginMergeCells', write_BrtBeginMergeCells(ws['!merges'].length));
  23061. ws['!merges'].forEach(function(m) { write_record(ba, 'BrtMergeCell', write_BrtMergeCell(m)); });
  23062. write_record(ba, 'BrtEndMergeCells');
  23063. }
  23064. function write_COLINFOS(ba, ws) {
  23065. if(!ws || !ws['!cols']) return;
  23066. write_record(ba, 'BrtBeginColInfos');
  23067. ws['!cols'].forEach(function(m, i) { if(m) write_record(ba, 'BrtColInfo', write_BrtColInfo(i, m)); });
  23068. write_record(ba, 'BrtEndColInfos');
  23069. }
  23070. function write_IGNOREECS(ba, ws) {
  23071. if(!ws || !ws['!ref']) return;
  23072. write_record(ba, 'BrtBeginCellIgnoreECs');
  23073. write_record(ba, 'BrtCellIgnoreEC', write_BrtCellIgnoreEC(safe_decode_range(ws['!ref'])));
  23074. write_record(ba, 'BrtEndCellIgnoreECs');
  23075. }
  23076. function write_HLINKS(ba, ws, rels) {
  23077. /* *BrtHLink */
  23078. ws['!links'].forEach(function(l) {
  23079. if(!l[1].Target) return;
  23080. var rId = add_rels(rels, -1, l[1].Target.replace(/#.*$/, ""), RELS.HLINK);
  23081. write_record(ba, "BrtHLink", write_BrtHLink(l, rId));
  23082. });
  23083. delete ws['!links'];
  23084. }
  23085. function write_LEGACYDRAWING(ba, ws, idx, rels) {
  23086. /* [BrtLegacyDrawing] */
  23087. if(ws['!comments'].length > 0) {
  23088. var rId = add_rels(rels, -1, "../drawings/vmlDrawing" + (idx+1) + ".vml", RELS.VML);
  23089. write_record(ba, "BrtLegacyDrawing", write_RelID("rId" + rId));
  23090. ws['!legacy'] = rId;
  23091. }
  23092. }
  23093. function write_AUTOFILTER(ba, ws, wb, idx) {
  23094. if(!ws['!autofilter']) return;
  23095. var data = ws['!autofilter'];
  23096. var ref = typeof data.ref === "string" ? data.ref : encode_range(data.ref);
  23097. /* Update FilterDatabase defined name for the worksheet */
  23098. if(!wb.Workbook) wb.Workbook = ({Sheets:[]});
  23099. if(!wb.Workbook.Names) wb.Workbook.Names = [];
  23100. var names = wb.Workbook.Names;
  23101. var range = decode_range(ref);
  23102. if(range.s.r == range.e.r) { range.e.r = decode_range(ws["!ref"]).e.r; ref = encode_range(range); }
  23103. for(var i = 0; i < names.length; ++i) {
  23104. var name = names[i];
  23105. if(name.Name != '_xlnm._FilterDatabase') continue;
  23106. if(name.Sheet != idx) continue;
  23107. name.Ref = "'" + wb.SheetNames[idx] + "'!" + ref; break;
  23108. }
  23109. if(i == names.length) names.push({ Name: '_xlnm._FilterDatabase', Sheet: idx, Ref: "'" + wb.SheetNames[idx] + "'!" + ref });
  23110. write_record(ba, "BrtBeginAFilter", write_UncheckedRfX(safe_decode_range(ref)));
  23111. /* *FILTERCOLUMN */
  23112. /* [SORTSTATE] */
  23113. /* BrtEndAFilter */
  23114. write_record(ba, "BrtEndAFilter");
  23115. }
  23116. function write_WSVIEWS2(ba, ws, Workbook) {
  23117. write_record(ba, "BrtBeginWsViews");
  23118. { /* 1*WSVIEW2 */
  23119. /* [ACUID] */
  23120. write_record(ba, "BrtBeginWsView", write_BrtBeginWsView(ws, Workbook));
  23121. /* [BrtPane] */
  23122. /* *4BrtSel */
  23123. /* *4SXSELECT */
  23124. /* *FRT */
  23125. write_record(ba, "BrtEndWsView");
  23126. }
  23127. /* *FRT */
  23128. write_record(ba, "BrtEndWsViews");
  23129. }
  23130. function write_WSFMTINFO() {
  23131. /* [ACWSFMTINFO] */
  23132. //write_record(ba, "BrtWsFmtInfo", write_BrtWsFmtInfo(ws));
  23133. }
  23134. function write_SHEETPROTECT(ba, ws) {
  23135. if(!ws['!protect']) return;
  23136. /* [BrtSheetProtectionIso] */
  23137. write_record(ba, "BrtSheetProtection", write_BrtSheetProtection(ws['!protect']));
  23138. }
  23139. function write_ws_bin(idx, opts, wb, rels) {
  23140. var ba = buf_array();
  23141. var s = wb.SheetNames[idx], ws = wb.Sheets[s] || {};
  23142. var c = s; try { if(wb && wb.Workbook) c = wb.Workbook.Sheets[idx].CodeName || c; } catch(e) {}
  23143. var r = safe_decode_range(ws['!ref'] || "A1");
  23144. if(r.e.c > 0x3FFF || r.e.r > 0xFFFFF) {
  23145. if(opts.WTF) throw new Error("Range " + (ws['!ref'] || "A1") + " exceeds format limit A1:XFD1048576");
  23146. r.e.c = Math.min(r.e.c, 0x3FFF);
  23147. r.e.r = Math.min(r.e.c, 0xFFFFF);
  23148. }
  23149. ws['!links'] = [];
  23150. /* passed back to write_zip and removed there */
  23151. ws['!comments'] = [];
  23152. write_record(ba, "BrtBeginSheet");
  23153. if(wb.vbaraw) write_record(ba, "BrtWsProp", write_BrtWsProp(c));
  23154. write_record(ba, "BrtWsDim", write_BrtWsDim(r));
  23155. write_WSVIEWS2(ba, ws, wb.Workbook);
  23156. write_WSFMTINFO(ba, ws);
  23157. write_COLINFOS(ba, ws, idx, opts, wb);
  23158. write_CELLTABLE(ba, ws, idx, opts, wb);
  23159. /* [BrtSheetCalcProp] */
  23160. write_SHEETPROTECT(ba, ws);
  23161. /* *([BrtRangeProtectionIso] BrtRangeProtection) */
  23162. /* [SCENMAN] */
  23163. write_AUTOFILTER(ba, ws, wb, idx);
  23164. /* [SORTSTATE] */
  23165. /* [DCON] */
  23166. /* [USERSHVIEWS] */
  23167. write_MERGECELLS(ba, ws);
  23168. /* [BrtPhoneticInfo] */
  23169. /* *CONDITIONALFORMATTING */
  23170. /* [DVALS] */
  23171. write_HLINKS(ba, ws, rels);
  23172. /* [BrtPrintOptions] */
  23173. if(ws['!margins']) write_record(ba, "BrtMargins", write_BrtMargins(ws['!margins']));
  23174. /* [BrtPageSetup] */
  23175. /* [HEADERFOOTER] */
  23176. /* [RWBRK] */
  23177. /* [COLBRK] */
  23178. /* *BrtBigName */
  23179. /* [CELLWATCHES] */
  23180. if(!opts || opts.ignoreEC || (opts.ignoreEC == (void 0))) write_IGNOREECS(ba, ws);
  23181. /* [SMARTTAGS] */
  23182. /* [BrtDrawing] */
  23183. write_LEGACYDRAWING(ba, ws, idx, rels);
  23184. /* [BrtLegacyDrawingHF] */
  23185. /* [BrtBkHim] */
  23186. /* [OLEOBJECTS] */
  23187. /* [ACTIVEXCONTROLS] */
  23188. /* [WEBPUBITEMS] */
  23189. /* [LISTPARTS] */
  23190. /* FRTWORKSHEET */
  23191. write_record(ba, "BrtEndSheet");
  23192. return ba.end();
  23193. }
  23194. RELS.CHART = "http://schemas.openxmlformats.org/officeDocument/2006/relationships/chart";
  23195. RELS.CHARTEX = "http://schemas.microsoft.com/office/2014/relationships/chartEx";
  23196. function parse_Cache(data) {
  23197. var col = [];
  23198. var num = data.match(/^<c:numCache>/);
  23199. var f;
  23200. /* 21.2.2.150 pt CT_NumVal */
  23201. (data.match(/<c:pt idx="(\d*)">(.*?)<\/c:pt>/mg)||[]).forEach(function(pt) {
  23202. var q = pt.match(/<c:pt idx="(\d*?)"><c:v>(.*)<\/c:v><\/c:pt>/);
  23203. if(!q) return;
  23204. col[+q[1]] = num ? +q[2] : q[2];
  23205. });
  23206. /* 21.2.2.71 formatCode CT_Xstring */
  23207. var nf = unescapexml((data.match(/<c:formatCode>([\s\S]*?)<\/c:formatCode>/) || ["","General"])[1]);
  23208. (data.match(/<c:f>(.*?)<\/c:f>/mg)||[]).forEach(function(F) { f = F.replace(/<.*?>/g,""); });
  23209. return [col, nf, f];
  23210. }
  23211. /* 21.2 DrawingML - Charts */
  23212. function parse_chart(data, name, opts, rels, wb, csheet) {
  23213. var cs = ((csheet || {"!type":"chart"}));
  23214. if(!data) return csheet;
  23215. /* 21.2.2.27 chart CT_Chart */
  23216. var C = 0, R = 0, col = "A";
  23217. var refguess = {s: {r:2000000, c:2000000}, e: {r:0, c:0} };
  23218. /* 21.2.2.120 numCache CT_NumData */
  23219. (data.match(/<c:numCache>[\s\S]*?<\/c:numCache>/gm)||[]).forEach(function(nc) {
  23220. var cache = parse_Cache(nc);
  23221. refguess.s.r = refguess.s.c = 0;
  23222. refguess.e.c = C;
  23223. col = encode_col(C);
  23224. cache[0].forEach(function(n,i) {
  23225. cs[col + encode_row(i)] = {t:'n', v:n, z:cache[1] };
  23226. R = i;
  23227. });
  23228. if(refguess.e.r < R) refguess.e.r = R;
  23229. ++C;
  23230. });
  23231. if(C > 0) cs["!ref"] = encode_range(refguess);
  23232. return cs;
  23233. }
  23234. RELS.CS = "http://schemas.openxmlformats.org/officeDocument/2006/relationships/chartsheet";
  23235. var CS_XML_ROOT = writextag('chartsheet', null, {
  23236. 'xmlns': XMLNS.main[0],
  23237. 'xmlns:r': XMLNS.r
  23238. });
  23239. /* 18.3 Worksheets also covers Chartsheets */
  23240. function parse_cs_xml(data, opts, idx, rels, wb) {
  23241. if(!data) return data;
  23242. /* 18.3.1.12 chartsheet CT_ChartSheet */
  23243. if(!rels) rels = {'!id':{}};
  23244. var s = ({'!type':"chart", '!drawel':null, '!rel':""});
  23245. var m;
  23246. /* 18.3.1.83 sheetPr CT_ChartsheetPr */
  23247. var sheetPr = data.match(sheetprregex);
  23248. if(sheetPr) parse_ws_xml_sheetpr(sheetPr[0], s, wb, idx);
  23249. /* 18.3.1.36 drawing CT_Drawing */
  23250. if((m = data.match(/drawing r:id="(.*?)"/))) s['!rel'] = m[1];
  23251. if(rels['!id'][s['!rel']]) s['!drawel'] = rels['!id'][s['!rel']];
  23252. return s;
  23253. }
  23254. function write_cs_xml(idx, opts, wb, rels) {
  23255. var o = [XML_HEADER, CS_XML_ROOT];
  23256. o[o.length] = writextag("drawing", null, {"r:id": "rId1"});
  23257. add_rels(rels, -1, "../drawings/drawing" + (idx+1) + ".xml", RELS.DRAW);
  23258. if(o.length>2) { o[o.length] = ('</chartsheet>'); o[1]=o[1].replace("/>",">"); }
  23259. return o.join("");
  23260. }
  23261. /* [MS-XLSB] 2.4.331 BrtCsProp */
  23262. function parse_BrtCsProp(data, length) {
  23263. data.l += 10;
  23264. var name = parse_XLWideString(data, length - 10);
  23265. return { name: name };
  23266. }
  23267. /* [MS-XLSB] 2.1.7.7 Chart Sheet */
  23268. function parse_cs_bin(data, opts, idx, rels, wb) {
  23269. if(!data) return data;
  23270. if(!rels) rels = {'!id':{}};
  23271. var s = {'!type':"chart", '!drawel':null, '!rel':""};
  23272. var state = [];
  23273. var pass = false;
  23274. recordhopper(data, function cs_parse(val, R_n, RT) {
  23275. switch(RT) {
  23276. case 0x0226: /* 'BrtDrawing' */
  23277. s['!rel'] = val; break;
  23278. case 0x028B: /* 'BrtCsProp' */
  23279. if(!wb.Sheets[idx]) wb.Sheets[idx] = {};
  23280. if(val.name) wb.Sheets[idx].CodeName = val.name;
  23281. break;
  23282. case 0x0232: /* 'BrtBkHim' */
  23283. case 0x028C: /* 'BrtCsPageSetup' */
  23284. case 0x029D: /* 'BrtCsProtection' */
  23285. case 0x02A7: /* 'BrtCsProtectionIso' */
  23286. case 0x0227: /* 'BrtLegacyDrawing' */
  23287. case 0x0228: /* 'BrtLegacyDrawingHF' */
  23288. case 0x01DC: /* 'BrtMargins' */
  23289. case 0x0C00: /* 'BrtUid' */
  23290. break;
  23291. case 0x0023: /* 'BrtFRTBegin' */
  23292. pass = true; break;
  23293. case 0x0024: /* 'BrtFRTEnd' */
  23294. pass = false; break;
  23295. case 0x0025: /* 'BrtACBegin' */
  23296. state.push(R_n); break;
  23297. case 0x0026: /* 'BrtACEnd' */
  23298. state.pop(); break;
  23299. default:
  23300. if((R_n||"").indexOf("Begin") > 0) state.push(R_n);
  23301. else if((R_n||"").indexOf("End") > 0) state.pop();
  23302. else if(!pass || opts.WTF) throw new Error("Unexpected record " + RT + " " + R_n);
  23303. }
  23304. }, opts);
  23305. if(rels['!id'][s['!rel']]) s['!drawel'] = rels['!id'][s['!rel']];
  23306. return s;
  23307. }
  23308. function write_cs_bin() {
  23309. var ba = buf_array();
  23310. write_record(ba, "BrtBeginSheet");
  23311. /* [BrtCsProp] */
  23312. /* CSVIEWS */
  23313. /* [[BrtCsProtectionIso] BrtCsProtection] */
  23314. /* [USERCSVIEWS] */
  23315. /* [BrtMargins] */
  23316. /* [BrtCsPageSetup] */
  23317. /* [HEADERFOOTER] */
  23318. /* BrtDrawing */
  23319. /* [BrtLegacyDrawing] */
  23320. /* [BrtLegacyDrawingHF] */
  23321. /* [BrtBkHim] */
  23322. /* [WEBPUBITEMS] */
  23323. /* FRTCHARTSHEET */
  23324. write_record(ba, "BrtEndSheet");
  23325. return ba.end();
  23326. }
  23327. /* 18.2.28 (CT_WorkbookProtection) Defaults */
  23328. var WBPropsDef = [
  23329. ['allowRefreshQuery', false, "bool"],
  23330. ['autoCompressPictures', true, "bool"],
  23331. ['backupFile', false, "bool"],
  23332. ['checkCompatibility', false, "bool"],
  23333. ['CodeName', ''],
  23334. ['date1904', false, "bool"],
  23335. ['defaultThemeVersion', 0, "int"],
  23336. ['filterPrivacy', false, "bool"],
  23337. ['hidePivotFieldList', false, "bool"],
  23338. ['promptedSolutions', false, "bool"],
  23339. ['publishItems', false, "bool"],
  23340. ['refreshAllConnections', false, "bool"],
  23341. ['saveExternalLinkValues', true, "bool"],
  23342. ['showBorderUnselectedTables', true, "bool"],
  23343. ['showInkAnnotation', true, "bool"],
  23344. ['showObjects', 'all'],
  23345. ['showPivotChartFilter', false, "bool"],
  23346. ['updateLinks', 'userSet']
  23347. ];
  23348. /* 18.2.30 (CT_BookView) Defaults */
  23349. var WBViewDef = [
  23350. ['activeTab', 0, "int"],
  23351. ['autoFilterDateGrouping', true, "bool"],
  23352. ['firstSheet', 0, "int"],
  23353. ['minimized', false, "bool"],
  23354. ['showHorizontalScroll', true, "bool"],
  23355. ['showSheetTabs', true, "bool"],
  23356. ['showVerticalScroll', true, "bool"],
  23357. ['tabRatio', 600, "int"],
  23358. ['visibility', 'visible']
  23359. //window{Height,Width}, {x,y}Window
  23360. ];
  23361. /* 18.2.19 (CT_Sheet) Defaults */
  23362. var SheetDef = [
  23363. //['state', 'visible']
  23364. ];
  23365. /* 18.2.2 (CT_CalcPr) Defaults */
  23366. var CalcPrDef = [
  23367. ['calcCompleted', 'true'],
  23368. ['calcMode', 'auto'],
  23369. ['calcOnSave', 'true'],
  23370. ['concurrentCalc', 'true'],
  23371. ['fullCalcOnLoad', 'false'],
  23372. ['fullPrecision', 'true'],
  23373. ['iterate', 'false'],
  23374. ['iterateCount', '100'],
  23375. ['iterateDelta', '0.001'],
  23376. ['refMode', 'A1']
  23377. ];
  23378. /* 18.2.3 (CT_CustomWorkbookView) Defaults */
  23379. /*var CustomWBViewDef = [
  23380. ['autoUpdate', 'false'],
  23381. ['changesSavedWin', 'false'],
  23382. ['includeHiddenRowCol', 'true'],
  23383. ['includePrintSettings', 'true'],
  23384. ['maximized', 'false'],
  23385. ['minimized', 'false'],
  23386. ['onlySync', 'false'],
  23387. ['personalView', 'false'],
  23388. ['showComments', 'commIndicator'],
  23389. ['showFormulaBar', 'true'],
  23390. ['showHorizontalScroll', 'true'],
  23391. ['showObjects', 'all'],
  23392. ['showSheetTabs', 'true'],
  23393. ['showStatusbar', 'true'],
  23394. ['showVerticalScroll', 'true'],
  23395. ['tabRatio', '600'],
  23396. ['xWindow', '0'],
  23397. ['yWindow', '0']
  23398. ];*/
  23399. function push_defaults_array(target, defaults) {
  23400. for(var j = 0; j != target.length; ++j) { var w = target[j];
  23401. for(var i=0; i != defaults.length; ++i) { var z = defaults[i];
  23402. if(w[z[0]] == null) w[z[0]] = z[1];
  23403. else switch(z[2]) {
  23404. case "bool": if(typeof w[z[0]] == "string") w[z[0]] = parsexmlbool(w[z[0]]); break;
  23405. case "int": if(typeof w[z[0]] == "string") w[z[0]] = parseInt(w[z[0]], 10); break;
  23406. }
  23407. }
  23408. }
  23409. }
  23410. function push_defaults(target, defaults) {
  23411. for(var i = 0; i != defaults.length; ++i) { var z = defaults[i];
  23412. if(target[z[0]] == null) target[z[0]] = z[1];
  23413. else switch(z[2]) {
  23414. case "bool": if(typeof target[z[0]] == "string") target[z[0]] = parsexmlbool(target[z[0]]); break;
  23415. case "int": if(typeof target[z[0]] == "string") target[z[0]] = parseInt(target[z[0]], 10); break;
  23416. }
  23417. }
  23418. }
  23419. function parse_wb_defaults(wb) {
  23420. push_defaults(wb.WBProps, WBPropsDef);
  23421. push_defaults(wb.CalcPr, CalcPrDef);
  23422. push_defaults_array(wb.WBView, WBViewDef);
  23423. push_defaults_array(wb.Sheets, SheetDef);
  23424. _ssfopts.date1904 = parsexmlbool(wb.WBProps.date1904);
  23425. }
  23426. function safe1904(wb) {
  23427. /* TODO: store date1904 somewhere else */
  23428. if(!wb.Workbook) return "false";
  23429. if(!wb.Workbook.WBProps) return "false";
  23430. return parsexmlbool(wb.Workbook.WBProps.date1904) ? "true" : "false";
  23431. }
  23432. var badchars = "][*?\/\\".split("");
  23433. function check_ws_name(n, safe) {
  23434. if(n.length > 31) { if(safe) return false; throw new Error("Sheet names cannot exceed 31 chars"); }
  23435. var _good = true;
  23436. badchars.forEach(function(c) {
  23437. if(n.indexOf(c) == -1) return;
  23438. if(!safe) throw new Error("Sheet name cannot contain : \\ / ? * [ ]");
  23439. _good = false;
  23440. });
  23441. return _good;
  23442. }
  23443. function check_wb_names(N, S, codes) {
  23444. N.forEach(function(n,i) {
  23445. check_ws_name(n);
  23446. for(var j = 0; j < i; ++j) if(n == N[j]) throw new Error("Duplicate Sheet Name: " + n);
  23447. if(codes) {
  23448. var cn = (S && S[i] && S[i].CodeName) || n;
  23449. if(cn.charCodeAt(0) == 95 && cn.length > 22) throw new Error("Bad Code Name: Worksheet" + cn);
  23450. }
  23451. });
  23452. }
  23453. function check_wb(wb) {
  23454. if(!wb || !wb.SheetNames || !wb.Sheets) throw new Error("Invalid Workbook");
  23455. if(!wb.SheetNames.length) throw new Error("Workbook is empty");
  23456. var Sheets = (wb.Workbook && wb.Workbook.Sheets) || [];
  23457. check_wb_names(wb.SheetNames, Sheets, !!wb.vbaraw);
  23458. for(var i = 0; i < wb.SheetNames.length; ++i) check_ws(wb.Sheets[wb.SheetNames[i]], wb.SheetNames[i], i);
  23459. /* TODO: validate workbook */
  23460. }
  23461. /* 18.2 Workbook */
  23462. var wbnsregex = /<\w+:workbook/;
  23463. function parse_wb_xml(data, opts) {
  23464. if(!data) throw new Error("Could not find file");
  23465. var wb = { AppVersion:{}, WBProps:{}, WBView:[], Sheets:[], CalcPr:{}, Names:[], xmlns: "" };
  23466. var pass = false, xmlns = "xmlns";
  23467. var dname = {}, dnstart = 0;
  23468. data.replace(tagregex, function xml_wb(x, idx) {
  23469. var y = parsexmltag(x);
  23470. switch(strip_ns(y[0])) {
  23471. case '<?xml': break;
  23472. /* 18.2.27 workbook CT_Workbook 1 */
  23473. case '<workbook':
  23474. if(x.match(wbnsregex)) xmlns = "xmlns" + x.match(/<(\w+):/)[1];
  23475. wb.xmlns = y[xmlns];
  23476. break;
  23477. case '</workbook>': break;
  23478. /* 18.2.13 fileVersion CT_FileVersion ? */
  23479. case '<fileVersion': delete y[0]; wb.AppVersion = y; break;
  23480. case '<fileVersion/>': case '</fileVersion>': break;
  23481. /* 18.2.12 fileSharing CT_FileSharing ? */
  23482. case '<fileSharing':
  23483. break;
  23484. case '<fileSharing/>': break;
  23485. /* 18.2.28 workbookPr CT_WorkbookPr ? */
  23486. case '<workbookPr':
  23487. case '<workbookPr/>':
  23488. WBPropsDef.forEach(function(w) {
  23489. if(y[w[0]] == null) return;
  23490. switch(w[2]) {
  23491. case "bool": wb.WBProps[w[0]] = parsexmlbool(y[w[0]]); break;
  23492. case "int": wb.WBProps[w[0]] = parseInt(y[w[0]], 10); break;
  23493. default: wb.WBProps[w[0]] = y[w[0]];
  23494. }
  23495. });
  23496. if(y.codeName) wb.WBProps.CodeName = utf8read(y.codeName);
  23497. break;
  23498. case '</workbookPr>': break;
  23499. /* 18.2.29 workbookProtection CT_WorkbookProtection ? */
  23500. case '<workbookProtection':
  23501. break;
  23502. case '<workbookProtection/>': break;
  23503. /* 18.2.1 bookViews CT_BookViews ? */
  23504. case '<bookViews': case '<bookViews>': case '</bookViews>': break;
  23505. /* 18.2.30 workbookView CT_BookView + */
  23506. case '<workbookView': case '<workbookView/>': delete y[0]; wb.WBView.push(y); break;
  23507. case '</workbookView>': break;
  23508. /* 18.2.20 sheets CT_Sheets 1 */
  23509. case '<sheets': case '<sheets>': case '</sheets>': break; // aggregate sheet
  23510. /* 18.2.19 sheet CT_Sheet + */
  23511. case '<sheet':
  23512. switch(y.state) {
  23513. case "hidden": y.Hidden = 1; break;
  23514. case "veryHidden": y.Hidden = 2; break;
  23515. default: y.Hidden = 0;
  23516. }
  23517. delete y.state;
  23518. y.name = unescapexml(utf8read(y.name));
  23519. delete y[0]; wb.Sheets.push(y); break;
  23520. case '</sheet>': break;
  23521. /* 18.2.15 functionGroups CT_FunctionGroups ? */
  23522. case '<functionGroups': case '<functionGroups/>': break;
  23523. /* 18.2.14 functionGroup CT_FunctionGroup + */
  23524. case '<functionGroup': break;
  23525. /* 18.2.9 externalReferences CT_ExternalReferences ? */
  23526. case '<externalReferences': case '</externalReferences>': case '<externalReferences>': break;
  23527. /* 18.2.8 externalReference CT_ExternalReference + */
  23528. case '<externalReference': break;
  23529. /* 18.2.6 definedNames CT_DefinedNames ? */
  23530. case '<definedNames/>': break;
  23531. case '<definedNames>': case '<definedNames': pass=true; break;
  23532. case '</definedNames>': pass=false; break;
  23533. /* 18.2.5 definedName CT_DefinedName + */
  23534. case '<definedName': {
  23535. dname = {};
  23536. dname.Name = utf8read(y.name);
  23537. if(y.comment) dname.Comment = y.comment;
  23538. if(y.localSheetId) dname.Sheet = +y.localSheetId;
  23539. if(parsexmlbool(y.hidden||"0")) dname.Hidden = true;
  23540. dnstart = idx + x.length;
  23541. } break;
  23542. case '</definedName>': {
  23543. dname.Ref = unescapexml(utf8read(data.slice(dnstart, idx)));
  23544. wb.Names.push(dname);
  23545. } break;
  23546. case '<definedName/>': break;
  23547. /* 18.2.2 calcPr CT_CalcPr ? */
  23548. case '<calcPr': delete y[0]; wb.CalcPr = y; break;
  23549. case '<calcPr/>': delete y[0]; wb.CalcPr = y; break;
  23550. case '</calcPr>': break;
  23551. /* 18.2.16 oleSize CT_OleSize ? (ref required) */
  23552. case '<oleSize': break;
  23553. /* 18.2.4 customWorkbookViews CT_CustomWorkbookViews ? */
  23554. case '<customWorkbookViews>': case '</customWorkbookViews>': case '<customWorkbookViews': break;
  23555. /* 18.2.3 customWorkbookView CT_CustomWorkbookView + */
  23556. case '<customWorkbookView': case '</customWorkbookView>': break;
  23557. /* 18.2.18 pivotCaches CT_PivotCaches ? */
  23558. case '<pivotCaches>': case '</pivotCaches>': case '<pivotCaches': break;
  23559. /* 18.2.17 pivotCache CT_PivotCache ? */
  23560. case '<pivotCache': break;
  23561. /* 18.2.21 smartTagPr CT_SmartTagPr ? */
  23562. case '<smartTagPr': case '<smartTagPr/>': break;
  23563. /* 18.2.23 smartTagTypes CT_SmartTagTypes ? */
  23564. case '<smartTagTypes': case '<smartTagTypes>': case '</smartTagTypes>': break;
  23565. /* 18.2.22 smartTagType CT_SmartTagType ? */
  23566. case '<smartTagType': break;
  23567. /* 18.2.24 webPublishing CT_WebPublishing ? */
  23568. case '<webPublishing': case '<webPublishing/>': break;
  23569. /* 18.2.11 fileRecoveryPr CT_FileRecoveryPr ? */
  23570. case '<fileRecoveryPr': case '<fileRecoveryPr/>': break;
  23571. /* 18.2.26 webPublishObjects CT_WebPublishObjects ? */
  23572. case '<webPublishObjects>': case '<webPublishObjects': case '</webPublishObjects>': break;
  23573. /* 18.2.25 webPublishObject CT_WebPublishObject ? */
  23574. case '<webPublishObject': break;
  23575. /* 18.2.10 extLst CT_ExtensionList ? */
  23576. case '<extLst': case '<extLst>': case '</extLst>': case '<extLst/>': break;
  23577. /* 18.2.7 ext CT_Extension + */
  23578. case '<ext': pass=true; break; //TODO: check with versions of excel
  23579. case '</ext>': pass=false; break;
  23580. /* Others */
  23581. case '<ArchID': break;
  23582. case '<AlternateContent':
  23583. case '<AlternateContent>': pass=true; break;
  23584. case '</AlternateContent>': pass=false; break;
  23585. /* TODO */
  23586. case '<revisionPtr': break;
  23587. default: if(!pass && opts.WTF) throw new Error('unrecognized ' + y[0] + ' in workbook');
  23588. }
  23589. return x;
  23590. });
  23591. if(XMLNS.main.indexOf(wb.xmlns) === -1) throw new Error("Unknown Namespace: " + wb.xmlns);
  23592. parse_wb_defaults(wb);
  23593. return wb;
  23594. }
  23595. var WB_XML_ROOT = writextag('workbook', null, {
  23596. 'xmlns': XMLNS.main[0],
  23597. //'xmlns:mx': XMLNS.mx,
  23598. //'xmlns:s': XMLNS.main[0],
  23599. 'xmlns:r': XMLNS.r
  23600. });
  23601. function write_wb_xml(wb) {
  23602. var o = [XML_HEADER];
  23603. o[o.length] = WB_XML_ROOT;
  23604. var write_names = (wb.Workbook && (wb.Workbook.Names||[]).length > 0);
  23605. /* fileVersion */
  23606. /* fileSharing */
  23607. var workbookPr = ({codeName:"ThisWorkbook"});
  23608. if(wb.Workbook && wb.Workbook.WBProps) {
  23609. WBPropsDef.forEach(function(x) {
  23610. if((wb.Workbook.WBProps[x[0]]) == null) return;
  23611. if((wb.Workbook.WBProps[x[0]]) == x[1]) return;
  23612. workbookPr[x[0]] = (wb.Workbook.WBProps[x[0]]);
  23613. });
  23614. if(wb.Workbook.WBProps.CodeName) { workbookPr.codeName = wb.Workbook.WBProps.CodeName; delete workbookPr.CodeName; }
  23615. }
  23616. o[o.length] = (writextag('workbookPr', null, workbookPr));
  23617. /* workbookProtection */
  23618. var sheets = wb.Workbook && wb.Workbook.Sheets || [];
  23619. var i = 0;
  23620. /* bookViews only written if first worksheet is hidden */
  23621. if(sheets && sheets[0] && !!sheets[0].Hidden) {
  23622. o[o.length] = "<bookViews>";
  23623. for(i = 0; i != wb.SheetNames.length; ++i) {
  23624. if(!sheets[i]) break;
  23625. if(!sheets[i].Hidden) break;
  23626. }
  23627. if(i == wb.SheetNames.length) i = 0;
  23628. o[o.length] = '<workbookView firstSheet="' + i + '" activeTab="' + i + '"/>';
  23629. o[o.length] = "</bookViews>";
  23630. }
  23631. o[o.length] = "<sheets>";
  23632. for(i = 0; i != wb.SheetNames.length; ++i) {
  23633. var sht = ({name:escapexml(wb.SheetNames[i].slice(0,31))});
  23634. sht.sheetId = ""+(i+1);
  23635. sht["r:id"] = "rId"+(i+1);
  23636. if(sheets[i]) switch(sheets[i].Hidden) {
  23637. case 1: sht.state = "hidden"; break;
  23638. case 2: sht.state = "veryHidden"; break;
  23639. }
  23640. o[o.length] = (writextag('sheet',null,sht));
  23641. }
  23642. o[o.length] = "</sheets>";
  23643. /* functionGroups */
  23644. /* externalReferences */
  23645. if(write_names) {
  23646. o[o.length] = "<definedNames>";
  23647. if(wb.Workbook && wb.Workbook.Names) wb.Workbook.Names.forEach(function(n) {
  23648. var d = {name:n.Name};
  23649. if(n.Comment) d.comment = n.Comment;
  23650. if(n.Sheet != null) d.localSheetId = ""+n.Sheet;
  23651. if(n.Hidden) d.hidden = "1";
  23652. if(!n.Ref) return;
  23653. o[o.length] = writextag('definedName', escapexml(n.Ref), d);
  23654. });
  23655. o[o.length] = "</definedNames>";
  23656. }
  23657. /* calcPr */
  23658. /* oleSize */
  23659. /* customWorkbookViews */
  23660. /* pivotCaches */
  23661. /* smartTagPr */
  23662. /* smartTagTypes */
  23663. /* webPublishing */
  23664. /* fileRecoveryPr */
  23665. /* webPublishObjects */
  23666. /* extLst */
  23667. if(o.length>2){ o[o.length] = '</workbook>'; o[1]=o[1].replace("/>",">"); }
  23668. return o.join("");
  23669. }
  23670. /* [MS-XLSB] 2.4.304 BrtBundleSh */
  23671. function parse_BrtBundleSh(data, length) {
  23672. var z = {};
  23673. z.Hidden = data.read_shift(4); //hsState ST_SheetState
  23674. z.iTabID = data.read_shift(4);
  23675. z.strRelID = parse_RelID(data,length-8);
  23676. z.name = parse_XLWideString(data);
  23677. return z;
  23678. }
  23679. function write_BrtBundleSh(data, o) {
  23680. if(!o) o = new_buf(127);
  23681. o.write_shift(4, data.Hidden);
  23682. o.write_shift(4, data.iTabID);
  23683. write_RelID(data.strRelID, o);
  23684. write_XLWideString(data.name.slice(0,31), o);
  23685. return o.length > o.l ? o.slice(0, o.l) : o;
  23686. }
  23687. /* [MS-XLSB] 2.4.815 BrtWbProp */
  23688. function parse_BrtWbProp(data, length) {
  23689. var o = ({});
  23690. var flags = data.read_shift(4);
  23691. o.defaultThemeVersion = data.read_shift(4);
  23692. var strName = (length > 8) ? parse_XLWideString(data) : "";
  23693. if(strName.length > 0) o.CodeName = strName;
  23694. o.autoCompressPictures = !!(flags & 0x10000);
  23695. o.backupFile = !!(flags & 0x40);
  23696. o.checkCompatibility = !!(flags & 0x1000);
  23697. o.date1904 = !!(flags & 0x01);
  23698. o.filterPrivacy = !!(flags & 0x08);
  23699. o.hidePivotFieldList = !!(flags & 0x400);
  23700. o.promptedSolutions = !!(flags & 0x10);
  23701. o.publishItems = !!(flags & 0x800);
  23702. o.refreshAllConnections = !!(flags & 0x40000);
  23703. o.saveExternalLinkValues = !!(flags & 0x80);
  23704. o.showBorderUnselectedTables = !!(flags & 0x04);
  23705. o.showInkAnnotation = !!(flags & 0x20);
  23706. o.showObjects = ["all", "placeholders", "none"][(flags >> 13) & 0x03];
  23707. o.showPivotChartFilter = !!(flags & 0x8000);
  23708. o.updateLinks = ["userSet", "never", "always"][(flags >> 8) & 0x03];
  23709. return o;
  23710. }
  23711. function write_BrtWbProp(data, o) {
  23712. if(!o) o = new_buf(72);
  23713. var flags = 0;
  23714. if(data) {
  23715. /* TODO: mirror parse_BrtWbProp fields */
  23716. if(data.filterPrivacy) flags |= 0x08;
  23717. }
  23718. o.write_shift(4, flags);
  23719. o.write_shift(4, 0);
  23720. write_XLSBCodeName(data && data.CodeName || "ThisWorkbook", o);
  23721. return o.slice(0, o.l);
  23722. }
  23723. function parse_BrtFRTArchID$(data, length) {
  23724. var o = {};
  23725. data.read_shift(4);
  23726. o.ArchID = data.read_shift(4);
  23727. data.l += length - 8;
  23728. return o;
  23729. }
  23730. /* [MS-XLSB] 2.4.687 BrtName */
  23731. function parse_BrtName(data, length, opts) {
  23732. var end = data.l + length;
  23733. data.l += 4; //var flags = data.read_shift(4);
  23734. data.l += 1; //var chKey = data.read_shift(1);
  23735. var itab = data.read_shift(4);
  23736. var name = parse_XLNameWideString(data);
  23737. var formula = parse_XLSBNameParsedFormula(data, 0, opts);
  23738. var comment = parse_XLNullableWideString(data);
  23739. //if(0 /* fProc */) {
  23740. // unusedstring1: XLNullableWideString
  23741. // description: XLNullableWideString
  23742. // helpTopic: XLNullableWideString
  23743. // unusedstring2: XLNullableWideString
  23744. //}
  23745. data.l = end;
  23746. var out = ({Name:name, Ptg:formula});
  23747. if(itab < 0xFFFFFFF) out.Sheet = itab;
  23748. if(comment) out.Comment = comment;
  23749. return out;
  23750. }
  23751. /* [MS-XLSB] 2.1.7.61 Workbook */
  23752. function parse_wb_bin(data, opts) {
  23753. var wb = { AppVersion:{}, WBProps:{}, WBView:[], Sheets:[], CalcPr:{}, xmlns: "" };
  23754. var state = [];
  23755. var pass = false;
  23756. if(!opts) opts = {};
  23757. opts.biff = 12;
  23758. var Names = [];
  23759. var supbooks = ([[]]);
  23760. supbooks.SheetNames = [];
  23761. supbooks.XTI = [];
  23762. XLSBRecordEnum[0x0010] = { n:"BrtFRTArchID$", f:parse_BrtFRTArchID$ };
  23763. recordhopper(data, function hopper_wb(val, R_n, RT) {
  23764. switch(RT) {
  23765. case 0x009C: /* 'BrtBundleSh' */
  23766. supbooks.SheetNames.push(val.name);
  23767. wb.Sheets.push(val); break;
  23768. case 0x0099: /* 'BrtWbProp' */
  23769. wb.WBProps = val; break;
  23770. case 0x0027: /* 'BrtName' */
  23771. if(val.Sheet != null) opts.SID = val.Sheet;
  23772. val.Ref = stringify_formula(val.Ptg, null, null, supbooks, opts);
  23773. delete opts.SID;
  23774. delete val.Ptg;
  23775. Names.push(val);
  23776. break;
  23777. case 0x040C: /* 'BrtNameExt' */ break;
  23778. case 0x0165: /* 'BrtSupSelf' */
  23779. case 0x0166: /* 'BrtSupSame' */
  23780. case 0x0163: /* 'BrtSupBookSrc' */
  23781. case 0x029B: /* 'BrtSupAddin' */
  23782. if(!supbooks[0].length) supbooks[0] = [RT, val];
  23783. else supbooks.push([RT, val]);
  23784. supbooks[supbooks.length - 1].XTI = [];
  23785. break;
  23786. case 0x016A: /* 'BrtExternSheet' */
  23787. if(supbooks.length === 0) { supbooks[0] = []; supbooks[0].XTI = []; }
  23788. supbooks[supbooks.length - 1].XTI = supbooks[supbooks.length - 1].XTI.concat(val);
  23789. supbooks.XTI = supbooks.XTI.concat(val);
  23790. break;
  23791. case 0x0169: /* 'BrtPlaceholderName' */
  23792. break;
  23793. case 0x0817: /* 'BrtAbsPath15' */
  23794. case 0x009E: /* 'BrtBookView' */
  23795. case 0x008F: /* 'BrtBeginBundleShs' */
  23796. case 0x0298: /* 'BrtBeginFnGroup' */
  23797. case 0x0161: /* 'BrtBeginExternals' */
  23798. break;
  23799. /* case 'BrtModelTimeGroupingCalcCol' */
  23800. case 0x0C00: /* 'BrtUid' */
  23801. case 0x0C01: /* 'BrtRevisionPtr' */
  23802. case 0x0216: /* 'BrtBookProtection' */
  23803. case 0x02A5: /* 'BrtBookProtectionIso' */
  23804. case 0x009D: /* 'BrtCalcProp' */
  23805. case 0x0262: /* 'BrtCrashRecErr' */
  23806. case 0x0802: /* 'BrtDecoupledPivotCacheID' */
  23807. case 0x009B: /* 'BrtFileRecover' */
  23808. case 0x0224: /* 'BrtFileSharing' */
  23809. case 0x02A4: /* 'BrtFileSharingIso' */
  23810. case 0x0080: /* 'BrtFileVersion' */
  23811. case 0x0299: /* 'BrtFnGroup' */
  23812. case 0x0850: /* 'BrtModelRelationship' */
  23813. case 0x084D: /* 'BrtModelTable' */
  23814. case 0x0225: /* 'BrtOleSize' */
  23815. case 0x0805: /* 'BrtPivotTableRef' */
  23816. case 0x0254: /* 'BrtSmartTagType' */
  23817. case 0x081C: /* 'BrtTableSlicerCacheID' */
  23818. case 0x081B: /* 'BrtTableSlicerCacheIDs' */
  23819. case 0x0822: /* 'BrtTimelineCachePivotCacheID' */
  23820. case 0x018D: /* 'BrtUserBookView' */
  23821. case 0x009A: /* 'BrtWbFactoid' */
  23822. case 0x045D: /* 'BrtWbProp14' */
  23823. case 0x0229: /* 'BrtWebOpt' */
  23824. case 0x082B: /* 'BrtWorkBookPr15' */
  23825. break;
  23826. case 0x0023: /* 'BrtFRTBegin' */
  23827. state.push(R_n); pass = true; break;
  23828. case 0x0024: /* 'BrtFRTEnd' */
  23829. state.pop(); pass = false; break;
  23830. case 0x0025: /* 'BrtACBegin' */
  23831. state.push(R_n); pass = true; break;
  23832. case 0x0026: /* 'BrtACEnd' */
  23833. state.pop(); pass = false; break;
  23834. case 0x0010: /* 'BrtFRTArchID$' */ break;
  23835. default:
  23836. if((R_n||"").indexOf("Begin") > 0){/* empty */}
  23837. else if((R_n||"").indexOf("End") > 0){/* empty */}
  23838. else if(!pass || (opts.WTF && state[state.length-1] != "BrtACBegin" && state[state.length-1] != "BrtFRTBegin")) throw new Error("Unexpected record " + RT + " " + R_n);
  23839. }
  23840. }, opts);
  23841. parse_wb_defaults(wb);
  23842. // $FlowIgnore
  23843. wb.Names = Names;
  23844. (wb).supbooks = supbooks;
  23845. return wb;
  23846. }
  23847. function write_BUNDLESHS(ba, wb) {
  23848. write_record(ba, "BrtBeginBundleShs");
  23849. for(var idx = 0; idx != wb.SheetNames.length; ++idx) {
  23850. var viz = wb.Workbook && wb.Workbook.Sheets && wb.Workbook.Sheets[idx] && wb.Workbook.Sheets[idx].Hidden || 0;
  23851. var d = { Hidden: viz, iTabID: idx+1, strRelID: 'rId' + (idx+1), name: wb.SheetNames[idx] };
  23852. write_record(ba, "BrtBundleSh", write_BrtBundleSh(d));
  23853. }
  23854. write_record(ba, "BrtEndBundleShs");
  23855. }
  23856. /* [MS-XLSB] 2.4.649 BrtFileVersion */
  23857. function write_BrtFileVersion(data, o) {
  23858. if(!o) o = new_buf(127);
  23859. for(var i = 0; i != 4; ++i) o.write_shift(4, 0);
  23860. write_XLWideString("SheetJS", o);
  23861. write_XLWideString(XLSX.version, o);
  23862. write_XLWideString(XLSX.version, o);
  23863. write_XLWideString("7262", o);
  23864. o.length = o.l;
  23865. return o.length > o.l ? o.slice(0, o.l) : o;
  23866. }
  23867. /* [MS-XLSB] 2.4.301 BrtBookView */
  23868. function write_BrtBookView(idx, o) {
  23869. if(!o) o = new_buf(29);
  23870. o.write_shift(-4, 0);
  23871. o.write_shift(-4, 460);
  23872. o.write_shift(4, 28800);
  23873. o.write_shift(4, 17600);
  23874. o.write_shift(4, 500);
  23875. o.write_shift(4, idx);
  23876. o.write_shift(4, idx);
  23877. var flags = 0x78;
  23878. o.write_shift(1, flags);
  23879. return o.length > o.l ? o.slice(0, o.l) : o;
  23880. }
  23881. function write_BOOKVIEWS(ba, wb) {
  23882. /* required if hidden tab appears before visible tab */
  23883. if(!wb.Workbook || !wb.Workbook.Sheets) return;
  23884. var sheets = wb.Workbook.Sheets;
  23885. var i = 0, vistab = -1, hidden = -1;
  23886. for(; i < sheets.length; ++i) {
  23887. if(!sheets[i] || !sheets[i].Hidden && vistab == -1) vistab = i;
  23888. else if(sheets[i].Hidden == 1 && hidden == -1) hidden = i;
  23889. }
  23890. if(hidden > vistab) return;
  23891. write_record(ba, "BrtBeginBookViews");
  23892. write_record(ba, "BrtBookView", write_BrtBookView(vistab));
  23893. /* 1*(BrtBookView *FRT) */
  23894. write_record(ba, "BrtEndBookViews");
  23895. }
  23896. /* [MS-XLSB] 2.4.305 BrtCalcProp */
  23897. /*function write_BrtCalcProp(data, o) {
  23898. if(!o) o = new_buf(26);
  23899. o.write_shift(4,0); // force recalc
  23900. o.write_shift(4,1);
  23901. o.write_shift(4,0);
  23902. write_Xnum(0, o);
  23903. o.write_shift(-4, 1023);
  23904. o.write_shift(1, 0x33);
  23905. o.write_shift(1, 0x00);
  23906. return o;
  23907. }*/
  23908. /* [MS-XLSB] 2.4.646 BrtFileRecover */
  23909. /*function write_BrtFileRecover(data, o) {
  23910. if(!o) o = new_buf(1);
  23911. o.write_shift(1,0);
  23912. return o;
  23913. }*/
  23914. /* [MS-XLSB] 2.1.7.61 Workbook */
  23915. function write_wb_bin(wb, opts) {
  23916. var ba = buf_array();
  23917. write_record(ba, "BrtBeginBook");
  23918. write_record(ba, "BrtFileVersion", write_BrtFileVersion());
  23919. /* [[BrtFileSharingIso] BrtFileSharing] */
  23920. write_record(ba, "BrtWbProp", write_BrtWbProp(wb.Workbook && wb.Workbook.WBProps || null));
  23921. /* [ACABSPATH] */
  23922. /* [[BrtBookProtectionIso] BrtBookProtection] */
  23923. write_BOOKVIEWS(ba, wb, opts);
  23924. write_BUNDLESHS(ba, wb, opts);
  23925. /* [FNGROUP] */
  23926. /* [EXTERNALS] */
  23927. /* *BrtName */
  23928. /* write_record(ba, "BrtCalcProp", write_BrtCalcProp()); */
  23929. /* [BrtOleSize] */
  23930. /* *(BrtUserBookView *FRT) */
  23931. /* [PIVOTCACHEIDS] */
  23932. /* [BrtWbFactoid] */
  23933. /* [SMARTTAGTYPES] */
  23934. /* [BrtWebOpt] */
  23935. /* write_record(ba, "BrtFileRecover", write_BrtFileRecover()); */
  23936. /* [WEBPUBITEMS] */
  23937. /* [CRERRS] */
  23938. /* FRTWORKBOOK */
  23939. write_record(ba, "BrtEndBook");
  23940. return ba.end();
  23941. }
  23942. function parse_wb(data, name, opts) {
  23943. if(name.slice(-4)===".bin") return parse_wb_bin((data), opts);
  23944. return parse_wb_xml((data), opts);
  23945. }
  23946. function parse_ws(data, name, idx, opts, rels, wb, themes, styles) {
  23947. if(name.slice(-4)===".bin") return parse_ws_bin((data), opts, idx, rels, wb, themes, styles);
  23948. return parse_ws_xml((data), opts, idx, rels, wb, themes, styles);
  23949. }
  23950. function parse_cs(data, name, idx, opts, rels, wb, themes, styles) {
  23951. if(name.slice(-4)===".bin") return parse_cs_bin((data), opts, idx, rels, wb, themes, styles);
  23952. return parse_cs_xml((data), opts, idx, rels, wb, themes, styles);
  23953. }
  23954. function parse_ms(data, name, idx, opts, rels, wb, themes, styles) {
  23955. if(name.slice(-4)===".bin") return parse_ms_bin((data), opts, idx, rels, wb, themes, styles);
  23956. return parse_ms_xml((data), opts, idx, rels, wb, themes, styles);
  23957. }
  23958. function parse_ds(data, name, idx, opts, rels, wb, themes, styles) {
  23959. if(name.slice(-4)===".bin") return parse_ds_bin((data), opts, idx, rels, wb, themes, styles);
  23960. return parse_ds_xml((data), opts, idx, rels, wb, themes, styles);
  23961. }
  23962. function parse_sty(data, name, themes, opts) {
  23963. if(name.slice(-4)===".bin") return parse_sty_bin((data), themes, opts);
  23964. return parse_sty_xml((data), themes, opts);
  23965. }
  23966. function parse_theme(data, name, opts) {
  23967. return parse_theme_xml(data, opts);
  23968. }
  23969. function parse_sst(data, name, opts) {
  23970. if(name.slice(-4)===".bin") return parse_sst_bin((data), opts);
  23971. return parse_sst_xml((data), opts);
  23972. }
  23973. function parse_cmnt(data, name, opts) {
  23974. if(name.slice(-4)===".bin") return parse_comments_bin((data), opts);
  23975. return parse_comments_xml((data), opts);
  23976. }
  23977. function parse_cc(data, name, opts) {
  23978. if(name.slice(-4)===".bin") return parse_cc_bin((data), name, opts);
  23979. return parse_cc_xml((data), name, opts);
  23980. }
  23981. function parse_xlink(data, rel, name, opts) {
  23982. if(name.slice(-4)===".bin") return parse_xlink_bin((data), rel, name, opts);
  23983. return parse_xlink_xml((data), rel, name, opts);
  23984. }
  23985. function write_wb(wb, name, opts) {
  23986. return (name.slice(-4)===".bin" ? write_wb_bin : write_wb_xml)(wb, opts);
  23987. }
  23988. function write_ws(data, name, opts, wb, rels) {
  23989. return (name.slice(-4)===".bin" ? write_ws_bin : write_ws_xml)(data, opts, wb, rels);
  23990. }
  23991. // eslint-disable-next-line no-unused-vars
  23992. function write_cs(data, name, opts, wb, rels) {
  23993. return (name.slice(-4)===".bin" ? write_cs_bin : write_cs_xml)(data, opts, wb, rels);
  23994. }
  23995. function write_sty(data, name, opts) {
  23996. return (name.slice(-4)===".bin" ? write_sty_bin : write_sty_xml)(data, opts);
  23997. }
  23998. function write_sst(data, name, opts) {
  23999. return (name.slice(-4)===".bin" ? write_sst_bin : write_sst_xml)(data, opts);
  24000. }
  24001. function write_cmnt(data, name, opts) {
  24002. return (name.slice(-4)===".bin" ? write_comments_bin : write_comments_xml)(data, opts);
  24003. }
  24004. /*
  24005. function write_cc(data, name:string, opts) {
  24006. return (name.slice(-4)===".bin" ? write_cc_bin : write_cc_xml)(data, opts);
  24007. }
  24008. */
  24009. var attregexg2=/([\w:]+)=((?:")([^"]*)(?:")|(?:')([^']*)(?:'))/g;
  24010. var attregex2=/([\w:]+)=((?:")(?:[^"]*)(?:")|(?:')(?:[^']*)(?:'))/;
  24011. function xlml_parsexmltag(tag, skip_root) {
  24012. var words = tag.split(/\s+/);
  24013. var z = ([]); if(!skip_root) z[0] = words[0];
  24014. if(words.length === 1) return z;
  24015. var m = tag.match(attregexg2), y, j, w, i;
  24016. if(m) for(i = 0; i != m.length; ++i) {
  24017. y = m[i].match(attregex2);
  24018. if((j=y[1].indexOf(":")) === -1) z[y[1]] = y[2].slice(1,y[2].length-1);
  24019. else {
  24020. if(y[1].slice(0,6) === "xmlns:") w = "xmlns"+y[1].slice(6);
  24021. else w = y[1].slice(j+1);
  24022. z[w] = y[2].slice(1,y[2].length-1);
  24023. }
  24024. }
  24025. return z;
  24026. }
  24027. function xlml_parsexmltagobj(tag) {
  24028. var words = tag.split(/\s+/);
  24029. var z = {};
  24030. if(words.length === 1) return z;
  24031. var m = tag.match(attregexg2), y, j, w, i;
  24032. if(m) for(i = 0; i != m.length; ++i) {
  24033. y = m[i].match(attregex2);
  24034. if((j=y[1].indexOf(":")) === -1) z[y[1]] = y[2].slice(1,y[2].length-1);
  24035. else {
  24036. if(y[1].slice(0,6) === "xmlns:") w = "xmlns"+y[1].slice(6);
  24037. else w = y[1].slice(j+1);
  24038. z[w] = y[2].slice(1,y[2].length-1);
  24039. }
  24040. }
  24041. return z;
  24042. }
  24043. // ----
  24044. function xlml_format(format, value) {
  24045. var fmt = XLMLFormatMap[format] || unescapexml(format);
  24046. if(fmt === "General") return SSF._general(value);
  24047. return SSF.format(fmt, value);
  24048. }
  24049. function xlml_set_custprop(Custprops, key, cp, val) {
  24050. var oval = val;
  24051. switch((cp[0].match(/dt:dt="([\w.]+)"/)||["",""])[1]) {
  24052. case "boolean": oval = parsexmlbool(val); break;
  24053. case "i2": case "int": oval = parseInt(val, 10); break;
  24054. case "r4": case "float": oval = parseFloat(val); break;
  24055. case "date": case "dateTime.tz": oval = parseDate(val); break;
  24056. case "i8": case "string": case "fixed": case "uuid": case "bin.base64": break;
  24057. default: throw new Error("bad custprop:" + cp[0]);
  24058. }
  24059. Custprops[unescapexml(key)] = oval;
  24060. }
  24061. function safe_format_xlml(cell, nf, o) {
  24062. if(cell.t === 'z') return;
  24063. if(!o || o.cellText !== false) try {
  24064. if(cell.t === 'e') { cell.w = cell.w || BErr[cell.v]; }
  24065. else if(nf === "General") {
  24066. if(cell.t === 'n') {
  24067. if((cell.v|0) === cell.v) cell.w = SSF._general_int(cell.v);
  24068. else cell.w = SSF._general_num(cell.v);
  24069. }
  24070. else cell.w = SSF._general(cell.v);
  24071. }
  24072. else cell.w = xlml_format(nf||"General", cell.v);
  24073. } catch(e) { if(o.WTF) throw e; }
  24074. try {
  24075. var z = XLMLFormatMap[nf]||nf||"General";
  24076. if(o.cellNF) cell.z = z;
  24077. if(o.cellDates && cell.t == 'n' && SSF.is_date(z)) {
  24078. var _d = SSF.parse_date_code(cell.v); if(_d) { cell.t = 'd'; cell.v = new Date(_d.y, _d.m-1,_d.d,_d.H,_d.M,_d.S,_d.u); }
  24079. }
  24080. } catch(e) { if(o.WTF) throw e; }
  24081. }
  24082. function process_style_xlml(styles, stag, opts) {
  24083. if(opts.cellStyles) {
  24084. if(stag.Interior) {
  24085. var I = stag.Interior;
  24086. if(I.Pattern) I.patternType = XLMLPatternTypeMap[I.Pattern] || I.Pattern;
  24087. }
  24088. }
  24089. styles[stag.ID] = stag;
  24090. }
  24091. /* TODO: there must exist some form of OSP-blessed spec */
  24092. function parse_xlml_data(xml, ss, data, cell, base, styles, csty, row, arrayf, o) {
  24093. var nf = "General", sid = cell.StyleID, S = {}; o = o || {};
  24094. var interiors = [];
  24095. var i = 0;
  24096. if(sid === undefined && row) sid = row.StyleID;
  24097. if(sid === undefined && csty) sid = csty.StyleID;
  24098. while(styles[sid] !== undefined) {
  24099. if(styles[sid].nf) nf = styles[sid].nf;
  24100. if(styles[sid].Interior) interiors.push(styles[sid].Interior);
  24101. if(!styles[sid].Parent) break;
  24102. sid = styles[sid].Parent;
  24103. }
  24104. switch(data.Type) {
  24105. case 'Boolean':
  24106. cell.t = 'b';
  24107. cell.v = parsexmlbool(xml);
  24108. break;
  24109. case 'String':
  24110. cell.t = 's'; cell.r = xlml_fixstr(unescapexml(xml));
  24111. cell.v = (xml.indexOf("<") > -1 ? unescapexml(ss||xml).replace(/<.*?>/g, "") : cell.r); // todo: BR etc
  24112. break;
  24113. case 'DateTime':
  24114. if(xml.slice(-1) != "Z") xml += "Z";
  24115. cell.v = (parseDate(xml) - new Date(Date.UTC(1899, 11, 30))) / (24 * 60 * 60 * 1000);
  24116. if(cell.v !== cell.v) cell.v = unescapexml(xml);
  24117. else if(cell.v<60) cell.v = cell.v -1;
  24118. if(!nf || nf == "General") nf = "yyyy-mm-dd";
  24119. /* falls through */
  24120. case 'Number':
  24121. if(cell.v === undefined) cell.v=+xml;
  24122. if(!cell.t) cell.t = 'n';
  24123. break;
  24124. case 'Error': cell.t = 'e'; cell.v = RBErr[xml]; if(o.cellText !== false) cell.w = xml; break;
  24125. default:
  24126. if(xml == "" && ss == "") { cell.t = 'z'; }
  24127. else { cell.t = 's'; cell.v = xlml_fixstr(ss||xml); }
  24128. break;
  24129. }
  24130. safe_format_xlml(cell, nf, o);
  24131. if(o.cellFormula !== false) {
  24132. if(cell.Formula) {
  24133. var fstr = unescapexml(cell.Formula);
  24134. /* strictly speaking, the leading = is required but some writers omit */
  24135. if(fstr.charCodeAt(0) == 61 /* = */) fstr = fstr.slice(1);
  24136. cell.f = rc_to_a1(fstr, base);
  24137. delete cell.Formula;
  24138. if(cell.ArrayRange == "RC") cell.F = rc_to_a1("RC:RC", base);
  24139. else if(cell.ArrayRange) {
  24140. cell.F = rc_to_a1(cell.ArrayRange, base);
  24141. arrayf.push([safe_decode_range(cell.F), cell.F]);
  24142. }
  24143. } else {
  24144. for(i = 0; i < arrayf.length; ++i)
  24145. if(base.r >= arrayf[i][0].s.r && base.r <= arrayf[i][0].e.r)
  24146. if(base.c >= arrayf[i][0].s.c && base.c <= arrayf[i][0].e.c)
  24147. cell.F = arrayf[i][1];
  24148. }
  24149. }
  24150. if(o.cellStyles) {
  24151. interiors.forEach(function(x) {
  24152. if(!S.patternType && x.patternType) S.patternType = x.patternType;
  24153. });
  24154. cell.s = S;
  24155. }
  24156. if(cell.StyleID !== undefined) cell.ixfe = cell.StyleID;
  24157. }
  24158. function xlml_clean_comment(comment) {
  24159. comment.t = comment.v || "";
  24160. comment.t = comment.t.replace(/\r\n/g,"\n").replace(/\r/g,"\n");
  24161. comment.v = comment.w = comment.ixfe = undefined;
  24162. }
  24163. function xlml_normalize(d) {
  24164. if(has_buf && Buffer.isBuffer(d)) return d.toString('utf8');
  24165. if(typeof d === 'string') return d;
  24166. /* duktape */
  24167. if(typeof Uint8Array !== 'undefined' && d instanceof Uint8Array) return utf8read(a2s(ab2a(d)));
  24168. throw new Error("Bad input format: expected Buffer or string");
  24169. }
  24170. /* TODO: Everything */
  24171. /* UOS uses CJK in tags */
  24172. var xlmlregex = /<(\/?)([^\s?><!\/:]*:|)([^\s?<>:\/]+)(?:[\s?:\/][^>]*)?>/mg;
  24173. //var xlmlregex = /<(\/?)([a-z0-9]*:|)(\w+)[^>]*>/mg;
  24174. function parse_xlml_xml(d, _opts) {
  24175. var opts = _opts || {};
  24176. make_ssf(SSF);
  24177. var str = debom(xlml_normalize(d));
  24178. if(opts.type == 'binary' || opts.type == 'array' || opts.type == 'base64') {
  24179. if(typeof cptable !== 'undefined') str = cptable.utils.decode(65001, char_codes(str));
  24180. else str = utf8read(str);
  24181. }
  24182. var opening = str.slice(0, 1024).toLowerCase(), ishtml = false;
  24183. if(opening.indexOf("<?xml") == -1) ["html", "table", "head", "meta", "script", "style", "div"].forEach(function(tag) { if(opening.indexOf("<" + tag) >= 0) ishtml = true; });
  24184. if(ishtml) return HTML_.to_workbook(str, opts);
  24185. var Rn;
  24186. var state = [], tmp;
  24187. if(DENSE != null && opts.dense == null) opts.dense = DENSE;
  24188. var sheets = {}, sheetnames = [], cursheet = (opts.dense ? [] : {}), sheetname = "";
  24189. var table = {}, cell = ({}), row = {};// eslint-disable-line no-unused-vars
  24190. var dtag = xlml_parsexmltag('<Data ss:Type="String">'), didx = 0;
  24191. var c = 0, r = 0;
  24192. var refguess = {s: {r:2000000, c:2000000}, e: {r:0, c:0} };
  24193. var styles = {}, stag = {};
  24194. var ss = "", fidx = 0;
  24195. var merges = [];
  24196. var Props = {}, Custprops = {}, pidx = 0, cp = [];
  24197. var comments = [], comment = ({});
  24198. var cstys = [], csty, seencol = false;
  24199. var arrayf = [];
  24200. var rowinfo = [], rowobj = {}, cc = 0, rr = 0;
  24201. var Workbook = ({ Sheets:[], WBProps:{date1904:false} }), wsprops = {};
  24202. xlmlregex.lastIndex = 0;
  24203. str = str.replace(/<!--([\s\S]*?)-->/mg,"");
  24204. var raw_Rn3 = "";
  24205. while((Rn = xlmlregex.exec(str))) switch((Rn[3] = (raw_Rn3 = Rn[3]).toLowerCase())) {
  24206. case 'data' /*case 'Data'*/:
  24207. if(raw_Rn3 == "data") {
  24208. if(Rn[1]==='/'){if((tmp=state.pop())[0]!==Rn[3]) throw new Error("Bad state: "+tmp.join("|"));}
  24209. else if(Rn[0].charAt(Rn[0].length-2) !== '/') state.push([Rn[3], true]);
  24210. break;
  24211. }
  24212. if(state[state.length-1][1]) break;
  24213. if(Rn[1]==='/') parse_xlml_data(str.slice(didx, Rn.index), ss, dtag, state[state.length-1][0]==/*"Comment"*/"comment"?comment:cell, {c:c,r:r}, styles, cstys[c], row, arrayf, opts);
  24214. else { ss = ""; dtag = xlml_parsexmltag(Rn[0]); didx = Rn.index + Rn[0].length; }
  24215. break;
  24216. case 'cell' /*case 'Cell'*/:
  24217. if(Rn[1]==='/'){
  24218. if(comments.length > 0) cell.c = comments;
  24219. if((!opts.sheetRows || opts.sheetRows > r) && cell.v !== undefined) {
  24220. if(opts.dense) {
  24221. if(!cursheet[r]) cursheet[r] = [];
  24222. cursheet[r][c] = cell;
  24223. } else cursheet[encode_col(c) + encode_row(r)] = cell;
  24224. }
  24225. if(cell.HRef) {
  24226. cell.l = ({Target:cell.HRef});
  24227. if(cell.HRefScreenTip) cell.l.Tooltip = cell.HRefScreenTip;
  24228. delete cell.HRef; delete cell.HRefScreenTip;
  24229. }
  24230. if(cell.MergeAcross || cell.MergeDown) {
  24231. cc = c + (parseInt(cell.MergeAcross,10)|0);
  24232. rr = r + (parseInt(cell.MergeDown,10)|0);
  24233. merges.push({s:{c:c,r:r},e:{c:cc,r:rr}});
  24234. }
  24235. if(!opts.sheetStubs) { if(cell.MergeAcross) c = cc + 1; else ++c; }
  24236. else if(cell.MergeAcross || cell.MergeDown) {
  24237. for(var cma = c; cma <= cc; ++cma) {
  24238. for(var cmd = r; cmd <= rr; ++cmd) {
  24239. if(cma > c || cmd > r) {
  24240. if(opts.dense) {
  24241. if(!cursheet[cmd]) cursheet[cmd] = [];
  24242. cursheet[cmd][cma] = {t:'z'};
  24243. } else cursheet[encode_col(cma) + encode_row(cmd)] = {t:'z'};
  24244. }
  24245. }
  24246. }
  24247. c = cc + 1;
  24248. }
  24249. else ++c;
  24250. } else {
  24251. cell = xlml_parsexmltagobj(Rn[0]);
  24252. if(cell.Index) c = +cell.Index - 1;
  24253. if(c < refguess.s.c) refguess.s.c = c;
  24254. if(c > refguess.e.c) refguess.e.c = c;
  24255. if(Rn[0].slice(-2) === "/>") ++c;
  24256. comments = [];
  24257. }
  24258. break;
  24259. case 'row' /*case 'Row'*/:
  24260. if(Rn[1]==='/' || Rn[0].slice(-2) === "/>") {
  24261. if(r < refguess.s.r) refguess.s.r = r;
  24262. if(r > refguess.e.r) refguess.e.r = r;
  24263. if(Rn[0].slice(-2) === "/>") {
  24264. row = xlml_parsexmltag(Rn[0]);
  24265. if(row.Index) r = +row.Index - 1;
  24266. }
  24267. c = 0; ++r;
  24268. } else {
  24269. row = xlml_parsexmltag(Rn[0]);
  24270. if(row.Index) r = +row.Index - 1;
  24271. rowobj = {};
  24272. if(row.AutoFitHeight == "0" || row.Height) {
  24273. rowobj.hpx = parseInt(row.Height, 10); rowobj.hpt = px2pt(rowobj.hpx);
  24274. rowinfo[r] = rowobj;
  24275. }
  24276. if(row.Hidden == "1") { rowobj.hidden = true; rowinfo[r] = rowobj; }
  24277. }
  24278. break;
  24279. case 'worksheet' /*case 'Worksheet'*/: /* TODO: read range from FullRows/FullColumns */
  24280. if(Rn[1]==='/'){
  24281. if((tmp=state.pop())[0]!==Rn[3]) throw new Error("Bad state: "+tmp.join("|"));
  24282. sheetnames.push(sheetname);
  24283. if(refguess.s.r <= refguess.e.r && refguess.s.c <= refguess.e.c) {
  24284. cursheet["!ref"] = encode_range(refguess);
  24285. if(opts.sheetRows && opts.sheetRows <= refguess.e.r) {
  24286. cursheet["!fullref"] = cursheet["!ref"];
  24287. refguess.e.r = opts.sheetRows - 1;
  24288. cursheet["!ref"] = encode_range(refguess);
  24289. }
  24290. }
  24291. if(merges.length) cursheet["!merges"] = merges;
  24292. if(cstys.length > 0) cursheet["!cols"] = cstys;
  24293. if(rowinfo.length > 0) cursheet["!rows"] = rowinfo;
  24294. sheets[sheetname] = cursheet;
  24295. } else {
  24296. refguess = {s: {r:2000000, c:2000000}, e: {r:0, c:0} };
  24297. r = c = 0;
  24298. state.push([Rn[3], false]);
  24299. tmp = xlml_parsexmltag(Rn[0]);
  24300. sheetname = unescapexml(tmp.Name);
  24301. cursheet = (opts.dense ? [] : {});
  24302. merges = [];
  24303. arrayf = [];
  24304. rowinfo = [];
  24305. wsprops = {name:sheetname, Hidden:0};
  24306. Workbook.Sheets.push(wsprops);
  24307. }
  24308. break;
  24309. case 'table' /*case 'Table'*/:
  24310. if(Rn[1]==='/'){if((tmp=state.pop())[0]!==Rn[3]) throw new Error("Bad state: "+tmp.join("|"));}
  24311. else if(Rn[0].slice(-2) == "/>") break;
  24312. else {
  24313. table = xlml_parsexmltag(Rn[0]);
  24314. state.push([Rn[3], false]);
  24315. cstys = []; seencol = false;
  24316. }
  24317. break;
  24318. case 'style' /*case 'Style'*/:
  24319. if(Rn[1]==='/') process_style_xlml(styles, stag, opts);
  24320. else stag = xlml_parsexmltag(Rn[0]);
  24321. break;
  24322. case 'numberformat' /*case 'NumberFormat'*/:
  24323. stag.nf = unescapexml(xlml_parsexmltag(Rn[0]).Format || "General");
  24324. if(XLMLFormatMap[stag.nf]) stag.nf = XLMLFormatMap[stag.nf];
  24325. for(var ssfidx = 0; ssfidx != 0x188; ++ssfidx) if(SSF._table[ssfidx] == stag.nf) break;
  24326. if(ssfidx == 0x188) for(ssfidx = 0x39; ssfidx != 0x188; ++ssfidx) if(SSF._table[ssfidx] == null) { SSF.load(stag.nf, ssfidx); break; }
  24327. break;
  24328. case 'column' /*case 'Column'*/:
  24329. if(state[state.length-1][0] !== /*'Table'*/'table') break;
  24330. csty = xlml_parsexmltag(Rn[0]);
  24331. if(csty.Hidden) { csty.hidden = true; delete csty.Hidden; }
  24332. if(csty.Width) csty.wpx = parseInt(csty.Width, 10);
  24333. if(!seencol && csty.wpx > 10) {
  24334. seencol = true; MDW = DEF_MDW; //find_mdw_wpx(csty.wpx);
  24335. for(var _col = 0; _col < cstys.length; ++_col) if(cstys[_col]) process_col(cstys[_col]);
  24336. }
  24337. if(seencol) process_col(csty);
  24338. cstys[(csty.Index-1||cstys.length)] = csty;
  24339. for(var i = 0; i < +csty.Span; ++i) cstys[cstys.length] = dup(csty);
  24340. break;
  24341. case 'namedrange' /*case 'NamedRange'*/:
  24342. if(Rn[1]==='/') break;
  24343. if(!Workbook.Names) Workbook.Names = [];
  24344. var _NamedRange = parsexmltag(Rn[0]);
  24345. var _DefinedName = ({
  24346. Name: _NamedRange.Name,
  24347. Ref: rc_to_a1(_NamedRange.RefersTo.slice(1), {r:0, c:0})
  24348. });
  24349. if(Workbook.Sheets.length>0) _DefinedName.Sheet=Workbook.Sheets.length-1;
  24350. Workbook.Names.push(_DefinedName);
  24351. break;
  24352. case 'namedcell' /*case 'NamedCell'*/: break;
  24353. case 'b' /*case 'B'*/: break;
  24354. case 'i' /*case 'I'*/: break;
  24355. case 'u' /*case 'U'*/: break;
  24356. case 's' /*case 'S'*/: break;
  24357. case 'em' /*case 'EM'*/: break;
  24358. case 'h2' /*case 'H2'*/: break;
  24359. case 'h3' /*case 'H3'*/: break;
  24360. case 'sub' /*case 'Sub'*/: break;
  24361. case 'sup' /*case 'Sup'*/: break;
  24362. case 'span' /*case 'Span'*/: break;
  24363. case 'alignment' /*case 'Alignment'*/:
  24364. break;
  24365. case 'borders' /*case 'Borders'*/: break;
  24366. case 'border' /*case 'Border'*/: break;
  24367. case 'font' /*case 'Font'*/:
  24368. if(Rn[0].slice(-2) === "/>") break;
  24369. else if(Rn[1]==="/") ss += str.slice(fidx, Rn.index);
  24370. else fidx = Rn.index + Rn[0].length;
  24371. break;
  24372. case 'interior' /*case 'Interior'*/:
  24373. if(!opts.cellStyles) break;
  24374. stag.Interior = xlml_parsexmltag(Rn[0]);
  24375. break;
  24376. case 'protection' /*case 'Protection'*/: break;
  24377. case 'author' /*case 'Author'*/:
  24378. case 'title' /*case 'Title'*/:
  24379. case 'description' /*case 'Description'*/:
  24380. case 'created' /*case 'Created'*/:
  24381. case 'keywords' /*case 'Keywords'*/:
  24382. case 'subject' /*case 'Subject'*/:
  24383. case 'category' /*case 'Category'*/:
  24384. case 'company' /*case 'Company'*/:
  24385. case 'lastauthor' /*case 'LastAuthor'*/:
  24386. case 'lastsaved' /*case 'LastSaved'*/:
  24387. case 'lastprinted' /*case 'LastPrinted'*/:
  24388. case 'version' /*case 'Version'*/:
  24389. case 'revision' /*case 'Revision'*/:
  24390. case 'totaltime' /*case 'TotalTime'*/:
  24391. case 'hyperlinkbase' /*case 'HyperlinkBase'*/:
  24392. case 'manager' /*case 'Manager'*/:
  24393. case 'contentstatus' /*case 'ContentStatus'*/:
  24394. case 'identifier' /*case 'Identifier'*/:
  24395. case 'language' /*case 'Language'*/:
  24396. case 'appname' /*case 'AppName'*/:
  24397. if(Rn[0].slice(-2) === "/>") break;
  24398. else if(Rn[1]==="/") xlml_set_prop(Props, raw_Rn3, str.slice(pidx, Rn.index));
  24399. else pidx = Rn.index + Rn[0].length;
  24400. break;
  24401. case 'paragraphs' /*case 'Paragraphs'*/: break;
  24402. case 'styles' /*case 'Styles'*/:
  24403. case 'workbook' /*case 'Workbook'*/:
  24404. if(Rn[1]==='/'){if((tmp=state.pop())[0]!==Rn[3]) throw new Error("Bad state: "+tmp.join("|"));}
  24405. else state.push([Rn[3], false]);
  24406. break;
  24407. case 'comment' /*case 'Comment'*/:
  24408. if(Rn[1]==='/'){
  24409. if((tmp=state.pop())[0]!==Rn[3]) throw new Error("Bad state: "+tmp.join("|"));
  24410. xlml_clean_comment(comment);
  24411. comments.push(comment);
  24412. } else {
  24413. state.push([Rn[3], false]);
  24414. tmp = xlml_parsexmltag(Rn[0]);
  24415. comment = ({a:tmp.Author});
  24416. }
  24417. break;
  24418. case 'autofilter' /*case 'AutoFilter'*/:
  24419. if(Rn[1]==='/'){if((tmp=state.pop())[0]!==Rn[3]) throw new Error("Bad state: "+tmp.join("|"));}
  24420. else if(Rn[0].charAt(Rn[0].length-2) !== '/') {
  24421. var AutoFilter = xlml_parsexmltag(Rn[0]);
  24422. cursheet['!autofilter'] = { ref:rc_to_a1(AutoFilter.Range).replace(/\$/g,"") };
  24423. state.push([Rn[3], true]);
  24424. }
  24425. break;
  24426. case 'name' /*case 'Name'*/: break;
  24427. case 'datavalidation' /*case 'DataValidation'*/:
  24428. if(Rn[1]==='/'){
  24429. if((tmp=state.pop())[0]!==Rn[3]) throw new Error("Bad state: "+tmp.join("|"));
  24430. } else {
  24431. if(Rn[0].charAt(Rn[0].length-2) !== '/') state.push([Rn[3], true]);
  24432. }
  24433. break;
  24434. case 'pixelsperinch' /*case 'PixelsPerInch'*/:
  24435. break;
  24436. case 'componentoptions' /*case 'ComponentOptions'*/:
  24437. case 'documentproperties' /*case 'DocumentProperties'*/:
  24438. case 'customdocumentproperties' /*case 'CustomDocumentProperties'*/:
  24439. case 'officedocumentsettings' /*case 'OfficeDocumentSettings'*/:
  24440. case 'pivottable' /*case 'PivotTable'*/:
  24441. case 'pivotcache' /*case 'PivotCache'*/:
  24442. case 'names' /*case 'Names'*/:
  24443. case 'mapinfo' /*case 'MapInfo'*/:
  24444. case 'pagebreaks' /*case 'PageBreaks'*/:
  24445. case 'querytable' /*case 'QueryTable'*/:
  24446. case 'sorting' /*case 'Sorting'*/:
  24447. case 'schema' /*case 'Schema'*/: //case 'data' /*case 'data'*/:
  24448. case 'conditionalformatting' /*case 'ConditionalFormatting'*/:
  24449. case 'smarttagtype' /*case 'SmartTagType'*/:
  24450. case 'smarttags' /*case 'SmartTags'*/:
  24451. case 'excelworkbook' /*case 'ExcelWorkbook'*/:
  24452. case 'workbookoptions' /*case 'WorkbookOptions'*/:
  24453. case 'worksheetoptions' /*case 'WorksheetOptions'*/:
  24454. if(Rn[1]==='/'){if((tmp=state.pop())[0]!==Rn[3]) throw new Error("Bad state: "+tmp.join("|"));}
  24455. else if(Rn[0].charAt(Rn[0].length-2) !== '/') state.push([Rn[3], true]);
  24456. break;
  24457. default:
  24458. /* FODS file root is <office:document> */
  24459. if(state.length == 0 && Rn[3] == "document") return parse_fods(str, opts);
  24460. /* UOS file root is <uof:UOF> */
  24461. if(state.length == 0 && Rn[3] == "uof"/*"UOF"*/) return parse_fods(str, opts);
  24462. var seen = true;
  24463. switch(state[state.length-1][0]) {
  24464. /* OfficeDocumentSettings */
  24465. case 'officedocumentsettings' /*case 'OfficeDocumentSettings'*/: switch(Rn[3]) {
  24466. case 'allowpng' /*case 'AllowPNG'*/: break;
  24467. case 'removepersonalinformation' /*case 'RemovePersonalInformation'*/: break;
  24468. case 'downloadcomponents' /*case 'DownloadComponents'*/: break;
  24469. case 'locationofcomponents' /*case 'LocationOfComponents'*/: break;
  24470. case 'colors' /*case 'Colors'*/: break;
  24471. case 'color' /*case 'Color'*/: break;
  24472. case 'index' /*case 'Index'*/: break;
  24473. case 'rgb' /*case 'RGB'*/: break;
  24474. case 'targetscreensize' /*case 'TargetScreenSize'*/: break;
  24475. case 'readonlyrecommended' /*case 'ReadOnlyRecommended'*/: break;
  24476. default: seen = false;
  24477. } break;
  24478. /* ComponentOptions */
  24479. case 'componentoptions' /*case 'ComponentOptions'*/: switch(Rn[3]) {
  24480. case 'toolbar' /*case 'Toolbar'*/: break;
  24481. case 'hideofficelogo' /*case 'HideOfficeLogo'*/: break;
  24482. case 'spreadsheetautofit' /*case 'SpreadsheetAutoFit'*/: break;
  24483. case 'label' /*case 'Label'*/: break;
  24484. case 'caption' /*case 'Caption'*/: break;
  24485. case 'maxheight' /*case 'MaxHeight'*/: break;
  24486. case 'maxwidth' /*case 'MaxWidth'*/: break;
  24487. case 'nextsheetnumber' /*case 'NextSheetNumber'*/: break;
  24488. default: seen = false;
  24489. } break;
  24490. /* ExcelWorkbook */
  24491. case 'excelworkbook' /*case 'ExcelWorkbook'*/: switch(Rn[3]) {
  24492. case 'date1904' /*case 'Date1904'*/:
  24493. Workbook.WBProps.date1904 = true;
  24494. break;
  24495. case 'windowheight' /*case 'WindowHeight'*/: break;
  24496. case 'windowwidth' /*case 'WindowWidth'*/: break;
  24497. case 'windowtopx' /*case 'WindowTopX'*/: break;
  24498. case 'windowtopy' /*case 'WindowTopY'*/: break;
  24499. case 'tabratio' /*case 'TabRatio'*/: break;
  24500. case 'protectstructure' /*case 'ProtectStructure'*/: break;
  24501. case 'protectwindow' /*case 'ProtectWindow'*/: break;
  24502. case 'protectwindows' /*case 'ProtectWindows'*/: break;
  24503. case 'activesheet' /*case 'ActiveSheet'*/: break;
  24504. case 'displayinknotes' /*case 'DisplayInkNotes'*/: break;
  24505. case 'firstvisiblesheet' /*case 'FirstVisibleSheet'*/: break;
  24506. case 'supbook' /*case 'SupBook'*/: break;
  24507. case 'sheetname' /*case 'SheetName'*/: break;
  24508. case 'sheetindex' /*case 'SheetIndex'*/: break;
  24509. case 'sheetindexfirst' /*case 'SheetIndexFirst'*/: break;
  24510. case 'sheetindexlast' /*case 'SheetIndexLast'*/: break;
  24511. case 'dll' /*case 'Dll'*/: break;
  24512. case 'acceptlabelsinformulas' /*case 'AcceptLabelsInFormulas'*/: break;
  24513. case 'donotsavelinkvalues' /*case 'DoNotSaveLinkValues'*/: break;
  24514. case 'iteration' /*case 'Iteration'*/: break;
  24515. case 'maxiterations' /*case 'MaxIterations'*/: break;
  24516. case 'maxchange' /*case 'MaxChange'*/: break;
  24517. case 'path' /*case 'Path'*/: break;
  24518. case 'xct' /*case 'Xct'*/: break;
  24519. case 'count' /*case 'Count'*/: break;
  24520. case 'selectedsheets' /*case 'SelectedSheets'*/: break;
  24521. case 'calculation' /*case 'Calculation'*/: break;
  24522. case 'uncalced' /*case 'Uncalced'*/: break;
  24523. case 'startupprompt' /*case 'StartupPrompt'*/: break;
  24524. case 'crn' /*case 'Crn'*/: break;
  24525. case 'externname' /*case 'ExternName'*/: break;
  24526. case 'formula' /*case 'Formula'*/: break;
  24527. case 'colfirst' /*case 'ColFirst'*/: break;
  24528. case 'collast' /*case 'ColLast'*/: break;
  24529. case 'wantadvise' /*case 'WantAdvise'*/: break;
  24530. case 'boolean' /*case 'Boolean'*/: break;
  24531. case 'error' /*case 'Error'*/: break;
  24532. case 'text' /*case 'Text'*/: break;
  24533. case 'ole' /*case 'OLE'*/: break;
  24534. case 'noautorecover' /*case 'NoAutoRecover'*/: break;
  24535. case 'publishobjects' /*case 'PublishObjects'*/: break;
  24536. case 'donotcalculatebeforesave' /*case 'DoNotCalculateBeforeSave'*/: break;
  24537. case 'number' /*case 'Number'*/: break;
  24538. case 'refmoder1c1' /*case 'RefModeR1C1'*/: break;
  24539. case 'embedsavesmarttags' /*case 'EmbedSaveSmartTags'*/: break;
  24540. default: seen = false;
  24541. } break;
  24542. /* WorkbookOptions */
  24543. case 'workbookoptions' /*case 'WorkbookOptions'*/: switch(Rn[3]) {
  24544. case 'owcversion' /*case 'OWCVersion'*/: break;
  24545. case 'height' /*case 'Height'*/: break;
  24546. case 'width' /*case 'Width'*/: break;
  24547. default: seen = false;
  24548. } break;
  24549. /* WorksheetOptions */
  24550. case 'worksheetoptions' /*case 'WorksheetOptions'*/: switch(Rn[3]) {
  24551. case 'visible' /*case 'Visible'*/:
  24552. if(Rn[0].slice(-2) === "/>"){/* empty */}
  24553. else if(Rn[1]==="/") switch(str.slice(pidx, Rn.index)) {
  24554. case "SheetHidden": wsprops.Hidden = 1; break;
  24555. case "SheetVeryHidden": wsprops.Hidden = 2; break;
  24556. }
  24557. else pidx = Rn.index + Rn[0].length;
  24558. break;
  24559. case 'header' /*case 'Header'*/:
  24560. if(!cursheet['!margins']) default_margins(cursheet['!margins']={}, 'xlml');
  24561. cursheet['!margins'].header = parsexmltag(Rn[0]).Margin;
  24562. break;
  24563. case 'footer' /*case 'Footer'*/:
  24564. if(!cursheet['!margins']) default_margins(cursheet['!margins']={}, 'xlml');
  24565. cursheet['!margins'].footer = parsexmltag(Rn[0]).Margin;
  24566. break;
  24567. case 'pagemargins' /*case 'PageMargins'*/:
  24568. var pagemargins = parsexmltag(Rn[0]);
  24569. if(!cursheet['!margins']) default_margins(cursheet['!margins']={},'xlml');
  24570. if(pagemargins.Top) cursheet['!margins'].top = pagemargins.Top;
  24571. if(pagemargins.Left) cursheet['!margins'].left = pagemargins.Left;
  24572. if(pagemargins.Right) cursheet['!margins'].right = pagemargins.Right;
  24573. if(pagemargins.Bottom) cursheet['!margins'].bottom = pagemargins.Bottom;
  24574. break;
  24575. case 'displayrighttoleft' /*case 'DisplayRightToLeft'*/:
  24576. if(!Workbook.Views) Workbook.Views = [];
  24577. if(!Workbook.Views[0]) Workbook.Views[0] = {};
  24578. Workbook.Views[0].RTL = true;
  24579. break;
  24580. case 'freezepanes' /*case 'FreezePanes'*/: break;
  24581. case 'frozennosplit' /*case 'FrozenNoSplit'*/: break;
  24582. case 'splithorizontal' /*case 'SplitHorizontal'*/:
  24583. case 'splitvertical' /*case 'SplitVertical'*/:
  24584. break;
  24585. case 'donotdisplaygridlines' /*case 'DoNotDisplayGridlines'*/:
  24586. break;
  24587. case 'activerow' /*case 'ActiveRow'*/: break;
  24588. case 'activecol' /*case 'ActiveCol'*/: break;
  24589. case 'toprowbottompane' /*case 'TopRowBottomPane'*/: break;
  24590. case 'leftcolumnrightpane' /*case 'LeftColumnRightPane'*/: break;
  24591. case 'unsynced' /*case 'Unsynced'*/: break;
  24592. case 'print' /*case 'Print'*/: break;
  24593. case 'panes' /*case 'Panes'*/: break;
  24594. case 'scale' /*case 'Scale'*/: break;
  24595. case 'pane' /*case 'Pane'*/: break;
  24596. case 'number' /*case 'Number'*/: break;
  24597. case 'layout' /*case 'Layout'*/: break;
  24598. case 'pagesetup' /*case 'PageSetup'*/: break;
  24599. case 'selected' /*case 'Selected'*/: break;
  24600. case 'protectobjects' /*case 'ProtectObjects'*/: break;
  24601. case 'enableselection' /*case 'EnableSelection'*/: break;
  24602. case 'protectscenarios' /*case 'ProtectScenarios'*/: break;
  24603. case 'validprinterinfo' /*case 'ValidPrinterInfo'*/: break;
  24604. case 'horizontalresolution' /*case 'HorizontalResolution'*/: break;
  24605. case 'verticalresolution' /*case 'VerticalResolution'*/: break;
  24606. case 'numberofcopies' /*case 'NumberofCopies'*/: break;
  24607. case 'activepane' /*case 'ActivePane'*/: break;
  24608. case 'toprowvisible' /*case 'TopRowVisible'*/: break;
  24609. case 'leftcolumnvisible' /*case 'LeftColumnVisible'*/: break;
  24610. case 'fittopage' /*case 'FitToPage'*/: break;
  24611. case 'rangeselection' /*case 'RangeSelection'*/: break;
  24612. case 'papersizeindex' /*case 'PaperSizeIndex'*/: break;
  24613. case 'pagelayoutzoom' /*case 'PageLayoutZoom'*/: break;
  24614. case 'pagebreakzoom' /*case 'PageBreakZoom'*/: break;
  24615. case 'filteron' /*case 'FilterOn'*/: break;
  24616. case 'fitwidth' /*case 'FitWidth'*/: break;
  24617. case 'fitheight' /*case 'FitHeight'*/: break;
  24618. case 'commentslayout' /*case 'CommentsLayout'*/: break;
  24619. case 'zoom' /*case 'Zoom'*/: break;
  24620. case 'lefttoright' /*case 'LeftToRight'*/: break;
  24621. case 'gridlines' /*case 'Gridlines'*/: break;
  24622. case 'allowsort' /*case 'AllowSort'*/: break;
  24623. case 'allowfilter' /*case 'AllowFilter'*/: break;
  24624. case 'allowinsertrows' /*case 'AllowInsertRows'*/: break;
  24625. case 'allowdeleterows' /*case 'AllowDeleteRows'*/: break;
  24626. case 'allowinsertcols' /*case 'AllowInsertCols'*/: break;
  24627. case 'allowdeletecols' /*case 'AllowDeleteCols'*/: break;
  24628. case 'allowinserthyperlinks' /*case 'AllowInsertHyperlinks'*/: break;
  24629. case 'allowformatcells' /*case 'AllowFormatCells'*/: break;
  24630. case 'allowsizecols' /*case 'AllowSizeCols'*/: break;
  24631. case 'allowsizerows' /*case 'AllowSizeRows'*/: break;
  24632. case 'nosummaryrowsbelowdetail' /*case 'NoSummaryRowsBelowDetail'*/: break;
  24633. case 'tabcolorindex' /*case 'TabColorIndex'*/: break;
  24634. case 'donotdisplayheadings' /*case 'DoNotDisplayHeadings'*/: break;
  24635. case 'showpagelayoutzoom' /*case 'ShowPageLayoutZoom'*/: break;
  24636. case 'nosummarycolumnsrightdetail' /*case 'NoSummaryColumnsRightDetail'*/: break;
  24637. case 'blackandwhite' /*case 'BlackAndWhite'*/: break;
  24638. case 'donotdisplayzeros' /*case 'DoNotDisplayZeros'*/: break;
  24639. case 'displaypagebreak' /*case 'DisplayPageBreak'*/: break;
  24640. case 'rowcolheadings' /*case 'RowColHeadings'*/: break;
  24641. case 'donotdisplayoutline' /*case 'DoNotDisplayOutline'*/: break;
  24642. case 'noorientation' /*case 'NoOrientation'*/: break;
  24643. case 'allowusepivottables' /*case 'AllowUsePivotTables'*/: break;
  24644. case 'zeroheight' /*case 'ZeroHeight'*/: break;
  24645. case 'viewablerange' /*case 'ViewableRange'*/: break;
  24646. case 'selection' /*case 'Selection'*/: break;
  24647. case 'protectcontents' /*case 'ProtectContents'*/: break;
  24648. default: seen = false;
  24649. } break;
  24650. /* PivotTable */
  24651. case 'pivottable' /*case 'PivotTable'*/: case 'pivotcache' /*case 'PivotCache'*/: switch(Rn[3]) {
  24652. case 'immediateitemsondrop' /*case 'ImmediateItemsOnDrop'*/: break;
  24653. case 'showpagemultipleitemlabel' /*case 'ShowPageMultipleItemLabel'*/: break;
  24654. case 'compactrowindent' /*case 'CompactRowIndent'*/: break;
  24655. case 'location' /*case 'Location'*/: break;
  24656. case 'pivotfield' /*case 'PivotField'*/: break;
  24657. case 'orientation' /*case 'Orientation'*/: break;
  24658. case 'layoutform' /*case 'LayoutForm'*/: break;
  24659. case 'layoutsubtotallocation' /*case 'LayoutSubtotalLocation'*/: break;
  24660. case 'layoutcompactrow' /*case 'LayoutCompactRow'*/: break;
  24661. case 'position' /*case 'Position'*/: break;
  24662. case 'pivotitem' /*case 'PivotItem'*/: break;
  24663. case 'datatype' /*case 'DataType'*/: break;
  24664. case 'datafield' /*case 'DataField'*/: break;
  24665. case 'sourcename' /*case 'SourceName'*/: break;
  24666. case 'parentfield' /*case 'ParentField'*/: break;
  24667. case 'ptlineitems' /*case 'PTLineItems'*/: break;
  24668. case 'ptlineitem' /*case 'PTLineItem'*/: break;
  24669. case 'countofsameitems' /*case 'CountOfSameItems'*/: break;
  24670. case 'item' /*case 'Item'*/: break;
  24671. case 'itemtype' /*case 'ItemType'*/: break;
  24672. case 'ptsource' /*case 'PTSource'*/: break;
  24673. case 'cacheindex' /*case 'CacheIndex'*/: break;
  24674. case 'consolidationreference' /*case 'ConsolidationReference'*/: break;
  24675. case 'filename' /*case 'FileName'*/: break;
  24676. case 'reference' /*case 'Reference'*/: break;
  24677. case 'nocolumngrand' /*case 'NoColumnGrand'*/: break;
  24678. case 'norowgrand' /*case 'NoRowGrand'*/: break;
  24679. case 'blanklineafteritems' /*case 'BlankLineAfterItems'*/: break;
  24680. case 'hidden' /*case 'Hidden'*/: break;
  24681. case 'subtotal' /*case 'Subtotal'*/: break;
  24682. case 'basefield' /*case 'BaseField'*/: break;
  24683. case 'mapchilditems' /*case 'MapChildItems'*/: break;
  24684. case 'function' /*case 'Function'*/: break;
  24685. case 'refreshonfileopen' /*case 'RefreshOnFileOpen'*/: break;
  24686. case 'printsettitles' /*case 'PrintSetTitles'*/: break;
  24687. case 'mergelabels' /*case 'MergeLabels'*/: break;
  24688. case 'defaultversion' /*case 'DefaultVersion'*/: break;
  24689. case 'refreshname' /*case 'RefreshName'*/: break;
  24690. case 'refreshdate' /*case 'RefreshDate'*/: break;
  24691. case 'refreshdatecopy' /*case 'RefreshDateCopy'*/: break;
  24692. case 'versionlastrefresh' /*case 'VersionLastRefresh'*/: break;
  24693. case 'versionlastupdate' /*case 'VersionLastUpdate'*/: break;
  24694. case 'versionupdateablemin' /*case 'VersionUpdateableMin'*/: break;
  24695. case 'versionrefreshablemin' /*case 'VersionRefreshableMin'*/: break;
  24696. case 'calculation' /*case 'Calculation'*/: break;
  24697. default: seen = false;
  24698. } break;
  24699. /* PageBreaks */
  24700. case 'pagebreaks' /*case 'PageBreaks'*/: switch(Rn[3]) {
  24701. case 'colbreaks' /*case 'ColBreaks'*/: break;
  24702. case 'colbreak' /*case 'ColBreak'*/: break;
  24703. case 'rowbreaks' /*case 'RowBreaks'*/: break;
  24704. case 'rowbreak' /*case 'RowBreak'*/: break;
  24705. case 'colstart' /*case 'ColStart'*/: break;
  24706. case 'colend' /*case 'ColEnd'*/: break;
  24707. case 'rowend' /*case 'RowEnd'*/: break;
  24708. default: seen = false;
  24709. } break;
  24710. /* AutoFilter */
  24711. case 'autofilter' /*case 'AutoFilter'*/: switch(Rn[3]) {
  24712. case 'autofiltercolumn' /*case 'AutoFilterColumn'*/: break;
  24713. case 'autofiltercondition' /*case 'AutoFilterCondition'*/: break;
  24714. case 'autofilterand' /*case 'AutoFilterAnd'*/: break;
  24715. case 'autofilteror' /*case 'AutoFilterOr'*/: break;
  24716. default: seen = false;
  24717. } break;
  24718. /* QueryTable */
  24719. case 'querytable' /*case 'QueryTable'*/: switch(Rn[3]) {
  24720. case 'id' /*case 'Id'*/: break;
  24721. case 'autoformatfont' /*case 'AutoFormatFont'*/: break;
  24722. case 'autoformatpattern' /*case 'AutoFormatPattern'*/: break;
  24723. case 'querysource' /*case 'QuerySource'*/: break;
  24724. case 'querytype' /*case 'QueryType'*/: break;
  24725. case 'enableredirections' /*case 'EnableRedirections'*/: break;
  24726. case 'refreshedinxl9' /*case 'RefreshedInXl9'*/: break;
  24727. case 'urlstring' /*case 'URLString'*/: break;
  24728. case 'htmltables' /*case 'HTMLTables'*/: break;
  24729. case 'connection' /*case 'Connection'*/: break;
  24730. case 'commandtext' /*case 'CommandText'*/: break;
  24731. case 'refreshinfo' /*case 'RefreshInfo'*/: break;
  24732. case 'notitles' /*case 'NoTitles'*/: break;
  24733. case 'nextid' /*case 'NextId'*/: break;
  24734. case 'columninfo' /*case 'ColumnInfo'*/: break;
  24735. case 'overwritecells' /*case 'OverwriteCells'*/: break;
  24736. case 'donotpromptforfile' /*case 'DoNotPromptForFile'*/: break;
  24737. case 'textwizardsettings' /*case 'TextWizardSettings'*/: break;
  24738. case 'source' /*case 'Source'*/: break;
  24739. case 'number' /*case 'Number'*/: break;
  24740. case 'decimal' /*case 'Decimal'*/: break;
  24741. case 'thousandseparator' /*case 'ThousandSeparator'*/: break;
  24742. case 'trailingminusnumbers' /*case 'TrailingMinusNumbers'*/: break;
  24743. case 'formatsettings' /*case 'FormatSettings'*/: break;
  24744. case 'fieldtype' /*case 'FieldType'*/: break;
  24745. case 'delimiters' /*case 'Delimiters'*/: break;
  24746. case 'tab' /*case 'Tab'*/: break;
  24747. case 'comma' /*case 'Comma'*/: break;
  24748. case 'autoformatname' /*case 'AutoFormatName'*/: break;
  24749. case 'versionlastedit' /*case 'VersionLastEdit'*/: break;
  24750. case 'versionlastrefresh' /*case 'VersionLastRefresh'*/: break;
  24751. default: seen = false;
  24752. } break;
  24753. case 'datavalidation' /*case 'DataValidation'*/:
  24754. switch(Rn[3]) {
  24755. case 'range' /*case 'Range'*/: break;
  24756. case 'type' /*case 'Type'*/: break;
  24757. case 'min' /*case 'Min'*/: break;
  24758. case 'max' /*case 'Max'*/: break;
  24759. case 'sort' /*case 'Sort'*/: break;
  24760. case 'descending' /*case 'Descending'*/: break;
  24761. case 'order' /*case 'Order'*/: break;
  24762. case 'casesensitive' /*case 'CaseSensitive'*/: break;
  24763. case 'value' /*case 'Value'*/: break;
  24764. case 'errorstyle' /*case 'ErrorStyle'*/: break;
  24765. case 'errormessage' /*case 'ErrorMessage'*/: break;
  24766. case 'errortitle' /*case 'ErrorTitle'*/: break;
  24767. case 'inputmessage' /*case 'InputMessage'*/: break;
  24768. case 'inputtitle' /*case 'InputTitle'*/: break;
  24769. case 'combohide' /*case 'ComboHide'*/: break;
  24770. case 'inputhide' /*case 'InputHide'*/: break;
  24771. case 'condition' /*case 'Condition'*/: break;
  24772. case 'qualifier' /*case 'Qualifier'*/: break;
  24773. case 'useblank' /*case 'UseBlank'*/: break;
  24774. case 'value1' /*case 'Value1'*/: break;
  24775. case 'value2' /*case 'Value2'*/: break;
  24776. case 'format' /*case 'Format'*/: break;
  24777. case 'cellrangelist' /*case 'CellRangeList'*/: break;
  24778. default: seen = false;
  24779. } break;
  24780. case 'sorting' /*case 'Sorting'*/:
  24781. case 'conditionalformatting' /*case 'ConditionalFormatting'*/:
  24782. switch(Rn[3]) {
  24783. case 'range' /*case 'Range'*/: break;
  24784. case 'type' /*case 'Type'*/: break;
  24785. case 'min' /*case 'Min'*/: break;
  24786. case 'max' /*case 'Max'*/: break;
  24787. case 'sort' /*case 'Sort'*/: break;
  24788. case 'descending' /*case 'Descending'*/: break;
  24789. case 'order' /*case 'Order'*/: break;
  24790. case 'casesensitive' /*case 'CaseSensitive'*/: break;
  24791. case 'value' /*case 'Value'*/: break;
  24792. case 'errorstyle' /*case 'ErrorStyle'*/: break;
  24793. case 'errormessage' /*case 'ErrorMessage'*/: break;
  24794. case 'errortitle' /*case 'ErrorTitle'*/: break;
  24795. case 'cellrangelist' /*case 'CellRangeList'*/: break;
  24796. case 'inputmessage' /*case 'InputMessage'*/: break;
  24797. case 'inputtitle' /*case 'InputTitle'*/: break;
  24798. case 'combohide' /*case 'ComboHide'*/: break;
  24799. case 'inputhide' /*case 'InputHide'*/: break;
  24800. case 'condition' /*case 'Condition'*/: break;
  24801. case 'qualifier' /*case 'Qualifier'*/: break;
  24802. case 'useblank' /*case 'UseBlank'*/: break;
  24803. case 'value1' /*case 'Value1'*/: break;
  24804. case 'value2' /*case 'Value2'*/: break;
  24805. case 'format' /*case 'Format'*/: break;
  24806. default: seen = false;
  24807. } break;
  24808. /* MapInfo (schema) */
  24809. case 'mapinfo' /*case 'MapInfo'*/: case 'schema' /*case 'Schema'*/: case 'data' /*case 'data'*/: switch(Rn[3]) {
  24810. case 'map' /*case 'Map'*/: break;
  24811. case 'entry' /*case 'Entry'*/: break;
  24812. case 'range' /*case 'Range'*/: break;
  24813. case 'xpath' /*case 'XPath'*/: break;
  24814. case 'field' /*case 'Field'*/: break;
  24815. case 'xsdtype' /*case 'XSDType'*/: break;
  24816. case 'filteron' /*case 'FilterOn'*/: break;
  24817. case 'aggregate' /*case 'Aggregate'*/: break;
  24818. case 'elementtype' /*case 'ElementType'*/: break;
  24819. case 'attributetype' /*case 'AttributeType'*/: break;
  24820. /* These are from xsd (XML Schema Definition) */
  24821. case 'schema' /*case 'schema'*/:
  24822. case 'element' /*case 'element'*/:
  24823. case 'complextype' /*case 'complexType'*/:
  24824. case 'datatype' /*case 'datatype'*/:
  24825. case 'all' /*case 'all'*/:
  24826. case 'attribute' /*case 'attribute'*/:
  24827. case 'extends' /*case 'extends'*/: break;
  24828. case 'row' /*case 'row'*/: break;
  24829. default: seen = false;
  24830. } break;
  24831. /* SmartTags (can be anything) */
  24832. case 'smarttags' /*case 'SmartTags'*/: break;
  24833. default: seen = false; break;
  24834. }
  24835. if(seen) break;
  24836. /* CustomDocumentProperties */
  24837. if(Rn[3].match(/!\[CDATA/)) break;
  24838. if(!state[state.length-1][1]) throw 'Unrecognized tag: ' + Rn[3] + "|" + state.join("|");
  24839. if(state[state.length-1][0]===/*'CustomDocumentProperties'*/'customdocumentproperties') {
  24840. if(Rn[0].slice(-2) === "/>") break;
  24841. else if(Rn[1]==="/") xlml_set_custprop(Custprops, raw_Rn3, cp, str.slice(pidx, Rn.index));
  24842. else { cp = Rn; pidx = Rn.index + Rn[0].length; }
  24843. break;
  24844. }
  24845. if(opts.WTF) throw 'Unrecognized tag: ' + Rn[3] + "|" + state.join("|");
  24846. }
  24847. var out = ({});
  24848. if(!opts.bookSheets && !opts.bookProps) out.Sheets = sheets;
  24849. out.SheetNames = sheetnames;
  24850. out.Workbook = Workbook;
  24851. out.SSF = SSF.get_table();
  24852. out.Props = Props;
  24853. out.Custprops = Custprops;
  24854. return out;
  24855. }
  24856. function parse_xlml(data, opts) {
  24857. fix_read_opts(opts=opts||{});
  24858. switch(opts.type||"base64") {
  24859. case "base64": return parse_xlml_xml(Base64.decode(data), opts);
  24860. case "binary": case "buffer": case "file": return parse_xlml_xml(data, opts);
  24861. case "array": return parse_xlml_xml(a2s(data), opts);
  24862. }
  24863. }
  24864. /* TODO */
  24865. function write_props_xlml(wb, opts) {
  24866. var o = [];
  24867. /* DocumentProperties */
  24868. if(wb.Props) o.push(xlml_write_docprops(wb.Props, opts));
  24869. /* CustomDocumentProperties */
  24870. if(wb.Custprops) o.push(xlml_write_custprops(wb.Props, wb.Custprops, opts));
  24871. return o.join("");
  24872. }
  24873. /* TODO */
  24874. function write_wb_xlml() {
  24875. /* OfficeDocumentSettings */
  24876. /* ExcelWorkbook */
  24877. return "";
  24878. }
  24879. /* TODO */
  24880. function write_sty_xlml(wb, opts) {
  24881. /* Styles */
  24882. var styles = ['<Style ss:ID="Default" ss:Name="Normal"><NumberFormat/></Style>'];
  24883. opts.cellXfs.forEach(function(xf, id) {
  24884. var payload = [];
  24885. payload.push(writextag('NumberFormat', null, {"ss:Format": escapexml(SSF._table[xf.numFmtId])}));
  24886. var o = {"ss:ID": "s" + (21+id)};
  24887. styles.push(writextag('Style', payload.join(""), o));
  24888. });
  24889. return writextag("Styles", styles.join(""));
  24890. }
  24891. function write_name_xlml(n) { return writextag("NamedRange", null, {"ss:Name": n.Name, "ss:RefersTo":"=" + a1_to_rc(n.Ref, {r:0,c:0})}); }
  24892. function write_names_xlml(wb) {
  24893. if(!((wb||{}).Workbook||{}).Names) return "";
  24894. var names = wb.Workbook.Names;
  24895. var out = [];
  24896. for(var i = 0; i < names.length; ++i) {
  24897. var n = names[i];
  24898. if(n.Sheet != null) continue;
  24899. if(n.Name.match(/^_xlfn\./)) continue;
  24900. out.push(write_name_xlml(n));
  24901. }
  24902. return writextag("Names", out.join(""));
  24903. }
  24904. function write_ws_xlml_names(ws, opts, idx, wb) {
  24905. if(!ws) return "";
  24906. if(!((wb||{}).Workbook||{}).Names) return "";
  24907. var names = wb.Workbook.Names;
  24908. var out = [];
  24909. for(var i = 0; i < names.length; ++i) {
  24910. var n = names[i];
  24911. if(n.Sheet != idx) continue;
  24912. /*switch(n.Name) {
  24913. case "_": continue;
  24914. }*/
  24915. if(n.Name.match(/^_xlfn\./)) continue;
  24916. out.push(write_name_xlml(n));
  24917. }
  24918. return out.join("");
  24919. }
  24920. /* WorksheetOptions */
  24921. function write_ws_xlml_wsopts(ws, opts, idx, wb) {
  24922. if(!ws) return "";
  24923. var o = [];
  24924. /* NOTE: spec technically allows any order, but stick with implied order */
  24925. /* FitToPage */
  24926. /* DoNotDisplayColHeaders */
  24927. /* DoNotDisplayRowHeaders */
  24928. /* ViewableRange */
  24929. /* Selection */
  24930. /* GridlineColor */
  24931. /* Name */
  24932. /* ExcelWorksheetType */
  24933. /* IntlMacro */
  24934. /* Unsynced */
  24935. /* Selected */
  24936. /* CodeName */
  24937. if(ws['!margins']) {
  24938. o.push("<PageSetup>");
  24939. if(ws['!margins'].header) o.push(writextag("Header", null, {'x:Margin':ws['!margins'].header}));
  24940. if(ws['!margins'].footer) o.push(writextag("Footer", null, {'x:Margin':ws['!margins'].footer}));
  24941. o.push(writextag("PageMargins", null, {
  24942. 'x:Bottom': ws['!margins'].bottom || "0.75",
  24943. 'x:Left': ws['!margins'].left || "0.7",
  24944. 'x:Right': ws['!margins'].right || "0.7",
  24945. 'x:Top': ws['!margins'].top || "0.75"
  24946. }));
  24947. o.push("</PageSetup>");
  24948. }
  24949. /* PageSetup */
  24950. /* DisplayPageBreak */
  24951. /* TransitionExpressionEvaluation */
  24952. /* TransitionFormulaEntry */
  24953. /* Print */
  24954. /* Zoom */
  24955. /* PageLayoutZoom */
  24956. /* PageBreakZoom */
  24957. /* ShowPageBreakZoom */
  24958. /* DefaultRowHeight */
  24959. /* DefaultColumnWidth */
  24960. /* StandardWidth */
  24961. if(wb && wb.Workbook && wb.Workbook.Sheets && wb.Workbook.Sheets[idx]) {
  24962. /* Visible */
  24963. if(wb.Workbook.Sheets[idx].Hidden) o.push(writextag("Visible", (wb.Workbook.Sheets[idx].Hidden == 1 ? "SheetHidden" : "SheetVeryHidden"), {}));
  24964. else {
  24965. /* Selected */
  24966. for(var i = 0; i < idx; ++i) if(wb.Workbook.Sheets[i] && !wb.Workbook.Sheets[i].Hidden) break;
  24967. if(i == idx) o.push("<Selected/>");
  24968. }
  24969. }
  24970. /* LeftColumnVisible */
  24971. if(((((wb||{}).Workbook||{}).Views||[])[0]||{}).RTL) o.push("<DisplayRightToLeft/>");
  24972. /* GridlineColorIndex */
  24973. /* DisplayFormulas */
  24974. /* DoNotDisplayGridlines */
  24975. /* DoNotDisplayHeadings */
  24976. /* DoNotDisplayOutline */
  24977. /* ApplyAutomaticOutlineStyles */
  24978. /* NoSummaryRowsBelowDetail */
  24979. /* NoSummaryColumnsRightDetail */
  24980. /* DoNotDisplayZeros */
  24981. /* ActiveRow */
  24982. /* ActiveColumn */
  24983. /* FilterOn */
  24984. /* RangeSelection */
  24985. /* TopRowVisible */
  24986. /* TopRowBottomPane */
  24987. /* LeftColumnRightPane */
  24988. /* ActivePane */
  24989. /* SplitHorizontal */
  24990. /* SplitVertical */
  24991. /* FreezePanes */
  24992. /* FrozenNoSplit */
  24993. /* TabColorIndex */
  24994. /* Panes */
  24995. /* NOTE: Password not supported in XLML Format */
  24996. if(ws['!protect']) {
  24997. o.push(writetag("ProtectContents", "True"));
  24998. if(ws['!protect'].objects) o.push(writetag("ProtectObjects", "True"));
  24999. if(ws['!protect'].scenarios) o.push(writetag("ProtectScenarios", "True"));
  25000. if(ws['!protect'].selectLockedCells != null && !ws['!protect'].selectLockedCells) o.push(writetag("EnableSelection", "NoSelection"));
  25001. else if(ws['!protect'].selectUnlockedCells != null && !ws['!protect'].selectUnlockedCells) o.push(writetag("EnableSelection", "UnlockedCells"));
  25002. [
  25003. [ "formatCells", "AllowFormatCells" ],
  25004. [ "formatColumns", "AllowSizeCols" ],
  25005. [ "formatRows", "AllowSizeRows" ],
  25006. [ "insertColumns", "AllowInsertCols" ],
  25007. [ "insertRows", "AllowInsertRows" ],
  25008. [ "insertHyperlinks", "AllowInsertHyperlinks" ],
  25009. [ "deleteColumns", "AllowDeleteCols" ],
  25010. [ "deleteRows", "AllowDeleteRows" ],
  25011. [ "sort", "AllowSort" ],
  25012. [ "autoFilter", "AllowFilter" ],
  25013. [ "pivotTables", "AllowUsePivotTables" ]
  25014. ].forEach(function(x) { if(ws['!protect'][x[0]]) o.push("<"+x[1]+"/>"); });
  25015. }
  25016. if(o.length == 0) return "";
  25017. return writextag("WorksheetOptions", o.join(""), {xmlns:XLMLNS.x});
  25018. }
  25019. function write_ws_xlml_comment(comments) {
  25020. return comments.map(function(c) {
  25021. // TODO: formatted text
  25022. var t = xlml_unfixstr(c.t||"");
  25023. var d =writextag("ss:Data", t, {"xmlns":"http://www.w3.org/TR/REC-html40"});
  25024. return writextag("Comment", d, {"ss:Author":c.a});
  25025. }).join("");
  25026. }
  25027. function write_ws_xlml_cell(cell, ref, ws, opts, idx, wb, addr){
  25028. if(!cell || (cell.v == undefined && cell.f == undefined)) return "";
  25029. var attr = {};
  25030. if(cell.f) attr["ss:Formula"] = "=" + escapexml(a1_to_rc(cell.f, addr));
  25031. if(cell.F && cell.F.slice(0, ref.length) == ref) {
  25032. var end = decode_cell(cell.F.slice(ref.length + 1));
  25033. attr["ss:ArrayRange"] = "RC:R" + (end.r == addr.r ? "" : "[" + (end.r - addr.r) + "]") + "C" + (end.c == addr.c ? "" : "[" + (end.c - addr.c) + "]");
  25034. }
  25035. if(cell.l && cell.l.Target) {
  25036. attr["ss:HRef"] = escapexml(cell.l.Target);
  25037. if(cell.l.Tooltip) attr["x:HRefScreenTip"] = escapexml(cell.l.Tooltip);
  25038. }
  25039. if(ws['!merges']) {
  25040. var marr = ws['!merges'];
  25041. for(var mi = 0; mi != marr.length; ++mi) {
  25042. if(marr[mi].s.c != addr.c || marr[mi].s.r != addr.r) continue;
  25043. if(marr[mi].e.c > marr[mi].s.c) attr['ss:MergeAcross'] = marr[mi].e.c - marr[mi].s.c;
  25044. if(marr[mi].e.r > marr[mi].s.r) attr['ss:MergeDown'] = marr[mi].e.r - marr[mi].s.r;
  25045. }
  25046. }
  25047. var t = "", p = "";
  25048. switch(cell.t) {
  25049. case 'z': if(!opts.sheetStubs) return ""; break;
  25050. case 'n': t = 'Number'; p = String(cell.v); break;
  25051. case 'b': t = 'Boolean'; p = (cell.v ? "1" : "0"); break;
  25052. case 'e': t = 'Error'; p = BErr[cell.v]; break;
  25053. case 'd': t = 'DateTime'; p = new Date(cell.v).toISOString(); if(cell.z == null) cell.z = cell.z || SSF._table[14]; break;
  25054. case 's': t = 'String'; p = escapexlml(cell.v||""); break;
  25055. }
  25056. /* TODO: cell style */
  25057. var os = get_cell_style(opts.cellXfs, cell, opts);
  25058. attr["ss:StyleID"] = "s" + (21+os);
  25059. attr["ss:Index"] = addr.c + 1;
  25060. var _v = (cell.v != null ? p : "");
  25061. var m = cell.t == 'z' ? "" : ('<Data ss:Type="' + t + '">' + _v + '</Data>');
  25062. if((cell.c||[]).length > 0) m += write_ws_xlml_comment(cell.c);
  25063. return writextag("Cell", m, attr);
  25064. }
  25065. function write_ws_xlml_row(R, row) {
  25066. var o = '<Row ss:Index="' + (R+1) + '"';
  25067. if(row) {
  25068. if(row.hpt && !row.hpx) row.hpx = pt2px(row.hpt);
  25069. if(row.hpx) o += ' ss:AutoFitHeight="0" ss:Height="' + row.hpx + '"';
  25070. if(row.hidden) o += ' ss:Hidden="1"';
  25071. }
  25072. return o + '>';
  25073. }
  25074. /* TODO */
  25075. function write_ws_xlml_table(ws, opts, idx, wb) {
  25076. if(!ws['!ref']) return "";
  25077. var range = safe_decode_range(ws['!ref']);
  25078. var marr = ws['!merges'] || [], mi = 0;
  25079. var o = [];
  25080. if(ws['!cols']) ws['!cols'].forEach(function(n, i) {
  25081. process_col(n);
  25082. var w = !!n.width;
  25083. var p = col_obj_w(i, n);
  25084. var k = {"ss:Index":i+1};
  25085. if(w) k['ss:Width'] = width2px(p.width);
  25086. if(n.hidden) k['ss:Hidden']="1";
  25087. o.push(writextag("Column",null,k));
  25088. });
  25089. var dense = Array.isArray(ws);
  25090. for(var R = range.s.r; R <= range.e.r; ++R) {
  25091. var row = [write_ws_xlml_row(R, (ws['!rows']||[])[R])];
  25092. for(var C = range.s.c; C <= range.e.c; ++C) {
  25093. var skip = false;
  25094. for(mi = 0; mi != marr.length; ++mi) {
  25095. if(marr[mi].s.c > C) continue;
  25096. if(marr[mi].s.r > R) continue;
  25097. if(marr[mi].e.c < C) continue;
  25098. if(marr[mi].e.r < R) continue;
  25099. if(marr[mi].s.c != C || marr[mi].s.r != R) skip = true;
  25100. break;
  25101. }
  25102. if(skip) continue;
  25103. var addr = {r:R,c:C};
  25104. var ref = encode_cell(addr), cell = dense ? (ws[R]||[])[C] : ws[ref];
  25105. row.push(write_ws_xlml_cell(cell, ref, ws, opts, idx, wb, addr));
  25106. }
  25107. row.push("</Row>");
  25108. if(row.length > 2) o.push(row.join(""));
  25109. }
  25110. return o.join("");
  25111. }
  25112. function write_ws_xlml(idx, opts, wb) {
  25113. var o = [];
  25114. var s = wb.SheetNames[idx];
  25115. var ws = wb.Sheets[s];
  25116. var t = ws ? write_ws_xlml_names(ws, opts, idx, wb) : "";
  25117. if(t.length > 0) o.push("<Names>" + t + "</Names>");
  25118. /* Table */
  25119. t = ws ? write_ws_xlml_table(ws, opts, idx, wb) : "";
  25120. if(t.length > 0) o.push("<Table>" + t + "</Table>");
  25121. /* WorksheetOptions */
  25122. o.push(write_ws_xlml_wsopts(ws, opts, idx, wb));
  25123. return o.join("");
  25124. }
  25125. function write_xlml(wb, opts) {
  25126. if(!opts) opts = {};
  25127. if(!wb.SSF) wb.SSF = SSF.get_table();
  25128. if(wb.SSF) {
  25129. make_ssf(SSF); SSF.load_table(wb.SSF);
  25130. // $FlowIgnore
  25131. opts.revssf = evert_num(wb.SSF); opts.revssf[wb.SSF[65535]] = 0;
  25132. opts.ssf = wb.SSF;
  25133. opts.cellXfs = [];
  25134. get_cell_style(opts.cellXfs, {}, {revssf:{"General":0}});
  25135. }
  25136. var d = [];
  25137. d.push(write_props_xlml(wb, opts));
  25138. d.push(write_wb_xlml(wb, opts));
  25139. d.push("");
  25140. d.push("");
  25141. for(var i = 0; i < wb.SheetNames.length; ++i)
  25142. d.push(writextag("Worksheet", write_ws_xlml(i, opts, wb), {"ss:Name":escapexml(wb.SheetNames[i])}));
  25143. d[2] = write_sty_xlml(wb, opts);
  25144. d[3] = write_names_xlml(wb, opts);
  25145. return XML_HEADER + writextag("Workbook", d.join(""), {
  25146. 'xmlns': XLMLNS.ss,
  25147. 'xmlns:o': XLMLNS.o,
  25148. 'xmlns:x': XLMLNS.x,
  25149. 'xmlns:ss': XLMLNS.ss,
  25150. 'xmlns:dt': XLMLNS.dt,
  25151. 'xmlns:html': XLMLNS.html
  25152. });
  25153. }
  25154. /* [MS-OLEDS] 2.3.8 CompObjStream */
  25155. function parse_compobj(obj) {
  25156. var v = {};
  25157. var o = obj.content;
  25158. /* [MS-OLEDS] 2.3.7 CompObjHeader -- All fields MUST be ignored */
  25159. o.l = 28;
  25160. v.AnsiUserType = o.read_shift(0, "lpstr-ansi");
  25161. v.AnsiClipboardFormat = parse_ClipboardFormatOrAnsiString(o);
  25162. if(o.length - o.l <= 4) return v;
  25163. var m = o.read_shift(4);
  25164. if(m == 0 || m > 40) return v;
  25165. o.l-=4; v.Reserved1 = o.read_shift(0, "lpstr-ansi");
  25166. if(o.length - o.l <= 4) return v;
  25167. m = o.read_shift(4);
  25168. if(m !== 0x71b239f4) return v;
  25169. v.UnicodeClipboardFormat = parse_ClipboardFormatOrUnicodeString(o);
  25170. m = o.read_shift(4);
  25171. if(m == 0 || m > 40) return v;
  25172. o.l-=4; v.Reserved2 = o.read_shift(0, "lpwstr");
  25173. }
  25174. /*
  25175. Continue logic for:
  25176. - 2.4.58 Continue
  25177. - 2.4.59 ContinueBigName
  25178. - 2.4.60 ContinueFrt
  25179. - 2.4.61 ContinueFrt11
  25180. - 2.4.62 ContinueFrt12
  25181. */
  25182. function slurp(R, blob, length, opts) {
  25183. var l = length;
  25184. var bufs = [];
  25185. var d = blob.slice(blob.l,blob.l+l);
  25186. if(opts && opts.enc && opts.enc.insitu && d.length > 0) switch(R.n) {
  25187. case 'BOF': case 'FilePass': case 'FileLock': case 'InterfaceHdr': case 'RRDInfo': case 'RRDHead': case 'UsrExcl': case 'EOF':
  25188. break;
  25189. case 'BoundSheet8':
  25190. break;
  25191. default:
  25192. opts.enc.insitu(d);
  25193. }
  25194. bufs.push(d);
  25195. blob.l += l;
  25196. var next = (XLSRecordEnum[__readUInt16LE(blob,blob.l)]);
  25197. var start = 0;
  25198. while(next != null && next.n.slice(0,8) === 'Continue') {
  25199. l = __readUInt16LE(blob,blob.l+2);
  25200. start = blob.l + 4;
  25201. if(next.n == 'ContinueFrt') start += 4;
  25202. else if(next.n.slice(0,11) == 'ContinueFrt') {
  25203. start += 12;
  25204. }
  25205. d = blob.slice(start,blob.l+4+l);
  25206. bufs.push(d);
  25207. blob.l += 4+l;
  25208. next = (XLSRecordEnum[__readUInt16LE(blob, blob.l)]);
  25209. }
  25210. var b = (bconcat(bufs));
  25211. prep_blob(b, 0);
  25212. var ll = 0; b.lens = [];
  25213. for(var j = 0; j < bufs.length; ++j) { b.lens.push(ll); ll += bufs[j].length; }
  25214. if(b.length < length) throw "XLS Record " + (R && R.n || "??") + " Truncated: " + b.length + " < " + length;
  25215. return R.f(b, b.length, opts);
  25216. }
  25217. function safe_format_xf(p, opts, date1904) {
  25218. if(p.t === 'z') return;
  25219. if(!p.XF) return;
  25220. var fmtid = 0;
  25221. try {
  25222. fmtid = p.z || p.XF.numFmtId || 0;
  25223. if(opts.cellNF) p.z = SSF._table[fmtid];
  25224. } catch(e) { if(opts.WTF) throw e; }
  25225. if(!opts || opts.cellText !== false) try {
  25226. if(p.t === 'e') { p.w = p.w || BErr[p.v]; }
  25227. else if(fmtid === 0 || fmtid == "General") {
  25228. if(p.t === 'n') {
  25229. if((p.v|0) === p.v) p.w = SSF._general_int(p.v);
  25230. else p.w = SSF._general_num(p.v);
  25231. }
  25232. else p.w = SSF._general(p.v);
  25233. }
  25234. else p.w = SSF.format(fmtid,p.v, {date1904:!!date1904});
  25235. } catch(e) { if(opts.WTF) throw e; }
  25236. if(opts.cellDates && fmtid && p.t == 'n' && SSF.is_date(SSF._table[fmtid] || String(fmtid))) {
  25237. var _d = SSF.parse_date_code(p.v); if(_d) { p.t = 'd'; p.v = new Date(_d.y, _d.m-1,_d.d,_d.H,_d.M,_d.S,_d.u); }
  25238. }
  25239. }
  25240. function make_cell(val, ixfe, t) {
  25241. return ({v:val, ixfe:ixfe, t:t});
  25242. }
  25243. // 2.3.2
  25244. function parse_workbook(blob, options) {
  25245. var wb = ({opts:{}});
  25246. var Sheets = {};
  25247. if(DENSE != null && options.dense == null) options.dense = DENSE;
  25248. var out = ((options.dense ? [] : {}));
  25249. var Directory = {};
  25250. var range = ({});
  25251. var last_formula = null;
  25252. var sst = ([]);
  25253. var cur_sheet = "";
  25254. var Preamble = {};
  25255. var lastcell, last_cell = "", cc, cmnt, rngC, rngR;
  25256. var sharedf = {};
  25257. var arrayf = [];
  25258. var temp_val;
  25259. var country;
  25260. var cell_valid = true;
  25261. var XFs = []; /* XF records */
  25262. var palette = [];
  25263. var Workbook = ({ Sheets:[], WBProps:{date1904:false}, Views:[{}] }), wsprops = {};
  25264. var get_rgb = function getrgb(icv) {
  25265. if(icv < 8) return XLSIcv[icv];
  25266. if(icv < 64) return palette[icv-8] || XLSIcv[icv];
  25267. return XLSIcv[icv];
  25268. };
  25269. var process_cell_style = function pcs(cell, line, options) {
  25270. var xfd = line.XF.data;
  25271. if(!xfd || !xfd.patternType || !options || !options.cellStyles) return;
  25272. line.s = ({});
  25273. line.s.patternType = xfd.patternType;
  25274. var t;
  25275. if((t = rgb2Hex(get_rgb(xfd.icvFore)))) { line.s.fgColor = {rgb:t}; }
  25276. if((t = rgb2Hex(get_rgb(xfd.icvBack)))) { line.s.bgColor = {rgb:t}; }
  25277. };
  25278. var addcell = function addcell(cell, line, options) {
  25279. if(file_depth > 1) return;
  25280. if(options.sheetRows && cell.r >= options.sheetRows) cell_valid = false;
  25281. if(!cell_valid) return;
  25282. if(options.cellStyles && line.XF && line.XF.data) process_cell_style(cell, line, options);
  25283. delete line.ixfe; delete line.XF;
  25284. lastcell = cell;
  25285. last_cell = encode_cell(cell);
  25286. if(!range || !range.s || !range.e) range = {s:{r:0,c:0},e:{r:0,c:0}};
  25287. if(cell.r < range.s.r) range.s.r = cell.r;
  25288. if(cell.c < range.s.c) range.s.c = cell.c;
  25289. if(cell.r + 1 > range.e.r) range.e.r = cell.r + 1;
  25290. if(cell.c + 1 > range.e.c) range.e.c = cell.c + 1;
  25291. if(options.cellFormula && line.f) {
  25292. for(var afi = 0; afi < arrayf.length; ++afi) {
  25293. if(arrayf[afi][0].s.c > cell.c || arrayf[afi][0].s.r > cell.r) continue;
  25294. if(arrayf[afi][0].e.c < cell.c || arrayf[afi][0].e.r < cell.r) continue;
  25295. line.F = encode_range(arrayf[afi][0]);
  25296. if(arrayf[afi][0].s.c != cell.c || arrayf[afi][0].s.r != cell.r) delete line.f;
  25297. if(line.f) line.f = "" + stringify_formula(arrayf[afi][1], range, cell, supbooks, opts);
  25298. break;
  25299. }
  25300. }
  25301. {
  25302. if(options.dense) {
  25303. if(!out[cell.r]) out[cell.r] = [];
  25304. out[cell.r][cell.c] = line;
  25305. } else out[last_cell] = line;
  25306. }
  25307. };
  25308. var opts = ({
  25309. enc: false, // encrypted
  25310. sbcch: 0, // cch in the preceding SupBook
  25311. snames: [], // sheetnames
  25312. sharedf: sharedf, // shared formulae by address
  25313. arrayf: arrayf, // array formulae array
  25314. rrtabid: [], // RRTabId
  25315. lastuser: "", // Last User from WriteAccess
  25316. biff: 8, // BIFF version
  25317. codepage: 0, // CP from CodePage record
  25318. winlocked: 0, // fLockWn from WinProtect
  25319. cellStyles: !!options && !!options.cellStyles,
  25320. WTF: !!options && !!options.wtf
  25321. });
  25322. if(options.password) opts.password = options.password;
  25323. var themes;
  25324. var merges = [];
  25325. var objects = [];
  25326. var colinfo = [], rowinfo = [];
  25327. // eslint-disable-next-line no-unused-vars
  25328. var defwidth = 0, defheight = 0; // twips / MDW respectively
  25329. var seencol = false;
  25330. var supbooks = ([]); // 1-indexed, will hold extern names
  25331. supbooks.SheetNames = opts.snames;
  25332. supbooks.sharedf = opts.sharedf;
  25333. supbooks.arrayf = opts.arrayf;
  25334. supbooks.names = [];
  25335. supbooks.XTI = [];
  25336. var last_Rn = '';
  25337. var file_depth = 0; /* TODO: make a real stack */
  25338. var BIFF2Fmt = 0, BIFF2FmtTable = [];
  25339. var FilterDatabases = []; /* TODO: sort out supbooks and process elsewhere */
  25340. var last_lbl;
  25341. /* explicit override for some broken writers */
  25342. opts.codepage = 1200;
  25343. set_cp(1200);
  25344. var seen_codepage = false;
  25345. while(blob.l < blob.length - 1) {
  25346. var s = blob.l;
  25347. var RecordType = blob.read_shift(2);
  25348. if(RecordType === 0 && last_Rn === 'EOF') break;
  25349. var length = (blob.l === blob.length ? 0 : blob.read_shift(2));
  25350. var R = XLSRecordEnum[RecordType];
  25351. //console.log(RecordType.toString(16), RecordType, R, blob.l, length, blob.length);
  25352. //if(!R) console.log(blob.slice(blob.l, blob.l + length));
  25353. if(R && R.f) {
  25354. if(options.bookSheets) {
  25355. if(last_Rn === 'BoundSheet8' && R.n !== 'BoundSheet8') break;
  25356. }
  25357. last_Rn = R.n;
  25358. if(R.r === 2 || R.r == 12) {
  25359. var rt = blob.read_shift(2); length -= 2;
  25360. if(!opts.enc && rt !== RecordType && (((rt&0xFF)<<8)|(rt>>8)) !== RecordType) throw new Error("rt mismatch: " + rt + "!=" + RecordType);
  25361. if(R.r == 12){ blob.l += 10; length -= 10; } // skip FRT
  25362. }
  25363. //console.error(R,blob.l,length,blob.length);
  25364. var val = ({});
  25365. if(R.n === 'EOF') val = R.f(blob, length, opts);
  25366. else val = slurp(R, blob, length, opts);
  25367. var Rn = R.n;
  25368. if(file_depth == 0 && Rn != 'BOF') continue;
  25369. /* nested switch statements to workaround V8 128 limit */
  25370. switch(Rn) {
  25371. /* Workbook Options */
  25372. case 'Date1904':
  25373. wb.opts.Date1904 = Workbook.WBProps.date1904 = val; break;
  25374. case 'WriteProtect': wb.opts.WriteProtect = true; break;
  25375. case 'FilePass':
  25376. if(!opts.enc) blob.l = 0;
  25377. opts.enc = val;
  25378. if(!options.password) throw new Error("File is password-protected");
  25379. if(val.valid == null) throw new Error("Encryption scheme unsupported");
  25380. if(!val.valid) throw new Error("Password is incorrect");
  25381. break;
  25382. case 'WriteAccess': opts.lastuser = val; break;
  25383. case 'FileSharing': break; //TODO
  25384. case 'CodePage':
  25385. var cpval = Number(val);
  25386. /* overrides based on test cases */
  25387. switch(cpval) {
  25388. case 0x5212: cpval = 1200; break;
  25389. case 0x8000: cpval = 10000; break;
  25390. case 0x8001: cpval = 1252; break;
  25391. }
  25392. set_cp(opts.codepage = cpval);
  25393. seen_codepage = true;
  25394. break;
  25395. case 'RRTabId': opts.rrtabid = val; break;
  25396. case 'WinProtect': opts.winlocked = val; break;
  25397. case 'Template': break; // TODO
  25398. case 'BookBool': break; // TODO
  25399. case 'UsesELFs': break;
  25400. case 'MTRSettings': break;
  25401. case 'RefreshAll':
  25402. case 'CalcCount':
  25403. case 'CalcDelta':
  25404. case 'CalcIter':
  25405. case 'CalcMode':
  25406. case 'CalcPrecision':
  25407. case 'CalcSaveRecalc':
  25408. wb.opts[Rn] = val; break;
  25409. case 'CalcRefMode': opts.CalcRefMode = val; break; // TODO: implement R1C1
  25410. case 'Uncalced': break;
  25411. case 'ForceFullCalculation': wb.opts.FullCalc = val; break;
  25412. case 'WsBool':
  25413. if(val.fDialog) out["!type"] = "dialog";
  25414. break; // TODO
  25415. case 'XF':
  25416. XFs.push(val); break;
  25417. case 'ExtSST': break; // TODO
  25418. case 'BookExt': break; // TODO
  25419. case 'RichTextStream': break;
  25420. case 'BkHim': break;
  25421. case 'SupBook':
  25422. supbooks.push([val]);
  25423. supbooks[supbooks.length-1].XTI = [];
  25424. break;
  25425. case 'ExternName':
  25426. supbooks[supbooks.length-1].push(val);
  25427. break;
  25428. case 'Index': break; // TODO
  25429. case 'Lbl':
  25430. last_lbl = ({
  25431. Name: val.Name,
  25432. Ref: stringify_formula(val.rgce,range,null,supbooks,opts)
  25433. });
  25434. if(val.itab > 0) last_lbl.Sheet = val.itab - 1;
  25435. supbooks.names.push(last_lbl);
  25436. if(!supbooks[0]) { supbooks[0] = []; supbooks[0].XTI = []; }
  25437. supbooks[supbooks.length-1].push(val);
  25438. if(val.Name == "_xlnm._FilterDatabase" && val.itab > 0)
  25439. if(val.rgce && val.rgce[0] && val.rgce[0][0] && val.rgce[0][0][0] == 'PtgArea3d')
  25440. FilterDatabases[val.itab - 1] = { ref: encode_range(val.rgce[0][0][1][2]) };
  25441. break;
  25442. case 'ExternCount': opts.ExternCount = val; break;
  25443. case 'ExternSheet':
  25444. if(supbooks.length == 0) { supbooks[0] = []; supbooks[0].XTI = []; }
  25445. supbooks[supbooks.length - 1].XTI = supbooks[supbooks.length - 1].XTI.concat(val); supbooks.XTI = supbooks.XTI.concat(val); break;
  25446. case 'NameCmt':
  25447. /* TODO: search for correct name */
  25448. if(opts.biff < 8) break;
  25449. if(last_lbl != null) last_lbl.Comment = val[1];
  25450. break;
  25451. case 'Protect': out["!protect"] = val; break; /* for sheet or book */
  25452. case 'Password': if(val !== 0 && opts.WTF) console.error("Password verifier: " + val); break;
  25453. case 'Prot4Rev': case 'Prot4RevPass': break; /*TODO: Revision Control*/
  25454. case 'BoundSheet8': {
  25455. Directory[val.pos] = val;
  25456. opts.snames.push(val.name);
  25457. } break;
  25458. case 'EOF': {
  25459. if(--file_depth) break;
  25460. if(range.e) {
  25461. if(range.e.r > 0 && range.e.c > 0) {
  25462. range.e.r--; range.e.c--;
  25463. out["!ref"] = encode_range(range);
  25464. if(options.sheetRows && options.sheetRows <= range.e.r) {
  25465. var tmpri = range.e.r;
  25466. range.e.r = options.sheetRows - 1;
  25467. out["!fullref"] = out["!ref"];
  25468. out["!ref"] = encode_range(range);
  25469. range.e.r = tmpri;
  25470. }
  25471. range.e.r++; range.e.c++;
  25472. }
  25473. if(merges.length > 0) out["!merges"] = merges;
  25474. if(objects.length > 0) out["!objects"] = objects;
  25475. if(colinfo.length > 0) out["!cols"] = colinfo;
  25476. if(rowinfo.length > 0) out["!rows"] = rowinfo;
  25477. Workbook.Sheets.push(wsprops);
  25478. }
  25479. if(cur_sheet === "") Preamble = out; else Sheets[cur_sheet] = out;
  25480. out = ((options.dense ? [] : {}));
  25481. } break;
  25482. case 'BOF': {
  25483. if(opts.biff === 8) opts.biff = {
  25484. 0x0009:2,
  25485. 0x0209:3,
  25486. 0x0409:4
  25487. }[RecordType] || {
  25488. 0x0200:2,
  25489. 0x0300:3,
  25490. 0x0400:4,
  25491. 0x0500:5,
  25492. 0x0600:8,
  25493. 0x0002:2,
  25494. 0x0007:2
  25495. }[val.BIFFVer] || 8;
  25496. if(opts.biff == 8 && val.BIFFVer == 0 && val.dt == 16) opts.biff = 2;
  25497. if(file_depth++) break;
  25498. cell_valid = true;
  25499. out = ((options.dense ? [] : {}));
  25500. if(opts.biff < 8 && !seen_codepage) { seen_codepage = true; set_cp(opts.codepage = options.codepage || 1252); }
  25501. if(opts.biff < 5) {
  25502. if(cur_sheet === "") cur_sheet = "Sheet1";
  25503. range = {s:{r:0,c:0},e:{r:0,c:0}};
  25504. /* fake BoundSheet8 */
  25505. var fakebs8 = {pos: blob.l - length, name:cur_sheet};
  25506. Directory[fakebs8.pos] = fakebs8;
  25507. opts.snames.push(cur_sheet);
  25508. }
  25509. else cur_sheet = (Directory[s] || {name:""}).name;
  25510. if(val.dt == 0x20) out["!type"] = "chart";
  25511. if(val.dt == 0x40) out["!type"] = "macro";
  25512. merges = [];
  25513. objects = [];
  25514. opts.arrayf = arrayf = [];
  25515. colinfo = []; rowinfo = [];
  25516. defwidth = defheight = 0;
  25517. seencol = false;
  25518. wsprops = {Hidden:(Directory[s]||{hs:0}).hs, name:cur_sheet };
  25519. } break;
  25520. case 'Number': case 'BIFF2NUM': case 'BIFF2INT': {
  25521. if(out["!type"] == "chart") if(options.dense ? (out[val.r]||[])[val.c]: out[encode_cell({c:val.c, r:val.r})]) ++val.c;
  25522. temp_val = ({ixfe: val.ixfe, XF: XFs[val.ixfe]||{}, v:val.val, t:'n'});
  25523. if(BIFF2Fmt > 0) temp_val.z = BIFF2FmtTable[(temp_val.ixfe>>8) & 0x1F];
  25524. safe_format_xf(temp_val, options, wb.opts.Date1904);
  25525. addcell({c:val.c, r:val.r}, temp_val, options);
  25526. } break;
  25527. case 'BoolErr': {
  25528. temp_val = ({ixfe: val.ixfe, XF: XFs[val.ixfe], v:val.val, t:val.t});
  25529. if(BIFF2Fmt > 0) temp_val.z = BIFF2FmtTable[(temp_val.ixfe>>8) & 0x1F];
  25530. safe_format_xf(temp_val, options, wb.opts.Date1904);
  25531. addcell({c:val.c, r:val.r}, temp_val, options);
  25532. } break;
  25533. case 'RK': {
  25534. temp_val = ({ixfe: val.ixfe, XF: XFs[val.ixfe], v:val.rknum, t:'n'});
  25535. if(BIFF2Fmt > 0) temp_val.z = BIFF2FmtTable[(temp_val.ixfe>>8) & 0x1F];
  25536. safe_format_xf(temp_val, options, wb.opts.Date1904);
  25537. addcell({c:val.c, r:val.r}, temp_val, options);
  25538. } break;
  25539. case 'MulRk': {
  25540. for(var j = val.c; j <= val.C; ++j) {
  25541. var ixfe = val.rkrec[j-val.c][0];
  25542. temp_val= ({ixfe:ixfe, XF:XFs[ixfe], v:val.rkrec[j-val.c][1], t:'n'});
  25543. if(BIFF2Fmt > 0) temp_val.z = BIFF2FmtTable[(temp_val.ixfe>>8) & 0x1F];
  25544. safe_format_xf(temp_val, options, wb.opts.Date1904);
  25545. addcell({c:j, r:val.r}, temp_val, options);
  25546. }
  25547. } break;
  25548. case 'Formula': {
  25549. if(val.val == 'String') { last_formula = val; break; }
  25550. temp_val = make_cell(val.val, val.cell.ixfe, val.tt);
  25551. temp_val.XF = XFs[temp_val.ixfe];
  25552. if(options.cellFormula) {
  25553. var _f = val.formula;
  25554. if(_f && _f[0] && _f[0][0] && _f[0][0][0] == 'PtgExp') {
  25555. var _fr = _f[0][0][1][0], _fc = _f[0][0][1][1];
  25556. var _fe = encode_cell({r:_fr, c:_fc});
  25557. if(sharedf[_fe]) temp_val.f = ""+stringify_formula(val.formula,range,val.cell,supbooks, opts);
  25558. else temp_val.F = ((options.dense ? (out[_fr]||[])[_fc]: out[_fe]) || {}).F;
  25559. } else temp_val.f = ""+stringify_formula(val.formula,range,val.cell,supbooks, opts);
  25560. }
  25561. if(BIFF2Fmt > 0) temp_val.z = BIFF2FmtTable[(temp_val.ixfe>>8) & 0x1F];
  25562. safe_format_xf(temp_val, options, wb.opts.Date1904);
  25563. addcell(val.cell, temp_val, options);
  25564. last_formula = val;
  25565. } break;
  25566. case 'String': {
  25567. if(last_formula) { /* technically always true */
  25568. last_formula.val = val;
  25569. temp_val = make_cell(val, last_formula.cell.ixfe, 's');
  25570. temp_val.XF = XFs[temp_val.ixfe];
  25571. if(options.cellFormula) {
  25572. temp_val.f = ""+stringify_formula(last_formula.formula, range, last_formula.cell, supbooks, opts);
  25573. }
  25574. if(BIFF2Fmt > 0) temp_val.z = BIFF2FmtTable[(temp_val.ixfe>>8) & 0x1F];
  25575. safe_format_xf(temp_val, options, wb.opts.Date1904);
  25576. addcell(last_formula.cell, temp_val, options);
  25577. last_formula = null;
  25578. } else throw new Error("String record expects Formula");
  25579. } break;
  25580. case 'Array': {
  25581. arrayf.push(val);
  25582. var _arraystart = encode_cell(val[0].s);
  25583. cc = options.dense ? (out[val[0].s.r]||[])[val[0].s.c] : out[_arraystart];
  25584. if(options.cellFormula && cc) {
  25585. if(!last_formula) break; /* technically unreachable */
  25586. if(!_arraystart || !cc) break;
  25587. cc.f = ""+stringify_formula(val[1], range, val[0], supbooks, opts);
  25588. cc.F = encode_range(val[0]);
  25589. }
  25590. } break;
  25591. case 'ShrFmla': {
  25592. if(!cell_valid) break;
  25593. if(!options.cellFormula) break;
  25594. if(last_cell) {
  25595. /* TODO: capture range */
  25596. if(!last_formula) break; /* technically unreachable */
  25597. sharedf[encode_cell(last_formula.cell)]= val[0];
  25598. cc = options.dense ? (out[last_formula.cell.r]||[])[last_formula.cell.c] : out[encode_cell(last_formula.cell)];
  25599. (cc||{}).f = ""+stringify_formula(val[0], range, lastcell, supbooks, opts);
  25600. }
  25601. } break;
  25602. case 'LabelSst':
  25603. temp_val=make_cell(sst[val.isst].t, val.ixfe, 's');
  25604. if(sst[val.isst].h) temp_val.h = sst[val.isst].h;
  25605. temp_val.XF = XFs[temp_val.ixfe];
  25606. if(BIFF2Fmt > 0) temp_val.z = BIFF2FmtTable[(temp_val.ixfe>>8) & 0x1F];
  25607. safe_format_xf(temp_val, options, wb.opts.Date1904);
  25608. addcell({c:val.c, r:val.r}, temp_val, options);
  25609. break;
  25610. case 'Blank': if(options.sheetStubs) {
  25611. temp_val = ({ixfe: val.ixfe, XF: XFs[val.ixfe], t:'z'});
  25612. if(BIFF2Fmt > 0) temp_val.z = BIFF2FmtTable[(temp_val.ixfe>>8) & 0x1F];
  25613. safe_format_xf(temp_val, options, wb.opts.Date1904);
  25614. addcell({c:val.c, r:val.r}, temp_val, options);
  25615. } break;
  25616. case 'MulBlank': if(options.sheetStubs) {
  25617. for(var _j = val.c; _j <= val.C; ++_j) {
  25618. var _ixfe = val.ixfe[_j-val.c];
  25619. temp_val= ({ixfe:_ixfe, XF:XFs[_ixfe], t:'z'});
  25620. if(BIFF2Fmt > 0) temp_val.z = BIFF2FmtTable[(temp_val.ixfe>>8) & 0x1F];
  25621. safe_format_xf(temp_val, options, wb.opts.Date1904);
  25622. addcell({c:_j, r:val.r}, temp_val, options);
  25623. }
  25624. } break;
  25625. case 'RString':
  25626. case 'Label': case 'BIFF2STR':
  25627. temp_val=make_cell(val.val, val.ixfe, 's');
  25628. temp_val.XF = XFs[temp_val.ixfe];
  25629. if(BIFF2Fmt > 0) temp_val.z = BIFF2FmtTable[(temp_val.ixfe>>8) & 0x1F];
  25630. safe_format_xf(temp_val, options, wb.opts.Date1904);
  25631. addcell({c:val.c, r:val.r}, temp_val, options);
  25632. break;
  25633. case 'Dimensions': {
  25634. if(file_depth === 1) range = val; /* TODO: stack */
  25635. } break;
  25636. case 'SST': {
  25637. sst = val;
  25638. } break;
  25639. case 'Format': { /* val = [id, fmt] */
  25640. if(opts.biff == 4) {
  25641. BIFF2FmtTable[BIFF2Fmt++] = val[1];
  25642. for(var b4idx = 0; b4idx < BIFF2Fmt + 163; ++b4idx) if(SSF._table[b4idx] == val[1]) break;
  25643. if(b4idx >= 163) SSF.load(val[1], BIFF2Fmt + 163);
  25644. }
  25645. else SSF.load(val[1], val[0]);
  25646. } break;
  25647. case 'BIFF2FORMAT': {
  25648. BIFF2FmtTable[BIFF2Fmt++] = val;
  25649. for(var b2idx = 0; b2idx < BIFF2Fmt + 163; ++b2idx) if(SSF._table[b2idx] == val) break;
  25650. if(b2idx >= 163) SSF.load(val, BIFF2Fmt + 163);
  25651. } break;
  25652. case 'MergeCells': merges = merges.concat(val); break;
  25653. case 'Obj': objects[val.cmo[0]] = opts.lastobj = val; break;
  25654. case 'TxO': opts.lastobj.TxO = val; break;
  25655. case 'ImData': opts.lastobj.ImData = val; break;
  25656. case 'HLink': {
  25657. for(rngR = val[0].s.r; rngR <= val[0].e.r; ++rngR)
  25658. for(rngC = val[0].s.c; rngC <= val[0].e.c; ++rngC) {
  25659. cc = options.dense ? (out[rngR]||[])[rngC] : out[encode_cell({c:rngC,r:rngR})];
  25660. if(cc) cc.l = val[1];
  25661. }
  25662. } break;
  25663. case 'HLinkTooltip': {
  25664. for(rngR = val[0].s.r; rngR <= val[0].e.r; ++rngR)
  25665. for(rngC = val[0].s.c; rngC <= val[0].e.c; ++rngC) {
  25666. cc = options.dense ? (out[rngR]||[])[rngC] : out[encode_cell({c:rngC,r:rngR})];
  25667. if(cc && cc.l) cc.l.Tooltip = val[1];
  25668. }
  25669. } break;
  25670. /* Comments */
  25671. case 'Note': {
  25672. if(opts.biff <= 5 && opts.biff >= 2) break; /* TODO: BIFF5 */
  25673. cc = options.dense ? (out[val[0].r]||[])[val[0].c] : out[encode_cell(val[0])];
  25674. var noteobj = objects[val[2]];
  25675. if(!cc) {
  25676. if(options.dense) {
  25677. if(!out[val[0].r]) out[val[0].r] = [];
  25678. cc = out[val[0].r][val[0].c] = ({t:"z"});
  25679. } else {
  25680. cc = out[encode_cell(val[0])] = ({t:"z"});
  25681. }
  25682. range.e.r = Math.max(range.e.r, val[0].r);
  25683. range.s.r = Math.min(range.s.r, val[0].r);
  25684. range.e.c = Math.max(range.e.c, val[0].c);
  25685. range.s.c = Math.min(range.s.c, val[0].c);
  25686. }
  25687. if(!cc.c) cc.c = [];
  25688. cmnt = {a:val[1],t:noteobj.TxO.t};
  25689. cc.c.push(cmnt);
  25690. } break;
  25691. default: switch(R.n) { /* nested */
  25692. case 'ClrtClient': break;
  25693. case 'XFExt': update_xfext(XFs[val.ixfe], val.ext); break;
  25694. case 'DefColWidth': defwidth = val; break;
  25695. case 'DefaultRowHeight': defheight = val[1]; break; // TODO: flags
  25696. case 'ColInfo': {
  25697. if(!opts.cellStyles) break;
  25698. while(val.e >= val.s) {
  25699. colinfo[val.e--] = { width: val.w/256 };
  25700. if(!seencol) { seencol = true; find_mdw_colw(val.w/256); }
  25701. process_col(colinfo[val.e+1]);
  25702. }
  25703. } break;
  25704. case 'Row': {
  25705. var rowobj = {};
  25706. if(val.level != null) { rowinfo[val.r] = rowobj; rowobj.level = val.level; }
  25707. if(val.hidden) { rowinfo[val.r] = rowobj; rowobj.hidden = true; }
  25708. if(val.hpt) {
  25709. rowinfo[val.r] = rowobj;
  25710. rowobj.hpt = val.hpt; rowobj.hpx = pt2px(val.hpt);
  25711. }
  25712. } break;
  25713. case 'LeftMargin':
  25714. case 'RightMargin':
  25715. case 'TopMargin':
  25716. case 'BottomMargin':
  25717. if(!out['!margins']) default_margins(out['!margins'] = {});
  25718. out['!margins'][Rn.slice(0,-6).toLowerCase()] = val;
  25719. break;
  25720. case 'Setup': // TODO
  25721. if(!out['!margins']) default_margins(out['!margins'] = {});
  25722. out['!margins'].header = val.header;
  25723. out['!margins'].footer = val.footer;
  25724. break;
  25725. case 'Window2': // TODO
  25726. // $FlowIgnore
  25727. if(val.RTL) Workbook.Views[0].RTL = true;
  25728. break;
  25729. case 'Header': break; // TODO
  25730. case 'Footer': break; // TODO
  25731. case 'HCenter': break; // TODO
  25732. case 'VCenter': break; // TODO
  25733. case 'Pls': break; // TODO
  25734. case 'GCW': break;
  25735. case 'LHRecord': break;
  25736. case 'DBCell': break; // TODO
  25737. case 'EntExU2': break; // TODO
  25738. case 'SxView': break; // TODO
  25739. case 'Sxvd': break; // TODO
  25740. case 'SXVI': break; // TODO
  25741. case 'SXVDEx': break; // TODO
  25742. case 'SxIvd': break; // TODO
  25743. case 'SXString': break; // TODO
  25744. case 'Sync': break;
  25745. case 'Addin': break;
  25746. case 'SXDI': break; // TODO
  25747. case 'SXLI': break; // TODO
  25748. case 'SXEx': break; // TODO
  25749. case 'QsiSXTag': break; // TODO
  25750. case 'Selection': break;
  25751. case 'Feat': break;
  25752. case 'FeatHdr': case 'FeatHdr11': break;
  25753. case 'Feature11': case 'Feature12': case 'List12': break;
  25754. case 'Country': country = val; break;
  25755. case 'RecalcId': break;
  25756. case 'DxGCol': break; // TODO: htmlify
  25757. case 'Fbi': case 'Fbi2': case 'GelFrame': break;
  25758. case 'Font': break; // TODO
  25759. case 'XFCRC': break; // TODO
  25760. case 'Style': break; // TODO
  25761. case 'StyleExt': break; // TODO
  25762. case 'Palette': palette = val; break;
  25763. case 'Theme': themes = val; break;
  25764. /* Protection */
  25765. case 'ScenarioProtect': break;
  25766. case 'ObjProtect': break;
  25767. /* Conditional Formatting */
  25768. case 'CondFmt12': break;
  25769. /* Table */
  25770. case 'Table': break; // TODO
  25771. case 'TableStyles': break; // TODO
  25772. case 'TableStyle': break; // TODO
  25773. case 'TableStyleElement': break; // TODO
  25774. /* PivotTable */
  25775. case 'SXStreamID': break; // TODO
  25776. case 'SXVS': break; // TODO
  25777. case 'DConRef': break; // TODO
  25778. case 'SXAddl': break; // TODO
  25779. case 'DConBin': break; // TODO
  25780. case 'DConName': break; // TODO
  25781. case 'SXPI': break; // TODO
  25782. case 'SxFormat': break; // TODO
  25783. case 'SxSelect': break; // TODO
  25784. case 'SxRule': break; // TODO
  25785. case 'SxFilt': break; // TODO
  25786. case 'SxItm': break; // TODO
  25787. case 'SxDXF': break; // TODO
  25788. /* Scenario Manager */
  25789. case 'ScenMan': break;
  25790. /* Data Consolidation */
  25791. case 'DCon': break;
  25792. /* Watched Cell */
  25793. case 'CellWatch': break;
  25794. /* Print Settings */
  25795. case 'PrintRowCol': break;
  25796. case 'PrintGrid': break;
  25797. case 'PrintSize': break;
  25798. case 'XCT': break;
  25799. case 'CRN': break;
  25800. case 'Scl': {
  25801. //console.log("Zoom Level:", val[0]/val[1],val);
  25802. } break;
  25803. case 'SheetExt': {
  25804. /* empty */
  25805. } break;
  25806. case 'SheetExtOptional': {
  25807. /* empty */
  25808. } break;
  25809. /* VBA */
  25810. case 'ObNoMacros': {
  25811. /* empty */
  25812. } break;
  25813. case 'ObProj': {
  25814. /* empty */
  25815. } break;
  25816. case 'CodeName': {
  25817. if(!cur_sheet) Workbook.WBProps.CodeName = val || "ThisWorkbook";
  25818. else wsprops.CodeName = val || wsprops.name;
  25819. } break;
  25820. case 'GUIDTypeLib': {
  25821. /* empty */
  25822. } break;
  25823. case 'WOpt': break; // TODO: WTF?
  25824. case 'PhoneticInfo': break;
  25825. case 'OleObjectSize': break;
  25826. /* Differential Formatting */
  25827. case 'DXF': case 'DXFN': case 'DXFN12': case 'DXFN12List': case 'DXFN12NoCB': break;
  25828. /* Data Validation */
  25829. case 'Dv': case 'DVal': break;
  25830. /* Data Series */
  25831. case 'BRAI': case 'Series': case 'SeriesText': break;
  25832. /* Data Connection */
  25833. case 'DConn': break;
  25834. case 'DbOrParamQry': break;
  25835. case 'DBQueryExt': break;
  25836. case 'OleDbConn': break;
  25837. case 'ExtString': break;
  25838. /* Formatting */
  25839. case 'IFmtRecord': break;
  25840. case 'CondFmt': case 'CF': case 'CF12': case 'CFEx': break;
  25841. /* Explicitly Ignored */
  25842. case 'Excel9File': break;
  25843. case 'Units': break;
  25844. case 'InterfaceHdr': case 'Mms': case 'InterfaceEnd': case 'DSF': break;
  25845. case 'BuiltInFnGroupCount': /* 2.4.30 0x0E or 0x10 but excel 2011 generates 0x11? */ break;
  25846. /* View Stuff */
  25847. case 'Window1': case 'HideObj': case 'GridSet': case 'Guts':
  25848. case 'UserBView': case 'UserSViewBegin': case 'UserSViewEnd': break;
  25849. case 'Pane': break;
  25850. default: switch(R.n) { /* nested */
  25851. /* Chart */
  25852. case 'Dat':
  25853. case 'Begin': case 'End':
  25854. case 'StartBlock': case 'EndBlock':
  25855. case 'Frame': case 'Area':
  25856. case 'Axis': case 'AxisLine': case 'Tick': break;
  25857. case 'AxesUsed':
  25858. case 'CrtLayout12': case 'CrtLayout12A': case 'CrtLink': case 'CrtLine': case 'CrtMlFrt': case 'CrtMlFrtContinue': break;
  25859. case 'LineFormat': case 'AreaFormat':
  25860. case 'Chart': case 'Chart3d': case 'Chart3DBarShape': case 'ChartFormat': case 'ChartFrtInfo': break;
  25861. case 'PlotArea': case 'PlotGrowth': break;
  25862. case 'SeriesList': case 'SerParent': case 'SerAuxTrend': break;
  25863. case 'DataFormat': case 'SerToCrt': case 'FontX': break;
  25864. case 'CatSerRange': case 'AxcExt': case 'SerFmt': break;
  25865. case 'ShtProps': break;
  25866. case 'DefaultText': case 'Text': case 'CatLab': break;
  25867. case 'DataLabExtContents': break;
  25868. case 'Legend': case 'LegendException': break;
  25869. case 'Pie': case 'Scatter': break;
  25870. case 'PieFormat': case 'MarkerFormat': break;
  25871. case 'StartObject': case 'EndObject': break;
  25872. case 'AlRuns': case 'ObjectLink': break;
  25873. case 'SIIndex': break;
  25874. case 'AttachedLabel': case 'YMult': break;
  25875. /* Chart Group */
  25876. case 'Line': case 'Bar': break;
  25877. case 'Surf': break;
  25878. /* Axis Group */
  25879. case 'AxisParent': break;
  25880. case 'Pos': break;
  25881. case 'ValueRange': break;
  25882. /* Pivot Chart */
  25883. case 'SXViewEx9': break; // TODO
  25884. case 'SXViewLink': break;
  25885. case 'PivotChartBits': break;
  25886. case 'SBaseRef': break;
  25887. case 'TextPropsStream': break;
  25888. /* Chart Misc */
  25889. case 'LnExt': break;
  25890. case 'MkrExt': break;
  25891. case 'CrtCoopt': break;
  25892. /* Query Table */
  25893. case 'Qsi': case 'Qsif': case 'Qsir': case 'QsiSXTag': break;
  25894. case 'TxtQry': break;
  25895. /* Filter */
  25896. case 'FilterMode': break;
  25897. case 'AutoFilter': case 'AutoFilterInfo': break;
  25898. case 'AutoFilter12': break;
  25899. case 'DropDownObjIds': break;
  25900. case 'Sort': break;
  25901. case 'SortData': break;
  25902. /* Drawing */
  25903. case 'ShapePropsStream': break;
  25904. case 'MsoDrawing': case 'MsoDrawingGroup': case 'MsoDrawingSelection': break;
  25905. /* Pub Stuff */
  25906. case 'WebPub': case 'AutoWebPub': break;
  25907. /* Print Stuff */
  25908. case 'HeaderFooter': case 'HFPicture': case 'PLV':
  25909. case 'HorizontalPageBreaks': case 'VerticalPageBreaks': break;
  25910. /* Behavioral */
  25911. case 'Backup': case 'CompressPictures': case 'Compat12': break;
  25912. /* Should not Happen */
  25913. case 'Continue': case 'ContinueFrt12': break;
  25914. /* Future Records */
  25915. case 'FrtFontList': case 'FrtWrapper': break;
  25916. default: switch(R.n) { /* nested */
  25917. /* BIFF5 records */
  25918. case 'TabIdConf': case 'Radar': case 'RadarArea': case 'DropBar': case 'Intl': case 'CoordList': case 'SerAuxErrBar': break;
  25919. /* BIFF2-4 records */
  25920. case 'BIFF2FONTCLR': case 'BIFF2FMTCNT': case 'BIFF2FONTXTRA': break;
  25921. case 'BIFF2XF': case 'BIFF3XF': case 'BIFF4XF': break;
  25922. case 'BIFF4FMTCNT': case 'BIFF2ROW': case 'BIFF2WINDOW2': break;
  25923. /* Miscellaneous */
  25924. case 'SCENARIO': case 'DConBin': case 'PicF': case 'DataLabExt':
  25925. case 'Lel': case 'BopPop': case 'BopPopCustom': case 'RealTimeData':
  25926. case 'Name': break;
  25927. case 'LHNGraph': case 'FnGroupName': case 'AddMenu': case 'LPr': break;
  25928. case 'ListObj': case 'ListField': break;
  25929. case 'RRSort': break;
  25930. case 'BigName': break;
  25931. case 'ToolbarHdr': case 'ToolbarEnd': break;
  25932. case 'DDEObjName': break;
  25933. case 'FRTArchId$': break;
  25934. default: if(options.WTF) throw 'Unrecognized Record ' + R.n;
  25935. }}}}
  25936. } else blob.l += length;
  25937. }
  25938. wb.SheetNames=keys(Directory).sort(function(a,b) { return Number(a) - Number(b); }).map(function(x){return Directory[x].name;});
  25939. if(!options.bookSheets) wb.Sheets=Sheets;
  25940. if(wb.Sheets) FilterDatabases.forEach(function(r,i) { wb.Sheets[wb.SheetNames[i]]['!autofilter'] = r; });
  25941. wb.Preamble=Preamble;
  25942. wb.Strings = sst;
  25943. wb.SSF = SSF.get_table();
  25944. if(opts.enc) wb.Encryption = opts.enc;
  25945. if(themes) wb.Themes = themes;
  25946. wb.Metadata = {};
  25947. if(country !== undefined) wb.Metadata.Country = country;
  25948. if(supbooks.names.length > 0) Workbook.Names = supbooks.names;
  25949. wb.Workbook = Workbook;
  25950. return wb;
  25951. }
  25952. /* TODO: split props*/
  25953. var PSCLSID = {
  25954. SI: "e0859ff2f94f6810ab9108002b27b3d9",
  25955. DSI: "02d5cdd59c2e1b10939708002b2cf9ae",
  25956. UDI: "05d5cdd59c2e1b10939708002b2cf9ae"
  25957. };
  25958. function parse_xls_props(cfb, props, o) {
  25959. /* [MS-OSHARED] 2.3.3.2.2 Document Summary Information Property Set */
  25960. var DSI = CFB.find(cfb, '!DocumentSummaryInformation');
  25961. if(DSI && DSI.size > 0) try {
  25962. var DocSummary = parse_PropertySetStream(DSI, DocSummaryPIDDSI, PSCLSID.DSI);
  25963. for(var d in DocSummary) props[d] = DocSummary[d];
  25964. } catch(e) {if(o.WTF) throw e;/* empty */}
  25965. /* [MS-OSHARED] 2.3.3.2.1 Summary Information Property Set*/
  25966. var SI = CFB.find(cfb, '!SummaryInformation');
  25967. if(SI && SI.size > 0) try {
  25968. var Summary = parse_PropertySetStream(SI, SummaryPIDSI, PSCLSID.SI);
  25969. for(var s in Summary) if(props[s] == null) props[s] = Summary[s];
  25970. } catch(e) {if(o.WTF) throw e;/* empty */}
  25971. if(props.HeadingPairs && props.TitlesOfParts) {
  25972. load_props_pairs(props.HeadingPairs, props.TitlesOfParts, props, o);
  25973. delete props.HeadingPairs; delete props.TitlesOfParts;
  25974. }
  25975. }
  25976. function write_xls_props(wb, cfb) {
  25977. var DSEntries = [], SEntries = [], CEntries = [];
  25978. var i = 0, Keys;
  25979. if(wb.Props) {
  25980. Keys = keys(wb.Props);
  25981. // $FlowIgnore
  25982. for(i = 0; i < Keys.length; ++i) (Object.prototype.hasOwnProperty.call(DocSummaryRE, Keys[i]) ? DSEntries : Object.prototype.hasOwnProperty.call(SummaryRE, Keys[i]) ? SEntries : CEntries).push([Keys[i], wb.Props[Keys[i]]]);
  25983. }
  25984. if(wb.Custprops) {
  25985. Keys = keys(wb.Custprops);
  25986. // $FlowIgnore
  25987. for(i = 0; i < Keys.length; ++i) if(!Object.prototype.hasOwnProperty.call((wb.Props||{}), Keys[i])) (Object.prototype.hasOwnProperty.call(DocSummaryRE, Keys[i]) ? DSEntries : Object.prototype.hasOwnProperty.call(SummaryRE, Keys[i]) ? SEntries : CEntries).push([Keys[i], wb.Custprops[Keys[i]]]);
  25988. }
  25989. var CEntries2 = [];
  25990. for(i = 0; i < CEntries.length; ++i) {
  25991. if(XLSPSSkip.indexOf(CEntries[i][0]) > -1) continue;
  25992. if(CEntries[i][1] == null) continue;
  25993. CEntries2.push(CEntries[i]);
  25994. }
  25995. if(SEntries.length) CFB.utils.cfb_add(cfb, "/\u0005SummaryInformation", write_PropertySetStream(SEntries, PSCLSID.SI, SummaryRE, SummaryPIDSI));
  25996. if(DSEntries.length || CEntries2.length) CFB.utils.cfb_add(cfb, "/\u0005DocumentSummaryInformation", write_PropertySetStream(DSEntries, PSCLSID.DSI, DocSummaryRE, DocSummaryPIDDSI, CEntries2.length ? CEntries2 : null, PSCLSID.UDI));
  25997. }
  25998. function parse_xlscfb(cfb, options) {
  25999. if(!options) options = {};
  26000. fix_read_opts(options);
  26001. reset_cp();
  26002. if(options.codepage) set_ansi(options.codepage);
  26003. var CompObj, WB;
  26004. if(cfb.FullPaths) {
  26005. if(CFB.find(cfb, '/encryption')) throw new Error("File is password-protected");
  26006. CompObj = CFB.find(cfb, '!CompObj');
  26007. WB = CFB.find(cfb, '/Workbook') || CFB.find(cfb, '/Book');
  26008. } else {
  26009. switch(options.type) {
  26010. case 'base64': cfb = s2a(Base64.decode(cfb)); break;
  26011. case 'binary': cfb = s2a(cfb); break;
  26012. case 'buffer': break;
  26013. case 'array': if(!Array.isArray(cfb)) cfb = Array.prototype.slice.call(cfb); break;
  26014. }
  26015. prep_blob(cfb, 0);
  26016. WB = ({content: cfb});
  26017. }
  26018. var WorkbookP;
  26019. var _data;
  26020. if(CompObj) parse_compobj(CompObj);
  26021. if(options.bookProps && !options.bookSheets) WorkbookP = ({});
  26022. else {
  26023. var T = has_buf ? 'buffer' : 'array';
  26024. if(WB && WB.content) WorkbookP = parse_workbook(WB.content, options);
  26025. /* Quattro Pro 7-8 */
  26026. else if((_data=CFB.find(cfb, 'PerfectOffice_MAIN')) && _data.content) WorkbookP = WK_.to_workbook(_data.content, (options.type = T, options));
  26027. /* Quattro Pro 9 */
  26028. else if((_data=CFB.find(cfb, 'NativeContent_MAIN')) && _data.content) WorkbookP = WK_.to_workbook(_data.content, (options.type = T, options));
  26029. else throw new Error("Cannot find Workbook stream");
  26030. if(options.bookVBA && cfb.FullPaths && CFB.find(cfb, '/_VBA_PROJECT_CUR/VBA/dir')) WorkbookP.vbaraw = make_vba_xls(cfb);
  26031. }
  26032. var props = {};
  26033. if(cfb.FullPaths) parse_xls_props(cfb, props, options);
  26034. WorkbookP.Props = WorkbookP.Custprops = props; /* TODO: split up properties */
  26035. if(options.bookFiles) WorkbookP.cfb = cfb;
  26036. /*WorkbookP.CompObjP = CompObjP; // TODO: storage? */
  26037. return WorkbookP;
  26038. }
  26039. function write_xlscfb(wb, opts) {
  26040. var o = opts || {};
  26041. var cfb = CFB.utils.cfb_new({root:"R"});
  26042. var wbpath = "/Workbook";
  26043. switch(o.bookType || "xls") {
  26044. case "xls": o.bookType = "biff8";
  26045. /* falls through */
  26046. case "xla": if(!o.bookType) o.bookType = "xla";
  26047. /* falls through */
  26048. case "biff8": wbpath = "/Workbook"; o.biff = 8; break;
  26049. case "biff5": wbpath = "/Book"; o.biff = 5; break;
  26050. default: throw new Error("invalid type " + o.bookType + " for XLS CFB");
  26051. }
  26052. CFB.utils.cfb_add(cfb, wbpath, write_biff_buf(wb, o));
  26053. if(o.biff == 8 && (wb.Props || wb.Custprops)) write_xls_props(wb, cfb);
  26054. // TODO: SI, DSI, CO
  26055. if(o.biff == 8 && wb.vbaraw) fill_vba_xls(cfb, CFB.read(wb.vbaraw, {type: typeof wb.vbaraw == "string" ? "binary" : "buffer"}));
  26056. return cfb;
  26057. }
  26058. /* [MS-XLSB] 2.3 Record Enumeration */
  26059. var XLSBRecordEnum = {
  26060. 0x0000: { n:"BrtRowHdr", f:parse_BrtRowHdr },
  26061. 0x0001: { n:"BrtCellBlank", f:parse_BrtCellBlank },
  26062. 0x0002: { n:"BrtCellRk", f:parse_BrtCellRk },
  26063. 0x0003: { n:"BrtCellError", f:parse_BrtCellError },
  26064. 0x0004: { n:"BrtCellBool", f:parse_BrtCellBool },
  26065. 0x0005: { n:"BrtCellReal", f:parse_BrtCellReal },
  26066. 0x0006: { n:"BrtCellSt", f:parse_BrtCellSt },
  26067. 0x0007: { n:"BrtCellIsst", f:parse_BrtCellIsst },
  26068. 0x0008: { n:"BrtFmlaString", f:parse_BrtFmlaString },
  26069. 0x0009: { n:"BrtFmlaNum", f:parse_BrtFmlaNum },
  26070. 0x000A: { n:"BrtFmlaBool", f:parse_BrtFmlaBool },
  26071. 0x000B: { n:"BrtFmlaError", f:parse_BrtFmlaError },
  26072. 0x000C: { n:"BrtShortBlank", f:parse_BrtShortBlank },
  26073. 0x000D: { n:"BrtShortRk", f:parse_BrtShortRk },
  26074. 0x000E: { n:"BrtShortError", f:parse_BrtShortError },
  26075. 0x000F: { n:"BrtShortBool", f:parse_BrtShortBool },
  26076. 0x0010: { n:"BrtShortReal", f:parse_BrtShortReal },
  26077. 0x0011: { n:"BrtShortSt", f:parse_BrtShortSt },
  26078. 0x0012: { n:"BrtShortIsst", f:parse_BrtShortIsst },
  26079. 0x0013: { n:"BrtSSTItem", f:parse_RichStr },
  26080. 0x0014: { n:"BrtPCDIMissing" },
  26081. 0x0015: { n:"BrtPCDINumber" },
  26082. 0x0016: { n:"BrtPCDIBoolean" },
  26083. 0x0017: { n:"BrtPCDIError" },
  26084. 0x0018: { n:"BrtPCDIString" },
  26085. 0x0019: { n:"BrtPCDIDatetime" },
  26086. 0x001A: { n:"BrtPCDIIndex" },
  26087. 0x001B: { n:"BrtPCDIAMissing" },
  26088. 0x001C: { n:"BrtPCDIANumber" },
  26089. 0x001D: { n:"BrtPCDIABoolean" },
  26090. 0x001E: { n:"BrtPCDIAError" },
  26091. 0x001F: { n:"BrtPCDIAString" },
  26092. 0x0020: { n:"BrtPCDIADatetime" },
  26093. 0x0021: { n:"BrtPCRRecord" },
  26094. 0x0022: { n:"BrtPCRRecordDt" },
  26095. 0x0023: { n:"BrtFRTBegin" },
  26096. 0x0024: { n:"BrtFRTEnd" },
  26097. 0x0025: { n:"BrtACBegin" },
  26098. 0x0026: { n:"BrtACEnd" },
  26099. 0x0027: { n:"BrtName", f:parse_BrtName },
  26100. 0x0028: { n:"BrtIndexRowBlock" },
  26101. 0x002A: { n:"BrtIndexBlock" },
  26102. 0x002B: { n:"BrtFont", f:parse_BrtFont },
  26103. 0x002C: { n:"BrtFmt", f:parse_BrtFmt },
  26104. 0x002D: { n:"BrtFill", f:parse_BrtFill },
  26105. 0x002E: { n:"BrtBorder", f:parse_BrtBorder },
  26106. 0x002F: { n:"BrtXF", f:parse_BrtXF },
  26107. 0x0030: { n:"BrtStyle" },
  26108. 0x0031: { n:"BrtCellMeta" },
  26109. 0x0032: { n:"BrtValueMeta" },
  26110. 0x0033: { n:"BrtMdb" },
  26111. 0x0034: { n:"BrtBeginFmd" },
  26112. 0x0035: { n:"BrtEndFmd" },
  26113. 0x0036: { n:"BrtBeginMdx" },
  26114. 0x0037: { n:"BrtEndMdx" },
  26115. 0x0038: { n:"BrtBeginMdxTuple" },
  26116. 0x0039: { n:"BrtEndMdxTuple" },
  26117. 0x003A: { n:"BrtMdxMbrIstr" },
  26118. 0x003B: { n:"BrtStr" },
  26119. 0x003C: { n:"BrtColInfo", f:parse_ColInfo },
  26120. 0x003E: { n:"BrtCellRString" },
  26121. 0x003F: { n:"BrtCalcChainItem$", f:parse_BrtCalcChainItem$ },
  26122. 0x0040: { n:"BrtDVal", f:parse_BrtDVal },
  26123. 0x0041: { n:"BrtSxvcellNum" },
  26124. 0x0042: { n:"BrtSxvcellStr" },
  26125. 0x0043: { n:"BrtSxvcellBool" },
  26126. 0x0044: { n:"BrtSxvcellErr" },
  26127. 0x0045: { n:"BrtSxvcellDate" },
  26128. 0x0046: { n:"BrtSxvcellNil" },
  26129. 0x0080: { n:"BrtFileVersion" },
  26130. 0x0081: { n:"BrtBeginSheet" },
  26131. 0x0082: { n:"BrtEndSheet" },
  26132. 0x0083: { n:"BrtBeginBook", f:parsenoop, p:0 },
  26133. 0x0084: { n:"BrtEndBook" },
  26134. 0x0085: { n:"BrtBeginWsViews" },
  26135. 0x0086: { n:"BrtEndWsViews" },
  26136. 0x0087: { n:"BrtBeginBookViews" },
  26137. 0x0088: { n:"BrtEndBookViews" },
  26138. 0x0089: { n:"BrtBeginWsView", f:parse_BrtBeginWsView },
  26139. 0x008A: { n:"BrtEndWsView" },
  26140. 0x008B: { n:"BrtBeginCsViews" },
  26141. 0x008C: { n:"BrtEndCsViews" },
  26142. 0x008D: { n:"BrtBeginCsView" },
  26143. 0x008E: { n:"BrtEndCsView" },
  26144. 0x008F: { n:"BrtBeginBundleShs" },
  26145. 0x0090: { n:"BrtEndBundleShs" },
  26146. 0x0091: { n:"BrtBeginSheetData" },
  26147. 0x0092: { n:"BrtEndSheetData" },
  26148. 0x0093: { n:"BrtWsProp", f:parse_BrtWsProp },
  26149. 0x0094: { n:"BrtWsDim", f:parse_BrtWsDim, p:16 },
  26150. 0x0097: { n:"BrtPane", f:parse_BrtPane },
  26151. 0x0098: { n:"BrtSel" },
  26152. 0x0099: { n:"BrtWbProp", f:parse_BrtWbProp },
  26153. 0x009A: { n:"BrtWbFactoid" },
  26154. 0x009B: { n:"BrtFileRecover" },
  26155. 0x009C: { n:"BrtBundleSh", f:parse_BrtBundleSh },
  26156. 0x009D: { n:"BrtCalcProp" },
  26157. 0x009E: { n:"BrtBookView" },
  26158. 0x009F: { n:"BrtBeginSst", f:parse_BrtBeginSst },
  26159. 0x00A0: { n:"BrtEndSst" },
  26160. 0x00A1: { n:"BrtBeginAFilter", f:parse_UncheckedRfX },
  26161. 0x00A2: { n:"BrtEndAFilter" },
  26162. 0x00A3: { n:"BrtBeginFilterColumn" },
  26163. 0x00A4: { n:"BrtEndFilterColumn" },
  26164. 0x00A5: { n:"BrtBeginFilters" },
  26165. 0x00A6: { n:"BrtEndFilters" },
  26166. 0x00A7: { n:"BrtFilter" },
  26167. 0x00A8: { n:"BrtColorFilter" },
  26168. 0x00A9: { n:"BrtIconFilter" },
  26169. 0x00AA: { n:"BrtTop10Filter" },
  26170. 0x00AB: { n:"BrtDynamicFilter" },
  26171. 0x00AC: { n:"BrtBeginCustomFilters" },
  26172. 0x00AD: { n:"BrtEndCustomFilters" },
  26173. 0x00AE: { n:"BrtCustomFilter" },
  26174. 0x00AF: { n:"BrtAFilterDateGroupItem" },
  26175. 0x00B0: { n:"BrtMergeCell", f:parse_BrtMergeCell },
  26176. 0x00B1: { n:"BrtBeginMergeCells" },
  26177. 0x00B2: { n:"BrtEndMergeCells" },
  26178. 0x00B3: { n:"BrtBeginPivotCacheDef" },
  26179. 0x00B4: { n:"BrtEndPivotCacheDef" },
  26180. 0x00B5: { n:"BrtBeginPCDFields" },
  26181. 0x00B6: { n:"BrtEndPCDFields" },
  26182. 0x00B7: { n:"BrtBeginPCDField" },
  26183. 0x00B8: { n:"BrtEndPCDField" },
  26184. 0x00B9: { n:"BrtBeginPCDSource" },
  26185. 0x00BA: { n:"BrtEndPCDSource" },
  26186. 0x00BB: { n:"BrtBeginPCDSRange" },
  26187. 0x00BC: { n:"BrtEndPCDSRange" },
  26188. 0x00BD: { n:"BrtBeginPCDFAtbl" },
  26189. 0x00BE: { n:"BrtEndPCDFAtbl" },
  26190. 0x00BF: { n:"BrtBeginPCDIRun" },
  26191. 0x00C0: { n:"BrtEndPCDIRun" },
  26192. 0x00C1: { n:"BrtBeginPivotCacheRecords" },
  26193. 0x00C2: { n:"BrtEndPivotCacheRecords" },
  26194. 0x00C3: { n:"BrtBeginPCDHierarchies" },
  26195. 0x00C4: { n:"BrtEndPCDHierarchies" },
  26196. 0x00C5: { n:"BrtBeginPCDHierarchy" },
  26197. 0x00C6: { n:"BrtEndPCDHierarchy" },
  26198. 0x00C7: { n:"BrtBeginPCDHFieldsUsage" },
  26199. 0x00C8: { n:"BrtEndPCDHFieldsUsage" },
  26200. 0x00C9: { n:"BrtBeginExtConnection" },
  26201. 0x00CA: { n:"BrtEndExtConnection" },
  26202. 0x00CB: { n:"BrtBeginECDbProps" },
  26203. 0x00CC: { n:"BrtEndECDbProps" },
  26204. 0x00CD: { n:"BrtBeginECOlapProps" },
  26205. 0x00CE: { n:"BrtEndECOlapProps" },
  26206. 0x00CF: { n:"BrtBeginPCDSConsol" },
  26207. 0x00D0: { n:"BrtEndPCDSConsol" },
  26208. 0x00D1: { n:"BrtBeginPCDSCPages" },
  26209. 0x00D2: { n:"BrtEndPCDSCPages" },
  26210. 0x00D3: { n:"BrtBeginPCDSCPage" },
  26211. 0x00D4: { n:"BrtEndPCDSCPage" },
  26212. 0x00D5: { n:"BrtBeginPCDSCPItem" },
  26213. 0x00D6: { n:"BrtEndPCDSCPItem" },
  26214. 0x00D7: { n:"BrtBeginPCDSCSets" },
  26215. 0x00D8: { n:"BrtEndPCDSCSets" },
  26216. 0x00D9: { n:"BrtBeginPCDSCSet" },
  26217. 0x00DA: { n:"BrtEndPCDSCSet" },
  26218. 0x00DB: { n:"BrtBeginPCDFGroup" },
  26219. 0x00DC: { n:"BrtEndPCDFGroup" },
  26220. 0x00DD: { n:"BrtBeginPCDFGItems" },
  26221. 0x00DE: { n:"BrtEndPCDFGItems" },
  26222. 0x00DF: { n:"BrtBeginPCDFGRange" },
  26223. 0x00E0: { n:"BrtEndPCDFGRange" },
  26224. 0x00E1: { n:"BrtBeginPCDFGDiscrete" },
  26225. 0x00E2: { n:"BrtEndPCDFGDiscrete" },
  26226. 0x00E3: { n:"BrtBeginPCDSDTupleCache" },
  26227. 0x00E4: { n:"BrtEndPCDSDTupleCache" },
  26228. 0x00E5: { n:"BrtBeginPCDSDTCEntries" },
  26229. 0x00E6: { n:"BrtEndPCDSDTCEntries" },
  26230. 0x00E7: { n:"BrtBeginPCDSDTCEMembers" },
  26231. 0x00E8: { n:"BrtEndPCDSDTCEMembers" },
  26232. 0x00E9: { n:"BrtBeginPCDSDTCEMember" },
  26233. 0x00EA: { n:"BrtEndPCDSDTCEMember" },
  26234. 0x00EB: { n:"BrtBeginPCDSDTCQueries" },
  26235. 0x00EC: { n:"BrtEndPCDSDTCQueries" },
  26236. 0x00ED: { n:"BrtBeginPCDSDTCQuery" },
  26237. 0x00EE: { n:"BrtEndPCDSDTCQuery" },
  26238. 0x00EF: { n:"BrtBeginPCDSDTCSets" },
  26239. 0x00F0: { n:"BrtEndPCDSDTCSets" },
  26240. 0x00F1: { n:"BrtBeginPCDSDTCSet" },
  26241. 0x00F2: { n:"BrtEndPCDSDTCSet" },
  26242. 0x00F3: { n:"BrtBeginPCDCalcItems" },
  26243. 0x00F4: { n:"BrtEndPCDCalcItems" },
  26244. 0x00F5: { n:"BrtBeginPCDCalcItem" },
  26245. 0x00F6: { n:"BrtEndPCDCalcItem" },
  26246. 0x00F7: { n:"BrtBeginPRule" },
  26247. 0x00F8: { n:"BrtEndPRule" },
  26248. 0x00F9: { n:"BrtBeginPRFilters" },
  26249. 0x00FA: { n:"BrtEndPRFilters" },
  26250. 0x00FB: { n:"BrtBeginPRFilter" },
  26251. 0x00FC: { n:"BrtEndPRFilter" },
  26252. 0x00FD: { n:"BrtBeginPNames" },
  26253. 0x00FE: { n:"BrtEndPNames" },
  26254. 0x00FF: { n:"BrtBeginPName" },
  26255. 0x0100: { n:"BrtEndPName" },
  26256. 0x0101: { n:"BrtBeginPNPairs" },
  26257. 0x0102: { n:"BrtEndPNPairs" },
  26258. 0x0103: { n:"BrtBeginPNPair" },
  26259. 0x0104: { n:"BrtEndPNPair" },
  26260. 0x0105: { n:"BrtBeginECWebProps" },
  26261. 0x0106: { n:"BrtEndECWebProps" },
  26262. 0x0107: { n:"BrtBeginEcWpTables" },
  26263. 0x0108: { n:"BrtEndECWPTables" },
  26264. 0x0109: { n:"BrtBeginECParams" },
  26265. 0x010A: { n:"BrtEndECParams" },
  26266. 0x010B: { n:"BrtBeginECParam" },
  26267. 0x010C: { n:"BrtEndECParam" },
  26268. 0x010D: { n:"BrtBeginPCDKPIs" },
  26269. 0x010E: { n:"BrtEndPCDKPIs" },
  26270. 0x010F: { n:"BrtBeginPCDKPI" },
  26271. 0x0110: { n:"BrtEndPCDKPI" },
  26272. 0x0111: { n:"BrtBeginDims" },
  26273. 0x0112: { n:"BrtEndDims" },
  26274. 0x0113: { n:"BrtBeginDim" },
  26275. 0x0114: { n:"BrtEndDim" },
  26276. 0x0115: { n:"BrtIndexPartEnd" },
  26277. 0x0116: { n:"BrtBeginStyleSheet" },
  26278. 0x0117: { n:"BrtEndStyleSheet" },
  26279. 0x0118: { n:"BrtBeginSXView" },
  26280. 0x0119: { n:"BrtEndSXVI" },
  26281. 0x011A: { n:"BrtBeginSXVI" },
  26282. 0x011B: { n:"BrtBeginSXVIs" },
  26283. 0x011C: { n:"BrtEndSXVIs" },
  26284. 0x011D: { n:"BrtBeginSXVD" },
  26285. 0x011E: { n:"BrtEndSXVD" },
  26286. 0x011F: { n:"BrtBeginSXVDs" },
  26287. 0x0120: { n:"BrtEndSXVDs" },
  26288. 0x0121: { n:"BrtBeginSXPI" },
  26289. 0x0122: { n:"BrtEndSXPI" },
  26290. 0x0123: { n:"BrtBeginSXPIs" },
  26291. 0x0124: { n:"BrtEndSXPIs" },
  26292. 0x0125: { n:"BrtBeginSXDI" },
  26293. 0x0126: { n:"BrtEndSXDI" },
  26294. 0x0127: { n:"BrtBeginSXDIs" },
  26295. 0x0128: { n:"BrtEndSXDIs" },
  26296. 0x0129: { n:"BrtBeginSXLI" },
  26297. 0x012A: { n:"BrtEndSXLI" },
  26298. 0x012B: { n:"BrtBeginSXLIRws" },
  26299. 0x012C: { n:"BrtEndSXLIRws" },
  26300. 0x012D: { n:"BrtBeginSXLICols" },
  26301. 0x012E: { n:"BrtEndSXLICols" },
  26302. 0x012F: { n:"BrtBeginSXFormat" },
  26303. 0x0130: { n:"BrtEndSXFormat" },
  26304. 0x0131: { n:"BrtBeginSXFormats" },
  26305. 0x0132: { n:"BrtEndSxFormats" },
  26306. 0x0133: { n:"BrtBeginSxSelect" },
  26307. 0x0134: { n:"BrtEndSxSelect" },
  26308. 0x0135: { n:"BrtBeginISXVDRws" },
  26309. 0x0136: { n:"BrtEndISXVDRws" },
  26310. 0x0137: { n:"BrtBeginISXVDCols" },
  26311. 0x0138: { n:"BrtEndISXVDCols" },
  26312. 0x0139: { n:"BrtEndSXLocation" },
  26313. 0x013A: { n:"BrtBeginSXLocation" },
  26314. 0x013B: { n:"BrtEndSXView" },
  26315. 0x013C: { n:"BrtBeginSXTHs" },
  26316. 0x013D: { n:"BrtEndSXTHs" },
  26317. 0x013E: { n:"BrtBeginSXTH" },
  26318. 0x013F: { n:"BrtEndSXTH" },
  26319. 0x0140: { n:"BrtBeginISXTHRws" },
  26320. 0x0141: { n:"BrtEndISXTHRws" },
  26321. 0x0142: { n:"BrtBeginISXTHCols" },
  26322. 0x0143: { n:"BrtEndISXTHCols" },
  26323. 0x0144: { n:"BrtBeginSXTDMPS" },
  26324. 0x0145: { n:"BrtEndSXTDMPs" },
  26325. 0x0146: { n:"BrtBeginSXTDMP" },
  26326. 0x0147: { n:"BrtEndSXTDMP" },
  26327. 0x0148: { n:"BrtBeginSXTHItems" },
  26328. 0x0149: { n:"BrtEndSXTHItems" },
  26329. 0x014A: { n:"BrtBeginSXTHItem" },
  26330. 0x014B: { n:"BrtEndSXTHItem" },
  26331. 0x014C: { n:"BrtBeginMetadata" },
  26332. 0x014D: { n:"BrtEndMetadata" },
  26333. 0x014E: { n:"BrtBeginEsmdtinfo" },
  26334. 0x014F: { n:"BrtMdtinfo" },
  26335. 0x0150: { n:"BrtEndEsmdtinfo" },
  26336. 0x0151: { n:"BrtBeginEsmdb" },
  26337. 0x0152: { n:"BrtEndEsmdb" },
  26338. 0x0153: { n:"BrtBeginEsfmd" },
  26339. 0x0154: { n:"BrtEndEsfmd" },
  26340. 0x0155: { n:"BrtBeginSingleCells" },
  26341. 0x0156: { n:"BrtEndSingleCells" },
  26342. 0x0157: { n:"BrtBeginList" },
  26343. 0x0158: { n:"BrtEndList" },
  26344. 0x0159: { n:"BrtBeginListCols" },
  26345. 0x015A: { n:"BrtEndListCols" },
  26346. 0x015B: { n:"BrtBeginListCol" },
  26347. 0x015C: { n:"BrtEndListCol" },
  26348. 0x015D: { n:"BrtBeginListXmlCPr" },
  26349. 0x015E: { n:"BrtEndListXmlCPr" },
  26350. 0x015F: { n:"BrtListCCFmla" },
  26351. 0x0160: { n:"BrtListTrFmla" },
  26352. 0x0161: { n:"BrtBeginExternals" },
  26353. 0x0162: { n:"BrtEndExternals" },
  26354. 0x0163: { n:"BrtSupBookSrc", f:parse_RelID},
  26355. 0x0165: { n:"BrtSupSelf" },
  26356. 0x0166: { n:"BrtSupSame" },
  26357. 0x0167: { n:"BrtSupTabs" },
  26358. 0x0168: { n:"BrtBeginSupBook" },
  26359. 0x0169: { n:"BrtPlaceholderName" },
  26360. 0x016A: { n:"BrtExternSheet", f:parse_ExternSheet },
  26361. 0x016B: { n:"BrtExternTableStart" },
  26362. 0x016C: { n:"BrtExternTableEnd" },
  26363. 0x016E: { n:"BrtExternRowHdr" },
  26364. 0x016F: { n:"BrtExternCellBlank" },
  26365. 0x0170: { n:"BrtExternCellReal" },
  26366. 0x0171: { n:"BrtExternCellBool" },
  26367. 0x0172: { n:"BrtExternCellError" },
  26368. 0x0173: { n:"BrtExternCellString" },
  26369. 0x0174: { n:"BrtBeginEsmdx" },
  26370. 0x0175: { n:"BrtEndEsmdx" },
  26371. 0x0176: { n:"BrtBeginMdxSet" },
  26372. 0x0177: { n:"BrtEndMdxSet" },
  26373. 0x0178: { n:"BrtBeginMdxMbrProp" },
  26374. 0x0179: { n:"BrtEndMdxMbrProp" },
  26375. 0x017A: { n:"BrtBeginMdxKPI" },
  26376. 0x017B: { n:"BrtEndMdxKPI" },
  26377. 0x017C: { n:"BrtBeginEsstr" },
  26378. 0x017D: { n:"BrtEndEsstr" },
  26379. 0x017E: { n:"BrtBeginPRFItem" },
  26380. 0x017F: { n:"BrtEndPRFItem" },
  26381. 0x0180: { n:"BrtBeginPivotCacheIDs" },
  26382. 0x0181: { n:"BrtEndPivotCacheIDs" },
  26383. 0x0182: { n:"BrtBeginPivotCacheID" },
  26384. 0x0183: { n:"BrtEndPivotCacheID" },
  26385. 0x0184: { n:"BrtBeginISXVIs" },
  26386. 0x0185: { n:"BrtEndISXVIs" },
  26387. 0x0186: { n:"BrtBeginColInfos" },
  26388. 0x0187: { n:"BrtEndColInfos" },
  26389. 0x0188: { n:"BrtBeginRwBrk" },
  26390. 0x0189: { n:"BrtEndRwBrk" },
  26391. 0x018A: { n:"BrtBeginColBrk" },
  26392. 0x018B: { n:"BrtEndColBrk" },
  26393. 0x018C: { n:"BrtBrk" },
  26394. 0x018D: { n:"BrtUserBookView" },
  26395. 0x018E: { n:"BrtInfo" },
  26396. 0x018F: { n:"BrtCUsr" },
  26397. 0x0190: { n:"BrtUsr" },
  26398. 0x0191: { n:"BrtBeginUsers" },
  26399. 0x0193: { n:"BrtEOF" },
  26400. 0x0194: { n:"BrtUCR" },
  26401. 0x0195: { n:"BrtRRInsDel" },
  26402. 0x0196: { n:"BrtRREndInsDel" },
  26403. 0x0197: { n:"BrtRRMove" },
  26404. 0x0198: { n:"BrtRREndMove" },
  26405. 0x0199: { n:"BrtRRChgCell" },
  26406. 0x019A: { n:"BrtRREndChgCell" },
  26407. 0x019B: { n:"BrtRRHeader" },
  26408. 0x019C: { n:"BrtRRUserView" },
  26409. 0x019D: { n:"BrtRRRenSheet" },
  26410. 0x019E: { n:"BrtRRInsertSh" },
  26411. 0x019F: { n:"BrtRRDefName" },
  26412. 0x01A0: { n:"BrtRRNote" },
  26413. 0x01A1: { n:"BrtRRConflict" },
  26414. 0x01A2: { n:"BrtRRTQSIF" },
  26415. 0x01A3: { n:"BrtRRFormat" },
  26416. 0x01A4: { n:"BrtRREndFormat" },
  26417. 0x01A5: { n:"BrtRRAutoFmt" },
  26418. 0x01A6: { n:"BrtBeginUserShViews" },
  26419. 0x01A7: { n:"BrtBeginUserShView" },
  26420. 0x01A8: { n:"BrtEndUserShView" },
  26421. 0x01A9: { n:"BrtEndUserShViews" },
  26422. 0x01AA: { n:"BrtArrFmla", f:parse_BrtArrFmla },
  26423. 0x01AB: { n:"BrtShrFmla", f:parse_BrtShrFmla },
  26424. 0x01AC: { n:"BrtTable" },
  26425. 0x01AD: { n:"BrtBeginExtConnections" },
  26426. 0x01AE: { n:"BrtEndExtConnections" },
  26427. 0x01AF: { n:"BrtBeginPCDCalcMems" },
  26428. 0x01B0: { n:"BrtEndPCDCalcMems" },
  26429. 0x01B1: { n:"BrtBeginPCDCalcMem" },
  26430. 0x01B2: { n:"BrtEndPCDCalcMem" },
  26431. 0x01B3: { n:"BrtBeginPCDHGLevels" },
  26432. 0x01B4: { n:"BrtEndPCDHGLevels" },
  26433. 0x01B5: { n:"BrtBeginPCDHGLevel" },
  26434. 0x01B6: { n:"BrtEndPCDHGLevel" },
  26435. 0x01B7: { n:"BrtBeginPCDHGLGroups" },
  26436. 0x01B8: { n:"BrtEndPCDHGLGroups" },
  26437. 0x01B9: { n:"BrtBeginPCDHGLGroup" },
  26438. 0x01BA: { n:"BrtEndPCDHGLGroup" },
  26439. 0x01BB: { n:"BrtBeginPCDHGLGMembers" },
  26440. 0x01BC: { n:"BrtEndPCDHGLGMembers" },
  26441. 0x01BD: { n:"BrtBeginPCDHGLGMember" },
  26442. 0x01BE: { n:"BrtEndPCDHGLGMember" },
  26443. 0x01BF: { n:"BrtBeginQSI" },
  26444. 0x01C0: { n:"BrtEndQSI" },
  26445. 0x01C1: { n:"BrtBeginQSIR" },
  26446. 0x01C2: { n:"BrtEndQSIR" },
  26447. 0x01C3: { n:"BrtBeginDeletedNames" },
  26448. 0x01C4: { n:"BrtEndDeletedNames" },
  26449. 0x01C5: { n:"BrtBeginDeletedName" },
  26450. 0x01C6: { n:"BrtEndDeletedName" },
  26451. 0x01C7: { n:"BrtBeginQSIFs" },
  26452. 0x01C8: { n:"BrtEndQSIFs" },
  26453. 0x01C9: { n:"BrtBeginQSIF" },
  26454. 0x01CA: { n:"BrtEndQSIF" },
  26455. 0x01CB: { n:"BrtBeginAutoSortScope" },
  26456. 0x01CC: { n:"BrtEndAutoSortScope" },
  26457. 0x01CD: { n:"BrtBeginConditionalFormatting" },
  26458. 0x01CE: { n:"BrtEndConditionalFormatting" },
  26459. 0x01CF: { n:"BrtBeginCFRule" },
  26460. 0x01D0: { n:"BrtEndCFRule" },
  26461. 0x01D1: { n:"BrtBeginIconSet" },
  26462. 0x01D2: { n:"BrtEndIconSet" },
  26463. 0x01D3: { n:"BrtBeginDatabar" },
  26464. 0x01D4: { n:"BrtEndDatabar" },
  26465. 0x01D5: { n:"BrtBeginColorScale" },
  26466. 0x01D6: { n:"BrtEndColorScale" },
  26467. 0x01D7: { n:"BrtCFVO" },
  26468. 0x01D8: { n:"BrtExternValueMeta" },
  26469. 0x01D9: { n:"BrtBeginColorPalette" },
  26470. 0x01DA: { n:"BrtEndColorPalette" },
  26471. 0x01DB: { n:"BrtIndexedColor" },
  26472. 0x01DC: { n:"BrtMargins", f:parse_BrtMargins },
  26473. 0x01DD: { n:"BrtPrintOptions" },
  26474. 0x01DE: { n:"BrtPageSetup" },
  26475. 0x01DF: { n:"BrtBeginHeaderFooter" },
  26476. 0x01E0: { n:"BrtEndHeaderFooter" },
  26477. 0x01E1: { n:"BrtBeginSXCrtFormat" },
  26478. 0x01E2: { n:"BrtEndSXCrtFormat" },
  26479. 0x01E3: { n:"BrtBeginSXCrtFormats" },
  26480. 0x01E4: { n:"BrtEndSXCrtFormats" },
  26481. 0x01E5: { n:"BrtWsFmtInfo", f:parse_BrtWsFmtInfo },
  26482. 0x01E6: { n:"BrtBeginMgs" },
  26483. 0x01E7: { n:"BrtEndMGs" },
  26484. 0x01E8: { n:"BrtBeginMGMaps" },
  26485. 0x01E9: { n:"BrtEndMGMaps" },
  26486. 0x01EA: { n:"BrtBeginMG" },
  26487. 0x01EB: { n:"BrtEndMG" },
  26488. 0x01EC: { n:"BrtBeginMap" },
  26489. 0x01ED: { n:"BrtEndMap" },
  26490. 0x01EE: { n:"BrtHLink", f:parse_BrtHLink },
  26491. 0x01EF: { n:"BrtBeginDCon" },
  26492. 0x01F0: { n:"BrtEndDCon" },
  26493. 0x01F1: { n:"BrtBeginDRefs" },
  26494. 0x01F2: { n:"BrtEndDRefs" },
  26495. 0x01F3: { n:"BrtDRef" },
  26496. 0x01F4: { n:"BrtBeginScenMan" },
  26497. 0x01F5: { n:"BrtEndScenMan" },
  26498. 0x01F6: { n:"BrtBeginSct" },
  26499. 0x01F7: { n:"BrtEndSct" },
  26500. 0x01F8: { n:"BrtSlc" },
  26501. 0x01F9: { n:"BrtBeginDXFs" },
  26502. 0x01FA: { n:"BrtEndDXFs" },
  26503. 0x01FB: { n:"BrtDXF" },
  26504. 0x01FC: { n:"BrtBeginTableStyles" },
  26505. 0x01FD: { n:"BrtEndTableStyles" },
  26506. 0x01FE: { n:"BrtBeginTableStyle" },
  26507. 0x01FF: { n:"BrtEndTableStyle" },
  26508. 0x0200: { n:"BrtTableStyleElement" },
  26509. 0x0201: { n:"BrtTableStyleClient" },
  26510. 0x0202: { n:"BrtBeginVolDeps" },
  26511. 0x0203: { n:"BrtEndVolDeps" },
  26512. 0x0204: { n:"BrtBeginVolType" },
  26513. 0x0205: { n:"BrtEndVolType" },
  26514. 0x0206: { n:"BrtBeginVolMain" },
  26515. 0x0207: { n:"BrtEndVolMain" },
  26516. 0x0208: { n:"BrtBeginVolTopic" },
  26517. 0x0209: { n:"BrtEndVolTopic" },
  26518. 0x020A: { n:"BrtVolSubtopic" },
  26519. 0x020B: { n:"BrtVolRef" },
  26520. 0x020C: { n:"BrtVolNum" },
  26521. 0x020D: { n:"BrtVolErr" },
  26522. 0x020E: { n:"BrtVolStr" },
  26523. 0x020F: { n:"BrtVolBool" },
  26524. 0x0210: { n:"BrtBeginCalcChain$" },
  26525. 0x0211: { n:"BrtEndCalcChain$" },
  26526. 0x0212: { n:"BrtBeginSortState" },
  26527. 0x0213: { n:"BrtEndSortState" },
  26528. 0x0214: { n:"BrtBeginSortCond" },
  26529. 0x0215: { n:"BrtEndSortCond" },
  26530. 0x0216: { n:"BrtBookProtection" },
  26531. 0x0217: { n:"BrtSheetProtection" },
  26532. 0x0218: { n:"BrtRangeProtection" },
  26533. 0x0219: { n:"BrtPhoneticInfo" },
  26534. 0x021A: { n:"BrtBeginECTxtWiz" },
  26535. 0x021B: { n:"BrtEndECTxtWiz" },
  26536. 0x021C: { n:"BrtBeginECTWFldInfoLst" },
  26537. 0x021D: { n:"BrtEndECTWFldInfoLst" },
  26538. 0x021E: { n:"BrtBeginECTwFldInfo" },
  26539. 0x0224: { n:"BrtFileSharing" },
  26540. 0x0225: { n:"BrtOleSize" },
  26541. 0x0226: { n:"BrtDrawing", f:parse_RelID },
  26542. 0x0227: { n:"BrtLegacyDrawing" },
  26543. 0x0228: { n:"BrtLegacyDrawingHF" },
  26544. 0x0229: { n:"BrtWebOpt" },
  26545. 0x022A: { n:"BrtBeginWebPubItems" },
  26546. 0x022B: { n:"BrtEndWebPubItems" },
  26547. 0x022C: { n:"BrtBeginWebPubItem" },
  26548. 0x022D: { n:"BrtEndWebPubItem" },
  26549. 0x022E: { n:"BrtBeginSXCondFmt" },
  26550. 0x022F: { n:"BrtEndSXCondFmt" },
  26551. 0x0230: { n:"BrtBeginSXCondFmts" },
  26552. 0x0231: { n:"BrtEndSXCondFmts" },
  26553. 0x0232: { n:"BrtBkHim" },
  26554. 0x0234: { n:"BrtColor" },
  26555. 0x0235: { n:"BrtBeginIndexedColors" },
  26556. 0x0236: { n:"BrtEndIndexedColors" },
  26557. 0x0239: { n:"BrtBeginMRUColors" },
  26558. 0x023A: { n:"BrtEndMRUColors" },
  26559. 0x023C: { n:"BrtMRUColor" },
  26560. 0x023D: { n:"BrtBeginDVals" },
  26561. 0x023E: { n:"BrtEndDVals" },
  26562. 0x0241: { n:"BrtSupNameStart" },
  26563. 0x0242: { n:"BrtSupNameValueStart" },
  26564. 0x0243: { n:"BrtSupNameValueEnd" },
  26565. 0x0244: { n:"BrtSupNameNum" },
  26566. 0x0245: { n:"BrtSupNameErr" },
  26567. 0x0246: { n:"BrtSupNameSt" },
  26568. 0x0247: { n:"BrtSupNameNil" },
  26569. 0x0248: { n:"BrtSupNameBool" },
  26570. 0x0249: { n:"BrtSupNameFmla" },
  26571. 0x024A: { n:"BrtSupNameBits" },
  26572. 0x024B: { n:"BrtSupNameEnd" },
  26573. 0x024C: { n:"BrtEndSupBook" },
  26574. 0x024D: { n:"BrtCellSmartTagProperty" },
  26575. 0x024E: { n:"BrtBeginCellSmartTag" },
  26576. 0x024F: { n:"BrtEndCellSmartTag" },
  26577. 0x0250: { n:"BrtBeginCellSmartTags" },
  26578. 0x0251: { n:"BrtEndCellSmartTags" },
  26579. 0x0252: { n:"BrtBeginSmartTags" },
  26580. 0x0253: { n:"BrtEndSmartTags" },
  26581. 0x0254: { n:"BrtSmartTagType" },
  26582. 0x0255: { n:"BrtBeginSmartTagTypes" },
  26583. 0x0256: { n:"BrtEndSmartTagTypes" },
  26584. 0x0257: { n:"BrtBeginSXFilters" },
  26585. 0x0258: { n:"BrtEndSXFilters" },
  26586. 0x0259: { n:"BrtBeginSXFILTER" },
  26587. 0x025A: { n:"BrtEndSXFilter" },
  26588. 0x025B: { n:"BrtBeginFills" },
  26589. 0x025C: { n:"BrtEndFills" },
  26590. 0x025D: { n:"BrtBeginCellWatches" },
  26591. 0x025E: { n:"BrtEndCellWatches" },
  26592. 0x025F: { n:"BrtCellWatch" },
  26593. 0x0260: { n:"BrtBeginCRErrs" },
  26594. 0x0261: { n:"BrtEndCRErrs" },
  26595. 0x0262: { n:"BrtCrashRecErr" },
  26596. 0x0263: { n:"BrtBeginFonts" },
  26597. 0x0264: { n:"BrtEndFonts" },
  26598. 0x0265: { n:"BrtBeginBorders" },
  26599. 0x0266: { n:"BrtEndBorders" },
  26600. 0x0267: { n:"BrtBeginFmts" },
  26601. 0x0268: { n:"BrtEndFmts" },
  26602. 0x0269: { n:"BrtBeginCellXFs" },
  26603. 0x026A: { n:"BrtEndCellXFs" },
  26604. 0x026B: { n:"BrtBeginStyles" },
  26605. 0x026C: { n:"BrtEndStyles" },
  26606. 0x0271: { n:"BrtBigName" },
  26607. 0x0272: { n:"BrtBeginCellStyleXFs" },
  26608. 0x0273: { n:"BrtEndCellStyleXFs" },
  26609. 0x0274: { n:"BrtBeginComments" },
  26610. 0x0275: { n:"BrtEndComments" },
  26611. 0x0276: { n:"BrtBeginCommentAuthors" },
  26612. 0x0277: { n:"BrtEndCommentAuthors" },
  26613. 0x0278: { n:"BrtCommentAuthor", f:parse_BrtCommentAuthor },
  26614. 0x0279: { n:"BrtBeginCommentList" },
  26615. 0x027A: { n:"BrtEndCommentList" },
  26616. 0x027B: { n:"BrtBeginComment", f:parse_BrtBeginComment},
  26617. 0x027C: { n:"BrtEndComment" },
  26618. 0x027D: { n:"BrtCommentText", f:parse_BrtCommentText },
  26619. 0x027E: { n:"BrtBeginOleObjects" },
  26620. 0x027F: { n:"BrtOleObject" },
  26621. 0x0280: { n:"BrtEndOleObjects" },
  26622. 0x0281: { n:"BrtBeginSxrules" },
  26623. 0x0282: { n:"BrtEndSxRules" },
  26624. 0x0283: { n:"BrtBeginActiveXControls" },
  26625. 0x0284: { n:"BrtActiveX" },
  26626. 0x0285: { n:"BrtEndActiveXControls" },
  26627. 0x0286: { n:"BrtBeginPCDSDTCEMembersSortBy" },
  26628. 0x0288: { n:"BrtBeginCellIgnoreECs" },
  26629. 0x0289: { n:"BrtCellIgnoreEC" },
  26630. 0x028A: { n:"BrtEndCellIgnoreECs" },
  26631. 0x028B: { n:"BrtCsProp", f:parse_BrtCsProp },
  26632. 0x028C: { n:"BrtCsPageSetup" },
  26633. 0x028D: { n:"BrtBeginUserCsViews" },
  26634. 0x028E: { n:"BrtEndUserCsViews" },
  26635. 0x028F: { n:"BrtBeginUserCsView" },
  26636. 0x0290: { n:"BrtEndUserCsView" },
  26637. 0x0291: { n:"BrtBeginPcdSFCIEntries" },
  26638. 0x0292: { n:"BrtEndPCDSFCIEntries" },
  26639. 0x0293: { n:"BrtPCDSFCIEntry" },
  26640. 0x0294: { n:"BrtBeginListParts" },
  26641. 0x0295: { n:"BrtListPart" },
  26642. 0x0296: { n:"BrtEndListParts" },
  26643. 0x0297: { n:"BrtSheetCalcProp" },
  26644. 0x0298: { n:"BrtBeginFnGroup" },
  26645. 0x0299: { n:"BrtFnGroup" },
  26646. 0x029A: { n:"BrtEndFnGroup" },
  26647. 0x029B: { n:"BrtSupAddin" },
  26648. 0x029C: { n:"BrtSXTDMPOrder" },
  26649. 0x029D: { n:"BrtCsProtection" },
  26650. 0x029F: { n:"BrtBeginWsSortMap" },
  26651. 0x02A0: { n:"BrtEndWsSortMap" },
  26652. 0x02A1: { n:"BrtBeginRRSort" },
  26653. 0x02A2: { n:"BrtEndRRSort" },
  26654. 0x02A3: { n:"BrtRRSortItem" },
  26655. 0x02A4: { n:"BrtFileSharingIso" },
  26656. 0x02A5: { n:"BrtBookProtectionIso" },
  26657. 0x02A6: { n:"BrtSheetProtectionIso" },
  26658. 0x02A7: { n:"BrtCsProtectionIso" },
  26659. 0x02A8: { n:"BrtRangeProtectionIso" },
  26660. 0x02A9: { n:"BrtDValList" },
  26661. 0x0400: { n:"BrtRwDescent" },
  26662. 0x0401: { n:"BrtKnownFonts" },
  26663. 0x0402: { n:"BrtBeginSXTupleSet" },
  26664. 0x0403: { n:"BrtEndSXTupleSet" },
  26665. 0x0404: { n:"BrtBeginSXTupleSetHeader" },
  26666. 0x0405: { n:"BrtEndSXTupleSetHeader" },
  26667. 0x0406: { n:"BrtSXTupleSetHeaderItem" },
  26668. 0x0407: { n:"BrtBeginSXTupleSetData" },
  26669. 0x0408: { n:"BrtEndSXTupleSetData" },
  26670. 0x0409: { n:"BrtBeginSXTupleSetRow" },
  26671. 0x040A: { n:"BrtEndSXTupleSetRow" },
  26672. 0x040B: { n:"BrtSXTupleSetRowItem" },
  26673. 0x040C: { n:"BrtNameExt" },
  26674. 0x040D: { n:"BrtPCDH14" },
  26675. 0x040E: { n:"BrtBeginPCDCalcMem14" },
  26676. 0x040F: { n:"BrtEndPCDCalcMem14" },
  26677. 0x0410: { n:"BrtSXTH14" },
  26678. 0x0411: { n:"BrtBeginSparklineGroup" },
  26679. 0x0412: { n:"BrtEndSparklineGroup" },
  26680. 0x0413: { n:"BrtSparkline" },
  26681. 0x0414: { n:"BrtSXDI14" },
  26682. 0x0415: { n:"BrtWsFmtInfoEx14" },
  26683. 0x0416: { n:"BrtBeginConditionalFormatting14" },
  26684. 0x0417: { n:"BrtEndConditionalFormatting14" },
  26685. 0x0418: { n:"BrtBeginCFRule14" },
  26686. 0x0419: { n:"BrtEndCFRule14" },
  26687. 0x041A: { n:"BrtCFVO14" },
  26688. 0x041B: { n:"BrtBeginDatabar14" },
  26689. 0x041C: { n:"BrtBeginIconSet14" },
  26690. 0x041D: { n:"BrtDVal14", f: parse_BrtDVal14 },
  26691. 0x041E: { n:"BrtBeginDVals14" },
  26692. 0x041F: { n:"BrtColor14" },
  26693. 0x0420: { n:"BrtBeginSparklines" },
  26694. 0x0421: { n:"BrtEndSparklines" },
  26695. 0x0422: { n:"BrtBeginSparklineGroups" },
  26696. 0x0423: { n:"BrtEndSparklineGroups" },
  26697. 0x0425: { n:"BrtSXVD14" },
  26698. 0x0426: { n:"BrtBeginSXView14" },
  26699. 0x0427: { n:"BrtEndSXView14" },
  26700. 0x0428: { n:"BrtBeginSXView16" },
  26701. 0x0429: { n:"BrtEndSXView16" },
  26702. 0x042A: { n:"BrtBeginPCD14" },
  26703. 0x042B: { n:"BrtEndPCD14" },
  26704. 0x042C: { n:"BrtBeginExtConn14" },
  26705. 0x042D: { n:"BrtEndExtConn14" },
  26706. 0x042E: { n:"BrtBeginSlicerCacheIDs" },
  26707. 0x042F: { n:"BrtEndSlicerCacheIDs" },
  26708. 0x0430: { n:"BrtBeginSlicerCacheID" },
  26709. 0x0431: { n:"BrtEndSlicerCacheID" },
  26710. 0x0433: { n:"BrtBeginSlicerCache" },
  26711. 0x0434: { n:"BrtEndSlicerCache" },
  26712. 0x0435: { n:"BrtBeginSlicerCacheDef" },
  26713. 0x0436: { n:"BrtEndSlicerCacheDef" },
  26714. 0x0437: { n:"BrtBeginSlicersEx" },
  26715. 0x0438: { n:"BrtEndSlicersEx" },
  26716. 0x0439: { n:"BrtBeginSlicerEx" },
  26717. 0x043A: { n:"BrtEndSlicerEx" },
  26718. 0x043B: { n:"BrtBeginSlicer" },
  26719. 0x043C: { n:"BrtEndSlicer" },
  26720. 0x043D: { n:"BrtSlicerCachePivotTables" },
  26721. 0x043E: { n:"BrtBeginSlicerCacheOlapImpl" },
  26722. 0x043F: { n:"BrtEndSlicerCacheOlapImpl" },
  26723. 0x0440: { n:"BrtBeginSlicerCacheLevelsData" },
  26724. 0x0441: { n:"BrtEndSlicerCacheLevelsData" },
  26725. 0x0442: { n:"BrtBeginSlicerCacheLevelData" },
  26726. 0x0443: { n:"BrtEndSlicerCacheLevelData" },
  26727. 0x0444: { n:"BrtBeginSlicerCacheSiRanges" },
  26728. 0x0445: { n:"BrtEndSlicerCacheSiRanges" },
  26729. 0x0446: { n:"BrtBeginSlicerCacheSiRange" },
  26730. 0x0447: { n:"BrtEndSlicerCacheSiRange" },
  26731. 0x0448: { n:"BrtSlicerCacheOlapItem" },
  26732. 0x0449: { n:"BrtBeginSlicerCacheSelections" },
  26733. 0x044A: { n:"BrtSlicerCacheSelection" },
  26734. 0x044B: { n:"BrtEndSlicerCacheSelections" },
  26735. 0x044C: { n:"BrtBeginSlicerCacheNative" },
  26736. 0x044D: { n:"BrtEndSlicerCacheNative" },
  26737. 0x044E: { n:"BrtSlicerCacheNativeItem" },
  26738. 0x044F: { n:"BrtRangeProtection14" },
  26739. 0x0450: { n:"BrtRangeProtectionIso14" },
  26740. 0x0451: { n:"BrtCellIgnoreEC14" },
  26741. 0x0457: { n:"BrtList14" },
  26742. 0x0458: { n:"BrtCFIcon" },
  26743. 0x0459: { n:"BrtBeginSlicerCachesPivotCacheIDs" },
  26744. 0x045A: { n:"BrtEndSlicerCachesPivotCacheIDs" },
  26745. 0x045B: { n:"BrtBeginSlicers" },
  26746. 0x045C: { n:"BrtEndSlicers" },
  26747. 0x045D: { n:"BrtWbProp14" },
  26748. 0x045E: { n:"BrtBeginSXEdit" },
  26749. 0x045F: { n:"BrtEndSXEdit" },
  26750. 0x0460: { n:"BrtBeginSXEdits" },
  26751. 0x0461: { n:"BrtEndSXEdits" },
  26752. 0x0462: { n:"BrtBeginSXChange" },
  26753. 0x0463: { n:"BrtEndSXChange" },
  26754. 0x0464: { n:"BrtBeginSXChanges" },
  26755. 0x0465: { n:"BrtEndSXChanges" },
  26756. 0x0466: { n:"BrtSXTupleItems" },
  26757. 0x0468: { n:"BrtBeginSlicerStyle" },
  26758. 0x0469: { n:"BrtEndSlicerStyle" },
  26759. 0x046A: { n:"BrtSlicerStyleElement" },
  26760. 0x046B: { n:"BrtBeginStyleSheetExt14" },
  26761. 0x046C: { n:"BrtEndStyleSheetExt14" },
  26762. 0x046D: { n:"BrtBeginSlicerCachesPivotCacheID" },
  26763. 0x046E: { n:"BrtEndSlicerCachesPivotCacheID" },
  26764. 0x046F: { n:"BrtBeginConditionalFormattings" },
  26765. 0x0470: { n:"BrtEndConditionalFormattings" },
  26766. 0x0471: { n:"BrtBeginPCDCalcMemExt" },
  26767. 0x0472: { n:"BrtEndPCDCalcMemExt" },
  26768. 0x0473: { n:"BrtBeginPCDCalcMemsExt" },
  26769. 0x0474: { n:"BrtEndPCDCalcMemsExt" },
  26770. 0x0475: { n:"BrtPCDField14" },
  26771. 0x0476: { n:"BrtBeginSlicerStyles" },
  26772. 0x0477: { n:"BrtEndSlicerStyles" },
  26773. 0x0478: { n:"BrtBeginSlicerStyleElements" },
  26774. 0x0479: { n:"BrtEndSlicerStyleElements" },
  26775. 0x047A: { n:"BrtCFRuleExt" },
  26776. 0x047B: { n:"BrtBeginSXCondFmt14" },
  26777. 0x047C: { n:"BrtEndSXCondFmt14" },
  26778. 0x047D: { n:"BrtBeginSXCondFmts14" },
  26779. 0x047E: { n:"BrtEndSXCondFmts14" },
  26780. 0x0480: { n:"BrtBeginSortCond14" },
  26781. 0x0481: { n:"BrtEndSortCond14" },
  26782. 0x0482: { n:"BrtEndDVals14" },
  26783. 0x0483: { n:"BrtEndIconSet14" },
  26784. 0x0484: { n:"BrtEndDatabar14" },
  26785. 0x0485: { n:"BrtBeginColorScale14" },
  26786. 0x0486: { n:"BrtEndColorScale14" },
  26787. 0x0487: { n:"BrtBeginSxrules14" },
  26788. 0x0488: { n:"BrtEndSxrules14" },
  26789. 0x0489: { n:"BrtBeginPRule14" },
  26790. 0x048A: { n:"BrtEndPRule14" },
  26791. 0x048B: { n:"BrtBeginPRFilters14" },
  26792. 0x048C: { n:"BrtEndPRFilters14" },
  26793. 0x048D: { n:"BrtBeginPRFilter14" },
  26794. 0x048E: { n:"BrtEndPRFilter14" },
  26795. 0x048F: { n:"BrtBeginPRFItem14" },
  26796. 0x0490: { n:"BrtEndPRFItem14" },
  26797. 0x0491: { n:"BrtBeginCellIgnoreECs14" },
  26798. 0x0492: { n:"BrtEndCellIgnoreECs14" },
  26799. 0x0493: { n:"BrtDxf14" },
  26800. 0x0494: { n:"BrtBeginDxF14s" },
  26801. 0x0495: { n:"BrtEndDxf14s" },
  26802. 0x0499: { n:"BrtFilter14" },
  26803. 0x049A: { n:"BrtBeginCustomFilters14" },
  26804. 0x049C: { n:"BrtCustomFilter14" },
  26805. 0x049D: { n:"BrtIconFilter14" },
  26806. 0x049E: { n:"BrtPivotCacheConnectionName" },
  26807. 0x0800: { n:"BrtBeginDecoupledPivotCacheIDs" },
  26808. 0x0801: { n:"BrtEndDecoupledPivotCacheIDs" },
  26809. 0x0802: { n:"BrtDecoupledPivotCacheID" },
  26810. 0x0803: { n:"BrtBeginPivotTableRefs" },
  26811. 0x0804: { n:"BrtEndPivotTableRefs" },
  26812. 0x0805: { n:"BrtPivotTableRef" },
  26813. 0x0806: { n:"BrtSlicerCacheBookPivotTables" },
  26814. 0x0807: { n:"BrtBeginSxvcells" },
  26815. 0x0808: { n:"BrtEndSxvcells" },
  26816. 0x0809: { n:"BrtBeginSxRow" },
  26817. 0x080A: { n:"BrtEndSxRow" },
  26818. 0x080C: { n:"BrtPcdCalcMem15" },
  26819. 0x0813: { n:"BrtQsi15" },
  26820. 0x0814: { n:"BrtBeginWebExtensions" },
  26821. 0x0815: { n:"BrtEndWebExtensions" },
  26822. 0x0816: { n:"BrtWebExtension" },
  26823. 0x0817: { n:"BrtAbsPath15" },
  26824. 0x0818: { n:"BrtBeginPivotTableUISettings" },
  26825. 0x0819: { n:"BrtEndPivotTableUISettings" },
  26826. 0x081B: { n:"BrtTableSlicerCacheIDs" },
  26827. 0x081C: { n:"BrtTableSlicerCacheID" },
  26828. 0x081D: { n:"BrtBeginTableSlicerCache" },
  26829. 0x081E: { n:"BrtEndTableSlicerCache" },
  26830. 0x081F: { n:"BrtSxFilter15" },
  26831. 0x0820: { n:"BrtBeginTimelineCachePivotCacheIDs" },
  26832. 0x0821: { n:"BrtEndTimelineCachePivotCacheIDs" },
  26833. 0x0822: { n:"BrtTimelineCachePivotCacheID" },
  26834. 0x0823: { n:"BrtBeginTimelineCacheIDs" },
  26835. 0x0824: { n:"BrtEndTimelineCacheIDs" },
  26836. 0x0825: { n:"BrtBeginTimelineCacheID" },
  26837. 0x0826: { n:"BrtEndTimelineCacheID" },
  26838. 0x0827: { n:"BrtBeginTimelinesEx" },
  26839. 0x0828: { n:"BrtEndTimelinesEx" },
  26840. 0x0829: { n:"BrtBeginTimelineEx" },
  26841. 0x082A: { n:"BrtEndTimelineEx" },
  26842. 0x082B: { n:"BrtWorkBookPr15" },
  26843. 0x082C: { n:"BrtPCDH15" },
  26844. 0x082D: { n:"BrtBeginTimelineStyle" },
  26845. 0x082E: { n:"BrtEndTimelineStyle" },
  26846. 0x082F: { n:"BrtTimelineStyleElement" },
  26847. 0x0830: { n:"BrtBeginTimelineStylesheetExt15" },
  26848. 0x0831: { n:"BrtEndTimelineStylesheetExt15" },
  26849. 0x0832: { n:"BrtBeginTimelineStyles" },
  26850. 0x0833: { n:"BrtEndTimelineStyles" },
  26851. 0x0834: { n:"BrtBeginTimelineStyleElements" },
  26852. 0x0835: { n:"BrtEndTimelineStyleElements" },
  26853. 0x0836: { n:"BrtDxf15" },
  26854. 0x0837: { n:"BrtBeginDxfs15" },
  26855. 0x0838: { n:"brtEndDxfs15" },
  26856. 0x0839: { n:"BrtSlicerCacheHideItemsWithNoData" },
  26857. 0x083A: { n:"BrtBeginItemUniqueNames" },
  26858. 0x083B: { n:"BrtEndItemUniqueNames" },
  26859. 0x083C: { n:"BrtItemUniqueName" },
  26860. 0x083D: { n:"BrtBeginExtConn15" },
  26861. 0x083E: { n:"BrtEndExtConn15" },
  26862. 0x083F: { n:"BrtBeginOledbPr15" },
  26863. 0x0840: { n:"BrtEndOledbPr15" },
  26864. 0x0841: { n:"BrtBeginDataFeedPr15" },
  26865. 0x0842: { n:"BrtEndDataFeedPr15" },
  26866. 0x0843: { n:"BrtTextPr15" },
  26867. 0x0844: { n:"BrtRangePr15" },
  26868. 0x0845: { n:"BrtDbCommand15" },
  26869. 0x0846: { n:"BrtBeginDbTables15" },
  26870. 0x0847: { n:"BrtEndDbTables15" },
  26871. 0x0848: { n:"BrtDbTable15" },
  26872. 0x0849: { n:"BrtBeginDataModel" },
  26873. 0x084A: { n:"BrtEndDataModel" },
  26874. 0x084B: { n:"BrtBeginModelTables" },
  26875. 0x084C: { n:"BrtEndModelTables" },
  26876. 0x084D: { n:"BrtModelTable" },
  26877. 0x084E: { n:"BrtBeginModelRelationships" },
  26878. 0x084F: { n:"BrtEndModelRelationships" },
  26879. 0x0850: { n:"BrtModelRelationship" },
  26880. 0x0851: { n:"BrtBeginECTxtWiz15" },
  26881. 0x0852: { n:"BrtEndECTxtWiz15" },
  26882. 0x0853: { n:"BrtBeginECTWFldInfoLst15" },
  26883. 0x0854: { n:"BrtEndECTWFldInfoLst15" },
  26884. 0x0855: { n:"BrtBeginECTWFldInfo15" },
  26885. 0x0856: { n:"BrtFieldListActiveItem" },
  26886. 0x0857: { n:"BrtPivotCacheIdVersion" },
  26887. 0x0858: { n:"BrtSXDI15" },
  26888. 0x0859: { n:"BrtBeginModelTimeGroupings" },
  26889. 0x085A: { n:"BrtEndModelTimeGroupings" },
  26890. 0x085B: { n:"BrtBeginModelTimeGrouping" },
  26891. 0x085C: { n:"BrtEndModelTimeGrouping" },
  26892. 0x085D: { n:"BrtModelTimeGroupingCalcCol" },
  26893. 0x0C00: { n:"BrtUid" },
  26894. 0x0C01: { n:"BrtRevisionPtr" },
  26895. 0x13e7: { n:"BrtBeginCalcFeatures" },
  26896. 0x13e8: { n:"BrtEndCalcFeatures" },
  26897. 0x13e9: { n:"BrtCalcFeature" },
  26898. 0xFFFF: { n:"" }
  26899. };
  26900. var XLSBRE = evert_key(XLSBRecordEnum, 'n');
  26901. XLSBRE["BrtFRTArchID$"] = 0x0010;
  26902. /* [MS-XLS] 2.3 Record Enumeration */
  26903. var XLSRecordEnum = {
  26904. 0x0003: { n:"BIFF2NUM", f:parse_BIFF2NUM },
  26905. 0x0004: { n:"BIFF2STR", f:parse_BIFF2STR },
  26906. 0x0006: { n:"Formula", f:parse_Formula },
  26907. 0x0009: { n:'BOF', f:parse_BOF },
  26908. 0x000a: { n:'EOF', f:parsenoop2 },
  26909. 0x000c: { n:"CalcCount", f:parseuint16 },
  26910. 0x000d: { n:"CalcMode", f:parseuint16 },
  26911. 0x000e: { n:"CalcPrecision", f:parsebool },
  26912. 0x000f: { n:"CalcRefMode", f:parsebool },
  26913. 0x0010: { n:"CalcDelta", f:parse_Xnum },
  26914. 0x0011: { n:"CalcIter", f:parsebool },
  26915. 0x0012: { n:"Protect", f:parsebool },
  26916. 0x0013: { n:"Password", f:parseuint16 },
  26917. 0x0014: { n:"Header", f:parse_XLHeaderFooter },
  26918. 0x0015: { n:"Footer", f:parse_XLHeaderFooter },
  26919. 0x0017: { n:"ExternSheet", f:parse_ExternSheet },
  26920. 0x0018: { n:"Lbl", f:parse_Lbl },
  26921. 0x0019: { n:"WinProtect", f:parsebool },
  26922. 0x001a: { n:"VerticalPageBreaks" },
  26923. 0x001b: { n:"HorizontalPageBreaks" },
  26924. 0x001c: { n:"Note", f:parse_Note },
  26925. 0x001d: { n:"Selection" },
  26926. 0x0022: { n:"Date1904", f:parsebool },
  26927. 0x0023: { n:"ExternName", f:parse_ExternName },
  26928. 0x0024: { n:"COLWIDTH" },
  26929. 0x0026: { n:"LeftMargin", f:parse_Xnum },
  26930. 0x0027: { n:"RightMargin", f:parse_Xnum },
  26931. 0x0028: { n:"TopMargin", f:parse_Xnum },
  26932. 0x0029: { n:"BottomMargin", f:parse_Xnum },
  26933. 0x002a: { n:"PrintRowCol", f:parsebool },
  26934. 0x002b: { n:"PrintGrid", f:parsebool },
  26935. 0x002f: { n:"FilePass", f:parse_FilePass },
  26936. 0x0031: { n:"Font", f:parse_Font },
  26937. 0x0033: { n:"PrintSize", f:parseuint16 },
  26938. 0x003c: { n:"Continue" },
  26939. 0x003d: { n:"Window1", f:parse_Window1 },
  26940. 0x0040: { n:"Backup", f:parsebool },
  26941. 0x0041: { n:"Pane", f:parse_Pane },
  26942. 0x0042: { n:'CodePage', f:parseuint16 },
  26943. 0x004d: { n:"Pls" },
  26944. 0x0050: { n:"DCon" },
  26945. 0x0051: { n:"DConRef" },
  26946. 0x0052: { n:"DConName" },
  26947. 0x0055: { n:"DefColWidth", f:parseuint16 },
  26948. 0x0059: { n:"XCT" },
  26949. 0x005a: { n:"CRN" },
  26950. 0x005b: { n:"FileSharing" },
  26951. 0x005c: { n:'WriteAccess', f:parse_WriteAccess },
  26952. 0x005d: { n:"Obj", f:parse_Obj },
  26953. 0x005e: { n:"Uncalced" },
  26954. 0x005f: { n:"CalcSaveRecalc", f:parsebool },
  26955. 0x0060: { n:"Template" },
  26956. 0x0061: { n:"Intl" },
  26957. 0x0063: { n:"ObjProtect", f:parsebool },
  26958. 0x007d: { n:"ColInfo", f:parse_ColInfo },
  26959. 0x0080: { n:"Guts", f:parse_Guts },
  26960. 0x0081: { n:"WsBool", f:parse_WsBool },
  26961. 0x0082: { n:"GridSet", f:parseuint16 },
  26962. 0x0083: { n:"HCenter", f:parsebool },
  26963. 0x0084: { n:"VCenter", f:parsebool },
  26964. 0x0085: { n:'BoundSheet8', f:parse_BoundSheet8 },
  26965. 0x0086: { n:"WriteProtect" },
  26966. 0x008c: { n:"Country", f:parse_Country },
  26967. 0x008d: { n:"HideObj", f:parseuint16 },
  26968. 0x0090: { n:"Sort" },
  26969. 0x0092: { n:"Palette", f:parse_Palette },
  26970. 0x0097: { n:"Sync" },
  26971. 0x0098: { n:"LPr" },
  26972. 0x0099: { n:"DxGCol" },
  26973. 0x009a: { n:"FnGroupName" },
  26974. 0x009b: { n:"FilterMode" },
  26975. 0x009c: { n:"BuiltInFnGroupCount", f:parseuint16 },
  26976. 0x009d: { n:"AutoFilterInfo" },
  26977. 0x009e: { n:"AutoFilter" },
  26978. 0x00a0: { n:"Scl", f:parse_Scl },
  26979. 0x00a1: { n:"Setup", f:parse_Setup },
  26980. 0x00ae: { n:"ScenMan" },
  26981. 0x00af: { n:"SCENARIO" },
  26982. 0x00b0: { n:"SxView" },
  26983. 0x00b1: { n:"Sxvd" },
  26984. 0x00b2: { n:"SXVI" },
  26985. 0x00b4: { n:"SxIvd" },
  26986. 0x00b5: { n:"SXLI" },
  26987. 0x00b6: { n:"SXPI" },
  26988. 0x00b8: { n:"DocRoute" },
  26989. 0x00b9: { n:"RecipName" },
  26990. 0x00bd: { n:"MulRk", f:parse_MulRk },
  26991. 0x00be: { n:"MulBlank", f:parse_MulBlank },
  26992. 0x00c1: { n:'Mms', f:parsenoop2 },
  26993. 0x00c5: { n:"SXDI" },
  26994. 0x00c6: { n:"SXDB" },
  26995. 0x00c7: { n:"SXFDB" },
  26996. 0x00c8: { n:"SXDBB" },
  26997. 0x00c9: { n:"SXNum" },
  26998. 0x00ca: { n:"SxBool", f:parsebool },
  26999. 0x00cb: { n:"SxErr" },
  27000. 0x00cc: { n:"SXInt" },
  27001. 0x00cd: { n:"SXString" },
  27002. 0x00ce: { n:"SXDtr" },
  27003. 0x00cf: { n:"SxNil" },
  27004. 0x00d0: { n:"SXTbl" },
  27005. 0x00d1: { n:"SXTBRGIITM" },
  27006. 0x00d2: { n:"SxTbpg" },
  27007. 0x00d3: { n:"ObProj" },
  27008. 0x00d5: { n:"SXStreamID" },
  27009. 0x00d7: { n:"DBCell" },
  27010. 0x00d8: { n:"SXRng" },
  27011. 0x00d9: { n:"SxIsxoper" },
  27012. 0x00da: { n:"BookBool", f:parseuint16 },
  27013. 0x00dc: { n:"DbOrParamQry" },
  27014. 0x00dd: { n:"ScenarioProtect", f:parsebool },
  27015. 0x00de: { n:"OleObjectSize" },
  27016. 0x00e0: { n:"XF", f:parse_XF },
  27017. 0x00e1: { n:'InterfaceHdr', f:parse_InterfaceHdr },
  27018. 0x00e2: { n:'InterfaceEnd', f:parsenoop2 },
  27019. 0x00e3: { n:"SXVS" },
  27020. 0x00e5: { n:"MergeCells", f:parse_MergeCells },
  27021. 0x00e9: { n:"BkHim" },
  27022. 0x00eb: { n:"MsoDrawingGroup" },
  27023. 0x00ec: { n:"MsoDrawing" },
  27024. 0x00ed: { n:"MsoDrawingSelection" },
  27025. 0x00ef: { n:"PhoneticInfo" },
  27026. 0x00f0: { n:"SxRule" },
  27027. 0x00f1: { n:"SXEx" },
  27028. 0x00f2: { n:"SxFilt" },
  27029. 0x00f4: { n:"SxDXF" },
  27030. 0x00f5: { n:"SxItm" },
  27031. 0x00f6: { n:"SxName" },
  27032. 0x00f7: { n:"SxSelect" },
  27033. 0x00f8: { n:"SXPair" },
  27034. 0x00f9: { n:"SxFmla" },
  27035. 0x00fb: { n:"SxFormat" },
  27036. 0x00fc: { n:"SST", f:parse_SST },
  27037. 0x00fd: { n:"LabelSst", f:parse_LabelSst },
  27038. 0x00ff: { n:"ExtSST", f:parse_ExtSST },
  27039. 0x0100: { n:"SXVDEx" },
  27040. 0x0103: { n:"SXFormula" },
  27041. 0x0122: { n:"SXDBEx" },
  27042. 0x0137: { n:"RRDInsDel" },
  27043. 0x0138: { n:"RRDHead" },
  27044. 0x013b: { n:"RRDChgCell" },
  27045. 0x013d: { n:"RRTabId", f:parseuint16a },
  27046. 0x013e: { n:"RRDRenSheet" },
  27047. 0x013f: { n:"RRSort" },
  27048. 0x0140: { n:"RRDMove" },
  27049. 0x014a: { n:"RRFormat" },
  27050. 0x014b: { n:"RRAutoFmt" },
  27051. 0x014d: { n:"RRInsertSh" },
  27052. 0x014e: { n:"RRDMoveBegin" },
  27053. 0x014f: { n:"RRDMoveEnd" },
  27054. 0x0150: { n:"RRDInsDelBegin" },
  27055. 0x0151: { n:"RRDInsDelEnd" },
  27056. 0x0152: { n:"RRDConflict" },
  27057. 0x0153: { n:"RRDDefName" },
  27058. 0x0154: { n:"RRDRstEtxp" },
  27059. 0x015f: { n:"LRng" },
  27060. 0x0160: { n:"UsesELFs", f:parsebool },
  27061. 0x0161: { n:"DSF", f:parsenoop2 },
  27062. 0x0191: { n:"CUsr" },
  27063. 0x0192: { n:"CbUsr" },
  27064. 0x0193: { n:"UsrInfo" },
  27065. 0x0194: { n:"UsrExcl" },
  27066. 0x0195: { n:"FileLock" },
  27067. 0x0196: { n:"RRDInfo" },
  27068. 0x0197: { n:"BCUsrs" },
  27069. 0x0198: { n:"UsrChk" },
  27070. 0x01a9: { n:"UserBView" },
  27071. 0x01aa: { n:"UserSViewBegin" },
  27072. 0x01ab: { n:"UserSViewEnd" },
  27073. 0x01ac: { n:"RRDUserView" },
  27074. 0x01ad: { n:"Qsi" },
  27075. 0x01ae: { n:"SupBook", f:parse_SupBook },
  27076. 0x01af: { n:"Prot4Rev", f:parsebool },
  27077. 0x01b0: { n:"CondFmt" },
  27078. 0x01b1: { n:"CF" },
  27079. 0x01b2: { n:"DVal" },
  27080. 0x01b5: { n:"DConBin" },
  27081. 0x01b6: { n:"TxO", f:parse_TxO },
  27082. 0x01b7: { n:"RefreshAll", f:parsebool },
  27083. 0x01b8: { n:"HLink", f:parse_HLink },
  27084. 0x01b9: { n:"Lel" },
  27085. 0x01ba: { n:"CodeName", f:parse_XLUnicodeString },
  27086. 0x01bb: { n:"SXFDBType" },
  27087. 0x01bc: { n:"Prot4RevPass", f:parseuint16 },
  27088. 0x01bd: { n:"ObNoMacros" },
  27089. 0x01be: { n:"Dv" },
  27090. 0x01c0: { n:"Excel9File", f:parsenoop2 },
  27091. 0x01c1: { n:"RecalcId", f:parse_RecalcId, r:2},
  27092. 0x01c2: { n:"EntExU2", f:parsenoop2 },
  27093. 0x0200: { n:"Dimensions", f:parse_Dimensions },
  27094. 0x0201: { n:"Blank", f:parse_Blank },
  27095. 0x0203: { n:"Number", f:parse_Number },
  27096. 0x0204: { n:"Label", f:parse_Label },
  27097. 0x0205: { n:"BoolErr", f:parse_BoolErr },
  27098. 0x0206: { n:"Formula", f:parse_Formula },
  27099. 0x0207: { n:"String", f:parse_String },
  27100. 0x0208: { n:'Row', f:parse_Row },
  27101. 0x020b: { n:"Index" },
  27102. 0x0221: { n:"Array", f:parse_Array },
  27103. 0x0225: { n:"DefaultRowHeight", f:parse_DefaultRowHeight },
  27104. 0x0236: { n:"Table" },
  27105. 0x023e: { n:"Window2", f:parse_Window2 },
  27106. 0x027e: { n:"RK", f:parse_RK },
  27107. 0x0293: { n:"Style" },
  27108. 0x0406: { n:"Formula", f:parse_Formula },
  27109. 0x0418: { n:"BigName" },
  27110. 0x041e: { n:"Format", f:parse_Format },
  27111. 0x043c: { n:"ContinueBigName" },
  27112. 0x04bc: { n:"ShrFmla", f:parse_ShrFmla },
  27113. 0x0800: { n:"HLinkTooltip", f:parse_HLinkTooltip },
  27114. 0x0801: { n:"WebPub" },
  27115. 0x0802: { n:"QsiSXTag" },
  27116. 0x0803: { n:"DBQueryExt" },
  27117. 0x0804: { n:"ExtString" },
  27118. 0x0805: { n:"TxtQry" },
  27119. 0x0806: { n:"Qsir" },
  27120. 0x0807: { n:"Qsif" },
  27121. 0x0808: { n:"RRDTQSIF" },
  27122. 0x0809: { n:'BOF', f:parse_BOF },
  27123. 0x080a: { n:"OleDbConn" },
  27124. 0x080b: { n:"WOpt" },
  27125. 0x080c: { n:"SXViewEx" },
  27126. 0x080d: { n:"SXTH" },
  27127. 0x080e: { n:"SXPIEx" },
  27128. 0x080f: { n:"SXVDTEx" },
  27129. 0x0810: { n:"SXViewEx9" },
  27130. 0x0812: { n:"ContinueFrt" },
  27131. 0x0813: { n:"RealTimeData" },
  27132. 0x0850: { n:"ChartFrtInfo" },
  27133. 0x0851: { n:"FrtWrapper" },
  27134. 0x0852: { n:"StartBlock" },
  27135. 0x0853: { n:"EndBlock" },
  27136. 0x0854: { n:"StartObject" },
  27137. 0x0855: { n:"EndObject" },
  27138. 0x0856: { n:"CatLab" },
  27139. 0x0857: { n:"YMult" },
  27140. 0x0858: { n:"SXViewLink" },
  27141. 0x0859: { n:"PivotChartBits" },
  27142. 0x085a: { n:"FrtFontList" },
  27143. 0x0862: { n:"SheetExt" },
  27144. 0x0863: { n:"BookExt", r:12},
  27145. 0x0864: { n:"SXAddl" },
  27146. 0x0865: { n:"CrErr" },
  27147. 0x0866: { n:"HFPicture" },
  27148. 0x0867: { n:'FeatHdr', f:parsenoop2 },
  27149. 0x0868: { n:"Feat" },
  27150. 0x086a: { n:"DataLabExt" },
  27151. 0x086b: { n:"DataLabExtContents" },
  27152. 0x086c: { n:"CellWatch" },
  27153. 0x0871: { n:"FeatHdr11" },
  27154. 0x0872: { n:"Feature11" },
  27155. 0x0874: { n:"DropDownObjIds" },
  27156. 0x0875: { n:"ContinueFrt11" },
  27157. 0x0876: { n:"DConn" },
  27158. 0x0877: { n:"List12" },
  27159. 0x0878: { n:"Feature12" },
  27160. 0x0879: { n:"CondFmt12" },
  27161. 0x087a: { n:"CF12" },
  27162. 0x087b: { n:"CFEx" },
  27163. 0x087c: { n:"XFCRC", f:parse_XFCRC, r:12 },
  27164. 0x087d: { n:"XFExt", f:parse_XFExt, r:12 },
  27165. 0x087e: { n:"AutoFilter12" },
  27166. 0x087f: { n:"ContinueFrt12" },
  27167. 0x0884: { n:"MDTInfo" },
  27168. 0x0885: { n:"MDXStr" },
  27169. 0x0886: { n:"MDXTuple" },
  27170. 0x0887: { n:"MDXSet" },
  27171. 0x0888: { n:"MDXProp" },
  27172. 0x0889: { n:"MDXKPI" },
  27173. 0x088a: { n:"MDB" },
  27174. 0x088b: { n:"PLV" },
  27175. 0x088c: { n:"Compat12", f:parsebool, r:12 },
  27176. 0x088d: { n:"DXF" },
  27177. 0x088e: { n:"TableStyles", r:12 },
  27178. 0x088f: { n:"TableStyle" },
  27179. 0x0890: { n:"TableStyleElement" },
  27180. 0x0892: { n:"StyleExt" },
  27181. 0x0893: { n:"NamePublish" },
  27182. 0x0894: { n:"NameCmt", f:parse_NameCmt, r:12 },
  27183. 0x0895: { n:"SortData" },
  27184. 0x0896: { n:"Theme", f:parse_Theme, r:12 },
  27185. 0x0897: { n:"GUIDTypeLib" },
  27186. 0x0898: { n:"FnGrp12" },
  27187. 0x0899: { n:"NameFnGrp12" },
  27188. 0x089a: { n:"MTRSettings", f:parse_MTRSettings, r:12 },
  27189. 0x089b: { n:"CompressPictures", f:parsenoop2 },
  27190. 0x089c: { n:"HeaderFooter" },
  27191. 0x089d: { n:"CrtLayout12" },
  27192. 0x089e: { n:"CrtMlFrt" },
  27193. 0x089f: { n:"CrtMlFrtContinue" },
  27194. 0x08a3: { n:"ForceFullCalculation", f:parse_ForceFullCalculation },
  27195. 0x08a4: { n:"ShapePropsStream" },
  27196. 0x08a5: { n:"TextPropsStream" },
  27197. 0x08a6: { n:"RichTextStream" },
  27198. 0x08a7: { n:"CrtLayout12A" },
  27199. 0x1001: { n:"Units" },
  27200. 0x1002: { n:"Chart" },
  27201. 0x1003: { n:"Series" },
  27202. 0x1006: { n:"DataFormat" },
  27203. 0x1007: { n:"LineFormat" },
  27204. 0x1009: { n:"MarkerFormat" },
  27205. 0x100a: { n:"AreaFormat" },
  27206. 0x100b: { n:"PieFormat" },
  27207. 0x100c: { n:"AttachedLabel" },
  27208. 0x100d: { n:"SeriesText" },
  27209. 0x1014: { n:"ChartFormat" },
  27210. 0x1015: { n:"Legend" },
  27211. 0x1016: { n:"SeriesList" },
  27212. 0x1017: { n:"Bar" },
  27213. 0x1018: { n:"Line" },
  27214. 0x1019: { n:"Pie" },
  27215. 0x101a: { n:"Area" },
  27216. 0x101b: { n:"Scatter" },
  27217. 0x101c: { n:"CrtLine" },
  27218. 0x101d: { n:"Axis" },
  27219. 0x101e: { n:"Tick" },
  27220. 0x101f: { n:"ValueRange" },
  27221. 0x1020: { n:"CatSerRange" },
  27222. 0x1021: { n:"AxisLine" },
  27223. 0x1022: { n:"CrtLink" },
  27224. 0x1024: { n:"DefaultText" },
  27225. 0x1025: { n:"Text" },
  27226. 0x1026: { n:"FontX", f:parseuint16 },
  27227. 0x1027: { n:"ObjectLink" },
  27228. 0x1032: { n:"Frame" },
  27229. 0x1033: { n:"Begin" },
  27230. 0x1034: { n:"End" },
  27231. 0x1035: { n:"PlotArea" },
  27232. 0x103a: { n:"Chart3d" },
  27233. 0x103c: { n:"PicF" },
  27234. 0x103d: { n:"DropBar" },
  27235. 0x103e: { n:"Radar" },
  27236. 0x103f: { n:"Surf" },
  27237. 0x1040: { n:"RadarArea" },
  27238. 0x1041: { n:"AxisParent" },
  27239. 0x1043: { n:"LegendException" },
  27240. 0x1044: { n:"ShtProps", f:parse_ShtProps },
  27241. 0x1045: { n:"SerToCrt" },
  27242. 0x1046: { n:"AxesUsed" },
  27243. 0x1048: { n:"SBaseRef" },
  27244. 0x104a: { n:"SerParent" },
  27245. 0x104b: { n:"SerAuxTrend" },
  27246. 0x104e: { n:"IFmtRecord" },
  27247. 0x104f: { n:"Pos" },
  27248. 0x1050: { n:"AlRuns" },
  27249. 0x1051: { n:"BRAI" },
  27250. 0x105b: { n:"SerAuxErrBar" },
  27251. 0x105c: { n:"ClrtClient", f:parse_ClrtClient },
  27252. 0x105d: { n:"SerFmt" },
  27253. 0x105f: { n:"Chart3DBarShape" },
  27254. 0x1060: { n:"Fbi" },
  27255. 0x1061: { n:"BopPop" },
  27256. 0x1062: { n:"AxcExt" },
  27257. 0x1063: { n:"Dat" },
  27258. 0x1064: { n:"PlotGrowth" },
  27259. 0x1065: { n:"SIIndex" },
  27260. 0x1066: { n:"GelFrame" },
  27261. 0x1067: { n:"BopPopCustom" },
  27262. 0x1068: { n:"Fbi2" },
  27263. 0x0000: { n:"Dimensions", f:parse_Dimensions },
  27264. 0x0002: { n:"BIFF2INT", f:parse_BIFF2INT },
  27265. 0x0005: { n:"BoolErr", f:parse_BoolErr },
  27266. 0x0007: { n:"String", f:parse_BIFF2STRING },
  27267. 0x0008: { n:"BIFF2ROW" },
  27268. 0x000b: { n:"Index" },
  27269. 0x0016: { n:"ExternCount", f:parseuint16 },
  27270. 0x001e: { n:"BIFF2FORMAT", f:parse_BIFF2Format },
  27271. 0x001f: { n:"BIFF2FMTCNT" }, /* 16-bit cnt of BIFF2FORMAT records */
  27272. 0x0020: { n:"BIFF2COLINFO" },
  27273. 0x0021: { n:"Array", f:parse_Array },
  27274. 0x0025: { n:"DefaultRowHeight", f:parse_DefaultRowHeight },
  27275. 0x0032: { n:"BIFF2FONTXTRA", f:parse_BIFF2FONTXTRA },
  27276. 0x0034: { n:"DDEObjName" },
  27277. 0x003e: { n:"BIFF2WINDOW2" },
  27278. 0x0043: { n:"BIFF2XF" },
  27279. 0x0045: { n:"BIFF2FONTCLR" },
  27280. 0x0056: { n:"BIFF4FMTCNT" }, /* 16-bit cnt, similar to BIFF2 */
  27281. 0x007e: { n:"RK" }, /* Not necessarily same as 0x027e */
  27282. 0x007f: { n:"ImData", f:parse_ImData },
  27283. 0x0087: { n:"Addin" },
  27284. 0x0088: { n:"Edg" },
  27285. 0x0089: { n:"Pub" },
  27286. 0x0091: { n:"Sub" },
  27287. 0x0094: { n:"LHRecord" },
  27288. 0x0095: { n:"LHNGraph" },
  27289. 0x0096: { n:"Sound" },
  27290. 0x00a9: { n:"CoordList" },
  27291. 0x00ab: { n:"GCW" },
  27292. 0x00bc: { n:"ShrFmla" }, /* Not necessarily same as 0x04bc */
  27293. 0x00bf: { n:"ToolbarHdr" },
  27294. 0x00c0: { n:"ToolbarEnd" },
  27295. 0x00c2: { n:"AddMenu" },
  27296. 0x00c3: { n:"DelMenu" },
  27297. 0x00d6: { n:"RString", f:parse_RString },
  27298. 0x00df: { n:"UDDesc" },
  27299. 0x00ea: { n:"TabIdConf" },
  27300. 0x0162: { n:"XL5Modify" },
  27301. 0x01a5: { n:"FileSharing2" },
  27302. 0x0209: { n:'BOF', f:parse_BOF },
  27303. 0x0218: { n:"Lbl", f:parse_Lbl },
  27304. 0x0223: { n:"ExternName", f:parse_ExternName },
  27305. 0x0231: { n:"Font" },
  27306. 0x0243: { n:"BIFF3XF" },
  27307. 0x0409: { n:'BOF', f:parse_BOF },
  27308. 0x0443: { n:"BIFF4XF" },
  27309. 0x086d: { n:"FeatInfo" },
  27310. 0x0873: { n:"FeatInfo11" },
  27311. 0x0881: { n:"SXAddl12" },
  27312. 0x08c0: { n:"AutoWebPub" },
  27313. 0x08c1: { n:"ListObj" },
  27314. 0x08c2: { n:"ListField" },
  27315. 0x08c3: { n:"ListDV" },
  27316. 0x08c4: { n:"ListCondFmt" },
  27317. 0x08c5: { n:"ListCF" },
  27318. 0x08c6: { n:"FMQry" },
  27319. 0x08c7: { n:"FMSQry" },
  27320. 0x08c8: { n:"PLV" },
  27321. 0x08c9: { n:"LnExt" },
  27322. 0x08ca: { n:"MkrExt" },
  27323. 0x08cb: { n:"CrtCoopt" },
  27324. 0x08d6: { n:"FRTArchId$", r:12 },
  27325. 0x7262: {}
  27326. };
  27327. var XLSRE = evert_key(XLSRecordEnum, 'n');
  27328. function write_biff_rec(ba, type, payload, length) {
  27329. var t = +type || +XLSRE[type];
  27330. if(isNaN(t)) return;
  27331. var len = length || (payload||[]).length || 0;
  27332. var o = ba.next(4);
  27333. o.write_shift(2, t);
  27334. o.write_shift(2, len);
  27335. if(len > 0 && is_buf(payload)) ba.push(payload);
  27336. }
  27337. function write_biff_continue(ba, type, payload, length) {
  27338. var len = length || (payload||[]).length || 0;
  27339. if(len <= 8224) return write_biff_rec(ba, type, payload, len);
  27340. var t = +type || +XLSRE[type];
  27341. if(isNaN(t)) return;
  27342. var parts = payload.parts || [], sidx = 0;
  27343. var i = 0, w = 0;
  27344. while(w + (parts[sidx] || 8224) <= 8224) { w+= (parts[sidx] || 8224); sidx++; }
  27345. var o = ba.next(4);
  27346. o.write_shift(2, t);
  27347. o.write_shift(2, w);
  27348. ba.push(payload.slice(i, i + w));
  27349. i += w;
  27350. while(i < len) {
  27351. o = ba.next(4);
  27352. o.write_shift(2, 0x3c); // TODO: figure out correct continue type
  27353. w = 0;
  27354. while(w + (parts[sidx] || 8224) <= 8224) { w+= (parts[sidx] || 8224); sidx++; }
  27355. o.write_shift(2, w);
  27356. ba.push(payload.slice(i, i+w)); i+= w;
  27357. }
  27358. }
  27359. function write_BIFF2Cell(out, r, c) {
  27360. if(!out) out = new_buf(7);
  27361. out.write_shift(2, r);
  27362. out.write_shift(2, c);
  27363. out.write_shift(2, 0);
  27364. out.write_shift(1, 0);
  27365. return out;
  27366. }
  27367. function write_BIFF2BERR(r, c, val, t) {
  27368. var out = new_buf(9);
  27369. write_BIFF2Cell(out, r, c);
  27370. if(t == 'e') { out.write_shift(1, val); out.write_shift(1, 1); }
  27371. else { out.write_shift(1, val?1:0); out.write_shift(1, 0); }
  27372. return out;
  27373. }
  27374. /* TODO: codepage, large strings */
  27375. function write_BIFF2LABEL(r, c, val) {
  27376. var out = new_buf(8 + 2*val.length);
  27377. write_BIFF2Cell(out, r, c);
  27378. out.write_shift(1, val.length);
  27379. out.write_shift(val.length, val, 'sbcs');
  27380. return out.l < out.length ? out.slice(0, out.l) : out;
  27381. }
  27382. function write_ws_biff2_cell(ba, cell, R, C) {
  27383. if(cell.v != null) switch(cell.t) {
  27384. case 'd': case 'n':
  27385. var v = cell.t == 'd' ? datenum(parseDate(cell.v)) : cell.v;
  27386. if((v == (v|0)) && (v >= 0) && (v < 65536))
  27387. write_biff_rec(ba, 0x0002, write_BIFF2INT(R, C, v));
  27388. else
  27389. write_biff_rec(ba, 0x0003, write_BIFF2NUM(R,C, v));
  27390. return;
  27391. case 'b': case 'e': write_biff_rec(ba, 0x0005, write_BIFF2BERR(R, C, cell.v, cell.t)); return;
  27392. /* TODO: codepage, sst */
  27393. case 's': case 'str':
  27394. write_biff_rec(ba, 0x0004, write_BIFF2LABEL(R, C, cell.v));
  27395. return;
  27396. }
  27397. write_biff_rec(ba, 0x0001, write_BIFF2Cell(null, R, C));
  27398. }
  27399. function write_ws_biff2(ba, ws, idx, opts) {
  27400. var dense = Array.isArray(ws);
  27401. var range = safe_decode_range(ws['!ref'] || "A1"), ref, rr = "", cols = [];
  27402. if(range.e.c > 0xFF || range.e.r > 0x3FFF) {
  27403. if(opts.WTF) throw new Error("Range " + (ws['!ref'] || "A1") + " exceeds format limit A1:IV16384");
  27404. range.e.c = Math.min(range.e.c, 0xFF);
  27405. range.e.r = Math.min(range.e.c, 0x3FFF);
  27406. ref = encode_range(range);
  27407. }
  27408. for(var R = range.s.r; R <= range.e.r; ++R) {
  27409. rr = encode_row(R);
  27410. for(var C = range.s.c; C <= range.e.c; ++C) {
  27411. if(R === range.s.r) cols[C] = encode_col(C);
  27412. ref = cols[C] + rr;
  27413. var cell = dense ? (ws[R]||[])[C] : ws[ref];
  27414. if(!cell) continue;
  27415. /* write cell */
  27416. write_ws_biff2_cell(ba, cell, R, C, opts);
  27417. }
  27418. }
  27419. }
  27420. /* Based on test files */
  27421. function write_biff2_buf(wb, opts) {
  27422. var o = opts || {};
  27423. if(DENSE != null && o.dense == null) o.dense = DENSE;
  27424. var ba = buf_array();
  27425. var idx = 0;
  27426. for(var i=0;i<wb.SheetNames.length;++i) if(wb.SheetNames[i] == o.sheet) idx=i;
  27427. if(idx == 0 && !!o.sheet && wb.SheetNames[0] != o.sheet) throw new Error("Sheet not found: " + o.sheet);
  27428. write_biff_rec(ba, 0x0009, write_BOF(wb, 0x10, o));
  27429. /* ... */
  27430. write_ws_biff2(ba, wb.Sheets[wb.SheetNames[idx]], idx, o, wb);
  27431. /* ... */
  27432. write_biff_rec(ba, 0x000A);
  27433. return ba.end();
  27434. }
  27435. function write_FONTS_biff8(ba, data, opts) {
  27436. write_biff_rec(ba, "Font", write_Font({
  27437. sz:12,
  27438. color: {theme:1},
  27439. name: "Arial",
  27440. family: 2,
  27441. scheme: "minor"
  27442. }, opts));
  27443. }
  27444. function write_FMTS_biff8(ba, NF, opts) {
  27445. if(!NF) return;
  27446. [[5,8],[23,26],[41,44],[/*63*/50,/*66],[164,*/392]].forEach(function(r) {
  27447. for(var i = r[0]; i <= r[1]; ++i) if(NF[i] != null) write_biff_rec(ba, "Format", write_Format(i, NF[i], opts));
  27448. });
  27449. }
  27450. function write_FEAT(ba, ws) {
  27451. /* [MS-XLS] 2.4.112 */
  27452. var o = new_buf(19);
  27453. o.write_shift(4, 0x867); o.write_shift(4, 0); o.write_shift(4, 0);
  27454. o.write_shift(2, 3); o.write_shift(1, 1); o.write_shift(4, 0);
  27455. write_biff_rec(ba, "FeatHdr", o);
  27456. /* [MS-XLS] 2.4.111 */
  27457. o = new_buf(39);
  27458. o.write_shift(4, 0x868); o.write_shift(4, 0); o.write_shift(4, 0);
  27459. o.write_shift(2, 3); o.write_shift(1, 0); o.write_shift(4, 0);
  27460. o.write_shift(2, 1); o.write_shift(4, 4); o.write_shift(2, 0);
  27461. write_Ref8U(safe_decode_range(ws['!ref']||"A1"), o);
  27462. o.write_shift(4, 4);
  27463. write_biff_rec(ba, "Feat", o);
  27464. }
  27465. function write_CELLXFS_biff8(ba, opts) {
  27466. for(var i = 0; i < 16; ++i) write_biff_rec(ba, "XF", write_XF({numFmtId:0, style:true}, 0, opts));
  27467. opts.cellXfs.forEach(function(c) {
  27468. write_biff_rec(ba, "XF", write_XF(c, 0, opts));
  27469. });
  27470. }
  27471. function write_ws_biff8_hlinks(ba, ws) {
  27472. for(var R=0; R<ws['!links'].length; ++R) {
  27473. var HL = ws['!links'][R];
  27474. write_biff_rec(ba, "HLink", write_HLink(HL));
  27475. if(HL[1].Tooltip) write_biff_rec(ba, "HLinkTooltip", write_HLinkTooltip(HL));
  27476. }
  27477. delete ws['!links'];
  27478. }
  27479. function write_ws_biff8_cell(ba, cell, R, C, opts) {
  27480. var os = 16 + get_cell_style(opts.cellXfs, cell, opts);
  27481. if(cell.v == null && !cell.bf) {
  27482. write_biff_rec(ba, "Blank", write_XLSCell(R, C, os));
  27483. return;
  27484. }
  27485. if(cell.bf) write_biff_rec(ba, "Formula", write_Formula(cell, R, C, opts, os));
  27486. else switch(cell.t) {
  27487. case 'd': case 'n':
  27488. var v = cell.t == 'd' ? datenum(parseDate(cell.v)) : cell.v;
  27489. /* TODO: emit RK as appropriate */
  27490. write_biff_rec(ba, "Number", write_Number(R, C, v, os, opts));
  27491. break;
  27492. case 'b': case 'e':
  27493. write_biff_rec(ba, 0x0205, write_BoolErr(R, C, cell.v, os, opts, cell.t));
  27494. break;
  27495. /* TODO: codepage, sst */
  27496. case 's': case 'str':
  27497. if(opts.bookSST) {
  27498. var isst = get_sst_id(opts.Strings, cell.v, opts.revStrings);
  27499. write_biff_rec(ba, "LabelSst", write_LabelSst(R, C, isst, os, opts));
  27500. } else write_biff_rec(ba, "Label", write_Label(R, C, cell.v, os, opts));
  27501. break;
  27502. default:
  27503. write_biff_rec(ba, "Blank", write_XLSCell(R, C, os));
  27504. }
  27505. }
  27506. /* [MS-XLS] 2.1.7.20.5 */
  27507. function write_ws_biff8(idx, opts, wb) {
  27508. var ba = buf_array();
  27509. var s = wb.SheetNames[idx], ws = wb.Sheets[s] || {};
  27510. var _WB = ((wb||{}).Workbook||{});
  27511. var _sheet = ((_WB.Sheets||[])[idx]||{});
  27512. var dense = Array.isArray(ws);
  27513. var b8 = opts.biff == 8;
  27514. var ref, rr = "", cols = [];
  27515. var range = safe_decode_range(ws['!ref'] || "A1");
  27516. var MAX_ROWS = b8 ? 65536 : 16384;
  27517. if(range.e.c > 0xFF || range.e.r >= MAX_ROWS) {
  27518. if(opts.WTF) throw new Error("Range " + (ws['!ref'] || "A1") + " exceeds format limit A1:IV16384");
  27519. range.e.c = Math.min(range.e.c, 0xFF);
  27520. range.e.r = Math.min(range.e.c, MAX_ROWS-1);
  27521. }
  27522. write_biff_rec(ba, 0x0809, write_BOF(wb, 0x10, opts));
  27523. /* [Uncalced] Index */
  27524. write_biff_rec(ba, "CalcMode", writeuint16(1));
  27525. write_biff_rec(ba, "CalcCount", writeuint16(100));
  27526. write_biff_rec(ba, "CalcRefMode", writebool(true));
  27527. write_biff_rec(ba, "CalcIter", writebool(false));
  27528. write_biff_rec(ba, "CalcDelta", write_Xnum(0.001));
  27529. write_biff_rec(ba, "CalcSaveRecalc", writebool(true));
  27530. write_biff_rec(ba, "PrintRowCol", writebool(false));
  27531. write_biff_rec(ba, "PrintGrid", writebool(false));
  27532. write_biff_rec(ba, "GridSet", writeuint16(1));
  27533. write_biff_rec(ba, "Guts", write_Guts([0,0]));
  27534. /* DefaultRowHeight WsBool [Sync] [LPr] [HorizontalPageBreaks] [VerticalPageBreaks] */
  27535. /* Header (string) */
  27536. /* Footer (string) */
  27537. write_biff_rec(ba, "HCenter", writebool(false));
  27538. write_biff_rec(ba, "VCenter", writebool(false));
  27539. /* ... */
  27540. write_biff_rec(ba, 0x200, write_Dimensions(range, opts));
  27541. /* ... */
  27542. if(b8) ws['!links'] = [];
  27543. for(var R = range.s.r; R <= range.e.r; ++R) {
  27544. rr = encode_row(R);
  27545. for(var C = range.s.c; C <= range.e.c; ++C) {
  27546. if(R === range.s.r) cols[C] = encode_col(C);
  27547. ref = cols[C] + rr;
  27548. var cell = dense ? (ws[R]||[])[C] : ws[ref];
  27549. if(!cell) continue;
  27550. /* write cell */
  27551. write_ws_biff8_cell(ba, cell, R, C, opts);
  27552. if(b8 && cell.l) ws['!links'].push([ref, cell.l]);
  27553. }
  27554. }
  27555. var cname = _sheet.CodeName || _sheet.name || s;
  27556. /* ... */
  27557. if(b8) write_biff_rec(ba, "Window2", write_Window2((_WB.Views||[])[0]));
  27558. /* ... */
  27559. if(b8 && (ws['!merges']||[]).length) write_biff_rec(ba, "MergeCells", write_MergeCells(ws['!merges']));
  27560. /* [LRng] *QUERYTABLE [PHONETICINFO] CONDFMTS */
  27561. if(b8) write_ws_biff8_hlinks(ba, ws);
  27562. /* [DVAL] */
  27563. write_biff_rec(ba, "CodeName", write_XLUnicodeString(cname, opts));
  27564. /* *WebPub *CellWatch [SheetExt] */
  27565. if(b8) write_FEAT(ba, ws);
  27566. /* *FEAT11 *RECORD12 */
  27567. write_biff_rec(ba, "EOF");
  27568. return ba.end();
  27569. }
  27570. /* [MS-XLS] 2.1.7.20.3 */
  27571. function write_biff8_global(wb, bufs, opts) {
  27572. var A = buf_array();
  27573. var _WB = ((wb||{}).Workbook||{});
  27574. var _sheets = (_WB.Sheets||[]);
  27575. var _wb = _WB.WBProps||{};
  27576. var b8 = opts.biff == 8, b5 = opts.biff == 5;
  27577. write_biff_rec(A, 0x0809, write_BOF(wb, 0x05, opts));
  27578. if(opts.bookType == "xla") write_biff_rec(A, "Addin");
  27579. write_biff_rec(A, "InterfaceHdr", b8 ? writeuint16(0x04b0) : null);
  27580. write_biff_rec(A, "Mms", writezeroes(2));
  27581. if(b5) write_biff_rec(A, "ToolbarHdr");
  27582. if(b5) write_biff_rec(A, "ToolbarEnd");
  27583. write_biff_rec(A, "InterfaceEnd");
  27584. write_biff_rec(A, "WriteAccess", write_WriteAccess("SheetJS", opts));
  27585. /* [FileSharing] */
  27586. write_biff_rec(A, "CodePage", writeuint16(b8 ? 0x04b0 : 0x04E4));
  27587. /* *2047 Lel */
  27588. if(b8) write_biff_rec(A, "DSF", writeuint16(0));
  27589. if(b8) write_biff_rec(A, "Excel9File");
  27590. write_biff_rec(A, "RRTabId", write_RRTabId(wb.SheetNames.length));
  27591. if(b8 && wb.vbaraw) write_biff_rec(A, "ObProj");
  27592. /* [ObNoMacros] */
  27593. if(b8 && wb.vbaraw) {
  27594. var cname = _wb.CodeName || "ThisWorkbook";
  27595. write_biff_rec(A, "CodeName", write_XLUnicodeString(cname, opts));
  27596. }
  27597. write_biff_rec(A, "BuiltInFnGroupCount", writeuint16(0x11));
  27598. /* *FnGroupName *FnGrp12 */
  27599. /* *Lbl */
  27600. /* [OleObjectSize] */
  27601. write_biff_rec(A, "WinProtect", writebool(false));
  27602. write_biff_rec(A, "Protect", writebool(false));
  27603. write_biff_rec(A, "Password", writeuint16(0));
  27604. if(b8) write_biff_rec(A, "Prot4Rev", writebool(false));
  27605. if(b8) write_biff_rec(A, "Prot4RevPass", writeuint16(0));
  27606. write_biff_rec(A, "Window1", write_Window1(opts));
  27607. write_biff_rec(A, "Backup", writebool(false));
  27608. write_biff_rec(A, "HideObj", writeuint16(0));
  27609. write_biff_rec(A, "Date1904", writebool(safe1904(wb)=="true"));
  27610. write_biff_rec(A, "CalcPrecision", writebool(true));
  27611. if(b8) write_biff_rec(A, "RefreshAll", writebool(false));
  27612. write_biff_rec(A, "BookBool", writeuint16(0));
  27613. /* ... */
  27614. write_FONTS_biff8(A, wb, opts);
  27615. write_FMTS_biff8(A, wb.SSF, opts);
  27616. write_CELLXFS_biff8(A, opts);
  27617. /* ... */
  27618. if(b8) write_biff_rec(A, "UsesELFs", writebool(false));
  27619. var a = A.end();
  27620. var C = buf_array();
  27621. /* METADATA [MTRSettings] [ForceFullCalculation] */
  27622. if(b8) write_biff_rec(C, "Country", write_Country());
  27623. /* *SUPBOOK *LBL *RTD [RecalcId] *HFPicture *MSODRAWINGGROUP */
  27624. /* BIFF8: [SST *Continue] ExtSST */
  27625. if(b8 && opts.Strings) write_biff_continue(C, "SST", write_SST(opts.Strings, opts));
  27626. /* *WebPub [WOpt] [CrErr] [BookExt] *FeatHdr *DConn [THEME] [CompressPictures] [Compat12] [GUIDTypeLib] */
  27627. write_biff_rec(C, "EOF");
  27628. var c = C.end();
  27629. var B = buf_array();
  27630. var blen = 0, j = 0;
  27631. for(j = 0; j < wb.SheetNames.length; ++j) blen += (b8 ? 12 : 11) + (b8 ? 2 : 1) * wb.SheetNames[j].length;
  27632. var start = a.length + blen + c.length;
  27633. for(j = 0; j < wb.SheetNames.length; ++j) {
  27634. var _sheet = _sheets[j] || ({});
  27635. write_biff_rec(B, "BoundSheet8", write_BoundSheet8({pos:start, hs:_sheet.Hidden||0, dt:0, name:wb.SheetNames[j]}, opts));
  27636. start += bufs[j].length;
  27637. }
  27638. /* 1*BoundSheet8 */
  27639. var b = B.end();
  27640. if(blen != b.length) throw new Error("BS8 " + blen + " != " + b.length);
  27641. var out = [];
  27642. if(a.length) out.push(a);
  27643. if(b.length) out.push(b);
  27644. if(c.length) out.push(c);
  27645. return __toBuffer([out]);
  27646. }
  27647. /* [MS-XLS] 2.1.7.20 Workbook Stream */
  27648. function write_biff8_buf(wb, opts) {
  27649. var o = opts || {};
  27650. var bufs = [];
  27651. if(wb && !wb.SSF) {
  27652. wb.SSF = SSF.get_table();
  27653. }
  27654. if(wb && wb.SSF) {
  27655. make_ssf(SSF); SSF.load_table(wb.SSF);
  27656. // $FlowIgnore
  27657. o.revssf = evert_num(wb.SSF); o.revssf[wb.SSF[65535]] = 0;
  27658. o.ssf = wb.SSF;
  27659. }
  27660. o.Strings = []; o.Strings.Count = 0; o.Strings.Unique = 0;
  27661. fix_write_opts(o);
  27662. o.cellXfs = [];
  27663. get_cell_style(o.cellXfs, {}, {revssf:{"General":0}});
  27664. if(!wb.Props) wb.Props = {};
  27665. for(var i = 0; i < wb.SheetNames.length; ++i) bufs[bufs.length] = write_ws_biff8(i, o, wb);
  27666. bufs.unshift(write_biff8_global(wb, bufs, o));
  27667. return __toBuffer([bufs]);
  27668. }
  27669. function write_biff_buf(wb, opts) {
  27670. var o = opts || {};
  27671. switch(o.biff || 2) {
  27672. case 8: case 5: return write_biff8_buf(wb, opts);
  27673. case 4: case 3: case 2: return write_biff2_buf(wb, opts);
  27674. }
  27675. throw new Error("invalid type " + o.bookType + " for BIFF");
  27676. }
  27677. /* note: browser DOM element cannot see mso- style attrs, must parse */
  27678. var HTML_ = (function() {
  27679. function html_to_sheet(str, _opts) {
  27680. var opts = _opts || {};
  27681. if(DENSE != null && opts.dense == null) opts.dense = DENSE;
  27682. var ws = opts.dense ? ([]) : ({});
  27683. str = str.replace(/<!--.*?-->/g, "");
  27684. var mtch = str.match(/<table/i);
  27685. if(!mtch) throw new Error("Invalid HTML: could not find <table>");
  27686. var mtch2 = str.match(/<\/table/i);
  27687. var i = mtch.index, j = mtch2 && mtch2.index || str.length;
  27688. var rows = split_regex(str.slice(i, j), /(:?<tr[^>]*>)/i, "<tr>");
  27689. var R = -1, C = 0, RS = 0, CS = 0;
  27690. var range = {s:{r:10000000, c:10000000},e:{r:0,c:0}};
  27691. var merges = [];
  27692. for(i = 0; i < rows.length; ++i) {
  27693. var row = rows[i].trim();
  27694. var hd = row.slice(0,3).toLowerCase();
  27695. if(hd == "<tr") { ++R; if(opts.sheetRows && opts.sheetRows <= R) { --R; break; } C = 0; continue; }
  27696. if(hd != "<td" && hd != "<th") continue;
  27697. var cells = row.split(/<\/t[dh]>/i);
  27698. for(j = 0; j < cells.length; ++j) {
  27699. var cell = cells[j].trim();
  27700. if(!cell.match(/<t[dh]/i)) continue;
  27701. var m = cell, cc = 0;
  27702. /* TODO: parse styles etc */
  27703. while(m.charAt(0) == "<" && (cc = m.indexOf(">")) > -1) m = m.slice(cc+1);
  27704. for(var midx = 0; midx < merges.length; ++midx) {
  27705. var _merge = merges[midx];
  27706. if(_merge.s.c == C && _merge.s.r < R && R <= _merge.e.r) { C = _merge.e.c + 1; midx = -1; }
  27707. }
  27708. var tag = parsexmltag(cell.slice(0, cell.indexOf(">")));
  27709. CS = tag.colspan ? +tag.colspan : 1;
  27710. if((RS = +tag.rowspan)>1 || CS>1) merges.push({s:{r:R,c:C},e:{r:R + (RS||1) - 1, c:C + CS - 1}});
  27711. var _t = tag.t || "";
  27712. /* TODO: generate stub cells */
  27713. if(!m.length) { C += CS; continue; }
  27714. m = htmldecode(m);
  27715. if(range.s.r > R) range.s.r = R; if(range.e.r < R) range.e.r = R;
  27716. if(range.s.c > C) range.s.c = C; if(range.e.c < C) range.e.c = C;
  27717. if(!m.length) continue;
  27718. var o = {t:'s', v:m};
  27719. if(opts.raw || !m.trim().length || _t == 's'){}
  27720. else if(m === 'TRUE') o = {t:'b', v:true};
  27721. else if(m === 'FALSE') o = {t:'b', v:false};
  27722. else if(!isNaN(fuzzynum(m))) o = {t:'n', v:fuzzynum(m)};
  27723. else if(!isNaN(fuzzydate(m).getDate())) {
  27724. o = ({t:'d', v:parseDate(m)});
  27725. if(!opts.cellDates) o = ({t:'n', v:datenum(o.v)});
  27726. o.z = opts.dateNF || SSF._table[14];
  27727. }
  27728. if(opts.dense) { if(!ws[R]) ws[R] = []; ws[R][C] = o; }
  27729. else ws[encode_cell({r:R, c:C})] = o;
  27730. C += CS;
  27731. }
  27732. }
  27733. ws['!ref'] = encode_range(range);
  27734. if(merges.length) ws["!merges"] = merges;
  27735. return ws;
  27736. }
  27737. function html_to_book(str, opts) {
  27738. return sheet_to_workbook(html_to_sheet(str, opts), opts);
  27739. }
  27740. function make_html_row(ws, r, R, o) {
  27741. var M = (ws['!merges'] ||[]);
  27742. var oo = [];
  27743. for(var C = r.s.c; C <= r.e.c; ++C) {
  27744. var RS = 0, CS = 0;
  27745. for(var j = 0; j < M.length; ++j) {
  27746. if(M[j].s.r > R || M[j].s.c > C) continue;
  27747. if(M[j].e.r < R || M[j].e.c < C) continue;
  27748. if(M[j].s.r < R || M[j].s.c < C) { RS = -1; break; }
  27749. RS = M[j].e.r - M[j].s.r + 1; CS = M[j].e.c - M[j].s.c + 1; break;
  27750. }
  27751. if(RS < 0) continue;
  27752. var coord = encode_cell({r:R,c:C});
  27753. var cell = o.dense ? (ws[R]||[])[C] : ws[coord];
  27754. /* TODO: html entities */
  27755. var w = (cell && cell.v != null) && (cell.h || escapehtml(cell.w || (format_cell(cell), cell.w) || "")) || "";
  27756. var sp = ({});
  27757. if(RS > 1) sp.rowspan = RS;
  27758. if(CS > 1) sp.colspan = CS;
  27759. sp.t = cell && cell.t || 'z';
  27760. if(o.editable) w = '<span contenteditable="true">' + w + '</span>';
  27761. sp.id = (o.id || "sjs") + "-" + coord;
  27762. if(sp.t != "z") { sp.v = cell.v; if(cell.z != null) sp.z = cell.z; }
  27763. oo.push(writextag('td', w, sp));
  27764. }
  27765. var preamble = "<tr>";
  27766. return preamble + oo.join("") + "</tr>";
  27767. }
  27768. function make_html_preamble(ws, R, o) {
  27769. var out = [];
  27770. return out.join("") + '<table' + (o && o.id ? ' id="' + o.id + '"' : "") + '>';
  27771. }
  27772. var _BEGIN = '<html><head><meta charset="utf-8"/><title>SheetJS Table Export</title></head><body>';
  27773. var _END = '</body></html>';
  27774. function sheet_to_html(ws, opts/*, wb:?Workbook*/) {
  27775. var o = opts || {};
  27776. var header = o.header != null ? o.header : _BEGIN;
  27777. var footer = o.footer != null ? o.footer : _END;
  27778. var out = [header];
  27779. var r = decode_range(ws['!ref']);
  27780. o.dense = Array.isArray(ws);
  27781. out.push(make_html_preamble(ws, r, o));
  27782. for(var R = r.s.r; R <= r.e.r; ++R) out.push(make_html_row(ws, r, R, o));
  27783. out.push("</table>" + footer);
  27784. return out.join("");
  27785. }
  27786. return {
  27787. to_workbook: html_to_book,
  27788. to_sheet: html_to_sheet,
  27789. _row: make_html_row,
  27790. BEGIN: _BEGIN,
  27791. END: _END,
  27792. _preamble: make_html_preamble,
  27793. from_sheet: sheet_to_html
  27794. };
  27795. })();
  27796. function sheet_add_dom(ws, table, _opts) {
  27797. var opts = _opts || {};
  27798. if(DENSE != null) opts.dense = DENSE;
  27799. var or_R = 0, or_C = 0;
  27800. if(opts.origin != null) {
  27801. if(typeof opts.origin == 'number') or_R = opts.origin;
  27802. else {
  27803. var _origin = typeof opts.origin == "string" ? decode_cell(opts.origin) : opts.origin;
  27804. or_R = _origin.r; or_C = _origin.c;
  27805. }
  27806. }
  27807. var rows = table.getElementsByTagName('tr');
  27808. var sheetRows = Math.min(opts.sheetRows||10000000, rows.length);
  27809. var range = {s:{r:0,c:0},e:{r:or_R,c:or_C}};
  27810. if(ws["!ref"]) {
  27811. var _range = decode_range(ws["!ref"]);
  27812. range.s.r = Math.min(range.s.r, _range.s.r);
  27813. range.s.c = Math.min(range.s.c, _range.s.c);
  27814. range.e.r = Math.max(range.e.r, _range.e.r);
  27815. range.e.c = Math.max(range.e.c, _range.e.c);
  27816. if(or_R == -1) range.e.r = or_R = _range.e.r + 1;
  27817. }
  27818. var merges = [], midx = 0;
  27819. var rowinfo = ws["!rows"] || (ws["!rows"] = []);
  27820. var _R = 0, R = 0, _C = 0, C = 0, RS = 0, CS = 0;
  27821. if(!ws["!cols"]) ws['!cols'] = [];
  27822. for(; _R < rows.length && R < sheetRows; ++_R) {
  27823. var row = rows[_R];
  27824. if (is_dom_element_hidden(row)) {
  27825. if (opts.display) continue;
  27826. rowinfo[R] = {hidden: true};
  27827. }
  27828. var elts = (row.children);
  27829. for(_C = C = 0; _C < elts.length; ++_C) {
  27830. var elt = elts[_C];
  27831. if (opts.display && is_dom_element_hidden(elt)) continue;
  27832. var v = elt.hasAttribute('v') ? elt.getAttribute('v') : htmldecode(elt.innerHTML);
  27833. var z = elt.getAttribute('z');
  27834. for(midx = 0; midx < merges.length; ++midx) {
  27835. var m = merges[midx];
  27836. if(m.s.c == C + or_C && m.s.r < R + or_R && R + or_R <= m.e.r) { C = m.e.c+1 - or_C; midx = -1; }
  27837. }
  27838. /* TODO: figure out how to extract nonstandard mso- style */
  27839. CS = +elt.getAttribute("colspan") || 1;
  27840. if( ((RS = (+elt.getAttribute("rowspan") || 1)))>1 || CS>1) merges.push({s:{r:R + or_R,c:C + or_C},e:{r:R + or_R + (RS||1) - 1, c:C + or_C + (CS||1) - 1}});
  27841. var o = {t:'s', v:v};
  27842. var _t = elt.getAttribute("t") || "";
  27843. if(v != null) {
  27844. if(v.length == 0) o.t = _t || 'z';
  27845. else if(opts.raw || v.trim().length == 0 || _t == "s"){}
  27846. else if(v === 'TRUE') o = {t:'b', v:true};
  27847. else if(v === 'FALSE') o = {t:'b', v:false};
  27848. else if(!isNaN(fuzzynum(v))) o = {t:'n', v:fuzzynum(v)};
  27849. else if(!isNaN(fuzzydate(v).getDate())) {
  27850. o = ({t:'d', v:parseDate(v)});
  27851. if(!opts.cellDates) o = ({t:'n', v:datenum(o.v)});
  27852. o.z = opts.dateNF || SSF._table[14];
  27853. }
  27854. }
  27855. if(o.z === undefined && z != null) o.z = z;
  27856. if(opts.dense) { if(!ws[R + or_R]) ws[R + or_R] = []; ws[R + or_R][C + or_C] = o; }
  27857. else ws[encode_cell({c:C + or_C, r:R + or_R})] = o;
  27858. if(range.e.c < C + or_C) range.e.c = C + or_C;
  27859. C += CS;
  27860. }
  27861. ++R;
  27862. }
  27863. if(merges.length) ws['!merges'] = (ws["!merges"] || []).concat(merges);
  27864. range.e.r = Math.max(range.e.r, R - 1 + or_R);
  27865. ws['!ref'] = encode_range(range);
  27866. if(R >= sheetRows) ws['!fullref'] = encode_range((range.e.r = rows.length-_R+R-1 + or_R,range)); // We can count the real number of rows to parse but we don't to improve the performance
  27867. return ws;
  27868. }
  27869. function parse_dom_table(table, _opts) {
  27870. var opts = _opts || {};
  27871. var ws = opts.dense ? ([]) : ({});
  27872. return sheet_add_dom(ws, table, _opts);
  27873. }
  27874. function table_to_book(table, opts) {
  27875. return sheet_to_workbook(parse_dom_table(table, opts), opts);
  27876. }
  27877. function is_dom_element_hidden(element) {
  27878. var display = '';
  27879. var get_computed_style = get_get_computed_style_function(element);
  27880. if(get_computed_style) display = get_computed_style(element).getPropertyValue('display');
  27881. if(!display) display = element.style.display; // Fallback for cases when getComputedStyle is not available (e.g. an old browser or some Node.js environments) or doesn't work (e.g. if the element is not inserted to a document)
  27882. return display === 'none';
  27883. }
  27884. /* global getComputedStyle */
  27885. function get_get_computed_style_function(element) {
  27886. // The proper getComputedStyle implementation is the one defined in the element window
  27887. if(element.ownerDocument.defaultView && typeof element.ownerDocument.defaultView.getComputedStyle === 'function') return element.ownerDocument.defaultView.getComputedStyle;
  27888. // If it is not available, try to get one from the global namespace
  27889. if(typeof getComputedStyle === 'function') return getComputedStyle;
  27890. return null;
  27891. }
  27892. /* OpenDocument */
  27893. var parse_content_xml = (function() {
  27894. var parse_text_p = function(text) {
  27895. /* 6.1.2 White Space Characters */
  27896. var fixed = text
  27897. .replace(/[\t\r\n]/g, " ").trim().replace(/ +/g, " ")
  27898. .replace(/<text:s\/>/g," ")
  27899. .replace(/<text:s text:c="(\d+)"\/>/g, function($$,$1) { return Array(parseInt($1,10)+1).join(" "); })
  27900. .replace(/<text:tab[^>]*\/>/g,"\t")
  27901. .replace(/<text:line-break\/>/g,"\n");
  27902. var v = unescapexml(fixed.replace(/<[^>]*>/g,""));
  27903. return [v];
  27904. };
  27905. var number_formats = {
  27906. /* ods name: [short ssf fmt, long ssf fmt] */
  27907. day: ["d", "dd"],
  27908. month: ["m", "mm"],
  27909. year: ["y", "yy"],
  27910. hours: ["h", "hh"],
  27911. minutes: ["m", "mm"],
  27912. seconds: ["s", "ss"],
  27913. "am-pm": ["A/P", "AM/PM"],
  27914. "day-of-week": ["ddd", "dddd"],
  27915. era: ["e", "ee"],
  27916. /* there is no native representation of LO "Q" format */
  27917. quarter: ["\\Qm", "m\\\"th quarter\""]
  27918. };
  27919. return function pcx(d, _opts) {
  27920. var opts = _opts || {};
  27921. if(DENSE != null && opts.dense == null) opts.dense = DENSE;
  27922. var str = xlml_normalize(d);
  27923. var state = [], tmp;
  27924. var tag;
  27925. var NFtag = {name:""}, NF = "", pidx = 0;
  27926. var sheetag;
  27927. var rowtag;
  27928. var Sheets = {}, SheetNames = [];
  27929. var ws = opts.dense ? ([]) : ({});
  27930. var Rn, q;
  27931. var ctag = ({value:""});
  27932. var textp = "", textpidx = 0, textptag;
  27933. var textR = [];
  27934. var R = -1, C = -1, range = {s: {r:1000000,c:10000000}, e: {r:0, c:0}};
  27935. var row_ol = 0;
  27936. var number_format_map = {};
  27937. var merges = [], mrange = {}, mR = 0, mC = 0;
  27938. var rowinfo = [], rowpeat = 1, colpeat = 1;
  27939. var arrayf = [];
  27940. var WB = {Names:[]};
  27941. var atag = ({});
  27942. var _Ref = ["", ""];
  27943. var comments = [], comment = ({});
  27944. var creator = "", creatoridx = 0;
  27945. var isstub = false, intable = false;
  27946. var i = 0;
  27947. xlmlregex.lastIndex = 0;
  27948. str = str.replace(/<!--([\s\S]*?)-->/mg,"").replace(/<!DOCTYPE[^\[]*\[[^\]]*\]>/gm,"");
  27949. while((Rn = xlmlregex.exec(str))) switch((Rn[3]=Rn[3].replace(/_.*$/,""))) {
  27950. case 'table': case '工作表': // 9.1.2 <table:table>
  27951. if(Rn[1]==='/') {
  27952. if(range.e.c >= range.s.c && range.e.r >= range.s.r) ws['!ref'] = encode_range(range);
  27953. else ws['!ref'] = "A1:A1";
  27954. if(opts.sheetRows > 0 && opts.sheetRows <= range.e.r) {
  27955. ws['!fullref'] = ws['!ref'];
  27956. range.e.r = opts.sheetRows - 1;
  27957. ws['!ref'] = encode_range(range);
  27958. }
  27959. if(merges.length) ws['!merges'] = merges;
  27960. if(rowinfo.length) ws["!rows"] = rowinfo;
  27961. sheetag.name = sheetag['名称'] || sheetag.name;
  27962. if(typeof JSON !== 'undefined') JSON.stringify(sheetag);
  27963. SheetNames.push(sheetag.name);
  27964. Sheets[sheetag.name] = ws;
  27965. intable = false;
  27966. }
  27967. else if(Rn[0].charAt(Rn[0].length-2) !== '/') {
  27968. sheetag = parsexmltag(Rn[0], false);
  27969. R = C = -1;
  27970. range.s.r = range.s.c = 10000000; range.e.r = range.e.c = 0;
  27971. ws = opts.dense ? ([]) : ({}); merges = [];
  27972. rowinfo = [];
  27973. intable = true;
  27974. }
  27975. break;
  27976. case 'table-row-group': // 9.1.9 <table:table-row-group>
  27977. if(Rn[1] === "/") --row_ol; else ++row_ol;
  27978. break;
  27979. case 'table-row': case '行': // 9.1.3 <table:table-row>
  27980. if(Rn[1] === '/') { R+=rowpeat; rowpeat = 1; break; }
  27981. rowtag = parsexmltag(Rn[0], false);
  27982. if(rowtag['行号']) R = rowtag['行号'] - 1; else if(R == -1) R = 0;
  27983. rowpeat = +rowtag['number-rows-repeated'] || 1;
  27984. /* TODO: remove magic */
  27985. if(rowpeat < 10) for(i = 0; i < rowpeat; ++i) if(row_ol > 0) rowinfo[R + i] = {level: row_ol};
  27986. C = -1; break;
  27987. case 'covered-table-cell': // 9.1.5 <table:covered-table-cell>
  27988. if(Rn[1] !== '/') ++C;
  27989. if(opts.sheetStubs) {
  27990. if(opts.dense) { if(!ws[R]) ws[R] = []; ws[R][C] = {t:'z'}; }
  27991. else ws[encode_cell({r:R,c:C})] = {t:'z'};
  27992. }
  27993. textp = ""; textR = [];
  27994. break; /* stub */
  27995. case 'table-cell': case '数据':
  27996. if(Rn[0].charAt(Rn[0].length-2) === '/') {
  27997. ++C;
  27998. ctag = parsexmltag(Rn[0], false);
  27999. colpeat = parseInt(ctag['number-columns-repeated']||"1", 10);
  28000. q = ({t:'z', v:null});
  28001. if(ctag.formula && opts.cellFormula != false) q.f = ods_to_csf_formula(unescapexml(ctag.formula));
  28002. if((ctag['数据类型'] || ctag['value-type']) == "string") {
  28003. q.t = "s"; q.v = unescapexml(ctag['string-value'] || "");
  28004. if(opts.dense) {
  28005. if(!ws[R]) ws[R] = [];
  28006. ws[R][C] = q;
  28007. } else {
  28008. ws[encode_cell({r:R,c:C})] = q;
  28009. }
  28010. }
  28011. C+= colpeat-1;
  28012. } else if(Rn[1]!=='/') {
  28013. ++C;
  28014. colpeat = 1;
  28015. var rptR = rowpeat ? R + rowpeat - 1 : R;
  28016. if(C > range.e.c) range.e.c = C;
  28017. if(C < range.s.c) range.s.c = C;
  28018. if(R < range.s.r) range.s.r = R;
  28019. if(rptR > range.e.r) range.e.r = rptR;
  28020. ctag = parsexmltag(Rn[0], false);
  28021. comments = []; comment = ({});
  28022. q = ({t:ctag['数据类型'] || ctag['value-type'], v:null});
  28023. if(opts.cellFormula) {
  28024. if(ctag.formula) ctag.formula = unescapexml(ctag.formula);
  28025. if(ctag['number-matrix-columns-spanned'] && ctag['number-matrix-rows-spanned']) {
  28026. mR = parseInt(ctag['number-matrix-rows-spanned'],10) || 0;
  28027. mC = parseInt(ctag['number-matrix-columns-spanned'],10) || 0;
  28028. mrange = {s: {r:R,c:C}, e:{r:R + mR-1,c:C + mC-1}};
  28029. q.F = encode_range(mrange);
  28030. arrayf.push([mrange, q.F]);
  28031. }
  28032. if(ctag.formula) q.f = ods_to_csf_formula(ctag.formula);
  28033. else for(i = 0; i < arrayf.length; ++i)
  28034. if(R >= arrayf[i][0].s.r && R <= arrayf[i][0].e.r)
  28035. if(C >= arrayf[i][0].s.c && C <= arrayf[i][0].e.c)
  28036. q.F = arrayf[i][1];
  28037. }
  28038. if(ctag['number-columns-spanned'] || ctag['number-rows-spanned']) {
  28039. mR = parseInt(ctag['number-rows-spanned'],10) || 0;
  28040. mC = parseInt(ctag['number-columns-spanned'],10) || 0;
  28041. mrange = {s: {r:R,c:C}, e:{r:R + mR-1,c:C + mC-1}};
  28042. merges.push(mrange);
  28043. }
  28044. /* 19.675.2 table:number-columns-repeated */
  28045. if(ctag['number-columns-repeated']) colpeat = parseInt(ctag['number-columns-repeated'], 10);
  28046. /* 19.385 office:value-type */
  28047. switch(q.t) {
  28048. case 'boolean': q.t = 'b'; q.v = parsexmlbool(ctag['boolean-value']); break;
  28049. case 'float': q.t = 'n'; q.v = parseFloat(ctag.value); break;
  28050. case 'percentage': q.t = 'n'; q.v = parseFloat(ctag.value); break;
  28051. case 'currency': q.t = 'n'; q.v = parseFloat(ctag.value); break;
  28052. case 'date': q.t = 'd'; q.v = parseDate(ctag['date-value']);
  28053. if(!opts.cellDates) { q.t = 'n'; q.v = datenum(q.v); }
  28054. q.z = 'm/d/yy'; break;
  28055. case 'time': q.t = 'n'; q.v = parse_isodur(ctag['time-value'])/86400; break;
  28056. case 'number': q.t = 'n'; q.v = parseFloat(ctag['数据数值']); break;
  28057. default:
  28058. if(q.t === 'string' || q.t === 'text' || !q.t) {
  28059. q.t = 's';
  28060. if(ctag['string-value'] != null) { textp = unescapexml(ctag['string-value']); textR = []; }
  28061. } else throw new Error('Unsupported value type ' + q.t);
  28062. }
  28063. } else {
  28064. isstub = false;
  28065. if(q.t === 's') {
  28066. q.v = textp || '';
  28067. if(textR.length) q.R = textR;
  28068. isstub = textpidx == 0;
  28069. }
  28070. if(atag.Target) q.l = atag;
  28071. if(comments.length > 0) { q.c = comments; comments = []; }
  28072. if(textp && opts.cellText !== false) q.w = textp;
  28073. if(isstub) { q.t = "z"; delete q.v; }
  28074. if(!isstub || opts.sheetStubs) {
  28075. if(!(opts.sheetRows && opts.sheetRows <= R)) {
  28076. for(var rpt = 0; rpt < rowpeat; ++rpt) {
  28077. colpeat = parseInt(ctag['number-columns-repeated']||"1", 10);
  28078. if(opts.dense) {
  28079. if(!ws[R + rpt]) ws[R + rpt] = [];
  28080. ws[R + rpt][C] = rpt == 0 ? q : dup(q);
  28081. while(--colpeat > 0) ws[R + rpt][C + colpeat] = dup(q);
  28082. } else {
  28083. ws[encode_cell({r:R + rpt,c:C})] = q;
  28084. while(--colpeat > 0) ws[encode_cell({r:R + rpt,c:C + colpeat})] = dup(q);
  28085. }
  28086. if(range.e.c <= C) range.e.c = C;
  28087. }
  28088. }
  28089. }
  28090. colpeat = parseInt(ctag['number-columns-repeated']||"1", 10);
  28091. C += colpeat-1; colpeat = 0;
  28092. q = {};
  28093. textp = ""; textR = [];
  28094. }
  28095. atag = ({});
  28096. break; // 9.1.4 <table:table-cell>
  28097. /* pure state */
  28098. case 'document': // TODO: <office:document> is the root for FODS
  28099. case 'document-content': case '电子表格文档': // 3.1.3.2 <office:document-content>
  28100. case 'spreadsheet': case '主体': // 3.7 <office:spreadsheet>
  28101. case 'scripts': // 3.12 <office:scripts>
  28102. case 'styles': // TODO <office:styles>
  28103. case 'font-face-decls': // 3.14 <office:font-face-decls>
  28104. case 'master-styles': //3.15.4 <office:master-styles> -- relevant for FODS
  28105. if(Rn[1]==='/'){if((tmp=state.pop())[0]!==Rn[3]) throw "Bad state: "+tmp;}
  28106. else if(Rn[0].charAt(Rn[0].length-2) !== '/') state.push([Rn[3], true]);
  28107. break;
  28108. case 'annotation': // 14.1 <office:annotation>
  28109. if(Rn[1]==='/'){
  28110. if((tmp=state.pop())[0]!==Rn[3]) throw "Bad state: "+tmp;
  28111. comment.t = textp;
  28112. if(textR.length) comment.R = textR;
  28113. comment.a = creator;
  28114. comments.push(comment);
  28115. }
  28116. else if(Rn[0].charAt(Rn[0].length-2) !== '/') {state.push([Rn[3], false]);}
  28117. creator = ""; creatoridx = 0;
  28118. textp = ""; textpidx = 0; textR = [];
  28119. break;
  28120. case 'creator': // 4.3.2.7 <dc:creator>
  28121. if(Rn[1]==='/') { creator = str.slice(creatoridx,Rn.index); }
  28122. else creatoridx = Rn.index + Rn[0].length;
  28123. break;
  28124. /* ignore state */
  28125. case 'meta': case '元数据': // TODO: <office:meta> <uof:元数据> FODS/UOF
  28126. case 'settings': // TODO: <office:settings>
  28127. case 'config-item-set': // TODO: <office:config-item-set>
  28128. case 'config-item-map-indexed': // TODO: <office:config-item-map-indexed>
  28129. case 'config-item-map-entry': // TODO: <office:config-item-map-entry>
  28130. case 'config-item-map-named': // TODO: <office:config-item-map-entry>
  28131. case 'shapes': // 9.2.8 <table:shapes>
  28132. case 'frame': // 10.4.2 <draw:frame>
  28133. case 'text-box': // 10.4.3 <draw:text-box>
  28134. case 'image': // 10.4.4 <draw:image>
  28135. case 'data-pilot-tables': // 9.6.2 <table:data-pilot-tables>
  28136. case 'list-style': // 16.30 <text:list-style>
  28137. case 'form': // 13.13 <form:form>
  28138. case 'dde-links': // 9.8 <table:dde-links>
  28139. case 'event-listeners': // TODO
  28140. case 'chart': // TODO
  28141. if(Rn[1]==='/'){if((tmp=state.pop())[0]!==Rn[3]) throw "Bad state: "+tmp;}
  28142. else if(Rn[0].charAt(Rn[0].length-2) !== '/') state.push([Rn[3], false]);
  28143. textp = ""; textpidx = 0; textR = [];
  28144. break;
  28145. case 'scientific-number': // TODO: <number:scientific-number>
  28146. break;
  28147. case 'currency-symbol': // TODO: <number:currency-symbol>
  28148. break;
  28149. case 'currency-style': // TODO: <number:currency-style>
  28150. break;
  28151. case 'number-style': // 16.27.2 <number:number-style>
  28152. case 'percentage-style': // 16.27.9 <number:percentage-style>
  28153. case 'date-style': // 16.27.10 <number:date-style>
  28154. case 'time-style': // 16.27.18 <number:time-style>
  28155. if(Rn[1]==='/'){
  28156. number_format_map[NFtag.name] = NF;
  28157. if((tmp=state.pop())[0]!==Rn[3]) throw "Bad state: "+tmp;
  28158. } else if(Rn[0].charAt(Rn[0].length-2) !== '/') {
  28159. NF = "";
  28160. NFtag = parsexmltag(Rn[0], false);
  28161. state.push([Rn[3], true]);
  28162. } break;
  28163. case 'script': break; // 3.13 <office:script>
  28164. case 'libraries': break; // TODO: <ooo:libraries>
  28165. case 'automatic-styles': break; // 3.15.3 <office:automatic-styles>
  28166. case 'default-style': // TODO: <style:default-style>
  28167. case 'page-layout': break; // TODO: <style:page-layout>
  28168. case 'style': // 16.2 <style:style>
  28169. break;
  28170. case 'map': break; // 16.3 <style:map>
  28171. case 'font-face': break; // 16.21 <style:font-face>
  28172. case 'paragraph-properties': break; // 17.6 <style:paragraph-properties>
  28173. case 'table-properties': break; // 17.15 <style:table-properties>
  28174. case 'table-column-properties': break; // 17.16 <style:table-column-properties>
  28175. case 'table-row-properties': break; // 17.17 <style:table-row-properties>
  28176. case 'table-cell-properties': break; // 17.18 <style:table-cell-properties>
  28177. case 'number': // 16.27.3 <number:number>
  28178. switch(state[state.length-1][0]) {
  28179. case 'time-style':
  28180. case 'date-style':
  28181. tag = parsexmltag(Rn[0], false);
  28182. NF += number_formats[Rn[3]][tag.style==='long'?1:0]; break;
  28183. } break;
  28184. case 'fraction': break; // TODO 16.27.6 <number:fraction>
  28185. case 'day': // 16.27.11 <number:day>
  28186. case 'month': // 16.27.12 <number:month>
  28187. case 'year': // 16.27.13 <number:year>
  28188. case 'era': // 16.27.14 <number:era>
  28189. case 'day-of-week': // 16.27.15 <number:day-of-week>
  28190. case 'week-of-year': // 16.27.16 <number:week-of-year>
  28191. case 'quarter': // 16.27.17 <number:quarter>
  28192. case 'hours': // 16.27.19 <number:hours>
  28193. case 'minutes': // 16.27.20 <number:minutes>
  28194. case 'seconds': // 16.27.21 <number:seconds>
  28195. case 'am-pm': // 16.27.22 <number:am-pm>
  28196. switch(state[state.length-1][0]) {
  28197. case 'time-style':
  28198. case 'date-style':
  28199. tag = parsexmltag(Rn[0], false);
  28200. NF += number_formats[Rn[3]][tag.style==='long'?1:0]; break;
  28201. } break;
  28202. case 'boolean-style': break; // 16.27.23 <number:boolean-style>
  28203. case 'boolean': break; // 16.27.24 <number:boolean>
  28204. case 'text-style': break; // 16.27.25 <number:text-style>
  28205. case 'text': // 16.27.26 <number:text>
  28206. if(Rn[0].slice(-2) === "/>") break;
  28207. else if(Rn[1]==="/") switch(state[state.length-1][0]) {
  28208. case 'number-style':
  28209. case 'date-style':
  28210. case 'time-style':
  28211. NF += str.slice(pidx, Rn.index);
  28212. break;
  28213. }
  28214. else pidx = Rn.index + Rn[0].length;
  28215. break;
  28216. case 'named-range': // 9.4.12 <table:named-range>
  28217. tag = parsexmltag(Rn[0], false);
  28218. _Ref = ods_to_csf_3D(tag['cell-range-address']);
  28219. var nrange = ({Name:tag.name, Ref:_Ref[0] + '!' + _Ref[1]});
  28220. if(intable) nrange.Sheet = SheetNames.length;
  28221. WB.Names.push(nrange);
  28222. break;
  28223. case 'text-content': break; // 16.27.27 <number:text-content>
  28224. case 'text-properties': break; // 16.27.27 <style:text-properties>
  28225. case 'embedded-text': break; // 16.27.4 <number:embedded-text>
  28226. case 'body': case '电子表格': break; // 3.3 16.9.6 19.726.3
  28227. case 'forms': break; // 12.25.2 13.2
  28228. case 'table-column': break; // 9.1.6 <table:table-column>
  28229. case 'table-header-rows': break; // 9.1.7 <table:table-header-rows>
  28230. case 'table-rows': break; // 9.1.12 <table:table-rows>
  28231. /* TODO: outline levels */
  28232. case 'table-column-group': break; // 9.1.10 <table:table-column-group>
  28233. case 'table-header-columns': break; // 9.1.11 <table:table-header-columns>
  28234. case 'table-columns': break; // 9.1.12 <table:table-columns>
  28235. case 'null-date': break; // 9.4.2 <table:null-date> TODO: date1904
  28236. case 'graphic-properties': break; // 17.21 <style:graphic-properties>
  28237. case 'calculation-settings': break; // 9.4.1 <table:calculation-settings>
  28238. case 'named-expressions': break; // 9.4.11 <table:named-expressions>
  28239. case 'label-range': break; // 9.4.9 <table:label-range>
  28240. case 'label-ranges': break; // 9.4.10 <table:label-ranges>
  28241. case 'named-expression': break; // 9.4.13 <table:named-expression>
  28242. case 'sort': break; // 9.4.19 <table:sort>
  28243. case 'sort-by': break; // 9.4.20 <table:sort-by>
  28244. case 'sort-groups': break; // 9.4.22 <table:sort-groups>
  28245. case 'tab': break; // 6.1.4 <text:tab>
  28246. case 'line-break': break; // 6.1.5 <text:line-break>
  28247. case 'span': break; // 6.1.7 <text:span>
  28248. case 'p': case '文本串': // 5.1.3 <text:p>
  28249. if(['master-styles'].indexOf(state[state.length-1][0]) > -1) break;
  28250. if(Rn[1]==='/' && (!ctag || !ctag['string-value'])) {
  28251. var ptp = parse_text_p(str.slice(textpidx,Rn.index), textptag);
  28252. textp = (textp.length > 0 ? textp + "\n" : "") + ptp[0];
  28253. } else { textptag = parsexmltag(Rn[0], false); textpidx = Rn.index + Rn[0].length; }
  28254. break; // <text:p>
  28255. case 's': break; // <text:s>
  28256. case 'database-range': // 9.4.15 <table:database-range>
  28257. if(Rn[1]==='/') break;
  28258. try {
  28259. _Ref = ods_to_csf_3D(parsexmltag(Rn[0])['target-range-address']);
  28260. Sheets[_Ref[0]]['!autofilter'] = { ref:_Ref[1] };
  28261. } catch(e) {/* empty */}
  28262. break;
  28263. case 'date': break; // <*:date>
  28264. case 'object': break; // 10.4.6.2 <draw:object>
  28265. case 'title': case '标题': break; // <*:title> OR <uof:标题>
  28266. case 'desc': break; // <*:desc>
  28267. case 'binary-data': break; // 10.4.5 TODO: b64 blob
  28268. /* 9.2 Advanced Tables */
  28269. case 'table-source': break; // 9.2.6
  28270. case 'scenario': break; // 9.2.6
  28271. case 'iteration': break; // 9.4.3 <table:iteration>
  28272. case 'content-validations': break; // 9.4.4 <table:
  28273. case 'content-validation': break; // 9.4.5 <table:
  28274. case 'help-message': break; // 9.4.6 <table:
  28275. case 'error-message': break; // 9.4.7 <table:
  28276. case 'database-ranges': break; // 9.4.14 <table:database-ranges>
  28277. case 'filter': break; // 9.5.2 <table:filter>
  28278. case 'filter-and': break; // 9.5.3 <table:filter-and>
  28279. case 'filter-or': break; // 9.5.4 <table:filter-or>
  28280. case 'filter-condition': break; // 9.5.5 <table:filter-condition>
  28281. case 'list-level-style-bullet': break; // 16.31 <text:
  28282. case 'list-level-style-number': break; // 16.32 <text:
  28283. case 'list-level-properties': break; // 17.19 <style:
  28284. /* 7.3 Document Fields */
  28285. case 'sender-firstname': // 7.3.6.2
  28286. case 'sender-lastname': // 7.3.6.3
  28287. case 'sender-initials': // 7.3.6.4
  28288. case 'sender-title': // 7.3.6.5
  28289. case 'sender-position': // 7.3.6.6
  28290. case 'sender-email': // 7.3.6.7
  28291. case 'sender-phone-private': // 7.3.6.8
  28292. case 'sender-fax': // 7.3.6.9
  28293. case 'sender-company': // 7.3.6.10
  28294. case 'sender-phone-work': // 7.3.6.11
  28295. case 'sender-street': // 7.3.6.12
  28296. case 'sender-city': // 7.3.6.13
  28297. case 'sender-postal-code': // 7.3.6.14
  28298. case 'sender-country': // 7.3.6.15
  28299. case 'sender-state-or-province': // 7.3.6.16
  28300. case 'author-name': // 7.3.7.1
  28301. case 'author-initials': // 7.3.7.2
  28302. case 'chapter': // 7.3.8
  28303. case 'file-name': // 7.3.9
  28304. case 'template-name': // 7.3.9
  28305. case 'sheet-name': // 7.3.9
  28306. break;
  28307. case 'event-listener':
  28308. break;
  28309. /* TODO: FODS Properties */
  28310. case 'initial-creator':
  28311. case 'creation-date':
  28312. case 'print-date':
  28313. case 'generator':
  28314. case 'document-statistic':
  28315. case 'user-defined':
  28316. case 'editing-duration':
  28317. case 'editing-cycles':
  28318. break;
  28319. /* TODO: FODS Config */
  28320. case 'config-item':
  28321. break;
  28322. /* TODO: style tokens */
  28323. case 'page-number': break; // TODO <text:page-number>
  28324. case 'page-count': break; // TODO <text:page-count>
  28325. case 'time': break; // TODO <text:time>
  28326. /* 9.3 Advanced Table Cells */
  28327. case 'cell-range-source': break; // 9.3.1 <table:
  28328. case 'detective': break; // 9.3.2 <table:
  28329. case 'operation': break; // 9.3.3 <table:
  28330. case 'highlighted-range': break; // 9.3.4 <table:
  28331. /* 9.6 Data Pilot Tables <table: */
  28332. case 'data-pilot-table': // 9.6.3
  28333. case 'source-cell-range': // 9.6.5
  28334. case 'source-service': // 9.6.6
  28335. case 'data-pilot-field': // 9.6.7
  28336. case 'data-pilot-level': // 9.6.8
  28337. case 'data-pilot-subtotals': // 9.6.9
  28338. case 'data-pilot-subtotal': // 9.6.10
  28339. case 'data-pilot-members': // 9.6.11
  28340. case 'data-pilot-member': // 9.6.12
  28341. case 'data-pilot-display-info': // 9.6.13
  28342. case 'data-pilot-sort-info': // 9.6.14
  28343. case 'data-pilot-layout-info': // 9.6.15
  28344. case 'data-pilot-field-reference': // 9.6.16
  28345. case 'data-pilot-groups': // 9.6.17
  28346. case 'data-pilot-group': // 9.6.18
  28347. case 'data-pilot-group-member': // 9.6.19
  28348. break;
  28349. /* 10.3 Drawing Shapes */
  28350. case 'rect': // 10.3.2
  28351. break;
  28352. /* 14.6 DDE Connections */
  28353. case 'dde-connection-decls': // 14.6.2 <text:
  28354. case 'dde-connection-decl': // 14.6.3 <text:
  28355. case 'dde-link': // 14.6.4 <table:
  28356. case 'dde-source': // 14.6.5 <office:
  28357. break;
  28358. case 'properties': break; // 13.7 <form:properties>
  28359. case 'property': break; // 13.8 <form:property>
  28360. case 'a': // 6.1.8 hyperlink
  28361. if(Rn[1]!== '/') {
  28362. atag = parsexmltag(Rn[0], false);
  28363. if(!atag.href) break;
  28364. atag.Target = atag.href; delete atag.href;
  28365. if(atag.Target.charAt(0) == "#" && atag.Target.indexOf(".") > -1) {
  28366. _Ref = ods_to_csf_3D(atag.Target.slice(1));
  28367. atag.Target = "#" + _Ref[0] + "!" + _Ref[1];
  28368. }
  28369. }
  28370. break;
  28371. /* non-standard */
  28372. case 'table-protection': break;
  28373. case 'data-pilot-grand-total': break; // <table:
  28374. case 'office-document-common-attrs': break; // bare
  28375. default: switch(Rn[2]) {
  28376. case 'dc:': // TODO: properties
  28377. case 'calcext:': // ignore undocumented extensions
  28378. case 'loext:': // ignore undocumented extensions
  28379. case 'ooo:': // ignore undocumented extensions
  28380. case 'chartooo:': // ignore undocumented extensions
  28381. case 'draw:': // TODO: drawing
  28382. case 'style:': // TODO: styles
  28383. case 'chart:': // TODO: charts
  28384. case 'form:': // TODO: forms
  28385. case 'uof:': // TODO: uof
  28386. case '表:': // TODO: uof
  28387. case '字:': // TODO: uof
  28388. break;
  28389. default: if(opts.WTF) throw new Error(Rn);
  28390. }
  28391. }
  28392. var out = ({
  28393. Sheets: Sheets,
  28394. SheetNames: SheetNames,
  28395. Workbook: WB
  28396. });
  28397. if(opts.bookSheets) delete out.Sheets;
  28398. return out;
  28399. };
  28400. })();
  28401. function parse_ods(zip, opts) {
  28402. opts = opts || ({});
  28403. var ods = !!safegetzipfile(zip, 'objectdata');
  28404. if(ods) parse_manifest(getzipdata(zip, 'META-INF/manifest.xml'), opts);
  28405. var content = getzipstr(zip, 'content.xml');
  28406. if(!content) throw new Error("Missing content.xml in " + (ods ? "ODS" : "UOF")+ " file");
  28407. var wb = parse_content_xml(ods ? content : utf8read(content), opts);
  28408. if(safegetzipfile(zip, 'meta.xml')) wb.Props = parse_core_props(getzipdata(zip, 'meta.xml'));
  28409. return wb;
  28410. }
  28411. function parse_fods(data, opts) {
  28412. return parse_content_xml(data, opts);
  28413. }
  28414. /* OpenDocument */
  28415. var write_styles_ods = (function() {
  28416. var payload = '<office:document-styles ' + wxt_helper({
  28417. 'xmlns:office': "urn:oasis:names:tc:opendocument:xmlns:office:1.0",
  28418. 'xmlns:table': "urn:oasis:names:tc:opendocument:xmlns:table:1.0",
  28419. 'xmlns:style': "urn:oasis:names:tc:opendocument:xmlns:style:1.0",
  28420. 'xmlns:text': "urn:oasis:names:tc:opendocument:xmlns:text:1.0",
  28421. 'xmlns:draw': "urn:oasis:names:tc:opendocument:xmlns:drawing:1.0",
  28422. 'xmlns:fo': "urn:oasis:names:tc:opendocument:xmlns:xsl-fo-compatible:1.0",
  28423. 'xmlns:xlink': "http://www.w3.org/1999/xlink",
  28424. 'xmlns:dc': "http://purl.org/dc/elements/1.1/",
  28425. 'xmlns:number': "urn:oasis:names:tc:opendocument:xmlns:datastyle:1.0",
  28426. 'xmlns:svg': "urn:oasis:names:tc:opendocument:xmlns:svg-compatible:1.0",
  28427. 'xmlns:of': "urn:oasis:names:tc:opendocument:xmlns:of:1.2",
  28428. 'office:version': "1.2"
  28429. }) + '></office:document-styles>';
  28430. return function wso() {
  28431. return XML_HEADER + payload;
  28432. };
  28433. })();
  28434. var write_content_ods = (function() {
  28435. /* 6.1.2 White Space Characters */
  28436. var write_text_p = function(text) {
  28437. return escapexml(text)
  28438. .replace(/ +/g, function($$){return '<text:s text:c="'+$$.length+'"/>';})
  28439. .replace(/\t/g, "<text:tab/>")
  28440. .replace(/\n/g, "<text:line-break/>")
  28441. .replace(/^ /, "<text:s/>").replace(/ $/, "<text:s/>");
  28442. };
  28443. var null_cell_xml = ' <table:table-cell />\n';
  28444. var covered_cell_xml = ' <table:covered-table-cell/>\n';
  28445. var write_ws = function(ws, wb, i) {
  28446. /* Section 9 Tables */
  28447. var o = [];
  28448. o.push(' <table:table table:name="' + escapexml(wb.SheetNames[i]) + '" table:style-name="ta1">\n');
  28449. var R=0,C=0, range = decode_range(ws['!ref']);
  28450. var marr = ws['!merges'] || [], mi = 0;
  28451. var dense = Array.isArray(ws);
  28452. for(R = 0; R < range.s.r; ++R) o.push(' <table:table-row></table:table-row>\n');
  28453. for(; R <= range.e.r; ++R) {
  28454. o.push(' <table:table-row>\n');
  28455. for(C=0; C < range.s.c; ++C) o.push(null_cell_xml);
  28456. for(; C <= range.e.c; ++C) {
  28457. var skip = false, ct = {}, textp = "";
  28458. for(mi = 0; mi != marr.length; ++mi) {
  28459. if(marr[mi].s.c > C) continue;
  28460. if(marr[mi].s.r > R) continue;
  28461. if(marr[mi].e.c < C) continue;
  28462. if(marr[mi].e.r < R) continue;
  28463. if(marr[mi].s.c != C || marr[mi].s.r != R) skip = true;
  28464. ct['table:number-columns-spanned'] = (marr[mi].e.c - marr[mi].s.c + 1);
  28465. ct['table:number-rows-spanned'] = (marr[mi].e.r - marr[mi].s.r + 1);
  28466. break;
  28467. }
  28468. if(skip) { o.push(covered_cell_xml); continue; }
  28469. var ref = encode_cell({r:R, c:C}), cell = dense ? (ws[R]||[])[C]: ws[ref];
  28470. if(cell && cell.f) {
  28471. ct['table:formula'] = escapexml(csf_to_ods_formula(cell.f));
  28472. if(cell.F) {
  28473. if(cell.F.slice(0, ref.length) == ref) {
  28474. var _Fref = decode_range(cell.F);
  28475. ct['table:number-matrix-columns-spanned'] = (_Fref.e.c - _Fref.s.c + 1);
  28476. ct['table:number-matrix-rows-spanned'] = (_Fref.e.r - _Fref.s.r + 1);
  28477. }
  28478. }
  28479. }
  28480. if(!cell) { o.push(null_cell_xml); continue; }
  28481. switch(cell.t) {
  28482. case 'b':
  28483. textp = (cell.v ? 'TRUE' : 'FALSE');
  28484. ct['office:value-type'] = "boolean";
  28485. ct['office:boolean-value'] = (cell.v ? 'true' : 'false');
  28486. break;
  28487. case 'n':
  28488. textp = (cell.w||String(cell.v||0));
  28489. ct['office:value-type'] = "float";
  28490. ct['office:value'] = (cell.v||0);
  28491. break;
  28492. case 's': case 'str':
  28493. textp = cell.v == null ? "" : cell.v;
  28494. ct['office:value-type'] = "string";
  28495. break;
  28496. case 'd':
  28497. textp = (cell.w||(parseDate(cell.v).toISOString()));
  28498. ct['office:value-type'] = "date";
  28499. ct['office:date-value'] = (parseDate(cell.v).toISOString());
  28500. ct['table:style-name'] = "ce1";
  28501. break;
  28502. //case 'e':
  28503. default: o.push(null_cell_xml); continue;
  28504. }
  28505. var text_p = write_text_p(textp);
  28506. if(cell.l && cell.l.Target) {
  28507. var _tgt = cell.l.Target; _tgt = _tgt.charAt(0) == "#" ? "#" + csf_to_ods_3D(_tgt.slice(1)) : _tgt;
  28508. text_p = writextag('text:a', text_p, {'xlink:href': _tgt});
  28509. }
  28510. o.push(' ' + writextag('table:table-cell', writextag('text:p', text_p, {}), ct) + '\n');
  28511. }
  28512. o.push(' </table:table-row>\n');
  28513. }
  28514. o.push(' </table:table>\n');
  28515. return o.join("");
  28516. };
  28517. var write_automatic_styles_ods = function(o) {
  28518. o.push(' <office:automatic-styles>\n');
  28519. o.push(' <number:date-style style:name="N37" number:automatic-order="true">\n');
  28520. o.push(' <number:month number:style="long"/>\n');
  28521. o.push(' <number:text>/</number:text>\n');
  28522. o.push(' <number:day number:style="long"/>\n');
  28523. o.push(' <number:text>/</number:text>\n');
  28524. o.push(' <number:year/>\n');
  28525. o.push(' </number:date-style>\n');
  28526. /* table */
  28527. o.push(' <style:style style:name="ta1" style:family="table">\n'); // style:master-page-name="mp1">\n');
  28528. o.push(' <style:table-properties table:display="true" style:writing-mode="lr-tb"/>\n');
  28529. o.push(' </style:style>\n');
  28530. /* table cells, text */
  28531. o.push(' <style:style style:name="ce1" style:family="table-cell" style:parent-style-name="Default" style:data-style-name="N37"/>\n');
  28532. /* page-layout */
  28533. o.push(' </office:automatic-styles>\n');
  28534. };
  28535. return function wcx(wb, opts) {
  28536. var o = [XML_HEADER];
  28537. /* 3.1.3.2 */
  28538. var attr = wxt_helper({
  28539. 'xmlns:office': "urn:oasis:names:tc:opendocument:xmlns:office:1.0",
  28540. 'xmlns:table': "urn:oasis:names:tc:opendocument:xmlns:table:1.0",
  28541. 'xmlns:style': "urn:oasis:names:tc:opendocument:xmlns:style:1.0",
  28542. 'xmlns:text': "urn:oasis:names:tc:opendocument:xmlns:text:1.0",
  28543. 'xmlns:draw': "urn:oasis:names:tc:opendocument:xmlns:drawing:1.0",
  28544. 'xmlns:fo': "urn:oasis:names:tc:opendocument:xmlns:xsl-fo-compatible:1.0",
  28545. 'xmlns:xlink': "http://www.w3.org/1999/xlink",
  28546. 'xmlns:dc': "http://purl.org/dc/elements/1.1/",
  28547. 'xmlns:meta': "urn:oasis:names:tc:opendocument:xmlns:meta:1.0",
  28548. 'xmlns:number': "urn:oasis:names:tc:opendocument:xmlns:datastyle:1.0",
  28549. 'xmlns:presentation': "urn:oasis:names:tc:opendocument:xmlns:presentation:1.0",
  28550. 'xmlns:svg': "urn:oasis:names:tc:opendocument:xmlns:svg-compatible:1.0",
  28551. 'xmlns:chart': "urn:oasis:names:tc:opendocument:xmlns:chart:1.0",
  28552. 'xmlns:dr3d': "urn:oasis:names:tc:opendocument:xmlns:dr3d:1.0",
  28553. 'xmlns:math': "http://www.w3.org/1998/Math/MathML",
  28554. 'xmlns:form': "urn:oasis:names:tc:opendocument:xmlns:form:1.0",
  28555. 'xmlns:script': "urn:oasis:names:tc:opendocument:xmlns:script:1.0",
  28556. 'xmlns:ooo': "http://openoffice.org/2004/office",
  28557. 'xmlns:ooow': "http://openoffice.org/2004/writer",
  28558. 'xmlns:oooc': "http://openoffice.org/2004/calc",
  28559. 'xmlns:dom': "http://www.w3.org/2001/xml-events",
  28560. 'xmlns:xforms': "http://www.w3.org/2002/xforms",
  28561. 'xmlns:xsd': "http://www.w3.org/2001/XMLSchema",
  28562. 'xmlns:xsi': "http://www.w3.org/2001/XMLSchema-instance",
  28563. 'xmlns:sheet': "urn:oasis:names:tc:opendocument:sh33tjs:1.0",
  28564. 'xmlns:rpt': "http://openoffice.org/2005/report",
  28565. 'xmlns:of': "urn:oasis:names:tc:opendocument:xmlns:of:1.2",
  28566. 'xmlns:xhtml': "http://www.w3.org/1999/xhtml",
  28567. 'xmlns:grddl': "http://www.w3.org/2003/g/data-view#",
  28568. 'xmlns:tableooo': "http://openoffice.org/2009/table",
  28569. 'xmlns:drawooo': "http://openoffice.org/2010/draw",
  28570. 'xmlns:calcext': "urn:org:documentfoundation:names:experimental:calc:xmlns:calcext:1.0",
  28571. 'xmlns:loext': "urn:org:documentfoundation:names:experimental:office:xmlns:loext:1.0",
  28572. 'xmlns:field': "urn:openoffice:names:experimental:ooo-ms-interop:xmlns:field:1.0",
  28573. 'xmlns:formx': "urn:openoffice:names:experimental:ooxml-odf-interop:xmlns:form:1.0",
  28574. 'xmlns:css3t': "http://www.w3.org/TR/css3-text/",
  28575. 'office:version': "1.2"
  28576. });
  28577. var fods = wxt_helper({
  28578. 'xmlns:config': "urn:oasis:names:tc:opendocument:xmlns:config:1.0",
  28579. 'office:mimetype': "application/vnd.oasis.opendocument.spreadsheet"
  28580. });
  28581. if(opts.bookType == "fods") o.push('<office:document' + attr + fods + '>\n');
  28582. else o.push('<office:document-content' + attr + '>\n');
  28583. write_automatic_styles_ods(o);
  28584. o.push(' <office:body>\n');
  28585. o.push(' <office:spreadsheet>\n');
  28586. for(var i = 0; i != wb.SheetNames.length; ++i) o.push(write_ws(wb.Sheets[wb.SheetNames[i]], wb, i, opts));
  28587. o.push(' </office:spreadsheet>\n');
  28588. o.push(' </office:body>\n');
  28589. if(opts.bookType == "fods") o.push('</office:document>');
  28590. else o.push('</office:document-content>');
  28591. return o.join("");
  28592. };
  28593. })();
  28594. function write_ods(wb, opts) {
  28595. if(opts.bookType == "fods") return write_content_ods(wb, opts);
  28596. var zip = zip_new();
  28597. var f = "";
  28598. var manifest = [];
  28599. var rdf = [];
  28600. /* Part 3 Section 3.3 MIME Media Type */
  28601. f = "mimetype";
  28602. zip_add_file(zip, f, "application/vnd.oasis.opendocument.spreadsheet");
  28603. /* Part 1 Section 2.2 Documents */
  28604. f = "content.xml";
  28605. zip_add_file(zip, f, write_content_ods(wb, opts));
  28606. manifest.push([f, "text/xml"]);
  28607. rdf.push([f, "ContentFile"]);
  28608. /* TODO: these are hard-coded styles to satiate excel */
  28609. f = "styles.xml";
  28610. zip_add_file(zip, f, write_styles_ods(wb, opts));
  28611. manifest.push([f, "text/xml"]);
  28612. rdf.push([f, "StylesFile"]);
  28613. /* TODO: this is hard-coded to satiate excel */
  28614. f = "meta.xml";
  28615. zip_add_file(zip, f, write_meta_ods());
  28616. manifest.push([f, "text/xml"]);
  28617. rdf.push([f, "MetadataFile"]);
  28618. /* Part 3 Section 6 Metadata Manifest File */
  28619. f = "manifest.rdf";
  28620. zip_add_file(zip, f, write_rdf(rdf/*, opts*/));
  28621. manifest.push([f, "application/rdf+xml"]);
  28622. /* Part 3 Section 4 Manifest File */
  28623. f = "META-INF/manifest.xml";
  28624. zip_add_file(zip, f, write_manifest(manifest/*, opts*/));
  28625. return zip;
  28626. }
  28627. function write_sheet_index(wb, sheet) {
  28628. if(!sheet) return 0;
  28629. var idx = wb.SheetNames.indexOf(sheet);
  28630. if(idx == -1) throw new Error("Sheet not found: " + sheet);
  28631. return idx;
  28632. }
  28633. function write_obj_str(factory) {
  28634. return function write_str(wb, o) {
  28635. var idx = write_sheet_index(wb, o.sheet);
  28636. return factory.from_sheet(wb.Sheets[wb.SheetNames[idx]], o, wb);
  28637. };
  28638. }
  28639. var write_htm_str = write_obj_str(HTML_);
  28640. var write_csv_str = write_obj_str({from_sheet:sheet_to_csv});
  28641. var write_slk_str = write_obj_str(typeof SYLK !== "undefined" ? SYLK : {});
  28642. var write_dif_str = write_obj_str(typeof DIF !== "undefined" ? DIF : {});
  28643. var write_prn_str = write_obj_str(typeof PRN !== "undefined" ? PRN : {});
  28644. var write_rtf_str = write_obj_str(typeof RTF !== "undefined" ? RTF : {});
  28645. var write_txt_str = write_obj_str({from_sheet:sheet_to_txt});
  28646. var write_dbf_buf = write_obj_str(typeof DBF !== "undefined" ? DBF : {});
  28647. var write_eth_str = write_obj_str(typeof ETH !== "undefined" ? ETH : {});
  28648. function fix_opts_func(defaults) {
  28649. return function fix_opts(opts) {
  28650. for(var i = 0; i != defaults.length; ++i) {
  28651. var d = defaults[i];
  28652. if(opts[d[0]] === undefined) opts[d[0]] = d[1];
  28653. if(d[2] === 'n') opts[d[0]] = Number(opts[d[0]]);
  28654. }
  28655. };
  28656. }
  28657. var fix_read_opts = function(opts) {
  28658. fix_opts_func([
  28659. ['cellNF', false], /* emit cell number format string as .z */
  28660. ['cellHTML', true], /* emit html string as .h */
  28661. ['cellFormula', true], /* emit formulae as .f */
  28662. ['cellStyles', false], /* emits style/theme as .s */
  28663. ['cellText', true], /* emit formatted text as .w */
  28664. ['cellDates', false], /* emit date cells with type `d` */
  28665. ['sheetStubs', false], /* emit empty cells */
  28666. ['sheetRows', 0, 'n'], /* read n rows (0 = read all rows) */
  28667. ['bookDeps', false], /* parse calculation chains */
  28668. ['bookSheets', false], /* only try to get sheet names (no Sheets) */
  28669. ['bookProps', false], /* only try to get properties (no Sheets) */
  28670. ['bookFiles', false], /* include raw file structure (keys, files, cfb) */
  28671. ['bookVBA', false], /* include vba raw data (vbaraw) */
  28672. ['password',''], /* password */
  28673. ['WTF', false] /* WTF mode (throws errors) */
  28674. ])(opts);
  28675. };
  28676. var fix_write_opts = fix_opts_func([
  28677. ['cellDates', false], /* write date cells with type `d` */
  28678. ['bookSST', false], /* Generate Shared String Table */
  28679. ['bookType', 'xlsx'], /* Type of workbook (xlsx/m/b) */
  28680. ['compression', false], /* Use file compression */
  28681. ['WTF', false] /* WTF mode (throws errors) */
  28682. ]);
  28683. function get_sheet_type(n) {
  28684. if(RELS.WS.indexOf(n) > -1) return "sheet";
  28685. if(RELS.CS && n == RELS.CS) return "chart";
  28686. if(RELS.DS && n == RELS.DS) return "dialog";
  28687. if(RELS.MS && n == RELS.MS) return "macro";
  28688. return (n && n.length) ? n : "sheet";
  28689. }
  28690. function safe_parse_wbrels(wbrels, sheets) {
  28691. if(!wbrels) return 0;
  28692. try {
  28693. wbrels = sheets.map(function pwbr(w) { if(!w.id) w.id = w.strRelID; return [w.name, wbrels['!id'][w.id].Target, get_sheet_type(wbrels['!id'][w.id].Type)]; });
  28694. } catch(e) { return null; }
  28695. return !wbrels || wbrels.length === 0 ? null : wbrels;
  28696. }
  28697. function safe_parse_sheet(zip, path, relsPath, sheet, idx, sheetRels, sheets, stype, opts, wb, themes, styles) {
  28698. try {
  28699. sheetRels[sheet]=parse_rels(getzipstr(zip, relsPath, true), path);
  28700. var data = getzipdata(zip, path);
  28701. var _ws;
  28702. switch(stype) {
  28703. case 'sheet': _ws = parse_ws(data, path, idx, opts, sheetRels[sheet], wb, themes, styles); break;
  28704. case 'chart': _ws = parse_cs(data, path, idx, opts, sheetRels[sheet], wb, themes, styles);
  28705. if(!_ws || !_ws['!drawel']) break;
  28706. var dfile = resolve_path(_ws['!drawel'].Target, path);
  28707. var drelsp = get_rels_path(dfile);
  28708. var draw = parse_drawing(getzipstr(zip, dfile, true), parse_rels(getzipstr(zip, drelsp, true), dfile));
  28709. var chartp = resolve_path(draw, dfile);
  28710. var crelsp = get_rels_path(chartp);
  28711. _ws = parse_chart(getzipstr(zip, chartp, true), chartp, opts, parse_rels(getzipstr(zip, crelsp, true), chartp), wb, _ws);
  28712. break;
  28713. case 'macro': _ws = parse_ms(data, path, idx, opts, sheetRels[sheet], wb, themes, styles); break;
  28714. case 'dialog': _ws = parse_ds(data, path, idx, opts, sheetRels[sheet], wb, themes, styles); break;
  28715. default: throw new Error("Unrecognized sheet type " + stype);
  28716. }
  28717. sheets[sheet] = _ws;
  28718. /* scan rels for comments */
  28719. var comments = [];
  28720. if(sheetRels && sheetRels[sheet]) keys(sheetRels[sheet]).forEach(function(n) {
  28721. if(sheetRels[sheet][n].Type == RELS.CMNT) {
  28722. var dfile = resolve_path(sheetRels[sheet][n].Target, path);
  28723. comments = parse_cmnt(getzipdata(zip, dfile, true), dfile, opts);
  28724. if(!comments || !comments.length) return;
  28725. sheet_insert_comments(_ws, comments);
  28726. }
  28727. });
  28728. } catch(e) { if(opts.WTF) throw e; }
  28729. }
  28730. function strip_front_slash(x) { return x.charAt(0) == '/' ? x.slice(1) : x; }
  28731. function parse_zip(zip, opts) {
  28732. make_ssf(SSF);
  28733. opts = opts || {};
  28734. fix_read_opts(opts);
  28735. /* OpenDocument Part 3 Section 2.2.1 OpenDocument Package */
  28736. if(safegetzipfile(zip, 'META-INF/manifest.xml')) return parse_ods(zip, opts);
  28737. /* UOC */
  28738. if(safegetzipfile(zip, 'objectdata.xml')) return parse_ods(zip, opts);
  28739. /* Numbers */
  28740. if(safegetzipfile(zip, 'Index/Document.iwa')) throw new Error('Unsupported NUMBERS file');
  28741. var entries = zipentries(zip);
  28742. var dir = parse_ct((getzipstr(zip, '[Content_Types].xml')));
  28743. var xlsb = false;
  28744. var sheets, binname;
  28745. if(dir.workbooks.length === 0) {
  28746. binname = "xl/workbook.xml";
  28747. if(getzipdata(zip,binname, true)) dir.workbooks.push(binname);
  28748. }
  28749. if(dir.workbooks.length === 0) {
  28750. binname = "xl/workbook.bin";
  28751. if(!getzipdata(zip,binname,true)) throw new Error("Could not find workbook");
  28752. dir.workbooks.push(binname);
  28753. xlsb = true;
  28754. }
  28755. if(dir.workbooks[0].slice(-3) == "bin") xlsb = true;
  28756. var themes = ({});
  28757. var styles = ({});
  28758. if(!opts.bookSheets && !opts.bookProps) {
  28759. strs = [];
  28760. if(dir.sst) try { strs=parse_sst(getzipdata(zip, strip_front_slash(dir.sst)), dir.sst, opts); } catch(e) { if(opts.WTF) throw e; }
  28761. if(opts.cellStyles && dir.themes.length) themes = parse_theme(getzipstr(zip, dir.themes[0].replace(/^\//,''), true)||"",dir.themes[0], opts);
  28762. if(dir.style) styles = parse_sty(getzipdata(zip, strip_front_slash(dir.style)), dir.style, themes, opts);
  28763. }
  28764. /*var externbooks = */dir.links.map(function(link) {
  28765. try {
  28766. var rels = parse_rels(getzipstr(zip, get_rels_path(strip_front_slash(link))), link);
  28767. return parse_xlink(getzipdata(zip, strip_front_slash(link)), rels, link, opts);
  28768. } catch(e) {}
  28769. });
  28770. var wb = parse_wb(getzipdata(zip, strip_front_slash(dir.workbooks[0])), dir.workbooks[0], opts);
  28771. var props = {}, propdata = "";
  28772. if(dir.coreprops.length) {
  28773. propdata = getzipdata(zip, strip_front_slash(dir.coreprops[0]), true);
  28774. if(propdata) props = parse_core_props(propdata);
  28775. if(dir.extprops.length !== 0) {
  28776. propdata = getzipdata(zip, strip_front_slash(dir.extprops[0]), true);
  28777. if(propdata) parse_ext_props(propdata, props, opts);
  28778. }
  28779. }
  28780. var custprops = {};
  28781. if(!opts.bookSheets || opts.bookProps) {
  28782. if (dir.custprops.length !== 0) {
  28783. propdata = getzipstr(zip, strip_front_slash(dir.custprops[0]), true);
  28784. if(propdata) custprops = parse_cust_props(propdata, opts);
  28785. }
  28786. }
  28787. var out = ({});
  28788. if(opts.bookSheets || opts.bookProps) {
  28789. if(wb.Sheets) sheets = wb.Sheets.map(function pluck(x){ return x.name; });
  28790. else if(props.Worksheets && props.SheetNames.length > 0) sheets=props.SheetNames;
  28791. if(opts.bookProps) { out.Props = props; out.Custprops = custprops; }
  28792. if(opts.bookSheets && typeof sheets !== 'undefined') out.SheetNames = sheets;
  28793. if(opts.bookSheets ? out.SheetNames : opts.bookProps) return out;
  28794. }
  28795. sheets = {};
  28796. var deps = {};
  28797. if(opts.bookDeps && dir.calcchain) deps=parse_cc(getzipdata(zip, strip_front_slash(dir.calcchain)),dir.calcchain,opts);
  28798. var i=0;
  28799. var sheetRels = ({});
  28800. var path, relsPath;
  28801. {
  28802. var wbsheets = wb.Sheets;
  28803. props.Worksheets = wbsheets.length;
  28804. props.SheetNames = [];
  28805. for(var j = 0; j != wbsheets.length; ++j) {
  28806. props.SheetNames[j] = wbsheets[j].name;
  28807. }
  28808. }
  28809. var wbext = xlsb ? "bin" : "xml";
  28810. var wbrelsi = dir.workbooks[0].lastIndexOf("/");
  28811. var wbrelsfile = (dir.workbooks[0].slice(0, wbrelsi+1) + "_rels/" + dir.workbooks[0].slice(wbrelsi+1) + ".rels").replace(/^\//,"");
  28812. if(!safegetzipfile(zip, wbrelsfile)) wbrelsfile = 'xl/_rels/workbook.' + wbext + '.rels';
  28813. var wbrels = parse_rels(getzipstr(zip, wbrelsfile, true), wbrelsfile);
  28814. if(wbrels) wbrels = safe_parse_wbrels(wbrels, wb.Sheets);
  28815. /* Numbers iOS hack */
  28816. var nmode = (getzipdata(zip,"xl/worksheets/sheet.xml",true))?1:0;
  28817. wsloop: for(i = 0; i != props.Worksheets; ++i) {
  28818. var stype = "sheet";
  28819. if(wbrels && wbrels[i]) {
  28820. path = 'xl/' + (wbrels[i][1]).replace(/[\/]?xl\//, "");
  28821. if(!safegetzipfile(zip, path)) path = wbrels[i][1];
  28822. if(!safegetzipfile(zip, path)) path = wbrelsfile.replace(/_rels\/.*$/,"") + wbrels[i][1];
  28823. stype = wbrels[i][2];
  28824. } else {
  28825. path = 'xl/worksheets/sheet'+(i+1-nmode)+"." + wbext;
  28826. path = path.replace(/sheet0\./,"sheet.");
  28827. }
  28828. relsPath = path.replace(/^(.*)(\/)([^\/]*)$/, "$1/_rels/$3.rels");
  28829. if(opts && opts.sheets != null) switch(typeof opts.sheets) {
  28830. case "number": if(i != opts.sheets) continue wsloop; break;
  28831. case "string": if(props.SheetNames[i].toLowerCase() != opts.sheets.toLowerCase()) continue wsloop; break;
  28832. default: if(Array.isArray && Array.isArray(opts.sheets)) {
  28833. var snjseen = false;
  28834. for(var snj = 0; snj != opts.sheets.length; ++snj) {
  28835. if(typeof opts.sheets[snj] == "number" && opts.sheets[snj] == i) snjseen=1;
  28836. if(typeof opts.sheets[snj] == "string" && opts.sheets[snj].toLowerCase() == props.SheetNames[i].toLowerCase()) snjseen = 1;
  28837. }
  28838. if(!snjseen) continue wsloop;
  28839. }
  28840. }
  28841. safe_parse_sheet(zip, path, relsPath, props.SheetNames[i], i, sheetRels, sheets, stype, opts, wb, themes, styles);
  28842. }
  28843. out = ({
  28844. Directory: dir,
  28845. Workbook: wb,
  28846. Props: props,
  28847. Custprops: custprops,
  28848. Deps: deps,
  28849. Sheets: sheets,
  28850. SheetNames: props.SheetNames,
  28851. Strings: strs,
  28852. Styles: styles,
  28853. Themes: themes,
  28854. SSF: SSF.get_table()
  28855. });
  28856. if(opts && opts.bookFiles) {
  28857. out.keys = entries;
  28858. out.files = zip.files;
  28859. }
  28860. if(opts && opts.bookVBA) {
  28861. if(dir.vba.length > 0) out.vbaraw = getzipdata(zip,strip_front_slash(dir.vba[0]),true);
  28862. else if(dir.defaults && dir.defaults.bin === CT_VBA) out.vbaraw = getzipdata(zip, 'xl/vbaProject.bin',true);
  28863. }
  28864. return out;
  28865. }
  28866. /* [MS-OFFCRYPTO] 2.1.1 */
  28867. function parse_xlsxcfb(cfb, _opts) {
  28868. var opts = _opts || {};
  28869. var f = 'Workbook', data = CFB.find(cfb, f);
  28870. try {
  28871. f = '/!DataSpaces/Version';
  28872. data = CFB.find(cfb, f); if(!data || !data.content) throw new Error("ECMA-376 Encrypted file missing " + f);
  28873. /*var version = */parse_DataSpaceVersionInfo(data.content);
  28874. /* 2.3.4.1 */
  28875. f = '/!DataSpaces/DataSpaceMap';
  28876. data = CFB.find(cfb, f); if(!data || !data.content) throw new Error("ECMA-376 Encrypted file missing " + f);
  28877. var dsm = parse_DataSpaceMap(data.content);
  28878. if(dsm.length !== 1 || dsm[0].comps.length !== 1 || dsm[0].comps[0].t !== 0 || dsm[0].name !== "StrongEncryptionDataSpace" || dsm[0].comps[0].v !== "EncryptedPackage")
  28879. throw new Error("ECMA-376 Encrypted file bad " + f);
  28880. /* 2.3.4.2 */
  28881. f = '/!DataSpaces/DataSpaceInfo/StrongEncryptionDataSpace';
  28882. data = CFB.find(cfb, f); if(!data || !data.content) throw new Error("ECMA-376 Encrypted file missing " + f);
  28883. var seds = parse_DataSpaceDefinition(data.content);
  28884. if(seds.length != 1 || seds[0] != "StrongEncryptionTransform")
  28885. throw new Error("ECMA-376 Encrypted file bad " + f);
  28886. /* 2.3.4.3 */
  28887. f = '/!DataSpaces/TransformInfo/StrongEncryptionTransform/!Primary';
  28888. data = CFB.find(cfb, f); if(!data || !data.content) throw new Error("ECMA-376 Encrypted file missing " + f);
  28889. /*var hdr = */parse_Primary(data.content);
  28890. } catch(e) {}
  28891. f = '/EncryptionInfo';
  28892. data = CFB.find(cfb, f); if(!data || !data.content) throw new Error("ECMA-376 Encrypted file missing " + f);
  28893. var einfo = parse_EncryptionInfo(data.content);
  28894. /* 2.3.4.4 */
  28895. f = '/EncryptedPackage';
  28896. data = CFB.find(cfb, f); if(!data || !data.content) throw new Error("ECMA-376 Encrypted file missing " + f);
  28897. /*global decrypt_agile */
  28898. if(einfo[0] == 0x04 && typeof decrypt_agile !== 'undefined') return decrypt_agile(einfo[1], data.content, opts.password || "", opts);
  28899. /*global decrypt_std76 */
  28900. if(einfo[0] == 0x02 && typeof decrypt_std76 !== 'undefined') return decrypt_std76(einfo[1], data.content, opts.password || "", opts);
  28901. throw new Error("File is password-protected");
  28902. }
  28903. function write_zip(wb, opts) {
  28904. _shapeid = 1024;
  28905. if(opts.bookType == "ods") return write_ods(wb, opts);
  28906. if(wb && !wb.SSF) {
  28907. wb.SSF = SSF.get_table();
  28908. }
  28909. if(wb && wb.SSF) {
  28910. make_ssf(SSF); SSF.load_table(wb.SSF);
  28911. // $FlowIgnore
  28912. opts.revssf = evert_num(wb.SSF); opts.revssf[wb.SSF[65535]] = 0;
  28913. opts.ssf = wb.SSF;
  28914. }
  28915. opts.rels = {}; opts.wbrels = {};
  28916. opts.Strings = []; opts.Strings.Count = 0; opts.Strings.Unique = 0;
  28917. if(browser_has_Map) opts.revStrings = new Map();
  28918. else { opts.revStrings = {}; opts.revStrings.foo = []; delete opts.revStrings.foo; }
  28919. var wbext = opts.bookType == "xlsb" ? "bin" : "xml";
  28920. var vbafmt = VBAFMTS.indexOf(opts.bookType) > -1;
  28921. var ct = new_ct();
  28922. fix_write_opts(opts = opts || {});
  28923. var zip = zip_new();
  28924. var f = "", rId = 0;
  28925. opts.cellXfs = [];
  28926. get_cell_style(opts.cellXfs, {}, {revssf:{"General":0}});
  28927. if(!wb.Props) wb.Props = {};
  28928. f = "docProps/core.xml";
  28929. zip_add_file(zip, f, write_core_props(wb.Props, opts));
  28930. ct.coreprops.push(f);
  28931. add_rels(opts.rels, 2, f, RELS.CORE_PROPS);
  28932. f = "docProps/app.xml";
  28933. if(wb.Props && wb.Props.SheetNames){/* empty */}
  28934. else if(!wb.Workbook || !wb.Workbook.Sheets) wb.Props.SheetNames = wb.SheetNames;
  28935. else {
  28936. var _sn = [];
  28937. for(var _i = 0; _i < wb.SheetNames.length; ++_i)
  28938. if((wb.Workbook.Sheets[_i]||{}).Hidden != 2) _sn.push(wb.SheetNames[_i]);
  28939. wb.Props.SheetNames = _sn;
  28940. }
  28941. wb.Props.Worksheets = wb.Props.SheetNames.length;
  28942. zip_add_file(zip, f, write_ext_props(wb.Props, opts));
  28943. ct.extprops.push(f);
  28944. add_rels(opts.rels, 3, f, RELS.EXT_PROPS);
  28945. if(wb.Custprops !== wb.Props && keys(wb.Custprops||{}).length > 0) {
  28946. f = "docProps/custom.xml";
  28947. zip_add_file(zip, f, write_cust_props(wb.Custprops, opts));
  28948. ct.custprops.push(f);
  28949. add_rels(opts.rels, 4, f, RELS.CUST_PROPS);
  28950. }
  28951. for(rId=1;rId <= wb.SheetNames.length; ++rId) {
  28952. var wsrels = {'!id':{}};
  28953. var ws = wb.Sheets[wb.SheetNames[rId-1]];
  28954. var _type = (ws || {})["!type"] || "sheet";
  28955. switch(_type) {
  28956. case "chart":
  28957. /* falls through */
  28958. default:
  28959. f = "xl/worksheets/sheet" + rId + "." + wbext;
  28960. zip_add_file(zip, f, write_ws(rId-1, f, opts, wb, wsrels));
  28961. ct.sheets.push(f);
  28962. add_rels(opts.wbrels, -1, "worksheets/sheet" + rId + "." + wbext, RELS.WS[0]);
  28963. }
  28964. if(ws) {
  28965. var comments = ws['!comments'];
  28966. var need_vml = false;
  28967. if(comments && comments.length > 0) {
  28968. var cf = "xl/comments" + rId + "." + wbext;
  28969. zip_add_file(zip, cf, write_cmnt(comments, cf, opts));
  28970. ct.comments.push(cf);
  28971. add_rels(wsrels, -1, "../comments" + rId + "." + wbext, RELS.CMNT);
  28972. need_vml = true;
  28973. }
  28974. if(ws['!legacy']) {
  28975. if(need_vml) zip_add_file(zip, "xl/drawings/vmlDrawing" + (rId) + ".vml", write_comments_vml(rId, ws['!comments']));
  28976. }
  28977. delete ws['!comments'];
  28978. delete ws['!legacy'];
  28979. }
  28980. if(wsrels['!id'].rId1) zip_add_file(zip, get_rels_path(f), write_rels(wsrels));
  28981. }
  28982. if(opts.Strings != null && opts.Strings.length > 0) {
  28983. f = "xl/sharedStrings." + wbext;
  28984. zip_add_file(zip, f, write_sst(opts.Strings, f, opts));
  28985. ct.strs.push(f);
  28986. add_rels(opts.wbrels, -1, "sharedStrings." + wbext, RELS.SST);
  28987. }
  28988. f = "xl/workbook." + wbext;
  28989. zip_add_file(zip, f, write_wb(wb, f, opts));
  28990. ct.workbooks.push(f);
  28991. add_rels(opts.rels, 1, f, RELS.WB);
  28992. /* TODO: something more intelligent with themes */
  28993. f = "xl/theme/theme1.xml";
  28994. zip_add_file(zip, f, write_theme(wb.Themes, opts));
  28995. ct.themes.push(f);
  28996. add_rels(opts.wbrels, -1, "theme/theme1.xml", RELS.THEME);
  28997. /* TODO: something more intelligent with styles */
  28998. f = "xl/styles." + wbext;
  28999. zip_add_file(zip, f, write_sty(wb, f, opts));
  29000. ct.styles.push(f);
  29001. add_rels(opts.wbrels, -1, "styles." + wbext, RELS.STY);
  29002. if(wb.vbaraw && vbafmt) {
  29003. f = "xl/vbaProject.bin";
  29004. zip_add_file(zip, f, wb.vbaraw);
  29005. ct.vba.push(f);
  29006. add_rels(opts.wbrels, -1, "vbaProject.bin", RELS.VBA);
  29007. }
  29008. zip_add_file(zip, "[Content_Types].xml", write_ct(ct, opts));
  29009. zip_add_file(zip, '_rels/.rels', write_rels(opts.rels));
  29010. zip_add_file(zip, 'xl/_rels/workbook.' + wbext + '.rels', write_rels(opts.wbrels));
  29011. delete opts.revssf; delete opts.ssf;
  29012. return zip;
  29013. }
  29014. function firstbyte(f,o) {
  29015. var x = "";
  29016. switch((o||{}).type || "base64") {
  29017. case 'buffer': return [f[0], f[1], f[2], f[3], f[4], f[5], f[6], f[7]];
  29018. case 'base64': x = Base64.decode(f.slice(0,12)); break;
  29019. case 'binary': x = f; break;
  29020. case 'array': return [f[0], f[1], f[2], f[3], f[4], f[5], f[6], f[7]];
  29021. default: throw new Error("Unrecognized type " + (o && o.type || "undefined"));
  29022. }
  29023. return [x.charCodeAt(0), x.charCodeAt(1), x.charCodeAt(2), x.charCodeAt(3), x.charCodeAt(4), x.charCodeAt(5), x.charCodeAt(6), x.charCodeAt(7)];
  29024. }
  29025. function read_cfb(cfb, opts) {
  29026. if(CFB.find(cfb, "EncryptedPackage")) return parse_xlsxcfb(cfb, opts);
  29027. return parse_xlscfb(cfb, opts);
  29028. }
  29029. function read_zip(data, opts) {
  29030. var zip, d = data;
  29031. var o = opts||{};
  29032. if(!o.type) o.type = (has_buf && Buffer.isBuffer(data)) ? "buffer" : "base64";
  29033. zip = zip_read(d, o);
  29034. return parse_zip(zip, o);
  29035. }
  29036. function read_plaintext(data, o) {
  29037. var i = 0;
  29038. main: while(i < data.length) switch(data.charCodeAt(i)) {
  29039. case 0x0A: case 0x0D: case 0x20: ++i; break;
  29040. case 0x3C: return parse_xlml(data.slice(i),o);
  29041. default: break main;
  29042. }
  29043. return PRN.to_workbook(data, o);
  29044. }
  29045. function read_plaintext_raw(data, o) {
  29046. var str = "", bytes = firstbyte(data, o);
  29047. switch(o.type) {
  29048. case 'base64': str = Base64.decode(data); break;
  29049. case 'binary': str = data; break;
  29050. case 'buffer': str = data.toString('binary'); break;
  29051. case 'array': str = cc2str(data); break;
  29052. default: throw new Error("Unrecognized type " + o.type);
  29053. }
  29054. if(bytes[0] == 0xEF && bytes[1] == 0xBB && bytes[2] == 0xBF) str = utf8read(str);
  29055. return read_plaintext(str, o);
  29056. }
  29057. function read_utf16(data, o) {
  29058. var d = data;
  29059. if(o.type == 'base64') d = Base64.decode(d);
  29060. d = cptable.utils.decode(1200, d.slice(2), 'str');
  29061. o.type = "binary";
  29062. return read_plaintext(d, o);
  29063. }
  29064. function bstrify(data) {
  29065. return !data.match(/[^\x00-\x7F]/) ? data : utf8write(data);
  29066. }
  29067. function read_prn(data, d, o, str) {
  29068. if(str) { o.type = "string"; return PRN.to_workbook(data, o); }
  29069. return PRN.to_workbook(d, o);
  29070. }
  29071. function readSync(data, opts) {
  29072. reset_cp();
  29073. if(typeof ArrayBuffer !== 'undefined' && data instanceof ArrayBuffer) return readSync(new Uint8Array(data), opts);
  29074. var d = data, n = [0,0,0,0], str = false;
  29075. var o = opts||{};
  29076. if(o.cellStyles) { o.cellNF = true; o.sheetStubs = true; }
  29077. _ssfopts = {};
  29078. if(o.dateNF) _ssfopts.dateNF = o.dateNF;
  29079. if(!o.type) o.type = (has_buf && Buffer.isBuffer(data)) ? "buffer" : "base64";
  29080. if(o.type == "file") { o.type = has_buf ? "buffer" : "binary"; d = read_binary(data); }
  29081. if(o.type == "string") { str = true; o.type = "binary"; o.codepage = 65001; d = bstrify(data); }
  29082. if(o.type == 'array' && typeof Uint8Array !== 'undefined' && data instanceof Uint8Array && typeof ArrayBuffer !== 'undefined') {
  29083. // $FlowIgnore
  29084. var ab=new ArrayBuffer(3), vu=new Uint8Array(ab); vu.foo="bar";
  29085. // $FlowIgnore
  29086. if(!vu.foo) {o=dup(o); o.type='array'; return readSync(ab2a(d), o);}
  29087. }
  29088. switch((n = firstbyte(d, o))[0]) {
  29089. case 0xD0: if(n[1] === 0xCF && n[2] === 0x11 && n[3] === 0xE0 && n[4] === 0xA1 && n[5] === 0xB1 && n[6] === 0x1A && n[7] === 0xE1) return read_cfb(CFB.read(d, o), o); break;
  29090. case 0x09: if(n[1] <= 0x04) return parse_xlscfb(d, o); break;
  29091. case 0x3C: return parse_xlml(d, o);
  29092. case 0x49:
  29093. if(n[1] === 0x49 && n[2] === 0x2a && n[3] === 0x00) throw new Error("TIFF Image File is not a spreadsheet");
  29094. if(n[1] === 0x44) return read_wb_ID(d, o);
  29095. break;
  29096. case 0x54: if(n[1] === 0x41 && n[2] === 0x42 && n[3] === 0x4C) return DIF.to_workbook(d, o); break;
  29097. case 0x50: return (n[1] === 0x4B && n[2] < 0x09 && n[3] < 0x09) ? read_zip(d, o) : read_prn(data, d, o, str);
  29098. case 0xEF: return n[3] === 0x3C ? parse_xlml(d, o) : read_prn(data, d, o, str);
  29099. case 0xFF: if(n[1] === 0xFE) { return read_utf16(d, o); } break;
  29100. case 0x00: if(n[1] === 0x00 && n[2] >= 0x02 && n[3] === 0x00) return WK_.to_workbook(d, o); break;
  29101. case 0x03: case 0x83: case 0x8B: case 0x8C: return DBF.to_workbook(d, o);
  29102. case 0x7B: if(n[1] === 0x5C && n[2] === 0x72 && n[3] === 0x74) return RTF.to_workbook(d, o); break;
  29103. case 0x0A: case 0x0D: case 0x20: return read_plaintext_raw(d, o);
  29104. }
  29105. if(DBF.versions.indexOf(n[0]) > -1 && n[2] <= 12 && n[3] <= 31) return DBF.to_workbook(d, o);
  29106. return read_prn(data, d, o, str);
  29107. }
  29108. function readFileSync(filename, opts) {
  29109. var o = opts||{}; o.type = 'file';
  29110. return readSync(filename, o);
  29111. }
  29112. function write_cfb_ctr(cfb, o) {
  29113. switch(o.type) {
  29114. case "base64": case "binary": break;
  29115. case "buffer": case "array": o.type = ""; break;
  29116. case "file": return write_dl(o.file, CFB.write(cfb, {type:has_buf ? 'buffer' : ""}));
  29117. case "string": throw new Error("'string' output type invalid for '" + o.bookType + "' files");
  29118. default: throw new Error("Unrecognized type " + o.type);
  29119. }
  29120. return CFB.write(cfb, o);
  29121. }
  29122. function write_zip_type(wb, opts) {
  29123. var o = opts||{};
  29124. var z = write_zip(wb, o);
  29125. var oopts = {};
  29126. if(o.compression) oopts.compression = 'DEFLATE';
  29127. if(o.password) oopts.type = has_buf ? "nodebuffer" : "string";
  29128. else switch(o.type) {
  29129. case "base64": oopts.type = "base64"; break;
  29130. case "binary": oopts.type = "string"; break;
  29131. case "string": throw new Error("'string' output type invalid for '" + o.bookType + "' files");
  29132. case "buffer":
  29133. case "file": oopts.type = has_buf ? "nodebuffer" : "string"; break;
  29134. default: throw new Error("Unrecognized type " + o.type);
  29135. }
  29136. var out = z.FullPaths ? CFB.write(z, {fileType:"zip", type: {"nodebuffer": "buffer", "string": "binary"}[oopts.type] || oopts.type}) : z.generate(oopts);
  29137. /*jshint -W083 */
  29138. if(o.password && typeof encrypt_agile !== 'undefined') return write_cfb_ctr(encrypt_agile(out, o.password), o); // eslint-disable-line no-undef
  29139. /*jshint +W083 */
  29140. if(o.type === "file") return write_dl(o.file, out);
  29141. return o.type == "string" ? utf8read(out) : out;
  29142. }
  29143. function write_cfb_type(wb, opts) {
  29144. var o = opts||{};
  29145. var cfb = write_xlscfb(wb, o);
  29146. return write_cfb_ctr(cfb, o);
  29147. }
  29148. function write_string_type(out, opts, bom) {
  29149. if(!bom) bom = "";
  29150. var o = bom + out;
  29151. switch(opts.type) {
  29152. case "base64": return Base64.encode(utf8write(o));
  29153. case "binary": return utf8write(o);
  29154. case "string": return out;
  29155. case "file": return write_dl(opts.file, o, 'utf8');
  29156. case "buffer": {
  29157. if(has_buf) return Buffer_from(o, 'utf8');
  29158. else return write_string_type(o, {type:'binary'}).split("").map(function(c) { return c.charCodeAt(0); });
  29159. }
  29160. }
  29161. throw new Error("Unrecognized type " + opts.type);
  29162. }
  29163. function write_stxt_type(out, opts) {
  29164. switch(opts.type) {
  29165. case "base64": return Base64.encode(out);
  29166. case "binary": return out;
  29167. case "string": return out; /* override in sheet_to_txt */
  29168. case "file": return write_dl(opts.file, out, 'binary');
  29169. case "buffer": {
  29170. if(has_buf) return Buffer_from(out, 'binary');
  29171. else return out.split("").map(function(c) { return c.charCodeAt(0); });
  29172. }
  29173. }
  29174. throw new Error("Unrecognized type " + opts.type);
  29175. }
  29176. /* TODO: test consistency */
  29177. function write_binary_type(out, opts) {
  29178. switch(opts.type) {
  29179. case "string":
  29180. case "base64":
  29181. case "binary":
  29182. var bstr = "";
  29183. // $FlowIgnore
  29184. for(var i = 0; i < out.length; ++i) bstr += String.fromCharCode(out[i]);
  29185. return opts.type == 'base64' ? Base64.encode(bstr) : opts.type == 'string' ? utf8read(bstr) : bstr;
  29186. case "file": return write_dl(opts.file, out);
  29187. case "buffer": return out;
  29188. default: throw new Error("Unrecognized type " + opts.type);
  29189. }
  29190. }
  29191. function writeSync(wb, opts) {
  29192. reset_cp();
  29193. check_wb(wb);
  29194. var o = opts||{};
  29195. if(o.cellStyles) { o.cellNF = true; o.sheetStubs = true; }
  29196. if(o.type == "array") { o.type = "binary"; var out = (writeSync(wb, o)); o.type = "array"; return s2ab(out); }
  29197. switch(o.bookType || 'xlsb') {
  29198. case 'xml':
  29199. case 'xlml': return write_string_type(write_xlml(wb, o), o);
  29200. case 'slk':
  29201. case 'sylk': return write_string_type(write_slk_str(wb, o), o);
  29202. case 'htm':
  29203. case 'html': return write_string_type(write_htm_str(wb, o), o);
  29204. case 'txt': return write_stxt_type(write_txt_str(wb, o), o);
  29205. case 'csv': return write_string_type(write_csv_str(wb, o), o, "\ufeff");
  29206. case 'dif': return write_string_type(write_dif_str(wb, o), o);
  29207. case 'dbf': return write_binary_type(write_dbf_buf(wb, o), o);
  29208. case 'prn': return write_string_type(write_prn_str(wb, o), o);
  29209. case 'rtf': return write_string_type(write_rtf_str(wb, o), o);
  29210. case 'eth': return write_string_type(write_eth_str(wb, o), o);
  29211. case 'fods': return write_string_type(write_ods(wb, o), o);
  29212. case 'biff2': if(!o.biff) o.biff = 2; /* falls through */
  29213. case 'biff3': if(!o.biff) o.biff = 3; /* falls through */
  29214. case 'biff4': if(!o.biff) o.biff = 4; return write_binary_type(write_biff_buf(wb, o), o);
  29215. case 'biff5': if(!o.biff) o.biff = 5; /* falls through */
  29216. case 'biff8':
  29217. case 'xla':
  29218. case 'xls': if(!o.biff) o.biff = 8; return write_cfb_type(wb, o);
  29219. case 'xlsx':
  29220. case 'xlsm':
  29221. case 'xlam':
  29222. case 'xlsb':
  29223. case 'ods': return write_zip_type(wb, o);
  29224. default: throw new Error ("Unrecognized bookType |" + o.bookType + "|");
  29225. }
  29226. }
  29227. function resolve_book_type(o) {
  29228. if(o.bookType) return;
  29229. var _BT = {
  29230. "xls": "biff8",
  29231. "htm": "html",
  29232. "slk": "sylk",
  29233. "socialcalc": "eth",
  29234. "Sh33tJS": "WTF"
  29235. };
  29236. var ext = o.file.slice(o.file.lastIndexOf(".")).toLowerCase();
  29237. if(ext.match(/^\.[a-z]+$/)) o.bookType = ext.slice(1);
  29238. o.bookType = _BT[o.bookType] || o.bookType;
  29239. }
  29240. function writeFileSync(wb, filename, opts) {
  29241. var o = opts||{}; o.type = 'file';
  29242. o.file = filename;
  29243. resolve_book_type(o);
  29244. return writeSync(wb, o);
  29245. }
  29246. function writeFileAsync(filename, wb, opts, cb) {
  29247. var o = opts||{}; o.type = 'file';
  29248. o.file = filename;
  29249. resolve_book_type(o);
  29250. o.type = 'buffer';
  29251. var _cb = cb; if(!(_cb instanceof Function)) _cb = (opts);
  29252. return _fs.writeFile(filename, writeSync(wb, o), _cb);
  29253. }
  29254. function make_json_row(sheet, r, R, cols, header, hdr, dense, o) {
  29255. var rr = encode_row(R);
  29256. var defval = o.defval, raw = o.raw || !Object.prototype.hasOwnProperty.call(o, "raw");
  29257. var isempty = true;
  29258. var row = (header === 1) ? [] : {};
  29259. if(header !== 1) {
  29260. if(Object.defineProperty) try { Object.defineProperty(row, '__rowNum__', {value:R, enumerable:false}); } catch(e) { row.__rowNum__ = R; }
  29261. else row.__rowNum__ = R;
  29262. }
  29263. if(!dense || sheet[R]) for (var C = r.s.c; C <= r.e.c; ++C) {
  29264. var val = dense ? sheet[R][C] : sheet[cols[C] + rr];
  29265. if(val === undefined || val.t === undefined) {
  29266. if(defval === undefined) continue;
  29267. if(hdr[C] != null) { row[hdr[C]] = defval; }
  29268. continue;
  29269. }
  29270. var v = val.v;
  29271. switch(val.t){
  29272. case 'z': if(v == null) break; continue;
  29273. case 'e': v = void 0; break;
  29274. case 's': case 'd': case 'b': case 'n': break;
  29275. default: throw new Error('unrecognized type ' + val.t);
  29276. }
  29277. if(hdr[C] != null) {
  29278. if(v == null) {
  29279. if(defval !== undefined) row[hdr[C]] = defval;
  29280. else if(raw && v === null) row[hdr[C]] = null;
  29281. else continue;
  29282. } else {
  29283. row[hdr[C]] = raw || (o.rawNumbers && val.t == "n") ? v : format_cell(val,v,o);
  29284. }
  29285. if(v != null) isempty = false;
  29286. }
  29287. }
  29288. return { row: row, isempty: isempty };
  29289. }
  29290. function sheet_to_json(sheet, opts) {
  29291. if(sheet == null || sheet["!ref"] == null) return [];
  29292. var val = {t:'n',v:0}, header = 0, offset = 1, hdr = [], v=0, vv="";
  29293. var r = {s:{r:0,c:0},e:{r:0,c:0}};
  29294. var o = opts || {};
  29295. var range = o.range != null ? o.range : sheet["!ref"];
  29296. if(o.header === 1) header = 1;
  29297. else if(o.header === "A") header = 2;
  29298. else if(Array.isArray(o.header)) header = 3;
  29299. else if(o.header == null) header = 0;
  29300. switch(typeof range) {
  29301. case 'string': r = safe_decode_range(range); break;
  29302. case 'number': r = safe_decode_range(sheet["!ref"]); r.s.r = range; break;
  29303. default: r = range;
  29304. }
  29305. if(header > 0) offset = 0;
  29306. var rr = encode_row(r.s.r);
  29307. var cols = [];
  29308. var out = [];
  29309. var outi = 0, counter = 0;
  29310. var dense = Array.isArray(sheet);
  29311. var R = r.s.r, C = 0, CC = 0;
  29312. if(dense && !sheet[R]) sheet[R] = [];
  29313. for(C = r.s.c; C <= r.e.c; ++C) {
  29314. cols[C] = encode_col(C);
  29315. val = dense ? sheet[R][C] : sheet[cols[C] + rr];
  29316. switch(header) {
  29317. case 1: hdr[C] = C - r.s.c; break;
  29318. case 2: hdr[C] = cols[C]; break;
  29319. case 3: hdr[C] = o.header[C - r.s.c]; break;
  29320. default:
  29321. if(val == null) val = {w: "__EMPTY", t: "s"};
  29322. vv = v = format_cell(val, null, o);
  29323. counter = 0;
  29324. for(CC = 0; CC < hdr.length; ++CC) if(hdr[CC] == vv) vv = v + "_" + (++counter);
  29325. hdr[C] = vv;
  29326. }
  29327. }
  29328. for (R = r.s.r + offset; R <= r.e.r; ++R) {
  29329. var row = make_json_row(sheet, r, R, cols, header, hdr, dense, o);
  29330. if((row.isempty === false) || (header === 1 ? o.blankrows !== false : !!o.blankrows)) out[outi++] = row.row;
  29331. }
  29332. out.length = outi;
  29333. return out;
  29334. }
  29335. var qreg = /"/g;
  29336. function make_csv_row(sheet, r, R, cols, fs, rs, FS, o) {
  29337. var isempty = true;
  29338. var row = [], txt = "", rr = encode_row(R);
  29339. for(var C = r.s.c; C <= r.e.c; ++C) {
  29340. if (!cols[C]) continue;
  29341. var val = o.dense ? (sheet[R]||[])[C]: sheet[cols[C] + rr];
  29342. if(val == null) txt = "";
  29343. else if(val.v != null) {
  29344. isempty = false;
  29345. txt = ''+(o.rawNumbers && val.t == "n" ? val.v : format_cell(val, null, o));
  29346. for(var i = 0, cc = 0; i !== txt.length; ++i) if((cc = txt.charCodeAt(i)) === fs || cc === rs || cc === 34 || o.forceQuotes) {txt = "\"" + txt.replace(qreg, '""') + "\""; break; }
  29347. if(txt == "ID") txt = '"ID"';
  29348. } else if(val.f != null && !val.F) {
  29349. isempty = false;
  29350. txt = '=' + val.f; if(txt.indexOf(",") >= 0) txt = '"' + txt.replace(qreg, '""') + '"';
  29351. } else txt = "";
  29352. /* NOTE: Excel CSV does not support array formulae */
  29353. row.push(txt);
  29354. }
  29355. if(o.blankrows === false && isempty) return null;
  29356. return row.join(FS);
  29357. }
  29358. function sheet_to_csv(sheet, opts) {
  29359. var out = [];
  29360. var o = opts == null ? {} : opts;
  29361. if(sheet == null || sheet["!ref"] == null) return "";
  29362. var r = safe_decode_range(sheet["!ref"]);
  29363. var FS = o.FS !== undefined ? o.FS : ",", fs = FS.charCodeAt(0);
  29364. var RS = o.RS !== undefined ? o.RS : "\n", rs = RS.charCodeAt(0);
  29365. var endregex = new RegExp((FS=="|" ? "\\|" : FS)+"+$");
  29366. var row = "", cols = [];
  29367. o.dense = Array.isArray(sheet);
  29368. var colinfo = o.skipHidden && sheet["!cols"] || [];
  29369. var rowinfo = o.skipHidden && sheet["!rows"] || [];
  29370. for(var C = r.s.c; C <= r.e.c; ++C) if (!((colinfo[C]||{}).hidden)) cols[C] = encode_col(C);
  29371. for(var R = r.s.r; R <= r.e.r; ++R) {
  29372. if ((rowinfo[R]||{}).hidden) continue;
  29373. row = make_csv_row(sheet, r, R, cols, fs, rs, FS, o);
  29374. if(row == null) { continue; }
  29375. if(o.strip) row = row.replace(endregex,"");
  29376. out.push(row + RS);
  29377. }
  29378. delete o.dense;
  29379. return out.join("");
  29380. }
  29381. function sheet_to_txt(sheet, opts) {
  29382. if(!opts) opts = {}; opts.FS = "\t"; opts.RS = "\n";
  29383. var s = sheet_to_csv(sheet, opts);
  29384. if(typeof cptable == 'undefined' || opts.type == 'string') return s;
  29385. var o = cptable.utils.encode(1200, s, 'str');
  29386. return String.fromCharCode(255) + String.fromCharCode(254) + o;
  29387. }
  29388. function sheet_to_formulae(sheet) {
  29389. var y = "", x, val="";
  29390. if(sheet == null || sheet["!ref"] == null) return [];
  29391. var r = safe_decode_range(sheet['!ref']), rr = "", cols = [], C;
  29392. var cmds = [];
  29393. var dense = Array.isArray(sheet);
  29394. for(C = r.s.c; C <= r.e.c; ++C) cols[C] = encode_col(C);
  29395. for(var R = r.s.r; R <= r.e.r; ++R) {
  29396. rr = encode_row(R);
  29397. for(C = r.s.c; C <= r.e.c; ++C) {
  29398. y = cols[C] + rr;
  29399. x = dense ? (sheet[R]||[])[C] : sheet[y];
  29400. val = "";
  29401. if(x === undefined) continue;
  29402. else if(x.F != null) {
  29403. y = x.F;
  29404. if(!x.f) continue;
  29405. val = x.f;
  29406. if(y.indexOf(":") == -1) y = y + ":" + y;
  29407. }
  29408. if(x.f != null) val = x.f;
  29409. else if(x.t == 'z') continue;
  29410. else if(x.t == 'n' && x.v != null) val = "" + x.v;
  29411. else if(x.t == 'b') val = x.v ? "TRUE" : "FALSE";
  29412. else if(x.w !== undefined) val = "'" + x.w;
  29413. else if(x.v === undefined) continue;
  29414. else if(x.t == 's') val = "'" + x.v;
  29415. else val = ""+x.v;
  29416. cmds[cmds.length] = y + "=" + val;
  29417. }
  29418. }
  29419. return cmds;
  29420. }
  29421. function sheet_add_json(_ws, js, opts) {
  29422. var o = opts || {};
  29423. var offset = +!o.skipHeader;
  29424. var ws = _ws || ({});
  29425. var _R = 0, _C = 0;
  29426. if(ws && o.origin != null) {
  29427. if(typeof o.origin == 'number') _R = o.origin;
  29428. else {
  29429. var _origin = typeof o.origin == "string" ? decode_cell(o.origin) : o.origin;
  29430. _R = _origin.r; _C = _origin.c;
  29431. }
  29432. }
  29433. var cell;
  29434. var range = ({s: {c:0, r:0}, e: {c:_C, r:_R + js.length - 1 + offset}});
  29435. if(ws['!ref']) {
  29436. var _range = safe_decode_range(ws['!ref']);
  29437. range.e.c = Math.max(range.e.c, _range.e.c);
  29438. range.e.r = Math.max(range.e.r, _range.e.r);
  29439. if(_R == -1) { _R = _range.e.r + 1; range.e.r = _R + js.length - 1 + offset; }
  29440. } else {
  29441. if(_R == -1) { _R = 0; range.e.r = js.length - 1 + offset; }
  29442. }
  29443. var hdr = o.header || [], C = 0;
  29444. js.forEach(function (JS, R) {
  29445. keys(JS).forEach(function(k) {
  29446. if((C=hdr.indexOf(k)) == -1) hdr[C=hdr.length] = k;
  29447. var v = JS[k];
  29448. var t = 'z';
  29449. var z = "";
  29450. var ref = encode_cell({c:_C + C,r:_R + R + offset});
  29451. cell = utils.sheet_get_cell(ws, ref);
  29452. if(v && typeof v === 'object' && !(v instanceof Date)){
  29453. ws[ref] = v;
  29454. } else {
  29455. if(typeof v == 'number') t = 'n';
  29456. else if(typeof v == 'boolean') t = 'b';
  29457. else if(typeof v == 'string') t = 's';
  29458. else if(v instanceof Date) {
  29459. t = 'd';
  29460. if(!o.cellDates) { t = 'n'; v = datenum(v); }
  29461. z = (o.dateNF || SSF._table[14]);
  29462. }
  29463. if(!cell) ws[ref] = cell = ({t:t, v:v});
  29464. else {
  29465. cell.t = t; cell.v = v;
  29466. delete cell.w; delete cell.R;
  29467. if(z) cell.z = z;
  29468. }
  29469. if(z) cell.z = z;
  29470. }
  29471. });
  29472. });
  29473. range.e.c = Math.max(range.e.c, _C + hdr.length - 1);
  29474. var __R = encode_row(_R);
  29475. if(offset) for(C = 0; C < hdr.length; ++C) ws[encode_col(C + _C) + __R] = {t:'s', v:hdr[C]};
  29476. ws['!ref'] = encode_range(range);
  29477. return ws;
  29478. }
  29479. function json_to_sheet(js, opts) { return sheet_add_json(null, js, opts); }
  29480. var utils = {
  29481. encode_col: encode_col,
  29482. encode_row: encode_row,
  29483. encode_cell: encode_cell,
  29484. encode_range: encode_range,
  29485. decode_col: decode_col,
  29486. decode_row: decode_row,
  29487. split_cell: split_cell,
  29488. decode_cell: decode_cell,
  29489. decode_range: decode_range,
  29490. format_cell: format_cell,
  29491. get_formulae: sheet_to_formulae,
  29492. make_csv: sheet_to_csv,
  29493. make_json: sheet_to_json,
  29494. make_formulae: sheet_to_formulae,
  29495. sheet_add_aoa: sheet_add_aoa,
  29496. sheet_add_json: sheet_add_json,
  29497. sheet_add_dom: sheet_add_dom,
  29498. aoa_to_sheet: aoa_to_sheet,
  29499. json_to_sheet: json_to_sheet,
  29500. table_to_sheet: parse_dom_table,
  29501. table_to_book: table_to_book,
  29502. sheet_to_csv: sheet_to_csv,
  29503. sheet_to_txt: sheet_to_txt,
  29504. sheet_to_json: sheet_to_json,
  29505. sheet_to_html: HTML_.from_sheet,
  29506. sheet_to_formulae: sheet_to_formulae,
  29507. sheet_to_row_object_array: sheet_to_json
  29508. };
  29509. (function(utils) {
  29510. utils.consts = utils.consts || {};
  29511. function add_consts(R/*Array<any>*/) { R.forEach(function(a){ utils.consts[a[0]] = a[1]; }); }
  29512. function get_default(x, y, z) { return x[y] != null ? x[y] : (x[y] = z); }
  29513. /* get cell, creating a stub if necessary */
  29514. function ws_get_cell_stub(ws, R, C) {
  29515. /* A1 cell address */
  29516. if(typeof R == "string") {
  29517. /* dense */
  29518. if(Array.isArray(ws)) {
  29519. var RC = decode_cell(R);
  29520. if(!ws[RC.r]) ws[RC.r] = [];
  29521. return ws[RC.r][RC.c] || (ws[RC.r][RC.c] = {t:'z'});
  29522. }
  29523. return ws[R] || (ws[R] = {t:'z'});
  29524. }
  29525. /* cell address object */
  29526. if(typeof R != "number") return ws_get_cell_stub(ws, encode_cell(R));
  29527. /* R and C are 0-based indices */
  29528. return ws_get_cell_stub(ws, encode_cell({r:R,c:C||0}));
  29529. }
  29530. utils.sheet_get_cell = ws_get_cell_stub;
  29531. /* find sheet index for given name / validate index */
  29532. function wb_sheet_idx(wb, sh) {
  29533. if(typeof sh == "number") {
  29534. if(sh >= 0 && wb.SheetNames.length > sh) return sh;
  29535. throw new Error("Cannot find sheet # " + sh);
  29536. } else if(typeof sh == "string") {
  29537. var idx = wb.SheetNames.indexOf(sh);
  29538. if(idx > -1) return idx;
  29539. throw new Error("Cannot find sheet name |" + sh + "|");
  29540. } else throw new Error("Cannot find sheet |" + sh + "|");
  29541. }
  29542. /* simple blank workbook object */
  29543. utils.book_new = function() {
  29544. return { SheetNames: [], Sheets: {} };
  29545. };
  29546. /* add a worksheet to the end of a given workbook */
  29547. utils.book_append_sheet = function(wb, ws, name) {
  29548. if(!name) for(var i = 1; i <= 0xFFFF; ++i, name = undefined) if(wb.SheetNames.indexOf(name = "Sheet" + i) == -1) break;
  29549. if(!name || wb.SheetNames.length >= 0xFFFF) throw new Error("Too many worksheets");
  29550. check_ws_name(name);
  29551. if(wb.SheetNames.indexOf(name) >= 0) throw new Error("Worksheet with name |" + name + "| already exists!");
  29552. wb.SheetNames.push(name);
  29553. wb.Sheets[name] = ws;
  29554. };
  29555. /* set sheet visibility (visible/hidden/very hidden) */
  29556. utils.book_set_sheet_visibility = function(wb, sh, vis) {
  29557. get_default(wb,"Workbook",{});
  29558. get_default(wb.Workbook,"Sheets",[]);
  29559. var idx = wb_sheet_idx(wb, sh);
  29560. // $FlowIgnore
  29561. get_default(wb.Workbook.Sheets,idx, {});
  29562. switch(vis) {
  29563. case 0: case 1: case 2: break;
  29564. default: throw new Error("Bad sheet visibility setting " + vis);
  29565. }
  29566. // $FlowIgnore
  29567. wb.Workbook.Sheets[idx].Hidden = vis;
  29568. };
  29569. add_consts([
  29570. ["SHEET_VISIBLE", 0],
  29571. ["SHEET_HIDDEN", 1],
  29572. ["SHEET_VERY_HIDDEN", 2]
  29573. ]);
  29574. /* set number format */
  29575. utils.cell_set_number_format = function(cell, fmt) {
  29576. cell.z = fmt;
  29577. return cell;
  29578. };
  29579. /* set cell hyperlink */
  29580. utils.cell_set_hyperlink = function(cell, target, tooltip) {
  29581. if(!target) {
  29582. delete cell.l;
  29583. } else {
  29584. cell.l = ({ Target: target });
  29585. if(tooltip) cell.l.Tooltip = tooltip;
  29586. }
  29587. return cell;
  29588. };
  29589. utils.cell_set_internal_link = function(cell, range, tooltip) { return utils.cell_set_hyperlink(cell, "#" + range, tooltip); };
  29590. /* add to cell comments */
  29591. utils.cell_add_comment = function(cell, text, author) {
  29592. if(!cell.c) cell.c = [];
  29593. cell.c.push({t:text, a:author||"SheetJS"});
  29594. };
  29595. /* set array formula and flush related cells */
  29596. utils.sheet_set_array_formula = function(ws, range, formula) {
  29597. var rng = typeof range != "string" ? range : safe_decode_range(range);
  29598. var rngstr = typeof range == "string" ? range : encode_range(range);
  29599. for(var R = rng.s.r; R <= rng.e.r; ++R) for(var C = rng.s.c; C <= rng.e.c; ++C) {
  29600. var cell = ws_get_cell_stub(ws, R, C);
  29601. cell.t = 'n';
  29602. cell.F = rngstr;
  29603. delete cell.v;
  29604. if(R == rng.s.r && C == rng.s.c) cell.f = formula;
  29605. }
  29606. return ws;
  29607. };
  29608. return utils;
  29609. })(utils);
  29610. if(has_buf && "function" != 'undefined') (function() {
  29611. var Readable = __webpack_require__(/*! stream */ "?20df").Readable;
  29612. var write_csv_stream = function(sheet, opts) {
  29613. var stream = Readable();
  29614. var o = opts == null ? {} : opts;
  29615. if(sheet == null || sheet["!ref"] == null) { stream.push(null); return stream; }
  29616. var r = safe_decode_range(sheet["!ref"]);
  29617. var FS = o.FS !== undefined ? o.FS : ",", fs = FS.charCodeAt(0);
  29618. var RS = o.RS !== undefined ? o.RS : "\n", rs = RS.charCodeAt(0);
  29619. var endregex = new RegExp((FS=="|" ? "\\|" : FS)+"+$");
  29620. var row = "", cols = [];
  29621. o.dense = Array.isArray(sheet);
  29622. var colinfo = o.skipHidden && sheet["!cols"] || [];
  29623. var rowinfo = o.skipHidden && sheet["!rows"] || [];
  29624. for(var C = r.s.c; C <= r.e.c; ++C) if (!((colinfo[C]||{}).hidden)) cols[C] = encode_col(C);
  29625. var R = r.s.r;
  29626. var BOM = false;
  29627. stream._read = function() {
  29628. if(!BOM) { BOM = true; return stream.push("\uFEFF"); }
  29629. while(R <= r.e.r) {
  29630. ++R;
  29631. if ((rowinfo[R-1]||{}).hidden) continue;
  29632. row = make_csv_row(sheet, r, R-1, cols, fs, rs, FS, o);
  29633. if(row != null) {
  29634. if(o.strip) row = row.replace(endregex,"");
  29635. stream.push(row + RS);
  29636. break;
  29637. }
  29638. }
  29639. if(R > r.e.r) return stream.push(null);
  29640. };
  29641. return stream;
  29642. };
  29643. var write_html_stream = function(ws, opts) {
  29644. var stream = Readable();
  29645. var o = opts || {};
  29646. var header = o.header != null ? o.header : HTML_.BEGIN;
  29647. var footer = o.footer != null ? o.footer : HTML_.END;
  29648. stream.push(header);
  29649. var r = decode_range(ws['!ref']);
  29650. o.dense = Array.isArray(ws);
  29651. stream.push(HTML_._preamble(ws, r, o));
  29652. var R = r.s.r;
  29653. var end = false;
  29654. stream._read = function() {
  29655. if(R > r.e.r) {
  29656. if(!end) { end = true; stream.push("</table>" + footer); }
  29657. return stream.push(null);
  29658. }
  29659. while(R <= r.e.r) {
  29660. stream.push(HTML_._row(ws, r, R, o));
  29661. ++R;
  29662. break;
  29663. }
  29664. };
  29665. return stream;
  29666. };
  29667. var write_json_stream = function(sheet, opts) {
  29668. var stream = Readable({objectMode:true});
  29669. if(sheet == null || sheet["!ref"] == null) { stream.push(null); return stream; }
  29670. var val = {t:'n',v:0}, header = 0, offset = 1, hdr = [], v=0, vv="";
  29671. var r = {s:{r:0,c:0},e:{r:0,c:0}};
  29672. var o = opts || {};
  29673. var range = o.range != null ? o.range : sheet["!ref"];
  29674. if(o.header === 1) header = 1;
  29675. else if(o.header === "A") header = 2;
  29676. else if(Array.isArray(o.header)) header = 3;
  29677. switch(typeof range) {
  29678. case 'string': r = safe_decode_range(range); break;
  29679. case 'number': r = safe_decode_range(sheet["!ref"]); r.s.r = range; break;
  29680. default: r = range;
  29681. }
  29682. if(header > 0) offset = 0;
  29683. var rr = encode_row(r.s.r);
  29684. var cols = [];
  29685. var counter = 0;
  29686. var dense = Array.isArray(sheet);
  29687. var R = r.s.r, C = 0, CC = 0;
  29688. if(dense && !sheet[R]) sheet[R] = [];
  29689. for(C = r.s.c; C <= r.e.c; ++C) {
  29690. cols[C] = encode_col(C);
  29691. val = dense ? sheet[R][C] : sheet[cols[C] + rr];
  29692. switch(header) {
  29693. case 1: hdr[C] = C - r.s.c; break;
  29694. case 2: hdr[C] = cols[C]; break;
  29695. case 3: hdr[C] = o.header[C - r.s.c]; break;
  29696. default:
  29697. if(val == null) val = {w: "__EMPTY", t: "s"};
  29698. vv = v = format_cell(val, null, o);
  29699. counter = 0;
  29700. for(CC = 0; CC < hdr.length; ++CC) if(hdr[CC] == vv) vv = v + "_" + (++counter);
  29701. hdr[C] = vv;
  29702. }
  29703. }
  29704. R = r.s.r + offset;
  29705. stream._read = function() {
  29706. if(R > r.e.r) return stream.push(null);
  29707. while(R <= r.e.r) {
  29708. //if ((rowinfo[R-1]||{}).hidden) continue;
  29709. var row = make_json_row(sheet, r, R, cols, header, hdr, dense, o);
  29710. ++R;
  29711. if((row.isempty === false) || (header === 1 ? o.blankrows !== false : !!o.blankrows)) {
  29712. stream.push(row.row);
  29713. break;
  29714. }
  29715. }
  29716. };
  29717. return stream;
  29718. };
  29719. XLSX.stream = {
  29720. to_json: write_json_stream,
  29721. to_html: write_html_stream,
  29722. to_csv: write_csv_stream
  29723. };
  29724. })();
  29725. if(typeof parse_xlscfb !== "undefined") XLSX.parse_xlscfb = parse_xlscfb;
  29726. XLSX.parse_zip = parse_zip;
  29727. XLSX.read = readSync; //xlsread
  29728. XLSX.readFile = readFileSync; //readFile
  29729. XLSX.readFileSync = readFileSync;
  29730. XLSX.write = writeSync;
  29731. XLSX.writeFile = writeFileSync;
  29732. XLSX.writeFileSync = writeFileSync;
  29733. XLSX.writeFileAsync = writeFileAsync;
  29734. XLSX.utils = utils;
  29735. XLSX.SSF = SSF;
  29736. if(typeof CFB !== "undefined") XLSX.CFB = CFB;
  29737. }
  29738. /*global define */
  29739. if(true) make_xlsx_lib(exports);
  29740. else {}
  29741. /*exported XLS, ODS */
  29742. var XLS = XLSX, ODS = XLSX;
  29743. /***/ })
  29744. }]);
  29745. //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMveGxzeC9kaXN0L2NwZXhjZWwuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL3hsc3gvanN6aXAuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL3hsc3gveGxzeC5qcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7OztBQUFBO0FBQ0E7QUFDQSxlQUFlO0FBQ2YsMkJBQTJCLG1OQUFtTixpRUFBaUUsRUFBRSxvSkFBb0osYUFBYSxZQUFZLE1BQU0sbURBQW1ELG9CQUFvQixFQUFFLFNBQVMscUJBQXFCLEVBQUU7QUFDN2tCLDJCQUEyQixtTkFBbU4saUVBQWlFLEVBQUUsb0pBQW9KLGFBQWEsWUFBWSxNQUFNLG1EQUFtRCxvQkFBb0IsRUFBRSxTQUFTLHFCQUFxQixFQUFFO0FBQzdrQiwyQkFBMkIsbU5BQW1OLGlFQUFpRSxFQUFFLG9KQUFvSixhQUFhLFlBQVksTUFBTSxtREFBbUQsb0JBQW9CLEVBQUUsU0FBUyxxQkFBcUIsRUFBRTtBQUM3a0IsMkJBQTJCLG1OQUFtTixpRUFBaUUsRUFBRSxvSkFBb0osYUFBYSxZQUFZLE1BQU0sbURBQW1ELG9CQUFvQixFQUFFLFNBQVMscUJBQXFCLEVBQUU7QUFDN2tCLDJCQUEyQixtTkFBbU4saUVBQWlFLEVBQUUsb0pBQW9KLGFBQWEsWUFBWSxNQUFNLG1EQUFtRCxvQkFBb0IsRUFBRSxTQUFTLHFCQUFxQixFQUFFO0FBQzdrQiwyQkFBMkIsbU5BQW1OLGlFQUFpRSxFQUFFLG9KQUFvSixhQUFhLFlBQVksTUFBTSxtREFBbUQsb0JBQW9CLEVBQUUsU0FBUyxxQkFBcUIsRUFBRTtBQUM3a0IsMkJBQTJCLG1OQUFtTixpRUFBaUUsRUFBRSxvSkFBb0osYUFBYSxZQUFZLE1BQU0sbURBQW1ELG9CQUFvQixFQUFFLFNBQVMscUJBQXFCLEVBQUU7QUFDN2tCLDJCQUEyQixtTkFBbU4saUVBQWlFLEVBQUUsb0pBQW9KLGFBQWEsWUFBWSxNQUFNLG1EQUFtRCxvQkFBb0IsRUFBRSxTQUFTLHFCQUFxQixFQUFFO0FBQzdrQiwyQkFBMkIsbU5BQW1OLGlFQUFpRSxFQUFFLG9KQUFvSixhQUFhLFlBQVksTUFBTSxtREFBbUQsb0JBQW9CLEVBQUUsU0FBUyxxQkFBcUIsRUFBRTtBQUM3a0IsMkJBQTJCLG1OQUFtTixpRUFBaUUsRUFBRSxvSkFBb0osYUFBYSxZQUFZLE1BQU0sbURBQW1ELG9CQUFvQixFQUFFLFNBQVMscUJBQXFCLEVBQUU7QUFDN2tCLDJCQUEyQixtTkFBbU4saUVBQWlFLEVBQUUsb0pBQW9KLGFBQWEsWUFBWSxNQUFNLG1EQUFtRCxvQkFBb0IsRUFBRSxTQUFTLHFCQUFxQixFQUFFO0FBQzdrQiwyQkFBMkIsbUJBQW1CO0FBQzlDLGlOQUFpTixpRUFBaUUsRUFBRTtBQUNwUixVQUFVLGtCQUFrQiw0Q0FBNEMsb0JBQW9CO0FBQzVGO0FBQ0EsVUFBVSxvQkFBb0IsOENBQThDLDBCQUEwQjtBQUN0RztBQUNBLFVBQVUsb0JBQW9CLDhDQUE4QywwQkFBMEI7QUFDdEc7QUFDQSxVQUFVLG9CQUFvQiw4Q0FBOEMsMEJBQTBCO0FBQ3RHO0FBQ0EsVUFBVSxvQkFBb0IsOENBQThDLDBCQUEwQjtBQUN0RztBQUNBLFVBQVUsb0JBQW9CLDhDQUE4QywwQkFBMEI7QUFDdEc7QUFDQSxVQUFVLG9CQUFvQiw4Q0FBOEMsMEJBQTBCO0FBQ3RHO0FBQ0EsVUFBVSxvQkFBb0IsOENBQThDLDBCQUEwQjtBQUN0RztBQUNBLFVBQVUsb0JBQW9CLDhDQUE4QywwQkFBMEI7QUFDdEc7QUFDQSxVQUFVLG9CQUFvQiw4Q0FBOEMsMEJBQTBCO0FBQ3RHO0FBQ0EsVUFBVSxvQkFBb0IsOENBQThDLDBCQUEwQjtBQUN0RztBQUNBLFVBQVUsb0JBQW9CLDhDQUE4QywwQkFBMEI7QUFDdEc7QUFDQSxVQUFVLG9CQUFvQiw4Q0FBOEMsMEJBQTBCO0FBQ3RHO0FBQ0EsVUFBVSxvQkFBb0IsOENBQThDLDBCQUEwQjtBQUN0RztBQUNBLFVBQVUsb0JBQW9CLDhDQUE4QywwQkFBMEI7QUFDdEc7QUFDQSxVQUFVLG9CQUFvQiw4Q0FBOEMsMEJBQTBCO0FBQ3RHO0FBQ0EsVUFBVSxvQkFBb0IsOENBQThDLDBCQUEwQjtBQUN0RztBQUNBLFVBQVUsb0JBQW9CLDhDQUE4QywwQkFBMEI7QUFDdEc7QUFDQSxVQUFVLG9CQUFvQiw4Q0FBOEMsMEJBQTBCO0FBQ3RHO0FBQ0EsVUFBVSxvQkFBb0IsOENBQThDLDBCQUEwQjtBQUN0RztBQUNBLFVBQVUsb0JBQW9CLDhDQUE4QywwQkFBMEI7QUFDdEc7QUFDQSxVQUFVLG9CQUFvQiw4Q0FBOEMsMEJBQTBCO0FBQ3RHO0FBQ0EsVUFBVSxvQkFBb0IsOENBQThDLDBCQUEwQjtBQUN0RztBQUNBLFVBQVUsb0JBQW9CLDhDQUE4QywwQkFBMEI7QUFDdEc7QUFDQSxVQUFVLG9CQUFvQiw4Q0FBOEMsMEJBQTBCO0FBQ3RHO0FBQ0EsVUFBVSxvQkFBb0IsOENBQThDLDBCQUEwQjtBQUN0RztBQUNBLFVBQVUsb0JBQW9CLDhDQUE4QywwQkFBMEI7QUFDdEc7QUFDQSxVQUFVLG9CQUFvQiw4Q0FBOEMsMEJBQTBCO0FBQ3RHO0FBQ0EsVUFBVSxvQkFBb0IsOENBQThDLDBCQUEwQjtBQUN0RztBQUNBLFVBQVUsb0JBQW9CLDhDQUE4QywwQkFBMEI7QUFDdEc7QUFDQSxVQUFVLG9CQUFvQiw4Q0FBOEMsMEJBQTBCO0FBQ3RHO0FBQ0EsVUFBVSxvQkFBb0IsOENBQThDLDBCQUEwQjtBQUN0RztBQUNBLFVBQVUsb0JBQW9CLDhDQUE4QywwQkFBMEI7QUFDdEc7QUFDQSxVQUFVLG9CQUFvQiw4Q0FBOEMsMEJBQTBCO0FBQ3RHO0FBQ0EsVUFBVSxvQkFBb0IsOENBQThDLDBCQUEwQjtBQUN0RztBQUNBLFVBQVUsb0JBQW9CLDhDQUE4QywwQkFBMEI7QUFDdEc7QUFDQSxVQUFVLG9CQUFvQiw4Q0FBOEMsMEJBQTBCO0FBQ3RHO0FBQ0EsVUFBVSxvQkFBb0IsOENBQThDLDBCQUEwQjtBQUN0RztBQUNBLFVBQVUsb0JBQW9CLDhDQUE4QywwQkFBMEI7QUFDdEc7QUFDQSxVQUFVLG9CQUFvQiw4Q0FBOEMsMEJBQTBCO0FBQ3RHO0FBQ0EsVUFBVSxvQkFBb0IsOENBQThDLDBCQUEwQjtBQUN0RztBQUNBLFVBQVUsb0JBQW9CLDhDQUE4QywwQkFBMEI7QUFDdEc7QUFDQSxVQUFVLG9CQUFvQiw4Q0FBOEMsMEJBQTBCO0FBQ3RHO0FBQ0EsVUFBVSxvQkFBb0IsOENBQThDLDBCQUEwQjtBQUN0RztBQUNBLFVBQVUsb0JBQW9CLDhDQUE4QywwQkFBMEI7QUFDdEc7QUFDQSxVQUFVLG9CQUFvQiw4Q0FBOEMsMEJBQTBCO0FBQ3RHLFFBQVEscUJBQXFCLEVBQUU7QUFDL0IsMkJBQTJCLG1CQUFtQjtBQUM5QyxpTkFBaU4saUVBQWlFLEVBQUU7QUFDcFIsVUFBVSxrQkFBa0IsNENBQTRDLG9CQUFvQjtBQUM1RjtBQUNBLFVBQVUsb0JBQW9CLDhDQUE4QywwQkFBMEI7QUFDdEc7QUFDQSxVQUFVLG9CQUFvQiw4Q0FBOEMsMEJBQTBCO0FBQ3RHO0FBQ0EsVUFBVSxvQkFBb0IsOENBQThDLDBCQUEwQjtBQUN0RztBQUNBLFVBQVUsb0JBQW9CLDhDQUE4QywwQkFBMEI7QUFDdEc7QUFDQSxVQUFVLG9CQUFvQiw4Q0FBOEMsMEJBQTBCO0FBQ3RHO0FBQ0EsVUFBVSxvQkFBb0IsOENBQThDLDBCQUEwQjtBQUN0RztBQUNBLFVBQVUsb0JBQW9CLDhDQUE4QywwQkFBMEI7QUFDdEc7QUFDQSxVQUFVLG9CQUFvQiw4Q0FBOEMsMEJBQTBCO0FBQ3RHO0FBQ0EsVUFBVSxvQkFBb0IsOENBQThDLDBCQUEwQjtBQUN0RztBQUNBLFVBQVUsb0JBQW9CLDhDQUE4QywwQkFBMEI7QUFDdEc7QUFDQSxVQUFVLG9CQUFvQiw4Q0FBOEMsMEJBQTBCO0FBQ3RHO0FBQ0EsVUFBVSxvQkFBb0IsOENBQThDLDBCQUEwQjtBQUN0RztBQUNBLFVBQVUsb0JBQW9CLDhDQUE4QywwQkFBMEI7QUFDdEc7QUFDQSxVQUFVLG9CQUFvQiw4Q0FBOEMsMEJBQTBCO0FBQ3RHO0FBQ0EsVUFBVSxvQkFBb0IsOENBQThDLDBCQUEwQjtBQUN0RztBQUNBLFVBQVUsb0JBQW9CLDhDQUE4QywwQkFBMEI7QUFDdEc7QUFDQSxVQUFVLG9CQUFvQiw4Q0FBOEMsMEJBQTBCO0FBQ3RHO0FBQ0EsVUFBVSxvQkFBb0IsOENBQThDLDBCQUEwQjtBQUN0RztBQUNBLFVBQVUsb0JBQW9CLDhDQUE4QywwQkFBMEI7QUFDdEc7QUFDQSxVQUFVLG9CQUFvQiw4Q0FBOEMsMEJBQTBCO0FBQ3RHO0FBQ0EsVUFBVSxvQkFBb0IsOENBQThDLDBCQUEwQjtBQUN0RztBQUNBLFVBQVUsb0JBQW9CLDhDQUE4QywwQkFBMEI7QUFDdEc7QUFDQSxVQUFVLG9CQUFvQiw4Q0FBOEMsMEJBQTBCO0FBQ3RHO0FBQ0EsVUFBVSxvQkFBb0IsOENBQThDLDBCQUEwQjtBQUN0RztBQUNBLFVBQVUsb0JBQW9CLDhDQUE4QywwQkFBMEI7QUFDdEc7QUFDQSxVQUFVLG9CQUFvQiw4Q0FBOEMsMEJBQTBCO0FBQ3RHO0FBQ0EsVUFBVSxvQkFBb0IsOENBQThDLDBCQUEwQjtBQUN0RztBQUNBLFVBQVUsb0JBQW9CLDhDQUE4QywwQkFBMEI7QUFDdEc7QUFDQSxVQUFVLG9CQUFvQiw4Q0FBOEMsMEJBQTBCO0FBQ3RHO0FBQ0EsVUFBVSxvQkFBb0IsOENBQThDLDBCQUEwQjtBQUN0RztBQUNBLFVBQVUsb0JBQW9CLDhDQUE4QywwQkFBMEI7QUFDdEc7QUFDQSxVQUFVLG9CQUFvQiw4Q0FBOEMsMEJBQTBCO0FBQ3RHO0FBQ0EsVUFBVSxvQkFBb0IsOENBQThDLDBCQUEwQjtBQUN0RztBQUNBLFVBQVUsb0JBQW9CLDhDQUE4QywwQkFBMEI7QUFDdEc7QUFDQSxVQUFVLG9CQUFvQiw4Q0FBOEMsMEJBQTBCO0FBQ3RHO0FBQ0EsVUFBVSxvQkFBb0IsOENBQThDLDBCQUEwQjtBQUN0RztBQUNBLFVBQVUsb0JBQW9CLDhDQUE4QywwQkFBMEI7QUFDdEc7QUFDQSxVQUFVLG9CQUFvQiw4Q0FBOEMsMEJBQTBCO0FBQ3RHO0FBQ0EsVUFBVSxvQkFBb0IsOENBQThDLDBCQUEwQjtBQUN0RztBQUNBLFVBQVUsb0JBQW9CLDhDQUE4QywwQkFBMEI7QUFDdEc7QUFDQSxVQUFVLG9CQUFvQiw4Q0FBOEMsMEJBQTBCO0FBQ3RHO0FBQ0EsVUFBVSxvQkFBb0IsOENBQThDLDBCQUEwQjtBQUN0RztBQUNBLFVBQVUsb0JBQW9CLDhDQUE4QywwQkFBMEI7QUFDdEc7QUFDQSxVQUFVLG9CQUFvQiw4Q0FBOEMsMEJBQTBCO0FBQ3RHO0FBQ0EsVUFBVSxvQkFBb0IsOENBQThDLDBCQUEwQjtBQUN0RztBQUNBLFVBQVUsb0JBQW9CLDhDQUE4QywwQkFBMEI7QUFDdEc7QUFDQSxVQUFVLG9CQUFvQiw4Q0FBOEMsMEJBQTBCO0FBQ3RHO0FBQ0EsVUFBVSxvQkFBb0IsOENBQThDLDBCQUEwQjtBQUN0RztBQUNBLFVBQVUsb0JBQW9CLDhDQUE4QywwQkFBMEI7QUFDdEc7QUFDQSxVQUFVLG9CQUFvQiw4Q0FBOEMsMEJBQTBCO0FBQ3RHO0FBQ0EsVUFBVSxvQkFBb0IsOENBQThDLDBCQUEwQjtBQUN0RztBQUNBLFVBQVUsb0JBQW9CLDhDQUE4QywwQkFBMEI7QUFDdEc7QUFDQSxVQUFVLG9CQUFvQiw4Q0FBOEMsMEJBQTBCO0FBQ3RHO0FBQ0EsVUFBVSxvQkFBb0IsOENBQThDLDBCQUEwQjtBQUN0RztBQUNBLFVBQVUsb0JBQW9CLDhDQUE4QywwQkFBMEI7QUFDdEc7QUFDQSxVQUFVLG9CQUFvQiw4Q0FBOEMsMEJBQTBCO0FBQ3RHO0FBQ0EsVUFBVSxvQkFBb0IsOENBQThDLDBCQUEwQjtBQUN0RztBQUNBLFVBQVUsb0JBQW9CLDhDQUE4QywwQkFBMEI7QUFDdEc7QUFDQSxVQUFVLG9CQUFvQiw4Q0FBOEMsMEJBQTBCO0FBQ3RHO0FBQ0EsVUFBVSxvQkFBb0IsOENBQThDLDBCQUEwQjtBQUN0RztBQUNBLFVBQVUsb0JBQW9CLDhDQUE4QywwQkFBMEI7QUFDdEc7QUFDQSxVQUFVLG9CQUFvQiw4Q0FBOEMsMEJBQTBCO0FBQ3RHO0FBQ0EsVUFBVSxvQkFBb0IsOENBQThDLDBCQUEwQjtBQUN0RztBQUNBLFVBQVUsb0JBQW9CLDhDQUE4QywwQkFBMEI7QUFDdEc7QUFDQSxVQUFVLG9CQUFvQiw4Q0FBOEMsMEJBQTBCO0FBQ3RHO0FBQ0EsVUFBVSxvQkFBb0IsOENBQThDLDBCQUEwQjtBQUN0RztBQUNBLFVBQVUsb0JBQW9CLDhDQUE4QywwQkFBMEI7QUFDdEc7QUFDQSxVQUFVLG9CQUFvQiw4Q0FBOEMsMEJBQTBCO0FBQ3RHO0FBQ0EsVUFBVSxvQkFBb0IsOENBQThDLDBCQUEwQjtBQUN0RztBQUNBLFVBQVUsb0JBQW9CLDhDQUE4QywwQkFBMEI7QUFDdEc7QUFDQSxVQUFVLG9CQUFvQiw4Q0FBOEMsMEJBQTBCO0FBQ3RHO0FBQ0EsVUFBVSxvQkFBb0IsOENBQThDLDBCQUEwQjtBQUN0RztBQUNBLFVBQVUsb0JBQW9CLDhDQUE4QywwQkFBMEI7QUFDdEc7QUFDQSxVQUFVLG9CQUFvQiw4Q0FBOEMsMEJBQTBCO0FBQ3RHO0FBQ0EsVUFBVSxvQkFBb0IsOENBQThDLDBCQUEwQjtBQUN0RztBQUNBLFVBQVUsb0JBQW9CLDhDQUE4QywwQkFBMEI7QUFDdEc7QUFDQSxVQUFVLG9CQUFvQiw4Q0FBOEMsMEJBQTBCO0FBQ3RHO0FBQ0EsVUFBVSxvQkFBb0IsOENBQThDLDBCQUEwQjtBQUN0RztBQUNBLFVBQVUsb0JBQW9CLDhDQUE4QywwQkFBMEI7QUFDdEc7QUFDQSxVQUFVLG9CQUFvQiw4Q0FBOEMsMEJBQTBCO0FBQ3RHO0FBQ0EsVUFBVSxvQkFBb0IsOENBQThDLDBCQUEwQjtBQUN0RztBQUNBLFVBQVUsb0JBQW9CLDhDQUE4QywwQkFBMEI7QUFDdEc7QUFDQSxVQUFVLG9CQUFvQiw4Q0FBOEMsMEJBQTBCO0FBQ3RHO0FBQ0EsVUFBVSxvQkFBb0IsOENBQThDLDBCQUEwQjtBQUN0RztBQUNBLFVBQVUsb0JBQW9CLDhDQUE4QywwQkFBMEI7QUFDdEc7QUFDQSxVQUFVLG9CQUFvQiw4Q0FBOEMsMEJBQTBCO0FBQ3RHO0FBQ0EsVUFBVSxvQkFBb0IsOENBQThDLDBCQUEwQjtBQUN0RztBQUNBLFVBQVUsb0JBQW9CLDhDQUE4QywwQkFBMEI7QUFDdEc7QUFDQSxVQUFVLG9CQUFvQiw4Q0FBOEMsMEJBQTBCO0FBQ3RHO0FBQ0EsVUFBVSxvQkFBb0IsOENBQThDLDBCQUEwQjtBQUN0RztBQUNBLFVBQVUsb0JBQW9CLDhDQUE4QywwQkFBMEI7QUFDdEc7QUFDQSxVQUFVLG9CQUFvQiw4Q0FBOEMsMEJBQTBCO0FBQ3RHO0FBQ0EsVUFBVSxvQkFBb0IsOENBQThDLDBCQUEwQjtBQUN0RztBQUNBLFVBQVUsb0JBQW9CLDhDQUE4QywwQkFBMEI7QUFDdEc7QUFDQSxVQUFVLG9CQUFvQiw4Q0FBOEMsMEJBQTBCO0FBQ3RHO0FBQ0EsVUFBVSxvQkFBb0IsOENBQThDLDBCQUEwQjtBQUN0RztBQUNBLFVBQVUsb0JBQW9CLDhDQUE4QywwQkFBMEI7QUFDdEc7QUFDQSxVQUFVLG9CQUFvQiw4Q0FBOEMsMEJBQTBCO0FBQ3RHO0FBQ0EsVUFBVSxvQkFBb0IsOENBQThDLDBCQUEwQjtBQUN0RztBQUNBLFVBQVUsb0JBQW9CLDhDQUE4QywwQkFBMEI7QUFDdEc7QUFDQSxVQUFVLG9CQUFvQiw4Q0FBOEMsMEJBQTBCO0FBQ3RHO0FBQ0EsVUFBVSxvQkFBb0IsOENBQThDLDBCQUEwQjtBQUN0RztBQUNBLFVBQVUsb0JBQW9CLDhDQUE4QywwQkFBMEI7QUFDdEc7QUFDQSxVQUFVLG9CQUFvQiw4Q0FBOEMsMEJBQTBCO0FBQ3RHO0FBQ0EsVUFBVSxvQkFBb0IsOENBQThDLDBCQUEwQjtBQUN0RztBQUNBLFVBQVUsb0JBQW9CLDhDQUE4QywwQkFBMEI7QUFDdEc7QUFDQSxVQUFVLG9CQUFvQiw4Q0FBOEMsMEJBQTBCO0FBQ3RHO0FBQ0EsVUFBVSxvQkFBb0IsOENBQThDLDBCQUEwQjtBQUN0RztBQUNBLFVBQVUsb0JBQW9CLDhDQUE4QywwQkFBMEI7QUFDdEc7QUFDQSxVQUFVLG9CQUFvQiw4Q0FBOEMsMEJBQTBCO0FBQ3RHO0FBQ0EsVUFBVSxvQkFBb0IsOENBQThDLDBCQUEwQjtBQUN0RztBQUNBLFVBQVUsb0JBQW9CLDhDQUE4QywwQkFBMEI7QUFDdEc7QUFDQSxVQUFVLG9CQUFvQiw4Q0FBOEMsMEJBQTBCO0FBQ3RHO0FBQ0EsVUFBVSxvQkFBb0IsOENBQThDLDBCQUEwQjtBQUN0RztBQUNBLFVBQVUsb0JBQW9CLDhDQUE4QywwQkFBMEI7QUFDdEc7QUFDQSxVQUFVLG9CQUFvQiw4Q0FBOEMsMEJBQTBCO0FBQ3RHO0FBQ0EsVUFBVSxvQkFBb0IsOENBQThDLDBCQUEwQjtBQUN0RztBQUNBLFVBQVUsb0JBQW9CLDhDQUE4QywwQkFBMEI7QUFDdEc7QUFDQSxVQUFVLG9CQUFvQiw4Q0FBOEMsMEJBQTBCO0FBQ3RHO0FBQ0EsVUFBVSxvQkFBb0IsOENBQThDLDBCQUEwQjtBQUN0RztBQUNBLFVBQVUsb0JBQW9CLDhDQUE4QywwQkFBMEI7QUFDdEc7QUFDQSxVQUFVLG9CQUFvQiw4Q0FBOEMsMEJBQTBCO0FBQ3RHO0FBQ0EsVUFBVSxvQkFBb0IsOENBQThDLDBCQUEwQjtBQUN0RztBQUNBLFVBQVUsb0JBQW9CLDhDQUE4QywwQkFBMEI7QUFDdEc7QUFDQSxVQUFVLG9CQUFvQiw4Q0FBOEMsMEJBQTBCO0FBQ3RHO0FBQ0EsVUFBVSxvQkFBb0IsOENBQThDLDBCQUEwQjtBQUN0RyxRQUFRLHFCQUFxQixFQUFFO0FBQy9CLDJCQUEyQixtQkFBbUI7QUFDOUMsaU5BQWlOLGlFQUFpRSxFQUFFO0FBQ3BSLFVBQVUsa0JBQWtCLDRDQUE0QyxvQkFBb0I7QUFDNUY7QUFDQSxVQUFVLG9CQUFvQiw4Q0FBOEMsMEJBQTBCO0FBQ3RHO0FBQ0EsVUFBVSxvQkFBb0IsOENBQThDLDBCQUEwQjtBQUN0RztBQUNBLFVBQVUsb0JBQW9CLDhDQUE4QywwQkFBMEI7QUFDdEc7QUFDQSxVQUFVLG9CQUFvQiw4Q0FBOEMsMEJBQTBCO0FBQ3RHO0FBQ0EsVUFBVSxvQkFBb0IsOENBQThDLDBCQUEwQjtBQUN0RztBQUNBLFVBQVUsb0JBQW9CLDhDQUE4QywwQkFBMEI7QUFDdEc7QUFDQSxVQUFVLG9CQUFvQiw4Q0FBOEMsMEJBQTBCO0FBQ3RHO0FBQ0EsVUFBVSxvQkFBb0IsOENBQThDLDBCQUEwQjtBQUN0RztBQUNBLFVBQVUsb0JBQW9CLDhDQUE4QywwQkFBMEI7QUFDdEc7QUFDQSxVQUFVLG9CQUFvQiw4Q0FBOEMsMEJBQTBCO0FBQ3RHO0FBQ0EsVUFBVSxvQkFBb0IsOENBQThDLDBCQUEwQjtBQUN0RztBQUNBLFVBQVUsb0JBQW9CLDhDQUE4QywwQkFBMEI7QUFDdEc7QUFDQSxVQUFVLG9CQUFvQiw4Q0FBOEMsMEJBQTBCO0FBQ3RHO0FBQ0EsVUFBVSxvQkFBb0IsOENBQThDLDBCQUEwQjtBQUN0RztBQUNBLFVBQVUsb0JBQW9CLDhDQUE4QywwQkFBMEI7QUFDdEc7QUFDQSxVQUFVLG9CQUFvQiw4Q0FBOEMsMEJBQTBCO0FBQ3RHO0FBQ0EsVUFBVSxvQkFBb0IsOENBQThDLDBCQUEwQjtBQUN0RztBQUNBLFVBQVUsb0JBQW9CLDhDQUE4QywwQkFBMEI7QUFDdEc7QUFDQSxVQUFVLG9CQUFvQiw4Q0FBOEMsMEJBQTBCO0FBQ3RHO0FBQ0EsVUFBVSxvQkFBb0IsOENBQThDLDBCQUEwQjtBQUN0RztBQUNBLFVBQVUsb0JBQW9CLDhDQUE4QywwQkFBMEI7QUFDdEc7QUFDQSxVQUFVLG9CQUFvQiw4Q0FBOEMsMEJBQTBCO0FBQ3RHO0FBQ0EsVUFBVSxvQkFBb0IsOENBQThDLDBCQUEwQjtBQUN0RztBQUNBLFVBQVUsb0JBQW9CLDhDQUE4QywwQkFBMEI7QUFDdEc7QUFDQSxVQUFVLG9CQUFvQiw4Q0FBOEMsMEJBQTBCO0FBQ3RHO0FBQ0EsVUFBVSxvQkFBb0IsOENBQThDLDBCQUEwQjtBQUN0RztBQUNBLFVBQVUsb0JBQW9CLDhDQUE4QywwQkFBMEI7QUFDdEc7QUFDQSxVQUFVLG9CQUFvQiw4Q0FBOEMsMEJBQTBCO0FBQ3RHO0FBQ0EsVUFBVSxvQkFBb0IsOENBQThDLDBCQUEwQjtBQUN0RztBQUNBLFVBQVUsb0JBQW9CLDhDQUE4QywwQkFBMEI7QUFDdEc7QUFDQSxVQUFVLG9CQUFvQiw4Q0FBOEMsMEJBQTBCO0FBQ3RHO0FBQ0EsVUFBVSxvQkFBb0IsOENBQThDLDBCQUEwQjtBQUN0RztBQUNBLFVBQVUsb0JBQW9CLDhDQUE4QywwQkFBMEI7QUFDdEc7QUFDQSxVQUFVLG9CQUFvQiw4Q0FBOEMsMEJBQTBCO0FBQ3RHO0FBQ0EsVUFBVSxvQkFBb0IsOENBQThDLDBCQUEwQjtBQUN0RztBQUNBLFVBQVUsb0JBQW9CLDhDQUE4QywwQkFBMEI7QUFDdEc7QUFDQSxVQUFVLG9CQUFvQiw4Q0FBOEMsMEJBQTBCO0FBQ3RHO0FBQ0EsVUFBVSxvQkFBb0IsOENBQThDLDBCQUEwQjtBQUN0RztBQUNBLFVBQVUsb0JBQW9CLDhDQUE4QywwQkFBMEI7QUFDdEc7QUFDQSxVQUFVLG9CQUFvQiw4Q0FBOEMsMEJBQTBCO0FBQ3RHO0FBQ0EsVUFBVSxvQkFBb0IsOENBQThDLDBCQUEwQjtBQUN0RztBQUNBLFVBQVUsb0JBQW9CLDhDQUE4QywwQkFBMEI7QUFDdEc7QUFDQSxVQUFVLG9CQUFvQiw4Q0FBOEMsMEJBQTBCO0FBQ3RHO0FBQ0EsVUFBVSxvQkFBb0IsOENBQThDLDBCQUEwQjtBQUN0RztBQUNBLFVBQVUsb0JBQW9CLDhDQUE4QywwQkFBMEI7QUFDdEc7QUFDQSxVQUFVLG9CQUFvQiw4Q0FBOEMsMEJBQTBCO0FBQ3RHO0FBQ0EsVUFBVSxvQkFBb0IsOENBQThDLDBCQUEwQjtBQUN0RztBQUNBLFVBQVUsb0JBQW9CLDhDQUE4QywwQkFBMEI7QUFDdEc7QUFDQSxVQUFVLG9CQUFvQiw4Q0FBOEMsMEJBQTBCO0FBQ3RHO0FBQ0EsVUFBVSxvQkFBb0IsOENBQThDLDBCQUEwQjtBQUN0RztBQUNBLFVBQVUsb0JBQW9CLDhDQUE4QywwQkFBMEI7QUFDdEc7QUFDQSxVQUFVLG9CQUFvQiw4Q0FBOEMsMEJBQTBCO0FBQ3RHO0FBQ0EsVUFBVSxvQkFBb0IsOENBQThDLDBCQUEwQjtBQUN0RztBQUNBLFVBQVUsb0JBQW9CLDhDQUE4QywwQkFBMEI7QUFDdEc7QUFDQSxVQUFVLG9CQUFvQiw4Q0FBOEMsMEJBQTBCO0FBQ3RHO0FBQ0EsVUFBVSxvQkFBb0IsOENBQThDLDBCQUEwQjtBQUN0RztBQUNBLFVBQVUsb0JBQW9CLDhDQUE4QywwQkFBMEI7QUFDdEc7QUFDQSxVQUFVLG9CQUFvQiw4Q0FBOEMsMEJBQTBCO0FBQ3RHO0FBQ0EsVUFBVSxvQkFBb0IsOENBQThDLDBCQUEwQjtBQUN0RztBQUNBLFVBQVUsb0JBQW9CLDhDQUE4QywwQkFBMEI7QUFDdEc7QUFDQSxVQUFVLG9CQUFvQiw4Q0FBOEMsMEJBQTBCO0FBQ3RHO0FBQ0EsVUFBVSxvQkFBb0IsOENBQThDLDBCQUEwQjtBQUN0RztBQUNBLFVBQVUsb0JBQW9CLDhDQUE4QywwQkFBMEI7QUFDdEc7QUFDQSxVQUFVLG9CQUFvQiw4Q0FBOEMsMEJBQTBCO0FBQ3RHO0FBQ0EsVUFBVSxvQkFBb0IsOENBQThDLDBCQUEwQjtBQUN0RztBQUNBLFVBQVUsb0JBQW9CLDhDQUE4QywwQkFBMEI7QUFDdEc7QUFDQSxVQUFVLG9CQUFvQiw4Q0FBOEMsMEJBQTBCO0FBQ3RHO0FBQ0EsVUFBVSxvQkFBb0IsOENBQThDLDBCQUEwQjtBQUN0RztBQUNBLFVBQVUsb0JBQW9CLDhDQUE4QywwQkFBMEI7QUFDdEc7QUFDQSxVQUFVLG9CQUFvQiw4Q0FBOEMsMEJBQTBCO0FBQ3RHO0FBQ0EsVUFBVSxvQkFBb0IsOENBQThDLDBCQUEwQjtBQUN0RztBQUNBLFVBQVUsb0JBQW9CLDhDQUE4QywwQkFBMEI7QUFDdEc7QUFDQSxVQUFVLG9CQUFvQiw4Q0FBOEMsMEJBQTBCO0FBQ3RHO0FBQ0EsVUFBVSxvQkFBb0IsOENBQThDLDBCQUEwQjtBQUN0RztBQUNBLFVBQVUsb0JBQW9CLDhDQUE4QywwQkFBMEI7QUFDdEc7QUFDQSxVQUFVLG9CQUFvQiw4Q0FBOEMsMEJBQTBCO0FBQ3RHO0FBQ0EsVUFBVSxvQkFBb0IsOENBQThDLDBCQUEwQjtBQUN0RztBQUNBLFVBQVUsb0JBQW9CLDhDQUE4QywwQkFBMEI7QUFDdEc7QUFDQSxVQUFVLG9CQUFvQiw4Q0FBOEMsMEJBQTBCO0FBQ3RHO0FBQ0EsVUFBVSxvQkFBb0IsOENBQThDLDBCQUEwQjtBQUN0RztBQUNBLFVBQVUsb0JBQW9CLDhDQUE4QywwQkFBMEI7QUFDdEc7QUFDQSxVQUFVLG9CQUFvQiw4Q0FBOEMsMEJBQTBCO0FBQ3RHO0FBQ0EsVUFBVSxvQkFBb0IsOENBQThDLDBCQUEwQjtBQUN0RztBQUNBLFVBQVUsb0JBQW9CLDhDQUE4QywwQkFBMEI7QUFDdEc7QUFDQSxVQUFVLG9CQUFvQiw4Q0FBOEMsMEJBQTBCO0FBQ3RHO0FBQ0EsVUFBVSxvQkFBb0IsOENBQThDLDBCQUEwQjtBQUN0RztBQUNBLFVBQVUsb0JBQW9CLDhDQUE4QywwQkFBMEI7QUFDdEc7QUFDQSxVQUFVLG9CQUFvQiw4Q0FBOEMsMEJBQTBCO0FBQ3RHO0FBQ0EsVUFBVSxvQkFBb0IsOENBQThDLDBCQUEwQjtBQUN0RztBQUNBLFVBQVUsb0JBQW9CLDhDQUE4QywwQkFBMEI7QUFDdEc7QUFDQSxVQUFVLG9CQUFvQiw4Q0FBOEMsMEJBQTBCO0FBQ3RHO0FBQ0EsVUFBVSxvQkFBb0IsOENBQThDLDBCQUEwQjtBQUN0RztBQUNBLFVBQVUsb0JBQW9CLDhDQUE4QywwQkFBMEI7QUFDdEc7QUFDQSxVQUFVLG9CQUFvQiw4Q0FBOEMsMEJBQTBCO0FBQ3RHO0FBQ0EsVUFBVSxvQkFBb0IsOENBQThDLDBCQUEwQjtBQUN0RztBQUNBLFVBQVUsb0JBQW9CLDhDQUE4QywwQkFBMEI7QUFDdEc7QUFDQSxVQUFVLG9CQUFvQiw4Q0FBOEMsMEJBQTBCO0FBQ3RHO0FBQ0EsVUFBVSxvQkFBb0IsOENBQThDLDBCQUEwQjtBQUN0RztBQUNBLFVBQVUsb0JBQW9CLDhDQUE4QywwQkFBMEI7QUFDdEc7QUFDQSxVQUFVLG9CQUFvQiw4Q0FBOEMsMEJBQTBCO0FBQ3RHO0FBQ0EsVUFBVSxvQkFBb0IsOENBQThDLDBCQUEwQjtBQUN0RztBQUNBLFVBQVUsb0JBQW9CLDhDQUE4QywwQkFBMEI7QUFDdEc7QUFDQSxVQUFVLG9CQUFvQiw4Q0FBOEMsMEJBQTBCO0FBQ3RHO0FBQ0EsVUFBVSxvQkFBb0IsOENBQThDLDBCQUEwQjtBQUN0RztBQUNBLFVBQVUsb0JBQW9CLDhDQUE4QywwQkFBMEI7QUFDdEc7QUFDQSxVQUFVLG9CQUFvQiw4Q0FBOEMsMEJBQTBCO0FBQ3RHO0FBQ0EsVUFBVSxvQkFBb0IsOENBQThDLDBCQUEwQjtBQUN0RztBQUNBLFVBQVUsb0JBQW9CLDhDQUE4QywwQkFBMEI7QUFDdEc7QUFDQSxVQUFVLG9CQUFvQiw4Q0FBOEMsMEJBQTBCO0FBQ3RHO0FBQ0EsVUFBVSxvQkFBb0IsOENBQThDLDBCQUEwQjtBQUN0RztBQUNBLFVBQVUsb0JBQW9CLDhDQUE4QywwQkFBMEI7QUFDdEc7QUFDQSxVQUFVLG9CQUFvQiw4Q0FBOEMsMEJBQTBCO0FBQ3RHO0FBQ0EsVUFBVSxvQkFBb0IsOENBQThDLDBCQUEwQjtBQUN0RztBQUNBLFVBQVUsb0JBQW9CLDhDQUE4QywwQkFBMEI7QUFDdEc7QUFDQSxVQUFVLG9CQUFvQiw4Q0FBOEMsMEJBQTBCO0FBQ3RHO0FBQ0EsVUFBVSxvQkFBb0IsOENBQThDLDBCQUEwQjtBQUN0RztBQUNBLFVBQVUsb0JBQW9CLDhDQUE4QywwQkFBMEI7QUFDdEc7QUFDQSxVQUFVLG9CQUFvQiw4Q0FBOEMsMEJBQTBCO0FBQ3RHO0FBQ0EsVUFBVSxvQkFBb0IsOENBQThDLDBCQUEwQjtBQUN0RztBQUNBLFVBQVUsb0JBQW9CLDhDQUE4QywwQkFBMEI7QUFDdEc7QUFDQSxVQUFVLG9CQUFvQiw4Q0FBOEMsMEJBQTBCO0FBQ3RHO0FBQ0EsVUFBVSxvQkFBb0IsOENBQThDLDBCQUEwQjtBQUN0RztBQUNBLFVBQVUsb0JBQW9CLDhDQUE4QywwQkFBMEI7QUFDdEc7QUFDQSxVQUFVLG9CQUFvQiw4Q0FBOEMsMEJBQTBCO0FBQ3RHLFFBQVEscUJBQXFCLEVBQUU7QUFDL0IsMkJBQTJCLG1CQUFtQjtBQUM5QyxpTkFBaU4saUVBQWlFLEVBQUU7QUFDcFIsVUFBVSxrQkFBa0IsNENBQTRDLG9CQUFvQjtBQUM1RjtBQUNBLFVBQVUsb0JBQW9CLDhDQUE4QywwQkFBMEI7QUFDdEc7QUFDQSxVQUFVLG9CQUFvQiw4Q0FBOEMsMEJBQTBCO0FBQ3RHO0FBQ0EsVUFBVSxvQkFBb0IsOENBQThDLDBCQUEwQjtBQUN0RztBQUNBLFVBQVUsb0JBQW9CLDhDQUE4QywwQkFBMEI7QUFDdEc7QUFDQSxVQUFVLG9CQUFvQiw4Q0FBOEMsMEJBQTBCO0FBQ3RHO0FBQ0EsVUFBVSxvQkFBb0IsOENBQThDLDBCQUEwQjtBQUN0RztBQUNBLFVBQVUsb0JBQW9CLDhDQUE4QywwQkFBMEI7QUFDdEc7QUFDQSxVQUFVLG9CQUFvQiw4Q0FBOEMsMEJBQTBCO0FBQ3RHO0FBQ0EsVUFBVSxvQkFBb0IsOENBQThDLDBCQUEwQjtBQUN0RztBQUNBLFVBQVUsb0JBQW9CLDhDQUE4QywwQkFBMEI7QUFDdEc7QUFDQSxVQUFVLG9CQUFvQiw4Q0FBOEMsMEJBQTBCO0FBQ3RHO0FBQ0EsVUFBVSxvQkFBb0IsOENBQThDLDBCQUEwQjtBQUN0RztBQUNBLFVBQVUsb0JBQW9CLDhDQUE4QywwQkFBMEI7QUFDdEc7QUFDQSxVQUFVLG9CQUFvQiw4Q0FBOEMsMEJBQTBCO0FBQ3RHO0FBQ0EsVUFBVSxvQkFBb0IsOENBQThDLDBCQUEwQjtBQUN0RztBQUNBLFVBQVUsb0JBQW9CLDhDQUE4QywwQkFBMEI7QUFDdEc7QUFDQSxVQUFVLG9CQUFvQiw4Q0FBOEMsMEJBQTBCO0FBQ3RHO0FBQ0EsVUFBVSxvQkFBb0IsOENBQThDLDBCQUEwQjtBQUN0RztBQUNBLFVBQVUsb0JBQW9CLDhDQUE4QywwQkFBMEI7QUFDdEc7QUFDQSxVQUFVLG9CQUFvQiw4Q0FBOEMsMEJBQTBCO0FBQ3RHO0FBQ0EsVUFBVSxvQkFBb0IsOENBQThDLDBCQUEwQjtBQUN0RztBQUNBLFVBQVUsb0JBQW9CLDhDQUE4QywwQkFBMEI7QUFDdEc7QUFDQSxVQUFVLG9CQUFvQiw4Q0FBOEMsMEJBQTBCO0FBQ3RHO0FBQ0EsVUFBVSxvQkFBb0IsOENBQThDLDBCQUEwQjtBQUN0RztBQUNBLFVBQVUsb0JBQW9CLDhDQUE4QywwQkFBMEI7QUFDdEc7QUFDQSxVQUFVLG9CQUFvQiw4Q0FBOEMsMEJBQTBCO0FBQ3RHO0FBQ0EsVUFBVSxvQkFBb0IsOENBQThDLDBCQUEwQjtBQUN0RztBQUNBLFVBQVUsb0JBQW9CLDhDQUE4QywwQkFBMEI7QUFDdEc7QUFDQSxVQUFVLG9CQUFvQiw4Q0FBOEMsMEJBQTBCO0FBQ3RHO0FBQ0EsVUFBVSxvQkFBb0IsOENBQThDLDBCQUEwQjtBQUN0RztBQUNBLFVBQVUsb0JBQW9CLDhDQUE4QywwQkFBMEI7QUFDdEc7QUFDQSxVQUFVLG9CQUFvQiw4Q0FBOEMsMEJBQTBCO0FBQ3RHO0FBQ0EsVUFBVSxvQkFBb0IsOENBQThDLDBCQUEwQjtBQUN0RztBQUNBLFVBQVUsb0JBQW9CLDhDQUE4QywwQkFBMEI7QUFDdEc7QUFDQSxVQUFVLG9CQUFvQiw4Q0FBOEMsMEJBQTBCO0FBQ3RHO0FBQ0EsVUFBVSxvQkFBb0IsOENBQThDLDBCQUEwQjtBQUN0RztBQUNBLFVBQVUsb0JBQW9CLDhDQUE4QywwQkFBMEI7QUFDdEc7QUFDQSxVQUFVLG9CQUFvQiw4Q0FBOEMsMEJBQTBCO0FBQ3RHO0FBQ0EsVUFBVSxvQkFBb0IsOENBQThDLDBCQUEwQjtBQUN0RztBQUNBLFVBQVUsb0JBQW9CLDhDQUE4QywwQkFBMEI7QUFDdEc7QUFDQSxVQUFVLG9CQUFvQiw4Q0FBOEMsMEJBQTBCO0FBQ3RHO0FBQ0EsVUFBVSxvQkFBb0IsOENBQThDLDBCQUEwQjtBQUN0RztBQUNBLFVBQVUsb0JBQW9CLDhDQUE4QywwQkFBMEI7QUFDdEc7QUFDQSxVQUFVLG9CQUFvQiw4Q0FBOEMsMEJBQTBCO0FBQ3RHO0FBQ0EsVUFBVSxvQkFBb0IsOENBQThDLDBCQUEwQjtBQUN0RztBQUNBLFVBQVUsb0JBQW9CLDhDQUE4QywwQkFBMEI7QUFDdEc7QUFDQSxVQUFVLG9CQUFvQiw4Q0FBOEMsMEJBQTBCO0FBQ3RHO0FBQ0EsVUFBVSxvQkFBb0IsOENBQThDLDBCQUEwQjtBQUN0RztBQUNBLFVBQVUsb0JBQW9CLDhDQUE4QywwQkFBMEI7QUFDdEc7QUFDQSxVQUFVLG9CQUFvQiw4Q0FBOEMsMEJBQTBCO0FBQ3RHO0FBQ0EsVUFBVSxvQkFBb0IsOENBQThDLDBCQUEwQjtBQUN0RztBQUNBLFVBQVUsb0JBQW9CLDhDQUE4QywwQkFBMEI7QUFDdEc7QUFDQSxVQUFVLG9CQUFvQiw4Q0FBOEMsMEJBQTBCO0FBQ3RHO0FBQ0EsVUFBVSxvQkFBb0IsOENBQThDLDBCQUEwQjtBQUN0RztBQUNBLFVBQVUsb0JBQW9CLDhDQUE4QywwQkFBMEI7QUFDdEc7QUFDQSxVQUFVLG9CQUFvQiw4Q0FBOEMsMEJBQTBCO0FBQ3RHO0FBQ0EsVUFBVSxvQkFBb0IsOENBQThDLDBCQUEwQjtBQUN0RztBQUNBLFVBQVUsb0JBQW9CLDhDQUE4QywwQkFBMEI7QUFDdEc7QUFDQSxVQUFVLG9CQUFvQiw4Q0FBOEMsMEJBQTBCO0FBQ3RHO0FBQ0EsVUFBVSxvQkFBb0IsOENBQThDLDBCQUEwQjtBQUN0RztBQUNBLFVBQVUsb0JBQW9CLDhDQUE4QywwQkFBMEI7QUFDdEc7QUFDQSxVQUFVLG9CQUFvQiw4Q0FBOEMsMEJBQTBCO0FBQ3RHO0FBQ0EsVUFBVSxvQkFBb0IsOENBQThDLDBCQUEwQjtBQUN0RztBQUNBLFVBQVUsb0JBQW9CLDhDQUE4QywwQkFBMEI7QUFDdEc7QUFDQSxVQUFVLG9CQUFvQiw4Q0FBOEMsMEJBQTBCO0FBQ3RHO0FBQ0EsVUFBVSxvQkFBb0IsOENBQThDLDBCQUEwQjtBQUN0RztBQUNBLFVBQVUsb0JBQW9CLDhDQUE4QywwQkFBMEI7QUFDdEc7QUFDQSxVQUFVLG9CQUFvQiw4Q0FBOEMsMEJBQTBCO0FBQ3RHO0FBQ0EsVUFBVSxvQkFBb0IsOENBQThDLDBCQUEwQjtBQUN0RztBQUNBLFVBQVUsb0JBQW9CLDhDQUE4QywwQkFBMEI7QUFDdEc7QUFDQSxVQUFVLG9CQUFvQiw4Q0FBOEMsMEJBQTBCO0FBQ3RHO0FBQ0EsVUFBVSxvQkFBb0IsOENBQThDLDBCQUEwQjtBQUN0RztBQUNBLFVBQVUsb0JBQW9CLDhDQUE4QywwQkFBMEI7QUFDdEc7QUFDQSxVQUFVLG9CQUFvQiw4Q0FBOEMsMEJBQTBCO0FBQ3RHO0FBQ0EsVUFBVSxvQkFBb0IsOENBQThDLDBCQUEwQjtBQUN0RztBQUNBLFVBQVUsb0JBQW9CLDhD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RztBQUNBLFVBQVUsb0JBQW9CLDhDQUE4QywwQkFBMEI7QUFDdEc7QUFDQSxVQUFVLG9CQUFvQiw4Q0FBOEMsMEJBQTBCO0FBQ3RHO0FBQ0EsVUFBVSxvQkFBb0IsOENBQThDLDBCQUEwQjtBQUN0RztBQUNBLFVBQVUsb0JBQW9CLDhDQUE4QywwQkFBMEI7QUFDdEc7QUFDQSxVQUFVLG9CQUFvQiw4Q0FBOEMsMEJBQTBCO0FBQ3RHO0FBQ0EsVUFBVSxvQkFBb0IsOENBQThDLDBCQUEwQjtBQUN0RztBQUNBLFVBQVUsb0JBQW9CLDhDQUE4QywwQkFBMEI7QUFDdEc7QUFDQSxVQUFVLG9CQUFvQiw4Q0FBOEMsMEJBQTBCO0FBQ3RHO0FBQ0EsVUFBVSxvQkFBb0IsOENBQThDLDBCQUEwQjtBQUN0RztBQUNBLFVBQVUsb0JBQW9CLDhDQUE4QywwQkFBMEI7QUFDdEc7QUFDQSxVQUFVLG9CQUFvQiw4Q0FBOEMsMEJBQTBCO0FBQ3RHO0FBQ0EsVUFBVSxvQkFBb0IsOENBQThDLDBCQUEwQjtBQUN0RztBQUNBLFVBQVUsb0JBQW9CLDhDQUE4QywwQkFBMEI7QUFDdEc7QUFDQSxVQUFVLG9CQUFvQiw4Q0FBOEMsMEJBQTBCO0FBQ3RHO0FBQ0EsVUFBVSxvQkFBb0IsOENBQThDLDBCQUEwQjtBQUN0RztBQUNBLFVBQVUsb0JBQW9CLDhDQUE4QywwQkFBMEI7QUFDdEc7QUFDQSxVQUFVLG9CQUFvQiw4Q0FBOEMsMEJBQTBCO0FBQ3RHO0FBQ0EsVUFBVSxvQkFBb0IsOENBQThDLDBCQUEwQjtBQUN0RztBQUNBLFVBQVUsb0JBQW9CLDhDQUE4QywwQkFBMEI7QUFDdEc7QUFDQSxVQUFVLG9CQUFvQiw4Q0FBOEMsMEJBQTBCO0FBQ3RHO0FBQ0EsVUFBVSxvQkFBb0IsOENBQThDLDBCQUEwQjtBQUN0RztBQUNBLFVBQVUsb0JBQW9CLDhDQUE4QywwQkFBMEI7QUFDdEc7QUFDQSxVQUFVLG9CQUFvQiw4Q0FBOEMsMEJBQTBCO0FBQ3RHO0FBQ0EsVUFBVSxvQkFBb0IsOENBQThDLDBCQUEwQjtBQUN0RztBQUNBLFVBQVUsb0JBQW9CLDhDQUE4QywwQkFBMEI7QUFDdEc7QUFDQSxVQUFVLG9CQUFvQiw4Q0FBOEMsMEJBQTBCO0FBQ3RHO0FBQ0EsVUFBVSxvQkFBb0IsOENBQThDLDBCQUEwQjtBQUN0RztBQUNBLFVBQVUsb0JBQW9CLDhDQUE4QywwQkFBMEI7QUFDdEc7QUFDQSxVQUFVLG9CQUFvQiw4Q0FBOEMsMEJBQTBCO0FBQ3RHO0FBQ0EsVUFBVSxvQkFBb0IsOENBQThDLDBCQUEwQjtBQUN0RztBQUNBLFVBQVUsb0JBQW9CLDhDQUE4QywwQkFBMEI7QUFDdEc7QUFDQSxVQUFVLG9CQUFvQiw4Q0FBOEMsMEJBQTBCO0FBQ3RHO0FBQ0EsVUFBVSxvQkFBb0IsOENBQThDLDBCQUEwQjtBQUN0RztBQUNBLFVBQVUsb0JBQW9CLDhDQUE4QywwQkFBMEI7QUFDdEc7QUFDQSxVQUFVLG9CQUFvQiw4Q0FBOEMsMEJBQTBCO0FBQ3RHO0FBQ0EsVUFBVSxvQkFBb0IsOENBQThDLDBCQUEwQjtBQUN0RztBQUNBLFVBQVUsb0JBQW9CLDhDQUE4QywwQkFBMEI7QUFDdEc7QUFDQSxVQUFVLG9CQUFvQiw4Q0FBOEMsMEJBQTBCO0FBQ3RHO0FBQ0EsVUFBVSxvQkFBb0IsOENBQThDLDBCQUEwQjtBQUN0RztBQUNBLFVBQVUsb0JBQW9CLDhDQUE4QywwQkFBMEI7QUFDdEc7QUFDQSxVQUFVLG9CQUFvQiw4Q0FBOEMsMEJBQTBCO0FBQ3RHO0FBQ0EsVUFBVSxvQkFBb0IsOENBQThDLDBCQUEwQjtBQUN0RztBQUNBLFVBQVUsb0JBQW9CLDhDQUE4QywwQkFBMEI7QUFDdEc7QUFDQSxVQUFVLG9CQUFvQiw4Q0FBOEMsMEJBQTBCO0FBQ3RHO0FBQ0EsVUFBVSxvQkFBb0IsOENBQThDLDBCQUEwQjtBQUN0RztBQUNBLFVBQVUsb0JBQW9CLDhDQUE4QywwQkFBMEI7QUFDdEc7QUFDQSxVQUFVLG9CQUFvQiw4Q0FBOEMsMEJBQTBCO0FBQ3RHO0FBQ0EsVUFBVSxvQkFBb0IsOENBQThDLDBCQUEwQjtBQUN0RztBQUNBLFVBQVUsb0JBQW9CLDhDQUE4QywwQkFBMEI7QUFDdEc7QUFDQSxVQUFVLG9CQUFvQiw4Q0FBOEMsMEJBQTBCO0FBQ3RHO0FBQ0EsVUFBVSxvQkFBb0IsOENBQThDLDBCQUEwQjtBQUN0RztBQUNBLFVBQVUsb0JBQW9CLDhDQUE4QywwQkFBMEI7QUFDdEc7QUFDQSxVQUFVLG9CQUFvQiw4Q0FBOEMsMEJBQTBCO0FBQ3RHO0FBQ0EsVUFBVSxvQkFBb0IsOENBQThDLDBCQUEwQjtBQUN0RztBQUNBLFVBQVUsb0JBQW9CLDhDQUE4QywwQkFBMEI7QUFDdEc7QUFDQSxVQUFVLG9CQUFvQiw4Q0FBOEMsMEJBQTBCO0FBQ3RHO0FBQ0EsVUFBVSxvQkFBb0IsOENBQThDLDBCQUEwQjtBQUN0RztBQUNBLFVBQVUsb0JBQW9CLDhDQUE4QywwQkFBMEI7QUFDdEc7QUFDQSxVQUFVLG9CQUFvQiw4Q0FBOEMsMEJBQTBCO0FBQ3RHO0FBQ0EsVUFBVSxvQkFBb0IsOENBQThDLDBCQUEwQjtBQUN0RztBQUNBLFVBQVUsb0JBQW9CLDhDQUE4QywwQkFBMEI7QUFDdEc7QUFDQSxVQUFVLG9CQUFvQiw4Q0FBOEMsMEJBQTBCO0FBQ3RHO0FBQ0EsVUFBVSxvQkFBb0IsOENBQThDLDBCQUEwQjtBQUN0RztBQUNBLFVBQVUsb0JBQW9CLDhDQUE4QywwQkFBMEI7QUFDdEc7QUFDQSxVQUFVLG9CQUFvQiw4Q0FBOEMsMEJBQTBCO0FBQ3RHO0FBQ0EsVUFBVSxvQkFBb0IsOENBQThDLDBCQUEwQjtBQUN0RztBQUNBLFVBQVUsb0JBQW9CLDhDQUE4QywwQkFBMEI7QUFDdEc7QUFDQSxVQUFVLG9CQUFvQiw4Q0FBOEMsMEJBQTBCO0FBQ3RHO0FBQ0EsVUFBVSxvQkFBb0IsOENBQThDLDBCQUEwQjtBQUN0RztBQUNBLFVBQVUsb0JBQW9CLDhDQUE4QywwQkFBMEI7QUFDdEc7QUFDQSxVQUFVLG9CQUFvQiw4Q0FBOEMsMEJBQTBCO0FBQ3RHO0FBQ0EsVUFBVSxvQkFBb0IsOENBQThDLDBCQUEwQjtBQUN0RztBQUNBLFVBQVUsb0JBQW9CLDhDQUE4QywwQkFBMEI7QUFD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O0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsV0FBVyxPQUFPO0FBQ2xCLFdBQVcsVUFBVTtBQUNyQixXQUFXLHVCQUF1QjtBQUNsQyxXQUFXLE9BQU87QUFDbEIsWUFBWSxPQUFPO0FBQ25CO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxlQUFlLHFDQUFxQztBQUNwRCxlQUFlLE9BQU87QUFDdEI7QUFDQSxnQkFBZ0IsTUFBTTtBQUN0QjtBQUNBO0FBQ0E7QUFDQSxLQUFLOztBQUVMO0FBQ0E7QUFDQSxlQUFlLFNBQVM7QUFDeEIsc0NBQXNDO0FBQ3RDO0FBQ0EsZ0JBQWdCLE1BQU07QUFDdEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw4Q0FBOEM7QUFDOUM7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLOztBQUVMO0FBQ0E7QUFDQSxpQkFBaUIsY0FBYztBQUMvQjtBQUNBLGlCQUFpQixxQ0FBcUM7QUFDdEQsaUJBQWlCLE9BQU87QUFDeEIsaUJBQWlCLG1CQUFtQjtBQUNwQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCO0FBQ2pCO0FBQ0Esa0JBQWtCO0FBQ2xCO0FBQ0E7QUFDQSxpQkFBaUI7QUFDakI7QUFDQTtBQUNBLGNBQWM7QUFDZDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7O0FBRUw7QUFDQTtBQUNBLGlCQUFpQixjQUFjO0FBQy9CLGlCQUFpQixNQUFNO0FBQ3ZCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7O0FBRUw7QUFDQTtBQUNBLGVBQWUsT0FBTztBQUN0QixnQkFBZ0IsTUFBTTtBQUN0QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2IsMkJBQTJCLGlCQUFpQjtBQUM1QztBQUNBO0FBQ0E7O0FBRUE7QUFDQSxLQUFLOztBQUVMO0FBQ0E7QUFDQSxlQUFlLE9BQU87QUFDdEI7QUFDQTtBQUNBO0FBQ0EsZ0JBQWdCLDBDQUEwQztBQUMxRDtBQUNBO0FBQ0Esc0NBQXNDO0FBQ3RDO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUzs7QUFFVDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7O0FBRUEsbUJBQW1CLG9CQUFvQjtBQUN2QztBQUNBO0FBQ0E7QUFDQSxtQkFBbUIsb0JBQW9CO0FBQ3ZDO0FBQ0E7O0FBRUE7O0FBRUE7Ozs7QUFJQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLEtBQUs7O0FBRUw7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSzs7QUFFTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLOztBQUVMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxDQUFDLEVBQUUseU1BQXlNO0FBQzVNO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLENBQUMsR0FBRztBQUNKO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLENBQUMsRUFBRSw4QkFBOEI7QUFDakM7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxlQUFlLE9BQU87QUFDdEI7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLGdCQUFnQixPQUFPO0FBQ3ZCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUEsQ0FBQyxFQUFFLGFBQWE7QUFDaEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsQ0FBQztBQUNELENBQUMsR0FBRztBQUNKO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQ0FBaUMsUUFBUTtBQUN6QztBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxDQUFDLEVBQUUsaUJBQWlCO0FBQ3BCOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsT0FBTztBQUNsQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZUFBZSxPQUFPO0FBQ3RCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLGdCQUFnQixXQUFXO0FBQzNCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUEsQ0FBQyxFQUFFLGFBQWE7QUFDaEI7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYSxPQUFPO0FBQ3BCO0FBQ0E7QUFDQSw4QkFBOEI7O0FBRTlCO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLG1CQUFtQixpQkFBaUI7QUFDcEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7O0FBRUE7QUFDQSx3QkFBd0IsYUFBYTtBQUNyQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSwyQkFBMkIsa0JBQWtCOztBQUU3QztBQUNBO0FBQ0Esb0RBQW9ELE9BQU87O0FBRTNEO0FBQ0E7QUFDQSxrQkFBa0IsWUFBWTs7QUFFOUI7QUFDQTtBQUNBLG9CQUFvQixZQUFZOztBQUVoQztBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLG9CQUFvQixPQUFPO0FBQzNCO0FBQ0E7QUFDQSx1QkFBdUIscUJBQXFCLFVBQVU7O0FBRXREO0FBQ0E7QUFDQSx3QkFBd0IsMEJBQTBCLGNBQWMsVUFBVTs7QUFFMUU7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSx3QkFBd0IsMEJBQTBCLFVBQVU7O0FBRTVEO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOzs7QUFHQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0EsV0FBVyxPQUFPO0FBQ2xCLFlBQVksd0JBQXdCO0FBQ3BDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0EsV0FBVyx3QkFBd0I7QUFDbkMsWUFBWSxPQUFPO0FBQ25CO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQSxDQUFDLEVBQUUsOENBQThDO0FBQ2pEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsT0FBTztBQUNsQixZQUFZLE9BQU87QUFDbkI7QUFDQTtBQUNBO0FBQ0EsbUJBQW1CLGdCQUFnQjtBQUNuQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLE9BQU87QUFDbEIsWUFBWSxPQUFPO0FBQ25CO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxXQUFXLE9BQU87QUFDbEIsV0FBVyxvQ0FBb0M7QUFDL0MsWUFBWSxvQ0FBb0M7QUFDaEQ7QUFDQTtBQUNBLG1CQUFtQixnQkFBZ0I7QUFDbkM7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLFdBQVcsb0NBQW9DO0FBQy9DLFlBQVksT0FBTztBQUNuQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsK0NBQStDO0FBQy9DO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHVCQUF1QixrQkFBa0I7QUFDekM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7O0FBR0E7QUFDQTtBQUNBLFdBQVcsb0NBQW9DO0FBQy9DLFdBQVcsb0NBQW9DO0FBQy9DLFlBQVksb0NBQW9DO0FBQ2hEO0FBQ0E7QUFDQSxtQkFBbUIsc0JBQXNCO0FBQ3pDO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsT0FBTztBQUNsQixXQUFXLDJDQUEyQztBQUN0RCxZQUFZLE1BQU07QUFDbEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsT0FBTztBQUNsQixZQUFZLE9BQU87QUFDbkI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxXQUFXLE9BQU87QUFDbEIsWUFBWSxNQUFNO0FBQ2xCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw4QkFBOEI7O0FBRTlCO0FBQ0E7QUFDQSxXQUFXLE9BQU87QUFDbEIsWUFBWSxPQUFPO0FBQ25CO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZUFBZSx3QkFBd0I7QUFDdkM7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsV0FBVyxPQUFPO0FBQ2xCLFlBQVksWUFBWTtBQUN4QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVyxPQUFPO0FBQ2xCLFdBQVcsUUFBUTtBQUNuQjtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQSxDQUFDLEVBQUUsb0RBQW9EO0FBQ3ZEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVyw4QkFBOEI7QUFDekMsV0FBVyxPQUFPO0FBQ2xCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxlQUFlLE9BQU87QUFDdEIsZ0JBQWdCLE1BQU07QUFDdEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG1CQUFtQix1QkFBdUI7QUFDMUM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxlQUFlLHFDQUFxQztBQUNwRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOOztBQUVBLENBQUMsRUFBRSwrSUFBK0k7QUFDbEo7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVyxPQUFPO0FBQ2xCLFdBQVcsT0FBTztBQUNsQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZ0JBQWdCLFFBQVE7QUFDeEI7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLGdCQUFnQixRQUFRO0FBQ3hCO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxlQUFlLFdBQVc7QUFDMUIsZUFBZSxPQUFPO0FBQ3RCLGVBQWUsT0FBTztBQUN0QixnQkFBZ0IsU0FBUztBQUN6QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxlQUFlLFdBQVc7QUFDMUIsZUFBZSxPQUFPO0FBQ3RCLGVBQWUsT0FBTztBQUN0QixlQUFlLGtCQUFrQjtBQUNqQyxlQUFlLE9BQU87QUFDdEIsZ0JBQWdCLFNBQVM7QUFDekI7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLGVBQWUsV0FBVztBQUMxQjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsbURBQW1EO0FBQ25EO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0EsbUNBQW1DO0FBQ25DO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7O0FBRUw7QUFDQTtBQUNBLGVBQWUsV0FBVztBQUMxQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxlQUFlLFdBQVc7QUFDMUI7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxlQUFlLFdBQVc7QUFDMUI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLOztBQUVMO0FBQ0E7QUFDQSxnQkFBZ0IsT0FBTztBQUN2QjtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7O0FBRUw7QUFDQTtBQUNBLGdCQUFnQixPQUFPO0FBQ3ZCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLENBQUMsRUFBRSxzRUFBc0U7QUFDekU7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7O0FBRUE7QUFDQSxDQUFDLEVBQUUsd0ZBQXdGO0FBQzNGOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTs7QUFFQTs7QUFFQTs7QUFFQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxtQ0FBbUMsVUFBVTtBQUM3QztBQUNBO0FBQ0EsOEJBQThCO0FBQzlCO0FBQ0EscUJBQXFCLDhCQUE4QjtBQUNuRDtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHLGVBQWU7O0FBRWxCOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUEsa0JBQWtCO0FBQ2xCLG1CQUFtQjtBQUNuQixzQkFBc0I7QUFDdEIsbUJBQW1COztBQUVuQjtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxzQkFBc0I7QUFDdEI7QUFDQSxxQkFBcUI7QUFDckI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLG1CQUFtQixjQUFjOztBQUVqQzs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsK0NBQStDOztBQUUvQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBLEdBQUc7O0FBRUg7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0EscUJBQXFCLG9CQUFvQjs7QUFFekM7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUMsRUFBRSx5R0FBeUc7QUFDNUc7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNB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QTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTzs7QUFFUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTzs7QUFFUDtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsc0RBQXNEO0FBQ3REO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxrRUFBa0U7QUFDbEU7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLEdBQUc7O0FBRUg7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxTQUFTO0FBQ1Q7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsNkJBQTZCO0FBQzdCO0FBQ0E7QUFDQTtBQUNBO0FB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QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EseUJBQXlCO0FBQ3pCO0FBQ0EseUJBQXlCLGlCQUFpQjtBQUMxQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx5QkFBeUI7QUFDekI7QUFDQSx5QkFBeUIsaUJBQWlCO0FBQzFDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHlCQUF5QjtBQUN6QjtBQUNBLHlCQUF5QixpQkFBaUI7QUFDMUM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsMkJBQTJCO0FBQzNCO0FBQ0EsMkJBQTJCLGlCQUFpQjtBQUM1QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsMEJBQTBCLGFBQWE7QUFDdkM7QUFDQTtBQUNBO0FBQ0E7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RjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG9DQUFvQztBQUNwQyxjQUFjLGdCQUFnQjtBQUM5QjtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQSxDQUFDOztBQUVEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0gsU0FBUztBQUNUO0FBQ0E7QUFDQSxHQUFHO0FBQ0gsYUFBYTtBQUNiO0FBQ0E7QUFDQSxHQUFHO0FBQ0gsV0FBVztBQUNYO0FBQ0E7QUFDQSxHQUFHO0FBQ0gsV0FBVztBQUNYO0FBQ0E7QUFDQSxHQUFHO0FBQ0gsWUFBWTtBQUNaO0FBQ0E7QUFDQSxHQUFHO0FBQ0gsV0FBVztBQUNYO0FBQ0E7QUFDQSxHQUFHO0FBQ0gsV0FBVztBQUNYO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsOEJBQThCLHVDQUF1QyxrQ0FBa0MsRUFBRSxFQUFFLEVBQUU7QUFDN0csNkJBQTZCLGlDQUFpQyxzQkFBc0IsRUFBRSxFQUFFLEVBQUU7QUFDMUY7QUFDQSxDQUFDOztBQUVELGNBQWMsdUJBQXVCOztBQUVyQzs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxzQkFBc0I7QUFDdEI7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLCtFQUErRTtBQUMvRSx1REFBdUQ7QUFDdkQ7QUFDQTtBQUNBO0FBQ0E7QUFDQSxFQUFFO0FBQ0Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7O0FBRUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxvQ0FBb0Msc0NBQXNDO0FBQzFFLENBQUM7O0FBRUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSixHQUFHO0FBQ0g7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKLEdBQUc7QUFDSDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxnQkFBZ0IsNEJBQTRCLDZCQUE2QjtBQUN6RTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQzs7QUFFRDtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxnQkFBZ0IsbUJBQW1CLHVCQUF1QixlQUFlO0FBQ3pFO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsRUFBRTtBQUNGO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxDQUFDOztBQUVEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxFQUFFO0FBQ0YsZ0JBQWdCLG9DQUFvQyw2QkFBNkI7QUFDakY7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHlCQUF5QiwwQkFBMEIsUUFBUTtBQUMzRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx5QkFBeUI7QUFDekI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZUFBZSxxQkFBcUI7QUFDcEM7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGVBQWUsaUJBQWlCO0FBQ2hDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQzs7QUFFRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxlQUFlLHVCQUF1QjtBQUN0QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQzs7QUFFRDtBQUNBO0FBQ0E7O0FBRUEsZUFBZSx1QkFBdUI7QUFDdEM7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7O0FBRUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsdUpBQXVKLDRCQUE0QjtBQUNuTCw0SkFBNEosNEJBQTRCO0FBQ3hMOztBQUVBLGVBQWUsd0JBQXdCO0FBQ3ZDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZ0JBQWdCLHdDQUF3Qyw2QkFBNkI7QUFDckY7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxvQkFBb0IsZUFBZSwyQ0FBMkMsU0FBUyxNQUFNLEVBQUU7QUFDL0YsaUZBQWlGLFlBQVksRUFBRTtBQUMvRjtBQUNBLG9DQUFvQyxnQkFBZ0I7QUFDcEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLFlBQVk7QUFDWjs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxxREFBcUQ7QUFDckQseUNBQXlDO0FBQ3pDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxFQUFFOztBQUVGOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsQ0FBQzs7QUFFRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxrREFBa0Q7QUFDbEQsZ0RBQWdEO0FBQ2hEO0FBQ0E7QUFDQSxFQUFFOztBQUVGO0FBQ0EseUpBQXlKLDJCQUEyQjtBQUNwTCxpRkFBaUYsb0RBQW9ELEVBQUUsYUFBYSxzQ0FBc0M7QUFDMUwsZ0JBQWdCLGlDQUFpQyw2QkFBNkI7QUFDOUU7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsV0FBVztBQUNYO0FBQ0EscUJBQXFCLGVBQWU7QUFDcEM7QUFDQTtBQUNBO0FBQ0E7QUFDQSxnREFBZ0Q7QUFDaEQsbUNBQW1DO0FBQ25DO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUksaUNBQWlDO0FBQ3JDLElBQUk7QUFDSjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxDQUFDOztBQUVEO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esd0NBQXdDO0FBQ3hDO0FBQ0EsY0FBYyxxQ0FBcUM7QUFDbkQ7QUFDQTtBQUNBLEdBQUc7QUFDSCxFQUFFO0FBQ0YsZ0JBQWdCLCtCQUErQiw2QkFBNkI7QUFDNUU7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsZ0JBQWdCLHVCQUF1QjtBQUN2QyxZQUFZLHNCQUFzQjtBQUNsQztBQUNBLEVBQUU7QUFDRjtBQUNBO0FBQ0E7QUFDQSxvRUFBb0U7QUFDcEU7QUFDQTtBQUNBLHNDQUFzQyxtQkFBbUI7QUFDekQ7QUFDQTtBQUNBLEVBQUU7QUFDRixxREFBcUQsZ0JBQWdCO0FBQ3JFO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZ0JBQWdCLHVCQUF1QjtBQUN2QyxZQUFZLHNCQUFzQjtBQUNsQyxZQUFZLHNCQUFzQjs7QUFFbEM7QUFDQTtBQUNBLDRCQUE0QixhQUFhLGVBQWU7QUFDeEQsc0NBQXNDLGVBQWUsbUJBQW1CO0FBQ3hFO0FBQ0Esd0NBQXdDLFVBQVU7QUFDbEQsRUFBRTtBQUNGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw0QkFBNEIsYUFBYSxlQUFlO0FBQ3hELHNDQUFzQyxlQUFlLG1CQUFtQjtBQUN4RSw4QkFBOEIsbUJBQW1CLHFCQUFxQjtBQUN0RTtBQUNBLHdDQUF3QyxVQUFVO0FBQ2xELEVBQUU7QUFDRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBLFlBQVksd0JBQXdCLFFBQVE7QUFDNUMsb0JBQW9CLHFCQUFxQixxQkFBcUI7QUFDOUQ7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsdUNBQXVDLDBEQUEwRDtBQUNqRywyQ0FBMkMsdUVBQXVFLHVDQUF1Qzs7QUFFeko7QUFDQTtBQUNBO0FBQ0E7QUFDQSxlQUFlLGFBQWE7QUFDNUI7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxlQUFlLG9CQUFvQjtBQUNuQztBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsZUFBZTtBQUNmLGVBQWUsVUFBVTtBQUN6QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EscURBQXFELDJCQUEyQjtBQUNoRixxREFBcUQ7QUFDckQ7QUFDQSxpREFBaUQ7QUFDakQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxnREFBZ0Q7QUFDaEQsc0NBQXNDLDhCQUE4QjtBQUNwRSwrREFBK0Q7QUFDL0Qsd0RBQXdEO0FBQ3hEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxtQ0FBbUM7QUFDbkMsV0FBVyxlQUFlO0FBQzFCO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsMkJBQTJCLG9CQUFvQixFQUFFO0FBQ2pEO0FBQ0EsV0FBVyxlQUFlO0FBQzFCO0FBQ0E7QUFDQTtBQUNBLHVEQUF1RCxXQUFXLGNBQWMsRUFBRTtBQUNsRix3REFBd0Qsb0JBQW9CLGNBQWMsRUFBRTtBQUM1RixxRUFBcUUsb0JBQW9CLGNBQWMsRUFBRTtBQUN6RztBQUNBLGdEQUFnRCxZQUFZLHNCQUFzQjtBQUNsRjtBQUNBO0FBQ0E7QUFDQTtBQUNBLCtEQUErRCxTQUFTO0FBQ3hFO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx1REFBdUQ7QUFDdkQ7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0osd0JBQXdCLGdCQUFnQix3QkFBd0IsVUFBVTtBQUMxRTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7QUFDQTtBQUNBLHdDQUF3Qyx3QkFBd0I7QUFDaEUseUNBQXlDLG1FQUFtRTtBQUM1RywwQ0FBMEMsbUVBQW1FO0FBQzdHLHNDQUFzQywrQkFBK0I7QUFDckUsdUNBQXVDLDBCQUEwQjtBQUNqRSxzQ0FBc0MsK0JBQStCO0FBQ3JFLHdDQUF3QywwQkFBMEI7QUFDbEUsNENBQTRDLHVDQUF1QztBQUNuRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw0QkFBNEI7QUFDNUI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHFEQUFxRDtBQUNyRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxlQUFlO0FBQ2Y7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLFlBQVksb0JBQW9CO0FBQ2hDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxXQUFXLG9CQUFvQjtBQUMvQjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0EsZ0JBQWdCLFVBQVUsbUJBQW1CO0FBQzdDO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBLFdBQVcsaUJBQWlCLE9BQU8sMkJBQTJCLHFCQUFxQjtBQUNuRjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxxQkFBcUI7QUFDckI7O0FBRUE7QUFDQTs7QUFFQSxtQ0FBbUM7QUFDbkM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDhCQUE4Qjs7QUFFOUI7QUFDQSx5QkFBeUIsOEJBQThCLDhCQUE4QjtBQUNyRjs7QUFFQSxjQUFjLHFDQUFxQztBQUNuRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTSx1Q0FBdUMsRUFBRSxXQUFXO0FBQzFEO0FBQ0EsK0JBQStCO0FBQy9CO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDRCQUE0QjtBQUM1QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLG1DQUFtQyx5QkFBeUIsYUFBYTtBQUN6RSw0QkFBNEIscUJBQXFCLGFBQWEsS0FBSywwQkFBMEIsVUFBVTs7QUFFdkc7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLGtDQUFrQyx3Q0FBd0M7QUFDMUUsMEJBQTBCLHFCQUFxQix3QkFBd0IsVUFBVTs7QUFFakYsNEJBQTRCLGdDQUFnQztBQUM1RCw0QkFBNEIscUJBQXFCLHFCQUFxQixVQUFVO0FBQ2hGLHFDQUFxQzs7QUFFckM7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCLHdCQUF3QjtBQUN6QyxFQUFFO0FBQ0Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsK0JBQStCO0FBQy9CO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGdDQUFnQztBQUNoQywrQkFBK0I7QUFDL0I7QUFDQSxlQUFlLDhCQUE4QixXQUFXO0FBQ3hEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxvQkFBb0IsNENBQTRDO0FBQ2hFLE9BQU8sNENBQTRDO0FBQ25EO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsZ0JBQWdCLFVBQVUsV0FBVztBQUNyQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxnQkFBZ0IsVUFBVSxXQUFXO0FBQ3JDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLGlDQUFpQztBQUNqQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYSxjQUFjO0FBQzNCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDJCQUEyQixrQkFBa0IsT0FBTyxpQkFBaUIsT0FBTztBQUM1RSxzQkFBc0I7QUFDdEIsMkNBQTJDLFdBQVcsaUJBQWlCO0FBQ3ZFO0FBQ0E7QUFDQTtBQUNBLFlBQVksbUJBQW1CO0FBQy9CO0FBQ0EsRUFBRTtBQUNGO0FBQ0EsWUFBWSxpQkFBaUI7QUFDN0I7QUFDQSxZQUFZLG1CQUFtQjtBQUMvQjtBQUNBLEVBQUU7QUFDRjtBQUNBLFlBQVksaUJBQWlCO0FBQzdCO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsWUFBWSxtQkFBbUI7QUFDL0I7QUFDQTtBQUNBO0FBQ0EsWUFBWSxPQUFPO0FBQ25CO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLCtCQUErQixvR0FBb0csa0JBQWtCOztBQUVySjtBQUNBLHNDQUFzQyxzQ0FBc0MsVUFBVSxVQUFVOzs7QUFHaEc7QUFDQTtBQUNBLDZCQUE2QjtBQUM3QjtBQUNBO0FBQ0EsVUFBVSx1QkFBdUI7QUFDakM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxnQ0FBZ0M7QUFDaEM7QUFDQSxTQUFTO0FBQ1Q7Ozs7QUFJQSx1REFBdUQsdUVBQXVFOztBQUU5SDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTLEdBQUcsc0JBQXNCLEtBQUs7QUFDdkM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVMsR0FBRyxzQkFBc0IsS0FBSztBQUN2Qzs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGNBQWM7QUFDZDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLDZCQUE2QixhQUFhLDhCQUE4QjtBQUN4RTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRyxXQUFXLGNBQWMsWUFBWTtBQUN4QztBQUNBLGdDQUFnQztBQUNoQztBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQSxVQUFVO0FBQ1YsZ0NBQWdDO0FBQ2hDLGtCQUFrQiwyQkFBMkIsYUFBYTtBQUMxRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDJCQUEyQixPQUFPO0FBQ2xDLDJCQUEyQixPQUFPO0FBQ2xDLDJCQUEyQixPQUFPO0FBQ2xDLDJCQUEyQixPQUFPO0FBQ2xDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQSxtQ0FBbUM7QUFDbkM7QUFDQTs7O0FBR0E7QUFDQTtBQUNBLGVBQWUsa0JBQWtCLFdBQVc7QUFDNUM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDJCQUEyQjtBQUMzQiw0QkFBNEI7QUFDNUIsNEJBQTRCO0FBQzVCLDJCQUEyQjtBQUMzQjtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxlQUFlLDJCQUEyQjtBQUMxQztBQUNBO0FBQ0Esa0JBQWtCO0FBQ2xCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZUFBZSxnQkFBZ0I7QUFDL0I7QUFDQSx5REFBeUQsbUJBQW1CLEVBQUU7QUFDOUU7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBLFlBQVk7QUFDWjtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYixnQ0FBZ0M7QUFDaEMsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7OztBQU1BO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHdCQUF3QjtBQUN4QjtBQUNBLFdBQVc7QUFDWDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDhCQUE4QjtBQUM5Qix3QkFBd0I7QUFDeEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVMsSUFBSSxTQUFTLE1BQU07QUFDNUI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsNkNBQTZDO0FBQzdDLDhDQUE4Qzs7QUFFOUM7QUFDQTtBQUNBO0FBQ0EsNkJBQTZCLGlDQUFpQztBQUM5RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxFQUFFO0FBQ0Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7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QUNBO0FBQ0Esc0JBQXNCOztBQUV0QjtBQUNBO0FBQ0EsMEJBQTBCOztBQUUxQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxFQUFFO0FBQ0Y7O0FBRUE7QUFDQSw2QkFBNkI7O0FBRTdCO0FBQ0EsNEJBQTRCOztBQUU1QjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsRUFBRTtBQUNGOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFD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O0FBQ0EsT0FBTyw2QkFBNkI7QUFDcEMsT0FBTyw2QkFBNkI7QUFDcEMsT0FBTywyQkFBMkI7QUFDbEMsT0FBTywyQkFBMkI7QUFDbEMsT0FBTywyQkFBMkI7QUFDbEMsT0FBTywyQkFBMkI7QUFDbEMsT0FBTyw2QkFBNkI7QUFDcEMsT0FBTyw4QkFBOEI7QUFDckMsT0FBTywwQkFBMEI7QUFDakMsT0FBTywwQkFBMEI7QUFDakMsT0FBTywwQkFBMEI7QUFDakMsT0FBTywwQkFBMEI7QUFDakMsT0FBTywwQkFBMEI7QUFDakMsT0FBTywwQkFBMEI7QUFDakMsT0FBTyw2QkFBNkI7QUFDcEMsT0FBTyw2QkFBNkI7QUFDcEMsT0FBTyw2QkFBNkI7QUFDcEMsT0FBTyw2QkFBNkI7QUFDcEMsT0FBTyw4QkFBOEI7QUFDckMsT0FBTywrQkFBK0I7QUFDdEMsT0FBTyw2QkFBNkI7QUFDcEMsT0FBTywrQkFBK0I7QUFDdEMsT0FBTyw2QkFBNkI7QUFDcEMsT0FBTyxpQ0FBaUM7QUFDeEMsT0FBTyx1Q0FBdUM7QUFDOUMsT0FBTyw2QkFBNkI7QUFDcEMsT0FBTywrQkFBK0I7QUFDdEMsT0FBTyw2QkFBNkI7QUFDcEMsT0FBTyw2QkFBNkI7QUFDcEMsT0FBTyxpQ0FBaUM7QUFDeEMsT0FBTywrQkFBK0I7QUFDdEMsT0FBTyxxQ0FBcUM7QUFDNUMsT0FBTywrQkFBK0I7QUFDdEMsT0FBTyw2QkFBNkI7QUFDcEMsT0FBTywrQkFBK0I7QUFDdEMsT0FBTyxxQ0FBcUM7QUFDNUMsT0FBTyxtQ0FBbUM7QUFDMUMsT0FBTyx1Q0FBdUM7QUFDOUMsT0FBTyxxQ0FBcUM7QUFDNUMsT0FBTyxtQ0FBbUM7QUFDMUMsT0FBTyxxQ0FBcUM7QUFDNUMsT0FBTywrQkFBK0I7QUFDdEMsT0FBTyxpQ0FBaUM7QUFDeEMsT0FBTyx1Q0FBdUM7QUFDOUMsT0FBTyx5Q0FBeUM7QUFDaEQsT0FBTyxpQ0FBaUM7QUFDeEMsT0FBTyxpQ0FBaUM7QUFDeEMsT0FBTyxtQ0FBbUM7QUFDMUMsT0FBTyx1Q0FBdUM7QUFDOUMsT0FBTyx5Q0FBeUM7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O0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLGVBQWUsb0JBQW9COztBQUVuQztBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FB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QUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsOEVBQThFO0FBQzlFO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsOEVBQThFO0FBQzlFO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsOEVBQThFO0FBQzlFO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsOEVBQThFO0FBQzlFO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFD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Q0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLOztBQUVMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7O0FBRUw7QUFDQTtBQUNBO0FBQ0EsbUNBQW1DO0FBQ25DO0FBQ0EsOENBQThDO0FBQzlDLGtEQUFrRDtBQUNsRDtBQUNBO0FBQ0E7QUFDQTtBQUNBLHVFQUF1RTtBQUN2RTtBQUNBO0FBQ0E7QUFDQSx1RUFBdUU7QUFDdkU7QUFDQTtBQUNBO0FBQ0E7QUFDQSx1RUFBdUU7QUFDdkU7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7O0FBRUw7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSzs7QUFFTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7O0FBRUw7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLOztBQUVMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSzs7QUFFTDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxLQUFLOztBQUVMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7O0FBRUw7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsS0FBSzs7QUFFTDtBQUNBOztBQUVBLDBCQUEwQjtBQUMxQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FB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QUFFeEI7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLEtBQUs7O0FBRUw7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxLQUFLOztBQUVMLHVCQUF1QjtBQUN2Qjs7QUFFQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwwQkFBMEI7QUFDMUI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLDRCQUE0QjtBQUM1QjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQSwwQkFBMEI7QUFDMUI7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBLG1EQUFtRCw4QkFBOEIsRUFBRSxrQkFBa0IsMEJBQTBCO0FBQy9IO0FBQ0Es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QUFTLHVCQUF1QjtBQUNoQyxTQUFTLHFCQUFxQjtBQUM5QixTQUFTLHNCQUFzQjtBQUMvQixTQUFTLG9CQUFvQjtBQUM3QixTQUFTLHNCQUFzQjtBQUMvQixTQUFTLG9CQUFvQjtBQUM3QixTQUFTLHFCQUFxQjtBQUM5QixTQUFTLG1CQUFtQjtBQUM1QixTQUFTLG1CQUFtQjtBQUM1QixTQUFTLGlCQUFpQjtBQUMxQixTQUFTLGtCQUFrQjtBQUMzQixTQUFTLGdCQUFnQjtBQUN6QixTQUFTLHNCQUFzQjtBQUMvQixTQUFTLHlCQUF5QjtBQUNsQyxTQUFTLHVCQUF1QjtBQUNoQyxTQUFTLHFCQUFxQjtBQUM5QixTQUFTLGlCQUFpQjtBQUMxQixTQUFTLG1CQUFtQjtBQUM1QixTQUFTLG9CQUFvQjtBQUM3QixTQUFTLGtCQUFrQjtBQUMzQixTQUFTLG1CQUFtQjtBQUM1QixTQUFTLGlCQUFpQjtBQUMxQixTQUFTLG9CQUFvQjtBQUM3QixTQUFTLGtCQUFrQjtBQUMzQixTQUFTLG1CQUFtQjtBQUM1QixTQUFTLGlCQUFpQjtBQUMxQixTQUFTLG9CQUFvQjtBQUM3QixTQUFTLGtCQUFrQjtBQUMzQixTQUFTLG1CQUFtQjtBQUM1QixTQUFTLGlCQUFpQjtBQUMxQixTQUFTLG9CQUFvQjtBQUM3QixTQUFTLGtCQUFrQjtBQUMzQixTQUFTLG1CQUFtQjtBQUM1QixTQUFTLGlCQUFpQjtBQUMxQixTQUFTLHNCQUFzQjtBQUMvQixTQUFTLG9CQUFvQjtBQUM3QixTQUFTLHVCQUF1QjtBQUNoQyxTQUFTLHFCQUFxQjtBQUM5QixTQUFTLHVCQUF1QjtBQUNoQyxTQUFTLHFCQUFxQjtBQUM5QixTQUFTLHdCQUF3QjtBQUNqQyxTQUFTLHNCQUFzQjtBQUMvQixTQUFTLHVCQUF1QjtBQUNoQyxTQUFTLHFCQUFxQjtBQUM5QixTQUFTLHVCQUF1QjtBQUNoQyxTQUFTLHFCQUFxQjtBQUM5QixTQUFTLHdCQUF3QjtBQUNqQyxTQUFTLHNCQUFzQjtBQUMvQixTQUFTLHVCQUF1QjtBQUNoQyxTQUFTLHlCQUF5QjtBQUNsQyxTQUFTLG1CQUFtQjtBQUM1QixTQUFTLG9CQUFvQjtBQUM3QixTQUFTLGtCQUFrQjtBQUMzQixTQUFTLG1CQUFtQjtBQUM1QixTQUFTLGlCQUFpQjtBQUMxQixTQUFTLHVCQUF1QjtBQUNoQyxTQUFTLHFCQUFxQjtBQUM5QixTQUFTLHdCQUF3QjtBQUNqQyxTQUFTLHNCQUFzQjtBQUMvQixTQUFTLHNCQUFzQjtBQUMvQixTQUFTLG9CQUFvQjtBQUM3QixTQUFTLHFCQUFxQjtBQUM5QixTQUFTLG1CQUFtQjtBQUM1QixTQUFTLHdCQUF3QjtBQUNqQyxTQUFTLHNCQUFzQjtBQUMvQixTQUFTLHVCQUF1QjtBQUNoQyxTQUFTLHFCQUFxQjtBQUM5QixTQUFTLHVCQUF1QjtBQUNoQyxTQUFTLHFCQUFxQjtBQUM5QixTQUFTLHdCQUF3QjtBQUNqQyxTQUFTLGlCQUFpQjtBQUMxQixTQUFTLHNCQUFzQjtBQUMvQixTQUFTLG9CQUFvQjtBQUM3QixTQUFTLGtCQUFrQjtBQUMzQixTQUFTLG9CQUFvQjtBQUM3QixTQUFTLGtCQUFrQjtBQUMzQixTQUFTLDBCQUEwQjtBQUNuQyxTQUFTLHdCQUF3QjtBQUNqQyxTQUFTLG1CQUFtQjtBQUM1QixTQUFTLGlCQUFpQjtBQUMxQixTQUFTLHVCQUF1QjtBQUNoQyxTQUFTLHFCQUFxQjtBQUM5QixTQUFTLHNCQUFzQjtBQUMvQixTQUFTLG9CQUFvQjtBQUM3QixTQUFTLHlCQUF5QjtBQUNsQyxTQUFTLHVCQUF1QjtBQUNoQyxTQUFTLG9CQUFvQjtBQUM3QixTQUFTLG9CQUFvQjtBQUM3QixTQUFTLHdCQUF3QjtBQUNqQyxTQUFTLHNCQUFzQjtBQUMvQixTQUFTLGtDQUFrQztBQUMzQyxTQUFTLGlCQUFpQjtBQUMxQixTQUFTLGlCQUFpQjtBQUMxQixTQUFTLGlCQUFpQjtBQUMxQixTQUFTLHNCQUFzQjtBQUMvQixTQUFTLHlCQUF5QjtBQUNsQyxTQUFTLDBDQUEwQztBQUNuRCxTQUFTLDBCQUEwQjtBQUNuQyxTQUFTLHdCQUF3QjtBQUNqQyxTQUFTLHNCQUFzQjtBQUMvQixT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O0FBQzdCLFNBQVMsb0JBQW9CO0FBQzdCLFNBQVMsbUJBQW1CO0FBQzVCLFNBQVMsb0JBQW9CO0FBQzdCLFNBQVMscUJBQXFCO0FBQzlCLFNBQVMscUJBQXFCO0FBQzlCLFNBQVMscUJBQXFCO0FBQzlCLFNBQVMsb0JBQW9CO0FBQzdCLFNBQVMsb0JBQW9CO0FBQzdCLFNBQVMsOEJBQThCO0FBQ3ZDLFNBQVMsMkJBQTJCO0FBQ3BDLFNBQVMseUJBQXlCO0FBQ2xDLFNBQVMsNEJBQTRCO0FBQ3JDLFNBQVMsMEJBQTBCO0FBQ25DLFNBQVMsd0JBQXdCO0FBQ2pDLFNBQVMsc0JBQXNCO0FBQy9CLFNBQVMsc0JBQXNCO0FBQy9CLFNBQVMsNEJBQTRCO0FBQ3JDLFNBQVMsMEJBQTBCO0FBQ25DLFNBQVMsd0JBQXdCO0FBQ2pDLFNBQVMsc0JBQXNCO0FBQy9CLFNBQVMsdUJBQXVCO0FBQ2hDLFNBQVMscUJBQXFCO0FBQzlCLFNBQVMsb0JBQW9CO0FBQzdCLFNBQVMsa0JBQWtCO0FBQzNCLFNBQVMsMEJBQTBCO0FBQ25DLFNBQVMsd0JBQXdCO0FBQ2pDLFNBQVMsbUJBQW1CO0FBQzVCLFNBQVMscUJBQXFCO0FBQzlCLFNBQVMsbUJBQW1CO0FBQzVCLFNBQVMscUJBQXFCO0FBQzlCLFNBQVMsb0JBQW9CO0FBQzdCLFNBQVMsa0JBQWtCO0FBQzNCLFNBQVMsc0JBQXNCO0FBQy9CLFNBQVMsb0JBQW9CO0FBQzdCLFNBQVMsbUJBQW1CO0FBQzVCLFNBQVMsaUJBQWlCO0FBQzFCLFNBQVMsc0JBQXNCO0FBQy9CLFNBQVMsb0JBQW9CO0FBQzdCLFNBQVMscUJBQXFCO0FBQzlCLFNBQVMsbUJBQW1CO0FBQzVCLFNBQVMsaUJBQWlCO0FBQzFCLFNBQVMsMkJBQTJCO0FBQ3BDLFNBQVMseUJBQXlCO0FBQ2xDLFNBQVMsdUJBQXVCO0FBQ2hDLFNBQVMscUJBQXFCO0FBQzlCLFNBQVMsNkJBQTZCO0FBQ3RDLFNBQVMsMkJBQTJCO0FBQ3BDLFNBQVMsaURBQWlEO0FBQzFELFNBQVMsMEJBQTBCO0FBQ25DLFNBQVMsd0JBQXdCO0FBQ2pDLFNBQVMsOENBQThDO0FBQ3ZELFNBQVMsb0JBQW9CO0FBQzdCLFNBQVMsNkNBQTZDO0FBQ3RELFNBQVMseUJBQXlCO0FBQ2xDLFNBQVMsbUJBQW1CO0FBQzVCLFNBQVMsdUJBQXVCO0FBQ2hDLFNBQVMsc0JBQXNCO0FBQy9CLFNBQVMsb0JBQW9CO0FBQzdCLFNBQVMsOEJBQThCO0FBQ3ZDLFNBQVMsaUJBQWlCO0FBQzFCLFNBQVMsNEJBQTRCO0FBQ3JDLFNBQVMsb0NBQW9DO0FBQzdDLFNBQVMsNEJBQTRCO0FBQ3JDLFNBQVMsc0JBQXNCO0FBQy9CLFNBQVMsMEJBQTBCO0FBQ25DLFNBQVMsbUNBQW1DO0FBQzVDLFNBQVMscUJBQXFCO0FBQzlCLFNBQVMsMEJBQTBCO0FBQ25DLFNBQVMsd0JBQXdCO0FBQ2pDLFNBQVMseUJBQXlCO0FBQ2xDLFNBQVMsdUJBQXVCO0FBQ2hDLFNBQVMsNkJBQTZCO0FBQ3RDLFNBQVMsMkJBQTJCO0FBQ3BDLFNBQVMsc0JBQXNCO0FBQy9CLFNBQVMsd0JBQXdCO0FBQ2pDLFNBQVMsa0JBQWtCO0FBQzNCLFNBQVMsc0JBQXNCO0FBQy9CLFNBQVMsdUJBQXVCO0FBQ2hDLFNBQVMsc0JBQXNCO0FBQy9CLFNBQVMsaUJBQWlCO0FBQzFCLFNBQVMsb0JBQW9CO0FBQzdCLFNBQVMsa0JBQWtCO0FBQzNCLFNBQVMscUJBQXFCO0FBQzlCLFNBQVMsc0JBQXNCO0FBQy9CLFNBQVMsd0JBQXdCO0FBQ2pDLFNBQVMsc0JBQXNCO0FBQy9CLFNBQVMscUJBQXFCO0FBQzlCLFNBQVMsbUJBQW1CO0FBQzVCLFNBQVMsb0JBQW9CO0FBQzdCLFNBQVMsd0JBQXdCO0FBQ2pDLFNBQVMsMkJBQTJCO0FBQ3BDLFNBQVMsNEJBQTRCO0FBQ3JDLFNBQVMseUJBQXlCO0FBQ2xDLFNBQVMsNEJBQTRCO0FBQ3JDLFNBQVMsa0JBQWtCO0FBQzNCLFNBQVMsbUJBQW1CO0FBQzVCLFNBQVMsb0JBQW9CO0FBQzdCLFNBQVMseUJBQXlCO0FBQ2xDLFNBQVMsdUJBQXVCO0FBQ2hDLFNBQVMsK0JBQStCO0FBQ3hDLFNBQVMsNkJBQTZCO0FBQ3RDLFNBQVMsOEJBQThCO0FBQ3ZDLFNBQVMsNkJBQTZCO0FBQ3RDLFNBQVMsMkJBQTJCO0FBQ3BDLFNBQVMsNEJBQTRCO0FBQ3JDLFNBQVMsMEJBQTBCO0FBQ25DLFNBQVMsMkJBQTJCO0FBQ3BDLFNBQVMsaUJBQWlCO0FBQzFCLFNBQVMsZ0JBQWdCO0FBQ3pCLFNBQVMsMkJBQTJCO0FBQ3BDLFNBQVMseUJBQXlCO0FBQ2xDLFNBQVMsZ0JBQWdCO0FBQ3pCLFNBQVMsNkJBQTZCO0FBQ3RDLFNBQVMsMkJBQTJCO0FBQ3BDLFNBQVMsbUJBQW1CO0FBQzVCLFNBQVMsZ0JBQWdCO0FBQ3pCLFNBQVMsdUJBQXVCO0FBQ2hDLFNBQVMsc0NBQXNDO0FBQy9DLFNBQVMsb0NBQW9DO0FBQzdDLFNBQVMsdUJBQXVCO0FBQ2hDLFNBQVMscUJBQXFCO0FBQzlCLFNBQVMsZ0JBQWdCO0FBQ3pCLFNBQVMsd0JBQXdCO0FBQ2pDLFNBQVMsd0JBQXdCO0FBQ2pDLFNBQVMsb0NBQW9DO0FBQzdDLFNBQVMsc0JBQXNCO0FBQy9CLFNBQVMsaUJBQWlCO0FBQzFCLFNBQVMseUJBQXlCO0FBQ2xDLFNBQVMsdUJBQXVCO0FBQ2hDLFNBQVMsOEJBQThCO0FBQ3ZDLFNBQVMsNEJBQTRCO0FBQ3JDLFNBQVMsZ0JBQWdCO0FBQ3pCLFNBQVMsdUJBQXVCO0FBQ2hDLFNBQVMscUJBQXFCO0FBQzlCLFNBQVMsdUJBQXVCO0FBQ2hDLFNBQVMscUJBQXFCO0FBQzlCLFNBQVMsb0JBQW9CO0FBQzdCLFNBQVMsa0JBQWtCO0FBQzNCLFNBQVMsd0JBQXdCO0FBQ2pDLFNBQVMsc0JBQXNCO0FBQy9CLFNBQVMsNkJBQTZCO0FBQ3RDLFNBQVMsMkJBQTJCO0FBQ3BDLFNBQVMsNEJBQTRCO0FBQ3JDLFNBQVMsMEJBQTBCO0FBQ25DLFNBQVMsMEJBQTBCO0FBQ25DLFNBQVMsd0JBQXdCO0FBQ2pDLFNBQVMsNkJBQTZCO0FBQ3RDLFNBQVMsMkJBQTJCO0FBQ3BDLFNBQVMsd0JBQXdCO0FBQ2pDLFNBQVMsc0JBQXNCO0FBQy9CLFNBQVMsdUJBQXVCO0FBQ2hDLFNBQVMscUJBQXFCO0FBQzlCLFNBQVMscUJBQXFCO0FBQzlCLFNBQVMsbUJBQW1CO0FBQzVCLFNBQVMsZ0NBQWdDO0FBQ3pDLFNBQVMsa0NBQWtDO0FBQzNDLFNBQVMsZ0NBQWdDO0FBQ3pDLFNBQVMsb0NBQW9DO0FBQzdDLFNBQVMsa0NBQWtDO0FBQzNDLFNBQVMsbUNBQW1DO0FBQzVDLFNBQVMsaUNBQWlDO0FBQzFDLFNBQVMsa0NBQWtDO0FBQzNDLFNBQVMsZ0NBQWdDO0FBQ3pDLFNBQVMsaUNBQWlDO0FBQzFDLFNBQVMsK0JBQStCO0FBQ3hDLFNBQVMsNkJBQTZCO0FBQ3RDLFNBQVMsb0NBQW9DO0FBQzdDLFNBQVMsOEJBQThCO0FBQ3ZDLFNBQVMsa0NBQWtDO0FBQzNDLFNBQVMsZ0NBQWdDO0FBQ3pDLFNBQVMsOEJBQThCO0FBQ3ZDLFNBQVMsK0JBQStCO0FBQ3hDLFNBQVMsMkJBQTJCO0FBQ3BDLFNBQVMsOEJBQThCO0FBQ3ZDLFNBQVMsd0JBQXdCO0FBQ2pDLFNBQVMsZ0JBQWdCO0FBQ3pCLFNBQVMsZ0JBQWdCO0FBQ3pCLFNBQVMsd0NBQXdDO0FBQ2pELFNBQVMsc0NBQXNDO0FBQy9DLFNBQVMsc0JBQXNCO0FBQy9CLFNBQVMsb0JBQW9CO0FBQzdCLFNBQVMsa0JBQWtCO0FBQzNCLFNBQVMscUJBQXFCO0FBQzlCLFNBQVMsbUJBQW1CO0FBQzVCLFNBQVMsc0JBQXNCO0FBQy9CLFNBQVMsb0JBQW9CO0FBQzdCLFNBQVMsdUJBQXVCO0FBQ2hDLFNBQVMscUJBQXFCO0FBQzlCLFNBQVMsd0JBQXdCO0FBQ2pDLFNBQVMsc0JBQXNCO0FBQy9CLFNBQVMsc0JBQXNCO0FBQy9CLFNBQVMsMEJBQTBCO0FBQ25DLFNBQVMsd0JBQXdCO0FBQ2pDLFNBQVMsNEJBQTRCO0FBQ3JDLFNBQVMsOEJBQThCO0FBQ3ZDLFNBQVMsNEJBQTRCO0FBQ3JDLFNBQVMsdUNBQXVDO0FBQ2hELFNBQVMscUNBQXFDO0FBQzlDLFNBQVMscUNBQXFDO0FBQzlDLFNBQVMsbUNBQW1D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bW9kdWxlc194bHN4X3hsc3hfanMuZjE3NDc5NjQuanMiLCJzb3VyY2VzQ29udGVudCI6WyIvKiEgY3BleGNlbC5qcyAoQykgMjAxMy1wcmVzZW50IFNoZWV0SlMgLS0gaHR0cDovL3NoZWV0anMuY29tICovXG4vKmpzaGludCAtVzEwMCAqL1xudmFyIGNwdGFibGUgPSB7dmVyc2lvbjpcIjEuMTUuMFwifTtcbmNwdGFibGVbNDM3XSA9IChmdW5jdGlvbigpeyB2YXIgZCA9IFwiXFx1MDAwMFxcdTAwMDFcXHUwMDAyXFx1MDAwM1xcdTAwMDRcXHUwMDA1XFx1MDAwNlxcdTAwMDdcXGJcXHRcXG5cXHUwMDBiXFxmXFxyXFx1MDAwZVxcdTAwMGZcXHUwMDEwXFx1MDAxMVxcdTAwMTJcXHUwMDEzXFx1MDAxNFxcdTAwMTVcXHUwMDE2XFx1MDAxN1xcdTAwMThcXHUwMDE5XFx1MDAxYVxcdTAwMWJcXHUwMDFjXFx1MDAxZFxcdTAwMWVcXHUwMDFmICFcXFwiIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6Ozw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXFxcXF1eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX5/w4fDvMOpw6LDpMOgw6XDp8Oqw6vDqMOvw67DrMOEw4XDicOmw4bDtMO2w7LDu8O5w7/DlsOcwqLCo8Kl4oKnxpLDocOtw7PDusOxw5HCqsK6wr/ijJDCrMK9wrzCocKrwrvilpHilpLilpPilILilKTilaHilaLilZbilZXilaPilZHilZfilZ3ilZzilZvilJDilJTilLTilKzilJzilIDilLzilZ7ilZ/ilZrilZTilanilabilaDilZDilazilafilajilaTilaXilZnilZjilZLilZPilavilarilJjilIzilojiloTilozilpDiloDOscOfzpPPgM6jz4PCtc+EzqbOmM6pzrTiiJ7Phs614oip4omhwrHiiaXiiaTijKDijKHDt+KJiMKw4oiZwrfiiJrigb/CsuKWoMKgXCIsIEQgPSBbXSwgZSA9IHt9OyBmb3IodmFyIGk9MDtpIT1kLmxlbmd0aDsrK2kpIHsgaWYoZC5jaGFyQ29kZUF0KGkpICE9PSAweEZGRkQpIGVbZC5jaGFyQXQoaSldID0gaTsgRFtpXSA9IGQuY2hhckF0KGkpOyB9IHJldHVybiB7XCJlbmNcIjogZSwgXCJkZWNcIjogRCB9OyB9KSgpO1xuY3B0YWJsZVs2MjBdID0gKGZ1bmN0aW9uKCl7IHZhciBkID0gXCJcXHUwMDAwXFx1MDAwMVxcdTAwMDJcXHUwMDAzXFx1MDAwNFxcdTAwMDVcXHUwMDA2XFx1MDAwN1xcYlxcdFxcblxcdTAwMGJcXGZcXHJcXHUwMDBlXFx1MDAwZlxcdTAwMTBcXHUwMDExXFx1MDAxMlxcdTAwMTNcXHUwMDE0XFx1MDAxNVxcdTAwMTZcXHUwMDE3XFx1MDAxOFxcdTAwMTlcXHUwMDFhXFx1MDAxYlxcdTAwMWNcXHUwMDFkXFx1MDAxZVxcdTAwMWYgIVxcXCIjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltcXFxcXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fn/Dh8O8w6nDosOkw6DEhcOnw6rDq8Oow6/DrsSHw4TEhMSYxJnFgsO0w7bEhsO7w7nFmsOWw5zCosWBwqXFm8aSxbnFu8Ozw5PFhMWDxbrFvMK/4oyQwqzCvcK8wqHCq8K74paR4paS4paT4pSC4pSk4pWh4pWi4pWW4pWV4pWj4pWR4pWX4pWd4pWc4pWb4pSQ4pSU4pS04pSs4pSc4pSA4pS84pWe4pWf4pWa4pWU4pWp4pWm4pWg4pWQ4pWs4pWn4pWo4pWk4pWl4pWZ4pWY4pWS4pWT4pWr4pWq4pSY4pSM4paI4paE4paM4paQ4paAzrHDn86Tz4DOo8+DwrXPhM6mzpjOqc604oiez4bOteKIqeKJocKx4oml4omk4oyg4oyhw7fiiYjCsOKImcK34oia4oG/wrLilqDCoFwiLCBEID0gW10sIGUgPSB7fTsgZm9yKHZhciBpPTA7aSE9ZC5sZW5ndGg7KytpKSB7IGlmKGQuY2hhckNvZGVBdChpKSAhPT0gMHhGRkZEKSBlW2QuY2hhckF0KGkpXSA9IGk7IERbaV0gPSBkLmNoYXJBdChpKTsgfSByZXR1cm4ge1wiZW5jXCI6IGUsIFwiZGVjXCI6IEQgfTsgfSkoKTtcbmNwdGFibGVbNzM3XSA9IChmdW5jdGlvbigpeyB2YXIgZCA9IFwiXFx1MDAwMFxcdTAwMDFcXHUwMDAyXFx1MDAwM1xcdTAwMDRcXHUwMDA1XFx1MDAwNlxcdTAwMDdcXGJcXHRcXG5cXHUwMDBiXFxmXFxyXFx1MDAwZVxcdTAwMGZcXHUwMDEwXFx1MDAxMVxcdTAwMTJcXHUwMDEzXFx1MDAxNFxcdTAwMTVcXHUwMDE2XFx1MDAxN1xcdTAwMThcXHUwMDE5XFx1MDAxYVxcdTAwMWJcXHUwMDFjXFx1MDAxZFxcdTAwMWVcXHUwMDFmICFcXFwiIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6Ozw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXFxcXF1eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX5/zpHOks6TzpTOlc6WzpfOmM6ZzprOm86czp3Ons6fzqDOoc6jzqTOpc6mzqfOqM6pzrHOss6zzrTOtc62zrfOuM65zrrOu868zr3Ovs6/z4DPgc+Dz4LPhM+Fz4bPh8+I4paR4paS4paT4pSC4pSk4pWh4pWi4pWW4pWV4pWj4pWR4pWX4pWd4pWc4pWb4pSQ4pSU4pS04pSs4pSc4pSA4pS84pWe4pWf4pWa4pWU4pWp4pWm4pWg4pWQ4pWs4pWn4pWo4pWk4pWl4pWZ4pWY4pWS4pWT4pWr4pWq4pSY4pSM4paI4paE4paM4paQ4paAz4nOrM6tzq7Pis6vz4zPjc+Lz47Ohs6IzonOis6Mzo7Oj8Kx4oml4omkzqrOq8O34omIwrDiiJnCt+KImuKBv8Ky4pagwqBcIiwgRCA9IFtdLCBlID0ge307IGZvcih2YXIgaT0wO2khPWQubGVuZ3RoOysraSkgeyBpZihkLmNoYXJDb2RlQXQoaSkgIT09IDB4RkZGRCkgZVtkLmNoYXJBdChpKV0gPSBpOyBEW2ldID0gZC5jaGFyQXQoaSk7IH0gcmV0dXJuIHtcImVuY1wiOiBlLCBcImRlY1wiOiBEIH07IH0pKCk7XG5jcHRhYmxlWzg1MF0gPSAoZnVuY3Rpb24oKXsgdmFyIGQgPSBcIlxcdTAwMDBcXHUwMDAxXFx1MDAwMlxcdTAwMDNcXHUwMDA0XFx1MDAwNVxcdTAwMDZcXHUwMDA3XFxiXFx0XFxuXFx1MDAwYlxcZlxcclxcdTAwMGVcXHUwMDBmXFx1MDAxMFxcdTAwMTFcXHUwMDEyXFx1MDAxM1xcdTAwMTRcXHUwMDE1XFx1MDAxNlxcdTAwMTdcXHUwMDE4XFx1MDAxOVxcdTAwMWFcXHUwMDFiXFx1MDAxY1xcdTAwMWRcXHUwMDFlXFx1MDAxZiAhXFxcIiMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojs8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW1xcXFxdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+f8OHw7zDqcOiw6TDoMOlw6fDqsOrw6jDr8Ouw6zDhMOFw4nDpsOGw7TDtsOyw7vDucO/w5bDnMO4wqPDmMOXxpLDocOtw7PDusOxw5HCqsK6wr/CrsKswr3CvMKhwqvCu+KWkeKWkuKWk+KUguKUpMOBw4LDgMKp4pWj4pWR4pWX4pWdwqLCpeKUkOKUlOKUtOKUrOKUnOKUgOKUvMOjw4PilZrilZTilanilabilaDilZDilazCpMOww5DDisOLw4jEscONw47Dj+KUmOKUjOKWiOKWhMKmw4ziloDDk8Ofw5TDksO1w5XCtcO+w57DmsObw5nDvcOdwq/CtMKtwrHigJfCvsK2wqfDt8K4wrDCqMK3wrnCs8Ky4pagwqBcIiwgRCA9IFtdLCBlID0ge307IGZvcih2YXIgaT0wO2khPWQubGVuZ3RoOysraSkgeyBpZihkLmNoYXJDb2RlQXQoaSkgIT09IDB4RkZGRCkgZVtkLmNoYXJBdChpKV0gPSBpOyBEW2ldID0gZC5jaGFyQXQoaSk7IH0gcmV0dXJuIHtcImVuY1wiOiBlLCBcImRlY1wiOiBEIH07IH0pKCk7XG5jcHRhYmxlWzg1Ml0gPSAoZnVuY3Rpb24oKXsgdmFyIGQgPSBcIlxcdTAwMDBcXHUwMDAxXFx1MDAwMlxcdTAwMDNcXHUwMDA0XFx1MDAwNVxcdTAwMDZcXHUwMDA3XFxiXFx0XFxuXFx1MDAwYlxcZlxcclxcdTAwMGVcXHUwMDBmXFx1MDAxMFxcdTAwMTFcXHUwMDEyXFx1MDAxM1xcdTAwMTRcXHUwMDE1XFx1MDAxNlxcdTAwMTdcXHUwMDE4XFx1MDAxOVxcdTAwMWFcXHUwMDFiXFx1MDAxY1xcdTAwMWRcXHUwMDFlXFx1MDAxZiAhXFxcIiMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojs8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW1xcXFxdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+f8OHw7zDqcOiw6TFr8SHw6fFgsOrxZDFkcOuxbnDhMSGw4nEucS6w7TDtsS9xL7FmsWbw5bDnMWkxaXFgcOXxI3DocOtw7PDusSExIXFvcW+xJjEmcKsxbrEjMWfwqvCu+KWkeKWkuKWk+KUguKUpMOBw4LEmsWe4pWj4pWR4pWX4pWdxbvFvOKUkOKUlOKUtOKUrOKUnOKUgOKUvMSCxIPilZrilZTilanilabilaDilZDilazCpMSRxJDEjsOLxI/Fh8ONw47Em+KUmOKUjOKWiOKWhMWixa7iloDDk8Ofw5TFg8WExYjFoMWhxZTDmsWVxbDDvcOdxaPCtMKty53Lm8uHy5jCp8O3wrjCsMKoy5nFscWYxZnilqDCoFwiLCBEID0gW10sIGUgPSB7fTsgZm9yKHZhciBpPTA7aSE9ZC5sZW5ndGg7KytpKSB7IGlmKGQuY2hhckNvZGVBdChpKSAhPT0gMHhGRkZEKSBlW2QuY2hhckF0KGkpXSA9IGk7IERbaV0gPSBkLmNoYXJBdChpKTsgfSByZXR1cm4ge1wiZW5jXCI6IGUsIFwiZGVjXCI6IEQgfTsgfSkoKTtcbmNwdGFibGVbODU3XSA9IChmdW5jdGlvbigpeyB2YXIgZCA9IFwiXFx1MDAwMFxcdTAwMDFcXHUwMDAyXFx1MDAwM1xcdTAwMDRcXHUwMDA1XFx1MDAwNlxcdTAwMDdcXGJcXHRcXG5cXHUwMDBiXFxmXFxyXFx1MDAwZVxcdTAwMGZcXHUwMDEwXFx1MDAxMVxcdTAwMTJcXHUwMDEzXFx1MDAxNFxcdTAwMTVcXHUwMDE2XFx1MDAxN1xcdTAwMThcXHUwMDE5XFx1MDAxYVxcdTAwMWJcXHUwMDFjXFx1MDAxZFxcdTAwMWVcXHUwMDFmICFcXFwiIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6Ozw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXFxcXF1eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX5/w4fDvMOpw6LDpMOgw6XDp8Oqw6vDqMOvw67EscOEw4XDicOmw4bDtMO2w7LDu8O5xLDDlsOcw7jCo8OYxZ7Fn8Ohw63Ds8O6w7HDkcSexJ/Cv8KuwqzCvcK8wqHCq8K74paR4paS4paT4pSC4pSkw4HDgsOAwqnilaPilZHilZfilZ3CosKl4pSQ4pSU4pS04pSs4pSc4pSA4pS8w6PDg+KVmuKVlOKVqeKVpuKVoOKVkOKVrMKkwrrCqsOKw4vDiO+/vcONw47Dj+KUmOKUjOKWiOKWhMKmw4ziloDDk8Ofw5TDksO1w5XCte+/vcOXw5rDm8OZw6zDv8KvwrTCrcKx77+9wr7CtsKnw7fCuMKwwqjCt8K5wrPCsuKWoMKgXCIsIEQgPSBbXSwgZSA9IHt9OyBmb3IodmFyIGk9MDtpIT1kLmxlbmd0aDsrK2kpIHsgaWYoZC5jaGFyQ29kZUF0KGkpICE9PSAweEZGRkQpIGVbZC5jaGFyQXQoaSldID0gaTsgRFtpXSA9IGQuY2hhckF0KGkpOyB9IHJldHVybiB7XCJlbmNcIjogZSwgXCJkZWNcIjogRCB9OyB9KSgpO1xuY3B0YWJsZVs4NjFdID0gKGZ1bmN0aW9uKCl7IHZhciBkID0gXCJcXHUwMDAwXFx1MDAwMVxcdTAwMDJcXHUwMDAzXFx1MDAwNFxcdTAwMDVcXHUwMDA2XFx1MDAwN1xcYlxcdFxcblxcdTAwMGJcXGZcXHJcXHUwMDBlXFx1MDAwZlxcdTAwMTBcXHUwMDExXFx1MDAxMlxcdTAwMTNcXHUwMDE0XFx1MDAxNVxcdTAwMTZcXHUwMDE3XFx1MDAxOFxcdTAwMTlcXHUwMDFhXFx1MDAxYlxcdTAwMWNcXHUwMDFkXFx1MDAxZVxcdTAwMWYgIVxcXCIjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltcXFxcXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fn/Dh8O8w6nDosOkw6DDpcOnw6rDq8Oow5DDsMOew4TDhcOJw6bDhsO0w7bDvsO7w53DvcOWw5zDuMKjw5jigqfGksOhw63Ds8O6w4HDjcOTw5rCv+KMkMKswr3CvMKhwqvCu+KWkeKWkuKWk+KUguKUpOKVoeKVouKVluKVleKVo+KVkeKVl+KVneKVnOKVm+KUkOKUlOKUtOKUrOKUnOKUgOKUvOKVnuKVn+KVmuKVlOKVqeKVpuKVoOKVkOKVrOKVp+KVqOKVpOKVpeKVmeKVmOKVkuKVk+KVq+KVquKUmOKUjOKWiOKWhOKWjOKWkOKWgM6xw5/Ok8+AzqPPg8K1z4TOps6YzqnOtOKIns+GzrXiiKniiaHCseKJpeKJpOKMoOKMocO34omIwrDiiJnCt+KImuKBv8Ky4pagwqBcIiwgRCA9IFtdLCBlID0ge307IGZvcih2YXIgaT0wO2khPWQubGVuZ3RoOysraSkgeyBpZihkLmNoYXJDb2RlQXQoaSkgIT09IDB4RkZGRCkgZVtkLmNoYXJBdChpKV0gPSBpOyBEW2ldID0gZC5jaGFyQXQoaSk7IH0gcmV0dXJuIHtcImVuY1wiOiBlLCBcImRlY1wiOiBEIH07IH0pKCk7XG5jcHRhYmxlWzg2NV0gPSAoZnVuY3Rpb24oKXsgdmFyIGQgPSBcIlxcdTAwMDBcXHUwMDAxXFx1MDAwMlxcdTAwMDNcXHUwMDA0XFx1MDAwNVxcdTAwMDZcXHUwMDA3XFxiXFx0XFxuXFx1MDAwYlxcZlxcclxcdTAwMGVcXHUwMDBmXFx1MDAxMFxcdTAwMTFcXHUwMDEyXFx1MDAxM1xcdTAwMTRcXHUwMDE1XFx1MDAxNlxcdTAwMTdcXHUwMDE4XFx1MDAxOVxcdTAwMWFcXHUwMDFiXFx1MDAxY1xcdTAwMWRcXHUwMDFlXFx1MDAxZiAhXFxcIiMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojs8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW1xcXFxdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+f8OHw7zDqcOiw6TDoMOlw6fDqsOrw6jDr8Ouw6zDhMOFw4nDpsOGw7TDtsOyw7vDucO/w5bDnMO4wqPDmOKCp8aSw6HDrcOzw7rDscORwqrCusK/4oyQwqzCvcK8wqHCq8Kk4paR4paS4paT4pSC4pSk4pWh4pWi4pWW4pWV4pWj4pWR4pWX4pWd4pWc4pWb4pSQ4pSU4pS04pSs4pSc4pSA4pS84pWe4pWf4pWa4pWU4pWp4pWm4pWg4pWQ4pWs4pWn4pWo4pWk4pWl4pWZ4pWY4pWS4pWT4pWr4pWq4pSY4pSM4paI4paE4paM4paQ4paAzrHDn86Tz4DOo8+DwrXPhM6mzpjOqc604oiez4bOteKIqeKJocKx4oml4omk4oyg4oyhw7fiiYjCsOKImcK34oia4oG/wrLilqDCoFwiLCBEID0gW10sIGUgPSB7fTsgZm9yKHZhciBpPTA7aSE9ZC5sZW5ndGg7KytpKSB7IGlmKGQuY2hhckNvZGVBdChpKSAhPT0gMHhGRkZEKSBlW2QuY2hhckF0KGkpXSA9IGk7IERbaV0gPSBkLmNoYXJBdChpKTsgfSByZXR1cm4ge1wiZW5jXCI6IGUsIFwiZGVjXCI6IEQgfTsgfSkoKTtcbmNwdGFibGVbODY2XSA9IChmdW5jdGlvbigpeyB2YXIgZCA9IFwiXFx1MDAwMFxcdTAwMDFcXHUwMDAyXFx1MDAwM1xcdTAwMDRcXHUwMDA1XFx1MDAwNlxcdTAwMDdcXGJcXHRcXG5cXHUwMDBiXFxmXFxyXFx1MDAwZVxcdTAwMGZcXHUwMDEwXFx1MDAxMVxcdTAwMTJcXHUwMDEzXFx1MDAxNFxcdTAwMTVcXHUwMDE2XFx1MDAxN1xcdTAwMThcXHUwMDE5XFx1MDAxYVxcdTAwMWJcXHUwMDFjXFx1MDAxZFxcdTAwMWVcXHUwMDFmICFcXFwiIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6Ozw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXFxcXF1eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX5/0JDQkdCS0JPQlNCV0JbQl9CY0JnQmtCb0JzQndCe0J/QoNCh0KLQo9Ck0KXQptCn0KjQqdCq0KvQrNCt0K7Qr9Cw0LHQstCz0LTQtdC20LfQuNC50LrQu9C80L3QvtC/4paR4paS4paT4pSC4pSk4pWh4pWi4pWW4pWV4pWj4pWR4pWX4pWd4pWc4pWb4pSQ4pSU4pS04pSs4pSc4pSA4pS84pWe4pWf4pWa4pWU4pWp4pWm4pWg4pWQ4pWs4pWn4pWo4pWk4pWl4pWZ4pWY4pWS4pWT4pWr4pWq4pSY4pSM4paI4paE4paM4paQ4paA0YDRgdGC0YPRhNGF0YbRh9GI0YnRitGL0YzRjdGO0Y/QgdGR0ITRlNCH0ZfQjtGewrDiiJnCt+KImuKElsKk4pagwqBcIiwgRCA9IFtdLCBlID0ge307IGZvcih2YXIgaT0wO2khPWQubGVuZ3RoOysraSkgeyBpZihkLmNoYXJDb2RlQXQoaSkgIT09IDB4RkZGRCkgZVtkLmNoYXJBdChpKV0gPSBpOyBEW2ldID0gZC5jaGFyQXQoaSk7IH0gcmV0dXJuIHtcImVuY1wiOiBlLCBcImRlY1wiOiBEIH07IH0pKCk7XG5jcHRhYmxlWzg3NF0gPSAoZnVuY3Rpb24oKXsgdmFyIGQgPSBcIlxcdTAwMDBcXHUwMDAxXFx1MDAwMlxcdTAwMDNcXHUwMDA0XFx1MDAwNVxcdTAwMDZcXHUwMDA3XFxiXFx0XFxuXFx1MDAwYlxcZlxcclxcdTAwMGVcXHUwMDBmXFx1MDAxMFxcdTAwMTFcXHUwMDEyXFx1MDAxM1xcdTAwMTRcXHUwMDE1XFx1MDAxNlxcdTAwMTdcXHUwMDE4XFx1MDAxOVxcdTAwMWFcXHUwMDFiXFx1MDAxY1xcdTAwMWRcXHUwMDFlXFx1MDAxZiAhXFxcIiMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojs8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW1xcXFxdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+f+KCrO+/ve+/ve+/ve+/veKApu+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/veKAmOKAmeKAnOKAneKAouKAk+KAlO+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/vcKg4LiB4LiC4LiD4LiE4LiF4LiG4LiH4LiI4LiJ4LiK4LiL4LiM4LiN4LiO4LiP4LiQ4LiR4LiS4LiT4LiU4LiV4LiW4LiX4LiY4LiZ4Lia4Lib4Lic4Lid4Lie4Lif4Lig4Lih4Lii4Lij4Lik4Lil4Lim4Lin4Lio4Lip4Liq4Lir4Lis4Lit4Liu4Liv4Liw4Lix4Liy4Liz4Li04Li14Li24Li34Li44Li54Li677+977+977+977+94Li/4LmA4LmB4LmC4LmD4LmE4LmF4LmG4LmH4LmI4LmJ4LmK4LmL4LmM4LmN4LmO4LmP4LmQ4LmR4LmS4LmT4LmU4LmV4LmW4LmX4LmY4LmZ4Lma4Lmb77+977+977+977+9XCIsIEQgPSBbXSwgZSA9IHt9OyBmb3IodmFyIGk9MDtpIT1kLmxlbmd0aDsrK2kpIHsgaWYoZC5jaGFyQ29kZUF0KGkpICE9PSAweEZGRkQpIGVbZC5jaGFyQXQoaSldID0gaTsgRFtpXSA9IGQuY2hhckF0KGkpOyB9IHJldHVybiB7XCJlbmNcIjogZSwgXCJkZWNcIjogRCB9OyB9KSgpO1xuY3B0YWJsZVs4OTVdID0gKGZ1bmN0aW9uKCl7IHZhciBkID0gXCJcXHUwMDAwXFx1MDAwMVxcdTAwMDJcXHUwMDAzXFx1MDAwNFxcdTAwMDVcXHUwMDA2XFx1MDAwN1xcYlxcdFxcblxcdTAwMGJcXGZcXHJcXHUwMDBlXFx1MDAwZlxcdTAwMTBcXHUwMDExXFx1MDAxMlxcdTAwMTNcXHUwMDE0XFx1MDAxNVxcdTAwMTZcXHUwMDE3XFx1MDAxOFxcdTAwMTlcXHUwMDFhXFx1MDAxYlxcdTAwMWNcXHUwMDFkXFx1MDAxZVxcdTAwMWYgIVxcXCIjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltcXFxcXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fn/EjMO8w6nEj8OkxI7FpMSNxJvEmsS5w43Evseqw4TDgcOJxb7FvcO0w7bDk8Wvw5rDvcOWw5zFoMS9w53FmMWlw6HDrcOzw7rFiMWHxa7DlMWhxZnFlcWUwrzCp8KrwrvilpHilpLilpPilILilKTilaHilaLilZbilZXilaPilZHilZfilZ3ilZzilZvilJDilJTilLTilKzilJzilIDilLzilZ7ilZ/ilZrilZTilanilabilaDilZDilazilafilajilaTilaXilZnilZjilZLilZPilavilarilJjilIzilojiloTilozilpDiloDOscOfzpPPgM6jz4PCtc+EzqbOmM6pzrTiiJ7Phs614oip4omhwrHiiaXiiaTijKDijKHDt+KJiMKw4oiZwrfiiJrigb/CsuKWoMKgXCIsIEQgPSBbXSwgZSA9IHt9OyBmb3IodmFyIGk9MDtpIT1kLmxlbmd0aDsrK2kpIHsgaWYoZC5jaGFyQ29kZUF0KGkpICE9PSAweEZGRkQpIGVbZC5jaGFyQXQoaSldID0gaTsgRFtpXSA9IGQuY2hhckF0KGkpOyB9IHJldHVybiB7XCJlbmNcIjogZSwgXCJkZWNcIjogRCB9OyB9KSgpO1xuY3B0YWJsZVs5MzJdID0gKGZ1bmN0aW9uKCl7IHZhciBkID0gW10sIGUgPSB7fSwgRCA9IFtdLCBqO1xuRFswXSA9IFwiXFx1MDAwMFxcdTAwMDFcXHUwMDAyXFx1MDAwM1xcdTAwMDRcXHUwMDA1XFx1MDAwNlxcdTAwMDdcXGJcXHRcXG5cXHUwMDBiXFxmXFxyXFx1MDAwZVxcdTAwMGZcXHUwMDEwXFx1MDAxMVxcdTAwMTJcXHUwMDEzXFx1MDAxNFxcdTAwMTVcXHUwMDE2XFx1MDAxN1xcdTAwMThcXHUwMDE5XFx1MDAxYVxcdTAwMWJcXHUwMDFjXFx1MDAxZFxcdTAwMWVcXHUwMDFmICFcXFwiIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6Ozw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXFxcXF1eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX5/77+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+9772h772i772j772k772l772m772n772o772p772q772r772s772t772u772v772w772x772y772z7720772177227723772477257726772777287729772+772/776A776B776C776D776E776F776G776H776I776J776K776L776M776N776O776P776Q776R776S776T776U776V776W776X776Y776Z776a776b776c776d776e776f77+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+9XCIuc3BsaXQoXCJcIik7XG5mb3IoaiA9IDA7IGogIT0gRFswXS5sZW5ndGg7ICsraikgaWYoRFswXVtqXS5jaGFyQ29kZUF0KDApICE9PSAweEZGRkQpIHsgZVtEWzBdW2pdXSA9IDAgKyBqOyBkWzAgKyBqXSA9IERbMF1bal07fVxuRFsxMjldID0gXCLvv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73jgIDjgIHjgILvvIzvvI7jg7vvvJrvvJvvvJ/vvIHjgpvjgpzCtO+9gMKo77y+77+j77y/44O944O+44Kd44Ke44CD5Lud44CF44CG44CH44O84oCV4oCQ77yP77y8772e4oil772c4oCm4oCl4oCY4oCZ4oCc4oCd77yI77yJ44CU44CV77y777y9772b772d44CI44CJ44CK44CL44CM44CN44CO44CP44CQ44CR77yL77yNwrHDl++/vcO377yd4omg77yc77ye4omm4omn4oie4oi04pmC4pmAwrDigLLigLPihIPvv6XvvITvv6Dvv6HvvIXvvIPvvIbvvIrvvKDCp+KYhuKYheKXi+KXj+KXjuKXh+KXhuKWoeKWoOKWs+KWsuKWveKWvOKAu+OAkuKGkuKGkOKGkeKGk+OAk++/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/veKIiOKIi+KKhuKKh+KKguKKg+KIquKIqe+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/veKIp+KIqO+/ouKHkuKHlOKIgOKIg++/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/veKIoOKKpeKMkuKIguKIh+KJoeKJkuKJquKJq+KImuKIveKIneKIteKIq+KIrO+/ve+/ve+/ve+/ve+/ve+/ve+/veKEq+KAsOKZr+KZreKZquKAoOKAocK277+977+977+977+94pev77+977+977+9XCIuc3BsaXQoXCJcIik7XG5mb3IoaiA9IDA7IGogIT0gRFsxMjldLmxlbmd0aDsgKytqKSBpZihEWzEyOV1bal0uY2hhckNvZGVBdCgwKSAhPT0gMHhGRkZEKSB7IGVbRFsxMjldW2pdXSA9IDMzMDI0ICsgajsgZFszMzAyNCArIGpdID0gRFsxMjldW2pdO31cbkRbMTMwXSA9IFwi77+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977yQ77yR77yS77yT77yU77yV77yW77yX77yY77yZ77+977+977+977+977+977+977+977yh77yi77yj77yk77yl77ym77yn77yo77yp77yq77yr77ys77yt77yu77yv77yw77yx77yy77yz77y077y177y277y377y477y577y677+977+977+977+977+977+977+9772B772C772D772E772F772G772H772I772J772K772L772M772N772O772P772Q772R772S772T772U772V772W772X772Y772Z772a77+977+977+977+944GB44GC44GD44GE44GF44GG44GH44GI44GJ44GK44GL44GM44GN44GO44GP44GQ44GR44GS44GT44GU44GV44GW44GX44GY44GZ44Ga44Gb44Gc44Gd44Ge44Gf44Gg44Gh44Gi44Gj44Gk44Gl44Gm44Gn44Go44Gp44Gq44Gr44Gs44Gt44Gu44Gv44Gw44Gx44Gy44Gz44G044G144G244G344G444G544G644G744G844G944G+44G/44KA44KB44KC44KD44KE44KF44KG44KH44KI44KJ44KK44KL44KM44KN44KO44KP44KQ44KR44KS44KT77+977+977+977+977+977+977+977+977+977+977+977+977+977+9XCIuc3BsaXQoXCJcIik7XG5mb3IoaiA9IDA7IGogIT0gRFsxMzBdLmxlbmd0aDsgKytqKSBpZihEWzEzMF1bal0uY2hhckNvZGVBdCgwKSAhPT0gMHhGRkZEKSB7IGVbRFsxMzBdW2pdXSA9IDMzMjgwICsgajsgZFszMzI4MCArIGpdID0gRFsxMzBdW2pdO31cbkRbMTMxXSA9IFwi77+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+944Kh44Ki44Kj44Kk44Kl44Km44Kn44Ko44Kp44Kq44Kr44Ks44Kt44Ku44Kv44Kw44Kx44Ky44Kz44K044K144K244K344K444K544K644K744K844K944K+44K/44OA44OB44OC44OD44OE44OF44OG44OH44OI44OJ44OK44OL44OM44ON44OO44OP44OQ44OR44OS44OT44OU44OV44OW44OX44OY44OZ44Oa44Ob44Oc44Od44Oe44Of77+944Og44Oh44Oi44Oj44Ok44Ol44Om44On44Oo44Op44Oq44Or44Os44Ot44Ou44Ov44Ow44Ox44Oy44Oz44O044O144O277+977+977+977+977+977+977+977+9zpHOks6TzpTOlc6WzpfOmM6ZzprOm86czp3Ons6fzqDOoc6jzqTOpc6mzqfOqM6p77+977+977+977+977+977+977+977+9zrHOss6zzrTOtc62zrfOuM65zrrOu868zr3Ovs6/z4DPgc+Dz4TPhc+Gz4fPiM+J77+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+9XCIuc3BsaXQoXCJcIik7XG5mb3IoaiA9IDA7IGogIT0gRFsxMzFdLmxlbmd0aDsgKytqKSBpZihEWzEzMV1bal0uY2hhckNvZGVBdCgwKSAhPT0gMHhGRkZEKSB7IGVbRFsxMzFdW2pdXSA9IDMzNTM2ICsgajsgZFszMzUzNiArIGpdID0gRFsxMzFdW2pdO31cbkRbMTMyXSA9IFwi77+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+90JDQkdCS0JPQlNCV0IHQltCX0JjQmdCa0JvQnNCd0J7Qn9Cg0KHQotCj0KTQpdCm0KfQqNCp0KrQq9Cs0K3QrtCv77+977+977+977+977+977+977+977+977+977+977+977+977+977+977+90LDQsdCy0LPQtNC10ZHQttC30LjQudC60LvQvNC977+90L7Qv9GA0YHRgtGD0YTRhdGG0YfRiNGJ0YrRi9GM0Y3RjtGP77+977+977+977+977+977+977+977+977+977+977+977+977+94pSA4pSC4pSM4pSQ4pSY4pSU4pSc4pSs4pSk4pS04pS84pSB4pSD4pSP4pST4pSb4pSX4pSj4pSz4pSr4pS74pWL4pSg4pSv4pSo4pS34pS/4pSd4pSw4pSl4pS44pWC77+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+9XCIuc3BsaXQoXCJcIik7XG5mb3IoaiA9IDA7IGogIT0gRFsxMzJdLmxlbmd0aDsgKytqKSBpZihEWzEzMl1bal0uY2hhckNvZGVBdCgwKSAhPT0gMHhGRkZEKSB7IGVbRFsxMzJdW2pdXSA9IDMzNzkyICsgajsgZFszMzc5MiArIGpdID0gRFsxMzJdW2pdO31cbkRbMTM1XSA9IFwi77+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+94pGg4pGh4pGi4pGj4pGk4pGl4pGm4pGn4pGo4pGp4pGq4pGr4pGs4pGt4pGu4pGv4pGw4pGx4pGy4pGz4oWg4oWh4oWi4oWj4oWk4oWl4oWm4oWn4oWo4oWp77+9442J44yU44yi442N44yY44yn44yD44y2442R442X44yN44ym44yj44yr442K44y7446c446d446e446O446P44+E446h77+977+977+977+977+977+977+977+9442777+944Cd44Cf4oSW44+N4oSh44qk44ql44qm44qn44qo44ix44iy44i5442+442944284omS4omh4oir4oiu4oiR4oia4oql4oig4oif4oq/4oi14oip4oiq77+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+9XCIuc3BsaXQoXCJcIik7XG5mb3IoaiA9IDA7IGogIT0gRFsxMzVdLmxlbmd0aDsgKytqKSBpZihEWzEzNV1bal0uY2hhckNvZGVBdCgwKSAhPT0gMHhGRkZEKSB7IGVbRFsxMzVdW2pdXSA9IDM0NTYwICsgajsgZFszNDU2MCArIGpdID0gRFsxMzVdW2pdO31cbkRbMTM2XSA9IFwi77+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+95Lqc5ZSW5aiD6Zi/5ZOA5oSb5oyo5ae26YCi6JG16Iyc56mQ5oKq5o+h5ril5pet6JGm6Iqm6a+15qKT5Zyn5pah5omx5a6b5aeQ6Jm76aO057Wi57a+6a6O5oiW57Kf6KK35a6J5bq15oyJ5pqX5qGI6ZeH6Z6N5p2P5Lul5LyK5L2N5L6d5YGJ5Zuy5aS35aeU5aiB5bCJ5oOf5oSP5oWw5piT5qSF54K655WP55Ww56e757at57ev6IOD6JCO6KGj6KyC6YGV6YG65Yy75LqV5Lql5Z+f6IKy6YOB56Ov5LiA5aOx5rqi6YC456iy6Iyo6IqL6bCv5YWB5Y2w5ZK95ZOh5Zug5ae75byV6aOy5rer6IOk6JSt77+977+977+9XCIuc3BsaXQoXCJcIik7XG5mb3IoaiA9IDA7IGogIT0gRFsxMzZdLmxlbmd0aDsgKytqKSBpZihEWzEzNl1bal0uY2hhckNvZGVBdCgwKSAhPT0gMHhGRkZEKSB7IGVbRFsxMzZdW2pdXSA9IDM0ODE2ICsgajsgZFszNDgxNiArIGpdID0gRFsxMzZdW2pdO31cbkRbMTM3XSA9IFwi77+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+96Zmi6Zmw6Zqg6Z+75ZCL5Y+z5a6H54OP57696L+C6Zuo5Y2v6bWc56q65LiR56KT6Ie85rim5ZiY5ZSE5qyd6JSa6bC75ael5Y6p5rWm55Oc6ZaP5ZmC5LqR6YGL6Zuy6I2P6aSM5Y+h5Za25ayw5b2x5pig5puz5qCE5rC45rOz5rSp55Gb55uI56mO6aC06Iux6KGb6Kmg6Yut5ray55ar55uK6aeF5oKm6KyB6LaK6Zay5qaO5Y6t5YaG77+95ZyS5aCw5aWE5a605bu25oCo5o6p5o+05rK/5ryU54KO54SU54WZ54eV54y/57iB6Im26IuR6JaX6YGg6Ymb6bSb5aGp5pa85rGa55Sl5Ye55aSu5aWl5b6A5b+c5oq85pe65qiq5qyn5q60546L57+B6KWW6bSs6bSO6buE5bKh5rKW6I275YSE5bGL5oa26IeG5qG254mh5LmZ5L+65Y245oGp5rip56mP6Z+z5LiL5YyW5Luu5L2V5Ly95L6h5L2z5Yqg5Y+v5ZiJ5aSP5auB5a625a+h56eR5pqH5p6c5p625q2M5rKz54Gr54+C56aN56a+56i8566H6Iqx6Iub6IyE6I236I+v6I+T6J2m6Kqy5Zip6LKo6L+m6YGO6Zye6JqK5L+E5bOo5oiR54mZ55S76Iel6Iq96Ju+6LOA6ZuF6aST6aeV5LuL5Lya6Kej5Zue5aGK5aOK5bu75b+r5oCq5oKU5oGi5oeQ5oiS5ouQ5pS577+977+977+9XCIuc3BsaXQoXCJcIik7XG5mb3IoaiA9IDA7IGogIT0gRFsxMzddLmxlbmd0aDsgKytqKSBpZihEWzEzN11bal0uY2hhckNvZGVBdCgwKSAhPT0gMHhGRkZEKSB7IGVbRFsxMzddW2pdXSA9IDM1MDcyICsgajsgZFszNTA3MiArIGpdID0gRFsxMzddW2pdO31cbkRbMTM4XSA9IFwi77+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+96a2B5pmm5qKw5rW354Gw55WM55qG57W16Iql6J+56ZaL6ZqO6LKd5Yex5Yq+5aSW5ZKz5a6z5bSW5oWo5qaC5rav56KN6JOL6KGX6Kmy6Y6n6aq45rWs6aao6JuZ5Z6j5p+/6JuO6YiO5YqD5ZqH5ZCE5buT5ouh5pK55qC85qC45q67542y56K656mr6Kaa6KeS6LWr6LyD6YOt6Zaj6ZqU6Z2p5a2m5bKz5qW96aGN6aGO5o6b56yg5qir77+95qm/5qK26bCN5r2f5Ymy5Zad5oGw5ous5rS75riH5ruR6JGb6KSQ6L2E5LiU6bC55Y+25qSb5qi66Z6E5qCq5YWc56uD6JKy6Yec6Y6M5Zmb6bSo5qCi6IyF6JCx57Kl5YiI6IuF55Om5Lm+5L6D5Yag5a+S5YiK5YuY5Yun5be75Zaa5aCq5aem5a6M5a6Y5a+b5bmy5bm55oKj5oSf5oWj5oa+5o+b5pWi5p+R5qGT5qO65qy+5q2T5rGX5ryi5r6X5r2F55Kw55SY55uj55yL56u/566h57Ch57ep57y257+w6IKd6Imm6I6e6Kaz6KuM6LKr6YKE6ZGR6ZaT6ZaR6Zai6Zml6Z+T6aSo6IiY5Li45ZCr5bK45beM546p55mM55y85bKp57+r6LSL6ZuB6aCR6aGU6aGY5LyB5LyO5Y2x5Zac5Zmo5Z+65aWH5ayJ5a+E5bKQ5biM5bm+5b+M5o+u5py65peX5pei5pyf5qOL5qOE77+977+977+9XCIuc3BsaXQoXCJcIik7XG5mb3IoaiA9IDA7IGogIT0gRFsxMzhdLmxlbmd0aDsgKytqKSBpZihEWzEzOF1bal0uY2hhckNvZGVBdCgwKSAhPT0gMHhGRkZEKSB7IGVbRFsxMzhdW2pdXSA9IDM1MzI4ICsgajsgZFszNTMyOCArIGpdID0gRFsxMzhdW2pdO31cbkRbMTM5XSA9IFwi77+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+95qmf5biw5q+F5rCX5rG955W/56WI5a2j56iA57SA5b696KaP6KiY6LK06LW36LuM6Lyd6aOi6aiO6ay85LqA5YG95YSA5aaT5a6c5oiv5oqA5pOs5qy654qg55aR56WH576p6J+76Kq86K2w5o6s6I+K6Z6g5ZCJ5ZCD5Zar5qGU5qmY6Kmw56Cn5p216buN5Y205a6i6ISa6JmQ6YCG5LiY5LmF5LuH5LyR5Y+K5ZC45a6u5byT5oCl5pWR77+95py95rGC5rGy5rOj54G455CD56m256qu56yI57Sa57O+57Wm5pen54mb5Y675bGF5beo5ouS5oug5oyZ5rig6Jma6Kix6Led6Yu45ryB56am6a2a5Lqo5Lqr5Lqs5L6b5L6g5YOR5YWH56u25YWx5Ye25Y2U5Yyh5Y2/5Y+r5Zas5aKD5bOh5by35b2K5oCv5oGQ5oGt5oyf5pWZ5qmL5rOB54uC54ut55+v6IO46ISF6IiI6JWO6YO36Y+h6Z+/6aWX6ama5Luw5Yed5bCt5pqB5qWt5bGA5puy5qW1546J5qGQ57KB5YOF5Yuk5Z2H5be+6Yym5pak5qyj5qy955C056aB56a9562L57eK6Iq56I+M6KG/6KWf6Ky56L+R6YeR5ZCf6YqA5Lmd5YC25Y+l5Yy654uX546W55+p6Ium6Lqv6aeG6aeI6aeS5YW35oSa6Jme5Zaw56m65YG25a+T6YGH6ZqF5Liy5qub6Yen5bGR5bGI77+977+977+9XCIuc3BsaXQoXCJcIik7XG5mb3IoaiA9IDA7IGogIT0gRFsxMzldLmxlbmd0aDsgKytqKSBpZihEWzEzOV1bal0uY2hhckNvZGVBdCgwKSAhPT0gMHhGRkZEKSB7IGVbRFsxMzldW2pdXSA9IDM1NTg0ICsgajsgZFszNTU4NCArIGpdID0gRFsxMzldW2pdO31cbkRbMTQwXSA9IFwi77+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+95o6Y56qf5rKT6Z206L2h56qq54aK6ZqI57KC5qCX57mw5qGR6Y2s5Yuy5ZCb6Jar6KiT576k6LuN6YOh5Y2m6KKI56WB5L+C5YK+5YiR5YWE5ZWT5Zyt54+q5Z6L5aWR5b2i5b6E5oG15oW25oWn5oap5o6y5pC65pWs5pmv5qGC5riT55Wm56i957O757WM57aZ57mL572r6IyO6I2K6JuN6KiI6Kmj6K2m6Lu96aCa6baP6Iq46L+O6a+o77+95YqH5oif5pKD5r+A6ZqZ5qGB5YKR5qyg5rG65r2U56m057WQ6KGA6Kij5pyI5Lu25YC55YCm5YGl5YW85Yi45Ymj5Zan5ZyP5aCF5auM5bu65oay5oe45ouz5o2y5qSc5qip54m954qs54yu56CU56Gv57W555yM6IKp6KaL6KyZ6LOi6LuS6YGj6Y216Zm66aGV6aiT6bm45YWD5Y6f5Y6z5bm75bym5rib5rqQ546E54++57WD6Ii36KiA6Ku66ZmQ5LmO5YCL5Y+k5ZG85Zu65aeR5a2k5bex5bqr5byn5oi45pWF5p6v5rmW54uQ57OK6KK06IKh6IOh6I+w6JmO6KqH6Leo6Yi36ZuH6aGn6byT5LqU5LqS5LyN5Y2I5ZGJ5ZC+5aiv5b6M5b6h5oKf5qKn5qqO55Ga56KB6Kqe6Kqk6K236YaQ5Lme6a+J5Lqk5L285L6v5YCZ5YCW5YWJ5YWs5Yqf5Yq55Yu+5Y6a5Y+j5ZCR77+977+977+9XCIuc3BsaXQoXCJcIik7XG5mb3IoaiA9IDA7IGogIT0gRFsxNDBdLmxlbmd0aDsgKytqKSBpZihEWzE0MF1bal0uY2hhckNvZGVBdCgwKSAhPT0gMHhGRkZEKSB7IGVbRFsxNDBdW2pdXSA9IDM1ODQwICsgajsgZFszNTg0MCArIGpdID0gRFsxNDBdW2pdO31cbkRbMTQxXSA9IFwi77+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+95ZCO5ZaJ5Z2R5Z6i5aW95a2U5a2d5a6P5bel5ben5be35bm45bqD5bqa5bq35byY5oGS5oWM5oqX5ouY5o6n5pS75piC5pmD5pu05p2t5qCh5qKX5qeL5rGf5rSq5rWp5riv5rqd55Sy55qH56Gs56i/57Og57SF57SY57We57ax6ICV6ICD6IKv6IKx6IWU6IaP6Iiq6I2S6KGM6KGh6Kyb6LKi6LO86YOK6YW16Ymx56C/6Yu86Zak6ZmN77+96aCF6aaZ6auY6bS75Ymb5Yqr5Y+35ZCI5aOV5ou35r+g6LGq6L2f6bq55YWL5Yi75ZGK5Zu956mA6YW36bWg6buS542E5ryJ6IWw55SR5b+95oOa6aqo54ub6L685q2k6aCD5LuK5Zuw5Z2k5aK+5ama5oGo5oeH5piP5piG5qC55qKx5re355eV57S66Imu6a2C5Lqb5L2Q5Y+J5ZSG5bWv5bem5beu5p+75rKZ55Gz56CC6KmQ6Y6W6KOf5Z2Q5bqn5oyr5YK15YKs5YaN5pyA5ZOJ5aGe5aa75a6w5b2p5omN5o6h5qC95q2z5riI54G96YeH54qA56CV56Cm56Wt5paO57Sw6I+c6KOB6LyJ6Zqb5Ymk5Zyo5p2Q572q6LKh5Ya05Z2C6Ziq5aC65qaK6IK05ZKy5bSO5Z+856KV6be65L2c5YmK5ZKL5pC+5pio5pyU5p+156qE562W57Si6Yyv5qGc6a6t56y55YyZ5YaK5Yi377+977+977+9XCIuc3BsaXQoXCJcIik7XG5mb3IoaiA9IDA7IGogIT0gRFsxNDFdLmxlbmd0aDsgKytqKSBpZihEWzE0MV1bal0uY2hhckNvZGVBdCgwKSAhPT0gMHhGRkZEKSB7IGVbRFsxNDFdW2pdXSA9IDM2MDk2ICsgajsgZFszNjA5NiArIGpdID0gRFsxNDFdW2pdO31cbkRbMTQyXSA9IFwi77+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+95a+f5ou25pKu5pOm5pyt5q666Jap6ZuR55qQ6a+W5o2M6YyG6a6r55q/5pmS5LiJ5YKY5Y+C5bGx5oOo5pKS5pWj5qGf54em54+K55Sj566X57qC6JqV6K6D6LOb6YW46aSQ5pas5pqr5q6L5LuV5LuU5Ly65L2/5Yi65Y+45Y+y5Zej5Zub5aOr5aeL5aeJ5ae/5a2Q5bGN5biC5bir5b+X5oCd5oyH5pSv5a2c5pav5pa95peo5p6d5q2i77+95q275rCP542F56WJ56eB57O457SZ57Sr6IKi6ISC6Iez6KaW6Kme6Kmp6Kmm6KqM6Kuu6LOH6LOc6ZuM6aO85q2v5LqL5Ly85L6N5YWQ5a2X5a+65oWI5oyB5pmC5qyh5ruL5rK754i+55K955eU56OB56S66ICM6ICz6Ieq6JKU6L6e5rGQ6bm/5byP6K2Y6bSr56u66Lu45a6N6Zur5LiD5Y+x5Z+35aSx5auJ5a6k5oKJ5rm/5ryG55a+6LOq5a6f6JSA56+g5YGy5p+06Iqd5bGh6JWK57ie6IiO5YaZ5bCE5o2o6LWm5pac54Wu56S+57SX6ICF6Kyd6LuK6YGu6JuH6YKq5YCf5Yu65bC65p2T54G854i16YWM6YeI6Yyr6Iul5a+C5byx5oO55Li75Y+W5a6I5omL5pyx5q6K54up54+g56iu6IWr6Laj6YWS6aaW5YSS5Y+X5ZGq5a+/5o6I5qi557as6ZyA5Zua5Y+O5ZGo77+977+977+9XCIuc3BsaXQoXCJcIik7XG5mb3IoaiA9IDA7IGogIT0gRFsxNDJdLmxlbmd0aDsgKytqKSBpZihEWzE0Ml1bal0uY2hhckNvZGVBdCgwKSAhPT0gMHhGRkZEKSB7IGVbRFsxNDJdW2pdXSA9IDM2MzUyICsgajsgZFszNjM1MiArIGpdID0gRFsxNDJdW2pdO31cbkRbMTQzXSA9IFwi77+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+95a6X5bCx5bee5L+u5oSB5ou+5rSy56eA56eL57WC57mN57+S6Iet6Iif6JKQ6KGG6KWy6K6Q6Lm06Lyv6YCx6YWL6YWs6ZuG6Yac5LuA5L2P5YWF5Y2B5b6T5oiO5p+U5rGB5riL542j57im6YeN6YqD5Y+U5aSZ5a6/5reR56Wd57iu57Kb5aG+54af5Ye66KGT6L+w5L+K5bO75pil556s56uj6Iic6ae/5YeG5b6q5pes5qWv5q6J5rez77+95rqW5r2k55u+57SU5beh6YG16YaH6aCG5Yem5Yid5omA5pqR5puZ5ria5bq257eS572y5pu46Jav6Je36Ku45Yqp5Y+Z5aWz5bqP5b6Q5oGV6Yuk6Zmk5YK35YSf5Yud5Yyg5Y2H5Y+s5ZOo5ZWG5ZSx5ZiX5aWo5aa+5ai85a615bCG5bCP5bCR5bCa5bqE5bqK5bug5b2w5om/5oqE5oub5o6M5o235piH5piM5pit5pm25p2+5qKi5qif5qi15rK85raI5riJ5rmY54S854Sm54Wn55eH55yB56Gd56SB56Wl56ew56ug56yR57Kn57S56IKW6I+W6JKL6JWJ6KGd6KOz6Kif6Ki86KmU6Kmz6LGh6LOe6Yak6Ymm6Y2+6ZCY6Zqc6Z6Y5LiK5LiI5Lie5LmX5YaX5Ymw5Z+O5aC05aOM5ayi5bi45oOF5pO+5p2h5p2W5rWE54q255Wz56mj6JK46K2y6Ya46Yyg5Zix5Z+06aO+77+977+977+9XCIuc3BsaXQoXCJcIik7XG5mb3IoaiA9IDA7IGogIT0gRFsxNDNdLmxlbmd0aDsgKytqKSBpZihEWzE0M11bal0uY2hhckNvZGVBdCgwKSAhPT0gMHhGRkZEKSB7IGVbRFsxNDNdW2pdXSA9IDM2NjA4ICsgajsgZFszNjYwOCArIGpdID0gRFsxNDNdW2pdO31cbkRbMTQ0XSA9IFwi77+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+95out5qSN5q6W54et57mU6IG36Imy6Kem6aOf6J2V6L6x5bC75Ly45L+h5L615ZSH5aig5a+d5a+p5b+D5oWO5oyv5paw5pmL5qOu5qab5rW45rex55Sz55a555yf56We56em57Sz6Iej6Iqv6Jaq6Kaq6Ki66Lqr6L6b6YCy6Yed6ZyH5Lq65LuB5YiD5aG15aOs5bCL55Sa5bC96IWO6KiK6L+F6Zmj6Z2t56yl6KuP6aCI6YWi5Zuz5Y6o77+96YCX5ZC55Z6C5bil5o6o5rC054KK552h57KL57+g6KGw6YGC6YWU6YyQ6YyY6ZqP55Ge6auE5bSH5bWp5pWw5p6i6Lao6Zub5o2u5p2J5qSZ6I+F6aCX6ZuA6KO+5r6E5pG65a+45LiW54Cs55Wd5piv5YeE5Yi25Yui5aeT5b6B5oCn5oiQ5pS/5pW05pif5pm05qOy5qCW5q2j5riF54my55Sf55ub57K+6IGW5aOw6KO96KW/6Kqg6KqT6KuL6YCd6YaS6Z2S6Z2Z5paJ56iO6ISG6Zq75bit5oOc5oia5pal5piU5p6Q55+z56mN57GN57i+6ISK6LKs6LWk6Leh6Lmf56Kp5YiH5ouZ5o6l5pGC5oqY6Kit56qD56+A6Kqs6Zuq57W26IiM6J2J5LuZ5YWI5Y2D5Y2g5a6j5bCC5bCW5bed5oim5omH5pKw5qCT5qC05rOJ5rWF5rSX5p+T5r2c54WO54W95peL56m/566t57ea77+977+977+9XCIuc3BsaXQoXCJcIik7XG5mb3IoaiA9IDA7IGogIT0gRFsxNDRdLmxlbmd0aDsgKytqKSBpZihEWzE0NF1bal0uY2hhckNvZGVBdCgwKSAhPT0gMHhGRkZEKSB7IGVbRFsxNDRdW2pdXSA9IDM2ODY0ICsgajsgZFszNjg2NCArIGpdID0gRFsxNDRdW2pdO31cbkRbMTQ1XSA9IFwi77+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+957mK576o6IW66Iib6Ii56Jam6Kmu6LOO6Le16YG46YG36Yqt6YqR6ZaD6a6u5YmN5ZaE5ry454S25YWo56aF57mV6Iaz57OO5ZmM5aGR5bKo5o6q5pu+5pu95qWa54uZ55aP55aO56SO56WW56ef57KX57Sg57WE6JiH6Ki06Zi76YGh6byg5YOn5Ym15Y+M5Y+i5YCJ5Zaq5aOu5aWP54i95a6L5bGk5Yyd5oOj5oOz5o2c5o6D5oy/5o6777+95pON5pep5pu55bej5qeN5qe95ryV54el5LqJ55ep55u456qT57Of57eP57ac6IGh6I2J6I2Y6JGs6JK86Je76KOF6LWw6YCB6YGt6Y6X6Zyc6aiS5YOP5aKX5oaO6IeT6JS16LSI6YCg5L+D5YG05YmH5Y2z5oGv5o2J5p2f5ris6Laz6YCf5L+X5bGe6LOK5peP57aa5Y2S6KKW5YW25o+D5a2Y5a2r5bCK5pCN5p2R6YGc5LuW5aSa5aSq5rGw6KmR5ZS+5aCV5aal5oOw5omT5p+B6Ii15qWV6ZmA6aeE6aio5L2T5aCG5a++6ICQ5bKx5biv5b6F5oCg5oWL5oi05pu/5rOw5rue6IOO6IW/6IuU6KKL6LK46YCA6YCu6ZqK6bub6a+b5Luj5Y+w5aSn56ys6YaN6aGM6be55rud54Cn5Y2T5ZWE5a6F5omY5oqe5ouT5rKi5r+v55Ci6KiX6ZC45r+B6Ku+6Iy45Yen6Ju45Y+q77+977+977+9XCIuc3BsaXQoXCJcIik7XG5mb3IoaiA9IDA7IGogIT0gRFsxNDVdLmxlbmd0aDsgKytqKSBpZihEWzE0NV1bal0uY2hhckNvZGVBdCgwKSAhPT0gMHhGRkZEKSB7IGVbRFsxNDVdW2pdXSA9IDM3MTIwICsgajsgZFszNzEyMCArIGpdID0gRFsxNDVdW2pdO31cbkRbMTQ2XSA9IFwi77+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+95Y+p5L2G6YGU6L6w5aWq6ISx5be956uq6L6/5qOa6LC354u46bGI5qi96Kqw5Li55Y2Y5ZiG5Z2m5ouF5o6i5pem5q2O5reh5rmb54Kt55+t56uv566q57a76IC96IOG6JuL6KqV6Y2b5Zuj5aOH5by+5pat5pqW5qqA5q6155S36KuH5YCk55+l5Zyw5byb5oGl5pm65rGg55e056ia572u6Ie06JyY6YGF6aaz56+J55Wc56u5562R6JOE77+96YCQ56ep56qS6Iy25auh552A5Lit5Luy5a6Z5b+g5oq95pi85p+x5rOo6Jmr6KG36Ki76YWO6Yuz6aeQ5qiX54Cm54yq6Iun6JGX6LKv5LiB5YWG5YeL5ZaL5a+15biW5biz5bqB5byU5by15b2r5b605oey5oyR5pqi5pyd5r2u54mS55S655y66IG06IS56IW46J226Kq/6Kuc6LaF6Lez6Yqa6ZW36aCC6bOl5YuF5o2X55u05pyV5rKI54+N6LOD6Y6u6Zmz5rSl5aKc5qSO5qeM6L+96Y6a55eb6YCa5aGa5qCC5o605qe75L2D5rys5p+Y6L676JSm57a06Y2U5qS/5r2w5Z2q5aO35ays57Ss54iq5ZCK6Yej6ba05Lqt5L2O5YGc5YG15YmD6LKe5ZGI5aCk5a6a5bid5bqV5bqt5bu35byf5oKM5oq15oy65o+Q5qKv5rGA56KH56aO56iL57eg6ImH6KiC6Kum6LmE6YCT77+977+977+9XCIuc3BsaXQoXCJcIik7XG5mb3IoaiA9IDA7IGogIT0gRFsxNDZdLmxlbmd0aDsgKytqKSBpZihEWzE0Nl1bal0uY2hhckNvZGVBdCgwKSAhPT0gMHhGRkZEKSB7IGVbRFsxNDZdW2pdXSA9IDM3Mzc2ICsgajsgZFszNzM3NiArIGpdID0gRFsxNDZdW2pdO31cbkRbMTQ3XSA9IFwi77+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+96YK46YSt6YeY6byO5rOl5pGY5pOi5pW15ru055qE56yb6YGp6Y+R5rq65ZOy5b655pKk6L2N6L+t6YmE5YW45aGr5aSp5bGV5bqX5re757qP55Sc6LK86Lui6aGb54K55Lyd5q6/5r6x55Sw6Zu75YWO5ZCQ5aC15aGX5aas5bGg5b6S5paX5p2c5rih55m76I+f6LOt6YCU6YO96Y2N56Cl56C65Yqq5bqm5Zyf5aW05oCS5YCS5YWa5Yas77+95YeN5YiA5ZSQ5aGU5aGY5aWX5a6V5bO25baL5oK85oqV5pCt5p2x5qGD5qK85qOf55uX5reY5rmv5rab54Gv54eI5b2T55eY56W3562J562U562S57OW57Wx5Yiw6JGj6JWp6Jek6KiO6KyE6LGG6LiP6YCD6YCP6ZCZ6Zm26aCt6aiw6ZeY5YON5YuV5ZCM5aCC5bCO5oan5pKe5rSe556z56ul6IO06JCE6YGT6YqF5bOg6bSH5Yy/5b6X5b6z5rac54m5552j56a/56+k5q+S54us6Kqt5qCD5qmh5Ye456qB5qS05bGK6bO26Iur5a+F6YWJ54Ce5Zm45bGv5oOH5pWm5rKM6LGa6YGB6aCT5ZGR5puH6YiN5aWI6YKj5YaF5LmN5Yeq6JaZ6KyO54GY5o266Y2L5qWi6aa057iE55W35Y2X5qWg6Luf6Zuj5rGd5LqM5bC85byQ6L+p5YyC6LOR6IKJ6Jm55bu/5pel5Lmz5YWl77+977+977+9XCIuc3BsaXQoXCJcIik7XG5mb3IoaiA9IDA7IGogIT0gRFsxNDddLmxlbmd0aDsgKytqKSBpZihEWzE0N11bal0uY2hhckNvZGVBdCgwKSAhPT0gMHhGRkZEKSB7IGVbRFsxNDddW2pdXSA9IDM3NjMyICsgajsgZFszNzYzMiArIGpdID0gRFsxNDddW2pdO31cbkRbMTQ4XSA9IFwi77+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+95aaC5bC/6Z+u5Lu75aaK5b+N6KqN5r+h56aw56Wi5a+n6JGx54yr54ax5bm05b+15o275pKa54eD57KY5LmD5bu85LmL5Z+c5Zqi5oKp5r+D57SN6IO96ISz6Ia/6L6y6KaX6Jqk5be05oqK5pKt6KaH5p235rOi5rS+55C256C05amG57216Iqt6aas5L+z5buD5oud5o6S5pWX5p2v55uD54mM6IOM6IK66Lyp6YWN5YCN5Z+55aqS5qKF77+95qWz54Wk54u96LK35aOy6LOg6Zmq6YCZ6J2/56ek55+n6JCp5Lyv5Yml5Y2a5ouN5p+P5rOK55m9566U57KV6Ii26JaE6L+r5pud5ryg54iG57ib6I6r6aeB6bqm5Ye9566x56Gy56646IKH562I5quo5bmh6IKM55WR55Wg5YWr6Ymi5rqM55m66YaX6auq5LyQ572w5oqc562P6Zal6bOp5Zm65aGZ6Juk6Zq85Ly05Yik5Y2K5Y+N5Y+b5biG5pCs5paR5p2/5rC+5rGO54mI54qv54+t55WU57mB6Iis6Jep6LKp56+E6YeG54Wp6aCS6aOv5oy95pmp55Wq55uk56OQ6JWD6Juu5Yyq5Y2R5ZCm5aaD5bqH5b285oKy5omJ5om55oqr5paQ5q+U5rOM55ay55qu56KR56eY57eL57236IKl6KKr6Kq56LK76YG/6Z2e6aOb5qiL57C45YKZ5bC+5b6u5p6H5q+Y55C155yJ576O77+977+977+9XCIuc3BsaXQoXCJcIik7XG5mb3IoaiA9IDA7IGogIT0gRFsxNDhdLmxlbmd0aDsgKytqKSBpZihEWzE0OF1bal0uY2hhckNvZGVBdCgwKSAhPT0gMHhGRkZEKSB7IGVbRFsxNDhdW2pdXSA9IDM3ODg4ICsgajsgZFszNzg4OCArIGpdID0gRFsxNDhdW2pdO31cbkRbMTQ5XSA9IFwi77+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+96by75p+K56iX5Yy555aL6aut5b2m6Iad6I+x6IKY5by85b+F55Wi562G6YC85qGn5aer5aqb57SQ55m+6Kys5L+15b2q5qiZ5rC35ryC55Oi56Wo6KGo6KmV6LG55buf5o+P55eF56eS6IuX6Yyo6Yuy6JKc6Jut6bCt5ZOB5b2s5paM5rWc54CV6LKn6LOT6aC75pWP55O25LiN5LuY5Z+g5aSr5amm5a+M5Yao5biD5bqc5oCW5om25pW377+95pan5pmu5rWu54i256ym6IWQ6Iaa6IqZ6K2c6LKg6LOm6LW06Zic6ZmE5L6u5pKr5q2m6Iie6JGh6JWq6YOo5bCB5qWT6aKo6JG66JWX5LyP5Ymv5b6p5bmF5pyN56aP6IW56KSH6KaG5re15byX5omV5rK45LuP54mp6a6S5YiG5ZC75Zm05aKz5oak5omu54Sa5aWu57KJ57Oe57Sb6Zuw5paH6IGe5LiZ5L215YW15aGA5bmj5bmz5byK5p+E5Lim6JS96ZaJ6Zmb57Gz6aCB5YO75aOB55mW56Kn5Yil556l6JSR566G5YGP5aSJ54mH56+H57eo6L666L+U6YGN5L6/5YuJ5aip5byB6Z6t5L+d6IiX6Yuq5ZyD5o2V5q2p55Sr6KOc6LyU56mC5Yuf5aKT5oWV5oiK5pqu5q+N57C/6I+p5YCj5L+45YyF5ZGG5aCx5aWJ5a6d5bOw5bOv5bSp5bqW5oqx5o2n5pS+5pa55pyL77+977+977+9XCIuc3BsaXQoXCJcIik7XG5mb3IoaiA9IDA7IGogIT0gRFsxNDldLmxlbmd0aDsgKytqKSBpZihEWzE0OV1bal0uY2hhckNvZGVBdCgwKSAhPT0gMHhGRkZEKSB7IGVbRFsxNDldW2pdXSA9IDM4MTQ0ICsgajsgZFszODE0NCArIGpdID0gRFsxNDldW2pdO31cbkRbMTUwXSA9IFwi77+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+95rOV5rOh54O556Cy57ir6IOe6Iqz6JCM6JOs6JyC6KSS6Kiq6LGK6YKm6YuS6aO96bOz6bWs5LmP5Lqh5YKN5YmW5Z2K5aao5bi95b+Y5b+Z5oi/5pq05pyb5p+Q5qOS5YaS57Sh6IKq6Iao6KyA6LKM6LK/6Ym+6Ziy5ZCg6aCs5YyX5YOV5Y2c5aKo5pKy5py054mn552m56mG6Yem5YuD5rKh5q6G5aCA5bmM5aWU5pys57+75Yeh55uG77+95pGp56Oo6a2U6bq75Z+L5aa55pin5p6a5q+O5ZOp5qeZ5bmV6Iac5p6V6a6q5p++6bGS5qGd5Lqm5L+j5Y+I5oq55pyr5rKr6L+E5L6t57mt6bq/5LiH5oWi5rqA5ryr6JST5ZGz5pyq6a2F5bez566V5bKs5a+G6Jyc5rmK6JOR56iU6ISI5aaZ57KN5rCR55yg5YuZ5aSi54Sh54mf55+b6Zyn6bWh5qSL5am/5aiY5Yal5ZCN5ZG95piO55uf6L+36YqY6bO05aeq54md5ruF5YWN5qOJ57a/57es6Z2i6bq65pG45qih6IyC5aaE5a2f5q+b54yb55uy57ay6ICX6JKZ5YSy5pyo6buZ55uu5p2i5Yu/6aSF5bCk5oi757G+6LKw5ZWP5oK257SL6ZaA5YyB5Lmf5Ya25aSc54i66IC26YeO5byl55+i5Y6E5b2557SE6Jas6Kiz6LqN6Z2W5p+z6Jau6ZGT5oSJ5oSI5rK555mS77+977+977+9XCIuc3BsaXQoXCJcIik7XG5mb3IoaiA9IDA7IGogIT0gRFsxNTBdLmxlbmd0aDsgKytqKSBpZihEWzE1MF1bal0uY2hhckNvZGVBdCgwKSAhPT0gMHhGRkZEKSB7IGVbRFsxNTBdW2pdXSA9IDM4NDAwICsgajsgZFszODQwMCArIGpdID0gRFsxNTBdW2pdO31cbkRbMTUxXSA9IFwi77+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+96Kut6Ly45ZSv5L2R5YSq5YuH5Y+L5a6l5bm95oKg5oaC5o+W5pyJ5p+a5rmn5raM54y254y355Sx56WQ6KOV6KqY6YGK6YKR6YO16ZuE6J6N5aSV5LqI5L2Z5LiO6KqJ6Ly/6aCQ5YKt5bm85aaW5a655bq45o+a5o+65pOB5puc5qWK5qeY5rSL5rq254aU55So56qv576K6ICA6JGJ6JOJ6KaB6Kyh6LiK6YGl6Zm96aSK5oW+5oqR5qyy77+95rKD5rW057+M57+85reA576F6J666KO45p2l6I6x6aC86Zu35rSb57Wh6JC96YWq5Lmx5Y215bWQ5qyE5r+r6JeN6Jit6Kan5Yip5ZCP5bGl5p2O5qKo55CG55KD55ei6KOP6KOh6YeM6Zui6Zm45b6L546H56uL6JGO5o6g55Wl5YqJ5rWB5rqc55CJ55WZ56Gr57KS6ZqG56uc6b6N5L625oWu5peF6Jmc5LqG5Lqu5YOa5Lih5YeM5a+u5paZ5qKB5ra854yf55mC556t56ic57On6Imv6KuS6YG86YeP6Zm16aCY5Yqb57eR5YCr5Y6Y5p6X5reL54eQ55Cz6Ieo6Lyq6Zqj6bGX6bqf55Gg5aGB5raZ57Sv6aGe5Luk5Ly25L6L5Ya35Yqx5ba65oCc546y56S86IuT6Yi06Zq36Zu26ZyK6bqX6b2i5pqm5q205YiX5Yqj54OI6KOC5buJ5oGL5oaQ5ryj54WJ57C+57e06IGv77+977+977+9XCIuc3BsaXQoXCJcIik7XG5mb3IoaiA9IDA7IGogIT0gRFsxNTFdLmxlbmd0aDsgKytqKSBpZihEWzE1MV1bal0uY2hhckNvZGVBdCgwKSAhPT0gMHhGRkZEKSB7IGVbRFsxNTFdW2pdXSA9IDM4NjU2ICsgajsgZFszODY1NiArIGpdID0gRFsxNTFdW2pdO31cbkRbMTUyXSA9IFwi77+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+96JOu6YCj6Yys5ZGC6a2v5quT54KJ6LOC6Lev6Zyy5Yq05amB5buK5byE5pyX5qW85qaU5rWq5ryP54mi54u856+t6ICB6IG+6J2L6YOO5YWt6bqT56aE6IKL6Yyy6KuW5YCt5ZKM6Kmx5q2q6LOE6ISH5oOR5p6g6bey5LqZ5LqY6bCQ6Kmr6JeB6JWo5qSA5rm+56KX6IWV77+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+95byM5LiQ5LiV5Liq5Lix5Li25Li85Li/5LmC5LmW5LmY5LqC5LqF6LGr5LqK6IiS5byN5LqO5Lqe5Lqf5Lqg5Lqi5Lqw5Lqz5Lq25LuO5LuN5LuE5LuG5LuC5LuX5Lue5Lut5Luf5Lu35LyJ5L2a5Lyw5L2b5L2d5L2X5L2H5L225L6I5L6P5L6Y5L275L2p5L2w5L6R5L2v5L6G5L6W5YSY5L+U5L+f5L+O5L+Y5L+b5L+R5L+a5L+Q5L+k5L+l5YCa5YCo5YCU5YCq5YCl5YCF5Lyc5L+25YCh5YCp5YCs5L++5L+v5YCR5YCG5YGD5YGH5pyD5YGV5YGQ5YGI5YGa5YGW5YGs5YG45YKA5YKa5YKF5YK05YKy77+977+977+9XCIuc3BsaXQoXCJcIik7XG5mb3IoaiA9IDA7IGogIT0gRFsxNTJdLmxlbmd0aDsgKytqKSBpZihEWzE1Ml1bal0uY2hhckNvZGVBdCgwKSAhPT0gMHhGRkZEKSB7IGVbRFsxNTJdW2pdXSA9IDM4OTEyICsgajsgZFszODkxMiArIGpdID0gRFsxNTJdW2pdO31cbkRbMTUzXSA9IFwi77+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+95YOJ5YOK5YKz5YOC5YOW5YOe5YOl5YOt5YOj5YOu5YO55YO15YSJ5YSB5YSC5YSW5YSV5YSU5YSa5YSh5YS65YS35YS85YS75YS/5YWA5YWS5YWM5YWU5YWi56u45YWp5YWq5YWu5YaA5YaC5ZuY5YaM5YaJ5YaP5YaR5YaT5YaV5YaW5Yak5Yam5Yai5Yap5Yaq5Yar5Yaz5Yax5Yay5Yaw5Ya15Ya95YeF5YeJ5Yeb5Yeg6JmV5Yep5Yet77+95Yew5Ye15Ye+5YiE5YiL5YiU5YiO5Yin5Yiq5Yiu5Yiz5Yi55YmP5YmE5YmL5YmM5Yme5YmU5Ymq5Ym05Ymp5Ymz5Ym/5Ym95YqN5YqU5YqS5Ymx5YqI5YqR6L6o6L6n5Yqs5Yqt5Yq85Yq15YuB5YuN5YuX5Yue5Yuj5Yum6aOt5Yug5Yuz5Yu15Yu45Yu55YyG5YyI55S45YyN5YyQ5YyP5YyV5Yya5Yyj5Yyv5Yyx5Yyz5Yy45Y2A5Y2G5Y2F5LiX5Y2J5Y2N5YeW5Y2e5Y2p5Y2u5aSY5Y275Y235Y6C5Y6W5Y6g5Y6m5Y6l5Y6u5Y6w5Y625Y+D57CS6ZuZ5Y+f5pu854eu5Y+u5Y+o5Y+t5Y+65ZCB5ZC95ZGA5ZCs5ZCt5ZC85ZCu5ZC25ZCp5ZCd5ZGO5ZKP5ZG15ZKO5ZGf5ZGx5ZG35ZGw5ZKS5ZG75ZKA5ZG25ZKE5ZKQ5ZKG5ZOH5ZKi5ZK45ZKl5ZKs5ZOE5ZOI5ZKo77+977+977+9XCIuc3BsaXQoXCJcIik7XG5mb3IoaiA9IDA7IGogIT0gRFsxNTNdLmxlbmd0aDsgKytqKSBpZihEWzE1M11bal0uY2hhckNvZGVBdCgwKSAhPT0gMHhGRkZEKSB7IGVbRFsxNTNdW2pdXSA9IDM5MTY4ICsgajsgZFszOTE2OCArIGpdID0gRFsxNTNdW2pdO31cbkRbMTU0XSA9IFwi77+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+95ZKr5ZOC5ZKk5ZK+5ZK85ZOY5ZOl5ZOm5ZSP5ZSU5ZO95ZOu5ZOt5ZO65ZOi5ZS55ZWA5ZWj5ZWM5ZSu5ZWc5ZWF5ZWW5ZWX5ZS45ZSz5ZWd5ZaZ5ZaA5ZKv5ZaK5Zaf5ZW75ZW+5ZaY5Zae5Zau5ZW85ZaD5Zap5ZaH5Zao5Zea5ZeF5Zef5ZeE5Zec5Zek5ZeU5ZiU5Ze35ZiW5Ze+5Ze95Zib5Ze55ZmO5ZmQ54ef5Zi05Zi25Ziy5Zi477+95Zmr5Zmk5Ziv5Zms5Zmq5ZqG5ZqA5ZqK5Zqg5ZqU5ZqP5Zql5Zqu5Zq25Zq05ZuC5Zq85ZuB5ZuD5ZuA5ZuI5ZuO5ZuR5ZuT5ZuX5Zuu5Zu55ZyA5Zu/5ZyE5ZyJ5ZyI5ZyL5ZyN5ZyT5ZyY5ZyW5ZeH5Zyc5Zym5Zy35Zy45Z2O5Zy75Z2A5Z2P5Z2p5Z+A5Z6I5Z2h5Z2/5Z6J5Z6T5Z6g5Z6z5Z6k5Z6q5Z6w5Z+D5Z+G5Z+U5Z+S5Z+T5aCK5Z+W5Z+j5aCL5aCZ5aCd5aGy5aCh5aGi5aGL5aGw5q+A5aGS5aC95aG55aKF5aK55aKf5aKr5aK65aOe5aK75aK45aKu5aOF5aOT5aOR5aOX5aOZ5aOY5aOl5aOc5aOk5aOf5aOv5aO65aO55aO75aO85aO95aSC5aSK5aSQ5aSb5qKm5aSl5aSs5aSt5aSy5aS45aS+56uS5aWV5aWQ5aWO5aWa5aWY5aWi5aWg5aWn5aWs5aWp77+977+977+9XCIuc3BsaXQoXCJcIik7XG5mb3IoaiA9IDA7IGogIT0gRFsxNTRdLmxlbmd0aDsgKytqKSBpZihEWzE1NF1bal0uY2hhckNvZGVBdCgwKSAhPT0gMHhGRkZEKSB7IGVbRFsxNTRdW2pdXSA9IDM5NDI0ICsgajsgZFszOTQyNCArIGpdID0gRFsxNTRdW2pdO31cbkRbMTU1XSA9IFwi77+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+95aW45aaB5aad5L2e5L6r5aaj5aay5aeG5aeo5aec5aaN5aeZ5aea5ail5aif5aiR5aic5aiJ5aia5amA5ams5amJ5ai15ai25ami5amq5aqa5aq85aq+5auL5auC5aq95auj5auX5aum5aup5auW5au65au75ayM5ayL5ayW5ayy5auQ5ayq5ay25ay+5a2D5a2F5a2A5a2R5a2V5a2a5a2b5a2l5a2p5a2w5a2z5a215a245paI5a265a6A77+95a6D5a6m5a645a+D5a+H5a+J5a+U5a+Q5a+k5a+m5a+i5a+e5a+l5a+r5a+w5a+25a+z5bCF5bCH5bCI5bCN5bCT5bCg5bCi5bCo5bC45bC55bGB5bGG5bGO5bGT5bGQ5bGP5a2x5bGs5bGu5Lmi5bG25bG55bKM5bKR5bKU5aab5bKr5bK75bK25bK85bK35bOF5bK+5bOH5bOZ5bOp5bO95bO65bOt5baM5bOq5bSL5bSV5bSX5bWc5bSf5bSb5bSR5bSU5bSi5bSa5bSZ5bSY5bWM5bWS5bWO5bWL5bWs5bWz5bW25baH5baE5baC5bai5bad5bas5bau5ba95baQ5ba35ba85beJ5beN5beT5beS5beW5beb5ber5bey5be15biL5bia5biZ5biR5bib5bi25bi35bmE5bmD5bmA5bmO5bmX5bmU5bmf5bmi5bmk5bmH5bm15bm25bm66bq85bm/5bqg5buB5buC5buI5buQ5buP77+977+977+9XCIuc3BsaXQoXCJcIik7XG5mb3IoaiA9IDA7IGogIT0gRFsxNTVdLmxlbmd0aDsgKytqKSBpZihEWzE1NV1bal0uY2hhckNvZGVBdCgwKSAhPT0gMHhGRkZEKSB7IGVbRFsxNTVdW2pdXSA9IDM5NjgwICsgajsgZFszOTY4MCArIGpdID0gRFsxNTVdW2pdO31cbkRbMTU2XSA9IFwi77+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+95buW5buj5bud5bua5bub5bui5buh5buo5bup5bus5bux5buz5buw5bu05bu45bu+5byD5byJ5b2d5b2c5byL5byR5byW5byp5byt5by45b2B5b2I5b2M5b2O5byv5b2R5b2W5b2X5b2Z5b2h5b2t5b2z5b235b6D5b6C5b2/5b6K5b6I5b6R5b6H5b6e5b6Z5b6Y5b6g5b6o5b6t5b685b+W5b+75b+k5b+45b+x5b+d5oKz5b+/5oCh5oGg77+95oCZ5oCQ5oCp5oCO5oCx5oCb5oCV5oCr5oCm5oCP5oC65oGa5oGB5oGq5oG35oGf5oGK5oGG5oGN5oGj5oGD5oGk5oGC5oGs5oGr5oGZ5oKB5oKN5oOn5oKD5oKa5oKE5oKb5oKW5oKX5oKS5oKn5oKL5oOh5oK45oOg5oOT5oK05b+w5oK95oOG5oK15oOY5oWN5oSV5oSG5oO25oO35oSA5oO05oO65oSD5oSh5oO75oOx5oSN5oSO5oWH5oS+5oSo5oSn5oWK5oS/5oS85oSs5oS05oS95oWC5oWE5oWz5oW35oWY5oWZ5oWa5oWr5oW05oWv5oWl5oWx5oWf5oWd5oWT5oW15oaZ5oaW5oaH5oas5oaU5oaa5oaK5oaR5oar5oau5oeM5oeK5oeJ5oe35oeI5oeD5oeG5oa65oeL57255oeN5oem5oej5oe25oe65oe05oe/5oe95oe85oe+5oiA5oiI5oiJ5oiN5oiM5oiU5oib77+977+977+9XCIuc3BsaXQoXCJcIik7XG5mb3IoaiA9IDA7IGogIT0gRFsxNTZdLmxlbmd0aDsgKytqKSBpZihEWzE1Nl1bal0uY2hhckNvZGVBdCgwKSAhPT0gMHhGRkZEKSB7IGVbRFsxNTZdW2pdXSA9IDM5OTM2ICsgajsgZFszOTkzNiArIGpdID0gRFsxNTZdW2pdO31cbkRbMTU3XSA9IFwi77+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+95oie5oih5oiq5oiu5oiw5oiy5oiz5omB5omO5ome5omj5omb5omg5omo5om85oqC5oqJ5om+5oqS5oqT5oqW5ouU5oqD5oqU5ouX5ouR5oq75ouP5ou/5ouG5pOU5ouI5ouc5ouM5ouK5ouC5ouH5oqb5ouJ5oyM5ouu5oux5oyn5oyC5oyI5ouv5ou15o2Q5oy+5o2N5pCc5o2P5o6W5o6O5o6A5o6r5o225o6j5o6P5o6J5o6f5o615o2r77+95o2p5o6+5o+p5o+A5o+G5o+j5o+J5o+S5o+25o+E5pCW5pC05pCG5pCT5pCm5pC25pSd5pCX5pCo5pCP5pGn5pGv5pG25pGO5pSq5pKV5pKT5pKl5pKp5pKI5pK85pOa5pOS5pOF5pOH5pK75pOY5pOC5pOx5pOn6IiJ5pOg5pOh5oqs5pOj5pOv5pSs5pO25pO05pOy5pO65pSA5pO95pSY5pSc5pSF5pSk5pSj5pSr5pS05pS15pS35pS25pS455WL5pWI5pWW5pWV5pWN5pWY5pWe5pWd5pWy5pW45paC5paD6K6K5pab5paf5par5pa35peD5peG5peB5peE5peM5peS5peb5peZ5peg5peh5pex5p2y5piK5piD5pe75p2z5pi15pi25pi05pic5pmP5pmE5pmJ5pmB5pme5pmd5pmk5pmn5pmo5pmf5pmi5pmw5pqD5pqI5pqO5pqJ5pqE5pqY5pqd5puB5pq55puJ5pq+5pq877+977+977+9XCIuc3BsaXQoXCJcIik7XG5mb3IoaiA9IDA7IGogIT0gRFsxNTddLmxlbmd0aDsgKytqKSBpZihEWzE1N11bal0uY2hhckNvZGVBdCgwKSAhPT0gMHhGRkZEKSB7IGVbRFsxNTddW2pdXSA9IDQwMTkyICsgajsgZFs0MDE5MiArIGpdID0gRFsxNTddW2pdO31cbkRbMTU4XSA9IFwi77+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+95puE5pq45puW5pua5pug5pi/5pum5pup5puw5pu15pu35pyP5pyW5pye5pym5pyn6Zy45pyu5py/5py25p2B5py45py35p2G5p2e5p2g5p2Z5p2j5p2k5p6J5p2w5p6p5p285p2q5p6M5p6L5p6m5p6h5p6F5p635p+v5p605p+s5p6z5p+p5p645p+k5p+e5p+d5p+i5p+u5p655p+O5p+G5p+n5qqc5qCe5qGG5qCp5qGA5qGN5qCy5qGO77+95qKz5qCr5qGZ5qGj5qG35qG/5qKf5qKP5qKt5qKU5qKd5qKb5qKD5qqu5qK55qG05qK15qKg5qK65qSP5qKN5qG+5qSB5qOK5qSI5qOY5qSi5qSm5qOh5qSM5qON5qOU5qOn5qOV5qS25qSS5qSE5qOX5qOj5qSl5qO55qOg5qOv5qSo5qSq5qSa5qSj5qSh5qOG5qW55qW35qWc5qW45qWr5qWU5qW+5qWu5qS55qW05qS95qWZ5qSw5qWh5qWe5qWd5qaB5qWq5qay5qau5qeQ5qa/5qeB5qeT5qa+5qeO5a+o5qeK5qed5qa75qeD5qan5qiu5qaR5qag5qac5qaV5qa05qee5qeo5qiC5qib5qe/5qyK5qe55qey5qen5qiF5qax5qie5qet5qiU5qer5qiK5qiS5quB5qij5qiT5qmE5qiM5qmy5qi25qm45qmH5qmi5qmZ5qmm5qmI5qi45qii5qqQ5qqN5qqg5qqE5qqi5qqj77+977+977+9XCIuc3BsaXQoXCJcIik7XG5mb3IoaiA9IDA7IGogIT0gRFsxNThdLmxlbmd0aDsgKytqKSBpZihEWzE1OF1bal0uY2hhckNvZGVBdCgwKSAhPT0gMHhGRkZEKSB7IGVbRFsxNThdW2pdXSA9IDQwNDQ4ICsgajsgZFs0MDQ0OCArIGpdID0gRFsxNThdW2pdO31cbkRbMTU5XSA9IFwi77+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+95qqX6JiX5qq75quD5quC5qq45qqz5qqs5que5quR5quf5qqq5qua5quq5qu75qyF6JiW5qu65qyS5qyW6ayx5qyf5qy45qy355uc5qy56aOu5q2H5q2D5q2J5q2Q5q2Z5q2U5q2b5q2f5q2h5q245q255q2/5q6A5q6E5q6D5q6N5q6Y5q6V5q6e5q6k5q6q5q6r5q6v5q6y5q6x5q6z5q635q685q+G5q+L5q+T5q+f5q+s5q+r5q+z5q+v77+96bq+5rCI5rCT5rCU5rCb5rCk5rCj5rGe5rGV5rGi5rGq5rKC5rKN5rKa5rKB5rKb5rG+5rGo5rGz5rKS5rKQ5rOE5rOx5rOT5rK95rOX5rOF5rOd5rKu5rKx5rK+5rK65rOb5rOv5rOZ5rOq5rSf6KGN5rS25rSr5rS95rS45rSZ5rS15rSz5rSS5rSM5rWj5raT5rWk5rWa5rW55rWZ5raO5raV5r+k5raF5re55riV5riK5ra15reH5rem5ra45reG5res5ree5reM5reo5reS5reF5re65reZ5rek5reV5req5reu5rit5rmu5riu5riZ5rmy5rmf5ri+5rij5rmr5rir5rm25rmN5rif5rmD5ri65rmO5rik5ru/5rid5ri45rqC5rqq5rqY5ruJ5rq35ruT5rq95rqv5ruE5rqy5ruU5ruV5rqP5rql5ruC5rqf5r2B5ryR54GM5rus5ru45ru+5ry/5ruy5ryx5ruv5ryy5ruM77+977+977+9XCIuc3BsaXQoXCJcIik7XG5mb3IoaiA9IDA7IGogIT0gRFsxNTldLmxlbmd0aDsgKytqKSBpZihEWzE1OV1bal0uY2hhckNvZGVBdCgwKSAhPT0gMHhGRkZEKSB7IGVbRFsxNTldW2pdXSA9IDQwNzA0ICsgajsgZFs0MDcwNCArIGpdID0gRFsxNTldW2pdO31cbkRbMjI0XSA9IFwi77+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+95ry+5ryT5ru35r6G5r265r245r6B5r6A5r2v5r2b5r+z5r2t5r6C5r285r2Y5r6O5r6R5r+C5r2m5r6z5r6j5r6h5r6k5r655r+G5r6q5r+f5r+V5r+s5r+U5r+Y5r+x5r+u5r+b54CJ54CL5r+654CR54CB54CP5r++54Cb54Ca5r2054Cd54CY54Cf54Cw54C+54Cy54GR54Gj54KZ54KS54Kv54Ox54Ks54K454Kz54Ku54Of54OL54Od77+954OZ54SJ54O954Sc54SZ54Wl54WV54aI54Wm54Wi54WM54WW54Ws54aP54e754aE54aV54ao54as54eX54a554a+54eS54eJ54eU54eO54eg54es54en54e154e854e554e/54iN54iQ54ib54io54it54is54iw54iy54i754i854i/54mA54mG54mL54mY54m054m+54qC54qB54qH54qS54qW54qi54qn54q554qy54uD54uG54uE54uO54uS54ui54ug54uh54u554u35YCP54yX54yK54yc54yW54yd54y054yv54yp54yl54y+542O542P6buY542X542q542o542w542454215427542654+I546z54+O546754+A54+l54+u54+e55Ki55CF55Gv55Cl54+455Cy55C655GV55C/55Gf55GZ55GB55Gc55Gp55Gw55Gj55Gq55G255G+55KL55Ke55Kn55OK55OP55OU54+x77+977+977+9XCIuc3BsaXQoXCJcIik7XG5mb3IoaiA9IDA7IGogIT0gRFsyMjRdLmxlbmd0aDsgKytqKSBpZihEWzIyNF1bal0uY2hhckNvZGVBdCgwKSAhPT0gMHhGRkZEKSB7IGVbRFsyMjRdW2pdXSA9IDU3MzQ0ICsgajsgZFs1NzM0NCArIGpdID0gRFsyMjRdW2pdO31cbkRbMjI1XSA9IFwi77+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+955Og55Oj55On55Op55Ou55Oy55Ow55Ox55O455O355SE55SD55SF55SM55SO55SN55SV55ST55Se55Sm55Ss55S855WE55WN55WK55WJ55Wb55WG55Wa55Wp55Wk55Wn55Wr55Wt55W455W255aG55aH55W055aK55aJ55aC55aU55aa55ad55al55aj55eC55az55eD55a155a955a455a855ax55eN55eK55eS55eZ55ej55ee55e+55e/77+955e855iB55ew55e655ey55ez55iL55iN55iJ55if55in55ig55ih55ii55ik55i055iw55i755mH55mI55mG55mc55mY55mh55mi55mo55mp55mq55mn55ms55mw55my55m255m455m855qA55qD55qI55qL55qO55qW55qT55qZ55qa55qw55q055q455q555q655uC55uN55uW55uS55ue55uh55ul55un55uq6Jiv55u755yI55yH55yE55yp55yk55ye55yl55ym55yb55y355y4552H552a552o552r552b552l552/552+5525556O556L556R556g556e556w55625565556/55685569556755+H55+N55+X55+a55+c55+j55+u55+856CM56CS56Sm56Cg56Sq56GF56KO56G056KG56G856Ka56KM56Kj56K156Kq56Kv56OR56OG56OL56OU56K+56K856OF56OK56Os77+977+977+9XCIuc3BsaXQoXCJcIik7XG5mb3IoaiA9IDA7IGogIT0gRFsyMjVdLmxlbmd0aDsgKytqKSBpZihEWzIyNV1bal0uY2hhckNvZGVBdCgwKSAhPT0gMHhGRkZEKSB7IGVbRFsyMjVdW2pdXSA9IDU3NjAwICsgajsgZFs1NzYwMCArIGpdID0gRFsyMjVdW2pdO31cbkRbMjI2XSA9IFwi77+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+956On56Oa56O956O056SH56SS56SR56SZ56Ss56Sr56WA56Wg56WX56Wf56Wa56WV56WT56W656W/56aK56ad56an6b2L56aq56au56az56a556a656eJ56eV56en56es56eh56ej56iI56iN56iY56iZ56ig56if56aA56ix56i756i+56i356mD56mX56mJ56mh56mi56mp6b6d56mw56m556m956qI56qX56qV56qY56qW56qp56uI56qw77+956q256uF56uE56q/6YKD56uH56uK56uN56uP56uV56uT56uZ56ua56ud56uh56ui56um56ut56uw56yC56yP56yK56yG56yz56yY56yZ56ye56y156yo56y2562Q562656yE562N56yL562M562F5621562l5620562n562w562x562s562u566d566Y566f566N566c566a566L566S566P562d566Z56+L56+B56+M56+P566056+G56+d56+p57CR57CU56+m56+l57Gg57CA57CH57CT56+z56+357CX57CN56+257Cj57Cn57Cq57Cf57C357Cr57C957GM57GD57GU57GP57GA57GQ57GY57Gf57Gk57GW57Gl57Gs57G157KD57KQ57Kk57Kt57Ki57Kr57Kh57Ko57Kz57Ky57Kx57Ku57K557K957OA57OF57OC57OY57OS57Oc57Oi6ay757Ov57Oy57O057O257O657SG77+977+977+9XCIuc3BsaXQoXCJcIik7XG5mb3IoaiA9IDA7IGogIT0gRFsyMjZdLmxlbmd0aDsgKytqKSBpZihEWzIyNl1bal0uY2hhckNvZGVBdCgwKSAhPT0gMHhGRkZEKSB7IGVbRFsyMjZdW2pdXSA9IDU3ODU2ICsgajsgZFs1Nzg1NiArIGpdID0gRFsyMjZdW2pdO31cbkRbMjI3XSA9IFwi77+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+957SC57Sc57SV57SK57WF57WL57Su57Sy57S/57S157WG57Wz57WW57WO57Wy57Wo57Wu57WP57Wj57aT57aJ57Wb57aP57W957ab57a657au57aj57a157eH57a957ar57i957ai57av57ec57a457af57aw57eY57ed57ek57ee57e757ey57eh57iF57iK57ij57ih57iS57ix57if57iJ57iL57ii57mG57mm57i757i157i557mD57i377+957iy57i657mn57md57mW57me57mZ57ma57m557mq57mp57m857m757qD57eV57m96L6u57m/57qI57qJ57qM57qS57qQ57qT57qU57qW57qO57qb57qc57y457y6572F572M572N572O572Q572R572V572U572Y572f572g572o572p572n5724576C576G576D576I576H576M576U576e576d576a576j576v576y5765576u576257646K2x57+F57+G57+K57+V57+U57+h57+m57+p57+z57+56aOc6ICG6ICE6ICL6ICS6ICY6ICZ6ICc6ICh6ICo6IC/6IC76IGK6IGG6IGS6IGY6IGa6IGf6IGi6IGo6IGz6IGy6IGw6IG26IG56IG96IG/6IKE6IKG6IKF6IKb6IKT6IKa6IKt5YaQ6IKs6IOb6IOl6IOZ6IOd6IOE6IOa6IOW6ISJ6IOv6IOx6ISb6ISp6ISj6ISv6IWL77+977+977+9XCIuc3BsaXQoXCJcIik7XG5mb3IoaiA9IDA7IGogIT0gRFsyMjddLmxlbmd0aDsgKytqKSBpZihEWzIyN11bal0uY2hhckNvZGVBdCgwKSAhPT0gMHhGRkZEKSB7IGVbRFsyMjddW2pdXSA9IDU4MTEyICsgajsgZFs1ODExMiArIGpdID0gRFsyMjddW2pdO31cbkRbMjI4XSA9IFwi77+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+96ZqL6IWG6IS+6IWT6IWR6IO86IWx6IWu6IWl6IWm6IW06IaD6IaI6IaK6IaA6IaC6Iag6IaV6Iak6Iaj6IWf6IaT6Iap6Iaw6Ia16Ia+6Ia46Ia96IeA6IeC6Ia66IeJ6IeN6IeR6IeZ6IeY6IeI6Iea6Ief6Ieg6Ien6Ie66Ie76Ie+6IiB6IiC6IiF6IiH6IiK6IiN6IiQ6IiW6Iip6Iir6Ii46Iiz6ImA6ImZ6ImY6Imd6Ima6Imf6Imk77+96Imi6Imo6Imq6Imr6Iiu6Imx6Im36Im46Im+6IqN6IqS6Iqr6Iqf6Iq76Iqs6Iuh6Iuj6Iuf6IuS6Iu06Iuz6Iu66I6T6IyD6Iu76Iu56Iue6IyG6Iuc6IyJ6IuZ6Iy16Iy06IyW6Iyy6Iyx6I2A6Iy56I2Q6I2F6Iyv6Iyr6IyX6IyY6I6F6I6a6I6q6I6f6I6i6I6W6Iyj6I6O6I6H6I6K6I286I616I2z6I216I6g6I6J6I6o6I+06JCT6I+r6I+O6I+96JCD6I+Y6JCL6I+B6I+36JCH6I+g6I+y6JCN6JCi6JCg6I696JC46JSG6I+76JGt6JCq6JC86JWa6JKE6JG36JGr6JKt6JGu6JKC6JGp6JGG6JCs6JGv6JG56JC16JOK6JGi6JK56JK/6JKf6JOZ6JON6JK76JOa6JOQ6JOB6JOG6JOW6JKh6JSh6JO/6JO06JSX6JSY6JSs6JSf6JSV6JSU6JO86JWA6JWj6JWY6JWI77+977+977+9XCIuc3BsaXQoXCJcIik7XG5mb3IoaiA9IDA7IGogIT0gRFsyMjhdLmxlbmd0aDsgKytqKSBpZihEWzIyOF1bal0uY2hhckNvZGVBdCgwKSAhPT0gMHhGRkZEKSB7IGVbRFsyMjhdW2pdXSA9IDU4MzY4ICsgajsgZFs1ODM2OCArIGpdID0gRFsyMjhdW2pdO31cbkRbMjI5XSA9IFwi77+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+96JWB6JiC6JWL6JWV6JaA6Jak6JaI6JaR6JaK6Jao6JWt6JaU6Jab6Jeq6JaH6Jac6JW36JW+6JaQ6JeJ6Ja66JeP6Ja56JeQ6JeV6Jed6Jel6Jec6Je56JiK6JiT6JiL6Je+6Je66JiG6Jii6Jia6Jiw6Ji/6JmN5LmV6JmU6Jmf6Jmn6Jmx6JqT6Jqj6Jqp6Jqq6JqL6JqM6Jq26Jqv6JuE6JuG6Jqw6JuJ6KCj6Jqr6JuU6Jue6Jup6Jus77+96Juf6Jub6Juv6JyS6JyG6JyI6JyA6JyD6Ju76JyR6JyJ6JyN6Ju56JyK6Jy06Jy/6Jy36Jy76Jyl6Jyp6Jya6J2g6J2f6J246J2M6J2O6J206J2X6J2o6J2u6J2Z6J2T6J2j6J2q6KCF6J6i6J6f6J6C6J6v6J+L6J696J+A6J+Q6ZuW6J6r6J+E6J6z6J+H6J+G6J676J+v6J+y6J+g6KCP6KCN6J++6J+26J+36KCO6J+S6KCR6KCW6KCV6KCi6KCh6KCx6KC26KC56KCn6KC76KGE6KGC6KGS6KGZ6KGe6KGi6KGr6KKB6KG+6KKe6KG16KG96KK16KGy6KKC6KKX6KKS6KKu6KKZ6KKi6KKN6KKk6KKw6KK/6KKx6KOD6KOE6KOU6KOY6KOZ6KOd6KO56KSC6KO86KO06KOo6KOy6KSE6KSM6KSK6KST6KWD6KSe6KSl6KSq6KSr6KWB6KWE6KS76KS26KS46KWM6KSd6KWg6KWe77+977+977+9XCIuc3BsaXQoXCJcIik7XG5mb3IoaiA9IDA7IGogIT0gRFsyMjldLmxlbmd0aDsgKytqKSBpZihEWzIyOV1bal0uY2hhckNvZGVBdCgwKSAhPT0gMHhGRkZEKSB7IGVbRFsyMjldW2pdXSA9IDU4NjI0ICsgajsgZFs1ODYyNCArIGpdID0gRFsyMjldW2pdO31cbkRbMjMwXSA9IFwi77+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+96KWm6KWk6KWt6KWq6KWv6KW06KW36KW+6KaD6KaI6KaK6KaT6KaY6Kah6Kap6Kam6Kas6Kav6Kay6Ka66Ka96Ka/6KeA6Kea6Kec6Ked6Ken6Ke06Ke46KiD6KiW6KiQ6KiM6Kib6Kid6Kil6Ki26KmB6Kmb6KmS6KmG6KmI6Km86Kmt6Kms6Kmi6KqF6KqC6KqE6Kqo6Kqh6KqR6Kql6Kqm6Kqa6Kqj6KuE6KuN6KuC6Kua6Kur6Kuz6Kun77+96Kuk6Kux6KyU6Kug6Kui6Ku36Kue6Kub6KyM6KyH6Kya6Kuh6KyW6KyQ6KyX6Kyg6Kyz6Z6r6Kym6Kyr6Ky+6Kyo6K2B6K2M6K2P6K2O6K2J6K2W6K2b6K2a6K2r6K2f6K2s6K2v6K206K296K6A6K6M6K6O6K6S6K6T6K6W6K6Z6K6a6LC66LGB6LC/6LGI6LGM6LGO6LGQ6LGV6LGi6LGs6LG46LG66LKC6LKJ6LKF6LKK6LKN6LKO6LKU6LG86LKY5oid6LKt6LKq6LK96LKy6LKz6LKu6LK26LOI6LOB6LOk6LOj6LOa6LO96LO66LO76LSE6LSF6LSK6LSH6LSP6LSN6LSQ6b2O6LST6LON6LSU6LSW6LWn6LWt6LWx6LWz6LaB6LaZ6LeC6La+6La66LeP6Lea6LeW6LeM6Leb6LeL6Leq6Ler6Lef6Lej6Le86LiI6LiJ6Le/6Lid6Lie6LiQ6Lif6LmC6Li16Liw6Li06LmK77+977+977+9XCIuc3BsaXQoXCJcIik7XG5mb3IoaiA9IDA7IGogIT0gRFsyMzBdLmxlbmd0aDsgKytqKSBpZihEWzIzMF1bal0uY2hhckNvZGVBdCgwKSAhPT0gMHhGRkZEKSB7IGVbRFsyMzBdW2pdXSA9IDU4ODgwICsgajsgZFs1ODg4MCArIGpdID0gRFsyMzBdW2pdO31cbkRbMjMxXSA9IFwi77+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+96LmH6LmJ6LmM6LmQ6LmI6LmZ6Lmk6Lmg6Liq6Lmj6LmV6Lm26Lmy6Lm86LqB6LqH6LqF6LqE6LqL6LqK6LqT6LqR6LqU6LqZ6Lqq6Lqh6Lqs6Lqw6LuG6Lqx6Lq+6LuF6LuI6LuL6Lub6Luj6Lu86Lu76Lur6Lu+6LyK6LyF6LyV6LyS6LyZ6LyT6Lyc6Lyf6Lyb6LyM6Lym6Lyz6Ly76Ly56L2F6L2C6Ly+6L2M6L2J6L2G6L2O6L2X6L2c77+96L2i6L2j6L2k6L6c6L6f6L6j6L6t6L6v6L636L+a6L+l6L+i6L+q6L+v6YKH6L+06YCF6L+56L+66YCR6YCV6YCh6YCN6YCe6YCW6YCL6YCn6YC26YC16YC56L+46YGP6YGQ6YGR6YGS6YCO6YGJ6YC+6YGW6YGY6YGe6YGo6YGv6YG26Zqo6YGy6YKC6YG96YKB6YKA6YKK6YKJ6YKP6YKo6YKv6YKx6YK16YOi6YOk5omI6YOb6YSC6YSS6YSZ6YSy6YSw6YWK6YWW6YWY6YWj6YWl6YWp6YWz6YWy6YaL6YaJ6YaC6Yai6Yar6Yav6Yaq6Ya16Ya06Ya66YeA6YeB6YeJ6YeL6YeQ6YeW6Yef6Yeh6Yeb6Ye86Ye16Ye26Yie6Ye/6YiU6Yis6YiV6YiR6Yme6YmX6YmF6YmJ6Ymk6YmI6YqV6Yi/6YmL6YmQ6Yqc6YqW6YqT6Yqb6Yma6YuP6Yq56Yq36Yup6YyP6Yu66Y2E6Yyu77+977+977+9XCIuc3BsaXQoXCJcIik7XG5mb3IoaiA9IDA7IGogIT0gRFsyMzFdLmxlbmd0aDsgKytqKSBpZihEWzIzMV1bal0uY2hhckNvZGVBdCgwKSAhPT0gMHhGRkZEKSB7IGVbRFsyMzFdW2pdXSA9IDU5MTM2ICsgajsgZFs1OTEzNiArIGpdID0gRFsyMzFdW2pdO31cbkRbMjMyXSA9IFwi77+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+96YyZ6Yyi6Yya6Yyj6Yy66Yy16Yy76Y2c6Y2g6Y286Y2u6Y2W6Y6w6Y6s6Y6t6Y6U6Y656Y+W6Y+X6Y+o6Y+l6Y+Y6Y+D6Y+d6Y+Q6Y+I6Y+k6ZCa6ZCU6ZCT6ZCD6ZCH6ZCQ6ZC26ZCr6ZC16ZCh6ZC66ZGB6ZGS6ZGE6ZGb6ZGg6ZGi6ZGe6ZGq6Yip6ZGw6ZG16ZG36ZG96ZGa6ZG86ZG+6ZKB6ZG/6ZaC6ZaH6ZaK6ZaU6ZaW6ZaY6ZaZ77+96Zag6Zao6Zan6Zat6Za86Za76Za56Za+6ZeK5r+26ZeD6ZeN6ZeM6ZeV6ZeU6ZeW6Zec6Zeh6Zel6Zei6Zih6Zio6Ziu6Ziv6ZmC6ZmM6ZmP6ZmL6Zm36Zmc6Zme6Zmd6Zmf6Zmm6Zmy6Zms6ZqN6ZqY6ZqV6ZqX6Zqq6Zqn6Zqx6Zqy6Zqw6Zq06Zq26Zq46Zq56ZuO6ZuL6ZuJ6ZuN6KWN6Zuc6ZyN6ZuV6Zu56ZyE6ZyG6ZyI6ZyT6ZyO6ZyR6ZyP6ZyW6ZyZ6Zyk6Zyq6Zyw6Zy56Zy96Zy+6Z2E6Z2G6Z2I6Z2C6Z2J6Z2c6Z2g6Z2k6Z2m6Z2o5YuS6Z2r6Z2x6Z256Z6F6Z286Z6B6Z266Z6G6Z6L6Z6P6Z6Q6Z6c6Z6o6Z6m6Z6j6Z6z6Z606Z+D6Z+G6Z+I6Z+L6Z+c6Z+t6b2P6Z+y56uf6Z+26Z+16aCP6aCM6aC46aCk6aCh6aC36aC96aGG6aGP6aGL6aGr6aGv6aGw77+977+977+9XCIuc3BsaXQoXCJcIik7XG5mb3IoaiA9IDA7IGogIT0gRFsyMzJdLmxlbmd0aDsgKytqKSBpZihEWzIzMl1bal0uY2hhckNvZGVBdCgwKSAhPT0gMHhGRkZEKSB7IGVbRFsyMzJdW2pdXSA9IDU5MzkyICsgajsgZFs1OTM5MiArIGpdID0gRFsyMzJdW2pdO31cbkRbMjMzXSA9IFwi77+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+96aGx6aG06aGz6aKq6aKv6aKx6aK26aOE6aOD6aOG6aOp6aOr6aSD6aSJ6aSS6aSU6aSY6aSh6aSd6aSe6aSk6aSg6aSs6aSu6aS96aS+6aWC6aWJ6aWF6aWQ6aWL6aWR6aWS6aWM6aWV6aaX6aaY6aal6aat6aau6aa86aef6aeb6aed6aeY6aeR6aet6aeu6aex6aey6ae76ae46aiB6aiP6aiF6aei6aiZ6air6ai36amF6amC6amA6amD77+96ai+6amV6amN6amb6amX6amf6ami6aml6amk6amp6amr6amq6aqt6aqw6aq86auA6auP6auR6auT6auU6aue6auf6aui6auj6aum6auv6aur6auu6au06aux6au36au76ayG6ayY6aya6ayf6ayi6ayj6ayl6ayn6ayo6ayp6ayq6ayu6ayv6ayy6a2E6a2D6a2P6a2N6a2O6a2R6a2Y6a206a6T6a6D6a6R6a6W6a6X6a6f6a6g6a6o6a606a+A6a+K6a656a+G6a+P6a+R6a+S6a+j6a+i6a+k6a+U6a+h6bC66a+y6a+x6a+w6bCV6bCU6bCJ6bCT6bCM6bCG6bCI6bCS6bCK6bCE6bCu6bCb6bCl6bCk6bCh6bCw6bGH6bCy6bGG6bC+6bGa6bGg6bGn6bG26bG46bOn6bOs6bOw6bSJ6bSI6bOr6bSD6bSG6bSq6bSm6bav6bSj6bSf6bWE6bSV6bSS6bWB6bS/6bS+6bWG6bWI77+977+977+9XCIuc3BsaXQoXCJcIik7XG5mb3IoaiA9IDA7IGogIT0gRFsyMzNdLmxlbmd0aDsgKytqKSBpZihEWzIzM11bal0uY2hhckNvZGVBdCgwKSAhPT0gMHhGRkZEKSB7IGVbRFsyMzNdW2pdXSA9IDU5NjQ4ICsgajsgZFs1OTY0OCArIGpdID0gRFsyMzNdW2pdO31cbkRbMjM0XSA9IFwi77+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+96bWd6bWe6bWk6bWR6bWQ6bWZ6bWy6baJ6baH6bar6bWv6bW66baa6bak6bap6bay6beE6beB6ba76ba46ba66beG6beP6beC6beZ6beT6be46bem6bet6bev6be96bia6bib6bie6bm16bm56bm96bqB6bqI6bqL6bqM6bqS6bqV6bqR6bqd6bql6bqp6bq46bqq6bqt6Z2h6buM6buO6buP6buQ6buU6buc6bue6bud6bug6bul6buo6buv77+96bu06bu26bu36bu56bu76bu86bu96byH6byI55q36byV6byh6bys6by+6b2K6b2S6b2U6b2j6b2f6b2g6b2h6b2m6b2n6b2s6b2q6b236b2y6b226b6V6b6c6b6g5aCv5qeH6YGZ55Gk5Yec54aZ77+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+9XCIuc3BsaXQoXCJcIik7XG5mb3IoaiA9IDA7IGogIT0gRFsyMzRdLmxlbmd0aDsgKytqKSBpZihEWzIzNF1bal0uY2hhckNvZGVBdCgwKSAhPT0gMHhGRkZEKSB7IGVbRFsyMzRdW2pdXSA9IDU5OTA0ICsgajsgZFs1OTkwNCArIGpdID0gRFsyMzRdW2pdO31cbkRbMjM3XSA9IFwi77+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+957qK6KSc6Y2I6YqI6JOc5L+J54K75pix5qOI6Yu55pu75b2F5Lio5Luh5Lu85LyA5LyD5Ly55L2W5L6S5L6K5L6a5L6U5L+N5YGA5YCi5L+/5YCe5YGG5YGw5YGC5YKU5YO05YOY5YWK5YWk5Yad5Ya+5Yes5YiV5Yqc5Yqm5YuA5Yub5YyA5YyH5Yyk5Y2y5Y6T5Y6y5Y+d76iO5ZKc5ZKK5ZKp5ZO/5ZaG5Z2Z5Z2l5Z6s5Z+I5Z+H76iP77+976iQ5aKe5aKy5aSL5aWT5aWb5aWd5aWj5aak5aa65a2W5a+A55Sv5a+Y5a+s5bCe5bKm5bK65bO15bSn5bWT76iR5bWC5bWt5ba45ba55beQ5byh5by05b2n5b635b+e5oGd5oKF5oKK5oOe5oOV5oSg5oOy5oSR5oS35oSw5oaY5oiT5oqm5o+15pGg5pKd5pOO5pWO5piA5piV5pi75piJ5piu5pie5pik5pml5pmX5pmZ76iS5pmz5pqZ5pqg5pqy5pq/5pu65pyO76Sp5p2m5p675qGS5p+A5qCB5qGE5qOP76iT5qWo76iU5qaY5qei5qiw5qmr5qmG5qmz5qm+5qui5quk5q+W5rC/5rGc5rKG5rGv5rOa5rSE5raH5rWv5raW5ras5reP5re45rey5re85ri55rmc5rin5ri85rq/5r6I5r615r+154CF54CH54Co54KF54Kr54SP54SE54Wc54WG54WH76iV54eB54e+54qx77+977+977+9XCIuc3BsaXQoXCJcIik7XG5mb3IoaiA9IDA7IGogIT0gRFsyMzddLmxlbmd0aDsgKytqKSBpZihEWzIzN11bal0uY2hhckNvZGVBdCgwKSAhPT0gMHhGRkZEKSB7IGVbRFsyMzddW2pdXSA9IDYwNjcyICsgajsgZFs2MDY3MiArIGpdID0gRFsyMzddW2pdO31cbkRbMjM4XSA9IFwi77+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+954q+54yk76iW5423546954+J54+W54+j54+S55CH54+155Cm55Cq55Cp55Cu55Gi55KJ55Kf55SB55Wv55qC55qc55qe55qb55qm76iX552G5Yqv56Ch56GO56Gk56G656Sw76iY76iZ76ia56aU76ib56ab56uR56un76ic56ur566e76id57WI57Wc57a357ag57eW57mS572H576h76ie6IyB6I2i6I2/6I+H6I+26JGI6JK06JWT6JWZ77+96JWr76if6Jaw76ig76ih6KCH6KO16KiS6Ki36Km56Kqn6Kq+6Kuf76ii6Ku26K2T6K2/6LOw6LO06LSS6LW276ij6LuP76ik76il6YGn6YOe76im6YSV6YSn6Yea6YeX6Yee6Yet6Yeu6Yek6Yel6YiG6YiQ6YiK6Yi66YmA6Yi86YmO6YmZ6YmR6Yi56Ymn6Yqn6Ym36Ym46Yun6YuX6YuZ6YuQ76in6YuV6Yug6YuT6Yyl6Yyh6Yu776io6Yye6Yu/6Yyd6YyC6Y2w6Y2X6Y6k6Y+G6Y+e6Y+46ZCx6ZGF6ZGI6ZaS76ec76ip6Zqd6Zqv6Zyz6Zy76Z2D6Z2N6Z2P6Z2R6Z2V6aGX6aGl76iq76ir6aSn76is6aae6amO6auZ6auc6a216a2y6a6P6a6x6a676bCA6bWw6bWr76it6biZ6buR77+977+94oWw4oWx4oWy4oWz4oW04oW14oW24oW34oW44oW577+i77+k77yH77yC77+977+977+9XCIuc3BsaXQoXCJcIik7XG5mb3IoaiA9IDA7IGogIT0gRFsyMzhdLmxlbmd0aDsgKytqKSBpZihEWzIzOF1bal0uY2hhckNvZGVBdCgwKSAhPT0gMHhGRkZEKSB7IGVbRFsyMzhdW2pdXSA9IDYwOTI4ICsgajsgZFs2MDkyOCArIGpdID0gRFsyMzhdW2pdO31cbkRbMjUwXSA9IFwi77+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+94oWw4oWx4oWy4oWz4oW04oW14oW24oW34oW44oW54oWg4oWh4oWi4oWj4oWk4oWl4oWm4oWn4oWo4oWp77+i77+k77yH77yC44ix4oSW4oSh4oi157qK6KSc6Y2I6YqI6JOc5L+J54K75pix5qOI6Yu55pu75b2F5Lio5Luh5Lu85LyA5LyD5Ly55L2W5L6S5L6K5L6a5L6U5L+N5YGA5YCi5L+/5YCe5YGG5YGw5YGC5YKU5YO05YOY5YWK77+95YWk5Yad5Ya+5Yes5YiV5Yqc5Yqm5YuA5Yub5YyA5YyH5Yyk5Y2y5Y6T5Y6y5Y+d76iO5ZKc5ZKK5ZKp5ZO/5ZaG5Z2Z5Z2l5Z6s5Z+I5Z+H76iP76iQ5aKe5aKy5aSL5aWT5aWb5aWd5aWj5aak5aa65a2W5a+A55Sv5a+Y5a+s5bCe5bKm5bK65bO15bSn5bWT76iR5bWC5bWt5ba45ba55beQ5byh5by05b2n5b635b+e5oGd5oKF5oKK5oOe5oOV5oSg5oOy5oSR5oS35oSw5oaY5oiT5oqm5o+15pGg5pKd5pOO5pWO5piA5piV5pi75piJ5piu5pie5pik5pml5pmX5pmZ76iS5pmz5pqZ5pqg5pqy5pq/5pu65pyO76Sp5p2m5p675qGS5p+A5qCB5qGE5qOP76iT5qWo76iU5qaY5qei5qiw5qmr5qmG5qmz5qm+5qui5quk5q+W5rC/5rGc5rKG5rGv5rOa5rSE5raH5rWv77+977+977+9XCIuc3BsaXQoXCJcIik7XG5mb3IoaiA9IDA7IGogIT0gRFsyNTBdLmxlbmd0aDsgKytqKSBpZihEWzI1MF1bal0uY2hhckNvZGVBdCgwKSAhPT0gMHhGRkZEKSB7IGVbRFsyNTBdW2pdXSA9IDY0MDAwICsgajsgZFs2NDAwMCArIGpdID0gRFsyNTBdW2pdO31cbkRbMjUxXSA9IFwi77+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+95raW5ras5reP5re45rey5re85ri55rmc5rin5ri85rq/5r6I5r615r+154CF54CH54Co54KF54Kr54SP54SE54Wc54WG54WH76iV54eB54e+54qx54q+54yk76iW5423546954+J54+W54+j54+S55CH54+155Cm55Cq55Cp55Cu55Gi55KJ55Kf55SB55Wv55qC55qc55qe55qb55qm76iX552G5Yqv56Ch56GO56Gk56G656Sw76iY76iZ77+976ia56aU76ib56ab56uR56un76ic56ur566e76id57WI57Wc57a357ag57eW57mS572H576h76ie6IyB6I2i6I2/6I+H6I+26JGI6JK06JWT6JWZ6JWr76if6Jaw76ig76ih6KCH6KO16KiS6Ki36Km56Kqn6Kq+6Kuf76ii6Ku26K2T6K2/6LOw6LO06LSS6LW276ij6LuP76ik76il6YGn6YOe76im6YSV6YSn6Yea6YeX6Yee6Yet6Yeu6Yek6Yel6YiG6YiQ6YiK6Yi66YmA6Yi86YmO6YmZ6YmR6Yi56Ymn6Yqn6Ym36Ym46Yun6YuX6YuZ6YuQ76in6YuV6Yug6YuT6Yyl6Yyh6Yu776io6Yye6Yu/6Yyd6YyC6Y2w6Y2X6Y6k6Y+G6Y+e6Y+46ZCx6ZGF6ZGI6ZaS76ec76ip6Zqd6Zqv6Zyz6Zy76Z2D6Z2N6Z2P6Z2R6Z2V6aGX6aGl76iq76ir6aSn76is6aae6amO6auZ77+977+977+9XCIuc3BsaXQoXCJcIik7XG5mb3IoaiA9IDA7IGogIT0gRFsyNTFdLmxlbmd0aDsgKytqKSBpZihEWzI1MV1bal0uY2hhckNvZGVBdCgwKSAhPT0gMHhGRkZEKSB7IGVbRFsyNTFdW2pdXSA9IDY0MjU2ICsgajsgZFs2NDI1NiArIGpdID0gRFsyNTFdW2pdO31cbkRbMjUyXSA9IFwi77+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+96auc6a216a2y6a6P6a6x6a676bCA6bWw6bWr76it6biZ6buR77+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+9XCIuc3BsaXQoXCJcIik7XG5mb3IoaiA9IDA7IGogIT0gRFsyNTJdLmxlbmd0aDsgKytqKSBpZihEWzI1Ml1bal0uY2hhckNvZGVBdCgwKSAhPT0gMHhGRkZEKSB7IGVbRFsyNTJdW2pdXSA9IDY0NTEyICsgajsgZFs2NDUxMiArIGpdID0gRFsyNTJdW2pdO31cbnJldHVybiB7XCJlbmNcIjogZSwgXCJkZWNcIjogZCB9OyB9KSgpO1xuY3B0YWJsZVs5MzZdID0gKGZ1bmN0aW9uKCl7IHZhciBkID0gW10sIGUgPSB7fSwgRCA9IFtdLCBqO1xuRFswXSA9IFwiXFx1MDAwMFxcdTAwMDFcXHUwMDAyXFx1MDAwM1xcdTAwMDRcXHUwMDA1XFx1MDAwNlxcdTAwMDdcXGJcXHRcXG5cXHUwMDBiXFxmXFxyXFx1MDAwZVxcdTAwMGZcXHUwMDEwXFx1MDAxMVxcdTAwMTJcXHUwMDEzXFx1MDAxNFxcdTAwMTVcXHUwMDE2XFx1MDAxN1xcdTAwMThcXHUwMDE5XFx1MDAxYVxcdTAwMWJcXHUwMDFjXFx1MDAxZFxcdTAwMWVcXHUwMDFmICFcXFwiIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6Ozw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXFxcXF1eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX5/4oKs77+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+9XCIuc3BsaXQoXCJcIik7XG5mb3IoaiA9IDA7IGogIT0gRFswXS5sZW5ndGg7ICsraikgaWYoRFswXVtqXS5jaGFyQ29kZUF0KDApICE9PSAweEZGRkQpIHsgZVtEWzBdW2pdXSA9IDAgKyBqOyBkWzAgKyBqXSA9IERbMF1bal07fVxuRFsxMjldID0gXCLvv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73kuILkuITkuIXkuIbkuI/kuJLkuJfkuJ/kuKDkuKHkuKPkuKbkuKnkuK7kuK/kuLHkuLPkuLXkuLfkuLzkuYDkuYHkuYLkuYTkuYbkuYrkuZHkuZXkuZfkuZrkuZvkuaLkuaPkuaTkuaXkuafkuajkuarkuavkuazkua3kua7kua/kubLkubTkubXkubbkubfkubjkubnkubrkubvkubzkub3kub/kuoDkuoHkuoLkuoPkuoTkuoXkuofkuorvv73kupDkupbkupfkupnkupzkup3kup7kuqPkuqrkuq/kurDkurHkurTkurbkurfkurjkurnkurzkur3kur7ku4jku4zku4/ku5Dku5Lku5rku5vku5zku6Dku6Lku6bku6fku6nku63ku67ku6/ku7Hku7Tku7jku7nku7rku7zku77kvIDkvILkvIPkvITkvIXkvIbkvIfkvIjkvIvkvIzkvJLkvJPkvJTkvJXkvJbkvJzkvJ3kvKHkvKPkvKjkvKnkvKzkvK3kvK7kvLHkvLPkvLXkvLfkvLnkvLvkvL7kvL/kvYDkvYHkvYLkvYTkvYXkvYfkvYjkvYnkvYrkvYvkvYzkvZLkvZTkvZbkvaHkvaLkvabkvajkvarkvavkva3kva7kvbHkvbLkvbXkvbfkvbjkvbnkvbrkvb3kvoDkvoHkvoLkvoXkvobkvofkvorkvozkvo7kvpDkvpLkvpPkvpXkvpbkvpjkvpnkvprkvpzkvp7kvp/kvqHkvqLvv71cIi5zcGxpdChcIlwiKTtcbmZvcihqID0gMDsgaiAhPSBEWzEyOV0ubGVuZ3RoOyArK2opIGlmKERbMTI5XVtqXS5jaGFyQ29kZUF0KDApICE9PSAweEZGRkQpIHsgZVtEWzEyOV1bal1dID0gMzMwMjQgKyBqOyBkWzMzMDI0ICsgal0gPSBEWzEyOV1bal07fVxuRFsxMzBdID0gXCLvv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73kvqTkvqvkvq3kvrDkvrHkvrLkvrPkvrTkvrbkvrfkvrjkvrnkvrrkvrvkvrzkvr3kvr7kv4Dkv4Hkv4Lkv4bkv4fkv4jkv4nkv4vkv4zkv43kv5Lkv5Pkv5Tkv5Xkv5bkv5nkv5vkv6Dkv6Lkv6Tkv6Xkv6fkv6vkv6zkv7Dkv7Lkv7Tkv7Xkv7bkv7fkv7nkv7vkv7zkv73kv7/lgIDlgIHlgILlgIPlgITlgIXlgIblgIflgIjlgInlgIrvv73lgIvlgI7lgJDlgJHlgJPlgJXlgJblgJflgJvlgJ3lgJ7lgKDlgKLlgKPlgKTlgKflgKvlgK/lgLDlgLHlgLLlgLPlgLTlgLXlgLblgLflgLjlgLnlgLvlgL3lgL/lgYDlgYHlgYLlgYTlgYXlgYblgYnlgYrlgYvlgY3lgZDlgZHlgZLlgZPlgZTlgZblgZflgZjlgZnlgZvlgZ3lgZ7lgZ/lgaDlgaHlgaLlgaPlgaTlgablgaflgajlganlgarlgavlga3lga7lga/lgbDlgbHlgbLlgbPlgbTlgbXlgbjlgbnlgbrlgbzlgb3lgoHlgoLlgoPlgoTlgoblgoflgonlgorlgovlgozlgo7lgo/lgpDlgpHlgpLlgpPlgpTlgpXlgpblgpflgpjlgpnlgprlgpvlgpzlgp3lgp7lgp/lgqDlgqHlgqLlgqTlgqblgqrlgqvlgq3lgq7lgq/lgrDlgrHlgrPlgrTlgrXlgrblgrflgrjlgrnlgrzvv71cIi5zcGxpdChcIlwiKTtcbmZvcihqID0gMDsgaiAhPSBEWzEzMF0ubGVuZ3RoOyArK2opIGlmKERbMTMwXVtqXS5jaGFyQ29kZUF0KDApICE9PSAweEZGRkQpIHsgZVtEWzEzMF1bal1dID0gMzMyODAgKyBqOyBkWzMzMjgwICsgal0gPSBEWzEzMF1bal07fVxuRFsxMzFdID0gXCLvv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73lgr3lgr7lgr/lg4Dlg4Hlg4Llg4Plg4Tlg4Xlg4blg4flg4jlg4nlg4rlg4vlg4zlg43lg47lg5Dlg5Hlg5Llg5Plg5Tlg5Xlg5flg5jlg5nlg5vlg5zlg53lg57lg5/lg6Dlg6Hlg6Llg6Plg6Tlg6Xlg6jlg6nlg6rlg6vlg6/lg7Dlg7Hlg7Llg7Tlg7blg7flg7jlg7nlg7rlg7zlg73lg77lg7/lhIDlhIHlhILlhIPlhITlhIXlhIjvv73lhInlhIrlhIzlhI3lhI7lhI/lhJDlhJHlhJPlhJTlhJXlhJblhJflhJjlhJnlhJrlhJvlhJzlhJ3lhJ7lhJ/lhKDlhKLlhKPlhKTlhKXlhKblhKflhKjlhKnlhKrlhKvlhKzlhK3lhK7lhK/lhLDlhLHlhLLlhLPlhLTlhLXlhLblhLflhLjlhLnlhLrlhLvlhLzlhL3lhL7lhYLlhYflhYrlhYzlhY7lhY/lhZDlhZLlhZPlhZflhZjlhZnlhZvlhZ3lhZ7lhZ/lhaDlhaHlhaPlhaTlhablhaflhanlharlha/lhbLlhbrlhb7lhb/lhoPlhoTlhoblhoflhorlhovlho7lho/lhpDlhpHlhpPlhpTlhpjlhprlhp3lhp7lhp/lhqHlhqPlhqblhqflhqjlhqnlhqrlhq3lhq7lhrTlhrjlhrnlhrrlhr7lhr/lh4Hlh4Llh4Plh4Xlh4jlh4rlh43lh47lh5Dlh5Llh5Plh5Tlh5Xlh5blh5fvv71cIi5zcGxpdChcIlwiKTtcbmZvcihqID0gMDsgaiAhPSBEWzEzMV0ubGVuZ3RoOyArK2opIGlmKERbMTMxXVtqXS5jaGFyQ29kZUF0KDApICE9PSAweEZGRkQpIHsgZVtEWzEzMV1bal1dID0gMzM1MzYgKyBqOyBkWzMzNTM2ICsgal0gPSBEWzEzMV1bal07fVxuRFsxMzJdID0gXCLvv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73lh5jlh5nlh5rlh5zlh57lh5/lh6Llh6Plh6Xlh6blh6flh6jlh6nlh6rlh6zlh67lh7Hlh7Llh7Tlh7flh77liITliIXliInliIvliIzliI/liJDliJPliJTliJXliJzliJ7liJ/liKHliKLliKPliKXliKbliKfliKrliKzliK/liLHliLLliLTliLXliLzliL7liYTliYXliYbliYfliYjliYnliYvliY7liY/liZLliZPliZXliZfliZjvv73liZnliZrliZvliZ3liZ/liaDliaLliaPliaTliabliajliavliazlia3lia7libDlibHlibPlibTlibXlibblibflibjlibnlibrlibvlibzlib7lioDlioPlioTlioXlioblioflionliorliovliozlio3lio7lio/lipHlipLlipTlipXlipblipflipjlipnliprlipzliqTliqXliqbliqfliq7liq/lirDlirTlirXlirblirflirjlirnlirrlirvlirzlir3li4Dli4Hli4Lli4Tli4Xli4bli4jli4rli4zli43li47li4/li5Hli5Pli5Tli5Xli5fli5nli5rli5vli5zli53li57li6Dli6Hli6Lli6Pli6Xli6bli6fli6jli6nli6rli6vli6zli63li67li6/li7Hli7Lli7Pli7Tli7Xli7bli7fli7jli7vli7zli73ljIHljILljIPljITljIfljInljIrljIvljIzljI7vv71cIi5zcGxpdChcIlwiKTtcbmZvcihqID0gMDsgaiAhPSBEWzEzMl0ubGVuZ3RoOyArK2opIGlmKERbMTMyXVtqXS5jaGFyQ29kZUF0KDApICE9PSAweEZGRkQpIHsgZVtEWzEzMl1bal1dID0gMzM3OTIgKyBqOyBkWzMzNzkyICsgal0gPSBEWzEzMl1bal07fVxuRFsxMzNdID0gXCLvv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73ljJHljJLljJPljJTljJjljJvljJzljJ7ljJ/ljKLljKTljKXljKfljKjljKnljKvljKzljK3ljK/ljLDljLHljLLljLPljLTljLXljLbljLfljLjljLzljL3ljYDljYLljYTljYbljYvljYzljY3ljZDljZTljZjljZnljZvljZ3ljaXljajljarljazlja3ljbLljbbljbnljbvljbzljb3ljb7ljoDljoHljoPljofljojljorljo7ljo/vv73ljpDljpHljpLljpPljpTljpbljpfljpnljpvljpzljp7ljqDljqHljqTljqfljqrljqvljqzljq3ljq/ljrDljrHljrLljrPljrTljrXljrfljrjljrnljrrljrzljr3ljr7lj4Dlj4Plj4Tlj4Xlj4blj4flj47lj4/lj5Dlj5Llj5Plj5Xlj5rlj5zlj53lj57lj6Hlj6Llj6flj7Tlj7rlj77lj7/lkIDlkILlkIXlkIflkIvlkJTlkJjlkJnlkJrlkJzlkKLlkKTlkKXlkKrlkLDlkLPlkLblkLflkLrlkL3lkL/lkYHlkYLlkYTlkYXlkYflkYnlkYzlkY3lkY7lkY/lkZHlkZrlkZ3lkZ7lkZ/lkaDlkaHlkaPlkaXlkaflkanlkarlkavlkazlka3lka7lka/lkbDlkbTlkbnlkbrlkb7lkb/lkoHlkoPlkoXlkoflkojlkonlkorlko3lkpHlkpPlkpflkpjlkpzlkp7lkp/lkqDlkqHvv71cIi5zcGxpdChcIlwiKTtcbmZvcihqID0gMDsgaiAhPSBEWzEzM10ubGVuZ3RoOyArK2opIGlmKERbMTMzXVtqXS5jaGFyQ29kZUF0KDApICE9PSAweEZGRkQpIHsgZVtEWzEzM11bal1dID0gMzQwNDggKyBqOyBkWzM0MDQ4ICsgal0gPSBEWzEzM11bal07fVxuRFsxMzRdID0gXCLvv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73lkqLlkqXlkq7lkrDlkrLlkrXlkrblkrflkrnlkrrlkrzlkr7lk4Plk4Xlk4rlk4vlk5blk5jlk5vlk6Dlk6Hlk6Llk6Plk6Tlk6vlk6zlk6/lk7Dlk7Hlk7Tlk7Xlk7blk7flk7jlk7nlk7vlk77llIDllILllIPllITllIXllIjllIrllIvllIzllI3llI7llJLllJPllJXllJbllJfllJjllJnllJrllJzllJ3llJ7llJ/llKHllKXllKbvv73llKjllKnllKvllK3llLLllLTllLXllLbllLjllLnllLrllLvllL3llYDllYLllYXllYfllYjllYvllYzllY3llY7llY/llZHllZLllZPllZTllZfllZjllZnllZrllZvllZ3llZ7llZ/llaDllaLllaPllajllanllavlla/llbDllbHllbLllbPllbTllbnllbrllb3llb/lloXllobllozllo3llo7llpDllpLllpPllpXllpbllpfllprllpvllp7llqDllqHllqLllqPllqTllqXllqbllqjllqnllqrllqvllqzllq3llq7llq/llrDllrLllrTllrbllrjllrrllrzllr/ll4Dll4Hll4Lll4Pll4bll4fll4jll4rll4vll47ll4/ll5Dll5Xll5fll5jll5nll5rll5vll57ll6Dll6Lll6fll6nll63ll67ll7Dll7Hll7Tll7bll7jll7nll7rll7vll7zll7/lmILlmIPlmITlmIXvv71cIi5zcGxpdChcIlwiKTtcbmZvcihqID0gMDsgaiAhPSBEWzEzNF0ubGVuZ3RoOyArK2opIGlmKERbMTM0XVtqXS5jaGFyQ29kZUF0KDApICE9PSAweEZGRkQpIHsgZVtEWzEzNF1bal1dID0gMzQzMDQgKyBqOyBkWzM0MzA0ICsgal0gPSBEWzEzNF1bal07fVxuRFsxMzVdID0gXCLvv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73lmIblmIflmIrlmIvlmI3lmJDlmJHlmJLlmJPlmJTlmJXlmJblmJflmJnlmJrlmJzlmJ3lmKDlmKHlmKLlmKXlmKblmKjlmKnlmKrlmKvlmK7lmK/lmLDlmLPlmLXlmLflmLjlmLrlmLzlmL3lmL7lmYDlmYHlmYLlmYPlmYTlmYXlmYblmYflmYjlmYnlmYrlmYvlmY/lmZDlmZHlmZLlmZPlmZXlmZblmZrlmZvlmZ3lmZ7lmZ/lmaDlmaHvv73lmaPlmaXlmablmaflma3lma7lma/lmbDlmbLlmbPlmbTlmbXlmbflmbjlmbnlmbrlmb3lmb7lmb/lmoDlmoHlmoLlmoPlmoTlmoflmojlmonlmorlmovlmozlmo3lmpDlmpHlmpLlmpTlmpXlmpblmpflmpjlmpnlmprlmpvlmpzlmp3lmp7lmp/lmqDlmqHlmqLlmqTlmqXlmqblmqflmqjlmqnlmqrlmqvlmqzlmq3lmq7lmrDlmrHlmrLlmrPlmrTlmrXlmrblmrjlmrnlmrrlmrvlmr3lmr7lmr/lm4Dlm4Hlm4Llm4Plm4Tlm4Xlm4blm4flm4jlm4nlm4vlm4zlm43lm47lm4/lm5Dlm5Hlm5Llm5Plm5Xlm5blm5jlm5nlm5zlm6Plm6Xlm6blm6flm6jlm6nlm6rlm6zlm67lm6/lm7Llm7Plm7blm7flm7jlm7vlm7zlnIDlnIHlnILlnIXlnIflnIvlnIzlnI3lnI7lnI/lnJDlnJHvv71cIi5zcGxpdChcIlwiKTtcbmZvcihqID0gMDsgaiAhPSBEWzEzNV0ubGVuZ3RoOyArK2opIGlmKERbMTM1XVtqXS5jaGFyQ29kZUF0KDApICE9PSAweEZGRkQpIHsgZVtEWzEzNV1bal1dID0gMzQ1NjAgKyBqOyBkWzM0NTYwICsgal0gPSBEWzEzNV1bal07fVxuRFsxMzZdID0gXCLvv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73lnJLlnJPlnJTlnJXlnJblnJflnJjlnJnlnJrlnJvlnJ3lnJ7lnKDlnKHlnKLlnKTlnKXlnKblnKflnKvlnLHlnLLlnLTlnLXlnLblnLflnLjlnLzlnL3lnL/lnYHlnYPlnYTlnYXlnYblnYjlnYnlnYvlnZLlnZPlnZTlnZXlnZblnZjlnZnlnaLlnaPlnaXlnaflnazlna7lnbDlnbHlnbLlnbTlnbXlnbjlnbnlnbrlnb3lnb7lnb/lnoDvv73lnoHlnoflnojlnonlnorlno3lno7lno/lnpDlnpHlnpTlnpXlnpblnpflnpjlnpnlnprlnpzlnp3lnp7lnp/lnqXlnqjlnqrlnqzlnq/lnrDlnrHlnrPlnrXlnrblnrflnrnlnrrlnrvlnrzlnr3lnr7lnr/ln4Dln4Hln4Tln4Xln4bln4fln4jln4nln4rln4zln43ln5Dln5Hln5Pln5bln5fln5vln5zln57ln6Hln6Lln6Pln6Xln6bln6fln6jln6nln6rln6vln6zln67ln7Dln7Hln7Lln7Pln7Xln7bln7fln7vln7zln77ln7/loIHloIPloITloIXloIjloInloIrloIzloI7loI/loJDloJLloJPloJTloJbloJfloJjloJrloJvloJzloJ3loJ/loKLloKPloKXloKbloKfloKjloKnloKvloKzloK3loK7loK/loLHloLLloLPloLTloLbloLfloLjloLnloLrloLvloLzloL3vv71cIi5zcGxpdChcIlwiKTtcbmZvcihqID0gMDsgaiAhPSBEWzEzNl0ubGVuZ3RoOyArK2opIGlmKERbMTM2XVtqXS5jaGFyQ29kZUF0KDApICE9PSAweEZGRkQpIHsgZVtEWzEzNl1bal1dID0gMzQ4MTYgKyBqOyBkWzM0ODE2ICsgal0gPSBEWzEzNl1bal07fVxuRFsxMzddID0gXCLvv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73loL7loL/loYDloYHloYLloYPloYXloYbloYfloYjloYnloYrloYvloY7loY/loZDloZLloZPloZXloZbloZfloZnloZrloZvloZzloZ3loZ/loaDloaHloaLloaPloaTloabloafloajloanloarloa3loa7loa/lobDlobHlobLlobPlobTlobXlobblobflobjlobnlobrlobvlobzlob3lob/looLlooTloobloofloojloorloovloozvv73loo3loo7loo/lopDlopHlopTlopXlopblopflopjlopvlopzlop3loqDloqHloqLloqPloqTloqXloqbloqfloqrloqvloqzloq3loq7loq/lorDlorHlorLlorPlorTlorXlorblorflorjlornlorrlorvlor3lor7lor/lo4Dlo4Llo4Plo4Tlo4blo4flo4jlo4nlo4rlo4vlo4zlo43lo47lo4/lo5Dlo5Llo5Plo5Tlo5blo5flo5jlo5nlo5rlo5vlo5zlo53lo57lo5/lo6Dlo6Hlo6Llo6Plo6Xlo6blo6flo6jlo6nlo6rlo63lo6/lo7Hlo7Llo7Tlo7Xlo7flo7jlo7rlo7vlo7zlo73lo77lo7/lpIDlpIHlpIPlpIXlpIblpIjlpInlpIrlpIvlpIzlpI7lpJDlpJHlpJLlpJPlpJflpJjlpJvlpJ3lpJ7lpKDlpKHlpKLlpKPlpKblpKjlpKzlpLDlpLLlpLPlpLXlpLblpLvvv71cIi5zcGxpdChcIlwiKTtcbmZvcihqID0gMDsgaiAhPSBEWzEzN10ubGVuZ3RoOyArK2opIGlmKERbMTM3XVtqXS5jaGFyQ29kZUF0KDApICE9PSAweEZGRkQpIHsgZVtEWzEzN11bal1dID0gMzUwNzIgKyBqOyBkWzM1MDcyICsgal0gPSBEWzEzN11bal07fVxuRFsxMzhdID0gXCLvv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73lpL3lpL7lpL/lpYDlpYPlpYXlpYblpYrlpYzlpY3lpZDlpZLlpZPlpZnlpZvlpZzlpZ3lpZ7lpZ/lpaHlpaPlpaTlpablpaflpajlpanlparlpavlpazlpa3lpa7lpa/lpbDlpbHlpbLlpbXlpbflpbrlpbvlpbzlpb7lpb/lpoDlpoXlponlpovlpozlpo7lpo/lppDlppHlppTlppXlppjlpprlppvlppzlpp3lpp/lpqDlpqHlpqLlpqbvv73lpqflpqzlpq3lprDlprHlprPlprTlprXlprblprflprjlprrlprzlpr3lpr/lp4Dlp4Hlp4Llp4Plp4Tlp4Xlp4flp4jlp4nlp4zlp43lp47lp4/lp5Xlp5blp5nlp5vlp57lp5/lp6Dlp6Hlp6Llp6Tlp6blp6flp6nlp6rlp6vlp63lp67lp6/lp7Dlp7Hlp7Llp7Plp7Tlp7Xlp7blp7flp7jlp7rlp7zlp73lp77lqIDlqILlqIrlqIvlqI3lqI7lqI/lqJDlqJLlqJTlqJXlqJblqJflqJnlqJrlqJvlqJ3lqJ7lqKHlqKLlqKTlqKblqKflqKjlqKrlqKvlqKzlqK3lqK7lqK/lqLDlqLPlqLXlqLflqLjlqLnlqLrlqLvlqL3lqL7lqL/lqYHlqYLlqYPlqYTlqYXlqYflqYjlqYvlqYzlqY3lqY7lqY/lqZDlqZHlqZLlqZPlqZTlqZblqZflqZjlqZnlqZvlqZzlqZ3lqZ7lqZ/lqaDvv71cIi5zcGxpdChcIlwiKTtcbmZvcihqID0gMDsgaiAhPSBEWzEzOF0ubGVuZ3RoOyArK2opIGlmKERbMTM4XVtqXS5jaGFyQ29kZUF0KDApICE9PSAweEZGRkQpIHsgZVtEWzEzOF1bal1dID0gMzUzMjggKyBqOyBkWzM1MzI4ICsgal0gPSBEWzEzOF1bal07fVxuRFsxMzldID0gXCLvv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73lqaHlqaPlqaTlqaXlqablqajlqanlqavlqazlqa3lqa7lqa/lqbDlqbHlqbLlqbPlqbjlqbnlqbvlqbzlqb3lqb7lqoDlqoHlqoLlqoPlqoTlqoXlqoblqoflqojlqonlqorlqovlqozlqo3lqo7lqo/lqpDlqpHlqpPlqpTlqpXlqpblqpflqpjlqpnlqpzlqp3lqp7lqp/lqqDlqqHlqqLlqqPlqqTlqqXlqqblqqflqqjlqqnlqqvlqqzvv73lqq3lqq7lqq/lqrDlqrHlqrTlqrblqrflqrnlqrrlqrvlqrzlqr3lqr/lq4Dlq4Plq4Tlq4Xlq4blq4flq4jlq4rlq4vlq43lq47lq4/lq5Dlq5Hlq5Plq5Xlq5flq5nlq5rlq5vlq53lq57lq5/lq6Llq6Tlq6Xlq6flq6jlq6rlq6zlq63lq67lq6/lq7Dlq7Llq7Plq7Tlq7Xlq7blq7flq7jlq7nlq7rlq7vlq7zlq73lq77lq7/lrIDlrIHlrILlrIPlrITlrIXlrIblrIflrIjlrIrlrIvlrIzlrI3lrI7lrI/lrJDlrJHlrJLlrJPlrJTlrJXlrJjlrJnlrJrlrJvlrJzlrJ3lrJ7lrJ/lrKDlrKHlrKLlrKPlrKTlrKXlrKblrKflrKjlrKnlrKrlrKvlrKzlrK3lrK7lrK/lrLDlrLHlrLPlrLXlrLblrLjlrLnlrLrlrLvlrLzlrL3lrL7lrL/lrYHlrYLlrYPlrYTlrYXlrYblrYfvv71cIi5zcGxpdChcIlwiKTtcbmZvcihqID0gMDsgaiAhPSBEWzEzOV0ubGVuZ3RoOyArK2opIGlmKERbMTM5XVtqXS5jaGFyQ29kZUF0KDApICE9PSAweEZGRkQpIHsgZVtEWzEzOV1bal1dID0gMzU1ODQgKyBqOyBkWzM1NTg0ICsgal0gPSBEWzEzOV1bal07fVxuRFsxNDBdID0gXCLvv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73lrYjlrYnlrYrlrYvlrYzlrY3lrY7lrY/lrZLlrZblrZ7lraDlraHlraflrajlravlra3lra7lra/lrbLlrbTlrbblrbflrbjlrbnlrbvlrbzlrb7lrb/lroLlroblrorlro3lro7lrpDlrpHlrpLlrpTlrpblrp/lrqflrqjlrqnlrqzlrq3lrq7lrq/lrrHlrrLlrrflrrrlrrvlrrzlr4Dlr4Hlr4Plr4jlr4nlr4rlr4vlr43lr47lr4/vv73lr5Hlr5Tlr5Xlr5blr5flr5jlr5nlr5rlr5vlr5zlr6Dlr6Llr6Plr6blr6flr6nlr6rlr6vlr6zlr63lr6/lr7Hlr7Llr7Plr7Tlr7Xlr7blr7flr73lr77lsIDlsILlsIPlsIXlsIflsIjlsIvlsIzlsI3lsI7lsJDlsJLlsJPlsJflsJnlsJvlsJ7lsJ/lsKDlsKHlsKPlsKblsKjlsKnlsKrlsKvlsK3lsK7lsK/lsLDlsLLlsLPlsLXlsLblsLflsYPlsYTlsYblsYflsYzlsY3lsZLlsZPlsZTlsZblsZflsZjlsZrlsZvlsZzlsZ3lsZ/lsaLlsaTlsaflsajlsanlsarlsavlsazlsa3lsbDlsbLlsbPlsbTlsbXlsbblsbflsbjlsbvlsbzlsb3lsb7lsoDlsoPlsoTlsoXlsoblsoflsonlsorlsovlso7lso/lspLlspPlspXlsp3lsp7lsp/lsqDlsqHlsqTlsqXlsqblsqflsqjvv71cIi5zcGxpdChcIlwiKTtcbmZvcihqID0gMDsgaiAhPSBEWzE0MF0ubGVuZ3RoOyArK2opIGlmKERbMTQwXVtqXS5jaGFyQ29kZUF0KDApICE9PSAweEZGRkQpIHsgZVtEWzE0MF1bal1dID0gMzU4NDAgKyBqOyBkWzM1ODQwICsgal0gPSBEWzE0MF1bal07fVxuRFsxNDFdID0gXCLvv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73lsqrlsq7lsq/lsrDlsrLlsrTlsrblsrnlsrrlsrvlsrzlsr7ls4Dls4Lls4Pls4Xls4bls4fls4jls4nls4rls4zls43ls47ls4/ls5Dls5Hls5Pls5Tls5Xls5bls5fls5jls5rls5vls5zls53ls57ls5/ls6Dls6Lls6Pls6fls6nls6vls6zls67ls6/ls7Hls7Lls7Pls7Tls7Xls7bls7fls7jls7nls7rls7zls73ls77ls7/ltIDvv73ltIHltITltIXltIjltInltIrltIvltIzltI3ltI/ltJDltJHltJLltJPltJXltJfltJjltJnltJrltJzltJ3ltJ/ltKDltKHltKLltKPltKXltKjltKrltKvltKzltK/ltLDltLHltLLltLPltLXltLbltLfltLjltLnltLrltLvltLzltL/ltYDltYHltYLltYPltYTltYXltYbltYjltYnltY3ltY7ltY/ltZDltZHltZLltZPltZTltZXltZbltZfltZnltZrltZzltZ7ltZ/ltaDltaHltaLltaPltaTltaXltabltafltajltarlta3lta7ltbDltbHltbLltbPltbXltbbltbfltbjltbnltbrltbvltbzltb3ltb7ltb/ltoDltoHltoPltoTltoXltobltofltojltonltorltovltozlto3lto7lto/ltpDltpHltpLltpPltpTltpXltpbltpfltpjltprltpvltpzltp7ltp/ltqDvv71cIi5zcGxpdChcIlwiKTtcbmZvcihqID0gMDsgaiAhPSBEWzE0MV0ubGVuZ3RoOyArK2opIGlmKERbMTQxXVtqXS5jaGFyQ29kZUF0KDApICE9PSAweEZGRkQpIHsgZVtEWzE0MV1bal1dID0gMzYwOTYgKyBqOyBkWzM2MDk2ICsgal0gPSBEWzE0MV1bal07fVxuRFsxNDJdID0gXCLvv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73ltqHltqLltqPltqTltqXltqbltqfltqjltqnltqrltqvltqzltq3ltq7ltq/ltrDltrHltrLltrPltrTltrXltrbltrjltrnltrrltrvltrzltr3ltr7ltr/lt4Dlt4Hlt4Llt4Plt4Tlt4blt4flt4jlt4nlt4rlt4vlt4zlt47lt4/lt5Dlt5Hlt5Llt5Plt5Tlt5Xlt5blt5flt5jlt5nlt5rlt5zlt5/lt6Dlt6Plt6Tlt6rlt6zlt63vv73lt7Dlt7Xlt7blt7jlt7nlt7rlt7vlt7zlt7/luIDluITluIfluInluIrluIvluI3luI7luJLluJPluJfluJ7luJ/luKDluKHluKLluKPluKTluKXluKjluKnluKrluKvluKzluK/luLDluLLluLPluLTluLXluLbluLnluLrluL7luL/luYDluYHluYPluYbluYfluYjluYnluYrluYvluY3luY7luY/luZDluZHluZLluZPluZbluZfluZjluZnluZrluZzluZ3luZ/luaDluaPluaTluaXluabluafluajluanluarluavluazlua3lua7lua/lubDlubHlubXlubflubnlub7luoHluoLluoPluoXluojluonluozluo3luo7lupLlupjlupvlup3luqHluqLluqPluqTluqjluqnluqrluqvluqzluq7luq/lurDlurHlurLlurTlurrlurvlurzlur3lur/lu4Dlu4Hlu4Llu4Plu4Tlu4Xvv71cIi5zcGxpdChcIlwiKTtcbmZvcihqID0gMDsgaiAhPSBEWzE0Ml0ubGVuZ3RoOyArK2opIGlmKERbMTQyXVtqXS5jaGFyQ29kZUF0KDApICE9PSAweEZGRkQpIHsgZVtEWzE0Ml1bal1dID0gMzYzNTIgKyBqOyBkWzM2MzUyICsgal0gPSBEWzE0Ml1bal07fVxuRFsxNDNdID0gXCLvv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73lu4blu4flu4jlu4vlu4zlu43lu47lu4/lu5Dlu5Tlu5Xlu5flu5jlu5nlu5rlu5zlu53lu57lu5/lu6Dlu6Hlu6Llu6Plu6Tlu6Xlu6blu6flu6nlu6vlu6zlu63lu67lu6/lu7Dlu7Hlu7Llu7Plu7Xlu7jlu7nlu7vlu7zlu73lvIXlvIblvIflvInlvIzlvI3lvI7lvJDlvJLlvJTlvJblvJnlvJrlvJzlvJ3lvJ7lvKHlvKLlvKPlvKTvv73lvKjlvKvlvKzlvK7lvLDlvLLlvLPlvLTlvLXlvLblvLflvLjlvLvlvL3lvL7lvL/lvYHlvYLlvYPlvYTlvYXlvYblvYflvYjlvYnlvYrlvYvlvYzlvY3lvY7lvY/lvZHlvZTlvZnlvZrlvZvlvZzlvZ7lvZ/lvaDlvaPlvaXlvaflvajlvavlva7lva/lvbLlvbTlvbXlvbblvbjlvbrlvb3lvb7lvb/lvoPlvoblvo3lvo7lvo/lvpHlvpPlvpTlvpblvprlvpvlvp3lvp7lvp/lvqDlvqLlvqPlvqTlvqXlvqblvqflvqnlvqvlvqzlvq/lvrDlvrHlvrLlvrPlvrTlvrblvrjlvrnlvrrlvrvlvr7lvr/lv4Dlv4Hlv4Llv4flv4jlv4rlv4vlv47lv5Plv5Tlv5Xlv5rlv5vlv5zlv57lv5/lv6Llv6Plv6Xlv6blv6jlv6nlv6zlv6/lv7Dlv7Llv7Plv7Tlv7blv7flv7nlv7rlv7zmgIfvv71cIi5zcGxpdChcIlwiKTtcbmZvcihqID0gMDsgaiAhPSBEWzE0M10ubGVuZ3RoOyArK2opIGlmKERbMTQzXVtqXS5jaGFyQ29kZUF0KDApICE9PSAweEZGRkQpIHsgZVtEWzE0M11bal1dID0gMzY2MDggKyBqOyBkWzM2NjA4ICsgal0gPSBEWzE0M11bal07fVxuRFsxNDRdID0gXCLvv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73mgIjmgInmgIvmgIzmgJDmgJHmgJPmgJfmgJjmgJrmgJ7mgJ/mgKLmgKPmgKTmgKzmgK3mgK7mgLDmgLHmgLLmgLPmgLTmgLbmgLfmgLjmgLnmgLrmgL3mgL7mgYDmgYTmgYXmgYbmgYfmgYjmgYnmgYrmgYzmgY7mgY/mgZHmgZPmgZTmgZbmgZfmgZjmgZvmgZzmgZ7mgZ/mgaDmgaHmgaXmgabmga7mgbHmgbLmgbTmgbXmgbfmgb7mgoDvv73mgoHmgoLmgoXmgobmgofmgojmgormgovmgo7mgo/mgpDmgpHmgpPmgpXmgpfmgpjmgpnmgpzmgp7mgqHmgqLmgqTmgqXmgqfmgqnmgqrmgq7mgrDmgrPmgrXmgrbmgrfmgrnmgrrmgr3mgr7mgr/mg4Dmg4Hmg4Lmg4Pmg4Tmg4fmg4jmg4nmg4zmg43mg47mg4/mg5Dmg5Lmg5Pmg5Tmg5bmg5fmg5nmg5vmg57mg6Hmg6Lmg6Pmg6Tmg6Xmg6rmg7Hmg7Lmg7Xmg7fmg7jmg7vmg7zmg73mg77mg7/mhILmhIPmhITmhIXmhIfmhIrmhIvmhIzmhJDmhJHmhJLmhJPmhJTmhJbmhJfmhJjmhJnmhJvmhJzmhJ3mhJ7mhKHmhKLmhKXmhKjmhKnmhKrmhKzmhK3mhK7mhK/mhLDmhLHmhLLmhLPmhLTmhLXmhLbmhLfmhLjmhLnmhLrmhLvmhLzmhL3mhL7mhYDmhYHmhYLmhYPmhYTmhYXmhYbvv71cIi5zcGxpdChcIlwiKTtcbmZvcihqID0gMDsgaiAhPSBEWzE0NF0ubGVuZ3RoOyArK2opIGlmKERbMTQ0XVtqXS5jaGFyQ29kZUF0KDApICE9PSAweEZGRkQpIHsgZVtEWzE0NF1bal1dID0gMzY4NjQgKyBqOyBkWzM2ODY0ICsgal0gPSBEWzE0NF1bal07fVxuRFsxNDVdID0gXCLvv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73mhYfmhYnmhYvmhY3mhY/mhZDmhZLmhZPmhZTmhZbmhZfmhZjmhZnmhZrmhZvmhZzmhZ7mhZ/mhaDmhaHmhaPmhaTmhaXmhabmhanmharmhavmhazmha3mha7mha/mhbHmhbLmhbPmhbTmhbbmhbjmhbnmhbrmhbvmhbzmhb3mhb7mhb/mhoDmhoHmhoLmhoPmhoTmhoXmhobmhofmhojmhonmhormhozmho3mho/mhpDmhpHmhpLmhpPmhpXvv73mhpbmhpfmhpjmhpnmhprmhpvmhpzmhp7mhp/mhqDmhqHmhqLmhqPmhqTmhqXmhqbmhqrmhqvmhq3mhq7mhq/mhrDmhrHmhrLmhrPmhrTmhrXmhrbmhrjmhrnmhrrmhrvmhrzmhr3mhr/mh4Dmh4Hmh4Pmh4Tmh4Xmh4bmh4fmh4nmh4zmh43mh47mh4/mh5Dmh5Pmh5Xmh5bmh5fmh5jmh5nmh5rmh5vmh5zmh53mh57mh5/mh6Dmh6Hmh6Lmh6Pmh6Tmh6Xmh6fmh6jmh6nmh6rmh6vmh6zmh63mh67mh6/mh7Dmh7Hmh7Lmh7Pmh7Tmh7bmh7fmh7jmh7nmh7rmh7vmh7zmh73mh77miIDmiIHmiILmiIPmiITmiIXmiIfmiInmiJPmiJTmiJnmiJzmiJ3miJ7miKDmiKPmiKbmiKfmiKjmiKnmiKvmiK3miK/miLDmiLHmiLLmiLXmiLbmiLjmiLnmiLrmiLvmiLzmiYLmiYTmiYXmiYbmiYrvv71cIi5zcGxpdChcIlwiKTtcbmZvcihqID0gMDsgaiAhPSBEWzE0NV0ubGVuZ3RoOyArK2opIGlmKERbMTQ1XVtqXS5jaGFyQ29kZUF0KDApICE9PSAweEZGRkQpIHsgZVtEWzE0NV1bal1dID0gMzcxMjAgKyBqOyBkWzM3MTIwICsgal0gPSBEWzE0NV1bal07fVxuRFsxNDZdID0gXCLvv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73miY/miZDmiZXmiZbmiZfmiZnmiZrmiZzmiZ3miZ7miZ/miaDmiaHmiaLmiaTmiaXmiajmibHmibLmibTmibXmibfmibjmibrmibvmib3mioHmioLmioPmioXmiobmiofmiojmiovmiozmio3mio7mio/mipDmipTmipnmipzmip3mip7miqPmiqbmiqfmiqnmiqrmiq3miq7miq/mirDmirLmirPmirTmirbmirfmirjmirrmir7mi4Dmi4Hvv73mi4Pmi4vmi4/mi5Hmi5Xmi53mi57mi6Dmi6Hmi6Tmi6rmi6vmi7Dmi7Lmi7Xmi7jmi7nmi7rmi7vmjIDmjIPmjITmjIXmjIbmjIrmjIvmjIzmjI3mjI/mjJDmjJLmjJPmjJTmjJXmjJfmjJjmjJnmjJzmjKbmjKfmjKnmjKzmjK3mjK7mjLDmjLHmjLPmjLTmjLXmjLbmjLfmjLjmjLvmjLzmjL7mjL/mjYDmjYHmjYTmjYfmjYjmjYrmjZHmjZLmjZPmjZTmjZbmjZfmjZjmjZnmjZrmjZvmjZzmjZ3mjaDmjaTmjaXmjabmjajmjarmjavmjazmja/mjbDmjbLmjbPmjbTmjbXmjbjmjbnmjbzmjb3mjb7mjb/mjoHmjoPmjoTmjoXmjobmjovmjo3mjpHmjpPmjpTmjpXmjpfmjpnmjprmjpvmjpzmjp3mjp7mjp/mjqHmjqTmjqbmjqvmjq/mjrHmjrLmjrXmjrbmjrnmjrvmjr3mjr/mj4Dvv71cIi5zcGxpdChcIlwiKTtcbmZvcihqID0gMDsgaiAhPSBEWzE0Nl0ubGVuZ3RoOyArK2opIGlmKERbMTQ2XVtqXS5jaGFyQ29kZUF0KDApICE9PSAweEZGRkQpIHsgZVtEWzE0Nl1bal1dID0gMzczNzYgKyBqOyBkWzM3Mzc2ICsgal0gPSBEWzE0Nl1bal07fVxuRFsxNDddID0gXCLvv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73mj4Hmj4Lmj4Pmj4Xmj4fmj4jmj4rmj4vmj4zmj5Hmj5Pmj5Tmj5Xmj5fmj5jmj5nmj5rmj5vmj5zmj53mj5/mj6Lmj6Tmj6Xmj6bmj6fmj6jmj6vmj6zmj67mj6/mj7Dmj7Hmj7Pmj7Xmj7fmj7nmj7rmj7vmj7zmj77mkIPmkITmkIbmkIfmkIjmkInmkIrmkI3mkI7mkJHmkJLmkJXmkJbmkJfmkJjmkJnmkJrmkJ3mkJ/mkKLmkKPmkKTvv73mkKXmkKfmkKjmkKnmkKvmkK7mkK/mkLDmkLHmkLLmkLPmkLXmkLbmkLfmkLjmkLnmkLvmkLzmkL7mkYDmkYLmkYPmkYnmkYvmkYzmkY3mkY7mkY/mkZDmkZHmkZPmkZXmkZbmkZfmkZnmkZrmkZvmkZzmkZ3mkZ/mkaDmkaHmkaLmkaPmkaTmkaXmkabmkajmkarmkavmkazmka7mka/mkbDmkbHmkbLmkbPmkbTmkbXmkbbmkbfmkbvmkbzmkb3mkb7mkb/mkoDmkoHmkoPmkobmkojmkonmkormkovmkozmko3mko7mko/mkpDmkpPmkpTmkpfmkpjmkprmkpvmkpzmkp3mkp/mkqDmkqHmkqLmkqPmkqXmkqbmkqfmkqjmkqrmkqvmkq/mkrHmkrLmkrPmkrTmkrbmkrnmkrvmkr3mkr7mkr/mk4Hmk4Pmk4Tmk4bmk4fmk4jmk4nmk4rmk4vmk4zmk4/mk5Hmk5Pmk5Tmk5Xmk5bmk5nmk5rvv71cIi5zcGxpdChcIlwiKTtcbmZvcihqID0gMDsgaiAhPSBEWzE0N10ubGVuZ3RoOyArK2opIGlmKERbMTQ3XVtqXS5jaGFyQ29kZUF0KDApICE9PSAweEZGRkQpIHsgZVtEWzE0N11bal1dID0gMzc2MzIgKyBqOyBkWzM3NjMyICsgal0gPSBEWzE0N11bal07fVxuRFsxNDhdID0gXCLvv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73mk5vmk5zmk53mk5/mk6Dmk6Hmk6Pmk6Xmk6fmk6jmk6nmk6rmk6vmk6zmk63mk67mk6/mk7Dmk7Hmk7Lmk7Pmk7Tmk7Xmk7bmk7fmk7jmk7nmk7rmk7vmk7zmk73mk77mk7/mlIHmlILmlIPmlITmlIXmlIbmlIfmlIjmlIrmlIvmlIzmlI3mlI7mlI/mlJDmlJHmlJPmlJTmlJXmlJbmlJfmlJnmlJrmlJvmlJzmlJ3mlJ7mlJ/mlKDmlKHvv73mlKLmlKPmlKTmlKbmlKfmlKjmlKnmlKrmlKzmlK3mlLDmlLHmlLLmlLPmlLfmlLrmlLzmlL3mlYDmlYHmlYLmlYPmlYTmlYbmlYfmlYrmlYvmlY3mlY7mlZDmlZLmlZPmlZTmlZfmlZjmlZrmlZzmlZ/mlaDmlaHmlaTmlaXmlafmlajmlanmlarmla3mla7mla/mlbHmlbPmlbXmlbbmlbjmlbnmlbrmlbvmlbzmlb3mlb7mlb/mloDmloHmloLmloPmloTmloXmlobmlojmlonmlormlo3mlo7mlo/mlpLmlpTmlpXmlpbmlpjmlprmlp3mlp7mlqDmlqLmlqPmlqbmlqjmlqrmlqzmlq7mlrHmlrLmlrPmlrTmlrXmlrbmlrfmlrjmlrrmlrvmlr7mlr/ml4Dml4Lml4fml4jml4nml4rml43ml5Dml5Hml5Pml5Tml5Xml5jml5nml5rml5vml5zml53ml57ml5/ml6Hml6Pml6Tml6rml6vvv71cIi5zcGxpdChcIlwiKTtcbmZvcihqID0gMDsgaiAhPSBEWzE0OF0ubGVuZ3RoOyArK2opIGlmKERbMTQ4XVtqXS5jaGFyQ29kZUF0KDApICE9PSAweEZGRkQpIHsgZVtEWzE0OF1bal1dID0gMzc4ODggKyBqOyBkWzM3ODg4ICsgal0gPSBEWzE0OF1bal07fVxuRFsxNDldID0gXCLvv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73ml7Lml7Pml7Tml7Xml7jml7nml7vml7zml73ml77ml7/mmIHmmITmmIXmmIfmmIjmmInmmIvmmI3mmJDmmJHmmJLmmJbmmJfmmJjmmJrmmJvmmJzmmJ7mmKHmmKLmmKPmmKTmmKbmmKnmmKrmmKvmmKzmmK7mmLDmmLLmmLPmmLfmmLjmmLnmmLrmmLvmmL3mmL/mmYDmmYLmmYTmmYXmmYbmmYfmmYjmmYnmmYrmmY3mmY7mmZDmmZHmmZjvv73mmZnmmZvmmZzmmZ3mmZ7mmaDmmaLmmaPmmaXmmafmmanmmarmmavmmazmma3mmbHmmbLmmbPmmbXmmbjmmbnmmbvmmbzmmb3mmb/mmoDmmoHmmoPmmoXmmobmmojmmonmmormmovmmo3mmo7mmo/mmpDmmpLmmpPmmpTmmpXmmpjmmpnmmprmmpvmmpzmmp7mmp/mmqDmmqHmmqLmmqPmmqTmmqXmmqbmmqnmmqrmmqvmmqzmmq3mmq/mmrDmmrHmmrLmmrPmmrXmmrbmmrfmmrjmmrrmmrvmmrzmmr3mmr/mm4Dmm4Hmm4Lmm4Pmm4Tmm4Xmm4bmm4fmm4jmm4nmm4rmm4vmm4zmm43mm47mm4/mm5Dmm5Hmm5Lmm5Pmm5Tmm5Xmm5bmm5fmm5jmm5rmm57mm5/mm6Dmm6Hmm6Lmm6Pmm6Tmm6Xmm6fmm6jmm6rmm6vmm6zmm63mm67mm6/mm7Hmm7Xmm7bmm7jmm7rmm7vmm73mnIHmnILmnIPvv71cIi5zcGxpdChcIlwiKTtcbmZvcihqID0gMDsgaiAhPSBEWzE0OV0ubGVuZ3RoOyArK2opIGlmKERbMTQ5XVtqXS5jaGFyQ29kZUF0KDApICE9PSAweEZGRkQpIHsgZVtEWzE0OV1bal1dID0gMzgxNDQgKyBqOyBkWzM4MTQ0ICsgal0gPSBEWzE0OV1bal07fVxuRFsxNTBdID0gXCLvv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73mnITmnIXmnIbmnIfmnIzmnI7mnI/mnJHmnJLmnJPmnJbmnJjmnJnmnJrmnJzmnJ7mnKDmnKHmnKLmnKPmnKTmnKXmnKfmnKnmnK7mnLDmnLLmnLPmnLbmnLfmnLjmnLnmnLvmnLzmnL7mnL/mnYHmnYTmnYXmnYfmnYrmnYvmnY3mnZLmnZTmnZXmnZfmnZjmnZnmnZrmnZvmnZ3mnaLmnaPmnaTmnabmnafmnavmnazmna7mnbHmnbTmnbbvv73mnbjmnbnmnbrmnbvmnb3mnoDmnoLmnoPmnoXmnobmnojmnormnozmno3mno7mno/mnpHmnpLmnpPmnpTmnpbmnpnmnpvmnp/mnqDmnqHmnqTmnqbmnqnmnqzmnq7mnrHmnrLmnrTmnrnmnrrmnrvmnrzmnr3mnr7mnr/mn4Dmn4Lmn4Xmn4bmn4fmn4jmn4nmn4rmn4vmn4zmn43mn47mn5Xmn5bmn5fmn5vmn5/mn6Hmn6Pmn6Tmn6bmn6fmn6jmn6rmn6vmn63mn67mn7Lmn7Xmn7bmn7fmn7jmn7nmn7rmn7vmn7zmn77moIHmoILmoIPmoITmoIbmoI3moJDmoJLmoJTmoJXmoJjmoJnmoJrmoJvmoJzmoJ7moJ/moKDmoKLmoKPmoKTmoKXmoKbmoKfmoKjmoKvmoKzmoK3moK7moK/moLDmoLHmoLTmoLXmoLbmoLrmoLvmoL/moYfmoYvmoY3moY/moZLmoZbmoZfmoZjmoZnmoZrmoZvvv71cIi5zcGxpdChcIlwiKTtcbmZvcihqID0gMDsgaiAhPSBEWzE1MF0ubGVuZ3RoOyArK2opIGlmKERbMTUwXVtqXS5jaGFyQ29kZUF0KDApICE9PSAweEZGRkQpIHsgZVtEWzE1MF1bal1dID0gMzg0MDAgKyBqOyBkWzM4NDAwICsgal0gPSBEWzE1MF1bal07fVxuRFsxNTFdID0gXCLvv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73moZzmoZ3moZ7moZ/moarmoazmoa3moa7moa/mobDmobHmobLmobPmobXmobjmobnmobrmobvmobzmob3mob7mob/mooDmooLmooTmoofmoojmoonmoormoovmoozmoo3moo7mopDmopHmopLmopTmopXmopbmopjmopnmoprmopvmopzmop3mop7mop/moqDmoqHmoqPmoqTmoqXmoqnmoqrmoqvmoqzmoq7morHmorLmorTmorbmorfmorjvv73mornmorrmorvmorzmor3mor7mor/mo4Hmo4Pmo4Tmo4Xmo4bmo4fmo4jmo4rmo4zmo47mo4/mo5Dmo5Hmo5Pmo5Tmo5bmo5fmo5nmo5vmo5zmo53mo57mo5/mo6Hmo6Lmo6Tmo6Xmo6bmo6fmo6jmo6nmo6rmo6vmo6zmo63mo6/mo7Lmo7Pmo7Tmo7bmo7fmo7jmo7vmo73mo77mo7/mpIDmpILmpIPmpITmpIbmpIfmpIjmpInmpIrmpIzmpI/mpJHmpJPmpJTmpJXmpJbmpJfmpJjmpJnmpJrmpJvmpJzmpJ3mpJ7mpKHmpKLmpKPmpKXmpKbmpKfmpKjmpKnmpKrmpKvmpKzmpK7mpK/mpLHmpLLmpLPmpLXmpLbmpLfmpLjmpLrmpLvmpLzmpL7mpYDmpYHmpYPmpYTmpYXmpYbmpYfmpYjmpYnmpYrmpYvmpYzmpY3mpY7mpY/mpZDmpZHmpZLmpZPmpZXmpZbmpZjmpZnmpZvmpZzmpZ/vv71cIi5zcGxpdChcIlwiKTtcbmZvcihqID0gMDsgaiAhPSBEWzE1MV0ubGVuZ3RoOyArK2opIGlmKERbMTUxXVtqXS5jaGFyQ29kZUF0KDApICE9PSAweEZGRkQpIHsgZVtEWzE1MV1bal1dID0gMzg2NTYgKyBqOyBkWzM4NjU2ICsgal0gPSBEWzE1MV1bal07fVxuRFsxNTJdID0gXCLvv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73mpaHmpaLmpaTmpaXmpafmpajmpanmparmpazmpa3mpa/mpbDmpbLmpbPmpbTmpbXmpbbmpbrmpbvmpb3mpb7mpb/mpoHmpoPmpoXmpormpovmpozmpo7mpo/mppDmppHmppLmppPmppbmppfmppnmpprmpp3mpp7mpp/mpqDmpqHmpqLmpqPmpqTmpqXmpqbmpqnmpqrmpqzmpq7mpq/mprDmprLmprPmprXmprbmprjmprnmprrmprzmpr3vv73mpr7mpr/mp4Dmp4Lmp4Pmp4Tmp4Xmp4bmp4fmp4jmp4nmp4vmp43mp4/mp5Hmp5Lmp5Pmp5Xmp5bmp5fmp5jmp5nmp5rmp5zmp53mp57mp6Hmp6Lmp6Pmp6Tmp6Xmp6bmp6fmp6jmp6nmp6rmp6vmp6zmp67mp6/mp7Dmp7Hmp7Pmp7Tmp7Xmp7bmp7fmp7jmp7nmp7rmp7vmp7zmp77mqIDmqIHmqILmqIPmqITmqIXmqIbmqIfmqIjmqInmqIvmqIzmqI3mqI7mqI/mqJDmqJHmqJLmqJPmqJTmqJXmqJbmqJnmqJrmqJvmqJzmqJ3mqJ7mqKDmqKLmqKPmqKTmqKXmqKbmqKfmqKnmqKvmqKzmqK3mqK7mqLDmqLLmqLPmqLTmqLbmqLfmqLjmqLnmqLrmqLvmqLzmqL/mqYDmqYHmqYLmqYPmqYXmqYbmqYjmqYnmqYrmqYvmqYzmqY3mqY7mqY/mqZHmqZLmqZPmqZTmqZXmqZbmqZfmqZrvv71cIi5zcGxpdChcIlwiKTtcbmZvcihqID0gMDsgaiAhPSBEWzE1Ml0ubGVuZ3RoOyArK2opIGlmKERbMTUyXVtqXS5jaGFyQ29kZUF0KDApICE9PSAweEZGRkQpIHsgZVtEWzE1Ml1bal1dID0gMzg5MTIgKyBqOyBkWzM4OTEyICsgal0gPSBEWzE1Ml1bal07fVxuRFsxNTNdID0gXCLvv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73mqZzmqZ3mqZ7mqZ/mqaDmqaLmqaPmqaTmqabmqafmqajmqanmqarmqavmqazmqa3mqa7mqa/mqbDmqbLmqbPmqbTmqbXmqbbmqbfmqbjmqbrmqbvmqb3mqb7mqb/mqoHmqoLmqoPmqoXmqobmqofmqojmqonmqormqovmqozmqo3mqo/mqpLmqpPmqpTmqpXmqpbmqpjmqpnmqprmqpvmqpzmqp3mqp7mqp/mqqHmqqLmqqPmqqTmqqXmqqbvv73mqqfmqqjmqqrmqq3mqq7mqq/mqrDmqrHmqrLmqrPmqrTmqrXmqrbmqrfmqrjmqrnmqrrmqrvmqrzmqr3mqr7mqr/mq4Dmq4Hmq4Lmq4Pmq4Tmq4Xmq4bmq4fmq4jmq4nmq4rmq4vmq4zmq43mq47mq4/mq5Dmq5Hmq5Lmq5Pmq5Tmq5Xmq5bmq5fmq5jmq5nmq5rmq5vmq5zmq53mq57mq5/mq6Dmq6Hmq6Lmq6Pmq6Tmq6Xmq6bmq6fmq6jmq6nmq6rmq6vmq6zmq63mq67mq6/mq7Dmq7Hmq7Lmq7Pmq7Tmq7Xmq7bmq7fmq7jmq7nmq7rmq7vmq7zmq73mq77mq7/mrIDmrIHmrILmrIPmrITmrIXmrIbmrIfmrIjmrInmrIrmrIvmrIzmrI3mrI7mrI/mrJDmrJHmrJLmrJPmrJTmrJXmrJbmrJfmrJjmrJnmrJrmrJvmrJzmrJ3mrJ7mrJ/mrKXmrKbmrKjmrKnmrKrmrKvmrKzmrK3mrK7vv71cIi5zcGxpdChcIlwiKTtcbmZvcihqID0gMDsgaiAhPSBEWzE1M10ubGVuZ3RoOyArK2opIGlmKERbMTUzXVtqXS5jaGFyQ29kZUF0KDApICE9PSAweEZGRkQpIHsgZVtEWzE1M11bal1dID0gMzkxNjggKyBqOyBkWzM5MTY4ICsgal0gPSBEWzE1M11bal07fVxuRFsxNTRdID0gXCLvv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73mrK/mrLDmrLHmrLPmrLTmrLXmrLbmrLjmrLvmrLzmrL3mrL/mrYDmrYHmrYLmrYTmrYXmrYjmrYrmrYvmrY3mrY7mrY/mrZDmrZHmrZLmrZPmrZTmrZXmrZbmrZfmrZjmrZrmrZvmrZzmrZ3mrZ7mrZ/mraDmraHmrajmranmravmrazmra3mra7mra/mrbDmrbHmrbLmrbPmrbTmrbXmrbbmrbfmrbjmrbrmrb3mrb7mrb/mroDmroXmrojvv73mrozmro7mro/mrpDmrpHmrpTmrpXmrpfmrpjmrpnmrpzmrp3mrp7mrp/mrqDmrqLmrqPmrqTmrqXmrqbmrqfmrqjmrqnmrqvmrqzmrq3mrq7mrq/mrrDmrrHmrrLmrrbmrrjmrrnmrrrmrrvmrrzmrr3mrr7mr4Dmr4Pmr4Tmr4bmr4fmr4jmr4nmr4rmr4zmr47mr5Dmr5Hmr5jmr5rmr5zmr53mr57mr5/mr6Dmr6Lmr6Pmr6Tmr6Xmr6bmr6fmr6jmr6nmr6zmr63mr67mr7Dmr7Hmr7Lmr7Tmr7bmr7fmr7jmr7rmr7vmr7zmr77mr7/msIDmsIHmsILmsIPmsITmsIjmsInmsIrmsIvmsIzmsI7msJLmsJfmsJzmsJ3msJ7msKDmsKPmsKXmsKvmsKzmsK3msLHmsLPmsLbmsLfmsLnmsLrmsLvmsLzmsL7msL/msYPmsYTmsYXmsYjmsYvmsYzmsY3msY7msY/msZHmsZLmsZPmsZbmsZjvv71cIi5zcGxpdChcIlwiKTtcbmZvcihqID0gMDsgaiAhPSBEWzE1NF0ubGVuZ3RoOyArK2opIGlmKERbMTU0XVtqXS5jaGFyQ29kZUF0KDApICE9PSAweEZGRkQpIHsgZVtEWzE1NF1bal1dID0gMzk0MjQgKyBqOyBkWzM5NDI0ICsgal0gPSBEWzE1NF1bal07fVxuRFsxNTVdID0gXCLvv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73msZnmsZrmsaLmsaPmsaXmsabmsafmsavmsazmsa3msa7msa/msbHmsbPmsbXmsbfmsbjmsbrmsbvmsbzmsb/msoDmsoTmsofmsormsovmso3mso7mspHmspLmspXmspbmspfmspjmsprmspzmsp3msp7msqDmsqLmsqjmsqzmsq/msrDmsrTmsrXmsrbmsrfmsrrms4Dms4Hms4Lms4Pms4bms4fms4jms4vms43ms47ms4/ms5Hms5Lms5jvv73ms5nms5rms5zms53ms5/ms6Tms6bms6fms6nms6zms63ms7Lms7Tms7nms7/mtIDmtILmtIPmtIXmtIbmtIjmtInmtIrmtI3mtI/mtJDmtJHmtJPmtJTmtJXmtJbmtJjmtJzmtJ3mtJ/mtKDmtKHmtKLmtKPmtKTmtKbmtKjmtKnmtKzmtK3mtK/mtLDmtLTmtLbmtLfmtLjmtLrmtL/mtYDmtYLmtYTmtYnmtYzmtZDmtZXmtZbmtZfmtZjmtZvmtZ3mtZ/mtaHmtaLmtaTmtaXmtafmtajmtavmtazmta3mtbDmtbHmtbLmtbPmtbXmtbbmtbnmtbrmtbvmtb3mtb7mtb/mtoDmtoHmtoPmtoTmtobmtofmtormtovmto3mto/mtpDmtpLmtpbmtpfmtpjmtpnmtprmtpzmtqLmtqXmtqzmtq3mtrDmtrHmtrPmtrTmtrbmtrfmtrnmtrrmtrvmtrzmtr3mtr7mt4Hmt4Lmt4Pmt4jmt4nmt4rvv71cIi5zcGxpdChcIlwiKTtcbmZvcihqID0gMDsgaiAhPSBEWzE1NV0ubGVuZ3RoOyArK2opIGlmKERbMTU1XVtqXS5jaGFyQ29kZUF0KDApICE9PSAweEZGRkQpIHsgZVtEWzE1NV1bal1dID0gMzk2ODAgKyBqOyBkWzM5NjgwICsgal0gPSBEWzE1NV1bal07fVxuRFsxNTZdID0gXCLvv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73mt43mt47mt4/mt5Dmt5Lmt5Pmt5Tmt5Xmt5fmt5rmt5vmt5zmt5/mt6Lmt6Pmt6Xmt6fmt6jmt6nmt6rmt63mt6/mt7Dmt7Lmt7Tmt7Xmt7bmt7jmt7rmt73mt77mt7/muIDmuIHmuILmuIPmuITmuIbmuIfmuIjmuInmuIvmuI/muJLmuJPmuJXmuJjmuJnmuJvmuJzmuJ7muJ/muKLmuKbmuKfmuKjmuKrmuKzmuK7muLDmuLHmuLPmuLXvv73muLbmuLfmuLnmuLvmuLzmuL3muL7muL/muYDmuYHmuYLmuYXmuYbmuYfmuYjmuYnmuYrmuYvmuYzmuY/muZDmuZHmuZLmuZXmuZfmuZnmuZrmuZzmuZ3muZ7muaDmuaHmuaLmuaPmuaTmuaXmuabmuafmuajmuanmuarmuazmua3mua/mubDmubHmubLmubPmubTmubXmubbmubfmubjmubnmubrmubvmubzmub3muoDmuoHmuoLmuoTmuofmuojmuormuovmuozmuo3muo7mupHmupLmupPmupTmupXmupbmupfmupnmuprmupvmup3mup7muqDmuqHmuqPmuqTmuqbmuqjmuqnmuqvmuqzmuq3muq7murDmurPmurXmurjmurnmurzmur7mur/mu4Dmu4Pmu4Tmu4Xmu4bmu4jmu4nmu4rmu4zmu43mu47mu5Dmu5Lmu5bmu5jmu5nmu5vmu5zmu53mu6Pmu6fmu6rmu6vmu6zmu63mu67mu6/vv71cIi5zcGxpdChcIlwiKTtcbmZvcihqID0gMDsgaiAhPSBEWzE1Nl0ubGVuZ3RoOyArK2opIGlmKERbMTU2XVtqXS5jaGFyQ29kZUF0KDApICE9PSAweEZGRkQpIHsgZVtEWzE1Nl1bal1dID0gMzk5MzYgKyBqOyBkWzM5OTM2ICsgal0gPSBEWzE1Nl1bal07fVxuRFsxNTddID0gXCLvv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73mu7Dmu7Hmu7Lmu7Pmu7Xmu7bmu7fmu7jmu7rmu7vmu7zmu73mu77mu7/mvIDmvIHmvIPmvITmvIXmvIfmvIjmvIrmvIvmvIzmvI3mvI7mvJDmvJHmvJLmvJbmvJfmvJjmvJnmvJrmvJvmvJzmvJ3mvJ7mvJ/mvKHmvKLmvKPmvKXmvKbmvKfmvKjmvKzmvK7mvLDmvLLmvLTmvLXmvLfmvLjmvLnmvLrmvLvmvLzmvL3mvL/mvYDmvYHmvYLvv73mvYPmvYTmvYXmvYjmvYnmvYrmvYzmvY7mvY/mvZDmvZHmvZLmvZPmvZTmvZXmvZbmvZfmvZnmvZrmvZvmvZ3mvZ/mvaDmvaHmvaPmvaTmvaXmvafmvajmvanmvarmvavmvazmva/mvbDmvbHmvbPmvbXmvbbmvbfmvbnmvbvmvb3mvb7mvb/mvoDmvoHmvoLmvoPmvoXmvobmvofmvormvovmvo/mvpDmvpHmvpLmvpPmvpTmvpXmvpbmvpfmvpjmvpnmvprmvpvmvp3mvp7mvp/mvqDmvqLmvqPmvqTmvqXmvqbmvqjmvqnmvqrmvqvmvqzmvq3mvq7mvq/mvrDmvrHmvrLmvrTmvrXmvrfmvrjmvrrmvrvmvrzmvr3mvr7mvr/mv4Hmv4Pmv4Tmv4Xmv4bmv4fmv4jmv4rmv4vmv4zmv43mv47mv4/mv5Dmv5Pmv5Tmv5Xmv5bmv5fmv5jmv5nmv5rmv5vmv5zmv53mv5/mv6Lmv6Pmv6Tmv6Xvv71cIi5zcGxpdChcIlwiKTtcbmZvcihqID0gMDsgaiAhPSBEWzE1N10ubGVuZ3RoOyArK2opIGlmKERbMTU3XVtqXS5jaGFyQ29kZUF0KDApICE9PSAweEZGRkQpIHsgZVtEWzE1N11bal1dID0gNDAxOTIgKyBqOyBkWzQwMTkyICsgal0gPSBEWzE1N11bal07fVxuRFsxNThdID0gXCLvv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73mv6bmv6fmv6jmv6nmv6rmv6vmv6zmv63mv7Dmv7Hmv7Lmv7Pmv7Tmv7Xmv7bmv7fmv7jmv7nmv7rmv7vmv7zmv73mv77mv7/ngIDngIHngILngIPngITngIXngIbngIfngIjngInngIrngIvngIzngI3ngI7ngI/ngJDngJLngJPngJTngJXngJbngJfngJjngJnngJzngJ3ngJ7ngJ/ngKDngKHngKLngKTngKXngKbngKfngKjngKnngKrvv73ngKvngKzngK3ngK7ngK/ngLDngLHngLLngLPngLTngLbngLfngLjngLrngLvngLzngL3ngL7ngL/ngYDngYHngYLngYPngYTngYXngYbngYfngYjngYnngYrngYvngY3ngY7ngZDngZHngZLngZPngZTngZXngZbngZfngZjngZnngZrngZvngZzngZ3ngZ/ngaDngaHngaLngaPngaTngaXngabngafngajnganngarnga7ngbHngbLngbPngbTngbfngbnngbrngbvngb3ngoHngoLngoPngoTngobngofngojngovngozngo3ngo/ngpDngpHngpPngpfngpjngprngpvngp7ngp/ngqDngqHngqLngqPngqTngqXngqbngqfngqjngqnngqrngrDngrLngrTngrXngrbngrrngr7ngr/ng4Tng4Xng4bng4fng4nng4vng4zng43ng47ng4/ng5Dng5Hng5Lng5Png5Tng5Xng5bng5fng5rvv71cIi5zcGxpdChcIlwiKTtcbmZvcihqID0gMDsgaiAhPSBEWzE1OF0ubGVuZ3RoOyArK2opIGlmKERbMTU4XVtqXS5jaGFyQ29kZUF0KDApICE9PSAweEZGRkQpIHsgZVtEWzE1OF1bal1dID0gNDA0NDggKyBqOyBkWzQwNDQ4ICsgal0gPSBEWzE1OF1bal07fVxuRFsxNTldID0gXCLvv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73ng5zng53ng57ng6Dng6Hng6Lng6Png6Xng6rng67ng7Dng7Hng7Lng7Png7Tng7Xng7bng7jng7rng7vng7zng77ng7/nhIDnhIHnhILnhIPnhITnhIXnhIbnhIfnhIjnhIvnhIznhI3nhI7nhI/nhJHnhJLnhJTnhJfnhJvnhJznhJ3nhJ7nhJ/nhKDnhKHnhKLnhKPnhKTnhKXnhKfnhKjnhKnnhKrnhKvnhKznhK3nhK7nhLLnhLPnhLTvv73nhLXnhLfnhLjnhLnnhLrnhLvnhLznhL3nhL7nhL/nhYDnhYHnhYLnhYPnhYTnhYbnhYfnhYjnhYnnhYvnhY3nhY/nhZDnhZHnhZLnhZPnhZTnhZXnhZbnhZfnhZjnhZnnhZrnhZvnhZ3nhZ/nhaDnhaHnhaLnhaPnhaXnhannharnhavnhaznha3nha/nhbDnhbHnhbTnhbXnhbbnhbfnhbnnhbvnhbznhb7nhb/nhoDnhoHnhoLnhoPnhoXnhobnhofnhojnhonnhovnhoznho3nho7nhpDnhpHnhpLnhpPnhpXnhpbnhpfnhprnhpvnhpznhp3nhp7nhqHnhqLnhqPnhqTnhqXnhqbnhqfnhqnnhqrnhqvnhq3nhq7nhq/nhrDnhrHnhrLnhrTnhrbnhrfnhrjnhrrnhrvnhrznhr3nhr7nhr/nh4Dnh4Hnh4Lnh4Tnh4Xnh4bnh4fnh4jnh4nnh4rnh4vnh4znh43nh4/nh5Dnh5Hnh5Lnh5Pvv71cIi5zcGxpdChcIlwiKTtcbmZvcihqID0gMDsgaiAhPSBEWzE1OV0ubGVuZ3RoOyArK2opIGlmKERbMTU5XVtqXS5jaGFyQ29kZUF0KDApICE9PSAweEZGRkQpIHsgZVtEWzE1OV1bal1dID0gNDA3MDQgKyBqOyBkWzQwNzA0ICsgal0gPSBEWzE1OV1bal07fVxuRFsxNjBdID0gXCLvv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73nh5bnh5fnh5jnh5nnh5rnh5vnh5znh53nh57nh5/nh6Hnh6Lnh6Pnh6Tnh6bnh6jnh6nnh6rnh6vnh6znh63nh6/nh7Dnh7Hnh7Lnh7Pnh7Tnh7Xnh7bnh7fnh7jnh7rnh7vnh7znh73nh77nh7/niIDniIHniILniIPniITniIXniIfniIjniInniIrniIvniIzniI3niI7niI/niJDniJHniJLniJPniJTniJXniJbniJfniJjniJnniJrvv73niJvniJzniJ7niJ/niKDniKHniKLniKPniKTniKXniKbniKfniKnniKvniK3niK7niK/niLLniLPniLTniLrniLzniL7niYDniYHniYLniYPniYTniYXniYbniYnniYrniYvniY7niY/niZDniZHniZPniZTniZXniZfniZjniZrniZzniZ7niaDniaPniaTniaXniajniarniavniaznia3nibDnibHnibPnibTnibbnibfnibjnibvnibznib3nioLnioPnioXniobniofniojnionnioznio7nipDnipHnipPnipTnipXnipbnipfnipjnipnniprnipvnipznip3nip7niqDniqHniqLniqPniqTniqXniqbniqfniqjniqnniqrniqvniq7nirHnirLnirPnirXnirrnirvnirznir3nir7nir/ni4Dni4Xni4bni4fni4nni4rni4vni4zni4/ni5Hni5Pni5Tni5Xni5bni5jni5rni5vvv71cIi5zcGxpdChcIlwiKTtcbmZvcihqID0gMDsgaiAhPSBEWzE2MF0ubGVuZ3RoOyArK2opIGlmKERbMTYwXVtqXS5jaGFyQ29kZUF0KDApICE9PSAweEZGRkQpIHsgZVtEWzE2MF1bal1dID0gNDA5NjAgKyBqOyBkWzQwOTYwICsgal0gPSBEWzE2MF1bal07fVxuRFsxNjFdID0gXCLvv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73jgIDjgIHjgILCt8uJy4fCqOOAg+OAheKAlO+9nuKAluKApuKAmOKAmeKAnOKAneOAlOOAleOAiOOAieOAiuOAi+OAjOOAjeOAjuOAj+OAluOAl+OAkOOAkcKxw5fDt+KItuKIp+KIqOKIkeKIj+KIquKIqeKIiOKIt+KImuKKpeKIpeKIoOKMkuKKmeKIq+KIruKJoeKJjOKJiOKIveKIneKJoOKJruKJr+KJpOKJpeKInuKIteKItOKZguKZgMKw4oCy4oCz4oSD77yEwqTvv6Dvv6HigLDCp+KEluKYhuKYheKXi+KXj+KXjuKXh+KXhuKWoeKWoOKWs+KWsuKAu+KGkuKGkOKGkeKGk+OAk++/vVwiLnNwbGl0KFwiXCIpO1xuZm9yKGogPSAwOyBqICE9IERbMTYxXS5sZW5ndGg7ICsraikgaWYoRFsxNjFdW2pdLmNoYXJDb2RlQXQoMCkgIT09IDB4RkZGRCkgeyBlW0RbMTYxXVtqXV0gPSA0MTIxNiArIGo7IGRbNDEyMTYgKyBqXSA9IERbMTYxXVtqXTt9XG5EWzE2Ml0gPSBcIu+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/veKFsOKFseKFsuKFs+KFtOKFteKFtuKFt+KFuOKFue+/ve+/ve+/ve+/ve+/ve+/veKSiOKSieKSiuKSi+KSjOKSjeKSjuKSj+KSkOKSkeKSkuKSk+KSlOKSleKSluKSl+KSmOKSmeKSmuKSm+KRtOKRteKRtuKRt+KRuOKRueKRuuKRu+KRvOKRveKRvuKRv+KSgOKSgeKSguKSg+KShOKSheKShuKSh+KRoOKRoeKRouKRo+KRpOKRpeKRpuKRp+KRqOKRqe+/ve+/veOIoOOIoeOIouOIo+OIpOOIpeOIpuOIp+OIqOOIqe+/ve+/veKFoOKFoeKFouKFo+KFpOKFpeKFpuKFp+KFqOKFqeKFquKFq++/ve+/ve+/vVwiLnNwbGl0KFwiXCIpO1xuZm9yKGogPSAwOyBqICE9IERbMTYyXS5sZW5ndGg7ICsraikgaWYoRFsxNjJdW2pdLmNoYXJDb2RlQXQoMCkgIT09IDB4RkZGRCkgeyBlW0RbMTYyXVtqXV0gPSA0MTQ3MiArIGo7IGRbNDE0NzIgKyBqXSA9IERbMTYyXVtqXTt9XG5EWzE2M10gPSBcIu+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+8ge+8gu+8g++/pe+8he+8hu+8h++8iO+8ie+8iu+8i++8jO+8je+8ju+8j++8kO+8ke+8ku+8k++8lO+8le+8lu+8l++8mO+8me+8mu+8m++8nO+8ne+8nu+8n++8oO+8oe+8ou+8o++8pO+8pe+8pu+8p++8qO+8qe+8qu+8q++8rO+8re+8ru+8r++8sO+8se+8su+8s++8tO+8te+8tu+8t++8uO+8ue+8uu+8u++8vO+8ve+8vu+8v++9gO+9ge+9gu+9g++9hO+9he+9hu+9h++9iO+9ie+9iu+9i++9jO+9je+9ju+9j++9kO+9ke+9ku+9k++9lO+9le+9lu+9l++9mO+9me+9mu+9m++9nO+9ne+/o++/vVwiLnNwbGl0KFwiXCIpO1xuZm9yKGogPSAwOyBqICE9IERbMTYzXS5sZW5ndGg7ICsraikgaWYoRFsxNjNdW2pdLmNoYXJDb2RlQXQoMCkgIT09IDB4RkZGRCkgeyBlW0RbMTYzXVtqXV0gPSA0MTcyOCArIGo7IGRbNDE3MjggKyBqXSA9IERbMTYzXVtqXTt9XG5EWzE2NF0gPSBcIu+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/veOBgeOBguOBg+OBhOOBheOBhuOBh+OBiOOBieOBiuOBi+OBjOOBjeOBjuOBj+OBkOOBkeOBkuOBk+OBlOOBleOBluOBl+OBmOOBmeOBmuOBm+OBnOOBneOBnuOBn+OBoOOBoeOBouOBo+OBpOOBpeOBpuOBp+OBqOOBqeOBquOBq+OBrOOBreOBruOBr+OBsOOBseOBsuOBs+OBtOOBteOBtuOBt+OBuOOBueOBuuOBu+OBvOOBveOBvuOBv+OCgOOCgeOCguOCg+OChOOCheOChuOCh+OCiOOCieOCiuOCi+OCjOOCjeOCjuOCj+OCkOOCkeOCkuOCk++/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/vVwiLnNwbGl0KFwiXCIpO1xuZm9yKGogPSAwOyBqICE9IERbMTY0XS5sZW5ndGg7ICsraikgaWYoRFsxNjRdW2pdLmNoYXJDb2RlQXQoMCkgIT09IDB4RkZGRCkgeyBlW0RbMTY0XVtqXV0gPSA0MTk4NCArIGo7IGRbNDE5ODQgKyBqXSA9IERbMTY0XVtqXTt9XG5EWzE2NV0gPSBcIu+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/veOCoeOCouOCo+OCpOOCpeOCpuOCp+OCqOOCqeOCquOCq+OCrOOCreOCruOCr+OCsOOCseOCsuOCs+OCtOOCteOCtuOCt+OCuOOCueOCuuOCu+OCvOOCveOCvuOCv+ODgOODgeODguODg+ODhOODheODhuODh+ODiOODieODiuODi+ODjOODjeODjuODj+ODkOODkeODkuODk+ODlOODleODluODl+ODmOODmeODmuODm+ODnOODneODnuODn+ODoOODoeODouODo+ODpOODpeODpuODp+ODqOODqeODquODq+ODrOODreODruODr+ODsOODseODsuODs+ODtOODteODtu+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/vVwiLnNwbGl0KFwiXCIpO1xuZm9yKGogPSAwOyBqICE9IERbMTY1XS5sZW5ndGg7ICsraikgaWYoRFsxNjVdW2pdLmNoYXJDb2RlQXQoMCkgIT09IDB4RkZGRCkgeyBlW0RbMTY1XVtqXV0gPSA0MjI0MCArIGo7IGRbNDIyNDAgKyBqXSA9IERbMTY1XVtqXTt9XG5EWzE2Nl0gPSBcIu+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/vc6RzpLOk86UzpXOls6XzpjOmc6azpvOnM6dzp7On86gzqHOo86kzqXOps6nzqjOqe+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/vc6xzrLOs860zrXOts63zrjOuc66zrvOvM69zr7Ov8+Az4HPg8+Ez4XPhs+Hz4jPie+/ve+/ve+/ve+/ve+/ve+/ve+/ve+4te+4tu+4ue+4uu+4v++5gO+4ve+4vu+5ge+5gu+5g++5hO+/ve+/ve+4u++4vO+4t++4uO+4se+/ve+4s++4tO+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/vVwiLnNwbGl0KFwiXCIpO1xuZm9yKGogPSAwOyBqICE9IERbMTY2XS5sZW5ndGg7ICsraikgaWYoRFsxNjZdW2pdLmNoYXJDb2RlQXQoMCkgIT09IDB4RkZGRCkgeyBlW0RbMTY2XVtqXV0gPSA0MjQ5NiArIGo7IGRbNDI0OTYgKyBqXSA9IERbMTY2XVtqXTt9XG5EWzE2N10gPSBcIu+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/vdCQ0JHQktCT0JTQldCB0JbQl9CY0JnQmtCb0JzQndCe0J/QoNCh0KLQo9Ck0KXQptCn0KjQqdCq0KvQrNCt0K7Qr++/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/vdCw0LHQstCz0LTQtdGR0LbQt9C40LnQutC70LzQvdC+0L/RgNGB0YLRg9GE0YXRhtGH0YjRidGK0YvRjNGN0Y7Rj++/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/vVwiLnNwbGl0KFwiXCIpO1xuZm9yKGogPSAwOyBqICE9IERbMTY3XS5sZW5ndGg7ICsraikgaWYoRFsxNjddW2pdLmNoYXJDb2RlQXQoMCkgIT09IDB4RkZGRCkgeyBlW0RbMTY3XVtqXV0gPSA0Mjc1MiArIGo7IGRbNDI3NTIgKyBqXSA9IERbMTY3XVtqXTt9XG5EWzE2OF0gPSBcIu+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/vcuKy4vLmeKAk+KAleKApeKAteKEheKEieKGluKGl+KGmOKGmeKIleKIn+KIo+KJkuKJpuKJp+KKv+KVkOKVkeKVkuKVk+KVlOKVleKVluKVl+KVmOKVmeKVmuKVm+KVnOKVneKVnuKVn+KVoOKVoeKVouKVo+KVpOKVpeKVpuKVp+KVqOKVqeKVquKVq+KVrOKVreKVruKVr+KVsOKVseKVsuKVs+KWgeKWguKWg+KWhOKWheKWhuKWh++/veKWiOKWieKWiuKWi+KWjOKWjeKWjuKWj+KWk+KWlOKWleKWvOKWveKXouKXo+KXpOKXpeKYieKKleOAkuOAneOAnu+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/vcSBw6HHjsOgxJPDqcSbw6jEq8Otx5DDrMWNw7PHksOyxavDuseUw7nHlseYx5rHnMO8w6rJke+/vcWExYjvv73Joe+/ve+/ve+/ve+/veOEheOEhuOEh+OEiOOEieOEiuOEi+OEjOOEjeOEjuOEj+OEkOOEkeOEkuOEk+OElOOEleOEluOEl+OEmOOEmeOEmuOEm+OEnOOEneOEnuOEn+OEoOOEoeOEouOEo+OEpOOEpeOEpuOEp+OEqOOEqe+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/vVwiLnNwbGl0KFwiXCIpO1xuZm9yKGogPSAwOyBqICE9IERbMTY4XS5sZW5ndGg7ICsraikgaWYoRFsxNjhdW2pdLmNoYXJDb2RlQXQoMCkgIT09IDB4RkZGRCkgeyBlW0RbMTY4XVtqXV0gPSA0MzAwOCArIGo7IGRbNDMwMDggKyBqXSA9IERbMTY4XVtqXTt9XG5EWzE2OV0gPSBcIu+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/veOAoeOAouOAo+OApOOApeOApuOAp+OAqOOAqeOKo+OOjuOOj+OOnOOOneOOnuOOoeOPhOOPjuOPkeOPkuOPle+4sO+/ou+/pO+/veKEoeOIse+/veKAkO+/ve+/ve+/veODvOOCm+OCnOODveODvuOAhuOCneOCnu+5ie+5iu+5i++5jO+5je+5ju+5j++5kO+5ke+5ku+5lO+5le+5lu+5l++5me+5mu+5m++5nO+5ne+5nu+5n++5oO+5oe+/ve+5ou+5o++5pO+5pe+5pu+5qO+5qe+5qu+5q++/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/veOAh++/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/veKUgOKUgeKUguKUg+KUhOKUheKUhuKUh+KUiOKUieKUiuKUi+KUjOKUjeKUjuKUj+KUkOKUkeKUkuKUk+KUlOKUleKUluKUl+KUmOKUmeKUmuKUm+KUnOKUneKUnuKUn+KUoOKUoeKUouKUo+KUpOKUpeKUpuKUp+KUqOKUqeKUquKUq+KUrOKUreKUruKUr+KUsOKUseKUsuKUs+KUtOKUteKUtuKUt+KUuOKUueKUuuKUu+KUvOKUveKUvuKUv+KVgOKVgeKVguKVg+KVhOKVheKVhuKVh+KViOKVieKViuKVi++/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/vVwiLnNwbGl0KFwiXCIpO1xuZm9yKGogPSAwOyBqICE9IERbMTY5XS5sZW5ndGg7ICsraikgaWYoRFsxNjldW2pdLmNoYXJDb2RlQXQoMCkgIT09IDB4RkZGRCkgeyBlW0RbMTY5XVtqXV0gPSA0MzI2NCArIGo7IGRbNDMyNjQgKyBqXSA9IERbMTY5XVtqXTt9XG5EWzE3MF0gPSBcIu+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/veeLnOeLneeLn+eLoueLo+eLpOeLpeeLpueLp+eLqueLq+eLteeLtueLueeLveeLvueLv+eMgOeMgueMhOeMheeMhueMh+eMiOeMieeMi+eMjOeMjeeMj+eMkOeMkeeMkueMlOeMmOeMmeeMmueMn+eMoOeMo+eMpOeMpueMp+eMqOeMreeMr+eMsOeMsueMs+eMteeMtueMuueMu+eMvOeMveeNgOeNgeeNgueNg+eNhOeNheeNhueNh+eNiO+/veeNieeNiueNi+eNjOeNjueNj+eNkeeNk+eNlOeNleeNlueNmOeNmeeNmueNm+eNnOeNneeNnueNn+eNoeeNoueNo+eNpOeNpeeNpueNp+eNqOeNqeeNqueNq+eNrueNsOeNse+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/vVwiLnNwbGl0KFwiXCIpO1xuZm9yKGogPSAwOyBqICE9IERbMTcwXS5sZW5ndGg7ICsraikgaWYoRFsxNzBdW2pdLmNoYXJDb2RlQXQoMCkgIT09IDB4RkZGRCkgeyBlW0RbMTcwXVtqXV0gPSA0MzUyMCArIGo7IGRbNDM1MjAgKyBqXSA9IERbMTcwXVtqXTt9XG5EWzE3MV0gPSBcIu+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/veeNsueNs+eNtOeNteeNtueNt+eNuOeNueeNuueNu+eNvOeNveeNv+eOgOeOgeeOgueOg+eOheeOhueOiOeOiueOjOeOjeeOj+eOkOeOkueOk+eOlOeOleeOl+eOmOeOmeeOmueOnOeOneeOnueOoOeOoeeOo+eOpOeOpeeOpueOp+eOqOeOqueOrOeOreeOseeOtOeOteeOtueOuOeOueeOvOeOveeOvueOv+ePgeePg+ePhOePheePhuePh++/veePi+ePjOePjuePkuePk+ePlOePleePluePl+ePmOePmuePm+ePnOePneePn+ePoeePouePo+ePpOePpuePqOePquePq+ePrOePruePr+ePsOePseePs+ePtOePteePtuePt++/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/vVwiLnNwbGl0KFwiXCIpO1xuZm9yKGogPSAwOyBqICE9IERbMTcxXS5sZW5ndGg7ICsraikgaWYoRFsxNzFdW2pdLmNoYXJDb2RlQXQoMCkgIT09IDB4RkZGRCkgeyBlW0RbMTcxXVtqXV0gPSA0Mzc3NiArIGo7IGRbNDM3NzYgKyBqXSA9IERbMTcxXVtqXTt9XG5EWzE3Ml0gPSBcIu+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/veePuOePueePuuePu+ePvOePveePvuePv+eQgOeQgeeQgueQhOeQh+eQiOeQi+eQjOeQjeeQjueQkeeQkueQk+eQlOeQleeQlueQl+eQmOeQmeeQnOeQneeQnueQn+eQoOeQoeeQo+eQpOeQp+eQqeeQq+eQreeQr+eQseeQsueQt+eQuOeQueeQuueQu+eQveeQvueQv+eRgOeRgueRg+eRhOeRheeRhueRh+eRiOeRieeRiueRi+eRjOeRje+/veeRjueRj+eRkOeRkeeRkueRk+eRlOeRlueRmOeRneeRoOeRoeeRoueRo+eRpOeRpeeRpueRp+eRqOeRqeeRqueRq+eRrOeRrueRr+eRseeRsueRs+eRtOeRteeRuOeRueeRuu+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/vVwiLnNwbGl0KFwiXCIpO1xuZm9yKGogPSAwOyBqICE9IERbMTcyXS5sZW5ndGg7ICsraikgaWYoRFsxNzJdW2pdLmNoYXJDb2RlQXQoMCkgIT09IDB4RkZGRCkgeyBlW0RbMTcyXVtqXV0gPSA0NDAzMiArIGo7IGRbNDQwMzIgKyBqXSA9IERbMTcyXVtqXTt9XG5EWzE3M10gPSBcIu+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/veeRu+eRvOeRveeRv+eSgueShOeSheeShueSiOeSieeSiueSjOeSjeeSj+eSkeeSkueSk+eSlOeSleeSlueSl+eSmOeSmeeSmueSm+eSneeSn+eSoOeSoeeSoueSo+eSpOeSpeeSpueSqueSq+eSrOeSreeSrueSr+eSsOeSseeSsueSs+eStOeSteeStueSt+eSuOeSueeSu+eSvOeSveeSvueSv+eTgOeTgeeTgueTg+eThOeTheeThueTh++/veeTiOeTieeTiueTi+eTjOeTjeeTjueTj+eTkOeTkeeTk+eTlOeTleeTlueTl+eTmOeTmeeTmueTm+eTneeTn+eToeeTpeeTp+eTqOeTqeeTqueTq+eTrOeTreeTsOeTseeTsu+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/vVwiLnNwbGl0KFwiXCIpO1xuZm9yKGogPSAwOyBqICE9IERbMTczXS5sZW5ndGg7ICsraikgaWYoRFsxNzNdW2pdLmNoYXJDb2RlQXQoMCkgIT09IDB4RkZGRCkgeyBlW0RbMTczXVtqXV0gPSA0NDI4OCArIGo7IGRbNDQyODggKyBqXSA9IERbMTczXVtqXTt9XG5EWzE3NF0gPSBcIu+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/veeTs+eTteeTuOeTueeTuueTu+eTvOeTveeTvueUgOeUgeeUgueUg+eUheeUhueUh+eUiOeUieeUiueUi+eUjOeUjueUkOeUkueUlOeUleeUlueUl+eUm+eUneeUnueUoOeUoeeUoueUo+eUpOeUpueUp+eUqueUrueUtOeUtueUueeUvOeUveeUv+eVgeeVgueVg+eVhOeVhueVh+eVieeViueVjeeVkOeVkeeVkueVk+eVleeVlueVl+eVmO+/veeVneeVnueVn+eVoOeVoeeVoueVo+eVpOeVp+eVqOeVqeeVq+eVrOeVreeVrueVr+eVsOeVseeVs+eVteeVtueVt+eVuueVu+eVvOeVveeVvueWgOeWgeeWgueWhOeWheeWh++/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/vVwiLnNwbGl0KFwiXCIpO1xuZm9yKGogPSAwOyBqICE9IERbMTc0XS5sZW5ndGg7ICsraikgaWYoRFsxNzRdW2pdLmNoYXJDb2RlQXQoMCkgIT09IDB4RkZGRCkgeyBlW0RbMTc0XVtqXV0gPSA0NDU0NCArIGo7IGRbNDQ1NDQgKyBqXSA9IERbMTc0XVtqXTt9XG5EWzE3NV0gPSBcIu+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/veeWiOeWieeWiueWjOeWjeeWjueWkOeWk+eWleeWmOeWm+eWnOeWnueWoueWpueWp+eWqOeWqeeWqueWreeWtueWt+eWuueWu+eWv+eXgOeXgeeXhueXi+eXjOeXjueXj+eXkOeXkeeXk+eXl+eXmeeXmueXnOeXneeXn+eXoOeXoeeXpeeXqeeXrOeXreeXrueXr+eXsueXs+eXteeXtueXt+eXuOeXuueXu+eXveeXvueYgueYhOeYhueYh++/veeYiOeYieeYi+eYjeeYjueYj+eYkeeYkueYk+eYlOeYlueYmueYnOeYneeYnueYoeeYo+eYp+eYqOeYrOeYrueYr+eYseeYsueYtueYt+eYueeYuueYu+eYveeZgeeZgueZhO+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/vVwiLnNwbGl0KFwiXCIpO1xuZm9yKGogPSAwOyBqICE9IERbMTc1XS5sZW5ndGg7ICsraikgaWYoRFsxNzVdW2pdLmNoYXJDb2RlQXQoMCkgIT09IDB4RkZGRCkgeyBlW0RbMTc1XVtqXV0gPSA0NDgwMCArIGo7IGRbNDQ4MDAgKyBqXSA9IERbMTc1XVtqXTt9XG5EWzE3Nl0gPSBcIu+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/veeZheeZhueZh+eZiOeZieeZiueZi+eZjueZj+eZkOeZkeeZkueZk+eZleeZl+eZmOeZmeeZmueZm+eZneeZn+eZoOeZoeeZoueZpOeZpeeZpueZp+eZqOeZqeeZqueZrOeZreeZrueZsOeZseeZsueZs+eZtOeZteeZtueZt+eZueeZuueZvOeZv+eagOeageeag+eaheeaieeaiueajOeajeeaj+eakOeakuealOealeeal+eamOeamueam++/veeanOeaneeanuean+eaoOeaoeeaoueao+eapeeapueap+eaqOeaqeeaqueaq+earOeareear+easOeas+eateeatueat+eauOeaueeauueau+eavOeaveeavuebgOebgeebg+WViumYv+Wfg+aMqOWTjuWUieWTgOeakeeZjOiUvOefruiJvueijeeIsemamOmejeawqOWuieS/uuaMieaal+WyuOiDuuahiOiCruaYguebjuWHueaVlueGrOe/seiihOWCsuWlpeaHiua+s+iKreaNjOaJkuWPreWQp+eshuWFq+eWpOW3tOaLlOi3i+mdtuaKiuiAmeWdnemcuOe9oueIuOeZveafj+eZvuaRhuS9sOi0peaLnOeol+aWkeePreaQrOaJs+iIrOmigeadv+eJiOaJruaLjOS8tOeTo+WNiuWKnue7iumCpuW4ruaihuamnOiGgOe7keajkuejheiajOmVkeWCjeiwpOiLnuiDnuWMheikkuWJpe+/vVwiLnNwbGl0KFwiXCIpO1xuZm9yKGogPSAwOyBqICE9IERbMTc2XS5sZW5ndGg7ICsraikgaWYoRFsxNzZdW2pdLmNoYXJDb2RlQXQoMCkgIT09IDB4RkZGRCkgeyBlW0RbMTc2XVtqXV0gPSA0NTA1NiArIGo7IGRbNDUwNTYgKyBqXSA9IERbMTc2XVtqXTt9XG5EWzE3N10gPSBcIu+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/veebhOebh+ebieebi+ebjOebk+ebleebmeebmuebnOebneebnueboOeboeebouebo+ebpOebpuebp+ebqOebqeebquebq+ebrOebreebsOebs+ebteebtuebt+ebuuebu+ebveebv+ecgOecguecg+echeechueciuecjOecjuecj+eckOeckeeckueck+eclOecleecluecl+ecmOecm+ecnOecneecnuecoeeco+ecpOecpeecp+ecquecq++/veecrOecruecsOecseecsuecs+ectOecueecu+ecveecvuecv+edguedhOedheedhuediOedieediuedi+edjOedjeedjuedj+edkuedk+edlOedleedluedl+edmOedmeednOiWhOmbueS/neWgoemlseWuneaKseaKpeaatOixuemyjeeIhuadr+eikeaCsuWNkeWMl+i+iOiDjOi0nemSoeWAjeeLiOWkh+aDq+eEmeiiq+WllOiLr+acrOesqOW0qee7t+eUreaztei5pui/uOmAvOm8u+avlOmEmeeslOW9vOeip+iTluiUveavleavmeavluW4geW6h+eXuemXreaVneW8iuW/hei+n+WjgeiHgumBv+mZm+merei+uee8lui0rOaJgeS+v+WPmOWNnui+qOi+qei+q+mBjeagh+W9quiGmOihqOmzluaGi+WIq+eYquW9rOaWjOa/kua7qOWuvuaRiOWFteWGsOafhOS4meeniemlvOeCs++/vVwiLnNwbGl0KFwiXCIpO1xuZm9yKGogPSAwOyBqICE9IERbMTc3XS5sZW5ndGg7ICsraikgaWYoRFsxNzddW2pdLmNoYXJDb2RlQXQoMCkgIT09IDB4RkZGRCkgeyBlW0RbMTc3XVtqXV0gPSA0NTMxMiArIGo7IGRbNDUzMTIgKyBqXSA9IERbMTc3XVtqXTt9XG5EWzE3OF0gPSBcIu+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/veedneednuedn+edoOedpOedp+edqeedquedreedruedr+edsOedseedsueds+edtOedteedtuedt+eduOeduuedu+edvOeegeeegueeg+eehueeh+eeiOeeieeeiueei+eej+eekOeek+eelOeeleeelueel+eemOeemeeemueem+eenOeeneeenueeoeeeo+eepOeepueeqOeeq+eereeerueer+eeseeesueetOeetueet+eeuOeeueeeuu+/veeevOeevuefgOefgeefguefg+efhOefheefhuefh+efiOefieefiuefi+efjOefjuefj+efkOefkeefkuefk+eflOefleefluefmOefmeefmuefneefnuefn+efoOefoeefpOeXheW5tueOu+iPoOaSreaLqOmSteazouWNmuWLg+aQj+mTgueulOS8r+W4m+iItuiEluiGiua4pOaziumps+aNleWNnOWTuuihpeWfoOS4jeW4g+atpeewv+mDqOaAluaTpueMnOijgeadkOaJjei0ouedrOi4qemHh+W9qeiPnOiUoemkkOWPguialeaui+aDreaDqOeBv+iLjeiIseS7k+ayp+iXj+aTjeezmeanveabueiNieWOleetluS+p+WGjOa1i+Wxgui5reaPkuWPieiMrOiMtuafpeeitOaQveWvn+WylOW3ruivp+aLhuaftOixuuaQgOaOuuidiemmi+iwl+e8oOmTsuS6p+mYkOmipOaYjOeMlu+/vVwiLnNwbGl0KFwiXCIpO1xuZm9yKGogPSAwOyBqICE9IERbMTc4XS5sZW5ndGg7ICsraikgaWYoRFsxNzhdW2pdLmNoYXJDb2RlQXQoMCkgIT09IDB4RkZGRCkgeyBlW0RbMTc4XVtqXV0gPSA0NTU2OCArIGo7IGRbNDU1NjggKyBqXSA9IERbMTc4XVtqXTt9XG5EWzE3OV0gPSBcIu+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/veefpuefqOefquefr+efsOefseefsueftOefteeft+efueefuuefu+efvOegg+eghOegheeghuegh+egiOegiuegi+egjuegj+egkOegk+egleegmeegm+egnuegoOegoeegouegpOegqOegquegq+egruegr+egseegsuegs+egteegtuegveegv+ehgeehguehg+ehhOehhuehiOehieehiuehi+ehjeehj+ehkeehk+ehlOehmOehmeehmu+/veehm+ehnOehnuehn+ehoOehoeehoueho+ehpOehpeehpuehp+ehqOehqeehr+ehsOehseehsuehs+ehtOehteehtuehuOehueehuuehu+ehveehvuehv+eigOeigeeigueig+WcuuWwneW4uOmVv+WBv+iCoOWOguaVnueVheWUseWAoei2heaKhOmSnuacneWYsua9ruW3ouWQteeCkui9puaJr+aSpOaOo+W9u+a+iOmDtOiHo+i+sOWwmOaZqOW/seayiemZiOi2geihrOaSkeensOWfjuapmeaIkOWRiOS5mOeoi+aDqea+hOivmuaJv+mAnumqi+enpOWQg+eXtOaMgeWMmeaxoOi/n+W8m+mpsOiAu+m9v+S+iOWwuui1pOe/heaWpeeCveWFheWGsuiZq+W0h+WuoOaKvemFrOeVtOi4jOeooOaEgeetueS7h+e7uOeeheS4keiHreWIneWHuuapseWOqOi6h+mUhOmbj+a7gemZpOalmu+/vVwiLnNwbGl0KFwiXCIpO1xuZm9yKGogPSAwOyBqICE9IERbMTc5XS5sZW5ndGg7ICsraikgaWYoRFsxNzldW2pdLmNoYXJDb2RlQXQoMCkgIT09IDB4RkZGRCkgeyBlW0RbMTc5XVtqXV0gPSA0NTgyNCArIGo7IGRbNDU4MjQgKyBqXSA9IERbMTc5XVtqXTt9XG5EWzE4MF0gPSBcIu+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/veeihOeiheeihueiiOeiiueii+eij+eikOeikueilOeileeilueimeeineeinueioOeioueipOeipueiqOeiqeeiqueiq+eirOeireeirueir+eiteeitueit+eiuOeiuueiu+eivOeiveeiv+ejgOejguejg+ejhOejhuejh+ejiOejjOejjeejjuejj+ejkeejkuejk+ejluejl+ejmOejmuejm+ejnOejneejnuejn+ejoOejoeejouejo++/veejpOejpeejpuejp+ejqeejquejq+ejreejruejr+ejsOejseejs+ejteejtuejuOejueeju+ejvOejveejvuejv+ekgOekguekg+ekhOekhuekh+ekiOekieekiueki+ekjOehgOWCqOefl+aQkOinpuWkhOaPo+W3neepv+akveS8oOiIueWWmOS4sueWrueql+W5ouW6iumXr+WIm+WQueeCiuaNtumUpOWeguaYpeakv+mGh+WUh+a3s+e6r+igouaIs+e7sOeWteiMqOejgembjOi+nuaFiOeTt+ivjeatpOWIuui1kOasoeiBquiRseWbseWMhuS7juS4m+WHkeeyl+mGi+ewh+S/g+i5v+evoeeqnOaRp+W0lOWCrOiEhueYgeeyuea3rOe/oOadkeWtmOWvuOeji+aSruaQk+aOquaMq+mUmeaQrei+vuetlOeYqeaJk+Wkp+WRhuatueWCo+aItOW4puauhuS7o+i0t+iii+W+hemAru+/vVwiLnNwbGl0KFwiXCIpO1xuZm9yKGogPSAwOyBqICE9IERbMTgwXS5sZW5ndGg7ICsraikgaWYoRFsxODBdW2pdLmNoYXJDb2RlQXQoMCkgIT09IDB4RkZGRCkgeyBlW0RbMTgwXVtqXV0gPSA0NjA4MCArIGo7IGRbNDYwODAgKyBqXSA9IERbMTgwXVtqXTt9XG5EWzE4MV0gPSBcIu+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/veekjeekjuekj+ekkOekkeekkueklOekleekluekl+ekmOekmeekmuekm+eknOekneekn+ekoOekoeekoueko+ekpeekpuekp+ekqOekqeekquekq+ekrOekreekruekr+eksOekseeksueks+ekteektuekt+ekuOekueekveekv+elguelg+elhOelheelh+eliueli+eljOeljeeljuelj+elkOelkeelkuellOelleelmOelmeeloeelo++/veelpOelpuelqeelquelq+elrOelruelsOelseelsuels+eltOelteeltuelueelu+elvOelveelvuelv+emguemg+emhuemh+emiOemieemi+emjOemjeemjuemkOemkeemkuaAoOiAveaLheS4ueWNlemDuOaOuOiDhuaXpuawruS9huaDrua3oeivnuW8ueibi+W9k+aMoeWFmuiNoeaho+WIgOaNo+i5iOWAkuWym+elt+WvvOWIsOeou+aCvOmBk+ebl+W+t+W+l+eahOi5rOeBr+eZu+etieeequWHs+mCk+WgpOS9jua7tOi/quaVjOesm+eLhOa2pOe/n+WroeaKteW6leWcsOiSguesrOW4neW8n+mAkue8lOmioOaOgua7h+eimOeCueWFuOmdm+Weq+eUteS9g+eUuOW6l+aDpuWloOa3gOauv+eiieWPvOmbleWHi+WIgeaOieWQiumSk+iwg+i3jOeIueein+idtui/reiwjeWPoO+/vVwiLnNwbGl0KFwiXCIpO1xuZm9yKGogPSAwOyBqICE9IERbMTgxXS5sZW5ndGg7ICsraikgaWYoRFsxODFdW2pdLmNoYXJDb2RlQXQoMCkgIT09IDB4RkZGRCkgeyBlW0RbMTgxXVtqXV0gPSA0NjMzNiArIGo7IGRbNDYzMzYgKyBqXSA9IERbMTgxXVtqXTt9XG5EWzE4Ml0gPSBcIu+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/veemk+emlOemleemlueml+emmOemmeemm+emnOemneemnuemn+emoOemoeemouemo+empOempeempuemqOemqeemquemq+emrOemreemruemr+emsOemseemsuemtOemteemtuemt+emuOemvOemv+enguenhOenheenh+eniOeniuenjOenjuenj+enkOenk+enlOenluenl+enmeenmuenm+ennOenneennuenoOenoeenouenpeenqOenqu+/veenrOenruenseensuens+entOenteentuent+enueenuuenvOenvuenv+eogeeohOeoheeoh+eoiOeoieeoiueojOeoj+eokOeokeeokueok+eoleeolueomOeomeeom+eonOS4geebr+WPrumSiemhtum8jumUreWumuiuouS4ouS4nOWGrOiRo+aHguWKqOagi+S+l+aBq+WGu+a0nuWFnOaKluaWl+mZoeixhumAl+eXmOmDveedo+avkueKiueLrOivu+Wgteeduei1jOadnOmVgOiCmuW6pua4oeWmkuerr+efremUu+auteaWree8juWghuWFkemYn+WvueWiqeWQqOi5suaVpumhv+WbpOmSneebvumBgeaOh+WThuWkmuWkuuWem+i6suactei3uuiIteWJgeaDsOWgleibvuWzqOm5heS/hOmineiuueWopeaBtuWOhOaJvOmBj+mEgumlv+aBqeiAjOWEv+iAs+WwlOmltea0seS6jO+/vVwiLnNwbGl0KFwiXCIpO1xuZm9yKGogPSAwOyBqICE9IERbMTgyXS5sZW5ndGg7ICsraikgaWYoRFsxODJdW2pdLmNoYXJDb2RlQXQoMCkgIT09IDB4RkZGRCkgeyBlW0RbMTgyXVtqXV0gPSA0NjU5MiArIGo7IGRbNDY1OTIgKyBqXSA9IERbMTgyXVtqXTt9XG5EWzE4M10gPSBcIu+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/veeoneeon+eooeeooueopOeopeeopueop+eoqOeoqeeoqueoq+eorOeoreeorueor+eosOeoseeosueotOeoteeotueouOeouueovuepgOepgeepguepg+ephOepheeph+epiOepieepiuepi+epjOepjeepjuepj+epkOepkuepk+eplOepleepluepmOepmeepmuepm+epnOepneepnuepn+epoOepoeepouepo+eppOeppeeppuepp+epqO+/veepqeepquepq+eprOepreepruepr+epseepsueps+epteepu+epvOepveepvueqgueqheeqh+eqieeqiueqi+eqjOeqjueqj+eqkOeqk+eqlOeqmeeqmueqm+eqnueqoeeqoui0sOWPkee9muetj+S8kOS5j+mYgOazleePkOiXqeW4hueVque/u+aoiuefvumSkue5geWHoeeDpuWPjei/lOiMg+i0qeeKr+mlreazm+WdiuiKs+aWueiCquaIv+mYsuWmqOS7v+iuv+e6uuaUvuiPsumdnuWVoemjnuiCpeWMquivveWQoOiCuuW6n+ayuOi0ueiKrOmFmuWQqeawm+WIhue6t+Wdn+eEmuaxvueyieWli+S7veW/v+aEpOeyquS4sOWwgeaeq+icguWzsOmUi+mjjueWr+eDvemAouWGr+e8neiuveWlieWHpOS9m+WQpuWkq+aVt+iCpOWtteaJtuaLgui+kOW5heawn+espuS8j+S/mOacje+/vVwiLnNwbGl0KFwiXCIpO1xuZm9yKGogPSAwOyBqICE9IERbMTgzXS5sZW5ndGg7ICsraikgaWYoRFsxODNdW2pdLmNoYXJDb2RlQXQoMCkgIT09IDB4RkZGRCkgeyBlW0RbMTgzXVtqXV0gPSA0Njg0OCArIGo7IGRbNDY4NDggKyBqXSA9IERbMTgzXVtqXTt9XG5EWzE4NF0gPSBcIu+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/veeqo+eqpOeqp+eqqeeqqueqq+eqrueqr+eqsOeqseeqsueqtOeqteeqtueqt+equOequeequuequ+eqvOeqveeqvuergOergeerguerg+erhOerheerhuerh+eriOerieeriuerjOerjeerjuerj+erkOerkeerkuerk+erlOerleerl+ermOermuerm+ernOerneeroeerouerpOerp+erqOerqeerquerq+errOerruersOerseersuers++/veertOerteertuert+eruOeru+ervOervuesgOesgeesguesheesh+esieesjOesjeesjueskOeskuesk+esluesl+esmOesmuesnOesneesn+esoeesoueso+esp+esqeesrea1rua2quemj+iiseW8l+eUq+aKmui+heS/r+mHnOaWp+iEr+iFkeW6nOiFkOi1tOWJr+imhui1i+WkjeWCheS7mOmYnOeItuiFuei0n+WvjOiuo+mZhOWmh+e8muWSkOWZtuWYjuivpeaUueamgumSmeeblua6ieW5sueUmOadhuafkeerv+iCnei1tuaEn+enhuaVoui1o+WGiOWImumSoue8uOiCm+e6suWyl+a4r+adoOevmeeai+mrmOiGj+e+lOezleaQnumVkOeov+WRiuWTpeatjOaQgeaIiOm4veiDs+eWmeWJsumdqeiRm+agvOibpOmYgemalOmTrOS4quWQhOe7meaguei3n+iAleabtOW6mue+ue+/vVwiLnNwbGl0KFwiXCIpO1xuZm9yKGogPSAwOyBqICE9IERbMTg0XS5sZW5ndGg7ICsraikgaWYoRFsxODRdW2pdLmNoYXJDb2RlQXQoMCkgIT09IDB4RkZGRCkgeyBlW0RbMTg0XVtqXV0gPSA0NzEwNCArIGo7IGRbNDcxMDQgKyBqXSA9IERbMTg0XVtqXTt9XG5EWzE4NV0gPSBcIu+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/veesr+essOessuestOesteestuest+esueesu+esveesv+etgOetgeetguetg+ethOethuetiOetiuetjeetjuetk+etleetl+etmeetnOetnuetn+etoeeto+etpOetpeetpuetp+etqOetqeetquetq+etrOetreetr+etsOets+ettOettuetuOetuuetvOetveetv+eugeeugueug+euhOeuhueuh+euiOeuieeuiueui+eujOeujueuj++/veeukeeukueuk+eulueumOeumeeumueum+eunueun+euoOeuo+eupOeupeeurueur+eusOeusueus+euteeutueut+euueeuuueuu+euvOeuveeuvueuv+evgOevguevg+evhOWfguiAv+ail+W3peaUu+WKn+aBrem+muS+m+i6rOWFrOWuq+W8k+W3qeaxnuaLsei0oeWFsemSqeWLvuayn+iLn+eLl+WeouaehOi0reWkn+i+nOiPh+WSleeujeS8sOayveWtpOWnkem8k+WPpOibiumqqOiwt+iCoeaVhemhvuWbuumbh+WIrueTnOWJkOWvoeaMguikguS5luaLkOaAquajuuWFs+WumOWGoOingueuoemmhue9kOaDr+eBjOi0r+WFieW5v+mAm+eRsOinhOWcreehheW9kum+n+mXuui9qOmsvOivoeeZuOahguafnOi3qui0teWIvei+iua7muajjemUhemDreWbveaenOijuei/h+WTiO+/vVwiLnNwbGl0KFwiXCIpO1xuZm9yKGogPSAwOyBqICE9IERbMTg1XS5sZW5ndGg7ICsraikgaWYoRFsxODVdW2pdLmNoYXJDb2RlQXQoMCkgIT09IDB4RkZGRCkgeyBlW0RbMTg1XVtqXV0gPSA0NzM2MCArIGo7IGRbNDczNjAgKyBqXSA9IERbMTg1XVtqXTt9XG5EWzE4Nl0gPSBcIu+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/veevheeviOevieeviuevi+evjeevjuevj+evkOevkuevlOevleevluevl+evmOevm+evnOevnuevn+evoOevouevo+evpOevp+evqOevqeevq+evrOevreevr+evsOevsuevs+evtOevteevtuevuOevueevuuevu+evveevv+ewgOewgeewguewg+ewhOewheewhuewiOewieewiuewjeewjuewkOewkeewkuewk+ewlOewleewl+ewmOewme+/veewmuewm+ewnOewneewnuewoOewoeewouewo+ewpOewpeewqOewqeewq+ewrOewreewruewr+ewsOewseewsuews+ewtOewteewtuewt+ewueewuuewu+ewvOewveewvuexgumquOWtqea1t+awpuS6peWus+mqh+mFo+aGqOmCr+mfqeWQq+a2teWvkuWHveWWiue9lee/sOaSvOaNjeaXseaGvuaCjeeEiuaxl+axieWkr+adreiIquWjleWajuixquavq+mDneWlveiAl+WPt+a1qeWRteWWneiNt+iPj+aguOemvuWSjOS9leWQiOebkuiyiemYguays+a2uOi1q+ikkOm5pOi0uuWYv+m7keeXleW+iOeLoOaBqOWTvOS6qOaoquihoeaBkui9sOWThOeDmOiZuem4v+a0quWuj+W8mOe6ouWWieS+r+eMtOWQvOWOmuWAmeWQjuWRvOS5juW/veeRmuWjtuiRq+iDoeidtOeLkOeziua5lu+/vVwiLnNwbGl0KFwiXCIpO1xuZm9yKGogPSAwOyBqICE9IERbMTg2XS5sZW5ndGg7ICsraikgaWYoRFsxODZdW2pdLmNoYXJDb2RlQXQoMCkgIT09IDB4RkZGRCkgeyBlW0RbMTg2XVtqXV0gPSA0NzYxNiArIGo7IGRbNDc2MTYgKyBqXSA9IERbMTg2XVtqXTt9XG5EWzE4N10gPSBcIu+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/veexg+exhOexheexhuexh+exiOexieexiuexi+exjOexjuexj+exkOexkeexkuexk+exlOexleexluexl+exmOexmeexmuexm+exnOexneexnuexn+exoOexoeexouexo+expOexpeexpuexp+exqOexqeexquexq+exrOexreexruexr+exsOexseexsuexteextuext+exuOexueexuuexvuexv+eygOeygeeygueyg+eyhOeyheeyhueyh++/veeyiOeyiueyi+eyjOeyjeeyjueyj+eykOeyk+eylOeylueymeeymueym+eyoOeyoeeyo+eypueyp+eyqOeyqeeyq+eyrOeyreeyr+eysOeytOeyteeytueyt+eyuOeyuueyu+W8p+iZjuWUrOaKpOS6kuayquaIt+iKseWTl+WNjueMvua7keeUu+WIkuWMluivneankOW+iuaAgOa3ruWdj+asoueOr+ahk+i/mOe8k+aNouaCo+WUpOeXquixoueElea2o+WupuW5u+iNkuaFjOm7hOejuuidl+ewp+eah+WHsOaDtueFjOaZg+W5jOaBjeiwjueBsOaMpei+ieW+veaBouiblOWbnuavgeaClOaFp+WNieaDoOaZpui0v+enveS8mueDqeaxh+ius+ivsue7mOiNpOaYj+Wpmumtgua1kea3t+ixgea0u+S8meeBq+iOt+aIluaDkemcjei0p+eluOWHu+WcvuWfuuacuueVuOeoveenr+eule+/vVwiLnNwbGl0KFwiXCIpO1xuZm9yKGogPSAwOyBqICE9IERbMTg3XS5sZW5ndGg7ICsraikgaWYoRFsxODddW2pdLmNoYXJDb2RlQXQoMCkgIT09IDB4RkZGRCkgeyBlW0RbMTg3XVtqXV0gPSA0Nzg3MiArIGo7IGRbNDc4NzIgKyBqXSA9IERbMTg3XVtqXTt9XG5EWzE4OF0gPSBcIu+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/veeyv+ezgOezguezg+ezhOezhuezieezi+ezjuezj+ezkOezkeezkuezk+ezlOezmOezmuezm+ezneeznuezoeezouezo+ezpOezpeezpuezp+ezqeezquezq+ezrOezreezruezsOezseezsuezs+eztOezteeztuezt+ezueezuuezvOezveezvuezv+e0gOe0gee0gue0g+e0hOe0hee0hue0h+e0iOe0iee0i+e0jOe0jee0jue0j+e0kO+/vee0kee0kue0k+e0lOe0lee0lue0l+e0mOe0mee0mue0m+e0nOe0nee0nue0n+e0oee0o+e0pOe0pee0pue0qOe0qee0que0rOe0ree0rue0sOe0see0sue0s+e0tOe0tee0tuiCjOmlpei/uea/gOiupem4oeWnrOe7qee8ieWQieaegeajmOi+keexjembhuWPiuaApeeWvuaxsuWNs+Wriee6p+aMpOWHoOiEiuW3seiTn+aKgOWGgOWto+S8juelreWJguaCuOa1juWvhOWvguiuoeiusOaXouW/jOmZheWmk+e7p+e6quWYieaet+WkueS9s+WutuWKoOiNmumiiui0vueUsumSvuWBh+eovOS7t+aetumpvuWrgeatvOebkeWdmuWwluesuumXtOeFjuWFvOiCqeiJsOWluOe8hOiMp+ajgOafrOeiseeht+aLo+aNoeeugOS/reWJquWHj+iNkOanm+mJtOi3tei0seingemUrueureS7tu+/vVwiLnNwbGl0KFwiXCIpO1xuZm9yKGogPSAwOyBqICE9IERbMTg4XS5sZW5ndGg7ICsraikgaWYoRFsxODhdW2pdLmNoYXJDb2RlQXQoMCkgIT09IDB4RkZGRCkgeyBlW0RbMTg4XVtqXV0gPSA0ODEyOCArIGo7IGRbNDgxMjggKyBqXSA9IERbMTg4XVtqXTt9XG5EWzE4OV0gPSBcIu+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/vee0t+e0uOe0uee0uue0u+e0vOe0vee0vue0v+e1gOe1gee1gue1g+e1hOe1hee1hue1h+e1iOe1iee1iue1i+e1jOe1jee1jue1j+e1kOe1kee1kue1k+e1lOe1lee1lue1l+e1mOe1mee1mue1m+e1nOe1nee1nue1n+e1oOe1oee1oue1o+e1pOe1pee1pue1p+e1qOe1qee1que1q+e1rOe1ree1r+e1sOe1see1sue1s+e1tOe1tee1tu+/vee1uOe1uee1uue1u+e1vOe1vee1vue1v+e2gOe2gee2gue2g+e2hOe2hee2hue2h+e2iOe2iee2iue2i+e2jOe2jee2jue2j+e2kOe2kee2kue2k+e2lOe2lee2lue2l+e2mOWBpeiIsOWJkemlr+a4kOa6hea2p+W7uuWDteWnnOWwhua1huaxn+eWhuiSi+ahqOWlluiusuWMoOmFsemZjeiVieakkuekgeeEpuiDtuS6pOmDiua1h+mqhOWoh+WavOaQhemTsOefq+S+peiEmueLoeinkumluue8tOe7nuWJv+aVmemFtei9v+i+g+WPq+eqluaPreaOpeeahuenuOihl+mYtuaIquWKq+iKguahlOadsOaNt+edq+errea0gee7k+ino+WnkOaIkuiXieiKpeeVjOWAn+S7i+eWpeivq+WxiuW3vueti+aWpOmHkeS7iua0peiln+e0p+mUpuS7heiwqOi/m+mds+aZi+emgei/keeDrOa1uO+/vVwiLnNwbGl0KFwiXCIpO1xuZm9yKGogPSAwOyBqICE9IERbMTg5XS5sZW5ndGg7ICsraikgaWYoRFsxODldW2pdLmNoYXJDb2RlQXQoMCkgIT09IDB4RkZGRCkgeyBlW0RbMTg5XVtqXV0gPSA0ODM4NCArIGo7IGRbNDgzODQgKyBqXSA9IERbMTg5XVtqXTt9XG5EWzE5MF0gPSBcIu+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/vee2mee2mue2m+e2nOe2nee2nue2n+e2oOe2oee2oue2o+e2pOe2pee2p+e2qOe2qee2que2q+e2rOe2ree2r+e2sOe2see2sue2s+e2tOe2tee2tue2t+e2uOe2uee2uue2u+e2vOe2vee2vue2v+e3gOe3gee3gue3g+e3hOe3hee3hue3h+e3iOe3iee3iue3i+e3jOe3jee3jue3j+e3kOe3kee3kue3k+e3lOe3lee3lue3l+e3mOe3me+/vee3mue3m+e3nOe3nee3nue3n+e3oOe3oee3oue3o+e3pOe3pee3pue3p+e3qOe3qee3que3q+e3rOe3ree3rue3r+e3sOe3see3sue3s+e3tOe3tee3tue3t+e3uOe3uee3uuWwveWKsuiNhuWFouiMjuedm+aZtumyuOS6rOaDiueyvueys+e7j+S6leitpuaZr+miiOmdmeWig+aVrOmVnOW+hOeXiemdluern+ernuWHgOeCr+eqmOaPqueptue6oOeOlumfreS5heeBuOS5nemFkuWOqeaVkeaXp+iHvOiIheWSjuWwseeWmumeoOaLmOeLmeeWveWxhempueiPiuWxgOWSgOefqeS4vuayruiBmuaLkuaNruW3qOWFt+i3nei4numUr+S/seWPpeaDp+eCrOWJp+aNkOm5g+Won+WApuect+WNt+e7ouaSheaUq+aKieaOmOWAlOeIteinieWGs+ivgOe7neWdh+iPjOmSp+WGm+WQm+Wzu++/vVwiLnNwbGl0KFwiXCIpO1xuZm9yKGogPSAwOyBqICE9IERbMTkwXS5sZW5ndGg7ICsraikgaWYoRFsxOTBdW2pdLmNoYXJDb2RlQXQoMCkgIT09IDB4RkZGRCkgeyBlW0RbMTkwXVtqXV0gPSA0ODY0MCArIGo7IGRbNDg2NDAgKyBqXSA9IERbMTkwXVtqXTt9XG5EWzE5MV0gPSBcIu+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/vee3u+e3vOe3vee3vue3v+e4gOe4gee4gue4g+e4hOe4hee4hue4h+e4iOe4iee4iue4i+e4jOe4jee4jue4j+e4kOe4kee4kue4k+e4lOe4lee4lue4l+e4mOe4mee4mue4m+e4nOe4nee4nue4n+e4oOe4oee4oue4o+e4pOe4pee4pue4p+e4qOe4qee4que4q+e4rOe4ree4rue4r+e4sOe4see4sue4s+e4tOe4tee4tue4t+e4uOe4ue+/vee4uue4vOe4vee4vue4v+e5gOe5gue5g+e5hOe5hee5hue5iOe5iee5iue5i+e5jOe5jee5jue5j+e5kOe5kee5kue5k+e5lOe5lee5lue5l+e5mOe5mee5mue5m+e5nOe5neS/iuero+a1mumDoemqj+WWgOWSluWNoeWSr+W8gOaPqealt+WHr+aFqOWIiuWgquWLmOWdjuegjeeci+W6t+aFt+ezoOaJm+aKl+S6oueCleiAg+aLt+eDpOmdoOWdt+iLm+afr+ajteejlemil+enkeWjs+WSs+WPr+a4tOWFi+WIu+WuouivvuiCr+WVg+WepuaBs+WdkeWQreepuuaBkOWtlOaOp+aKoOWPo+aJo+Wvh+aer+WTreeqn+iLpumFt+W6k+ijpOWkuOWeruaMjui3qOiDr+Wdl+ett+S+qeW/q+WuveasvuWMoeetkOeLguahhuefv+ectuaXt+WGteS6j+eblOWyv+eqpeiRteWljumtgeWCgO+/vVwiLnNwbGl0KFwiXCIpO1xuZm9yKGogPSAwOyBqICE9IERbMTkxXS5sZW5ndGg7ICsraikgaWYoRFsxOTFdW2pdLmNoYXJDb2RlQXQoMCkgIT09IDB4RkZGRCkgeyBlW0RbMTkxXVtqXV0gPSA0ODg5NiArIGo7IGRbNDg4OTYgKyBqXSA9IERbMTkxXVtqXTt9XG5EWzE5Ml0gPSBcIu+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/vee5nue5n+e5oOe5oee5oue5o+e5pOe5pee5pue5p+e5qOe5qee5que5q+e5rOe5ree5rue5r+e5sOe5see5sue5s+e5tOe5tee5tue5t+e5uOe5uee5uue5u+e5vOe5vee5vue5v+e6gOe6gee6g+e6hOe6hee6hue6h+e6iOe6iee6iue6i+e6jOe6jee6jue6j+e6kOe6kee6kue6k+e6lOe6lee6lue6l+e6mOe6mee6mue6nOe6nee6nu+/vee6rue6tOe6u+e6vOe7lue7pOe7rOe7uee8iue8kOe8nue8t+e8uee8u+e8vOe8vee8vue8v+e9gOe9gee9g+e9hue9h+e9iOe9iee9iue9i+e9jOe9jee9jue9j+e9kue9k+mmiOaEp+a6g+WdpOaYhuaNhuWbsOaLrOaJqeW7k+mYlOWeg+aLieWWh+icoeiFiui+o+WVpuiOseadpei1luiTneWpquagj+aLpuevrumYkeWFsOa+nOiwsOaPveiniOaHkue8hueDgua7peeQheamlOeLvOW7iumDjuacl+a1quaNnuWKs+eJouiAgeS9rOWnpemFqueDmea2neWLkuS5kOmbt+mVreiVvuejiue0r+WEoeWekuaTguiCi+exu+azquajsealnuWGt+WOmOaiqOeKgem7juevseeLuOemu+a8k+eQhuadjumHjOmypOekvOiOieiNlOWQj+agl+S4veWOieWKseegvuWOhuWIqeWCiOS+i+S/kO+/vVwiLnNwbGl0KFwiXCIpO1xuZm9yKGogPSAwOyBqICE9IERbMTkyXS5sZW5ndGg7ICsraikgaWYoRFsxOTJdW2pdLmNoYXJDb2RlQXQoMCkgIT09IDB4RkZGRCkgeyBlW0RbMTkyXVtqXV0gPSA0OTE1MiArIGo7IGRbNDkxNTIgKyBqXSA9IERbMTkyXVtqXTt9XG5EWzE5M10gPSBcIu+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/vee9lue9mee9m+e9nOe9nee9nue9oOe9o+e9pOe9pee9pue9p+e9q+e9rOe9ree9r+e9sOe9s+e9tee9tue9t+e9uOe9uue9u+e9vOe9vee9v+e+gOe+gue+g+e+hOe+hee+hue+h+e+iOe+iee+i+e+jee+j+e+kOe+kee+kue+k+e+lee+lue+l+e+mOe+mee+m+e+nOe+oOe+oue+o+e+pee+pue+qOe+qee+que+q+e+rOe+ree+rue+se+/vee+s+e+tOe+tee+tue+t+e+uue+u+e+vue/gOe/gue/g+e/hOe/hue/h+e/iOe/iee/i+e/jee/j+e/kOe/kee/kue/k+e/lue/l+e/mee/mue/m+e/nOe/nee/nue/oue/o+eXoueri+eykuaypematuWKm+eSg+WTqeS/qeiBlOiOsui/numVsOW7ieaAnOa2n+W4mOaVm+iEuOmTvuaBi+eCvOe7g+eyruWHieaigeeyseiJr+S4pOi+humHj+aZvuS6ruiwheaSqeiBiuWDmueWl+eHjuWvpei+vea9puS6huaSgumVo+W7luaWmeWIl+ijgueDiOWKo+eMjueQs+ael+ejt+mcluS4tOmCu+mznua3i+WHm+i1geWQneaLjueOsuiPsembtum+hOmTg+S8tue+muWHjOeBtemZteWyremihuWPpuS7pOa6nOeQieamtOehq+mmj+eVmeWImOeYpOa1geafs+WFrem+meiBi+WSmeesvOeqv++/vVwiLnNwbGl0KFwiXCIpO1xuZm9yKGogPSAwOyBqICE9IERbMTkzXS5sZW5ndGg7ICsraikgaWYoRFsxOTNdW2pdLmNoYXJDb2RlQXQoMCkgIT09IDB4RkZGRCkgeyBlW0RbMTkzXVtqXV0gPSA0OTQwOCArIGo7IGRbNDk0MDggKyBqXSA9IERbMTkzXVtqXTt9XG5EWzE5NF0gPSBcIu+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/vee/pOe/p+e/qOe/que/q+e/rOe/ree/r+e/sue/tOe/tee/tue/t+e/uOe/uee/uue/vee/vue/v+iAguiAh+iAiOiAieiAiuiAjuiAj+iAkeiAk+iAmuiAm+iAneiAnuiAn+iAoeiAo+iApOiAq+iArOiAreiAruiAr+iAsOiAsuiAtOiAueiAuuiAvOiAvuiBgOiBgeiBhOiBheiBh+iBiOiBieiBjuiBj+iBkOiBkeiBk+iBleiBluiBl++/veiBmeiBm+iBnOiBneiBnuiBn+iBoOiBoeiBouiBo+iBpOiBpeiBpuiBp+iBqOiBq+iBrOiBreiBruiBr+iBsOiBsuiBs+iBtOiBteiBtuiBt+iBuOiBueiBuuiBu+iBvOiBvemahuWehOaLoumZh+alvOWohOaQguevk+a8j+mZi+iKpuWNoumiheW6kOeCieaOs+WNpOiZj+mygem6k+eijOmcsui3r+i1gum5v+a9nuemhOW9lemZhuaIrumptOWQlemTneS+o+aXheWxpeWxoee8leiZkeawr+W+i+eOh+a7pOe7v+WzpuaMm+Wtqua7puWNteS5seaOoOeVpeaKoei9ruS8puS7keaypue6tuiuuuiQneieuue9l+mAu+mUo+euqemqoeijuOiQvea0m+mqhue7nOWmiOm6u+eOm+eggeiagumprOmqguWYm+WQl+Wfi+S5sOm6puWNlui/iOiEieeekummkuibrua7oeiUk+abvOaFoua8q++/vVwiLnNwbGl0KFwiXCIpO1xuZm9yKGogPSAwOyBqICE9IERbMTk0XS5sZW5ndGg7ICsraikgaWYoRFsxOTRdW2pdLmNoYXJDb2RlQXQoMCkgIT09IDB4RkZGRCkgeyBlW0RbMTk0XVtqXV0gPSA0OTY2NCArIGo7IGRbNDk2NjQgKyBqXSA9IERbMTk0XVtqXTt9XG5EWzE5NV0gPSBcIu+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/veiBvuiCgeiCguiCheiCiOiCiuiCjeiCjuiCj+iCkOiCkeiCkuiClOiCleiCl+iCmeiCnuiCo+iCpuiCp+iCqOiCrOiCsOiCs+iCteiCtuiCuOiCueiCu+iDheiDh+iDiOiDieiDiuiDi+iDj+iDkOiDkeiDkuiDk+iDlOiDleiDmOiDn+iDoOiDouiDo+iDpuiDruiDteiDt+iDueiDu+iDvuiDv+iEgOiEgeiEg+iEhOiEheiEh+iEiOiEi++/veiEjOiEleiEl+iEmeiEm+iEnOiEneiEn+iEoOiEoeiEouiEo+iEpOiEpeiEpuiEp+iEqOiEqeiEquiEq+iEreiEruiEsOiEs+iEtOiEteiEt+iEueiEuuiEu+iEvOiEveiEv+iwqeiKkuiMq+ebsuawk+W/meiOveeMq+iMhemUmuavm+efm+mThuWNr+iMguWGkuW4veiyjOi0uOS5iOeOq+aemuaihemFtumcieeFpOayoeecieWqkumVgeavj+e+juaYp+WvkOWmueWqmumXqOmXt+S7rOiQjOiSmeaqrOebn+mUsOeMm+aipuWtn+ecr+mGmumdoeeznOi/t+iwnOW8peexs+enmOinheazjOicnOWvhuW5guajieecoOe7teWGleWFjeWLieWoqee8hemdouiLl+aPj+eehOiXkOenkua4uuW6meWmmeiUkeeBreawkeaKv+eav+aVj+aCr+mXveaYjuien+m4o+mTreWQjeWRveiwrOaRuO+/vVwiLnNwbGl0KFwiXCIpO1xuZm9yKGogPSAwOyBqICE9IERbMTk1XS5sZW5ndGg7ICsraikgaWYoRFsxOTVdW2pdLmNoYXJDb2RlQXQoMCkgIT09IDB4RkZGRCkgeyBlW0RbMTk1XVtqXV0gPSA0OTkyMCArIGo7IGRbNDk5MjAgKyBqXSA9IERbMTk1XVtqXTt9XG5EWzE5Nl0gPSBcIu+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/veiFgOiFgeiFguiFg+iFhOiFheiFh+iFieiFjeiFjuiFj+iFkuiFluiFl+iFmOiFm+iFnOiFneiFnuiFn+iFoeiFouiFo+iFpOiFpuiFqOiFquiFq+iFrOiFr+iFsuiFs+iFteiFtuiFt+iFuOiGgeiGg+iGhOiGheiGhuiGh+iGieiGi+iGjOiGjeiGjuiGkOiGkuiGk+iGlOiGleiGluiGl+iGmeiGmuiGnuiGn+iGoOiGoeiGouiGpOiGpe+/veiGp+iGqeiGq+iGrOiGreiGruiGr+iGsOiGseiGsuiGtOiGteiGtuiGt+iGuOiGueiGvOiGveiGvuiGv+iHhOiHheiHh+iHiOiHieiHi+iHjeiHjuiHj+iHkOiHkeiHkuiHk+aRueiYkeaooeiGnOejqOaRqemtlOaKueacq+iOq+WiqOm7mOayq+a8oOWvnumZjOiwi+eJn+afkOaLh+eJoeS6qeWnhuavjeWik+aaruW5leWLn+aFleacqOebruedpueJp+ephuaLv+WTquWRkOmSoOmCo+WonOe6s+awluS5g+WltuiAkOWliOWNl+eUt+mavuWbiuaMoOiEkeaBvOmXuea3luWRoummgeWGheWrqeiDveWmrumck+WAquazpeWwvOaLn+S9oOWMv+iFu+mAhua6uuiUq+aLiOW5tOeivuaSteaNu+W/teWomOmFv+m4n+Wwv+aNj+iBguWtveWVrumViumVjea2heaCqOafoOeLnuWHneWuge+/vVwiLnNwbGl0KFwiXCIpO1xuZm9yKGogPSAwOyBqICE9IERbMTk2XS5sZW5ndGg7ICsraikgaWYoRFsxOTZdW2pdLmNoYXJDb2RlQXQoMCkgIT09IDB4RkZGRCkgeyBlW0RbMTk2XVtqXV0gPSA1MDE3NiArIGo7IGRbNTAxNzYgKyBqXSA9IERbMTk2XVtqXTt9XG5EWzE5N10gPSBcIu+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/veiHlOiHleiHluiHl+iHmOiHmeiHmuiHm+iHnOiHneiHnuiHn+iHoOiHoeiHouiHpOiHpeiHpuiHqOiHqeiHq+iHruiHr+iHsOiHseiHsuiHteiHtuiHt+iHuOiHueiHuuiHveiHv+iIg+iIh+iIiOiIieiIiuiIi+iIjuiIj+iIkeiIk+iIleiIluiIl+iImOiImeiImuiIneiIoOiIpOiIpeiIpuiIp+iIqeiIruiIsuiIuuiIvOiIveiIv++/veiJgOiJgeiJguiJg+iJheiJhuiJiOiJiuiJjOiJjeiJjuiJkOiJkeiJkuiJk+iJlOiJleiJluiJl+iJmeiJm+iJnOiJneiJnuiJoOiJoeiJouiJo+iJpOiJpeiJpuiJp+iJqeaLp+aznueJm+aJremSrue6veiEk+a1k+WGnOW8hOWltOWKquaAkuWls+aaluiZkOeWn+aMquaHpuezr+ivuuWTpuasp+m4peautOiXleWRleWBtuaypOWVqui2tOeIrOW4leaAleeQtuaLjeaOkueJjOW+mOa5g+a0vuaUgOa9mOebmOejkOebvOeVlOWIpOWPm+S5k+W6nuaXgeiAquiDluaKm+WShuWIqOeCruiijei3keazoeWRuOiDmuWfueijtOi1lOmZqumFjeS9qeaym+WWt+ebhuegsOaKqOeDuea+juW9reiTrOajmuehvOevt+iGqOaci+m5j+aNp+eisOWdr+egkumcueaJueaKq+WKiOeQteavl++/vVwiLnNwbGl0KFwiXCIpO1xuZm9yKGogPSAwOyBqICE9IERbMTk3XS5sZW5ndGg7ICsraikgaWYoRFsxOTddW2pdLmNoYXJDb2RlQXQoMCkgIT09IDB4RkZGRCkgeyBlW0RbMTk3XVtqXV0gPSA1MDQzMiArIGo7IGRbNTA0MzIgKyBqXSA9IERbMTk3XVtqXTt9XG5EWzE5OF0gPSBcIu+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/veiJquiJq+iJrOiJreiJseiJteiJtuiJt+iJuOiJu+iJvOiKgOiKgeiKg+iKheiKhuiKh+iKieiKjOiKkOiKk+iKlOiKleiKluiKmuiKm+iKnuiKoOiKouiKo+iKp+iKsuiKteiKtuiKuuiKu+iKvOiKv+iLgOiLguiLg+iLheiLhuiLieiLkOiLluiLmeiLmuiLneiLouiLp+iLqOiLqeiLquiLrOiLreiLruiLsOiLsuiLs+iLteiLtuiLuO+/veiLuuiLvOiLveiLvuiLv+iMgOiMiuiMi+iMjeiMkOiMkuiMk+iMluiMmOiMmeiMneiMnuiMn+iMoOiMoeiMouiMo+iMpOiMpeiMpuiMqeiMquiMruiMsOiMsuiMt+iMu+iMveWVpOiEvueWsuearuWMueeXnuWDu+WxgeitrOevh+WBj+eJh+mql+mjmOa8gueTouelqOaSh+eepeaLvOmikei0q+WTgeiBmOS5kuWdquiLueiQjeW5s+WHreeTtuivhOWxj+WdoeazvOmih+WphuegtOmthOi/q+eyleWJluaJkemTuuS7huiOhuiRoeiPqeiSsuWflOactOWcg+aZrua1puiwseabneeAkeacn+asuuagluaImuWmu+S4g+WHhOa8huafkuayj+WFtuaji+Wlh+atp+eVpuW0juiEkOm9kOaXl+eliOelgemqkei1t+WyguS5nuS8geWQr+WlkeegjOWZqOawlOi/hOW8g+axveazo+iuq+aOkO+/vVwiLnNwbGl0KFwiXCIpO1xuZm9yKGogPSAwOyBqICE9IERbMTk4XS5sZW5ndGg7ICsraikgaWYoRFsxOThdW2pdLmNoYXJDb2RlQXQoMCkgIT09IDB4RkZGRCkgeyBlW0RbMTk4XVtqXV0gPSA1MDY4OCArIGo7IGRbNTA2ODggKyBqXSA9IERbMTk4XVtqXTt9XG5EWzE5OV0gPSBcIu+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/veiMvuiMv+iNgeiNguiNhOiNheiNiOiNiuiNi+iNjOiNjeiNjuiNk+iNleiNluiNl+iNmOiNmeiNneiNouiNsOiNseiNsuiNs+iNtOiNteiNtuiNueiNuuiNvuiNv+iOgOiOgeiOguiOg+iOhOiOh+iOiOiOiuiOi+iOjOiOjeiOj+iOkOiOkeiOlOiOleiOluiOl+iOmeiOmuiOneiOn+iOoeiOouiOo+iOpOiOpeiOpuiOp+iOrOiOreiOru+/veiOr+iOteiOu+iOvuiOv+iPguiPg+iPhOiPhuiPiOiPieiPi+iPjeiPjuiPkOiPkeiPkuiPk+iPleiPl+iPmeiPmuiPm+iPnuiPouiPo+iPpOiPpuiPp+iPqOiPq+iPrOiPreaBsOa0veeJteaJpumSjumTheWNg+i/geetvuS7n+iwpuS5vum7lOmSsemSs+WJjea9nOmBo+a1heiwtOWgkeW1jOasoOatieaequWRm+iFlOe+jOWimeiUt+W8uuaKouaph+mUueaVsuaChOahpeeep+S5lOS+qOW3p+memOaSrOe/mOWzreS/j+eqjeWIh+iMhOS4lOaAr+eqg+mSpuS+teS6suenpueQtOWLpOiKueaTkuemveWvneaygemdkui9u+awouWAvuWNv+a4heaTjuaZtOawsOaDhemht+ivt+W6hueQvOept+eni+S4mOmCseeQg+axguWbmumFi+azhei2i+WMuuibhuabsui6r+WxiOmpsea4oO+/vVwiLnNwbGl0KFwiXCIpO1xuZm9yKGogPSAwOyBqICE9IERbMTk5XS5sZW5ndGg7ICsraikgaWYoRFsxOTldW2pdLmNoYXJDb2RlQXQoMCkgIT09IDB4RkZGRCkgeyBlW0RbMTk5XVtqXV0gPSA1MDk0NCArIGo7IGRbNTA5NDQgKyBqXSA9IERbMTk5XVtqXTt9XG5EWzIwMF0gPSBcIu+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/veiPruiPr+iPs+iPtOiPteiPtuiPt+iPuuiPu+iPvOiPvuiPv+iQgOiQguiQheiQh+iQiOiQieiQiuiQkOiQkuiQk+iQlOiQleiQluiQl+iQmeiQmuiQm+iQnuiQn+iQoOiQoeiQouiQo+iQqeiQquiQq+iQrOiQreiQruiQr+iQsOiQsuiQs+iQtOiQteiQtuiQt+iQueiQuuiQu+iQvuiQv+iRgOiRgeiRguiRg+iRhOiRheiRh+iRiOiRie+/veiRiuiRi+iRjOiRjeiRjuiRj+iRkOiRkuiRk+iRlOiRleiRluiRmOiRneiRnuiRn+iRoOiRouiRpOiRpeiRpuiRp+iRqOiRquiRruiRr+iRsOiRsuiRtOiRt+iRueiRu+iRvOWPluWotum+i+i2o+WOu+WciOmip+adg+mGm+azieWFqOeXiuaLs+eKrOWIuOWKnee8uueClOeYuOWNtOm5iuamt+ehrumbgOijmee+pOeEtueHg+WGieafk+eTpOWjpOaUmOWat+iuqemltuaJsOe7leaDueeDreWjrOS7geS6uuW/jemfp+S7u+iupOWIg+Wmiue6q+aJlOS7jeaXpeaIjuiMuOiTieiNo+iejeeGlOa6tuWuuee7kuWGl+aPieaflOiCieiMueigleWEkuWtuuWmgui+seS5s+axneWFpeikpei9r+mYruiViueRnumUkOmXsOa2puiLpeW8seaSkua0kuiQqOiFrumzg+Whnui1m+S4ieWPge+/vVwiLnNwbGl0KFwiXCIpO1xuZm9yKGogPSAwOyBqICE9IERbMjAwXS5sZW5ndGg7ICsraikgaWYoRFsyMDBdW2pdLmNoYXJDb2RlQXQoMCkgIT09IDB4RkZGRCkgeyBlW0RbMjAwXVtqXV0gPSA1MTIwMCArIGo7IGRbNTEyMDAgKyBqXSA9IERbMjAwXVtqXTt9XG5EWzIwMV0gPSBcIu+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/veiRveiRvuiRv+iSgOiSgeiSg+iShOiSheiShuiSiuiSjeiSj+iSkOiSkeiSkuiSk+iSlOiSleiSluiSmOiSmuiSm+iSneiSnuiSn+iSoOiSouiSo+iSpOiSpeiSpuiSp+iSqOiSqeiSquiSq+iSrOiSreiSruiSsOiSseiSs+iSteiStuiSt+iSu+iSvOiSvuiTgOiTguiTg+iTheiThuiTh+iTiOiTi+iTjOiTjuiTj+iTkuiTlOiTleiTl++/veiTmOiTmeiTmuiTm+iTnOiTnuiToeiTouiTpOiTp+iTqOiTqeiTquiTq+iTreiTruiTr+iTseiTsuiTs+iTtOiTteiTtuiTt+iTuOiTueiTuuiTu+iTveiTvuiUgOiUgeiUguS8nuaVo+ahkeWXk+S4p+aQlOmqmuaJq+WrgueRn+iJsua2qeajruWDp+iOjuegguadgOWIueaymee6seWCu+WVpeeFnuetm+aZkuePiuiLq+adieWxseWIoOeFveihq+mXqumZleaThei1oeiGs+WWhOaxleaJh+e8ruWikuS8pOWVhui1j+aZjOS4iuWwmuijs+aiouaNjueojeeDp+iKjeWLuumftuWwkeWTqOmCtee7jeWloui1iuibh+iIjOiIjei1puaRhOWwhOaFkea2ieekvuiuvuegt+eUs+WRu+S8uOi6q+a3seWooOe7heelnuayiOWuoeWptueUmuiCvuaFjua4l+WjsOeUn+eUpeeJsuWNh+e7s++/vVwiLnNwbGl0KFwiXCIpO1xuZm9yKGogPSAwOyBqICE9IERbMjAxXS5sZW5ndGg7ICsraikgaWYoRFsyMDFdW2pdLmNoYXJDb2RlQXQoMCkgIT09IDB4RkZGRCkgeyBlW0RbMjAxXVtqXV0gPSA1MTQ1NiArIGo7IGRbNTE0NTYgKyBqXSA9IERbMjAxXVtqXTt9XG5EWzIwMl0gPSBcIu+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/veiUg+iUhOiUheiUhuiUh+iUiOiUieiUiuiUi+iUjeiUjuiUj+iUkOiUkuiUlOiUleiUluiUmOiUmeiUm+iUnOiUneiUnuiUoOiUouiUo+iUpOiUpeiUpuiUp+iUqOiUqeiUquiUreiUruiUr+iUsOiUseiUsuiUs+iUtOiUteiUtuiUvuiUv+iVgOiVgeiVguiVhOiVheiVhuiVh+iVi+iVjOiVjeiVjuiVj+iVkOiVkeiVkuiVk+iVlOiVle+/veiVl+iVmOiVmuiVm+iVnOiVneiVn+iVoOiVoeiVouiVo+iVpeiVpuiVp+iVqeiVquiVq+iVrOiVreiVruiVr+iVsOiVseiVs+iVteiVtuiVt+iVuOiVvOiVveiVv+iWgOiWgeecgeebm+WJqeiDnOWco+W4iOWkseeLruaWvea5v+ivl+WwuOiZseWNgeefs+aLvuaXtuS7gOmjn+iagOWunuivhuWPsuefouS9v+WxjumptuWni+W8j+ekuuWjq+S4luafv+S6i+aLreiqk+mAneWKv+aYr+WXnOWZrOmAguS7leS+jemHiumlsOawj+W4guaBg+WupOinhuivleaUtuaJi+mmluWuiOWvv+aOiOWUruWPl+eYpuWFveiUrOaeouais+auiuaKkui+k+WPlOiIkua3keeWj+S5pui1juWtsOeGn+iWr+aakeabmee9suicgOm7jem8oOWxnuacr+i/sOagkeadn+aIjeerluWiheW6tuaVsOa8se+/vVwiLnNwbGl0KFwiXCIpO1xuZm9yKGogPSAwOyBqICE9IERbMjAyXS5sZW5ndGg7ICsraikgaWYoRFsyMDJdW2pdLmNoYXJDb2RlQXQoMCkgIT09IDB4RkZGRCkgeyBlW0RbMjAyXVtqXV0gPSA1MTcxMiArIGo7IGRbNTE3MTIgKyBqXSA9IERbMjAyXVtqXTt9XG5EWzIwM10gPSBcIu+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/veiWguiWg+iWhuiWiOiWieiWiuiWi+iWjOiWjeiWjuiWkOiWkeiWkuiWk+iWlOiWleiWluiWl+iWmOiWmeiWmuiWneiWnuiWn+iWoOiWoeiWouiWo+iWpeiWpuiWp+iWqeiWq+iWrOiWreiWseiWsuiWs+iWtOiWteiWtuiWuOiWuuiWu+iWvOiWveiWvuiWv+iXgOiXguiXg+iXhOiXheiXhuiXh+iXiOiXiuiXi+iXjOiXjeiXjuiXkeiXku+/veiXlOiXluiXl+iXmOiXmeiXmuiXm+iXneiXnuiXn+iXoOiXoeiXouiXo+iXpeiXpuiXp+iXqOiXquiXq+iXrOiXreiXruiXr+iXsOiXseiXsuiXs+iXtOiXteiXtuiXt+iXuOaBleWIt+iAjeaRlOihsOeUqeW4heagk+aLtOmcnOWPjOeIveiwgeawtOedoeeojuWQrueerOmhuuiInOivtOehleaclOeDgeaWr+aSleWYtuaAneengeWPuOS4neatu+iChuWvuuWXo+Wbm+S8uuS8vOmlsuW3s+advuiAuOaAgumigumAgeWui+iuvOivteaQnOiJmOaTnuWXveiLj+mFpeS/l+e0oOmAn+eyn+WDs+Whkea6r+Wuv+ivieiCg+mFuOiSnOeul+iZvemai+maj+e7pemrk+eijuWygeepl+mBgumap+eln+WtmeaNn+esi+iTkeaireWUhue8qeeQkOe0oumUgeaJgOWhjOS7luWug+WlueWhlO+/vVwiLnNwbGl0KFwiXCIpO1xuZm9yKGogPSAwOyBqICE9IERbMjAzXS5sZW5ndGg7ICsraikgaWYoRFsyMDNdW2pdLmNoYXJDb2RlQXQoMCkgIT09IDB4RkZGRCkgeyBlW0RbMjAzXVtqXV0gPSA1MTk2OCArIGo7IGRbNTE5NjggKyBqXSA9IERbMjAzXVtqXTt9XG5EWzIwNF0gPSBcIu+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/veiXueiXuuiXvOiXveiXvuiYgOiYgeiYguiYg+iYhOiYhuiYh+iYiOiYieiYiuiYi+iYjOiYjeiYjuiYj+iYkOiYkuiYk+iYlOiYleiYl+iYmOiYmeiYmuiYm+iYnOiYneiYnuiYn+iYoOiYoeiYouiYo+iYpOiYpeiYpuiYqOiYquiYq+iYrOiYreiYruiYr+iYsOiYseiYsuiYs+iYtOiYteiYtuiYt+iYueiYuuiYu+iYveiYvuiYv+iZgO+/veiZgeiZguiZg+iZhOiZheiZhuiZh+iZiOiZieiZiuiZi+iZjOiZkuiZk+iZleiZluiZl+iZmOiZmeiZm+iZnOiZneiZn+iZoOiZoeiZo+iZpOiZpeiZpuiZp+iZqOiZqeiZqueNreaMnui5i+i4j+iDjuiLlOaKrOWPsOazsOmFnuWkquaAgeaxsOWdjeaRiui0queYq+a7qeWdm+aqgOeXsOa9reiwreiwiOWdpuavr+iikueis+aOouWPueeCreaxpOWhmOaQquWgguajoOiGm+WUkOezluWAmOi6uua3jOi2n+eDq+aOj+a2m+a7lOe7puiQhOahg+mAg+a3mOmZtuiuqOWll+eJueiXpOiFvueWvOiqiuair+WJlOi4oumUkeaPkOmimOi5hOWVvOS9k+abv+Waj+aDlea2leWJg+WxieWkqea3u+Whq+eUsOeUnOaBrOiIlOiFhuaMkeadoei/ouecuui3s+i0tOmTgeW4luWOheWQrOeDg++/vVwiLnNwbGl0KFwiXCIpO1xuZm9yKGogPSAwOyBqICE9IERbMjA0XS5sZW5ndGg7ICsraikgaWYoRFsyMDRdW2pdLmNoYXJDb2RlQXQoMCkgIT09IDB4RkZGRCkgeyBlW0RbMjA0XVtqXV0gPSA1MjIyNCArIGo7IGRbNTIyMjQgKyBqXSA9IERbMjA0XVtqXTt9XG5EWzIwNV0gPSBcIu+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/veiZreiZr+iZsOiZsuiZs+iZtOiZteiZtuiZt+iZuOiag+iahOiaheiahuiah+iaiOiaieiajuiaj+iakOiakeiakuialOialuial+iamOiameiamuiam+ianuian+iaoOiaoeiaouiapeiapuiaq+iareiaruiasuias+iat+iauOiaueiau+iavOiaveiavuiav+ibgeibguibg+ibheibiOibjOibjeibkuibk+ibleibluibl+ibmuibnO+/veibneiboOiboeibouibo+ibpeibpuibp+ibqOibquibq+ibrOibr+ibteibtuibt+ibuuibu+ibvOibveibv+icgeichOicheichuici+icjOicjuicj+ickOickeiclOicluaxgOW7t+WBnOS6reW6reaMuuiJh+mAmuahkOmFruees+WQjOmTnOW9pOerpeahtuaNheetkue7n+eXm+WBt+aKleWktOmAj+WHuOeng+eqgeWbvuW+kumAlOa2guWxoOWcn+WQkOWFlOa5jeWbouaOqOmik+iFv+icleikqumAgOWQnuWxr+iHgOaLluaJmOiEsem4temZgOmprumpvOakreWmpeaLk+WUvuaMluWTh+ibmea0vOWog+eTpuiinOatquWkluixjOW8r+a5vueOqemhveS4uOeDt+WujOeil+aMveaZmuealuaDi+Wum+WpieS4h+iFleaxqueOi+S6oeaeiee9keW+gOaXuuacm+W/mOWmhOWoge+/vVwiLnNwbGl0KFwiXCIpO1xuZm9yKGogPSAwOyBqICE9IERbMjA1XS5sZW5ndGg7ICsraikgaWYoRFsyMDVdW2pdLmNoYXJDb2RlQXQoMCkgIT09IDB4RkZGRCkgeyBlW0RbMjA1XVtqXV0gPSA1MjQ4MCArIGo7IGRbNTI0ODAgKyBqXSA9IERbMjA1XVtqXTt9XG5EWzIwNl0gPSBcIu+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/veicmeicm+icneicn+icoOicpOicpuicp+icqOicquicq+icrOicreicr+icsOicsuics+icteictuicuOicueicuuicvOicveidgOidgeidguidg+idhOidheidhuidiuidi+idjeidj+idkOidkeidkuidlOidleidluidmOidmuidm+idnOidneidnuidn+idoeidouidpuidp+idqOidqeidquidq+idrOidreidr+idseidsuids+idte+/veidt+iduOidueiduuidv+iegOiegeiehOiehuieh+ieieieiuiejOiejuiej+iekOiekeiekuielOieleieluiemOiemeiemuiem+ienOieneienuieoOieoeieouieo+iepOW3jeW+ruWNsemfpui/neahheWbtOWUr+aDn+S4uua9jee7tOiLh+iQjuWnlOS8n+S8quWwvue6rOacquiUmuWRs+eVj+iDg+WWgumtj+S9jea4reiwk+WwieaFsOWNq+eYn+a4qeiaiuaWh+mXu+e6ueWQu+eos+e0iumXruWXoee/geeTruaMneicl+a2oeeqneaIkeaWoeWNp+aPoeayg+W3q+WRnOmSqOS5jOaxoeivrOWxi+aXoOiKnOaip+WQvuWQtOavi+atpuS6lOaNguWNiOiInuS8jeS+ruWdnuaIiumbvuaZpOeJqeWLv+WKoeaCn+ivr+aYlOeGmeaekOilv+ehkuefveaZsOWYu+WQuOmUoeeJuu+/vVwiLnNwbGl0KFwiXCIpO1xuZm9yKGogPSAwOyBqICE9IERbMjA2XS5sZW5ndGg7ICsraikgaWYoRFsyMDZdW2pdLmNoYXJDb2RlQXQoMCkgIT09IDB4RkZGRCkgeyBlW0RbMjA2XVtqXV0gPSA1MjczNiArIGo7IGRbNTI3MzYgKyBqXSA9IERbMjA2XVtqXTt9XG5EWzIwN10gPSBcIu+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/veiepeiepuiep+ieqeiequieruiesOieseiesuietOietuiet+ieuOieueieu+ievOievuiev+ifgeifguifg+ifhOifheifh+ifiOifieifjOifjeifjuifj+ifkOiflOifleifluifl+ifmOifmeifmuifnOifneifnuifn+ifoeifouifo+ifpOifpuifp+ifqOifqeifq+ifrOifreifr+ifsOifseifsuifs+iftOifteiftuift+ifuO+/veifuuifu+ifvOifveifv+iggOiggeigguighOigheighuigh+igiOigieigi+igjOigjeigjuigj+igkOigkeigkuiglOigl+igmOigmeigmuignOigneignuign+igoOigo+eogOaBr+W4jOaCieiGneWkleaDnOeGhOeDr+a6quaxkOeKgOaqhOiireW4reS5oOWqs+WWnOmTo+a0l+ezu+mameaIj+e7hueejuiZvuWMo+mcnui+luaah+WzoeS+oOeLreS4i+WOpuWkj+WQk+aOgOmUqOWFiOS7memynOe6pOWSuOi0pOihlOiIt+mXsua2juW8puWrjOaYvumZqeeOsOeMruWOv+iFuummhee+oeWuqumZt+mZkOe6v+ebuOWOoumVtummmeeuseilhOa5mOS5oee/lOelpeivpuaDs+WTjeS6q+mhueW3t+apoeWDj+WQkeixoeiQp+ehnemchOWJiuWTruWao+mUgOa2iOWutea3huaZk++/vVwiLnNwbGl0KFwiXCIpO1xuZm9yKGogPSAwOyBqICE9IERbMjA3XS5sZW5ndGg7ICsraikgaWYoRFsyMDddW2pdLmNoYXJDb2RlQXQoMCkgIT09IDB4RkZGRCkgeyBlW0RbMjA3XVtqXV0gPSA1Mjk5MiArIGo7IGRbNTI5OTIgKyBqXSA9IERbMjA3XVtqXTt9XG5EWzIwOF0gPSBcIu+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/veigpOigpeigpuigp+igqOigqeigquigq+igrOigreigruigr+igsOigseigs+igtOigteigtuigt+iguOiguuigu+igveigvuigv+ihgeihguihg+ihhuihh+ihiOihieihiuihi+ihjuihj+ihkOihkeihkuihk+ihleihluihmOihmuihm+ihnOihneihnuihn+ihoOihpuihp+ihquihreihr+ihseihs+ihtOihteihtuihuOihueihuu+/veihu+ihvOiigOiig+iihuiih+iiieiiiuiijOiijuiij+iikOiikeiik+iilOiileiil+iimOiimeiimuiim+iineiinuiin+iioOiioeiio+iipeiipuiip+iiqOiiqeiiquWwj+WtneagoeiCluWVuOeskeaViOallOS6m+ath+idjumei+WNj+aMn+aQuumCquaWnOiDgeiwkOWGmeaisOWNuOifueaHiOazhOazu+iwouWxkeiWquiKr+mUjOaso+i+m+aWsOW/u+W/g+S/oeihheaYn+iFpeeMqeaDuuWFtOWIkeWei+W9oumCouihjOmGkuW5uOadj+aAp+Wnk+WFhOWHtuiDuOWMiOaxuembhOeGiuS8keS/rue+nuacveWXhemUiOengOiilue7o+Win+aIjOmcgOiZmuWYmOmhu+W+kOiuuOiThOmFl+WPmeaXreW6j+eVnOaBpOe1ruWpv+e7que7rei9qeWWp+Wuo+aCrOaXi+eOhO+/vVwiLnNwbGl0KFwiXCIpO1xuZm9yKGogPSAwOyBqICE9IERbMjA4XS5sZW5ndGg7ICsraikgaWYoRFsyMDhdW2pdLmNoYXJDb2RlQXQoMCkgIT09IDB4RkZGRCkgeyBlW0RbMjA4XVtqXV0gPSA1MzI0OCArIGo7IGRbNTMyNDggKyBqXSA9IERbMjA4XVtqXTt9XG5EWzIwOV0gPSBcIu+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/veiirOiiruiir+iisOiisuiis+iitOiiteiituiiuOiiueiiuuiiu+iiveiivuiiv+ijgOijg+ijhOijh+ijiOijiuiji+ijjOijjeijj+ijkOijkeijk+ijluijl+ijmuijm+ijnOijneijnuijoOijoeijpuijp+ijqeijquijq+ijrOijreijruijr+ijsuijteijtuijt+ijuuiju+ijveijv+ikgOikgeikg+ikhOikheikhuikh+ikiO+/veikieiki+ikjOikjeikjuikj+ikkeiklOikleikluikl+ikmOiknOikneiknuikn+ikoOikouiko+ikpOikpuikp+ikqOikqeikrOikreikruikr+ikseiksuiks+ikteikt+mAieeZo+ecqee7mumdtOiWm+WtpueptOmbquihgOWLi+eGj+W+quaXrOivouWvu+mpr+W3oeauieaxm+iureiur+mAiui/heWOi+aKvOm4pum4reWRgOS4q+iKveeJmeianOW0luihmea2r+mbheWTkeS6muiutueEieWSvemYieeDn+a3ueebkOS4peeglOickuWyqeW7tuiogOminOmYjueCjuayv+WlhOaOqeecvOihjea8lOiJs+WgsOeHleWOjOegmumbgeWUgeW9pueEsOWutOiwmumqjOaug+Wkrum4r+enp+adqOaJrOS9r+eWoee+iua0i+mYs+awp+S7sOeXkuWFu+agt+a8vumCgOiFsOWmlueRtu+/vVwiLnNwbGl0KFwiXCIpO1xuZm9yKGogPSAwOyBqICE9IERbMjA5XS5sZW5ndGg7ICsraikgaWYoRFsyMDldW2pdLmNoYXJDb2RlQXQoMCkgIT09IDB4RkZGRCkgeyBlW0RbMjA5XVtqXV0gPSA1MzUwNCArIGo7IGRbNTM1MDQgKyBqXSA9IERbMjA5XVtqXTt9XG5EWzIxMF0gPSBcIu+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/veikuOikueikuuiku+ikvOikveikvuikv+ilgOilguilg+ilheilhuilh+iliOilieiliuili+iljOiljeiljuilj+ilkOilkeilkuilk+illOilleilluill+ilmOilmeilmuilm+ilnOilneiloOiloeilouilo+ilpOilpeilp+ilqOilqeilquilq+ilrOilreilruilr+ilsOilseilsuils+iltOilteiltuilt+iluOilueiluuilvO+/veilveilvuimgOimguimhOimheimh+imiOimieimiuimi+imjOimjeimjuimj+imkOimkeimkuimk+imlOimleimluiml+immOimmeimmuimm+imnOimneimnuimn+imoOimoeaRh+Wwp+mBpeeqkeiwo+WnmuWSrOiIgOiNr+imgeiAgOaksOWZjuiAtueIt+mHjuWGtuS5n+mhteaOluS4muWPtuabs+iFi+WknOa2suS4gOWjueWMu+aPlumTseS+neS8iuiho+mikOWkt+mBl+enu+S7quiDsOeWkeayguWunOWnqOW9neakheiageWAmuW3suS5meefo+S7peiJuuaKkeaYk+mCkeWxueS6v+W9ueiHhumAuOiChOeWq+S6puijlOaEj+avheW/huS5ieebiua6ouivo+iuruiwiuivkeW8gue/vOe/jOe7juiMteiNq+WboOaut+mfs+mYtOWnu+WQn+mTtua3q+WvhemlruWwueW8lemakO+/vVwiLnNwbGl0KFwiXCIpO1xuZm9yKGogPSAwOyBqICE9IERbMjEwXS5sZW5ndGg7ICsraikgaWYoRFsyMTBdW2pdLmNoYXJDb2RlQXQoMCkgIT09IDB4RkZGRCkgeyBlW0RbMjEwXVtqXV0gPSA1Mzc2MCArIGo7IGRbNTM3NjAgKyBqXSA9IERbMjEwXVtqXTt9XG5EWzIxMV0gPSBcIu+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/veimouimo+impOimpeimpuimp+imqOimqeimquimq+imrOimreimruimr+imsOimseimsuims+imtOimteimtuimt+imuOimueimuuimu+imvOimveimvuimv+ingOing+injeink+inlOinleinl+inmOinmeinm+inneinn+inoOinoeinouinpOinp+inqOinqeinquinrOinreinruinsOinseinsuintOinteintuint+inuOinueinuu+/veinu+invOinveinvuinv+iogeioguiog+iohOioheiohuioiOioieioiuioi+iojOiojeiojuioj+iokOiokeiokuiok+iolOioleioluiol+iomOiomeiomuiom+ionOioneWNsOiLseaoseWptOm5sOW6lOe8qOiOueiQpOiQpeiNp+idh+i/jui1ouebiOW9semiluehrOaYoOWTn+aLpeS9o+iHg+eXiOW6uOmbjei4iuibueWSj+azs+a2jOawuOaBv+WLh+eUqOW5veS8mOaCoOW/p+WwpOeUsemCrumTgOeKueayuea4uOmFieacieWPi+WPs+S9kemHieivseWPiOW5vOi/gua3pOS6juebguamhuiZnuaEmuiIhuS9meS/numAvumxvOaEiea4nea4lOmaheS6iOWosembqOS4juWxv+emueWuh+ivree+veeOieWfn+iKi+mDgeWQgemBh+WWu+WzquW+oeaEiOassueLseiCsuiqie+/vVwiLnNwbGl0KFwiXCIpO1xuZm9yKGogPSAwOyBqICE9IERbMjExXS5sZW5ndGg7ICsraikgaWYoRFsyMTFdW2pdLmNoYXJDb2RlQXQoMCkgIT09IDB4RkZGRCkgeyBlW0RbMjExXVtqXV0gPSA1NDAxNiArIGo7IGRbNTQwMTYgKyBqXSA9IERbMjExXVtqXTt9XG5EWzIxMl0gPSBcIu+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/veionuion+iooOiooeioouioo+iopOiopeiopuiop+ioqOioqeioquioq+iorOioreioruior+iosOioseiosuios+iotOioteiotuiot+iouOioueiouuiou+iovOioveiov+ipgOipgeipguipg+iphOipheiphuiph+ipieipiuipi+ipjOipjeipjuipj+ipkOipkeipkuipk+iplOipleipluipl+ipmOipmeipmuipm+ipnOipneipnu+/veipn+ipoOipoeipouipo+ippOippeippuipp+ipqOipqeipquipq+iprOipreipruipr+ipsOipseipsuips+iptOipteiptuipt+ipuOipuuipu+ipvOipveipvuipv+iqgOa1tOWvk+ijlemihOixq+mprem4s+a4iuWGpOWFg+Weo+iigeWOn+aPtOi+leWbreWRmOWchueMv+a6kOe8mOi/nOiLkeaEv+aAqOmZouabsOe6pui2iui3g+mSpeWys+eypOaciOaCpumYheiAmOS6kemDp+WMgOmZqOWFgei/kOiVtOmFneaZlemfteWtleWMneeguOadguagveWTieeBvuWusOi9veWGjeWcqOWSseaUkuaagui1nui1g+iEj+iRrOmBreezn+WHv+iXu+aeo+aXqea+oeiapOi6geWZqumAoOeagueBtueHpei0o+aLqeWImeazvei0vOaAjuWinuaGjuabvui1oOaJjuWWs+a4o+acrei9p++/vVwiLnNwbGl0KFwiXCIpO1xuZm9yKGogPSAwOyBqICE9IERbMjEyXS5sZW5ndGg7ICsraikgaWYoRFsyMTJdW2pdLmNoYXJDb2RlQXQoMCkgIT09IDB4RkZGRCkgeyBlW0RbMjEyXVtqXV0gPSA1NDI3MiArIGo7IGRbNTQyNzIgKyBqXSA9IERbMjEyXVtqXTt9XG5EWzIxM10gPSBcIu+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/veiqgeiqguiqg+iqhOiqheiqhuiqh+iqiOiqi+iqjOiqjeiqjuiqj+iqkOiqkeiqkuiqlOiqleiqluiql+iqmOiqmeiqmuiqm+iqnOiqneiqnuiqn+iqoOiqoeiqouiqo+iqpOiqpeiqpuiqp+iqqOiqqeiqquiqq+iqrOiqreiqruiqr+iqsOiqseiqsuiqs+iqtOiqteiqtuiqt+iquOiqueiquuiqu+iqvOiqveiqvuiqv+irgOirgeirgu+/veirg+irhOirheirhuirh+iriOirieiriuiri+irjOirjeirjuirj+irkOirkeirkuirk+irlOirleirluirl+irmOirmeirmuirm+irnOirneirnuirn+iroOiroeirouiro+mToemXuOecqOagheamqOWSi+S5jeeCuOiviOaRmOaWi+WuheeqhOWAuuWvqOeeu+avoeipueeymOayvuebj+aWqei+l+W0reWxleiYuOagiOWNoOaImOermea5m+e7veaon+eroOW9sOa8s+W8oOaOjOa2qOadluS4iOW4kOi0puS7l+iDgOeYtOmanOaLm+aYreaJvuayvOi1teeFp+e9qeWFhuiCh+WPrOmBruaKmOWTsuibsOi+meiAhemUl+iUl+i/mea1meePjeaWn+ecn+eUhOegp+iHu+i0numSiOS+puaeleeWueiviumch+aMr+mVh+mYteiSuOaMo+edgeW+geeLsOS6ieaAlOaVtOaLr+ato+aUv++/vVwiLnNwbGl0KFwiXCIpO1xuZm9yKGogPSAwOyBqICE9IERbMjEzXS5sZW5ndGg7ICsraikgaWYoRFsyMTNdW2pdLmNoYXJDb2RlQXQoMCkgIT09IDB4RkZGRCkgeyBlW0RbMjEzXVtqXV0gPSA1NDUyOCArIGo7IGRbNTQ1MjggKyBqXSA9IERbMjEzXVtqXTt9XG5EWzIxNF0gPSBcIu+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/veirpOirpeirpuirp+irqOirqeirquirq+irrOirreirruirr+irsOirseirsuirs+irtOirteirtuirt+iruOirueiruuiru+irvOirveirvuirv+isgOisgeisguisg+ishOisheishuisiOisieisiuisi+isjOisjeisjuisj+iskOiskeiskuisk+islOisleisluisl+ismOismeismuism+isnOisneisnuisn+isoOisoeisouiso++/veispOispeisp+isqOisqeisquisq+isrOisreisruisr+issOisseissuiss+istOisteistuist+isuOisueisuuisu+isvOisveisvuisv+itgOitgeitguitg+ithOitheW4p+eXh+mDkeivgeiKneaeneaUr+WQseicmOefpeiCouiEguaxgeS5i+e7h+iBjOebtOakjeauluaJp+WAvOS+hOWdgOaMh+atoui2vuWPquaXqOe6uOW/l+aMmuaOt+iHs+iHtOe9ruW4nOWzmeWItuaZuuenqeeomui0qOeCmeeXlOa7nuayu+eqkuS4reebheW/oOmSn+iht+e7iOenjeiCv+mHjeS7suS8l+iIn+WRqOW3nua0suivjOeypei9tOiCmOW4muWSkueaseWumeaYvOmqpOePoOagquibm+acseeMquivuOivm+mAkOerueeDm+eFruaLhOeeqeWYseS4u+iRl+afseWKqeibgOi0rumTuOetke+/vVwiLnNwbGl0KFwiXCIpO1xuZm9yKGogPSAwOyBqICE9IERbMjE0XS5sZW5ndGg7ICsraikgaWYoRFsyMTRdW2pdLmNoYXJDb2RlQXQoMCkgIT09IDB4RkZGRCkgeyBlW0RbMjE0XVtqXV0gPSA1NDc4NCArIGo7IGRbNTQ3ODQgKyBqXSA9IERbMjE0XVtqXTt9XG5EWzIxNV0gPSBcIu+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/veithuith+itiOitieitiuiti+itjOitjeitjuitj+itkOitkeitkuitk+itlOitleitluitl+itmOitmeitmuitm+itnOitneitnuitn+itoOitoeitouito+itpOitpeitp+itqOitqeitquitq+itreitruitr+itsOitseitsuits+ittOitteittuitt+ituOitueituuitu+itvOitveitvuitv+iugOiugeiuguiug+iuhOiuheiuhu+/veiuh+iuiOiuieiuiuiui+iujOiujeiujuiuj+iukOiukeiukuiuk+iulOiuleiuluiul+iumOiumeiumuium+iunOiuneiunuiun+iurOiuseiuu+ivh+ivkOivquiwieiwnuS9j+azqOelnempu+aKk+eIquaLveS4k+eglui9rOaSsOi1muevhuahqeW6hOijheWmhuaSnuWjrueKtuakjumUpei/vei1mOWdoOe8gOiwhuWHhuaNieaLmeWNk+ahjOeQouiMgemFjOWVhOedgOeBvOa1iuWFueWSqOi1hOWnv+a7i+a3hOWtnOe0q+S7lOexvea7k+WtkOiHqua4jeWtl+msg+ajlei4quWul+e7vOaAu+e6temCuei1sOWlj+aPjeenn+i2s+WNkuaXj+elluivhemYu+e7hOmSu+e6guWYtOmGieacgOe9quWwiumBteaYqOW3puS9kOafnuWBmuS9nOWdkOW6p++/ve+/ve+/ve+/ve+/ve+/vVwiLnNwbGl0KFwiXCIpO1xuZm9yKGogPSAwOyBqICE9IERbMjE1XS5sZW5ndGg7ICsraikgaWYoRFsyMTVdW2pdLmNoYXJDb2RlQXQoMCkgIT09IDB4RkZGRCkgeyBlW0RbMjE1XVtqXV0gPSA1NTA0MCArIGo7IGRbNTUwNDAgKyBqXSA9IERbMjE1XVtqXTt9XG5EWzIxNl0gPSBcIu+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/veiwuOiwueiwuuiwu+iwvOiwveiwvuiwv+ixgOixguixg+ixhOixheixiOixiuixi+ixjeixjuixj+ixkOixkeixkuixk+ixlOixluixl+ixmOixmeixm+ixnOixneixnuixn+ixoOixo+ixpOixpeixpuixp+ixqOixqeixrOixreixruixr+ixsOixseixsuixtOixteixtuixt+ixu+ixvOixveixvuixv+iygOiygeiyg+iyhOiyhuiyh++/veiyiOiyi+iyjeiyjuiyj+iykOiykeiykuiyk+iyleiyluiyl+iymeiymuiym+iynOiyneiynuiyn+iyoOiyoeiyouiyo+iypOiypeiypuiyp+iyqOiyqeiyquiyq+iyrOiyreS6jeS4jOWFgOS4kOW7v+WNheS4leS6mOS4numssuWtrOWZqeS4qOemuuS4v+WMleS5h+WkreeIu+WNruawkOWbn+iDpOmml+avk+edvum8l+S4tuS6n+m8kOS5nOS5qeS6k+iKiOWtm+WVrOWYj+S7hOWOjeWOneWOo+WOpeWOrumdpei1neWMmuWPteWMpuWMruWMvui1nOWNpuWNo+WIguWIiOWIjuWIreWIs+WIv+WJgOWJjOWJnuWJoeWJnOiSr+WJveWKguWKgeWKkOWKk+WGgue9lOS6u+S7g+S7ieS7guS7qOS7oeS7q+S7nuS8m+S7s+S8ouS9pOS7teS8peS8p+S8ieS8q+S9nuS9p+aUuOS9muS9ne+/vVwiLnNwbGl0KFwiXCIpO1xuZm9yKGogPSAwOyBqICE9IERbMjE2XS5sZW5ndGg7ICsraikgaWYoRFsyMTZdW2pdLmNoYXJDb2RlQXQoMCkgIT09IDB4RkZGRCkgeyBlW0RbMjE2XVtqXV0gPSA1NTI5NiArIGo7IGRbNTUyOTYgKyBqXSA9IERbMjE2XVtqXTt9XG5EWzIxN10gPSBcIu+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/veiyruiyr+iysOiyseiysuiys+iytOiyteiytuiyt+iyuOiyueiyuuiyu+iyvOiyveiyvuiyv+izgOizgeizguizg+izhOizheizhuizh+iziOizieiziuizi+izjOizjeizjuizj+izkOizkeizkuizk+izlOizleizluizl+izmOizmeizmuizm+iznOizneiznuizn+izoOizoeizouizo+izpOizpeizpuizp+izqOizqeizquizq+izrO+/veizreizruizr+izsOizseizsuizs+iztOizteiztuizt+izuOizueizuuizu+izvOizveizvuizv+i0gOi0gei0gui0g+i0hOi0hei0hui0h+i0iOi0iei0iui0i+i0jOi0jeS9n+S9l+S8suS8veS9tuS9tOS+keS+ieS+g+S+j+S9vuS9u+S+quS9vOS+rOS+lOS/puS/qOS/quS/heS/muS/o+S/nOS/keS/n+S/uOWAqeWBjOS/s+WArOWAj+WAruWAreS/vuWAnOWAjOWApeWAqOWBvuWBg+WBleWBiOWBjuWBrOWBu+WCpeWCp+WCqeWCuuWDluWEhuWDreWDrOWDpuWDruWEh+WEi+S7neawveS9mOS9peS/jum+oOaxhuextOWFruW3vem7iemmmOWGgeWklOWLueWMjeioh+WMkOWHq+WkmeWFleS6oOWFluS6s+ihruiipOS6teiElOijkuemgOWstOigg+e+uOWGq+WGseWGveWGvO+/vVwiLnNwbGl0KFwiXCIpO1xuZm9yKGogPSAwOyBqICE9IERbMjE3XS5sZW5ndGg7ICsraikgaWYoRFsyMTddW2pdLmNoYXJDb2RlQXQoMCkgIT09IDB4RkZGRCkgeyBlW0RbMjE3XVtqXV0gPSA1NTU1MiArIGo7IGRbNTU1NTIgKyBqXSA9IERbMjE3XVtqXTt9XG5EWzIxOF0gPSBcIu+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/vei0jui0j+i0kOi0kei0kui0k+i0lOi0lei0lui0l+i0mOi0mei0mui0m+i0nOi0oOi1kei1kui1l+i1n+i1pei1qOi1qei1qui1rOi1rui1r+i1sei1sui1uOi1uei1uui1u+i1vOi1vei1vui1v+i2gOi2gui2g+i2hui2h+i2iOi2iei2jOi2jei2jui2j+i2kOi2kui2k+i2lei2lui2l+i2mOi2mei2mui2m+i2nOi2nei2nui2oOi2oe+/vei2oui2pOi2pei2pui2p+i2qOi2qei2qui2q+i2rOi2rei2rui2r+i2sOi2sui2tui2t+i2uei2u+i2vei3gOi3gei3gui3hei3h+i3iOi3iei3iui3jei3kOi3kui3k+i3lOWHh+WGluWGouWGpeiuoOiupuiup+iuquiutOiuteiut+ivguivg+ivi+ivj+ivjuivkuivk+ivlOivluivmOivmeivnOivn+ivoOivpOivqOivqeivruivsOivs+ivtuivueivvOivv+iwgOiwguiwhOiwh+iwjOiwj+iwkeiwkuiwlOiwleiwluiwmeiwm+iwmOiwneiwn+iwoOiwoeiwpeiwp+iwquiwq+iwruiwr+iwsuiws+iwteiwtuWNqeWNuumYnemYoumYoemYsemYqumYvemYvOmZgumZiemZlOmZn+mZp+mZrOmZsumZtOmaiOmajemal+masOmCl+mCm+mCnemCmemCrOmCoemCtOmCs+mCtumCuu+/vVwiLnNwbGl0KFwiXCIpO1xuZm9yKGogPSAwOyBqICE9IERbMjE4XS5sZW5ndGg7ICsraikgaWYoRFsyMThdW2pdLmNoYXJDb2RlQXQoMCkgIT09IDB4RkZGRCkgeyBlW0RbMjE4XVtqXV0gPSA1NTgwOCArIGo7IGRbNTU4MDggKyBqXSA9IERbMjE4XVtqXTt9XG5EWzIxOV0gPSBcIu+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/vei3lei3mOi3mei3nOi3oOi3oei3oui3pei3pui3p+i3qei3rei3rui3sOi3sei3sui3tOi3tui3vOi3vui3v+i4gOi4gei4gui4g+i4hOi4hui4h+i4iOi4i+i4jei4jui4kOi4kei4kui4k+i4lei4lui4l+i4mOi4mei4mui4m+i4nOi4oOi4oei4pOi4pei4pui4p+i4qOi4q+i4rei4sOi4sui4s+i4tOi4tui4t+i4uOi4u+i4vOi4vu+/vei4v+i5g+i5hei5hui5jOi5jei5jui5j+i5kOi5k+i5lOi5lei5lui5l+i5mOi5mui5m+i5nOi5nei5nui5n+i5oOi5oei5oui5o+i5pOi5pei5p+i5qOi5qui5q+i5rui5semCuOmCsOmDj+mDhemCvumDkOmDhOmDh+mDk+mDpumDoumDnOmDl+mDm+mDq+mDr+mDvumEhOmEoumEnumEo+mEsemEr+mEuemFg+mFhuWIjeWlguWKouWKrOWKreWKvuWTv+WLkOWLluWLsOWPn+eHruefjeW7tOWHteWHvOmsr+WOtuW8geeVmuW3r+WdjOWeqeWeoeWhvuWivOWjheWjkeWcqeWcrOWcquWcs+WcueWcruWcr+WdnOWcu+WdguWdqeWeheWdq+WehuWdvOWdu+WdqOWdreWdtuWds+WereWepOWejOWesuWfj+Wep+WetOWek+WeoOWfleWfmOWfmuWfmeWfkuWeuOWftOWfr+WfuOWfpOWfne+/vVwiLnNwbGl0KFwiXCIpO1xuZm9yKGogPSAwOyBqICE9IERbMjE5XS5sZW5ndGg7ICsraikgaWYoRFsyMTldW2pdLmNoYXJDb2RlQXQoMCkgIT09IDB4RkZGRCkgeyBlW0RbMjE5XVtqXV0gPSA1NjA2NCArIGo7IGRbNTYwNjQgKyBqXSA9IERbMjE5XVtqXTt9XG5EWzIyMF0gPSBcIu+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/vei5s+i5tei5t+i5uOi5uei5uui5u+i5vei5vui6gOi6gui6g+i6hOi6hui6iOi6iei6iui6i+i6jOi6jei6jui6kei6kui6k+i6lei6lui6l+i6mOi6mei6mui6m+i6nei6n+i6oOi6oei6oui6o+i6pOi6pei6pui6p+i6qOi6qei6qui6rei6rui6sOi6sei6s+i6tOi6tei6tui6t+i6uOi6uei6u+i6vOi6vei6vui6v+i7gOi7gei7gu+/vei7g+i7hOi7hei7hui7h+i7iOi7iei7iui7i+i7jOi7jei7j+i7kOi7kei7kui7k+i7lOi7lei7lui7l+i7mOi7mei7mui7m+i7nOi7nei7nui7n+i7oOi7oei7oui7o+i7pOWgi+WgjeWfveWfreWggOWgnuWgmeWhhOWgoOWhpeWhrOWigeWiieWimuWigOmmqOm8meaHv+iJueiJveiJv+iKj+iKiuiKqOiKhOiKjuiKkeiKl+iKmeiKq+iKuOiKvuiKsOiLiOiLiuiLo+iKmOiKt+iKruiLi+iLjOiLgeiKqeiKtOiKoeiKquiKn+iLhOiLjuiKpOiLoeiMieiLt+iLpOiMj+iMh+iLnOiLtOiLkuiLmOiMjOiLu+iLk+iMkeiMmuiMhuiMlOiMleiLoOiLleiMnOiNkeiNm+iNnOiMiOiOkuiMvOiMtOiMseiOm+iNnuiMr+iNj+iNh+iNg+iNn+iNgOiMl+iNoOiMreiMuuiMs+iNpuiNpe+/vVwiLnNwbGl0KFwiXCIpO1xuZm9yKGogPSAwOyBqICE9IERbMjIwXS5sZW5ndGg7ICsraikgaWYoRFsyMjBdW2pdLmNoYXJDb2RlQXQoMCkgIT09IDB4RkZGRCkgeyBlW0RbMjIwXVtqXV0gPSA1NjMyMCArIGo7IGRbNTYzMjAgKyBqXSA9IERbMjIwXVtqXTt9XG5EWzIyMV0gPSBcIu+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/vei7pei7pui7p+i7qOi7qei7qui7q+i7rOi7rei7rui7r+i7sOi7sei7sui7s+i7tOi7tei7tui7t+i7uOi7uei7uui7u+i7vOi7vei7vui7v+i8gOi8gei8gui8g+i8hOi8hei8hui8h+i8iOi8iei8iui8i+i8jOi8jei8jui8j+i8kOi8kei8kui8k+i8lOi8lei8lui8l+i8mOi8mei8mui8m+i8nOi8nei8nui8n+i8oOi8oei8oui8o++/vei8pOi8pei8pui8p+i8qOi8qei8qui8q+i8rOi8rei8rui8r+i8sOi8sei8sui8s+i8tOi8tei8tui8t+i8uOi8uei8uui8u+i8vOi8vei8vui8v+i9gOi9gei9gui9g+i9hOiNqOiMm+iNqeiNrOiNquiNreiNruiOsOiNuOiOs+iOtOiOoOiOquiOk+iOnOiOheiNvOiOtuiOqeiNveiOuOiNu+iOmOiOnuiOqOiOuuiOvOiPgeiQgeiPpeiPmOWgh+iQmOiQi+iPneiPveiPluiQnOiQuOiQkeiQhuiPlOiPn+iQj+iQg+iPuOiPueiPquiPheiPgOiQpuiPsOiPoeiRnOiRkeiRmuiRmeiRs+iSh+iSiOiRuuiSieiRuOiQvOiRhuiRqeiRtuiSjOiSjuiQseiRreiTgeiTjeiTkOiTpuiSveiTk+iTiuiSv+iSuuiToOiSoeiSueiStOiSl+iTpeiTo+iUjOeUjeiUuOiTsOiUueiUn+iUuu+/vVwiLnNwbGl0KFwiXCIpO1xuZm9yKGogPSAwOyBqICE9IERbMjIxXS5sZW5ndGg7ICsraikgaWYoRFsyMjFdW2pdLmNoYXJDb2RlQXQoMCkgIT09IDB4RkZGRCkgeyBlW0RbMjIxXVtqXV0gPSA1NjU3NiArIGo7IGRbNTY1NzYgKyBqXSA9IERbMjIxXVtqXTt9XG5EWzIyMl0gPSBcIu+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/vei9hei9hui9h+i9iOi9iei9iui9i+i9jOi9jei9jui9j+i9kOi9kei9kui9k+i9lOi9lei9lui9l+i9mOi9mei9mui9m+i9nOi9nei9nui9n+i9oOi9oei9oui9o+i9pOi9pei9qui+gOi+jOi+kui+nei+oOi+oei+oui+pOi+pei+pui+p+i+qui+rOi+rei+rui+r+i+sui+s+i+tOi+tei+t+i+uOi+uui+u+i+vOi+v+i/gOi/g+i/hu+/vei/iei/iui/i+i/jOi/jei/j+i/kui/lui/l+i/mui/oOi/oei/o+i/p+i/rOi/r+i/sei/sui/tOi/tei/tui/uui/u+i/vOi/vui/v+mAh+mAiOmAjOmAjumAk+mAlemAmOiVluiUu+iTv+iTvOiVmeiViOiVqOiVpOiVnuiVuueeouiVg+iVsuiVu+iWpOiWqOiWh+iWj+iVueiWruiWnOiWheiWueiWt+iWsOiXk+iXgeiXnOiXv+iYp+iYheiYqeiYluiYvOW7vuW8iOWkvOWlgeiAt+WlleWlmuWlmOWMj+WwouWwpeWwrOWwtOaJjOaJquaKn+aKu+aLiuaLmuaLl+aLruaMouaLtuaMueaNi+aNg+aOreaPtuaNseaNuuaOjuaOtOaNreaOrOaOiuaNqeaOruaOvOaPsuaPuOaPoOaPv+aPhOaPnuaPjuaRkuaPhuaOvuaRheaRgeaQi+aQm+aQoOaQjOaQpuaQoeaRnuaShOaRreaSlu+/vVwiLnNwbGl0KFwiXCIpO1xuZm9yKGogPSAwOyBqICE9IERbMjIyXS5sZW5ndGg7ICsraikgaWYoRFsyMjJdW2pdLmNoYXJDb2RlQXQoMCkgIT09IDB4RkZGRCkgeyBlW0RbMjIyXVtqXV0gPSA1NjgzMiArIGo7IGRbNTY4MzIgKyBqXSA9IERbMjIyXVtqXTt9XG5EWzIyM10gPSBcIu+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/vemAmemAnOmAo+mApOmApemAp+mAqOmAqemAqumAq+mArOmAsOmAsemAsumAs+mAtOmAt+mAuemAuumAvemAv+mBgOmBg+mBhemBhumBiOmBiemBiumBi+mBjOmBjumBlOmBlemBlumBmemBmumBnOmBnemBnumBn+mBoOmBoemBpOmBpumBp+mBqemBqumBq+mBrOmBr+mBsOmBsemBsumBs+mBtumBt+mBuOmBuemBuumBu+mBvOmBvumCge+/vemChOmChemChumCh+mCiemCiumCjOmCjemCjumCj+mCkOmCkumClOmClumCmOmCmumCnOmCnumCn+mCoOmCpOmCpemCp+mCqOmCqemCq+mCremCsumCt+mCvOmCvemCv+mDgOaRuuaSt+aSuOaSmeaSuuaTgOaTkOaTl+aTpOaTouaUieaUpeaUruW8i+W/kueUmeW8keWNn+WPseWPveWPqeWPqOWPu+WQkuWQluWQhuWRi+WRkuWRk+WRlOWRluWRg+WQoeWRl+WRmeWQo+WQsuWSguWSlOWRt+WRseWRpOWSmuWSm+WShOWRtuWRpuWSneWTkOWSreWTguWStOWTkuWSp+WSpuWTk+WTlOWRsuWSo+WTleWSu+WSv+WTjOWTmeWTmuWTnOWSqeWSquWSpOWTneWTj+WTnuWUm+WTp+WUoOWTveWUlOWTs+WUouWUo+WUj+WUkeWUp+WUquWVp+WWj+WWteWVieWVreWVgeWVleWUv+WVkOWUvO+/vVwiLnNwbGl0KFwiXCIpO1xuZm9yKGogPSAwOyBqICE9IERbMjIzXS5sZW5ndGg7ICsraikgaWYoRFsyMjNdW2pdLmNoYXJDb2RlQXQoMCkgIT09IDB4RkZGRCkgeyBlW0RbMjIzXVtqXV0gPSA1NzA4OCArIGo7IGRbNTcwODggKyBqXSA9IERbMjIzXVtqXTt9XG5EWzIyNF0gPSBcIu+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/vemDgumDg+mDhumDiOmDiemDi+mDjOmDjemDkumDlOmDlemDlumDmOmDmemDmumDnumDn+mDoOmDo+mDpOmDpemDqemDqumDrOmDrumDsOmDsemDsumDs+mDtemDtumDt+mDuemDuumDu+mDvOmDv+mEgOmEgemEg+mEhemEhumEh+mEiOmEiemEiumEi+mEjOmEjemEjumEj+mEkOmEkemEkumEk+mElOmElemElumEl+mEmOmEmumEm+mEnO+/vemEnemEn+mEoOmEoemEpOmEpemEpumEp+mEqOmEqemEqumEq+mErOmEremErumEsOmEsumEs+mEtOmEtemEtumEt+mEuOmEuumEu+mEvOmEvemEvumEv+mFgOmFgemFgumFhOWUt+WVluWVteWVtuWVt+WUs+WUsOWVnOWWi+WXkuWWg+WWseWWueWWiOWWgeWWn+WVvuWXluWWkeWVu+WXn+WWveWWvuWWlOWWmeWXquWXt+WXieWYn+WXkeWXq+WXrOWXlOWXpuWXneWXhOWXr+WXpeWXsuWXs+WXjOWXjeWXqOWXteWXpOi+lOWYnuWYiOWYjOWYgeWYpOWYo+WXvuWYgOWYp+WYreWZmOWYueWZl+WYrOWZjeWZouWZmeWZnOWZjOWZlOWahuWZpOWZseWZq+WZu+WZvOWaheWak+War+WblOWbl+WbneWboeWbteWbq+WbueWbv+WchOWciuWcieWcnOW4j+W4meW4lOW4keW4seW4u+W4vO+/vVwiLnNwbGl0KFwiXCIpO1xuZm9yKGogPSAwOyBqICE9IERbMjI0XS5sZW5ndGg7ICsraikgaWYoRFsyMjRdW2pdLmNoYXJDb2RlQXQoMCkgIT09IDB4RkZGRCkgeyBlW0RbMjI0XVtqXV0gPSA1NzM0NCArIGo7IGRbNTczNDQgKyBqXSA9IERbMjI0XVtqXTt9XG5EWzIyNV0gPSBcIu+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/vemFhemFh+mFiOmFkemFk+mFlOmFlemFlumFmOmFmemFm+mFnOmFn+mFoOmFpumFp+mFqOmFq+mFremFs+mFuumFu+mFvOmGgOmGgemGgumGg+mGhOmGhumGiOmGiumGjumGj+mGk+mGlOmGlemGlumGl+mGmOmGmemGnOmGnemGnumGn+mGoOmGoemGpOmGpemGpumGp+mGqOmGqemGq+mGrOmGsOmGsemGsumGs+mGtumGt+mGuOmGuemGu++/vemGvOmGvemGvumGv+mHgOmHgemHgumHg+mHhOmHhemHhumHiOmHi+mHkOmHkumHk+mHlOmHlemHlumHl+mHmOmHmemHmumHm+mHnemHnumHn+mHoOmHoemHoumHo+mHpOmHpeW4t+W5hOW5lOW5m+W5nuW5oeWyjOWxuuWyjeWykOWyluWyiOWymOWymeWykeWymuWynOWyteWyouWyveWyrOWyq+WyseWyo+WzgeWyt+WzhOWzkuWzpOWzi+WzpeW0guW0g+W0p+W0puW0ruW0pOW0nuW0huW0m+W1mOW0vuW0tOW0veW1rOW1m+W1r+W1neW1q+W1i+W1iuW1qeW1tOW2guW2meW2neixs+W2t+W3heW9s+W9t+W+guW+h+W+ieW+jOW+leW+meW+nOW+qOW+reW+teW+vOihouW9oeeKreeKsOeKtOeKt+eKuOeLg+eLgeeLjueLjeeLkueLqOeLr+eLqeeLsueLtOeLt+eMgeeLs+eMg+eLuu+/vVwiLnNwbGl0KFwiXCIpO1xuZm9yKGogPSAwOyBqICE9IERbMjI1XS5sZW5ndGg7ICsraikgaWYoRFsyMjVdW2pdLmNoYXJDb2RlQXQoMCkgIT09IDB4RkZGRCkgeyBlW0RbMjI1XVtqXV0gPSA1NzYwMCArIGo7IGRbNTc2MDAgKyBqXSA9IERbMjI1XVtqXTt9XG5EWzIyNl0gPSBcIu+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/vemHpumHp+mHqOmHqemHqumHq+mHrOmHremHrumHr+mHsOmHsemHsumHs+mHtOmHtemHtumHt+mHuOmHuemHuumHu+mHvOmHvemHvumHv+mIgOmIgemIgumIg+mIhOmIhemIhumIh+mIiOmIiemIiumIi+mIjOmIjemIjumIj+mIkOmIkemIkumIk+mIlOmIlemIlumIl+mImOmImemImumIm+mInOmInemInumIn+mIoOmIoemIoumIo+mIpO+/vemIpemIpumIp+mIqOmIqemIqumIq+mIrOmIremIrumIr+mIsOmIsemIsumIs+mItOmItemItumIt+mIuOmIuemIuumIu+mIvOmIvemIvumIv+mJgOmJgemJgumJg+mJhOmJheeLu+eMl+eMk+eMoeeMiueMnueMneeMleeMoueMueeMpeeMrOeMuOeMseeNkOeNjeeNl+eNoOeNrOeNr+eNvuiIm+Wkpemjp+WkpOWkgumlo+mlp+mlqOmlqemlqumlq+mlrOmltOmlt+mlvemmgOmmhOmmh+mmiummjemmkOmmkemmk+mmlOmmleW6gOW6keW6i+W6luW6peW6oOW6ueW6teW6vuW6s+i1k+W7kuW7keW7m+W7qOW7quiGuuW/hOW/ieW/luW/j+aAg+W/ruaAhOW/oeW/pOW/vuaAheaAhuW/quW/reW/uOaAmeaAteaApuaAm+aAj+aAjeaAqeaAq+aAiuaAv+aAoeaBuOaBueaBu+aBuuaBgu+/vVwiLnNwbGl0KFwiXCIpO1xuZm9yKGogPSAwOyBqICE9IERbMjI2XS5sZW5ndGg7ICsraikgaWYoRFsyMjZdW2pdLmNoYXJDb2RlQXQoMCkgIT09IDB4RkZGRCkgeyBlW0RbMjI2XVtqXV0gPSA1Nzg1NiArIGo7IGRbNTc4NTYgKyBqXSA9IERbMjI2XVtqXTt9XG5EWzIyN10gPSBcIu+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/vemJhumJh+mJiOmJiemJiumJi+mJjOmJjemJjumJj+mJkOmJkemJkumJk+mJlOmJlemJlumJl+mJmOmJmemJmumJm+mJnOmJnemJnumJn+mJoOmJoemJoumJo+mJpOmJpemJpumJp+mJqOmJqemJqumJq+mJrOmJremJrumJr+mJsOmJsemJsumJs+mJtemJtumJt+mJuOmJuemJuumJu+mJvOmJvemJvumJv+mKgOmKgemKgumKg+mKhOmKhe+/vemKhumKh+mKiOmKiemKiumKi+mKjOmKjemKj+mKkOmKkemKkumKk+mKlOmKlemKlumKl+mKmOmKmemKmumKm+mKnOmKnemKnumKn+mKoOmKoemKoumKo+mKpOmKpemKpumKp+aBquaBveaCluaCmuaCreaCneaCg+aCkuaCjOaCm+aDrOaCu+aCseaDneaDmOaDhuaDmuaCtOaEoOaEpuaEleaEo+aDtOaEgOaEjuaEq+aFiuaFteaGrOaGlOaGp+aGt+aHlOaHteW/nemas+mXqemXq+mXsemXs+mXtemXtumXvOmXvumYg+mYhOmYhumYiOmYiumYi+mYjOmYjemYj+mYkumYlemYlumYl+mYmemYmuS4rOeIv+aIleawteaxlOaxnOaxiuayo+ayheaykOaylOayjOaxqOaxqeaxtOaxtuayhuayqeazkOazlOayreazt+azuOazseazl+aysuazoOazluazuuazq+azruayseazk+azr+azvu+/vVwiLnNwbGl0KFwiXCIpO1xuZm9yKGogPSAwOyBqICE9IERbMjI3XS5sZW5ndGg7ICsraikgaWYoRFsyMjddW2pdLmNoYXJDb2RlQXQoMCkgIT09IDB4RkZGRCkgeyBlW0RbMjI3XVtqXV0gPSA1ODExMiArIGo7IGRbNTgxMTIgKyBqXSA9IERbMjI3XVtqXTt9XG5EWzIyOF0gPSBcIu+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/vemKqOmKqemKqumKq+mKrOmKremKr+mKsOmKsemKsumKs+mKtOmKtemKtumKt+mKuOmKuemKuumKu+mKvOmKvemKvumKv+mLgOmLgemLgumLg+mLhOmLhemLhumLh+mLiemLiumLi+mLjOmLjemLjumLj+mLkOmLkemLkumLk+mLlOmLlemLlumLl+mLmOmLmemLmumLm+mLnOmLnemLnumLn+mLoOmLoemLoumLo+mLpOmLpemLpumLp+mLqO+/vemLqemLqumLq+mLrOmLremLrumLr+mLsOmLsemLsumLs+mLtOmLtemLtumLt+mLuOmLuemLuumLu+mLvOmLvemLvumLv+mMgOmMgemMgumMg+mMhOmMhemMhumMh+mMiOmMiea0uea0p+a0jOa1g+a1iOa0h+a0hOa0mea0jua0q+a1jea0rua0tea0mua1j+a1kua1lOa0s+a2kea1r+a2nua2oOa1nua2k+a2lOa1nOa1oOa1vOa1o+a4mua3h+a3hea3nua4jua2v+a3oOa4kea3pua3nea3mea4lua2q+a4jOa2rua4q+a5rua5jua5q+a6sua5n+a6hua5k+a5lOa4sua4pea5hOa7n+a6sea6mOa7oOa8rea7oua6pea6p+a6vea6u+a6t+a7l+a6tOa7j+a6j+a7gua6n+a9oua9hua9h+a8pOa8lea7uea8r+a8tua9i+a9tOa8qua8iea8qea+iea+jea+jOa9uOa9sua9vOa9uua/ke+/vVwiLnNwbGl0KFwiXCIpO1xuZm9yKGogPSAwOyBqICE9IERbMjI4XS5sZW5ndGg7ICsraikgaWYoRFsyMjhdW2pdLmNoYXJDb2RlQXQoMCkgIT09IDB4RkZGRCkgeyBlW0RbMjI4XVtqXV0gPSA1ODM2OCArIGo7IGRbNTgzNjggKyBqXSA9IERbMjI4XVtqXTt9XG5EWzIyOV0gPSBcIu+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/vemMiumMi+mMjOmMjemMjumMj+mMkOmMkemMkumMk+mMlOmMlemMlumMl+mMmOmMmemMmumMm+mMnOmMnemMnumMn+mMoOmMoemMoumMo+mMpOmMpemMpumMp+mMqOmMqemMqumMq+mMrOmMremMrumMr+mMsOmMsemMsumMs+mMtOmMtemMtumMt+mMuOmMuemMuumMu+mMvOmMvemMv+mNgOmNgemNgumNg+mNhOmNhemNhumNh+mNiOmNie+/vemNiumNi+mNjOmNjemNjumNj+mNkOmNkemNkumNk+mNlOmNlemNlumNl+mNmOmNmemNmumNm+mNnOmNnemNnumNn+mNoOmNoemNoumNo+mNpOmNpemNpumNp+mNqOmNqemNq+a/iea+p+a+uea+tua/gua/oea/rua/nua/oOa/r+eAmueAo+eAm+eAueeAteeBj+eBnuWugOWuhOWuleWuk+WupeWuuOeUr+mqnuaQtOWvpOWvruiksOWvsOi5h+ish+i+tui/k+i/lei/pei/rui/pOi/qei/pui/s+i/qOmAhemAhOmAi+mApumAkemAjemAlumAoemAtemAtumAremAr+mBhOmBkemBkumBkOmBqOmBmOmBoumBm+aauemBtOmBvemCgumCiOmCg+mCi+W9kOW9l+W9luW9mOWwu+WSq+WxkOWxmeWtseWxo+Wxpue+vOW8quW8qeW8reiJtOW8vOmsu+WxruWmgeWmg+WmjeWmqeWmquWmo++/vVwiLnNwbGl0KFwiXCIpO1xuZm9yKGogPSAwOyBqICE9IERbMjI5XS5sZW5ndGg7ICsraikgaWYoRFsyMjldW2pdLmNoYXJDb2RlQXQoMCkgIT09IDB4RkZGRCkgeyBlW0RbMjI5XVtqXV0gPSA1ODYyNCArIGo7IGRbNTg2MjQgKyBqXSA9IERbMjI5XVtqXTt9XG5EWzIzMF0gPSBcIu+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/vemNrOmNremNrumNr+mNsOmNsemNsumNs+mNtOmNtemNtumNt+mNuOmNuemNuumNu+mNvOmNvemNvumNv+mOgOmOgemOgumOg+mOhOmOhemOhumOh+mOiOmOiemOiumOi+mOjOmOjemOjumOkOmOkemOkumOk+mOlOmOlemOlumOl+mOmOmOmemOmumOm+mOnOmOnemOnumOn+mOoOmOoemOoumOo+mOpOmOpemOpumOp+mOqOmOqemOqumOq++/vemOrOmOremOrumOr+mOsOmOsemOsumOs+mOtOmOtemOtumOt+mOuOmOuemOuumOu+mOvOmOvemOvumOv+mPgOmPgemPgumPg+mPhOmPhemPhumPh+mPiOmPiemPi+mPjOmPjeWml+WniuWmq+WmnuWmpOWnkuWmsuWmr+Wnl+WmvuWoheWohuWnneWoiOWno+WnmOWnueWojOWoieWosuWotOWokeWoo+Wok+WpgOWpp+WpiuWpleWovOWpouWpteiDrOWqquWqm+Wpt+WpuuWqvuWrq+WqsuWrkuWrlOWquOWroOWro+WrseWrluWrpuWrmOWrnOWsieWsl+WsluWssuWst+WtgOWwleWwnOWtmuWtpeWts+WtkeWtk+Wtoumptempt+mpuOmpuumpv+mpvemqgOmqgemqhemqiOmqiumqkOmqkumqk+mqlumqmOmqm+mqnOmqnemqn+mqoOmqoumqo+mqpemqp+e6n+e6oee6o+e6pee6qOe6qe+/vVwiLnNwbGl0KFwiXCIpO1xuZm9yKGogPSAwOyBqICE9IERbMjMwXS5sZW5ndGg7ICsraikgaWYoRFsyMzBdW2pdLmNoYXJDb2RlQXQoMCkgIT09IDB4RkZGRCkgeyBlW0RbMjMwXVtqXV0gPSA1ODg4MCArIGo7IGRbNTg4ODAgKyBqXSA9IERbMjMwXVtqXTt9XG5EWzIzMV0gPSBcIu+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/vemPjumPj+mPkOmPkemPkumPk+mPlOmPlemPl+mPmOmPmemPmumPm+mPnOmPnemPnumPn+mPoOmPoemPoumPo+mPpOmPpemPpumPp+mPqOmPqemPqumPq+mPrOmPremPrumPr+mPsOmPsemPsumPs+mPtOmPtemPtumPt+mPuOmPuemPuumPu+mPvOmPvemPvumPv+mQgOmQgemQgumQg+mQhOmQhemQhumQh+mQiOmQiemQiumQi+mQjOmQje+/vemQjumQj+mQkOmQkemQkumQk+mQlOmQlemQlumQl+mQmOmQmemQmumQm+mQnOmQnemQnumQn+mQoOmQoemQoumQo+mQpOmQpemQpumQp+mQqOmQqemQqumQq+mQrOmQremQrue6ree6sOe6vue7gOe7gee7gue7iee7i+e7jOe7kOe7lOe7l+e7m+e7oOe7oee7qOe7q+e7rue7r+e7see7sue8jee7tue7uue7u+e7vue8gee8gue8g+e8h+e8iOe8i+e8jOe8j+e8kee8kue8l+e8mee8nOe8m+e8n+e8oee8oue8o+e8pOe8pee8pue8p+e8que8q+e8rOe8ree8r+e8sOe8see8sue8s+e8teW5uueVv+W3m+eUvumCleeOjueOkeeOrueOoueOn+ePj+ePguePkeeOt+eOs+ePgOePieePiOePpeePmemhvOeQiuePqeePp+ePnueOuuePsueQj+eQqueRm+eQpueQpeeQqOeQsOeQrueQrO+/vVwiLnNwbGl0KFwiXCIpO1xuZm9yKGogPSAwOyBqICE9IERbMjMxXS5sZW5ndGg7ICsraikgaWYoRFsyMzFdW2pdLmNoYXJDb2RlQXQoMCkgIT09IDB4RkZGRCkgeyBlW0RbMjMxXVtqXV0gPSA1OTEzNiArIGo7IGRbNTkxMzYgKyBqXSA9IERbMjMxXVtqXTt9XG5EWzIzMl0gPSBcIu+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/vemQr+mQsOmQsemQsumQs+mQtOmQtemQtumQt+mQuOmQuemQuumQu+mQvOmQvemQv+mRgOmRgemRgumRg+mRhOmRhemRhumRh+mRiOmRiemRiumRi+mRjOmRjemRjumRj+mRkOmRkemRkumRk+mRlOmRlemRlumRl+mRmOmRmemRmumRm+mRnOmRnemRnumRn+mRoOmRoemRoumRo+mRpOmRpemRpumRp+mRqOmRqemRqumRrOmRremRrumRr++/vemRsOmRsemRsumRs+mRtOmRtemRtumRt+mRuOmRuemRuumRu+mRvOmRvemRvumRv+mSgOmSgemSgumSg+mShOmSkemSlumSmOmTh+mTj+mTk+mTlOmTmumTpumTu+mUnOmUoOeQm+eQmueRgeeRnOeRl+eRleeRmeeRt+eRreeRvueSnOeSjueSgOeSgeeSh+eSi+eSnueSqOeSqeeSkOeSp+eTkueSuumfqumfq+mfrOadjOadk+adnuadiOadqeaepeaeh+adquads+aemOaep+adteaeqOaenuaereaei+adt+advOafsOagieafmOagiuafqeaesOagjOafmeaeteafmuaes+afneaggOafg+aeuOafouagjuafgeafveagsuags+ahoOahoeahjuahouahhOahpOaig+agneahleahpuahgeahp+ahgOagvuahiuahieagqeaiteaij+ahtOaht+aik+ahq+ajgualruajvOakn+akoOajue+/vVwiLnNwbGl0KFwiXCIpO1xuZm9yKGogPSAwOyBqICE9IERbMjMyXS5sZW5ndGg7ICsraikgaWYoRFsyMzJdW2pdLmNoYXJDb2RlQXQoMCkgIT09IDB4RkZGRCkgeyBlW0RbMjMyXVtqXV0gPSA1OTM5MiArIGo7IGRbNTkzOTIgKyBqXSA9IERbMjMyXVtqXTt9XG5EWzIzM10gPSBcIu+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/vemUp+mUs+mUvemVg+mViOmVi+mVlemVmumVoOmVrumVtOmVtemVt+mVuOmVuemVuumVu+mVvOmVvemVvumWgOmWgemWgumWg+mWhOmWhemWhumWh+mWiOmWiemWiumWi+mWjOmWjemWjumWj+mWkOmWkemWkumWk+mWlOmWlemWlumWl+mWmOmWmemWmumWm+mWnOmWnemWnumWn+mWoOmWoemWoumWo+mWpOmWpemWpumWp+mWqOmWqemWqu+/vemWq+mWrOmWremWrumWr+mWsOmWsemWsumWs+mWtOmWtemWtumWt+mWuOmWuemWuumWu+mWvOmWvemWvumWv+mXgOmXgemXgumXg+mXhOmXhemXhumXh+mXiOmXiemXiumXi+akpOajsOaki+akgeall+ajo+akkOalseakuealoOalgualneamhOalq+amgOammOaluOaktOanjOamh+amiOanjuamiealpualo+alueamm+amp+amu+amq+amreanlOamseangeaniuann+amleanoOamjeanv+aor+anreaol+aomOappeansuaphOaovuaqoOapkOapm+aoteaqjuapueaoveaoqOapmOapvOaqkeaqkOaqqeaql+aqq+eMt+eNkuaugeauguauh+auhOaukuauk+aujeaumuaum+auoeauqui9q+i9rei9sei9sui9s+i9tei9tui9uOi9t+i9uei9uui9vOi9vui+gei+gui+hOi+h+i+i++/vVwiLnNwbGl0KFwiXCIpO1xuZm9yKGogPSAwOyBqICE9IERbMjMzXS5sZW5ndGg7ICsraikgaWYoRFsyMzNdW2pdLmNoYXJDb2RlQXQoMCkgIT09IDB4RkZGRCkgeyBlW0RbMjMzXVtqXV0gPSA1OTY0OCArIGo7IGRbNTk2NDggKyBqXSA9IERbMjMzXVtqXTt9XG5EWzIzNF0gPSBcIu+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/vemXjOmXjemXjumXj+mXkOmXkemXkumXk+mXlOmXlemXlumXl+mXmOmXmemXmumXm+mXnOmXnemXnumXn+mXoOmXoemXoumXo+mXpOmXpemXpumXp+mXrOmXv+mYh+mYk+mYmOmYm+mYnumYoOmYo+mYpOmYpemYpumYp+mYqOmYqemYq+mYrOmYremYr+mYsOmYt+mYuOmYuemYuumYvumZgemZg+mZiumZjumZj+mZkemZkumZk+mZlumZl++/vemZmOmZmemZmumZnOmZnemZnumZoOmZo+mZpemZpumZq+mZremZrumZr+mZsOmZsemZs+mZuOmZuemZuumZu+mZvOmZvemZvumZv+magOmagemagumag+mahOmah+maiemaiui+jei+jui+j+i+mOi+mui7juaIi+aIl+aIm+aIn+aIouaIoeaIpeaIpOaIrOiHp+eTr+eTtOeTv+eUj+eUkeeUk+aUtOaXruaXr+aXsOaYiuaYmeadsuaYg+aYleaYgOeCheabt+aYneaYtOaYseaYtuaYteiAhuaZn+aZlOaZgeaZj+aZluaZoeaZl+aZt+aahOaajOaap+aaneaavuabm+abnOabpuabqei0sui0s+i0tui0u+i0vei1gOi1hei1hui1iOi1iei1h+i1jei1lei1meinh+iniuini+injOinjuinj+inkOinkeeJrueKn+eJneeJpueJr+eJvueJv+eKhOeKi+eKjeeKj+eKkuaMiOaMsuaOsO+/vVwiLnNwbGl0KFwiXCIpO1xuZm9yKGogPSAwOyBqICE9IERbMjM0XS5sZW5ndGg7ICsraikgaWYoRFsyMzRdW2pdLmNoYXJDb2RlQXQoMCkgIT09IDB4RkZGRCkgeyBlW0RbMjM0XVtqXV0gPSA1OTkwNCArIGo7IGRbNTk5MDQgKyBqXSA9IERbMjM0XVtqXTt9XG5EWzIzNV0gPSBcIu+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/vemajOmajumakemakumak+malemalumamumam+manemanuman+maoOmaoemaoumao+mapOmapemapumaqOmaqemaqumaq+marOmaremarumar+masemasumatOmatemat+mauOmauumau+mav+mbgumbg+mbiOmbiumbi+mbkOmbkembk+mblOmblumbl+mbmOmbmembmumbm+mbnOmbnembnumbn+mboemboumbo+mbpOmbpembpumbp+mbq++/vembrOmbrembrumbsOmbsembsumbtOmbtembuOmbuumbu+mbvOmbvembv+mcgumcg+mchemciumci+mcjOmckOmckemckumclOmclemcl+mcmOmcmemcmumcm+mcnemcn+mcoOaQv+aTmOiAhOavquavs+avveavteavueawheawh+awhuawjeawleawmOawmeawmuawoeawqeawpOawquawsuaUteaVleaVq+eJjeeJkueJlueIsOiZouWIluiCn+iCnOiCk+iCvOaciuiCveiCseiCq+iCreiCtOiCt+iDp+iDqOiDqeiDquiDm+iDguiDhOiDmeiDjeiDl+ackOiDneiDq+iDseiDtOiDreiEjeiEjuiDsuiDvOacleiEkuixmuiEtuiEnuiErOiEmOiEsuiFiOiFjOiFk+iFtOiFmeiFmuiFseiFoOiFqeiFvOiFveiFreiFp+WhjeWqteiGiOiGguiGkea7leiGo+iGquiHjOacpuiHiuiGu++/vVwiLnNwbGl0KFwiXCIpO1xuZm9yKGogPSAwOyBqICE9IERbMjM1XS5sZW5ndGg7ICsraikgaWYoRFsyMzVdW2pdLmNoYXJDb2RlQXQoMCkgIT09IDB4RkZGRCkgeyBlW0RbMjM1XVtqXV0gPSA2MDE2MCArIGo7IGRbNjAxNjAgKyBqXSA9IERbMjM1XVtqXTt9XG5EWzIzNl0gPSBcIu+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/vemcoemcoumco+mcpOmcpemcpumcp+mcqOmcqemcq+mcrOmcrumcr+mcsemcs+mctOmctemctumct+mcuumcu+mcvOmcvemcv+mdgOmdgemdgumdg+mdhOmdhemdhumdh+mdiOmdiemdiumdi+mdjOmdjemdjumdj+mdkOmdkemdlOmdlemdl+mdmOmdmumdnOmdnemdn+mdo+mdpOmdpumdp+mdqOmdqumdq+mdrOmdremdrumdr+mdsOmdse+/vemdsumdtemdt+mduOmduemduumdu+mdvemdvumdv+megOmegemegumeg+mehOmehumeh+meiOmeiemeiumejOmejumej+mekOmek+melemelumel+memememumem+menOmeneiHgeiGpuaspOast+asueatg+athuatmemjkemjkumjk+mjlemjmemjmuaus+W9gOavguins+aWkOm9keaWk+aWvOaXhuaXhOaXg+aXjOaXjuaXkuaXlueCgOeCnOeClueCneeCu+eDgOeCt+eCq+eCseeDqOeDiueEkOeEk+eElueEr+eEseeFs+eFnOeFqOeFheeFsueFiueFuOeFuueGmOeGs+eGteeGqOeGoOeHoOeHlOeHp+eHueeIneeIqOeBrOeEmOeFpueGueaIvuaIveaJg+aJiOaJieeku+elgOelhuelieelm+elnOelk+elmuelouell+eloOelr+elp+eluuemheemiuemmuemp+ems+W/keW/kO+/vVwiLnNwbGl0KFwiXCIpO1xuZm9yKGogPSAwOyBqICE9IERbMjM2XS5sZW5ndGg7ICsraikgaWYoRFsyMzZdW2pdLmNoYXJDb2RlQXQoMCkgIT09IDB4RkZGRCkgeyBlW0RbMjM2XVtqXV0gPSA2MDQxNiArIGo7IGRbNjA0MTYgKyBqXSA9IERbMjM2XVtqXTt9XG5EWzIzN10gPSBcIu+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/vemenumen+meoemeoumepOmepemepumep+meqOmeqemequmerOmerumesOmesemes+metemetumet+meuOmeuemeuumeu+mevOmevemevumev+mfgOmfgemfgumfg+mfhOmfhemfhumfh+mfiOmfiemfiumfi+mfjOmfjemfjumfj+mfkOmfkemfkumfk+mflOmflemflumfl+mfmOmfmemfmumfm+mfnOmfnemfnumfn+mfoOmfoemfoumfo++/vemfpOmfpemfqOmfrumfr+mfsOmfsemfsumftOmft+mfuOmfuemfuumfu+mfvOmfvemfvumfv+mggOmggemggumgg+mghOmghemghumgh+mgiOmgiemgiumgi+mgjOmgjemgjuaAvOaBneaBmuaBp+aBgeaBmeaBo+aCq+aEhuaEjeaFneaGqeaGneaHi+aHkeaIhuiCgOiBv+ayk+aztua3vOeftuefuOeggOegieegl+egmOegkeaWq+egreegnOegneegueeguuegu+egn+egvOegpeegrOego+egqeehjuehreehluehl+egpuehkOehh+ehjOehqueim+eik+eimueih+einOeioeeio+eisueiueeipeejlOejmeejieejrOejsuekheejtOekk+ekpOeknuektOm+m+m7uem7u+m7vOebseechOecjeebueech+eciOecmuecouecmeecreecpuecteecuOedkOedkeedh+edg+edmuedqO+/vVwiLnNwbGl0KFwiXCIpO1xuZm9yKGogPSAwOyBqICE9IERbMjM3XS5sZW5ndGg7ICsraikgaWYoRFsyMzddW2pdLmNoYXJDb2RlQXQoMCkgIT09IDB4RkZGRCkgeyBlW0RbMjM3XVtqXV0gPSA2MDY3MiArIGo7IGRbNjA2NzIgKyBqXSA9IERbMjM3XVtqXTt9XG5EWzIzOF0gPSBcIu+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/vemgj+mgkOmgkemgkumgk+mglOmglemglumgl+mgmOmgmemgmumgm+mgnOmgnemgnumgn+mgoOmgoemgoumgo+mgpOmgpemgpumgp+mgqOmgqemgqumgq+mgrOmgremgrumgr+mgsOmgsemgsumgs+mgtOmgtemgtumgt+mguOmguemguumgu+mgvOmgvemgvumgv+mhgOmhgemhgumhg+mhhOmhhemhhumhh+mhiOmhiemhiumhi+mhjOmhje+/vemhjumhj+mhkOmhkemhkumhk+mhlOmhlemhlumhl+mhmOmhmemhmumhm+mhnOmhnemhnumhn+mhoOmhoemhoumho+mhpOmhpemhpumhp+mhqOmhqemhqumhq+mhrOmhremhruedouedpeedv+eejeedveeegOeejOeekeeen+eeoOeesOeeteeeveeUuueVgOeVjueVi+eViOeVm+eVsueVueeWg+e9mOe9oee9n+ipiOe9qOe9tOe9see9uee+gee9vuebjeebpeigsumShemShumSh+mSi+mSiumSjOmSjemSj+mSkOmSlOmSl+mSlemSmumSm+mSnOmSo+mSpOmSq+mSqumSremSrOmSr+mSsOmSsumStOmStumSt+mSuOmSuemSuumSvOmSvemSv+mThOmTiOmTiemTiumTi+mTjOmTjemTjumTkOmTkemTkumTlemTlumTl+mTmemTmOmTm+mTnumTn+mToOmToumTpOmTpemTp+mTqOmTqu+/vVwiLnNwbGl0KFwiXCIpO1xuZm9yKGogPSAwOyBqICE9IERbMjM4XS5sZW5ndGg7ICsraikgaWYoRFsyMzhdW2pdLmNoYXJDb2RlQXQoMCkgIT09IDB4RkZGRCkgeyBlW0RbMjM4XVtqXV0gPSA2MDkyOCArIGo7IGRbNjA5MjggKyBqXSA9IERbMjM4XVtqXTt9XG5EWzIzOV0gPSBcIu+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/vemhr+mhsOmhsemhsumhs+mhtOmii+mijumikumilemimemio+miqOmiqemiqumiq+mirOmiremirumir+misOmisemisumis+mitOmitemitumit+miuOmiuemiuumiu+mivOmivemivumiv+mjgOmjgemjgumjg+mjhOmjhemjhumjh+mjiOmjiemjiumji+mjjOmjjemjj+mjkOmjlOmjlumjl+mjm+mjnOmjnemjoOmjoemjoumjo+mjpO+/vemjpemjpumjqemjqumjq+mjrOmjremjrumjr+mjsOmjsemjsumjs+mjtOmjtemjtumjt+mjuOmjuemjuumju+mjvOmjvemjvumjv+mkgOmkgemkgumkg+mkhOmkhemkhumkh+mTqemTq+mTrumTr+mTs+mTtOmTtemTt+mTuemTvOmTvemTv+mUg+mUgumUhumUh+mUiemUiumUjemUjumUj+mUkumUk+mUlOmUlemUlumUmOmUm+mUnemUnumUn+mUoumUqumUq+mUqemUrOmUsemUsumUtOmUtumUt+mUuOmUvOmUvumUv+mVgumUtemVhOmVhemVhumViemVjOmVjumVj+mVkumVk+mVlOmVlumVl+mVmOmVmemVm+mVnumVn+mVnemVoemVoumVpOmVpemVpumVp+mVqOmVqemVqumVq+mVrOmVr+mVsemVsumVs+mUuuefp+efrOmbieenleenreeno+enq+eohuW1h+eog+eogueonueolO+/vVwiLnNwbGl0KFwiXCIpO1xuZm9yKGogPSAwOyBqICE9IERbMjM5XS5sZW5ndGg7ICsraikgaWYoRFsyMzldW2pdLmNoYXJDb2RlQXQoMCkgIT09IDB4RkZGRCkgeyBlW0RbMjM5XVtqXV0gPSA2MTE4NCArIGo7IGRbNjExODQgKyBqXSA9IERbMjM5XVtqXTt9XG5EWzI0MF0gPSBcIu+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/vemkiOmkiemkiumki+mkjOmkjumkj+mkkemkkumkk+mklOmklemklumkl+mkmOmkmemkmumkm+mknOmknemknumkn+mkoOmkoemkoumko+mkpOmkpemkpumkp+mkqOmkqemkqumkq+mkrOmkremkr+mksOmksemksumks+mktOmktemktumkt+mkuOmkuemkuumku+mkvOmkvemkvumkv+mlgOmlgemlgumlg+mlhOmlhemlhumlh+mliOmlie+/vemliumli+mljOmljemljumlj+mlkOmlkemlkumlk+mllumll+mlmOmlmemlmumlm+mlnOmlnemlnumln+mloOmloemloumlpOmlpumls+mluOmluemlu+mlvummgummg+mmieeoueeot+epkem7j+mmpeepsOeaiOeajueak+eameeapOeTnueToOeUrOm4oOm4oum4qOm4qem4qum4q+m4rOm4sum4sem4tum4uOm4t+m4uem4uum4vum5gem5gum5hOm5hum5h+m5iOm5iem5i+m5jOm5jum5kem5lem5l+m5mum5m+m5nOm5num5o+m5pum5p+m5qOm5qem5qum5q+m5rOm5sem5rem5s+eWkueWlOeWlueWoOeWneeWrOeWo+eWs+eWtOeWuOeXhOeWseeWsOeXg+eXgueXlueXjeeXo+eXqOeXpueXpOeXq+eXp+eYg+eXseeXvOeXv+eYkOeYgOeYheeYjOeYl+eYiueYpeeYmOeYleeYme+/vVwiLnNwbGl0KFwiXCIpO1xuZm9yKGogPSAwOyBqICE9IERbMjQwXS5sZW5ndGg7ICsraikgaWYoRFsyNDBdW2pdLmNoYXJDb2RlQXQoMCkgIT09IDB4RkZGRCkgeyBlW0RbMjQwXVtqXV0gPSA2MTQ0MCArIGo7IGRbNjE0NDAgKyBqXSA9IERbMjQwXVtqXTt9XG5EWzI0MV0gPSBcIu+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/vemmjOmmjummmummm+mmnOmmnemmnummn+mmoOmmoemmoummo+mmpOmmpummp+mmqemmqummq+mmrOmmremmrummr+mmsOmmsemmsumms+mmtOmmtemmtummt+mmuOmmuemmuummu+mmvOmmvemmvummv+mngOmngemngumng+mnhOmnhemnhumnh+mniOmniemniumni+mnjOmnjemnjumnj+mnkOmnkemnkumnk+mnlOmnlemnlumnl+mnmO+/vemnmemnmumnm+mnnOmnnemnnumnn+mnoOmnoemnoumno+mnpOmnpemnpumnp+mnqOmnqemnqumnq+mnrOmnremnrumnr+mnsOmnsemnsumns+mntOmntemntumnt+mnuOmnueeYm+eYvOeYoueYoOeZgOeYreeYsOeYv+eYteeZg+eYvueYs+eZjeeZnueZlOeZnOeZlueZq+eZr+e/iuerpuepuOepueeqgOeqhueqiOeqleeqpueqoOeqrOeqqOeqreeqs+ihpOihqeihsuihveihv+iiguiiouijhuiit+iivOijieijouijjuijo+ijpeijseikmuijvOijqOijvuijsOikoeikmeikk+ikm+ikiuiktOikq+iktuilgeilpuilu+eWi+iDpeeasueatOefnOiAkuiAlOiAluiAnOiAoOiAouiApeiApuiAp+iAqeiAqOiAseiAi+iAteiBg+iBhuiBjeiBkuiBqeiBseimg+mhuOmigOmig++/vVwiLnNwbGl0KFwiXCIpO1xuZm9yKGogPSAwOyBqICE9IERbMjQxXS5sZW5ndGg7ICsraikgaWYoRFsyNDFdW2pdLmNoYXJDb2RlQXQoMCkgIT09IDB4RkZGRCkgeyBlW0RbMjQxXVtqXV0gPSA2MTY5NiArIGo7IGRbNjE2OTYgKyBqXSA9IERbMjQxXVtqXTt9XG5EWzI0Ml0gPSBcIu+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/vemnuumnu+mnvOmnvemnvumnv+mogOmogemogumog+mohOmohemohumoh+moiOmoiemoiumoi+mojOmojemojumoj+mokOmokemokumok+molOmolemolumol+momOmomemomumom+monOmonemonumon+mooOmooemooumoo+mopOmopemopumop+moqOmoqemoqumoq+morOmoremorumor+mosOmosemosumos+motOmotemotumot+mouO+/vemouemouumou+movOmovemovumov+mpgOmpgempgumpg+mphOmphemphumph+mpiOmpiempiumpi+mpjOmpjempjumpj+mpkOmpkempkumpk+mplOmplemplumpl+mpmOmpmemiiemijOmijemij+milOmimumim+minumin+mioemioumipemipuiZjeiZlOiZrOiZruiZv+iZuuiZvOiZu+iaqOiajeiai+iarOianeiap+iao+iaquiak+iaqeiatuibhOiateibjuiasOiauuiaseiar+ibieibj+iatOibqeibseibsuibreibs+ibkOick+ibnuibtOibn+ibmOibkeicg+ich+ibuOiciOiciuicjeicieico+icu+icnuicpeicruicmuicvuidiOictOicseicqeict+icv+ieguicouidveidvuidu+idoOidsOidjOidruiei+idk+ido+idvOidpOidmeidpeiek+ier+ieqOifku+/vVwiLnNwbGl0KFwiXCIpO1xuZm9yKGogPSAwOyBqICE9IERbMjQyXS5sZW5ndGg7ICsraikgaWYoRFsyNDJdW2pdLmNoYXJDb2RlQXQoMCkgIT09IDB4RkZGRCkgeyBlW0RbMjQyXVtqXV0gPSA2MTk1MiArIGo7IGRbNjE5NTIgKyBqXSA9IERbMjQyXVtqXTt9XG5EWzI0M10gPSBcIu+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/vempmumpm+mpnOmpnempnumpn+mpoOmpoempoumpo+mppOmppemppumpp+mpqOmpqempqumpq+mpsumqg+mqiemqjemqjumqlOmqlemqmemqpumqqemqqumqq+mqrOmqremqrumqr+mqsumqs+mqtOmqtemquemqu+mqvemqvumqv+mrg+mrhOmrhumrh+mriOmriemriumrjemrjumrj+mrkOmrkumrlOmrlemrlumrl+mrmemrmumrm+mrnO+/vemrnemrnumroOmroumro+mrpOmrpemrp+mrqOmrqemrqumrrOmrrumrsOmrsemrsumrs+mrtOmrtemrtumrt+mruOmruumrvOmrvemrvumrv+msgOmsgemsgumshOmshemshuifhuieiOieheiereiel+ieg+ieq+ifpeierOieteies+ifi+ifk+ieveifkeifgOifiuifm+ifquifoOifruigluigk+ifvuigiuigm+igoeigueigvOe8tue9gue9hOe9heiIkOeruuerveesiOesg+eshOesleesiuesq+esj+eth+esuOesquesmeesruesseesoOespeespOess+esvuesnuetmOetmuetheetteetjOetneetoOetruetu+etouetsuetseeukOeupueup+euuOeurOeuneeuqOeuheeuqueunOeuoueuq+eutOevkeevgeevjOevneevmuevpeevpuevquewjOevvuevvOewj+ewluewi++/vVwiLnNwbGl0KFwiXCIpO1xuZm9yKGogPSAwOyBqICE9IERbMjQzXS5sZW5ndGg7ICsraikgaWYoRFsyNDNdW2pdLmNoYXJDb2RlQXQoMCkgIT09IDB4RkZGRCkgeyBlW0RbMjQzXVtqXV0gPSA2MjIwOCArIGo7IGRbNjIyMDggKyBqXSA9IERbMjQzXVtqXTt9XG5EWzI0NF0gPSBcIu+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/vemsh+msiemsiumsi+msjOmsjemsjumskOmskemskumslOmslemslumsl+msmOmsmemsmumsm+msnOmsnemsnumsoOmsoemsoumspOmspemspumsp+msqOmsqemsqumsq+msrOmsremsrumssOmssemss+mstOmstemstumst+msuOmsuemsuumsvemsvumsv+mtgOmthumtiumti+mtjOmtjumtkOmtkumtk+mtlemtlumtl+mtmOmtmemtmu+/vemtm+mtnOmtnemtnumtn+mtoOmtoemtoumto+mtpOmtpemtpumtp+mtqOmtqemtqumtq+mtrOmtremtrumtr+mtsOmtsemtsumts+mttOmttemttumtt+mtuOmtuemtuumtu+ewn+ewquewpuewuOexgeexgOiHvuiIgeiIguiIhOiHrOihhOiIoeiIouiIo+iIreiIr+iIqOiIq+iIuOiIu+iIs+iItOiIvuiJhOiJieiJi+iJj+iJmuiJn+iJqOihvuiiheiiiOijmOijn+ilnue+nee+n+e+p+e+r+e+sOe+suexvOaVieeykeeyneeynOeynueyoueysueyvOeyveezgeezh+ezjOezjeeziOezheezl+ezqOiJruaaqOe+v+e/jue/lee/pee/oee/pue/qee/rue/s+ezuOe1t+e2pue2rue5h+e6m+m6uOm6tOi1s+i2hOi2lOi2kei2sei1p+i1reixh+ixiemFiumFkOmFjumFj+mFpO+/vVwiLnNwbGl0KFwiXCIpO1xuZm9yKGogPSAwOyBqICE9IERbMjQ0XS5sZW5ndGg7ICsraikgaWYoRFsyNDRdW2pdLmNoYXJDb2RlQXQoMCkgIT09IDB4RkZGRCkgeyBlW0RbMjQ0XVtqXV0gPSA2MjQ2NCArIGo7IGRbNjI0NjQgKyBqXSA9IERbMjQ0XVtqXTt9XG5EWzI0NV0gPSBcIu+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/vemtvOmtvemtvumtv+mugOmugemugumug+muhOmuhemuhumuh+muiOmuiemuiumui+mujOmujemujumuj+mukOmukemukumuk+mulOmulemulumul+mumOmumemumumum+munOmunemunumun+muoOmuoemuoumuo+mupOmupemupumup+muqOmuqemuqumuq+murOmuremurumur+musOmusemusumus+mutOmutemutumut+muuOmuuemuuu+/vemuu+muvOmuvemuvumuv+mvgOmvgemvgumvg+mvhOmvhemvhumvh+mviOmviemviumvi+mvjOmvjemvjumvj+mvkOmvkemvkumvk+mvlOmvlemvlumvl+mvmOmvmemvmumvm+mFoumFoemFsOmFqemFr+mFvemFvumFsumFtOmFuemGjOmGhemGkOmGjemGkemGoumGo+mGqumGremGrumGr+mGtemGtOmGuuixlem5vui2uOi3q+i4hei5mei5qei2tei2v+i2vOi2uui3hOi3lui3l+i3mui3nui3jui3j+i3m+i3hui3rOi3t+i3uOi3o+i3uei3u+i3pOi4iei3vei4lOi4nei4n+i4rOi4rui4o+i4r+i4uui5gOi4uei4tei4vei4sei5iei5gei5gui5kei5kui5iui5sOi5tui5vOi5r+i5tOi6hei6j+i6lOi6kOi6nOi6nuixuOiyguiyiuiyheiymOiylOaWm+inluinnuinmuinnO+/vVwiLnNwbGl0KFwiXCIpO1xuZm9yKGogPSAwOyBqICE9IERbMjQ1XS5sZW5ndGg7ICsraikgaWYoRFsyNDVdW2pdLmNoYXJDb2RlQXQoMCkgIT09IDB4RkZGRCkgeyBlW0RbMjQ1XVtqXV0gPSA2MjcyMCArIGo7IGRbNjI3MjAgKyBqXSA9IERbMjQ1XVtqXTt9XG5EWzI0Nl0gPSBcIu+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/vemvnOmvnemvnumvn+mvoOmvoemvoumvo+mvpOmvpemvpumvp+mvqOmvqemvqumvq+mvrOmvremvrumvr+mvsOmvsemvsumvs+mvtOmvtemvtumvt+mvuOmvuemvuumvu+mvvOmvvemvvumvv+mwgOmwgemwgumwg+mwhOmwhemwhumwh+mwiOmwiemwiumwi+mwjOmwjemwjumwj+mwkOmwkemwkumwk+mwlOmwlemwlumwl+mwmOmwmemwmu+/vemwm+mwnOmwnemwnumwn+mwoOmwoemwoumwo+mwpOmwpemwpumwp+mwqOmwqemwqumwq+mwrOmwremwrumwr+mwsOmwsemwsumws+mwtOmwtemwtumwt+mwuOmwuemwuumwu+inpeinq+inr+iovuispumdk+mbqembs+mbr+mchumcgemciOmcj+mcjumcqumcremcsOmcvum+gOm+g+m+hem+hum+h+m+iOm+iem+ium+jOm7vum8i+m8jemauemavOmavembjumbkueev+mboOmKjumKrumLiOmMvumNqumPiumOj+mQvumRq+mxv+mygumyhemyhumyh+myiOeoo+myi+myjumykOmykemykumylOmylemymumym+mynumyn+myoOmyoemyoumyo+mypemypumyp+myqOmyqemyq+myremyrumysOmysemysumys+mytOmytemytumyt+myuumyu+myvOmyvemzhOmzhemzhumzh+mziumzi++/vVwiLnNwbGl0KFwiXCIpO1xuZm9yKGogPSAwOyBqICE9IERbMjQ2XS5sZW5ndGg7ICsraikgaWYoRFsyNDZdW2pdLmNoYXJDb2RlQXQoMCkgIT09IDB4RkZGRCkgeyBlW0RbMjQ2XVtqXV0gPSA2Mjk3NiArIGo7IGRbNjI5NzYgKyBqXSA9IERbMjQ2XVtqXTt9XG5EWzI0N10gPSBcIu+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/vemwvOmwvemwvumwv+mxgOmxgemxgumxg+mxhOmxhemxhumxh+mxiOmxiemxiumxi+mxjOmxjemxjumxj+mxkOmxkemxkumxk+mxlOmxlemxlumxl+mxmOmxmemxmumxm+mxnOmxnemxnumxn+mxoOmxoemxoumxo+mxpOmxpemxpumxp+mxqOmxqemxqumxq+mxrOmxremxrumxr+mxsOmxsemxsumxs+mxtOmxtemxtumxt+mxuOmxuemxuu+/vemxu+mxvemxvumygOmyg+myhOmyiemyiumyjOmyj+myk+mylumyl+mymOmymemynemyqumyrOmyr+myuemyvumyv+mzgOmzgemzgumziOmziemzkemzkumzmumzm+mzoOmzoemzjOmzjemzjumzj+mzkOmzk+mzlOmzlemzl+mzmOmzmemznOmznemzn+mzoumdvOmehemekemekumelOmer+meq+meo+mesumetOmqsemqsOmqt+m5mOmqtumquumqvOmrgemrgOmrhemrgumri+mrjOmrkemthemtg+mth+mtiemtiOmtjemtkemjqOmkjemkrumllemllOmrn+mroemrpumrr+mrq+mru+mrremruemsiOmsj+msk+msn+mso+m6vem6vue4u+m6gum6h+m6iOm6i+m6kumPlum6nem6n+m7m+m7nOm7nem7oOm7n+m7oum7qem7p+m7pem7qum7r+m8oum8rOm8r+m8uem8t+m8vem8vum9hO+/vVwiLnNwbGl0KFwiXCIpO1xuZm9yKGogPSAwOyBqICE9IERbMjQ3XS5sZW5ndGg7ICsraikgaWYoRFsyNDddW2pdLmNoYXJDb2RlQXQoMCkgIT09IDB4RkZGRCkgeyBlW0RbMjQ3XVtqXV0gPSA2MzIzMiArIGo7IGRbNjMyMzIgKyBqXSA9IERbMjQ3XVtqXTt9XG5EWzI0OF0gPSBcIu+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/vemzo+mzpOmzpemzpumzp+mzqOmzqemzqumzq+mzrOmzremzrumzr+mzsOmzsemzsumzs+mztOmztemztumzt+mzuOmzuemzuumzu+mzvOmzvemzvumzv+m0gOm0gem0gum0g+m0hOm0hem0hum0h+m0iOm0iem0ium0i+m0jOm0jem0jum0j+m0kOm0kem0kum0k+m0lOm0lem0lum0l+m0mOm0mem0mum0m+m0nOm0nem0num0n+m0oOm0oe+/vem0oum0o+m0pOm0pem0pum0p+m0qOm0qem0qum0q+m0rOm0rem0rum0r+m0sOm0sem0sum0s+m0tOm0tem0tum0t+m0uOm0uem0uum0u+m0vOm0vem0vum0v+m1gOm1gem1gu+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/vVwiLnNwbGl0KFwiXCIpO1xuZm9yKGogPSAwOyBqICE9IERbMjQ4XS5sZW5ndGg7ICsraikgaWYoRFsyNDhdW2pdLmNoYXJDb2RlQXQoMCkgIT09IDB4RkZGRCkgeyBlW0RbMjQ4XVtqXV0gPSA2MzQ4OCArIGo7IGRbNjM0ODggKyBqXSA9IERbMjQ4XVtqXTt9XG5EWzI0OV0gPSBcIu+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/vem1g+m1hOm1hem1hum1h+m1iOm1iem1ium1i+m1jOm1jem1jum1j+m1kOm1kem1kum1k+m1lOm1lem1lum1l+m1mOm1mem1mum1m+m1nOm1nem1num1n+m1oOm1oem1oum1o+m1pOm1pem1pum1p+m1qOm1qem1qum1q+m1rOm1rem1rum1r+m1sOm1sem1sum1s+m1tOm1tem1tum1t+m1uOm1uem1uum1u+m1vOm1vem1vum1v+m2gOm2ge+/vem2gum2g+m2hOm2hem2hum2h+m2iOm2iem2ium2i+m2jOm2jem2jum2j+m2kOm2kem2kum2k+m2lOm2lem2lum2l+m2mOm2mem2mum2m+m2nOm2nem2num2n+m2oOm2oem2ou+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/vVwiLnNwbGl0KFwiXCIpO1xuZm9yKGogPSAwOyBqICE9IERbMjQ5XS5sZW5ndGg7ICsraikgaWYoRFsyNDldW2pdLmNoYXJDb2RlQXQoMCkgIT09IDB4RkZGRCkgeyBlW0RbMjQ5XVtqXV0gPSA2Mzc0NCArIGo7IGRbNjM3NDQgKyBqXSA9IERbMjQ5XVtqXTt9XG5EWzI1MF0gPSBcIu+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/vem2o+m2pOm2pem2pum2p+m2qOm2qem2qum2q+m2rOm2rem2rum2r+m2sOm2sem2sum2s+m2tOm2tem2tum2t+m2uOm2uem2uum2u+m2vOm2vem2vum2v+m3gOm3gem3gum3g+m3hOm3hem3hum3h+m3iOm3iem3ium3i+m3jOm3jem3jum3j+m3kOm3kem3kum3k+m3lOm3lem3lum3l+m3mOm3mem3mum3m+m3nOm3nem3num3n+m3oOm3oe+/vem3oum3o+m3pOm3pem3pum3p+m3qOm3qem3qum3q+m3rOm3rem3rum3r+m3sOm3sem3sum3s+m3tOm3tem3tum3t+m3uOm3uem3uum3u+m3vOm3vem3vum3v+m4gOm4gem4gu+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/vVwiLnNwbGl0KFwiXCIpO1xuZm9yKGogPSAwOyBqICE9IERbMjUwXS5sZW5ndGg7ICsraikgaWYoRFsyNTBdW2pdLmNoYXJDb2RlQXQoMCkgIT09IDB4RkZGRCkgeyBlW0RbMjUwXVtqXV0gPSA2NDAwMCArIGo7IGRbNjQwMDAgKyBqXSA9IERbMjUwXVtqXTt9XG5EWzI1MV0gPSBcIu+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/vem4g+m4hOm4hem4hum4h+m4iOm4iem4ium4i+m4jOm4jem4jum4j+m4kOm4kem4kum4k+m4lOm4lem4lum4l+m4mOm4mem4mum4m+m4nOm4nem4num4pOm4p+m4rum4sOm4tOm4u+m4vOm5gOm5jem5kOm5kum5k+m5lOm5lum5mem5nem5n+m5oOm5oem5oum5pem5rum5r+m5sum5tOm5tem5tum5t+m5uOm5uem5uum5u+m5vOm5vem6gO+/vem6gem6g+m6hOm6hem6hum6iem6ium6jOm6jem6jum6j+m6kOm6kem6lOm6lem6lum6l+m6mOm6mem6mum6m+m6nOm6num6oOm6oem6oum6o+m6pOm6pem6p+m6qOm6qem6qu+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/vVwiLnNwbGl0KFwiXCIpO1xuZm9yKGogPSAwOyBqICE9IERbMjUxXS5sZW5ndGg7ICsraikgaWYoRFsyNTFdW2pdLmNoYXJDb2RlQXQoMCkgIT09IDB4RkZGRCkgeyBlW0RbMjUxXVtqXV0gPSA2NDI1NiArIGo7IGRbNjQyNTYgKyBqXSA9IERbMjUxXVtqXTt9XG5EWzI1Ml0gPSBcIu+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/vem6q+m6rOm6rem6rum6r+m6sOm6sem6sum6s+m6tem6tum6t+m6uem6uum6vOm6v+m7gOm7gem7gum7g+m7hem7hum7h+m7iOm7ium7i+m7jOm7kOm7kum7k+m7lem7lum7l+m7mem7mum7num7oem7o+m7pOm7pum7qOm7q+m7rOm7rem7rum7sOm7sem7sum7s+m7tOm7tem7tum7t+m7uOm7uum7vem7v+m8gOm8gem8gum8g+m8hOm8he+/vem8hum8h+m8iOm8iem8ium8jOm8j+m8kem8kum8lOm8lem8lum8mOm8mum8m+m8nOm8nem8num8n+m8oem8o+m8pOm8pem8pum8p+m8qOm8qem8qum8q+m8rem8rum8sOm8se+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/vVwiLnNwbGl0KFwiXCIpO1xuZm9yKGogPSAwOyBqICE9IERbMjUyXS5sZW5ndGg7ICsraikgaWYoRFsyNTJdW2pdLmNoYXJDb2RlQXQoMCkgIT09IDB4RkZGRCkgeyBlW0RbMjUyXVtqXV0gPSA2NDUxMiArIGo7IGRbNjQ1MTIgKyBqXSA9IERbMjUyXVtqXTt9XG5EWzI1M10gPSBcIu+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/vem8sum8s+m8tOm8tem8tum8uOm8uum8vOm8v+m9gOm9gem9gum9g+m9hem9hum9h+m9iOm9iem9ium9i+m9jOm9jem9jum9j+m9kum9k+m9lOm9lem9lum9l+m9mOm9mem9mum9m+m9nOm9nem9num9n+m9oOm9oem9oum9o+m9pOm9pem9pum9p+m9qOm9qem9qum9q+m9rOm9rem9rum9r+m9sOm9sem9sum9s+m9tOm9tem9tum9t+m9uO+/vem9uem9uum9u+m9vOm9vem9vum+gem+gum+jem+jum+j+m+kOm+kem+kum+k+m+lOm+lem+lum+l+m+mOm+nOm+nem+num+oem+oum+o+m+pOm+pe+krO+lue+mle+np++nse+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/vVwiLnNwbGl0KFwiXCIpO1xuZm9yKGogPSAwOyBqICE9IERbMjUzXS5sZW5ndGg7ICsraikgaWYoRFsyNTNdW2pdLmNoYXJDb2RlQXQoMCkgIT09IDB4RkZGRCkgeyBlW0RbMjUzXVtqXV0gPSA2NDc2OCArIGo7IGRbNjQ3NjggKyBqXSA9IERbMjUzXVtqXTt9XG5EWzI1NF0gPSBcIu+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+ojO+oje+oju+oj++oke+ok++olO+omO+on++ooO+ooe+oo++opO+op++oqO+oqe+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/vVwiLnNwbGl0KFwiXCIpO1xuZm9yKGogPSAwOyBqICE9IERbMjU0XS5sZW5ndGg7ICsraikgaWYoRFsyNTRdW2pdLmNoYXJDb2RlQXQoMCkgIT09IDB4RkZGRCkgeyBlW0RbMjU0XVtqXV0gPSA2NTAyNCArIGo7IGRbNjUwMjQgKyBqXSA9IERbMjU0XVtqXTt9XG5yZXR1cm4ge1wiZW5jXCI6IGUsIFwiZGVjXCI6IGQgfTsgfSkoKTtcbmNwdGFibGVbOTQ5XSA9IChmdW5jdGlvbigpeyB2YXIgZCA9IFtdLCBlID0ge30sIEQgPSBbXSwgajtcbkRbMF0gPSBcIlxcdTAwMDBcXHUwMDAxXFx1MDAwMlxcdTAwMDNcXHUwMDA0XFx1MDAwNVxcdTAwMDZcXHUwMDA3XFxiXFx0XFxuXFx1MDAwYlxcZlxcclxcdTAwMGVcXHUwMDBmXFx1MDAxMFxcdTAwMTFcXHUwMDEyXFx1MDAxM1xcdTAwMTRcXHUwMDE1XFx1MDAxNlxcdTAwMTdcXHUwMDE4XFx1MDAxOVxcdTAwMWFcXHUwMDFiXFx1MDAxY1xcdTAwMWRcXHUwMDFlXFx1MDAxZiAhXFxcIiMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojs8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW1xcXFxdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+f++/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/vVwiLnNwbGl0KFwiXCIpO1xuZm9yKGogPSAwOyBqICE9IERbMF0ubGVuZ3RoOyArK2opIGlmKERbMF1bal0uY2hhckNvZGVBdCgwKSAhPT0gMHhGRkZEKSB7IGVbRFswXVtqXV0gPSAwICsgajsgZFswICsgal0gPSBEWzBdW2pdO31cbkRbMTI5XSA9IFwi77+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+96rCC6rCD6rCF6rCG6rCL6rCM6rCN6rCO6rCP6rCY6rCe6rCf6rCh6rCi6rCj6rCl6rCm6rCn6rCo6rCp6rCq6rCr6rCu6rCy6rCz6rC077+977+977+977+977+977+96rC16rC26rC36rC66rC76rC96rC+6rC/6rGB6rGC6rGD6rGE6rGF6rGG6rGH6rGI6rGJ6rGK6rGM6rGO6rGP6rGQ6rGR6rGS6rGT6rGV77+977+977+977+977+977+96rGW6rGX6rGZ6rGa6rGb6rGd6rGe6rGf6rGg6rGh6rGi6rGj6rGk6rGl6rGm6rGn6rGo6rGp6rGq6rGr6rGs6rGt6rGu6rGv6rGy6rGz6rG16rG26rG56rG76rG86rG96rG+6rG/6rKC6rKH6rKI6rKN6rKO6rKP6rKR6rKS6rKT6rKV6rKW6rKX6rKY6rKZ6rKa6rKb6rKe6rKi6rKj6rKk6rKl6rKm6rKn6rKr6rKt6rKu6rKx6rKy6rKz6rK06rK16rK26rK36rK66rK+6rK/6rOA6rOC6rOD6rOF6rOG6rOH6rOJ6rOK6rOL6rON6rOO6rOP6rOQ6rOR6rOS6rOT6rOU6rOW6rOY6rOZ6rOa6rOb6rOc6rOd6rOe6rOf6rOi6rOj6rOl6rOm6rOp6rOr6rOt6rOu6rOy6rO06rO36rO46rO56rO66rO76rO+6rO/6rSB6rSC6rSD6rSF6rSH6rSI6rSJ6rSK6rSL6rSO6rSQ6rSS6rST77+9XCIuc3BsaXQoXCJcIik7XG5mb3IoaiA9IDA7IGogIT0gRFsxMjldLmxlbmd0aDsgKytqKSBpZihEWzEyOV1bal0uY2hhckNvZGVBdCgwKSAhPT0gMHhGRkZEKSB7IGVbRFsxMjldW2pdXSA9IDMzMDI0ICsgajsgZFszMzAyNCArIGpdID0gRFsxMjldW2pdO31cbkRbMTMwXSA9IFwi77+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+96rSU6rSV6rSW6rSX6rSZ6rSa6rSb6rSd6rSe6rSf6rSh6rSi6rSj6rSk6rSl6rSm6rSn6rSo6rSq6rSr6rSu6rSv6rSw6rSx6rSy6rSz77+977+977+977+977+977+96rS26rS36rS56rS66rS76rS96rS+6rS/6rWA6rWB6rWC6rWD6rWG6rWI6rWK6rWL6rWM6rWN6rWO6rWP6rWR6rWS6rWT6rWV6rWW6rWX77+977+977+977+977+977+96rWZ6rWa6rWb6rWc6rWd6rWe6rWf6rWg6rWi6rWk6rWl6rWm6rWn6rWo6rWp6rWq6rWr6rWu6rWv6rWx6rWy6rW36rW46rW56rW66rW+6raA6raD6raE6raF6raG6raH6raK6raL6raN6raO6raP6raR6raS6raT6raU6raV6raW6raX6raY6raZ6raa6rab6rae6raf6rag6rah6rai6raj6ral6ram6ran6rao6rap6raq6rar6ras6rat6rau6rav6raw6rax6ray6raz6ra06ra16ra26ra46ra56ra66ra76ra86ra96ra+6ra/6reC6reD6reF6reG6reH6reJ6reK6reL6reM6reN6reO6reP6reS6reU6reV6reW6reX6reY6reZ6rea6reb6red6ree6ref6reh6rei6rej6rel6rem6ren6reo6rep6req6rer6res6ret6reu6rev6rew6rex6rey6rez6re06re16re26re377+9XCIuc3BsaXQoXCJcIik7XG5mb3IoaiA9IDA7IGogIT0gRFsxMzBdLmxlbmd0aDsgKytqKSBpZihEWzEzMF1bal0uY2hhckNvZGVBdCgwKSAhPT0gMHhGRkZEKSB7IGVbRFsxMzBdW2pdXSA9IDMzMjgwICsgajsgZFszMzI4MCArIGpdID0gRFsxMzBdW2pdO31cbkRbMTMxXSA9IFwi77+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+96re66re76re96re+6riC6riD6riE6riF6riG6riH6riK6riM6riO6riP6riQ6riR6riS6riT6riV6riW6riX6riY6riZ6ria6rib6ric77+977+977+977+977+977+96rid6rie6rif6rig6rih6rii6rij6rik6ril6rim6rin6rio6rip6riq6rir6ris6rit6riu6riv6riy6riz6ri16ri26ri56ri76ri877+977+977+977+977+977+96ri96ri+6ri/6rmC6rmE6rmH6rmI6rmJ6rmL6rmP6rmR6rmS6rmT6rmV6rmX6rmY6rmZ6rma6rmb6rme6rmi6rmj6rmk6rmm6rmn6rmq6rmr6rmt6rmu6rmv6rmx6rmy6rmz6rm06rm16rm26rm36rm66rm+6rm/6rqA6rqB6rqC6rqD6rqG6rqH6rqI6rqJ6rqK6rqL6rqN6rqO6rqP6rqQ6rqR6rqS6rqT6rqU6rqV6rqW6rqX6rqY6rqZ6rqa6rqb6rqc6rqd6rqe6rqf6rqg6rqh6rqi6rqj6rqk6rql6rqm6rqn6rqo6rqp6rqq6rqr6rqs6rqt6rqu6rqv6rqw6rqx6rqy6rqz6rq06rq16rq26rq36rq46rq56rq66rq76rq/6ruB6ruC6ruD6ruF6ruG6ruH6ruI6ruJ6ruK6ruL6ruO6ruS6ruT6ruU6ruV6ruW6ruX6rua6rub6rud6rue6ruf6rug6ruh6rui6ruj6ruk6rul77+9XCIuc3BsaXQoXCJcIik7XG5mb3IoaiA9IDA7IGogIT0gRFsxMzFdLmxlbmd0aDsgKytqKSBpZihEWzEzMV1bal0uY2hhckNvZGVBdCgwKSAhPT0gMHhGRkZEKSB7IGVbRFsxMzFdW2pdXSA9IDMzNTM2ICsgajsgZFszMzUzNiArIGpdID0gRFsxMzFdW2pdO31cbkRbMTMyXSA9IFwi77+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+96rum6run6rup6ruq6rus6ruu6ruv6ruw6rux6ruy6ruz6ru16ru26ru36ru56ru66ru76ru96ru+6ru/6ryA6ryB6ryC6ryD6ryE6ryF77+977+977+977+977+977+96ryG6ryJ6ryK6ryL6ryM6ryO6ryP6ryR6ryS6ryT6ryU6ryV6ryW6ryX6ryY6ryZ6rya6ryb6ryc6ryd6rye6ryf6ryg6ryh6ryi6ryj77+977+977+977+977+977+96ryk6ryl6rym6ryn6ryo6ryp6ryq6ryr6ryu6ryv6ryx6ryz6ry16ry26ry36ry46ry56ry66ry76ry+6r2A6r2E6r2F6r2G6r2H6r2K6r2L6r2M6r2N6r2O6r2P6r2R6r2S6r2T6r2U6r2V6r2W6r2X6r2Y6r2Z6r2a6r2b6r2e6r2f6r2g6r2h6r2i6r2j6r2m6r2n6r2o6r2p6r2q6r2r6r2s6r2t6r2u6r2v6r2w6r2x6r2y6r2z6r206r216r226r236r246r266r276r286r296r2+6r2/6r6B6r6C6r6D6r6F6r6G6r6H6r6J6r6K6r6L6r6M6r6N6r6O6r6P6r6S6r6T6r6U6r6W6r6X6r6Y6r6Z6r6a6r6b6r6d6r6e6r6f6r6g6r6h6r6i6r6j6r6k6r6l6r6m6r6n6r6o6r6p6r6q6r6r6r6s6r6t6r6u6r6v6r6w6r6x6r6y6r6z6r606r616r626r636r666r676r696r6+77+9XCIuc3BsaXQoXCJcIik7XG5mb3IoaiA9IDA7IGogIT0gRFsxMzJdLmxlbmd0aDsgKytqKSBpZihEWzEzMl1bal0uY2hhckNvZGVBdCgwKSAhPT0gMHhGRkZEKSB7IGVbRFsxMzJdW2pdXSA9IDMzNzkyICsgajsgZFszMzc5MiArIGpdID0gRFsxMzJdW2pdO31cbkRbMTMzXSA9IFwi77+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+96r6/6r+B6r+C6r+D6r+E6r+F6r+G6r+K6r+M6r+P6r+Q6r+R6r+S6r+T6r+V6r+W6r+X6r+Y6r+Z6r+a6r+b6r+d6r+e6r+f6r+g6r+h77+977+977+977+977+977+96r+i6r+j6r+k6r+l6r+m6r+n6r+q6r+r6r+s6r+t6r+u6r+v6r+y6r+z6r+16r+26r+36r+56r+66r+76r+86r+96r++6r+/64CC64CD77+977+977+977+977+977+964CF64CG64CH64CI64CJ64CK64CL64CN64CO64CP64CR64CS64CT64CV64CW64CX64CY64CZ64Ca64Cb64Ce64Cf64Cg64Ch64Ci64Cj64Ck64Cl64Cm64Cn64Cp64Cq64Cr64Cs64Ct64Cu64Cv64Cw64Cx64Cy64Cz64C064C164C264C364C464C564C664C764C864C964C+64C/64GA64GB64GC64GD64GG64GH64GJ64GL64GN64GP64GQ64GR64GS64GW64GY64Ga64Gb64Gc64Ge64Gf64Gg64Gh64Gi64Gj64Gk64Gl64Gm64Gn64Go64Gp64Gq64Gr64Gs64Gt64Gu64Gv64Gw64Gx64Gy64Gz64G064G164G264G364G464G564G664G764G+64G/64KB64KC64KD64KF64KG64KH64KI64KJ64KK64KL64KO64KQ64KS64KT64KU64KV64KW64KX64Kb64Kd64Ke64Kj64Kk77+9XCIuc3BsaXQoXCJcIik7XG5mb3IoaiA9IDA7IGogIT0gRFsxMzNdLmxlbmd0aDsgKytqKSBpZihEWzEzM11bal0uY2hhckNvZGVBdCgwKSAhPT0gMHhGRkZEKSB7IGVbRFsxMzNdW2pdXSA9IDM0MDQ4ICsgajsgZFszNDA0OCArIGpdID0gRFsxMzNdW2pdO31cbkRbMTM0XSA9IFwi77+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+964Kl64Km64Kn64Kq64Kw64Ky64K264K364K564K664K764K964K+64K/64OA64OB64OC64OD64OG64OK64OL64OM64ON64OO64OP64OS77+977+977+977+977+977+964OT64OV64OW64OX64OZ64Oa64Ob64Oc64Od64Oe64Of64Oh64Oi64Oj64Ok64Om64On64Oo64Op64Oq64Or64Os64Ot64Ou64Ov64Ow77+977+977+977+977+977+964Ox64Oy64Oz64O064O164O264O364O464O564O664O764O864O964O+64O/64SA64SB64SC64SD64SE64SF64SG64SH64SK64SN64SO64SP64SR64SU64SV64SW64SX64Sa64Se64Sf64Sg64Sh64Si64Sm64Sn64Sp64Sq64Sr64St64Su64Sv64Sw64Sx64Sy64Sz64S264S664S764S864S964S+64S/64WC64WD64WF64WG64WH64WJ64WK64WL64WM64WN64WO64WP64WS64WT64WW64WX64WZ64Wa64Wb64Wd64We64Wf64Wh64Wi64Wj64Wk64Wl64Wm64Wn64Wo64Wp64Wq64Wr64Ws64Wt64Wu64Wv64Ww64Wx64Wy64Wz64W064W164W264W364W664W764W964W+64W/64aB64aD64aE64aF64aG64aH64aK64aM64aO64aP64aQ64aR64aV64aW64aX64aZ64aa64ab64ad77+9XCIuc3BsaXQoXCJcIik7XG5mb3IoaiA9IDA7IGogIT0gRFsxMzRdLmxlbmd0aDsgKytqKSBpZihEWzEzNF1bal0uY2hhckNvZGVBdCgwKSAhPT0gMHhGRkZEKSB7IGVbRFsxMzRdW2pdXSA9IDM0MzA0ICsgajsgZFszNDMwNCArIGpdID0gRFsxMzRdW2pdO31cbkRbMTM1XSA9IFwi77+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+964ae64af64ag64ah64ai64aj64ak64al64am64an64ap64aq64ar64as64at64au64av64aw64ax64ay64az64a064a164a264a364a477+977+977+977+977+977+964a564a664a764a864a964a+64a/64eA64eB64eC64eD64eE64eF64eG64eH64eI64eJ64eK64eL64eN64eO64eP64eR64eS64eT64eV77+977+977+977+977+977+964eW64eX64eY64eZ64ea64eb64ee64eg64eh64ei64ej64ek64el64em64en64eq64er64et64eu64ev64ex64ey64ez64e064e164e264e364e464e664e864e+64e/64iA64iB64iC64iD64iG64iH64iJ64iK64iN64iO64iP64iQ64iR64iS64iT64iW64iY64ia64ib64ic64id64ie64if64ih64ii64ij64ik64il64im64in64io64ip64iq64ir64is64it64iu64iv64iw64ix64iy64iz64i164i264i364i464i564i664i764i964i+64i/64mA64mB64mC64mD64mE64mF64mG64mH64mI64mJ64mK64mL64mM64mN64mO64mP64mQ64mR64mS64mT64mU64mV64mW64mX64mZ64ma64mb64md64me64mf64mh64mi64mj64mk64ml64mm64mn64mq64mr64ms64mt64mu77+9XCIuc3BsaXQoXCJcIik7XG5mb3IoaiA9IDA7IGogIT0gRFsxMzVdLmxlbmd0aDsgKytqKSBpZihEWzEzNV1bal0uY2hhckNvZGVBdCgwKSAhPT0gMHhGRkZEKSB7IGVbRFsxMzVdW2pdXSA9IDM0NTYwICsgajsgZFszNDU2MCArIGpdID0gRFsxMzVdW2pdO31cbkRbMTM2XSA9IFwi77+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+964mv64mw64mx64my64mz64m264m364m464m564m664m764m964m+64m/64qA64qB64qC64qD64qG64qH64qI64qK64qL64qM64qN64qO77+977+977+977+977+977+964qP64qS64qT64qV64qW64qX64qb64qc64qd64qe64qf64qi64qk64qn64qo64qp64qr64qt64qu64qv64qx64qy64qz64q164q264q377+977+977+977+977+977+964q464q564q664q764q864q964q+64q/64uA64uB64uC64uD64uE64uF64uG64uH64uK64uL64uN64uO64uP64uR64uT64uU64uV64uW64uX64ua64uc64ue64uf64ug64uh64uj64un64up64uq64uw64ux64uy64u264u864u964u+64yC64yD64yF64yG64yH64yJ64yK64yL64yM64yN64yO64yP64yS64yW64yX64yY64yZ64ya64yb64yd64ye64yf64yg64yh64yi64yj64yk64yl64ym64yn64yo64yp64yq64yr64ys64yt64yu64yv64yw64yx64yy64yz64y064y164y264y364y464y564y664y764y864y964y+64y/642A642B642C642D642E642F642G642H642I642J642K642L642M642N642O642P642Q642R642S642T642X642Z642a642d642g642h642i642j77+9XCIuc3BsaXQoXCJcIik7XG5mb3IoaiA9IDA7IGogIT0gRFsxMzZdLmxlbmd0aDsgKytqKSBpZihEWzEzNl1bal0uY2hhckNvZGVBdCgwKSAhPT0gMHhGRkZEKSB7IGVbRFsxMzZdW2pdXSA9IDM0ODE2ICsgajsgZFszNDgxNiArIGpdID0gRFsxMzZdW2pdO31cbkRbMTM3XSA9IFwi77+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+9642m642o642q642s642t642v642y642z64216422642364256426642764286429642+642/646C646G646H646I646J646K646L646N77+977+977+977+977+977+9646O646P646R646S646T646V646W646X646Y646Z646a646b646c646d646e646f646i646j646k646l646m646n646p646q646r646t77+977+977+977+977+977+9646u646v646w646x646y646z6460646164626463646464656466646764686469646+646/64+A64+B64+C64+D64+G64+H64+J64+K64+N64+P64+R64+S64+T64+W64+Y64+a64+c64+e64+f64+h64+i64+j64+l64+m64+n64+p64+q64+r64+s64+t64+u64+v64+w64+x64+y64+z64+064+164+264+364+464+564+664+764+964++64+/65CA65CB65CC65CD65CE65CF65CG65CH65CI65CJ65CK65CL65CM65CN65CO65CP65CR65CS65CT65CU65CV65CW65CX65CZ65Ca65Cb65Cd65Ce65Cf65Ch65Ci65Cj65Ck65Cl65Cm65Cn65Cq65Cs65Ct65Cu65Cv65Cw65Cx65Cy65Cz65C165C265C365C465C565C665C765C865C965C+65C/65GA65GB65GC65GD65GE77+9XCIuc3BsaXQoXCJcIik7XG5mb3IoaiA9IDA7IGogIT0gRFsxMzddLmxlbmd0aDsgKytqKSBpZihEWzEzN11bal0uY2hhckNvZGVBdCgwKSAhPT0gMHhGRkZEKSB7IGVbRFsxMzddW2pdXSA9IDM1MDcyICsgajsgZFszNTA3MiArIGpdID0gRFsxMzddW2pdO31cbkRbMTM4XSA9IFwi77+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+965GF65GG65GH65GI65GJ65GK65GL65GM65GN65GO65GP65GS65GT65GV65GW65GX65GZ65Ga65Gb65Gc65Gd65Ge65Gf65Gi65Gk65Gm77+977+977+977+977+977+965Gn65Go65Gp65Gq65Gr65Gt65Gu65Gv65Gw65Gx65Gy65Gz65G065G165G265G365G465G565G665G765G865G965G+65G/65KB65KC77+977+977+977+977+977+965KD65KE65KF65KG65KH65KJ65KK65KL65KM65KN65KO65KP65KQ65KR65KS65KT65KU65KV65KW65KX65KY65KZ65Ka65Kb65Kc65Ke65Kf65Kg65Kh65Ki65Kj65Kl65Km65Kn65Kp65Kq65Kr65Kt65Ku65Kv65Kw65Kx65Ky65Kz65K065K265K465K665K765K865K965K+65K/65OB65OC65OD65OF65OG65OH65OJ65OK65OL65OM65ON65OO65OP65OR65OS65OT65OU65OW65OX65OY65OZ65Oa65Ob65Oe65Of65Oh65Oi65Ol65On65Oo65Op65Oq65Or65Ou65Ow65Oy65Oz65O065O165O265O365O565O665O765O865O965O+65O/65SA65SB65SC65SD65SE65SF65SG65SH65SI65SJ65SK65SL65SM65SN65SO65SP65SQ65SR65SS65ST65SW65SX65SZ65Sa65Sd77+9XCIuc3BsaXQoXCJcIik7XG5mb3IoaiA9IDA7IGogIT0gRFsxMzhdLmxlbmd0aDsgKytqKSBpZihEWzEzOF1bal0uY2hhckNvZGVBdCgwKSAhPT0gMHhGRkZEKSB7IGVbRFsxMzhdW2pdXSA9IDM1MzI4ICsgajsgZFszNTMyOCArIGpdID0gRFsxMzhdW2pdO31cbkRbMTM5XSA9IFwi77+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+965Se65Sf65Sg65Sh65Si65Sj65Sm65Sr65Ss65St65Su65Sv65Sy65Sz65S165S265S365S565S665S765S865S965S+65S/65WC65WG77+977+977+977+977+977+965WH65WI65WJ65WK65WO65WP65WR65WS65WT65WV65WW65WX65WY65WZ65Wa65Wb65We65Wi65Wj65Wk65Wl65Wm65Wn65Wo65Wp65Wq77+977+977+977+977+977+965Wr65Ws65Wt65Wu65Wv65Ww65Wx65Wy65Wz65W065W165W265W365W465W565W665W765W865W965W+65W/65aA65aB65aC65aD65aE65aF65aG65aH65aI65aJ65aK65aL65aM65aN65aO65aP65aQ65aR65aS65aT65aU65aV65aW65aX65aY65aZ65aa65ab65ac65ad65ae65af65ai65aj65al65am65an65ap65as65at65au65av65ay65a265a365a465a565a665a+65a/65eB65eC65eD65eF65eG65eH65eI65eJ65eK65eL65eO65eS65eT65eU65eV65eW65eX65eZ65ea65eb65ec65ed65ee65ef65eg65eh65ei65ej65ek65el65em65en65eo65ep65eq65er65et65eu65ev65ew65ex65ey65ez65e065e165e265e365e465e565e665e765e865e965e+65e/77+9XCIuc3BsaXQoXCJcIik7XG5mb3IoaiA9IDA7IGogIT0gRFsxMzldLmxlbmd0aDsgKytqKSBpZihEWzEzOV1bal0uY2hhckNvZGVBdCgwKSAhPT0gMHhGRkZEKSB7IGVbRFsxMzldW2pdXSA9IDM1NTg0ICsgajsgZFszNTU4NCArIGpdID0gRFsxMzldW2pdO31cbkRbMTQwXSA9IFwi77+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+965iA65iB65iC65iD65iE65iF65iG65iH65iI65iJ65iK65iL65iM65iN65iO65iP65iS65iT65iV65iW65iX65iZ65ia65ib65ic65id77+977+977+977+977+977+965ie65if65ig65ih65ii65ij65ik65im65in65io65ip65iq65ir65it65iu65iv65iw65ix65iy65iz65i165i265i365i465i565i677+977+977+977+977+977+965i765i865i965i+65i/65mA65mB65mC65mD65mE65mF65mG65mH65mJ65mK65mL65mM65mN65mO65mP65mQ65mR65mS65mT65mU65mV65mW65mX65mY65mZ65ma65mb65mc65md65me65mf65mg65mh65mi65mj65ml65mm65mn65mp65mq65mr65ms65mt65mu65mv65mw65mx65my65mz65m065m165m265m365m465m565m665m765m865m965m+65m/65qA65qB65qC65qD65qE65qF65qG65qH65qI65qJ65qK65qL65qM65qN65qO65qP65qQ65qR65qS65qT65qU65qV65qW65qX65qY65qZ65qa65qb65qe65qf65qh65qi65qj65ql65qm65qn65qo65qp65qq65qt65qu65qv65qw65qy65qz65q065q165q265q365q465q565q665q765q865q965q+65q/65uA65uB65uC77+9XCIuc3BsaXQoXCJcIik7XG5mb3IoaiA9IDA7IGogIT0gRFsxNDBdLmxlbmd0aDsgKytqKSBpZihEWzE0MF1bal0uY2hhckNvZGVBdCgwKSAhPT0gMHhGRkZEKSB7IGVbRFsxNDBdW2pdXSA9IDM1ODQwICsgajsgZFszNTg0MCArIGpdID0gRFsxNDBdW2pdO31cbkRbMTQxXSA9IFwi77+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+965uD65uE65uF65uG65uH65uI65uJ65uK65uL65uM65uN65uO65uP65uQ65uR65uS65uT65uV65uW65uX65uY65uZ65ua65ub65uc65ud77+977+977+977+977+977+965ue65uf65ug65uh65ui65uj65uk65ul65um65un65uo65up65uq65ur65us65ut65uu65uv65ux65uy65uz65u165u265u365u565u677+977+977+977+977+977+965u765u865u965u+65u/65yC65yD65yE65yG65yH65yI65yJ65yK65yL65yM65yN65yO65yP65yQ65yR65yS65yT65yU65yV65yW65yX65yY65yZ65ya65yb65yc65yd65ye65yf65yg65yh65yi65yj65yk65yl65ym65yn65yq65yr65yt65yu65yx65yy65yz65y065y165y265y365y665y865y965y+65y/652A652B652C652D652F652G652H652J652K652L652N652O652P652Q652R652S652T652W652X652Y652Z652a652b652c652d652e652f652h652i652j652l652m652n652p652q652r652s652t652u652v652y6520652265236524652565266527652+652/656B656C656D656F656G656H656I656J656K656L656O656T656U656V656a656b656d656e77+9XCIuc3BsaXQoXCJcIik7XG5mb3IoaiA9IDA7IGogIT0gRFsxNDFdLmxlbmd0aDsgKytqKSBpZihEWzE0MV1bal0uY2hhckNvZGVBdCgwKSAhPT0gMHhGRkZEKSB7IGVbRFsxNDFdW2pdXSA9IDM2MDk2ICsgajsgZFszNjA5NiArIGpdID0gRFsxNDFdW2pdO31cbkRbMTQyXSA9IFwi77+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+9656f656h656i656j656k656l656m656n656q656u656v656w656x656y656z6562656365656566656765686569656+656/65+A65+B77+977+977+977+977+977+965+C65+D65+E65+F65+G65+I65+K65+L65+M65+N65+O65+P65+Q65+R65+S65+T65+U65+V65+W65+X65+Y65+Z65+a65+b65+c65+d77+977+977+977+977+977+965+e65+f65+g65+h65+i65+j65+k65+l65+m65+n65+o65+p65+q65+r65+u65+v65+x65+y65+z65+165+265+365+465+565+665+765++66CC66CD66CE66CF66CG66CK66CL66CN66CO66CP66CR66CS66CT66CU66CV66CW66CX66Ca66Cc66Ce66Cf66Cg66Ch66Ci66Cj66Cm66Cn66Cp66Cq66Cr66Ct66Cu66Cv66Cw66Cx66Cy66Cz66C266C666C766C866C966C+66C/66GB66GC66GD66GF66GG66GH66GI66GJ66GK66GL66GM66GN66GO66GP66GQ66GS66GU66GV66GW66GX66GY66GZ66Ga66Gb66Ge66Gf66Gh66Gi66Gj66Gl66Gm66Gn66Go66Gp66Gq66Gr66Gu66Gw66Gy66Gz66G066G166G266G366G566G666G766G966G+66G/66KA66KB66KC66KD66KE77+9XCIuc3BsaXQoXCJcIik7XG5mb3IoaiA9IDA7IGogIT0gRFsxNDJdLmxlbmd0aDsgKytqKSBpZihEWzE0Ml1bal0uY2hhckNvZGVBdCgwKSAhPT0gMHhGRkZEKSB7IGVbRFsxNDJdW2pdXSA9IDM2MzUyICsgajsgZFszNjM1MiArIGpdID0gRFsxNDJdW2pdO31cbkRbMTQzXSA9IFwi77+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+966KF66KG66KH66KI66KJ66KK66KL66KM66KO66KP66KQ66KR66KS66KT66KU66KV66KW66KX66KY66KZ66Ka66Kb66Kc66Kd66Ke66Kf77+977+977+977+977+977+966Kg66Kh66Ki66Kj66Kk66Kl66Km66Kn66Kp66Kq66Kr66Ks66Kt66Ku66Kv66Kx66Ky66Kz66K166K266K366K566K666K766K866K977+977+977+977+977+977+966K+66K/66OC66OE66OG66OH66OI66OJ66OK66OL66ON66OO66OP66OR66OS66OT66OV66OW66OX66OY66OZ66Oa66Ob66Oc66Oe66Og66Oi66Oj66Ok66Ol66Om66On66Oq66Or66Ot66Ou66Ov66Ox66Oy66Oz66O066O166O266O366O666O866O+66O/66SA66SB66SC66SD66SF66SG66SH66SI66SJ66SK66SL66SM66SN66SO66SP66SQ66SR66SS66ST66SU66SV66SW66SX66SZ66Sa66Sb66Sc66Sd66Se66Sf66Sh66Si66Sj66Sk66Sl66Sm66Sn66So66Sp66Sq66Sr66Ss66St66Su66Sv66Sw66Sx66Sy66Sz66S066S166S266S366S466S566S666S766S+66S/66WB66WC66WD66WF66WG66WH66WI66WJ66WK66WL66WN66WO66WQ66WS66WT66WU66WV66WW66WX77+9XCIuc3BsaXQoXCJcIik7XG5mb3IoaiA9IDA7IGogIT0gRFsxNDNdLmxlbmd0aDsgKytqKSBpZihEWzE0M11bal0uY2hhckNvZGVBdCgwKSAhPT0gMHhGRkZEKSB7IGVbRFsxNDNdW2pdXSA9IDM2NjA4ICsgajsgZFszNjYwOCArIGpdID0gRFsxNDNdW2pdO31cbkRbMTQ0XSA9IFwi77+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+966Wa66Wb66Wd66We66Wf66Wh66Wi66Wj66Wk66Wl66Wm66Wn66Wq66Ws66Wu66Wv66Ww66Wx66Wy66Wz66W266W366W566W666W766W977+977+977+977+977+977+966W+66W/66aA66aB66aC66aD66aG66aI66aL66aM66aP66aQ66aR66aS66aT66aU66aV66aW66aX66aY66aZ66aa66ab66ac66ad66ae77+977+977+977+977+977+966af66ag66ah66ai66aj66ak66al66am66an66ao66ap66aq66ar66au66av66ax66ay66az66a166a266a366a466a566a666a766a+66eA66eC66eD66eE66eF66eG66eH66eK66eL66eN66eT66eU66eV66eW66eX66ea66ec66ef66eg66ei66em66en66ep66eq66er66et66eu66ev66ew66ex66ey66ez66e266e766e866e966e+66e/66iC66iD66iE66iF66iG66iH66iJ66iK66iL66iM66iN66iO66iP66iQ66iR66iS66iT66iU66iW66iX66iY66iZ66ia66ib66ic66id66ie66if66ig66ih66ii66ij66ik66il66im66in66io66ip66iq66ir66is66it66iu66iv66iw66ix66iy66iz66i066i166i266i366i666i766i966i+66i/66mB66mD66mE66mF66mG77+9XCIuc3BsaXQoXCJcIik7XG5mb3IoaiA9IDA7IGogIT0gRFsxNDRdLmxlbmd0aDsgKytqKSBpZihEWzE0NF1bal0uY2hhckNvZGVBdCgwKSAhPT0gMHhGRkZEKSB7IGVbRFsxNDRdW2pdXSA9IDM2ODY0ICsgajsgZFszNjg2NCArIGpdID0gRFsxNDRdW2pdO31cbkRbMTQ1XSA9IFwi77+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+966mH66mK66mM66mP66mQ66mR66mS66mW66mX66mZ66ma66mb66md66me66mf66mg66mh66mi66mj66mm66mq66mr66ms66mt66mu66mv77+977+977+977+977+977+966my66mz66m166m266m366m566m666m766m866m966m+66m/66qA66qB66qC66qG66qI66qJ66qK66qL66qN66qO66qP66qQ66qR66qS77+977+977+977+977+977+966qT66qU66qV66qW66qX66qY66qZ66qa66qb66qc66qd66qe66qf66qg66qh66qi66qj66qk66ql66qm66qn66qq66qt66qu66qv66qx66qz66q066q166q266q366q666q866q+66q/66uA66uB66uC66uD66uF66uG66uH66uJ66uK66uL66uM66uN66uO66uP66uQ66uR66uS66uT66uU66uV66uW66uX66ua66ub66uc66ud66ue66uf66ug66uh66ui66uj66uk66ul66um66un66uo66up66uq66ur66us66ut66uu66uv66uw66ux66uy66uz66u066u166u266u366u466u566u666u766u966u+66u/66yB66yC66yD66yF66yG66yH66yI66yJ66yK66yL66yM66yO66yQ66yS66yT66yU66yV66yW66yX66yZ66ya66yb66yd66ye66yf66yh66yi66yj66yk66yl66ym66yn77+9XCIuc3BsaXQoXCJcIik7XG5mb3IoaiA9IDA7IGogIT0gRFsxNDVdLmxlbmd0aDsgKytqKSBpZihEWzE0NV1bal0uY2hhckNvZGVBdCgwKSAhPT0gMHhGRkZEKSB7IGVbRFsxNDVdW2pdXSA9IDM3MTIwICsgajsgZFszNzEyMCArIGpdID0gRFsxNDVdW2pdO31cbkRbMTQ2XSA9IFwi77+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+966yo66yq66ys66yt66yu66yv66yw66yx66yy66yz66y366y566y666y/662A662B662C662D662G662I662K662L662M662O662R662S77+977+977+977+977+977+9662T662V662W662X662Z662a662b662c662d662e662f662g662i662k662l662m662n662o662p662q662r662t662u662v662w662x77+977+977+977+977+977+9662y662z6620662166226623662466256626662766286629662+662/666A666B666C666D666E666F666G666H666J666K666L666N666O666P666R666S666T666U666V666W666X666Y666Z666a666b666c666d666e666f666g666h666i666j666l666m666n666p666q666r666t666u666v666w666x666y666z66616662666466656666666766686669666+666/66+B66+C66+D66+F66+G66+H66+J66+K66+L66+M66+N66+O66+P66+R66+S66+U66+V66+W66+X66+Y66+Z66+a66+b66+c66+d66+e66+f66+g66+h66+i66+j66+k66+l66+m66+n66+o66+p66+q66+r66+s66+t66+u66+v66+w66+x66+y66+z66+066+166+266+366+666+766+966++67CB77+9XCIuc3BsaXQoXCJcIik7XG5mb3IoaiA9IDA7IGogIT0gRFsxNDZdLmxlbmd0aDsgKytqKSBpZihEWzE0Nl1bal0uY2hhckNvZGVBdCgwKSAhPT0gMHhGRkZEKSB7IGVbRFsxNDZdW2pdXSA9IDM3Mzc2ICsgajsgZFszNzM3NiArIGpdID0gRFsxNDZdW2pdO31cbkRbMTQ3XSA9IFwi77+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+967CD67CE67CF67CG67CH67CK67CO67CQ67CS67CT67CZ67Ca67Cg67Ch67Ci67Cj67Cm67Co67Cq67Cr67Cs67Cu67Cv67Cy67Cz67C177+977+977+977+977+977+967C267C367C567C667C767C867C967C+67C/67GC67GG67GH67GI67GK67GL67GO67GP67GR67GS67GT67GU67GV67GW67GX67GY67GZ77+977+977+977+977+977+967Ga67Gb67Gc67Ge67Gf67Gg67Gh67Gi67Gj67Gk67Gl67Gm67Gn67Go67Gp67Gq67Gr67Gs67Gt67Gu67Gv67Gw67Gx67Gy67Gz67G067G167G267G367G467G567G667G767G867G967G+67G/67KA67KB67KC67KD67KG67KH67KJ67KK67KN67KP67KQ67KR67KS67KT67KW67KY67Kb67Kc67Kd67Ke67Kf67Ki67Kj67Kl67Km67Kp67Kq67Kr67Ks67Kt67Ku67Kv67Ky67K267K367K467K567K667K767K+67K/67OB67OC67OD67OF67OG67OH67OI67OJ67OK67OL67OM67OO67OS67OT67OU67OW67OX67OZ67Oa67Ob67Od67Oe67Of67Og67Oh67Oi67Oj67Ok67Ol67Om67On67Oo67Op67Oq67Or67Os67Ot67Ou67Ov67Ow67Ox67Oy67Oz67O367O567O667O767O977+9XCIuc3BsaXQoXCJcIik7XG5mb3IoaiA9IDA7IGogIT0gRFsxNDddLmxlbmd0aDsgKytqKSBpZihEWzE0N11bal0uY2hhckNvZGVBdCgwKSAhPT0gMHhGRkZEKSB7IGVbRFsxNDddW2pdXSA9IDM3NjMyICsgajsgZFszNzYzMiArIGpdID0gRFsxNDddW2pdO31cbkRbMTQ4XSA9IFwi77+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+967O+67O/67SA67SB67SC67SD67SG67SI67SK67SL67SM67SN67SO67SP67SR67SS67ST67SV67SW67SX67SY67SZ67Sa67Sb67Sc67Sd77+977+977+977+977+977+967Se67Sf67Sg67Sh67Si67Sj67Sl67Sm67Sn67So67Sp67Sq67Sr67St67Su67Sv67Sw67Sx67Sy67Sz67S067S167S267S367S467S577+977+977+977+977+977+967S667S767S867S967S+67S/67WB67WC67WD67WE67WF67WG67WH67WK67WL67WN67WO67WP67WR67WS67WT67WU67WV67WW67WX67Wa67Wb67Wc67Wd67We67Wf67Wg67Wh67Wi67Wj67Wl67Wm67Wn67Wp67Wq67Wr67Ws67Wt67Wu67Wv67Ww67Wx67Wy67Wz67W067W167W267W367W467W567W667W767W867W967W+67W/67aC67aD67aF67aG67aL67aM67aN67aO67aP67aS67aU67aW67aX67aY67ab67ad67ae67af67ag67ah67ai67aj67al67am67an67ao67ap67aq67ar67as67at67au67av67ax67ay67az67a067a167a267a367a567a667a767a867a967a+67a/67eA67eB67eC67eD67eE67eF67eG67eH67eI67eJ67eK67eL67eM67eN67eO67eP67eQ67eR77+9XCIuc3BsaXQoXCJcIik7XG5mb3IoaiA9IDA7IGogIT0gRFsxNDhdLmxlbmd0aDsgKytqKSBpZihEWzE0OF1bal0uY2hhckNvZGVBdCgwKSAhPT0gMHhGRkZEKSB7IGVbRFsxNDhdW2pdXSA9IDM3ODg4ICsgajsgZFszNzg4OCArIGpdID0gRFsxNDhdW2pdO31cbkRbMTQ5XSA9IFwi77+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+967eS67eT67eW67eX67eZ67ea67eb67ed67ee67ef67eg67eh67ei67ej67ek67el67em67en67eo67eq67er67es67et67eu67ev67ex77+977+977+977+977+977+967ey67ez67e167e267e367e567e667e767e867e967e+67e/67iB67iC67iE67iG67iH67iI67iJ67iK67iL67iO67iP67iR67iS67iT77+977+977+977+977+977+967iV67iW67iX67iY67iZ67ia67ib67ie67ig67ih67ii67ij67ik67il67im67in67io67ip67iq67ir67is67it67iu67iv67iw67ix67iy67iz67i067i167i267i367i467i567i667i767i867i967i+67i/67mA67mB67mC67mD67mG67mH67mJ67mK67mL67mN67mP67mQ67mR67mS67mT67mW67mY67mc67md67me67mf67mi67mj67ml67mm67mn67mp67mr67ms67mt67mu67mv67my67m267m367m467m567m667m+67m/67qB67qC67qD67qF67qG67qH67qI67qJ67qK67qL67qO67qS67qT67qU67qV67qW67qX67qa67qb67qc67qd67qe67qf67qg67qh67qi67qj67qk67ql67qm67qn67qp67qq67qr67qs67qt67qu67qv67qw67qx67qy67qz67q067q167q267q377+9XCIuc3BsaXQoXCJcIik7XG5mb3IoaiA9IDA7IGogIT0gRFsxNDldLmxlbmd0aDsgKytqKSBpZihEWzE0OV1bal0uY2hhckNvZGVBdCgwKSAhPT0gMHhGRkZEKSB7IGVbRFsxNDldW2pdXSA9IDM4MTQ0ICsgajsgZFszODE0NCArIGpdID0gRFsxNDldW2pdO31cbkRbMTUwXSA9IFwi77+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+967q467q567q667q767q867q967q+67q/67uA67uB67uC67uD67uE67uF67uG67uH67uI67uJ67uK67uL67uM67uN67uO67uP67uS67uT77+977+977+977+977+977+967uV67uW67uZ67ua67ub67uc67ud67ue67uf67uh67ui67um67un67uo67up67uq67ur67ut67uu67uv67uw67ux67uy67uz67u067u177+977+977+977+977+977+967u267u367u467u567u667u767u867u967u+67u/67yA67yC67yD67yE67yF67yG67yH67yK67yL67yM67yN67yO67yP67yQ67yR67yS67yT67yU67yV67yW67yX67ya67ye67yf67yg67yh67yi67yj67yk67yl67ym67yn67yo67yp67yq67yr67ys67yt67yu67yv67yw67yx67yy67yz67y067y167y267y367y467y567y667y767y867y967y+67y/672C672D672F672G672H672J672K672L672M672N672O672P672S672T672U672W672X672Y672Z672a672b672c672d672e672f672g672h672i672j672k672l672m672n672o672p672q672r672s672t672u672v672w672x672y672z6720672167226723672467256726672767286729672+672/676A676B676C77+9XCIuc3BsaXQoXCJcIik7XG5mb3IoaiA9IDA7IGogIT0gRFsxNTBdLmxlbmd0aDsgKytqKSBpZihEWzE1MF1bal0uY2hhckNvZGVBdCgwKSAhPT0gMHhGRkZEKSB7IGVbRFsxNTBdW2pdXSA9IDM4NDAwICsgajsgZFszODQwMCArIGpdID0gRFsxNTBdW2pdO31cbkRbMTUxXSA9IFwi77+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+9676D676E676F676G676H676I676J676K676L676M676N676O676P676Q676R676S676T676V676W676X676Y676Z676a676b676c676d77+977+977+977+977+977+9676e676f676g676h676i676j676k676l676m676n676o676p676q676r676s676t676u676v676x676y676z6760676167626763676477+977+977+977+977+977+967656766676767686769676+676/67+A67+B67+C67+D67+E67+G67+H67+I67+J67+K67+L67+O67+P67+R67+S67+T67+V67+W67+X67+Y67+Z67+a67+b67+d67+e67+g67+i67+j67+k67+l67+m67+n67+o67+p67+q67+r67+s67+t67+u67+v67+w67+x67+y67+z67+067+167+267+367+467+567+667+767+867+967++67+/7ICA7ICB7ICC7ICD7ICE7ICF7ICG7ICH7ICI7ICJ7ICK7ICL7ICM7ICN7ICO7ICP7ICQ7ICR7ICS7ICT7ICU7ICV7ICW7ICX7ICY7ICZ7ICa7ICb7ICc7ICd7ICe7ICf7ICg7ICh7ICi7ICj7ICk7ICl7ICm7ICn7ICo7ICp7ICq7ICr7ICs7ICt7ICu7ICv7ICw7ICx7ICy7ICz7IC07IC17IC27IC37IC47IC57IC67IC77IC97IC+7IC/77+9XCIuc3BsaXQoXCJcIik7XG5mb3IoaiA9IDA7IGogIT0gRFsxNTFdLmxlbmd0aDsgKytqKSBpZihEWzE1MV1bal0uY2hhckNvZGVBdCgwKSAhPT0gMHhGRkZEKSB7IGVbRFsxNTFdW2pdXSA9IDM4NjU2ICsgajsgZFszODY1NiArIGpdID0gRFsxNTFdW2pdO31cbkRbMTUyXSA9IFwi77+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+97IGA7IGB7IGC7IGD7IGE7IGF7IGG7IGH7IGI7IGJ7IGK7IGL7IGM7IGN7IGO7IGP7IGQ7IGS7IGT7IGU7IGV7IGW7IGX7IGZ7IGa7IGb77+977+977+977+977+977+97IGd7IGe7IGf7IGh7IGi7IGj7IGk7IGl7IGm7IGn7IGq7IGr7IGs7IGt7IGu7IGv7IGw7IGx7IGy7IGz7IG07IG17IG27IG37IG47IG577+977+977+977+977+977+97IG67IG77IG87IG97IG+7IG/7IKA7IKB7IKC7IKD7IKE7IKF7IKG7IKH7IKI7IKJ7IKK7IKL7IKM7IKN7IKO7IKP7IKS7IKT7IKV7IKW7IKX7IKZ7IKa7IKb7IKc7IKd7IKe7IKf7IKi7IKk7IKm7IKn7IKo7IKp7IKq7IKr7IKu7IKx7IKy7IK37IK47IK57IK67IK77IK+7IOC7IOD7IOE7IOG7IOH7IOK7IOL7ION7IOO7IOP7IOR7IOS7IOT7IOU7IOV7IOW7IOX7IOa7IOe7IOf7IOg7IOh7IOi7IOj7IOm7IOn7IOp7IOq7IOr7IOt7IOu7IOv7IOw7IOx7IOy7IOz7IO27IO47IO67IO77IO87IO97IO+7IO/7ISB7ISC7ISD7ISF7ISG7ISH7ISJ7ISK7ISL7ISM7ISN7ISO7ISP7ISR7ISS7IST7ISU7ISW7ISX7ISY7ISZ7ISa7ISb7ISh7ISi7ISl7ISo7ISp7ISq7ISr7ISu77+9XCIuc3BsaXQoXCJcIik7XG5mb3IoaiA9IDA7IGogIT0gRFsxNTJdLmxlbmd0aDsgKytqKSBpZihEWzE1Ml1bal0uY2hhckNvZGVBdCgwKSAhPT0gMHhGRkZEKSB7IGVbRFsxNTJdW2pdXSA9IDM4OTEyICsgajsgZFszODkxMiArIGpdID0gRFsxNTJdW2pdO31cbkRbMTUzXSA9IFwi77+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+97ISy7ISz7IS07IS17IS37IS67IS77IS97IS+7IS/7IWB7IWC7IWD7IWE7IWF7IWG7IWH7IWK7IWO7IWP7IWQ7IWR7IWS7IWT7IWW7IWX77+977+977+977+977+977+97IWZ7IWa7IWb7IWd7IWe7IWf7IWg7IWh7IWi7IWj7IWm7IWq7IWr7IWs7IWt7IWu7IWv7IWx7IWy7IWz7IW17IW27IW37IW57IW67IW777+977+977+977+977+977+97IW87IW97IW+7IW/7IaA7IaB7IaC7IaD7IaE7IaG7IaH7IaI7IaJ7IaK7IaL7IaP7IaR7IaS7IaT7IaV7IaX7IaY7IaZ7Iaa7Iab7Iae7Iag7Iai7Iaj7Iak7Iam7Ian7Iaq7Iar7Iat7Iau7Iav7Iax7Iay7Iaz7Ia07Ia17Ia27Ia37Ia47Ia57Ia67Ia77Ia87Ia+7Ia/7IeA7IeB7IeC7IeD7IeF7IeG7IeH7IeJ7IeK7IeL7IeN7IeO7IeP7IeQ7IeR7IeS7IeT7IeV7IeW7IeZ7Iea7Ieb7Iec7Ied7Iee7Ief7Ieh7Iei7Iej7Iel7Iem7Ien7Iep7Ieq7Ier7Ies7Iet7Ieu7Iev7Iey7Ie07Ie17Ie27Ie37Ie47Ie57Ie67Ie77Ie+7Ie/7IiB7IiC7IiD7IiF7IiG7IiH7IiI7IiJ7IiK7IiL7IiO7IiQ7IiS7IiT7IiU7IiV7IiW7IiX7Iia7Iib7Iid7Iie7Iih7Iii7Iij77+9XCIuc3BsaXQoXCJcIik7XG5mb3IoaiA9IDA7IGogIT0gRFsxNTNdLmxlbmd0aDsgKytqKSBpZihEWzE1M11bal0uY2hhckNvZGVBdCgwKSAhPT0gMHhGRkZEKSB7IGVbRFsxNTNdW2pdXSA9IDM5MTY4ICsgajsgZFszOTE2OCArIGpdID0gRFsxNTNdW2pdO31cbkRbMTU0XSA9IFwi77+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+97Iik7Iil7Iim7Iin7Iiq7Iis7Iiu7Iiw7Iiz7Ii17Ii27Ii37Ii47Ii57Ii67Ii77Ii87Ii97Ii+7Ii/7ImA7ImB7ImC7ImD7ImE7ImF77+977+977+977+977+977+97ImG7ImH7ImJ7ImK7ImL7ImM7ImN7ImO7ImP7ImS7ImT7ImV7ImW7ImX7ImZ7Ima7Imb7Imc7Imd7Ime7Imf7Imh7Imi7Imj7Imk7Imm77+977+977+977+977+977+97Imn7Imo7Imp7Imq7Imr7Imu7Imv7Imx7Imy7Imz7Im17Im27Im37Im47Im57Im67Im77Im+7IqA7IqC7IqD7IqE7IqF7IqG7IqH7IqK7IqL7IqM7IqN7IqO7IqP7IqR7IqS7IqT7IqU7IqV7IqW7IqX7IqZ7Iqa7Iqc7Iqe7Iqf7Iqg7Iqh7Iqi7Iqj7Iqm7Iqn7Iqp7Iqq7Iqr7Iqu7Iqv7Iqw7Iqx7Iqy7Iqz7Iq27Iq47Iq67Iq77Iq87Iq97Iq+7Iq/7IuA7IuB7IuC7IuD7IuE7IuF7IuG7IuH7IuI7IuJ7IuK7IuL7IuM7IuN7IuO7IuP7IuQ7IuR7IuS7IuT7IuU7IuV7IuW7IuX7IuY7IuZ7Iua7Iub7Iue7Iuf7Iuh7Iui7Iul7Ium7Iun7Iuo7Iup7Iuq7Iuu7Iuw7Iuy7Iuz7Iu07Iu17Iu37Iu67Iu97Iu+7Iu/7IyB7IyC7IyD7IyE7IyF7IyG7IyH7IyK7IyL7IyO7IyP77+9XCIuc3BsaXQoXCJcIik7XG5mb3IoaiA9IDA7IGogIT0gRFsxNTRdLmxlbmd0aDsgKytqKSBpZihEWzE1NF1bal0uY2hhckNvZGVBdCgwKSAhPT0gMHhGRkZEKSB7IGVbRFsxNTRdW2pdXSA9IDM5NDI0ICsgajsgZFszOTQyNCArIGpdID0gRFsxNTRdW2pdO31cbkRbMTU1XSA9IFwi77+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+97IyQ7IyR7IyS7IyW7IyX7IyZ7Iya7Iyb7Iyd7Iye7Iyf7Iyg7Iyh7Iyi7Iyj7Iym7Iyn7Iyq7Iyr7Iys7Iyt7Iyu7Iyv7Iyw7Iyx7Iyy77+977+977+977+977+977+97Iyz7Iy07Iy17Iy27Iy37Iy47Iy57Iy67Iy77Iy87Iy97Iy+7Iy/7I2A7I2B7I2C7I2D7I2E7I2G7I2H7I2I7I2J7I2K7I2L7I2M7I2N77+977+977+977+977+977+97I2O7I2P7I2Q7I2R7I2S7I2T7I2U7I2V7I2W7I2X7I2Y7I2Z7I2a7I2b7I2c7I2d7I2e7I2f7I2g7I2h7I2i7I2j7I2k7I2l7I2m7I2n7I2q7I2r7I2t7I2u7I2v7I2x7I2z7I207I217I227I237I267I277I2+7I2/7I6A7I6B7I6C7I6D7I6F7I6G7I6H7I6J7I6K7I6L7I6N7I6O7I6P7I6Q7I6R7I6S7I6T7I6U7I6V7I6W7I6X7I6Y7I6Z7I6a7I6b7I6c7I6d7I6e7I6f7I6g7I6h7I6i7I6j7I6k7I6l7I6m7I6n7I6o7I6p7I6q7I6r7I6s7I6t7I6u7I6v7I6w7I6x7I6y7I6z7I607I617I627I637I647I657I667I677I687I697I6+7I6/7I+B7I+C7I+D7I+E7I+F7I+G7I+H7I+I7I+J7I+K7I+L7I+M7I+N7I+O7I+P7I+Q7I+R7I+S7I+T7I+U7I+V7I+W7I+X7I+a77+9XCIuc3BsaXQoXCJcIik7XG5mb3IoaiA9IDA7IGogIT0gRFsxNTVdLmxlbmd0aDsgKytqKSBpZihEWzE1NV1bal0uY2hhckNvZGVBdCgwKSAhPT0gMHhGRkZEKSB7IGVbRFsxNTVdW2pdXSA9IDM5NjgwICsgajsgZFszOTY4MCArIGpdID0gRFsxNTVdW2pdO31cbkRbMTU2XSA9IFwi77+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+97I+b7I+d7I+e7I+h7I+j7I+k7I+l7I+m7I+n7I+q7I+r7I+s7I+u7I+v7I+w7I+x7I+y7I+z7I+27I+37I+57I+67I+77I+87I+97I++77+977+977+977+977+977+97I+/7JCA7JCB7JCC7JCD7JCE7JCF7JCG7JCH7JCJ7JCK7JCL7JCM7JCN7JCO7JCP7JCR7JCS7JCT7JCU7JCV7JCW7JCX7JCY7JCZ7JCa77+977+977+977+977+977+97JCb7JCc7JCd7JCe7JCf7JCg7JCh7JCi7JCj7JCl7JCm7JCn7JCo7JCp7JCq7JCr7JCt7JCu7JCv7JCx7JCy7JCz7JC17JC27JC37JC47JC57JC67JC77JC+7JC/7JGA7JGB7JGC7JGD7JGE7JGF7JGG7JGH7JGJ7JGK7JGL7JGM7JGN7JGO7JGP7JGQ7JGR7JGS7JGT7JGU7JGV7JGW7JGX7JGY7JGZ7JGa7JGb7JGc7JGd7JGe7JGf7JGg7JGh7JGi7JGj7JGm7JGn7JGp7JGq7JGr7JGt7JGu7JGv7JGw7JGx7JGy7JGz7JG27JG37JG47JG67JG77JG87JG97JG+7JG/7JKB7JKC7JKD7JKE7JKF7JKG7JKH7JKI7JKJ7JKK7JKL7JKM7JKN7JKO7JKP7JKQ7JKR7JKS7JKT7JKV7JKW7JKX7JKY7JKZ7JKa7JKb7JKd7JKe7JKf7JKg7JKh7JKi7JKj7JKk7JKl7JKm7JKn7JKo7JKp77+9XCIuc3BsaXQoXCJcIik7XG5mb3IoaiA9IDA7IGogIT0gRFsxNTZdLmxlbmd0aDsgKytqKSBpZihEWzE1Nl1bal0uY2hhckNvZGVBdCgwKSAhPT0gMHhGRkZEKSB7IGVbRFsxNTZdW2pdXSA9IDM5OTM2ICsgajsgZFszOTkzNiArIGpdID0gRFsxNTZdW2pdO31cbkRbMTU3XSA9IFwi77+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+97JKq7JKr7JKs7JKt7JKu7JKv7JKw7JKx7JKy7JKz7JK07JK17JK27JK37JK57JK67JK77JK97JK+7JK/7JOA7JOB7JOC7JOD7JOE7JOF77+977+977+977+977+977+97JOG7JOH7JOI7JOJ7JOK7JOL7JOM7JON7JOO7JOP7JOQ7JOR7JOS7JOT7JOU7JOV7JOW7JOX7JOY7JOZ7JOa7JOb7JOc7JOd7JOe7JOf77+977+977+977+977+977+97JOg7JOh7JOi7JOj7JOk7JOl7JOm7JOn7JOo7JOq7JOr7JOs7JOt7JOu7JOv7JOy7JOz7JO17JO27JO37JO57JO77JO87JO97JO+7JSC7JSD7JSE7JSF7JSG7JSH7JSI7JSJ7JSK7JSL7JSN7JSO7JSP7JSR7JSS7JST7JSV7JSW7JSX7JSY7JSZ7JSa7JSb7JSd7JSe7JSf7JSg7JSh7JSi7JSj7JSk7JSl7JSm7JSn7JSq7JSr7JSt7JSu7JSv7JSx7JSy7JSz7JS07JS17JS27JS37JS67JS87JS+7JS/7JWA7JWB7JWC7JWD7JWG7JWH7JWL7JWP7JWQ7JWR7JWS7JWW7JWa7JWb7JWc7JWf7JWi7JWj7JWl7JWm7JWn7JWp7JWq7JWr7JWs7JWt7JWu7JWv7JWy7JW27JW37JW47JW57JW67JW77JW+7JW/7JaB7JaC7JaD7JaF7JaG7JaI7JaJ7JaK7JaL7JaO7JaQ7JaS7JaT7JaU77+9XCIuc3BsaXQoXCJcIik7XG5mb3IoaiA9IDA7IGogIT0gRFsxNTddLmxlbmd0aDsgKytqKSBpZihEWzE1N11bal0uY2hhckNvZGVBdCgwKSAhPT0gMHhGRkZEKSB7IGVbRFsxNTddW2pdXSA9IDQwMTkyICsgajsgZFs0MDE5MiArIGpdID0gRFsxNTddW2pdO31cbkRbMTU4XSA9IFwi77+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+97JaW7JaZ7Jaa7Jab7Jad7Jae7Jaf7Jah7Jai7Jaj7Jak7Jal7Jam7Jan7Jao7Jaq7Jar7Jas7Jat7Jau7Jav7Jaw7Jax7Jay7Jaz7Ja277+977+977+977+977+977+97Ja37Ja67Ja/7JeA7JeB7JeC7JeD7JeL7JeN7JeP7JeS7JeT7JeV7JeW7JeX7JeZ7Jea7Jeb7Jec7Jed7Jee7Jef7Jei7Jek7Jem7Jen77+977+977+977+977+977+97Jeo7Jep7Jeq7Jer7Jev7Jex7Jey7Jez7Je17Je47Je57Je67Je77JiC7JiD7JiE7JiJ7JiK7JiL7JiN7JiO7JiP7JiR7JiS7JiT7JiU7JiV7JiW7JiX7Jia7Jid7Jie7Jif7Jig7Jih7Jii7Jij7Jim7Jin7Jip7Jiq7Jir7Jiv7Jix7Jiy7Ji27Ji47Ji67Ji87Ji97Ji+7Ji/7JmC7JmD7JmF7JmG7JmH7JmJ7JmK7JmL7JmM7JmN7JmO7JmP7JmS7JmW7JmX7JmY7JmZ7Jma7Jmb7Jme7Jmf7Jmh7Jmi7Jmj7Jmk7Jml7Jmm7Jmn7Jmo7Jmp7Jmq7Jmr7Jmt7Jmu7Jmw7Jmy7Jmz7Jm07Jm17Jm27Jm37Jm67Jm77Jm97Jm+7Jm/7JqB7JqC7JqD7JqE7JqF7JqG7JqH7JqK7JqM7JqO7JqP7JqQ7JqR7JqS7JqT7JqW7JqX7JqZ7Jqa7Jqb7Jqd7Jqe7Jqf7Jqg7Jqh7Jqi7Jqj7Jqm77+9XCIuc3BsaXQoXCJcIik7XG5mb3IoaiA9IDA7IGogIT0gRFsxNThdLmxlbmd0aDsgKytqKSBpZihEWzE1OF1bal0uY2hhckNvZGVBdCgwKSAhPT0gMHhGRkZEKSB7IGVbRFsxNThdW2pdXSA9IDQwNDQ4ICsgajsgZFs0MDQ0OCArIGpdID0gRFsxNThdW2pdO31cbkRbMTU5XSA9IFwi77+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+97Jqo7Jqq7Jqr7Jqs7Jqt7Jqu7Jqv7Jqy7Jqz7Jq17Jq27Jq37Jq77Jq87Jq97Jq+7Jq/7JuC7JuE7JuG7JuH7JuI7JuJ7JuK7JuL7JuO77+977+977+977+977+977+97JuP7JuR7JuS7JuT7JuV7JuW7JuX7JuY7JuZ7Jua7Jub7Jue7Juf7Jui7Juj7Juk7Jul7Jum7Jun7Juq7Jur7Jut7Juu7Juv7Jux7Juy77+977+977+977+977+977+97Juz7Ju07Ju17Ju27Ju37Ju67Ju77Ju87Ju+7Ju/7JyA7JyB7JyC7JyD7JyG7JyH7JyJ7JyK7JyL7JyN7JyO7JyP7JyQ7JyR7JyS7JyT7JyW7JyY7Jya7Jyb7Jyc7Jyd7Jye7Jyf7Jyi7Jyj7Jyl7Jym7Jyn7Jyp7Jyq7Jyr7Jys7Jyt7Jyu7Jyv7Jyy7Jy07Jy27Jy47Jy57Jy67Jy77Jy+7Jy/7J2B7J2C7J2D7J2F7J2G7J2H7J2I7J2J7J2L7J2O7J2Q7J2Z7J2a7J2b7J2d7J2e7J2f7J2h7J2i7J2j7J2k7J2l7J2m7J2n7J2p7J2q7J2s7J2t7J2u7J2v7J2w7J2x7J2y7J2z7J227J237J257J267J277J2/7J6A7J6B7J6C7J6G7J6L7J6M7J6N7J6P7J6S7J6T7J6V7J6Z7J6b7J6c7J6d7J6e7J6f7J6i7J6n7J6o7J6p7J6q7J6r7J6u7J6v7J6x7J6y7J6z7J617J627J6377+9XCIuc3BsaXQoXCJcIik7XG5mb3IoaiA9IDA7IGogIT0gRFsxNTldLmxlbmd0aDsgKytqKSBpZihEWzE1OV1bal0uY2hhckNvZGVBdCgwKSAhPT0gMHhGRkZEKSB7IGVbRFsxNTldW2pdXSA9IDQwNzA0ICsgajsgZFs0MDcwNCArIGpdID0gRFsxNTldW2pdO31cbkRbMTYwXSA9IFwi77+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+97J647J657J667J677J6+7J+C7J+D7J+E7J+F7J+G7J+H7J+K7J+L7J+N7J+P7J+R7J+S7J+T7J+U7J+V7J+W7J+X7J+Z7J+a7J+b7J+c77+977+977+977+977+977+97J+e7J+f7J+g7J+h7J+i7J+j7J+l7J+m7J+n7J+p7J+q7J+r7J+t7J+u7J+v7J+w7J+x7J+y7J+z7J+07J+17J+27J+37J+47J+57J+677+977+977+977+977+977+97J+77J+87J+97J++7J+/7KCC7KCD7KCF7KCG7KCH7KCJ7KCL7KCM7KCN7KCO7KCP7KCS7KCU7KCX7KCY7KCZ7KCa7KCb7KCe7KCf7KCh7KCi7KCj7KCl7KCm7KCn7KCo7KCp7KCq7KCr7KCu7KCw7KCy7KCz7KC07KC17KC27KC37KC57KC67KC77KC97KC+7KC/7KGB7KGC7KGD7KGE7KGF7KGG7KGH7KGK7KGL7KGO7KGP7KGQ7KGR7KGS7KGT7KGV7KGW7KGX7KGY7KGZ7KGa7KGb7KGc7KGd7KGe7KGf7KGg7KGh7KGi7KGj7KGk7KGl7KGm7KGn7KGo7KGp7KGq7KGr7KGs7KGt7KGu7KGv7KGy7KGz7KG17KG27KG37KG57KG77KG87KG97KG+7KG/7KKC7KKE7KKI7KKJ7KKK7KKO7KKP7KKQ7KKR7KKS7KKT7KKV7KKW7KKX7KKY7KKZ7KKa7KKb7KKc7KKe7KKg7KKi7KKj7KKk77+9XCIuc3BsaXQoXCJcIik7XG5mb3IoaiA9IDA7IGogIT0gRFsxNjBdLmxlbmd0aDsgKytqKSBpZihEWzE2MF1bal0uY2hhckNvZGVBdCgwKSAhPT0gMHhGRkZEKSB7IGVbRFsxNjBdW2pdXSA9IDQwOTYwICsgajsgZFs0MDk2MCArIGpdID0gRFsxNjBdW2pdO31cbkRbMTYxXSA9IFwi77+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+97KKl7KKm7KKn7KKp7KKq7KKr7KKs7KKt7KKu7KKv7KKw7KKx7KKy7KKz7KK07KK17KK27KK37KK47KK57KK67KK77KK+7KK/7KOA7KOB77+977+977+977+977+977+97KOC7KOD7KOF7KOG7KOH7KOJ7KOK7KOL7KON7KOO7KOP7KOQ7KOR7KOS7KOT7KOW7KOY7KOa7KOb7KOc7KOd7KOe7KOf7KOi7KOj7KOl77+977+977+977+977+977+97KOm7KOn7KOo7KOp7KOq7KOr7KOs7KOt7KOu7KOv7KOw7KOx7KOy7KOz7KO07KO27KO37KO47KO57KO67KO77KO+7KO/7KSB7KSC7KSD7KSH7KSI7KSJ7KSK7KSL7KSO44CA44CB44CCwrfigKXigKbCqOOAg8Kt4oCV4oil77y84oi84oCY4oCZ4oCc4oCd44CU44CV44CI44CJ44CK44CL44CM44CN44CO44CP44CQ44CRwrHDl8O34omg4omk4oml4oie4oi0wrDigLLigLPihIPihKvvv6Dvv6Hvv6XimYLimYDiiKDiiqXijJLiiILiiIfiiaHiiZLCp+KAu+KYhuKYheKXi+KXj+KXjuKXh+KXhuKWoeKWoOKWs+KWsuKWveKWvOKGkuKGkOKGkeKGk+KGlOOAk+KJquKJq+KImuKIveKIneKIteKIq+KIrOKIiOKIi+KKhuKKh+KKguKKg+KIquKIqeKIp+KIqO+/ou+/vVwiLnNwbGl0KFwiXCIpO1xuZm9yKGogPSAwOyBqICE9IERbMTYxXS5sZW5ndGg7ICsraikgaWYoRFsxNjFdW2pdLmNoYXJDb2RlQXQoMCkgIT09IDB4RkZGRCkgeyBlW0RbMTYxXVtqXV0gPSA0MTIxNiArIGo7IGRbNDEyMTYgKyBqXSA9IERbMTYxXVtqXTt9XG5EWzE2Ml0gPSBcIu+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/veykkOykkuykk+yklOykleykluykl+ykmeykmuykm+yknOykneyknuykn+ykoOykoeykouyko+ykpOykpeykpuykp+ykqOykqeykquykq++/ve+/ve+/ve+/ve+/ve+/veykreykruykr+yksOykseyksuyks+ykteyktuykt+ykuOykueykuuyku+ykvOykveykvuykv+ylgOylgeylguylg+ylhOylheylhuylh++/ve+/ve+/ve+/ve+/ve+/veyliOylieyliuyli+yljOyljeyljuylj+ylkuylk+ylleylluyll+ylmeylmuylm+ylnOylneylnuyln+ylouylpOylpeylpuylp+ylqOylqeylquylq+ylreylruylr+KHkuKHlOKIgOKIg8K0772ey4fLmMudy5rLmcK4y5vCocK/y5DiiK7iiJHiiI/CpOKEieKAsOKXgeKXgOKWt+KWtuKZpOKZoOKZoeKZpeKZp+KZo+KKmeKXiOKWo+KXkOKXkeKWkuKWpOKWpeKWqOKWp+KWpuKWqeKZqOKYj+KYjuKYnOKYnsK24oCg4oCh4oaV4oaX4oaZ4oaW4oaY4pmt4pmp4pmq4pms44m/44ic4oSW44+H4oSi44+C44+Y4oSh4oKswq7vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv71cIi5zcGxpdChcIlwiKTtcbmZvcihqID0gMDsgaiAhPSBEWzE2Ml0ubGVuZ3RoOyArK2opIGlmKERbMTYyXVtqXS5jaGFyQ29kZUF0KDApICE9PSAweEZGRkQpIHsgZVtEWzE2Ml1bal1dID0gNDE0NzIgKyBqOyBkWzQxNDcyICsgal0gPSBEWzE2Ml1bal07fVxuRFsxNjNdID0gXCLvv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73spbHspbLspbPspbXspbbspbfspbjspbnspbrspbvspb3spb7spb/spoDspoHspoLspoPspoTspoXspobspofsporspovspo3spo7spo/vv73vv73vv73vv73vv73vv73sppHsppLsppPsppTsppXsppbsppfspprsppzspp7spp/spqDspqHspqLspqPspqTspqXspqbspqfspqjspqnspqrspqvspqzspq3spq7vv73vv73vv73vv73vv73vv73spq/sprDsprHsprLsprPsprTsprXsprbsprfsprjsprnsprrsprvsprzspr3spr7spr/sp4Lsp4Psp4Xsp4bsp4nsp4vsp4zsp43sp47sp4/sp5Lsp5Tsp5fsp5jsp5vvvIHvvILvvIPvvITvvIXvvIbvvIfvvIjvvInvvIrvvIvvvIzvvI3vvI7vvI/vvJDvvJHvvJLvvJPvvJTvvJXvvJbvvJfvvJjvvJnvvJrvvJvvvJzvvJ3vvJ7vvJ/vvKDvvKHvvKLvvKPvvKTvvKXvvKbvvKfvvKjvvKnvvKrvvKvvvKzvvK3vvK7vvK/vvLDvvLHvvLLvvLPvvLTvvLXvvLbvvLfvvLjvvLnvvLrvvLvvv6bvvL3vvL7vvL/vvYDvvYHvvYLvvYPvvYTvvYXvvYbvvYfvvYjvvYnvvYrvvYvvvYzvvY3vvY7vvY/vvZDvvZHvvZLvvZPvvZTvvZXvvZbvvZfvvZjvvZnvvZrvvZvvvZzvvZ3vv6Pvv71cIi5zcGxpdChcIlwiKTtcbmZvcihqID0gMDsgaiAhPSBEWzE2M10ubGVuZ3RoOyArK2opIGlmKERbMTYzXVtqXS5jaGFyQ29kZUF0KDApICE9PSAweEZGRkQpIHsgZVtEWzE2M11bal1dID0gNDE3MjggKyBqOyBkWzQxNzI4ICsgal0gPSBEWzE2M11bal07fVxuRFsxNjRdID0gXCLvv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73sp57sp5/sp6Hsp6Psp6Xsp6bsp6jsp6nsp6rsp6vsp67sp7Lsp7Psp7Tsp7Xsp7bsp7fsp7rsp7vsp73sp77sp7/sqIHsqILsqIPsqITvv73vv73vv73vv73vv73vv73sqIXsqIbsqIfsqIrsqI7sqI/sqJDsqJHsqJLsqJPsqJXsqJbsqJfsqJnsqJrsqJvsqJzsqJ3sqJ7sqJ/sqKDsqKHsqKLsqKPsqKTsqKXvv73vv73vv73vv73vv73vv73sqKbsqKfsqKjsqKrsqKvsqKzsqK3sqK7sqK/sqLDsqLHsqLLsqLPsqLTsqLXsqLbsqLfsqLjsqLnsqLrsqLvsqLzsqL3sqL7sqL/sqYDsqYHsqYLsqYPsqYTsqYXsqYbjhLHjhLLjhLPjhLTjhLXjhLbjhLfjhLjjhLnjhLrjhLvjhLzjhL3jhL7jhL/jhYDjhYHjhYLjhYPjhYTjhYXjhYbjhYfjhYjjhYnjhYrjhYvjhYzjhY3jhY7jhY/jhZDjhZHjhZLjhZPjhZTjhZXjhZbjhZfjhZjjhZnjhZrjhZvjhZzjhZ3jhZ7jhZ/jhaDjhaHjhaLjhaPjhaTjhaXjhabjhafjhajjhanjharjhavjhazjha3jha7jha/jhbDjhbHjhbLjhbPjhbTjhbXjhbbjhbfjhbjjhbnjhbrjhbvjhbzjhb3jhb7jhb/jhoDjhoHjhoLjhoPjhoTjhoXjhobjhofjhojjhonjhorjhovjhozjho3jho7vv71cIi5zcGxpdChcIlwiKTtcbmZvcihqID0gMDsgaiAhPSBEWzE2NF0ubGVuZ3RoOyArK2opIGlmKERbMTY0XVtqXS5jaGFyQ29kZUF0KDApICE9PSAweEZGRkQpIHsgZVtEWzE2NF1bal1dID0gNDE5ODQgKyBqOyBkWzQxOTg0ICsgal0gPSBEWzE2NF1bal07fVxuRFsxNjVdID0gXCLvv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73sqYfsqYjsqYnsqYrsqYvsqY7sqY/sqZHsqZLsqZPsqZXsqZbsqZfsqZjsqZnsqZrsqZvsqZ7sqaLsqaPsqaTsqaXsqabsqafsqansqarvv73vv73vv73vv73vv73vv73sqavsqazsqa3sqa7sqa/sqbDsqbHsqbLsqbPsqbTsqbXsqbbsqbfsqbjsqbnsqbrsqbvsqbzsqb7sqb/sqoDsqoHsqoLsqoPsqoXsqobvv73vv73vv73vv73vv73vv73sqofsqojsqonsqorsqovsqozsqo3sqo7sqo/sqpDsqpHsqpLsqpPsqpTsqpXsqpbsqpfsqpnsqprsqpvsqpzsqp3sqp7sqp/sqqDsqqHsqqLsqqPsqqTsqqXsqqbsqqfihbDihbHihbLihbPihbTihbXihbbihbfihbjihbnvv73vv73vv73vv73vv73ihaDihaHihaLihaPihaTihaXihabihafihajihanvv73vv73vv73vv73vv73vv73vv73Okc6SzpPOlM6VzpbOl86YzpnOms6bzpzOnc6ezp/OoM6hzqPOpM6lzqbOp86ozqnvv73vv73vv73vv73vv73vv73vv73vv73Osc6yzrPOtM61zrbOt864zrnOus67zrzOvc6+zr/PgM+Bz4PPhM+Fz4bPh8+Iz4nvv73vv73vv73vv73vv73vv73vv71cIi5zcGxpdChcIlwiKTtcbmZvcihqID0gMDsgaiAhPSBEWzE2NV0ubGVuZ3RoOyArK2opIGlmKERbMTY1XVtqXS5jaGFyQ29kZUF0KDApICE9PSAweEZGRkQpIHsgZVtEWzE2NV1bal1dID0gNDIyNDAgKyBqOyBkWzQyMjQwICsgal0gPSBEWzE2NV1bal07fVxuRFsxNjZdID0gXCLvv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73sqqjsqqnsqqrsqqvsqqzsqq3sqq7sqq/sqrDsqrHsqrLsqrPsqrTsqrXsqrbsqrfsqrjsqrnsqrrsqrvsqr7sqr/sq4Hsq4Lsq4Psq4Xvv73vv73vv73vv73vv73vv73sq4bsq4fsq4jsq4nsq4rsq4vsq47sq5Dsq5Lsq5Tsq5Xsq5bsq5fsq5rsq5vsq5zsq53sq57sq5/sq6Hsq6Lsq6Psq6Tsq6Xsq6bsq6fvv73vv73vv73vv73vv73vv73sq6jsq6nsq6rsq6vsq63sq67sq6/sq7Dsq7Hsq7Lsq7Psq7Xsq7bsq7fsq7jsq7nsq7rsq7vsq7zsq73sq77sq7/srIDsrIHsrILsrIPsrITsrIXsrIbsrIfsrInsrIrilIDilILilIzilJDilJjilJTilJzilKzilKTilLTilLzilIHilIPilI/ilJPilJvilJfilKPilLPilKvilLvilYvilKDilK/ilKjilLfilL/ilJ3ilLDilKXilLjilYLilJLilJHilJrilJnilJbilJXilI7ilI3ilJ7ilJ/ilKHilKLilKbilKfilKnilKrilK3ilK7ilLHilLLilLXilLbilLnilLrilL3ilL7ilYDilYHilYPilYTilYXilYbilYfilYjilYnilYrvv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv71cIi5zcGxpdChcIlwiKTtcbmZvcihqID0gMDsgaiAhPSBEWzE2Nl0ubGVuZ3RoOyArK2opIGlmKERbMTY2XVtqXS5jaGFyQ29kZUF0KDApICE9PSAweEZGRkQpIHsgZVtEWzE2Nl1bal1dID0gNDI0OTYgKyBqOyBkWzQyNDk2ICsgal0gPSBEWzE2Nl1bal07fVxuRFsxNjddID0gXCLvv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73srIvsrIzsrI3srI7srI/srJHsrJLsrJPsrJXsrJbsrJfsrJnsrJrsrJvsrJzsrJ3srJ7srJ/srKLsrKPsrKTsrKXsrKbsrKfsrKjsrKnvv73vv73vv73vv73vv73vv73srKrsrKvsrKzsrK3srK7srK/srLDsrLHsrLLsrLPsrLTsrLXsrLbsrLfsrLjsrLnsrLrsrLvsrLzsrL3srL7srL/srYDsrYLsrYPsrYTvv73vv73vv73vv73vv73vv73srYXsrYbsrYfsrYrsrYvsrY3srY7srY/srZHsrZLsrZPsrZTsrZXsrZbsrZfsrZrsrZvsrZzsrZ7srZ/sraDsraHsraLsraPsraXsrabsrafsrajsransrarsravsrazjjpXjjpbjjpfihJPjjpjjj4TjjqPjjqTjjqXjjqbjjpnjjprjjpvjjpzjjp3jjp7jjp/jjqDjjqHjjqLjj4rjjo3jjo7jjo/jj4/jjojjjonjj4jjjqfjjqjjjrDjjrHjjrLjjrPjjrTjjrXjjrbjjrfjjrjjjrnjjoDjjoHjjoLjjoPjjoTjjrrjjrvjjrzjjr3jjr7jjr/jjpDjjpHjjpLjjpPjjpTihKbjj4Djj4Hjjorjjovjjozjj5bjj4Xjjq3jjq7jjq/jj5vjjqnjjqrjjqvjjqzjj53jj5Djj5Pjj4Pjj4njj5zjj4bvv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv71cIi5zcGxpdChcIlwiKTtcbmZvcihqID0gMDsgaiAhPSBEWzE2N10ubGVuZ3RoOyArK2opIGlmKERbMTY3XVtqXS5jaGFyQ29kZUF0KDApICE9PSAweEZGRkQpIHsgZVtEWzE2N11bal1dID0gNDI3NTIgKyBqOyBkWzQyNzUyICsgal0gPSBEWzE2N11bal07fVxuRFsxNjhdID0gXCLvv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73sra3sra7sra/srbDsrbHsrbLsrbPsrbTsrbXsrbbsrbfsrbrsrbvsrbzsrb3srb7srb/sroDsroHsroLsroPsroTsroXsrobsrofsrojvv73vv73vv73vv73vv73vv73sronsrorsrovsrozsro3sro7sro/srpDsrpHsrpLsrpPsrpTsrpXsrpbsrpfsrpjsrpnsrprsrpvsrp3srp7srp/srqDsrqHsrqLsrqPvv73vv73vv73vv73vv73vv73srqTsrqXsrqbsrqfsrqjsrqnsrqrsrqvsrqzsrq3srq7srq/srrDsrrHsrrLsrrPsrrTsrrXsrrbsrrfsrrnsrrrsrrvsrrzsrr3srr7srr/sr4Dsr4Hsr4Lsr4Psr4TDhsOQwqrEpu+/vcSy77+9xL/FgcOYxZLCusOexabFiu+/veOJoOOJoeOJouOJo+OJpOOJpeOJpuOJp+OJqOOJqeOJquOJq+OJrOOJreOJruOJr+OJsOOJseOJsuOJs+OJtOOJteOJtuOJt+OJuOOJueOJuuOJu+KTkOKTkeKTkuKTk+KTlOKTleKTluKTl+KTmOKTmeKTmuKTm+KTnOKTneKTnuKTn+KToOKToeKTouKTo+KTpOKTpeKTpuKTp+KTqOKTqeKRoOKRoeKRouKRo+KRpOKRpeKRpuKRp+KRqOKRqeKRquKRq+KRrOKRreKRrsK94oWT4oWUwrzCvuKFm+KFnOKFneKFnu+/vVwiLnNwbGl0KFwiXCIpO1xuZm9yKGogPSAwOyBqICE9IERbMTY4XS5sZW5ndGg7ICsraikgaWYoRFsxNjhdW2pdLmNoYXJDb2RlQXQoMCkgIT09IDB4RkZGRCkgeyBlW0RbMTY4XVtqXV0gPSA0MzAwOCArIGo7IGRbNDMwMDggKyBqXSA9IERbMTY4XVtqXTt9XG5EWzE2OV0gPSBcIu+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/veyvheyvhuyvh+yviOyvieyviuyvi+yvjOyvjeyvjuyvj+yvkOyvkeyvkuyvk+yvleyvluyvl+yvmOyvmeyvmuyvm+yvnOyvneyvnuyvn++/ve+/ve+/ve+/ve+/ve+/veyvoOyvoeyvouyvo+yvpeyvpuyvqOyvquyvq+yvrOyvreyvruyvr+yvsOyvseyvsuyvs+yvtOyvteyvtuyvt+yvuOyvueyvuuyvu+yvvO+/ve+/ve+/ve+/ve+/ve+/veyvveyvvuyvv+ywgOywgeywguywg+ywhOywheywhuywh+ywiOywieywiuywi+ywjuywj+ywkeywkuywk+ywleywluywl+ywmOywmeywmuywm+ywnuywn+ywoOywo+ywpMOmxJHDsMSnxLHEs8S4xYDFgsO4xZPDn8O+xafFi8WJ44iA44iB44iC44iD44iE44iF44iG44iH44iI44iJ44iK44iL44iM44iN44iO44iP44iQ44iR44iS44iT44iU44iV44iW44iX44iY44iZ44ia44ib4pKc4pKd4pKe4pKf4pKg4pKh4pKi4pKj4pKk4pKl4pKm4pKn4pKo4pKp4pKq4pKr4pKs4pKt4pKu4pKv4pKw4pKx4pKy4pKz4pK04pK14pG04pG14pG24pG34pG44pG54pG64pG74pG84pG94pG+4pG/4pKA4pKB4pKCwrnCssKz4oG04oG/4oKB4oKC4oKD4oKE77+9XCIuc3BsaXQoXCJcIik7XG5mb3IoaiA9IDA7IGogIT0gRFsxNjldLmxlbmd0aDsgKytqKSBpZihEWzE2OV1bal0uY2hhckNvZGVBdCgwKSAhPT0gMHhGRkZEKSB7IGVbRFsxNjldW2pdXSA9IDQzMjY0ICsgajsgZFs0MzI2NCArIGpdID0gRFsxNjldW2pdO31cbkRbMTcwXSA9IFwi77+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+97LCl7LCm7LCq7LCr7LCt7LCv7LCx7LCy7LCz7LC07LC17LC27LC37LC67LC/7LGA7LGB7LGC7LGD7LGG7LGH7LGJ7LGK7LGL7LGN7LGO77+977+977+977+977+977+97LGP7LGQ7LGR7LGS7LGT7LGW7LGa7LGb7LGc7LGd7LGe7LGf7LGh7LGi7LGj7LGl7LGn7LGp7LGq7LGr7LGs7LGt7LGu7LGv7LGx7LGy77+977+977+977+977+977+97LGz7LG07LG27LG37LG47LG57LG67LG77LG87LG97LG+7LG/7LKA7LKB7LKC7LKD7LKE7LKF7LKG7LKH7LKI7LKJ7LKK7LKL7LKM7LKN7LKO7LKP7LKQ7LKR7LKS7LKT44GB44GC44GD44GE44GF44GG44GH44GI44GJ44GK44GL44GM44GN44GO44GP44GQ44GR44GS44GT44GU44GV44GW44GX44GY44GZ44Ga44Gb44Gc44Gd44Ge44Gf44Gg44Gh44Gi44Gj44Gk44Gl44Gm44Gn44Go44Gp44Gq44Gr44Gs44Gt44Gu44Gv44Gw44Gx44Gy44Gz44G044G144G244G344G444G544G644G744G844G944G+44G/44KA44KB44KC44KD44KE44KF44KG44KH44KI44KJ44KK44KL44KM44KN44KO44KP44KQ44KR44KS44KT77+977+977+977+977+977+977+977+977+977+977+977+9XCIuc3BsaXQoXCJcIik7XG5mb3IoaiA9IDA7IGogIT0gRFsxNzBdLmxlbmd0aDsgKytqKSBpZihEWzE3MF1bal0uY2hhckNvZGVBdCgwKSAhPT0gMHhGRkZEKSB7IGVbRFsxNzBdW2pdXSA9IDQzNTIwICsgajsgZFs0MzUyMCArIGpdID0gRFsxNzBdW2pdO31cbkRbMTcxXSA9IFwi77+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+97LKU7LKV7LKW7LKX7LKa7LKb7LKd7LKe7LKf7LKh7LKi7LKj7LKk7LKl7LKm7LKn7LKq7LKu7LKv7LKw7LKx7LKy7LKz7LK27LK37LK577+977+977+977+977+977+97LK67LK77LK97LK+7LK/7LOA7LOB7LOC7LOD7LOG7LOI7LOK7LOL7LOM7LON7LOO7LOP7LOR7LOS7LOT7LOV7LOW7LOX7LOY7LOZ7LOa77+977+977+977+977+977+97LOb7LOc7LOd7LOe7LOf7LOg7LOh7LOi7LOj7LOl7LOm7LOn7LOo7LOp7LOq7LOr7LOt7LOu7LOv7LOx7LOy7LOz7LO07LO17LO27LO37LO47LO57LO67LO77LO87LO944Kh44Ki44Kj44Kk44Kl44Km44Kn44Ko44Kp44Kq44Kr44Ks44Kt44Ku44Kv44Kw44Kx44Ky44Kz44K044K144K244K344K444K544K644K744K844K944K+44K/44OA44OB44OC44OD44OE44OF44OG44OH44OI44OJ44OK44OL44OM44ON44OO44OP44OQ44OR44OS44OT44OU44OV44OW44OX44OY44OZ44Oa44Ob44Oc44Od44Oe44Of44Og44Oh44Oi44Oj44Ok44Ol44Om44On44Oo44Op44Oq44Or44Os44Ot44Ou44Ov44Ow44Ox44Oy44Oz44O044O144O277+977+977+977+977+977+977+977+977+9XCIuc3BsaXQoXCJcIik7XG5mb3IoaiA9IDA7IGogIT0gRFsxNzFdLmxlbmd0aDsgKytqKSBpZihEWzE3MV1bal0uY2hhckNvZGVBdCgwKSAhPT0gMHhGRkZEKSB7IGVbRFsxNzFdW2pdXSA9IDQzNzc2ICsgajsgZFs0Mzc3NiArIGpdID0gRFsxNzFdW2pdO31cbkRbMTcyXSA9IFwi77+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+97LO+7LO/7LSA7LSC7LSD7LSE7LSF7LSG7LSH7LSK7LSL7LSN7LSO7LSP7LSR7LSS7LST7LSU7LSV7LSW7LSX7LSa7LSc7LSe7LSf7LSg77+977+977+977+977+977+97LSh7LSi7LSj7LSl7LSm7LSn7LSp7LSq7LSr7LSt7LSu7LSv7LSw7LSx7LSy7LSz7LS07LS17LS27LS37LS47LS67LS77LS87LS97LS+77+977+977+977+977+977+97LS/7LWA7LWB7LWC7LWD7LWE7LWF7LWG7LWH7LWI7LWJ7LWK7LWL7LWM7LWN7LWO7LWP7LWQ7LWR7LWS7LWT7LWU7LWV7LWW7LWX7LWY7LWZ7LWa7LWb7LWd7LWe7LWf0JDQkdCS0JPQlNCV0IHQltCX0JjQmdCa0JvQnNCd0J7Qn9Cg0KHQotCj0KTQpdCm0KfQqNCp0KrQq9Cs0K3QrtCv77+977+977+977+977+977+977+977+977+977+977+977+977+977+977+90LDQsdCy0LPQtNC10ZHQttC30LjQudC60LvQvNC90L7Qv9GA0YHRgtGD0YTRhdGG0YfRiNGJ0YrRi9GM0Y3RjtGP77+977+977+977+977+977+977+977+977+977+977+977+977+977+9XCIuc3BsaXQoXCJcIik7XG5mb3IoaiA9IDA7IGogIT0gRFsxNzJdLmxlbmd0aDsgKytqKSBpZihEWzE3Ml1bal0uY2hhckNvZGVBdCgwKSAhPT0gMHhGRkZEKSB7IGVbRFsxNzJdW2pdXSA9IDQ0MDMyICsgajsgZFs0NDAzMiArIGpdID0gRFsxNzJdW2pdO31cbkRbMTczXSA9IFwi77+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+97LWh7LWi7LWj7LWl7LWm7LWn7LWo7LWp7LWq7LWr7LWu7LWw7LWy7LWz7LW07LW17LW27LW37LW57LW67LW77LW87LW97LW+7LW/7LaA77+977+977+977+977+977+97LaB7LaC7LaD7LaE7LaF7LaG7LaH7LaJ7LaK7LaL7LaM7LaN7LaO7LaP7LaQ7LaR7LaS7LaT7LaW7LaX7LaZ7Laa7Lab7Lad7Lae7Laf77+977+977+977+977+977+97Lag7Lah7Lai7Laj7Lam7Lao7Laq7Lar7Las7Lat7Lau7Lav7Lax7Lay7Laz7La07La17La27La37La47La57La67La77La87La97La+7La/7LeA7LeB7LeC7LeD7LeF77+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+9XCIuc3BsaXQoXCJcIik7XG5mb3IoaiA9IDA7IGogIT0gRFsxNzNdLmxlbmd0aDsgKytqKSBpZihEWzE3M11bal0uY2hhckNvZGVBdCgwKSAhPT0gMHhGRkZEKSB7IGVbRFsxNzNdW2pdXSA9IDQ0Mjg4ICsgajsgZFs0NDI4OCArIGpdID0gRFsxNzNdW2pdO31cbkRbMTc0XSA9IFwi77+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+97LeG7LeH7LeI7LeJ7LeK7LeL7LeN7LeO7LeP7LeR7LeS7LeT7LeU7LeV7LeW7LeX7LeY7LeZ7Lea7Leb7Lec7Led7Lee7Lef7Leg7Leh77+977+977+977+977+977+97Lei7Lej7Lek7Lel7Lem7Len7Lep7Leq7Ler7Let7Leu7Lev7Lex7Ley7Lez7Le07Le17Le27Le37Le67Le87Le+7Le/7LiA7LiB7LiC77+977+977+977+977+977+97LiD7LiF7LiG7LiH7LiJ7LiK7LiL7LiN7LiO7LiP7LiQ7LiR7LiS7LiT7LiV7LiW7LiX7LiY7Lia7Lib7Lic7Lid7Lie7Lif7Lii7Lij7Lil7Lim7Lin7Lip7Liq7Lir77+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+9XCIuc3BsaXQoXCJcIik7XG5mb3IoaiA9IDA7IGogIT0gRFsxNzRdLmxlbmd0aDsgKytqKSBpZihEWzE3NF1bal0uY2hhckNvZGVBdCgwKSAhPT0gMHhGRkZEKSB7IGVbRFsxNzRdW2pdXSA9IDQ0NTQ0ICsgajsgZFs0NDU0NCArIGpdID0gRFsxNzRdW2pdO31cbkRbMTc1XSA9IFwi77+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+97Lis7Lit7Liu7Liv7Liy7Li07Li27Li37Li47Li57Li67Li77Li87Li97Li+7Li/7LmA7LmB7LmC7LmD7LmE7LmF7LmG7LmH7LmI7LmJ77+977+977+977+977+977+97LmK7LmL7LmM7LmN7LmO7LmP7LmQ7LmR7LmS7LmT7LmU7LmV7LmW7LmX7Lma7Lmb7Lmd7Lme7Lmi7Lmj7Lmk7Lml7Lmm7Lmn7Lmq7Lms77+977+977+977+977+977+97Lmu7Lmv7Lmw7Lmx7Lmy7Lmz7Lm27Lm37Lm57Lm67Lm77Lm97Lm+7Lm/7LqA7LqB7LqC7LqD7LqG7LqI7LqK7LqL7LqM7LqN7LqO7LqP7LqS7LqT7LqV7LqW7LqX7LqZ77+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+9XCIuc3BsaXQoXCJcIik7XG5mb3IoaiA9IDA7IGogIT0gRFsxNzVdLmxlbmd0aDsgKytqKSBpZihEWzE3NV1bal0uY2hhckNvZGVBdCgwKSAhPT0gMHhGRkZEKSB7IGVbRFsxNzVdW2pdXSA9IDQ0ODAwICsgajsgZFs0NDgwMCArIGpdID0gRFsxNzVdW2pdO31cbkRbMTc2XSA9IFwi77+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+97Lqa7Lqb7Lqc7Lqd7Lqe7Lqf7Lqi7Lqm7Lqn7Lqo7Lqp7Lqq7Lqr7Lqu7Lqv7Lqw7Lqx7Lqy7Lqz7Lq07Lq17Lq27Lq37Lq47Lq57Lq677+977+977+977+977+977+97Lq77Lq87Lq97Lq+7Lq/7LuA7LuC7LuD7LuE7LuF7LuG7LuH7LuI7LuJ7LuK7LuL7LuM7LuN7LuO7LuP7LuQ7LuR7LuS7LuT7LuU7LuV77+977+977+977+977+977+97LuW7LuX7LuY7LuZ7Lua7Lub7Luc7Lud7Lue7Luf7Lug7Luh7Lui7Luj7Lum7Lun7Lup7Luq7Lut7Luu7Luv7Luw7Lux7Luy7Luz7Lu27Lu67Lu77Lu87Lu97Lu+7Lu/6rCA6rCB6rCE6rCH6rCI6rCJ6rCK6rCQ6rCR6rCS6rCT6rCU6rCV6rCW6rCX6rCZ6rCa6rCb6rCc6rCd6rCg6rCk6rCs6rCt6rCv6rCw6rCx6rC46rC56rC86rGA6rGL6rGN6rGU6rGY6rGc6rGw6rGx6rG06rG36rG46rG66rKA6rKB6rKD6rKE6rKF6rKG6rKJ6rKK6rKL6rKM6rKQ6rKU6rKc6rKd6rKf6rKg6rKh6rKo6rKp6rKq6rKs6rKv6rKw6rK46rK56rK76rK86rK96rOB6rOE6rOI6rOM6rOV6rOX6rOg6rOh6rOk6rOn6rOo6rOq6rOs6rOv6rOw6rOx6rOz6rO16rO26rO86rO96rSA6rSE6rSG77+9XCIuc3BsaXQoXCJcIik7XG5mb3IoaiA9IDA7IGogIT0gRFsxNzZdLmxlbmd0aDsgKytqKSBpZihEWzE3Nl1bal0uY2hhckNvZGVBdCgwKSAhPT0gMHhGRkZEKSB7IGVbRFsxNzZdW2pdXSA9IDQ1MDU2ICsgajsgZFs0NTA1NiArIGpdID0gRFsxNzZdW2pdO31cbkRbMTc3XSA9IFwi77+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+97LyC7LyD7LyF7LyG7LyH7LyJ7LyK7LyL7LyM7LyN7LyO7LyP7LyS7LyU7LyW7LyX7LyY7LyZ7Lya7Lyb7Lyd7Lye7Lyf7Lyh7Lyi7Lyj77+977+977+977+977+977+97Lyl7Lym7Lyn7Lyo7Lyp7Lyq7Lyr7Lyu7Lyy7Lyz7Ly07Ly17Ly27Ly37Ly57Ly67Ly77Ly87Ly97Ly+7Ly/7L2A7L2B7L2C7L2D7L2E77+977+977+977+977+977+97L2F7L2G7L2H7L2I7L2J7L2K7L2L7L2M7L2N7L2O7L2P7L2Q7L2R7L2S7L2T7L2W7L2X7L2Z7L2a7L2b7L2d7L2e7L2f7L2g7L2h7L2i7L2j7L2m7L2o7L2q7L2r7L2s6rSM6rSN6rSP6rSR6rSY6rSc6rSg6rSp6rSs6rSt6rS06rS16rS46rS86rWE6rWF6rWH6rWJ6rWQ6rWU6rWY6rWh6rWj6rWs6rWt6rWw6rWz6rW06rW16rW26rW76rW86rW96rW/6raB6raC6raI6raJ6raM6raQ6rac6rad6rak6ra36reA6reB6reE6reI6reQ6reR6reT6rec6reg6rek6re46re56re86re/6riA6riB6riI6riJ6riL6riN6riU6riw6rix6ri06ri36ri46ri66rmA6rmB6rmD6rmF6rmG6rmK6rmM6rmN6rmO6rmQ6rmU6rmW6rmc6rmd6rmf6rmg6rmh6rml6rmo6rmp6rms6rmw6rm477+9XCIuc3BsaXQoXCJcIik7XG5mb3IoaiA9IDA7IGogIT0gRFsxNzddLmxlbmd0aDsgKytqKSBpZihEWzE3N11bal0uY2hhckNvZGVBdCgwKSAhPT0gMHhGRkZEKSB7IGVbRFsxNzddW2pdXSA9IDQ1MzEyICsgajsgZFs0NTMxMiArIGpdID0gRFsxNzddW2pdO31cbkRbMTc4XSA9IFwi77+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+97L2t7L2u7L2v7L2y7L2z7L217L227L237L257L267L277L287L297L2+7L2/7L6B7L6C7L6D7L6E7L6G7L6H7L6I7L6J7L6K7L6L7L6N77+977+977+977+977+977+97L6O7L6P7L6Q7L6R7L6S7L6T7L6U7L6V7L6W7L6X7L6Y7L6Z7L6a7L6b7L6c7L6d7L6e7L6f7L6g7L6i7L6j7L6k7L6l7L6m7L6n7L6p77+977+977+977+977+977+97L6q7L6r7L6s7L6t7L6u7L6v7L6x7L6y7L6z7L607L617L627L637L647L657L667L677L687L697L6+7L6/7L+A7L+B7L+C7L+D7L+F7L+G7L+H7L+I7L+J7L+K7L+L6rm56rm76rm86rm96rqE6rqF6rqM6rq86rq96rq+6ruA6ruE6ruM6ruN6ruP6ruQ6ruR6ruY6ruZ6ruc6ruo6rur6rut6ru06ru46ru86ryH6ryI6ryN6ryQ6rys6ryt6ryw6ryy6ry06ry86ry96ry/6r2B6r2C6r2D6r2I6r2J6r2Q6r2c6r2d6r2k6r2l6r256r6A6r6E6r6I6r6Q6r6R6r6V6r6c6r646r656r686r+A6r+H6r+I6r+J6r+L6r+N6r+O6r+U6r+c6r+o6r+p6r+w6r+x6r+06r+464CA64CB64CE64CM64CQ64CU64Cc64Cd64Co64GE64GF64GI64GK64GM64GO64GT64GU64GV64GX64GZ77+9XCIuc3BsaXQoXCJcIik7XG5mb3IoaiA9IDA7IGogIT0gRFsxNzhdLmxlbmd0aDsgKytqKSBpZihEWzE3OF1bal0uY2hhckNvZGVBdCgwKSAhPT0gMHhGRkZEKSB7IGVbRFsxNzhdW2pdXSA9IDQ1NTY4ICsgajsgZFs0NTU2OCArIGpdID0gRFsxNzhdW2pdO31cbkRbMTc5XSA9IFwi77+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+97L+M7L+N7L+O7L+P7L+Q7L+R7L+S7L+T7L+U7L+V7L+W7L+X7L+Y7L+Z7L+a7L+b7L+c7L+d7L+e7L+f7L+i7L+j7L+l7L+m7L+n7L+p77+977+977+977+977+977+97L+q7L+r7L+s7L+t7L+u7L+v7L+y7L+07L+27L+37L+47L+57L+67L+77L+97L++7L+/7YCB7YCC7YCD7YCF7YCG7YCH7YCI7YCJ7YCK77+977+977+977+977+977+97YCL7YCM7YCN7YCO7YCP7YCQ7YCS7YCT7YCU7YCV7YCW7YCX7YCZ7YCa7YCb7YCc7YCd7YCe7YCf7YCg7YCh7YCi7YCj7YCk7YCl7YCm7YCn7YCo7YCp7YCq7YCr7YCs64Gd64G864G964KA64KE64KM64KN64KP64KR64KY64KZ64Ka64Kc64Kf64Kg64Kh64Ki64Ko64Kp64Kr64Ks64Kt64Ku64Kv64Kx64Kz64K064K164K464K864OE64OF64OH64OI64OJ64OQ64OR64OU64OY64Og64Ol64SI64SJ64SL64SM64SQ64SS64ST64SY64SZ64Sb64Sc64Sd64Sj64Sk64Sl64So64Ss64S064S164S364S464S564WA64WB64WE64WI64WQ64WR64WU64WV64WY64Wc64Wg64W464W564W864aA64aC64aI64aJ64aL64aN64aS64aT64aU64aY64ac64ao64eM64eQ64eU64ec64ed77+9XCIuc3BsaXQoXCJcIik7XG5mb3IoaiA9IDA7IGogIT0gRFsxNzldLmxlbmd0aDsgKytqKSBpZihEWzE3OV1bal0uY2hhckNvZGVBdCgwKSAhPT0gMHhGRkZEKSB7IGVbRFsxNzldW2pdXSA9IDQ1ODI0ICsgajsgZFs0NTgyNCArIGpdID0gRFsxNzldW2pdO31cbkRbMTgwXSA9IFwi77+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+97YCu7YCv7YCw7YCx7YCy7YCz7YC27YC37YC57YC67YC77YC97YC+7YC/7YGA7YGB7YGC7YGD7YGG7YGI7YGK7YGL7YGM7YGN7YGO7YGP77+977+977+977+977+977+97YGR7YGS7YGT7YGV7YGW7YGX7YGZ7YGa7YGb7YGc7YGd7YGe7YGf7YGh7YGi7YGj7YGk7YGl7YGm7YGn7YGo7YGp7YGq7YGr7YGu7YGv77+977+977+977+977+977+97YGx7YGy7YGz7YG17YG27YG37YG47YG57YG67YG77YG+7YG/7YKA7YKC7YKD7YKE7YKF7YKG7YKH7YKI7YKJ7YKK7YKL7YKM7YKN7YKO7YKP7YKQ7YKR7YKS7YKT7YKU64ef64eo64ep64es64ew64e564e764e964iE64iF64iI64iL64iM64iU64iV64iX64iZ64ig64i064i864mY64mc64mg64mo64mp64m064m164m864qE64qF64qJ64qQ64qR64qU64qY64qZ64qa64qg64qh64qj64ql64qm64qq64qs64qw64q064uI64uJ64uM64uQ64uS64uY64uZ64ub64ud64ui64uk64ul64um64uo64ur64us64ut64uu64uv64uz64u064u164u364u464u564u664u764u/64yA64yB64yE64yI64yQ64yR64yT64yU64yV64yc642U642V642W642Y642b642c642e642f642k642l77+9XCIuc3BsaXQoXCJcIik7XG5mb3IoaiA9IDA7IGogIT0gRFsxODBdLmxlbmd0aDsgKytqKSBpZihEWzE4MF1bal0uY2hhckNvZGVBdCgwKSAhPT0gMHhGRkZEKSB7IGVbRFsxODBdW2pdXSA9IDQ2MDgwICsgajsgZFs0NjA4MCArIGpdID0gRFsxODBdW2pdO31cbkRbMTgxXSA9IFwi77+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+97YKV7YKW7YKX7YKY7YKZ7YKa7YKb7YKc7YKd7YKe7YKf7YKg7YKh7YKi7YKj7YKm7YKn7YKp7YKq7YKr7YKt7YKu7YKv7YKw7YKx7YKy77+977+977+977+977+977+97YKz7YK27YK47YK67YK77YK87YK97YK+7YK/7YOC7YOD7YOF7YOG7YOH7YOK7YOL7YOM7YON7YOO7YOP7YOS7YOW7YOX7YOY7YOZ7YOa77+977+977+977+977+977+97YOb7YOe7YOf7YOh7YOi7YOj7YOl7YOm7YOn7YOo7YOp7YOq7YOr7YOu7YOy7YOz7YO07YO17YO27YO37YO57YO67YO77YO87YO97YO+7YO/7YSA7YSB7YSC7YSD7YSE642n642p642r642u642w642x64206424646A646B646D646E646F646M646Q646U646g646h646o646s64+E64+F64+I64+L64+M64+O64+Q64+U64+V64+X64+Z64+b64+d64+g64+k64+o64+865CQ65CY65Cc65Cg65Co65Cp65Cr65C065GQ65GR65GU65GY65Gg65Gh65Gj65Gl65Gs65KA65KI65Kd65Kk65Ko65Ks65K165K365K565OA65OE65OI65OQ65OV65Oc65Od65Og65Oj65Ok65Om65Os65Ot65Ov65Ox65O465SU65SV65SY65Sb65Sc65Sk65Sl65Sn65So65Sp65Sq65Sw65Sx65S065S477+9XCIuc3BsaXQoXCJcIik7XG5mb3IoaiA9IDA7IGogIT0gRFsxODFdLmxlbmd0aDsgKytqKSBpZihEWzE4MV1bal0uY2hhckNvZGVBdCgwKSAhPT0gMHhGRkZEKSB7IGVbRFsxODFdW2pdXSA9IDQ2MzM2ICsgajsgZFs0NjMzNiArIGpdID0gRFsxODFdW2pdO31cbkRbMTgyXSA9IFwi77+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+97YSF7YSG7YSH7YSI7YSJ7YSK7YSL7YSM7YSO7YSP7YSQ7YSR7YSS7YST7YSU7YSV7YSW7YSX7YSY7YSZ7YSa7YSb7YSc7YSd7YSe7YSf77+977+977+977+977+977+97YSg7YSh7YSi7YSj7YSk7YSl7YSm7YSn7YSo7YSp7YSq7YSr7YSs7YSt7YSu7YSv7YSy7YSz7YS17YS27YS37YS57YS77YS87YS97YS+77+977+977+977+977+977+97YS/7YWC7YWG7YWH7YWI7YWJ7YWK7YWL7YWO7YWP7YWR7YWS7YWT7YWV7YWW7YWX7YWY7YWZ7YWa7YWb7YWe7YWg7YWi7YWj7YWk7YWl7YWm7YWn7YWp7YWq7YWr7YWt65WA65WB65WD65WE65WF65WL65WM65WN65WQ65WU65Wc65Wd65Wf65Wg65Wh65ag65ah65ak65ao65aq65ar65aw65ax65az65a065a165a765a865a965eA65eE65eM65eN65eP65eQ65eR65eY65es65iQ65iR65iU65iY65il65is65i065mI65mk65mo65qc65qd65qg65qk65qr65qs65qx65uU65uw65u065u465yA65yB65yF65yo65yp65ys65yv65yw65y465y565y7652E652I652M652U652V652g652k652o652w652x652z652165286529656A656E656M656N656P656Q656R656S656W656X77+9XCIuc3BsaXQoXCJcIik7XG5mb3IoaiA9IDA7IGogIT0gRFsxODJdLmxlbmd0aDsgKytqKSBpZihEWzE4Ml1bal0uY2hhckNvZGVBdCgwKSAhPT0gMHhGRkZEKSB7IGVbRFsxODJdW2pdXSA9IDQ2NTkyICsgajsgZFs0NjU5MiArIGpdID0gRFsxODJdW2pdO31cbkRbMTgzXSA9IFwi77+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+97YWu7YWv7YWw7YWx7YWy7YWz7YW07YW17YW27YW37YW47YW57YW67YW77YW97YW+7YW/7YaA7YaB7YaC7YaD7YaF7YaG7YaH7YaJ7YaK77+977+977+977+977+977+97YaL7YaM7YaN7YaO7YaP7YaQ7YaR7YaS7YaT7YaU7YaV7YaW7YaX7YaY7YaZ7Yaa7Yab7Yac7Yad7Yae7Yaf7Yai7Yaj7Yal7Yam7Yan77+977+977+977+977+977+97Yap7Yaq7Yar7Yas7Yat7Yau7Yav7Yay7Ya07Ya27Ya37Ya47Ya57Ya77Ya97Ya+7Ya/7YeB7YeC7YeD7YeE7YeF7YeG7YeH7YeI7YeJ7YeK7YeL7YeM7YeN7YeO7YeP656Y656Z656c656g656o656p656r656s656t65606561656465+H65+J65+s65+t65+w65+065+865+965+/66CA66CB66CH66CI66CJ66CM66CQ66CY66CZ66Cb66Cd66Ck66Cl66Co66Cs66C066C166C366C466C566GA66GE66GR66GT66Gc66Gd66Gg66Gk66Gs66Gt66Gv66Gx66G466G866KN66Ko66Kw66K066K466OA66OB66OD66OF66OM66OQ66OU66Od66Of66Oh66Oo66Op66Os66Ow66O466O566O766O966SE66SY66Sg66S866S966WA66WE66WM66WP66WR66WY66WZ66Wc66Wg66Wo66Wp77+9XCIuc3BsaXQoXCJcIik7XG5mb3IoaiA9IDA7IGogIT0gRFsxODNdLmxlbmd0aDsgKytqKSBpZihEWzE4M11bal0uY2hhckNvZGVBdCgwKSAhPT0gMHhGRkZEKSB7IGVbRFsxODNdW2pdXSA9IDQ2ODQ4ICsgajsgZFs0Njg0OCArIGpdID0gRFsxODNdW2pdO31cbkRbMTg0XSA9IFwi77+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+97YeQ7YeR7YeS7YeT7YeU7YeV7YeW7YeX7YeZ7Yea7Yeb7Yec7Yed7Yee7Yef7Yeg7Yeh7Yei7Yej7Yek7Yel7Yem7Yen7Yeo7Yep7Yeq77+977+977+977+977+977+97Yer7Yes7Yet7Yeu7Yev7Yew7Yex7Yey7Yez7Ye17Ye27Ye37Ye57Ye67Ye77Ye87Ye97Ye+7Ye/7YiA7YiB7YiC7YiD7YiE7YiF7YiG77+977+977+977+977+977+97YiI7YiK7YiL7YiM7YiN7YiO7YiP7YiR7YiS7YiT7YiU7YiV7YiW7YiX7YiY7YiZ7Yia7Yib7Yic7Yid7Yie7Yif7Yig7Yih7Yii7Yij7Yik7Yil7Yim7Yin7Yio7Yip66Wr66Wt66W066W166W466W866aE66aF66aH66aJ66aK66aN66aO66as66at66aw66a066a866a966a/66eB66eI66eJ66eM66eO66eP66eQ66eR66eS66eY66eZ66eb66ed66ee66eh66ej66ek66el66eo66es66e066e166e366e466e566e666iA66iB66iI66iV66i466i566i866mA66mC66mI66mJ66mL66mN66mO66mT66mU66mV66mY66mc66mk66ml66mn66mo66mp66mw66mx66m066m466qD66qE66qF66qH66qM66qo66qp66qr66qs66qw66qy66q466q566q766q966uE66uI66uY66uZ66u877+9XCIuc3BsaXQoXCJcIik7XG5mb3IoaiA9IDA7IGogIT0gRFsxODRdLmxlbmd0aDsgKytqKSBpZihEWzE4NF1bal0uY2hhckNvZGVBdCgwKSAhPT0gMHhGRkZEKSB7IGVbRFsxODRdW2pdXSA9IDQ3MTA0ICsgajsgZFs0NzEwNCArIGpdID0gRFsxODRdW2pdO31cbkRbMTg1XSA9IFwi77+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+97Yiq7Yir7Yiu7Yiv7Yix7Yiy7Yiz7Yi17Yi27Yi37Yi47Yi57Yi67Yi77Yi+7YmA7YmC7YmD7YmE7YmF7YmG7YmH7YmJ7YmK7YmL7YmM77+977+977+977+977+977+97YmN7YmO7YmP7YmQ7YmR7YmS7YmT7YmU7YmV7YmW7YmX7YmY7YmZ7Yma7Ymb7Ymd7Yme7Ymf7Ymg7Ymh7Ymi7Ymj7Yml7Ymm7Ymn7Ymo77+977+977+977+977+977+97Ymp7Ymq7Ymr7Yms7Ymt7Ymu7Ymv7Ymw7Ymx7Ymy7Ymz7Ym07Ym17Ym27Ym37Ym47Ym57Ym67Ym77Ym87Ym97Ym+7Ym/7YqC7YqD7YqF7YqG7YqH7YqJ7YqK7YqL7YqM66yA66yE66yN66yP66yR66yY66yc66yg66yp66yr66y066y166y266y466y766y866y966y+662E662F662H662J662N662P662Q662U662Y662h662j662s666I666M666Q666k666o666s6660666366+A66+E66+I66+Q66+T66+466+566+866+/67CA67CC67CI67CJ67CL67CM67CN67CP67CR67CU67CV67CW67CX67CY67Cb67Cc67Cd67Ce67Cf67Ck67Cl67Cn67Cp67Ct67Cw67Cx67C067C467GA67GB67GD67GE67GF67GJ67GM67GN67GQ67Gd67KE67KF67KI67KL67KM67KO67KU67KV67KX77+9XCIuc3BsaXQoXCJcIik7XG5mb3IoaiA9IDA7IGogIT0gRFsxODVdLmxlbmd0aDsgKytqKSBpZihEWzE4NV1bal0uY2hhckNvZGVBdCgwKSAhPT0gMHhGRkZEKSB7IGVbRFsxODVdW2pdXSA9IDQ3MzYwICsgajsgZFs0NzM2MCArIGpdID0gRFsxODVdW2pdO31cbkRbMTg2XSA9IFwi77+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+97YqN7YqO7YqP7YqS7YqT7YqU7YqW7YqX7YqY7YqZ7Yqa7Yqb7Yqd7Yqe7Yqf7Yqh7Yqi7Yqj7Yql7Yqm7Yqn7Yqo7Yqp7Yqq7Yqr7Yqt77+977+977+977+977+977+97Yqu7Yqv7Yqw7Yqy7Yqz7Yq07Yq17Yq27Yq37Yq67Yq77Yq97Yq+7YuB7YuD7YuE7YuF7YuG7YuH7YuK7YuM7YuN7YuO7YuP7YuQ7YuR77+977+977+977+977+977+97YuS7YuT7YuV7YuW7YuX7YuZ7Yua7Yub7Yud7Yue7Yuf7Yug7Yuh7Yui7Yuj7Yum7Yun7Yuo7Yup7Yuq7Yur7Yus7Yut7Yuu7Yuv7Yuy7Yuz7Yu17Yu27Yu37Yu57Yu667KZ67Ka67Kg67Kh67Kk67Kn67Ko67Kw67Kx67Kz67K067K167K867K967OA67OE67ON67OP67OQ67OR67OV67OY67Oc67O067O167O267O467O867SE67SF67SH67SJ67SQ67SU67Sk67Ss67WA67WI67WJ67WM67WQ67WY67WZ67Wk67Wo67aA67aB67aE67aH67aI67aJ67aK67aQ67aR67aT67aV67aZ67aa67ac67ak67aw67a467eU67eV67eY67ec67ep67ew67e067e467iA67iD67iF67iM67iN67iQ67iU67ic67id67if67mE67mF67mI67mM67mO67mU67mV67mX67mZ67ma67mb67mg67mh67mk77+9XCIuc3BsaXQoXCJcIik7XG5mb3IoaiA9IDA7IGogIT0gRFsxODZdLmxlbmd0aDsgKytqKSBpZihEWzE4Nl1bal0uY2hhckNvZGVBdCgwKSAhPT0gMHhGRkZEKSB7IGVbRFsxODZdW2pdXSA9IDQ3NjE2ICsgajsgZFs0NzYxNiArIGpdID0gRFsxODZdW2pdO31cbkRbMTg3XSA9IFwi77+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+97Yu77Yu87Yu97Yu+7Yu/7YyC7YyE7YyG7YyH7YyI7YyJ7YyK7YyL7YyP7YyR7YyS7YyT7YyV7YyX7YyY7YyZ7Yya7Yyb7Yye7Yyi7Yyj77+977+977+977+977+977+97Yyk7Yym7Yyn7Yyq7Yyr7Yyt7Yyu7Yyv7Yyx7Yyy7Yyz7Yy07Yy17Yy27Yy37Yy67Yy+7Yy/7Y2A7Y2B7Y2C7Y2D7Y2G7Y2H7Y2I7Y2J77+977+977+977+977+977+97Y2K7Y2L7Y2M7Y2N7Y2O7Y2P7Y2Q7Y2R7Y2S7Y2T7Y2U7Y2V7Y2W7Y2X7Y2Y7Y2Z7Y2a7Y2b7Y2c7Y2d7Y2e7Y2f7Y2g7Y2h7Y2i7Y2j7Y2k7Y2l7Y2m7Y2n7Y2o7Y2p67mo67mq67mw67mx67mz67m067m167m767m867m967qA67qE67qM67qN67qP67qQ67qR67qY67qZ67qo67uQ67uR67uU67uX67uY67ug67uj67uk67ul67us67yB67yI67yJ67yY67yZ67yb67yc67yd672A672B672E672I672Q672R672V676U676w67+F67+M67+N67+Q67+U67+c67+f67+h7IC87IGR7IGY7IGc7IGg7IGo7IGp7IKQ7IKR7IKU7IKY7IKg7IKh7IKj7IKl7IKs7IKt7IKv7IKw7IKz7IK07IK17IK27IK87IK97IK/7IOA7IOB7IOF7IOI7IOJ7IOM7IOQ7IOY7IOZ7IOb7IOc7IOd7IOk77+9XCIuc3BsaXQoXCJcIik7XG5mb3IoaiA9IDA7IGogIT0gRFsxODddLmxlbmd0aDsgKytqKSBpZihEWzE4N11bal0uY2hhckNvZGVBdCgwKSAhPT0gMHhGRkZEKSB7IGVbRFsxODddW2pdXSA9IDQ3ODcyICsgajsgZFs0Nzg3MiArIGpdID0gRFsxODddW2pdO31cbkRbMTg4XSA9IFwi77+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+97Y2q7Y2r7Y2s7Y2t7Y2u7Y2v7Y2w7Y2x7Y2y7Y2z7Y207Y217Y227Y237Y247Y257Y267Y277Y2+7Y2/7Y6B7Y6C7Y6D7Y6F7Y6G7Y6H77+977+977+977+977+977+97Y6I7Y6J7Y6K7Y6L7Y6O7Y6S7Y6T7Y6U7Y6V7Y6W7Y6X7Y6a7Y6b7Y6d7Y6e7Y6f7Y6h7Y6i7Y6j7Y6k7Y6l7Y6m7Y6n7Y6q7Y6s7Y6u77+977+977+977+977+977+97Y6v7Y6w7Y6x7Y6y7Y6z7Y617Y627Y637Y657Y667Y677Y697Y6+7Y6/7Y+A7Y+B7Y+C7Y+D7Y+G7Y+H7Y+K7Y+L7Y+M7Y+N7Y+O7Y+P7Y+R7Y+S7Y+T7Y+U7Y+V7Y+W7IOl7IOo7IOs7IO07IO17IO37IO57ISA7ISE7ISI7ISQ7ISV7ISc7ISd7ISe7ISf7ISg7ISj7ISk7ISm7ISn7ISs7ISt7ISv7ISw7ISx7IS27IS47IS57IS87IWA7IWI7IWJ7IWL7IWM7IWN7IWU7IWV7IWY7IWc7IWk7IWl7IWn7IWo7IWp7IWw7IW07IW47IaF7IaM7IaN7IaO7IaQ7IaU7IaW7Iac7Iad7Iaf7Iah7Ial7Iao7Iap7Ias7Iaw7Ia97IeE7IeI7IeM7IeU7IeX7IeY7Ieg7Iek7Ieo7Iew7Iex7Iez7Ie87Ie97IiA7IiE7IiM7IiN7IiP7IiR7IiY7IiZ7Iic7Iif7Iig7Iio7Iip7Iir7Iit77+9XCIuc3BsaXQoXCJcIik7XG5mb3IoaiA9IDA7IGogIT0gRFsxODhdLmxlbmd0aDsgKytqKSBpZihEWzE4OF1bal0uY2hhckNvZGVBdCgwKSAhPT0gMHhGRkZEKSB7IGVbRFsxODhdW2pdXSA9IDQ4MTI4ICsgajsgZFs0ODEyOCArIGpdID0gRFsxODhdW2pdO31cbkRbMTg5XSA9IFwi77+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+97Y+X7Y+Z7Y+a7Y+b7Y+c7Y+d7Y+e7Y+f7Y+g7Y+i7Y+k7Y+l7Y+m7Y+n7Y+o7Y+p7Y+q7Y+r7Y+u7Y+v7Y+x7Y+y7Y+z7Y+17Y+27Y+377+977+977+977+977+977+97Y+47Y+57Y+67Y+77Y++7ZCA7ZCC7ZCD7ZCE7ZCF7ZCG7ZCH7ZCJ7ZCK7ZCL7ZCM7ZCN7ZCO7ZCP7ZCQ7ZCR7ZCS7ZCT7ZCU7ZCV7ZCW77+977+977+977+977+977+97ZCX7ZCY7ZCZ7ZCa7ZCb7ZCc7ZCe7ZCf7ZCg7ZCh7ZCi7ZCj7ZCk7ZCl7ZCm7ZCn7ZCo7ZCp7ZCq7ZCr7ZCs7ZCt7ZCu7ZCv7ZCw7ZCx7ZCy7ZCz7ZC07ZC17ZC27ZC37Iiv7Iix7Iiy7Ii07ImI7ImQ7ImR7ImU7ImY7Img7Iml7Ims7Imt7Imw7Im07Im87Im97Im/7IqB7IqI7IqJ7IqQ7IqY7Iqb7Iqd7Iqk7Iql7Iqo7Iqs7Iqt7Iq07Iq17Iq37Iq57Iuc7Iud7Iug7Iuj7Iuk7Iur7Ius7Iut7Iuv7Iux7Iu27Iu47Iu57Iu77Iu87IyA7IyI7IyJ7IyM7IyN7IyT7IyU7IyV7IyY7Iyc7Iyk7Iyl7Iyo7Iyp7I2F7I2o7I2p7I2s7I2w7I2y7I247I257I287I297I6E7I6I7I6M7I+A7I+Y7I+Z7I+c7I+f7I+g7I+i7I+o7I+p7I+t7I+07I+17I+47JCI7JCQ7JCk7JCs7JCw77+9XCIuc3BsaXQoXCJcIik7XG5mb3IoaiA9IDA7IGogIT0gRFsxODldLmxlbmd0aDsgKytqKSBpZihEWzE4OV1bal0uY2hhckNvZGVBdCgwKSAhPT0gMHhGRkZEKSB7IGVbRFsxODldW2pdXSA9IDQ4Mzg0ICsgajsgZFs0ODM4NCArIGpdID0gRFsxODldW2pdO31cbkRbMTkwXSA9IFwi77+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+97ZC47ZC57ZC67ZC77ZC87ZC97ZC+7ZC/7ZGB7ZGC7ZGD7ZGF7ZGG7ZGH7ZGI7ZGJ7ZGK7ZGL7ZGM7ZGN7ZGO7ZGP7ZGQ7ZGR7ZGS7ZGT77+977+977+977+977+977+97ZGU7ZGV7ZGW7ZGX7ZGY7ZGZ7ZGa7ZGb7ZGd7ZGe7ZGf7ZGh7ZGi7ZGj7ZGl7ZGm7ZGn7ZGo7ZGp7ZGq7ZGr7ZGs7ZGu7ZGw7ZGx7ZGy77+977+977+977+977+977+97ZGz7ZG07ZG17ZG27ZG37ZG67ZG77ZG97ZG+7ZKB7ZKD7ZKE7ZKF7ZKG7ZKH7ZKK7ZKM7ZKO7ZKP7ZKQ7ZKR7ZKS7ZKT7ZKV7ZKW7ZKX7ZKY7ZKZ7ZKa7ZKb7ZKc7ZKd7JC07JC87JC97JGI7JGk7JGl7JGo7JGs7JG07JG17JG57JKA7JKU7JKc7JK47JK87JOp7JOw7JOx7JO07JO47JO67JO/7JSA7JSB7JSM7JSQ7JSU7JSc7JSo7JSp7JSs7JSw7JS47JS57JS77JS97JWE7JWF7JWI7JWJ7JWK7JWM7JWN7JWO7JWT7JWU7JWV7JWX7JWY7JWZ7JWd7JWe7JWg7JWh7JWk7JWo7JWw7JWx7JWz7JW07JW17JW87JW97JaA7JaE7JaH7JaM7JaN7JaP7JaR7JaV7JaX7JaY7Jac7Jag7Jap7Ja07Ja17Ja47Ja57Ja77Ja87Ja97Ja+7JeE7JeF7JeG7JeH7JeI7JeJ7JeK7JeM7JeO77+9XCIuc3BsaXQoXCJcIik7XG5mb3IoaiA9IDA7IGogIT0gRFsxOTBdLmxlbmd0aDsgKytqKSBpZihEWzE5MF1bal0uY2hhckNvZGVBdCgwKSAhPT0gMHhGRkZEKSB7IGVbRFsxOTBdW2pdXSA9IDQ4NjQwICsgajsgZFs0ODY0MCArIGpdID0gRFsxOTBdW2pdO31cbkRbMTkxXSA9IFwi77+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+97ZKe7ZKf7ZKg7ZKh7ZKi7ZKj7ZKk7ZKl7ZKm7ZKn7ZKo7ZKq7ZKr7ZKs7ZKt7ZKu7ZKv7ZKw7ZKx7ZKy7ZKz7ZK07ZK17ZK27ZK37ZK477+977+977+977+977+977+97ZK57ZK67ZK77ZK87ZK97ZK+7ZK/7ZOA7ZOB7ZOC7ZOD7ZOE7ZOF7ZOG7ZOH7ZOI7ZOJ7ZOK7ZOL7ZON7ZOO7ZOP7ZOR7ZOS7ZOT7ZOV77+977+977+977+977+977+97ZOW7ZOX7ZOY7ZOZ7ZOa7ZOb7ZOd7ZOe7ZOg7ZOh7ZOi7ZOj7ZOk7ZOl7ZOm7ZOn7ZOp7ZOq7ZOr7ZOt7ZOu7ZOv7ZOx7ZOy7ZOz7ZO07ZO17ZO27ZO37ZO57ZO67ZO87JeQ7JeR7JeU7JeY7Jeg7Jeh7Jej7Jel7Jes7Jet7Jeu7Jew7Je07Je27Je37Je87Je97Je+7Je/7JiA7JiB7JiF7JiG7JiH7JiI7JiM7JiQ7JiY7JiZ7Jib7Jic7Jik7Jil7Jio7Jis7Jit7Jiu7Jiw7Jiz7Ji07Ji17Ji37Ji57Ji77JmA7JmB7JmE7JmI7JmQ7JmR7JmT7JmU7JmV7Jmc7Jmd7Jmg7Jms7Jmv7Jmx7Jm47Jm57Jm87JqA7JqI7JqJ7JqL7JqN7JqU7JqV7JqY7Jqc7Jqk7Jql7Jqn7Jqp7Jqw7Jqx7Jq07Jq47Jq57Jq67JuA7JuB7JuD7JuF7JuM7JuN7JuQ7JuU7Juc7Jud7Jug7Juh7Juo77+9XCIuc3BsaXQoXCJcIik7XG5mb3IoaiA9IDA7IGogIT0gRFsxOTFdLmxlbmd0aDsgKytqKSBpZihEWzE5MV1bal0uY2hhckNvZGVBdCgwKSAhPT0gMHhGRkZEKSB7IGVbRFsxOTFdW2pdXSA9IDQ4ODk2ICsgajsgZFs0ODg5NiArIGpdID0gRFsxOTFdW2pdO31cbkRbMTkyXSA9IFwi77+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+97ZO+7ZO/7ZSA7ZSB7ZSC7ZSD7ZSF7ZSG7ZSH7ZSJ7ZSK7ZSL7ZSN7ZSO7ZSP7ZSQ7ZSR7ZSS7ZST7ZSW7ZSY7ZSZ7ZSa7ZSb7ZSc7ZSd77+977+977+977+977+977+97ZSe7ZSf7ZSg7ZSh7ZSi7ZSj7ZSk7ZSl7ZSm7ZSn7ZSo7ZSp7ZSq7ZSr7ZSs7ZSt7ZSu7ZSv7ZSw7ZSx7ZSy7ZSz7ZS07ZS17ZS27ZS377+977+977+977+977+977+97ZS47ZS57ZS67ZS77ZS+7ZS/7ZWB7ZWC7ZWD7ZWF7ZWG7ZWH7ZWI7ZWJ7ZWK7ZWL7ZWO7ZWQ7ZWS7ZWT7ZWU7ZWV7ZWW7ZWX7ZWa7ZWb7ZWd7ZWe7ZWf7ZWh7ZWi7ZWj7Jup7Jus7Juw7Ju47Ju57Ju97JyE7JyF7JyI7JyM7JyU7JyV7JyX7JyZ7Jyg7Jyh7Jyk7Jyo7Jyw7Jyx7Jyz7Jy17Jy37Jy87Jy97J2A7J2E7J2K7J2M7J2N7J2P7J2R7J2S7J2T7J2U7J2V7J2W7J2X7J2Y7J2c7J2g7J2o7J2r7J207J217J247J287J297J2+7J6D7J6E7J6F7J6H7J6I7J6J7J6K7J6O7J6Q7J6R7J6U7J6W7J6X7J6Y7J6a7J6g7J6h7J6j7J6k7J6l7J6m7J6s7J6t7J6w7J607J687J697J6/7J+A7J+B7J+I7J+J7J+M7J+O7J+Q7J+Y7J+d7J+k7J+o7J+s7KCA7KCB7KCE7KCI7KCK77+9XCIuc3BsaXQoXCJcIik7XG5mb3IoaiA9IDA7IGogIT0gRFsxOTJdLmxlbmd0aDsgKytqKSBpZihEWzE5Ml1bal0uY2hhckNvZGVBdCgwKSAhPT0gMHhGRkZEKSB7IGVbRFsxOTJdW2pdXSA9IDQ5MTUyICsgajsgZFs0OTE1MiArIGpdID0gRFsxOTJdW2pdO31cbkRbMTkzXSA9IFwi77+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+97ZWk7ZWm7ZWn7ZWq7ZWs7ZWu7ZWv7ZWw7ZWx7ZWy7ZWz7ZW27ZW37ZW57ZW67ZW77ZW97ZW+7ZW/7ZaA7ZaB7ZaC7ZaD7ZaG7ZaK7ZaL77+977+977+977+977+977+97ZaM7ZaN7ZaO7ZaP7ZaR7ZaS7ZaT7ZaU7ZaV7ZaW7ZaX7ZaY7ZaZ7Zaa7Zab7Zac7Zad7Zae7Zaf7Zag7Zah7Zai7Zaj7Zak7Zam7Zan77+977+977+977+977+977+97Zao7Zap7Zaq7Zar7Zas7Zat7Zau7Zav7Zaw7Zax7Zay7Zaz7Za07Za17Za27Za37Za47Za57Za67Za77Za87Za97Za+7Za/7ZeA7ZeB7ZeC7ZeD7ZeE7ZeF7ZeG7ZeH7KCQ7KCR7KCT7KCV7KCW7KCc7KCd7KCg7KCk7KCs7KCt7KCv7KCx7KC47KC87KGA7KGI7KGJ7KGM7KGN7KGU7KGw7KGx7KG07KG47KG67KKA7KKB7KKD7KKF7KKG7KKH7KKL7KKM7KKN7KKU7KKd7KKf7KKh7KKo7KK87KK97KOE7KOI7KOM7KOU7KOV7KOX7KOZ7KOg7KOh7KOk7KO17KO87KO97KSA7KSE7KSF7KSG7KSM7KSN7KSP7KSR7KSY7KSs7KS07KWQ7KWR7KWU7KWY7KWg7KWh7KWj7KWs7KWw7KW07KW87KaI7KaJ7KaM7KaQ7KaY7KaZ7Kab7Kad7KeA7KeB7KeE7KeH7KeI7KeK7KeQ7KeR7KeT77+9XCIuc3BsaXQoXCJcIik7XG5mb3IoaiA9IDA7IGogIT0gRFsxOTNdLmxlbmd0aDsgKytqKSBpZihEWzE5M11bal0uY2hhckNvZGVBdCgwKSAhPT0gMHhGRkZEKSB7IGVbRFsxOTNdW2pdXSA9IDQ5NDA4ICsgajsgZFs0OTQwOCArIGpdID0gRFsxOTNdW2pdO31cbkRbMTk0XSA9IFwi77+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+97ZeK7ZeL7ZeN7ZeO7ZeP7ZeR7ZeT7ZeU7ZeV7ZeW7ZeX7Zea7Zec7Zee7Zef7Zeg7Zeh7Zei7Zej7Zem7Zen7Zep7Zeq7Zer7Zet7Zeu77+977+977+977+977+977+97Zev7Zew7Zex7Zey7Zez7Ze27Ze47Ze67Ze77Ze87Ze97Ze+7Ze/7ZiC7ZiD7ZiF7ZiG7ZiH7ZiJ7ZiK7ZiL7ZiM7ZiN7ZiO7ZiP7ZiS77+977+977+977+977+977+97ZiW7ZiX7ZiY7ZiZ7Zia7Zib7Zid7Zie7Zif7Zih7Zii7Zij7Zil7Zim7Zin7Zio7Zip7Ziq7Zir7Zis7Ziu7Ziv7Ziw7Zix7Ziy7Ziz7Zi07Zi17Zi27Zi37Zi67Zi77KeV7KeW7KeZ7Kea7Kec7Ked7Keg7Kei7Kek7Ken7Kes7Ket7Kev7Kew7Kex7Ke47Ke57Ke87KiA7KiI7KiJ7KiL7KiM7KiN7KiU7KiY7Kip7KmM7KmN7KmQ7KmU7Kmc7Kmd7Kmf7Kmg7Kmh7Kmo7Km97KqE7KqY7Kq87Kq97KuA7KuE7KuM7KuN7KuP7KuR7KuT7KuY7KuZ7Kug7Kus7Ku07KyI7KyQ7KyU7KyY7Kyg7Kyh7K2B7K2I7K2J7K2M7K2Q7K2Y7K2Z7K2d7K2k7K247K257K6c7K647K+U7K+k7K+n7K+p7LCM7LCN7LCQ7LCU7LCc7LCd7LCh7LCi7LCn7LCo7LCp7LCs7LCu7LCw7LC47LC57LC777+9XCIuc3BsaXQoXCJcIik7XG5mb3IoaiA9IDA7IGogIT0gRFsxOTRdLmxlbmd0aDsgKytqKSBpZihEWzE5NF1bal0uY2hhckNvZGVBdCgwKSAhPT0gMHhGRkZEKSB7IGVbRFsxOTRdW2pdXSA9IDQ5NjY0ICsgajsgZFs0OTY2NCArIGpdID0gRFsxOTRdW2pdO31cbkRbMTk1XSA9IFwi77+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+97Zi97Zi+7Zi/7ZmB7ZmC7ZmD7ZmE7ZmG7ZmH7ZmK7ZmM7ZmO7ZmP7ZmQ7ZmS7ZmT7ZmW7ZmX7ZmZ7Zma7Zmb7Zmd7Zme7Zmf7Zmg7Zmh77+977+977+977+977+977+97Zmi7Zmj7Zmk7Zml7Zmm7Zmo7Zmq7Zmr7Zms7Zmt7Zmu7Zmv7Zmy7Zmz7Zm17Zm27Zm37Zm47Zm57Zm67Zm77Zm87Zm97Zm+7Zm/7ZqA77+977+977+977+977+977+97ZqB7ZqC7ZqE7ZqG7ZqH7ZqI7ZqJ7ZqK7ZqL7ZqO7ZqP7ZqR7ZqS7ZqT7ZqV7ZqW7ZqX7ZqY7ZqZ7Zqa7Zqb7Zqc7Zqe7Zqg7Zqi7Zqj7Zqk7Zql7Zqm7Zqn7Zqp7Zqq7LC87LC97LC+7LGE7LGF7LGI7LGM7LGU7LGV7LGX7LGY7LGZ7LGg7LGk7LGm7LGo7LGw7LG17LKY7LKZ7LKc7LKg7LKo7LKp7LKr7LKs7LKt7LK07LK17LK47LK87LOE7LOF7LOH7LOJ7LOQ7LOU7LOk7LOs7LOw7LSB7LSI7LSJ7LSM7LSQ7LSY7LSZ7LSb7LSd7LSk7LSo7LSs7LS57LWc7LWg7LWk7LWs7LWt7LWv7LWx7LW47LaI7LaU7LaV7LaY7Lac7Lak7Lal7Lan7Lap7Law7LeE7LeM7LeQ7Leo7Les7Lew7Le47Le57Le77Le97LiE7LiI7LiM7LiU7LiZ7Lig7Lih7Lik7Lio7Liw7Lix7Liz7Li177+9XCIuc3BsaXQoXCJcIik7XG5mb3IoaiA9IDA7IGogIT0gRFsxOTVdLmxlbmd0aDsgKytqKSBpZihEWzE5NV1bal0uY2hhckNvZGVBdCgwKSAhPT0gMHhGRkZEKSB7IGVbRFsxOTVdW2pdXSA9IDQ5OTIwICsgajsgZFs0OTkyMCArIGpdID0gRFsxOTVdW2pdO31cbkRbMTk2XSA9IFwi77+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+97Zqr7Zqt7Zqu7Zqv7Zqx7Zqy7Zqz7Zq07Zq17Zq27Zq37Zq47Zq67Zq87Zq97Zq+7Zq/7ZuA7ZuB7ZuC7ZuD7ZuG7ZuH7ZuJ7ZuK7ZuL77+977+977+977+977+977+97ZuN7ZuO7ZuP7ZuQ7ZuS7ZuT7ZuV7ZuW7ZuY7Zua7Zub7Zuc7Zud7Zue7Zuf7Zuh7Zui7Zuj7Zul7Zum7Zun7Zup7Zuq7Zur7Zus7Zut77+977+977+977+977+977+97Zuu7Zuv7Zux7Zuy7Zuz7Zu07Zu27Zu37Zu47Zu57Zu67Zu77Zu+7Zu/7ZyB7ZyC7ZyD7ZyF7ZyG7ZyH7ZyI7ZyJ7ZyK7ZyL7ZyM7ZyN7ZyO7ZyP7ZyQ7ZyS7ZyT7ZyU7LmY7LmZ7Lmc7Lmf7Lmg7Lmh7Lmo7Lmp7Lmr7Lmt7Lm07Lm17Lm47Lm87LqE7LqF7LqH7LqJ7LqQ7LqR7LqU7LqY7Lqg7Lqh7Lqj7Lqk7Lql7Lqs7Lqt7LuB7Luk7Lul7Luo7Lur7Lus7Lu07Lu17Lu37Lu47Lu57LyA7LyB7LyE7LyI7LyQ7LyR7LyT7LyV7Lyc7Lyg7Lyk7Lys7Lyt7Lyv7Lyw7Lyx7Ly47L2U7L2V7L2Y7L2c7L2k7L2l7L2n7L2p7L2w7L2x7L207L247L6A7L6F7L6M7L6h7L6o7L6w7L+E7L+g7L+h7L+k7L+o7L+w7L+x7L+z7L+17L+87YCA7YCE7YCR7YCY7YCt7YC07YC17YC47YC877+9XCIuc3BsaXQoXCJcIik7XG5mb3IoaiA9IDA7IGogIT0gRFsxOTZdLmxlbmd0aDsgKytqKSBpZihEWzE5Nl1bal0uY2hhckNvZGVBdCgwKSAhPT0gMHhGRkZEKSB7IGVbRFsxOTZdW2pdXSA9IDUwMTc2ICsgajsgZFs1MDE3NiArIGpdID0gRFsxOTZdW2pdO31cbkRbMTk3XSA9IFwi77+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+97ZyV7ZyW7ZyX7Zya7Zyb7Zyd7Zye7Zyf7Zyh7Zyi7Zyj7Zyk7Zyl7Zym7Zyn7Zyq7Zys7Zyu7Zyv7Zyw7Zyx7Zyy7Zyz7Zy27Zy37Zy577+977+977+977+977+977+97Zy67Zy77Zy97Zy+7Zy/7Z2A7Z2B7Z2C7Z2D7Z2F7Z2G7Z2I7Z2K7Z2L7Z2M7Z2N7Z2O7Z2P7Z2S7Z2T7Z2V7Z2a7Z2b7Z2c7Z2d7Z2e77+977+977+977+977+977+97Z2f7Z2i7Z2k7Z2m7Z2n7Z2o7Z2q7Z2r7Z2t7Z2u7Z2v7Z2x7Z2y7Z2z7Z217Z227Z237Z247Z257Z267Z277Z2+7Z2/7Z6A7Z6C7Z6D7Z6E7Z6F7Z6G7Z6H7Z6K7Z6L7YGE7YGF7YGH7YGJ7YGQ7YGU7YGY7YGg7YGs7YGt7YGw7YG07YG87YG97YKB7YKk7YKl7YKo7YKs7YK07YK17YK37YK57YOA7YOB7YOE7YOI7YOJ7YOQ7YOR7YOT7YOU7YOV7YOc7YOd7YOg7YOk7YOs7YOt7YOv7YOw7YOx7YO47YSN7YSw7YSx7YS07YS47YS67YWA7YWB7YWD7YWE7YWF7YWM7YWN7YWQ7YWU7YWc7YWd7YWf7YWh7YWo7YWs7YW87YaE7YaI7Yag7Yah7Yak7Yao7Yaw7Yax7Yaz7Ya17Ya67Ya87YeA7YeY7Ye07Ye47YiH7YiJ7YiQ7Yis7Yit7Yiw7Yi07Yi87Yi97Yi/7YmB7YmI7Ymc77+9XCIuc3BsaXQoXCJcIik7XG5mb3IoaiA9IDA7IGogIT0gRFsxOTddLmxlbmd0aDsgKytqKSBpZihEWzE5N11bal0uY2hhckNvZGVBdCgwKSAhPT0gMHhGRkZEKSB7IGVbRFsxOTddW2pdXSA9IDUwNDMyICsgajsgZFs1MDQzMiArIGpdID0gRFsxOTddW2pdO31cbkRbMTk4XSA9IFwi77+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+97Z6N7Z6O7Z6P7Z6R7Z6S7Z6T7Z6U7Z6V7Z6W7Z6X7Z6a7Z6c7Z6e7Z6f7Z6g7Z6h7Z6i7Z6j77+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+97Ymk7YqA7YqB7YqE7YqI7YqQ7YqR7YqV7Yqc7Yqg7Yqk7Yqs7Yqx7Yq47Yq57Yq87Yq/7YuA7YuC7YuI7YuJ7YuL7YuU7YuY7Yuc7Yuk7Yul7Yuw7Yux7Yu07Yu47YyA7YyB7YyD7YyF7YyM7YyN7YyO7YyQ7YyU7YyW7Yyc7Yyd7Yyf7Yyg7Yyh7Yyl7Yyo7Yyp7Yys7Yyw7Yy47Yy57Yy77Yy87Yy97Y2E7Y2F7Y287Y297Y6A7Y6E7Y6M7Y6N7Y6P7Y6Q7Y6R7Y6Y7Y6Z7Y6c7Y6g7Y6o7Y6p7Y6r7Y6t7Y607Y647Y687Y+E7Y+F7Y+I7Y+J7Y+Q7Y+Y7Y+h7Y+j7Y+s7Y+t7Y+w7Y+07Y+87Y+97Y+/7ZCB77+9XCIuc3BsaXQoXCJcIik7XG5mb3IoaiA9IDA7IGogIT0gRFsxOThdLmxlbmd0aDsgKytqKSBpZihEWzE5OF1bal0uY2hhckNvZGVBdCgwKSAhPT0gMHhGRkZEKSB7IGVbRFsxOThdW2pdXSA9IDUwNjg4ICsgajsgZFs1MDY4OCArIGpdID0gRFsxOThdW2pdO31cbkRbMTk5XSA9IFwi77+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+97ZCI7ZCd7ZGA7ZGE7ZGc7ZGg7ZGk7ZGt7ZGv7ZG47ZG57ZG87ZG/7ZKA7ZKC7ZKI7ZKJ7ZKL7ZKN7ZKU7ZKp7ZOM7ZOQ7ZOU7ZOc7ZOf7ZOo7ZOs7ZOw7ZO47ZO77ZO97ZSE7ZSI7ZSM7ZSU7ZSV7ZSX7ZS87ZS97ZWA7ZWE7ZWM7ZWN7ZWP7ZWR7ZWY7ZWZ7ZWc7ZWg7ZWl7ZWo7ZWp7ZWr7ZWt7ZW07ZW17ZW47ZW87ZaE7ZaF7ZaH7ZaI7ZaJ7ZaQ7Zal7ZeI7ZeJ7ZeM7ZeQ7ZeS7ZeY7ZeZ7Zeb7Zed7Zek7Zel7Zeo7Zes7Ze07Ze17Ze37Ze57ZiA7ZiB7ZiE7ZiI7ZiQ7ZiR7ZiT7ZiU7ZiV7Zic7Zig77+9XCIuc3BsaXQoXCJcIik7XG5mb3IoaiA9IDA7IGogIT0gRFsxOTldLmxlbmd0aDsgKytqKSBpZihEWzE5OV1bal0uY2hhckNvZGVBdCgwKSAhPT0gMHhGRkZEKSB7IGVbRFsxOTldW2pdXSA9IDUwOTQ0ICsgajsgZFs1MDk0NCArIGpdID0gRFsxOTldW2pdO31cbkRbMjAwXSA9IFwi77+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+97Zik7Zit7Zi47Zi57Zi87ZmA7ZmF7ZmI7ZmJ7ZmL7ZmN7ZmR7ZmU7ZmV7ZmY7Zmc7Zmn7Zmp7Zmw7Zmx7Zm07ZqD7ZqF7ZqM7ZqN7ZqQ7ZqU7Zqd7Zqf7Zqh7Zqo7Zqs7Zqw7Zq57Zq77ZuE7ZuF7ZuI7ZuM7ZuR7ZuU7ZuX7ZuZ7Zug7Zuk7Zuo7Zuw7Zu17Zu87Zu97ZyA7ZyE7ZyR7ZyY7ZyZ7Zyc7Zyg7Zyo7Zyp7Zyr7Zyt7Zy07Zy17Zy47Zy87Z2E7Z2H7Z2J7Z2Q7Z2R7Z2U7Z2W7Z2X7Z2Y7Z2Z7Z2g7Z2h7Z2j7Z2l7Z2p7Z2s7Z2w7Z207Z287Z297Z6B7Z6I7Z6J7Z6M7Z6Q7Z6Y7Z6Z7Z6b7Z6d77+9XCIuc3BsaXQoXCJcIik7XG5mb3IoaiA9IDA7IGogIT0gRFsyMDBdLmxlbmd0aDsgKytqKSBpZihEWzIwMF1bal0uY2hhckNvZGVBdCgwKSAhPT0gMHhGRkZEKSB7IGVbRFsyMDBdW2pdXSA9IDUxMjAwICsgajsgZFs1MTIwMCArIGpdID0gRFsyMDBdW2pdO31cbkRbMjAyXSA9IFwi77+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+95Ly95L2z5YGH5YO55Yqg5Y+v5ZG15ZOl5ZiJ5auB5a625pqH5p625p635p+v5q2M54+C55eC56i86Iub6IyE6KGX6KKI6Ki26LOI6LeP6Lu76L+m6aeV5Yi75Y205ZCE5oGq5oWk5q6854+P6ISa6Ka66KeS6Zaj5L6D5YiK5aK+5aW45aem5bmy5bm55oeH5o+A5p2G5p+s5qG/5r6X55mO55yL56O156iI56u/57Ch6IKd6Imu6Imx6Kur6ZaT5Lmr5Zad5pu35ri056Kj56ut6JGb6KSQ6J2O6Z6o5YuY5Z2O5aCq5bWM5oSf5oa+5oih5pWi5p+R5qmE5rib55SY55az55uj556w57S66YKv6ZGR6ZGS6b6V77+9XCIuc3BsaXQoXCJcIik7XG5mb3IoaiA9IDA7IGogIT0gRFsyMDJdLmxlbmd0aDsgKytqKSBpZihEWzIwMl1bal0uY2hhckNvZGVBdCgwKSAhPT0gMHhGRkZEKSB7IGVbRFsyMDJdW2pdXSA9IDUxNzEyICsgajsgZFs1MTcxMiArIGpdID0gRFsyMDJdW2pdO31cbkRbMjAzXSA9IFwi77+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+95Yyj5bKs55Sy6IOb6YmA6ZaY5Ymb5aCI5aec5bKh5bSX5bq35by65b2K5oW35rGf55W655aG57Og57Wz57ax576M6IWU6Iih6JaR6KWB6Kyb6Yu86ZmN6bGH5LuL5Lu35YCL5Yex5aGP5oS35oS+5oWo5pS55qeq5ryR55al55qG55uW566H6Iql6JOL76SA6Y6n6ZaL5ZaA5a6i5Z2R76SB57Kz57656Ya15YCo5Y675bGF5beo5ouS5o2u5pOa5pOn5rig54Ks56Wb6Led6Lie76SC6YG96YmF6Yu45Lm+5Lu25YGl5be+5bu65oSG5qWX6IWx6JmU6LmH6Y216air5Lme5YKR5p2w5qGA5YSJ5YqN5YqS5qqi77+9XCIuc3BsaXQoXCJcIik7XG5mb3IoaiA9IDA7IGogIT0gRFsyMDNdLmxlbmd0aDsgKytqKSBpZihEWzIwM11bal0uY2hhckNvZGVBdCgwKSAhPT0gMHhGRkZEKSB7IGVbRFsyMDNdW2pdXSA9IDUxOTY4ICsgajsgZFs1MTk2OCArIGpdID0gRFsyMDNdW2pdO31cbkRbMjA0XSA9IFwi77+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+955686YiQ6buU5Yqr5oCv6L+y5YGI5oap5o+t5pOK5qC85qqE5r+A6IaI6Kah6ZqU5aCF54m954qs55SE57W557mt6IKp6KaL6K206YGj6bWR5oqJ5rG65r2U57WQ57y66Kij5YW85oWK566d6KyZ6YmX6Y6M5Lqs5L+T5YCe5YK+5YSG5YuB5YuN5Y2/5Z2w5aKD5bqa5b6R5oW25oas5pOO5pWs5pmv5pq75pu05qKX5raH54KF54Ox55Kf55Kl55OK55eZ56Gs56Os56uf56u257WF57aT6ICV6IC/6ISb6I6W6K2m6LyV6YCV6Y+h6aCD6aC46ama6a+o5L+C5ZWT5aC65aWR5a2j5bGG5oK45oiS5qGC5qKw77+9XCIuc3BsaXQoXCJcIik7XG5mb3IoaiA9IDA7IGogIT0gRFsyMDRdLmxlbmd0aDsgKytqKSBpZihEWzIwNF1bal0uY2hhckNvZGVBdCgwKSAhPT0gMHhGRkZEKSB7IGVbRFsyMDRdW2pdXSA9IDUyMjI0ICsgajsgZFs1MjIyNCArIGpdID0gRFsyMDRdW2pdO31cbkRbMjA1XSA9IFwi77+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+95qOo5rqq55WM55m456OO56i957O757mr57m86KiI6Kqh6LC/6ZqO6beE5Y+k5Y+p5ZGK5ZGx5Zu65aeR5a2k5bC75bqr5ou35pS35pWF5pWy5pqg5p6v5qeB5rK955e855qQ552+56i/576U6ICD6IKh6IaP6Ium6Iu96I+w6JeB6KCx6KK06Kql76SD6L6c6Yyu6ZuH6aGn6auY6byT5ZOt5pab5puy5qKP56mA6LC36bWg5Zuw5Z2k5bSR5piG5qKx5qON5ru+55Co6KKe6a+k5rGo76SE6aqo5L6b5YWs5YWx5Yqf5a2U5bel5oGQ5oGt5oux5o6n5pS754+Z56m66Jqj6LKi6Z6P5Liy5a+h5oiI5p6c55Oc77+9XCIuc3BsaXQoXCJcIik7XG5mb3IoaiA9IDA7IGogIT0gRFsyMDVdLmxlbmd0aDsgKytqKSBpZihEWzIwNV1bal0uY2hhckNvZGVBdCgwKSAhPT0gMHhGRkZEKSB7IGVbRFsyMDVdW2pdXSA9IDUyNDgwICsgajsgZFs1MjQ4MCArIGpdID0gRFsyMDVdW2pdO31cbkRbMjA2XSA9IFwi77+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+956eR6I+T6KqH6Kqy6Leo6YGO6Y2L6aGG5buT5qeo6Je/6YOt76SF5Yag5a6Y5a+s5oWj5qO65qy+54GM55Cv55OY566h572Q6I+F6KeA6LKr6Zec6aSo5Yiu5oGd5ous6YCC5L6K5YWJ5Yyh5aOZ5buj5pug5rS454Ka54uC54+W562Q6IOx6ZGb5Y2m5o6b572r5LmW5YKA5aGK5aOe5oCq5oSn5ouQ5qeQ6a2B5a6P57SY6IKx6L2f5Lqk5YOR5ZKs5Zas5ayM5bag5ben5pSq5pWO5qCh5qmL54uh55qO55+v57We57+56Iag6JWO6Juf6LyD6L2O6YOK6aSD6amV6a6r5LiY5LmF5Lmd5LuH5L+x5YW35Yu+77+9XCIuc3BsaXQoXCJcIik7XG5mb3IoaiA9IDA7IGogIT0gRFsyMDZdLmxlbmd0aDsgKytqKSBpZihEWzIwNl1bal0uY2hhckNvZGVBdCgwKSAhPT0gMHhGRkZEKSB7IGVbRFsyMDZdW2pdXSA9IDUyNzM2ICsgajsgZFs1MjczNiArIGpdID0gRFsyMDZdW2pdO31cbkRbMjA3XSA9IFwi77+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+95Y2A5Y+j5Y+l5ZKO5ZiU5Z215Z6i5a+H5baH5buQ5oe85ouY5pWR5p645p+p5qeL5q2Q5q+G5q+s5rGC5rqd54G454uX546W55CD556/55+p56m257W/6ICJ6Ie86IiF6IiK6Iuf6KGi6Kyz6LO86LuA6YCR6YKx6Ymk6Yq26aeS6amF6bOp6beX6b6c5ZyL5bGA6I+K6Z6g6Z6r6bq05ZCb56qY576k6KOZ6LuN6YOh5aCA5bGI5o6Y56qf5a6u5byT56m556qu6IqO6Lqs5YCm5Yi45Yu45Y235ZyI5ouz5o2y5qyK5reD55y35Y6l542X6JWo6Lm26ZeV5py65quD5r2w6Kmt6LuM6aWL76SG5pm35q246LK077+9XCIuc3BsaXQoXCJcIik7XG5mb3IoaiA9IDA7IGogIT0gRFsyMDddLmxlbmd0aDsgKytqKSBpZihEWzIwN11bal0uY2hhckNvZGVBdCgwKSAhPT0gMHhGRkZEKSB7IGVbRFsyMDddW2pdXSA9IDUyOTkyICsgajsgZFs1Mjk5MiArIGpdID0gRFsyMDddW2pdO31cbkRbMjA4XSA9IFwi77+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+96ay876SH5Y+r5Zyt5aWO5o+G5qe754+q56GF56q656uF57O+6JG16KaP6LWz6YC16Zao5Yu75Z2H55WH562g6I+M6Yie76SI5qmY5YWL5YmL5YqH5oif5qOY5qW16ZqZ5YOF5Yqk5Yuk5oeD5pak5qC55qe/55G+562L6Iq56I+r6Kay6Ky56L+R6aWJ76SJ5LuK5aaX5pOS5piR5qqO55C056aB56a96Iqp6KG+6KG/6KWf76SK6Yym5LyL5Y+K5oCl5omx5rGy57Sa57Wm5LqY5YWi55+c6IKv5LyB5LyO5YW25YaA5Zec5Zmo5Zy75Z+65Z+85aSU5aWH5aaT5a+E5bKQ5bSO5bex5bm+5b+M5oqA5peX5pej77+9XCIuc3BsaXQoXCJcIik7XG5mb3IoaiA9IDA7IGogIT0gRFsyMDhdLmxlbmd0aDsgKytqKSBpZihEWzIwOF1bal0uY2hhckNvZGVBdCgwKSAhPT0gMHhGRkZEKSB7IGVbRFsyMDhdW2pdXSA9IDUzMjQ4ICsgajsgZFs1MzI0OCArIGpdID0gRFsyMDhdW2pdO31cbkRbMjA5XSA9IFwi77+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+95pye5pyf5p2e5qOL5qOE5qmf5qy65rCj5rG95rKC5reH546Y55Cm55Cq55KC55Kj55W455W/56KB56Ov56WB56WH56WI56W6566V57SA57a6576I6ICG6ICt6IKM6KiY6K2P6LGI6LW36Yyh6Yyk6aOi6aWR6aiO6aiP6aml6bqS57eK5L225ZCJ5ouu5qGU6YeR5Zar5YS676SL76SM5aic5oem76SN5ouP5ou/76SO76SP76SQ76SR76SS76ST6YKj76SU76SV76SW76SX76SY6Ku+76SZ76Sa76Sb76Sc5pqW76Sd54WW76Se76Sf6Zuj76Sg5o2P5o265Y2X76Sh5p6P5qWg5rmz76Si55S376Sj76Sk76Sl77+9XCIuc3BsaXQoXCJcIik7XG5mb3IoaiA9IDA7IGogIT0gRFsyMDldLmxlbmd0aDsgKytqKSBpZihEWzIwOV1bal0uY2hhckNvZGVBdCgwKSAhPT0gMHhGRkZEKSB7IGVbRFsyMDldW2pdXSA9IDUzNTA0ICsgajsgZFs1MzUwNCArIGpdID0gRFsyMDldW2pdO31cbkRbMjEwXSA9IFwi77+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+957SN76Sm76Sn6KGy5ZuK5aiY76So76Sp76Sq76Sr76Ss5LmD76St5YWn5aWI5p+w6ICQ76Su5aWz5bm05pKa56eK5b+15oGs5ouI5o275a+n5a+X5Yqq76Sv5aW05byp5oCS76Sw76Sx76Sy55GZ76Sz76S076S176S276S376S46aeR76S576S676S776S876S976S+76S/76WA76WB76WC76WD5r+D76WE76WF6Ia/6L6y5oOx76WG76WH6IWm76WI76WJ5bC/76WK76WL76WM76WN76WO76WP76WQ76WR5aup6Kil5p2757SQ76WS76WT76WU76WV76WW76WX6IO976WY76WZ5bC85rOl5Yy/5rq65aSa6Iy277+9XCIuc3BsaXQoXCJcIik7XG5mb3IoaiA9IDA7IGogIT0gRFsyMTBdLmxlbmd0aDsgKytqKSBpZihEWzIxMF1bal0uY2hhckNvZGVBdCgwKSAhPT0gMHhGRkZEKSB7IGVbRFsyMTBdW2pdXSA9IDUzNzYwICsgajsgZFs1Mzc2MCArIGpdID0gRFsyMTBdW2pdO31cbkRbMjExXSA9IFwi77+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+95Li55Lq25L2G5Zau5ZyY5aOH5b2W5pa35pem5qqA5q615rmN55+t56uv57Ce57ee6JuL6KKS6YSy6Y2b5pK75r6+542655a46YGU5ZWW5Z2N5oa65pOU5puH5reh5rmb5r2t5r6555ew6IGD6Ia96JWB6KaD6KuH6K2a6Yyf5rKT55WT562U6LiP6YGd5ZSQ5aCC5aGY5bmi5oiH5pKe5qOg55W257OW6J6z6buo5Luj5Z6I5Z2u5aSn5bCN5bKx5bi25b6F5oi05pOh546z6Ie66KKL6LK46ZqK6bub5a6F5b635oKz5YCS5YiA5Yiw5ZyW5aC15aGX5bCO5bGg5bO25baL5bqm5b6S5oK85oyR5o6J5pCX5qGD77+9XCIuc3BsaXQoXCJcIik7XG5mb3IoaiA9IDA7IGogIT0gRFsyMTFdLmxlbmd0aDsgKytqKSBpZihEWzIxMV1bal0uY2hhckNvZGVBdCgwKSAhPT0gMHhGRkZEKSB7IGVbRFsyMTFdW2pdXSA9IDU0MDE2ICsgajsgZFs1NDAxNiArIGpdID0gRFsyMTFdW2pdO31cbkRbMjEyXSA9IFwi77+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+95qO55quC5reY5rih5ruU5r+k54e+55uc552556ax56i76JCE6Kap6LOt6Lez6LmI6YCD6YCU6YGT6YO96Y2N6Zm26Z+c5q+S54CG54mY54qi542o552j56a/56+k57qb6K6A5aKp5oOH5pWm5pe95pq+5rKM54Se54eJ6LGa6aCT5Lmt56qB5Lud5Yas5YeN5YuV5ZCM5oan5p2x5qGQ5qOf5rSe5r2855a8556z56ul6IO06JGj6YqF5YWc5paX5p2c5p6T55eY56uH6I2z76Wa6LGG6YCX6aCt5bGv6IeA6Iqa6YGB6YGv6YiN5b6X5bad5qmZ54eI55m7562J6Jek6KyE6YSn6aiw5ZaH5oe276Wb55mp576F77+9XCIuc3BsaXQoXCJcIik7XG5mb3IoaiA9IDA7IGogIT0gRFsyMTJdLmxlbmd0aDsgKytqKSBpZihEWzIxMl1bal0uY2hhckNvZGVBdCgwKSAhPT0gMHhGRkZEKSB7IGVbRFsyMTJdW2pdXSA9IDU0MjcyICsgajsgZFs1NDI3MiArIGpdID0gRFsyMTJdW2pdO31cbkRbMjEzXSA9IFwi77+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+96Ji/6J666KO46YKP76Wc5rSb54OZ54+e57Wh6JC976Wd6YWq6aex76We5LqC5Y215qyE5qyS54C+54ib6Jit6bie5YmM6L6j5bWQ5pOl5pSs5qyW5r+r57GD57qc6JeN6KWk6Ka95ouJ6IeY6KCf5buK5pyX5rWq54u855CF55Gv6J6C6YOe5L6G5bSN5b6g6JCK5Ya35o6g55Wl5Lqu5YCG5YWp5YeJ5qKB5qiR57Ku57Kx57On6Imv6KuS6Lyb6YeP5L625YS35Yu15ZGC5bus5oWu5oi+5peF5qua5r++56Sq6Jec6KCj6Zat6ami6amq6bqX6buO5Yqb5puG5q2354Cd56Sr6L2i6Z2C5oaQ5oiA5pSj5ryj77+9XCIuc3BsaXQoXCJcIik7XG5mb3IoaiA9IDA7IGogIT0gRFsyMTNdLmxlbmd0aDsgKytqKSBpZihEWzIxM11bal0uY2hhckNvZGVBdCgwKSAhPT0gMHhGRkZEKSB7IGVbRFsyMTNdW2pdXSA9IDU0NTI4ICsgajsgZFs1NDUyOCArIGpdID0gRFsyMTNdW2pdO31cbkRbMjE0XSA9IFwi77+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+954WJ55KJ57e06IGv6JOu6Lym6YCj6Y2K5Ya95YiX5Yqj5rSM54OI6KOC5buJ5paC5q6u5r+C57C+54215Luk5Ly25Zu576Wf5bK65ba65oCc546y56yt576a57+O6IGG6YCe6Yi06Zu26Z2I6aCY6b2h5L6L5r6n56au6Ya06Zq35Yue76Wg5pKI5pOE5quT5r2e54CY54iQ55un6ICB6JiG6Jmc6Lev6LyF6Zyy6a2v6be66bm156KM56W/57ag6I+J6YyE6bm/6bqT6KuW5aOf5byE5pyn54Cn55OP57Gg6IG+5YSh54Co54mi56OK6LOC6LOa6LO06Zu35LqG5YOa5a+u5buW5paZ54eO55mC556t6IGK6JO877+9XCIuc3BsaXQoXCJcIik7XG5mb3IoaiA9IDA7IGogIT0gRFsyMTRdLmxlbmd0aDsgKytqKSBpZihEWzIxNF1bal0uY2hhckNvZGVBdCgwKSAhPT0gMHhGRkZEKSB7IGVbRFsyMTRdW2pdXSA9IDU0Nzg0ICsgajsgZFs1NDc4NCArIGpdID0gRFsyMTRdW2pdO31cbkRbMjE1XSA9IFwi77+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+96YG86ayn6b6N5aOY5amB5bGi5qiT5rea5ryP55i757Sv57i36JSe6KS46Y+k6ZmL5YqJ5peS5p+z5qa05rWB5rqc54CP55CJ55Gg55WZ55ik56Gr6Kys6aGe5YWt5oiu6Zm45L6W5YCr5bSZ5req57a46Lyq5b6L5oWE5qCX76Wh6ZqG5YuS6IKL5Yec5YeM5qWe56ic57a+6I+x6Zm15L+a5Yip5Y6Y5ZCP5ZSO5bGl5oKn5p2O5qKo5rWs54qB54u455CG55KD76Wi55ei57Gs572557646I6J6KOP6KOh6YeM6YeQ6Zui6a+J5ZCd5r2+54eQ55KY6Je66Lqq6Zqj6bGX6bqf5p6X5reL55Cz6Ieo6ZyW56Cs77+9XCIuc3BsaXQoXCJcIik7XG5mb3IoaiA9IDA7IGogIT0gRFsyMTVdLmxlbmd0aDsgKytqKSBpZihEWzIxNV1bal0uY2hhckNvZGVBdCgwKSAhPT0gMHhGRkZEKSB7IGVbRFsyMTVdW2pdXSA9IDU1MDQwICsgajsgZFs1NTA0MCArIGpdID0gRFsyMTVdW2pdO31cbkRbMjE2XSA9IFwi77+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+956uL56yg57KS5pGp55Gq55ey56K856Oo6aas6a2U6bq75a+e5bmV5ryg6Iac6I6r6YKI5LiH5Y2N5aip5beS5b2O5oWi5oy95pmp5pu85ru/5ryr54Gj556e6JCs6JST6KC76LyT6aWF6bC75ZSc5oq55pyr5rKr6IyJ6KWq6Z265Lqh5aaE5b+Y5b+Z5pyb57ay572U6IqS6Iyr6I696Lye6YKZ5Z+L5aa55aqS5a+Q5pin5p6a5qKF5q+P54Wk57216LK36LOj6YKB6a2F6ISI6LKK6ZmM6amA6bql5a2f5rCT54yb55uy55uf6JCM5Yaq6KaT5YWN5YaV5YuJ5qOJ5rKU55yE55yg57a/57es6Z2i6bq15ruF77+9XCIuc3BsaXQoXCJcIik7XG5mb3IoaiA9IDA7IGogIT0gRFsyMTZdLmxlbmd0aDsgKytqKSBpZihEWzIxNl1bal0uY2hhckNvZGVBdCgwKSAhPT0gMHhGRkZEKSB7IGVbRFsyMTZdW2pdXSA9IDU1Mjk2ICsgajsgZFs1NTI5NiArIGpdID0gRFsyMTZdW2pdO31cbkRbMjE3XSA9IFwi77+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+96JSR5Yal5ZCN5ZG95piO5pqd5qSn5rqf55q/556R6IyX6JOC6J6f6YWp6YqY6bO06KKC5L6u5YaS5Yuf5aeG5bi95oWV5pG45pG55pqu5p+Q5qih5q+N5q+b54mf54mh55GB55y455+b6ICX6Iq86IyF6KyA6Kyo6LKM5pyo5rKQ54mn55uu552m56mG6bap5q2/5rKS5aSi5pym6JKZ5Y2v5aKT5aaZ5buf5o+P5pi05p2z5ri654yr56uX6IuX6Yyo5YuZ5ber5oau5oeL5oiK5ouH5pKr5peg5qWZ5q2m5q+L54Sh54+355Wd57mG6Iie6IyC6JWq6Kqj6LK/6Zyn6bWh5aKo6buY5YCR5YiO5ZC75ZWP5paH77+9XCIuc3BsaXQoXCJcIik7XG5mb3IoaiA9IDA7IGogIT0gRFsyMTddLmxlbmd0aDsgKytqKSBpZihEWzIxN11bal0uY2hhckNvZGVBdCgwKSAhPT0gMHhGRkZEKSB7IGVbRFsyMTddW2pdXSA9IDU1NTUyICsgajsgZFs1NTU1MiArIGpdID0gRFsyMTddW2pdO31cbkRbMjE4XSA9IFwi77+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+95rG257SK57SL6IGe6JqK6ZaA6Zuv5Yu/5rKV54mp5ZGz5aqa5bC+5bWL5b2M5b6u5pyq5qK25qWj5ri85rmE55yJ57Gz576O6JaH6KyO6L+36Z2h6bu05bK35oK25oSN5oar5pWP5pe75pe85rCR5rOv546f54+J57eh6ZaU5a+G6Jyc6KyQ5Ymd5Y2a5ouN5pCP5pKy5py05qi45rOK54+A55Ke566U57KV57ib6IaK6Ii26JaE6L+r6Zu56aeB5Ly05Y2K5Y+N5Y+b5ouM5pCs5pSA5paR5qeD5rOu5r2Y54+t55WU55ii55uk55u856OQ56O756Ss57WG6Iis6J+g6L+U6aCS6aOv5YuD5ouU5pKl5rik5r2R77+9XCIuc3BsaXQoXCJcIik7XG5mb3IoaiA9IDA7IGogIT0gRFsyMThdLmxlbmd0aDsgKytqKSBpZihEWzIxOF1bal0uY2hhckNvZGVBdCgwKSAhPT0gMHhGRkZEKSB7IGVbRFsyMThdW2pdXSA9IDU1ODA4ICsgajsgZFs1NTgwOCArIGpdID0gRFsyMThdW2pdO31cbkRbMjE5XSA9IFwi77+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+955m86LeL6Yax6Ymi6auu6a2D5YCj5YKN5Z2K5aao5bCo5bmH5b235oi/5pS+5pa55peB5piJ5p6L5qac5ruC56OF57Sh6IKq6IaA6Iir6Iqz6JKh6JqM6Kiq6KyX6YKm6Ziy6b6Q5YCN5L+z76Wj5Z+55b6Y5ouc5o6S5p2v5rmD54SZ55uD6IOM6IOa6KO06KO16KSZ6LOg6Lyp6YWN6Zmq5Lyv5L2w5bib5p+P5qCi55m955m+6a2E5bmh5qiK54Wp54eU55Wq76Wk57mB6JWD6Jep6aOc5LyQ562P572w6Zal5Yeh5biG5qK15rC+5rGO5rOb54qv56+E6IyD5rOV55C65YO75YqI5aOB5pOY5qqX55Kn55mW77+9XCIuc3BsaXQoXCJcIik7XG5mb3IoaiA9IDA7IGogIT0gRFsyMTldLmxlbmd0aDsgKytqKSBpZihEWzIxOV1bal0uY2hhckNvZGVBdCgwKSAhPT0gMHhGRkZEKSB7IGVbRFsyMTldW2pdXSA9IDU2MDY0ICsgajsgZFs1NjA2NCArIGpdID0gRFsyMTldW2pdO31cbkRbMjIwXSA9IFwi77+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+956Kn6JiX6Zei6Zy576Wl5Y2e5byB6K6K6L6o6L6v6YKK5Yil556l6bGJ6byI5LiZ5YCC5YW15bGb5bm35pie5pi65p+E5qOF54Kz55SB55eF56eJ56ud6Lyn6aSg6aiI5L+d5aCh5aCx5a+25pmu5q2l5rSR5rm65r2954+k55Sr6I+p6KOc6KST6K2c6LyU5LyP5YOV5YyQ5Y2c5a6T5b6p5pyN56aP6IW56Iyv6JSU6KSH6KaG6Ly56Ly76aal6bCS5pys5Lm25L+45aWJ5bCB5bOv5bOw5o2n5qOS54O954ai55Cr57ir6JOs6JyC6YCi6YuS6bOz5LiN5LuY5L+v5YKF5YmW5Ymv5ZCm5ZKQ5Z+g5aSr5amm77+9XCIuc3BsaXQoXCJcIik7XG5mb3IoaiA9IDA7IGogIT0gRFsyMjBdLmxlbmd0aDsgKytqKSBpZihEWzIyMF1bal0uY2hhckNvZGVBdCgwKSAhPT0gMHhGRkZEKSB7IGVbRFsyMjBdW2pdXSA9IDU2MzIwICsgajsgZFs1NjMyMCArIGpdID0gRFsyMjBdW2pdO31cbkRbMjIxXSA9IFwi77+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+95a2a5a215a+M5bqc76Wm5om25pW35pan5rWu5rql54i256ym57C/57y26IWQ6IWR6Iaa6ImA6IqZ6I6p6KiD6LKg6LOm6LO76LW06La66YOo6Yec6Zic6ZmE6aeZ6bOn5YyX5YiG5ZCp5Zm05aKz5aWU5aWu5b+/5oak5omu5piQ5rG+54Sa55uG57KJ57Oe57Sb6Iqs6LOB6Zuw76Wn5L2b5byX5b2/5ouC5bSp5pyL5qOa56G857mD6bWs5LiV5YKZ5YyV5Yyq5Y2R5aaD5ami5bqH5oKy5oaK5omJ5om55paQ5p6H5qan5q+U5q+W5q+X5q+Y5rK476Wo55C155e656CS56KR56eV56eY57KD57eL57+h6IKl77+9XCIuc3BsaXQoXCJcIik7XG5mb3IoaiA9IDA7IGogIT0gRFsyMjFdLmxlbmd0aDsgKytqKSBpZihEWzIyMV1bal0uY2hhckNvZGVBdCgwKSAhPT0gMHhGRkZEKSB7IGVbRFsyMjFdW2pdXSA9IDU2NTc2ICsgajsgZFs1NjU3NiArIGpdID0gRFsyMjFdW2pdO31cbkRbMjIyXSA9IFwi77+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+96IS+6IeC6I+y6Jya6KOo6Kq56K2s6LK76YSZ6Z2e6aOb6by75Zqs5ayq5b2s5paM5qqz5q6v5rWc5r+x54CV54md546t6LKn6LOT6aC75oaR5rC36IGY6aiB5LmN5LqL5Lqb5LuV5Ly65Ly85L2/5L+f5YO/5Y+y5Y+45ZSG5Zej5Zub5aOr5aWi5aiR5a+r5a+65bCE5bez5bir5b6Z5oCd5o2o5pac5pav5p+25p+75qKt5q275rKZ5rOX5rij54CJ542F56CC56S+56WA56Wg56eB56+p57SX57Wy6IKG6IiN6I6O6JOR6JuH6KOf6KmQ6Kme6Kyd6LOc6LWm6L6t6YKq6aO86aef6bqd5YmK76Wp5pyU76Wq77+9XCIuc3BsaXQoXCJcIik7XG5mb3IoaiA9IDA7IGogIT0gRFsyMjJdLmxlbmd0aDsgKytqKSBpZihEWzIyMl1bal0uY2hhckNvZGVBdCgwKSAhPT0gMHhGRkZEKSB7IGVbRFsyMjJdW2pdXSA9IDU2ODMyICsgajsgZFs1NjgzMiArIGpdID0gRFsyMjJdW2pdO31cbkRbMjIzXSA9IFwi77+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+95YKY5Yiq5bGx5pWj5rGV54+K55Sj55ad566X6JKc6YW46Zyw5Lm35pKS5q6654We6Jap5LiJ76Wr5p2J5qOu5riX6Iqf6JSY6KGr5o+35r6B6YiS6aKv5LiK5YK35YOP5YSf5ZWG5Zaq5ZiX5a2A5bCZ5bOg5bi45bqK5bqg5buC5oOz5qGR5qmh5rmY54i954mA54uA55u456Wl566x57+U6KOz6Ke06Kmz6LGh6LOe6Zyc5aGe55K96LO95ZeH76Ws56mh57Si6Imy54my55Sf55Sl76Wt56yZ5aKF5aO75ba85bqP5bq25b6Q5oGV5oqS5o2/5pWN5pqR5puZ5pu45qCW5qOy54qA55Ge562u57Wu57eW572y77+9XCIuc3BsaXQoXCJcIik7XG5mb3IoaiA9IDA7IGogIT0gRFsyMjNdLmxlbmd0aDsgKytqKSBpZihEWzIyM11bal0uY2hhckNvZGVBdCgwKSAhPT0gMHhGRkZEKSB7IGVbRFsyMjNdW2pdXSA9IDU3MDg4ICsgajsgZFs1NzA4OCArIGpdID0gRFsyMjNdW2pdO31cbkRbMjI0XSA9IFwi77+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+96IOl6IiS6Jav6KW/6KqT6YCd6Yuk6buN6byg5aSV5aWt5bit5oOc5piU5pmz5p6Q5rGQ5reF5r2f55+z56Kp6JOG6YeL6Yyr5LuZ5YOK5YWI5ZaE5ayL5a6j5omH5pW+5peL5riy54W955CB55GE55KH55K/55ms56aq57ea57mV576o6IW66Iaz6Ii56Jia6J+s6Km16Lej6YG46YqR6ZCl6aWN6a6u5Y2o5bGR5qWU5rOE5rSp5rir6IiM6Jab6KS76Kit6Kqq6Zuq6b2n5Ymh5pq55q6y57qW6J++6LSN6ZaD6Zmd5pSd5raJ54eu76Wu5Z+O5aeT5a6s5oCn5oO65oiQ5pif5pmf54yp54+555ub55yB562s77+9XCIuc3BsaXQoXCJcIik7XG5mb3IoaiA9IDA7IGogIT0gRFsyMjRdLmxlbmd0aDsgKytqKSBpZihEWzIyNF1bal0uY2hhckNvZGVBdCgwKSAhPT0gMHhGRkZEKSB7IGVbRFsyMjRdW2pdXSA9IDU3MzQ0ICsgajsgZFs1NzM0NCArIGpdID0gRFsyMjRdW2pdO31cbkRbMjI1XSA9IFwi77+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+96IGW6IGy6IWl6Kqg6YaS5LiW5Yui5q2y5rSX56iF56y557Sw76Wv6LKw5Y+s5Ziv5aGR5a615bCP5bCR5bei5omA5o6D5pCU5pit5qKz5rK85raI5rqv54Cf54Kk54eS55Sm55aP55aO55iZ56yR56+g57Cr57Sg57S56JSs6JWt6JiH6Ki06YCN6YGh6YK16Yq36Z+26ai35L+X5bGs5p2f5raR57Kf57qM6KyW6LSW6YCf5a2r5be95pCN6JOA6YGc6aOh546H5a6L5oKa5p2+5ree6Kif6Kqm6YCB6aCM5Yi376Ww54GR56KO6Y6W6KGw6YeX5L+u5Y+X5Ze95Zua5Z6C5aO95auC5a6I5bKr5bOA5bil5oSB77+9XCIuc3BsaXQoXCJcIik7XG5mb3IoaiA9IDA7IGogIT0gRFsyMjVdLmxlbmd0aDsgKytqKSBpZihEWzIyNV1bal0uY2hhckNvZGVBdCgwKSAhPT0gMHhGRkZEKSB7IGVbRFsyMjVdW2pdXSA9IDU3NjAwICsgajsgZFs1NzYwMCArIGpdID0gRFsyMjVdW2pdO31cbkRbMjI2XSA9IFwi77+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+95oiN5omL5o6I5pCc5pS25pW45qi55q6K5rC05rSZ5ryx54en54up542455CH55Ky55im552h56eA56mX56uq57K557aP57as57mh576e6ISp6Iyx6JKQ6JOa6Jeq6KKW6Kqw6K6Q6Ly46YGC6YKD6YWs6YqW6Yq56ZqL6Zqn6Zqo6ZuW6ZyA6aCI6aaW6auT6aya5Y+U5aG+5aSZ5a2w5a6/5reR5r2a54af55Ch55K56IKF6I+95beh5b6H5b6q5oGC5pes5qCS5qWv5qmT5q6J5rS15rez54+j55u+556s562N57SU6ISj6Iic6I2A6JO06JWj6Kmi6KuE6YaH6Yye6aCG6aa05oiM6KGT6L+w6Yml5bSH5bSn77+9XCIuc3BsaXQoXCJcIik7XG5mb3IoaiA9IDA7IGogIT0gRFsyMjZdLmxlbmd0aDsgKytqKSBpZihEWzIyNl1bal0uY2hhckNvZGVBdCgwKSAhPT0gMHhGRkZEKSB7IGVbRFsyMjZdW2pdXSA9IDU3ODU2ICsgajsgZFs1Nzg1NiArIGpdID0gRFsyMjZdW2pdO31cbkRbMjI3XSA9IFwi77+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+95bWp55Gf6Iad6J2o5r+V5ou+57+S6KS26KWy5Lie5LmY5YOn5Yud5Y2H5om/5piH57mp6KCF6Zme5L6N5YyZ5Zi25aeL5aqk5bC45bGO5bGN5biC5byR5oGD5pa95piv5pmC5p6+5p+054yc55+i56S657+F6JKU6JON6KaW6Kmm6Kmp6Kuh6LGV6LG65Z+05a+U5byP5oGv5out5qSN5q6W5rmc54aE56+S6J2V6K2Y6Lu+6aOf6aO+5Ly45L6B5L+h5ZG75aig5a645oS85paw5pmo54e855Sz56We57Sz6IWO6Iej6I6Y6Jaq6JeO6JyD6KiK6Lqr6L6b76Wx6L+F5aSx5a6k5a+m5oKJ5a+p5bCL5b+D5rKB77+9XCIuc3BsaXQoXCJcIik7XG5mb3IoaiA9IDA7IGogIT0gRFsyMjddLmxlbmd0aDsgKytqKSBpZihEWzIyN11bal0uY2hhckNvZGVBdCgwKSAhPT0gMHhGRkZEKSB7IGVbRFsyMjddW2pdXSA9IDU4MTEyICsgajsgZFs1ODExMiArIGpdID0gRFsyMjddW2pdO31cbkRbMjI4XSA9IFwi77+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+976Wy5rex54CL55Sa6Iqv6Ku25LuA5Y2B76Wz6ZuZ5rCP5Lqe5L+E5YWS5ZWe5ail5bOo5oiR54mZ6Iq96I6q6Ju+6KGZ6Kid6Zi/6ZuF6aST6bSJ6bWd5aCK5bKz5ba95bmE5oOh5oSV5o+h5qiC5ril6YSC6Y2U6aGO6bCQ6b235a6J5bK45oyJ5pmP5qGI55y86ZuB6Z6N6aGU6a6f5pah6KyB6LuL6Za85ZS15bKp5beW5bq15pqX55mM6I+06ZeH5aOT5oq854uO6bSo5Luw5aSu5oCP5pi75q6D56en6bSm5Y6T5ZOA5Z+D5bSW5oSb5puW5rav56KN6Im+6ZqY6Z2E5Y6E5om85o6W5ray57iK6IWL6aGN77+9XCIuc3BsaXQoXCJcIik7XG5mb3IoaiA9IDA7IGogIT0gRFsyMjhdLmxlbmd0aDsgKytqKSBpZihEWzIyOF1bal0uY2hhckNvZGVBdCgwKSAhPT0gMHhGRkZEKSB7IGVbRFsyMjhdW2pdXSA9IDU4MzY4ICsgajsgZFs1ODM2OCArIGpdID0gRFsyMjhdW2pdO31cbkRbMjI5XSA9IFwi77+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+95qu7572M6bav6bia5Lmf5YC75Ya25aSc5oO55o+25qSw54i66IC276W06YeO5byx76W176W257SE6Iul6JGv6JK76Jel6LqN76W35L2v76W476W55aOk5a2D5oGZ5o+a5pSY5pWt5pqY76W65qWK5qij5rSL54CB54Ws55eS55iN56az56mw76W7576K76W86KWE76W96K6T6YeA6Zm976W+6aSK5ZyE5b6h5pa85ryB55iA56am6Kqe6aat6a2a6b2s5YSE5oa25oqR5qqN6IeG5YGD5aCw5b2m54SJ6KiA6Ku65a286JiW5L+65YS85Zq05aWE5o6p5re55baq5qWt5YaG5LqI5L2Z76W/76aA76aB5aaC76aC77+9XCIuc3BsaXQoXCJcIik7XG5mb3IoaiA9IDA7IGogIT0gRFsyMjldLmxlbmd0aDsgKytqKSBpZihEWzIyOV1bal0uY2hhckNvZGVBdCgwKSAhPT0gMHhGRkZEKSB7IGVbRFsyMjldW2pdXSA9IDU4NjI0ICsgajsgZFs1ODYyNCArIGpdID0gRFsyMjldW2pdO31cbkRbMjMwXSA9IFwi77+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+976aD5q2f5rGd76aE55K156SW76aF6IiH6ImF6Iy56Ly/6L2d76aG6aSY76aH76aI76aJ5Lqm76aK5Z+f5b255piT76aL76aM55ar57m56K2v76aN6YCG6amb5Zql5aCn5ae45aif5a6076aO5bu276aP76aQ5o2Q5oy776aR5qS95rKH5rK/5raO5raT5re15ryU76aS54Of54S254WZ76aT54eD54eV76aU56GP56Gv76aV562157ej76aW57iv76aX6KGN6Luf76aY76aZ76aa6Ymb76ab6bO276ac76ad76ae5oKF5raF76af54ax76ag76ah6Zax5Y6t76ai76aj76ak5p+T76al54KO54Sw55Cw6Im26IuS77+9XCIuc3BsaXQoXCJcIik7XG5mb3IoaiA9IDA7IGogIT0gRFsyMzBdLmxlbmd0aDsgKytqKSBpZihEWzIzMF1bal0uY2hhckNvZGVBdCgwKSAhPT0gMHhGRkZEKSB7IGVbRFsyMzBdW2pdXSA9IDU4ODgwICsgajsgZFs1ODg4MCArIGpdID0gRFsyMzBdW2pdO31cbkRbMjMxXSA9IFwi77+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+976am6Za76aul6bm95puE76an54eB6JGJ76ao76ap5aGL76aq76ar5ba45b2x76as5pig5pqO5qW55qau5rC45rOz5ri25r2B5r+a54Cb54Cv54WQ54ef542w76at55Gb76au55OU55uI56mO57qT76av76aw6Iux6Kmg6L+O76ax6Y2I76ay6ZyZ76az76a05LmC5YCq76a15YiI5Y+h5puz5rGt5r+K54yK552/56mi6Iqu6Jed6JiC76a26KOU6Kmj6K296LGr76a36Yqz76a46ZyT6aCQ5LqU5LyN5L+J5YKy5Y2I5ZC+5ZCz5Zea5aGi5aK65aWn5aib5a+k5oKf76a55oeK5pWW5pe/5pmk5qKn5rGa5r6z77+9XCIuc3BsaXQoXCJcIik7XG5mb3IoaiA9IDA7IGogIT0gRFsyMzFdLmxlbmd0aDsgKytqKSBpZihEWzIzMV1bal0uY2hhckNvZGVBdCgwKSAhPT0gMHhGRkZEKSB7IGVbRFsyMzFdW2pdXSA9IDU5MTM2ICsgajsgZFs1OTEzNiArIGpdID0gRFsyMzFdW2pdO31cbkRbMjMyXSA9IFwi77+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+954OP54as542S56296JyI6Kqk6bCy6byH5bGL5rKD542E546J6Yi65rqr55Gl55if56mp57iV6JiK5YWA5aOF5pOB55Ou55SV55mw57+B6YKV6ZuN6aWU5rim55Om56qp56qq6Iel6JuZ6J246Kib5amJ5a6M5a6b5qKh5qSA5rWj546p55CT55Cs56KX57ep57+r6ISY6IWV6I6e6LGM6Ziu6aCR5puw5b6A5pe65p6J5rGq546L5YCt5aiD5q2q55+u5aSW5bWs5beN54yl55WP76a676a75YOl5Ye55aCv5aSt5aaW5aea5a+l76a876a95bai5ouX5pCW5pKT5pO+76a+5puc76a/5qmI76eA54e/55Gk76eB77+9XCIuc3BsaXQoXCJcIik7XG5mb3IoaiA9IDA7IGogIT0gRFsyMzJdLmxlbmd0aDsgKytqKSBpZihEWzIzMl1bal0uY2hhckNvZGVBdCgwKSAhPT0gMHhGRkZEKSB7IGVbRFsyMzJdW2pdXSA9IDU5MzkyICsgajsgZFs1OTM5MiArIGpdID0gRFsyMzJdW2pdO31cbkRbMjMzXSA9IFwi77+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+956qI56qv57mH57me6ICA6IWw76eC6J+v6KaB6Kyg6YGZ76eD6YKA6aWS5oW+5qyy5rW057if6KSl6L6x5L+R5YKt5YaX5YuH5Z+H5aKJ5a655bq45oWC5qaV5raM5rmn5rq254aU55Gi55So55Ss6IGz6Iy46JOJ6LiK6Y6U6Y+e76eE5LqO5L2R5YG25YSq5Y+I5Y+L5Y+z5a6H5a+T5bCk5oSa5oaC5pe054mb546X55GA55uC56WQ56aR56a557SG57696IqL6JeV6Jme6L+C6YGH6YO16Yeq6ZqF6Zuo6Zup5YuW5b2n5pet5pix5qCv54Wc56i26YOB6aCK5LqR76eF5qmS5q6e5r6Q54aJ6ICY6Iq46JWT77+9XCIuc3BsaXQoXCJcIik7XG5mb3IoaiA9IDA7IGogIT0gRFsyMzNdLmxlbmd0aDsgKytqKSBpZihEWzIzM11bal0uY2hhckNvZGVBdCgwKSAhPT0gMHhGRkZEKSB7IGVbRFsyMzNdW2pdXSA9IDU5NjQ4ICsgajsgZFs1OTY0OCArIGpdID0gRFsyMzNdW2pdO31cbkRbMjM0XSA9IFwi77+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+96YGL6ZqV6Zuy6Z+76JSa6ayx5LqQ54aK6ZuE5YWD5Y6f5ZOh5ZyT5ZyS5Z6j5aqb5auE5a+D5oCo5oS/5o+05rKF5rS55rmy5rqQ54iw54y/55GX6IuR6KKB6L2F6YGg76eG6Zmi6aGY6bSb5pyI6LaK6Yme5L2N5YGJ5YOe5Y2x5ZyN5aeU5aiB5bCJ5oWw5pqQ5rit54iy55GL57ev6IOD6JCO6JGm6JS/6J2f6KGb6KSY6KyC6YGV6Z+L6a2P5Lmz5L6R5YSS5YWq76eH5ZSv5Zap5a265a6l5bm85bm95bq+5oKg5oOf5oSI5oSJ5o+E5pS45pyJ76eI5p+U5p+a76eJ5qWh5qWi5rK55rSn76eK5ri476eL77+9XCIuc3BsaXQoXCJcIik7XG5mb3IoaiA9IDA7IGogIT0gRFsyMzRdLmxlbmd0aDsgKytqKSBpZihEWzIzNF1bal0uY2hhckNvZGVBdCgwKSAhPT0gMHhGRkZEKSB7IGVbRFsyMzRdW2pdXSA9IDU5OTA0ICsgajsgZFs1OTkwNCArIGpdID0gRFsyMzRdW2pdO31cbkRbMjM1XSA9IFwi77+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+95r+h54y254y376eM55Gc55Sx76eN55mS76eO76eP57at6Ie+6JC46KOV6KqY6Kub6Kut6Liw6LmC6YGK6YC+6YG66YWJ6YeJ6Y2u76eQ76eR5aCJ76eS5q+T6IKJ6IKy76eT76eU5YWB5aWr5bC576eV76eW5r2k546n6IOk6LSH76eX6YiX6ZaP76eY76eZ76ea76eb6IG/5oiO54Cc57Wo6J6N76ec5Z6g5oGp5oWH5q636Kq+6YqA6Zqx5LmZ5ZCf5rer6JSt6Zmw6Z+z6aOu5o+W5rOj6YKR5Yed5oeJ6Ia66be55L6d5YCa5YSA5a6c5oSP5oe/5pOs5qSF5q+F55aR55+j576p6Imk6JaP6J+76KGj6Kq877+9XCIuc3BsaXQoXCJcIik7XG5mb3IoaiA9IDA7IGogIT0gRFsyMzVdLmxlbmd0aDsgKytqKSBpZihEWzIzNV1bal0uY2hhckNvZGVBdCgwKSAhPT0gMHhGRkZEKSB7IGVbRFsyMzVdW2pdXSA9IDYwMTYwICsgajsgZFs2MDE2MCArIGpdID0gRFsyMzVdW2pdO31cbkRbMjM2XSA9IFwi77+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+96K2w6Yar5LqM5Lul5LyK76ed76ee5aS35aeo76ef5bey5byb5b2b5oCh76eg76eh76ei76ej54i+54+l76ek55Ww55eN76el56e776em6ICM6ICz6IKE6Iuh6I2R76en76eo6LK96LKz6YKH76ep76eq6aO06aSM76er76es54C355uK57+K57+M57+86Kya5Lq65LuB5YiD5Y2w76et5ZK95Zug5ae75a+F5byV5b+N5rmu76eu76ev57Wq6Iy176ew6JqT6KqN76ex6Z2t6Z2376ey76ez5LiA5L2a5L2+5aO55pel5rqi6YC46Y6w6aa55Lu75aOs5aaK5aeZ5oGB76e076e156iU76e26I2P6LOD5YWl5Y2E77+9XCIuc3BsaXQoXCJcIik7XG5mb3IoaiA9IDA7IGogIT0gRFsyMzZdLmxlbmd0aDsgKytqKSBpZihEWzIzNl1bal0uY2hhckNvZGVBdCgwKSAhPT0gMHhGRkZEKSB7IGVbRFsyMzZdW2pdXSA9IDYwNDE2ICsgajsgZFs2MDQxNiArIGpdID0gRFsyMzZdW2pdO31cbkRbMjM3XSA9IFwi77+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+976e376e476e55LuN5Ymp5a2V6Iq/5LuU5Yi65ZKo5aeJ5ae/5a2Q5a2X5a2c5oGj5oWI5ruL54KZ54Wu546G55O355a156OB57Sr6ICF6Ieq6Iyo6JSX6JeJ6Kuu6LOH6ZuM5L2c5Yu65Zq85par5pio54G854K454i157a96IqN6YWM6ZuA6bWy5a2x5qOn5q6Y5r2655ue5bKR5pqr5r2b566057Cq6KC26Zuc5LiI5LuX5Yyg5aC05aK75aOv5aWs5bCH5biz5bqE5by15o6M5pqy5p2W5qif5qqj5qyM5ry/54mG76e6542Q55KL56ug57Kn6IW46Ief6Ien6I6K6JGs6JSj6JaU6JeP6KOd6LST6Yas6ZW377+9XCIuc3BsaXQoXCJcIik7XG5mb3IoaiA9IDA7IGogIT0gRFsyMzddLmxlbmd0aDsgKytqKSBpZihEWzIzN11bal0uY2hhckNvZGVBdCgwKSAhPT0gMHhGRkZEKSB7IGVbRFsyMzddW2pdXSA9IDYwNjcyICsgajsgZFs2MDY3MiArIGpdID0gRFsyMzddW2pdO31cbkRbMjM4XSA9IFwi77+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+96Zqc5YaN5ZOJ5Zyo5a6w5omN5p2Q5qC95qKT5ri95ruT54G957ih6KOB6LKh6LyJ6b2L6b2O54it566P6KuN6Yya5L2H5L2O5YSy5ZKA5aeQ5bqV5oq15p215qWu5qiX5rKu5ria54uZ54yq55a9566457S16Iun6I+56JGX6Je36Kmb6LKv6LqH6YCZ6YK46ZuO6b2f5Yuj5ZCK5auh5a+C5pGY5pW15ru054uE76e755qE56mN56yb57GN57i+57+f6I276Kyr6LOK6LWk6Leh6Lmf6L+q6L+56YGp6Y+R5L2D5L265YKz5YWo5YW45YmN5Ymq5aGh5aG85aWg5bCI5bGV5bub5oKb5oiw5qCT5q6/5rCI5r6x77+9XCIuc3BsaXQoXCJcIik7XG5mb3IoaiA9IDA7IGogIT0gRFsyMzhdLmxlbmd0aDsgKytqKSBpZihEWzIzOF1bal0uY2hhckNvZGVBdCgwKSAhPT0gMHhGRkZEKSB7IGVbRFsyMzhdW2pdXSA9IDYwOTI4ICsgajsgZFs2MDkyOCArIGpdID0gRFsyMzhdW2pdO31cbkRbMjM5XSA9IFwi77+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+954WO55Cg55Sw55S455WR55my562M566L566t56+G57qP6Kmu6Ly+6L2J6Yi/6YqT6Yyi6ZCr6Zu76aGa6aGr6aSe5YiH5oiq5oqY5rWZ55mk56uK56+A57W25Y2g5bK+5bqX5ry454K557KY6ZyR6a6O6bue5o6l5pG66J225LiB5LqV5Lqt5YGc5YG15ZGI5aeD5a6a5bmA5bqt5bu35b6B5oOF5oy65pS/5pW05peM5pm25pm45p++5qWo5qqJ5q2j5rGA5reA5reo5rif5rme54Ce54Kh546O54+955S6552b56KH56aO56iL56m957K+57aO6ImH6KiC6Kuq6LKe6YSt6YWK6YeY6Ymm6YuM6Yyg6ZyG6Z2W77+9XCIuc3BsaXQoXCJcIik7XG5mb3IoaiA9IDA7IGogIT0gRFsyMzldLmxlbmd0aDsgKytqKSBpZihEWzIzOV1bal0uY2hhckNvZGVBdCgwKSAhPT0gMHhGRkZEKSB7IGVbRFsyMzldW2pdXSA9IDYxMTg0ICsgajsgZFs2MTE4NCArIGpdID0gRFsyMzldW2pdO31cbkRbMjQwXSA9IFwi77+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+96Z2c6aCC6byO5Yi25YqR5ZW85aCk5bid5byf5oKM5o+Q5qKv5r+f56Wt56ys6IeN6Ja66KO96Ku46LmE6YaN6Zmk6Zqb6Zy96aGM6b2K5L+O5YWG5YeL5Yqp5Ziy5byU5b2r5o6q5pON5pep5pmB5pu65pu55pyd5qKd5qOX5qe95ryV5r2u54Wn54el54iq55Kq55y656WW56Wa56ef56ig56qV57KX57Of57WE57mw6IKH6Je76Jqk6KmU6Kq/6LaZ6LqB6YCg6YGt6Yej6Zi76ZuV6bOl5peP57CH6Laz6Y+D5a2Y5bCK5Y2S5ouZ54yd5YCn5a6X5b6e5oKw5oWr5qOV5reZ55Cu56iu57WC57ac57ix6IWr77+9XCIuc3BsaXQoXCJcIik7XG5mb3IoaiA9IDA7IGogIT0gRFsyNDBdLmxlbmd0aDsgKytqKSBpZihEWzI0MF1bal0uY2hhckNvZGVBdCgwKSAhPT0gMHhGRkZEKSB7IGVbRFsyNDBdW2pdXSA9IDYxNDQwICsgajsgZFs2MTQ0MCArIGpdID0gRFsyNDBdW2pdO31cbkRbMjQxXSA9IFwi77+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+96Liq6Li16Y2+6ZCY5L2Q5Z2Q5bem5bqn5oyr572q5Li75L2P5L6P5YGa5aed6IOE5ZGq5ZGo5Ze+5aWP5a6Z5bee5bua5pmd5pyx5p+x5qCq5rOo5rSy5rmK5r6N54K354+g55aH57GM57SC57Ss57ai6Iif6Jub6Ki76KqF6LWw6LqK6Lyz6YCx6YWO6YWS6ZGE6aeQ56u557Kl5L+K5YSB5YeG5Z+I5a+v5bO75pmZ5qi95rWa5rqW5r+s54SM55Wv56uj6KCi6YCh6YG16ZuL6ae/6IyB5Lit5Luy6KGG6YeN5Y295qub5qWr5rGB6JG65aKe5oaO5pu+5ouv54Od55SR55eH57mS6JK46K2J6LSI5LmL5Y+q77+9XCIuc3BsaXQoXCJcIik7XG5mb3IoaiA9IDA7IGogIT0gRFsyNDFdLmxlbmd0aDsgKytqKSBpZihEWzI0MV1bal0uY2hhckNvZGVBdCgwKSAhPT0gMHhGRkZEKSB7IGVbRFsyNDFdW2pdXSA9IDYxNjk2ICsgajsgZFs2MTY5NiArIGpdID0gRFsyNDFdW2pdO31cbkRbMjQyXSA9IFwi77+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+95ZKr5Zyw5Z2A5b+X5oyB5oyH5pGv5pSv5peo5pm65p6d5p6z5q2i5rGg5rKa5rys55+l56Cl56WJ56WX57SZ6IKi6ISC6Iez6Iqd6Iq36JyY6KqM76e86LSE6La+6YGy55u056iZ56i357mU6IG35ZSH5ZeU5aG15oyv5pCi5pmJ5pmL5qGt5qab5q6E5rSl5rqx54+N55Go55Kh55Wb55a555uh55ye556L56em57iJ57id6Ie76JSv6KKX6Ki66LOR6Lur6L6w6YCy6Y6t6Zmj6Zmz6ZyH5L6E5Y+x5aeq5auJ5biZ5qGO55OG55a+56ep56qS6Iaj6Jut6LOq6LeM6L+t5paf5pyV76e95Z+35r2X57ed6Lyv77+9XCIuc3BsaXQoXCJcIik7XG5mb3IoaiA9IDA7IGogIT0gRFsyNDJdLmxlbmd0aDsgKytqKSBpZihEWzI0Ml1bal0uY2hhckNvZGVBdCgwKSAhPT0gMHhGRkZEKSB7IGVbRFsyNDJdW2pdXSA9IDYxOTUyICsgajsgZFs2MTk1MiArIGpdID0gRFsyNDJdW2pdO31cbkRbMjQzXSA9IFwi77+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+96Y+26ZuG5b615oey5r6E5LiU5L6Y5YCf5Y+J5Zef5bWv5beu5qyh5q2k56OL566a76e+6LmJ6LuK6YGu5o2J5pC+552A56qE6Yyv6ZG/6b2q5pKw5r6v54em55Ko55Oa56uE57CS57qC57Ky57qY6K6a6LSK6ZG96aSQ6aWM5Yi55a+f5pOm5pyt57Su5YOt5Y+D5aG55oWY5oWZ5oe65pas56uZ6K6S6K6W5YCJ5YCh5Ym15ZSx5ai85bug5b2w5oS05pWe5piM5pi25pqi5qeN5ruE5ryy54yW55ih56qT6IS56ImZ6I+W6JK85YK15Z+w5a+A5a+o5b2p5o6h56Cm57a16I+c6JSh6YeH6Ye15YaK5p+1562W77+9XCIuc3BsaXQoXCJcIik7XG5mb3IoaiA9IDA7IGogIT0gRFsyNDNdLmxlbmd0aDsgKytqKSBpZihEWzI0M11bal0uY2hhckNvZGVBdCgwKSAhPT0gMHhGRkZEKSB7IGVbRFsyNDNdW2pdXSA9IDYyMjA4ICsgajsgZFs2MjIwOCArIGpdID0gRFsyNDNdW2pdO31cbkRbMjQ0XSA9IFwi77+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+96LKs5YeE5aa75oK96JmV5YCc76e/5YmU5bC65oW95oia5ouT5pOy5pal5ruM55ig6ISK6Lmg6Zmf6Zq75Luf5Y2D5ZaY5aSp5bed5pOF5rOJ5re6546U56m/6Iib6Jam6LOk6LiQ6YG36Yen6Zeh6Zih6Z+G5Ye45ZOy5ZaG5b655pKk5r6I57a06Lyf6L2N6ZC15YOJ5bCW5rK+5re755Sb556757C957Gk6Km56KuC5aCe5aa+5biW5o2354mS55aK552r6Kuc6LK86LyS5buz5pm05re46IG96I+B6KuL6Z2R6a+W76iA5YmD5pu/5raV5ruv57eg6Kum6YCu6YGe6auU5Yid5Ym/5ZOo5oaU5oqE5oub5qKi77+9XCIuc3BsaXQoXCJcIik7XG5mb3IoaiA9IDA7IGogIT0gRFsyNDRdLmxlbmd0aDsgKytqKSBpZihEWzI0NF1bal0uY2hhckNvZGVBdCgwKSAhPT0gMHhGRkZEKSB7IGVbRFsyNDRdW2pdXSA9IDYyNDY0ICsgajsgZFs2MjQ2NCArIGpdID0gRFsyNDRdW2pdO31cbkRbMjQ1XSA9IFwi77+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+95qSS5qWa5qi154KS54Sm56Gd56SB56SO56eS56iN6IKW6Im46IuV6I2J6JWJ6LKC6LaF6YWi6YaL6Yau5L+D5ZuR54et55+X6JyA6Ke45a+45b+W5p2R6YKo5Y+i5aGa5a+15oKk5oaB5pGg57i96IGw6JSl6YqD5pKu5YKs5bSU5pyA5aKc5oq95o6o5qSO5qW45qie5rmr55q656eL6Iq76JCp6KuP6Lao6L+96YSS6YWL6Yac6YyQ6YyY6Y6a6Zub6ai26bCN5LiR55Wc56Wd56u6562R56+J57iu6JOE6LmZ6Lm06Lu46YCQ5pil5qS/55GD5Ye65pyu6buc5YWF5b+g5rKW6J+y6KGd6KG35oK06Ia16JCD77+9XCIuc3BsaXQoXCJcIik7XG5mb3IoaiA9IDA7IGogIT0gRFsyNDVdLmxlbmd0aDsgKytqKSBpZihEWzI0NV1bal0uY2hhckNvZGVBdCgwKSAhPT0gMHhGRkZEKSB7IGVbRFsyNDVdW2pdXSA9IDYyNzIwICsgajsgZFs2MjcyMCArIGpdID0gRFsyNDVdW2pdO31cbkRbMjQ2XSA9IFwi77+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+96LSF5Y+W5ZC55Zi05ai25bCx54KK57+g6IGa6ISG6Iet6Laj6YaJ6amf6bey5YG05LuE5Y6g5oO75ris5bGk5L6I5YCk5Zek5bOZ5bmf5oGl5qKU5rK75reE54a+55eU55e055mh56ia56mJ57eH57e7572u6Ie06Jqp6Lyc6ZuJ6aaz6b2S5YmH5YuF6aOt6Kaq5LiD5p+S5ryG5L615a+i5p6V5rKI5rW455Cb56Cn6Yed6Y286J+E56ek56ix5b+r5LuW5ZKk5ZS+5aKu5aal5oOw5omT5ouW5py25qWV6Ii16ZmA6aax6aed5YCs5Y2T5ZWE5Z2876iB5omY76iC5pOi5pmr5p+d5r+B5r+v55Ci55C46KiX77+9XCIuc3BsaXQoXCJcIik7XG5mb3IoaiA9IDA7IGogIT0gRFsyNDZdLmxlbmd0aDsgKytqKSBpZihEWzI0Nl1bal0uY2hhckNvZGVBdCgwKSAhPT0gMHhGRkZEKSB7IGVbRFsyNDZdW2pdXSA9IDYyOTc2ICsgajsgZFs2Mjk3NiArIGpdID0gRFsyNDZdW2pdO31cbkRbMjQ3XSA9IFwi77+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+96ZC45ZGR5ZiG5Z2m5b2I5oaa5q2O54GY54Kt57a76KqV5aWq6ISr5o6i55yI6IC96LKq5aGU5pCt5qa75a6V5biR5rmv76iD6JWp5YWM5Y+w5aSq5oCg5oWL5q6G5rGw5rOw56ye6IOO6IuU6LeG6YKw6aKx76iE5pOH5r6k5pKR5pSE5YWO5ZCQ5Zyf6KiO5oWf5qG276iF55eb562S57Wx6YCa5aCG5qeM6IW/6KSq6YCA6aC55YG45aWX5aas5oqV6YCP6ayq5oWd54m56ZeW5Z2h5amG5be05oqK5pKt5pO65p235rOi5rS+54is55C256C057236Iqt6Leb6aCX5Yik5Z2C5p2/54mI55Oj6LKp6L6m6YiR77+9XCIuc3BsaXQoXCJcIik7XG5mb3IoaiA9IDA7IGogIT0gRFsyNDddLmxlbmd0aDsgKytqKSBpZihEWzI0N11bal0uY2hhckNvZGVBdCgwKSAhPT0gMHhGRkZEKSB7IGVbRFsyNDddW2pdXSA9IDYzMjMyICsgajsgZFs2MzIzMiArIGpdID0gRFsyNDddW2pdO31cbkRbMjQ4XSA9IFwi77+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+96Ziq5YWr5Y+t5o2M5L2p5ZSE5oKW5pWX5rKb5rW/54mM54u956iX6KaH6LKd5b2t5r6O54O56Iao5oSO5L6/5YGP5omB54mH56+H57eo57+p6YGN6Z6t6aiZ6LK25Z2q5bmz5p6w6JCN6KmV5ZCg5ayW5bmj5bui5byK5paD6IK66JS96ZaJ6Zmb5L2I5YyF5YyN5YyP5ZKG5ZO65ZyD5biD5oCW5oqb5oqx5o2V76iG5rOh5rWm55ax56Cy6IOe6ISv6Iue6JGh6JKy6KKN6KSS6YCL6Yuq6aO96a6R5bmF5pq05pud54CR54iG76iH5L+15Ym95b2q5oWT5p2T5qiZ5ryC55Oi56Wo6KGo6LG56aOH6aOE6amD77+9XCIuc3BsaXQoXCJcIik7XG5mb3IoaiA9IDA7IGogIT0gRFsyNDhdLmxlbmd0aDsgKytqKSBpZihEWzI0OF1bal0uY2hhckNvZGVBdCgwKSAhPT0gMHhGRkZEKSB7IGVbRFsyNDhdW2pdXSA9IDYzNDg4ICsgajsgZFs2MzQ4OCArIGpdID0gRFsyNDhdW2pdO31cbkRbMjQ5XSA9IFwi77+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+95ZOB56if5qWT6Ku36LGK6aKo6aau5b285oqr55ay55qu6KKr6YG/6ZmC5Yy55by85b+F5rOM54+M55Wi55aL562G6Iu+6aad5LmP6YC85LiL5L2V5Y6m5aSP5buI5piw5rKz55GV6I236J2m6LOA6YGQ6Zye6bCV5aOR5a246JmQ6KyU6ba05a+S5oGo5oKN5pex5rGX5ryi5r6j54Ca572V57+w6ZaR6ZaS6ZmQ6Z+T5Ymy6L2E5Ye95ZCr5ZK45ZWj5ZaK5qq75ra157eY6Imm6Yqc6Zm36bm55ZCI5ZOI55uS6Juk6Zak6ZeU6Zmc5Lqi5LyJ5aeu5aum5be35oGS5oqX5p2t5qGB5rKG5riv57y46IKb6Iiq77+9XCIuc3BsaXQoXCJcIik7XG5mb3IoaiA9IDA7IGogIT0gRFsyNDldLmxlbmd0aDsgKytqKSBpZihEWzI0OV1bal0uY2hhckNvZGVBdCgwKSAhPT0gMHhGRkZEKSB7IGVbRFsyNDldW2pdXSA9IDYzNzQ0ICsgajsgZFs2Mzc0NCArIGpdID0gRFsyNDldW2pdO31cbkRbMjUwXSA9IFwi77+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+976iI76iJ6aCF5Lql5YGV5ZKz5Z6T5aWa5a2p5a6z5oeI5qW35rW354Cj6J+56Kej6Kmy6Kun6YKC6aet6aq45Yq+5qC45YCW5bm45p2P6I2H6KGM5Lqr5ZCR5Zqu54+m6YSV6Z+/6aSJ6aWX6aaZ5ZmT5aKf6Jmb6Kix5oay5qu254276LuS5q2H6Zqq6amX5aWV54iA6LWr6Z2p5L+U5bO05bym5oe45pmb5rOr54Kr546E546554++55yp552N57WD57Wi57ij6Ii36KGS76iK6LOi6YmJ6aGv5a2R56m06KGA6aCB5auM5L+g5Y2U5aS+5bO95oy+5rW554u56ISF6ISH6I6i6YuP6aCw5Lqo5YWE5YiR5Z6L77+9XCIuc3BsaXQoXCJcIik7XG5mb3IoaiA9IDA7IGogIT0gRFsyNTBdLmxlbmd0aDsgKytqKSBpZihEWzI1MF1bal0uY2hhckNvZGVBdCgwKSAhPT0gMHhGRkZEKSB7IGVbRFsyNTBdW2pdXSA9IDY0MDAwICsgajsgZFs2NDAwMCArIGpdID0gRFsyNTBdW2pdO31cbkRbMjUxXSA9IFwi77+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+95b2i5rOC5ruO54CF54GQ54Kv54aS54+p55Gp6I2K6J6i6KGh6YCI6YKi6Y6j6aao5YWu5b2X5oOg5oWn5pqz6JWZ6LmK6Yav6Z6L5LmO5LqS5ZG85aOV5aO65aW95bK15byn5oi25omI5piK5pmn5q+r5rWp5reP5rmW5ru45r6U5r+g5r+p54Gd54uQ55Cl55Ga55Og55qT56Wc57OK57ie6IOh6Iqm6JGr6JK/6JmO6Jmf6J206K236LGq6Y6s6aCA6aGl5oOR5oiW6YW35ama5piP5re35ri+55C/6a2C5b+95oOa56yP5ZOE5byY5rGe5rOT5rSq54OY57SF6Jm56KiM6bS75YyW5ZKM5ayF5qi654Gr55W177+9XCIuc3BsaXQoXCJcIik7XG5mb3IoaiA9IDA7IGogIT0gRFsyNTFdLmxlbmd0aDsgKytqKSBpZihEWzI1MV1bal0uY2hhckNvZGVBdCgwKSAhPT0gMHhGRkZEKSB7IGVbRFsyNTFdW2pdXSA9IDY0MjU2ICsgajsgZFs2NDI1NiArIGpdID0gRFsyNTFdW2pdO31cbkRbMjUyXSA9IFwi77+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+956aN56a+6Iqx6I+v6Kmx6K2B6LKo6Z2076iL5pO05pSr56K656K756mr5Li45Zaa5aWQ5a6m5bm75oKj5o+b5q2h5pml5qGT5riZ54Wl55Kw57SI6YKE6amp6bCl5rS75ruR54y+6LGB6ZeK5Yew5bmM5b6o5oGN5oO25oSw5oWM5pmD5pmE5qal5rOB5rmf5ruJ5r2i54WM55Kc55qH56+B57Cn6I2S6J2X6YGR6ZqN6buD5Yyv5Zue5bu75b6K5oGi5oKU5oe35pmm5pyD5qqc5reu5r6u54Gw542q57mq6Ia+6Iy06JuU6Kqo6LOE5YqD542y5a6W5qmr6ZCE5ZOu5ZqG5a2d5pWI5paF5puJ5qKf5raN5reG77+9XCIuc3BsaXQoXCJcIik7XG5mb3IoaiA9IDA7IGogIT0gRFsyNTJdLmxlbmd0aDsgKytqKSBpZihEWzI1Ml1bal0uY2hhckNvZGVBdCgwKSAhPT0gMHhGRkZEKSB7IGVbRFsyNTJdW2pdXSA9IDY0NTEyICsgajsgZFs2NDUxMiArIGpdID0gRFsyNTJdW2pdO31cbkRbMjUzXSA9IFwi77+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+954i76IK06YW16amN5L6v5YCZ5Y6a5ZCO5ZC85ZaJ5ZeF5bi/5b6M5py954Wm54+d6YCF5Yub5Yuz5aGk5aOO54SE54aP54e76Jaw6KiT5pqI6Jao5Zan5pqE54WK6JCx5Y2J5ZaZ5q+B5b2Z5b695o+u5pqJ54WH6Kux6Lyd6bq+5LyR5pC654OL55Wm6Jmn5oGk6K2O6be45YWH5Ye25YyI5rS26IO46buR5piV5qyj54KY55eV5ZCD5bG557SH6KiW5qyg5qy95q2G5ZC45oGw5rS957+V6IiI5YOW5Yee5Zac5Zmr5ZuN5aes5ayJ5biM5oaZ5oaY5oix5pme5pum54aZ54a554a654qn56an56iA576y6Kmw77+9XCIuc3BsaXQoXCJcIik7XG5mb3IoaiA9IDA7IGogIT0gRFsyNTNdLmxlbmd0aDsgKytqKSBpZihEWzI1M11bal0uY2hhckNvZGVBdCgwKSAhPT0gMHhGRkZEKSB7IGVbRFsyNTNdW2pdXSA9IDY0NzY4ICsgajsgZFs2NDc2OCArIGpdID0gRFsyNTNdW2pdO31cbnJldHVybiB7XCJlbmNcIjogZSwgXCJkZWNcIjogZCB9OyB9KSgpO1xuY3B0YWJsZVs5NTBdID0gKGZ1bmN0aW9uKCl7IHZhciBkID0gW10sIGUgPSB7fSwgRCA9IFtdLCBqO1xuRFswXSA9IFwiXFx1MDAwMFxcdTAwMDFcXHUwMDAyXFx1MDAwM1xcdTAwMDRcXHUwMDA1XFx1MDAwNlxcdTAwMDdcXGJcXHRcXG5cXHUwMDBiXFxmXFxyXFx1MDAwZVxcdTAwMGZcXHUwMDEwXFx1MDAxMVxcdTAwMTJcXHUwMDEzXFx1MDAxNFxcdTAwMTVcXHUwMDE2XFx1MDAxN1xcdTAwMThcXHUwMDE5XFx1MDAxYVxcdTAwMWJcXHUwMDFjXFx1MDAxZFxcdTAwMWVcXHUwMDFmICFcXFwiIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6Ozw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXFxcXF1eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX5/77+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+9XCIuc3BsaXQoXCJcIik7XG5mb3IoaiA9IDA7IGogIT0gRFswXS5sZW5ndGg7ICsraikgaWYoRFswXVtqXS5jaGFyQ29kZUF0KDApICE9PSAweEZGRkQpIHsgZVtEWzBdW2pdXSA9IDAgKyBqOyBkWzAgKyBqXSA9IERbMF1bal07fVxuRFsxNjFdID0gXCLvv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73jgIDvvIzjgIHjgILvvI7igKfvvJvvvJrvvJ/vvIHvuLDigKbigKXvuZDvuZHvuZLCt++5lO+5le+5lu+5l++9nOKAk++4seKAlO+4s+KVtO+4tO+5j++8iO+8ie+4te+4tu+9m++9ne+4t++4uOOAlOOAle+4ue+4uuOAkOOAke+4u++4vOOAiuOAi++4ve+4vuOAiOOAie+4v++5gOOAjOOAje+5ge+5guOAjuOAj++5g++5hO+5me+5mu+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+5m++5nO+5ne+5nuKAmOKAmeKAnOKAneOAneOAnuKAteKAsu+8g++8hu+8iuKAu8Kn44CD4peL4peP4paz4pay4peO4piG4piF4peH4peG4pah4pag4pa94pa844qj4oSFwq/vv6PvvL/Lje+5ie+5iu+5je+5ju+5i++5jO+5n++5oO+5oe+8i++8jcOXw7fCseKImu+8nO+8nu+8neKJpuKJp+KJoOKInuKJkuKJoe+5ou+5o++5pO+5pe+5pu+9nuKIqeKIquKKpeKIoOKIn+KKv+OPkuOPkeKIq+KIruKIteKItOKZgOKZguKKleKKmeKGkeKGk+KGkOKGkuKGluKGl+KGmeKGmOKIpeKIo++8j++/vVwiLnNwbGl0KFwiXCIpO1xuZm9yKGogPSAwOyBqICE9IERbMTYxXS5sZW5ndGg7ICsraikgaWYoRFsxNjFdW2pdLmNoYXJDb2RlQXQoMCkgIT09IDB4RkZGRCkgeyBlW0RbMTYxXVtqXV0gPSA0MTIxNiArIGo7IGRbNDEyMTYgKyBqXSA9IERbMTYxXVtqXTt9XG5EWzE2Ml0gPSBcIu+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+8vOKIle+5qO+8hO+/peOAku+/oO+/oe+8he+8oOKEg+KEie+5qe+5qu+5q+OPleOOnOOOneOOnuOPjuOOoeOOjuOOj+OPhMKw5YWZ5YWb5YWe5YWd5YWh5YWj5Zen55Op57OO4paB4paC4paD4paE4paF4paG4paH4paI4paP4paO4paN4paM4paL4paK4paJ4pS84pS04pSs4pSk4pSc4paU4pSA4pSC4paV4pSM4pSQ4pSU4pSY4pWt77+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+94pWu4pWw4pWv4pWQ4pWe4pWq4pWh4pei4pej4pel4pek4pWx4pWy4pWz77yQ77yR77yS77yT77yU77yV77yW77yX77yY77yZ4oWg4oWh4oWi4oWj4oWk4oWl4oWm4oWn4oWo4oWp44Ch44Ci44Cj44Ck44Cl44Cm44Cn44Co44Cp5Y2B5Y2E5Y2F77yh77yi77yj77yk77yl77ym77yn77yo77yp77yq77yr77ys77yt77yu77yv77yw77yx77yy77yz77y077y177y277y377y477y577y6772B772C772D772E772F772G772H772I772J772K772L772M772N772O772P772Q772R772S772T772U772V772W77+9XCIuc3BsaXQoXCJcIik7XG5mb3IoaiA9IDA7IGogIT0gRFsxNjJdLmxlbmd0aDsgKytqKSBpZihEWzE2Ml1bal0uY2hhckNvZGVBdCgwKSAhPT0gMHhGRkZEKSB7IGVbRFsxNjJdW2pdXSA9IDQxNDcyICsgajsgZFs0MTQ3MiArIGpdID0gRFsxNjJdW2pdO31cbkRbMTYzXSA9IFwi77+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+9772X772Y772Z772azpHOks6TzpTOlc6WzpfOmM6ZzprOm86czp3Ons6fzqDOoc6jzqTOpc6mzqfOqM6pzrHOss6zzrTOtc62zrfOuM65zrrOu868zr3Ovs6/z4DPgc+Dz4TPhc+Gz4fPiM+J44SF44SG44SH44SI44SJ44SK44SL44SM44SN44SO44SP77+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+944SQ44SR44SS44ST44SU44SV44SW44SX44SY44SZ44Sa44Sb44Sc44Sd44Se44Sf44Sg44Sh44Si44Sj44Sk44Sl44Sm44Sn44So44Spy5nLicuKy4fLi++/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/veKCrO+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/vVwiLnNwbGl0KFwiXCIpO1xuZm9yKGogPSAwOyBqICE9IERbMTYzXS5sZW5ndGg7ICsraikgaWYoRFsxNjNdW2pdLmNoYXJDb2RlQXQoMCkgIT09IDB4RkZGRCkgeyBlW0RbMTYzXVtqXV0gPSA0MTcyOCArIGo7IGRbNDE3MjggKyBqXSA9IERbMTYzXVtqXTt9XG5EWzE2NF0gPSBcIu+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/veS4gOS5meS4geS4g+S5g+S5neS6huS6jOS6uuWEv+WFpeWFq+WHoOWIgOWIgeWKm+WMleWNgeWNnOWPiOS4ieS4i+S4iOS4iuS4q+S4uOWHoeS5heS5iOS5n+S5nuS6juS6oeWFgOWIg+WLuuWNg+WPieWPo+Wcn+Wjq+WkleWkp+Wls+WtkOWtkeWtk+WvuOWwj+WwouWwuOWxseW3neW3peW3seW3suW3s+W3vuW5suW7vuW8i+W8k+aJje+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/veS4keS4kOS4jeS4reS4sOS4ueS5i+WwueS6iOS6keS6leS6kuS6lOS6ouS7geS7gOS7g+S7huS7h+S7jeS7iuS7i+S7hOWFg+WFgeWFp+WFreWFruWFrOWGl+WHtuWIhuWIh+WIiOWLu+WLvuWLv+WMluWMueWNiOWNh+WNheWNnuWOhOWPi+WPiuWPjeWjrOWkqeWkq+WkquWkreWtlOWwkeWwpOWwuuWxr+W3tOW5u+W7v+W8lOW8leW/g+aIiOaItuaJi+aJjuaUr+aWh+aWl+aWpOaWueaXpeabsOaciOacqOasoOatouatueavi+avlOavm+awj+awtOeBq+eIqueItueIu+eJh+eJmeeJm+eKrOeOi+S4me+/vVwiLnNwbGl0KFwiXCIpO1xuZm9yKGogPSAwOyBqICE9IERbMTY0XS5sZW5ndGg7ICsraikgaWYoRFsxNjRdW2pdLmNoYXJDb2RlQXQoMCkgIT09IDB4RkZGRCkgeyBlW0RbMTY0XVtqXV0gPSA0MTk4NCArIGo7IGRbNDE5ODQgKyBqXSA9IERbMTY0XVtqXTt9XG5EWzE2NV0gPSBcIu+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/veS4luS4leS4lOS4mOS4u+S5jeS5j+S5juS7peS7mOS7lOS7leS7luS7l+S7o+S7pOS7meS7nuWFheWFhOWGieWGiuWGrOWHueWHuuWHuOWIiuWKoOWKn+WMheWMhuWMl+WMneS7n+WNiuWNieWNoeWNoOWNr+WNruWOu+WPr+WPpOWPs+WPrOWPruWPqeWPqOWPvOWPuOWPteWPq+WPpuWPquWPsuWPseWPsOWPpeWPreWPu+Wbm+WbmuWklu+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/veWkruWkseWltOWltuWtleWug+WwvOW3qOW3p+W3puW4guW4g+W5s+W5vOW8geW8mOW8l+W/heaIiuaJk+aJlOaJkuaJkeaWpeaXpuacruacrOacquacq+acreato+avjeawkeawkOawuOaxgeaxgOawvueKr+eOhOeOieeTnOeTpueUmOeUn+eUqOeUqeeUsOeUseeUsueUs+eWi+eZveearueav+ebruefm+efouefs+ekuuemvueptOeri+S4nuS4n+S5kuS5k+S5qeS6meS6pOS6puS6peS7v+S8ieS8meS8iuS8leS8jeS8kOS8keS8j+S7suS7tuS7u+S7sOS7s+S7veS8geS8i+WFieWFh+WFhuWFiOWFqO+/vVwiLnNwbGl0KFwiXCIpO1xuZm9yKGogPSAwOyBqICE9IERbMTY1XS5sZW5ndGg7ICsraikgaWYoRFsxNjVdW2pdLmNoYXJDb2RlQXQoMCkgIT09IDB4RkZGRCkgeyBlW0RbMTY1XVtqXV0gPSA0MjI0MCArIGo7IGRbNDIyNDAgKyBqXSA9IERbMTY1XVtqXTt9XG5EWzE2Nl0gPSBcIu+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/veWFseWGjeWGsOWIl+WIkeWIkuWIjuWIluWKo+WMiOWMoeWMoOWNsOWNseWQieWQj+WQjOWQiuWQkOWQgeWQi+WQhOWQkeWQjeWQiOWQg+WQjuWQhuWQkuWboOWbnuWbneWcs+WcsOWcqOWcreWcrOWcr+WcqeWkmeWkmuWkt+WkuOWmhOWluOWmg+WlveWlueWmguWmgeWtl+WtmOWuh+WuiOWuheWuieWvuuWwluWxueW3nuW4huW5tuW5tO+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/veW8j+W8m+W/meW/luaIjuaIjOaIjeaIkOaJo+aJm+aJmOaUtuaXqeaXqOaXrOaXreabsuabs+acieacveactOacseacteasoeatpOatu+awluaxneaxl+axmeaxn+axoOaxkOaxleaxoeaxm+axjeaxjueBsOeJn+eJneeZvuerueexs+ezuOe8tue+iue+veiAgeiAg+iAjOiAkuiAs+iBv+iCieiCi+iCjOiHo+iHquiHs+iHvOiIjOiIm+iIn+iJruiJsuiJvuiZq+ihgOihjOiho+ilv+mYoeS4suS6qOS9jeS9j+S9h+S9l+S9nuS8tOS9m+S9leS8sOS9kOS9keS8veS8uuS8uOS9g+S9lOS8vOS9huS9o++/vVwiLnNwbGl0KFwiXCIpO1xuZm9yKGogPSAwOyBqICE9IERbMTY2XS5sZW5ndGg7ICsraikgaWYoRFsxNjZdW2pdLmNoYXJDb2RlQXQoMCkgIT09IDB4RkZGRCkgeyBlW0RbMTY2XVtqXV0gPSA0MjQ5NiArIGo7IGRbNDI0OTYgKyBqXSA9IERbMTY2XVtqXTt9XG5EWzE2N10gPSBcIu+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/veS9nOS9oOS8r+S9juS8tuS9meS9neS9iOS9muWFjOWFi+WFjeWFteWGtuWGt+WIpeWIpOWIqeWIquWIqOWKq+WKqeWKquWKrOWMo+WNs+WNteWQneWQreWQnuWQvuWQpuWRjuWQp+WRhuWRg+WQs+WRiOWRguWQm+WQqeWRiuWQueWQu+WQuOWQruWQteWQtuWQoOWQvOWRgOWQseWQq+WQn+WQrOWbquWbsOWbpOWbq+WdiuWdkeWdgOWdje+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/veWdh+WdjuWcvuWdkOWdj+Wcu+Wjr+WkvuWmneWmkuWmqOWmnuWmo+WmmeWmluWmjeWmpOWmk+WmiuWmpeWtneWtnOWtmuWtm+WujOWui+Wuj+WwrOWxgOWxgeWwv+WwvuWykOWykeWylOWyjOW3q+W4jOW6j+W6h+W6iuW7t+W8hOW8n+W9pOW9ouW9t+W9ueW/mOW/jOW/l+W/jeW/seW/q+W/uOW/quaIkuaIkeaKhOaKl+aKluaKgOaJtuaKieaJreaKiuaJvOaJvuaJueaJs+aKkuaJr+aKmOaJruaKleaKk+aKkeaKhuaUueaUu+aUuOaXseabtOadn+adjuadj+adkOadkeadnOadluadnuadieadhuadoO+/vVwiLnNwbGl0KFwiXCIpO1xuZm9yKGogPSAwOyBqICE9IERbMTY3XS5sZW5ndGg7ICsraikgaWYoRFsxNjddW2pdLmNoYXJDb2RlQXQoMCkgIT09IDB4RkZGRCkgeyBlW0RbMTY3XVtqXV0gPSA0Mjc1MiArIGo7IGRbNDI3NTIgKyBqXSA9IERbMTY3XVtqXTt9XG5EWzE2OF0gPSBcIu+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/veadk+adl+atpeavj+axguaxnuaymeaygeayiOayieayheaym+axquaxuuaykOaxsOayjOaxqOayluaykuaxveayg+axsuaxvuaxtOayhuaxtuayjeaylOaymOaygueBtueBvOeBveeBuOeJoueJoeeJoOeLhOeLgueOlueUrOeUq+eUt+eUuOeaguebr+efo+engeengOemv+eptuezu+e9leiCluiCk+iCneiCmOiCm+iCmuiCsuiJr+iKku+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/veiKi+iKjeimi+inkuiogOiwt+ixhuixleiynei1pOi1sOi2s+i6q+i7iui+m+i+sOi/gui/hui/hei/hOW3oemCkemCoumCqumCpumCo+mFiemHhumHjOmYsumYrumYsemYqumYrOS4puS5luS5s+S6i+S6m+S6nuS6q+S6rOS9r+S+neS+jeS9s+S9v+S9rOS+m+S+i+S+huS+g+S9sOS9teS+iOS9qeS9u+S+luS9vuS+j+S+keS9uuWFlOWFkuWFleWFqeWFt+WFtuWFuOWGveWHveWIu+WIuOWIt+WIuuWIsOWIruWItuWJgeWKvuWKu+WNkuWNlOWNk+WNkeWNpuWNt+WNuOWNueWPluWPlOWPl+WRs+WRte+/vVwiLnNwbGl0KFwiXCIpO1xuZm9yKGogPSAwOyBqICE9IERbMTY4XS5sZW5ndGg7ICsraikgaWYoRFsxNjhdW2pdLmNoYXJDb2RlQXQoMCkgIT09IDB4RkZGRCkgeyBlW0RbMTY4XVtqXV0gPSA0MzAwOCArIGo7IGRbNDMwMDggKyBqXSA9IERbMTY4XVtqXTt9XG5EWzE2OV0gPSBcIu+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/veWSluWRuOWSleWSgOWRu+WRt+WShOWSkuWShuWRvOWSkOWRseWRtuWSjOWSmuWRouWRqOWSi+WRveWSjuWbuuWeg+Wdt+WdquWdqeWdoeWdpuWdpOWdvOWknOWlieWlh+WliOWlhOWllOWmvuWmu+WnlOWmueWmruWnkeWnhuWnkOWnjeWni+Wnk+WniuWmr+Wms+WnkuWnheWtn+WtpOWto+Wul+WumuWumOWunOWumeWum+WwmuWxiOWxhe+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/veWxhuWyt+WyoeWyuOWyqeWyq+WyseWys+W4mOW4muW4luW4leW4m+W4keW5uOW6muW6l+W6nOW6leW6luW7tuW8puW8p+W8qeW+gOW+geW9v+W9vOW/neW/oOW/veW/teW/v+aAj+aAlOaAr+aAteaAluaAquaAleaAoeaAp+aAqeaAq+aAm+aIluaIleaIv+aIvuaJgOaJv+aLieaLjOaLhOaKv+aLguaKueaLkuaLm+aKq+aLk+aLlOaLi+aLiOaKqOaKveaKvOaLkOaLmeaLh+aLjeaKteaLmuaKseaLmOaLluaLl+aLhuaKrOaLjuaUvuaWp+aWvOaXuuaYlOaYk+aYjOaYhuaYguaYjuaYgOaYj+aYleaYiu+/vVwiLnNwbGl0KFwiXCIpO1xuZm9yKGogPSAwOyBqICE9IERbMTY5XS5sZW5ndGg7ICsraikgaWYoRFsxNjldW2pdLmNoYXJDb2RlQXQoMCkgIT09IDB4RkZGRCkgeyBlW0RbMTY5XVtqXV0gPSA0MzI2NCArIGo7IGRbNDMyNjQgKyBqXSA9IERbMTY5XVtqXTt9XG5EWzE3MF0gPSBcIu+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/veaYh+acjeaci+adreaei+aeleadseaenOads+adt+aeh+aeneael+adr+adsOadv+aeieadvuaekOadteaemuaek+advOadquadsuaso+atpuatp+atv+awk+awm+azo+azqOazs+ayseazjOazpeays+ayveayvuayvOazouayq+azleazk+ayuOazhOayueazgeayruazl+azheazseayv+ayu+azoeazm+aziuayrOazr+aznOazluazoO+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/veeCleeCjueCkueCiueCmeeIrOeIreeIuOeJiOeJp+eJqeeLgOeLjueLmeeLl+eLkOeOqeeOqOeOn+eOq+eOpeeUveeWneeWmeeWmueahOebguebsuebtOefpeefveekvuelgOelgeenieeniOepuuepueeruuezvue9lOe+jOe+i+iAheiCuuiCpeiCouiCseiCoeiCq+iCqeiCtOiCquiCr+iHpeiHvuiIjeiKs+iKneiKmeiKreiKveiKn+iKueiKseiKrOiKpeiKr+iKuOiKo+iKsOiKvuiKt+iZjuiZseWIneihqOi7i+i/jui/lOi/kemCtemCuOmCsemCtumHh+mHkemVt+mWgOmYnOmZgOmYv+mYu+mZhO+/vVwiLnNwbGl0KFwiXCIpO1xuZm9yKGogPSAwOyBqICE9IERbMTcwXS5sZW5ndGg7ICsraikgaWYoRFsxNzBdW2pdLmNoYXJDb2RlQXQoMCkgIT09IDB4RkZGRCkgeyBlW0RbMTcwXVtqXV0gPSA0MzUyMCArIGo7IGRbNDM1MjAgKyBqXSA9IERbMTcwXVtqXTt9XG5EWzE3MV0gPSBcIu+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/vemZgumauembqOmdkumdnuS6n+S6reS6ruS/oeS+teS+r+S+v+S/oOS/keS/j+S/neS/g+S+tuS/mOS/n+S/iuS/l+S+ruS/kOS/hOS/guS/muS/juS/nuS+t+WFl+WGkuWGkeWGoOWJjuWJg+WJiuWJjeWJjOWJi+WJh+WLh+WLieWLg+WLgeWMjeWNl+WNu+WOmuWPm+WSrOWTgOWSqOWTjuWTieWSuOWSpuWSs+WTh+WTguWSveWSquWTge+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/veWThOWTiOWSr+WSq+WSseWSu+WSqeWSp+WSv+Wbv+WeguWei+WeoOWeo+WeouWfjuWeruWek+WlleWlkeWlj+WljuWlkOWnnOWnmOWnv+Wno+WnqOWog+WnpeWnquWnmuWnpuWogeWnu+WtqeWuo+WupuWupOWuouWupeWwgeWxjuWxj+WxjeWxi+WzmeWzkuW3t+W4neW4peW4n+W5veW6oOW6puW7uuW8iOW8reW9peW+iOW+heW+iuW+i+W+h+W+jOW+ieaAkuaAneaAoOaApeaAjuaAqOaBjeaBsOaBqOaBouaBhuaBg+aBrOaBq+aBquaBpOaJgeaLnOaMluaMieaLvOaLreaMgeaLruaLveaMh+aLseaLt++/vVwiLnNwbGl0KFwiXCIpO1xuZm9yKGogPSAwOyBqICE9IERbMTcxXS5sZW5ndGg7ICsraikgaWYoRFsxNzFdW2pdLmNoYXJDb2RlQXQoMCkgIT09IDB4RkZGRCkgeyBlW0RbMTcxXVtqXV0gPSA0Mzc3NiArIGo7IGRbNDM3NzYgKyBqXSA9IERbMTcxXVtqXTt9XG5EWzE3Ml0gPSBcIu+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/veaLr+aLrOaLvuaLtOaMkeaMguaUv+aVheaWq+aWveaXouaYpeaYreaYoOaYp+aYr+aYn+aYqOaYseaYpOabt+afv+afk+afseaflOafkOafrOaetuaer+afteafqeafr+afhOafkeaetOafmuafpeaeuOafj+afnuafs+aesOafmeafouafneafkuatquaug+auhuauteavkuavl+awn+aziea0i+a0sua0qua1gea0pea0jOa0sea0nua0l++/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/vea0u+a0vea0vua0tua0m+aztea0uea0p+a0uOa0qea0rua0tea0jua0q+eCq+eCuueCs+eCrOeCr+eCreeCuOeCrueCpOeIsOeJsueJr+eJtOeLqeeLoOeLoeeOt+ePiueOu+eOsuePjeePgOeOs+eUmueUreeVj+eVjOeVjueVi+eWq+eWpOeWpeeWoueWo+eZuOeahueah+eaiOebiOebhuebg+ebheecgeebueebuOecieeci+ebvuebvOech+efnOeggueglOegjOegjeelhuelieeliOelh+emueemuuenkeenkueni+epv+eqgeerv+erveexvee0gue0hee0gOe0iee0h+e0hOe0hue8uOe+jue+v+iAhO+/vVwiLnNwbGl0KFwiXCIpO1xuZm9yKGogPSAwOyBqICE9IERbMTcyXS5sZW5ndGg7ICsraikgaWYoRFsxNzJdW2pdLmNoYXJDb2RlQXQoMCkgIT09IDB4RkZGRCkgeyBlW0RbMTcyXVtqXV0gPSA0NDAzMiArIGo7IGRbNDQwMzIgKyBqXSA9IERbMTcyXVtqXTt9XG5EWzE3M10gPSBcIu+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/veiAkOiAjeiAkeiAtuiDluiDpeiDmuiDg+iDhOiDjOiDoeiDm+iDjuiDnuiDpOiDneiHtOiIouiLp+iMg+iMheiLo+iLm+iLpuiMhOiLpeiMguiMieiLkuiLl+iLseiMgeiLnOiLlOiLkeiLnuiLk+iLn+iLr+iMhuiZkOiZueiZu+iZuuihjeihq+imgeinlOioiOioguiog+iynuiyoOi1tOi1s+i2tOi7jei7jOi/sOi/pui/oui/qui/pe+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/vei/rei/q+i/pOi/qOmDiumDjumDgemDg+mFi+mFiumHjemWgumZkOmZi+mZjOmZjemdoumdqemfi+mfremfs+mggemiqOmjm+mjn+mmlummmeS5mOS6s+WAjOWAjeWAo+S/r+WApuWApeS/uOWAqeWAluWAhuWAvOWAn+WAmuWAkuWAkeS/uuWAgOWAlOWAqOS/seWAoeWAi+WAmeWAmOS/s+S/ruWAreWAquS/vuWAq+WAieWFvOWGpOWGpeWGouWHjeWHjOWHhuWHi+WJluWJnOWJlOWJm+WJneWMquWNv+WOn+WOneWPn+WTqOWUkOWUgeWUt+WTvOWTpeWTsuWUhuWTuuWUlOWTqeWTreWToeWUieWTruWTqu+/vVwiLnNwbGl0KFwiXCIpO1xuZm9yKGogPSAwOyBqICE9IERbMTczXS5sZW5ndGg7ICsraikgaWYoRFsxNzNdW2pdLmNoYXJDb2RlQXQoMCkgIT09IDB4RkZGRCkgeyBlW0RbMTczXVtqXV0gPSA0NDI4OCArIGo7IGRbNDQyODggKyBqXSA9IERbMTczXVtqXTt9XG5EWzE3NF0gPSBcIu+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/veWTpuWUp+WUh+WTveWUj+Wcg+WchOWfguWflOWfi+Wfg+WgieWkj+Wll+WlmOWlmuWokeWomOWonOWon+Wom+Wok+WnrOWooOWoo+WoqeWopeWojOWoieWtq+WxmOWusOWus+WutuWutOWuruWuteWuueWuuOWwhOWxkeWxleWxkOWzreWzveWzu+WzquWzqOWzsOWztuW0geWztOW3ruW4reW4q+W6q+W6reW6p+W8seW+kuW+keW+kOaBme+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/veaBo+aBpeaBkOaBleaBreaBqeaBr+aChOaCn+aCmuaCjeaClOaCjOaCheaCluaJh+aLs+aMiOaLv+aNjuaMvuaMr+aNleaNguaNhuaNj+aNieaMuuaNkOaMveaMquaMq+aMqOaNjeaNjOaViOaVieaWmeaXgeaXheaZguaZieaZj+aZg+aZkuaZjOaZheaZgeabuOaclOacleacl+agoeaguOahiOahhuahk+agueahguahlOagqeais+agl+ahjOahkeagveaftOahkOahgOagvOahg+agquahheagk+agmOahgeauiuauieaut+awo+awp+awqOawpuawpOazsOa1qua2lea2iOa2h+a1pua1uOa1t+a1mea2k++/vVwiLnNwbGl0KFwiXCIpO1xuZm9yKGogPSAwOyBqICE9IERbMTc0XS5sZW5ndGg7ICsraikgaWYoRFsxNzRdW2pdLmNoYXJDb2RlQXQoMCkgIT09IDB4RkZGRCkgeyBlW0RbMTc0XVtqXV0gPSA0NDU0NCArIGo7IGRbNDQ1NDQgKyBqXSA9IERbMTc0XVtqXTt9XG5EWzE3NV0gPSBcIu+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/vea1rOa2iea1rua1mua1tOa1qea2jOa2iua1uea2hea1pea2lOeDiueDmOeDpOeDmeeDiOeDj+eIueeJueeLvOeLueeLveeLuOeLt+eOhuePreeQieePruePoOePquePnueVlOeVneeVnOeVmueVmeeWvueXheeXh+eWsueWs+eWveeWvOeWueeXgueWuOeai+easOebiuebjeebjuecqeecn+ecoOecqOefqeegsOegp+eguOegneegtOegt++/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/veegpeegreegoOegn+egsuelleelkOeloOeln+elluelnuelneell+elmuenpOeno+enp+enn+enpuenqeenmOeqhOeqiOermeeshueskeeyiee0oee0l+e0i+e0iue0oOe0oue0lOe0kOe0lee0mue0nOe0jee0mee0m+e8uue9n+e+lOe/hee/geiAhuiAmOiAleiAmeiAl+iAveiAv+iDseiEguiDsOiEheiDreiDtOiEhuiDuOiDs+iEiOiDveiEiuiDvOiDr+iHreiHrOiIgOiIkOiIquiIq+iIqOiIrOiKu+iMq+iNkuiNlOiNiuiMuOiNkOiNieiMteiMtOiNj+iMsuiMueiMtuiMl+iNgOiMseiMqOiNg++/vVwiLnNwbGl0KFwiXCIpO1xuZm9yKGogPSAwOyBqICE9IERbMTc1XS5sZW5ndGg7ICsraikgaWYoRFsxNzVdW2pdLmNoYXJDb2RlQXQoMCkgIT09IDB4RkZGRCkgeyBlW0RbMTc1XVtqXV0gPSA0NDgwMCArIGo7IGRbNDQ4MDAgKyBqXSA9IERbMTc1XVtqXTt9XG5EWzE3Nl0gPSBcIu+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/veiZlOiaiuiaquiak+iapOiaqeiajOiao+ianOihsOiht+iigeiiguihveihueiomOiokOiojuiojOioleioiuiol+iok+ioluioj+iokeixiOixuuixueiyoeiyoui1t+i6rOi7kui7lOi7j+i+semAgemAhui/t+mAgOi/uui/tOmAg+i/vemAhei/uOmClemDoemDnemDoumFkumFjemFjOmHmOmHnemHl+mHnOmHmemWg+mZoumZo+mZoe+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/vemZm+mZnemZpOmZmOmZnumau+mjoummrOmqqOmrmOmspemssumsvOS5vuWBuuWBveWBnOWBh+WBg+WBjOWBmuWBieWBpeWBtuWBjuWBleWBteWBtOWBt+WBj+WAj+WBr+WBreWFnOWGleWHsOWJquWJr+WLkuWLmeWLmOWLleWMkOWMj+WMmeWMv+WNgOWMvuWPg+abvOWVhuWVquWVpuWVhOWVnuWVoeWVg+WViuWUseWVluWVj+WVleWUr+WVpOWUuOWUruWVnOWUrOWVo+WUs+WVgeWVl+WciOWci+WcieWfn+WgheWgiuWghuWfoOWfpOWfuuWgguWgteWft+WfueWkoOWlouWotuWpgeWpieWppuWpquWpgO+/vVwiLnNwbGl0KFwiXCIpO1xuZm9yKGogPSAwOyBqICE9IERbMTc2XS5sZW5ndGg7ICsraikgaWYoRFsxNzZdW2pdLmNoYXJDb2RlQXQoMCkgIT09IDB4RkZGRCkgeyBlW0RbMTc2XVtqXV0gPSA0NTA1NiArIGo7IGRbNDUwNTYgKyBqXSA9IERbMTc2XVtqXTt9XG5EWzE3N10gPSBcIu+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/veWovOWpouWpmuWphuWpiuWtsOWvh+WvheWvhOWvguWuv+WvhuWwieWwiOWwh+WxoOWxnOWxneW0h+W0huW0juW0m+W0luW0ouW0keW0qeW0lOW0meW0pOW0p+W0l+W3ouW4uOW4tuW4s+W4t+W6t+W6uOW6tuW6teW6vuW8teW8t+W9l+W9rOW9qeW9q+W+l+W+meW+nuW+mOW+oeW+oOW+nOaBv+aCo+aCieaCoOaCqOaDi+aCtOaDpuaCve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/veaDheaCu+aCteaDnOaCvOaDmOaDleaDhuaDn+aCuOaDmuaDh+aImuaIm+aJiOaOoOaOp+aNsuaOluaOouaOpeaNt+aNp+aOmOaOquaNseaOqeaOieaOg+aOm+aNq+aOqOaOhOaOiOaOmeaOoeaOrOaOkuaOj+aOgOaNu+aNqeaNqOaNuuaVneaVluaVkeaVmeaVl+WVn+aVj+aVmOaVleaVlOaWnOaWm+aWrOaXj+aXi+aXjOaXjuaZneaZmuaZpOaZqOaZpuaZnuabueWLl+acm+aigeair+aiouaik+aiteahv+ahtuaiseaip+ail+aisOaig+ajhOaireaihuaiheailOaineaiqOain+aioeaiguassuauuu+/vVwiLnNwbGl0KFwiXCIpO1xuZm9yKGogPSAwOyBqICE9IERbMTc3XS5sZW5ndGg7ICsraikgaWYoRFsxNzddW2pdLmNoYXJDb2RlQXQoMCkgIT09IDB4RkZGRCkgeyBlW0RbMTc3XVtqXV0gPSA0NTMxMiArIGo7IGRbNDUzMTIgKyBqXSA9IERbMTc3XVtqXTt9XG5EWzE3OF0gPSBcIu+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/veavq+avrOawq+a2jua2vOa3s+a3mea2sua3oea3jOa3pOa3u+a3uua4hea3h+a3i+a2r+a3kea2rua3nua3uea2uOa3t+a3tea3hea3kua4mua2tea3mua3q+a3mOa3qua3sea3rua3qOa3hua3hOa2qua3rOa2v+a3pueDueeEieeEiueDveeDr+eIveeJveeKgeeMnOeMm+eMlueMk+eMmeeOh+eQheeQiueQg+eQhuePvueQjeeToOeTtu+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/veeTt+eUnOeUoueVpeeVpueVoueVsOeWj+eXlOeXleeWteeXiueXjeeajueblOebkuebm+ect+ecvuecvOectuecuOecuuehq+ehg+ehjuelpeelqOelreenu+eqkueqleesoOesqOesm+esrOespuesmeesnuesrueykueyl+eylee1hue1g+e1see0rue0uee0vOe1gOe0sOe0s+e1hOe0r+e1gue0sue0see8vee+nue+mue/jOe/jue/kuiAnOiBiuiBhuiEr+iEluiEo+iEq+iEqeiEsOiEpOiIguiIteiIt+iItuiIueiOjuiOnuiOmOiNuOiOouiOluiOveiOq+iOkuiOiuiOk+iOieiOoOiNt+iNu+iNvO+/vVwiLnNwbGl0KFwiXCIpO1xuZm9yKGogPSAwOyBqICE9IERbMTc4XS5sZW5ndGg7ICsraikgaWYoRFsxNzhdW2pdLmNoYXJDb2RlQXQoMCkgIT09IDB4RkZGRCkgeyBlW0RbMTc4XVtqXV0gPSA0NTU2OCArIGo7IGRbNDU1NjggKyBqXSA9IERbMTc4XVtqXTt9XG5EWzE3OV0gPSBcIu+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/veiOhuiOp+iZleW9quibh+ibgOiatuibhOiateibhuibi+iaseiar+ibieihk+iinuiiiOiiq+iikuiiluiijeiii+imk+imj+ioquioneioo+iopeioseioreion+iom+ioouixieixmuiyqeiyrOiyq+iyqOiyquiyp+i1p+i1pui2vui2uui7m+i7n+mAmemAjemAmumAl+mAo+mAn+mAnemAkOmAlemAnumAoOmAj+mAoumAlumAm+mAlO+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/vemDqOmDremDvemFl+mHjumHtemHpumHo+mHp+mHremHqemWiemZqumZtemZs+mZuOmZsOmZtOmZtumZt+mZrOmbgOmbqumbqeeroOern+mggumgg+mtmumzpem5tem5v+m6pem6u+WCouWCjeWCheWCmeWCkeWCgOWCluWCmOWCmuacgOWHseWJsuWJtOWJteWJqeWLnuWLneWLm+WNmuWOpeWVu+WWgOWWp+WVvOWWiuWWneWWmOWWguWWnOWWquWWlOWWh+WWi+WWg+WWs+WWruWWn+WUvuWWsuWWmuWWu+WWrOWWseWVvuWWieWWq+WWmeWcjeWgr+WgquWgtOWgpOWgsOWgseWgoeWgneWgoOWjueWjuuWloO+/vVwiLnNwbGl0KFwiXCIpO1xuZm9yKGogPSAwOyBqICE9IERbMTc5XS5sZW5ndGg7ICsraikgaWYoRFsxNzldW2pdLmNoYXJDb2RlQXQoMCkgIT09IDB4RkZGRCkgeyBlW0RbMTc5XVtqXV0gPSA0NTgyNCArIGo7IGRbNDU4MjQgKyBqXSA9IERbMTc5XVtqXTt9XG5EWzE4MF0gPSBcIu+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/veWpt+WqmuWpv+WqkuWqm+Wqp+Wts+WtseWvkuWvjOWvk+WvkOWwiuWwi+WwseW1jOW1kOW0tOW1h+W3veW5heW4veW5gOW5g+W5vuW7iuW7geW7guW7hOW8vOW9reW+qeW+quW+qOaDkeaDoeaCsuaCtuaDoOaEnOaEo+aDuuaEleaDsOaDu+aDtOaFqOaDseaEjuaDtuaEieaEgOaEkuaIn+aJieaOo+aOjOaPj+aPgOaPqeaPieaPhuaPje+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/veaPkuaPo+aPkOaPoeaPluaPreaPruaNtuaPtOaPquaPm+aRkuaPmuaPueaVnuaVpuaVouaVo+aWkeaWkOaWr+aZruaZsOaZtOaZtuaZr+aakeaZuuaZvuaZt+abvuabv+acn+acneajuuajleajoOajmOajl+akheajn+ajteajruajp+ajueajkuajsuajo+aji+ajjeakjeakkuakjuajieajmualruaju+asvuasuuasveaumOauluauvOavr+awruawr+awrOa4r+a4uOa5lOa4oea4sua5p+a5iua4oOa4pea4o+a4m+a5m+a5mOa4pOa5lua5rua4rea4pua5r+a4tOa5jea4uua4rOa5g+a4nea4vua7i++/vVwiLnNwbGl0KFwiXCIpO1xuZm9yKGogPSAwOyBqICE9IERbMTgwXS5sZW5ndGg7ICsraikgaWYoRFsxODBdW2pdLmNoYXJDb2RlQXQoMCkgIT09IDB4RkZGRCkgeyBlW0RbMTgwXVtqXV0gPSA0NjA4MCArIGo7IGRbNDYwODAgKyBqXSA9IERbMTgwXVtqXTt9XG5EWzE4MV0gPSBcIu+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/vea6iea4mea5jua5o+a5hOa5sua5qea5n+eEmeeEmueEpueEsOeEoeeEtueFrueEnOeJjOeKhOeKgOeMtueMpeeMtOeMqeeQuueQqueQs+eQoueQpeeQteeQtueQtOeQr+eQm+eQpueQqOeUpeeUpueVq+eVqueXoueXm+eXo+eXmeeXmOeXnueXoOeZu+eZvOealueak+eatOebnOedj+efreehneehrOehr+eojeeoiOeoi+eoheeogOeqmO+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/veeql+eqluerpeero+etieetluethuetkOetkuetlOetjeeti+etj+etkeeyn+eypee1nue1kOe1qOe1lee0q+e1rue1sue1oee1pue1oue1sOe1s+WWhOe/lOe/leiAi+iBkuiCheiFleiFlOiFi+iFkeiFjuiEueiFhuiEvuiFjOiFk+iFtOiIkuiInOiPqeiQg+iPuOiQjeiPoOiPheiQi+iPgeiPr+iPseiPtOiRl+iQiuiPsOiQjOiPjOiPveiPsuiPiuiQuOiQjuiQhOiPnOiQh+iPlOiPn+iZm+ibn+ibmeibreiblOibm+ibpOibkOibnuihl+ijgeijguiiseimg+imluiou+ipoOipleipnuiovOipge+/vVwiLnNwbGl0KFwiXCIpO1xuZm9yKGogPSAwOyBqICE9IERbMTgxXS5sZW5ndGg7ICsraikgaWYoRFsxODFdW2pdLmNoYXJDb2RlQXQoMCkgIT09IDB4RkZGRCkgeyBlW0RbMTgxXVtqXV0gPSA0NjMzNiArIGo7IGRbNDYzMzYgKyBqXSA9IERbMTgxXVtqXTt9XG5EWzE4Ml0gPSBcIu+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/veiplOipm+ipkOiphuiotOiouuiotuipluixoeiyguiyr+iyvOiys+iyveizgeiyu+izgOiytOiyt+iytuiyv+iyuOi2iui2hei2gei3jui3nei3i+i3mui3kei3jOi3m+i3hui7u+i7uOi7vOi+nOmArumAtemAsemAuOmAsumAtumEgumDtemEiemDvumFo+mFpemHj+mIlOmIlemIo+mIiemInumIjemIkOmIh+mIkemWlOmWj+mWi+mWke+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/vemWk+mWkumWjumaiumajumai+mZvemahemahumajemZsumahOmbgembhembhOmbhumbh+mbr+mbsumfjOmghemghumgiOmjp+mjqumjr+mjqemjsumjremmrummrem7g+m7jem7keS6guWCreWCteWCsuWCs+WDheWCvuWCrOWCt+WCu+WCr+WDh+WJv+WJt+WJveWLn+WLpuWLpOWLouWLo+WMr+WXn+WXqOWXk+WXpuWXjuWXnOWXh+WXkeWXo+WXpOWXr+WXmuWXoeWXheWXhuWXpeWXieWckuWck+WhnuWhkeWhmOWhl+WhmuWhlOWhq+WhjOWhreWhiuWhouWhkuWhi+Wlp+WrgeWrieWrjOWqvuWqveWqvO+/vVwiLnNwbGl0KFwiXCIpO1xuZm9yKGogPSAwOyBqICE9IERbMTgyXS5sZW5ndGg7ICsraikgaWYoRFsxODJdW2pdLmNoYXJDb2RlQXQoMCkgIT09IDB4RkZGRCkgeyBlW0RbMTgyXVtqXV0gPSA0NjU5MiArIGo7IGRbNDY1OTIgKyBqXSA9IERbMTgyXVtqXTt9XG5EWzE4M10gPSBcIu+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/veWqs+WrguWqsuW1qeW1r+W5jOW5ueW7ieW7iOW8kuW9meW+rOW+ruaEmuaEj+aFiOaEn+aDs+aEm+aDueaEgeaEiOaFjuaFjOaFhOaFjeaEvuaEtOaEp+aEjeaEhuaEt+aIoeaIouaQk+aQvuaQnuaQquaQreaQveaQrOaQj+aQnOaQlOaQjeaQtuaQluaQl+aQhuaVrOaWn+aWsOaal+aaieaah+aaiOaaluaahOaamOaajeacg+amlOalre+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/vealmualt+aloOallOalteaksOamgualiualqOalq+alnualk+alueamhualnealo+alm+ath+atsuavgOauv+avk+avvea6oua6r+a7k+a6tua7gua6kOa6nea7h+a7hea6pea6mOa6vOa6uua6q+a7kea6lua6nOa7hOa7lOa6qua6p+a6tOeFjueFmeeFqeeFpOeFieeFp+eFnOeFrOeFpueFjOeFpeeFnueFhueFqOeFlueIuueJkueMt+eNheeMv+eMvueRr+eRmueRleeRn+eRnueRgeeQv+eRmeeRm+eRnOeVtueVuOeYgOeXsOeYgeeXsueXseeXuueXv+eXtOeXs+ebnuebn+edm+edq+edpuednuedo++/vVwiLnNwbGl0KFwiXCIpO1xuZm9yKGogPSAwOyBqICE9IERbMTgzXS5sZW5ndGg7ICsraikgaWYoRFsxODNdW2pdLmNoYXJDb2RlQXQoMCkgIT09IDB4RkZGRCkgeyBlW0RbMTgzXVtqXV0gPSA0Njg0OCArIGo7IGRbNDY4NDggKyBqXSA9IERbMTgzXVtqXTt9XG5EWzE4NF0gPSBcIu+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/veedueedquedrOednOedpeedqOedouefrueijueisOeil+eimOeijOeiieehvOeikeeik+ehv+eluuelv+emgeiQrOemveeonOeomueooOeolOeon+eonueqn+eqoOett+evgOetoOetruetp+eyseeys+eytee2k+e1uee2kee2gee2j+e1m+e9rue9qee9que9sue+qee+qOe+pOiBluiBmOiChuiChOiFseiFsOiFuOiFpeiFruiFs+iFq++/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/veiFueiFuuiFpuiIheiJh+iSguiRt+iQveiQseiRteiRpuiRq+iRieiRrOiRm+iQvOiQteiRoeiRo+iRqeiRreiRhuiZnuiZnOiZn+ibueick+iciOich+icgOibvuibu+icguicg+ichuiciuihmeijn+ijlOijmeijnOijmOijneijoeijiuijleijkuimnOino+ipq+ipsuips+ippuipqeipsOiqh+ipvOipo+iqoOipseiqheipreipouipruiprOipueipu+iovuipqOixouiyiuiyieiziuizh+iziOizhOiysuizg+izguizhei3oei3n+i3qOi3r+i3s+i3uui3qui3pOi3pui6sui8g+i8iei7vui8iu+/vVwiLnNwbGl0KFwiXCIpO1xuZm9yKGogPSAwOyBqICE9IERbMTg0XS5sZW5ndGg7ICsraikgaWYoRFsxODRdW2pdLmNoYXJDb2RlQXQoMCkgIT09IDB4RkZGRCkgeyBlW0RbMTg0XVtqXV0gPSA0NzEwNCArIGo7IGRbNDcxMDQgKyBqXSA9IERbMTg0XVtqXTt9XG5EWzE4NV0gPSBcIu+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/vei+n+i+sumBi+mBiumBk+mBgumBlOmAvOmBlemBkOmBh+mBj+mBjumBjemBkemAvumBgemEkumEl+mFrOmFqumFqemHiemIt+mJl+mIuOmIvemJgOmIvumJm+mJi+mJpOmJkemItOmJiemJjemJhemIuemIv+mJmumWmOmamOmalOmalembjembi+mbiembiumbt+mbu+mbuembtumdlumdtOmdtumgkOmgkemgk+mgiumgkumgjOmjvOmjtO+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/vemjvemjvumms+mmsemmtOmroemzqem6gum8jum8k+m8oOWDp+WDruWDpeWDluWDreWDmuWDleWDj+WDkeWDseWDjuWDqeWFouWHs+WKg+WKguWMseWOreWXvuWYgOWYm+WYl+WXveWYlOWYhuWYieWYjeWYjuWXt+WYluWYn+WYiOWYkOWXtuWcmOWcluWhteWhvuWig+Wik+WiiuWhueWiheWhveWjveWkpeWkouWkpOWlquWlqeWroeWrpuWrqeWrl+WrluWrmOWro+WtteWvnuWvp+WvoeWvpeWvpuWvqOWvouWvpOWvn+WwjeWxouW2hOW2h+W5m+W5o+W5leW5l+W5lOW7k+W7luW8iuW9huW9sOW+ueaFh++/vVwiLnNwbGl0KFwiXCIpO1xuZm9yKGogPSAwOyBqICE9IERbMTg1XS5sZW5ndGg7ICsraikgaWYoRFsxODVdW2pdLmNoYXJDb2RlQXQoMCkgIT09IDB4RkZGRCkgeyBlW0RbMTg1XVtqXV0gPSA0NzM2MCArIGo7IGRbNDczNjAgKyBqXSA9IERbMTg1XVtqXTt9XG5EWzE4Nl0gPSBcIu+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/veaEv+aFi+aFt+aFouaFo+aFn+aFmuaFmOaFteaIquaSh+aRmOaRlOaSpOaRuOaRn+aRuuaRkeaRp+aQtOaRreaRu+aVsuaWoeaXl+aXluaaouaaqOaaneamnOamqOamleangeamruank+ani+amm+amt+amu+amq+amtOankOanjeamreanjOampuang+amo+atieatjOaws+a8s+a8lOa7vua8k+a7tOa8qea8vua8oOa8rOa8j+a8gua8ou+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/vea7v+a7r+a8hua8sea8uOa8sua8o+a8lea8q+a8r+a+iOa8qua7rOa8gea7sua7jOa7t+eGlOeGmeeFveeGiueGhOeGkueIvueKkueKlueNhOeNkOeRpOeRo+eRqueRsOeRreeUhOeWkeeYp+eYjeeYi+eYieeYk+eboeebo+eehOedveedv+edoeejgeein+eip+eis+eiqeeio+emjuemj+emjeeorueoseeqqueqqeerreerr+euoeeuleeui+etteeul+euneeulOeuj+euuOeuh+euhOeyueeyveeyvue2u+e2sOe2nOe2vee2vue2oOe3iue2tOe2sue2see2uue2oue2v+e2tee2uOe2ree3kue3h+e2rO+/vVwiLnNwbGl0KFwiXCIpO1xuZm9yKGogPSAwOyBqICE9IERbMTg2XS5sZW5ndGg7ICsraikgaWYoRFsxODZdW2pdLmNoYXJDb2RlQXQoMCkgIT09IDB4RkZGRCkgeyBlW0RbMTg2XVtqXV0gPSA0NzYxNiArIGo7IGRbNDc2MTYgKyBqXSA9IERbMTg2XVtqXTt9XG5EWzE4N10gPSBcIu+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/vee9sOe/oOe/oee/n+iBnuiBmuiCh+iFkOiGgOiGj+iGiOiGiuiFv+iGguiHp+iHuuiIh+iIlOiInuiJi+iTieiSv+iThuiThOiSmeiSnuiSsuiSnOiTi+iSuOiTgOiTk+iSkOiSvOiTkeiTiuicv+icnOicu+icouicpeictOicmOidleict+icqeijs+ikguijtOijueijuOijveijqOikmuijr+iqpuiqjOiqnuiqo+iqjeiqoeiqk+iqpO+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/veiqquiqpeiqqOiqmOiqkeiqmuiqp+ixquiyjeiyjOizk+izkeizkui1q+i2mei2lei3vOi8lOi8kui8lei8k+i+o+mBoOmBmOmBnOmBo+mBmemBnumBoumBnemBm+mEmemEmOmEnumFtemFuOmFt+mFtOmJuOmKgOmKhemKmOmKlumJu+mKk+mKnOmKqOmJvOmKkemWoemWqOmWqemWo+mWpemWpOmamemanOmam+mbjOmbkumcgOmdvOmehemftumgl+mgmOmir+misemkg+mkhemkjOmkiemngemqr+mqsOmrpumtgemtgumztOmztumzs+m6vOm8u+m9iuWEhOWEgOWDu+WDteWDueWEguWEiOWEieWEheWHnO+/vVwiLnNwbGl0KFwiXCIpO1xuZm9yKGogPSAwOyBqICE9IERbMTg3XS5sZW5ndGg7ICsraikgaWYoRFsxODddW2pdLmNoYXJDb2RlQXQoMCkgIT09IDB4RkZGRCkgeyBlW0RbMTg3XVtqXV0gPSA0Nzg3MiArIGo7IGRbNDc4NzIgKyBqXSA9IERbMTg3XVtqXTt9XG5EWzE4OF0gPSBcIu+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/veWKh+WKiOWKieWKjeWKiuWLsOWOsuWYruWYu+WYueWYsuWYv+WYtOWYqeWZk+WZjuWZl+WZtOWYtuWYr+WYsOWigOWin+WinuWis+WinOWiruWiqeWipuWlreWsieWru+Wsi+WrteWsjOWsiOWvruWvrOWvqeWvq+WxpOWxpeW2neW2lOW5ouW5n+W5oeW7ouW7muW7n+W7neW7o+W7oOW9iOW9seW+t+W+teaFtuaFp+aFruaFneaFleaGgu+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/veaFvOaFsOaFq+aFvuaGp+aGkOaGq+aGjuaGrOaGmuaGpOaGlOaGruaIruaRqeaRr+aRueaSnuaSsuaSiOaSkOaSsOaSpeaSk+aSleaSqeaSkuaSruaSreaSq+aSmuaSrOaSmeaSouaSs+aVteaVt+aVuOaaruaaq+aatOaaseaoo+aon+anqOaogeaonuaomeanveaooeaok+aoiuans+aoguaoheanreaokeatkOatjuaupOavheavhua8v+a9vOa+hOa9kea9pua9lOa+hua9rea9m+a9uOa9rua+jua9uua9sOa9pOa+l+a9mOa7lea9r+a9oOa9n+eGn+eGrOeGseeGqOeJlueKm+eNjueNl+eRqeeSi+eSg++/vVwiLnNwbGl0KFwiXCIpO1xuZm9yKGogPSAwOyBqICE9IERbMTg4XS5sZW5ndGg7ICsraikgaWYoRFsxODhdW2pdLmNoYXJDb2RlQXQoMCkgIT09IDB4RkZGRCkgeyBlW0RbMTg4XVtqXV0gPSA0ODEyOCArIGo7IGRbNDgxMjggKyBqXSA9IERbMTg4XVtqXTt9XG5EWzE4OV0gPSBcIu+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/veeRvueSgOeVv+eYoOeYqeeYn+eYpOeYpueYoeeYoueamueauuebpOeejueeh+eejOeekeeei+eji+ejheeiuuejiueivuejleeivOejkOeov+eovOepgOeoveeot+eou+eqr+eqrueureeuseevhOeutOevhuevh+evgeeuoOevjOeziue3oOe3tOe3r+e3u+e3mOe3rOe3nee3qOe3o+e3mue3nue3qee2nue3mee3sue3uee9tee9t+e+r++/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/vee/qeiApuiGm+iGnOiGneiGoOiGmuiGmOiUl+iUveiUmuiTruiUrOiUreiUk+iUkeiUo+iUoeiUlOiTrOiUpeiTv+iUhuieguidtOidtuidoOidpuiduOidqOidmeidl+idjOidk+ihm+ihneikkOikh+ikkuikk+ikleikiuiqvOirkuirh+irhOiqleiri+iruOiqsuirieirguiqv+iqsOirluirjeiqtuiqueirm+ixjOixjuixrOizoOiznuizpuizpOizrOizreizouizo+iznOizquizoei1rei2n+i2o+i4q+i4kOi4nei4oui4j+i4qei4n+i4oei4nui6uui8nei8m+i8n+i8qei8pui8qui8nOi8nu+/vVwiLnNwbGl0KFwiXCIpO1xuZm9yKGogPSAwOyBqICE9IERbMTg5XS5sZW5ndGg7ICsraikgaWYoRFsxODldW2pdLmNoYXJDb2RlQXQoMCkgIT09IDB4RkZGRCkgeyBlW0RbMTg5XVtqXV0gPSA0ODM4NCArIGo7IGRbNDgzODQgKyBqXSA9IERbMTg5XVtqXTt9XG5EWzE5MF0gPSBcIu+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/vei8pemBqemBrumBqOmBremBt+mEsOmEremEp+mEsemGh+mGiemGi+mGg+mLhemKu+mKt+mLqumKrOmLpOmLgemKs+mKvOmLkumLh+mLsOmKsumWremWsemchOmchumch+mciemdoOmejemei+mej+mgoemgq+mgnOmis+mkiumkk+mkkumkmOmnnemnkOmnn+mnm+mnkemnlemnkumnmemqt+mrrumrr+msp+mthemthOmtt+mtr+m0hum0ie+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/vem0g+m6qem6vum7juWiqOm9kuWEkuWEmOWElOWEkOWEleWGgOWGquWHneWKkeWKk+WLs+WZmeWZq+WZueWZqeWZpOWZuOWZquWZqOWZpeWZseWZr+WZrOWZouWZtuWjgeWivuWjh+WjheWlruWsneWstOWtuOWvsOWwjuW9iuaGsuaGkeaGqeaGiuaHjeaGtuaGvuaHiuaHiOaIsOaTheaTgeaTi+aSu+aSvOaTmuaThOaTh+aTguaTjeaSv+aTkuaTlOaSvuaVtOabhuabieaaueabhOabh+aauOaoveaouOaouuapmeapq+apmOaoueaphOapouapoeapi+aph+aoteapn+apiOatmeatt+awhea/gua+sea+oe+/vVwiLnNwbGl0KFwiXCIpO1xuZm9yKGogPSAwOyBqICE9IERbMTkwXS5sZW5ndGg7ICsraikgaWYoRFsxOTBdW2pdLmNoYXJDb2RlQXQoMCkgIT09IDB4RkZGRCkgeyBlW0RbMTkwXVtqXV0gPSA0ODY0MCArIGo7IGRbNDg2NDAgKyBqXSA9IERbMTkwXVtqXTt9XG5EWzE5MV0gPSBcIu+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/vea/g+a+pOa/gea+p+a+s+a/gOa+uea+tua+pua+oOa+tOeGvueHieeHkOeHkueHiOeHleeGueeHjueHmeeHnOeHg+eHhOeNqOeSnOeSo+eSmOeSn+eSnueToueUjOeUjeeYtOeYuOeYuuebp+ebpeeeoOeenueen+eepeejqOejmuejrOejp+empuepjeepjuephuepjOepi+equuevmeewkeevieevpOevm+evoeevqeevpuezleezlue4iu+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/vee4kee4iOe4m+e4o+e4nue4nee4iee4kOe9uee+sue/sOe/see/ruiAqOiGs+iGqeiGqOiHu+iIiOiJmOiJmeiViuiVmeiViOiVqOiVqeiVg+iVieiVreiVquiVnuieg+ien+ienuieouiejeihoeikquiksuikpeikq+ikoeimquimpuirpuiruuirq+irseisgOirnOirp+irruirvuisgeisguirt+irreirs+irtuirvOixq+ixreiyk+iztOi5hOi4sei4tOi5gui4uei4tei8u+i8r+i8uOi8s+i+qOi+pumBtemBtOmBuOmBsumBvOmBuumEtOmGkumMoOmMtumLuOmMs+mMr+mMoumLvOmMq+mMhOmMmu+/vVwiLnNwbGl0KFwiXCIpO1xuZm9yKGogPSAwOyBqICE9IERbMTkxXS5sZW5ndGg7ICsraikgaWYoRFsxOTFdW2pdLmNoYXJDb2RlQXQoMCkgIT09IDB4RkZGRCkgeyBlW0RbMTkxXVtqXV0gPSA0ODg5NiArIGo7IGRbNDg4OTYgKyBqXSA9IERbMTkxXVtqXTt9XG5EWzE5Ml0gPSBcIu+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/vemMkOmMpumMoemMlemMrumMmemWu+map+maqOmaqumblemcjumckemclumcjemck+mcj+mdm+mdnOmdpumemOmgsOmguOmgu+mgt+mgremguemgpOmkkOmkqOmknumkm+mkoemkmumnremnoumnsemquOmqvOmru+mrremsqOmukem0lem0o+m0pum0qOm0kum0m+m7mOm7lOm+jem+nOWEquWEn+WEoeWEsuWLteWajuWagOWakOWaheWah++/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/veWaj+WjleWjk+WjkeWjjuWssOWsquWspOWtuuWwt+WxqOW2vOW2uuW2veW2uOW5q+W9jOW+veaHieaHguaHh+aHpuaHi+aIsuaItOaTjuaTiuaTmOaToOaTsOaTpuaTrOaTseaTouaTreaWguaWg+abmeabluaqgOaqlOaqhOaqouaqnOarm+aqo+apvuaql+aqkOaqoOatnOauruavmuawiOa/mOa/sea/n+a/oOa/m+a/pOa/q+a/r+a+gOa/rOa/oea/qea/lea/rua/sOeHp+eHn+eHrueHpueHpeeHreeHrOeHtOeHoOeIteeJhueNsOeNsueSqeeSsOeSpueSqOeZhueZgueZjOebquees+eequeesOeerO+/vVwiLnNwbGl0KFwiXCIpO1xuZm9yKGogPSAwOyBqICE9IERbMTkyXS5sZW5ndGg7ICsraikgaWYoRFsxOTJdW2pdLmNoYXJDb2RlQXQoMCkgIT09IDB4RkZGRCkgeyBlW0RbMTkyXVtqXV0gPSA0OTE1MiArIGo7IGRbNDkxNTIgKyBqXSA9IERbMTkyXVtqXTt9XG5EWzE5M10gPSBcIu+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/veeep+eereefr+ejt+ejuuejtOejr+ekgeemp+emquepl+eqv+ewh+ewjeevvuevt+ewjOevoOezoOeznOeznuezouezn+ezmeeznee4rue4vue5hue4t+e4sue5g+e4q+e4vee4see5hee5gee4tOe4uee5iOe4tee4v+e4r+e9hOe/s+e/vOiBseiBsuiBsOiBr+iBs+iHhuiHg+iGuuiHguiHgOiGv+iGveiHieiGvuiHqOiIieiJseiWqu+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/veiWhOiVvuiWnOiWkeiWlOiWr+iWm+iWh+iWqOiWiuiZp+ifgOifkeies+ifkuifhuieq+ieu+ieuuifiOifi+iku+iktuilhOikuOikveimrOisjuisl+ismeism+isiuisoOisneishOiskOixgeiwv+ixs+izuuizveizvOizuOizu+i2qOi5iei5i+i5iOi5iui9hOi8vui9gui9hei8v+mBv+mBvemChOmCgemCgumCgOmEuemGo+mGnumGnOmNjemOgumMqOmNtemNiumNpemNi+mMmOmNvumNrOmNm+mNsOmNmumNlOmXiumXi+mXjOmXiOmXhumasemauOmblumcnOmcnumeoOmfk+mhhumitumktemoge+/vVwiLnNwbGl0KFwiXCIpO1xuZm9yKGogPSAwOyBqICE9IERbMTkzXS5sZW5ndGg7ICsraikgaWYoRFsxOTNdW2pdLmNoYXJDb2RlQXQoMCkgIT09IDB4RkZGRCkgeyBlW0RbMTkzXVtqXV0gPSA0OTQwOCArIGo7IGRbNDk0MDggKyBqXSA9IERbMTkzXVtqXTt9XG5EWzE5NF0gPSBcIu+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/vemnv+murumuq+muqumurem0u+m0v+m6i+m7j+m7num7nOm7nem7m+m8vum9i+WPouWaleWaruWjmeWjmOWsuOW9neaHo+aIs+aTtOaTsuaTvuaUhuaTuuaTu+aTt+aWt+abnOacpuaqs+aqrOarg+aqu+aquOarguaqruaqr+atn+atuOaur+eAieeAi+a/vueAhua/uueAkeeAj+eHu+eHvOeHvueHuOeNt+eNteeSp+eSv+eUleeZlueZmO+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/veeZkueeveeev+eeu+eevOekjuemruepoeepouepoOerhOerheewq+ewp+ewquewnuewo+ewoeezp+e5lOe5lee5nue5mue5oee5kue5mee9iOe/uee/u+iBt+iBtuiHjeiHj+iIiuiXj+iWqeiXjeiXkOiXieiWsOiWuuiWueiWpuifr+ifrOifsuifoOimhuimsuintOisqOisueisrOisq+ixkOi0hei5mei5o+i5pui5pOi5n+i5lei7gOi9iei9jemCh+mCg+mCiOmGq+mGrOmHkOmOlOmOiumOlumOoumOs+mOrumOrOmOsOmOmOmOmumOl+mXlOmXlumXkOmXlemboumbnOmbmembm+mbnumcpOmeo+mepu+/vVwiLnNwbGl0KFwiXCIpO1xuZm9yKGogPSAwOyBqICE9IERbMTk0XS5sZW5ndGg7ICsraikgaWYoRFsxOTRdW2pdLmNoYXJDb2RlQXQoMCkgIT09IDB4RkZGRCkgeyBlW0RbMTk0XVtqXV0gPSA0OTY2NCArIGo7IGRbNDk2NjQgKyBqXSA9IERbMTk0XVtqXTt9XG5EWzE5NV0gPSBcIu+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/vemeremfuemhjemhj+mhjOmhjumhk+miuumkvumkv+mkvemkrummpemojumrgemsg+mshumtj+mtjumtjemviumviemvvemviOmvgOm1kem1nem1oOm7oOm8lem8rOWEs+WapeWjnuWjn+WjouWvtem+kOW7rOaHsuaHt+aHtuaHteaUgOaUj+aboOabnearpearnearmuark+eAm+eAn+eAqOeAmueAneeAleeAmOeIhueIjeeJmOeKoueNuO+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/veeNuueSveeTiueTo+eWh+eWhueZn+eZoeefh+ekmeemseepq+epqeewvuewv+ewuOewveewt+exgOe5q+e5ree5uee5qee5que+hee5s+e+tue+uee+uOiHmOiXqeiXneiXquiXleiXpOiXpeiXt+ifu+igheigjeifueifvuiloOiln+illuilnuitgeitnOitmOitieitmuitjuitj+ithuitmei0iOi0iui5vOi5sui6h+i5tui5rOi5uui5tOi9lOi9jui+remCiumCi+mGsemGrumPoemPkemPn+mPg+mPiOmPnOmPnemPlumPoumPjemPmOmPpOmPl+mPqOmXnOmatOmbo+mcqumcp+mdoemfnOmfu+mhnu+/vVwiLnNwbGl0KFwiXCIpO1xuZm9yKGogPSAwOyBqICE9IERbMTk1XS5sZW5ndGg7ICsraikgaWYoRFsxOTVdW2pdLmNoYXJDb2RlQXQoMCkgIT09IDB4RkZGRCkgeyBlW0RbMTk1XVtqXV0gPSA0OTkyMCArIGo7IGRbNDk5MjAgKyBqXSA9IERbMTk1XVtqXTt9XG5EWzE5Nl0gPSBcIu+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/vemhmOmhm+mivOmlhemliemolumomemsjemvqOmvp+mvlumvm+m2iem1oem1sum1qum1rOm6kum6l+m6k+m6tOWLuOWaqOWat+WatuWatOWavOWjpOWtgOWtg+WtveWvtuW3ieaHuOaHuuaUmOaUlOaUmeabpuacp+arrOeAvueAsOeAsueIkOeNu+eTj+eZoueZpeekpuekquekrOekq+erh+ertuexjOexg+exjeezr+ezsOi+rue5vee5vO+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/vee6gue9jOiAgOiHmuiJpuiXu+iXueiYkeiXuuiYhuiYi+iYh+iYiuiglOigleilpOimuuinuOitsOitrOitpuitr+itn+itq+i0j+i0jei6iei6gei6hei6gumGtOmHi+mQmOmQg+mPvemXoemcsOmjhOmlkumlkemmqOmoq+mosOmot+motemwk+mwjem5uem6tem7qOm8r+m9n+m9o+m9oeWEt+WEuOWbgeWbgOWbguWklOWxrOW3jeaHvOaHvuaUneaUnOaWleabqearu+ashOaruuausueBjOeIm+eKp+eTlueTlOeZqeefk+exkOe6j+e6jOe+vOiYl+iYreiYmuigo+igouigoeign+ilquilrOimveittO+/vVwiLnNwbGl0KFwiXCIpO1xuZm9yKGogPSAwOyBqICE9IERbMTk2XS5sZW5ndGg7ICsraikgaWYoRFsxOTZdW2pdLmNoYXJDb2RlQXQoMCkgIT09IDB4RkZGRCkgeyBlW0RbMTk2XVtqXV0gPSA1MDE3NiArIGo7IGRbNTAxNzYgKyBqXSA9IERbMTk2XVtqXTt9XG5EWzE5N10gPSBcIu+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/veitt+itvei0k+i6iui6jei6i+i9n+i+r+mGuumQrumQs+mQtemQuumQuOmQsumQq+mXoumcuOmcuemcsumfv+mhp+mhpemll+mphempg+mpgOmovumrj+mtlOmtkemwremwpem2r+m2tOm3gum2uOm6nem7r+m8mem9nOm9pum9p+WEvOWEu+WbiOWbiuWbieWtv+W3lOW3kuW9juaHv+aUpOasiuatoeeBkeeBmOeOgOeTpOeWiueZrueZrO+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/veems+exoOexn+iBvuiBveiHn+ilsuilr+invOiugOi0lui0l+i6kei6k+i9oemFiOmRhOmRkemRkumcvemcvumfg+mfgemhq+mllemplempjemrkumsmumxiemwsemwvumwu+m3k+m3l+m8tOm9rOm9qum+lOWbjOW3luaIgOaUo+aUq+aUquabrOaskOeTmueriuexpOexo+expee6k+e6lue6lOiHouiYuOiYv+igseiuiumCkOmCj+mRo+mRoOmRpOmdqOmhr+mlnOmpmumpm+mpl+mrk+mrlOmrkemxlOmxl+mxlum3pem6n+m7tOWbkeWjqeaUrOeBnueZseeZsuefl+e9kOe+iOigtuigueihouiuk+iuku+/vVwiLnNwbGl0KFwiXCIpO1xuZm9yKGogPSAwOyBqICE9IERbMTk3XS5sZW5ndGg7ICsraikgaWYoRFsxOTddW2pdLmNoYXJDb2RlQXQoMCkgIT09IDB4RkZGRCkgeyBlW0RbMTk3XVtqXV0gPSA1MDQzMiArIGo7IGRbNTA0MzIgKyBqXSA9IERbMTk3XVtqXTt9XG5EWzE5OF0gPSBcIu+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/veiuluiJt+i0m+mHgOmRqumdgumdiOmdhOmfhumhsOmpn+msoumtmOmxn+m3uem3uum5vOm5vem8h+m9t+m9suW7s+aslueBo+exrOexruigu+ingOi6oemHgemRsumRsOmhsemlnumrlumso+m7jOeBpOefmuiumumRt+mfiempoumppee6nOiunOi6qumHhemRvemRvumRvOmxt+mxuOm7t+ixlOmRv+m4mueIqOmpqumssem4m+m4nuexsu+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/vVwiLnNwbGl0KFwiXCIpO1xuZm9yKGogPSAwOyBqICE9IERbMTk4XS5sZW5ndGg7ICsraikgaWYoRFsxOThdW2pdLmNoYXJDb2RlQXQoMCkgIT09IDB4RkZGRCkgeyBlW0RbMTk4XVtqXV0gPSA1MDY4OCArIGo7IGRbNTA2ODggKyBqXSA9IERbMTk4XVtqXTt9XG5EWzIwMV0gPSBcIu+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/veS5guS5nOWHteWMmuWOguS4h+S4jOS5h+S6jeWbl++ojOWxruW9s+S4j+WGh+S4juS4ruS6k+S7guS7ieS7iOWGmOWLvOWNrOWOueWcoOWkg+WkrOWwkOW3v+aXoeaus+avjOawlOeIv+S4seS4vOS7qOS7nOS7qeS7oeS7neS7muWIjOWMnOWNjOWcouWco+Wkl+Wkr+WugeWuhOWwkuWwu+WxtOWxs+W4hOW6gOW6guW/ieaIieaJkOawle+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/veawtuaxg+awv+awu+eKrueKsOeOiuemuOiCiumYnuS8juS8mOS8rOS7teS8lOS7seS8gOS7t+S8iOS8neS8guS8heS8ouS8k+S8hOS7tOS8kuWGseWIk+WIieWIkOWKpuWMouWMn+WNjeWOiuWQh+WboeWbn+WcruWcquWctOWkvOWmgOWlvOWmheWlu+WlvuWlt+Wlv+WtluWwleWwpeWxvOWxuuWxu+WxvuW3n+W5teW6hOW8guW8muW9tOW/leW/lOW/j+aJnOaJnuaJpOaJoeaJpuaJouaJmeaJoOaJmuaJpeaXr+aXruacvuacueacuOacu+acuuacv+acvOacs+awmOaxhuaxkuaxnOaxj+axiuaxlOaxi++/vVwiLnNwbGl0KFwiXCIpO1xuZm9yKGogPSAwOyBqICE9IERbMjAxXS5sZW5ndGg7ICsraikgaWYoRFsyMDFdW2pdLmNoYXJDb2RlQXQoMCkgIT09IDB4RkZGRCkgeyBlW0RbMjAxXVtqXV0gPSA1MTQ1NiArIGo7IGRbNTE0NTYgKyBqXSA9IERbMjAxXVtqXTt9XG5EWzIwMl0gPSBcIu+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/veaxjOeBseeJnueKtOeKteeOjueUqueZv+eptee9keiJuOiJvOiKgOiJveiJv+iZjeilvumCmemCl+mCmOmCm+mClOmYoumYpOmYoOmYo+S9luS8u+S9ouS9ieS9k+S9pOS8vuS9p+S9kuS9n+S9geS9mOS8reS8s+S8v+S9oeWGj+WGueWInOWInuWIoeWKreWKruWMieWNo+WNsuWOjuWOj+WQsOWQt+WQquWRlOWRheWQmeWQnOWQpeWQmO+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/veWQveWRj+WRgeWQqOWQpOWRh+WbruWbp+WbpeWdgeWdheWdjOWdieWdi+WdkuWkhuWlgOWmpuWmmOWmoOWml+WmjuWmouWmkOWmj+Wmp+WmoeWujuWukuWwqOWwquWyjeWyj+WyiOWyi+WyieWykuWyiuWyhuWyk+WyleW3oOW4iuW4juW6i+W6ieW6jOW6iOW6jeW8heW8neW9uOW9tuW/kuW/keW/kOW/reW/qOW/ruW/s+W/oeW/pOW/o+W/uuW/r+W/t+W/u+aAgOW/tOaIuuaKg+aKjOaKjuaKj+aKlOaKh+aJseaJu+aJuuaJsOaKgeaKiOaJt+aJveaJsuaJtOaUt+aXsOaXtOaXs+aXsuaXteadheadh++/vVwiLnNwbGl0KFwiXCIpO1xuZm9yKGogPSAwOyBqICE9IERbMjAyXS5sZW5ndGg7ICsraikgaWYoRFsyMDJdW2pdLmNoYXJDb2RlQXQoMCkgIT09IDB4RkZGRCkgeyBlW0RbMjAyXVtqXV0gPSA1MTcxMiArIGo7IGRbNTE3MTIgKyBqXSA9IERbMjAyXVtqXTt9XG5EWzIwM10gPSBcIu+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/veadmeadleadjOadiOadneadjeadmuadi+avkOawmeawmuaxuOaxp+axq+ayhOayi+ayj+axseaxr+axqeaymuaxreayh+ayleaynOaxpuaxs+axpeaxu+ayjueBtOeBuueJo+eKv+eKveeLg+eLhueLgeeKuueLheeOleeOl+eOk+eOlOeOkueUuueUueeWlOeWleeageekveiAtOiCleiCmeiCkOiCkuiCnOiKkOiKj+iKheiKjuiKkeiKk++/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/veiKiuiKg+iKhOixuOi/iei+v+mCn+mCoemCpemCnumCp+mCoOmYsOmYqOmYr+mYreS4s+S+mOS9vOS+heS9veS+gOS+h+S9tuS9tOS+ieS+hOS9t+S9jOS+l+S9quS+muS9ueS+geS9uOS+kOS+nOS+lOS+nuS+kuS+guS+leS9q+S9ruWGnuWGvOWGvuWIteWIsuWIs+WJhuWIseWKvOWMiuWMi+WMvOWOkuWOlOWSh+WRv+WSgeWSkeWSguWSiOWRq+WRuuWRvuWRpeWRrOWRtOWRpuWSjeWRr+WRoeWRoOWSmOWRo+WRp+WRpOWbt+WbueWdr+WdsuWdreWdq+WdseWdsOWdtuWegOWdteWdu+Wds+WdtOWdou+/vVwiLnNwbGl0KFwiXCIpO1xuZm9yKGogPSAwOyBqICE9IERbMjAzXS5sZW5ndGg7ICsraikgaWYoRFsyMDNdW2pdLmNoYXJDb2RlQXQoMCkgIT09IDB4RkZGRCkgeyBlW0RbMjAzXVtqXV0gPSA1MTk2OCArIGo7IGRbNTE5NjggKyBqXSA9IERbMjAzXVtqXTt9XG5EWzIwNF0gPSBcIu+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/veWdqOWdveWkjOWlheWmteWmuuWnj+WnjuWmsuWnjOWngeWmtuWmvOWng+WnluWmseWmveWngOWniOWmtOWnh+WtouWtpeWuk+WuleWxhOWxh+WyruWypOWyoOWyteWyr+WyqOWyrOWyn+Wyo+WyreWyouWyquWyp+WyneWypeWytuWysOWypuW4l+W4lOW4meW8qOW8ouW8o+W8pOW9lOW+guW9vuW9veW/nuW/peaAreaApuaAmeaAsuaAi++/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/veaAtOaAiuaAl+aAs+aAmuaAnuaArOaAouaAjeaAkOaAruaAk+aAkeaAjOaAieaAnOaIlOaIveaKreaKtOaLkeaKvuaKquaKtuaLiuaKruaKs+aKr+aKu+aKqeaKsOaKuOaUveaWqOaWu+aYieaXvOaYhOaYkuaYiOaXu+aYg+aYi+aYjeaYheaXveaYkeaYkOabtuaciuaeheadrOaejuaekuadtuadu+aemOaehuaehOadtOaejeaejOaduuaen+aekeaemeaeg+adveaegeaduOadueaelOaspeaugOatvuavnuawneayk+azrOazq+azruazmeaytuazlOayreazp+ayt+azkOazguayuuazg+azhuazreazsu+/vVwiLnNwbGl0KFwiXCIpO1xuZm9yKGogPSAwOyBqICE9IERbMjA0XS5sZW5ndGg7ICsraikgaWYoRFsyMDRdW2pdLmNoYXJDb2RlQXQoMCkgIT09IDB4RkZGRCkgeyBlW0RbMjA0XVtqXV0gPSA1MjIyNCArIGo7IGRbNTIyMjQgKyBqXSA9IERbMjA0XVtqXTt9XG5EWzIwNV0gPSBcIu+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/veazkuazneaytOayiuayneaygOaznuazgOa0sOazjeazh+aysOazueazj+azqeazkeeClOeCmOeCheeCk+eChueChOeCkeeClueCgueCmueCg+eJqueLlueLi+eLmOeLieeLnOeLkueLlOeLmueLjOeLkeeOpOeOoeeOreeOpueOoueOoOeOrOeOneeTneeTqOeUv+eVgOeUvueWjOeWmOear+ebs+ebseebsOebteefuOefvOefueefu+efuu+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/veeft+elguekv+enheepuOepu+eru+exteezveiAteiCj+iCruiCo+iCuOiCteiCreiIoOiKoOiLgOiKq+iKmuiKmOiKm+iKteiKp+iKruiKvOiKnuiKuuiKtOiKqOiKoeiKqeiLguiKpOiLg+iKtuiKouiZsOiZr+iZreiZruixlui/kui/i+i/k+i/jei/lui/lei/l+mCsumCtOmCr+mCs+mCsOmYuemYvemYvOmYuumZg+S/jeS/heS/k+S+suS/ieS/i+S/geS/lOS/nOS/meS+u+S+s+S/m+S/h+S/luS+uuS/gOS+ueS/rOWJhOWJieWLgOWLguWMveWNvOWOl+WOluWOmeWOmOWSuuWSoeWSreWSpeWTj++/vVwiLnNwbGl0KFwiXCIpO1xuZm9yKGogPSAwOyBqICE9IERbMjA1XS5sZW5ndGg7ICsraikgaWYoRFsyMDVdW2pdLmNoYXJDb2RlQXQoMCkgIT09IDB4RkZGRCkgeyBlW0RbMjA1XVtqXV0gPSA1MjQ4MCArIGo7IGRbNTI0ODAgKyBqXSA9IERbMjA1XVtqXTt9XG5EWzIwNl0gPSBcIu+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/veWTg+iMjeWSt+WSruWTluWStuWTheWThuWSoOWRsOWSvOWSouWSvuWRsuWTnuWSsOWeteWenuWen+WepOWejOWel+WeneWem+WelOWemOWej+WemeWepeWemuWeleWjtOWkjeWlk+WnoeWnnuWnruWogOWnseWnneWnuuWnveWnvOWntuWnpOWnsuWnt+Wnm+WnqeWns+WnteWnoOWnvuWntOWnreWuqOWxjOWzkOWzmOWzjOWzl+Wzi+Wzm++/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/veWznuWzmuWzieWzh+WziuWzluWzk+WzlOWzj+WziOWzhuWzjuWzn+WzuOW3ueW4oeW4ouW4o+W4oOW4pOW6sOW6pOW6ouW6m+W6o+W6peW8h+W8ruW9luW+huaAt+aAueaBlOaBsuaBnuaBheaBk+aBh+aBieaBm+aBjOaBgOaBguaBn+aApOaBhOaBmOaBpuaBruaJguaJg+aLj+aMjeaMi+aLteaMjuaMg+aLq+aLueaMj+aMjOaLuOaLtuaMgOaMk+aMlOaLuuaMleaLu+aLsOaVgeaVg+aWquaWv+aYtuaYoeaYsuaYteaYnOaYpuaYouaYs+aYq+aYuuaYneaYtOaYueaYruacj+ackOafgeafsuafiOaeuu+/vVwiLnNwbGl0KFwiXCIpO1xuZm9yKGogPSAwOyBqICE9IERbMjA2XS5sZW5ndGg7ICsraikgaWYoRFsyMDZdW2pdLmNoYXJDb2RlQXQoMCkgIT09IDB4RkZGRCkgeyBlW0RbMjA2XVtqXV0gPSA1MjczNiArIGo7IGRbNTI3MzYgKyBqXSA9IERbMjA2XVtqXTt9XG5EWzIwN10gPSBcIu+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/veafnOaeu+afuOafmOafgOaet+afheafq+afpOafn+aeteafjeaes+aft+aftuafruafo+afguaeueafjuafp+afsOaesuafvOafhuafreafjOaeruafpuafm+afuuafieafiuafg+afquafi+asqOauguauhOautuavluavmOavoOawoOawoea0qOa0tOa0rea0n+a0vOa0v+a0kua0iuazmua0s+a0hOa0mea0uua0mua0kea0gOa0nea1gu+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/vea0gea0mOa0t+a0g+a0j+a1gOa0h+a0oOa0rOa0iOa0oua0iea0kOeCt+eCn+eCvueCseeCsOeCoeeCtOeCteeCqeeJgeeJieeJiueJrOeJsOeJs+eJrueLiueLpOeLqOeLq+eLn+eLqueLpueLo+eOheePjOePguePiOePheeOueeOtueOteeOtOePq+eOv+ePh+eOvuePg+ePhueOuOePi+eTrOeTrueUrueVh+eViOeWp+eWqueZueebhOeciOecg+echOecheeciuebt+ebu+ebuuefp+efqOeghuegkeegkuegheegkOegj+egjuegieegg+egk+eliueljOeli+elheelhOenleenjeenj+enluenjueqgO+/vVwiLnNwbGl0KFwiXCIpO1xuZm9yKGogPSAwOyBqICE9IERbMjA3XS5sZW5ndGg7ICsraikgaWYoRFsyMDddW2pdLmNoYXJDb2RlQXQoMCkgIT09IDB4RkZGRCkgeyBlW0RbMjA3XVtqXV0gPSA1Mjk5MiArIGo7IGRbNTI5OTIgKyBqXSA9IERbMjA3XVtqXTt9XG5EWzIwOF0gPSBcIu+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/veepvuerkeesgOesgeexuuexuOexueexv+eygOeygee0g+e0iOe0gee9mOe+kee+jee+vuiAh+iAjuiAj+iAlOiAt+iDmOiDh+iDoOiDkeiDiOiDguiDkOiDheiDo+iDmeiDnOiDiuiDleiDieiDj+iDl+iDpuiDjeiHv+iIoeiKlOiLmeiLvuiLueiMh+iLqOiMgOiLleiMuuiLq+iLluiLtOiLrOiLoeiLsuiLteiMjOiLu+iLtuiLsOiLqu+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/veiLpOiLoOiLuuiLs+iLreiZt+iZtOiZvOiZs+ihgeihjuihp+ihquihqeink+iohOioh+i1sui/o+i/oei/rui/oOmDsemCvemCv+mDlemDhemCvumDh+mDi+mDiOmHlOmHk+mZlOmZj+mZkemZk+mZiumZjuWAnuWAheWAh+WAk+WAouWAsOWAm+S/teS/tOWAs+WAt+WArOS/tuS/t+WAl+WAnOWAoOWAp+WAteWAr+WAseWAjuWFmuWGlOWGk+WHiuWHhOWHheWHiOWHjuWJoeWJmuWJkuWJnuWJn+WJleWJouWLjeWMjuWOnuWUpuWTouWUl+WUkuWTp+WTs+WTpOWUmuWTv+WUhOWUiOWTq+WUkeWUheWTse+/vVwiLnNwbGl0KFwiXCIpO1xuZm9yKGogPSAwOyBqICE9IERbMjA4XS5sZW5ndGg7ICsraikgaWYoRFsyMDhdW2pdLmNoYXJDb2RlQXQoMCkgIT09IDB4RkZGRCkgeyBlW0RbMjA4XVtqXV0gPSA1MzI0OCArIGo7IGRbNTMyNDggKyBqXSA9IERbMjA4XVtqXTt9XG5EWzIwOV0gPSBcIu+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/veWUiuWTu+WTt+WTuOWToOWUjuWUg+WUi+WcgeWcguWfjOWgsuWfleWfkuWeuuWfhuWeveWevOWeuOWetuWev+Wfh+WfkOWeueWfgeWkjuWliuWomeWoluWoreWoruWoleWoj+Wol+WoiuWonuWos+WtrOWup+WureWurOWwg+WxluWxlOWzrOWzv+WzruWzseWzt+W0gOWzueW4qeW4qOW6qOW6ruW6quW6rOW8s+W8sOW9p+aBneaBmuaBp++/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/veaBgeaCouaCiOaCgOaCkuaCgeaCneaCg+aCleaCm+aCl+aCh+aCnOaCjuaImeaJhuaLsuaMkOaNluaMrOaNhOaNheaMtuaNg+aPpOaMueaNi+aNiuaMvOaMqeaNgeaMtOaNmOaNlOaNmeaMreaNh+aMs+aNmuaNkeaMuOaNl+aNgOaNiOaViuaVhuaXhuaXg+aXhOaXguaZiuaZn+aZh+aZkeackuack+agn+agmuahieagsuags+agu+ahi+ahj+agluagseagnOagteagq+agreagr+ahjuahhOagtOagneagkuaglOagpuagqOagruahjeaguuagpeagoOasrOasr+asreasseastOatreiCguauiOavpuavpO+/vVwiLnNwbGl0KFwiXCIpO1xuZm9yKGogPSAwOyBqICE9IERbMjA5XS5sZW5ndGg7ICsraikgaWYoRFsyMDldW2pdLmNoYXJDb2RlQXQoMCkgIT09IDB4RkZGRCkgeyBlW0RbMjA5XVtqXV0gPSA1MzUwNCArIGo7IGRbNTM1MDQgKyBqXSA9IERbMjA5XVtqXTt9XG5EWzIxMF0gPSBcIu+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/veavqOavo+avouavp+awpea1uua1o+a1pOa1tua0jea1oea2kua1mOa1oua1rea1r+a2kea2jea3r+a1v+a2hua1nua1p+a1oOa2l+a1sOa1vOa1n+a2gua2mOa0r+a1qOa2i+a1vua2gOa2hOa0lua2g+a1u+a1vea1tea2kOeDnOeDk+eDkeeDneeDi+e8ueeDoueDl+eDkueDnueDoOeDlOeDjeeDheeDhueDh+eDmueDjueDoeeJgueJuO+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/veeJt+eJtueMgOeLuueLtOeLvueLtueLs+eLu+eMgeePk+ePmeePpeePlueOvOePp+ePo+ePqeePnOePkuePm+ePlOePneePmuePl+ePmOePqOeTnueTn+eTtOeTteeUoeeVm+eVn+eWsOeXgeeWu+eXhOeXgOeWv+eWtueWuueaiuebieecneecm+eckOeck+eckueco+eckeecleecmeecmuecouecp+ego+egrOegouegteegr+egqOegruegq+egoeegqeegs+egquegseellOelm+elj+elnOelk+elkuelkeenq+enrOenoOenruenreenquennOennuenneeqhueqieeqheeqi+eqjOeqiueqh+ermOeskO+/vVwiLnNwbGl0KFwiXCIpO1xuZm9yKGogPSAwOyBqICE9IERbMjEwXS5sZW5ndGg7ICsraikgaWYoRFsyMTBdW2pdLmNoYXJDb2RlQXQoMCkgIT09IDB4RkZGRCkgeyBlW0RbMjEwXVtqXV0gPSA1Mzc2MCArIGo7IGRbNTM3NjAgKyBqXSA9IERbMjEwXVtqXTt9XG5EWzIxMV0gPSBcIu+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/veeshOesk+esheesj+esiOesiuesjuesieeskueyhOeykeeyiueyjOeyiOeyjeeyhee0nue0nee0kee0jue0mOe0lue0k+e0n+e0kue0j+e0jOe9nOe9oee9nue9oOe9nee9m+e+lue+kue/g+e/gue/gOiAluiAvuiAueiDuuiDsuiDueiDteiEgeiDu+iEgOiIgeiIr+iIpeiMs+iMreiNhOiMmeiNkeiMpeiNluiMv+iNgeiMpuiMnOiMou+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/veiNguiNjuiMm+iMquiMiOiMvOiNjeiMluiMpOiMoOiMt+iMr+iMqeiNh+iNheiNjOiNk+iMnuiMrOiNi+iMp+iNiOiZk+iZkuiaouiaqOialuiajeiakeianuiah+ial+iahuiai+iamuiaheiapeiameiaoeiap+ialeiamOiajuianeiakOialOihg+ihhOihreihteihtuihsuiigOihseihv+ihr+iig+ihvuihtOihvOiokuixh+ixl+ixu+iypOiyo+i1tui1uOi2tei2t+i2tui7kei7k+i/vui/temAgui/v+i/u+mAhOi/vOi/tumDlumDoOmDmemDmumDo+mDn+mDpemDmOmDm+mDl+mDnOmDpOmFkO+/vVwiLnNwbGl0KFwiXCIpO1xuZm9yKGogPSAwOyBqICE9IERbMjExXS5sZW5ndGg7ICsraikgaWYoRFsyMTFdW2pdLmNoYXJDb2RlQXQoMCkgIT09IDB4RkZGRCkgeyBlW0RbMjExXVtqXV0gPSA1NDAxNiArIGo7IGRbNTQwMTYgKyBqXSA9IERbMjExXVtqXTt9XG5EWzIxMl0gPSBcIu+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/vemFjumFj+mHlemHoumHmumZnOmZn+mavOmjo+mrn+msr+S5v+WBsOWBquWBoeWBnuWBoOWBk+WBi+WBneWBsuWBiOWBjeWBgeWBm+WBiuWBouWAleWBheWBn+WBqeWBq+WBo+WBpOWBhuWBgOWBruWBs+WBl+WBkeWHkOWJq+WJreWJrOWJruWLluWLk+WMreWOnOWVteWVtuWUvOWVjeWVkOWUtOWUquWVkeWVouWUtuWUteWUsOWVkuWVhe+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/veWUjOWUsuWVpeWVjuWUueWViOWUreWUu+WVgOWVi+WciuWch+Wfu+WglOWfouWftuWfnOWftOWggOWfreWfveWgiOWfuOWgi+Wfs+Wfj+Wgh+WfruWfo+WfsuWfpeWfrOWfoeWgjuWfvOWgkOWfp+WggeWgjOWfseWfqeWfsOWgjeWghOWlnOWpoOWpmOWpleWpp+WpnuWouOWoteWpreWpkOWpn+WppeWprOWpk+WppOWpl+Wpg+WpneWpkuWphOWpm+WpiOWqjuWovuWpjeWoueWpjOWpsOWpqeWph+WpkeWpluWpguWpnOWtsuWtruWvgeWvgOWxmeW0nuW0i+W0neW0muW0oOW0jOW0qOW0jeW0puW0peW0j++/vVwiLnNwbGl0KFwiXCIpO1xuZm9yKGogPSAwOyBqICE9IERbMjEyXS5sZW5ndGg7ICsraikgaWYoRFsyMTJdW2pdLmNoYXJDb2RlQXQoMCkgIT09IDB4RkZGRCkgeyBlW0RbMjEyXVtqXV0gPSA1NDI3MiArIGo7IGRbNTQyNzIgKyBqXSA9IERbMjEyXVtqXTt9XG5EWzIxM10gPSBcIu+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/veW0sOW0kuW0o+W0n+W0ruW4vuW4tOW6seW6tOW6ueW6suW6s+W8tuW8uOW+m+W+luW+n+aCiuaCkOaChuaCvuaCsOaCuuaDk+aDlOaDj+aDpOaDmeaDneaDiOaCseaDm+aCt+aDiuaCv+aDg+aDjeaDgOaMsuaNpeaOiuaOguaNveaOveaOnuaOreaOneaOl+aOq+aOjuaNr+aOh+aOkOaNruaOr+aNteaOnOaNreaOruaNvOaOpOaMu+aOn++/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/veaNuOaOheaOgeaOkeaOjeaNsOaVk+aXjeaZpeaZoeaZm+aZmeaZnOaZouacmOahueaih+aikOainOahreahruairuaiq+alluahr+aio+airOaiqeahteahtOaisuaij+aht+aikuahvOahq+ahsuaiquaigOahseahvuaim+ailuaii+aioOaiieaipOahuOahu+aikeaijOaiiuahveastuass+ast+asuOaukeauj+aujeaujuaujOawqua3gOa2q+a2tOa2s+a5tOa2rOa3qea3oua2t+a3tua3lOa4gOa3iOa3oOa3n+a3lua2vua3pea3nOa3nea3m+a3tOa3iua2vea3rea3sOa2uua3lea3gua3j+a3ie+/vVwiLnNwbGl0KFwiXCIpO1xuZm9yKGogPSAwOyBqICE9IERbMjEzXS5sZW5ndGg7ICsraikgaWYoRFsyMTNdW2pdLmNoYXJDb2RlQXQoMCkgIT09IDB4RkZGRCkgeyBlW0RbMjEzXVtqXV0gPSA1NDUyOCArIGo7IGRbNTQ1MjggKyBqXSA9IERbMjEzXVtqXTt9XG5EWzIxNF0gPSBcIu+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/vea3kOa3sua3k+a3vea3l+a3jea3o+a2u+eDuueEjeeDt+eEl+eDtOeEjOeDsOeEhOeDs+eEkOeDvOeDv+eEhueEk+eEgOeDuOeDtueEi+eEgueEjueJvueJu+eJvOeJv+eMneeMl+eMh+eMkeeMmOeMiueMiOeLv+eMj+eMnueOiOePtuePuOePteeQhOeQgeePveeQh+eQgOePuuePvOePv+eQjOeQi+ePtOeQiOeVpOeVo+eXjueXkueXj++/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/veeXi+eXjOeXkeeXkOeaj+eaieebk+ecueecr+ecreecseecsuectOecs+ecveecpeecu+ecteehiOehkuehieehjeehiuehjOegpuehheehkOelpOelp+elqeelquelo+elq+eloeemu+enuuenuOentuent+eqj+eqlOeqkOesteeth+estOespeessOesouespOess+esmOesquesneesseesq+esreesr+essuesuOesmueso+eylOeymOeylueyo+e0tee0vee0uOe0tue0uue1hee0rOe0qee1gee1h+e0vue0v+e1iue0u+e0qOe9o+e+lee+nOe+nee+m+e/iue/i+e/jee/kOe/kee/h+e/j+e/ieiAn++/vVwiLnNwbGl0KFwiXCIpO1xuZm9yKGogPSAwOyBqICE9IERbMjE0XS5sZW5ndGg7ICsraikgaWYoRFsyMTRdW2pdLmNoYXJDb2RlQXQoMCkgIT09IDB4RkZGRCkgeyBlW0RbMjE0XVtqXV0gPSA1NDc4NCArIGo7IGRbNTQ3ODQgKyBqXSA9IERbMjE0XVtqXTt9XG5EWzIxNV0gPSBcIu+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/veiAnuiAm+iBh+iBg+iBiOiEmOiEpeiEmeiEm+iEreiEn+iErOiEnuiEoeiEleiEp+iEneiEouiIkeiIuOiIs+iIuuiItOiIsuiJtOiOkOiOo+iOqOiOjeiNuuiNs+iOpOiNtOiOj+iOgeiOleiOmeiNteiOlOiOqeiNveiOg+iOjOiOneiOm+iOquiOi+iNvuiOpeiOr+iOiOiOl+iOsOiNv+iOpuiOh+iOruiNtuiOmuiZmeiZluiav+iat++/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/veibguibgeibheiauuiasOibiOiaueias+iauOibjOiatOiau+iavOibg+iaveiavuihkuiiieiileiiqOiiouiiquiimuiikeiioeiin+iimOiip+iimeiim+iil+iipOiirOiijOiik+iijuimguinluinmeinleiosOiop+iorOionuiwueiwu+ixnOixneixveiypei1vei1u+i1uei2vOi3gui2uei2v+i3gei7mOi7nui7nei7nOi7l+i7oOi7oemApOmAi+mAkemAnOmAjOmAoemDr+mDqumDsOmDtOmDsumDs+mDlOmDq+mDrOmDqemFlumFmOmFmumFk+mFlemHrOmHtOmHsemHs+mHuOmHpOmHuemHqu+/vVwiLnNwbGl0KFwiXCIpO1xuZm9yKGogPSAwOyBqICE9IERbMjE1XS5sZW5ndGg7ICsraikgaWYoRFsyMTVdW2pdLmNoYXJDb2RlQXQoMCkgIT09IDB4RkZGRCkgeyBlW0RbMjE1XVtqXV0gPSA1NTA0MCArIGo7IGRbNTUwNDAgKyBqXSA9IERbMjE1XVtqXTt9XG5EWzIxNl0gPSBcIu+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/vemHq+mHt+mHqOmHrumVuumWhumWiOmZvOmZremZq+mZsemZr+mav+mdqumghOmjpemml+WCm+WCleWClOWCnuWCi+WCo+WCg+WCjOWCjuWCneWBqOWCnOWCkuWCguWCh+WFn+WHlOWMkuWMkeWOpOWOp+WWkeWWqOWWpeWWreWVt+WZheWWouWWk+WWiOWWj+WWteWWgeWWo+WWkuWWpOWVveWWjOWWpuWVv+WWleWWoeWWjuWcjOWgqeWgt++/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/veWgmeWgnuWgp+Wgo+WgqOWfteWhiOWgpeWgnOWgm+Wgs+Wgv+WgtuWgruWgueWguOWgreWgrOWgu+WloeWqr+WqlOWqn+WpuuWqouWqnuWpuOWqpuWpvOWqpeWqrOWqleWqruWot+WqhOWqiuWql+Wqg+Wqi+WqqeWpu+WpveWqjOWqnOWqj+Wqk+WqneWvquWvjeWvi+WvlOWvkeWviuWvjuWwjOWwsOW0t+W1g+W1q+W1geW1i+W0v+W0teW1keW1juW1leW0s+W0uuW1kuW0veW0seW1meW1guW0ueW1ieW0uOW0vOW0suW0tuW1gOW1heW5hOW5geW9mOW+puW+peW+q+aDieaCueaDjOaDouaDjuaDhOaElO+/vVwiLnNwbGl0KFwiXCIpO1xuZm9yKGogPSAwOyBqICE9IERbMjE2XS5sZW5ndGg7ICsraikgaWYoRFsyMTZdW2pdLmNoYXJDb2RlQXQoMCkgIT09IDB4RkZGRCkgeyBlW0RbMjE2XVtqXV0gPSA1NTI5NiArIGo7IGRbNTUyOTYgKyBqXSA9IERbMjE2XVtqXTt9XG5EWzIxN10gPSBcIu+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/veaDsuaEiuaEluaEheaDteaEk+aDuOaDvOaDvuaDgeaEg+aEmOaEneaEkOaDv+aEhOaEi+aJiuaOlOaOseaOsOaPjuaPpeaPqOaPr+aPg+aSneaPs+aPiuaPoOaPtuaPleaPsuaPteaRoeaPn+aOvuaPneaPnOaPhOaPmOaPk+aPguaPh+aPjOaPi+aPiOaPsOaPl+aPmeaUsuaVp+aVquaVpOaVnOaVqOaVpeaWjOaWneaWnuaWruaXkOaXku+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/veaZvOaZrOaZu+aagOaZseaZueaZquaZsuacgeakjOajk+akhOajnOakquajrOajquajseakj+ajluajt+ajq+ajpOajtuakk+akkOajs+ajoeakh+ajjOakiOalsOaitOakkeajr+ajhuaklOajuOajkOajveajvOajqOaki+akiuakl+ajjuajiOajneajnuajpuajtOajkeakhuajlOajqeakleakpeajh+asueasu+asv+asvOaulOaul+aumeauleauveavsOavsuavs+awsOa3vOa5hua5h+a4n+a5iea6iOa4vOa4vea5hea5oua4q+a4v+a5gea5nea5s+a4nOa4s+a5i+a5gOa5kea4u+a4g+a4rua5nu+/vVwiLnNwbGl0KFwiXCIpO1xuZm9yKGogPSAwOyBqICE9IERbMjE3XS5sZW5ndGg7ICsraikgaWYoRFsyMTddW2pdLmNoYXJDb2RlQXQoMCkgIT09IDB4RkZGRCkgeyBlW0RbMjE3XVtqXV0gPSA1NTU1MiArIGo7IGRbNTU1NTIgKyBqXSA9IERbMjE3XVtqXTt9XG5EWzIxOF0gPSBcIu+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/vea5qOa5nOa5oea4sea4qOa5oOa5sea5q+a4uea4oua4sOa5k+a5pea4p+a5uOa5pOa5t+a5lea5uea5kua5pua4tea4tua5mueEoOeEnueEr+eDu+eErueEseeEo+eEpeeEoueEsueEn+eEqOeEuueEm+eJi+eJmueKiOeKieeKhueKheeKi+eMkueMi+eMsOeMoueMseeMs+eMp+eMsueMreeMpueMo+eMteeMjOeQrueQrOeQsOeQq+eQlu+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/veeQmueQoeeQreeQseeQpOeQo+eQneeQqeeQoOeQsueTu+eUr+eVr+eVrOeXp+eXmueXoeeXpueXneeXn+eXpOeXl+ealeeakuebmuedhuedh+edhOedjeedheediuedjuedi+edjOefnuefrOehoOehpOehpeehnOehreehseehquehruehsOehqeehqOehnuehoueltOels+elsuelsOeogueoiueog+eojOeohOeqmeerpuerpOetiuesu+ethOetiOetjOetjuetgOetmOetheeyoueynueyqOeyoee1mOe1r+e1o+e1k+e1lue1p+e1que1j+e1ree1nOe1q+e1kue1lOe1qee1kee1n+e1jue8vue8v+e9pe+/vVwiLnNwbGl0KFwiXCIpO1xuZm9yKGogPSAwOyBqICE9IERbMjE4XS5sZW5ndGg7ICsraikgaWYoRFsyMThdW2pdLmNoYXJDb2RlQXQoMCkgIT09IDB4RkZGRCkgeyBlW0RbMjE4XVtqXV0gPSA1NTgwOCArIGo7IGRbNTU4MDggKyBqXSA9IERbMjE4XVtqXTt9XG5EWzIxOV0gPSBcIu+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/vee9pue+oue+oOe+oee/l+iBkeiBj+iBkOiDvuiDlOiFg+iFiuiFkuiFj+iFh+iEveiFjeiEuuiHpuiHruiHt+iHuOiHueiIhOiIvOiIveiIv+iJteiMu+iPj+iPueiQo+iPgOiPqOiQkuiPp+iPpOiPvOiPtuiQkOiPhuiPiOiPq+iPo+iOv+iQgeiPneiPpeiPmOiPv+iPoeiPi+iPjuiPluiPteiPieiQieiQj+iPnuiQkeiQhuiPguiPs++/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/veiPleiPuuiPh+iPkeiPquiQk+iPg+iPrOiPruiPhOiPu+iPl+iPouiQm+iPm+iPvuibmOibouibpuibk+ibo+ibmuibquibneibq+ibnOibrOibqeibl+ibqOibkeihiOihluihleiiuuijl+iiueiiuOijgOiivuiituiivOiit+iiveiisuikgeijieimleimmOiml+inneinmuinm+ipjuipjeioueipmeipgOipl+ipmOiphOipheipkuipiOipkeipiuipjOipj+ixn+iygeiygOiyuuiyvuiysOiyueiytei2hOi2gOi2iei3mOi3k+i3jei3h+i3lui3nOi3j+i3lei3mei3iOi3l+i3hei7r+i7t+i7uu+/vVwiLnNwbGl0KFwiXCIpO1xuZm9yKGogPSAwOyBqICE9IERbMjE5XS5sZW5ndGg7ICsraikgaWYoRFsyMTldW2pdLmNoYXJDb2RlQXQoMCkgIT09IDB4RkZGRCkgeyBlW0RbMjE5XVtqXV0gPSA1NjA2NCArIGo7IGRbNTYwNjQgKyBqXSA9IERbMjE5XVtqXTt9XG5EWzIyMF0gPSBcIu+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/vei7uei7pui7rui7pei7tei7p+i7qOi7tui7q+i7sei7rOi7tOi7qemAremAtOmAr+mEhumErOmEhOmDv+mDvOmEiOmDuemDu+mEgemEgOmEh+mEhemEg+mFoemFpOmFn+mFoumFoOmIgemIiumIpemIg+mImumIpumIj+mIjOmIgOmIkumHv+mHvemIhumIhOmIp+mIgumInOmIpOmImemIl+mIhemIlumVu+mWjemWjOmWkOmah+mZvumaiO+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/vemaiemag+magOmbgumbiOmbg+mbsembsOmdrOmdsOmdrumgh+miqemjq+mzpum7ueS6g+S6hOS6tuWCveWCv+WDhuWCruWDhOWDiuWCtOWDiOWDguWCsOWDgeWCuuWCseWDi+WDieWCtuWCuOWHl+WJuuWJuOWJu+WJvOWXg+WXm+WXjOWXkOWXi+WXiuWXneWXgOWXlOWXhOWXqeWWv+WXkuWWjeWXj+WXleWXouWXluWXiOWXsuWXjeWXmeWXguWclOWhk+WhqOWhpOWhj+WhjeWhieWhr+WhleWhjuWhneWhmeWhpeWhm+WgveWho+WhseWjvOWrh+WrhOWri+WquuWquOWqseWqteWqsOWqv+WriOWqu+Wrhu+/vVwiLnNwbGl0KFwiXCIpO1xuZm9yKGogPSAwOyBqICE9IERbMjIwXS5sZW5ndGg7ICsraikgaWYoRFsyMjBdW2pdLmNoYXJDb2RlQXQoMCkgIT09IDB4RkZGRCkgeyBlW0RbMjIwXVtqXV0gPSA1NjMyMCArIGo7IGRbNTYzMjAgKyBqXSA9IERbMjIwXVtqXTt9XG5EWzIyMV0gPSBcIu+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/veWqt+WrgOWriuWqtOWqtuWrjeWqueWqkOWvluWvmOWvmeWwn+Wws+W1seW1o+W1iuW1peW1suW1rOW1nuW1qOW1p+W1ouW3sOW5j+W5juW5iuW5jeW5i+W7heW7jOW7huW7i+W7h+W9gOW+r+W+reaDt+aFieaFiuaEq+aFheaEtuaEsuaEruaFhuaEr+aFj+aEqeaFgOaIoOmFqOaIo+aIpeaIpOaPheaPseaPq+aQkOaQkuaQieaQoOaQpO+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/veaQs+aRg+aQn+aQleaQmOaQueaQt+aQouaQo+aQjOaQpuaQsOaQqOaRgeaQteaQr+aQiuaQmuaRgOaQpeaQp+aQi+aPp+aQm+aQruaQoeaQjuaVr+aWkuaXk+aahuaajOaaleaakOaai+aaiuaameaalOaZuOacoOalpualn+akuOaljualoualseakv+alhealquakuealguall+almealuualiOalieaktealrOaks+akvealpeajsOaluOaktOalqealgOalr+alhOaltualmOalgealtOaljOaku+ali+akt+alnOalj+alkeaksualkuakr+alu+akvOathuatheatg+atguatiOatgeaum++ojeavu+avvO+/vVwiLnNwbGl0KFwiXCIpO1xuZm9yKGogPSAwOyBqICE9IERbMjIxXS5sZW5ndGg7ICsraikgaWYoRFsyMjFdW2pdLmNoYXJDb2RlQXQoMCkgIT09IDB4RkZGRCkgeyBlW0RbMjIxXVtqXV0gPSA1NjU3NiArIGo7IGRbNTY1NzYgKyBqXSA9IERbMjIxXVtqXTt9XG5EWzIyMl0gPSBcIu+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/veavueavt+avuOa6m+a7lua7iOa6j+a7gOa6n+a6k+a6lOa6oOa6sea6uea7hua7kua6vea7gea6nua7iea6t+a6sOa7jea6pua7j+a6sua6vua7g+a7nOa7mOa6mea6kua6jua6jea6pOa6oea6v+a6s+a7kOa7iua6l+a6rua6o+eFh+eFlOeFkueFo+eFoOeFgeeFneeFoueFsueFuOeFqueFoeeFgueFmOeFg+eFi+eFsOeFn+eFkOeFk++/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/veeFhOeFjeeFmueJj+eKjeeKjOeKkeeKkOeKjueMvOeNgueMu+eMuueNgOeNiueNieeRhOeRiueRi+eRkueRkeeRl+eRgOeRj+eRkOeRjueRgueRhueRjeeRlOeToeeTv+eTvueTveeUneeVueeVt+amg+eXr+eYj+eYg+eXt+eXvueXvOeXueeXuOeYkOeXu+eXtueXreeXteeXveeameeateebneedleedn+edoOedkuedluedmuedqeedp+edlOedmeedreefoOeih+eimueilOeij+eihOeileeiheeihueioeeig+ehueeimeeigOeiluehu+elvOemguelveelueeokeeomOeomeeokueol+eoleeooueok++/vVwiLnNwbGl0KFwiXCIpO1xuZm9yKGogPSAwOyBqICE9IERbMjIyXS5sZW5ndGg7ICsraikgaWYoRFsyMjJdW2pdLmNoYXJDb2RlQXQoMCkgIT09IDB4RkZGRCkgeyBlW0RbMjIyXVtqXV0gPSA1NjgzMiArIGo7IGRbNTY4MzIgKyBqXSA9IERbMjIyXVtqXTt9XG5EWzIyM10gPSBcIu+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/veeom+eokOeqo+eqoueqnuerq+etpuetpOetreettOetqeetsuetpeets+etseetsOetoeetuOettueto+eysueytOeyr+e2iOe2hue2gOe2jee1v+e2hee1uue2jue1u+e2g+e1vOe2jOe2lOe2hOe1vee2kue9ree9q+e9p+e9qOe9rOe+pue+pee+p+e/m+e/nOiAoeiFpOiFoOiFt+iFnOiFqeiFm+iFouiFsuacoeiFnuiFtuiFp+iFr++/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/veiFhOiFoeiIneiJieiJhOiJgOiJguiJheiTseiQv+iRluiRtuiRueiSj+iSjeiRpeiRkeiRgOiShuiRp+iQsOiRjeiRveiRmuiRmeiRtOiRs+iRneiUh+iRnuiQt+iQuuiQtOiRuuiRg+iRuOiQsuiRheiQqeiPmeiRi+iQr+iRguiQreiRn+iRsOiQueiRjuiRjOiRkuiRr+iTheiSjuiQu+iRh+iQtuiQs+iRqOiRvuiRhOiQq+iRoOiRlOiRruiRkOici+ichOibt+icjOibuuibluibteidjeibuOicjuicieicgeibtuicjeicheijluiji+ijjeijjuijnuijm+ijmuijjOijkOimheimm+inn+inpeinpO+/vVwiLnNwbGl0KFwiXCIpO1xuZm9yKGogPSAwOyBqICE9IERbMjIzXS5sZW5ndGg7ICsraikgaWYoRFsyMjNdW2pdLmNoYXJDb2RlQXQoMCkgIT09IDB4RkZGRCkgeyBlW0RbMjIzXVtqXV0gPSA1NzA4OCArIGo7IGRbNTcwODggKyBqXSA9IERbMjIzXVtqXTt9XG5EWzIyNF0gPSBcIu+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/veinoeinoOinouinnOinpuiptuiqhuipv+ipoeiov+ipt+iqguiqhOipteiqg+iqgeiptOipuuiwvOixi+ixiuixpeixpOixpuiyhuiyhOiyheizjOi1qOi1qei2kei2jOi2jui2j+i2jei2k+i2lOi2kOi2kui3sOi3oOi3rOi3sei3rui3kOi3qei3o+i3oui3p+i3sui3q+i3tOi8hui7v+i8gei8gOi8hei8h+i8iOi8gui8i+mBkumAv++/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/vemBhOmBiemAvemEkOmEjemEj+mEkemElumElOmEi+mEjumFrumFr+mJiOmJkumIsOmIuumJpumIs+mJpemJnumKg+mIrumJiumJhumJremJrOmJj+mJoOmJp+mJr+mItumJoemJsOmIsemJlOmJo+mJkOmJsumJjumJk+mJjOmJlumIsumWn+mWnOmWnumWm+makumak+makemal+mbjumbuumbvembuOmbtemds+mdt+mduOmdsumgj+mgjemgjumirOmjtumjuemmr+mmsummsOmmtemqremqq+mtm+mzqumzremzp+m6gOm7veWDpuWDlOWDl+WDqOWDs+WDm+WDquWDneWDpOWDk+WDrOWDsOWDr+WDo+WDoO+/vVwiLnNwbGl0KFwiXCIpO1xuZm9yKGogPSAwOyBqICE9IERbMjI0XS5sZW5ndGg7ICsraikgaWYoRFsyMjRdW2pdLmNoYXJDb2RlQXQoMCkgIT09IDB4RkZGRCkgeyBlW0RbMjI0XVtqXV0gPSA1NzM0NCArIGo7IGRbNTczNDQgKyBqXSA9IERbMjI0XVtqXTt9XG5EWzIyNV0gPSBcIu+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/veWHmOWKgOWKgeWLqeWLq+WMsOWOrOWYp+WYleWYjOWYkuWXvOWYj+WYnOWYgeWYk+WYguWXuuWYneWYhOWXv+WXueWiieWhvOWikOWimOWihuWigeWhv+WhtOWii+WhuuWih+WikeWijuWhtuWiguWiiOWhu+WilOWij+WjvuWlq+WrnOWrruWrpeWrleWrquWrmuWrreWrq+Wrs+WrouWroOWrm+WrrOWrnuWrneWrmeWrqOWrn+Wtt+WvoO+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/veWvo+Wxo+W2guW2gOW1veW2huW1uuW2geW1t+W2iuW2ieW2iOW1vuW1vOW2jeW1ueW1v+W5mOW5meW5k+W7mOW7keW7l+W7juW7nOW7leW7meW7kuW7lOW9hOW9g+W9r+W+tuaErOaEqOaFgeaFnuaFseaFs+aFkuaFk+aFsuaFrOaGgOaFtOaFlOaFuuaFm+aFpeaEu+aFquaFoeaFluaIqeaIp+aIq+aQq+aRjeaRm+aRneaRtOaRtuaRsuaRs+aRveaRteaRpuaSpuaRjuaSguaRnuaRnOaRi+aRk+aRoOaRkOaRv+aQv+aRrOaRq+aRmeaRpeaRt+aVs+aWoOaaoeaaoOaan+acheachOacouamseamtuanie+/vVwiLnNwbGl0KFwiXCIpO1xuZm9yKGogPSAwOyBqICE9IERbMjI1XS5sZW5ndGg7ICsraikgaWYoRFsyMjVdW2pdLmNoYXJDb2RlQXQoMCkgIT09IDB4RkZGRCkgeyBlW0RbMjI1XVtqXV0gPSA1NzYwMCArIGo7IGRbNTc2MDAgKyBqXSA9IERbMjI1XVtqXTt9XG5EWzIyNl0gPSBcIu+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/veamoOanjuamluamsOamrOamvOamkeammeamjuamp+amjeamqeamvuamr+amv+anhOamveampOanlOamueaniuammuanj+ams+amk+amquamoeamnuanmeaml+amkOanguamteampeanhuatiuatjeati+aunuaun+auoOavg+avhOavvua7jua7tea7sea8g+a8pea7uOa8t+a7u+a8rua8iea9jua8mea8mua8p+a8mOa8u+a8kua7rea8iu+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/vea8tua9s+a7uea7rua8rea9gOa8sOa8vOa8tea7q+a8h+a8jua9g+a8hea7vea7tua8uea8nOa7vOa8uua8n+a8jea8nua8iOa8oeeGh+eGkOeGieeGgOeGheeGgueGj+eFu+eGhueGgeeGl+eJhOeJk+eKl+eKleeKk+eNg+eNjeeNkeeNjOeRoueRs+eRseeRteeRsueRp+eRrueUgOeUgueUg+eVveeWkOeYlueYiOeYjOeYleeYkeeYiueYlOeauOeegeedvOeeheeeguedrueegOedr+edvueeg+eisueiqueitOeireeiqOehvueiq+einueipeeioOeirOeioueipOemmOemiuemi+emluemleemlOemk++/vVwiLnNwbGl0KFwiXCIpO1xuZm9yKGogPSAwOyBqICE9IERbMjI2XS5sZW5ndGg7ICsraikgaWYoRFsyMjZdW2pdLmNoYXJDb2RlQXQoMCkgIT09IDB4RkZGRCkgeyBlW0RbMjI2XVtqXV0gPSA1Nzg1NiArIGo7IGRbNTc4NTYgKyBqXSA9IERbMjI2XVtqXTt9XG5EWzIyN10gPSBcIu+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/veeml+emiOemkuemkOeoq+epiueosOeor+eoqOeopueqqOeqq+eqrOerrueuiOeunOeuiueukeeukOeulueujeeujOeum+eujueuheeumOWKhOeumeeupOeugueyu+eyv+eyvOeyuue2p+e2t+e3gue2o+e2que3gee3gOe3hee2nee3jue3hOe3hue3i+e3jOe2r+e2uee2lue2vOe2n+e2pue2rue2qee2oee3iee9s+e/oue/o+e/pee/nu+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/veiApOiBneiBnOiGieiGhuiGg+iGh+iGjeiGjOiGi+iIleiSl+iSpOiSoeiSn+iSuuiTjuiTguiSrOiSruiSq+iSueiStOiTgeiTjeiSquiSmuiSseiTkOiSneiSp+iSu+iSouiSlOiTh+iTjOiSm+iSqeiSr+iSqOiTluiSmOiStuiTj+iSoOiTl+iTlOiTkuiTm+iSsOiSkeiZoeics+ico+icqOidq+idgOicruicnuicoeicmeicm+idg+icrOidgeicvuidhuicoOicsuicquicreicvOickuicuuicseicteidguicpuicp+icuOicpOicmuicsOickeijt+ijp+ijseijsuijuuijvuijruijvOijtuiju++/vVwiLnNwbGl0KFwiXCIpO1xuZm9yKGogPSAwOyBqICE9IERbMjI3XS5sZW5ndGg7ICsraikgaWYoRFsyMjddW2pdLmNoYXJDb2RlQXQoMCkgIT09IDB4RkZGRCkgeyBlW0RbMjI3XVtqXV0gPSA1ODExMiArIGo7IGRbNTgxMTIgKyBqXSA9IERbMjI3XVtqXTt9XG5EWzIyOF0gPSBcIu+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/veijsOijrOijq+imneimoeimn+imnuinqeinq+inqOiqq+iqmeiqi+iqkuiqj+iqluiwveixqOixqeizleizj+izl+i2lui4iei4gui3v+i4jei3vei4iui4g+i4h+i4hui4hei3vui4gOi4hOi8kOi8kei8jui8jemEo+mEnOmEoOmEoumEn+mEnemEmumEpOmEoemEm+mFuumFsumFuemFs+mKpemKpOmJtumKm+mJuumKoOmKlOmKqumKje+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/vemKpumKmumKq+mJuemKl+mJv+mKo+mLrumKjumKgumKlemKoumJvemKiOmKoemKiumKhumKjOmKmemKp+mJvumKh+mKqemKnemKi+mIremanumaoembv+mdmOmdvemduumdvumeg+megOmegumdu+mehOmegemdv+mfjumfjemglumiremirumkgumkgOmkh+mmnemmnOmng+mmuemmu+mmuumngummvemnh+mqsemro+mrp+msvumsv+mtoOmtoemtn+mzsemzsumztem6p+WDv+WEg+WEsOWDuOWEhuWEh+WDtuWDvuWEi+WEjOWDveWEiuWKi+WKjOWLseWLr+WZiOWZguWZjOWYteWZgeWZiuWZieWZhuWZmO+/vVwiLnNwbGl0KFwiXCIpO1xuZm9yKGogPSAwOyBqICE9IERbMjI4XS5sZW5ndGg7ICsraikgaWYoRFsyMjhdW2pdLmNoYXJDb2RlQXQoMCkgIT09IDB4RkZGRCkgeyBlW0RbMjI4XVtqXV0gPSA1ODM2OCArIGo7IGRbNTgzNjggKyBqXSA9IERbMjI4XVtqXTt9XG5EWzIyOV0gPSBcIu+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/veWZmuWZgOWYs+WYveWYrOWYvuWYuOWYquWYuuWcmuWiq+WineWiseWioOWio+Wir+WirOWipeWioeWjv+Wrv+WrtOWrveWrt+WrtuWsg+WruOWsguWrueWsgeWsh+WsheWsj+Wxp+W2meW2l+W2n+W2kuW2ouW2k+W2leW2oOW2nOW2oeW2muW2nuW5qeW5neW5oOW5nOe3s+W7m+W7nuW7oeW9ieW+suaGi+aGg+aFueaGseaGsOaGouaGie+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/veaGm+aGk+aGr+aGreaGn+aGkuaGquaGoeaGjeaFpuaGs+aIreaRruaRsOaSluaSoOaSheaSl+aSnOaSj+aSi+aSiuaSjOaSo+aSn+aRqOaSseaSmOaVtuaVuuaVueaVu+aWsuaWs+aateaasOaaqeaasuaat+aaquaar+aogOaohuaol+anpeanuOaoleanseanpOaooOanv+anrOanouaom+aoneanvuaop+ansuanruaolOant+anp+apgOaoiOanpuanu+aojeanvOanq+aoieaohOaomOaopeaoj+antuaopuaoh+antOaoluatkeaupeauo+auouaupuawgeawgOavv+awgua9gea8pua9vua+h+a/hua+ku+/vVwiLnNwbGl0KFwiXCIpO1xuZm9yKGogPSAwOyBqICE9IERbMjI5XS5sZW5ndGg7ICsraikgaWYoRFsyMjldW2pdLmNoYXJDb2RlQXQoMCkgIT09IDB4RkZGRCkgeyBlW0RbMjI5XVtqXV0gPSA1ODYyNCArIGo7IGRbNTg2MjQgKyBqXSA9IERbMjI5XVtqXTt9XG5EWzIzMF0gPSBcIu+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/vea+jea+iea+jOa9oua9j+a+hea9mua+lua9tua9rOa+gua9lea9sua9kua9kOa9l+a+lOa+k+a9nea8gOa9oea9q+a9vea9p+a+kOa9k+a+i+a9qea9v+a+lea9o+a9t+a9qua9u+eGsueGr+eGm+eGsOeGoOeGmueGqeeGteeGneeGpeeGnueGpOeGoeeGqueGnOeGp+eGs+eKmOeKmueNmOeNkueNnueNn+eNoOeNneeNm+eNoeeNmueNme+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/veeNoueSh+eSieeSiueShueSgeeRveeSheeSiOeRvOeRueeUiOeUh+eVvueYpeeYnueYmeeYneeYnOeYo+eYmueYqOeYm+eanOeaneeanueam+eejeeej+eeieeeiOejjeeiu+ejj+ejjOejkeejjuejlOejiOejg+ejhOejieemmuemoeemoOemnOemouemm+attueoueeqsueqtOeqs+eut+evi+euvueurOevjueur+euueeviueuteezheeziOezjOezi+e3t+e3m+e3que3p+e3l+e3oee4g+e3uue3pue3tue3see3sOe3rue3n+e9tue+rOe+sOe+ree/ree/q+e/que/rOe/pue/qOiBpOiBp+iGo+iGn++/vVwiLnNwbGl0KFwiXCIpO1xuZm9yKGogPSAwOyBqICE9IERbMjMwXS5sZW5ndGg7ICsraikgaWYoRFsyMzBdW2pdLmNoYXJDb2RlQXQoMCkgIT09IDB4RkZGRCkgeyBlW0RbMjMwXVtqXV0gPSA1ODg4MCArIGo7IGRbNTg4ODAgKyBqXSA9IERbMjMwXVtqXTt9XG5EWzIzMV0gPSBcIu+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/veiGnuiGleiGouiGmeiGl+iIluiJj+iJk+iJkuiJkOiJjuiJkeiUpOiUu+iUj+iUgOiUqeiUjuiUieiUjeiUn+iUiuiUp+iUnOiTu+iUq+iTuuiUiOiUjOiTtOiUquiTsuiUleiTt+iTq+iTs+iTvOiUkuiTquiTqeiUluiTvuiUqOiUneiUruiUguiTveiUnuiTtuiUseiUpuiTp+iTqOiTsOiTr+iTueiUmOiUoOiUsOiUi+iUmeiUr+iZou+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/veidluido+idpOidt+ifoeids+idmOidlOidm+idkuidoeidmuidkeidnuidreidquidkOidjuidn+idneidr+idrOiduuidruidnOidpeidj+idu+idteidouidp+idqeihmuikheikjOiklOiki+ikl+ikmOikmeikhuikluikkeikjuikieimouimpOimo+inreinsOinrOirj+irhuiquOirk+irkeirlOirleiqu+irl+iqvuirgOirheirmOirg+iquuiqveirmeiwvuixjeiyj+izpeizn+izmeizqOizmuizneizp+i2oOi2nOi2oei2m+i4oOi4o+i4pei4pOi4rui4lei4m+i4lui4kei4mei4pui4p++/vVwiLnNwbGl0KFwiXCIpO1xuZm9yKGogPSAwOyBqICE9IERbMjMxXS5sZW5ndGg7ICsraikgaWYoRFsyMzFdW2pdLmNoYXJDb2RlQXQoMCkgIT09IDB4RkZGRCkgeyBlW0RbMjMxXVtqXV0gPSA1OTEzNiArIGo7IGRbNTkxMzYgKyBqXSA9IERbMjMxXVtqXTt9XG5EWzIzMl0gPSBcIu+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/vei4lOi4kui4mOi4k+i4nOi4l+i4mui8rOi8pOi8mOi8mui8oOi8o+i8lui8l+mBs+mBsOmBr+mBp+mBq+mEr+mEq+mEqemEqumEsumEpumErumGhemGhumGiumGgemGgumGhOmGgOmLkOmLg+mLhOmLgOmLmemKtumLj+mLsemLn+mLmOmLqemLl+mLnemLjOmLr+mLgumLqOmLiumLiOmLjumLpumLjemLlemLiemLoOmLnumLp+mLkemLk++/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/vemKtemLoemLhumKtOmVvOmWrOmWq+mWrumWsOmapOmaoumbk+mchemciOmcgumdmumeiumejumeiOmfkOmfj+mgnumgnemgpumgqemgqOmgoOmgm+mgp+misumkiOmjuumkkemklOmklumkl+mklemnnOmnjemnj+mnk+mnlOmnjumniemnlumnmOmni+mnl+mnjOmqs+mrrOmrq+mrs+mrsumrsemthumtg+mtp+mttOmtsemtpumttumttemtsOmtqOmtpOmtrOmzvOmzuumzvemzv+mzt+m0h+m0gOmzuemzu+m0iOm0hem0hOm6g+m7k+m8j+m8kOWEnOWEk+WEl+WEmuWEkeWHnuWMtOWPoeWZsOWZoOWZru+/vVwiLnNwbGl0KFwiXCIpO1xuZm9yKGogPSAwOyBqICE9IERbMjMyXS5sZW5ndGg7ICsraikgaWYoRFsyMzJdW2pdLmNoYXJDb2RlQXQoMCkgIT09IDB4RkZGRCkgeyBlW0RbMjMyXVtqXV0gPSA1OTM5MiArIGo7IGRbNTkzOTIgKyBqXSA9IERbMjMyXVtqXTt9XG5EWzIzM10gPSBcIu+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/veWZs+WZpuWZo+WZreWZsuWZnuWZt+WcnOWcm+WjiOWiveWjieWiv+WiuuWjguWivOWjhuWsl+WsmeWsm+WsoeWslOWsk+WskOWsluWsqOWsmuWsoOWsnuWvr+W2rOW2seW2qeW2p+W2teW2sOW2ruW2quW2qOW2suW2reW2r+W2tOW5p+W5qOW5puW5r+W7qeW7p+W7puW7qOW7peW9i+W+vOaGneaGqOaGluaHheaGtOaHhuaHgeaHjOaGuu+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/veaGv+aGuOaGjOaTl+aTluaTkOaTj+aTieaSveaSieaTg+aTm+aTs+aTmeaUs+aVv+aVvOaWouabiOaavuabgOabiuabi+abj+aaveaau+aauuabjOaco+aotOappuapieapp+aosuapqOaovuapneapreaptuapm+apkeaoqOapmuaou+aov+apgeapquappOapkOapj+aplOapr+apqeapoOaovOapnuapluapleapjeapjuaphuatleatlOatluaup+auquauq+aviOavh+awhOawg+awhua+rea/i+a+o+a/h+a+vOa/jua/iOa9nua/hOa+vea+nua/iua+qOeAhOa+pea+rua+uua+rOa+qua/j+a+v+a+uO+/vVwiLnNwbGl0KFwiXCIpO1xuZm9yKGogPSAwOyBqICE9IERbMjMzXS5sZW5ndGg7ICsraikgaWYoRFsyMzNdW2pdLmNoYXJDb2RlQXQoMCkgIT09IDB4RkZGRCkgeyBlW0RbMjMzXVtqXV0gPSA1OTY0OCArIGo7IGRbNTk2NDggKyBqXSA9IERbMjMzXVtqXTt9XG5EWzIzNF0gPSBcIu+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/vea+oua/iea+q+a/jea+r+a+sua+sOeHheeHgueGv+eGuOeHlueHgOeHgeeHi+eHlOeHiueHh+eHj+eGveeHmOeGvOeHhueHmueHm+eKneeKnueNqeeNpueNp+eNrOeNpeeNq+eNqueRv+eSmueSoOeSlOeSkueSleeSoeeUi+eWgOeYr+eYreeYseeYveeYs+eYvOeYteeYsueYsOeau+ebpueemueeneeeoeeenOeem+eeoueeo+eeleeeme+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/veeel+ejneejqeejpeejquejnuejo+ejm+ejoeejouejreejn+ejoOempOephOepiOeph+eqtuequOeqteeqseeqt+evnuevo+evp+evneevleevpeevmuevqOevueevlOevquevouevnOevq+evmOevn+ezkuezlOezl+ezkOezkee4kue4oee4l+e4jOe4n+e4oOe4k+e4jue4nOe4lee4mue4oue4i+e4j+e4lue4jee4lOe4pee4pOe9g+e9u+e9vOe9uue+see/r+iAquiAqeiBrOiGseiGpuiGruiGueiGteiGq+iGsOiGrOiGtOiGsuiGt+iGp+iHsuiJleiJluiJl+iVluiVheiVq+iVjeiVk+iVoeiVmO+/vVwiLnNwbGl0KFwiXCIpO1xuZm9yKGogPSAwOyBqICE9IERbMjM0XS5sZW5ndGg7ICsraikgaWYoRFsyMzRdW2pdLmNoYXJDb2RlQXQoMCkgIT09IDB4RkZGRCkgeyBlW0RbMjM0XVtqXV0gPSA1OTkwNCArIGo7IGRbNTk5MDQgKyBqXSA9IERbMjM0XVtqXTt9XG5EWzIzNV0gPSBcIu+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/veiVgOiVhuiVpOiVgeiVouiVhOiVkeiVh+iVo+iUvuiVm+iVseiVjuiVruiVteiVleiVp+iVoOiWjOiVpuiVneiVlOiVpeiVrOiZo+iZpeiZpOiem+iej+iel+iek+iekuieiOiegeieluiemOidueieh+ieo+ieheiekOiekeieneiehOielOienOiemuieieiknuikpuiksOikreikruikp+ikseikouikqeiko+ikr+ikrOikn+inseiroO+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/veirouirsuirtOirteirneislOirpOirn+irsOiriOirnuiroeirqOirv+irr+iru+iykeiykuiykOizteizruizseizsOizs+i1rOi1rui2pei2p+i4s+i4vui4uOi5gOi5hei4tui4vOi4vei5gei4sOi4v+i6vei8tui8rui8tei8sui8uei8t+i8tOmBtumBuemBu+mChumDuumEs+mEtemEtumGk+mGkOmGkemGjemGj+mMp+mMnumMiOmMn+mMhumMj+mNuumMuOmMvOmMm+mMo+mMkumMgemNhumMremMjumMjemLi+mMnemLuumMpemMk+mLuemLt+mMtOmMgumMpOmLv+mMqemMuemMtemMqumMlOmMjO+/vVwiLnNwbGl0KFwiXCIpO1xuZm9yKGogPSAwOyBqICE9IERbMjM1XS5sZW5ndGg7ICsraikgaWYoRFsyMzVdW2pdLmNoYXJDb2RlQXQoMCkgIT09IDB4RkZGRCkgeyBlW0RbMjM1XVtqXV0gPSA2MDE2MCArIGo7IGRbNjAxNjAgKyBqXSA9IERbMjM1XVtqXTt9XG5EWzIzNl0gPSBcIu+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/vemMi+mLvumMiemMgOmLu+mMlumWvOmXjemWvumWuemWuumWtumWv+mWtemWvemaqemblOmci+mckumckOmememel+melOmfsOmfuOmgtemgr+mgsumkpOmkn+mkp+mkqemmnumnrumnrOmnpemnpOmnsOmno+mnqumnqemnp+mquemqv+mqtOmqu+mrtumruumruemrt+mss+mugOmuhemuh+mtvOmtvumtu+mugumuk+mukumukOmtuumule+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/vemtvemuiOm0pem0l+m0oOm0num0lOm0qem0nem0mOm0oum0kOm0mem0n+m6iOm6hum6h+m6rum6rem7lem7lum7uum8kum8veWEpuWEpeWEouWEpOWEoOWEqeWLtOWak+WajOWajeWahuWahOWag+WZvuWaguWZv+WageWjluWjlOWjj+WjkuWsreWspeWssuWso+WsrOWsp+WspuWsr+WsruWtu+WvseWvsuW2t+W5rOW5quW+vuW+u+aHg+aGteaGvOaHp+aHoOaHpeaHpOaHqOaHnuaTr+aTqeaTo+aTq+aTpOaTqOaWgeaWgOaWtuaXmuabkuaqjeaqluaqgeaqpeaqieaqn+aqm+aqoeaqnuaqh+aqk+aqju+/vVwiLnNwbGl0KFwiXCIpO1xuZm9yKGogPSAwOyBqICE9IERbMjM2XS5sZW5ndGg7ICsraikgaWYoRFsyMzZdW2pdLmNoYXJDb2RlQXQoMCkgIT09IDB4RkZGRCkgeyBlW0RbMjM2XVtqXV0gPSA2MDQxNiArIGo7IGRbNjA0MTYgKyBqXSA9IERbMjM2XVtqXTt9XG5EWzIzN10gPSBcIu+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/veaqleaqg+aqqOaqpOaqkeapv+aqpuaqmuaqheaqjOaqkuatm+aureawiea/jOa+qea/tOa/lOa/o+a/nOa/rea/p+a/pua/nua/sua/nea/oua/qOeHoeeHseeHqOeHsueHpOeHsOeHoueNs+eNrueNr+eSl+eSsueSq+eSkOeSqueSreeSseeSpeeSr+eUkOeUkeeUkueUj+eWhOeZg+eZiOeZieeZh+eapOebqeeeteeeq+eesueet+eetu+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/veeetOeeseeeqOefsOejs+ejveekgueju+ejvOejsuekheejueejvuekhOemq+emqOepnOepm+epluepmOeplOepmueqvuergOergeewheewj+evsuewgOevv+evu+ewjuevtOewi+evs+ewguewieewg+ewgeevuOevveewhuevsOevseewkOewiuezqOe4ree4vOe5gue4s+mhiOe4uOe4que5iee5gOe5h+e4qee5jOe4sOe4u+e4tue5hOe4uue9hee9v+e9vue9vee/tOe/suiArOiGu+iHhOiHjOiHiuiHheiHh+iGvOiHqeiJm+iJmuiJnOiWg+iWgOiWj+iWp+iWleiWoOiWi+iWo+iVu+iWpOiWmuiWnu+/vVwiLnNwbGl0KFwiXCIpO1xuZm9yKGogPSAwOyBqICE9IERbMjM3XS5sZW5ndGg7ICsraikgaWYoRFsyMzddW2pdLmNoYXJDb2RlQXQoMCkgIT09IDB4RkZGRCkgeyBlW0RbMjM3XVtqXV0gPSA2MDY3MiArIGo7IGRbNjA2NzIgKyBqXSA9IERbMjM3XVtqXTt9XG5EWzIzOF0gPSBcIu+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/veiVt+iVvOiWieiWoeiVuuiVuOiVl+iWjuiWluiWhuiWjeiWmeiWneiWgeiWouiWguiWiOiWheiVueiVtuiWmOiWkOiWn+iZqOievuiequiereifheiesOierOieueieteievOieruifieifg+ifguifjOiet+ier+ifhOifiuietOietuiev+ieuOieveifnuiesuikteiks+ikvOikvuilgeilkuikt+ilguimreimr+imruinsuins+isnu+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/veismOisluiskeisheisi+isouisj+iskuisleish+isjeisiOishuisnOisk+ismuixj+ixsOixsuixseixr+iyleiylOizuei1r+i5jui5jei5k+i5kOi5jOi5h+i9g+i9gOmChemBvumEuOmGmumGoumGm+mGmemGn+mGoemGnemGoOmOoemOg+mOr+mNpOmNlumNh+mNvOmNmOmNnOmNtumNiemNkOmNkemNoOmNremOj+mNjOmNqumNuemNl+mNlemNkumNj+mNsemNt+mNu+mNoemNnumNo+mNp+mOgOmNjumNmemXh+mXgOmXiemXg+mXhemWt+marumasOmarOmcoOmcn+mcmOmcnemcmememumeoemenO+/vVwiLnNwbGl0KFwiXCIpO1xuZm9yKGogPSAwOyBqICE9IERbMjM4XS5sZW5ndGg7ICsraikgaWYoRFsyMzhdW2pdLmNoYXJDb2RlQXQoMCkgIT09IDB4RkZGRCkgeyBlW0RbMjM4XVtqXV0gPSA2MDkyOCArIGo7IGRbNjA5MjggKyBqXSA9IERbMjM4XVtqXTt9XG5EWzIzOV0gPSBcIu+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/vemenumenemflemflOmfsemhgemhhOmhiumhiemhhemhg+mkpemkq+mkrOmkqumks+mksumkr+mkremksemksOmmmOmmo+mmoemogumnuumntOmnt+mnuemnuOmntumnu+mnvemnvumnvOmog+mqvumrvumrvemsgemrvOmtiOmumumuqOmunumum+mupumuoemupemupOmuhumuoumuoOmur+m0s+m1gem1p+m0tum0rum0r+m0sem0uOm0sO+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/vem1hem1gum1g+m0vum0t+m1gOm0vee/tem0rem6ium6iem6jem6sOm7iOm7mum7u+m7v+m8pOm8o+m8oum9lOm+oOWEseWEreWEruWamOWanOWal+WamuWaneWameWlsOWsvOWxqeWxquW3gOW5reW5ruaHmOaHn+aHreaHruaHseaHquaHsOaHq+aHluaHqeaTv+aUhOaTveaTuOaUgeaUg+aTvOaWlOaXm+abmuabm+abmOarheaqueaqvearoearhuaquuaqtuaqt+arh+aqtOaqreatnuavieawi+eAh+eAjOeAjeeAgeeAheeAlOeAjua/v+eAgOa/u+eApua/vOa/t+eAiueIgeeHv+eHueeIg+eHveeNtu+/vVwiLnNwbGl0KFwiXCIpO1xuZm9yKGogPSAwOyBqICE9IERbMjM5XS5sZW5ndGg7ICsraikgaWYoRFsyMzldW2pdLmNoYXJDb2RlQXQoMCkgIT09IDB4RkZGRCkgeyBlW0RbMjM5XVtqXV0gPSA2MTE4NCArIGo7IGRbNjExODQgKyBqXSA9IERbMjM5XVtqXTt9XG5EWzI0MF0gPSBcIu+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/veeSuOeTgOeSteeTgeeSvueStueSu+eTgueUlOeUk+eZnOeZpOeZmeeZkOeZk+eZl+eZmueapueaveebrOefgueeuuejv+ekjOekk+eklOekieekkOekkuekkeemreemrOepn+ewnOewqeewmeewoOewn+ewreewneewpuewqOewouewpeewsOe5nOe5kOe5lue5o+e5mOe5oue5n+e5kee5oOe5l+e5k+e+tee+s+e/t+e/uOiBteiHkeiHku+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/veiHkOiJn+iJnuiWtOiXhuiXgOiXg+iXguiWs+iWteiWveiXh+iXhOiWv+iXi+iXjuiXiOiXheiWseiWtuiXkuiYpOiWuOiWt+iWvuiZqeifp+ifpuifouifm+ifq+ifquifpeifn+ifs+ifpOiflOifnOifk+ifreifmOifo+iepOifl+ifmeiggeiftOifqOifneilk+ili+ilj+iljOilhuilkOilkeilieisquisp+iso+iss+issOisteith+isr+isvOisvuisseispeist+ispuistuisruispOisu+isveisuuixguixteiymeiymOiyl+izvui0hOi0gui0gOi5nOi5oui5oOi5l+i5lui5nui5pei5p++/vVwiLnNwbGl0KFwiXCIpO1xuZm9yKGogPSAwOyBqICE9IERbMjQwXS5sZW5ndGg7ICsraikgaWYoRFsyNDBdW2pdLmNoYXJDb2RlQXQoMCkgIT09IDB4RkZGRCkgeyBlW0RbMjQwXVtqXV0gPSA2MTQ0MCArIGo7IGRbNjE0NDAgKyBqXSA9IERbMjQwXVtqXTt9XG5EWzI0MV0gPSBcIu+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/vei5m+i5mui5oei5nei5qei5lOi9hui9h+i9iOi9i+mEqOmEuumEu+mEvumGqOmGpemGp+mGr+mGqumOtemOjOmOkumOt+mOm+mOnemOiemOp+mOjumOqumOnumOpumOlemOiOmOmemOn+mOjemOsemOkemOsumOpOmOqOmOtOmOo+mOpemXkumXk+mXkemas+mbl+mbmuW3gumbn+mbmOmbnemco+mcoumcpemerOmerumeqOmeq+mepOmequ+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/vemeoumepemfl+mfmemflumfmOmfuumhkOmhkemhkumiuOmlgemkvOmkuumoj+moi+moiemojemohOmokemoiumohemoh+mohumrgOmrnOmsiOmshOmshemsqemstemtiumtjOmti+mvh+mvhumvg+muv+mvgemutemuuOmvk+mutumvhOmuuemuvem1nOm1k+m1j+m1ium1m+m1i+m1mem1lum1jOm1l+m1kum1lOm1n+m1mOm1mum6jum6jOm7n+m8gem8gOm8lum8pem8q+m8qum8qem8qOm9jOm9leWEtOWEteWKluWLt+WOtOWaq+WareWapuWap+WaquWarOWjmuWjneWjm+WkkuWsveWsvuWsv+W3g+W5sO+/vVwiLnNwbGl0KFwiXCIpO1xuZm9yKGogPSAwOyBqICE9IERbMjQxXS5sZW5ndGg7ICsraikgaWYoRFsyNDFdW2pdLmNoYXJDb2RlQXQoMCkgIT09IDB4RkZGRCkgeyBlW0RbMjQxXVtqXV0gPSA2MTY5NiArIGo7IGRbNjE2OTYgKyBqXSA9IERbMjQxXVtqXTt9XG5EWzI0Ml0gPSBcIu+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/veW+v+aHu+aUh+aUkOaUjeaUieaUjOaUjuaWhOaXnuaXneabnuarp+aroOarjOarkearmeari+arn+arnOarkOarq+arj+arjearnuatoOausOawjOeAmeeAp+eAoOeAlueAq+eAoeeAoueAo+eAqeeAl+eApOeAnOeAqueIjOeIiueIh+eIgueIheeKpeeKpueKpOeKo+eKoeeTi+eTheeSt+eTg+eUlueZoOefieefiuefhOefseekneekm++/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/veekoeeknOekl+eknuemsOepp+epqOews+ewvOewueewrOewu+ezrOezque5tue5tee5uOe5sOe5t+e5r+e5uue5sue5tOe5qOe9i+e9iue+g+e+hue+t+e/vee/vuiBuOiHl+iHleiJpOiJoeiJo+iXq+iXseiXreiXmeiXoeiXqOiXmuiXl+iXrOiXsuiXuOiXmOiXn+iXo+iXnOiXkeiXsOiXpuiXr+iXnuiXouiggOifuuigg+iftuift+igieigjOigi+ighuifvOigiOifv+igiuigguilouilmuilm+ill+iloeilnOilmOilneilmeimiOimt+imtuintuitkOitiOitiuitgOitk+itluitlOiti+itle+/vVwiLnNwbGl0KFwiXCIpO1xuZm9yKGogPSAwOyBqICE9IERbMjQyXS5sZW5ndGg7ICsraikgaWYoRFsyNDJdW2pdLmNoYXJDb2RlQXQoMCkgIT09IDB4RkZGRCkgeyBlW0RbMjQyXVtqXV0gPSA2MTk1MiArIGo7IGRbNjE5NTIgKyBqXSA9IERbMjQyXVtqXTt9XG5EWzI0M10gPSBcIu+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/veitkeitguitkuitl+ixg+ixt+ixtuiymui0hui0h+i0iei2rOi2qui2rei2q+i5rei5uOi5s+i5qui5r+i5u+i7gui9kui9kei9j+i9kOi9k+i+tOmFgOmEv+mGsOmGremPnumPh+mPj+mPgumPmumPkOmPuemPrOmPjOmPmemOqemPpumPiumPlOmPrumPo+mPlemPhOmPjumPgOmPkumPp+mVvemXmumXm+mboemcqemcq+mcrOmcqOmcpu+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/vemes+met+metumfnemfnumfn+mhnOmhmemhnemhl+miv+mivemiu+mivumliOmlh+mlg+mmpummp+momumolemopemonemopOmom+mooumooOmop+moo+monumonOmolOmrgumsi+msiumsjumsjOmst+mvqumvq+mvoOmvnumvpOmvpumvoumvsOmvlOmvl+mvrOmvnOmvmemvpemvlemvoemvmum1t+m2gem2ium2hOm2iOm1sem2gOm1uOm2hum2i+m2jOm1vem1q+m1tOm1tem1sOm1qem2hem1s+m1u+m2gum1r+m1uem1v+m2h+m1qOm6lOm6kem7gOm7vOm8rem9gOm9gem9jem9lum9l+m9mOWMt+Wasu+/vVwiLnNwbGl0KFwiXCIpO1xuZm9yKGogPSAwOyBqICE9IERbMjQzXS5sZW5ndGg7ICsraikgaWYoRFsyNDNdW2pdLmNoYXJDb2RlQXQoMCkgIT09IDB4RkZGRCkgeyBlW0RbMjQzXVtqXV0gPSA2MjIwOCArIGo7IGRbNjIyMDggKyBqXSA9IERbMjQzXVtqXTt9XG5EWzI0NF0gPSBcIu+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/veWateWas+Wjo+WtheW3huW3h+W7ruW7r+W/gOW/geaHueaUl+aUluaUleaUk+aXn+abqOabo+abpOars+arsOarquarqOaruearsearruarr+eAvOeAteeAr+eAt+eAtOeAseeBgueAuOeAv+eAuueAueeBgOeAu+eAs+eBgeeIk+eIlOeKqOeNveeNvOeSuueaq+eaqueavuebreefjOefjuefj+efjeefsuekpeeko+ekp+ekqOekpOekqe+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/veemsueprueprOepreert+exieexiOexiuexh+exheezrue5u+e5vue6gee6gOe+uue/v+iBueiHm+iHmeiIi+iJqOiJqeiYouiXv+iYgeiXvuiYm+iYgOiXtuiYhOiYieiYheiYjOiXveigmeigkOigkeigl+igk+igluilo+ilpuimueint+itoOitquitneitqOito+itpeitp+itrei2rui6hui6iOi6hOi9mei9lui9l+i9lei9mOi9mumCjemFg+mFgemGt+mGtemGsumGs+mQi+mQk+mPu+mQoOmQj+mQlOmPvumQlemQkOmQqOmQmemQjemPtemQgOmPt+mQh+mQjumQlumQkumPuumQiemPuOmQiumPv++/vVwiLnNwbGl0KFwiXCIpO1xuZm9yKGogPSAwOyBqICE9IERbMjQ0XS5sZW5ndGg7ICsraikgaWYoRFsyNDRdW2pdLmNoYXJDb2RlQXQoMCkgIT09IDB4RkZGRCkgeyBlW0RbMjQ0XVtqXV0gPSA2MjQ2NCArIGo7IGRbNjI0NjQgKyBqXSA9IERbMjQ0XVtqXTt9XG5EWzI0NV0gPSBcIu+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/vemPvOmQjOmPtumQkemQhumXnumXoOmXn+mcrumcr+meuemeu+mfvemfvumhoOmhoumho+mhn+mjgemjgumlkOmljumlmemljOmli+mlk+mosumotOmosemorOmoqumotumoqemorumouOmoremrh+mriumrhumskOmskumskemwi+mwiOmvt+mwhemwkumvuOmxgOmwh+mwjumwhumwl+mwlOmwiem2n+m2mem2pOm2nem2kum2mOm2kOm2m++/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/vem2oOm2lOm2nOm2qum2l+m2oem2mum2oum2qOm2num2o+m2v+m2qem2lum2pum2p+m6mem6m+m6mum7pem7pOm7p+m7pum8sOm8rum9m+m9oOm9num9nem9mem+keWEuuWEueWKmOWKl+Wbg+WaveWavuWtiOWth+W3i+W3j+W7seaHveaUm+asguarvOasg+aruOasgOeBg+eBhOeBiueBiOeBieeBheeBhueIneeImueImeeNvueUl+eZquefkOekreekseekr+exlOexk+ezsue6iue6h+e6iOe6i+e6hue6jee9jee+u+iAsOiHneiYmOiYquiYpuiYn+iYo+iYnOiYmeiYp+iYruiYoeiYoOiYqeiYnuiYpe+/vVwiLnNwbGl0KFwiXCIpO1xuZm9yKGogPSAwOyBqICE9IERbMjQ1XS5sZW5ndGg7ICsraikgaWYoRFsyNDVdW2pdLmNoYXJDb2RlQXQoMCkgIT09IDB4RkZGRCkgeyBlW0RbMjQ1XVtqXV0gPSA2MjcyMCArIGo7IGRbNjI3MjAgKyBqXSA9IERbMjQ1XVtqXTt9XG5EWzI0Nl0gPSBcIu+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/veigqeigneigm+igoOigpOignOigq+ihiuilreilqeilruilq+inuuitueituOitheituuitu+i0kOi0lOi2r+i6jui6jOi9nui9m+i9nemFhumFhOmFhemGuemQv+mQu+mQtumQqemQvemQvOmQsOmQuemQqumQt+mQrOmRgOmQsemXpemXpOmXo+mctemcuumev+mfoemhpOmjiemjhumjgOmlmOmllumouemovemphumphOmpgumpgemouu+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/vemov+mrjemslemsl+msmOmslumsuumtkumwq+mwnemwnOmwrOmwo+mwqOmwqemwpOmwoem2t+m2tum2vOm3gem3h+m3ium3j+m2vum3hem3g+m2u+m2tem3jum2uem2uum2rOm3iOm2sem2rem3jOm2s+m3jem2sum5uum6nOm7q+m7rum7rem8m+m8mOm8mum8sem9jum9pem9pOm+kuS6ueWbhuWbheWbi+WlseWti+WtjOW3leW3keW7suaUoeaUoOaUpuaUouasi+asiOasieawjeeBleeBlueBl+eBkueInueIn+eKqeeNv+eTmOeTleeTmeeTl+eZreeareekteemtOepsOepseexl+exnOexmeexm+exmu+/vVwiLnNwbGl0KFwiXCIpO1xuZm9yKGogPSAwOyBqICE9IERbMjQ2XS5sZW5ndGg7ICsraikgaWYoRFsyNDZdW2pdLmNoYXJDb2RlQXQoMCkgIT09IDB4RkZGRCkgeyBlW0RbMjQ2XVtqXV0gPSA2Mjk3NiArIGo7IGRbNjI5NzYgKyBqXSA9IERbMjQ2XVtqXTt9XG5EWzI0N10gPSBcIu+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/veeztOezsee6kee9j+e+h+iHnuiJq+iYtOiYteiYs+iYrOiYsuiYtuigrOigqOigpuigquigpeilseimv+imvuinu+itvuiuhOiuguiuhuiuheitv+i0lei6lei6lOi6mui6kui6kOi6lui6l+i9oOi9oumFh+mRjOmRkOmRiumRi+mRj+mRh+mRhemRiOmRiemRhumcv+mfo+mhqumhqemji+mllOmlm+mpjumpk+mplOmpjOmpj+mpiOmpiu+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/vempiempkumpkOmrkOmsmemsq+msu+mtlumtlemxhumxiOmwv+mxhOmwuemws+mxgemwvOmwt+mwtOmwsumwvemwtum3m+m3kum3num3mum3i+m3kOm3nOm3kem3n+m3qem3mem3mOm3lum3tem3lem3nem6tum7sOm8tem8s+m8sum9gum9q+m+lem+ouWEveWKmeWjqOWjp+WlsuWtjeW3mOigr+W9j+aIgeaIg+aIhOaUqeaUpeaWluabq+askeaskuasj+aviueBm+eBmueIoueOgueOgeeOg+eZsOeflOexp+expue6leiJrOiYuuiZgOiYueiYvOiYseiYu+iYvuigsOigsuigruigs+iltuiltOils+invu+/vVwiLnNwbGl0KFwiXCIpO1xuZm9yKGogPSAwOyBqICE9IERbMjQ3XS5sZW5ndGg7ICsraikgaWYoRFsyNDddW2pdLmNoYXJDb2RlQXQoMCkgIT09IDB4RkZGRCkgeyBlW0RbMjQ3XVtqXV0gPSA2MzIzMiArIGo7IGRbNjMyMzIgKyBqXSA9IERbMjQ3XVtqXTt9XG5EWzI0OF0gPSBcIu+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/veiujOiujuiui+iuiOixhei0mei6mOi9pOi9o+mGvOmRoumRlemRnemRl+mRnumfhOmfhemggOmplumpmemsnumsn+msoOmxkumxmOmxkOmxiumxjemxi+mxlemxmemxjOmxjum3u+m3t+m3r+m3o+m3q+m3uOm3pOm3tum3oem3rum3pum3sum3sOm3oum3rOm3tOm3s+m3qOm3rem7gum7kOm7sum7s+m8hum8nOm8uOm8t+m8tum9g+m9j++/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/vem9sem9sOm9rum9r+Wbk+WbjeWtjuWxreaUreabreabruask+eBn+eBoeeBneeBoOeIo+eTm+eTpeefleekuOemt+emtuexque6l+e+ieiJreiZg+iguOigt+igteihi+iulOiulei6nui6n+i6oOi6nemGvumGvemHgumRq+mRqOmRqembpemdhumdg+mdh+mfh+mfpempnumrlemtmemxo+mxp+mxpumxoumxnumxoOm4gum3vum4h+m4g+m4hum4hem4gOm4gem4iem3v+m3vem4hOm6oOm8num9hum9tOm9tem9tuWblOaUruaWuOasmOasmeasl+asmueBoueIpueKquefmOefmeekueexqeexq+eztue6mu+/vVwiLnNwbGl0KFwiXCIpO1xuZm9yKGogPSAwOyBqICE9IERbMjQ4XS5sZW5ndGg7ICsraikgaWYoRFsyNDhdW2pdLmNoYXJDb2RlQXQoMCkgIT09IDB4RkZGRCkgeyBlW0RbMjQ4XVtqXV0gPSA2MzQ4OCArIGo7IGRbNjM0ODggKyBqXSA9IERbMjQ4XVtqXTt9XG5EWzI0OV0gPSBcIu+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/vee6mOe6m+e6meiHoOiHoeiZhuiZh+iZiOilueiluuilvOilu+inv+iumOiumei6pei6pOi6o+mRrumRremRr+mRsemRs+mdiemhsumln+mxqOmxrumxrem4i+m4jem4kOm4j+m4kum4kem6oem7tem8iem9h+m9uOm9u+m9uum9ueWcnueBpuexr+igvOi2sui6pumHg+mRtOmRuOmRtumRtempoOmxtOmxs+mxsemxtem4lOm4k+m7tum8iu+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/vem+pOeBqOeBpeezt+iZquigvuigveigv+iunuiynOi6qei7iemdi+mhs+mhtOmjjOmloemmq+mppOmppumpp+mspOm4lem4l+m9iOaIh+asnueIp+iZjOi6qOmSgumSgOmSgempqempqOmsrum4meeIqeiZi+iun+mSg+mxuem6t+eZtempq+mxuum4neeBqeeBqum6pOm9vum9iem+mOeigemKueijj+Wiu+aBkueyp+WruuKVlOKVpuKVl+KVoOKVrOKVo+KVmuKVqeKVneKVkuKVpOKVleKVnuKVquKVoeKVmOKVp+KVm+KVk+KVpeKVluKVn+KVq+KVouKVmeKVqOKVnOKVkeKVkOKVreKVruKVsOKVr+KWk++/vVwiLnNwbGl0KFwiXCIpO1xuZm9yKGogPSAwOyBqICE9IERbMjQ5XS5sZW5ndGg7ICsraikgaWYoRFsyNDldW2pdLmNoYXJDb2RlQXQoMCkgIT09IDB4RkZGRCkgeyBlW0RbMjQ5XVtqXV0gPSA2Mzc0NCArIGo7IGRbNjM3NDQgKyBqXSA9IERbMjQ5XVtqXTt9XG5yZXR1cm4ge1wiZW5jXCI6IGUsIFwiZGVjXCI6IGQgfTsgfSkoKTtcbmNwdGFibGVbMTI1MF0gPSAoZnVuY3Rpb24oKXsgdmFyIGQgPSBcIlxcdTAwMDBcXHUwMDAxXFx1MDAwMlxcdTAwMDNcXHUwMDA0XFx1MDAwNVxcdTAwMDZcXHUwMDA3XFxiXFx0XFxuXFx1MDAwYlxcZlxcclxcdTAwMGVcXHUwMDBmXFx1MDAxMFxcdTAwMTFcXHUwMDEyXFx1MDAxM1xcdTAwMTRcXHUwMDE1XFx1MDAxNlxcdTAwMTdcXHUwMDE4XFx1MDAxOVxcdTAwMWFcXHUwMDFiXFx1MDAxY1xcdTAwMWRcXHUwMDFlXFx1MDAxZiAhXFxcIiMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojs8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW1xcXFxdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+f+KCrO+/veKAmu+/veKAnuKApuKAoOKAoe+/veKAsMWg4oC5xZrFpMW9xbnvv73igJjigJnigJzigJ3igKLigJPigJTvv73ihKLFoeKAusWbxaXFvsW6wqDLh8uYxYHCpMSEwqbCp8KowqnFnsKrwqzCrcKuxbvCsMKxy5vFgsK0wrXCtsK3wrjEhcWfwrvEvcudxL7FvMWUw4HDgsSCw4TEucSGw4fEjMOJxJjDi8Saw43DjsSOxJDFg8WHw5PDlMWQw5bDl8WYxa7DmsWww5zDncWiw5/FlcOhw6LEg8OkxLrEh8OnxI3DqcSZw6vEm8Otw67Ej8SRxYTFiMOzw7TFkcO2w7fFmcWvw7rFscO8w73Fo8uZXCIsIEQgPSBbXSwgZSA9IHt9OyBmb3IodmFyIGk9MDtpIT1kLmxlbmd0aDsrK2kpIHsgaWYoZC5jaGFyQ29kZUF0KGkpICE9PSAweEZGRkQpIGVbZC5jaGFyQXQoaSldID0gaTsgRFtpXSA9IGQuY2hhckF0KGkpOyB9IHJldHVybiB7XCJlbmNcIjogZSwgXCJkZWNcIjogRCB9OyB9KSgpO1xuY3B0YWJsZVsxMjUxXSA9IChmdW5jdGlvbigpeyB2YXIgZCA9IFwiXFx1MDAwMFxcdTAwMDFcXHUwMDAyXFx1MDAwM1xcdTAwMDRcXHUwMDA1XFx1MDAwNlxcdTAwMDdcXGJcXHRcXG5cXHUwMDBiXFxmXFxyXFx1MDAwZVxcdTAwMGZcXHUwMDEwXFx1MDAxMVxcdTAwMTJcXHUwMDEzXFx1MDAxNFxcdTAwMTVcXHUwMDE2XFx1MDAxN1xcdTAwMThcXHUwMDE5XFx1MDAxYVxcdTAwMWJcXHUwMDFjXFx1MDAxZFxcdTAwMWVcXHUwMDFmICFcXFwiIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6Ozw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXFxcXF1eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX5/0ILQg+KAmtGT4oCe4oCm4oCg4oCh4oKs4oCw0InigLnQitCM0IvQj9GS4oCY4oCZ4oCc4oCd4oCi4oCT4oCU77+94oSi0ZnigLrRmtGc0ZvRn8Kg0I7RntCIwqTSkMKmwqfQgcKp0ITCq8Kswq3CrtCHwrDCsdCG0ZbSkcK1wrbCt9GR4oSW0ZTCu9GY0IXRldGX0JDQkdCS0JPQlNCV0JbQl9CY0JnQmtCb0JzQndCe0J/QoNCh0KLQo9Ck0KXQptCn0KjQqdCq0KvQrNCt0K7Qr9Cw0LHQstCz0LTQtdC20LfQuNC50LrQu9C80L3QvtC/0YDRgdGC0YPRhNGF0YbRh9GI0YnRitGL0YzRjdGO0Y9cIiwgRCA9IFtdLCBlID0ge307IGZvcih2YXIgaT0wO2khPWQubGVuZ3RoOysraSkgeyBpZihkLmNoYXJDb2RlQXQoaSkgIT09IDB4RkZGRCkgZVtkLmNoYXJBdChpKV0gPSBpOyBEW2ldID0gZC5jaGFyQXQoaSk7IH0gcmV0dXJuIHtcImVuY1wiOiBlLCBcImRlY1wiOiBEIH07IH0pKCk7XG5jcHRhYmxlWzEyNTJdID0gKGZ1bmN0aW9uKCl7IHZhciBkID0gXCJcXHUwMDAwXFx1MDAwMVxcdTAwMDJcXHUwMDAzXFx1MDAwNFxcdTAwMDVcXHUwMDA2XFx1MDAwN1xcYlxcdFxcblxcdTAwMGJcXGZcXHJcXHUwMDBlXFx1MDAwZlxcdTAwMTBcXHUwMDExXFx1MDAxMlxcdTAwMTNcXHUwMDE0XFx1MDAxNVxcdTAwMTZcXHUwMDE3XFx1MDAxOFxcdTAwMTlcXHUwMDFhXFx1MDAxYlxcdTAwMWNcXHUwMDFkXFx1MDAxZVxcdTAwMWYgIVxcXCIjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltcXFxcXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fn/igqzvv73igJrGkuKAnuKApuKAoOKAocuG4oCwxaDigLnFku+/vcW977+977+94oCY4oCZ4oCc4oCd4oCi4oCT4oCUy5zihKLFoeKAusWT77+9xb7FuMKgwqHCosKjwqTCpcKmwqfCqMKpwqrCq8Kswq3CrsKvwrDCscKywrPCtMK1wrbCt8K4wrnCusK7wrzCvcK+wr/DgMOBw4LDg8OEw4XDhsOHw4jDicOKw4vDjMONw47Dj8OQw5HDksOTw5TDlcOWw5fDmMOZw5rDm8Ocw53DnsOfw6DDocOiw6PDpMOlw6bDp8Oow6nDqsOrw6zDrcOuw6/DsMOxw7LDs8O0w7XDtsO3w7jDucO6w7vDvMO9w77Dv1wiLCBEID0gW10sIGUgPSB7fTsgZm9yKHZhciBpPTA7aSE9ZC5sZW5ndGg7KytpKSB7IGlmKGQuY2hhckNvZGVBdChpKSAhPT0gMHhGRkZEKSBlW2QuY2hhckF0KGkpXSA9IGk7IERbaV0gPSBkLmNoYXJBdChpKTsgfSByZXR1cm4ge1wiZW5jXCI6IGUsIFwiZGVjXCI6IEQgfTsgfSkoKTtcbmNwdGFibGVbMTI1M10gPSAoZnVuY3Rpb24oKXsgdmFyIGQgPSBcIlxcdTAwMDBcXHUwMDAxXFx1MDAwMlxcdTAwMDNcXHUwMDA0XFx1MDAwNVxcdTAwMDZcXHUwMDA3XFxiXFx0XFxuXFx1MDAwYlxcZlxcclxcdTAwMGVcXHUwMDBmXFx1MDAxMFxcdTAwMTFcXHUwMDEyXFx1MDAxM1xcdTAwMTRcXHUwMDE1XFx1MDAxNlxcdTAwMTdcXHUwMDE4XFx1MDAxOVxcdTAwMWFcXHUwMDFiXFx1MDAxY1xcdTAwMWRcXHUwMDFlXFx1MDAxZiAhXFxcIiMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojs8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW1xcXFxdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+f+KCrO+/veKAmsaS4oCe4oCm4oCg4oCh77+94oCw77+94oC577+977+977+977+977+94oCY4oCZ4oCc4oCd4oCi4oCT4oCU77+94oSi77+94oC677+977+977+977+9wqDOhc6GwqPCpMKlwqbCp8Kowqnvv73Cq8Kswq3CruKAlcKwwrHCssKzzoTCtcK2wrfOiM6JzorCu86Mwr3Ojs6PzpDOkc6SzpPOlM6VzpbOl86YzpnOms6bzpzOnc6ezp/OoM6h77+9zqPOpM6lzqbOp86ozqnOqs6rzqzOrc6uzq/OsM6xzrLOs860zrXOts63zrjOuc66zrvOvM69zr7Ov8+Az4HPgs+Dz4TPhc+Gz4fPiM+Jz4rPi8+Mz43Pju+/vVwiLCBEID0gW10sIGUgPSB7fTsgZm9yKHZhciBpPTA7aSE9ZC5sZW5ndGg7KytpKSB7IGlmKGQuY2hhckNvZGVBdChpKSAhPT0gMHhGRkZEKSBlW2QuY2hhckF0KGkpXSA9IGk7IERbaV0gPSBkLmNoYXJBdChpKTsgfSByZXR1cm4ge1wiZW5jXCI6IGUsIFwiZGVjXCI6IEQgfTsgfSkoKTtcbmNwdGFibGVbMTI1NF0gPSAoZnVuY3Rpb24oKXsgdmFyIGQgPSBcIlxcdTAwMDBcXHUwMDAxXFx1MDAwMlxcdTAwMDNcXHUwMDA0XFx1MDAwNVxcdTAwMDZcXHUwMDA3XFxiXFx0XFxuXFx1MDAwYlxcZlxcclxcdTAwMGVcXHUwMDBmXFx1MDAxMFxcdTAwMTFcXHUwMDEyXFx1MDAxM1xcdTAwMTRcXHUwMDE1XFx1MDAxNlxcdTAwMTdcXHUwMDE4XFx1MDAxOVxcdTAwMWFcXHUwMDFiXFx1MDAxY1xcdTAwMWRcXHUwMDFlXFx1MDAxZiAhXFxcIiMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojs8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW1xcXFxdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+f+KCrO+/veKAmsaS4oCe4oCm4oCg4oChy4bigLDFoOKAucWS77+977+977+977+94oCY4oCZ4oCc4oCd4oCi4oCT4oCUy5zihKLFoeKAusWT77+977+9xbjCoMKhwqLCo8KkwqXCpsKnwqjCqcKqwqvCrMKtwq7Cr8KwwrHCssKzwrTCtcK2wrfCuMK5wrrCu8K8wr3CvsK/w4DDgcOCw4PDhMOFw4bDh8OIw4nDisOLw4zDjcOOw4/EnsORw5LDk8OUw5XDlsOXw5jDmcOaw5vDnMSwxZ7Dn8Ogw6HDosOjw6TDpcOmw6fDqMOpw6rDq8Osw63DrsOvxJ/DscOyw7PDtMO1w7bDt8O4w7nDusO7w7zEscWfw79cIiwgRCA9IFtdLCBlID0ge307IGZvcih2YXIgaT0wO2khPWQubGVuZ3RoOysraSkgeyBpZihkLmNoYXJDb2RlQXQoaSkgIT09IDB4RkZGRCkgZVtkLmNoYXJBdChpKV0gPSBpOyBEW2ldID0gZC5jaGFyQXQoaSk7IH0gcmV0dXJuIHtcImVuY1wiOiBlLCBcImRlY1wiOiBEIH07IH0pKCk7XG5jcHRhYmxlWzEyNTVdID0gKGZ1bmN0aW9uKCl7IHZhciBkID0gXCJcXHUwMDAwXFx1MDAwMVxcdTAwMDJcXHUwMDAzXFx1MDAwNFxcdTAwMDVcXHUwMDA2XFx1MDAwN1xcYlxcdFxcblxcdTAwMGJcXGZcXHJcXHUwMDBlXFx1MDAwZlxcdTAwMTBcXHUwMDExXFx1MDAxMlxcdTAwMTNcXHUwMDE0XFx1MDAxNVxcdTAwMTZcXHUwMDE3XFx1MDAxOFxcdTAwMTlcXHUwMDFhXFx1MDAxYlxcdTAwMWNcXHUwMDFkXFx1MDAxZVxcdTAwMWYgIVxcXCIjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltcXFxcXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fn/igqzvv73igJrGkuKAnuKApuKAoOKAocuG4oCw77+94oC577+977+977+977+977+94oCY4oCZ4oCc4oCd4oCi4oCT4oCUy5zihKLvv73igLrvv73vv73vv73vv73CoMKhwqLCo+KCqsKlwqbCp8KowqnDl8KrwqzCrcKuwq/CsMKxwrLCs8K0wrXCtsK3wrjCucO3wrvCvMK9wr7Cv9aw1rHWstaz1rTWtda21rfWuNa577+91rvWvNa91r7Wv9eA14HXgteD17DXsdey17PXtO+/ve+/ve+/ve+/ve+/ve+/ve+/vdeQ15HXkteT15TXldeW15fXmNeZ15rXm9ec153Xntef16DXodei16PXpNel16bXp9eo16nXqu+/ve+/veKAjuKAj++/vVwiLCBEID0gW10sIGUgPSB7fTsgZm9yKHZhciBpPTA7aSE9ZC5sZW5ndGg7KytpKSB7IGlmKGQuY2hhckNvZGVBdChpKSAhPT0gMHhGRkZEKSBlW2QuY2hhckF0KGkpXSA9IGk7IERbaV0gPSBkLmNoYXJBdChpKTsgfSByZXR1cm4ge1wiZW5jXCI6IGUsIFwiZGVjXCI6IEQgfTsgfSkoKTtcbmNwdGFibGVbMTI1Nl0gPSAoZnVuY3Rpb24oKXsgdmFyIGQgPSBcIlxcdTAwMDBcXHUwMDAxXFx1MDAwMlxcdTAwMDNcXHUwMDA0XFx1MDAwNVxcdTAwMDZcXHUwMDA3XFxiXFx0XFxuXFx1MDAwYlxcZlxcclxcdTAwMGVcXHUwMDBmXFx1MDAxMFxcdTAwMTFcXHUwMDEyXFx1MDAxM1xcdTAwMTRcXHUwMDE1XFx1MDAxNlxcdTAwMTdcXHUwMDE4XFx1MDAxOVxcdTAwMWFcXHUwMDFiXFx1MDAxY1xcdTAwMWRcXHUwMDFlXFx1MDAxZiAhXFxcIiMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojs8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW1xcXFxdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+f+KCrNm+4oCaxpLigJ7igKbigKDigKHLhuKAsNm54oC5xZLahtqY2ojar+KAmOKAmeKAnOKAneKAouKAk+KAlNqp4oSi2pHigLrFk+KAjOKAjdq6wqDYjMKiwqPCpMKlwqbCp8KowqnavsKrwqzCrcKuwq/CsMKxwrLCs8K0wrXCtsK3wrjCudibwrvCvMK9wr7Yn9uB2KHYotij2KTYpdim2KfYqNip2KrYq9is2K3Yrtiv2LDYsdiy2LPYtNi12LbDl9i32LjYudi62YDZgdmC2YPDoNmEw6LZhdmG2YfZiMOnw6jDqcOqw6vZidmKw67Dr9mL2YzZjdmOw7TZj9mQw7fZkcO52ZLDu8O84oCO4oCP25JcIiwgRCA9IFtdLCBlID0ge307IGZvcih2YXIgaT0wO2khPWQubGVuZ3RoOysraSkgeyBpZihkLmNoYXJDb2RlQXQoaSkgIT09IDB4RkZGRCkgZVtkLmNoYXJBdChpKV0gPSBpOyBEW2ldID0gZC5jaGFyQXQoaSk7IH0gcmV0dXJuIHtcImVuY1wiOiBlLCBcImRlY1wiOiBEIH07IH0pKCk7XG5jcHRhYmxlWzEyNTddID0gKGZ1bmN0aW9uKCl7IHZhciBkID0gXCJcXHUwMDAwXFx1MDAwMVxcdTAwMDJcXHUwMDAzXFx1MDAwNFxcdTAwMDVcXHUwMDA2XFx1MDAwN1xcYlxcdFxcblxcdTAwMGJcXGZcXHJcXHUwMDBlXFx1MDAwZlxcdTAwMTBcXHUwMDExXFx1MDAxMlxcdTAwMTNcXHUwMDE0XFx1MDAxNVxcdTAwMTZcXHUwMDE3XFx1MDAxOFxcdTAwMTlcXHUwMDFhXFx1MDAxYlxcdTAwMWNcXHUwMDFkXFx1MDAxZVxcdTAwMWYgIVxcXCIjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltcXFxcXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fn/igqzvv73igJrvv73igJ7igKbigKDigKHvv73igLDvv73igLnvv73CqMuHwrjvv73igJjigJnigJzigJ3igKLigJPigJTvv73ihKLvv73igLrvv73Cr8ub77+9wqDvv73CosKjwqTvv73CpsKnw5jCqcWWwqvCrMKtwq7DhsKwwrHCssKzwrTCtcK2wrfDuMK5xZfCu8K8wr3CvsOmxITErsSAxIbDhMOFxJjEksSMw4nFucSWxKLEtsSqxLvFoMWDxYXDk8WMw5XDlsOXxbLFgcWaxarDnMW7xb3Dn8SFxK/EgcSHw6TDpcSZxJPEjcOpxbrEl8SjxLfEq8S8xaHFhMWGw7PFjcO1w7bDt8WzxYLFm8Wrw7zFvMW+y5lcIiwgRCA9IFtdLCBlID0ge307IGZvcih2YXIgaT0wO2khPWQubGVuZ3RoOysraSkgeyBpZihkLmNoYXJDb2RlQXQoaSkgIT09IDB4RkZGRCkgZVtkLmNoYXJBdChpKV0gPSBpOyBEW2ldID0gZC5jaGFyQXQoaSk7IH0gcmV0dXJuIHtcImVuY1wiOiBlLCBcImRlY1wiOiBEIH07IH0pKCk7XG5jcHRhYmxlWzEyNThdID0gKGZ1bmN0aW9uKCl7IHZhciBkID0gXCJcXHUwMDAwXFx1MDAwMVxcdTAwMDJcXHUwMDAzXFx1MDAwNFxcdTAwMDVcXHUwMDA2XFx1MDAwN1xcYlxcdFxcblxcdTAwMGJcXGZcXHJcXHUwMDBlXFx1MDAwZlxcdTAwMTBcXHUwMDExXFx1MDAxMlxcdTAwMTNcXHUwMDE0XFx1MDAxNVxcdTAwMTZcXHUwMDE3XFx1MDAxOFxcdTAwMTlcXHUwMDFhXFx1MDAxYlxcdTAwMWNcXHUwMDFkXFx1MDAxZVxcdTAwMWYgIVxcXCIjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltcXFxcXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fn/igqzvv73igJrGkuKAnuKApuKAoOKAocuG4oCw77+94oC5xZLvv73vv73vv73vv73igJjigJnigJzigJ3igKLigJPigJTLnOKEou+/veKAusWT77+977+9xbjCoMKhwqLCo8KkwqXCpsKnwqjCqcKqwqvCrMKtwq7Cr8KwwrHCssKzwrTCtcK2wrfCuMK5wrrCu8K8wr3CvsK/w4DDgcOCxILDhMOFw4bDh8OIw4nDisOLzIDDjcOOw4/EkMORzInDk8OUxqDDlsOXw5jDmcOaw5vDnMavzIPDn8Ogw6HDosSDw6TDpcOmw6fDqMOpw6rDq8yBw63DrsOvxJHDscyjw7PDtMahw7bDt8O4w7nDusO7w7zGsOKCq8O/XCIsIEQgPSBbXSwgZSA9IHt9OyBmb3IodmFyIGk9MDtpIT1kLmxlbmd0aDsrK2kpIHsgaWYoZC5jaGFyQ29kZUF0KGkpICE9PSAweEZGRkQpIGVbZC5jaGFyQXQoaSldID0gaTsgRFtpXSA9IGQuY2hhckF0KGkpOyB9IHJldHVybiB7XCJlbmNcIjogZSwgXCJkZWNcIjogRCB9OyB9KSgpO1xuY3B0YWJsZVsxMDAwMF0gPSAoZnVuY3Rpb24oKXsgdmFyIGQgPSBcIlxcdTAwMDBcXHUwMDAxXFx1MDAwMlxcdTAwMDNcXHUwMDA0XFx1MDAwNVxcdTAwMDZcXHUwMDA3XFxiXFx0XFxuXFx1MDAwYlxcZlxcclxcdTAwMGVcXHUwMDBmXFx1MDAxMFxcdTAwMTFcXHUwMDEyXFx1MDAxM1xcdTAwMTRcXHUwMDE1XFx1MDAxNlxcdTAwMTdcXHUwMDE4XFx1MDAxOVxcdTAwMWFcXHUwMDFiXFx1MDAxY1xcdTAwMWRcXHUwMDFlXFx1MDAxZiAhXFxcIiMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojs8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW1xcXFxdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+f8OEw4XDh8OJw5HDlsOcw6HDoMOiw6TDo8Olw6fDqcOow6rDq8Otw6zDrsOvw7HDs8Oyw7TDtsO1w7rDucO7w7zigKDCsMKiwqPCp+KAosK2w5/CrsKp4oSiwrTCqOKJoMOGw5jiiJ7CseKJpOKJpcKlwrXiiILiiJHiiI/PgOKIq8KqwrrihKbDpsO4wr/CocKs4oiaxpLiiYjiiIbCq8K74oCmwqDDgMODw5XFksWT4oCT4oCU4oCc4oCd4oCY4oCZw7fil4rDv8W44oGEwqTigLnigLrvrIHvrILigKHCt+KAmuKAnuKAsMOCw4rDgcOLw4jDjcOOw4/DjMOTw5Tvv73DksOaw5vDmcSxy4bLnMKvy5jLmcuawrjLncuby4dcIiwgRCA9IFtdLCBlID0ge307IGZvcih2YXIgaT0wO2khPWQubGVuZ3RoOysraSkgeyBpZihkLmNoYXJDb2RlQXQoaSkgIT09IDB4RkZGRCkgZVtkLmNoYXJBdChpKV0gPSBpOyBEW2ldID0gZC5jaGFyQXQoaSk7IH0gcmV0dXJuIHtcImVuY1wiOiBlLCBcImRlY1wiOiBEIH07IH0pKCk7XG5jcHRhYmxlWzEwMDA2XSA9IChmdW5jdGlvbigpeyB2YXIgZCA9IFwiXFx1MDAwMFxcdTAwMDFcXHUwMDAyXFx1MDAwM1xcdTAwMDRcXHUwMDA1XFx1MDAwNlxcdTAwMDdcXGJcXHRcXG5cXHUwMDBiXFxmXFxyXFx1MDAwZVxcdTAwMGZcXHUwMDEwXFx1MDAxMVxcdTAwMTJcXHUwMDEzXFx1MDAxNFxcdTAwMTVcXHUwMDE2XFx1MDAxN1xcdTAwMThcXHUwMDE5XFx1MDAxYVxcdTAwMWJcXHUwMDFjXFx1MDAxZFxcdTAwMWVcXHUwMDFmICFcXFwiIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6Ozw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXFxcXF1eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX5/w4TCucKyw4nCs8OWw5zOhcOgw6LDpM6EwqjDp8Opw6jDqsOrwqPihKLDrsOv4oCiwr3igLDDtMO2wqbCrcO5w7vDvOKAoM6TzpTOmM6bzp7OoMOfwq7Cqc6jzqrCp+KJoMKwzofOkcKx4omk4omlwqXOks6VzpbOl86ZzprOnM6mzqvOqM6pzqzOncKszp/OoeKJiM6kwqvCu+KApsKgzqXOp86GzojFk+KAk+KAleKAnOKAneKAmOKAmcO3zonOis6Mzo7Orc6uzq/PjM6Pz43Osc6yz4jOtM61z4bOs863zrnOvs66zrvOvM69zr/PgM+Oz4HPg8+EzrjPic+Cz4fPhc62z4rPi86QzrDvv71cIiwgRCA9IFtdLCBlID0ge307IGZvcih2YXIgaT0wO2khPWQubGVuZ3RoOysraSkgeyBpZihkLmNoYXJDb2RlQXQoaSkgIT09IDB4RkZGRCkgZVtkLmNoYXJBdChpKV0gPSBpOyBEW2ldID0gZC5jaGFyQXQoaSk7IH0gcmV0dXJuIHtcImVuY1wiOiBlLCBcImRlY1wiOiBEIH07IH0pKCk7XG5jcHRhYmxlWzEwMDA3XSA9IChmdW5jdGlvbigpeyB2YXIgZCA9IFwiXFx1MDAwMFxcdTAwMDFcXHUwMDAyXFx1MDAwM1xcdTAwMDRcXHUwMDA1XFx1MDAwNlxcdTAwMDdcXGJcXHRcXG5cXHUwMDBiXFxmXFxyXFx1MDAwZVxcdTAwMGZcXHUwMDEwXFx1MDAxMVxcdTAwMTJcXHUwMDEzXFx1MDAxNFxcdTAwMTVcXHUwMDE2XFx1MDAxN1xcdTAwMThcXHUwMDE5XFx1MDAxYVxcdTAwMWJcXHUwMDFjXFx1MDAxZFxcdTAwMWVcXHUwMDFmICFcXFwiIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6Ozw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXFxcXF1eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX5/0JDQkdCS0JPQlNCV0JbQl9CY0JnQmtCb0JzQndCe0J/QoNCh0KLQo9Ck0KXQptCn0KjQqdCq0KvQrNCt0K7Qr+KAoMKwwqLCo8Kn4oCiwrbQhsKuwqnihKLQgtGS4omg0IPRk+KInsKx4omk4oml0ZbCteKIgtCI0ITRlNCH0ZfQidGZ0IrRmtGY0IXCrOKImsaS4omI4oiGwqvCu+KApsKg0IvRm9CM0ZzRleKAk+KAlOKAnOKAneKAmOKAmcO34oCe0I7RntCP0Z/ihJbQgdGR0Y/QsNCx0LLQs9C00LXQttC30LjQudC60LvQvNC90L7Qv9GA0YHRgtGD0YTRhdGG0YfRiNGJ0YrRi9GM0Y3RjsKkXCIsIEQgPSBbXSwgZSA9IHt9OyBmb3IodmFyIGk9MDtpIT1kLmxlbmd0aDsrK2kpIHsgaWYoZC5jaGFyQ29kZUF0KGkpICE9PSAweEZGRkQpIGVbZC5jaGFyQXQoaSldID0gaTsgRFtpXSA9IGQuY2hhckF0KGkpOyB9IHJldHVybiB7XCJlbmNcIjogZSwgXCJkZWNcIjogRCB9OyB9KSgpO1xuY3B0YWJsZVsxMDAwOF0gPSAoZnVuY3Rpb24oKXsgdmFyIGQgPSBbXSwgZSA9IHt9LCBEID0gW10sIGo7XG5EWzBdID0gXCJcXHUwMDAwXFx1MDAwMVxcdTAwMDJcXHUwMDAzXFx1MDAwNFxcdTAwMDVcXHUwMDA2XFx1MDAwN1xcYlxcdFxcblxcdTAwMGJcXGZcXHJcXHUwMDBlXFx1MDAwZlxcdTAwMTBcXHUwMDExXFx1MDAxMlxcdTAwMTNcXHUwMDE0XFx1MDAxNVxcdTAwMTZcXHUwMDE3XFx1MDAxOFxcdTAwMTlcXHUwMDFhXFx1MDAxYlxcdTAwMWNcXHUwMDFkXFx1MDAxZVxcdTAwMWYgIVxcXCIjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltcXFxcXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fn/CgO+jmO+jme+jmu+jm++jnO+jne+jnu+jn++joO+joe+jou+jo++jpO+jpe+jpu+jp++jqO+jqe+jqu+jq++jrO+jre+jru+jr++jsO+jse+jsu+js++jtO+jte+jtu+jt++/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+juO+jue+juu+ju++jvO+jve+jvu+jv1wiLnNwbGl0KFwiXCIpO1xuZm9yKGogPSAwOyBqICE9IERbMF0ubGVuZ3RoOyArK2opIGlmKERbMF1bal0uY2hhckNvZGVBdCgwKSAhPT0gMHhGRkZEKSB7IGVbRFswXVtqXV0gPSAwICsgajsgZFswICsgal0gPSBEWzBdW2pdO31cbkRbMTYxXSA9IFwi77+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+944CA44CB44CC44O7y4nLh8Ko44CD44CF4oCV772e77+94oCm4oCY4oCZ4oCc4oCd44CU44CV44CI44CJ44CK44CL44CM44CN44CO44CP44CW44CX44CQ44CRwrHDl8O34oi24oin4oio4oiR4oiP4oiq4oip4oiI4oi34oia4oql4oil4oig4oyS4oqZ4oir4oiu4omh4omM4omI4oi94oid4omg4omu4omv4omk4oml4oie4oi14oi04pmC4pmAwrDigLLigLPihIPvvITCpO+/oO+/oeKAsMKn4oSW4piG4piF4peL4peP4peO4peH4peG4pah4pag4paz4pay4oC74oaS4oaQ4oaR4oaT44CT77+9XCIuc3BsaXQoXCJcIik7XG5mb3IoaiA9IDA7IGogIT0gRFsxNjFdLmxlbmd0aDsgKytqKSBpZihEWzE2MV1bal0uY2hhckNvZGVBdCgwKSAhPT0gMHhGRkZEKSB7IGVbRFsxNjFdW2pdXSA9IDQxMjE2ICsgajsgZFs0MTIxNiArIGpdID0gRFsxNjFdW2pdO31cbkRbMTYyXSA9IFwi77+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+94pKI4pKJ4pKK4pKL4pKM4pKN4pKO4pKP4pKQ4pKR4pKS4pKT4pKU4pKV4pKW4pKX4pKY4pKZ4pKa4pKb4pG04pG14pG24pG34pG44pG54pG64pG74pG84pG94pG+4pG/4pKA4pKB4pKC4pKD4pKE4pKF4pKG4pKH4pGg4pGh4pGi4pGj4pGk4pGl4pGm4pGn4pGo4pGp77+977+944ig44ih44ii44ij44ik44il44im44in44io44ip77+977+94oWg4oWh4oWi4oWj4oWk4oWl4oWm4oWn4oWo4oWp4oWq4oWr77+977+977+9XCIuc3BsaXQoXCJcIik7XG5mb3IoaiA9IDA7IGogIT0gRFsxNjJdLmxlbmd0aDsgKytqKSBpZihEWzE2Ml1bal0uY2hhckNvZGVBdCgwKSAhPT0gMHhGRkZEKSB7IGVbRFsxNjJdW2pdXSA9IDQxNDcyICsgajsgZFs0MTQ3MiArIGpdID0gRFsxNjJdW2pdO31cbkRbMTYzXSA9IFwi77+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977yB77yC77yD77+l77yF77yG77yH77yI77yJ77yK77yL77yM77yN77yO77yP77yQ77yR77yS77yT77yU77yV77yW77yX77yY77yZ77ya77yb77yc77yd77ye77yf77yg77yh77yi77yj77yk77yl77ym77yn77yo77yp77yq77yr77ys77yt77yu77yv77yw77yx77yy77yz77y077y177y277y377y477y577y677y777y877y977y+77y/772A772B772C772D772E772F772G772H772I772J772K772L772M772N772O772P772Q772R772S772T772U772V772W772X772Y772Z772a772b772c772d77+j77+9XCIuc3BsaXQoXCJcIik7XG5mb3IoaiA9IDA7IGogIT0gRFsxNjNdLmxlbmd0aDsgKytqKSBpZihEWzE2M11bal0uY2hhckNvZGVBdCgwKSAhPT0gMHhGRkZEKSB7IGVbRFsxNjNdW2pdXSA9IDQxNzI4ICsgajsgZFs0MTcyOCArIGpdID0gRFsxNjNdW2pdO31cbkRbMTY0XSA9IFwi77+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+944GB44GC44GD44GE44GF44GG44GH44GI44GJ44GK44GL44GM44GN44GO44GP44GQ44GR44GS44GT44GU44GV44GW44GX44GY44GZ44Ga44Gb44Gc44Gd44Ge44Gf44Gg44Gh44Gi44Gj44Gk44Gl44Gm44Gn44Go44Gp44Gq44Gr44Gs44Gt44Gu44Gv44Gw44Gx44Gy44Gz44G044G144G244G344G444G544G644G744G844G944G+44G/44KA44KB44KC44KD44KE44KF44KG44KH44KI44KJ44KK44KL44KM44KN44KO44KP44KQ44KR44KS44KT77+977+977+977+977+977+977+977+977+977+977+977+9XCIuc3BsaXQoXCJcIik7XG5mb3IoaiA9IDA7IGogIT0gRFsxNjRdLmxlbmd0aDsgKytqKSBpZihEWzE2NF1bal0uY2hhckNvZGVBdCgwKSAhPT0gMHhGRkZEKSB7IGVbRFsxNjRdW2pdXSA9IDQxOTg0ICsgajsgZFs0MTk4NCArIGpdID0gRFsxNjRdW2pdO31cbkRbMTY1XSA9IFwi77+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+944Kh44Ki44Kj44Kk44Kl44Km44Kn44Ko44Kp44Kq44Kr44Ks44Kt44Ku44Kv44Kw44Kx44Ky44Kz44K044K144K244K344K444K544K644K744K844K944K+44K/44OA44OB44OC44OD44OE44OF44OG44OH44OI44OJ44OK44OL44OM44ON44OO44OP44OQ44OR44OS44OT44OU44OV44OW44OX44OY44OZ44Oa44Ob44Oc44Od44Oe44Of44Og44Oh44Oi44Oj44Ok44Ol44Om44On44Oo44Op44Oq44Or44Os44Ot44Ou44Ov44Ow44Ox44Oy44Oz44O044O144O277+977+977+977+977+977+977+977+977+9XCIuc3BsaXQoXCJcIik7XG5mb3IoaiA9IDA7IGogIT0gRFsxNjVdLmxlbmd0aDsgKytqKSBpZihEWzE2NV1bal0uY2hhckNvZGVBdCgwKSAhPT0gMHhGRkZEKSB7IGVbRFsxNjVdW2pdXSA9IDQyMjQwICsgajsgZFs0MjI0MCArIGpdID0gRFsxNjVdW2pdO31cbkRbMTY2XSA9IFwi77+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+9zpHOks6TzpTOlc6WzpfOmM6ZzprOm86czp3Ons6fzqDOoc6jzqTOpc6mzqfOqM6p77+977+977+977+977+977+977+977+9zrHOss6zzrTOtc62zrfOuM65zrrOu868zr3Ovs6/z4DPgc+Dz4TPhc+Gz4fPiM+J77+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+9XCIuc3BsaXQoXCJcIik7XG5mb3IoaiA9IDA7IGogIT0gRFsxNjZdLmxlbmd0aDsgKytqKSBpZihEWzE2Nl1bal0uY2hhckNvZGVBdCgwKSAhPT0gMHhGRkZEKSB7IGVbRFsxNjZdW2pdXSA9IDQyNDk2ICsgajsgZFs0MjQ5NiArIGpdID0gRFsxNjZdW2pdO31cbkRbMTY3XSA9IFwi77+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+90JDQkdCS0JPQlNCV0IHQltCX0JjQmdCa0JvQnNCd0J7Qn9Cg0KHQotCj0KTQpdCm0KfQqNCp0KrQq9Cs0K3QrtCv77+977+977+977+977+977+977+977+977+977+977+977+977+977+977+90LDQsdCy0LPQtNC10ZHQttC30LjQudC60LvQvNC90L7Qv9GA0YHRgtGD0YTRhdGG0YfRiNGJ0YrRi9GM0Y3RjtGP77+977+977+977+977+977+977+977+977+977+977+977+977+977+9XCIuc3BsaXQoXCJcIik7XG5mb3IoaiA9IDA7IGogIT0gRFsxNjddLmxlbmd0aDsgKytqKSBpZihEWzE2N11bal0uY2hhckNvZGVBdCgwKSAhPT0gMHhGRkZEKSB7IGVbRFsxNjddW2pdXSA9IDQyNzUyICsgajsgZFs0Mjc1MiArIGpdID0gRFsxNjddW2pdO31cbkRbMTY4XSA9IFwi77+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+9xIHDoceOw6DEk8OpxJvDqMSrw63HkMOsxY3Ds8eSw7LFq8O6x5TDuceWx5jHmsecw7zDqu+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/veOEheOEhuOEh+OEiOOEieOEiuOEi+OEjOOEjeOEjuOEj+OEkOOEkeOEkuOEk+OElOOEleOEluOEl+OEmOOEmeOEmuOEm+OEnOOEneOEnuOEn+OEoOOEoeOEouOEo+OEpOOEpeOEpuOEp+OEqOOEqe+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/vVwiLnNwbGl0KFwiXCIpO1xuZm9yKGogPSAwOyBqICE9IERbMTY4XS5sZW5ndGg7ICsraikgaWYoRFsxNjhdW2pdLmNoYXJDb2RlQXQoMCkgIT09IDB4RkZGRCkgeyBlW0RbMTY4XVtqXV0gPSA0MzAwOCArIGo7IGRbNDMwMDggKyBqXSA9IERbMTY4XVtqXTt9XG5EWzE2OV0gPSBcIu+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/veKUgOKUgeKUguKUg+KUhOKUheKUhuKUh+KUiOKUieKUiuKUi+KUjOKUjeKUjuKUj+KUkOKUkeKUkuKUk+KUlOKUleKUluKUl+KUmOKUmeKUmuKUm+KUnOKUneKUnuKUn+KUoOKUoeKUouKUo+KUpOKUpeKUpuKUp+KUqOKUqeKUquKUq+KUrOKUreKUruKUr+KUsOKUseKUsuKUs+KUtOKUteKUtuKUt+KUuOKUueKUuuKUu+KUvOKUveKUvuKUv+KVgOKVgeKVguKVg+KVhOKVheKVhuKVh+KViOKVieKViuKVi++/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/vVwiLnNwbGl0KFwiXCIpO1xuZm9yKGogPSAwOyBqICE9IERbMTY5XS5sZW5ndGg7ICsraikgaWYoRFsxNjldW2pdLmNoYXJDb2RlQXQoMCkgIT09IDB4RkZGRCkgeyBlW0RbMTY5XVtqXV0gPSA0MzI2NCArIGo7IGRbNDMyNjQgKyBqXSA9IERbMTY5XVtqXTt9XG5EWzE3Nl0gPSBcIu+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/veWViumYv+Wfg+aMqOWTjuWUieWTgOeakeeZjOiUvOefruiJvueijeeIsemamOmejeawqOWuieS/uuaMieaal+WyuOiDuuahiOiCruaYguebjuWHueaVlueGrOe/seiihOWCsuWlpeaHiua+s+iKreaNjOaJkuWPreWQp+eshuWFq+eWpOW3tOaLlOi3i+mdtuaKiuiAmeWdnemcuOe9oueIuOeZveafj+eZvuaRhuS9sOi0peaLnOeol+aWkeePreaQrOaJs+iIrOmigeadv+eJiOaJruaLjOS8tOeTo+WNiuWKnue7iumCpuW4ruaihuamnOiGgOe7keajkuejheiajOmVkeWCjeiwpOiLnuiDnuWMheikkuWJpe+/vVwiLnNwbGl0KFwiXCIpO1xuZm9yKGogPSAwOyBqICE9IERbMTc2XS5sZW5ndGg7ICsraikgaWYoRFsxNzZdW2pdLmNoYXJDb2RlQXQoMCkgIT09IDB4RkZGRCkgeyBlW0RbMTc2XVtqXV0gPSA0NTA1NiArIGo7IGRbNDUwNTYgKyBqXSA9IERbMTc2XVtqXTt9XG5EWzE3N10gPSBcIu+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/veiWhOmbueS/neWgoemlseWuneaKseaKpeaatOixuemyjeeIhuadr+eikeaCsuWNkeWMl+i+iOiDjOi0nemSoeWAjeeLiOWkh+aDq+eEmeiiq+WllOiLr+acrOesqOW0qee7t+eUreaztei5pui/uOmAvOm8u+avlOmEmeeslOW9vOeip+iTluiUveavleavmeavluW4geW6h+eXuemXreaVneW8iuW/hei+n+WjgeiHgumBv+mZm+merei+uee8lui0rOaJgeS+v+WPmOWNnui+qOi+qei+q+mBjeagh+W9quiGmOihqOmzluaGi+WIq+eYquW9rOaWjOa/kua7qOWuvuaRiOWFteWGsOafhOS4meeniemlvOeCs++/vVwiLnNwbGl0KFwiXCIpO1xuZm9yKGogPSAwOyBqICE9IERbMTc3XS5sZW5ndGg7ICsraikgaWYoRFsxNzddW2pdLmNoYXJDb2RlQXQoMCkgIT09IDB4RkZGRCkgeyBlW0RbMTc3XVtqXV0gPSA0NTMxMiArIGo7IGRbNDUzMTIgKyBqXSA9IERbMTc3XVtqXTt9XG5EWzE3OF0gPSBcIu+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/veeXheW5tueOu+iPoOaSreaLqOmSteazouWNmuWLg+aQj+mTgueulOS8r+W4m+iItuiEluiGiua4pOaziumps+aNleWNnOWTuuihpeWfoOS4jeW4g+atpeewv+mDqOaAluaTpueMnOijgeadkOaJjei0ouedrOi4qemHh+W9qeiPnOiUoemkkOWPguialeaui+aDreaDqOeBv+iLjeiIseS7k+ayp+iXj+aTjeezmeanveabueiNieWOleetluS+p+WGjOa1i+Wxgui5reaPkuWPieiMrOiMtuafpeeitOaQveWvn+WylOW3ruivp+aLhuaftOixuuaQgOaOuuidiemmi+iwl+e8oOmTsuS6p+mYkOmipOaYjOeMlu+/vVwiLnNwbGl0KFwiXCIpO1xuZm9yKGogPSAwOyBqICE9IERbMTc4XS5sZW5ndGg7ICsraikgaWYoRFsxNzhdW2pdLmNoYXJDb2RlQXQoMCkgIT09IDB4RkZGRCkgeyBlW0RbMTc4XVtqXV0gPSA0NTU2OCArIGo7IGRbNDU1NjggKyBqXSA9IERbMTc4XVtqXTt9XG5EWzE3OV0gPSBcIu+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/veWcuuWwneW4uOmVv+WBv+iCoOWOguaVnueVheWUseWAoei2heaKhOmSnuacneWYsua9ruW3ouWQteeCkui9puaJr+aSpOaOo+W9u+a+iOmDtOiHo+i+sOWwmOaZqOW/seayiemZiOi2geihrOaSkeensOWfjuapmeaIkOWRiOS5mOeoi+aDqea+hOivmuaJv+mAnumqi+enpOWQg+eXtOaMgeWMmeaxoOi/n+W8m+mpsOiAu+m9v+S+iOWwuui1pOe/heaWpeeCveWFheWGsuiZq+W0h+WuoOaKvemFrOeVtOi4jOeooOaEgeetueS7h+e7uOeeheS4keiHreWIneWHuuapseWOqOi6h+mUhOmbj+a7gemZpOalmu+/vVwiLnNwbGl0KFwiXCIpO1xuZm9yKGogPSAwOyBqICE9IERbMTc5XS5sZW5ndGg7ICsraikgaWYoRFsxNzldW2pdLmNoYXJDb2RlQXQoMCkgIT09IDB4RkZGRCkgeyBlW0RbMTc5XVtqXV0gPSA0NTgyNCArIGo7IGRbNDU4MjQgKyBqXSA9IERbMTc5XVtqXTt9XG5EWzE4MF0gPSBcIu+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/veehgOWCqOefl+aQkOinpuWkhOaPo+W3neepv+akveS8oOiIueWWmOS4sueWrueql+W5ouW6iumXr+WIm+WQueeCiuaNtumUpOWeguaYpeakv+mGh+WUh+a3s+e6r+igouaIs+e7sOeWteiMqOejgembjOi+nuaFiOeTt+ivjeatpOWIuui1kOasoeiBquiRseWbseWMhuS7juS4m+WHkeeyl+mGi+ewh+S/g+i5v+evoeeqnOaRp+W0lOWCrOiEhueYgeeyuea3rOe/oOadkeWtmOWvuOeji+aSruaQk+aOquaMq+mUmeaQrei+vuetlOeYqeaJk+Wkp+WRhuatueWCo+aItOW4puauhuS7o+i0t+iii+W+hemAru+/vVwiLnNwbGl0KFwiXCIpO1xuZm9yKGogPSAwOyBqICE9IERbMTgwXS5sZW5ndGg7ICsraikgaWYoRFsxODBdW2pdLmNoYXJDb2RlQXQoMCkgIT09IDB4RkZGRCkgeyBlW0RbMTgwXVtqXV0gPSA0NjA4MCArIGo7IGRbNDYwODAgKyBqXSA9IERbMTgwXVtqXTt9XG5EWzE4MV0gPSBcIu+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/veaAoOiAveaLheS4ueWNlemDuOaOuOiDhuaXpuawruS9huaDrua3oeivnuW8ueibi+W9k+aMoeWFmuiNoeaho+WIgOaNo+i5iOWAkuWym+elt+WvvOWIsOeou+aCvOmBk+ebl+W+t+W+l+eahOi5rOeBr+eZu+etieeequWHs+mCk+WgpOS9jua7tOi/quaVjOesm+eLhOa2pOe/n+WroeaKteW6leWcsOiSguesrOW4neW8n+mAkue8lOmioOaOgua7h+eimOeCueWFuOmdm+Weq+eUteS9g+eUuOW6l+aDpuWloOa3gOauv+eiieWPvOmbleWHi+WIgeaOieWQiumSk+iwg+i3jOeIueein+idtui/reiwjeWPoO+/vVwiLnNwbGl0KFwiXCIpO1xuZm9yKGogPSAwOyBqICE9IERbMTgxXS5sZW5ndGg7ICsraikgaWYoRFsxODFdW2pdLmNoYXJDb2RlQXQoMCkgIT09IDB4RkZGRCkgeyBlW0RbMTgxXVtqXV0gPSA0NjMzNiArIGo7IGRbNDYzMzYgKyBqXSA9IERbMTgxXVtqXTt9XG5EWzE4Ml0gPSBcIu+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/veS4geebr+WPrumSiemhtum8jumUreWumuiuouS4ouS4nOWGrOiRo+aHguWKqOagi+S+l+aBq+WGu+a0nuWFnOaKluaWl+mZoeixhumAl+eXmOmDveedo+avkueKiueLrOivu+Wgteeduei1jOadnOmVgOiCmuW6pua4oeWmkuerr+efremUu+auteaWree8juWghuWFkemYn+WvueWiqeWQqOi5suaVpumhv+WbpOmSneebvumBgeaOh+WThuWkmuWkuuWem+i6suactei3uuiIteWJgeaDsOWgleibvuWzqOm5heS/hOmineiuueWopeaBtuWOhOaJvOmBj+mEgumlv+aBqeiAjOWEv+iAs+WwlOmltea0seS6jO+/vVwiLnNwbGl0KFwiXCIpO1xuZm9yKGogPSAwOyBqICE9IERbMTgyXS5sZW5ndGg7ICsraikgaWYoRFsxODJdW2pdLmNoYXJDb2RlQXQoMCkgIT09IDB4RkZGRCkgeyBlW0RbMTgyXVtqXV0gPSA0NjU5MiArIGo7IGRbNDY1OTIgKyBqXSA9IERbMTgyXVtqXTt9XG5EWzE4M10gPSBcIu+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/vei0sOWPkee9muetj+S8kOS5j+mYgOazleePkOiXqeW4hueVque/u+aoiuefvumSkue5geWHoeeDpuWPjei/lOiMg+i0qeeKr+mlreazm+WdiuiKs+aWueiCquaIv+mYsuWmqOS7v+iuv+e6uuaUvuiPsumdnuWVoemjnuiCpeWMquivveWQoOiCuuW6n+ayuOi0ueiKrOmFmuWQqeawm+WIhue6t+Wdn+eEmuaxvueyieWli+S7veW/v+aEpOeyquS4sOWwgeaeq+icguWzsOmUi+mjjueWr+eDvemAouWGr+e8neiuveWlieWHpOS9m+WQpuWkq+aVt+iCpOWtteaJtuaLgui+kOW5heawn+espuS8j+S/mOacje+/vVwiLnNwbGl0KFwiXCIpO1xuZm9yKGogPSAwOyBqICE9IERbMTgzXS5sZW5ndGg7ICsraikgaWYoRFsxODNdW2pdLmNoYXJDb2RlQXQoMCkgIT09IDB4RkZGRCkgeyBlW0RbMTgzXVtqXV0gPSA0Njg0OCArIGo7IGRbNDY4NDggKyBqXSA9IERbMTgzXVtqXTt9XG5EWzE4NF0gPSBcIu+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/vea1rua2quemj+iiseW8l+eUq+aKmui+heS/r+mHnOaWp+iEr+iFkeW6nOiFkOi1tOWJr+imhui1i+WkjeWCheS7mOmYnOeItuiFuei0n+WvjOiuo+mZhOWmh+e8muWSkOWZtuWYjuivpeaUueamgumSmeeblua6ieW5sueUmOadhuafkeerv+iCnei1tuaEn+enhuaVoui1o+WGiOWImumSoue8uOiCm+e6suWyl+a4r+adoOevmeeai+mrmOiGj+e+lOezleaQnumVkOeov+WRiuWTpeatjOaQgeaIiOm4veiDs+eWmeWJsumdqeiRm+agvOibpOmYgemalOmTrOS4quWQhOe7meaguei3n+iAleabtOW6mue+ue+/vVwiLnNwbGl0KFwiXCIpO1xuZm9yKGogPSAwOyBqICE9IERbMTg0XS5sZW5ndGg7ICsraikgaWYoRFsxODRdW2pdLmNoYXJDb2RlQXQoMCkgIT09IDB4RkZGRCkgeyBlW0RbMTg0XVtqXV0gPSA0NzEwNCArIGo7IGRbNDcxMDQgKyBqXSA9IERbMTg0XVtqXTt9XG5EWzE4NV0gPSBcIu+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/veWfguiAv+ail+W3peaUu+WKn+aBrem+muS+m+i6rOWFrOWuq+W8k+W3qeaxnuaLsei0oeWFsemSqeWLvuayn+iLn+eLl+WeouaehOi0reWkn+i+nOiPh+WSleeujeS8sOayveWtpOWnkem8k+WPpOibiumqqOiwt+iCoeaVhemhvuWbuumbh+WIrueTnOWJkOWvoeaMguikguS5luaLkOaAquajuuWFs+WumOWGoOingueuoemmhue9kOaDr+eBjOi0r+WFieW5v+mAm+eRsOinhOWcreehheW9kum+n+mXuui9qOmsvOivoeeZuOahguafnOi3qui0teWIvei+iua7muajjemUhemDreWbveaenOijuei/h+WTiO+/vVwiLnNwbGl0KFwiXCIpO1xuZm9yKGogPSAwOyBqICE9IERbMTg1XS5sZW5ndGg7ICsraikgaWYoRFsxODVdW2pdLmNoYXJDb2RlQXQoMCkgIT09IDB4RkZGRCkgeyBlW0RbMTg1XVtqXV0gPSA0NzM2MCArIGo7IGRbNDczNjAgKyBqXSA9IERbMTg1XVtqXTt9XG5EWzE4Nl0gPSBcIu+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/vemquOWtqea1t+awpuS6peWus+mqh+mFo+aGqOmCr+mfqeWQq+a2teWvkuWHveWWiue9lee/sOaSvOaNjeaXseaGvuaCjeeEiuaxl+axieWkr+adreiIquWjleWajuixquavq+mDneWlveiAl+WPt+a1qeWRteWWneiNt+iPj+aguOemvuWSjOS9leWQiOebkuiyiemYguays+a2uOi1q+ikkOm5pOi0uuWYv+m7keeXleW+iOeLoOaBqOWTvOS6qOaoquihoeaBkui9sOWThOeDmOiZuem4v+a0quWuj+W8mOe6ouWWieS+r+eMtOWQvOWOmuWAmeWQjuWRvOS5juW/veeRmuWjtuiRq+iDoeidtOeLkOeziua5lu+/vVwiLnNwbGl0KFwiXCIpO1xuZm9yKGogPSAwOyBqICE9IERbMTg2XS5sZW5ndGg7ICsraikgaWYoRFsxODZdW2pdLmNoYXJDb2RlQXQoMCkgIT09IDB4RkZGRCkgeyBlW0RbMTg2XVtqXV0gPSA0NzYxNiArIGo7IGRbNDc2MTYgKyBqXSA9IERbMTg2XVtqXTt9XG5EWzE4N10gPSBcIu+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/veW8p+iZjuWUrOaKpOS6kuayquaIt+iKseWTl+WNjueMvua7keeUu+WIkuWMluivneankOW+iuaAgOa3ruWdj+asoueOr+ahk+i/mOe8k+aNouaCo+WUpOeXquixoueElea2o+WupuW5u+iNkuaFjOm7hOejuuidl+ewp+eah+WHsOaDtueFjOaZg+W5jOaBjeiwjueBsOaMpei+ieW+veaBouiblOWbnuavgeaClOaFp+WNieaDoOaZpui0v+enveS8mueDqeaxh+ius+ivsue7mOiNpOaYj+Wpmumtgua1kea3t+ixgea0u+S8meeBq+iOt+aIluaDkemcjei0p+eluOWHu+WcvuWfuuacuueVuOeoveenr+eule+/vVwiLnNwbGl0KFwiXCIpO1xuZm9yKGogPSAwOyBqICE9IERbMTg3XS5sZW5ndGg7ICsraikgaWYoRFsxODddW2pdLmNoYXJDb2RlQXQoMCkgIT09IDB4RkZGRCkgeyBlW0RbMTg3XVtqXV0gPSA0Nzg3MiArIGo7IGRbNDc4NzIgKyBqXSA9IERbMTg3XVtqXTt9XG5EWzE4OF0gPSBcIu+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/veiCjOmlpei/uea/gOiupem4oeWnrOe7qee8ieWQieaegeajmOi+keexjembhuWPiuaApeeWvuaxsuWNs+Wriee6p+aMpOWHoOiEiuW3seiTn+aKgOWGgOWto+S8juelreWJguaCuOa1juWvhOWvguiuoeiusOaXouW/jOmZheWmk+e7p+e6quWYieaet+WkueS9s+WutuWKoOiNmumiiui0vueUsumSvuWBh+eovOS7t+aetumpvuWrgeatvOebkeWdmuWwluesuumXtOeFjuWFvOiCqeiJsOWluOe8hOiMp+ajgOafrOeiseeht+aLo+aNoeeugOS/reWJquWHj+iNkOanm+mJtOi3tei0seingemUrueureS7tu+/vVwiLnNwbGl0KFwiXCIpO1xuZm9yKGogPSAwOyBqICE9IERbMTg4XS5sZW5ndGg7ICsraikgaWYoRFsxODhdW2pdLmNoYXJDb2RlQXQoMCkgIT09IDB4RkZGRCkgeyBlW0RbMTg4XVtqXV0gPSA0ODEyOCArIGo7IGRbNDgxMjggKyBqXSA9IERbMTg4XVtqXTt9XG5EWzE4OV0gPSBcIu+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/veWBpeiIsOWJkemlr+a4kOa6hea2p+W7uuWDteWnnOWwhua1huaxn+eWhuiSi+ahqOWlluiusuWMoOmFsemZjeiVieakkuekgeeEpuiDtuS6pOmDiua1h+mqhOWoh+WavOaQhemTsOefq+S+peiEmueLoeinkumluue8tOe7nuWJv+aVmemFtei9v+i+g+WPq+eqluaPreaOpeeahuenuOihl+mYtuaIquWKq+iKguahlOadsOaNt+edq+errea0gee7k+ino+WnkOaIkuiXieiKpeeVjOWAn+S7i+eWpeivq+WxiuW3vueti+aWpOmHkeS7iua0peiln+e0p+mUpuS7heiwqOi/m+mds+aZi+emgei/keeDrOa1uO+/vVwiLnNwbGl0KFwiXCIpO1xuZm9yKGogPSAwOyBqICE9IERbMTg5XS5sZW5ndGg7ICsraikgaWYoRFsxODldW2pdLmNoYXJDb2RlQXQoMCkgIT09IDB4RkZGRCkgeyBlW0RbMTg5XVtqXV0gPSA0ODM4NCArIGo7IGRbNDgzODQgKyBqXSA9IERbMTg5XVtqXTt9XG5EWzE5MF0gPSBcIu+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/veWwveWKsuiNhuWFouiMjuedm+aZtumyuOS6rOaDiueyvueys+e7j+S6leitpuaZr+miiOmdmeWig+aVrOmVnOW+hOeXiemdluern+ernuWHgOeCr+eqmOaPqueptue6oOeOlumfreS5heeBuOS5nemFkuWOqeaVkeaXp+iHvOiIheWSjuWwseeWmumeoOaLmOeLmeeWveWxhempueiPiuWxgOWSgOefqeS4vuayruiBmuaLkuaNruW3qOWFt+i3nei4numUr+S/seWPpeaDp+eCrOWJp+aNkOm5g+Won+WApuect+WNt+e7ouaSheaUq+aKieaOmOWAlOeIteinieWGs+ivgOe7neWdh+iPjOmSp+WGm+WQm+Wzu++/vVwiLnNwbGl0KFwiXCIpO1xuZm9yKGogPSAwOyBqICE9IERbMTkwXS5sZW5ndGg7ICsraikgaWYoRFsxOTBdW2pdLmNoYXJDb2RlQXQoMCkgIT09IDB4RkZGRCkgeyBlW0RbMTkwXVtqXV0gPSA0ODY0MCArIGo7IGRbNDg2NDAgKyBqXSA9IERbMTkwXVtqXTt9XG5EWzE5MV0gPSBcIu+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/veS/iuero+a1mumDoemqj+WWgOWSluWNoeWSr+W8gOaPqealt+WHr+aFqOWIiuWgquWLmOWdjuegjeeci+W6t+aFt+ezoOaJm+aKl+S6oueCleiAg+aLt+eDpOmdoOWdt+iLm+afr+ajteejlemil+enkeWjs+WSs+WPr+a4tOWFi+WIu+WuouivvuiCr+WVg+WepuaBs+WdkeWQreepuuaBkOWtlOaOp+aKoOWPo+aJo+Wvh+aer+WTreeqn+iLpumFt+W6k+ijpOWkuOWeruaMjui3qOiDr+Wdl+ett+S+qeW/q+WuveasvuWMoeetkOeLguahhuefv+ectuaXt+WGteS6j+eblOWyv+eqpeiRteWljumtgeWCgO+/vVwiLnNwbGl0KFwiXCIpO1xuZm9yKGogPSAwOyBqICE9IERbMTkxXS5sZW5ndGg7ICsraikgaWYoRFsxOTFdW2pdLmNoYXJDb2RlQXQoMCkgIT09IDB4RkZGRCkgeyBlW0RbMTkxXVtqXV0gPSA0ODg5NiArIGo7IGRbNDg4OTYgKyBqXSA9IERbMTkxXVtqXTt9XG5EWzE5Ml0gPSBcIu+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/vemmiOaEp+a6g+WdpOaYhuaNhuWbsOaLrOaJqeW7k+mYlOWeg+aLieWWh+icoeiFiui+o+WVpuiOseadpei1luiTneWpquagj+aLpuevrumYkeWFsOa+nOiwsOaPveiniOaHkue8hueDgua7peeQheamlOeLvOW7iumDjuacl+a1quaNnuWKs+eJouiAgeS9rOWnpemFqueDmea2neWLkuS5kOmbt+mVreiVvuejiue0r+WEoeWekuaTguiCi+exu+azquajsealnuWGt+WOmOaiqOeKgem7juevseeLuOemu+a8k+eQhuadjumHjOmypOekvOiOieiNlOWQj+agl+S4veWOieWKseegvuWOhuWIqeWCiOS+i+S/kO+/vVwiLnNwbGl0KFwiXCIpO1xuZm9yKGogPSAwOyBqICE9IERbMTkyXS5sZW5ndGg7ICsraikgaWYoRFsxOTJdW2pdLmNoYXJDb2RlQXQoMCkgIT09IDB4RkZGRCkgeyBlW0RbMTkyXVtqXV0gPSA0OTE1MiArIGo7IGRbNDkxNTIgKyBqXSA9IERbMTkyXVtqXTt9XG5EWzE5M10gPSBcIu+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/veeXoueri+eykuaypematuWKm+eSg+WTqeS/qeiBlOiOsui/numVsOW7ieaAnOa2n+W4mOaVm+iEuOmTvuaBi+eCvOe7g+eyruWHieaigeeyseiJr+S4pOi+humHj+aZvuS6ruiwheaSqeiBiuWDmueWl+eHjuWvpei+vea9puS6huaSgumVo+W7luaWmeWIl+ijgueDiOWKo+eMjueQs+ael+ejt+mcluS4tOmCu+mznua3i+WHm+i1geWQneaLjueOsuiPsembtum+hOmTg+S8tue+muWHjOeBtemZteWyremihuWPpuS7pOa6nOeQieamtOehq+mmj+eVmeWImOeYpOa1geafs+WFrem+meiBi+WSmeesvOeqv++/vVwiLnNwbGl0KFwiXCIpO1xuZm9yKGogPSAwOyBqICE9IERbMTkzXS5sZW5ndGg7ICsraikgaWYoRFsxOTNdW2pdLmNoYXJDb2RlQXQoMCkgIT09IDB4RkZGRCkgeyBlW0RbMTkzXVtqXV0gPSA0OTQwOCArIGo7IGRbNDk0MDggKyBqXSA9IERbMTkzXVtqXTt9XG5EWzE5NF0gPSBcIu+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/vemahuWehOaLoumZh+alvOWohOaQguevk+a8j+mZi+iKpuWNoumiheW6kOeCieaOs+WNpOiZj+mygem6k+eijOmcsui3r+i1gum5v+a9nuemhOW9lemZhuaIrumptOWQlemTneS+o+aXheWxpeWxoee8leiZkeawr+W+i+eOh+a7pOe7v+WzpuaMm+Wtqua7puWNteS5seaOoOeVpeaKoei9ruS8puS7keaypue6tuiuuuiQneieuue9l+mAu+mUo+euqemqoeijuOiQvea0m+mqhue7nOWmiOm6u+eOm+eggeiagumprOmqguWYm+WQl+Wfi+S5sOm6puWNlui/iOiEieeekummkuibrua7oeiUk+abvOaFoua8q++/vVwiLnNwbGl0KFwiXCIpO1xuZm9yKGogPSAwOyBqICE9IERbMTk0XS5sZW5ndGg7ICsraikgaWYoRFsxOTRdW2pdLmNoYXJDb2RlQXQoMCkgIT09IDB4RkZGRCkgeyBlW0RbMTk0XVtqXV0gPSA0OTY2NCArIGo7IGRbNDk2NjQgKyBqXSA9IERbMTk0XVtqXTt9XG5EWzE5NV0gPSBcIu+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/veiwqeiKkuiMq+ebsuawk+W/meiOveeMq+iMhemUmuavm+efm+mThuWNr+iMguWGkuW4veiyjOi0uOS5iOeOq+aemuaihemFtumcieeFpOayoeecieWqkumVgeavj+e+juaYp+WvkOWmueWqmumXqOmXt+S7rOiQjOiSmeaqrOebn+mUsOeMm+aipuWtn+ecr+mGmumdoeeznOi/t+iwnOW8peexs+enmOinheazjOicnOWvhuW5guajieecoOe7teWGleWFjeWLieWoqee8hemdouiLl+aPj+eehOiXkOenkua4uuW6meWmmeiUkeeBreawkeaKv+eav+aVj+aCr+mXveaYjuien+m4o+mTreWQjeWRveiwrOaRuO+/vVwiLnNwbGl0KFwiXCIpO1xuZm9yKGogPSAwOyBqICE9IERbMTk1XS5sZW5ndGg7ICsraikgaWYoRFsxOTVdW2pdLmNoYXJDb2RlQXQoMCkgIT09IDB4RkZGRCkgeyBlW0RbMTk1XVtqXV0gPSA0OTkyMCArIGo7IGRbNDk5MjAgKyBqXSA9IERbMTk1XVtqXTt9XG5EWzE5Nl0gPSBcIu+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/veaRueiYkeaooeiGnOejqOaRqemtlOaKueacq+iOq+WiqOm7mOayq+a8oOWvnumZjOiwi+eJn+afkOaLh+eJoeS6qeWnhuavjeWik+aaruW5leWLn+aFleacqOebruedpueJp+ephuaLv+WTquWRkOmSoOmCo+WonOe6s+awluS5g+WltuiAkOWliOWNl+eUt+mavuWbiuaMoOiEkeaBvOmXuea3luWRoummgeWGheWrqeiDveWmrumck+WAquazpeWwvOaLn+S9oOWMv+iFu+mAhua6uuiUq+aLiOW5tOeivuaSteaNu+W/teWomOmFv+m4n+Wwv+aNj+iBguWtveWVrumViumVjea2heaCqOafoOeLnuWHneWuge+/vVwiLnNwbGl0KFwiXCIpO1xuZm9yKGogPSAwOyBqICE9IERbMTk2XS5sZW5ndGg7ICsraikgaWYoRFsxOTZdW2pdLmNoYXJDb2RlQXQoMCkgIT09IDB4RkZGRCkgeyBlW0RbMTk2XVtqXV0gPSA1MDE3NiArIGo7IGRbNTAxNzYgKyBqXSA9IERbMTk2XVtqXTt9XG5EWzE5N10gPSBcIu+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/veaLp+aznueJm+aJremSrue6veiEk+a1k+WGnOW8hOWltOWKquaAkuWls+aaluiZkOeWn+aMquaHpuezr+ivuuWTpuasp+m4peautOiXleWRleWBtuaypOWVqui2tOeIrOW4leaAleeQtuaLjeaOkueJjOW+mOa5g+a0vuaUgOa9mOebmOejkOebvOeVlOWIpOWPm+S5k+W6nuaXgeiAquiDluaKm+WShuWIqOeCruiijei3keazoeWRuOiDmuWfueijtOi1lOmZqumFjeS9qeaym+WWt+ebhuegsOaKqOeDuea+juW9reiTrOajmuehvOevt+iGqOaci+m5j+aNp+eisOWdr+egkumcueaJueaKq+WKiOeQteavl++/vVwiLnNwbGl0KFwiXCIpO1xuZm9yKGogPSAwOyBqICE9IERbMTk3XS5sZW5ndGg7ICsraikgaWYoRFsxOTddW2pdLmNoYXJDb2RlQXQoMCkgIT09IDB4RkZGRCkgeyBlW0RbMTk3XVtqXV0gPSA1MDQzMiArIGo7IGRbNTA0MzIgKyBqXSA9IERbMTk3XVtqXTt9XG5EWzE5OF0gPSBcIu+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/veWVpOiEvueWsuearuWMueeXnuWDu+WxgeitrOevh+WBj+eJh+mql+mjmOa8gueTouelqOaSh+eepeaLvOmikei0q+WTgeiBmOS5kuWdquiLueiQjeW5s+WHreeTtuivhOWxj+WdoeazvOmih+WphuegtOmthOi/q+eyleWJluaJkemTuuS7huiOhuiRoeiPqeiSsuWflOactOWcg+aZrua1puiwseabneeAkeacn+asuuagluaImuWmu+S4g+WHhOa8huafkuayj+WFtuaji+Wlh+atp+eVpuW0juiEkOm9kOaXl+eliOelgemqkei1t+WyguS5nuS8geWQr+WlkeegjOWZqOawlOi/hOW8g+axveazo+iuq+aOkO+/vVwiLnNwbGl0KFwiXCIpO1xuZm9yKGogPSAwOyBqICE9IERbMTk4XS5sZW5ndGg7ICsraikgaWYoRFsxOThdW2pdLmNoYXJDb2RlQXQoMCkgIT09IDB4RkZGRCkgeyBlW0RbMTk4XVtqXV0gPSA1MDY4OCArIGo7IGRbNTA2ODggKyBqXSA9IERbMTk4XVtqXTt9XG5EWzE5OV0gPSBcIu+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/veaBsOa0veeJteaJpumSjumTheWNg+i/geetvuS7n+iwpuS5vum7lOmSsemSs+WJjea9nOmBo+a1heiwtOWgkeW1jOasoOatieaequWRm+iFlOe+jOWimeiUt+W8uuaKouaph+mUueaVsuaChOahpeeep+S5lOS+qOW3p+memOaSrOe/mOWzreS/j+eqjeWIh+iMhOS4lOaAr+eqg+mSpuS+teS6suenpueQtOWLpOiKueaTkuemveWvneaygemdkui9u+awouWAvuWNv+a4heaTjuaZtOawsOaDhemht+ivt+W6hueQvOept+eni+S4mOmCseeQg+axguWbmumFi+azhei2i+WMuuibhuabsui6r+WxiOmpsea4oO+/vVwiLnNwbGl0KFwiXCIpO1xuZm9yKGogPSAwOyBqICE9IERbMTk5XS5sZW5ndGg7ICsraikgaWYoRFsxOTldW2pdLmNoYXJDb2RlQXQoMCkgIT09IDB4RkZGRCkgeyBlW0RbMTk5XVtqXV0gPSA1MDk0NCArIGo7IGRbNTA5NDQgKyBqXSA9IERbMTk5XVtqXTt9XG5EWzIwMF0gPSBcIu+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/veWPluWotum+i+i2o+WOu+WciOmip+adg+mGm+azieWFqOeXiuaLs+eKrOWIuOWKnee8uueClOeYuOWNtOm5iuamt+ehrumbgOijmee+pOeEtueHg+WGieafk+eTpOWjpOaUmOWat+iuqemltuaJsOe7leaDueeDreWjrOS7geS6uuW/jemfp+S7u+iupOWIg+Wmiue6q+aJlOS7jeaXpeaIjuiMuOiTieiNo+iejeeGlOa6tuWuuee7kuWGl+aPieaflOiCieiMueigleWEkuWtuuWmgui+seS5s+axneWFpeikpei9r+mYruiViueRnumUkOmXsOa2puiLpeW8seaSkua0kuiQqOiFrumzg+Whnui1m+S4ieWPge+/vVwiLnNwbGl0KFwiXCIpO1xuZm9yKGogPSAwOyBqICE9IERbMjAwXS5sZW5ndGg7ICsraikgaWYoRFsyMDBdW2pdLmNoYXJDb2RlQXQoMCkgIT09IDB4RkZGRCkgeyBlW0RbMjAwXVtqXV0gPSA1MTIwMCArIGo7IGRbNTEyMDAgKyBqXSA9IERbMjAwXVtqXTt9XG5EWzIwMV0gPSBcIu+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/veS8nuaVo+ahkeWXk+S4p+aQlOmqmuaJq+WrgueRn+iJsua2qeajruWDp+iOjuegguadgOWIueaymee6seWCu+WVpeeFnuetm+aZkuePiuiLq+adieWxseWIoOeFveihq+mXqumZleaThei1oeiGs+WWhOaxleaJh+e8ruWikuS8pOWVhui1j+aZjOS4iuWwmuijs+aiouaNjueojeeDp+iKjeWLuumftuWwkeWTqOmCtee7jeWloui1iuibh+iIjOiIjei1puaRhOWwhOaFkea2ieekvuiuvuegt+eUs+WRu+S8uOi6q+a3seWooOe7heelnuayiOWuoeWptueUmuiCvuaFjua4l+WjsOeUn+eUpeeJsuWNh+e7s++/vVwiLnNwbGl0KFwiXCIpO1xuZm9yKGogPSAwOyBqICE9IERbMjAxXS5sZW5ndGg7ICsraikgaWYoRFsyMDFdW2pdLmNoYXJDb2RlQXQoMCkgIT09IDB4RkZGRCkgeyBlW0RbMjAxXVtqXV0gPSA1MTQ1NiArIGo7IGRbNTE0NTYgKyBqXSA9IERbMjAxXVtqXTt9XG5EWzIwMl0gPSBcIu+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/veecgeebm+WJqeiDnOWco+W4iOWkseeLruaWvea5v+ivl+WwuOiZseWNgeefs+aLvuaXtuS7gOmjn+iagOWunuivhuWPsuefouS9v+WxjumptuWni+W8j+ekuuWjq+S4luafv+S6i+aLreiqk+mAneWKv+aYr+WXnOWZrOmAguS7leS+jemHiumlsOawj+W4guaBg+WupOinhuivleaUtuaJi+mmluWuiOWvv+aOiOWUruWPl+eYpuWFveiUrOaeouais+auiuaKkui+k+WPlOiIkua3keeWj+S5pui1juWtsOeGn+iWr+aakeabmee9suicgOm7jem8oOWxnuacr+i/sOagkeadn+aIjeerluWiheW6tuaVsOa8se+/vVwiLnNwbGl0KFwiXCIpO1xuZm9yKGogPSAwOyBqICE9IERbMjAyXS5sZW5ndGg7ICsraikgaWYoRFsyMDJdW2pdLmNoYXJDb2RlQXQoMCkgIT09IDB4RkZGRCkgeyBlW0RbMjAyXVtqXV0gPSA1MTcxMiArIGo7IGRbNTE3MTIgKyBqXSA9IERbMjAyXVtqXTt9XG5EWzIwM10gPSBcIu+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/veaBleWIt+iAjeaRlOihsOeUqeW4heagk+aLtOmcnOWPjOeIveiwgeawtOedoeeojuWQrueerOmhuuiInOivtOehleaclOeDgeaWr+aSleWYtuaAneengeWPuOS4neatu+iChuWvuuWXo+Wbm+S8uuS8vOmlsuW3s+advuiAuOaAgumigumAgeWui+iuvOivteaQnOiJmOaTnuWXveiLj+mFpeS/l+e0oOmAn+eyn+WDs+Whkea6r+Wuv+ivieiCg+mFuOiSnOeul+iZvemai+maj+e7pemrk+eijuWygeepl+mBgumap+eln+WtmeaNn+esi+iTkeaireWUhue8qeeQkOe0oumUgeaJgOWhjOS7luWug+WlueWhlO+/vVwiLnNwbGl0KFwiXCIpO1xuZm9yKGogPSAwOyBqICE9IERbMjAzXS5sZW5ndGg7ICsraikgaWYoRFsyMDNdW2pdLmNoYXJDb2RlQXQoMCkgIT09IDB4RkZGRCkgeyBlW0RbMjAzXVtqXV0gPSA1MTk2OCArIGo7IGRbNTE5NjggKyBqXSA9IERbMjAzXVtqXTt9XG5EWzIwNF0gPSBcIu+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/veeNreaMnui5i+i4j+iDjuiLlOaKrOWPsOazsOmFnuWkquaAgeaxsOWdjeaRiui0queYq+a7qeWdm+aqgOeXsOa9reiwreiwiOWdpuavr+iikueis+aOouWPueeCreaxpOWhmOaQquWgguajoOiGm+WUkOezluWAmOi6uua3jOi2n+eDq+aOj+a2m+a7lOe7puiQhOahg+mAg+a3mOmZtuiuqOWll+eJueiXpOiFvueWvOiqiuair+WJlOi4oumUkeaPkOmimOi5hOWVvOS9k+abv+Waj+aDlea2leWJg+WxieWkqea3u+Whq+eUsOeUnOaBrOiIlOiFhuaMkeadoei/ouecuui3s+i0tOmTgeW4luWOheWQrOeDg++/vVwiLnNwbGl0KFwiXCIpO1xuZm9yKGogPSAwOyBqICE9IERbMjA0XS5sZW5ndGg7ICsraikgaWYoRFsyMDRdW2pdLmNoYXJDb2RlQXQoMCkgIT09IDB4RkZGRCkgeyBlW0RbMjA0XVtqXV0gPSA1MjIyNCArIGo7IGRbNTIyMjQgKyBqXSA9IERbMjA0XVtqXTt9XG5EWzIwNV0gPSBcIu+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/veaxgOW7t+WBnOS6reW6reaMuuiJh+mAmuahkOmFruees+WQjOmTnOW9pOerpeahtuaNheetkue7n+eXm+WBt+aKleWktOmAj+WHuOeng+eqgeWbvuW+kumAlOa2guWxoOWcn+WQkOWFlOa5jeWbouaOqOmik+iFv+icleikqumAgOWQnuWxr+iHgOaLluaJmOiEsem4temZgOmprumpvOakreWmpeaLk+WUvuaMluWTh+ibmea0vOWog+eTpuiinOatquWkluixjOW8r+a5vueOqemhveS4uOeDt+WujOeil+aMveaZmuealuaDi+Wum+WpieS4h+iFleaxqueOi+S6oeaeiee9keW+gOaXuuacm+W/mOWmhOWoge+/vVwiLnNwbGl0KFwiXCIpO1xuZm9yKGogPSAwOyBqICE9IERbMjA1XS5sZW5ndGg7ICsraikgaWYoRFsyMDVdW2pdLmNoYXJDb2RlQXQoMCkgIT09IDB4RkZGRCkgeyBlW0RbMjA1XVtqXV0gPSA1MjQ4MCArIGo7IGRbNTI0ODAgKyBqXSA9IERbMjA1XVtqXTt9XG5EWzIwNl0gPSBcIu+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/veW3jeW+ruWNsemfpui/neahheWbtOWUr+aDn+S4uua9jee7tOiLh+iQjuWnlOS8n+S8quWwvue6rOacquiUmuWRs+eVj+iDg+WWgumtj+S9jea4reiwk+WwieaFsOWNq+eYn+a4qeiaiuaWh+mXu+e6ueWQu+eos+e0iumXruWXoee/geeTruaMneicl+a2oeeqneaIkeaWoeWNp+aPoeayg+W3q+WRnOmSqOS5jOaxoeivrOWxi+aXoOiKnOaip+WQvuWQtOavi+atpuS6lOaNguWNiOiInuS8jeS+ruWdnuaIiumbvuaZpOeJqeWLv+WKoeaCn+ivr+aYlOeGmeaekOilv+ehkuefveaZsOWYu+WQuOmUoeeJuu+/vVwiLnNwbGl0KFwiXCIpO1xuZm9yKGogPSAwOyBqICE9IERbMjA2XS5sZW5ndGg7ICsraikgaWYoRFsyMDZdW2pdLmNoYXJDb2RlQXQoMCkgIT09IDB4RkZGRCkgeyBlW0RbMjA2XVtqXV0gPSA1MjczNiArIGo7IGRbNTI3MzYgKyBqXSA9IERbMjA2XVtqXTt9XG5EWzIwN10gPSBcIu+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/veeogOaBr+W4jOaCieiGneWkleaDnOeGhOeDr+a6quaxkOeKgOaqhOiireW4reS5oOWqs+WWnOmTo+a0l+ezu+mameaIj+e7hueejuiZvuWMo+mcnui+luaah+WzoeS+oOeLreS4i+WOpuWkj+WQk+aOgOmUqOWFiOS7memynOe6pOWSuOi0pOihlOiIt+mXsua2juW8puWrjOaYvumZqeeOsOeMruWOv+iFuummhee+oeWuqumZt+mZkOe6v+ebuOWOoumVtummmeeuseilhOa5mOS5oee/lOelpeivpuaDs+WTjeS6q+mhueW3t+apoeWDj+WQkeixoeiQp+ehnemchOWJiuWTruWao+mUgOa2iOWutea3huaZk++/vVwiLnNwbGl0KFwiXCIpO1xuZm9yKGogPSAwOyBqICE9IERbMjA3XS5sZW5ndGg7ICsraikgaWYoRFsyMDddW2pdLmNoYXJDb2RlQXQoMCkgIT09IDB4RkZGRCkgeyBlW0RbMjA3XVtqXV0gPSA1Mjk5MiArIGo7IGRbNTI5OTIgKyBqXSA9IERbMjA3XVtqXTt9XG5EWzIwOF0gPSBcIu+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/veWwj+WtneagoeiCluWVuOeskeaViOallOS6m+ath+idjumei+WNj+aMn+aQuumCquaWnOiDgeiwkOWGmeaisOWNuOifueaHiOazhOazu+iwouWxkeiWquiKr+mUjOaso+i+m+aWsOW/u+W/g+S/oeihheaYn+iFpeeMqeaDuuWFtOWIkeWei+W9oumCouihjOmGkuW5uOadj+aAp+Wnk+WFhOWHtuiDuOWMiOaxuembhOeGiuS8keS/rue+nuacveWXhemUiOengOiilue7o+Win+aIjOmcgOiZmuWYmOmhu+W+kOiuuOiThOmFl+WPmeaXreW6j+eVnOaBpOe1ruWpv+e7que7rei9qeWWp+Wuo+aCrOaXi+eOhO+/vVwiLnNwbGl0KFwiXCIpO1xuZm9yKGogPSAwOyBqICE9IERbMjA4XS5sZW5ndGg7ICsraikgaWYoRFsyMDhdW2pdLmNoYXJDb2RlQXQoMCkgIT09IDB4RkZGRCkgeyBlW0RbMjA4XVtqXV0gPSA1MzI0OCArIGo7IGRbNTMyNDggKyBqXSA9IERbMjA4XVtqXTt9XG5EWzIwOV0gPSBcIu+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/vemAieeZo+ecqee7mumdtOiWm+WtpueptOmbquihgOWLi+eGj+W+quaXrOivouWvu+mpr+W3oeauieaxm+iureiur+mAiui/heWOi+aKvOm4pum4reWRgOS4q+iKveeJmeianOW0luihmea2r+mbheWTkeS6muiutueEieWSvemYieeDn+a3ueebkOS4peeglOickuWyqeW7tuiogOminOmYjueCjuayv+WlhOaOqeecvOihjea8lOiJs+WgsOeHleWOjOegmumbgeWUgeW9pueEsOWutOiwmumqjOaug+Wkrum4r+enp+adqOaJrOS9r+eWoee+iua0i+mYs+awp+S7sOeXkuWFu+agt+a8vumCgOiFsOWmlueRtu+/vVwiLnNwbGl0KFwiXCIpO1xuZm9yKGogPSAwOyBqICE9IERbMjA5XS5sZW5ndGg7ICsraikgaWYoRFsyMDldW2pdLmNoYXJDb2RlQXQoMCkgIT09IDB4RkZGRCkgeyBlW0RbMjA5XVtqXV0gPSA1MzUwNCArIGo7IGRbNTM1MDQgKyBqXSA9IERbMjA5XVtqXTt9XG5EWzIxMF0gPSBcIu+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/veaRh+Wwp+mBpeeqkeiwo+WnmuWSrOiIgOiNr+imgeiAgOaksOWZjuiAtueIt+mHjuWGtuS5n+mhteaOluS4muWPtuabs+iFi+WknOa2suS4gOWjueWMu+aPlumTseS+neS8iuiho+mikOWkt+mBl+enu+S7quiDsOeWkeayguWunOWnqOW9neakheiageWAmuW3suS5meefo+S7peiJuuaKkeaYk+mCkeWxueS6v+W9ueiHhumAuOiChOeWq+S6puijlOaEj+avheW/huS5ieebiua6ouivo+iuruiwiuivkeW8gue/vOe/jOe7juiMteiNq+WboOaut+mfs+mYtOWnu+WQn+mTtua3q+WvhemlruWwueW8lemakO+/vVwiLnNwbGl0KFwiXCIpO1xuZm9yKGogPSAwOyBqICE9IERbMjEwXS5sZW5ndGg7ICsraikgaWYoRFsyMTBdW2pdLmNoYXJDb2RlQXQoMCkgIT09IDB4RkZGRCkgeyBlW0RbMjEwXVtqXV0gPSA1Mzc2MCArIGo7IGRbNTM3NjAgKyBqXSA9IERbMjEwXVtqXTt9XG5EWzIxMV0gPSBcIu+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/veWNsOiLseaoseWptOm5sOW6lOe8qOiOueiQpOiQpeiNp+idh+i/jui1ouebiOW9semiluehrOaYoOWTn+aLpeS9o+iHg+eXiOW6uOmbjei4iuibueWSj+azs+a2jOawuOaBv+WLh+eUqOW5veS8mOaCoOW/p+WwpOeUsemCrumTgOeKueayuea4uOmFieacieWPi+WPs+S9kemHieivseWPiOW5vOi/gua3pOS6juebguamhuiZnuaEmuiIhuS9meS/numAvumxvOaEiea4nea4lOmaheS6iOWosembqOS4juWxv+emueWuh+ivree+veeOieWfn+iKi+mDgeWQgemBh+WWu+WzquW+oeaEiOassueLseiCsuiqie+/vVwiLnNwbGl0KFwiXCIpO1xuZm9yKGogPSAwOyBqICE9IERbMjExXS5sZW5ndGg7ICsraikgaWYoRFsyMTFdW2pdLmNoYXJDb2RlQXQoMCkgIT09IDB4RkZGRCkgeyBlW0RbMjExXVtqXV0gPSA1NDAxNiArIGo7IGRbNTQwMTYgKyBqXSA9IERbMjExXVtqXTt9XG5EWzIxMl0gPSBcIu+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/vea1tOWvk+ijlemihOixq+mprem4s+a4iuWGpOWFg+Weo+iigeWOn+aPtOi+leWbreWRmOWchueMv+a6kOe8mOi/nOiLkeaEv+aAqOmZouabsOe6pui2iui3g+mSpeWys+eypOaciOaCpumYheiAmOS6kemDp+WMgOmZqOWFgei/kOiVtOmFneaZlemfteWtleWMneeguOadguagveWTieeBvuWusOi9veWGjeWcqOWSseaUkuaagui1nui1g+iEj+iRrOmBreezn+WHv+iXu+aeo+aXqea+oeiapOi6geWZqumAoOeagueBtueHpei0o+aLqeWImeazvei0vOaAjuWinuaGjuabvui1oOaJjuWWs+a4o+acrei9p++/vVwiLnNwbGl0KFwiXCIpO1xuZm9yKGogPSAwOyBqICE9IERbMjEyXS5sZW5ndGg7ICsraikgaWYoRFsyMTJdW2pdLmNoYXJDb2RlQXQoMCkgIT09IDB4RkZGRCkgeyBlW0RbMjEyXVtqXV0gPSA1NDI3MiArIGo7IGRbNTQyNzIgKyBqXSA9IERbMjEyXVtqXTt9XG5EWzIxM10gPSBcIu+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/vemToemXuOecqOagheamqOWSi+S5jeeCuOiviOaRmOaWi+WuheeqhOWAuuWvqOeeu+avoeipueeymOayvuebj+aWqei+l+W0reWxleiYuOagiOWNoOaImOermea5m+e7veaon+eroOW9sOa8s+W8oOaOjOa2qOadluS4iOW4kOi0puS7l+iDgOeYtOmanOaLm+aYreaJvuayvOi1teeFp+e9qeWFhuiCh+WPrOmBruaKmOWTsuibsOi+meiAhemUl+iUl+i/mea1meePjeaWn+ecn+eUhOegp+iHu+i0numSiOS+puaeleeWueiviumch+aMr+mVh+mYteiSuOaMo+edgeW+geeLsOS6ieaAlOaVtOaLr+ato+aUv++/vVwiLnNwbGl0KFwiXCIpO1xuZm9yKGogPSAwOyBqICE9IERbMjEzXS5sZW5ndGg7ICsraikgaWYoRFsyMTNdW2pdLmNoYXJDb2RlQXQoMCkgIT09IDB4RkZGRCkgeyBlW0RbMjEzXVtqXV0gPSA1NDUyOCArIGo7IGRbNTQ1MjggKyBqXSA9IERbMjEzXVtqXTt9XG5EWzIxNF0gPSBcIu+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/veW4p+eXh+mDkeivgeiKneaeneaUr+WQseicmOefpeiCouiEguaxgeS5i+e7h+iBjOebtOakjeauluaJp+WAvOS+hOWdgOaMh+atoui2vuWPquaXqOe6uOW/l+aMmuaOt+iHs+iHtOe9ruW4nOWzmeWItuaZuuenqeeomui0qOeCmeeXlOa7nuayu+eqkuS4reebheW/oOmSn+iht+e7iOenjeiCv+mHjeS7suS8l+iIn+WRqOW3nua0suivjOeypei9tOiCmOW4muWSkueaseWumeaYvOmqpOePoOagquibm+acseeMquivuOivm+mAkOerueeDm+eFruaLhOeeqeWYseS4u+iRl+afseWKqeibgOi0rumTuOetke+/vVwiLnNwbGl0KFwiXCIpO1xuZm9yKGogPSAwOyBqICE9IERbMjE0XS5sZW5ndGg7ICsraikgaWYoRFsyMTRdW2pdLmNoYXJDb2RlQXQoMCkgIT09IDB4RkZGRCkgeyBlW0RbMjE0XVtqXV0gPSA1NDc4NCArIGo7IGRbNTQ3ODQgKyBqXSA9IERbMjE0XVtqXTt9XG5EWzIxNV0gPSBcIu+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/veS9j+azqOelnempu+aKk+eIquaLveS4k+eglui9rOaSsOi1muevhuahqeW6hOijheWmhuaSnuWjrueKtuakjumUpei/vei1mOWdoOe8gOiwhuWHhuaNieaLmeWNk+ahjOeQouiMgemFjOWVhOedgOeBvOa1iuWFueWSqOi1hOWnv+a7i+a3hOWtnOe0q+S7lOexvea7k+WtkOiHqua4jeWtl+msg+ajlei4quWul+e7vOaAu+e6temCuei1sOWlj+aPjeenn+i2s+WNkuaXj+elluivhemYu+e7hOmSu+e6guWYtOmGieacgOe9quWwiumBteaYqOW3puS9kOafnuWBmuS9nOWdkOW6p++/ve+/ve+/ve+/ve+/ve+/vVwiLnNwbGl0KFwiXCIpO1xuZm9yKGogPSAwOyBqICE9IERbMjE1XS5sZW5ndGg7ICsraikgaWYoRFsyMTVdW2pdLmNoYXJDb2RlQXQoMCkgIT09IDB4RkZGRCkgeyBlW0RbMjE1XVtqXV0gPSA1NTA0MCArIGo7IGRbNTUwNDAgKyBqXSA9IERbMjE1XVtqXTt9XG5EWzIxNl0gPSBcIu+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/veS6jeS4jOWFgOS4kOW7v+WNheS4leS6mOS4numssuWtrOWZqeS4qOemuuS4v+WMleS5h+WkreeIu+WNruawkOWbn+iDpOmml+avk+edvum8l+S4tuS6n+m8kOS5nOS5qeS6k+iKiOWtm+WVrOWYj+S7hOWOjeWOneWOo+WOpeWOrumdpei1neWMmuWPteWMpuWMruWMvui1nOWNpuWNo+WIguWIiOWIjuWIreWIs+WIv+WJgOWJjOWJnuWJoeWJnOiSr+WJveWKguWKgeWKkOWKk+WGgue9lOS6u+S7g+S7ieS7guS7qOS7oeS7q+S7nuS8m+S7s+S8ouS9pOS7teS8peS8p+S8ieS8q+S9nuS9p+aUuOS9muS9ne+/vVwiLnNwbGl0KFwiXCIpO1xuZm9yKGogPSAwOyBqICE9IERbMjE2XS5sZW5ndGg7ICsraikgaWYoRFsyMTZdW2pdLmNoYXJDb2RlQXQoMCkgIT09IDB4RkZGRCkgeyBlW0RbMjE2XVtqXV0gPSA1NTI5NiArIGo7IGRbNTUyOTYgKyBqXSA9IERbMjE2XVtqXTt9XG5EWzIxN10gPSBcIu+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/veS9n+S9l+S8suS8veS9tuS9tOS+keS+ieS+g+S+j+S9vuS9u+S+quS9vOS+rOS+lOS/puS/qOS/quS/heS/muS/o+S/nOS/keS/n+S/uOWAqeWBjOS/s+WArOWAj+WAruWAreS/vuWAnOWAjOWApeWAqOWBvuWBg+WBleWBiOWBjuWBrOWBu+WCpeWCp+WCqeWCuuWDluWEhuWDreWDrOWDpuWDruWEh+WEi+S7neawveS9mOS9peS/jum+oOaxhuextOWFruW3vem7iemmmOWGgeWklOWLueWMjeioh+WMkOWHq+WkmeWFleS6oOWFluS6s+ihruiipOS6teiElOijkuemgOWstOigg+e+uOWGq+WGseWGveWGvO+/vVwiLnNwbGl0KFwiXCIpO1xuZm9yKGogPSAwOyBqICE9IERbMjE3XS5sZW5ndGg7ICsraikgaWYoRFsyMTddW2pdLmNoYXJDb2RlQXQoMCkgIT09IDB4RkZGRCkgeyBlW0RbMjE3XVtqXV0gPSA1NTU1MiArIGo7IGRbNTU1NTIgKyBqXSA9IERbMjE3XVtqXTt9XG5EWzIxOF0gPSBcIu+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/veWHh+WGluWGouWGpeiuoOiupuiup+iuquiutOiuteiut+ivguivg+ivi+ivj+ivjuivkuivk+ivlOivluivmOivmeivnOivn+ivoOivpOivqOivqeivruivsOivs+ivtuivueivvOivv+iwgOiwguiwhOiwh+iwjOiwj+iwkeiwkuiwlOiwleiwluiwmeiwm+iwmOiwneiwn+iwoOiwoeiwpeiwp+iwquiwq+iwruiwr+iwsuiws+iwteiwtuWNqeWNuumYnemYoumYoemYsemYqumYvemYvOmZgumZiemZlOmZn+mZp+mZrOmZsumZtOmaiOmajemal+masOmCl+mCm+mCnemCmemCrOmCoemCtOmCs+mCtumCuu+/vVwiLnNwbGl0KFwiXCIpO1xuZm9yKGogPSAwOyBqICE9IERbMjE4XS5sZW5ndGg7ICsraikgaWYoRFsyMThdW2pdLmNoYXJDb2RlQXQoMCkgIT09IDB4RkZGRCkgeyBlW0RbMjE4XVtqXV0gPSA1NTgwOCArIGo7IGRbNTU4MDggKyBqXSA9IERbMjE4XVtqXTt9XG5EWzIxOV0gPSBcIu+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/vemCuOmCsOmDj+mDhemCvumDkOmDhOmDh+mDk+mDpumDoumDnOmDl+mDm+mDq+mDr+mDvumEhOmEoumEnumEo+mEsemEr+mEuemFg+mFhuWIjeWlguWKouWKrOWKreWKvuWTv+WLkOWLluWLsOWPn+eHruefjeW7tOWHteWHvOmsr+WOtuW8geeVmuW3r+WdjOWeqeWeoeWhvuWivOWjheWjkeWcqeWcrOWcquWcs+WcueWcruWcr+WdnOWcu+WdguWdqeWeheWdq+WehuWdvOWdu+WdqOWdreWdtuWds+WereWepOWejOWesuWfj+Wep+WetOWek+WeoOWfleWfmOWfmuWfmeWfkuWeuOWftOWfr+WfuOWfpOWfne+/vVwiLnNwbGl0KFwiXCIpO1xuZm9yKGogPSAwOyBqICE9IERbMjE5XS5sZW5ndGg7ICsraikgaWYoRFsyMTldW2pdLmNoYXJDb2RlQXQoMCkgIT09IDB4RkZGRCkgeyBlW0RbMjE5XVtqXV0gPSA1NjA2NCArIGo7IGRbNTYwNjQgKyBqXSA9IERbMjE5XVtqXTt9XG5EWzIyMF0gPSBcIu+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/veWgi+WgjeWfveWfreWggOWgnuWgmeWhhOWgoOWhpeWhrOWigeWiieWimuWigOmmqOm8meaHv+iJueiJveiJv+iKj+iKiuiKqOiKhOiKjuiKkeiKl+iKmeiKq+iKuOiKvuiKsOiLiOiLiuiLo+iKmOiKt+iKruiLi+iLjOiLgeiKqeiKtOiKoeiKquiKn+iLhOiLjuiKpOiLoeiMieiLt+iLpOiMj+iMh+iLnOiLtOiLkuiLmOiMjOiLu+iLk+iMkeiMmuiMhuiMlOiMleiLoOiLleiMnOiNkeiNm+iNnOiMiOiOkuiMvOiMtOiMseiOm+iNnuiMr+iNj+iNh+iNg+iNn+iNgOiMl+iNoOiMreiMuuiMs+iNpuiNpe+/vVwiLnNwbGl0KFwiXCIpO1xuZm9yKGogPSAwOyBqICE9IERbMjIwXS5sZW5ndGg7ICsraikgaWYoRFsyMjBdW2pdLmNoYXJDb2RlQXQoMCkgIT09IDB4RkZGRCkgeyBlW0RbMjIwXVtqXV0gPSA1NjMyMCArIGo7IGRbNTYzMjAgKyBqXSA9IERbMjIwXVtqXTt9XG5EWzIyMV0gPSBcIu+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/veiNqOiMm+iNqeiNrOiNquiNreiNruiOsOiNuOiOs+iOtOiOoOiOquiOk+iOnOiOheiNvOiOtuiOqeiNveiOuOiNu+iOmOiOnuiOqOiOuuiOvOiPgeiQgeiPpeiPmOWgh+iQmOiQi+iPneiPveiPluiQnOiQuOiQkeiQhuiPlOiPn+iQj+iQg+iPuOiPueiPquiPheiPgOiQpuiPsOiPoeiRnOiRkeiRmuiRmeiRs+iSh+iSiOiRuuiSieiRuOiQvOiRhuiRqeiRtuiSjOiSjuiQseiRreiTgeiTjeiTkOiTpuiSveiTk+iTiuiSv+iSuuiToOiSoeiSueiStOiSl+iTpeiTo+iUjOeUjeiUuOiTsOiUueiUn+iUuu+/vVwiLnNwbGl0KFwiXCIpO1xuZm9yKGogPSAwOyBqICE9IERbMjIxXS5sZW5ndGg7ICsraikgaWYoRFsyMjFdW2pdLmNoYXJDb2RlQXQoMCkgIT09IDB4RkZGRCkgeyBlW0RbMjIxXVtqXV0gPSA1NjU3NiArIGo7IGRbNTY1NzYgKyBqXSA9IERbMjIxXVtqXTt9XG5EWzIyMl0gPSBcIu+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/veiVluiUu+iTv+iTvOiVmeiViOiVqOiVpOiVnuiVuueeouiVg+iVsuiVu+iWpOiWqOiWh+iWj+iVueiWruiWnOiWheiWueiWt+iWsOiXk+iXgeiXnOiXv+iYp+iYheiYqeiYluiYvOW7vuW8iOWkvOWlgeiAt+WlleWlmuWlmOWMj+WwouWwpeWwrOWwtOaJjOaJquaKn+aKu+aLiuaLmuaLl+aLruaMouaLtuaMueaNi+aNg+aOreaPtuaNseaNuuaOjuaOtOaNreaOrOaOiuaNqeaOruaOvOaPsuaPuOaPoOaPv+aPhOaPnuaPjuaRkuaPhuaOvuaRheaRgeaQi+aQm+aQoOaQjOaQpuaQoeaRnuaShOaRreaSlu+/vVwiLnNwbGl0KFwiXCIpO1xuZm9yKGogPSAwOyBqICE9IERbMjIyXS5sZW5ndGg7ICsraikgaWYoRFsyMjJdW2pdLmNoYXJDb2RlQXQoMCkgIT09IDB4RkZGRCkgeyBlW0RbMjIyXVtqXV0gPSA1NjgzMiArIGo7IGRbNTY4MzIgKyBqXSA9IERbMjIyXVtqXTt9XG5EWzIyM10gPSBcIu+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/veaRuuaSt+aSuOaSmeaSuuaTgOaTkOaTl+aTpOaTouaUieaUpeaUruW8i+W/kueUmeW8keWNn+WPseWPveWPqeWPqOWPu+WQkuWQluWQhuWRi+WRkuWRk+WRlOWRluWRg+WQoeWRl+WRmeWQo+WQsuWSguWSlOWRt+WRseWRpOWSmuWSm+WShOWRtuWRpuWSneWTkOWSreWTguWStOWTkuWSp+WSpuWTk+WTlOWRsuWSo+WTleWSu+WSv+WTjOWTmeWTmuWTnOWSqeWSquWSpOWTneWTj+WTnuWUm+WTp+WUoOWTveWUlOWTs+WUouWUo+WUj+WUkeWUp+WUquWVp+WWj+WWteWVieWVreWVgeWVleWUv+WVkOWUvO+/vVwiLnNwbGl0KFwiXCIpO1xuZm9yKGogPSAwOyBqICE9IERbMjIzXS5sZW5ndGg7ICsraikgaWYoRFsyMjNdW2pdLmNoYXJDb2RlQXQoMCkgIT09IDB4RkZGRCkgeyBlW0RbMjIzXVtqXV0gPSA1NzA4OCArIGo7IGRbNTcwODggKyBqXSA9IERbMjIzXVtqXTt9XG5EWzIyNF0gPSBcIu+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/veWUt+WVluWVteWVtuWVt+WUs+WUsOWVnOWWi+WXkuWWg+WWseWWueWWiOWWgeWWn+WVvuWXluWWkeWVu+WXn+WWveWWvuWWlOWWmeWXquWXt+WXieWYn+WXkeWXq+WXrOWXlOWXpuWXneWXhOWXr+WXpeWXsuWXs+WXjOWXjeWXqOWXteWXpOi+lOWYnuWYiOWYjOWYgeWYpOWYo+WXvuWYgOWYp+WYreWZmOWYueWZl+WYrOWZjeWZouWZmeWZnOWZjOWZlOWahuWZpOWZseWZq+WZu+WZvOWaheWak+War+WblOWbl+WbneWboeWbteWbq+WbueWbv+WchOWciuWcieWcnOW4j+W4meW4lOW4keW4seW4u+W4vO+/vVwiLnNwbGl0KFwiXCIpO1xuZm9yKGogPSAwOyBqICE9IERbMjI0XS5sZW5ndGg7ICsraikgaWYoRFsyMjRdW2pdLmNoYXJDb2RlQXQoMCkgIT09IDB4RkZGRCkgeyBlW0RbMjI0XVtqXV0gPSA1NzM0NCArIGo7IGRbNTczNDQgKyBqXSA9IERbMjI0XVtqXTt9XG5EWzIyNV0gPSBcIu+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/veW4t+W5hOW5lOW5m+W5nuW5oeWyjOWxuuWyjeWykOWyluWyiOWymOWymeWykeWymuWynOWyteWyouWyveWyrOWyq+WyseWyo+WzgeWyt+WzhOWzkuWzpOWzi+WzpeW0guW0g+W0p+W0puW0ruW0pOW0nuW0huW0m+W1mOW0vuW0tOW0veW1rOW1m+W1r+W1neW1q+W1i+W1iuW1qeW1tOW2guW2meW2neixs+W2t+W3heW9s+W9t+W+guW+h+W+ieW+jOW+leW+meW+nOW+qOW+reW+teW+vOihouW9oeeKreeKsOeKtOeKt+eKuOeLg+eLgeeLjueLjeeLkueLqOeLr+eLqeeLsueLtOeLt+eMgeeLs+eMg+eLuu+/vVwiLnNwbGl0KFwiXCIpO1xuZm9yKGogPSAwOyBqICE9IERbMjI1XS5sZW5ndGg7ICsraikgaWYoRFsyMjVdW2pdLmNoYXJDb2RlQXQoMCkgIT09IDB4RkZGRCkgeyBlW0RbMjI1XVtqXV0gPSA1NzYwMCArIGo7IGRbNTc2MDAgKyBqXSA9IERbMjI1XVtqXTt9XG5EWzIyNl0gPSBcIu+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/veeLu+eMl+eMk+eMoeeMiueMnueMneeMleeMoueMueeMpeeMrOeMuOeMseeNkOeNjeeNl+eNoOeNrOeNr+eNvuiIm+Wkpemjp+WkpOWkgumlo+mlp+mlqOmlqemlqumlq+mlrOmltOmlt+mlvemmgOmmhOmmh+mmiummjemmkOmmkemmk+mmlOmmleW6gOW6keW6i+W6luW6peW6oOW6ueW6teW6vuW6s+i1k+W7kuW7keW7m+W7qOW7quiGuuW/hOW/ieW/luW/j+aAg+W/ruaAhOW/oeW/pOW/vuaAheaAhuW/quW/reW/uOaAmeaAteaApuaAm+aAj+aAjeaAqeaAq+aAiuaAv+aAoeaBuOaBueaBu+aBuuaBgu+/vVwiLnNwbGl0KFwiXCIpO1xuZm9yKGogPSAwOyBqICE9IERbMjI2XS5sZW5ndGg7ICsraikgaWYoRFsyMjZdW2pdLmNoYXJDb2RlQXQoMCkgIT09IDB4RkZGRCkgeyBlW0RbMjI2XVtqXV0gPSA1Nzg1NiArIGo7IGRbNTc4NTYgKyBqXSA9IERbMjI2XVtqXTt9XG5EWzIyN10gPSBcIu+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/veaBquaBveaCluaCmuaCreaCneaCg+aCkuaCjOaCm+aDrOaCu+aCseaDneaDmOaDhuaDmuaCtOaEoOaEpuaEleaEo+aDtOaEgOaEjuaEq+aFiuaFteaGrOaGlOaGp+aGt+aHlOaHteW/nemas+mXqemXq+mXsemXs+mXtemXtumXvOmXvumYg+mYhOmYhumYiOmYiumYi+mYjOmYjemYj+mYkumYlemYlumYl+mYmemYmuS4rOeIv+aIleawteaxlOaxnOaxiuayo+ayheaykOaylOayjOaxqOaxqeaxtOaxtuayhuayqeazkOazlOayreazt+azuOazseazl+aysuazoOazluazuuazq+azruayseazk+azr+azvu+/vVwiLnNwbGl0KFwiXCIpO1xuZm9yKGogPSAwOyBqICE9IERbMjI3XS5sZW5ndGg7ICsraikgaWYoRFsyMjddW2pdLmNoYXJDb2RlQXQoMCkgIT09IDB4RkZGRCkgeyBlW0RbMjI3XVtqXV0gPSA1ODExMiArIGo7IGRbNTgxMTIgKyBqXSA9IERbMjI3XVtqXTt9XG5EWzIyOF0gPSBcIu+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/vea0uea0p+a0jOa1g+a1iOa0h+a0hOa0mea0jua0q+a1jea0rua0tea0mua1j+a1kua1lOa0s+a2kea1r+a2nua2oOa1nua2k+a2lOa1nOa1oOa1vOa1o+a4mua3h+a3hea3nua4jua2v+a3oOa4kea3pua3nea3mea4lua2q+a4jOa2rua4q+a5rua5jua5q+a6sua5n+a6hua5k+a5lOa4sua4pea5hOa7n+a6sea6mOa7oOa8rea7oua6pea6p+a6vea6u+a6t+a7l+a6tOa7j+a6j+a7gua6n+a9oua9hua9h+a8pOa8lea7uea8r+a8tua9i+a9tOa8qua8iea8qea+iea+jea+jOa9uOa9sua9vOa9uua/ke+/vVwiLnNwbGl0KFwiXCIpO1xuZm9yKGogPSAwOyBqICE9IERbMjI4XS5sZW5ndGg7ICsraikgaWYoRFsyMjhdW2pdLmNoYXJDb2RlQXQoMCkgIT09IDB4RkZGRCkgeyBlW0RbMjI4XVtqXV0gPSA1ODM2OCArIGo7IGRbNTgzNjggKyBqXSA9IERbMjI4XVtqXTt9XG5EWzIyOV0gPSBcIu+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/vea/iea+p+a+uea+tua/gua/oea/rua/nua/oOa/r+eAmueAo+eAm+eAueeAteeBj+eBnuWugOWuhOWuleWuk+WupeWuuOeUr+mqnuaQtOWvpOWvruiksOWvsOi5h+ish+i+tui/k+i/lei/pei/rui/pOi/qei/pui/s+i/qOmAhemAhOmAi+mApumAkemAjemAlumAoemAtemAtumAremAr+mBhOmBkemBkumBkOmBqOmBmOmBoumBm+aauemBtOmBvemCgumCiOmCg+mCi+W9kOW9l+W9luW9mOWwu+WSq+WxkOWxmeWtseWxo+Wxpue+vOW8quW8qeW8reiJtOW8vOmsu+WxruWmgeWmg+WmjeWmqeWmquWmo++/vVwiLnNwbGl0KFwiXCIpO1xuZm9yKGogPSAwOyBqICE9IERbMjI5XS5sZW5ndGg7ICsraikgaWYoRFsyMjldW2pdLmNoYXJDb2RlQXQoMCkgIT09IDB4RkZGRCkgeyBlW0RbMjI5XVtqXV0gPSA1ODYyNCArIGo7IGRbNTg2MjQgKyBqXSA9IERbMjI5XVtqXTt9XG5EWzIzMF0gPSBcIu+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/veWml+WniuWmq+WmnuWmpOWnkuWmsuWmr+Wnl+WmvuWoheWohuWnneWoiOWno+WnmOWnueWojOWoieWosuWotOWokeWoo+Wok+WpgOWpp+WpiuWpleWovOWpouWpteiDrOWqquWqm+Wpt+WpuuWqvuWrq+WqsuWrkuWrlOWquOWroOWro+WrseWrluWrpuWrmOWrnOWsieWsl+WsluWssuWst+WtgOWwleWwnOWtmuWtpeWts+WtkeWtk+Wtoumptempt+mpuOmpuumpv+mpvemqgOmqgemqhemqiOmqiumqkOmqkumqk+mqlumqmOmqm+mqnOmqnemqn+mqoOmqoumqo+mqpemqp+e6n+e6oee6o+e6pee6qOe6qe+/vVwiLnNwbGl0KFwiXCIpO1xuZm9yKGogPSAwOyBqICE9IERbMjMwXS5sZW5ndGg7ICsraikgaWYoRFsyMzBdW2pdLmNoYXJDb2RlQXQoMCkgIT09IDB4RkZGRCkgeyBlW0RbMjMwXVtqXV0gPSA1ODg4MCArIGo7IGRbNTg4ODAgKyBqXSA9IERbMjMwXVtqXTt9XG5EWzIzMV0gPSBcIu+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/vee6ree6sOe6vue7gOe7gee7gue7iee7i+e7jOe7kOe7lOe7l+e7m+e7oOe7oee7qOe7q+e7rue7r+e7see7sue8jee7tue7uue7u+e7vue8gee8gue8g+e8h+e8iOe8i+e8jOe8j+e8kee8kue8l+e8mee8nOe8m+e8n+e8oee8oue8o+e8pOe8pee8pue8p+e8que8q+e8rOe8ree8r+e8sOe8see8sue8s+e8teW5uueVv+W3m+eUvumCleeOjueOkeeOrueOoueOn+ePj+ePguePkeeOt+eOs+ePgOePieePiOePpeePmemhvOeQiuePqeePp+ePnueOuuePsueQj+eQqueRm+eQpueQpeeQqOeQsOeQrueQrO+/vVwiLnNwbGl0KFwiXCIpO1xuZm9yKGogPSAwOyBqICE9IERbMjMxXS5sZW5ndGg7ICsraikgaWYoRFsyMzFdW2pdLmNoYXJDb2RlQXQoMCkgIT09IDB4RkZGRCkgeyBlW0RbMjMxXVtqXV0gPSA1OTEzNiArIGo7IGRbNTkxMzYgKyBqXSA9IERbMjMxXVtqXTt9XG5EWzIzMl0gPSBcIu+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/veeQm+eQmueRgeeRnOeRl+eRleeRmeeRt+eRreeRvueSnOeSjueSgOeSgeeSh+eSi+eSnueSqOeSqeeSkOeSp+eTkueSuumfqumfq+mfrOadjOadk+adnuadiOadqeaepeaeh+adquads+aemOaep+adteaeqOaenuaereaei+adt+advOafsOagieafmOagiuafqeaesOagjOafmeaeteafmuaes+afneaggOafg+aeuOafouagjuafgeafveagsuags+ahoOahoeahjuahouahhOahpOaig+agneahleahpuahgeahp+ahgOagvuahiuahieagqeaiteaij+ahtOaht+aik+ahq+ajgualruajvOakn+akoOajue+/vVwiLnNwbGl0KFwiXCIpO1xuZm9yKGogPSAwOyBqICE9IERbMjMyXS5sZW5ndGg7ICsraikgaWYoRFsyMzJdW2pdLmNoYXJDb2RlQXQoMCkgIT09IDB4RkZGRCkgeyBlW0RbMjMyXVtqXV0gPSA1OTM5MiArIGo7IGRbNTkzOTIgKyBqXSA9IERbMjMyXVtqXTt9XG5EWzIzM10gPSBcIu+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/veakpOajsOaki+akgeall+ajo+akkOalseakuealoOalgualneamhOalq+amgOammOaluOaktOanjOamh+amiOanjuamiealpualo+alueamm+amp+amu+amq+amreanlOamseangeaniuann+amleanoOamjeanv+aor+anreaol+aomOappeansuaphOaovuaqoOapkOapm+aoteaqjuapueaoveaoqOapmOapvOaqkeaqkOaqqeaql+aqq+eMt+eNkuaugeauguauh+auhOaukuauk+aujeaumuaum+auoeauqui9q+i9rei9sei9sui9s+i9tei9tui9uOi9t+i9uei9uui9vOi9vui+gei+gui+hOi+h+i+i++/vVwiLnNwbGl0KFwiXCIpO1xuZm9yKGogPSAwOyBqICE9IERbMjMzXS5sZW5ndGg7ICsraikgaWYoRFsyMzNdW2pdLmNoYXJDb2RlQXQoMCkgIT09IDB4RkZGRCkgeyBlW0RbMjMzXVtqXV0gPSA1OTY0OCArIGo7IGRbNTk2NDggKyBqXSA9IERbMjMzXVtqXTt9XG5EWzIzNF0gPSBcIu+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/vei+jei+jui+j+i+mOi+mui7juaIi+aIl+aIm+aIn+aIouaIoeaIpeaIpOaIrOiHp+eTr+eTtOeTv+eUj+eUkeeUk+aUtOaXruaXr+aXsOaYiuaYmeadsuaYg+aYleaYgOeCheabt+aYneaYtOaYseaYtuaYteiAhuaZn+aZlOaZgeaZj+aZluaZoeaZl+aZt+aahOaajOaap+aaneaavuabm+abnOabpuabqei0sui0s+i0tui0u+i0vei1gOi1hei1hui1iOi1iei1h+i1jei1lei1meinh+iniuini+injOinjuinj+inkOinkeeJrueKn+eJneeJpueJr+eJvueJv+eKhOeKi+eKjeeKj+eKkuaMiOaMsuaOsO+/vVwiLnNwbGl0KFwiXCIpO1xuZm9yKGogPSAwOyBqICE9IERbMjM0XS5sZW5ndGg7ICsraikgaWYoRFsyMzRdW2pdLmNoYXJDb2RlQXQoMCkgIT09IDB4RkZGRCkgeyBlW0RbMjM0XVtqXV0gPSA1OTkwNCArIGo7IGRbNTk5MDQgKyBqXSA9IERbMjM0XVtqXTt9XG5EWzIzNV0gPSBcIu+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/veaQv+aTmOiAhOavquavs+avveavteavueawheawh+awhuawjeawleawmOawmeawmuawoeawqeawpOawquawsuaUteaVleaVq+eJjeeJkueJlueIsOiZouWIluiCn+iCnOiCk+iCvOaciuiCveiCseiCq+iCreiCtOiCt+iDp+iDqOiDqeiDquiDm+iDguiDhOiDmeiDjeiDl+ackOiDneiDq+iDseiDtOiDreiEjeiEjuiDsuiDvOacleiEkuixmuiEtuiEnuiErOiEmOiEsuiFiOiFjOiFk+iFtOiFmeiFmuiFseiFoOiFqeiFvOiFveiFreiFp+WhjeWqteiGiOiGguiGkea7leiGo+iGquiHjOacpuiHiuiGu++/vVwiLnNwbGl0KFwiXCIpO1xuZm9yKGogPSAwOyBqICE9IERbMjM1XS5sZW5ndGg7ICsraikgaWYoRFsyMzVdW2pdLmNoYXJDb2RlQXQoMCkgIT09IDB4RkZGRCkgeyBlW0RbMjM1XVtqXV0gPSA2MDE2MCArIGo7IGRbNjAxNjAgKyBqXSA9IERbMjM1XVtqXTt9XG5EWzIzNl0gPSBcIu+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/veiHgeiGpuaspOast+asueatg+athuatmemjkemjkumjk+mjlemjmemjmuaus+W9gOavguins+aWkOm9keaWk+aWvOaXhuaXhOaXg+aXjOaXjuaXkuaXlueCgOeCnOeClueCneeCu+eDgOeCt+eCq+eCseeDqOeDiueEkOeEk+eElueEr+eEseeFs+eFnOeFqOeFheeFsueFiueFuOeFuueGmOeGs+eGteeGqOeGoOeHoOeHlOeHp+eHueeIneeIqOeBrOeEmOeFpueGueaIvuaIveaJg+aJiOaJieeku+elgOelhuelieelm+elnOelk+elmuelouell+eloOelr+elp+eluuemheemiuemmuemp+ems+W/keW/kO+/vVwiLnNwbGl0KFwiXCIpO1xuZm9yKGogPSAwOyBqICE9IERbMjM2XS5sZW5ndGg7ICsraikgaWYoRFsyMzZdW2pdLmNoYXJDb2RlQXQoMCkgIT09IDB4RkZGRCkgeyBlW0RbMjM2XVtqXV0gPSA2MDQxNiArIGo7IGRbNjA0MTYgKyBqXSA9IERbMjM2XVtqXTt9XG5EWzIzN10gPSBcIu+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/veaAvOaBneaBmuaBp+aBgeaBmeaBo+aCq+aEhuaEjeaFneaGqeaGneaHi+aHkeaIhuiCgOiBv+ayk+aztua3vOeftuefuOeggOegieegl+egmOegkeaWq+egreegnOegneegueeguuegu+egn+egvOegpeegrOego+egqeehjuehreehluehl+egpuehkOehh+ehjOehqueim+eik+eimueih+einOeioeeio+eisueiueeipeejlOejmeejieejrOejsuekheejtOekk+ekpOeknuektOm+m+m7uem7u+m7vOebseechOecjeebueech+eciOecmuecouecmeecreecpuecteecuOedkOedkeedh+edg+edmuedqO+/vVwiLnNwbGl0KFwiXCIpO1xuZm9yKGogPSAwOyBqICE9IERbMjM3XS5sZW5ndGg7ICsraikgaWYoRFsyMzddW2pdLmNoYXJDb2RlQXQoMCkgIT09IDB4RkZGRCkgeyBlW0RbMjM3XVtqXV0gPSA2MDY3MiArIGo7IGRbNjA2NzIgKyBqXSA9IERbMjM3XVtqXTt9XG5EWzIzOF0gPSBcIu+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/veedouedpeedv+eejeedveeegOeejOeekeeen+eeoOeesOeeteeeveeUuueVgOeVjueVi+eViOeVm+eVsueVueeWg+e9mOe9oee9n+ipiOe9qOe9tOe9see9uee+gee9vuebjeebpeigsumShemShumSh+mSi+mSiumSjOmSjemSj+mSkOmSlOmSl+mSlemSmumSm+mSnOmSo+mSpOmSq+mSqumSremSrOmSr+mSsOmSsumStOmStumSt+mSuOmSuemSuumSvOmSvemSv+mThOmTiOmTiemTiumTi+mTjOmTjemTjumTkOmTkemTkumTlemTlumTl+mTmemTmOmTm+mTnumTn+mToOmToumTpOmTpemTp+mTqOmTqu+/vVwiLnNwbGl0KFwiXCIpO1xuZm9yKGogPSAwOyBqICE9IERbMjM4XS5sZW5ndGg7ICsraikgaWYoRFsyMzhdW2pdLmNoYXJDb2RlQXQoMCkgIT09IDB4RkZGRCkgeyBlW0RbMjM4XVtqXV0gPSA2MDkyOCArIGo7IGRbNjA5MjggKyBqXSA9IERbMjM4XVtqXTt9XG5EWzIzOV0gPSBcIu+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/vemTqemTq+mTrumTr+mTs+mTtOmTtemTt+mTuemTvOmTvemTv+mUg+mUgumUhumUh+mUiemUiumUjemUjumUj+mUkumUk+mUlOmUlemUlumUmOmUm+mUnemUnumUn+mUoumUqumUq+mUqemUrOmUsemUsumUtOmUtumUt+mUuOmUvOmUvumUv+mVgumUtemVhOmVhemVhumViemVjOmVjumVj+mVkumVk+mVlOmVlumVl+mVmOmVmemVm+mVnumVn+mVnemVoemVoumVpOmVpemVpumVp+mVqOmVqemVqumVq+mVrOmVr+mVsemVsumVs+mUuuefp+efrOmbieenleenreeno+enq+eohuW1h+eog+eogueonueolO+/vVwiLnNwbGl0KFwiXCIpO1xuZm9yKGogPSAwOyBqICE9IERbMjM5XS5sZW5ndGg7ICsraikgaWYoRFsyMzldW2pdLmNoYXJDb2RlQXQoMCkgIT09IDB4RkZGRCkgeyBlW0RbMjM5XVtqXV0gPSA2MTE4NCArIGo7IGRbNjExODQgKyBqXSA9IERbMjM5XVtqXTt9XG5EWzI0MF0gPSBcIu+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/veeoueeot+epkem7j+mmpeepsOeaiOeajueak+eameeapOeTnueToOeUrOm4oOm4oum4qOm4qem4qum4q+m4rOm4sum4sem4tum4uOm4t+m4uem4uum4vum5gem5gum5hOm5hum5h+m5iOm5iem5i+m5jOm5jum5kem5lem5l+m5mum5m+m5nOm5num5o+m5pum5p+m5qOm5qem5qum5q+m5rOm5sem5rem5s+eWkueWlOeWlueWoOeWneeWrOeWo+eWs+eWtOeWuOeXhOeWseeWsOeXg+eXgueXlueXjeeXo+eXqOeXpueXpOeXq+eXp+eYg+eXseeXvOeXv+eYkOeYgOeYheeYjOeYl+eYiueYpeeYmOeYleeYme+/vVwiLnNwbGl0KFwiXCIpO1xuZm9yKGogPSAwOyBqICE9IERbMjQwXS5sZW5ndGg7ICsraikgaWYoRFsyNDBdW2pdLmNoYXJDb2RlQXQoMCkgIT09IDB4RkZGRCkgeyBlW0RbMjQwXVtqXV0gPSA2MTQ0MCArIGo7IGRbNjE0NDAgKyBqXSA9IERbMjQwXVtqXTt9XG5EWzI0MV0gPSBcIu+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/veeYm+eYvOeYoueYoOeZgOeYreeYsOeYv+eYteeZg+eYvueYs+eZjeeZnueZlOeZnOeZlueZq+eZr+e/iuerpuepuOepueeqgOeqhueqiOeqleeqpueqoOeqrOeqqOeqreeqs+ihpOihqeihsuihveihv+iiguiiouijhuiit+iivOijieijouijjuijo+ijpeijseikmuijvOijqOijvuijsOikoeikmeikk+ikm+ikiuiktOikq+iktuilgeilpuilu+eWi+iDpeeasueatOefnOiAkuiAlOiAluiAnOiAoOiAouiApeiApuiAp+iAqeiAqOiAseiAi+iAteiBg+iBhuiBjeiBkuiBqeiBseimg+mhuOmigOmig++/vVwiLnNwbGl0KFwiXCIpO1xuZm9yKGogPSAwOyBqICE9IERbMjQxXS5sZW5ndGg7ICsraikgaWYoRFsyNDFdW2pdLmNoYXJDb2RlQXQoMCkgIT09IDB4RkZGRCkgeyBlW0RbMjQxXVtqXV0gPSA2MTY5NiArIGo7IGRbNjE2OTYgKyBqXSA9IERbMjQxXVtqXTt9XG5EWzI0Ml0gPSBcIu+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/vemiiemijOmijemij+milOmimumim+minumin+mioemioumipemipuiZjeiZlOiZrOiZruiZv+iZuuiZvOiZu+iaqOiajeiai+iarOianeiap+iao+iaquiak+iaqeiatuibhOiateibjuiasOiauuiaseiar+ibieibj+iatOibqeibseibsuibreibs+ibkOick+ibnuibtOibn+ibmOibkeicg+ich+ibuOiciOiciuicjeicieico+icu+icnuicpeicruicmuicvuidiOictOicseicqeict+icv+ieguicouidveidvuidu+idoOidsOidjOidruiei+idk+ido+idvOidpOidmeidpeiek+ier+ieqOifku+/vVwiLnNwbGl0KFwiXCIpO1xuZm9yKGogPSAwOyBqICE9IERbMjQyXS5sZW5ndGg7ICsraikgaWYoRFsyNDJdW2pdLmNoYXJDb2RlQXQoMCkgIT09IDB4RkZGRCkgeyBlW0RbMjQyXVtqXV0gPSA2MTk1MiArIGo7IGRbNjE5NTIgKyBqXSA9IERbMjQyXVtqXTt9XG5EWzI0M10gPSBcIu+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/veifhuieiOieheiereiel+ieg+ieq+ifpeierOieteies+ifi+ifk+ieveifkeifgOifiuifm+ifquifoOifruigluigk+ifvuigiuigm+igoeigueigvOe8tue9gue9hOe9heiIkOeruuerveesiOesg+eshOesleesiuesq+esj+eth+esuOesquesmeesruesseesoOespeespOess+esvuesnuetmOetmuetheetteetjOetneetoOetruetu+etouetsuetseeukOeupueup+euuOeurOeuneeuqOeuheeuqueunOeuoueuq+eutOevkeevgeevjOevneevmuevpeevpuevquewjOevvuevvOewj+ewluewi++/vVwiLnNwbGl0KFwiXCIpO1xuZm9yKGogPSAwOyBqICE9IERbMjQzXS5sZW5ndGg7ICsraikgaWYoRFsyNDNdW2pdLmNoYXJDb2RlQXQoMCkgIT09IDB4RkZGRCkgeyBlW0RbMjQzXVtqXV0gPSA2MjIwOCArIGo7IGRbNjIyMDggKyBqXSA9IERbMjQzXVtqXTt9XG5EWzI0NF0gPSBcIu+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/veewn+ewquewpuewuOexgeexgOiHvuiIgeiIguiIhOiHrOihhOiIoeiIouiIo+iIreiIr+iIqOiIq+iIuOiIu+iIs+iItOiIvuiJhOiJieiJi+iJj+iJmuiJn+iJqOihvuiiheiiiOijmOijn+ilnue+nee+n+e+p+e+r+e+sOe+suexvOaVieeykeeyneeynOeynueyoueysueyvOeyveezgeezh+ezjOezjeeziOezheezl+ezqOiJruaaqOe+v+e/jue/lee/pee/oee/pue/qee/rue/s+ezuOe1t+e2pue2rue5h+e6m+m6uOm6tOi1s+i2hOi2lOi2kei2sei1p+i1reixh+ixiemFiumFkOmFjumFj+mFpO+/vVwiLnNwbGl0KFwiXCIpO1xuZm9yKGogPSAwOyBqICE9IERbMjQ0XS5sZW5ndGg7ICsraikgaWYoRFsyNDRdW2pdLmNoYXJDb2RlQXQoMCkgIT09IDB4RkZGRCkgeyBlW0RbMjQ0XVtqXV0gPSA2MjQ2NCArIGo7IGRbNjI0NjQgKyBqXSA9IERbMjQ0XVtqXTt9XG5EWzI0NV0gPSBcIu+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/vemFoumFoemFsOmFqemFr+mFvemFvumFsumFtOmFuemGjOmGhemGkOmGjemGkemGoumGo+mGqumGremGrumGr+mGtemGtOmGuuixlem5vui2uOi3q+i4hei5mei5qei2tei2v+i2vOi2uui3hOi3lui3l+i3mui3nui3jui3j+i3m+i3hui3rOi3t+i3uOi3o+i3uei3u+i3pOi4iei3vei4lOi4nei4n+i4rOi4rui4o+i4r+i4uui5gOi4uei4tei4vei4sei5iei5gei5gui5kei5kui5iui5sOi5tui5vOi5r+i5tOi6hei6j+i6lOi6kOi6nOi6nuixuOiyguiyiuiyheiymOiylOaWm+inluinnuinmuinnO+/vVwiLnNwbGl0KFwiXCIpO1xuZm9yKGogPSAwOyBqICE9IERbMjQ1XS5sZW5ndGg7ICsraikgaWYoRFsyNDVdW2pdLmNoYXJDb2RlQXQoMCkgIT09IDB4RkZGRCkgeyBlW0RbMjQ1XVtqXV0gPSA2MjcyMCArIGo7IGRbNjI3MjAgKyBqXSA9IERbMjQ1XVtqXTt9XG5EWzI0Nl0gPSBcIu+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/veinpeinq+inr+iovuispumdk+mbqembs+mbr+mchumcgemciOmcj+mcjumcqumcremcsOmcvum+gOm+g+m+hem+hum+h+m+iOm+iem+ium+jOm7vum8i+m8jemauemavOmavembjumbkueev+mboOmKjumKrumLiOmMvumNqumPiumOj+mQvumRq+mxv+mygumyhemyhumyh+myiOeoo+myi+myjumykOmykemykumylOmylemymumym+mynumyn+myoOmyoemyoumyo+mypemypumyp+myqOmyqemyq+myremyrumysOmysemysumys+mytOmytemytumyt+myuumyu+myvOmyvemzhOmzhemzhumzh+mziumzi++/vVwiLnNwbGl0KFwiXCIpO1xuZm9yKGogPSAwOyBqICE9IERbMjQ2XS5sZW5ndGg7ICsraikgaWYoRFsyNDZdW2pdLmNoYXJDb2RlQXQoMCkgIT09IDB4RkZGRCkgeyBlW0RbMjQ2XVtqXV0gPSA2Mjk3NiArIGo7IGRbNjI5NzYgKyBqXSA9IERbMjQ2XVtqXTt9XG5EWzI0N10gPSBcIu+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/vemzjOmzjemzjumzj+mzkOmzk+mzlOmzlemzl+mzmOmzmemznOmznemzn+mzoumdvOmehemekemekumelOmer+meq+meo+mesumetOmqsemqsOmqt+m5mOmqtumquumqvOmrgemrgOmrhemrgumri+mrjOmrkemthemtg+mth+mtiemtiOmtjemtkemjqOmkjemkrumllemllOmrn+mroemrpumrr+mrq+mru+mrremruemsiOmsj+msk+msn+mso+m6vem6vue4u+m6gum6h+m6iOm6i+m6kumPlum6nem6n+m7m+m7nOm7nem7oOm7n+m7oum7qem7p+m7pem7qum7r+m8oum8rOm8r+m8uem8t+m8vem8vum9hO+/vVwiLnNwbGl0KFwiXCIpO1xuZm9yKGogPSAwOyBqICE9IERbMjQ3XS5sZW5ndGg7ICsraikgaWYoRFsyNDddW2pdLmNoYXJDb2RlQXQoMCkgIT09IDB4RkZGRCkgeyBlW0RbMjQ3XVtqXV0gPSA2MzIzMiArIGo7IGRbNjMyMzIgKyBqXSA9IERbMjQ3XVtqXTt9XG5yZXR1cm4ge1wiZW5jXCI6IGUsIFwiZGVjXCI6IGQgfTsgfSkoKTtcbmNwdGFibGVbMTAwMjldID0gKGZ1bmN0aW9uKCl7IHZhciBkID0gXCJcXHUwMDAwXFx1MDAwMVxcdTAwMDJcXHUwMDAzXFx1MDAwNFxcdTAwMDVcXHUwMDA2XFx1MDAwN1xcYlxcdFxcblxcdTAwMGJcXGZcXHJcXHUwMDBlXFx1MDAwZlxcdTAwMTBcXHUwMDExXFx1MDAxMlxcdTAwMTNcXHUwMDE0XFx1MDAxNVxcdTAwMTZcXHUwMDE3XFx1MDAxOFxcdTAwMTlcXHUwMDFhXFx1MDAxYlxcdTAwMWNcXHUwMDFkXFx1MDAxZVxcdTAwMWYgIVxcXCIjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltcXFxcXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fn/DhMSAxIHDicSEw5bDnMOhxIXEjMOkxI3EhsSHw6nFucW6xI7DrcSPxJLEk8SWw7PEl8O0w7bDtcO6xJrEm8O84oCgwrDEmMKjwqfigKLCtsOfwq7CqeKEosSZwqjiiaDEo8SuxK/EquKJpOKJpcSrxLbiiILiiJHFgsS7xLzEvcS+xLnEusWFxYbFg8Ks4oiaxYTFh+KIhsKrwrvigKbCoMWIxZDDlcWRxYzigJPigJTigJzigJ3igJjigJnDt+KXisWNxZTFlcWY4oC54oC6xZnFlsWXxaDigJrigJ7FocWaxZvDgcWkxaXDjcW9xb7FqsOTw5TFq8Wuw5rFr8WwxbHFssWzw53DvcS3xbvFgcW8xKLLh1wiLCBEID0gW10sIGUgPSB7fTsgZm9yKHZhciBpPTA7aSE9ZC5sZW5ndGg7KytpKSB7IGlmKGQuY2hhckNvZGVBdChpKSAhPT0gMHhGRkZEKSBlW2QuY2hhckF0KGkpXSA9IGk7IERbaV0gPSBkLmNoYXJBdChpKTsgfSByZXR1cm4ge1wiZW5jXCI6IGUsIFwiZGVjXCI6IEQgfTsgfSkoKTtcbmNwdGFibGVbMTAwNzldID0gKGZ1bmN0aW9uKCl7IHZhciBkID0gXCJcXHUwMDAwXFx1MDAwMVxcdTAwMDJcXHUwMDAzXFx1MDAwNFxcdTAwMDVcXHUwMDA2XFx1MDAwN1xcYlxcdFxcblxcdTAwMGJcXGZcXHJcXHUwMDBlXFx1MDAwZlxcdTAwMTBcXHUwMDExXFx1MDAxMlxcdTAwMTNcXHUwMDE0XFx1MDAxNVxcdTAwMTZcXHUwMDE3XFx1MDAxOFxcdTAwMTlcXHUwMDFhXFx1MDAxYlxcdTAwMWNcXHUwMDFkXFx1MDAxZVxcdTAwMWYgIVxcXCIjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltcXFxcXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fn/DhMOFw4fDicORw5bDnMOhw6DDosOkw6PDpcOnw6nDqMOqw6vDrcOsw67Dr8Oxw7PDssO0w7bDtcO6w7nDu8O8w53CsMKiwqPCp+KAosK2w5/CrsKp4oSiwrTCqOKJoMOGw5jiiJ7CseKJpOKJpcKlwrXiiILiiJHiiI/PgOKIq8KqwrrihKbDpsO4wr/CocKs4oiaxpLiiYjiiIbCq8K74oCmwqDDgMODw5XFksWT4oCT4oCU4oCc4oCd4oCY4oCZw7fil4rDv8W44oGEwqTDkMOww57DvsO9wrfigJrigJ7igLDDgsOKw4HDi8OIw43DjsOPw4zDk8OU77+9w5LDmsObw5nEscuGy5zCr8uYy5nLmsK4y53Lm8uHXCIsIEQgPSBbXSwgZSA9IHt9OyBmb3IodmFyIGk9MDtpIT1kLmxlbmd0aDsrK2kpIHsgaWYoZC5jaGFyQ29kZUF0KGkpICE9PSAweEZGRkQpIGVbZC5jaGFyQXQoaSldID0gaTsgRFtpXSA9IGQuY2hhckF0KGkpOyB9IHJldHVybiB7XCJlbmNcIjogZSwgXCJkZWNcIjogRCB9OyB9KSgpO1xuY3B0YWJsZVsxMDA4MV0gPSAoZnVuY3Rpb24oKXsgdmFyIGQgPSBcIlxcdTAwMDBcXHUwMDAxXFx1MDAwMlxcdTAwMDNcXHUwMDA0XFx1MDAwNVxcdTAwMDZcXHUwMDA3XFxiXFx0XFxuXFx1MDAwYlxcZlxcclxcdTAwMGVcXHUwMDBmXFx1MDAxMFxcdTAwMTFcXHUwMDEyXFx1MDAxM1xcdTAwMTRcXHUwMDE1XFx1MDAxNlxcdTAwMTdcXHUwMDE4XFx1MDAxOVxcdTAwMWFcXHUwMDFiXFx1MDAxY1xcdTAwMWRcXHUwMDFlXFx1MDAxZiAhXFxcIiMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojs8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW1xcXFxdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+f8OEw4XDh8OJw5HDlsOcw6HDoMOiw6TDo8Olw6fDqcOow6rDq8Otw6zDrsOvw7HDs8Oyw7TDtsO1w7rDucO7w7zigKDCsMKiwqPCp+KAosK2w5/CrsKp4oSiwrTCqOKJoMOGw5jiiJ7CseKJpOKJpcKlwrXiiILiiJHiiI/PgOKIq8KqwrrihKbDpsO4wr/CocKs4oiaxpLiiYjiiIbCq8K74oCmwqDDgMODw5XFksWT4oCT4oCU4oCc4oCd4oCY4oCZw7fil4rDv8W4xJ7En8SwxLHFnsWf4oChwrfigJrigJ7igLDDgsOKw4HDi8OIw43DjsOPw4zDk8OU77+9w5LDmsObw5nvv73Lhsucwq/LmMuZy5rCuMudy5vLh1wiLCBEID0gW10sIGUgPSB7fTsgZm9yKHZhciBpPTA7aSE9ZC5sZW5ndGg7KytpKSB7IGlmKGQuY2hhckNvZGVBdChpKSAhPT0gMHhGRkZEKSBlW2QuY2hhckF0KGkpXSA9IGk7IERbaV0gPSBkLmNoYXJBdChpKTsgfSByZXR1cm4ge1wiZW5jXCI6IGUsIFwiZGVjXCI6IEQgfTsgfSkoKTtcbmNwdGFibGVbMjg1OTFdID0gKGZ1bmN0aW9uKCl7IHZhciBkID0gXCJcXHUwMDAwXFx1MDAwMVxcdTAwMDJcXHUwMDAzXFx1MDAwNFxcdTAwMDVcXHUwMDA2XFx1MDAwN1xcYlxcdFxcblxcdTAwMGJcXGZcXHJcXHUwMDBlXFx1MDAwZlxcdTAwMTBcXHUwMDExXFx1MDAxMlxcdTAwMTNcXHUwMDE0XFx1MDAxNVxcdTAwMTZcXHUwMDE3XFx1MDAxOFxcdTAwMTlcXHUwMDFhXFx1MDAxYlxcdTAwMWNcXHUwMDFkXFx1MDAxZVxcdTAwMWYgIVxcXCIjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltcXFxcXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fn/CgMKBwoLCg8KEwoXChsKHwojCicKKwovCjMKNwo7Cj8KQwpHCksKTwpTClcKWwpfCmMKZwprCm8Kcwp3CnsKfwqDCocKiwqPCpMKlwqbCp8KowqnCqsKrwqzCrcKuwq/CsMKxwrLCs8K0wrXCtsK3wrjCucK6wrvCvMK9wr7Cv8OAw4HDgsODw4TDhcOGw4fDiMOJw4rDi8OMw43DjsOPw5DDkcOSw5PDlMOVw5bDl8OYw5nDmsObw5zDncOew5/DoMOhw6LDo8Okw6XDpsOnw6jDqcOqw6vDrMOtw67Dr8Oww7HDssOzw7TDtcO2w7fDuMO5w7rDu8O8w73DvsO/XCIsIEQgPSBbXSwgZSA9IHt9OyBmb3IodmFyIGk9MDtpIT1kLmxlbmd0aDsrK2kpIHsgaWYoZC5jaGFyQ29kZUF0KGkpICE9PSAweEZGRkQpIGVbZC5jaGFyQXQoaSldID0gaTsgRFtpXSA9IGQuY2hhckF0KGkpOyB9IHJldHVybiB7XCJlbmNcIjogZSwgXCJkZWNcIjogRCB9OyB9KSgpO1xuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVuZGVmXG5pZiAodHlwZW9mIG1vZHVsZSAhPT0gJ3VuZGVmaW5lZCcgJiYgbW9kdWxlLmV4cG9ydHMgJiYgdHlwZW9mIERPX05PVF9FWFBPUlRfQ09ERVBBR0UgPT09ICd1bmRlZmluZWQnKSBtb2R1bGUuZXhwb3J0cyA9IGNwdGFibGU7XG4vKiEgY3B1dGlscy5qcyAoQykgMjAxMy1wcmVzZW50IFNoZWV0SlMgLS0gaHR0cDovL3NoZWV0anMuY29tICovXG4vKiB2aW06IHNldCBmdD1qYXZhc2NyaXB0OiAqL1xuLypqc2hpbnQgbmV3Y2FwOiBmYWxzZSAqL1xuKGZ1bmN0aW9uKHJvb3QsIGZhY3RvcnkpIHtcbiAgLypqc2hpbnQgaWdub3JlOnN0YXJ0ICovXG4gIC8qZXNsaW50LWRpc2FibGUgKi9cbiAgXCJ1c2Ugc3RyaWN0XCI7XG4gIGlmKHR5cGVvZiBjcHRhYmxlID09PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgaWYodHlwZW9mIHJlcXVpcmUgIT09IFwidW5kZWZpbmVkXCIpe1xuICAgICAgdmFyIGNwdCA9IGNwdGFibGU7XG4gICAgICBpZiAodHlwZW9mIG1vZHVsZSAhPT0gJ3VuZGVmaW5lZCcgJiYgbW9kdWxlLmV4cG9ydHMgJiYgdHlwZW9mIERPX05PVF9FWFBPUlRfQ09ERVBBR0UgPT09ICd1bmRlZmluZWQnKSBtb2R1bGUuZXhwb3J0cyA9IGZhY3RvcnkoY3B0KTtcbiAgICAgIGVsc2Ugcm9vdC5jcHRhYmxlID0gZmFjdG9yeShjcHQpO1xuICAgIH0gZWxzZSB0aHJvdyBuZXcgRXJyb3IoXCJjcHRhYmxlIG5vdCBmb3VuZFwiKTtcbiAgfSBlbHNlIGNwdGFibGUgPSBmYWN0b3J5KGNwdGFibGUpO1xuICAvKmVzbGludC1lbmFibGUgKi9cbiAgLypqc2hpbnQgaWdub3JlOmVuZCAqL1xufSh0aGlzLCBmdW5jdGlvbihjcHQpe1xuICBcInVzZSBzdHJpY3RcIjtcbiAgLypnbG9iYWwgbW9kdWxlLCBCdWZmZXIgKi9cbiAgdmFyIG1hZ2ljID0ge1xuICAgIFwiMTIwMFwiOlwidXRmMTZsZVwiLFxuICAgIFwiMTIwMVwiOlwidXRmMTZiZVwiLFxuICAgIFwiMTIwMDBcIjpcInV0ZjMybGVcIixcbiAgICBcIjEyMDAxXCI6XCJ1dGYzMmJlXCIsXG4gICAgXCIxNjk2OVwiOlwidXRmNjRsZVwiLFxuICAgIFwiMjAxMjdcIjpcImFzY2lpXCIsXG4gICAgXCI2NTAwMFwiOlwidXRmN1wiLFxuICAgIFwiNjUwMDFcIjpcInV0ZjhcIlxuICB9O1xuXG4gIHZhciBzYmNzX2NhY2hlID0gWzg3NCwxMjUwLDEyNTEsMTI1MiwxMjUzLDEyNTQsMTI1NSwxMjU2LDEwMDAwXTtcbiAgdmFyIGRiY3NfY2FjaGUgPSBbOTMyLDkzNiw5NDksOTUwXTtcbiAgdmFyIG1hZ2ljX2NhY2hlID0gWzY1MDAxXTtcbiAgdmFyIG1hZ2ljX2RlY29kZSA9IHt9O1xuICB2YXIgbWFnaWNfZW5jb2RlID0ge307XG4gIHZhciBjcGRjYWNoZSA9IHt9O1xuICB2YXIgY3BlY2FjaGUgPSB7fTtcblxuICB2YXIgc2ZjYyA9IGZ1bmN0aW9uIHNmY2MoeCkgeyByZXR1cm4gU3RyaW5nLmZyb21DaGFyQ29kZSh4KTsgfTtcbiAgdmFyIGNjYSA9IGZ1bmN0aW9uIGNjYSh4KSB7IHJldHVybiB4LmNoYXJDb2RlQXQoMCk7IH07XG5cbiAgdmFyIGhhc19idWYgPSAodHlwZW9mIEJ1ZmZlciAhPT0gJ3VuZGVmaW5lZCcpO1xuICB2YXIgQnVmZmVyX2Zyb20gPSBmdW5jdGlvbigpe307XG4gIGlmKGhhc19idWYpIHtcbiAgICB2YXIgbmJmcyA9ICFCdWZmZXIuZnJvbTtcbiAgICBpZighbmJmcykgdHJ5IHsgQnVmZmVyLmZyb20oXCJmb29cIiwgXCJ1dGY4XCIpOyB9IGNhdGNoKGUpIHsgbmJmcyA9IHRydWU7IH1cbiAgICBCdWZmZXJfZnJvbSA9IG5iZnMgPyBmdW5jdGlvbihidWYsIGVuYykgeyByZXR1cm4gKGVuYykgPyBuZXcgQnVmZmVyKGJ1ZiwgZW5jKSA6IG5ldyBCdWZmZXIoYnVmKTsgfSA6IEJ1ZmZlci5mcm9tLmJpbmQoQnVmZmVyKTtcbiAgICAvLyAkRmxvd0lnbm9yZVxuICAgIGlmKCFCdWZmZXIuYWxsb2NVbnNhZmUpIEJ1ZmZlci5hbGxvY1Vuc2FmZSA9IGZ1bmN0aW9uKG4pIHsgcmV0dXJuIG5ldyBCdWZmZXIobik7IH07XG5cbiAgICB2YXIgbWRsID0gMTAyNCwgbWRiID0gQnVmZmVyLmFsbG9jVW5zYWZlKG1kbCk7XG4gICAgdmFyIG1ha2VfRUUgPSBmdW5jdGlvbiBtYWtlX0VFKEUpe1xuICAgICAgdmFyIEVFID0gQnVmZmVyLmFsbG9jVW5zYWZlKDY1NTM2KTtcbiAgICAgIGZvcih2YXIgaSA9IDA7IGkgPCA2NTUzNjsrK2kpIEVFW2ldID0gMDtcbiAgICAgIHZhciBrZXlzID0gT2JqZWN0LmtleXMoRSksIGxlbiA9IGtleXMubGVuZ3RoO1xuICAgICAgZm9yKHZhciBlZSA9IDAsIGUgPSBrZXlzW2VlXTsgZWUgPCBsZW47ICsrZWUpIHtcbiAgICAgICAgaWYoIShlID0ga2V5c1tlZV0pKSBjb250aW51ZTtcbiAgICAgICAgRUVbZS5jaGFyQ29kZUF0KDApXSA9IEVbZV07XG4gICAgICB9XG4gICAgICByZXR1cm4gRUU7XG4gICAgfTtcbiAgICB2YXIgc2Jjc19lbmNvZGUgPSBmdW5jdGlvbiBtYWtlX3NiY3NfZW5jb2RlKGNwKSB7XG4gICAgICB2YXIgRUUgPSBtYWtlX0VFKGNwdFtjcF0uZW5jKTtcbiAgICAgIHJldHVybiBmdW5jdGlvbiBzYmNzX2UoZGF0YSwgb2ZtdCkge1xuICAgICAgICB2YXIgbGVuID0gZGF0YS5sZW5ndGg7XG4gICAgICAgIHZhciBvdXQsIGk9MCwgaj0wLCBEPTAsIHc9MDtcbiAgICAgICAgaWYodHlwZW9mIGRhdGEgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgb3V0ID0gQnVmZmVyLmFsbG9jVW5zYWZlKGxlbik7XG4gICAgICAgICAgZm9yKGkgPSAwOyBpIDwgbGVuOyArK2kpIG91dFtpXSA9IEVFW2RhdGEuY2hhckNvZGVBdChpKV07XG4gICAgICAgIH0gZWxzZSBpZihCdWZmZXIuaXNCdWZmZXIoZGF0YSkpIHtcbiAgICAgICAgICBvdXQgPSBCdWZmZXIuYWxsb2NVbnNhZmUoMipsZW4pO1xuICAgICAgICAgIGogPSAwO1xuICAgICAgICAgIGZvcihpID0gMDsgaSA8IGxlbjsgKytpKSB7XG4gICAgICAgICAgICBEID0gZGF0YVtpXTtcbiAgICAgICAgICAgIGlmKEQgPCAxMjgpIG91dFtqKytdID0gRUVbRF07XG4gICAgICAgICAgICBlbHNlIGlmKEQgPCAyMjQpIHsgb3V0W2orK10gPSBFRVsoKEQmMzEpPDw2KSsoZGF0YVtpKzFdJjYzKV07ICsraTsgfVxuICAgICAgICAgICAgZWxzZSBpZihEIDwgMjQwKSB7IG91dFtqKytdID0gRUVbKChEJjE1KTw8MTIpKygoZGF0YVtpKzFdJjYzKTw8NikrKGRhdGFbaSsyXSY2MyldOyBpKz0yOyB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgdyA9ICgoRCY3KTw8MTgpKygoZGF0YVtpKzFdJjYzKTw8MTIpKygoZGF0YVtpKzJdJjYzKTw8NikrKGRhdGFbaSszXSY2Myk7IGkrPTM7XG4gICAgICAgICAgICAgIGlmKHcgPCA2NTUzNikgb3V0W2orK10gPSBFRVt3XTtcbiAgICAgICAgICAgICAgZWxzZSB7IHcgLT0gNjU1MzY7IG91dFtqKytdID0gRUVbMHhEODAwICsgKCh3Pj4xMCkmMTAyMyldOyBvdXRbaisrXSA9IEVFWzB4REMwMCArICh3JjEwMjMpXTsgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBvdXQgPSBvdXQuc2xpY2UoMCxqKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBvdXQgPSBCdWZmZXIuYWxsb2NVbnNhZmUobGVuKTtcbiAgICAgICAgICBmb3IoaSA9IDA7IGkgPCBsZW47ICsraSkgb3V0W2ldID0gRUVbZGF0YVtpXS5jaGFyQ29kZUF0KDApXTtcbiAgICAgICAgfVxuICAgICAgICBpZighb2ZtdCB8fCBvZm10ID09PSAnYnVmJykgcmV0dXJuIG91dDtcbiAgICAgICAgaWYob2ZtdCAhPT0gJ2FycicpIHJldHVybiBvdXQudG9TdHJpbmcoJ2JpbmFyeScpO1xuICAgICAgICByZXR1cm4gW10uc2xpY2UuY2FsbChvdXQpO1xuICAgICAgfTtcbiAgICB9O1xuICAgIHZhciBzYmNzX2RlY29kZSA9IGZ1bmN0aW9uIG1ha2Vfc2Jjc19kZWNvZGUoY3ApIHtcbiAgICAgIHZhciBEID0gY3B0W2NwXS5kZWM7XG4gICAgICB2YXIgREQgPSBCdWZmZXIuYWxsb2NVbnNhZmUoMTMxMDcyKSwgZD0wLCBjPVwiXCI7XG4gICAgICBmb3IoZD0wO2Q8RC5sZW5ndGg7KytkKSB7XG4gICAgICAgIGlmKCEoYz1EW2RdKSkgY29udGludWU7XG4gICAgICAgIHZhciB3ID0gYy5jaGFyQ29kZUF0KDApO1xuICAgICAgICBERFsyKmRdID0gdyYyNTU7IEREWzIqZCsxXSA9IHc+Pjg7XG4gICAgICB9XG4gICAgICByZXR1cm4gZnVuY3Rpb24gc2Jjc19kKGRhdGEpIHtcbiAgICAgICAgdmFyIGxlbiA9IGRhdGEubGVuZ3RoLCBpPTAsIGo9MDtcbiAgICAgICAgaWYoMiAqIGxlbiA+IG1kbCkgeyBtZGwgPSAyICogbGVuOyBtZGIgPSBCdWZmZXIuYWxsb2NVbnNhZmUobWRsKTsgfVxuICAgICAgICBpZihCdWZmZXIuaXNCdWZmZXIoZGF0YSkpIHtcbiAgICAgICAgICBmb3IoaSA9IDA7IGkgPCBsZW47IGkrKykge1xuICAgICAgICAgICAgaiA9IDIqZGF0YVtpXTtcbiAgICAgICAgICAgIG1kYlsyKmldID0gRERbal07IG1kYlsyKmkrMV0gPSBERFtqKzFdO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmKHR5cGVvZiBkYXRhID09PSBcInN0cmluZ1wiKSB7XG4gICAgICAgICAgZm9yKGkgPSAwOyBpIDwgbGVuOyBpKyspIHtcbiAgICAgICAgICAgIGogPSAyKmRhdGEuY2hhckNvZGVBdChpKTtcbiAgICAgICAgICAgIG1kYlsyKmldID0gRERbal07IG1kYlsyKmkrMV0gPSBERFtqKzFdO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBmb3IoaSA9IDA7IGkgPCBsZW47IGkrKykge1xuICAgICAgICAgICAgaiA9IDIqZGF0YVtpXTtcbiAgICAgICAgICAgIG1kYlsyKmldID0gRERbal07IG1kYlsyKmkrMV0gPSBERFtqKzFdO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbWRiLnNsaWNlKDAsIDIgKiBsZW4pLnRvU3RyaW5nKCd1Y3MyJyk7XG4gICAgICB9O1xuICAgIH07XG4gICAgdmFyIGRiY3NfZW5jb2RlID0gZnVuY3Rpb24gbWFrZV9kYmNzX2VuY29kZShjcCkge1xuICAgICAgdmFyIEUgPSBjcHRbY3BdLmVuYztcbiAgICAgIHZhciBFRSA9IEJ1ZmZlci5hbGxvY1Vuc2FmZSgxMzEwNzIpO1xuICAgICAgZm9yKHZhciBpID0gMDsgaSA8IDEzMTA3MjsgKytpKSBFRVtpXSA9IDA7XG4gICAgICB2YXIga2V5cyA9IE9iamVjdC5rZXlzKEUpO1xuICAgICAgZm9yKHZhciBlZSA9IDAsIGUgPSBrZXlzW2VlXTsgZWUgPCBrZXlzLmxlbmd0aDsgKytlZSkge1xuICAgICAgICBpZighKGUgPSBrZXlzW2VlXSkpIGNvbnRpbnVlO1xuICAgICAgICB2YXIgZiA9IGUuY2hhckNvZGVBdCgwKTtcbiAgICAgICAgRUVbMipmXSA9IEVbZV0gJiAyNTU7IEVFWzIqZisxXSA9IEVbZV0+Pjg7XG4gICAgICB9XG4gICAgICByZXR1cm4gZnVuY3Rpb24gZGJjc19lKGRhdGEsIG9mbXQpIHtcbiAgICAgICAgdmFyIGxlbiA9IGRhdGEubGVuZ3RoLCBvdXQgPSBCdWZmZXIuYWxsb2NVbnNhZmUoMipsZW4pLCBpPTAsIGo9MCwgamo9MCwgaz0wLCBEPTA7XG4gICAgICAgIGlmKHR5cGVvZiBkYXRhID09PSAnc3RyaW5nJykge1xuICAgICAgICAgIGZvcihpID0gayA9IDA7IGkgPCBsZW47ICsraSkge1xuICAgICAgICAgICAgaiA9IGRhdGEuY2hhckNvZGVBdChpKSoyO1xuICAgICAgICAgICAgb3V0W2srK10gPSBFRVtqKzFdIHx8IEVFW2pdOyBpZihFRVtqKzFdID4gMCkgb3V0W2srK10gPSBFRVtqXTtcbiAgICAgICAgICB9XG4gICAgICAgICAgb3V0ID0gb3V0LnNsaWNlKDAsayk7XG4gICAgICAgIH0gZWxzZSBpZihCdWZmZXIuaXNCdWZmZXIoZGF0YSkpIHtcbiAgICAgICAgICBmb3IoaSA9IGsgPSAwOyBpIDwgbGVuOyArK2kpIHtcbiAgICAgICAgICAgIEQgPSBkYXRhW2ldO1xuICAgICAgICAgICAgaWYoRCA8IDEyOCkgaiA9IEQ7XG4gICAgICAgICAgICBlbHNlIGlmKEQgPCAyMjQpIHsgaiA9ICgoRCYzMSk8PDYpKyhkYXRhW2krMV0mNjMpOyArK2k7IH1cbiAgICAgICAgICAgIGVsc2UgaWYoRCA8IDI0MCkgeyBqID0gKChEJjE1KTw8MTIpKygoZGF0YVtpKzFdJjYzKTw8NikrKGRhdGFbaSsyXSY2Myk7IGkrPTI7IH1cbiAgICAgICAgICAgIGVsc2UgeyBqID0gKChEJjcpPDwxOCkrKChkYXRhW2krMV0mNjMpPDwxMikrKChkYXRhW2krMl0mNjMpPDw2KSsoZGF0YVtpKzNdJjYzKTsgaSs9MzsgfVxuICAgICAgICAgICAgaWYoajw2NTUzNikgeyBqKj0yOyBvdXRbaysrXSA9IEVFW2orMV0gfHwgRUVbal07IGlmKEVFW2orMV0gPiAwKSBvdXRbaysrXSA9IEVFW2pdOyB9XG4gICAgICAgICAgICBlbHNlIHsgamogPSBqLTY1NTM2O1xuICAgICAgICAgICAgICBqPTIqKDB4RDgwMCArICgoamo+PjEwKSYxMDIzKSk7IG91dFtrKytdID0gRUVbaisxXSB8fCBFRVtqXTsgaWYoRUVbaisxXSA+IDApIG91dFtrKytdID0gRUVbal07XG4gICAgICAgICAgICAgIGo9MiooMHhEQzAwICsgKGpqJjEwMjMpKTsgb3V0W2srK10gPSBFRVtqKzFdIHx8IEVFW2pdOyBpZihFRVtqKzFdID4gMCkgb3V0W2srK10gPSBFRVtqXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgb3V0ID0gb3V0LnNsaWNlKDAsayk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgZm9yKGkgPSBrID0gMDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgICAgICAgICBqID0gZGF0YVtpXS5jaGFyQ29kZUF0KDApKjI7XG4gICAgICAgICAgICBvdXRbaysrXSA9IEVFW2orMV0gfHwgRUVbal07IGlmKEVFW2orMV0gPiAwKSBvdXRbaysrXSA9IEVFW2pdO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZighb2ZtdCB8fCBvZm10ID09PSAnYnVmJykgcmV0dXJuIG91dDtcbiAgICAgICAgaWYob2ZtdCAhPT0gJ2FycicpIHJldHVybiBvdXQudG9TdHJpbmcoJ2JpbmFyeScpO1xuICAgICAgICByZXR1cm4gW10uc2xpY2UuY2FsbChvdXQpO1xuICAgICAgfTtcbiAgICB9O1xuICAgIHZhciBkYmNzX2RlY29kZSA9IGZ1bmN0aW9uIG1ha2VfZGJjc19kZWNvZGUoY3ApIHtcbiAgICAgIHZhciBEID0gY3B0W2NwXS5kZWM7XG4gICAgICB2YXIgREQgPSBCdWZmZXIuYWxsb2NVbnNhZmUoMTMxMDcyKSwgZD0wLCBjLCB3PTAsIGo9MCwgaT0wO1xuICAgICAgZm9yKGkgPSAwOyBpIDwgNjU1MzY7ICsraSkgeyBERFsyKmldID0gMHhGRjsgRERbMippKzFdID0gMHhGRDt9XG4gICAgICBmb3IoZCA9IDA7IGQgPCBELmxlbmd0aDsgKytkKSB7XG4gICAgICAgIGlmKCEoYz1EW2RdKSkgY29udGludWU7XG4gICAgICAgIHcgPSBjLmNoYXJDb2RlQXQoMCk7XG4gICAgICAgIGogPSAyKmQ7XG4gICAgICAgIEREW2pdID0gdyYyNTU7IEREW2orMV0gPSB3Pj44O1xuICAgICAgfVxuICAgICAgcmV0dXJuIGZ1bmN0aW9uIGRiY3NfZChkYXRhKSB7XG4gICAgICAgIHZhciBsZW4gPSBkYXRhLmxlbmd0aCwgb3V0ID0gQnVmZmVyLmFsbG9jVW5zYWZlKDIqbGVuKSwgaT0wLCBqPTAsIGs9MDtcbiAgICAgICAgaWYoQnVmZmVyLmlzQnVmZmVyKGRhdGEpKSB7XG4gICAgICAgICAgZm9yKGkgPSAwOyBpIDwgbGVuOyBpKyspIHtcbiAgICAgICAgICAgIGogPSAyKmRhdGFbaV07XG4gICAgICAgICAgICBpZihERFtqXT09PTB4RkYgJiYgRERbaisxXT09PTB4RkQpIHsgaj0yKigoZGF0YVtpXTw8OCkrZGF0YVtpKzFdKTsgKytpOyB9XG4gICAgICAgICAgICBvdXRbaysrXSA9IEREW2pdOyBvdXRbaysrXSA9IEREW2orMV07XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYodHlwZW9mIGRhdGEgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgICBmb3IoaSA9IDA7IGkgPCBsZW47IGkrKykge1xuICAgICAgICAgICAgaiA9IDIqZGF0YS5jaGFyQ29kZUF0KGkpO1xuICAgICAgICAgICAgaWYoRERbal09PT0weEZGICYmIEREW2orMV09PT0weEZEKSB7IGo9MiooKGRhdGEuY2hhckNvZGVBdChpKTw8OCkrZGF0YS5jaGFyQ29kZUF0KGkrMSkpOyArK2k7IH1cbiAgICAgICAgICAgIG91dFtrKytdID0gRERbal07IG91dFtrKytdID0gRERbaisxXTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgZm9yKGkgPSAwOyBpIDwgbGVuOyBpKyspIHtcbiAgICAgICAgICAgIGogPSAyKmRhdGFbaV07XG4gICAgICAgICAgICBpZihERFtqXT09PTB4RkYgJiYgRERbaisxXT09PTB4RkQpIHsgaj0yKigoZGF0YVtpXTw8OCkrZGF0YVtpKzFdKTsgKytpOyB9XG4gICAgICAgICAgICBvdXRbaysrXSA9IEREW2pdOyBvdXRbaysrXSA9IEREW2orMV07XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBvdXQuc2xpY2UoMCxrKS50b1N0cmluZygndWNzMicpO1xuICAgICAgfTtcbiAgICB9O1xuICAgIG1hZ2ljX2RlY29kZVs2NTAwMV0gPSBmdW5jdGlvbiB1dGY4X2QoZGF0YSkge1xuICAgICAgaWYodHlwZW9mIGRhdGEgPT09IFwic3RyaW5nXCIpIHJldHVybiB1dGY4X2QoZGF0YS5zcGxpdChcIlwiKS5tYXAoY2NhKSk7XG4gICAgICB2YXIgbGVuID0gZGF0YS5sZW5ndGgsIHcgPSAwLCB3dyA9IDA7XG4gICAgICBpZig0ICogbGVuID4gbWRsKSB7IG1kbCA9IDQgKiBsZW47IG1kYiA9IEJ1ZmZlci5hbGxvY1Vuc2FmZShtZGwpOyB9XG4gICAgICB2YXIgaSA9IDA7XG4gICAgICBpZihsZW4gPj0gMyAmJiBkYXRhWzBdID09IDB4RUYpIGlmKGRhdGFbMV0gPT0gMHhCQiAmJiBkYXRhWzJdID09IDB4QkYpIGkgPSAzO1xuICAgICAgZm9yKHZhciBqID0gMSwgayA9IDAsIEQgPSAwOyBpIDwgbGVuOyBpKz1qKSB7XG4gICAgICAgIGogPSAxOyBEID0gZGF0YVtpXTtcbiAgICAgICAgaWYoRCA8IDEyOCkgdyA9IEQ7XG4gICAgICAgIGVsc2UgaWYoRCA8IDIyNCkgeyB3PShEJjMxKSo2NCsoZGF0YVtpKzFdJjYzKTsgaj0yOyB9XG4gICAgICAgIGVsc2UgaWYoRCA8IDI0MCkgeyB3PSgoRCYxNSk8PDEyKSsoZGF0YVtpKzFdJjYzKSo2NCsoZGF0YVtpKzJdJjYzKTsgaj0zOyB9XG4gICAgICAgIGVsc2UgeyB3PShEJjcpKjI2MjE0NCsoKGRhdGFbaSsxXSY2Myk8PDEyKSsoZGF0YVtpKzJdJjYzKSo2NCsoZGF0YVtpKzNdJjYzKTsgaj00OyB9XG4gICAgICAgIGlmKHcgPCA2NTUzNikgeyBtZGJbaysrXSA9IHcmMjU1OyBtZGJbaysrXSA9IHc+Pjg7IH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgdyAtPSA2NTUzNjsgd3cgPSAweEQ4MDAgKyAoKHc+PjEwKSYxMDIzKTsgdyA9IDB4REMwMCArICh3JjEwMjMpO1xuICAgICAgICAgIG1kYltrKytdID0gd3cmMjU1OyBtZGJbaysrXSA9IHd3Pj4+ODsgbWRiW2srK10gPSB3JjI1NTsgbWRiW2srK10gPSAodz4+PjgpJjI1NTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIG1kYi5zbGljZSgwLGspLnRvU3RyaW5nKCd1Y3MyJyk7XG4gICAgfTtcbiAgICBtYWdpY19lbmNvZGVbNjUwMDFdID0gZnVuY3Rpb24gdXRmOF9lKGRhdGEsIG9mbXQpIHtcbiAgICAgIGlmKGhhc19idWYgJiYgQnVmZmVyLmlzQnVmZmVyKGRhdGEpKSB7XG4gICAgICAgIGlmKCFvZm10IHx8IG9mbXQgPT09ICdidWYnKSByZXR1cm4gZGF0YTtcbiAgICAgICAgaWYob2ZtdCAhPT0gJ2FycicpIHJldHVybiBkYXRhLnRvU3RyaW5nKCdiaW5hcnknKTtcbiAgICAgICAgcmV0dXJuIFtdLnNsaWNlLmNhbGwoZGF0YSk7XG4gICAgICB9XG4gICAgICB2YXIgbGVuID0gZGF0YS5sZW5ndGgsIHcgPSAwLCB3dyA9IDAsIGogPSAwO1xuICAgICAgdmFyIGRpcmVjdCA9IHR5cGVvZiBkYXRhID09PSBcInN0cmluZ1wiO1xuICAgICAgaWYoNCAqIGxlbiA+IG1kbCkgeyBtZGwgPSA0ICogbGVuOyBtZGIgPSBCdWZmZXIuYWxsb2NVbnNhZmUobWRsKTsgfVxuICAgICAgZm9yKHZhciBpID0gMDsgaSA8IGxlbjsgKytpKSB7XG4gICAgICAgIHcgPSBkaXJlY3QgPyBkYXRhLmNoYXJDb2RlQXQoaSkgOiBkYXRhW2ldLmNoYXJDb2RlQXQoMCk7XG4gICAgICAgIGlmKHcgPD0gMHgwMDdGKSBtZGJbaisrXSA9IHc7XG4gICAgICAgIGVsc2UgaWYodyA8PSAweDA3RkYpIHtcbiAgICAgICAgICBtZGJbaisrXSA9IDE5MiArICh3ID4+IDYpO1xuICAgICAgICAgIG1kYltqKytdID0gMTI4ICsgKHcmNjMpO1xuICAgICAgICB9IGVsc2UgaWYodyA+PSAweEQ4MDAgJiYgdyA8PSAweERGRkYpIHtcbiAgICAgICAgICB3IC09IDB4RDgwMDsgKytpO1xuICAgICAgICAgIHd3ID0gKGRpcmVjdCA/IGRhdGEuY2hhckNvZGVBdChpKSA6IGRhdGFbaV0uY2hhckNvZGVBdCgwKSkgLSAweERDMDAgKyAodyA8PCAxMCk7XG4gICAgICAgICAgbWRiW2orK10gPSAyNDAgKyAoKHd3Pj4+MTgpICYgMHgwNyk7XG4gICAgICAgICAgbWRiW2orK10gPSAxNDQgKyAoKHd3Pj4+MTIpICYgMHgzRik7XG4gICAgICAgICAgbWRiW2orK10gPSAxMjggKyAoKHd3Pj4+NikgJiAweDNGKTtcbiAgICAgICAgICBtZGJbaisrXSA9IDEyOCArICh3dyAmIDB4M0YpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIG1kYltqKytdID0gMjI0ICsgKHcgPj4gMTIpO1xuICAgICAgICAgIG1kYltqKytdID0gMTI4ICsgKCh3ID4+IDYpJjYzKTtcbiAgICAgICAgICBtZGJbaisrXSA9IDEyOCArICh3JjYzKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYoIW9mbXQgfHwgb2ZtdCA9PT0gJ2J1ZicpIHJldHVybiBtZGIuc2xpY2UoMCxqKTtcbiAgICAgIGlmKG9mbXQgIT09ICdhcnInKSByZXR1cm4gbWRiLnNsaWNlKDAsaikudG9TdHJpbmcoJ2JpbmFyeScpO1xuICAgICAgcmV0dXJuIFtdLnNsaWNlLmNhbGwobWRiLCAwLCBqKTtcbiAgICB9O1xuICB9XG5cbiAgdmFyIGVuY2FjaGUgPSBmdW5jdGlvbiBlbmNhY2hlKCkge1xuICAgIGlmKGhhc19idWYpIHtcbiAgICAgIGlmKGNwZGNhY2hlW3NiY3NfY2FjaGVbMF1dKSByZXR1cm47XG4gICAgICB2YXIgaT0wLCBzPTA7XG4gICAgICBmb3IoaSA9IDA7IGkgPCBzYmNzX2NhY2hlLmxlbmd0aDsgKytpKSB7XG4gICAgICAgIHMgPSBzYmNzX2NhY2hlW2ldO1xuICAgICAgICBpZihjcHRbc10pIHtcbiAgICAgICAgICBjcGRjYWNoZVtzXSA9IHNiY3NfZGVjb2RlKHMpO1xuICAgICAgICAgIGNwZWNhY2hlW3NdID0gc2Jjc19lbmNvZGUocyk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGZvcihpID0gMDsgaSA8IGRiY3NfY2FjaGUubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgcyA9IGRiY3NfY2FjaGVbaV07XG4gICAgICAgIGlmKGNwdFtzXSkge1xuICAgICAgICAgIGNwZGNhY2hlW3NdID0gZGJjc19kZWNvZGUocyk7XG4gICAgICAgICAgY3BlY2FjaGVbc10gPSBkYmNzX2VuY29kZShzKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgZm9yKGkgPSAwOyBpIDwgbWFnaWNfY2FjaGUubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgcyA9IG1hZ2ljX2NhY2hlW2ldO1xuICAgICAgICBpZihtYWdpY19kZWNvZGVbc10pIGNwZGNhY2hlW3NdID0gbWFnaWNfZGVjb2RlW3NdO1xuICAgICAgICBpZihtYWdpY19lbmNvZGVbc10pIGNwZWNhY2hlW3NdID0gbWFnaWNfZW5jb2RlW3NdO1xuICAgICAgfVxuICAgIH1cbiAgfTtcbiAgdmFyIG51bGxfZW5jID0gZnVuY3Rpb24oZGF0YSwgb2ZtdCkgeyB2b2lkIG9mbXQ7IHJldHVybiBcIlwiOyB9O1xuICB2YXIgY3BfZGVjYWNoZSA9IGZ1bmN0aW9uIGNwX2RlY2FjaGUoY3ApIHsgZGVsZXRlIGNwZGNhY2hlW2NwXTsgZGVsZXRlIGNwZWNhY2hlW2NwXTsgfTtcbiAgdmFyIGRlY2FjaGUgPSBmdW5jdGlvbiBkZWNhY2hlKCkge1xuICAgIGlmKGhhc19idWYpIHtcbiAgICAgIGlmKCFjcGRjYWNoZVtzYmNzX2NhY2hlWzBdXSkgcmV0dXJuO1xuICAgICAgc2Jjc19jYWNoZS5mb3JFYWNoKGNwX2RlY2FjaGUpO1xuICAgICAgZGJjc19jYWNoZS5mb3JFYWNoKGNwX2RlY2FjaGUpO1xuICAgICAgbWFnaWNfY2FjaGUuZm9yRWFjaChjcF9kZWNhY2hlKTtcbiAgICB9XG4gICAgbGFzdF9lbmMgPSBudWxsX2VuYzsgbGFzdF9jcCA9IDA7XG4gIH07XG4gIHZhciBjYWNoZSA9IHtcbiAgICBlbmNhY2hlOiBlbmNhY2hlLFxuICAgIGRlY2FjaGU6IGRlY2FjaGUsXG4gICAgc2Jjczogc2Jjc19jYWNoZSxcbiAgICBkYmNzOiBkYmNzX2NhY2hlXG4gIH07XG5cbiAgZW5jYWNoZSgpO1xuXG4gIHZhciBCTSA9IFwiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrL1wiO1xuICB2YXIgU2V0RCA9IFwiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODknKCksLS4vOj9cIjtcbiAgdmFyIGxhc3RfZW5jID0gbnVsbF9lbmMsIGxhc3RfY3AgPSAwO1xuICB2YXIgZW5jb2RlID0gZnVuY3Rpb24gZW5jb2RlKGNwLCBkYXRhLCBvZm10KSB7XG4gICAgaWYoY3AgPT09IGxhc3RfY3AgJiYgbGFzdF9lbmMpIHsgcmV0dXJuIGxhc3RfZW5jKGRhdGEsIG9mbXQpOyB9XG4gICAgaWYoY3BlY2FjaGVbY3BdKSB7IGxhc3RfZW5jID0gY3BlY2FjaGVbbGFzdF9jcD1jcF07IHJldHVybiBsYXN0X2VuYyhkYXRhLCBvZm10KTsgfVxuICAgIGlmKGhhc19idWYgJiYgQnVmZmVyLmlzQnVmZmVyKGRhdGEpKSBkYXRhID0gZGF0YS50b1N0cmluZygndXRmOCcpO1xuICAgIHZhciBsZW4gPSBkYXRhLmxlbmd0aDtcbiAgICB2YXIgb3V0ID0gaGFzX2J1ZiA/IEJ1ZmZlci5hbGxvY1Vuc2FmZSg0KmxlbikgOiBbXSwgdz0wLCBpPTAsIGogPSAwLCB3dz0wO1xuICAgIHZhciBDID0gY3B0W2NwXSwgRSwgTSA9IFwiXCI7XG4gICAgdmFyIGlzc3RyID0gdHlwZW9mIGRhdGEgPT09ICdzdHJpbmcnO1xuICAgIGlmKEMgJiYgKEU9Qy5lbmMpKSBmb3IoaSA9IDA7IGkgPCBsZW47ICsraSwgKytqKSB7XG4gICAgICB3ID0gRVtpc3N0cj8gZGF0YS5jaGFyQXQoaSkgOiBkYXRhW2ldXTtcbiAgICAgIGlmKHcgPiAyNTUpIHtcbiAgICAgICAgb3V0W2pdID0gdz4+ODtcbiAgICAgICAgb3V0Wysral0gPSB3JjI1NTtcbiAgICAgIH0gZWxzZSBvdXRbal0gPSB3JjI1NTtcbiAgICB9XG4gICAgZWxzZSBpZigoTT1tYWdpY1tjcF0pKSBzd2l0Y2goTSkge1xuICAgICAgY2FzZSBcInV0ZjhcIjpcbiAgICAgICAgaWYoaGFzX2J1ZiAmJiBpc3N0cikgeyBvdXQgPSBCdWZmZXJfZnJvbShkYXRhLCBNKTsgaiA9IG91dC5sZW5ndGg7IGJyZWFrOyB9XG4gICAgICAgIGZvcihpID0gMDsgaSA8IGxlbjsgKytpLCArK2opIHtcbiAgICAgICAgICB3ID0gaXNzdHIgPyBkYXRhLmNoYXJDb2RlQXQoaSkgOiBkYXRhW2ldLmNoYXJDb2RlQXQoMCk7XG4gICAgICAgICAgaWYodyA8PSAweDAwN0YpIG91dFtqXSA9IHc7XG4gICAgICAgICAgZWxzZSBpZih3IDw9IDB4MDdGRikge1xuICAgICAgICAgICAgb3V0W2pdICAgPSAxOTIgKyAodyA+PiA2KTtcbiAgICAgICAgICAgIG91dFsrK2pdID0gMTI4ICsgKHcmNjMpO1xuICAgICAgICAgIH0gZWxzZSBpZih3ID49IDB4RDgwMCAmJiB3IDw9IDB4REZGRikge1xuICAgICAgICAgICAgdyAtPSAweEQ4MDA7XG4gICAgICAgICAgICB3dyA9IChpc3N0ciA/IGRhdGEuY2hhckNvZGVBdCgrK2kpIDogZGF0YVsrK2ldLmNoYXJDb2RlQXQoMCkpIC0gMHhEQzAwICsgKHcgPDwgMTApO1xuICAgICAgICAgICAgb3V0W2pdICAgPSAyNDAgKyAoKHd3Pj4+MTgpICYgMHgwNyk7XG4gICAgICAgICAgICBvdXRbKytqXSA9IDE0NCArICgod3c+Pj4xMikgJiAweDNGKTtcbiAgICAgICAgICAgIG91dFsrK2pdID0gMTI4ICsgKCh3dz4+PjYpICYgMHgzRik7XG4gICAgICAgICAgICBvdXRbKytqXSA9IDEyOCArICh3dyAmIDB4M0YpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBvdXRbal0gICA9IDIyNCArICh3ID4+IDEyKTtcbiAgICAgICAgICAgIG91dFsrK2pdID0gMTI4ICsgKCh3ID4+IDYpJjYzKTtcbiAgICAgICAgICAgIG91dFsrK2pdID0gMTI4ICsgKHcmNjMpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgXCJhc2NpaVwiOlxuICAgICAgICBpZihoYXNfYnVmICYmIHR5cGVvZiBkYXRhID09PSBcInN0cmluZ1wiKSB7IG91dCA9IEJ1ZmZlcl9mcm9tKGRhdGEsIE0pOyBqID0gb3V0Lmxlbmd0aDsgYnJlYWs7IH1cbiAgICAgICAgZm9yKGkgPSAwOyBpIDwgbGVuOyArK2ksICsraikge1xuICAgICAgICAgIHcgPSBpc3N0ciA/IGRhdGEuY2hhckNvZGVBdChpKSA6IGRhdGFbaV0uY2hhckNvZGVBdCgwKTtcbiAgICAgICAgICBpZih3IDw9IDB4MDA3Rikgb3V0W2pdID0gdztcbiAgICAgICAgICBlbHNlIHRocm93IG5ldyBFcnJvcihcImJhZCBhc2NpaSBcIiArIHcpO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBcInV0ZjE2bGVcIjpcbiAgICAgICAgaWYoaGFzX2J1ZiAmJiB0eXBlb2YgZGF0YSA9PT0gXCJzdHJpbmdcIikgeyBvdXQgPSBCdWZmZXJfZnJvbShkYXRhLCBNKTsgaiA9IG91dC5sZW5ndGg7IGJyZWFrOyB9XG4gICAgICAgIGZvcihpID0gMDsgaSA8IGxlbjsgKytpKSB7XG4gICAgICAgICAgdyA9IGlzc3RyID8gZGF0YS5jaGFyQ29kZUF0KGkpIDogZGF0YVtpXS5jaGFyQ29kZUF0KDApO1xuICAgICAgICAgIG91dFtqKytdID0gdyYyNTU7XG4gICAgICAgICAgb3V0W2orK10gPSB3Pj44O1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBcInV0ZjE2YmVcIjpcbiAgICAgICAgZm9yKGkgPSAwOyBpIDwgbGVuOyArK2kpIHtcbiAgICAgICAgICB3ID0gaXNzdHIgPyBkYXRhLmNoYXJDb2RlQXQoaSkgOiBkYXRhW2ldLmNoYXJDb2RlQXQoMCk7XG4gICAgICAgICAgb3V0W2orK10gPSB3Pj44O1xuICAgICAgICAgIG91dFtqKytdID0gdyYyNTU7XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIFwidXRmMzJsZVwiOlxuICAgICAgICBmb3IoaSA9IDA7IGkgPCBsZW47ICsraSkge1xuICAgICAgICAgIHcgPSBpc3N0ciA/IGRhdGEuY2hhckNvZGVBdChpKSA6IGRhdGFbaV0uY2hhckNvZGVBdCgwKTtcbiAgICAgICAgICBpZih3ID49IDB4RDgwMCAmJiB3IDw9IDB4REZGRikgdyA9IDB4MTAwMDAgKyAoKHcgLSAweEQ4MDApIDw8IDEwKSArIChkYXRhWysraV0uY2hhckNvZGVBdCgwKSAtIDB4REMwMCk7XG4gICAgICAgICAgb3V0W2orK10gPSB3JjI1NTsgdyA+Pj0gODtcbiAgICAgICAgICBvdXRbaisrXSA9IHcmMjU1OyB3ID4+PSA4O1xuICAgICAgICAgIG91dFtqKytdID0gdyYyNTU7IHcgPj49IDg7XG4gICAgICAgICAgb3V0W2orK10gPSB3JjI1NTtcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgXCJ1dGYzMmJlXCI6XG4gICAgICAgIGZvcihpID0gMDsgaSA8IGxlbjsgKytpKSB7XG4gICAgICAgICAgdyA9IGlzc3RyID8gZGF0YS5jaGFyQ29kZUF0KGkpIDogZGF0YVtpXS5jaGFyQ29kZUF0KDApO1xuICAgICAgICAgIGlmKHcgPj0gMHhEODAwICYmIHcgPD0gMHhERkZGKSB3ID0gMHgxMDAwMCArICgodyAtIDB4RDgwMCkgPDwgMTApICsgKGRhdGFbKytpXS5jaGFyQ29kZUF0KDApIC0gMHhEQzAwKTtcbiAgICAgICAgICBvdXRbaiszXSA9IHcmMjU1OyB3ID4+PSA4O1xuICAgICAgICAgIG91dFtqKzJdID0gdyYyNTU7IHcgPj49IDg7XG4gICAgICAgICAgb3V0W2orMV0gPSB3JjI1NTsgdyA+Pj0gODtcbiAgICAgICAgICBvdXRbal0gPSB3JjI1NTtcbiAgICAgICAgICBqKz00O1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBcInV0ZjdcIjpcbiAgICAgICAgZm9yKGkgPSAwOyBpIDwgbGVuOyBpKyspIHtcbiAgICAgICAgICB2YXIgYyA9IGlzc3RyID8gZGF0YS5jaGFyQXQoaSkgOiBkYXRhW2ldLmNoYXJBdCgwKTtcbiAgICAgICAgICBpZihjID09PSBcIitcIikgeyBvdXRbaisrXSA9IDB4MmI7IG91dFtqKytdID0gMHgyZDsgY29udGludWU7IH1cbiAgICAgICAgICBpZihTZXRELmluZGV4T2YoYykgPiAtMSkgeyBvdXRbaisrXSA9IGMuY2hhckNvZGVBdCgwKTsgY29udGludWU7IH1cbiAgICAgICAgICB2YXIgdHQgPSBlbmNvZGUoMTIwMSwgYyk7XG4gICAgICAgICAgb3V0W2orK10gPSAweDJiO1xuICAgICAgICAgIG91dFtqKytdID0gQk0uY2hhckNvZGVBdCh0dFswXT4+Mik7XG4gICAgICAgICAgb3V0W2orK10gPSBCTS5jaGFyQ29kZUF0KCgodHRbMF0mMHgwMyk8PDQpICsgKCh0dFsxXXx8MCk+PjQpKTtcbiAgICAgICAgICBvdXRbaisrXSA9IEJNLmNoYXJDb2RlQXQoKCh0dFsxXSYweDBGKTw8MikgKyAoKHR0WzJdfHwwKT4+NikpO1xuICAgICAgICAgIG91dFtqKytdID0gMHgyZDtcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcbiAgICAgIGRlZmF1bHQ6IHRocm93IG5ldyBFcnJvcihcIlVuc3VwcG9ydGVkIG1hZ2ljOiBcIiArIGNwICsgXCIgXCIgKyBtYWdpY1tjcF0pO1xuICAgIH1cbiAgICBlbHNlIHRocm93IG5ldyBFcnJvcihcIlVucmVjb2duaXplZCBDUDogXCIgKyBjcCk7XG4gICAgb3V0ID0gb3V0LnNsaWNlKDAsaik7XG4gICAgaWYoIWhhc19idWYpIHJldHVybiAob2ZtdCA9PSAnc3RyJykgPyAob3V0KS5tYXAoc2ZjYykuam9pbihcIlwiKSA6IG91dDtcbiAgICBpZighb2ZtdCB8fCBvZm10ID09PSAnYnVmJykgcmV0dXJuIG91dDtcbiAgICBpZihvZm10ICE9PSAnYXJyJykgcmV0dXJuIG91dC50b1N0cmluZygnYmluYXJ5Jyk7XG4gICAgcmV0dXJuIFtdLnNsaWNlLmNhbGwob3V0KTtcbiAgfTtcbiAgdmFyIGRlY29kZSA9IGZ1bmN0aW9uIGRlY29kZShjcCwgZGF0YSkge1xuICAgIHZhciBGOyBpZigoRj1jcGRjYWNoZVtjcF0pKSByZXR1cm4gRihkYXRhKTtcbiAgICBpZih0eXBlb2YgZGF0YSA9PT0gXCJzdHJpbmdcIikgcmV0dXJuIGRlY29kZShjcCwgZGF0YS5zcGxpdChcIlwiKS5tYXAoY2NhKSk7XG4gICAgdmFyIGxlbiA9IGRhdGEubGVuZ3RoLCBvdXQgPSBuZXcgQXJyYXkobGVuKSwgcz1cIlwiLCB3PTAsIGk9MCwgaj0xLCBrPTAsIHd3PTA7XG4gICAgdmFyIEMgPSBjcHRbY3BdLCBELCBNPVwiXCI7XG4gICAgaWYoQyAmJiAoRD1DLmRlYykpIHtcbiAgICAgIGZvcihpID0gMDsgaSA8IGxlbjsgaSs9aikge1xuICAgICAgICBqID0gMjtcbiAgICAgICAgcyA9IERbKGRhdGFbaV08PDgpKyBkYXRhW2krMV1dO1xuICAgICAgICBpZighcykge1xuICAgICAgICAgIGogPSAxO1xuICAgICAgICAgIHMgPSBEW2RhdGFbaV1dO1xuICAgICAgICB9XG4gICAgICAgIGlmKCFzKSB0aHJvdyBuZXcgRXJyb3IoJ1VucmVjb2duaXplZCBjb2RlOiAnICsgZGF0YVtpXSArICcgJyArIGRhdGFbaStqLTFdICsgJyAnICsgaSArICcgJyArIGogKyAnICcgKyBEW2RhdGFbaV1dKTtcbiAgICAgICAgb3V0W2srK10gPSBzO1xuICAgICAgfVxuICAgIH1cbiAgICBlbHNlIGlmKChNPW1hZ2ljW2NwXSkpIHN3aXRjaChNKSB7XG4gICAgICBjYXNlIFwidXRmOFwiOlxuICAgICAgICBpZihsZW4gPj0gMyAmJiBkYXRhWzBdID09IDB4RUYpIGlmKGRhdGFbMV0gPT0gMHhCQiAmJiBkYXRhWzJdID09IDB4QkYpIGkgPSAzO1xuICAgICAgICBmb3IoOyBpIDwgbGVuOyBpKz1qKSB7XG4gICAgICAgICAgaiA9IDE7XG4gICAgICAgICAgaWYoZGF0YVtpXSA8IDEyOCkgdyA9IGRhdGFbaV07XG4gICAgICAgICAgZWxzZSBpZihkYXRhW2ldIDwgMjI0KSB7IHc9KGRhdGFbaV0mMzEpKjY0KyhkYXRhW2krMV0mNjMpOyBqPTI7IH1cbiAgICAgICAgICBlbHNlIGlmKGRhdGFbaV0gPCAyNDApIHsgdz0oKGRhdGFbaV0mMTUpPDwxMikrKGRhdGFbaSsxXSY2MykqNjQrKGRhdGFbaSsyXSY2Myk7IGo9MzsgfVxuICAgICAgICAgIGVsc2UgeyB3PShkYXRhW2ldJjcpKjI2MjE0NCsoKGRhdGFbaSsxXSY2Myk8PDEyKSsoZGF0YVtpKzJdJjYzKSo2NCsoZGF0YVtpKzNdJjYzKTsgaj00OyB9XG4gICAgICAgICAgaWYodyA8IDY1NTM2KSB7IG91dFtrKytdID0gU3RyaW5nLmZyb21DaGFyQ29kZSh3KTsgfVxuICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdyAtPSA2NTUzNjsgd3cgPSAweEQ4MDAgKyAoKHc+PjEwKSYxMDIzKTsgdyA9IDB4REMwMCArICh3JjEwMjMpO1xuICAgICAgICAgICAgb3V0W2srK10gPSBTdHJpbmcuZnJvbUNoYXJDb2RlKHd3KTsgb3V0W2srK10gPSBTdHJpbmcuZnJvbUNoYXJDb2RlKHcpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgXCJhc2NpaVwiOlxuICAgICAgICBpZihoYXNfYnVmICYmIEJ1ZmZlci5pc0J1ZmZlcihkYXRhKSkgcmV0dXJuIGRhdGEudG9TdHJpbmcoTSk7XG4gICAgICAgIGZvcihpID0gMDsgaSA8IGxlbjsgaSsrKSBvdXRbaV0gPSBTdHJpbmcuZnJvbUNoYXJDb2RlKGRhdGFbaV0pO1xuICAgICAgICBrID0gbGVuOyBicmVhaztcbiAgICAgIGNhc2UgXCJ1dGYxNmxlXCI6XG4gICAgICAgIGlmKGxlbiA+PSAyICYmIGRhdGFbMF0gPT0gMHhGRikgaWYoZGF0YVsxXSA9PSAweEZFKSBpID0gMjtcbiAgICAgICAgaWYoaGFzX2J1ZiAmJiBCdWZmZXIuaXNCdWZmZXIoZGF0YSkpIHJldHVybiBkYXRhLnRvU3RyaW5nKE0pO1xuICAgICAgICBqID0gMjtcbiAgICAgICAgZm9yKDsgaSsxIDwgbGVuOyBpKz1qKSB7XG4gICAgICAgICAgb3V0W2srK10gPSBTdHJpbmcuZnJvbUNoYXJDb2RlKChkYXRhW2krMV08PDgpICsgZGF0YVtpXSk7XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIFwidXRmMTZiZVwiOlxuICAgICAgICBpZihsZW4gPj0gMiAmJiBkYXRhWzBdID09IDB4RkUpIGlmKGRhdGFbMV0gPT0gMHhGRikgaSA9IDI7XG4gICAgICAgIGogPSAyO1xuICAgICAgICBmb3IoOyBpKzEgPCBsZW47IGkrPWopIHtcbiAgICAgICAgICBvdXRbaysrXSA9IFN0cmluZy5mcm9tQ2hhckNvZGUoKGRhdGFbaV08PDgpICsgZGF0YVtpKzFdKTtcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgXCJ1dGYzMmxlXCI6XG4gICAgICAgIGlmKGxlbiA+PSA0ICYmIGRhdGFbMF0gPT0gMHhGRikgaWYoZGF0YVsxXSA9PSAweEZFICYmIGRhdGFbMl0gPT09IDAgJiYgZGF0YVszXSA9PT0gMCkgaSA9IDQ7XG4gICAgICAgIGogPSA0O1xuICAgICAgICBmb3IoOyBpIDwgbGVuOyBpKz1qKSB7XG4gICAgICAgICAgdyA9IChkYXRhW2krM108PDI0KSArIChkYXRhW2krMl08PDE2KSArIChkYXRhW2krMV08PDgpICsgKGRhdGFbaV0pO1xuICAgICAgICAgIGlmKHcgPiAweEZGRkYpIHtcbiAgICAgICAgICAgIHcgLT0gMHgxMDAwMDtcbiAgICAgICAgICAgIG91dFtrKytdID0gU3RyaW5nLmZyb21DaGFyQ29kZSgweEQ4MDAgKyAoKHcgPj4gMTApICYgMHgzRkYpKTtcbiAgICAgICAgICAgIG91dFtrKytdID0gU3RyaW5nLmZyb21DaGFyQ29kZSgweERDMDAgKyAodyAmIDB4M0ZGKSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGVsc2Ugb3V0W2srK10gPSBTdHJpbmcuZnJvbUNoYXJDb2RlKHcpO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBcInV0ZjMyYmVcIjpcbiAgICAgICAgaWYobGVuID49IDQgJiYgZGF0YVszXSA9PSAweEZGKSBpZihkYXRhWzJdID09IDB4RkUgJiYgZGF0YVsxXSA9PT0gMCAmJiBkYXRhWzBdID09PSAwKSBpID0gNDtcbiAgICAgICAgaiA9IDQ7XG4gICAgICAgIGZvcig7IGkgPCBsZW47IGkrPWopIHtcbiAgICAgICAgICB3ID0gKGRhdGFbaV08PDI0KSArIChkYXRhW2krMV08PDE2KSArIChkYXRhW2krMl08PDgpICsgKGRhdGFbaSszXSk7XG4gICAgICAgICAgaWYodyA+IDB4RkZGRikge1xuICAgICAgICAgICAgdyAtPSAweDEwMDAwO1xuICAgICAgICAgICAgb3V0W2srK10gPSBTdHJpbmcuZnJvbUNoYXJDb2RlKDB4RDgwMCArICgodyA+PiAxMCkgJiAweDNGRikpO1xuICAgICAgICAgICAgb3V0W2srK10gPSBTdHJpbmcuZnJvbUNoYXJDb2RlKDB4REMwMCArICh3ICYgMHgzRkYpKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgZWxzZSBvdXRbaysrXSA9IFN0cmluZy5mcm9tQ2hhckNvZGUodyk7XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIFwidXRmN1wiOlxuICAgICAgICBpZihsZW4gPj0gNCAmJiBkYXRhWzBdID09IDB4MkIgJiYgZGF0YVsxXSA9PSAweDJGICYmIGRhdGFbMl0gPT0gMHg3Nikge1xuICAgICAgICAgIGlmKGxlbiA+PSA1ICYmIGRhdGFbM10gPT0gMHgzOCAmJiBkYXRhWzRdID09IDB4MkQpIGkgPSA1O1xuICAgICAgICAgIGVsc2UgaWYoZGF0YVszXSA9PSAweDM4IHx8IGRhdGFbM10gPT0gMHgzOSB8fCBkYXRhWzNdID09IDB4MkIgfHwgZGF0YVszXSA9PSAweDJGKSBpID0gNDtcbiAgICAgICAgfVxuICAgICAgICBmb3IoOyBpIDwgbGVuOyBpKz1qKSB7XG4gICAgICAgICAgaWYoZGF0YVtpXSAhPT0gMHgyYikgeyBqPTE7IG91dFtrKytdID0gU3RyaW5nLmZyb21DaGFyQ29kZShkYXRhW2ldKTsgY29udGludWU7IH1cbiAgICAgICAgICBqPTE7XG4gICAgICAgICAgaWYoZGF0YVtpKzFdID09PSAweDJkKSB7IGogPSAyOyBvdXRbaysrXSA9IFwiK1wiOyBjb250aW51ZTsgfVxuICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11c2VsZXNzLWVzY2FwZVxuICAgICAgICAgIHdoaWxlKFN0cmluZy5mcm9tQ2hhckNvZGUoZGF0YVtpK2pdKS5tYXRjaCgvW0EtWmEtejAtOStcXC9dLykpIGorKztcbiAgICAgICAgICB2YXIgZGFzaCA9IDA7XG4gICAgICAgICAgaWYoZGF0YVtpK2pdID09PSAweDJkKSB7ICsrajsgZGFzaD0xOyB9XG4gICAgICAgICAgdmFyIHR0ID0gW107XG4gICAgICAgICAgdmFyIG82NCA9IFwiXCI7XG4gICAgICAgICAgdmFyIGMxPTAsIGMyPTAsIGMzPTA7XG4gICAgICAgICAgdmFyIGUxPTAsIGUyPTAsIGUzPTAsIGU0PTA7XG4gICAgICAgICAgZm9yKHZhciBsID0gMTsgbCA8IGogLSBkYXNoOykge1xuICAgICAgICAgICAgZTEgPSBCTS5pbmRleE9mKFN0cmluZy5mcm9tQ2hhckNvZGUoZGF0YVtpK2wrK10pKTtcbiAgICAgICAgICAgIGUyID0gQk0uaW5kZXhPZihTdHJpbmcuZnJvbUNoYXJDb2RlKGRhdGFbaStsKytdKSk7XG4gICAgICAgICAgICBjMSA9IGUxIDw8IDIgfCBlMiA+PiA0O1xuICAgICAgICAgICAgdHQucHVzaChjMSk7XG4gICAgICAgICAgICBlMyA9IEJNLmluZGV4T2YoU3RyaW5nLmZyb21DaGFyQ29kZShkYXRhW2krbCsrXSkpO1xuICAgICAgICAgICAgaWYoZTMgPT09IC0xKSBicmVhaztcbiAgICAgICAgICAgIGMyID0gKGUyICYgMTUpIDw8IDQgfCBlMyA+PiAyO1xuICAgICAgICAgICAgdHQucHVzaChjMik7XG4gICAgICAgICAgICBlNCA9IEJNLmluZGV4T2YoU3RyaW5nLmZyb21DaGFyQ29kZShkYXRhW2krbCsrXSkpO1xuICAgICAgICAgICAgaWYoZTQgPT09IC0xKSBicmVhaztcbiAgICAgICAgICAgIGMzID0gKGUzICYgMykgPDwgNiB8IGU0O1xuICAgICAgICAgICAgaWYoZTQgPCA2NCkgdHQucHVzaChjMyk7XG4gICAgICAgICAgfVxuICAgICAgICAgIG82NCA9IGRlY29kZSgxMjAxLCB0dCk7XG4gICAgICAgICAgZm9yKGwgPSAwOyBsIDwgbzY0Lmxlbmd0aDsgKytsKSBvdXRbaysrXSA9IG82NC5jaGFyQXQobCk7XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG4gICAgICBkZWZhdWx0OiB0aHJvdyBuZXcgRXJyb3IoXCJVbnN1cHBvcnRlZCBtYWdpYzogXCIgKyBjcCArIFwiIFwiICsgbWFnaWNbY3BdKTtcbiAgICB9XG4gICAgZWxzZSB0aHJvdyBuZXcgRXJyb3IoXCJVbnJlY29nbml6ZWQgQ1A6IFwiICsgY3ApO1xuICAgIHJldHVybiBvdXQuc2xpY2UoMCxrKS5qb2luKFwiXCIpO1xuICB9O1xuICB2YXIgaGFzY3AgPSBmdW5jdGlvbiBoYXNjcChjcCkgeyByZXR1cm4gISEoY3B0W2NwXSB8fCBtYWdpY1tjcF0pOyB9O1xuICBjcHQudXRpbHMgPSB7IGRlY29kZTogZGVjb2RlLCBlbmNvZGU6IGVuY29kZSwgaGFzY3A6IGhhc2NwLCBtYWdpYzogbWFnaWMsIGNhY2hlOmNhY2hlIH07XG4gIHJldHVybiBjcHQ7XG59KSk7XG4iLCIvKlxuXG5KU1ppcCAtIEEgSmF2YXNjcmlwdCBjbGFzcyBmb3IgZ2VuZXJhdGluZyBhbmQgcmVhZGluZyB6aXAgZmlsZXNcbjxodHRwOi8vc3R1YXJ0ay5jb20vanN6aXA+XG5cbihjKSAyMDA5LTIwMTQgU3R1YXJ0IEtuaWdodGxleSA8c3R1YXJ0IFthdF0gc3R1YXJ0ay5jb20+XG5EdWFsIGxpY2VuY2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZSBvciBHUEx2My4gU2VlIGh0dHBzOi8vcmF3LmdpdGh1Yi5jb20vU3R1ay9qc3ppcC9tYXN0ZXIvTElDRU5TRS5tYXJrZG93bi5cblxuSlNaaXAgdXNlcyB0aGUgbGlicmFyeSBwYWtvIHJlbGVhc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZSA6XG5odHRwczovL2dpdGh1Yi5jb20vbm9kZWNhL3Bha28vYmxvYi9tYXN0ZXIvTElDRU5TRVxuXG5Ob3RlOiBzaW5jZSBKU1ppcCAzIHJlbW92ZWQgY3JpdGljYWwgZnVuY3Rpb25hbGl0eSwgdGhpcyB2ZXJzaW9uIGFzc2lnbnMgdG8gdGhlXG5gSlNaaXBTeW5jYCB2YXJpYWJsZS4gIEFub3RoZXIgSlNaaXAgdmVyc2lvbiBjYW4gYmUgbG9hZGVkIGluIHBhcmFsbGVsLlxuKi9cbihmdW5jdGlvbihlKXtcblx0aWYoXCJvYmplY3RcIj09dHlwZW9mIGV4cG9ydHMmJlwidW5kZWZpbmVkXCIhPXR5cGVvZiBtb2R1bGUmJlwidW5kZWZpbmVkXCI9PXR5cGVvZiBET19OT1RfRVhQT1JUX0pTWklQKW1vZHVsZS5leHBvcnRzPWUoKTtcblx0ZWxzZSBpZihcImZ1bmN0aW9uXCI9PXR5cGVvZiBkZWZpbmUmJmRlZmluZS5hbWQmJlwidW5kZWZpbmVkXCI9PXR5cGVvZiBET19OT1RfRVhQT1JUX0pTWklQKXtKU1ppcFN5bmM9ZSgpO2RlZmluZShbXSxlKTt9XG5cdGVsc2V7XG5cdFx0dmFyIGY7XG5cdFx0XCJ1bmRlZmluZWRcIiE9dHlwZW9mIGdsb2JhbFRoaXM/Zj1nbG9iYWxUaGlzOlxuXHRcdFwidW5kZWZpbmVkXCIhPXR5cGVvZiB3aW5kb3c/Zj13aW5kb3c6XG5cdFx0XCJ1bmRlZmluZWRcIiE9dHlwZW9mIGdsb2JhbD9mPWdsb2JhbDpcblx0XHRcInVuZGVmaW5lZFwiIT10eXBlb2YgJCAmJiAkLmdsb2JhbD9mPSQuZ2xvYmFsOlxuXHRcdFwidW5kZWZpbmVkXCIhPXR5cGVvZiBzZWxmJiYoZj1zZWxmKSxmLkpTWmlwU3luYz1lKClcblx0fVxufShmdW5jdGlvbigpe3ZhciBkZWZpbmUsbW9kdWxlLGV4cG9ydHM7cmV0dXJuIChmdW5jdGlvbiBlKHQsbixyKXtmdW5jdGlvbiBzKG8sdSl7aWYoIW5bb10pe2lmKCF0W29dKXt2YXIgYT10eXBlb2YgcmVxdWlyZT09XCJmdW5jdGlvblwiJiZyZXF1aXJlO2lmKCF1JiZhKXJldHVybiBhKG8sITApO2lmKGkpcmV0dXJuIGkobywhMCk7dGhyb3cgbmV3IEVycm9yKFwiQ2Fubm90IGZpbmQgbW9kdWxlICdcIitvK1wiJ1wiKX12YXIgZj1uW29dPXtleHBvcnRzOnt9fTt0W29dWzBdLmNhbGwoZi5leHBvcnRzLGZ1bmN0aW9uKGUpe3ZhciBuPXRbb11bMV1bZV07cmV0dXJuIHMobj9uOmUpfSxmLGYuZXhwb3J0cyxlLHQsbixyKX1yZXR1cm4gbltvXS5leHBvcnRzfXZhciBpPXR5cGVvZiByZXF1aXJlPT1cImZ1bmN0aW9uXCImJnJlcXVpcmU7Zm9yKHZhciBvPTA7bzxyLmxlbmd0aDtvKyspcyhyW29dKTtyZXR1cm4gc30pKHsxOltmdW5jdGlvbihfZGVyZXFfLG1vZHVsZSxleHBvcnRzKXtcbid1c2Ugc3RyaWN0Jztcbi8vIHByaXZhdGUgcHJvcGVydHlcbnZhciBfa2V5U3RyID0gXCJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPVwiO1xuXG5cbi8vIHB1YmxpYyBtZXRob2QgZm9yIGVuY29kaW5nXG5leHBvcnRzLmVuY29kZSA9IGZ1bmN0aW9uKGlucHV0LCB1dGY4KSB7XG4gICAgdmFyIG91dHB1dCA9IFwiXCI7XG4gICAgdmFyIGNocjEsIGNocjIsIGNocjMsIGVuYzEsIGVuYzIsIGVuYzMsIGVuYzQ7XG4gICAgdmFyIGkgPSAwO1xuXG4gICAgd2hpbGUgKGkgPCBpbnB1dC5sZW5ndGgpIHtcblxuICAgICAgICBjaHIxID0gaW5wdXQuY2hhckNvZGVBdChpKyspO1xuICAgICAgICBjaHIyID0gaW5wdXQuY2hhckNvZGVBdChpKyspO1xuICAgICAgICBjaHIzID0gaW5wdXQuY2hhckNvZGVBdChpKyspO1xuXG4gICAgICAgIGVuYzEgPSBjaHIxID4+IDI7XG4gICAgICAgIGVuYzIgPSAoKGNocjEgJiAzKSA8PCA0KSB8IChjaHIyID4+IDQpO1xuICAgICAgICBlbmMzID0gKChjaHIyICYgMTUpIDw8IDIpIHwgKGNocjMgPj4gNik7XG4gICAgICAgIGVuYzQgPSBjaHIzICYgNjM7XG5cbiAgICAgICAgaWYgKGlzTmFOKGNocjIpKSB7XG4gICAgICAgICAgICBlbmMzID0gZW5jNCA9IDY0O1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGlzTmFOKGNocjMpKSB7XG4gICAgICAgICAgICBlbmM0ID0gNjQ7XG4gICAgICAgIH1cblxuICAgICAgICBvdXRwdXQgPSBvdXRwdXQgKyBfa2V5U3RyLmNoYXJBdChlbmMxKSArIF9rZXlTdHIuY2hhckF0KGVuYzIpICsgX2tleVN0ci5jaGFyQXQoZW5jMykgKyBfa2V5U3RyLmNoYXJBdChlbmM0KTtcblxuICAgIH1cblxuICAgIHJldHVybiBvdXRwdXQ7XG59O1xuXG4vLyBwdWJsaWMgbWV0aG9kIGZvciBkZWNvZGluZ1xuZXhwb3J0cy5kZWNvZGUgPSBmdW5jdGlvbihpbnB1dCwgdXRmOCkge1xuICAgIHZhciBvdXRwdXQgPSBcIlwiO1xuICAgIHZhciBjaHIxLCBjaHIyLCBjaHIzO1xuICAgIHZhciBlbmMxLCBlbmMyLCBlbmMzLCBlbmM0O1xuICAgIHZhciBpID0gMDtcblxuICAgIGlucHV0ID0gaW5wdXQucmVwbGFjZSgvW15BLVphLXowLTlcXCtcXC9cXD1dL2csIFwiXCIpO1xuXG4gICAgd2hpbGUgKGkgPCBpbnB1dC5sZW5ndGgpIHtcblxuICAgICAgICBlbmMxID0gX2tleVN0ci5pbmRleE9mKGlucHV0LmNoYXJBdChpKyspKTtcbiAgICAgICAgZW5jMiA9IF9rZXlTdHIuaW5kZXhPZihpbnB1dC5jaGFyQXQoaSsrKSk7XG4gICAgICAgIGVuYzMgPSBfa2V5U3RyLmluZGV4T2YoaW5wdXQuY2hhckF0KGkrKykpO1xuICAgICAgICBlbmM0ID0gX2tleVN0ci5pbmRleE9mKGlucHV0LmNoYXJBdChpKyspKTtcblxuICAgICAgICBjaHIxID0gKGVuYzEgPDwgMikgfCAoZW5jMiA+PiA0KTtcbiAgICAgICAgY2hyMiA9ICgoZW5jMiAmIDE1KSA8PCA0KSB8IChlbmMzID4+IDIpO1xuICAgICAgICBjaHIzID0gKChlbmMzICYgMykgPDwgNikgfCBlbmM0O1xuXG4gICAgICAgIG91dHB1dCA9IG91dHB1dCArIFN0cmluZy5mcm9tQ2hhckNvZGUoY2hyMSk7XG5cbiAgICAgICAgaWYgKGVuYzMgIT0gNjQpIHtcbiAgICAgICAgICAgIG91dHB1dCA9IG91dHB1dCArIFN0cmluZy5mcm9tQ2hhckNvZGUoY2hyMik7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGVuYzQgIT0gNjQpIHtcbiAgICAgICAgICAgIG91dHB1dCA9IG91dHB1dCArIFN0cmluZy5mcm9tQ2hhckNvZGUoY2hyMyk7XG4gICAgICAgIH1cblxuICAgIH1cblxuICAgIHJldHVybiBvdXRwdXQ7XG5cbn07XG5cbn0se31dLDI6W2Z1bmN0aW9uKF9kZXJlcV8sbW9kdWxlLGV4cG9ydHMpe1xuJ3VzZSBzdHJpY3QnO1xuZnVuY3Rpb24gQ29tcHJlc3NlZE9iamVjdCgpIHtcbiAgICB0aGlzLmNvbXByZXNzZWRTaXplID0gMDtcbiAgICB0aGlzLnVuY29tcHJlc3NlZFNpemUgPSAwO1xuICAgIHRoaXMuY3JjMzIgPSAwO1xuICAgIHRoaXMuY29tcHJlc3Npb25NZXRob2QgPSBudWxsO1xuICAgIHRoaXMuY29tcHJlc3NlZENvbnRlbnQgPSBudWxsO1xufVxuXG5Db21wcmVzc2VkT2JqZWN0LnByb3RvdHlwZSA9IHtcbiAgICAvKipcbiAgICAgKiBSZXR1cm4gdGhlIGRlY29tcHJlc3NlZCBjb250ZW50IGluIGFuIHVuc3BlY2lmaWVkIGZvcm1hdC5cbiAgICAgKiBUaGUgZm9ybWF0IHdpbGwgZGVwZW5kIG9uIHRoZSBkZWNvbXByZXNzb3IuXG4gICAgICogQHJldHVybiB7T2JqZWN0fSB0aGUgZGVjb21wcmVzc2VkIGNvbnRlbnQuXG4gICAgICovXG4gICAgZ2V0Q29udGVudDogZnVuY3Rpb24oKSB7XG4gICAgICAgIHJldHVybiBudWxsOyAvLyBzZWUgaW1wbGVtZW50YXRpb25cbiAgICB9LFxuICAgIC8qKlxuICAgICAqIFJldHVybiB0aGUgY29tcHJlc3NlZCBjb250ZW50IGluIGFuIHVuc3BlY2lmaWVkIGZvcm1hdC5cbiAgICAgKiBUaGUgZm9ybWF0IHdpbGwgZGVwZW5kIG9uIHRoZSBjb21wcmVzc2VkIGNvbnRlbiBzb3VyY2UuXG4gICAgICogQHJldHVybiB7T2JqZWN0fSB0aGUgY29tcHJlc3NlZCBjb250ZW50LlxuICAgICAqL1xuICAgIGdldENvbXByZXNzZWRDb250ZW50OiBmdW5jdGlvbigpIHtcbiAgICAgICAgcmV0dXJuIG51bGw7IC8vIHNlZSBpbXBsZW1lbnRhdGlvblxuICAgIH1cbn07XG5tb2R1bGUuZXhwb3J0cyA9IENvbXByZXNzZWRPYmplY3Q7XG5cbn0se31dLDM6W2Z1bmN0aW9uKF9kZXJlcV8sbW9kdWxlLGV4cG9ydHMpe1xuJ3VzZSBzdHJpY3QnO1xuZXhwb3J0cy5TVE9SRSA9IHtcbiAgICBtYWdpYzogXCJcXHgwMFxceDAwXCIsXG4gICAgY29tcHJlc3M6IGZ1bmN0aW9uKGNvbnRlbnQpIHtcbiAgICAgICAgcmV0dXJuIGNvbnRlbnQ7IC8vIG5vIGNvbXByZXNzaW9uXG4gICAgfSxcbiAgICB1bmNvbXByZXNzOiBmdW5jdGlvbihjb250ZW50KSB7XG4gICAgICAgIHJldHVybiBjb250ZW50OyAvLyBubyBjb21wcmVzc2lvblxuICAgIH0sXG4gICAgY29tcHJlc3NJbnB1dFR5cGU6IG51bGwsXG4gICAgdW5jb21wcmVzc0lucHV0VHlwZTogbnVsbFxufTtcbmV4cG9ydHMuREVGTEFURSA9IF9kZXJlcV8oJy4vZmxhdGUnKTtcblxufSx7XCIuL2ZsYXRlXCI6OH1dLDQ6W2Z1bmN0aW9uKF9kZXJlcV8sbW9kdWxlLGV4cG9ydHMpe1xuJ3VzZSBzdHJpY3QnO1xuXG52YXIgdXRpbHMgPSBfZGVyZXFfKCcuL3V0aWxzJyk7XG5cbnZhciB0YWJsZSA9IFtcbiAgICAweDAwMDAwMDAwLCAweDc3MDczMDk2LCAweEVFMEU2MTJDLCAweDk5MDk1MUJBLFxuICAgIDB4MDc2REM0MTksIDB4NzA2QUY0OEYsIDB4RTk2M0E1MzUsIDB4OUU2NDk1QTMsXG4gICAgMHgwRURCODgzMiwgMHg3OURDQjhBNCwgMHhFMEQ1RTkxRSwgMHg5N0QyRDk4OCxcbiAgICAweDA5QjY0QzJCLCAweDdFQjE3Q0JELCAweEU3QjgyRDA3LCAweDkwQkYxRDkxLFxuICAgIDB4MURCNzEwNjQsIDB4NkFCMDIwRjIsIDB4RjNCOTcxNDgsIDB4ODRCRTQxREUsXG4gICAgMHgxQURBRDQ3RCwgMHg2RERERTRFQiwgMHhGNEQ0QjU1MSwgMHg4M0QzODVDNyxcbiAgICAweDEzNkM5ODU2LCAweDY0NkJBOEMwLCAweEZENjJGOTdBLCAweDhBNjVDOUVDLFxuICAgIDB4MTQwMTVDNEYsIDB4NjMwNjZDRDksIDB4RkEwRjNENjMsIDB4OEQwODBERjUsXG4gICAgMHgzQjZFMjBDOCwgMHg0QzY5MTA1RSwgMHhENTYwNDFFNCwgMHhBMjY3NzE3MixcbiAgICAweDNDMDNFNEQxLCAweDRCMDRENDQ3LCAweEQyMEQ4NUZELCAweEE1MEFCNTZCLFxuICAgIDB4MzVCNUE4RkEsIDB4NDJCMjk4NkMsIDB4REJCQkM5RDYsIDB4QUNCQ0Y5NDAsXG4gICAgMHgzMkQ4NkNFMywgMHg0NURGNUM3NSwgMHhEQ0Q2MERDRiwgMHhBQkQxM0Q1OSxcbiAgICAweDI2RDkzMEFDLCAweDUxREUwMDNBLCAweEM4RDc1MTgwLCAweEJGRDA2MTE2LFxuICAgIDB4MjFCNEY0QjUsIDB4NTZCM0M0MjMsIDB4Q0ZCQTk1OTksIDB4QjhCREE1MEYsXG4gICAgMHgyODAyQjg5RSwgMHg1RjA1ODgwOCwgMHhDNjBDRDlCMiwgMHhCMTBCRTkyNCxcbiAgICAweDJGNkY3Qzg3LCAweDU4Njg0QzExLCAweEMxNjExREFCLCAweEI2NjYyRDNELFxuICAgIDB4NzZEQzQxOTAsIDB4MDFEQjcxMDYsIDB4OThEMjIwQkMsIDB4RUZENTEwMkEsXG4gICAgMHg3MUIxODU4OSwgMHgwNkI2QjUxRiwgMHg5RkJGRTRBNSwgMHhFOEI4RDQzMyxcbiAgICAweDc4MDdDOUEyLCAweDBGMDBGOTM0LCAweDk2MDlBODhFLCAweEUxMEU5ODE4LFxuICAgIDB4N0Y2QTBEQkIsIDB4MDg2RDNEMkQsIDB4OTE2NDZDOTcsIDB4RTY2MzVDMDEsXG4gICAgMHg2QjZCNTFGNCwgMHgxQzZDNjE2MiwgMHg4NTY1MzBEOCwgMHhGMjYyMDA0RSxcbiAgICAweDZDMDY5NUVELCAweDFCMDFBNTdCLCAweDgyMDhGNEMxLCAweEY1MEZDNDU3LFxuICAgIDB4NjVCMEQ5QzYsIDB4MTJCN0U5NTAsIDB4OEJCRUI4RUEsIDB4RkNCOTg4N0MsXG4gICAgMHg2MkREMURERiwgMHgxNURBMkQ0OSwgMHg4Q0QzN0NGMywgMHhGQkQ0NEM2NSxcbiAgICAweDREQjI2MTU4LCAweDNBQjU1MUNFLCAweEEzQkMwMDc0LCAweEQ0QkIzMEUyLFxuICAgIDB4NEFERkE1NDEsIDB4M0REODk1RDcsIDB4QTREMUM0NkQsIDB4RDNENkY0RkIsXG4gICAgMHg0MzY5RTk2QSwgMHgzNDZFRDlGQywgMHhBRDY3ODg0NiwgMHhEQTYwQjhEMCxcbiAgICAweDQ0MDQyRDczLCAweDMzMDMxREU1LCAweEFBMEE0QzVGLCAweEREMEQ3Q0M5LFxuICAgIDB4NTAwNTcxM0MsIDB4MjcwMjQxQUEsIDB4QkUwQjEwMTAsIDB4QzkwQzIwODYsXG4gICAgMHg1NzY4QjUyNSwgMHgyMDZGODVCMywgMHhCOTY2RDQwOSwgMHhDRTYxRTQ5RixcbiAgICAweDVFREVGOTBFLCAweDI5RDlDOTk4LCAweEIwRDA5ODIyLCAweEM3RDdBOEI0LFxuICAgIDB4NTlCMzNEMTcsIDB4MkVCNDBEODEsIDB4QjdCRDVDM0IsIDB4QzBCQTZDQUQsXG4gICAgMHhFREI4ODMyMCwgMHg5QUJGQjNCNiwgMHgwM0I2RTIwQywgMHg3NEIxRDI5QSxcbiAgICAweEVBRDU0NzM5LCAweDlERDI3N0FGLCAweDA0REIyNjE1LCAweDczREMxNjgzLFxuICAgIDB4RTM2MzBCMTIsIDB4OTQ2NDNCODQsIDB4MEQ2RDZBM0UsIDB4N0E2QTVBQTgsXG4gICAgMHhFNDBFQ0YwQiwgMHg5MzA5RkY5RCwgMHgwQTAwQUUyNywgMHg3RDA3OUVCMSxcbiAgICAweEYwMEY5MzQ0LCAweDg3MDhBM0QyLCAweDFFMDFGMjY4LCAweDY5MDZDMkZFLFxuICAgIDB4Rjc2MjU3NUQsIDB4ODA2NTY3Q0IsIDB4MTk2QzM2NzEsIDB4NkU2QjA2RTcsXG4gICAgMHhGRUQ0MUI3NiwgMHg4OUQzMkJFMCwgMHgxMERBN0E1QSwgMHg2N0RENEFDQyxcbiAgICAweEY5QjlERjZGLCAweDhFQkVFRkY5LCAweDE3QjdCRTQzLCAweDYwQjA4RUQ1LFxuICAgIDB4RDZENkEzRTgsIDB4QTFEMTkzN0UsIDB4MzhEOEMyQzQsIDB4NEZERkYyNTIsXG4gICAgMHhEMUJCNjdGMSwgMHhBNkJDNTc2NywgMHgzRkI1MDZERCwgMHg0OEIyMzY0QixcbiAgICAweEQ4MEQyQkRBLCAweEFGMEExQjRDLCAweDM2MDM0QUY2LCAweDQxMDQ3QTYwLFxuICAgIDB4REY2MEVGQzMsIDB4QTg2N0RGNTUsIDB4MzE2RThFRUYsIDB4NDY2OUJFNzksXG4gICAgMHhDQjYxQjM4QywgMHhCQzY2ODMxQSwgMHgyNTZGRDJBMCwgMHg1MjY4RTIzNixcbiAgICAweENDMEM3Nzk1LCAweEJCMEI0NzAzLCAweDIyMDIxNkI5LCAweDU1MDUyNjJGLFxuICAgIDB4QzVCQTNCQkUsIDB4QjJCRDBCMjgsIDB4MkJCNDVBOTIsIDB4NUNCMzZBMDQsXG4gICAgMHhDMkQ3RkZBNywgMHhCNUQwQ0YzMSwgMHgyQ0Q5OUU4QiwgMHg1QkRFQUUxRCxcbiAgICAweDlCNjRDMkIwLCAweEVDNjNGMjI2LCAweDc1NkFBMzlDLCAweDAyNkQ5MzBBLFxuICAgIDB4OUMwOTA2QTksIDB4RUIwRTM2M0YsIDB4NzIwNzY3ODUsIDB4MDUwMDU3MTMsXG4gICAgMHg5NUJGNEE4MiwgMHhFMkI4N0ExNCwgMHg3QkIxMkJBRSwgMHgwQ0I2MUIzOCxcbiAgICAweDkyRDI4RTlCLCAweEU1RDVCRTBELCAweDdDRENFRkI3LCAweDBCREJERjIxLFxuICAgIDB4ODZEM0QyRDQsIDB4RjFENEUyNDIsIDB4NjhEREIzRjgsIDB4MUZEQTgzNkUsXG4gICAgMHg4MUJFMTZDRCwgMHhGNkI5MjY1QiwgMHg2RkIwNzdFMSwgMHgxOEI3NDc3NyxcbiAgICAweDg4MDg1QUU2LCAweEZGMEY2QTcwLCAweDY2MDYzQkNBLCAweDExMDEwQjVDLFxuICAgIDB4OEY2NTlFRkYsIDB4Rjg2MkFFNjksIDB4NjE2QkZGRDMsIDB4MTY2Q0NGNDUsXG4gICAgMHhBMDBBRTI3OCwgMHhENzBERDJFRSwgMHg0RTA0ODM1NCwgMHgzOTAzQjNDMixcbiAgICAweEE3NjcyNjYxLCAweEQwNjAxNkY3LCAweDQ5Njk0NzRELCAweDNFNkU3N0RCLFxuICAgIDB4QUVEMTZBNEEsIDB4RDlENjVBREMsIDB4NDBERjBCNjYsIDB4MzdEODNCRjAsXG4gICAgMHhBOUJDQUU1MywgMHhERUJCOUVDNSwgMHg0N0IyQ0Y3RiwgMHgzMEI1RkZFOSxcbiAgICAweEJEQkRGMjFDLCAweENBQkFDMjhBLCAweDUzQjM5MzMwLCAweDI0QjRBM0E2LFxuICAgIDB4QkFEMDM2MDUsIDB4Q0RENzA2OTMsIDB4NTRERTU3MjksIDB4MjNEOTY3QkYsXG4gICAgMHhCMzY2N0EyRSwgMHhDNDYxNEFCOCwgMHg1RDY4MUIwMiwgMHgyQTZGMkI5NCxcbiAgICAweEI0MEJCRTM3LCAweEMzMEM4RUExLCAweDVBMDVERjFCLCAweDJEMDJFRjhEXG5dO1xuXG4vKipcbiAqXG4gKiAgSmF2YXNjcmlwdCBjcmMzMlxuICogIGh0dHA6Ly93d3cud2VidG9vbGtpdC5pbmZvL1xuICpcbiAqL1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBjcmMzMihpbnB1dCwgY3JjKSB7XG4gICAgaWYgKHR5cGVvZiBpbnB1dCA9PT0gXCJ1bmRlZmluZWRcIiB8fCAhaW5wdXQubGVuZ3RoKSB7XG4gICAgICAgIHJldHVybiAwO1xuICAgIH1cblxuICAgIHZhciBpc0FycmF5ID0gdXRpbHMuZ2V0VHlwZU9mKGlucHV0KSAhPT0gXCJzdHJpbmdcIjtcblxuICAgIGlmICh0eXBlb2YoY3JjKSA9PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgICAgIGNyYyA9IDA7XG4gICAgfVxuICAgIHZhciB4ID0gMDtcbiAgICB2YXIgeSA9IDA7XG4gICAgdmFyIGIgPSAwO1xuXG4gICAgY3JjID0gY3JjIF4gKC0xKTtcbiAgICBmb3IgKHZhciBpID0gMCwgaVRvcCA9IGlucHV0Lmxlbmd0aDsgaSA8IGlUb3A7IGkrKykge1xuICAgICAgICBiID0gaXNBcnJheSA/IGlucHV0W2ldIDogaW5wdXQuY2hhckNvZGVBdChpKTtcbiAgICAgICAgeSA9IChjcmMgXiBiKSAmIDB4RkY7XG4gICAgICAgIHggPSB0YWJsZVt5XTtcbiAgICAgICAgY3JjID0gKGNyYyA+Pj4gOCkgXiB4O1xuICAgIH1cblxuICAgIHJldHVybiBjcmMgXiAoLTEpO1xufTtcbi8vIHZpbTogc2V0IHNoaWZ0d2lkdGg9NCBzb2Z0dGFic3RvcD00OlxuXG59LHtcIi4vdXRpbHNcIjoyMX1dLDU6W2Z1bmN0aW9uKF9kZXJlcV8sbW9kdWxlLGV4cG9ydHMpe1xuJ3VzZSBzdHJpY3QnO1xudmFyIHV0aWxzID0gX2RlcmVxXygnLi91dGlscycpO1xuXG5mdW5jdGlvbiBEYXRhUmVhZGVyKGRhdGEpIHtcbiAgICB0aGlzLmRhdGEgPSBudWxsOyAvLyB0eXBlIDogc2VlIGltcGxlbWVudGF0aW9uXG4gICAgdGhpcy5sZW5ndGggPSAwO1xuICAgIHRoaXMuaW5kZXggPSAwO1xufVxuRGF0YVJlYWRlci5wcm90b3R5cGUgPSB7XG4gICAgLyoqXG4gICAgICogQ2hlY2sgdGhhdCB0aGUgb2Zmc2V0IHdpbGwgbm90IGdvIHRvbyBmYXIuXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IG9mZnNldCB0aGUgYWRkaXRpb25hbCBvZmZzZXQgdG8gY2hlY2suXG4gICAgICogQHRocm93cyB7RXJyb3J9IGFuIEVycm9yIGlmIHRoZSBvZmZzZXQgaXMgb3V0IG9mIGJvdW5kcy5cbiAgICAgKi9cbiAgICBjaGVja09mZnNldDogZnVuY3Rpb24ob2Zmc2V0KSB7XG4gICAgICAgIHRoaXMuY2hlY2tJbmRleCh0aGlzLmluZGV4ICsgb2Zmc2V0KTtcbiAgICB9LFxuICAgIC8qKlxuICAgICAqIENoZWNrIHRoYXQgdGhlIHNwZWNpZmVkIGluZGV4IHdpbGwgbm90IGJlIHRvbyBmYXIuXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IG5ld0luZGV4IHRoZSBpbmRleCB0byBjaGVjay5cbiAgICAgKiBAdGhyb3dzIHtFcnJvcn0gYW4gRXJyb3IgaWYgdGhlIGluZGV4IGlzIG91dCBvZiBib3VuZHMuXG4gICAgICovXG4gICAgY2hlY2tJbmRleDogZnVuY3Rpb24obmV3SW5kZXgpIHtcbiAgICAgICAgaWYgKHRoaXMubGVuZ3RoIDwgbmV3SW5kZXggfHwgbmV3SW5kZXggPCAwKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJFbmQgb2YgZGF0YSByZWFjaGVkIChkYXRhIGxlbmd0aCA9IFwiICsgdGhpcy5sZW5ndGggKyBcIiwgYXNrZWQgaW5kZXggPSBcIiArIChuZXdJbmRleCkgKyBcIikuIENvcnJ1cHRlZCB6aXAgP1wiKTtcbiAgICAgICAgfVxuICAgIH0sXG4gICAgLyoqXG4gICAgICogQ2hhbmdlIHRoZSBpbmRleC5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gbmV3SW5kZXggVGhlIG5ldyBpbmRleC5cbiAgICAgKiBAdGhyb3dzIHtFcnJvcn0gaWYgdGhlIG5ldyBpbmRleCBpcyBvdXQgb2YgdGhlIGRhdGEuXG4gICAgICovXG4gICAgc2V0SW5kZXg6IGZ1bmN0aW9uKG5ld0luZGV4KSB7XG4gICAgICAgIHRoaXMuY2hlY2tJbmRleChuZXdJbmRleCk7XG4gICAgICAgIHRoaXMuaW5kZXggPSBuZXdJbmRleDtcbiAgICB9LFxuICAgIC8qKlxuICAgICAqIFNraXAgdGhlIG5leHQgbiBieXRlcy5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gbiB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRvIHNraXAuXG4gICAgICogQHRocm93cyB7RXJyb3J9IGlmIHRoZSBuZXcgaW5kZXggaXMgb3V0IG9mIHRoZSBkYXRhLlxuICAgICAqL1xuICAgIHNraXA6IGZ1bmN0aW9uKG4pIHtcbiAgICAgICAgdGhpcy5zZXRJbmRleCh0aGlzLmluZGV4ICsgbik7XG4gICAgfSxcbiAgICAvKipcbiAgICAgKiBHZXQgdGhlIGJ5dGUgYXQgdGhlIHNwZWNpZmllZCBpbmRleC5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gaSB0aGUgaW5kZXggdG8gdXNlLlxuICAgICAqIEByZXR1cm4ge251bWJlcn0gYSBieXRlLlxuICAgICAqL1xuICAgIGJ5dGVBdDogZnVuY3Rpb24oaSkge1xuICAgICAgICAvLyBzZWUgaW1wbGVtZW50YXRpb25zXG4gICAgfSxcbiAgICAvKipcbiAgICAgKiBHZXQgdGhlIG5leHQgbnVtYmVyIHdpdGggYSBnaXZlbiBieXRlIHNpemUuXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHNpemUgdGhlIG51bWJlciBvZiBieXRlcyB0byByZWFkLlxuICAgICAqIEByZXR1cm4ge251bWJlcn0gdGhlIGNvcnJlc3BvbmRpbmcgbnVtYmVyLlxuICAgICAqL1xuICAgIHJlYWRJbnQ6IGZ1bmN0aW9uKHNpemUpIHtcbiAgICAgICAgdmFyIHJlc3VsdCA9IDAsXG4gICAgICAgICAgICBpO1xuICAgICAgICB0aGlzLmNoZWNrT2Zmc2V0KHNpemUpO1xuICAgICAgICBmb3IgKGkgPSB0aGlzLmluZGV4ICsgc2l6ZSAtIDE7IGkgPj0gdGhpcy5pbmRleDsgaS0tKSB7XG4gICAgICAgICAgICByZXN1bHQgPSAocmVzdWx0IDw8IDgpICsgdGhpcy5ieXRlQXQoaSk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5pbmRleCArPSBzaXplO1xuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH0sXG4gICAgLyoqXG4gICAgICogR2V0IHRoZSBuZXh0IHN0cmluZyB3aXRoIGEgZ2l2ZW4gYnl0ZSBzaXplLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBzaXplIHRoZSBudW1iZXIgb2YgYnl0ZXMgdG8gcmVhZC5cbiAgICAgKiBAcmV0dXJuIHtzdHJpbmd9IHRoZSBjb3JyZXNwb25kaW5nIHN0cmluZy5cbiAgICAgKi9cbiAgICByZWFkU3RyaW5nOiBmdW5jdGlvbihzaXplKSB7XG4gICAgICAgIHJldHVybiB1dGlscy50cmFuc2Zvcm1UbyhcInN0cmluZ1wiLCB0aGlzLnJlYWREYXRhKHNpemUpKTtcbiAgICB9LFxuICAgIC8qKlxuICAgICAqIEdldCByYXcgZGF0YSB3aXRob3V0IGNvbnZlcnNpb24sIDxzaXplPiBieXRlcy5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gc2l6ZSB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRvIHJlYWQuXG4gICAgICogQHJldHVybiB7T2JqZWN0fSB0aGUgcmF3IGRhdGEsIGltcGxlbWVudGF0aW9uIHNwZWNpZmljLlxuICAgICAqL1xuICAgIHJlYWREYXRhOiBmdW5jdGlvbihzaXplKSB7XG4gICAgICAgIC8vIHNlZSBpbXBsZW1lbnRhdGlvbnNcbiAgICB9LFxuICAgIC8qKlxuICAgICAqIEZpbmQgdGhlIGxhc3Qgb2NjdXJlbmNlIG9mIGEgemlwIHNpZ25hdHVyZSAoNCBieXRlcykuXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IHNpZyB0aGUgc2lnbmF0dXJlIHRvIGZpbmQuXG4gICAgICogQHJldHVybiB7bnVtYmVyfSB0aGUgaW5kZXggb2YgdGhlIGxhc3Qgb2NjdXJlbmNlLCAtMSBpZiBub3QgZm91bmQuXG4gICAgICovXG4gICAgbGFzdEluZGV4T2ZTaWduYXR1cmU6IGZ1bmN0aW9uKHNpZykge1xuICAgICAgICAvLyBzZWUgaW1wbGVtZW50YXRpb25zXG4gICAgfSxcbiAgICAvKipcbiAgICAgKiBHZXQgdGhlIG5leHQgZGF0ZS5cbiAgICAgKiBAcmV0dXJuIHtEYXRlfSB0aGUgZGF0ZS5cbiAgICAgKi9cbiAgICByZWFkRGF0ZTogZnVuY3Rpb24oKSB7XG4gICAgICAgIHZhciBkb3N0aW1lID0gdGhpcy5yZWFkSW50KDQpO1xuICAgICAgICByZXR1cm4gbmV3IERhdGUoXG4gICAgICAgICgoZG9zdGltZSA+PiAyNSkgJiAweDdmKSArIDE5ODAsIC8vIHllYXJcbiAgICAgICAgKChkb3N0aW1lID4+IDIxKSAmIDB4MGYpIC0gMSwgLy8gbW9udGhcbiAgICAgICAgKGRvc3RpbWUgPj4gMTYpICYgMHgxZiwgLy8gZGF5XG4gICAgICAgIChkb3N0aW1lID4+IDExKSAmIDB4MWYsIC8vIGhvdXJcbiAgICAgICAgKGRvc3RpbWUgPj4gNSkgJiAweDNmLCAvLyBtaW51dGVcbiAgICAgICAgKGRvc3RpbWUgJiAweDFmKSA8PCAxKTsgLy8gc2Vjb25kXG4gICAgfVxufTtcbm1vZHVsZS5leHBvcnRzID0gRGF0YVJlYWRlcjtcblxufSx7XCIuL3V0aWxzXCI6MjF9XSw2OltmdW5jdGlvbihfZGVyZXFfLG1vZHVsZSxleHBvcnRzKXtcbid1c2Ugc3RyaWN0JztcbmV4cG9ydHMuYmFzZTY0ID0gZmFsc2U7XG5leHBvcnRzLmJpbmFyeSA9IGZhbHNlO1xuZXhwb3J0cy5kaXIgPSBmYWxzZTtcbmV4cG9ydHMuY3JlYXRlRm9sZGVycyA9IGZhbHNlO1xuZXhwb3J0cy5kYXRlID0gbnVsbDtcbmV4cG9ydHMuY29tcHJlc3Npb24gPSBudWxsO1xuZXhwb3J0cy5jb21tZW50ID0gbnVsbDtcblxufSx7fV0sNzpbZnVuY3Rpb24oX2RlcmVxXyxtb2R1bGUsZXhwb3J0cyl7XG4ndXNlIHN0cmljdCc7XG52YXIgdXRpbHMgPSBfZGVyZXFfKCcuL3V0aWxzJyk7XG5cbi8qKlxuICogQGRlcHJlY2F0ZWRcbiAqIFRoaXMgZnVuY3Rpb24gd2lsbCBiZSByZW1vdmVkIGluIGEgZnV0dXJlIHZlcnNpb24gd2l0aG91dCByZXBsYWNlbWVudC5cbiAqL1xuZXhwb3J0cy5zdHJpbmcyYmluYXJ5ID0gZnVuY3Rpb24oc3RyKSB7XG4gICAgcmV0dXJuIHV0aWxzLnN0cmluZzJiaW5hcnkoc3RyKTtcbn07XG5cbi8qKlxuICogQGRlcHJlY2F0ZWRcbiAqIFRoaXMgZnVuY3Rpb24gd2lsbCBiZSByZW1vdmVkIGluIGEgZnV0dXJlIHZlcnNpb24gd2l0aG91dCByZXBsYWNlbWVudC5cbiAqL1xuZXhwb3J0cy5zdHJpbmcyVWludDhBcnJheSA9IGZ1bmN0aW9uKHN0cikge1xuICAgIHJldHVybiB1dGlscy50cmFuc2Zvcm1UbyhcInVpbnQ4YXJyYXlcIiwgc3RyKTtcbn07XG5cbi8qKlxuICogQGRlcHJlY2F0ZWRcbiAqIFRoaXMgZnVuY3Rpb24gd2lsbCBiZSByZW1vdmVkIGluIGEgZnV0dXJlIHZlcnNpb24gd2l0aG91dCByZXBsYWNlbWVudC5cbiAqL1xuZXhwb3J0cy51aW50OEFycmF5MlN0cmluZyA9IGZ1bmN0aW9uKGFycmF5KSB7XG4gICAgcmV0dXJuIHV0aWxzLnRyYW5zZm9ybVRvKFwic3RyaW5nXCIsIGFycmF5KTtcbn07XG5cbi8qKlxuICogQGRlcHJlY2F0ZWRcbiAqIFRoaXMgZnVuY3Rpb24gd2lsbCBiZSByZW1vdmVkIGluIGEgZnV0dXJlIHZlcnNpb24gd2l0aG91dCByZXBsYWNlbWVudC5cbiAqL1xuZXhwb3J0cy5zdHJpbmcyQmxvYiA9IGZ1bmN0aW9uKHN0cikge1xuICAgIHZhciBidWZmZXIgPSB1dGlscy50cmFuc2Zvcm1UbyhcImFycmF5YnVmZmVyXCIsIHN0cik7XG4gICAgcmV0dXJuIHV0aWxzLmFycmF5QnVmZmVyMkJsb2IoYnVmZmVyKTtcbn07XG5cbi8qKlxuICogQGRlcHJlY2F0ZWRcbiAqIFRoaXMgZnVuY3Rpb24gd2lsbCBiZSByZW1vdmVkIGluIGEgZnV0dXJlIHZlcnNpb24gd2l0aG91dCByZXBsYWNlbWVudC5cbiAqL1xuZXhwb3J0cy5hcnJheUJ1ZmZlcjJCbG9iID0gZnVuY3Rpb24oYnVmZmVyKSB7XG4gICAgcmV0dXJuIHV0aWxzLmFycmF5QnVmZmVyMkJsb2IoYnVmZmVyKTtcbn07XG5cbi8qKlxuICogQGRlcHJlY2F0ZWRcbiAqIFRoaXMgZnVuY3Rpb24gd2lsbCBiZSByZW1vdmVkIGluIGEgZnV0dXJlIHZlcnNpb24gd2l0aG91dCByZXBsYWNlbWVudC5cbiAqL1xuZXhwb3J0cy50cmFuc2Zvcm1UbyA9IGZ1bmN0aW9uKG91dHB1dFR5cGUsIGlucHV0KSB7XG4gICAgcmV0dXJuIHV0aWxzLnRyYW5zZm9ybVRvKG91dHB1dFR5cGUsIGlucHV0KTtcbn07XG5cbi8qKlxuICogQGRlcHJlY2F0ZWRcbiAqIFRoaXMgZnVuY3Rpb24gd2lsbCBiZSByZW1vdmVkIGluIGEgZnV0dXJlIHZlcnNpb24gd2l0aG91dCByZXBsYWNlbWVudC5cbiAqL1xuZXhwb3J0cy5nZXRUeXBlT2YgPSBmdW5jdGlvbihpbnB1dCkge1xuICAgIHJldHVybiB1dGlscy5nZXRUeXBlT2YoaW5wdXQpO1xufTtcblxuLyoqXG4gKiBAZGVwcmVjYXRlZFxuICogVGhpcyBmdW5jdGlvbiB3aWxsIGJlIHJlbW92ZWQgaW4gYSBmdXR1cmUgdmVyc2lvbiB3aXRob3V0IHJlcGxhY2VtZW50LlxuICovXG5leHBvcnRzLmNoZWNrU3VwcG9ydCA9IGZ1bmN0aW9uKHR5cGUpIHtcbiAgICByZXR1cm4gdXRpbHMuY2hlY2tTdXBwb3J0KHR5cGUpO1xufTtcblxuLyoqXG4gKiBAZGVwcmVjYXRlZFxuICogVGhpcyB2YWx1ZSB3aWxsIGJlIHJlbW92ZWQgaW4gYSBmdXR1cmUgdmVyc2lvbiB3aXRob3V0IHJlcGxhY2VtZW50LlxuICovXG5leHBvcnRzLk1BWF9WQUxVRV8xNkJJVFMgPSB1dGlscy5NQVhfVkFMVUVfMTZCSVRTO1xuXG4vKipcbiAqIEBkZXByZWNhdGVkXG4gKiBUaGlzIHZhbHVlIHdpbGwgYmUgcmVtb3ZlZCBpbiBhIGZ1dHVyZSB2ZXJzaW9uIHdpdGhvdXQgcmVwbGFjZW1lbnQuXG4gKi9cbmV4cG9ydHMuTUFYX1ZBTFVFXzMyQklUUyA9IHV0aWxzLk1BWF9WQUxVRV8zMkJJVFM7XG5cblxuLyoqXG4gKiBAZGVwcmVjYXRlZFxuICogVGhpcyBmdW5jdGlvbiB3aWxsIGJlIHJlbW92ZWQgaW4gYSBmdXR1cmUgdmVyc2lvbiB3aXRob3V0IHJlcGxhY2VtZW50LlxuICovXG5leHBvcnRzLnByZXR0eSA9IGZ1bmN0aW9uKHN0cikge1xuICAgIHJldHVybiB1dGlscy5wcmV0dHkoc3RyKTtcbn07XG5cbi8qKlxuICogQGRlcHJlY2F0ZWRcbiAqIFRoaXMgZnVuY3Rpb24gd2lsbCBiZSByZW1vdmVkIGluIGEgZnV0dXJlIHZlcnNpb24gd2l0aG91dCByZXBsYWNlbWVudC5cbiAqL1xuZXhwb3J0cy5maW5kQ29tcHJlc3Npb24gPSBmdW5jdGlvbihjb21wcmVzc2lvbk1ldGhvZCkge1xuICAgIHJldHVybiB1dGlscy5maW5kQ29tcHJlc3Npb24oY29tcHJlc3Npb25NZXRob2QpO1xufTtcblxuLyoqXG4gKiBAZGVwcmVjYXRlZFxuICogVGhpcyBmdW5jdGlvbiB3aWxsIGJlIHJlbW92ZWQgaW4gYSBmdXR1cmUgdmVyc2lvbiB3aXRob3V0IHJlcGxhY2VtZW50LlxuICovXG5leHBvcnRzLmlzUmVnRXhwID0gZnVuY3Rpb24gKG9iamVjdCkge1xuICAgIHJldHVybiB1dGlscy5pc1JlZ0V4cChvYmplY3QpO1xufTtcblxuXG59LHtcIi4vdXRpbHNcIjoyMX1dLDg6W2Z1bmN0aW9uKF9kZXJlcV8sbW9kdWxlLGV4cG9ydHMpe1xuJ3VzZSBzdHJpY3QnO1xudmFyIFVTRV9UWVBFREFSUkFZID0gKHR5cGVvZiBVaW50OEFycmF5ICE9PSAndW5kZWZpbmVkJykgJiYgKHR5cGVvZiBVaW50MTZBcnJheSAhPT0gJ3VuZGVmaW5lZCcpICYmICh0eXBlb2YgVWludDMyQXJyYXkgIT09ICd1bmRlZmluZWQnKTtcblxudmFyIHBha28gPSBfZGVyZXFfKFwicGFrb1wiKTtcbmV4cG9ydHMudW5jb21wcmVzc0lucHV0VHlwZSA9IFVTRV9UWVBFREFSUkFZID8gXCJ1aW50OGFycmF5XCIgOiBcImFycmF5XCI7XG5leHBvcnRzLmNvbXByZXNzSW5wdXRUeXBlID0gVVNFX1RZUEVEQVJSQVkgPyBcInVpbnQ4YXJyYXlcIiA6IFwiYXJyYXlcIjtcblxuZXhwb3J0cy5tYWdpYyA9IFwiXFx4MDhcXHgwMFwiO1xuZXhwb3J0cy5jb21wcmVzcyA9IGZ1bmN0aW9uKGlucHV0KSB7XG4gICAgcmV0dXJuIHBha28uZGVmbGF0ZVJhdyhpbnB1dCk7XG59O1xuZXhwb3J0cy51bmNvbXByZXNzID0gIGZ1bmN0aW9uKGlucHV0KSB7XG4gICAgcmV0dXJuIHBha28uaW5mbGF0ZVJhdyhpbnB1dCk7XG59O1xuXG59LHtcInBha29cIjoyNH1dLDk6W2Z1bmN0aW9uKF9kZXJlcV8sbW9kdWxlLGV4cG9ydHMpe1xuJ3VzZSBzdHJpY3QnO1xuXG52YXIgYmFzZTY0ID0gX2RlcmVxXygnLi9iYXNlNjQnKTtcblxuLyoqXG5Vc2FnZTpcbiAgIHppcCA9IG5ldyBKU1ppcCgpO1xuICAgemlwLmZpbGUoXCJoZWxsby50eHRcIiwgXCJIZWxsbywgV29ybGQhXCIpLmZpbGUoXCJ0ZW1wZmlsZVwiLCBcIm5vdGhpbmdcIik7XG4gICB6aXAuZm9sZGVyKFwiaW1hZ2VzXCIpLmZpbGUoXCJzbWlsZS5naWZcIiwgYmFzZTY0RGF0YSwge2Jhc2U2NDogdHJ1ZX0pO1xuICAgemlwLmZpbGUoXCJYbWFzLnR4dFwiLCBcIkhvIGhvIGhvICFcIiwge2RhdGUgOiBuZXcgRGF0ZShcIkRlY2VtYmVyIDI1LCAyMDA3IDAwOjAwOjAxXCIpfSk7XG4gICB6aXAucmVtb3ZlKFwidGVtcGZpbGVcIik7XG5cbiAgIGJhc2U2NHppcCA9IHppcC5nZW5lcmF0ZSgpO1xuXG4qKi9cblxuLyoqXG4gKiBSZXByZXNlbnRhdGlvbiBhIG9mIHppcCBmaWxlIGluIGpzXG4gKiBAY29uc3RydWN0b3JcbiAqIEBwYXJhbSB7U3RyaW5nPXxBcnJheUJ1ZmZlcj18VWludDhBcnJheT19IGRhdGEgdGhlIGRhdGEgdG8gbG9hZCwgaWYgYW55IChvcHRpb25hbCkuXG4gKiBAcGFyYW0ge09iamVjdD19IG9wdGlvbnMgdGhlIG9wdGlvbnMgZm9yIGNyZWF0aW5nIHRoaXMgb2JqZWN0cyAob3B0aW9uYWwpLlxuICovXG5mdW5jdGlvbiBKU1ppcFN5bmMoZGF0YSwgb3B0aW9ucykge1xuICAgIC8vIGlmIHRoaXMgY29uc3RydWN0b3IgaXPCoHVzZWQgd2l0aG91dMKgYG5ld2AsIGl0wqBhZGRzIGBuZXdgIGJlZm9yZcKgaXRzZWxmOlxuICAgIGlmKCEodGhpcyBpbnN0YW5jZW9mIEpTWmlwU3luYykpIHJldHVybiBuZXcgSlNaaXBTeW5jKGRhdGEsIG9wdGlvbnMpO1xuXG4gICAgLy8gb2JqZWN0IGNvbnRhaW5pbmcgdGhlIGZpbGVzIDpcbiAgICAvLyB7XG4gICAgLy8gICBcImZvbGRlci9cIiA6IHsuLi59LFxuICAgIC8vICAgXCJmb2xkZXIvZGF0YS50eHRcIiA6IHsuLi59XG4gICAgLy8gfVxuICAgIHRoaXMuZmlsZXMgPSB7fTtcblxuICAgIHRoaXMuY29tbWVudCA9IG51bGw7XG5cbiAgICAvLyBXaGVyZSB3ZSBhcmUgaW4gdGhlIGhpZXJhcmNoeVxuICAgIHRoaXMucm9vdCA9IFwiXCI7XG4gICAgaWYgKGRhdGEpIHtcbiAgICAgICAgdGhpcy5sb2FkKGRhdGEsIG9wdGlvbnMpO1xuICAgIH1cbiAgICB0aGlzLmNsb25lID0gZnVuY3Rpb24oKSB7XG4gICAgICAgIHZhciBuZXdPYmogPSBuZXcgSlNaaXBTeW5jKCk7XG4gICAgICAgIGZvciAodmFyIGkgaW4gdGhpcykge1xuICAgICAgICAgICAgaWYgKHR5cGVvZiB0aGlzW2ldICE9PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgICAgICAgICBuZXdPYmpbaV0gPSB0aGlzW2ldO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBuZXdPYmo7XG4gICAgfTtcbn1cbkpTWmlwU3luYy5wcm90b3R5cGUgPSBfZGVyZXFfKCcuL29iamVjdCcpO1xuSlNaaXBTeW5jLnByb3RvdHlwZS5sb2FkID0gX2RlcmVxXygnLi9sb2FkJyk7XG5KU1ppcFN5bmMuc3VwcG9ydCA9IF9kZXJlcV8oJy4vc3VwcG9ydCcpO1xuSlNaaXBTeW5jLmRlZmF1bHRzID0gX2RlcmVxXygnLi9kZWZhdWx0cycpO1xuXG4vKipcbiAqIEBkZXByZWNhdGVkXG4gKiBUaGlzIG5hbWVzcGFjZSB3aWxsIGJlIHJlbW92ZWQgaW4gYSBmdXR1cmUgdmVyc2lvbiB3aXRob3V0IHJlcGxhY2VtZW50LlxuICovXG5KU1ppcFN5bmMudXRpbHMgPSBfZGVyZXFfKCcuL2RlcHJlY2F0ZWRQdWJsaWNVdGlscycpO1xuXG5KU1ppcFN5bmMuYmFzZTY0ID0ge1xuICAgIC8qKlxuICAgICAqIEBkZXByZWNhdGVkXG4gICAgICogVGhpcyBtZXRob2Qgd2lsbCBiZSByZW1vdmVkIGluIGEgZnV0dXJlIHZlcnNpb24gd2l0aG91dCByZXBsYWNlbWVudC5cbiAgICAgKi9cbiAgICBlbmNvZGUgOiBmdW5jdGlvbihpbnB1dCkge1xuICAgICAgICByZXR1cm4gYmFzZTY0LmVuY29kZShpbnB1dCk7XG4gICAgfSxcbiAgICAvKipcbiAgICAgKiBAZGVwcmVjYXRlZFxuICAgICAqIFRoaXMgbWV0aG9kIHdpbGwgYmUgcmVtb3ZlZCBpbiBhIGZ1dHVyZSB2ZXJzaW9uIHdpdGhvdXQgcmVwbGFjZW1lbnQuXG4gICAgICovXG4gICAgZGVjb2RlIDogZnVuY3Rpb24oaW5wdXQpIHtcbiAgICAgICAgcmV0dXJuIGJhc2U2NC5kZWNvZGUoaW5wdXQpO1xuICAgIH1cbn07XG5KU1ppcFN5bmMuY29tcHJlc3Npb25zID0gX2RlcmVxXygnLi9jb21wcmVzc2lvbnMnKTtcbm1vZHVsZS5leHBvcnRzID0gSlNaaXBTeW5jO1xuXG59LHtcIi4vYmFzZTY0XCI6MSxcIi4vY29tcHJlc3Npb25zXCI6MyxcIi4vZGVmYXVsdHNcIjo2LFwiLi9kZXByZWNhdGVkUHVibGljVXRpbHNcIjo3LFwiLi9sb2FkXCI6MTAsXCIuL29iamVjdFwiOjEzLFwiLi9zdXBwb3J0XCI6MTd9XSwxMDpbZnVuY3Rpb24oX2RlcmVxXyxtb2R1bGUsZXhwb3J0cyl7XG4ndXNlIHN0cmljdCc7XG52YXIgYmFzZTY0ID0gX2RlcmVxXygnLi9iYXNlNjQnKTtcbnZhciBaaXBFbnRyaWVzID0gX2RlcmVxXygnLi96aXBFbnRyaWVzJyk7XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKGRhdGEsIG9wdGlvbnMpIHtcbiAgICB2YXIgZmlsZXMsIHppcEVudHJpZXMsIGksIGlucHV0O1xuICAgIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9O1xuICAgIGlmIChvcHRpb25zLmJhc2U2NCkge1xuICAgICAgICBkYXRhID0gYmFzZTY0LmRlY29kZShkYXRhKTtcbiAgICB9XG5cbiAgICB6aXBFbnRyaWVzID0gbmV3IFppcEVudHJpZXMoZGF0YSwgb3B0aW9ucyk7XG4gICAgZmlsZXMgPSB6aXBFbnRyaWVzLmZpbGVzO1xuICAgIGZvciAoaSA9IDA7IGkgPCBmaWxlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICBpbnB1dCA9IGZpbGVzW2ldO1xuICAgICAgICB0aGlzLmZpbGUoaW5wdXQuZmlsZU5hbWUsIGlucHV0LmRlY29tcHJlc3NlZCwge1xuICAgICAgICAgICAgYmluYXJ5OiB0cnVlLFxuICAgICAgICAgICAgb3B0aW1pemVkQmluYXJ5U3RyaW5nOiB0cnVlLFxuICAgICAgICAgICAgZGF0ZTogaW5wdXQuZGF0ZSxcbiAgICAgICAgICAgIGRpcjogaW5wdXQuZGlyLFxuICAgICAgICAgICAgY29tbWVudCA6IGlucHV0LmZpbGVDb21tZW50Lmxlbmd0aCA/IGlucHV0LmZpbGVDb21tZW50IDogbnVsbCxcbiAgICAgICAgICAgIGNyZWF0ZUZvbGRlcnM6IG9wdGlvbnMuY3JlYXRlRm9sZGVyc1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgaWYgKHppcEVudHJpZXMuemlwQ29tbWVudC5sZW5ndGgpIHtcbiAgICAgICAgdGhpcy5jb21tZW50ID0gemlwRW50cmllcy56aXBDb21tZW50O1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzO1xufTtcblxufSx7XCIuL2Jhc2U2NFwiOjEsXCIuL3ppcEVudHJpZXNcIjoyMn1dLDExOltmdW5jdGlvbihfZGVyZXFfLG1vZHVsZSxleHBvcnRzKXtcbihmdW5jdGlvbiAoQnVmZmVyKXtcbid1c2Ugc3RyaWN0JztcbnZhciBCdWZmZXJfZnJvbSA9IC8qOjooKi9mdW5jdGlvbigpe30vKjo6IDphbnkpKi87XG5pZih0eXBlb2YgQnVmZmVyICE9PSAndW5kZWZpbmVkJykge1xuXHR2YXIgbmJmcyA9ICFCdWZmZXIuZnJvbTtcblx0aWYoIW5iZnMpIHRyeSB7IEJ1ZmZlci5mcm9tKFwiZm9vXCIsIFwidXRmOFwiKTsgfSBjYXRjaChlKSB7IG5iZnMgPSB0cnVlOyB9XG5cdEJ1ZmZlcl9mcm9tID0gbmJmcyA/IGZ1bmN0aW9uKGJ1ZiwgZW5jKSB7IHJldHVybiAoZW5jKSA/IG5ldyBCdWZmZXIoYnVmLCBlbmMpIDogbmV3IEJ1ZmZlcihidWYpOyB9IDogQnVmZmVyLmZyb20uYmluZChCdWZmZXIpO1xuXHQvLyAkRmxvd0lnbm9yZVxuXHRpZighQnVmZmVyLmFsbG9jKSBCdWZmZXIuYWxsb2MgPSBmdW5jdGlvbihuKSB7IHJldHVybiBuZXcgQnVmZmVyKG4pOyB9O1xufVxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbihkYXRhLCBlbmNvZGluZyl7XG4gICAgcmV0dXJuIHR5cGVvZiBkYXRhID09ICdudW1iZXInID8gQnVmZmVyLmFsbG9jKGRhdGEpIDogQnVmZmVyX2Zyb20oZGF0YSwgZW5jb2RpbmcpO1xufTtcbm1vZHVsZS5leHBvcnRzLnRlc3QgPSBmdW5jdGlvbihiKXtcbiAgICByZXR1cm4gQnVmZmVyLmlzQnVmZmVyKGIpO1xufTtcbn0pLmNhbGwodGhpcywodHlwZW9mIEJ1ZmZlciAhPT0gXCJ1bmRlZmluZWRcIiA/IEJ1ZmZlciA6IHVuZGVmaW5lZCkpXG59LHt9XSwxMjpbZnVuY3Rpb24oX2RlcmVxXyxtb2R1bGUsZXhwb3J0cyl7XG4ndXNlIHN0cmljdCc7XG52YXIgVWludDhBcnJheVJlYWRlciA9IF9kZXJlcV8oJy4vdWludDhBcnJheVJlYWRlcicpO1xuXG5mdW5jdGlvbiBOb2RlQnVmZmVyUmVhZGVyKGRhdGEpIHtcbiAgICB0aGlzLmRhdGEgPSBkYXRhO1xuICAgIHRoaXMubGVuZ3RoID0gdGhpcy5kYXRhLmxlbmd0aDtcbiAgICB0aGlzLmluZGV4ID0gMDtcbn1cbk5vZGVCdWZmZXJSZWFkZXIucHJvdG90eXBlID0gbmV3IFVpbnQ4QXJyYXlSZWFkZXIoKTtcblxuLyoqXG4gKiBAc2VlIERhdGFSZWFkZXIucmVhZERhdGFcbiAqL1xuTm9kZUJ1ZmZlclJlYWRlci5wcm90b3R5cGUucmVhZERhdGEgPSBmdW5jdGlvbihzaXplKSB7XG4gICAgdGhpcy5jaGVja09mZnNldChzaXplKTtcbiAgICB2YXIgcmVzdWx0ID0gdGhpcy5kYXRhLnNsaWNlKHRoaXMuaW5kZXgsIHRoaXMuaW5kZXggKyBzaXplKTtcbiAgICB0aGlzLmluZGV4ICs9IHNpemU7XG4gICAgcmV0dXJuIHJlc3VsdDtcbn07XG5tb2R1bGUuZXhwb3J0cyA9IE5vZGVCdWZmZXJSZWFkZXI7XG5cbn0se1wiLi91aW50OEFycmF5UmVhZGVyXCI6MTh9XSwxMzpbZnVuY3Rpb24oX2RlcmVxXyxtb2R1bGUsZXhwb3J0cyl7XG4ndXNlIHN0cmljdCc7XG52YXIgc3VwcG9ydCA9IF9kZXJlcV8oJy4vc3VwcG9ydCcpO1xudmFyIHV0aWxzID0gX2RlcmVxXygnLi91dGlscycpO1xudmFyIGNyYzMyID0gX2RlcmVxXygnLi9jcmMzMicpO1xudmFyIHNpZ25hdHVyZSA9IF9kZXJlcV8oJy4vc2lnbmF0dXJlJyk7XG52YXIgZGVmYXVsdHMgPSBfZGVyZXFfKCcuL2RlZmF1bHRzJyk7XG52YXIgYmFzZTY0ID0gX2RlcmVxXygnLi9iYXNlNjQnKTtcbnZhciBjb21wcmVzc2lvbnMgPSBfZGVyZXFfKCcuL2NvbXByZXNzaW9ucycpO1xudmFyIENvbXByZXNzZWRPYmplY3QgPSBfZGVyZXFfKCcuL2NvbXByZXNzZWRPYmplY3QnKTtcbnZhciBub2RlQnVmZmVyID0gX2RlcmVxXygnLi9ub2RlQnVmZmVyJyk7XG52YXIgdXRmOCA9IF9kZXJlcV8oJy4vdXRmOCcpO1xudmFyIFN0cmluZ1dyaXRlciA9IF9kZXJlcV8oJy4vc3RyaW5nV3JpdGVyJyk7XG52YXIgVWludDhBcnJheVdyaXRlciA9IF9kZXJlcV8oJy4vdWludDhBcnJheVdyaXRlcicpO1xuXG4vKipcbiAqIFJldHVybnMgdGhlIHJhdyBkYXRhIG9mIGEgWmlwT2JqZWN0LCBkZWNvbXByZXNzIHRoZSBjb250ZW50IGlmIG5lY2Vzc2FyeS5cbiAqIEBwYXJhbSB7WmlwT2JqZWN0fSBmaWxlIHRoZSBmaWxlIHRvIHVzZS5cbiAqIEByZXR1cm4ge1N0cmluZ3xBcnJheUJ1ZmZlcnxVaW50OEFycmF5fEJ1ZmZlcn0gdGhlIGRhdGEuXG4gKi9cbnZhciBnZXRSYXdEYXRhID0gZnVuY3Rpb24oZmlsZSkge1xuICAgIGlmIChmaWxlLl9kYXRhIGluc3RhbmNlb2YgQ29tcHJlc3NlZE9iamVjdCkge1xuICAgICAgICBmaWxlLl9kYXRhID0gZmlsZS5fZGF0YS5nZXRDb250ZW50KCk7XG4gICAgICAgIGZpbGUub3B0aW9ucy5iaW5hcnkgPSB0cnVlO1xuICAgICAgICBmaWxlLm9wdGlvbnMuYmFzZTY0ID0gZmFsc2U7XG5cbiAgICAgICAgaWYgKHV0aWxzLmdldFR5cGVPZihmaWxlLl9kYXRhKSA9PT0gXCJ1aW50OGFycmF5XCIpIHtcbiAgICAgICAgICAgIHZhciBjb3B5ID0gZmlsZS5fZGF0YTtcbiAgICAgICAgICAgIC8vIHdoZW4gcmVhZGluZyBhbiBhcnJheWJ1ZmZlciwgdGhlIENvbXByZXNzZWRPYmplY3QgbWVjaGFuaXNtIHdpbGwga2VlcCBpdCBhbmQgc3ViYXJyYXkoKSBhIFVpbnQ4QXJyYXkuXG4gICAgICAgICAgICAvLyBpZiB3ZSByZXF1ZXN0IGEgZmlsZSBpbiB0aGUgc2FtZSBmb3JtYXQsIHdlIG1pZ2h0IGdldCB0aGUgc2FtZSBVaW50OEFycmF5IG9yIGl0cyBBcnJheUJ1ZmZlciAodGhlIG9yaWdpbmFsIHppcCBmaWxlKS5cbiAgICAgICAgICAgIGZpbGUuX2RhdGEgPSBuZXcgVWludDhBcnJheShjb3B5Lmxlbmd0aCk7XG4gICAgICAgICAgICAvLyB3aXRoIGFuIGVtcHR5IFVpbnQ4QXJyYXksIE9wZXJhIGZhaWxzIHdpdGggYSBcIk9mZnNldCBsYXJnZXIgdGhhbiBhcnJheSBzaXplXCJcbiAgICAgICAgICAgIGlmIChjb3B5Lmxlbmd0aCAhPT0gMCkge1xuICAgICAgICAgICAgICAgIGZpbGUuX2RhdGEuc2V0KGNvcHksIDApO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBmaWxlLl9kYXRhO1xufTtcblxuLyoqXG4gKiBSZXR1cm5zIHRoZSBkYXRhIG9mIGEgWmlwT2JqZWN0IGluIGEgYmluYXJ5IGZvcm0uIElmIHRoZSBjb250ZW50IGlzIGFuIHVuaWNvZGUgc3RyaW5nLCBlbmNvZGUgaXQuXG4gKiBAcGFyYW0ge1ppcE9iamVjdH0gZmlsZSB0aGUgZmlsZSB0byB1c2UuXG4gKiBAcmV0dXJuIHtTdHJpbmd8QXJyYXlCdWZmZXJ8VWludDhBcnJheXxCdWZmZXJ9IHRoZSBkYXRhLlxuICovXG52YXIgZ2V0QmluYXJ5RGF0YSA9IGZ1bmN0aW9uKGZpbGUpIHtcbiAgICB2YXIgcmVzdWx0ID0gZ2V0UmF3RGF0YShmaWxlKSxcbiAgICAgICAgdHlwZSA9IHV0aWxzLmdldFR5cGVPZihyZXN1bHQpO1xuICAgIGlmICh0eXBlID09PSBcInN0cmluZ1wiKSB7XG4gICAgICAgIGlmICghZmlsZS5vcHRpb25zLmJpbmFyeSkge1xuICAgICAgICAgICAgLy8gdW5pY29kZSB0ZXh0ICFcbiAgICAgICAgICAgIC8vIHVuaWNvZGUgc3RyaW5nID0+IGJpbmFyeSBzdHJpbmcgaXMgYSBwYWluZnVsIHByb2Nlc3MsIGNoZWNrIGlmIHdlIGNhbiBhdm9pZCBpdC5cbiAgICAgICAgICAgIGlmIChzdXBwb3J0Lm5vZGVidWZmZXIpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbm9kZUJ1ZmZlcihyZXN1bHQsIFwidXRmLThcIik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZpbGUuYXNCaW5hcnkoKTtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbn07XG5cbi8qKlxuICogVHJhbnNmb3JtIHRoaXMuX2RhdGEgaW50byBhIHN0cmluZy5cbiAqIEBwYXJhbSB7ZnVuY3Rpb259IGZpbHRlciBhIGZ1bmN0aW9uIFN0cmluZyAtPiBTdHJpbmcsIGFwcGxpZWQgaWYgbm90IG51bGwgb24gdGhlIHJlc3VsdC5cbiAqIEByZXR1cm4ge1N0cmluZ30gdGhlIHN0cmluZyByZXByZXNlbnRpbmcgdGhpcy5fZGF0YS5cbiAqL1xudmFyIGRhdGFUb1N0cmluZyA9IGZ1bmN0aW9uKGFzVVRGOCkge1xuICAgIHZhciByZXN1bHQgPSBnZXRSYXdEYXRhKHRoaXMpO1xuICAgIGlmIChyZXN1bHQgPT09IG51bGwgfHwgdHlwZW9mIHJlc3VsdCA9PT0gXCJ1bmRlZmluZWRcIikge1xuICAgICAgICByZXR1cm4gXCJcIjtcbiAgICB9XG4gICAgLy8gaWYgdGhlIGRhdGEgaXMgYSBiYXNlNjQgc3RyaW5nLCB3ZSBkZWNvZGUgaXQgYmVmb3JlIGNoZWNraW5nIHRoZSBlbmNvZGluZyAhXG4gICAgaWYgKHRoaXMub3B0aW9ucy5iYXNlNjQpIHtcbiAgICAgICAgcmVzdWx0ID0gYmFzZTY0LmRlY29kZShyZXN1bHQpO1xuICAgIH1cbiAgICBpZiAoYXNVVEY4ICYmIHRoaXMub3B0aW9ucy5iaW5hcnkpIHtcbiAgICAgICAgLy8gSlNaaXAucHJvdG90eXBlLnV0ZjhkZWNvZGUgc3VwcG9ydHMgYXJyYXlzIGFzIGlucHV0XG4gICAgICAgIC8vIHNraXAgdG8gYXJyYXkgPT4gc3RyaW5nIHN0ZXAsIHV0ZjhkZWNvZGUgd2lsbCBkbyBpdC5cbiAgICAgICAgcmVzdWx0ID0gb3V0LnV0ZjhkZWNvZGUocmVzdWx0KTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIC8vIG5vIHV0ZjggdHJhbnNmb3JtYXRpb24sIGRvIHRoZSBhcnJheSA9PiBzdHJpbmcgc3RlcC5cbiAgICAgICAgcmVzdWx0ID0gdXRpbHMudHJhbnNmb3JtVG8oXCJzdHJpbmdcIiwgcmVzdWx0KTtcbiAgICB9XG5cbiAgICBpZiAoIWFzVVRGOCAmJiAhdGhpcy5vcHRpb25zLmJpbmFyeSkge1xuICAgICAgICByZXN1bHQgPSB1dGlscy50cmFuc2Zvcm1UbyhcInN0cmluZ1wiLCBvdXQudXRmOGVuY29kZShyZXN1bHQpKTtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbn07XG4vKipcbiAqIEEgc2ltcGxlIG9iamVjdCByZXByZXNlbnRpbmcgYSBmaWxlIGluIHRoZSB6aXAgZmlsZS5cbiAqIEBjb25zdHJ1Y3RvclxuICogQHBhcmFtIHtzdHJpbmd9IG5hbWUgdGhlIG5hbWUgb2YgdGhlIGZpbGVcbiAqIEBwYXJhbSB7U3RyaW5nfEFycmF5QnVmZmVyfFVpbnQ4QXJyYXl8QnVmZmVyfSBkYXRhIHRoZSBkYXRhXG4gKiBAcGFyYW0ge09iamVjdH0gb3B0aW9ucyB0aGUgb3B0aW9ucyBvZiB0aGUgZmlsZVxuICovXG52YXIgWmlwT2JqZWN0ID0gZnVuY3Rpb24obmFtZSwgZGF0YSwgb3B0aW9ucykge1xuICAgIHRoaXMubmFtZSA9IG5hbWU7XG4gICAgdGhpcy5kaXIgPSBvcHRpb25zLmRpcjtcbiAgICB0aGlzLmRhdGUgPSBvcHRpb25zLmRhdGU7XG4gICAgdGhpcy5jb21tZW50ID0gb3B0aW9ucy5jb21tZW50O1xuXG4gICAgdGhpcy5fZGF0YSA9IGRhdGE7XG4gICAgdGhpcy5vcHRpb25zID0gb3B0aW9ucztcblxuICAgIC8qXG4gICAgICogVGhpcyBvYmplY3QgY29udGFpbnMgaW5pdGlhbCB2YWx1ZXMgZm9yIGRpciBhbmQgZGF0ZS5cbiAgICAgKiBXaXRoIHRoZW0sIHdlIGNhbiBjaGVjayBpZiB0aGUgdXNlciBjaGFuZ2VkIHRoZSBkZXByZWNhdGVkIG1ldGFkYXRhIGluXG4gICAgICogYFppcE9iamVjdCNvcHRpb25zYCBvciBub3QuXG4gICAgICovXG4gICAgdGhpcy5faW5pdGlhbE1ldGFkYXRhID0ge1xuICAgICAgZGlyIDogb3B0aW9ucy5kaXIsXG4gICAgICBkYXRlIDogb3B0aW9ucy5kYXRlXG4gICAgfTtcbn07XG5cblppcE9iamVjdC5wcm90b3R5cGUgPSB7XG4gICAgLyoqXG4gICAgICogUmV0dXJuIHRoZSBjb250ZW50IGFzIFVURjggc3RyaW5nLlxuICAgICAqIEByZXR1cm4ge3N0cmluZ30gdGhlIFVURjggc3RyaW5nLlxuICAgICAqL1xuICAgIGFzVGV4dDogZnVuY3Rpb24oKSB7XG4gICAgICAgIHJldHVybiBkYXRhVG9TdHJpbmcuY2FsbCh0aGlzLCB0cnVlKTtcbiAgICB9LFxuICAgIC8qKlxuICAgICAqIFJldHVybnMgdGhlIGJpbmFyeSBjb250ZW50LlxuICAgICAqIEByZXR1cm4ge3N0cmluZ30gdGhlIGNvbnRlbnQgYXMgYmluYXJ5LlxuICAgICAqL1xuICAgIGFzQmluYXJ5OiBmdW5jdGlvbigpIHtcbiAgICAgICAgcmV0dXJuIGRhdGFUb1N0cmluZy5jYWxsKHRoaXMsIGZhbHNlKTtcbiAgICB9LFxuICAgIC8qKlxuICAgICAqIFJldHVybnMgdGhlIGNvbnRlbnQgYXMgYSBub2RlanMgQnVmZmVyLlxuICAgICAqIEByZXR1cm4ge0J1ZmZlcn0gdGhlIGNvbnRlbnQgYXMgYSBCdWZmZXIuXG4gICAgICovXG4gICAgYXNOb2RlQnVmZmVyOiBmdW5jdGlvbigpIHtcbiAgICAgICAgdmFyIHJlc3VsdCA9IGdldEJpbmFyeURhdGEodGhpcyk7XG4gICAgICAgIHJldHVybiB1dGlscy50cmFuc2Zvcm1UbyhcIm5vZGVidWZmZXJcIiwgcmVzdWx0KTtcbiAgICB9LFxuICAgIC8qKlxuICAgICAqIFJldHVybnMgdGhlIGNvbnRlbnQgYXMgYW4gVWludDhBcnJheS5cbiAgICAgKiBAcmV0dXJuIHtVaW50OEFycmF5fSB0aGUgY29udGVudCBhcyBhbiBVaW50OEFycmF5LlxuICAgICAqL1xuICAgIGFzVWludDhBcnJheTogZnVuY3Rpb24oKSB7XG4gICAgICAgIHZhciByZXN1bHQgPSBnZXRCaW5hcnlEYXRhKHRoaXMpO1xuICAgICAgICByZXR1cm4gdXRpbHMudHJhbnNmb3JtVG8oXCJ1aW50OGFycmF5XCIsIHJlc3VsdCk7XG4gICAgfSxcbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRoZSBjb250ZW50IGFzIGFuIEFycmF5QnVmZmVyLlxuICAgICAqIEByZXR1cm4ge0FycmF5QnVmZmVyfSB0aGUgY29udGVudCBhcyBhbiBBcnJheUJ1ZmVyLlxuICAgICAqL1xuICAgIGFzQXJyYXlCdWZmZXI6IGZ1bmN0aW9uKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5hc1VpbnQ4QXJyYXkoKS5idWZmZXI7XG4gICAgfVxufTtcblxuLyoqXG4gKiBUcmFuc2Zvcm0gYW4gaW50ZWdlciBpbnRvIGEgc3RyaW5nIGluIGhleGFkZWNpbWFsLlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7bnVtYmVyfSBkZWMgdGhlIG51bWJlciB0byBjb252ZXJ0LlxuICogQHBhcmFtIHtudW1iZXJ9IGJ5dGVzIHRoZSBudW1iZXIgb2YgYnl0ZXMgdG8gZ2VuZXJhdGUuXG4gKiBAcmV0dXJucyB7c3RyaW5nfSB0aGUgcmVzdWx0LlxuICovXG52YXIgZGVjVG9IZXggPSBmdW5jdGlvbihkZWMsIGJ5dGVzKSB7XG4gICAgdmFyIGhleCA9IFwiXCIsXG4gICAgICAgIGk7XG4gICAgZm9yIChpID0gMDsgaSA8IGJ5dGVzOyBpKyspIHtcbiAgICAgICAgaGV4ICs9IFN0cmluZy5mcm9tQ2hhckNvZGUoZGVjICYgMHhmZik7XG4gICAgICAgIGRlYyA9IGRlYyA+Pj4gODtcbiAgICB9XG4gICAgcmV0dXJuIGhleDtcbn07XG5cbi8qKlxuICogTWVyZ2UgdGhlIG9iamVjdHMgcGFzc2VkIGFzIHBhcmFtZXRlcnMgaW50byBhIG5ldyBvbmUuXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHsuLi5PYmplY3R9IHZhcl9hcmdzIEFsbCBvYmplY3RzIHRvIG1lcmdlLlxuICogQHJldHVybiB7T2JqZWN0fSBhIG5ldyBvYmplY3Qgd2l0aCB0aGUgZGF0YSBvZiB0aGUgb3RoZXJzLlxuICovXG52YXIgZXh0ZW5kID0gZnVuY3Rpb24oKSB7XG4gICAgdmFyIHJlc3VsdCA9IHt9LCBpLCBhdHRyO1xuICAgIGZvciAoaSA9IDA7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspIHsgLy8gYXJndW1lbnRzIGlzIG5vdCBlbnVtZXJhYmxlIGluIHNvbWUgYnJvd3NlcnNcbiAgICAgICAgZm9yIChhdHRyIGluIGFyZ3VtZW50c1tpXSkge1xuICAgICAgICAgICAgaWYgKGFyZ3VtZW50c1tpXS5oYXNPd25Qcm9wZXJ0eShhdHRyKSAmJiB0eXBlb2YgcmVzdWx0W2F0dHJdID09PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgICAgICAgICAgICAgcmVzdWx0W2F0dHJdID0gYXJndW1lbnRzW2ldW2F0dHJdO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG59O1xuXG4vKipcbiAqIFRyYW5zZm9ybXMgdGhlIChpbmNvbXBsZXRlKSBvcHRpb25zIGZyb20gdGhlIHVzZXIgaW50byB0aGUgY29tcGxldGVcbiAqIHNldCBvZiBvcHRpb25zIHRvIGNyZWF0ZSBhIGZpbGUuXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtPYmplY3R9IG8gdGhlIG9wdGlvbnMgZnJvbSB0aGUgdXNlci5cbiAqIEByZXR1cm4ge09iamVjdH0gdGhlIGNvbXBsZXRlIHNldCBvZiBvcHRpb25zLlxuICovXG52YXIgcHJlcGFyZUZpbGVBdHRycyA9IGZ1bmN0aW9uKG8pIHtcbiAgICBvID0gbyB8fCB7fTtcbiAgICBpZiAoby5iYXNlNjQgPT09IHRydWUgJiYgKG8uYmluYXJ5ID09PSBudWxsIHx8IG8uYmluYXJ5ID09PSB1bmRlZmluZWQpKSB7XG4gICAgICAgIG8uYmluYXJ5ID0gdHJ1ZTtcbiAgICB9XG4gICAgbyA9IGV4dGVuZChvLCBkZWZhdWx0cyk7XG4gICAgby5kYXRlID0gby5kYXRlIHx8IG5ldyBEYXRlKCk7XG4gICAgaWYgKG8uY29tcHJlc3Npb24gIT09IG51bGwpIG8uY29tcHJlc3Npb24gPSBvLmNvbXByZXNzaW9uLnRvVXBwZXJDYXNlKCk7XG5cbiAgICByZXR1cm4gbztcbn07XG5cbi8qKlxuICogQWRkIGEgZmlsZSBpbiB0aGUgY3VycmVudCBmb2xkZXIuXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtzdHJpbmd9IG5hbWUgdGhlIG5hbWUgb2YgdGhlIGZpbGVcbiAqIEBwYXJhbSB7U3RyaW5nfEFycmF5QnVmZmVyfFVpbnQ4QXJyYXl8QnVmZmVyfSBkYXRhIHRoZSBkYXRhIG9mIHRoZSBmaWxlXG4gKiBAcGFyYW0ge09iamVjdH0gbyB0aGUgb3B0aW9ucyBvZiB0aGUgZmlsZVxuICogQHJldHVybiB7T2JqZWN0fSB0aGUgbmV3IGZpbGUuXG4gKi9cbnZhciBmaWxlQWRkID0gZnVuY3Rpb24obmFtZSwgZGF0YSwgbykge1xuICAgIC8vIGJlIHN1cmUgc3ViIGZvbGRlcnMgZXhpc3RcbiAgICB2YXIgZGF0YVR5cGUgPSB1dGlscy5nZXRUeXBlT2YoZGF0YSksXG4gICAgICAgIHBhcmVudDtcblxuICAgIG8gPSBwcmVwYXJlRmlsZUF0dHJzKG8pO1xuXG4gICAgaWYgKG8uY3JlYXRlRm9sZGVycyAmJiAocGFyZW50ID0gcGFyZW50Rm9sZGVyKG5hbWUpKSkge1xuICAgICAgICBmb2xkZXJBZGQuY2FsbCh0aGlzLCBwYXJlbnQsIHRydWUpO1xuICAgIH1cblxuICAgIGlmIChvLmRpciB8fCBkYXRhID09PSBudWxsIHx8IHR5cGVvZiBkYXRhID09PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgICAgIG8uYmFzZTY0ID0gZmFsc2U7XG4gICAgICAgIG8uYmluYXJ5ID0gZmFsc2U7XG4gICAgICAgIGRhdGEgPSBudWxsO1xuICAgIH1cbiAgICBlbHNlIGlmIChkYXRhVHlwZSA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgICBpZiAoby5iaW5hcnkgJiYgIW8uYmFzZTY0KSB7XG4gICAgICAgICAgICAvLyBvcHRpbWl6ZWRCaW5hcnlTdHJpbmcgPT0gdHJ1ZSBtZWFucyB0aGF0IHRoZSBmaWxlIGhhcyBhbHJlYWR5IGJlZW4gZmlsdGVyZWQgd2l0aCBhIDB4RkYgbWFza1xuICAgICAgICAgICAgaWYgKG8ub3B0aW1pemVkQmluYXJ5U3RyaW5nICE9PSB0cnVlKSB7XG4gICAgICAgICAgICAgICAgLy8gdGhpcyBpcyBhIHN0cmluZywgbm90IGluIGEgYmFzZTY0IGZvcm1hdC5cbiAgICAgICAgICAgICAgICAvLyBCZSBzdXJlIHRoYXQgdGhpcyBpcyBhIGNvcnJlY3QgXCJiaW5hcnkgc3RyaW5nXCJcbiAgICAgICAgICAgICAgICBkYXRhID0gdXRpbHMuc3RyaW5nMmJpbmFyeShkYXRhKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICBlbHNlIHsgLy8gYXJyYXlidWZmZXIsIHVpbnQ4YXJyYXksIC4uLlxuICAgICAgICBvLmJhc2U2NCA9IGZhbHNlO1xuICAgICAgICBvLmJpbmFyeSA9IHRydWU7XG5cbiAgICAgICAgaWYgKCFkYXRhVHlwZSAmJiAhKGRhdGEgaW5zdGFuY2VvZiBDb21wcmVzc2VkT2JqZWN0KSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiVGhlIGRhdGEgb2YgJ1wiICsgbmFtZSArIFwiJyBpcyBpbiBhbiB1bnN1cHBvcnRlZCBmb3JtYXQgIVwiKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIHNwZWNpYWwgY2FzZSA6IGl0J3Mgd2F5IGVhc2llciB0byB3b3JrIHdpdGggVWludDhBcnJheSB0aGFuIHdpdGggQXJyYXlCdWZmZXJcbiAgICAgICAgaWYgKGRhdGFUeXBlID09PSBcImFycmF5YnVmZmVyXCIpIHtcbiAgICAgICAgICAgIGRhdGEgPSB1dGlscy50cmFuc2Zvcm1UbyhcInVpbnQ4YXJyYXlcIiwgZGF0YSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICB2YXIgb2JqZWN0ID0gbmV3IFppcE9iamVjdChuYW1lLCBkYXRhLCBvKTtcbiAgICB0aGlzLmZpbGVzW25hbWVdID0gb2JqZWN0O1xuICAgIHJldHVybiBvYmplY3Q7XG59O1xuXG4vKipcbiAqIEZpbmQgdGhlIHBhcmVudCBmb2xkZXIgb2YgdGhlIHBhdGguXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtzdHJpbmd9IHBhdGggdGhlIHBhdGggdG8gdXNlXG4gKiBAcmV0dXJuIHtzdHJpbmd9IHRoZSBwYXJlbnQgZm9sZGVyLCBvciBcIlwiXG4gKi9cbnZhciBwYXJlbnRGb2xkZXIgPSBmdW5jdGlvbiAocGF0aCkge1xuICAgIGlmIChwYXRoLnNsaWNlKC0xKSA9PSAnLycpIHtcbiAgICAgICAgcGF0aCA9IHBhdGguc3Vic3RyaW5nKDAsIHBhdGgubGVuZ3RoIC0gMSk7XG4gICAgfVxuICAgIHZhciBsYXN0U2xhc2ggPSBwYXRoLmxhc3RJbmRleE9mKCcvJyk7XG4gICAgcmV0dXJuIChsYXN0U2xhc2ggPiAwKSA/IHBhdGguc3Vic3RyaW5nKDAsIGxhc3RTbGFzaCkgOiBcIlwiO1xufTtcblxuLyoqXG4gKiBBZGQgYSAoc3ViKSBmb2xkZXIgaW4gdGhlIGN1cnJlbnQgZm9sZGVyLlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lIHRoZSBmb2xkZXIncyBuYW1lXG4gKiBAcGFyYW0ge2Jvb2xlYW49fSBbY3JlYXRlRm9sZGVyc10gSWYgdHJ1ZSwgYXV0b21hdGljYWxseSBjcmVhdGUgc3ViXG4gKiAgZm9sZGVycy4gRGVmYXVsdHMgdG8gZmFsc2UuXG4gKiBAcmV0dXJuIHtPYmplY3R9IHRoZSBuZXcgZm9sZGVyLlxuICovXG52YXIgZm9sZGVyQWRkID0gZnVuY3Rpb24obmFtZSwgY3JlYXRlRm9sZGVycykge1xuICAgIC8vIENoZWNrIHRoZSBuYW1lIGVuZHMgd2l0aCBhIC9cbiAgICBpZiAobmFtZS5zbGljZSgtMSkgIT0gXCIvXCIpIHtcbiAgICAgICAgbmFtZSArPSBcIi9cIjsgLy8gSUUgZG9lc24ndCBsaWtlIHN1YnN0cigtMSlcbiAgICB9XG5cbiAgICBjcmVhdGVGb2xkZXJzID0gKHR5cGVvZiBjcmVhdGVGb2xkZXJzICE9PSAndW5kZWZpbmVkJykgPyBjcmVhdGVGb2xkZXJzIDogZmFsc2U7XG5cbiAgICAvLyBEb2VzIHRoaXMgZm9sZGVyIGFscmVhZHkgZXhpc3Q/XG4gICAgaWYgKCF0aGlzLmZpbGVzW25hbWVdKSB7XG4gICAgICAgIGZpbGVBZGQuY2FsbCh0aGlzLCBuYW1lLCBudWxsLCB7XG4gICAgICAgICAgICBkaXI6IHRydWUsXG4gICAgICAgICAgICBjcmVhdGVGb2xkZXJzOiBjcmVhdGVGb2xkZXJzXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5maWxlc1tuYW1lXTtcbn07XG5cbi8qKlxuICogR2VuZXJhdGUgYSBKU1ppcC5Db21wcmVzc2VkT2JqZWN0IGZvciBhIGdpdmVuIHppcE9qZWN0LlxuICogQHBhcmFtIHtaaXBPYmplY3R9IGZpbGUgdGhlIG9iamVjdCB0byByZWFkLlxuICogQHBhcmFtIHtKU1ppcC5jb21wcmVzc2lvbn0gY29tcHJlc3Npb24gdGhlIGNvbXByZXNzaW9uIHRvIHVzZS5cbiAqIEByZXR1cm4ge0pTWmlwLkNvbXByZXNzZWRPYmplY3R9IHRoZSBjb21wcmVzc2VkIHJlc3VsdC5cbiAqL1xudmFyIGdlbmVyYXRlQ29tcHJlc3NlZE9iamVjdEZyb20gPSBmdW5jdGlvbihmaWxlLCBjb21wcmVzc2lvbikge1xuICAgIHZhciByZXN1bHQgPSBuZXcgQ29tcHJlc3NlZE9iamVjdCgpLFxuICAgICAgICBjb250ZW50O1xuXG4gICAgLy8gdGhlIGRhdGEgaGFzIG5vdCBiZWVuIGRlY29tcHJlc3NlZCwgd2UgbWlnaHQgcmV1c2UgdGhpbmdzICFcbiAgICBpZiAoZmlsZS5fZGF0YSBpbnN0YW5jZW9mIENvbXByZXNzZWRPYmplY3QpIHtcbiAgICAgICAgcmVzdWx0LnVuY29tcHJlc3NlZFNpemUgPSBmaWxlLl9kYXRhLnVuY29tcHJlc3NlZFNpemU7XG4gICAgICAgIHJlc3VsdC5jcmMzMiA9IGZpbGUuX2RhdGEuY3JjMzI7XG5cbiAgICAgICAgaWYgKHJlc3VsdC51bmNvbXByZXNzZWRTaXplID09PSAwIHx8IGZpbGUuZGlyKSB7XG4gICAgICAgICAgICBjb21wcmVzc2lvbiA9IGNvbXByZXNzaW9uc1snU1RPUkUnXTtcbiAgICAgICAgICAgIHJlc3VsdC5jb21wcmVzc2VkQ29udGVudCA9IFwiXCI7XG4gICAgICAgICAgICByZXN1bHQuY3JjMzIgPSAwO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGZpbGUuX2RhdGEuY29tcHJlc3Npb25NZXRob2QgPT09IGNvbXByZXNzaW9uLm1hZ2ljKSB7XG4gICAgICAgICAgICByZXN1bHQuY29tcHJlc3NlZENvbnRlbnQgPSBmaWxlLl9kYXRhLmdldENvbXByZXNzZWRDb250ZW50KCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBjb250ZW50ID0gZmlsZS5fZGF0YS5nZXRDb250ZW50KCk7XG4gICAgICAgICAgICAvLyBuZWVkIHRvIGRlY29tcHJlc3MgLyByZWNvbXByZXNzXG4gICAgICAgICAgICByZXN1bHQuY29tcHJlc3NlZENvbnRlbnQgPSBjb21wcmVzc2lvbi5jb21wcmVzcyh1dGlscy50cmFuc2Zvcm1Ubyhjb21wcmVzc2lvbi5jb21wcmVzc0lucHV0VHlwZSwgY29udGVudCkpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICAvLyBoYXZlIHVuY29tcHJlc3NlZCBkYXRhXG4gICAgICAgIGNvbnRlbnQgPSBnZXRCaW5hcnlEYXRhKGZpbGUpO1xuICAgICAgICBpZiAoIWNvbnRlbnQgfHwgY29udGVudC5sZW5ndGggPT09IDAgfHwgZmlsZS5kaXIpIHtcbiAgICAgICAgICAgIGNvbXByZXNzaW9uID0gY29tcHJlc3Npb25zWydTVE9SRSddO1xuICAgICAgICAgICAgY29udGVudCA9IFwiXCI7XG4gICAgICAgIH1cbiAgICAgICAgcmVzdWx0LnVuY29tcHJlc3NlZFNpemUgPSBjb250ZW50Lmxlbmd0aDtcbiAgICAgICAgcmVzdWx0LmNyYzMyID0gY3JjMzIoY29udGVudCk7XG4gICAgICAgIHJlc3VsdC5jb21wcmVzc2VkQ29udGVudCA9IGNvbXByZXNzaW9uLmNvbXByZXNzKHV0aWxzLnRyYW5zZm9ybVRvKGNvbXByZXNzaW9uLmNvbXByZXNzSW5wdXRUeXBlLCBjb250ZW50KSk7XG4gICAgfVxuXG4gICAgcmVzdWx0LmNvbXByZXNzZWRTaXplID0gcmVzdWx0LmNvbXByZXNzZWRDb250ZW50Lmxlbmd0aDtcbiAgICByZXN1bHQuY29tcHJlc3Npb25NZXRob2QgPSBjb21wcmVzc2lvbi5tYWdpYztcblxuICAgIHJldHVybiByZXN1bHQ7XG59O1xuXG4vKipcbiAqIEdlbmVyYXRlIHRoZSB2YXJpb3VzIHBhcnRzIHVzZWQgaW4gdGhlIGNvbnN0cnVjdGlvbiBvZiB0aGUgZmluYWwgemlwIGZpbGUuXG4gKiBAcGFyYW0ge3N0cmluZ30gbmFtZSB0aGUgZmlsZSBuYW1lLlxuICogQHBhcmFtIHtaaXBPYmplY3R9IGZpbGUgdGhlIGZpbGUgY29udGVudC5cbiAqIEBwYXJhbSB7SlNaaXAuQ29tcHJlc3NlZE9iamVjdH0gY29tcHJlc3NlZE9iamVjdCB0aGUgY29tcHJlc3NlZCBvYmplY3QuXG4gKiBAcGFyYW0ge251bWJlcn0gb2Zmc2V0IHRoZSBjdXJyZW50IG9mZnNldCBmcm9tIHRoZSBzdGFydCBvZiB0aGUgemlwIGZpbGUuXG4gKiBAcmV0dXJuIHtvYmplY3R9IHRoZSB6aXAgcGFydHMuXG4gKi9cbnZhciBnZW5lcmF0ZVppcFBhcnRzID0gZnVuY3Rpb24obmFtZSwgZmlsZSwgY29tcHJlc3NlZE9iamVjdCwgb2Zmc2V0KSB7XG4gICAgdmFyIGRhdGEgPSBjb21wcmVzc2VkT2JqZWN0LmNvbXByZXNzZWRDb250ZW50LFxuICAgICAgICB1dGZFbmNvZGVkRmlsZU5hbWUgPSB1dGlscy50cmFuc2Zvcm1UbyhcInN0cmluZ1wiLCB1dGY4LnV0ZjhlbmNvZGUoZmlsZS5uYW1lKSksXG4gICAgICAgIGNvbW1lbnQgPSBmaWxlLmNvbW1lbnQgfHwgXCJcIixcbiAgICAgICAgdXRmRW5jb2RlZENvbW1lbnQgPSB1dGlscy50cmFuc2Zvcm1UbyhcInN0cmluZ1wiLCB1dGY4LnV0ZjhlbmNvZGUoY29tbWVudCkpLFxuICAgICAgICB1c2VVVEY4Rm9yRmlsZU5hbWUgPSB1dGZFbmNvZGVkRmlsZU5hbWUubGVuZ3RoICE9PSBmaWxlLm5hbWUubGVuZ3RoLFxuICAgICAgICB1c2VVVEY4Rm9yQ29tbWVudCA9IHV0ZkVuY29kZWRDb21tZW50Lmxlbmd0aCAhPT0gY29tbWVudC5sZW5ndGgsXG4gICAgICAgIG8gPSBmaWxlLm9wdGlvbnMsXG4gICAgICAgIGRvc1RpbWUsXG4gICAgICAgIGRvc0RhdGUsXG4gICAgICAgIGV4dHJhRmllbGRzID0gXCJcIixcbiAgICAgICAgdW5pY29kZVBhdGhFeHRyYUZpZWxkID0gXCJcIixcbiAgICAgICAgdW5pY29kZUNvbW1lbnRFeHRyYUZpZWxkID0gXCJcIixcbiAgICAgICAgZGlyLCBkYXRlO1xuXG5cbiAgICAvLyBoYW5kbGUgdGhlIGRlcHJlY2F0ZWQgb3B0aW9ucy5kaXJcbiAgICBpZiAoZmlsZS5faW5pdGlhbE1ldGFkYXRhLmRpciAhPT0gZmlsZS5kaXIpIHtcbiAgICAgICAgZGlyID0gZmlsZS5kaXI7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgZGlyID0gby5kaXI7XG4gICAgfVxuXG4gICAgLy8gaGFuZGxlIHRoZSBkZXByZWNhdGVkIG9wdGlvbnMuZGF0ZVxuICAgIGlmKGZpbGUuX2luaXRpYWxNZXRhZGF0YS5kYXRlICE9PSBmaWxlLmRhdGUpIHtcbiAgICAgICAgZGF0ZSA9IGZpbGUuZGF0ZTtcbiAgICB9IGVsc2Uge1xuICAgICAgICBkYXRlID0gby5kYXRlO1xuICAgIH1cblxuXG4gICAgZG9zVGltZSA9IGRhdGUuZ2V0SG91cnMoKTtcbiAgICBkb3NUaW1lID0gZG9zVGltZSA8PCA2O1xuICAgIGRvc1RpbWUgPSBkb3NUaW1lIHwgZGF0ZS5nZXRNaW51dGVzKCk7XG4gICAgZG9zVGltZSA9IGRvc1RpbWUgPDwgNTtcbiAgICBkb3NUaW1lID0gZG9zVGltZSB8IGRhdGUuZ2V0U2Vjb25kcygpIC8gMjtcblxuICAgIGRvc0RhdGUgPSBkYXRlLmdldEZ1bGxZZWFyKCkgLSAxOTgwO1xuICAgIGRvc0RhdGUgPSBkb3NEYXRlIDw8IDQ7XG4gICAgZG9zRGF0ZSA9IGRvc0RhdGUgfCAoZGF0ZS5nZXRNb250aCgpICsgMSk7XG4gICAgZG9zRGF0ZSA9IGRvc0RhdGUgPDwgNTtcbiAgICBkb3NEYXRlID0gZG9zRGF0ZSB8IGRhdGUuZ2V0RGF0ZSgpO1xuXG4gICAgaWYgKHVzZVVURjhGb3JGaWxlTmFtZSkge1xuICAgICAgICAvLyBzZXQgdGhlIHVuaWNvZGUgcGF0aCBleHRyYSBmaWVsZC4gdW56aXAgbmVlZHMgYXQgbGVhc3Qgb25lIGV4dHJhXG4gICAgICAgIC8vIGZpZWxkIHRvIGNvcnJlY3RseSBoYW5kbGUgdW5pY29kZSBwYXRoLCBzbyB1c2luZyB0aGUgcGF0aCBpcyBhcyBnb29kXG4gICAgICAgIC8vIGFzIGFueSBvdGhlciBpbmZvcm1hdGlvbi4gVGhpcyBjb3VsZCBpbXByb3ZlIHRoZSBzaXR1YXRpb24gd2l0aFxuICAgICAgICAvLyBvdGhlciBhcmNoaXZlIG1hbmFnZXJzIHRvby5cbiAgICAgICAgLy8gVGhpcyBmaWVsZCBpcyB1c3VhbGx5IHVzZWQgd2l0aG91dCB0aGUgdXRmOCBmbGFnLCB3aXRoIGEgbm9uXG4gICAgICAgIC8vIHVuaWNvZGUgcGF0aCBpbiB0aGUgaGVhZGVyICh3aW5yYXIsIHdpbnppcCkuIFRoaXMgaGVscHMgKGEgYml0KVxuICAgICAgICAvLyB3aXRoIHRoZSBtZXNzeSBXaW5kb3dzJyBkZWZhdWx0IGNvbXByZXNzZWQgZm9sZGVycyBmZWF0dXJlIGJ1dFxuICAgICAgICAvLyBicmVha3Mgb24gcDd6aXAgd2hpY2ggZG9lc24ndCBzZWVrIHRoZSB1bmljb2RlIHBhdGggZXh0cmEgZmllbGQuXG4gICAgICAgIC8vIFNvIGZvciBub3csIFVURi04IGV2ZXJ5d2hlcmUgIVxuICAgICAgICB1bmljb2RlUGF0aEV4dHJhRmllbGQgPVxuICAgICAgICAgICAgLy8gVmVyc2lvblxuICAgICAgICAgICAgZGVjVG9IZXgoMSwgMSkgK1xuICAgICAgICAgICAgLy8gTmFtZUNSQzMyXG4gICAgICAgICAgICBkZWNUb0hleChjcmMzMih1dGZFbmNvZGVkRmlsZU5hbWUpLCA0KSArXG4gICAgICAgICAgICAvLyBVbmljb2RlTmFtZVxuICAgICAgICAgICAgdXRmRW5jb2RlZEZpbGVOYW1lO1xuXG4gICAgICAgIGV4dHJhRmllbGRzICs9XG4gICAgICAgICAgICAvLyBJbmZvLVpJUCBVbmljb2RlIFBhdGggRXh0cmEgRmllbGRcbiAgICAgICAgICAgIFwiXFx4NzVcXHg3MFwiICtcbiAgICAgICAgICAgIC8vIHNpemVcbiAgICAgICAgICAgIGRlY1RvSGV4KHVuaWNvZGVQYXRoRXh0cmFGaWVsZC5sZW5ndGgsIDIpICtcbiAgICAgICAgICAgIC8vIGNvbnRlbnRcbiAgICAgICAgICAgIHVuaWNvZGVQYXRoRXh0cmFGaWVsZDtcbiAgICB9XG5cbiAgICBpZih1c2VVVEY4Rm9yQ29tbWVudCkge1xuXG4gICAgICAgIHVuaWNvZGVDb21tZW50RXh0cmFGaWVsZCA9XG4gICAgICAgICAgICAvLyBWZXJzaW9uXG4gICAgICAgICAgICBkZWNUb0hleCgxLCAxKSArXG4gICAgICAgICAgICAvLyBDb21tZW50Q1JDMzJcbiAgICAgICAgICAgIGRlY1RvSGV4KHRoaXMuY3JjMzIodXRmRW5jb2RlZENvbW1lbnQpLCA0KSArXG4gICAgICAgICAgICAvLyBVbmljb2RlTmFtZVxuICAgICAgICAgICAgdXRmRW5jb2RlZENvbW1lbnQ7XG5cbiAgICAgICAgZXh0cmFGaWVsZHMgKz1cbiAgICAgICAgICAgIC8vIEluZm8tWklQIFVuaWNvZGUgUGF0aCBFeHRyYSBGaWVsZFxuICAgICAgICAgICAgXCJcXHg3NVxceDYzXCIgK1xuICAgICAgICAgICAgLy8gc2l6ZVxuICAgICAgICAgICAgZGVjVG9IZXgodW5pY29kZUNvbW1lbnRFeHRyYUZpZWxkLmxlbmd0aCwgMikgK1xuICAgICAgICAgICAgLy8gY29udGVudFxuICAgICAgICAgICAgdW5pY29kZUNvbW1lbnRFeHRyYUZpZWxkO1xuICAgIH1cblxuICAgIHZhciBoZWFkZXIgPSBcIlwiO1xuXG4gICAgLy8gdmVyc2lvbiBuZWVkZWQgdG8gZXh0cmFjdFxuICAgIGhlYWRlciArPSBcIlxceDBBXFx4MDBcIjtcbiAgICAvLyBnZW5lcmFsIHB1cnBvc2UgYml0IGZsYWdcbiAgICAvLyBzZXQgYml0IDExIGlmIHV0ZjhcbiAgICBoZWFkZXIgKz0gKHVzZVVURjhGb3JGaWxlTmFtZSB8fCB1c2VVVEY4Rm9yQ29tbWVudCkgPyBcIlxceDAwXFx4MDhcIiA6IFwiXFx4MDBcXHgwMFwiO1xuICAgIC8vIGNvbXByZXNzaW9uIG1ldGhvZFxuICAgIGhlYWRlciArPSBjb21wcmVzc2VkT2JqZWN0LmNvbXByZXNzaW9uTWV0aG9kO1xuICAgIC8vIGxhc3QgbW9kIGZpbGUgdGltZVxuICAgIGhlYWRlciArPSBkZWNUb0hleChkb3NUaW1lLCAyKTtcbiAgICAvLyBsYXN0IG1vZCBmaWxlIGRhdGVcbiAgICBoZWFkZXIgKz0gZGVjVG9IZXgoZG9zRGF0ZSwgMik7XG4gICAgLy8gY3JjLTMyXG4gICAgaGVhZGVyICs9IGRlY1RvSGV4KGNvbXByZXNzZWRPYmplY3QuY3JjMzIsIDQpO1xuICAgIC8vIGNvbXByZXNzZWQgc2l6ZVxuICAgIGhlYWRlciArPSBkZWNUb0hleChjb21wcmVzc2VkT2JqZWN0LmNvbXByZXNzZWRTaXplLCA0KTtcbiAgICAvLyB1bmNvbXByZXNzZWQgc2l6ZVxuICAgIGhlYWRlciArPSBkZWNUb0hleChjb21wcmVzc2VkT2JqZWN0LnVuY29tcHJlc3NlZFNpemUsIDQpO1xuICAgIC8vIGZpbGUgbmFtZSBsZW5ndGhcbiAgICBoZWFkZXIgKz0gZGVjVG9IZXgodXRmRW5jb2RlZEZpbGVOYW1lLmxlbmd0aCwgMik7XG4gICAgLy8gZXh0cmEgZmllbGQgbGVuZ3RoXG4gICAgaGVhZGVyICs9IGRlY1RvSGV4KGV4dHJhRmllbGRzLmxlbmd0aCwgMik7XG5cblxuICAgIHZhciBmaWxlUmVjb3JkID0gc2lnbmF0dXJlLkxPQ0FMX0ZJTEVfSEVBREVSICsgaGVhZGVyICsgdXRmRW5jb2RlZEZpbGVOYW1lICsgZXh0cmFGaWVsZHM7XG5cbiAgICB2YXIgZGlyUmVjb3JkID0gc2lnbmF0dXJlLkNFTlRSQUxfRklMRV9IRUFERVIgK1xuICAgIC8vIHZlcnNpb24gbWFkZSBieSAoMDA6IERPUylcbiAgICBcIlxceDE0XFx4MDBcIiArXG4gICAgLy8gZmlsZSBoZWFkZXIgKGNvbW1vbiB0byBmaWxlIGFuZCBjZW50cmFsIGRpcmVjdG9yeSlcbiAgICBoZWFkZXIgK1xuICAgIC8vIGZpbGUgY29tbWVudCBsZW5ndGhcbiAgICBkZWNUb0hleCh1dGZFbmNvZGVkQ29tbWVudC5sZW5ndGgsIDIpICtcbiAgICAvLyBkaXNrIG51bWJlciBzdGFydFxuICAgIFwiXFx4MDBcXHgwMFwiICtcbiAgICAvLyBpbnRlcm5hbCBmaWxlIGF0dHJpYnV0ZXMgVE9ET1xuICAgIFwiXFx4MDBcXHgwMFwiICtcbiAgICAvLyBleHRlcm5hbCBmaWxlIGF0dHJpYnV0ZXNcbiAgICAoZGlyID09PSB0cnVlID8gXCJcXHgxMFxceDAwXFx4MDBcXHgwMFwiIDogXCJcXHgwMFxceDAwXFx4MDBcXHgwMFwiKSArXG4gICAgLy8gcmVsYXRpdmUgb2Zmc2V0IG9mIGxvY2FsIGhlYWRlclxuICAgIGRlY1RvSGV4KG9mZnNldCwgNCkgK1xuICAgIC8vIGZpbGUgbmFtZVxuICAgIHV0ZkVuY29kZWRGaWxlTmFtZSArXG4gICAgLy8gZXh0cmEgZmllbGRcbiAgICBleHRyYUZpZWxkcyArXG4gICAgLy8gZmlsZSBjb21tZW50XG4gICAgdXRmRW5jb2RlZENvbW1lbnQ7XG5cbiAgICByZXR1cm4ge1xuICAgICAgICBmaWxlUmVjb3JkOiBmaWxlUmVjb3JkLFxuICAgICAgICBkaXJSZWNvcmQ6IGRpclJlY29yZCxcbiAgICAgICAgY29tcHJlc3NlZE9iamVjdDogY29tcHJlc3NlZE9iamVjdFxuICAgIH07XG59O1xuXG5cbi8vIHJldHVybiB0aGUgYWN0dWFsIHByb3RvdHlwZSBvZiBKU1ppcFxudmFyIG91dCA9IHtcbiAgICAvKipcbiAgICAgKiBSZWFkIGFuIGV4aXN0aW5nIHppcCBhbmQgbWVyZ2UgdGhlIGRhdGEgaW4gdGhlIGN1cnJlbnQgSlNaaXAgb2JqZWN0LlxuICAgICAqIFRoZSBpbXBsZW1lbnRhdGlvbiBpcyBpbiBqc3ppcC1sb2FkLmpzLCBkb24ndCBmb3JnZXQgdG8gaW5jbHVkZSBpdC5cbiAgICAgKiBAcGFyYW0ge1N0cmluZ3xBcnJheUJ1ZmZlcnxVaW50OEFycmF5fEJ1ZmZlcn0gc3RyZWFtICBUaGUgc3RyZWFtIHRvIGxvYWRcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb3B0aW9ucyBPcHRpb25zIGZvciBsb2FkaW5nIHRoZSBzdHJlYW0uXG4gICAgICogIG9wdGlvbnMuYmFzZTY0IDogaXMgdGhlIHN0cmVhbSBpbiBiYXNlNjQgPyBkZWZhdWx0IDogZmFsc2VcbiAgICAgKiBAcmV0dXJuIHtKU1ppcH0gdGhlIGN1cnJlbnQgSlNaaXAgb2JqZWN0XG4gICAgICovXG4gICAgbG9hZDogZnVuY3Rpb24oc3RyZWFtLCBvcHRpb25zKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIkxvYWQgbWV0aG9kIGlzIG5vdCBkZWZpbmVkLiBJcyB0aGUgZmlsZSBqc3ppcC1sb2FkLmpzIGluY2x1ZGVkID9cIik7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIEZpbHRlciBuZXN0ZWQgZmlsZXMvZm9sZGVycyB3aXRoIHRoZSBzcGVjaWZpZWQgZnVuY3Rpb24uXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gc2VhcmNoIHRoZSBwcmVkaWNhdGUgdG8gdXNlIDpcbiAgICAgKiBmdW5jdGlvbiAocmVsYXRpdmVQYXRoLCBmaWxlKSB7Li4ufVxuICAgICAqIEl0IHRha2VzIDIgYXJndW1lbnRzIDogdGhlIHJlbGF0aXZlIHBhdGggYW5kIHRoZSBmaWxlLlxuICAgICAqIEByZXR1cm4ge0FycmF5fSBBbiBhcnJheSBvZiBtYXRjaGluZyBlbGVtZW50cy5cbiAgICAgKi9cbiAgICBmaWx0ZXI6IGZ1bmN0aW9uKHNlYXJjaCkge1xuICAgICAgICB2YXIgcmVzdWx0ID0gW10sXG4gICAgICAgICAgICBmaWxlbmFtZSwgcmVsYXRpdmVQYXRoLCBmaWxlLCBmaWxlQ2xvbmU7XG4gICAgICAgIGZvciAoZmlsZW5hbWUgaW4gdGhpcy5maWxlcykge1xuICAgICAgICAgICAgaWYgKCF0aGlzLmZpbGVzLmhhc093blByb3BlcnR5KGZpbGVuYW1lKSkge1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZmlsZSA9IHRoaXMuZmlsZXNbZmlsZW5hbWVdO1xuICAgICAgICAgICAgLy8gcmV0dXJuIGEgbmV3IG9iamVjdCwgZG9uJ3QgbGV0IHRoZSB1c2VyIG1lc3Mgd2l0aCBvdXIgaW50ZXJuYWwgb2JqZWN0cyA6KVxuICAgICAgICAgICAgZmlsZUNsb25lID0gbmV3IFppcE9iamVjdChmaWxlLm5hbWUsIGZpbGUuX2RhdGEsIGV4dGVuZChmaWxlLm9wdGlvbnMpKTtcbiAgICAgICAgICAgIHJlbGF0aXZlUGF0aCA9IGZpbGVuYW1lLnNsaWNlKHRoaXMucm9vdC5sZW5ndGgsIGZpbGVuYW1lLmxlbmd0aCk7XG4gICAgICAgICAgICBpZiAoZmlsZW5hbWUuc2xpY2UoMCwgdGhpcy5yb290Lmxlbmd0aCkgPT09IHRoaXMucm9vdCAmJiAvLyB0aGUgZmlsZSBpcyBpbiB0aGUgY3VycmVudCByb290XG4gICAgICAgICAgICBzZWFyY2gocmVsYXRpdmVQYXRoLCBmaWxlQ2xvbmUpKSB7IC8vIGFuZCB0aGUgZmlsZSBtYXRjaGVzIHRoZSBmdW5jdGlvblxuICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKGZpbGVDbG9uZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogQWRkIGEgZmlsZSB0byB0aGUgemlwIGZpbGUsIG9yIHNlYXJjaCBhIGZpbGUuXG4gICAgICogQHBhcmFtICAge3N0cmluZ3xSZWdFeHB9IG5hbWUgVGhlIG5hbWUgb2YgdGhlIGZpbGUgdG8gYWRkIChpZiBkYXRhIGlzIGRlZmluZWQpLFxuICAgICAqIHRoZSBuYW1lIG9mIHRoZSBmaWxlIHRvIGZpbmQgKGlmIG5vIGRhdGEpIG9yIGEgcmVnZXggdG8gbWF0Y2ggZmlsZXMuXG4gICAgICogQHBhcmFtICAge1N0cmluZ3xBcnJheUJ1ZmZlcnxVaW50OEFycmF5fEJ1ZmZlcn0gZGF0YSAgVGhlIGZpbGUgZGF0YSwgZWl0aGVyIHJhdyBvciBiYXNlNjQgZW5jb2RlZFxuICAgICAqIEBwYXJhbSAgIHtPYmplY3R9IG8gICAgIEZpbGUgb3B0aW9uc1xuICAgICAqIEByZXR1cm4gIHtKU1ppcHxPYmplY3R8QXJyYXl9IHRoaXMgSlNaaXAgb2JqZWN0ICh3aGVuIGFkZGluZyBhIGZpbGUpLFxuICAgICAqIGEgZmlsZSAod2hlbiBzZWFyY2hpbmcgYnkgc3RyaW5nKSBvciBhbiBhcnJheSBvZiBmaWxlcyAod2hlbiBzZWFyY2hpbmcgYnkgcmVnZXgpLlxuICAgICAqL1xuICAgIGZpbGU6IGZ1bmN0aW9uKG5hbWUsIGRhdGEsIG8pIHtcbiAgICAgICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgICAgIGlmICh1dGlscy5pc1JlZ0V4cChuYW1lKSkge1xuICAgICAgICAgICAgICAgIHZhciByZWdleHAgPSBuYW1lO1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmZpbHRlcihmdW5jdGlvbihyZWxhdGl2ZVBhdGgsIGZpbGUpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICFmaWxlLmRpciAmJiByZWdleHAudGVzdChyZWxhdGl2ZVBhdGgpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7IC8vIHRleHRcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5maWx0ZXIoZnVuY3Rpb24ocmVsYXRpdmVQYXRoLCBmaWxlKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiAhZmlsZS5kaXIgJiYgcmVsYXRpdmVQYXRoID09PSBuYW1lO1xuICAgICAgICAgICAgICAgIH0pWzBdIHx8IG51bGw7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7IC8vIG1vcmUgdGhhbiBvbmUgYXJndW1lbnQgOiB3ZSBoYXZlIGRhdGEgIVxuICAgICAgICAgICAgbmFtZSA9IHRoaXMucm9vdCArIG5hbWU7XG4gICAgICAgICAgICBmaWxlQWRkLmNhbGwodGhpcywgbmFtZSwgZGF0YSwgbyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIEFkZCBhIGRpcmVjdG9yeSB0byB0aGUgemlwIGZpbGUsIG9yIHNlYXJjaC5cbiAgICAgKiBAcGFyYW0gICB7U3RyaW5nfFJlZ0V4cH0gYXJnIFRoZSBuYW1lIG9mIHRoZSBkaXJlY3RvcnkgdG8gYWRkLCBvciBhIHJlZ2V4IHRvIHNlYXJjaCBmb2xkZXJzLlxuICAgICAqIEByZXR1cm4gIHtKU1ppcH0gYW4gb2JqZWN0IHdpdGggdGhlIG5ldyBkaXJlY3RvcnkgYXMgdGhlIHJvb3QsIG9yIGFuIGFycmF5IGNvbnRhaW5pbmcgbWF0Y2hpbmcgZm9sZGVycy5cbiAgICAgKi9cbiAgICBmb2xkZXI6IGZ1bmN0aW9uKGFyZykge1xuICAgICAgICBpZiAoIWFyZykge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodXRpbHMuaXNSZWdFeHAoYXJnKSkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuZmlsdGVyKGZ1bmN0aW9uKHJlbGF0aXZlUGF0aCwgZmlsZSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBmaWxlLmRpciAmJiBhcmcudGVzdChyZWxhdGl2ZVBhdGgpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBlbHNlLCBuYW1lIGlzIGEgbmV3IGZvbGRlclxuICAgICAgICB2YXIgbmFtZSA9IHRoaXMucm9vdCArIGFyZztcbiAgICAgICAgdmFyIG5ld0ZvbGRlciA9IGZvbGRlckFkZC5jYWxsKHRoaXMsIG5hbWUpO1xuXG4gICAgICAgIC8vIEFsbG93IGNoYWluaW5nIGJ5IHJldHVybmluZyBhIG5ldyBvYmplY3Qgd2l0aCB0aGlzIGZvbGRlciBhcyB0aGUgcm9vdFxuICAgICAgICB2YXIgcmV0ID0gdGhpcy5jbG9uZSgpO1xuICAgICAgICByZXQucm9vdCA9IG5ld0ZvbGRlci5uYW1lO1xuICAgICAgICByZXR1cm4gcmV0O1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBEZWxldGUgYSBmaWxlLCBvciBhIGRpcmVjdG9yeSBhbmQgYWxsIHN1Yi1maWxlcywgZnJvbSB0aGUgemlwXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IG5hbWUgdGhlIG5hbWUgb2YgdGhlIGZpbGUgdG8gZGVsZXRlXG4gICAgICogQHJldHVybiB7SlNaaXB9IHRoaXMgSlNaaXAgb2JqZWN0XG4gICAgICovXG4gICAgcmVtb3ZlOiBmdW5jdGlvbihuYW1lKSB7XG4gICAgICAgIG5hbWUgPSB0aGlzLnJvb3QgKyBuYW1lO1xuICAgICAgICB2YXIgZmlsZSA9IHRoaXMuZmlsZXNbbmFtZV07XG4gICAgICAgIGlmICghZmlsZSkge1xuICAgICAgICAgICAgLy8gTG9vayBmb3IgYW55IGZvbGRlcnNcbiAgICAgICAgICAgIGlmIChuYW1lLnNsaWNlKC0xKSAhPSBcIi9cIikge1xuICAgICAgICAgICAgICAgIG5hbWUgKz0gXCIvXCI7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBmaWxlID0gdGhpcy5maWxlc1tuYW1lXTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChmaWxlICYmICFmaWxlLmRpcikge1xuICAgICAgICAgICAgLy8gZmlsZVxuICAgICAgICAgICAgZGVsZXRlIHRoaXMuZmlsZXNbbmFtZV07XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyBtYXliZSBhIGZvbGRlciwgZGVsZXRlIHJlY3Vyc2l2ZWx5XG4gICAgICAgICAgICB2YXIga2lkcyA9IHRoaXMuZmlsdGVyKGZ1bmN0aW9uKHJlbGF0aXZlUGF0aCwgZmlsZSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBmaWxlLm5hbWUuc2xpY2UoMCwgbmFtZS5sZW5ndGgpID09PSBuYW1lO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGtpZHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICBkZWxldGUgdGhpcy5maWxlc1traWRzW2ldLm5hbWVdO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIEdlbmVyYXRlIHRoZSBjb21wbGV0ZSB6aXAgZmlsZVxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zIHRoZSBvcHRpb25zIHRvIGdlbmVyYXRlIHRoZSB6aXAgZmlsZSA6XG4gICAgICogLSBiYXNlNjQsIChkZXByZWNhdGVkLCB1c2UgdHlwZSBpbnN0ZWFkKSB0cnVlIHRvIGdlbmVyYXRlIGJhc2U2NC5cbiAgICAgKiAtIGNvbXByZXNzaW9uLCBcIlNUT1JFXCIgYnkgZGVmYXVsdC5cbiAgICAgKiAtIHR5cGUsIFwiYmFzZTY0XCIgYnkgZGVmYXVsdC4gVmFsdWVzIGFyZSA6IHN0cmluZywgYmFzZTY0LCB1aW50OGFycmF5LCBhcnJheWJ1ZmZlciwgYmxvYi5cbiAgICAgKiBAcmV0dXJuIHtTdHJpbmd8VWludDhBcnJheXxBcnJheUJ1ZmZlcnxCdWZmZXJ8QmxvYn0gdGhlIHppcCBmaWxlXG4gICAgICovXG4gICAgZ2VuZXJhdGU6IGZ1bmN0aW9uKG9wdGlvbnMpIHtcbiAgICAgICAgb3B0aW9ucyA9IGV4dGVuZChvcHRpb25zIHx8IHt9LCB7XG4gICAgICAgICAgICBiYXNlNjQ6IHRydWUsXG4gICAgICAgICAgICBjb21wcmVzc2lvbjogXCJTVE9SRVwiLFxuICAgICAgICAgICAgdHlwZTogXCJiYXNlNjRcIixcbiAgICAgICAgICAgIGNvbW1lbnQ6IG51bGxcbiAgICAgICAgfSk7XG5cbiAgICAgICAgdXRpbHMuY2hlY2tTdXBwb3J0KG9wdGlvbnMudHlwZSk7XG5cbiAgICAgICAgdmFyIHppcERhdGEgPSBbXSxcbiAgICAgICAgICAgIGxvY2FsRGlyTGVuZ3RoID0gMCxcbiAgICAgICAgICAgIGNlbnRyYWxEaXJMZW5ndGggPSAwLFxuICAgICAgICAgICAgd3JpdGVyLCBpLFxuICAgICAgICAgICAgdXRmRW5jb2RlZENvbW1lbnQgPSB1dGlscy50cmFuc2Zvcm1UbyhcInN0cmluZ1wiLCB0aGlzLnV0ZjhlbmNvZGUob3B0aW9ucy5jb21tZW50IHx8IHRoaXMuY29tbWVudCB8fCBcIlwiKSk7XG5cbiAgICAgICAgLy8gZmlyc3QsIGdlbmVyYXRlIGFsbCB0aGUgemlwIHBhcnRzLlxuICAgICAgICBmb3IgKHZhciBuYW1lIGluIHRoaXMuZmlsZXMpIHtcbiAgICAgICAgICAgIGlmICghdGhpcy5maWxlcy5oYXNPd25Qcm9wZXJ0eShuYW1lKSkge1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdmFyIGZpbGUgPSB0aGlzLmZpbGVzW25hbWVdO1xuXG4gICAgICAgICAgICB2YXIgY29tcHJlc3Npb25OYW1lID0gZmlsZS5vcHRpb25zLmNvbXByZXNzaW9uIHx8IG9wdGlvbnMuY29tcHJlc3Npb24udG9VcHBlckNhc2UoKTtcbiAgICAgICAgICAgIHZhciBjb21wcmVzc2lvbiA9IGNvbXByZXNzaW9uc1tjb21wcmVzc2lvbk5hbWVdO1xuICAgICAgICAgICAgaWYgKCFjb21wcmVzc2lvbikge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihjb21wcmVzc2lvbk5hbWUgKyBcIiBpcyBub3QgYSB2YWxpZCBjb21wcmVzc2lvbiBtZXRob2QgIVwiKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdmFyIGNvbXByZXNzZWRPYmplY3QgPSBnZW5lcmF0ZUNvbXByZXNzZWRPYmplY3RGcm9tLmNhbGwodGhpcywgZmlsZSwgY29tcHJlc3Npb24pO1xuXG4gICAgICAgICAgICB2YXIgemlwUGFydCA9IGdlbmVyYXRlWmlwUGFydHMuY2FsbCh0aGlzLCBuYW1lLCBmaWxlLCBjb21wcmVzc2VkT2JqZWN0LCBsb2NhbERpckxlbmd0aCk7XG4gICAgICAgICAgICBsb2NhbERpckxlbmd0aCArPSB6aXBQYXJ0LmZpbGVSZWNvcmQubGVuZ3RoICsgY29tcHJlc3NlZE9iamVjdC5jb21wcmVzc2VkU2l6ZTtcbiAgICAgICAgICAgIGNlbnRyYWxEaXJMZW5ndGggKz0gemlwUGFydC5kaXJSZWNvcmQubGVuZ3RoO1xuICAgICAgICAgICAgemlwRGF0YS5wdXNoKHppcFBhcnQpO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIGRpckVuZCA9IFwiXCI7XG5cbiAgICAgICAgLy8gZW5kIG9mIGNlbnRyYWwgZGlyIHNpZ25hdHVyZVxuICAgICAgICBkaXJFbmQgPSBzaWduYXR1cmUuQ0VOVFJBTF9ESVJFQ1RPUllfRU5EICtcbiAgICAgICAgLy8gbnVtYmVyIG9mIHRoaXMgZGlza1xuICAgICAgICBcIlxceDAwXFx4MDBcIiArXG4gICAgICAgIC8vIG51bWJlciBvZiB0aGUgZGlzayB3aXRoIHRoZSBzdGFydCBvZiB0aGUgY2VudHJhbCBkaXJlY3RvcnlcbiAgICAgICAgXCJcXHgwMFxceDAwXCIgK1xuICAgICAgICAvLyB0b3RhbCBudW1iZXIgb2YgZW50cmllcyBpbiB0aGUgY2VudHJhbCBkaXJlY3Rvcnkgb24gdGhpcyBkaXNrXG4gICAgICAgIGRlY1RvSGV4KHppcERhdGEubGVuZ3RoLCAyKSArXG4gICAgICAgIC8vIHRvdGFsIG51bWJlciBvZiBlbnRyaWVzIGluIHRoZSBjZW50cmFsIGRpcmVjdG9yeVxuICAgICAgICBkZWNUb0hleCh6aXBEYXRhLmxlbmd0aCwgMikgK1xuICAgICAgICAvLyBzaXplIG9mIHRoZSBjZW50cmFsIGRpcmVjdG9yeSAgIDQgYnl0ZXNcbiAgICAgICAgZGVjVG9IZXgoY2VudHJhbERpckxlbmd0aCwgNCkgK1xuICAgICAgICAvLyBvZmZzZXQgb2Ygc3RhcnQgb2YgY2VudHJhbCBkaXJlY3Rvcnkgd2l0aCByZXNwZWN0IHRvIHRoZSBzdGFydGluZyBkaXNrIG51bWJlclxuICAgICAgICBkZWNUb0hleChsb2NhbERpckxlbmd0aCwgNCkgK1xuICAgICAgICAvLyAuWklQIGZpbGUgY29tbWVudCBsZW5ndGhcbiAgICAgICAgZGVjVG9IZXgodXRmRW5jb2RlZENvbW1lbnQubGVuZ3RoLCAyKSArXG4gICAgICAgIC8vIC5aSVAgZmlsZSBjb21tZW50XG4gICAgICAgIHV0ZkVuY29kZWRDb21tZW50O1xuXG5cbiAgICAgICAgLy8gd2UgaGF2ZSBhbGwgdGhlIHBhcnRzIChhbmQgdGhlIHRvdGFsIGxlbmd0aClcbiAgICAgICAgLy8gdGltZSB0byBjcmVhdGUgYSB3cml0ZXIgIVxuICAgICAgICB2YXIgdHlwZU5hbWUgPSBvcHRpb25zLnR5cGUudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgaWYodHlwZU5hbWU9PT1cInVpbnQ4YXJyYXlcInx8dHlwZU5hbWU9PT1cImFycmF5YnVmZmVyXCJ8fHR5cGVOYW1lPT09XCJibG9iXCJ8fHR5cGVOYW1lPT09XCJub2RlYnVmZmVyXCIpIHtcbiAgICAgICAgICAgIHdyaXRlciA9IG5ldyBVaW50OEFycmF5V3JpdGVyKGxvY2FsRGlyTGVuZ3RoICsgY2VudHJhbERpckxlbmd0aCArIGRpckVuZC5sZW5ndGgpO1xuICAgICAgICB9ZWxzZXtcbiAgICAgICAgICAgIHdyaXRlciA9IG5ldyBTdHJpbmdXcml0ZXIobG9jYWxEaXJMZW5ndGggKyBjZW50cmFsRGlyTGVuZ3RoICsgZGlyRW5kLmxlbmd0aCk7XG4gICAgICAgIH1cblxuICAgICAgICBmb3IgKGkgPSAwOyBpIDwgemlwRGF0YS5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgd3JpdGVyLmFwcGVuZCh6aXBEYXRhW2ldLmZpbGVSZWNvcmQpO1xuICAgICAgICAgICAgd3JpdGVyLmFwcGVuZCh6aXBEYXRhW2ldLmNvbXByZXNzZWRPYmplY3QuY29tcHJlc3NlZENvbnRlbnQpO1xuICAgICAgICB9XG4gICAgICAgIGZvciAoaSA9IDA7IGkgPCB6aXBEYXRhLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICB3cml0ZXIuYXBwZW5kKHppcERhdGFbaV0uZGlyUmVjb3JkKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHdyaXRlci5hcHBlbmQoZGlyRW5kKTtcblxuICAgICAgICB2YXIgemlwID0gd3JpdGVyLmZpbmFsaXplKCk7XG5cblxuXG4gICAgICAgIHN3aXRjaChvcHRpb25zLnR5cGUudG9Mb3dlckNhc2UoKSkge1xuICAgICAgICAgICAgLy8gY2FzZSBcInppcCBpcyBhbiBVaW50OEFycmF5XCJcbiAgICAgICAgICAgIGNhc2UgXCJ1aW50OGFycmF5XCIgOlxuICAgICAgICAgICAgY2FzZSBcImFycmF5YnVmZmVyXCIgOlxuICAgICAgICAgICAgY2FzZSBcIm5vZGVidWZmZXJcIiA6XG4gICAgICAgICAgICAgICByZXR1cm4gdXRpbHMudHJhbnNmb3JtVG8ob3B0aW9ucy50eXBlLnRvTG93ZXJDYXNlKCksIHppcCk7XG4gICAgICAgICAgICBjYXNlIFwiYmxvYlwiIDpcbiAgICAgICAgICAgICAgIHJldHVybiB1dGlscy5hcnJheUJ1ZmZlcjJCbG9iKHV0aWxzLnRyYW5zZm9ybVRvKFwiYXJyYXlidWZmZXJcIiwgemlwKSk7XG4gICAgICAgICAgICAvLyBjYXNlIFwiemlwIGlzIGEgc3RyaW5nXCJcbiAgICAgICAgICAgIGNhc2UgXCJiYXNlNjRcIiA6XG4gICAgICAgICAgICAgICByZXR1cm4gKG9wdGlvbnMuYmFzZTY0KSA/IGJhc2U2NC5lbmNvZGUoemlwKSA6IHppcDtcbiAgICAgICAgICAgIGRlZmF1bHQgOiAvLyBjYXNlIFwic3RyaW5nXCIgOlxuICAgICAgICAgICAgICAgcmV0dXJuIHppcDtcbiAgICAgICAgIH1cblxuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBAZGVwcmVjYXRlZFxuICAgICAqIFRoaXMgbWV0aG9kIHdpbGwgYmUgcmVtb3ZlZCBpbiBhIGZ1dHVyZSB2ZXJzaW9uIHdpdGhvdXQgcmVwbGFjZW1lbnQuXG4gICAgICovXG4gICAgY3JjMzI6IGZ1bmN0aW9uIChpbnB1dCwgY3JjKSB7XG4gICAgICAgIHJldHVybiBjcmMzMihpbnB1dCwgY3JjKTtcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogQGRlcHJlY2F0ZWRcbiAgICAgKiBUaGlzIG1ldGhvZCB3aWxsIGJlIHJlbW92ZWQgaW4gYSBmdXR1cmUgdmVyc2lvbiB3aXRob3V0IHJlcGxhY2VtZW50LlxuICAgICAqL1xuICAgIHV0ZjhlbmNvZGU6IGZ1bmN0aW9uIChzdHJpbmcpIHtcbiAgICAgICAgcmV0dXJuIHV0aWxzLnRyYW5zZm9ybVRvKFwic3RyaW5nXCIsIHV0ZjgudXRmOGVuY29kZShzdHJpbmcpKTtcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogQGRlcHJlY2F0ZWRcbiAgICAgKiBUaGlzIG1ldGhvZCB3aWxsIGJlIHJlbW92ZWQgaW4gYSBmdXR1cmUgdmVyc2lvbiB3aXRob3V0IHJlcGxhY2VtZW50LlxuICAgICAqL1xuICAgIHV0ZjhkZWNvZGU6IGZ1bmN0aW9uIChpbnB1dCkge1xuICAgICAgICByZXR1cm4gdXRmOC51dGY4ZGVjb2RlKGlucHV0KTtcbiAgICB9XG59O1xubW9kdWxlLmV4cG9ydHMgPSBvdXQ7XG5cbn0se1wiLi9iYXNlNjRcIjoxLFwiLi9jb21wcmVzc2VkT2JqZWN0XCI6MixcIi4vY29tcHJlc3Npb25zXCI6MyxcIi4vY3JjMzJcIjo0LFwiLi9kZWZhdWx0c1wiOjYsXCIuL25vZGVCdWZmZXJcIjoxMSxcIi4vc2lnbmF0dXJlXCI6MTQsXCIuL3N0cmluZ1dyaXRlclwiOjE2LFwiLi9zdXBwb3J0XCI6MTcsXCIuL3VpbnQ4QXJyYXlXcml0ZXJcIjoxOSxcIi4vdXRmOFwiOjIwLFwiLi91dGlsc1wiOjIxfV0sMTQ6W2Z1bmN0aW9uKF9kZXJlcV8sbW9kdWxlLGV4cG9ydHMpe1xuJ3VzZSBzdHJpY3QnO1xuZXhwb3J0cy5MT0NBTF9GSUxFX0hFQURFUiA9IFwiUEtcXHgwM1xceDA0XCI7XG5leHBvcnRzLkNFTlRSQUxfRklMRV9IRUFERVIgPSBcIlBLXFx4MDFcXHgwMlwiO1xuZXhwb3J0cy5DRU5UUkFMX0RJUkVDVE9SWV9FTkQgPSBcIlBLXFx4MDVcXHgwNlwiO1xuZXhwb3J0cy5aSVA2NF9DRU5UUkFMX0RJUkVDVE9SWV9MT0NBVE9SID0gXCJQS1xceDA2XFx4MDdcIjtcbmV4cG9ydHMuWklQNjRfQ0VOVFJBTF9ESVJFQ1RPUllfRU5EID0gXCJQS1xceDA2XFx4MDZcIjtcbmV4cG9ydHMuREFUQV9ERVNDUklQVE9SID0gXCJQS1xceDA3XFx4MDhcIjtcblxufSx7fV0sMTU6W2Z1bmN0aW9uKF9kZXJlcV8sbW9kdWxlLGV4cG9ydHMpe1xuJ3VzZSBzdHJpY3QnO1xudmFyIERhdGFSZWFkZXIgPSBfZGVyZXFfKCcuL2RhdGFSZWFkZXInKTtcbnZhciB1dGlscyA9IF9kZXJlcV8oJy4vdXRpbHMnKTtcblxuZnVuY3Rpb24gU3RyaW5nUmVhZGVyKGRhdGEsIG9wdGltaXplZEJpbmFyeVN0cmluZykge1xuICAgIHRoaXMuZGF0YSA9IGRhdGE7XG4gICAgaWYgKCFvcHRpbWl6ZWRCaW5hcnlTdHJpbmcpIHtcbiAgICAgICAgdGhpcy5kYXRhID0gdXRpbHMuc3RyaW5nMmJpbmFyeSh0aGlzLmRhdGEpO1xuICAgIH1cbiAgICB0aGlzLmxlbmd0aCA9IHRoaXMuZGF0YS5sZW5ndGg7XG4gICAgdGhpcy5pbmRleCA9IDA7XG59XG5TdHJpbmdSZWFkZXIucHJvdG90eXBlID0gbmV3IERhdGFSZWFkZXIoKTtcbi8qKlxuICogQHNlZSBEYXRhUmVhZGVyLmJ5dGVBdFxuICovXG5TdHJpbmdSZWFkZXIucHJvdG90eXBlLmJ5dGVBdCA9IGZ1bmN0aW9uKGkpIHtcbiAgICByZXR1cm4gdGhpcy5kYXRhLmNoYXJDb2RlQXQoaSk7XG59O1xuLyoqXG4gKiBAc2VlIERhdGFSZWFkZXIubGFzdEluZGV4T2ZTaWduYXR1cmVcbiAqL1xuU3RyaW5nUmVhZGVyLnByb3RvdHlwZS5sYXN0SW5kZXhPZlNpZ25hdHVyZSA9IGZ1bmN0aW9uKHNpZykge1xuICAgIHJldHVybiB0aGlzLmRhdGEubGFzdEluZGV4T2Yoc2lnKTtcbn07XG4vKipcbiAqIEBzZWUgRGF0YVJlYWRlci5yZWFkRGF0YVxuICovXG5TdHJpbmdSZWFkZXIucHJvdG90eXBlLnJlYWREYXRhID0gZnVuY3Rpb24oc2l6ZSkge1xuICAgIHRoaXMuY2hlY2tPZmZzZXQoc2l6ZSk7XG4gICAgLy8gdGhpcyB3aWxsIHdvcmsgYmVjYXVzZSB0aGUgY29uc3RydWN0b3IgYXBwbGllZCB0aGUgXCImIDB4ZmZcIiBtYXNrLlxuICAgIHZhciByZXN1bHQgPSB0aGlzLmRhdGEuc2xpY2UodGhpcy5pbmRleCwgdGhpcy5pbmRleCArIHNpemUpO1xuICAgIHRoaXMuaW5kZXggKz0gc2l6ZTtcbiAgICByZXR1cm4gcmVzdWx0O1xufTtcbm1vZHVsZS5leHBvcnRzID0gU3RyaW5nUmVhZGVyO1xuXG59LHtcIi4vZGF0YVJlYWRlclwiOjUsXCIuL3V0aWxzXCI6MjF9XSwxNjpbZnVuY3Rpb24oX2RlcmVxXyxtb2R1bGUsZXhwb3J0cyl7XG4ndXNlIHN0cmljdCc7XG5cbnZhciB1dGlscyA9IF9kZXJlcV8oJy4vdXRpbHMnKTtcblxuLyoqXG4gKiBBbiBvYmplY3QgdG8gd3JpdGUgYW55IGNvbnRlbnQgdG8gYSBzdHJpbmcuXG4gKiBAY29uc3RydWN0b3JcbiAqL1xudmFyIFN0cmluZ1dyaXRlciA9IGZ1bmN0aW9uKCkge1xuICAgIHRoaXMuZGF0YSA9IFtdO1xufTtcblN0cmluZ1dyaXRlci5wcm90b3R5cGUgPSB7XG4gICAgLyoqXG4gICAgICogQXBwZW5kIGFueSBjb250ZW50IHRvIHRoZSBjdXJyZW50IHN0cmluZy5cbiAgICAgKiBAcGFyYW0ge09iamVjdH0gaW5wdXQgdGhlIGNvbnRlbnQgdG8gYWRkLlxuICAgICAqL1xuICAgIGFwcGVuZDogZnVuY3Rpb24oaW5wdXQpIHtcbiAgICAgICAgaW5wdXQgPSB1dGlscy50cmFuc2Zvcm1UbyhcInN0cmluZ1wiLCBpbnB1dCk7XG4gICAgICAgIHRoaXMuZGF0YS5wdXNoKGlucHV0KTtcbiAgICB9LFxuICAgIC8qKlxuICAgICAqIEZpbmFsaXplIHRoZSBjb25zdHJ1Y3Rpb24gYW4gcmV0dXJuIHRoZSByZXN1bHQuXG4gICAgICogQHJldHVybiB7c3RyaW5nfSB0aGUgZ2VuZXJhdGVkIHN0cmluZy5cbiAgICAgKi9cbiAgICBmaW5hbGl6ZTogZnVuY3Rpb24oKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmRhdGEuam9pbihcIlwiKTtcbiAgICB9XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IFN0cmluZ1dyaXRlcjtcblxufSx7XCIuL3V0aWxzXCI6MjF9XSwxNzpbZnVuY3Rpb24oX2RlcmVxXyxtb2R1bGUsZXhwb3J0cyl7XG4oZnVuY3Rpb24gKEJ1ZmZlcil7XG4ndXNlIHN0cmljdCc7XG5leHBvcnRzLmJhc2U2NCA9IHRydWU7XG5leHBvcnRzLmFycmF5ID0gdHJ1ZTtcbmV4cG9ydHMuc3RyaW5nID0gdHJ1ZTtcbmV4cG9ydHMuYXJyYXlidWZmZXIgPSB0eXBlb2YgQXJyYXlCdWZmZXIgIT09IFwidW5kZWZpbmVkXCIgJiYgdHlwZW9mIFVpbnQ4QXJyYXkgIT09IFwidW5kZWZpbmVkXCI7XG4vLyBjb250YWlucyB0cnVlIGlmIEpTWmlwIGNhbiByZWFkL2dlbmVyYXRlIG5vZGVqcyBCdWZmZXIsIGZhbHNlIG90aGVyd2lzZS5cbi8vIEJyb3dzZXJpZnkgd2lsbCBwcm92aWRlIGEgQnVmZmVyIGltcGxlbWVudGF0aW9uIGZvciBicm93c2Vycywgd2hpY2ggaXNcbi8vIGFuIGF1Z21lbnRlZCBVaW50OEFycmF5IChpLmUuLCBjYW4gYmUgdXNlZCBhcyBlaXRoZXIgQnVmZmVyIG9yIFU4KS5cbmV4cG9ydHMubm9kZWJ1ZmZlciA9IHR5cGVvZiBCdWZmZXIgIT09IFwidW5kZWZpbmVkXCI7XG4vLyBjb250YWlucyB0cnVlIGlmIEpTWmlwIGNhbiByZWFkL2dlbmVyYXRlIFVpbnQ4QXJyYXksIGZhbHNlIG90aGVyd2lzZS5cbmV4cG9ydHMudWludDhhcnJheSA9IHR5cGVvZiBVaW50OEFycmF5ICE9PSBcInVuZGVmaW5lZFwiO1xuXG5pZiAodHlwZW9mIEFycmF5QnVmZmVyID09PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgZXhwb3J0cy5ibG9iID0gZmFsc2U7XG59XG5lbHNlIHtcbiAgICB2YXIgYnVmZmVyID0gbmV3IEFycmF5QnVmZmVyKDApO1xuICAgIHRyeSB7XG4gICAgICAgIGV4cG9ydHMuYmxvYiA9IG5ldyBCbG9iKFtidWZmZXJdLCB7XG4gICAgICAgICAgICB0eXBlOiBcImFwcGxpY2F0aW9uL3ppcFwiXG4gICAgICAgIH0pLnNpemUgPT09IDA7XG4gICAgfVxuICAgIGNhdGNoIChlKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICB2YXIgQnVpbGRlciA9IHdpbmRvdy5CbG9iQnVpbGRlciB8fCB3aW5kb3cuV2ViS2l0QmxvYkJ1aWxkZXIgfHwgd2luZG93Lk1vekJsb2JCdWlsZGVyIHx8IHdpbmRvdy5NU0Jsb2JCdWlsZGVyO1xuICAgICAgICAgICAgdmFyIGJ1aWxkZXIgPSBuZXcgQnVpbGRlcigpO1xuICAgICAgICAgICAgYnVpbGRlci5hcHBlbmQoYnVmZmVyKTtcbiAgICAgICAgICAgIGV4cG9ydHMuYmxvYiA9IGJ1aWxkZXIuZ2V0QmxvYignYXBwbGljYXRpb24vemlwJykuc2l6ZSA9PT0gMDtcbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZSkge1xuICAgICAgICAgICAgZXhwb3J0cy5ibG9iID0gZmFsc2U7XG4gICAgICAgIH1cbiAgICB9XG59XG5cbn0pLmNhbGwodGhpcywodHlwZW9mIEJ1ZmZlciAhPT0gXCJ1bmRlZmluZWRcIiA/IEJ1ZmZlciA6IHVuZGVmaW5lZCkpXG59LHt9XSwxODpbZnVuY3Rpb24oX2RlcmVxXyxtb2R1bGUsZXhwb3J0cyl7XG4ndXNlIHN0cmljdCc7XG52YXIgRGF0YVJlYWRlciA9IF9kZXJlcV8oJy4vZGF0YVJlYWRlcicpO1xuXG5mdW5jdGlvbiBVaW50OEFycmF5UmVhZGVyKGRhdGEpIHtcbiAgICBpZiAoZGF0YSkge1xuICAgICAgICB0aGlzLmRhdGEgPSBkYXRhO1xuICAgICAgICB0aGlzLmxlbmd0aCA9IHRoaXMuZGF0YS5sZW5ndGg7XG4gICAgICAgIHRoaXMuaW5kZXggPSAwO1xuICAgIH1cbn1cblVpbnQ4QXJyYXlSZWFkZXIucHJvdG90eXBlID0gbmV3IERhdGFSZWFkZXIoKTtcbi8qKlxuICogQHNlZSBEYXRhUmVhZGVyLmJ5dGVBdFxuICovXG5VaW50OEFycmF5UmVhZGVyLnByb3RvdHlwZS5ieXRlQXQgPSBmdW5jdGlvbihpKSB7XG4gICAgcmV0dXJuIHRoaXMuZGF0YVtpXTtcbn07XG4vKipcbiAqIEBzZWUgRGF0YVJlYWRlci5sYXN0SW5kZXhPZlNpZ25hdHVyZVxuICovXG5VaW50OEFycmF5UmVhZGVyLnByb3RvdHlwZS5sYXN0SW5kZXhPZlNpZ25hdHVyZSA9IGZ1bmN0aW9uKHNpZykge1xuICAgIHZhciBzaWcwID0gc2lnLmNoYXJDb2RlQXQoMCksXG4gICAgICAgIHNpZzEgPSBzaWcuY2hhckNvZGVBdCgxKSxcbiAgICAgICAgc2lnMiA9IHNpZy5jaGFyQ29kZUF0KDIpLFxuICAgICAgICBzaWczID0gc2lnLmNoYXJDb2RlQXQoMyk7XG4gICAgZm9yICh2YXIgaSA9IHRoaXMubGVuZ3RoIC0gNDsgaSA+PSAwOyAtLWkpIHtcbiAgICAgICAgaWYgKHRoaXMuZGF0YVtpXSA9PT0gc2lnMCAmJiB0aGlzLmRhdGFbaSArIDFdID09PSBzaWcxICYmIHRoaXMuZGF0YVtpICsgMl0gPT09IHNpZzIgJiYgdGhpcy5kYXRhW2kgKyAzXSA9PT0gc2lnMykge1xuICAgICAgICAgICAgcmV0dXJuIGk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gLTE7XG59O1xuLyoqXG4gKiBAc2VlIERhdGFSZWFkZXIucmVhZERhdGFcbiAqL1xuVWludDhBcnJheVJlYWRlci5wcm90b3R5cGUucmVhZERhdGEgPSBmdW5jdGlvbihzaXplKSB7XG4gICAgdGhpcy5jaGVja09mZnNldChzaXplKTtcbiAgICBpZihzaXplID09PSAwKSB7XG4gICAgICAgIC8vIGluIElFMTAsIHdoZW4gdXNpbmcgc3ViYXJyYXkoaWR4LCBpZHgpLCB3ZSBnZXQgdGhlIGFycmF5IFsweDAwXSBpbnN0ZWFkIG9mIFtdLlxuICAgICAgICByZXR1cm4gbmV3IFVpbnQ4QXJyYXkoMCk7XG4gICAgfVxuICAgIHZhciByZXN1bHQgPSB0aGlzLmRhdGEuc3ViYXJyYXkodGhpcy5pbmRleCwgdGhpcy5pbmRleCArIHNpemUpO1xuICAgIHRoaXMuaW5kZXggKz0gc2l6ZTtcbiAgICByZXR1cm4gcmVzdWx0O1xufTtcbm1vZHVsZS5leHBvcnRzID0gVWludDhBcnJheVJlYWRlcjtcblxufSx7XCIuL2RhdGFSZWFkZXJcIjo1fV0sMTk6W2Z1bmN0aW9uKF9kZXJlcV8sbW9kdWxlLGV4cG9ydHMpe1xuJ3VzZSBzdHJpY3QnO1xuXG52YXIgdXRpbHMgPSBfZGVyZXFfKCcuL3V0aWxzJyk7XG5cbi8qKlxuICogQW4gb2JqZWN0IHRvIHdyaXRlIGFueSBjb250ZW50IHRvIGFuIFVpbnQ4QXJyYXkuXG4gKiBAY29uc3RydWN0b3JcbiAqIEBwYXJhbSB7bnVtYmVyfSBsZW5ndGggVGhlIGxlbmd0aCBvZiB0aGUgYXJyYXkuXG4gKi9cbnZhciBVaW50OEFycmF5V3JpdGVyID0gZnVuY3Rpb24obGVuZ3RoKSB7XG4gICAgdGhpcy5kYXRhID0gbmV3IFVpbnQ4QXJyYXkobGVuZ3RoKTtcbiAgICB0aGlzLmluZGV4ID0gMDtcbn07XG5VaW50OEFycmF5V3JpdGVyLnByb3RvdHlwZSA9IHtcbiAgICAvKipcbiAgICAgKiBBcHBlbmQgYW55IGNvbnRlbnQgdG8gdGhlIGN1cnJlbnQgYXJyYXkuXG4gICAgICogQHBhcmFtIHtPYmplY3R9IGlucHV0IHRoZSBjb250ZW50IHRvIGFkZC5cbiAgICAgKi9cbiAgICBhcHBlbmQ6IGZ1bmN0aW9uKGlucHV0KSB7XG4gICAgICAgIGlmIChpbnB1dC5sZW5ndGggIT09IDApIHtcbiAgICAgICAgICAgIC8vIHdpdGggYW4gZW1wdHkgVWludDhBcnJheSwgT3BlcmEgZmFpbHMgd2l0aCBhIFwiT2Zmc2V0IGxhcmdlciB0aGFuIGFycmF5IHNpemVcIlxuICAgICAgICAgICAgaW5wdXQgPSB1dGlscy50cmFuc2Zvcm1UbyhcInVpbnQ4YXJyYXlcIiwgaW5wdXQpO1xuICAgICAgICAgICAgdGhpcy5kYXRhLnNldChpbnB1dCwgdGhpcy5pbmRleCk7XG4gICAgICAgICAgICB0aGlzLmluZGV4ICs9IGlucHV0Lmxlbmd0aDtcbiAgICAgICAgfVxuICAgIH0sXG4gICAgLyoqXG4gICAgICogRmluYWxpemUgdGhlIGNvbnN0cnVjdGlvbiBhbiByZXR1cm4gdGhlIHJlc3VsdC5cbiAgICAgKiBAcmV0dXJuIHtVaW50OEFycmF5fSB0aGUgZ2VuZXJhdGVkIGFycmF5LlxuICAgICAqL1xuICAgIGZpbmFsaXplOiBmdW5jdGlvbigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZGF0YTtcbiAgICB9XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IFVpbnQ4QXJyYXlXcml0ZXI7XG5cbn0se1wiLi91dGlsc1wiOjIxfV0sMjA6W2Z1bmN0aW9uKF9kZXJlcV8sbW9kdWxlLGV4cG9ydHMpe1xuJ3VzZSBzdHJpY3QnO1xuXG52YXIgdXRpbHMgPSBfZGVyZXFfKCcuL3V0aWxzJyk7XG52YXIgc3VwcG9ydCA9IF9kZXJlcV8oJy4vc3VwcG9ydCcpO1xudmFyIG5vZGVCdWZmZXIgPSBfZGVyZXFfKCcuL25vZGVCdWZmZXInKTtcblxuLyoqXG4gKiBUaGUgZm9sbG93aW5nIGZ1bmN0aW9ucyBjb21lIGZyb20gcGFrbywgZnJvbSBwYWtvL2xpYi91dGlscy9zdHJpbmdzXG4gKiByZWxlYXNlZCB1bmRlciB0aGUgTUlUIGxpY2Vuc2UsIHNlZSBwYWtvIGh0dHBzOi8vZ2l0aHViLmNvbS9ub2RlY2EvcGFrby9cbiAqL1xuXG4vLyBUYWJsZSB3aXRoIHV0ZjggbGVuZ3RocyAoY2FsY3VsYXRlZCBieSBmaXJzdCBieXRlIG9mIHNlcXVlbmNlKVxuLy8gTm90ZSwgdGhhdCA1ICYgNi1ieXRlIHZhbHVlcyBhbmQgc29tZSA0LWJ5dGUgdmFsdWVzIGNhbiBub3QgYmUgcmVwcmVzZW50ZWQgaW4gSlMsXG4vLyBiZWNhdXNlIG1heCBwb3NzaWJsZSBjb2RlcG9pbnQgaXMgMHgxMGZmZmZcbnZhciBfdXRmOGxlbiA9IG5ldyBBcnJheSgyNTYpO1xuZm9yICh2YXIgaT0wOyBpPDI1NjsgaSsrKSB7XG4gIF91dGY4bGVuW2ldID0gKGkgPj0gMjUyID8gNiA6IGkgPj0gMjQ4ID8gNSA6IGkgPj0gMjQwID8gNCA6IGkgPj0gMjI0ID8gMyA6IGkgPj0gMTkyID8gMiA6IDEpO1xufVxuX3V0ZjhsZW5bMjU0XT1fdXRmOGxlblsyNTRdPTE7IC8vIEludmFsaWQgc2VxdWVuY2Ugc3RhcnRcblxuLy8gY29udmVydCBzdHJpbmcgdG8gYXJyYXkgKHR5cGVkLCB3aGVuIHBvc3NpYmxlKVxudmFyIHN0cmluZzJidWYgPSBmdW5jdGlvbiAoc3RyKSB7XG4gICAgdmFyIGJ1ZiwgYywgYzIsIG1fcG9zLCBpLCBzdHJfbGVuID0gc3RyLmxlbmd0aCwgYnVmX2xlbiA9IDA7XG5cbiAgICAvLyBjb3VudCBiaW5hcnkgc2l6ZVxuICAgIGZvciAobV9wb3MgPSAwOyBtX3BvcyA8IHN0cl9sZW47IG1fcG9zKyspIHtcbiAgICAgICAgYyA9IHN0ci5jaGFyQ29kZUF0KG1fcG9zKTtcbiAgICAgICAgaWYgKCgoYyAmIDB4ZmMwMCkgPT09IDB4ZDgwMCkgJiYgKG1fcG9zKzEgPCBzdHJfbGVuKSkge1xuICAgICAgICAgICAgYzIgPSBzdHIuY2hhckNvZGVBdChtX3BvcysxKTtcbiAgICAgICAgICAgIGlmICgoYzIgJiAweGZjMDApID09PSAweGRjMDApIHtcbiAgICAgICAgICAgICAgICBjID0gMHgxMDAwMCArICgoYyAtIDB4ZDgwMCkgPDwgMTApICsgKGMyIC0gMHhkYzAwKTtcbiAgICAgICAgICAgICAgICBtX3BvcysrO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGJ1Zl9sZW4gKz0gKGMgPCAweDgwKSA/IDEgOiAoKGMgPCAweDgwMCkgPyAyIDogKChjIDwgMHgxMDAwMCkgPyAzIDogNCkpO1xuICAgIH1cblxuICAgIC8vIGFsbG9jYXRlIGJ1ZmZlclxuICAgIGlmIChzdXBwb3J0LnVpbnQ4YXJyYXkpIHtcbiAgICAgICAgYnVmID0gbmV3IFVpbnQ4QXJyYXkoYnVmX2xlbik7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgYnVmID0gbmV3IEFycmF5KGJ1Zl9sZW4pO1xuICAgIH1cblxuICAgIC8vIGNvbnZlcnRcbiAgICBmb3IgKGk9MCwgbV9wb3MgPSAwOyBpIDwgYnVmX2xlbjsgbV9wb3MrKykge1xuICAgICAgICBjID0gc3RyLmNoYXJDb2RlQXQobV9wb3MpO1xuICAgICAgICBpZiAoKGMgJiAweGZjMDApID09PSAweGQ4MDAgJiYgKG1fcG9zKzEgPCBzdHJfbGVuKSkge1xuICAgICAgICAgICAgYzIgPSBzdHIuY2hhckNvZGVBdChtX3BvcysxKTtcbiAgICAgICAgICAgIGlmICgoYzIgJiAweGZjMDApID09PSAweGRjMDApIHtcbiAgICAgICAgICAgICAgICBjID0gMHgxMDAwMCArICgoYyAtIDB4ZDgwMCkgPDwgMTApICsgKGMyIC0gMHhkYzAwKTtcbiAgICAgICAgICAgICAgICBtX3BvcysrO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChjIDwgMHg4MCkge1xuICAgICAgICAgICAgLyogb25lIGJ5dGUgKi9cbiAgICAgICAgICAgIGJ1ZltpKytdID0gYztcbiAgICAgICAgfSBlbHNlIGlmIChjIDwgMHg4MDApIHtcbiAgICAgICAgICAgIC8qIHR3byBieXRlcyAqL1xuICAgICAgICAgICAgYnVmW2krK10gPSAweEMwIHwgKGMgPj4+IDYpO1xuICAgICAgICAgICAgYnVmW2krK10gPSAweDgwIHwgKGMgJiAweDNmKTtcbiAgICAgICAgfSBlbHNlIGlmIChjIDwgMHgxMDAwMCkge1xuICAgICAgICAgICAgLyogdGhyZWUgYnl0ZXMgKi9cbiAgICAgICAgICAgIGJ1ZltpKytdID0gMHhFMCB8IChjID4+PiAxMik7XG4gICAgICAgICAgICBidWZbaSsrXSA9IDB4ODAgfCAoKGMgPj4+IDYpICYgMHgzZik7XG4gICAgICAgICAgICBidWZbaSsrXSA9IDB4ODAgfCAoYyAmIDB4M2YpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLyogZm91ciBieXRlcyAqL1xuICAgICAgICAgICAgYnVmW2krK10gPSAweGYwIHwgKGMgPj4+IDE4KTtcbiAgICAgICAgICAgIGJ1ZltpKytdID0gMHg4MCB8ICgoYyA+Pj4gMTIpICYgMHgzZik7XG4gICAgICAgICAgICBidWZbaSsrXSA9IDB4ODAgfCAoKGMgPj4+IDYpICYgMHgzZik7XG4gICAgICAgICAgICBidWZbaSsrXSA9IDB4ODAgfCAoYyAmIDB4M2YpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGJ1Zjtcbn07XG5cbi8vIENhbGN1bGF0ZSBtYXggcG9zc2libGUgcG9zaXRpb24gaW4gdXRmOCBidWZmZXIsXG4vLyB0aGF0IHdpbGwgbm90IGJyZWFrIHNlcXVlbmNlLiBJZiB0aGF0J3Mgbm90IHBvc3NpYmxlXG4vLyAtICh2ZXJ5IHNtYWxsIGxpbWl0cykgcmV0dXJuIG1heCBzaXplIGFzIGlzLlxuLy9cbi8vIGJ1ZltdIC0gdXRmOCBieXRlcyBhcnJheVxuLy8gbWF4ICAgLSBsZW5ndGggbGltaXQgKG1hbmRhdG9yeSk7XG52YXIgdXRmOGJvcmRlciA9IGZ1bmN0aW9uKGJ1ZiwgbWF4KSB7XG4gICAgdmFyIHBvcztcblxuICAgIG1heCA9IG1heCB8fCBidWYubGVuZ3RoO1xuICAgIGlmIChtYXggPiBidWYubGVuZ3RoKSB7IG1heCA9IGJ1Zi5sZW5ndGg7IH1cblxuICAgIC8vIGdvIGJhY2sgZnJvbSBsYXN0IHBvc2l0aW9uLCB1bnRpbCBzdGFydCBvZiBzZXF1ZW5jZSBmb3VuZFxuICAgIHBvcyA9IG1heC0xO1xuICAgIHdoaWxlIChwb3MgPj0gMCAmJiAoYnVmW3Bvc10gJiAweEMwKSA9PT0gMHg4MCkgeyBwb3MtLTsgfVxuXG4gICAgLy8gRnVja3VwIC0gdmVyeSBzbWFsbCBhbmQgYnJva2VuIHNlcXVlbmNlLFxuICAgIC8vIHJldHVybiBtYXgsIGJlY2F1c2Ugd2Ugc2hvdWxkIHJldHVybiBzb21ldGhpbmcgYW55d2F5LlxuICAgIGlmIChwb3MgPCAwKSB7IHJldHVybiBtYXg7IH1cblxuICAgIC8vIElmIHdlIGNhbWUgdG8gc3RhcnQgb2YgYnVmZmVyIC0gdGhhdCBtZWFucyB2dWZmZXIgaXMgdG9vIHNtYWxsLFxuICAgIC8vIHJldHVybiBtYXggdG9vLlxuICAgIGlmIChwb3MgPT09IDApIHsgcmV0dXJuIG1heDsgfVxuXG4gICAgcmV0dXJuIChwb3MgKyBfdXRmOGxlbltidWZbcG9zXV0gPiBtYXgpID8gcG9zIDogbWF4O1xufTtcblxuLy8gY29udmVydCBhcnJheSB0byBzdHJpbmdcbnZhciBidWYyc3RyaW5nID0gZnVuY3Rpb24gKGJ1Zikge1xuICAgIHZhciBzdHIsIGksIG91dCwgYywgY19sZW47XG4gICAgdmFyIGxlbiA9IGJ1Zi5sZW5ndGg7XG5cbiAgICAvLyBSZXNlcnZlIG1heCBwb3NzaWJsZSBsZW5ndGggKDIgd29yZHMgcGVyIGNoYXIpXG4gICAgLy8gTkI6IGJ5IHVua25vd24gcmVhc29ucywgQXJyYXkgaXMgc2lnbmlmaWNhbnRseSBmYXN0ZXIgZm9yXG4gICAgLy8gICAgIFN0cmluZy5mcm9tQ2hhckNvZGUuYXBwbHkgdGhhbiBVaW50MTZBcnJheS5cbiAgICB2YXIgdXRmMTZidWYgPSBuZXcgQXJyYXkobGVuKjIpO1xuXG4gICAgZm9yIChvdXQ9MCwgaT0wOyBpPGxlbjspIHtcbiAgICAgICAgYyA9IGJ1ZltpKytdO1xuICAgICAgICAvLyBxdWljayBwcm9jZXNzIGFzY2lpXG4gICAgICAgIGlmIChjIDwgMHg4MCkgeyB1dGYxNmJ1ZltvdXQrK10gPSBjOyBjb250aW51ZTsgfVxuXG4gICAgICAgIGNfbGVuID0gX3V0ZjhsZW5bY107XG4gICAgICAgIC8vIHNraXAgNSAmIDYgYnl0ZSBjb2Rlc1xuICAgICAgICBpZiAoY19sZW4gPiA0KSB7IHV0ZjE2YnVmW291dCsrXSA9IDB4ZmZmZDsgaSArPSBjX2xlbi0xOyBjb250aW51ZTsgfVxuXG4gICAgICAgIC8vIGFwcGx5IG1hc2sgb24gZmlyc3QgYnl0ZVxuICAgICAgICBjICY9IGNfbGVuID09PSAyID8gMHgxZiA6IGNfbGVuID09PSAzID8gMHgwZiA6IDB4MDc7XG4gICAgICAgIC8vIGpvaW4gdGhlIHJlc3RcbiAgICAgICAgd2hpbGUgKGNfbGVuID4gMSAmJiBpIDwgbGVuKSB7XG4gICAgICAgICAgICBjID0gKGMgPDwgNikgfCAoYnVmW2krK10gJiAweDNmKTtcbiAgICAgICAgICAgIGNfbGVuLS07XG4gICAgICAgIH1cblxuICAgICAgICAvLyB0ZXJtaW5hdGVkIGJ5IGVuZCBvZiBzdHJpbmc/XG4gICAgICAgIGlmIChjX2xlbiA+IDEpIHsgdXRmMTZidWZbb3V0KytdID0gMHhmZmZkOyBjb250aW51ZTsgfVxuXG4gICAgICAgIGlmIChjIDwgMHgxMDAwMCkge1xuICAgICAgICAgICAgdXRmMTZidWZbb3V0KytdID0gYztcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGMgLT0gMHgxMDAwMDtcbiAgICAgICAgICAgIHV0ZjE2YnVmW291dCsrXSA9IDB4ZDgwMCB8ICgoYyA+PiAxMCkgJiAweDNmZik7XG4gICAgICAgICAgICB1dGYxNmJ1ZltvdXQrK10gPSAweGRjMDAgfCAoYyAmIDB4M2ZmKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIHNocmlua0J1Zih1dGYxNmJ1Ziwgb3V0KVxuICAgIGlmICh1dGYxNmJ1Zi5sZW5ndGggIT09IG91dCkge1xuICAgICAgICBpZih1dGYxNmJ1Zi5zdWJhcnJheSkge1xuICAgICAgICAgICAgdXRmMTZidWYgPSB1dGYxNmJ1Zi5zdWJhcnJheSgwLCBvdXQpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdXRmMTZidWYubGVuZ3RoID0gb3V0O1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gcmV0dXJuIFN0cmluZy5mcm9tQ2hhckNvZGUuYXBwbHkobnVsbCwgdXRmMTZidWYpO1xuICAgIHJldHVybiB1dGlscy5hcHBseUZyb21DaGFyQ29kZSh1dGYxNmJ1Zik7XG59O1xuXG5cbi8vIFRoYXQncyBhbGwgZm9yIHRoZSBwYWtvIGZ1bmN0aW9ucy5cblxuXG4vKipcbiAqIFRyYW5zZm9ybSBhIGphdmFzY3JpcHQgc3RyaW5nIGludG8gYW4gYXJyYXkgKHR5cGVkIGlmIHBvc3NpYmxlKSBvZiBieXRlcyxcbiAqIFVURi04IGVuY29kZWQuXG4gKiBAcGFyYW0ge1N0cmluZ30gc3RyIHRoZSBzdHJpbmcgdG8gZW5jb2RlXG4gKiBAcmV0dXJuIHtBcnJheXxVaW50OEFycmF5fEJ1ZmZlcn0gdGhlIFVURi04IGVuY29kZWQgc3RyaW5nLlxuICovXG5leHBvcnRzLnV0ZjhlbmNvZGUgPSBmdW5jdGlvbiB1dGY4ZW5jb2RlKHN0cikge1xuICAgIGlmIChzdXBwb3J0Lm5vZGVidWZmZXIpIHtcbiAgICAgICAgcmV0dXJuIG5vZGVCdWZmZXIoc3RyLCBcInV0Zi04XCIpO1xuICAgIH1cblxuICAgIHJldHVybiBzdHJpbmcyYnVmKHN0cik7XG59O1xuXG5cbi8qKlxuICogVHJhbnNmb3JtIGEgYnl0ZXMgYXJyYXkgKG9yIGEgcmVwcmVzZW50YXRpb24pIHJlcHJlc2VudGluZyBhbiBVVEYtOCBlbmNvZGVkXG4gKiBzdHJpbmcgaW50byBhIGphdmFzY3JpcHQgc3RyaW5nLlxuICogQHBhcmFtIHtBcnJheXxVaW50OEFycmF5fEJ1ZmZlcn0gYnVmIHRoZSBkYXRhIGRlIGRlY29kZVxuICogQHJldHVybiB7U3RyaW5nfSB0aGUgZGVjb2RlZCBzdHJpbmcuXG4gKi9cbmV4cG9ydHMudXRmOGRlY29kZSA9IGZ1bmN0aW9uIHV0ZjhkZWNvZGUoYnVmKSB7XG4gICAgaWYgKHN1cHBvcnQubm9kZWJ1ZmZlcikge1xuICAgICAgICByZXR1cm4gdXRpbHMudHJhbnNmb3JtVG8oXCJub2RlYnVmZmVyXCIsIGJ1ZikudG9TdHJpbmcoXCJ1dGYtOFwiKTtcbiAgICB9XG5cbiAgICBidWYgPSB1dGlscy50cmFuc2Zvcm1UbyhzdXBwb3J0LnVpbnQ4YXJyYXkgPyBcInVpbnQ4YXJyYXlcIiA6IFwiYXJyYXlcIiwgYnVmKTtcblxuICAgIC8vIHJldHVybiBidWYyc3RyaW5nKGJ1Zik7XG4gICAgLy8gQ2hyb21lIHByZWZlcnMgdG8gd29yayB3aXRoIFwic21hbGxcIiBjaHVua3Mgb2YgZGF0YVxuICAgIC8vIGZvciB0aGUgbWV0aG9kIGJ1ZjJzdHJpbmcuXG4gICAgLy8gRmlyZWZveCBhbmQgQ2hyb21lIGhhcyB0aGVpciBvd24gc2hvcnRjdXQsIElFIGRvZXNuJ3Qgc2VlbSB0byByZWFsbHkgY2FyZS5cbiAgICB2YXIgcmVzdWx0ID0gW10sIGsgPSAwLCBsZW4gPSBidWYubGVuZ3RoLCBjaHVuayA9IDY1NTM2O1xuICAgIHdoaWxlIChrIDwgbGVuKSB7XG4gICAgICAgIHZhciBuZXh0Qm91bmRhcnkgPSB1dGY4Ym9yZGVyKGJ1ZiwgTWF0aC5taW4oayArIGNodW5rLCBsZW4pKTtcbiAgICAgICAgaWYgKHN1cHBvcnQudWludDhhcnJheSkge1xuICAgICAgICAgICAgcmVzdWx0LnB1c2goYnVmMnN0cmluZyhidWYuc3ViYXJyYXkoaywgbmV4dEJvdW5kYXJ5KSkpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmVzdWx0LnB1c2goYnVmMnN0cmluZyhidWYuc2xpY2UoaywgbmV4dEJvdW5kYXJ5KSkpO1xuICAgICAgICB9XG4gICAgICAgIGsgPSBuZXh0Qm91bmRhcnk7XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQuam9pbihcIlwiKTtcblxufTtcbi8vIHZpbTogc2V0IHNoaWZ0d2lkdGg9NCBzb2Z0dGFic3RvcD00OlxuXG59LHtcIi4vbm9kZUJ1ZmZlclwiOjExLFwiLi9zdXBwb3J0XCI6MTcsXCIuL3V0aWxzXCI6MjF9XSwyMTpbZnVuY3Rpb24oX2RlcmVxXyxtb2R1bGUsZXhwb3J0cyl7XG4ndXNlIHN0cmljdCc7XG52YXIgc3VwcG9ydCA9IF9kZXJlcV8oJy4vc3VwcG9ydCcpO1xudmFyIGNvbXByZXNzaW9ucyA9IF9kZXJlcV8oJy4vY29tcHJlc3Npb25zJyk7XG52YXIgbm9kZUJ1ZmZlciA9IF9kZXJlcV8oJy4vbm9kZUJ1ZmZlcicpO1xuLyoqXG4gKiBDb252ZXJ0IGEgc3RyaW5nIHRvIGEgXCJiaW5hcnkgc3RyaW5nXCIgOiBhIHN0cmluZyBjb250YWluaW5nIG9ubHkgY2hhciBjb2RlcyBiZXR3ZWVuIDAgYW5kIDI1NS5cbiAqIEBwYXJhbSB7c3RyaW5nfSBzdHIgdGhlIHN0cmluZyB0byB0cmFuc2Zvcm0uXG4gKiBAcmV0dXJuIHtTdHJpbmd9IHRoZSBiaW5hcnkgc3RyaW5nLlxuICovXG5leHBvcnRzLnN0cmluZzJiaW5hcnkgPSBmdW5jdGlvbihzdHIpIHtcbiAgICB2YXIgcmVzdWx0ID0gXCJcIjtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHN0ci5sZW5ndGg7IGkrKykge1xuICAgICAgICByZXN1bHQgKz0gU3RyaW5nLmZyb21DaGFyQ29kZShzdHIuY2hhckNvZGVBdChpKSAmIDB4ZmYpO1xuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xufTtcbmV4cG9ydHMuYXJyYXlCdWZmZXIyQmxvYiA9IGZ1bmN0aW9uKGJ1ZmZlcikge1xuICAgIGV4cG9ydHMuY2hlY2tTdXBwb3J0KFwiYmxvYlwiKTtcblxuICAgIHRyeSB7XG4gICAgICAgIC8vIEJsb2IgY29uc3RydWN0b3JcbiAgICAgICAgcmV0dXJuIG5ldyBCbG9iKFtidWZmZXJdLCB7XG4gICAgICAgICAgICB0eXBlOiBcImFwcGxpY2F0aW9uL3ppcFwiXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBjYXRjaCAoZSkge1xuXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICAvLyBkZXByZWNhdGVkLCBicm93c2VyIG9ubHksIG9sZCB3YXlcbiAgICAgICAgICAgIHZhciBCdWlsZGVyID0gd2luZG93LkJsb2JCdWlsZGVyIHx8IHdpbmRvdy5XZWJLaXRCbG9iQnVpbGRlciB8fCB3aW5kb3cuTW96QmxvYkJ1aWxkZXIgfHwgd2luZG93Lk1TQmxvYkJ1aWxkZXI7XG4gICAgICAgICAgICB2YXIgYnVpbGRlciA9IG5ldyBCdWlsZGVyKCk7XG4gICAgICAgICAgICBidWlsZGVyLmFwcGVuZChidWZmZXIpO1xuICAgICAgICAgICAgcmV0dXJuIGJ1aWxkZXIuZ2V0QmxvYignYXBwbGljYXRpb24vemlwJyk7XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKGUpIHtcblxuICAgICAgICAgICAgLy8gd2VsbCwgZnVjayA/IVxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiQnVnIDogY2FuJ3QgY29uc3RydWN0IHRoZSBCbG9iLlwiKTtcbiAgICAgICAgfVxuICAgIH1cblxuXG59O1xuLyoqXG4gKiBUaGUgaWRlbnRpdHkgZnVuY3Rpb24uXG4gKiBAcGFyYW0ge09iamVjdH0gaW5wdXQgdGhlIGlucHV0LlxuICogQHJldHVybiB7T2JqZWN0fSB0aGUgc2FtZSBpbnB1dC5cbiAqL1xuZnVuY3Rpb24gaWRlbnRpdHkoaW5wdXQpIHtcbiAgICByZXR1cm4gaW5wdXQ7XG59XG5cbi8qKlxuICogRmlsbCBpbiBhbiBhcnJheSB3aXRoIGEgc3RyaW5nLlxuICogQHBhcmFtIHtTdHJpbmd9IHN0ciB0aGUgc3RyaW5nIHRvIHVzZS5cbiAqIEBwYXJhbSB7QXJyYXl8QXJyYXlCdWZmZXJ8VWludDhBcnJheXxCdWZmZXJ9IGFycmF5IHRoZSBhcnJheSB0byBmaWxsIGluICh3aWxsIGJlIG11dGF0ZWQpLlxuICogQHJldHVybiB7QXJyYXl8QXJyYXlCdWZmZXJ8VWludDhBcnJheXxCdWZmZXJ9IHRoZSB1cGRhdGVkIGFycmF5LlxuICovXG5mdW5jdGlvbiBzdHJpbmdUb0FycmF5TGlrZShzdHIsIGFycmF5KSB7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBzdHIubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgYXJyYXlbaV0gPSBzdHIuY2hhckNvZGVBdChpKSAmIDB4RkY7XG4gICAgfVxuICAgIHJldHVybiBhcnJheTtcbn1cblxuLyoqXG4gKiBUcmFuc2Zvcm0gYW4gYXJyYXktbGlrZSBvYmplY3QgdG8gYSBzdHJpbmcuXG4gKiBAcGFyYW0ge0FycmF5fEFycmF5QnVmZmVyfFVpbnQ4QXJyYXl8QnVmZmVyfSBhcnJheSB0aGUgYXJyYXkgdG8gdHJhbnNmb3JtLlxuICogQHJldHVybiB7U3RyaW5nfSB0aGUgcmVzdWx0LlxuICovXG5mdW5jdGlvbiBhcnJheUxpa2VUb1N0cmluZyhhcnJheSkge1xuICAgIC8vIFBlcmZvcm1hbmNlcyBub3RlcyA6XG4gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICAvLyBTdHJpbmcuZnJvbUNoYXJDb2RlLmFwcGx5KG51bGwsIGFycmF5KSBpcyB0aGUgZmFzdGVzdCwgc2VlXG4gICAgLy8gc2VlIGh0dHA6Ly9qc3BlcmYuY29tL2NvbnZlcnRpbmctYS11aW50OGFycmF5LXRvLWEtc3RyaW5nLzJcbiAgICAvLyBidXQgdGhlIHN0YWNrIGlzIGxpbWl0ZWQgKGFuZCB3ZSBjYW4gZ2V0IGh1Z2UgYXJyYXlzICEpLlxuICAgIC8vXG4gICAgLy8gcmVzdWx0ICs9IFN0cmluZy5mcm9tQ2hhckNvZGUoYXJyYXlbaV0pOyBnZW5lcmF0ZSB0b28gbWFueSBzdHJpbmdzICFcbiAgICAvL1xuICAgIC8vIFRoaXMgY29kZSBpcyBpbnNwaXJlZCBieSBodHRwOi8vanNwZXJmLmNvbS9hcnJheWJ1ZmZlci10by1zdHJpbmctYXBwbHktcGVyZm9ybWFuY2UvMlxuICAgIHZhciBjaHVuayA9IDY1NTM2O1xuICAgIHZhciByZXN1bHQgPSBbXSxcbiAgICAgICAgbGVuID0gYXJyYXkubGVuZ3RoLFxuICAgICAgICB0eXBlID0gZXhwb3J0cy5nZXRUeXBlT2YoYXJyYXkpLFxuICAgICAgICBrID0gMCxcbiAgICAgICAgY2FuVXNlQXBwbHkgPSB0cnVlO1xuICAgICAgdHJ5IHtcbiAgICAgICAgIHN3aXRjaCh0eXBlKSB7XG4gICAgICAgICAgICBjYXNlIFwidWludDhhcnJheVwiOlxuICAgICAgICAgICAgICAgU3RyaW5nLmZyb21DaGFyQ29kZS5hcHBseShudWxsLCBuZXcgVWludDhBcnJheSgwKSk7XG4gICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgXCJub2RlYnVmZmVyXCI6XG4gICAgICAgICAgICAgICBTdHJpbmcuZnJvbUNoYXJDb2RlLmFwcGx5KG51bGwsIG5vZGVCdWZmZXIoMCkpO1xuICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICB9XG4gICAgICB9IGNhdGNoKGUpIHtcbiAgICAgICAgIGNhblVzZUFwcGx5ID0gZmFsc2U7XG4gICAgICB9XG5cbiAgICAgIC8vIG5vIGFwcGx5IDogc2xvdyBhbmQgcGFpbmZ1bCBhbGdvcml0aG1cbiAgICAgIC8vIGRlZmF1bHQgYnJvd3NlciBvbiBhbmRyb2lkIDQuKlxuICAgICAgaWYgKCFjYW5Vc2VBcHBseSkge1xuICAgICAgICAgdmFyIHJlc3VsdFN0ciA9IFwiXCI7XG4gICAgICAgICBmb3IodmFyIGkgPSAwOyBpIDwgYXJyYXkubGVuZ3RoO2krKykge1xuICAgICAgICAgICAgcmVzdWx0U3RyICs9IFN0cmluZy5mcm9tQ2hhckNvZGUoYXJyYXlbaV0pO1xuICAgICAgICAgfVxuICAgIHJldHVybiByZXN1bHRTdHI7XG4gICAgfVxuICAgIHdoaWxlIChrIDwgbGVuICYmIGNodW5rID4gMSkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgaWYgKHR5cGUgPT09IFwiYXJyYXlcIiB8fCB0eXBlID09PSBcIm5vZGVidWZmZXJcIikge1xuICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKFN0cmluZy5mcm9tQ2hhckNvZGUuYXBwbHkobnVsbCwgYXJyYXkuc2xpY2UoaywgTWF0aC5taW4oayArIGNodW5rLCBsZW4pKSkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgcmVzdWx0LnB1c2goU3RyaW5nLmZyb21DaGFyQ29kZS5hcHBseShudWxsLCBhcnJheS5zdWJhcnJheShrLCBNYXRoLm1pbihrICsgY2h1bmssIGxlbikpKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBrICs9IGNodW5rO1xuICAgICAgICB9XG4gICAgICAgIGNhdGNoIChlKSB7XG4gICAgICAgICAgICBjaHVuayA9IE1hdGguZmxvb3IoY2h1bmsgLyAyKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0LmpvaW4oXCJcIik7XG59XG5cbmV4cG9ydHMuYXBwbHlGcm9tQ2hhckNvZGUgPSBhcnJheUxpa2VUb1N0cmluZztcblxuXG4vKipcbiAqIENvcHkgdGhlIGRhdGEgZnJvbSBhbiBhcnJheS1saWtlIHRvIGFuIG90aGVyIGFycmF5LWxpa2UuXG4gKiBAcGFyYW0ge0FycmF5fEFycmF5QnVmZmVyfFVpbnQ4QXJyYXl8QnVmZmVyfSBhcnJheUZyb20gdGhlIG9yaWdpbiBhcnJheS5cbiAqIEBwYXJhbSB7QXJyYXl8QXJyYXlCdWZmZXJ8VWludDhBcnJheXxCdWZmZXJ9IGFycmF5VG8gdGhlIGRlc3RpbmF0aW9uIGFycmF5IHdoaWNoIHdpbGwgYmUgbXV0YXRlZC5cbiAqIEByZXR1cm4ge0FycmF5fEFycmF5QnVmZmVyfFVpbnQ4QXJyYXl8QnVmZmVyfSB0aGUgdXBkYXRlZCBkZXN0aW5hdGlvbiBhcnJheS5cbiAqL1xuZnVuY3Rpb24gYXJyYXlMaWtlVG9BcnJheUxpa2UoYXJyYXlGcm9tLCBhcnJheVRvKSB7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBhcnJheUZyb20ubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgYXJyYXlUb1tpXSA9IGFycmF5RnJvbVtpXTtcbiAgICB9XG4gICAgcmV0dXJuIGFycmF5VG87XG59XG5cbi8vIGEgbWF0cml4IGNvbnRhaW5pbmcgZnVuY3Rpb25zIHRvIHRyYW5zZm9ybSBldmVyeXRoaW5nIGludG8gZXZlcnl0aGluZy5cbnZhciB0cmFuc2Zvcm0gPSB7fTtcblxuLy8gc3RyaW5nIHRvID9cbnRyYW5zZm9ybVtcInN0cmluZ1wiXSA9IHtcbiAgICBcInN0cmluZ1wiOiBpZGVudGl0eSxcbiAgICBcImFycmF5XCI6IGZ1bmN0aW9uKGlucHV0KSB7XG4gICAgICAgIHJldHVybiBzdHJpbmdUb0FycmF5TGlrZShpbnB1dCwgbmV3IEFycmF5KGlucHV0Lmxlbmd0aCkpO1xuICAgIH0sXG4gICAgXCJhcnJheWJ1ZmZlclwiOiBmdW5jdGlvbihpbnB1dCkge1xuICAgICAgICByZXR1cm4gdHJhbnNmb3JtW1wic3RyaW5nXCJdW1widWludDhhcnJheVwiXShpbnB1dCkuYnVmZmVyO1xuICAgIH0sXG4gICAgXCJ1aW50OGFycmF5XCI6IGZ1bmN0aW9uKGlucHV0KSB7XG4gICAgICAgIHJldHVybiBzdHJpbmdUb0FycmF5TGlrZShpbnB1dCwgbmV3IFVpbnQ4QXJyYXkoaW5wdXQubGVuZ3RoKSk7XG4gICAgfSxcbiAgICBcIm5vZGVidWZmZXJcIjogZnVuY3Rpb24oaW5wdXQpIHtcbiAgICAgICAgcmV0dXJuIHN0cmluZ1RvQXJyYXlMaWtlKGlucHV0LCBub2RlQnVmZmVyKGlucHV0Lmxlbmd0aCkpO1xuICAgIH1cbn07XG5cbi8vIGFycmF5IHRvID9cbnRyYW5zZm9ybVtcImFycmF5XCJdID0ge1xuICAgIFwic3RyaW5nXCI6IGFycmF5TGlrZVRvU3RyaW5nLFxuICAgIFwiYXJyYXlcIjogaWRlbnRpdHksXG4gICAgXCJhcnJheWJ1ZmZlclwiOiBmdW5jdGlvbihpbnB1dCkge1xuICAgICAgICByZXR1cm4gKG5ldyBVaW50OEFycmF5KGlucHV0KSkuYnVmZmVyO1xuICAgIH0sXG4gICAgXCJ1aW50OGFycmF5XCI6IGZ1bmN0aW9uKGlucHV0KSB7XG4gICAgICAgIHJldHVybiBuZXcgVWludDhBcnJheShpbnB1dCk7XG4gICAgfSxcbiAgICBcIm5vZGVidWZmZXJcIjogZnVuY3Rpb24oaW5wdXQpIHtcbiAgICAgICAgcmV0dXJuIG5vZGVCdWZmZXIoaW5wdXQpO1xuICAgIH1cbn07XG5cbi8vIGFycmF5YnVmZmVyIHRvID9cbnRyYW5zZm9ybVtcImFycmF5YnVmZmVyXCJdID0ge1xuICAgIFwic3RyaW5nXCI6IGZ1bmN0aW9uKGlucHV0KSB7XG4gICAgICAgIHJldHVybiBhcnJheUxpa2VUb1N0cmluZyhuZXcgVWludDhBcnJheShpbnB1dCkpO1xuICAgIH0sXG4gICAgXCJhcnJheVwiOiBmdW5jdGlvbihpbnB1dCkge1xuICAgICAgICByZXR1cm4gYXJyYXlMaWtlVG9BcnJheUxpa2UobmV3IFVpbnQ4QXJyYXkoaW5wdXQpLCBuZXcgQXJyYXkoaW5wdXQuYnl0ZUxlbmd0aCkpO1xuICAgIH0sXG4gICAgXCJhcnJheWJ1ZmZlclwiOiBpZGVudGl0eSxcbiAgICBcInVpbnQ4YXJyYXlcIjogZnVuY3Rpb24oaW5wdXQpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBVaW50OEFycmF5KGlucHV0KTtcbiAgICB9LFxuICAgIFwibm9kZWJ1ZmZlclwiOiBmdW5jdGlvbihpbnB1dCkge1xuICAgICAgICByZXR1cm4gbm9kZUJ1ZmZlcihuZXcgVWludDhBcnJheShpbnB1dCkpO1xuICAgIH1cbn07XG5cbi8vIHVpbnQ4YXJyYXkgdG8gP1xudHJhbnNmb3JtW1widWludDhhcnJheVwiXSA9IHtcbiAgICBcInN0cmluZ1wiOiBhcnJheUxpa2VUb1N0cmluZyxcbiAgICBcImFycmF5XCI6IGZ1bmN0aW9uKGlucHV0KSB7XG4gICAgICAgIHJldHVybiBhcnJheUxpa2VUb0FycmF5TGlrZShpbnB1dCwgbmV3IEFycmF5KGlucHV0Lmxlbmd0aCkpO1xuICAgIH0sXG4gICAgXCJhcnJheWJ1ZmZlclwiOiBmdW5jdGlvbihpbnB1dCkge1xuICAgICAgICByZXR1cm4gaW5wdXQuYnVmZmVyO1xuICAgIH0sXG4gICAgXCJ1aW50OGFycmF5XCI6IGlkZW50aXR5LFxuICAgIFwibm9kZWJ1ZmZlclwiOiBmdW5jdGlvbihpbnB1dCkge1xuICAgICAgICByZXR1cm4gbm9kZUJ1ZmZlcihpbnB1dCk7XG4gICAgfVxufTtcblxuLy8gbm9kZWJ1ZmZlciB0byA/XG50cmFuc2Zvcm1bXCJub2RlYnVmZmVyXCJdID0ge1xuICAgIFwic3RyaW5nXCI6IGFycmF5TGlrZVRvU3RyaW5nLFxuICAgIFwiYXJyYXlcIjogZnVuY3Rpb24oaW5wdXQpIHtcbiAgICAgICAgcmV0dXJuIGFycmF5TGlrZVRvQXJyYXlMaWtlKGlucHV0LCBuZXcgQXJyYXkoaW5wdXQubGVuZ3RoKSk7XG4gICAgfSxcbiAgICBcImFycmF5YnVmZmVyXCI6IGZ1bmN0aW9uKGlucHV0KSB7XG4gICAgICAgIHJldHVybiB0cmFuc2Zvcm1bXCJub2RlYnVmZmVyXCJdW1widWludDhhcnJheVwiXShpbnB1dCkuYnVmZmVyO1xuICAgIH0sXG4gICAgXCJ1aW50OGFycmF5XCI6IGZ1bmN0aW9uKGlucHV0KSB7XG4gICAgICAgIHJldHVybiBhcnJheUxpa2VUb0FycmF5TGlrZShpbnB1dCwgbmV3IFVpbnQ4QXJyYXkoaW5wdXQubGVuZ3RoKSk7XG4gICAgfSxcbiAgICBcIm5vZGVidWZmZXJcIjogaWRlbnRpdHlcbn07XG5cbi8qKlxuICogVHJhbnNmb3JtIGFuIGlucHV0IGludG8gYW55IHR5cGUuXG4gKiBUaGUgc3VwcG9ydGVkIG91dHB1dCB0eXBlIGFyZSA6IHN0cmluZywgYXJyYXksIHVpbnQ4YXJyYXksIGFycmF5YnVmZmVyLCBub2RlYnVmZmVyLlxuICogSWYgbm8gb3V0cHV0IHR5cGUgaXMgc3BlY2lmaWVkLCB0aGUgdW5tb2RpZmllZCBpbnB1dCB3aWxsIGJlIHJldHVybmVkLlxuICogQHBhcmFtIHtTdHJpbmd9IG91dHB1dFR5cGUgdGhlIG91dHB1dCB0eXBlLlxuICogQHBhcmFtIHtTdHJpbmd8QXJyYXl8QXJyYXlCdWZmZXJ8VWludDhBcnJheXxCdWZmZXJ9IGlucHV0IHRoZSBpbnB1dCB0byBjb252ZXJ0LlxuICogQHRocm93cyB7RXJyb3J9IGFuIEVycm9yIGlmIHRoZSBicm93c2VyIGRvZXNuJ3Qgc3VwcG9ydCB0aGUgcmVxdWVzdGVkIG91dHB1dCB0eXBlLlxuICovXG5leHBvcnRzLnRyYW5zZm9ybVRvID0gZnVuY3Rpb24ob3V0cHV0VHlwZSwgaW5wdXQpIHtcbiAgICBpZiAoIWlucHV0KSB7XG4gICAgICAgIC8vIHVuZGVmaW5lZCwgbnVsbCwgZXRjXG4gICAgICAgIC8vIGFuIGVtcHR5IHN0cmluZyB3b24ndCBoYXJtLlxuICAgICAgICBpbnB1dCA9IFwiXCI7XG4gICAgfVxuICAgIGlmICghb3V0cHV0VHlwZSkge1xuICAgICAgICByZXR1cm4gaW5wdXQ7XG4gICAgfVxuICAgIGV4cG9ydHMuY2hlY2tTdXBwb3J0KG91dHB1dFR5cGUpO1xuICAgIHZhciBpbnB1dFR5cGUgPSBleHBvcnRzLmdldFR5cGVPZihpbnB1dCk7XG4gICAgdmFyIHJlc3VsdCA9IHRyYW5zZm9ybVtpbnB1dFR5cGVdW291dHB1dFR5cGVdKGlucHV0KTtcbiAgICByZXR1cm4gcmVzdWx0O1xufTtcblxuLyoqXG4gKiBSZXR1cm4gdGhlIHR5cGUgb2YgdGhlIGlucHV0LlxuICogVGhlIHR5cGUgd2lsbCBiZSBpbiBhIGZvcm1hdCB2YWxpZCBmb3IgSlNaaXAudXRpbHMudHJhbnNmb3JtVG8gOiBzdHJpbmcsIGFycmF5LCB1aW50OGFycmF5LCBhcnJheWJ1ZmZlci5cbiAqIEBwYXJhbSB7T2JqZWN0fSBpbnB1dCB0aGUgaW5wdXQgdG8gaWRlbnRpZnkuXG4gKiBAcmV0dXJuIHtTdHJpbmd9IHRoZSAobG93ZXJjYXNlKSB0eXBlIG9mIHRoZSBpbnB1dC5cbiAqL1xuZXhwb3J0cy5nZXRUeXBlT2YgPSBmdW5jdGlvbihpbnB1dCkge1xuICAgIGlmICh0eXBlb2YgaW5wdXQgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgcmV0dXJuIFwic3RyaW5nXCI7XG4gICAgfVxuICAgIGlmIChPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoaW5wdXQpID09PSBcIltvYmplY3QgQXJyYXldXCIpIHtcbiAgICAgICAgcmV0dXJuIFwiYXJyYXlcIjtcbiAgICB9XG4gICAgaWYgKHN1cHBvcnQubm9kZWJ1ZmZlciAmJiBub2RlQnVmZmVyLnRlc3QoaW5wdXQpKSB7XG4gICAgICAgIHJldHVybiBcIm5vZGVidWZmZXJcIjtcbiAgICB9XG4gICAgaWYgKHN1cHBvcnQudWludDhhcnJheSAmJiBpbnB1dCBpbnN0YW5jZW9mIFVpbnQ4QXJyYXkpIHtcbiAgICAgICAgcmV0dXJuIFwidWludDhhcnJheVwiO1xuICAgIH1cbiAgICBpZiAoc3VwcG9ydC5hcnJheWJ1ZmZlciAmJiBpbnB1dCBpbnN0YW5jZW9mIEFycmF5QnVmZmVyKSB7XG4gICAgICAgIHJldHVybiBcImFycmF5YnVmZmVyXCI7XG4gICAgfVxufTtcblxuLyoqXG4gKiBUaHJvdyBhbiBleGNlcHRpb24gaWYgdGhlIHR5cGUgaXMgbm90IHN1cHBvcnRlZC5cbiAqIEBwYXJhbSB7U3RyaW5nfSB0eXBlIHRoZSB0eXBlIHRvIGNoZWNrLlxuICogQHRocm93cyB7RXJyb3J9IGFuIEVycm9yIGlmIHRoZSBicm93c2VyIGRvZXNuJ3Qgc3VwcG9ydCB0aGUgcmVxdWVzdGVkIHR5cGUuXG4gKi9cbmV4cG9ydHMuY2hlY2tTdXBwb3J0ID0gZnVuY3Rpb24odHlwZSkge1xuICAgIHZhciBzdXBwb3J0ZWQgPSBzdXBwb3J0W3R5cGUudG9Mb3dlckNhc2UoKV07XG4gICAgaWYgKCFzdXBwb3J0ZWQpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKHR5cGUgKyBcIiBpcyBub3Qgc3VwcG9ydGVkIGJ5IHRoaXMgYnJvd3NlclwiKTtcbiAgICB9XG59O1xuZXhwb3J0cy5NQVhfVkFMVUVfMTZCSVRTID0gNjU1MzU7XG5leHBvcnRzLk1BWF9WQUxVRV8zMkJJVFMgPSAtMTsgLy8gd2VsbCwgXCJcXHhGRlxceEZGXFx4RkZcXHhGRlxceEZGXFx4RkZcXHhGRlxceEZGXCIgaXMgcGFyc2VkIGFzIC0xXG5cbi8qKlxuICogUHJldHRpZnkgYSBzdHJpbmcgcmVhZCBhcyBiaW5hcnkuXG4gKiBAcGFyYW0ge3N0cmluZ30gc3RyIHRoZSBzdHJpbmcgdG8gcHJldHRpZnkuXG4gKiBAcmV0dXJuIHtzdHJpbmd9IGEgcHJldHR5IHN0cmluZy5cbiAqL1xuZXhwb3J0cy5wcmV0dHkgPSBmdW5jdGlvbihzdHIpIHtcbiAgICB2YXIgcmVzID0gJycsXG4gICAgICAgIGNvZGUsIGk7XG4gICAgZm9yIChpID0gMDsgaSA8IChzdHIgfHwgXCJcIikubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgY29kZSA9IHN0ci5jaGFyQ29kZUF0KGkpO1xuICAgICAgICByZXMgKz0gJ1xcXFx4JyArIChjb2RlIDwgMTYgPyBcIjBcIiA6IFwiXCIpICsgY29kZS50b1N0cmluZygxNikudG9VcHBlckNhc2UoKTtcbiAgICB9XG4gICAgcmV0dXJuIHJlcztcbn07XG5cbi8qKlxuICogRmluZCBhIGNvbXByZXNzaW9uIHJlZ2lzdGVyZWQgaW4gSlNaaXAuXG4gKiBAcGFyYW0ge3N0cmluZ30gY29tcHJlc3Npb25NZXRob2QgdGhlIG1ldGhvZCBtYWdpYyB0byBmaW5kLlxuICogQHJldHVybiB7T2JqZWN0fG51bGx9IHRoZSBKU1ppcCBjb21wcmVzc2lvbiBvYmplY3QsIG51bGwgaWYgbm9uZSBmb3VuZC5cbiAqL1xuZXhwb3J0cy5maW5kQ29tcHJlc3Npb24gPSBmdW5jdGlvbihjb21wcmVzc2lvbk1ldGhvZCkge1xuICAgIGZvciAodmFyIG1ldGhvZCBpbiBjb21wcmVzc2lvbnMpIHtcbiAgICAgICAgaWYgKCFjb21wcmVzc2lvbnMuaGFzT3duUHJvcGVydHkobWV0aG9kKSkge1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGNvbXByZXNzaW9uc1ttZXRob2RdLm1hZ2ljID09PSBjb21wcmVzc2lvbk1ldGhvZCkge1xuICAgICAgICAgICAgcmV0dXJuIGNvbXByZXNzaW9uc1ttZXRob2RdO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBudWxsO1xufTtcbi8qKlxuKiBDcm9zcy13aW5kb3csIGNyb3NzLU5vZGUtY29udGV4dCByZWd1bGFyIGV4cHJlc3Npb24gZGV0ZWN0aW9uXG4qIEBwYXJhbSAge09iamVjdH0gIG9iamVjdCBBbnl0aGluZ1xuKiBAcmV0dXJuIHtCb29sZWFufSAgICAgICAgdHJ1ZSBpZiB0aGUgb2JqZWN0IGlzIGEgcmVndWxhciBleHByZXNzaW9uLFxuKiBmYWxzZSBvdGhlcndpc2VcbiovXG5leHBvcnRzLmlzUmVnRXhwID0gZnVuY3Rpb24gKG9iamVjdCkge1xuICAgIHJldHVybiBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwob2JqZWN0KSA9PT0gXCJbb2JqZWN0IFJlZ0V4cF1cIjtcbn07XG5cblxufSx7XCIuL2NvbXByZXNzaW9uc1wiOjMsXCIuL25vZGVCdWZmZXJcIjoxMSxcIi4vc3VwcG9ydFwiOjE3fV0sMjI6W2Z1bmN0aW9uKF9kZXJlcV8sbW9kdWxlLGV4cG9ydHMpe1xuJ3VzZSBzdHJpY3QnO1xudmFyIFN0cmluZ1JlYWRlciA9IF9kZXJlcV8oJy4vc3RyaW5nUmVhZGVyJyk7XG52YXIgTm9kZUJ1ZmZlclJlYWRlciA9IF9kZXJlcV8oJy4vbm9kZUJ1ZmZlclJlYWRlcicpO1xudmFyIFVpbnQ4QXJyYXlSZWFkZXIgPSBfZGVyZXFfKCcuL3VpbnQ4QXJyYXlSZWFkZXInKTtcbnZhciB1dGlscyA9IF9kZXJlcV8oJy4vdXRpbHMnKTtcbnZhciBzaWcgPSBfZGVyZXFfKCcuL3NpZ25hdHVyZScpO1xudmFyIFppcEVudHJ5ID0gX2RlcmVxXygnLi96aXBFbnRyeScpO1xudmFyIHN1cHBvcnQgPSBfZGVyZXFfKCcuL3N1cHBvcnQnKTtcbnZhciBqc3ppcFByb3RvID0gX2RlcmVxXygnLi9vYmplY3QnKTtcbi8vICBjbGFzcyBaaXBFbnRyaWVzIHt7e1xuLyoqXG4gKiBBbGwgdGhlIGVudHJpZXMgaW4gdGhlIHppcCBmaWxlLlxuICogQGNvbnN0cnVjdG9yXG4gKiBAcGFyYW0ge1N0cmluZ3xBcnJheUJ1ZmZlcnxVaW50OEFycmF5fSBkYXRhIHRoZSBiaW5hcnkgc3RyZWFtIHRvIGxvYWQuXG4gKiBAcGFyYW0ge09iamVjdH0gbG9hZE9wdGlvbnMgT3B0aW9ucyBmb3IgbG9hZGluZyB0aGUgc3RyZWFtLlxuICovXG5mdW5jdGlvbiBaaXBFbnRyaWVzKGRhdGEsIGxvYWRPcHRpb25zKSB7XG4gICAgdGhpcy5maWxlcyA9IFtdO1xuICAgIHRoaXMubG9hZE9wdGlvbnMgPSBsb2FkT3B0aW9ucztcbiAgICBpZiAoZGF0YSkge1xuICAgICAgICB0aGlzLmxvYWQoZGF0YSk7XG4gICAgfVxufVxuWmlwRW50cmllcy5wcm90b3R5cGUgPSB7XG4gICAgLyoqXG4gICAgICogQ2hlY2sgdGhhdCB0aGUgcmVhZGVyIGlzIG9uIHRoZSBzcGVmaWNpZWQgc2lnbmF0dXJlLlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBleHBlY3RlZFNpZ25hdHVyZSB0aGUgZXhwZWN0ZWQgc2lnbmF0dXJlLlxuICAgICAqIEB0aHJvd3Mge0Vycm9yfSBpZiBpdCBpcyBhbiBvdGhlciBzaWduYXR1cmUuXG4gICAgICovXG4gICAgY2hlY2tTaWduYXR1cmU6IGZ1bmN0aW9uKGV4cGVjdGVkU2lnbmF0dXJlKSB7XG4gICAgICAgIHZhciBzaWduYXR1cmUgPSB0aGlzLnJlYWRlci5yZWFkU3RyaW5nKDQpO1xuICAgICAgICBpZiAoc2lnbmF0dXJlICE9PSBleHBlY3RlZFNpZ25hdHVyZSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiQ29ycnVwdGVkIHppcCBvciBidWcgOiB1bmV4cGVjdGVkIHNpZ25hdHVyZSBcIiArIFwiKFwiICsgdXRpbHMucHJldHR5KHNpZ25hdHVyZSkgKyBcIiwgZXhwZWN0ZWQgXCIgKyB1dGlscy5wcmV0dHkoZXhwZWN0ZWRTaWduYXR1cmUpICsgXCIpXCIpO1xuICAgICAgICB9XG4gICAgfSxcbiAgICAvKipcbiAgICAgKiBSZWFkIHRoZSBlbmQgb2YgdGhlIGNlbnRyYWwgZGlyZWN0b3J5LlxuICAgICAqL1xuICAgIHJlYWRCbG9ja0VuZE9mQ2VudHJhbDogZnVuY3Rpb24oKSB7XG4gICAgICAgIHRoaXMuZGlza051bWJlciA9IHRoaXMucmVhZGVyLnJlYWRJbnQoMik7XG4gICAgICAgIHRoaXMuZGlza1dpdGhDZW50cmFsRGlyU3RhcnQgPSB0aGlzLnJlYWRlci5yZWFkSW50KDIpO1xuICAgICAgICB0aGlzLmNlbnRyYWxEaXJSZWNvcmRzT25UaGlzRGlzayA9IHRoaXMucmVhZGVyLnJlYWRJbnQoMik7XG4gICAgICAgIHRoaXMuY2VudHJhbERpclJlY29yZHMgPSB0aGlzLnJlYWRlci5yZWFkSW50KDIpO1xuICAgICAgICB0aGlzLmNlbnRyYWxEaXJTaXplID0gdGhpcy5yZWFkZXIucmVhZEludCg0KTtcbiAgICAgICAgdGhpcy5jZW50cmFsRGlyT2Zmc2V0ID0gdGhpcy5yZWFkZXIucmVhZEludCg0KTtcblxuICAgICAgICB0aGlzLnppcENvbW1lbnRMZW5ndGggPSB0aGlzLnJlYWRlci5yZWFkSW50KDIpO1xuICAgICAgICAvLyB3YXJuaW5nIDogdGhlIGVuY29kaW5nIGRlcGVuZHMgb2YgdGhlIHN5c3RlbSBsb2NhbGVcbiAgICAgICAgLy8gT24gYSBsaW51eCBtYWNoaW5lIHdpdGggTEFORz1lbl9VUy51dGY4LCB0aGlzIGZpZWxkIGlzIHV0ZjggZW5jb2RlZC5cbiAgICAgICAgLy8gT24gYSB3aW5kb3dzIG1hY2hpbmUsIHRoaXMgZmllbGQgaXMgZW5jb2RlZCB3aXRoIHRoZSBsb2NhbGl6ZWQgd2luZG93cyBjb2RlIHBhZ2UuXG4gICAgICAgIHRoaXMuemlwQ29tbWVudCA9IHRoaXMucmVhZGVyLnJlYWRTdHJpbmcodGhpcy56aXBDb21tZW50TGVuZ3RoKTtcbiAgICAgICAgLy8gVG8gZ2V0IGNvbnNpc3RlbnQgYmVoYXZpb3Igd2l0aCB0aGUgZ2VuZXJhdGlvbiBwYXJ0LCB3ZSB3aWxsIGFzc3VtZSB0aGF0XG4gICAgICAgIC8vIHRoaXMgaXMgdXRmOCBlbmNvZGVkLlxuICAgICAgICB0aGlzLnppcENvbW1lbnQgPSBqc3ppcFByb3RvLnV0ZjhkZWNvZGUodGhpcy56aXBDb21tZW50KTtcbiAgICB9LFxuICAgIC8qKlxuICAgICAqIFJlYWQgdGhlIGVuZCBvZiB0aGUgWmlwIDY0IGNlbnRyYWwgZGlyZWN0b3J5LlxuICAgICAqIE5vdCBtZXJnZWQgd2l0aCB0aGUgbWV0aG9kIHJlYWRFbmRPZkNlbnRyYWwgOlxuICAgICAqIFRoZSBlbmQgb2YgY2VudHJhbCBjYW4gY29leGlzdCB3aXRoIGl0cyBaaXA2NCBicm90aGVyLFxuICAgICAqIEkgZG9uJ3Qgd2FudCB0byByZWFkIHRoZSB3cm9uZyBudW1iZXIgb2YgYnl0ZXMgIVxuICAgICAqL1xuICAgIHJlYWRCbG9ja1ppcDY0RW5kT2ZDZW50cmFsOiBmdW5jdGlvbigpIHtcbiAgICAgICAgdGhpcy56aXA2NEVuZE9mQ2VudHJhbFNpemUgPSB0aGlzLnJlYWRlci5yZWFkSW50KDgpO1xuICAgICAgICB0aGlzLnZlcnNpb25NYWRlQnkgPSB0aGlzLnJlYWRlci5yZWFkU3RyaW5nKDIpO1xuICAgICAgICB0aGlzLnZlcnNpb25OZWVkZWQgPSB0aGlzLnJlYWRlci5yZWFkSW50KDIpO1xuICAgICAgICB0aGlzLmRpc2tOdW1iZXIgPSB0aGlzLnJlYWRlci5yZWFkSW50KDQpO1xuICAgICAgICB0aGlzLmRpc2tXaXRoQ2VudHJhbERpclN0YXJ0ID0gdGhpcy5yZWFkZXIucmVhZEludCg0KTtcbiAgICAgICAgdGhpcy5jZW50cmFsRGlyUmVjb3Jkc09uVGhpc0Rpc2sgPSB0aGlzLnJlYWRlci5yZWFkSW50KDgpO1xuICAgICAgICB0aGlzLmNlbnRyYWxEaXJSZWNvcmRzID0gdGhpcy5yZWFkZXIucmVhZEludCg4KTtcbiAgICAgICAgdGhpcy5jZW50cmFsRGlyU2l6ZSA9IHRoaXMucmVhZGVyLnJlYWRJbnQoOCk7XG4gICAgICAgIHRoaXMuY2VudHJhbERpck9mZnNldCA9IHRoaXMucmVhZGVyLnJlYWRJbnQoOCk7XG5cbiAgICAgICAgdGhpcy56aXA2NEV4dGVuc2libGVEYXRhID0ge307XG4gICAgICAgIHZhciBleHRyYURhdGFTaXplID0gdGhpcy56aXA2NEVuZE9mQ2VudHJhbFNpemUgLSA0NCxcbiAgICAgICAgICAgIGluZGV4ID0gMCxcbiAgICAgICAgICAgIGV4dHJhRmllbGRJZCxcbiAgICAgICAgICAgIGV4dHJhRmllbGRMZW5ndGgsXG4gICAgICAgICAgICBleHRyYUZpZWxkVmFsdWU7XG4gICAgICAgIHdoaWxlIChpbmRleCA8IGV4dHJhRGF0YVNpemUpIHtcbiAgICAgICAgICAgIGV4dHJhRmllbGRJZCA9IHRoaXMucmVhZGVyLnJlYWRJbnQoMik7XG4gICAgICAgICAgICBleHRyYUZpZWxkTGVuZ3RoID0gdGhpcy5yZWFkZXIucmVhZEludCg0KTtcbiAgICAgICAgICAgIGV4dHJhRmllbGRWYWx1ZSA9IHRoaXMucmVhZGVyLnJlYWRTdHJpbmcoZXh0cmFGaWVsZExlbmd0aCk7XG4gICAgICAgICAgICB0aGlzLnppcDY0RXh0ZW5zaWJsZURhdGFbZXh0cmFGaWVsZElkXSA9IHtcbiAgICAgICAgICAgICAgICBpZDogZXh0cmFGaWVsZElkLFxuICAgICAgICAgICAgICAgIGxlbmd0aDogZXh0cmFGaWVsZExlbmd0aCxcbiAgICAgICAgICAgICAgICB2YWx1ZTogZXh0cmFGaWVsZFZhbHVlXG4gICAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgfSxcbiAgICAvKipcbiAgICAgKiBSZWFkIHRoZSBlbmQgb2YgdGhlIFppcCA2NCBjZW50cmFsIGRpcmVjdG9yeSBsb2NhdG9yLlxuICAgICAqL1xuICAgIHJlYWRCbG9ja1ppcDY0RW5kT2ZDZW50cmFsTG9jYXRvcjogZnVuY3Rpb24oKSB7XG4gICAgICAgIHRoaXMuZGlza1dpdGhaaXA2NENlbnRyYWxEaXJTdGFydCA9IHRoaXMucmVhZGVyLnJlYWRJbnQoNCk7XG4gICAgICAgIHRoaXMucmVsYXRpdmVPZmZzZXRFbmRPZlppcDY0Q2VudHJhbERpciA9IHRoaXMucmVhZGVyLnJlYWRJbnQoOCk7XG4gICAgICAgIHRoaXMuZGlza3NDb3VudCA9IHRoaXMucmVhZGVyLnJlYWRJbnQoNCk7XG4gICAgICAgIGlmICh0aGlzLmRpc2tzQ291bnQgPiAxKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJNdWx0aS12b2x1bWVzIHppcCBhcmUgbm90IHN1cHBvcnRlZFwiKTtcbiAgICAgICAgfVxuICAgIH0sXG4gICAgLyoqXG4gICAgICogUmVhZCB0aGUgbG9jYWwgZmlsZXMsIGJhc2VkIG9uIHRoZSBvZmZzZXQgcmVhZCBpbiB0aGUgY2VudHJhbCBwYXJ0LlxuICAgICAqL1xuICAgIHJlYWRMb2NhbEZpbGVzOiBmdW5jdGlvbigpIHtcbiAgICAgICAgdmFyIGksIGZpbGU7XG4gICAgICAgIGZvciAoaSA9IDA7IGkgPCB0aGlzLmZpbGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBmaWxlID0gdGhpcy5maWxlc1tpXTtcbiAgICAgICAgICAgIHRoaXMucmVhZGVyLnNldEluZGV4KGZpbGUubG9jYWxIZWFkZXJPZmZzZXQpO1xuICAgICAgICAgICAgdGhpcy5jaGVja1NpZ25hdHVyZShzaWcuTE9DQUxfRklMRV9IRUFERVIpO1xuICAgICAgICAgICAgZmlsZS5yZWFkTG9jYWxQYXJ0KHRoaXMucmVhZGVyKTtcbiAgICAgICAgICAgIGZpbGUuaGFuZGxlVVRGOCgpO1xuICAgICAgICB9XG4gICAgfSxcbiAgICAvKipcbiAgICAgKiBSZWFkIHRoZSBjZW50cmFsIGRpcmVjdG9yeS5cbiAgICAgKi9cbiAgICByZWFkQ2VudHJhbERpcjogZnVuY3Rpb24oKSB7XG4gICAgICAgIHZhciBmaWxlO1xuXG4gICAgICAgIHRoaXMucmVhZGVyLnNldEluZGV4KHRoaXMuY2VudHJhbERpck9mZnNldCk7XG4gICAgICAgIHdoaWxlICh0aGlzLnJlYWRlci5yZWFkU3RyaW5nKDQpID09PSBzaWcuQ0VOVFJBTF9GSUxFX0hFQURFUikge1xuICAgICAgICAgICAgZmlsZSA9IG5ldyBaaXBFbnRyeSh7XG4gICAgICAgICAgICAgICAgemlwNjQ6IHRoaXMuemlwNjRcbiAgICAgICAgICAgIH0sIHRoaXMubG9hZE9wdGlvbnMpO1xuICAgICAgICAgICAgZmlsZS5yZWFkQ2VudHJhbFBhcnQodGhpcy5yZWFkZXIpO1xuICAgICAgICAgICAgdGhpcy5maWxlcy5wdXNoKGZpbGUpO1xuICAgICAgICB9XG4gICAgfSxcbiAgICAvKipcbiAgICAgKiBSZWFkIHRoZSBlbmQgb2YgY2VudHJhbCBkaXJlY3RvcnkuXG4gICAgICovXG4gICAgcmVhZEVuZE9mQ2VudHJhbDogZnVuY3Rpb24oKSB7XG4gICAgICAgIHZhciBvZmZzZXQgPSB0aGlzLnJlYWRlci5sYXN0SW5kZXhPZlNpZ25hdHVyZShzaWcuQ0VOVFJBTF9ESVJFQ1RPUllfRU5EKTtcbiAgICAgICAgaWYgKG9mZnNldCA9PT0gLTEpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIkNvcnJ1cHRlZCB6aXAgOiBjYW4ndCBmaW5kIGVuZCBvZiBjZW50cmFsIGRpcmVjdG9yeVwiKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnJlYWRlci5zZXRJbmRleChvZmZzZXQpO1xuICAgICAgICB0aGlzLmNoZWNrU2lnbmF0dXJlKHNpZy5DRU5UUkFMX0RJUkVDVE9SWV9FTkQpO1xuICAgICAgICB0aGlzLnJlYWRCbG9ja0VuZE9mQ2VudHJhbCgpO1xuXG5cbiAgICAgICAgLyogZXh0cmFjdCBmcm9tIHRoZSB6aXAgc3BlYyA6XG4gICAgICAgICAgICA0KSAgSWYgb25lIG9mIHRoZSBmaWVsZHMgaW4gdGhlIGVuZCBvZiBjZW50cmFsIGRpcmVjdG9yeVxuICAgICAgICAgICAgICAgIHJlY29yZCBpcyB0b28gc21hbGwgdG8gaG9sZCByZXF1aXJlZCBkYXRhLCB0aGUgZmllbGRcbiAgICAgICAgICAgICAgICBzaG91bGQgYmUgc2V0IHRvIC0xICgweEZGRkYgb3IgMHhGRkZGRkZGRikgYW5kIHRoZVxuICAgICAgICAgICAgICAgIFpJUDY0IGZvcm1hdCByZWNvcmQgc2hvdWxkIGJlIGNyZWF0ZWQuXG4gICAgICAgICAgICA1KSAgVGhlIGVuZCBvZiBjZW50cmFsIGRpcmVjdG9yeSByZWNvcmQgYW5kIHRoZVxuICAgICAgICAgICAgICAgIFppcDY0IGVuZCBvZiBjZW50cmFsIGRpcmVjdG9yeSBsb2NhdG9yIHJlY29yZCBtdXN0XG4gICAgICAgICAgICAgICAgcmVzaWRlIG9uIHRoZSBzYW1lIGRpc2sgd2hlbiBzcGxpdHRpbmcgb3Igc3Bhbm5pbmdcbiAgICAgICAgICAgICAgICBhbiBhcmNoaXZlLlxuICAgICAgICAgKi9cbiAgICAgICAgaWYgKHRoaXMuZGlza051bWJlciA9PT0gdXRpbHMuTUFYX1ZBTFVFXzE2QklUUyB8fCB0aGlzLmRpc2tXaXRoQ2VudHJhbERpclN0YXJ0ID09PSB1dGlscy5NQVhfVkFMVUVfMTZCSVRTIHx8IHRoaXMuY2VudHJhbERpclJlY29yZHNPblRoaXNEaXNrID09PSB1dGlscy5NQVhfVkFMVUVfMTZCSVRTIHx8IHRoaXMuY2VudHJhbERpclJlY29yZHMgPT09IHV0aWxzLk1BWF9WQUxVRV8xNkJJVFMgfHwgdGhpcy5jZW50cmFsRGlyU2l6ZSA9PT0gdXRpbHMuTUFYX1ZBTFVFXzMyQklUUyB8fCB0aGlzLmNlbnRyYWxEaXJPZmZzZXQgPT09IHV0aWxzLk1BWF9WQUxVRV8zMkJJVFMpIHtcbiAgICAgICAgICAgIHRoaXMuemlwNjQgPSB0cnVlO1xuXG4gICAgICAgICAgICAvKlxuICAgICAgICAgICAgV2FybmluZyA6IHRoZSB6aXA2NCBleHRlbnNpb24gaXMgc3VwcG9ydGVkLCBidXQgT05MWSBpZiB0aGUgNjRiaXRzIGludGVnZXIgcmVhZCBmcm9tXG4gICAgICAgICAgICB0aGUgemlwIGZpbGUgY2FuIGZpdCBpbnRvIGEgMzJiaXRzIGludGVnZXIuIFRoaXMgY2Fubm90IGJlIHNvbHZlZCA6IEphdmFzY3JpcHQgcmVwcmVzZW50c1xuICAgICAgICAgICAgYWxsIG51bWJlcnMgYXMgNjQtYml0IGRvdWJsZSBwcmVjaXNpb24gSUVFRSA3NTQgZmxvYXRpbmcgcG9pbnQgbnVtYmVycy5cbiAgICAgICAgICAgIFNvLCB3ZSBoYXZlIDUzYml0cyBmb3IgaW50ZWdlcnMgYW5kIGJpdHdpc2Ugb3BlcmF0aW9ucyB0cmVhdCBldmVyeXRoaW5nIGFzIDMyYml0cy5cbiAgICAgICAgICAgIHNlZSBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL0phdmFTY3JpcHQvUmVmZXJlbmNlL09wZXJhdG9ycy9CaXR3aXNlX09wZXJhdG9yc1xuICAgICAgICAgICAgYW5kIGh0dHA6Ly93d3cuZWNtYS1pbnRlcm5hdGlvbmFsLm9yZy9wdWJsaWNhdGlvbnMvZmlsZXMvRUNNQS1TVC9FQ01BLTI2Mi5wZGYgc2VjdGlvbiA4LjVcbiAgICAgICAgICAgICovXG5cbiAgICAgICAgICAgIC8vIHNob3VsZCBsb29rIGZvciBhIHppcDY0IEVPQ0QgbG9jYXRvclxuICAgICAgICAgICAgb2Zmc2V0ID0gdGhpcy5yZWFkZXIubGFzdEluZGV4T2ZTaWduYXR1cmUoc2lnLlpJUDY0X0NFTlRSQUxfRElSRUNUT1JZX0xPQ0FUT1IpO1xuICAgICAgICAgICAgaWYgKG9mZnNldCA9PT0gLTEpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJDb3JydXB0ZWQgemlwIDogY2FuJ3QgZmluZCB0aGUgWklQNjQgZW5kIG9mIGNlbnRyYWwgZGlyZWN0b3J5IGxvY2F0b3JcIik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLnJlYWRlci5zZXRJbmRleChvZmZzZXQpO1xuICAgICAgICAgICAgdGhpcy5jaGVja1NpZ25hdHVyZShzaWcuWklQNjRfQ0VOVFJBTF9ESVJFQ1RPUllfTE9DQVRPUik7XG4gICAgICAgICAgICB0aGlzLnJlYWRCbG9ja1ppcDY0RW5kT2ZDZW50cmFsTG9jYXRvcigpO1xuXG4gICAgICAgICAgICAvLyBub3cgdGhlIHppcDY0IEVPQ0QgcmVjb3JkXG4gICAgICAgICAgICB0aGlzLnJlYWRlci5zZXRJbmRleCh0aGlzLnJlbGF0aXZlT2Zmc2V0RW5kT2ZaaXA2NENlbnRyYWxEaXIpO1xuICAgICAgICAgICAgdGhpcy5jaGVja1NpZ25hdHVyZShzaWcuWklQNjRfQ0VOVFJBTF9ESVJFQ1RPUllfRU5EKTtcbiAgICAgICAgICAgIHRoaXMucmVhZEJsb2NrWmlwNjRFbmRPZkNlbnRyYWwoKTtcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcHJlcGFyZVJlYWRlcjogZnVuY3Rpb24oZGF0YSkge1xuICAgICAgICB2YXIgdHlwZSA9IHV0aWxzLmdldFR5cGVPZihkYXRhKTtcbiAgICAgICAgaWYgKHR5cGUgPT09IFwic3RyaW5nXCIgJiYgIXN1cHBvcnQudWludDhhcnJheSkge1xuICAgICAgICAgICAgdGhpcy5yZWFkZXIgPSBuZXcgU3RyaW5nUmVhZGVyKGRhdGEsIHRoaXMubG9hZE9wdGlvbnMub3B0aW1pemVkQmluYXJ5U3RyaW5nKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmICh0eXBlID09PSBcIm5vZGVidWZmZXJcIikge1xuICAgICAgICAgICAgdGhpcy5yZWFkZXIgPSBuZXcgTm9kZUJ1ZmZlclJlYWRlcihkYXRhKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMucmVhZGVyID0gbmV3IFVpbnQ4QXJyYXlSZWFkZXIodXRpbHMudHJhbnNmb3JtVG8oXCJ1aW50OGFycmF5XCIsIGRhdGEpKTtcbiAgICAgICAgfVxuICAgIH0sXG4gICAgLyoqXG4gICAgICogUmVhZCBhIHppcCBmaWxlIGFuZCBjcmVhdGUgWmlwRW50cmllcy5cbiAgICAgKiBAcGFyYW0ge1N0cmluZ3xBcnJheUJ1ZmZlcnxVaW50OEFycmF5fEJ1ZmZlcn0gZGF0YSB0aGUgYmluYXJ5IHN0cmluZyByZXByZXNlbnRpbmcgYSB6aXAgZmlsZS5cbiAgICAgKi9cbiAgICBsb2FkOiBmdW5jdGlvbihkYXRhKSB7XG4gICAgICAgIHRoaXMucHJlcGFyZVJlYWRlcihkYXRhKTtcbiAgICAgICAgdGhpcy5yZWFkRW5kT2ZDZW50cmFsKCk7XG4gICAgICAgIHRoaXMucmVhZENlbnRyYWxEaXIoKTtcbiAgICAgICAgdGhpcy5yZWFkTG9jYWxGaWxlcygpO1xuICAgIH1cbn07XG4vLyB9fX0gZW5kIG9mIFppcEVudHJpZXNcbm1vZHVsZS5leHBvcnRzID0gWmlwRW50cmllcztcblxufSx7XCIuL25vZGVCdWZmZXJSZWFkZXJcIjoxMixcIi4vb2JqZWN0XCI6MTMsXCIuL3NpZ25hdHVyZVwiOjE0LFwiLi9zdHJpbmdSZWFkZXJcIjoxNSxcIi4vc3VwcG9ydFwiOjE3LFwiLi91aW50OEFycmF5UmVhZGVyXCI6MTgsXCIuL3V0aWxzXCI6MjEsXCIuL3ppcEVudHJ5XCI6MjN9XSwyMzpbZnVuY3Rpb24oX2RlcmVxXyxtb2R1bGUsZXhwb3J0cyl7XG4ndXNlIHN0cmljdCc7XG52YXIgU3RyaW5nUmVhZGVyID0gX2RlcmVxXygnLi9zdHJpbmdSZWFkZXInKTtcbnZhciB1dGlscyA9IF9kZXJlcV8oJy4vdXRpbHMnKTtcbnZhciBDb21wcmVzc2VkT2JqZWN0ID0gX2RlcmVxXygnLi9jb21wcmVzc2VkT2JqZWN0Jyk7XG52YXIganN6aXBQcm90byA9IF9kZXJlcV8oJy4vb2JqZWN0Jyk7XG4vLyBjbGFzcyBaaXBFbnRyeSB7e3tcbi8qKlxuICogQW4gZW50cnkgaW4gdGhlIHppcCBmaWxlLlxuICogQGNvbnN0cnVjdG9yXG4gKiBAcGFyYW0ge09iamVjdH0gb3B0aW9ucyBPcHRpb25zIG9mIHRoZSBjdXJyZW50IGZpbGUuXG4gKiBAcGFyYW0ge09iamVjdH0gbG9hZE9wdGlvbnMgT3B0aW9ucyBmb3IgbG9hZGluZyB0aGUgc3RyZWFtLlxuICovXG5mdW5jdGlvbiBaaXBFbnRyeShvcHRpb25zLCBsb2FkT3B0aW9ucykge1xuICAgIHRoaXMub3B0aW9ucyA9IG9wdGlvbnM7XG4gICAgdGhpcy5sb2FkT3B0aW9ucyA9IGxvYWRPcHRpb25zO1xufVxuWmlwRW50cnkucHJvdG90eXBlID0ge1xuICAgIC8qKlxuICAgICAqIHNheSBpZiB0aGUgZmlsZSBpcyBlbmNyeXB0ZWQuXG4gICAgICogQHJldHVybiB7Ym9vbGVhbn0gdHJ1ZSBpZiB0aGUgZmlsZSBpcyBlbmNyeXB0ZWQsIGZhbHNlIG90aGVyd2lzZS5cbiAgICAgKi9cbiAgICBpc0VuY3J5cHRlZDogZnVuY3Rpb24oKSB7XG4gICAgICAgIC8vIGJpdCAxIGlzIHNldFxuICAgICAgICByZXR1cm4gKHRoaXMuYml0RmxhZyAmIDB4MDAwMSkgPT09IDB4MDAwMTtcbiAgICB9LFxuICAgIC8qKlxuICAgICAqIHNheSBpZiB0aGUgZmlsZSBoYXMgdXRmLTggZmlsZW5hbWUvY29tbWVudC5cbiAgICAgKiBAcmV0dXJuIHtib29sZWFufSB0cnVlIGlmIHRoZSBmaWxlbmFtZS9jb21tZW50IGlzIGluIHV0Zi04LCBmYWxzZSBvdGhlcndpc2UuXG4gICAgICovXG4gICAgdXNlVVRGODogZnVuY3Rpb24oKSB7XG4gICAgICAgIC8vIGJpdCAxMSBpcyBzZXRcbiAgICAgICAgcmV0dXJuICh0aGlzLmJpdEZsYWcgJiAweDA4MDApID09PSAweDA4MDA7XG4gICAgfSxcbiAgICAvKipcbiAgICAgKiBQcmVwYXJlIHRoZSBmdW5jdGlvbiB1c2VkIHRvIGdlbmVyYXRlIHRoZSBjb21wcmVzc2VkIGNvbnRlbnQgZnJvbSB0aGlzIFppcEZpbGUuXG4gICAgICogQHBhcmFtIHtEYXRhUmVhZGVyfSByZWFkZXIgdGhlIHJlYWRlciB0byB1c2UuXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IGZyb20gdGhlIG9mZnNldCBmcm9tIHdoZXJlIHdlIHNob3VsZCByZWFkIHRoZSBkYXRhLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBsZW5ndGggdGhlIGxlbmd0aCBvZiB0aGUgZGF0YSB0byByZWFkLlxuICAgICAqIEByZXR1cm4ge0Z1bmN0aW9ufSB0aGUgY2FsbGJhY2sgdG8gZ2V0IHRoZSBjb21wcmVzc2VkIGNvbnRlbnQgKHRoZSB0eXBlIGRlcGVuZHMgb2YgdGhlIERhdGFSZWFkZXIgY2xhc3MpLlxuICAgICAqL1xuICAgIHByZXBhcmVDb21wcmVzc2VkQ29udGVudDogZnVuY3Rpb24ocmVhZGVyLCBmcm9tLCBsZW5ndGgpIHtcbiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgdmFyIHByZXZpb3VzSW5kZXggPSByZWFkZXIuaW5kZXg7XG4gICAgICAgICAgICByZWFkZXIuc2V0SW5kZXgoZnJvbSk7XG4gICAgICAgICAgICB2YXIgY29tcHJlc3NlZEZpbGVEYXRhID0gcmVhZGVyLnJlYWREYXRhKGxlbmd0aCk7XG4gICAgICAgICAgICByZWFkZXIuc2V0SW5kZXgocHJldmlvdXNJbmRleCk7XG5cbiAgICAgICAgICAgIHJldHVybiBjb21wcmVzc2VkRmlsZURhdGE7XG4gICAgICAgIH07XG4gICAgfSxcbiAgICAvKipcbiAgICAgKiBQcmVwYXJlIHRoZSBmdW5jdGlvbiB1c2VkIHRvIGdlbmVyYXRlIHRoZSB1bmNvbXByZXNzZWQgY29udGVudCBmcm9tIHRoaXMgWmlwRmlsZS5cbiAgICAgKiBAcGFyYW0ge0RhdGFSZWFkZXJ9IHJlYWRlciB0aGUgcmVhZGVyIHRvIHVzZS5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gZnJvbSB0aGUgb2Zmc2V0IGZyb20gd2hlcmUgd2Ugc2hvdWxkIHJlYWQgdGhlIGRhdGEuXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IGxlbmd0aCB0aGUgbGVuZ3RoIG9mIHRoZSBkYXRhIHRvIHJlYWQuXG4gICAgICogQHBhcmFtIHtKU1ppcC5jb21wcmVzc2lvbn0gY29tcHJlc3Npb24gdGhlIGNvbXByZXNzaW9uIHVzZWQgb24gdGhpcyBmaWxlLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSB1bmNvbXByZXNzZWRTaXplIHRoZSB1bmNvbXByZXNzZWQgc2l6ZSB0byBleHBlY3QuXG4gICAgICogQHJldHVybiB7RnVuY3Rpb259IHRoZSBjYWxsYmFjayB0byBnZXQgdGhlIHVuY29tcHJlc3NlZCBjb250ZW50ICh0aGUgdHlwZSBkZXBlbmRzIG9mIHRoZSBEYXRhUmVhZGVyIGNsYXNzKS5cbiAgICAgKi9cbiAgICBwcmVwYXJlQ29udGVudDogZnVuY3Rpb24ocmVhZGVyLCBmcm9tLCBsZW5ndGgsIGNvbXByZXNzaW9uLCB1bmNvbXByZXNzZWRTaXplKSB7XG4gICAgICAgIHJldHVybiBmdW5jdGlvbigpIHtcblxuICAgICAgICAgICAgdmFyIGNvbXByZXNzZWRGaWxlRGF0YSA9IHV0aWxzLnRyYW5zZm9ybVRvKGNvbXByZXNzaW9uLnVuY29tcHJlc3NJbnB1dFR5cGUsIHRoaXMuZ2V0Q29tcHJlc3NlZENvbnRlbnQoKSk7XG4gICAgICAgICAgICB2YXIgdW5jb21wcmVzc2VkRmlsZURhdGEgPSBjb21wcmVzc2lvbi51bmNvbXByZXNzKGNvbXByZXNzZWRGaWxlRGF0YSk7XG5cbiAgICAgICAgICAgIGlmICh1bmNvbXByZXNzZWRGaWxlRGF0YS5sZW5ndGggIT09IHVuY29tcHJlc3NlZFNpemUpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJCdWcgOiB1bmNvbXByZXNzZWQgZGF0YSBzaXplIG1pc21hdGNoXCIpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm4gdW5jb21wcmVzc2VkRmlsZURhdGE7XG4gICAgICAgIH07XG4gICAgfSxcbiAgICAvKipcbiAgICAgKiBSZWFkIHRoZSBsb2NhbCBwYXJ0IG9mIGEgemlwIGZpbGUgYW5kIGFkZCB0aGUgaW5mbyBpbiB0aGlzIG9iamVjdC5cbiAgICAgKiBAcGFyYW0ge0RhdGFSZWFkZXJ9IHJlYWRlciB0aGUgcmVhZGVyIHRvIHVzZS5cbiAgICAgKi9cbiAgICByZWFkTG9jYWxQYXJ0OiBmdW5jdGlvbihyZWFkZXIpIHtcbiAgICAgICAgdmFyIGNvbXByZXNzaW9uLCBsb2NhbEV4dHJhRmllbGRzTGVuZ3RoO1xuXG4gICAgICAgIC8vIHdlIGFscmVhZHkga25vdyBldmVyeXRoaW5nIGZyb20gdGhlIGNlbnRyYWwgZGlyICFcbiAgICAgICAgLy8gSWYgdGhlIGNlbnRyYWwgZGlyIGRhdGEgYXJlIGZhbHNlLCB3ZSBhcmUgZG9vbWVkLlxuICAgICAgICAvLyBPbiB0aGUgYnJpZ2h0IHNpZGUsIHRoZSBsb2NhbCBwYXJ0IGlzIHNjYXJ5ICA6IHppcDY0LCBkYXRhIGRlc2NyaXB0b3JzLCBib3RoLCBldGMuXG4gICAgICAgIC8vIFRoZSBsZXNzIGRhdGEgd2UgZ2V0IGhlcmUsIHRoZSBtb3JlIHJlbGlhYmxlIHRoaXMgc2hvdWxkIGJlLlxuICAgICAgICAvLyBMZXQncyBza2lwIHRoZSB3aG9sZSBoZWFkZXIgYW5kIGRhc2ggdG8gdGhlIGRhdGEgIVxuICAgICAgICByZWFkZXIuc2tpcCgyMik7XG4gICAgICAgIC8vIGluIHNvbWUgemlwIGNyZWF0ZWQgb24gd2luZG93cywgdGhlIGZpbGVuYW1lIHN0b3JlZCBpbiB0aGUgY2VudHJhbCBkaXIgY29udGFpbnMgXFwgaW5zdGVhZCBvZiAvLlxuICAgICAgICAvLyBTdHJhbmdlbHksIHRoZSBmaWxlbmFtZSBoZXJlIGlzIE9LLlxuICAgICAgICAvLyBJIHdvdWxkIGxvdmUgdG8gdHJlYXQgdGhlc2UgemlwIGZpbGVzIGFzIGNvcnJ1cHRlZCAoc2VlIGh0dHA6Ly93d3cuaW5mby16aXAub3JnL0ZBUS5odG1sI2JhY2tzbGFzaGVzXG4gICAgICAgIC8vIG9yIEFQUE5PVEUjNC40LjE3LjEsIFwiQWxsIHNsYXNoZXMgTVVTVCBiZSBmb3J3YXJkIHNsYXNoZXMgJy8nXCIpIGJ1dCB0aGVyZSBhcmUgYSBsb3Qgb2YgYmFkIHppcCBnZW5lcmF0b3JzLi4uXG4gICAgICAgIC8vIFNlYXJjaCBcInVuemlwIG1pc21hdGNoaW5nIFwibG9jYWxcIiBmaWxlbmFtZSBjb250aW51aW5nIHdpdGggXCJjZW50cmFsXCIgZmlsZW5hbWUgdmVyc2lvblwiIG9uXG4gICAgICAgIC8vIHRoZSBpbnRlcm5ldC5cbiAgICAgICAgLy9cbiAgICAgICAgLy8gSSB0aGluayBJIHNlZSB0aGUgbG9naWMgaGVyZSA6IHRoZSBjZW50cmFsIGRpcmVjdG9yeSBpcyB1c2VkIHRvIGRpc3BsYXlcbiAgICAgICAgLy8gY29udGVudCBhbmQgdGhlIGxvY2FsIGRpcmVjdG9yeSBpcyB1c2VkIHRvIGV4dHJhY3QgdGhlIGZpbGVzLiBNaXhpbmcgLyBhbmQgXFxcbiAgICAgICAgLy8gbWF5IGJlIHVzZWQgdG8gZGlzcGxheSBcXCB0byB3aW5kb3dzIHVzZXJzIGFuZCB1c2UgLyB3aGVuIGV4dHJhY3RpbmcgdGhlIGZpbGVzLlxuICAgICAgICAvLyBVbmZvcnR1bmF0ZWx5LCB0aGlzIGxlYWQgYWxzbyB0byBzb21lIGlzc3VlcyA6IGh0dHA6Ly9zZWNsaXN0cy5vcmcvZnVsbGRpc2Nsb3N1cmUvMjAwOS9TZXAvMzk0XG4gICAgICAgIHRoaXMuZmlsZU5hbWVMZW5ndGggPSByZWFkZXIucmVhZEludCgyKTtcbiAgICAgICAgbG9jYWxFeHRyYUZpZWxkc0xlbmd0aCA9IHJlYWRlci5yZWFkSW50KDIpOyAvLyBjYW4ndCBiZSBzdXJlIHRoaXMgd2lsbCBiZSB0aGUgc2FtZSBhcyB0aGUgY2VudHJhbCBkaXJcbiAgICAgICAgdGhpcy5maWxlTmFtZSA9IHJlYWRlci5yZWFkU3RyaW5nKHRoaXMuZmlsZU5hbWVMZW5ndGgpO1xuICAgICAgICByZWFkZXIuc2tpcChsb2NhbEV4dHJhRmllbGRzTGVuZ3RoKTtcblxuICAgICAgICBpZiAodGhpcy5jb21wcmVzc2VkU2l6ZSA9PSAtMSB8fCB0aGlzLnVuY29tcHJlc3NlZFNpemUgPT0gLTEpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIkJ1ZyBvciBjb3JydXB0ZWQgemlwIDogZGlkbid0IGdldCBlbm91Z2ggaW5mb3JtYXRpb25zIGZyb20gdGhlIGNlbnRyYWwgZGlyZWN0b3J5IFwiICsgXCIoY29tcHJlc3NlZFNpemUgPT0gLTEgfHwgdW5jb21wcmVzc2VkU2l6ZSA9PSAtMSlcIik7XG4gICAgICAgIH1cblxuICAgICAgICBjb21wcmVzc2lvbiA9IHV0aWxzLmZpbmRDb21wcmVzc2lvbih0aGlzLmNvbXByZXNzaW9uTWV0aG9kKTtcbiAgICAgICAgaWYgKGNvbXByZXNzaW9uID09PSBudWxsKSB7IC8vIG5vIGNvbXByZXNzaW9uIGZvdW5kXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJDb3JydXB0ZWQgemlwIDogY29tcHJlc3Npb24gXCIgKyB1dGlscy5wcmV0dHkodGhpcy5jb21wcmVzc2lvbk1ldGhvZCkgKyBcIiB1bmtub3duIChpbm5lciBmaWxlIDogXCIgKyB0aGlzLmZpbGVOYW1lICsgXCIpXCIpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuZGVjb21wcmVzc2VkID0gbmV3IENvbXByZXNzZWRPYmplY3QoKTtcbiAgICAgICAgdGhpcy5kZWNvbXByZXNzZWQuY29tcHJlc3NlZFNpemUgPSB0aGlzLmNvbXByZXNzZWRTaXplO1xuICAgICAgICB0aGlzLmRlY29tcHJlc3NlZC51bmNvbXByZXNzZWRTaXplID0gdGhpcy51bmNvbXByZXNzZWRTaXplO1xuICAgICAgICB0aGlzLmRlY29tcHJlc3NlZC5jcmMzMiA9IHRoaXMuY3JjMzI7XG4gICAgICAgIHRoaXMuZGVjb21wcmVzc2VkLmNvbXByZXNzaW9uTWV0aG9kID0gdGhpcy5jb21wcmVzc2lvbk1ldGhvZDtcbiAgICAgICAgdGhpcy5kZWNvbXByZXNzZWQuZ2V0Q29tcHJlc3NlZENvbnRlbnQgPSB0aGlzLnByZXBhcmVDb21wcmVzc2VkQ29udGVudChyZWFkZXIsIHJlYWRlci5pbmRleCwgdGhpcy5jb21wcmVzc2VkU2l6ZSwgY29tcHJlc3Npb24pO1xuICAgICAgICB0aGlzLmRlY29tcHJlc3NlZC5nZXRDb250ZW50ID0gdGhpcy5wcmVwYXJlQ29udGVudChyZWFkZXIsIHJlYWRlci5pbmRleCwgdGhpcy5jb21wcmVzc2VkU2l6ZSwgY29tcHJlc3Npb24sIHRoaXMudW5jb21wcmVzc2VkU2l6ZSk7XG5cbiAgICAgICAgLy8gd2UgbmVlZCB0byBjb21wdXRlIHRoZSBjcmMzMi4uLlxuICAgICAgICBpZiAodGhpcy5sb2FkT3B0aW9ucy5jaGVja0NSQzMyKSB7XG4gICAgICAgICAgICB0aGlzLmRlY29tcHJlc3NlZCA9IHV0aWxzLnRyYW5zZm9ybVRvKFwic3RyaW5nXCIsIHRoaXMuZGVjb21wcmVzc2VkLmdldENvbnRlbnQoKSk7XG4gICAgICAgICAgICBpZiAoanN6aXBQcm90by5jcmMzMih0aGlzLmRlY29tcHJlc3NlZCkgIT09IHRoaXMuY3JjMzIpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJDb3JydXB0ZWQgemlwIDogQ1JDMzIgbWlzbWF0Y2hcIik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogUmVhZCB0aGUgY2VudHJhbCBwYXJ0IG9mIGEgemlwIGZpbGUgYW5kIGFkZCB0aGUgaW5mbyBpbiB0aGlzIG9iamVjdC5cbiAgICAgKiBAcGFyYW0ge0RhdGFSZWFkZXJ9IHJlYWRlciB0aGUgcmVhZGVyIHRvIHVzZS5cbiAgICAgKi9cbiAgICByZWFkQ2VudHJhbFBhcnQ6IGZ1bmN0aW9uKHJlYWRlcikge1xuICAgICAgICB0aGlzLnZlcnNpb25NYWRlQnkgPSByZWFkZXIucmVhZFN0cmluZygyKTtcbiAgICAgICAgdGhpcy52ZXJzaW9uTmVlZGVkID0gcmVhZGVyLnJlYWRJbnQoMik7XG4gICAgICAgIHRoaXMuYml0RmxhZyA9IHJlYWRlci5yZWFkSW50KDIpO1xuICAgICAgICB0aGlzLmNvbXByZXNzaW9uTWV0aG9kID0gcmVhZGVyLnJlYWRTdHJpbmcoMik7XG4gICAgICAgIHRoaXMuZGF0ZSA9IHJlYWRlci5yZWFkRGF0ZSgpO1xuICAgICAgICB0aGlzLmNyYzMyID0gcmVhZGVyLnJlYWRJbnQoNCk7XG4gICAgICAgIHRoaXMuY29tcHJlc3NlZFNpemUgPSByZWFkZXIucmVhZEludCg0KTtcbiAgICAgICAgdGhpcy51bmNvbXByZXNzZWRTaXplID0gcmVhZGVyLnJlYWRJbnQoNCk7XG4gICAgICAgIHRoaXMuZmlsZU5hbWVMZW5ndGggPSByZWFkZXIucmVhZEludCgyKTtcbiAgICAgICAgdGhpcy5leHRyYUZpZWxkc0xlbmd0aCA9IHJlYWRlci5yZWFkSW50KDIpO1xuICAgICAgICB0aGlzLmZpbGVDb21tZW50TGVuZ3RoID0gcmVhZGVyLnJlYWRJbnQoMik7XG4gICAgICAgIHRoaXMuZGlza051bWJlclN0YXJ0ID0gcmVhZGVyLnJlYWRJbnQoMik7XG4gICAgICAgIHRoaXMuaW50ZXJuYWxGaWxlQXR0cmlidXRlcyA9IHJlYWRlci5yZWFkSW50KDIpO1xuICAgICAgICB0aGlzLmV4dGVybmFsRmlsZUF0dHJpYnV0ZXMgPSByZWFkZXIucmVhZEludCg0KTtcbiAgICAgICAgdGhpcy5sb2NhbEhlYWRlck9mZnNldCA9IHJlYWRlci5yZWFkSW50KDQpO1xuXG4gICAgICAgIGlmICh0aGlzLmlzRW5jcnlwdGVkKCkpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIkVuY3J5cHRlZCB6aXAgYXJlIG5vdCBzdXBwb3J0ZWRcIik7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmZpbGVOYW1lID0gcmVhZGVyLnJlYWRTdHJpbmcodGhpcy5maWxlTmFtZUxlbmd0aCk7XG4gICAgICAgIHRoaXMucmVhZEV4dHJhRmllbGRzKHJlYWRlcik7XG4gICAgICAgIHRoaXMucGFyc2VaSVA2NEV4dHJhRmllbGQocmVhZGVyKTtcbiAgICAgICAgdGhpcy5maWxlQ29tbWVudCA9IHJlYWRlci5yZWFkU3RyaW5nKHRoaXMuZmlsZUNvbW1lbnRMZW5ndGgpO1xuXG4gICAgICAgIC8vIHdhcm5pbmcsIHRoaXMgaXMgdHJ1ZSBvbmx5IGZvciB6aXAgd2l0aCBtYWRlQnkgPT0gRE9TIChwbGF0ZWZvcm0gZGVwZW5kZW50IGZlYXR1cmUpXG4gICAgICAgIHRoaXMuZGlyID0gdGhpcy5leHRlcm5hbEZpbGVBdHRyaWJ1dGVzICYgMHgwMDAwMDAxMCA/IHRydWUgOiBmYWxzZTtcbiAgICB9LFxuICAgIC8qKlxuICAgICAqIFBhcnNlIHRoZSBaSVA2NCBleHRyYSBmaWVsZCBhbmQgbWVyZ2UgdGhlIGluZm8gaW4gdGhlIGN1cnJlbnQgWmlwRW50cnkuXG4gICAgICogQHBhcmFtIHtEYXRhUmVhZGVyfSByZWFkZXIgdGhlIHJlYWRlciB0byB1c2UuXG4gICAgICovXG4gICAgcGFyc2VaSVA2NEV4dHJhRmllbGQ6IGZ1bmN0aW9uKHJlYWRlcikge1xuXG4gICAgICAgIGlmICghdGhpcy5leHRyYUZpZWxkc1sweDAwMDFdKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICAvLyBzaG91bGQgYmUgc29tZXRoaW5nLCBwcmVwYXJpbmcgdGhlIGV4dHJhIHJlYWRlclxuICAgICAgICB2YXIgZXh0cmFSZWFkZXIgPSBuZXcgU3RyaW5nUmVhZGVyKHRoaXMuZXh0cmFGaWVsZHNbMHgwMDAxXS52YWx1ZSk7XG5cbiAgICAgICAgLy8gSSByZWFsbHkgaG9wZSB0aGF0IHRoZXNlIDY0Yml0cyBpbnRlZ2VyIGNhbiBmaXQgaW4gMzIgYml0cyBpbnRlZ2VyLCBiZWNhdXNlIGpzXG4gICAgICAgIC8vIHdvbid0IGxldCB1cyBoYXZlIG1vcmUuXG4gICAgICAgIGlmICh0aGlzLnVuY29tcHJlc3NlZFNpemUgPT09IHV0aWxzLk1BWF9WQUxVRV8zMkJJVFMpIHtcbiAgICAgICAgICAgIHRoaXMudW5jb21wcmVzc2VkU2l6ZSA9IGV4dHJhUmVhZGVyLnJlYWRJbnQoOCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuY29tcHJlc3NlZFNpemUgPT09IHV0aWxzLk1BWF9WQUxVRV8zMkJJVFMpIHtcbiAgICAgICAgICAgIHRoaXMuY29tcHJlc3NlZFNpemUgPSBleHRyYVJlYWRlci5yZWFkSW50KDgpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLmxvY2FsSGVhZGVyT2Zmc2V0ID09PSB1dGlscy5NQVhfVkFMVUVfMzJCSVRTKSB7XG4gICAgICAgICAgICB0aGlzLmxvY2FsSGVhZGVyT2Zmc2V0ID0gZXh0cmFSZWFkZXIucmVhZEludCg4KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5kaXNrTnVtYmVyU3RhcnQgPT09IHV0aWxzLk1BWF9WQUxVRV8zMkJJVFMpIHtcbiAgICAgICAgICAgIHRoaXMuZGlza051bWJlclN0YXJ0ID0gZXh0cmFSZWFkZXIucmVhZEludCg0KTtcbiAgICAgICAgfVxuICAgIH0sXG4gICAgLyoqXG4gICAgICogUmVhZCB0aGUgY2VudHJhbCBwYXJ0IG9mIGEgemlwIGZpbGUgYW5kIGFkZCB0aGUgaW5mbyBpbiB0aGlzIG9iamVjdC5cbiAgICAgKiBAcGFyYW0ge0RhdGFSZWFkZXJ9IHJlYWRlciB0aGUgcmVhZGVyIHRvIHVzZS5cbiAgICAgKi9cbiAgICByZWFkRXh0cmFGaWVsZHM6IGZ1bmN0aW9uKHJlYWRlcikge1xuICAgICAgICB2YXIgc3RhcnQgPSByZWFkZXIuaW5kZXgsXG4gICAgICAgICAgICBleHRyYUZpZWxkSWQsXG4gICAgICAgICAgICBleHRyYUZpZWxkTGVuZ3RoLFxuICAgICAgICAgICAgZXh0cmFGaWVsZFZhbHVlO1xuXG4gICAgICAgIHRoaXMuZXh0cmFGaWVsZHMgPSB0aGlzLmV4dHJhRmllbGRzIHx8IHt9O1xuXG4gICAgICAgIHdoaWxlIChyZWFkZXIuaW5kZXggPCBzdGFydCArIHRoaXMuZXh0cmFGaWVsZHNMZW5ndGgpIHtcbiAgICAgICAgICAgIGV4dHJhRmllbGRJZCA9IHJlYWRlci5yZWFkSW50KDIpO1xuICAgICAgICAgICAgZXh0cmFGaWVsZExlbmd0aCA9IHJlYWRlci5yZWFkSW50KDIpO1xuICAgICAgICAgICAgZXh0cmFGaWVsZFZhbHVlID0gcmVhZGVyLnJlYWRTdHJpbmcoZXh0cmFGaWVsZExlbmd0aCk7XG5cbiAgICAgICAgICAgIHRoaXMuZXh0cmFGaWVsZHNbZXh0cmFGaWVsZElkXSA9IHtcbiAgICAgICAgICAgICAgICBpZDogZXh0cmFGaWVsZElkLFxuICAgICAgICAgICAgICAgIGxlbmd0aDogZXh0cmFGaWVsZExlbmd0aCxcbiAgICAgICAgICAgICAgICB2YWx1ZTogZXh0cmFGaWVsZFZhbHVlXG4gICAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgfSxcbiAgICAvKipcbiAgICAgKiBBcHBseSBhbiBVVEY4IHRyYW5zZm9ybWF0aW9uIGlmIG5lZWRlZC5cbiAgICAgKi9cbiAgICBoYW5kbGVVVEY4OiBmdW5jdGlvbigpIHtcbiAgICAgICAgaWYgKHRoaXMudXNlVVRGOCgpKSB7XG4gICAgICAgICAgICB0aGlzLmZpbGVOYW1lID0ganN6aXBQcm90by51dGY4ZGVjb2RlKHRoaXMuZmlsZU5hbWUpO1xuICAgICAgICAgICAgdGhpcy5maWxlQ29tbWVudCA9IGpzemlwUHJvdG8udXRmOGRlY29kZSh0aGlzLmZpbGVDb21tZW50KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHZhciB1cGF0aCA9IHRoaXMuZmluZEV4dHJhRmllbGRVbmljb2RlUGF0aCgpO1xuICAgICAgICAgICAgaWYgKHVwYXRoICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5maWxlTmFtZSA9IHVwYXRoO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdmFyIHVjb21tZW50ID0gdGhpcy5maW5kRXh0cmFGaWVsZFVuaWNvZGVDb21tZW50KCk7XG4gICAgICAgICAgICBpZiAodWNvbW1lbnQgIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmZpbGVDb21tZW50ID0gdWNvbW1lbnQ7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogRmluZCB0aGUgdW5pY29kZSBwYXRoIGRlY2xhcmVkIGluIHRoZSBleHRyYSBmaWVsZCwgaWYgYW55LlxuICAgICAqIEByZXR1cm4ge1N0cmluZ30gdGhlIHVuaWNvZGUgcGF0aCwgbnVsbCBvdGhlcndpc2UuXG4gICAgICovXG4gICAgZmluZEV4dHJhRmllbGRVbmljb2RlUGF0aDogZnVuY3Rpb24oKSB7XG4gICAgICAgIHZhciB1cGF0aEZpZWxkID0gdGhpcy5leHRyYUZpZWxkc1sweDcwNzVdO1xuICAgICAgICBpZiAodXBhdGhGaWVsZCkge1xuICAgICAgICAgICAgdmFyIGV4dHJhUmVhZGVyID0gbmV3IFN0cmluZ1JlYWRlcih1cGF0aEZpZWxkLnZhbHVlKTtcblxuICAgICAgICAgICAgLy8gd3JvbmcgdmVyc2lvblxuICAgICAgICAgICAgaWYgKGV4dHJhUmVhZGVyLnJlYWRJbnQoMSkgIT09IDEpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gdGhlIGNyYyBvZiB0aGUgZmlsZW5hbWUgY2hhbmdlZCwgdGhpcyBmaWVsZCBpcyBvdXQgb2YgZGF0ZS5cbiAgICAgICAgICAgIGlmIChqc3ppcFByb3RvLmNyYzMyKHRoaXMuZmlsZU5hbWUpICE9PSBleHRyYVJlYWRlci5yZWFkSW50KDQpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiBqc3ppcFByb3RvLnV0ZjhkZWNvZGUoZXh0cmFSZWFkZXIucmVhZFN0cmluZyh1cGF0aEZpZWxkLmxlbmd0aCAtIDUpKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogRmluZCB0aGUgdW5pY29kZSBjb21tZW50IGRlY2xhcmVkIGluIHRoZSBleHRyYSBmaWVsZCwgaWYgYW55LlxuICAgICAqIEByZXR1cm4ge1N0cmluZ30gdGhlIHVuaWNvZGUgY29tbWVudCwgbnVsbCBvdGhlcndpc2UuXG4gICAgICovXG4gICAgZmluZEV4dHJhRmllbGRVbmljb2RlQ29tbWVudDogZnVuY3Rpb24oKSB7XG4gICAgICAgIHZhciB1Y29tbWVudEZpZWxkID0gdGhpcy5leHRyYUZpZWxkc1sweDYzNzVdO1xuICAgICAgICBpZiAodWNvbW1lbnRGaWVsZCkge1xuICAgICAgICAgICAgdmFyIGV4dHJhUmVhZGVyID0gbmV3IFN0cmluZ1JlYWRlcih1Y29tbWVudEZpZWxkLnZhbHVlKTtcblxuICAgICAgICAgICAgLy8gd3JvbmcgdmVyc2lvblxuICAgICAgICAgICAgaWYgKGV4dHJhUmVhZGVyLnJlYWRJbnQoMSkgIT09IDEpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gdGhlIGNyYyBvZiB0aGUgY29tbWVudCBjaGFuZ2VkLCB0aGlzIGZpZWxkIGlzIG91dCBvZiBkYXRlLlxuICAgICAgICAgICAgaWYgKGpzemlwUHJvdG8uY3JjMzIodGhpcy5maWxlQ29tbWVudCkgIT09IGV4dHJhUmVhZGVyLnJlYWRJbnQoNCkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuIGpzemlwUHJvdG8udXRmOGRlY29kZShleHRyYVJlYWRlci5yZWFkU3RyaW5nKHVjb21tZW50RmllbGQubGVuZ3RoIC0gNSkpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbn07XG5tb2R1bGUuZXhwb3J0cyA9IFppcEVudHJ5O1xuXG59LHtcIi4vY29tcHJlc3NlZE9iamVjdFwiOjIsXCIuL29iamVjdFwiOjEzLFwiLi9zdHJpbmdSZWFkZXJcIjoxNSxcIi4vdXRpbHNcIjoyMX1dLDI0OltmdW5jdGlvbihfZGVyZXFfLG1vZHVsZSxleHBvcnRzKXtcbi8vIFRvcCBsZXZlbCBmaWxlIGlzIGp1c3QgYSBtaXhpbiBvZiBzdWJtb2R1bGVzICYgY29uc3RhbnRzXG4ndXNlIHN0cmljdCc7XG5cbnZhciBhc3NpZ24gICAgPSBfZGVyZXFfKCcuL2xpYi91dGlscy9jb21tb24nKS5hc3NpZ247XG5cbnZhciBkZWZsYXRlICAgPSBfZGVyZXFfKCcuL2xpYi9kZWZsYXRlJyk7XG52YXIgaW5mbGF0ZSAgID0gX2RlcmVxXygnLi9saWIvaW5mbGF0ZScpO1xudmFyIGNvbnN0YW50cyA9IF9kZXJlcV8oJy4vbGliL3psaWIvY29uc3RhbnRzJyk7XG5cbnZhciBwYWtvID0ge307XG5cbmFzc2lnbihwYWtvLCBkZWZsYXRlLCBpbmZsYXRlLCBjb25zdGFudHMpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IHBha287XG59LHtcIi4vbGliL2RlZmxhdGVcIjoyNSxcIi4vbGliL2luZmxhdGVcIjoyNixcIi4vbGliL3V0aWxzL2NvbW1vblwiOjI3LFwiLi9saWIvemxpYi9jb25zdGFudHNcIjozMH1dLDI1OltmdW5jdGlvbihfZGVyZXFfLG1vZHVsZSxleHBvcnRzKXtcbid1c2Ugc3RyaWN0JztcblxuXG52YXIgemxpYl9kZWZsYXRlID0gX2RlcmVxXygnLi96bGliL2RlZmxhdGUuanMnKTtcbnZhciB1dGlscyA9IF9kZXJlcV8oJy4vdXRpbHMvY29tbW9uJyk7XG52YXIgc3RyaW5ncyA9IF9kZXJlcV8oJy4vdXRpbHMvc3RyaW5ncycpO1xudmFyIG1zZyA9IF9kZXJlcV8oJy4vemxpYi9tZXNzYWdlcycpO1xudmFyIHpzdHJlYW0gPSBfZGVyZXFfKCcuL3psaWIvenN0cmVhbScpO1xuXG5cbi8qIFB1YmxpYyBjb25zdGFudHMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovXG4vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qL1xuXG52YXIgWl9OT19GTFVTSCAgICAgID0gMDtcbnZhciBaX0ZJTklTSCAgICAgICAgPSA0O1xuXG52YXIgWl9PSyAgICAgICAgICAgID0gMDtcbnZhciBaX1NUUkVBTV9FTkQgICAgPSAxO1xuXG52YXIgWl9ERUZBVUxUX0NPTVBSRVNTSU9OID0gLTE7XG5cbnZhciBaX0RFRkFVTFRfU1RSQVRFR1kgICAgPSAwO1xuXG52YXIgWl9ERUZMQVRFRCAgPSA4O1xuXG4vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qL1xuXG5cbi8qKlxuICogY2xhc3MgRGVmbGF0ZVxuICpcbiAqIEdlbmVyaWMgSlMtc3R5bGUgd3JhcHBlciBmb3IgemxpYiBjYWxscy4gSWYgeW91IGRvbid0IG5lZWRcbiAqIHN0cmVhbWluZyBiZWhhdmlvdXIgLSB1c2UgbW9yZSBzaW1wbGUgZnVuY3Rpb25zOiBbW2RlZmxhdGVdXSxcbiAqIFtbZGVmbGF0ZVJhd11dIGFuZCBbW2d6aXBdXS5cbiAqKi9cblxuLyogaW50ZXJuYWxcbiAqIERlZmxhdGUuY2h1bmtzIC0+IEFycmF5XG4gKlxuICogQ2h1bmtzIG9mIG91dHB1dCBkYXRhLCBpZiBbW0RlZmxhdGUjb25EYXRhXV0gbm90IG92ZXJyaWRlbi5cbiAqKi9cblxuLyoqXG4gKiBEZWZsYXRlLnJlc3VsdCAtPiBVaW50OEFycmF5fEFycmF5XG4gKlxuICogQ29tcHJlc3NlZCByZXN1bHQsIGdlbmVyYXRlZCBieSBkZWZhdWx0IFtbRGVmbGF0ZSNvbkRhdGFdXVxuICogYW5kIFtbRGVmbGF0ZSNvbkVuZF1dIGhhbmRsZXJzLiBGaWxsZWQgYWZ0ZXIgeW91IHB1c2ggbGFzdCBjaHVua1xuICogKGNhbGwgW1tEZWZsYXRlI3B1c2hdXSB3aXRoIGBaX0ZJTklTSGAgLyBgdHJ1ZWAgcGFyYW0pLlxuICoqL1xuXG4vKipcbiAqIERlZmxhdGUuZXJyIC0+IE51bWJlclxuICpcbiAqIEVycm9yIGNvZGUgYWZ0ZXIgZGVmbGF0ZSBmaW5pc2hlZC4gMCAoWl9PSykgb24gc3VjY2Vzcy5cbiAqIFlvdSB3aWxsIG5vdCBuZWVkIGl0IGluIHJlYWwgbGlmZSwgYmVjYXVzZSBkZWZsYXRlIGVycm9yc1xuICogYXJlIHBvc3NpYmxlIG9ubHkgb24gd3Jvbmcgb3B0aW9ucyBvciBiYWQgYG9uRGF0YWAgLyBgb25FbmRgXG4gKiBjdXN0b20gaGFuZGxlcnMuXG4gKiovXG5cbi8qKlxuICogRGVmbGF0ZS5tc2cgLT4gU3RyaW5nXG4gKlxuICogRXJyb3IgbWVzc2FnZSwgaWYgW1tEZWZsYXRlLmVycl1dICE9IDBcbiAqKi9cblxuXG4vKipcbiAqIG5ldyBEZWZsYXRlKG9wdGlvbnMpXG4gKiAtIG9wdGlvbnMgKE9iamVjdCk6IHpsaWIgZGVmbGF0ZSBvcHRpb25zLlxuICpcbiAqIENyZWF0ZXMgbmV3IGRlZmxhdG9yIGluc3RhbmNlIHdpdGggc3BlY2lmaWVkIHBhcmFtcy4gVGhyb3dzIGV4Y2VwdGlvblxuICogb24gYmFkIHBhcmFtcy4gU3VwcG9ydGVkIG9wdGlvbnM6XG4gKlxuICogLSBgbGV2ZWxgXG4gKiAtIGB3aW5kb3dCaXRzYFxuICogLSBgbWVtTGV2ZWxgXG4gKiAtIGBzdHJhdGVneWBcbiAqXG4gKiBbaHR0cDovL3psaWIubmV0L21hbnVhbC5odG1sI0FkdmFuY2VkXShodHRwOi8vemxpYi5uZXQvbWFudWFsLmh0bWwjQWR2YW5jZWQpXG4gKiBmb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiB0aGVzZS5cbiAqXG4gKiBBZGRpdGlvbmFsIG9wdGlvbnMsIGZvciBpbnRlcm5hbCBuZWVkczpcbiAqXG4gKiAtIGBjaHVua1NpemVgIC0gc2l6ZSBvZiBnZW5lcmF0ZWQgZGF0YSBjaHVua3MgKDE2SyBieSBkZWZhdWx0KVxuICogLSBgcmF3YCAoQm9vbGVhbikgLSBkbyByYXcgZGVmbGF0ZVxuICogLSBgZ3ppcGAgKEJvb2xlYW4pIC0gY3JlYXRlIGd6aXAgd3JhcHBlclxuICogLSBgdG9gIChTdHJpbmcpIC0gaWYgZXF1YWwgdG8gJ3N0cmluZycsIHRoZW4gcmVzdWx0IHdpbGwgYmUgXCJiaW5hcnkgc3RyaW5nXCJcbiAqICAgIChlYWNoIGNoYXIgY29kZSBbMC4uMjU1XSlcbiAqIC0gYGhlYWRlcmAgKE9iamVjdCkgLSBjdXN0b20gaGVhZGVyIGZvciBnemlwXG4gKiAgIC0gYHRleHRgIChCb29sZWFuKSAtIHRydWUgaWYgY29tcHJlc3NlZCBkYXRhIGJlbGlldmVkIHRvIGJlIHRleHRcbiAqICAgLSBgdGltZWAgKE51bWJlcikgLSBtb2RpZmljYXRpb24gdGltZSwgdW5peCB0aW1lc3RhbXBcbiAqICAgLSBgb3NgIChOdW1iZXIpIC0gb3BlcmF0aW9uIHN5c3RlbSBjb2RlXG4gKiAgIC0gYGV4dHJhYCAoQXJyYXkpIC0gYXJyYXkgb2YgYnl0ZXMgd2l0aCBleHRyYSBkYXRhIChtYXggNjU1MzYpXG4gKiAgIC0gYG5hbWVgIChTdHJpbmcpIC0gZmlsZSBuYW1lIChiaW5hcnkgc3RyaW5nKVxuICogICAtIGBjb21tZW50YCAoU3RyaW5nKSAtIGNvbW1lbnQgKGJpbmFyeSBzdHJpbmcpXG4gKiAgIC0gYGhjcmNgIChCb29sZWFuKSAtIHRydWUgaWYgaGVhZGVyIGNyYyBzaG91bGQgYmUgYWRkZWRcbiAqXG4gKiAjIyMjIyBFeGFtcGxlOlxuICpcbiAqIGBgYGphdmFzY3JpcHRcbiAqIHZhciBwYWtvID0gcmVxdWlyZSgncGFrbycpXG4gKiAgICwgY2h1bmsxID0gVWludDhBcnJheShbMSwyLDMsNCw1LDYsNyw4LDldKVxuICogICAsIGNodW5rMiA9IFVpbnQ4QXJyYXkoWzEwLDExLDEyLDEzLDE0LDE1LDE2LDE3LDE4LDE5XSk7XG4gKlxuICogdmFyIGRlZmxhdGUgPSBuZXcgcGFrby5EZWZsYXRlKHsgbGV2ZWw6IDN9KTtcbiAqXG4gKiBkZWZsYXRlLnB1c2goY2h1bmsxLCBmYWxzZSk7XG4gKiBkZWZsYXRlLnB1c2goY2h1bmsyLCB0cnVlKTsgIC8vIHRydWUgLT4gbGFzdCBjaHVua1xuICpcbiAqIGlmIChkZWZsYXRlLmVycikgeyB0aHJvdyBuZXcgRXJyb3IoZGVmbGF0ZS5lcnIpOyB9XG4gKlxuICogY29uc29sZS5sb2coZGVmbGF0ZS5yZXN1bHQpO1xuICogYGBgXG4gKiovXG52YXIgRGVmbGF0ZSA9IGZ1bmN0aW9uKG9wdGlvbnMpIHtcblxuICB0aGlzLm9wdGlvbnMgPSB1dGlscy5hc3NpZ24oe1xuICAgIGxldmVsOiBaX0RFRkFVTFRfQ09NUFJFU1NJT04sXG4gICAgbWV0aG9kOiBaX0RFRkxBVEVELFxuICAgIGNodW5rU2l6ZTogMTYzODQsXG4gICAgd2luZG93Qml0czogMTUsXG4gICAgbWVtTGV2ZWw6IDgsXG4gICAgc3RyYXRlZ3k6IFpfREVGQVVMVF9TVFJBVEVHWSxcbiAgICB0bzogJydcbiAgfSwgb3B0aW9ucyB8fCB7fSk7XG5cbiAgdmFyIG9wdCA9IHRoaXMub3B0aW9ucztcblxuICBpZiAob3B0LnJhdyAmJiAob3B0LndpbmRvd0JpdHMgPiAwKSkge1xuICAgIG9wdC53aW5kb3dCaXRzID0gLW9wdC53aW5kb3dCaXRzO1xuICB9XG5cbiAgZWxzZSBpZiAob3B0Lmd6aXAgJiYgKG9wdC53aW5kb3dCaXRzID4gMCkgJiYgKG9wdC53aW5kb3dCaXRzIDwgMTYpKSB7XG4gICAgb3B0LndpbmRvd0JpdHMgKz0gMTY7XG4gIH1cblxuICB0aGlzLmVyciAgICA9IDA7ICAgICAgLy8gZXJyb3IgY29kZSwgaWYgaGFwcGVucyAoMCA9IFpfT0spXG4gIHRoaXMubXNnICAgID0gJyc7ICAgICAvLyBlcnJvciBtZXNzYWdlXG4gIHRoaXMuZW5kZWQgID0gZmFsc2U7ICAvLyB1c2VkIHRvIGF2b2lkIG11bHRpcGxlIG9uRW5kKCkgY2FsbHNcbiAgdGhpcy5jaHVua3MgPSBbXTsgICAgIC8vIGNodW5rcyBvZiBjb21wcmVzc2VkIGRhdGFcblxuICB0aGlzLnN0cm0gPSBuZXcgenN0cmVhbSgpO1xuICB0aGlzLnN0cm0uYXZhaWxfb3V0ID0gMDtcblxuICB2YXIgc3RhdHVzID0gemxpYl9kZWZsYXRlLmRlZmxhdGVJbml0MihcbiAgICB0aGlzLnN0cm0sXG4gICAgb3B0LmxldmVsLFxuICAgIG9wdC5tZXRob2QsXG4gICAgb3B0LndpbmRvd0JpdHMsXG4gICAgb3B0Lm1lbUxldmVsLFxuICAgIG9wdC5zdHJhdGVneVxuICApO1xuXG4gIGlmIChzdGF0dXMgIT09IFpfT0spIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IobXNnW3N0YXR1c10pO1xuICB9XG5cbiAgaWYgKG9wdC5oZWFkZXIpIHtcbiAgICB6bGliX2RlZmxhdGUuZGVmbGF0ZVNldEhlYWRlcih0aGlzLnN0cm0sIG9wdC5oZWFkZXIpO1xuICB9XG59O1xuXG4vKipcbiAqIERlZmxhdGUjcHVzaChkYXRhWywgbW9kZV0pIC0+IEJvb2xlYW5cbiAqIC0gZGF0YSAoVWludDhBcnJheXxBcnJheXxTdHJpbmcpOiBpbnB1dCBkYXRhLiBTdHJpbmdzIHdpbGwgYmUgY29udmVydGVkIHRvXG4gKiAgIHV0ZjggYnl0ZSBzZXF1ZW5jZS5cbiAqIC0gbW9kZSAoTnVtYmVyfEJvb2xlYW4pOiAwLi42IGZvciBjb3JyZXNwb25kaW5nIFpfTk9fRkxVU0guLlpfVFJFRSBtb2Rlcy5cbiAqICAgU2VlIGNvbnN0YW50cy4gU2tpcHBlZCBvciBgZmFsc2VgIG1lYW5zIFpfTk9fRkxVU0gsIGB0cnVlYCBtZWFuc2ggWl9GSU5JU0guXG4gKlxuICogU2VuZHMgaW5wdXQgZGF0YSB0byBkZWZsYXRlIHBpcGUsIGdlbmVyYXRpbmcgW1tEZWZsYXRlI29uRGF0YV1dIGNhbGxzIHdpdGhcbiAqIG5ldyBjb21wcmVzc2VkIGNodW5rcy4gUmV0dXJucyBgdHJ1ZWAgb24gc3VjY2Vzcy4gVGhlIGxhc3QgZGF0YSBibG9jayBtdXN0IGhhdmVcbiAqIG1vZGUgWl9GSU5JU0ggKG9yIGB0cnVlYCkuIFRoYXQgZmx1c2ggaW50ZXJuYWwgcGVuZGluZyBidWZmZXJzIGFuZCBjYWxsXG4gKiBbW0RlZmxhdGUjb25FbmRdXS5cbiAqXG4gKiBPbiBmYWlsIGNhbGwgW1tEZWZsYXRlI29uRW5kXV0gd2l0aCBlcnJvciBjb2RlIGFuZCByZXR1cm4gZmFsc2UuXG4gKlxuICogV2Ugc3Ryb25nbHkgcmVjb21tZW5kIHRvIHVzZSBgVWludDhBcnJheWAgb24gaW5wdXQgZm9yIGJlc3Qgc3BlZWQgKG91dHB1dFxuICogYXJyYXkgZm9ybWF0IGlzIGRldGVjdGVkIGF1dG9tYXRpY2FsbHkpLiBBbHNvLCBkb24ndCBza2lwIGxhc3QgcGFyYW0gYW5kIGFsd2F5c1xuICogdXNlIHRoZSBzYW1lIHR5cGUgaW4geW91ciBjb2RlIChib29sZWFuIG9yIG51bWJlcikuIFRoYXQgd2lsbCBpbXByb3ZlIEpTIHNwZWVkLlxuICpcbiAqIEZvciByZWd1bGFyIGBBcnJheWAtcyBtYWtlIHN1cmUgYWxsIGVsZW1lbnRzIGFyZSBbMC4uMjU1XS5cbiAqXG4gKiAjIyMjIyBFeGFtcGxlXG4gKlxuICogYGBgamF2YXNjcmlwdFxuICogcHVzaChjaHVuaywgZmFsc2UpOyAvLyBwdXNoIG9uZSBvZiBkYXRhIGNodW5rc1xuICogLi4uXG4gKiBwdXNoKGNodW5rLCB0cnVlKTsgIC8vIHB1c2ggbGFzdCBjaHVua1xuICogYGBgXG4gKiovXG5EZWZsYXRlLnByb3RvdHlwZS5wdXNoID0gZnVuY3Rpb24oZGF0YSwgbW9kZSkge1xuICB2YXIgc3RybSA9IHRoaXMuc3RybTtcbiAgdmFyIGNodW5rU2l6ZSA9IHRoaXMub3B0aW9ucy5jaHVua1NpemU7XG4gIHZhciBzdGF0dXMsIF9tb2RlO1xuXG4gIGlmICh0aGlzLmVuZGVkKSB7IHJldHVybiBmYWxzZTsgfVxuXG4gIF9tb2RlID0gKG1vZGUgPT09IH5+bW9kZSkgPyBtb2RlIDogKChtb2RlID09PSB0cnVlKSA/IFpfRklOSVNIIDogWl9OT19GTFVTSCk7XG5cbiAgLy8gQ29udmVydCBkYXRhIGlmIG5lZWRlZFxuICBpZiAodHlwZW9mIGRhdGEgPT09ICdzdHJpbmcnKSB7XG4gICAgLy8gSWYgd2UgbmVlZCB0byBjb21wcmVzcyB0ZXh0LCBjaGFuZ2UgZW5jb2RpbmcgdG8gdXRmOC5cbiAgICBzdHJtLmlucHV0ID0gc3RyaW5ncy5zdHJpbmcyYnVmKGRhdGEpO1xuICB9IGVsc2Uge1xuICAgIHN0cm0uaW5wdXQgPSBkYXRhO1xuICB9XG5cbiAgc3RybS5uZXh0X2luID0gMDtcbiAgc3RybS5hdmFpbF9pbiA9IHN0cm0uaW5wdXQubGVuZ3RoO1xuXG4gIGRvIHtcbiAgICBpZiAoc3RybS5hdmFpbF9vdXQgPT09IDApIHtcbiAgICAgIHN0cm0ub3V0cHV0ID0gbmV3IHV0aWxzLkJ1ZjgoY2h1bmtTaXplKTtcbiAgICAgIHN0cm0ubmV4dF9vdXQgPSAwO1xuICAgICAgc3RybS5hdmFpbF9vdXQgPSBjaHVua1NpemU7XG4gICAgfVxuICAgIHN0YXR1cyA9IHpsaWJfZGVmbGF0ZS5kZWZsYXRlKHN0cm0sIF9tb2RlKTsgICAgLyogbm8gYmFkIHJldHVybiB2YWx1ZSAqL1xuXG4gICAgaWYgKHN0YXR1cyAhPT0gWl9TVFJFQU1fRU5EICYmIHN0YXR1cyAhPT0gWl9PSykge1xuICAgICAgdGhpcy5vbkVuZChzdGF0dXMpO1xuICAgICAgdGhpcy5lbmRlZCA9IHRydWU7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGlmIChzdHJtLmF2YWlsX291dCA9PT0gMCB8fCAoc3RybS5hdmFpbF9pbiA9PT0gMCAmJiBfbW9kZSA9PT0gWl9GSU5JU0gpKSB7XG4gICAgICBpZiAodGhpcy5vcHRpb25zLnRvID09PSAnc3RyaW5nJykge1xuICAgICAgICB0aGlzLm9uRGF0YShzdHJpbmdzLmJ1ZjJiaW5zdHJpbmcodXRpbHMuc2hyaW5rQnVmKHN0cm0ub3V0cHV0LCBzdHJtLm5leHRfb3V0KSkpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5vbkRhdGEodXRpbHMuc2hyaW5rQnVmKHN0cm0ub3V0cHV0LCBzdHJtLm5leHRfb3V0KSk7XG4gICAgICB9XG4gICAgfVxuICB9IHdoaWxlICgoc3RybS5hdmFpbF9pbiA+IDAgfHwgc3RybS5hdmFpbF9vdXQgPT09IDApICYmIHN0YXR1cyAhPT0gWl9TVFJFQU1fRU5EKTtcblxuICAvLyBGaW5hbGl6ZSBvbiB0aGUgbGFzdCBjaHVuay5cbiAgaWYgKF9tb2RlID09PSBaX0ZJTklTSCkge1xuICAgIHN0YXR1cyA9IHpsaWJfZGVmbGF0ZS5kZWZsYXRlRW5kKHRoaXMuc3RybSk7XG4gICAgdGhpcy5vbkVuZChzdGF0dXMpO1xuICAgIHRoaXMuZW5kZWQgPSB0cnVlO1xuICAgIHJldHVybiBzdGF0dXMgPT09IFpfT0s7XG4gIH1cblxuICByZXR1cm4gdHJ1ZTtcbn07XG5cblxuLyoqXG4gKiBEZWZsYXRlI29uRGF0YShjaHVuaykgLT4gVm9pZFxuICogLSBjaHVuayAoVWludDhBcnJheXxBcnJheXxTdHJpbmcpOiBvdXB1dCBkYXRhLiBUeXBlIG9mIGFycmF5IGRlcGVuZHNcbiAqICAgb24ganMgZW5naW5lIHN1cHBvcnQuIFdoZW4gc3RyaW5nIG91dHB1dCByZXF1ZXN0ZWQsIGVhY2ggY2h1bmtcbiAqICAgd2lsbCBiZSBzdHJpbmcuXG4gKlxuICogQnkgZGVmYXVsdCwgc3RvcmVzIGRhdGEgYmxvY2tzIGluIGBjaHVua3NbXWAgcHJvcGVydHkgYW5kIGdsdWVcbiAqIHRob3NlIGluIGBvbkVuZGAuIE92ZXJyaWRlIHRoaXMgaGFuZGxlciwgaWYgeW91IG5lZWQgYW5vdGhlciBiZWhhdmlvdXIuXG4gKiovXG5EZWZsYXRlLnByb3RvdHlwZS5vbkRhdGEgPSBmdW5jdGlvbihjaHVuaykge1xuICB0aGlzLmNodW5rcy5wdXNoKGNodW5rKTtcbn07XG5cblxuLyoqXG4gKiBEZWZsYXRlI29uRW5kKHN0YXR1cykgLT4gVm9pZFxuICogLSBzdGF0dXMgKE51bWJlcik6IGRlZmxhdGUgc3RhdHVzLiAwIChaX09LKSBvbiBzdWNjZXNzLFxuICogICBvdGhlciBpZiBub3QuXG4gKlxuICogQ2FsbGVkIG9uY2UgYWZ0ZXIgeW91IHRlbGwgZGVmbGF0ZSB0aGF0IGlucHV0IHN0cmVhbSBjb21wbGV0ZVxuICogb3IgZXJyb3IgaGFwcGVubmVkLiBCeSBkZWZhdWx0IC0gam9pbiBjb2xsZWN0ZWQgY2h1bmtzLFxuICogZnJlZSBtZW1vcnkgYW5kIGZpbGwgYHJlc3VsdHNgIC8gYGVycmAgcHJvcGVydGllcy5cbiAqKi9cbkRlZmxhdGUucHJvdG90eXBlLm9uRW5kID0gZnVuY3Rpb24oc3RhdHVzKSB7XG4gIC8vIE9uIHN1Y2Nlc3MgLSBqb2luXG4gIGlmIChzdGF0dXMgPT09IFpfT0spIHtcbiAgICBpZiAodGhpcy5vcHRpb25zLnRvID09PSAnc3RyaW5nJykge1xuICAgICAgdGhpcy5yZXN1bHQgPSB0aGlzLmNodW5rcy5qb2luKCcnKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5yZXN1bHQgPSB1dGlscy5mbGF0dGVuQ2h1bmtzKHRoaXMuY2h1bmtzKTtcbiAgICB9XG4gIH1cbiAgdGhpcy5jaHVua3MgPSBbXTtcbiAgdGhpcy5lcnIgPSBzdGF0dXM7XG4gIHRoaXMubXNnID0gdGhpcy5zdHJtLm1zZztcbn07XG5cblxuLyoqXG4gKiBkZWZsYXRlKGRhdGFbLCBvcHRpb25zXSkgLT4gVWludDhBcnJheXxBcnJheXxTdHJpbmdcbiAqIC0gZGF0YSAoVWludDhBcnJheXxBcnJheXxTdHJpbmcpOiBpbnB1dCBkYXRhIHRvIGNvbXByZXNzLlxuICogLSBvcHRpb25zIChPYmplY3QpOiB6bGliIGRlZmxhdGUgb3B0aW9ucy5cbiAqXG4gKiBDb21wcmVzcyBgZGF0YWAgd2l0aCBkZWZsYXRlIGFscm9yeXRobSBhbmQgYG9wdGlvbnNgLlxuICpcbiAqIFN1cHBvcnRlZCBvcHRpb25zIGFyZTpcbiAqXG4gKiAtIGxldmVsXG4gKiAtIHdpbmRvd0JpdHNcbiAqIC0gbWVtTGV2ZWxcbiAqIC0gc3RyYXRlZ3lcbiAqXG4gKiBbaHR0cDovL3psaWIubmV0L21hbnVhbC5odG1sI0FkdmFuY2VkXShodHRwOi8vemxpYi5uZXQvbWFudWFsLmh0bWwjQWR2YW5jZWQpXG4gKiBmb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiB0aGVzZS5cbiAqXG4gKiBTdWdhciAob3B0aW9ucyk6XG4gKlxuICogLSBgcmF3YCAoQm9vbGVhbikgLSBzYXkgdGhhdCB3ZSB3b3JrIHdpdGggcmF3IHN0cmVhbSwgaWYgeW91IGRvbid0IHdpc2ggdG8gc3BlY2lmeVxuICogICBuZWdhdGl2ZSB3aW5kb3dCaXRzIGltcGxpY2l0bHkuXG4gKiAtIGB0b2AgKFN0cmluZykgLSBpZiBlcXVhbCB0byAnc3RyaW5nJywgdGhlbiByZXN1bHQgd2lsbCBiZSBcImJpbmFyeSBzdHJpbmdcIlxuICogICAgKGVhY2ggY2hhciBjb2RlIFswLi4yNTVdKVxuICpcbiAqICMjIyMjIEV4YW1wbGU6XG4gKlxuICogYGBgamF2YXNjcmlwdFxuICogdmFyIHBha28gPSByZXF1aXJlKCdwYWtvJylcbiAqICAgLCBkYXRhID0gVWludDhBcnJheShbMSwyLDMsNCw1LDYsNyw4LDldKTtcbiAqXG4gKiBjb25zb2xlLmxvZyhwYWtvLmRlZmxhdGUoZGF0YSkpO1xuICogYGBgXG4gKiovXG5mdW5jdGlvbiBkZWZsYXRlKGlucHV0LCBvcHRpb25zKSB7XG4gIHZhciBkZWZsYXRvciA9IG5ldyBEZWZsYXRlKG9wdGlvbnMpO1xuXG4gIGRlZmxhdG9yLnB1c2goaW5wdXQsIHRydWUpO1xuXG4gIC8vIFRoYXQgd2lsbCBuZXZlciBoYXBwZW5zLCBpZiB5b3UgZG9uJ3QgY2hlYXQgd2l0aCBvcHRpb25zIDopXG4gIGlmIChkZWZsYXRvci5lcnIpIHsgdGhyb3cgZGVmbGF0b3IubXNnOyB9XG5cbiAgcmV0dXJuIGRlZmxhdG9yLnJlc3VsdDtcbn1cblxuXG4vKipcbiAqIGRlZmxhdGVSYXcoZGF0YVssIG9wdGlvbnNdKSAtPiBVaW50OEFycmF5fEFycmF5fFN0cmluZ1xuICogLSBkYXRhIChVaW50OEFycmF5fEFycmF5fFN0cmluZyk6IGlucHV0IGRhdGEgdG8gY29tcHJlc3MuXG4gKiAtIG9wdGlvbnMgKE9iamVjdCk6IHpsaWIgZGVmbGF0ZSBvcHRpb25zLlxuICpcbiAqIFRoZSBzYW1lIGFzIFtbZGVmbGF0ZV1dLCBidXQgY3JlYXRlcyByYXcgZGF0YSwgd2l0aG91dCB3cmFwcGVyXG4gKiAoaGVhZGVyIGFuZCBhZGxlcjMyIGNyYykuXG4gKiovXG5mdW5jdGlvbiBkZWZsYXRlUmF3KGlucHV0LCBvcHRpb25zKSB7XG4gIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9O1xuICBvcHRpb25zLnJhdyA9IHRydWU7XG4gIHJldHVybiBkZWZsYXRlKGlucHV0LCBvcHRpb25zKTtcbn1cblxuXG4vKipcbiAqIGd6aXAoZGF0YVssIG9wdGlvbnNdKSAtPiBVaW50OEFycmF5fEFycmF5fFN0cmluZ1xuICogLSBkYXRhIChVaW50OEFycmF5fEFycmF5fFN0cmluZyk6IGlucHV0IGRhdGEgdG8gY29tcHJlc3MuXG4gKiAtIG9wdGlvbnMgKE9iamVjdCk6IHpsaWIgZGVmbGF0ZSBvcHRpb25zLlxuICpcbiAqIFRoZSBzYW1lIGFzIFtbZGVmbGF0ZV1dLCBidXQgY3JlYXRlIGd6aXAgd3JhcHBlciBpbnN0ZWFkIG9mXG4gKiBkZWZsYXRlIG9uZS5cbiAqKi9cbmZ1bmN0aW9uIGd6aXAoaW5wdXQsIG9wdGlvbnMpIHtcbiAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG4gIG9wdGlvbnMuZ3ppcCA9IHRydWU7XG4gIHJldHVybiBkZWZsYXRlKGlucHV0LCBvcHRpb25zKTtcbn1cblxuXG5leHBvcnRzLkRlZmxhdGUgPSBEZWZsYXRlO1xuZXhwb3J0cy5kZWZsYXRlID0gZGVmbGF0ZTtcbmV4cG9ydHMuZGVmbGF0ZVJhdyA9IGRlZmxhdGVSYXc7XG5leHBvcnRzLmd6aXAgPSBnemlwO1xufSx7XCIuL3V0aWxzL2NvbW1vblwiOjI3LFwiLi91dGlscy9zdHJpbmdzXCI6MjgsXCIuL3psaWIvZGVmbGF0ZS5qc1wiOjMyLFwiLi96bGliL21lc3NhZ2VzXCI6MzcsXCIuL3psaWIvenN0cmVhbVwiOjM5fV0sMjY6W2Z1bmN0aW9uKF9kZXJlcV8sbW9kdWxlLGV4cG9ydHMpe1xuJ3VzZSBzdHJpY3QnO1xuXG5cbnZhciB6bGliX2luZmxhdGUgPSBfZGVyZXFfKCcuL3psaWIvaW5mbGF0ZS5qcycpO1xudmFyIHV0aWxzID0gX2RlcmVxXygnLi91dGlscy9jb21tb24nKTtcbnZhciBzdHJpbmdzID0gX2RlcmVxXygnLi91dGlscy9zdHJpbmdzJyk7XG52YXIgYyA9IF9kZXJlcV8oJy4vemxpYi9jb25zdGFudHMnKTtcbnZhciBtc2cgPSBfZGVyZXFfKCcuL3psaWIvbWVzc2FnZXMnKTtcbnZhciB6c3RyZWFtID0gX2RlcmVxXygnLi96bGliL3pzdHJlYW0nKTtcbnZhciBnemhlYWRlciA9IF9kZXJlcV8oJy4vemxpYi9nemhlYWRlcicpO1xuXG5cbi8qKlxuICogY2xhc3MgSW5mbGF0ZVxuICpcbiAqIEdlbmVyaWMgSlMtc3R5bGUgd3JhcHBlciBmb3IgemxpYiBjYWxscy4gSWYgeW91IGRvbid0IG5lZWRcbiAqIHN0cmVhbWluZyBiZWhhdmlvdXIgLSB1c2UgbW9yZSBzaW1wbGUgZnVuY3Rpb25zOiBbW2luZmxhdGVdXVxuICogYW5kIFtbaW5mbGF0ZVJhd11dLlxuICoqL1xuXG4vKiBpbnRlcm5hbFxuICogaW5mbGF0ZS5jaHVua3MgLT4gQXJyYXlcbiAqXG4gKiBDaHVua3Mgb2Ygb3V0cHV0IGRhdGEsIGlmIFtbSW5mbGF0ZSNvbkRhdGFdXSBub3Qgb3ZlcnJpZGVuLlxuICoqL1xuXG4vKipcbiAqIEluZmxhdGUucmVzdWx0IC0+IFVpbnQ4QXJyYXl8QXJyYXl8U3RyaW5nXG4gKlxuICogVW5jb21wcmVzc2VkIHJlc3VsdCwgZ2VuZXJhdGVkIGJ5IGRlZmF1bHQgW1tJbmZsYXRlI29uRGF0YV1dXG4gKiBhbmQgW1tJbmZsYXRlI29uRW5kXV0gaGFuZGxlcnMuIEZpbGxlZCBhZnRlciB5b3UgcHVzaCBsYXN0IGNodW5rXG4gKiAoY2FsbCBbW0luZmxhdGUjcHVzaF1dIHdpdGggYFpfRklOSVNIYCAvIGB0cnVlYCBwYXJhbSkuXG4gKiovXG5cbi8qKlxuICogSW5mbGF0ZS5lcnIgLT4gTnVtYmVyXG4gKlxuICogRXJyb3IgY29kZSBhZnRlciBpbmZsYXRlIGZpbmlzaGVkLiAwIChaX09LKSBvbiBzdWNjZXNzLlxuICogU2hvdWxkIGJlIGNoZWNrZWQgaWYgYnJva2VuIGRhdGEgcG9zc2libGUuXG4gKiovXG5cbi8qKlxuICogSW5mbGF0ZS5tc2cgLT4gU3RyaW5nXG4gKlxuICogRXJyb3IgbWVzc2FnZSwgaWYgW1tJbmZsYXRlLmVycl1dICE9IDBcbiAqKi9cblxuXG4vKipcbiAqIG5ldyBJbmZsYXRlKG9wdGlvbnMpXG4gKiAtIG9wdGlvbnMgKE9iamVjdCk6IHpsaWIgaW5mbGF0ZSBvcHRpb25zLlxuICpcbiAqIENyZWF0ZXMgbmV3IGluZmxhdG9yIGluc3RhbmNlIHdpdGggc3BlY2lmaWVkIHBhcmFtcy4gVGhyb3dzIGV4Y2VwdGlvblxuICogb24gYmFkIHBhcmFtcy4gU3VwcG9ydGVkIG9wdGlvbnM6XG4gKlxuICogLSBgd2luZG93Qml0c2BcbiAqXG4gKiBbaHR0cDovL3psaWIubmV0L21hbnVhbC5odG1sI0FkdmFuY2VkXShodHRwOi8vemxpYi5uZXQvbWFudWFsLmh0bWwjQWR2YW5jZWQpXG4gKiBmb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiB0aGVzZS5cbiAqXG4gKiBBZGRpdGlvbmFsIG9wdGlvbnMsIGZvciBpbnRlcm5hbCBuZWVkczpcbiAqXG4gKiAtIGBjaHVua1NpemVgIC0gc2l6ZSBvZiBnZW5lcmF0ZWQgZGF0YSBjaHVua3MgKDE2SyBieSBkZWZhdWx0KVxuICogLSBgcmF3YCAoQm9vbGVhbikgLSBkbyByYXcgaW5mbGF0ZVxuICogLSBgdG9gIChTdHJpbmcpIC0gaWYgZXF1YWwgdG8gJ3N0cmluZycsIHRoZW4gcmVzdWx0IHdpbGwgYmUgY29udmVydGVkXG4gKiAgIGZyb20gdXRmOCB0byB1dGYxNiAoamF2YXNjcmlwdCkgc3RyaW5nLiBXaGVuIHN0cmluZyBvdXRwdXQgcmVxdWVzdGVkLFxuICogICBjaHVuayBsZW5ndGggY2FuIGRpZmZlciBmcm9tIGBjaHVua1NpemVgLCBkZXBlbmRpbmcgb24gY29udGVudC5cbiAqXG4gKiBCeSBkZWZhdWx0LCB3aGVuIG5vIG9wdGlvbnMgc2V0LCBhdXRvZGV0ZWN0IGRlZmxhdGUvZ3ppcCBkYXRhIGZvcm1hdCB2aWFcbiAqIHdyYXBwZXIgaGVhZGVyLlxuICpcbiAqICMjIyMjIEV4YW1wbGU6XG4gKlxuICogYGBgamF2YXNjcmlwdFxuICogdmFyIHBha28gPSByZXF1aXJlKCdwYWtvJylcbiAqICAgLCBjaHVuazEgPSBVaW50OEFycmF5KFsxLDIsMyw0LDUsNiw3LDgsOV0pXG4gKiAgICwgY2h1bmsyID0gVWludDhBcnJheShbMTAsMTEsMTIsMTMsMTQsMTUsMTYsMTcsMTgsMTldKTtcbiAqXG4gKiB2YXIgaW5mbGF0ZSA9IG5ldyBwYWtvLkluZmxhdGUoeyBsZXZlbDogM30pO1xuICpcbiAqIGluZmxhdGUucHVzaChjaHVuazEsIGZhbHNlKTtcbiAqIGluZmxhdGUucHVzaChjaHVuazIsIHRydWUpOyAgLy8gdHJ1ZSAtPiBsYXN0IGNodW5rXG4gKlxuICogaWYgKGluZmxhdGUuZXJyKSB7IHRocm93IG5ldyBFcnJvcihpbmZsYXRlLmVycik7IH1cbiAqXG4gKiBjb25zb2xlLmxvZyhpbmZsYXRlLnJlc3VsdCk7XG4gKiBgYGBcbiAqKi9cbnZhciBJbmZsYXRlID0gZnVuY3Rpb24ob3B0aW9ucykge1xuXG4gIHRoaXMub3B0aW9ucyA9IHV0aWxzLmFzc2lnbih7XG4gICAgY2h1bmtTaXplOiAxNjM4NCxcbiAgICB3aW5kb3dCaXRzOiAwLFxuICAgIHRvOiAnJ1xuICB9LCBvcHRpb25zIHx8IHt9KTtcblxuICB2YXIgb3B0ID0gdGhpcy5vcHRpb25zO1xuXG4gIC8vIEZvcmNlIHdpbmRvdyBzaXplIGZvciBgcmF3YCBkYXRhLCBpZiBub3Qgc2V0IGRpcmVjdGx5LFxuICAvLyBiZWNhdXNlIHdlIGhhdmUgbm8gaGVhZGVyIGZvciBhdXRvZGV0ZWN0LlxuICBpZiAob3B0LnJhdyAmJiAob3B0LndpbmRvd0JpdHMgPj0gMCkgJiYgKG9wdC53aW5kb3dCaXRzIDwgMTYpKSB7XG4gICAgb3B0LndpbmRvd0JpdHMgPSAtb3B0LndpbmRvd0JpdHM7XG4gICAgaWYgKG9wdC53aW5kb3dCaXRzID09PSAwKSB7IG9wdC53aW5kb3dCaXRzID0gLTE1OyB9XG4gIH1cblxuICAvLyBJZiBgd2luZG93Qml0c2Agbm90IGRlZmluZWQgKGFuZCBtb2RlIG5vdCByYXcpIC0gc2V0IGF1dG9kZXRlY3QgZmxhZyBmb3IgZ3ppcC9kZWZsYXRlXG4gIGlmICgob3B0LndpbmRvd0JpdHMgPj0gMCkgJiYgKG9wdC53aW5kb3dCaXRzIDwgMTYpICYmXG4gICAgICAhKG9wdGlvbnMgJiYgb3B0aW9ucy53aW5kb3dCaXRzKSkge1xuICAgIG9wdC53aW5kb3dCaXRzICs9IDMyO1xuICB9XG5cbiAgLy8gR3ppcCBoZWFkZXIgaGFzIG5vIGluZm8gYWJvdXQgd2luZG93cyBzaXplLCB3ZSBjYW4gZG8gYXV0b2RldGVjdCBvbmx5XG4gIC8vIGZvciBkZWZsYXRlLiBTbywgaWYgd2luZG93IHNpemUgbm90IHNldCwgZm9yY2UgaXQgdG8gbWF4IHdoZW4gZ3ppcCBwb3NzaWJsZVxuICBpZiAoKG9wdC53aW5kb3dCaXRzID4gMTUpICYmIChvcHQud2luZG93Qml0cyA8IDQ4KSkge1xuICAgIC8vIGJpdCAzICgxNikgLT4gZ3ppcHBlZCBkYXRhXG4gICAgLy8gYml0IDQgKDMyKSAtPiBhdXRvZGV0ZWN0IGd6aXAvZGVmbGF0ZVxuICAgIGlmICgob3B0LndpbmRvd0JpdHMgJiAxNSkgPT09IDApIHtcbiAgICAgIG9wdC53aW5kb3dCaXRzIHw9IDE1O1xuICAgIH1cbiAgfVxuXG4gIHRoaXMuZXJyICAgID0gMDsgICAgICAvLyBlcnJvciBjb2RlLCBpZiBoYXBwZW5zICgwID0gWl9PSylcbiAgdGhpcy5tc2cgICAgPSAnJzsgICAgIC8vIGVycm9yIG1lc3NhZ2VcbiAgdGhpcy5lbmRlZCAgPSBmYWxzZTsgIC8vIHVzZWQgdG8gYXZvaWQgbXVsdGlwbGUgb25FbmQoKSBjYWxsc1xuICB0aGlzLmNodW5rcyA9IFtdOyAgICAgLy8gY2h1bmtzIG9mIGNvbXByZXNzZWQgZGF0YVxuXG4gIHRoaXMuc3RybSAgID0gbmV3IHpzdHJlYW0oKTtcbiAgdGhpcy5zdHJtLmF2YWlsX291dCA9IDA7XG5cbiAgdmFyIHN0YXR1cyAgPSB6bGliX2luZmxhdGUuaW5mbGF0ZUluaXQyKFxuICAgIHRoaXMuc3RybSxcbiAgICBvcHQud2luZG93Qml0c1xuICApO1xuXG4gIGlmIChzdGF0dXMgIT09IGMuWl9PSykge1xuICAgIHRocm93IG5ldyBFcnJvcihtc2dbc3RhdHVzXSk7XG4gIH1cblxuICB0aGlzLmhlYWRlciA9IG5ldyBnemhlYWRlcigpO1xuXG4gIHpsaWJfaW5mbGF0ZS5pbmZsYXRlR2V0SGVhZGVyKHRoaXMuc3RybSwgdGhpcy5oZWFkZXIpO1xufTtcblxuLyoqXG4gKiBJbmZsYXRlI3B1c2goZGF0YVssIG1vZGVdKSAtPiBCb29sZWFuXG4gKiAtIGRhdGEgKFVpbnQ4QXJyYXl8QXJyYXl8U3RyaW5nKTogaW5wdXQgZGF0YVxuICogLSBtb2RlIChOdW1iZXJ8Qm9vbGVhbik6IDAuLjYgZm9yIGNvcnJlc3BvbmRpbmcgWl9OT19GTFVTSC4uWl9UUkVFIG1vZGVzLlxuICogICBTZWUgY29uc3RhbnRzLiBTa2lwcGVkIG9yIGBmYWxzZWAgbWVhbnMgWl9OT19GTFVTSCwgYHRydWVgIG1lYW5zaCBaX0ZJTklTSC5cbiAqXG4gKiBTZW5kcyBpbnB1dCBkYXRhIHRvIGluZmxhdGUgcGlwZSwgZ2VuZXJhdGluZyBbW0luZmxhdGUjb25EYXRhXV0gY2FsbHMgd2l0aFxuICogbmV3IG91dHB1dCBjaHVua3MuIFJldHVybnMgYHRydWVgIG9uIHN1Y2Nlc3MuIFRoZSBsYXN0IGRhdGEgYmxvY2sgbXVzdCBoYXZlXG4gKiBtb2RlIFpfRklOSVNIIChvciBgdHJ1ZWApLiBUaGF0IGZsdXNoIGludGVybmFsIHBlbmRpbmcgYnVmZmVycyBhbmQgY2FsbFxuICogW1tJbmZsYXRlI29uRW5kXV0uXG4gKlxuICogT24gZmFpbCBjYWxsIFtbSW5mbGF0ZSNvbkVuZF1dIHdpdGggZXJyb3IgY29kZSBhbmQgcmV0dXJuIGZhbHNlLlxuICpcbiAqIFdlIHN0cm9uZ2x5IHJlY29tbWVuZCB0byB1c2UgYFVpbnQ4QXJyYXlgIG9uIGlucHV0IGZvciBiZXN0IHNwZWVkIChvdXRwdXRcbiAqIGZvcm1hdCBpcyBkZXRlY3RlZCBhdXRvbWF0aWNhbGx5KS4gQWxzbywgZG9uJ3Qgc2tpcCBsYXN0IHBhcmFtIGFuZCBhbHdheXNcbiAqIHVzZSB0aGUgc2FtZSB0eXBlIGluIHlvdXIgY29kZSAoYm9vbGVhbiBvciBudW1iZXIpLiBUaGF0IHdpbGwgaW1wcm92ZSBKUyBzcGVlZC5cbiAqXG4gKiBGb3IgcmVndWxhciBgQXJyYXlgLXMgbWFrZSBzdXJlIGFsbCBlbGVtZW50cyBhcmUgWzAuLjI1NV0uXG4gKlxuICogIyMjIyMgRXhhbXBsZVxuICpcbiAqIGBgYGphdmFzY3JpcHRcbiAqIHB1c2goY2h1bmssIGZhbHNlKTsgLy8gcHVzaCBvbmUgb2YgZGF0YSBjaHVua3NcbiAqIC4uLlxuICogcHVzaChjaHVuaywgdHJ1ZSk7ICAvLyBwdXNoIGxhc3QgY2h1bmtcbiAqIGBgYFxuICoqL1xuSW5mbGF0ZS5wcm90b3R5cGUucHVzaCA9IGZ1bmN0aW9uKGRhdGEsIG1vZGUpIHtcbiAgdmFyIHN0cm0gPSB0aGlzLnN0cm07XG4gIHZhciBjaHVua1NpemUgPSB0aGlzLm9wdGlvbnMuY2h1bmtTaXplO1xuICB2YXIgc3RhdHVzLCBfbW9kZTtcbiAgdmFyIG5leHRfb3V0X3V0ZjgsIHRhaWwsIHV0ZjhzdHI7XG5cbiAgaWYgKHRoaXMuZW5kZWQpIHsgcmV0dXJuIGZhbHNlOyB9XG4gIF9tb2RlID0gKG1vZGUgPT09IH5+bW9kZSkgPyBtb2RlIDogKChtb2RlID09PSB0cnVlKSA/IGMuWl9GSU5JU0ggOiBjLlpfTk9fRkxVU0gpO1xuXG4gIC8vIENvbnZlcnQgZGF0YSBpZiBuZWVkZWRcbiAgaWYgKHR5cGVvZiBkYXRhID09PSAnc3RyaW5nJykge1xuICAgIC8vIE9ubHkgYmluYXJ5IHN0cmluZ3MgY2FuIGJlIGRlY29tcHJlc3NlZCBvbiBwcmFjdGljZVxuICAgIHN0cm0uaW5wdXQgPSBzdHJpbmdzLmJpbnN0cmluZzJidWYoZGF0YSk7XG4gIH0gZWxzZSB7XG4gICAgc3RybS5pbnB1dCA9IGRhdGE7XG4gIH1cblxuICBzdHJtLm5leHRfaW4gPSAwO1xuICBzdHJtLmF2YWlsX2luID0gc3RybS5pbnB1dC5sZW5ndGg7XG5cbiAgZG8ge1xuICAgIGlmIChzdHJtLmF2YWlsX291dCA9PT0gMCkge1xuICAgICAgc3RybS5vdXRwdXQgPSBuZXcgdXRpbHMuQnVmOChjaHVua1NpemUpO1xuICAgICAgc3RybS5uZXh0X291dCA9IDA7XG4gICAgICBzdHJtLmF2YWlsX291dCA9IGNodW5rU2l6ZTtcbiAgICB9XG5cbiAgICBzdGF0dXMgPSB6bGliX2luZmxhdGUuaW5mbGF0ZShzdHJtLCBjLlpfTk9fRkxVU0gpOyAgICAvKiBubyBiYWQgcmV0dXJuIHZhbHVlICovXG5cbiAgICBpZiAoc3RhdHVzICE9PSBjLlpfU1RSRUFNX0VORCAmJiBzdGF0dXMgIT09IGMuWl9PSykge1xuICAgICAgdGhpcy5vbkVuZChzdGF0dXMpO1xuICAgICAgdGhpcy5lbmRlZCA9IHRydWU7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgaWYgKHN0cm0ubmV4dF9vdXQpIHtcbiAgICAgIGlmIChzdHJtLmF2YWlsX291dCA9PT0gMCB8fCBzdGF0dXMgPT09IGMuWl9TVFJFQU1fRU5EIHx8IChzdHJtLmF2YWlsX2luID09PSAwICYmIF9tb2RlID09PSBjLlpfRklOSVNIKSkge1xuXG4gICAgICAgIGlmICh0aGlzLm9wdGlvbnMudG8gPT09ICdzdHJpbmcnKSB7XG5cbiAgICAgICAgICBuZXh0X291dF91dGY4ID0gc3RyaW5ncy51dGY4Ym9yZGVyKHN0cm0ub3V0cHV0LCBzdHJtLm5leHRfb3V0KTtcblxuICAgICAgICAgIHRhaWwgPSBzdHJtLm5leHRfb3V0IC0gbmV4dF9vdXRfdXRmODtcbiAgICAgICAgICB1dGY4c3RyID0gc3RyaW5ncy5idWYyc3RyaW5nKHN0cm0ub3V0cHV0LCBuZXh0X291dF91dGY4KTtcblxuICAgICAgICAgIC8vIG1vdmUgdGFpbFxuICAgICAgICAgIHN0cm0ubmV4dF9vdXQgPSB0YWlsO1xuICAgICAgICAgIHN0cm0uYXZhaWxfb3V0ID0gY2h1bmtTaXplIC0gdGFpbDtcbiAgICAgICAgICBpZiAodGFpbCkgeyB1dGlscy5hcnJheVNldChzdHJtLm91dHB1dCwgc3RybS5vdXRwdXQsIG5leHRfb3V0X3V0ZjgsIHRhaWwsIDApOyB9XG5cbiAgICAgICAgICB0aGlzLm9uRGF0YSh1dGY4c3RyKTtcblxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMub25EYXRhKHV0aWxzLnNocmlua0J1ZihzdHJtLm91dHB1dCwgc3RybS5uZXh0X291dCkpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9IHdoaWxlICgoc3RybS5hdmFpbF9pbiA+IDApICYmIHN0YXR1cyAhPT0gYy5aX1NUUkVBTV9FTkQpO1xuXG4gIGlmIChzdGF0dXMgPT09IGMuWl9TVFJFQU1fRU5EKSB7XG4gICAgX21vZGUgPSBjLlpfRklOSVNIO1xuICB9XG4gIC8vIEZpbmFsaXplIG9uIHRoZSBsYXN0IGNodW5rLlxuICBpZiAoX21vZGUgPT09IGMuWl9GSU5JU0gpIHtcbiAgICBzdGF0dXMgPSB6bGliX2luZmxhdGUuaW5mbGF0ZUVuZCh0aGlzLnN0cm0pO1xuICAgIHRoaXMub25FbmQoc3RhdHVzKTtcbiAgICB0aGlzLmVuZGVkID0gdHJ1ZTtcbiAgICByZXR1cm4gc3RhdHVzID09PSBjLlpfT0s7XG4gIH1cblxuICByZXR1cm4gdHJ1ZTtcbn07XG5cblxuLyoqXG4gKiBJbmZsYXRlI29uRGF0YShjaHVuaykgLT4gVm9pZFxuICogLSBjaHVuayAoVWludDhBcnJheXxBcnJheXxTdHJpbmcpOiBvdXB1dCBkYXRhLiBUeXBlIG9mIGFycmF5IGRlcGVuZHNcbiAqICAgb24ganMgZW5naW5lIHN1cHBvcnQuIFdoZW4gc3RyaW5nIG91dHB1dCByZXF1ZXN0ZWQsIGVhY2ggY2h1bmtcbiAqICAgd2lsbCBiZSBzdHJpbmcuXG4gKlxuICogQnkgZGVmYXVsdCwgc3RvcmVzIGRhdGEgYmxvY2tzIGluIGBjaHVua3NbXWAgcHJvcGVydHkgYW5kIGdsdWVcbiAqIHRob3NlIGluIGBvbkVuZGAuIE92ZXJyaWRlIHRoaXMgaGFuZGxlciwgaWYgeW91IG5lZWQgYW5vdGhlciBiZWhhdmlvdXIuXG4gKiovXG5JbmZsYXRlLnByb3RvdHlwZS5vbkRhdGEgPSBmdW5jdGlvbihjaHVuaykge1xuICB0aGlzLmNodW5rcy5wdXNoKGNodW5rKTtcbn07XG5cblxuLyoqXG4gKiBJbmZsYXRlI29uRW5kKHN0YXR1cykgLT4gVm9pZFxuICogLSBzdGF0dXMgKE51bWJlcik6IGluZmxhdGUgc3RhdHVzLiAwIChaX09LKSBvbiBzdWNjZXNzLFxuICogICBvdGhlciBpZiBub3QuXG4gKlxuICogQ2FsbGVkIG9uY2UgYWZ0ZXIgeW91IHRlbGwgaW5mbGF0ZSB0aGF0IGlucHV0IHN0cmVhbSBjb21wbGV0ZVxuICogb3IgZXJyb3IgaGFwcGVubmVkLiBCeSBkZWZhdWx0IC0gam9pbiBjb2xsZWN0ZWQgY2h1bmtzLFxuICogZnJlZSBtZW1vcnkgYW5kIGZpbGwgYHJlc3VsdHNgIC8gYGVycmAgcHJvcGVydGllcy5cbiAqKi9cbkluZmxhdGUucHJvdG90eXBlLm9uRW5kID0gZnVuY3Rpb24oc3RhdHVzKSB7XG4gIC8vIE9uIHN1Y2Nlc3MgLSBqb2luXG4gIGlmIChzdGF0dXMgPT09IGMuWl9PSykge1xuICAgIGlmICh0aGlzLm9wdGlvbnMudG8gPT09ICdzdHJpbmcnKSB7XG4gICAgICAvLyBHbHVlICYgY29udmVydCBoZXJlLCB1bnRpbCB3ZSB0ZWFjaCBwYWtvIHRvIHNlbmRcbiAgICAgIC8vIHV0ZjggYWxsaWduZWQgc3RyaW5ncyB0byBvbkRhdGFcbiAgICAgIHRoaXMucmVzdWx0ID0gdGhpcy5jaHVua3Muam9pbignJyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMucmVzdWx0ID0gdXRpbHMuZmxhdHRlbkNodW5rcyh0aGlzLmNodW5rcyk7XG4gICAgfVxuICB9XG4gIHRoaXMuY2h1bmtzID0gW107XG4gIHRoaXMuZXJyID0gc3RhdHVzO1xuICB0aGlzLm1zZyA9IHRoaXMuc3RybS5tc2c7XG59O1xuXG5cbi8qKlxuICogaW5mbGF0ZShkYXRhWywgb3B0aW9uc10pIC0+IFVpbnQ4QXJyYXl8QXJyYXl8U3RyaW5nXG4gKiAtIGRhdGEgKFVpbnQ4QXJyYXl8QXJyYXl8U3RyaW5nKTogaW5wdXQgZGF0YSB0byBkZWNvbXByZXNzLlxuICogLSBvcHRpb25zIChPYmplY3QpOiB6bGliIGluZmxhdGUgb3B0aW9ucy5cbiAqXG4gKiBEZWNvbXByZXNzIGBkYXRhYCB3aXRoIGluZmxhdGUvdW5nemlwIGFuZCBgb3B0aW9uc2AuIEF1dG9kZXRlY3RcbiAqIGZvcm1hdCB2aWEgd3JhcHBlciBoZWFkZXIgYnkgZGVmYXVsdC4gVGhhdCdzIHdoeSB3ZSBkb24ndCBwcm92aWRlXG4gKiBzZXBhcmF0ZSBgdW5nemlwYCBtZXRob2QuXG4gKlxuICogU3VwcG9ydGVkIG9wdGlvbnMgYXJlOlxuICpcbiAqIC0gd2luZG93Qml0c1xuICpcbiAqIFtodHRwOi8vemxpYi5uZXQvbWFudWFsLmh0bWwjQWR2YW5jZWRdKGh0dHA6Ly96bGliLm5ldC9tYW51YWwuaHRtbCNBZHZhbmNlZClcbiAqIGZvciBtb3JlIGluZm9ybWF0aW9uLlxuICpcbiAqIFN1Z2FyIChvcHRpb25zKTpcbiAqXG4gKiAtIGByYXdgIChCb29sZWFuKSAtIHNheSB0aGF0IHdlIHdvcmsgd2l0aCByYXcgc3RyZWFtLCBpZiB5b3UgZG9uJ3Qgd2lzaCB0byBzcGVjaWZ5XG4gKiAgIG5lZ2F0aXZlIHdpbmRvd0JpdHMgaW1wbGljaXRseS5cbiAqIC0gYHRvYCAoU3RyaW5nKSAtIGlmIGVxdWFsIHRvICdzdHJpbmcnLCB0aGVuIHJlc3VsdCB3aWxsIGJlIGNvbnZlcnRlZFxuICogICBmcm9tIHV0ZjggdG8gdXRmMTYgKGphdmFzY3JpcHQpIHN0cmluZy4gV2hlbiBzdHJpbmcgb3V0cHV0IHJlcXVlc3RlZCxcbiAqICAgY2h1bmsgbGVuZ3RoIGNhbiBkaWZmZXIgZnJvbSBgY2h1bmtTaXplYCwgZGVwZW5kaW5nIG9uIGNvbnRlbnQuXG4gKlxuICpcbiAqICMjIyMjIEV4YW1wbGU6XG4gKlxuICogYGBgamF2YXNjcmlwdFxuICogdmFyIHBha28gPSByZXF1aXJlKCdwYWtvJylcbiAqICAgLCBpbnB1dCA9IHBha28uZGVmbGF0ZShbMSwyLDMsNCw1LDYsNyw4LDldKVxuICogICAsIG91dHB1dDtcbiAqXG4gKiB0cnkge1xuICogICBvdXRwdXQgPSBwYWtvLmluZmxhdGUoaW5wdXQpO1xuICogfSBjYXRjaCAoZXJyKVxuICogICBjb25zb2xlLmxvZyhlcnIpO1xuICogfVxuICogYGBgXG4gKiovXG5mdW5jdGlvbiBpbmZsYXRlKGlucHV0LCBvcHRpb25zKSB7XG4gIHZhciBpbmZsYXRvciA9IG5ldyBJbmZsYXRlKG9wdGlvbnMpO1xuXG4gIGluZmxhdG9yLnB1c2goaW5wdXQsIHRydWUpO1xuXG4gIC8vIFRoYXQgd2lsbCBuZXZlciBoYXBwZW5zLCBpZiB5b3UgZG9uJ3QgY2hlYXQgd2l0aCBvcHRpb25zIDopXG4gIGlmIChpbmZsYXRvci5lcnIpIHsgdGhyb3cgaW5mbGF0b3IubXNnOyB9XG5cbiAgcmV0dXJuIGluZmxhdG9yLnJlc3VsdDtcbn1cblxuXG4vKipcbiAqIGluZmxhdGVSYXcoZGF0YVssIG9wdGlvbnNdKSAtPiBVaW50OEFycmF5fEFycmF5fFN0cmluZ1xuICogLSBkYXRhIChVaW50OEFycmF5fEFycmF5fFN0cmluZyk6IGlucHV0IGRhdGEgdG8gZGVjb21wcmVzcy5cbiAqIC0gb3B0aW9ucyAoT2JqZWN0KTogemxpYiBpbmZsYXRlIG9wdGlvbnMuXG4gKlxuICogVGhlIHNhbWUgYXMgW1tpbmZsYXRlXV0sIGJ1dCBjcmVhdGVzIHJhdyBkYXRhLCB3aXRob3V0IHdyYXBwZXJcbiAqIChoZWFkZXIgYW5kIGFkbGVyMzIgY3JjKS5cbiAqKi9cbmZ1bmN0aW9uIGluZmxhdGVSYXcoaW5wdXQsIG9wdGlvbnMpIHtcbiAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG4gIG9wdGlvbnMucmF3ID0gdHJ1ZTtcbiAgcmV0dXJuIGluZmxhdGUoaW5wdXQsIG9wdGlvbnMpO1xufVxuXG5cbi8qKlxuICogdW5nemlwKGRhdGFbLCBvcHRpb25zXSkgLT4gVWludDhBcnJheXxBcnJheXxTdHJpbmdcbiAqIC0gZGF0YSAoVWludDhBcnJheXxBcnJheXxTdHJpbmcpOiBpbnB1dCBkYXRhIHRvIGRlY29tcHJlc3MuXG4gKiAtIG9wdGlvbnMgKE9iamVjdCk6IHpsaWIgaW5mbGF0ZSBvcHRpb25zLlxuICpcbiAqIEp1c3Qgc2hvcnRjdXQgdG8gW1tpbmZsYXRlXV0sIGJlY2F1c2UgaXQgYXV0b2RldGVjdHMgZm9ybWF0XG4gKiBieSBoZWFkZXIuY29udGVudC4gRG9uZSBmb3IgY29udmVuaWVuY2UuXG4gKiovXG5cblxuZXhwb3J0cy5JbmZsYXRlID0gSW5mbGF0ZTtcbmV4cG9ydHMuaW5mbGF0ZSA9IGluZmxhdGU7XG5leHBvcnRzLmluZmxhdGVSYXcgPSBpbmZsYXRlUmF3O1xuZXhwb3J0cy51bmd6aXAgID0gaW5mbGF0ZTtcblxufSx7XCIuL3V0aWxzL2NvbW1vblwiOjI3LFwiLi91dGlscy9zdHJpbmdzXCI6MjgsXCIuL3psaWIvY29uc3RhbnRzXCI6MzAsXCIuL3psaWIvZ3poZWFkZXJcIjozMyxcIi4vemxpYi9pbmZsYXRlLmpzXCI6MzUsXCIuL3psaWIvbWVzc2FnZXNcIjozNyxcIi4vemxpYi96c3RyZWFtXCI6Mzl9XSwyNzpbZnVuY3Rpb24oX2RlcmVxXyxtb2R1bGUsZXhwb3J0cyl7XG4ndXNlIHN0cmljdCc7XG5cblxudmFyIFRZUEVEX09LID0gICh0eXBlb2YgVWludDhBcnJheSAhPT0gJ3VuZGVmaW5lZCcpICYmXG4gICAgICAgICAgICAgICAgKHR5cGVvZiBVaW50MTZBcnJheSAhPT0gJ3VuZGVmaW5lZCcpICYmXG4gICAgICAgICAgICAgICAgKHR5cGVvZiBJbnQzMkFycmF5ICE9PSAndW5kZWZpbmVkJyk7XG5cblxuZXhwb3J0cy5hc3NpZ24gPSBmdW5jdGlvbiAob2JqIC8qZnJvbTEsIGZyb20yLCBmcm9tMywgLi4uKi8pIHtcbiAgdmFyIHNvdXJjZXMgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsIDEpO1xuICB3aGlsZSAoc291cmNlcy5sZW5ndGgpIHtcbiAgICB2YXIgc291cmNlID0gc291cmNlcy5zaGlmdCgpO1xuICAgIGlmICghc291cmNlKSB7IGNvbnRpbnVlOyB9XG5cbiAgICBpZiAodHlwZW9mKHNvdXJjZSkgIT09ICdvYmplY3QnKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKHNvdXJjZSArICdtdXN0IGJlIG5vbi1vYmplY3QnKTtcbiAgICB9XG5cbiAgICBmb3IgKHZhciBwIGluIHNvdXJjZSkge1xuICAgICAgaWYgKHNvdXJjZS5oYXNPd25Qcm9wZXJ0eShwKSkge1xuICAgICAgICBvYmpbcF0gPSBzb3VyY2VbcF07XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIG9iajtcbn07XG5cblxuLy8gcmVkdWNlIGJ1ZmZlciBzaXplLCBhdm9pZGluZyBtZW0gY29weVxuZXhwb3J0cy5zaHJpbmtCdWYgPSBmdW5jdGlvbiAoYnVmLCBzaXplKSB7XG4gIGlmIChidWYubGVuZ3RoID09PSBzaXplKSB7IHJldHVybiBidWY7IH1cbiAgaWYgKGJ1Zi5zdWJhcnJheSkgeyByZXR1cm4gYnVmLnN1YmFycmF5KDAsIHNpemUpOyB9XG4gIGJ1Zi5sZW5ndGggPSBzaXplO1xuICByZXR1cm4gYnVmO1xufTtcblxuXG52YXIgZm5UeXBlZCA9IHtcbiAgYXJyYXlTZXQ6IGZ1bmN0aW9uIChkZXN0LCBzcmMsIHNyY19vZmZzLCBsZW4sIGRlc3Rfb2Zmcykge1xuICAgIGlmIChzcmMuc3ViYXJyYXkgJiYgZGVzdC5zdWJhcnJheSkge1xuICAgICAgZGVzdC5zZXQoc3JjLnN1YmFycmF5KHNyY19vZmZzLCBzcmNfb2ZmcytsZW4pLCBkZXN0X29mZnMpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICAvLyBGYWxsYmFjayB0byBvcmRpbmFyeSBhcnJheVxuICAgIGZvcih2YXIgaT0wOyBpPGxlbjsgaSsrKSB7XG4gICAgICBkZXN0W2Rlc3Rfb2ZmcyArIGldID0gc3JjW3NyY19vZmZzICsgaV07XG4gICAgfVxuICB9LFxuICAvLyBKb2luIGFycmF5IG9mIGNodW5rcyB0byBzaW5nbGUgYXJyYXkuXG4gIGZsYXR0ZW5DaHVua3M6IGZ1bmN0aW9uKGNodW5rcykge1xuICAgIHZhciBpLCBsLCBsZW4sIHBvcywgY2h1bmssIHJlc3VsdDtcblxuICAgIC8vIGNhbGN1bGF0ZSBkYXRhIGxlbmd0aFxuICAgIGxlbiA9IDA7XG4gICAgZm9yIChpPTAsIGw9Y2h1bmtzLmxlbmd0aDsgaTxsOyBpKyspIHtcbiAgICAgIGxlbiArPSBjaHVua3NbaV0ubGVuZ3RoO1xuICAgIH1cblxuICAgIC8vIGpvaW4gY2h1bmtzXG4gICAgcmVzdWx0ID0gbmV3IFVpbnQ4QXJyYXkobGVuKTtcbiAgICBwb3MgPSAwO1xuICAgIGZvciAoaT0wLCBsPWNodW5rcy5sZW5ndGg7IGk8bDsgaSsrKSB7XG4gICAgICBjaHVuayA9IGNodW5rc1tpXTtcbiAgICAgIHJlc3VsdC5zZXQoY2h1bmssIHBvcyk7XG4gICAgICBwb3MgKz0gY2h1bmsubGVuZ3RoO1xuICAgIH1cblxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cbn07XG5cbnZhciBmblVudHlwZWQgPSB7XG4gIGFycmF5U2V0OiBmdW5jdGlvbiAoZGVzdCwgc3JjLCBzcmNfb2ZmcywgbGVuLCBkZXN0X29mZnMpIHtcbiAgICBmb3IodmFyIGk9MDsgaTxsZW47IGkrKykge1xuICAgICAgZGVzdFtkZXN0X29mZnMgKyBpXSA9IHNyY1tzcmNfb2ZmcyArIGldO1xuICAgIH1cbiAgfSxcbiAgLy8gSm9pbiBhcnJheSBvZiBjaHVua3MgdG8gc2luZ2xlIGFycmF5LlxuICBmbGF0dGVuQ2h1bmtzOiBmdW5jdGlvbihjaHVua3MpIHtcbiAgICByZXR1cm4gW10uY29uY2F0LmFwcGx5KFtdLCBjaHVua3MpO1xuICB9XG59O1xuXG5cbi8vIEVuYWJsZS9EaXNhYmxlIHR5cGVkIGFycmF5cyB1c2UsIGZvciB0ZXN0aW5nXG4vL1xuZXhwb3J0cy5zZXRUeXBlZCA9IGZ1bmN0aW9uIChvbikge1xuICBpZiAob24pIHtcbiAgICBleHBvcnRzLkJ1ZjggID0gVWludDhBcnJheTtcbiAgICBleHBvcnRzLkJ1ZjE2ID0gVWludDE2QXJyYXk7XG4gICAgZXhwb3J0cy5CdWYzMiA9IEludDMyQXJyYXk7XG4gICAgZXhwb3J0cy5hc3NpZ24oZXhwb3J0cywgZm5UeXBlZCk7XG4gIH0gZWxzZSB7XG4gICAgZXhwb3J0cy5CdWY4ICA9IEFycmF5O1xuICAgIGV4cG9ydHMuQnVmMTYgPSBBcnJheTtcbiAgICBleHBvcnRzLkJ1ZjMyID0gQXJyYXk7XG4gICAgZXhwb3J0cy5hc3NpZ24oZXhwb3J0cywgZm5VbnR5cGVkKTtcbiAgfVxufTtcblxuZXhwb3J0cy5zZXRUeXBlZChUWVBFRF9PSyk7XG59LHt9XSwyODpbZnVuY3Rpb24oX2RlcmVxXyxtb2R1bGUsZXhwb3J0cyl7XG4vLyBTdHJpbmcgZW5jb2RlL2RlY29kZSBoZWxwZXJzXG4ndXNlIHN0cmljdCc7XG5cblxudmFyIHV0aWxzID0gX2RlcmVxXygnLi9jb21tb24nKTtcblxuXG4vLyBRdWljayBjaGVjayBpZiB3ZSBjYW4gdXNlIGZhc3QgYXJyYXkgdG8gYmluIHN0cmluZyBjb252ZXJzaW9uXG4vL1xuLy8gLSBhcHBseShBcnJheSkgY2FuIGZhaWwgb24gQW5kcm9pZCAyLjJcbi8vIC0gYXBwbHkoVWludDhBcnJheSkgY2FuIGZhaWwgb24gaU9TIDUuMSBTYWZhcnlcbi8vXG52YXIgU1RSX0FQUExZX09LID0gdHJ1ZTtcbnZhciBTVFJfQVBQTFlfVUlBX09LID0gdHJ1ZTtcblxudHJ5IHsgU3RyaW5nLmZyb21DaGFyQ29kZS5hcHBseShudWxsLCBbMF0pOyB9IGNhdGNoKF9fKSB7IFNUUl9BUFBMWV9PSyA9IGZhbHNlOyB9XG50cnkgeyBTdHJpbmcuZnJvbUNoYXJDb2RlLmFwcGx5KG51bGwsIG5ldyBVaW50OEFycmF5KDEpKTsgfSBjYXRjaChfXykgeyBTVFJfQVBQTFlfVUlBX09LID0gZmFsc2U7IH1cblxuXG4vLyBUYWJsZSB3aXRoIHV0ZjggbGVuZ3RocyAoY2FsY3VsYXRlZCBieSBmaXJzdCBieXRlIG9mIHNlcXVlbmNlKVxuLy8gTm90ZSwgdGhhdCA1ICYgNi1ieXRlIHZhbHVlcyBhbmQgc29tZSA0LWJ5dGUgdmFsdWVzIGNhbiBub3QgYmUgcmVwcmVzZW50ZWQgaW4gSlMsXG4vLyBiZWNhdXNlIG1heCBwb3NzaWJsZSBjb2RlcG9pbnQgaXMgMHgxMGZmZmZcbnZhciBfdXRmOGxlbiA9IG5ldyB1dGlscy5CdWY4KDI1Nik7XG5mb3IgKHZhciBpPTA7IGk8MjU2OyBpKyspIHtcbiAgX3V0ZjhsZW5baV0gPSAoaSA+PSAyNTIgPyA2IDogaSA+PSAyNDggPyA1IDogaSA+PSAyNDAgPyA0IDogaSA+PSAyMjQgPyAzIDogaSA+PSAxOTIgPyAyIDogMSk7XG59XG5fdXRmOGxlblsyNTRdPV91dGY4bGVuWzI1NF09MTsgLy8gSW52YWxpZCBzZXF1ZW5jZSBzdGFydFxuXG5cbi8vIGNvbnZlcnQgc3RyaW5nIHRvIGFycmF5ICh0eXBlZCwgd2hlbiBwb3NzaWJsZSlcbmV4cG9ydHMuc3RyaW5nMmJ1ZiA9IGZ1bmN0aW9uIChzdHIpIHtcbiAgdmFyIGJ1ZiwgYywgYzIsIG1fcG9zLCBpLCBzdHJfbGVuID0gc3RyLmxlbmd0aCwgYnVmX2xlbiA9IDA7XG5cbiAgLy8gY291bnQgYmluYXJ5IHNpemVcbiAgZm9yIChtX3BvcyA9IDA7IG1fcG9zIDwgc3RyX2xlbjsgbV9wb3MrKykge1xuICAgIGMgPSBzdHIuY2hhckNvZGVBdChtX3Bvcyk7XG4gICAgaWYgKChjICYgMHhmYzAwKSA9PT0gMHhkODAwICYmIChtX3BvcysxIDwgc3RyX2xlbikpIHtcbiAgICAgIGMyID0gc3RyLmNoYXJDb2RlQXQobV9wb3MrMSk7XG4gICAgICBpZiAoKGMyICYgMHhmYzAwKSA9PT0gMHhkYzAwKSB7XG4gICAgICAgIGMgPSAweDEwMDAwICsgKChjIC0gMHhkODAwKSA8PCAxMCkgKyAoYzIgLSAweGRjMDApO1xuICAgICAgICBtX3BvcysrO1xuICAgICAgfVxuICAgIH1cbiAgICBidWZfbGVuICs9IGMgPCAweDgwID8gMSA6IGMgPCAweDgwMCA/IDIgOiBjIDwgMHgxMDAwMCA/IDMgOiA0O1xuICB9XG5cbiAgLy8gYWxsb2NhdGUgYnVmZmVyXG4gIGJ1ZiA9IG5ldyB1dGlscy5CdWY4KGJ1Zl9sZW4pO1xuXG4gIC8vIGNvbnZlcnRcbiAgZm9yIChpPTAsIG1fcG9zID0gMDsgaSA8IGJ1Zl9sZW47IG1fcG9zKyspIHtcbiAgICBjID0gc3RyLmNoYXJDb2RlQXQobV9wb3MpO1xuICAgIGlmICgoYyAmIDB4ZmMwMCkgPT09IDB4ZDgwMCAmJiAobV9wb3MrMSA8IHN0cl9sZW4pKSB7XG4gICAgICBjMiA9IHN0ci5jaGFyQ29kZUF0KG1fcG9zKzEpO1xuICAgICAgaWYgKChjMiAmIDB4ZmMwMCkgPT09IDB4ZGMwMCkge1xuICAgICAgICBjID0gMHgxMDAwMCArICgoYyAtIDB4ZDgwMCkgPDwgMTApICsgKGMyIC0gMHhkYzAwKTtcbiAgICAgICAgbV9wb3MrKztcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGMgPCAweDgwKSB7XG4gICAgICAvKiBvbmUgYnl0ZSAqL1xuICAgICAgYnVmW2krK10gPSBjO1xuICAgIH0gZWxzZSBpZiAoYyA8IDB4ODAwKSB7XG4gICAgICAvKiB0d28gYnl0ZXMgKi9cbiAgICAgIGJ1ZltpKytdID0gMHhDMCB8IChjID4+PiA2KTtcbiAgICAgIGJ1ZltpKytdID0gMHg4MCB8IChjICYgMHgzZik7XG4gICAgfSBlbHNlIGlmIChjIDwgMHgxMDAwMCkge1xuICAgICAgLyogdGhyZWUgYnl0ZXMgKi9cbiAgICAgIGJ1ZltpKytdID0gMHhFMCB8IChjID4+PiAxMik7XG4gICAgICBidWZbaSsrXSA9IDB4ODAgfCAoYyA+Pj4gNiAmIDB4M2YpO1xuICAgICAgYnVmW2krK10gPSAweDgwIHwgKGMgJiAweDNmKTtcbiAgICB9IGVsc2Uge1xuICAgICAgLyogZm91ciBieXRlcyAqL1xuICAgICAgYnVmW2krK10gPSAweGYwIHwgKGMgPj4+IDE4KTtcbiAgICAgIGJ1ZltpKytdID0gMHg4MCB8IChjID4+PiAxMiAmIDB4M2YpO1xuICAgICAgYnVmW2krK10gPSAweDgwIHwgKGMgPj4+IDYgJiAweDNmKTtcbiAgICAgIGJ1ZltpKytdID0gMHg4MCB8IChjICYgMHgzZik7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGJ1Zjtcbn07XG5cbi8vIEhlbHBlciAodXNlZCBpbiAyIHBsYWNlcylcbmZ1bmN0aW9uIGJ1ZjJiaW5zdHJpbmcoYnVmLCBsZW4pIHtcbiAgLy8gdXNlIGZhbGxiYWNrIGZvciBiaWcgYXJyYXlzIHRvIGF2b2lkIHN0YWNrIG92ZXJmbG93XG4gIGlmIChsZW4gPCA2NTUzNykge1xuICAgIGlmICgoYnVmLnN1YmFycmF5ICYmIFNUUl9BUFBMWV9VSUFfT0spIHx8ICghYnVmLnN1YmFycmF5ICYmIFNUUl9BUFBMWV9PSykpIHtcbiAgICAgIHJldHVybiBTdHJpbmcuZnJvbUNoYXJDb2RlLmFwcGx5KG51bGwsIHV0aWxzLnNocmlua0J1ZihidWYsIGxlbikpO1xuICAgIH1cbiAgfVxuXG4gIHZhciByZXN1bHQgPSAnJztcbiAgZm9yKHZhciBpPTA7IGkgPCBsZW47IGkrKykge1xuICAgIHJlc3VsdCArPSBTdHJpbmcuZnJvbUNoYXJDb2RlKGJ1ZltpXSk7XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuXG4vLyBDb252ZXJ0IGJ5dGUgYXJyYXkgdG8gYmluYXJ5IHN0cmluZ1xuZXhwb3J0cy5idWYyYmluc3RyaW5nID0gZnVuY3Rpb24oYnVmKSB7XG4gIHJldHVybiBidWYyYmluc3RyaW5nKGJ1ZiwgYnVmLmxlbmd0aCk7XG59O1xuXG5cbi8vIENvbnZlcnQgYmluYXJ5IHN0cmluZyAodHlwZWQsIHdoZW4gcG9zc2libGUpXG5leHBvcnRzLmJpbnN0cmluZzJidWYgPSBmdW5jdGlvbihzdHIpIHtcbiAgdmFyIGJ1ZiA9IG5ldyB1dGlscy5CdWY4KHN0ci5sZW5ndGgpO1xuICBmb3IodmFyIGk9MCwgbGVuPWJ1Zi5sZW5ndGg7IGkgPCBsZW47IGkrKykge1xuICAgIGJ1ZltpXSA9IHN0ci5jaGFyQ29kZUF0KGkpO1xuICB9XG4gIHJldHVybiBidWY7XG59O1xuXG5cbi8vIGNvbnZlcnQgYXJyYXkgdG8gc3RyaW5nXG5leHBvcnRzLmJ1ZjJzdHJpbmcgPSBmdW5jdGlvbiAoYnVmLCBtYXgpIHtcbiAgdmFyIGksIG91dCwgYywgY19sZW47XG4gIHZhciBsZW4gPSBtYXggfHwgYnVmLmxlbmd0aDtcblxuICAvLyBSZXNlcnZlIG1heCBwb3NzaWJsZSBsZW5ndGggKDIgd29yZHMgcGVyIGNoYXIpXG4gIC8vIE5COiBieSB1bmtub3duIHJlYXNvbnMsIEFycmF5IGlzIHNpZ25pZmljYW50bHkgZmFzdGVyIGZvclxuICAvLyAgICAgU3RyaW5nLmZyb21DaGFyQ29kZS5hcHBseSB0aGFuIFVpbnQxNkFycmF5LlxuICB2YXIgdXRmMTZidWYgPSBuZXcgQXJyYXkobGVuKjIpO1xuXG4gIGZvciAob3V0PTAsIGk9MDsgaTxsZW47KSB7XG4gICAgYyA9IGJ1ZltpKytdO1xuICAgIC8vIHF1aWNrIHByb2Nlc3MgYXNjaWlcbiAgICBpZiAoYyA8IDB4ODApIHsgdXRmMTZidWZbb3V0KytdID0gYzsgY29udGludWU7IH1cblxuICAgIGNfbGVuID0gX3V0ZjhsZW5bY107XG4gICAgLy8gc2tpcCA1ICYgNiBieXRlIGNvZGVzXG4gICAgaWYgKGNfbGVuID4gNCkgeyB1dGYxNmJ1ZltvdXQrK10gPSAweGZmZmQ7IGkgKz0gY19sZW4tMTsgY29udGludWU7IH1cblxuICAgIC8vIGFwcGx5IG1hc2sgb24gZmlyc3QgYnl0ZVxuICAgIGMgJj0gY19sZW4gPT09IDIgPyAweDFmIDogY19sZW4gPT09IDMgPyAweDBmIDogMHgwNztcbiAgICAvLyBqb2luIHRoZSByZXN0XG4gICAgd2hpbGUgKGNfbGVuID4gMSAmJiBpIDwgbGVuKSB7XG4gICAgICBjID0gKGMgPDwgNikgfCAoYnVmW2krK10gJiAweDNmKTtcbiAgICAgIGNfbGVuLS07XG4gICAgfVxuXG4gICAgLy8gdGVybWluYXRlZCBieSBlbmQgb2Ygc3RyaW5nP1xuICAgIGlmIChjX2xlbiA+IDEpIHsgdXRmMTZidWZbb3V0KytdID0gMHhmZmZkOyBjb250aW51ZTsgfVxuXG4gICAgaWYgKGMgPCAweDEwMDAwKSB7XG4gICAgICB1dGYxNmJ1ZltvdXQrK10gPSBjO1xuICAgIH0gZWxzZSB7XG4gICAgICBjIC09IDB4MTAwMDA7XG4gICAgICB1dGYxNmJ1ZltvdXQrK10gPSAweGQ4MDAgfCAoKGMgPj4gMTApICYgMHgzZmYpO1xuICAgICAgdXRmMTZidWZbb3V0KytdID0gMHhkYzAwIHwgKGMgJiAweDNmZik7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGJ1ZjJiaW5zdHJpbmcodXRmMTZidWYsIG91dCk7XG59O1xuXG5cbi8vIENhbGN1bGF0ZSBtYXggcG9zc2libGUgcG9zaXRpb24gaW4gdXRmOCBidWZmZXIsXG4vLyB0aGF0IHdpbGwgbm90IGJyZWFrIHNlcXVlbmNlLiBJZiB0aGF0J3Mgbm90IHBvc3NpYmxlXG4vLyAtICh2ZXJ5IHNtYWxsIGxpbWl0cykgcmV0dXJuIG1heCBzaXplIGFzIGlzLlxuLy9cbi8vIGJ1ZltdIC0gdXRmOCBieXRlcyBhcnJheVxuLy8gbWF4ICAgLSBsZW5ndGggbGltaXQgKG1hbmRhdG9yeSk7XG5leHBvcnRzLnV0Zjhib3JkZXIgPSBmdW5jdGlvbihidWYsIG1heCkge1xuICB2YXIgcG9zO1xuXG4gIG1heCA9IG1heCB8fCBidWYubGVuZ3RoO1xuICBpZiAobWF4ID4gYnVmLmxlbmd0aCkgeyBtYXggPSBidWYubGVuZ3RoOyB9XG5cbiAgLy8gZ28gYmFjayBmcm9tIGxhc3QgcG9zaXRpb24sIHVudGlsIHN0YXJ0IG9mIHNlcXVlbmNlIGZvdW5kXG4gIHBvcyA9IG1heC0xO1xuICB3aGlsZSAocG9zID49IDAgJiYgKGJ1Zltwb3NdICYgMHhDMCkgPT09IDB4ODApIHsgcG9zLS07IH1cblxuICAvLyBGdWNrdXAgLSB2ZXJ5IHNtYWxsIGFuZCBicm9rZW4gc2VxdWVuY2UsXG4gIC8vIHJldHVybiBtYXgsIGJlY2F1c2Ugd2Ugc2hvdWxkIHJldHVybiBzb21ldGhpbmcgYW55d2F5LlxuICBpZiAocG9zIDwgMCkgeyByZXR1cm4gbWF4OyB9XG5cbiAgLy8gSWYgd2UgY2FtZSB0byBzdGFydCBvZiBidWZmZXIgLSB0aGF0IG1lYW5zIHZ1ZmZlciBpcyB0b28gc21hbGwsXG4gIC8vIHJldHVybiBtYXggdG9vLlxuICBpZiAocG9zID09PSAwKSB7IHJldHVybiBtYXg7IH1cblxuICByZXR1cm4gKHBvcyArIF91dGY4bGVuW2J1Zltwb3NdXSA+IG1heCkgPyBwb3MgOiBtYXg7XG59O1xuXG59LHtcIi4vY29tbW9uXCI6Mjd9XSwyOTpbZnVuY3Rpb24oX2RlcmVxXyxtb2R1bGUsZXhwb3J0cyl7XG4ndXNlIHN0cmljdCc7XG5cbi8vIE5vdGU6IGFkbGVyMzIgdGFrZXMgMTIlIGZvciBsZXZlbCAwIGFuZCAyJSBmb3IgbGV2ZWwgNi5cbi8vIEl0IGRvZXNuJ3Qgd29ydGggdG8gbWFrZSBhZGRpdGlvbmFsIG9wdGltaXphdGlvbmEgYXMgaW4gb3JpZ2luYWwuXG4vLyBTbWFsbCBzaXplIGlzIHByZWZlcmFibGUuXG5cbmZ1bmN0aW9uIGFkbGVyMzIoYWRsZXIsIGJ1ZiwgbGVuLCBwb3MpIHtcbiAgdmFyIHMxID0gKGFkbGVyICYgMHhmZmZmKSB8MFxuICAgICwgczIgPSAoKGFkbGVyID4+PiAxNikgJiAweGZmZmYpIHwwXG4gICAgLCBuID0gMDtcblxuICB3aGlsZSAobGVuICE9PSAwKSB7XG4gICAgLy8gU2V0IGxpbWl0IH4gdHdpY2UgbGVzcyB0aGFuIDU1NTIsIHRvIGtlZXBcbiAgICAvLyBzMiBpbiAzMS1iaXRzLCBiZWNhdXNlIHdlIGZvcmNlIHNpZ25lZCBpbnRzLlxuICAgIC8vIGluIG90aGVyIGNhc2UgJT0gd2lsbCBmYWlsLlxuICAgIG4gPSBsZW4gPiAyMDAwID8gMjAwMCA6IGxlbjtcbiAgICBsZW4gLT0gbjtcblxuICAgIGRvIHtcbiAgICAgIHMxID0gKHMxICsgYnVmW3BvcysrXSkgfDA7XG4gICAgICBzMiA9IChzMiArIHMxKSB8MDtcbiAgICB9IHdoaWxlICgtLW4pO1xuXG4gICAgczEgJT0gNjU1MjE7XG4gICAgczIgJT0gNjU1MjE7XG4gIH1cblxuICByZXR1cm4gKHMxIHwgKHMyIDw8IDE2KSkgfDA7XG59XG5cblxubW9kdWxlLmV4cG9ydHMgPSBhZGxlcjMyO1xufSx7fV0sMzA6W2Z1bmN0aW9uKF9kZXJlcV8sbW9kdWxlLGV4cG9ydHMpe1xubW9kdWxlLmV4cG9ydHMgPSB7XG5cbiAgLyogQWxsb3dlZCBmbHVzaCB2YWx1ZXM7IHNlZSBkZWZsYXRlKCkgYW5kIGluZmxhdGUoKSBiZWxvdyBmb3IgZGV0YWlscyAqL1xuICBaX05PX0ZMVVNIOiAgICAgICAgIDAsXG4gIFpfUEFSVElBTF9GTFVTSDogICAgMSxcbiAgWl9TWU5DX0ZMVVNIOiAgICAgICAyLFxuICBaX0ZVTExfRkxVU0g6ICAgICAgIDMsXG4gIFpfRklOSVNIOiAgICAgICAgICAgNCxcbiAgWl9CTE9DSzogICAgICAgICAgICA1LFxuICBaX1RSRUVTOiAgICAgICAgICAgIDYsXG5cbiAgLyogUmV0dXJuIGNvZGVzIGZvciB0aGUgY29tcHJlc3Npb24vZGVjb21wcmVzc2lvbiBmdW5jdGlvbnMuIE5lZ2F0aXZlIHZhbHVlc1xuICAqIGFyZSBlcnJvcnMsIHBvc2l0aXZlIHZhbHVlcyBhcmUgdXNlZCBmb3Igc3BlY2lhbCBidXQgbm9ybWFsIGV2ZW50cy5cbiAgKi9cbiAgWl9PSzogICAgICAgICAgICAgICAwLFxuICBaX1NUUkVBTV9FTkQ6ICAgICAgIDEsXG4gIFpfTkVFRF9ESUNUOiAgICAgICAgMixcbiAgWl9FUlJOTzogICAgICAgICAgIC0xLFxuICBaX1NUUkVBTV9FUlJPUjogICAgLTIsXG4gIFpfREFUQV9FUlJPUjogICAgICAtMyxcbiAgLy9aX01FTV9FUlJPUjogICAgIC00LFxuICBaX0JVRl9FUlJPUjogICAgICAgLTUsXG4gIC8vWl9WRVJTSU9OX0VSUk9SOiAtNixcblxuICAvKiBjb21wcmVzc2lvbiBsZXZlbHMgKi9cbiAgWl9OT19DT01QUkVTU0lPTjogICAgICAgICAwLFxuICBaX0JFU1RfU1BFRUQ6ICAgICAgICAgICAgIDEsXG4gIFpfQkVTVF9DT01QUkVTU0lPTjogICAgICAgOSxcbiAgWl9ERUZBVUxUX0NPTVBSRVNTSU9OOiAgIC0xLFxuXG5cbiAgWl9GSUxURVJFRDogICAgICAgICAgICAgICAxLFxuICBaX0hVRkZNQU5fT05MWTogICAgICAgICAgIDIsXG4gIFpfUkxFOiAgICAgICAgICAgICAgICAgICAgMyxcbiAgWl9GSVhFRDogICAgICAgICAgICAgICAgICA0LFxuICBaX0RFRkFVTFRfU1RSQVRFR1k6ICAgICAgIDAsXG5cbiAgLyogUG9zc2libGUgdmFsdWVzIG9mIHRoZSBkYXRhX3R5cGUgZmllbGQgKHRob3VnaCBzZWUgaW5mbGF0ZSgpKSAqL1xuICBaX0JJTkFSWTogICAgICAgICAgICAgICAgIDAsXG4gIFpfVEVYVDogICAgICAgICAgICAgICAgICAgMSxcbiAgLy9aX0FTQ0lJOiAgICAgICAgICAgICAgICAxLCAvLyA9IFpfVEVYVCAoZGVwcmVjYXRlZClcbiAgWl9VTktOT1dOOiAgICAgICAgICAgICAgICAyLFxuXG4gIC8qIFRoZSBkZWZsYXRlIGNvbXByZXNzaW9uIG1ldGhvZCAqL1xuICBaX0RFRkxBVEVEOiAgICAgICAgICAgICAgIDhcbiAgLy9aX05VTEw6ICAgICAgICAgICAgICAgICBudWxsIC8vIFVzZSAtMSBvciBudWxsIGlubGluZSwgZGVwZW5kaW5nIG9uIHZhciB0eXBlXG59O1xufSx7fV0sMzE6W2Z1bmN0aW9uKF9kZXJlcV8sbW9kdWxlLGV4cG9ydHMpe1xuJ3VzZSBzdHJpY3QnO1xuXG4vLyBOb3RlOiB3ZSBjYW4ndCBnZXQgc2lnbmlmaWNhbnQgc3BlZWQgYm9vc3QgaGVyZS5cbi8vIFNvIHdyaXRlIGNvZGUgdG8gbWluaW1pemUgc2l6ZSAtIG5vIHByZWdlbmVyYXRlZCB0YWJsZXNcbi8vIGFuZCBhcnJheSB0b29scyBkZXBlbmRlbmNpZXMuXG5cblxuLy8gVXNlIG9yZGluYXJ5IGFycmF5LCBzaW5jZSB1bnR5cGVkIG1ha2VzIG5vIGJvb3N0IGhlcmVcbmZ1bmN0aW9uIG1ha2VUYWJsZSgpIHtcbiAgdmFyIGMsIHRhYmxlID0gW107XG5cbiAgZm9yKHZhciBuID0wOyBuIDwgMjU2OyBuKyspe1xuICAgIGMgPSBuO1xuICAgIGZvcih2YXIgayA9MDsgayA8IDg7IGsrKyl7XG4gICAgICBjID0gKChjJjEpID8gKDB4RURCODgzMjAgXiAoYyA+Pj4gMSkpIDogKGMgPj4+IDEpKTtcbiAgICB9XG4gICAgdGFibGVbbl0gPSBjO1xuICB9XG5cbiAgcmV0dXJuIHRhYmxlO1xufVxuXG4vLyBDcmVhdGUgdGFibGUgb24gbG9hZC4gSnVzdCAyNTUgc2lnbmVkIGxvbmdzLiBOb3QgYSBwcm9ibGVtLlxudmFyIGNyY1RhYmxlID0gbWFrZVRhYmxlKCk7XG5cblxuZnVuY3Rpb24gY3JjMzIoY3JjLCBidWYsIGxlbiwgcG9zKSB7XG4gIHZhciB0ID0gY3JjVGFibGVcbiAgICAsIGVuZCA9IHBvcyArIGxlbjtcblxuICBjcmMgPSBjcmMgXiAoLTEpO1xuXG4gIGZvciAodmFyIGkgPSBwb3M7IGkgPCBlbmQ7IGkrKyApIHtcbiAgICBjcmMgPSAoY3JjID4+PiA4KSBeIHRbKGNyYyBeIGJ1ZltpXSkgJiAweEZGXTtcbiAgfVxuXG4gIHJldHVybiAoY3JjIF4gKC0xKSk7IC8vID4+PiAwO1xufVxuXG5cbm1vZHVsZS5leHBvcnRzID0gY3JjMzI7XG59LHt9XSwzMjpbZnVuY3Rpb24oX2RlcmVxXyxtb2R1bGUsZXhwb3J0cyl7XG4ndXNlIHN0cmljdCc7XG5cbnZhciB1dGlscyAgID0gX2RlcmVxXygnLi4vdXRpbHMvY29tbW9uJyk7XG52YXIgdHJlZXMgICA9IF9kZXJlcV8oJy4vdHJlZXMnKTtcbnZhciBhZGxlcjMyID0gX2RlcmVxXygnLi9hZGxlcjMyJyk7XG52YXIgY3JjMzIgICA9IF9kZXJlcV8oJy4vY3JjMzInKTtcbnZhciBtc2cgICA9IF9kZXJlcV8oJy4vbWVzc2FnZXMnKTtcblxuLyogUHVibGljIGNvbnN0YW50cyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki9cbi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovXG5cblxuLyogQWxsb3dlZCBmbHVzaCB2YWx1ZXM7IHNlZSBkZWZsYXRlKCkgYW5kIGluZmxhdGUoKSBiZWxvdyBmb3IgZGV0YWlscyAqL1xudmFyIFpfTk9fRkxVU0ggICAgICA9IDA7XG52YXIgWl9QQVJUSUFMX0ZMVVNIID0gMTtcbi8vdmFyIFpfU1lOQ19GTFVTSCAgICA9IDI7XG52YXIgWl9GVUxMX0ZMVVNIICAgID0gMztcbnZhciBaX0ZJTklTSCAgICAgICAgPSA0O1xudmFyIFpfQkxPQ0sgICAgICAgICA9IDU7XG4vL3ZhciBaX1RSRUVTICAgICAgICAgPSA2O1xuXG5cbi8qIFJldHVybiBjb2RlcyBmb3IgdGhlIGNvbXByZXNzaW9uL2RlY29tcHJlc3Npb24gZnVuY3Rpb25zLiBOZWdhdGl2ZSB2YWx1ZXNcbiAqIGFyZSBlcnJvcnMsIHBvc2l0aXZlIHZhbHVlcyBhcmUgdXNlZCBmb3Igc3BlY2lhbCBidXQgbm9ybWFsIGV2ZW50cy5cbiAqL1xudmFyIFpfT0sgICAgICAgICAgICA9IDA7XG52YXIgWl9TVFJFQU1fRU5EICAgID0gMTtcbi8vdmFyIFpfTkVFRF9ESUNUICAgICA9IDI7XG4vL3ZhciBaX0VSUk5PICAgICAgICAgPSAtMTtcbnZhciBaX1NUUkVBTV9FUlJPUiAgPSAtMjtcbnZhciBaX0RBVEFfRVJST1IgICAgPSAtMztcbi8vdmFyIFpfTUVNX0VSUk9SICAgICA9IC00O1xudmFyIFpfQlVGX0VSUk9SICAgICA9IC01O1xuLy92YXIgWl9WRVJTSU9OX0VSUk9SID0gLTY7XG5cblxuLyogY29tcHJlc3Npb24gbGV2ZWxzICovXG4vL3ZhciBaX05PX0NPTVBSRVNTSU9OICAgICAgPSAwO1xuLy92YXIgWl9CRVNUX1NQRUVEICAgICAgICAgID0gMTtcbi8vdmFyIFpfQkVTVF9DT01QUkVTU0lPTiAgICA9IDk7XG52YXIgWl9ERUZBVUxUX0NPTVBSRVNTSU9OID0gLTE7XG5cblxudmFyIFpfRklMVEVSRUQgICAgICAgICAgICA9IDE7XG52YXIgWl9IVUZGTUFOX09OTFkgICAgICAgID0gMjtcbnZhciBaX1JMRSAgICAgICAgICAgICAgICAgPSAzO1xudmFyIFpfRklYRUQgICAgICAgICAgICAgICA9IDQ7XG52YXIgWl9ERUZBVUxUX1NUUkFURUdZICAgID0gMDtcblxuLyogUG9zc2libGUgdmFsdWVzIG9mIHRoZSBkYXRhX3R5cGUgZmllbGQgKHRob3VnaCBzZWUgaW5mbGF0ZSgpKSAqL1xuLy92YXIgWl9CSU5BUlkgICAgICAgICAgICAgID0gMDtcbi8vdmFyIFpfVEVYVCAgICAgICAgICAgICAgICA9IDE7XG4vL3ZhciBaX0FTQ0lJICAgICAgICAgICAgICAgPSAxOyAvLyA9IFpfVEVYVFxudmFyIFpfVU5LTk9XTiAgICAgICAgICAgICA9IDI7XG5cblxuLyogVGhlIGRlZmxhdGUgY29tcHJlc3Npb24gbWV0aG9kICovXG52YXIgWl9ERUZMQVRFRCAgPSA4O1xuXG4vKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qL1xuXG5cbnZhciBNQVhfTUVNX0xFVkVMID0gOTtcbi8qIE1heGltdW0gdmFsdWUgZm9yIG1lbUxldmVsIGluIGRlZmxhdGVJbml0MiAqL1xudmFyIE1BWF9XQklUUyA9IDE1O1xuLyogMzJLIExaNzcgd2luZG93ICovXG52YXIgREVGX01FTV9MRVZFTCA9IDg7XG5cblxudmFyIExFTkdUSF9DT0RFUyAgPSAyOTtcbi8qIG51bWJlciBvZiBsZW5ndGggY29kZXMsIG5vdCBjb3VudGluZyB0aGUgc3BlY2lhbCBFTkRfQkxPQ0sgY29kZSAqL1xudmFyIExJVEVSQUxTICAgICAgPSAyNTY7XG4vKiBudW1iZXIgb2YgbGl0ZXJhbCBieXRlcyAwLi4yNTUgKi9cbnZhciBMX0NPREVTICAgICAgID0gTElURVJBTFMgKyAxICsgTEVOR1RIX0NPREVTO1xuLyogbnVtYmVyIG9mIExpdGVyYWwgb3IgTGVuZ3RoIGNvZGVzLCBpbmNsdWRpbmcgdGhlIEVORF9CTE9DSyBjb2RlICovXG52YXIgRF9DT0RFUyAgICAgICA9IDMwO1xuLyogbnVtYmVyIG9mIGRpc3RhbmNlIGNvZGVzICovXG52YXIgQkxfQ09ERVMgICAgICA9IDE5O1xuLyogbnVtYmVyIG9mIGNvZGVzIHVzZWQgdG8gdHJhbnNmZXIgdGhlIGJpdCBsZW5ndGhzICovXG52YXIgSEVBUF9TSVpFICAgICA9IDIqTF9DT0RFUyArIDE7XG4vKiBtYXhpbXVtIGhlYXAgc2l6ZSAqL1xudmFyIE1BWF9CSVRTICA9IDE1O1xuLyogQWxsIGNvZGVzIG11c3Qgbm90IGV4Y2VlZCBNQVhfQklUUyBiaXRzICovXG5cbnZhciBNSU5fTUFUQ0ggPSAzO1xudmFyIE1BWF9NQVRDSCA9IDI1ODtcbnZhciBNSU5fTE9PS0FIRUFEID0gKE1BWF9NQVRDSCArIE1JTl9NQVRDSCArIDEpO1xuXG52YXIgUFJFU0VUX0RJQ1QgPSAweDIwO1xuXG52YXIgSU5JVF9TVEFURSA9IDQyO1xudmFyIEVYVFJBX1NUQVRFID0gNjk7XG52YXIgTkFNRV9TVEFURSA9IDczO1xudmFyIENPTU1FTlRfU1RBVEUgPSA5MTtcbnZhciBIQ1JDX1NUQVRFID0gMTAzO1xudmFyIEJVU1lfU1RBVEUgPSAxMTM7XG52YXIgRklOSVNIX1NUQVRFID0gNjY2O1xuXG52YXIgQlNfTkVFRF9NT1JFICAgICAgPSAxOyAvKiBibG9jayBub3QgY29tcGxldGVkLCBuZWVkIG1vcmUgaW5wdXQgb3IgbW9yZSBvdXRwdXQgKi9cbnZhciBCU19CTE9DS19ET05FICAgICA9IDI7IC8qIGJsb2NrIGZsdXNoIHBlcmZvcm1lZCAqL1xudmFyIEJTX0ZJTklTSF9TVEFSVEVEID0gMzsgLyogZmluaXNoIHN0YXJ0ZWQsIG5lZWQgb25seSBtb3JlIG91dHB1dCBhdCBuZXh0IGRlZmxhdGUgKi9cbnZhciBCU19GSU5JU0hfRE9ORSAgICA9IDQ7IC8qIGZpbmlzaCBkb25lLCBhY2NlcHQgbm8gbW9yZSBpbnB1dCBvciBvdXRwdXQgKi9cblxudmFyIE9TX0NPREUgPSAweDAzOyAvLyBVbml4IDopIC4gRG9uJ3QgZGV0ZWN0LCB1c2UgdGhpcyBkZWZhdWx0LlxuXG5mdW5jdGlvbiBlcnIoc3RybSwgZXJyb3JDb2RlKSB7XG4gIHN0cm0ubXNnID0gbXNnW2Vycm9yQ29kZV07XG4gIHJldHVybiBlcnJvckNvZGU7XG59XG5cbmZ1bmN0aW9uIHJhbmsoZikge1xuICByZXR1cm4gKChmKSA8PCAxKSAtICgoZikgPiA0ID8gOSA6IDApO1xufVxuXG5mdW5jdGlvbiB6ZXJvKGJ1ZikgeyB2YXIgbGVuID0gYnVmLmxlbmd0aDsgd2hpbGUgKC0tbGVuID49IDApIHsgYnVmW2xlbl0gPSAwOyB9IH1cblxuXG4vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKiBGbHVzaCBhcyBtdWNoIHBlbmRpbmcgb3V0cHV0IGFzIHBvc3NpYmxlLiBBbGwgZGVmbGF0ZSgpIG91dHB1dCBnb2VzXG4gKiB0aHJvdWdoIHRoaXMgZnVuY3Rpb24gc28gc29tZSBhcHBsaWNhdGlvbnMgbWF5IHdpc2ggdG8gbW9kaWZ5IGl0XG4gKiB0byBhdm9pZCBhbGxvY2F0aW5nIGEgbGFyZ2Ugc3RybS0+b3V0cHV0IGJ1ZmZlciBhbmQgY29weWluZyBpbnRvIGl0LlxuICogKFNlZSBhbHNvIHJlYWRfYnVmKCkpLlxuICovXG5mdW5jdGlvbiBmbHVzaF9wZW5kaW5nKHN0cm0pIHtcbiAgdmFyIHMgPSBzdHJtLnN0YXRlO1xuXG4gIC8vX3RyX2ZsdXNoX2JpdHMocyk7XG4gIHZhciBsZW4gPSBzLnBlbmRpbmc7XG4gIGlmIChsZW4gPiBzdHJtLmF2YWlsX291dCkge1xuICAgIGxlbiA9IHN0cm0uYXZhaWxfb3V0O1xuICB9XG4gIGlmIChsZW4gPT09IDApIHsgcmV0dXJuOyB9XG5cbiAgdXRpbHMuYXJyYXlTZXQoc3RybS5vdXRwdXQsIHMucGVuZGluZ19idWYsIHMucGVuZGluZ19vdXQsIGxlbiwgc3RybS5uZXh0X291dCk7XG4gIHN0cm0ubmV4dF9vdXQgKz0gbGVuO1xuICBzLnBlbmRpbmdfb3V0ICs9IGxlbjtcbiAgc3RybS50b3RhbF9vdXQgKz0gbGVuO1xuICBzdHJtLmF2YWlsX291dCAtPSBsZW47XG4gIHMucGVuZGluZyAtPSBsZW47XG4gIGlmIChzLnBlbmRpbmcgPT09IDApIHtcbiAgICBzLnBlbmRpbmdfb3V0ID0gMDtcbiAgfVxufVxuXG5cbmZ1bmN0aW9uIGZsdXNoX2Jsb2NrX29ubHkgKHMsIGxhc3QpIHtcbiAgdHJlZXMuX3RyX2ZsdXNoX2Jsb2NrKHMsIChzLmJsb2NrX3N0YXJ0ID49IDAgPyBzLmJsb2NrX3N0YXJ0IDogLTEpLCBzLnN0cnN0YXJ0IC0gcy5ibG9ja19zdGFydCwgbGFzdCk7XG4gIHMuYmxvY2tfc3RhcnQgPSBzLnN0cnN0YXJ0O1xuICBmbHVzaF9wZW5kaW5nKHMuc3RybSk7XG59XG5cblxuZnVuY3Rpb24gcHV0X2J5dGUocywgYikge1xuICBzLnBlbmRpbmdfYnVmW3MucGVuZGluZysrXSA9IGI7XG59XG5cblxuLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICogUHV0IGEgc2hvcnQgaW4gdGhlIHBlbmRpbmcgYnVmZmVyLiBUaGUgMTYtYml0IHZhbHVlIGlzIHB1dCBpbiBNU0Igb3JkZXIuXG4gKiBJTiBhc3NlcnRpb246IHRoZSBzdHJlYW0gc3RhdGUgaXMgY29ycmVjdCBhbmQgdGhlcmUgaXMgZW5vdWdoIHJvb20gaW5cbiAqIHBlbmRpbmdfYnVmLlxuICovXG5mdW5jdGlvbiBwdXRTaG9ydE1TQihzLCBiKSB7XG4vLyAgcHV0X2J5dGUocywgKEJ5dGUpKGIgPj4gOCkpO1xuLy8gIHB1dF9ieXRlKHMsIChCeXRlKShiICYgMHhmZikpO1xuICBzLnBlbmRpbmdfYnVmW3MucGVuZGluZysrXSA9IChiID4+PiA4KSAmIDB4ZmY7XG4gIHMucGVuZGluZ19idWZbcy5wZW5kaW5nKytdID0gYiAmIDB4ZmY7XG59XG5cblxuLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKiBSZWFkIGEgbmV3IGJ1ZmZlciBmcm9tIHRoZSBjdXJyZW50IGlucHV0IHN0cmVhbSwgdXBkYXRlIHRoZSBhZGxlcjMyXG4gKiBhbmQgdG90YWwgbnVtYmVyIG9mIGJ5dGVzIHJlYWQuICBBbGwgZGVmbGF0ZSgpIGlucHV0IGdvZXMgdGhyb3VnaFxuICogdGhpcyBmdW5jdGlvbiBzbyBzb21lIGFwcGxpY2F0aW9ucyBtYXkgd2lzaCB0byBtb2RpZnkgaXQgdG8gYXZvaWRcbiAqIGFsbG9jYXRpbmcgYSBsYXJnZSBzdHJtLT5pbnB1dCBidWZmZXIgYW5kIGNvcHlpbmcgZnJvbSBpdC5cbiAqIChTZWUgYWxzbyBmbHVzaF9wZW5kaW5nKCkpLlxuICovXG5mdW5jdGlvbiByZWFkX2J1ZihzdHJtLCBidWYsIHN0YXJ0LCBzaXplKSB7XG4gIHZhciBsZW4gPSBzdHJtLmF2YWlsX2luO1xuXG4gIGlmIChsZW4gPiBzaXplKSB7IGxlbiA9IHNpemU7IH1cbiAgaWYgKGxlbiA9PT0gMCkgeyByZXR1cm4gMDsgfVxuXG4gIHN0cm0uYXZhaWxfaW4gLT0gbGVuO1xuXG4gIHV0aWxzLmFycmF5U2V0KGJ1Ziwgc3RybS5pbnB1dCwgc3RybS5uZXh0X2luLCBsZW4sIHN0YXJ0KTtcbiAgaWYgKHN0cm0uc3RhdGUud3JhcCA9PT0gMSkge1xuICAgIHN0cm0uYWRsZXIgPSBhZGxlcjMyKHN0cm0uYWRsZXIsIGJ1ZiwgbGVuLCBzdGFydCk7XG4gIH1cblxuICBlbHNlIGlmIChzdHJtLnN0YXRlLndyYXAgPT09IDIpIHtcbiAgICBzdHJtLmFkbGVyID0gY3JjMzIoc3RybS5hZGxlciwgYnVmLCBsZW4sIHN0YXJ0KTtcbiAgfVxuXG4gIHN0cm0ubmV4dF9pbiArPSBsZW47XG4gIHN0cm0udG90YWxfaW4gKz0gbGVuO1xuXG4gIHJldHVybiBsZW47XG59XG5cblxuLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKiBTZXQgbWF0Y2hfc3RhcnQgdG8gdGhlIGxvbmdlc3QgbWF0Y2ggc3RhcnRpbmcgYXQgdGhlIGdpdmVuIHN0cmluZyBhbmRcbiAqIHJldHVybiBpdHMgbGVuZ3RoLiBNYXRjaGVzIHNob3J0ZXIgb3IgZXF1YWwgdG8gcHJldl9sZW5ndGggYXJlIGRpc2NhcmRlZCxcbiAqIGluIHdoaWNoIGNhc2UgdGhlIHJlc3VsdCBpcyBlcXVhbCB0byBwcmV2X2xlbmd0aCBhbmQgbWF0Y2hfc3RhcnQgaXNcbiAqIGdhcmJhZ2UuXG4gKiBJTiBhc3NlcnRpb25zOiBjdXJfbWF0Y2ggaXMgdGhlIGhlYWQgb2YgdGhlIGhhc2ggY2hhaW4gZm9yIHRoZSBjdXJyZW50XG4gKiAgIHN0cmluZyAoc3Ryc3RhcnQpIGFuZCBpdHMgZGlzdGFuY2UgaXMgPD0gTUFYX0RJU1QsIGFuZCBwcmV2X2xlbmd0aCA+PSAxXG4gKiBPVVQgYXNzZXJ0aW9uOiB0aGUgbWF0Y2ggbGVuZ3RoIGlzIG5vdCBncmVhdGVyIHRoYW4gcy0+bG9va2FoZWFkLlxuICovXG5mdW5jdGlvbiBsb25nZXN0X21hdGNoKHMsIGN1cl9tYXRjaCkge1xuICB2YXIgY2hhaW5fbGVuZ3RoID0gcy5tYXhfY2hhaW5fbGVuZ3RoOyAgICAgIC8qIG1heCBoYXNoIGNoYWluIGxlbmd0aCAqL1xuICB2YXIgc2NhbiA9IHMuc3Ryc3RhcnQ7IC8qIGN1cnJlbnQgc3RyaW5nICovXG4gIHZhciBtYXRjaDsgICAgICAgICAgICAgICAgICAgICAgIC8qIG1hdGNoZWQgc3RyaW5nICovXG4gIHZhciBsZW47ICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogbGVuZ3RoIG9mIGN1cnJlbnQgbWF0Y2ggKi9cbiAgdmFyIGJlc3RfbGVuID0gcy5wcmV2X2xlbmd0aDsgICAgICAgICAgICAgIC8qIGJlc3QgbWF0Y2ggbGVuZ3RoIHNvIGZhciAqL1xuICB2YXIgbmljZV9tYXRjaCA9IHMubmljZV9tYXRjaDsgICAgICAgICAgICAgLyogc3RvcCBpZiBtYXRjaCBsb25nIGVub3VnaCAqL1xuICB2YXIgbGltaXQgPSAocy5zdHJzdGFydCA+IChzLndfc2l6ZSAtIE1JTl9MT09LQUhFQUQpKSA/XG4gICAgICBzLnN0cnN0YXJ0IC0gKHMud19zaXplIC0gTUlOX0xPT0tBSEVBRCkgOiAwLypOSUwqLztcblxuICB2YXIgX3dpbiA9IHMud2luZG93OyAvLyBzaG9ydGN1dFxuXG4gIHZhciB3bWFzayA9IHMud19tYXNrO1xuICB2YXIgcHJldiAgPSBzLnByZXY7XG5cbiAgLyogU3RvcCB3aGVuIGN1cl9tYXRjaCBiZWNvbWVzIDw9IGxpbWl0LiBUbyBzaW1wbGlmeSB0aGUgY29kZSxcbiAgICogd2UgcHJldmVudCBtYXRjaGVzIHdpdGggdGhlIHN0cmluZyBvZiB3aW5kb3cgaW5kZXggMC5cbiAgICovXG5cbiAgdmFyIHN0cmVuZCA9IHMuc3Ryc3RhcnQgKyBNQVhfTUFUQ0g7XG4gIHZhciBzY2FuX2VuZDEgID0gX3dpbltzY2FuICsgYmVzdF9sZW4gLSAxXTtcbiAgdmFyIHNjYW5fZW5kICAgPSBfd2luW3NjYW4gKyBiZXN0X2xlbl07XG5cbiAgLyogVGhlIGNvZGUgaXMgb3B0aW1pemVkIGZvciBIQVNIX0JJVFMgPj0gOCBhbmQgTUFYX01BVENILTIgbXVsdGlwbGUgb2YgMTYuXG4gICAqIEl0IGlzIGVhc3kgdG8gZ2V0IHJpZCBvZiB0aGlzIG9wdGltaXphdGlvbiBpZiBuZWNlc3NhcnkuXG4gICAqL1xuICAvLyBBc3NlcnQocy0+aGFzaF9iaXRzID49IDggJiYgTUFYX01BVENIID09IDI1OCwgXCJDb2RlIHRvbyBjbGV2ZXJcIik7XG5cbiAgLyogRG8gbm90IHdhc3RlIHRvbyBtdWNoIHRpbWUgaWYgd2UgYWxyZWFkeSBoYXZlIGEgZ29vZCBtYXRjaDogKi9cbiAgaWYgKHMucHJldl9sZW5ndGggPj0gcy5nb29kX21hdGNoKSB7XG4gICAgY2hhaW5fbGVuZ3RoID4+PSAyO1xuICB9XG4gIC8qIERvIG5vdCBsb29rIGZvciBtYXRjaGVzIGJleW9uZCB0aGUgZW5kIG9mIHRoZSBpbnB1dC4gVGhpcyBpcyBuZWNlc3NhcnlcbiAgICogdG8gbWFrZSBkZWZsYXRlIGRldGVybWluaXN0aWMuXG4gICAqL1xuICBpZiAobmljZV9tYXRjaCA+IHMubG9va2FoZWFkKSB7IG5pY2VfbWF0Y2ggPSBzLmxvb2thaGVhZDsgfVxuXG4gIC8vIEFzc2VydCgodWxnKXMtPnN0cnN0YXJ0IDw9IHMtPndpbmRvd19zaXplLU1JTl9MT09LQUhFQUQsIFwibmVlZCBsb29rYWhlYWRcIik7XG5cbiAgZG8ge1xuICAgIC8vIEFzc2VydChjdXJfbWF0Y2ggPCBzLT5zdHJzdGFydCwgXCJubyBmdXR1cmVcIik7XG4gICAgbWF0Y2ggPSBjdXJfbWF0Y2g7XG5cbiAgICAvKiBTa2lwIHRvIG5leHQgbWF0Y2ggaWYgdGhlIG1hdGNoIGxlbmd0aCBjYW5ub3QgaW5jcmVhc2VcbiAgICAgKiBvciBpZiB0aGUgbWF0Y2ggbGVuZ3RoIGlzIGxlc3MgdGhhbiAyLiAgTm90ZSB0aGF0IHRoZSBjaGVja3MgYmVsb3dcbiAgICAgKiBmb3IgaW5zdWZmaWNpZW50IGxvb2thaGVhZCBvbmx5IG9jY3VyIG9jY2FzaW9uYWxseSBmb3IgcGVyZm9ybWFuY2VcbiAgICAgKiByZWFzb25zLiAgVGhlcmVmb3JlIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IHdpbGwgYmUgYWNjZXNzZWQsIGFuZFxuICAgICAqIGNvbmRpdGlvbmFsIGp1bXBzIHdpbGwgYmUgbWFkZSB0aGF0IGRlcGVuZCBvbiB0aG9zZSB2YWx1ZXMuXG4gICAgICogSG93ZXZlciB0aGUgbGVuZ3RoIG9mIHRoZSBtYXRjaCBpcyBsaW1pdGVkIHRvIHRoZSBsb29rYWhlYWQsIHNvXG4gICAgICogdGhlIG91dHB1dCBvZiBkZWZsYXRlIGlzIG5vdCBhZmZlY3RlZCBieSB0aGUgdW5pbml0aWFsaXplZCB2YWx1ZXMuXG4gICAgICovXG5cbiAgICBpZiAoX3dpblttYXRjaCArIGJlc3RfbGVuXSAgICAgIT09IHNjYW5fZW5kICB8fFxuICAgICAgICBfd2luW21hdGNoICsgYmVzdF9sZW4gLSAxXSAhPT0gc2Nhbl9lbmQxIHx8XG4gICAgICAgIF93aW5bbWF0Y2hdICAgICAgICAgICAgICAgICE9PSBfd2luW3NjYW5dIHx8XG4gICAgICAgIF93aW5bKyttYXRjaF0gICAgICAgICAgICAgICE9PSBfd2luW3NjYW4gKyAxXSkge1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgLyogVGhlIGNoZWNrIGF0IGJlc3RfbGVuLTEgY2FuIGJlIHJlbW92ZWQgYmVjYXVzZSBpdCB3aWxsIGJlIG1hZGVcbiAgICAgKiBhZ2FpbiBsYXRlci4gKFRoaXMgaGV1cmlzdGljIGlzIG5vdCBhbHdheXMgYSB3aW4uKVxuICAgICAqIEl0IGlzIG5vdCBuZWNlc3NhcnkgdG8gY29tcGFyZSBzY2FuWzJdIGFuZCBtYXRjaFsyXSBzaW5jZSB0aGV5XG4gICAgICogYXJlIGFsd2F5cyBlcXVhbCB3aGVuIHRoZSBvdGhlciBieXRlcyBtYXRjaCwgZ2l2ZW4gdGhhdFxuICAgICAqIHRoZSBoYXNoIGtleXMgYXJlIGVxdWFsIGFuZCB0aGF0IEhBU0hfQklUUyA+PSA4LlxuICAgICAqL1xuICAgIHNjYW4gKz0gMjtcbiAgICBtYXRjaCsrO1xuICAgIC8vIEFzc2VydCgqc2NhbiA9PSAqbWF0Y2gsIFwibWF0Y2hbMl0/XCIpO1xuXG4gICAgLyogV2UgY2hlY2sgZm9yIGluc3VmZmljaWVudCBsb29rYWhlYWQgb25seSBldmVyeSA4dGggY29tcGFyaXNvbjtcbiAgICAgKiB0aGUgMjU2dGggY2hlY2sgd2lsbCBiZSBtYWRlIGF0IHN0cnN0YXJ0KzI1OC5cbiAgICAgKi9cbiAgICBkbyB7XG4gICAgICAvKmpzaGludCBub2VtcHR5OmZhbHNlKi9cbiAgICB9IHdoaWxlIChfd2luWysrc2Nhbl0gPT09IF93aW5bKyttYXRjaF0gJiYgX3dpblsrK3NjYW5dID09PSBfd2luWysrbWF0Y2hdICYmXG4gICAgICAgICAgICAgX3dpblsrK3NjYW5dID09PSBfd2luWysrbWF0Y2hdICYmIF93aW5bKytzY2FuXSA9PT0gX3dpblsrK21hdGNoXSAmJlxuICAgICAgICAgICAgIF93aW5bKytzY2FuXSA9PT0gX3dpblsrK21hdGNoXSAmJiBfd2luWysrc2Nhbl0gPT09IF93aW5bKyttYXRjaF0gJiZcbiAgICAgICAgICAgICBfd2luWysrc2Nhbl0gPT09IF93aW5bKyttYXRjaF0gJiYgX3dpblsrK3NjYW5dID09PSBfd2luWysrbWF0Y2hdICYmXG4gICAgICAgICAgICAgc2NhbiA8IHN0cmVuZCk7XG5cbiAgICAvLyBBc3NlcnQoc2NhbiA8PSBzLT53aW5kb3crKHVuc2lnbmVkKShzLT53aW5kb3dfc2l6ZS0xKSwgXCJ3aWxkIHNjYW5cIik7XG5cbiAgICBsZW4gPSBNQVhfTUFUQ0ggLSAoc3RyZW5kIC0gc2Nhbik7XG4gICAgc2NhbiA9IHN0cmVuZCAtIE1BWF9NQVRDSDtcblxuICAgIGlmIChsZW4gPiBiZXN0X2xlbikge1xuICAgICAgcy5tYXRjaF9zdGFydCA9IGN1cl9tYXRjaDtcbiAgICAgIGJlc3RfbGVuID0gbGVuO1xuICAgICAgaWYgKGxlbiA+PSBuaWNlX21hdGNoKSB7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgc2Nhbl9lbmQxICA9IF93aW5bc2NhbiArIGJlc3RfbGVuIC0gMV07XG4gICAgICBzY2FuX2VuZCAgID0gX3dpbltzY2FuICsgYmVzdF9sZW5dO1xuICAgIH1cbiAgfSB3aGlsZSAoKGN1cl9tYXRjaCA9IHByZXZbY3VyX21hdGNoICYgd21hc2tdKSA+IGxpbWl0ICYmIC0tY2hhaW5fbGVuZ3RoICE9PSAwKTtcblxuICBpZiAoYmVzdF9sZW4gPD0gcy5sb29rYWhlYWQpIHtcbiAgICByZXR1cm4gYmVzdF9sZW47XG4gIH1cbiAgcmV0dXJuIHMubG9va2FoZWFkO1xufVxuXG5cbi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICogRmlsbCB0aGUgd2luZG93IHdoZW4gdGhlIGxvb2thaGVhZCBiZWNvbWVzIGluc3VmZmljaWVudC5cbiAqIFVwZGF0ZXMgc3Ryc3RhcnQgYW5kIGxvb2thaGVhZC5cbiAqXG4gKiBJTiBhc3NlcnRpb246IGxvb2thaGVhZCA8IE1JTl9MT09LQUhFQURcbiAqIE9VVCBhc3NlcnRpb25zOiBzdHJzdGFydCA8PSB3aW5kb3dfc2l6ZS1NSU5fTE9PS0FIRUFEXG4gKiAgICBBdCBsZWFzdCBvbmUgYnl0ZSBoYXMgYmVlbiByZWFkLCBvciBhdmFpbF9pbiA9PSAwOyByZWFkcyBhcmVcbiAqICAgIHBlcmZvcm1lZCBmb3IgYXQgbGVhc3QgdHdvIGJ5dGVzIChyZXF1aXJlZCBmb3IgdGhlIHppcCB0cmFuc2xhdGVfZW9sXG4gKiAgICBvcHRpb24gLS0gbm90IHN1cHBvcnRlZCBoZXJlKS5cbiAqL1xuZnVuY3Rpb24gZmlsbF93aW5kb3cocykge1xuICB2YXIgX3dfc2l6ZSA9IHMud19zaXplO1xuICB2YXIgcCwgbiwgbSwgbW9yZSwgc3RyO1xuXG4gIC8vQXNzZXJ0KHMtPmxvb2thaGVhZCA8IE1JTl9MT09LQUhFQUQsIFwiYWxyZWFkeSBlbm91Z2ggbG9va2FoZWFkXCIpO1xuXG4gIGRvIHtcbiAgICBtb3JlID0gcy53aW5kb3dfc2l6ZSAtIHMubG9va2FoZWFkIC0gcy5zdHJzdGFydDtcblxuICAgIC8vIEpTIGludHMgaGF2ZSAzMiBiaXQsIGJsb2NrIGJlbG93IG5vdCBuZWVkZWRcbiAgICAvKiBEZWFsIHdpdGggIUAjJCUgNjRLIGxpbWl0OiAqL1xuICAgIC8vaWYgKHNpemVvZihpbnQpIDw9IDIpIHtcbiAgICAvLyAgICBpZiAobW9yZSA9PSAwICYmIHMtPnN0cnN0YXJ0ID09IDAgJiYgcy0+bG9va2FoZWFkID09IDApIHtcbiAgICAvLyAgICAgICAgbW9yZSA9IHdzaXplO1xuICAgIC8vXG4gICAgLy8gIH0gZWxzZSBpZiAobW9yZSA9PSAodW5zaWduZWQpKC0xKSkge1xuICAgIC8vICAgICAgICAvKiBWZXJ5IHVubGlrZWx5LCBidXQgcG9zc2libGUgb24gMTYgYml0IG1hY2hpbmUgaWZcbiAgICAvLyAgICAgICAgICogc3Ryc3RhcnQgPT0gMCAmJiBsb29rYWhlYWQgPT0gMSAoaW5wdXQgZG9uZSBhIGJ5dGUgYXQgdGltZSlcbiAgICAvLyAgICAgICAgICovXG4gICAgLy8gICAgICAgIG1vcmUtLTtcbiAgICAvLyAgICB9XG4gICAgLy99XG5cblxuICAgIC8qIElmIHRoZSB3aW5kb3cgaXMgYWxtb3N0IGZ1bGwgYW5kIHRoZXJlIGlzIGluc3VmZmljaWVudCBsb29rYWhlYWQsXG4gICAgICogbW92ZSB0aGUgdXBwZXIgaGFsZiB0byB0aGUgbG93ZXIgb25lIHRvIG1ha2Ugcm9vbSBpbiB0aGUgdXBwZXIgaGFsZi5cbiAgICAgKi9cbiAgICBpZiAocy5zdHJzdGFydCA+PSBfd19zaXplICsgKF93X3NpemUgLSBNSU5fTE9PS0FIRUFEKSkge1xuXG4gICAgICB1dGlscy5hcnJheVNldChzLndpbmRvdywgcy53aW5kb3csIF93X3NpemUsIF93X3NpemUsIDApO1xuICAgICAgcy5tYXRjaF9zdGFydCAtPSBfd19zaXplO1xuICAgICAgcy5zdHJzdGFydCAtPSBfd19zaXplO1xuICAgICAgLyogd2Ugbm93IGhhdmUgc3Ryc3RhcnQgPj0gTUFYX0RJU1QgKi9cbiAgICAgIHMuYmxvY2tfc3RhcnQgLT0gX3dfc2l6ZTtcblxuICAgICAgLyogU2xpZGUgdGhlIGhhc2ggdGFibGUgKGNvdWxkIGJlIGF2b2lkZWQgd2l0aCAzMiBiaXQgdmFsdWVzXG4gICAgICAgYXQgdGhlIGV4cGVuc2Ugb2YgbWVtb3J5IHVzYWdlKS4gV2Ugc2xpZGUgZXZlbiB3aGVuIGxldmVsID09IDBcbiAgICAgICB0byBrZWVwIHRoZSBoYXNoIHRhYmxlIGNvbnNpc3RlbnQgaWYgd2Ugc3dpdGNoIGJhY2sgdG8gbGV2ZWwgPiAwXG4gICAgICAgbGF0ZXIuIChVc2luZyBsZXZlbCAwIHBlcm1hbmVudGx5IGlzIG5vdCBhbiBvcHRpbWFsIHVzYWdlIG9mXG4gICAgICAgemxpYiwgc28gd2UgZG9uJ3QgY2FyZSBhYm91dCB0aGlzIHBhdGhvbG9naWNhbCBjYXNlLilcbiAgICAgICAqL1xuXG4gICAgICBuID0gcy5oYXNoX3NpemU7XG4gICAgICBwID0gbjtcbiAgICAgIGRvIHtcbiAgICAgICAgbSA9IHMuaGVhZFstLXBdO1xuICAgICAgICBzLmhlYWRbcF0gPSAobSA+PSBfd19zaXplID8gbSAtIF93X3NpemUgOiAwKTtcbiAgICAgIH0gd2hpbGUgKC0tbik7XG5cbiAgICAgIG4gPSBfd19zaXplO1xuICAgICAgcCA9IG47XG4gICAgICBkbyB7XG4gICAgICAgIG0gPSBzLnByZXZbLS1wXTtcbiAgICAgICAgcy5wcmV2W3BdID0gKG0gPj0gX3dfc2l6ZSA/IG0gLSBfd19zaXplIDogMCk7XG4gICAgICAgIC8qIElmIG4gaXMgbm90IG9uIGFueSBoYXNoIGNoYWluLCBwcmV2W25dIGlzIGdhcmJhZ2UgYnV0XG4gICAgICAgICAqIGl0cyB2YWx1ZSB3aWxsIG5ldmVyIGJlIHVzZWQuXG4gICAgICAgICAqL1xuICAgICAgfSB3aGlsZSAoLS1uKTtcblxuICAgICAgbW9yZSArPSBfd19zaXplO1xuICAgIH1cbiAgICBpZiAocy5zdHJtLmF2YWlsX2luID09PSAwKSB7XG4gICAgICBicmVhaztcbiAgICB9XG5cbiAgICAvKiBJZiB0aGVyZSB3YXMgbm8gc2xpZGluZzpcbiAgICAgKiAgICBzdHJzdGFydCA8PSBXU0laRStNQVhfRElTVC0xICYmIGxvb2thaGVhZCA8PSBNSU5fTE9PS0FIRUFEIC0gMSAmJlxuICAgICAqICAgIG1vcmUgPT0gd2luZG93X3NpemUgLSBsb29rYWhlYWQgLSBzdHJzdGFydFxuICAgICAqID0+IG1vcmUgPj0gd2luZG93X3NpemUgLSAoTUlOX0xPT0tBSEVBRC0xICsgV1NJWkUgKyBNQVhfRElTVC0xKVxuICAgICAqID0+IG1vcmUgPj0gd2luZG93X3NpemUgLSAyKldTSVpFICsgMlxuICAgICAqIEluIHRoZSBCSUdfTUVNIG9yIE1NQVAgY2FzZSAobm90IHlldCBzdXBwb3J0ZWQpLFxuICAgICAqICAgd2luZG93X3NpemUgPT0gaW5wdXRfc2l6ZSArIE1JTl9MT09LQUhFQUQgICYmXG4gICAgICogICBzdHJzdGFydCArIHMtPmxvb2thaGVhZCA8PSBpbnB1dF9zaXplID0+IG1vcmUgPj0gTUlOX0xPT0tBSEVBRC5cbiAgICAgKiBPdGhlcndpc2UsIHdpbmRvd19zaXplID09IDIqV1NJWkUgc28gbW9yZSA+PSAyLlxuICAgICAqIElmIHRoZXJlIHdhcyBzbGlkaW5nLCBtb3JlID49IFdTSVpFLiBTbyBpbiBhbGwgY2FzZXMsIG1vcmUgPj0gMi5cbiAgICAgKi9cbiAgICAvL0Fzc2VydChtb3JlID49IDIsIFwibW9yZSA8IDJcIik7XG4gICAgbiA9IHJlYWRfYnVmKHMuc3RybSwgcy53aW5kb3csIHMuc3Ryc3RhcnQgKyBzLmxvb2thaGVhZCwgbW9yZSk7XG4gICAgcy5sb29rYWhlYWQgKz0gbjtcblxuICAgIC8qIEluaXRpYWxpemUgdGhlIGhhc2ggdmFsdWUgbm93IHRoYXQgd2UgaGF2ZSBzb21lIGlucHV0OiAqL1xuICAgIGlmIChzLmxvb2thaGVhZCArIHMuaW5zZXJ0ID49IE1JTl9NQVRDSCkge1xuICAgICAgc3RyID0gcy5zdHJzdGFydCAtIHMuaW5zZXJ0O1xuICAgICAgcy5pbnNfaCA9IHMud2luZG93W3N0cl07XG5cbiAgICAgIC8qIFVQREFURV9IQVNIKHMsIHMtPmluc19oLCBzLT53aW5kb3dbc3RyICsgMV0pOyAqL1xuICAgICAgcy5pbnNfaCA9ICgocy5pbnNfaCA8PCBzLmhhc2hfc2hpZnQpIF4gcy53aW5kb3dbc3RyICsgMV0pICYgcy5oYXNoX21hc2s7XG4vLyNpZiBNSU5fTUFUQ0ggIT0gM1xuLy8gICAgICAgIENhbGwgdXBkYXRlX2hhc2goKSBNSU5fTUFUQ0gtMyBtb3JlIHRpbWVzXG4vLyNlbmRpZlxuICAgICAgd2hpbGUgKHMuaW5zZXJ0KSB7XG4gICAgICAgIC8qIFVQREFURV9IQVNIKHMsIHMtPmluc19oLCBzLT53aW5kb3dbc3RyICsgTUlOX01BVENILTFdKTsgKi9cbiAgICAgICAgcy5pbnNfaCA9ICgocy5pbnNfaCA8PCBzLmhhc2hfc2hpZnQpIF4gcy53aW5kb3dbc3RyICsgTUlOX01BVENILTFdKSAmIHMuaGFzaF9tYXNrO1xuXG4gICAgICAgIHMucHJldltzdHIgJiBzLndfbWFza10gPSBzLmhlYWRbcy5pbnNfaF07XG4gICAgICAgIHMuaGVhZFtzLmluc19oXSA9IHN0cjtcbiAgICAgICAgc3RyKys7XG4gICAgICAgIHMuaW5zZXJ0LS07XG4gICAgICAgIGlmIChzLmxvb2thaGVhZCArIHMuaW5zZXJ0IDwgTUlOX01BVENIKSB7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgLyogSWYgdGhlIHdob2xlIGlucHV0IGhhcyBsZXNzIHRoYW4gTUlOX01BVENIIGJ5dGVzLCBpbnNfaCBpcyBnYXJiYWdlLFxuICAgICAqIGJ1dCB0aGlzIGlzIG5vdCBpbXBvcnRhbnQgc2luY2Ugb25seSBsaXRlcmFsIGJ5dGVzIHdpbGwgYmUgZW1pdHRlZC5cbiAgICAgKi9cblxuICB9IHdoaWxlIChzLmxvb2thaGVhZCA8IE1JTl9MT09LQUhFQUQgJiYgcy5zdHJtLmF2YWlsX2luICE9PSAwKTtcblxuICAvKiBJZiB0aGUgV0lOX0lOSVQgYnl0ZXMgYWZ0ZXIgdGhlIGVuZCBvZiB0aGUgY3VycmVudCBkYXRhIGhhdmUgbmV2ZXIgYmVlblxuICAgKiB3cml0dGVuLCB0aGVuIHplcm8gdGhvc2UgYnl0ZXMgaW4gb3JkZXIgdG8gYXZvaWQgbWVtb3J5IGNoZWNrIHJlcG9ydHMgb2ZcbiAgICogdGhlIHVzZSBvZiB1bmluaXRpYWxpemVkIChvciB1bmluaXRpYWxpc2VkIGFzIEp1bGlhbiB3cml0ZXMpIGJ5dGVzIGJ5XG4gICAqIHRoZSBsb25nZXN0IG1hdGNoIHJvdXRpbmVzLiAgVXBkYXRlIHRoZSBoaWdoIHdhdGVyIG1hcmsgZm9yIHRoZSBuZXh0XG4gICAqIHRpbWUgdGhyb3VnaCBoZXJlLiAgV0lOX0lOSVQgaXMgc2V0IHRvIE1BWF9NQVRDSCBzaW5jZSB0aGUgbG9uZ2VzdCBtYXRjaFxuICAgKiByb3V0aW5lcyBhbGxvdyBzY2FubmluZyB0byBzdHJzdGFydCArIE1BWF9NQVRDSCwgaWdub3JpbmcgbG9va2FoZWFkLlxuICAgKi9cbi8vICBpZiAocy5oaWdoX3dhdGVyIDwgcy53aW5kb3dfc2l6ZSkge1xuLy8gICAgdmFyIGN1cnIgPSBzLnN0cnN0YXJ0ICsgcy5sb29rYWhlYWQ7XG4vLyAgICB2YXIgaW5pdCA9IDA7XG4vL1xuLy8gICAgaWYgKHMuaGlnaF93YXRlciA8IGN1cnIpIHtcbi8vICAgICAgLyogUHJldmlvdXMgaGlnaCB3YXRlciBtYXJrIGJlbG93IGN1cnJlbnQgZGF0YSAtLSB6ZXJvIFdJTl9JTklUXG4vLyAgICAgICAqIGJ5dGVzIG9yIHVwIHRvIGVuZCBvZiB3aW5kb3csIHdoaWNoZXZlciBpcyBsZXNzLlxuLy8gICAgICAgKi9cbi8vICAgICAgaW5pdCA9IHMud2luZG93X3NpemUgLSBjdXJyO1xuLy8gICAgICBpZiAoaW5pdCA+IFdJTl9JTklUKVxuLy8gICAgICAgIGluaXQgPSBXSU5fSU5JVDtcbi8vICAgICAgem1lbXplcm8ocy0+d2luZG93ICsgY3VyciwgKHVuc2lnbmVkKWluaXQpO1xuLy8gICAgICBzLT5oaWdoX3dhdGVyID0gY3VyciArIGluaXQ7XG4vLyAgICB9XG4vLyAgICBlbHNlIGlmIChzLT5oaWdoX3dhdGVyIDwgKHVsZyljdXJyICsgV0lOX0lOSVQpIHtcbi8vICAgICAgLyogSGlnaCB3YXRlciBtYXJrIGF0IG9yIGFib3ZlIGN1cnJlbnQgZGF0YSwgYnV0IGJlbG93IGN1cnJlbnQgZGF0YVxuLy8gICAgICAgKiBwbHVzIFdJTl9JTklUIC0tIHplcm8gb3V0IHRvIGN1cnJlbnQgZGF0YSBwbHVzIFdJTl9JTklULCBvciB1cFxuLy8gICAgICAgKiB0byBlbmQgb2Ygd2luZG93LCB3aGljaGV2ZXIgaXMgbGVzcy5cbi8vICAgICAgICovXG4vLyAgICAgIGluaXQgPSAodWxnKWN1cnIgKyBXSU5fSU5JVCAtIHMtPmhpZ2hfd2F0ZXI7XG4vLyAgICAgIGlmIChpbml0ID4gcy0+d2luZG93X3NpemUgLSBzLT5oaWdoX3dhdGVyKVxuLy8gICAgICAgIGluaXQgPSBzLT53aW5kb3dfc2l6ZSAtIHMtPmhpZ2hfd2F0ZXI7XG4vLyAgICAgIHptZW16ZXJvKHMtPndpbmRvdyArIHMtPmhpZ2hfd2F0ZXIsICh1bnNpZ25lZClpbml0KTtcbi8vICAgICAgcy0+aGlnaF93YXRlciArPSBpbml0O1xuLy8gICAgfVxuLy8gIH1cbi8vXG4vLyAgQXNzZXJ0KCh1bGcpcy0+c3Ryc3RhcnQgPD0gcy0+d2luZG93X3NpemUgLSBNSU5fTE9PS0FIRUFELFxuLy8gICAgXCJub3QgZW5vdWdoIHJvb20gZm9yIHNlYXJjaFwiKTtcbn1cblxuLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKiBDb3B5IHdpdGhvdXQgY29tcHJlc3Npb24gYXMgbXVjaCBhcyBwb3NzaWJsZSBmcm9tIHRoZSBpbnB1dCBzdHJlYW0sIHJldHVyblxuICogdGhlIGN1cnJlbnQgYmxvY2sgc3RhdGUuXG4gKiBUaGlzIGZ1bmN0aW9uIGRvZXMgbm90IGluc2VydCBuZXcgc3RyaW5ncyBpbiB0aGUgZGljdGlvbmFyeSBzaW5jZVxuICogdW5jb21wcmVzc2libGUgZGF0YSBpcyBwcm9iYWJseSBub3QgdXNlZnVsLiBUaGlzIGZ1bmN0aW9uIGlzIHVzZWRcbiAqIG9ubHkgZm9yIHRoZSBsZXZlbD0wIGNvbXByZXNzaW9uIG9wdGlvbi5cbiAqIE5PVEU6IHRoaXMgZnVuY3Rpb24gc2hvdWxkIGJlIG9wdGltaXplZCB0byBhdm9pZCBleHRyYSBjb3B5aW5nIGZyb21cbiAqIHdpbmRvdyB0byBwZW5kaW5nX2J1Zi5cbiAqL1xuZnVuY3Rpb24gZGVmbGF0ZV9zdG9yZWQocywgZmx1c2gpIHtcbiAgLyogU3RvcmVkIGJsb2NrcyBhcmUgbGltaXRlZCB0byAweGZmZmYgYnl0ZXMsIHBlbmRpbmdfYnVmIGlzIGxpbWl0ZWRcbiAgICogdG8gcGVuZGluZ19idWZfc2l6ZSwgYW5kIGVhY2ggc3RvcmVkIGJsb2NrIGhhcyBhIDUgYnl0ZSBoZWFkZXI6XG4gICAqL1xuICB2YXIgbWF4X2Jsb2NrX3NpemUgPSAweGZmZmY7XG5cbiAgaWYgKG1heF9ibG9ja19zaXplID4gcy5wZW5kaW5nX2J1Zl9zaXplIC0gNSkge1xuICAgIG1heF9ibG9ja19zaXplID0gcy5wZW5kaW5nX2J1Zl9zaXplIC0gNTtcbiAgfVxuXG4gIC8qIENvcHkgYXMgbXVjaCBhcyBwb3NzaWJsZSBmcm9tIGlucHV0IHRvIG91dHB1dDogKi9cbiAgZm9yICg7Oykge1xuICAgIC8qIEZpbGwgdGhlIHdpbmRvdyBhcyBtdWNoIGFzIHBvc3NpYmxlOiAqL1xuICAgIGlmIChzLmxvb2thaGVhZCA8PSAxKSB7XG5cbiAgICAgIC8vQXNzZXJ0KHMtPnN0cnN0YXJ0IDwgcy0+d19zaXplK01BWF9ESVNUKHMpIHx8XG4gICAgICAvLyAgcy0+YmxvY2tfc3RhcnQgPj0gKGxvbmcpcy0+d19zaXplLCBcInNsaWRlIHRvbyBsYXRlXCIpO1xuLy8gICAgICBpZiAoIShzLnN0cnN0YXJ0IDwgcy53X3NpemUgKyAocy53X3NpemUgLSBNSU5fTE9PS0FIRUFEKSB8fFxuLy8gICAgICAgIHMuYmxvY2tfc3RhcnQgPj0gcy53X3NpemUpKSB7XG4vLyAgICAgICAgdGhyb3cgIG5ldyBFcnJvcihcInNsaWRlIHRvbyBsYXRlXCIpO1xuLy8gICAgICB9XG5cbiAgICAgIGZpbGxfd2luZG93KHMpO1xuICAgICAgaWYgKHMubG9va2FoZWFkID09PSAwICYmIGZsdXNoID09PSBaX05PX0ZMVVNIKSB7XG4gICAgICAgIHJldHVybiBCU19ORUVEX01PUkU7XG4gICAgICB9XG5cbiAgICAgIGlmIChzLmxvb2thaGVhZCA9PT0gMCkge1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIC8qIGZsdXNoIHRoZSBjdXJyZW50IGJsb2NrICovXG4gICAgfVxuICAgIC8vQXNzZXJ0KHMtPmJsb2NrX3N0YXJ0ID49IDBMLCBcImJsb2NrIGdvbmVcIik7XG4vLyAgICBpZiAocy5ibG9ja19zdGFydCA8IDApIHRocm93IG5ldyBFcnJvcihcImJsb2NrIGdvbmVcIik7XG5cbiAgICBzLnN0cnN0YXJ0ICs9IHMubG9va2FoZWFkO1xuICAgIHMubG9va2FoZWFkID0gMDtcblxuICAgIC8qIEVtaXQgYSBzdG9yZWQgYmxvY2sgaWYgcGVuZGluZ19idWYgd2lsbCBiZSBmdWxsOiAqL1xuICAgIHZhciBtYXhfc3RhcnQgPSBzLmJsb2NrX3N0YXJ0ICsgbWF4X2Jsb2NrX3NpemU7XG5cbiAgICBpZiAocy5zdHJzdGFydCA9PT0gMCB8fCBzLnN0cnN0YXJ0ID49IG1heF9zdGFydCkge1xuICAgICAgLyogc3Ryc3RhcnQgPT0gMCBpcyBwb3NzaWJsZSB3aGVuIHdyYXBhcm91bmQgb24gMTYtYml0IG1hY2hpbmUgKi9cbiAgICAgIHMubG9va2FoZWFkID0gcy5zdHJzdGFydCAtIG1heF9zdGFydDtcbiAgICAgIHMuc3Ryc3RhcnQgPSBtYXhfc3RhcnQ7XG4gICAgICAvKioqIEZMVVNIX0JMT0NLKHMsIDApOyAqKiovXG4gICAgICBmbHVzaF9ibG9ja19vbmx5KHMsIGZhbHNlKTtcbiAgICAgIGlmIChzLnN0cm0uYXZhaWxfb3V0ID09PSAwKSB7XG4gICAgICAgIHJldHVybiBCU19ORUVEX01PUkU7XG4gICAgICB9XG4gICAgICAvKioqL1xuXG5cbiAgICB9XG4gICAgLyogRmx1c2ggaWYgd2UgbWF5IGhhdmUgdG8gc2xpZGUsIG90aGVyd2lzZSBibG9ja19zdGFydCBtYXkgYmVjb21lXG4gICAgICogbmVnYXRpdmUgYW5kIHRoZSBkYXRhIHdpbGwgYmUgZ29uZTpcbiAgICAgKi9cbiAgICBpZiAocy5zdHJzdGFydCAtIHMuYmxvY2tfc3RhcnQgPj0gKHMud19zaXplIC0gTUlOX0xPT0tBSEVBRCkpIHtcbiAgICAgIC8qKiogRkxVU0hfQkxPQ0socywgMCk7ICoqKi9cbiAgICAgIGZsdXNoX2Jsb2NrX29ubHkocywgZmFsc2UpO1xuICAgICAgaWYgKHMuc3RybS5hdmFpbF9vdXQgPT09IDApIHtcbiAgICAgICAgcmV0dXJuIEJTX05FRURfTU9SRTtcbiAgICAgIH1cbiAgICAgIC8qKiovXG4gICAgfVxuICB9XG5cbiAgcy5pbnNlcnQgPSAwO1xuXG4gIGlmIChmbHVzaCA9PT0gWl9GSU5JU0gpIHtcbiAgICAvKioqIEZMVVNIX0JMT0NLKHMsIDEpOyAqKiovXG4gICAgZmx1c2hfYmxvY2tfb25seShzLCB0cnVlKTtcbiAgICBpZiAocy5zdHJtLmF2YWlsX291dCA9PT0gMCkge1xuICAgICAgcmV0dXJuIEJTX0ZJTklTSF9TVEFSVEVEO1xuICAgIH1cbiAgICAvKioqL1xuICAgIHJldHVybiBCU19GSU5JU0hfRE9ORTtcbiAgfVxuXG4gIGlmIChzLnN0cnN0YXJ0ID4gcy5ibG9ja19zdGFydCkge1xuICAgIC8qKiogRkxVU0hfQkxPQ0socywgMCk7ICoqKi9cbiAgICBmbHVzaF9ibG9ja19vbmx5KHMsIGZhbHNlKTtcbiAgICBpZiAocy5zdHJtLmF2YWlsX291dCA9PT0gMCkge1xuICAgICAgcmV0dXJuIEJTX05FRURfTU9SRTtcbiAgICB9XG4gICAgLyoqKi9cbiAgfVxuXG4gIHJldHVybiBCU19ORUVEX01PUkU7XG59XG5cbi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICogQ29tcHJlc3MgYXMgbXVjaCBhcyBwb3NzaWJsZSBmcm9tIHRoZSBpbnB1dCBzdHJlYW0sIHJldHVybiB0aGUgY3VycmVudFxuICogYmxvY2sgc3RhdGUuXG4gKiBUaGlzIGZ1bmN0aW9uIGRvZXMgbm90IHBlcmZvcm0gbGF6eSBldmFsdWF0aW9uIG9mIG1hdGNoZXMgYW5kIGluc2VydHNcbiAqIG5ldyBzdHJpbmdzIGluIHRoZSBkaWN0aW9uYXJ5IG9ubHkgZm9yIHVubWF0Y2hlZCBzdHJpbmdzIG9yIGZvciBzaG9ydFxuICogbWF0Y2hlcy4gSXQgaXMgdXNlZCBvbmx5IGZvciB0aGUgZmFzdCBjb21wcmVzc2lvbiBvcHRpb25zLlxuICovXG5mdW5jdGlvbiBkZWZsYXRlX2Zhc3QocywgZmx1c2gpIHtcbiAgdmFyIGhhc2hfaGVhZDsgICAgICAgIC8qIGhlYWQgb2YgdGhlIGhhc2ggY2hhaW4gKi9cbiAgdmFyIGJmbHVzaDsgICAgICAgICAgIC8qIHNldCBpZiBjdXJyZW50IGJsb2NrIG11c3QgYmUgZmx1c2hlZCAqL1xuXG4gIGZvciAoOzspIHtcbiAgICAvKiBNYWtlIHN1cmUgdGhhdCB3ZSBhbHdheXMgaGF2ZSBlbm91Z2ggbG9va2FoZWFkLCBleGNlcHRcbiAgICAgKiBhdCB0aGUgZW5kIG9mIHRoZSBpbnB1dCBmaWxlLiBXZSBuZWVkIE1BWF9NQVRDSCBieXRlc1xuICAgICAqIGZvciB0aGUgbmV4dCBtYXRjaCwgcGx1cyBNSU5fTUFUQ0ggYnl0ZXMgdG8gaW5zZXJ0IHRoZVxuICAgICAqIHN0cmluZyBmb2xsb3dpbmcgdGhlIG5leHQgbWF0Y2guXG4gICAgICovXG4gICAgaWYgKHMubG9va2FoZWFkIDwgTUlOX0xPT0tBSEVBRCkge1xuICAgICAgZmlsbF93aW5kb3cocyk7XG4gICAgICBpZiAocy5sb29rYWhlYWQgPCBNSU5fTE9PS0FIRUFEICYmIGZsdXNoID09PSBaX05PX0ZMVVNIKSB7XG4gICAgICAgIHJldHVybiBCU19ORUVEX01PUkU7XG4gICAgICB9XG4gICAgICBpZiAocy5sb29rYWhlYWQgPT09IDApIHtcbiAgICAgICAgYnJlYWs7IC8qIGZsdXNoIHRoZSBjdXJyZW50IGJsb2NrICovXG4gICAgICB9XG4gICAgfVxuXG4gICAgLyogSW5zZXJ0IHRoZSBzdHJpbmcgd2luZG93W3N0cnN0YXJ0IC4uIHN0cnN0YXJ0KzJdIGluIHRoZVxuICAgICAqIGRpY3Rpb25hcnksIGFuZCBzZXQgaGFzaF9oZWFkIHRvIHRoZSBoZWFkIG9mIHRoZSBoYXNoIGNoYWluOlxuICAgICAqL1xuICAgIGhhc2hfaGVhZCA9IDAvKk5JTCovO1xuICAgIGlmIChzLmxvb2thaGVhZCA+PSBNSU5fTUFUQ0gpIHtcbiAgICAgIC8qKiogSU5TRVJUX1NUUklORyhzLCBzLnN0cnN0YXJ0LCBoYXNoX2hlYWQpOyAqKiovXG4gICAgICBzLmluc19oID0gKChzLmluc19oIDw8IHMuaGFzaF9zaGlmdCkgXiBzLndpbmRvd1tzLnN0cnN0YXJ0ICsgTUlOX01BVENIIC0gMV0pICYgcy5oYXNoX21hc2s7XG4gICAgICBoYXNoX2hlYWQgPSBzLnByZXZbcy5zdHJzdGFydCAmIHMud19tYXNrXSA9IHMuaGVhZFtzLmluc19oXTtcbiAgICAgIHMuaGVhZFtzLmluc19oXSA9IHMuc3Ryc3RhcnQ7XG4gICAgICAvKioqL1xuICAgIH1cblxuICAgIC8qIEZpbmQgdGhlIGxvbmdlc3QgbWF0Y2gsIGRpc2NhcmRpbmcgdGhvc2UgPD0gcHJldl9sZW5ndGguXG4gICAgICogQXQgdGhpcyBwb2ludCB3ZSBoYXZlIGFsd2F5cyBtYXRjaF9sZW5ndGggPCBNSU5fTUFUQ0hcbiAgICAgKi9cbiAgICBpZiAoaGFzaF9oZWFkICE9PSAwLypOSUwqLyAmJiAoKHMuc3Ryc3RhcnQgLSBoYXNoX2hlYWQpIDw9IChzLndfc2l6ZSAtIE1JTl9MT09LQUhFQUQpKSkge1xuICAgICAgLyogVG8gc2ltcGxpZnkgdGhlIGNvZGUsIHdlIHByZXZlbnQgbWF0Y2hlcyB3aXRoIHRoZSBzdHJpbmdcbiAgICAgICAqIG9mIHdpbmRvdyBpbmRleCAwIChpbiBwYXJ0aWN1bGFyIHdlIGhhdmUgdG8gYXZvaWQgYSBtYXRjaFxuICAgICAgICogb2YgdGhlIHN0cmluZyB3aXRoIGl0c2VsZiBhdCB0aGUgc3RhcnQgb2YgdGhlIGlucHV0IGZpbGUpLlxuICAgICAgICovXG4gICAgICBzLm1hdGNoX2xlbmd0aCA9IGxvbmdlc3RfbWF0Y2gocywgaGFzaF9oZWFkKTtcbiAgICAgIC8qIGxvbmdlc3RfbWF0Y2goKSBzZXRzIG1hdGNoX3N0YXJ0ICovXG4gICAgfVxuICAgIGlmIChzLm1hdGNoX2xlbmd0aCA+PSBNSU5fTUFUQ0gpIHtcbiAgICAgIC8vIGNoZWNrX21hdGNoKHMsIHMuc3Ryc3RhcnQsIHMubWF0Y2hfc3RhcnQsIHMubWF0Y2hfbGVuZ3RoKTsgLy8gZm9yIGRlYnVnIG9ubHlcblxuICAgICAgLyoqKiBfdHJfdGFsbHlfZGlzdChzLCBzLnN0cnN0YXJ0IC0gcy5tYXRjaF9zdGFydCxcbiAgICAgICAgICAgICAgICAgICAgIHMubWF0Y2hfbGVuZ3RoIC0gTUlOX01BVENILCBiZmx1c2gpOyAqKiovXG4gICAgICBiZmx1c2ggPSB0cmVlcy5fdHJfdGFsbHkocywgcy5zdHJzdGFydCAtIHMubWF0Y2hfc3RhcnQsIHMubWF0Y2hfbGVuZ3RoIC0gTUlOX01BVENIKTtcblxuICAgICAgcy5sb29rYWhlYWQgLT0gcy5tYXRjaF9sZW5ndGg7XG5cbiAgICAgIC8qIEluc2VydCBuZXcgc3RyaW5ncyBpbiB0aGUgaGFzaCB0YWJsZSBvbmx5IGlmIHRoZSBtYXRjaCBsZW5ndGhcbiAgICAgICAqIGlzIG5vdCB0b28gbGFyZ2UuIFRoaXMgc2F2ZXMgdGltZSBidXQgZGVncmFkZXMgY29tcHJlc3Npb24uXG4gICAgICAgKi9cbiAgICAgIGlmIChzLm1hdGNoX2xlbmd0aCA8PSBzLm1heF9sYXp5X21hdGNoLyptYXhfaW5zZXJ0X2xlbmd0aCovICYmIHMubG9va2FoZWFkID49IE1JTl9NQVRDSCkge1xuICAgICAgICBzLm1hdGNoX2xlbmd0aC0tOyAvKiBzdHJpbmcgYXQgc3Ryc3RhcnQgYWxyZWFkeSBpbiB0YWJsZSAqL1xuICAgICAgICBkbyB7XG4gICAgICAgICAgcy5zdHJzdGFydCsrO1xuICAgICAgICAgIC8qKiogSU5TRVJUX1NUUklORyhzLCBzLnN0cnN0YXJ0LCBoYXNoX2hlYWQpOyAqKiovXG4gICAgICAgICAgcy5pbnNfaCA9ICgocy5pbnNfaCA8PCBzLmhhc2hfc2hpZnQpIF4gcy53aW5kb3dbcy5zdHJzdGFydCArIE1JTl9NQVRDSCAtIDFdKSAmIHMuaGFzaF9tYXNrO1xuICAgICAgICAgIGhhc2hfaGVhZCA9IHMucHJldltzLnN0cnN0YXJ0ICYgcy53X21hc2tdID0gcy5oZWFkW3MuaW5zX2hdO1xuICAgICAgICAgIHMuaGVhZFtzLmluc19oXSA9IHMuc3Ryc3RhcnQ7XG4gICAgICAgICAgLyoqKi9cbiAgICAgICAgICAvKiBzdHJzdGFydCBuZXZlciBleGNlZWRzIFdTSVpFLU1BWF9NQVRDSCwgc28gdGhlcmUgYXJlXG4gICAgICAgICAgICogYWx3YXlzIE1JTl9NQVRDSCBieXRlcyBhaGVhZC5cbiAgICAgICAgICAgKi9cbiAgICAgICAgfSB3aGlsZSAoLS1zLm1hdGNoX2xlbmd0aCAhPT0gMCk7XG4gICAgICAgIHMuc3Ryc3RhcnQrKztcbiAgICAgIH0gZWxzZVxuICAgICAge1xuICAgICAgICBzLnN0cnN0YXJ0ICs9IHMubWF0Y2hfbGVuZ3RoO1xuICAgICAgICBzLm1hdGNoX2xlbmd0aCA9IDA7XG4gICAgICAgIHMuaW5zX2ggPSBzLndpbmRvd1tzLnN0cnN0YXJ0XTtcbiAgICAgICAgLyogVVBEQVRFX0hBU0gocywgcy5pbnNfaCwgcy53aW5kb3dbcy5zdHJzdGFydCsxXSk7ICovXG4gICAgICAgIHMuaW5zX2ggPSAoKHMuaW5zX2ggPDwgcy5oYXNoX3NoaWZ0KSBeIHMud2luZG93W3Muc3Ryc3RhcnQgKyAxXSkgJiBzLmhhc2hfbWFzaztcblxuLy8jaWYgTUlOX01BVENIICE9IDNcbi8vICAgICAgICAgICAgICAgIENhbGwgVVBEQVRFX0hBU0goKSBNSU5fTUFUQ0gtMyBtb3JlIHRpbWVzXG4vLyNlbmRpZlxuICAgICAgICAvKiBJZiBsb29rYWhlYWQgPCBNSU5fTUFUQ0gsIGluc19oIGlzIGdhcmJhZ2UsIGJ1dCBpdCBkb2VzIG5vdFxuICAgICAgICAgKiBtYXR0ZXIgc2luY2UgaXQgd2lsbCBiZSByZWNvbXB1dGVkIGF0IG5leHQgZGVmbGF0ZSBjYWxsLlxuICAgICAgICAgKi9cbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgLyogTm8gbWF0Y2gsIG91dHB1dCBhIGxpdGVyYWwgYnl0ZSAqL1xuICAgICAgLy9UcmFjZXZ2KChzdGRlcnIsXCIlY1wiLCBzLndpbmRvd1tzLnN0cnN0YXJ0XSkpO1xuICAgICAgLyoqKiBfdHJfdGFsbHlfbGl0KHMsIHMud2luZG93W3Muc3Ryc3RhcnRdLCBiZmx1c2gpOyAqKiovXG4gICAgICBiZmx1c2ggPSB0cmVlcy5fdHJfdGFsbHkocywgMCwgcy53aW5kb3dbcy5zdHJzdGFydF0pO1xuXG4gICAgICBzLmxvb2thaGVhZC0tO1xuICAgICAgcy5zdHJzdGFydCsrO1xuICAgIH1cbiAgICBpZiAoYmZsdXNoKSB7XG4gICAgICAvKioqIEZMVVNIX0JMT0NLKHMsIDApOyAqKiovXG4gICAgICBmbHVzaF9ibG9ja19vbmx5KHMsIGZhbHNlKTtcbiAgICAgIGlmIChzLnN0cm0uYXZhaWxfb3V0ID09PSAwKSB7XG4gICAgICAgIHJldHVybiBCU19ORUVEX01PUkU7XG4gICAgICB9XG4gICAgICAvKioqL1xuICAgIH1cbiAgfVxuICBzLmluc2VydCA9ICgocy5zdHJzdGFydCA8IChNSU5fTUFUQ0gtMSkpID8gcy5zdHJzdGFydCA6IE1JTl9NQVRDSC0xKTtcbiAgaWYgKGZsdXNoID09PSBaX0ZJTklTSCkge1xuICAgIC8qKiogRkxVU0hfQkxPQ0socywgMSk7ICoqKi9cbiAgICBmbHVzaF9ibG9ja19vbmx5KHMsIHRydWUpO1xuICAgIGlmIChzLnN0cm0uYXZhaWxfb3V0ID09PSAwKSB7XG4gICAgICByZXR1cm4gQlNfRklOSVNIX1NUQVJURUQ7XG4gICAgfVxuICAgIC8qKiovXG4gICAgcmV0dXJuIEJTX0ZJTklTSF9ET05FO1xuICB9XG4gIGlmIChzLmxhc3RfbGl0KSB7XG4gICAgLyoqKiBGTFVTSF9CTE9DSyhzLCAwKTsgKioqL1xuICAgIGZsdXNoX2Jsb2NrX29ubHkocywgZmFsc2UpO1xuICAgIGlmIChzLnN0cm0uYXZhaWxfb3V0ID09PSAwKSB7XG4gICAgICByZXR1cm4gQlNfTkVFRF9NT1JFO1xuICAgIH1cbiAgICAvKioqL1xuICB9XG4gIHJldHVybiBCU19CTE9DS19ET05FO1xufVxuXG4vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqIFNhbWUgYXMgYWJvdmUsIGJ1dCBhY2hpZXZlcyBiZXR0ZXIgY29tcHJlc3Npb24uIFdlIHVzZSBhIGxhenlcbiAqIGV2YWx1YXRpb24gZm9yIG1hdGNoZXM6IGEgbWF0Y2ggaXMgZmluYWxseSBhZG9wdGVkIG9ubHkgaWYgdGhlcmUgaXNcbiAqIG5vIGJldHRlciBtYXRjaCBhdCB0aGUgbmV4dCB3aW5kb3cgcG9zaXRpb24uXG4gKi9cbmZ1bmN0aW9uIGRlZmxhdGVfc2xvdyhzLCBmbHVzaCkge1xuICB2YXIgaGFzaF9oZWFkOyAgICAgICAgICAvKiBoZWFkIG9mIGhhc2ggY2hhaW4gKi9cbiAgdmFyIGJmbHVzaDsgICAgICAgICAgICAgIC8qIHNldCBpZiBjdXJyZW50IGJsb2NrIG11c3QgYmUgZmx1c2hlZCAqL1xuXG4gIHZhciBtYXhfaW5zZXJ0O1xuXG4gIC8qIFByb2Nlc3MgdGhlIGlucHV0IGJsb2NrLiAqL1xuICBmb3IgKDs7KSB7XG4gICAgLyogTWFrZSBzdXJlIHRoYXQgd2UgYWx3YXlzIGhhdmUgZW5vdWdoIGxvb2thaGVhZCwgZXhjZXB0XG4gICAgICogYXQgdGhlIGVuZCBvZiB0aGUgaW5wdXQgZmlsZS4gV2UgbmVlZCBNQVhfTUFUQ0ggYnl0ZXNcbiAgICAgKiBmb3IgdGhlIG5leHQgbWF0Y2gsIHBsdXMgTUlOX01BVENIIGJ5dGVzIHRvIGluc2VydCB0aGVcbiAgICAgKiBzdHJpbmcgZm9sbG93aW5nIHRoZSBuZXh0IG1hdGNoLlxuICAgICAqL1xuICAgIGlmIChzLmxvb2thaGVhZCA8IE1JTl9MT09LQUhFQUQpIHtcbiAgICAgIGZpbGxfd2luZG93KHMpO1xuICAgICAgaWYgKHMubG9va2FoZWFkIDwgTUlOX0xPT0tBSEVBRCAmJiBmbHVzaCA9PT0gWl9OT19GTFVTSCkge1xuICAgICAgICByZXR1cm4gQlNfTkVFRF9NT1JFO1xuICAgICAgfVxuICAgICAgaWYgKHMubG9va2FoZWFkID09PSAwKSB7IGJyZWFrOyB9IC8qIGZsdXNoIHRoZSBjdXJyZW50IGJsb2NrICovXG4gICAgfVxuXG4gICAgLyogSW5zZXJ0IHRoZSBzdHJpbmcgd2luZG93W3N0cnN0YXJ0IC4uIHN0cnN0YXJ0KzJdIGluIHRoZVxuICAgICAqIGRpY3Rpb25hcnksIGFuZCBzZXQgaGFzaF9oZWFkIHRvIHRoZSBoZWFkIG9mIHRoZSBoYXNoIGNoYWluOlxuICAgICAqL1xuICAgIGhhc2hfaGVhZCA9IDAvKk5JTCovO1xuICAgIGlmIChzLmxvb2thaGVhZCA+PSBNSU5fTUFUQ0gpIHtcbiAgICAgIC8qKiogSU5TRVJUX1NUUklORyhzLCBzLnN0cnN0YXJ0LCBoYXNoX2hlYWQpOyAqKiovXG4gICAgICBzLmluc19oID0gKChzLmluc19oIDw8IHMuaGFzaF9zaGlmdCkgXiBzLndpbmRvd1tzLnN0cnN0YXJ0ICsgTUlOX01BVENIIC0gMV0pICYgcy5oYXNoX21hc2s7XG4gICAgICBoYXNoX2hlYWQgPSBzLnByZXZbcy5zdHJzdGFydCAmIHMud19tYXNrXSA9IHMuaGVhZFtzLmluc19oXTtcbiAgICAgIHMuaGVhZFtzLmluc19oXSA9IHMuc3Ryc3RhcnQ7XG4gICAgICAvKioqL1xuICAgIH1cblxuICAgIC8qIEZpbmQgdGhlIGxvbmdlc3QgbWF0Y2gsIGRpc2NhcmRpbmcgdGhvc2UgPD0gcHJldl9sZW5ndGguXG4gICAgICovXG4gICAgcy5wcmV2X2xlbmd0aCA9IHMubWF0Y2hfbGVuZ3RoO1xuICAgIHMucHJldl9tYXRjaCA9IHMubWF0Y2hfc3RhcnQ7XG4gICAgcy5tYXRjaF9sZW5ndGggPSBNSU5fTUFUQ0gtMTtcblxuICAgIGlmIChoYXNoX2hlYWQgIT09IDAvKk5JTCovICYmIHMucHJldl9sZW5ndGggPCBzLm1heF9sYXp5X21hdGNoICYmXG4gICAgICAgIHMuc3Ryc3RhcnQgLSBoYXNoX2hlYWQgPD0gKHMud19zaXplLU1JTl9MT09LQUhFQUQpLypNQVhfRElTVChzKSovKSB7XG4gICAgICAvKiBUbyBzaW1wbGlmeSB0aGUgY29kZSwgd2UgcHJldmVudCBtYXRjaGVzIHdpdGggdGhlIHN0cmluZ1xuICAgICAgICogb2Ygd2luZG93IGluZGV4IDAgKGluIHBhcnRpY3VsYXIgd2UgaGF2ZSB0byBhdm9pZCBhIG1hdGNoXG4gICAgICAgKiBvZiB0aGUgc3RyaW5nIHdpdGggaXRzZWxmIGF0IHRoZSBzdGFydCBvZiB0aGUgaW5wdXQgZmlsZSkuXG4gICAgICAgKi9cbiAgICAgIHMubWF0Y2hfbGVuZ3RoID0gbG9uZ2VzdF9tYXRjaChzLCBoYXNoX2hlYWQpO1xuICAgICAgLyogbG9uZ2VzdF9tYXRjaCgpIHNldHMgbWF0Y2hfc3RhcnQgKi9cblxuICAgICAgaWYgKHMubWF0Y2hfbGVuZ3RoIDw9IDUgJiZcbiAgICAgICAgIChzLnN0cmF0ZWd5ID09PSBaX0ZJTFRFUkVEIHx8IChzLm1hdGNoX2xlbmd0aCA9PT0gTUlOX01BVENIICYmIHMuc3Ryc3RhcnQgLSBzLm1hdGNoX3N0YXJ0ID4gNDA5Ni8qVE9PX0ZBUiovKSkpIHtcblxuICAgICAgICAvKiBJZiBwcmV2X21hdGNoIGlzIGFsc28gTUlOX01BVENILCBtYXRjaF9zdGFydCBpcyBnYXJiYWdlXG4gICAgICAgICAqIGJ1dCB3ZSB3aWxsIGlnbm9yZSB0aGUgY3VycmVudCBtYXRjaCBhbnl3YXkuXG4gICAgICAgICAqL1xuICAgICAgICBzLm1hdGNoX2xlbmd0aCA9IE1JTl9NQVRDSC0xO1xuICAgICAgfVxuICAgIH1cbiAgICAvKiBJZiB0aGVyZSB3YXMgYSBtYXRjaCBhdCB0aGUgcHJldmlvdXMgc3RlcCBhbmQgdGhlIGN1cnJlbnRcbiAgICAgKiBtYXRjaCBpcyBub3QgYmV0dGVyLCBvdXRwdXQgdGhlIHByZXZpb3VzIG1hdGNoOlxuICAgICAqL1xuICAgIGlmIChzLnByZXZfbGVuZ3RoID49IE1JTl9NQVRDSCAmJiBzLm1hdGNoX2xlbmd0aCA8PSBzLnByZXZfbGVuZ3RoKSB7XG4gICAgICBtYXhfaW5zZXJ0ID0gcy5zdHJzdGFydCArIHMubG9va2FoZWFkIC0gTUlOX01BVENIO1xuICAgICAgLyogRG8gbm90IGluc2VydCBzdHJpbmdzIGluIGhhc2ggdGFibGUgYmV5b25kIHRoaXMuICovXG5cbiAgICAgIC8vY2hlY2tfbWF0Y2gocywgcy5zdHJzdGFydC0xLCBzLnByZXZfbWF0Y2gsIHMucHJldl9sZW5ndGgpO1xuXG4gICAgICAvKioqX3RyX3RhbGx5X2Rpc3Qocywgcy5zdHJzdGFydCAtIDEgLSBzLnByZXZfbWF0Y2gsXG4gICAgICAgICAgICAgICAgICAgICBzLnByZXZfbGVuZ3RoIC0gTUlOX01BVENILCBiZmx1c2gpOyoqKi9cbiAgICAgIGJmbHVzaCA9IHRyZWVzLl90cl90YWxseShzLCBzLnN0cnN0YXJ0IC0gMS0gcy5wcmV2X21hdGNoLCBzLnByZXZfbGVuZ3RoIC0gTUlOX01BVENIKTtcbiAgICAgIC8qIEluc2VydCBpbiBoYXNoIHRhYmxlIGFsbCBzdHJpbmdzIHVwIHRvIHRoZSBlbmQgb2YgdGhlIG1hdGNoLlxuICAgICAgICogc3Ryc3RhcnQtMSBhbmQgc3Ryc3RhcnQgYXJlIGFscmVhZHkgaW5zZXJ0ZWQuIElmIHRoZXJlIGlzIG5vdFxuICAgICAgICogZW5vdWdoIGxvb2thaGVhZCwgdGhlIGxhc3QgdHdvIHN0cmluZ3MgYXJlIG5vdCBpbnNlcnRlZCBpblxuICAgICAgICogdGhlIGhhc2ggdGFibGUuXG4gICAgICAgKi9cbiAgICAgIHMubG9va2FoZWFkIC09IHMucHJldl9sZW5ndGgtMTtcbiAgICAgIHMucHJldl9sZW5ndGggLT0gMjtcbiAgICAgIGRvIHtcbiAgICAgICAgaWYgKCsrcy5zdHJzdGFydCA8PSBtYXhfaW5zZXJ0KSB7XG4gICAgICAgICAgLyoqKiBJTlNFUlRfU1RSSU5HKHMsIHMuc3Ryc3RhcnQsIGhhc2hfaGVhZCk7ICoqKi9cbiAgICAgICAgICBzLmluc19oID0gKChzLmluc19oIDw8IHMuaGFzaF9zaGlmdCkgXiBzLndpbmRvd1tzLnN0cnN0YXJ0ICsgTUlOX01BVENIIC0gMV0pICYgcy5oYXNoX21hc2s7XG4gICAgICAgICAgaGFzaF9oZWFkID0gcy5wcmV2W3Muc3Ryc3RhcnQgJiBzLndfbWFza10gPSBzLmhlYWRbcy5pbnNfaF07XG4gICAgICAgICAgcy5oZWFkW3MuaW5zX2hdID0gcy5zdHJzdGFydDtcbiAgICAgICAgICAvKioqL1xuICAgICAgICB9XG4gICAgICB9IHdoaWxlICgtLXMucHJldl9sZW5ndGggIT09IDApO1xuICAgICAgcy5tYXRjaF9hdmFpbGFibGUgPSAwO1xuICAgICAgcy5tYXRjaF9sZW5ndGggPSBNSU5fTUFUQ0gtMTtcbiAgICAgIHMuc3Ryc3RhcnQrKztcblxuICAgICAgaWYgKGJmbHVzaCkge1xuICAgICAgICAvKioqIEZMVVNIX0JMT0NLKHMsIDApOyAqKiovXG4gICAgICAgIGZsdXNoX2Jsb2NrX29ubHkocywgZmFsc2UpO1xuICAgICAgICBpZiAocy5zdHJtLmF2YWlsX291dCA9PT0gMCkge1xuICAgICAgICAgIHJldHVybiBCU19ORUVEX01PUkU7XG4gICAgICAgIH1cbiAgICAgICAgLyoqKi9cbiAgICAgIH1cblxuICAgIH0gZWxzZSBpZiAocy5tYXRjaF9hdmFpbGFibGUpIHtcbiAgICAgIC8qIElmIHRoZXJlIHdhcyBubyBtYXRjaCBhdCB0aGUgcHJldmlvdXMgcG9zaXRpb24sIG91dHB1dCBhXG4gICAgICAgKiBzaW5nbGUgbGl0ZXJhbC4gSWYgdGhlcmUgd2FzIGEgbWF0Y2ggYnV0IHRoZSBjdXJyZW50IG1hdGNoXG4gICAgICAgKiBpcyBsb25nZXIsIHRydW5jYXRlIHRoZSBwcmV2aW91cyBtYXRjaCB0byBhIHNpbmdsZSBsaXRlcmFsLlxuICAgICAgICovXG4gICAgICAvL1RyYWNldnYoKHN0ZGVycixcIiVjXCIsIHMtPndpbmRvd1tzLT5zdHJzdGFydC0xXSkpO1xuICAgICAgLyoqKiBfdHJfdGFsbHlfbGl0KHMsIHMud2luZG93W3Muc3Ryc3RhcnQtMV0sIGJmbHVzaCk7ICoqKi9cbiAgICAgIGJmbHVzaCA9IHRyZWVzLl90cl90YWxseShzLCAwLCBzLndpbmRvd1tzLnN0cnN0YXJ0LTFdKTtcblxuICAgICAgaWYgKGJmbHVzaCkge1xuICAgICAgICAvKioqIEZMVVNIX0JMT0NLX09OTFkocywgMCkgKioqL1xuICAgICAgICBmbHVzaF9ibG9ja19vbmx5KHMsIGZhbHNlKTtcbiAgICAgICAgLyoqKi9cbiAgICAgIH1cbiAgICAgIHMuc3Ryc3RhcnQrKztcbiAgICAgIHMubG9va2FoZWFkLS07XG4gICAgICBpZiAocy5zdHJtLmF2YWlsX291dCA9PT0gMCkge1xuICAgICAgICByZXR1cm4gQlNfTkVFRF9NT1JFO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICAvKiBUaGVyZSBpcyBubyBwcmV2aW91cyBtYXRjaCB0byBjb21wYXJlIHdpdGgsIHdhaXQgZm9yXG4gICAgICAgKiB0aGUgbmV4dCBzdGVwIHRvIGRlY2lkZS5cbiAgICAgICAqL1xuICAgICAgcy5tYXRjaF9hdmFpbGFibGUgPSAxO1xuICAgICAgcy5zdHJzdGFydCsrO1xuICAgICAgcy5sb29rYWhlYWQtLTtcbiAgICB9XG4gIH1cbiAgLy9Bc3NlcnQgKGZsdXNoICE9IFpfTk9fRkxVU0gsIFwibm8gZmx1c2g/XCIpO1xuICBpZiAocy5tYXRjaF9hdmFpbGFibGUpIHtcbiAgICAvL1RyYWNldnYoKHN0ZGVycixcIiVjXCIsIHMtPndpbmRvd1tzLT5zdHJzdGFydC0xXSkpO1xuICAgIC8qKiogX3RyX3RhbGx5X2xpdChzLCBzLndpbmRvd1tzLnN0cnN0YXJ0LTFdLCBiZmx1c2gpOyAqKiovXG4gICAgYmZsdXNoID0gdHJlZXMuX3RyX3RhbGx5KHMsIDAsIHMud2luZG93W3Muc3Ryc3RhcnQtMV0pO1xuXG4gICAgcy5tYXRjaF9hdmFpbGFibGUgPSAwO1xuICB9XG4gIHMuaW5zZXJ0ID0gcy5zdHJzdGFydCA8IE1JTl9NQVRDSC0xID8gcy5zdHJzdGFydCA6IE1JTl9NQVRDSC0xO1xuICBpZiAoZmx1c2ggPT09IFpfRklOSVNIKSB7XG4gICAgLyoqKiBGTFVTSF9CTE9DSyhzLCAxKTsgKioqL1xuICAgIGZsdXNoX2Jsb2NrX29ubHkocywgdHJ1ZSk7XG4gICAgaWYgKHMuc3RybS5hdmFpbF9vdXQgPT09IDApIHtcbiAgICAgIHJldHVybiBCU19GSU5JU0hfU1RBUlRFRDtcbiAgICB9XG4gICAgLyoqKi9cbiAgICByZXR1cm4gQlNfRklOSVNIX0RPTkU7XG4gIH1cbiAgaWYgKHMubGFzdF9saXQpIHtcbiAgICAvKioqIEZMVVNIX0JMT0NLKHMsIDApOyAqKiovXG4gICAgZmx1c2hfYmxvY2tfb25seShzLCBmYWxzZSk7XG4gICAgaWYgKHMuc3RybS5hdmFpbF9vdXQgPT09IDApIHtcbiAgICAgIHJldHVybiBCU19ORUVEX01PUkU7XG4gICAgfVxuICAgIC8qKiovXG4gIH1cblxuICByZXR1cm4gQlNfQkxPQ0tfRE9ORTtcbn1cblxuXG4vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqIEZvciBaX1JMRSwgc2ltcGx5IGxvb2sgZm9yIHJ1bnMgb2YgYnl0ZXMsIGdlbmVyYXRlIG1hdGNoZXMgb25seSBvZiBkaXN0YW5jZVxuICogb25lLiAgRG8gbm90IG1haW50YWluIGEgaGFzaCB0YWJsZS4gIChJdCB3aWxsIGJlIHJlZ2VuZXJhdGVkIGlmIHRoaXMgcnVuIG9mXG4gKiBkZWZsYXRlIHN3aXRjaGVzIGF3YXkgZnJvbSBaX1JMRS4pXG4gKi9cbmZ1bmN0aW9uIGRlZmxhdGVfcmxlKHMsIGZsdXNoKSB7XG4gIHZhciBiZmx1c2g7ICAgICAgICAgICAgLyogc2V0IGlmIGN1cnJlbnQgYmxvY2sgbXVzdCBiZSBmbHVzaGVkICovXG4gIHZhciBwcmV2OyAgICAgICAgICAgICAgLyogYnl0ZSBhdCBkaXN0YW5jZSBvbmUgdG8gbWF0Y2ggKi9cbiAgdmFyIHNjYW4sIHN0cmVuZDsgICAgICAvKiBzY2FuIGdvZXMgdXAgdG8gc3RyZW5kIGZvciBsZW5ndGggb2YgcnVuICovXG5cbiAgdmFyIF93aW4gPSBzLndpbmRvdztcblxuICBmb3IgKDs7KSB7XG4gICAgLyogTWFrZSBzdXJlIHRoYXQgd2UgYWx3YXlzIGhhdmUgZW5vdWdoIGxvb2thaGVhZCwgZXhjZXB0XG4gICAgICogYXQgdGhlIGVuZCBvZiB0aGUgaW5wdXQgZmlsZS4gV2UgbmVlZCBNQVhfTUFUQ0ggYnl0ZXNcbiAgICAgKiBmb3IgdGhlIGxvbmdlc3QgcnVuLCBwbHVzIG9uZSBmb3IgdGhlIHVucm9sbGVkIGxvb3AuXG4gICAgICovXG4gICAgaWYgKHMubG9va2FoZWFkIDw9IE1BWF9NQVRDSCkge1xuICAgICAgZmlsbF93aW5kb3cocyk7XG4gICAgICBpZiAocy5sb29rYWhlYWQgPD0gTUFYX01BVENIICYmIGZsdXNoID09PSBaX05PX0ZMVVNIKSB7XG4gICAgICAgIHJldHVybiBCU19ORUVEX01PUkU7XG4gICAgICB9XG4gICAgICBpZiAocy5sb29rYWhlYWQgPT09IDApIHsgYnJlYWs7IH0gLyogZmx1c2ggdGhlIGN1cnJlbnQgYmxvY2sgKi9cbiAgICB9XG5cbiAgICAvKiBTZWUgaG93IG1hbnkgdGltZXMgdGhlIHByZXZpb3VzIGJ5dGUgcmVwZWF0cyAqL1xuICAgIHMubWF0Y2hfbGVuZ3RoID0gMDtcbiAgICBpZiAocy5sb29rYWhlYWQgPj0gTUlOX01BVENIICYmIHMuc3Ryc3RhcnQgPiAwKSB7XG4gICAgICBzY2FuID0gcy5zdHJzdGFydCAtIDE7XG4gICAgICBwcmV2ID0gX3dpbltzY2FuXTtcbiAgICAgIGlmIChwcmV2ID09PSBfd2luWysrc2Nhbl0gJiYgcHJldiA9PT0gX3dpblsrK3NjYW5dICYmIHByZXYgPT09IF93aW5bKytzY2FuXSkge1xuICAgICAgICBzdHJlbmQgPSBzLnN0cnN0YXJ0ICsgTUFYX01BVENIO1xuICAgICAgICBkbyB7XG4gICAgICAgICAgLypqc2hpbnQgbm9lbXB0eTpmYWxzZSovXG4gICAgICAgIH0gd2hpbGUgKHByZXYgPT09IF93aW5bKytzY2FuXSAmJiBwcmV2ID09PSBfd2luWysrc2Nhbl0gJiZcbiAgICAgICAgICAgICAgICAgcHJldiA9PT0gX3dpblsrK3NjYW5dICYmIHByZXYgPT09IF93aW5bKytzY2FuXSAmJlxuICAgICAgICAgICAgICAgICBwcmV2ID09PSBfd2luWysrc2Nhbl0gJiYgcHJldiA9PT0gX3dpblsrK3NjYW5dICYmXG4gICAgICAgICAgICAgICAgIHByZXYgPT09IF93aW5bKytzY2FuXSAmJiBwcmV2ID09PSBfd2luWysrc2Nhbl0gJiZcbiAgICAgICAgICAgICAgICAgc2NhbiA8IHN0cmVuZCk7XG4gICAgICAgIHMubWF0Y2hfbGVuZ3RoID0gTUFYX01BVENIIC0gKHN0cmVuZCAtIHNjYW4pO1xuICAgICAgICBpZiAocy5tYXRjaF9sZW5ndGggPiBzLmxvb2thaGVhZCkge1xuICAgICAgICAgIHMubWF0Y2hfbGVuZ3RoID0gcy5sb29rYWhlYWQ7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIC8vQXNzZXJ0KHNjYW4gPD0gcy0+d2luZG93Kyh1SW50KShzLT53aW5kb3dfc2l6ZS0xKSwgXCJ3aWxkIHNjYW5cIik7XG4gICAgfVxuXG4gICAgLyogRW1pdCBtYXRjaCBpZiBoYXZlIHJ1biBvZiBNSU5fTUFUQ0ggb3IgbG9uZ2VyLCBlbHNlIGVtaXQgbGl0ZXJhbCAqL1xuICAgIGlmIChzLm1hdGNoX2xlbmd0aCA+PSBNSU5fTUFUQ0gpIHtcbiAgICAgIC8vY2hlY2tfbWF0Y2gocywgcy5zdHJzdGFydCwgcy5zdHJzdGFydCAtIDEsIHMubWF0Y2hfbGVuZ3RoKTtcblxuICAgICAgLyoqKiBfdHJfdGFsbHlfZGlzdChzLCAxLCBzLm1hdGNoX2xlbmd0aCAtIE1JTl9NQVRDSCwgYmZsdXNoKTsgKioqL1xuICAgICAgYmZsdXNoID0gdHJlZXMuX3RyX3RhbGx5KHMsIDEsIHMubWF0Y2hfbGVuZ3RoIC0gTUlOX01BVENIKTtcblxuICAgICAgcy5sb29rYWhlYWQgLT0gcy5tYXRjaF9sZW5ndGg7XG4gICAgICBzLnN0cnN0YXJ0ICs9IHMubWF0Y2hfbGVuZ3RoO1xuICAgICAgcy5tYXRjaF9sZW5ndGggPSAwO1xuICAgIH0gZWxzZSB7XG4gICAgICAvKiBObyBtYXRjaCwgb3V0cHV0IGEgbGl0ZXJhbCBieXRlICovXG4gICAgICAvL1RyYWNldnYoKHN0ZGVycixcIiVjXCIsIHMtPndpbmRvd1tzLT5zdHJzdGFydF0pKTtcbiAgICAgIC8qKiogX3RyX3RhbGx5X2xpdChzLCBzLndpbmRvd1tzLnN0cnN0YXJ0XSwgYmZsdXNoKTsgKioqL1xuICAgICAgYmZsdXNoID0gdHJlZXMuX3RyX3RhbGx5KHMsIDAsIHMud2luZG93W3Muc3Ryc3RhcnRdKTtcblxuICAgICAgcy5sb29rYWhlYWQtLTtcbiAgICAgIHMuc3Ryc3RhcnQrKztcbiAgICB9XG4gICAgaWYgKGJmbHVzaCkge1xuICAgICAgLyoqKiBGTFVTSF9CTE9DSyhzLCAwKTsgKioqL1xuICAgICAgZmx1c2hfYmxvY2tfb25seShzLCBmYWxzZSk7XG4gICAgICBpZiAocy5zdHJtLmF2YWlsX291dCA9PT0gMCkge1xuICAgICAgICByZXR1cm4gQlNfTkVFRF9NT1JFO1xuICAgICAgfVxuICAgICAgLyoqKi9cbiAgICB9XG4gIH1cbiAgcy5pbnNlcnQgPSAwO1xuICBpZiAoZmx1c2ggPT09IFpfRklOSVNIKSB7XG4gICAgLyoqKiBGTFVTSF9CTE9DSyhzLCAxKTsgKioqL1xuICAgIGZsdXNoX2Jsb2NrX29ubHkocywgdHJ1ZSk7XG4gICAgaWYgKHMuc3RybS5hdmFpbF9vdXQgPT09IDApIHtcbiAgICAgIHJldHVybiBCU19GSU5JU0hfU1RBUlRFRDtcbiAgICB9XG4gICAgLyoqKi9cbiAgICByZXR1cm4gQlNfRklOSVNIX0RPTkU7XG4gIH1cbiAgaWYgKHMubGFzdF9saXQpIHtcbiAgICAvKioqIEZMVVNIX0JMT0NLKHMsIDApOyAqKiovXG4gICAgZmx1c2hfYmxvY2tfb25seShzLCBmYWxzZSk7XG4gICAgaWYgKHMuc3RybS5hdmFpbF9vdXQgPT09IDApIHtcbiAgICAgIHJldHVybiBCU19ORUVEX01PUkU7XG4gICAgfVxuICAgIC8qKiovXG4gIH1cbiAgcmV0dXJuIEJTX0JMT0NLX0RPTkU7XG59XG5cbi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICogRm9yIFpfSFVGRk1BTl9PTkxZLCBkbyBub3QgbG9vayBmb3IgbWF0Y2hlcy4gIERvIG5vdCBtYWludGFpbiBhIGhhc2ggdGFibGUuXG4gKiAoSXQgd2lsbCBiZSByZWdlbmVyYXRlZCBpZiB0aGlzIHJ1biBvZiBkZWZsYXRlIHN3aXRjaGVzIGF3YXkgZnJvbSBIdWZmbWFuLilcbiAqL1xuZnVuY3Rpb24gZGVmbGF0ZV9odWZmKHMsIGZsdXNoKSB7XG4gIHZhciBiZmx1c2g7ICAgICAgICAgICAgIC8qIHNldCBpZiBjdXJyZW50IGJsb2NrIG11c3QgYmUgZmx1c2hlZCAqL1xuXG4gIGZvciAoOzspIHtcbiAgICAvKiBNYWtlIHN1cmUgdGhhdCB3ZSBoYXZlIGEgbGl0ZXJhbCB0byB3cml0ZS4gKi9cbiAgICBpZiAocy5sb29rYWhlYWQgPT09IDApIHtcbiAgICAgIGZpbGxfd2luZG93KHMpO1xuICAgICAgaWYgKHMubG9va2FoZWFkID09PSAwKSB7XG4gICAgICAgIGlmIChmbHVzaCA9PT0gWl9OT19GTFVTSCkge1xuICAgICAgICAgIHJldHVybiBCU19ORUVEX01PUkU7XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7ICAgICAgLyogZmx1c2ggdGhlIGN1cnJlbnQgYmxvY2sgKi9cbiAgICAgIH1cbiAgICB9XG5cbiAgICAvKiBPdXRwdXQgYSBsaXRlcmFsIGJ5dGUgKi9cbiAgICBzLm1hdGNoX2xlbmd0aCA9IDA7XG4gICAgLy9UcmFjZXZ2KChzdGRlcnIsXCIlY1wiLCBzLT53aW5kb3dbcy0+c3Ryc3RhcnRdKSk7XG4gICAgLyoqKiBfdHJfdGFsbHlfbGl0KHMsIHMud2luZG93W3Muc3Ryc3RhcnRdLCBiZmx1c2gpOyAqKiovXG4gICAgYmZsdXNoID0gdHJlZXMuX3RyX3RhbGx5KHMsIDAsIHMud2luZG93W3Muc3Ryc3RhcnRdKTtcbiAgICBzLmxvb2thaGVhZC0tO1xuICAgIHMuc3Ryc3RhcnQrKztcbiAgICBpZiAoYmZsdXNoKSB7XG4gICAgICAvKioqIEZMVVNIX0JMT0NLKHMsIDApOyAqKiovXG4gICAgICBmbHVzaF9ibG9ja19vbmx5KHMsIGZhbHNlKTtcbiAgICAgIGlmIChzLnN0cm0uYXZhaWxfb3V0ID09PSAwKSB7XG4gICAgICAgIHJldHVybiBCU19ORUVEX01PUkU7XG4gICAgICB9XG4gICAgICAvKioqL1xuICAgIH1cbiAgfVxuICBzLmluc2VydCA9IDA7XG4gIGlmIChmbHVzaCA9PT0gWl9GSU5JU0gpIHtcbiAgICAvKioqIEZMVVNIX0JMT0NLKHMsIDEpOyAqKiovXG4gICAgZmx1c2hfYmxvY2tfb25seShzLCB0cnVlKTtcbiAgICBpZiAocy5zdHJtLmF2YWlsX291dCA9PT0gMCkge1xuICAgICAgcmV0dXJuIEJTX0ZJTklTSF9TVEFSVEVEO1xuICAgIH1cbiAgICAvKioqL1xuICAgIHJldHVybiBCU19GSU5JU0hfRE9ORTtcbiAgfVxuICBpZiAocy5sYXN0X2xpdCkge1xuICAgIC8qKiogRkxVU0hfQkxPQ0socywgMCk7ICoqKi9cbiAgICBmbHVzaF9ibG9ja19vbmx5KHMsIGZhbHNlKTtcbiAgICBpZiAocy5zdHJtLmF2YWlsX291dCA9PT0gMCkge1xuICAgICAgcmV0dXJuIEJTX05FRURfTU9SRTtcbiAgICB9XG4gICAgLyoqKi9cbiAgfVxuICByZXR1cm4gQlNfQkxPQ0tfRE9ORTtcbn1cblxuLyogVmFsdWVzIGZvciBtYXhfbGF6eV9tYXRjaCwgZ29vZF9tYXRjaCBhbmQgbWF4X2NoYWluX2xlbmd0aCwgZGVwZW5kaW5nIG9uXG4gKiB0aGUgZGVzaXJlZCBwYWNrIGxldmVsICgwLi45KS4gVGhlIHZhbHVlcyBnaXZlbiBiZWxvdyBoYXZlIGJlZW4gdHVuZWQgdG9cbiAqIGV4Y2x1ZGUgd29yc3QgY2FzZSBwZXJmb3JtYW5jZSBmb3IgcGF0aG9sb2dpY2FsIGZpbGVzLiBCZXR0ZXIgdmFsdWVzIG1heSBiZVxuICogZm91bmQgZm9yIHNwZWNpZmljIGZpbGVzLlxuICovXG52YXIgQ29uZmlnID0gZnVuY3Rpb24gKGdvb2RfbGVuZ3RoLCBtYXhfbGF6eSwgbmljZV9sZW5ndGgsIG1heF9jaGFpbiwgZnVuYykge1xuICB0aGlzLmdvb2RfbGVuZ3RoID0gZ29vZF9sZW5ndGg7XG4gIHRoaXMubWF4X2xhenkgPSBtYXhfbGF6eTtcbiAgdGhpcy5uaWNlX2xlbmd0aCA9IG5pY2VfbGVuZ3RoO1xuICB0aGlzLm1heF9jaGFpbiA9IG1heF9jaGFpbjtcbiAgdGhpcy5mdW5jID0gZnVuYztcbn07XG5cbnZhciBjb25maWd1cmF0aW9uX3RhYmxlO1xuXG5jb25maWd1cmF0aW9uX3RhYmxlID0gW1xuICAvKiAgICAgIGdvb2QgbGF6eSBuaWNlIGNoYWluICovXG4gIG5ldyBDb25maWcoMCwgMCwgMCwgMCwgZGVmbGF0ZV9zdG9yZWQpLCAgICAgICAgICAvKiAwIHN0b3JlIG9ubHkgKi9cbiAgbmV3IENvbmZpZyg0LCA0LCA4LCA0LCBkZWZsYXRlX2Zhc3QpLCAgICAgICAgICAgIC8qIDEgbWF4IHNwZWVkLCBubyBsYXp5IG1hdGNoZXMgKi9cbiAgbmV3IENvbmZpZyg0LCA1LCAxNiwgOCwgZGVmbGF0ZV9mYXN0KSwgICAgICAgICAgIC8qIDIgKi9cbiAgbmV3IENvbmZpZyg0LCA2LCAzMiwgMzIsIGRlZmxhdGVfZmFzdCksICAgICAgICAgIC8qIDMgKi9cblxuICBuZXcgQ29uZmlnKDQsIDQsIDE2LCAxNiwgZGVmbGF0ZV9zbG93KSwgICAgICAgICAgLyogNCBsYXp5IG1hdGNoZXMgKi9cbiAgbmV3IENvbmZpZyg4LCAxNiwgMzIsIDMyLCBkZWZsYXRlX3Nsb3cpLCAgICAgICAgIC8qIDUgKi9cbiAgbmV3IENvbmZpZyg4LCAxNiwgMTI4LCAxMjgsIGRlZmxhdGVfc2xvdyksICAgICAgIC8qIDYgKi9cbiAgbmV3IENvbmZpZyg4LCAzMiwgMTI4LCAyNTYsIGRlZmxhdGVfc2xvdyksICAgICAgIC8qIDcgKi9cbiAgbmV3IENvbmZpZygzMiwgMTI4LCAyNTgsIDEwMjQsIGRlZmxhdGVfc2xvdyksICAgIC8qIDggKi9cbiAgbmV3IENvbmZpZygzMiwgMjU4LCAyNTgsIDQwOTYsIGRlZmxhdGVfc2xvdykgICAgIC8qIDkgbWF4IGNvbXByZXNzaW9uICovXG5dO1xuXG5cbi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICogSW5pdGlhbGl6ZSB0aGUgXCJsb25nZXN0IG1hdGNoXCIgcm91dGluZXMgZm9yIGEgbmV3IHpsaWIgc3RyZWFtXG4gKi9cbmZ1bmN0aW9uIGxtX2luaXQocykge1xuICBzLndpbmRvd19zaXplID0gMiAqIHMud19zaXplO1xuXG4gIC8qKiogQ0xFQVJfSEFTSChzKTsgKioqL1xuICB6ZXJvKHMuaGVhZCk7IC8vIEZpbGwgd2l0aCBOSUwgKD0gMCk7XG5cbiAgLyogU2V0IHRoZSBkZWZhdWx0IGNvbmZpZ3VyYXRpb24gcGFyYW1ldGVyczpcbiAgICovXG4gIHMubWF4X2xhenlfbWF0Y2ggPSBjb25maWd1cmF0aW9uX3RhYmxlW3MubGV2ZWxdLm1heF9sYXp5O1xuICBzLmdvb2RfbWF0Y2ggPSBjb25maWd1cmF0aW9uX3RhYmxlW3MubGV2ZWxdLmdvb2RfbGVuZ3RoO1xuICBzLm5pY2VfbWF0Y2ggPSBjb25maWd1cmF0aW9uX3RhYmxlW3MubGV2ZWxdLm5pY2VfbGVuZ3RoO1xuICBzLm1heF9jaGFpbl9sZW5ndGggPSBjb25maWd1cmF0aW9uX3RhYmxlW3MubGV2ZWxdLm1heF9jaGFpbjtcblxuICBzLnN0cnN0YXJ0ID0gMDtcbiAgcy5ibG9ja19zdGFydCA9IDA7XG4gIHMubG9va2FoZWFkID0gMDtcbiAgcy5pbnNlcnQgPSAwO1xuICBzLm1hdGNoX2xlbmd0aCA9IHMucHJldl9sZW5ndGggPSBNSU5fTUFUQ0ggLSAxO1xuICBzLm1hdGNoX2F2YWlsYWJsZSA9IDA7XG4gIHMuaW5zX2ggPSAwO1xufVxuXG5cbmZ1bmN0aW9uIERlZmxhdGVTdGF0ZSgpIHtcbiAgdGhpcy5zdHJtID0gbnVsbDsgICAgICAgICAgICAvKiBwb2ludGVyIGJhY2sgdG8gdGhpcyB6bGliIHN0cmVhbSAqL1xuICB0aGlzLnN0YXR1cyA9IDA7ICAgICAgICAgICAgLyogYXMgdGhlIG5hbWUgaW1wbGllcyAqL1xuICB0aGlzLnBlbmRpbmdfYnVmID0gbnVsbDsgICAgICAvKiBvdXRwdXQgc3RpbGwgcGVuZGluZyAqL1xuICB0aGlzLnBlbmRpbmdfYnVmX3NpemUgPSAwOyAgLyogc2l6ZSBvZiBwZW5kaW5nX2J1ZiAqL1xuICB0aGlzLnBlbmRpbmdfb3V0ID0gMDsgICAgICAgLyogbmV4dCBwZW5kaW5nIGJ5dGUgdG8gb3V0cHV0IHRvIHRoZSBzdHJlYW0gKi9cbiAgdGhpcy5wZW5kaW5nID0gMDsgICAgICAgICAgIC8qIG5iIG9mIGJ5dGVzIGluIHRoZSBwZW5kaW5nIGJ1ZmZlciAqL1xuICB0aGlzLndyYXAgPSAwOyAgICAgICAgICAgICAgLyogYml0IDAgdHJ1ZSBmb3IgemxpYiwgYml0IDEgdHJ1ZSBmb3IgZ3ppcCAqL1xuICB0aGlzLmd6aGVhZCA9IG51bGw7ICAgICAgICAgLyogZ3ppcCBoZWFkZXIgaW5mb3JtYXRpb24gdG8gd3JpdGUgKi9cbiAgdGhpcy5nemluZGV4ID0gMDsgICAgICAgICAgIC8qIHdoZXJlIGluIGV4dHJhLCBuYW1lLCBvciBjb21tZW50ICovXG4gIHRoaXMubWV0aG9kID0gWl9ERUZMQVRFRDsgLyogY2FuIG9ubHkgYmUgREVGTEFURUQgKi9cbiAgdGhpcy5sYXN0X2ZsdXNoID0gLTE7ICAgLyogdmFsdWUgb2YgZmx1c2ggcGFyYW0gZm9yIHByZXZpb3VzIGRlZmxhdGUgY2FsbCAqL1xuXG4gIHRoaXMud19zaXplID0gMDsgIC8qIExaNzcgd2luZG93IHNpemUgKDMySyBieSBkZWZhdWx0KSAqL1xuICB0aGlzLndfYml0cyA9IDA7ICAvKiBsb2cyKHdfc2l6ZSkgICg4Li4xNikgKi9cbiAgdGhpcy53X21hc2sgPSAwOyAgLyogd19zaXplIC0gMSAqL1xuXG4gIHRoaXMud2luZG93ID0gbnVsbDtcbiAgLyogU2xpZGluZyB3aW5kb3cuIElucHV0IGJ5dGVzIGFyZSByZWFkIGludG8gdGhlIHNlY29uZCBoYWxmIG9mIHRoZSB3aW5kb3csXG4gICAqIGFuZCBtb3ZlIHRvIHRoZSBmaXJzdCBoYWxmIGxhdGVyIHRvIGtlZXAgYSBkaWN0aW9uYXJ5IG9mIGF0IGxlYXN0IHdTaXplXG4gICAqIGJ5dGVzLiBXaXRoIHRoaXMgb3JnYW5pemF0aW9uLCBtYXRjaGVzIGFyZSBsaW1pdGVkIHRvIGEgZGlzdGFuY2Ugb2ZcbiAgICogd1NpemUtTUFYX01BVENIIGJ5dGVzLCBidXQgdGhpcyBlbnN1cmVzIHRoYXQgSU8gaXMgYWx3YXlzXG4gICAqIHBlcmZvcm1lZCB3aXRoIGEgbGVuZ3RoIG11bHRpcGxlIG9mIHRoZSBibG9jayBzaXplLlxuICAgKi9cblxuICB0aGlzLndpbmRvd19zaXplID0gMDtcbiAgLyogQWN0dWFsIHNpemUgb2Ygd2luZG93OiAyKndTaXplLCBleGNlcHQgd2hlbiB0aGUgdXNlciBpbnB1dCBidWZmZXJcbiAgICogaXMgZGlyZWN0bHkgdXNlZCBhcyBzbGlkaW5nIHdpbmRvdy5cbiAgICovXG5cbiAgdGhpcy5wcmV2ID0gbnVsbDtcbiAgLyogTGluayB0byBvbGRlciBzdHJpbmcgd2l0aCBzYW1lIGhhc2ggaW5kZXguIFRvIGxpbWl0IHRoZSBzaXplIG9mIHRoaXNcbiAgICogYXJyYXkgdG8gNjRLLCB0aGlzIGxpbmsgaXMgbWFpbnRhaW5lZCBvbmx5IGZvciB0aGUgbGFzdCAzMksgc3RyaW5ncy5cbiAgICogQW4gaW5kZXggaW4gdGhpcyBhcnJheSBpcyB0aHVzIGEgd2luZG93IGluZGV4IG1vZHVsbyAzMksuXG4gICAqL1xuXG4gIHRoaXMuaGVhZCA9IG51bGw7ICAgLyogSGVhZHMgb2YgdGhlIGhhc2ggY2hhaW5zIG9yIE5JTC4gKi9cblxuICB0aGlzLmluc19oID0gMDsgICAgICAgLyogaGFzaCBpbmRleCBvZiBzdHJpbmcgdG8gYmUgaW5zZXJ0ZWQgKi9cbiAgdGhpcy5oYXNoX3NpemUgPSAwOyAgIC8qIG51bWJlciBvZiBlbGVtZW50cyBpbiBoYXNoIHRhYmxlICovXG4gIHRoaXMuaGFzaF9iaXRzID0gMDsgICAvKiBsb2cyKGhhc2hfc2l6ZSkgKi9cbiAgdGhpcy5oYXNoX21hc2sgPSAwOyAgIC8qIGhhc2hfc2l6ZS0xICovXG5cbiAgdGhpcy5oYXNoX3NoaWZ0ID0gMDtcbiAgLyogTnVtYmVyIG9mIGJpdHMgYnkgd2hpY2ggaW5zX2ggbXVzdCBiZSBzaGlmdGVkIGF0IGVhY2ggaW5wdXRcbiAgICogc3RlcC4gSXQgbXVzdCBiZSBzdWNoIHRoYXQgYWZ0ZXIgTUlOX01BVENIIHN0ZXBzLCB0aGUgb2xkZXN0XG4gICAqIGJ5dGUgbm8gbG9uZ2VyIHRha2VzIHBhcnQgaW4gdGhlIGhhc2gga2V5LCB0aGF0IGlzOlxuICAgKiAgIGhhc2hfc2hpZnQgKiBNSU5fTUFUQ0ggPj0gaGFzaF9iaXRzXG4gICAqL1xuXG4gIHRoaXMuYmxvY2tfc3RhcnQgPSAwO1xuICAvKiBXaW5kb3cgcG9zaXRpb24gYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgY3VycmVudCBvdXRwdXQgYmxvY2suIEdldHNcbiAgICogbmVnYXRpdmUgd2hlbiB0aGUgd2luZG93IGlzIG1vdmVkIGJhY2t3YXJkcy5cbiAgICovXG5cbiAgdGhpcy5tYXRjaF9sZW5ndGggPSAwOyAgICAgIC8qIGxlbmd0aCBvZiBiZXN0IG1hdGNoICovXG4gIHRoaXMucHJldl9tYXRjaCA9IDA7ICAgICAgICAvKiBwcmV2aW91cyBtYXRjaCAqL1xuICB0aGlzLm1hdGNoX2F2YWlsYWJsZSA9IDA7ICAgLyogc2V0IGlmIHByZXZpb3VzIG1hdGNoIGV4aXN0cyAqL1xuICB0aGlzLnN0cnN0YXJ0ID0gMDsgICAgICAgICAgLyogc3RhcnQgb2Ygc3RyaW5nIHRvIGluc2VydCAqL1xuICB0aGlzLm1hdGNoX3N0YXJ0ID0gMDsgICAgICAgLyogc3RhcnQgb2YgbWF0Y2hpbmcgc3RyaW5nICovXG4gIHRoaXMubG9va2FoZWFkID0gMDsgICAgICAgICAvKiBudW1iZXIgb2YgdmFsaWQgYnl0ZXMgYWhlYWQgaW4gd2luZG93ICovXG5cbiAgdGhpcy5wcmV2X2xlbmd0aCA9IDA7XG4gIC8qIExlbmd0aCBvZiB0aGUgYmVzdCBtYXRjaCBhdCBwcmV2aW91cyBzdGVwLiBNYXRjaGVzIG5vdCBncmVhdGVyIHRoYW4gdGhpc1xuICAgKiBhcmUgZGlzY2FyZGVkLiBUaGlzIGlzIHVzZWQgaW4gdGhlIGxhenkgbWF0Y2ggZXZhbHVhdGlvbi5cbiAgICovXG5cbiAgdGhpcy5tYXhfY2hhaW5fbGVuZ3RoID0gMDtcbiAgLyogVG8gc3BlZWQgdXAgZGVmbGF0aW9uLCBoYXNoIGNoYWlucyBhcmUgbmV2ZXIgc2VhcmNoZWQgYmV5b25kIHRoaXNcbiAgICogbGVuZ3RoLiAgQSBoaWdoZXIgbGltaXQgaW1wcm92ZXMgY29tcHJlc3Npb24gcmF0aW8gYnV0IGRlZ3JhZGVzIHRoZVxuICAgKiBzcGVlZC5cbiAgICovXG5cbiAgdGhpcy5tYXhfbGF6eV9tYXRjaCA9IDA7XG4gIC8qIEF0dGVtcHQgdG8gZmluZCBhIGJldHRlciBtYXRjaCBvbmx5IHdoZW4gdGhlIGN1cnJlbnQgbWF0Y2ggaXMgc3RyaWN0bHlcbiAgICogc21hbGxlciB0aGFuIHRoaXMgdmFsdWUuIFRoaXMgbWVjaGFuaXNtIGlzIHVzZWQgb25seSBmb3IgY29tcHJlc3Npb25cbiAgICogbGV2ZWxzID49IDQuXG4gICAqL1xuICAvLyBUaGF0J3MgYWxpYXMgdG8gbWF4X2xhenlfbWF0Y2gsIGRvbid0IHVzZSBkaXJlY3RseVxuICAvL3RoaXMubWF4X2luc2VydF9sZW5ndGggPSAwO1xuICAvKiBJbnNlcnQgbmV3IHN0cmluZ3MgaW4gdGhlIGhhc2ggdGFibGUgb25seSBpZiB0aGUgbWF0Y2ggbGVuZ3RoIGlzIG5vdFxuICAgKiBncmVhdGVyIHRoYW4gdGhpcyBsZW5ndGguIFRoaXMgc2F2ZXMgdGltZSBidXQgZGVncmFkZXMgY29tcHJlc3Npb24uXG4gICAqIG1heF9pbnNlcnRfbGVuZ3RoIGlzIHVzZWQgb25seSBmb3IgY29tcHJlc3Npb24gbGV2ZWxzIDw9IDMuXG4gICAqL1xuXG4gIHRoaXMubGV2ZWwgPSAwOyAgICAgLyogY29tcHJlc3Npb24gbGV2ZWwgKDEuLjkpICovXG4gIHRoaXMuc3RyYXRlZ3kgPSAwOyAgLyogZmF2b3Igb3IgZm9yY2UgSHVmZm1hbiBjb2RpbmcqL1xuXG4gIHRoaXMuZ29vZF9tYXRjaCA9IDA7XG4gIC8qIFVzZSBhIGZhc3RlciBzZWFyY2ggd2hlbiB0aGUgcHJldmlvdXMgbWF0Y2ggaXMgbG9uZ2VyIHRoYW4gdGhpcyAqL1xuXG4gIHRoaXMubmljZV9tYXRjaCA9IDA7IC8qIFN0b3Agc2VhcmNoaW5nIHdoZW4gY3VycmVudCBtYXRjaCBleGNlZWRzIHRoaXMgKi9cblxuICAgICAgICAgICAgICAvKiB1c2VkIGJ5IHRyZWVzLmM6ICovXG5cbiAgLyogRGlkbid0IHVzZSBjdF9kYXRhIHR5cGVkZWYgYmVsb3cgdG8gc3VwcHJlc3MgY29tcGlsZXIgd2FybmluZyAqL1xuXG4gIC8vIHN0cnVjdCBjdF9kYXRhX3MgZHluX2x0cmVlW0hFQVBfU0laRV07ICAgLyogbGl0ZXJhbCBhbmQgbGVuZ3RoIHRyZWUgKi9cbiAgLy8gc3RydWN0IGN0X2RhdGFfcyBkeW5fZHRyZWVbMipEX0NPREVTKzFdOyAvKiBkaXN0YW5jZSB0cmVlICovXG4gIC8vIHN0cnVjdCBjdF9kYXRhX3MgYmxfdHJlZVsyKkJMX0NPREVTKzFdOyAgLyogSHVmZm1hbiB0cmVlIGZvciBiaXQgbGVuZ3RocyAqL1xuXG4gIC8vIFVzZSBmbGF0IGFycmF5IG9mIERPVUJMRSBzaXplLCB3aXRoIGludGVybGVhdmVkIGZhdGEsXG4gIC8vIGJlY2F1c2UgSlMgZG9lcyBub3Qgc3VwcG9ydCBlZmZlY3RpdmVcbiAgdGhpcy5keW5fbHRyZWUgID0gbmV3IHV0aWxzLkJ1ZjE2KEhFQVBfU0laRSAqIDIpO1xuICB0aGlzLmR5bl9kdHJlZSAgPSBuZXcgdXRpbHMuQnVmMTYoKDIqRF9DT0RFUysxKSAqIDIpO1xuICB0aGlzLmJsX3RyZWUgICAgPSBuZXcgdXRpbHMuQnVmMTYoKDIqQkxfQ09ERVMrMSkgKiAyKTtcbiAgemVybyh0aGlzLmR5bl9sdHJlZSk7XG4gIHplcm8odGhpcy5keW5fZHRyZWUpO1xuICB6ZXJvKHRoaXMuYmxfdHJlZSk7XG5cbiAgdGhpcy5sX2Rlc2MgICA9IG51bGw7ICAgICAgICAgLyogZGVzYy4gZm9yIGxpdGVyYWwgdHJlZSAqL1xuICB0aGlzLmRfZGVzYyAgID0gbnVsbDsgICAgICAgICAvKiBkZXNjLiBmb3IgZGlzdGFuY2UgdHJlZSAqL1xuICB0aGlzLmJsX2Rlc2MgID0gbnVsbDsgICAgICAgICAvKiBkZXNjLiBmb3IgYml0IGxlbmd0aCB0cmVlICovXG5cbiAgLy91c2ggYmxfY291bnRbTUFYX0JJVFMrMV07XG4gIHRoaXMuYmxfY291bnQgPSBuZXcgdXRpbHMuQnVmMTYoTUFYX0JJVFMrMSk7XG4gIC8qIG51bWJlciBvZiBjb2RlcyBhdCBlYWNoIGJpdCBsZW5ndGggZm9yIGFuIG9wdGltYWwgdHJlZSAqL1xuXG4gIC8vaW50IGhlYXBbMipMX0NPREVTKzFdOyAgICAgIC8qIGhlYXAgdXNlZCB0byBidWlsZCB0aGUgSHVmZm1hbiB0cmVlcyAqL1xuICB0aGlzLmhlYXAgPSBuZXcgdXRpbHMuQnVmMTYoMipMX0NPREVTKzEpOyAgLyogaGVhcCB1c2VkIHRvIGJ1aWxkIHRoZSBIdWZmbWFuIHRyZWVzICovXG4gIHplcm8odGhpcy5oZWFwKTtcblxuICB0aGlzLmhlYXBfbGVuID0gMDsgICAgICAgICAgICAgICAvKiBudW1iZXIgb2YgZWxlbWVudHMgaW4gdGhlIGhlYXAgKi9cbiAgdGhpcy5oZWFwX21heCA9IDA7ICAgICAgICAgICAgICAgLyogZWxlbWVudCBvZiBsYXJnZXN0IGZyZXF1ZW5jeSAqL1xuICAvKiBUaGUgc29ucyBvZiBoZWFwW25dIGFyZSBoZWFwWzIqbl0gYW5kIGhlYXBbMipuKzFdLiBoZWFwWzBdIGlzIG5vdCB1c2VkLlxuICAgKiBUaGUgc2FtZSBoZWFwIGFycmF5IGlzIHVzZWQgdG8gYnVpbGQgYWxsIHRyZWVzLlxuICAgKi9cblxuICB0aGlzLmRlcHRoID0gbmV3IHV0aWxzLkJ1ZjE2KDIqTF9DT0RFUysxKTsgLy91Y2ggZGVwdGhbMipMX0NPREVTKzFdO1xuICB6ZXJvKHRoaXMuZGVwdGgpO1xuICAvKiBEZXB0aCBvZiBlYWNoIHN1YnRyZWUgdXNlZCBhcyB0aWUgYnJlYWtlciBmb3IgdHJlZXMgb2YgZXF1YWwgZnJlcXVlbmN5XG4gICAqL1xuXG4gIHRoaXMubF9idWYgPSAwOyAgICAgICAgICAvKiBidWZmZXIgaW5kZXggZm9yIGxpdGVyYWxzIG9yIGxlbmd0aHMgKi9cblxuICB0aGlzLmxpdF9idWZzaXplID0gMDtcbiAgLyogU2l6ZSBvZiBtYXRjaCBidWZmZXIgZm9yIGxpdGVyYWxzL2xlbmd0aHMuICBUaGVyZSBhcmUgNCByZWFzb25zIGZvclxuICAgKiBsaW1pdGluZyBsaXRfYnVmc2l6ZSB0byA2NEs6XG4gICAqICAgLSBmcmVxdWVuY2llcyBjYW4gYmUga2VwdCBpbiAxNiBiaXQgY291bnRlcnNcbiAgICogICAtIGlmIGNvbXByZXNzaW9uIGlzIG5vdCBzdWNjZXNzZnVsIGZvciB0aGUgZmlyc3QgYmxvY2ssIGFsbCBpbnB1dFxuICAgKiAgICAgZGF0YSBpcyBzdGlsbCBpbiB0aGUgd2luZG93IHNvIHdlIGNhbiBzdGlsbCBlbWl0IGEgc3RvcmVkIGJsb2NrIGV2ZW5cbiAgICogICAgIHdoZW4gaW5wdXQgY29tZXMgZnJvbSBzdGFuZGFyZCBpbnB1dC4gIChUaGlzIGNhbiBhbHNvIGJlIGRvbmUgZm9yXG4gICAqICAgICBhbGwgYmxvY2tzIGlmIGxpdF9idWZzaXplIGlzIG5vdCBncmVhdGVyIHRoYW4gMzJLLilcbiAgICogICAtIGlmIGNvbXByZXNzaW9uIGlzIG5vdCBzdWNjZXNzZnVsIGZvciBhIGZpbGUgc21hbGxlciB0aGFuIDY0Sywgd2UgY2FuXG4gICAqICAgICBldmVuIGVtaXQgYSBzdG9yZWQgZmlsZSBpbnN0ZWFkIG9mIGEgc3RvcmVkIGJsb2NrIChzYXZpbmcgNSBieXRlcykuXG4gICAqICAgICBUaGlzIGlzIGFwcGxpY2FibGUgb25seSBmb3IgemlwIChub3QgZ3ppcCBvciB6bGliKS5cbiAgICogICAtIGNyZWF0aW5nIG5ldyBIdWZmbWFuIHRyZWVzIGxlc3MgZnJlcXVlbnRseSBtYXkgbm90IHByb3ZpZGUgZmFzdFxuICAgKiAgICAgYWRhcHRhdGlvbiB0byBjaGFuZ2VzIGluIHRoZSBpbnB1dCBkYXRhIHN0YXRpc3RpY3MuIChUYWtlIGZvclxuICAgKiAgICAgZXhhbXBsZSBhIGJpbmFyeSBmaWxlIHdpdGggcG9vcmx5IGNvbXByZXNzaWJsZSBjb2RlIGZvbGxvd2VkIGJ5XG4gICAqICAgICBhIGhpZ2hseSBjb21wcmVzc2libGUgc3RyaW5nIHRhYmxlLikgU21hbGxlciBidWZmZXIgc2l6ZXMgZ2l2ZVxuICAgKiAgICAgZmFzdCBhZGFwdGF0aW9uIGJ1dCBoYXZlIG9mIGNvdXJzZSB0aGUgb3ZlcmhlYWQgb2YgdHJhbnNtaXR0aW5nXG4gICAqICAgICB0cmVlcyBtb3JlIGZyZXF1ZW50bHkuXG4gICAqICAgLSBJIGNhbid0IGNvdW50IGFib3ZlIDRcbiAgICovXG5cbiAgdGhpcy5sYXN0X2xpdCA9IDA7ICAgICAgLyogcnVubmluZyBpbmRleCBpbiBsX2J1ZiAqL1xuXG4gIHRoaXMuZF9idWYgPSAwO1xuICAvKiBCdWZmZXIgaW5kZXggZm9yIGRpc3RhbmNlcy4gVG8gc2ltcGxpZnkgdGhlIGNvZGUsIGRfYnVmIGFuZCBsX2J1ZiBoYXZlXG4gICAqIHRoZSBzYW1lIG51bWJlciBvZiBlbGVtZW50cy4gVG8gdXNlIGRpZmZlcmVudCBsZW5ndGhzLCBhbiBleHRyYSBmbGFnXG4gICAqIGFycmF5IHdvdWxkIGJlIG5lY2Vzc2FyeS5cbiAgICovXG5cbiAgdGhpcy5vcHRfbGVuID0gMDsgICAgICAgLyogYml0IGxlbmd0aCBvZiBjdXJyZW50IGJsb2NrIHdpdGggb3B0aW1hbCB0cmVlcyAqL1xuICB0aGlzLnN0YXRpY19sZW4gPSAwOyAgICAvKiBiaXQgbGVuZ3RoIG9mIGN1cnJlbnQgYmxvY2sgd2l0aCBzdGF0aWMgdHJlZXMgKi9cbiAgdGhpcy5tYXRjaGVzID0gMDsgICAgICAgLyogbnVtYmVyIG9mIHN0cmluZyBtYXRjaGVzIGluIGN1cnJlbnQgYmxvY2sgKi9cbiAgdGhpcy5pbnNlcnQgPSAwOyAgICAgICAgLyogYnl0ZXMgYXQgZW5kIG9mIHdpbmRvdyBsZWZ0IHRvIGluc2VydCAqL1xuXG5cbiAgdGhpcy5iaV9idWYgPSAwO1xuICAvKiBPdXRwdXQgYnVmZmVyLiBiaXRzIGFyZSBpbnNlcnRlZCBzdGFydGluZyBhdCB0aGUgYm90dG9tIChsZWFzdFxuICAgKiBzaWduaWZpY2FudCBiaXRzKS5cbiAgICovXG4gIHRoaXMuYmlfdmFsaWQgPSAwO1xuICAvKiBOdW1iZXIgb2YgdmFsaWQgYml0cyBpbiBiaV9idWYuICBBbGwgYml0cyBhYm92ZSB0aGUgbGFzdCB2YWxpZCBiaXRcbiAgICogYXJlIGFsd2F5cyB6ZXJvLlxuICAgKi9cblxuICAvLyBVc2VkIGZvciB3aW5kb3cgbWVtb3J5IGluaXQuIFdlIHNhZmVseSBpZ25vcmUgaXQgZm9yIEpTLiBUaGF0IG1ha2VzXG4gIC8vIHNlbnNlIG9ubHkgZm9yIHBvaW50ZXJzIGFuZCBtZW1vcnkgY2hlY2sgdG9vbHMuXG4gIC8vdGhpcy5oaWdoX3dhdGVyID0gMDtcbiAgLyogSGlnaCB3YXRlciBtYXJrIG9mZnNldCBpbiB3aW5kb3cgZm9yIGluaXRpYWxpemVkIGJ5dGVzIC0tIGJ5dGVzIGFib3ZlXG4gICAqIHRoaXMgYXJlIHNldCB0byB6ZXJvIGluIG9yZGVyIHRvIGF2b2lkIG1lbW9yeSBjaGVjayB3YXJuaW5ncyB3aGVuXG4gICAqIGxvbmdlc3QgbWF0Y2ggcm91dGluZXMgYWNjZXNzIGJ5dGVzIHBhc3QgdGhlIGlucHV0LiAgVGhpcyBpcyB0aGVuXG4gICAqIHVwZGF0ZWQgdG8gdGhlIG5ldyBoaWdoIHdhdGVyIG1hcmsuXG4gICAqL1xufVxuXG5cbmZ1bmN0aW9uIGRlZmxhdGVSZXNldEtlZXAoc3RybSkge1xuICB2YXIgcztcblxuICBpZiAoIXN0cm0gfHwgIXN0cm0uc3RhdGUpIHtcbiAgICByZXR1cm4gZXJyKHN0cm0sIFpfU1RSRUFNX0VSUk9SKTtcbiAgfVxuXG4gIHN0cm0udG90YWxfaW4gPSBzdHJtLnRvdGFsX291dCA9IDA7XG4gIHN0cm0uZGF0YV90eXBlID0gWl9VTktOT1dOO1xuXG4gIHMgPSBzdHJtLnN0YXRlO1xuICBzLnBlbmRpbmcgPSAwO1xuICBzLnBlbmRpbmdfb3V0ID0gMDtcblxuICBpZiAocy53cmFwIDwgMCkge1xuICAgIHMud3JhcCA9IC1zLndyYXA7XG4gICAgLyogd2FzIG1hZGUgbmVnYXRpdmUgYnkgZGVmbGF0ZSguLi4sIFpfRklOSVNIKTsgKi9cbiAgfVxuICBzLnN0YXR1cyA9IChzLndyYXAgPyBJTklUX1NUQVRFIDogQlVTWV9TVEFURSk7XG4gIHN0cm0uYWRsZXIgPSAocy53cmFwID09PSAyKSA/XG4gICAgMCAgLy8gY3JjMzIoMCwgWl9OVUxMLCAwKVxuICA6XG4gICAgMTsgLy8gYWRsZXIzMigwLCBaX05VTEwsIDApXG4gIHMubGFzdF9mbHVzaCA9IFpfTk9fRkxVU0g7XG4gIHRyZWVzLl90cl9pbml0KHMpO1xuICByZXR1cm4gWl9PSztcbn1cblxuXG5mdW5jdGlvbiBkZWZsYXRlUmVzZXQoc3RybSkge1xuICB2YXIgcmV0ID0gZGVmbGF0ZVJlc2V0S2VlcChzdHJtKTtcbiAgaWYgKHJldCA9PT0gWl9PSykge1xuICAgIGxtX2luaXQoc3RybS5zdGF0ZSk7XG4gIH1cbiAgcmV0dXJuIHJldDtcbn1cblxuXG5mdW5jdGlvbiBkZWZsYXRlU2V0SGVhZGVyKHN0cm0sIGhlYWQpIHtcbiAgaWYgKCFzdHJtIHx8ICFzdHJtLnN0YXRlKSB7IHJldHVybiBaX1NUUkVBTV9FUlJPUjsgfVxuICBpZiAoc3RybS5zdGF0ZS53cmFwICE9PSAyKSB7IHJldHVybiBaX1NUUkVBTV9FUlJPUjsgfVxuICBzdHJtLnN0YXRlLmd6aGVhZCA9IGhlYWQ7XG4gIHJldHVybiBaX09LO1xufVxuXG5cbmZ1bmN0aW9uIGRlZmxhdGVJbml0MihzdHJtLCBsZXZlbCwgbWV0aG9kLCB3aW5kb3dCaXRzLCBtZW1MZXZlbCwgc3RyYXRlZ3kpIHtcbiAgaWYgKCFzdHJtKSB7IC8vID09PSBaX05VTExcbiAgICByZXR1cm4gWl9TVFJFQU1fRVJST1I7XG4gIH1cbiAgdmFyIHdyYXAgPSAxO1xuXG4gIGlmIChsZXZlbCA9PT0gWl9ERUZBVUxUX0NPTVBSRVNTSU9OKSB7XG4gICAgbGV2ZWwgPSA2O1xuICB9XG5cbiAgaWYgKHdpbmRvd0JpdHMgPCAwKSB7IC8qIHN1cHByZXNzIHpsaWIgd3JhcHBlciAqL1xuICAgIHdyYXAgPSAwO1xuICAgIHdpbmRvd0JpdHMgPSAtd2luZG93Qml0cztcbiAgfVxuXG4gIGVsc2UgaWYgKHdpbmRvd0JpdHMgPiAxNSkge1xuICAgIHdyYXAgPSAyOyAgICAgICAgICAgLyogd3JpdGUgZ3ppcCB3cmFwcGVyIGluc3RlYWQgKi9cbiAgICB3aW5kb3dCaXRzIC09IDE2O1xuICB9XG5cblxuICBpZiAobWVtTGV2ZWwgPCAxIHx8IG1lbUxldmVsID4gTUFYX01FTV9MRVZFTCB8fCBtZXRob2QgIT09IFpfREVGTEFURUQgfHxcbiAgICB3aW5kb3dCaXRzIDwgOCB8fCB3aW5kb3dCaXRzID4gMTUgfHwgbGV2ZWwgPCAwIHx8IGxldmVsID4gOSB8fFxuICAgIHN0cmF0ZWd5IDwgMCB8fCBzdHJhdGVneSA+IFpfRklYRUQpIHtcbiAgICByZXR1cm4gZXJyKHN0cm0sIFpfU1RSRUFNX0VSUk9SKTtcbiAgfVxuXG5cbiAgaWYgKHdpbmRvd0JpdHMgPT09IDgpIHtcbiAgICB3aW5kb3dCaXRzID0gOTtcbiAgfVxuICAvKiB1bnRpbCAyNTYtYnl0ZSB3aW5kb3cgYnVnIGZpeGVkICovXG5cbiAgdmFyIHMgPSBuZXcgRGVmbGF0ZVN0YXRlKCk7XG5cbiAgc3RybS5zdGF0ZSA9IHM7XG4gIHMuc3RybSA9IHN0cm07XG5cbiAgcy53cmFwID0gd3JhcDtcbiAgcy5nemhlYWQgPSBudWxsO1xuICBzLndfYml0cyA9IHdpbmRvd0JpdHM7XG4gIHMud19zaXplID0gMSA8PCBzLndfYml0cztcbiAgcy53X21hc2sgPSBzLndfc2l6ZSAtIDE7XG5cbiAgcy5oYXNoX2JpdHMgPSBtZW1MZXZlbCArIDc7XG4gIHMuaGFzaF9zaXplID0gMSA8PCBzLmhhc2hfYml0cztcbiAgcy5oYXNoX21hc2sgPSBzLmhhc2hfc2l6ZSAtIDE7XG4gIHMuaGFzaF9zaGlmdCA9IH5+KChzLmhhc2hfYml0cyArIE1JTl9NQVRDSCAtIDEpIC8gTUlOX01BVENIKTtcblxuICBzLndpbmRvdyA9IG5ldyB1dGlscy5CdWY4KHMud19zaXplICogMik7XG4gIHMuaGVhZCA9IG5ldyB1dGlscy5CdWYxNihzLmhhc2hfc2l6ZSk7XG4gIHMucHJldiA9IG5ldyB1dGlscy5CdWYxNihzLndfc2l6ZSk7XG5cbiAgLy8gRG9uJ3QgbmVlZCBtZW0gaW5pdCBtYWdpYyBmb3IgSlMuXG4gIC8vcy5oaWdoX3dhdGVyID0gMDsgIC8qIG5vdGhpbmcgd3JpdHRlbiB0byBzLT53aW5kb3cgeWV0ICovXG5cbiAgcy5saXRfYnVmc2l6ZSA9IDEgPDwgKG1lbUxldmVsICsgNik7IC8qIDE2SyBlbGVtZW50cyBieSBkZWZhdWx0ICovXG5cbiAgcy5wZW5kaW5nX2J1Zl9zaXplID0gcy5saXRfYnVmc2l6ZSAqIDQ7XG4gIHMucGVuZGluZ19idWYgPSBuZXcgdXRpbHMuQnVmOChzLnBlbmRpbmdfYnVmX3NpemUpO1xuXG4gIHMuZF9idWYgPSBzLmxpdF9idWZzaXplID4+IDE7XG4gIHMubF9idWYgPSAoMSArIDIpICogcy5saXRfYnVmc2l6ZTtcblxuICBzLmxldmVsID0gbGV2ZWw7XG4gIHMuc3RyYXRlZ3kgPSBzdHJhdGVneTtcbiAgcy5tZXRob2QgPSBtZXRob2Q7XG5cbiAgcmV0dXJuIGRlZmxhdGVSZXNldChzdHJtKTtcbn1cblxuZnVuY3Rpb24gZGVmbGF0ZUluaXQoc3RybSwgbGV2ZWwpIHtcbiAgcmV0dXJuIGRlZmxhdGVJbml0MihzdHJtLCBsZXZlbCwgWl9ERUZMQVRFRCwgTUFYX1dCSVRTLCBERUZfTUVNX0xFVkVMLCBaX0RFRkFVTFRfU1RSQVRFR1kpO1xufVxuXG5cbmZ1bmN0aW9uIGRlZmxhdGUoc3RybSwgZmx1c2gpIHtcbiAgdmFyIG9sZF9mbHVzaCwgcztcbiAgdmFyIGJlZywgdmFsOyAvLyBmb3IgZ3ppcCBoZWFkZXIgd3JpdGUgb25seVxuXG4gIGlmICghc3RybSB8fCAhc3RybS5zdGF0ZSB8fFxuICAgIGZsdXNoID4gWl9CTE9DSyB8fCBmbHVzaCA8IDApIHtcbiAgICByZXR1cm4gc3RybSA/IGVycihzdHJtLCBaX1NUUkVBTV9FUlJPUikgOiBaX1NUUkVBTV9FUlJPUjtcbiAgfVxuXG4gIHMgPSBzdHJtLnN0YXRlO1xuXG4gIGlmICghc3RybS5vdXRwdXQgfHxcbiAgICAgICghc3RybS5pbnB1dCAmJiBzdHJtLmF2YWlsX2luICE9PSAwKSB8fFxuICAgICAgKHMuc3RhdHVzID09PSBGSU5JU0hfU1RBVEUgJiYgZmx1c2ggIT09IFpfRklOSVNIKSkge1xuICAgIHJldHVybiBlcnIoc3RybSwgKHN0cm0uYXZhaWxfb3V0ID09PSAwKSA/IFpfQlVGX0VSUk9SIDogWl9TVFJFQU1fRVJST1IpO1xuICB9XG5cbiAgcy5zdHJtID0gc3RybTsgLyoganVzdCBpbiBjYXNlICovXG4gIG9sZF9mbHVzaCA9IHMubGFzdF9mbHVzaDtcbiAgcy5sYXN0X2ZsdXNoID0gZmx1c2g7XG5cbiAgLyogV3JpdGUgdGhlIGhlYWRlciAqL1xuICBpZiAocy5zdGF0dXMgPT09IElOSVRfU1RBVEUpIHtcblxuICAgIGlmIChzLndyYXAgPT09IDIpIHsgLy8gR1pJUCBoZWFkZXJcbiAgICAgIHN0cm0uYWRsZXIgPSAwOyAgLy9jcmMzMigwTCwgWl9OVUxMLCAwKTtcbiAgICAgIHB1dF9ieXRlKHMsIDMxKTtcbiAgICAgIHB1dF9ieXRlKHMsIDEzOSk7XG4gICAgICBwdXRfYnl0ZShzLCA4KTtcbiAgICAgIGlmICghcy5nemhlYWQpIHsgLy8gcy0+Z3poZWFkID09IFpfTlVMTFxuICAgICAgICBwdXRfYnl0ZShzLCAwKTtcbiAgICAgICAgcHV0X2J5dGUocywgMCk7XG4gICAgICAgIHB1dF9ieXRlKHMsIDApO1xuICAgICAgICBwdXRfYnl0ZShzLCAwKTtcbiAgICAgICAgcHV0X2J5dGUocywgMCk7XG4gICAgICAgIHB1dF9ieXRlKHMsIHMubGV2ZWwgPT09IDkgPyAyIDpcbiAgICAgICAgICAgICAgICAgICAgKHMuc3RyYXRlZ3kgPj0gWl9IVUZGTUFOX09OTFkgfHwgcy5sZXZlbCA8IDIgP1xuICAgICAgICAgICAgICAgICAgICAgNCA6IDApKTtcbiAgICAgICAgcHV0X2J5dGUocywgT1NfQ09ERSk7XG4gICAgICAgIHMuc3RhdHVzID0gQlVTWV9TVEFURTtcbiAgICAgIH1cbiAgICAgIGVsc2Uge1xuICAgICAgICBwdXRfYnl0ZShzLCAocy5nemhlYWQudGV4dCA/IDEgOiAwKSArXG4gICAgICAgICAgICAgICAgICAgIChzLmd6aGVhZC5oY3JjID8gMiA6IDApICtcbiAgICAgICAgICAgICAgICAgICAgKCFzLmd6aGVhZC5leHRyYSA/IDAgOiA0KSArXG4gICAgICAgICAgICAgICAgICAgICghcy5nemhlYWQubmFtZSA/IDAgOiA4KSArXG4gICAgICAgICAgICAgICAgICAgICghcy5nemhlYWQuY29tbWVudCA/IDAgOiAxNilcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICBwdXRfYnl0ZShzLCBzLmd6aGVhZC50aW1lICYgMHhmZik7XG4gICAgICAgIHB1dF9ieXRlKHMsIChzLmd6aGVhZC50aW1lID4+IDgpICYgMHhmZik7XG4gICAgICAgIHB1dF9ieXRlKHMsIChzLmd6aGVhZC50aW1lID4+IDE2KSAmIDB4ZmYpO1xuICAgICAgICBwdXRfYnl0ZShzLCAocy5nemhlYWQudGltZSA+PiAyNCkgJiAweGZmKTtcbiAgICAgICAgcHV0X2J5dGUocywgcy5sZXZlbCA9PT0gOSA/IDIgOlxuICAgICAgICAgICAgICAgICAgICAocy5zdHJhdGVneSA+PSBaX0hVRkZNQU5fT05MWSB8fCBzLmxldmVsIDwgMiA/XG4gICAgICAgICAgICAgICAgICAgICA0IDogMCkpO1xuICAgICAgICBwdXRfYnl0ZShzLCBzLmd6aGVhZC5vcyAmIDB4ZmYpO1xuICAgICAgICBpZiAocy5nemhlYWQuZXh0cmEgJiYgcy5nemhlYWQuZXh0cmEubGVuZ3RoKSB7XG4gICAgICAgICAgcHV0X2J5dGUocywgcy5nemhlYWQuZXh0cmEubGVuZ3RoICYgMHhmZik7XG4gICAgICAgICAgcHV0X2J5dGUocywgKHMuZ3poZWFkLmV4dHJhLmxlbmd0aCA+PiA4KSAmIDB4ZmYpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChzLmd6aGVhZC5oY3JjKSB7XG4gICAgICAgICAgc3RybS5hZGxlciA9IGNyYzMyKHN0cm0uYWRsZXIsIHMucGVuZGluZ19idWYsIHMucGVuZGluZywgMCk7XG4gICAgICAgIH1cbiAgICAgICAgcy5nemluZGV4ID0gMDtcbiAgICAgICAgcy5zdGF0dXMgPSBFWFRSQV9TVEFURTtcbiAgICAgIH1cbiAgICB9XG4gICAgZWxzZSAvLyBERUZMQVRFIGhlYWRlclxuICAgIHtcbiAgICAgIHZhciBoZWFkZXIgPSAoWl9ERUZMQVRFRCArICgocy53X2JpdHMgLSA4KSA8PCA0KSkgPDwgODtcbiAgICAgIHZhciBsZXZlbF9mbGFncyA9IC0xO1xuXG4gICAgICBpZiAocy5zdHJhdGVneSA+PSBaX0hVRkZNQU5fT05MWSB8fCBzLmxldmVsIDwgMikge1xuICAgICAgICBsZXZlbF9mbGFncyA9IDA7XG4gICAgICB9IGVsc2UgaWYgKHMubGV2ZWwgPCA2KSB7XG4gICAgICAgIGxldmVsX2ZsYWdzID0gMTtcbiAgICAgIH0gZWxzZSBpZiAocy5sZXZlbCA9PT0gNikge1xuICAgICAgICBsZXZlbF9mbGFncyA9IDI7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBsZXZlbF9mbGFncyA9IDM7XG4gICAgICB9XG4gICAgICBoZWFkZXIgfD0gKGxldmVsX2ZsYWdzIDw8IDYpO1xuICAgICAgaWYgKHMuc3Ryc3RhcnQgIT09IDApIHsgaGVhZGVyIHw9IFBSRVNFVF9ESUNUOyB9XG4gICAgICBoZWFkZXIgKz0gMzEgLSAoaGVhZGVyICUgMzEpO1xuXG4gICAgICBzLnN0YXR1cyA9IEJVU1lfU1RBVEU7XG4gICAgICBwdXRTaG9ydE1TQihzLCBoZWFkZXIpO1xuXG4gICAgICAvKiBTYXZlIHRoZSBhZGxlcjMyIG9mIHRoZSBwcmVzZXQgZGljdGlvbmFyeTogKi9cbiAgICAgIGlmIChzLnN0cnN0YXJ0ICE9PSAwKSB7XG4gICAgICAgIHB1dFNob3J0TVNCKHMsIHN0cm0uYWRsZXIgPj4+IDE2KTtcbiAgICAgICAgcHV0U2hvcnRNU0Iocywgc3RybS5hZGxlciAmIDB4ZmZmZik7XG4gICAgICB9XG4gICAgICBzdHJtLmFkbGVyID0gMTsgLy8gYWRsZXIzMigwTCwgWl9OVUxMLCAwKTtcbiAgICB9XG4gIH1cblxuLy8jaWZkZWYgR1pJUFxuICBpZiAocy5zdGF0dXMgPT09IEVYVFJBX1NUQVRFKSB7XG4gICAgaWYgKHMuZ3poZWFkLmV4dHJhLyogIT0gWl9OVUxMKi8pIHtcbiAgICAgIGJlZyA9IHMucGVuZGluZzsgIC8qIHN0YXJ0IG9mIGJ5dGVzIHRvIHVwZGF0ZSBjcmMgKi9cblxuICAgICAgd2hpbGUgKHMuZ3ppbmRleCA8IChzLmd6aGVhZC5leHRyYS5sZW5ndGggJiAweGZmZmYpKSB7XG4gICAgICAgIGlmIChzLnBlbmRpbmcgPT09IHMucGVuZGluZ19idWZfc2l6ZSkge1xuICAgICAgICAgIGlmIChzLmd6aGVhZC5oY3JjICYmIHMucGVuZGluZyA+IGJlZykge1xuICAgICAgICAgICAgc3RybS5hZGxlciA9IGNyYzMyKHN0cm0uYWRsZXIsIHMucGVuZGluZ19idWYsIHMucGVuZGluZyAtIGJlZywgYmVnKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgZmx1c2hfcGVuZGluZyhzdHJtKTtcbiAgICAgICAgICBiZWcgPSBzLnBlbmRpbmc7XG4gICAgICAgICAgaWYgKHMucGVuZGluZyA9PT0gcy5wZW5kaW5nX2J1Zl9zaXplKSB7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcHV0X2J5dGUocywgcy5nemhlYWQuZXh0cmFbcy5nemluZGV4XSAmIDB4ZmYpO1xuICAgICAgICBzLmd6aW5kZXgrKztcbiAgICAgIH1cbiAgICAgIGlmIChzLmd6aGVhZC5oY3JjICYmIHMucGVuZGluZyA+IGJlZykge1xuICAgICAgICBzdHJtLmFkbGVyID0gY3JjMzIoc3RybS5hZGxlciwgcy5wZW5kaW5nX2J1Ziwgcy5wZW5kaW5nIC0gYmVnLCBiZWcpO1xuICAgICAgfVxuICAgICAgaWYgKHMuZ3ppbmRleCA9PT0gcy5nemhlYWQuZXh0cmEubGVuZ3RoKSB7XG4gICAgICAgIHMuZ3ppbmRleCA9IDA7XG4gICAgICAgIHMuc3RhdHVzID0gTkFNRV9TVEFURTtcbiAgICAgIH1cbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICBzLnN0YXR1cyA9IE5BTUVfU1RBVEU7XG4gICAgfVxuICB9XG4gIGlmIChzLnN0YXR1cyA9PT0gTkFNRV9TVEFURSkge1xuICAgIGlmIChzLmd6aGVhZC5uYW1lLyogIT0gWl9OVUxMKi8pIHtcbiAgICAgIGJlZyA9IHMucGVuZGluZzsgIC8qIHN0YXJ0IG9mIGJ5dGVzIHRvIHVwZGF0ZSBjcmMgKi9cbiAgICAgIC8vaW50IHZhbDtcblxuICAgICAgZG8ge1xuICAgICAgICBpZiAocy5wZW5kaW5nID09PSBzLnBlbmRpbmdfYnVmX3NpemUpIHtcbiAgICAgICAgICBpZiAocy5nemhlYWQuaGNyYyAmJiBzLnBlbmRpbmcgPiBiZWcpIHtcbiAgICAgICAgICAgIHN0cm0uYWRsZXIgPSBjcmMzMihzdHJtLmFkbGVyLCBzLnBlbmRpbmdfYnVmLCBzLnBlbmRpbmcgLSBiZWcsIGJlZyk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGZsdXNoX3BlbmRpbmcoc3RybSk7XG4gICAgICAgICAgYmVnID0gcy5wZW5kaW5nO1xuICAgICAgICAgIGlmIChzLnBlbmRpbmcgPT09IHMucGVuZGluZ19idWZfc2l6ZSkge1xuICAgICAgICAgICAgdmFsID0gMTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAvLyBKUyBzcGVjaWZpYzogbGl0dGxlIG1hZ2ljIHRvIGFkZCB6ZXJvIHRlcm1pbmF0b3IgdG8gZW5kIG9mIHN0cmluZ1xuICAgICAgICBpZiAocy5nemluZGV4IDwgcy5nemhlYWQubmFtZS5sZW5ndGgpIHtcbiAgICAgICAgICB2YWwgPSBzLmd6aGVhZC5uYW1lLmNoYXJDb2RlQXQocy5nemluZGV4KyspICYgMHhmZjtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB2YWwgPSAwO1xuICAgICAgICB9XG4gICAgICAgIHB1dF9ieXRlKHMsIHZhbCk7XG4gICAgICB9IHdoaWxlICh2YWwgIT09IDApO1xuXG4gICAgICBpZiAocy5nemhlYWQuaGNyYyAmJiBzLnBlbmRpbmcgPiBiZWcpe1xuICAgICAgICBzdHJtLmFkbGVyID0gY3JjMzIoc3RybS5hZGxlciwgcy5wZW5kaW5nX2J1Ziwgcy5wZW5kaW5nIC0gYmVnLCBiZWcpO1xuICAgICAgfVxuICAgICAgaWYgKHZhbCA9PT0gMCkge1xuICAgICAgICBzLmd6aW5kZXggPSAwO1xuICAgICAgICBzLnN0YXR1cyA9IENPTU1FTlRfU1RBVEU7XG4gICAgICB9XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgcy5zdGF0dXMgPSBDT01NRU5UX1NUQVRFO1xuICAgIH1cbiAgfVxuICBpZiAocy5zdGF0dXMgPT09IENPTU1FTlRfU1RBVEUpIHtcbiAgICBpZiAocy5nemhlYWQuY29tbWVudC8qICE9IFpfTlVMTCovKSB7XG4gICAgICBiZWcgPSBzLnBlbmRpbmc7ICAvKiBzdGFydCBvZiBieXRlcyB0byB1cGRhdGUgY3JjICovXG4gICAgICAvL2ludCB2YWw7XG5cbiAgICAgIGRvIHtcbiAgICAgICAgaWYgKHMucGVuZGluZyA9PT0gcy5wZW5kaW5nX2J1Zl9zaXplKSB7XG4gICAgICAgICAgaWYgKHMuZ3poZWFkLmhjcmMgJiYgcy5wZW5kaW5nID4gYmVnKSB7XG4gICAgICAgICAgICBzdHJtLmFkbGVyID0gY3JjMzIoc3RybS5hZGxlciwgcy5wZW5kaW5nX2J1Ziwgcy5wZW5kaW5nIC0gYmVnLCBiZWcpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBmbHVzaF9wZW5kaW5nKHN0cm0pO1xuICAgICAgICAgIGJlZyA9IHMucGVuZGluZztcbiAgICAgICAgICBpZiAocy5wZW5kaW5nID09PSBzLnBlbmRpbmdfYnVmX3NpemUpIHtcbiAgICAgICAgICAgIHZhbCA9IDE7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgLy8gSlMgc3BlY2lmaWM6IGxpdHRsZSBtYWdpYyB0byBhZGQgemVybyB0ZXJtaW5hdG9yIHRvIGVuZCBvZiBzdHJpbmdcbiAgICAgICAgaWYgKHMuZ3ppbmRleCA8IHMuZ3poZWFkLmNvbW1lbnQubGVuZ3RoKSB7XG4gICAgICAgICAgdmFsID0gcy5nemhlYWQuY29tbWVudC5jaGFyQ29kZUF0KHMuZ3ppbmRleCsrKSAmIDB4ZmY7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdmFsID0gMDtcbiAgICAgICAgfVxuICAgICAgICBwdXRfYnl0ZShzLCB2YWwpO1xuICAgICAgfSB3aGlsZSAodmFsICE9PSAwKTtcblxuICAgICAgaWYgKHMuZ3poZWFkLmhjcmMgJiYgcy5wZW5kaW5nID4gYmVnKSB7XG4gICAgICAgIHN0cm0uYWRsZXIgPSBjcmMzMihzdHJtLmFkbGVyLCBzLnBlbmRpbmdfYnVmLCBzLnBlbmRpbmcgLSBiZWcsIGJlZyk7XG4gICAgICB9XG4gICAgICBpZiAodmFsID09PSAwKSB7XG4gICAgICAgIHMuc3RhdHVzID0gSENSQ19TVEFURTtcbiAgICAgIH1cbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICBzLnN0YXR1cyA9IEhDUkNfU1RBVEU7XG4gICAgfVxuICB9XG4gIGlmIChzLnN0YXR1cyA9PT0gSENSQ19TVEFURSkge1xuICAgIGlmIChzLmd6aGVhZC5oY3JjKSB7XG4gICAgICBpZiAocy5wZW5kaW5nICsgMiA+IHMucGVuZGluZ19idWZfc2l6ZSkge1xuICAgICAgICBmbHVzaF9wZW5kaW5nKHN0cm0pO1xuICAgICAgfVxuICAgICAgaWYgKHMucGVuZGluZyArIDIgPD0gcy5wZW5kaW5nX2J1Zl9zaXplKSB7XG4gICAgICAgIHB1dF9ieXRlKHMsIHN0cm0uYWRsZXIgJiAweGZmKTtcbiAgICAgICAgcHV0X2J5dGUocywgKHN0cm0uYWRsZXIgPj4gOCkgJiAweGZmKTtcbiAgICAgICAgc3RybS5hZGxlciA9IDA7IC8vY3JjMzIoMEwsIFpfTlVMTCwgMCk7XG4gICAgICAgIHMuc3RhdHVzID0gQlVTWV9TVEFURTtcbiAgICAgIH1cbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICBzLnN0YXR1cyA9IEJVU1lfU1RBVEU7XG4gICAgfVxuICB9XG4vLyNlbmRpZlxuXG4gIC8qIEZsdXNoIGFzIG11Y2ggcGVuZGluZyBvdXRwdXQgYXMgcG9zc2libGUgKi9cbiAgaWYgKHMucGVuZGluZyAhPT0gMCkge1xuICAgIGZsdXNoX3BlbmRpbmcoc3RybSk7XG4gICAgaWYgKHN0cm0uYXZhaWxfb3V0ID09PSAwKSB7XG4gICAgICAvKiBTaW5jZSBhdmFpbF9vdXQgaXMgMCwgZGVmbGF0ZSB3aWxsIGJlIGNhbGxlZCBhZ2FpbiB3aXRoXG4gICAgICAgKiBtb3JlIG91dHB1dCBzcGFjZSwgYnV0IHBvc3NpYmx5IHdpdGggYm90aCBwZW5kaW5nIGFuZFxuICAgICAgICogYXZhaWxfaW4gZXF1YWwgdG8gemVyby4gVGhlcmUgd29uJ3QgYmUgYW55dGhpbmcgdG8gZG8sXG4gICAgICAgKiBidXQgdGhpcyBpcyBub3QgYW4gZXJyb3Igc2l0dWF0aW9uIHNvIG1ha2Ugc3VyZSB3ZVxuICAgICAgICogcmV0dXJuIE9LIGluc3RlYWQgb2YgQlVGX0VSUk9SIGF0IG5leHQgY2FsbCBvZiBkZWZsYXRlOlxuICAgICAgICovXG4gICAgICBzLmxhc3RfZmx1c2ggPSAtMTtcbiAgICAgIHJldHVybiBaX09LO1xuICAgIH1cblxuICAgIC8qIE1ha2Ugc3VyZSB0aGVyZSBpcyBzb21ldGhpbmcgdG8gZG8gYW5kIGF2b2lkIGR1cGxpY2F0ZSBjb25zZWN1dGl2ZVxuICAgICAqIGZsdXNoZXMuIEZvciByZXBlYXRlZCBhbmQgdXNlbGVzcyBjYWxscyB3aXRoIFpfRklOSVNILCB3ZSBrZWVwXG4gICAgICogcmV0dXJuaW5nIFpfU1RSRUFNX0VORCBpbnN0ZWFkIG9mIFpfQlVGX0VSUk9SLlxuICAgICAqL1xuICB9IGVsc2UgaWYgKHN0cm0uYXZhaWxfaW4gPT09IDAgJiYgcmFuayhmbHVzaCkgPD0gcmFuayhvbGRfZmx1c2gpICYmXG4gICAgZmx1c2ggIT09IFpfRklOSVNIKSB7XG4gICAgcmV0dXJuIGVycihzdHJtLCBaX0JVRl9FUlJPUik7XG4gIH1cblxuICAvKiBVc2VyIG11c3Qgbm90IHByb3ZpZGUgbW9yZSBpbnB1dCBhZnRlciB0aGUgZmlyc3QgRklOSVNIOiAqL1xuICBpZiAocy5zdGF0dXMgPT09IEZJTklTSF9TVEFURSAmJiBzdHJtLmF2YWlsX2luICE9PSAwKSB7XG4gICAgcmV0dXJuIGVycihzdHJtLCBaX0JVRl9FUlJPUik7XG4gIH1cblxuICAvKiBTdGFydCBhIG5ldyBibG9jayBvciBjb250aW51ZSB0aGUgY3VycmVudCBvbmUuXG4gICAqL1xuICBpZiAoc3RybS5hdmFpbF9pbiAhPT0gMCB8fCBzLmxvb2thaGVhZCAhPT0gMCB8fFxuICAgIChmbHVzaCAhPT0gWl9OT19GTFVTSCAmJiBzLnN0YXR1cyAhPT0gRklOSVNIX1NUQVRFKSkge1xuICAgIHZhciBic3RhdGUgPSAocy5zdHJhdGVneSA9PT0gWl9IVUZGTUFOX09OTFkpID8gZGVmbGF0ZV9odWZmKHMsIGZsdXNoKSA6XG4gICAgICAocy5zdHJhdGVneSA9PT0gWl9STEUgPyBkZWZsYXRlX3JsZShzLCBmbHVzaCkgOlxuICAgICAgICBjb25maWd1cmF0aW9uX3RhYmxlW3MubGV2ZWxdLmZ1bmMocywgZmx1c2gpKTtcblxuICAgIGlmIChic3RhdGUgPT09IEJTX0ZJTklTSF9TVEFSVEVEIHx8IGJzdGF0ZSA9PT0gQlNfRklOSVNIX0RPTkUpIHtcbiAgICAgIHMuc3RhdHVzID0gRklOSVNIX1NUQVRFO1xuICAgIH1cbiAgICBpZiAoYnN0YXRlID09PSBCU19ORUVEX01PUkUgfHwgYnN0YXRlID09PSBCU19GSU5JU0hfU1RBUlRFRCkge1xuICAgICAgaWYgKHN0cm0uYXZhaWxfb3V0ID09PSAwKSB7XG4gICAgICAgIHMubGFzdF9mbHVzaCA9IC0xO1xuICAgICAgICAvKiBhdm9pZCBCVUZfRVJST1IgbmV4dCBjYWxsLCBzZWUgYWJvdmUgKi9cbiAgICAgIH1cbiAgICAgIHJldHVybiBaX09LO1xuICAgICAgLyogSWYgZmx1c2ggIT0gWl9OT19GTFVTSCAmJiBhdmFpbF9vdXQgPT0gMCwgdGhlIG5leHQgY2FsbFxuICAgICAgICogb2YgZGVmbGF0ZSBzaG91bGQgdXNlIHRoZSBzYW1lIGZsdXNoIHBhcmFtZXRlciB0byBtYWtlIHN1cmVcbiAgICAgICAqIHRoYXQgdGhlIGZsdXNoIGlzIGNvbXBsZXRlLiBTbyB3ZSBkb24ndCBoYXZlIHRvIG91dHB1dCBhblxuICAgICAgICogZW1wdHkgYmxvY2sgaGVyZSwgdGhpcyB3aWxsIGJlIGRvbmUgYXQgbmV4dCBjYWxsLiBUaGlzIGFsc29cbiAgICAgICAqIGVuc3VyZXMgdGhhdCBmb3IgYSB2ZXJ5IHNtYWxsIG91dHB1dCBidWZmZXIsIHdlIGVtaXQgYXQgbW9zdFxuICAgICAgICogb25lIGVtcHR5IGJsb2NrLlxuICAgICAgICovXG4gICAgfVxuICAgIGlmIChic3RhdGUgPT09IEJTX0JMT0NLX0RPTkUpIHtcbiAgICAgIGlmIChmbHVzaCA9PT0gWl9QQVJUSUFMX0ZMVVNIKSB7XG4gICAgICAgIHRyZWVzLl90cl9hbGlnbihzKTtcbiAgICAgIH1cbiAgICAgIGVsc2UgaWYgKGZsdXNoICE9PSBaX0JMT0NLKSB7IC8qIEZVTExfRkxVU0ggb3IgU1lOQ19GTFVTSCAqL1xuXG4gICAgICAgIHRyZWVzLl90cl9zdG9yZWRfYmxvY2socywgMCwgMCwgZmFsc2UpO1xuICAgICAgICAvKiBGb3IgYSBmdWxsIGZsdXNoLCB0aGlzIGVtcHR5IGJsb2NrIHdpbGwgYmUgcmVjb2duaXplZFxuICAgICAgICAgKiBhcyBhIHNwZWNpYWwgbWFya2VyIGJ5IGluZmxhdGVfc3luYygpLlxuICAgICAgICAgKi9cbiAgICAgICAgaWYgKGZsdXNoID09PSBaX0ZVTExfRkxVU0gpIHtcbiAgICAgICAgICAvKioqIENMRUFSX0hBU0gocyk7ICoqKi8gICAgICAgICAgICAgLyogZm9yZ2V0IGhpc3RvcnkgKi9cbiAgICAgICAgICB6ZXJvKHMuaGVhZCk7IC8vIEZpbGwgd2l0aCBOSUwgKD0gMCk7XG5cbiAgICAgICAgICBpZiAocy5sb29rYWhlYWQgPT09IDApIHtcbiAgICAgICAgICAgIHMuc3Ryc3RhcnQgPSAwO1xuICAgICAgICAgICAgcy5ibG9ja19zdGFydCA9IDA7XG4gICAgICAgICAgICBzLmluc2VydCA9IDA7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICBmbHVzaF9wZW5kaW5nKHN0cm0pO1xuICAgICAgaWYgKHN0cm0uYXZhaWxfb3V0ID09PSAwKSB7XG4gICAgICAgIHMubGFzdF9mbHVzaCA9IC0xOyAvKiBhdm9pZCBCVUZfRVJST1IgYXQgbmV4dCBjYWxsLCBzZWUgYWJvdmUgKi9cbiAgICAgICAgcmV0dXJuIFpfT0s7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIC8vQXNzZXJ0KHN0cm0tPmF2YWlsX291dCA+IDAsIFwiYnVnMlwiKTtcbiAgLy9pZiAoc3RybS5hdmFpbF9vdXQgPD0gMCkgeyB0aHJvdyBuZXcgRXJyb3IoXCJidWcyXCIpO31cblxuICBpZiAoZmx1c2ggIT09IFpfRklOSVNIKSB7IHJldHVybiBaX09LOyB9XG4gIGlmIChzLndyYXAgPD0gMCkgeyByZXR1cm4gWl9TVFJFQU1fRU5EOyB9XG5cbiAgLyogV3JpdGUgdGhlIHRyYWlsZXIgKi9cbiAgaWYgKHMud3JhcCA9PT0gMikge1xuICAgIHB1dF9ieXRlKHMsIHN0cm0uYWRsZXIgJiAweGZmKTtcbiAgICBwdXRfYnl0ZShzLCAoc3RybS5hZGxlciA+PiA4KSAmIDB4ZmYpO1xuICAgIHB1dF9ieXRlKHMsIChzdHJtLmFkbGVyID4+IDE2KSAmIDB4ZmYpO1xuICAgIHB1dF9ieXRlKHMsIChzdHJtLmFkbGVyID4+IDI0KSAmIDB4ZmYpO1xuICAgIHB1dF9ieXRlKHMsIHN0cm0udG90YWxfaW4gJiAweGZmKTtcbiAgICBwdXRfYnl0ZShzLCAoc3RybS50b3RhbF9pbiA+PiA4KSAmIDB4ZmYpO1xuICAgIHB1dF9ieXRlKHMsIChzdHJtLnRvdGFsX2luID4+IDE2KSAmIDB4ZmYpO1xuICAgIHB1dF9ieXRlKHMsIChzdHJtLnRvdGFsX2luID4+IDI0KSAmIDB4ZmYpO1xuICB9XG4gIGVsc2VcbiAge1xuICAgIHB1dFNob3J0TVNCKHMsIHN0cm0uYWRsZXIgPj4+IDE2KTtcbiAgICBwdXRTaG9ydE1TQihzLCBzdHJtLmFkbGVyICYgMHhmZmZmKTtcbiAgfVxuXG4gIGZsdXNoX3BlbmRpbmcoc3RybSk7XG4gIC8qIElmIGF2YWlsX291dCBpcyB6ZXJvLCB0aGUgYXBwbGljYXRpb24gd2lsbCBjYWxsIGRlZmxhdGUgYWdhaW5cbiAgICogdG8gZmx1c2ggdGhlIHJlc3QuXG4gICAqL1xuICBpZiAocy53cmFwID4gMCkgeyBzLndyYXAgPSAtcy53cmFwOyB9XG4gIC8qIHdyaXRlIHRoZSB0cmFpbGVyIG9ubHkgb25jZSEgKi9cbiAgcmV0dXJuIHMucGVuZGluZyAhPT0gMCA/IFpfT0sgOiBaX1NUUkVBTV9FTkQ7XG59XG5cbmZ1bmN0aW9uIGRlZmxhdGVFbmQoc3RybSkge1xuICB2YXIgc3RhdHVzO1xuXG4gIGlmICghc3RybS8qPT0gWl9OVUxMKi8gfHwgIXN0cm0uc3RhdGUvKj09IFpfTlVMTCovKSB7XG4gICAgcmV0dXJuIFpfU1RSRUFNX0VSUk9SO1xuICB9XG5cbiAgc3RhdHVzID0gc3RybS5zdGF0ZS5zdGF0dXM7XG4gIGlmIChzdGF0dXMgIT09IElOSVRfU1RBVEUgJiZcbiAgICBzdGF0dXMgIT09IEVYVFJBX1NUQVRFICYmXG4gICAgc3RhdHVzICE9PSBOQU1FX1NUQVRFICYmXG4gICAgc3RhdHVzICE9PSBDT01NRU5UX1NUQVRFICYmXG4gICAgc3RhdHVzICE9PSBIQ1JDX1NUQVRFICYmXG4gICAgc3RhdHVzICE9PSBCVVNZX1NUQVRFICYmXG4gICAgc3RhdHVzICE9PSBGSU5JU0hfU1RBVEVcbiAgKSB7XG4gICAgcmV0dXJuIGVycihzdHJtLCBaX1NUUkVBTV9FUlJPUik7XG4gIH1cblxuICBzdHJtLnN0YXRlID0gbnVsbDtcblxuICByZXR1cm4gc3RhdHVzID09PSBCVVNZX1NUQVRFID8gZXJyKHN0cm0sIFpfREFUQV9FUlJPUikgOiBaX09LO1xufVxuXG4vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKiBDb3B5IHRoZSBzb3VyY2Ugc3RhdGUgdG8gdGhlIGRlc3RpbmF0aW9uIHN0YXRlXG4gKi9cbi8vZnVuY3Rpb24gZGVmbGF0ZUNvcHkoZGVzdCwgc291cmNlKSB7XG4vL1xuLy99XG5cbmV4cG9ydHMuZGVmbGF0ZUluaXQgPSBkZWZsYXRlSW5pdDtcbmV4cG9ydHMuZGVmbGF0ZUluaXQyID0gZGVmbGF0ZUluaXQyO1xuZXhwb3J0cy5kZWZsYXRlUmVzZXQgPSBkZWZsYXRlUmVzZXQ7XG5leHBvcnRzLmRlZmxhdGVSZXNldEtlZXAgPSBkZWZsYXRlUmVzZXRLZWVwO1xuZXhwb3J0cy5kZWZsYXRlU2V0SGVhZGVyID0gZGVmbGF0ZVNldEhlYWRlcjtcbmV4cG9ydHMuZGVmbGF0ZSA9IGRlZmxhdGU7XG5leHBvcnRzLmRlZmxhdGVFbmQgPSBkZWZsYXRlRW5kO1xuZXhwb3J0cy5kZWZsYXRlSW5mbyA9ICdwYWtvIGRlZmxhdGUgKGZyb20gTm9kZWNhIHByb2plY3QpJztcblxuLyogTm90IGltcGxlbWVudGVkXG5leHBvcnRzLmRlZmxhdGVCb3VuZCA9IGRlZmxhdGVCb3VuZDtcbmV4cG9ydHMuZGVmbGF0ZUNvcHkgPSBkZWZsYXRlQ29weTtcbmV4cG9ydHMuZGVmbGF0ZVNldERpY3Rpb25hcnkgPSBkZWZsYXRlU2V0RGljdGlvbmFyeTtcbmV4cG9ydHMuZGVmbGF0ZVBhcmFtcyA9IGRlZmxhdGVQYXJhbXM7XG5leHBvcnRzLmRlZmxhdGVQZW5kaW5nID0gZGVmbGF0ZVBlbmRpbmc7XG5leHBvcnRzLmRlZmxhdGVQcmltZSA9IGRlZmxhdGVQcmltZTtcbmV4cG9ydHMuZGVmbGF0ZVR1bmUgPSBkZWZsYXRlVHVuZTtcbiovXG59LHtcIi4uL3V0aWxzL2NvbW1vblwiOjI3LFwiLi9hZGxlcjMyXCI6MjksXCIuL2NyYzMyXCI6MzEsXCIuL21lc3NhZ2VzXCI6MzcsXCIuL3RyZWVzXCI6Mzh9XSwzMzpbZnVuY3Rpb24oX2RlcmVxXyxtb2R1bGUsZXhwb3J0cyl7XG4ndXNlIHN0cmljdCc7XG5cblxuZnVuY3Rpb24gR1poZWFkZXIoKSB7XG4gIC8qIHRydWUgaWYgY29tcHJlc3NlZCBkYXRhIGJlbGlldmVkIHRvIGJlIHRleHQgKi9cbiAgdGhpcy50ZXh0ICAgICAgID0gMDtcbiAgLyogbW9kaWZpY2F0aW9uIHRpbWUgKi9cbiAgdGhpcy50aW1lICAgICAgID0gMDtcbiAgLyogZXh0cmEgZmxhZ3MgKG5vdCB1c2VkIHdoZW4gd3JpdGluZyBhIGd6aXAgZmlsZSkgKi9cbiAgdGhpcy54ZmxhZ3MgICAgID0gMDtcbiAgLyogb3BlcmF0aW5nIHN5c3RlbSAqL1xuICB0aGlzLm9zICAgICAgICAgPSAwO1xuICAvKiBwb2ludGVyIHRvIGV4dHJhIGZpZWxkIG9yIFpfTlVMTCBpZiBub25lICovXG4gIHRoaXMuZXh0cmEgICAgICA9IG51bGw7XG4gIC8qIGV4dHJhIGZpZWxkIGxlbmd0aCAodmFsaWQgaWYgZXh0cmEgIT0gWl9OVUxMKSAqL1xuICB0aGlzLmV4dHJhX2xlbiAgPSAwOyAvLyBBY3R1YWxseSwgd2UgZG9uJ3QgbmVlZCBpdCBpbiBKUyxcbiAgICAgICAgICAgICAgICAgICAgICAgLy8gYnV0IGxlYXZlIGZvciBmZXcgY29kZSBtb2RpZmljYXRpb25zXG5cbiAgLy9cbiAgLy8gU2V0dXAgbGltaXRzIGlzIG5vdCBuZWNlc3NhcnkgYmVjYXVzZSBpbiBqcyB3ZSBzaG91bGQgbm90IHByZWFsbG9jYXRlIG1lbW9yeVxuICAvLyBmb3IgaW5mbGF0ZSB1c2UgY29uc3RhbnQgbGltaXQgaW4gNjU1MzYgYnl0ZXNcbiAgLy9cblxuICAvKiBzcGFjZSBhdCBleHRyYSAob25seSB3aGVuIHJlYWRpbmcgaGVhZGVyKSAqL1xuICAvLyB0aGlzLmV4dHJhX21heCAgPSAwO1xuICAvKiBwb2ludGVyIHRvIHplcm8tdGVybWluYXRlZCBmaWxlIG5hbWUgb3IgWl9OVUxMICovXG4gIHRoaXMubmFtZSAgICAgICA9ICcnO1xuICAvKiBzcGFjZSBhdCBuYW1lIChvbmx5IHdoZW4gcmVhZGluZyBoZWFkZXIpICovXG4gIC8vIHRoaXMubmFtZV9tYXggICA9IDA7XG4gIC8qIHBvaW50ZXIgdG8gemVyby10ZXJtaW5hdGVkIGNvbW1lbnQgb3IgWl9OVUxMICovXG4gIHRoaXMuY29tbWVudCAgICA9ICcnO1xuICAvKiBzcGFjZSBhdCBjb21tZW50IChvbmx5IHdoZW4gcmVhZGluZyBoZWFkZXIpICovXG4gIC8vIHRoaXMuY29tbV9tYXggICA9IDA7XG4gIC8qIHRydWUgaWYgdGhlcmUgd2FzIG9yIHdpbGwgYmUgYSBoZWFkZXIgY3JjICovXG4gIHRoaXMuaGNyYyAgICAgICA9IDA7XG4gIC8qIHRydWUgd2hlbiBkb25lIHJlYWRpbmcgZ3ppcCBoZWFkZXIgKG5vdCB1c2VkIHdoZW4gd3JpdGluZyBhIGd6aXAgZmlsZSkgKi9cbiAgdGhpcy5kb25lICAgICAgID0gZmFsc2U7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gR1poZWFkZXI7XG59LHt9XSwzNDpbZnVuY3Rpb24oX2RlcmVxXyxtb2R1bGUsZXhwb3J0cyl7XG4ndXNlIHN0cmljdCc7XG5cbi8vIFNlZSBzdGF0ZSBkZWZzIGZyb20gaW5mbGF0ZS5qc1xudmFyIEJBRCA9IDMwOyAgICAgICAvKiBnb3QgYSBkYXRhIGVycm9yIC0tIHJlbWFpbiBoZXJlIHVudGlsIHJlc2V0ICovXG52YXIgVFlQRSA9IDEyOyAgICAgIC8qIGk6IHdhaXRpbmcgZm9yIHR5cGUgYml0cywgaW5jbHVkaW5nIGxhc3QtZmxhZyBiaXQgKi9cblxuLypcbiAgIERlY29kZSBsaXRlcmFsLCBsZW5ndGgsIGFuZCBkaXN0YW5jZSBjb2RlcyBhbmQgd3JpdGUgb3V0IHRoZSByZXN1bHRpbmdcbiAgIGxpdGVyYWwgYW5kIG1hdGNoIGJ5dGVzIHVudGlsIGVpdGhlciBub3QgZW5vdWdoIGlucHV0IG9yIG91dHB1dCBpc1xuICAgYXZhaWxhYmxlLCBhbiBlbmQtb2YtYmxvY2sgaXMgZW5jb3VudGVyZWQsIG9yIGEgZGF0YSBlcnJvciBpcyBlbmNvdW50ZXJlZC5cbiAgIFdoZW4gbGFyZ2UgZW5vdWdoIGlucHV0IGFuZCBvdXRwdXQgYnVmZmVycyBhcmUgc3VwcGxpZWQgdG8gaW5mbGF0ZSgpLCBmb3JcbiAgIGV4YW1wbGUsIGEgMTZLIGlucHV0IGJ1ZmZlciBhbmQgYSA2NEsgb3V0cHV0IGJ1ZmZlciwgbW9yZSB0aGFuIDk1JSBvZiB0aGVcbiAgIGluZmxhdGUgZXhlY3V0aW9uIHRpbWUgaXMgc3BlbnQgaW4gdGhpcyByb3V0aW5lLlxuXG4gICBFbnRyeSBhc3N1bXB0aW9uczpcblxuICAgICAgICBzdGF0ZS5tb2RlID09PSBMRU5cbiAgICAgICAgc3RybS5hdmFpbF9pbiA+PSA2XG4gICAgICAgIHN0cm0uYXZhaWxfb3V0ID49IDI1OFxuICAgICAgICBzdGFydCA+PSBzdHJtLmF2YWlsX291dFxuICAgICAgICBzdGF0ZS5iaXRzIDwgOFxuXG4gICBPbiByZXR1cm4sIHN0YXRlLm1vZGUgaXMgb25lIG9mOlxuXG4gICAgICAgIExFTiAtLSByYW4gb3V0IG9mIGVub3VnaCBvdXRwdXQgc3BhY2Ugb3IgZW5vdWdoIGF2YWlsYWJsZSBpbnB1dFxuICAgICAgICBUWVBFIC0tIHJlYWNoZWQgZW5kIG9mIGJsb2NrIGNvZGUsIGluZmxhdGUoKSB0byBpbnRlcnByZXQgbmV4dCBibG9ja1xuICAgICAgICBCQUQgLS0gZXJyb3IgaW4gYmxvY2sgZGF0YVxuXG4gICBOb3RlczpcblxuICAgIC0gVGhlIG1heGltdW0gaW5wdXQgYml0cyB1c2VkIGJ5IGEgbGVuZ3RoL2Rpc3RhbmNlIHBhaXIgaXMgMTUgYml0cyBmb3IgdGhlXG4gICAgICBsZW5ndGggY29kZSwgNSBiaXRzIGZvciB0aGUgbGVuZ3RoIGV4dHJhLCAxNSBiaXRzIGZvciB0aGUgZGlzdGFuY2UgY29kZSxcbiAgICAgIGFuZCAxMyBiaXRzIGZvciB0aGUgZGlzdGFuY2UgZXh0cmEuICBUaGlzIHRvdGFscyA0OCBiaXRzLCBvciBzaXggYnl0ZXMuXG4gICAgICBUaGVyZWZvcmUgaWYgc3RybS5hdmFpbF9pbiA+PSA2LCB0aGVuIHRoZXJlIGlzIGVub3VnaCBpbnB1dCB0byBhdm9pZFxuICAgICAgY2hlY2tpbmcgZm9yIGF2YWlsYWJsZSBpbnB1dCB3aGlsZSBkZWNvZGluZy5cblxuICAgIC0gVGhlIG1heGltdW0gYnl0ZXMgdGhhdCBhIHNpbmdsZSBsZW5ndGgvZGlzdGFuY2UgcGFpciBjYW4gb3V0cHV0IGlzIDI1OFxuICAgICAgYnl0ZXMsIHdoaWNoIGlzIHRoZSBtYXhpbXVtIGxlbmd0aCB0aGF0IGNhbiBiZSBjb2RlZC4gIGluZmxhdGVfZmFzdCgpXG4gICAgICByZXF1aXJlcyBzdHJtLmF2YWlsX291dCA+PSAyNTggZm9yIGVhY2ggbG9vcCB0byBhdm9pZCBjaGVja2luZyBmb3JcbiAgICAgIG91dHB1dCBzcGFjZS5cbiAqL1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBpbmZsYXRlX2Zhc3Qoc3RybSwgc3RhcnQpIHtcbiAgdmFyIHN0YXRlO1xuICB2YXIgX2luOyAgICAgICAgICAgICAgICAgICAgLyogbG9jYWwgc3RybS5pbnB1dCAqL1xuICB2YXIgbGFzdDsgICAgICAgICAgICAgICAgICAgLyogaGF2ZSBlbm91Z2ggaW5wdXQgd2hpbGUgaW4gPCBsYXN0ICovXG4gIHZhciBfb3V0OyAgICAgICAgICAgICAgICAgICAvKiBsb2NhbCBzdHJtLm91dHB1dCAqL1xuICB2YXIgYmVnOyAgICAgICAgICAgICAgICAgICAgLyogaW5mbGF0ZSgpJ3MgaW5pdGlhbCBzdHJtLm91dHB1dCAqL1xuICB2YXIgZW5kOyAgICAgICAgICAgICAgICAgICAgLyogd2hpbGUgb3V0IDwgZW5kLCBlbm91Z2ggc3BhY2UgYXZhaWxhYmxlICovXG4vLyNpZmRlZiBJTkZMQVRFX1NUUklDVFxuICB2YXIgZG1heDsgICAgICAgICAgICAgICAgICAgLyogbWF4aW11bSBkaXN0YW5jZSBmcm9tIHpsaWIgaGVhZGVyICovXG4vLyNlbmRpZlxuICB2YXIgd3NpemU7ICAgICAgICAgICAgICAgICAgLyogd2luZG93IHNpemUgb3IgemVybyBpZiBub3QgdXNpbmcgd2luZG93ICovXG4gIHZhciB3aGF2ZTsgICAgICAgICAgICAgICAgICAvKiB2YWxpZCBieXRlcyBpbiB0aGUgd2luZG93ICovXG4gIHZhciB3bmV4dDsgICAgICAgICAgICAgICAgICAvKiB3aW5kb3cgd3JpdGUgaW5kZXggKi9cbiAgdmFyIHdpbmRvdzsgICAgICAgICAgICAgICAgIC8qIGFsbG9jYXRlZCBzbGlkaW5nIHdpbmRvdywgaWYgd3NpemUgIT0gMCAqL1xuICB2YXIgaG9sZDsgICAgICAgICAgICAgICAgICAgLyogbG9jYWwgc3RybS5ob2xkICovXG4gIHZhciBiaXRzOyAgICAgICAgICAgICAgICAgICAvKiBsb2NhbCBzdHJtLmJpdHMgKi9cbiAgdmFyIGxjb2RlOyAgICAgICAgICAgICAgICAgIC8qIGxvY2FsIHN0cm0ubGVuY29kZSAqL1xuICB2YXIgZGNvZGU7ICAgICAgICAgICAgICAgICAgLyogbG9jYWwgc3RybS5kaXN0Y29kZSAqL1xuICB2YXIgbG1hc2s7ICAgICAgICAgICAgICAgICAgLyogbWFzayBmb3IgZmlyc3QgbGV2ZWwgb2YgbGVuZ3RoIGNvZGVzICovXG4gIHZhciBkbWFzazsgICAgICAgICAgICAgICAgICAvKiBtYXNrIGZvciBmaXJzdCBsZXZlbCBvZiBkaXN0YW5jZSBjb2RlcyAqL1xuICB2YXIgaGVyZTsgICAgICAgICAgICAgICAgICAgLyogcmV0cmlldmVkIHRhYmxlIGVudHJ5ICovXG4gIHZhciBvcDsgICAgICAgICAgICAgICAgICAgICAvKiBjb2RlIGJpdHMsIG9wZXJhdGlvbiwgZXh0cmEgYml0cywgb3IgKi9cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qICB3aW5kb3cgcG9zaXRpb24sIHdpbmRvdyBieXRlcyB0byBjb3B5ICovXG4gIHZhciBsZW47ICAgICAgICAgICAgICAgICAgICAvKiBtYXRjaCBsZW5ndGgsIHVudXNlZCBieXRlcyAqL1xuICB2YXIgZGlzdDsgICAgICAgICAgICAgICAgICAgLyogbWF0Y2ggZGlzdGFuY2UgKi9cbiAgdmFyIGZyb207ICAgICAgICAgICAgICAgICAgIC8qIHdoZXJlIHRvIGNvcHkgbWF0Y2ggZnJvbSAqL1xuICB2YXIgZnJvbV9zb3VyY2U7XG5cblxuICB2YXIgaW5wdXQsIG91dHB1dDsgLy8gSlMgc3BlY2lmaWMsIGJlY2F1c2Ugd2UgaGF2ZSBubyBwb2ludGVyc1xuXG4gIC8qIGNvcHkgc3RhdGUgdG8gbG9jYWwgdmFyaWFibGVzICovXG4gIHN0YXRlID0gc3RybS5zdGF0ZTtcbiAgLy9oZXJlID0gc3RhdGUuaGVyZTtcbiAgX2luID0gc3RybS5uZXh0X2luO1xuICBpbnB1dCA9IHN0cm0uaW5wdXQ7XG4gIGxhc3QgPSBfaW4gKyAoc3RybS5hdmFpbF9pbiAtIDUpO1xuICBfb3V0ID0gc3RybS5uZXh0X291dDtcbiAgb3V0cHV0ID0gc3RybS5vdXRwdXQ7XG4gIGJlZyA9IF9vdXQgLSAoc3RhcnQgLSBzdHJtLmF2YWlsX291dCk7XG4gIGVuZCA9IF9vdXQgKyAoc3RybS5hdmFpbF9vdXQgLSAyNTcpO1xuLy8jaWZkZWYgSU5GTEFURV9TVFJJQ1RcbiAgZG1heCA9IHN0YXRlLmRtYXg7XG4vLyNlbmRpZlxuICB3c2l6ZSA9IHN0YXRlLndzaXplO1xuICB3aGF2ZSA9IHN0YXRlLndoYXZlO1xuICB3bmV4dCA9IHN0YXRlLnduZXh0O1xuICB3aW5kb3cgPSBzdGF0ZS53aW5kb3c7XG4gIGhvbGQgPSBzdGF0ZS5ob2xkO1xuICBiaXRzID0gc3RhdGUuYml0cztcbiAgbGNvZGUgPSBzdGF0ZS5sZW5jb2RlO1xuICBkY29kZSA9IHN0YXRlLmRpc3Rjb2RlO1xuICBsbWFzayA9ICgxIDw8IHN0YXRlLmxlbmJpdHMpIC0gMTtcbiAgZG1hc2sgPSAoMSA8PCBzdGF0ZS5kaXN0Yml0cykgLSAxO1xuXG5cbiAgLyogZGVjb2RlIGxpdGVyYWxzIGFuZCBsZW5ndGgvZGlzdGFuY2VzIHVudGlsIGVuZC1vZi1ibG9jayBvciBub3QgZW5vdWdoXG4gICAgIGlucHV0IGRhdGEgb3Igb3V0cHV0IHNwYWNlICovXG5cbiAgdG9wOlxuICBkbyB7XG4gICAgaWYgKGJpdHMgPCAxNSkge1xuICAgICAgaG9sZCArPSBpbnB1dFtfaW4rK10gPDwgYml0cztcbiAgICAgIGJpdHMgKz0gODtcbiAgICAgIGhvbGQgKz0gaW5wdXRbX2luKytdIDw8IGJpdHM7XG4gICAgICBiaXRzICs9IDg7XG4gICAgfVxuXG4gICAgaGVyZSA9IGxjb2RlW2hvbGQgJiBsbWFza107XG5cbiAgICBkb2xlbjpcbiAgICBmb3IgKDs7KSB7IC8vIEdvdG8gZW11bGF0aW9uXG4gICAgICBvcCA9IGhlcmUgPj4+IDI0LypoZXJlLmJpdHMqLztcbiAgICAgIGhvbGQgPj4+PSBvcDtcbiAgICAgIGJpdHMgLT0gb3A7XG4gICAgICBvcCA9IChoZXJlID4+PiAxNikgJiAweGZmLypoZXJlLm9wKi87XG4gICAgICBpZiAob3AgPT09IDApIHsgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGxpdGVyYWwgKi9cbiAgICAgICAgLy9UcmFjZXZ2KChzdGRlcnIsIGhlcmUudmFsID49IDB4MjAgJiYgaGVyZS52YWwgPCAweDdmID9cbiAgICAgICAgLy8gICAgICAgIFwiaW5mbGF0ZTogICAgICAgICBsaXRlcmFsICclYydcXG5cIiA6XG4gICAgICAgIC8vICAgICAgICBcImluZmxhdGU6ICAgICAgICAgbGl0ZXJhbCAweCUwMnhcXG5cIiwgaGVyZS52YWwpKTtcbiAgICAgICAgb3V0cHV0W19vdXQrK10gPSBoZXJlICYgMHhmZmZmLypoZXJlLnZhbCovO1xuICAgICAgfVxuICAgICAgZWxzZSBpZiAob3AgJiAxNikgeyAgICAgICAgICAgICAgICAgICAgIC8qIGxlbmd0aCBiYXNlICovXG4gICAgICAgIGxlbiA9IGhlcmUgJiAweGZmZmYvKmhlcmUudmFsKi87XG4gICAgICAgIG9wICY9IDE1OyAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIG51bWJlciBvZiBleHRyYSBiaXRzICovXG4gICAgICAgIGlmIChvcCkge1xuICAgICAgICAgIGlmIChiaXRzIDwgb3ApIHtcbiAgICAgICAgICAgIGhvbGQgKz0gaW5wdXRbX2luKytdIDw8IGJpdHM7XG4gICAgICAgICAgICBiaXRzICs9IDg7XG4gICAgICAgICAgfVxuICAgICAgICAgIGxlbiArPSBob2xkICYgKCgxIDw8IG9wKSAtIDEpO1xuICAgICAgICAgIGhvbGQgPj4+PSBvcDtcbiAgICAgICAgICBiaXRzIC09IG9wO1xuICAgICAgICB9XG4gICAgICAgIC8vVHJhY2V2digoc3RkZXJyLCBcImluZmxhdGU6ICAgICAgICAgbGVuZ3RoICV1XFxuXCIsIGxlbikpO1xuICAgICAgICBpZiAoYml0cyA8IDE1KSB7XG4gICAgICAgICAgaG9sZCArPSBpbnB1dFtfaW4rK10gPDwgYml0cztcbiAgICAgICAgICBiaXRzICs9IDg7XG4gICAgICAgICAgaG9sZCArPSBpbnB1dFtfaW4rK10gPDwgYml0cztcbiAgICAgICAgICBiaXRzICs9IDg7XG4gICAgICAgIH1cbiAgICAgICAgaGVyZSA9IGRjb2RlW2hvbGQgJiBkbWFza107XG5cbiAgICAgICAgZG9kaXN0OlxuICAgICAgICBmb3IgKDs7KSB7IC8vIGdvdG8gZW11bGF0aW9uXG4gICAgICAgICAgb3AgPSBoZXJlID4+PiAyNC8qaGVyZS5iaXRzKi87XG4gICAgICAgICAgaG9sZCA+Pj49IG9wO1xuICAgICAgICAgIGJpdHMgLT0gb3A7XG4gICAgICAgICAgb3AgPSAoaGVyZSA+Pj4gMTYpICYgMHhmZi8qaGVyZS5vcCovO1xuXG4gICAgICAgICAgaWYgKG9wICYgMTYpIHsgICAgICAgICAgICAgICAgICAgICAgLyogZGlzdGFuY2UgYmFzZSAqL1xuICAgICAgICAgICAgZGlzdCA9IGhlcmUgJiAweGZmZmYvKmhlcmUudmFsKi87XG4gICAgICAgICAgICBvcCAmPSAxNTsgICAgICAgICAgICAgICAgICAgICAgIC8qIG51bWJlciBvZiBleHRyYSBiaXRzICovXG4gICAgICAgICAgICBpZiAoYml0cyA8IG9wKSB7XG4gICAgICAgICAgICAgIGhvbGQgKz0gaW5wdXRbX2luKytdIDw8IGJpdHM7XG4gICAgICAgICAgICAgIGJpdHMgKz0gODtcbiAgICAgICAgICAgICAgaWYgKGJpdHMgPCBvcCkge1xuICAgICAgICAgICAgICAgIGhvbGQgKz0gaW5wdXRbX2luKytdIDw8IGJpdHM7XG4gICAgICAgICAgICAgICAgYml0cyArPSA4O1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBkaXN0ICs9IGhvbGQgJiAoKDEgPDwgb3ApIC0gMSk7XG4vLyNpZmRlZiBJTkZMQVRFX1NUUklDVFxuICAgICAgICAgICAgaWYgKGRpc3QgPiBkbWF4KSB7XG4gICAgICAgICAgICAgIHN0cm0ubXNnID0gJ2ludmFsaWQgZGlzdGFuY2UgdG9vIGZhciBiYWNrJztcbiAgICAgICAgICAgICAgc3RhdGUubW9kZSA9IEJBRDtcbiAgICAgICAgICAgICAgYnJlYWsgdG9wO1xuICAgICAgICAgICAgfVxuLy8jZW5kaWZcbiAgICAgICAgICAgIGhvbGQgPj4+PSBvcDtcbiAgICAgICAgICAgIGJpdHMgLT0gb3A7XG4gICAgICAgICAgICAvL1RyYWNldnYoKHN0ZGVyciwgXCJpbmZsYXRlOiAgICAgICAgIGRpc3RhbmNlICV1XFxuXCIsIGRpc3QpKTtcbiAgICAgICAgICAgIG9wID0gX291dCAtIGJlZzsgICAgICAgICAgICAgICAgLyogbWF4IGRpc3RhbmNlIGluIG91dHB1dCAqL1xuICAgICAgICAgICAgaWYgKGRpc3QgPiBvcCkgeyAgICAgICAgICAgICAgICAvKiBzZWUgaWYgY29weSBmcm9tIHdpbmRvdyAqL1xuICAgICAgICAgICAgICBvcCA9IGRpc3QgLSBvcDsgICAgICAgICAgICAgICAvKiBkaXN0YW5jZSBiYWNrIGluIHdpbmRvdyAqL1xuICAgICAgICAgICAgICBpZiAob3AgPiB3aGF2ZSkge1xuICAgICAgICAgICAgICAgIGlmIChzdGF0ZS5zYW5lKSB7XG4gICAgICAgICAgICAgICAgICBzdHJtLm1zZyA9ICdpbnZhbGlkIGRpc3RhbmNlIHRvbyBmYXIgYmFjayc7XG4gICAgICAgICAgICAgICAgICBzdGF0ZS5tb2RlID0gQkFEO1xuICAgICAgICAgICAgICAgICAgYnJlYWsgdG9wO1xuICAgICAgICAgICAgICAgIH1cblxuLy8gKCEpIFRoaXMgYmxvY2sgaXMgZGlzYWJsZWQgaW4gemxpYiBkZWZhaWx0cyxcbi8vIGRvbid0IGVuYWJsZSBpdCBmb3IgYmluYXJ5IGNvbXBhdGliaWxpdHlcbi8vI2lmZGVmIElORkxBVEVfQUxMT1dfSU5WQUxJRF9ESVNUQU5DRV9UT09GQVJfQVJSUlxuLy8gICAgICAgICAgICAgICAgaWYgKGxlbiA8PSBvcCAtIHdoYXZlKSB7XG4vLyAgICAgICAgICAgICAgICAgIGRvIHtcbi8vICAgICAgICAgICAgICAgICAgICBvdXRwdXRbX291dCsrXSA9IDA7XG4vLyAgICAgICAgICAgICAgICAgIH0gd2hpbGUgKC0tbGVuKTtcbi8vICAgICAgICAgICAgICAgICAgY29udGludWUgdG9wO1xuLy8gICAgICAgICAgICAgICAgfVxuLy8gICAgICAgICAgICAgICAgbGVuIC09IG9wIC0gd2hhdmU7XG4vLyAgICAgICAgICAgICAgICBkbyB7XG4vLyAgICAgICAgICAgICAgICAgIG91dHB1dFtfb3V0KytdID0gMDtcbi8vICAgICAgICAgICAgICAgIH0gd2hpbGUgKC0tb3AgPiB3aGF2ZSk7XG4vLyAgICAgICAgICAgICAgICBpZiAob3AgPT09IDApIHtcbi8vICAgICAgICAgICAgICAgICAgZnJvbSA9IF9vdXQgLSBkaXN0O1xuLy8gICAgICAgICAgICAgICAgICBkbyB7XG4vLyAgICAgICAgICAgICAgICAgICAgb3V0cHV0W19vdXQrK10gPSBvdXRwdXRbZnJvbSsrXTtcbi8vICAgICAgICAgICAgICAgICAgfSB3aGlsZSAoLS1sZW4pO1xuLy8gICAgICAgICAgICAgICAgICBjb250aW51ZSB0b3A7XG4vLyAgICAgICAgICAgICAgICB9XG4vLyNlbmRpZlxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGZyb20gPSAwOyAvLyB3aW5kb3cgaW5kZXhcbiAgICAgICAgICAgICAgZnJvbV9zb3VyY2UgPSB3aW5kb3c7XG4gICAgICAgICAgICAgIGlmICh3bmV4dCA9PT0gMCkgeyAgICAgICAgICAgLyogdmVyeSBjb21tb24gY2FzZSAqL1xuICAgICAgICAgICAgICAgIGZyb20gKz0gd3NpemUgLSBvcDtcbiAgICAgICAgICAgICAgICBpZiAob3AgPCBsZW4pIHsgICAgICAgICAvKiBzb21lIGZyb20gd2luZG93ICovXG4gICAgICAgICAgICAgICAgICBsZW4gLT0gb3A7XG4gICAgICAgICAgICAgICAgICBkbyB7XG4gICAgICAgICAgICAgICAgICAgIG91dHB1dFtfb3V0KytdID0gd2luZG93W2Zyb20rK107XG4gICAgICAgICAgICAgICAgICB9IHdoaWxlICgtLW9wKTtcbiAgICAgICAgICAgICAgICAgIGZyb20gPSBfb3V0IC0gZGlzdDsgIC8qIHJlc3QgZnJvbSBvdXRwdXQgKi9cbiAgICAgICAgICAgICAgICAgIGZyb21fc291cmNlID0gb3V0cHV0O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBlbHNlIGlmICh3bmV4dCA8IG9wKSB7ICAgICAgLyogd3JhcCBhcm91bmQgd2luZG93ICovXG4gICAgICAgICAgICAgICAgZnJvbSArPSB3c2l6ZSArIHduZXh0IC0gb3A7XG4gICAgICAgICAgICAgICAgb3AgLT0gd25leHQ7XG4gICAgICAgICAgICAgICAgaWYgKG9wIDwgbGVuKSB7ICAgICAgICAgLyogc29tZSBmcm9tIGVuZCBvZiB3aW5kb3cgKi9cbiAgICAgICAgICAgICAgICAgIGxlbiAtPSBvcDtcbiAgICAgICAgICAgICAgICAgIGRvIHtcbiAgICAgICAgICAgICAgICAgICAgb3V0cHV0W19vdXQrK10gPSB3aW5kb3dbZnJvbSsrXTtcbiAgICAgICAgICAgICAgICAgIH0gd2hpbGUgKC0tb3ApO1xuICAgICAgICAgICAgICAgICAgZnJvbSA9IDA7XG4gICAgICAgICAgICAgICAgICBpZiAod25leHQgPCBsZW4pIHsgIC8qIHNvbWUgZnJvbSBzdGFydCBvZiB3aW5kb3cgKi9cbiAgICAgICAgICAgICAgICAgICAgb3AgPSB3bmV4dDtcbiAgICAgICAgICAgICAgICAgICAgbGVuIC09IG9wO1xuICAgICAgICAgICAgICAgICAgICBkbyB7XG4gICAgICAgICAgICAgICAgICAgICAgb3V0cHV0W19vdXQrK10gPSB3aW5kb3dbZnJvbSsrXTtcbiAgICAgICAgICAgICAgICAgICAgfSB3aGlsZSAoLS1vcCk7XG4gICAgICAgICAgICAgICAgICAgIGZyb20gPSBfb3V0IC0gZGlzdDsgICAgICAvKiByZXN0IGZyb20gb3V0cHV0ICovXG4gICAgICAgICAgICAgICAgICAgIGZyb21fc291cmNlID0gb3V0cHV0O1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBlbHNlIHsgICAgICAgICAgICAgICAgICAgICAgLyogY29udGlndW91cyBpbiB3aW5kb3cgKi9cbiAgICAgICAgICAgICAgICBmcm9tICs9IHduZXh0IC0gb3A7XG4gICAgICAgICAgICAgICAgaWYgKG9wIDwgbGVuKSB7ICAgICAgICAgLyogc29tZSBmcm9tIHdpbmRvdyAqL1xuICAgICAgICAgICAgICAgICAgbGVuIC09IG9wO1xuICAgICAgICAgICAgICAgICAgZG8ge1xuICAgICAgICAgICAgICAgICAgICBvdXRwdXRbX291dCsrXSA9IHdpbmRvd1tmcm9tKytdO1xuICAgICAgICAgICAgICAgICAgfSB3aGlsZSAoLS1vcCk7XG4gICAgICAgICAgICAgICAgICBmcm9tID0gX291dCAtIGRpc3Q7ICAvKiByZXN0IGZyb20gb3V0cHV0ICovXG4gICAgICAgICAgICAgICAgICBmcm9tX3NvdXJjZSA9IG91dHB1dDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgd2hpbGUgKGxlbiA+IDIpIHtcbiAgICAgICAgICAgICAgICBvdXRwdXRbX291dCsrXSA9IGZyb21fc291cmNlW2Zyb20rK107XG4gICAgICAgICAgICAgICAgb3V0cHV0W19vdXQrK10gPSBmcm9tX3NvdXJjZVtmcm9tKytdO1xuICAgICAgICAgICAgICAgIG91dHB1dFtfb3V0KytdID0gZnJvbV9zb3VyY2VbZnJvbSsrXTtcbiAgICAgICAgICAgICAgICBsZW4gLT0gMztcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBpZiAobGVuKSB7XG4gICAgICAgICAgICAgICAgb3V0cHV0W19vdXQrK10gPSBmcm9tX3NvdXJjZVtmcm9tKytdO1xuICAgICAgICAgICAgICAgIGlmIChsZW4gPiAxKSB7XG4gICAgICAgICAgICAgICAgICBvdXRwdXRbX291dCsrXSA9IGZyb21fc291cmNlW2Zyb20rK107XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgZnJvbSA9IF9vdXQgLSBkaXN0OyAgICAgICAgICAvKiBjb3B5IGRpcmVjdCBmcm9tIG91dHB1dCAqL1xuICAgICAgICAgICAgICBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgLyogbWluaW11bSBsZW5ndGggaXMgdGhyZWUgKi9cbiAgICAgICAgICAgICAgICBvdXRwdXRbX291dCsrXSA9IG91dHB1dFtmcm9tKytdO1xuICAgICAgICAgICAgICAgIG91dHB1dFtfb3V0KytdID0gb3V0cHV0W2Zyb20rK107XG4gICAgICAgICAgICAgICAgb3V0cHV0W19vdXQrK10gPSBvdXRwdXRbZnJvbSsrXTtcbiAgICAgICAgICAgICAgICBsZW4gLT0gMztcbiAgICAgICAgICAgICAgfSB3aGlsZSAobGVuID4gMik7XG4gICAgICAgICAgICAgIGlmIChsZW4pIHtcbiAgICAgICAgICAgICAgICBvdXRwdXRbX291dCsrXSA9IG91dHB1dFtmcm9tKytdO1xuICAgICAgICAgICAgICAgIGlmIChsZW4gPiAxKSB7XG4gICAgICAgICAgICAgICAgICBvdXRwdXRbX291dCsrXSA9IG91dHB1dFtmcm9tKytdO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBlbHNlIGlmICgob3AgJiA2NCkgPT09IDApIHsgICAgICAgICAgLyogMm5kIGxldmVsIGRpc3RhbmNlIGNvZGUgKi9cbiAgICAgICAgICAgIGhlcmUgPSBkY29kZVsoaGVyZSAmIDB4ZmZmZikvKmhlcmUudmFsKi8gKyAoaG9sZCAmICgoMSA8PCBvcCkgLSAxKSldO1xuICAgICAgICAgICAgY29udGludWUgZG9kaXN0O1xuICAgICAgICAgIH1cbiAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHN0cm0ubXNnID0gJ2ludmFsaWQgZGlzdGFuY2UgY29kZSc7XG4gICAgICAgICAgICBzdGF0ZS5tb2RlID0gQkFEO1xuICAgICAgICAgICAgYnJlYWsgdG9wO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGJyZWFrOyAvLyBuZWVkIHRvIGVtdWxhdGUgZ290byB2aWEgXCJjb250aW51ZVwiXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGVsc2UgaWYgKChvcCAmIDY0KSA9PT0gMCkgeyAgICAgICAgICAgICAgLyogMm5kIGxldmVsIGxlbmd0aCBjb2RlICovXG4gICAgICAgIGhlcmUgPSBsY29kZVsoaGVyZSAmIDB4ZmZmZikvKmhlcmUudmFsKi8gKyAoaG9sZCAmICgoMSA8PCBvcCkgLSAxKSldO1xuICAgICAgICBjb250aW51ZSBkb2xlbjtcbiAgICAgIH1cbiAgICAgIGVsc2UgaWYgKG9wICYgMzIpIHsgICAgICAgICAgICAgICAgICAgICAvKiBlbmQtb2YtYmxvY2sgKi9cbiAgICAgICAgLy9UcmFjZXZ2KChzdGRlcnIsIFwiaW5mbGF0ZTogICAgICAgICBlbmQgb2YgYmxvY2tcXG5cIikpO1xuICAgICAgICBzdGF0ZS5tb2RlID0gVFlQRTtcbiAgICAgICAgYnJlYWsgdG9wO1xuICAgICAgfVxuICAgICAgZWxzZSB7XG4gICAgICAgIHN0cm0ubXNnID0gJ2ludmFsaWQgbGl0ZXJhbC9sZW5ndGggY29kZSc7XG4gICAgICAgIHN0YXRlLm1vZGUgPSBCQUQ7XG4gICAgICAgIGJyZWFrIHRvcDtcbiAgICAgIH1cblxuICAgICAgYnJlYWs7IC8vIG5lZWQgdG8gZW11bGF0ZSBnb3RvIHZpYSBcImNvbnRpbnVlXCJcbiAgICB9XG4gIH0gd2hpbGUgKF9pbiA8IGxhc3QgJiYgX291dCA8IGVuZCk7XG5cbiAgLyogcmV0dXJuIHVudXNlZCBieXRlcyAob24gZW50cnksIGJpdHMgPCA4LCBzbyBpbiB3b24ndCBnbyB0b28gZmFyIGJhY2spICovXG4gIGxlbiA9IGJpdHMgPj4gMztcbiAgX2luIC09IGxlbjtcbiAgYml0cyAtPSBsZW4gPDwgMztcbiAgaG9sZCAmPSAoMSA8PCBiaXRzKSAtIDE7XG5cbiAgLyogdXBkYXRlIHN0YXRlIGFuZCByZXR1cm4gKi9cbiAgc3RybS5uZXh0X2luID0gX2luO1xuICBzdHJtLm5leHRfb3V0ID0gX291dDtcbiAgc3RybS5hdmFpbF9pbiA9IChfaW4gPCBsYXN0ID8gNSArIChsYXN0IC0gX2luKSA6IDUgLSAoX2luIC0gbGFzdCkpO1xuICBzdHJtLmF2YWlsX291dCA9IChfb3V0IDwgZW5kID8gMjU3ICsgKGVuZCAtIF9vdXQpIDogMjU3IC0gKF9vdXQgLSBlbmQpKTtcbiAgc3RhdGUuaG9sZCA9IGhvbGQ7XG4gIHN0YXRlLmJpdHMgPSBiaXRzO1xuICByZXR1cm47XG59O1xuXG59LHt9XSwzNTpbZnVuY3Rpb24oX2RlcmVxXyxtb2R1bGUsZXhwb3J0cyl7XG4ndXNlIHN0cmljdCc7XG5cblxudmFyIHV0aWxzID0gX2RlcmVxXygnLi4vdXRpbHMvY29tbW9uJyk7XG52YXIgYWRsZXIzMiA9IF9kZXJlcV8oJy4vYWRsZXIzMicpO1xudmFyIGNyYzMyICAgPSBfZGVyZXFfKCcuL2NyYzMyJyk7XG52YXIgaW5mbGF0ZV9mYXN0ID0gX2RlcmVxXygnLi9pbmZmYXN0Jyk7XG52YXIgaW5mbGF0ZV90YWJsZSA9IF9kZXJlcV8oJy4vaW5mdHJlZXMnKTtcblxudmFyIENPREVTID0gMDtcbnZhciBMRU5TID0gMTtcbnZhciBESVNUUyA9IDI7XG5cbi8qIFB1YmxpYyBjb25zdGFudHMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovXG4vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qL1xuXG5cbi8qIEFsbG93ZWQgZmx1c2ggdmFsdWVzOyBzZWUgZGVmbGF0ZSgpIGFuZCBpbmZsYXRlKCkgYmVsb3cgZm9yIGRldGFpbHMgKi9cbi8vdmFyIFpfTk9fRkxVU0ggICAgICA9IDA7XG4vL3ZhciBaX1BBUlRJQUxfRkxVU0ggPSAxO1xuLy92YXIgWl9TWU5DX0ZMVVNIICAgID0gMjtcbi8vdmFyIFpfRlVMTF9GTFVTSCAgICA9IDM7XG52YXIgWl9GSU5JU0ggICAgICAgID0gNDtcbnZhciBaX0JMT0NLICAgICAgICAgPSA1O1xudmFyIFpfVFJFRVMgICAgICAgICA9IDY7XG5cblxuLyogUmV0dXJuIGNvZGVzIGZvciB0aGUgY29tcHJlc3Npb24vZGVjb21wcmVzc2lvbiBmdW5jdGlvbnMuIE5lZ2F0aXZlIHZhbHVlc1xuICogYXJlIGVycm9ycywgcG9zaXRpdmUgdmFsdWVzIGFyZSB1c2VkIGZvciBzcGVjaWFsIGJ1dCBub3JtYWwgZXZlbnRzLlxuICovXG52YXIgWl9PSyAgICAgICAgICAgID0gMDtcbnZhciBaX1NUUkVBTV9FTkQgICAgPSAxO1xudmFyIFpfTkVFRF9ESUNUICAgICA9IDI7XG4vL3ZhciBaX0VSUk5PICAgICAgICAgPSAtMTtcbnZhciBaX1NUUkVBTV9FUlJPUiAgPSAtMjtcbnZhciBaX0RBVEFfRVJST1IgICAgPSAtMztcbnZhciBaX01FTV9FUlJPUiAgICAgPSAtNDtcbnZhciBaX0JVRl9FUlJPUiAgICAgPSAtNTtcbi8vdmFyIFpfVkVSU0lPTl9FUlJPUiA9IC02O1xuXG4vKiBUaGUgZGVmbGF0ZSBjb21wcmVzc2lvbiBtZXRob2QgKi9cbnZhciBaX0RFRkxBVEVEICA9IDg7XG5cblxuLyogU1RBVEVTID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki9cbi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovXG5cblxudmFyICAgIEhFQUQgPSAxOyAgICAgICAvKiBpOiB3YWl0aW5nIGZvciBtYWdpYyBoZWFkZXIgKi9cbnZhciAgICBGTEFHUyA9IDI7ICAgICAgLyogaTogd2FpdGluZyBmb3IgbWV0aG9kIGFuZCBmbGFncyAoZ3ppcCkgKi9cbnZhciAgICBUSU1FID0gMzsgICAgICAgLyogaTogd2FpdGluZyBmb3IgbW9kaWZpY2F0aW9uIHRpbWUgKGd6aXApICovXG52YXIgICAgT1MgPSA0OyAgICAgICAgIC8qIGk6IHdhaXRpbmcgZm9yIGV4dHJhIGZsYWdzIGFuZCBvcGVyYXRpbmcgc3lzdGVtIChnemlwKSAqL1xudmFyICAgIEVYTEVOID0gNTsgICAgICAvKiBpOiB3YWl0aW5nIGZvciBleHRyYSBsZW5ndGggKGd6aXApICovXG52YXIgICAgRVhUUkEgPSA2OyAgICAgIC8qIGk6IHdhaXRpbmcgZm9yIGV4dHJhIGJ5dGVzIChnemlwKSAqL1xudmFyICAgIE5BTUUgPSA3OyAgICAgICAvKiBpOiB3YWl0aW5nIGZvciBlbmQgb2YgZmlsZSBuYW1lIChnemlwKSAqL1xudmFyICAgIENPTU1FTlQgPSA4OyAgICAvKiBpOiB3YWl0aW5nIGZvciBlbmQgb2YgY29tbWVudCAoZ3ppcCkgKi9cbnZhciAgICBIQ1JDID0gOTsgICAgICAgLyogaTogd2FpdGluZyBmb3IgaGVhZGVyIGNyYyAoZ3ppcCkgKi9cbnZhciAgICBESUNUSUQgPSAxMDsgICAgLyogaTogd2FpdGluZyBmb3IgZGljdGlvbmFyeSBjaGVjayB2YWx1ZSAqL1xudmFyICAgIERJQ1QgPSAxMTsgICAgICAvKiB3YWl0aW5nIGZvciBpbmZsYXRlU2V0RGljdGlvbmFyeSgpIGNhbGwgKi9cbnZhciAgICAgICAgVFlQRSA9IDEyOyAgICAgIC8qIGk6IHdhaXRpbmcgZm9yIHR5cGUgYml0cywgaW5jbHVkaW5nIGxhc3QtZmxhZyBiaXQgKi9cbnZhciAgICAgICAgVFlQRURPID0gMTM7ICAgIC8qIGk6IHNhbWUsIGJ1dCBza2lwIGNoZWNrIHRvIGV4aXQgaW5mbGF0ZSBvbiBuZXcgYmxvY2sgKi9cbnZhciAgICAgICAgU1RPUkVEID0gMTQ7ICAgIC8qIGk6IHdhaXRpbmcgZm9yIHN0b3JlZCBzaXplIChsZW5ndGggYW5kIGNvbXBsZW1lbnQpICovXG52YXIgICAgICAgIENPUFlfID0gMTU7ICAgICAvKiBpL286IHNhbWUgYXMgQ09QWSBiZWxvdywgYnV0IG9ubHkgZmlyc3QgdGltZSBpbiAqL1xudmFyICAgICAgICBDT1BZID0gMTY7ICAgICAgLyogaS9vOiB3YWl0aW5nIGZvciBpbnB1dCBvciBvdXRwdXQgdG8gY29weSBzdG9yZWQgYmxvY2sgKi9cbnZhciAgICAgICAgVEFCTEUgPSAxNzsgICAgIC8qIGk6IHdhaXRpbmcgZm9yIGR5bmFtaWMgYmxvY2sgdGFibGUgbGVuZ3RocyAqL1xudmFyICAgICAgICBMRU5MRU5TID0gMTg7ICAgLyogaTogd2FpdGluZyBmb3IgY29kZSBsZW5ndGggY29kZSBsZW5ndGhzICovXG52YXIgICAgICAgIENPREVMRU5TID0gMTk7ICAvKiBpOiB3YWl0aW5nIGZvciBsZW5ndGgvbGl0IGFuZCBkaXN0YW5jZSBjb2RlIGxlbmd0aHMgKi9cbnZhciAgICAgICAgICAgIExFTl8gPSAyMDsgICAgICAvKiBpOiBzYW1lIGFzIExFTiBiZWxvdywgYnV0IG9ubHkgZmlyc3QgdGltZSBpbiAqL1xudmFyICAgICAgICAgICAgTEVOID0gMjE7ICAgICAgIC8qIGk6IHdhaXRpbmcgZm9yIGxlbmd0aC9saXQvZW9iIGNvZGUgKi9cbnZhciAgICAgICAgICAgIExFTkVYVCA9IDIyOyAgICAvKiBpOiB3YWl0aW5nIGZvciBsZW5ndGggZXh0cmEgYml0cyAqL1xudmFyICAgICAgICAgICAgRElTVCA9IDIzOyAgICAgIC8qIGk6IHdhaXRpbmcgZm9yIGRpc3RhbmNlIGNvZGUgKi9cbnZhciAgICAgICAgICAgIERJU1RFWFQgPSAyNDsgICAvKiBpOiB3YWl0aW5nIGZvciBkaXN0YW5jZSBleHRyYSBiaXRzICovXG52YXIgICAgICAgICAgICBNQVRDSCA9IDI1OyAgICAgLyogbzogd2FpdGluZyBmb3Igb3V0cHV0IHNwYWNlIHRvIGNvcHkgc3RyaW5nICovXG52YXIgICAgICAgICAgICBMSVQgPSAyNjsgICAgICAgLyogbzogd2FpdGluZyBmb3Igb3V0cHV0IHNwYWNlIHRvIHdyaXRlIGxpdGVyYWwgKi9cbnZhciAgICBDSEVDSyA9IDI3OyAgICAgLyogaTogd2FpdGluZyBmb3IgMzItYml0IGNoZWNrIHZhbHVlICovXG52YXIgICAgTEVOR1RIID0gMjg7ICAgIC8qIGk6IHdhaXRpbmcgZm9yIDMyLWJpdCBsZW5ndGggKGd6aXApICovXG52YXIgICAgRE9ORSA9IDI5OyAgICAgIC8qIGZpbmlzaGVkIGNoZWNrLCBkb25lIC0tIHJlbWFpbiBoZXJlIHVudGlsIHJlc2V0ICovXG52YXIgICAgQkFEID0gMzA7ICAgICAgIC8qIGdvdCBhIGRhdGEgZXJyb3IgLS0gcmVtYWluIGhlcmUgdW50aWwgcmVzZXQgKi9cbnZhciAgICBNRU0gPSAzMTsgICAgICAgLyogZ290IGFuIGluZmxhdGUoKSBtZW1vcnkgZXJyb3IgLS0gcmVtYWluIGhlcmUgdW50aWwgcmVzZXQgKi9cbnZhciAgICBTWU5DID0gMzI7ICAgICAgLyogbG9va2luZyBmb3Igc3luY2hyb25pemF0aW9uIGJ5dGVzIHRvIHJlc3RhcnQgaW5mbGF0ZSgpICovXG5cbi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovXG5cblxuXG52YXIgRU5PVUdIX0xFTlMgPSA4NTI7XG52YXIgRU5PVUdIX0RJU1RTID0gNTkyO1xuLy92YXIgRU5PVUdIID0gIChFTk9VR0hfTEVOUytFTk9VR0hfRElTVFMpO1xuXG52YXIgTUFYX1dCSVRTID0gMTU7XG4vKiAzMksgTFo3NyB3aW5kb3cgKi9cbnZhciBERUZfV0JJVFMgPSBNQVhfV0JJVFM7XG5cblxuZnVuY3Rpb24gWlNXQVAzMihxKSB7XG4gIHJldHVybiAgKCgocSA+Pj4gMjQpICYgMHhmZikgK1xuICAgICAgICAgICgocSA+Pj4gOCkgJiAweGZmMDApICtcbiAgICAgICAgICAoKHEgJiAweGZmMDApIDw8IDgpICtcbiAgICAgICAgICAoKHEgJiAweGZmKSA8PCAyNCkpO1xufVxuXG5cbmZ1bmN0aW9uIEluZmxhdGVTdGF0ZSgpIHtcbiAgdGhpcy5tb2RlID0gMDsgICAgICAgICAgICAgLyogY3VycmVudCBpbmZsYXRlIG1vZGUgKi9cbiAgdGhpcy5sYXN0ID0gZmFsc2U7ICAgICAgICAgIC8qIHRydWUgaWYgcHJvY2Vzc2luZyBsYXN0IGJsb2NrICovXG4gIHRoaXMud3JhcCA9IDA7ICAgICAgICAgICAgICAvKiBiaXQgMCB0cnVlIGZvciB6bGliLCBiaXQgMSB0cnVlIGZvciBnemlwICovXG4gIHRoaXMuaGF2ZWRpY3QgPSBmYWxzZTsgICAgICAvKiB0cnVlIGlmIGRpY3Rpb25hcnkgcHJvdmlkZWQgKi9cbiAgdGhpcy5mbGFncyA9IDA7ICAgICAgICAgICAgIC8qIGd6aXAgaGVhZGVyIG1ldGhvZCBhbmQgZmxhZ3MgKDAgaWYgemxpYikgKi9cbiAgdGhpcy5kbWF4ID0gMDsgICAgICAgICAgICAgIC8qIHpsaWIgaGVhZGVyIG1heCBkaXN0YW5jZSAoSU5GTEFURV9TVFJJQ1QpICovXG4gIHRoaXMuY2hlY2sgPSAwOyAgICAgICAgICAgICAvKiBwcm90ZWN0ZWQgY29weSBvZiBjaGVjayB2YWx1ZSAqL1xuICB0aGlzLnRvdGFsID0gMDsgICAgICAgICAgICAgLyogcHJvdGVjdGVkIGNvcHkgb2Ygb3V0cHV0IGNvdW50ICovXG4gIC8vIFRPRE86IG1heSBiZSB7fVxuICB0aGlzLmhlYWQgPSBudWxsOyAgICAgICAgICAgLyogd2hlcmUgdG8gc2F2ZSBnemlwIGhlYWRlciBpbmZvcm1hdGlvbiAqL1xuXG4gIC8qIHNsaWRpbmcgd2luZG93ICovXG4gIHRoaXMud2JpdHMgPSAwOyAgICAgICAgICAgICAvKiBsb2cgYmFzZSAyIG9mIHJlcXVlc3RlZCB3aW5kb3cgc2l6ZSAqL1xuICB0aGlzLndzaXplID0gMDsgICAgICAgICAgICAgLyogd2luZG93IHNpemUgb3IgemVybyBpZiBub3QgdXNpbmcgd2luZG93ICovXG4gIHRoaXMud2hhdmUgPSAwOyAgICAgICAgICAgICAvKiB2YWxpZCBieXRlcyBpbiB0aGUgd2luZG93ICovXG4gIHRoaXMud25leHQgPSAwOyAgICAgICAgICAgICAvKiB3aW5kb3cgd3JpdGUgaW5kZXggKi9cbiAgdGhpcy53aW5kb3cgPSBudWxsOyAgICAgICAgIC8qIGFsbG9jYXRlZCBzbGlkaW5nIHdpbmRvdywgaWYgbmVlZGVkICovXG5cbiAgLyogYml0IGFjY3VtdWxhdG9yICovXG4gIHRoaXMuaG9sZCA9IDA7ICAgICAgICAgICAgICAvKiBpbnB1dCBiaXQgYWNjdW11bGF0b3IgKi9cbiAgdGhpcy5iaXRzID0gMDsgICAgICAgICAgICAgIC8qIG51bWJlciBvZiBiaXRzIGluIFwiaW5cIiAqL1xuXG4gIC8qIGZvciBzdHJpbmcgYW5kIHN0b3JlZCBibG9jayBjb3B5aW5nICovXG4gIHRoaXMubGVuZ3RoID0gMDsgICAgICAgICAgICAvKiBsaXRlcmFsIG9yIGxlbmd0aCBvZiBkYXRhIHRvIGNvcHkgKi9cbiAgdGhpcy5vZmZzZXQgPSAwOyAgICAgICAgICAgIC8qIGRpc3RhbmNlIGJhY2sgdG8gY29weSBzdHJpbmcgZnJvbSAqL1xuXG4gIC8qIGZvciB0YWJsZSBhbmQgY29kZSBkZWNvZGluZyAqL1xuICB0aGlzLmV4dHJhID0gMDsgICAgICAgICAgICAgLyogZXh0cmEgYml0cyBuZWVkZWQgKi9cblxuICAvKiBmaXhlZCBhbmQgZHluYW1pYyBjb2RlIHRhYmxlcyAqL1xuICB0aGlzLmxlbmNvZGUgPSBudWxsOyAgICAgICAgICAvKiBzdGFydGluZyB0YWJsZSBmb3IgbGVuZ3RoL2xpdGVyYWwgY29kZXMgKi9cbiAgdGhpcy5kaXN0Y29kZSA9IG51bGw7ICAgICAgICAgLyogc3RhcnRpbmcgdGFibGUgZm9yIGRpc3RhbmNlIGNvZGVzICovXG4gIHRoaXMubGVuYml0cyA9IDA7ICAgICAgICAgICAvKiBpbmRleCBiaXRzIGZvciBsZW5jb2RlICovXG4gIHRoaXMuZGlzdGJpdHMgPSAwOyAgICAgICAgICAvKiBpbmRleCBiaXRzIGZvciBkaXN0Y29kZSAqL1xuXG4gIC8qIGR5bmFtaWMgdGFibGUgYnVpbGRpbmcgKi9cbiAgdGhpcy5uY29kZSA9IDA7ICAgICAgICAgICAgIC8qIG51bWJlciBvZiBjb2RlIGxlbmd0aCBjb2RlIGxlbmd0aHMgKi9cbiAgdGhpcy5ubGVuID0gMDsgICAgICAgICAgICAgIC8qIG51bWJlciBvZiBsZW5ndGggY29kZSBsZW5ndGhzICovXG4gIHRoaXMubmRpc3QgPSAwOyAgICAgICAgICAgICAvKiBudW1iZXIgb2YgZGlzdGFuY2UgY29kZSBsZW5ndGhzICovXG4gIHRoaXMuaGF2ZSA9IDA7ICAgICAgICAgICAgICAvKiBudW1iZXIgb2YgY29kZSBsZW5ndGhzIGluIGxlbnNbXSAqL1xuICB0aGlzLm5leHQgPSBudWxsOyAgICAgICAgICAgICAgLyogbmV4dCBhdmFpbGFibGUgc3BhY2UgaW4gY29kZXNbXSAqL1xuXG4gIHRoaXMubGVucyA9IG5ldyB1dGlscy5CdWYxNigzMjApOyAvKiB0ZW1wb3Jhcnkgc3RvcmFnZSBmb3IgY29kZSBsZW5ndGhzICovXG4gIHRoaXMud29yayA9IG5ldyB1dGlscy5CdWYxNigyODgpOyAvKiB3b3JrIGFyZWEgZm9yIGNvZGUgdGFibGUgYnVpbGRpbmcgKi9cblxuICAvKlxuICAgYmVjYXVzZSB3ZSBkb24ndCBoYXZlIHBvaW50ZXJzIGluIGpzLCB3ZSB1c2UgbGVuY29kZSBhbmQgZGlzdGNvZGUgZGlyZWN0bHlcbiAgIGFzIGJ1ZmZlcnMgc28gd2UgZG9uJ3QgbmVlZCBjb2Rlc1xuICAqL1xuICAvL3RoaXMuY29kZXMgPSBuZXcgdXRpbHMuQnVmMzIoRU5PVUdIKTsgICAgICAgLyogc3BhY2UgZm9yIGNvZGUgdGFibGVzICovXG4gIHRoaXMubGVuZHluID0gbnVsbDsgICAgICAgICAgICAgIC8qIGR5bmFtaWMgdGFibGUgZm9yIGxlbmd0aC9saXRlcmFsIGNvZGVzIChKUyBzcGVjaWZpYykgKi9cbiAgdGhpcy5kaXN0ZHluID0gbnVsbDsgICAgICAgICAgICAgLyogZHluYW1pYyB0YWJsZSBmb3IgZGlzdGFuY2UgY29kZXMgKEpTIHNwZWNpZmljKSAqL1xuICB0aGlzLnNhbmUgPSAwOyAgICAgICAgICAgICAgICAgICAvKiBpZiBmYWxzZSwgYWxsb3cgaW52YWxpZCBkaXN0YW5jZSB0b28gZmFyICovXG4gIHRoaXMuYmFjayA9IDA7ICAgICAgICAgICAgICAgICAgIC8qIGJpdHMgYmFjayBvZiBsYXN0IHVucHJvY2Vzc2VkIGxlbmd0aC9saXQgKi9cbiAgdGhpcy53YXMgPSAwOyAgICAgICAgICAgICAgICAgICAgLyogaW5pdGlhbCBsZW5ndGggb2YgbWF0Y2ggKi9cbn1cblxuZnVuY3Rpb24gaW5mbGF0ZVJlc2V0S2VlcChzdHJtKSB7XG4gIHZhciBzdGF0ZTtcblxuICBpZiAoIXN0cm0gfHwgIXN0cm0uc3RhdGUpIHsgcmV0dXJuIFpfU1RSRUFNX0VSUk9SOyB9XG4gIHN0YXRlID0gc3RybS5zdGF0ZTtcbiAgc3RybS50b3RhbF9pbiA9IHN0cm0udG90YWxfb3V0ID0gc3RhdGUudG90YWwgPSAwO1xuICBzdHJtLm1zZyA9ICcnOyAvKlpfTlVMTCovXG4gIGlmIChzdGF0ZS53cmFwKSB7ICAgICAgIC8qIHRvIHN1cHBvcnQgaWxsLWNvbmNlaXZlZCBKYXZhIHRlc3Qgc3VpdGUgKi9cbiAgICBzdHJtLmFkbGVyID0gc3RhdGUud3JhcCAmIDE7XG4gIH1cbiAgc3RhdGUubW9kZSA9IEhFQUQ7XG4gIHN0YXRlLmxhc3QgPSAwO1xuICBzdGF0ZS5oYXZlZGljdCA9IDA7XG4gIHN0YXRlLmRtYXggPSAzMjc2ODtcbiAgc3RhdGUuaGVhZCA9IG51bGwvKlpfTlVMTCovO1xuICBzdGF0ZS5ob2xkID0gMDtcbiAgc3RhdGUuYml0cyA9IDA7XG4gIC8vc3RhdGUubGVuY29kZSA9IHN0YXRlLmRpc3Rjb2RlID0gc3RhdGUubmV4dCA9IHN0YXRlLmNvZGVzO1xuICBzdGF0ZS5sZW5jb2RlID0gc3RhdGUubGVuZHluID0gbmV3IHV0aWxzLkJ1ZjMyKEVOT1VHSF9MRU5TKTtcbiAgc3RhdGUuZGlzdGNvZGUgPSBzdGF0ZS5kaXN0ZHluID0gbmV3IHV0aWxzLkJ1ZjMyKEVOT1VHSF9ESVNUUyk7XG5cbiAgc3RhdGUuc2FuZSA9IDE7XG4gIHN0YXRlLmJhY2sgPSAtMTtcbiAgLy9UcmFjZXYoKHN0ZGVyciwgXCJpbmZsYXRlOiByZXNldFxcblwiKSk7XG4gIHJldHVybiBaX09LO1xufVxuXG5mdW5jdGlvbiBpbmZsYXRlUmVzZXQoc3RybSkge1xuICB2YXIgc3RhdGU7XG5cbiAgaWYgKCFzdHJtIHx8ICFzdHJtLnN0YXRlKSB7IHJldHVybiBaX1NUUkVBTV9FUlJPUjsgfVxuICBzdGF0ZSA9IHN0cm0uc3RhdGU7XG4gIHN0YXRlLndzaXplID0gMDtcbiAgc3RhdGUud2hhdmUgPSAwO1xuICBzdGF0ZS53bmV4dCA9IDA7XG4gIHJldHVybiBpbmZsYXRlUmVzZXRLZWVwKHN0cm0pO1xuXG59XG5cbmZ1bmN0aW9uIGluZmxhdGVSZXNldDIoc3RybSwgd2luZG93Qml0cykge1xuICB2YXIgd3JhcDtcbiAgdmFyIHN0YXRlO1xuXG4gIC8qIGdldCB0aGUgc3RhdGUgKi9cbiAgaWYgKCFzdHJtIHx8ICFzdHJtLnN0YXRlKSB7IHJldHVybiBaX1NUUkVBTV9FUlJPUjsgfVxuICBzdGF0ZSA9IHN0cm0uc3RhdGU7XG5cbiAgLyogZXh0cmFjdCB3cmFwIHJlcXVlc3QgZnJvbSB3aW5kb3dCaXRzIHBhcmFtZXRlciAqL1xuICBpZiAod2luZG93Qml0cyA8IDApIHtcbiAgICB3cmFwID0gMDtcbiAgICB3aW5kb3dCaXRzID0gLXdpbmRvd0JpdHM7XG4gIH1cbiAgZWxzZSB7XG4gICAgd3JhcCA9ICh3aW5kb3dCaXRzID4+IDQpICsgMTtcbiAgICBpZiAod2luZG93Qml0cyA8IDQ4KSB7XG4gICAgICB3aW5kb3dCaXRzICY9IDE1O1xuICAgIH1cbiAgfVxuXG4gIC8qIHNldCBudW1iZXIgb2Ygd2luZG93IGJpdHMsIGZyZWUgd2luZG93IGlmIGRpZmZlcmVudCAqL1xuICBpZiAod2luZG93Qml0cyAmJiAod2luZG93Qml0cyA8IDggfHwgd2luZG93Qml0cyA+IDE1KSkge1xuICAgIHJldHVybiBaX1NUUkVBTV9FUlJPUjtcbiAgfVxuICBpZiAoc3RhdGUud2luZG93ICE9PSBudWxsICYmIHN0YXRlLndiaXRzICE9PSB3aW5kb3dCaXRzKSB7XG4gICAgc3RhdGUud2luZG93ID0gbnVsbDtcbiAgfVxuXG4gIC8qIHVwZGF0ZSBzdGF0ZSBhbmQgcmVzZXQgdGhlIHJlc3Qgb2YgaXQgKi9cbiAgc3RhdGUud3JhcCA9IHdyYXA7XG4gIHN0YXRlLndiaXRzID0gd2luZG93Qml0cztcbiAgcmV0dXJuIGluZmxhdGVSZXNldChzdHJtKTtcbn1cblxuZnVuY3Rpb24gaW5mbGF0ZUluaXQyKHN0cm0sIHdpbmRvd0JpdHMpIHtcbiAgdmFyIHJldDtcbiAgdmFyIHN0YXRlO1xuXG4gIGlmICghc3RybSkgeyByZXR1cm4gWl9TVFJFQU1fRVJST1I7IH1cbiAgLy9zdHJtLm1zZyA9IFpfTlVMTDsgICAgICAgICAgICAgICAgIC8qIGluIGNhc2Ugd2UgcmV0dXJuIGFuIGVycm9yICovXG5cbiAgc3RhdGUgPSBuZXcgSW5mbGF0ZVN0YXRlKCk7XG5cbiAgLy9pZiAoc3RhdGUgPT09IFpfTlVMTCkgcmV0dXJuIFpfTUVNX0VSUk9SO1xuICAvL1RyYWNldigoc3RkZXJyLCBcImluZmxhdGU6IGFsbG9jYXRlZFxcblwiKSk7XG4gIHN0cm0uc3RhdGUgPSBzdGF0ZTtcbiAgc3RhdGUud2luZG93ID0gbnVsbC8qWl9OVUxMKi87XG4gIHJldCA9IGluZmxhdGVSZXNldDIoc3RybSwgd2luZG93Qml0cyk7XG4gIGlmIChyZXQgIT09IFpfT0spIHtcbiAgICBzdHJtLnN0YXRlID0gbnVsbC8qWl9OVUxMKi87XG4gIH1cbiAgcmV0dXJuIHJldDtcbn1cblxuZnVuY3Rpb24gaW5mbGF0ZUluaXQoc3RybSkge1xuICByZXR1cm4gaW5mbGF0ZUluaXQyKHN0cm0sIERFRl9XQklUUyk7XG59XG5cblxuLypcbiBSZXR1cm4gc3RhdGUgd2l0aCBsZW5ndGggYW5kIGRpc3RhbmNlIGRlY29kaW5nIHRhYmxlcyBhbmQgaW5kZXggc2l6ZXMgc2V0IHRvXG4gZml4ZWQgY29kZSBkZWNvZGluZy4gIE5vcm1hbGx5IHRoaXMgcmV0dXJucyBmaXhlZCB0YWJsZXMgZnJvbSBpbmZmaXhlZC5oLlxuIElmIEJVSUxERklYRUQgaXMgZGVmaW5lZCwgdGhlbiBpbnN0ZWFkIHRoaXMgcm91dGluZSBidWlsZHMgdGhlIHRhYmxlcyB0aGVcbiBmaXJzdCB0aW1lIGl0J3MgY2FsbGVkLCBhbmQgcmV0dXJucyB0aG9zZSB0YWJsZXMgdGhlIGZpcnN0IHRpbWUgYW5kXG4gdGhlcmVhZnRlci4gIFRoaXMgcmVkdWNlcyB0aGUgc2l6ZSBvZiB0aGUgY29kZSBieSBhYm91dCAySyBieXRlcywgaW5cbiBleGNoYW5nZSBmb3IgYSBsaXR0bGUgZXhlY3V0aW9uIHRpbWUuICBIb3dldmVyLCBCVUlMREZJWEVEIHNob3VsZCBub3QgYmVcbiB1c2VkIGZvciB0aHJlYWRlZCBhcHBsaWNhdGlvbnMsIHNpbmNlIHRoZSByZXdyaXRpbmcgb2YgdGhlIHRhYmxlcyBhbmQgdmlyZ2luXG4gbWF5IG5vdCBiZSB0aHJlYWQtc2FmZS5cbiAqL1xudmFyIHZpcmdpbiA9IHRydWU7XG5cbnZhciBsZW5maXgsIGRpc3RmaXg7IC8vIFdlIGhhdmUgbm8gcG9pbnRlcnMgaW4gSlMsIHNvIGtlZXAgdGFibGVzIHNlcGFyYXRlXG5cbmZ1bmN0aW9uIGZpeGVkdGFibGVzKHN0YXRlKSB7XG4gIC8qIGJ1aWxkIGZpeGVkIGh1ZmZtYW4gdGFibGVzIGlmIGZpcnN0IGNhbGwgKG1heSBub3QgYmUgdGhyZWFkIHNhZmUpICovXG4gIGlmICh2aXJnaW4pIHtcbiAgICB2YXIgc3ltO1xuXG4gICAgbGVuZml4ID0gbmV3IHV0aWxzLkJ1ZjMyKDUxMik7XG4gICAgZGlzdGZpeCA9IG5ldyB1dGlscy5CdWYzMigzMik7XG5cbiAgICAvKiBsaXRlcmFsL2xlbmd0aCB0YWJsZSAqL1xuICAgIHN5bSA9IDA7XG4gICAgd2hpbGUgKHN5bSA8IDE0NCkgeyBzdGF0ZS5sZW5zW3N5bSsrXSA9IDg7IH1cbiAgICB3aGlsZSAoc3ltIDwgMjU2KSB7IHN0YXRlLmxlbnNbc3ltKytdID0gOTsgfVxuICAgIHdoaWxlIChzeW0gPCAyODApIHsgc3RhdGUubGVuc1tzeW0rK10gPSA3OyB9XG4gICAgd2hpbGUgKHN5bSA8IDI4OCkgeyBzdGF0ZS5sZW5zW3N5bSsrXSA9IDg7IH1cblxuICAgIGluZmxhdGVfdGFibGUoTEVOUywgIHN0YXRlLmxlbnMsIDAsIDI4OCwgbGVuZml4LCAgIDAsIHN0YXRlLndvcmssIHtiaXRzOiA5fSk7XG5cbiAgICAvKiBkaXN0YW5jZSB0YWJsZSAqL1xuICAgIHN5bSA9IDA7XG4gICAgd2hpbGUgKHN5bSA8IDMyKSB7IHN0YXRlLmxlbnNbc3ltKytdID0gNTsgfVxuXG4gICAgaW5mbGF0ZV90YWJsZShESVNUUywgc3RhdGUubGVucywgMCwgMzIsICAgZGlzdGZpeCwgMCwgc3RhdGUud29yaywge2JpdHM6IDV9KTtcblxuICAgIC8qIGRvIHRoaXMganVzdCBvbmNlICovXG4gICAgdmlyZ2luID0gZmFsc2U7XG4gIH1cblxuICBzdGF0ZS5sZW5jb2RlID0gbGVuZml4O1xuICBzdGF0ZS5sZW5iaXRzID0gOTtcbiAgc3RhdGUuZGlzdGNvZGUgPSBkaXN0Zml4O1xuICBzdGF0ZS5kaXN0Yml0cyA9IDU7XG59XG5cblxuLypcbiBVcGRhdGUgdGhlIHdpbmRvdyB3aXRoIHRoZSBsYXN0IHdzaXplIChub3JtYWxseSAzMkspIGJ5dGVzIHdyaXR0ZW4gYmVmb3JlXG4gcmV0dXJuaW5nLiAgSWYgd2luZG93IGRvZXMgbm90IGV4aXN0IHlldCwgY3JlYXRlIGl0LiAgVGhpcyBpcyBvbmx5IGNhbGxlZFxuIHdoZW4gYSB3aW5kb3cgaXMgYWxyZWFkeSBpbiB1c2UsIG9yIHdoZW4gb3V0cHV0IGhhcyBiZWVuIHdyaXR0ZW4gZHVyaW5nIHRoaXNcbiBpbmZsYXRlIGNhbGwsIGJ1dCB0aGUgZW5kIG9mIHRoZSBkZWZsYXRlIHN0cmVhbSBoYXMgbm90IGJlZW4gcmVhY2hlZCB5ZXQuXG4gSXQgaXMgYWxzbyBjYWxsZWQgdG8gY3JlYXRlIGEgd2luZG93IGZvciBkaWN0aW9uYXJ5IGRhdGEgd2hlbiBhIGRpY3Rpb25hcnlcbiBpcyBsb2FkZWQuXG5cbiBQcm92aWRpbmcgb3V0cHV0IGJ1ZmZlcnMgbGFyZ2VyIHRoYW4gMzJLIHRvIGluZmxhdGUoKSBzaG91bGQgcHJvdmlkZSBhIHNwZWVkXG4gYWR2YW50YWdlLCBzaW5jZSBvbmx5IHRoZSBsYXN0IDMySyBvZiBvdXRwdXQgaXMgY29waWVkIHRvIHRoZSBzbGlkaW5nIHdpbmRvd1xuIHVwb24gcmV0dXJuIGZyb20gaW5mbGF0ZSgpLCBhbmQgc2luY2UgYWxsIGRpc3RhbmNlcyBhZnRlciB0aGUgZmlyc3QgMzJLIG9mXG4gb3V0cHV0IHdpbGwgZmFsbCBpbiB0aGUgb3V0cHV0IGRhdGEsIG1ha2luZyBtYXRjaCBjb3BpZXMgc2ltcGxlciBhbmQgZmFzdGVyLlxuIFRoZSBhZHZhbnRhZ2UgbWF5IGJlIGRlcGVuZGVudCBvbiB0aGUgc2l6ZSBvZiB0aGUgcHJvY2Vzc29yJ3MgZGF0YSBjYWNoZXMuXG4gKi9cbmZ1bmN0aW9uIHVwZGF0ZXdpbmRvdyhzdHJtLCBzcmMsIGVuZCwgY29weSkge1xuICB2YXIgZGlzdDtcbiAgdmFyIHN0YXRlID0gc3RybS5zdGF0ZTtcblxuICAvKiBpZiBpdCBoYXNuJ3QgYmVlbiBkb25lIGFscmVhZHksIGFsbG9jYXRlIHNwYWNlIGZvciB0aGUgd2luZG93ICovXG4gIGlmIChzdGF0ZS53aW5kb3cgPT09IG51bGwpIHtcbiAgICBzdGF0ZS53c2l6ZSA9IDEgPDwgc3RhdGUud2JpdHM7XG4gICAgc3RhdGUud25leHQgPSAwO1xuICAgIHN0YXRlLndoYXZlID0gMDtcblxuICAgIHN0YXRlLndpbmRvdyA9IG5ldyB1dGlscy5CdWY4KHN0YXRlLndzaXplKTtcbiAgfVxuXG4gIC8qIGNvcHkgc3RhdGUtPndzaXplIG9yIGxlc3Mgb3V0cHV0IGJ5dGVzIGludG8gdGhlIGNpcmN1bGFyIHdpbmRvdyAqL1xuICBpZiAoY29weSA+PSBzdGF0ZS53c2l6ZSkge1xuICAgIHV0aWxzLmFycmF5U2V0KHN0YXRlLndpbmRvdyxzcmMsIGVuZCAtIHN0YXRlLndzaXplLCBzdGF0ZS53c2l6ZSwgMCk7XG4gICAgc3RhdGUud25leHQgPSAwO1xuICAgIHN0YXRlLndoYXZlID0gc3RhdGUud3NpemU7XG4gIH1cbiAgZWxzZSB7XG4gICAgZGlzdCA9IHN0YXRlLndzaXplIC0gc3RhdGUud25leHQ7XG4gICAgaWYgKGRpc3QgPiBjb3B5KSB7XG4gICAgICBkaXN0ID0gY29weTtcbiAgICB9XG4gICAgLy96bWVtY3B5KHN0YXRlLT53aW5kb3cgKyBzdGF0ZS0+d25leHQsIGVuZCAtIGNvcHksIGRpc3QpO1xuICAgIHV0aWxzLmFycmF5U2V0KHN0YXRlLndpbmRvdyxzcmMsIGVuZCAtIGNvcHksIGRpc3QsIHN0YXRlLnduZXh0KTtcbiAgICBjb3B5IC09IGRpc3Q7XG4gICAgaWYgKGNvcHkpIHtcbiAgICAgIC8vem1lbWNweShzdGF0ZS0+d2luZG93LCBlbmQgLSBjb3B5LCBjb3B5KTtcbiAgICAgIHV0aWxzLmFycmF5U2V0KHN0YXRlLndpbmRvdyxzcmMsIGVuZCAtIGNvcHksIGNvcHksIDApO1xuICAgICAgc3RhdGUud25leHQgPSBjb3B5O1xuICAgICAgc3RhdGUud2hhdmUgPSBzdGF0ZS53c2l6ZTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICBzdGF0ZS53bmV4dCArPSBkaXN0O1xuICAgICAgaWYgKHN0YXRlLnduZXh0ID09PSBzdGF0ZS53c2l6ZSkgeyBzdGF0ZS53bmV4dCA9IDA7IH1cbiAgICAgIGlmIChzdGF0ZS53aGF2ZSA8IHN0YXRlLndzaXplKSB7IHN0YXRlLndoYXZlICs9IGRpc3Q7IH1cbiAgICB9XG4gIH1cbiAgcmV0dXJuIDA7XG59XG5cbmZ1bmN0aW9uIGluZmxhdGUoc3RybSwgZmx1c2gpIHtcbiAgdmFyIHN0YXRlO1xuICB2YXIgaW5wdXQsIG91dHB1dDsgICAgICAgICAgLy8gaW5wdXQvb3V0cHV0IGJ1ZmZlcnNcbiAgdmFyIG5leHQ7ICAgICAgICAgICAgICAgICAgIC8qIG5leHQgaW5wdXQgSU5ERVggKi9cbiAgdmFyIHB1dDsgICAgICAgICAgICAgICAgICAgIC8qIG5leHQgb3V0cHV0IElOREVYICovXG4gIHZhciBoYXZlLCBsZWZ0OyAgICAgICAgICAgICAvKiBhdmFpbGFibGUgaW5wdXQgYW5kIG91dHB1dCAqL1xuICB2YXIgaG9sZDsgICAgICAgICAgICAgICAgICAgLyogYml0IGJ1ZmZlciAqL1xuICB2YXIgYml0czsgICAgICAgICAgICAgICAgICAgLyogYml0cyBpbiBiaXQgYnVmZmVyICovXG4gIHZhciBfaW4sIF9vdXQ7ICAgICAgICAgICAgICAvKiBzYXZlIHN0YXJ0aW5nIGF2YWlsYWJsZSBpbnB1dCBhbmQgb3V0cHV0ICovXG4gIHZhciBjb3B5OyAgICAgICAgICAgICAgICAgICAvKiBudW1iZXIgb2Ygc3RvcmVkIG9yIG1hdGNoIGJ5dGVzIHRvIGNvcHkgKi9cbiAgdmFyIGZyb207ICAgICAgICAgICAgICAgICAgIC8qIHdoZXJlIHRvIGNvcHkgbWF0Y2ggYnl0ZXMgZnJvbSAqL1xuICB2YXIgZnJvbV9zb3VyY2U7XG4gIHZhciBoZXJlID0gMDsgICAgICAgICAgICAgICAvKiBjdXJyZW50IGRlY29kaW5nIHRhYmxlIGVudHJ5ICovXG4gIHZhciBoZXJlX2JpdHMsIGhlcmVfb3AsIGhlcmVfdmFsOyAvLyBwYWtlZCBcImhlcmVcIiBkZW5vcm1hbGl6ZWQgKEpTIHNwZWNpZmljKVxuICAvL3ZhciBsYXN0OyAgICAgICAgICAgICAgICAgICAvKiBwYXJlbnQgdGFibGUgZW50cnkgKi9cbiAgdmFyIGxhc3RfYml0cywgbGFzdF9vcCwgbGFzdF92YWw7IC8vIHBha2VkIFwibGFzdFwiIGRlbm9ybWFsaXplZCAoSlMgc3BlY2lmaWMpXG4gIHZhciBsZW47ICAgICAgICAgICAgICAgICAgICAvKiBsZW5ndGggdG8gY29weSBmb3IgcmVwZWF0cywgYml0cyB0byBkcm9wICovXG4gIHZhciByZXQ7ICAgICAgICAgICAgICAgICAgICAvKiByZXR1cm4gY29kZSAqL1xuICB2YXIgaGJ1ZiA9IG5ldyB1dGlscy5CdWY4KDQpOyAgICAvKiBidWZmZXIgZm9yIGd6aXAgaGVhZGVyIGNyYyBjYWxjdWxhdGlvbiAqL1xuICB2YXIgb3B0cztcblxuICB2YXIgbjsgLy8gdGVtcG9yYXJ5IHZhciBmb3IgTkVFRF9CSVRTXG5cbiAgdmFyIG9yZGVyID0gLyogcGVybXV0YXRpb24gb2YgY29kZSBsZW5ndGhzICovXG4gICAgWzE2LCAxNywgMTgsIDAsIDgsIDcsIDksIDYsIDEwLCA1LCAxMSwgNCwgMTIsIDMsIDEzLCAyLCAxNCwgMSwgMTVdO1xuXG5cbiAgaWYgKCFzdHJtIHx8ICFzdHJtLnN0YXRlIHx8ICFzdHJtLm91dHB1dCB8fFxuICAgICAgKCFzdHJtLmlucHV0ICYmIHN0cm0uYXZhaWxfaW4gIT09IDApKSB7XG4gICAgcmV0dXJuIFpfU1RSRUFNX0VSUk9SO1xuICB9XG5cbiAgc3RhdGUgPSBzdHJtLnN0YXRlO1xuICBpZiAoc3RhdGUubW9kZSA9PT0gVFlQRSkgeyBzdGF0ZS5tb2RlID0gVFlQRURPOyB9ICAgIC8qIHNraXAgY2hlY2sgKi9cblxuXG4gIC8vLS0tIExPQUQoKSAtLS1cbiAgcHV0ID0gc3RybS5uZXh0X291dDtcbiAgb3V0cHV0ID0gc3RybS5vdXRwdXQ7XG4gIGxlZnQgPSBzdHJtLmF2YWlsX291dDtcbiAgbmV4dCA9IHN0cm0ubmV4dF9pbjtcbiAgaW5wdXQgPSBzdHJtLmlucHV0O1xuICBoYXZlID0gc3RybS5hdmFpbF9pbjtcbiAgaG9sZCA9IHN0YXRlLmhvbGQ7XG4gIGJpdHMgPSBzdGF0ZS5iaXRzO1xuICAvLy0tLVxuXG4gIF9pbiA9IGhhdmU7XG4gIF9vdXQgPSBsZWZ0O1xuICByZXQgPSBaX09LO1xuXG4gIGluZl9sZWF2ZTogLy8gZ290byBlbXVsYXRpb25cbiAgZm9yICg7Oykge1xuICAgIHN3aXRjaCAoc3RhdGUubW9kZSkge1xuICAgIGNhc2UgSEVBRDpcbiAgICAgIGlmIChzdGF0ZS53cmFwID09PSAwKSB7XG4gICAgICAgIHN0YXRlLm1vZGUgPSBUWVBFRE87XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgLy89PT0gTkVFREJJVFMoMTYpO1xuICAgICAgd2hpbGUgKGJpdHMgPCAxNikge1xuICAgICAgICBpZiAoaGF2ZSA9PT0gMCkgeyBicmVhayBpbmZfbGVhdmU7IH1cbiAgICAgICAgaGF2ZS0tO1xuICAgICAgICBob2xkICs9IGlucHV0W25leHQrK10gPDwgYml0cztcbiAgICAgICAgYml0cyArPSA4O1xuICAgICAgfVxuICAgICAgLy89PT0vL1xuICAgICAgaWYgKChzdGF0ZS53cmFwICYgMikgJiYgaG9sZCA9PT0gMHg4YjFmKSB7ICAvKiBnemlwIGhlYWRlciAqL1xuICAgICAgICBzdGF0ZS5jaGVjayA9IDAvKmNyYzMyKDBMLCBaX05VTEwsIDApKi87XG4gICAgICAgIC8vPT09IENSQzIoc3RhdGUuY2hlY2ssIGhvbGQpO1xuICAgICAgICBoYnVmWzBdID0gaG9sZCAmIDB4ZmY7XG4gICAgICAgIGhidWZbMV0gPSAoaG9sZCA+Pj4gOCkgJiAweGZmO1xuICAgICAgICBzdGF0ZS5jaGVjayA9IGNyYzMyKHN0YXRlLmNoZWNrLCBoYnVmLCAyLCAwKTtcbiAgICAgICAgLy89PT0vL1xuXG4gICAgICAgIC8vPT09IElOSVRCSVRTKCk7XG4gICAgICAgIGhvbGQgPSAwO1xuICAgICAgICBiaXRzID0gMDtcbiAgICAgICAgLy89PT0vL1xuICAgICAgICBzdGF0ZS5tb2RlID0gRkxBR1M7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgc3RhdGUuZmxhZ3MgPSAwOyAgICAgICAgICAgLyogZXhwZWN0IHpsaWIgaGVhZGVyICovXG4gICAgICBpZiAoc3RhdGUuaGVhZCkge1xuICAgICAgICBzdGF0ZS5oZWFkLmRvbmUgPSBmYWxzZTtcbiAgICAgIH1cbiAgICAgIGlmICghKHN0YXRlLndyYXAgJiAxKSB8fCAgIC8qIGNoZWNrIGlmIHpsaWIgaGVhZGVyIGFsbG93ZWQgKi9cbiAgICAgICAgKCgoaG9sZCAmIDB4ZmYpLypCSVRTKDgpKi8gPDwgOCkgKyAoaG9sZCA+PiA4KSkgJSAzMSkge1xuICAgICAgICBzdHJtLm1zZyA9ICdpbmNvcnJlY3QgaGVhZGVyIGNoZWNrJztcbiAgICAgICAgc3RhdGUubW9kZSA9IEJBRDtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBpZiAoKGhvbGQgJiAweDBmKS8qQklUUyg0KSovICE9PSBaX0RFRkxBVEVEKSB7XG4gICAgICAgIHN0cm0ubXNnID0gJ3Vua25vd24gY29tcHJlc3Npb24gbWV0aG9kJztcbiAgICAgICAgc3RhdGUubW9kZSA9IEJBRDtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICAvLy0tLSBEUk9QQklUUyg0KSAtLS0vL1xuICAgICAgaG9sZCA+Pj49IDQ7XG4gICAgICBiaXRzIC09IDQ7XG4gICAgICAvLy0tLS8vXG4gICAgICBsZW4gPSAoaG9sZCAmIDB4MGYpLypCSVRTKDQpKi8gKyA4O1xuICAgICAgaWYgKHN0YXRlLndiaXRzID09PSAwKSB7XG4gICAgICAgIHN0YXRlLndiaXRzID0gbGVuO1xuICAgICAgfVxuICAgICAgZWxzZSBpZiAobGVuID4gc3RhdGUud2JpdHMpIHtcbiAgICAgICAgc3RybS5tc2cgPSAnaW52YWxpZCB3aW5kb3cgc2l6ZSc7XG4gICAgICAgIHN0YXRlLm1vZGUgPSBCQUQ7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgc3RhdGUuZG1heCA9IDEgPDwgbGVuO1xuICAgICAgLy9UcmFjZXYoKHN0ZGVyciwgXCJpbmZsYXRlOiAgIHpsaWIgaGVhZGVyIG9rXFxuXCIpKTtcbiAgICAgIHN0cm0uYWRsZXIgPSBzdGF0ZS5jaGVjayA9IDEvKmFkbGVyMzIoMEwsIFpfTlVMTCwgMCkqLztcbiAgICAgIHN0YXRlLm1vZGUgPSBob2xkICYgMHgyMDAgPyBESUNUSUQgOiBUWVBFO1xuICAgICAgLy89PT0gSU5JVEJJVFMoKTtcbiAgICAgIGhvbGQgPSAwO1xuICAgICAgYml0cyA9IDA7XG4gICAgICAvLz09PS8vXG4gICAgICBicmVhaztcbiAgICBjYXNlIEZMQUdTOlxuICAgICAgLy89PT0gTkVFREJJVFMoMTYpOyAqL1xuICAgICAgd2hpbGUgKGJpdHMgPCAxNikge1xuICAgICAgICBpZiAoaGF2ZSA9PT0gMCkgeyBicmVhayBpbmZfbGVhdmU7IH1cbiAgICAgICAgaGF2ZS0tO1xuICAgICAgICBob2xkICs9IGlucHV0W25leHQrK10gPDwgYml0cztcbiAgICAgICAgYml0cyArPSA4O1xuICAgICAgfVxuICAgICAgLy89PT0vL1xuICAgICAgc3RhdGUuZmxhZ3MgPSBob2xkO1xuICAgICAgaWYgKChzdGF0ZS5mbGFncyAmIDB4ZmYpICE9PSBaX0RFRkxBVEVEKSB7XG4gICAgICAgIHN0cm0ubXNnID0gJ3Vua25vd24gY29tcHJlc3Npb24gbWV0aG9kJztcbiAgICAgICAgc3RhdGUubW9kZSA9IEJBRDtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBpZiAoc3RhdGUuZmxhZ3MgJiAweGUwMDApIHtcbiAgICAgICAgc3RybS5tc2cgPSAndW5rbm93biBoZWFkZXIgZmxhZ3Mgc2V0JztcbiAgICAgICAgc3RhdGUubW9kZSA9IEJBRDtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBpZiAoc3RhdGUuaGVhZCkge1xuICAgICAgICBzdGF0ZS5oZWFkLnRleHQgPSAoKGhvbGQgPj4gOCkgJiAxKTtcbiAgICAgIH1cbiAgICAgIGlmIChzdGF0ZS5mbGFncyAmIDB4MDIwMCkge1xuICAgICAgICAvLz09PSBDUkMyKHN0YXRlLmNoZWNrLCBob2xkKTtcbiAgICAgICAgaGJ1ZlswXSA9IGhvbGQgJiAweGZmO1xuICAgICAgICBoYnVmWzFdID0gKGhvbGQgPj4+IDgpICYgMHhmZjtcbiAgICAgICAgc3RhdGUuY2hlY2sgPSBjcmMzMihzdGF0ZS5jaGVjaywgaGJ1ZiwgMiwgMCk7XG4gICAgICAgIC8vPT09Ly9cbiAgICAgIH1cbiAgICAgIC8vPT09IElOSVRCSVRTKCk7XG4gICAgICBob2xkID0gMDtcbiAgICAgIGJpdHMgPSAwO1xuICAgICAgLy89PT0vL1xuICAgICAgc3RhdGUubW9kZSA9IFRJTUU7XG4gICAgICAvKiBmYWxscyB0aHJvdWdoICovXG4gICAgY2FzZSBUSU1FOlxuICAgICAgLy89PT0gTkVFREJJVFMoMzIpOyAqL1xuICAgICAgd2hpbGUgKGJpdHMgPCAzMikge1xuICAgICAgICBpZiAoaGF2ZSA9PT0gMCkgeyBicmVhayBpbmZfbGVhdmU7IH1cbiAgICAgICAgaGF2ZS0tO1xuICAgICAgICBob2xkICs9IGlucHV0W25leHQrK10gPDwgYml0cztcbiAgICAgICAgYml0cyArPSA4O1xuICAgICAgfVxuICAgICAgLy89PT0vL1xuICAgICAgaWYgKHN0YXRlLmhlYWQpIHtcbiAgICAgICAgc3RhdGUuaGVhZC50aW1lID0gaG9sZDtcbiAgICAgIH1cbiAgICAgIGlmIChzdGF0ZS5mbGFncyAmIDB4MDIwMCkge1xuICAgICAgICAvLz09PSBDUkM0KHN0YXRlLmNoZWNrLCBob2xkKVxuICAgICAgICBoYnVmWzBdID0gaG9sZCAmIDB4ZmY7XG4gICAgICAgIGhidWZbMV0gPSAoaG9sZCA+Pj4gOCkgJiAweGZmO1xuICAgICAgICBoYnVmWzJdID0gKGhvbGQgPj4+IDE2KSAmIDB4ZmY7XG4gICAgICAgIGhidWZbM10gPSAoaG9sZCA+Pj4gMjQpICYgMHhmZjtcbiAgICAgICAgc3RhdGUuY2hlY2sgPSBjcmMzMihzdGF0ZS5jaGVjaywgaGJ1ZiwgNCwgMCk7XG4gICAgICAgIC8vPT09XG4gICAgICB9XG4gICAgICAvLz09PSBJTklUQklUUygpO1xuICAgICAgaG9sZCA9IDA7XG4gICAgICBiaXRzID0gMDtcbiAgICAgIC8vPT09Ly9cbiAgICAgIHN0YXRlLm1vZGUgPSBPUztcbiAgICAgIC8qIGZhbGxzIHRocm91Z2ggKi9cbiAgICBjYXNlIE9TOlxuICAgICAgLy89PT0gTkVFREJJVFMoMTYpOyAqL1xuICAgICAgd2hpbGUgKGJpdHMgPCAxNikge1xuICAgICAgICBpZiAoaGF2ZSA9PT0gMCkgeyBicmVhayBpbmZfbGVhdmU7IH1cbiAgICAgICAgaGF2ZS0tO1xuICAgICAgICBob2xkICs9IGlucHV0W25leHQrK10gPDwgYml0cztcbiAgICAgICAgYml0cyArPSA4O1xuICAgICAgfVxuICAgICAgLy89PT0vL1xuICAgICAgaWYgKHN0YXRlLmhlYWQpIHtcbiAgICAgICAgc3RhdGUuaGVhZC54ZmxhZ3MgPSAoaG9sZCAmIDB4ZmYpO1xuICAgICAgICBzdGF0ZS5oZWFkLm9zID0gKGhvbGQgPj4gOCk7XG4gICAgICB9XG4gICAgICBpZiAoc3RhdGUuZmxhZ3MgJiAweDAyMDApIHtcbiAgICAgICAgLy89PT0gQ1JDMihzdGF0ZS5jaGVjaywgaG9sZCk7XG4gICAgICAgIGhidWZbMF0gPSBob2xkICYgMHhmZjtcbiAgICAgICAgaGJ1ZlsxXSA9IChob2xkID4+PiA4KSAmIDB4ZmY7XG4gICAgICAgIHN0YXRlLmNoZWNrID0gY3JjMzIoc3RhdGUuY2hlY2ssIGhidWYsIDIsIDApO1xuICAgICAgICAvLz09PS8vXG4gICAgICB9XG4gICAgICAvLz09PSBJTklUQklUUygpO1xuICAgICAgaG9sZCA9IDA7XG4gICAgICBiaXRzID0gMDtcbiAgICAgIC8vPT09Ly9cbiAgICAgIHN0YXRlLm1vZGUgPSBFWExFTjtcbiAgICAgIC8qIGZhbGxzIHRocm91Z2ggKi9cbiAgICBjYXNlIEVYTEVOOlxuICAgICAgaWYgKHN0YXRlLmZsYWdzICYgMHgwNDAwKSB7XG4gICAgICAgIC8vPT09IE5FRURCSVRTKDE2KTsgKi9cbiAgICAgICAgd2hpbGUgKGJpdHMgPCAxNikge1xuICAgICAgICAgIGlmIChoYXZlID09PSAwKSB7IGJyZWFrIGluZl9sZWF2ZTsgfVxuICAgICAgICAgIGhhdmUtLTtcbiAgICAgICAgICBob2xkICs9IGlucHV0W25leHQrK10gPDwgYml0cztcbiAgICAgICAgICBiaXRzICs9IDg7XG4gICAgICAgIH1cbiAgICAgICAgLy89PT0vL1xuICAgICAgICBzdGF0ZS5sZW5ndGggPSBob2xkO1xuICAgICAgICBpZiAoc3RhdGUuaGVhZCkge1xuICAgICAgICAgIHN0YXRlLmhlYWQuZXh0cmFfbGVuID0gaG9sZDtcbiAgICAgICAgfVxuICAgICAgICBpZiAoc3RhdGUuZmxhZ3MgJiAweDAyMDApIHtcbiAgICAgICAgICAvLz09PSBDUkMyKHN0YXRlLmNoZWNrLCBob2xkKTtcbiAgICAgICAgICBoYnVmWzBdID0gaG9sZCAmIDB4ZmY7XG4gICAgICAgICAgaGJ1ZlsxXSA9IChob2xkID4+PiA4KSAmIDB4ZmY7XG4gICAgICAgICAgc3RhdGUuY2hlY2sgPSBjcmMzMihzdGF0ZS5jaGVjaywgaGJ1ZiwgMiwgMCk7XG4gICAgICAgICAgLy89PT0vL1xuICAgICAgICB9XG4gICAgICAgIC8vPT09IElOSVRCSVRTKCk7XG4gICAgICAgIGhvbGQgPSAwO1xuICAgICAgICBiaXRzID0gMDtcbiAgICAgICAgLy89PT0vL1xuICAgICAgfVxuICAgICAgZWxzZSBpZiAoc3RhdGUuaGVhZCkge1xuICAgICAgICBzdGF0ZS5oZWFkLmV4dHJhID0gbnVsbC8qWl9OVUxMKi87XG4gICAgICB9XG4gICAgICBzdGF0ZS5tb2RlID0gRVhUUkE7XG4gICAgICAvKiBmYWxscyB0aHJvdWdoICovXG4gICAgY2FzZSBFWFRSQTpcbiAgICAgIGlmIChzdGF0ZS5mbGFncyAmIDB4MDQwMCkge1xuICAgICAgICBjb3B5ID0gc3RhdGUubGVuZ3RoO1xuICAgICAgICBpZiAoY29weSA+IGhhdmUpIHsgY29weSA9IGhhdmU7IH1cbiAgICAgICAgaWYgKGNvcHkpIHtcbiAgICAgICAgICBpZiAoc3RhdGUuaGVhZCkge1xuICAgICAgICAgICAgbGVuID0gc3RhdGUuaGVhZC5leHRyYV9sZW4gLSBzdGF0ZS5sZW5ndGg7XG4gICAgICAgICAgICBpZiAoIXN0YXRlLmhlYWQuZXh0cmEpIHtcbiAgICAgICAgICAgICAgLy8gVXNlIHVudHlwZWQgYXJyYXkgZm9yIG1vcmUgY29udmVuaWVuZCBwcm9jZXNzaW5nIGxhdGVyXG4gICAgICAgICAgICAgIHN0YXRlLmhlYWQuZXh0cmEgPSBuZXcgQXJyYXkoc3RhdGUuaGVhZC5leHRyYV9sZW4pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdXRpbHMuYXJyYXlTZXQoXG4gICAgICAgICAgICAgIHN0YXRlLmhlYWQuZXh0cmEsXG4gICAgICAgICAgICAgIGlucHV0LFxuICAgICAgICAgICAgICBuZXh0LFxuICAgICAgICAgICAgICAvLyBleHRyYSBmaWVsZCBpcyBsaW1pdGVkIHRvIDY1NTM2IGJ5dGVzXG4gICAgICAgICAgICAgIC8vIC0gbm8gbmVlZCBmb3IgYWRkaXRpb25hbCBzaXplIGNoZWNrXG4gICAgICAgICAgICAgIGNvcHksXG4gICAgICAgICAgICAgIC8qbGVuICsgY29weSA+IHN0YXRlLmhlYWQuZXh0cmFfbWF4IC0gbGVuID8gc3RhdGUuaGVhZC5leHRyYV9tYXggOiBjb3B5LCovXG4gICAgICAgICAgICAgIGxlblxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIC8vem1lbWNweShzdGF0ZS5oZWFkLmV4dHJhICsgbGVuLCBuZXh0LFxuICAgICAgICAgICAgLy8gICAgICAgIGxlbiArIGNvcHkgPiBzdGF0ZS5oZWFkLmV4dHJhX21heCA/XG4gICAgICAgICAgICAvLyAgICAgICAgc3RhdGUuaGVhZC5leHRyYV9tYXggLSBsZW4gOiBjb3B5KTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKHN0YXRlLmZsYWdzICYgMHgwMjAwKSB7XG4gICAgICAgICAgICBzdGF0ZS5jaGVjayA9IGNyYzMyKHN0YXRlLmNoZWNrLCBpbnB1dCwgY29weSwgbmV4dCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGhhdmUgLT0gY29weTtcbiAgICAgICAgICBuZXh0ICs9IGNvcHk7XG4gICAgICAgICAgc3RhdGUubGVuZ3RoIC09IGNvcHk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHN0YXRlLmxlbmd0aCkgeyBicmVhayBpbmZfbGVhdmU7IH1cbiAgICAgIH1cbiAgICAgIHN0YXRlLmxlbmd0aCA9IDA7XG4gICAgICBzdGF0ZS5tb2RlID0gTkFNRTtcbiAgICAgIC8qIGZhbGxzIHRocm91Z2ggKi9cbiAgICBjYXNlIE5BTUU6XG4gICAgICBpZiAoc3RhdGUuZmxhZ3MgJiAweDA4MDApIHtcbiAgICAgICAgaWYgKGhhdmUgPT09IDApIHsgYnJlYWsgaW5mX2xlYXZlOyB9XG4gICAgICAgIGNvcHkgPSAwO1xuICAgICAgICBkbyB7XG4gICAgICAgICAgLy8gVE9ETzogMiBvciAxIGJ5dGVzP1xuICAgICAgICAgIGxlbiA9IGlucHV0W25leHQgKyBjb3B5KytdO1xuICAgICAgICAgIC8qIHVzZSBjb25zdGFudCBsaW1pdCBiZWNhdXNlIGluIGpzIHdlIHNob3VsZCBub3QgcHJlYWxsb2NhdGUgbWVtb3J5ICovXG4gICAgICAgICAgaWYgKHN0YXRlLmhlYWQgJiYgbGVuICYmXG4gICAgICAgICAgICAgIChzdGF0ZS5sZW5ndGggPCA2NTUzNiAvKnN0YXRlLmhlYWQubmFtZV9tYXgqLykpIHtcbiAgICAgICAgICAgIHN0YXRlLmhlYWQubmFtZSArPSBTdHJpbmcuZnJvbUNoYXJDb2RlKGxlbik7XG4gICAgICAgICAgfVxuICAgICAgICB9IHdoaWxlIChsZW4gJiYgY29weSA8IGhhdmUpO1xuXG4gICAgICAgIGlmIChzdGF0ZS5mbGFncyAmIDB4MDIwMCkge1xuICAgICAgICAgIHN0YXRlLmNoZWNrID0gY3JjMzIoc3RhdGUuY2hlY2ssIGlucHV0LCBjb3B5LCBuZXh0KTtcbiAgICAgICAgfVxuICAgICAgICBoYXZlIC09IGNvcHk7XG4gICAgICAgIG5leHQgKz0gY29weTtcbiAgICAgICAgaWYgKGxlbikgeyBicmVhayBpbmZfbGVhdmU7IH1cbiAgICAgIH1cbiAgICAgIGVsc2UgaWYgKHN0YXRlLmhlYWQpIHtcbiAgICAgICAgc3RhdGUuaGVhZC5uYW1lID0gbnVsbDtcbiAgICAgIH1cbiAgICAgIHN0YXRlLmxlbmd0aCA9IDA7XG4gICAgICBzdGF0ZS5tb2RlID0gQ09NTUVOVDtcbiAgICAgIC8qIGZhbGxzIHRocm91Z2ggKi9cbiAgICBjYXNlIENPTU1FTlQ6XG4gICAgICBpZiAoc3RhdGUuZmxhZ3MgJiAweDEwMDApIHtcbiAgICAgICAgaWYgKGhhdmUgPT09IDApIHsgYnJlYWsgaW5mX2xlYXZlOyB9XG4gICAgICAgIGNvcHkgPSAwO1xuICAgICAgICBkbyB7XG4gICAgICAgICAgbGVuID0gaW5wdXRbbmV4dCArIGNvcHkrK107XG4gICAgICAgICAgLyogdXNlIGNvbnN0YW50IGxpbWl0IGJlY2F1c2UgaW4ganMgd2Ugc2hvdWxkIG5vdCBwcmVhbGxvY2F0ZSBtZW1vcnkgKi9cbiAgICAgICAgICBpZiAoc3RhdGUuaGVhZCAmJiBsZW4gJiZcbiAgICAgICAgICAgICAgKHN0YXRlLmxlbmd0aCA8IDY1NTM2IC8qc3RhdGUuaGVhZC5jb21tX21heCovKSkge1xuICAgICAgICAgICAgc3RhdGUuaGVhZC5jb21tZW50ICs9IFN0cmluZy5mcm9tQ2hhckNvZGUobGVuKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gd2hpbGUgKGxlbiAmJiBjb3B5IDwgaGF2ZSk7XG4gICAgICAgIGlmIChzdGF0ZS5mbGFncyAmIDB4MDIwMCkge1xuICAgICAgICAgIHN0YXRlLmNoZWNrID0gY3JjMzIoc3RhdGUuY2hlY2ssIGlucHV0LCBjb3B5LCBuZXh0KTtcbiAgICAgICAgfVxuICAgICAgICBoYXZlIC09IGNvcHk7XG4gICAgICAgIG5leHQgKz0gY29weTtcbiAgICAgICAgaWYgKGxlbikgeyBicmVhayBpbmZfbGVhdmU7IH1cbiAgICAgIH1cbiAgICAgIGVsc2UgaWYgKHN0YXRlLmhlYWQpIHtcbiAgICAgICAgc3RhdGUuaGVhZC5jb21tZW50ID0gbnVsbDtcbiAgICAgIH1cbiAgICAgIHN0YXRlLm1vZGUgPSBIQ1JDO1xuICAgICAgLyogZmFsbHMgdGhyb3VnaCAqL1xuICAgIGNhc2UgSENSQzpcbiAgICAgIGlmIChzdGF0ZS5mbGFncyAmIDB4MDIwMCkge1xuICAgICAgICAvLz09PSBORUVEQklUUygxNik7ICovXG4gICAgICAgIHdoaWxlIChiaXRzIDwgMTYpIHtcbiAgICAgICAgICBpZiAoaGF2ZSA9PT0gMCkgeyBicmVhayBpbmZfbGVhdmU7IH1cbiAgICAgICAgICBoYXZlLS07XG4gICAgICAgICAgaG9sZCArPSBpbnB1dFtuZXh0KytdIDw8IGJpdHM7XG4gICAgICAgICAgYml0cyArPSA4O1xuICAgICAgICB9XG4gICAgICAgIC8vPT09Ly9cbiAgICAgICAgaWYgKGhvbGQgIT09IChzdGF0ZS5jaGVjayAmIDB4ZmZmZikpIHtcbiAgICAgICAgICBzdHJtLm1zZyA9ICdoZWFkZXIgY3JjIG1pc21hdGNoJztcbiAgICAgICAgICBzdGF0ZS5tb2RlID0gQkFEO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIC8vPT09IElOSVRCSVRTKCk7XG4gICAgICAgIGhvbGQgPSAwO1xuICAgICAgICBiaXRzID0gMDtcbiAgICAgICAgLy89PT0vL1xuICAgICAgfVxuICAgICAgaWYgKHN0YXRlLmhlYWQpIHtcbiAgICAgICAgc3RhdGUuaGVhZC5oY3JjID0gKChzdGF0ZS5mbGFncyA+PiA5KSAmIDEpO1xuICAgICAgICBzdGF0ZS5oZWFkLmRvbmUgPSB0cnVlO1xuICAgICAgfVxuICAgICAgc3RybS5hZGxlciA9IHN0YXRlLmNoZWNrID0gMCAvKmNyYzMyKDBMLCBaX05VTEwsIDApKi87XG4gICAgICBzdGF0ZS5tb2RlID0gVFlQRTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgRElDVElEOlxuICAgICAgLy89PT0gTkVFREJJVFMoMzIpOyAqL1xuICAgICAgd2hpbGUgKGJpdHMgPCAzMikge1xuICAgICAgICBpZiAoaGF2ZSA9PT0gMCkgeyBicmVhayBpbmZfbGVhdmU7IH1cbiAgICAgICAgaGF2ZS0tO1xuICAgICAgICBob2xkICs9IGlucHV0W25leHQrK10gPDwgYml0cztcbiAgICAgICAgYml0cyArPSA4O1xuICAgICAgfVxuICAgICAgLy89PT0vL1xuICAgICAgc3RybS5hZGxlciA9IHN0YXRlLmNoZWNrID0gWlNXQVAzMihob2xkKTtcbiAgICAgIC8vPT09IElOSVRCSVRTKCk7XG4gICAgICBob2xkID0gMDtcbiAgICAgIGJpdHMgPSAwO1xuICAgICAgLy89PT0vL1xuICAgICAgc3RhdGUubW9kZSA9IERJQ1Q7XG4gICAgICAvKiBmYWxscyB0aHJvdWdoICovXG4gICAgY2FzZSBESUNUOlxuICAgICAgaWYgKHN0YXRlLmhhdmVkaWN0ID09PSAwKSB7XG4gICAgICAgIC8vLS0tIFJFU1RPUkUoKSAtLS1cbiAgICAgICAgc3RybS5uZXh0X291dCA9IHB1dDtcbiAgICAgICAgc3RybS5hdmFpbF9vdXQgPSBsZWZ0O1xuICAgICAgICBzdHJtLm5leHRfaW4gPSBuZXh0O1xuICAgICAgICBzdHJtLmF2YWlsX2luID0gaGF2ZTtcbiAgICAgICAgc3RhdGUuaG9sZCA9IGhvbGQ7XG4gICAgICAgIHN0YXRlLmJpdHMgPSBiaXRzO1xuICAgICAgICAvLy0tLVxuICAgICAgICByZXR1cm4gWl9ORUVEX0RJQ1Q7XG4gICAgICB9XG4gICAgICBzdHJtLmFkbGVyID0gc3RhdGUuY2hlY2sgPSAxLyphZGxlcjMyKDBMLCBaX05VTEwsIDApKi87XG4gICAgICBzdGF0ZS5tb2RlID0gVFlQRTtcbiAgICAgIC8qIGZhbGxzIHRocm91Z2ggKi9cbiAgICBjYXNlIFRZUEU6XG4gICAgICBpZiAoZmx1c2ggPT09IFpfQkxPQ0sgfHwgZmx1c2ggPT09IFpfVFJFRVMpIHsgYnJlYWsgaW5mX2xlYXZlOyB9XG4gICAgICAvKiBmYWxscyB0aHJvdWdoICovXG4gICAgY2FzZSBUWVBFRE86XG4gICAgICBpZiAoc3RhdGUubGFzdCkge1xuICAgICAgICAvLy0tLSBCWVRFQklUUygpIC0tLS8vXG4gICAgICAgIGhvbGQgPj4+PSBiaXRzICYgNztcbiAgICAgICAgYml0cyAtPSBiaXRzICYgNztcbiAgICAgICAgLy8tLS0vL1xuICAgICAgICBzdGF0ZS5tb2RlID0gQ0hFQ0s7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgLy89PT0gTkVFREJJVFMoMyk7ICovXG4gICAgICB3aGlsZSAoYml0cyA8IDMpIHtcbiAgICAgICAgaWYgKGhhdmUgPT09IDApIHsgYnJlYWsgaW5mX2xlYXZlOyB9XG4gICAgICAgIGhhdmUtLTtcbiAgICAgICAgaG9sZCArPSBpbnB1dFtuZXh0KytdIDw8IGJpdHM7XG4gICAgICAgIGJpdHMgKz0gODtcbiAgICAgIH1cbiAgICAgIC8vPT09Ly9cbiAgICAgIHN0YXRlLmxhc3QgPSAoaG9sZCAmIDB4MDEpLypCSVRTKDEpKi87XG4gICAgICAvLy0tLSBEUk9QQklUUygxKSAtLS0vL1xuICAgICAgaG9sZCA+Pj49IDE7XG4gICAgICBiaXRzIC09IDE7XG4gICAgICAvLy0tLS8vXG5cbiAgICAgIHN3aXRjaCAoKGhvbGQgJiAweDAzKS8qQklUUygyKSovKSB7XG4gICAgICBjYXNlIDA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBzdG9yZWQgYmxvY2sgKi9cbiAgICAgICAgLy9UcmFjZXYoKHN0ZGVyciwgXCJpbmZsYXRlOiAgICAgc3RvcmVkIGJsb2NrJXNcXG5cIixcbiAgICAgICAgLy8gICAgICAgIHN0YXRlLmxhc3QgPyBcIiAobGFzdClcIiA6IFwiXCIpKTtcbiAgICAgICAgc3RhdGUubW9kZSA9IFNUT1JFRDtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIDE6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBmaXhlZCBibG9jayAqL1xuICAgICAgICBmaXhlZHRhYmxlcyhzdGF0ZSk7XG4gICAgICAgIC8vVHJhY2V2KChzdGRlcnIsIFwiaW5mbGF0ZTogICAgIGZpeGVkIGNvZGVzIGJsb2NrJXNcXG5cIixcbiAgICAgICAgLy8gICAgICAgIHN0YXRlLmxhc3QgPyBcIiAobGFzdClcIiA6IFwiXCIpKTtcbiAgICAgICAgc3RhdGUubW9kZSA9IExFTl87ICAgICAgICAgICAgIC8qIGRlY29kZSBjb2RlcyAqL1xuICAgICAgICBpZiAoZmx1c2ggPT09IFpfVFJFRVMpIHtcbiAgICAgICAgICAvLy0tLSBEUk9QQklUUygyKSAtLS0vL1xuICAgICAgICAgIGhvbGQgPj4+PSAyO1xuICAgICAgICAgIGJpdHMgLT0gMjtcbiAgICAgICAgICAvLy0tLS8vXG4gICAgICAgICAgYnJlYWsgaW5mX2xlYXZlO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAyOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZHluYW1pYyBibG9jayAqL1xuICAgICAgICAvL1RyYWNldigoc3RkZXJyLCBcImluZmxhdGU6ICAgICBkeW5hbWljIGNvZGVzIGJsb2NrJXNcXG5cIixcbiAgICAgICAgLy8gICAgICAgIHN0YXRlLmxhc3QgPyBcIiAobGFzdClcIiA6IFwiXCIpKTtcbiAgICAgICAgc3RhdGUubW9kZSA9IFRBQkxFO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgMzpcbiAgICAgICAgc3RybS5tc2cgPSAnaW52YWxpZCBibG9jayB0eXBlJztcbiAgICAgICAgc3RhdGUubW9kZSA9IEJBRDtcbiAgICAgIH1cbiAgICAgIC8vLS0tIERST1BCSVRTKDIpIC0tLS8vXG4gICAgICBob2xkID4+Pj0gMjtcbiAgICAgIGJpdHMgLT0gMjtcbiAgICAgIC8vLS0tLy9cbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgU1RPUkVEOlxuICAgICAgLy8tLS0gQllURUJJVFMoKSAtLS0vLyAvKiBnbyB0byBieXRlIGJvdW5kYXJ5ICovXG4gICAgICBob2xkID4+Pj0gYml0cyAmIDc7XG4gICAgICBiaXRzIC09IGJpdHMgJiA3O1xuICAgICAgLy8tLS0vL1xuICAgICAgLy89PT0gTkVFREJJVFMoMzIpOyAqL1xuICAgICAgd2hpbGUgKGJpdHMgPCAzMikge1xuICAgICAgICBpZiAoaGF2ZSA9PT0gMCkgeyBicmVhayBpbmZfbGVhdmU7IH1cbiAgICAgICAgaGF2ZS0tO1xuICAgICAgICBob2xkICs9IGlucHV0W25leHQrK10gPDwgYml0cztcbiAgICAgICAgYml0cyArPSA4O1xuICAgICAgfVxuICAgICAgLy89PT0vL1xuICAgICAgaWYgKChob2xkICYgMHhmZmZmKSAhPT0gKChob2xkID4+PiAxNikgXiAweGZmZmYpKSB7XG4gICAgICAgIHN0cm0ubXNnID0gJ2ludmFsaWQgc3RvcmVkIGJsb2NrIGxlbmd0aHMnO1xuICAgICAgICBzdGF0ZS5tb2RlID0gQkFEO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIHN0YXRlLmxlbmd0aCA9IGhvbGQgJiAweGZmZmY7XG4gICAgICAvL1RyYWNldigoc3RkZXJyLCBcImluZmxhdGU6ICAgICAgIHN0b3JlZCBsZW5ndGggJXVcXG5cIixcbiAgICAgIC8vICAgICAgICBzdGF0ZS5sZW5ndGgpKTtcbiAgICAgIC8vPT09IElOSVRCSVRTKCk7XG4gICAgICBob2xkID0gMDtcbiAgICAgIGJpdHMgPSAwO1xuICAgICAgLy89PT0vL1xuICAgICAgc3RhdGUubW9kZSA9IENPUFlfO1xuICAgICAgaWYgKGZsdXNoID09PSBaX1RSRUVTKSB7IGJyZWFrIGluZl9sZWF2ZTsgfVxuICAgICAgLyogZmFsbHMgdGhyb3VnaCAqL1xuICAgIGNhc2UgQ09QWV86XG4gICAgICBzdGF0ZS5tb2RlID0gQ09QWTtcbiAgICAgIC8qIGZhbGxzIHRocm91Z2ggKi9cbiAgICBjYXNlIENPUFk6XG4gICAgICBjb3B5ID0gc3RhdGUubGVuZ3RoO1xuICAgICAgaWYgKGNvcHkpIHtcbiAgICAgICAgaWYgKGNvcHkgPiBoYXZlKSB7IGNvcHkgPSBoYXZlOyB9XG4gICAgICAgIGlmIChjb3B5ID4gbGVmdCkgeyBjb3B5ID0gbGVmdDsgfVxuICAgICAgICBpZiAoY29weSA9PT0gMCkgeyBicmVhayBpbmZfbGVhdmU7IH1cbiAgICAgICAgLy8tLS0gem1lbWNweShwdXQsIG5leHQsIGNvcHkpOyAtLS1cbiAgICAgICAgdXRpbHMuYXJyYXlTZXQob3V0cHV0LCBpbnB1dCwgbmV4dCwgY29weSwgcHV0KTtcbiAgICAgICAgLy8tLS0vL1xuICAgICAgICBoYXZlIC09IGNvcHk7XG4gICAgICAgIG5leHQgKz0gY29weTtcbiAgICAgICAgbGVmdCAtPSBjb3B5O1xuICAgICAgICBwdXQgKz0gY29weTtcbiAgICAgICAgc3RhdGUubGVuZ3RoIC09IGNvcHk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgLy9UcmFjZXYoKHN0ZGVyciwgXCJpbmZsYXRlOiAgICAgICBzdG9yZWQgZW5kXFxuXCIpKTtcbiAgICAgIHN0YXRlLm1vZGUgPSBUWVBFO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSBUQUJMRTpcbiAgICAgIC8vPT09IE5FRURCSVRTKDE0KTsgKi9cbiAgICAgIHdoaWxlIChiaXRzIDwgMTQpIHtcbiAgICAgICAgaWYgKGhhdmUgPT09IDApIHsgYnJlYWsgaW5mX2xlYXZlOyB9XG4gICAgICAgIGhhdmUtLTtcbiAgICAgICAgaG9sZCArPSBpbnB1dFtuZXh0KytdIDw8IGJpdHM7XG4gICAgICAgIGJpdHMgKz0gODtcbiAgICAgIH1cbiAgICAgIC8vPT09Ly9cbiAgICAgIHN0YXRlLm5sZW4gPSAoaG9sZCAmIDB4MWYpLypCSVRTKDUpKi8gKyAyNTc7XG4gICAgICAvLy0tLSBEUk9QQklUUyg1KSAtLS0vL1xuICAgICAgaG9sZCA+Pj49IDU7XG4gICAgICBiaXRzIC09IDU7XG4gICAgICAvLy0tLS8vXG4gICAgICBzdGF0ZS5uZGlzdCA9IChob2xkICYgMHgxZikvKkJJVFMoNSkqLyArIDE7XG4gICAgICAvLy0tLSBEUk9QQklUUyg1KSAtLS0vL1xuICAgICAgaG9sZCA+Pj49IDU7XG4gICAgICBiaXRzIC09IDU7XG4gICAgICAvLy0tLS8vXG4gICAgICBzdGF0ZS5uY29kZSA9IChob2xkICYgMHgwZikvKkJJVFMoNCkqLyArIDQ7XG4gICAgICAvLy0tLSBEUk9QQklUUyg0KSAtLS0vL1xuICAgICAgaG9sZCA+Pj49IDQ7XG4gICAgICBiaXRzIC09IDQ7XG4gICAgICAvLy0tLS8vXG4vLyNpZm5kZWYgUEtaSVBfQlVHX1dPUktBUk9VTkRcbiAgICAgIGlmIChzdGF0ZS5ubGVuID4gMjg2IHx8IHN0YXRlLm5kaXN0ID4gMzApIHtcbiAgICAgICAgc3RybS5tc2cgPSAndG9vIG1hbnkgbGVuZ3RoIG9yIGRpc3RhbmNlIHN5bWJvbHMnO1xuICAgICAgICBzdGF0ZS5tb2RlID0gQkFEO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbi8vI2VuZGlmXG4gICAgICAvL1RyYWNldigoc3RkZXJyLCBcImluZmxhdGU6ICAgICAgIHRhYmxlIHNpemVzIG9rXFxuXCIpKTtcbiAgICAgIHN0YXRlLmhhdmUgPSAwO1xuICAgICAgc3RhdGUubW9kZSA9IExFTkxFTlM7XG4gICAgICAvKiBmYWxscyB0aHJvdWdoICovXG4gICAgY2FzZSBMRU5MRU5TOlxuICAgICAgd2hpbGUgKHN0YXRlLmhhdmUgPCBzdGF0ZS5uY29kZSkge1xuICAgICAgICAvLz09PSBORUVEQklUUygzKTtcbiAgICAgICAgd2hpbGUgKGJpdHMgPCAzKSB7XG4gICAgICAgICAgaWYgKGhhdmUgPT09IDApIHsgYnJlYWsgaW5mX2xlYXZlOyB9XG4gICAgICAgICAgaGF2ZS0tO1xuICAgICAgICAgIGhvbGQgKz0gaW5wdXRbbmV4dCsrXSA8PCBiaXRzO1xuICAgICAgICAgIGJpdHMgKz0gODtcbiAgICAgICAgfVxuICAgICAgICAvLz09PS8vXG4gICAgICAgIHN0YXRlLmxlbnNbb3JkZXJbc3RhdGUuaGF2ZSsrXV0gPSAoaG9sZCAmIDB4MDcpOy8vQklUUygzKTtcbiAgICAgICAgLy8tLS0gRFJPUEJJVFMoMykgLS0tLy9cbiAgICAgICAgaG9sZCA+Pj49IDM7XG4gICAgICAgIGJpdHMgLT0gMztcbiAgICAgICAgLy8tLS0vL1xuICAgICAgfVxuICAgICAgd2hpbGUgKHN0YXRlLmhhdmUgPCAxOSkge1xuICAgICAgICBzdGF0ZS5sZW5zW29yZGVyW3N0YXRlLmhhdmUrK11dID0gMDtcbiAgICAgIH1cbiAgICAgIC8vIFdlIGhhdmUgc2VwYXJhdGUgdGFibGVzICYgbm8gcG9pbnRlcnMuIDIgY29tbWVudGVkIGxpbmVzIGJlbG93IG5vdCBuZWVkZWQuXG4gICAgICAvL3N0YXRlLm5leHQgPSBzdGF0ZS5jb2RlcztcbiAgICAgIC8vc3RhdGUubGVuY29kZSA9IHN0YXRlLm5leHQ7XG4gICAgICAvLyBTd2l0Y2ggdG8gdXNlIGR5bmFtaWMgdGFibGVcbiAgICAgIHN0YXRlLmxlbmNvZGUgPSBzdGF0ZS5sZW5keW47XG4gICAgICBzdGF0ZS5sZW5iaXRzID0gNztcblxuICAgICAgb3B0cyA9IHtiaXRzOiBzdGF0ZS5sZW5iaXRzfTtcbiAgICAgIHJldCA9IGluZmxhdGVfdGFibGUoQ09ERVMsIHN0YXRlLmxlbnMsIDAsIDE5LCBzdGF0ZS5sZW5jb2RlLCAwLCBzdGF0ZS53b3JrLCBvcHRzKTtcbiAgICAgIHN0YXRlLmxlbmJpdHMgPSBvcHRzLmJpdHM7XG5cbiAgICAgIGlmIChyZXQpIHtcbiAgICAgICAgc3RybS5tc2cgPSAnaW52YWxpZCBjb2RlIGxlbmd0aHMgc2V0JztcbiAgICAgICAgc3RhdGUubW9kZSA9IEJBRDtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICAvL1RyYWNldigoc3RkZXJyLCBcImluZmxhdGU6ICAgICAgIGNvZGUgbGVuZ3RocyBva1xcblwiKSk7XG4gICAgICBzdGF0ZS5oYXZlID0gMDtcbiAgICAgIHN0YXRlLm1vZGUgPSBDT0RFTEVOUztcbiAgICAgIC8qIGZhbGxzIHRocm91Z2ggKi9cbiAgICBjYXNlIENPREVMRU5TOlxuICAgICAgd2hpbGUgKHN0YXRlLmhhdmUgPCBzdGF0ZS5ubGVuICsgc3RhdGUubmRpc3QpIHtcbiAgICAgICAgZm9yICg7Oykge1xuICAgICAgICAgIGhlcmUgPSBzdGF0ZS5sZW5jb2RlW2hvbGQgJiAoKDEgPDwgc3RhdGUubGVuYml0cykgLSAxKV07LypCSVRTKHN0YXRlLmxlbmJpdHMpKi9cbiAgICAgICAgICBoZXJlX2JpdHMgPSBoZXJlID4+PiAyNDtcbiAgICAgICAgICBoZXJlX29wID0gKGhlcmUgPj4+IDE2KSAmIDB4ZmY7XG4gICAgICAgICAgaGVyZV92YWwgPSBoZXJlICYgMHhmZmZmO1xuXG4gICAgICAgICAgaWYgKChoZXJlX2JpdHMpIDw9IGJpdHMpIHsgYnJlYWs7IH1cbiAgICAgICAgICAvLy0tLSBQVUxMQllURSgpIC0tLS8vXG4gICAgICAgICAgaWYgKGhhdmUgPT09IDApIHsgYnJlYWsgaW5mX2xlYXZlOyB9XG4gICAgICAgICAgaGF2ZS0tO1xuICAgICAgICAgIGhvbGQgKz0gaW5wdXRbbmV4dCsrXSA8PCBiaXRzO1xuICAgICAgICAgIGJpdHMgKz0gODtcbiAgICAgICAgICAvLy0tLS8vXG4gICAgICAgIH1cbiAgICAgICAgaWYgKGhlcmVfdmFsIDwgMTYpIHtcbiAgICAgICAgICAvLy0tLSBEUk9QQklUUyhoZXJlLmJpdHMpIC0tLS8vXG4gICAgICAgICAgaG9sZCA+Pj49IGhlcmVfYml0cztcbiAgICAgICAgICBiaXRzIC09IGhlcmVfYml0cztcbiAgICAgICAgICAvLy0tLS8vXG4gICAgICAgICAgc3RhdGUubGVuc1tzdGF0ZS5oYXZlKytdID0gaGVyZV92YWw7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgaWYgKGhlcmVfdmFsID09PSAxNikge1xuICAgICAgICAgICAgLy89PT0gTkVFREJJVFMoaGVyZS5iaXRzICsgMik7XG4gICAgICAgICAgICBuID0gaGVyZV9iaXRzICsgMjtcbiAgICAgICAgICAgIHdoaWxlIChiaXRzIDwgbikge1xuICAgICAgICAgICAgICBpZiAoaGF2ZSA9PT0gMCkgeyBicmVhayBpbmZfbGVhdmU7IH1cbiAgICAgICAgICAgICAgaGF2ZS0tO1xuICAgICAgICAgICAgICBob2xkICs9IGlucHV0W25leHQrK10gPDwgYml0cztcbiAgICAgICAgICAgICAgYml0cyArPSA4O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy89PT0vL1xuICAgICAgICAgICAgLy8tLS0gRFJPUEJJVFMoaGVyZS5iaXRzKSAtLS0vL1xuICAgICAgICAgICAgaG9sZCA+Pj49IGhlcmVfYml0cztcbiAgICAgICAgICAgIGJpdHMgLT0gaGVyZV9iaXRzO1xuICAgICAgICAgICAgLy8tLS0vL1xuICAgICAgICAgICAgaWYgKHN0YXRlLmhhdmUgPT09IDApIHtcbiAgICAgICAgICAgICAgc3RybS5tc2cgPSAnaW52YWxpZCBiaXQgbGVuZ3RoIHJlcGVhdCc7XG4gICAgICAgICAgICAgIHN0YXRlLm1vZGUgPSBCQUQ7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbGVuID0gc3RhdGUubGVuc1tzdGF0ZS5oYXZlIC0gMV07XG4gICAgICAgICAgICBjb3B5ID0gMyArIChob2xkICYgMHgwMyk7Ly9CSVRTKDIpO1xuICAgICAgICAgICAgLy8tLS0gRFJPUEJJVFMoMikgLS0tLy9cbiAgICAgICAgICAgIGhvbGQgPj4+PSAyO1xuICAgICAgICAgICAgYml0cyAtPSAyO1xuICAgICAgICAgICAgLy8tLS0vL1xuICAgICAgICAgIH1cbiAgICAgICAgICBlbHNlIGlmIChoZXJlX3ZhbCA9PT0gMTcpIHtcbiAgICAgICAgICAgIC8vPT09IE5FRURCSVRTKGhlcmUuYml0cyArIDMpO1xuICAgICAgICAgICAgbiA9IGhlcmVfYml0cyArIDM7XG4gICAgICAgICAgICB3aGlsZSAoYml0cyA8IG4pIHtcbiAgICAgICAgICAgICAgaWYgKGhhdmUgPT09IDApIHsgYnJlYWsgaW5mX2xlYXZlOyB9XG4gICAgICAgICAgICAgIGhhdmUtLTtcbiAgICAgICAgICAgICAgaG9sZCArPSBpbnB1dFtuZXh0KytdIDw8IGJpdHM7XG4gICAgICAgICAgICAgIGJpdHMgKz0gODtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vPT09Ly9cbiAgICAgICAgICAgIC8vLS0tIERST1BCSVRTKGhlcmUuYml0cykgLS0tLy9cbiAgICAgICAgICAgIGhvbGQgPj4+PSBoZXJlX2JpdHM7XG4gICAgICAgICAgICBiaXRzIC09IGhlcmVfYml0cztcbiAgICAgICAgICAgIC8vLS0tLy9cbiAgICAgICAgICAgIGxlbiA9IDA7XG4gICAgICAgICAgICBjb3B5ID0gMyArIChob2xkICYgMHgwNyk7Ly9CSVRTKDMpO1xuICAgICAgICAgICAgLy8tLS0gRFJPUEJJVFMoMykgLS0tLy9cbiAgICAgICAgICAgIGhvbGQgPj4+PSAzO1xuICAgICAgICAgICAgYml0cyAtPSAzO1xuICAgICAgICAgICAgLy8tLS0vL1xuICAgICAgICAgIH1cbiAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIC8vPT09IE5FRURCSVRTKGhlcmUuYml0cyArIDcpO1xuICAgICAgICAgICAgbiA9IGhlcmVfYml0cyArIDc7XG4gICAgICAgICAgICB3aGlsZSAoYml0cyA8IG4pIHtcbiAgICAgICAgICAgICAgaWYgKGhhdmUgPT09IDApIHsgYnJlYWsgaW5mX2xlYXZlOyB9XG4gICAgICAgICAgICAgIGhhdmUtLTtcbiAgICAgICAgICAgICAgaG9sZCArPSBpbnB1dFtuZXh0KytdIDw8IGJpdHM7XG4gICAgICAgICAgICAgIGJpdHMgKz0gODtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vPT09Ly9cbiAgICAgICAgICAgIC8vLS0tIERST1BCSVRTKGhlcmUuYml0cykgLS0tLy9cbiAgICAgICAgICAgIGhvbGQgPj4+PSBoZXJlX2JpdHM7XG4gICAgICAgICAgICBiaXRzIC09IGhlcmVfYml0cztcbiAgICAgICAgICAgIC8vLS0tLy9cbiAgICAgICAgICAgIGxlbiA9IDA7XG4gICAgICAgICAgICBjb3B5ID0gMTEgKyAoaG9sZCAmIDB4N2YpOy8vQklUUyg3KTtcbiAgICAgICAgICAgIC8vLS0tIERST1BCSVRTKDcpIC0tLS8vXG4gICAgICAgICAgICBob2xkID4+Pj0gNztcbiAgICAgICAgICAgIGJpdHMgLT0gNztcbiAgICAgICAgICAgIC8vLS0tLy9cbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKHN0YXRlLmhhdmUgKyBjb3B5ID4gc3RhdGUubmxlbiArIHN0YXRlLm5kaXN0KSB7XG4gICAgICAgICAgICBzdHJtLm1zZyA9ICdpbnZhbGlkIGJpdCBsZW5ndGggcmVwZWF0JztcbiAgICAgICAgICAgIHN0YXRlLm1vZGUgPSBCQUQ7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICAgICAgd2hpbGUgKGNvcHktLSkge1xuICAgICAgICAgICAgc3RhdGUubGVuc1tzdGF0ZS5oYXZlKytdID0gbGVuO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvKiBoYW5kbGUgZXJyb3IgYnJlYWtzIGluIHdoaWxlICovXG4gICAgICBpZiAoc3RhdGUubW9kZSA9PT0gQkFEKSB7IGJyZWFrOyB9XG5cbiAgICAgIC8qIGNoZWNrIGZvciBlbmQtb2YtYmxvY2sgY29kZSAoYmV0dGVyIGhhdmUgb25lKSAqL1xuICAgICAgaWYgKHN0YXRlLmxlbnNbMjU2XSA9PT0gMCkge1xuICAgICAgICBzdHJtLm1zZyA9ICdpbnZhbGlkIGNvZGUgLS0gbWlzc2luZyBlbmQtb2YtYmxvY2snO1xuICAgICAgICBzdGF0ZS5tb2RlID0gQkFEO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cblxuICAgICAgLyogYnVpbGQgY29kZSB0YWJsZXMgLS0gbm90ZTogZG8gbm90IGNoYW5nZSB0aGUgbGVuYml0cyBvciBkaXN0Yml0c1xuICAgICAgICAgdmFsdWVzIGhlcmUgKDkgYW5kIDYpIHdpdGhvdXQgcmVhZGluZyB0aGUgY29tbWVudHMgaW4gaW5mdHJlZXMuaFxuICAgICAgICAgY29uY2VybmluZyB0aGUgRU5PVUdIIGNvbnN0YW50cywgd2hpY2ggZGVwZW5kIG9uIHRob3NlIHZhbHVlcyAqL1xuICAgICAgc3RhdGUubGVuYml0cyA9IDk7XG5cbiAgICAgIG9wdHMgPSB7Yml0czogc3RhdGUubGVuYml0c307XG4gICAgICByZXQgPSBpbmZsYXRlX3RhYmxlKExFTlMsIHN0YXRlLmxlbnMsIDAsIHN0YXRlLm5sZW4sIHN0YXRlLmxlbmNvZGUsIDAsIHN0YXRlLndvcmssIG9wdHMpO1xuICAgICAgLy8gV2UgaGF2ZSBzZXBhcmF0ZSB0YWJsZXMgJiBubyBwb2ludGVycy4gMiBjb21tZW50ZWQgbGluZXMgYmVsb3cgbm90IG5lZWRlZC5cbiAgICAgIC8vIHN0YXRlLm5leHRfaW5kZXggPSBvcHRzLnRhYmxlX2luZGV4O1xuICAgICAgc3RhdGUubGVuYml0cyA9IG9wdHMuYml0cztcbiAgICAgIC8vIHN0YXRlLmxlbmNvZGUgPSBzdGF0ZS5uZXh0O1xuXG4gICAgICBpZiAocmV0KSB7XG4gICAgICAgIHN0cm0ubXNnID0gJ2ludmFsaWQgbGl0ZXJhbC9sZW5ndGhzIHNldCc7XG4gICAgICAgIHN0YXRlLm1vZGUgPSBCQUQ7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuXG4gICAgICBzdGF0ZS5kaXN0Yml0cyA9IDY7XG4gICAgICAvL3N0YXRlLmRpc3Rjb2RlLmNvcHkoc3RhdGUuY29kZXMpO1xuICAgICAgLy8gU3dpdGNoIHRvIHVzZSBkeW5hbWljIHRhYmxlXG4gICAgICBzdGF0ZS5kaXN0Y29kZSA9IHN0YXRlLmRpc3RkeW47XG4gICAgICBvcHRzID0ge2JpdHM6IHN0YXRlLmRpc3RiaXRzfTtcbiAgICAgIHJldCA9IGluZmxhdGVfdGFibGUoRElTVFMsIHN0YXRlLmxlbnMsIHN0YXRlLm5sZW4sIHN0YXRlLm5kaXN0LCBzdGF0ZS5kaXN0Y29kZSwgMCwgc3RhdGUud29yaywgb3B0cyk7XG4gICAgICAvLyBXZSBoYXZlIHNlcGFyYXRlIHRhYmxlcyAmIG5vIHBvaW50ZXJzLiAyIGNvbW1lbnRlZCBsaW5lcyBiZWxvdyBub3QgbmVlZGVkLlxuICAgICAgLy8gc3RhdGUubmV4dF9pbmRleCA9IG9wdHMudGFibGVfaW5kZXg7XG4gICAgICBzdGF0ZS5kaXN0Yml0cyA9IG9wdHMuYml0cztcbiAgICAgIC8vIHN0YXRlLmRpc3Rjb2RlID0gc3RhdGUubmV4dDtcblxuICAgICAgaWYgKHJldCkge1xuICAgICAgICBzdHJtLm1zZyA9ICdpbnZhbGlkIGRpc3RhbmNlcyBzZXQnO1xuICAgICAgICBzdGF0ZS5tb2RlID0gQkFEO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIC8vVHJhY2V2KChzdGRlcnIsICdpbmZsYXRlOiAgICAgICBjb2RlcyBva1xcbicpKTtcbiAgICAgIHN0YXRlLm1vZGUgPSBMRU5fO1xuICAgICAgaWYgKGZsdXNoID09PSBaX1RSRUVTKSB7IGJyZWFrIGluZl9sZWF2ZTsgfVxuICAgICAgLyogZmFsbHMgdGhyb3VnaCAqL1xuICAgIGNhc2UgTEVOXzpcbiAgICAgIHN0YXRlLm1vZGUgPSBMRU47XG4gICAgICAvKiBmYWxscyB0aHJvdWdoICovXG4gICAgY2FzZSBMRU46XG4gICAgICBpZiAoaGF2ZSA+PSA2ICYmIGxlZnQgPj0gMjU4KSB7XG4gICAgICAgIC8vLS0tIFJFU1RPUkUoKSAtLS1cbiAgICAgICAgc3RybS5uZXh0X291dCA9IHB1dDtcbiAgICAgICAgc3RybS5hdmFpbF9vdXQgPSBsZWZ0O1xuICAgICAgICBzdHJtLm5leHRfaW4gPSBuZXh0O1xuICAgICAgICBzdHJtLmF2YWlsX2luID0gaGF2ZTtcbiAgICAgICAgc3RhdGUuaG9sZCA9IGhvbGQ7XG4gICAgICAgIHN0YXRlLmJpdHMgPSBiaXRzO1xuICAgICAgICAvLy0tLVxuICAgICAgICBpbmZsYXRlX2Zhc3Qoc3RybSwgX291dCk7XG4gICAgICAgIC8vLS0tIExPQUQoKSAtLS1cbiAgICAgICAgcHV0ID0gc3RybS5uZXh0X291dDtcbiAgICAgICAgb3V0cHV0ID0gc3RybS5vdXRwdXQ7XG4gICAgICAgIGxlZnQgPSBzdHJtLmF2YWlsX291dDtcbiAgICAgICAgbmV4dCA9IHN0cm0ubmV4dF9pbjtcbiAgICAgICAgaW5wdXQgPSBzdHJtLmlucHV0O1xuICAgICAgICBoYXZlID0gc3RybS5hdmFpbF9pbjtcbiAgICAgICAgaG9sZCA9IHN0YXRlLmhvbGQ7XG4gICAgICAgIGJpdHMgPSBzdGF0ZS5iaXRzO1xuICAgICAgICAvLy0tLVxuXG4gICAgICAgIGlmIChzdGF0ZS5tb2RlID09PSBUWVBFKSB7XG4gICAgICAgICAgc3RhdGUuYmFjayA9IC0xO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgc3RhdGUuYmFjayA9IDA7XG4gICAgICBmb3IgKDs7KSB7XG4gICAgICAgIGhlcmUgPSBzdGF0ZS5sZW5jb2RlW2hvbGQgJiAoKDEgPDwgc3RhdGUubGVuYml0cykgLTEpXTsgIC8qQklUUyhzdGF0ZS5sZW5iaXRzKSovXG4gICAgICAgIGhlcmVfYml0cyA9IGhlcmUgPj4+IDI0O1xuICAgICAgICBoZXJlX29wID0gKGhlcmUgPj4+IDE2KSAmIDB4ZmY7XG4gICAgICAgIGhlcmVfdmFsID0gaGVyZSAmIDB4ZmZmZjtcblxuICAgICAgICBpZiAoaGVyZV9iaXRzIDw9IGJpdHMpIHsgYnJlYWs7IH1cbiAgICAgICAgLy8tLS0gUFVMTEJZVEUoKSAtLS0vL1xuICAgICAgICBpZiAoaGF2ZSA9PT0gMCkgeyBicmVhayBpbmZfbGVhdmU7IH1cbiAgICAgICAgaGF2ZS0tO1xuICAgICAgICBob2xkICs9IGlucHV0W25leHQrK10gPDwgYml0cztcbiAgICAgICAgYml0cyArPSA4O1xuICAgICAgICAvLy0tLS8vXG4gICAgICB9XG4gICAgICBpZiAoaGVyZV9vcCAmJiAoaGVyZV9vcCAmIDB4ZjApID09PSAwKSB7XG4gICAgICAgIGxhc3RfYml0cyA9IGhlcmVfYml0cztcbiAgICAgICAgbGFzdF9vcCA9IGhlcmVfb3A7XG4gICAgICAgIGxhc3RfdmFsID0gaGVyZV92YWw7XG4gICAgICAgIGZvciAoOzspIHtcbiAgICAgICAgICBoZXJlID0gc3RhdGUubGVuY29kZVtsYXN0X3ZhbCArXG4gICAgICAgICAgICAgICAgICAoKGhvbGQgJiAoKDEgPDwgKGxhc3RfYml0cyArIGxhc3Rfb3ApKSAtMSkpLypCSVRTKGxhc3QuYml0cyArIGxhc3Qub3ApKi8gPj4gbGFzdF9iaXRzKV07XG4gICAgICAgICAgaGVyZV9iaXRzID0gaGVyZSA+Pj4gMjQ7XG4gICAgICAgICAgaGVyZV9vcCA9IChoZXJlID4+PiAxNikgJiAweGZmO1xuICAgICAgICAgIGhlcmVfdmFsID0gaGVyZSAmIDB4ZmZmZjtcblxuICAgICAgICAgIGlmICgobGFzdF9iaXRzICsgaGVyZV9iaXRzKSA8PSBiaXRzKSB7IGJyZWFrOyB9XG4gICAgICAgICAgLy8tLS0gUFVMTEJZVEUoKSAtLS0vL1xuICAgICAgICAgIGlmIChoYXZlID09PSAwKSB7IGJyZWFrIGluZl9sZWF2ZTsgfVxuICAgICAgICAgIGhhdmUtLTtcbiAgICAgICAgICBob2xkICs9IGlucHV0W25leHQrK10gPDwgYml0cztcbiAgICAgICAgICBiaXRzICs9IDg7XG4gICAgICAgICAgLy8tLS0vL1xuICAgICAgICB9XG4gICAgICAgIC8vLS0tIERST1BCSVRTKGxhc3QuYml0cykgLS0tLy9cbiAgICAgICAgaG9sZCA+Pj49IGxhc3RfYml0cztcbiAgICAgICAgYml0cyAtPSBsYXN0X2JpdHM7XG4gICAgICAgIC8vLS0tLy9cbiAgICAgICAgc3RhdGUuYmFjayArPSBsYXN0X2JpdHM7XG4gICAgICB9XG4gICAgICAvLy0tLSBEUk9QQklUUyhoZXJlLmJpdHMpIC0tLS8vXG4gICAgICBob2xkID4+Pj0gaGVyZV9iaXRzO1xuICAgICAgYml0cyAtPSBoZXJlX2JpdHM7XG4gICAgICAvLy0tLS8vXG4gICAgICBzdGF0ZS5iYWNrICs9IGhlcmVfYml0cztcbiAgICAgIHN0YXRlLmxlbmd0aCA9IGhlcmVfdmFsO1xuICAgICAgaWYgKGhlcmVfb3AgPT09IDApIHtcbiAgICAgICAgLy9UcmFjZXZ2KChzdGRlcnIsIGhlcmUudmFsID49IDB4MjAgJiYgaGVyZS52YWwgPCAweDdmID9cbiAgICAgICAgLy8gICAgICAgIFwiaW5mbGF0ZTogICAgICAgICBsaXRlcmFsICclYydcXG5cIiA6XG4gICAgICAgIC8vICAgICAgICBcImluZmxhdGU6ICAgICAgICAgbGl0ZXJhbCAweCUwMnhcXG5cIiwgaGVyZS52YWwpKTtcbiAgICAgICAgc3RhdGUubW9kZSA9IExJVDtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBpZiAoaGVyZV9vcCAmIDMyKSB7XG4gICAgICAgIC8vVHJhY2V2digoc3RkZXJyLCBcImluZmxhdGU6ICAgICAgICAgZW5kIG9mIGJsb2NrXFxuXCIpKTtcbiAgICAgICAgc3RhdGUuYmFjayA9IC0xO1xuICAgICAgICBzdGF0ZS5tb2RlID0gVFlQRTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBpZiAoaGVyZV9vcCAmIDY0KSB7XG4gICAgICAgIHN0cm0ubXNnID0gJ2ludmFsaWQgbGl0ZXJhbC9sZW5ndGggY29kZSc7XG4gICAgICAgIHN0YXRlLm1vZGUgPSBCQUQ7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgc3RhdGUuZXh0cmEgPSBoZXJlX29wICYgMTU7XG4gICAgICBzdGF0ZS5tb2RlID0gTEVORVhUO1xuICAgICAgLyogZmFsbHMgdGhyb3VnaCAqL1xuICAgIGNhc2UgTEVORVhUOlxuICAgICAgaWYgKHN0YXRlLmV4dHJhKSB7XG4gICAgICAgIC8vPT09IE5FRURCSVRTKHN0YXRlLmV4dHJhKTtcbiAgICAgICAgbiA9IHN0YXRlLmV4dHJhO1xuICAgICAgICB3aGlsZSAoYml0cyA8IG4pIHtcbiAgICAgICAgICBpZiAoaGF2ZSA9PT0gMCkgeyBicmVhayBpbmZfbGVhdmU7IH1cbiAgICAgICAgICBoYXZlLS07XG4gICAgICAgICAgaG9sZCArPSBpbnB1dFtuZXh0KytdIDw8IGJpdHM7XG4gICAgICAgICAgYml0cyArPSA4O1xuICAgICAgICB9XG4gICAgICAgIC8vPT09Ly9cbiAgICAgICAgc3RhdGUubGVuZ3RoICs9IGhvbGQgJiAoKDEgPDwgc3RhdGUuZXh0cmEpIC0xKS8qQklUUyhzdGF0ZS5leHRyYSkqLztcbiAgICAgICAgLy8tLS0gRFJPUEJJVFMoc3RhdGUuZXh0cmEpIC0tLS8vXG4gICAgICAgIGhvbGQgPj4+PSBzdGF0ZS5leHRyYTtcbiAgICAgICAgYml0cyAtPSBzdGF0ZS5leHRyYTtcbiAgICAgICAgLy8tLS0vL1xuICAgICAgICBzdGF0ZS5iYWNrICs9IHN0YXRlLmV4dHJhO1xuICAgICAgfVxuICAgICAgLy9UcmFjZXZ2KChzdGRlcnIsIFwiaW5mbGF0ZTogICAgICAgICBsZW5ndGggJXVcXG5cIiwgc3RhdGUubGVuZ3RoKSk7XG4gICAgICBzdGF0ZS53YXMgPSBzdGF0ZS5sZW5ndGg7XG4gICAgICBzdGF0ZS5tb2RlID0gRElTVDtcbiAgICAgIC8qIGZhbGxzIHRocm91Z2ggKi9cbiAgICBjYXNlIERJU1Q6XG4gICAgICBmb3IgKDs7KSB7XG4gICAgICAgIGhlcmUgPSBzdGF0ZS5kaXN0Y29kZVtob2xkICYgKCgxIDw8IHN0YXRlLmRpc3RiaXRzKSAtMSldOy8qQklUUyhzdGF0ZS5kaXN0Yml0cykqL1xuICAgICAgICBoZXJlX2JpdHMgPSBoZXJlID4+PiAyNDtcbiAgICAgICAgaGVyZV9vcCA9IChoZXJlID4+PiAxNikgJiAweGZmO1xuICAgICAgICBoZXJlX3ZhbCA9IGhlcmUgJiAweGZmZmY7XG5cbiAgICAgICAgaWYgKChoZXJlX2JpdHMpIDw9IGJpdHMpIHsgYnJlYWs7IH1cbiAgICAgICAgLy8tLS0gUFVMTEJZVEUoKSAtLS0vL1xuICAgICAgICBpZiAoaGF2ZSA9PT0gMCkgeyBicmVhayBpbmZfbGVhdmU7IH1cbiAgICAgICAgaGF2ZS0tO1xuICAgICAgICBob2xkICs9IGlucHV0W25leHQrK10gPDwgYml0cztcbiAgICAgICAgYml0cyArPSA4O1xuICAgICAgICAvLy0tLS8vXG4gICAgICB9XG4gICAgICBpZiAoKGhlcmVfb3AgJiAweGYwKSA9PT0gMCkge1xuICAgICAgICBsYXN0X2JpdHMgPSBoZXJlX2JpdHM7XG4gICAgICAgIGxhc3Rfb3AgPSBoZXJlX29wO1xuICAgICAgICBsYXN0X3ZhbCA9IGhlcmVfdmFsO1xuICAgICAgICBmb3IgKDs7KSB7XG4gICAgICAgICAgaGVyZSA9IHN0YXRlLmRpc3Rjb2RlW2xhc3RfdmFsICtcbiAgICAgICAgICAgICAgICAgICgoaG9sZCAmICgoMSA8PCAobGFzdF9iaXRzICsgbGFzdF9vcCkpIC0xKSkvKkJJVFMobGFzdC5iaXRzICsgbGFzdC5vcCkqLyA+PiBsYXN0X2JpdHMpXTtcbiAgICAgICAgICBoZXJlX2JpdHMgPSBoZXJlID4+PiAyNDtcbiAgICAgICAgICBoZXJlX29wID0gKGhlcmUgPj4+IDE2KSAmIDB4ZmY7XG4gICAgICAgICAgaGVyZV92YWwgPSBoZXJlICYgMHhmZmZmO1xuXG4gICAgICAgICAgaWYgKChsYXN0X2JpdHMgKyBoZXJlX2JpdHMpIDw9IGJpdHMpIHsgYnJlYWs7IH1cbiAgICAgICAgICAvLy0tLSBQVUxMQllURSgpIC0tLS8vXG4gICAgICAgICAgaWYgKGhhdmUgPT09IDApIHsgYnJlYWsgaW5mX2xlYXZlOyB9XG4gICAgICAgICAgaGF2ZS0tO1xuICAgICAgICAgIGhvbGQgKz0gaW5wdXRbbmV4dCsrXSA8PCBiaXRzO1xuICAgICAgICAgIGJpdHMgKz0gODtcbiAgICAgICAgICAvLy0tLS8vXG4gICAgICAgIH1cbiAgICAgICAgLy8tLS0gRFJPUEJJVFMobGFzdC5iaXRzKSAtLS0vL1xuICAgICAgICBob2xkID4+Pj0gbGFzdF9iaXRzO1xuICAgICAgICBiaXRzIC09IGxhc3RfYml0cztcbiAgICAgICAgLy8tLS0vL1xuICAgICAgICBzdGF0ZS5iYWNrICs9IGxhc3RfYml0cztcbiAgICAgIH1cbiAgICAgIC8vLS0tIERST1BCSVRTKGhlcmUuYml0cykgLS0tLy9cbiAgICAgIGhvbGQgPj4+PSBoZXJlX2JpdHM7XG4gICAgICBiaXRzIC09IGhlcmVfYml0cztcbiAgICAgIC8vLS0tLy9cbiAgICAgIHN0YXRlLmJhY2sgKz0gaGVyZV9iaXRzO1xuICAgICAgaWYgKGhlcmVfb3AgJiA2NCkge1xuICAgICAgICBzdHJtLm1zZyA9ICdpbnZhbGlkIGRpc3RhbmNlIGNvZGUnO1xuICAgICAgICBzdGF0ZS5tb2RlID0gQkFEO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIHN0YXRlLm9mZnNldCA9IGhlcmVfdmFsO1xuICAgICAgc3RhdGUuZXh0cmEgPSAoaGVyZV9vcCkgJiAxNTtcbiAgICAgIHN0YXRlLm1vZGUgPSBESVNURVhUO1xuICAgICAgLyogZmFsbHMgdGhyb3VnaCAqL1xuICAgIGNhc2UgRElTVEVYVDpcbiAgICAgIGlmIChzdGF0ZS5leHRyYSkge1xuICAgICAgICAvLz09PSBORUVEQklUUyhzdGF0ZS5leHRyYSk7XG4gICAgICAgIG4gPSBzdGF0ZS5leHRyYTtcbiAgICAgICAgd2hpbGUgKGJpdHMgPCBuKSB7XG4gICAgICAgICAgaWYgKGhhdmUgPT09IDApIHsgYnJlYWsgaW5mX2xlYXZlOyB9XG4gICAgICAgICAgaGF2ZS0tO1xuICAgICAgICAgIGhvbGQgKz0gaW5wdXRbbmV4dCsrXSA8PCBiaXRzO1xuICAgICAgICAgIGJpdHMgKz0gODtcbiAgICAgICAgfVxuICAgICAgICAvLz09PS8vXG4gICAgICAgIHN0YXRlLm9mZnNldCArPSBob2xkICYgKCgxIDw8IHN0YXRlLmV4dHJhKSAtMSkvKkJJVFMoc3RhdGUuZXh0cmEpKi87XG4gICAgICAgIC8vLS0tIERST1BCSVRTKHN0YXRlLmV4dHJhKSAtLS0vL1xuICAgICAgICBob2xkID4+Pj0gc3RhdGUuZXh0cmE7XG4gICAgICAgIGJpdHMgLT0gc3RhdGUuZXh0cmE7XG4gICAgICAgIC8vLS0tLy9cbiAgICAgICAgc3RhdGUuYmFjayArPSBzdGF0ZS5leHRyYTtcbiAgICAgIH1cbi8vI2lmZGVmIElORkxBVEVfU1RSSUNUXG4gICAgICBpZiAoc3RhdGUub2Zmc2V0ID4gc3RhdGUuZG1heCkge1xuICAgICAgICBzdHJtLm1zZyA9ICdpbnZhbGlkIGRpc3RhbmNlIHRvbyBmYXIgYmFjayc7XG4gICAgICAgIHN0YXRlLm1vZGUgPSBCQUQ7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuLy8jZW5kaWZcbiAgICAgIC8vVHJhY2V2digoc3RkZXJyLCBcImluZmxhdGU6ICAgICAgICAgZGlzdGFuY2UgJXVcXG5cIiwgc3RhdGUub2Zmc2V0KSk7XG4gICAgICBzdGF0ZS5tb2RlID0gTUFUQ0g7XG4gICAgICAvKiBmYWxscyB0aHJvdWdoICovXG4gICAgY2FzZSBNQVRDSDpcbiAgICAgIGlmIChsZWZ0ID09PSAwKSB7IGJyZWFrIGluZl9sZWF2ZTsgfVxuICAgICAgY29weSA9IF9vdXQgLSBsZWZ0O1xuICAgICAgaWYgKHN0YXRlLm9mZnNldCA+IGNvcHkpIHsgICAgICAgICAvKiBjb3B5IGZyb20gd2luZG93ICovXG4gICAgICAgIGNvcHkgPSBzdGF0ZS5vZmZzZXQgLSBjb3B5O1xuICAgICAgICBpZiAoY29weSA+IHN0YXRlLndoYXZlKSB7XG4gICAgICAgICAgaWYgKHN0YXRlLnNhbmUpIHtcbiAgICAgICAgICAgIHN0cm0ubXNnID0gJ2ludmFsaWQgZGlzdGFuY2UgdG9vIGZhciBiYWNrJztcbiAgICAgICAgICAgIHN0YXRlLm1vZGUgPSBCQUQ7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4vLyAoISkgVGhpcyBibG9jayBpcyBkaXNhYmxlZCBpbiB6bGliIGRlZmFpbHRzLFxuLy8gZG9uJ3QgZW5hYmxlIGl0IGZvciBiaW5hcnkgY29tcGF0aWJpbGl0eVxuLy8jaWZkZWYgSU5GTEFURV9BTExPV19JTlZBTElEX0RJU1RBTkNFX1RPT0ZBUl9BUlJSXG4vLyAgICAgICAgICBUcmFjZSgoc3RkZXJyLCBcImluZmxhdGUuYyB0b28gZmFyXFxuXCIpKTtcbi8vICAgICAgICAgIGNvcHkgLT0gc3RhdGUud2hhdmU7XG4vLyAgICAgICAgICBpZiAoY29weSA+IHN0YXRlLmxlbmd0aCkgeyBjb3B5ID0gc3RhdGUubGVuZ3RoOyB9XG4vLyAgICAgICAgICBpZiAoY29weSA+IGxlZnQpIHsgY29weSA9IGxlZnQ7IH1cbi8vICAgICAgICAgIGxlZnQgLT0gY29weTtcbi8vICAgICAgICAgIHN0YXRlLmxlbmd0aCAtPSBjb3B5O1xuLy8gICAgICAgICAgZG8ge1xuLy8gICAgICAgICAgICBvdXRwdXRbcHV0KytdID0gMDtcbi8vICAgICAgICAgIH0gd2hpbGUgKC0tY29weSk7XG4vLyAgICAgICAgICBpZiAoc3RhdGUubGVuZ3RoID09PSAwKSB7IHN0YXRlLm1vZGUgPSBMRU47IH1cbi8vICAgICAgICAgIGJyZWFrO1xuLy8jZW5kaWZcbiAgICAgICAgfVxuICAgICAgICBpZiAoY29weSA+IHN0YXRlLnduZXh0KSB7XG4gICAgICAgICAgY29weSAtPSBzdGF0ZS53bmV4dDtcbiAgICAgICAgICBmcm9tID0gc3RhdGUud3NpemUgLSBjb3B5O1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgIGZyb20gPSBzdGF0ZS53bmV4dCAtIGNvcHk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGNvcHkgPiBzdGF0ZS5sZW5ndGgpIHsgY29weSA9IHN0YXRlLmxlbmd0aDsgfVxuICAgICAgICBmcm9tX3NvdXJjZSA9IHN0YXRlLndpbmRvdztcbiAgICAgIH1cbiAgICAgIGVsc2UgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGNvcHkgZnJvbSBvdXRwdXQgKi9cbiAgICAgICAgZnJvbV9zb3VyY2UgPSBvdXRwdXQ7XG4gICAgICAgIGZyb20gPSBwdXQgLSBzdGF0ZS5vZmZzZXQ7XG4gICAgICAgIGNvcHkgPSBzdGF0ZS5sZW5ndGg7XG4gICAgICB9XG4gICAgICBpZiAoY29weSA+IGxlZnQpIHsgY29weSA9IGxlZnQ7IH1cbiAgICAgIGxlZnQgLT0gY29weTtcbiAgICAgIHN0YXRlLmxlbmd0aCAtPSBjb3B5O1xuICAgICAgZG8ge1xuICAgICAgICBvdXRwdXRbcHV0KytdID0gZnJvbV9zb3VyY2VbZnJvbSsrXTtcbiAgICAgIH0gd2hpbGUgKC0tY29weSk7XG4gICAgICBpZiAoc3RhdGUubGVuZ3RoID09PSAwKSB7IHN0YXRlLm1vZGUgPSBMRU47IH1cbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgTElUOlxuICAgICAgaWYgKGxlZnQgPT09IDApIHsgYnJlYWsgaW5mX2xlYXZlOyB9XG4gICAgICBvdXRwdXRbcHV0KytdID0gc3RhdGUubGVuZ3RoO1xuICAgICAgbGVmdC0tO1xuICAgICAgc3RhdGUubW9kZSA9IExFTjtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgQ0hFQ0s6XG4gICAgICBpZiAoc3RhdGUud3JhcCkge1xuICAgICAgICAvLz09PSBORUVEQklUUygzMik7XG4gICAgICAgIHdoaWxlIChiaXRzIDwgMzIpIHtcbiAgICAgICAgICBpZiAoaGF2ZSA9PT0gMCkgeyBicmVhayBpbmZfbGVhdmU7IH1cbiAgICAgICAgICBoYXZlLS07XG4gICAgICAgICAgLy8gVXNlICd8JyBpbnNkZWFkIG9mICcrJyB0byBtYWtlIHN1cmUgdGhhdCByZXN1bHQgaXMgc2lnbmVkXG4gICAgICAgICAgaG9sZCB8PSBpbnB1dFtuZXh0KytdIDw8IGJpdHM7XG4gICAgICAgICAgYml0cyArPSA4O1xuICAgICAgICB9XG4gICAgICAgIC8vPT09Ly9cbiAgICAgICAgX291dCAtPSBsZWZ0O1xuICAgICAgICBzdHJtLnRvdGFsX291dCArPSBfb3V0O1xuICAgICAgICBzdGF0ZS50b3RhbCArPSBfb3V0O1xuICAgICAgICBpZiAoX291dCkge1xuICAgICAgICAgIHN0cm0uYWRsZXIgPSBzdGF0ZS5jaGVjayA9XG4gICAgICAgICAgICAgIC8qVVBEQVRFKHN0YXRlLmNoZWNrLCBwdXQgLSBfb3V0LCBfb3V0KTsqL1xuICAgICAgICAgICAgICAoc3RhdGUuZmxhZ3MgPyBjcmMzMihzdGF0ZS5jaGVjaywgb3V0cHV0LCBfb3V0LCBwdXQgLSBfb3V0KSA6IGFkbGVyMzIoc3RhdGUuY2hlY2ssIG91dHB1dCwgX291dCwgcHV0IC0gX291dCkpO1xuXG4gICAgICAgIH1cbiAgICAgICAgX291dCA9IGxlZnQ7XG4gICAgICAgIC8vIE5COiBjcmMzMiBzdG9yZWQgYXMgc2lnbmVkIDMyLWJpdCBpbnQsIFpTV0FQMzIgcmV0dXJucyBzaWduZWQgdG9vXG4gICAgICAgIGlmICgoc3RhdGUuZmxhZ3MgPyBob2xkIDogWlNXQVAzMihob2xkKSkgIT09IHN0YXRlLmNoZWNrKSB7XG4gICAgICAgICAgc3RybS5tc2cgPSAnaW5jb3JyZWN0IGRhdGEgY2hlY2snO1xuICAgICAgICAgIHN0YXRlLm1vZGUgPSBCQUQ7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgLy89PT0gSU5JVEJJVFMoKTtcbiAgICAgICAgaG9sZCA9IDA7XG4gICAgICAgIGJpdHMgPSAwO1xuICAgICAgICAvLz09PS8vXG4gICAgICAgIC8vVHJhY2V2KChzdGRlcnIsIFwiaW5mbGF0ZTogICBjaGVjayBtYXRjaGVzIHRyYWlsZXJcXG5cIikpO1xuICAgICAgfVxuICAgICAgc3RhdGUubW9kZSA9IExFTkdUSDtcbiAgICAgIC8qIGZhbGxzIHRocm91Z2ggKi9cbiAgICBjYXNlIExFTkdUSDpcbiAgICAgIGlmIChzdGF0ZS53cmFwICYmIHN0YXRlLmZsYWdzKSB7XG4gICAgICAgIC8vPT09IE5FRURCSVRTKDMyKTtcbiAgICAgICAgd2hpbGUgKGJpdHMgPCAzMikge1xuICAgICAgICAgIGlmIChoYXZlID09PSAwKSB7IGJyZWFrIGluZl9sZWF2ZTsgfVxuICAgICAgICAgIGhhdmUtLTtcbiAgICAgICAgICBob2xkICs9IGlucHV0W25leHQrK10gPDwgYml0cztcbiAgICAgICAgICBiaXRzICs9IDg7XG4gICAgICAgIH1cbiAgICAgICAgLy89PT0vL1xuICAgICAgICBpZiAoaG9sZCAhPT0gKHN0YXRlLnRvdGFsICYgMHhmZmZmZmZmZikpIHtcbiAgICAgICAgICBzdHJtLm1zZyA9ICdpbmNvcnJlY3QgbGVuZ3RoIGNoZWNrJztcbiAgICAgICAgICBzdGF0ZS5tb2RlID0gQkFEO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIC8vPT09IElOSVRCSVRTKCk7XG4gICAgICAgIGhvbGQgPSAwO1xuICAgICAgICBiaXRzID0gMDtcbiAgICAgICAgLy89PT0vL1xuICAgICAgICAvL1RyYWNldigoc3RkZXJyLCBcImluZmxhdGU6ICAgbGVuZ3RoIG1hdGNoZXMgdHJhaWxlclxcblwiKSk7XG4gICAgICB9XG4gICAgICBzdGF0ZS5tb2RlID0gRE9ORTtcbiAgICAgIC8qIGZhbGxzIHRocm91Z2ggKi9cbiAgICBjYXNlIERPTkU6XG4gICAgICByZXQgPSBaX1NUUkVBTV9FTkQ7XG4gICAgICBicmVhayBpbmZfbGVhdmU7XG4gICAgY2FzZSBCQUQ6XG4gICAgICByZXQgPSBaX0RBVEFfRVJST1I7XG4gICAgICBicmVhayBpbmZfbGVhdmU7XG4gICAgY2FzZSBNRU06XG4gICAgICByZXR1cm4gWl9NRU1fRVJST1I7XG4gICAgY2FzZSBTWU5DOlxuICAgICAgLyogZmFsbHMgdGhyb3VnaCAqL1xuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4gWl9TVFJFQU1fRVJST1I7XG4gICAgfVxuICB9XG5cbiAgLy8gaW5mX2xlYXZlIDwtIGhlcmUgaXMgcmVhbCBwbGFjZSBmb3IgXCJnb3RvIGluZl9sZWF2ZVwiLCBlbXVsYXRlZCB2aWEgXCJicmVhayBpbmZfbGVhdmVcIlxuXG4gIC8qXG4gICAgIFJldHVybiBmcm9tIGluZmxhdGUoKSwgdXBkYXRpbmcgdGhlIHRvdGFsIGNvdW50cyBhbmQgdGhlIGNoZWNrIHZhbHVlLlxuICAgICBJZiB0aGVyZSB3YXMgbm8gcHJvZ3Jlc3MgZHVyaW5nIHRoZSBpbmZsYXRlKCkgY2FsbCwgcmV0dXJuIGEgYnVmZmVyXG4gICAgIGVycm9yLiAgQ2FsbCB1cGRhdGV3aW5kb3coKSB0byBjcmVhdGUgYW5kL29yIHVwZGF0ZSB0aGUgd2luZG93IHN0YXRlLlxuICAgICBOb3RlOiBhIG1lbW9yeSBlcnJvciBmcm9tIGluZmxhdGUoKSBpcyBub24tcmVjb3ZlcmFibGUuXG4gICAqL1xuXG4gIC8vLS0tIFJFU1RPUkUoKSAtLS1cbiAgc3RybS5uZXh0X291dCA9IHB1dDtcbiAgc3RybS5hdmFpbF9vdXQgPSBsZWZ0O1xuICBzdHJtLm5leHRfaW4gPSBuZXh0O1xuICBzdHJtLmF2YWlsX2luID0gaGF2ZTtcbiAgc3RhdGUuaG9sZCA9IGhvbGQ7XG4gIHN0YXRlLmJpdHMgPSBiaXRzO1xuICAvLy0tLVxuXG4gIGlmIChzdGF0ZS53c2l6ZSB8fCAoX291dCAhPT0gc3RybS5hdmFpbF9vdXQgJiYgc3RhdGUubW9kZSA8IEJBRCAmJlxuICAgICAgICAgICAgICAgICAgICAgIChzdGF0ZS5tb2RlIDwgQ0hFQ0sgfHwgZmx1c2ggIT09IFpfRklOSVNIKSkpIHtcbiAgICBpZiAodXBkYXRld2luZG93KHN0cm0sIHN0cm0ub3V0cHV0LCBzdHJtLm5leHRfb3V0LCBfb3V0IC0gc3RybS5hdmFpbF9vdXQpKSB7XG4gICAgICBzdGF0ZS5tb2RlID0gTUVNO1xuICAgICAgcmV0dXJuIFpfTUVNX0VSUk9SO1xuICAgIH1cbiAgfVxuICBfaW4gLT0gc3RybS5hdmFpbF9pbjtcbiAgX291dCAtPSBzdHJtLmF2YWlsX291dDtcbiAgc3RybS50b3RhbF9pbiArPSBfaW47XG4gIHN0cm0udG90YWxfb3V0ICs9IF9vdXQ7XG4gIHN0YXRlLnRvdGFsICs9IF9vdXQ7XG4gIGlmIChzdGF0ZS53cmFwICYmIF9vdXQpIHtcbiAgICBzdHJtLmFkbGVyID0gc3RhdGUuY2hlY2sgPSAvKlVQREFURShzdGF0ZS5jaGVjaywgc3RybS5uZXh0X291dCAtIF9vdXQsIF9vdXQpOyovXG4gICAgICAoc3RhdGUuZmxhZ3MgPyBjcmMzMihzdGF0ZS5jaGVjaywgb3V0cHV0LCBfb3V0LCBzdHJtLm5leHRfb3V0IC0gX291dCkgOiBhZGxlcjMyKHN0YXRlLmNoZWNrLCBvdXRwdXQsIF9vdXQsIHN0cm0ubmV4dF9vdXQgLSBfb3V0KSk7XG4gIH1cbiAgc3RybS5kYXRhX3R5cGUgPSBzdGF0ZS5iaXRzICsgKHN0YXRlLmxhc3QgPyA2NCA6IDApICtcbiAgICAgICAgICAgICAgICAgICAgKHN0YXRlLm1vZGUgPT09IFRZUEUgPyAxMjggOiAwKSArXG4gICAgICAgICAgICAgICAgICAgIChzdGF0ZS5tb2RlID09PSBMRU5fIHx8IHN0YXRlLm1vZGUgPT09IENPUFlfID8gMjU2IDogMCk7XG4gIGlmICgoKF9pbiA9PT0gMCAmJiBfb3V0ID09PSAwKSB8fCBmbHVzaCA9PT0gWl9GSU5JU0gpICYmIHJldCA9PT0gWl9PSykge1xuICAgIHJldCA9IFpfQlVGX0VSUk9SO1xuICB9XG4gIHJldHVybiByZXQ7XG59XG5cbmZ1bmN0aW9uIGluZmxhdGVFbmQoc3RybSkge1xuXG4gIGlmICghc3RybSB8fCAhc3RybS5zdGF0ZSAvKnx8IHN0cm0tPnpmcmVlID09IChmcmVlX2Z1bmMpMCovKSB7XG4gICAgcmV0dXJuIFpfU1RSRUFNX0VSUk9SO1xuICB9XG5cbiAgdmFyIHN0YXRlID0gc3RybS5zdGF0ZTtcbiAgaWYgKHN0YXRlLndpbmRvdykge1xuICAgIHN0YXRlLndpbmRvdyA9IG51bGw7XG4gIH1cbiAgc3RybS5zdGF0ZSA9IG51bGw7XG4gIHJldHVybiBaX09LO1xufVxuXG5mdW5jdGlvbiBpbmZsYXRlR2V0SGVhZGVyKHN0cm0sIGhlYWQpIHtcbiAgdmFyIHN0YXRlO1xuXG4gIC8qIGNoZWNrIHN0YXRlICovXG4gIGlmICghc3RybSB8fCAhc3RybS5zdGF0ZSkgeyByZXR1cm4gWl9TVFJFQU1fRVJST1I7IH1cbiAgc3RhdGUgPSBzdHJtLnN0YXRlO1xuICBpZiAoKHN0YXRlLndyYXAgJiAyKSA9PT0gMCkgeyByZXR1cm4gWl9TVFJFQU1fRVJST1I7IH1cblxuICAvKiBzYXZlIGhlYWRlciBzdHJ1Y3R1cmUgKi9cbiAgc3RhdGUuaGVhZCA9IGhlYWQ7XG4gIGhlYWQuZG9uZSA9IGZhbHNlO1xuICByZXR1cm4gWl9PSztcbn1cblxuXG5leHBvcnRzLmluZmxhdGVSZXNldCA9IGluZmxhdGVSZXNldDtcbmV4cG9ydHMuaW5mbGF0ZVJlc2V0MiA9IGluZmxhdGVSZXNldDI7XG5leHBvcnRzLmluZmxhdGVSZXNldEtlZXAgPSBpbmZsYXRlUmVzZXRLZWVwO1xuZXhwb3J0cy5pbmZsYXRlSW5pdCA9IGluZmxhdGVJbml0O1xuZXhwb3J0cy5pbmZsYXRlSW5pdDIgPSBpbmZsYXRlSW5pdDI7XG5leHBvcnRzLmluZmxhdGUgPSBpbmZsYXRlO1xuZXhwb3J0cy5pbmZsYXRlRW5kID0gaW5mbGF0ZUVuZDtcbmV4cG9ydHMuaW5mbGF0ZUdldEhlYWRlciA9IGluZmxhdGVHZXRIZWFkZXI7XG5leHBvcnRzLmluZmxhdGVJbmZvID0gJ3Bha28gaW5mbGF0ZSAoZnJvbSBOb2RlY2EgcHJvamVjdCknO1xuXG4vKiBOb3QgaW1wbGVtZW50ZWRcbmV4cG9ydHMuaW5mbGF0ZUNvcHkgPSBpbmZsYXRlQ29weTtcbmV4cG9ydHMuaW5mbGF0ZUdldERpY3Rpb25hcnkgPSBpbmZsYXRlR2V0RGljdGlvbmFyeTtcbmV4cG9ydHMuaW5mbGF0ZU1hcmsgPSBpbmZsYXRlTWFyaztcbmV4cG9ydHMuaW5mbGF0ZVByaW1lID0gaW5mbGF0ZVByaW1lO1xuZXhwb3J0cy5pbmZsYXRlU2V0RGljdGlvbmFyeSA9IGluZmxhdGVTZXREaWN0aW9uYXJ5O1xuZXhwb3J0cy5pbmZsYXRlU3luYyA9IGluZmxhdGVTeW5jO1xuZXhwb3J0cy5pbmZsYXRlU3luY1BvaW50ID0gaW5mbGF0ZVN5bmNQb2ludDtcbmV4cG9ydHMuaW5mbGF0ZVVuZGVybWluZSA9IGluZmxhdGVVbmRlcm1pbmU7XG4qL1xufSx7XCIuLi91dGlscy9jb21tb25cIjoyNyxcIi4vYWRsZXIzMlwiOjI5LFwiLi9jcmMzMlwiOjMxLFwiLi9pbmZmYXN0XCI6MzQsXCIuL2luZnRyZWVzXCI6MzZ9XSwzNjpbZnVuY3Rpb24oX2RlcmVxXyxtb2R1bGUsZXhwb3J0cyl7XG4ndXNlIHN0cmljdCc7XG5cblxudmFyIHV0aWxzID0gX2RlcmVxXygnLi4vdXRpbHMvY29tbW9uJyk7XG5cbnZhciBNQVhCSVRTID0gMTU7XG52YXIgRU5PVUdIX0xFTlMgPSA4NTI7XG52YXIgRU5PVUdIX0RJU1RTID0gNTkyO1xuLy92YXIgRU5PVUdIID0gKEVOT1VHSF9MRU5TK0VOT1VHSF9ESVNUUyk7XG5cbnZhciBDT0RFUyA9IDA7XG52YXIgTEVOUyA9IDE7XG52YXIgRElTVFMgPSAyO1xuXG52YXIgbGJhc2UgPSBbIC8qIExlbmd0aCBjb2RlcyAyNTcuLjI4NSBiYXNlICovXG4gIDMsIDQsIDUsIDYsIDcsIDgsIDksIDEwLCAxMSwgMTMsIDE1LCAxNywgMTksIDIzLCAyNywgMzEsXG4gIDM1LCA0MywgNTEsIDU5LCA2NywgODMsIDk5LCAxMTUsIDEzMSwgMTYzLCAxOTUsIDIyNywgMjU4LCAwLCAwXG5dO1xuXG52YXIgbGV4dCA9IFsgLyogTGVuZ3RoIGNvZGVzIDI1Ny4uMjg1IGV4dHJhICovXG4gIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTcsIDE3LCAxNywgMTcsIDE4LCAxOCwgMTgsIDE4LFxuICAxOSwgMTksIDE5LCAxOSwgMjAsIDIwLCAyMCwgMjAsIDIxLCAyMSwgMjEsIDIxLCAxNiwgNzIsIDc4XG5dO1xuXG52YXIgZGJhc2UgPSBbIC8qIERpc3RhbmNlIGNvZGVzIDAuLjI5IGJhc2UgKi9cbiAgMSwgMiwgMywgNCwgNSwgNywgOSwgMTMsIDE3LCAyNSwgMzMsIDQ5LCA2NSwgOTcsIDEyOSwgMTkzLFxuICAyNTcsIDM4NSwgNTEzLCA3NjksIDEwMjUsIDE1MzcsIDIwNDksIDMwNzMsIDQwOTcsIDYxNDUsXG4gIDgxOTMsIDEyMjg5LCAxNjM4NSwgMjQ1NzcsIDAsIDBcbl07XG5cbnZhciBkZXh0ID0gWyAvKiBEaXN0YW5jZSBjb2RlcyAwLi4yOSBleHRyYSAqL1xuICAxNiwgMTYsIDE2LCAxNiwgMTcsIDE3LCAxOCwgMTgsIDE5LCAxOSwgMjAsIDIwLCAyMSwgMjEsIDIyLCAyMixcbiAgMjMsIDIzLCAyNCwgMjQsIDI1LCAyNSwgMjYsIDI2LCAyNywgMjcsXG4gIDI4LCAyOCwgMjksIDI5LCA2NCwgNjRcbl07XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gaW5mbGF0ZV90YWJsZSh0eXBlLCBsZW5zLCBsZW5zX2luZGV4LCBjb2RlcywgdGFibGUsIHRhYmxlX2luZGV4LCB3b3JrLCBvcHRzKVxue1xuICB2YXIgYml0cyA9IG9wdHMuYml0cztcbiAgICAgIC8vaGVyZSA9IG9wdHMuaGVyZTsgLyogdGFibGUgZW50cnkgZm9yIGR1cGxpY2F0aW9uICovXG5cbiAgdmFyIGxlbiA9IDA7ICAgICAgICAgICAgICAgLyogYSBjb2RlJ3MgbGVuZ3RoIGluIGJpdHMgKi9cbiAgdmFyIHN5bSA9IDA7ICAgICAgICAgICAgICAgLyogaW5kZXggb2YgY29kZSBzeW1ib2xzICovXG4gIHZhciBtaW4gPSAwLCBtYXggPSAwOyAgICAgICAgICAvKiBtaW5pbXVtIGFuZCBtYXhpbXVtIGNvZGUgbGVuZ3RocyAqL1xuICB2YXIgcm9vdCA9IDA7ICAgICAgICAgICAgICAvKiBudW1iZXIgb2YgaW5kZXggYml0cyBmb3Igcm9vdCB0YWJsZSAqL1xuICB2YXIgY3VyciA9IDA7ICAgICAgICAgICAgICAvKiBudW1iZXIgb2YgaW5kZXggYml0cyBmb3IgY3VycmVudCB0YWJsZSAqL1xuICB2YXIgZHJvcCA9IDA7ICAgICAgICAgICAgICAvKiBjb2RlIGJpdHMgdG8gZHJvcCBmb3Igc3ViLXRhYmxlICovXG4gIHZhciBsZWZ0ID0gMDsgICAgICAgICAgICAgICAgICAgLyogbnVtYmVyIG9mIHByZWZpeCBjb2RlcyBhdmFpbGFibGUgKi9cbiAgdmFyIHVzZWQgPSAwOyAgICAgICAgICAgICAgLyogY29kZSBlbnRyaWVzIGluIHRhYmxlIHVzZWQgKi9cbiAgdmFyIGh1ZmYgPSAwOyAgICAgICAgICAgICAgLyogSHVmZm1hbiBjb2RlICovXG4gIHZhciBpbmNyOyAgICAgICAgICAgICAgLyogZm9yIGluY3JlbWVudGluZyBjb2RlLCBpbmRleCAqL1xuICB2YXIgZmlsbDsgICAgICAgICAgICAgIC8qIGluZGV4IGZvciByZXBsaWNhdGluZyBlbnRyaWVzICovXG4gIHZhciBsb3c7ICAgICAgICAgICAgICAgLyogbG93IGJpdHMgZm9yIGN1cnJlbnQgcm9vdCBlbnRyeSAqL1xuICB2YXIgbWFzazsgICAgICAgICAgICAgIC8qIG1hc2sgZm9yIGxvdyByb290IGJpdHMgKi9cbiAgdmFyIG5leHQ7ICAgICAgICAgICAgIC8qIG5leHQgYXZhaWxhYmxlIHNwYWNlIGluIHRhYmxlICovXG4gIHZhciBiYXNlID0gbnVsbDsgICAgIC8qIGJhc2UgdmFsdWUgdGFibGUgdG8gdXNlICovXG4gIHZhciBiYXNlX2luZGV4ID0gMDtcbi8vICB2YXIgc2hvZXh0cmE7ICAgIC8qIGV4dHJhIGJpdHMgdGFibGUgdG8gdXNlICovXG4gIHZhciBlbmQ7ICAgICAgICAgICAgICAgICAgICAvKiB1c2UgYmFzZSBhbmQgZXh0cmEgZm9yIHN5bWJvbCA+IGVuZCAqL1xuICB2YXIgY291bnQgPSBuZXcgdXRpbHMuQnVmMTYoTUFYQklUUysxKTsgLy9bTUFYQklUUysxXTsgICAgLyogbnVtYmVyIG9mIGNvZGVzIG9mIGVhY2ggbGVuZ3RoICovXG4gIHZhciBvZmZzID0gbmV3IHV0aWxzLkJ1ZjE2KE1BWEJJVFMrMSk7IC8vW01BWEJJVFMrMV07ICAgICAvKiBvZmZzZXRzIGluIHRhYmxlIGZvciBlYWNoIGxlbmd0aCAqL1xuICB2YXIgZXh0cmEgPSBudWxsO1xuICB2YXIgZXh0cmFfaW5kZXggPSAwO1xuXG4gIHZhciBoZXJlX2JpdHMsIGhlcmVfb3AsIGhlcmVfdmFsO1xuXG4gIC8qXG4gICBQcm9jZXNzIGEgc2V0IG9mIGNvZGUgbGVuZ3RocyB0byBjcmVhdGUgYSBjYW5vbmljYWwgSHVmZm1hbiBjb2RlLiAgVGhlXG4gICBjb2RlIGxlbmd0aHMgYXJlIGxlbnNbMC4uY29kZXMtMV0uICBFYWNoIGxlbmd0aCBjb3JyZXNwb25kcyB0byB0aGVcbiAgIHN5bWJvbHMgMC4uY29kZXMtMS4gIFRoZSBIdWZmbWFuIGNvZGUgaXMgZ2VuZXJhdGVkIGJ5IGZpcnN0IHNvcnRpbmcgdGhlXG4gICBzeW1ib2xzIGJ5IGxlbmd0aCBmcm9tIHNob3J0IHRvIGxvbmcsIGFuZCByZXRhaW5pbmcgdGhlIHN5bWJvbCBvcmRlclxuICAgZm9yIGNvZGVzIHdpdGggZXF1YWwgbGVuZ3Rocy4gIFRoZW4gdGhlIGNvZGUgc3RhcnRzIHdpdGggYWxsIHplcm8gYml0c1xuICAgZm9yIHRoZSBmaXJzdCBjb2RlIG9mIHRoZSBzaG9ydGVzdCBsZW5ndGgsIGFuZCB0aGUgY29kZXMgYXJlIGludGVnZXJcbiAgIGluY3JlbWVudHMgZm9yIHRoZSBzYW1lIGxlbmd0aCwgYW5kIHplcm9zIGFyZSBhcHBlbmRlZCBhcyB0aGUgbGVuZ3RoXG4gICBpbmNyZWFzZXMuICBGb3IgdGhlIGRlZmxhdGUgZm9ybWF0LCB0aGVzZSBiaXRzIGFyZSBzdG9yZWQgYmFja3dhcmRzXG4gICBmcm9tIHRoZWlyIG1vcmUgbmF0dXJhbCBpbnRlZ2VyIGluY3JlbWVudCBvcmRlcmluZywgYW5kIHNvIHdoZW4gdGhlXG4gICBkZWNvZGluZyB0YWJsZXMgYXJlIGJ1aWx0IGluIHRoZSBsYXJnZSBsb29wIGJlbG93LCB0aGUgaW50ZWdlciBjb2Rlc1xuICAgYXJlIGluY3JlbWVudGVkIGJhY2t3YXJkcy5cblxuICAgVGhpcyByb3V0aW5lIGFzc3VtZXMsIGJ1dCBkb2VzIG5vdCBjaGVjaywgdGhhdCBhbGwgb2YgdGhlIGVudHJpZXMgaW5cbiAgIGxlbnNbXSBhcmUgaW4gdGhlIHJhbmdlIDAuLk1BWEJJVFMuICBUaGUgY2FsbGVyIG11c3QgYXNzdXJlIHRoaXMuXG4gICAxLi5NQVhCSVRTIGlzIGludGVycHJldGVkIGFzIHRoYXQgY29kZSBsZW5ndGguICB6ZXJvIG1lYW5zIHRoYXQgdGhhdFxuICAgc3ltYm9sIGRvZXMgbm90IG9jY3VyIGluIHRoaXMgY29kZS5cblxuICAgVGhlIGNvZGVzIGFyZSBzb3J0ZWQgYnkgY29tcHV0aW5nIGEgY291bnQgb2YgY29kZXMgZm9yIGVhY2ggbGVuZ3RoLFxuICAgY3JlYXRpbmcgZnJvbSB0aGF0IGEgdGFibGUgb2Ygc3RhcnRpbmcgaW5kaWNlcyBmb3IgZWFjaCBsZW5ndGggaW4gdGhlXG4gICBzb3J0ZWQgdGFibGUsIGFuZCB0aGVuIGVudGVyaW5nIHRoZSBzeW1ib2xzIGluIG9yZGVyIGluIHRoZSBzb3J0ZWRcbiAgIHRhYmxlLiAgVGhlIHNvcnRlZCB0YWJsZSBpcyB3b3JrW10sIHdpdGggdGhhdCBzcGFjZSBiZWluZyBwcm92aWRlZCBieVxuICAgdGhlIGNhbGxlci5cblxuICAgVGhlIGxlbmd0aCBjb3VudHMgYXJlIHVzZWQgZm9yIG90aGVyIHB1cnBvc2VzIGFzIHdlbGwsIGkuZS4gZmluZGluZ1xuICAgdGhlIG1pbmltdW0gYW5kIG1heGltdW0gbGVuZ3RoIGNvZGVzLCBkZXRlcm1pbmluZyBpZiB0aGVyZSBhcmUgYW55XG4gICBjb2RlcyBhdCBhbGwsIGNoZWNraW5nIGZvciBhIHZhbGlkIHNldCBvZiBsZW5ndGhzLCBhbmQgbG9va2luZyBhaGVhZFxuICAgYXQgbGVuZ3RoIGNvdW50cyB0byBkZXRlcm1pbmUgc3ViLXRhYmxlIHNpemVzIHdoZW4gYnVpbGRpbmcgdGhlXG4gICBkZWNvZGluZyB0YWJsZXMuXG4gICAqL1xuXG4gIC8qIGFjY3VtdWxhdGUgbGVuZ3RocyBmb3IgY29kZXMgKGFzc3VtZXMgbGVuc1tdIGFsbCBpbiAwLi5NQVhCSVRTKSAqL1xuICBmb3IgKGxlbiA9IDA7IGxlbiA8PSBNQVhCSVRTOyBsZW4rKykge1xuICAgIGNvdW50W2xlbl0gPSAwO1xuICB9XG4gIGZvciAoc3ltID0gMDsgc3ltIDwgY29kZXM7IHN5bSsrKSB7XG4gICAgY291bnRbbGVuc1tsZW5zX2luZGV4ICsgc3ltXV0rKztcbiAgfVxuXG4gIC8qIGJvdW5kIGNvZGUgbGVuZ3RocywgZm9yY2Ugcm9vdCB0byBiZSB3aXRoaW4gY29kZSBsZW5ndGhzICovXG4gIHJvb3QgPSBiaXRzO1xuICBmb3IgKG1heCA9IE1BWEJJVFM7IG1heCA+PSAxOyBtYXgtLSkge1xuICAgIGlmIChjb3VudFttYXhdICE9PSAwKSB7IGJyZWFrOyB9XG4gIH1cbiAgaWYgKHJvb3QgPiBtYXgpIHtcbiAgICByb290ID0gbWF4O1xuICB9XG4gIGlmIChtYXggPT09IDApIHsgICAgICAgICAgICAgICAgICAgICAvKiBubyBzeW1ib2xzIHRvIGNvZGUgYXQgYWxsICovXG4gICAgLy90YWJsZS5vcFtvcHRzLnRhYmxlX2luZGV4XSA9IDY0OyAgLy9oZXJlLm9wID0gKHZhciBjaGFyKTY0OyAgICAvKiBpbnZhbGlkIGNvZGUgbWFya2VyICovXG4gICAgLy90YWJsZS5iaXRzW29wdHMudGFibGVfaW5kZXhdID0gMTsgICAvL2hlcmUuYml0cyA9ICh2YXIgY2hhcikxO1xuICAgIC8vdGFibGUudmFsW29wdHMudGFibGVfaW5kZXgrK10gPSAwOyAgIC8vaGVyZS52YWwgPSAodmFyIHNob3J0KTA7XG4gICAgdGFibGVbdGFibGVfaW5kZXgrK10gPSAoMSA8PCAyNCkgfCAoNjQgPDwgMTYpIHwgMDtcblxuXG4gICAgLy90YWJsZS5vcFtvcHRzLnRhYmxlX2luZGV4XSA9IDY0O1xuICAgIC8vdGFibGUuYml0c1tvcHRzLnRhYmxlX2luZGV4XSA9IDE7XG4gICAgLy90YWJsZS52YWxbb3B0cy50YWJsZV9pbmRleCsrXSA9IDA7XG4gICAgdGFibGVbdGFibGVfaW5kZXgrK10gPSAoMSA8PCAyNCkgfCAoNjQgPDwgMTYpIHwgMDtcblxuICAgIG9wdHMuYml0cyA9IDE7XG4gICAgcmV0dXJuIDA7ICAgICAvKiBubyBzeW1ib2xzLCBidXQgd2FpdCBmb3IgZGVjb2RpbmcgdG8gcmVwb3J0IGVycm9yICovXG4gIH1cbiAgZm9yIChtaW4gPSAxOyBtaW4gPCBtYXg7IG1pbisrKSB7XG4gICAgaWYgKGNvdW50W21pbl0gIT09IDApIHsgYnJlYWs7IH1cbiAgfVxuICBpZiAocm9vdCA8IG1pbikge1xuICAgIHJvb3QgPSBtaW47XG4gIH1cblxuICAvKiBjaGVjayBmb3IgYW4gb3Zlci1zdWJzY3JpYmVkIG9yIGluY29tcGxldGUgc2V0IG9mIGxlbmd0aHMgKi9cbiAgbGVmdCA9IDE7XG4gIGZvciAobGVuID0gMTsgbGVuIDw9IE1BWEJJVFM7IGxlbisrKSB7XG4gICAgbGVmdCA8PD0gMTtcbiAgICBsZWZ0IC09IGNvdW50W2xlbl07XG4gICAgaWYgKGxlZnQgPCAwKSB7XG4gICAgICByZXR1cm4gLTE7XG4gICAgfSAgICAgICAgLyogb3Zlci1zdWJzY3JpYmVkICovXG4gIH1cbiAgaWYgKGxlZnQgPiAwICYmICh0eXBlID09PSBDT0RFUyB8fCBtYXggIT09IDEpKSB7XG4gICAgcmV0dXJuIC0xOyAgICAgICAgICAgICAgICAgICAgICAvKiBpbmNvbXBsZXRlIHNldCAqL1xuICB9XG5cbiAgLyogZ2VuZXJhdGUgb2Zmc2V0cyBpbnRvIHN5bWJvbCB0YWJsZSBmb3IgZWFjaCBsZW5ndGggZm9yIHNvcnRpbmcgKi9cbiAgb2Zmc1sxXSA9IDA7XG4gIGZvciAobGVuID0gMTsgbGVuIDwgTUFYQklUUzsgbGVuKyspIHtcbiAgICBvZmZzW2xlbiArIDFdID0gb2Zmc1tsZW5dICsgY291bnRbbGVuXTtcbiAgfVxuXG4gIC8qIHNvcnQgc3ltYm9scyBieSBsZW5ndGgsIGJ5IHN5bWJvbCBvcmRlciB3aXRoaW4gZWFjaCBsZW5ndGggKi9cbiAgZm9yIChzeW0gPSAwOyBzeW0gPCBjb2Rlczsgc3ltKyspIHtcbiAgICBpZiAobGVuc1tsZW5zX2luZGV4ICsgc3ltXSAhPT0gMCkge1xuICAgICAgd29ya1tvZmZzW2xlbnNbbGVuc19pbmRleCArIHN5bV1dKytdID0gc3ltO1xuICAgIH1cbiAgfVxuXG4gIC8qXG4gICBDcmVhdGUgYW5kIGZpbGwgaW4gZGVjb2RpbmcgdGFibGVzLiAgSW4gdGhpcyBsb29wLCB0aGUgdGFibGUgYmVpbmdcbiAgIGZpbGxlZCBpcyBhdCBuZXh0IGFuZCBoYXMgY3VyciBpbmRleCBiaXRzLiAgVGhlIGNvZGUgYmVpbmcgdXNlZCBpcyBodWZmXG4gICB3aXRoIGxlbmd0aCBsZW4uICBUaGF0IGNvZGUgaXMgY29udmVydGVkIHRvIGFuIGluZGV4IGJ5IGRyb3BwaW5nIGRyb3BcbiAgIGJpdHMgb2ZmIG9mIHRoZSBib3R0b20uICBGb3IgY29kZXMgd2hlcmUgbGVuIGlzIGxlc3MgdGhhbiBkcm9wICsgY3VycixcbiAgIHRob3NlIHRvcCBkcm9wICsgY3VyciAtIGxlbiBiaXRzIGFyZSBpbmNyZW1lbnRlZCB0aHJvdWdoIGFsbCB2YWx1ZXMgdG9cbiAgIGZpbGwgdGhlIHRhYmxlIHdpdGggcmVwbGljYXRlZCBlbnRyaWVzLlxuXG4gICByb290IGlzIHRoZSBudW1iZXIgb2YgaW5kZXggYml0cyBmb3IgdGhlIHJvb3QgdGFibGUuICBXaGVuIGxlbiBleGNlZWRzXG4gICByb290LCBzdWItdGFibGVzIGFyZSBjcmVhdGVkIHBvaW50ZWQgdG8gYnkgdGhlIHJvb3QgZW50cnkgd2l0aCBhbiBpbmRleFxuICAgb2YgdGhlIGxvdyByb290IGJpdHMgb2YgaHVmZi4gIFRoaXMgaXMgc2F2ZWQgaW4gbG93IHRvIGNoZWNrIGZvciB3aGVuIGFcbiAgIG5ldyBzdWItdGFibGUgc2hvdWxkIGJlIHN0YXJ0ZWQuICBkcm9wIGlzIHplcm8gd2hlbiB0aGUgcm9vdCB0YWJsZSBpc1xuICAgYmVpbmcgZmlsbGVkLCBhbmQgZHJvcCBpcyByb290IHdoZW4gc3ViLXRhYmxlcyBhcmUgYmVpbmcgZmlsbGVkLlxuXG4gICBXaGVuIGEgbmV3IHN1Yi10YWJsZSBpcyBuZWVkZWQsIGl0IGlzIG5lY2Vzc2FyeSB0byBsb29rIGFoZWFkIGluIHRoZVxuICAgY29kZSBsZW5ndGhzIHRvIGRldGVybWluZSB3aGF0IHNpemUgc3ViLXRhYmxlIGlzIG5lZWRlZC4gIFRoZSBsZW5ndGhcbiAgIGNvdW50cyBhcmUgdXNlZCBmb3IgdGhpcywgYW5kIHNvIGNvdW50W10gaXMgZGVjcmVtZW50ZWQgYXMgY29kZXMgYXJlXG4gICBlbnRlcmVkIGluIHRoZSB0YWJsZXMuXG5cbiAgIHVzZWQga2VlcHMgdHJhY2sgb2YgaG93IG1hbnkgdGFibGUgZW50cmllcyBoYXZlIGJlZW4gYWxsb2NhdGVkIGZyb20gdGhlXG4gICBwcm92aWRlZCAqdGFibGUgc3BhY2UuICBJdCBpcyBjaGVja2VkIGZvciBMRU5TIGFuZCBESVNUIHRhYmxlcyBhZ2FpbnN0XG4gICB0aGUgY29uc3RhbnRzIEVOT1VHSF9MRU5TIGFuZCBFTk9VR0hfRElTVFMgdG8gZ3VhcmQgYWdhaW5zdCBjaGFuZ2VzIGluXG4gICB0aGUgaW5pdGlhbCByb290IHRhYmxlIHNpemUgY29uc3RhbnRzLiAgU2VlIHRoZSBjb21tZW50cyBpbiBpbmZ0cmVlcy5oXG4gICBmb3IgbW9yZSBpbmZvcm1hdGlvbi5cblxuICAgc3ltIGluY3JlbWVudHMgdGhyb3VnaCBhbGwgc3ltYm9scywgYW5kIHRoZSBsb29wIHRlcm1pbmF0ZXMgd2hlblxuICAgYWxsIGNvZGVzIG9mIGxlbmd0aCBtYXgsIGkuZS4gYWxsIGNvZGVzLCBoYXZlIGJlZW4gcHJvY2Vzc2VkLiAgVGhpc1xuICAgcm91dGluZSBwZXJtaXRzIGluY29tcGxldGUgY29kZXMsIHNvIGFub3RoZXIgbG9vcCBhZnRlciB0aGlzIG9uZSBmaWxsc1xuICAgaW4gdGhlIHJlc3Qgb2YgdGhlIGRlY29kaW5nIHRhYmxlcyB3aXRoIGludmFsaWQgY29kZSBtYXJrZXJzLlxuICAgKi9cblxuICAvKiBzZXQgdXAgZm9yIGNvZGUgdHlwZSAqL1xuICAvLyBwb29yIG1hbiBvcHRpbWl6YXRpb24gLSB1c2UgaWYtZWxzZSBpbnN0ZWFkIG9mIHN3aXRjaCxcbiAgLy8gdG8gYXZvaWQgZGVvcHRzIGluIG9sZCB2OFxuICBpZiAodHlwZSA9PT0gQ09ERVMpIHtcbiAgICAgIGJhc2UgPSBleHRyYSA9IHdvcms7ICAgIC8qIGR1bW15IHZhbHVlLS1ub3QgdXNlZCAqL1xuICAgICAgZW5kID0gMTk7XG4gIH0gZWxzZSBpZiAodHlwZSA9PT0gTEVOUykge1xuICAgICAgYmFzZSA9IGxiYXNlO1xuICAgICAgYmFzZV9pbmRleCAtPSAyNTc7XG4gICAgICBleHRyYSA9IGxleHQ7XG4gICAgICBleHRyYV9pbmRleCAtPSAyNTc7XG4gICAgICBlbmQgPSAyNTY7XG4gIH0gZWxzZSB7ICAgICAgICAgICAgICAgICAgICAvKiBESVNUUyAqL1xuICAgICAgYmFzZSA9IGRiYXNlO1xuICAgICAgZXh0cmEgPSBkZXh0O1xuICAgICAgZW5kID0gLTE7XG4gIH1cblxuICAvKiBpbml0aWFsaXplIG9wdHMgZm9yIGxvb3AgKi9cbiAgaHVmZiA9IDA7ICAgICAgICAgICAgICAgICAgIC8qIHN0YXJ0aW5nIGNvZGUgKi9cbiAgc3ltID0gMDsgICAgICAgICAgICAgICAgICAgIC8qIHN0YXJ0aW5nIGNvZGUgc3ltYm9sICovXG4gIGxlbiA9IG1pbjsgICAgICAgICAgICAgICAgICAvKiBzdGFydGluZyBjb2RlIGxlbmd0aCAqL1xuICBuZXh0ID0gdGFibGVfaW5kZXg7ICAgICAgICAgICAgICAvKiBjdXJyZW50IHRhYmxlIHRvIGZpbGwgaW4gKi9cbiAgY3VyciA9IHJvb3Q7ICAgICAgICAgICAgICAgIC8qIGN1cnJlbnQgdGFibGUgaW5kZXggYml0cyAqL1xuICBkcm9wID0gMDsgICAgICAgICAgICAgICAgICAgLyogY3VycmVudCBiaXRzIHRvIGRyb3AgZnJvbSBjb2RlIGZvciBpbmRleCAqL1xuICBsb3cgPSAtMTsgICAgICAgICAgICAgICAgICAgLyogdHJpZ2dlciBuZXcgc3ViLXRhYmxlIHdoZW4gbGVuID4gcm9vdCAqL1xuICB1c2VkID0gMSA8PCByb290OyAgICAgICAgICAvKiB1c2Ugcm9vdCB0YWJsZSBlbnRyaWVzICovXG4gIG1hc2sgPSB1c2VkIC0gMTsgICAgICAgICAgICAvKiBtYXNrIGZvciBjb21wYXJpbmcgbG93ICovXG5cbiAgLyogY2hlY2sgYXZhaWxhYmxlIHRhYmxlIHNwYWNlICovXG4gIGlmICgodHlwZSA9PT0gTEVOUyAmJiB1c2VkID4gRU5PVUdIX0xFTlMpIHx8XG4gICAgKHR5cGUgPT09IERJU1RTICYmIHVzZWQgPiBFTk9VR0hfRElTVFMpKSB7XG4gICAgcmV0dXJuIDE7XG4gIH1cblxuICB2YXIgaT0wO1xuICAvKiBwcm9jZXNzIGFsbCBjb2RlcyBhbmQgbWFrZSB0YWJsZSBlbnRyaWVzICovXG4gIGZvciAoOzspIHtcbiAgICBpKys7XG4gICAgLyogY3JlYXRlIHRhYmxlIGVudHJ5ICovXG4gICAgaGVyZV9iaXRzID0gbGVuIC0gZHJvcDtcbiAgICBpZiAod29ya1tzeW1dIDwgZW5kKSB7XG4gICAgICBoZXJlX29wID0gMDtcbiAgICAgIGhlcmVfdmFsID0gd29ya1tzeW1dO1xuICAgIH1cbiAgICBlbHNlIGlmICh3b3JrW3N5bV0gPiBlbmQpIHtcbiAgICAgIGhlcmVfb3AgPSBleHRyYVtleHRyYV9pbmRleCArIHdvcmtbc3ltXV07XG4gICAgICBoZXJlX3ZhbCA9IGJhc2VbYmFzZV9pbmRleCArIHdvcmtbc3ltXV07XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgaGVyZV9vcCA9IDMyICsgNjQ7ICAgICAgICAgLyogZW5kIG9mIGJsb2NrICovXG4gICAgICBoZXJlX3ZhbCA9IDA7XG4gICAgfVxuXG4gICAgLyogcmVwbGljYXRlIGZvciB0aG9zZSBpbmRpY2VzIHdpdGggbG93IGxlbiBiaXRzIGVxdWFsIHRvIGh1ZmYgKi9cbiAgICBpbmNyID0gMSA8PCAobGVuIC0gZHJvcCk7XG4gICAgZmlsbCA9IDEgPDwgY3VycjtcbiAgICBtaW4gPSBmaWxsOyAgICAgICAgICAgICAgICAgLyogc2F2ZSBvZmZzZXQgdG8gbmV4dCB0YWJsZSAqL1xuICAgIGRvIHtcbiAgICAgIGZpbGwgLT0gaW5jcjtcbiAgICAgIHRhYmxlW25leHQgKyAoaHVmZiA+PiBkcm9wKSArIGZpbGxdID0gKGhlcmVfYml0cyA8PCAyNCkgfCAoaGVyZV9vcCA8PCAxNikgfCBoZXJlX3ZhbCB8MDtcbiAgICB9IHdoaWxlIChmaWxsICE9PSAwKTtcblxuICAgIC8qIGJhY2t3YXJkcyBpbmNyZW1lbnQgdGhlIGxlbi1iaXQgY29kZSBodWZmICovXG4gICAgaW5jciA9IDEgPDwgKGxlbiAtIDEpO1xuICAgIHdoaWxlIChodWZmICYgaW5jcikge1xuICAgICAgaW5jciA+Pj0gMTtcbiAgICB9XG4gICAgaWYgKGluY3IgIT09IDApIHtcbiAgICAgIGh1ZmYgJj0gaW5jciAtIDE7XG4gICAgICBodWZmICs9IGluY3I7XG4gICAgfSBlbHNlIHtcbiAgICAgIGh1ZmYgPSAwO1xuICAgIH1cblxuICAgIC8qIGdvIHRvIG5leHQgc3ltYm9sLCB1cGRhdGUgY291bnQsIGxlbiAqL1xuICAgIHN5bSsrO1xuICAgIGlmICgtLWNvdW50W2xlbl0gPT09IDApIHtcbiAgICAgIGlmIChsZW4gPT09IG1heCkgeyBicmVhazsgfVxuICAgICAgbGVuID0gbGVuc1tsZW5zX2luZGV4ICsgd29ya1tzeW1dXTtcbiAgICB9XG5cbiAgICAvKiBjcmVhdGUgbmV3IHN1Yi10YWJsZSBpZiBuZWVkZWQgKi9cbiAgICBpZiAobGVuID4gcm9vdCAmJiAoaHVmZiAmIG1hc2spICE9PSBsb3cpIHtcbiAgICAgIC8qIGlmIGZpcnN0IHRpbWUsIHRyYW5zaXRpb24gdG8gc3ViLXRhYmxlcyAqL1xuICAgICAgaWYgKGRyb3AgPT09IDApIHtcbiAgICAgICAgZHJvcCA9IHJvb3Q7XG4gICAgICB9XG5cbiAgICAgIC8qIGluY3JlbWVudCBwYXN0IGxhc3QgdGFibGUgKi9cbiAgICAgIG5leHQgKz0gbWluOyAgICAgICAgICAgIC8qIGhlcmUgbWluIGlzIDEgPDwgY3VyciAqL1xuXG4gICAgICAvKiBkZXRlcm1pbmUgbGVuZ3RoIG9mIG5leHQgdGFibGUgKi9cbiAgICAgIGN1cnIgPSBsZW4gLSBkcm9wO1xuICAgICAgbGVmdCA9IDEgPDwgY3VycjtcbiAgICAgIHdoaWxlIChjdXJyICsgZHJvcCA8IG1heCkge1xuICAgICAgICBsZWZ0IC09IGNvdW50W2N1cnIgKyBkcm9wXTtcbiAgICAgICAgaWYgKGxlZnQgPD0gMCkgeyBicmVhazsgfVxuICAgICAgICBjdXJyKys7XG4gICAgICAgIGxlZnQgPDw9IDE7XG4gICAgICB9XG5cbiAgICAgIC8qIGNoZWNrIGZvciBlbm91Z2ggc3BhY2UgKi9cbiAgICAgIHVzZWQgKz0gMSA8PCBjdXJyO1xuICAgICAgaWYgKCh0eXBlID09PSBMRU5TICYmIHVzZWQgPiBFTk9VR0hfTEVOUykgfHxcbiAgICAgICAgKHR5cGUgPT09IERJU1RTICYmIHVzZWQgPiBFTk9VR0hfRElTVFMpKSB7XG4gICAgICAgIHJldHVybiAxO1xuICAgICAgfVxuXG4gICAgICAvKiBwb2ludCBlbnRyeSBpbiByb290IHRhYmxlIHRvIHN1Yi10YWJsZSAqL1xuICAgICAgbG93ID0gaHVmZiAmIG1hc2s7XG4gICAgICAvKnRhYmxlLm9wW2xvd10gPSBjdXJyO1xuICAgICAgdGFibGUuYml0c1tsb3ddID0gcm9vdDtcbiAgICAgIHRhYmxlLnZhbFtsb3ddID0gbmV4dCAtIG9wdHMudGFibGVfaW5kZXg7Ki9cbiAgICAgIHRhYmxlW2xvd10gPSAocm9vdCA8PCAyNCkgfCAoY3VyciA8PCAxNikgfCAobmV4dCAtIHRhYmxlX2luZGV4KSB8MDtcbiAgICB9XG4gIH1cblxuICAvKiBmaWxsIGluIHJlbWFpbmluZyB0YWJsZSBlbnRyeSBpZiBjb2RlIGlzIGluY29tcGxldGUgKGd1YXJhbnRlZWQgdG8gaGF2ZVxuICAgYXQgbW9zdCBvbmUgcmVtYWluaW5nIGVudHJ5LCBzaW5jZSBpZiB0aGUgY29kZSBpcyBpbmNvbXBsZXRlLCB0aGVcbiAgIG1heGltdW0gY29kZSBsZW5ndGggdGhhdCB3YXMgYWxsb3dlZCB0byBnZXQgdGhpcyBmYXIgaXMgb25lIGJpdCkgKi9cbiAgaWYgKGh1ZmYgIT09IDApIHtcbiAgICAvL3RhYmxlLm9wW25leHQgKyBodWZmXSA9IDY0OyAgICAgICAgICAgIC8qIGludmFsaWQgY29kZSBtYXJrZXIgKi9cbiAgICAvL3RhYmxlLmJpdHNbbmV4dCArIGh1ZmZdID0gbGVuIC0gZHJvcDtcbiAgICAvL3RhYmxlLnZhbFtuZXh0ICsgaHVmZl0gPSAwO1xuICAgIHRhYmxlW25leHQgKyBodWZmXSA9ICgobGVuIC0gZHJvcCkgPDwgMjQpIHwgKDY0IDw8IDE2KSB8MDtcbiAgfVxuXG4gIC8qIHNldCByZXR1cm4gcGFyYW1ldGVycyAqL1xuICAvL29wdHMudGFibGVfaW5kZXggKz0gdXNlZDtcbiAgb3B0cy5iaXRzID0gcm9vdDtcbiAgcmV0dXJuIDA7XG59O1xuXG59LHtcIi4uL3V0aWxzL2NvbW1vblwiOjI3fV0sMzc6W2Z1bmN0aW9uKF9kZXJlcV8sbW9kdWxlLGV4cG9ydHMpe1xuJ3VzZSBzdHJpY3QnO1xuXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgJzInOiAgICAnbmVlZCBkaWN0aW9uYXJ5JywgICAgIC8qIFpfTkVFRF9ESUNUICAgICAgIDIgICovXG4gICcxJzogICAgJ3N0cmVhbSBlbmQnLCAgICAgICAgICAvKiBaX1NUUkVBTV9FTkQgICAgICAxICAqL1xuICAnMCc6ICAgICcnLCAgICAgICAgICAgICAgICAgICAgLyogWl9PSyAgICAgICAgICAgICAgMCAgKi9cbiAgJy0xJzogICAnZmlsZSBlcnJvcicsICAgICAgICAgIC8qIFpfRVJSTk8gICAgICAgICAoLTEpICovXG4gICctMic6ICAgJ3N0cmVhbSBlcnJvcicsICAgICAgICAvKiBaX1NUUkVBTV9FUlJPUiAgKC0yKSAqL1xuICAnLTMnOiAgICdkYXRhIGVycm9yJywgICAgICAgICAgLyogWl9EQVRBX0VSUk9SICAgICgtMykgKi9cbiAgJy00JzogICAnaW5zdWZmaWNpZW50IG1lbW9yeScsIC8qIFpfTUVNX0VSUk9SICAgICAoLTQpICovXG4gICctNSc6ICAgJ2J1ZmZlciBlcnJvcicsICAgICAgICAvKiBaX0JVRl9FUlJPUiAgICAgKC01KSAqL1xuICAnLTYnOiAgICdpbmNvbXBhdGlibGUgdmVyc2lvbicgLyogWl9WRVJTSU9OX0VSUk9SICgtNikgKi9cbn07XG59LHt9XSwzODpbZnVuY3Rpb24oX2RlcmVxXyxtb2R1bGUsZXhwb3J0cyl7XG4ndXNlIHN0cmljdCc7XG5cblxudmFyIHV0aWxzID0gX2RlcmVxXygnLi4vdXRpbHMvY29tbW9uJyk7XG5cbi8qIFB1YmxpYyBjb25zdGFudHMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovXG4vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qL1xuXG5cbi8vdmFyIFpfRklMVEVSRUQgICAgICAgICAgPSAxO1xuLy92YXIgWl9IVUZGTUFOX09OTFkgICAgICA9IDI7XG4vL3ZhciBaX1JMRSAgICAgICAgICAgICAgID0gMztcbnZhciBaX0ZJWEVEICAgICAgICAgICAgICAgPSA0O1xuLy92YXIgWl9ERUZBVUxUX1NUUkFURUdZICA9IDA7XG5cbi8qIFBvc3NpYmxlIHZhbHVlcyBvZiB0aGUgZGF0YV90eXBlIGZpZWxkICh0aG91Z2ggc2VlIGluZmxhdGUoKSkgKi9cbnZhciBaX0JJTkFSWSAgICAgICAgICAgICAgPSAwO1xudmFyIFpfVEVYVCAgICAgICAgICAgICAgICA9IDE7XG4vL3ZhciBaX0FTQ0lJICAgICAgICAgICAgID0gMTsgLy8gPSBaX1RFWFRcbnZhciBaX1VOS05PV04gICAgICAgICAgICAgPSAyO1xuXG4vKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qL1xuXG5cbmZ1bmN0aW9uIHplcm8oYnVmKSB7IHZhciBsZW4gPSBidWYubGVuZ3RoOyB3aGlsZSAoLS1sZW4gPj0gMCkgeyBidWZbbGVuXSA9IDA7IH0gfVxuXG4vLyBGcm9tIHp1dGlsLmhcblxudmFyIFNUT1JFRF9CTE9DSyA9IDA7XG52YXIgU1RBVElDX1RSRUVTID0gMTtcbnZhciBEWU5fVFJFRVMgICAgPSAyO1xuLyogVGhlIHRocmVlIGtpbmRzIG9mIGJsb2NrIHR5cGUgKi9cblxudmFyIE1JTl9NQVRDSCAgICA9IDM7XG52YXIgTUFYX01BVENIICAgID0gMjU4O1xuLyogVGhlIG1pbmltdW0gYW5kIG1heGltdW0gbWF0Y2ggbGVuZ3RocyAqL1xuXG4vLyBGcm9tIGRlZmxhdGUuaFxuLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKiBJbnRlcm5hbCBjb21wcmVzc2lvbiBzdGF0ZS5cbiAqL1xuXG52YXIgTEVOR1RIX0NPREVTICA9IDI5O1xuLyogbnVtYmVyIG9mIGxlbmd0aCBjb2Rlcywgbm90IGNvdW50aW5nIHRoZSBzcGVjaWFsIEVORF9CTE9DSyBjb2RlICovXG5cbnZhciBMSVRFUkFMUyAgICAgID0gMjU2O1xuLyogbnVtYmVyIG9mIGxpdGVyYWwgYnl0ZXMgMC4uMjU1ICovXG5cbnZhciBMX0NPREVTICAgICAgID0gTElURVJBTFMgKyAxICsgTEVOR1RIX0NPREVTO1xuLyogbnVtYmVyIG9mIExpdGVyYWwgb3IgTGVuZ3RoIGNvZGVzLCBpbmNsdWRpbmcgdGhlIEVORF9CTE9DSyBjb2RlICovXG5cbnZhciBEX0NPREVTICAgICAgID0gMzA7XG4vKiBudW1iZXIgb2YgZGlzdGFuY2UgY29kZXMgKi9cblxudmFyIEJMX0NPREVTICAgICAgPSAxOTtcbi8qIG51bWJlciBvZiBjb2RlcyB1c2VkIHRvIHRyYW5zZmVyIHRoZSBiaXQgbGVuZ3RocyAqL1xuXG52YXIgSEVBUF9TSVpFICAgICA9IDIqTF9DT0RFUyArIDE7XG4vKiBtYXhpbXVtIGhlYXAgc2l6ZSAqL1xuXG52YXIgTUFYX0JJVFMgICAgICA9IDE1O1xuLyogQWxsIGNvZGVzIG11c3Qgbm90IGV4Y2VlZCBNQVhfQklUUyBiaXRzICovXG5cbnZhciBCdWZfc2l6ZSAgICAgID0gMTY7XG4vKiBzaXplIG9mIGJpdCBidWZmZXIgaW4gYmlfYnVmICovXG5cblxuLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKiBDb25zdGFudHNcbiAqL1xuXG52YXIgTUFYX0JMX0JJVFMgPSA3O1xuLyogQml0IGxlbmd0aCBjb2RlcyBtdXN0IG5vdCBleGNlZWQgTUFYX0JMX0JJVFMgYml0cyAqL1xuXG52YXIgRU5EX0JMT0NLICAgPSAyNTY7XG4vKiBlbmQgb2YgYmxvY2sgbGl0ZXJhbCBjb2RlICovXG5cbnZhciBSRVBfM182ICAgICA9IDE2O1xuLyogcmVwZWF0IHByZXZpb3VzIGJpdCBsZW5ndGggMy02IHRpbWVzICgyIGJpdHMgb2YgcmVwZWF0IGNvdW50KSAqL1xuXG52YXIgUkVQWl8zXzEwICAgPSAxNztcbi8qIHJlcGVhdCBhIHplcm8gbGVuZ3RoIDMtMTAgdGltZXMgICgzIGJpdHMgb2YgcmVwZWF0IGNvdW50KSAqL1xuXG52YXIgUkVQWl8xMV8xMzggPSAxODtcbi8qIHJlcGVhdCBhIHplcm8gbGVuZ3RoIDExLTEzOCB0aW1lcyAgKDcgYml0cyBvZiByZXBlYXQgY291bnQpICovXG5cbnZhciBleHRyYV9sYml0cyA9ICAgLyogZXh0cmEgYml0cyBmb3IgZWFjaCBsZW5ndGggY29kZSAqL1xuICBbMCwwLDAsMCwwLDAsMCwwLDEsMSwxLDEsMiwyLDIsMiwzLDMsMywzLDQsNCw0LDQsNSw1LDUsNSwwXTtcblxudmFyIGV4dHJhX2RiaXRzID0gICAvKiBleHRyYSBiaXRzIGZvciBlYWNoIGRpc3RhbmNlIGNvZGUgKi9cbiAgWzAsMCwwLDAsMSwxLDIsMiwzLDMsNCw0LDUsNSw2LDYsNyw3LDgsOCw5LDksMTAsMTAsMTEsMTEsMTIsMTIsMTMsMTNdO1xuXG52YXIgZXh0cmFfYmxiaXRzID0gIC8qIGV4dHJhIGJpdHMgZm9yIGVhY2ggYml0IGxlbmd0aCBjb2RlICovXG4gIFswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDIsMyw3XTtcblxudmFyIGJsX29yZGVyID1cbiAgWzE2LDE3LDE4LDAsOCw3LDksNiwxMCw1LDExLDQsMTIsMywxMywyLDE0LDEsMTVdO1xuLyogVGhlIGxlbmd0aHMgb2YgdGhlIGJpdCBsZW5ndGggY29kZXMgYXJlIHNlbnQgaW4gb3JkZXIgb2YgZGVjcmVhc2luZ1xuICogcHJvYmFiaWxpdHksIHRvIGF2b2lkIHRyYW5zbWl0dGluZyB0aGUgbGVuZ3RocyBmb3IgdW51c2VkIGJpdCBsZW5ndGggY29kZXMuXG4gKi9cblxuLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKiBMb2NhbCBkYXRhLiBUaGVzZSBhcmUgaW5pdGlhbGl6ZWQgb25seSBvbmNlLlxuICovXG5cbi8vIFdlIHByZS1maWxsIGFycmF5cyB3aXRoIDAgdG8gYXZvaWQgdW5pbml0aWFsaXplZCBnYXBzXG5cbnZhciBESVNUX0NPREVfTEVOID0gNTEyOyAvKiBzZWUgZGVmaW5pdGlvbiBvZiBhcnJheSBkaXN0X2NvZGUgYmVsb3cgKi9cblxuLy8gISEhISBVc2UgZmxhdCBhcnJheSBpbnNkZWFkIG9mIHN0cnVjdHVyZSwgRnJlcSA9IGkqMiwgTGVuID0gaSoyKzFcbnZhciBzdGF0aWNfbHRyZWUgID0gbmV3IEFycmF5KChMX0NPREVTKzIpICogMik7XG56ZXJvKHN0YXRpY19sdHJlZSk7XG4vKiBUaGUgc3RhdGljIGxpdGVyYWwgdHJlZS4gU2luY2UgdGhlIGJpdCBsZW5ndGhzIGFyZSBpbXBvc2VkLCB0aGVyZSBpcyBub1xuICogbmVlZCBmb3IgdGhlIExfQ09ERVMgZXh0cmEgY29kZXMgdXNlZCBkdXJpbmcgaGVhcCBjb25zdHJ1Y3Rpb24uIEhvd2V2ZXJcbiAqIFRoZSBjb2RlcyAyODYgYW5kIDI4NyBhcmUgbmVlZGVkIHRvIGJ1aWxkIGEgY2Fub25pY2FsIHRyZWUgKHNlZSBfdHJfaW5pdFxuICogYmVsb3cpLlxuICovXG5cbnZhciBzdGF0aWNfZHRyZWUgID0gbmV3IEFycmF5KERfQ09ERVMgKiAyKTtcbnplcm8oc3RhdGljX2R0cmVlKTtcbi8qIFRoZSBzdGF0aWMgZGlzdGFuY2UgdHJlZS4gKEFjdHVhbGx5IGEgdHJpdmlhbCB0cmVlIHNpbmNlIGFsbCBjb2RlcyB1c2VcbiAqIDUgYml0cy4pXG4gKi9cblxudmFyIF9kaXN0X2NvZGUgICAgPSBuZXcgQXJyYXkoRElTVF9DT0RFX0xFTik7XG56ZXJvKF9kaXN0X2NvZGUpO1xuLyogRGlzdGFuY2UgY29kZXMuIFRoZSBmaXJzdCAyNTYgdmFsdWVzIGNvcnJlc3BvbmQgdG8gdGhlIGRpc3RhbmNlc1xuICogMyAuLiAyNTgsIHRoZSBsYXN0IDI1NiB2YWx1ZXMgY29ycmVzcG9uZCB0byB0aGUgdG9wIDggYml0cyBvZlxuICogdGhlIDE1IGJpdCBkaXN0YW5jZXMuXG4gKi9cblxudmFyIF9sZW5ndGhfY29kZSAgPSBuZXcgQXJyYXkoTUFYX01BVENILU1JTl9NQVRDSCsxKTtcbnplcm8oX2xlbmd0aF9jb2RlKTtcbi8qIGxlbmd0aCBjb2RlIGZvciBlYWNoIG5vcm1hbGl6ZWQgbWF0Y2ggbGVuZ3RoICgwID09IE1JTl9NQVRDSCkgKi9cblxudmFyIGJhc2VfbGVuZ3RoICAgPSBuZXcgQXJyYXkoTEVOR1RIX0NPREVTKTtcbnplcm8oYmFzZV9sZW5ndGgpO1xuLyogRmlyc3Qgbm9ybWFsaXplZCBsZW5ndGggZm9yIGVhY2ggY29kZSAoMCA9IE1JTl9NQVRDSCkgKi9cblxudmFyIGJhc2VfZGlzdCAgICAgPSBuZXcgQXJyYXkoRF9DT0RFUyk7XG56ZXJvKGJhc2VfZGlzdCk7XG4vKiBGaXJzdCBub3JtYWxpemVkIGRpc3RhbmNlIGZvciBlYWNoIGNvZGUgKDAgPSBkaXN0YW5jZSBvZiAxKSAqL1xuXG5cbnZhciBTdGF0aWNUcmVlRGVzYyA9IGZ1bmN0aW9uIChzdGF0aWNfdHJlZSwgZXh0cmFfYml0cywgZXh0cmFfYmFzZSwgZWxlbXMsIG1heF9sZW5ndGgpIHtcblxuICB0aGlzLnN0YXRpY190cmVlICA9IHN0YXRpY190cmVlOyAgLyogc3RhdGljIHRyZWUgb3IgTlVMTCAqL1xuICB0aGlzLmV4dHJhX2JpdHMgICA9IGV4dHJhX2JpdHM7ICAgLyogZXh0cmEgYml0cyBmb3IgZWFjaCBjb2RlIG9yIE5VTEwgKi9cbiAgdGhpcy5leHRyYV9iYXNlICAgPSBleHRyYV9iYXNlOyAgIC8qIGJhc2UgaW5kZXggZm9yIGV4dHJhX2JpdHMgKi9cbiAgdGhpcy5lbGVtcyAgICAgICAgPSBlbGVtczsgICAgICAgIC8qIG1heCBudW1iZXIgb2YgZWxlbWVudHMgaW4gdGhlIHRyZWUgKi9cbiAgdGhpcy5tYXhfbGVuZ3RoICAgPSBtYXhfbGVuZ3RoOyAgIC8qIG1heCBiaXQgbGVuZ3RoIGZvciB0aGUgY29kZXMgKi9cblxuICAvLyBzaG93IGlmIGBzdGF0aWNfdHJlZWAgaGFzIGRhdGEgb3IgZHVtbXkgLSBuZWVkZWQgZm9yIG1vbm9tb3JwaGljIG9iamVjdHNcbiAgdGhpcy5oYXNfc3RyZWUgICAgPSBzdGF0aWNfdHJlZSAmJiBzdGF0aWNfdHJlZS5sZW5ndGg7XG59O1xuXG5cbnZhciBzdGF0aWNfbF9kZXNjO1xudmFyIHN0YXRpY19kX2Rlc2M7XG52YXIgc3RhdGljX2JsX2Rlc2M7XG5cblxudmFyIFRyZWVEZXNjID0gZnVuY3Rpb24oZHluX3RyZWUsIHN0YXRfZGVzYykge1xuICB0aGlzLmR5bl90cmVlID0gZHluX3RyZWU7ICAgICAvKiB0aGUgZHluYW1pYyB0cmVlICovXG4gIHRoaXMubWF4X2NvZGUgPSAwOyAgICAgICAgICAgIC8qIGxhcmdlc3QgY29kZSB3aXRoIG5vbiB6ZXJvIGZyZXF1ZW5jeSAqL1xuICB0aGlzLnN0YXRfZGVzYyA9IHN0YXRfZGVzYzsgICAvKiB0aGUgY29ycmVzcG9uZGluZyBzdGF0aWMgdHJlZSAqL1xufTtcblxuXG5cbmZ1bmN0aW9uIGRfY29kZShkaXN0KSB7XG4gIHJldHVybiBkaXN0IDwgMjU2ID8gX2Rpc3RfY29kZVtkaXN0XSA6IF9kaXN0X2NvZGVbMjU2ICsgKGRpc3QgPj4+IDcpXTtcbn1cblxuXG4vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqIE91dHB1dCBhIHNob3J0IExTQiBmaXJzdCBvbiB0aGUgc3RyZWFtLlxuICogSU4gYXNzZXJ0aW9uOiB0aGVyZSBpcyBlbm91Z2ggcm9vbSBpbiBwZW5kaW5nQnVmLlxuICovXG5mdW5jdGlvbiBwdXRfc2hvcnQgKHMsIHcpIHtcbi8vICAgIHB1dF9ieXRlKHMsICh1Y2gpKCh3KSAmIDB4ZmYpKTtcbi8vICAgIHB1dF9ieXRlKHMsICh1Y2gpKCh1c2gpKHcpID4+IDgpKTtcbiAgcy5wZW5kaW5nX2J1ZltzLnBlbmRpbmcrK10gPSAodykgJiAweGZmO1xuICBzLnBlbmRpbmdfYnVmW3MucGVuZGluZysrXSA9ICh3ID4+PiA4KSAmIDB4ZmY7XG59XG5cblxuLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKiBTZW5kIGEgdmFsdWUgb24gYSBnaXZlbiBudW1iZXIgb2YgYml0cy5cbiAqIElOIGFzc2VydGlvbjogbGVuZ3RoIDw9IDE2IGFuZCB2YWx1ZSBmaXRzIGluIGxlbmd0aCBiaXRzLlxuICovXG5mdW5jdGlvbiBzZW5kX2JpdHMocywgdmFsdWUsIGxlbmd0aCkge1xuICBpZiAocy5iaV92YWxpZCA+IChCdWZfc2l6ZSAtIGxlbmd0aCkpIHtcbiAgICBzLmJpX2J1ZiB8PSAodmFsdWUgPDwgcy5iaV92YWxpZCkgJiAweGZmZmY7XG4gICAgcHV0X3Nob3J0KHMsIHMuYmlfYnVmKTtcbiAgICBzLmJpX2J1ZiA9IHZhbHVlID4+IChCdWZfc2l6ZSAtIHMuYmlfdmFsaWQpO1xuICAgIHMuYmlfdmFsaWQgKz0gbGVuZ3RoIC0gQnVmX3NpemU7XG4gIH0gZWxzZSB7XG4gICAgcy5iaV9idWYgfD0gKHZhbHVlIDw8IHMuYmlfdmFsaWQpICYgMHhmZmZmO1xuICAgIHMuYmlfdmFsaWQgKz0gbGVuZ3RoO1xuICB9XG59XG5cblxuZnVuY3Rpb24gc2VuZF9jb2RlKHMsIGMsIHRyZWUpIHtcbiAgc2VuZF9iaXRzKHMsIHRyZWVbYyoyXS8qLkNvZGUqLywgdHJlZVtjKjIgKyAxXS8qLkxlbiovKTtcbn1cblxuXG4vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqIFJldmVyc2UgdGhlIGZpcnN0IGxlbiBiaXRzIG9mIGEgY29kZSwgdXNpbmcgc3RyYWlnaHRmb3J3YXJkIGNvZGUgKGEgZmFzdGVyXG4gKiBtZXRob2Qgd291bGQgdXNlIGEgdGFibGUpXG4gKiBJTiBhc3NlcnRpb246IDEgPD0gbGVuIDw9IDE1XG4gKi9cbmZ1bmN0aW9uIGJpX3JldmVyc2UoY29kZSwgbGVuKSB7XG4gIHZhciByZXMgPSAwO1xuICBkbyB7XG4gICAgcmVzIHw9IGNvZGUgJiAxO1xuICAgIGNvZGUgPj4+PSAxO1xuICAgIHJlcyA8PD0gMTtcbiAgfSB3aGlsZSAoLS1sZW4gPiAwKTtcbiAgcmV0dXJuIHJlcyA+Pj4gMTtcbn1cblxuXG4vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqIEZsdXNoIHRoZSBiaXQgYnVmZmVyLCBrZWVwaW5nIGF0IG1vc3QgNyBiaXRzIGluIGl0LlxuICovXG5mdW5jdGlvbiBiaV9mbHVzaChzKSB7XG4gIGlmIChzLmJpX3ZhbGlkID09PSAxNikge1xuICAgIHB1dF9zaG9ydChzLCBzLmJpX2J1Zik7XG4gICAgcy5iaV9idWYgPSAwO1xuICAgIHMuYmlfdmFsaWQgPSAwO1xuXG4gIH0gZWxzZSBpZiAocy5iaV92YWxpZCA+PSA4KSB7XG4gICAgcy5wZW5kaW5nX2J1ZltzLnBlbmRpbmcrK10gPSBzLmJpX2J1ZiAmIDB4ZmY7XG4gICAgcy5iaV9idWYgPj49IDg7XG4gICAgcy5iaV92YWxpZCAtPSA4O1xuICB9XG59XG5cblxuLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKiBDb21wdXRlIHRoZSBvcHRpbWFsIGJpdCBsZW5ndGhzIGZvciBhIHRyZWUgYW5kIHVwZGF0ZSB0aGUgdG90YWwgYml0IGxlbmd0aFxuICogZm9yIHRoZSBjdXJyZW50IGJsb2NrLlxuICogSU4gYXNzZXJ0aW9uOiB0aGUgZmllbGRzIGZyZXEgYW5kIGRhZCBhcmUgc2V0LCBoZWFwW2hlYXBfbWF4XSBhbmRcbiAqICAgIGFib3ZlIGFyZSB0aGUgdHJlZSBub2RlcyBzb3J0ZWQgYnkgaW5jcmVhc2luZyBmcmVxdWVuY3kuXG4gKiBPVVQgYXNzZXJ0aW9uczogdGhlIGZpZWxkIGxlbiBpcyBzZXQgdG8gdGhlIG9wdGltYWwgYml0IGxlbmd0aCwgdGhlXG4gKiAgICAgYXJyYXkgYmxfY291bnQgY29udGFpbnMgdGhlIGZyZXF1ZW5jaWVzIGZvciBlYWNoIGJpdCBsZW5ndGguXG4gKiAgICAgVGhlIGxlbmd0aCBvcHRfbGVuIGlzIHVwZGF0ZWQ7IHN0YXRpY19sZW4gaXMgYWxzbyB1cGRhdGVkIGlmIHN0cmVlIGlzXG4gKiAgICAgbm90IG51bGwuXG4gKi9cbmZ1bmN0aW9uIGdlbl9iaXRsZW4ocywgZGVzYylcbi8vICAgIGRlZmxhdGVfc3RhdGUgKnM7XG4vLyAgICB0cmVlX2Rlc2MgKmRlc2M7ICAgIC8qIHRoZSB0cmVlIGRlc2NyaXB0b3IgKi9cbntcbiAgdmFyIHRyZWUgICAgICAgICAgICA9IGRlc2MuZHluX3RyZWU7XG4gIHZhciBtYXhfY29kZSAgICAgICAgPSBkZXNjLm1heF9jb2RlO1xuICB2YXIgc3RyZWUgICAgICAgICAgID0gZGVzYy5zdGF0X2Rlc2Muc3RhdGljX3RyZWU7XG4gIHZhciBoYXNfc3RyZWUgICAgICAgPSBkZXNjLnN0YXRfZGVzYy5oYXNfc3RyZWU7XG4gIHZhciBleHRyYSAgICAgICAgICAgPSBkZXNjLnN0YXRfZGVzYy5leHRyYV9iaXRzO1xuICB2YXIgYmFzZSAgICAgICAgICAgID0gZGVzYy5zdGF0X2Rlc2MuZXh0cmFfYmFzZTtcbiAgdmFyIG1heF9sZW5ndGggICAgICA9IGRlc2Muc3RhdF9kZXNjLm1heF9sZW5ndGg7XG4gIHZhciBoOyAgICAgICAgICAgICAgLyogaGVhcCBpbmRleCAqL1xuICB2YXIgbiwgbTsgICAgICAgICAgIC8qIGl0ZXJhdGUgb3ZlciB0aGUgdHJlZSBlbGVtZW50cyAqL1xuICB2YXIgYml0czsgICAgICAgICAgIC8qIGJpdCBsZW5ndGggKi9cbiAgdmFyIHhiaXRzOyAgICAgICAgICAvKiBleHRyYSBiaXRzICovXG4gIHZhciBmOyAgICAgICAgICAgICAgLyogZnJlcXVlbmN5ICovXG4gIHZhciBvdmVyZmxvdyA9IDA7ICAgLyogbnVtYmVyIG9mIGVsZW1lbnRzIHdpdGggYml0IGxlbmd0aCB0b28gbGFyZ2UgKi9cblxuICBmb3IgKGJpdHMgPSAwOyBiaXRzIDw9IE1BWF9CSVRTOyBiaXRzKyspIHtcbiAgICBzLmJsX2NvdW50W2JpdHNdID0gMDtcbiAgfVxuXG4gIC8qIEluIGEgZmlyc3QgcGFzcywgY29tcHV0ZSB0aGUgb3B0aW1hbCBiaXQgbGVuZ3RocyAod2hpY2ggbWF5XG4gICAqIG92ZXJmbG93IGluIHRoZSBjYXNlIG9mIHRoZSBiaXQgbGVuZ3RoIHRyZWUpLlxuICAgKi9cbiAgdHJlZVtzLmhlYXBbcy5oZWFwX21heF0qMiArIDFdLyouTGVuKi8gPSAwOyAvKiByb290IG9mIHRoZSBoZWFwICovXG5cbiAgZm9yIChoID0gcy5oZWFwX21heCsxOyBoIDwgSEVBUF9TSVpFOyBoKyspIHtcbiAgICBuID0gcy5oZWFwW2hdO1xuICAgIGJpdHMgPSB0cmVlW3RyZWVbbioyICsxXS8qLkRhZCovICogMiArIDFdLyouTGVuKi8gKyAxO1xuICAgIGlmIChiaXRzID4gbWF4X2xlbmd0aCkge1xuICAgICAgYml0cyA9IG1heF9sZW5ndGg7XG4gICAgICBvdmVyZmxvdysrO1xuICAgIH1cbiAgICB0cmVlW24qMiArIDFdLyouTGVuKi8gPSBiaXRzO1xuICAgIC8qIFdlIG92ZXJ3cml0ZSB0cmVlW25dLkRhZCB3aGljaCBpcyBubyBsb25nZXIgbmVlZGVkICovXG5cbiAgICBpZiAobiA+IG1heF9jb2RlKSB7IGNvbnRpbnVlOyB9IC8qIG5vdCBhIGxlYWYgbm9kZSAqL1xuXG4gICAgcy5ibF9jb3VudFtiaXRzXSsrO1xuICAgIHhiaXRzID0gMDtcbiAgICBpZiAobiA+PSBiYXNlKSB7XG4gICAgICB4Yml0cyA9IGV4dHJhW24tYmFzZV07XG4gICAgfVxuICAgIGYgPSB0cmVlW24gKiAyXS8qLkZyZXEqLztcbiAgICBzLm9wdF9sZW4gKz0gZiAqIChiaXRzICsgeGJpdHMpO1xuICAgIGlmIChoYXNfc3RyZWUpIHtcbiAgICAgIHMuc3RhdGljX2xlbiArPSBmICogKHN0cmVlW24qMiArIDFdLyouTGVuKi8gKyB4Yml0cyk7XG4gICAgfVxuICB9XG4gIGlmIChvdmVyZmxvdyA9PT0gMCkgeyByZXR1cm47IH1cblxuICAvLyBUcmFjZSgoc3RkZXJyLFwiXFxuYml0IGxlbmd0aCBvdmVyZmxvd1xcblwiKSk7XG4gIC8qIFRoaXMgaGFwcGVucyBmb3IgZXhhbXBsZSBvbiBvYmoyIGFuZCBwaWMgb2YgdGhlIENhbGdhcnkgY29ycHVzICovXG5cbiAgLyogRmluZCB0aGUgZmlyc3QgYml0IGxlbmd0aCB3aGljaCBjb3VsZCBpbmNyZWFzZTogKi9cbiAgZG8ge1xuICAgIGJpdHMgPSBtYXhfbGVuZ3RoLTE7XG4gICAgd2hpbGUgKHMuYmxfY291bnRbYml0c10gPT09IDApIHsgYml0cy0tOyB9XG4gICAgcy5ibF9jb3VudFtiaXRzXS0tOyAgICAgIC8qIG1vdmUgb25lIGxlYWYgZG93biB0aGUgdHJlZSAqL1xuICAgIHMuYmxfY291bnRbYml0cysxXSArPSAyOyAvKiBtb3ZlIG9uZSBvdmVyZmxvdyBpdGVtIGFzIGl0cyBicm90aGVyICovXG4gICAgcy5ibF9jb3VudFttYXhfbGVuZ3RoXS0tO1xuICAgIC8qIFRoZSBicm90aGVyIG9mIHRoZSBvdmVyZmxvdyBpdGVtIGFsc28gbW92ZXMgb25lIHN0ZXAgdXAsXG4gICAgICogYnV0IHRoaXMgZG9lcyBub3QgYWZmZWN0IGJsX2NvdW50W21heF9sZW5ndGhdXG4gICAgICovXG4gICAgb3ZlcmZsb3cgLT0gMjtcbiAgfSB3aGlsZSAob3ZlcmZsb3cgPiAwKTtcblxuICAvKiBOb3cgcmVjb21wdXRlIGFsbCBiaXQgbGVuZ3Rocywgc2Nhbm5pbmcgaW4gaW5jcmVhc2luZyBmcmVxdWVuY3kuXG4gICAqIGggaXMgc3RpbGwgZXF1YWwgdG8gSEVBUF9TSVpFLiAoSXQgaXMgc2ltcGxlciB0byByZWNvbnN0cnVjdCBhbGxcbiAgICogbGVuZ3RocyBpbnN0ZWFkIG9mIGZpeGluZyBvbmx5IHRoZSB3cm9uZyBvbmVzLiBUaGlzIGlkZWEgaXMgdGFrZW5cbiAgICogZnJvbSAnYXInIHdyaXR0ZW4gYnkgSGFydWhpa28gT2t1bXVyYS4pXG4gICAqL1xuICBmb3IgKGJpdHMgPSBtYXhfbGVuZ3RoOyBiaXRzICE9PSAwOyBiaXRzLS0pIHtcbiAgICBuID0gcy5ibF9jb3VudFtiaXRzXTtcbiAgICB3aGlsZSAobiAhPT0gMCkge1xuICAgICAgbSA9IHMuaGVhcFstLWhdO1xuICAgICAgaWYgKG0gPiBtYXhfY29kZSkgeyBjb250aW51ZTsgfVxuICAgICAgaWYgKHRyZWVbbSoyICsgMV0vKi5MZW4qLyAhPT0gYml0cykge1xuICAgICAgICAvLyBUcmFjZSgoc3RkZXJyLFwiY29kZSAlZCBiaXRzICVkLT4lZFxcblwiLCBtLCB0cmVlW21dLkxlbiwgYml0cykpO1xuICAgICAgICBzLm9wdF9sZW4gKz0gKGJpdHMgLSB0cmVlW20qMiArIDFdLyouTGVuKi8pKnRyZWVbbSoyXS8qLkZyZXEqLztcbiAgICAgICAgdHJlZVttKjIgKyAxXS8qLkxlbiovID0gYml0cztcbiAgICAgIH1cbiAgICAgIG4tLTtcbiAgICB9XG4gIH1cbn1cblxuXG4vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqIEdlbmVyYXRlIHRoZSBjb2RlcyBmb3IgYSBnaXZlbiB0cmVlIGFuZCBiaXQgY291bnRzICh3aGljaCBuZWVkIG5vdCBiZVxuICogb3B0aW1hbCkuXG4gKiBJTiBhc3NlcnRpb246IHRoZSBhcnJheSBibF9jb3VudCBjb250YWlucyB0aGUgYml0IGxlbmd0aCBzdGF0aXN0aWNzIGZvclxuICogdGhlIGdpdmVuIHRyZWUgYW5kIHRoZSBmaWVsZCBsZW4gaXMgc2V0IGZvciBhbGwgdHJlZSBlbGVtZW50cy5cbiAqIE9VVCBhc3NlcnRpb246IHRoZSBmaWVsZCBjb2RlIGlzIHNldCBmb3IgYWxsIHRyZWUgZWxlbWVudHMgb2Ygbm9uXG4gKiAgICAgemVybyBjb2RlIGxlbmd0aC5cbiAqL1xuZnVuY3Rpb24gZ2VuX2NvZGVzKHRyZWUsIG1heF9jb2RlLCBibF9jb3VudClcbi8vICAgIGN0X2RhdGEgKnRyZWU7ICAgICAgICAgICAgIC8qIHRoZSB0cmVlIHRvIGRlY29yYXRlICovXG4vLyAgICBpbnQgbWF4X2NvZGU7ICAgICAgICAgICAgICAvKiBsYXJnZXN0IGNvZGUgd2l0aCBub24gemVybyBmcmVxdWVuY3kgKi9cbi8vICAgIHVzaGYgKmJsX2NvdW50OyAgICAgICAgICAgIC8qIG51bWJlciBvZiBjb2RlcyBhdCBlYWNoIGJpdCBsZW5ndGggKi9cbntcbiAgdmFyIG5leHRfY29kZSA9IG5ldyBBcnJheShNQVhfQklUUysxKTsgLyogbmV4dCBjb2RlIHZhbHVlIGZvciBlYWNoIGJpdCBsZW5ndGggKi9cbiAgdmFyIGNvZGUgPSAwOyAgICAgICAgICAgICAgLyogcnVubmluZyBjb2RlIHZhbHVlICovXG4gIHZhciBiaXRzOyAgICAgICAgICAgICAgICAgIC8qIGJpdCBpbmRleCAqL1xuICB2YXIgbjsgICAgICAgICAgICAgICAgICAgICAvKiBjb2RlIGluZGV4ICovXG5cbiAgLyogVGhlIGRpc3RyaWJ1dGlvbiBjb3VudHMgYXJlIGZpcnN0IHVzZWQgdG8gZ2VuZXJhdGUgdGhlIGNvZGUgdmFsdWVzXG4gICAqIHdpdGhvdXQgYml0IHJldmVyc2FsLlxuICAgKi9cbiAgZm9yIChiaXRzID0gMTsgYml0cyA8PSBNQVhfQklUUzsgYml0cysrKSB7XG4gICAgbmV4dF9jb2RlW2JpdHNdID0gY29kZSA9IChjb2RlICsgYmxfY291bnRbYml0cy0xXSkgPDwgMTtcbiAgfVxuICAvKiBDaGVjayB0aGF0IHRoZSBiaXQgY291bnRzIGluIGJsX2NvdW50IGFyZSBjb25zaXN0ZW50LiBUaGUgbGFzdCBjb2RlXG4gICAqIG11c3QgYmUgYWxsIG9uZXMuXG4gICAqL1xuICAvL0Fzc2VydCAoY29kZSArIGJsX2NvdW50W01BWF9CSVRTXS0xID09ICgxPDxNQVhfQklUUyktMSxcbiAgLy8gICAgICAgIFwiaW5jb25zaXN0ZW50IGJpdCBjb3VudHNcIik7XG4gIC8vVHJhY2V2KChzdGRlcnIsXCJcXG5nZW5fY29kZXM6IG1heF9jb2RlICVkIFwiLCBtYXhfY29kZSkpO1xuXG4gIGZvciAobiA9IDA7ICBuIDw9IG1heF9jb2RlOyBuKyspIHtcbiAgICB2YXIgbGVuID0gdHJlZVtuKjIgKyAxXS8qLkxlbiovO1xuICAgIGlmIChsZW4gPT09IDApIHsgY29udGludWU7IH1cbiAgICAvKiBOb3cgcmV2ZXJzZSB0aGUgYml0cyAqL1xuICAgIHRyZWVbbioyXS8qLkNvZGUqLyA9IGJpX3JldmVyc2UobmV4dF9jb2RlW2xlbl0rKywgbGVuKTtcblxuICAgIC8vVHJhY2Vjdih0cmVlICE9IHN0YXRpY19sdHJlZSwgKHN0ZGVycixcIlxcbm4gJTNkICVjIGwgJTJkIGMgJTR4ICgleCkgXCIsXG4gICAgLy8gICAgIG4sIChpc2dyYXBoKG4pID8gbiA6ICcgJyksIGxlbiwgdHJlZVtuXS5Db2RlLCBuZXh0X2NvZGVbbGVuXS0xKSk7XG4gIH1cbn1cblxuXG4vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqIEluaXRpYWxpemUgdGhlIHZhcmlvdXMgJ2NvbnN0YW50JyB0YWJsZXMuXG4gKi9cbmZ1bmN0aW9uIHRyX3N0YXRpY19pbml0KCkge1xuICB2YXIgbjsgICAgICAgIC8qIGl0ZXJhdGVzIG92ZXIgdHJlZSBlbGVtZW50cyAqL1xuICB2YXIgYml0czsgICAgIC8qIGJpdCBjb3VudGVyICovXG4gIHZhciBsZW5ndGg7ICAgLyogbGVuZ3RoIHZhbHVlICovXG4gIHZhciBjb2RlOyAgICAgLyogY29kZSB2YWx1ZSAqL1xuICB2YXIgZGlzdDsgICAgIC8qIGRpc3RhbmNlIGluZGV4ICovXG4gIHZhciBibF9jb3VudCA9IG5ldyBBcnJheShNQVhfQklUUysxKTtcbiAgLyogbnVtYmVyIG9mIGNvZGVzIGF0IGVhY2ggYml0IGxlbmd0aCBmb3IgYW4gb3B0aW1hbCB0cmVlICovXG5cbiAgLy8gZG8gY2hlY2sgaW4gX3RyX2luaXQoKVxuICAvL2lmIChzdGF0aWNfaW5pdF9kb25lKSByZXR1cm47XG5cbiAgLyogRm9yIHNvbWUgZW1iZWRkZWQgdGFyZ2V0cywgZ2xvYmFsIHZhcmlhYmxlcyBhcmUgbm90IGluaXRpYWxpemVkOiAqL1xuLyojaWZkZWYgTk9fSU5JVF9HTE9CQUxfUE9JTlRFUlNcbiAgc3RhdGljX2xfZGVzYy5zdGF0aWNfdHJlZSA9IHN0YXRpY19sdHJlZTtcbiAgc3RhdGljX2xfZGVzYy5leHRyYV9iaXRzID0gZXh0cmFfbGJpdHM7XG4gIHN0YXRpY19kX2Rlc2Muc3RhdGljX3RyZWUgPSBzdGF0aWNfZHRyZWU7XG4gIHN0YXRpY19kX2Rlc2MuZXh0cmFfYml0cyA9IGV4dHJhX2RiaXRzO1xuICBzdGF0aWNfYmxfZGVzYy5leHRyYV9iaXRzID0gZXh0cmFfYmxiaXRzO1xuI2VuZGlmKi9cblxuICAvKiBJbml0aWFsaXplIHRoZSBtYXBwaW5nIGxlbmd0aCAoMC4uMjU1KSAtPiBsZW5ndGggY29kZSAoMC4uMjgpICovXG4gIGxlbmd0aCA9IDA7XG4gIGZvciAoY29kZSA9IDA7IGNvZGUgPCBMRU5HVEhfQ09ERVMtMTsgY29kZSsrKSB7XG4gICAgYmFzZV9sZW5ndGhbY29kZV0gPSBsZW5ndGg7XG4gICAgZm9yIChuID0gMDsgbiA8ICgxPDxleHRyYV9sYml0c1tjb2RlXSk7IG4rKykge1xuICAgICAgX2xlbmd0aF9jb2RlW2xlbmd0aCsrXSA9IGNvZGU7XG4gICAgfVxuICB9XG4gIC8vQXNzZXJ0IChsZW5ndGggPT0gMjU2LCBcInRyX3N0YXRpY19pbml0OiBsZW5ndGggIT0gMjU2XCIpO1xuICAvKiBOb3RlIHRoYXQgdGhlIGxlbmd0aCAyNTUgKG1hdGNoIGxlbmd0aCAyNTgpIGNhbiBiZSByZXByZXNlbnRlZFxuICAgKiBpbiB0d28gZGlmZmVyZW50IHdheXM6IGNvZGUgMjg0ICsgNSBiaXRzIG9yIGNvZGUgMjg1LCBzbyB3ZVxuICAgKiBvdmVyd3JpdGUgbGVuZ3RoX2NvZGVbMjU1XSB0byB1c2UgdGhlIGJlc3QgZW5jb2Rpbmc6XG4gICAqL1xuICBfbGVuZ3RoX2NvZGVbbGVuZ3RoLTFdID0gY29kZTtcblxuICAvKiBJbml0aWFsaXplIHRoZSBtYXBwaW5nIGRpc3QgKDAuLjMySykgLT4gZGlzdCBjb2RlICgwLi4yOSkgKi9cbiAgZGlzdCA9IDA7XG4gIGZvciAoY29kZSA9IDAgOyBjb2RlIDwgMTY7IGNvZGUrKykge1xuICAgIGJhc2VfZGlzdFtjb2RlXSA9IGRpc3Q7XG4gICAgZm9yIChuID0gMDsgbiA8ICgxPDxleHRyYV9kYml0c1tjb2RlXSk7IG4rKykge1xuICAgICAgX2Rpc3RfY29kZVtkaXN0KytdID0gY29kZTtcbiAgICB9XG4gIH1cbiAgLy9Bc3NlcnQgKGRpc3QgPT0gMjU2LCBcInRyX3N0YXRpY19pbml0OiBkaXN0ICE9IDI1NlwiKTtcbiAgZGlzdCA+Pj0gNzsgLyogZnJvbSBub3cgb24sIGFsbCBkaXN0YW5jZXMgYXJlIGRpdmlkZWQgYnkgMTI4ICovXG4gIGZvciAoIDsgY29kZSA8IERfQ09ERVM7IGNvZGUrKykge1xuICAgIGJhc2VfZGlzdFtjb2RlXSA9IGRpc3QgPDwgNztcbiAgICBmb3IgKG4gPSAwOyBuIDwgKDE8PChleHRyYV9kYml0c1tjb2RlXS03KSk7IG4rKykge1xuICAgICAgX2Rpc3RfY29kZVsyNTYgKyBkaXN0KytdID0gY29kZTtcbiAgICB9XG4gIH1cbiAgLy9Bc3NlcnQgKGRpc3QgPT0gMjU2LCBcInRyX3N0YXRpY19pbml0OiAyNTYrZGlzdCAhPSA1MTJcIik7XG5cbiAgLyogQ29uc3RydWN0IHRoZSBjb2RlcyBvZiB0aGUgc3RhdGljIGxpdGVyYWwgdHJlZSAqL1xuICBmb3IgKGJpdHMgPSAwOyBiaXRzIDw9IE1BWF9CSVRTOyBiaXRzKyspIHtcbiAgICBibF9jb3VudFtiaXRzXSA9IDA7XG4gIH1cblxuICBuID0gMDtcbiAgd2hpbGUgKG4gPD0gMTQzKSB7XG4gICAgc3RhdGljX2x0cmVlW24qMiArIDFdLyouTGVuKi8gPSA4O1xuICAgIG4rKztcbiAgICBibF9jb3VudFs4XSsrO1xuICB9XG4gIHdoaWxlIChuIDw9IDI1NSkge1xuICAgIHN0YXRpY19sdHJlZVtuKjIgKyAxXS8qLkxlbiovID0gOTtcbiAgICBuKys7XG4gICAgYmxfY291bnRbOV0rKztcbiAgfVxuICB3aGlsZSAobiA8PSAyNzkpIHtcbiAgICBzdGF0aWNfbHRyZWVbbioyICsgMV0vKi5MZW4qLyA9IDc7XG4gICAgbisrO1xuICAgIGJsX2NvdW50WzddKys7XG4gIH1cbiAgd2hpbGUgKG4gPD0gMjg3KSB7XG4gICAgc3RhdGljX2x0cmVlW24qMiArIDFdLyouTGVuKi8gPSA4O1xuICAgIG4rKztcbiAgICBibF9jb3VudFs4XSsrO1xuICB9XG4gIC8qIENvZGVzIDI4NiBhbmQgMjg3IGRvIG5vdCBleGlzdCwgYnV0IHdlIG11c3QgaW5jbHVkZSB0aGVtIGluIHRoZVxuICAgKiB0cmVlIGNvbnN0cnVjdGlvbiB0byBnZXQgYSBjYW5vbmljYWwgSHVmZm1hbiB0cmVlIChsb25nZXN0IGNvZGVcbiAgICogYWxsIG9uZXMpXG4gICAqL1xuICBnZW5fY29kZXMoc3RhdGljX2x0cmVlLCBMX0NPREVTKzEsIGJsX2NvdW50KTtcblxuICAvKiBUaGUgc3RhdGljIGRpc3RhbmNlIHRyZWUgaXMgdHJpdmlhbDogKi9cbiAgZm9yIChuID0gMDsgbiA8IERfQ09ERVM7IG4rKykge1xuICAgIHN0YXRpY19kdHJlZVtuKjIgKyAxXS8qLkxlbiovID0gNTtcbiAgICBzdGF0aWNfZHRyZWVbbioyXS8qLkNvZGUqLyA9IGJpX3JldmVyc2UobiwgNSk7XG4gIH1cblxuICAvLyBOb3cgZGF0YSByZWFkeSBhbmQgd2UgY2FuIGluaXQgc3RhdGljIHRyZWVzXG4gIHN0YXRpY19sX2Rlc2MgPSBuZXcgU3RhdGljVHJlZURlc2Moc3RhdGljX2x0cmVlLCBleHRyYV9sYml0cywgTElURVJBTFMrMSwgTF9DT0RFUywgTUFYX0JJVFMpO1xuICBzdGF0aWNfZF9kZXNjID0gbmV3IFN0YXRpY1RyZWVEZXNjKHN0YXRpY19kdHJlZSwgZXh0cmFfZGJpdHMsIDAsICAgICAgICAgIERfQ09ERVMsIE1BWF9CSVRTKTtcbiAgc3RhdGljX2JsX2Rlc2MgPW5ldyBTdGF0aWNUcmVlRGVzYyhuZXcgQXJyYXkoMCksIGV4dHJhX2JsYml0cywgMCwgICAgICAgICBCTF9DT0RFUywgTUFYX0JMX0JJVFMpO1xuXG4gIC8vc3RhdGljX2luaXRfZG9uZSA9IHRydWU7XG59XG5cblxuLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKiBJbml0aWFsaXplIGEgbmV3IGJsb2NrLlxuICovXG5mdW5jdGlvbiBpbml0X2Jsb2NrKHMpIHtcbiAgdmFyIG47IC8qIGl0ZXJhdGVzIG92ZXIgdHJlZSBlbGVtZW50cyAqL1xuXG4gIC8qIEluaXRpYWxpemUgdGhlIHRyZWVzLiAqL1xuICBmb3IgKG4gPSAwOyBuIDwgTF9DT0RFUzsgIG4rKykgeyBzLmR5bl9sdHJlZVtuKjJdLyouRnJlcSovID0gMDsgfVxuICBmb3IgKG4gPSAwOyBuIDwgRF9DT0RFUzsgIG4rKykgeyBzLmR5bl9kdHJlZVtuKjJdLyouRnJlcSovID0gMDsgfVxuICBmb3IgKG4gPSAwOyBuIDwgQkxfQ09ERVM7IG4rKykgeyBzLmJsX3RyZWVbbioyXS8qLkZyZXEqLyA9IDA7IH1cblxuICBzLmR5bl9sdHJlZVtFTkRfQkxPQ0sqMl0vKi5GcmVxKi8gPSAxO1xuICBzLm9wdF9sZW4gPSBzLnN0YXRpY19sZW4gPSAwO1xuICBzLmxhc3RfbGl0ID0gcy5tYXRjaGVzID0gMDtcbn1cblxuXG4vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqIEZsdXNoIHRoZSBiaXQgYnVmZmVyIGFuZCBhbGlnbiB0aGUgb3V0cHV0IG9uIGEgYnl0ZSBib3VuZGFyeVxuICovXG5mdW5jdGlvbiBiaV93aW5kdXAocylcbntcbiAgaWYgKHMuYmlfdmFsaWQgPiA4KSB7XG4gICAgcHV0X3Nob3J0KHMsIHMuYmlfYnVmKTtcbiAgfSBlbHNlIGlmIChzLmJpX3ZhbGlkID4gMCkge1xuICAgIC8vcHV0X2J5dGUocywgKEJ5dGUpcy0+YmlfYnVmKTtcbiAgICBzLnBlbmRpbmdfYnVmW3MucGVuZGluZysrXSA9IHMuYmlfYnVmO1xuICB9XG4gIHMuYmlfYnVmID0gMDtcbiAgcy5iaV92YWxpZCA9IDA7XG59XG5cbi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICogQ29weSBhIHN0b3JlZCBibG9jaywgc3RvcmluZyBmaXJzdCB0aGUgbGVuZ3RoIGFuZCBpdHNcbiAqIG9uZSdzIGNvbXBsZW1lbnQgaWYgcmVxdWVzdGVkLlxuICovXG5mdW5jdGlvbiBjb3B5X2Jsb2NrKHMsIGJ1ZiwgbGVuLCBoZWFkZXIpXG4vL0RlZmxhdGVTdGF0ZSAqcztcbi8vY2hhcmYgICAgKmJ1ZjsgICAgLyogdGhlIGlucHV0IGRhdGEgKi9cbi8vdW5zaWduZWQgbGVuOyAgICAgLyogaXRzIGxlbmd0aCAqL1xuLy9pbnQgICAgICBoZWFkZXI7ICAvKiB0cnVlIGlmIGJsb2NrIGhlYWRlciBtdXN0IGJlIHdyaXR0ZW4gKi9cbntcbiAgYmlfd2luZHVwKHMpOyAgICAgICAgLyogYWxpZ24gb24gYnl0ZSBib3VuZGFyeSAqL1xuXG4gIGlmIChoZWFkZXIpIHtcbiAgICBwdXRfc2hvcnQocywgbGVuKTtcbiAgICBwdXRfc2hvcnQocywgfmxlbik7XG4gIH1cbi8vICB3aGlsZSAobGVuLS0pIHtcbi8vICAgIHB1dF9ieXRlKHMsICpidWYrKyk7XG4vLyAgfVxuICB1dGlscy5hcnJheVNldChzLnBlbmRpbmdfYnVmLCBzLndpbmRvdywgYnVmLCBsZW4sIHMucGVuZGluZyk7XG4gIHMucGVuZGluZyArPSBsZW47XG59XG5cbi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICogQ29tcGFyZXMgdG8gc3VidHJlZXMsIHVzaW5nIHRoZSB0cmVlIGRlcHRoIGFzIHRpZSBicmVha2VyIHdoZW5cbiAqIHRoZSBzdWJ0cmVlcyBoYXZlIGVxdWFsIGZyZXF1ZW5jeS4gVGhpcyBtaW5pbWl6ZXMgdGhlIHdvcnN0IGNhc2UgbGVuZ3RoLlxuICovXG5mdW5jdGlvbiBzbWFsbGVyKHRyZWUsIG4sIG0sIGRlcHRoKSB7XG4gIHZhciBfbjIgPSBuKjI7XG4gIHZhciBfbTIgPSBtKjI7XG4gIHJldHVybiAodHJlZVtfbjJdLyouRnJlcSovIDwgdHJlZVtfbTJdLyouRnJlcSovIHx8XG4gICAgICAgICAodHJlZVtfbjJdLyouRnJlcSovID09PSB0cmVlW19tMl0vKi5GcmVxKi8gJiYgZGVwdGhbbl0gPD0gZGVwdGhbbV0pKTtcbn1cblxuLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKiBSZXN0b3JlIHRoZSBoZWFwIHByb3BlcnR5IGJ5IG1vdmluZyBkb3duIHRoZSB0cmVlIHN0YXJ0aW5nIGF0IG5vZGUgayxcbiAqIGV4Y2hhbmdpbmcgYSBub2RlIHdpdGggdGhlIHNtYWxsZXN0IG9mIGl0cyB0d28gc29ucyBpZiBuZWNlc3NhcnksIHN0b3BwaW5nXG4gKiB3aGVuIHRoZSBoZWFwIHByb3BlcnR5IGlzIHJlLWVzdGFibGlzaGVkIChlYWNoIGZhdGhlciBzbWFsbGVyIHRoYW4gaXRzXG4gKiB0d28gc29ucykuXG4gKi9cbmZ1bmN0aW9uIHBxZG93bmhlYXAocywgdHJlZSwgaylcbi8vICAgIGRlZmxhdGVfc3RhdGUgKnM7XG4vLyAgICBjdF9kYXRhICp0cmVlOyAgLyogdGhlIHRyZWUgdG8gcmVzdG9yZSAqL1xuLy8gICAgaW50IGs7ICAgICAgICAgICAgICAgLyogbm9kZSB0byBtb3ZlIGRvd24gKi9cbntcbiAgdmFyIHYgPSBzLmhlYXBba107XG4gIHZhciBqID0gayA8PCAxOyAgLyogbGVmdCBzb24gb2YgayAqL1xuICB3aGlsZSAoaiA8PSBzLmhlYXBfbGVuKSB7XG4gICAgLyogU2V0IGogdG8gdGhlIHNtYWxsZXN0IG9mIHRoZSB0d28gc29uczogKi9cbiAgICBpZiAoaiA8IHMuaGVhcF9sZW4gJiZcbiAgICAgIHNtYWxsZXIodHJlZSwgcy5oZWFwW2orMV0sIHMuaGVhcFtqXSwgcy5kZXB0aCkpIHtcbiAgICAgIGorKztcbiAgICB9XG4gICAgLyogRXhpdCBpZiB2IGlzIHNtYWxsZXIgdGhhbiBib3RoIHNvbnMgKi9cbiAgICBpZiAoc21hbGxlcih0cmVlLCB2LCBzLmhlYXBbal0sIHMuZGVwdGgpKSB7IGJyZWFrOyB9XG5cbiAgICAvKiBFeGNoYW5nZSB2IHdpdGggdGhlIHNtYWxsZXN0IHNvbiAqL1xuICAgIHMuaGVhcFtrXSA9IHMuaGVhcFtqXTtcbiAgICBrID0gajtcblxuICAgIC8qIEFuZCBjb250aW51ZSBkb3duIHRoZSB0cmVlLCBzZXR0aW5nIGogdG8gdGhlIGxlZnQgc29uIG9mIGsgKi9cbiAgICBqIDw8PSAxO1xuICB9XG4gIHMuaGVhcFtrXSA9IHY7XG59XG5cblxuLy8gaW5saW5lZCBtYW51YWxseVxuLy8gdmFyIFNNQUxMRVNUID0gMTtcblxuLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKiBTZW5kIHRoZSBibG9jayBkYXRhIGNvbXByZXNzZWQgdXNpbmcgdGhlIGdpdmVuIEh1ZmZtYW4gdHJlZXNcbiAqL1xuZnVuY3Rpb24gY29tcHJlc3NfYmxvY2socywgbHRyZWUsIGR0cmVlKVxuLy8gICAgZGVmbGF0ZV9zdGF0ZSAqcztcbi8vICAgIGNvbnN0IGN0X2RhdGEgKmx0cmVlOyAvKiBsaXRlcmFsIHRyZWUgKi9cbi8vICAgIGNvbnN0IGN0X2RhdGEgKmR0cmVlOyAvKiBkaXN0YW5jZSB0cmVlICovXG57XG4gIHZhciBkaXN0OyAgICAgICAgICAgLyogZGlzdGFuY2Ugb2YgbWF0Y2hlZCBzdHJpbmcgKi9cbiAgdmFyIGxjOyAgICAgICAgICAgICAvKiBtYXRjaCBsZW5ndGggb3IgdW5tYXRjaGVkIGNoYXIgKGlmIGRpc3QgPT0gMCkgKi9cbiAgdmFyIGx4ID0gMDsgICAgICAgICAvKiBydW5uaW5nIGluZGV4IGluIGxfYnVmICovXG4gIHZhciBjb2RlOyAgICAgICAgICAgLyogdGhlIGNvZGUgdG8gc2VuZCAqL1xuICB2YXIgZXh0cmE7ICAgICAgICAgIC8qIG51bWJlciBvZiBleHRyYSBiaXRzIHRvIHNlbmQgKi9cblxuICBpZiAocy5sYXN0X2xpdCAhPT0gMCkge1xuICAgIGRvIHtcbiAgICAgIGRpc3QgPSAocy5wZW5kaW5nX2J1ZltzLmRfYnVmICsgbHgqMl0gPDwgOCkgfCAocy5wZW5kaW5nX2J1ZltzLmRfYnVmICsgbHgqMiArIDFdKTtcbiAgICAgIGxjID0gcy5wZW5kaW5nX2J1ZltzLmxfYnVmICsgbHhdO1xuICAgICAgbHgrKztcblxuICAgICAgaWYgKGRpc3QgPT09IDApIHtcbiAgICAgICAgc2VuZF9jb2RlKHMsIGxjLCBsdHJlZSk7IC8qIHNlbmQgYSBsaXRlcmFsIGJ5dGUgKi9cbiAgICAgICAgLy9UcmFjZWN2KGlzZ3JhcGgobGMpLCAoc3RkZXJyLFwiICclYycgXCIsIGxjKSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvKiBIZXJlLCBsYyBpcyB0aGUgbWF0Y2ggbGVuZ3RoIC0gTUlOX01BVENIICovXG4gICAgICAgIGNvZGUgPSBfbGVuZ3RoX2NvZGVbbGNdO1xuICAgICAgICBzZW5kX2NvZGUocywgY29kZStMSVRFUkFMUysxLCBsdHJlZSk7IC8qIHNlbmQgdGhlIGxlbmd0aCBjb2RlICovXG4gICAgICAgIGV4dHJhID0gZXh0cmFfbGJpdHNbY29kZV07XG4gICAgICAgIGlmIChleHRyYSAhPT0gMCkge1xuICAgICAgICAgIGxjIC09IGJhc2VfbGVuZ3RoW2NvZGVdO1xuICAgICAgICAgIHNlbmRfYml0cyhzLCBsYywgZXh0cmEpOyAgICAgICAvKiBzZW5kIHRoZSBleHRyYSBsZW5ndGggYml0cyAqL1xuICAgICAgICB9XG4gICAgICAgIGRpc3QtLTsgLyogZGlzdCBpcyBub3cgdGhlIG1hdGNoIGRpc3RhbmNlIC0gMSAqL1xuICAgICAgICBjb2RlID0gZF9jb2RlKGRpc3QpO1xuICAgICAgICAvL0Fzc2VydCAoY29kZSA8IERfQ09ERVMsIFwiYmFkIGRfY29kZVwiKTtcblxuICAgICAgICBzZW5kX2NvZGUocywgY29kZSwgZHRyZWUpOyAgICAgICAvKiBzZW5kIHRoZSBkaXN0YW5jZSBjb2RlICovXG4gICAgICAgIGV4dHJhID0gZXh0cmFfZGJpdHNbY29kZV07XG4gICAgICAgIGlmIChleHRyYSAhPT0gMCkge1xuICAgICAgICAgIGRpc3QgLT0gYmFzZV9kaXN0W2NvZGVdO1xuICAgICAgICAgIHNlbmRfYml0cyhzLCBkaXN0LCBleHRyYSk7ICAgLyogc2VuZCB0aGUgZXh0cmEgZGlzdGFuY2UgYml0cyAqL1xuICAgICAgICB9XG4gICAgICB9IC8qIGxpdGVyYWwgb3IgbWF0Y2ggcGFpciA/ICovXG5cbiAgICAgIC8qIENoZWNrIHRoYXQgdGhlIG92ZXJsYXkgYmV0d2VlbiBwZW5kaW5nX2J1ZiBhbmQgZF9idWYrbF9idWYgaXMgb2s6ICovXG4gICAgICAvL0Fzc2VydCgodUludCkocy0+cGVuZGluZykgPCBzLT5saXRfYnVmc2l6ZSArIDIqbHgsXG4gICAgICAvLyAgICAgICBcInBlbmRpbmdCdWYgb3ZlcmZsb3dcIik7XG5cbiAgICB9IHdoaWxlIChseCA8IHMubGFzdF9saXQpO1xuICB9XG5cbiAgc2VuZF9jb2RlKHMsIEVORF9CTE9DSywgbHRyZWUpO1xufVxuXG5cbi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICogQ29uc3RydWN0IG9uZSBIdWZmbWFuIHRyZWUgYW5kIGFzc2lnbnMgdGhlIGNvZGUgYml0IHN0cmluZ3MgYW5kIGxlbmd0aHMuXG4gKiBVcGRhdGUgdGhlIHRvdGFsIGJpdCBsZW5ndGggZm9yIHRoZSBjdXJyZW50IGJsb2NrLlxuICogSU4gYXNzZXJ0aW9uOiB0aGUgZmllbGQgZnJlcSBpcyBzZXQgZm9yIGFsbCB0cmVlIGVsZW1lbnRzLlxuICogT1VUIGFzc2VydGlvbnM6IHRoZSBmaWVsZHMgbGVuIGFuZCBjb2RlIGFyZSBzZXQgdG8gdGhlIG9wdGltYWwgYml0IGxlbmd0aFxuICogICAgIGFuZCBjb3JyZXNwb25kaW5nIGNvZGUuIFRoZSBsZW5ndGggb3B0X2xlbiBpcyB1cGRhdGVkOyBzdGF0aWNfbGVuIGlzXG4gKiAgICAgYWxzbyB1cGRhdGVkIGlmIHN0cmVlIGlzIG5vdCBudWxsLiBUaGUgZmllbGQgbWF4X2NvZGUgaXMgc2V0LlxuICovXG5mdW5jdGlvbiBidWlsZF90cmVlKHMsIGRlc2MpXG4vLyAgICBkZWZsYXRlX3N0YXRlICpzO1xuLy8gICAgdHJlZV9kZXNjICpkZXNjOyAvKiB0aGUgdHJlZSBkZXNjcmlwdG9yICovXG57XG4gIHZhciB0cmVlICAgICA9IGRlc2MuZHluX3RyZWU7XG4gIHZhciBzdHJlZSAgICA9IGRlc2Muc3RhdF9kZXNjLnN0YXRpY190cmVlO1xuICB2YXIgaGFzX3N0cmVlID0gZGVzYy5zdGF0X2Rlc2MuaGFzX3N0cmVlO1xuICB2YXIgZWxlbXMgICAgPSBkZXNjLnN0YXRfZGVzYy5lbGVtcztcbiAgdmFyIG4sIG07ICAgICAgICAgIC8qIGl0ZXJhdGUgb3ZlciBoZWFwIGVsZW1lbnRzICovXG4gIHZhciBtYXhfY29kZSA9IC0xOyAvKiBsYXJnZXN0IGNvZGUgd2l0aCBub24gemVybyBmcmVxdWVuY3kgKi9cbiAgdmFyIG5vZGU7ICAgICAgICAgIC8qIG5ldyBub2RlIGJlaW5nIGNyZWF0ZWQgKi9cblxuICAvKiBDb25zdHJ1Y3QgdGhlIGluaXRpYWwgaGVhcCwgd2l0aCBsZWFzdCBmcmVxdWVudCBlbGVtZW50IGluXG4gICAqIGhlYXBbU01BTExFU1RdLiBUaGUgc29ucyBvZiBoZWFwW25dIGFyZSBoZWFwWzIqbl0gYW5kIGhlYXBbMipuKzFdLlxuICAgKiBoZWFwWzBdIGlzIG5vdCB1c2VkLlxuICAgKi9cbiAgcy5oZWFwX2xlbiA9IDA7XG4gIHMuaGVhcF9tYXggPSBIRUFQX1NJWkU7XG5cbiAgZm9yIChuID0gMDsgbiA8IGVsZW1zOyBuKyspIHtcbiAgICBpZiAodHJlZVtuICogMl0vKi5GcmVxKi8gIT09IDApIHtcbiAgICAgIHMuaGVhcFsrK3MuaGVhcF9sZW5dID0gbWF4X2NvZGUgPSBuO1xuICAgICAgcy5kZXB0aFtuXSA9IDA7XG5cbiAgICB9IGVsc2Uge1xuICAgICAgdHJlZVtuKjIgKyAxXS8qLkxlbiovID0gMDtcbiAgICB9XG4gIH1cblxuICAvKiBUaGUgcGt6aXAgZm9ybWF0IHJlcXVpcmVzIHRoYXQgYXQgbGVhc3Qgb25lIGRpc3RhbmNlIGNvZGUgZXhpc3RzLFxuICAgKiBhbmQgdGhhdCBhdCBsZWFzdCBvbmUgYml0IHNob3VsZCBiZSBzZW50IGV2ZW4gaWYgdGhlcmUgaXMgb25seSBvbmVcbiAgICogcG9zc2libGUgY29kZS4gU28gdG8gYXZvaWQgc3BlY2lhbCBjaGVja3MgbGF0ZXIgb24gd2UgZm9yY2UgYXQgbGVhc3RcbiAgICogdHdvIGNvZGVzIG9mIG5vbiB6ZXJvIGZyZXF1ZW5jeS5cbiAgICovXG4gIHdoaWxlIChzLmhlYXBfbGVuIDwgMikge1xuICAgIG5vZGUgPSBzLmhlYXBbKytzLmhlYXBfbGVuXSA9IChtYXhfY29kZSA8IDIgPyArK21heF9jb2RlIDogMCk7XG4gICAgdHJlZVtub2RlICogMl0vKi5GcmVxKi8gPSAxO1xuICAgIHMuZGVwdGhbbm9kZV0gPSAwO1xuICAgIHMub3B0X2xlbi0tO1xuXG4gICAgaWYgKGhhc19zdHJlZSkge1xuICAgICAgcy5zdGF0aWNfbGVuIC09IHN0cmVlW25vZGUqMiArIDFdLyouTGVuKi87XG4gICAgfVxuICAgIC8qIG5vZGUgaXMgMCBvciAxIHNvIGl0IGRvZXMgbm90IGhhdmUgZXh0cmEgYml0cyAqL1xuICB9XG4gIGRlc2MubWF4X2NvZGUgPSBtYXhfY29kZTtcblxuICAvKiBUaGUgZWxlbWVudHMgaGVhcFtoZWFwX2xlbi8yKzEgLi4gaGVhcF9sZW5dIGFyZSBsZWF2ZXMgb2YgdGhlIHRyZWUsXG4gICAqIGVzdGFibGlzaCBzdWItaGVhcHMgb2YgaW5jcmVhc2luZyBsZW5ndGhzOlxuICAgKi9cbiAgZm9yIChuID0gKHMuaGVhcF9sZW4gPj4gMS8qaW50IC8yKi8pOyBuID49IDE7IG4tLSkgeyBwcWRvd25oZWFwKHMsIHRyZWUsIG4pOyB9XG5cbiAgLyogQ29uc3RydWN0IHRoZSBIdWZmbWFuIHRyZWUgYnkgcmVwZWF0ZWRseSBjb21iaW5pbmcgdGhlIGxlYXN0IHR3b1xuICAgKiBmcmVxdWVudCBub2Rlcy5cbiAgICovXG4gIG5vZGUgPSBlbGVtczsgICAgICAgICAgICAgIC8qIG5leHQgaW50ZXJuYWwgbm9kZSBvZiB0aGUgdHJlZSAqL1xuICBkbyB7XG4gICAgLy9wcXJlbW92ZShzLCB0cmVlLCBuKTsgIC8qIG4gPSBub2RlIG9mIGxlYXN0IGZyZXF1ZW5jeSAqL1xuICAgIC8qKiogcHFyZW1vdmUgKioqL1xuICAgIG4gPSBzLmhlYXBbMS8qU01BTExFU1QqL107XG4gICAgcy5oZWFwWzEvKlNNQUxMRVNUKi9dID0gcy5oZWFwW3MuaGVhcF9sZW4tLV07XG4gICAgcHFkb3duaGVhcChzLCB0cmVlLCAxLypTTUFMTEVTVCovKTtcbiAgICAvKioqL1xuXG4gICAgbSA9IHMuaGVhcFsxLypTTUFMTEVTVCovXTsgLyogbSA9IG5vZGUgb2YgbmV4dCBsZWFzdCBmcmVxdWVuY3kgKi9cblxuICAgIHMuaGVhcFstLXMuaGVhcF9tYXhdID0gbjsgLyoga2VlcCB0aGUgbm9kZXMgc29ydGVkIGJ5IGZyZXF1ZW5jeSAqL1xuICAgIHMuaGVhcFstLXMuaGVhcF9tYXhdID0gbTtcblxuICAgIC8qIENyZWF0ZSBhIG5ldyBub2RlIGZhdGhlciBvZiBuIGFuZCBtICovXG4gICAgdHJlZVtub2RlICogMl0vKi5GcmVxKi8gPSB0cmVlW24gKiAyXS8qLkZyZXEqLyArIHRyZWVbbSAqIDJdLyouRnJlcSovO1xuICAgIHMuZGVwdGhbbm9kZV0gPSAocy5kZXB0aFtuXSA+PSBzLmRlcHRoW21dID8gcy5kZXB0aFtuXSA6IHMuZGVwdGhbbV0pICsgMTtcbiAgICB0cmVlW24qMiArIDFdLyouRGFkKi8gPSB0cmVlW20qMiArIDFdLyouRGFkKi8gPSBub2RlO1xuXG4gICAgLyogYW5kIGluc2VydCB0aGUgbmV3IG5vZGUgaW4gdGhlIGhlYXAgKi9cbiAgICBzLmhlYXBbMS8qU01BTExFU1QqL10gPSBub2RlKys7XG4gICAgcHFkb3duaGVhcChzLCB0cmVlLCAxLypTTUFMTEVTVCovKTtcblxuICB9IHdoaWxlIChzLmhlYXBfbGVuID49IDIpO1xuXG4gIHMuaGVhcFstLXMuaGVhcF9tYXhdID0gcy5oZWFwWzEvKlNNQUxMRVNUKi9dO1xuXG4gIC8qIEF0IHRoaXMgcG9pbnQsIHRoZSBmaWVsZHMgZnJlcSBhbmQgZGFkIGFyZSBzZXQuIFdlIGNhbiBub3dcbiAgICogZ2VuZXJhdGUgdGhlIGJpdCBsZW5ndGhzLlxuICAgKi9cbiAgZ2VuX2JpdGxlbihzLCBkZXNjKTtcblxuICAvKiBUaGUgZmllbGQgbGVuIGlzIG5vdyBzZXQsIHdlIGNhbiBnZW5lcmF0ZSB0aGUgYml0IGNvZGVzICovXG4gIGdlbl9jb2Rlcyh0cmVlLCBtYXhfY29kZSwgcy5ibF9jb3VudCk7XG59XG5cblxuLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKiBTY2FuIGEgbGl0ZXJhbCBvciBkaXN0YW5jZSB0cmVlIHRvIGRldGVybWluZSB0aGUgZnJlcXVlbmNpZXMgb2YgdGhlIGNvZGVzXG4gKiBpbiB0aGUgYml0IGxlbmd0aCB0cmVlLlxuICovXG5mdW5jdGlvbiBzY2FuX3RyZWUocywgdHJlZSwgbWF4X2NvZGUpXG4vLyAgICBkZWZsYXRlX3N0YXRlICpzO1xuLy8gICAgY3RfZGF0YSAqdHJlZTsgICAvKiB0aGUgdHJlZSB0byBiZSBzY2FubmVkICovXG4vLyAgICBpbnQgbWF4X2NvZGU7ICAgIC8qIGFuZCBpdHMgbGFyZ2VzdCBjb2RlIG9mIG5vbiB6ZXJvIGZyZXF1ZW5jeSAqL1xue1xuICB2YXIgbjsgICAgICAgICAgICAgICAgICAgICAvKiBpdGVyYXRlcyBvdmVyIGFsbCB0cmVlIGVsZW1lbnRzICovXG4gIHZhciBwcmV2bGVuID0gLTE7ICAgICAgICAgIC8qIGxhc3QgZW1pdHRlZCBsZW5ndGggKi9cbiAgdmFyIGN1cmxlbjsgICAgICAgICAgICAgICAgLyogbGVuZ3RoIG9mIGN1cnJlbnQgY29kZSAqL1xuXG4gIHZhciBuZXh0bGVuID0gdHJlZVswKjIgKyAxXS8qLkxlbiovOyAvKiBsZW5ndGggb2YgbmV4dCBjb2RlICovXG5cbiAgdmFyIGNvdW50ID0gMDsgICAgICAgICAgICAgLyogcmVwZWF0IGNvdW50IG9mIHRoZSBjdXJyZW50IGNvZGUgKi9cbiAgdmFyIG1heF9jb3VudCA9IDc7ICAgICAgICAgLyogbWF4IHJlcGVhdCBjb3VudCAqL1xuICB2YXIgbWluX2NvdW50ID0gNDsgICAgICAgICAvKiBtaW4gcmVwZWF0IGNvdW50ICovXG5cbiAgaWYgKG5leHRsZW4gPT09IDApIHtcbiAgICBtYXhfY291bnQgPSAxMzg7XG4gICAgbWluX2NvdW50ID0gMztcbiAgfVxuICB0cmVlWyhtYXhfY29kZSsxKSoyICsgMV0vKi5MZW4qLyA9IDB4ZmZmZjsgLyogZ3VhcmQgKi9cblxuICBmb3IgKG4gPSAwOyBuIDw9IG1heF9jb2RlOyBuKyspIHtcbiAgICBjdXJsZW4gPSBuZXh0bGVuO1xuICAgIG5leHRsZW4gPSB0cmVlWyhuKzEpKjIgKyAxXS8qLkxlbiovO1xuXG4gICAgaWYgKCsrY291bnQgPCBtYXhfY291bnQgJiYgY3VybGVuID09PSBuZXh0bGVuKSB7XG4gICAgICBjb250aW51ZTtcblxuICAgIH0gZWxzZSBpZiAoY291bnQgPCBtaW5fY291bnQpIHtcbiAgICAgIHMuYmxfdHJlZVtjdXJsZW4gKiAyXS8qLkZyZXEqLyArPSBjb3VudDtcblxuICAgIH0gZWxzZSBpZiAoY3VybGVuICE9PSAwKSB7XG5cbiAgICAgIGlmIChjdXJsZW4gIT09IHByZXZsZW4pIHsgcy5ibF90cmVlW2N1cmxlbiAqIDJdLyouRnJlcSovKys7IH1cbiAgICAgIHMuYmxfdHJlZVtSRVBfM182KjJdLyouRnJlcSovKys7XG5cbiAgICB9IGVsc2UgaWYgKGNvdW50IDw9IDEwKSB7XG4gICAgICBzLmJsX3RyZWVbUkVQWl8zXzEwKjJdLyouRnJlcSovKys7XG5cbiAgICB9IGVsc2Uge1xuICAgICAgcy5ibF90cmVlW1JFUFpfMTFfMTM4KjJdLyouRnJlcSovKys7XG4gICAgfVxuXG4gICAgY291bnQgPSAwO1xuICAgIHByZXZsZW4gPSBjdXJsZW47XG5cbiAgICBpZiAobmV4dGxlbiA9PT0gMCkge1xuICAgICAgbWF4X2NvdW50ID0gMTM4O1xuICAgICAgbWluX2NvdW50ID0gMztcblxuICAgIH0gZWxzZSBpZiAoY3VybGVuID09PSBuZXh0bGVuKSB7XG4gICAgICBtYXhfY291bnQgPSA2O1xuICAgICAgbWluX2NvdW50ID0gMztcblxuICAgIH0gZWxzZSB7XG4gICAgICBtYXhfY291bnQgPSA3O1xuICAgICAgbWluX2NvdW50ID0gNDtcbiAgICB9XG4gIH1cbn1cblxuXG4vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqIFNlbmQgYSBsaXRlcmFsIG9yIGRpc3RhbmNlIHRyZWUgaW4gY29tcHJlc3NlZCBmb3JtLCB1c2luZyB0aGUgY29kZXMgaW5cbiAqIGJsX3RyZWUuXG4gKi9cbmZ1bmN0aW9uIHNlbmRfdHJlZShzLCB0cmVlLCBtYXhfY29kZSlcbi8vICAgIGRlZmxhdGVfc3RhdGUgKnM7XG4vLyAgICBjdF9kYXRhICp0cmVlOyAvKiB0aGUgdHJlZSB0byBiZSBzY2FubmVkICovXG4vLyAgICBpbnQgbWF4X2NvZGU7ICAgICAgIC8qIGFuZCBpdHMgbGFyZ2VzdCBjb2RlIG9mIG5vbiB6ZXJvIGZyZXF1ZW5jeSAqL1xue1xuICB2YXIgbjsgICAgICAgICAgICAgICAgICAgICAvKiBpdGVyYXRlcyBvdmVyIGFsbCB0cmVlIGVsZW1lbnRzICovXG4gIHZhciBwcmV2bGVuID0gLTE7ICAgICAgICAgIC8qIGxhc3QgZW1pdHRlZCBsZW5ndGggKi9cbiAgdmFyIGN1cmxlbjsgICAgICAgICAgICAgICAgLyogbGVuZ3RoIG9mIGN1cnJlbnQgY29kZSAqL1xuXG4gIHZhciBuZXh0bGVuID0gdHJlZVswKjIgKyAxXS8qLkxlbiovOyAvKiBsZW5ndGggb2YgbmV4dCBjb2RlICovXG5cbiAgdmFyIGNvdW50ID0gMDsgICAgICAgICAgICAgLyogcmVwZWF0IGNvdW50IG9mIHRoZSBjdXJyZW50IGNvZGUgKi9cbiAgdmFyIG1heF9jb3VudCA9IDc7ICAgICAgICAgLyogbWF4IHJlcGVhdCBjb3VudCAqL1xuICB2YXIgbWluX2NvdW50ID0gNDsgICAgICAgICAvKiBtaW4gcmVwZWF0IGNvdW50ICovXG5cbiAgLyogdHJlZVttYXhfY29kZSsxXS5MZW4gPSAtMTsgKi8gIC8qIGd1YXJkIGFscmVhZHkgc2V0ICovXG4gIGlmIChuZXh0bGVuID09PSAwKSB7XG4gICAgbWF4X2NvdW50ID0gMTM4O1xuICAgIG1pbl9jb3VudCA9IDM7XG4gIH1cblxuICBmb3IgKG4gPSAwOyBuIDw9IG1heF9jb2RlOyBuKyspIHtcbiAgICBjdXJsZW4gPSBuZXh0bGVuO1xuICAgIG5leHRsZW4gPSB0cmVlWyhuKzEpKjIgKyAxXS8qLkxlbiovO1xuXG4gICAgaWYgKCsrY291bnQgPCBtYXhfY291bnQgJiYgY3VybGVuID09PSBuZXh0bGVuKSB7XG4gICAgICBjb250aW51ZTtcblxuICAgIH0gZWxzZSBpZiAoY291bnQgPCBtaW5fY291bnQpIHtcbiAgICAgIGRvIHsgc2VuZF9jb2RlKHMsIGN1cmxlbiwgcy5ibF90cmVlKTsgfSB3aGlsZSAoLS1jb3VudCAhPT0gMCk7XG5cbiAgICB9IGVsc2UgaWYgKGN1cmxlbiAhPT0gMCkge1xuICAgICAgaWYgKGN1cmxlbiAhPT0gcHJldmxlbikge1xuICAgICAgICBzZW5kX2NvZGUocywgY3VybGVuLCBzLmJsX3RyZWUpO1xuICAgICAgICBjb3VudC0tO1xuICAgICAgfVxuICAgICAgLy9Bc3NlcnQoY291bnQgPj0gMyAmJiBjb3VudCA8PSA2LCBcIiAzXzY/XCIpO1xuICAgICAgc2VuZF9jb2RlKHMsIFJFUF8zXzYsIHMuYmxfdHJlZSk7XG4gICAgICBzZW5kX2JpdHMocywgY291bnQtMywgMik7XG5cbiAgICB9IGVsc2UgaWYgKGNvdW50IDw9IDEwKSB7XG4gICAgICBzZW5kX2NvZGUocywgUkVQWl8zXzEwLCBzLmJsX3RyZWUpO1xuICAgICAgc2VuZF9iaXRzKHMsIGNvdW50LTMsIDMpO1xuXG4gICAgfSBlbHNlIHtcbiAgICAgIHNlbmRfY29kZShzLCBSRVBaXzExXzEzOCwgcy5ibF90cmVlKTtcbiAgICAgIHNlbmRfYml0cyhzLCBjb3VudC0xMSwgNyk7XG4gICAgfVxuXG4gICAgY291bnQgPSAwO1xuICAgIHByZXZsZW4gPSBjdXJsZW47XG4gICAgaWYgKG5leHRsZW4gPT09IDApIHtcbiAgICAgIG1heF9jb3VudCA9IDEzODtcbiAgICAgIG1pbl9jb3VudCA9IDM7XG5cbiAgICB9IGVsc2UgaWYgKGN1cmxlbiA9PT0gbmV4dGxlbikge1xuICAgICAgbWF4X2NvdW50ID0gNjtcbiAgICAgIG1pbl9jb3VudCA9IDM7XG5cbiAgICB9IGVsc2Uge1xuICAgICAgbWF4X2NvdW50ID0gNztcbiAgICAgIG1pbl9jb3VudCA9IDQ7XG4gICAgfVxuICB9XG59XG5cblxuLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKiBDb25zdHJ1Y3QgdGhlIEh1ZmZtYW4gdHJlZSBmb3IgdGhlIGJpdCBsZW5ndGhzIGFuZCByZXR1cm4gdGhlIGluZGV4IGluXG4gKiBibF9vcmRlciBvZiB0aGUgbGFzdCBiaXQgbGVuZ3RoIGNvZGUgdG8gc2VuZC5cbiAqL1xuZnVuY3Rpb24gYnVpbGRfYmxfdHJlZShzKSB7XG4gIHZhciBtYXhfYmxpbmRleDsgIC8qIGluZGV4IG9mIGxhc3QgYml0IGxlbmd0aCBjb2RlIG9mIG5vbiB6ZXJvIGZyZXEgKi9cblxuICAvKiBEZXRlcm1pbmUgdGhlIGJpdCBsZW5ndGggZnJlcXVlbmNpZXMgZm9yIGxpdGVyYWwgYW5kIGRpc3RhbmNlIHRyZWVzICovXG4gIHNjYW5fdHJlZShzLCBzLmR5bl9sdHJlZSwgcy5sX2Rlc2MubWF4X2NvZGUpO1xuICBzY2FuX3RyZWUocywgcy5keW5fZHRyZWUsIHMuZF9kZXNjLm1heF9jb2RlKTtcblxuICAvKiBCdWlsZCB0aGUgYml0IGxlbmd0aCB0cmVlOiAqL1xuICBidWlsZF90cmVlKHMsIHMuYmxfZGVzYyk7XG4gIC8qIG9wdF9sZW4gbm93IGluY2x1ZGVzIHRoZSBsZW5ndGggb2YgdGhlIHRyZWUgcmVwcmVzZW50YXRpb25zLCBleGNlcHRcbiAgICogdGhlIGxlbmd0aHMgb2YgdGhlIGJpdCBsZW5ndGhzIGNvZGVzIGFuZCB0aGUgNSs1KzQgYml0cyBmb3IgdGhlIGNvdW50cy5cbiAgICovXG5cbiAgLyogRGV0ZXJtaW5lIHRoZSBudW1iZXIgb2YgYml0IGxlbmd0aCBjb2RlcyB0byBzZW5kLiBUaGUgcGt6aXAgZm9ybWF0XG4gICAqIHJlcXVpcmVzIHRoYXQgYXQgbGVhc3QgNCBiaXQgbGVuZ3RoIGNvZGVzIGJlIHNlbnQuIChhcHBub3RlLnR4dCBzYXlzXG4gICAqIDMgYnV0IHRoZSBhY3R1YWwgdmFsdWUgdXNlZCBpcyA0LilcbiAgICovXG4gIGZvciAobWF4X2JsaW5kZXggPSBCTF9DT0RFUy0xOyBtYXhfYmxpbmRleCA+PSAzOyBtYXhfYmxpbmRleC0tKSB7XG4gICAgaWYgKHMuYmxfdHJlZVtibF9vcmRlclttYXhfYmxpbmRleF0qMiArIDFdLyouTGVuKi8gIT09IDApIHtcbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxuICAvKiBVcGRhdGUgb3B0X2xlbiB0byBpbmNsdWRlIHRoZSBiaXQgbGVuZ3RoIHRyZWUgYW5kIGNvdW50cyAqL1xuICBzLm9wdF9sZW4gKz0gMyoobWF4X2JsaW5kZXgrMSkgKyA1KzUrNDtcbiAgLy9UcmFjZXYoKHN0ZGVyciwgXCJcXG5keW4gdHJlZXM6IGR5biAlbGQsIHN0YXQgJWxkXCIsXG4gIC8vICAgICAgICBzLT5vcHRfbGVuLCBzLT5zdGF0aWNfbGVuKSk7XG5cbiAgcmV0dXJuIG1heF9ibGluZGV4O1xufVxuXG5cbi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICogU2VuZCB0aGUgaGVhZGVyIGZvciBhIGJsb2NrIHVzaW5nIGR5bmFtaWMgSHVmZm1hbiB0cmVlczogdGhlIGNvdW50cywgdGhlXG4gKiBsZW5ndGhzIG9mIHRoZSBiaXQgbGVuZ3RoIGNvZGVzLCB0aGUgbGl0ZXJhbCB0cmVlIGFuZCB0aGUgZGlzdGFuY2UgdHJlZS5cbiAqIElOIGFzc2VydGlvbjogbGNvZGVzID49IDI1NywgZGNvZGVzID49IDEsIGJsY29kZXMgPj0gNC5cbiAqL1xuZnVuY3Rpb24gc2VuZF9hbGxfdHJlZXMocywgbGNvZGVzLCBkY29kZXMsIGJsY29kZXMpXG4vLyAgICBkZWZsYXRlX3N0YXRlICpzO1xuLy8gICAgaW50IGxjb2RlcywgZGNvZGVzLCBibGNvZGVzOyAvKiBudW1iZXIgb2YgY29kZXMgZm9yIGVhY2ggdHJlZSAqL1xue1xuICB2YXIgcmFuazsgICAgICAgICAgICAgICAgICAgIC8qIGluZGV4IGluIGJsX29yZGVyICovXG5cbiAgLy9Bc3NlcnQgKGxjb2RlcyA+PSAyNTcgJiYgZGNvZGVzID49IDEgJiYgYmxjb2RlcyA+PSA0LCBcIm5vdCBlbm91Z2ggY29kZXNcIik7XG4gIC8vQXNzZXJ0IChsY29kZXMgPD0gTF9DT0RFUyAmJiBkY29kZXMgPD0gRF9DT0RFUyAmJiBibGNvZGVzIDw9IEJMX0NPREVTLFxuICAvLyAgICAgICAgXCJ0b28gbWFueSBjb2Rlc1wiKTtcbiAgLy9UcmFjZXYoKHN0ZGVyciwgXCJcXG5ibCBjb3VudHM6IFwiKSk7XG4gIHNlbmRfYml0cyhzLCBsY29kZXMtMjU3LCA1KTsgLyogbm90ICsyNTUgYXMgc3RhdGVkIGluIGFwcG5vdGUudHh0ICovXG4gIHNlbmRfYml0cyhzLCBkY29kZXMtMSwgICA1KTtcbiAgc2VuZF9iaXRzKHMsIGJsY29kZXMtNCwgIDQpOyAvKiBub3QgLTMgYXMgc3RhdGVkIGluIGFwcG5vdGUudHh0ICovXG4gIGZvciAocmFuayA9IDA7IHJhbmsgPCBibGNvZGVzOyByYW5rKyspIHtcbiAgICAvL1RyYWNldigoc3RkZXJyLCBcIlxcbmJsIGNvZGUgJTJkIFwiLCBibF9vcmRlcltyYW5rXSkpO1xuICAgIHNlbmRfYml0cyhzLCBzLmJsX3RyZWVbYmxfb3JkZXJbcmFua10qMiArIDFdLyouTGVuKi8sIDMpO1xuICB9XG4gIC8vVHJhY2V2KChzdGRlcnIsIFwiXFxuYmwgdHJlZTogc2VudCAlbGRcIiwgcy0+Yml0c19zZW50KSk7XG5cbiAgc2VuZF90cmVlKHMsIHMuZHluX2x0cmVlLCBsY29kZXMtMSk7IC8qIGxpdGVyYWwgdHJlZSAqL1xuICAvL1RyYWNldigoc3RkZXJyLCBcIlxcbmxpdCB0cmVlOiBzZW50ICVsZFwiLCBzLT5iaXRzX3NlbnQpKTtcblxuICBzZW5kX3RyZWUocywgcy5keW5fZHRyZWUsIGRjb2Rlcy0xKTsgLyogZGlzdGFuY2UgdHJlZSAqL1xuICAvL1RyYWNldigoc3RkZXJyLCBcIlxcbmRpc3QgdHJlZTogc2VudCAlbGRcIiwgcy0+Yml0c19zZW50KSk7XG59XG5cblxuLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKiBDaGVjayBpZiB0aGUgZGF0YSB0eXBlIGlzIFRFWFQgb3IgQklOQVJZLCB1c2luZyB0aGUgZm9sbG93aW5nIGFsZ29yaXRobTpcbiAqIC0gVEVYVCBpZiB0aGUgdHdvIGNvbmRpdGlvbnMgYmVsb3cgYXJlIHNhdGlzZmllZDpcbiAqICAgIGEpIFRoZXJlIGFyZSBubyBub24tcG9ydGFibGUgY29udHJvbCBjaGFyYWN0ZXJzIGJlbG9uZ2luZyB0byB0aGVcbiAqICAgICAgIFwiYmxhY2sgbGlzdFwiICgwLi42LCAxNC4uMjUsIDI4Li4zMSkuXG4gKiAgICBiKSBUaGVyZSBpcyBhdCBsZWFzdCBvbmUgcHJpbnRhYmxlIGNoYXJhY3RlciBiZWxvbmdpbmcgdG8gdGhlXG4gKiAgICAgICBcIndoaXRlIGxpc3RcIiAoOSB7VEFCfSwgMTAge0xGfSwgMTMge0NSfSwgMzIuLjI1NSkuXG4gKiAtIEJJTkFSWSBvdGhlcndpc2UuXG4gKiAtIFRoZSBmb2xsb3dpbmcgcGFydGlhbGx5LXBvcnRhYmxlIGNvbnRyb2wgY2hhcmFjdGVycyBmb3JtIGFcbiAqICAgXCJncmF5IGxpc3RcIiB0aGF0IGlzIGlnbm9yZWQgaW4gdGhpcyBkZXRlY3Rpb24gYWxnb3JpdGhtOlxuICogICAoNyB7QkVMfSwgOCB7QlN9LCAxMSB7VlR9LCAxMiB7RkZ9LCAyNiB7U1VCfSwgMjcge0VTQ30pLlxuICogSU4gYXNzZXJ0aW9uOiB0aGUgZmllbGRzIEZyZXEgb2YgZHluX2x0cmVlIGFyZSBzZXQuXG4gKi9cbmZ1bmN0aW9uIGRldGVjdF9kYXRhX3R5cGUocykge1xuICAvKiBibGFja19tYXNrIGlzIHRoZSBiaXQgbWFzayBvZiBibGFjay1saXN0ZWQgYnl0ZXNcbiAgICogc2V0IGJpdHMgMC4uNiwgMTQuLjI1LCBhbmQgMjguLjMxXG4gICAqIDB4ZjNmZmMwN2YgPSBiaW5hcnkgMTExMTAwMTExMTExMTExMTExMDAwMDAwMDExMTExMTFcbiAgICovXG4gIHZhciBibGFja19tYXNrID0gMHhmM2ZmYzA3ZjtcbiAgdmFyIG47XG5cbiAgLyogQ2hlY2sgZm9yIG5vbi10ZXh0dWFsIChcImJsYWNrLWxpc3RlZFwiKSBieXRlcy4gKi9cbiAgZm9yIChuID0gMDsgbiA8PSAzMTsgbisrLCBibGFja19tYXNrID4+Pj0gMSkge1xuICAgIGlmICgoYmxhY2tfbWFzayAmIDEpICYmIChzLmR5bl9sdHJlZVtuKjJdLyouRnJlcSovICE9PSAwKSkge1xuICAgICAgcmV0dXJuIFpfQklOQVJZO1xuICAgIH1cbiAgfVxuXG4gIC8qIENoZWNrIGZvciB0ZXh0dWFsIChcIndoaXRlLWxpc3RlZFwiKSBieXRlcy4gKi9cbiAgaWYgKHMuZHluX2x0cmVlWzkgKiAyXS8qLkZyZXEqLyAhPT0gMCB8fCBzLmR5bl9sdHJlZVsxMCAqIDJdLyouRnJlcSovICE9PSAwIHx8XG4gICAgICBzLmR5bl9sdHJlZVsxMyAqIDJdLyouRnJlcSovICE9PSAwKSB7XG4gICAgcmV0dXJuIFpfVEVYVDtcbiAgfVxuICBmb3IgKG4gPSAzMjsgbiA8IExJVEVSQUxTOyBuKyspIHtcbiAgICBpZiAocy5keW5fbHRyZWVbbiAqIDJdLyouRnJlcSovICE9PSAwKSB7XG4gICAgICByZXR1cm4gWl9URVhUO1xuICAgIH1cbiAgfVxuXG4gIC8qIFRoZXJlIGFyZSBubyBcImJsYWNrLWxpc3RlZFwiIG9yIFwid2hpdGUtbGlzdGVkXCIgYnl0ZXM6XG4gICAqIHRoaXMgc3RyZWFtIGVpdGhlciBpcyBlbXB0eSBvciBoYXMgdG9sZXJhdGVkIChcImdyYXktbGlzdGVkXCIpIGJ5dGVzIG9ubHkuXG4gICAqL1xuICByZXR1cm4gWl9CSU5BUlk7XG59XG5cblxudmFyIHN0YXRpY19pbml0X2RvbmUgPSBmYWxzZTtcblxuLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKiBJbml0aWFsaXplIHRoZSB0cmVlIGRhdGEgc3RydWN0dXJlcyBmb3IgYSBuZXcgemxpYiBzdHJlYW0uXG4gKi9cbmZ1bmN0aW9uIF90cl9pbml0KHMpXG57XG5cbiAgaWYgKCFzdGF0aWNfaW5pdF9kb25lKSB7XG4gICAgdHJfc3RhdGljX2luaXQoKTtcbiAgICBzdGF0aWNfaW5pdF9kb25lID0gdHJ1ZTtcbiAgfVxuXG4gIHMubF9kZXNjICA9IG5ldyBUcmVlRGVzYyhzLmR5bl9sdHJlZSwgc3RhdGljX2xfZGVzYyk7XG4gIHMuZF9kZXNjICA9IG5ldyBUcmVlRGVzYyhzLmR5bl9kdHJlZSwgc3RhdGljX2RfZGVzYyk7XG4gIHMuYmxfZGVzYyA9IG5ldyBUcmVlRGVzYyhzLmJsX3RyZWUsIHN0YXRpY19ibF9kZXNjKTtcblxuICBzLmJpX2J1ZiA9IDA7XG4gIHMuYmlfdmFsaWQgPSAwO1xuXG4gIC8qIEluaXRpYWxpemUgdGhlIGZpcnN0IGJsb2NrIG9mIHRoZSBmaXJzdCBmaWxlOiAqL1xuICBpbml0X2Jsb2NrKHMpO1xufVxuXG5cbi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICogU2VuZCBhIHN0b3JlZCBibG9ja1xuICovXG5mdW5jdGlvbiBfdHJfc3RvcmVkX2Jsb2NrKHMsIGJ1Ziwgc3RvcmVkX2xlbiwgbGFzdClcbi8vRGVmbGF0ZVN0YXRlICpzO1xuLy9jaGFyZiAqYnVmOyAgICAgICAvKiBpbnB1dCBibG9jayAqL1xuLy91bGcgc3RvcmVkX2xlbjsgICAvKiBsZW5ndGggb2YgaW5wdXQgYmxvY2sgKi9cbi8vaW50IGxhc3Q7ICAgICAgICAgLyogb25lIGlmIHRoaXMgaXMgdGhlIGxhc3QgYmxvY2sgZm9yIGEgZmlsZSAqL1xue1xuICBzZW5kX2JpdHMocywgKFNUT1JFRF9CTE9DSzw8MSkrKGxhc3QgPyAxIDogMCksIDMpOyAgICAvKiBzZW5kIGJsb2NrIHR5cGUgKi9cbiAgY29weV9ibG9jayhzLCBidWYsIHN0b3JlZF9sZW4sIHRydWUpOyAvKiB3aXRoIGhlYWRlciAqL1xufVxuXG5cbi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICogU2VuZCBvbmUgZW1wdHkgc3RhdGljIGJsb2NrIHRvIGdpdmUgZW5vdWdoIGxvb2thaGVhZCBmb3IgaW5mbGF0ZS5cbiAqIFRoaXMgdGFrZXMgMTAgYml0cywgb2Ygd2hpY2ggNyBtYXkgcmVtYWluIGluIHRoZSBiaXQgYnVmZmVyLlxuICovXG5mdW5jdGlvbiBfdHJfYWxpZ24ocykge1xuICBzZW5kX2JpdHMocywgU1RBVElDX1RSRUVTPDwxLCAzKTtcbiAgc2VuZF9jb2RlKHMsIEVORF9CTE9DSywgc3RhdGljX2x0cmVlKTtcbiAgYmlfZmx1c2gocyk7XG59XG5cblxuLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKiBEZXRlcm1pbmUgdGhlIGJlc3QgZW5jb2RpbmcgZm9yIHRoZSBjdXJyZW50IGJsb2NrOiBkeW5hbWljIHRyZWVzLCBzdGF0aWNcbiAqIHRyZWVzIG9yIHN0b3JlLCBhbmQgb3V0cHV0IHRoZSBlbmNvZGVkIGJsb2NrIHRvIHRoZSB6aXAgZmlsZS5cbiAqL1xuZnVuY3Rpb24gX3RyX2ZsdXNoX2Jsb2NrKHMsIGJ1Ziwgc3RvcmVkX2xlbiwgbGFzdClcbi8vRGVmbGF0ZVN0YXRlICpzO1xuLy9jaGFyZiAqYnVmOyAgICAgICAvKiBpbnB1dCBibG9jaywgb3IgTlVMTCBpZiB0b28gb2xkICovXG4vL3VsZyBzdG9yZWRfbGVuOyAgIC8qIGxlbmd0aCBvZiBpbnB1dCBibG9jayAqL1xuLy9pbnQgbGFzdDsgICAgICAgICAvKiBvbmUgaWYgdGhpcyBpcyB0aGUgbGFzdCBibG9jayBmb3IgYSBmaWxlICovXG57XG4gIHZhciBvcHRfbGVuYiwgc3RhdGljX2xlbmI7ICAvKiBvcHRfbGVuIGFuZCBzdGF0aWNfbGVuIGluIGJ5dGVzICovXG4gIHZhciBtYXhfYmxpbmRleCA9IDA7ICAgICAgICAvKiBpbmRleCBvZiBsYXN0IGJpdCBsZW5ndGggY29kZSBvZiBub24gemVybyBmcmVxICovXG5cbiAgLyogQnVpbGQgdGhlIEh1ZmZtYW4gdHJlZXMgdW5sZXNzIGEgc3RvcmVkIGJsb2NrIGlzIGZvcmNlZCAqL1xuICBpZiAocy5sZXZlbCA+IDApIHtcblxuICAgIC8qIENoZWNrIGlmIHRoZSBmaWxlIGlzIGJpbmFyeSBvciB0ZXh0ICovXG4gICAgaWYgKHMuc3RybS5kYXRhX3R5cGUgPT09IFpfVU5LTk9XTikge1xuICAgICAgcy5zdHJtLmRhdGFfdHlwZSA9IGRldGVjdF9kYXRhX3R5cGUocyk7XG4gICAgfVxuXG4gICAgLyogQ29uc3RydWN0IHRoZSBsaXRlcmFsIGFuZCBkaXN0YW5jZSB0cmVlcyAqL1xuICAgIGJ1aWxkX3RyZWUocywgcy5sX2Rlc2MpO1xuICAgIC8vIFRyYWNldigoc3RkZXJyLCBcIlxcbmxpdCBkYXRhOiBkeW4gJWxkLCBzdGF0ICVsZFwiLCBzLT5vcHRfbGVuLFxuICAgIC8vICAgICAgICBzLT5zdGF0aWNfbGVuKSk7XG5cbiAgICBidWlsZF90cmVlKHMsIHMuZF9kZXNjKTtcbiAgICAvLyBUcmFjZXYoKHN0ZGVyciwgXCJcXG5kaXN0IGRhdGE6IGR5biAlbGQsIHN0YXQgJWxkXCIsIHMtPm9wdF9sZW4sXG4gICAgLy8gICAgICAgIHMtPnN0YXRpY19sZW4pKTtcbiAgICAvKiBBdCB0aGlzIHBvaW50LCBvcHRfbGVuIGFuZCBzdGF0aWNfbGVuIGFyZSB0aGUgdG90YWwgYml0IGxlbmd0aHMgb2ZcbiAgICAgKiB0aGUgY29tcHJlc3NlZCBibG9jayBkYXRhLCBleGNsdWRpbmcgdGhlIHRyZWUgcmVwcmVzZW50YXRpb25zLlxuICAgICAqL1xuXG4gICAgLyogQnVpbGQgdGhlIGJpdCBsZW5ndGggdHJlZSBmb3IgdGhlIGFib3ZlIHR3byB0cmVlcywgYW5kIGdldCB0aGUgaW5kZXhcbiAgICAgKiBpbiBibF9vcmRlciBvZiB0aGUgbGFzdCBiaXQgbGVuZ3RoIGNvZGUgdG8gc2VuZC5cbiAgICAgKi9cbiAgICBtYXhfYmxpbmRleCA9IGJ1aWxkX2JsX3RyZWUocyk7XG5cbiAgICAvKiBEZXRlcm1pbmUgdGhlIGJlc3QgZW5jb2RpbmcuIENvbXB1dGUgdGhlIGJsb2NrIGxlbmd0aHMgaW4gYnl0ZXMuICovXG4gICAgb3B0X2xlbmIgPSAocy5vcHRfbGVuKzMrNykgPj4+IDM7XG4gICAgc3RhdGljX2xlbmIgPSAocy5zdGF0aWNfbGVuKzMrNykgPj4+IDM7XG5cbiAgICAvLyBUcmFjZXYoKHN0ZGVyciwgXCJcXG5vcHQgJWx1KCVsdSkgc3RhdCAlbHUoJWx1KSBzdG9yZWQgJWx1IGxpdCAldSBcIixcbiAgICAvLyAgICAgICAgb3B0X2xlbmIsIHMtPm9wdF9sZW4sIHN0YXRpY19sZW5iLCBzLT5zdGF0aWNfbGVuLCBzdG9yZWRfbGVuLFxuICAgIC8vICAgICAgICBzLT5sYXN0X2xpdCkpO1xuXG4gICAgaWYgKHN0YXRpY19sZW5iIDw9IG9wdF9sZW5iKSB7IG9wdF9sZW5iID0gc3RhdGljX2xlbmI7IH1cblxuICB9IGVsc2Uge1xuICAgIC8vIEFzc2VydChidWYgIT0gKGNoYXIqKTAsIFwibG9zdCBidWZcIik7XG4gICAgb3B0X2xlbmIgPSBzdGF0aWNfbGVuYiA9IHN0b3JlZF9sZW4gKyA1OyAvKiBmb3JjZSBhIHN0b3JlZCBibG9jayAqL1xuICB9XG5cbiAgaWYgKChzdG9yZWRfbGVuKzQgPD0gb3B0X2xlbmIpICYmIChidWYgIT09IC0xKSkge1xuICAgIC8qIDQ6IHR3byB3b3JkcyBmb3IgdGhlIGxlbmd0aHMgKi9cblxuICAgIC8qIFRoZSB0ZXN0IGJ1ZiAhPSBOVUxMIGlzIG9ubHkgbmVjZXNzYXJ5IGlmIExJVF9CVUZTSVpFID4gV1NJWkUuXG4gICAgICogT3RoZXJ3aXNlIHdlIGNhbid0IGhhdmUgcHJvY2Vzc2VkIG1vcmUgdGhhbiBXU0laRSBpbnB1dCBieXRlcyBzaW5jZVxuICAgICAqIHRoZSBsYXN0IGJsb2NrIGZsdXNoLCBiZWNhdXNlIGNvbXByZXNzaW9uIHdvdWxkIGhhdmUgYmVlblxuICAgICAqIHN1Y2Nlc3NmdWwuIElmIExJVF9CVUZTSVpFIDw9IFdTSVpFLCBpdCBpcyBuZXZlciB0b28gbGF0ZSB0b1xuICAgICAqIHRyYW5zZm9ybSBhIGJsb2NrIGludG8gYSBzdG9yZWQgYmxvY2suXG4gICAgICovXG4gICAgX3RyX3N0b3JlZF9ibG9jayhzLCBidWYsIHN0b3JlZF9sZW4sIGxhc3QpO1xuXG4gIH0gZWxzZSBpZiAocy5zdHJhdGVneSA9PT0gWl9GSVhFRCB8fCBzdGF0aWNfbGVuYiA9PT0gb3B0X2xlbmIpIHtcblxuICAgIHNlbmRfYml0cyhzLCAoU1RBVElDX1RSRUVTPDwxKSArIChsYXN0ID8gMSA6IDApLCAzKTtcbiAgICBjb21wcmVzc19ibG9jayhzLCBzdGF0aWNfbHRyZWUsIHN0YXRpY19kdHJlZSk7XG5cbiAgfSBlbHNlIHtcbiAgICBzZW5kX2JpdHMocywgKERZTl9UUkVFUzw8MSkgKyAobGFzdCA/IDEgOiAwKSwgMyk7XG4gICAgc2VuZF9hbGxfdHJlZXMocywgcy5sX2Rlc2MubWF4X2NvZGUrMSwgcy5kX2Rlc2MubWF4X2NvZGUrMSwgbWF4X2JsaW5kZXgrMSk7XG4gICAgY29tcHJlc3NfYmxvY2socywgcy5keW5fbHRyZWUsIHMuZHluX2R0cmVlKTtcbiAgfVxuICAvLyBBc3NlcnQgKHMtPmNvbXByZXNzZWRfbGVuID09IHMtPmJpdHNfc2VudCwgXCJiYWQgY29tcHJlc3NlZCBzaXplXCIpO1xuICAvKiBUaGUgYWJvdmUgY2hlY2sgaXMgbWFkZSBtb2QgMl4zMiwgZm9yIGZpbGVzIGxhcmdlciB0aGFuIDUxMiBNQlxuICAgKiBhbmQgdUxvbmcgaW1wbGVtZW50ZWQgb24gMzIgYml0cy5cbiAgICovXG4gIGluaXRfYmxvY2socyk7XG5cbiAgaWYgKGxhc3QpIHtcbiAgICBiaV93aW5kdXAocyk7XG4gIH1cbiAgLy8gVHJhY2V2KChzdGRlcnIsXCJcXG5jb21wcmxlbiAlbHUoJWx1KSBcIiwgcy0+Y29tcHJlc3NlZF9sZW4+PjMsXG4gIC8vICAgICAgIHMtPmNvbXByZXNzZWRfbGVuLTcqbGFzdCkpO1xufVxuXG4vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqIFNhdmUgdGhlIG1hdGNoIGluZm8gYW5kIHRhbGx5IHRoZSBmcmVxdWVuY3kgY291bnRzLiBSZXR1cm4gdHJ1ZSBpZlxuICogdGhlIGN1cnJlbnQgYmxvY2sgbXVzdCBiZSBmbHVzaGVkLlxuICovXG5mdW5jdGlvbiBfdHJfdGFsbHkocywgZGlzdCwgbGMpXG4vLyAgICBkZWZsYXRlX3N0YXRlICpzO1xuLy8gICAgdW5zaWduZWQgZGlzdDsgIC8qIGRpc3RhbmNlIG9mIG1hdGNoZWQgc3RyaW5nICovXG4vLyAgICB1bnNpZ25lZCBsYzsgICAgLyogbWF0Y2ggbGVuZ3RoLU1JTl9NQVRDSCBvciB1bm1hdGNoZWQgY2hhciAoaWYgZGlzdD09MCkgKi9cbntcbiAgLy92YXIgb3V0X2xlbmd0aCwgaW5fbGVuZ3RoLCBkY29kZTtcblxuICBzLnBlbmRpbmdfYnVmW3MuZF9idWYgKyBzLmxhc3RfbGl0ICogMl0gICAgID0gKGRpc3QgPj4+IDgpICYgMHhmZjtcbiAgcy5wZW5kaW5nX2J1ZltzLmRfYnVmICsgcy5sYXN0X2xpdCAqIDIgKyAxXSA9IGRpc3QgJiAweGZmO1xuXG4gIHMucGVuZGluZ19idWZbcy5sX2J1ZiArIHMubGFzdF9saXRdID0gbGMgJiAweGZmO1xuICBzLmxhc3RfbGl0Kys7XG5cbiAgaWYgKGRpc3QgPT09IDApIHtcbiAgICAvKiBsYyBpcyB0aGUgdW5tYXRjaGVkIGNoYXIgKi9cbiAgICBzLmR5bl9sdHJlZVtsYyoyXS8qLkZyZXEqLysrO1xuICB9IGVsc2Uge1xuICAgIHMubWF0Y2hlcysrO1xuICAgIC8qIEhlcmUsIGxjIGlzIHRoZSBtYXRjaCBsZW5ndGggLSBNSU5fTUFUQ0ggKi9cbiAgICBkaXN0LS07ICAgICAgICAgICAgIC8qIGRpc3QgPSBtYXRjaCBkaXN0YW5jZSAtIDEgKi9cbiAgICAvL0Fzc2VydCgodXNoKWRpc3QgPCAodXNoKU1BWF9ESVNUKHMpICYmXG4gICAgLy8gICAgICAgKHVzaClsYyA8PSAodXNoKShNQVhfTUFUQ0gtTUlOX01BVENIKSAmJlxuICAgIC8vICAgICAgICh1c2gpZF9jb2RlKGRpc3QpIDwgKHVzaClEX0NPREVTLCAgXCJfdHJfdGFsbHk6IGJhZCBtYXRjaFwiKTtcblxuICAgIHMuZHluX2x0cmVlWyhfbGVuZ3RoX2NvZGVbbGNdK0xJVEVSQUxTKzEpICogMl0vKi5GcmVxKi8rKztcbiAgICBzLmR5bl9kdHJlZVtkX2NvZGUoZGlzdCkgKiAyXS8qLkZyZXEqLysrO1xuICB9XG5cbi8vICghKSBUaGlzIGJsb2NrIGlzIGRpc2FibGVkIGluIHpsaWIgZGVmYWlsdHMsXG4vLyBkb24ndCBlbmFibGUgaXQgZm9yIGJpbmFyeSBjb21wYXRpYmlsaXR5XG5cbi8vI2lmZGVmIFRSVU5DQVRFX0JMT0NLXG4vLyAgLyogVHJ5IHRvIGd1ZXNzIGlmIGl0IGlzIHByb2ZpdGFibGUgdG8gc3RvcCB0aGUgY3VycmVudCBibG9jayBoZXJlICovXG4vLyAgaWYgKChzLmxhc3RfbGl0ICYgMHgxZmZmKSA9PT0gMCAmJiBzLmxldmVsID4gMikge1xuLy8gICAgLyogQ29tcHV0ZSBhbiB1cHBlciBib3VuZCBmb3IgdGhlIGNvbXByZXNzZWQgbGVuZ3RoICovXG4vLyAgICBvdXRfbGVuZ3RoID0gcy5sYXN0X2xpdCo4O1xuLy8gICAgaW5fbGVuZ3RoID0gcy5zdHJzdGFydCAtIHMuYmxvY2tfc3RhcnQ7XG4vL1xuLy8gICAgZm9yIChkY29kZSA9IDA7IGRjb2RlIDwgRF9DT0RFUzsgZGNvZGUrKykge1xuLy8gICAgICBvdXRfbGVuZ3RoICs9IHMuZHluX2R0cmVlW2Rjb2RlKjJdLyouRnJlcSovICogKDUgKyBleHRyYV9kYml0c1tkY29kZV0pO1xuLy8gICAgfVxuLy8gICAgb3V0X2xlbmd0aCA+Pj49IDM7XG4vLyAgICAvL1RyYWNldigoc3RkZXJyLFwiXFxubGFzdF9saXQgJXUsIGluICVsZCwgb3V0IH4lbGQoJWxkJSUpIFwiLFxuLy8gICAgLy8gICAgICAgcy0+bGFzdF9saXQsIGluX2xlbmd0aCwgb3V0X2xlbmd0aCxcbi8vICAgIC8vICAgICAgIDEwMEwgLSBvdXRfbGVuZ3RoKjEwMEwvaW5fbGVuZ3RoKSk7XG4vLyAgICBpZiAocy5tYXRjaGVzIDwgKHMubGFzdF9saXQ+PjEpLyppbnQgLzIqLyAmJiBvdXRfbGVuZ3RoIDwgKGluX2xlbmd0aD4+MSkvKmludCAvMiovKSB7XG4vLyAgICAgIHJldHVybiB0cnVlO1xuLy8gICAgfVxuLy8gIH1cbi8vI2VuZGlmXG5cbiAgcmV0dXJuIChzLmxhc3RfbGl0ID09PSBzLmxpdF9idWZzaXplLTEpO1xuICAvKiBXZSBhdm9pZCBlcXVhbGl0eSB3aXRoIGxpdF9idWZzaXplIGJlY2F1c2Ugb2Ygd3JhcGFyb3VuZCBhdCA2NEtcbiAgICogb24gMTYgYml0IG1hY2hpbmVzIGFuZCBiZWNhdXNlIHN0b3JlZCBibG9ja3MgYXJlIHJlc3RyaWN0ZWQgdG9cbiAgICogNjRLLTEgYnl0ZXMuXG4gICAqL1xufVxuXG5leHBvcnRzLl90cl9pbml0ICA9IF90cl9pbml0O1xuZXhwb3J0cy5fdHJfc3RvcmVkX2Jsb2NrID0gX3RyX3N0b3JlZF9ibG9jaztcbmV4cG9ydHMuX3RyX2ZsdXNoX2Jsb2NrICA9IF90cl9mbHVzaF9ibG9jaztcbmV4cG9ydHMuX3RyX3RhbGx5ID0gX3RyX3RhbGx5O1xuZXhwb3J0cy5fdHJfYWxpZ24gPSBfdHJfYWxpZ247XG59LHtcIi4uL3V0aWxzL2NvbW1vblwiOjI3fV0sMzk6W2Z1bmN0aW9uKF9kZXJlcV8sbW9kdWxlLGV4cG9ydHMpe1xuJ3VzZSBzdHJpY3QnO1xuXG5cbmZ1bmN0aW9uIFpTdHJlYW0oKSB7XG4gIC8qIG5leHQgaW5wdXQgYnl0ZSAqL1xuICB0aGlzLmlucHV0ID0gbnVsbDsgLy8gSlMgc3BlY2lmaWMsIGJlY2F1c2Ugd2UgaGF2ZSBubyBwb2ludGVyc1xuICB0aGlzLm5leHRfaW4gPSAwO1xuICAvKiBudW1iZXIgb2YgYnl0ZXMgYXZhaWxhYmxlIGF0IGlucHV0ICovXG4gIHRoaXMuYXZhaWxfaW4gPSAwO1xuICAvKiB0b3RhbCBudW1iZXIgb2YgaW5wdXQgYnl0ZXMgcmVhZCBzbyBmYXIgKi9cbiAgdGhpcy50b3RhbF9pbiA9IDA7XG4gIC8qIG5leHQgb3V0cHV0IGJ5dGUgc2hvdWxkIGJlIHB1dCB0aGVyZSAqL1xuICB0aGlzLm91dHB1dCA9IG51bGw7IC8vIEpTIHNwZWNpZmljLCBiZWNhdXNlIHdlIGhhdmUgbm8gcG9pbnRlcnNcbiAgdGhpcy5uZXh0X291dCA9IDA7XG4gIC8qIHJlbWFpbmluZyBmcmVlIHNwYWNlIGF0IG91dHB1dCAqL1xuICB0aGlzLmF2YWlsX291dCA9IDA7XG4gIC8qIHRvdGFsIG51bWJlciBvZiBieXRlcyBvdXRwdXQgc28gZmFyICovXG4gIHRoaXMudG90YWxfb3V0ID0gMDtcbiAgLyogbGFzdCBlcnJvciBtZXNzYWdlLCBOVUxMIGlmIG5vIGVycm9yICovXG4gIHRoaXMubXNnID0gJycvKlpfTlVMTCovO1xuICAvKiBub3QgdmlzaWJsZSBieSBhcHBsaWNhdGlvbnMgKi9cbiAgdGhpcy5zdGF0ZSA9IG51bGw7XG4gIC8qIGJlc3QgZ3Vlc3MgYWJvdXQgdGhlIGRhdGEgdHlwZTogYmluYXJ5IG9yIHRleHQgKi9cbiAgdGhpcy5kYXRhX3R5cGUgPSAyLypaX1VOS05PV04qLztcbiAgLyogYWRsZXIzMiB2YWx1ZSBvZiB0aGUgdW5jb21wcmVzc2VkIGRhdGEgKi9cbiAgdGhpcy5hZGxlciA9IDA7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gWlN0cmVhbTtcbn0se31dfSx7fSxbOV0pXG4oOSlcbn0pKTtcbiIsIi8qISB4bHN4LmpzIChDKSAyMDEzLXByZXNlbnQgU2hlZXRKUyAtLSBodHRwOi8vc2hlZXRqcy5jb20gKi9cbi8qIHZpbTogc2V0IHRzPTI6ICovXG4vKmV4cG9ydGVkIFhMU1ggKi9cbi8qZ2xvYmFsIGdsb2JhbCwgZXhwb3J0cywgbW9kdWxlLCByZXF1aXJlOmZhbHNlLCBwcm9jZXNzOmZhbHNlLCBCdWZmZXI6ZmFsc2UsIEFycmF5QnVmZmVyOmZhbHNlICovXG52YXIgWExTWCA9IHt9O1xuZnVuY3Rpb24gbWFrZV94bHN4X2xpYihYTFNYKXtcblhMU1gudmVyc2lvbiA9ICcwLjE3LjEnO1xudmFyIGN1cnJlbnRfY29kZXBhZ2UgPSAxMjAwLCBjdXJyZW50X2Fuc2kgPSAxMjUyO1xuLypnbG9iYWwgY3B0YWJsZTp0cnVlLCB3aW5kb3cgKi9cbmlmKHR5cGVvZiBtb2R1bGUgIT09IFwidW5kZWZpbmVkXCIgJiYgdHlwZW9mIHJlcXVpcmUgIT09ICd1bmRlZmluZWQnKSB7XG5cdGlmKHR5cGVvZiBjcHRhYmxlID09PSAndW5kZWZpbmVkJykge1xuXHRcdGlmKHR5cGVvZiBnbG9iYWwgIT09ICd1bmRlZmluZWQnKSBnbG9iYWwuY3B0YWJsZSA9IHJlcXVpcmUoJy4vZGlzdC9jcGV4Y2VsLmpzJyk7XG5cdFx0ZWxzZSBpZih0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJykgd2luZG93LmNwdGFibGUgPSByZXF1aXJlKCcuL2Rpc3QvY3BleGNlbC5qcycpO1xuXHR9XG59XG5cbnZhciBWQUxJRF9BTlNJID0gWyA4NzQsIDkzMiwgOTM2LCA5NDksIDk1MCBdO1xuZm9yKHZhciBpID0gMDsgaSA8PSA4OyArK2kpIFZBTElEX0FOU0kucHVzaCgxMjUwICsgaSk7XG4vKiBFQ01BLTM3NiBQYXJ0IEkgMTguNC4xIGNoYXJzZXQgdG8gY29kZXBhZ2UgbWFwcGluZyAqL1xudmFyIENTMkNQID0gKHtcbjA6ICAgIDEyNTIsIC8qIEFOU0kgKi9cbjE6ICAgNjUwMDEsIC8qIERFRkFVTFQgKi9cbjI6ICAgNjUwMDEsIC8qIFNZTUJPTCAqL1xuNzc6ICAxMDAwMCwgLyogTUFDICovXG4xMjg6ICAgOTMyLCAvKiBTSElGVEpJUyAqL1xuMTI5OiAgIDk0OSwgLyogSEFOR1VMICovXG4xMzA6ICAxMzYxLCAvKiBKT0hBQiAqL1xuMTM0OiAgIDkzNiwgLyogR0IyMzEyICovXG4xMzY6ICAgOTUwLCAvKiBDSElORVNFQklHNSAqL1xuMTYxOiAgMTI1MywgLyogR1JFRUsgKi9cbjE2MjogIDEyNTQsIC8qIFRVUktJU0ggKi9cbjE2MzogIDEyNTgsIC8qIFZJRVROQU1FU0UgKi9cbjE3NzogIDEyNTUsIC8qIEhFQlJFVyAqL1xuMTc4OiAgMTI1NiwgLyogQVJBQklDICovXG4xODY6ICAxMjU3LCAvKiBCQUxUSUMgKi9cbjIwNDogIDEyNTEsIC8qIFJVU1NJQU4gKi9cbjIyMjogICA4NzQsIC8qIFRIQUkgKi9cbjIzODogIDEyNTAsIC8qIEVBU1RFVVJPUEUgKi9cbjI1NTogIDEyNTIsIC8qIE9FTSAqL1xuNjk6ICAgNjk2OSAgLyogTUlTQyAqL1xufSk7XG5cbnZhciBzZXRfYW5zaSA9IGZ1bmN0aW9uKGNwKSB7IGlmKFZBTElEX0FOU0kuaW5kZXhPZihjcCkgPT0gLTEpIHJldHVybjsgY3VycmVudF9hbnNpID0gQ1MyQ1BbMF0gPSBjcDsgfTtcbmZ1bmN0aW9uIHJlc2V0X2Fuc2koKSB7IHNldF9hbnNpKDEyNTIpOyB9XG5cbnZhciBzZXRfY3AgPSBmdW5jdGlvbihjcCkgeyBjdXJyZW50X2NvZGVwYWdlID0gY3A7IHNldF9hbnNpKGNwKTsgfTtcbmZ1bmN0aW9uIHJlc2V0X2NwKCkgeyBzZXRfY3AoMTIwMCk7IHJlc2V0X2Fuc2koKTsgfVxuXG5mdW5jdGlvbiBjaGFyX2NvZGVzKGRhdGEpIHsgdmFyIG8gPSBbXTsgZm9yKHZhciBpID0gMCwgbGVuID0gZGF0YS5sZW5ndGg7IGkgPCBsZW47ICsraSkgb1tpXSA9IGRhdGEuY2hhckNvZGVBdChpKTsgcmV0dXJuIG87IH1cblxuZnVuY3Rpb24gdXRmMTZsZXJlYWQoZGF0YSkge1xuXHR2YXIgbyA9IFtdO1xuXHRmb3IodmFyIGkgPSAwOyBpIDwgKGRhdGEubGVuZ3RoPj4xKTsgKytpKSBvW2ldID0gU3RyaW5nLmZyb21DaGFyQ29kZShkYXRhLmNoYXJDb2RlQXQoMippKSArIChkYXRhLmNoYXJDb2RlQXQoMippKzEpPDw4KSk7XG5cdHJldHVybiBvLmpvaW4oXCJcIik7XG59XG5mdW5jdGlvbiB1dGYxNmJlcmVhZChkYXRhKSB7XG5cdHZhciBvID0gW107XG5cdGZvcih2YXIgaSA9IDA7IGkgPCAoZGF0YS5sZW5ndGg+PjEpOyArK2kpIG9baV0gPSBTdHJpbmcuZnJvbUNoYXJDb2RlKGRhdGEuY2hhckNvZGVBdCgyKmkrMSkgKyAoZGF0YS5jaGFyQ29kZUF0KDIqaSk8PDgpKTtcblx0cmV0dXJuIG8uam9pbihcIlwiKTtcbn1cblxudmFyIGRlYm9tID0gZnVuY3Rpb24oZGF0YSkge1xuXHR2YXIgYzEgPSBkYXRhLmNoYXJDb2RlQXQoMCksIGMyID0gZGF0YS5jaGFyQ29kZUF0KDEpO1xuXHRpZihjMSA9PSAweEZGICYmIGMyID09IDB4RkUpIHJldHVybiB1dGYxNmxlcmVhZChkYXRhLnNsaWNlKDIpKTtcblx0aWYoYzEgPT0gMHhGRSAmJiBjMiA9PSAweEZGKSByZXR1cm4gdXRmMTZiZXJlYWQoZGF0YS5zbGljZSgyKSk7XG5cdGlmKGMxID09IDB4RkVGRikgcmV0dXJuIGRhdGEuc2xpY2UoMSk7XG5cdHJldHVybiBkYXRhO1xufTtcblxudmFyIF9nZXRjaGFyID0gZnVuY3Rpb24gX2djMSh4KSB7IHJldHVybiBTdHJpbmcuZnJvbUNoYXJDb2RlKHgpOyB9O1xudmFyIF9nZXRhbnNpID0gZnVuY3Rpb24gX2dhMSh4KSB7IHJldHVybiBTdHJpbmcuZnJvbUNoYXJDb2RlKHgpOyB9O1xuaWYodHlwZW9mIGNwdGFibGUgIT09ICd1bmRlZmluZWQnKSB7XG5cdHNldF9jcCA9IGZ1bmN0aW9uKGNwKSB7IGN1cnJlbnRfY29kZXBhZ2UgPSBjcDsgc2V0X2Fuc2koY3ApOyB9O1xuXHRkZWJvbSA9IGZ1bmN0aW9uKGRhdGEpIHtcblx0XHRpZihkYXRhLmNoYXJDb2RlQXQoMCkgPT09IDB4RkYgJiYgZGF0YS5jaGFyQ29kZUF0KDEpID09PSAweEZFKSB7IHJldHVybiBjcHRhYmxlLnV0aWxzLmRlY29kZSgxMjAwLCBjaGFyX2NvZGVzKGRhdGEuc2xpY2UoMikpKTsgfVxuXHRcdHJldHVybiBkYXRhO1xuXHR9O1xuXHRfZ2V0Y2hhciA9IGZ1bmN0aW9uIF9nYzIoeCkge1xuXHRcdGlmKGN1cnJlbnRfY29kZXBhZ2UgPT09IDEyMDApIHJldHVybiBTdHJpbmcuZnJvbUNoYXJDb2RlKHgpO1xuXHRcdHJldHVybiBjcHRhYmxlLnV0aWxzLmRlY29kZShjdXJyZW50X2NvZGVwYWdlLCBbeCYyNTUseD4+OF0pWzBdO1xuXHR9O1xuXHRfZ2V0YW5zaSA9IGZ1bmN0aW9uIF9nYTIoeCkge1xuXHRcdHJldHVybiBjcHRhYmxlLnV0aWxzLmRlY29kZShjdXJyZW50X2Fuc2ksIFt4XSlbMF07XG5cdH07XG59XG52YXIgREVOU0UgPSBudWxsO1xudmFyIERJRl9YTCA9IHRydWU7XG52YXIgQmFzZTY0ID0gKGZ1bmN0aW9uIG1ha2VfYjY0KCl7XG5cdHZhciBtYXAgPSBcIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89XCI7XG5cdHJldHVybiB7XG5cdFx0ZW5jb2RlOiBmdW5jdGlvbihpbnB1dCkge1xuXHRcdFx0dmFyIG8gPSBcIlwiO1xuXHRcdFx0dmFyIGMxPTAsIGMyPTAsIGMzPTAsIGUxPTAsIGUyPTAsIGUzPTAsIGU0PTA7XG5cdFx0XHRmb3IodmFyIGkgPSAwOyBpIDwgaW5wdXQubGVuZ3RoOyApIHtcblx0XHRcdFx0YzEgPSBpbnB1dC5jaGFyQ29kZUF0KGkrKyk7XG5cdFx0XHRcdGUxID0gKGMxID4+IDIpO1xuXG5cdFx0XHRcdGMyID0gaW5wdXQuY2hhckNvZGVBdChpKyspO1xuXHRcdFx0XHRlMiA9ICgoYzEgJiAzKSA8PCA0KSB8IChjMiA+PiA0KTtcblxuXHRcdFx0XHRjMyA9IGlucHV0LmNoYXJDb2RlQXQoaSsrKTtcblx0XHRcdFx0ZTMgPSAoKGMyICYgMTUpIDw8IDIpIHwgKGMzID4+IDYpO1xuXHRcdFx0XHRlNCA9IChjMyAmIDYzKTtcblx0XHRcdFx0aWYgKGlzTmFOKGMyKSkgeyBlMyA9IGU0ID0gNjQ7IH1cblx0XHRcdFx0ZWxzZSBpZiAoaXNOYU4oYzMpKSB7IGU0ID0gNjQ7IH1cblx0XHRcdFx0byArPSBtYXAuY2hhckF0KGUxKSArIG1hcC5jaGFyQXQoZTIpICsgbWFwLmNoYXJBdChlMykgKyBtYXAuY2hhckF0KGU0KTtcblx0XHRcdH1cblx0XHRcdHJldHVybiBvO1xuXHRcdH0sXG5cdFx0ZGVjb2RlOiBmdW5jdGlvbiBiNjRfZGVjb2RlKGlucHV0KSB7XG5cdFx0XHR2YXIgbyA9IFwiXCI7XG5cdFx0XHR2YXIgYzE9MCwgYzI9MCwgYzM9MCwgZTE9MCwgZTI9MCwgZTM9MCwgZTQ9MDtcblx0XHRcdGlucHV0ID0gaW5wdXQucmVwbGFjZSgvW15cXHdcXCtcXC9cXD1dL2csIFwiXCIpO1xuXHRcdFx0Zm9yKHZhciBpID0gMDsgaSA8IGlucHV0Lmxlbmd0aDspIHtcblx0XHRcdFx0ZTEgPSBtYXAuaW5kZXhPZihpbnB1dC5jaGFyQXQoaSsrKSk7XG5cdFx0XHRcdGUyID0gbWFwLmluZGV4T2YoaW5wdXQuY2hhckF0KGkrKykpO1xuXHRcdFx0XHRjMSA9IChlMSA8PCAyKSB8IChlMiA+PiA0KTtcblx0XHRcdFx0byArPSBTdHJpbmcuZnJvbUNoYXJDb2RlKGMxKTtcblxuXHRcdFx0XHRlMyA9IG1hcC5pbmRleE9mKGlucHV0LmNoYXJBdChpKyspKTtcblx0XHRcdFx0YzIgPSAoKGUyICYgMTUpIDw8IDQpIHwgKGUzID4+IDIpO1xuXHRcdFx0XHRpZiAoZTMgIT09IDY0KSB7IG8gKz0gU3RyaW5nLmZyb21DaGFyQ29kZShjMik7IH1cblxuXHRcdFx0XHRlNCA9IG1hcC5pbmRleE9mKGlucHV0LmNoYXJBdChpKyspKTtcblx0XHRcdFx0YzMgPSAoKGUzICYgMykgPDwgNikgfCBlNDtcblx0XHRcdFx0aWYgKGU0ICE9PSA2NCkgeyBvICs9IFN0cmluZy5mcm9tQ2hhckNvZGUoYzMpOyB9XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gbztcblx0XHR9XG5cdH07XG59KSgpO1xudmFyIGhhc19idWYgPSAodHlwZW9mIEJ1ZmZlciAhPT0gJ3VuZGVmaW5lZCcgJiYgdHlwZW9mIHByb2Nlc3MgIT09ICd1bmRlZmluZWQnICYmIHR5cGVvZiBwcm9jZXNzLnZlcnNpb25zICE9PSAndW5kZWZpbmVkJyAmJiAhIXByb2Nlc3MudmVyc2lvbnMubm9kZSk7XG5cbnZhciBCdWZmZXJfZnJvbSA9IGZ1bmN0aW9uKCl7fTtcblxuaWYodHlwZW9mIEJ1ZmZlciAhPT0gJ3VuZGVmaW5lZCcpIHtcblx0dmFyIG5iZnMgPSAhQnVmZmVyLmZyb207XG5cdGlmKCFuYmZzKSB0cnkgeyBCdWZmZXIuZnJvbShcImZvb1wiLCBcInV0ZjhcIik7IH0gY2F0Y2goZSkgeyBuYmZzID0gdHJ1ZTsgfVxuXHRCdWZmZXJfZnJvbSA9IG5iZnMgPyBmdW5jdGlvbihidWYsIGVuYykgeyByZXR1cm4gKGVuYykgPyBuZXcgQnVmZmVyKGJ1ZiwgZW5jKSA6IG5ldyBCdWZmZXIoYnVmKTsgfSA6IEJ1ZmZlci5mcm9tLmJpbmQoQnVmZmVyKTtcblx0Ly8gJEZsb3dJZ25vcmVcblx0aWYoIUJ1ZmZlci5hbGxvYykgQnVmZmVyLmFsbG9jID0gZnVuY3Rpb24obikgeyByZXR1cm4gbmV3IEJ1ZmZlcihuKTsgfTtcblx0Ly8gJEZsb3dJZ25vcmVcblx0aWYoIUJ1ZmZlci5hbGxvY1Vuc2FmZSkgQnVmZmVyLmFsbG9jVW5zYWZlID0gZnVuY3Rpb24obikgeyByZXR1cm4gbmV3IEJ1ZmZlcihuKTsgfTtcbn1cblxuZnVuY3Rpb24gbmV3X3Jhd19idWYobGVuKSB7XG5cdC8qIGpzaGludCAtVzA1NiAqL1xuXHRyZXR1cm4gaGFzX2J1ZiA/IEJ1ZmZlci5hbGxvYyhsZW4pIDogbmV3IEFycmF5KGxlbik7XG5cdC8qIGpzaGludCArVzA1NiAqL1xufVxuXG5mdW5jdGlvbiBuZXdfdW5zYWZlX2J1ZihsZW4pIHtcblx0LyoganNoaW50IC1XMDU2ICovXG5cdHJldHVybiBoYXNfYnVmID8gQnVmZmVyLmFsbG9jVW5zYWZlKGxlbikgOiBuZXcgQXJyYXkobGVuKTtcblx0LyoganNoaW50ICtXMDU2ICovXG59XG5cbnZhciBzMmEgPSBmdW5jdGlvbiBzMmEocykge1xuXHRpZihoYXNfYnVmKSByZXR1cm4gQnVmZmVyX2Zyb20ocywgXCJiaW5hcnlcIik7XG5cdHJldHVybiBzLnNwbGl0KFwiXCIpLm1hcChmdW5jdGlvbih4KXsgcmV0dXJuIHguY2hhckNvZGVBdCgwKSAmIDB4ZmY7IH0pO1xufTtcblxuZnVuY3Rpb24gczJhYihzKSB7XG5cdGlmKHR5cGVvZiBBcnJheUJ1ZmZlciA9PT0gJ3VuZGVmaW5lZCcpIHJldHVybiBzMmEocyk7XG5cdHZhciBidWYgPSBuZXcgQXJyYXlCdWZmZXIocy5sZW5ndGgpLCB2aWV3ID0gbmV3IFVpbnQ4QXJyYXkoYnVmKTtcblx0Zm9yICh2YXIgaT0wOyBpIT1zLmxlbmd0aDsgKytpKSB2aWV3W2ldID0gcy5jaGFyQ29kZUF0KGkpICYgMHhGRjtcblx0cmV0dXJuIGJ1Zjtcbn1cblxuZnVuY3Rpb24gYTJzKGRhdGEpIHtcblx0aWYoQXJyYXkuaXNBcnJheShkYXRhKSkgcmV0dXJuIGRhdGEubWFwKGZ1bmN0aW9uKGMpIHsgcmV0dXJuIFN0cmluZy5mcm9tQ2hhckNvZGUoYyk7IH0pLmpvaW4oXCJcIik7XG5cdHZhciBvID0gW107IGZvcih2YXIgaSA9IDA7IGkgPCBkYXRhLmxlbmd0aDsgKytpKSBvW2ldID0gU3RyaW5nLmZyb21DaGFyQ29kZShkYXRhW2ldKTsgcmV0dXJuIG8uam9pbihcIlwiKTtcbn1cblxuZnVuY3Rpb24gYTJ1KGRhdGEpIHtcblx0aWYodHlwZW9mIFVpbnQ4QXJyYXkgPT09ICd1bmRlZmluZWQnKSB0aHJvdyBuZXcgRXJyb3IoXCJVbnN1cHBvcnRlZFwiKTtcblx0cmV0dXJuIG5ldyBVaW50OEFycmF5KGRhdGEpO1xufVxuXG5mdW5jdGlvbiBhYjJhKGRhdGEpIHtcblx0aWYodHlwZW9mIEFycmF5QnVmZmVyID09ICd1bmRlZmluZWQnKSB0aHJvdyBuZXcgRXJyb3IoXCJVbnN1cHBvcnRlZFwiKTtcblx0aWYoZGF0YSBpbnN0YW5jZW9mIEFycmF5QnVmZmVyKSByZXR1cm4gYWIyYShuZXcgVWludDhBcnJheShkYXRhKSk7XG52YXIgbyA9IG5ldyBBcnJheShkYXRhLmxlbmd0aCk7XG5cdGZvcih2YXIgaSA9IDA7IGkgPCBkYXRhLmxlbmd0aDsgKytpKSBvW2ldID0gZGF0YVtpXTtcblx0cmV0dXJuIG87XG59XG5cbnZhciBiY29uY2F0ID0gZnVuY3Rpb24oYnVmcykgeyByZXR1cm4gW10uY29uY2F0LmFwcGx5KFtdLCBidWZzKTsgfTtcblxudmFyIGNocjAgPSAvXFx1MDAwMC9nLCBjaHIxID0gL1tcXHUwMDAxLVxcdTAwMDZdL2c7XG4vKiBzc2YuanMgKEMpIDIwMTMtcHJlc2VudCBTaGVldEpTIC0tIGh0dHA6Ly9zaGVldGpzLmNvbSAqL1xuLypqc2hpbnQgLVcwNDEgKi9cbnZhciBTU0YgPSAoe30pO1xudmFyIG1ha2Vfc3NmID0gZnVuY3Rpb24gbWFrZV9zc2YoU1NGKXtcblNTRi52ZXJzaW9uID0gJzAuMTEuMic7XG5mdW5jdGlvbiBfc3RycmV2KHgpIHsgdmFyIG8gPSBcIlwiLCBpID0geC5sZW5ndGgtMTsgd2hpbGUoaT49MCkgbyArPSB4LmNoYXJBdChpLS0pOyByZXR1cm4gbzsgfVxuZnVuY3Rpb24gZmlsbChjLGwpIHsgdmFyIG8gPSBcIlwiOyB3aGlsZShvLmxlbmd0aCA8IGwpIG8rPWM7IHJldHVybiBvOyB9XG5mdW5jdGlvbiBwYWQwKHYsZCl7dmFyIHQ9XCJcIit2OyByZXR1cm4gdC5sZW5ndGg+PWQ/dDpmaWxsKCcwJyxkLXQubGVuZ3RoKSt0O31cbmZ1bmN0aW9uIHBhZF8odixkKXt2YXIgdD1cIlwiK3Y7cmV0dXJuIHQubGVuZ3RoPj1kP3Q6ZmlsbCgnICcsZC10Lmxlbmd0aCkrdDt9XG5mdW5jdGlvbiBycGFkXyh2LGQpe3ZhciB0PVwiXCIrdjsgcmV0dXJuIHQubGVuZ3RoPj1kP3Q6dCtmaWxsKCcgJyxkLXQubGVuZ3RoKTt9XG5mdW5jdGlvbiBwYWQwcjEodixkKXt2YXIgdD1cIlwiK01hdGgucm91bmQodik7IHJldHVybiB0Lmxlbmd0aD49ZD90OmZpbGwoJzAnLGQtdC5sZW5ndGgpK3Q7fVxuZnVuY3Rpb24gcGFkMHIyKHYsZCl7dmFyIHQ9XCJcIit2OyByZXR1cm4gdC5sZW5ndGg+PWQ/dDpmaWxsKCcwJyxkLXQubGVuZ3RoKSt0O31cbnZhciBwMl8zMiA9IE1hdGgucG93KDIsMzIpO1xuZnVuY3Rpb24gcGFkMHIodixkKXtpZih2PnAyXzMyfHx2PC1wMl8zMikgcmV0dXJuIHBhZDByMSh2LGQpOyB2YXIgaSA9IE1hdGgucm91bmQodik7IHJldHVybiBwYWQwcjIoaSxkKTsgfVxuZnVuY3Rpb24gaXNnZW5lcmFsKHMsIGkpIHsgaSA9IGkgfHwgMDsgcmV0dXJuIHMubGVuZ3RoID49IDcgKyBpICYmIChzLmNoYXJDb2RlQXQoaSl8MzIpID09PSAxMDMgJiYgKHMuY2hhckNvZGVBdChpKzEpfDMyKSA9PT0gMTAxICYmIChzLmNoYXJDb2RlQXQoaSsyKXwzMikgPT09IDExMCAmJiAocy5jaGFyQ29kZUF0KGkrMyl8MzIpID09PSAxMDEgJiYgKHMuY2hhckNvZGVBdChpKzQpfDMyKSA9PT0gMTE0ICYmIChzLmNoYXJDb2RlQXQoaSs1KXwzMikgPT09IDk3ICYmIChzLmNoYXJDb2RlQXQoaSs2KXwzMikgPT09IDEwODsgfVxudmFyIGRheXMgPSBbXG5cdFsnU3VuJywgJ1N1bmRheSddLFxuXHRbJ01vbicsICdNb25kYXknXSxcblx0WydUdWUnLCAnVHVlc2RheSddLFxuXHRbJ1dlZCcsICdXZWRuZXNkYXknXSxcblx0WydUaHUnLCAnVGh1cnNkYXknXSxcblx0WydGcmknLCAnRnJpZGF5J10sXG5cdFsnU2F0JywgJ1NhdHVyZGF5J11cbl07XG52YXIgbW9udGhzID0gW1xuXHRbJ0onLCAnSmFuJywgJ0phbnVhcnknXSxcblx0WydGJywgJ0ZlYicsICdGZWJydWFyeSddLFxuXHRbJ00nLCAnTWFyJywgJ01hcmNoJ10sXG5cdFsnQScsICdBcHInLCAnQXByaWwnXSxcblx0WydNJywgJ01heScsICdNYXknXSxcblx0WydKJywgJ0p1bicsICdKdW5lJ10sXG5cdFsnSicsICdKdWwnLCAnSnVseSddLFxuXHRbJ0EnLCAnQXVnJywgJ0F1Z3VzdCddLFxuXHRbJ1MnLCAnU2VwJywgJ1NlcHRlbWJlciddLFxuXHRbJ08nLCAnT2N0JywgJ09jdG9iZXInXSxcblx0WydOJywgJ05vdicsICdOb3ZlbWJlciddLFxuXHRbJ0QnLCAnRGVjJywgJ0RlY2VtYmVyJ11cbl07XG5mdW5jdGlvbiBpbml0X3RhYmxlKHQpIHtcblx0dFswXT0gICdHZW5lcmFsJztcblx0dFsxXT0gICcwJztcblx0dFsyXT0gICcwLjAwJztcblx0dFszXT0gICcjLCMjMCc7XG5cdHRbNF09ICAnIywjIzAuMDAnO1xuXHR0WzldPSAgJzAlJztcblx0dFsxMF09ICcwLjAwJSc7XG5cdHRbMTFdPSAnMC4wMEUrMDAnO1xuXHR0WzEyXT0gJyMgPy8/Jztcblx0dFsxM109ICcjID8/Lz8/Jztcblx0dFsxNF09ICdtL2QveXknO1xuXHR0WzE1XT0gJ2QtbW1tLXl5Jztcblx0dFsxNl09ICdkLW1tbSc7XG5cdHRbMTddPSAnbW1tLXl5Jztcblx0dFsxOF09ICdoOm1tIEFNL1BNJztcblx0dFsxOV09ICdoOm1tOnNzIEFNL1BNJztcblx0dFsyMF09ICdoOm1tJztcblx0dFsyMV09ICdoOm1tOnNzJztcblx0dFsyMl09ICdtL2QveXkgaDptbSc7XG5cdHRbMzddPSAnIywjIzAgOygjLCMjMCknO1xuXHR0WzM4XT0gJyMsIyMwIDtbUmVkXSgjLCMjMCknO1xuXHR0WzM5XT0gJyMsIyMwLjAwOygjLCMjMC4wMCknO1xuXHR0WzQwXT0gJyMsIyMwLjAwO1tSZWRdKCMsIyMwLjAwKSc7XG5cdHRbNDVdPSAnbW06c3MnO1xuXHR0WzQ2XT0gJ1toXTptbTpzcyc7XG5cdHRbNDddPSAnbW1zcy4wJztcblx0dFs0OF09ICcjIzAuMEUrMCc7XG5cdHRbNDldPSAnQCc7XG5cdHRbNTZdPSAnXCLkuIrljYgv5LiL5Y2IIFwiaGhcIuaZglwibW1cIuWIhlwic3NcIuenkiBcIic7XG59XG5cbnZhciB0YWJsZV9mbXQgPSB7fTtcbmluaXRfdGFibGUodGFibGVfZm10KTtcbi8qIERlZmF1bHRzIGRldGVybWluZWQgYnkgc3lzdGVtYXRpY2FsbHkgdGVzdGluZyBpbiBFeGNlbCAyMDE5ICovXG5cbi8qIFRoZXNlIGZvcm1hdHMgYXBwZWFyIHRvIGRlZmF1bHQgdG8gb3RoZXIgZm9ybWF0cyBpbiB0aGUgdGFibGUgKi9cbnZhciBkZWZhdWx0X21hcCA9IFtdO1xudmFyIGRlZmkgPSAwO1xuXG4vLyAgNSAtPiAzNyAuLi4gIDggLT4gNDBcbmZvcihkZWZpID0gNTsgZGVmaSA8PSA4OyArK2RlZmkpIGRlZmF1bHRfbWFwW2RlZmldID0gMzIgKyBkZWZpO1xuXG4vLyAyMyAtPiAgMCAuLi4gMjYgLT4gIDBcbmZvcihkZWZpID0gMjM7IGRlZmkgPD0gMjY7ICsrZGVmaSkgZGVmYXVsdF9tYXBbZGVmaV0gPSAwO1xuXG4vLyAyNyAtPiAxNCAuLi4gMzEgLT4gMTRcbmZvcihkZWZpID0gMjc7IGRlZmkgPD0gMzE7ICsrZGVmaSkgZGVmYXVsdF9tYXBbZGVmaV0gPSAxNDtcbi8vIDUwIC0+IDE0IC4uLiA1OCAtPiAxNFxuZm9yKGRlZmkgPSA1MDsgZGVmaSA8PSA1ODsgKytkZWZpKSBkZWZhdWx0X21hcFtkZWZpXSA9IDE0O1xuXG4vLyA1OSAtPiAgMSAuLi4gNjIgLT4gIDRcbmZvcihkZWZpID0gNTk7IGRlZmkgPD0gNjI7ICsrZGVmaSkgZGVmYXVsdF9tYXBbZGVmaV0gPSBkZWZpIC0gNTg7XG4vLyA2NyAtPiAgOSAuLi4gNjggLT4gMTBcbmZvcihkZWZpID0gNjc7IGRlZmkgPD0gNjg7ICsrZGVmaSkgZGVmYXVsdF9tYXBbZGVmaV0gPSBkZWZpIC0gNTg7XG4vLyA3MiAtPiAxNCAuLi4gNzUgLT4gMTdcbmZvcihkZWZpID0gNzI7IGRlZmkgPD0gNzU7ICsrZGVmaSkgZGVmYXVsdF9tYXBbZGVmaV0gPSBkZWZpIC0gNTg7XG5cbi8vIDY5IC0+IDEyIC4uLiA3MSAtPiAxNFxuZm9yKGRlZmkgPSA2NzsgZGVmaSA8PSA2ODsgKytkZWZpKSBkZWZhdWx0X21hcFtkZWZpXSA9IGRlZmkgLSA1NztcblxuLy8gNzYgLT4gMjAgLi4uIDc4IC0+IDIyXG5mb3IoZGVmaSA9IDc2OyBkZWZpIDw9IDc4OyArK2RlZmkpIGRlZmF1bHRfbWFwW2RlZmldID0gZGVmaSAtIDU2O1xuXG4vLyA3OSAtPiA0NSAuLi4gODEgLT4gNDdcbmZvcihkZWZpID0gNzk7IGRlZmkgPD0gODE7ICsrZGVmaSkgZGVmYXVsdF9tYXBbZGVmaV0gPSBkZWZpIC0gMzQ7XG5cbi8vIDgyIC0+ICAwIC4uLiA2NTUzNiAtPiAwIChvbWl0dGVkKVxuXG4vKiBUaGVzZSBmb3JtYXRzIHRlY2huaWNhbGx5IHJlZmVyIHRvIEFjY291bnRpbmcgZm9ybWF0cyB3aXRoIG5vIGVxdWl2YWxlbnQgKi9cbnZhciBkZWZhdWx0X3N0ciA9IFtdO1xuXG4vLyAgNSAtLSBDdXJyZW5jeSwgICAwIGRlY2ltYWwsIGJsYWNrIG5lZ2F0aXZlXG5kZWZhdWx0X3N0cls1XSA9IGRlZmF1bHRfc3RyWzYzXSA9ICdcIiRcIiMsIyMwXyk7XFxcXChcIiRcIiMsIyMwXFxcXCknO1xuLy8gIDYgLS0gQ3VycmVuY3ksICAgMCBkZWNpbWFsLCByZWQgICBuZWdhdGl2ZVxuZGVmYXVsdF9zdHJbNl0gPSBkZWZhdWx0X3N0cls2NF0gPSAnXCIkXCIjLCMjMF8pO1tSZWRdXFxcXChcIiRcIiMsIyMwXFxcXCknO1xuLy8gIDcgLS0gQ3VycmVuY3ksICAgMiBkZWNpbWFsLCBibGFjayBuZWdhdGl2ZVxuZGVmYXVsdF9zdHJbN10gPSBkZWZhdWx0X3N0cls2NV0gPSAnXCIkXCIjLCMjMC4wMF8pO1xcXFwoXCIkXCIjLCMjMC4wMFxcXFwpJztcbi8vICA4IC0tIEN1cnJlbmN5LCAgIDIgZGVjaW1hbCwgcmVkICAgbmVnYXRpdmVcbmRlZmF1bHRfc3RyWzhdID0gZGVmYXVsdF9zdHJbNjZdID0gJ1wiJFwiIywjIzAuMDBfKTtbUmVkXVxcXFwoXCIkXCIjLCMjMC4wMFxcXFwpJztcblxuLy8gNDEgLS0gQWNjb3VudGluZywgMCBkZWNpbWFsLCBObyBTeW1ib2xcbmRlZmF1bHRfc3RyWzQxXSA9ICdfKCogIywjIzBfKTtfKCogXFxcXCgjLCMjMFxcXFwpO18oKiBcIi1cIl8pO18oQF8pJztcbi8vIDQyIC0tIEFjY291bnRpbmcsIDAgZGVjaW1hbCwgJCAgU3ltYm9sXG5kZWZhdWx0X3N0cls0Ml0gPSAnXyhcIiRcIiogIywjIzBfKTtfKFwiJFwiKiBcXFxcKCMsIyMwXFxcXCk7XyhcIiRcIiogXCItXCJfKTtfKEBfKSc7XG4vLyA0MyAtLSBBY2NvdW50aW5nLCAyIGRlY2ltYWwsIE5vIFN5bWJvbFxuZGVmYXVsdF9zdHJbNDNdID0gJ18oKiAjLCMjMC4wMF8pO18oKiBcXFxcKCMsIyMwLjAwXFxcXCk7XygqIFwiLVwiPz9fKTtfKEBfKSc7XG4vLyA0NCAtLSBBY2NvdW50aW5nLCAyIGRlY2ltYWwsICQgIFN5bWJvbFxuZGVmYXVsdF9zdHJbNDRdID0gJ18oXCIkXCIqICMsIyMwLjAwXyk7XyhcIiRcIiogXFxcXCgjLCMjMC4wMFxcXFwpO18oXCIkXCIqIFwiLVwiPz9fKTtfKEBfKSc7XG5mdW5jdGlvbiBmcmFjKHgsIEQsIG1peGVkKSB7XG5cdHZhciBzZ24gPSB4IDwgMCA/IC0xIDogMTtcblx0dmFyIEIgPSB4ICogc2duO1xuXHR2YXIgUF8yID0gMCwgUF8xID0gMSwgUCA9IDA7XG5cdHZhciBRXzIgPSAxLCBRXzEgPSAwLCBRID0gMDtcblx0dmFyIEEgPSBNYXRoLmZsb29yKEIpO1xuXHR3aGlsZShRXzEgPCBEKSB7XG5cdFx0QSA9IE1hdGguZmxvb3IoQik7XG5cdFx0UCA9IEEgKiBQXzEgKyBQXzI7XG5cdFx0USA9IEEgKiBRXzEgKyBRXzI7XG5cdFx0aWYoKEIgLSBBKSA8IDAuMDAwMDAwMDUpIGJyZWFrO1xuXHRcdEIgPSAxIC8gKEIgLSBBKTtcblx0XHRQXzIgPSBQXzE7IFBfMSA9IFA7XG5cdFx0UV8yID0gUV8xOyBRXzEgPSBRO1xuXHR9XG5cdGlmKFEgPiBEKSB7IGlmKFFfMSA+IEQpIHsgUSA9IFFfMjsgUCA9IFBfMjsgfSBlbHNlIHsgUSA9IFFfMTsgUCA9IFBfMTsgfSB9XG5cdGlmKCFtaXhlZCkgcmV0dXJuIFswLCBzZ24gKiBQLCBRXTtcblx0dmFyIHEgPSBNYXRoLmZsb29yKHNnbiAqIFAvUSk7XG5cdHJldHVybiBbcSwgc2duKlAgLSBxKlEsIFFdO1xufVxuZnVuY3Rpb24gcGFyc2VfZGF0ZV9jb2RlKHYsb3B0cyxiMikge1xuXHRpZih2ID4gMjk1ODQ2NSB8fCB2IDwgMCkgcmV0dXJuIG51bGw7XG5cdHZhciBkYXRlID0gKHZ8MCksIHRpbWUgPSBNYXRoLmZsb29yKDg2NDAwICogKHYgLSBkYXRlKSksIGRvdz0wO1xuXHR2YXIgZG91dD1bXTtcblx0dmFyIG91dD17RDpkYXRlLCBUOnRpbWUsIHU6ODY0MDAqKHYtZGF0ZSktdGltZSx5OjAsbTowLGQ6MCxIOjAsTTowLFM6MCxxOjB9O1xuXHRpZihNYXRoLmFicyhvdXQudSkgPCAxZS02KSBvdXQudSA9IDA7XG5cdGlmKG9wdHMgJiYgb3B0cy5kYXRlMTkwNCkgZGF0ZSArPSAxNDYyO1xuXHRpZihvdXQudSA+IDAuOTk5OSkge1xuXHRcdG91dC51ID0gMDtcblx0XHRpZigrK3RpbWUgPT0gODY0MDApIHsgb3V0LlQgPSB0aW1lID0gMDsgKytkYXRlOyArK291dC5EOyB9XG5cdH1cblx0aWYoZGF0ZSA9PT0gNjApIHtkb3V0ID0gYjIgPyBbMTMxNywxMCwyOV0gOiBbMTkwMCwyLDI5XTsgZG93PTM7fVxuXHRlbHNlIGlmKGRhdGUgPT09IDApIHtkb3V0ID0gYjIgPyBbMTMxNyw4LDI5XSA6IFsxOTAwLDEsMF07IGRvdz02O31cblx0ZWxzZSB7XG5cdFx0aWYoZGF0ZSA+IDYwKSAtLWRhdGU7XG5cdFx0LyogMSA9IEphbiAxIDE5MDAgaW4gR3JlZ29yaWFuICovXG5cdFx0dmFyIGQgPSBuZXcgRGF0ZSgxOTAwLCAwLCAxKTtcblx0XHRkLnNldERhdGUoZC5nZXREYXRlKCkgKyBkYXRlIC0gMSk7XG5cdFx0ZG91dCA9IFtkLmdldEZ1bGxZZWFyKCksIGQuZ2V0TW9udGgoKSsxLGQuZ2V0RGF0ZSgpXTtcblx0XHRkb3cgPSBkLmdldERheSgpO1xuXHRcdGlmKGRhdGUgPCA2MCkgZG93ID0gKGRvdyArIDYpICUgNztcblx0XHRpZihiMikgZG93ID0gZml4X2hpanJpKGQsIGRvdXQpO1xuXHR9XG5cdG91dC55ID0gZG91dFswXTsgb3V0Lm0gPSBkb3V0WzFdOyBvdXQuZCA9IGRvdXRbMl07XG5cdG91dC5TID0gdGltZSAlIDYwOyB0aW1lID0gTWF0aC5mbG9vcih0aW1lIC8gNjApO1xuXHRvdXQuTSA9IHRpbWUgJSA2MDsgdGltZSA9IE1hdGguZmxvb3IodGltZSAvIDYwKTtcblx0b3V0LkggPSB0aW1lO1xuXHRvdXQucSA9IGRvdztcblx0cmV0dXJuIG91dDtcbn1cblNTRi5wYXJzZV9kYXRlX2NvZGUgPSBwYXJzZV9kYXRlX2NvZGU7XG52YXIgYmFzZWRhdGUgPSBuZXcgRGF0ZSgxODk5LCAxMSwgMzEsIDAsIDAsIDApO1xudmFyIGRudGhyZXNoID0gYmFzZWRhdGUuZ2V0VGltZSgpO1xudmFyIGJhc2UxOTA0ID0gbmV3IERhdGUoMTkwMCwgMiwgMSwgMCwgMCwgMCk7XG5mdW5jdGlvbiBkYXRlbnVtX2xvY2FsKHYsIGRhdGUxOTA0KSB7XG5cdHZhciBlcG9jaCA9IHYuZ2V0VGltZSgpO1xuXHRpZihkYXRlMTkwNCkgZXBvY2ggLT0gMTQ2MSoyNCo2MCo2MCoxMDAwO1xuXHRlbHNlIGlmKHYgPj0gYmFzZTE5MDQpIGVwb2NoICs9IDI0KjYwKjYwKjEwMDA7XG5cdHJldHVybiAoZXBvY2ggLSAoZG50aHJlc2ggKyAodi5nZXRUaW1lem9uZU9mZnNldCgpIC0gYmFzZWRhdGUuZ2V0VGltZXpvbmVPZmZzZXQoKSkgKiA2MDAwMCkpIC8gKDI0ICogNjAgKiA2MCAqIDEwMDApO1xufVxuLyogVGhlIGxvbmdlc3QgMzItYml0IGludGVnZXIgdGV4dCBpcyBcIi00Mjk0OTY3Mjk2XCIsIGV4YWN0bHkgMTEgY2hhcnMgKi9cbmZ1bmN0aW9uIGdlbmVyYWxfZm10X2ludCh2KSB7IHJldHVybiB2LnRvU3RyaW5nKDEwKTsgfVxuU1NGLl9nZW5lcmFsX2ludCA9IGdlbmVyYWxfZm10X2ludDtcblxuLyogRUNNQS0zNzYgMTguOC4zMCBudW1GbXQqL1xuLyogTm90ZTogYHRvUHJlY2lzaW9uYCB1c2VzIHN0YW5kYXJkIGZvcm0gd2hlbiBwcmVjID4gRSBhbmQgRSA+PSAtNiAqL1xudmFyIGdlbmVyYWxfZm10X251bSA9IChmdW5jdGlvbiBtYWtlX2dlbmVyYWxfZm10X251bSgpIHtcblx0dmFyIHRyYWlsaW5nX3plcm9lc19hbmRfZGVjaW1hbCA9IC8oPzpcXC4wKnwoXFwuXFxkKlsxLTldKTArKSQvO1xuXHRmdW5jdGlvbiBzdHJpcF9kZWNpbWFsKG8pIHtcblx0XHRyZXR1cm4gKG8uaW5kZXhPZihcIi5cIikgPT0gLTEpID8gbyA6IG8ucmVwbGFjZSh0cmFpbGluZ196ZXJvZXNfYW5kX2RlY2ltYWwsIFwiJDFcIik7XG5cdH1cblxuXHQvKiBHZW5lcmFsIEV4cG9uZW50aWFsIGFsd2F5cyBzaG93cyAyIGRpZ2l0cyBleHAgYW5kIHRyaW1zIHRoZSBtYW50aXNzYSAqL1xuXHR2YXIgbWFudGlzc2FfemVyb2VzX2FuZF9kZWNpbWFsID0gLyg/OlxcLjAqfChcXC5cXGQqWzEtOV0pMCspW0VlXS87XG5cdHZhciBleHBfd2l0aF9zaW5nbGVfZGlnaXQgPSAvKEVbKy1dKShcXGQpJC87XG5cdGZ1bmN0aW9uIG5vcm1hbGl6ZV9leHAobykge1xuXHRcdGlmKG8uaW5kZXhPZihcIkVcIikgPT0gLTEpIHJldHVybiBvO1xuXHRcdHJldHVybiBvLnJlcGxhY2UobWFudGlzc2FfemVyb2VzX2FuZF9kZWNpbWFsLFwiJDFFXCIpLnJlcGxhY2UoZXhwX3dpdGhfc2luZ2xlX2RpZ2l0LFwiJDEwJDJcIik7XG5cdH1cblxuXHQvKiBleHBvbmVudCA+PSAtOSBhbmQgPD0gOSAqL1xuXHRmdW5jdGlvbiBzbWFsbF9leHAodikge1xuXHRcdHZhciB3ID0gKHY8MD8xMjoxMSk7XG5cdFx0dmFyIG8gPSBzdHJpcF9kZWNpbWFsKHYudG9GaXhlZCgxMikpOyBpZihvLmxlbmd0aCA8PSB3KSByZXR1cm4gbztcblx0XHRvID0gdi50b1ByZWNpc2lvbigxMCk7IGlmKG8ubGVuZ3RoIDw9IHcpIHJldHVybiBvO1xuXHRcdHJldHVybiB2LnRvRXhwb25lbnRpYWwoNSk7XG5cdH1cblxuXHQvKiBleHBvbmVudCA+PSAxMSBvciA8PSAtMTAgbGlrZWx5IGV4cG9uZW50aWFsICovXG5cdGZ1bmN0aW9uIGxhcmdlX2V4cCh2KSB7XG5cdFx0dmFyIG8gPSBzdHJpcF9kZWNpbWFsKHYudG9GaXhlZCgxMSkpO1xuXHRcdHJldHVybiAoby5sZW5ndGggPiAodjwwPzEyOjExKSB8fCBvID09PSBcIjBcIiB8fCBvID09PSBcIi0wXCIpID8gdi50b1ByZWNpc2lvbig2KSA6IG87XG5cdH1cblxuXHRmdW5jdGlvbiBnZW5lcmFsX2ZtdF9udW1fYmFzZSh2KSB7XG5cdFx0dmFyIFYgPSBNYXRoLmZsb29yKE1hdGgubG9nKE1hdGguYWJzKHYpKSpNYXRoLkxPRzEwRSksIG87XG5cblx0XHRpZihWID49IC00ICYmIFYgPD0gLTEpIG8gPSB2LnRvUHJlY2lzaW9uKDEwK1YpO1xuXHRcdGVsc2UgaWYoTWF0aC5hYnMoVikgPD0gOSkgbyA9IHNtYWxsX2V4cCh2KTtcblx0XHRlbHNlIGlmKFYgPT09IDEwKSBvID0gdi50b0ZpeGVkKDEwKS5zdWJzdHIoMCwxMik7XG5cdFx0ZWxzZSBvID0gbGFyZ2VfZXhwKHYpO1xuXG5cdFx0cmV0dXJuIHN0cmlwX2RlY2ltYWwobm9ybWFsaXplX2V4cChvLnRvVXBwZXJDYXNlKCkpKTtcblx0fVxuXG5cdHJldHVybiBnZW5lcmFsX2ZtdF9udW1fYmFzZTtcbn0pKCk7XG5TU0YuX2dlbmVyYWxfbnVtID0gZ2VuZXJhbF9mbXRfbnVtO1xuXG4vKlxuXHRcIkdlbmVyYWxcIiBydWxlczpcblx0LSB0ZXh0IGlzIHBhc3NlZCB0aHJvdWdoIChcIkBcIilcblx0LSBib29sZWFucyBhcmUgcmVuZGVyZWQgYXMgVFJVRS9GQUxTRVxuXHQtIFwidXAgdG8gMTEgY2hhcmFjdGVyc1wiIGRpc3BsYXllZCBmb3IgbnVtYmVyc1xuXHQtIERlZmF1bHQgZGF0ZSBmb3JtYXQgKGNvZGUgMTQpIHVzZWQgZm9yIERhdGVzXG5cblx0VE9ETzogdGVjaG5pY2FsbHkgdGhlIGRpc3BsYXkgZGVwZW5kcyBvbiB0aGUgd2lkdGggb2YgdGhlIGNlbGxcbiovXG5mdW5jdGlvbiBnZW5lcmFsX2ZtdCh2LCBvcHRzKSB7XG5cdHN3aXRjaCh0eXBlb2Ygdikge1xuXHRcdGNhc2UgJ3N0cmluZyc6IHJldHVybiB2O1xuXHRcdGNhc2UgJ2Jvb2xlYW4nOiByZXR1cm4gdiA/IFwiVFJVRVwiIDogXCJGQUxTRVwiO1xuXHRcdGNhc2UgJ251bWJlcic6IHJldHVybiAodnwwKSA9PT0gdiA/IHYudG9TdHJpbmcoMTApIDogZ2VuZXJhbF9mbXRfbnVtKHYpO1xuXHRcdGNhc2UgJ3VuZGVmaW5lZCc6IHJldHVybiBcIlwiO1xuXHRcdGNhc2UgJ29iamVjdCc6XG5cdFx0XHRpZih2ID09IG51bGwpIHJldHVybiBcIlwiO1xuXHRcdFx0aWYodiBpbnN0YW5jZW9mIERhdGUpIHJldHVybiBmb3JtYXQoMTQsIGRhdGVudW1fbG9jYWwodiwgb3B0cyAmJiBvcHRzLmRhdGUxOTA0KSwgb3B0cyk7XG5cdH1cblx0dGhyb3cgbmV3IEVycm9yKFwidW5zdXBwb3J0ZWQgdmFsdWUgaW4gR2VuZXJhbCBmb3JtYXQ6IFwiICsgdik7XG59XG5TU0YuX2dlbmVyYWwgPSBnZW5lcmFsX2ZtdDtcbmZ1bmN0aW9uIGZpeF9oaWpyaShkYXRlLCBvKSB7XG4gIC8qIFRPRE86IHByb3Blcmx5IGFkanVzdCB5L20vZCBhbmQgICovXG4gIG9bMF0gLT0gNTgxO1xuICB2YXIgZG93ID0gZGF0ZS5nZXREYXkoKTtcbiAgaWYoZGF0ZSA8IDYwKSBkb3cgPSAoZG93ICsgNikgJSA3O1xuICByZXR1cm4gZG93O1xufVxuLy92YXIgVEhBSV9ESUdJVFMgPSBcIlxcdTBFNTBcXHUwRTUxXFx1MEU1MlxcdTBFNTNcXHUwRTU0XFx1MEU1NVxcdTBFNTZcXHUwRTU3XFx1MEU1OFxcdTBFNTlcIi5zcGxpdChcIlwiKTtcbi8qanNoaW50IC1XMDg2ICovXG5mdW5jdGlvbiB3cml0ZV9kYXRlKHR5cGUsIGZtdCwgdmFsLCBzczApIHtcblx0dmFyIG89XCJcIiwgc3M9MCwgdHQ9MCwgeSA9IHZhbC55LCBvdXQsIG91dGwgPSAwO1xuXHRzd2l0Y2godHlwZSkge1xuXHRcdGNhc2UgOTg6IC8qICdiJyBidWRkaGlzdCB5ZWFyICovXG5cdFx0XHR5ID0gdmFsLnkgKyA1NDM7XG5cdFx0XHQvKiBmYWxscyB0aHJvdWdoICovXG5cdFx0Y2FzZSAxMjE6IC8qICd5JyB5ZWFyICovXG5cdFx0c3dpdGNoKGZtdC5sZW5ndGgpIHtcblx0XHRcdGNhc2UgMTogY2FzZSAyOiBvdXQgPSB5ICUgMTAwOyBvdXRsID0gMjsgYnJlYWs7XG5cdFx0XHRkZWZhdWx0OiBvdXQgPSB5ICUgMTAwMDA7IG91dGwgPSA0OyBicmVhaztcblx0XHR9IGJyZWFrO1xuXHRcdGNhc2UgMTA5OiAvKiAnbScgbW9udGggKi9cblx0XHRzd2l0Y2goZm10Lmxlbmd0aCkge1xuXHRcdFx0Y2FzZSAxOiBjYXNlIDI6IG91dCA9IHZhbC5tOyBvdXRsID0gZm10Lmxlbmd0aDsgYnJlYWs7XG5cdFx0XHRjYXNlIDM6IHJldHVybiBtb250aHNbdmFsLm0tMV1bMV07XG5cdFx0XHRjYXNlIDU6IHJldHVybiBtb250aHNbdmFsLm0tMV1bMF07XG5cdFx0XHRkZWZhdWx0OiByZXR1cm4gbW9udGhzW3ZhbC5tLTFdWzJdO1xuXHRcdH0gYnJlYWs7XG5cdFx0Y2FzZSAxMDA6IC8qICdkJyBkYXkgKi9cblx0XHRzd2l0Y2goZm10Lmxlbmd0aCkge1xuXHRcdFx0Y2FzZSAxOiBjYXNlIDI6IG91dCA9IHZhbC5kOyBvdXRsID0gZm10Lmxlbmd0aDsgYnJlYWs7XG5cdFx0XHRjYXNlIDM6IHJldHVybiBkYXlzW3ZhbC5xXVswXTtcblx0XHRcdGRlZmF1bHQ6IHJldHVybiBkYXlzW3ZhbC5xXVsxXTtcblx0XHR9IGJyZWFrO1xuXHRcdGNhc2UgMTA0OiAvKiAnaCcgMTItaG91ciAqL1xuXHRcdHN3aXRjaChmbXQubGVuZ3RoKSB7XG5cdFx0XHRjYXNlIDE6IGNhc2UgMjogb3V0ID0gMSsodmFsLkgrMTEpJTEyOyBvdXRsID0gZm10Lmxlbmd0aDsgYnJlYWs7XG5cdFx0XHRkZWZhdWx0OiB0aHJvdyAnYmFkIGhvdXIgZm9ybWF0OiAnICsgZm10O1xuXHRcdH0gYnJlYWs7XG5cdFx0Y2FzZSA3MjogLyogJ0gnIDI0LWhvdXIgKi9cblx0XHRzd2l0Y2goZm10Lmxlbmd0aCkge1xuXHRcdFx0Y2FzZSAxOiBjYXNlIDI6IG91dCA9IHZhbC5IOyBvdXRsID0gZm10Lmxlbmd0aDsgYnJlYWs7XG5cdFx0XHRkZWZhdWx0OiB0aHJvdyAnYmFkIGhvdXIgZm9ybWF0OiAnICsgZm10O1xuXHRcdH0gYnJlYWs7XG5cdFx0Y2FzZSA3NzogLyogJ00nIG1pbnV0ZXMgKi9cblx0XHRzd2l0Y2goZm10Lmxlbmd0aCkge1xuXHRcdFx0Y2FzZSAxOiBjYXNlIDI6IG91dCA9IHZhbC5NOyBvdXRsID0gZm10Lmxlbmd0aDsgYnJlYWs7XG5cdFx0XHRkZWZhdWx0OiB0aHJvdyAnYmFkIG1pbnV0ZSBmb3JtYXQ6ICcgKyBmbXQ7XG5cdFx0fSBicmVhaztcblx0XHRjYXNlIDExNTogLyogJ3MnIHNlY29uZHMgKi9cblx0XHRcdGlmKGZtdCAhPSAncycgJiYgZm10ICE9ICdzcycgJiYgZm10ICE9ICcuMCcgJiYgZm10ICE9ICcuMDAnICYmIGZtdCAhPSAnLjAwMCcpIHRocm93ICdiYWQgc2Vjb25kIGZvcm1hdDogJyArIGZtdDtcblx0XHRcdGlmKHZhbC51ID09PSAwICYmIChmbXQgPT0gXCJzXCIgfHwgZm10ID09IFwic3NcIikpIHJldHVybiBwYWQwKHZhbC5TLCBmbXQubGVuZ3RoKTtcbmlmKHNzMCA+PSAyKSB0dCA9IHNzMCA9PT0gMyA/IDEwMDAgOiAxMDA7XG5cdFx0XHRlbHNlIHR0ID0gc3MwID09PSAxID8gMTAgOiAxO1xuXHRcdFx0c3MgPSBNYXRoLnJvdW5kKCh0dCkqKHZhbC5TICsgdmFsLnUpKTtcblx0XHRcdGlmKHNzID49IDYwKnR0KSBzcyA9IDA7XG5cdFx0XHRpZihmbXQgPT09ICdzJykgcmV0dXJuIHNzID09PSAwID8gXCIwXCIgOiBcIlwiK3NzL3R0O1xuXHRcdFx0byA9IHBhZDAoc3MsMiArIHNzMCk7XG5cdFx0XHRpZihmbXQgPT09ICdzcycpIHJldHVybiBvLnN1YnN0cigwLDIpO1xuXHRcdFx0cmV0dXJuIFwiLlwiICsgby5zdWJzdHIoMixmbXQubGVuZ3RoLTEpO1xuXHRcdGNhc2UgOTA6IC8qICdaJyBhYnNvbHV0ZSB0aW1lICovXG5cdFx0c3dpdGNoKGZtdCkge1xuXHRcdFx0Y2FzZSAnW2hdJzogY2FzZSAnW2hoXSc6IG91dCA9IHZhbC5EKjI0K3ZhbC5IOyBicmVhaztcblx0XHRcdGNhc2UgJ1ttXSc6IGNhc2UgJ1ttbV0nOiBvdXQgPSAodmFsLkQqMjQrdmFsLkgpKjYwK3ZhbC5NOyBicmVhaztcblx0XHRcdGNhc2UgJ1tzXSc6IGNhc2UgJ1tzc10nOiBvdXQgPSAoKHZhbC5EKjI0K3ZhbC5IKSo2MCt2YWwuTSkqNjArTWF0aC5yb3VuZCh2YWwuUyt2YWwudSk7IGJyZWFrO1xuXHRcdFx0ZGVmYXVsdDogdGhyb3cgJ2JhZCBhYnN0aW1lIGZvcm1hdDogJyArIGZtdDtcblx0XHR9IG91dGwgPSBmbXQubGVuZ3RoID09PSAzID8gMSA6IDI7IGJyZWFrO1xuXHRcdGNhc2UgMTAxOiAvKiAnZScgZXJhICovXG5cdFx0XHRvdXQgPSB5OyBvdXRsID0gMTsgYnJlYWs7XG5cdH1cblx0dmFyIG91dHN0ciA9IG91dGwgPiAwID8gcGFkMChvdXQsIG91dGwpIDogXCJcIjtcblx0cmV0dXJuIG91dHN0cjtcbn1cbi8qanNoaW50ICtXMDg2ICovXG5mdW5jdGlvbiBjb21tYWlmeShzKSB7XG5cdHZhciB3ID0gMztcblx0aWYocy5sZW5ndGggPD0gdykgcmV0dXJuIHM7XG5cdHZhciBqID0gKHMubGVuZ3RoICUgdyksIG8gPSBzLnN1YnN0cigwLGopO1xuXHRmb3IoOyBqIT1zLmxlbmd0aDsgais9dykgbys9KG8ubGVuZ3RoID4gMCA/IFwiLFwiIDogXCJcIikgKyBzLnN1YnN0cihqLHcpO1xuXHRyZXR1cm4gbztcbn1cbnZhciB3cml0ZV9udW0gPSAoZnVuY3Rpb24gbWFrZV93cml0ZV9udW0oKXtcbnZhciBwY3QxID0gLyUvZztcbmZ1bmN0aW9uIHdyaXRlX251bV9wY3QodHlwZSwgZm10LCB2YWwpe1xuXHR2YXIgc2ZtdCA9IGZtdC5yZXBsYWNlKHBjdDEsXCJcIiksIG11bCA9IGZtdC5sZW5ndGggLSBzZm10Lmxlbmd0aDtcblx0cmV0dXJuIHdyaXRlX251bSh0eXBlLCBzZm10LCB2YWwgKiBNYXRoLnBvdygxMCwyKm11bCkpICsgZmlsbChcIiVcIixtdWwpO1xufVxuZnVuY3Rpb24gd3JpdGVfbnVtX2NtKHR5cGUsIGZtdCwgdmFsKXtcblx0dmFyIGlkeCA9IGZtdC5sZW5ndGggLSAxO1xuXHR3aGlsZShmbXQuY2hhckNvZGVBdChpZHgtMSkgPT09IDQ0KSAtLWlkeDtcblx0cmV0dXJuIHdyaXRlX251bSh0eXBlLCBmbXQuc3Vic3RyKDAsaWR4KSwgdmFsIC8gTWF0aC5wb3coMTAsMyooZm10Lmxlbmd0aC1pZHgpKSk7XG59XG5mdW5jdGlvbiB3cml0ZV9udW1fZXhwKGZtdCwgdmFsKXtcblx0dmFyIG87XG5cdHZhciBpZHggPSBmbXQuaW5kZXhPZihcIkVcIikgLSBmbXQuaW5kZXhPZihcIi5cIikgLSAxO1xuXHRpZihmbXQubWF0Y2goL14jKzAuMEVcXCswJC8pKSB7XG5cdFx0aWYodmFsID09IDApIHJldHVybiBcIjAuMEUrMFwiO1xuXHRcdGVsc2UgaWYodmFsIDwgMCkgcmV0dXJuIFwiLVwiICsgd3JpdGVfbnVtX2V4cChmbXQsIC12YWwpO1xuXHRcdHZhciBwZXJpb2QgPSBmbXQuaW5kZXhPZihcIi5cIik7IGlmKHBlcmlvZCA9PT0gLTEpIHBlcmlvZD1mbXQuaW5kZXhPZignRScpO1xuXHRcdHZhciBlZSA9IE1hdGguZmxvb3IoTWF0aC5sb2codmFsKSpNYXRoLkxPRzEwRSklcGVyaW9kO1xuXHRcdGlmKGVlIDwgMCkgZWUgKz0gcGVyaW9kO1xuXHRcdG8gPSAodmFsL01hdGgucG93KDEwLGVlKSkudG9QcmVjaXNpb24oaWR4KzErKHBlcmlvZCtlZSklcGVyaW9kKTtcblx0XHRpZihvLmluZGV4T2YoXCJlXCIpID09PSAtMSkge1xuXHRcdFx0dmFyIGZha2VlID0gTWF0aC5mbG9vcihNYXRoLmxvZyh2YWwpKk1hdGguTE9HMTBFKTtcblx0XHRcdGlmKG8uaW5kZXhPZihcIi5cIikgPT09IC0xKSBvID0gby5jaGFyQXQoMCkgKyBcIi5cIiArIG8uc3Vic3RyKDEpICsgXCJFK1wiICsgKGZha2VlIC0gby5sZW5ndGgrZWUpO1xuXHRcdFx0ZWxzZSBvICs9IFwiRStcIiArIChmYWtlZSAtIGVlKTtcblx0XHRcdHdoaWxlKG8uc3Vic3RyKDAsMikgPT09IFwiMC5cIikge1xuXHRcdFx0XHRvID0gby5jaGFyQXQoMCkgKyBvLnN1YnN0cigyLHBlcmlvZCkgKyBcIi5cIiArIG8uc3Vic3RyKDIrcGVyaW9kKTtcblx0XHRcdFx0byA9IG8ucmVwbGFjZSgvXjArKFsxLTldKS8sXCIkMVwiKS5yZXBsYWNlKC9eMCtcXC4vLFwiMC5cIik7XG5cdFx0XHR9XG5cdFx0XHRvID0gby5yZXBsYWNlKC9cXCstLyxcIi1cIik7XG5cdFx0fVxuXHRcdG8gPSBvLnJlcGxhY2UoL14oWystXT8pKFxcZCopXFwuKFxcZCopW0VlXS8sZnVuY3Rpb24oJCQsJDEsJDIsJDMpIHsgcmV0dXJuICQxICsgJDIgKyAkMy5zdWJzdHIoMCwocGVyaW9kK2VlKSVwZXJpb2QpICsgXCIuXCIgKyAkMy5zdWJzdHIoZWUpICsgXCJFXCI7IH0pO1xuXHR9IGVsc2UgbyA9IHZhbC50b0V4cG9uZW50aWFsKGlkeCk7XG5cdGlmKGZtdC5tYXRjaCgvRVxcKzAwJC8pICYmIG8ubWF0Y2goL2VbKy1dXFxkJC8pKSBvID0gby5zdWJzdHIoMCxvLmxlbmd0aC0xKSArIFwiMFwiICsgby5jaGFyQXQoby5sZW5ndGgtMSk7XG5cdGlmKGZtdC5tYXRjaCgvRVxcLS8pICYmIG8ubWF0Y2goL2VcXCsvKSkgbyA9IG8ucmVwbGFjZSgvZVxcKy8sXCJlXCIpO1xuXHRyZXR1cm4gby5yZXBsYWNlKFwiZVwiLFwiRVwiKTtcbn1cbnZhciBmcmFjMSA9IC8jIChcXD8rKSggPylcXC8oID8pKFxcZCspLztcbmZ1bmN0aW9uIHdyaXRlX251bV9mMShyLCBhdmFsLCBzaWduKSB7XG5cdHZhciBkZW4gPSBwYXJzZUludChyWzRdLDEwKSwgcnIgPSBNYXRoLnJvdW5kKGF2YWwgKiBkZW4pLCBiYXNlID0gTWF0aC5mbG9vcihyci9kZW4pO1xuXHR2YXIgbXluID0gKHJyIC0gYmFzZSpkZW4pLCBteWQgPSBkZW47XG5cdHJldHVybiBzaWduICsgKGJhc2UgPT09IDAgPyBcIlwiIDogXCJcIitiYXNlKSArIFwiIFwiICsgKG15biA9PT0gMCA/IGZpbGwoXCIgXCIsIHJbMV0ubGVuZ3RoICsgMSArIHJbNF0ubGVuZ3RoKSA6IHBhZF8obXluLHJbMV0ubGVuZ3RoKSArIHJbMl0gKyBcIi9cIiArIHJbM10gKyBwYWQwKG15ZCxyWzRdLmxlbmd0aCkpO1xufVxuZnVuY3Rpb24gd3JpdGVfbnVtX2YyKHIsIGF2YWwsIHNpZ24pIHtcblx0cmV0dXJuIHNpZ24gKyAoYXZhbCA9PT0gMCA/IFwiXCIgOiBcIlwiK2F2YWwpICsgZmlsbChcIiBcIiwgclsxXS5sZW5ndGggKyAyICsgcls0XS5sZW5ndGgpO1xufVxudmFyIGRlYzEgPSAvXiMqMCpcXC4oWzAjXSspLztcbnZhciBjbG9zZXBhcmVuID0gL1xcKS4qWzAjXS87XG52YXIgcGhvbmUgPSAvXFwoIyMjXFwpICMjI1xcXFw/LSMjIyMvO1xuZnVuY3Rpb24gaGFzaHEoc3RyKSB7XG5cdHZhciBvID0gXCJcIiwgY2M7XG5cdGZvcih2YXIgaSA9IDA7IGkgIT0gc3RyLmxlbmd0aDsgKytpKSBzd2l0Y2goKGNjPXN0ci5jaGFyQ29kZUF0KGkpKSkge1xuXHRcdGNhc2UgMzU6IGJyZWFrO1xuXHRcdGNhc2UgNjM6IG8rPSBcIiBcIjsgYnJlYWs7XG5cdFx0Y2FzZSA0ODogbys9IFwiMFwiOyBicmVhaztcblx0XHRkZWZhdWx0OiBvKz0gU3RyaW5nLmZyb21DaGFyQ29kZShjYyk7XG5cdH1cblx0cmV0dXJuIG87XG59XG5mdW5jdGlvbiBybmQodmFsLCBkKSB7IHZhciBkZCA9IE1hdGgucG93KDEwLGQpOyByZXR1cm4gXCJcIisoTWF0aC5yb3VuZCh2YWwgKiBkZCkvZGQpOyB9XG5mdW5jdGlvbiBkZWModmFsLCBkKSB7XG5cdHZhciBfZnJhYyA9IHZhbCAtIE1hdGguZmxvb3IodmFsKSwgZGQgPSBNYXRoLnBvdygxMCxkKTtcblx0aWYgKGQgPCAoJycgKyBNYXRoLnJvdW5kKF9mcmFjICogZGQpKS5sZW5ndGgpIHJldHVybiAwO1xuXHRyZXR1cm4gTWF0aC5yb3VuZChfZnJhYyAqIGRkKTtcbn1cbmZ1bmN0aW9uIGNhcnJ5KHZhbCwgZCkge1xuXHRpZiAoZCA8ICgnJyArIE1hdGgucm91bmQoKHZhbC1NYXRoLmZsb29yKHZhbCkpKk1hdGgucG93KDEwLGQpKSkubGVuZ3RoKSB7XG5cdFx0cmV0dXJuIDE7XG5cdH1cblx0cmV0dXJuIDA7XG59XG5mdW5jdGlvbiBmbHIodmFsKSB7XG5cdGlmKHZhbCA8IDIxNDc0ODM2NDcgJiYgdmFsID4gLTIxNDc0ODM2NDgpIHJldHVybiBcIlwiKyh2YWwgPj0gMCA/ICh2YWx8MCkgOiAodmFsLTF8MCkpO1xuXHRyZXR1cm4gXCJcIitNYXRoLmZsb29yKHZhbCk7XG59XG5mdW5jdGlvbiB3cml0ZV9udW1fZmx0KHR5cGUsIGZtdCwgdmFsKSB7XG5cdGlmKHR5cGUuY2hhckNvZGVBdCgwKSA9PT0gNDAgJiYgIWZtdC5tYXRjaChjbG9zZXBhcmVuKSkge1xuXHRcdHZhciBmZm10ID0gZm10LnJlcGxhY2UoL1xcKCAqLyxcIlwiKS5yZXBsYWNlKC8gXFwpLyxcIlwiKS5yZXBsYWNlKC9cXCkvLFwiXCIpO1xuXHRcdGlmKHZhbCA+PSAwKSByZXR1cm4gd3JpdGVfbnVtX2ZsdCgnbicsIGZmbXQsIHZhbCk7XG5cdFx0cmV0dXJuICcoJyArIHdyaXRlX251bV9mbHQoJ24nLCBmZm10LCAtdmFsKSArICcpJztcblx0fVxuXHRpZihmbXQuY2hhckNvZGVBdChmbXQubGVuZ3RoIC0gMSkgPT09IDQ0KSByZXR1cm4gd3JpdGVfbnVtX2NtKHR5cGUsIGZtdCwgdmFsKTtcblx0aWYoZm10LmluZGV4T2YoJyUnKSAhPT0gLTEpIHJldHVybiB3cml0ZV9udW1fcGN0KHR5cGUsIGZtdCwgdmFsKTtcblx0aWYoZm10LmluZGV4T2YoJ0UnKSAhPT0gLTEpIHJldHVybiB3cml0ZV9udW1fZXhwKGZtdCwgdmFsKTtcblx0aWYoZm10LmNoYXJDb2RlQXQoMCkgPT09IDM2KSByZXR1cm4gXCIkXCIrd3JpdGVfbnVtX2ZsdCh0eXBlLGZtdC5zdWJzdHIoZm10LmNoYXJBdCgxKT09JyAnPzI6MSksdmFsKTtcblx0dmFyIG87XG5cdHZhciByLCByaSwgZmYsIGF2YWwgPSBNYXRoLmFicyh2YWwpLCBzaWduID0gdmFsIDwgMCA/IFwiLVwiIDogXCJcIjtcblx0aWYoZm10Lm1hdGNoKC9eMDArJC8pKSByZXR1cm4gc2lnbiArIHBhZDByKGF2YWwsZm10Lmxlbmd0aCk7XG5cdGlmKGZtdC5tYXRjaCgvXlsjP10rJC8pKSB7XG5cdFx0byA9IHBhZDByKHZhbCwwKTsgaWYobyA9PT0gXCIwXCIpIG8gPSBcIlwiO1xuXHRcdHJldHVybiBvLmxlbmd0aCA+IGZtdC5sZW5ndGggPyBvIDogaGFzaHEoZm10LnN1YnN0cigwLGZtdC5sZW5ndGgtby5sZW5ndGgpKSArIG87XG5cdH1cblx0aWYoKHIgPSBmbXQubWF0Y2goZnJhYzEpKSkgcmV0dXJuIHdyaXRlX251bV9mMShyLCBhdmFsLCBzaWduKTtcblx0aWYoZm10Lm1hdGNoKC9eIyswKyQvKSkgcmV0dXJuIHNpZ24gKyBwYWQwcihhdmFsLGZtdC5sZW5ndGggLSBmbXQuaW5kZXhPZihcIjBcIikpO1xuXHRpZigociA9IGZtdC5tYXRjaChkZWMxKSkpIHtcblx0XHRvID0gcm5kKHZhbCwgclsxXS5sZW5ndGgpLnJlcGxhY2UoL14oW15cXC5dKykkLyxcIiQxLlwiK2hhc2hxKHJbMV0pKS5yZXBsYWNlKC9cXC4kLyxcIi5cIitoYXNocShyWzFdKSkucmVwbGFjZSgvXFwuKFxcZCopJC8sZnVuY3Rpb24oJCQsICQxKSB7IHJldHVybiBcIi5cIiArICQxICsgZmlsbChcIjBcIiwgaGFzaHEoclsxXSkubGVuZ3RoLSQxLmxlbmd0aCk7IH0pO1xuXHRcdHJldHVybiBmbXQuaW5kZXhPZihcIjAuXCIpICE9PSAtMSA/IG8gOiBvLnJlcGxhY2UoL14wXFwuLyxcIi5cIik7XG5cdH1cblx0Zm10ID0gZm10LnJlcGxhY2UoL14jKyhbMC5dKS8sIFwiJDFcIik7XG5cdGlmKChyID0gZm10Lm1hdGNoKC9eKDAqKVxcLigjKikkLykpKSB7XG5cdFx0cmV0dXJuIHNpZ24gKyBybmQoYXZhbCwgclsyXS5sZW5ndGgpLnJlcGxhY2UoL1xcLihcXGQqWzEtOV0pMCokLyxcIi4kMVwiKS5yZXBsYWNlKC9eKC0/XFxkKikkLyxcIiQxLlwiKS5yZXBsYWNlKC9eMFxcLi8sclsxXS5sZW5ndGg/XCIwLlwiOlwiLlwiKTtcblx0fVxuXHRpZigociA9IGZtdC5tYXRjaCgvXiN7MSwzfSwjIzAoXFwuPykkLykpKSByZXR1cm4gc2lnbiArIGNvbW1haWZ5KHBhZDByKGF2YWwsMCkpO1xuXHRpZigociA9IGZtdC5tYXRjaCgvXiMsIyMwXFwuKFsjMF0qMCkkLykpKSB7XG5cdFx0cmV0dXJuIHZhbCA8IDAgPyBcIi1cIiArIHdyaXRlX251bV9mbHQodHlwZSwgZm10LCAtdmFsKSA6IGNvbW1haWZ5KFwiXCIrKE1hdGguZmxvb3IodmFsKSArIGNhcnJ5KHZhbCwgclsxXS5sZW5ndGgpKSkgKyBcIi5cIiArIHBhZDAoZGVjKHZhbCwgclsxXS5sZW5ndGgpLHJbMV0ubGVuZ3RoKTtcblx0fVxuXHRpZigociA9IGZtdC5tYXRjaCgvXiMsIyosIzAvKSkpIHJldHVybiB3cml0ZV9udW1fZmx0KHR5cGUsZm10LnJlcGxhY2UoL14jLCMqLC8sXCJcIiksdmFsKTtcblx0aWYoKHIgPSBmbXQubWF0Y2goL14oWzAjXSspKFxcXFw/LShbMCNdKykpKyQvKSkpIHtcblx0XHRvID0gX3N0cnJldih3cml0ZV9udW1fZmx0KHR5cGUsIGZtdC5yZXBsYWNlKC9bXFxcXC1dL2csXCJcIiksIHZhbCkpO1xuXHRcdHJpID0gMDtcblx0XHRyZXR1cm4gX3N0cnJldihfc3RycmV2KGZtdC5yZXBsYWNlKC9cXFxcL2csXCJcIikpLnJlcGxhY2UoL1swI10vZyxmdW5jdGlvbih4KXtyZXR1cm4gcmk8by5sZW5ndGg/by5jaGFyQXQocmkrKyk6eD09PScwJz8nMCc6XCJcIjt9KSk7XG5cdH1cblx0aWYoZm10Lm1hdGNoKHBob25lKSkge1xuXHRcdG8gPSB3cml0ZV9udW1fZmx0KHR5cGUsIFwiIyMjIyMjIyMjI1wiLCB2YWwpO1xuXHRcdHJldHVybiBcIihcIiArIG8uc3Vic3RyKDAsMykgKyBcIikgXCIgKyBvLnN1YnN0cigzLCAzKSArIFwiLVwiICsgby5zdWJzdHIoNik7XG5cdH1cblx0dmFyIG9hID0gXCJcIjtcblx0aWYoKHIgPSBmbXQubWF0Y2goL14oWyMwP10rKSggPylcXC8oID8pKFsjMD9dKykvKSkpIHtcblx0XHRyaSA9IE1hdGgubWluKHJbNF0ubGVuZ3RoLDcpO1xuXHRcdGZmID0gZnJhYyhhdmFsLCBNYXRoLnBvdygxMCxyaSktMSwgZmFsc2UpO1xuXHRcdG8gPSBcIlwiICsgc2lnbjtcblx0XHRvYSA9IHdyaXRlX251bShcIm5cIiwgclsxXSwgZmZbMV0pO1xuXHRcdGlmKG9hLmNoYXJBdChvYS5sZW5ndGgtMSkgPT0gXCIgXCIpIG9hID0gb2Euc3Vic3RyKDAsb2EubGVuZ3RoLTEpICsgXCIwXCI7XG5cdFx0byArPSBvYSArIHJbMl0gKyBcIi9cIiArIHJbM107XG5cdFx0b2EgPSBycGFkXyhmZlsyXSxyaSk7XG5cdFx0aWYob2EubGVuZ3RoIDwgcls0XS5sZW5ndGgpIG9hID0gaGFzaHEocls0XS5zdWJzdHIocls0XS5sZW5ndGgtb2EubGVuZ3RoKSkgKyBvYTtcblx0XHRvICs9IG9hO1xuXHRcdHJldHVybiBvO1xuXHR9XG5cdGlmKChyID0gZm10Lm1hdGNoKC9eIyAoWyMwP10rKSggPylcXC8oID8pKFsjMD9dKykvKSkpIHtcblx0XHRyaSA9IE1hdGgubWluKE1hdGgubWF4KHJbMV0ubGVuZ3RoLCByWzRdLmxlbmd0aCksNyk7XG5cdFx0ZmYgPSBmcmFjKGF2YWwsIE1hdGgucG93KDEwLHJpKS0xLCB0cnVlKTtcblx0XHRyZXR1cm4gc2lnbiArIChmZlswXXx8KGZmWzFdID8gXCJcIiA6IFwiMFwiKSkgKyBcIiBcIiArIChmZlsxXSA/IHBhZF8oZmZbMV0scmkpICsgclsyXSArIFwiL1wiICsgclszXSArIHJwYWRfKGZmWzJdLHJpKTogZmlsbChcIiBcIiwgMipyaSsxICsgclsyXS5sZW5ndGggKyByWzNdLmxlbmd0aCkpO1xuXHR9XG5cdGlmKChyID0gZm10Lm1hdGNoKC9eWyMwP10rJC8pKSkge1xuXHRcdG8gPSBwYWQwcih2YWwsIDApO1xuXHRcdGlmKGZtdC5sZW5ndGggPD0gby5sZW5ndGgpIHJldHVybiBvO1xuXHRcdHJldHVybiBoYXNocShmbXQuc3Vic3RyKDAsZm10Lmxlbmd0aC1vLmxlbmd0aCkpICsgbztcblx0fVxuXHRpZigociA9IGZtdC5tYXRjaCgvXihbIzA/XSspXFwuKFsjMF0rKSQvKSkpIHtcblx0XHRvID0gXCJcIiArIHZhbC50b0ZpeGVkKE1hdGgubWluKHJbMl0ubGVuZ3RoLDEwKSkucmVwbGFjZSgvKFteMF0pMCskLyxcIiQxXCIpO1xuXHRcdHJpID0gby5pbmRleE9mKFwiLlwiKTtcblx0XHR2YXIgbHJlcyA9IGZtdC5pbmRleE9mKFwiLlwiKSAtIHJpLCBycmVzID0gZm10Lmxlbmd0aCAtIG8ubGVuZ3RoIC0gbHJlcztcblx0XHRyZXR1cm4gaGFzaHEoZm10LnN1YnN0cigwLGxyZXMpICsgbyArIGZtdC5zdWJzdHIoZm10Lmxlbmd0aC1ycmVzKSk7XG5cdH1cblx0aWYoKHIgPSBmbXQubWF0Y2goL14wMCwwMDBcXC4oWyMwXSowKSQvKSkpIHtcblx0XHRyaSA9IGRlYyh2YWwsIHJbMV0ubGVuZ3RoKTtcblx0XHRyZXR1cm4gdmFsIDwgMCA/IFwiLVwiICsgd3JpdGVfbnVtX2ZsdCh0eXBlLCBmbXQsIC12YWwpIDogY29tbWFpZnkoZmxyKHZhbCkpLnJlcGxhY2UoL15cXGQsXFxkezN9JC8sXCIwJCZcIikucmVwbGFjZSgvXlxcZCokLyxmdW5jdGlvbigkJCkgeyByZXR1cm4gXCIwMCxcIiArICgkJC5sZW5ndGggPCAzID8gcGFkMCgwLDMtJCQubGVuZ3RoKSA6IFwiXCIpICsgJCQ7IH0pICsgXCIuXCIgKyBwYWQwKHJpLHJbMV0ubGVuZ3RoKTtcblx0fVxuXHRzd2l0Y2goZm10KSB7XG5cdFx0Y2FzZSBcIiMjIywjIzAuMDBcIjogcmV0dXJuIHdyaXRlX251bV9mbHQodHlwZSwgXCIjLCMjMC4wMFwiLCB2YWwpO1xuXHRcdGNhc2UgXCIjIyMsIyMjXCI6XG5cdFx0Y2FzZSBcIiMjLCMjI1wiOlxuXHRcdGNhc2UgXCIjLCMjI1wiOiB2YXIgeCA9IGNvbW1haWZ5KHBhZDByKGF2YWwsMCkpOyByZXR1cm4geCAhPT0gXCIwXCIgPyBzaWduICsgeCA6IFwiXCI7XG5cdFx0Y2FzZSBcIiMjIywjIyMuMDBcIjogcmV0dXJuIHdyaXRlX251bV9mbHQodHlwZSwgXCIjIyMsIyMwLjAwXCIsdmFsKS5yZXBsYWNlKC9eMFxcLi8sXCIuXCIpO1xuXHRcdGNhc2UgXCIjLCMjIy4wMFwiOiByZXR1cm4gd3JpdGVfbnVtX2ZsdCh0eXBlLCBcIiMsIyMwLjAwXCIsdmFsKS5yZXBsYWNlKC9eMFxcLi8sXCIuXCIpO1xuXHRcdGRlZmF1bHQ6XG5cdH1cblx0dGhyb3cgbmV3IEVycm9yKFwidW5zdXBwb3J0ZWQgZm9ybWF0IHxcIiArIGZtdCArIFwifFwiKTtcbn1cbmZ1bmN0aW9uIHdyaXRlX251bV9jbTIodHlwZSwgZm10LCB2YWwpe1xuXHR2YXIgaWR4ID0gZm10Lmxlbmd0aCAtIDE7XG5cdHdoaWxlKGZtdC5jaGFyQ29kZUF0KGlkeC0xKSA9PT0gNDQpIC0taWR4O1xuXHRyZXR1cm4gd3JpdGVfbnVtKHR5cGUsIGZtdC5zdWJzdHIoMCxpZHgpLCB2YWwgLyBNYXRoLnBvdygxMCwzKihmbXQubGVuZ3RoLWlkeCkpKTtcbn1cbmZ1bmN0aW9uIHdyaXRlX251bV9wY3QyKHR5cGUsIGZtdCwgdmFsKXtcblx0dmFyIHNmbXQgPSBmbXQucmVwbGFjZShwY3QxLFwiXCIpLCBtdWwgPSBmbXQubGVuZ3RoIC0gc2ZtdC5sZW5ndGg7XG5cdHJldHVybiB3cml0ZV9udW0odHlwZSwgc2ZtdCwgdmFsICogTWF0aC5wb3coMTAsMiptdWwpKSArIGZpbGwoXCIlXCIsbXVsKTtcbn1cbmZ1bmN0aW9uIHdyaXRlX251bV9leHAyKGZtdCwgdmFsKXtcblx0dmFyIG87XG5cdHZhciBpZHggPSBmbXQuaW5kZXhPZihcIkVcIikgLSBmbXQuaW5kZXhPZihcIi5cIikgLSAxO1xuXHRpZihmbXQubWF0Y2goL14jKzAuMEVcXCswJC8pKSB7XG5cdFx0aWYodmFsID09IDApIHJldHVybiBcIjAuMEUrMFwiO1xuXHRcdGVsc2UgaWYodmFsIDwgMCkgcmV0dXJuIFwiLVwiICsgd3JpdGVfbnVtX2V4cDIoZm10LCAtdmFsKTtcblx0XHR2YXIgcGVyaW9kID0gZm10LmluZGV4T2YoXCIuXCIpOyBpZihwZXJpb2QgPT09IC0xKSBwZXJpb2Q9Zm10LmluZGV4T2YoJ0UnKTtcblx0XHR2YXIgZWUgPSBNYXRoLmZsb29yKE1hdGgubG9nKHZhbCkqTWF0aC5MT0cxMEUpJXBlcmlvZDtcblx0XHRpZihlZSA8IDApIGVlICs9IHBlcmlvZDtcblx0XHRvID0gKHZhbC9NYXRoLnBvdygxMCxlZSkpLnRvUHJlY2lzaW9uKGlkeCsxKyhwZXJpb2QrZWUpJXBlcmlvZCk7XG5cdFx0aWYoIW8ubWF0Y2goL1tFZV0vKSkge1xuXHRcdFx0dmFyIGZha2VlID0gTWF0aC5mbG9vcihNYXRoLmxvZyh2YWwpKk1hdGguTE9HMTBFKTtcblx0XHRcdGlmKG8uaW5kZXhPZihcIi5cIikgPT09IC0xKSBvID0gby5jaGFyQXQoMCkgKyBcIi5cIiArIG8uc3Vic3RyKDEpICsgXCJFK1wiICsgKGZha2VlIC0gby5sZW5ndGgrZWUpO1xuXHRcdFx0ZWxzZSBvICs9IFwiRStcIiArIChmYWtlZSAtIGVlKTtcblx0XHRcdG8gPSBvLnJlcGxhY2UoL1xcKy0vLFwiLVwiKTtcblx0XHR9XG5cdFx0byA9IG8ucmVwbGFjZSgvXihbKy1dPykoXFxkKilcXC4oXFxkKilbRWVdLyxmdW5jdGlvbigkJCwkMSwkMiwkMykgeyByZXR1cm4gJDEgKyAkMiArICQzLnN1YnN0cigwLChwZXJpb2QrZWUpJXBlcmlvZCkgKyBcIi5cIiArICQzLnN1YnN0cihlZSkgKyBcIkVcIjsgfSk7XG5cdH0gZWxzZSBvID0gdmFsLnRvRXhwb25lbnRpYWwoaWR4KTtcblx0aWYoZm10Lm1hdGNoKC9FXFwrMDAkLykgJiYgby5tYXRjaCgvZVsrLV1cXGQkLykpIG8gPSBvLnN1YnN0cigwLG8ubGVuZ3RoLTEpICsgXCIwXCIgKyBvLmNoYXJBdChvLmxlbmd0aC0xKTtcblx0aWYoZm10Lm1hdGNoKC9FXFwtLykgJiYgby5tYXRjaCgvZVxcKy8pKSBvID0gby5yZXBsYWNlKC9lXFwrLyxcImVcIik7XG5cdHJldHVybiBvLnJlcGxhY2UoXCJlXCIsXCJFXCIpO1xufVxuZnVuY3Rpb24gd3JpdGVfbnVtX2ludCh0eXBlLCBmbXQsIHZhbCkge1xuXHRpZih0eXBlLmNoYXJDb2RlQXQoMCkgPT09IDQwICYmICFmbXQubWF0Y2goY2xvc2VwYXJlbikpIHtcblx0XHR2YXIgZmZtdCA9IGZtdC5yZXBsYWNlKC9cXCggKi8sXCJcIikucmVwbGFjZSgvIFxcKS8sXCJcIikucmVwbGFjZSgvXFwpLyxcIlwiKTtcblx0XHRpZih2YWwgPj0gMCkgcmV0dXJuIHdyaXRlX251bV9pbnQoJ24nLCBmZm10LCB2YWwpO1xuXHRcdHJldHVybiAnKCcgKyB3cml0ZV9udW1faW50KCduJywgZmZtdCwgLXZhbCkgKyAnKSc7XG5cdH1cblx0aWYoZm10LmNoYXJDb2RlQXQoZm10Lmxlbmd0aCAtIDEpID09PSA0NCkgcmV0dXJuIHdyaXRlX251bV9jbTIodHlwZSwgZm10LCB2YWwpO1xuXHRpZihmbXQuaW5kZXhPZignJScpICE9PSAtMSkgcmV0dXJuIHdyaXRlX251bV9wY3QyKHR5cGUsIGZtdCwgdmFsKTtcblx0aWYoZm10LmluZGV4T2YoJ0UnKSAhPT0gLTEpIHJldHVybiB3cml0ZV9udW1fZXhwMihmbXQsIHZhbCk7XG5cdGlmKGZtdC5jaGFyQ29kZUF0KDApID09PSAzNikgcmV0dXJuIFwiJFwiK3dyaXRlX251bV9pbnQodHlwZSxmbXQuc3Vic3RyKGZtdC5jaGFyQXQoMSk9PScgJz8yOjEpLHZhbCk7XG5cdHZhciBvO1xuXHR2YXIgciwgcmksIGZmLCBhdmFsID0gTWF0aC5hYnModmFsKSwgc2lnbiA9IHZhbCA8IDAgPyBcIi1cIiA6IFwiXCI7XG5cdGlmKGZtdC5tYXRjaCgvXjAwKyQvKSkgcmV0dXJuIHNpZ24gKyBwYWQwKGF2YWwsZm10Lmxlbmd0aCk7XG5cdGlmKGZtdC5tYXRjaCgvXlsjP10rJC8pKSB7XG5cdFx0byA9IChcIlwiK3ZhbCk7IGlmKHZhbCA9PT0gMCkgbyA9IFwiXCI7XG5cdFx0cmV0dXJuIG8ubGVuZ3RoID4gZm10Lmxlbmd0aCA/IG8gOiBoYXNocShmbXQuc3Vic3RyKDAsZm10Lmxlbmd0aC1vLmxlbmd0aCkpICsgbztcblx0fVxuXHRpZigociA9IGZtdC5tYXRjaChmcmFjMSkpKSByZXR1cm4gd3JpdGVfbnVtX2YyKHIsIGF2YWwsIHNpZ24pO1xuXHRpZihmbXQubWF0Y2goL14jKzArJC8pKSByZXR1cm4gc2lnbiArIHBhZDAoYXZhbCxmbXQubGVuZ3RoIC0gZm10LmluZGV4T2YoXCIwXCIpKTtcblx0aWYoKHIgPSBmbXQubWF0Y2goZGVjMSkpKSB7XG5vID0gKFwiXCIrdmFsKS5yZXBsYWNlKC9eKFteXFwuXSspJC8sXCIkMS5cIitoYXNocShyWzFdKSkucmVwbGFjZSgvXFwuJC8sXCIuXCIraGFzaHEoclsxXSkpO1xuXHRcdG8gPSBvLnJlcGxhY2UoL1xcLihcXGQqKSQvLGZ1bmN0aW9uKCQkLCAkMSkge1xucmV0dXJuIFwiLlwiICsgJDEgKyBmaWxsKFwiMFwiLCBoYXNocShyWzFdKS5sZW5ndGgtJDEubGVuZ3RoKTsgfSk7XG5cdFx0cmV0dXJuIGZtdC5pbmRleE9mKFwiMC5cIikgIT09IC0xID8gbyA6IG8ucmVwbGFjZSgvXjBcXC4vLFwiLlwiKTtcblx0fVxuXHRmbXQgPSBmbXQucmVwbGFjZSgvXiMrKFswLl0pLywgXCIkMVwiKTtcblx0aWYoKHIgPSBmbXQubWF0Y2goL14oMCopXFwuKCMqKSQvKSkpIHtcblx0XHRyZXR1cm4gc2lnbiArIChcIlwiK2F2YWwpLnJlcGxhY2UoL1xcLihcXGQqWzEtOV0pMCokLyxcIi4kMVwiKS5yZXBsYWNlKC9eKC0/XFxkKikkLyxcIiQxLlwiKS5yZXBsYWNlKC9eMFxcLi8sclsxXS5sZW5ndGg/XCIwLlwiOlwiLlwiKTtcblx0fVxuXHRpZigociA9IGZtdC5tYXRjaCgvXiN7MSwzfSwjIzAoXFwuPykkLykpKSByZXR1cm4gc2lnbiArIGNvbW1haWZ5KChcIlwiK2F2YWwpKTtcblx0aWYoKHIgPSBmbXQubWF0Y2goL14jLCMjMFxcLihbIzBdKjApJC8pKSkge1xuXHRcdHJldHVybiB2YWwgPCAwID8gXCItXCIgKyB3cml0ZV9udW1faW50KHR5cGUsIGZtdCwgLXZhbCkgOiBjb21tYWlmeSgoXCJcIit2YWwpKSArIFwiLlwiICsgZmlsbCgnMCcsclsxXS5sZW5ndGgpO1xuXHR9XG5cdGlmKChyID0gZm10Lm1hdGNoKC9eIywjKiwjMC8pKSkgcmV0dXJuIHdyaXRlX251bV9pbnQodHlwZSxmbXQucmVwbGFjZSgvXiMsIyosLyxcIlwiKSx2YWwpO1xuXHRpZigociA9IGZtdC5tYXRjaCgvXihbMCNdKykoXFxcXD8tKFswI10rKSkrJC8pKSkge1xuXHRcdG8gPSBfc3RycmV2KHdyaXRlX251bV9pbnQodHlwZSwgZm10LnJlcGxhY2UoL1tcXFxcLV0vZyxcIlwiKSwgdmFsKSk7XG5cdFx0cmkgPSAwO1xuXHRcdHJldHVybiBfc3RycmV2KF9zdHJyZXYoZm10LnJlcGxhY2UoL1xcXFwvZyxcIlwiKSkucmVwbGFjZSgvWzAjXS9nLGZ1bmN0aW9uKHgpe3JldHVybiByaTxvLmxlbmd0aD9vLmNoYXJBdChyaSsrKTp4PT09JzAnPycwJzpcIlwiO30pKTtcblx0fVxuXHRpZihmbXQubWF0Y2gocGhvbmUpKSB7XG5cdFx0byA9IHdyaXRlX251bV9pbnQodHlwZSwgXCIjIyMjIyMjIyMjXCIsIHZhbCk7XG5cdFx0cmV0dXJuIFwiKFwiICsgby5zdWJzdHIoMCwzKSArIFwiKSBcIiArIG8uc3Vic3RyKDMsIDMpICsgXCItXCIgKyBvLnN1YnN0cig2KTtcblx0fVxuXHR2YXIgb2EgPSBcIlwiO1xuXHRpZigociA9IGZtdC5tYXRjaCgvXihbIzA/XSspKCA/KVxcLyggPykoWyMwP10rKS8pKSkge1xuXHRcdHJpID0gTWF0aC5taW4ocls0XS5sZW5ndGgsNyk7XG5cdFx0ZmYgPSBmcmFjKGF2YWwsIE1hdGgucG93KDEwLHJpKS0xLCBmYWxzZSk7XG5cdFx0byA9IFwiXCIgKyBzaWduO1xuXHRcdG9hID0gd3JpdGVfbnVtKFwiblwiLCByWzFdLCBmZlsxXSk7XG5cdFx0aWYob2EuY2hhckF0KG9hLmxlbmd0aC0xKSA9PSBcIiBcIikgb2EgPSBvYS5zdWJzdHIoMCxvYS5sZW5ndGgtMSkgKyBcIjBcIjtcblx0XHRvICs9IG9hICsgclsyXSArIFwiL1wiICsgclszXTtcblx0XHRvYSA9IHJwYWRfKGZmWzJdLHJpKTtcblx0XHRpZihvYS5sZW5ndGggPCByWzRdLmxlbmd0aCkgb2EgPSBoYXNocShyWzRdLnN1YnN0cihyWzRdLmxlbmd0aC1vYS5sZW5ndGgpKSArIG9hO1xuXHRcdG8gKz0gb2E7XG5cdFx0cmV0dXJuIG87XG5cdH1cblx0aWYoKHIgPSBmbXQubWF0Y2goL14jIChbIzA/XSspKCA/KVxcLyggPykoWyMwP10rKS8pKSkge1xuXHRcdHJpID0gTWF0aC5taW4oTWF0aC5tYXgoclsxXS5sZW5ndGgsIHJbNF0ubGVuZ3RoKSw3KTtcblx0XHRmZiA9IGZyYWMoYXZhbCwgTWF0aC5wb3coMTAscmkpLTEsIHRydWUpO1xuXHRcdHJldHVybiBzaWduICsgKGZmWzBdfHwoZmZbMV0gPyBcIlwiIDogXCIwXCIpKSArIFwiIFwiICsgKGZmWzFdID8gcGFkXyhmZlsxXSxyaSkgKyByWzJdICsgXCIvXCIgKyByWzNdICsgcnBhZF8oZmZbMl0scmkpOiBmaWxsKFwiIFwiLCAyKnJpKzEgKyByWzJdLmxlbmd0aCArIHJbM10ubGVuZ3RoKSk7XG5cdH1cblx0aWYoKHIgPSBmbXQubWF0Y2goL15bIzA/XSskLykpKSB7XG5cdFx0byA9IFwiXCIgKyB2YWw7XG5cdFx0aWYoZm10Lmxlbmd0aCA8PSBvLmxlbmd0aCkgcmV0dXJuIG87XG5cdFx0cmV0dXJuIGhhc2hxKGZtdC5zdWJzdHIoMCxmbXQubGVuZ3RoLW8ubGVuZ3RoKSkgKyBvO1xuXHR9XG5cdGlmKChyID0gZm10Lm1hdGNoKC9eKFsjMF0rKVxcLihbIzBdKykkLykpKSB7XG5cdFx0byA9IFwiXCIgKyB2YWwudG9GaXhlZChNYXRoLm1pbihyWzJdLmxlbmd0aCwxMCkpLnJlcGxhY2UoLyhbXjBdKTArJC8sXCIkMVwiKTtcblx0XHRyaSA9IG8uaW5kZXhPZihcIi5cIik7XG5cdFx0dmFyIGxyZXMgPSBmbXQuaW5kZXhPZihcIi5cIikgLSByaSwgcnJlcyA9IGZtdC5sZW5ndGggLSBvLmxlbmd0aCAtIGxyZXM7XG5cdFx0cmV0dXJuIGhhc2hxKGZtdC5zdWJzdHIoMCxscmVzKSArIG8gKyBmbXQuc3Vic3RyKGZtdC5sZW5ndGgtcnJlcykpO1xuXHR9XG5cdGlmKChyID0gZm10Lm1hdGNoKC9eMDAsMDAwXFwuKFsjMF0qMCkkLykpKSB7XG5cdFx0cmV0dXJuIHZhbCA8IDAgPyBcIi1cIiArIHdyaXRlX251bV9pbnQodHlwZSwgZm10LCAtdmFsKSA6IGNvbW1haWZ5KFwiXCIrdmFsKS5yZXBsYWNlKC9eXFxkLFxcZHszfSQvLFwiMCQmXCIpLnJlcGxhY2UoL15cXGQqJC8sZnVuY3Rpb24oJCQpIHsgcmV0dXJuIFwiMDAsXCIgKyAoJCQubGVuZ3RoIDwgMyA/IHBhZDAoMCwzLSQkLmxlbmd0aCkgOiBcIlwiKSArICQkOyB9KSArIFwiLlwiICsgcGFkMCgwLHJbMV0ubGVuZ3RoKTtcblx0fVxuXHRzd2l0Y2goZm10KSB7XG5cdFx0Y2FzZSBcIiMjIywjIyNcIjpcblx0XHRjYXNlIFwiIyMsIyMjXCI6XG5cdFx0Y2FzZSBcIiMsIyMjXCI6IHZhciB4ID0gY29tbWFpZnkoXCJcIithdmFsKTsgcmV0dXJuIHggIT09IFwiMFwiID8gc2lnbiArIHggOiBcIlwiO1xuXHRcdGRlZmF1bHQ6XG5cdFx0XHRpZihmbXQubWF0Y2goL1xcLlswIz9dKiQvKSkgcmV0dXJuIHdyaXRlX251bV9pbnQodHlwZSwgZm10LnNsaWNlKDAsZm10Lmxhc3RJbmRleE9mKFwiLlwiKSksIHZhbCkgKyBoYXNocShmbXQuc2xpY2UoZm10Lmxhc3RJbmRleE9mKFwiLlwiKSkpO1xuXHR9XG5cdHRocm93IG5ldyBFcnJvcihcInVuc3VwcG9ydGVkIGZvcm1hdCB8XCIgKyBmbXQgKyBcInxcIik7XG59XG5yZXR1cm4gZnVuY3Rpb24gd3JpdGVfbnVtKHR5cGUsIGZtdCwgdmFsKSB7XG5cdHJldHVybiAodmFsfDApID09PSB2YWwgPyB3cml0ZV9udW1faW50KHR5cGUsIGZtdCwgdmFsKSA6IHdyaXRlX251bV9mbHQodHlwZSwgZm10LCB2YWwpO1xufTt9KSgpO1xuZnVuY3Rpb24gc3BsaXRfZm10KGZtdCkge1xuXHR2YXIgb3V0ID0gW107XG5cdHZhciBpbl9zdHIgPSBmYWxzZS8qLCBjYyovO1xuXHRmb3IodmFyIGkgPSAwLCBqID0gMDsgaSA8IGZtdC5sZW5ndGg7ICsraSkgc3dpdGNoKCgvKmNjPSovZm10LmNoYXJDb2RlQXQoaSkpKSB7XG5cdFx0Y2FzZSAzNDogLyogJ1wiJyAqL1xuXHRcdFx0aW5fc3RyID0gIWluX3N0cjsgYnJlYWs7XG5cdFx0Y2FzZSA5NTogY2FzZSA0MjogY2FzZSA5MjogLyogJ18nICcqJyAnXFxcXCcgKi9cblx0XHRcdCsraTsgYnJlYWs7XG5cdFx0Y2FzZSA1OTogLyogJzsnICovXG5cdFx0XHRvdXRbb3V0Lmxlbmd0aF0gPSBmbXQuc3Vic3RyKGosaS1qKTtcblx0XHRcdGogPSBpKzE7XG5cdH1cblx0b3V0W291dC5sZW5ndGhdID0gZm10LnN1YnN0cihqKTtcblx0aWYoaW5fc3RyID09PSB0cnVlKSB0aHJvdyBuZXcgRXJyb3IoXCJGb3JtYXQgfFwiICsgZm10ICsgXCJ8IHVudGVybWluYXRlZCBzdHJpbmcgXCIpO1xuXHRyZXR1cm4gb3V0O1xufVxuU1NGLl9zcGxpdCA9IHNwbGl0X2ZtdDtcbnZhciBhYnN0aW1lID0gL1xcW1tIaE1tU3NcXHUwRTBBXFx1MEUxOVxcdTBFMTddKlxcXS87XG5mdW5jdGlvbiBmbXRfaXNfZGF0ZShmbXQpIHtcblx0dmFyIGkgPSAwLCAvKmNjID0gMCwqLyBjID0gXCJcIiwgbyA9IFwiXCI7XG5cdHdoaWxlKGkgPCBmbXQubGVuZ3RoKSB7XG5cdFx0c3dpdGNoKChjID0gZm10LmNoYXJBdChpKSkpIHtcblx0XHRcdGNhc2UgJ0cnOiBpZihpc2dlbmVyYWwoZm10LCBpKSkgaSs9IDY7IGkrKzsgYnJlYWs7XG5cdFx0XHRjYXNlICdcIic6IGZvcig7KC8qY2M9Ki9mbXQuY2hhckNvZGVBdCgrK2kpKSAhPT0gMzQgJiYgaSA8IGZtdC5sZW5ndGg7KXsvKmVtcHR5Ki99ICsraTsgYnJlYWs7XG5cdFx0XHRjYXNlICdcXFxcJzogaSs9MjsgYnJlYWs7XG5cdFx0XHRjYXNlICdfJzogaSs9MjsgYnJlYWs7XG5cdFx0XHRjYXNlICdAJzogKytpOyBicmVhaztcblx0XHRcdGNhc2UgJ0InOiBjYXNlICdiJzpcblx0XHRcdFx0aWYoZm10LmNoYXJBdChpKzEpID09PSBcIjFcIiB8fCBmbXQuY2hhckF0KGkrMSkgPT09IFwiMlwiKSByZXR1cm4gdHJ1ZTtcblx0XHRcdFx0LyogZmFsbHMgdGhyb3VnaCAqL1xuXHRcdFx0Y2FzZSAnTSc6IGNhc2UgJ0QnOiBjYXNlICdZJzogY2FzZSAnSCc6IGNhc2UgJ1MnOiBjYXNlICdFJzpcblx0XHRcdFx0LyogZmFsbHMgdGhyb3VnaCAqL1xuXHRcdFx0Y2FzZSAnbSc6IGNhc2UgJ2QnOiBjYXNlICd5JzogY2FzZSAnaCc6IGNhc2UgJ3MnOiBjYXNlICdlJzogY2FzZSAnZyc6IHJldHVybiB0cnVlO1xuXHRcdFx0Y2FzZSAnQSc6IGNhc2UgJ2EnOiBjYXNlICfkuIonOlxuXHRcdFx0XHRpZihmbXQuc3Vic3RyKGksIDMpLnRvVXBwZXJDYXNlKCkgPT09IFwiQS9QXCIpIHJldHVybiB0cnVlO1xuXHRcdFx0XHRpZihmbXQuc3Vic3RyKGksIDUpLnRvVXBwZXJDYXNlKCkgPT09IFwiQU0vUE1cIikgcmV0dXJuIHRydWU7XG5cdFx0XHRcdGlmKGZtdC5zdWJzdHIoaSwgNSkudG9VcHBlckNhc2UoKSA9PT0gXCLkuIrljYgv5LiL5Y2IXCIpIHJldHVybiB0cnVlO1xuXHRcdFx0XHQrK2k7IGJyZWFrO1xuXHRcdFx0Y2FzZSAnWyc6XG5cdFx0XHRcdG8gPSBjO1xuXHRcdFx0XHR3aGlsZShmbXQuY2hhckF0KGkrKykgIT09ICddJyAmJiBpIDwgZm10Lmxlbmd0aCkgbyArPSBmbXQuY2hhckF0KGkpO1xuXHRcdFx0XHRpZihvLm1hdGNoKGFic3RpbWUpKSByZXR1cm4gdHJ1ZTtcblx0XHRcdFx0YnJlYWs7XG5cdFx0XHRjYXNlICcuJzpcblx0XHRcdFx0LyogZmFsbHMgdGhyb3VnaCAqL1xuXHRcdFx0Y2FzZSAnMCc6IGNhc2UgJyMnOlxuXHRcdFx0XHR3aGlsZShpIDwgZm10Lmxlbmd0aCAmJiAoXCIwIz8uLEUrLSVcIi5pbmRleE9mKGM9Zm10LmNoYXJBdCgrK2kpKSA+IC0xIHx8IChjPT0nXFxcXCcgJiYgZm10LmNoYXJBdChpKzEpID09IFwiLVwiICYmIFwiMCNcIi5pbmRleE9mKGZtdC5jaGFyQXQoaSsyKSk+LTEpKSl7LyogZW1wdHkgKi99XG5cdFx0XHRcdGJyZWFrO1xuXHRcdFx0Y2FzZSAnPyc6IHdoaWxlKGZtdC5jaGFyQXQoKytpKSA9PT0gYyl7LyogZW1wdHkgKi99IGJyZWFrO1xuXHRcdFx0Y2FzZSAnKic6ICsraTsgaWYoZm10LmNoYXJBdChpKSA9PSAnICcgfHwgZm10LmNoYXJBdChpKSA9PSAnKicpICsraTsgYnJlYWs7XG5cdFx0XHRjYXNlICcoJzogY2FzZSAnKSc6ICsraTsgYnJlYWs7XG5cdFx0XHRjYXNlICcxJzogY2FzZSAnMic6IGNhc2UgJzMnOiBjYXNlICc0JzogY2FzZSAnNSc6IGNhc2UgJzYnOiBjYXNlICc3JzogY2FzZSAnOCc6IGNhc2UgJzknOlxuXHRcdFx0XHR3aGlsZShpIDwgZm10Lmxlbmd0aCAmJiBcIjAxMjM0NTY3ODlcIi5pbmRleE9mKGZtdC5jaGFyQXQoKytpKSkgPiAtMSl7LyogZW1wdHkgKi99IGJyZWFrO1xuXHRcdFx0Y2FzZSAnICc6ICsraTsgYnJlYWs7XG5cdFx0XHRkZWZhdWx0OiArK2k7IGJyZWFrO1xuXHRcdH1cblx0fVxuXHRyZXR1cm4gZmFsc2U7XG59XG5TU0YuaXNfZGF0ZSA9IGZtdF9pc19kYXRlO1xuZnVuY3Rpb24gZXZhbF9mbXQoZm10LCB2LCBvcHRzLCBmbGVuKSB7XG5cdHZhciBvdXQgPSBbXSwgbyA9IFwiXCIsIGkgPSAwLCBjID0gXCJcIiwgbHN0PSd0JywgZHQsIGosIGNjO1xuXHR2YXIgaHI9J0gnO1xuXHQvKiBUb2tlbml6ZSAqL1xuXHR3aGlsZShpIDwgZm10Lmxlbmd0aCkge1xuXHRcdHN3aXRjaCgoYyA9IGZtdC5jaGFyQXQoaSkpKSB7XG5cdFx0XHRjYXNlICdHJzogLyogR2VuZXJhbCAqL1xuXHRcdFx0XHRpZighaXNnZW5lcmFsKGZtdCwgaSkpIHRocm93IG5ldyBFcnJvcigndW5yZWNvZ25pemVkIGNoYXJhY3RlciAnICsgYyArICcgaW4gJyArZm10KTtcblx0XHRcdFx0b3V0W291dC5sZW5ndGhdID0ge3Q6J0cnLCB2OidHZW5lcmFsJ307IGkrPTc7IGJyZWFrO1xuXHRcdFx0Y2FzZSAnXCInOiAvKiBMaXRlcmFsIHRleHQgKi9cblx0XHRcdFx0Zm9yKG89XCJcIjsoY2M9Zm10LmNoYXJDb2RlQXQoKytpKSkgIT09IDM0ICYmIGkgPCBmbXQubGVuZ3RoOykgbyArPSBTdHJpbmcuZnJvbUNoYXJDb2RlKGNjKTtcblx0XHRcdFx0b3V0W291dC5sZW5ndGhdID0ge3Q6J3QnLCB2Om99OyArK2k7IGJyZWFrO1xuXHRcdFx0Y2FzZSAnXFxcXCc6IHZhciB3ID0gZm10LmNoYXJBdCgrK2kpLCB0ID0gKHcgPT09IFwiKFwiIHx8IHcgPT09IFwiKVwiKSA/IHcgOiAndCc7XG5cdFx0XHRcdG91dFtvdXQubGVuZ3RoXSA9IHt0OnQsIHY6d307ICsraTsgYnJlYWs7XG5cdFx0XHRjYXNlICdfJzogb3V0W291dC5sZW5ndGhdID0ge3Q6J3QnLCB2OlwiIFwifTsgaSs9MjsgYnJlYWs7XG5cdFx0XHRjYXNlICdAJzogLyogVGV4dCBQbGFjZWhvbGRlciAqL1xuXHRcdFx0XHRvdXRbb3V0Lmxlbmd0aF0gPSB7dDonVCcsIHY6dn07ICsraTsgYnJlYWs7XG5cdFx0XHRjYXNlICdCJzogY2FzZSAnYic6XG5cdFx0XHRcdGlmKGZtdC5jaGFyQXQoaSsxKSA9PT0gXCIxXCIgfHwgZm10LmNoYXJBdChpKzEpID09PSBcIjJcIikge1xuXHRcdFx0XHRcdGlmKGR0PT1udWxsKSB7IGR0PXBhcnNlX2RhdGVfY29kZSh2LCBvcHRzLCBmbXQuY2hhckF0KGkrMSkgPT09IFwiMlwiKTsgaWYoZHQ9PW51bGwpIHJldHVybiBcIlwiOyB9XG5cdFx0XHRcdFx0b3V0W291dC5sZW5ndGhdID0ge3Q6J1gnLCB2OmZtdC5zdWJzdHIoaSwyKX07IGxzdCA9IGM7IGkrPTI7IGJyZWFrO1xuXHRcdFx0XHR9XG5cdFx0XHRcdC8qIGZhbGxzIHRocm91Z2ggKi9cblx0XHRcdGNhc2UgJ00nOiBjYXNlICdEJzogY2FzZSAnWSc6IGNhc2UgJ0gnOiBjYXNlICdTJzogY2FzZSAnRSc6XG5cdFx0XHRcdGMgPSBjLnRvTG93ZXJDYXNlKCk7XG5cdFx0XHRcdC8qIGZhbGxzIHRocm91Z2ggKi9cblx0XHRcdGNhc2UgJ20nOiBjYXNlICdkJzogY2FzZSAneSc6IGNhc2UgJ2gnOiBjYXNlICdzJzogY2FzZSAnZSc6IGNhc2UgJ2cnOlxuXHRcdFx0XHRpZih2IDwgMCkgcmV0dXJuIFwiXCI7XG5cdFx0XHRcdGlmKGR0PT1udWxsKSB7IGR0PXBhcnNlX2RhdGVfY29kZSh2LCBvcHRzKTsgaWYoZHQ9PW51bGwpIHJldHVybiBcIlwiOyB9XG5cdFx0XHRcdG8gPSBjOyB3aGlsZSgrK2kgPCBmbXQubGVuZ3RoICYmIGZtdC5jaGFyQXQoaSkudG9Mb3dlckNhc2UoKSA9PT0gYykgbys9Yztcblx0XHRcdFx0aWYoYyA9PT0gJ20nICYmIGxzdC50b0xvd2VyQ2FzZSgpID09PSAnaCcpIGMgPSAnTSc7XG5cdFx0XHRcdGlmKGMgPT09ICdoJykgYyA9IGhyO1xuXHRcdFx0XHRvdXRbb3V0Lmxlbmd0aF0gPSB7dDpjLCB2Om99OyBsc3QgPSBjOyBicmVhaztcblx0XHRcdGNhc2UgJ0EnOiBjYXNlICdhJzogY2FzZSAn5LiKJzpcblx0XHRcdFx0dmFyIHE9e3Q6YywgdjpjfTtcblx0XHRcdFx0aWYoZHQ9PW51bGwpIGR0PXBhcnNlX2RhdGVfY29kZSh2LCBvcHRzKTtcblx0XHRcdFx0aWYoZm10LnN1YnN0cihpLCAzKS50b1VwcGVyQ2FzZSgpID09PSBcIkEvUFwiKSB7IGlmKGR0IT1udWxsKSBxLnYgPSBkdC5IID49IDEyID8gXCJQXCIgOiBcIkFcIjsgcS50ID0gJ1QnOyBocj0naCc7aSs9Mzt9XG5cdFx0XHRcdGVsc2UgaWYoZm10LnN1YnN0cihpLDUpLnRvVXBwZXJDYXNlKCkgPT09IFwiQU0vUE1cIikgeyBpZihkdCE9bnVsbCkgcS52ID0gZHQuSCA+PSAxMiA/IFwiUE1cIiA6IFwiQU1cIjsgcS50ID0gJ1QnOyBpKz01OyBocj0naCc7IH1cblx0XHRcdFx0ZWxzZSBpZihmbXQuc3Vic3RyKGksNSkudG9VcHBlckNhc2UoKSA9PT0gXCLkuIrljYgv5LiL5Y2IXCIpIHsgaWYoZHQhPW51bGwpIHEudiA9IGR0LkggPj0gMTIgPyBcIuS4i+WNiFwiIDogXCLkuIrljYhcIjsgcS50ID0gJ1QnOyBpKz01OyBocj0naCc7IH1cblx0XHRcdFx0ZWxzZSB7IHEudCA9IFwidFwiOyArK2k7IH1cblx0XHRcdFx0aWYoZHQ9PW51bGwgJiYgcS50ID09PSAnVCcpIHJldHVybiBcIlwiO1xuXHRcdFx0XHRvdXRbb3V0Lmxlbmd0aF0gPSBxOyBsc3QgPSBjOyBicmVhaztcblx0XHRcdGNhc2UgJ1snOlxuXHRcdFx0XHRvID0gYztcblx0XHRcdFx0d2hpbGUoZm10LmNoYXJBdChpKyspICE9PSAnXScgJiYgaSA8IGZtdC5sZW5ndGgpIG8gKz0gZm10LmNoYXJBdChpKTtcblx0XHRcdFx0aWYoby5zbGljZSgtMSkgIT09ICddJykgdGhyb3cgJ3VudGVybWluYXRlZCBcIltcIiBibG9jazogfCcgKyBvICsgJ3wnO1xuXHRcdFx0XHRpZihvLm1hdGNoKGFic3RpbWUpKSB7XG5cdFx0XHRcdFx0aWYoZHQ9PW51bGwpIHsgZHQ9cGFyc2VfZGF0ZV9jb2RlKHYsIG9wdHMpOyBpZihkdD09bnVsbCkgcmV0dXJuIFwiXCI7IH1cblx0XHRcdFx0XHRvdXRbb3V0Lmxlbmd0aF0gPSB7dDonWicsIHY6by50b0xvd2VyQ2FzZSgpfTtcblx0XHRcdFx0XHRsc3QgPSBvLmNoYXJBdCgxKTtcblx0XHRcdFx0fSBlbHNlIGlmKG8uaW5kZXhPZihcIiRcIikgPiAtMSkge1xuXHRcdFx0XHRcdG8gPSAoby5tYXRjaCgvXFwkKFteLVxcW1xcXV0qKS8pfHxbXSlbMV18fFwiJFwiO1xuXHRcdFx0XHRcdGlmKCFmbXRfaXNfZGF0ZShmbXQpKSBvdXRbb3V0Lmxlbmd0aF0gPSB7dDondCcsdjpvfTtcblx0XHRcdFx0fVxuXHRcdFx0XHRicmVhaztcblx0XHRcdC8qIE51bWJlcnMgKi9cblx0XHRcdGNhc2UgJy4nOlxuXHRcdFx0XHRpZihkdCAhPSBudWxsKSB7XG5cdFx0XHRcdFx0byA9IGM7IHdoaWxlKCsraSA8IGZtdC5sZW5ndGggJiYgKGM9Zm10LmNoYXJBdChpKSkgPT09IFwiMFwiKSBvICs9IGM7XG5cdFx0XHRcdFx0b3V0W291dC5sZW5ndGhdID0ge3Q6J3MnLCB2Om99OyBicmVhaztcblx0XHRcdFx0fVxuXHRcdFx0XHQvKiBmYWxscyB0aHJvdWdoICovXG5cdFx0XHRjYXNlICcwJzogY2FzZSAnIyc6XG5cdFx0XHRcdG8gPSBjOyB3aGlsZSgrK2kgPCBmbXQubGVuZ3RoICYmIFwiMCM/LixFKy0lXCIuaW5kZXhPZihjPWZtdC5jaGFyQXQoaSkpID4gLTEpIG8gKz0gYztcblx0XHRcdFx0b3V0W291dC5sZW5ndGhdID0ge3Q6J24nLCB2Om99OyBicmVhaztcblx0XHRcdGNhc2UgJz8nOlxuXHRcdFx0XHRvID0gYzsgd2hpbGUoZm10LmNoYXJBdCgrK2kpID09PSBjKSBvKz1jO1xuXHRcdFx0XHRvdXRbb3V0Lmxlbmd0aF0gPSB7dDpjLCB2Om99OyBsc3QgPSBjOyBicmVhaztcblx0XHRcdGNhc2UgJyonOiArK2k7IGlmKGZtdC5jaGFyQXQoaSkgPT0gJyAnIHx8IGZtdC5jaGFyQXQoaSkgPT0gJyonKSArK2k7IGJyZWFrOyAvLyAqKlxuXHRcdFx0Y2FzZSAnKCc6IGNhc2UgJyknOiBvdXRbb3V0Lmxlbmd0aF0gPSB7dDooZmxlbj09PTE/J3QnOmMpLCB2OmN9OyArK2k7IGJyZWFrO1xuXHRcdFx0Y2FzZSAnMSc6IGNhc2UgJzInOiBjYXNlICczJzogY2FzZSAnNCc6IGNhc2UgJzUnOiBjYXNlICc2JzogY2FzZSAnNyc6IGNhc2UgJzgnOiBjYXNlICc5Jzpcblx0XHRcdFx0byA9IGM7IHdoaWxlKGkgPCBmbXQubGVuZ3RoICYmIFwiMDEyMzQ1Njc4OVwiLmluZGV4T2YoZm10LmNoYXJBdCgrK2kpKSA+IC0xKSBvKz1mbXQuY2hhckF0KGkpO1xuXHRcdFx0XHRvdXRbb3V0Lmxlbmd0aF0gPSB7dDonRCcsIHY6b307IGJyZWFrO1xuXHRcdFx0Y2FzZSAnICc6IG91dFtvdXQubGVuZ3RoXSA9IHt0OmMsIHY6Y307ICsraTsgYnJlYWs7XG5cdFx0XHRjYXNlICckJzogb3V0W291dC5sZW5ndGhdID0ge3Q6J3QnLCB2OickJ307ICsraTsgYnJlYWs7XG5cdFx0XHRkZWZhdWx0OlxuXHRcdFx0XHRpZihcIiwkLSsvKCk6IV4mJ357fTw+PeKCrGFjZmlqa2xvcHFydHV2d3h6UFwiLmluZGV4T2YoYykgPT09IC0xKSB0aHJvdyBuZXcgRXJyb3IoJ3VucmVjb2duaXplZCBjaGFyYWN0ZXIgJyArIGMgKyAnIGluICcgKyBmbXQpO1xuXHRcdFx0XHRvdXRbb3V0Lmxlbmd0aF0gPSB7dDondCcsIHY6Y307ICsraTsgYnJlYWs7XG5cdFx0fVxuXHR9XG5cblx0LyogU2NhbiBmb3IgZGF0ZS90aW1lIHBhcnRzICovXG5cdHZhciBidCA9IDAsIHNzMCA9IDAsIHNzbTtcblx0Zm9yKGk9b3V0Lmxlbmd0aC0xLCBsc3Q9J3QnOyBpID49IDA7IC0taSkge1xuXHRcdHN3aXRjaChvdXRbaV0udCkge1xuXHRcdFx0Y2FzZSAnaCc6IGNhc2UgJ0gnOiBvdXRbaV0udCA9IGhyOyBsc3Q9J2gnOyBpZihidCA8IDEpIGJ0ID0gMTsgYnJlYWs7XG5cdFx0XHRjYXNlICdzJzpcblx0XHRcdFx0aWYoKHNzbT1vdXRbaV0udi5tYXRjaCgvXFwuMCskLykpKSBzczA9TWF0aC5tYXgoc3MwLHNzbVswXS5sZW5ndGgtMSk7XG5cdFx0XHRcdGlmKGJ0IDwgMykgYnQgPSAzO1xuXHRcdFx0LyogZmFsbHMgdGhyb3VnaCAqL1xuXHRcdFx0Y2FzZSAnZCc6IGNhc2UgJ3knOiBjYXNlICdNJzogY2FzZSAnZSc6IGxzdD1vdXRbaV0udDsgYnJlYWs7XG5cdFx0XHRjYXNlICdtJzogaWYobHN0ID09PSAncycpIHsgb3V0W2ldLnQgPSAnTSc7IGlmKGJ0IDwgMikgYnQgPSAyOyB9IGJyZWFrO1xuXHRcdFx0Y2FzZSAnWCc6IC8qaWYob3V0W2ldLnYgPT09IFwiQjJcIik7Ki9cblx0XHRcdFx0YnJlYWs7XG5cdFx0XHRjYXNlICdaJzpcblx0XHRcdFx0aWYoYnQgPCAxICYmIG91dFtpXS52Lm1hdGNoKC9bSGhdLykpIGJ0ID0gMTtcblx0XHRcdFx0aWYoYnQgPCAyICYmIG91dFtpXS52Lm1hdGNoKC9bTW1dLykpIGJ0ID0gMjtcblx0XHRcdFx0aWYoYnQgPCAzICYmIG91dFtpXS52Lm1hdGNoKC9bU3NdLykpIGJ0ID0gMztcblx0XHR9XG5cdH1cblx0LyogdGltZSByb3VuZGluZyBkZXBlbmRzIG9uIHByZXNlbmNlIG9mIG1pbnV0ZSAvIHNlY29uZCAvIHVzZWMgZmllbGRzICovXG5cdHN3aXRjaChidCkge1xuXHRcdGNhc2UgMDogYnJlYWs7XG5cdFx0Y2FzZSAxOlxuaWYoZHQudSA+PSAwLjUpIHsgZHQudSA9IDA7ICsrZHQuUzsgfVxuXHRcdFx0aWYoZHQuUyA+PSAgNjApIHsgZHQuUyA9IDA7ICsrZHQuTTsgfVxuXHRcdFx0aWYoZHQuTSA+PSAgNjApIHsgZHQuTSA9IDA7ICsrZHQuSDsgfVxuXHRcdFx0YnJlYWs7XG5cdFx0Y2FzZSAyOlxuaWYoZHQudSA+PSAwLjUpIHsgZHQudSA9IDA7ICsrZHQuUzsgfVxuXHRcdFx0aWYoZHQuUyA+PSAgNjApIHsgZHQuUyA9IDA7ICsrZHQuTTsgfVxuXHRcdFx0YnJlYWs7XG5cdH1cblxuXHQvKiByZXBsYWNlIGZpZWxkcyAqL1xuXHR2YXIgbnN0ciA9IFwiXCIsIGpqO1xuXHRmb3IoaT0wOyBpIDwgb3V0Lmxlbmd0aDsgKytpKSB7XG5cdFx0c3dpdGNoKG91dFtpXS50KSB7XG5cdFx0XHRjYXNlICd0JzogY2FzZSAnVCc6IGNhc2UgJyAnOiBjYXNlICdEJzogYnJlYWs7XG5cdFx0XHRjYXNlICdYJzogb3V0W2ldLnYgPSBcIlwiOyBvdXRbaV0udCA9IFwiO1wiOyBicmVhaztcblx0XHRcdGNhc2UgJ2QnOiBjYXNlICdtJzogY2FzZSAneSc6IGNhc2UgJ2gnOiBjYXNlICdIJzogY2FzZSAnTSc6IGNhc2UgJ3MnOiBjYXNlICdlJzogY2FzZSAnYic6IGNhc2UgJ1onOlxub3V0W2ldLnYgPSB3cml0ZV9kYXRlKG91dFtpXS50LmNoYXJDb2RlQXQoMCksIG91dFtpXS52LCBkdCwgc3MwKTtcblx0XHRcdFx0b3V0W2ldLnQgPSAndCc7IGJyZWFrO1xuXHRcdFx0Y2FzZSAnbic6IGNhc2UgJz8nOlxuXHRcdFx0XHRqaiA9IGkrMTtcblx0XHRcdFx0d2hpbGUob3V0W2pqXSAhPSBudWxsICYmIChcblx0XHRcdFx0XHQoYz1vdXRbampdLnQpID09PSBcIj9cIiB8fCBjID09PSBcIkRcIiB8fFxuXHRcdFx0XHRcdCgoYyA9PT0gXCIgXCIgfHwgYyA9PT0gXCJ0XCIpICYmIG91dFtqaisxXSAhPSBudWxsICYmIChvdXRbamorMV0udCA9PT0gJz8nIHx8IG91dFtqaisxXS50ID09PSBcInRcIiAmJiBvdXRbamorMV0udiA9PT0gJy8nKSkgfHxcblx0XHRcdFx0XHQob3V0W2ldLnQgPT09ICcoJyAmJiAoYyA9PT0gJyAnIHx8IGMgPT09ICduJyB8fCBjID09PSAnKScpKSB8fFxuXHRcdFx0XHRcdChjID09PSAndCcgJiYgKG91dFtqal0udiA9PT0gJy8nIHx8IG91dFtqal0udiA9PT0gJyAnICYmIG91dFtqaisxXSAhPSBudWxsICYmIG91dFtqaisxXS50ID09ICc/JykpXG5cdFx0XHRcdCkpIHtcblx0XHRcdFx0XHRvdXRbaV0udiArPSBvdXRbampdLnY7XG5cdFx0XHRcdFx0b3V0W2pqXSA9IHt2OlwiXCIsIHQ6XCI7XCJ9OyArK2pqO1xuXHRcdFx0XHR9XG5cdFx0XHRcdG5zdHIgKz0gb3V0W2ldLnY7XG5cdFx0XHRcdGkgPSBqai0xOyBicmVhaztcblx0XHRcdGNhc2UgJ0cnOiBvdXRbaV0udCA9ICd0Jzsgb3V0W2ldLnYgPSBnZW5lcmFsX2ZtdCh2LG9wdHMpOyBicmVhaztcblx0XHR9XG5cdH1cblx0dmFyIHZ2ID0gXCJcIiwgbXl2LCBvc3RyO1xuXHRpZihuc3RyLmxlbmd0aCA+IDApIHtcblx0XHRpZihuc3RyLmNoYXJDb2RlQXQoMCkgPT0gNDApIC8qICcoJyAqLyB7XG5cdFx0XHRteXYgPSAodjwwJiZuc3RyLmNoYXJDb2RlQXQoMCkgPT09IDQ1ID8gLXYgOiB2KTtcblx0XHRcdG9zdHIgPSB3cml0ZV9udW0oJ24nLCBuc3RyLCBteXYpO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRteXYgPSAodjwwICYmIGZsZW4gPiAxID8gLXYgOiB2KTtcblx0XHRcdG9zdHIgPSB3cml0ZV9udW0oJ24nLCBuc3RyLCBteXYpO1xuXHRcdFx0aWYobXl2IDwgMCAmJiBvdXRbMF0gJiYgb3V0WzBdLnQgPT0gJ3QnKSB7XG5cdFx0XHRcdG9zdHIgPSBvc3RyLnN1YnN0cigxKTtcblx0XHRcdFx0b3V0WzBdLnYgPSBcIi1cIiArIG91dFswXS52O1xuXHRcdFx0fVxuXHRcdH1cblx0XHRqaj1vc3RyLmxlbmd0aC0xO1xuXHRcdHZhciBkZWNwdCA9IG91dC5sZW5ndGg7XG5cdFx0Zm9yKGk9MDsgaSA8IG91dC5sZW5ndGg7ICsraSkgaWYob3V0W2ldICE9IG51bGwgJiYgb3V0W2ldLnQgIT0gJ3QnICYmIG91dFtpXS52LmluZGV4T2YoXCIuXCIpID4gLTEpIHsgZGVjcHQgPSBpOyBicmVhazsgfVxuXHRcdHZhciBsYXN0aT1vdXQubGVuZ3RoO1xuXHRcdGlmKGRlY3B0ID09PSBvdXQubGVuZ3RoICYmIG9zdHIuaW5kZXhPZihcIkVcIikgPT09IC0xKSB7XG5cdFx0XHRmb3IoaT1vdXQubGVuZ3RoLTE7IGk+PSAwOy0taSkge1xuXHRcdFx0XHRpZihvdXRbaV0gPT0gbnVsbCB8fCAnbj8nLmluZGV4T2Yob3V0W2ldLnQpID09PSAtMSkgY29udGludWU7XG5cdFx0XHRcdGlmKGpqPj1vdXRbaV0udi5sZW5ndGgtMSkgeyBqaiAtPSBvdXRbaV0udi5sZW5ndGg7IG91dFtpXS52ID0gb3N0ci5zdWJzdHIoamorMSwgb3V0W2ldLnYubGVuZ3RoKTsgfVxuXHRcdFx0XHRlbHNlIGlmKGpqIDwgMCkgb3V0W2ldLnYgPSBcIlwiO1xuXHRcdFx0XHRlbHNlIHsgb3V0W2ldLnYgPSBvc3RyLnN1YnN0cigwLCBqaisxKTsgamogPSAtMTsgfVxuXHRcdFx0XHRvdXRbaV0udCA9ICd0Jztcblx0XHRcdFx0bGFzdGkgPSBpO1xuXHRcdFx0fVxuXHRcdFx0aWYoamo+PTAgJiYgbGFzdGk8b3V0Lmxlbmd0aCkgb3V0W2xhc3RpXS52ID0gb3N0ci5zdWJzdHIoMCxqaisxKSArIG91dFtsYXN0aV0udjtcblx0XHR9XG5cdFx0ZWxzZSBpZihkZWNwdCAhPT0gb3V0Lmxlbmd0aCAmJiBvc3RyLmluZGV4T2YoXCJFXCIpID09PSAtMSkge1xuXHRcdFx0amogPSBvc3RyLmluZGV4T2YoXCIuXCIpLTE7XG5cdFx0XHRmb3IoaT1kZWNwdDsgaT49IDA7IC0taSkge1xuXHRcdFx0XHRpZihvdXRbaV0gPT0gbnVsbCB8fCAnbj8nLmluZGV4T2Yob3V0W2ldLnQpID09PSAtMSkgY29udGludWU7XG5cdFx0XHRcdGo9b3V0W2ldLnYuaW5kZXhPZihcIi5cIik+LTEmJmk9PT1kZWNwdD9vdXRbaV0udi5pbmRleE9mKFwiLlwiKS0xOm91dFtpXS52Lmxlbmd0aC0xO1xuXHRcdFx0XHR2diA9IG91dFtpXS52LnN1YnN0cihqKzEpO1xuXHRcdFx0XHRmb3IoOyBqPj0wOyAtLWopIHtcblx0XHRcdFx0XHRpZihqaj49MCAmJiAob3V0W2ldLnYuY2hhckF0KGopID09PSBcIjBcIiB8fCBvdXRbaV0udi5jaGFyQXQoaikgPT09IFwiI1wiKSkgdnYgPSBvc3RyLmNoYXJBdChqai0tKSArIHZ2O1xuXHRcdFx0XHR9XG5cdFx0XHRcdG91dFtpXS52ID0gdnY7XG5cdFx0XHRcdG91dFtpXS50ID0gJ3QnO1xuXHRcdFx0XHRsYXN0aSA9IGk7XG5cdFx0XHR9XG5cdFx0XHRpZihqaj49MCAmJiBsYXN0aTxvdXQubGVuZ3RoKSBvdXRbbGFzdGldLnYgPSBvc3RyLnN1YnN0cigwLGpqKzEpICsgb3V0W2xhc3RpXS52O1xuXHRcdFx0amogPSBvc3RyLmluZGV4T2YoXCIuXCIpKzE7XG5cdFx0XHRmb3IoaT1kZWNwdDsgaTxvdXQubGVuZ3RoOyArK2kpIHtcblx0XHRcdFx0aWYob3V0W2ldID09IG51bGwgfHwgKCduPygnLmluZGV4T2Yob3V0W2ldLnQpID09PSAtMSAmJiBpICE9PSBkZWNwdCkpIGNvbnRpbnVlO1xuXHRcdFx0XHRqPW91dFtpXS52LmluZGV4T2YoXCIuXCIpPi0xJiZpPT09ZGVjcHQ/b3V0W2ldLnYuaW5kZXhPZihcIi5cIikrMTowO1xuXHRcdFx0XHR2diA9IG91dFtpXS52LnN1YnN0cigwLGopO1xuXHRcdFx0XHRmb3IoOyBqPG91dFtpXS52Lmxlbmd0aDsgKytqKSB7XG5cdFx0XHRcdFx0aWYoamo8b3N0ci5sZW5ndGgpIHZ2ICs9IG9zdHIuY2hhckF0KGpqKyspO1xuXHRcdFx0XHR9XG5cdFx0XHRcdG91dFtpXS52ID0gdnY7XG5cdFx0XHRcdG91dFtpXS50ID0gJ3QnO1xuXHRcdFx0XHRsYXN0aSA9IGk7XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cdGZvcihpPTA7IGk8b3V0Lmxlbmd0aDsgKytpKSBpZihvdXRbaV0gIT0gbnVsbCAmJiAnbj8nLmluZGV4T2Yob3V0W2ldLnQpPi0xKSB7XG5cdFx0bXl2ID0gKGZsZW4gPjEgJiYgdiA8IDAgJiYgaT4wICYmIG91dFtpLTFdLnYgPT09IFwiLVwiID8gLXY6dik7XG5cdFx0b3V0W2ldLnYgPSB3cml0ZV9udW0ob3V0W2ldLnQsIG91dFtpXS52LCBteXYpO1xuXHRcdG91dFtpXS50ID0gJ3QnO1xuXHR9XG5cdHZhciByZXR2YWwgPSBcIlwiO1xuXHRmb3IoaT0wOyBpICE9PSBvdXQubGVuZ3RoOyArK2kpIGlmKG91dFtpXSAhPSBudWxsKSByZXR2YWwgKz0gb3V0W2ldLnY7XG5cdHJldHVybiByZXR2YWw7XG59XG5TU0YuX2V2YWwgPSBldmFsX2ZtdDtcbnZhciBjZnJlZ2V4ID0gL1xcW1s9PD5dLztcbnZhciBjZnJlZ2V4MiA9IC9cXFsoPXw+Wz1dP3w8Wz49XT8pKC0/XFxkKyg/OlxcLlxcZCopPylcXF0vO1xuZnVuY3Rpb24gY2hrY29uZCh2LCBycikge1xuXHRpZihyciA9PSBudWxsKSByZXR1cm4gZmFsc2U7XG5cdHZhciB0aHJlc2ggPSBwYXJzZUZsb2F0KHJyWzJdKTtcblx0c3dpdGNoKHJyWzFdKSB7XG5cdFx0Y2FzZSBcIj1cIjogIGlmKHYgPT0gdGhyZXNoKSByZXR1cm4gdHJ1ZTsgYnJlYWs7XG5cdFx0Y2FzZSBcIj5cIjogIGlmKHYgPiAgdGhyZXNoKSByZXR1cm4gdHJ1ZTsgYnJlYWs7XG5cdFx0Y2FzZSBcIjxcIjogIGlmKHYgPCAgdGhyZXNoKSByZXR1cm4gdHJ1ZTsgYnJlYWs7XG5cdFx0Y2FzZSBcIjw+XCI6IGlmKHYgIT0gdGhyZXNoKSByZXR1cm4gdHJ1ZTsgYnJlYWs7XG5cdFx0Y2FzZSBcIj49XCI6IGlmKHYgPj0gdGhyZXNoKSByZXR1cm4gdHJ1ZTsgYnJlYWs7XG5cdFx0Y2FzZSBcIjw9XCI6IGlmKHYgPD0gdGhyZXNoKSByZXR1cm4gdHJ1ZTsgYnJlYWs7XG5cdH1cblx0cmV0dXJuIGZhbHNlO1xufVxuZnVuY3Rpb24gY2hvb3NlX2ZtdChmLCB2KSB7XG5cdHZhciBmbXQgPSBzcGxpdF9mbXQoZik7XG5cdHZhciBsID0gZm10Lmxlbmd0aCwgbGF0ID0gZm10W2wtMV0uaW5kZXhPZihcIkBcIik7XG5cdGlmKGw8NCAmJiBsYXQ+LTEpIC0tbDtcblx0aWYoZm10Lmxlbmd0aCA+IDQpIHRocm93IG5ldyBFcnJvcihcImNhbm5vdCBmaW5kIHJpZ2h0IGZvcm1hdCBmb3IgfFwiICsgZm10LmpvaW4oXCJ8XCIpICsgXCJ8XCIpO1xuXHRpZih0eXBlb2YgdiAhPT0gXCJudW1iZXJcIikgcmV0dXJuIFs0LCBmbXQubGVuZ3RoID09PSA0IHx8IGxhdD4tMT9mbXRbZm10Lmxlbmd0aC0xXTpcIkBcIl07XG5cdHN3aXRjaChmbXQubGVuZ3RoKSB7XG5cdFx0Y2FzZSAxOiBmbXQgPSBsYXQ+LTEgPyBbXCJHZW5lcmFsXCIsIFwiR2VuZXJhbFwiLCBcIkdlbmVyYWxcIiwgZm10WzBdXSA6IFtmbXRbMF0sIGZtdFswXSwgZm10WzBdLCBcIkBcIl07IGJyZWFrO1xuXHRcdGNhc2UgMjogZm10ID0gbGF0Pi0xID8gW2ZtdFswXSwgZm10WzBdLCBmbXRbMF0sIGZtdFsxXV0gOiBbZm10WzBdLCBmbXRbMV0sIGZtdFswXSwgXCJAXCJdOyBicmVhaztcblx0XHRjYXNlIDM6IGZtdCA9IGxhdD4tMSA/IFtmbXRbMF0sIGZtdFsxXSwgZm10WzBdLCBmbXRbMl1dIDogW2ZtdFswXSwgZm10WzFdLCBmbXRbMl0sIFwiQFwiXTsgYnJlYWs7XG5cdFx0Y2FzZSA0OiBicmVhaztcblx0fVxuXHR2YXIgZmYgPSB2ID4gMCA/IGZtdFswXSA6IHYgPCAwID8gZm10WzFdIDogZm10WzJdO1xuXHRpZihmbXRbMF0uaW5kZXhPZihcIltcIikgPT09IC0xICYmIGZtdFsxXS5pbmRleE9mKFwiW1wiKSA9PT0gLTEpIHJldHVybiBbbCwgZmZdO1xuXHRpZihmbXRbMF0ubWF0Y2goY2ZyZWdleCkgIT0gbnVsbCB8fCBmbXRbMV0ubWF0Y2goY2ZyZWdleCkgIT0gbnVsbCkge1xuXHRcdHZhciBtMSA9IGZtdFswXS5tYXRjaChjZnJlZ2V4Mik7XG5cdFx0dmFyIG0yID0gZm10WzFdLm1hdGNoKGNmcmVnZXgyKTtcblx0XHRyZXR1cm4gY2hrY29uZCh2LCBtMSkgPyBbbCwgZm10WzBdXSA6IGNoa2NvbmQodiwgbTIpID8gW2wsIGZtdFsxXV0gOiBbbCwgZm10W20xICE9IG51bGwgJiYgbTIgIT0gbnVsbCA/IDIgOiAxXV07XG5cdH1cblx0cmV0dXJuIFtsLCBmZl07XG59XG5mdW5jdGlvbiBmb3JtYXQoZm10LHYsbykge1xuXHRpZihvID09IG51bGwpIG8gPSB7fTtcblx0dmFyIHNmbXQgPSBcIlwiO1xuXHRzd2l0Y2godHlwZW9mIGZtdCkge1xuXHRcdGNhc2UgXCJzdHJpbmdcIjpcblx0XHRcdGlmKGZtdCA9PSBcIm0vZC95eVwiICYmIG8uZGF0ZU5GKSBzZm10ID0gby5kYXRlTkY7XG5cdFx0XHRlbHNlIHNmbXQgPSBmbXQ7XG5cdFx0XHRicmVhaztcblx0XHRjYXNlIFwibnVtYmVyXCI6XG5cdFx0XHRpZihmbXQgPT0gMTQgJiYgby5kYXRlTkYpIHNmbXQgPSBvLmRhdGVORjtcblx0XHRcdGVsc2Ugc2ZtdCA9IChvLnRhYmxlICE9IG51bGwgPyAoby50YWJsZSkgOiB0YWJsZV9mbXQpW2ZtdF07XG5cdFx0XHRpZihzZm10ID09IG51bGwpIHNmbXQgPSAoby50YWJsZSAmJiBvLnRhYmxlW2RlZmF1bHRfbWFwW2ZtdF1dKSB8fCB0YWJsZV9mbXRbZGVmYXVsdF9tYXBbZm10XV07XG5cdFx0XHRpZihzZm10ID09IG51bGwpIHNmbXQgPSBkZWZhdWx0X3N0cltmbXRdIHx8IFwiR2VuZXJhbFwiO1xuXHRcdFx0YnJlYWs7XG5cdH1cblx0aWYoaXNnZW5lcmFsKHNmbXQsMCkpIHJldHVybiBnZW5lcmFsX2ZtdCh2LCBvKTtcblx0aWYodiBpbnN0YW5jZW9mIERhdGUpIHYgPSBkYXRlbnVtX2xvY2FsKHYsIG8uZGF0ZTE5MDQpO1xuXHR2YXIgZiA9IGNob29zZV9mbXQoc2ZtdCwgdik7XG5cdGlmKGlzZ2VuZXJhbChmWzFdKSkgcmV0dXJuIGdlbmVyYWxfZm10KHYsIG8pO1xuXHRpZih2ID09PSB0cnVlKSB2ID0gXCJUUlVFXCI7IGVsc2UgaWYodiA9PT0gZmFsc2UpIHYgPSBcIkZBTFNFXCI7XG5cdGVsc2UgaWYodiA9PT0gXCJcIiB8fCB2ID09IG51bGwpIHJldHVybiBcIlwiO1xuXHRyZXR1cm4gZXZhbF9mbXQoZlsxXSwgdiwgbywgZlswXSk7XG59XG5mdW5jdGlvbiBsb2FkX2VudHJ5KGZtdCwgaWR4KSB7XG5cdGlmKHR5cGVvZiBpZHggIT0gJ251bWJlcicpIHtcblx0XHRpZHggPSAraWR4IHx8IC0xO1xuZm9yKHZhciBpID0gMDsgaSA8IDB4MDE4ODsgKytpKSB7XG5pZih0YWJsZV9mbXRbaV0gPT0gdW5kZWZpbmVkKSB7IGlmKGlkeCA8IDApIGlkeCA9IGk7IGNvbnRpbnVlOyB9XG5cdFx0XHRpZih0YWJsZV9mbXRbaV0gPT0gZm10KSB7IGlkeCA9IGk7IGJyZWFrOyB9XG5cdFx0fVxuaWYoaWR4IDwgMCkgaWR4ID0gMHgxODc7XG5cdH1cbnRhYmxlX2ZtdFtpZHhdID0gZm10O1xuXHRyZXR1cm4gaWR4O1xufVxuU1NGLmxvYWQgPSBsb2FkX2VudHJ5O1xuU1NGLl90YWJsZSA9IHRhYmxlX2ZtdDtcblNTRi5nZXRfdGFibGUgPSBmdW5jdGlvbiBnZXRfdGFibGUoKSB7IHJldHVybiB0YWJsZV9mbXQ7IH07XG5TU0YubG9hZF90YWJsZSA9IGZ1bmN0aW9uIGxvYWRfdGFibGUodGJsKSB7XG5cdGZvcih2YXIgaT0wOyBpIT0weDAxODg7ICsraSlcblx0XHRpZih0YmxbaV0gIT09IHVuZGVmaW5lZCkgbG9hZF9lbnRyeSh0YmxbaV0sIGkpO1xufTtcblNTRi5pbml0X3RhYmxlID0gaW5pdF90YWJsZTtcblNTRi5mb3JtYXQgPSBmb3JtYXQ7XG59O1xubWFrZV9zc2YoU1NGKTtcbi8qIG1hcCBmcm9tIHhsbWwgbmFtZWQgZm9ybWF0cyB0byBTU0YgVE9ETzogbG9jYWxpemUgKi9cbnZhciBYTE1MRm9ybWF0TWFwLyp7W3N0cmluZ106c3RyaW5nfSovID0gKHtcblx0XCJHZW5lcmFsIE51bWJlclwiOiBcIkdlbmVyYWxcIixcblx0XCJHZW5lcmFsIERhdGVcIjogU1NGLl90YWJsZVsyMl0sXG5cdFwiTG9uZyBEYXRlXCI6IFwiZGRkZCwgbW1tbSBkZCwgeXl5eVwiLFxuXHRcIk1lZGl1bSBEYXRlXCI6IFNTRi5fdGFibGVbMTVdLFxuXHRcIlNob3J0IERhdGVcIjogU1NGLl90YWJsZVsxNF0sXG5cdFwiTG9uZyBUaW1lXCI6IFNTRi5fdGFibGVbMTldLFxuXHRcIk1lZGl1bSBUaW1lXCI6IFNTRi5fdGFibGVbMThdLFxuXHRcIlNob3J0IFRpbWVcIjogU1NGLl90YWJsZVsyMF0sXG5cdFwiQ3VycmVuY3lcIjogJ1wiJFwiIywjIzAuMDBfKTtbUmVkXVxcXFwoXCIkXCIjLCMjMC4wMFxcXFwpJyxcblx0XCJGaXhlZFwiOiBTU0YuX3RhYmxlWzJdLFxuXHRcIlN0YW5kYXJkXCI6IFNTRi5fdGFibGVbNF0sXG5cdFwiUGVyY2VudFwiOiBTU0YuX3RhYmxlWzEwXSxcblx0XCJTY2llbnRpZmljXCI6IFNTRi5fdGFibGVbMTFdLFxuXHRcIlllcy9Ob1wiOiAnXCJZZXNcIjtcIlllc1wiO1wiTm9cIjtAJyxcblx0XCJUcnVlL0ZhbHNlXCI6ICdcIlRydWVcIjtcIlRydWVcIjtcIkZhbHNlXCI7QCcsXG5cdFwiT24vT2ZmXCI6ICdcIlllc1wiO1wiWWVzXCI7XCJOb1wiO0AnXG59KTtcblxudmFyIFNTRkltcGxpY2l0Lyp7W251bWJlcl06c3RyaW5nfSovID0gKHtcblx0XCI1XCI6ICdcIiRcIiMsIyMwXyk7XFxcXChcIiRcIiMsIyMwXFxcXCknLFxuXHRcIjZcIjogJ1wiJFwiIywjIzBfKTtbUmVkXVxcXFwoXCIkXCIjLCMjMFxcXFwpJyxcblx0XCI3XCI6ICdcIiRcIiMsIyMwLjAwXyk7XFxcXChcIiRcIiMsIyMwLjAwXFxcXCknLFxuXHRcIjhcIjogJ1wiJFwiIywjIzAuMDBfKTtbUmVkXVxcXFwoXCIkXCIjLCMjMC4wMFxcXFwpJyxcblx0XCIyM1wiOiAnR2VuZXJhbCcsIFwiMjRcIjogJ0dlbmVyYWwnLCBcIjI1XCI6ICdHZW5lcmFsJywgXCIyNlwiOiAnR2VuZXJhbCcsXG5cdFwiMjdcIjogJ20vZC95eScsIFwiMjhcIjogJ20vZC95eScsIFwiMjlcIjogJ20vZC95eScsIFwiMzBcIjogJ20vZC95eScsIFwiMzFcIjogJ20vZC95eScsXG5cdFwiMzJcIjogJ2g6bW06c3MnLCBcIjMzXCI6ICdoOm1tOnNzJywgXCIzNFwiOiAnaDptbTpzcycsIFwiMzVcIjogJ2g6bW06c3MnLFxuXHRcIjM2XCI6ICdtL2QveXknLFxuXHRcIjQxXCI6ICdfKCogIywjIzBfKTtfKCogXFwoIywjIzBcXCk7XygqIFwiLVwiXyk7XyhAXyknLFxuXHRcIjQyXCI6ICdfKFwiJFwiKiAjLCMjMF8pO18oXCIkXCIqIFxcKCMsIyMwXFwpO18oXCIkXCIqIFwiLVwiXyk7XyhAXyknLFxuXHRcIjQzXCI6ICdfKCogIywjIzAuMDBfKTtfKCogXFwoIywjIzAuMDBcXCk7XygqIFwiLVwiPz9fKTtfKEBfKScsXG5cdFwiNDRcIjogJ18oXCIkXCIqICMsIyMwLjAwXyk7XyhcIiRcIiogXFwoIywjIzAuMDBcXCk7XyhcIiRcIiogXCItXCI/P18pO18oQF8pJyxcblx0XCI1MFwiOiAnbS9kL3l5JywgXCI1MVwiOiAnbS9kL3l5JywgXCI1MlwiOiAnbS9kL3l5JywgXCI1M1wiOiAnbS9kL3l5JywgXCI1NFwiOiAnbS9kL3l5Jyxcblx0XCI1NVwiOiAnbS9kL3l5JywgXCI1NlwiOiAnbS9kL3l5JywgXCI1N1wiOiAnbS9kL3l5JywgXCI1OFwiOiAnbS9kL3l5Jyxcblx0XCI1OVwiOiAnMCcsXG5cdFwiNjBcIjogJzAuMDAnLFxuXHRcIjYxXCI6ICcjLCMjMCcsXG5cdFwiNjJcIjogJyMsIyMwLjAwJyxcblx0XCI2M1wiOiAnXCIkXCIjLCMjMF8pO1xcXFwoXCIkXCIjLCMjMFxcXFwpJyxcblx0XCI2NFwiOiAnXCIkXCIjLCMjMF8pO1tSZWRdXFxcXChcIiRcIiMsIyMwXFxcXCknLFxuXHRcIjY1XCI6ICdcIiRcIiMsIyMwLjAwXyk7XFxcXChcIiRcIiMsIyMwLjAwXFxcXCknLFxuXHRcIjY2XCI6ICdcIiRcIiMsIyMwLjAwXyk7W1JlZF1cXFxcKFwiJFwiIywjIzAuMDBcXFxcKScsXG5cdFwiNjdcIjogJzAlJyxcblx0XCI2OFwiOiAnMC4wMCUnLFxuXHRcIjY5XCI6ICcjID8vPycsXG5cdFwiNzBcIjogJyMgPz8vPz8nLFxuXHRcIjcxXCI6ICdtL2QveXknLFxuXHRcIjcyXCI6ICdtL2QveXknLFxuXHRcIjczXCI6ICdkLW1tbS15eScsXG5cdFwiNzRcIjogJ2QtbW1tJyxcblx0XCI3NVwiOiAnbW1tLXl5Jyxcblx0XCI3NlwiOiAnaDptbScsXG5cdFwiNzdcIjogJ2g6bW06c3MnLFxuXHRcIjc4XCI6ICdtL2QveXkgaDptbScsXG5cdFwiNzlcIjogJ21tOnNzJyxcblx0XCI4MFwiOiAnW2hdOm1tOnNzJyxcblx0XCI4MVwiOiAnbW1zcy4wJ1xufSk7XG5cbi8qIGRhdGVORiBwYXJzZSBUT0RPOiBtb3ZlIHRvIFNTRiAqL1xudmFyIGRhdGVORnJlZ2V4ID0gL1tkRF0rfFttTV0rfFt5WWVFXSt8W0hoXSt8W1NzXSsvZztcbmZ1bmN0aW9uIGRhdGVORl9yZWdleChkYXRlTkYpIHtcblx0dmFyIGZtdCA9IHR5cGVvZiBkYXRlTkYgPT0gXCJudW1iZXJcIiA/IFNTRi5fdGFibGVbZGF0ZU5GXSA6IGRhdGVORjtcblx0Zm10ID0gZm10LnJlcGxhY2UoZGF0ZU5GcmVnZXgsIFwiKFxcXFxkKylcIik7XG5cdHJldHVybiBuZXcgUmVnRXhwKFwiXlwiICsgZm10ICsgXCIkXCIpO1xufVxuZnVuY3Rpb24gZGF0ZU5GX2ZpeChzdHIsIGRhdGVORiwgbWF0Y2gpIHtcblx0dmFyIFkgPSAtMSwgbSA9IC0xLCBkID0gLTEsIEggPSAtMSwgTSA9IC0xLCBTID0gLTE7XG5cdChkYXRlTkYubWF0Y2goZGF0ZU5GcmVnZXgpfHxbXSkuZm9yRWFjaChmdW5jdGlvbihuLCBpKSB7XG5cdFx0dmFyIHYgPSBwYXJzZUludChtYXRjaFtpKzFdLCAxMCk7XG5cdFx0c3dpdGNoKG4udG9Mb3dlckNhc2UoKS5jaGFyQXQoMCkpIHtcblx0XHRcdGNhc2UgJ3knOiBZID0gdjsgYnJlYWs7IGNhc2UgJ2QnOiBkID0gdjsgYnJlYWs7XG5cdFx0XHRjYXNlICdoJzogSCA9IHY7IGJyZWFrOyBjYXNlICdzJzogUyA9IHY7IGJyZWFrO1xuXHRcdFx0Y2FzZSAnbSc6IGlmKEggPj0gMCkgTSA9IHY7IGVsc2UgbSA9IHY7IGJyZWFrO1xuXHRcdH1cblx0fSk7XG5cdGlmKFMgPj0gMCAmJiBNID09IC0xICYmIG0gPj0gMCkgeyBNID0gbTsgbSA9IC0xOyB9XG5cdHZhciBkYXRlc3RyID0gKChcIlwiICsgKFk+PTA/WTogbmV3IERhdGUoKS5nZXRGdWxsWWVhcigpKSkuc2xpY2UoLTQpICsgXCItXCIgKyAoXCIwMFwiICsgKG0+PTE/bToxKSkuc2xpY2UoLTIpICsgXCItXCIgKyAoXCIwMFwiICsgKGQ+PTE/ZDoxKSkuc2xpY2UoLTIpKTtcblx0aWYoZGF0ZXN0ci5sZW5ndGggPT0gNykgZGF0ZXN0ciA9IFwiMFwiICsgZGF0ZXN0cjtcblx0aWYoZGF0ZXN0ci5sZW5ndGggPT0gOCkgZGF0ZXN0ciA9IFwiMjBcIiArIGRhdGVzdHI7XG5cdHZhciB0aW1lc3RyID0gKChcIjAwXCIgKyAoSD49MD9IOjApKS5zbGljZSgtMikgKyBcIjpcIiArIChcIjAwXCIgKyAoTT49MD9NOjApKS5zbGljZSgtMikgKyBcIjpcIiArIChcIjAwXCIgKyAoUz49MD9TOjApKS5zbGljZSgtMikpO1xuXHRpZihIID09IC0xICYmIE0gPT0gLTEgJiYgUyA9PSAtMSkgcmV0dXJuIGRhdGVzdHI7XG5cdGlmKFkgPT0gLTEgJiYgbSA9PSAtMSAmJiBkID09IC0xKSByZXR1cm4gdGltZXN0cjtcblx0cmV0dXJuIGRhdGVzdHIgKyBcIlRcIiArIHRpbWVzdHI7XG59XG5cbnZhciBET19OT1RfRVhQT1JUX0NGQiA9IHRydWU7XG4vKiBjZmIuanMgKEMpIDIwMTMtcHJlc2VudCBTaGVldEpTIC0tIGh0dHA6Ly9zaGVldGpzLmNvbSAqL1xuLyogdmltOiBzZXQgdHM9MjogKi9cbi8qanNoaW50IGVxbnVsbDp0cnVlICovXG4vKmV4cG9ydGVkIENGQiAqL1xuLypnbG9iYWwgVWludDhBcnJheTpmYWxzZSwgVWludDE2QXJyYXk6ZmFsc2UgKi9cblxuLyogY3JjMzIuanMgKEMpIDIwMTQtcHJlc2VudCBTaGVldEpTIC0tIGh0dHA6Ly9zaGVldGpzLmNvbSAqL1xuLyogdmltOiBzZXQgdHM9MjogKi9cbi8qZXhwb3J0ZWQgQ1JDMzIgKi9cbnZhciBDUkMzMjtcbihmdW5jdGlvbiAoZmFjdG9yeSkge1xuXHQvKmpzaGludCBpZ25vcmU6c3RhcnQgKi9cblx0Lyplc2xpbnQtZGlzYWJsZSAqL1xuXHRmYWN0b3J5KENSQzMyID0ge30pO1xuXHQvKmVzbGludC1lbmFibGUgKi9cblx0Lypqc2hpbnQgaWdub3JlOmVuZCAqL1xufShmdW5jdGlvbihDUkMzMikge1xuQ1JDMzIudmVyc2lvbiA9ICcxLjIuMCc7XG4vKiBzZWUgcGVyZi9jcmMzMnRhYmxlLmpzICovXG4vKmdsb2JhbCBJbnQzMkFycmF5ICovXG5mdW5jdGlvbiBzaWduZWRfY3JjX3RhYmxlKCkge1xuXHR2YXIgYyA9IDAsIHRhYmxlID0gbmV3IEFycmF5KDI1Nik7XG5cblx0Zm9yKHZhciBuID0wOyBuICE9IDI1NjsgKytuKXtcblx0XHRjID0gbjtcblx0XHRjID0gKChjJjEpID8gKC0zMDY2NzQ5MTIgXiAoYyA+Pj4gMSkpIDogKGMgPj4+IDEpKTtcblx0XHRjID0gKChjJjEpID8gKC0zMDY2NzQ5MTIgXiAoYyA+Pj4gMSkpIDogKGMgPj4+IDEpKTtcblx0XHRjID0gKChjJjEpID8gKC0zMDY2NzQ5MTIgXiAoYyA+Pj4gMSkpIDogKGMgPj4+IDEpKTtcblx0XHRjID0gKChjJjEpID8gKC0zMDY2NzQ5MTIgXiAoYyA+Pj4gMSkpIDogKGMgPj4+IDEpKTtcblx0XHRjID0gKChjJjEpID8gKC0zMDY2NzQ5MTIgXiAoYyA+Pj4gMSkpIDogKGMgPj4+IDEpKTtcblx0XHRjID0gKChjJjEpID8gKC0zMDY2NzQ5MTIgXiAoYyA+Pj4gMSkpIDogKGMgPj4+IDEpKTtcblx0XHRjID0gKChjJjEpID8gKC0zMDY2NzQ5MTIgXiAoYyA+Pj4gMSkpIDogKGMgPj4+IDEpKTtcblx0XHRjID0gKChjJjEpID8gKC0zMDY2NzQ5MTIgXiAoYyA+Pj4gMSkpIDogKGMgPj4+IDEpKTtcblx0XHR0YWJsZVtuXSA9IGM7XG5cdH1cblxuXHRyZXR1cm4gdHlwZW9mIEludDMyQXJyYXkgIT09ICd1bmRlZmluZWQnID8gbmV3IEludDMyQXJyYXkodGFibGUpIDogdGFibGU7XG59XG5cbnZhciBUID0gc2lnbmVkX2NyY190YWJsZSgpO1xuZnVuY3Rpb24gY3JjMzJfYnN0cihic3RyLCBzZWVkKSB7XG5cdHZhciBDID0gc2VlZCBeIC0xLCBMID0gYnN0ci5sZW5ndGggLSAxO1xuXHRmb3IodmFyIGkgPSAwOyBpIDwgTDspIHtcblx0XHRDID0gKEM+Pj44KSBeIFRbKENeYnN0ci5jaGFyQ29kZUF0KGkrKykpJjB4RkZdO1xuXHRcdEMgPSAoQz4+PjgpIF4gVFsoQ15ic3RyLmNoYXJDb2RlQXQoaSsrKSkmMHhGRl07XG5cdH1cblx0aWYoaSA9PT0gTCkgQyA9IChDPj4+OCkgXiBUWyhDIF4gYnN0ci5jaGFyQ29kZUF0KGkpKSYweEZGXTtcblx0cmV0dXJuIEMgXiAtMTtcbn1cblxuZnVuY3Rpb24gY3JjMzJfYnVmKGJ1Ziwgc2VlZCkge1xuXHRpZihidWYubGVuZ3RoID4gMTAwMDApIHJldHVybiBjcmMzMl9idWZfOChidWYsIHNlZWQpO1xuXHR2YXIgQyA9IHNlZWQgXiAtMSwgTCA9IGJ1Zi5sZW5ndGggLSAzO1xuXHRmb3IodmFyIGkgPSAwOyBpIDwgTDspIHtcblx0XHRDID0gKEM+Pj44KSBeIFRbKENeYnVmW2krK10pJjB4RkZdO1xuXHRcdEMgPSAoQz4+PjgpIF4gVFsoQ15idWZbaSsrXSkmMHhGRl07XG5cdFx0QyA9IChDPj4+OCkgXiBUWyhDXmJ1ZltpKytdKSYweEZGXTtcblx0XHRDID0gKEM+Pj44KSBeIFRbKENeYnVmW2krK10pJjB4RkZdO1xuXHR9XG5cdHdoaWxlKGkgPCBMKzMpIEMgPSAoQz4+PjgpIF4gVFsoQ15idWZbaSsrXSkmMHhGRl07XG5cdHJldHVybiBDIF4gLTE7XG59XG5cbmZ1bmN0aW9uIGNyYzMyX2J1Zl84KGJ1Ziwgc2VlZCkge1xuXHR2YXIgQyA9IHNlZWQgXiAtMSwgTCA9IGJ1Zi5sZW5ndGggLSA3O1xuXHRmb3IodmFyIGkgPSAwOyBpIDwgTDspIHtcblx0XHRDID0gKEM+Pj44KSBeIFRbKENeYnVmW2krK10pJjB4RkZdO1xuXHRcdEMgPSAoQz4+PjgpIF4gVFsoQ15idWZbaSsrXSkmMHhGRl07XG5cdFx0QyA9IChDPj4+OCkgXiBUWyhDXmJ1ZltpKytdKSYweEZGXTtcblx0XHRDID0gKEM+Pj44KSBeIFRbKENeYnVmW2krK10pJjB4RkZdO1xuXHRcdEMgPSAoQz4+PjgpIF4gVFsoQ15idWZbaSsrXSkmMHhGRl07XG5cdFx0QyA9IChDPj4+OCkgXiBUWyhDXmJ1ZltpKytdKSYweEZGXTtcblx0XHRDID0gKEM+Pj44KSBeIFRbKENeYnVmW2krK10pJjB4RkZdO1xuXHRcdEMgPSAoQz4+PjgpIF4gVFsoQ15idWZbaSsrXSkmMHhGRl07XG5cdH1cblx0d2hpbGUoaSA8IEwrNykgQyA9IChDPj4+OCkgXiBUWyhDXmJ1ZltpKytdKSYweEZGXTtcblx0cmV0dXJuIEMgXiAtMTtcbn1cblxuZnVuY3Rpb24gY3JjMzJfc3RyKHN0ciwgc2VlZCkge1xuXHR2YXIgQyA9IHNlZWQgXiAtMTtcblx0Zm9yKHZhciBpID0gMCwgTD1zdHIubGVuZ3RoLCBjLCBkOyBpIDwgTDspIHtcblx0XHRjID0gc3RyLmNoYXJDb2RlQXQoaSsrKTtcblx0XHRpZihjIDwgMHg4MCkge1xuXHRcdFx0QyA9IChDPj4+OCkgXiBUWyhDIF4gYykmMHhGRl07XG5cdFx0fSBlbHNlIGlmKGMgPCAweDgwMCkge1xuXHRcdFx0QyA9IChDPj4+OCkgXiBUWyhDIF4gKDE5MnwoKGM+PjYpJjMxKSkpJjB4RkZdO1xuXHRcdFx0QyA9IChDPj4+OCkgXiBUWyhDIF4gKDEyOHwoYyY2MykpKSYweEZGXTtcblx0XHR9IGVsc2UgaWYoYyA+PSAweEQ4MDAgJiYgYyA8IDB4RTAwMCkge1xuXHRcdFx0YyA9IChjJjEwMjMpKzY0OyBkID0gc3RyLmNoYXJDb2RlQXQoaSsrKSYxMDIzO1xuXHRcdFx0QyA9IChDPj4+OCkgXiBUWyhDIF4gKDI0MHwoKGM+PjgpJjcpKSkmMHhGRl07XG5cdFx0XHRDID0gKEM+Pj44KSBeIFRbKEMgXiAoMTI4fCgoYz4+MikmNjMpKSkmMHhGRl07XG5cdFx0XHRDID0gKEM+Pj44KSBeIFRbKEMgXiAoMTI4fCgoZD4+NikmMTUpfCgoYyYzKTw8NCkpKSYweEZGXTtcblx0XHRcdEMgPSAoQz4+PjgpIF4gVFsoQyBeICgxMjh8KGQmNjMpKSkmMHhGRl07XG5cdFx0fSBlbHNlIHtcblx0XHRcdEMgPSAoQz4+PjgpIF4gVFsoQyBeICgyMjR8KChjPj4xMikmMTUpKSkmMHhGRl07XG5cdFx0XHRDID0gKEM+Pj44KSBeIFRbKEMgXiAoMTI4fCgoYz4+NikmNjMpKSkmMHhGRl07XG5cdFx0XHRDID0gKEM+Pj44KSBeIFRbKEMgXiAoMTI4fChjJjYzKSkpJjB4RkZdO1xuXHRcdH1cblx0fVxuXHRyZXR1cm4gQyBeIC0xO1xufVxuQ1JDMzIudGFibGUgPSBUO1xuQ1JDMzIuYnN0ciA9IGNyYzMyX2JzdHI7XG5DUkMzMi5idWYgPSBjcmMzMl9idWY7XG5DUkMzMi5zdHIgPSBjcmMzMl9zdHI7XG59KSk7XG4vKiBbTVMtQ0ZCXSB2MjAxNzEyMDEgKi9cbnZhciBDRkIgPSAoZnVuY3Rpb24gX0NGQigpe1xudmFyIGV4cG9ydHMgPSB7fTtcbmV4cG9ydHMudmVyc2lvbiA9ICcxLjEuNCc7XG4vKiBbTVMtQ0ZCXSAyLjYuNCAqL1xuZnVuY3Rpb24gbmFtZWNtcChsLCByKSB7XG5cdHZhciBMID0gbC5zcGxpdChcIi9cIiksIFIgPSByLnNwbGl0KFwiL1wiKTtcblx0Zm9yKHZhciBpID0gMCwgYyA9IDAsIFogPSBNYXRoLm1pbihMLmxlbmd0aCwgUi5sZW5ndGgpOyBpIDwgWjsgKytpKSB7XG5cdFx0aWYoKGMgPSBMW2ldLmxlbmd0aCAtIFJbaV0ubGVuZ3RoKSkgcmV0dXJuIGM7XG5cdFx0aWYoTFtpXSAhPSBSW2ldKSByZXR1cm4gTFtpXSA8IFJbaV0gPyAtMSA6IDE7XG5cdH1cblx0cmV0dXJuIEwubGVuZ3RoIC0gUi5sZW5ndGg7XG59XG5mdW5jdGlvbiBkaXJuYW1lKHApIHtcblx0aWYocC5jaGFyQXQocC5sZW5ndGggLSAxKSA9PSBcIi9cIikgcmV0dXJuIChwLnNsaWNlKDAsLTEpLmluZGV4T2YoXCIvXCIpID09PSAtMSkgPyBwIDogZGlybmFtZShwLnNsaWNlKDAsIC0xKSk7XG5cdHZhciBjID0gcC5sYXN0SW5kZXhPZihcIi9cIik7XG5cdHJldHVybiAoYyA9PT0gLTEpID8gcCA6IHAuc2xpY2UoMCwgYysxKTtcbn1cblxuZnVuY3Rpb24gZmlsZW5hbWUocCkge1xuXHRpZihwLmNoYXJBdChwLmxlbmd0aCAtIDEpID09IFwiL1wiKSByZXR1cm4gZmlsZW5hbWUocC5zbGljZSgwLCAtMSkpO1xuXHR2YXIgYyA9IHAubGFzdEluZGV4T2YoXCIvXCIpO1xuXHRyZXR1cm4gKGMgPT09IC0xKSA/IHAgOiBwLnNsaWNlKGMrMSk7XG59XG4vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqL1xuLyogRE9TIERhdGUgZm9ybWF0OlxuICAgaGlnaHxZWVlZWVlZbS5tbW1kZGRkZC5ISEhISE1NTS5NTU1TU1NTU3xsb3dcbiAgIGFkZCAxOTgwIHRvIHN0b3JlZCB5ZWFyXG4gICBzdG9yZWQgc2Vjb25kIHNob3VsZCBiZSBkb3VibGVkXG4qL1xuXG4vKiB3cml0ZSBKUyBkYXRlIHRvIGJ1ZiBhcyBhIERPUyBkYXRlICovXG5mdW5jdGlvbiB3cml0ZV9kb3NfZGF0ZShidWYsIGRhdGUpIHtcblx0aWYodHlwZW9mIGRhdGUgPT09IFwic3RyaW5nXCIpIGRhdGUgPSBuZXcgRGF0ZShkYXRlKTtcblx0dmFyIGhtcyA9IGRhdGUuZ2V0SG91cnMoKTtcblx0aG1zID0gaG1zIDw8IDYgfCBkYXRlLmdldE1pbnV0ZXMoKTtcblx0aG1zID0gaG1zIDw8IDUgfCAoZGF0ZS5nZXRTZWNvbmRzKCk+Pj4xKTtcblx0YnVmLndyaXRlX3NoaWZ0KDIsIGhtcyk7XG5cdHZhciB5bWQgPSAoZGF0ZS5nZXRGdWxsWWVhcigpIC0gMTk4MCk7XG5cdHltZCA9IHltZCA8PCA0IHwgKGRhdGUuZ2V0TW9udGgoKSsxKTtcblx0eW1kID0geW1kIDw8IDUgfCBkYXRlLmdldERhdGUoKTtcblx0YnVmLndyaXRlX3NoaWZ0KDIsIHltZCk7XG59XG5cbi8qIHJlYWQgZm91ciBieXRlcyBmcm9tIGJ1ZiBhbmQgaW50ZXJwcmV0IGFzIGEgRE9TIGRhdGUgKi9cbmZ1bmN0aW9uIHBhcnNlX2Rvc19kYXRlKGJ1Zikge1xuXHR2YXIgaG1zID0gYnVmLnJlYWRfc2hpZnQoMikgJiAweEZGRkY7XG5cdHZhciB5bWQgPSBidWYucmVhZF9zaGlmdCgyKSAmIDB4RkZGRjtcblx0dmFyIHZhbCA9IG5ldyBEYXRlKCk7XG5cdHZhciBkID0geW1kICYgMHgxRjsgeW1kID4+Pj0gNTtcblx0dmFyIG0gPSB5bWQgJiAweDBGOyB5bWQgPj4+PSA0O1xuXHR2YWwuc2V0TWlsbGlzZWNvbmRzKDApO1xuXHR2YWwuc2V0RnVsbFllYXIoeW1kICsgMTk4MCk7XG5cdHZhbC5zZXRNb250aChtLTEpO1xuXHR2YWwuc2V0RGF0ZShkKTtcblx0dmFyIFMgPSBobXMgJiAweDFGOyBobXMgPj4+PSA1O1xuXHR2YXIgTSA9IGhtcyAmIDB4M0Y7IGhtcyA+Pj49IDY7XG5cdHZhbC5zZXRIb3VycyhobXMpO1xuXHR2YWwuc2V0TWludXRlcyhNKTtcblx0dmFsLnNldFNlY29uZHMoUzw8MSk7XG5cdHJldHVybiB2YWw7XG59XG5mdW5jdGlvbiBwYXJzZV9leHRyYV9maWVsZChibG9iKSB7XG5cdHByZXBfYmxvYihibG9iLCAwKTtcblx0dmFyIG8gPSB7fTtcblx0dmFyIGZsYWdzID0gMDtcblx0d2hpbGUoYmxvYi5sIDw9IGJsb2IubGVuZ3RoIC0gNCkge1xuXHRcdHZhciB0eXBlID0gYmxvYi5yZWFkX3NoaWZ0KDIpO1xuXHRcdHZhciBzeiA9IGJsb2IucmVhZF9zaGlmdCgyKSwgdGd0ID0gYmxvYi5sICsgc3o7XG5cdFx0dmFyIHAgPSB7fTtcblx0XHRzd2l0Y2godHlwZSkge1xuXHRcdFx0LyogVU5JWC1zdHlsZSBUaW1lc3RhbXBzICovXG5cdFx0XHRjYXNlIDB4NTQ1NToge1xuXHRcdFx0XHRmbGFncyA9IGJsb2IucmVhZF9zaGlmdCgxKTtcblx0XHRcdFx0aWYoZmxhZ3MgJiAxKSBwLm10aW1lID0gYmxvYi5yZWFkX3NoaWZ0KDQpO1xuXHRcdFx0XHQvKiBmb3Igc29tZSByZWFzb24sIENEIGZsYWcgY29ycmVzcG9uZHMgdG8gTEZIICovXG5cdFx0XHRcdGlmKHN6ID4gNSkge1xuXHRcdFx0XHRcdGlmKGZsYWdzICYgMikgcC5hdGltZSA9IGJsb2IucmVhZF9zaGlmdCg0KTtcblx0XHRcdFx0XHRpZihmbGFncyAmIDQpIHAuY3RpbWUgPSBibG9iLnJlYWRfc2hpZnQoNCk7XG5cdFx0XHRcdH1cblx0XHRcdFx0aWYocC5tdGltZSkgcC5tdCA9IG5ldyBEYXRlKHAubXRpbWUqMTAwMCk7XG5cdFx0XHR9XG5cdFx0XHRicmVhaztcblx0XHR9XG5cdFx0YmxvYi5sID0gdGd0O1xuXHRcdG9bdHlwZV0gPSBwO1xuXHR9XG5cdHJldHVybiBvO1xufVxudmFyIGZzO1xuZnVuY3Rpb24gZ2V0X2ZzKCkgeyByZXR1cm4gZnMgfHwgKGZzID0gcmVxdWlyZSgnZnMnKSk7IH1cbmZ1bmN0aW9uIHBhcnNlKGZpbGUsIG9wdGlvbnMpIHtcbmlmKGZpbGVbMF0gPT0gMHg1MCAmJiBmaWxlWzFdID09IDB4NGIpIHJldHVybiBwYXJzZV96aXAoZmlsZSwgb3B0aW9ucyk7XG5pZihmaWxlLmxlbmd0aCA8IDUxMikgdGhyb3cgbmV3IEVycm9yKFwiQ0ZCIGZpbGUgc2l6ZSBcIiArIGZpbGUubGVuZ3RoICsgXCIgPCA1MTJcIik7XG52YXIgbXZlciA9IDM7XG52YXIgc3N6ID0gNTEyO1xudmFyIG5tZnMgPSAwOyAvLyBudW1iZXIgb2YgbWluaSBGQVQgc2VjdG9yc1xudmFyIGRpZmF0X3NlY19jbnQgPSAwO1xudmFyIGRpcl9zdGFydCA9IDA7XG52YXIgbWluaWZhdF9zdGFydCA9IDA7XG52YXIgZGlmYXRfc3RhcnQgPSAwO1xuXG52YXIgZmF0X2FkZHJzID0gW107IC8vIGxvY2F0aW9ucyBvZiBGQVQgc2VjdG9yc1xuXG4vKiBbTVMtQ0ZCXSAyLjIgQ29tcG91bmQgRmlsZSBIZWFkZXIgKi9cbnZhciBibG9iID0gZmlsZS5zbGljZSgwLDUxMik7XG5wcmVwX2Jsb2IoYmxvYiwgMCk7XG5cbi8qIG1ham9yIHZlcnNpb24gKi9cbnZhciBtdiA9IGNoZWNrX2dldF9tdmVyKGJsb2IpO1xubXZlciA9IG12WzBdO1xuc3dpdGNoKG12ZXIpIHtcblx0Y2FzZSAzOiBzc3ogPSA1MTI7IGJyZWFrOyBjYXNlIDQ6IHNzeiA9IDQwOTY7IGJyZWFrO1xuXHRjYXNlIDA6IGlmKG12WzFdID09IDApIHJldHVybiBwYXJzZV96aXAoZmlsZSwgb3B0aW9ucyk7XG5cdC8qIGZhbGxzIHRocm91Z2ggKi9cblx0ZGVmYXVsdDogdGhyb3cgbmV3IEVycm9yKFwiTWFqb3IgVmVyc2lvbjogRXhwZWN0ZWQgMyBvciA0IHNhdyBcIiArIG12ZXIpO1xufVxuXG4vKiByZXByb2Nlc3MgaGVhZGVyICovXG5pZihzc3ogIT09IDUxMikgeyBibG9iID0gZmlsZS5zbGljZSgwLHNzeik7IHByZXBfYmxvYihibG9iLCAyOCAvKiBibG9iLmwgKi8pOyB9XG4vKiBTYXZlIGhlYWRlciBmb3IgZmluYWwgb2JqZWN0ICovXG52YXIgaGVhZGVyID0gZmlsZS5zbGljZSgwLHNzeik7XG5cbmNoZWNrX3NoaWZ0cyhibG9iLCBtdmVyKTtcblxuLy8gTnVtYmVyIG9mIERpcmVjdG9yeSBTZWN0b3JzXG52YXIgZGlyX2NudCA9IGJsb2IucmVhZF9zaGlmdCg0LCAnaScpO1xuaWYobXZlciA9PT0gMyAmJiBkaXJfY250ICE9PSAwKSB0aHJvdyBuZXcgRXJyb3IoJyMgRGlyZWN0b3J5IFNlY3RvcnM6IEV4cGVjdGVkIDAgc2F3ICcgKyBkaXJfY250KTtcblxuLy8gTnVtYmVyIG9mIEZBVCBTZWN0b3JzXG5ibG9iLmwgKz0gNDtcblxuLy8gRmlyc3QgRGlyZWN0b3J5IFNlY3RvciBMb2NhdGlvblxuZGlyX3N0YXJ0ID0gYmxvYi5yZWFkX3NoaWZ0KDQsICdpJyk7XG5cbi8vIFRyYW5zYWN0aW9uIFNpZ25hdHVyZVxuYmxvYi5sICs9IDQ7XG5cbi8vIE1pbmkgU3RyZWFtIEN1dG9mZiBTaXplXG5ibG9iLmNoaygnMDAxMDAwMDAnLCAnTWluaSBTdHJlYW0gQ3V0b2ZmIFNpemU6ICcpO1xuXG4vLyBGaXJzdCBNaW5pIEZBVCBTZWN0b3IgTG9jYXRpb25cbm1pbmlmYXRfc3RhcnQgPSBibG9iLnJlYWRfc2hpZnQoNCwgJ2knKTtcblxuLy8gTnVtYmVyIG9mIE1pbmkgRkFUIFNlY3RvcnNcbm5tZnMgPSBibG9iLnJlYWRfc2hpZnQoNCwgJ2knKTtcblxuLy8gRmlyc3QgRElGQVQgc2VjdG9yIGxvY2F0aW9uXG5kaWZhdF9zdGFydCA9IGJsb2IucmVhZF9zaGlmdCg0LCAnaScpO1xuXG4vLyBOdW1iZXIgb2YgRElGQVQgU2VjdG9yc1xuZGlmYXRfc2VjX2NudCA9IGJsb2IucmVhZF9zaGlmdCg0LCAnaScpO1xuXG4vLyBHcmFiIEZBVCBTZWN0b3IgTG9jYXRpb25zXG5mb3IodmFyIHEgPSAtMSwgaiA9IDA7IGogPCAxMDk7ICsraikgeyAvKiAxMDkgPSAoNTEyIC0gYmxvYi5sKT4+PjI7ICovXG5cdHEgPSBibG9iLnJlYWRfc2hpZnQoNCwgJ2knKTtcblx0aWYocTwwKSBicmVhaztcblx0ZmF0X2FkZHJzW2pdID0gcTtcbn1cblxuLyoqIEJyZWFrIHRoZSBmaWxlIHVwIGludG8gc2VjdG9ycyAqL1xudmFyIHNlY3RvcnMgPSBzZWN0b3JpZnkoZmlsZSwgc3N6KTtcblxuc2xldXRoX2ZhdChkaWZhdF9zdGFydCwgZGlmYXRfc2VjX2NudCwgc2VjdG9ycywgc3N6LCBmYXRfYWRkcnMpO1xuXG4vKiogQ2hhaW5zICovXG52YXIgc2VjdG9yX2xpc3QgPSBtYWtlX3NlY3Rvcl9saXN0KHNlY3RvcnMsIGRpcl9zdGFydCwgZmF0X2FkZHJzLCBzc3opO1xuXG5zZWN0b3JfbGlzdFtkaXJfc3RhcnRdLm5hbWUgPSBcIiFEaXJlY3RvcnlcIjtcbmlmKG5tZnMgPiAwICYmIG1pbmlmYXRfc3RhcnQgIT09IEVORE9GQ0hBSU4pIHNlY3Rvcl9saXN0W21pbmlmYXRfc3RhcnRdLm5hbWUgPSBcIiFNaW5pRkFUXCI7XG5zZWN0b3JfbGlzdFtmYXRfYWRkcnNbMF1dLm5hbWUgPSBcIiFGQVRcIjtcbnNlY3Rvcl9saXN0LmZhdF9hZGRycyA9IGZhdF9hZGRycztcbnNlY3Rvcl9saXN0LnNzeiA9IHNzejtcblxuLyogW01TLUNGQl0gMi42LjEgQ29tcG91bmQgRmlsZSBEaXJlY3RvcnkgRW50cnkgKi9cbnZhciBmaWxlcyA9IHt9LCBQYXRocyA9IFtdLCBGaWxlSW5kZXggPSBbXSwgRnVsbFBhdGhzID0gW107XG5yZWFkX2RpcmVjdG9yeShkaXJfc3RhcnQsIHNlY3Rvcl9saXN0LCBzZWN0b3JzLCBQYXRocywgbm1mcywgZmlsZXMsIEZpbGVJbmRleCwgbWluaWZhdF9zdGFydCk7XG5cbmJ1aWxkX2Z1bGxfcGF0aHMoRmlsZUluZGV4LCBGdWxsUGF0aHMsIFBhdGhzKTtcblBhdGhzLnNoaWZ0KCk7XG5cbnZhciBvID0ge1xuXHRGaWxlSW5kZXg6IEZpbGVJbmRleCxcblx0RnVsbFBhdGhzOiBGdWxsUGF0aHNcbn07XG5cbi8vICRGbG93SWdub3JlXG5pZihvcHRpb25zICYmIG9wdGlvbnMucmF3KSBvLnJhdyA9IHtoZWFkZXI6IGhlYWRlciwgc2VjdG9yczogc2VjdG9yc307XG5yZXR1cm4gbztcbn0gLy8gcGFyc2VcblxuLyogW01TLUNGQl0gMi4yIENvbXBvdW5kIEZpbGUgSGVhZGVyIC0tIHJlYWQgdXAgdG8gbWFqb3IgdmVyc2lvbiAqL1xuZnVuY3Rpb24gY2hlY2tfZ2V0X212ZXIoYmxvYikge1xuXHRpZihibG9iW2Jsb2IubF0gPT0gMHg1MCAmJiBibG9iW2Jsb2IubCArIDFdID09IDB4NGIpIHJldHVybiBbMCwgMF07XG5cdC8vIGhlYWRlciBzaWduYXR1cmUgOFxuXHRibG9iLmNoayhIRUFERVJfU0lHTkFUVVJFLCAnSGVhZGVyIFNpZ25hdHVyZTogJyk7XG5cblx0Ly8gY2xzaWQgMTZcblx0Ly9ibG9iLmNoayhIRUFERVJfQ0xTSUQsICdDTFNJRDogJyk7XG5cdGJsb2IubCArPSAxNjtcblxuXHQvLyBtaW5vciB2ZXJzaW9uIDJcblx0dmFyIG12ZXIgPSBibG9iLnJlYWRfc2hpZnQoMiwgJ3UnKTtcblxuXHRyZXR1cm4gW2Jsb2IucmVhZF9zaGlmdCgyLCd1JyksIG12ZXJdO1xufVxuZnVuY3Rpb24gY2hlY2tfc2hpZnRzKGJsb2IsIG12ZXIpIHtcblx0dmFyIHNoaWZ0ID0gMHgwOTtcblxuXHQvLyBCeXRlIE9yZGVyXG5cdC8vYmxvYi5jaGsoJ2ZlZmYnLCAnQnl0ZSBPcmRlcjogJyk7IC8vIG5vdGU6IHNvbWUgd3JpdGVycyBwdXQgMHhmZmZmXG5cdGJsb2IubCArPSAyO1xuXG5cdC8vIFNlY3RvciBTaGlmdFxuXHRzd2l0Y2goKHNoaWZ0ID0gYmxvYi5yZWFkX3NoaWZ0KDIpKSkge1xuXHRcdGNhc2UgMHgwOTogaWYobXZlciAhPSAzKSB0aHJvdyBuZXcgRXJyb3IoJ1NlY3RvciBTaGlmdDogRXhwZWN0ZWQgOSBzYXcgJyArIHNoaWZ0KTsgYnJlYWs7XG5cdFx0Y2FzZSAweDBjOiBpZihtdmVyICE9IDQpIHRocm93IG5ldyBFcnJvcignU2VjdG9yIFNoaWZ0OiBFeHBlY3RlZCAxMiBzYXcgJyArIHNoaWZ0KTsgYnJlYWs7XG5cdFx0ZGVmYXVsdDogdGhyb3cgbmV3IEVycm9yKCdTZWN0b3IgU2hpZnQ6IEV4cGVjdGVkIDkgb3IgMTIgc2F3ICcgKyBzaGlmdCk7XG5cdH1cblxuXHQvLyBNaW5pIFNlY3RvciBTaGlmdFxuXHRibG9iLmNoaygnMDYwMCcsICdNaW5pIFNlY3RvciBTaGlmdDogJyk7XG5cblx0Ly8gUmVzZXJ2ZWRcblx0YmxvYi5jaGsoJzAwMDAwMDAwMDAwMCcsICdSZXNlcnZlZDogJyk7XG59XG5cbi8qKiBCcmVhayB0aGUgZmlsZSB1cCBpbnRvIHNlY3RvcnMgKi9cbmZ1bmN0aW9uIHNlY3RvcmlmeShmaWxlLCBzc3opIHtcblx0dmFyIG5zZWN0b3JzID0gTWF0aC5jZWlsKGZpbGUubGVuZ3RoL3NzeiktMTtcblx0dmFyIHNlY3RvcnMgPSBbXTtcblx0Zm9yKHZhciBpPTE7IGkgPCBuc2VjdG9yczsgKytpKSBzZWN0b3JzW2ktMV0gPSBmaWxlLnNsaWNlKGkqc3N6LChpKzEpKnNzeik7XG5cdHNlY3RvcnNbbnNlY3RvcnMtMV0gPSBmaWxlLnNsaWNlKG5zZWN0b3JzKnNzeik7XG5cdHJldHVybiBzZWN0b3JzO1xufVxuXG4vKiBbTVMtQ0ZCXSAyLjYuNCBSZWQtQmxhY2sgVHJlZSAqL1xuZnVuY3Rpb24gYnVpbGRfZnVsbF9wYXRocyhGSSwgRlAsIFBhdGhzKSB7XG5cdHZhciBpID0gMCwgTCA9IDAsIFIgPSAwLCBDID0gMCwgaiA9IDAsIHBsID0gUGF0aHMubGVuZ3RoO1xuXHR2YXIgZGFkID0gW10sIHEgPSBbXTtcblxuXHRmb3IoOyBpIDwgcGw7ICsraSkgeyBkYWRbaV09cVtpXT1pOyBGUFtpXT1QYXRoc1tpXTsgfVxuXG5cdGZvcig7IGogPCBxLmxlbmd0aDsgKytqKSB7XG5cdFx0aSA9IHFbal07XG5cdFx0TCA9IEZJW2ldLkw7IFIgPSBGSVtpXS5SOyBDID0gRklbaV0uQztcblx0XHRpZihkYWRbaV0gPT09IGkpIHtcblx0XHRcdGlmKEwgIT09IC0xIC8qTk9TVFJFQU0qLyAmJiBkYWRbTF0gIT09IEwpIGRhZFtpXSA9IGRhZFtMXTtcblx0XHRcdGlmKFIgIT09IC0xICYmIGRhZFtSXSAhPT0gUikgZGFkW2ldID0gZGFkW1JdO1xuXHRcdH1cblx0XHRpZihDICE9PSAtMSAvKk5PU1RSRUFNKi8pIGRhZFtDXSA9IGk7XG5cdFx0aWYoTCAhPT0gLTEgJiYgaSAhPSBkYWRbaV0pIHsgZGFkW0xdID0gZGFkW2ldOyBpZihxLmxhc3RJbmRleE9mKEwpIDwgaikgcS5wdXNoKEwpOyB9XG5cdFx0aWYoUiAhPT0gLTEgJiYgaSAhPSBkYWRbaV0pIHsgZGFkW1JdID0gZGFkW2ldOyBpZihxLmxhc3RJbmRleE9mKFIpIDwgaikgcS5wdXNoKFIpOyB9XG5cdH1cblx0Zm9yKGk9MTsgaSA8IHBsOyArK2kpIGlmKGRhZFtpXSA9PT0gaSkge1xuXHRcdGlmKFIgIT09IC0xIC8qTk9TVFJFQU0qLyAmJiBkYWRbUl0gIT09IFIpIGRhZFtpXSA9IGRhZFtSXTtcblx0XHRlbHNlIGlmKEwgIT09IC0xICYmIGRhZFtMXSAhPT0gTCkgZGFkW2ldID0gZGFkW0xdO1xuXHR9XG5cblx0Zm9yKGk9MTsgaSA8IHBsOyArK2kpIHtcblx0XHRpZihGSVtpXS50eXBlID09PSAwIC8qIHVua25vd24gKi8pIGNvbnRpbnVlO1xuXHRcdGogPSBpO1xuXHRcdGlmKGogIT0gZGFkW2pdKSBkbyB7XG5cdFx0XHRqID0gZGFkW2pdO1xuXHRcdFx0RlBbaV0gPSBGUFtqXSArIFwiL1wiICsgRlBbaV07XG5cdFx0fSB3aGlsZSAoaiAhPT0gMCAmJiAtMSAhPT0gZGFkW2pdICYmIGogIT0gZGFkW2pdKTtcblx0XHRkYWRbaV0gPSAtMTtcblx0fVxuXG5cdEZQWzBdICs9IFwiL1wiO1xuXHRmb3IoaT0xOyBpIDwgcGw7ICsraSkge1xuXHRcdGlmKEZJW2ldLnR5cGUgIT09IDIgLyogc3RyZWFtICovKSBGUFtpXSArPSBcIi9cIjtcblx0fVxufVxuXG5mdW5jdGlvbiBnZXRfbWZhdF9lbnRyeShlbnRyeSwgcGF5bG9hZCwgbWluaSkge1xuXHR2YXIgc3RhcnQgPSBlbnRyeS5zdGFydCwgc2l6ZSA9IGVudHJ5LnNpemU7XG5cdC8vcmV0dXJuIChwYXlsb2FkLnNsaWNlKHN0YXJ0Kk1TU1osIHN0YXJ0Kk1TU1ogKyBzaXplKSk7XG5cdHZhciBvID0gW107XG5cdHZhciBpZHggPSBzdGFydDtcblx0d2hpbGUobWluaSAmJiBzaXplID4gMCAmJiBpZHggPj0gMCkge1xuXHRcdG8ucHVzaChwYXlsb2FkLnNsaWNlKGlkeCAqIE1TU1osIGlkeCAqIE1TU1ogKyBNU1NaKSk7XG5cdFx0c2l6ZSAtPSBNU1NaO1xuXHRcdGlkeCA9IF9fcmVhZEludDMyTEUobWluaSwgaWR4ICogNCk7XG5cdH1cblx0aWYoby5sZW5ndGggPT09IDApIHJldHVybiAobmV3X2J1ZigwKSk7XG5cdHJldHVybiAoYmNvbmNhdChvKS5zbGljZSgwLCBlbnRyeS5zaXplKSk7XG59XG5cbi8qKiBDaGFzZSBkb3duIHRoZSByZXN0IG9mIHRoZSBESUZBVCBjaGFpbiB0byBidWlsZCBhIGNvbXByZWhlbnNpdmUgbGlzdFxuICAgIERJRkFUIGNoYWlucyBieSBzdG9yaW5nIHRoZSBuZXh0IHNlY3RvciBudW1iZXIgYXMgdGhlIGxhc3QgMzIgYml0cyAqL1xuZnVuY3Rpb24gc2xldXRoX2ZhdChpZHgsIGNudCwgc2VjdG9ycywgc3N6LCBmYXRfYWRkcnMpIHtcblx0dmFyIHEgPSBFTkRPRkNIQUlOO1xuXHRpZihpZHggPT09IEVORE9GQ0hBSU4pIHtcblx0XHRpZihjbnQgIT09IDApIHRocm93IG5ldyBFcnJvcihcIkRJRkFUIGNoYWluIHNob3J0ZXIgdGhhbiBleHBlY3RlZFwiKTtcblx0fSBlbHNlIGlmKGlkeCAhPT0gLTEgLypGUkVFU0VDVCovKSB7XG5cdFx0dmFyIHNlY3RvciA9IHNlY3RvcnNbaWR4XSwgbSA9IChzc3o+Pj4yKS0xO1xuXHRcdGlmKCFzZWN0b3IpIHJldHVybjtcblx0XHRmb3IodmFyIGkgPSAwOyBpIDwgbTsgKytpKSB7XG5cdFx0XHRpZigocSA9IF9fcmVhZEludDMyTEUoc2VjdG9yLGkqNCkpID09PSBFTkRPRkNIQUlOKSBicmVhaztcblx0XHRcdGZhdF9hZGRycy5wdXNoKHEpO1xuXHRcdH1cblx0XHRzbGV1dGhfZmF0KF9fcmVhZEludDMyTEUoc2VjdG9yLHNzei00KSxjbnQgLSAxLCBzZWN0b3JzLCBzc3osIGZhdF9hZGRycyk7XG5cdH1cbn1cblxuLyoqIEZvbGxvdyB0aGUgbGlua2VkIGxpc3Qgb2Ygc2VjdG9ycyBmb3IgYSBnaXZlbiBzdGFydGluZyBwb2ludCAqL1xuZnVuY3Rpb24gZ2V0X3NlY3Rvcl9saXN0KHNlY3RvcnMsIHN0YXJ0LCBmYXRfYWRkcnMsIHNzeiwgY2hrZCkge1xuXHR2YXIgYnVmID0gW10sIGJ1Zl9jaGFpbiA9IFtdO1xuXHRpZighY2hrZCkgY2hrZCA9IFtdO1xuXHR2YXIgbW9kdWx1cyA9IHNzeiAtIDEsIGogPSAwLCBqaiA9IDA7XG5cdGZvcihqPXN0YXJ0OyBqPj0wOykge1xuXHRcdGNoa2Rbal0gPSB0cnVlO1xuXHRcdGJ1ZltidWYubGVuZ3RoXSA9IGo7XG5cdFx0YnVmX2NoYWluLnB1c2goc2VjdG9yc1tqXSk7XG5cdFx0dmFyIGFkZHIgPSBmYXRfYWRkcnNbTWF0aC5mbG9vcihqKjQvc3N6KV07XG5cdFx0amogPSAoKGoqNCkgJiBtb2R1bHVzKTtcblx0XHRpZihzc3ogPCA0ICsgamopIHRocm93IG5ldyBFcnJvcihcIkZBVCBib3VuZGFyeSBjcm9zc2VkOiBcIiArIGogKyBcIiA0IFwiK3Nzeik7XG5cdFx0aWYoIXNlY3RvcnNbYWRkcl0pIGJyZWFrO1xuXHRcdGogPSBfX3JlYWRJbnQzMkxFKHNlY3RvcnNbYWRkcl0sIGpqKTtcblx0fVxuXHRyZXR1cm4ge25vZGVzOiBidWYsIGRhdGE6X190b0J1ZmZlcihbYnVmX2NoYWluXSl9O1xufVxuXG4vKiogQ2hhc2UgZG93biB0aGUgc2VjdG9yIGxpbmtlZCBsaXN0cyAqL1xuZnVuY3Rpb24gbWFrZV9zZWN0b3JfbGlzdChzZWN0b3JzLCBkaXJfc3RhcnQsIGZhdF9hZGRycywgc3N6KSB7XG5cdHZhciBzbCA9IHNlY3RvcnMubGVuZ3RoLCBzZWN0b3JfbGlzdCA9IChbXSk7XG5cdHZhciBjaGtkID0gW10sIGJ1ZiA9IFtdLCBidWZfY2hhaW4gPSBbXTtcblx0dmFyIG1vZHVsdXMgPSBzc3ogLSAxLCBpPTAsIGo9MCwgaz0wLCBqaj0wO1xuXHRmb3IoaT0wOyBpIDwgc2w7ICsraSkge1xuXHRcdGJ1ZiA9IChbXSk7XG5cdFx0ayA9IChpICsgZGlyX3N0YXJ0KTsgaWYoayA+PSBzbCkgay09c2w7XG5cdFx0aWYoY2hrZFtrXSkgY29udGludWU7XG5cdFx0YnVmX2NoYWluID0gW107XG5cdFx0dmFyIHNlZW4gPSBbXTtcblx0XHRmb3Ioaj1rOyBqPj0wOykge1xuXHRcdFx0c2VlbltqXSA9IHRydWU7XG5cdFx0XHRjaGtkW2pdID0gdHJ1ZTtcblx0XHRcdGJ1ZltidWYubGVuZ3RoXSA9IGo7XG5cdFx0XHRidWZfY2hhaW4ucHVzaChzZWN0b3JzW2pdKTtcblx0XHRcdHZhciBhZGRyID0gZmF0X2FkZHJzW01hdGguZmxvb3Ioaio0L3NzeildO1xuXHRcdFx0amogPSAoKGoqNCkgJiBtb2R1bHVzKTtcblx0XHRcdGlmKHNzeiA8IDQgKyBqaikgdGhyb3cgbmV3IEVycm9yKFwiRkFUIGJvdW5kYXJ5IGNyb3NzZWQ6IFwiICsgaiArIFwiIDQgXCIrc3N6KTtcblx0XHRcdGlmKCFzZWN0b3JzW2FkZHJdKSBicmVhaztcblx0XHRcdGogPSBfX3JlYWRJbnQzMkxFKHNlY3RvcnNbYWRkcl0sIGpqKTtcblx0XHRcdGlmKHNlZW5bal0pIGJyZWFrO1xuXHRcdH1cblx0XHRzZWN0b3JfbGlzdFtrXSA9ICh7bm9kZXM6IGJ1ZiwgZGF0YTpfX3RvQnVmZmVyKFtidWZfY2hhaW5dKX0pO1xuXHR9XG5cdHJldHVybiBzZWN0b3JfbGlzdDtcbn1cblxuLyogW01TLUNGQl0gMi42LjEgQ29tcG91bmQgRmlsZSBEaXJlY3RvcnkgRW50cnkgKi9cbmZ1bmN0aW9uIHJlYWRfZGlyZWN0b3J5KGRpcl9zdGFydCwgc2VjdG9yX2xpc3QsIHNlY3RvcnMsIFBhdGhzLCBubWZzLCBmaWxlcywgRmlsZUluZGV4LCBtaW5pKSB7XG5cdHZhciBtaW5pZmF0X3N0b3JlID0gMCwgcGwgPSAoUGF0aHMubGVuZ3RoPzI6MCk7XG5cdHZhciBzZWN0b3IgPSBzZWN0b3JfbGlzdFtkaXJfc3RhcnRdLmRhdGE7XG5cdHZhciBpID0gMCwgbmFtZWxlbiA9IDAsIG5hbWU7XG5cdGZvcig7IGkgPCBzZWN0b3IubGVuZ3RoOyBpKz0gMTI4KSB7XG5cdFx0dmFyIGJsb2IgPSBzZWN0b3Iuc2xpY2UoaSwgaSsxMjgpO1xuXHRcdHByZXBfYmxvYihibG9iLCA2NCk7XG5cdFx0bmFtZWxlbiA9IGJsb2IucmVhZF9zaGlmdCgyKTtcblx0XHRuYW1lID0gX191dGYxNmxlKGJsb2IsMCxuYW1lbGVuLXBsKTtcblx0XHRQYXRocy5wdXNoKG5hbWUpO1xuXHRcdHZhciBvID0gKHtcblx0XHRcdG5hbWU6ICBuYW1lLFxuXHRcdFx0dHlwZTogIGJsb2IucmVhZF9zaGlmdCgxKSxcblx0XHRcdGNvbG9yOiBibG9iLnJlYWRfc2hpZnQoMSksXG5cdFx0XHRMOiAgICAgYmxvYi5yZWFkX3NoaWZ0KDQsICdpJyksXG5cdFx0XHRSOiAgICAgYmxvYi5yZWFkX3NoaWZ0KDQsICdpJyksXG5cdFx0XHRDOiAgICAgYmxvYi5yZWFkX3NoaWZ0KDQsICdpJyksXG5cdFx0XHRjbHNpZDogYmxvYi5yZWFkX3NoaWZ0KDE2KSxcblx0XHRcdHN0YXRlOiBibG9iLnJlYWRfc2hpZnQoNCwgJ2knKSxcblx0XHRcdHN0YXJ0OiAwLFxuXHRcdFx0c2l6ZTogMFxuXHRcdH0pO1xuXHRcdHZhciBjdGltZSA9IGJsb2IucmVhZF9zaGlmdCgyKSArIGJsb2IucmVhZF9zaGlmdCgyKSArIGJsb2IucmVhZF9zaGlmdCgyKSArIGJsb2IucmVhZF9zaGlmdCgyKTtcblx0XHRpZihjdGltZSAhPT0gMCkgby5jdCA9IHJlYWRfZGF0ZShibG9iLCBibG9iLmwtOCk7XG5cdFx0dmFyIG10aW1lID0gYmxvYi5yZWFkX3NoaWZ0KDIpICsgYmxvYi5yZWFkX3NoaWZ0KDIpICsgYmxvYi5yZWFkX3NoaWZ0KDIpICsgYmxvYi5yZWFkX3NoaWZ0KDIpO1xuXHRcdGlmKG10aW1lICE9PSAwKSBvLm10ID0gcmVhZF9kYXRlKGJsb2IsIGJsb2IubC04KTtcblx0XHRvLnN0YXJ0ID0gYmxvYi5yZWFkX3NoaWZ0KDQsICdpJyk7XG5cdFx0by5zaXplID0gYmxvYi5yZWFkX3NoaWZ0KDQsICdpJyk7XG5cdFx0aWYoby5zaXplIDwgMCAmJiBvLnN0YXJ0IDwgMCkgeyBvLnNpemUgPSBvLnR5cGUgPSAwOyBvLnN0YXJ0ID0gRU5ET0ZDSEFJTjsgby5uYW1lID0gXCJcIjsgfVxuXHRcdGlmKG8udHlwZSA9PT0gNSkgeyAvKiByb290ICovXG5cdFx0XHRtaW5pZmF0X3N0b3JlID0gby5zdGFydDtcblx0XHRcdGlmKG5tZnMgPiAwICYmIG1pbmlmYXRfc3RvcmUgIT09IEVORE9GQ0hBSU4pIHNlY3Rvcl9saXN0W21pbmlmYXRfc3RvcmVdLm5hbWUgPSBcIiFTdHJlYW1EYXRhXCI7XG5cdFx0XHQvKm1pbmlmYXRfc2l6ZSA9IG8uc2l6ZTsqL1xuXHRcdH0gZWxzZSBpZihvLnNpemUgPj0gNDA5NiAvKiBNU0NTWiAqLykge1xuXHRcdFx0by5zdG9yYWdlID0gJ2ZhdCc7XG5cdFx0XHRpZihzZWN0b3JfbGlzdFtvLnN0YXJ0XSA9PT0gdW5kZWZpbmVkKSBzZWN0b3JfbGlzdFtvLnN0YXJ0XSA9IGdldF9zZWN0b3JfbGlzdChzZWN0b3JzLCBvLnN0YXJ0LCBzZWN0b3JfbGlzdC5mYXRfYWRkcnMsIHNlY3Rvcl9saXN0LnNzeik7XG5cdFx0XHRzZWN0b3JfbGlzdFtvLnN0YXJ0XS5uYW1lID0gby5uYW1lO1xuXHRcdFx0by5jb250ZW50ID0gKHNlY3Rvcl9saXN0W28uc3RhcnRdLmRhdGEuc2xpY2UoMCxvLnNpemUpKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0by5zdG9yYWdlID0gJ21pbmlmYXQnO1xuXHRcdFx0aWYoby5zaXplIDwgMCkgby5zaXplID0gMDtcblx0XHRcdGVsc2UgaWYobWluaWZhdF9zdG9yZSAhPT0gRU5ET0ZDSEFJTiAmJiBvLnN0YXJ0ICE9PSBFTkRPRkNIQUlOICYmIHNlY3Rvcl9saXN0W21pbmlmYXRfc3RvcmVdKSB7XG5cdFx0XHRcdG8uY29udGVudCA9IGdldF9tZmF0X2VudHJ5KG8sIHNlY3Rvcl9saXN0W21pbmlmYXRfc3RvcmVdLmRhdGEsIChzZWN0b3JfbGlzdFttaW5pXXx8e30pLmRhdGEpO1xuXHRcdFx0fVxuXHRcdH1cblx0XHRpZihvLmNvbnRlbnQpIHByZXBfYmxvYihvLmNvbnRlbnQsIDApO1xuXHRcdGZpbGVzW25hbWVdID0gbztcblx0XHRGaWxlSW5kZXgucHVzaChvKTtcblx0fVxufVxuXG5mdW5jdGlvbiByZWFkX2RhdGUoYmxvYiwgb2Zmc2V0KSB7XG5cdHJldHVybiBuZXcgRGF0ZSgoICggKF9fcmVhZFVJbnQzMkxFKGJsb2Isb2Zmc2V0KzQpLzFlNykqTWF0aC5wb3coMiwzMikrX19yZWFkVUludDMyTEUoYmxvYixvZmZzZXQpLzFlNyApIC0gMTE2NDQ0NzM2MDApKjEwMDApO1xufVxuXG5mdW5jdGlvbiByZWFkX2ZpbGUoZmlsZW5hbWUsIG9wdGlvbnMpIHtcblx0Z2V0X2ZzKCk7XG5cdHJldHVybiBwYXJzZShmcy5yZWFkRmlsZVN5bmMoZmlsZW5hbWUpLCBvcHRpb25zKTtcbn1cblxuZnVuY3Rpb24gcmVhZChibG9iLCBvcHRpb25zKSB7XG5cdHN3aXRjaChvcHRpb25zICYmIG9wdGlvbnMudHlwZSB8fCBcImJhc2U2NFwiKSB7XG5cdFx0Y2FzZSBcImZpbGVcIjogcmV0dXJuIHJlYWRfZmlsZShibG9iLCBvcHRpb25zKTtcblx0XHRjYXNlIFwiYmFzZTY0XCI6IHJldHVybiBwYXJzZShzMmEoQmFzZTY0LmRlY29kZShibG9iKSksIG9wdGlvbnMpO1xuXHRcdGNhc2UgXCJiaW5hcnlcIjogcmV0dXJuIHBhcnNlKHMyYShibG9iKSwgb3B0aW9ucyk7XG5cdH1cblx0cmV0dXJuIHBhcnNlKGJsb2IsIG9wdGlvbnMpO1xufVxuXG5mdW5jdGlvbiBpbml0X2NmYihjZmIsIG9wdHMpIHtcblx0dmFyIG8gPSBvcHRzIHx8IHt9LCByb290ID0gby5yb290IHx8IFwiUm9vdCBFbnRyeVwiO1xuXHRpZighY2ZiLkZ1bGxQYXRocykgY2ZiLkZ1bGxQYXRocyA9IFtdO1xuXHRpZighY2ZiLkZpbGVJbmRleCkgY2ZiLkZpbGVJbmRleCA9IFtdO1xuXHRpZihjZmIuRnVsbFBhdGhzLmxlbmd0aCAhPT0gY2ZiLkZpbGVJbmRleC5sZW5ndGgpIHRocm93IG5ldyBFcnJvcihcImluY29uc2lzdGVudCBDRkIgc3RydWN0dXJlXCIpO1xuXHRpZihjZmIuRnVsbFBhdGhzLmxlbmd0aCA9PT0gMCkge1xuXHRcdGNmYi5GdWxsUGF0aHNbMF0gPSByb290ICsgXCIvXCI7XG5cdFx0Y2ZiLkZpbGVJbmRleFswXSA9ICh7IG5hbWU6IHJvb3QsIHR5cGU6IDUgfSk7XG5cdH1cblx0aWYoby5DTFNJRCkgY2ZiLkZpbGVJbmRleFswXS5jbHNpZCA9IG8uQ0xTSUQ7XG5cdHNlZWRfY2ZiKGNmYik7XG59XG5mdW5jdGlvbiBzZWVkX2NmYihjZmIpIHtcblx0dmFyIG5tID0gXCJcXHUwMDAxU2gzM3RKNVwiO1xuXHRpZihDRkIuZmluZChjZmIsIFwiL1wiICsgbm0pKSByZXR1cm47XG5cdHZhciBwID0gbmV3X2J1Zig0KTsgcFswXSA9IDU1OyBwWzFdID0gcFszXSA9IDUwOyBwWzJdID0gNTQ7XG5cdGNmYi5GaWxlSW5kZXgucHVzaCgoeyBuYW1lOiBubSwgdHlwZTogMiwgY29udGVudDpwLCBzaXplOjQsIEw6NjksIFI6NjksIEM6NjkgfSkpO1xuXHRjZmIuRnVsbFBhdGhzLnB1c2goY2ZiLkZ1bGxQYXRoc1swXSArIG5tKTtcblx0cmVidWlsZF9jZmIoY2ZiKTtcbn1cbmZ1bmN0aW9uIHJlYnVpbGRfY2ZiKGNmYiwgZikge1xuXHRpbml0X2NmYihjZmIpO1xuXHR2YXIgZ2MgPSBmYWxzZSwgcyA9IGZhbHNlO1xuXHRmb3IodmFyIGkgPSBjZmIuRnVsbFBhdGhzLmxlbmd0aCAtIDE7IGkgPj0gMDsgLS1pKSB7XG5cdFx0dmFyIF9maWxlID0gY2ZiLkZpbGVJbmRleFtpXTtcblx0XHRzd2l0Y2goX2ZpbGUudHlwZSkge1xuXHRcdFx0Y2FzZSAwOlxuXHRcdFx0XHRpZihzKSBnYyA9IHRydWU7XG5cdFx0XHRcdGVsc2UgeyBjZmIuRmlsZUluZGV4LnBvcCgpOyBjZmIuRnVsbFBhdGhzLnBvcCgpOyB9XG5cdFx0XHRcdGJyZWFrO1xuXHRcdFx0Y2FzZSAxOiBjYXNlIDI6IGNhc2UgNTpcblx0XHRcdFx0cyA9IHRydWU7XG5cdFx0XHRcdGlmKGlzTmFOKF9maWxlLlIgKiBfZmlsZS5MICogX2ZpbGUuQykpIGdjID0gdHJ1ZTtcblx0XHRcdFx0aWYoX2ZpbGUuUiA+IC0xICYmIF9maWxlLkwgPiAtMSAmJiBfZmlsZS5SID09IF9maWxlLkwpIGdjID0gdHJ1ZTtcblx0XHRcdFx0YnJlYWs7XG5cdFx0XHRkZWZhdWx0OiBnYyA9IHRydWU7IGJyZWFrO1xuXHRcdH1cblx0fVxuXHRpZighZ2MgJiYgIWYpIHJldHVybjtcblxuXHR2YXIgbm93ID0gbmV3IERhdGUoMTk4NywgMSwgMTkpLCBqID0gMDtcblx0dmFyIGRhdGEgPSBbXTtcblx0Zm9yKGkgPSAwOyBpIDwgY2ZiLkZ1bGxQYXRocy5sZW5ndGg7ICsraSkge1xuXHRcdGlmKGNmYi5GaWxlSW5kZXhbaV0udHlwZSA9PT0gMCkgY29udGludWU7XG5cdFx0ZGF0YS5wdXNoKFtjZmIuRnVsbFBhdGhzW2ldLCBjZmIuRmlsZUluZGV4W2ldXSk7XG5cdH1cblx0Zm9yKGkgPSAwOyBpIDwgZGF0YS5sZW5ndGg7ICsraSkge1xuXHRcdHZhciBkYWQgPSBkaXJuYW1lKGRhdGFbaV1bMF0pO1xuXHRcdHMgPSBmYWxzZTtcblx0XHRmb3IoaiA9IDA7IGogPCBkYXRhLmxlbmd0aDsgKytqKSBpZihkYXRhW2pdWzBdID09PSBkYWQpIHMgPSB0cnVlO1xuXHRcdGlmKCFzKSBkYXRhLnB1c2goW2RhZCwgKHtcblx0XHRcdG5hbWU6IGZpbGVuYW1lKGRhZCkucmVwbGFjZShcIi9cIixcIlwiKSxcblx0XHRcdHR5cGU6IDEsXG5cdFx0XHRjbHNpZDogSEVBREVSX0NMU0lELFxuXHRcdFx0Y3Q6IG5vdywgbXQ6IG5vdyxcblx0XHRcdGNvbnRlbnQ6IG51bGxcblx0XHR9KV0pO1xuXHR9XG5cblx0ZGF0YS5zb3J0KGZ1bmN0aW9uKHgseSkgeyByZXR1cm4gbmFtZWNtcCh4WzBdLCB5WzBdKTsgfSk7XG5cdGNmYi5GdWxsUGF0aHMgPSBbXTsgY2ZiLkZpbGVJbmRleCA9IFtdO1xuXHRmb3IoaSA9IDA7IGkgPCBkYXRhLmxlbmd0aDsgKytpKSB7IGNmYi5GdWxsUGF0aHNbaV0gPSBkYXRhW2ldWzBdOyBjZmIuRmlsZUluZGV4W2ldID0gZGF0YVtpXVsxXTsgfVxuXHRmb3IoaSA9IDA7IGkgPCBkYXRhLmxlbmd0aDsgKytpKSB7XG5cdFx0dmFyIGVsdCA9IGNmYi5GaWxlSW5kZXhbaV07XG5cdFx0dmFyIG5tID0gY2ZiLkZ1bGxQYXRoc1tpXTtcblxuXHRcdGVsdC5uYW1lID0gIGZpbGVuYW1lKG5tKS5yZXBsYWNlKFwiL1wiLFwiXCIpO1xuXHRcdGVsdC5MID0gZWx0LlIgPSBlbHQuQyA9IC0oZWx0LmNvbG9yID0gMSk7XG5cdFx0ZWx0LnNpemUgPSBlbHQuY29udGVudCA/IGVsdC5jb250ZW50Lmxlbmd0aCA6IDA7XG5cdFx0ZWx0LnN0YXJ0ID0gMDtcblx0XHRlbHQuY2xzaWQgPSAoZWx0LmNsc2lkIHx8IEhFQURFUl9DTFNJRCk7XG5cdFx0aWYoaSA9PT0gMCkge1xuXHRcdFx0ZWx0LkMgPSBkYXRhLmxlbmd0aCA+IDEgPyAxIDogLTE7XG5cdFx0XHRlbHQuc2l6ZSA9IDA7XG5cdFx0XHRlbHQudHlwZSA9IDU7XG5cdFx0fSBlbHNlIGlmKG5tLnNsaWNlKC0xKSA9PSBcIi9cIikge1xuXHRcdFx0Zm9yKGo9aSsxO2ogPCBkYXRhLmxlbmd0aDsgKytqKSBpZihkaXJuYW1lKGNmYi5GdWxsUGF0aHNbal0pPT1ubSkgYnJlYWs7XG5cdFx0XHRlbHQuQyA9IGogPj0gZGF0YS5sZW5ndGggPyAtMSA6IGo7XG5cdFx0XHRmb3Ioaj1pKzE7aiA8IGRhdGEubGVuZ3RoOyArK2opIGlmKGRpcm5hbWUoY2ZiLkZ1bGxQYXRoc1tqXSk9PWRpcm5hbWUobm0pKSBicmVhaztcblx0XHRcdGVsdC5SID0gaiA+PSBkYXRhLmxlbmd0aCA/IC0xIDogajtcblx0XHRcdGVsdC50eXBlID0gMTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0aWYoZGlybmFtZShjZmIuRnVsbFBhdGhzW2krMV18fFwiXCIpID09IGRpcm5hbWUobm0pKSBlbHQuUiA9IGkgKyAxO1xuXHRcdFx0ZWx0LnR5cGUgPSAyO1xuXHRcdH1cblx0fVxuXG59XG5cbmZ1bmN0aW9uIF93cml0ZShjZmIsIG9wdGlvbnMpIHtcblx0dmFyIF9vcHRzID0gb3B0aW9ucyB8fCB7fTtcblx0cmVidWlsZF9jZmIoY2ZiKTtcblx0aWYoX29wdHMuZmlsZVR5cGUgPT0gJ3ppcCcpIHJldHVybiB3cml0ZV96aXAoY2ZiLCBfb3B0cyk7XG5cdHZhciBMID0gKGZ1bmN0aW9uKGNmYil7XG5cdFx0dmFyIG1pbmlfc2l6ZSA9IDAsIGZhdF9zaXplID0gMDtcblx0XHRmb3IodmFyIGkgPSAwOyBpIDwgY2ZiLkZpbGVJbmRleC5sZW5ndGg7ICsraSkge1xuXHRcdFx0dmFyIGZpbGUgPSBjZmIuRmlsZUluZGV4W2ldO1xuXHRcdFx0aWYoIWZpbGUuY29udGVudCkgY29udGludWU7XG52YXIgZmxlbiA9IGZpbGUuY29udGVudC5sZW5ndGg7XG5cdFx0XHRpZihmbGVuID4gMCl7XG5cdFx0XHRcdGlmKGZsZW4gPCAweDEwMDApIG1pbmlfc2l6ZSArPSAoZmxlbiArIDB4M0YpID4+IDY7XG5cdFx0XHRcdGVsc2UgZmF0X3NpemUgKz0gKGZsZW4gKyAweDAxRkYpID4+IDk7XG5cdFx0XHR9XG5cdFx0fVxuXHRcdHZhciBkaXJfY250ID0gKGNmYi5GdWxsUGF0aHMubGVuZ3RoICszKSA+PiAyO1xuXHRcdHZhciBtaW5pX2NudCA9IChtaW5pX3NpemUgKyA3KSA+PiAzO1xuXHRcdHZhciBtZmF0X2NudCA9IChtaW5pX3NpemUgKyAweDdGKSA+PiA3O1xuXHRcdHZhciBmYXRfYmFzZSA9IG1pbmlfY250ICsgZmF0X3NpemUgKyBkaXJfY250ICsgbWZhdF9jbnQ7XG5cdFx0dmFyIGZhdF9jbnQgPSAoZmF0X2Jhc2UgKyAweDdGKSA+PiA3O1xuXHRcdHZhciBkaWZhdF9jbnQgPSBmYXRfY250IDw9IDEwOSA/IDAgOiBNYXRoLmNlaWwoKGZhdF9jbnQtMTA5KS8weDdGKTtcblx0XHR3aGlsZSgoKGZhdF9iYXNlICsgZmF0X2NudCArIGRpZmF0X2NudCArIDB4N0YpID4+IDcpID4gZmF0X2NudCkgZGlmYXRfY250ID0gKytmYXRfY250IDw9IDEwOSA/IDAgOiBNYXRoLmNlaWwoKGZhdF9jbnQtMTA5KS8weDdGKTtcblx0XHR2YXIgTCA9ICBbMSwgZGlmYXRfY250LCBmYXRfY250LCBtZmF0X2NudCwgZGlyX2NudCwgZmF0X3NpemUsIG1pbmlfc2l6ZSwgMF07XG5cdFx0Y2ZiLkZpbGVJbmRleFswXS5zaXplID0gbWluaV9zaXplIDw8IDY7XG5cdFx0TFs3XSA9IChjZmIuRmlsZUluZGV4WzBdLnN0YXJ0PUxbMF0rTFsxXStMWzJdK0xbM10rTFs0XStMWzVdKSsoKExbNl0rNykgPj4gMyk7XG5cdFx0cmV0dXJuIEw7XG5cdH0pKGNmYik7XG5cdHZhciBvID0gbmV3X2J1ZihMWzddIDw8IDkpO1xuXHR2YXIgaSA9IDAsIFQgPSAwO1xuXHR7XG5cdFx0Zm9yKGkgPSAwOyBpIDwgODsgKytpKSBvLndyaXRlX3NoaWZ0KDEsIEhFQURFUl9TSUdbaV0pO1xuXHRcdGZvcihpID0gMDsgaSA8IDg7ICsraSkgby53cml0ZV9zaGlmdCgyLCAwKTtcblx0XHRvLndyaXRlX3NoaWZ0KDIsIDB4MDAzRSk7XG5cdFx0by53cml0ZV9zaGlmdCgyLCAweDAwMDMpO1xuXHRcdG8ud3JpdGVfc2hpZnQoMiwgMHhGRkZFKTtcblx0XHRvLndyaXRlX3NoaWZ0KDIsIDB4MDAwOSk7XG5cdFx0by53cml0ZV9zaGlmdCgyLCAweDAwMDYpO1xuXHRcdGZvcihpID0gMDsgaSA8IDM7ICsraSkgby53cml0ZV9zaGlmdCgyLCAwKTtcblx0XHRvLndyaXRlX3NoaWZ0KDQsIDApO1xuXHRcdG8ud3JpdGVfc2hpZnQoNCwgTFsyXSk7XG5cdFx0by53cml0ZV9zaGlmdCg0LCBMWzBdICsgTFsxXSArIExbMl0gKyBMWzNdIC0gMSk7XG5cdFx0by53cml0ZV9zaGlmdCg0LCAwKTtcblx0XHRvLndyaXRlX3NoaWZ0KDQsIDE8PDEyKTtcblx0XHRvLndyaXRlX3NoaWZ0KDQsIExbM10gPyBMWzBdICsgTFsxXSArIExbMl0gLSAxOiBFTkRPRkNIQUlOKTtcblx0XHRvLndyaXRlX3NoaWZ0KDQsIExbM10pO1xuXHRcdG8ud3JpdGVfc2hpZnQoLTQsIExbMV0gPyBMWzBdIC0gMTogRU5ET0ZDSEFJTik7XG5cdFx0by53cml0ZV9zaGlmdCg0LCBMWzFdKTtcblx0XHRmb3IoaSA9IDA7IGkgPCAxMDk7ICsraSkgby53cml0ZV9zaGlmdCgtNCwgaSA8IExbMl0gPyBMWzFdICsgaSA6IC0xKTtcblx0fVxuXHRpZihMWzFdKSB7XG5cdFx0Zm9yKFQgPSAwOyBUIDwgTFsxXTsgKytUKSB7XG5cdFx0XHRmb3IoOyBpIDwgMjM2ICsgVCAqIDEyNzsgKytpKSBvLndyaXRlX3NoaWZ0KC00LCBpIDwgTFsyXSA/IExbMV0gKyBpIDogLTEpO1xuXHRcdFx0by53cml0ZV9zaGlmdCgtNCwgVCA9PT0gTFsxXSAtIDEgPyBFTkRPRkNIQUlOIDogVCArIDEpO1xuXHRcdH1cblx0fVxuXHR2YXIgY2hhaW5pdCA9IGZ1bmN0aW9uKHcpIHtcblx0XHRmb3IoVCArPSB3OyBpPFQtMTsgKytpKSBvLndyaXRlX3NoaWZ0KC00LCBpKzEpO1xuXHRcdGlmKHcpIHsgKytpOyBvLndyaXRlX3NoaWZ0KC00LCBFTkRPRkNIQUlOKTsgfVxuXHR9O1xuXHRUID0gaSA9IDA7XG5cdGZvcihUKz1MWzFdOyBpPFQ7ICsraSkgby53cml0ZV9zaGlmdCgtNCwgY29uc3RzLkRJRlNFQ1QpO1xuXHRmb3IoVCs9TFsyXTsgaTxUOyArK2kpIG8ud3JpdGVfc2hpZnQoLTQsIGNvbnN0cy5GQVRTRUNUKTtcblx0Y2hhaW5pdChMWzNdKTtcblx0Y2hhaW5pdChMWzRdKTtcblx0dmFyIGogPSAwLCBmbGVuID0gMDtcblx0dmFyIGZpbGUgPSBjZmIuRmlsZUluZGV4WzBdO1xuXHRmb3IoOyBqIDwgY2ZiLkZpbGVJbmRleC5sZW5ndGg7ICsraikge1xuXHRcdGZpbGUgPSBjZmIuRmlsZUluZGV4W2pdO1xuXHRcdGlmKCFmaWxlLmNvbnRlbnQpIGNvbnRpbnVlO1xuZmxlbiA9IGZpbGUuY29udGVudC5sZW5ndGg7XG5cdFx0aWYoZmxlbiA8IDB4MTAwMCkgY29udGludWU7XG5cdFx0ZmlsZS5zdGFydCA9IFQ7XG5cdFx0Y2hhaW5pdCgoZmxlbiArIDB4MDFGRikgPj4gOSk7XG5cdH1cblx0Y2hhaW5pdCgoTFs2XSArIDcpID4+IDMpO1xuXHR3aGlsZShvLmwgJiAweDFGRikgby53cml0ZV9zaGlmdCgtNCwgY29uc3RzLkVORE9GQ0hBSU4pO1xuXHRUID0gaSA9IDA7XG5cdGZvcihqID0gMDsgaiA8IGNmYi5GaWxlSW5kZXgubGVuZ3RoOyArK2opIHtcblx0XHRmaWxlID0gY2ZiLkZpbGVJbmRleFtqXTtcblx0XHRpZighZmlsZS5jb250ZW50KSBjb250aW51ZTtcbmZsZW4gPSBmaWxlLmNvbnRlbnQubGVuZ3RoO1xuXHRcdGlmKCFmbGVuIHx8IGZsZW4gPj0gMHgxMDAwKSBjb250aW51ZTtcblx0XHRmaWxlLnN0YXJ0ID0gVDtcblx0XHRjaGFpbml0KChmbGVuICsgMHgzRikgPj4gNik7XG5cdH1cblx0d2hpbGUoby5sICYgMHgxRkYpIG8ud3JpdGVfc2hpZnQoLTQsIGNvbnN0cy5FTkRPRkNIQUlOKTtcblx0Zm9yKGkgPSAwOyBpIDwgTFs0XTw8MjsgKytpKSB7XG5cdFx0dmFyIG5tID0gY2ZiLkZ1bGxQYXRoc1tpXTtcblx0XHRpZighbm0gfHwgbm0ubGVuZ3RoID09PSAwKSB7XG5cdFx0XHRmb3IoaiA9IDA7IGogPCAxNzsgKytqKSBvLndyaXRlX3NoaWZ0KDQsIDApO1xuXHRcdFx0Zm9yKGogPSAwOyBqIDwgMzsgKytqKSBvLndyaXRlX3NoaWZ0KDQsIC0xKTtcblx0XHRcdGZvcihqID0gMDsgaiA8IDEyOyArK2opIG8ud3JpdGVfc2hpZnQoNCwgMCk7XG5cdFx0XHRjb250aW51ZTtcblx0XHR9XG5cdFx0ZmlsZSA9IGNmYi5GaWxlSW5kZXhbaV07XG5cdFx0aWYoaSA9PT0gMCkgZmlsZS5zdGFydCA9IGZpbGUuc2l6ZSA/IGZpbGUuc3RhcnQgLSAxIDogRU5ET0ZDSEFJTjtcblx0XHR2YXIgX25tID0gKGkgPT09IDAgJiYgX29wdHMucm9vdCkgfHwgZmlsZS5uYW1lO1xuXHRcdGZsZW4gPSAyKihfbm0ubGVuZ3RoKzEpO1xuXHRcdG8ud3JpdGVfc2hpZnQoNjQsIF9ubSwgXCJ1dGYxNmxlXCIpO1xuXHRcdG8ud3JpdGVfc2hpZnQoMiwgZmxlbik7XG5cdFx0by53cml0ZV9zaGlmdCgxLCBmaWxlLnR5cGUpO1xuXHRcdG8ud3JpdGVfc2hpZnQoMSwgZmlsZS5jb2xvcik7XG5cdFx0by53cml0ZV9zaGlmdCgtNCwgZmlsZS5MKTtcblx0XHRvLndyaXRlX3NoaWZ0KC00LCBmaWxlLlIpO1xuXHRcdG8ud3JpdGVfc2hpZnQoLTQsIGZpbGUuQyk7XG5cdFx0aWYoIWZpbGUuY2xzaWQpIGZvcihqID0gMDsgaiA8IDQ7ICsraikgby53cml0ZV9zaGlmdCg0LCAwKTtcblx0XHRlbHNlIG8ud3JpdGVfc2hpZnQoMTYsIGZpbGUuY2xzaWQsIFwiaGV4XCIpO1xuXHRcdG8ud3JpdGVfc2hpZnQoNCwgZmlsZS5zdGF0ZSB8fCAwKTtcblx0XHRvLndyaXRlX3NoaWZ0KDQsIDApOyBvLndyaXRlX3NoaWZ0KDQsIDApO1xuXHRcdG8ud3JpdGVfc2hpZnQoNCwgMCk7IG8ud3JpdGVfc2hpZnQoNCwgMCk7XG5cdFx0by53cml0ZV9zaGlmdCg0LCBmaWxlLnN0YXJ0KTtcblx0XHRvLndyaXRlX3NoaWZ0KDQsIGZpbGUuc2l6ZSk7IG8ud3JpdGVfc2hpZnQoNCwgMCk7XG5cdH1cblx0Zm9yKGkgPSAxOyBpIDwgY2ZiLkZpbGVJbmRleC5sZW5ndGg7ICsraSkge1xuXHRcdGZpbGUgPSBjZmIuRmlsZUluZGV4W2ldO1xuaWYoZmlsZS5zaXplID49IDB4MTAwMCkge1xuXHRcdFx0by5sID0gKGZpbGUuc3RhcnQrMSkgPDwgOTtcblx0XHRcdGZvcihqID0gMDsgaiA8IGZpbGUuc2l6ZTsgKytqKSBvLndyaXRlX3NoaWZ0KDEsIGZpbGUuY29udGVudFtqXSk7XG5cdFx0XHRmb3IoOyBqICYgMHgxRkY7ICsraikgby53cml0ZV9zaGlmdCgxLCAwKTtcblx0XHR9XG5cdH1cblx0Zm9yKGkgPSAxOyBpIDwgY2ZiLkZpbGVJbmRleC5sZW5ndGg7ICsraSkge1xuXHRcdGZpbGUgPSBjZmIuRmlsZUluZGV4W2ldO1xuaWYoZmlsZS5zaXplID4gMCAmJiBmaWxlLnNpemUgPCAweDEwMDApIHtcblx0XHRcdGZvcihqID0gMDsgaiA8IGZpbGUuc2l6ZTsgKytqKSBvLndyaXRlX3NoaWZ0KDEsIGZpbGUuY29udGVudFtqXSk7XG5cdFx0XHRmb3IoOyBqICYgMHgzRjsgKytqKSBvLndyaXRlX3NoaWZ0KDEsIDApO1xuXHRcdH1cblx0fVxuXHR3aGlsZShvLmwgPCBvLmxlbmd0aCkgby53cml0ZV9zaGlmdCgxLCAwKTtcblx0cmV0dXJuIG87XG59XG4vKiBbTVMtQ0ZCXSAyLjYuNCAoVW5pY29kZSAzLjAuMSBjYXNlIGNvbnZlcnNpb24pICovXG5mdW5jdGlvbiBmaW5kKGNmYiwgcGF0aCkge1xuXHR2YXIgVUNGdWxsUGF0aHMgPSBjZmIuRnVsbFBhdGhzLm1hcChmdW5jdGlvbih4KSB7IHJldHVybiB4LnRvVXBwZXJDYXNlKCk7IH0pO1xuXHR2YXIgVUNQYXRocyA9IFVDRnVsbFBhdGhzLm1hcChmdW5jdGlvbih4KSB7IHZhciB5ID0geC5zcGxpdChcIi9cIik7IHJldHVybiB5W3kubGVuZ3RoIC0gKHguc2xpY2UoLTEpID09IFwiL1wiID8gMiA6IDEpXTsgfSk7XG5cdHZhciBrID0gZmFsc2U7XG5cdGlmKHBhdGguY2hhckNvZGVBdCgwKSA9PT0gNDcgLyogXCIvXCIgKi8pIHsgayA9IHRydWU7IHBhdGggPSBVQ0Z1bGxQYXRoc1swXS5zbGljZSgwLCAtMSkgKyBwYXRoOyB9XG5cdGVsc2UgayA9IHBhdGguaW5kZXhPZihcIi9cIikgIT09IC0xO1xuXHR2YXIgVUNQYXRoID0gcGF0aC50b1VwcGVyQ2FzZSgpO1xuXHR2YXIgdyA9IGsgPT09IHRydWUgPyBVQ0Z1bGxQYXRocy5pbmRleE9mKFVDUGF0aCkgOiBVQ1BhdGhzLmluZGV4T2YoVUNQYXRoKTtcblx0aWYodyAhPT0gLTEpIHJldHVybiBjZmIuRmlsZUluZGV4W3ddO1xuXG5cdHZhciBtID0gIVVDUGF0aC5tYXRjaChjaHIxKTtcblx0VUNQYXRoID0gVUNQYXRoLnJlcGxhY2UoY2hyMCwnJyk7XG5cdGlmKG0pIFVDUGF0aCA9IFVDUGF0aC5yZXBsYWNlKGNocjEsJyEnKTtcblx0Zm9yKHcgPSAwOyB3IDwgVUNGdWxsUGF0aHMubGVuZ3RoOyArK3cpIHtcblx0XHRpZigobSA/IFVDRnVsbFBhdGhzW3ddLnJlcGxhY2UoY2hyMSwnIScpIDogVUNGdWxsUGF0aHNbd10pLnJlcGxhY2UoY2hyMCwnJykgPT0gVUNQYXRoKSByZXR1cm4gY2ZiLkZpbGVJbmRleFt3XTtcblx0XHRpZigobSA/IFVDUGF0aHNbd10ucmVwbGFjZShjaHIxLCchJykgOiBVQ1BhdGhzW3ddKS5yZXBsYWNlKGNocjAsJycpID09IFVDUGF0aCkgcmV0dXJuIGNmYi5GaWxlSW5kZXhbd107XG5cdH1cblx0cmV0dXJuIG51bGw7XG59XG4vKiogQ0ZCIENvbnN0YW50cyAqL1xudmFyIE1TU1ogPSA2NDsgLyogTWluaSBTZWN0b3IgU2l6ZSA9IDE8PDYgKi9cbi8vdmFyIE1TQ1NaID0gNDA5NjsgLyogTWluaSBTdHJlYW0gQ3V0b2ZmIFNpemUgKi9cbi8qIDIuMSBDb21wb3VuZCBGaWxlIFNlY3RvciBOdW1iZXJzIGFuZCBUeXBlcyAqL1xudmFyIEVORE9GQ0hBSU4gPSAtMjtcbi8qIDIuMiBDb21wb3VuZCBGaWxlIEhlYWRlciAqL1xudmFyIEhFQURFUl9TSUdOQVRVUkUgPSAnZDBjZjExZTBhMWIxMWFlMSc7XG52YXIgSEVBREVSX1NJRyA9IFsweEQwLCAweENGLCAweDExLCAweEUwLCAweEExLCAweEIxLCAweDFBLCAweEUxXTtcbnZhciBIRUFERVJfQ0xTSUQgPSAnMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAnO1xudmFyIGNvbnN0cyA9IHtcblx0LyogMi4xIENvbXB1bmQgRmlsZSBTZWN0b3IgTnVtYmVycyBhbmQgVHlwZXMgKi9cblx0TUFYUkVHU0VDVDogLTYsXG5cdERJRlNFQ1Q6IC00LFxuXHRGQVRTRUNUOiAtMyxcblx0RU5ET0ZDSEFJTjogRU5ET0ZDSEFJTixcblx0RlJFRVNFQ1Q6IC0xLFxuXHQvKiAyLjIgQ29tcG91bmQgRmlsZSBIZWFkZXIgKi9cblx0SEVBREVSX1NJR05BVFVSRTogSEVBREVSX1NJR05BVFVSRSxcblx0SEVBREVSX01JTk9SX1ZFUlNJT046ICczZTAwJyxcblx0TUFYUkVHU0lEOiAtNixcblx0Tk9TVFJFQU06IC0xLFxuXHRIRUFERVJfQ0xTSUQ6IEhFQURFUl9DTFNJRCxcblx0LyogMi42LjEgQ29tcG91bmQgRmlsZSBEaXJlY3RvcnkgRW50cnkgKi9cblx0RW50cnlUeXBlczogWyd1bmtub3duJywnc3RvcmFnZScsJ3N0cmVhbScsJ2xvY2tieXRlcycsJ3Byb3BlcnR5Jywncm9vdCddXG59O1xuXG5mdW5jdGlvbiB3cml0ZV9maWxlKGNmYiwgZmlsZW5hbWUsIG9wdGlvbnMpIHtcblx0Z2V0X2ZzKCk7XG5cdHZhciBvID0gX3dyaXRlKGNmYiwgb3B0aW9ucyk7XG5mcy53cml0ZUZpbGVTeW5jKGZpbGVuYW1lLCBvKTtcbn1cblxuZnVuY3Rpb24gYTJzKG8pIHtcblx0dmFyIG91dCA9IG5ldyBBcnJheShvLmxlbmd0aCk7XG5cdGZvcih2YXIgaSA9IDA7IGkgPCBvLmxlbmd0aDsgKytpKSBvdXRbaV0gPSBTdHJpbmcuZnJvbUNoYXJDb2RlKG9baV0pO1xuXHRyZXR1cm4gb3V0LmpvaW4oXCJcIik7XG59XG5cbmZ1bmN0aW9uIHdyaXRlKGNmYiwgb3B0aW9ucykge1xuXHR2YXIgbyA9IF93cml0ZShjZmIsIG9wdGlvbnMpO1xuXHRzd2l0Y2gob3B0aW9ucyAmJiBvcHRpb25zLnR5cGUpIHtcblx0XHRjYXNlIFwiZmlsZVwiOiBnZXRfZnMoKTsgZnMud3JpdGVGaWxlU3luYyhvcHRpb25zLmZpbGVuYW1lLCAobykpOyByZXR1cm4gbztcblx0XHRjYXNlIFwiYmluYXJ5XCI6IHJldHVybiBhMnMobyk7XG5cdFx0Y2FzZSBcImJhc2U2NFwiOiByZXR1cm4gQmFzZTY0LmVuY29kZShhMnMobykpO1xuXHR9XG5cdHJldHVybiBvO1xufVxuLyogbm9kZSA8IDguMSB6bGliIGRvZXMgbm90IGV4cG9zZSBieXRlc1JlYWQsIHNvIGRlZmF1bHQgdG8gcHVyZSBKUyAqL1xudmFyIF96bGliO1xuZnVuY3Rpb24gdXNlX3psaWIoemxpYikgeyB0cnkge1xuXHR2YXIgSW5mbGF0ZVJhdyA9IHpsaWIuSW5mbGF0ZVJhdztcblx0dmFyIEluZmxSYXcgPSBuZXcgSW5mbGF0ZVJhdygpO1xuXHRJbmZsUmF3Ll9wcm9jZXNzQ2h1bmsobmV3IFVpbnQ4QXJyYXkoWzMsIDBdKSwgSW5mbFJhdy5fZmluaXNoRmx1c2hGbGFnKTtcblx0aWYoSW5mbFJhdy5ieXRlc1JlYWQpIF96bGliID0gemxpYjtcblx0ZWxzZSB0aHJvdyBuZXcgRXJyb3IoXCJ6bGliIGRvZXMgbm90IGV4cG9zZSBieXRlc1JlYWRcIik7XG59IGNhdGNoKGUpIHtjb25zb2xlLmVycm9yKFwiY2Fubm90IHVzZSBuYXRpdmUgemxpYjogXCIgKyAoZS5tZXNzYWdlIHx8IGUpKTsgfSB9XG5cbmZ1bmN0aW9uIF9pbmZsYXRlUmF3U3luYyhwYXlsb2FkLCB1c3opIHtcblx0aWYoIV96bGliKSByZXR1cm4gX2luZmxhdGUocGF5bG9hZCwgdXN6KTtcblx0dmFyIEluZmxhdGVSYXcgPSBfemxpYi5JbmZsYXRlUmF3O1xuXHR2YXIgSW5mbFJhdyA9IG5ldyBJbmZsYXRlUmF3KCk7XG5cdHZhciBvdXQgPSBJbmZsUmF3Ll9wcm9jZXNzQ2h1bmsocGF5bG9hZC5zbGljZShwYXlsb2FkLmwpLCBJbmZsUmF3Ll9maW5pc2hGbHVzaEZsYWcpO1xuXHRwYXlsb2FkLmwgKz0gSW5mbFJhdy5ieXRlc1JlYWQ7XG5cdHJldHVybiBvdXQ7XG59XG5cbmZ1bmN0aW9uIF9kZWZsYXRlUmF3U3luYyhwYXlsb2FkKSB7XG5cdHJldHVybiBfemxpYiA/IF96bGliLmRlZmxhdGVSYXdTeW5jKHBheWxvYWQpIDogX2RlZmxhdGUocGF5bG9hZCk7XG59XG52YXIgQ0xFTl9PUkRFUiA9IFsgMTYsIDE3LCAxOCwgMCwgOCwgNywgOSwgNiwgMTAsIDUsIDExLCA0LCAxMiwgMywgMTMsIDIsIDE0LCAxLCAxNSBdO1xuXG4vKiAgTEVOX0lEID0gWyAyNTcsIDI1OCwgMjU5LCAyNjAsIDI2MSwgMjYyLCAyNjMsIDI2NCwgMjY1LCAyNjYsIDI2NywgMjY4LCAyNjksIDI3MCwgMjcxLCAyNzIsIDI3MywgMjc0LCAyNzUsIDI3NiwgMjc3LCAyNzgsIDI3OSwgMjgwLCAyODEsIDI4MiwgMjgzLCAyODQsIDI4NSBdOyAqL1xudmFyIExFTl9MTiA9IFsgICAzLCAgIDQsICAgNSwgICA2LCAgIDcsICAgOCwgICA5LCAgMTAsICAxMSwgIDEzICwgMTUsICAxNywgIDE5LCAgMjMsICAyNywgIDMxLCAgMzUsICA0MywgIDUxLCAgNTksICA2NywgIDgzLCAgOTksIDExNSwgMTMxLCAxNjMsIDE5NSwgMjI3LCAyNTggXTtcblxuLyogIERTVF9JRCA9IFsgIDAsICAxLCAgMiwgIDMsICA0LCAgNSwgIDYsICA3LCAgOCwgIDksIDEwLCAxMSwgMTIsIDEzLCAgMTQsICAxNSwgIDE2LCAgMTcsICAxOCwgIDE5LCAgIDIwLCAgIDIxLCAgIDIyLCAgIDIzLCAgIDI0LCAgIDI1LCAgIDI2LCAgICAyNywgICAgMjgsICAgIDI5IF07ICovXG52YXIgRFNUX0xOID0gWyAgMSwgIDIsICAzLCAgNCwgIDUsICA3LCAgOSwgMTMsIDE3LCAyNSwgMzMsIDQ5LCA2NSwgOTcsIDEyOSwgMTkzLCAyNTcsIDM4NSwgNTEzLCA3NjksIDEwMjUsIDE1MzcsIDIwNDksIDMwNzMsIDQwOTcsIDYxNDUsIDgxOTMsIDEyMjg5LCAxNjM4NSwgMjQ1NzcgXTtcblxuZnVuY3Rpb24gYml0X3N3YXBfOChuKSB7IHZhciB0ID0gKCgoKChuPDwxKXwobjw8MTEpKSAmIDB4MjIxMTApIHwgKCgobjw8NSl8KG48PDE1KSkgJiAweDg4NDQwKSkpOyByZXR1cm4gKCh0Pj4xNikgfCAodD4+OCkgfHQpJjB4RkY7IH1cblxudmFyIHVzZV90eXBlZF9hcnJheXMgPSB0eXBlb2YgVWludDhBcnJheSAhPT0gJ3VuZGVmaW5lZCc7XG5cbnZhciBiaXRzd2FwOCA9IHVzZV90eXBlZF9hcnJheXMgPyBuZXcgVWludDhBcnJheSgxPDw4KSA6IFtdO1xuZm9yKHZhciBxID0gMDsgcSA8ICgxPDw4KTsgKytxKSBiaXRzd2FwOFtxXSA9IGJpdF9zd2FwXzgocSk7XG5cbmZ1bmN0aW9uIGJpdF9zd2FwX24obiwgYikge1xuXHR2YXIgcmV2ID0gYml0c3dhcDhbbiAmIDB4RkZdO1xuXHRpZihiIDw9IDgpIHJldHVybiByZXYgPj4+ICg4LWIpO1xuXHRyZXYgPSAocmV2IDw8IDgpIHwgYml0c3dhcDhbKG4+PjgpJjB4RkZdO1xuXHRpZihiIDw9IDE2KSByZXR1cm4gcmV2ID4+PiAoMTYtYik7XG5cdHJldiA9IChyZXYgPDwgOCkgfCBiaXRzd2FwOFsobj4+MTYpJjB4RkZdO1xuXHRyZXR1cm4gcmV2ID4+PiAoMjQtYik7XG59XG5cbi8qIGhlbHBlcnMgZm9yIHVuYWxpZ25lZCBiaXQgcmVhZHMgKi9cbmZ1bmN0aW9uIHJlYWRfYml0c18yKGJ1ZiwgYmwpIHsgdmFyIHcgPSAoYmwmNyksIGggPSAoYmw+Pj4zKTsgcmV0dXJuICgoYnVmW2hdfCh3IDw9IDYgPyAwIDogYnVmW2grMV08PDgpKT4+PncpJiAweDAzOyB9XG5mdW5jdGlvbiByZWFkX2JpdHNfMyhidWYsIGJsKSB7IHZhciB3ID0gKGJsJjcpLCBoID0gKGJsPj4+Myk7IHJldHVybiAoKGJ1ZltoXXwodyA8PSA1ID8gMCA6IGJ1ZltoKzFdPDw4KSk+Pj53KSYgMHgwNzsgfVxuZnVuY3Rpb24gcmVhZF9iaXRzXzQoYnVmLCBibCkgeyB2YXIgdyA9IChibCY3KSwgaCA9IChibD4+PjMpOyByZXR1cm4gKChidWZbaF18KHcgPD0gNCA/IDAgOiBidWZbaCsxXTw8OCkpPj4+dykmIDB4MEY7IH1cbmZ1bmN0aW9uIHJlYWRfYml0c181KGJ1ZiwgYmwpIHsgdmFyIHcgPSAoYmwmNyksIGggPSAoYmw+Pj4zKTsgcmV0dXJuICgoYnVmW2hdfCh3IDw9IDMgPyAwIDogYnVmW2grMV08PDgpKT4+PncpJiAweDFGOyB9XG5mdW5jdGlvbiByZWFkX2JpdHNfNyhidWYsIGJsKSB7IHZhciB3ID0gKGJsJjcpLCBoID0gKGJsPj4+Myk7IHJldHVybiAoKGJ1ZltoXXwodyA8PSAxID8gMCA6IGJ1ZltoKzFdPDw4KSk+Pj53KSYgMHg3RjsgfVxuXG4vKiB3b3JrcyB1cCB0byBuID0gMyAqIDggKyAxID0gMjUgKi9cbmZ1bmN0aW9uIHJlYWRfYml0c19uKGJ1ZiwgYmwsIG4pIHtcblx0dmFyIHcgPSAoYmwmNyksIGggPSAoYmw+Pj4zKSwgZiA9ICgoMTw8biktMSk7XG5cdHZhciB2ID0gYnVmW2hdID4+PiB3O1xuXHRpZihuIDwgOCAtIHcpIHJldHVybiB2ICYgZjtcblx0diB8PSBidWZbaCsxXTw8KDgtdyk7XG5cdGlmKG4gPCAxNiAtIHcpIHJldHVybiB2ICYgZjtcblx0diB8PSBidWZbaCsyXTw8KDE2LXcpO1xuXHRpZihuIDwgMjQgLSB3KSByZXR1cm4gdiAmIGY7XG5cdHYgfD0gYnVmW2grM108PCgyNC13KTtcblx0cmV0dXJuIHYgJiBmO1xufVxuXG4vKiB1bnRpbCBBcnJheUJ1ZmZlciNyZWFsbG9jIGlzIGEgdGhpbmcsIGZha2UgYSByZWFsbG9jICovXG5mdW5jdGlvbiByZWFsbG9jKGIsIHN6KSB7XG5cdHZhciBMID0gYi5sZW5ndGgsIE0gPSAyKkwgPiBzeiA/IDIqTCA6IHN6ICsgNSwgaSA9IDA7XG5cdGlmKEwgPj0gc3opIHJldHVybiBiO1xuXHRpZihoYXNfYnVmKSB7XG5cdFx0dmFyIG8gPSBuZXdfdW5zYWZlX2J1ZihNKTtcblx0XHQvLyAkRmxvd0lnbm9yZVxuXHRcdGlmKGIuY29weSkgYi5jb3B5KG8pO1xuXHRcdGVsc2UgZm9yKDsgaSA8IGIubGVuZ3RoOyArK2kpIG9baV0gPSBiW2ldO1xuXHRcdHJldHVybiBvO1xuXHR9IGVsc2UgaWYodXNlX3R5cGVkX2FycmF5cykge1xuXHRcdHZhciBhID0gbmV3IFVpbnQ4QXJyYXkoTSk7XG5cdFx0aWYoYS5zZXQpIGEuc2V0KGIpO1xuXHRcdGVsc2UgZm9yKDsgaSA8IGIubGVuZ3RoOyArK2kpIGFbaV0gPSBiW2ldO1xuXHRcdHJldHVybiBhO1xuXHR9XG5cdGIubGVuZ3RoID0gTTtcblx0cmV0dXJuIGI7XG59XG5cbi8qIHplcm8tZmlsbGVkIGFycmF5cyBmb3Igb2xkZXIgYnJvd3NlcnMgKi9cbmZ1bmN0aW9uIHplcm9fZmlsbF9hcnJheShuKSB7XG5cdHZhciBvID0gbmV3IEFycmF5KG4pO1xuXHRmb3IodmFyIGkgPSAwOyBpIDwgbjsgKytpKSBvW2ldID0gMDtcblx0cmV0dXJuIG87XG59dmFyIF9kZWZsYXRlID0gKGZ1bmN0aW9uKCkge1xudmFyIF9kZWZsYXRlUmF3ID0gKGZ1bmN0aW9uKCkge1xuXHRyZXR1cm4gZnVuY3Rpb24gZGVmbGF0ZVJhdyhkYXRhLCBvdXQpIHtcblx0XHR2YXIgYm9mZiA9IDA7XG5cdFx0d2hpbGUoYm9mZiA8IGRhdGEubGVuZ3RoKSB7XG5cdFx0XHR2YXIgTCA9IE1hdGgubWluKDB4RkZGRiwgZGF0YS5sZW5ndGggLSBib2ZmKTtcblx0XHRcdHZhciBoID0gYm9mZiArIEwgPT0gZGF0YS5sZW5ndGg7XG5cdFx0XHQvKiBUT0RPOiB0aGlzIGlzIG9ubHkgdHlwZSAwIHN0b3JlZCAqL1xuXHRcdFx0b3V0LndyaXRlX3NoaWZ0KDEsICtoKTtcblx0XHRcdG91dC53cml0ZV9zaGlmdCgyLCBMKTtcblx0XHRcdG91dC53cml0ZV9zaGlmdCgyLCAofkwpICYgMHhGRkZGKTtcblx0XHRcdHdoaWxlKEwtLSA+IDApIG91dFtvdXQubCsrXSA9IGRhdGFbYm9mZisrXTtcblx0XHR9XG5cdFx0cmV0dXJuIG91dC5sO1xuXHR9O1xufSkoKTtcblxucmV0dXJuIGZ1bmN0aW9uKGRhdGEpIHtcblx0dmFyIGJ1ZiA9IG5ld19idWYoNTArTWF0aC5mbG9vcihkYXRhLmxlbmd0aCoxLjEpKTtcblx0dmFyIG9mZiA9IF9kZWZsYXRlUmF3KGRhdGEsIGJ1Zik7XG5cdHJldHVybiBidWYuc2xpY2UoMCwgb2ZmKTtcbn07XG59KSgpO1xuLyogbW9kaWZpZWQgaW5mbGF0ZSBmdW5jdGlvbiBhbHNvIG1vdmVzIG9yaWdpbmFsIHJlYWQgaGVhZCAqL1xuXG4vKiBidWlsZCB0cmVlICh1c2VkIGZvciBsaXRlcmFscyBhbmQgbGVuZ3RocykgKi9cbmZ1bmN0aW9uIGJ1aWxkX3RyZWUoY2xlbnMsIGNtYXAsIE1BWCkge1xuXHR2YXIgbWF4bGVuID0gMSwgdyA9IDAsIGkgPSAwLCBqID0gMCwgY2NvZGUgPSAwLCBMID0gY2xlbnMubGVuZ3RoO1xuXG5cdHZhciBibF9jb3VudCAgPSB1c2VfdHlwZWRfYXJyYXlzID8gbmV3IFVpbnQxNkFycmF5KDMyKSA6IHplcm9fZmlsbF9hcnJheSgzMik7XG5cdGZvcihpID0gMDsgaSA8IDMyOyArK2kpIGJsX2NvdW50W2ldID0gMDtcblxuXHRmb3IoaSA9IEw7IGkgPCBNQVg7ICsraSkgY2xlbnNbaV0gPSAwO1xuXHRMID0gY2xlbnMubGVuZ3RoO1xuXG5cdHZhciBjdHJlZSA9IHVzZV90eXBlZF9hcnJheXMgPyBuZXcgVWludDE2QXJyYXkoTCkgOiB6ZXJvX2ZpbGxfYXJyYXkoTCk7IC8vIFtdXG5cblx0LyogYnVpbGQgY29kZSB0cmVlICovXG5cdGZvcihpID0gMDsgaSA8IEw7ICsraSkge1xuXHRcdGJsX2NvdW50Wyh3ID0gY2xlbnNbaV0pXSsrO1xuXHRcdGlmKG1heGxlbiA8IHcpIG1heGxlbiA9IHc7XG5cdFx0Y3RyZWVbaV0gPSAwO1xuXHR9XG5cdGJsX2NvdW50WzBdID0gMDtcblx0Zm9yKGkgPSAxOyBpIDw9IG1heGxlbjsgKytpKSBibF9jb3VudFtpKzE2XSA9IChjY29kZSA9IChjY29kZSArIGJsX2NvdW50W2ktMV0pPDwxKTtcblx0Zm9yKGkgPSAwOyBpIDwgTDsgKytpKSB7XG5cdFx0Y2NvZGUgPSBjbGVuc1tpXTtcblx0XHRpZihjY29kZSAhPSAwKSBjdHJlZVtpXSA9IGJsX2NvdW50W2Njb2RlKzE2XSsrO1xuXHR9XG5cblx0LyogY21hcFttYXhsZW4gKyA0IGJpdHNdID0gKG9mZiYxNSkgKyAobGl0PDw0KSByZXZlcnNlIG1hcHBpbmcgKi9cblx0dmFyIGNsZW5pID0gMDtcblx0Zm9yKGkgPSAwOyBpIDwgTDsgKytpKSB7XG5cdFx0Y2xlbmkgPSBjbGVuc1tpXTtcblx0XHRpZihjbGVuaSAhPSAwKSB7XG5cdFx0XHRjY29kZSA9IGJpdF9zd2FwX24oY3RyZWVbaV0sIG1heGxlbik+PihtYXhsZW4tY2xlbmkpO1xuXHRcdFx0Zm9yKGogPSAoMTw8KG1heGxlbiArIDQgLSBjbGVuaSkpIC0gMTsgaj49MDsgLS1qKVxuXHRcdFx0XHRjbWFwW2Njb2RlfChqPDxjbGVuaSldID0gKGNsZW5pJjE1KSB8IChpPDw0KTtcblx0XHR9XG5cdH1cblx0cmV0dXJuIG1heGxlbjtcbn1cblxudmFyIGZpeF9sbWFwID0gdXNlX3R5cGVkX2FycmF5cyA/IG5ldyBVaW50MTZBcnJheSg1MTIpIDogemVyb19maWxsX2FycmF5KDUxMik7XG52YXIgZml4X2RtYXAgPSB1c2VfdHlwZWRfYXJyYXlzID8gbmV3IFVpbnQxNkFycmF5KDMyKSAgOiB6ZXJvX2ZpbGxfYXJyYXkoMzIpO1xuaWYoIXVzZV90eXBlZF9hcnJheXMpIHtcblx0Zm9yKHZhciBpID0gMDsgaSA8IDUxMjsgKytpKSBmaXhfbG1hcFtpXSA9IDA7XG5cdGZvcihpID0gMDsgaSA8IDMyOyArK2kpIGZpeF9kbWFwW2ldID0gMDtcbn1cbihmdW5jdGlvbigpIHtcblx0dmFyIGRsZW5zID0gW107XG5cdHZhciBpID0gMDtcblx0Zm9yKDtpPDMyOyBpKyspIGRsZW5zLnB1c2goNSk7XG5cdGJ1aWxkX3RyZWUoZGxlbnMsIGZpeF9kbWFwLCAzMik7XG5cblx0dmFyIGNsZW5zID0gW107XG5cdGkgPSAwO1xuXHRmb3IoOyBpPD0xNDM7IGkrKykgY2xlbnMucHVzaCg4KTtcblx0Zm9yKDsgaTw9MjU1OyBpKyspIGNsZW5zLnB1c2goOSk7XG5cdGZvcig7IGk8PTI3OTsgaSsrKSBjbGVucy5wdXNoKDcpO1xuXHRmb3IoOyBpPD0yODc7IGkrKykgY2xlbnMucHVzaCg4KTtcblx0YnVpbGRfdHJlZShjbGVucywgZml4X2xtYXAsIDI4OCk7XG59KSgpO1xuXG52YXIgZHluX2xtYXAgPSB1c2VfdHlwZWRfYXJyYXlzID8gbmV3IFVpbnQxNkFycmF5KDMyNzY4KSA6IHplcm9fZmlsbF9hcnJheSgzMjc2OCk7XG52YXIgZHluX2RtYXAgPSB1c2VfdHlwZWRfYXJyYXlzID8gbmV3IFVpbnQxNkFycmF5KDMyNzY4KSA6IHplcm9fZmlsbF9hcnJheSgzMjc2OCk7XG52YXIgZHluX2NtYXAgPSB1c2VfdHlwZWRfYXJyYXlzID8gbmV3IFVpbnQxNkFycmF5KDEyOCkgICA6IHplcm9fZmlsbF9hcnJheSgxMjgpO1xudmFyIGR5bl9sZW5fMSA9IDEsIGR5bl9sZW5fMiA9IDE7XG5cbi8qIDUuNS4zIEV4cGFuZGluZyBIdWZmbWFuIENvZGVzICovXG5mdW5jdGlvbiBkeW4oZGF0YSwgYm9mZikge1xuXHQvKiBub21lbmNsYXR1cmUgZnJvbSBSRkMxOTUxIHJlZmVycyB0byBiaXQgdmFsdWVzOyB0aGVzZSBhcmUgb2Zmc2V0IGJ5IHRoZSBpbXBsaWNpdCBjb25zdGFudCAqL1xuXHR2YXIgX0hMSVQgPSByZWFkX2JpdHNfNShkYXRhLCBib2ZmKSArIDI1NzsgYm9mZiArPSA1O1xuXHR2YXIgX0hESVNUID0gcmVhZF9iaXRzXzUoZGF0YSwgYm9mZikgKyAxOyBib2ZmICs9IDU7XG5cdHZhciBfSENMRU4gPSByZWFkX2JpdHNfNChkYXRhLCBib2ZmKSArIDQ7IGJvZmYgKz0gNDtcblx0dmFyIHcgPSAwO1xuXG5cdC8qIGdyYWIgYW5kIHN0b3JlIGNvZGUgbGVuZ3RocyAqL1xuXHR2YXIgY2xlbnMgPSB1c2VfdHlwZWRfYXJyYXlzID8gbmV3IFVpbnQ4QXJyYXkoMTkpIDogemVyb19maWxsX2FycmF5KDE5KTtcblx0dmFyIGN0cmVlID0gWyAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwIF07XG5cdHZhciBtYXhsZW4gPSAxO1xuXHR2YXIgYmxfY291bnQgPSAgdXNlX3R5cGVkX2FycmF5cyA/IG5ldyBVaW50OEFycmF5KDgpIDogemVyb19maWxsX2FycmF5KDgpO1xuXHR2YXIgbmV4dF9jb2RlID0gdXNlX3R5cGVkX2FycmF5cyA/IG5ldyBVaW50OEFycmF5KDgpIDogemVyb19maWxsX2FycmF5KDgpO1xuXHR2YXIgTCA9IGNsZW5zLmxlbmd0aDsgLyogMTkgKi9cblx0Zm9yKHZhciBpID0gMDsgaSA8IF9IQ0xFTjsgKytpKSB7XG5cdFx0Y2xlbnNbQ0xFTl9PUkRFUltpXV0gPSB3ID0gcmVhZF9iaXRzXzMoZGF0YSwgYm9mZik7XG5cdFx0aWYobWF4bGVuIDwgdykgbWF4bGVuID0gdztcblx0XHRibF9jb3VudFt3XSsrO1xuXHRcdGJvZmYgKz0gMztcblx0fVxuXG5cdC8qIGJ1aWxkIGNvZGUgdHJlZSAqL1xuXHR2YXIgY2NvZGUgPSAwO1xuXHRibF9jb3VudFswXSA9IDA7XG5cdGZvcihpID0gMTsgaSA8PSBtYXhsZW47ICsraSkgbmV4dF9jb2RlW2ldID0gY2NvZGUgPSAoY2NvZGUgKyBibF9jb3VudFtpLTFdKTw8MTtcblx0Zm9yKGkgPSAwOyBpIDwgTDsgKytpKSBpZigoY2NvZGUgPSBjbGVuc1tpXSkgIT0gMCkgY3RyZWVbaV0gPSBuZXh0X2NvZGVbY2NvZGVdKys7XG5cdC8qIGNtYXBbNyBiaXRzIGZyb20gc3RyZWFtXSA9IChvZmYmNykgKyAobGl0PDwzKSAqL1xuXHR2YXIgY2xlbmkgPSAwO1xuXHRmb3IoaSA9IDA7IGkgPCBMOyArK2kpIHtcblx0XHRjbGVuaSA9IGNsZW5zW2ldO1xuXHRcdGlmKGNsZW5pICE9IDApIHtcblx0XHRcdGNjb2RlID0gYml0c3dhcDhbY3RyZWVbaV1dPj4oOC1jbGVuaSk7XG5cdFx0XHRmb3IodmFyIGogPSAoMTw8KDctY2xlbmkpKS0xOyBqPj0wOyAtLWopIGR5bl9jbWFwW2Njb2RlfChqPDxjbGVuaSldID0gKGNsZW5pJjcpIHwgKGk8PDMpO1xuXHRcdH1cblx0fVxuXG5cdC8qIHJlYWQgbGl0ZXJhbCBhbmQgZGlzdCBjb2RlcyBhdCBvbmNlICovXG5cdHZhciBoY29kZXMgPSBbXTtcblx0bWF4bGVuID0gMTtcblx0Zm9yKDsgaGNvZGVzLmxlbmd0aCA8IF9ITElUICsgX0hESVNUOykge1xuXHRcdGNjb2RlID0gZHluX2NtYXBbcmVhZF9iaXRzXzcoZGF0YSwgYm9mZildO1xuXHRcdGJvZmYgKz0gY2NvZGUgJiA3O1xuXHRcdHN3aXRjaCgoY2NvZGUgPj4+PSAzKSkge1xuXHRcdFx0Y2FzZSAxNjpcblx0XHRcdFx0dyA9IDMgKyByZWFkX2JpdHNfMihkYXRhLCBib2ZmKTsgYm9mZiArPSAyO1xuXHRcdFx0XHRjY29kZSA9IGhjb2Rlc1toY29kZXMubGVuZ3RoIC0gMV07XG5cdFx0XHRcdHdoaWxlKHctLSA+IDApIGhjb2Rlcy5wdXNoKGNjb2RlKTtcblx0XHRcdFx0YnJlYWs7XG5cdFx0XHRjYXNlIDE3OlxuXHRcdFx0XHR3ID0gMyArIHJlYWRfYml0c18zKGRhdGEsIGJvZmYpOyBib2ZmICs9IDM7XG5cdFx0XHRcdHdoaWxlKHctLSA+IDApIGhjb2Rlcy5wdXNoKDApO1xuXHRcdFx0XHRicmVhaztcblx0XHRcdGNhc2UgMTg6XG5cdFx0XHRcdHcgPSAxMSArIHJlYWRfYml0c183KGRhdGEsIGJvZmYpOyBib2ZmICs9IDc7XG5cdFx0XHRcdHdoaWxlKHcgLS0gPiAwKSBoY29kZXMucHVzaCgwKTtcblx0XHRcdFx0YnJlYWs7XG5cdFx0XHRkZWZhdWx0OlxuXHRcdFx0XHRoY29kZXMucHVzaChjY29kZSk7XG5cdFx0XHRcdGlmKG1heGxlbiA8IGNjb2RlKSBtYXhsZW4gPSBjY29kZTtcblx0XHRcdFx0YnJlYWs7XG5cdFx0fVxuXHR9XG5cblx0LyogYnVpbGQgbGl0ZXJhbCAvIGxlbmd0aCB0cmVlcyAqL1xuXHR2YXIgaDEgPSBoY29kZXMuc2xpY2UoMCwgX0hMSVQpLCBoMiA9IGhjb2Rlcy5zbGljZShfSExJVCk7XG5cdGZvcihpID0gX0hMSVQ7IGkgPCAyODY7ICsraSkgaDFbaV0gPSAwO1xuXHRmb3IoaSA9IF9IRElTVDsgaSA8IDMwOyArK2kpIGgyW2ldID0gMDtcblx0ZHluX2xlbl8xID0gYnVpbGRfdHJlZShoMSwgZHluX2xtYXAsIDI4Nik7XG5cdGR5bl9sZW5fMiA9IGJ1aWxkX3RyZWUoaDIsIGR5bl9kbWFwLCAzMCk7XG5cdHJldHVybiBib2ZmO1xufVxuXG4vKiByZXR1cm4gWyBkYXRhLCBieXRlc1JlYWQgXSAqL1xuZnVuY3Rpb24gaW5mbGF0ZShkYXRhLCB1c3opIHtcblx0Lyogc2hvcnRjaXJjdWl0IGZvciBlbXB0eSBidWZmZXIgWzB4MDMsIDB4MDBdICovXG5cdGlmKGRhdGFbMF0gPT0gMyAmJiAhKGRhdGFbMV0gJiAweDMpKSB7IHJldHVybiBbbmV3X3Jhd19idWYodXN6KSwgMl07IH1cblxuXHQvKiBiaXQgb2Zmc2V0ICovXG5cdHZhciBib2ZmID0gMDtcblxuXHQvKiBoZWFkZXIgaW5jbHVkZXMgZmluYWwgYml0IGFuZCB0eXBlIGJpdHMgKi9cblx0dmFyIGhlYWRlciA9IDA7XG5cblx0dmFyIG91dGJ1ZiA9IG5ld191bnNhZmVfYnVmKHVzeiA/IHVzeiA6ICgxPDwxOCkpO1xuXHR2YXIgd29mZiA9IDA7XG5cdHZhciBPTCA9IG91dGJ1Zi5sZW5ndGg+Pj4wO1xuXHR2YXIgbWF4X2xlbl8xID0gMCwgbWF4X2xlbl8yID0gMDtcblxuXHR3aGlsZSgoaGVhZGVyJjEpID09IDApIHtcblx0XHRoZWFkZXIgPSByZWFkX2JpdHNfMyhkYXRhLCBib2ZmKTsgYm9mZiArPSAzO1xuXHRcdGlmKChoZWFkZXIgPj4+IDEpID09IDApIHtcblx0XHRcdC8qIFN0b3JlZCBibG9jayAqL1xuXHRcdFx0aWYoYm9mZiAmIDcpIGJvZmYgKz0gOCAtIChib2ZmJjcpO1xuXHRcdFx0LyogMiBieXRlcyBzeiwgMiBieXRlcyBiaXQgaW52ZXJzZSAqL1xuXHRcdFx0dmFyIHN6ID0gZGF0YVtib2ZmPj4+M10gfCBkYXRhWyhib2ZmPj4+MykrMV08PDg7XG5cdFx0XHRib2ZmICs9IDMyO1xuXHRcdFx0LyogcHVzaCBzeiBieXRlcyAqL1xuXHRcdFx0aWYoIXVzeiAmJiBPTCA8IHdvZmYgKyBzeikgeyBvdXRidWYgPSByZWFsbG9jKG91dGJ1Ziwgd29mZiArIHN6KTsgT0wgPSBvdXRidWYubGVuZ3RoOyB9XG5cdFx0XHRpZih0eXBlb2YgZGF0YS5jb3B5ID09PSAnZnVuY3Rpb24nKSB7XG5cdFx0XHRcdC8vICRGbG93SWdub3JlXG5cdFx0XHRcdGRhdGEuY29weShvdXRidWYsIHdvZmYsIGJvZmY+Pj4zLCAoYm9mZj4+PjMpK3N6KTtcblx0XHRcdFx0d29mZiArPSBzejsgYm9mZiArPSA4KnN6O1xuXHRcdFx0fSBlbHNlIHdoaWxlKHN6LS0gPiAwKSB7IG91dGJ1Zlt3b2ZmKytdID0gZGF0YVtib2ZmPj4+M107IGJvZmYgKz0gODsgfVxuXHRcdFx0Y29udGludWU7XG5cdFx0fSBlbHNlIGlmKChoZWFkZXIgPj4+IDEpID09IDEpIHtcblx0XHRcdC8qIEZpeGVkIEh1ZmZtYW4gKi9cblx0XHRcdG1heF9sZW5fMSA9IDk7IG1heF9sZW5fMiA9IDU7XG5cdFx0fSBlbHNlIHtcblx0XHRcdC8qIER5bmFtaWMgSHVmZm1hbiAqL1xuXHRcdFx0Ym9mZiA9IGR5bihkYXRhLCBib2ZmKTtcblx0XHRcdG1heF9sZW5fMSA9IGR5bl9sZW5fMTsgbWF4X2xlbl8yID0gZHluX2xlbl8yO1xuXHRcdH1cblx0XHRpZighdXN6ICYmIChPTCA8IHdvZmYgKyAzMjc2NykpIHsgb3V0YnVmID0gcmVhbGxvYyhvdXRidWYsIHdvZmYgKyAzMjc2Nyk7IE9MID0gb3V0YnVmLmxlbmd0aDsgfVxuXHRcdGZvcig7OykgeyAvLyB3aGlsZSh0cnVlKSBpcyBhcHBhcmVudGx5IG91dCBvZiB2b2d1ZSBpbiBtb2Rlcm4gSlMgY2lyY2xlc1xuXHRcdFx0LyogaW5nZXN0IGNvZGUgYW5kIG1vdmUgcmVhZCBoZWFkICovXG5cdFx0XHR2YXIgYml0cyA9IHJlYWRfYml0c19uKGRhdGEsIGJvZmYsIG1heF9sZW5fMSk7XG5cdFx0XHR2YXIgY29kZSA9IChoZWFkZXI+Pj4xKSA9PSAxID8gZml4X2xtYXBbYml0c10gOiBkeW5fbG1hcFtiaXRzXTtcblx0XHRcdGJvZmYgKz0gY29kZSAmIDE1OyBjb2RlID4+Pj0gNDtcblx0XHRcdC8qIDAtMjU1IGFyZSBsaXRlcmFscywgMjU2IGlzIGVuZCBvZiBibG9jayB0b2tlbiwgMjU3KyBhcmUgY29weSB0b2tlbnMgKi9cblx0XHRcdGlmKCgoY29kZT4+PjgpJjB4RkYpID09PSAwKSBvdXRidWZbd29mZisrXSA9IGNvZGU7XG5cdFx0XHRlbHNlIGlmKGNvZGUgPT0gMjU2KSBicmVhaztcblx0XHRcdGVsc2Uge1xuXHRcdFx0XHRjb2RlIC09IDI1Nztcblx0XHRcdFx0dmFyIGxlbl9lYiA9IChjb2RlIDwgOCkgPyAwIDogKChjb2RlLTQpPj4yKTsgaWYobGVuX2ViID4gNSkgbGVuX2ViID0gMDtcblx0XHRcdFx0dmFyIHRndCA9IHdvZmYgKyBMRU5fTE5bY29kZV07XG5cdFx0XHRcdC8qIGxlbmd0aCBleHRyYSBiaXRzICovXG5cdFx0XHRcdGlmKGxlbl9lYiA+IDApIHtcblx0XHRcdFx0XHR0Z3QgKz0gcmVhZF9iaXRzX24oZGF0YSwgYm9mZiwgbGVuX2ViKTtcblx0XHRcdFx0XHRib2ZmICs9IGxlbl9lYjtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdC8qIGRpc3QgY29kZSAqL1xuXHRcdFx0XHRiaXRzID0gcmVhZF9iaXRzX24oZGF0YSwgYm9mZiwgbWF4X2xlbl8yKTtcblx0XHRcdFx0Y29kZSA9IChoZWFkZXI+Pj4xKSA9PSAxID8gZml4X2RtYXBbYml0c10gOiBkeW5fZG1hcFtiaXRzXTtcblx0XHRcdFx0Ym9mZiArPSBjb2RlICYgMTU7IGNvZGUgPj4+PSA0O1xuXHRcdFx0XHR2YXIgZHN0X2ViID0gKGNvZGUgPCA0ID8gMCA6IChjb2RlLTIpPj4xKTtcblx0XHRcdFx0dmFyIGRzdCA9IERTVF9MTltjb2RlXTtcblx0XHRcdFx0LyogZGlzdCBleHRyYSBiaXRzICovXG5cdFx0XHRcdGlmKGRzdF9lYiA+IDApIHtcblx0XHRcdFx0XHRkc3QgKz0gcmVhZF9iaXRzX24oZGF0YSwgYm9mZiwgZHN0X2ViKTtcblx0XHRcdFx0XHRib2ZmICs9IGRzdF9lYjtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdC8qIGluIHRoZSBjb21tb24gY2FzZSwgbWFudWFsIGJ5dGUgY29weSBpcyBmYXN0ZXIgdGhhbiBUQSBzZXQgLyBCdWZmZXIgY29weSAqL1xuXHRcdFx0XHRpZighdXN6ICYmIE9MIDwgdGd0KSB7IG91dGJ1ZiA9IHJlYWxsb2Mob3V0YnVmLCB0Z3QpOyBPTCA9IG91dGJ1Zi5sZW5ndGg7IH1cblx0XHRcdFx0d2hpbGUod29mZiA8IHRndCkgeyBvdXRidWZbd29mZl0gPSBvdXRidWZbd29mZiAtIGRzdF07ICsrd29mZjsgfVxuXHRcdFx0fVxuXHRcdH1cblx0fVxuXHRyZXR1cm4gW3VzeiA/IG91dGJ1ZiA6IG91dGJ1Zi5zbGljZSgwLCB3b2ZmKSwgKGJvZmYrNyk+Pj4zXTtcbn1cblxuZnVuY3Rpb24gX2luZmxhdGUocGF5bG9hZCwgdXN6KSB7XG5cdHZhciBkYXRhID0gcGF5bG9hZC5zbGljZShwYXlsb2FkLmx8fDApO1xuXHR2YXIgb3V0ID0gaW5mbGF0ZShkYXRhLCB1c3opO1xuXHRwYXlsb2FkLmwgKz0gb3V0WzFdO1xuXHRyZXR1cm4gb3V0WzBdO1xufVxuXG5mdW5jdGlvbiB3YXJuX29yX3Rocm93KHdybiwgbXNnKSB7XG5cdGlmKHdybikgeyBpZih0eXBlb2YgY29uc29sZSAhPT0gJ3VuZGVmaW5lZCcpIGNvbnNvbGUuZXJyb3IobXNnKTsgfVxuXHRlbHNlIHRocm93IG5ldyBFcnJvcihtc2cpO1xufVxuXG5mdW5jdGlvbiBwYXJzZV96aXAoZmlsZSwgb3B0aW9ucykge1xuXHR2YXIgYmxvYiA9IGZpbGU7XG5cdHByZXBfYmxvYihibG9iLCAwKTtcblxuXHR2YXIgRmlsZUluZGV4ID0gW10sIEZ1bGxQYXRocyA9IFtdO1xuXHR2YXIgbyA9IHtcblx0XHRGaWxlSW5kZXg6IEZpbGVJbmRleCxcblx0XHRGdWxsUGF0aHM6IEZ1bGxQYXRoc1xuXHR9O1xuXHRpbml0X2NmYihvLCB7IHJvb3Q6IG9wdGlvbnMucm9vdCB9KTtcblxuXHQvKiBmaW5kIGVuZCBvZiBjZW50cmFsIGRpcmVjdG9yeSwgc3RhcnQganVzdCBhZnRlciBzaWduYXR1cmUgKi9cblx0dmFyIGkgPSBibG9iLmxlbmd0aCAtIDQ7XG5cdHdoaWxlKChibG9iW2ldICE9IDB4NTAgfHwgYmxvYltpKzFdICE9IDB4NGIgfHwgYmxvYltpKzJdICE9IDB4MDUgfHwgYmxvYltpKzNdICE9IDB4MDYpICYmIGkgPj0gMCkgLS1pO1xuXHRibG9iLmwgPSBpICsgNDtcblxuXHQvKiBwYXJzZSBlbmQgb2YgY2VudHJhbCBkaXJlY3RvcnkgKi9cblx0YmxvYi5sICs9IDQ7XG5cdHZhciBmY250ID0gYmxvYi5yZWFkX3NoaWZ0KDIpO1xuXHRibG9iLmwgKz0gNjtcblx0dmFyIHN0YXJ0X2NkID0gYmxvYi5yZWFkX3NoaWZ0KDQpO1xuXG5cdC8qIHBhcnNlIGNlbnRyYWwgZGlyZWN0b3J5ICovXG5cdGJsb2IubCA9IHN0YXJ0X2NkO1xuXG5cdGZvcihpID0gMDsgaSA8IGZjbnQ7ICsraSkge1xuXHRcdC8qIHRydXN0IGxvY2FsIGZpbGUgaGVhZGVyIGluc3RlYWQgb2YgQ0QgZW50cnkgKi9cblx0XHRibG9iLmwgKz0gMjA7XG5cdFx0dmFyIGNzeiA9IGJsb2IucmVhZF9zaGlmdCg0KTtcblx0XHR2YXIgdXN6ID0gYmxvYi5yZWFkX3NoaWZ0KDQpO1xuXHRcdHZhciBuYW1lbGVuID0gYmxvYi5yZWFkX3NoaWZ0KDIpO1xuXHRcdHZhciBlZnN6ID0gYmxvYi5yZWFkX3NoaWZ0KDIpO1xuXHRcdHZhciBmY3N6ID0gYmxvYi5yZWFkX3NoaWZ0KDIpO1xuXHRcdGJsb2IubCArPSA4O1xuXHRcdHZhciBvZmZzZXQgPSBibG9iLnJlYWRfc2hpZnQoNCk7XG5cdFx0dmFyIEVGID0gcGFyc2VfZXh0cmFfZmllbGQoYmxvYi5zbGljZShibG9iLmwrbmFtZWxlbiwgYmxvYi5sK25hbWVsZW4rZWZzeikpO1xuXHRcdGJsb2IubCArPSBuYW1lbGVuICsgZWZzeiArIGZjc3o7XG5cblx0XHR2YXIgTCA9IGJsb2IubDtcblx0XHRibG9iLmwgPSBvZmZzZXQgKyA0O1xuXHRcdHBhcnNlX2xvY2FsX2ZpbGUoYmxvYiwgY3N6LCB1c3osIG8sIEVGKTtcblx0XHRibG9iLmwgPSBMO1xuXHR9XG5cblx0cmV0dXJuIG87XG59XG5cblxuLyogaGVhZCBzdGFydHMganVzdCBhZnRlciBsb2NhbCBmaWxlIGhlYWRlciBzaWduYXR1cmUgKi9cbmZ1bmN0aW9uIHBhcnNlX2xvY2FsX2ZpbGUoYmxvYiwgY3N6LCB1c3osIG8sIEVGKSB7XG5cdC8qIFtsb2NhbCBmaWxlIGhlYWRlcl0gKi9cblx0YmxvYi5sICs9IDI7XG5cdHZhciBmbGFncyA9IGJsb2IucmVhZF9zaGlmdCgyKTtcblx0dmFyIG1ldGggPSBibG9iLnJlYWRfc2hpZnQoMik7XG5cdHZhciBkYXRlID0gcGFyc2VfZG9zX2RhdGUoYmxvYik7XG5cblx0aWYoZmxhZ3MgJiAweDIwNDEpIHRocm93IG5ldyBFcnJvcihcIlVuc3VwcG9ydGVkIFpJUCBlbmNyeXB0aW9uXCIpO1xuXHR2YXIgY3JjMzIgPSBibG9iLnJlYWRfc2hpZnQoNCk7XG5cdHZhciBfY3N6ID0gYmxvYi5yZWFkX3NoaWZ0KDQpO1xuXHR2YXIgX3VzeiA9IGJsb2IucmVhZF9zaGlmdCg0KTtcblxuXHR2YXIgbmFtZWxlbiA9IGJsb2IucmVhZF9zaGlmdCgyKTtcblx0dmFyIGVmc3ogPSBibG9iLnJlYWRfc2hpZnQoMik7XG5cblx0Ly8gVE9ETzogZmxhZ3MgJiAoMTw8MTEpIC8vIFVURjhcblx0dmFyIG5hbWUgPSBcIlwiOyBmb3IodmFyIGkgPSAwOyBpIDwgbmFtZWxlbjsgKytpKSBuYW1lICs9IFN0cmluZy5mcm9tQ2hhckNvZGUoYmxvYltibG9iLmwrK10pO1xuXHRpZihlZnN6KSB7XG5cdFx0dmFyIGVmID0gcGFyc2VfZXh0cmFfZmllbGQoYmxvYi5zbGljZShibG9iLmwsIGJsb2IubCArIGVmc3opKTtcblx0XHRpZigoZWZbMHg1NDU1XXx8e30pLm10KSBkYXRlID0gZWZbMHg1NDU1XS5tdDtcblx0XHRpZigoKEVGfHx7fSlbMHg1NDU1XXx8e30pLm10KSBkYXRlID0gRUZbMHg1NDU1XS5tdDtcblx0fVxuXHRibG9iLmwgKz0gZWZzejtcblxuXHQvKiBbZW5jcnlwdGlvbiBoZWFkZXJdICovXG5cblx0LyogW2ZpbGUgZGF0YV0gKi9cblx0dmFyIGRhdGEgPSBibG9iLnNsaWNlKGJsb2IubCwgYmxvYi5sICsgX2Nzeik7XG5cdHN3aXRjaChtZXRoKSB7XG5cdFx0Y2FzZSA4OiBkYXRhID0gX2luZmxhdGVSYXdTeW5jKGJsb2IsIF91c3opOyBicmVhaztcblx0XHRjYXNlIDA6IGJyZWFrO1xuXHRcdGRlZmF1bHQ6IHRocm93IG5ldyBFcnJvcihcIlVuc3VwcG9ydGVkIFpJUCBDb21wcmVzc2lvbiBtZXRob2QgXCIgKyBtZXRoKTtcblx0fVxuXG5cdC8qIFtkYXRhIGRlc2NyaXB0b3JdICovXG5cdHZhciB3cm4gPSBmYWxzZTtcblx0aWYoZmxhZ3MgJiA4KSB7XG5cdFx0Y3JjMzIgPSBibG9iLnJlYWRfc2hpZnQoNCk7XG5cdFx0aWYoY3JjMzIgPT0gMHgwODA3NGI1MCkgeyBjcmMzMiA9IGJsb2IucmVhZF9zaGlmdCg0KTsgd3JuID0gdHJ1ZTsgfVxuXHRcdF9jc3ogPSBibG9iLnJlYWRfc2hpZnQoNCk7XG5cdFx0X3VzeiA9IGJsb2IucmVhZF9zaGlmdCg0KTtcblx0fVxuXG5cdGlmKF9jc3ogIT0gY3N6KSB3YXJuX29yX3Rocm93KHdybiwgXCJCYWQgY29tcHJlc3NlZCBzaXplOiBcIiArIGNzeiArIFwiICE9IFwiICsgX2Nzeik7XG5cdGlmKF91c3ogIT0gdXN6KSB3YXJuX29yX3Rocm93KHdybiwgXCJCYWQgdW5jb21wcmVzc2VkIHNpemU6IFwiICsgdXN6ICsgXCIgIT0gXCIgKyBfdXN6KTtcblx0dmFyIF9jcmMzMiA9IENSQzMyLmJ1ZihkYXRhLCAwKTtcblx0aWYoKGNyYzMyPj4wKSAhPSAoX2NyYzMyPj4wKSkgd2Fybl9vcl90aHJvdyh3cm4sIFwiQmFkIENSQzMyIGNoZWNrc3VtOiBcIiArIGNyYzMyICsgXCIgIT0gXCIgKyBfY3JjMzIpO1xuXHRjZmJfYWRkKG8sIG5hbWUsIGRhdGEsIHt1bnNhZmU6IHRydWUsIG10OiBkYXRlfSk7XG59XG5mdW5jdGlvbiB3cml0ZV96aXAoY2ZiLCBvcHRpb25zKSB7XG5cdHZhciBfb3B0cyA9IG9wdGlvbnMgfHwge307XG5cdHZhciBvdXQgPSBbXSwgY2RpcnMgPSBbXTtcblx0dmFyIG8gPSBuZXdfYnVmKDEpO1xuXHR2YXIgbWV0aG9kID0gKF9vcHRzLmNvbXByZXNzaW9uID8gOCA6IDApLCBmbGFncyA9IDA7XG5cdHZhciBkZXNjID0gZmFsc2U7XG5cdGlmKGRlc2MpIGZsYWdzIHw9IDg7XG5cdHZhciBpID0gMCwgaiA9IDA7XG5cblx0dmFyIHN0YXJ0X2NkID0gMCwgZmNudCA9IDA7XG5cdHZhciByb290ID0gY2ZiLkZ1bGxQYXRoc1swXSwgZnAgPSByb290LCBmaSA9IGNmYi5GaWxlSW5kZXhbMF07XG5cdHZhciBjcmNzID0gW107XG5cdHZhciBzel9jZCA9IDA7XG5cblx0Zm9yKGkgPSAxOyBpIDwgY2ZiLkZ1bGxQYXRocy5sZW5ndGg7ICsraSkge1xuXHRcdGZwID0gY2ZiLkZ1bGxQYXRoc1tpXS5zbGljZShyb290Lmxlbmd0aCk7IGZpID0gY2ZiLkZpbGVJbmRleFtpXTtcblx0XHRpZighZmkuc2l6ZSB8fCAhZmkuY29udGVudCB8fCBmcCA9PSBcIlxcdTAwMDFTaDMzdEo1XCIpIGNvbnRpbnVlO1xuXHRcdHZhciBzdGFydCA9IHN0YXJ0X2NkO1xuXG5cdFx0LyogVE9ETzogQ1A0MzcgZmlsZW5hbWUgKi9cblx0XHR2YXIgbmFtZWJ1ZiA9IG5ld19idWYoZnAubGVuZ3RoKTtcblx0XHRmb3IoaiA9IDA7IGogPCBmcC5sZW5ndGg7ICsraikgbmFtZWJ1Zi53cml0ZV9zaGlmdCgxLCBmcC5jaGFyQ29kZUF0KGopICYgMHg3Rik7XG5cdFx0bmFtZWJ1ZiA9IG5hbWVidWYuc2xpY2UoMCwgbmFtZWJ1Zi5sKTtcblx0XHRjcmNzW2ZjbnRdID0gQ1JDMzIuYnVmKGZpLmNvbnRlbnQsIDApO1xuXG5cdFx0dmFyIG91dGJ1ZiA9IGZpLmNvbnRlbnQ7XG5cdFx0aWYobWV0aG9kID09IDgpIG91dGJ1ZiA9IF9kZWZsYXRlUmF3U3luYyhvdXRidWYpO1xuXG5cdFx0LyogbG9jYWwgZmlsZSBoZWFkZXIgKi9cblx0XHRvID0gbmV3X2J1ZigzMCk7XG5cdFx0by53cml0ZV9zaGlmdCg0LCAweDA0MDM0YjUwKTtcblx0XHRvLndyaXRlX3NoaWZ0KDIsIDIwKTtcblx0XHRvLndyaXRlX3NoaWZ0KDIsIGZsYWdzKTtcblx0XHRvLndyaXRlX3NoaWZ0KDIsIG1ldGhvZCk7XG5cdFx0LyogVE9ETzogbGFzdCBtb2QgZmlsZSB0aW1lL2RhdGUgKi9cblx0XHRpZihmaS5tdCkgd3JpdGVfZG9zX2RhdGUobywgZmkubXQpO1xuXHRcdGVsc2Ugby53cml0ZV9zaGlmdCg0LCAwKTtcblx0XHRvLndyaXRlX3NoaWZ0KC00LCAoZmxhZ3MgJiA4KSA/IDAgOiBjcmNzW2ZjbnRdKTtcblx0XHRvLndyaXRlX3NoaWZ0KDQsICAoZmxhZ3MgJiA4KSA/IDAgOiBvdXRidWYubGVuZ3RoKTtcblx0XHRvLndyaXRlX3NoaWZ0KDQsICAoZmxhZ3MgJiA4KSA/IDAgOiBmaS5jb250ZW50Lmxlbmd0aCk7XG5cdFx0by53cml0ZV9zaGlmdCgyLCBuYW1lYnVmLmxlbmd0aCk7XG5cdFx0by53cml0ZV9zaGlmdCgyLCAwKTtcblxuXHRcdHN0YXJ0X2NkICs9IG8ubGVuZ3RoO1xuXHRcdG91dC5wdXNoKG8pO1xuXHRcdHN0YXJ0X2NkICs9IG5hbWVidWYubGVuZ3RoO1xuXHRcdG91dC5wdXNoKG5hbWVidWYpO1xuXG5cdFx0LyogVE9ETzogZW5jcnlwdGlvbiBoZWFkZXIgPyAqL1xuXHRcdHN0YXJ0X2NkICs9IG91dGJ1Zi5sZW5ndGg7XG5cdFx0b3V0LnB1c2gob3V0YnVmKTtcblxuXHRcdC8qIGRhdGEgZGVzY3JpcHRvciAqL1xuXHRcdGlmKGZsYWdzICYgOCkge1xuXHRcdFx0byA9IG5ld19idWYoMTIpO1xuXHRcdFx0by53cml0ZV9zaGlmdCgtNCwgY3Jjc1tmY250XSk7XG5cdFx0XHRvLndyaXRlX3NoaWZ0KDQsIG91dGJ1Zi5sZW5ndGgpO1xuXHRcdFx0by53cml0ZV9zaGlmdCg0LCBmaS5jb250ZW50Lmxlbmd0aCk7XG5cdFx0XHRzdGFydF9jZCArPSBvLmw7XG5cdFx0XHRvdXQucHVzaChvKTtcblx0XHR9XG5cblx0XHQvKiBjZW50cmFsIGRpcmVjdG9yeSAqL1xuXHRcdG8gPSBuZXdfYnVmKDQ2KTtcblx0XHRvLndyaXRlX3NoaWZ0KDQsIDB4MDIwMTRiNTApO1xuXHRcdG8ud3JpdGVfc2hpZnQoMiwgMCk7XG5cdFx0by53cml0ZV9zaGlmdCgyLCAyMCk7XG5cdFx0by53cml0ZV9zaGlmdCgyLCBmbGFncyk7XG5cdFx0by53cml0ZV9zaGlmdCgyLCBtZXRob2QpO1xuXHRcdG8ud3JpdGVfc2hpZnQoNCwgMCk7IC8qIFRPRE86IGxhc3QgbW9kIGZpbGUgdGltZS9kYXRlICovXG5cdFx0by53cml0ZV9zaGlmdCgtNCwgY3Jjc1tmY250XSk7XG5cblx0XHRvLndyaXRlX3NoaWZ0KDQsIG91dGJ1Zi5sZW5ndGgpO1xuXHRcdG8ud3JpdGVfc2hpZnQoNCwgZmkuY29udGVudC5sZW5ndGgpO1xuXHRcdG8ud3JpdGVfc2hpZnQoMiwgbmFtZWJ1Zi5sZW5ndGgpO1xuXHRcdG8ud3JpdGVfc2hpZnQoMiwgMCk7XG5cdFx0by53cml0ZV9zaGlmdCgyLCAwKTtcblx0XHRvLndyaXRlX3NoaWZ0KDIsIDApO1xuXHRcdG8ud3JpdGVfc2hpZnQoMiwgMCk7XG5cdFx0by53cml0ZV9zaGlmdCg0LCAwKTtcblx0XHRvLndyaXRlX3NoaWZ0KDQsIHN0YXJ0KTtcblxuXHRcdHN6X2NkICs9IG8ubDtcblx0XHRjZGlycy5wdXNoKG8pO1xuXHRcdHN6X2NkICs9IG5hbWVidWYubGVuZ3RoO1xuXHRcdGNkaXJzLnB1c2gobmFtZWJ1Zik7XG5cdFx0KytmY250O1xuXHR9XG5cblx0LyogZW5kIG9mIGNlbnRyYWwgZGlyZWN0b3J5ICovXG5cdG8gPSBuZXdfYnVmKDIyKTtcblx0by53cml0ZV9zaGlmdCg0LCAweDA2MDU0YjUwKTtcblx0by53cml0ZV9zaGlmdCgyLCAwKTtcblx0by53cml0ZV9zaGlmdCgyLCAwKTtcblx0by53cml0ZV9zaGlmdCgyLCBmY250KTtcblx0by53cml0ZV9zaGlmdCgyLCBmY250KTtcblx0by53cml0ZV9zaGlmdCg0LCBzel9jZCk7XG5cdG8ud3JpdGVfc2hpZnQoNCwgc3RhcnRfY2QpO1xuXHRvLndyaXRlX3NoaWZ0KDIsIDApO1xuXG5cdHJldHVybiBiY29uY2F0KChbYmNvbmNhdCgob3V0KSksIGJjb25jYXQoY2RpcnMpLCBvXSkpO1xufVxuZnVuY3Rpb24gY2ZiX25ldyhvcHRzKSB7XG5cdHZhciBvID0gKHt9KTtcblx0aW5pdF9jZmIobywgb3B0cyk7XG5cdHJldHVybiBvO1xufVxuXG5mdW5jdGlvbiBjZmJfYWRkKGNmYiwgbmFtZSwgY29udGVudCwgb3B0cykge1xuXHR2YXIgdW5zYWZlID0gb3B0cyAmJiBvcHRzLnVuc2FmZTtcblx0aWYoIXVuc2FmZSkgaW5pdF9jZmIoY2ZiKTtcblx0dmFyIGZpbGUgPSAhdW5zYWZlICYmIENGQi5maW5kKGNmYiwgbmFtZSk7XG5cdGlmKCFmaWxlKSB7XG5cdFx0dmFyIGZwYXRoID0gY2ZiLkZ1bGxQYXRoc1swXTtcblx0XHRpZihuYW1lLnNsaWNlKDAsIGZwYXRoLmxlbmd0aCkgPT0gZnBhdGgpIGZwYXRoID0gbmFtZTtcblx0XHRlbHNlIHtcblx0XHRcdGlmKGZwYXRoLnNsaWNlKC0xKSAhPSBcIi9cIikgZnBhdGggKz0gXCIvXCI7XG5cdFx0XHRmcGF0aCA9IChmcGF0aCArIG5hbWUpLnJlcGxhY2UoXCIvL1wiLFwiL1wiKTtcblx0XHR9XG5cdFx0ZmlsZSA9ICh7bmFtZTogZmlsZW5hbWUobmFtZSksIHR5cGU6IDJ9KTtcblx0XHRjZmIuRmlsZUluZGV4LnB1c2goZmlsZSk7XG5cdFx0Y2ZiLkZ1bGxQYXRocy5wdXNoKGZwYXRoKTtcblx0XHRpZighdW5zYWZlKSBDRkIudXRpbHMuY2ZiX2djKGNmYik7XG5cdH1cbmZpbGUuY29udGVudCA9IChjb250ZW50KTtcblx0ZmlsZS5zaXplID0gY29udGVudCA/IGNvbnRlbnQubGVuZ3RoIDogMDtcblx0aWYob3B0cykge1xuXHRcdGlmKG9wdHMuQ0xTSUQpIGZpbGUuY2xzaWQgPSBvcHRzLkNMU0lEO1xuXHRcdGlmKG9wdHMubXQpIGZpbGUubXQgPSBvcHRzLm10O1xuXHRcdGlmKG9wdHMuY3QpIGZpbGUuY3QgPSBvcHRzLmN0O1xuXHR9XG5cdHJldHVybiBmaWxlO1xufVxuXG5mdW5jdGlvbiBjZmJfZGVsKGNmYiwgbmFtZSkge1xuXHRpbml0X2NmYihjZmIpO1xuXHR2YXIgZmlsZSA9IENGQi5maW5kKGNmYiwgbmFtZSk7XG5cdGlmKGZpbGUpIGZvcih2YXIgaiA9IDA7IGogPCBjZmIuRmlsZUluZGV4Lmxlbmd0aDsgKytqKSBpZihjZmIuRmlsZUluZGV4W2pdID09IGZpbGUpIHtcblx0XHRjZmIuRmlsZUluZGV4LnNwbGljZShqLCAxKTtcblx0XHRjZmIuRnVsbFBhdGhzLnNwbGljZShqLCAxKTtcblx0XHRyZXR1cm4gdHJ1ZTtcblx0fVxuXHRyZXR1cm4gZmFsc2U7XG59XG5cbmZ1bmN0aW9uIGNmYl9tb3YoY2ZiLCBvbGRfbmFtZSwgbmV3X25hbWUpIHtcblx0aW5pdF9jZmIoY2ZiKTtcblx0dmFyIGZpbGUgPSBDRkIuZmluZChjZmIsIG9sZF9uYW1lKTtcblx0aWYoZmlsZSkgZm9yKHZhciBqID0gMDsgaiA8IGNmYi5GaWxlSW5kZXgubGVuZ3RoOyArK2opIGlmKGNmYi5GaWxlSW5kZXhbal0gPT0gZmlsZSkge1xuXHRcdGNmYi5GaWxlSW5kZXhbal0ubmFtZSA9IGZpbGVuYW1lKG5ld19uYW1lKTtcblx0XHRjZmIuRnVsbFBhdGhzW2pdID0gbmV3X25hbWU7XG5cdFx0cmV0dXJuIHRydWU7XG5cdH1cblx0cmV0dXJuIGZhbHNlO1xufVxuXG5mdW5jdGlvbiBjZmJfZ2MoY2ZiKSB7IHJlYnVpbGRfY2ZiKGNmYiwgdHJ1ZSk7IH1cblxuZXhwb3J0cy5maW5kID0gZmluZDtcbmV4cG9ydHMucmVhZCA9IHJlYWQ7XG5leHBvcnRzLnBhcnNlID0gcGFyc2U7XG5leHBvcnRzLndyaXRlID0gd3JpdGU7XG5leHBvcnRzLndyaXRlRmlsZSA9IHdyaXRlX2ZpbGU7XG5leHBvcnRzLnV0aWxzID0ge1xuXHRjZmJfbmV3OiBjZmJfbmV3LFxuXHRjZmJfYWRkOiBjZmJfYWRkLFxuXHRjZmJfZGVsOiBjZmJfZGVsLFxuXHRjZmJfbW92OiBjZmJfbW92LFxuXHRjZmJfZ2M6IGNmYl9nYyxcblx0UmVhZFNoaWZ0OiBSZWFkU2hpZnQsXG5cdENoZWNrRmllbGQ6IENoZWNrRmllbGQsXG5cdHByZXBfYmxvYjogcHJlcF9ibG9iLFxuXHRiY29uY2F0OiBiY29uY2F0LFxuXHR1c2VfemxpYjogdXNlX3psaWIsXG5cdF9kZWZsYXRlUmF3OiBfZGVmbGF0ZSxcblx0X2luZmxhdGVSYXc6IF9pbmZsYXRlLFxuXHRjb25zdHM6IGNvbnN0c1xufTtcblxucmV0dXJuIGV4cG9ydHM7XG59KSgpO1xuXG5pZih0eXBlb2YgcmVxdWlyZSAhPT0gJ3VuZGVmaW5lZCcgJiYgdHlwZW9mIG1vZHVsZSAhPT0gJ3VuZGVmaW5lZCcgJiYgdHlwZW9mIERPX05PVF9FWFBPUlRfQ0ZCID09PSAndW5kZWZpbmVkJykgeyBtb2R1bGUuZXhwb3J0cyA9IENGQjsgfVxudmFyIF9mcztcbmlmKHR5cGVvZiByZXF1aXJlICE9PSAndW5kZWZpbmVkJykgdHJ5IHsgX2ZzID0gcmVxdWlyZSgnZnMnKTsgfSBjYXRjaChlKSB7fVxuXG4vKiBub3JtYWxpemUgZGF0YSBmb3IgYmxvYiBjdG9yICovXG5mdW5jdGlvbiBibG9iaWZ5KGRhdGEpIHtcblx0aWYodHlwZW9mIGRhdGEgPT09IFwic3RyaW5nXCIpIHJldHVybiBzMmFiKGRhdGEpO1xuXHRpZihBcnJheS5pc0FycmF5KGRhdGEpKSByZXR1cm4gYTJ1KGRhdGEpO1xuXHRyZXR1cm4gZGF0YTtcbn1cbi8qIHdyaXRlIG9yIGRvd25sb2FkIGZpbGUgKi9cbmZ1bmN0aW9uIHdyaXRlX2RsKGZuYW1lLCBwYXlsb2FkLCBlbmMpIHtcblx0LypnbG9iYWwgSUVfU2F2ZUZpbGUsIEJsb2IsIG5hdmlnYXRvciwgc2F2ZUFzLCBkb2N1bWVudCwgRmlsZSwgY2hyb21lICovXG5cdGlmKHR5cGVvZiBfZnMgIT09ICd1bmRlZmluZWQnICYmIF9mcy53cml0ZUZpbGVTeW5jKSByZXR1cm4gZW5jID8gX2ZzLndyaXRlRmlsZVN5bmMoZm5hbWUsIHBheWxvYWQsIGVuYykgOiBfZnMud3JpdGVGaWxlU3luYyhmbmFtZSwgcGF5bG9hZCk7XG5cdHZhciBkYXRhID0gKGVuYyA9PSBcInV0ZjhcIikgPyB1dGY4d3JpdGUocGF5bG9hZCkgOiBwYXlsb2FkO1xuaWYodHlwZW9mIElFX1NhdmVGaWxlICE9PSAndW5kZWZpbmVkJykgcmV0dXJuIElFX1NhdmVGaWxlKGRhdGEsIGZuYW1lKTtcblx0aWYodHlwZW9mIEJsb2IgIT09ICd1bmRlZmluZWQnKSB7XG5cdFx0dmFyIGJsb2IgPSBuZXcgQmxvYihbYmxvYmlmeShkYXRhKV0sIHt0eXBlOlwiYXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtXCJ9KTtcbmlmKHR5cGVvZiBuYXZpZ2F0b3IgIT09ICd1bmRlZmluZWQnICYmIG5hdmlnYXRvci5tc1NhdmVCbG9iKSByZXR1cm4gbmF2aWdhdG9yLm1zU2F2ZUJsb2IoYmxvYiwgZm5hbWUpO1xuaWYodHlwZW9mIHNhdmVBcyAhPT0gJ3VuZGVmaW5lZCcpIHJldHVybiBzYXZlQXMoYmxvYiwgZm5hbWUpO1xuXHRcdGlmKHR5cGVvZiBVUkwgIT09ICd1bmRlZmluZWQnICYmIHR5cGVvZiBkb2N1bWVudCAhPT0gJ3VuZGVmaW5lZCcgJiYgZG9jdW1lbnQuY3JlYXRlRWxlbWVudCAmJiBVUkwuY3JlYXRlT2JqZWN0VVJMKSB7XG5cdFx0XHR2YXIgdXJsID0gVVJMLmNyZWF0ZU9iamVjdFVSTChibG9iKTtcbmlmKHR5cGVvZiBjaHJvbWUgPT09ICdvYmplY3QnICYmIHR5cGVvZiAoY2hyb21lLmRvd25sb2Fkc3x8e30pLmRvd25sb2FkID09IFwiZnVuY3Rpb25cIikge1xuXHRcdFx0XHRpZihVUkwucmV2b2tlT2JqZWN0VVJMICYmIHR5cGVvZiBzZXRUaW1lb3V0ICE9PSAndW5kZWZpbmVkJykgc2V0VGltZW91dChmdW5jdGlvbigpIHsgVVJMLnJldm9rZU9iamVjdFVSTCh1cmwpOyB9LCA2MDAwMCk7XG5cdFx0XHRcdHJldHVybiBjaHJvbWUuZG93bmxvYWRzLmRvd25sb2FkKHsgdXJsOiB1cmwsIGZpbGVuYW1lOiBmbmFtZSwgc2F2ZUFzOiB0cnVlfSk7XG5cdFx0XHR9XG5cdFx0XHR2YXIgYSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJhXCIpO1xuXHRcdFx0aWYoYS5kb3dubG9hZCAhPSBudWxsKSB7XG5hLmRvd25sb2FkID0gZm5hbWU7IGEuaHJlZiA9IHVybDsgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChhKTsgYS5jbGljaygpO1xuZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZChhKTtcblx0XHRcdFx0aWYoVVJMLnJldm9rZU9iamVjdFVSTCAmJiB0eXBlb2Ygc2V0VGltZW91dCAhPT0gJ3VuZGVmaW5lZCcpIHNldFRpbWVvdXQoZnVuY3Rpb24oKSB7IFVSTC5yZXZva2VPYmplY3RVUkwodXJsKTsgfSwgNjAwMDApO1xuXHRcdFx0XHRyZXR1cm4gdXJsO1xuXHRcdFx0fVxuXHRcdH1cblx0fVxuXHQvLyAkRmxvd0lnbm9yZVxuXHRpZih0eXBlb2YgJCAhPT0gJ3VuZGVmaW5lZCcgJiYgdHlwZW9mIEZpbGUgIT09ICd1bmRlZmluZWQnICYmIHR5cGVvZiBGb2xkZXIgIT09ICd1bmRlZmluZWQnKSB0cnkgeyAvLyBleHRlbmRzY3JpcHRcblx0XHQvLyAkRmxvd0lnbm9yZVxuXHRcdHZhciBvdXQgPSBGaWxlKGZuYW1lKTsgb3V0Lm9wZW4oXCJ3XCIpOyBvdXQuZW5jb2RpbmcgPSBcImJpbmFyeVwiO1xuXHRcdGlmKEFycmF5LmlzQXJyYXkocGF5bG9hZCkpIHBheWxvYWQgPSBhMnMocGF5bG9hZCk7XG5cdFx0b3V0LndyaXRlKHBheWxvYWQpOyBvdXQuY2xvc2UoKTsgcmV0dXJuIHBheWxvYWQ7XG5cdH0gY2F0Y2goZSkgeyBpZighZS5tZXNzYWdlIHx8ICFlLm1lc3NhZ2UubWF0Y2goL29uc3RydWN0LykpIHRocm93IGU7IH1cblx0dGhyb3cgbmV3IEVycm9yKFwiY2Fubm90IHNhdmUgZmlsZSBcIiArIGZuYW1lKTtcbn1cblxuLyogcmVhZCBiaW5hcnkgZGF0YSBmcm9tIGZpbGUgKi9cbmZ1bmN0aW9uIHJlYWRfYmluYXJ5KHBhdGgpIHtcblx0aWYodHlwZW9mIF9mcyAhPT0gJ3VuZGVmaW5lZCcpIHJldHVybiBfZnMucmVhZEZpbGVTeW5jKHBhdGgpO1xuXHQvLyAkRmxvd0lnbm9yZVxuXHRpZih0eXBlb2YgJCAhPT0gJ3VuZGVmaW5lZCcgJiYgdHlwZW9mIEZpbGUgIT09ICd1bmRlZmluZWQnICYmIHR5cGVvZiBGb2xkZXIgIT09ICd1bmRlZmluZWQnKSB0cnkgeyAvLyBleHRlbmRzY3JpcHRcblx0XHQvLyAkRmxvd0lnbm9yZVxuXHRcdHZhciBpbmZpbGUgPSBGaWxlKHBhdGgpOyBpbmZpbGUub3BlbihcInJcIik7IGluZmlsZS5lbmNvZGluZyA9IFwiYmluYXJ5XCI7XG5cdFx0dmFyIGRhdGEgPSBpbmZpbGUucmVhZCgpOyBpbmZpbGUuY2xvc2UoKTtcblx0XHRyZXR1cm4gZGF0YTtcblx0fSBjYXRjaChlKSB7IGlmKCFlLm1lc3NhZ2UgfHwgIWUubWVzc2FnZS5tYXRjaCgvb25zdHJ1Y3QvKSkgdGhyb3cgZTsgfVxuXHR0aHJvdyBuZXcgRXJyb3IoXCJDYW5ub3QgYWNjZXNzIGZpbGUgXCIgKyBwYXRoKTtcbn1cbmZ1bmN0aW9uIGtleXMobykge1xuXHR2YXIga3MgPSBPYmplY3Qua2V5cyhvKSwgbzIgPSBbXTtcblx0Zm9yKHZhciBpID0gMDsgaSA8IGtzLmxlbmd0aDsgKytpKSBpZihPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwobywga3NbaV0pKSBvMi5wdXNoKGtzW2ldKTtcblx0cmV0dXJuIG8yO1xufVxuXG5mdW5jdGlvbiBldmVydF9rZXkob2JqLCBrZXkpIHtcblx0dmFyIG8gPSAoW10pLCBLID0ga2V5cyhvYmopO1xuXHRmb3IodmFyIGkgPSAwOyBpICE9PSBLLmxlbmd0aDsgKytpKSBpZihvW29ialtLW2ldXVtrZXldXSA9PSBudWxsKSBvW29ialtLW2ldXVtrZXldXSA9IEtbaV07XG5cdHJldHVybiBvO1xufVxuXG5mdW5jdGlvbiBldmVydChvYmopIHtcblx0dmFyIG8gPSAoW10pLCBLID0ga2V5cyhvYmopO1xuXHRmb3IodmFyIGkgPSAwOyBpICE9PSBLLmxlbmd0aDsgKytpKSBvW29ialtLW2ldXV0gPSBLW2ldO1xuXHRyZXR1cm4gbztcbn1cblxuZnVuY3Rpb24gZXZlcnRfbnVtKG9iaikge1xuXHR2YXIgbyA9IChbXSksIEsgPSBrZXlzKG9iaik7XG5cdGZvcih2YXIgaSA9IDA7IGkgIT09IEsubGVuZ3RoOyArK2kpIG9bb2JqW0tbaV1dXSA9IHBhcnNlSW50KEtbaV0sMTApO1xuXHRyZXR1cm4gbztcbn1cblxuZnVuY3Rpb24gZXZlcnRfYXJyKG9iaikge1xuXHR2YXIgbyA9IChbXSksIEsgPSBrZXlzKG9iaik7XG5cdGZvcih2YXIgaSA9IDA7IGkgIT09IEsubGVuZ3RoOyArK2kpIHtcblx0XHRpZihvW29ialtLW2ldXV0gPT0gbnVsbCkgb1tvYmpbS1tpXV1dID0gW107XG5cdFx0b1tvYmpbS1tpXV1dLnB1c2goS1tpXSk7XG5cdH1cblx0cmV0dXJuIG87XG59XG5cbnZhciBiYXNlZGF0ZSA9IG5ldyBEYXRlKDE4OTksIDExLCAzMCwgMCwgMCwgMCk7IC8vIDIyMDkxNjE2MDAwMDBcbmZ1bmN0aW9uIGRhdGVudW0odiwgZGF0ZTE5MDQpIHtcblx0dmFyIGVwb2NoID0gdi5nZXRUaW1lKCk7XG5cdGlmKGRhdGUxOTA0KSBlcG9jaCAtPSAxNDYyKjI0KjYwKjYwKjEwMDA7XG5cdHZhciBkbnRocmVzaCA9IGJhc2VkYXRlLmdldFRpbWUoKSArICh2LmdldFRpbWV6b25lT2Zmc2V0KCkgLSBiYXNlZGF0ZS5nZXRUaW1lem9uZU9mZnNldCgpKSAqIDYwMDAwO1xuXHRyZXR1cm4gKGVwb2NoIC0gZG50aHJlc2gpIC8gKDI0ICogNjAgKiA2MCAqIDEwMDApO1xufVxudmFyIHJlZmRhdGUgPSBuZXcgRGF0ZSgpO1xudmFyIGRudGhyZXNoID0gYmFzZWRhdGUuZ2V0VGltZSgpICsgKHJlZmRhdGUuZ2V0VGltZXpvbmVPZmZzZXQoKSAtIGJhc2VkYXRlLmdldFRpbWV6b25lT2Zmc2V0KCkpICogNjAwMDA7XG52YXIgcmVmb2Zmc2V0ID0gcmVmZGF0ZS5nZXRUaW1lem9uZU9mZnNldCgpO1xuZnVuY3Rpb24gbnVtZGF0ZSh2KSB7XG5cdHZhciBvdXQgPSBuZXcgRGF0ZSgpO1xuXHRvdXQuc2V0VGltZSh2ICogMjQgKiA2MCAqIDYwICogMTAwMCArIGRudGhyZXNoKTtcblx0aWYgKG91dC5nZXRUaW1lem9uZU9mZnNldCgpICE9PSByZWZvZmZzZXQpIHtcblx0XHRvdXQuc2V0VGltZShvdXQuZ2V0VGltZSgpICsgKG91dC5nZXRUaW1lem9uZU9mZnNldCgpIC0gcmVmb2Zmc2V0KSAqIDYwMDAwKTtcblx0fVxuXHRyZXR1cm4gb3V0O1xufVxuXG4vKiBJU08gODYwMSBEdXJhdGlvbiAqL1xuZnVuY3Rpb24gcGFyc2VfaXNvZHVyKHMpIHtcblx0dmFyIHNlYyA9IDAsIG10ID0gMCwgdGltZSA9IGZhbHNlO1xuXHR2YXIgbSA9IHMubWF0Y2goL1AoWzAtOVxcLl0rWSk/KFswLTlcXC5dK00pPyhbMC05XFwuXStEKT9UKFswLTlcXC5dK0gpPyhbMC05XFwuXStNKT8oWzAtOVxcLl0rUyk/Lyk7XG5cdGlmKCFtKSB0aHJvdyBuZXcgRXJyb3IoXCJ8XCIgKyBzICsgXCJ8IGlzIG5vdCBhbiBJU084NjAxIER1cmF0aW9uXCIpO1xuXHRmb3IodmFyIGkgPSAxOyBpICE9IG0ubGVuZ3RoOyArK2kpIHtcblx0XHRpZighbVtpXSkgY29udGludWU7XG5cdFx0bXQgPSAxO1xuXHRcdGlmKGkgPiAzKSB0aW1lID0gdHJ1ZTtcblx0XHRzd2l0Y2gobVtpXS5zbGljZShtW2ldLmxlbmd0aC0xKSkge1xuXHRcdFx0Y2FzZSAnWSc6XG5cdFx0XHRcdHRocm93IG5ldyBFcnJvcihcIlVuc3VwcG9ydGVkIElTTyBEdXJhdGlvbiBGaWVsZDogXCIgKyBtW2ldLnNsaWNlKG1baV0ubGVuZ3RoLTEpKTtcblx0XHRcdGNhc2UgJ0QnOiBtdCAqPSAyNDtcblx0XHRcdFx0LyogZmFsbHMgdGhyb3VnaCAqL1xuXHRcdFx0Y2FzZSAnSCc6IG10ICo9IDYwO1xuXHRcdFx0XHQvKiBmYWxscyB0aHJvdWdoICovXG5cdFx0XHRjYXNlICdNJzpcblx0XHRcdFx0aWYoIXRpbWUpIHRocm93IG5ldyBFcnJvcihcIlVuc3VwcG9ydGVkIElTTyBEdXJhdGlvbiBGaWVsZDogTVwiKTtcblx0XHRcdFx0ZWxzZSBtdCAqPSA2MDtcblx0XHRcdFx0LyogZmFsbHMgdGhyb3VnaCAqL1xuXHRcdFx0Y2FzZSAnUyc6IGJyZWFrO1xuXHRcdH1cblx0XHRzZWMgKz0gbXQgKiBwYXJzZUludChtW2ldLCAxMCk7XG5cdH1cblx0cmV0dXJuIHNlYztcbn1cblxudmFyIGdvb2RfcGRfZGF0ZSA9IG5ldyBEYXRlKCcyMDE3LTAyLTE5VDE5OjA2OjA5LjAwMFonKTtcbmlmKGlzTmFOKGdvb2RfcGRfZGF0ZS5nZXRGdWxsWWVhcigpKSkgZ29vZF9wZF9kYXRlID0gbmV3IERhdGUoJzIvMTkvMTcnKTtcbnZhciBnb29kX3BkID0gZ29vZF9wZF9kYXRlLmdldEZ1bGxZZWFyKCkgPT0gMjAxNztcbi8qIHBhcnNlcyBhIGRhdGUgYXMgYSBsb2NhbCBkYXRlICovXG5mdW5jdGlvbiBwYXJzZURhdGUoc3RyLCBmaXhkYXRlKSB7XG5cdHZhciBkID0gbmV3IERhdGUoc3RyKTtcblx0aWYoZ29vZF9wZCkge1xuaWYoZml4ZGF0ZSA+IDApIGQuc2V0VGltZShkLmdldFRpbWUoKSArIGQuZ2V0VGltZXpvbmVPZmZzZXQoKSAqIDYwICogMTAwMCk7XG5cdFx0ZWxzZSBpZihmaXhkYXRlIDwgMCkgZC5zZXRUaW1lKGQuZ2V0VGltZSgpIC0gZC5nZXRUaW1lem9uZU9mZnNldCgpICogNjAgKiAxMDAwKTtcblx0XHRyZXR1cm4gZDtcblx0fVxuXHRpZihzdHIgaW5zdGFuY2VvZiBEYXRlKSByZXR1cm4gc3RyO1xuXHRpZihnb29kX3BkX2RhdGUuZ2V0RnVsbFllYXIoKSA9PSAxOTE3ICYmICFpc05hTihkLmdldEZ1bGxZZWFyKCkpKSB7XG5cdFx0dmFyIHMgPSBkLmdldEZ1bGxZZWFyKCk7XG5cdFx0aWYoc3RyLmluZGV4T2YoXCJcIiArIHMpID4gLTEpIHJldHVybiBkO1xuXHRcdGQuc2V0RnVsbFllYXIoZC5nZXRGdWxsWWVhcigpICsgMTAwKTsgcmV0dXJuIGQ7XG5cdH1cblx0dmFyIG4gPSBzdHIubWF0Y2goL1xcZCsvZyl8fFtcIjIwMTdcIixcIjJcIixcIjE5XCIsXCIwXCIsXCIwXCIsXCIwXCJdO1xuXHR2YXIgb3V0ID0gbmV3IERhdGUoK25bMF0sICtuWzFdIC0gMSwgK25bMl0sICgrblszXXx8MCksICgrbls0XXx8MCksICgrbls1XXx8MCkpO1xuXHRpZihzdHIuaW5kZXhPZihcIlpcIikgPiAtMSkgb3V0ID0gbmV3IERhdGUob3V0LmdldFRpbWUoKSAtIG91dC5nZXRUaW1lem9uZU9mZnNldCgpICogNjAgKiAxMDAwKTtcblx0cmV0dXJuIG91dDtcbn1cblxuZnVuY3Rpb24gY2Myc3RyKGFycikge1xuXHR2YXIgbyA9IFwiXCI7XG5cdGZvcih2YXIgaSA9IDA7IGkgIT0gYXJyLmxlbmd0aDsgKytpKSBvICs9IFN0cmluZy5mcm9tQ2hhckNvZGUoYXJyW2ldKTtcblx0cmV0dXJuIG87XG59XG5cbmZ1bmN0aW9uIGR1cChvKSB7XG5cdGlmKHR5cGVvZiBKU09OICE9ICd1bmRlZmluZWQnICYmICFBcnJheS5pc0FycmF5KG8pKSByZXR1cm4gSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeShvKSk7XG5cdGlmKHR5cGVvZiBvICE9ICdvYmplY3QnIHx8IG8gPT0gbnVsbCkgcmV0dXJuIG87XG5cdGlmKG8gaW5zdGFuY2VvZiBEYXRlKSByZXR1cm4gbmV3IERhdGUoby5nZXRUaW1lKCkpO1xuXHR2YXIgb3V0ID0ge307XG5cdGZvcih2YXIgayBpbiBvKSBpZihPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwobywgaykpIG91dFtrXSA9IGR1cChvW2tdKTtcblx0cmV0dXJuIG91dDtcbn1cblxuZnVuY3Rpb24gZmlsbChjLGwpIHsgdmFyIG8gPSBcIlwiOyB3aGlsZShvLmxlbmd0aCA8IGwpIG8rPWM7IHJldHVybiBvOyB9XG5cbi8qIFRPRE86IHN0cmVzcyB0ZXN0ICovXG5mdW5jdGlvbiBmdXp6eW51bShzKSB7XG5cdHZhciB2ID0gTnVtYmVyKHMpO1xuXHRpZighaXNOYU4odikpIHJldHVybiB2O1xuXHRpZighL1xcZC8udGVzdChzKSkgcmV0dXJuIHY7XG5cdHZhciB3dCA9IDE7XG5cdHZhciBzcyA9IHMucmVwbGFjZSgvKFtcXGRdKSwoW1xcZF0pL2csXCIkMSQyXCIpLnJlcGxhY2UoL1skXS9nLFwiXCIpLnJlcGxhY2UoL1slXS9nLCBmdW5jdGlvbigpIHsgd3QgKj0gMTAwOyByZXR1cm4gXCJcIjt9KTtcblx0aWYoIWlzTmFOKHYgPSBOdW1iZXIoc3MpKSkgcmV0dXJuIHYgLyB3dDtcblx0c3MgPSBzcy5yZXBsYWNlKC9bKF0oLiopWyldLyxmdW5jdGlvbigkJCwgJDEpIHsgd3QgPSAtd3Q7IHJldHVybiAkMTt9KTtcblx0aWYoIWlzTmFOKHYgPSBOdW1iZXIoc3MpKSkgcmV0dXJuIHYgLyB3dDtcblx0cmV0dXJuIHY7XG59XG5mdW5jdGlvbiBmdXp6eWRhdGUocykge1xuXHR2YXIgbyA9IG5ldyBEYXRlKHMpLCBuID0gbmV3IERhdGUoTmFOKTtcblx0dmFyIHkgPSBvLmdldFllYXIoKSwgbSA9IG8uZ2V0TW9udGgoKSwgZCA9IG8uZ2V0RGF0ZSgpO1xuXHRpZihpc05hTihkKSkgcmV0dXJuIG47XG5cdGlmKHkgPCAwIHx8IHkgPiA4MDk5KSByZXR1cm4gbjtcblx0aWYoKG0gPiAwIHx8IGQgPiAxKSAmJiB5ICE9IDEwMSkgcmV0dXJuIG87XG5cdGlmKHMudG9Mb3dlckNhc2UoKS5tYXRjaCgvamFufGZlYnxtYXJ8YXByfG1heXxqdW58anVsfGF1Z3xzZXB8b2N0fG5vdnxkZWMvKSkgcmV0dXJuIG87XG5cdGlmKHMubWF0Y2goL1teLTAtOTosXFwvXFxcXF0vKSkgcmV0dXJuIG47XG5cdHJldHVybiBvO1xufVxuXG52YXIgc2FmZV9zcGxpdF9yZWdleCA9IFwiYWJhY2FiYVwiLnNwbGl0KC8oOj9iKS9pKS5sZW5ndGggPT0gNTtcbmZ1bmN0aW9uIHNwbGl0X3JlZ2V4KHN0ciwgcmUsIGRlZikge1xuXHRpZihzYWZlX3NwbGl0X3JlZ2V4IHx8IHR5cGVvZiByZSA9PSBcInN0cmluZ1wiKSByZXR1cm4gc3RyLnNwbGl0KHJlKTtcblx0dmFyIHAgPSBzdHIuc3BsaXQocmUpLCBvID0gW3BbMF1dO1xuXHRmb3IodmFyIGkgPSAxOyBpIDwgcC5sZW5ndGg7ICsraSkgeyBvLnB1c2goZGVmKTsgby5wdXNoKHBbaV0pOyB9XG5cdHJldHVybiBvO1xufVxuZnVuY3Rpb24gZ2V0ZGF0YXN0cihkYXRhKSB7XG5cdGlmKCFkYXRhKSByZXR1cm4gbnVsbDtcblx0aWYoZGF0YS5kYXRhKSByZXR1cm4gZGVib20oZGF0YS5kYXRhKTtcblx0aWYoZGF0YS5hc05vZGVCdWZmZXIgJiYgaGFzX2J1ZikgcmV0dXJuIGRlYm9tKGRhdGEuYXNOb2RlQnVmZmVyKCkudG9TdHJpbmcoJ2JpbmFyeScpKTtcblx0aWYoZGF0YS5hc0JpbmFyeSkgcmV0dXJuIGRlYm9tKGRhdGEuYXNCaW5hcnkoKSk7XG5cdGlmKGRhdGEuX2RhdGEgJiYgZGF0YS5fZGF0YS5nZXRDb250ZW50KSByZXR1cm4gZGVib20oY2Myc3RyKEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGRhdGEuX2RhdGEuZ2V0Q29udGVudCgpLDApKSk7XG5cdGlmKGRhdGEuY29udGVudCAmJiBkYXRhLnR5cGUpIHJldHVybiBkZWJvbShjYzJzdHIoZGF0YS5jb250ZW50KSk7XG5cdHJldHVybiBudWxsO1xufVxuXG5mdW5jdGlvbiBnZXRkYXRhYmluKGRhdGEpIHtcblx0aWYoIWRhdGEpIHJldHVybiBudWxsO1xuXHRpZihkYXRhLmRhdGEpIHJldHVybiBjaGFyX2NvZGVzKGRhdGEuZGF0YSk7XG5cdGlmKGRhdGEuYXNOb2RlQnVmZmVyICYmIGhhc19idWYpIHJldHVybiBkYXRhLmFzTm9kZUJ1ZmZlcigpO1xuXHRpZihkYXRhLl9kYXRhICYmIGRhdGEuX2RhdGEuZ2V0Q29udGVudCkge1xuXHRcdHZhciBvID0gZGF0YS5fZGF0YS5nZXRDb250ZW50KCk7XG5cdFx0aWYodHlwZW9mIG8gPT0gXCJzdHJpbmdcIikgcmV0dXJuIGNoYXJfY29kZXMobyk7XG5cdFx0cmV0dXJuIEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKG8pO1xuXHR9XG5cdGlmKGRhdGEuY29udGVudCAmJiBkYXRhLnR5cGUpIHJldHVybiBkYXRhLmNvbnRlbnQ7XG5cdHJldHVybiBudWxsO1xufVxuXG5mdW5jdGlvbiBnZXRkYXRhKGRhdGEpIHsgcmV0dXJuIChkYXRhICYmIGRhdGEubmFtZS5zbGljZSgtNCkgPT09IFwiLmJpblwiKSA/IGdldGRhdGFiaW4oZGF0YSkgOiBnZXRkYXRhc3RyKGRhdGEpOyB9XG5cbi8qIFBhcnQgMiBTZWN0aW9uIDEwLjEuMiBcIk1hcHBpbmcgQ29udGVudCBUeXBlc1wiIE5hbWVzIGFyZSBjYXNlLWluc2Vuc2l0aXZlICovXG4vKiBPQVNJUyBkb2VzIG5vdCBjb21tZW50IG9uIGZpbGVuYW1lIGNhc2Ugc2Vuc2l0aXZpdHkgKi9cbmZ1bmN0aW9uIHNhZmVnZXR6aXBmaWxlKHppcCwgZmlsZSkge1xuXHR2YXIgayA9IHppcC5GdWxsUGF0aHMgfHwga2V5cyh6aXAuZmlsZXMpO1xuXHR2YXIgZiA9IGZpbGUudG9Mb3dlckNhc2UoKSwgZyA9IGYucmVwbGFjZSgvXFwvL2csJ1xcXFwnKTtcblx0Zm9yKHZhciBpPTA7IGk8ay5sZW5ndGg7ICsraSkge1xuXHRcdHZhciBuID0ga1tpXS50b0xvd2VyQ2FzZSgpO1xuXHRcdGlmKGYgPT0gbiB8fCBnID09IG4pIHJldHVybiB6aXAuZmlsZXNba1tpXV07XG5cdH1cblx0cmV0dXJuIG51bGw7XG59XG5cbmZ1bmN0aW9uIGdldHppcGZpbGUoemlwLCBmaWxlKSB7XG5cdHZhciBvID0gc2FmZWdldHppcGZpbGUoemlwLCBmaWxlKTtcblx0aWYobyA9PSBudWxsKSB0aHJvdyBuZXcgRXJyb3IoXCJDYW5ub3QgZmluZCBmaWxlIFwiICsgZmlsZSArIFwiIGluIHppcFwiKTtcblx0cmV0dXJuIG87XG59XG5cbmZ1bmN0aW9uIGdldHppcGRhdGEoemlwLCBmaWxlLCBzYWZlKSB7XG5cdGlmKCFzYWZlKSByZXR1cm4gZ2V0ZGF0YShnZXR6aXBmaWxlKHppcCwgZmlsZSkpO1xuXHRpZighZmlsZSkgcmV0dXJuIG51bGw7XG5cdHRyeSB7IHJldHVybiBnZXR6aXBkYXRhKHppcCwgZmlsZSk7IH0gY2F0Y2goZSkgeyByZXR1cm4gbnVsbDsgfVxufVxuXG5mdW5jdGlvbiBnZXR6aXBzdHIoemlwLCBmaWxlLCBzYWZlKSB7XG5cdGlmKCFzYWZlKSByZXR1cm4gZ2V0ZGF0YXN0cihnZXR6aXBmaWxlKHppcCwgZmlsZSkpO1xuXHRpZighZmlsZSkgcmV0dXJuIG51bGw7XG5cdHRyeSB7IHJldHVybiBnZXR6aXBzdHIoemlwLCBmaWxlKTsgfSBjYXRjaChlKSB7IHJldHVybiBudWxsOyB9XG59XG5cbmZ1bmN0aW9uIHppcGVudHJpZXMoemlwKSB7XG5cdHZhciBrID0gemlwLkZ1bGxQYXRocyB8fCBrZXlzKHppcC5maWxlcyksIG8gPSBbXTtcblx0Zm9yKHZhciBpID0gMDsgaSA8IGsubGVuZ3RoOyArK2kpIGlmKGtbaV0uc2xpY2UoLTEpICE9ICcvJykgby5wdXNoKGtbaV0pO1xuXHRyZXR1cm4gby5zb3J0KCk7XG59XG5cbmZ1bmN0aW9uIHppcF9hZGRfZmlsZSh6aXAsIHBhdGgsIGNvbnRlbnQpIHtcblx0aWYoemlwLkZ1bGxQYXRocykgQ0ZCLnV0aWxzLmNmYl9hZGQoemlwLCBwYXRoLCBjb250ZW50KTtcblx0ZWxzZSB6aXAuZmlsZShwYXRoLCBjb250ZW50KTtcbn1cblxudmFyIGpzemlwO1xuLypnbG9iYWwgSlNaaXBTeW5jOnRydWUgKi9cbmlmKHR5cGVvZiBKU1ppcFN5bmMgIT09ICd1bmRlZmluZWQnKSBqc3ppcCA9IEpTWmlwU3luYztcbmlmKHR5cGVvZiBleHBvcnRzICE9PSAndW5kZWZpbmVkJykge1xuXHRpZih0eXBlb2YgbW9kdWxlICE9PSAndW5kZWZpbmVkJyAmJiBtb2R1bGUuZXhwb3J0cykge1xuXHRcdGlmKHR5cGVvZiBqc3ppcCA9PT0gJ3VuZGVmaW5lZCcpIGpzemlwID0gcmVxdWlyZSgnLi9qc3ppcC5qcycpO1xuXHR9XG59XG5cbmZ1bmN0aW9uIHppcF9uZXcoKSB7XG5cdGlmKCFqc3ppcCkgcmV0dXJuIENGQi51dGlscy5jZmJfbmV3KCk7XG5cdHJldHVybiBuZXcganN6aXAoKTtcbn1cblxuZnVuY3Rpb24gemlwX3JlYWQoZCwgbykge1xuXHR2YXIgemlwO1xuXHRpZihqc3ppcCkgc3dpdGNoKG8udHlwZSkge1xuXHRcdGNhc2UgXCJiYXNlNjRcIjogemlwID0gbmV3IGpzemlwKGQsIHsgYmFzZTY0OnRydWUgfSk7IGJyZWFrO1xuXHRcdGNhc2UgXCJiaW5hcnlcIjogY2FzZSBcImFycmF5XCI6IHppcCA9IG5ldyBqc3ppcChkLCB7IGJhc2U2NDpmYWxzZSB9KTsgYnJlYWs7XG5cdFx0Y2FzZSBcImJ1ZmZlclwiOiB6aXAgPSBuZXcganN6aXAoZCk7IGJyZWFrO1xuXHRcdGRlZmF1bHQ6IHRocm93IG5ldyBFcnJvcihcIlVucmVjb2duaXplZCB0eXBlIFwiICsgby50eXBlKTtcblx0fVxuXHRlbHNlIHN3aXRjaChvLnR5cGUpIHtcblx0XHRjYXNlIFwiYmFzZTY0XCI6IHppcCA9IENGQi5yZWFkKGQsIHsgdHlwZTogXCJiYXNlNjRcIiB9KTsgYnJlYWs7XG5cdFx0Y2FzZSBcImJpbmFyeVwiOiB6aXAgPSBDRkIucmVhZChkLCB7IHR5cGU6IFwiYmluYXJ5XCIgfSk7IGJyZWFrO1xuXHRcdGNhc2UgXCJidWZmZXJcIjogY2FzZSBcImFycmF5XCI6IHppcCA9IENGQi5yZWFkKGQsIHsgdHlwZTogXCJidWZmZXJcIiB9KTsgYnJlYWs7XG5cdFx0ZGVmYXVsdDogdGhyb3cgbmV3IEVycm9yKFwiVW5yZWNvZ25pemVkIHR5cGUgXCIgKyBvLnR5cGUpO1xuXHR9XG5cdHJldHVybiB6aXA7XG59XG5cbmZ1bmN0aW9uIHJlc29sdmVfcGF0aChwYXRoLCBiYXNlKSB7XG5cdGlmKHBhdGguY2hhckF0KDApID09IFwiL1wiKSByZXR1cm4gcGF0aC5zbGljZSgxKTtcblx0dmFyIHJlc3VsdCA9IGJhc2Uuc3BsaXQoJy8nKTtcblx0aWYoYmFzZS5zbGljZSgtMSkgIT0gXCIvXCIpIHJlc3VsdC5wb3AoKTsgLy8gZm9sZGVyIHBhdGhcblx0dmFyIHRhcmdldCA9IHBhdGguc3BsaXQoJy8nKTtcblx0d2hpbGUgKHRhcmdldC5sZW5ndGggIT09IDApIHtcblx0XHR2YXIgc3RlcCA9IHRhcmdldC5zaGlmdCgpO1xuXHRcdGlmIChzdGVwID09PSAnLi4nKSByZXN1bHQucG9wKCk7XG5cdFx0ZWxzZSBpZiAoc3RlcCAhPT0gJy4nKSByZXN1bHQucHVzaChzdGVwKTtcblx0fVxuXHRyZXR1cm4gcmVzdWx0LmpvaW4oJy8nKTtcbn1cbnZhciBYTUxfSEVBREVSID0gJzw/eG1sIHZlcnNpb249XCIxLjBcIiBlbmNvZGluZz1cIlVURi04XCIgc3RhbmRhbG9uZT1cInllc1wiPz5cXHJcXG4nO1xudmFyIGF0dHJlZ2V4Zz0vKFteXCJcXHM/PlxcL10rKVxccyo9XFxzKigoPzpcIikoW15cIl0qKSg/OlwiKXwoPzonKShbXiddKikoPzonKXwoW14nXCI+XFxzXSspKS9nO1xudmFyIHRhZ3JlZ2V4PS88W1xcL1xcP10/W2EtekEtWjAtOTpfLV0rKD86XFxzK1teXCJcXHM/PlxcL10rXFxzKj1cXHMqKD86XCJbXlwiXSpcInwnW14nXSonfFteJ1wiPlxccz1dKykpKlxccypbXFwvXFw/XT8+L21nO1xuXG5pZighKFhNTF9IRUFERVIubWF0Y2godGFncmVnZXgpKSkgdGFncmVnZXggPSAvPFtePl0qPi9nO1xudmFyIG5zcmVnZXg9LzxcXHcqOi8sIG5zcmVnZXgyID0gLzwoXFwvPylcXHcrOi87XG5mdW5jdGlvbiBwYXJzZXhtbHRhZyh0YWcsIHNraXBfcm9vdCwgc2tpcF9MQykge1xuXHR2YXIgeiA9ICh7fSk7XG5cdHZhciBlcSA9IDAsIGMgPSAwO1xuXHRmb3IoOyBlcSAhPT0gdGFnLmxlbmd0aDsgKytlcSkgaWYoKGMgPSB0YWcuY2hhckNvZGVBdChlcSkpID09PSAzMiB8fCBjID09PSAxMCB8fCBjID09PSAxMykgYnJlYWs7XG5cdGlmKCFza2lwX3Jvb3QpIHpbMF0gPSB0YWcuc2xpY2UoMCwgZXEpO1xuXHRpZihlcSA9PT0gdGFnLmxlbmd0aCkgcmV0dXJuIHo7XG5cdHZhciBtID0gdGFnLm1hdGNoKGF0dHJlZ2V4ZyksIGo9MCwgdj1cIlwiLCBpPTAsIHE9XCJcIiwgY2M9XCJcIiwgcXVvdCA9IDE7XG5cdGlmKG0pIGZvcihpID0gMDsgaSAhPSBtLmxlbmd0aDsgKytpKSB7XG5cdFx0Y2MgPSBtW2ldO1xuXHRcdGZvcihjPTA7IGMgIT0gY2MubGVuZ3RoOyArK2MpIGlmKGNjLmNoYXJDb2RlQXQoYykgPT09IDYxKSBicmVhaztcblx0XHRxID0gY2Muc2xpY2UoMCxjKS50cmltKCk7XG5cdFx0d2hpbGUoY2MuY2hhckNvZGVBdChjKzEpID09IDMyKSArK2M7XG5cdFx0cXVvdCA9ICgoZXE9Y2MuY2hhckNvZGVBdChjKzEpKSA9PSAzNCB8fCBlcSA9PSAzOSkgPyAxIDogMDtcblx0XHR2ID0gY2Muc2xpY2UoYysxK3F1b3QsIGNjLmxlbmd0aC1xdW90KTtcblx0XHRmb3Ioaj0wO2ohPXEubGVuZ3RoOysraikgaWYocS5jaGFyQ29kZUF0KGopID09PSA1OCkgYnJlYWs7XG5cdFx0aWYoaj09PXEubGVuZ3RoKSB7XG5cdFx0XHRpZihxLmluZGV4T2YoXCJfXCIpID4gMCkgcSA9IHEuc2xpY2UoMCwgcS5pbmRleE9mKFwiX1wiKSk7IC8vIGZyb20gb2RzXG5cdFx0XHR6W3FdID0gdjtcblx0XHRcdGlmKCFza2lwX0xDKSB6W3EudG9Mb3dlckNhc2UoKV0gPSB2O1xuXHRcdH1cblx0XHRlbHNlIHtcblx0XHRcdHZhciBrID0gKGo9PT01ICYmIHEuc2xpY2UoMCw1KT09PVwieG1sbnNcIj9cInhtbG5zXCI6XCJcIikrcS5zbGljZShqKzEpO1xuXHRcdFx0aWYoeltrXSAmJiBxLnNsaWNlKGotMyxqKSA9PSBcImV4dFwiKSBjb250aW51ZTsgLy8gZnJvbSBvZHNcblx0XHRcdHpba10gPSB2O1xuXHRcdFx0aWYoIXNraXBfTEMpIHpbay50b0xvd2VyQ2FzZSgpXSA9IHY7XG5cdFx0fVxuXHR9XG5cdHJldHVybiB6O1xufVxuZnVuY3Rpb24gc3RyaXBfbnMoeCkgeyByZXR1cm4geC5yZXBsYWNlKG5zcmVnZXgyLCBcIjwkMVwiKTsgfVxuXG52YXIgZW5jb2RpbmdzID0ge1xuXHQnJnF1b3Q7JzogJ1wiJyxcblx0JyZhcG9zOyc6IFwiJ1wiLFxuXHQnJmd0Oyc6ICc+Jyxcblx0JyZsdDsnOiAnPCcsXG5cdCcmYW1wOyc6ICcmJ1xufTtcbnZhciByZW5jb2RpbmcgPSBldmVydChlbmNvZGluZ3MpO1xuLy92YXIgcmVuY3N0ciA9IFwiJjw+J1xcXCJcIi5zcGxpdChcIlwiKTtcblxuLy8gVE9ETzogQ1AgcmVtYXAgKG5lZWQgdG8gcmVhZCBmaWxlIHZlcnNpb24gdG8gZGV0ZXJtaW5lIE9TKVxudmFyIHVuZXNjYXBleG1sID0gKGZ1bmN0aW9uKCkge1xuXHQvKiAyMi40LjIuNCBic3RyIChCYXNpYyBTdHJpbmcpICovXG5cdHZhciBlbmNyZWdleCA9IC8mKD86cXVvdHxhcG9zfGd0fGx0fGFtcHwjeD8oW1xcZGEtZkEtRl0rKSk7L2lnLCBjb2RlcmVnZXggPSAvX3goW1xcZGEtZkEtRl17NH0pXy9pZztcblx0cmV0dXJuIGZ1bmN0aW9uIHVuZXNjYXBleG1sKHRleHQpIHtcblx0XHR2YXIgcyA9IHRleHQgKyAnJywgaSA9IHMuaW5kZXhPZihcIjwhW0NEQVRBW1wiKTtcblx0XHRpZihpID09IC0xKSByZXR1cm4gcy5yZXBsYWNlKGVuY3JlZ2V4LCBmdW5jdGlvbigkJCwgJDEpIHsgcmV0dXJuIGVuY29kaW5nc1skJF18fFN0cmluZy5mcm9tQ2hhckNvZGUocGFyc2VJbnQoJDEsJCQuaW5kZXhPZihcInhcIik+LTE/MTY6MTApKXx8JCQ7IH0pLnJlcGxhY2UoY29kZXJlZ2V4LGZ1bmN0aW9uKG0sYykge3JldHVybiBTdHJpbmcuZnJvbUNoYXJDb2RlKHBhcnNlSW50KGMsMTYpKTt9KTtcblx0XHR2YXIgaiA9IHMuaW5kZXhPZihcIl1dPlwiKTtcblx0XHRyZXR1cm4gdW5lc2NhcGV4bWwocy5zbGljZSgwLCBpKSkgKyBzLnNsaWNlKGkrOSxqKSArIHVuZXNjYXBleG1sKHMuc2xpY2UoaiszKSk7XG5cdH07XG59KSgpO1xuXG52YXIgZGVjcmVnZXg9L1smPD4nXCJdL2csIGNoYXJlZ2V4ID0gL1tcXHUwMDAwLVxcdTAwMDhcXHUwMDBiLVxcdTAwMWZdL2c7XG5mdW5jdGlvbiBlc2NhcGV4bWwodGV4dCl7XG5cdHZhciBzID0gdGV4dCArICcnO1xuXHRyZXR1cm4gcy5yZXBsYWNlKGRlY3JlZ2V4LCBmdW5jdGlvbih5KSB7IHJldHVybiByZW5jb2RpbmdbeV07IH0pLnJlcGxhY2UoY2hhcmVnZXgsZnVuY3Rpb24ocykgeyByZXR1cm4gXCJfeFwiICsgKFwiMDAwXCIrcy5jaGFyQ29kZUF0KDApLnRvU3RyaW5nKDE2KSkuc2xpY2UoLTQpICsgXCJfXCI7fSk7XG59XG5mdW5jdGlvbiBlc2NhcGV4bWx0YWcodGV4dCl7IHJldHVybiBlc2NhcGV4bWwodGV4dCkucmVwbGFjZSgvIC9nLFwiX3gwMDIwX1wiKTsgfVxuXG52YXIgaHRtbGNoYXJlZ2V4ID0gL1tcXHUwMDAwLVxcdTAwMWZdL2c7XG5mdW5jdGlvbiBlc2NhcGVodG1sKHRleHQpe1xuXHR2YXIgcyA9IHRleHQgKyAnJztcblx0cmV0dXJuIHMucmVwbGFjZShkZWNyZWdleCwgZnVuY3Rpb24oeSkgeyByZXR1cm4gcmVuY29kaW5nW3ldOyB9KS5yZXBsYWNlKC9cXG4vZywgXCI8YnIvPlwiKS5yZXBsYWNlKGh0bWxjaGFyZWdleCxmdW5jdGlvbihzKSB7IHJldHVybiBcIiYjeFwiICsgKFwiMDAwXCIrcy5jaGFyQ29kZUF0KDApLnRvU3RyaW5nKDE2KSkuc2xpY2UoLTQpICsgXCI7XCI7IH0pO1xufVxuXG5mdW5jdGlvbiBlc2NhcGV4bG1sKHRleHQpe1xuXHR2YXIgcyA9IHRleHQgKyAnJztcblx0cmV0dXJuIHMucmVwbGFjZShkZWNyZWdleCwgZnVuY3Rpb24oeSkgeyByZXR1cm4gcmVuY29kaW5nW3ldOyB9KS5yZXBsYWNlKGh0bWxjaGFyZWdleCxmdW5jdGlvbihzKSB7IHJldHVybiBcIiYjeFwiICsgKHMuY2hhckNvZGVBdCgwKS50b1N0cmluZygxNikpLnRvVXBwZXJDYXNlKCkgKyBcIjtcIjsgfSk7XG59XG5cbi8qIFRPRE86IGhhbmRsZSBjb2RlcGFnZXMgKi9cbnZhciB4bG1sX2ZpeHN0ciA9IChmdW5jdGlvbigpIHtcblx0dmFyIGVudHJlZ2V4ID0gLyYjKFxcZCspOy9nO1xuXHRmdW5jdGlvbiBlbnRyZXBsKCQkLCQxKSB7IHJldHVybiBTdHJpbmcuZnJvbUNoYXJDb2RlKHBhcnNlSW50KCQxLDEwKSk7IH1cblx0cmV0dXJuIGZ1bmN0aW9uIHhsbWxfZml4c3RyKHN0cikgeyByZXR1cm4gc3RyLnJlcGxhY2UoZW50cmVnZXgsZW50cmVwbCk7IH07XG59KSgpO1xudmFyIHhsbWxfdW5maXhzdHIgPSAoZnVuY3Rpb24oKSB7XG5cdHJldHVybiBmdW5jdGlvbiB4bG1sX3VuZml4c3RyKHN0cikgeyByZXR1cm4gc3RyLnJlcGxhY2UoLyhcXHJcXG58W1xcclxcbl0pL2csXCJcXCYjMTA7XCIpOyB9O1xufSkoKTtcblxuZnVuY3Rpb24gcGFyc2V4bWxib29sKHZhbHVlKSB7XG5cdHN3aXRjaCh2YWx1ZSkge1xuXHRcdGNhc2UgMTogY2FzZSB0cnVlOiBjYXNlICcxJzogY2FzZSAndHJ1ZSc6IGNhc2UgJ1RSVUUnOiByZXR1cm4gdHJ1ZTtcblx0XHQvKiBjYXNlICcwJzogY2FzZSAnZmFsc2UnOiBjYXNlICdGQUxTRSc6Ki9cblx0XHRkZWZhdWx0OiByZXR1cm4gZmFsc2U7XG5cdH1cbn1cblxudmFyIHV0ZjhyZWFkID0gZnVuY3Rpb24gdXRmOHJlYWRhKG9yaWcpIHtcblx0dmFyIG91dCA9IFwiXCIsIGkgPSAwLCBjID0gMCwgZCA9IDAsIGUgPSAwLCBmID0gMCwgdyA9IDA7XG5cdHdoaWxlIChpIDwgb3JpZy5sZW5ndGgpIHtcblx0XHRjID0gb3JpZy5jaGFyQ29kZUF0KGkrKyk7XG5cdFx0aWYgKGMgPCAxMjgpIHsgb3V0ICs9IFN0cmluZy5mcm9tQ2hhckNvZGUoYyk7IGNvbnRpbnVlOyB9XG5cdFx0ZCA9IG9yaWcuY2hhckNvZGVBdChpKyspO1xuXHRcdGlmIChjPjE5MSAmJiBjPDIyNCkgeyBmID0gKChjICYgMzEpIDw8IDYpOyBmIHw9IChkICYgNjMpOyBvdXQgKz0gU3RyaW5nLmZyb21DaGFyQ29kZShmKTsgY29udGludWU7IH1cblx0XHRlID0gb3JpZy5jaGFyQ29kZUF0KGkrKyk7XG5cdFx0aWYgKGMgPCAyNDApIHsgb3V0ICs9IFN0cmluZy5mcm9tQ2hhckNvZGUoKChjICYgMTUpIDw8IDEyKSB8ICgoZCAmIDYzKSA8PCA2KSB8IChlICYgNjMpKTsgY29udGludWU7IH1cblx0XHRmID0gb3JpZy5jaGFyQ29kZUF0KGkrKyk7XG5cdFx0dyA9ICgoKGMgJiA3KSA8PCAxOCkgfCAoKGQgJiA2MykgPDwgMTIpIHwgKChlICYgNjMpIDw8IDYpIHwgKGYgJiA2MykpLTY1NTM2O1xuXHRcdG91dCArPSBTdHJpbmcuZnJvbUNoYXJDb2RlKDB4RDgwMCArICgodz4+PjEwKSYxMDIzKSk7XG5cdFx0b3V0ICs9IFN0cmluZy5mcm9tQ2hhckNvZGUoMHhEQzAwICsgKHcmMTAyMykpO1xuXHR9XG5cdHJldHVybiBvdXQ7XG59O1xuXG52YXIgdXRmOHdyaXRlID0gZnVuY3Rpb24ob3JpZykge1xuXHR2YXIgb3V0ID0gW10sIGkgPSAwLCBjID0gMCwgZCA9IDA7XG5cdHdoaWxlKGkgPCBvcmlnLmxlbmd0aCkge1xuXHRcdGMgPSBvcmlnLmNoYXJDb2RlQXQoaSsrKTtcblx0XHRzd2l0Y2godHJ1ZSkge1xuXHRcdFx0Y2FzZSBjIDwgMTI4OiBvdXQucHVzaChTdHJpbmcuZnJvbUNoYXJDb2RlKGMpKTsgYnJlYWs7XG5cdFx0XHRjYXNlIGMgPCAyMDQ4OlxuXHRcdFx0XHRvdXQucHVzaChTdHJpbmcuZnJvbUNoYXJDb2RlKDE5MiArIChjID4+IDYpKSk7XG5cdFx0XHRcdG91dC5wdXNoKFN0cmluZy5mcm9tQ2hhckNvZGUoMTI4ICsgKGMgJiA2MykpKTtcblx0XHRcdFx0YnJlYWs7XG5cdFx0XHRjYXNlIGMgPj0gNTUyOTYgJiYgYyA8IDU3MzQ0OlxuXHRcdFx0XHRjIC09IDU1Mjk2OyBkID0gb3JpZy5jaGFyQ29kZUF0KGkrKykgLSA1NjMyMCArIChjPDwxMCk7XG5cdFx0XHRcdG91dC5wdXNoKFN0cmluZy5mcm9tQ2hhckNvZGUoMjQwICsgKChkID4+MTgpICYgNykpKTtcblx0XHRcdFx0b3V0LnB1c2goU3RyaW5nLmZyb21DaGFyQ29kZSgxNDQgKyAoKGQgPj4xMikgJiA2MykpKTtcblx0XHRcdFx0b3V0LnB1c2goU3RyaW5nLmZyb21DaGFyQ29kZSgxMjggKyAoKGQgPj4gNikgJiA2MykpKTtcblx0XHRcdFx0b3V0LnB1c2goU3RyaW5nLmZyb21DaGFyQ29kZSgxMjggKyAoZCAmIDYzKSkpO1xuXHRcdFx0XHRicmVhaztcblx0XHRcdGRlZmF1bHQ6XG5cdFx0XHRcdG91dC5wdXNoKFN0cmluZy5mcm9tQ2hhckNvZGUoMjI0ICsgKGMgPj4gMTIpKSk7XG5cdFx0XHRcdG91dC5wdXNoKFN0cmluZy5mcm9tQ2hhckNvZGUoMTI4ICsgKChjID4+IDYpICYgNjMpKSk7XG5cdFx0XHRcdG91dC5wdXNoKFN0cmluZy5mcm9tQ2hhckNvZGUoMTI4ICsgKGMgJiA2MykpKTtcblx0XHR9XG5cdH1cblx0cmV0dXJuIG91dC5qb2luKFwiXCIpO1xufTtcblxuaWYoaGFzX2J1Zikge1xuXHR2YXIgdXRmOHJlYWRiID0gZnVuY3Rpb24gdXRmOHJlYWRiKGRhdGEpIHtcblx0XHR2YXIgb3V0ID0gQnVmZmVyLmFsbG9jKDIqZGF0YS5sZW5ndGgpLCB3LCBpLCBqID0gMSwgayA9IDAsIHd3PTAsIGM7XG5cdFx0Zm9yKGkgPSAwOyBpIDwgZGF0YS5sZW5ndGg7IGkrPWopIHtcblx0XHRcdGogPSAxO1xuXHRcdFx0aWYoKGM9ZGF0YS5jaGFyQ29kZUF0KGkpKSA8IDEyOCkgdyA9IGM7XG5cdFx0XHRlbHNlIGlmKGMgPCAyMjQpIHsgdyA9IChjJjMxKSo2NCsoZGF0YS5jaGFyQ29kZUF0KGkrMSkmNjMpOyBqPTI7IH1cblx0XHRcdGVsc2UgaWYoYyA8IDI0MCkgeyB3PShjJjE1KSo0MDk2KyhkYXRhLmNoYXJDb2RlQXQoaSsxKSY2MykqNjQrKGRhdGEuY2hhckNvZGVBdChpKzIpJjYzKTsgaj0zOyB9XG5cdFx0XHRlbHNlIHsgaiA9IDQ7XG5cdFx0XHRcdHcgPSAoYyAmIDcpKjI2MjE0NCsoZGF0YS5jaGFyQ29kZUF0KGkrMSkmNjMpKjQwOTYrKGRhdGEuY2hhckNvZGVBdChpKzIpJjYzKSo2NCsoZGF0YS5jaGFyQ29kZUF0KGkrMykmNjMpO1xuXHRcdFx0XHR3IC09IDY1NTM2OyB3dyA9IDB4RDgwMCArICgodz4+PjEwKSYxMDIzKTsgdyA9IDB4REMwMCArICh3JjEwMjMpO1xuXHRcdFx0fVxuXHRcdFx0aWYod3cgIT09IDApIHsgb3V0W2srK10gPSB3dyYyNTU7IG91dFtrKytdID0gd3c+Pj44OyB3dyA9IDA7IH1cblx0XHRcdG91dFtrKytdID0gdyUyNTY7IG91dFtrKytdID0gdz4+Pjg7XG5cdFx0fVxuXHRcdHJldHVybiBvdXQuc2xpY2UoMCxrKS50b1N0cmluZygndWNzMicpO1xuXHR9O1xuXHR2YXIgY29ycHVzID0gXCJmb28gYmFyIGJhelxcdTAwZTJcXHUwMDk4XFx1MDA4M1xcdTAwZjBcXHUwMDlmXFx1MDA4ZFxcdTAwYTNcIjtcblx0aWYodXRmOHJlYWQoY29ycHVzKSA9PSB1dGY4cmVhZGIoY29ycHVzKSkgdXRmOHJlYWQgPSB1dGY4cmVhZGI7XG5cdHZhciB1dGY4cmVhZGMgPSBmdW5jdGlvbiB1dGY4cmVhZGMoZGF0YSkgeyByZXR1cm4gQnVmZmVyX2Zyb20oZGF0YSwgJ2JpbmFyeScpLnRvU3RyaW5nKCd1dGY4Jyk7IH07XG5cdGlmKHV0ZjhyZWFkKGNvcnB1cykgPT0gdXRmOHJlYWRjKGNvcnB1cykpIHV0ZjhyZWFkID0gdXRmOHJlYWRjO1xuXG5cdHV0Zjh3cml0ZSA9IGZ1bmN0aW9uKGRhdGEpIHsgcmV0dXJuIEJ1ZmZlcl9mcm9tKGRhdGEsICd1dGY4JykudG9TdHJpbmcoXCJiaW5hcnlcIik7IH07XG59XG5cbi8vIG1hdGNoZXMgPGZvbz4uLi48L2Zvbz4gZXh0cmFjdHMgY29udGVudFxudmFyIG1hdGNodGFnID0gKGZ1bmN0aW9uKCkge1xuXHR2YXIgbXRjYWNoZSA9ICh7fSk7XG5cdHJldHVybiBmdW5jdGlvbiBtYXRjaHRhZyhmLGcpIHtcblx0XHR2YXIgdCA9IGYrXCJ8XCIrKGd8fFwiXCIpO1xuXHRcdGlmKG10Y2FjaGVbdF0pIHJldHVybiBtdGNhY2hlW3RdO1xuXHRcdHJldHVybiAobXRjYWNoZVt0XSA9IG5ldyBSZWdFeHAoJzwoPzpcXFxcdys6KT8nK2YrJyg/OiB4bWw6c3BhY2U9XCJwcmVzZXJ2ZVwiKT8oPzpbXj5dKik+KFtcXFxcc1xcXFxTXSo/KTwvKD86XFxcXHcrOik/JytmKyc+JywoKGd8fFwiXCIpKSkpO1xuXHR9O1xufSkoKTtcblxudmFyIGh0bWxkZWNvZGUgPSAoZnVuY3Rpb24oKSB7XG5cdHZhciBlbnRpdGllcyA9IFtcblx0XHRbJ25ic3AnLCAnICddLCBbJ21pZGRvdCcsICfCtyddLFxuXHRcdFsncXVvdCcsICdcIiddLCBbJ2Fwb3MnLCBcIidcIl0sIFsnZ3QnLCAgICc+J10sIFsnbHQnLCAgICc8J10sIFsnYW1wJywgICcmJ11cblx0XS5tYXAoZnVuY3Rpb24oeCkgeyByZXR1cm4gW25ldyBSZWdFeHAoJyYnICsgeFswXSArICc7JywgXCJpZ1wiKSwgeFsxXV07IH0pO1xuXHRyZXR1cm4gZnVuY3Rpb24gaHRtbGRlY29kZShzdHIpIHtcblx0XHR2YXIgbyA9IHN0clxuXHRcdFx0XHQvLyBSZW1vdmUgbmV3IGxpbmVzIGFuZCBzcGFjZXMgZnJvbSBzdGFydCBvZiBjb250ZW50XG5cdFx0XHRcdC5yZXBsYWNlKC9eW1xcdFxcblxcciBdKy8sIFwiXCIpXG5cdFx0XHRcdC8vIFJlbW92ZSBuZXcgbGluZXMgYW5kIHNwYWNlcyBmcm9tIGVuZCBvZiBjb250ZW50XG5cdFx0XHRcdC5yZXBsYWNlKC9bXFx0XFxuXFxyIF0rJC8sXCJcIilcblx0XHRcdFx0Ly8gQWRkZWQgbGluZSB3aGljaCByZW1vdmVzIGFueSB3aGl0ZSBzcGFjZSBjaGFyYWN0ZXJzIGFmdGVyIGFuZCBiZWZvcmUgaHRtbCB0YWdzXG5cdFx0XHRcdC5yZXBsYWNlKC8+XFxzKy9nLFwiPlwiKS5yZXBsYWNlKC9cXHMrPC9nLFwiPFwiKVxuXHRcdFx0XHQvLyBSZXBsYWNlIHJlbWFpbmluZyBuZXcgbGluZXMgYW5kIHNwYWNlcyB3aXRoIHNwYWNlXG5cdFx0XHRcdC5yZXBsYWNlKC9bXFx0XFxuXFxyIF0rL2csIFwiIFwiKVxuXHRcdFx0XHQvLyBSZXBsYWNlIDxicj4gdGFncyB3aXRoIG5ldyBsaW5lc1xuXHRcdFx0XHQucmVwbGFjZSgvPFxccypbYkJdW3JSXVxccypcXC8/Pi9nLFwiXFxuXCIpXG5cdFx0XHRcdC8vIFN0cmlwIEhUTUwgZWxlbWVudHNcblx0XHRcdFx0LnJlcGxhY2UoLzxbXj5dKj4vZyxcIlwiKTtcblx0XHRmb3IodmFyIGkgPSAwOyBpIDwgZW50aXRpZXMubGVuZ3RoOyArK2kpIG8gPSBvLnJlcGxhY2UoZW50aXRpZXNbaV1bMF0sIGVudGl0aWVzW2ldWzFdKTtcblx0XHRyZXR1cm4gbztcblx0fTtcbn0pKCk7XG5cbnZhciB2dHJlZ2V4ID0gKGZ1bmN0aW9uKCl7IHZhciB2dF9jYWNoZSA9IHt9O1xuXHRyZXR1cm4gZnVuY3Rpb24gdnRfcmVnZXgoYnQpIHtcblx0XHRpZih2dF9jYWNoZVtidF0gIT09IHVuZGVmaW5lZCkgcmV0dXJuIHZ0X2NhY2hlW2J0XTtcblx0XHRyZXR1cm4gKHZ0X2NhY2hlW2J0XSA9IG5ldyBSZWdFeHAoXCI8KD86dnQ6KT9cIiArIGJ0ICsgXCI+KFtcXFxcc1xcXFxTXSo/KTwvKD86dnQ6KT9cIiArIGJ0ICsgXCI+XCIsICdnJykgKTtcbn07fSkoKTtcbnZhciB2dHZyZWdleCA9IC88XFwvPyg/OnZ0Oik/dmFyaWFudD4vZywgdnRtcmVnZXggPSAvPCg/OnZ0OikoW14+XSopPihbXFxzXFxTXSopPC87XG5mdW5jdGlvbiBwYXJzZVZlY3RvcihkYXRhLCBvcHRzKSB7XG5cdHZhciBoID0gcGFyc2V4bWx0YWcoZGF0YSk7XG5cblx0dmFyIG1hdGNoZXMgPSBkYXRhLm1hdGNoKHZ0cmVnZXgoaC5iYXNlVHlwZSkpfHxbXTtcblx0dmFyIHJlcyA9IFtdO1xuXHRpZihtYXRjaGVzLmxlbmd0aCAhPSBoLnNpemUpIHtcblx0XHRpZihvcHRzLldURikgdGhyb3cgbmV3IEVycm9yKFwidW5leHBlY3RlZCB2ZWN0b3IgbGVuZ3RoIFwiICsgbWF0Y2hlcy5sZW5ndGggKyBcIiAhPSBcIiArIGguc2l6ZSk7XG5cdFx0cmV0dXJuIHJlcztcblx0fVxuXHRtYXRjaGVzLmZvckVhY2goZnVuY3Rpb24oeCkge1xuXHRcdHZhciB2ID0geC5yZXBsYWNlKHZ0dnJlZ2V4LFwiXCIpLm1hdGNoKHZ0bXJlZ2V4KTtcblx0XHRpZih2KSByZXMucHVzaCh7djp1dGY4cmVhZCh2WzJdKSwgdDp2WzFdfSk7XG5cdH0pO1xuXHRyZXR1cm4gcmVzO1xufVxuXG52YXIgd3RyZWdleCA9IC8oXlxcc3xcXHMkfFxcbikvO1xuZnVuY3Rpb24gd3JpdGV0YWcoZixnKSB7IHJldHVybiAnPCcgKyBmICsgKGcubWF0Y2god3RyZWdleCk/JyB4bWw6c3BhY2U9XCJwcmVzZXJ2ZVwiJyA6IFwiXCIpICsgJz4nICsgZyArICc8LycgKyBmICsgJz4nOyB9XG5cbmZ1bmN0aW9uIHd4dF9oZWxwZXIoaCkgeyByZXR1cm4ga2V5cyhoKS5tYXAoZnVuY3Rpb24oaykgeyByZXR1cm4gXCIgXCIgKyBrICsgJz1cIicgKyBoW2tdICsgJ1wiJzt9KS5qb2luKFwiXCIpOyB9XG5mdW5jdGlvbiB3cml0ZXh0YWcoZixnLGgpIHsgcmV0dXJuICc8JyArIGYgKyAoKGggIT0gbnVsbCkgPyB3eHRfaGVscGVyKGgpIDogXCJcIikgKyAoKGcgIT0gbnVsbCkgPyAoZy5tYXRjaCh3dHJlZ2V4KT8nIHhtbDpzcGFjZT1cInByZXNlcnZlXCInIDogXCJcIikgKyAnPicgKyBnICsgJzwvJyArIGYgOiBcIi9cIikgKyAnPic7fVxuXG5mdW5jdGlvbiB3cml0ZV93M2NkdGYoZCwgdCkgeyB0cnkgeyByZXR1cm4gZC50b0lTT1N0cmluZygpLnJlcGxhY2UoL1xcLlxcZCovLFwiXCIpOyB9IGNhdGNoKGUpIHsgaWYodCkgdGhyb3cgZTsgfSByZXR1cm4gXCJcIjsgfVxuXG5mdW5jdGlvbiB3cml0ZV92dChzLCB4bHN4KSB7XG5cdHN3aXRjaCh0eXBlb2Ygcykge1xuXHRcdGNhc2UgJ3N0cmluZyc6XG5cdFx0XHR2YXIgbyA9IHdyaXRleHRhZygndnQ6bHB3c3RyJywgZXNjYXBleG1sKHMpKTtcblx0XHRcdGlmKHhsc3gpIG8gPSBvLnJlcGxhY2UoLyZxdW90Oy9nLCBcIl94MDAyMl9cIik7XG5cdFx0XHRyZXR1cm4gbztcblx0XHRjYXNlICdudW1iZXInOiByZXR1cm4gd3JpdGV4dGFnKChzfDApPT1zPyd2dDppNCc6J3Z0OnI4JywgZXNjYXBleG1sKFN0cmluZyhzKSkpO1xuXHRcdGNhc2UgJ2Jvb2xlYW4nOiByZXR1cm4gd3JpdGV4dGFnKCd2dDpib29sJyxzPyd0cnVlJzonZmFsc2UnKTtcblx0fVxuXHRpZihzIGluc3RhbmNlb2YgRGF0ZSkgcmV0dXJuIHdyaXRleHRhZygndnQ6ZmlsZXRpbWUnLCB3cml0ZV93M2NkdGYocykpO1xuXHR0aHJvdyBuZXcgRXJyb3IoXCJVbmFibGUgdG8gc2VyaWFsaXplIFwiICsgcyk7XG59XG5cbnZhciBYTUxOUyA9ICh7XG5cdCdkYyc6ICdodHRwOi8vcHVybC5vcmcvZGMvZWxlbWVudHMvMS4xLycsXG5cdCdkY3Rlcm1zJzogJ2h0dHA6Ly9wdXJsLm9yZy9kYy90ZXJtcy8nLFxuXHQnZGNtaXR5cGUnOiAnaHR0cDovL3B1cmwub3JnL2RjL2RjbWl0eXBlLycsXG5cdCdteCc6ICdodHRwOi8vc2NoZW1hcy5taWNyb3NvZnQuY29tL29mZmljZS9tYWMvZXhjZWwvMjAwOC9tYWluJyxcblx0J3InOiAnaHR0cDovL3NjaGVtYXMub3BlbnhtbGZvcm1hdHMub3JnL29mZmljZURvY3VtZW50LzIwMDYvcmVsYXRpb25zaGlwcycsXG5cdCdzanMnOiAnaHR0cDovL3NjaGVtYXMub3BlbnhtbGZvcm1hdHMub3JnL3BhY2thZ2UvMjAwNi9zaGVldGpzL2NvcmUtcHJvcGVydGllcycsXG5cdCd2dCc6ICdodHRwOi8vc2NoZW1hcy5vcGVueG1sZm9ybWF0cy5vcmcvb2ZmaWNlRG9jdW1lbnQvMjAwNi9kb2NQcm9wc1ZUeXBlcycsXG5cdCd4c2knOiAnaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UnLFxuXHQneHNkJzogJ2h0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hJ1xufSk7XG5cblhNTE5TLm1haW4gPSBbXG5cdCdodHRwOi8vc2NoZW1hcy5vcGVueG1sZm9ybWF0cy5vcmcvc3ByZWFkc2hlZXRtbC8yMDA2L21haW4nLFxuXHQnaHR0cDovL3B1cmwub2NsYy5vcmcvb294bWwvc3ByZWFkc2hlZXRtbC9tYWluJyxcblx0J2h0dHA6Ly9zY2hlbWFzLm1pY3Jvc29mdC5jb20vb2ZmaWNlL2V4Y2VsLzIwMDYvbWFpbicsXG5cdCdodHRwOi8vc2NoZW1hcy5taWNyb3NvZnQuY29tL29mZmljZS9leGNlbC8yMDA2LzInXG5dO1xuXG52YXIgWExNTE5TID0gKHtcblx0J28nOiAgICAndXJuOnNjaGVtYXMtbWljcm9zb2Z0LWNvbTpvZmZpY2U6b2ZmaWNlJyxcblx0J3gnOiAgICAndXJuOnNjaGVtYXMtbWljcm9zb2Z0LWNvbTpvZmZpY2U6ZXhjZWwnLFxuXHQnc3MnOiAgICd1cm46c2NoZW1hcy1taWNyb3NvZnQtY29tOm9mZmljZTpzcHJlYWRzaGVldCcsXG5cdCdkdCc6ICAgJ3V1aWQ6QzJGNDEwMTAtNjVCMy0xMWQxLUEyOUYtMDBBQTAwQzE0ODgyJyxcblx0J212JzogICAnaHR0cDovL21hY1ZtbFNjaGVtYVVyaScsXG5cdCd2JzogICAgJ3VybjpzY2hlbWFzLW1pY3Jvc29mdC1jb206dm1sJyxcblx0J2h0bWwnOiAnaHR0cDovL3d3dy53My5vcmcvVFIvUkVDLWh0bWw0MCdcbn0pO1xuZnVuY3Rpb24gcmVhZF9kb3VibGVfbGUoYiwgaWR4KSB7XG5cdHZhciBzID0gMSAtIDIgKiAoYltpZHggKyA3XSA+Pj4gNyk7XG5cdHZhciBlID0gKChiW2lkeCArIDddICYgMHg3ZikgPDwgNCkgKyAoKGJbaWR4ICsgNl0gPj4+IDQpICYgMHgwZik7XG5cdHZhciBtID0gKGJbaWR4KzZdJjB4MGYpO1xuXHRmb3IodmFyIGkgPSA1OyBpID49IDA7IC0taSkgbSA9IG0gKiAyNTYgKyBiW2lkeCArIGldO1xuXHRpZihlID09IDB4N2ZmKSByZXR1cm4gbSA9PSAwID8gKHMgKiBJbmZpbml0eSkgOiBOYU47XG5cdGlmKGUgPT0gMCkgZSA9IC0xMDIyO1xuXHRlbHNlIHsgZSAtPSAxMDIzOyBtICs9IE1hdGgucG93KDIsNTIpOyB9XG5cdHJldHVybiBzICogTWF0aC5wb3coMiwgZSAtIDUyKSAqIG07XG59XG5cbmZ1bmN0aW9uIHdyaXRlX2RvdWJsZV9sZShiLCB2LCBpZHgpIHtcblx0dmFyIGJzID0gKCgoKHYgPCAwKSB8fCAoMS92ID09IC1JbmZpbml0eSkpID8gMSA6IDApIDw8IDcpLCBlID0gMCwgbSA9IDA7XG5cdHZhciBhdiA9IGJzID8gKC12KSA6IHY7XG5cdGlmKCFpc0Zpbml0ZShhdikpIHsgZSA9IDB4N2ZmOyBtID0gaXNOYU4odikgPyAweDY5NjkgOiAwOyB9XG5cdGVsc2UgaWYoYXYgPT0gMCkgZSA9IG0gPSAwO1xuXHRlbHNlIHtcblx0XHRlID0gTWF0aC5mbG9vcihNYXRoLmxvZyhhdikgLyBNYXRoLkxOMik7XG5cdFx0bSA9IGF2ICogTWF0aC5wb3coMiwgNTIgLSBlKTtcblx0XHRpZigoZSA8PSAtMTAyMykgJiYgKCFpc0Zpbml0ZShtKSB8fCAobSA8IE1hdGgucG93KDIsNTIpKSkpIHsgZSA9IC0xMDIyOyB9XG5cdFx0ZWxzZSB7IG0gLT0gTWF0aC5wb3coMiw1Mik7IGUrPTEwMjM7IH1cblx0fVxuXHRmb3IodmFyIGkgPSAwOyBpIDw9IDU7ICsraSwgbS89MjU2KSBiW2lkeCArIGldID0gbSAmIDB4ZmY7XG5cdGJbaWR4ICsgNl0gPSAoKGUgJiAweDBmKSA8PCA0KSB8IChtICYgMHhmKTtcblx0YltpZHggKyA3XSA9IChlID4+IDQpIHwgYnM7XG59XG5cbnZhciBfX3RvQnVmZmVyID0gZnVuY3Rpb24oYnVmcykgeyB2YXIgeD1bXSx3PTEwMjQwOyBmb3IodmFyIGk9MDtpPGJ1ZnNbMF0ubGVuZ3RoOysraSkgaWYoYnVmc1swXVtpXSkgZm9yKHZhciBqPTAsTD1idWZzWzBdW2ldLmxlbmd0aDtqPEw7ais9dykgeC5wdXNoLmFwcGx5KHgsIGJ1ZnNbMF1baV0uc2xpY2UoaixqK3cpKTsgcmV0dXJuIHg7IH07XG52YXIgX19fdG9CdWZmZXIgPSBfX3RvQnVmZmVyO1xudmFyIF9fdXRmMTZsZSA9IGZ1bmN0aW9uKGIscyxlKSB7IHZhciBzcz1bXTsgZm9yKHZhciBpPXM7IGk8ZTsgaSs9Mikgc3MucHVzaChTdHJpbmcuZnJvbUNoYXJDb2RlKF9fcmVhZFVJbnQxNkxFKGIsaSkpKTsgcmV0dXJuIHNzLmpvaW4oXCJcIikucmVwbGFjZShjaHIwLCcnKTsgfTtcbnZhciBfX191dGYxNmxlID0gX191dGYxNmxlO1xudmFyIF9faGV4bGlmeSA9IGZ1bmN0aW9uKGIscyxsKSB7IHZhciBzcz1bXTsgZm9yKHZhciBpPXM7IGk8cytsOyArK2kpIHNzLnB1c2goKFwiMFwiICsgYltpXS50b1N0cmluZygxNikpLnNsaWNlKC0yKSk7IHJldHVybiBzcy5qb2luKFwiXCIpOyB9O1xudmFyIF9fX2hleGxpZnkgPSBfX2hleGxpZnk7XG52YXIgX191dGY4ID0gZnVuY3Rpb24oYixzLGUpIHsgdmFyIHNzPVtdOyBmb3IodmFyIGk9czsgaTxlOyBpKyspIHNzLnB1c2goU3RyaW5nLmZyb21DaGFyQ29kZShfX3JlYWRVSW50OChiLGkpKSk7IHJldHVybiBzcy5qb2luKFwiXCIpOyB9O1xudmFyIF9fX3V0ZjggPSBfX3V0Zjg7XG52YXIgX19scHN0ciA9IGZ1bmN0aW9uKGIsaSkgeyB2YXIgbGVuID0gX19yZWFkVUludDMyTEUoYixpKTsgcmV0dXJuIGxlbiA+IDAgPyBfX3V0ZjgoYiwgaSs0LGkrNCtsZW4tMSkgOiBcIlwiO307XG52YXIgX19fbHBzdHIgPSBfX2xwc3RyO1xudmFyIF9fY3BzdHIgPSBmdW5jdGlvbihiLGkpIHsgdmFyIGxlbiA9IF9fcmVhZFVJbnQzMkxFKGIsaSk7IHJldHVybiBsZW4gPiAwID8gX191dGY4KGIsIGkrNCxpKzQrbGVuLTEpIDogXCJcIjt9O1xudmFyIF9fX2Nwc3RyID0gX19jcHN0cjtcbnZhciBfX2xwd3N0ciA9IGZ1bmN0aW9uKGIsaSkgeyB2YXIgbGVuID0gMipfX3JlYWRVSW50MzJMRShiLGkpOyByZXR1cm4gbGVuID4gMCA/IF9fdXRmOChiLCBpKzQsaSs0K2xlbi0xKSA6IFwiXCI7fTtcbnZhciBfX19scHdzdHIgPSBfX2xwd3N0cjtcbnZhciBfX2xwcDQsIF9fX2xwcDQ7XG5fX2xwcDQgPSBfX19scHA0ID0gZnVuY3Rpb24gbHBwNF8oYixpKSB7IHZhciBsZW4gPSBfX3JlYWRVSW50MzJMRShiLGkpOyByZXR1cm4gbGVuID4gMCA/IF9fdXRmMTZsZShiLCBpKzQsaSs0K2xlbikgOiBcIlwiO307XG52YXIgX184bHBwNCA9IGZ1bmN0aW9uKGIsaSkgeyB2YXIgbGVuID0gX19yZWFkVUludDMyTEUoYixpKTsgcmV0dXJuIGxlbiA+IDAgPyBfX3V0ZjgoYiwgaSs0LGkrNCtsZW4pIDogXCJcIjt9O1xudmFyIF9fXzhscHA0ID0gX184bHBwNDtcbnZhciBfX2RvdWJsZSwgX19fZG91YmxlO1xuX19kb3VibGUgPSBfX19kb3VibGUgPSBmdW5jdGlvbihiLCBpZHgpIHsgcmV0dXJuIHJlYWRfZG91YmxlX2xlKGIsIGlkeCk7fTtcbnZhciBpc19idWYgPSBmdW5jdGlvbiBpc19idWZfYShhKSB7IHJldHVybiBBcnJheS5pc0FycmF5KGEpOyB9O1xuXG5pZihoYXNfYnVmKSB7XG5cdF9fdXRmMTZsZSA9IGZ1bmN0aW9uKGIscyxlKSB7IGlmKCFCdWZmZXIuaXNCdWZmZXIoYikpIHJldHVybiBfX191dGYxNmxlKGIscyxlKTsgcmV0dXJuIGIudG9TdHJpbmcoJ3V0ZjE2bGUnLHMsZSkucmVwbGFjZShjaHIwLCcnKS8qLnJlcGxhY2UoY2hyMSwnIScpKi87IH07XG5cdF9faGV4bGlmeSA9IGZ1bmN0aW9uKGIscyxsKSB7IHJldHVybiBCdWZmZXIuaXNCdWZmZXIoYikgPyBiLnRvU3RyaW5nKCdoZXgnLHMscytsKSA6IF9fX2hleGxpZnkoYixzLGwpOyB9O1xuXHRfX2xwc3RyID0gZnVuY3Rpb24gbHBzdHJfYihiLCBpKSB7IGlmKCFCdWZmZXIuaXNCdWZmZXIoYikpIHJldHVybiBfX19scHN0cihiLCBpKTsgdmFyIGxlbiA9IGIucmVhZFVJbnQzMkxFKGkpOyByZXR1cm4gbGVuID4gMCA/IGIudG9TdHJpbmcoJ3V0ZjgnLGkrNCxpKzQrbGVuLTEpIDogXCJcIjt9O1xuXHRfX2Nwc3RyID0gZnVuY3Rpb24gY3BzdHJfYihiLCBpKSB7IGlmKCFCdWZmZXIuaXNCdWZmZXIoYikpIHJldHVybiBfX19jcHN0cihiLCBpKTsgdmFyIGxlbiA9IGIucmVhZFVJbnQzMkxFKGkpOyByZXR1cm4gbGVuID4gMCA/IGIudG9TdHJpbmcoJ3V0ZjgnLGkrNCxpKzQrbGVuLTEpIDogXCJcIjt9O1xuXHRfX2xwd3N0ciA9IGZ1bmN0aW9uIGxwd3N0cl9iKGIsIGkpIHsgaWYoIUJ1ZmZlci5pc0J1ZmZlcihiKSkgcmV0dXJuIF9fX2xwd3N0cihiLCBpKTsgdmFyIGxlbiA9IDIqYi5yZWFkVUludDMyTEUoaSk7IHJldHVybiBiLnRvU3RyaW5nKCd1dGYxNmxlJyxpKzQsaSs0K2xlbi0xKTt9O1xuXHRfX2xwcDQgPSBmdW5jdGlvbiBscHA0X2IoYiwgaSkgeyBpZighQnVmZmVyLmlzQnVmZmVyKGIpKSByZXR1cm4gX19fbHBwNChiLCBpKTsgdmFyIGxlbiA9IGIucmVhZFVJbnQzMkxFKGkpOyByZXR1cm4gYi50b1N0cmluZygndXRmMTZsZScsaSs0LGkrNCtsZW4pO307XG5cdF9fOGxwcDQgPSBmdW5jdGlvbiBscHA0XzhiKGIsIGkpIHsgaWYoIUJ1ZmZlci5pc0J1ZmZlcihiKSkgcmV0dXJuIF9fXzhscHA0KGIsIGkpOyB2YXIgbGVuID0gYi5yZWFkVUludDMyTEUoaSk7IHJldHVybiBiLnRvU3RyaW5nKCd1dGY4JyxpKzQsaSs0K2xlbik7fTtcblx0X191dGY4ID0gZnVuY3Rpb24gdXRmOF9iKGIsIHMsIGUpIHsgcmV0dXJuIChCdWZmZXIuaXNCdWZmZXIoYikpID8gYi50b1N0cmluZygndXRmOCcscyxlKSA6IF9fX3V0ZjgoYixzLGUpOyB9O1xuXHRfX3RvQnVmZmVyID0gZnVuY3Rpb24oYnVmcykgeyByZXR1cm4gKGJ1ZnNbMF0ubGVuZ3RoID4gMCAmJiBCdWZmZXIuaXNCdWZmZXIoYnVmc1swXVswXSkpID8gQnVmZmVyLmNvbmNhdChidWZzWzBdKSA6IF9fX3RvQnVmZmVyKGJ1ZnMpO307XG5cdGJjb25jYXQgPSBmdW5jdGlvbihidWZzKSB7IHJldHVybiBCdWZmZXIuaXNCdWZmZXIoYnVmc1swXSkgPyBCdWZmZXIuY29uY2F0KGJ1ZnMpIDogW10uY29uY2F0LmFwcGx5KFtdLCBidWZzKTsgfTtcblx0X19kb3VibGUgPSBmdW5jdGlvbiBkb3VibGVfKGIsIGkpIHsgaWYoQnVmZmVyLmlzQnVmZmVyKGIpKSByZXR1cm4gYi5yZWFkRG91YmxlTEUoaSk7IHJldHVybiBfX19kb3VibGUoYixpKTsgfTtcblx0aXNfYnVmID0gZnVuY3Rpb24gaXNfYnVmX2IoYSkgeyByZXR1cm4gQnVmZmVyLmlzQnVmZmVyKGEpIHx8IEFycmF5LmlzQXJyYXkoYSk7IH07XG59XG5cbi8qIGZyb20ganMteGxzICovXG5pZih0eXBlb2YgY3B0YWJsZSAhPT0gJ3VuZGVmaW5lZCcpIHtcblx0X191dGYxNmxlID0gZnVuY3Rpb24oYixzLGUpIHsgcmV0dXJuIGNwdGFibGUudXRpbHMuZGVjb2RlKDEyMDAsIGIuc2xpY2UocyxlKSkucmVwbGFjZShjaHIwLCAnJyk7IH07XG5cdF9fdXRmOCA9IGZ1bmN0aW9uKGIscyxlKSB7IHJldHVybiBjcHRhYmxlLnV0aWxzLmRlY29kZSg2NTAwMSwgYi5zbGljZShzLGUpKTsgfTtcblx0X19scHN0ciA9IGZ1bmN0aW9uKGIsaSkgeyB2YXIgbGVuID0gX19yZWFkVUludDMyTEUoYixpKTsgcmV0dXJuIGxlbiA+IDAgPyBjcHRhYmxlLnV0aWxzLmRlY29kZShjdXJyZW50X2Fuc2ksIGIuc2xpY2UoaSs0LCBpKzQrbGVuLTEpKSA6IFwiXCI7fTtcblx0X19jcHN0ciA9IGZ1bmN0aW9uKGIsaSkgeyB2YXIgbGVuID0gX19yZWFkVUludDMyTEUoYixpKTsgcmV0dXJuIGxlbiA+IDAgPyBjcHRhYmxlLnV0aWxzLmRlY29kZShjdXJyZW50X2NvZGVwYWdlLCBiLnNsaWNlKGkrNCwgaSs0K2xlbi0xKSkgOiBcIlwiO307XG5cdF9fbHB3c3RyID0gZnVuY3Rpb24oYixpKSB7IHZhciBsZW4gPSAyKl9fcmVhZFVJbnQzMkxFKGIsaSk7IHJldHVybiBsZW4gPiAwID8gY3B0YWJsZS51dGlscy5kZWNvZGUoMTIwMCwgYi5zbGljZShpKzQsaSs0K2xlbi0xKSkgOiBcIlwiO307XG5cdF9fbHBwNCA9IGZ1bmN0aW9uKGIsaSkgeyB2YXIgbGVuID0gX19yZWFkVUludDMyTEUoYixpKTsgcmV0dXJuIGxlbiA+IDAgPyBjcHRhYmxlLnV0aWxzLmRlY29kZSgxMjAwLCBiLnNsaWNlKGkrNCxpKzQrbGVuKSkgOiBcIlwiO307XG5cdF9fOGxwcDQgPSBmdW5jdGlvbihiLGkpIHsgdmFyIGxlbiA9IF9fcmVhZFVJbnQzMkxFKGIsaSk7IHJldHVybiBsZW4gPiAwID8gY3B0YWJsZS51dGlscy5kZWNvZGUoNjUwMDEsIGIuc2xpY2UoaSs0LGkrNCtsZW4pKSA6IFwiXCI7fTtcbn1cblxudmFyIF9fcmVhZFVJbnQ4ID0gZnVuY3Rpb24oYiwgaWR4KSB7IHJldHVybiBiW2lkeF07IH07XG52YXIgX19yZWFkVUludDE2TEUgPSBmdW5jdGlvbihiLCBpZHgpIHsgcmV0dXJuIChiW2lkeCsxXSooMTw8OCkpK2JbaWR4XTsgfTtcbnZhciBfX3JlYWRJbnQxNkxFID0gZnVuY3Rpb24oYiwgaWR4KSB7IHZhciB1ID0gKGJbaWR4KzFdKigxPDw4KSkrYltpZHhdOyByZXR1cm4gKHUgPCAweDgwMDApID8gdSA6ICgoMHhmZmZmIC0gdSArIDEpICogLTEpOyB9O1xudmFyIF9fcmVhZFVJbnQzMkxFID0gZnVuY3Rpb24oYiwgaWR4KSB7IHJldHVybiBiW2lkeCszXSooMTw8MjQpKyhiW2lkeCsyXTw8MTYpKyhiW2lkeCsxXTw8OCkrYltpZHhdOyB9O1xudmFyIF9fcmVhZEludDMyTEUgPSBmdW5jdGlvbihiLCBpZHgpIHsgcmV0dXJuIChiW2lkeCszXTw8MjQpfChiW2lkeCsyXTw8MTYpfChiW2lkeCsxXTw8OCl8YltpZHhdOyB9O1xudmFyIF9fcmVhZEludDMyQkUgPSBmdW5jdGlvbihiLCBpZHgpIHsgcmV0dXJuIChiW2lkeF08PDI0KXwoYltpZHgrMV08PDE2KXwoYltpZHgrMl08PDgpfGJbaWR4KzNdOyB9O1xuXG5mdW5jdGlvbiBSZWFkU2hpZnQoc2l6ZSwgdCkge1xuXHR2YXIgbz1cIlwiLCBvSSwgb1IsIG9vPVtdLCB3LCB2diwgaSwgbG9jO1xuXHRzd2l0Y2godCkge1xuXHRcdGNhc2UgJ2RiY3MnOlxuXHRcdFx0bG9jID0gdGhpcy5sO1xuXHRcdFx0aWYoaGFzX2J1ZiAmJiBCdWZmZXIuaXNCdWZmZXIodGhpcykpIG8gPSB0aGlzLnNsaWNlKHRoaXMubCwgdGhpcy5sKzIqc2l6ZSkudG9TdHJpbmcoXCJ1dGYxNmxlXCIpO1xuXHRcdFx0ZWxzZSBmb3IoaSA9IDA7IGkgPCBzaXplOyArK2kpIHsgbys9U3RyaW5nLmZyb21DaGFyQ29kZShfX3JlYWRVSW50MTZMRSh0aGlzLCBsb2MpKTsgbG9jKz0yOyB9XG5cdFx0XHRzaXplICo9IDI7XG5cdFx0XHRicmVhaztcblxuXHRcdGNhc2UgJ3V0ZjgnOiBvID0gX191dGY4KHRoaXMsIHRoaXMubCwgdGhpcy5sICsgc2l6ZSk7IGJyZWFrO1xuXHRcdGNhc2UgJ3V0ZjE2bGUnOiBzaXplICo9IDI7IG8gPSBfX3V0ZjE2bGUodGhpcywgdGhpcy5sLCB0aGlzLmwgKyBzaXplKTsgYnJlYWs7XG5cblx0XHRjYXNlICd3c3RyJzpcblx0XHRcdGlmKHR5cGVvZiBjcHRhYmxlICE9PSAndW5kZWZpbmVkJykgbyA9IGNwdGFibGUudXRpbHMuZGVjb2RlKGN1cnJlbnRfY29kZXBhZ2UsIHRoaXMuc2xpY2UodGhpcy5sLCB0aGlzLmwrMipzaXplKSk7XG5cdFx0XHRlbHNlIHJldHVybiBSZWFkU2hpZnQuY2FsbCh0aGlzLCBzaXplLCAnZGJjcycpO1xuXHRcdFx0c2l6ZSA9IDIgKiBzaXplOyBicmVhaztcblxuXHRcdC8qIFtNUy1PTEVEU10gMi4xLjQgTGVuZ3RoUHJlZml4ZWRBbnNpU3RyaW5nICovXG5cdFx0Y2FzZSAnbHBzdHItYW5zaSc6IG8gPSBfX2xwc3RyKHRoaXMsIHRoaXMubCk7IHNpemUgPSA0ICsgX19yZWFkVUludDMyTEUodGhpcywgdGhpcy5sKTsgYnJlYWs7XG5cdFx0Y2FzZSAnbHBzdHItY3AnOiBvID0gX19jcHN0cih0aGlzLCB0aGlzLmwpOyBzaXplID0gNCArIF9fcmVhZFVJbnQzMkxFKHRoaXMsIHRoaXMubCk7IGJyZWFrO1xuXHRcdC8qIFtNUy1PTEVEU10gMi4xLjUgTGVuZ3RoUHJlZml4ZWRVbmljb2RlU3RyaW5nICovXG5cdFx0Y2FzZSAnbHB3c3RyJzogbyA9IF9fbHB3c3RyKHRoaXMsIHRoaXMubCk7IHNpemUgPSA0ICsgMiAqIF9fcmVhZFVJbnQzMkxFKHRoaXMsIHRoaXMubCk7IGJyZWFrO1xuXHRcdC8qIFtNUy1PRkZDUllQVE9dIDIuMS4yIExlbmd0aC1QcmVmaXhlZCBQYWRkZWQgVW5pY29kZSBTdHJpbmcgKFVOSUNPREUtTFAtUDQpICovXG5cdFx0Y2FzZSAnbHBwNCc6IHNpemUgPSA0ICsgIF9fcmVhZFVJbnQzMkxFKHRoaXMsIHRoaXMubCk7IG8gPSBfX2xwcDQodGhpcywgdGhpcy5sKTsgaWYoc2l6ZSAmIDB4MDIpIHNpemUgKz0gMjsgYnJlYWs7XG5cdFx0LyogW01TLU9GRkNSWVBUT10gMi4xLjMgTGVuZ3RoLVByZWZpeGVkIFVURi04IFN0cmluZyAoVVRGLTgtTFAtUDQpICovXG5cdFx0Y2FzZSAnOGxwcDQnOiBzaXplID0gNCArICBfX3JlYWRVSW50MzJMRSh0aGlzLCB0aGlzLmwpOyBvID0gX184bHBwNCh0aGlzLCB0aGlzLmwpOyBpZihzaXplICYgMHgwMykgc2l6ZSArPSA0IC0gKHNpemUgJiAweDAzKTsgYnJlYWs7XG5cblx0XHRjYXNlICdjc3RyJzogc2l6ZSA9IDA7IG8gPSBcIlwiO1xuXHRcdFx0d2hpbGUoKHc9X19yZWFkVUludDgodGhpcywgdGhpcy5sICsgc2l6ZSsrKSkhPT0wKSBvby5wdXNoKF9nZXRjaGFyKHcpKTtcblx0XHRcdG8gPSBvby5qb2luKFwiXCIpOyBicmVhaztcblx0XHRjYXNlICdfd3N0cic6IHNpemUgPSAwOyBvID0gXCJcIjtcblx0XHRcdHdoaWxlKCh3PV9fcmVhZFVJbnQxNkxFKHRoaXMsdGhpcy5sICtzaXplKSkhPT0wKXtvby5wdXNoKF9nZXRjaGFyKHcpKTtzaXplKz0yO31cblx0XHRcdHNpemUrPTI7IG8gPSBvby5qb2luKFwiXCIpOyBicmVhaztcblxuXHRcdC8qIHNiY3MgYW5kIGRiY3Mgc3VwcG9ydCBjb250aW51ZSByZWNvcmRzIGluIHRoZSBTU1Qgd2F5IFRPRE8gY29kZXBhZ2VzICovXG5cdFx0Y2FzZSAnZGJjcy1jb250JzogbyA9IFwiXCI7IGxvYyA9IHRoaXMubDtcblx0XHRcdGZvcihpID0gMDsgaSA8IHNpemU7ICsraSkge1xuXHRcdFx0XHRpZih0aGlzLmxlbnMgJiYgdGhpcy5sZW5zLmluZGV4T2YobG9jKSAhPT0gLTEpIHtcblx0XHRcdFx0XHR3ID0gX19yZWFkVUludDgodGhpcywgbG9jKTtcblx0XHRcdFx0XHR0aGlzLmwgPSBsb2MgKyAxO1xuXHRcdFx0XHRcdHZ2ID0gUmVhZFNoaWZ0LmNhbGwodGhpcywgc2l6ZS1pLCB3ID8gJ2RiY3MtY29udCcgOiAnc2Jjcy1jb250Jyk7XG5cdFx0XHRcdFx0cmV0dXJuIG9vLmpvaW4oXCJcIikgKyB2djtcblx0XHRcdFx0fVxuXHRcdFx0XHRvby5wdXNoKF9nZXRjaGFyKF9fcmVhZFVJbnQxNkxFKHRoaXMsIGxvYykpKTtcblx0XHRcdFx0bG9jKz0yO1xuXHRcdFx0fSBvID0gb28uam9pbihcIlwiKTsgc2l6ZSAqPSAyOyBicmVhaztcblxuXHRcdGNhc2UgJ2Nwc3RyJzpcblx0XHRcdGlmKHR5cGVvZiBjcHRhYmxlICE9PSAndW5kZWZpbmVkJykge1xuXHRcdFx0XHRvID0gY3B0YWJsZS51dGlscy5kZWNvZGUoY3VycmVudF9jb2RlcGFnZSwgdGhpcy5zbGljZSh0aGlzLmwsIHRoaXMubCArIHNpemUpKTtcblx0XHRcdFx0YnJlYWs7XG5cdFx0XHR9XG5cdFx0LyogZmFsbHMgdGhyb3VnaCAqL1xuXHRcdGNhc2UgJ3NiY3MtY29udCc6IG8gPSBcIlwiOyBsb2MgPSB0aGlzLmw7XG5cdFx0XHRmb3IoaSA9IDA7IGkgIT0gc2l6ZTsgKytpKSB7XG5cdFx0XHRcdGlmKHRoaXMubGVucyAmJiB0aGlzLmxlbnMuaW5kZXhPZihsb2MpICE9PSAtMSkge1xuXHRcdFx0XHRcdHcgPSBfX3JlYWRVSW50OCh0aGlzLCBsb2MpO1xuXHRcdFx0XHRcdHRoaXMubCA9IGxvYyArIDE7XG5cdFx0XHRcdFx0dnYgPSBSZWFkU2hpZnQuY2FsbCh0aGlzLCBzaXplLWksIHcgPyAnZGJjcy1jb250JyA6ICdzYmNzLWNvbnQnKTtcblx0XHRcdFx0XHRyZXR1cm4gb28uam9pbihcIlwiKSArIHZ2O1xuXHRcdFx0XHR9XG5cdFx0XHRcdG9vLnB1c2goX2dldGNoYXIoX19yZWFkVUludDgodGhpcywgbG9jKSkpO1xuXHRcdFx0XHRsb2MrPTE7XG5cdFx0XHR9IG8gPSBvby5qb2luKFwiXCIpOyBicmVhaztcblxuXHRcdGRlZmF1bHQ6XG5cdHN3aXRjaChzaXplKSB7XG5cdFx0Y2FzZSAxOiBvSSA9IF9fcmVhZFVJbnQ4KHRoaXMsIHRoaXMubCk7IHRoaXMubCsrOyByZXR1cm4gb0k7XG5cdFx0Y2FzZSAyOiBvSSA9ICh0ID09PSAnaScgPyBfX3JlYWRJbnQxNkxFIDogX19yZWFkVUludDE2TEUpKHRoaXMsIHRoaXMubCk7IHRoaXMubCArPSAyOyByZXR1cm4gb0k7XG5cdFx0Y2FzZSA0OiBjYXNlIC00OlxuXHRcdFx0aWYodCA9PT0gJ2knIHx8ICgodGhpc1t0aGlzLmwrM10gJiAweDgwKT09PTApKSB7IG9JID0gKChzaXplID4gMCkgPyBfX3JlYWRJbnQzMkxFIDogX19yZWFkSW50MzJCRSkodGhpcywgdGhpcy5sKTsgdGhpcy5sICs9IDQ7IHJldHVybiBvSTsgfVxuXHRcdFx0ZWxzZSB7IG9SID0gX19yZWFkVUludDMyTEUodGhpcywgdGhpcy5sKTsgdGhpcy5sICs9IDQ7IH0gcmV0dXJuIG9SO1xuXHRcdGNhc2UgODogY2FzZSAtODpcblx0XHRcdGlmKHQgPT09ICdmJykge1xuXHRcdFx0XHRpZihzaXplID09IDgpIG9SID0gX19kb3VibGUodGhpcywgdGhpcy5sKTtcblx0XHRcdFx0ZWxzZSBvUiA9IF9fZG91YmxlKFt0aGlzW3RoaXMubCs3XSx0aGlzW3RoaXMubCs2XSx0aGlzW3RoaXMubCs1XSx0aGlzW3RoaXMubCs0XSx0aGlzW3RoaXMubCszXSx0aGlzW3RoaXMubCsyXSx0aGlzW3RoaXMubCsxXSx0aGlzW3RoaXMubCswXV0sIDApO1xuXHRcdFx0XHR0aGlzLmwgKz0gODsgcmV0dXJuIG9SO1xuXHRcdFx0fSBlbHNlIHNpemUgPSA4O1xuXHRcdC8qIGZhbGxzIHRocm91Z2ggKi9cblx0XHRjYXNlIDE2OiBvID0gX19oZXhsaWZ5KHRoaXMsIHRoaXMubCwgc2l6ZSk7IGJyZWFrO1xuXHR9fVxuXHR0aGlzLmwrPXNpemU7IHJldHVybiBvO1xufVxuXG52YXIgX193cml0ZVVJbnQzMkxFID0gZnVuY3Rpb24oYiwgdmFsLCBpZHgpIHsgYltpZHhdID0gKHZhbCAmIDB4RkYpOyBiW2lkeCsxXSA9ICgodmFsID4+PiA4KSAmIDB4RkYpOyBiW2lkeCsyXSA9ICgodmFsID4+PiAxNikgJiAweEZGKTsgYltpZHgrM10gPSAoKHZhbCA+Pj4gMjQpICYgMHhGRik7IH07XG52YXIgX193cml0ZUludDMyTEUgID0gZnVuY3Rpb24oYiwgdmFsLCBpZHgpIHsgYltpZHhdID0gKHZhbCAmIDB4RkYpOyBiW2lkeCsxXSA9ICgodmFsID4+IDgpICYgMHhGRik7IGJbaWR4KzJdID0gKCh2YWwgPj4gMTYpICYgMHhGRik7IGJbaWR4KzNdID0gKCh2YWwgPj4gMjQpICYgMHhGRik7IH07XG52YXIgX193cml0ZVVJbnQxNkxFID0gZnVuY3Rpb24oYiwgdmFsLCBpZHgpIHsgYltpZHhdID0gKHZhbCAmIDB4RkYpOyBiW2lkeCsxXSA9ICgodmFsID4+PiA4KSAmIDB4RkYpOyB9O1xuXG5mdW5jdGlvbiBXcml0ZVNoaWZ0KHQsIHZhbCwgZikge1xuXHR2YXIgc2l6ZSA9IDAsIGkgPSAwO1xuXHRpZihmID09PSAnZGJjcycpIHtcbmZvcihpID0gMDsgaSAhPSB2YWwubGVuZ3RoOyArK2kpIF9fd3JpdGVVSW50MTZMRSh0aGlzLCB2YWwuY2hhckNvZGVBdChpKSwgdGhpcy5sICsgMiAqIGkpO1xuXHRcdHNpemUgPSAyICogdmFsLmxlbmd0aDtcblx0fSBlbHNlIGlmKGYgPT09ICdzYmNzJykge1xuXHRcdGlmKHR5cGVvZiBjcHRhYmxlICE9PSAndW5kZWZpbmVkJyAmJiBjdXJyZW50X2Fuc2kgPT0gODc0KSB7XG5cdFx0XHQvKiBUT0RPOiB1c2UgdGFibGVzIGRpcmVjdGx5LCBkb24ndCBlbmNvZGUgKi9cbmZvcihpID0gMDsgaSAhPSB2YWwubGVuZ3RoOyArK2kpIHtcblx0XHRcdFx0dmFyIGNwcGF5bG9hZCA9IGNwdGFibGUudXRpbHMuZW5jb2RlKGN1cnJlbnRfYW5zaSwgdmFsLmNoYXJBdChpKSk7XG5cdFx0XHRcdHRoaXNbdGhpcy5sICsgaV0gPSBjcHBheWxvYWRbMF07XG5cdFx0XHR9XG5cdFx0fSBlbHNlIHtcbnZhbCA9IHZhbC5yZXBsYWNlKC9bXlxceDAwLVxceDdGXS9nLCBcIl9cIik7XG5mb3IoaSA9IDA7IGkgIT0gdmFsLmxlbmd0aDsgKytpKSB0aGlzW3RoaXMubCArIGldID0gKHZhbC5jaGFyQ29kZUF0KGkpICYgMHhGRik7XG5cdFx0fVxuXHRcdHNpemUgPSB2YWwubGVuZ3RoO1xuXHR9IGVsc2UgaWYoZiA9PT0gJ2hleCcpIHtcblx0XHRmb3IoOyBpIDwgdDsgKytpKSB7XG50aGlzW3RoaXMubCsrXSA9IChwYXJzZUludCh2YWwuc2xpY2UoMippLCAyKmkrMiksIDE2KXx8MCk7XG5cdFx0fSByZXR1cm4gdGhpcztcblx0fSBlbHNlIGlmKGYgPT09ICd1dGYxNmxlJykge1xudmFyIGVuZCA9IE1hdGgubWluKHRoaXMubCArIHQsIHRoaXMubGVuZ3RoKTtcblx0XHRcdGZvcihpID0gMDsgaSA8IE1hdGgubWluKHZhbC5sZW5ndGgsIHQpOyArK2kpIHtcblx0XHRcdFx0dmFyIGNjID0gdmFsLmNoYXJDb2RlQXQoaSk7XG5cdFx0XHRcdHRoaXNbdGhpcy5sKytdID0gKGNjICYgMHhmZik7XG5cdFx0XHRcdHRoaXNbdGhpcy5sKytdID0gKGNjID4+IDgpO1xuXHRcdFx0fVxuXHRcdFx0d2hpbGUodGhpcy5sIDwgZW5kKSB0aGlzW3RoaXMubCsrXSA9IDA7XG5cdFx0XHRyZXR1cm4gdGhpcztcblx0fSBlbHNlICBzd2l0Y2godCkge1xuXHRcdGNhc2UgIDE6IHNpemUgPSAxOyB0aGlzW3RoaXMubF0gPSB2YWwmMHhGRjsgYnJlYWs7XG5cdFx0Y2FzZSAgMjogc2l6ZSA9IDI7IHRoaXNbdGhpcy5sXSA9IHZhbCYweEZGOyB2YWwgPj4+PSA4OyB0aGlzW3RoaXMubCsxXSA9IHZhbCYweEZGOyBicmVhaztcblx0XHRjYXNlICAzOiBzaXplID0gMzsgdGhpc1t0aGlzLmxdID0gdmFsJjB4RkY7IHZhbCA+Pj49IDg7IHRoaXNbdGhpcy5sKzFdID0gdmFsJjB4RkY7IHZhbCA+Pj49IDg7IHRoaXNbdGhpcy5sKzJdID0gdmFsJjB4RkY7IGJyZWFrO1xuXHRcdGNhc2UgIDQ6IHNpemUgPSA0OyBfX3dyaXRlVUludDMyTEUodGhpcywgdmFsLCB0aGlzLmwpOyBicmVhaztcblx0XHRjYXNlICA4OiBzaXplID0gODsgaWYoZiA9PT0gJ2YnKSB7IHdyaXRlX2RvdWJsZV9sZSh0aGlzLCB2YWwsIHRoaXMubCk7IGJyZWFrOyB9XG5cdFx0LyogZmFsbHMgdGhyb3VnaCAqL1xuXHRcdGNhc2UgMTY6IGJyZWFrO1xuXHRcdGNhc2UgLTQ6IHNpemUgPSA0OyBfX3dyaXRlSW50MzJMRSh0aGlzLCB2YWwsIHRoaXMubCk7IGJyZWFrO1xuXHR9XG5cdHRoaXMubCArPSBzaXplOyByZXR1cm4gdGhpcztcbn1cblxuZnVuY3Rpb24gQ2hlY2tGaWVsZChoZXhzdHIsIGZsZCkge1xuXHR2YXIgbSA9IF9faGV4bGlmeSh0aGlzLHRoaXMubCxoZXhzdHIubGVuZ3RoPj4xKTtcblx0aWYobSAhPT0gaGV4c3RyKSB0aHJvdyBuZXcgRXJyb3IoZmxkICsgJ0V4cGVjdGVkICcgKyBoZXhzdHIgKyAnIHNhdyAnICsgbSk7XG5cdHRoaXMubCArPSBoZXhzdHIubGVuZ3RoPj4xO1xufVxuXG5mdW5jdGlvbiBwcmVwX2Jsb2IoYmxvYiwgcG9zKSB7XG5cdGJsb2IubCA9IHBvcztcblx0YmxvYi5yZWFkX3NoaWZ0ID0gUmVhZFNoaWZ0O1xuXHRibG9iLmNoayA9IENoZWNrRmllbGQ7XG5cdGJsb2Iud3JpdGVfc2hpZnQgPSBXcml0ZVNoaWZ0O1xufVxuXG5mdW5jdGlvbiBwYXJzZW5vb3AoYmxvYiwgbGVuZ3RoKSB7IGJsb2IubCArPSBsZW5ndGg7IH1cblxuZnVuY3Rpb24gbmV3X2J1Zihzeikge1xuXHR2YXIgbyA9IG5ld19yYXdfYnVmKHN6KTtcblx0cHJlcF9ibG9iKG8sIDApO1xuXHRyZXR1cm4gbztcbn1cblxuLyogW01TLVhMU0JdIDIuMS40IFJlY29yZCAqL1xuZnVuY3Rpb24gcmVjb3JkaG9wcGVyKGRhdGEsIGNiLCBvcHRzKSB7XG5cdGlmKCFkYXRhKSByZXR1cm47XG5cdHZhciB0bXBieXRlLCBjbnRieXRlLCBsZW5ndGg7XG5cdHByZXBfYmxvYihkYXRhLCBkYXRhLmwgfHwgMCk7XG5cdHZhciBMID0gZGF0YS5sZW5ndGgsIFJUID0gMCwgdGd0ID0gMDtcblx0d2hpbGUoZGF0YS5sIDwgTCkge1xuXHRcdFJUID0gZGF0YS5yZWFkX3NoaWZ0KDEpO1xuXHRcdGlmKFJUICYgMHg4MCkgUlQgPSAoUlQgJiAweDdGKSArICgoZGF0YS5yZWFkX3NoaWZ0KDEpICYgMHg3Rik8PDcpO1xuXHRcdHZhciBSID0gWExTQlJlY29yZEVudW1bUlRdIHx8IFhMU0JSZWNvcmRFbnVtWzB4RkZGRl07XG5cdFx0dG1wYnl0ZSA9IGRhdGEucmVhZF9zaGlmdCgxKTtcblx0XHRsZW5ndGggPSB0bXBieXRlICYgMHg3Rjtcblx0XHRmb3IoY250Ynl0ZSA9IDE7IGNudGJ5dGUgPDQgJiYgKHRtcGJ5dGUgJiAweDgwKTsgKytjbnRieXRlKSBsZW5ndGggKz0gKCh0bXBieXRlID0gZGF0YS5yZWFkX3NoaWZ0KDEpKSAmIDB4N0YpPDwoNypjbnRieXRlKTtcblx0XHR0Z3QgPSBkYXRhLmwgKyBsZW5ndGg7XG5cdFx0dmFyIGQgPSAoUi5mfHxwYXJzZW5vb3ApKGRhdGEsIGxlbmd0aCwgb3B0cyk7XG5cdFx0ZGF0YS5sID0gdGd0O1xuXHRcdGlmKGNiKGQsIFIubiwgUlQpKSByZXR1cm47XG5cdH1cbn1cblxuLyogY29udHJvbCBidWZmZXIgdXNhZ2UgZm9yIGZpeGVkLWxlbmd0aCBidWZmZXJzICovXG5mdW5jdGlvbiBidWZfYXJyYXkoKSB7XG5cdHZhciBidWZzID0gW10sIGJsa3N6ID0gaGFzX2J1ZiA/IDI1NiA6IDIwNDg7XG5cdHZhciBuZXdibGsgPSBmdW5jdGlvbiBiYV9uZXdibGsoc3opIHtcblx0XHR2YXIgbyA9IChuZXdfYnVmKHN6KSk7XG5cdFx0cHJlcF9ibG9iKG8sIDApO1xuXHRcdHJldHVybiBvO1xuXHR9O1xuXG5cdHZhciBjdXJidWYgPSBuZXdibGsoYmxrc3opO1xuXG5cdHZhciBlbmRidWYgPSBmdW5jdGlvbiBiYV9lbmRidWYoKSB7XG5cdFx0aWYoIWN1cmJ1ZikgcmV0dXJuO1xuXHRcdGlmKGN1cmJ1Zi5sZW5ndGggPiBjdXJidWYubCkgeyBjdXJidWYgPSBjdXJidWYuc2xpY2UoMCwgY3VyYnVmLmwpOyBjdXJidWYubCA9IGN1cmJ1Zi5sZW5ndGg7IH1cblx0XHRpZihjdXJidWYubGVuZ3RoID4gMCkgYnVmcy5wdXNoKGN1cmJ1Zik7XG5cdFx0Y3VyYnVmID0gbnVsbDtcblx0fTtcblxuXHR2YXIgbmV4dCA9IGZ1bmN0aW9uIGJhX25leHQoc3opIHtcblx0XHRpZihjdXJidWYgJiYgKHN6IDwgKGN1cmJ1Zi5sZW5ndGggLSBjdXJidWYubCkpKSByZXR1cm4gY3VyYnVmO1xuXHRcdGVuZGJ1ZigpO1xuXHRcdHJldHVybiAoY3VyYnVmID0gbmV3YmxrKE1hdGgubWF4KHN6KzEsIGJsa3N6KSkpO1xuXHR9O1xuXG5cdHZhciBlbmQgPSBmdW5jdGlvbiBiYV9lbmQoKSB7XG5cdFx0ZW5kYnVmKCk7XG5cdFx0cmV0dXJuIF9fdG9CdWZmZXIoW2J1ZnNdKTtcblx0fTtcblxuXHR2YXIgcHVzaCA9IGZ1bmN0aW9uIGJhX3B1c2goYnVmKSB7IGVuZGJ1ZigpOyBjdXJidWYgPSBidWY7IGlmKGN1cmJ1Zi5sID09IG51bGwpIGN1cmJ1Zi5sID0gY3VyYnVmLmxlbmd0aDsgbmV4dChibGtzeik7IH07XG5cblx0cmV0dXJuICh7IG5leHQ6bmV4dCwgcHVzaDpwdXNoLCBlbmQ6ZW5kLCBfYnVmczpidWZzIH0pO1xufVxuXG5mdW5jdGlvbiB3cml0ZV9yZWNvcmQoYmEsIHR5cGUsIHBheWxvYWQsIGxlbmd0aCkge1xuXHR2YXIgdCA9ICtYTFNCUkVbdHlwZV0sIGw7XG5cdGlmKGlzTmFOKHQpKSByZXR1cm47IC8vIFRPRE86IHRocm93IHNvbWV0aGluZyBoZXJlP1xuXHRpZighbGVuZ3RoKSBsZW5ndGggPSBYTFNCUmVjb3JkRW51bVt0XS5wIHx8IChwYXlsb2FkfHxbXSkubGVuZ3RoIHx8IDA7XG5cdGwgPSAxICsgKHQgPj0gMHg4MCA/IDEgOiAwKSArIDEvKiArIGxlbmd0aCovO1xuXHRpZihsZW5ndGggPj0gMHg4MCkgKytsOyBpZihsZW5ndGggPj0gMHg0MDAwKSArK2w7IGlmKGxlbmd0aCA+PSAweDIwMDAwMCkgKytsO1xuXHR2YXIgbyA9IGJhLm5leHQobCk7XG5cdGlmKHQgPD0gMHg3Rikgby53cml0ZV9zaGlmdCgxLCB0KTtcblx0ZWxzZSB7XG5cdFx0by53cml0ZV9zaGlmdCgxLCAodCAmIDB4N0YpICsgMHg4MCk7XG5cdFx0by53cml0ZV9zaGlmdCgxLCAodCA+PiA3KSk7XG5cdH1cblx0Zm9yKHZhciBpID0gMDsgaSAhPSA0OyArK2kpIHtcblx0XHRpZihsZW5ndGggPj0gMHg4MCkgeyBvLndyaXRlX3NoaWZ0KDEsIChsZW5ndGggJiAweDdGKSsweDgwKTsgbGVuZ3RoID4+PSA3OyB9XG5cdFx0ZWxzZSB7IG8ud3JpdGVfc2hpZnQoMSwgbGVuZ3RoKTsgYnJlYWs7IH1cblx0fVxuXHRpZihsZW5ndGggPiAwICYmIGlzX2J1ZihwYXlsb2FkKSkgYmEucHVzaChwYXlsb2FkKTtcbn1cbi8qIFhMUyByYW5nZXMgZW5mb3JjZWQgKi9cbmZ1bmN0aW9uIHNoaWZ0X2NlbGxfeGxzKGNlbGwsIHRndCwgb3B0cykge1xuXHR2YXIgb3V0ID0gZHVwKGNlbGwpO1xuXHRpZih0Z3Qucykge1xuXHRcdGlmKG91dC5jUmVsKSBvdXQuYyArPSB0Z3Qucy5jO1xuXHRcdGlmKG91dC5yUmVsKSBvdXQuciArPSB0Z3Qucy5yO1xuXHR9IGVsc2Uge1xuXHRcdGlmKG91dC5jUmVsKSBvdXQuYyArPSB0Z3QuYztcblx0XHRpZihvdXQuclJlbCkgb3V0LnIgKz0gdGd0LnI7XG5cdH1cblx0aWYoIW9wdHMgfHwgb3B0cy5iaWZmIDwgMTIpIHtcblx0XHR3aGlsZShvdXQuYyA+PSAweDEwMCkgb3V0LmMgLT0gMHgxMDA7XG5cdFx0d2hpbGUob3V0LnIgPj0gMHgxMDAwMCkgb3V0LnIgLT0gMHgxMDAwMDtcblx0fVxuXHRyZXR1cm4gb3V0O1xufVxuXG5mdW5jdGlvbiBzaGlmdF9yYW5nZV94bHMoY2VsbCwgcmFuZ2UsIG9wdHMpIHtcblx0dmFyIG91dCA9IGR1cChjZWxsKTtcblx0b3V0LnMgPSBzaGlmdF9jZWxsX3hscyhvdXQucywgcmFuZ2Uucywgb3B0cyk7XG5cdG91dC5lID0gc2hpZnRfY2VsbF94bHMob3V0LmUsIHJhbmdlLnMsIG9wdHMpO1xuXHRyZXR1cm4gb3V0O1xufVxuXG5mdW5jdGlvbiBlbmNvZGVfY2VsbF94bHMoYywgYmlmZikge1xuXHRpZihjLmNSZWwgJiYgYy5jIDwgMCkgeyBjID0gZHVwKGMpOyB3aGlsZShjLmMgPCAwKSBjLmMgKz0gKGJpZmYgPiA4KSA/IDB4NDAwMCA6IDB4MTAwOyB9XG5cdGlmKGMuclJlbCAmJiBjLnIgPCAwKSB7IGMgPSBkdXAoYyk7IHdoaWxlKGMuciA8IDApIGMuciArPSAoYmlmZiA+IDgpID8gMHgxMDAwMDAgOiAoKGJpZmYgPiA1KSA/IDB4MTAwMDAgOiAweDQwMDApOyB9XG5cdHZhciBzID0gZW5jb2RlX2NlbGwoYyk7XG5cdGlmKCFjLmNSZWwgJiYgYy5jUmVsICE9IG51bGwpIHMgPSBmaXhfY29sKHMpO1xuXHRpZighYy5yUmVsICYmIGMuclJlbCAhPSBudWxsKSBzID0gZml4X3JvdyhzKTtcblx0cmV0dXJuIHM7XG59XG5cbmZ1bmN0aW9uIGVuY29kZV9yYW5nZV94bHMociwgb3B0cykge1xuXHRpZihyLnMuciA9PSAwICYmICFyLnMuclJlbCkge1xuXHRcdGlmKHIuZS5yID09IChvcHRzLmJpZmYgPj0gMTIgPyAweEZGRkZGIDogKG9wdHMuYmlmZiA+PSA4ID8gMHgxMDAwMCA6IDB4NDAwMCkpICYmICFyLmUuclJlbCkge1xuXHRcdFx0cmV0dXJuIChyLnMuY1JlbCA/IFwiXCIgOiBcIiRcIikgKyBlbmNvZGVfY29sKHIucy5jKSArIFwiOlwiICsgKHIuZS5jUmVsID8gXCJcIiA6IFwiJFwiKSArIGVuY29kZV9jb2woci5lLmMpO1xuXHRcdH1cblx0fVxuXHRpZihyLnMuYyA9PSAwICYmICFyLnMuY1JlbCkge1xuXHRcdGlmKHIuZS5jID09IChvcHRzLmJpZmYgPj0gMTIgPyAweDNGRkYgOiAweEZGKSAmJiAhci5lLmNSZWwpIHtcblx0XHRcdHJldHVybiAoci5zLnJSZWwgPyBcIlwiIDogXCIkXCIpICsgZW5jb2RlX3JvdyhyLnMucikgKyBcIjpcIiArIChyLmUuclJlbCA/IFwiXCIgOiBcIiRcIikgKyBlbmNvZGVfcm93KHIuZS5yKTtcblx0XHR9XG5cdH1cblx0cmV0dXJuIGVuY29kZV9jZWxsX3hscyhyLnMsIG9wdHMuYmlmZikgKyBcIjpcIiArIGVuY29kZV9jZWxsX3hscyhyLmUsIG9wdHMuYmlmZik7XG59XG52YXIgT0ZGQ1JZUFRPID0ge307XG5cbnZhciBtYWtlX29mZmNyeXB0byA9IGZ1bmN0aW9uKE8sIF9jcnlwdG8pIHtcblx0dmFyIGNyeXB0bztcblx0aWYodHlwZW9mIF9jcnlwdG8gIT09ICd1bmRlZmluZWQnKSBjcnlwdG8gPSBfY3J5cHRvO1xuXHRlbHNlIGlmKHR5cGVvZiByZXF1aXJlICE9PSAndW5kZWZpbmVkJykge1xuXHRcdHRyeSB7IGNyeXB0byA9IHJlcXVpcmUoJ2NyeXB0bycpOyB9XG5cdFx0Y2F0Y2goZSkgeyBjcnlwdG8gPSBudWxsOyB9XG5cdH1cblxuXHRPLnJjNCA9IGZ1bmN0aW9uKGtleSwgZGF0YSkge1xuXHRcdHZhciBTID0gbmV3IEFycmF5KDI1Nik7XG5cdFx0dmFyIGMgPSAwLCBpID0gMCwgaiA9IDAsIHQgPSAwO1xuXHRcdGZvcihpID0gMDsgaSAhPSAyNTY7ICsraSkgU1tpXSA9IGk7XG5cdFx0Zm9yKGkgPSAwOyBpICE9IDI1NjsgKytpKSB7XG5cdFx0XHRqID0gKGogKyBTW2ldICsgKGtleVtpJWtleS5sZW5ndGhdKS5jaGFyQ29kZUF0KDApKSYyNTU7XG5cdFx0XHR0ID0gU1tpXTsgU1tpXSA9IFNbal07IFNbal0gPSB0O1xuXHRcdH1cblx0XHQvLyAkRmxvd0lnbm9yZVxuXHRcdGkgPSBqID0gMDsgdmFyIG91dCA9IG5ld19yYXdfYnVmKGRhdGEubGVuZ3RoKTtcblx0XHRmb3IoYyA9IDA7IGMgIT0gZGF0YS5sZW5ndGg7ICsrYykge1xuXHRcdFx0aSA9IChpICsgMSkmMjU1O1xuXHRcdFx0aiA9IChqICsgU1tpXSklMjU2O1xuXHRcdFx0dCA9IFNbaV07IFNbaV0gPSBTW2pdOyBTW2pdID0gdDtcblx0XHRcdG91dFtjXSA9IChkYXRhW2NdIF4gU1soU1tpXStTW2pdKSYyNTVdKTtcblx0XHR9XG5cdFx0cmV0dXJuIG91dDtcblx0fTtcblxuXHRPLm1kNSA9IGZ1bmN0aW9uKGhleCkge1xuXHRcdGlmKCFjcnlwdG8pIHRocm93IG5ldyBFcnJvcihcIlVuc3VwcG9ydGVkIGNyeXB0b1wiKTtcblx0XHRyZXR1cm4gY3J5cHRvLmNyZWF0ZUhhc2goJ21kNScpLnVwZGF0ZShoZXgpLmRpZ2VzdCgnaGV4Jyk7XG5cdH07XG59O1xuLypnbG9iYWwgY3J5cHRvOnRydWUgKi9cbm1ha2Vfb2ZmY3J5cHRvKE9GRkNSWVBUTywgdHlwZW9mIGNyeXB0byAhPT0gXCJ1bmRlZmluZWRcIiA/IGNyeXB0byA6IHVuZGVmaW5lZCk7XG5cbmZ1bmN0aW9uIGRlY29kZV9yb3cocm93c3RyKSB7IHJldHVybiBwYXJzZUludCh1bmZpeF9yb3cocm93c3RyKSwxMCkgLSAxOyB9XG5mdW5jdGlvbiBlbmNvZGVfcm93KHJvdykgeyByZXR1cm4gXCJcIiArIChyb3cgKyAxKTsgfVxuZnVuY3Rpb24gZml4X3Jvdyhjc3RyKSB7IHJldHVybiBjc3RyLnJlcGxhY2UoLyhbQS1aXXxeKShcXGQrKSQvLFwiJDEkJCQyXCIpOyB9XG5mdW5jdGlvbiB1bmZpeF9yb3coY3N0cikgeyByZXR1cm4gY3N0ci5yZXBsYWNlKC9cXCQoXFxkKykkLyxcIiQxXCIpOyB9XG5cbmZ1bmN0aW9uIGRlY29kZV9jb2woY29sc3RyKSB7IHZhciBjID0gdW5maXhfY29sKGNvbHN0ciksIGQgPSAwLCBpID0gMDsgZm9yKDsgaSAhPT0gYy5sZW5ndGg7ICsraSkgZCA9IDI2KmQgKyBjLmNoYXJDb2RlQXQoaSkgLSA2NDsgcmV0dXJuIGQgLSAxOyB9XG5mdW5jdGlvbiBlbmNvZGVfY29sKGNvbCkgeyBpZihjb2wgPCAwKSB0aHJvdyBuZXcgRXJyb3IoXCJpbnZhbGlkIGNvbHVtbiBcIiArIGNvbCk7IHZhciBzPVwiXCI7IGZvcigrK2NvbDsgY29sOyBjb2w9TWF0aC5mbG9vcigoY29sLTEpLzI2KSkgcyA9IFN0cmluZy5mcm9tQ2hhckNvZGUoKChjb2wtMSklMjYpICsgNjUpICsgczsgcmV0dXJuIHM7IH1cbmZ1bmN0aW9uIGZpeF9jb2woY3N0cikgeyByZXR1cm4gY3N0ci5yZXBsYWNlKC9eKFtBLVpdKS8sXCIkJCQxXCIpOyB9XG5mdW5jdGlvbiB1bmZpeF9jb2woY3N0cikgeyByZXR1cm4gY3N0ci5yZXBsYWNlKC9eXFwkKFtBLVpdKS8sXCIkMVwiKTsgfVxuXG5mdW5jdGlvbiBzcGxpdF9jZWxsKGNzdHIpIHsgcmV0dXJuIGNzdHIucmVwbGFjZSgvKFxcJD9bQS1aXSopKFxcJD9cXGQqKS8sXCIkMSwkMlwiKS5zcGxpdChcIixcIik7IH1cbi8vZnVuY3Rpb24gZGVjb2RlX2NlbGwoY3N0cikgeyB2YXIgc3BsdCA9IHNwbGl0X2NlbGwoY3N0cik7IHJldHVybiB7IGM6ZGVjb2RlX2NvbChzcGx0WzBdKSwgcjpkZWNvZGVfcm93KHNwbHRbMV0pIH07IH1cbmZ1bmN0aW9uIGRlY29kZV9jZWxsKGNzdHIpIHtcblx0dmFyIFIgPSAwLCBDID0gMDtcblx0Zm9yKHZhciBpID0gMDsgaSA8IGNzdHIubGVuZ3RoOyArK2kpIHtcblx0XHR2YXIgY2MgPSBjc3RyLmNoYXJDb2RlQXQoaSk7XG5cdFx0aWYoY2MgPj0gNDggJiYgY2MgPD0gNTcpIFIgPSAxMCAqIFIgKyAoY2MgLSA0OCk7XG5cdFx0ZWxzZSBpZihjYyA+PSA2NSAmJiBjYyA8PSA5MCkgQyA9IDI2ICogQyArIChjYyAtIDY0KTtcblx0fVxuXHRyZXR1cm4geyBjOiBDIC0gMSwgcjpSIC0gMSB9O1xufVxuLy9mdW5jdGlvbiBlbmNvZGVfY2VsbChjZWxsKSB7IHJldHVybiBlbmNvZGVfY29sKGNlbGwuYykgKyBlbmNvZGVfcm93KGNlbGwucik7IH1cbmZ1bmN0aW9uIGVuY29kZV9jZWxsKGNlbGwpIHtcblx0dmFyIGNvbCA9IGNlbGwuYyArIDE7XG5cdHZhciBzPVwiXCI7XG5cdGZvcig7IGNvbDsgY29sPSgoY29sLTEpLzI2KXwwKSBzID0gU3RyaW5nLmZyb21DaGFyQ29kZSgoKGNvbC0xKSUyNikgKyA2NSkgKyBzO1xuXHRyZXR1cm4gcyArIChjZWxsLnIgKyAxKTtcbn1cbmZ1bmN0aW9uIGRlY29kZV9yYW5nZShyYW5nZSkge1xuXHR2YXIgaWR4ID0gcmFuZ2UuaW5kZXhPZihcIjpcIik7XG5cdGlmKGlkeCA9PSAtMSkgcmV0dXJuIHsgczogZGVjb2RlX2NlbGwocmFuZ2UpLCBlOiBkZWNvZGVfY2VsbChyYW5nZSkgfTtcblx0cmV0dXJuIHsgczogZGVjb2RlX2NlbGwocmFuZ2Uuc2xpY2UoMCwgaWR4KSksIGU6IGRlY29kZV9jZWxsKHJhbmdlLnNsaWNlKGlkeCArIDEpKSB9O1xufVxuZnVuY3Rpb24gZW5jb2RlX3JhbmdlKGNzLGNlKSB7XG5cdGlmKHR5cGVvZiBjZSA9PT0gJ3VuZGVmaW5lZCcgfHwgdHlwZW9mIGNlID09PSAnbnVtYmVyJykge1xucmV0dXJuIGVuY29kZV9yYW5nZShjcy5zLCBjcy5lKTtcblx0fVxuaWYodHlwZW9mIGNzICE9PSAnc3RyaW5nJykgY3MgPSBlbmNvZGVfY2VsbCgoY3MpKTtcblx0aWYodHlwZW9mIGNlICE9PSAnc3RyaW5nJykgY2UgPSBlbmNvZGVfY2VsbCgoY2UpKTtcbnJldHVybiBjcyA9PSBjZSA/IGNzIDogY3MgKyBcIjpcIiArIGNlO1xufVxuXG5mdW5jdGlvbiBzYWZlX2RlY29kZV9yYW5nZShyYW5nZSkge1xuXHR2YXIgbyA9IHtzOntjOjAscjowfSxlOntjOjAscjowfX07XG5cdHZhciBpZHggPSAwLCBpID0gMCwgY2MgPSAwO1xuXHR2YXIgbGVuID0gcmFuZ2UubGVuZ3RoO1xuXHRmb3IoaWR4ID0gMDsgaSA8IGxlbjsgKytpKSB7XG5cdFx0aWYoKGNjPXJhbmdlLmNoYXJDb2RlQXQoaSktNjQpIDwgMSB8fCBjYyA+IDI2KSBicmVhaztcblx0XHRpZHggPSAyNippZHggKyBjYztcblx0fVxuXHRvLnMuYyA9IC0taWR4O1xuXG5cdGZvcihpZHggPSAwOyBpIDwgbGVuOyArK2kpIHtcblx0XHRpZigoY2M9cmFuZ2UuY2hhckNvZGVBdChpKS00OCkgPCAwIHx8IGNjID4gOSkgYnJlYWs7XG5cdFx0aWR4ID0gMTAqaWR4ICsgY2M7XG5cdH1cblx0by5zLnIgPSAtLWlkeDtcblxuXHRpZihpID09PSBsZW4gfHwgcmFuZ2UuY2hhckNvZGVBdCgrK2kpID09PSA1OCkgeyBvLmUuYz1vLnMuYzsgby5lLnI9by5zLnI7IHJldHVybiBvOyB9XG5cblx0Zm9yKGlkeCA9IDA7IGkgIT0gbGVuOyArK2kpIHtcblx0XHRpZigoY2M9cmFuZ2UuY2hhckNvZGVBdChpKS02NCkgPCAxIHx8IGNjID4gMjYpIGJyZWFrO1xuXHRcdGlkeCA9IDI2KmlkeCArIGNjO1xuXHR9XG5cdG8uZS5jID0gLS1pZHg7XG5cblx0Zm9yKGlkeCA9IDA7IGkgIT0gbGVuOyArK2kpIHtcblx0XHRpZigoY2M9cmFuZ2UuY2hhckNvZGVBdChpKS00OCkgPCAwIHx8IGNjID4gOSkgYnJlYWs7XG5cdFx0aWR4ID0gMTAqaWR4ICsgY2M7XG5cdH1cblx0by5lLnIgPSAtLWlkeDtcblx0cmV0dXJuIG87XG59XG5cbmZ1bmN0aW9uIHNhZmVfZm9ybWF0X2NlbGwoY2VsbCwgdikge1xuXHR2YXIgcSA9IChjZWxsLnQgPT0gJ2QnICYmIHYgaW5zdGFuY2VvZiBEYXRlKTtcblx0aWYoY2VsbC56ICE9IG51bGwpIHRyeSB7IHJldHVybiAoY2VsbC53ID0gU1NGLmZvcm1hdChjZWxsLnosIHEgPyBkYXRlbnVtKHYpIDogdikpOyB9IGNhdGNoKGUpIHsgfVxuXHR0cnkgeyByZXR1cm4gKGNlbGwudyA9IFNTRi5mb3JtYXQoKGNlbGwuWEZ8fHt9KS5udW1GbXRJZHx8KHEgPyAxNCA6IDApLCAgcSA/IGRhdGVudW0odikgOiB2KSk7IH0gY2F0Y2goZSkgeyByZXR1cm4gJycrdjsgfVxufVxuXG5mdW5jdGlvbiBmb3JtYXRfY2VsbChjZWxsLCB2LCBvKSB7XG5cdGlmKGNlbGwgPT0gbnVsbCB8fCBjZWxsLnQgPT0gbnVsbCB8fCBjZWxsLnQgPT0gJ3onKSByZXR1cm4gXCJcIjtcblx0aWYoY2VsbC53ICE9PSB1bmRlZmluZWQpIHJldHVybiBjZWxsLnc7XG5cdGlmKGNlbGwudCA9PSAnZCcgJiYgIWNlbGwueiAmJiBvICYmIG8uZGF0ZU5GKSBjZWxsLnogPSBvLmRhdGVORjtcblx0aWYodiA9PSB1bmRlZmluZWQpIHJldHVybiBzYWZlX2Zvcm1hdF9jZWxsKGNlbGwsIGNlbGwudik7XG5cdHJldHVybiBzYWZlX2Zvcm1hdF9jZWxsKGNlbGwsIHYpO1xufVxuXG5mdW5jdGlvbiBzaGVldF90b193b3JrYm9vayhzaGVldCwgb3B0cykge1xuXHR2YXIgbiA9IG9wdHMgJiYgb3B0cy5zaGVldCA/IG9wdHMuc2hlZXQgOiBcIlNoZWV0MVwiO1xuXHR2YXIgc2hlZXRzID0ge307IHNoZWV0c1tuXSA9IHNoZWV0O1xuXHRyZXR1cm4geyBTaGVldE5hbWVzOiBbbl0sIFNoZWV0czogc2hlZXRzIH07XG59XG5cbmZ1bmN0aW9uIHNoZWV0X2FkZF9hb2EoX3dzLCBkYXRhLCBvcHRzKSB7XG5cdHZhciBvID0gb3B0cyB8fCB7fTtcblx0dmFyIGRlbnNlID0gX3dzID8gQXJyYXkuaXNBcnJheShfd3MpIDogby5kZW5zZTtcblx0aWYoREVOU0UgIT0gbnVsbCAmJiBkZW5zZSA9PSBudWxsKSBkZW5zZSA9IERFTlNFO1xuXHR2YXIgd3MgPSBfd3MgfHwgKGRlbnNlID8gKFtdKSA6ICh7fSkpO1xuXHR2YXIgX1IgPSAwLCBfQyA9IDA7XG5cdGlmKHdzICYmIG8ub3JpZ2luICE9IG51bGwpIHtcblx0XHRpZih0eXBlb2Ygby5vcmlnaW4gPT0gJ251bWJlcicpIF9SID0gby5vcmlnaW47XG5cdFx0ZWxzZSB7XG5cdFx0XHR2YXIgX29yaWdpbiA9IHR5cGVvZiBvLm9yaWdpbiA9PSBcInN0cmluZ1wiID8gZGVjb2RlX2NlbGwoby5vcmlnaW4pIDogby5vcmlnaW47XG5cdFx0XHRfUiA9IF9vcmlnaW4ucjsgX0MgPSBfb3JpZ2luLmM7XG5cdFx0fVxuXHRcdGlmKCF3c1tcIiFyZWZcIl0pIHdzW1wiIXJlZlwiXSA9IFwiQTE6QTFcIjtcblx0fVxuXHR2YXIgcmFuZ2UgPSAoe3M6IHtjOjEwMDAwMDAwLCByOjEwMDAwMDAwfSwgZToge2M6MCwgcjowfX0pO1xuXHRpZih3c1snIXJlZiddKSB7XG5cdFx0dmFyIF9yYW5nZSA9IHNhZmVfZGVjb2RlX3JhbmdlKHdzWychcmVmJ10pO1xuXHRcdHJhbmdlLnMuYyA9IF9yYW5nZS5zLmM7XG5cdFx0cmFuZ2Uucy5yID0gX3JhbmdlLnMucjtcblx0XHRyYW5nZS5lLmMgPSBNYXRoLm1heChyYW5nZS5lLmMsIF9yYW5nZS5lLmMpO1xuXHRcdHJhbmdlLmUuciA9IE1hdGgubWF4KHJhbmdlLmUuciwgX3JhbmdlLmUucik7XG5cdFx0aWYoX1IgPT0gLTEpIHJhbmdlLmUuciA9IF9SID0gX3JhbmdlLmUuciArIDE7XG5cdH1cblx0Zm9yKHZhciBSID0gMDsgUiAhPSBkYXRhLmxlbmd0aDsgKytSKSB7XG5cdFx0aWYoIWRhdGFbUl0pIGNvbnRpbnVlO1xuXHRcdGlmKCFBcnJheS5pc0FycmF5KGRhdGFbUl0pKSB0aHJvdyBuZXcgRXJyb3IoXCJhb2FfdG9fc2hlZXQgZXhwZWN0cyBhbiBhcnJheSBvZiBhcnJheXNcIik7XG5cdFx0Zm9yKHZhciBDID0gMDsgQyAhPSBkYXRhW1JdLmxlbmd0aDsgKytDKSB7XG5cdFx0XHRpZih0eXBlb2YgZGF0YVtSXVtDXSA9PT0gJ3VuZGVmaW5lZCcpIGNvbnRpbnVlO1xuXHRcdFx0dmFyIGNlbGwgPSAoe3Y6IGRhdGFbUl1bQ10gfSk7XG5cdFx0XHR2YXIgX19SID0gX1IgKyBSLCBfX0MgPSBfQyArIEM7XG5cdFx0XHRpZihyYW5nZS5zLnIgPiBfX1IpIHJhbmdlLnMuciA9IF9fUjtcblx0XHRcdGlmKHJhbmdlLnMuYyA+IF9fQykgcmFuZ2Uucy5jID0gX19DO1xuXHRcdFx0aWYocmFuZ2UuZS5yIDwgX19SKSByYW5nZS5lLnIgPSBfX1I7XG5cdFx0XHRpZihyYW5nZS5lLmMgPCBfX0MpIHJhbmdlLmUuYyA9IF9fQztcblx0XHRcdGlmKGRhdGFbUl1bQ10gJiYgdHlwZW9mIGRhdGFbUl1bQ10gPT09ICdvYmplY3QnICYmICFBcnJheS5pc0FycmF5KGRhdGFbUl1bQ10pICYmICEoZGF0YVtSXVtDXSBpbnN0YW5jZW9mIERhdGUpKSBjZWxsID0gZGF0YVtSXVtDXTtcblx0XHRcdGVsc2Uge1xuXHRcdFx0XHRpZihBcnJheS5pc0FycmF5KGNlbGwudikpIHsgY2VsbC5mID0gZGF0YVtSXVtDXVsxXTsgY2VsbC52ID0gY2VsbC52WzBdOyB9XG5cdFx0XHRcdGlmKGNlbGwudiA9PT0gbnVsbCkgeyBpZihjZWxsLmYpIGNlbGwudCA9ICduJzsgZWxzZSBpZighby5zaGVldFN0dWJzKSBjb250aW51ZTsgZWxzZSBjZWxsLnQgPSAneic7IH1cblx0XHRcdFx0ZWxzZSBpZih0eXBlb2YgY2VsbC52ID09PSAnbnVtYmVyJykgY2VsbC50ID0gJ24nO1xuXHRcdFx0XHRlbHNlIGlmKHR5cGVvZiBjZWxsLnYgPT09ICdib29sZWFuJykgY2VsbC50ID0gJ2InO1xuXHRcdFx0XHRlbHNlIGlmKGNlbGwudiBpbnN0YW5jZW9mIERhdGUpIHtcblx0XHRcdFx0XHRjZWxsLnogPSBvLmRhdGVORiB8fCBTU0YuX3RhYmxlWzE0XTtcblx0XHRcdFx0XHRpZihvLmNlbGxEYXRlcykgeyBjZWxsLnQgPSAnZCc7IGNlbGwudyA9IFNTRi5mb3JtYXQoY2VsbC56LCBkYXRlbnVtKGNlbGwudikpOyB9XG5cdFx0XHRcdFx0ZWxzZSB7IGNlbGwudCA9ICduJzsgY2VsbC52ID0gZGF0ZW51bShjZWxsLnYpOyBjZWxsLncgPSBTU0YuZm9ybWF0KGNlbGwueiwgY2VsbC52KTsgfVxuXHRcdFx0XHR9XG5cdFx0XHRcdGVsc2UgY2VsbC50ID0gJ3MnO1xuXHRcdFx0fVxuXHRcdFx0aWYoZGVuc2UpIHtcblx0XHRcdFx0aWYoIXdzW19fUl0pIHdzW19fUl0gPSBbXTtcblx0XHRcdFx0aWYod3NbX19SXVtfX0NdICYmIHdzW19fUl1bX19DXS56KSBjZWxsLnogPSB3c1tfX1JdW19fQ10uejtcblx0XHRcdFx0d3NbX19SXVtfX0NdID0gY2VsbDtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdHZhciBjZWxsX3JlZiA9IGVuY29kZV9jZWxsKCh7YzpfX0MscjpfX1J9KSk7XG5cdFx0XHRcdGlmKHdzW2NlbGxfcmVmXSAmJiB3c1tjZWxsX3JlZl0ueikgY2VsbC56ID0gd3NbY2VsbF9yZWZdLno7XG5cdFx0XHRcdHdzW2NlbGxfcmVmXSA9IGNlbGw7XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cdGlmKHJhbmdlLnMuYyA8IDEwMDAwMDAwKSB3c1snIXJlZiddID0gZW5jb2RlX3JhbmdlKHJhbmdlKTtcblx0cmV0dXJuIHdzO1xufVxuZnVuY3Rpb24gYW9hX3RvX3NoZWV0KGRhdGEsIG9wdHMpIHsgcmV0dXJuIHNoZWV0X2FkZF9hb2EobnVsbCwgZGF0YSwgb3B0cyk7IH1cblxuZnVuY3Rpb24gd3JpdGVfVUludDMyTEUoeCwgbykge1xuXHRpZiAoIW8pIG8gPSBuZXdfYnVmKDQpO1xuXHRvLndyaXRlX3NoaWZ0KDQsIHgpO1xuXHRyZXR1cm4gbztcbn1cblxuLyogW01TLVhMU0JdIDIuNS4xNjggKi9cbmZ1bmN0aW9uIHBhcnNlX1hMV2lkZVN0cmluZyhkYXRhKSB7XG5cdHZhciBjY2hDaGFyYWN0ZXJzID0gZGF0YS5yZWFkX3NoaWZ0KDQpO1xuXHRyZXR1cm4gY2NoQ2hhcmFjdGVycyA9PT0gMCA/IFwiXCIgOiBkYXRhLnJlYWRfc2hpZnQoY2NoQ2hhcmFjdGVycywgJ2RiY3MnKTtcbn1cbmZ1bmN0aW9uIHdyaXRlX1hMV2lkZVN0cmluZyhkYXRhLCBvKSB7XG5cdHZhciBfbnVsbCA9IGZhbHNlOyBpZiAobyA9PSBudWxsKSB7IF9udWxsID0gdHJ1ZTsgbyA9IG5ld19idWYoNCArIDIgKiBkYXRhLmxlbmd0aCk7IH1cblx0by53cml0ZV9zaGlmdCg0LCBkYXRhLmxlbmd0aCk7XG5cdGlmIChkYXRhLmxlbmd0aCA+IDApIG8ud3JpdGVfc2hpZnQoMCwgZGF0YSwgJ2RiY3MnKTtcblx0cmV0dXJuIF9udWxsID8gby5zbGljZSgwLCBvLmwpIDogbztcbn1cblxuLyogW01TLVhMU0JdIDIuNS45MSAqL1xuLy9mdW5jdGlvbiBwYXJzZV9MUFdpZGVTdHJpbmcoZGF0YSkge1xuLy9cdHZhciBjY2hDaGFyYWN0ZXJzID0gZGF0YS5yZWFkX3NoaWZ0KDIpO1xuLy9cdHJldHVybiBjY2hDaGFyYWN0ZXJzID09PSAwID8gXCJcIiA6IGRhdGEucmVhZF9zaGlmdChjY2hDaGFyYWN0ZXJzLCBcInV0ZjE2bGVcIik7XG4vL31cblxuLyogW01TLVhMU0JdIDIuNS4xNDMgKi9cbmZ1bmN0aW9uIHBhcnNlX1N0clJ1bihkYXRhKSB7XG5cdHJldHVybiB7IGljaDogZGF0YS5yZWFkX3NoaWZ0KDIpLCBpZm50OiBkYXRhLnJlYWRfc2hpZnQoMikgfTtcbn1cbmZ1bmN0aW9uIHdyaXRlX1N0clJ1bihydW4sIG8pIHtcblx0aWYgKCFvKSBvID0gbmV3X2J1Zig0KTtcblx0by53cml0ZV9zaGlmdCgyLCBydW4uaWNoIHx8IDApO1xuXHRvLndyaXRlX3NoaWZ0KDIsIHJ1bi5pZm50IHx8IDApO1xuXHRyZXR1cm4gbztcbn1cblxuLyogW01TLVhMU0JdIDIuNS4xMjEgKi9cbmZ1bmN0aW9uIHBhcnNlX1JpY2hTdHIoZGF0YSwgbGVuZ3RoKSB7XG5cdHZhciBzdGFydCA9IGRhdGEubDtcblx0dmFyIGZsYWdzID0gZGF0YS5yZWFkX3NoaWZ0KDEpO1xuXHR2YXIgc3RyID0gcGFyc2VfWExXaWRlU3RyaW5nKGRhdGEpO1xuXHR2YXIgcmdzU3RyUnVuID0gW107XG5cdHZhciB6ID0gKHsgdDogc3RyLCBoOiBzdHIgfSk7XG5cdGlmICgoZmxhZ3MgJiAxKSAhPT0gMCkgeyAvKiBmUmljaFN0ciAqL1xuXHRcdC8qIFRPRE86IGZvcm1hdHRlZCBzdHJpbmcgKi9cblx0XHR2YXIgZHdTaXplU3RyUnVuID0gZGF0YS5yZWFkX3NoaWZ0KDQpO1xuXHRcdGZvciAodmFyIGkgPSAwOyBpICE9IGR3U2l6ZVN0clJ1bjsgKytpKSByZ3NTdHJSdW4ucHVzaChwYXJzZV9TdHJSdW4oZGF0YSkpO1xuXHRcdHouciA9IHJnc1N0clJ1bjtcblx0fVxuXHRlbHNlIHouciA9IFt7IGljaDogMCwgaWZudDogMCB9XTtcblx0Ly9pZigoZmxhZ3MgJiAyKSAhPT0gMCkgeyAvKiBmRXh0U3RyICovXG5cdC8vXHQvKiBUT0RPOiBwaG9uZXRpYyBzdHJpbmcgKi9cblx0Ly99XG5cdGRhdGEubCA9IHN0YXJ0ICsgbGVuZ3RoO1xuXHRyZXR1cm4gejtcbn1cbmZ1bmN0aW9uIHdyaXRlX1JpY2hTdHIoc3RyLCBvKSB7XG5cdC8qIFRPRE86IGZvcm1hdHRlZCBzdHJpbmcgKi9cblx0dmFyIF9udWxsID0gZmFsc2U7IGlmIChvID09IG51bGwpIHsgX251bGwgPSB0cnVlOyBvID0gbmV3X2J1ZigxNSArIDQgKiBzdHIudC5sZW5ndGgpOyB9XG5cdG8ud3JpdGVfc2hpZnQoMSwgMCk7XG5cdHdyaXRlX1hMV2lkZVN0cmluZyhzdHIudCwgbyk7XG5cdHJldHVybiBfbnVsbCA/IG8uc2xpY2UoMCwgby5sKSA6IG87XG59XG4vKiBbTVMtWExTQl0gMi40LjMyOCBCcnRDb21tZW50VGV4dCAoUmljaFN0ciB3LzEgcnVuKSAqL1xudmFyIHBhcnNlX0JydENvbW1lbnRUZXh0ID0gcGFyc2VfUmljaFN0cjtcbmZ1bmN0aW9uIHdyaXRlX0JydENvbW1lbnRUZXh0KHN0ciwgbykge1xuXHQvKiBUT0RPOiBmb3JtYXR0ZWQgc3RyaW5nICovXG5cdHZhciBfbnVsbCA9IGZhbHNlOyBpZiAobyA9PSBudWxsKSB7IF9udWxsID0gdHJ1ZTsgbyA9IG5ld19idWYoMjMgKyA0ICogc3RyLnQubGVuZ3RoKTsgfVxuXHRvLndyaXRlX3NoaWZ0KDEsIDEpO1xuXHR3cml0ZV9YTFdpZGVTdHJpbmcoc3RyLnQsIG8pO1xuXHRvLndyaXRlX3NoaWZ0KDQsIDEpO1xuXHR3cml0ZV9TdHJSdW4oeyBpY2g6IDAsIGlmbnQ6IDAgfSwgbyk7XG5cdHJldHVybiBfbnVsbCA/IG8uc2xpY2UoMCwgby5sKSA6IG87XG59XG5cbi8qIFtNUy1YTFNCXSAyLjUuOSAqL1xuZnVuY3Rpb24gcGFyc2VfWExTQkNlbGwoZGF0YSkge1xuXHR2YXIgY29sID0gZGF0YS5yZWFkX3NoaWZ0KDQpO1xuXHR2YXIgaVN0eWxlUmVmID0gZGF0YS5yZWFkX3NoaWZ0KDIpO1xuXHRpU3R5bGVSZWYgKz0gZGF0YS5yZWFkX3NoaWZ0KDEpIDw8IDE2O1xuXHRkYXRhLmwrKzsgLy92YXIgZlBoU2hvdyA9IGRhdGEucmVhZF9zaGlmdCgxKTtcblx0cmV0dXJuIHsgYzogY29sLCBpU3R5bGVSZWY6IGlTdHlsZVJlZiB9O1xufVxuZnVuY3Rpb24gd3JpdGVfWExTQkNlbGwoY2VsbCwgbykge1xuXHRpZiAobyA9PSBudWxsKSBvID0gbmV3X2J1Zig4KTtcblx0by53cml0ZV9zaGlmdCgtNCwgY2VsbC5jKTtcblx0by53cml0ZV9zaGlmdCgzLCBjZWxsLmlTdHlsZVJlZiB8fCBjZWxsLnMpO1xuXHRvLndyaXRlX3NoaWZ0KDEsIDApOyAvKiBmUGhTaG93ICovXG5cdHJldHVybiBvO1xufVxuXG4vKiBTaG9ydCBYTFNCIENlbGwgZG9lcyBub3QgaW5jbHVkZSBjb2x1bW4gKi9cbmZ1bmN0aW9uIHBhcnNlX1hMU0JTaG9ydENlbGwoZGF0YSkge1xuXHR2YXIgaVN0eWxlUmVmID0gZGF0YS5yZWFkX3NoaWZ0KDIpO1xuXHRpU3R5bGVSZWYgKz0gZGF0YS5yZWFkX3NoaWZ0KDEpIDw8MTY7XG5cdGRhdGEubCsrOyAvL3ZhciBmUGhTaG93ID0gZGF0YS5yZWFkX3NoaWZ0KDEpO1xuXHRyZXR1cm4geyBjOi0xLCBpU3R5bGVSZWY6IGlTdHlsZVJlZiB9O1xufVxuZnVuY3Rpb24gd3JpdGVfWExTQlNob3J0Q2VsbChjZWxsLCBvKSB7XG5cdGlmKG8gPT0gbnVsbCkgbyA9IG5ld19idWYoNCk7XG5cdG8ud3JpdGVfc2hpZnQoMywgY2VsbC5pU3R5bGVSZWYgfHwgY2VsbC5zKTtcblx0by53cml0ZV9zaGlmdCgxLCAwKTsgLyogZlBoU2hvdyAqL1xuXHRyZXR1cm4gbztcbn1cblxuLyogW01TLVhMU0JdIDIuNS4yMSAqL1xudmFyIHBhcnNlX1hMU0JDb2RlTmFtZSA9IHBhcnNlX1hMV2lkZVN0cmluZztcbnZhciB3cml0ZV9YTFNCQ29kZU5hbWUgPSB3cml0ZV9YTFdpZGVTdHJpbmc7XG5cbi8qIFtNUy1YTFNCXSAyLjUuMTY2ICovXG5mdW5jdGlvbiBwYXJzZV9YTE51bGxhYmxlV2lkZVN0cmluZyhkYXRhKSB7XG5cdHZhciBjY2hDaGFyYWN0ZXJzID0gZGF0YS5yZWFkX3NoaWZ0KDQpO1xuXHRyZXR1cm4gY2NoQ2hhcmFjdGVycyA9PT0gMCB8fCBjY2hDaGFyYWN0ZXJzID09PSAweEZGRkZGRkZGID8gXCJcIiA6IGRhdGEucmVhZF9zaGlmdChjY2hDaGFyYWN0ZXJzLCAnZGJjcycpO1xufVxuZnVuY3Rpb24gd3JpdGVfWExOdWxsYWJsZVdpZGVTdHJpbmcoZGF0YSwgbykge1xuXHR2YXIgX251bGwgPSBmYWxzZTsgaWYgKG8gPT0gbnVsbCkgeyBfbnVsbCA9IHRydWU7IG8gPSBuZXdfYnVmKDEyNyk7IH1cblx0by53cml0ZV9zaGlmdCg0LCBkYXRhLmxlbmd0aCA+IDAgPyBkYXRhLmxlbmd0aCA6IDB4RkZGRkZGRkYpO1xuXHRpZiAoZGF0YS5sZW5ndGggPiAwKSBvLndyaXRlX3NoaWZ0KDAsIGRhdGEsICdkYmNzJyk7XG5cdHJldHVybiBfbnVsbCA/IG8uc2xpY2UoMCwgby5sKSA6IG87XG59XG5cbi8qIFtNUy1YTFNCXSAyLjUuMTY1ICovXG52YXIgcGFyc2VfWExOYW1lV2lkZVN0cmluZyA9IHBhcnNlX1hMV2lkZVN0cmluZztcbi8vdmFyIHdyaXRlX1hMTmFtZVdpZGVTdHJpbmcgPSB3cml0ZV9YTFdpZGVTdHJpbmc7XG5cbi8qIFtNUy1YTFNCXSAyLjUuMTE0ICovXG52YXIgcGFyc2VfUmVsSUQgPSBwYXJzZV9YTE51bGxhYmxlV2lkZVN0cmluZztcbnZhciB3cml0ZV9SZWxJRCA9IHdyaXRlX1hMTnVsbGFibGVXaWRlU3RyaW5nO1xuXG5cbi8qIFtNUy1YTFNdIDIuNS4yMTcgOyBbTVMtWExTQl0gMi41LjEyMiAqL1xuZnVuY3Rpb24gcGFyc2VfUmtOdW1iZXIoZGF0YSkge1xuXHR2YXIgYiA9IGRhdGEuc2xpY2UoZGF0YS5sLCBkYXRhLmwgKyA0KTtcblx0dmFyIGZYMTAwID0gKGJbMF0gJiAxKSwgZkludCA9IChiWzBdICYgMik7XG5cdGRhdGEubCArPSA0O1xuXHRiWzBdICY9IDB4RkM7IC8vIGJbMF0gJj0gfjM7XG5cdHZhciBSSyA9IGZJbnQgPT09IDAgPyBfX2RvdWJsZShbMCwgMCwgMCwgMCwgYlswXSwgYlsxXSwgYlsyXSwgYlszXV0sIDApIDogX19yZWFkSW50MzJMRShiLCAwKSA+PiAyO1xuXHRyZXR1cm4gZlgxMDAgPyAoUksgLyAxMDApIDogUks7XG59XG5mdW5jdGlvbiB3cml0ZV9Sa051bWJlcihkYXRhLCBvKSB7XG5cdGlmIChvID09IG51bGwpIG8gPSBuZXdfYnVmKDQpO1xuXHR2YXIgZlgxMDAgPSAwLCBmSW50ID0gMCwgZDEwMCA9IGRhdGEgKiAxMDA7XG5cdGlmICgoZGF0YSA9PSAoZGF0YSB8IDApKSAmJiAoZGF0YSA+PSAtKDEgPDwgMjkpKSAmJiAoZGF0YSA8ICgxIDw8IDI5KSkpIHsgZkludCA9IDE7IH1cblx0ZWxzZSBpZiAoKGQxMDAgPT0gKGQxMDAgfCAwKSkgJiYgKGQxMDAgPj0gLSgxIDw8IDI5KSkgJiYgKGQxMDAgPCAoMSA8PCAyOSkpKSB7IGZJbnQgPSAxOyBmWDEwMCA9IDE7IH1cblx0aWYgKGZJbnQpIG8ud3JpdGVfc2hpZnQoLTQsICgoZlgxMDAgPyBkMTAwIDogZGF0YSkgPDwgMikgKyAoZlgxMDAgKyAyKSk7XG5cdGVsc2UgdGhyb3cgbmV3IEVycm9yKFwidW5zdXBwb3J0ZWQgUmtOdW1iZXIgXCIgKyBkYXRhKTsgLy8gVE9ET1xufVxuXG5cbi8qIFtNUy1YTFNCXSAyLjUuMTE3IFJmWCAqL1xuZnVuY3Rpb24gcGFyc2VfUmZYKGRhdGEgKSB7XG5cdHZhciBjZWxsID0gKHsgczoge30sIGU6IHt9IH0pO1xuXHRjZWxsLnMuciA9IGRhdGEucmVhZF9zaGlmdCg0KTtcblx0Y2VsbC5lLnIgPSBkYXRhLnJlYWRfc2hpZnQoNCk7XG5cdGNlbGwucy5jID0gZGF0YS5yZWFkX3NoaWZ0KDQpO1xuXHRjZWxsLmUuYyA9IGRhdGEucmVhZF9zaGlmdCg0KTtcblx0cmV0dXJuIGNlbGw7XG59XG5mdW5jdGlvbiB3cml0ZV9SZlgociwgbykge1xuXHRpZiAoIW8pIG8gPSBuZXdfYnVmKDE2KTtcblx0by53cml0ZV9zaGlmdCg0LCByLnMucik7XG5cdG8ud3JpdGVfc2hpZnQoNCwgci5lLnIpO1xuXHRvLndyaXRlX3NoaWZ0KDQsIHIucy5jKTtcblx0by53cml0ZV9zaGlmdCg0LCByLmUuYyk7XG5cdHJldHVybiBvO1xufVxuXG4vKiBbTVMtWExTQl0gMi41LjE1MyBVbmNoZWNrZWRSZlggKi9cbnZhciBwYXJzZV9VbmNoZWNrZWRSZlggPSBwYXJzZV9SZlg7XG52YXIgd3JpdGVfVW5jaGVja2VkUmZYID0gd3JpdGVfUmZYO1xuXG4vKiBbTVMtWExTQl0gMi41LjE1NSBVbmNoZWNrZWRTcVJmWCAqL1xuLy9mdW5jdGlvbiBwYXJzZV9VbmNoZWNrZWRTcVJmWChkYXRhKSB7XG4vL1x0dmFyIGNudCA9IGRhdGEucmVhZF9zaGlmdCg0KTtcbi8vXHR2YXIgb3V0ID0gW107XG4vL1x0Zm9yKHZhciBpID0gMDsgaSA8IGNudDsgKytpKSB7XG4vL1x0XHR2YXIgcm5nID0gcGFyc2VfVW5jaGVja2VkUmZYKGRhdGEpO1xuLy9cdFx0b3V0LnB1c2goZW5jb2RlX3JhbmdlKHJuZykpO1xuLy9cdH1cbi8vXHRyZXR1cm4gb3V0LmpvaW4oXCIsXCIpO1xuLy99XG4vL2Z1bmN0aW9uIHdyaXRlX1VuY2hlY2tlZFNxUmZYKHNxcmZ4KSB7XG4vL1x0dmFyIHBhcnRzID0gc3FyZnguc3BsaXQoL1xccyosXFxzKi8pO1xuLy9cdHZhciBvID0gbmV3X2J1Zig0KTsgby53cml0ZV9zaGlmdCg0LCBwYXJ0cy5sZW5ndGgpO1xuLy9cdHZhciBvdXQgPSBbb107XG4vL1x0cGFydHMuZm9yRWFjaChmdW5jdGlvbihybmcpIHtcbi8vXHRcdG91dC5wdXNoKHdyaXRlX1VuY2hlY2tlZFJmWChzYWZlX2RlY29kZV9yYW5nZShybmcpKSk7XG4vL1x0fSk7XG4vL1x0cmV0dXJuIGJjb25jYXQob3V0KTtcbi8vfVxuXG4vKiBbTVMtWExTXSAyLjUuMzQyIDsgW01TLVhMU0JdIDIuNS4xNzEgKi9cbi8qIFRPRE86IGVycm9yIGNoZWNraW5nLCBOYU4gYW5kIEluZmluaXR5IHZhbHVlcyBhcmUgbm90IHZhbGlkIFhudW0gKi9cbmZ1bmN0aW9uIHBhcnNlX1hudW0oZGF0YSkge1xuXHRpZihkYXRhLmxlbmd0aCAtIGRhdGEubCA8IDgpIHRocm93IFwiWExTIFhudW0gQnVmZmVyIHVuZGVyZmxvd1wiO1xuXHRyZXR1cm4gZGF0YS5yZWFkX3NoaWZ0KDgsICdmJyk7XG59XG5mdW5jdGlvbiB3cml0ZV9YbnVtKGRhdGEsIG8pIHsgcmV0dXJuIChvIHx8IG5ld19idWYoOCkpLndyaXRlX3NoaWZ0KDgsIGRhdGEsICdmJyk7IH1cblxuLyogW01TLVhMU0JdIDIuNC4zMjQgQnJ0Q29sb3IgKi9cbmZ1bmN0aW9uIHBhcnNlX0JydENvbG9yKGRhdGEpIHtcblx0dmFyIG91dCA9IHt9O1xuXHR2YXIgZCA9IGRhdGEucmVhZF9zaGlmdCgxKTtcblxuXHQvL3ZhciBmVmFsaWRSR0IgPSBkICYgMTtcblx0dmFyIHhDb2xvclR5cGUgPSBkID4+PiAxO1xuXG5cdHZhciBpbmRleCA9IGRhdGEucmVhZF9zaGlmdCgxKTtcblx0dmFyIG5UUyA9IGRhdGEucmVhZF9zaGlmdCgyLCAnaScpO1xuXHR2YXIgYlIgPSBkYXRhLnJlYWRfc2hpZnQoMSk7XG5cdHZhciBiRyA9IGRhdGEucmVhZF9zaGlmdCgxKTtcblx0dmFyIGJCID0gZGF0YS5yZWFkX3NoaWZ0KDEpO1xuXHRkYXRhLmwrKzsgLy92YXIgYkFscGhhID0gZGF0YS5yZWFkX3NoaWZ0KDEpO1xuXG5cdHN3aXRjaCAoeENvbG9yVHlwZSkge1xuXHRcdGNhc2UgMDogb3V0LmF1dG8gPSAxOyBicmVhaztcblx0XHRjYXNlIDE6XG5cdFx0XHRvdXQuaW5kZXggPSBpbmRleDtcblx0XHRcdHZhciBpY3YgPSBYTFNJY3ZbaW5kZXhdO1xuXHRcdFx0LyogYXV0b21hdGljIHBzZXVkbyBpbmRleCA4MSAqL1xuXHRcdFx0aWYgKGljdikgb3V0LnJnYiA9IHJnYjJIZXgoaWN2KTtcblx0XHRcdGJyZWFrO1xuXHRcdGNhc2UgMjpcblx0XHRcdC8qIGlmKCFmVmFsaWRSR0IpIHRocm93IG5ldyBFcnJvcihcImludmFsaWRcIik7ICovXG5cdFx0XHRvdXQucmdiID0gcmdiMkhleChbYlIsIGJHLCBiQl0pO1xuXHRcdFx0YnJlYWs7XG5cdFx0Y2FzZSAzOiBvdXQudGhlbWUgPSBpbmRleDsgYnJlYWs7XG5cdH1cblx0aWYgKG5UUyAhPSAwKSBvdXQudGludCA9IG5UUyA+IDAgPyBuVFMgLyAzMjc2NyA6IG5UUyAvIDMyNzY4O1xuXG5cdHJldHVybiBvdXQ7XG59XG5mdW5jdGlvbiB3cml0ZV9CcnRDb2xvcihjb2xvciwgbykge1xuXHRpZiAoIW8pIG8gPSBuZXdfYnVmKDgpO1xuXHRpZiAoIWNvbG9yIHx8IGNvbG9yLmF1dG8pIHsgby53cml0ZV9zaGlmdCg0LCAwKTsgby53cml0ZV9zaGlmdCg0LCAwKTsgcmV0dXJuIG87IH1cblx0aWYgKGNvbG9yLmluZGV4ICE9IG51bGwpIHtcblx0XHRvLndyaXRlX3NoaWZ0KDEsIDB4MDIpO1xuXHRcdG8ud3JpdGVfc2hpZnQoMSwgY29sb3IuaW5kZXgpO1xuXHR9IGVsc2UgaWYgKGNvbG9yLnRoZW1lICE9IG51bGwpIHtcblx0XHRvLndyaXRlX3NoaWZ0KDEsIDB4MDYpO1xuXHRcdG8ud3JpdGVfc2hpZnQoMSwgY29sb3IudGhlbWUpO1xuXHR9IGVsc2Uge1xuXHRcdG8ud3JpdGVfc2hpZnQoMSwgMHgwNSk7XG5cdFx0by53cml0ZV9zaGlmdCgxLCAwKTtcblx0fVxuXHR2YXIgblRTID0gY29sb3IudGludCB8fCAwO1xuXHRpZiAoblRTID4gMCkgblRTICo9IDMyNzY3O1xuXHRlbHNlIGlmIChuVFMgPCAwKSBuVFMgKj0gMzI3Njg7XG5cdG8ud3JpdGVfc2hpZnQoMiwgblRTKTtcblx0aWYgKCFjb2xvci5yZ2IgfHwgY29sb3IudGhlbWUgIT0gbnVsbCkge1xuXHRcdG8ud3JpdGVfc2hpZnQoMiwgMCk7XG5cdFx0by53cml0ZV9zaGlmdCgxLCAwKTtcblx0XHRvLndyaXRlX3NoaWZ0KDEsIDApO1xuXHR9IGVsc2Uge1xuXHRcdHZhciByZ2IgPSAoY29sb3IucmdiIHx8ICdGRkZGRkYnKTtcblx0XHRpZiAodHlwZW9mIHJnYiA9PSAnbnVtYmVyJykgcmdiID0gKFwiMDAwMDAwXCIgKyByZ2IudG9TdHJpbmcoMTYpKS5zbGljZSgtNik7XG5cdFx0by53cml0ZV9zaGlmdCgxLCBwYXJzZUludChyZ2Iuc2xpY2UoMCwgMiksIDE2KSk7XG5cdFx0by53cml0ZV9zaGlmdCgxLCBwYXJzZUludChyZ2Iuc2xpY2UoMiwgNCksIDE2KSk7XG5cdFx0by53cml0ZV9zaGlmdCgxLCBwYXJzZUludChyZ2Iuc2xpY2UoNCwgNiksIDE2KSk7XG5cdFx0by53cml0ZV9zaGlmdCgxLCAweEZGKTtcblx0fVxuXHRyZXR1cm4gbztcbn1cblxuLyogW01TLVhMU0JdIDIuNS41MiAqL1xuZnVuY3Rpb24gcGFyc2VfRm9udEZsYWdzKGRhdGEpIHtcblx0dmFyIGQgPSBkYXRhLnJlYWRfc2hpZnQoMSk7XG5cdGRhdGEubCsrO1xuXHR2YXIgb3V0ID0ge1xuXHRcdGZCb2xkOiBkICYgMHgwMSxcblx0XHRmSXRhbGljOiBkICYgMHgwMixcblx0XHRmVW5kZXJsaW5lOiBkICYgMHgwNCxcblx0XHRmU3RyaWtlb3V0OiBkICYgMHgwOCxcblx0XHRmT3V0bGluZTogZCAmIDB4MTAsXG5cdFx0ZlNoYWRvdzogZCAmIDB4MjAsXG5cdFx0ZkNvbmRlbnNlOiBkICYgMHg0MCxcblx0XHRmRXh0ZW5kOiBkICYgMHg4MFxuXHR9O1xuXHRyZXR1cm4gb3V0O1xufVxuZnVuY3Rpb24gd3JpdGVfRm9udEZsYWdzKGZvbnQsIG8pIHtcblx0aWYgKCFvKSBvID0gbmV3X2J1ZigyKTtcblx0dmFyIGdyYml0ID1cblx0XHQoZm9udC5pdGFsaWMgPyAweDAyIDogMCkgfFxuXHRcdChmb250LnN0cmlrZSA/IDB4MDggOiAwKSB8XG5cdFx0KGZvbnQub3V0bGluZSA/IDB4MTAgOiAwKSB8XG5cdFx0KGZvbnQuc2hhZG93ID8gMHgyMCA6IDApIHxcblx0XHQoZm9udC5jb25kZW5zZSA/IDB4NDAgOiAwKSB8XG5cdFx0KGZvbnQuZXh0ZW5kID8gMHg4MCA6IDApO1xuXHRvLndyaXRlX3NoaWZ0KDEsIGdyYml0KTtcblx0by53cml0ZV9zaGlmdCgxLCAwKTtcblx0cmV0dXJuIG87XG59XG5cbi8qIFtNUy1PTEVEU10gMi4zLjEgYW5kIDIuMy4yICovXG5mdW5jdGlvbiBwYXJzZV9DbGlwYm9hcmRGb3JtYXRPclN0cmluZyhvLCB3KSB7XG5cdC8vICRGbG93SWdub3JlXG5cdHZhciBDbGlwRm10ID0geyAyOiBcIkJJVE1BUFwiLCAzOiBcIk1FVEFGSUxFUElDVFwiLCA4OiBcIkRJQlwiLCAxNDogXCJFTkhNRVRBRklMRVwiIH07XG5cdHZhciBtID0gby5yZWFkX3NoaWZ0KDQpO1xuXHRzd2l0Y2ggKG0pIHtcblx0XHRjYXNlIDB4MDAwMDAwMDA6IHJldHVybiBcIlwiO1xuXHRcdGNhc2UgMHhmZmZmZmZmZjogY2FzZSAweGZmZmZmZmZlOiByZXR1cm4gQ2xpcEZtdFtvLnJlYWRfc2hpZnQoNCldIHx8IFwiXCI7XG5cdH1cblx0aWYgKG0gPiAweDE5MCkgdGhyb3cgbmV3IEVycm9yKFwiVW5zdXBwb3J0ZWQgQ2xpcGJvYXJkOiBcIiArIG0udG9TdHJpbmcoMTYpKTtcblx0by5sIC09IDQ7XG5cdHJldHVybiBvLnJlYWRfc2hpZnQoMCwgdyA9PSAxID8gXCJscHN0clwiIDogXCJscHdzdHJcIik7XG59XG5mdW5jdGlvbiBwYXJzZV9DbGlwYm9hcmRGb3JtYXRPckFuc2lTdHJpbmcobykgeyByZXR1cm4gcGFyc2VfQ2xpcGJvYXJkRm9ybWF0T3JTdHJpbmcobywgMSk7IH1cbmZ1bmN0aW9uIHBhcnNlX0NsaXBib2FyZEZvcm1hdE9yVW5pY29kZVN0cmluZyhvKSB7IHJldHVybiBwYXJzZV9DbGlwYm9hcmRGb3JtYXRPclN0cmluZyhvLCAyKTsgfVxuXG4vKiBbTVMtT0xFUFNdIDIuMiBQcm9wZXJ0eVR5cGUgKi9cbi8vdmFyIFZUX0VNUFRZICAgID0gMHgwMDAwO1xuLy92YXIgVlRfTlVMTCAgICAgPSAweDAwMDE7XG52YXIgVlRfSTIgICAgICAgPSAweDAwMDI7XG52YXIgVlRfSTQgICAgICAgPSAweDAwMDM7XG4vL3ZhciBWVF9SNCAgICAgICA9IDB4MDAwNDtcbi8vdmFyIFZUX1I4ICAgICAgID0gMHgwMDA1O1xuLy92YXIgVlRfQ1kgICAgICAgPSAweDAwMDY7XG4vL3ZhciBWVF9EQVRFICAgICA9IDB4MDAwNztcbi8vdmFyIFZUX0JTVFIgICAgID0gMHgwMDA4O1xuLy92YXIgVlRfRVJST1IgICAgPSAweDAwMEE7XG52YXIgVlRfQk9PTCAgICAgPSAweDAwMEI7XG52YXIgVlRfVkFSSUFOVCAgPSAweDAwMEM7XG4vL3ZhciBWVF9ERUNJTUFMICA9IDB4MDAwRTtcbi8vdmFyIFZUX0kxICAgICAgID0gMHgwMDEwO1xuLy92YXIgVlRfVUkxICAgICAgPSAweDAwMTE7XG4vL3ZhciBWVF9VSTIgICAgICA9IDB4MDAxMjtcbnZhciBWVF9VSTQgICAgICA9IDB4MDAxMztcbi8vdmFyIFZUX0k4ICAgICAgID0gMHgwMDE0O1xuLy92YXIgVlRfVUk4ICAgICAgPSAweDAwMTU7XG4vL3ZhciBWVF9JTlQgICAgICA9IDB4MDAxNjtcbi8vdmFyIFZUX1VJTlQgICAgID0gMHgwMDE3O1xudmFyIFZUX0xQU1RSICAgID0gMHgwMDFFO1xuLy92YXIgVlRfTFBXU1RSICAgPSAweDAwMUY7XG52YXIgVlRfRklMRVRJTUUgPSAweDAwNDA7XG52YXIgVlRfQkxPQiAgICAgPSAweDAwNDE7XG4vL3ZhciBWVF9TVFJFQU0gICA9IDB4MDA0Mjtcbi8vdmFyIFZUX1NUT1JBR0UgID0gMHgwMDQzO1xuLy92YXIgVlRfU1RSRUFNRURfT2JqZWN0ICA9IDB4MDA0NDtcbi8vdmFyIFZUX1NUT1JFRF9PYmplY3QgICAgPSAweDAwNDU7XG4vL3ZhciBWVF9CTE9CX09iamVjdCAgICAgID0gMHgwMDQ2O1xudmFyIFZUX0NGICAgICAgID0gMHgwMDQ3O1xuLy92YXIgVlRfQ0xTSUQgICAgPSAweDAwNDg7XG4vL3ZhciBWVF9WRVJTSU9ORURfU1RSRUFNID0gMHgwMDQ5O1xudmFyIFZUX1ZFQ1RPUiAgID0gMHgxMDAwO1xuLy92YXIgVlRfQVJSQVkgICAgPSAweDIwMDA7XG5cbnZhciBWVF9TVFJJTkcgICA9IDB4MDA1MDsgLy8gMi4zLjMuMS4xMSBWdFN0cmluZ1xudmFyIFZUX1VTVFIgICAgID0gMHgwMDUxOyAvLyAyLjMuMy4xLjEyIFZ0VW5hbGlnbmVkU3RyaW5nXG52YXIgVlRfQ1VTVE9NICAgPSBbVlRfU1RSSU5HLCBWVF9VU1RSXTtcblxuLyogW01TLU9TSEFSRURdIDIuMy4zLjIuMi4xIERvY3VtZW50IFN1bW1hcnkgSW5mb3JtYXRpb24gUElERFNJICovXG52YXIgRG9jU3VtbWFyeVBJRERTSSA9IHtcbjB4MDE6IHsgbjogJ0NvZGVQYWdlJywgdDogVlRfSTIgfSxcbjB4MDI6IHsgbjogJ0NhdGVnb3J5JywgdDogVlRfU1RSSU5HIH0sXG4weDAzOiB7IG46ICdQcmVzZW50YXRpb25Gb3JtYXQnLCB0OiBWVF9TVFJJTkcgfSxcbjB4MDQ6IHsgbjogJ0J5dGVDb3VudCcsIHQ6IFZUX0k0IH0sXG4weDA1OiB7IG46ICdMaW5lQ291bnQnLCB0OiBWVF9JNCB9LFxuMHgwNjogeyBuOiAnUGFyYWdyYXBoQ291bnQnLCB0OiBWVF9JNCB9LFxuMHgwNzogeyBuOiAnU2xpZGVDb3VudCcsIHQ6IFZUX0k0IH0sXG4weDA4OiB7IG46ICdOb3RlQ291bnQnLCB0OiBWVF9JNCB9LFxuMHgwOTogeyBuOiAnSGlkZGVuQ291bnQnLCB0OiBWVF9JNCB9LFxuMHgwYTogeyBuOiAnTXVsdGltZWRpYUNsaXBDb3VudCcsIHQ6IFZUX0k0IH0sXG4weDBiOiB7IG46ICdTY2FsZUNyb3AnLCB0OiBWVF9CT09MIH0sXG4weDBjOiB7IG46ICdIZWFkaW5nUGFpcnMnLCB0OiBWVF9WRUNUT1IgfCBWVF9WQVJJQU5UIH0sXG4weDBkOiB7IG46ICdUaXRsZXNPZlBhcnRzJywgdDogVlRfVkVDVE9SIHwgVlRfTFBTVFIgfSxcbjB4MGU6IHsgbjogJ01hbmFnZXInLCB0OiBWVF9TVFJJTkcgfSxcbjB4MGY6IHsgbjogJ0NvbXBhbnknLCB0OiBWVF9TVFJJTkcgfSxcbjB4MTA6IHsgbjogJ0xpbmtzVXBUb0RhdGUnLCB0OiBWVF9CT09MIH0sXG4weDExOiB7IG46ICdDaGFyYWN0ZXJDb3VudCcsIHQ6IFZUX0k0IH0sXG4weDEzOiB7IG46ICdTaGFyZWREb2MnLCB0OiBWVF9CT09MIH0sXG4weDE2OiB7IG46ICdIeXBlcmxpbmtzQ2hhbmdlZCcsIHQ6IFZUX0JPT0wgfSxcbjB4MTc6IHsgbjogJ0FwcFZlcnNpb24nLCB0OiBWVF9JNCwgcDogJ3ZlcnNpb24nIH0sXG4weDE4OiB7IG46ICdEaWdTaWcnLCB0OiBWVF9CTE9CIH0sXG4weDFBOiB7IG46ICdDb250ZW50VHlwZScsIHQ6IFZUX1NUUklORyB9LFxuMHgxQjogeyBuOiAnQ29udGVudFN0YXR1cycsIHQ6IFZUX1NUUklORyB9LFxuMHgxQzogeyBuOiAnTGFuZ3VhZ2UnLCB0OiBWVF9TVFJJTkcgfSxcbjB4MUQ6IHsgbjogJ1ZlcnNpb24nLCB0OiBWVF9TVFJJTkcgfSxcbjB4RkY6IHt9XG59O1xuXG4vKiBbTVMtT1NIQVJFRF0gMi4zLjMuMi4xLjEgU3VtbWFyeSBJbmZvcm1hdGlvbiBQcm9wZXJ0eSBTZXQgUElEU0kgKi9cbnZhciBTdW1tYXJ5UElEU0kgPSB7XG4weDAxOiB7IG46ICdDb2RlUGFnZScsIHQ6IFZUX0kyIH0sXG4weDAyOiB7IG46ICdUaXRsZScsIHQ6IFZUX1NUUklORyB9LFxuMHgwMzogeyBuOiAnU3ViamVjdCcsIHQ6IFZUX1NUUklORyB9LFxuMHgwNDogeyBuOiAnQXV0aG9yJywgdDogVlRfU1RSSU5HIH0sXG4weDA1OiB7IG46ICdLZXl3b3JkcycsIHQ6IFZUX1NUUklORyB9LFxuMHgwNjogeyBuOiAnQ29tbWVudHMnLCB0OiBWVF9TVFJJTkcgfSxcbjB4MDc6IHsgbjogJ1RlbXBsYXRlJywgdDogVlRfU1RSSU5HIH0sXG4weDA4OiB7IG46ICdMYXN0QXV0aG9yJywgdDogVlRfU1RSSU5HIH0sXG4weDA5OiB7IG46ICdSZXZOdW1iZXInLCB0OiBWVF9TVFJJTkcgfSxcbjB4MEE6IHsgbjogJ0VkaXRUaW1lJywgdDogVlRfRklMRVRJTUUgfSxcbjB4MEI6IHsgbjogJ0xhc3RQcmludGVkJywgdDogVlRfRklMRVRJTUUgfSxcbjB4MEM6IHsgbjogJ0NyZWF0ZWREYXRlJywgdDogVlRfRklMRVRJTUUgfSxcbjB4MEQ6IHsgbjogJ01vZGlmaWVkRGF0ZScsIHQ6IFZUX0ZJTEVUSU1FIH0sXG4weDBFOiB7IG46ICdQYWdlQ291bnQnLCB0OiBWVF9JNCB9LFxuMHgwRjogeyBuOiAnV29yZENvdW50JywgdDogVlRfSTQgfSxcbjB4MTA6IHsgbjogJ0NoYXJDb3VudCcsIHQ6IFZUX0k0IH0sXG4weDExOiB7IG46ICdUaHVtYm5haWwnLCB0OiBWVF9DRiB9LFxuMHgxMjogeyBuOiAnQXBwbGljYXRpb24nLCB0OiBWVF9TVFJJTkcgfSxcbjB4MTM6IHsgbjogJ0RvY1NlY3VyaXR5JywgdDogVlRfSTQgfSxcbjB4RkY6IHt9XG59O1xuXG4vKiBbTVMtT0xFUFNdIDIuMTggKi9cbnZhciBTcGVjaWFsUHJvcGVydGllcyA9IHtcbjB4ODAwMDAwMDA6IHsgbjogJ0xvY2FsZScsIHQ6IFZUX1VJNCB9LFxuMHg4MDAwMDAwMzogeyBuOiAnQmVoYXZpb3InLCB0OiBWVF9VSTQgfSxcbjB4NzI2MjcyNjI6IHt9XG59O1xuXG4oZnVuY3Rpb24oKSB7XG5cdGZvcih2YXIgeSBpbiBTcGVjaWFsUHJvcGVydGllcykgaWYoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKFNwZWNpYWxQcm9wZXJ0aWVzLCB5KSlcblx0RG9jU3VtbWFyeVBJRERTSVt5XSA9IFN1bW1hcnlQSURTSVt5XSA9IFNwZWNpYWxQcm9wZXJ0aWVzW3ldO1xufSkoKTtcblxudmFyIERvY1N1bW1hcnlSRSA9IGV2ZXJ0X2tleShEb2NTdW1tYXJ5UElERFNJLCBcIm5cIik7XG52YXIgU3VtbWFyeVJFID0gZXZlcnRfa2V5KFN1bW1hcnlQSURTSSwgXCJuXCIpO1xuXG4vKiBbTVMtWExTXSAyLjQuNjMgQ291bnRyeS9SZWdpb24gY29kZXMgKi9cbnZhciBDb3VudHJ5RW51bSA9IHtcbjB4MDAwMTogXCJVU1wiLCAvLyBVbml0ZWQgU3RhdGVzXG4weDAwMDI6IFwiQ0FcIiwgLy8gQ2FuYWRhXG4weDAwMDM6IFwiXCIsIC8vIExhdGluIEFtZXJpY2EgKGV4Y2VwdCBCcmF6aWwpXG4weDAwMDc6IFwiUlVcIiwgLy8gUnVzc2lhXG4weDAwMTQ6IFwiRUdcIiwgLy8gRWd5cHRcbjB4MDAxRTogXCJHUlwiLCAvLyBHcmVlY2VcbjB4MDAxRjogXCJOTFwiLCAvLyBOZXRoZXJsYW5kc1xuMHgwMDIwOiBcIkJFXCIsIC8vIEJlbGdpdW1cbjB4MDAyMTogXCJGUlwiLCAvLyBGcmFuY2VcbjB4MDAyMjogXCJFU1wiLCAvLyBTcGFpblxuMHgwMDI0OiBcIkhVXCIsIC8vIEh1bmdhcnlcbjB4MDAyNzogXCJJVFwiLCAvLyBJdGFseVxuMHgwMDI5OiBcIkNIXCIsIC8vIFN3aXR6ZXJsYW5kXG4weDAwMkI6IFwiQVRcIiwgLy8gQXVzdHJpYVxuMHgwMDJDOiBcIkdCXCIsIC8vIFVuaXRlZCBLaW5nZG9tXG4weDAwMkQ6IFwiREtcIiwgLy8gRGVubWFya1xuMHgwMDJFOiBcIlNFXCIsIC8vIFN3ZWRlblxuMHgwMDJGOiBcIk5PXCIsIC8vIE5vcndheVxuMHgwMDMwOiBcIlBMXCIsIC8vIFBvbGFuZFxuMHgwMDMxOiBcIkRFXCIsIC8vIEdlcm1hbnlcbjB4MDAzNDogXCJNWFwiLCAvLyBNZXhpY29cbjB4MDAzNzogXCJCUlwiLCAvLyBCcmF6aWxcbjB4MDAzZDogXCJBVVwiLCAvLyBBdXN0cmFsaWFcbjB4MDA0MDogXCJOWlwiLCAvLyBOZXcgWmVhbGFuZFxuMHgwMDQyOiBcIlRIXCIsIC8vIFRoYWlsYW5kXG4weDAwNTE6IFwiSlBcIiwgLy8gSmFwYW5cbjB4MDA1MjogXCJLUlwiLCAvLyBLb3JlYVxuMHgwMDU0OiBcIlZOXCIsIC8vIFZpZXQgTmFtXG4weDAwNTY6IFwiQ05cIiwgLy8gQ2hpbmFcbjB4MDA1QTogXCJUUlwiLCAvLyBUdXJrZXlcbjB4MDA2OTogXCJKU1wiLCAvLyBSYW1hc3RhblxuMHgwMEQ1OiBcIkRaXCIsIC8vIEFsZ2VyaWFcbjB4MDBEODogXCJNQVwiLCAvLyBNb3JvY2NvXG4weDAwREE6IFwiTFlcIiwgLy8gTGlieWFcbjB4MDE1RjogXCJQVFwiLCAvLyBQb3J0dWdhbFxuMHgwMTYyOiBcIklTXCIsIC8vIEljZWxhbmRcbjB4MDE2NjogXCJGSVwiLCAvLyBGaW5sYW5kXG4weDAxQTQ6IFwiQ1pcIiwgLy8gQ3plY2ggUmVwdWJsaWNcbjB4MDM3NjogXCJUV1wiLCAvLyBUYWl3YW5cbjB4MDNDMTogXCJMQlwiLCAvLyBMZWJhbm9uXG4weDAzQzI6IFwiSk9cIiwgLy8gSm9yZGFuXG4weDAzQzM6IFwiU1lcIiwgLy8gU3lyaWFcbjB4MDNDNDogXCJJUVwiLCAvLyBJcmFxXG4weDAzQzU6IFwiS1dcIiwgLy8gS3V3YWl0XG4weDAzQzY6IFwiU0FcIiwgLy8gU2F1ZGkgQXJhYmlhXG4weDAzQ0I6IFwiQUVcIiwgLy8gVW5pdGVkIEFyYWIgRW1pcmF0ZXNcbjB4MDNDQzogXCJJTFwiLCAvLyBJc3JhZWxcbjB4MDNDRTogXCJRQVwiLCAvLyBRYXRhclxuMHgwM0Q1OiBcIklSXCIsIC8vIElyYW5cbjB4RkZGRjogXCJVU1wiICAvLyBVbml0ZWQgU3RhdGVzXG59O1xuXG4vKiBbTVMtWExTXSAyLjUuMTI3ICovXG52YXIgWExTRmlsbFBhdHRlcm4gPSBbXG5cdG51bGwsXG5cdCdzb2xpZCcsXG5cdCdtZWRpdW1HcmF5Jyxcblx0J2RhcmtHcmF5Jyxcblx0J2xpZ2h0R3JheScsXG5cdCdkYXJrSG9yaXpvbnRhbCcsXG5cdCdkYXJrVmVydGljYWwnLFxuXHQnZGFya0Rvd24nLFxuXHQnZGFya1VwJyxcblx0J2RhcmtHcmlkJyxcblx0J2RhcmtUcmVsbGlzJyxcblx0J2xpZ2h0SG9yaXpvbnRhbCcsXG5cdCdsaWdodFZlcnRpY2FsJyxcblx0J2xpZ2h0RG93bicsXG5cdCdsaWdodFVwJyxcblx0J2xpZ2h0R3JpZCcsXG5cdCdsaWdodFRyZWxsaXMnLFxuXHQnZ3JheTEyNScsXG5cdCdncmF5MDYyNSdcbl07XG5cbmZ1bmN0aW9uIHJnYmlmeShhcnIpIHsgcmV0dXJuIGFyci5tYXAoZnVuY3Rpb24oeCkgeyByZXR1cm4gWyh4Pj4xNikmMjU1LCh4Pj44KSYyNTUseCYyNTVdOyB9KTsgfVxuXG4vKiBbTVMtWExTXSAyLjUuMTYxICovXG4vKiBbTVMtWExTQl0gMi41Ljc1IEljdiAqL1xudmFyIF9YTFNJY3YgPSByZ2JpZnkoW1xuXHQvKiBDb2xvciBDb25zdGFudHMgKi9cblx0MHgwMDAwMDAsXG5cdDB4RkZGRkZGLFxuXHQweEZGMDAwMCxcblx0MHgwMEZGMDAsXG5cdDB4MDAwMEZGLFxuXHQweEZGRkYwMCxcblx0MHhGRjAwRkYsXG5cdDB4MDBGRkZGLFxuXG5cdC8qIE92ZXJyaWRhYmxlIERlZmF1bHRzICovXG5cdDB4MDAwMDAwLFxuXHQweEZGRkZGRixcblx0MHhGRjAwMDAsXG5cdDB4MDBGRjAwLFxuXHQweDAwMDBGRixcblx0MHhGRkZGMDAsXG5cdDB4RkYwMEZGLFxuXHQweDAwRkZGRixcblxuXHQweDgwMDAwMCxcblx0MHgwMDgwMDAsXG5cdDB4MDAwMDgwLFxuXHQweDgwODAwMCxcblx0MHg4MDAwODAsXG5cdDB4MDA4MDgwLFxuXHQweEMwQzBDMCxcblx0MHg4MDgwODAsXG5cdDB4OTk5OUZGLFxuXHQweDk5MzM2Nixcblx0MHhGRkZGQ0MsXG5cdDB4Q0NGRkZGLFxuXHQweDY2MDA2Nixcblx0MHhGRjgwODAsXG5cdDB4MDA2NkNDLFxuXHQweENDQ0NGRixcblxuXHQweDAwMDA4MCxcblx0MHhGRjAwRkYsXG5cdDB4RkZGRjAwLFxuXHQweDAwRkZGRixcblx0MHg4MDAwODAsXG5cdDB4ODAwMDAwLFxuXHQweDAwODA4MCxcblx0MHgwMDAwRkYsXG5cdDB4MDBDQ0ZGLFxuXHQweENDRkZGRixcblx0MHhDQ0ZGQ0MsXG5cdDB4RkZGRjk5LFxuXHQweDk5Q0NGRixcblx0MHhGRjk5Q0MsXG5cdDB4Q0M5OUZGLFxuXHQweEZGQ0M5OSxcblxuXHQweDMzNjZGRixcblx0MHgzM0NDQ0MsXG5cdDB4OTlDQzAwLFxuXHQweEZGQ0MwMCxcblx0MHhGRjk5MDAsXG5cdDB4RkY2NjAwLFxuXHQweDY2NjY5OSxcblx0MHg5Njk2OTYsXG5cdDB4MDAzMzY2LFxuXHQweDMzOTk2Nixcblx0MHgwMDMzMDAsXG5cdDB4MzMzMzAwLFxuXHQweDk5MzMwMCxcblx0MHg5OTMzNjYsXG5cdDB4MzMzMzk5LFxuXHQweDMzMzMzMyxcblxuXHQvKiBPdGhlciBlbnRyaWVzIHRvIGFwcGVhc2UgQklGRjgvMTIgKi9cblx0MHhGRkZGRkYsIC8qIDB4NDAgaWN2Rm9yZWdyb3VuZCA/PyAqL1xuXHQweDAwMDAwMCwgLyogMHg0MSBpY3ZCYWNrZ3JvdW5kID8/ICovXG5cdDB4MDAwMDAwLCAvKiAweDQyIGljdkZyYW1lID8/ICovXG5cdDB4MDAwMDAwLCAvKiAweDQzIGljdjNEID8/ICovXG5cdDB4MDAwMDAwLCAvKiAweDQ0IGljdjNEVGV4dCA/PyAqL1xuXHQweDAwMDAwMCwgLyogMHg0NSBpY3YzREhpbGl0ZSA/PyAqL1xuXHQweDAwMDAwMCwgLyogMHg0NiBpY3YzRFNoYWRvdyA/PyAqL1xuXHQweDAwMDAwMCwgLyogMHg0NyBpY3ZIaWxpdGUgPz8gKi9cblx0MHgwMDAwMDAsIC8qIDB4NDggaWN2Q3RsVGV4dCA/PyAqL1xuXHQweDAwMDAwMCwgLyogMHg0OSBpY3ZDdGxTY3JsID8/ICovXG5cdDB4MDAwMDAwLCAvKiAweDRBIGljdkN0bEludiA/PyAqL1xuXHQweDAwMDAwMCwgLyogMHg0QiBpY3ZDdGxCb2R5ID8/ICovXG5cdDB4MDAwMDAwLCAvKiAweDRDIGljdkN0bEZyYW1lID8/ICovXG5cdDB4MDAwMDAwLCAvKiAweDREIGljdkN0bEZvcmUgPz8gKi9cblx0MHgwMDAwMDAsIC8qIDB4NEUgaWN2Q3RsQmFjayA/PyAqL1xuXHQweDAwMDAwMCwgLyogMHg0RiBpY3ZDdGxOZXV0cmFsICovXG5cdDB4MDAwMDAwLCAvKiAweDUwIGljdkluZm9CayA/PyAqL1xuXHQweDAwMDAwMCAvKiAweDUxIGljdkluZm9UZXh0ID8/ICovXG5dKTtcbnZhciBYTFNJY3YgPSBkdXAoX1hMU0ljdik7XG5cbi8qIFtNUy1YTFNCXSAyLjUuOTcuMiAqL1xudmFyIEJFcnIgPSB7XG4weDAwOiBcIiNOVUxMIVwiLFxuMHgwNzogXCIjRElWLzAhXCIsXG4weDBGOiBcIiNWQUxVRSFcIixcbjB4MTc6IFwiI1JFRiFcIixcbjB4MUQ6IFwiI05BTUU/XCIsXG4weDI0OiBcIiNOVU0hXCIsXG4weDJBOiBcIiNOL0FcIixcbjB4MkI6IFwiI0dFVFRJTkdfREFUQVwiLFxuMHhGRjogXCIjV1RGP1wiXG59O1xudmFyIFJCRXJyID0gZXZlcnRfbnVtKEJFcnIpO1xuLyogUGFydHMgZW51bWVyYXRlZCBpbiBPUEMgc3BlYywgTVMtWExTQiBhbmQgTVMtWExTWCAqL1xuLyogMTIuMyBQYXJ0IFN1bW1hcnkgPFNwcmVhZHNoZWV0TUw+ICovXG4vKiAxNC4yIFBhcnQgU3VtbWFyeSA8RHJhd2luZ01MPiAqL1xuLyogW01TLVhMU1hdIDIuMSBQYXJ0IEVudW1lcmF0aW9ucyA7IFtNUy1YTFNCXSAyLjEuNyBQYXJ0IEVudW1lcmF0aW9uICovXG52YXIgY3QydHlwZS8qe1tzdHJpbmddOnN0cmluZ30qLyA9ICh7XG5cdC8qIFdvcmtib29rICovXG5cdFwiYXBwbGljYXRpb24vdm5kLm9wZW54bWxmb3JtYXRzLW9mZmljZWRvY3VtZW50LnNwcmVhZHNoZWV0bWwuc2hlZXQubWFpbit4bWxcIjogXCJ3b3JrYm9va3NcIixcblxuXHQvKiBXb3Jrc2hlZXQgKi9cblx0XCJhcHBsaWNhdGlvbi92bmQubXMtZXhjZWwuYmluSW5kZXhXc1wiOiBcIlRPRE9cIiwgLyogQmluYXJ5IEluZGV4ICovXG5cblx0LyogTWFjcm9zaGVldCAqL1xuXHRcImFwcGxpY2F0aW9uL3ZuZC5tcy1leGNlbC5pbnRsbWFjcm9zaGVldFwiOiBcIlRPRE9cIixcblx0XCJhcHBsaWNhdGlvbi92bmQubXMtZXhjZWwuYmluSW5kZXhNc1wiOiBcIlRPRE9cIiwgLyogQmluYXJ5IEluZGV4ICovXG5cblx0LyogRmlsZSBQcm9wZXJ0aWVzICovXG5cdFwiYXBwbGljYXRpb24vdm5kLm9wZW54bWxmb3JtYXRzLXBhY2thZ2UuY29yZS1wcm9wZXJ0aWVzK3htbFwiOiBcImNvcmVwcm9wc1wiLFxuXHRcImFwcGxpY2F0aW9uL3ZuZC5vcGVueG1sZm9ybWF0cy1vZmZpY2Vkb2N1bWVudC5jdXN0b20tcHJvcGVydGllcyt4bWxcIjogXCJjdXN0cHJvcHNcIixcblx0XCJhcHBsaWNhdGlvbi92bmQub3BlbnhtbGZvcm1hdHMtb2ZmaWNlZG9jdW1lbnQuZXh0ZW5kZWQtcHJvcGVydGllcyt4bWxcIjogXCJleHRwcm9wc1wiLFxuXG5cdC8qIEN1c3RvbSBEYXRhIFByb3BlcnRpZXMgKi9cblx0XCJhcHBsaWNhdGlvbi92bmQub3BlbnhtbGZvcm1hdHMtb2ZmaWNlZG9jdW1lbnQuY3VzdG9tWG1sUHJvcGVydGllcyt4bWxcIjogXCJUT0RPXCIsXG5cdFwiYXBwbGljYXRpb24vdm5kLm9wZW54bWxmb3JtYXRzLW9mZmljZWRvY3VtZW50LnNwcmVhZHNoZWV0bWwuY3VzdG9tUHJvcGVydHlcIjogXCJUT0RPXCIsXG5cblx0LyogUGl2b3RUYWJsZSAqL1xuXHRcImFwcGxpY2F0aW9uL3ZuZC5tcy1leGNlbC5waXZvdFRhYmxlXCI6IFwiVE9ET1wiLFxuXHRcImFwcGxpY2F0aW9uL3ZuZC5vcGVueG1sZm9ybWF0cy1vZmZpY2Vkb2N1bWVudC5zcHJlYWRzaGVldG1sLnBpdm90VGFibGUreG1sXCI6IFwiVE9ET1wiLFxuXG5cdC8qIENoYXJ0IE9iamVjdHMgKi9cblx0XCJhcHBsaWNhdGlvbi92bmQub3BlbnhtbGZvcm1hdHMtb2ZmaWNlZG9jdW1lbnQuZHJhd2luZ21sLmNoYXJ0K3htbFwiOiBcIlRPRE9cIixcblxuXHQvKiBDaGFydCBDb2xvcnMgKi9cblx0XCJhcHBsaWNhdGlvbi92bmQubXMtb2ZmaWNlLmNoYXJ0Y29sb3JzdHlsZSt4bWxcIjogXCJUT0RPXCIsXG5cblx0LyogQ2hhcnQgU3R5bGUgKi9cblx0XCJhcHBsaWNhdGlvbi92bmQubXMtb2ZmaWNlLmNoYXJ0c3R5bGUreG1sXCI6IFwiVE9ET1wiLFxuXG5cdC8qIENoYXJ0IEFkdmFuY2VkICovXG5cdFwiYXBwbGljYXRpb24vdm5kLm1zLW9mZmljZS5jaGFydGV4K3htbFwiOiBcIlRPRE9cIixcblxuXHQvKiBDYWxjdWxhdGlvbiBDaGFpbiAqL1xuXHRcImFwcGxpY2F0aW9uL3ZuZC5tcy1leGNlbC5jYWxjQ2hhaW5cIjogXCJjYWxjY2hhaW5zXCIsXG5cdFwiYXBwbGljYXRpb24vdm5kLm9wZW54bWxmb3JtYXRzLW9mZmljZWRvY3VtZW50LnNwcmVhZHNoZWV0bWwuY2FsY0NoYWluK3htbFwiOiBcImNhbGNjaGFpbnNcIixcblxuXHQvKiBQcmludGVyIFNldHRpbmdzICovXG5cdFwiYXBwbGljYXRpb24vdm5kLm9wZW54bWxmb3JtYXRzLW9mZmljZWRvY3VtZW50LnNwcmVhZHNoZWV0bWwucHJpbnRlclNldHRpbmdzXCI6IFwiVE9ET1wiLFxuXG5cdC8qIEFjdGl2ZVggKi9cblx0XCJhcHBsaWNhdGlvbi92bmQubXMtb2ZmaWNlLmFjdGl2ZVhcIjogXCJUT0RPXCIsXG5cdFwiYXBwbGljYXRpb24vdm5kLm1zLW9mZmljZS5hY3RpdmVYK3htbFwiOiBcIlRPRE9cIixcblxuXHQvKiBDdXN0b20gVG9vbGJhcnMgKi9cblx0XCJhcHBsaWNhdGlvbi92bmQubXMtZXhjZWwuYXR0YWNoZWRUb29sYmFyc1wiOiBcIlRPRE9cIixcblxuXHQvKiBFeHRlcm5hbCBEYXRhIENvbm5lY3Rpb25zICovXG5cdFwiYXBwbGljYXRpb24vdm5kLm1zLWV4Y2VsLmNvbm5lY3Rpb25zXCI6IFwiVE9ET1wiLFxuXHRcImFwcGxpY2F0aW9uL3ZuZC5vcGVueG1sZm9ybWF0cy1vZmZpY2Vkb2N1bWVudC5zcHJlYWRzaGVldG1sLmNvbm5lY3Rpb25zK3htbFwiOiBcIlRPRE9cIixcblxuXHQvKiBFeHRlcm5hbCBMaW5rcyAqL1xuXHRcImFwcGxpY2F0aW9uL3ZuZC5tcy1leGNlbC5leHRlcm5hbExpbmtcIjogXCJsaW5rc1wiLFxuXHRcImFwcGxpY2F0aW9uL3ZuZC5vcGVueG1sZm9ybWF0cy1vZmZpY2Vkb2N1bWVudC5zcHJlYWRzaGVldG1sLmV4dGVybmFsTGluayt4bWxcIjogXCJsaW5rc1wiLFxuXG5cdC8qIE1ldGFkYXRhICovXG5cdFwiYXBwbGljYXRpb24vdm5kLm1zLWV4Y2VsLnNoZWV0TWV0YWRhdGFcIjogXCJUT0RPXCIsXG5cdFwiYXBwbGljYXRpb24vdm5kLm9wZW54bWxmb3JtYXRzLW9mZmljZWRvY3VtZW50LnNwcmVhZHNoZWV0bWwuc2hlZXRNZXRhZGF0YSt4bWxcIjogXCJUT0RPXCIsXG5cblx0LyogUGl2b3RDYWNoZSAqL1xuXHRcImFwcGxpY2F0aW9uL3ZuZC5tcy1leGNlbC5waXZvdENhY2hlRGVmaW5pdGlvblwiOiBcIlRPRE9cIixcblx0XCJhcHBsaWNhdGlvbi92bmQubXMtZXhjZWwucGl2b3RDYWNoZVJlY29yZHNcIjogXCJUT0RPXCIsXG5cdFwiYXBwbGljYXRpb24vdm5kLm9wZW54bWxmb3JtYXRzLW9mZmljZWRvY3VtZW50LnNwcmVhZHNoZWV0bWwucGl2b3RDYWNoZURlZmluaXRpb24reG1sXCI6IFwiVE9ET1wiLFxuXHRcImFwcGxpY2F0aW9uL3ZuZC5vcGVueG1sZm9ybWF0cy1vZmZpY2Vkb2N1bWVudC5zcHJlYWRzaGVldG1sLnBpdm90Q2FjaGVSZWNvcmRzK3htbFwiOiBcIlRPRE9cIixcblxuXHQvKiBRdWVyeSBUYWJsZSAqL1xuXHRcImFwcGxpY2F0aW9uL3ZuZC5tcy1leGNlbC5xdWVyeVRhYmxlXCI6IFwiVE9ET1wiLFxuXHRcImFwcGxpY2F0aW9uL3ZuZC5vcGVueG1sZm9ybWF0cy1vZmZpY2Vkb2N1bWVudC5zcHJlYWRzaGVldG1sLnF1ZXJ5VGFibGUreG1sXCI6IFwiVE9ET1wiLFxuXG5cdC8qIFNoYXJlZCBXb3JrYm9vayAqL1xuXHRcImFwcGxpY2F0aW9uL3ZuZC5tcy1leGNlbC51c2VyTmFtZXNcIjogXCJUT0RPXCIsXG5cdFwiYXBwbGljYXRpb24vdm5kLm1zLWV4Y2VsLnJldmlzaW9uSGVhZGVyc1wiOiBcIlRPRE9cIixcblx0XCJhcHBsaWNhdGlvbi92bmQubXMtZXhjZWwucmV2aXNpb25Mb2dcIjogXCJUT0RPXCIsXG5cdFwiYXBwbGljYXRpb24vdm5kLm9wZW54bWxmb3JtYXRzLW9mZmljZWRvY3VtZW50LnNwcmVhZHNoZWV0bWwucmV2aXNpb25IZWFkZXJzK3htbFwiOiBcIlRPRE9cIixcblx0XCJhcHBsaWNhdGlvbi92bmQub3BlbnhtbGZvcm1hdHMtb2ZmaWNlZG9jdW1lbnQuc3ByZWFkc2hlZXRtbC5yZXZpc2lvbkxvZyt4bWxcIjogXCJUT0RPXCIsXG5cdFwiYXBwbGljYXRpb24vdm5kLm9wZW54bWxmb3JtYXRzLW9mZmljZWRvY3VtZW50LnNwcmVhZHNoZWV0bWwudXNlck5hbWVzK3htbFwiOiBcIlRPRE9cIixcblxuXHQvKiBTaW5nbGUgQ2VsbCBUYWJsZSAqL1xuXHRcImFwcGxpY2F0aW9uL3ZuZC5tcy1leGNlbC50YWJsZVNpbmdsZUNlbGxzXCI6IFwiVE9ET1wiLFxuXHRcImFwcGxpY2F0aW9uL3ZuZC5vcGVueG1sZm9ybWF0cy1vZmZpY2Vkb2N1bWVudC5zcHJlYWRzaGVldG1sLnRhYmxlU2luZ2xlQ2VsbHMreG1sXCI6IFwiVE9ET1wiLFxuXG5cdC8qIFNsaWNlciAqL1xuXHRcImFwcGxpY2F0aW9uL3ZuZC5tcy1leGNlbC5zbGljZXJcIjogXCJUT0RPXCIsXG5cdFwiYXBwbGljYXRpb24vdm5kLm1zLWV4Y2VsLnNsaWNlckNhY2hlXCI6IFwiVE9ET1wiLFxuXHRcImFwcGxpY2F0aW9uL3ZuZC5tcy1leGNlbC5zbGljZXIreG1sXCI6IFwiVE9ET1wiLFxuXHRcImFwcGxpY2F0aW9uL3ZuZC5tcy1leGNlbC5zbGljZXJDYWNoZSt4bWxcIjogXCJUT0RPXCIsXG5cblx0LyogU29ydCBNYXAgKi9cblx0XCJhcHBsaWNhdGlvbi92bmQubXMtZXhjZWwud3NTb3J0TWFwXCI6IFwiVE9ET1wiLFxuXG5cdC8qIFRhYmxlICovXG5cdFwiYXBwbGljYXRpb24vdm5kLm1zLWV4Y2VsLnRhYmxlXCI6IFwiVE9ET1wiLFxuXHRcImFwcGxpY2F0aW9uL3ZuZC5vcGVueG1sZm9ybWF0cy1vZmZpY2Vkb2N1bWVudC5zcHJlYWRzaGVldG1sLnRhYmxlK3htbFwiOiBcIlRPRE9cIixcblxuXHQvKiBUaGVtZXMgKi9cblx0XCJhcHBsaWNhdGlvbi92bmQub3BlbnhtbGZvcm1hdHMtb2ZmaWNlZG9jdW1lbnQudGhlbWUreG1sXCI6IFwidGhlbWVzXCIsXG5cblx0LyogVGhlbWUgT3ZlcnJpZGUgKi9cblx0XCJhcHBsaWNhdGlvbi92bmQub3BlbnhtbGZvcm1hdHMtb2ZmaWNlZG9jdW1lbnQudGhlbWVPdmVycmlkZSt4bWxcIjogXCJUT0RPXCIsXG5cblx0LyogVGltZWxpbmUgKi9cblx0XCJhcHBsaWNhdGlvbi92bmQubXMtZXhjZWwuVGltZWxpbmUreG1sXCI6IFwiVE9ET1wiLCAvKiB2ZXJpZnkgKi9cblx0XCJhcHBsaWNhdGlvbi92bmQubXMtZXhjZWwuVGltZWxpbmVDYWNoZSt4bWxcIjogXCJUT0RPXCIsIC8qIHZlcmlmeSAqL1xuXG5cdC8qIFZCQSAqL1xuXHRcImFwcGxpY2F0aW9uL3ZuZC5tcy1vZmZpY2UudmJhUHJvamVjdFwiOiBcInZiYVwiLFxuXHRcImFwcGxpY2F0aW9uL3ZuZC5tcy1vZmZpY2UudmJhUHJvamVjdFNpZ25hdHVyZVwiOiBcInZiYVwiLFxuXG5cdC8qIFZvbGF0aWxlIERlcGVuZGVuY2llcyAqL1xuXHRcImFwcGxpY2F0aW9uL3ZuZC5tcy1vZmZpY2Uudm9sYXRpbGVEZXBlbmRlbmNpZXNcIjogXCJUT0RPXCIsXG5cdFwiYXBwbGljYXRpb24vdm5kLm9wZW54bWxmb3JtYXRzLW9mZmljZWRvY3VtZW50LnNwcmVhZHNoZWV0bWwudm9sYXRpbGVEZXBlbmRlbmNpZXMreG1sXCI6IFwiVE9ET1wiLFxuXG5cdC8qIENvbnRyb2wgUHJvcGVydGllcyAqL1xuXHRcImFwcGxpY2F0aW9uL3ZuZC5tcy1leGNlbC5jb250cm9scHJvcGVydGllcyt4bWxcIjogXCJUT0RPXCIsXG5cblx0LyogRGF0YSBNb2RlbCAqL1xuXHRcImFwcGxpY2F0aW9uL3ZuZC5vcGVueG1sZm9ybWF0cy1vZmZpY2Vkb2N1bWVudC5tb2RlbCtkYXRhXCI6IFwiVE9ET1wiLFxuXG5cdC8qIFN1cnZleSAqL1xuXHRcImFwcGxpY2F0aW9uL3ZuZC5tcy1leGNlbC5TdXJ2ZXkreG1sXCI6IFwiVE9ET1wiLFxuXG5cdC8qIERyYXdpbmcgKi9cblx0XCJhcHBsaWNhdGlvbi92bmQub3BlbnhtbGZvcm1hdHMtb2ZmaWNlZG9jdW1lbnQuZHJhd2luZyt4bWxcIjogXCJkcmF3aW5nc1wiLFxuXHRcImFwcGxpY2F0aW9uL3ZuZC5vcGVueG1sZm9ybWF0cy1vZmZpY2Vkb2N1bWVudC5kcmF3aW5nbWwuY2hhcnRzaGFwZXMreG1sXCI6IFwiVE9ET1wiLFxuXHRcImFwcGxpY2F0aW9uL3ZuZC5vcGVueG1sZm9ybWF0cy1vZmZpY2Vkb2N1bWVudC5kcmF3aW5nbWwuZGlhZ3JhbUNvbG9ycyt4bWxcIjogXCJUT0RPXCIsXG5cdFwiYXBwbGljYXRpb24vdm5kLm9wZW54bWxmb3JtYXRzLW9mZmljZWRvY3VtZW50LmRyYXdpbmdtbC5kaWFncmFtRGF0YSt4bWxcIjogXCJUT0RPXCIsXG5cdFwiYXBwbGljYXRpb24vdm5kLm9wZW54bWxmb3JtYXRzLW9mZmljZWRvY3VtZW50LmRyYXdpbmdtbC5kaWFncmFtTGF5b3V0K3htbFwiOiBcIlRPRE9cIixcblx0XCJhcHBsaWNhdGlvbi92bmQub3BlbnhtbGZvcm1hdHMtb2ZmaWNlZG9jdW1lbnQuZHJhd2luZ21sLmRpYWdyYW1TdHlsZSt4bWxcIjogXCJUT0RPXCIsXG5cblx0LyogVk1MICovXG5cdFwiYXBwbGljYXRpb24vdm5kLm9wZW54bWxmb3JtYXRzLW9mZmljZWRvY3VtZW50LnZtbERyYXdpbmdcIjogXCJUT0RPXCIsXG5cblx0XCJhcHBsaWNhdGlvbi92bmQub3BlbnhtbGZvcm1hdHMtcGFja2FnZS5yZWxhdGlvbnNoaXBzK3htbFwiOiBcInJlbHNcIixcblx0XCJhcHBsaWNhdGlvbi92bmQub3BlbnhtbGZvcm1hdHMtb2ZmaWNlZG9jdW1lbnQub2xlT2JqZWN0XCI6IFwiVE9ET1wiLFxuXG5cdC8qIEltYWdlICovXG5cdFwiaW1hZ2UvcG5nXCI6IFwiVE9ET1wiLFxuXG5cdFwic2hlZXRcIjogXCJqc1wiXG59KTtcblxudmFyIENUX0xJU1QgPSAoZnVuY3Rpb24oKXtcblx0dmFyIG8gPSB7XG5cdFx0d29ya2Jvb2tzOiB7XG5cdFx0XHR4bHN4OiBcImFwcGxpY2F0aW9uL3ZuZC5vcGVueG1sZm9ybWF0cy1vZmZpY2Vkb2N1bWVudC5zcHJlYWRzaGVldG1sLnNoZWV0Lm1haW4reG1sXCIsXG5cdFx0XHR4bHNtOiBcImFwcGxpY2F0aW9uL3ZuZC5tcy1leGNlbC5zaGVldC5tYWNyb0VuYWJsZWQubWFpbit4bWxcIixcblx0XHRcdHhsc2I6IFwiYXBwbGljYXRpb24vdm5kLm1zLWV4Y2VsLnNoZWV0LmJpbmFyeS5tYWNyb0VuYWJsZWQubWFpblwiLFxuXHRcdFx0eGxhbTogXCJhcHBsaWNhdGlvbi92bmQubXMtZXhjZWwuYWRkaW4ubWFjcm9FbmFibGVkLm1haW4reG1sXCIsXG5cdFx0XHR4bHR4OiBcImFwcGxpY2F0aW9uL3ZuZC5vcGVueG1sZm9ybWF0cy1vZmZpY2Vkb2N1bWVudC5zcHJlYWRzaGVldG1sLnRlbXBsYXRlLm1haW4reG1sXCJcblx0XHR9LFxuXHRcdHN0cnM6IHsgLyogU2hhcmVkIFN0cmluZ3MgKi9cblx0XHRcdHhsc3g6IFwiYXBwbGljYXRpb24vdm5kLm9wZW54bWxmb3JtYXRzLW9mZmljZWRvY3VtZW50LnNwcmVhZHNoZWV0bWwuc2hhcmVkU3RyaW5ncyt4bWxcIixcblx0XHRcdHhsc2I6IFwiYXBwbGljYXRpb24vdm5kLm1zLWV4Y2VsLnNoYXJlZFN0cmluZ3NcIlxuXHRcdH0sXG5cdFx0Y29tbWVudHM6IHsgLyogQ29tbWVudHMgKi9cblx0XHRcdHhsc3g6IFwiYXBwbGljYXRpb24vdm5kLm9wZW54bWxmb3JtYXRzLW9mZmljZWRvY3VtZW50LnNwcmVhZHNoZWV0bWwuY29tbWVudHMreG1sXCIsXG5cdFx0XHR4bHNiOiBcImFwcGxpY2F0aW9uL3ZuZC5tcy1leGNlbC5jb21tZW50c1wiXG5cdFx0fSxcblx0XHRzaGVldHM6IHsgLyogV29ya3NoZWV0ICovXG5cdFx0XHR4bHN4OiBcImFwcGxpY2F0aW9uL3ZuZC5vcGVueG1sZm9ybWF0cy1vZmZpY2Vkb2N1bWVudC5zcHJlYWRzaGVldG1sLndvcmtzaGVldCt4bWxcIixcblx0XHRcdHhsc2I6IFwiYXBwbGljYXRpb24vdm5kLm1zLWV4Y2VsLndvcmtzaGVldFwiXG5cdFx0fSxcblx0XHRjaGFydHM6IHsgLyogQ2hhcnRzaGVldCAqL1xuXHRcdFx0eGxzeDogXCJhcHBsaWNhdGlvbi92bmQub3BlbnhtbGZvcm1hdHMtb2ZmaWNlZG9jdW1lbnQuc3ByZWFkc2hlZXRtbC5jaGFydHNoZWV0K3htbFwiLFxuXHRcdFx0eGxzYjogXCJhcHBsaWNhdGlvbi92bmQubXMtZXhjZWwuY2hhcnRzaGVldFwiXG5cdFx0fSxcblx0XHRkaWFsb2dzOiB7IC8qIERpYWxvZ3NoZWV0ICovXG5cdFx0XHR4bHN4OiBcImFwcGxpY2F0aW9uL3ZuZC5vcGVueG1sZm9ybWF0cy1vZmZpY2Vkb2N1bWVudC5zcHJlYWRzaGVldG1sLmRpYWxvZ3NoZWV0K3htbFwiLFxuXHRcdFx0eGxzYjogXCJhcHBsaWNhdGlvbi92bmQubXMtZXhjZWwuZGlhbG9nc2hlZXRcIlxuXHRcdH0sXG5cdFx0bWFjcm9zOiB7IC8qIE1hY3Jvc2hlZXQgKEV4Y2VsIDQuMCBNYWNyb3MpICovXG5cdFx0XHR4bHN4OiBcImFwcGxpY2F0aW9uL3ZuZC5tcy1leGNlbC5tYWNyb3NoZWV0K3htbFwiLFxuXHRcdFx0eGxzYjogXCJhcHBsaWNhdGlvbi92bmQubXMtZXhjZWwubWFjcm9zaGVldFwiXG5cdFx0fSxcblx0XHRzdHlsZXM6IHsgLyogU3R5bGVzICovXG5cdFx0XHR4bHN4OiBcImFwcGxpY2F0aW9uL3ZuZC5vcGVueG1sZm9ybWF0cy1vZmZpY2Vkb2N1bWVudC5zcHJlYWRzaGVldG1sLnN0eWxlcyt4bWxcIixcblx0XHRcdHhsc2I6IFwiYXBwbGljYXRpb24vdm5kLm1zLWV4Y2VsLnN0eWxlc1wiXG5cdFx0fVxuXHR9O1xuXHRrZXlzKG8pLmZvckVhY2goZnVuY3Rpb24oaykgeyBbXCJ4bHNtXCIsIFwieGxhbVwiXS5mb3JFYWNoKGZ1bmN0aW9uKHYpIHsgaWYoIW9ba11bdl0pIG9ba11bdl0gPSBvW2tdLnhsc3g7IH0pOyB9KTtcblx0a2V5cyhvKS5mb3JFYWNoKGZ1bmN0aW9uKGspeyBrZXlzKG9ba10pLmZvckVhY2goZnVuY3Rpb24odikgeyBjdDJ0eXBlW29ba11bdl1dID0gazsgfSk7IH0pO1xuXHRyZXR1cm4gbztcbn0pKCk7XG5cbnZhciB0eXBlMmN0Lyp7W3N0cmluZ106QXJyYXk8c3RyaW5nPn0qLyA9IGV2ZXJ0X2FycihjdDJ0eXBlKTtcblxuWE1MTlMuQ1QgPSAnaHR0cDovL3NjaGVtYXMub3BlbnhtbGZvcm1hdHMub3JnL3BhY2thZ2UvMjAwNi9jb250ZW50LXR5cGVzJztcblxuZnVuY3Rpb24gbmV3X2N0KCkge1xuXHRyZXR1cm4gKHtcblx0XHR3b3JrYm9va3M6W10sIHNoZWV0czpbXSwgY2hhcnRzOltdLCBkaWFsb2dzOltdLCBtYWNyb3M6W10sXG5cdFx0cmVsczpbXSwgc3RyczpbXSwgY29tbWVudHM6W10sIGxpbmtzOltdLFxuXHRcdGNvcmVwcm9wczpbXSwgZXh0cHJvcHM6W10sIGN1c3Rwcm9wczpbXSwgdGhlbWVzOltdLCBzdHlsZXM6W10sXG5cdFx0Y2FsY2NoYWluczpbXSwgdmJhOiBbXSwgZHJhd2luZ3M6IFtdLFxuXHRcdFRPRE86W10sIHhtbG5zOiBcIlwiIH0pO1xufVxuXG5mdW5jdGlvbiBwYXJzZV9jdChkYXRhKSB7XG5cdHZhciBjdCA9IG5ld19jdCgpO1xuXHRpZighZGF0YSB8fCAhZGF0YS5tYXRjaCkgcmV0dXJuIGN0O1xuXHR2YXIgY3RleHQgPSB7fTtcblx0KGRhdGEubWF0Y2godGFncmVnZXgpfHxbXSkuZm9yRWFjaChmdW5jdGlvbih4KSB7XG5cdFx0dmFyIHkgPSBwYXJzZXhtbHRhZyh4KTtcblx0XHRzd2l0Y2goeVswXS5yZXBsYWNlKG5zcmVnZXgsXCI8XCIpKSB7XG5cdFx0XHRjYXNlICc8P3htbCc6IGJyZWFrO1xuXHRcdFx0Y2FzZSAnPFR5cGVzJzogY3QueG1sbnMgPSB5Wyd4bWxucycgKyAoeVswXS5tYXRjaCgvPChcXHcrKTovKXx8W1wiXCIsXCJcIl0pWzFdIF07IGJyZWFrO1xuXHRcdFx0Y2FzZSAnPERlZmF1bHQnOiBjdGV4dFt5LkV4dGVuc2lvbl0gPSB5LkNvbnRlbnRUeXBlOyBicmVhaztcblx0XHRcdGNhc2UgJzxPdmVycmlkZSc6XG5cdFx0XHRcdGlmKGN0W2N0MnR5cGVbeS5Db250ZW50VHlwZV1dICE9PSB1bmRlZmluZWQpIGN0W2N0MnR5cGVbeS5Db250ZW50VHlwZV1dLnB1c2goeS5QYXJ0TmFtZSk7XG5cdFx0XHRcdGJyZWFrO1xuXHRcdH1cblx0fSk7XG5cdGlmKGN0LnhtbG5zICE9PSBYTUxOUy5DVCkgdGhyb3cgbmV3IEVycm9yKFwiVW5rbm93biBOYW1lc3BhY2U6IFwiICsgY3QueG1sbnMpO1xuXHRjdC5jYWxjY2hhaW4gPSBjdC5jYWxjY2hhaW5zLmxlbmd0aCA+IDAgPyBjdC5jYWxjY2hhaW5zWzBdIDogXCJcIjtcblx0Y3Quc3N0ID0gY3Quc3Rycy5sZW5ndGggPiAwID8gY3Quc3Ryc1swXSA6IFwiXCI7XG5cdGN0LnN0eWxlID0gY3Quc3R5bGVzLmxlbmd0aCA+IDAgPyBjdC5zdHlsZXNbMF0gOiBcIlwiO1xuXHRjdC5kZWZhdWx0cyA9IGN0ZXh0O1xuXHRkZWxldGUgY3QuY2FsY2NoYWlucztcblx0cmV0dXJuIGN0O1xufVxuXG52YXIgQ1RZUEVfWE1MX1JPT1QgPSB3cml0ZXh0YWcoJ1R5cGVzJywgbnVsbCwge1xuXHQneG1sbnMnOiBYTUxOUy5DVCxcblx0J3htbG5zOnhzZCc6IFhNTE5TLnhzZCxcblx0J3htbG5zOnhzaSc6IFhNTE5TLnhzaVxufSk7XG5cbnZhciBDVFlQRV9ERUZBVUxUUyA9IFtcblx0Wyd4bWwnLCAnYXBwbGljYXRpb24veG1sJ10sXG5cdFsnYmluJywgJ2FwcGxpY2F0aW9uL3ZuZC5tcy1leGNlbC5zaGVldC5iaW5hcnkubWFjcm9FbmFibGVkLm1haW4nXSxcblx0Wyd2bWwnLCAnYXBwbGljYXRpb24vdm5kLm9wZW54bWxmb3JtYXRzLW9mZmljZWRvY3VtZW50LnZtbERyYXdpbmcnXSxcblx0WydkYXRhJywgJ2FwcGxpY2F0aW9uL3ZuZC5vcGVueG1sZm9ybWF0cy1vZmZpY2Vkb2N1bWVudC5tb2RlbCtkYXRhJ10sXG5cdC8qIGZyb20gdGVzdCBmaWxlcyAqL1xuXHRbJ2JtcCcsICdpbWFnZS9ibXAnXSxcblx0WydwbmcnLCAnaW1hZ2UvcG5nJ10sXG5cdFsnZ2lmJywgJ2ltYWdlL2dpZiddLFxuXHRbJ2VtZicsICdpbWFnZS94LWVtZiddLFxuXHRbJ3dtZicsICdpbWFnZS94LXdtZiddLFxuXHRbJ2pwZycsICdpbWFnZS9qcGVnJ10sIFsnanBlZycsICdpbWFnZS9qcGVnJ10sXG5cdFsndGlmJywgJ2ltYWdlL3RpZmYnXSwgWyd0aWZmJywgJ2ltYWdlL3RpZmYnXSxcblx0WydwZGYnLCAnYXBwbGljYXRpb24vcGRmJ10sXG5cdFsncmVscycsIHR5cGUyY3QucmVsc1swXV1cbl0ubWFwKGZ1bmN0aW9uKHgpIHtcblx0cmV0dXJuIHdyaXRleHRhZygnRGVmYXVsdCcsIG51bGwsIHsnRXh0ZW5zaW9uJzp4WzBdLCAnQ29udGVudFR5cGUnOiB4WzFdfSk7XG59KTtcblxuZnVuY3Rpb24gd3JpdGVfY3QoY3QsIG9wdHMpIHtcblx0dmFyIG8gPSBbXSwgdjtcblx0b1tvLmxlbmd0aF0gPSAoWE1MX0hFQURFUik7XG5cdG9bby5sZW5ndGhdID0gKENUWVBFX1hNTF9ST09UKTtcblx0byA9IG8uY29uY2F0KENUWVBFX0RFRkFVTFRTKTtcblxuXHQvKiBvbmx5IHdyaXRlIGZpcnN0IGluc3RhbmNlICovXG5cdHZhciBmMSA9IGZ1bmN0aW9uKHcpIHtcblx0XHRpZihjdFt3XSAmJiBjdFt3XS5sZW5ndGggPiAwKSB7XG5cdFx0XHR2ID0gY3Rbd11bMF07XG5cdFx0XHRvW28ubGVuZ3RoXSA9ICh3cml0ZXh0YWcoJ092ZXJyaWRlJywgbnVsbCwge1xuXHRcdFx0XHQnUGFydE5hbWUnOiAodlswXSA9PSAnLycgPyBcIlwiOlwiL1wiKSArIHYsXG5cdFx0XHRcdCdDb250ZW50VHlwZSc6IENUX0xJU1Rbd11bb3B0cy5ib29rVHlwZSB8fCAneGxzeCddXG5cdFx0XHR9KSk7XG5cdFx0fVxuXHR9O1xuXG5cdC8qIGJvb2sgdHlwZS1zcGVjaWZpYyAqL1xuXHR2YXIgZjIgPSBmdW5jdGlvbih3KSB7XG5cdFx0KGN0W3ddfHxbXSkuZm9yRWFjaChmdW5jdGlvbih2KSB7XG5cdFx0XHRvW28ubGVuZ3RoXSA9ICh3cml0ZXh0YWcoJ092ZXJyaWRlJywgbnVsbCwge1xuXHRcdFx0XHQnUGFydE5hbWUnOiAodlswXSA9PSAnLycgPyBcIlwiOlwiL1wiKSArIHYsXG5cdFx0XHRcdCdDb250ZW50VHlwZSc6IENUX0xJU1Rbd11bb3B0cy5ib29rVHlwZSB8fCAneGxzeCddXG5cdFx0XHR9KSk7XG5cdFx0fSk7XG5cdH07XG5cblx0Lyogc3RhbmRhcmQgdHlwZSAqL1xuXHR2YXIgZjMgPSBmdW5jdGlvbih0KSB7XG5cdFx0KGN0W3RdfHxbXSkuZm9yRWFjaChmdW5jdGlvbih2KSB7XG5cdFx0XHRvW28ubGVuZ3RoXSA9ICh3cml0ZXh0YWcoJ092ZXJyaWRlJywgbnVsbCwge1xuXHRcdFx0XHQnUGFydE5hbWUnOiAodlswXSA9PSAnLycgPyBcIlwiOlwiL1wiKSArIHYsXG5cdFx0XHRcdCdDb250ZW50VHlwZSc6IHR5cGUyY3RbdF1bMF1cblx0XHRcdH0pKTtcblx0XHR9KTtcblx0fTtcblxuXHRmMSgnd29ya2Jvb2tzJyk7XG5cdGYyKCdzaGVldHMnKTtcblx0ZjIoJ2NoYXJ0cycpO1xuXHRmMygndGhlbWVzJyk7XG5cdFsnc3RycycsICdzdHlsZXMnXS5mb3JFYWNoKGYxKTtcblx0Wydjb3JlcHJvcHMnLCAnZXh0cHJvcHMnLCAnY3VzdHByb3BzJ10uZm9yRWFjaChmMyk7XG5cdGYzKCd2YmEnKTtcblx0ZjMoJ2NvbW1lbnRzJyk7XG5cdGYzKCdkcmF3aW5ncycpO1xuXHRpZihvLmxlbmd0aD4yKXsgb1tvLmxlbmd0aF0gPSAoJzwvVHlwZXM+Jyk7IG9bMV09b1sxXS5yZXBsYWNlKFwiLz5cIixcIj5cIik7IH1cblx0cmV0dXJuIG8uam9pbihcIlwiKTtcbn1cbi8qIDkuMyBSZWxhdGlvbnNoaXBzICovXG52YXIgUkVMUyA9ICh7XG5cdFdCOiBcImh0dHA6Ly9zY2hlbWFzLm9wZW54bWxmb3JtYXRzLm9yZy9vZmZpY2VEb2N1bWVudC8yMDA2L3JlbGF0aW9uc2hpcHMvb2ZmaWNlRG9jdW1lbnRcIixcblx0U0hFRVQ6IFwiaHR0cDovL3NoZWV0anMub3BlbnhtbGZvcm1hdHMub3JnL29mZmljZURvY3VtZW50LzIwMDYvcmVsYXRpb25zaGlwcy9vZmZpY2VEb2N1bWVudFwiLFxuXHRITElOSzogXCJodHRwOi8vc2NoZW1hcy5vcGVueG1sZm9ybWF0cy5vcmcvb2ZmaWNlRG9jdW1lbnQvMjAwNi9yZWxhdGlvbnNoaXBzL2h5cGVybGlua1wiLFxuXHRWTUw6IFwiaHR0cDovL3NjaGVtYXMub3BlbnhtbGZvcm1hdHMub3JnL29mZmljZURvY3VtZW50LzIwMDYvcmVsYXRpb25zaGlwcy92bWxEcmF3aW5nXCIsXG5cdFhQQVRIOiBcImh0dHA6Ly9zY2hlbWFzLm9wZW54bWxmb3JtYXRzLm9yZy9vZmZpY2VEb2N1bWVudC8yMDA2L3JlbGF0aW9uc2hpcHMvZXh0ZXJuYWxMaW5rUGF0aFwiLFxuXHRYTUlTUzogXCJodHRwOi8vc2NoZW1hcy5taWNyb3NvZnQuY29tL29mZmljZS8yMDA2L3JlbGF0aW9uc2hpcHMveGxFeHRlcm5hbExpbmtQYXRoL3hsUGF0aE1pc3NpbmdcIixcblx0WExJTks6IFwiaHR0cDovL3NjaGVtYXMub3BlbnhtbGZvcm1hdHMub3JnL29mZmljZURvY3VtZW50LzIwMDYvcmVsYXRpb25zaGlwcy9leHRlcm5hbExpbmtcIixcblx0Q1hNTDogXCJodHRwOi8vc2NoZW1hcy5vcGVueG1sZm9ybWF0cy5vcmcvb2ZmaWNlRG9jdW1lbnQvMjAwNi9yZWxhdGlvbnNoaXBzL2N1c3RvbVhtbFwiLFxuXHRDWE1MUDogXCJodHRwOi8vc2NoZW1hcy5vcGVueG1sZm9ybWF0cy5vcmcvb2ZmaWNlRG9jdW1lbnQvMjAwNi9yZWxhdGlvbnNoaXBzL2N1c3RvbVhtbFByb3BzXCIsXG5cdFZCQTogXCJodHRwOi8vc2NoZW1hcy5taWNyb3NvZnQuY29tL29mZmljZS8yMDA2L3JlbGF0aW9uc2hpcHMvdmJhUHJvamVjdFwiXG59KTtcblxuLyogOS4zLjMgUmVwcmVzZW50aW5nIFJlbGF0aW9uc2hpcHMgKi9cbmZ1bmN0aW9uIGdldF9yZWxzX3BhdGgoZmlsZSkge1xuXHR2YXIgbiA9IGZpbGUubGFzdEluZGV4T2YoXCIvXCIpO1xuXHRyZXR1cm4gZmlsZS5zbGljZSgwLG4rMSkgKyAnX3JlbHMvJyArIGZpbGUuc2xpY2UobisxKSArIFwiLnJlbHNcIjtcbn1cblxuZnVuY3Rpb24gcGFyc2VfcmVscyhkYXRhLCBjdXJyZW50RmlsZVBhdGgpIHtcblx0dmFyIHJlbHMgPSB7XCIhaWRcIjp7fX07XG5cdGlmICghZGF0YSkgcmV0dXJuIHJlbHM7XG5cdGlmIChjdXJyZW50RmlsZVBhdGguY2hhckF0KDApICE9PSAnLycpIHtcblx0XHRjdXJyZW50RmlsZVBhdGggPSAnLycrY3VycmVudEZpbGVQYXRoO1xuXHR9XG5cdHZhciBoYXNoID0ge307XG5cblx0KGRhdGEubWF0Y2godGFncmVnZXgpfHxbXSkuZm9yRWFjaChmdW5jdGlvbih4KSB7XG5cdFx0dmFyIHkgPSBwYXJzZXhtbHRhZyh4KTtcblx0XHQvKiA5LjMuMi4yIE9QQ19SZWxhdGlvbnNoaXBzICovXG5cdFx0aWYgKHlbMF0gPT09ICc8UmVsYXRpb25zaGlwJykge1xuXHRcdFx0dmFyIHJlbCA9IHt9OyByZWwuVHlwZSA9IHkuVHlwZTsgcmVsLlRhcmdldCA9IHkuVGFyZ2V0OyByZWwuSWQgPSB5LklkOyByZWwuVGFyZ2V0TW9kZSA9IHkuVGFyZ2V0TW9kZTtcblx0XHRcdHZhciBjYW5vbmljdGFyZ2V0ID0geS5UYXJnZXRNb2RlID09PSAnRXh0ZXJuYWwnID8geS5UYXJnZXQgOiByZXNvbHZlX3BhdGgoeS5UYXJnZXQsIGN1cnJlbnRGaWxlUGF0aCk7XG5cdFx0XHRyZWxzW2Nhbm9uaWN0YXJnZXRdID0gcmVsO1xuXHRcdFx0aGFzaFt5LklkXSA9IHJlbDtcblx0XHR9XG5cdH0pO1xuXHRyZWxzW1wiIWlkXCJdID0gaGFzaDtcblx0cmV0dXJuIHJlbHM7XG59XG5cblhNTE5TLlJFTFMgPSAnaHR0cDovL3NjaGVtYXMub3BlbnhtbGZvcm1hdHMub3JnL3BhY2thZ2UvMjAwNi9yZWxhdGlvbnNoaXBzJztcblxudmFyIFJFTFNfUk9PVCA9IHdyaXRleHRhZygnUmVsYXRpb25zaGlwcycsIG51bGwsIHtcblx0Ly8neG1sbnM6bnMwJzogWE1MTlMuUkVMUyxcblx0J3htbG5zJzogWE1MTlMuUkVMU1xufSk7XG5cbi8qIFRPRE8gKi9cbmZ1bmN0aW9uIHdyaXRlX3JlbHMocmVscykge1xuXHR2YXIgbyA9IFtYTUxfSEVBREVSLCBSRUxTX1JPT1RdO1xuXHRrZXlzKHJlbHNbJyFpZCddKS5mb3JFYWNoKGZ1bmN0aW9uKHJpZCkge1xuXHRcdG9bby5sZW5ndGhdID0gKHdyaXRleHRhZygnUmVsYXRpb25zaGlwJywgbnVsbCwgcmVsc1snIWlkJ11bcmlkXSkpO1xuXHR9KTtcblx0aWYoby5sZW5ndGg+Mil7IG9bby5sZW5ndGhdID0gKCc8L1JlbGF0aW9uc2hpcHM+Jyk7IG9bMV09b1sxXS5yZXBsYWNlKFwiLz5cIixcIj5cIik7IH1cblx0cmV0dXJuIG8uam9pbihcIlwiKTtcbn1cblxudmFyIFJFTFNfRVhURVJOID0gW1JFTFMuSExJTkssIFJFTFMuWFBBVEgsIFJFTFMuWE1JU1NdO1xuZnVuY3Rpb24gYWRkX3JlbHMocmVscywgcklkLCBmLCB0eXBlLCByZWxvYmosIHRhcmdldG1vZGUpIHtcblx0aWYoIXJlbG9iaikgcmVsb2JqID0ge307XG5cdGlmKCFyZWxzWychaWQnXSkgcmVsc1snIWlkJ10gPSB7fTtcblx0aWYocklkIDwgMCkgZm9yKHJJZCA9IDE7IHJlbHNbJyFpZCddWydySWQnICsgcklkXTsgKytySWQpey8qIGVtcHR5ICovfVxuXHRyZWxvYmouSWQgPSAncklkJyArIHJJZDtcblx0cmVsb2JqLlR5cGUgPSB0eXBlO1xuXHRyZWxvYmouVGFyZ2V0ID0gZjtcblx0aWYodGFyZ2V0bW9kZSkgcmVsb2JqLlRhcmdldE1vZGUgPSB0YXJnZXRtb2RlO1xuXHRlbHNlIGlmKFJFTFNfRVhURVJOLmluZGV4T2YocmVsb2JqLlR5cGUpID4gLTEpIHJlbG9iai5UYXJnZXRNb2RlID0gXCJFeHRlcm5hbFwiO1xuXHRpZihyZWxzWychaWQnXVtyZWxvYmouSWRdKSB0aHJvdyBuZXcgRXJyb3IoXCJDYW5ub3QgcmV3cml0ZSBySWQgXCIgKyBySWQpO1xuXHRyZWxzWychaWQnXVtyZWxvYmouSWRdID0gcmVsb2JqO1xuXHRyZWxzWygnLycgKyByZWxvYmouVGFyZ2V0KS5yZXBsYWNlKFwiLy9cIixcIi9cIildID0gcmVsb2JqO1xuXHRyZXR1cm4gcklkO1xufVxuLyogT3BlbiBEb2N1bWVudCBGb3JtYXQgZm9yIE9mZmljZSBBcHBsaWNhdGlvbnMgKE9wZW5Eb2N1bWVudCkgVmVyc2lvbiAxLjIgKi9cbi8qIFBhcnQgMyBTZWN0aW9uIDQgTWFuaWZlc3QgRmlsZSAqL1xudmFyIENUX09EUyA9IFwiYXBwbGljYXRpb24vdm5kLm9hc2lzLm9wZW5kb2N1bWVudC5zcHJlYWRzaGVldFwiO1xuZnVuY3Rpb24gcGFyc2VfbWFuaWZlc3QoZCwgb3B0cykge1xuXHR2YXIgc3RyID0geGxtbF9ub3JtYWxpemUoZCk7XG5cdHZhciBSbjtcblx0dmFyIEZFdGFnO1xuXHR3aGlsZSgoUm4gPSB4bG1scmVnZXguZXhlYyhzdHIpKSkgc3dpdGNoKFJuWzNdKSB7XG5cdFx0Y2FzZSAnbWFuaWZlc3QnOiBicmVhazsgLy8gNC4yIDxtYW5pZmVzdDptYW5pZmVzdD5cblx0XHRjYXNlICdmaWxlLWVudHJ5JzogLy8gNC4zIDxtYW5pZmVzdDpmaWxlLWVudHJ5PlxuXHRcdFx0RkV0YWcgPSBwYXJzZXhtbHRhZyhSblswXSwgZmFsc2UpO1xuXHRcdFx0aWYoRkV0YWcucGF0aCA9PSAnLycgJiYgRkV0YWcudHlwZSAhPT0gQ1RfT0RTKSB0aHJvdyBuZXcgRXJyb3IoXCJUaGlzIE9wZW5Eb2N1bWVudCBpcyBub3QgYSBzcHJlYWRzaGVldFwiKTtcblx0XHRcdGJyZWFrO1xuXHRcdGNhc2UgJ2VuY3J5cHRpb24tZGF0YSc6IC8vIDQuNCA8bWFuaWZlc3Q6ZW5jcnlwdGlvbi1kYXRhPlxuXHRcdGNhc2UgJ2FsZ29yaXRobSc6IC8vIDQuNSA8bWFuaWZlc3Q6YWxnb3JpdGhtPlxuXHRcdGNhc2UgJ3N0YXJ0LWtleS1nZW5lcmF0aW9uJzogLy8gNC42IDxtYW5pZmVzdDpzdGFydC1rZXktZ2VuZXJhdGlvbj5cblx0XHRjYXNlICdrZXktZGVyaXZhdGlvbic6IC8vIDQuNyA8bWFuaWZlc3Q6a2V5LWRlcml2YXRpb24+XG5cdFx0XHR0aHJvdyBuZXcgRXJyb3IoXCJVbnN1cHBvcnRlZCBPRFMgRW5jcnlwdGlvblwiKTtcblx0XHRkZWZhdWx0OiBpZihvcHRzICYmIG9wdHMuV1RGKSB0aHJvdyBSbjtcblx0fVxufVxuXG5mdW5jdGlvbiB3cml0ZV9tYW5pZmVzdChtYW5pZmVzdCkge1xuXHR2YXIgbyA9IFtYTUxfSEVBREVSXTtcblx0by5wdXNoKCc8bWFuaWZlc3Q6bWFuaWZlc3QgeG1sbnM6bWFuaWZlc3Q9XCJ1cm46b2FzaXM6bmFtZXM6dGM6b3BlbmRvY3VtZW50OnhtbG5zOm1hbmlmZXN0OjEuMFwiIG1hbmlmZXN0OnZlcnNpb249XCIxLjJcIj5cXG4nKTtcblx0by5wdXNoKCcgIDxtYW5pZmVzdDpmaWxlLWVudHJ5IG1hbmlmZXN0OmZ1bGwtcGF0aD1cIi9cIiBtYW5pZmVzdDp2ZXJzaW9uPVwiMS4yXCIgbWFuaWZlc3Q6bWVkaWEtdHlwZT1cImFwcGxpY2F0aW9uL3ZuZC5vYXNpcy5vcGVuZG9jdW1lbnQuc3ByZWFkc2hlZXRcIi8+XFxuJyk7XG5cdGZvcih2YXIgaSA9IDA7IGkgPCBtYW5pZmVzdC5sZW5ndGg7ICsraSkgby5wdXNoKCcgIDxtYW5pZmVzdDpmaWxlLWVudHJ5IG1hbmlmZXN0OmZ1bGwtcGF0aD1cIicgKyBtYW5pZmVzdFtpXVswXSArICdcIiBtYW5pZmVzdDptZWRpYS10eXBlPVwiJyArIG1hbmlmZXN0W2ldWzFdICsgJ1wiLz5cXG4nKTtcblx0by5wdXNoKCc8L21hbmlmZXN0Om1hbmlmZXN0PicpO1xuXHRyZXR1cm4gby5qb2luKFwiXCIpO1xufVxuXG4vKiBQYXJ0IDMgU2VjdGlvbiA2IE1ldGFkYXRhIE1hbmlmZXN0IEZpbGUgKi9cbmZ1bmN0aW9uIHdyaXRlX3JkZl90eXBlKGZpbGUsIHJlcywgdGFnKSB7XG5cdHJldHVybiBbXG5cdFx0JyAgPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9XCInICsgZmlsZSArICdcIj5cXG4nLFxuXHRcdCcgICAgPHJkZjp0eXBlIHJkZjpyZXNvdXJjZT1cImh0dHA6Ly9kb2NzLm9hc2lzLW9wZW4ub3JnL25zL29mZmljZS8xLjIvbWV0YS8nICsgKHRhZyB8fCBcIm9kZlwiKSArICcjJyArIHJlcyArICdcIi8+XFxuJyxcblx0XHQnICA8L3JkZjpEZXNjcmlwdGlvbj5cXG4nXG5cdF0uam9pbihcIlwiKTtcbn1cbmZ1bmN0aW9uIHdyaXRlX3JkZl9oYXMoYmFzZSwgZmlsZSkge1xuXHRyZXR1cm4gW1xuXHRcdCcgIDxyZGY6RGVzY3JpcHRpb24gcmRmOmFib3V0PVwiJyArIGJhc2UgKyAnXCI+XFxuJyxcblx0XHQnICAgIDxuczA6aGFzUGFydCB4bWxuczpuczA9XCJodHRwOi8vZG9jcy5vYXNpcy1vcGVuLm9yZy9ucy9vZmZpY2UvMS4yL21ldGEvcGtnI1wiIHJkZjpyZXNvdXJjZT1cIicgKyBmaWxlICsgJ1wiLz5cXG4nLFxuXHRcdCcgIDwvcmRmOkRlc2NyaXB0aW9uPlxcbidcblx0XS5qb2luKFwiXCIpO1xufVxuZnVuY3Rpb24gd3JpdGVfcmRmKHJkZikge1xuXHR2YXIgbyA9IFtYTUxfSEVBREVSXTtcblx0by5wdXNoKCc8cmRmOlJERiB4bWxuczpyZGY9XCJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjXCI+XFxuJyk7XG5cdGZvcih2YXIgaSA9IDA7IGkgIT0gcmRmLmxlbmd0aDsgKytpKSB7XG5cdFx0by5wdXNoKHdyaXRlX3JkZl90eXBlKHJkZltpXVswXSwgcmRmW2ldWzFdKSk7XG5cdFx0by5wdXNoKHdyaXRlX3JkZl9oYXMoXCJcIixyZGZbaV1bMF0pKTtcblx0fVxuXHRvLnB1c2god3JpdGVfcmRmX3R5cGUoXCJcIixcIkRvY3VtZW50XCIsIFwicGtnXCIpKTtcblx0by5wdXNoKCc8L3JkZjpSREY+Jyk7XG5cdHJldHVybiBvLmpvaW4oXCJcIik7XG59XG4vKiBUT0RPOiBwdWxsIHByb3BlcnRpZXMgKi9cbnZhciB3cml0ZV9tZXRhX29kcyA9IChmdW5jdGlvbigpIHtcblx0dmFyIHBheWxvYWQgPSAnPD94bWwgdmVyc2lvbj1cIjEuMFwiIGVuY29kaW5nPVwiVVRGLThcIiBzdGFuZGFsb25lPVwieWVzXCI/PjxvZmZpY2U6ZG9jdW1lbnQtbWV0YSB4bWxuczpvZmZpY2U9XCJ1cm46b2FzaXM6bmFtZXM6dGM6b3BlbmRvY3VtZW50OnhtbG5zOm9mZmljZToxLjBcIiB4bWxuczptZXRhPVwidXJuOm9hc2lzOm5hbWVzOnRjOm9wZW5kb2N1bWVudDp4bWxuczptZXRhOjEuMFwiIHhtbG5zOmRjPVwiaHR0cDovL3B1cmwub3JnL2RjL2VsZW1lbnRzLzEuMS9cIiB4bWxuczp4bGluaz1cImh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmtcIiBvZmZpY2U6dmVyc2lvbj1cIjEuMlwiPjxvZmZpY2U6bWV0YT48bWV0YTpnZW5lcmF0b3I+U2hlZXQnICsgJ0pTICcgKyBYTFNYLnZlcnNpb24gKyAnPC9tZXRhOmdlbmVyYXRvcj48L29mZmljZTptZXRhPjwvb2ZmaWNlOmRvY3VtZW50LW1ldGE+Jztcblx0cmV0dXJuIGZ1bmN0aW9uIHdtbygpIHtcblx0XHRyZXR1cm4gcGF5bG9hZDtcblx0fTtcbn0pKCk7XG5cbi8qIEVDTUEtMzc2IFBhcnQgSUkgMTEuMSBDb3JlIFByb3BlcnRpZXMgUGFydCAqL1xuLyogW01TLU9TSEFSRURdIDIuMy4zLjIuWzEtMl0uMSAoUElEU0kvUElERFNJKSAqL1xudmFyIENPUkVfUFJPUFMgPSBbXG5cdFtcImNwOmNhdGVnb3J5XCIsIFwiQ2F0ZWdvcnlcIl0sXG5cdFtcImNwOmNvbnRlbnRTdGF0dXNcIiwgXCJDb250ZW50U3RhdHVzXCJdLFxuXHRbXCJjcDprZXl3b3Jkc1wiLCBcIktleXdvcmRzXCJdLFxuXHRbXCJjcDpsYXN0TW9kaWZpZWRCeVwiLCBcIkxhc3RBdXRob3JcIl0sXG5cdFtcImNwOmxhc3RQcmludGVkXCIsIFwiTGFzdFByaW50ZWRcIl0sXG5cdFtcImNwOnJldmlzaW9uXCIsIFwiUmV2TnVtYmVyXCJdLFxuXHRbXCJjcDp2ZXJzaW9uXCIsIFwiVmVyc2lvblwiXSxcblx0W1wiZGM6Y3JlYXRvclwiLCBcIkF1dGhvclwiXSxcblx0W1wiZGM6ZGVzY3JpcHRpb25cIiwgXCJDb21tZW50c1wiXSxcblx0W1wiZGM6aWRlbnRpZmllclwiLCBcIklkZW50aWZpZXJcIl0sXG5cdFtcImRjOmxhbmd1YWdlXCIsIFwiTGFuZ3VhZ2VcIl0sXG5cdFtcImRjOnN1YmplY3RcIiwgXCJTdWJqZWN0XCJdLFxuXHRbXCJkYzp0aXRsZVwiLCBcIlRpdGxlXCJdLFxuXHRbXCJkY3Rlcm1zOmNyZWF0ZWRcIiwgXCJDcmVhdGVkRGF0ZVwiLCAnZGF0ZSddLFxuXHRbXCJkY3Rlcm1zOm1vZGlmaWVkXCIsIFwiTW9kaWZpZWREYXRlXCIsICdkYXRlJ11cbl07XG5cblhNTE5TLkNPUkVfUFJPUFMgPSBcImh0dHA6Ly9zY2hlbWFzLm9wZW54bWxmb3JtYXRzLm9yZy9wYWNrYWdlLzIwMDYvbWV0YWRhdGEvY29yZS1wcm9wZXJ0aWVzXCI7XG5SRUxTLkNPUkVfUFJPUFMgID0gJ2h0dHA6Ly9zY2hlbWFzLm9wZW54bWxmb3JtYXRzLm9yZy9wYWNrYWdlLzIwMDYvcmVsYXRpb25zaGlwcy9tZXRhZGF0YS9jb3JlLXByb3BlcnRpZXMnO1xuXG52YXIgQ09SRV9QUk9QU19SRUdFWCA9IChmdW5jdGlvbigpIHtcblx0dmFyIHIgPSBuZXcgQXJyYXkoQ09SRV9QUk9QUy5sZW5ndGgpO1xuXHRmb3IodmFyIGkgPSAwOyBpIDwgQ09SRV9QUk9QUy5sZW5ndGg7ICsraSkge1xuXHRcdHZhciBmID0gQ09SRV9QUk9QU1tpXTtcblx0XHR2YXIgZyA9IFwiKD86XCIrIGZbMF0uc2xpY2UoMCxmWzBdLmluZGV4T2YoXCI6XCIpKSArXCI6KVwiKyBmWzBdLnNsaWNlKGZbMF0uaW5kZXhPZihcIjpcIikrMSk7XG5cdFx0cltpXSA9IG5ldyBSZWdFeHAoXCI8XCIgKyBnICsgXCJbXj5dKj4oW1xcXFxzXFxcXFNdKj8pPFxcL1wiICsgZyArIFwiPlwiKTtcblx0fVxuXHRyZXR1cm4gcjtcbn0pKCk7XG5cbmZ1bmN0aW9uIHBhcnNlX2NvcmVfcHJvcHMoZGF0YSkge1xuXHR2YXIgcCA9IHt9O1xuXHRkYXRhID0gdXRmOHJlYWQoZGF0YSk7XG5cblx0Zm9yKHZhciBpID0gMDsgaSA8IENPUkVfUFJPUFMubGVuZ3RoOyArK2kpIHtcblx0XHR2YXIgZiA9IENPUkVfUFJPUFNbaV0sIGN1ciA9IGRhdGEubWF0Y2goQ09SRV9QUk9QU19SRUdFWFtpXSk7XG5cdFx0aWYoY3VyICE9IG51bGwgJiYgY3VyLmxlbmd0aCA+IDApIHBbZlsxXV0gPSB1bmVzY2FwZXhtbChjdXJbMV0pO1xuXHRcdGlmKGZbMl0gPT09ICdkYXRlJyAmJiBwW2ZbMV1dKSBwW2ZbMV1dID0gcGFyc2VEYXRlKHBbZlsxXV0pO1xuXHR9XG5cblx0cmV0dXJuIHA7XG59XG5cbnZhciBDT1JFX1BST1BTX1hNTF9ST09UID0gd3JpdGV4dGFnKCdjcDpjb3JlUHJvcGVydGllcycsIG51bGwsIHtcblx0Ly8neG1sbnMnOiBYTUxOUy5DT1JFX1BST1BTLFxuXHQneG1sbnM6Y3AnOiBYTUxOUy5DT1JFX1BST1BTLFxuXHQneG1sbnM6ZGMnOiBYTUxOUy5kYyxcblx0J3htbG5zOmRjdGVybXMnOiBYTUxOUy5kY3Rlcm1zLFxuXHQneG1sbnM6ZGNtaXR5cGUnOiBYTUxOUy5kY21pdHlwZSxcblx0J3htbG5zOnhzaSc6IFhNTE5TLnhzaVxufSk7XG5cbmZ1bmN0aW9uIGNwX2RvaXQoZiwgZywgaCwgbywgcCkge1xuXHRpZihwW2ZdICE9IG51bGwgfHwgZyA9PSBudWxsIHx8IGcgPT09IFwiXCIpIHJldHVybjtcblx0cFtmXSA9IGc7XG5cdGcgPSBlc2NhcGV4bWwoZyk7XG5cdG9bby5sZW5ndGhdID0gKGggPyB3cml0ZXh0YWcoZixnLGgpIDogd3JpdGV0YWcoZixnKSk7XG59XG5cbmZ1bmN0aW9uIHdyaXRlX2NvcmVfcHJvcHMoY3AsIF9vcHRzKSB7XG5cdHZhciBvcHRzID0gX29wdHMgfHwge307XG5cdHZhciBvID0gW1hNTF9IRUFERVIsIENPUkVfUFJPUFNfWE1MX1JPT1RdLCBwID0ge307XG5cdGlmKCFjcCAmJiAhb3B0cy5Qcm9wcykgcmV0dXJuIG8uam9pbihcIlwiKTtcblxuXHRpZihjcCkge1xuXHRcdGlmKGNwLkNyZWF0ZWREYXRlICE9IG51bGwpIGNwX2RvaXQoXCJkY3Rlcm1zOmNyZWF0ZWRcIiwgdHlwZW9mIGNwLkNyZWF0ZWREYXRlID09PSBcInN0cmluZ1wiID8gY3AuQ3JlYXRlZERhdGUgOiB3cml0ZV93M2NkdGYoY3AuQ3JlYXRlZERhdGUsIG9wdHMuV1RGKSwge1wieHNpOnR5cGVcIjpcImRjdGVybXM6VzNDRFRGXCJ9LCBvLCBwKTtcblx0XHRpZihjcC5Nb2RpZmllZERhdGUgIT0gbnVsbCkgY3BfZG9pdChcImRjdGVybXM6bW9kaWZpZWRcIiwgdHlwZW9mIGNwLk1vZGlmaWVkRGF0ZSA9PT0gXCJzdHJpbmdcIiA/IGNwLk1vZGlmaWVkRGF0ZSA6IHdyaXRlX3czY2R0ZihjcC5Nb2RpZmllZERhdGUsIG9wdHMuV1RGKSwge1wieHNpOnR5cGVcIjpcImRjdGVybXM6VzNDRFRGXCJ9LCBvLCBwKTtcblx0fVxuXG5cdGZvcih2YXIgaSA9IDA7IGkgIT0gQ09SRV9QUk9QUy5sZW5ndGg7ICsraSkge1xuXHRcdHZhciBmID0gQ09SRV9QUk9QU1tpXTtcblx0XHR2YXIgdiA9IG9wdHMuUHJvcHMgJiYgb3B0cy5Qcm9wc1tmWzFdXSAhPSBudWxsID8gb3B0cy5Qcm9wc1tmWzFdXSA6IGNwID8gY3BbZlsxXV0gOiBudWxsO1xuXHRcdGlmKHYgPT09IHRydWUpIHYgPSBcIjFcIjtcblx0XHRlbHNlIGlmKHYgPT09IGZhbHNlKSB2ID0gXCIwXCI7XG5cdFx0ZWxzZSBpZih0eXBlb2YgdiA9PSBcIm51bWJlclwiKSB2ID0gU3RyaW5nKHYpO1xuXHRcdGlmKHYgIT0gbnVsbCkgY3BfZG9pdChmWzBdLCB2LCBudWxsLCBvLCBwKTtcblx0fVxuXHRpZihvLmxlbmd0aD4yKXsgb1tvLmxlbmd0aF0gPSAoJzwvY3A6Y29yZVByb3BlcnRpZXM+Jyk7IG9bMV09b1sxXS5yZXBsYWNlKFwiLz5cIixcIj5cIik7IH1cblx0cmV0dXJuIG8uam9pbihcIlwiKTtcbn1cbi8qIDE1LjIuMTIuMyBFeHRlbmRlZCBGaWxlIFByb3BlcnRpZXMgUGFydCAqL1xuLyogW01TLU9TSEFSRURdIDIuMy4zLjIuWzEtMl0uMSAoUElEU0kvUElERFNJKSAqL1xudmFyIEVYVF9QUk9QUyA9IFtcblx0W1wiQXBwbGljYXRpb25cIiwgXCJBcHBsaWNhdGlvblwiLCBcInN0cmluZ1wiXSxcblx0W1wiQXBwVmVyc2lvblwiLCBcIkFwcFZlcnNpb25cIiwgXCJzdHJpbmdcIl0sXG5cdFtcIkNvbXBhbnlcIiwgXCJDb21wYW55XCIsIFwic3RyaW5nXCJdLFxuXHRbXCJEb2NTZWN1cml0eVwiLCBcIkRvY1NlY3VyaXR5XCIsIFwic3RyaW5nXCJdLFxuXHRbXCJNYW5hZ2VyXCIsIFwiTWFuYWdlclwiLCBcInN0cmluZ1wiXSxcblx0W1wiSHlwZXJsaW5rc0NoYW5nZWRcIiwgXCJIeXBlcmxpbmtzQ2hhbmdlZFwiLCBcImJvb2xcIl0sXG5cdFtcIlNoYXJlZERvY1wiLCBcIlNoYXJlZERvY1wiLCBcImJvb2xcIl0sXG5cdFtcIkxpbmtzVXBUb0RhdGVcIiwgXCJMaW5rc1VwVG9EYXRlXCIsIFwiYm9vbFwiXSxcblx0W1wiU2NhbGVDcm9wXCIsIFwiU2NhbGVDcm9wXCIsIFwiYm9vbFwiXSxcblx0W1wiSGVhZGluZ1BhaXJzXCIsIFwiSGVhZGluZ1BhaXJzXCIsIFwicmF3XCJdLFxuXHRbXCJUaXRsZXNPZlBhcnRzXCIsIFwiVGl0bGVzT2ZQYXJ0c1wiLCBcInJhd1wiXVxuXTtcblxuWE1MTlMuRVhUX1BST1BTID0gXCJodHRwOi8vc2NoZW1hcy5vcGVueG1sZm9ybWF0cy5vcmcvb2ZmaWNlRG9jdW1lbnQvMjAwNi9leHRlbmRlZC1wcm9wZXJ0aWVzXCI7XG5SRUxTLkVYVF9QUk9QUyAgPSAnaHR0cDovL3NjaGVtYXMub3BlbnhtbGZvcm1hdHMub3JnL29mZmljZURvY3VtZW50LzIwMDYvcmVsYXRpb25zaGlwcy9leHRlbmRlZC1wcm9wZXJ0aWVzJztcblxudmFyIFBzZXVkb1Byb3BzUGFpcnMgPSBbXG5cdFwiV29ya3NoZWV0c1wiLCAgXCJTaGVldE5hbWVzXCIsXG5cdFwiTmFtZWRSYW5nZXNcIiwgXCJEZWZpbmVkTmFtZXNcIixcblx0XCJDaGFydHNoZWV0c1wiLCBcIkNoYXJ0TmFtZXNcIlxuXTtcbmZ1bmN0aW9uIGxvYWRfcHJvcHNfcGFpcnMoSFAsIFRPUCwgcHJvcHMsIG9wdHMpIHtcblx0dmFyIHYgPSBbXTtcblx0aWYodHlwZW9mIEhQID09IFwic3RyaW5nXCIpIHYgPSBwYXJzZVZlY3RvcihIUCwgb3B0cyk7XG5cdGVsc2UgZm9yKHZhciBqID0gMDsgaiA8IEhQLmxlbmd0aDsgKytqKSB2ID0gdi5jb25jYXQoSFBbal0ubWFwKGZ1bmN0aW9uKGhwKSB7IHJldHVybiB7djpocH07IH0pKTtcblx0dmFyIHBhcnRzID0gKHR5cGVvZiBUT1AgPT0gXCJzdHJpbmdcIikgPyBwYXJzZVZlY3RvcihUT1AsIG9wdHMpLm1hcChmdW5jdGlvbiAoeCkgeyByZXR1cm4geC52OyB9KSA6IFRPUDtcblx0dmFyIGlkeCA9IDAsIGxlbiA9IDA7XG5cdGlmKHBhcnRzLmxlbmd0aCA+IDApIGZvcih2YXIgaSA9IDA7IGkgIT09IHYubGVuZ3RoOyBpICs9IDIpIHtcblx0XHRsZW4gPSArKHZbaSsxXS52KTtcblx0XHRzd2l0Y2godltpXS52KSB7XG5cdFx0XHRjYXNlIFwiV29ya3NoZWV0c1wiOlxuXHRcdFx0Y2FzZSBcIuW3peS9nOihqFwiOlxuXHRcdFx0Y2FzZSBcItCb0LjRgdGC0YtcIjpcblx0XHRcdGNhc2UgXCLYo9mI2LHYp9mCINin2YTYudmF2YRcIjpcblx0XHRcdGNhc2UgXCLjg6/jg7zjgq/jgrfjg7zjg4hcIjpcblx0XHRcdGNhc2UgXCLXktec15nXldeg15XXqiDXoteR15XXk9eUXCI6XG5cdFx0XHRjYXNlIFwiQXJiZWl0c2Jsw6R0dGVyXCI6XG5cdFx0XHRjYXNlIFwiw4dhbMSxxZ9tYSBTYXlmYWxhcsSxXCI6XG5cdFx0XHRjYXNlIFwiRmV1aWxsZXMgZGUgY2FsY3VsXCI6XG5cdFx0XHRjYXNlIFwiRm9nbGkgZGkgbGF2b3JvXCI6XG5cdFx0XHRjYXNlIFwiRm9saGFzIGRlIGPDoWxjdWxvXCI6XG5cdFx0XHRjYXNlIFwiUGxhbmlsaGFzXCI6XG5cdFx0XHRjYXNlIFwiUmVnbmVhcmtcIjpcblx0XHRcdGNhc2UgXCJIb2phcyBkZSBjw6FsY3Vsb1wiOlxuXHRcdFx0Y2FzZSBcIldlcmtibGFkZW5cIjpcblx0XHRcdFx0cHJvcHMuV29ya3NoZWV0cyA9IGxlbjtcblx0XHRcdFx0cHJvcHMuU2hlZXROYW1lcyA9IHBhcnRzLnNsaWNlKGlkeCwgaWR4ICsgbGVuKTtcblx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdGNhc2UgXCJOYW1lZCBSYW5nZXNcIjpcblx0XHRcdGNhc2UgXCJSYW5nb3MgY29uIG5vbWJyZVwiOlxuXHRcdFx0Y2FzZSBcIuWQjeWJjeS7mOOBjeS4gOimp1wiOlxuXHRcdFx0Y2FzZSBcIkJlbmFubnRlIEJlcmVpY2hlXCI6XG5cdFx0XHRjYXNlIFwiTmF2bmdpdm5lIG9tcsOlZGVyXCI6XG5cdFx0XHRcdHByb3BzLk5hbWVkUmFuZ2VzID0gbGVuO1xuXHRcdFx0XHRwcm9wcy5EZWZpbmVkTmFtZXMgPSBwYXJ0cy5zbGljZShpZHgsIGlkeCArIGxlbik7XG5cdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRjYXNlIFwiQ2hhcnRzXCI6XG5cdFx0XHRjYXNlIFwiRGlhZ3JhbW1lXCI6XG5cdFx0XHRcdHByb3BzLkNoYXJ0c2hlZXRzID0gbGVuO1xuXHRcdFx0XHRwcm9wcy5DaGFydE5hbWVzID0gcGFydHMuc2xpY2UoaWR4LCBpZHggKyBsZW4pO1xuXHRcdFx0XHRicmVhaztcblx0XHR9XG5cdFx0aWR4ICs9IGxlbjtcblx0fVxufVxuXG5mdW5jdGlvbiBwYXJzZV9leHRfcHJvcHMoZGF0YSwgcCwgb3B0cykge1xuXHR2YXIgcSA9IHt9OyBpZighcCkgcCA9IHt9O1xuXHRkYXRhID0gdXRmOHJlYWQoZGF0YSk7XG5cblx0RVhUX1BST1BTLmZvckVhY2goZnVuY3Rpb24oZikge1xuXHRcdHZhciB4bWwgPSAoZGF0YS5tYXRjaChtYXRjaHRhZyhmWzBdKSl8fFtdKVsxXTtcblx0XHRzd2l0Y2goZlsyXSkge1xuXHRcdFx0Y2FzZSBcInN0cmluZ1wiOiBpZih4bWwpIHBbZlsxXV0gPSB1bmVzY2FwZXhtbCh4bWwpOyBicmVhaztcblx0XHRcdGNhc2UgXCJib29sXCI6IHBbZlsxXV0gPSB4bWwgPT09IFwidHJ1ZVwiOyBicmVhaztcblx0XHRcdGNhc2UgXCJyYXdcIjpcblx0XHRcdFx0dmFyIGN1ciA9IGRhdGEubWF0Y2gobmV3IFJlZ0V4cChcIjxcIiArIGZbMF0gKyBcIltePl0qPihbXFxcXHNcXFxcU10qPyk8XFwvXCIgKyBmWzBdICsgXCI+XCIpKTtcblx0XHRcdFx0aWYoY3VyICYmIGN1ci5sZW5ndGggPiAwKSBxW2ZbMV1dID0gY3VyWzFdO1xuXHRcdFx0XHRicmVhaztcblx0XHR9XG5cdH0pO1xuXG5cdGlmKHEuSGVhZGluZ1BhaXJzICYmIHEuVGl0bGVzT2ZQYXJ0cykgbG9hZF9wcm9wc19wYWlycyhxLkhlYWRpbmdQYWlycywgcS5UaXRsZXNPZlBhcnRzLCBwLCBvcHRzKTtcblxuXHRyZXR1cm4gcDtcbn1cblxudmFyIEVYVF9QUk9QU19YTUxfUk9PVCA9IHdyaXRleHRhZygnUHJvcGVydGllcycsIG51bGwsIHtcblx0J3htbG5zJzogWE1MTlMuRVhUX1BST1BTLFxuXHQneG1sbnM6dnQnOiBYTUxOUy52dFxufSk7XG5cbmZ1bmN0aW9uIHdyaXRlX2V4dF9wcm9wcyhjcCkge1xuXHR2YXIgbyA9IFtdLCBXID0gd3JpdGV4dGFnO1xuXHRpZighY3ApIGNwID0ge307XG5cdGNwLkFwcGxpY2F0aW9uID0gXCJTaGVldEpTXCI7XG5cdG9bby5sZW5ndGhdID0gKFhNTF9IRUFERVIpO1xuXHRvW28ubGVuZ3RoXSA9IChFWFRfUFJPUFNfWE1MX1JPT1QpO1xuXG5cdEVYVF9QUk9QUy5mb3JFYWNoKGZ1bmN0aW9uKGYpIHtcblx0XHRpZihjcFtmWzFdXSA9PT0gdW5kZWZpbmVkKSByZXR1cm47XG5cdFx0dmFyIHY7XG5cdFx0c3dpdGNoKGZbMl0pIHtcblx0XHRcdGNhc2UgJ3N0cmluZyc6IHYgPSBlc2NhcGV4bWwoU3RyaW5nKGNwW2ZbMV1dKSk7IGJyZWFrO1xuXHRcdFx0Y2FzZSAnYm9vbCc6IHYgPSBjcFtmWzFdXSA/ICd0cnVlJyA6ICdmYWxzZSc7IGJyZWFrO1xuXHRcdH1cblx0XHRpZih2ICE9PSB1bmRlZmluZWQpIG9bby5sZW5ndGhdID0gKFcoZlswXSwgdikpO1xuXHR9KTtcblxuXHQvKiBUT0RPOiBIZWFkaW5nUGFpcnMsIFRpdGxlc09mUGFydHMgKi9cblx0b1tvLmxlbmd0aF0gPSAoVygnSGVhZGluZ1BhaXJzJywgVygndnQ6dmVjdG9yJywgVygndnQ6dmFyaWFudCcsICc8dnQ6bHBzdHI+V29ya3NoZWV0czwvdnQ6bHBzdHI+JykrVygndnQ6dmFyaWFudCcsIFcoJ3Z0Omk0JywgU3RyaW5nKGNwLldvcmtzaGVldHMpKSksIHtzaXplOjIsIGJhc2VUeXBlOlwidmFyaWFudFwifSkpKTtcblx0b1tvLmxlbmd0aF0gPSAoVygnVGl0bGVzT2ZQYXJ0cycsIFcoJ3Z0OnZlY3RvcicsIGNwLlNoZWV0TmFtZXMubWFwKGZ1bmN0aW9uKHMpIHsgcmV0dXJuIFwiPHZ0Omxwc3RyPlwiICsgZXNjYXBleG1sKHMpICsgXCI8L3Z0Omxwc3RyPlwiOyB9KS5qb2luKFwiXCIpLCB7c2l6ZTogY3AuV29ya3NoZWV0cywgYmFzZVR5cGU6XCJscHN0clwifSkpKTtcblx0aWYoby5sZW5ndGg+Mil7IG9bby5sZW5ndGhdID0gKCc8L1Byb3BlcnRpZXM+Jyk7IG9bMV09b1sxXS5yZXBsYWNlKFwiLz5cIixcIj5cIik7IH1cblx0cmV0dXJuIG8uam9pbihcIlwiKTtcbn1cbi8qIDE1LjIuMTIuMiBDdXN0b20gRmlsZSBQcm9wZXJ0aWVzIFBhcnQgKi9cblhNTE5TLkNVU1RfUFJPUFMgPSBcImh0dHA6Ly9zY2hlbWFzLm9wZW54bWxmb3JtYXRzLm9yZy9vZmZpY2VEb2N1bWVudC8yMDA2L2N1c3RvbS1wcm9wZXJ0aWVzXCI7XG5SRUxTLkNVU1RfUFJPUFMgID0gJ2h0dHA6Ly9zY2hlbWFzLm9wZW54bWxmb3JtYXRzLm9yZy9vZmZpY2VEb2N1bWVudC8yMDA2L3JlbGF0aW9uc2hpcHMvY3VzdG9tLXByb3BlcnRpZXMnO1xuXG52YXIgY3VzdHJlZ2V4ID0gLzxbXj5dKz5bXjxdKi9nO1xuZnVuY3Rpb24gcGFyc2VfY3VzdF9wcm9wcyhkYXRhLCBvcHRzKSB7XG5cdHZhciBwID0ge30sIG5hbWUgPSBcIlwiO1xuXHR2YXIgbSA9IGRhdGEubWF0Y2goY3VzdHJlZ2V4KTtcblx0aWYobSkgZm9yKHZhciBpID0gMDsgaSAhPSBtLmxlbmd0aDsgKytpKSB7XG5cdFx0dmFyIHggPSBtW2ldLCB5ID0gcGFyc2V4bWx0YWcoeCk7XG5cdFx0c3dpdGNoKHlbMF0pIHtcblx0XHRcdGNhc2UgJzw/eG1sJzogYnJlYWs7XG5cdFx0XHRjYXNlICc8UHJvcGVydGllcyc6IGJyZWFrO1xuXHRcdFx0Y2FzZSAnPHByb3BlcnR5JzogbmFtZSA9IHVuZXNjYXBleG1sKHkubmFtZSk7IGJyZWFrO1xuXHRcdFx0Y2FzZSAnPC9wcm9wZXJ0eT4nOiBuYW1lID0gbnVsbDsgYnJlYWs7XG5cdFx0XHRkZWZhdWx0OiBpZiAoeC5pbmRleE9mKCc8dnQ6JykgPT09IDApIHtcblx0XHRcdFx0dmFyIHRva3MgPSB4LnNwbGl0KCc+Jyk7XG5cdFx0XHRcdHZhciB0eXBlID0gdG9rc1swXS5zbGljZSg0KSwgdGV4dCA9IHRva3NbMV07XG5cdFx0XHRcdC8qIDIyLjQuMi4zMiAoQ1RfVmFyaWFudCkuIE9taXQgdGhlIGJpbmFyeSB0eXBlcyBmcm9tIDIyLjQgKFZhcmlhbnQgVHlwZXMpICovXG5cdFx0XHRcdHN3aXRjaCh0eXBlKSB7XG5cdFx0XHRcdFx0Y2FzZSAnbHBzdHInOiBjYXNlICdic3RyJzogY2FzZSAnbHB3c3RyJzpcblx0XHRcdFx0XHRcdHBbbmFtZV0gPSB1bmVzY2FwZXhtbCh0ZXh0KTtcblx0XHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRcdGNhc2UgJ2Jvb2wnOlxuXHRcdFx0XHRcdFx0cFtuYW1lXSA9IHBhcnNleG1sYm9vbCh0ZXh0KTtcblx0XHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRcdGNhc2UgJ2kxJzogY2FzZSAnaTInOiBjYXNlICdpNCc6IGNhc2UgJ2k4JzogY2FzZSAnaW50JzogY2FzZSAndWludCc6XG5cdFx0XHRcdFx0XHRwW25hbWVdID0gcGFyc2VJbnQodGV4dCwgMTApO1xuXHRcdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdFx0Y2FzZSAncjQnOiBjYXNlICdyOCc6IGNhc2UgJ2RlY2ltYWwnOlxuXHRcdFx0XHRcdFx0cFtuYW1lXSA9IHBhcnNlRmxvYXQodGV4dCk7XG5cdFx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0XHRjYXNlICdmaWxldGltZSc6IGNhc2UgJ2RhdGUnOlxuXHRcdFx0XHRcdFx0cFtuYW1lXSA9IHBhcnNlRGF0ZSh0ZXh0KTtcblx0XHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRcdGNhc2UgJ2N5JzogY2FzZSAnZXJyb3InOlxuXHRcdFx0XHRcdFx0cFtuYW1lXSA9IHVuZXNjYXBleG1sKHRleHQpO1xuXHRcdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdFx0ZGVmYXVsdDpcblx0XHRcdFx0XHRcdGlmKHR5cGUuc2xpY2UoLTEpID09ICcvJykgYnJlYWs7XG5cdFx0XHRcdFx0XHRpZihvcHRzLldURiAmJiB0eXBlb2YgY29uc29sZSAhPT0gJ3VuZGVmaW5lZCcpIGNvbnNvbGUud2FybignVW5leHBlY3RlZCcsIHgsIHR5cGUsIHRva3MpO1xuXHRcdFx0XHR9XG5cdFx0XHR9IGVsc2UgaWYoeC5zbGljZSgwLDIpID09PSBcIjwvXCIpIHsvKiBlbXB0eSAqL1xuXHRcdFx0fSBlbHNlIGlmKG9wdHMuV1RGKSB0aHJvdyBuZXcgRXJyb3IoeCk7XG5cdFx0fVxuXHR9XG5cdHJldHVybiBwO1xufVxuXG52YXIgQ1VTVF9QUk9QU19YTUxfUk9PVCA9IHdyaXRleHRhZygnUHJvcGVydGllcycsIG51bGwsIHtcblx0J3htbG5zJzogWE1MTlMuQ1VTVF9QUk9QUyxcblx0J3htbG5zOnZ0JzogWE1MTlMudnRcbn0pO1xuXG5mdW5jdGlvbiB3cml0ZV9jdXN0X3Byb3BzKGNwKSB7XG5cdHZhciBvID0gW1hNTF9IRUFERVIsIENVU1RfUFJPUFNfWE1MX1JPT1RdO1xuXHRpZighY3ApIHJldHVybiBvLmpvaW4oXCJcIik7XG5cdHZhciBwaWQgPSAxO1xuXHRrZXlzKGNwKS5mb3JFYWNoKGZ1bmN0aW9uIGN1c3Rwcm9wKGspIHsgKytwaWQ7XG5cdFx0b1tvLmxlbmd0aF0gPSAod3JpdGV4dGFnKCdwcm9wZXJ0eScsIHdyaXRlX3Z0KGNwW2tdLCB0cnVlKSwge1xuXHRcdFx0J2ZtdGlkJzogJ3tENUNERDUwNS0yRTlDLTEwMUItOTM5Ny0wODAwMkIyQ0Y5QUV9Jyxcblx0XHRcdCdwaWQnOiBwaWQsXG5cdFx0XHQnbmFtZSc6IGVzY2FwZXhtbChrKVxuXHRcdH0pKTtcblx0fSk7XG5cdGlmKG8ubGVuZ3RoPjIpeyBvW28ubGVuZ3RoXSA9ICc8L1Byb3BlcnRpZXM+Jzsgb1sxXT1vWzFdLnJlcGxhY2UoXCIvPlwiLFwiPlwiKTsgfVxuXHRyZXR1cm4gby5qb2luKFwiXCIpO1xufVxuLyogQ29tbW9uIE5hbWUgLT4gWExNTCBOYW1lICovXG52YXIgWExNTERvY1Byb3BzTWFwID0ge1xuXHRUaXRsZTogJ1RpdGxlJyxcblx0U3ViamVjdDogJ1N1YmplY3QnLFxuXHRBdXRob3I6ICdBdXRob3InLFxuXHRLZXl3b3JkczogJ0tleXdvcmRzJyxcblx0Q29tbWVudHM6ICdEZXNjcmlwdGlvbicsXG5cdExhc3RBdXRob3I6ICdMYXN0QXV0aG9yJyxcblx0UmV2TnVtYmVyOiAnUmV2aXNpb24nLFxuXHRBcHBsaWNhdGlvbjogJ0FwcE5hbWUnLFxuXHQvKiBUb3RhbFRpbWU6ICdUb3RhbFRpbWUnLCAqL1xuXHRMYXN0UHJpbnRlZDogJ0xhc3RQcmludGVkJyxcblx0Q3JlYXRlZERhdGU6ICdDcmVhdGVkJyxcblx0TW9kaWZpZWREYXRlOiAnTGFzdFNhdmVkJyxcblx0LyogUGFnZXMgKi9cblx0LyogV29yZHMgKi9cblx0LyogQ2hhcmFjdGVycyAqL1xuXHRDYXRlZ29yeTogJ0NhdGVnb3J5Jyxcblx0LyogUHJlc2VudGF0aW9uRm9ybWF0ICovXG5cdE1hbmFnZXI6ICdNYW5hZ2VyJyxcblx0Q29tcGFueTogJ0NvbXBhbnknLFxuXHQvKiBHdWlkICovXG5cdC8qIEh5cGVybGlua0Jhc2UgKi9cblx0LyogQnl0ZXMgKi9cblx0LyogTGluZXMgKi9cblx0LyogUGFyYWdyYXBocyAqL1xuXHQvKiBDaGFyYWN0ZXJzV2l0aFNwYWNlcyAqL1xuXHRBcHBWZXJzaW9uOiAnVmVyc2lvbicsXG5cblx0Q29udGVudFN0YXR1czogJ0NvbnRlbnRTdGF0dXMnLCAvKiBOT1RFOiBtaXNzaW5nIGZyb20gc2NoZW1hICovXG5cdElkZW50aWZpZXI6ICdJZGVudGlmaWVyJywgLyogTk9URTogbWlzc2luZyBmcm9tIHNjaGVtYSAqL1xuXHRMYW5ndWFnZTogJ0xhbmd1YWdlJyAvKiBOT1RFOiBtaXNzaW5nIGZyb20gc2NoZW1hICovXG59O1xudmFyIGV2ZXJ0X1hMTUxEUE0gPSBldmVydChYTE1MRG9jUHJvcHNNYXApO1xuXG5mdW5jdGlvbiB4bG1sX3NldF9wcm9wKFByb3BzLCB0YWcsIHZhbCkge1xuXHR0YWcgPSBldmVydF9YTE1MRFBNW3RhZ10gfHwgdGFnO1xuXHRQcm9wc1t0YWddID0gdmFsO1xufVxuXG5mdW5jdGlvbiB4bG1sX3dyaXRlX2RvY3Byb3BzKFByb3BzLCBvcHRzKSB7XG5cdHZhciBvID0gW107XG5cdGtleXMoWExNTERvY1Byb3BzTWFwKS5tYXAoZnVuY3Rpb24obSkge1xuXHRcdGZvcih2YXIgaSA9IDA7IGkgPCBDT1JFX1BST1BTLmxlbmd0aDsgKytpKSBpZihDT1JFX1BST1BTW2ldWzFdID09IG0pIHJldHVybiBDT1JFX1BST1BTW2ldO1xuXHRcdGZvcihpID0gMDsgaSA8IEVYVF9QUk9QUy5sZW5ndGg7ICsraSkgaWYoRVhUX1BST1BTW2ldWzFdID09IG0pIHJldHVybiBFWFRfUFJPUFNbaV07XG5cdFx0dGhyb3cgbTtcblx0fSkuZm9yRWFjaChmdW5jdGlvbihwKSB7XG5cdFx0aWYoUHJvcHNbcFsxXV0gPT0gbnVsbCkgcmV0dXJuO1xuXHRcdHZhciBtID0gb3B0cyAmJiBvcHRzLlByb3BzICYmIG9wdHMuUHJvcHNbcFsxXV0gIT0gbnVsbCA/IG9wdHMuUHJvcHNbcFsxXV0gOiBQcm9wc1twWzFdXTtcblx0XHRzd2l0Y2gocFsyXSkge1xuXHRcdFx0Y2FzZSAnZGF0ZSc6IG0gPSBuZXcgRGF0ZShtKS50b0lTT1N0cmluZygpLnJlcGxhY2UoL1xcLlxcZCpaLyxcIlpcIik7IGJyZWFrO1xuXHRcdH1cblx0XHRpZih0eXBlb2YgbSA9PSAnbnVtYmVyJykgbSA9IFN0cmluZyhtKTtcblx0XHRlbHNlIGlmKG0gPT09IHRydWUgfHwgbSA9PT0gZmFsc2UpIHsgbSA9IG0gPyBcIjFcIiA6IFwiMFwiOyB9XG5cdFx0ZWxzZSBpZihtIGluc3RhbmNlb2YgRGF0ZSkgbSA9IG5ldyBEYXRlKG0pLnRvSVNPU3RyaW5nKCkucmVwbGFjZSgvXFwuXFxkKlovLFwiXCIpO1xuXHRcdG8ucHVzaCh3cml0ZXRhZyhYTE1MRG9jUHJvcHNNYXBbcFsxXV0gfHwgcFsxXSwgbSkpO1xuXHR9KTtcblx0cmV0dXJuIHdyaXRleHRhZygnRG9jdW1lbnRQcm9wZXJ0aWVzJywgby5qb2luKFwiXCIpLCB7eG1sbnM6WExNTE5TLm8gfSk7XG59XG5mdW5jdGlvbiB4bG1sX3dyaXRlX2N1c3Rwcm9wcyhQcm9wcywgQ3VzdHByb3BzKSB7XG5cdHZhciBCTEFDS0xJU1QgPSBbXCJXb3Jrc2hlZXRzXCIsXCJTaGVldE5hbWVzXCJdO1xuXHR2YXIgVCA9ICdDdXN0b21Eb2N1bWVudFByb3BlcnRpZXMnO1xuXHR2YXIgbyA9IFtdO1xuXHRpZihQcm9wcykga2V5cyhQcm9wcykuZm9yRWFjaChmdW5jdGlvbihrKSB7XG5pZighT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKFByb3BzLCBrKSkgcmV0dXJuO1xuXHRcdGZvcih2YXIgaSA9IDA7IGkgPCBDT1JFX1BST1BTLmxlbmd0aDsgKytpKSBpZihrID09IENPUkVfUFJPUFNbaV1bMV0pIHJldHVybjtcblx0XHRmb3IoaSA9IDA7IGkgPCBFWFRfUFJPUFMubGVuZ3RoOyArK2kpIGlmKGsgPT0gRVhUX1BST1BTW2ldWzFdKSByZXR1cm47XG5cdFx0Zm9yKGkgPSAwOyBpIDwgQkxBQ0tMSVNULmxlbmd0aDsgKytpKSBpZihrID09IEJMQUNLTElTVFtpXSkgcmV0dXJuO1xuXG5cdFx0dmFyIG0gPSBQcm9wc1trXTtcblx0XHR2YXIgdCA9IFwic3RyaW5nXCI7XG5cdFx0aWYodHlwZW9mIG0gPT0gJ251bWJlcicpIHsgdCA9IFwiZmxvYXRcIjsgbSA9IFN0cmluZyhtKTsgfVxuXHRcdGVsc2UgaWYobSA9PT0gdHJ1ZSB8fCBtID09PSBmYWxzZSkgeyB0ID0gXCJib29sZWFuXCI7IG0gPSBtID8gXCIxXCIgOiBcIjBcIjsgfVxuXHRcdGVsc2UgbSA9IFN0cmluZyhtKTtcblx0XHRvLnB1c2god3JpdGV4dGFnKGVzY2FwZXhtbHRhZyhrKSwgbSwge1wiZHQ6ZHRcIjp0fSkpO1xuXHR9KTtcblx0aWYoQ3VzdHByb3BzKSBrZXlzKEN1c3Rwcm9wcykuZm9yRWFjaChmdW5jdGlvbihrKSB7XG5pZighT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKEN1c3Rwcm9wcywgaykpIHJldHVybjtcblx0XHRpZihQcm9wcyAmJiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoUHJvcHMsIGspKSByZXR1cm47XG5cdFx0dmFyIG0gPSBDdXN0cHJvcHNba107XG5cdFx0dmFyIHQgPSBcInN0cmluZ1wiO1xuXHRcdGlmKHR5cGVvZiBtID09ICdudW1iZXInKSB7IHQgPSBcImZsb2F0XCI7IG0gPSBTdHJpbmcobSk7IH1cblx0XHRlbHNlIGlmKG0gPT09IHRydWUgfHwgbSA9PT0gZmFsc2UpIHsgdCA9IFwiYm9vbGVhblwiOyBtID0gbSA/IFwiMVwiIDogXCIwXCI7IH1cblx0XHRlbHNlIGlmKG0gaW5zdGFuY2VvZiBEYXRlKSB7IHQgPSBcImRhdGVUaW1lLnR6XCI7IG0gPSBtLnRvSVNPU3RyaW5nKCk7IH1cblx0XHRlbHNlIG0gPSBTdHJpbmcobSk7XG5cdFx0by5wdXNoKHdyaXRleHRhZyhlc2NhcGV4bWx0YWcoayksIG0sIHtcImR0OmR0XCI6dH0pKTtcblx0fSk7XG5cdHJldHVybiAnPCcgKyBUICsgJyB4bWxucz1cIicgKyBYTE1MTlMubyArICdcIj4nICsgby5qb2luKFwiXCIpICsgJzwvJyArIFQgKyAnPic7XG59XG4vKiBbTVMtRFRZUF0gMi4zLjMgRklMRVRJTUUgKi9cbi8qIFtNUy1PTEVEU10gMi4xLjMgRklMRVRJTUUgKFBhY2tldCBWZXJzaW9uKSAqL1xuLyogW01TLU9MRVBTXSAyLjggRklMRVRJTUUgKFBhY2tldCBWZXJzaW9uKSAqL1xuZnVuY3Rpb24gcGFyc2VfRklMRVRJTUUoYmxvYikge1xuXHR2YXIgZHdMb3dEYXRlVGltZSA9IGJsb2IucmVhZF9zaGlmdCg0KSwgZHdIaWdoRGF0ZVRpbWUgPSBibG9iLnJlYWRfc2hpZnQoNCk7XG5cdHJldHVybiBuZXcgRGF0ZSgoKGR3SGlnaERhdGVUaW1lLzFlNypNYXRoLnBvdygyLDMyKSArIGR3TG93RGF0ZVRpbWUvMWU3KSAtIDExNjQ0NDczNjAwKSoxMDAwKS50b0lTT1N0cmluZygpLnJlcGxhY2UoL1xcLjAwMC8sXCJcIik7XG59XG5mdW5jdGlvbiB3cml0ZV9GSUxFVElNRSh0aW1lKSB7XG5cdHZhciBkYXRlID0gKHR5cGVvZiB0aW1lID09IFwic3RyaW5nXCIpID8gbmV3IERhdGUoRGF0ZS5wYXJzZSh0aW1lKSkgOiB0aW1lO1xuXHR2YXIgdCA9IGRhdGUuZ2V0VGltZSgpIC8gMTAwMCArIDExNjQ0NDczNjAwO1xuXHR2YXIgbCA9IHQgJSBNYXRoLnBvdygyLDMyKSwgaCA9ICh0IC0gbCkgLyBNYXRoLnBvdygyLDMyKTtcblx0bCAqPSAxZTc7IGggKj0gMWU3O1xuXHR2YXIgdyA9IChsIC8gTWF0aC5wb3coMiwzMikpIHwgMDtcblx0aWYodyA+IDApIHsgbCA9IGwgJSBNYXRoLnBvdygyLDMyKTsgaCArPSB3OyB9XG5cdHZhciBvID0gbmV3X2J1Zig4KTsgby53cml0ZV9zaGlmdCg0LCBsKTsgby53cml0ZV9zaGlmdCg0LCBoKTsgcmV0dXJuIG87XG59XG5cbi8qIFtNUy1PU0hBUkVEXSAyLjMuMy4xLjQgTHBzdHIgKi9cbmZ1bmN0aW9uIHBhcnNlX2xwc3RyKGJsb2IsIHR5cGUsIHBhZCkge1xuXHR2YXIgc3RhcnQgPSBibG9iLmw7XG5cdHZhciBzdHIgPSBibG9iLnJlYWRfc2hpZnQoMCwgJ2xwc3RyLWNwJyk7XG5cdGlmKHBhZCkgd2hpbGUoKGJsb2IubCAtIHN0YXJ0KSAmIDMpICsrYmxvYi5sO1xuXHRyZXR1cm4gc3RyO1xufVxuXG4vKiBbTVMtT1NIQVJFRF0gMi4zLjMuMS42IExwd3N0ciAqL1xuZnVuY3Rpb24gcGFyc2VfbHB3c3RyKGJsb2IsIHR5cGUsIHBhZCkge1xuXHR2YXIgc3RyID0gYmxvYi5yZWFkX3NoaWZ0KDAsICdscHdzdHInKTtcblx0aWYocGFkKSBibG9iLmwgKz0gKDQgLSAoKHN0ci5sZW5ndGgrMSkgJiAzKSkgJiAzO1xuXHRyZXR1cm4gc3RyO1xufVxuXG5cbi8qIFtNUy1PU0hBUkVEXSAyLjMuMy4xLjExIFZ0U3RyaW5nICovXG4vKiBbTVMtT1NIQVJFRF0gMi4zLjMuMS4xMiBWdFVuYWxpZ25lZFN0cmluZyAqL1xuZnVuY3Rpb24gcGFyc2VfVnRTdHJpbmdCYXNlKGJsb2IsIHN0cmluZ1R5cGUsIHBhZCkge1xuXHRpZihzdHJpbmdUeXBlID09PSAweDFGIC8qVlRfTFBXU1RSKi8pIHJldHVybiBwYXJzZV9scHdzdHIoYmxvYik7XG5cdHJldHVybiBwYXJzZV9scHN0cihibG9iLCBzdHJpbmdUeXBlLCBwYWQpO1xufVxuXG5mdW5jdGlvbiBwYXJzZV9WdFN0cmluZyhibG9iLCB0LCBwYWQpIHsgcmV0dXJuIHBhcnNlX1Z0U3RyaW5nQmFzZShibG9iLCB0LCBwYWQgPT09IGZhbHNlID8gMDogNCk7IH1cbmZ1bmN0aW9uIHBhcnNlX1Z0VW5hbGlnbmVkU3RyaW5nKGJsb2IsIHQpIHsgaWYoIXQpIHRocm93IG5ldyBFcnJvcihcIlZ0VW5hbGlnbmVkU3RyaW5nIG11c3QgaGF2ZSBwb3NpdGl2ZSBsZW5ndGhcIik7IHJldHVybiBwYXJzZV9WdFN0cmluZ0Jhc2UoYmxvYiwgdCwgMCk7IH1cblxuLyogW01TLU9TSEFSRURdIDIuMy4zLjEuOSBWdFZlY1VuYWxpZ25lZExwc3RyVmFsdWUgKi9cbmZ1bmN0aW9uIHBhcnNlX1Z0VmVjVW5hbGlnbmVkTHBzdHJWYWx1ZShibG9iKSB7XG5cdHZhciBsZW5ndGggPSBibG9iLnJlYWRfc2hpZnQoNCk7XG5cdHZhciByZXQgPSBbXTtcblx0Zm9yKHZhciBpID0gMDsgaSAhPSBsZW5ndGg7ICsraSkgcmV0W2ldID0gYmxvYi5yZWFkX3NoaWZ0KDAsICdscHN0ci1jcCcpLnJlcGxhY2UoY2hyMCwnJyk7XG5cdHJldHVybiByZXQ7XG59XG5cbi8qIFtNUy1PU0hBUkVEXSAyLjMuMy4xLjEwIFZ0VmVjVW5hbGlnbmVkTHBzdHIgKi9cbmZ1bmN0aW9uIHBhcnNlX1Z0VmVjVW5hbGlnbmVkTHBzdHIoYmxvYikge1xuXHRyZXR1cm4gcGFyc2VfVnRWZWNVbmFsaWduZWRMcHN0clZhbHVlKGJsb2IpO1xufVxuXG4vKiBbTVMtT1NIQVJFRF0gMi4zLjMuMS4xMyBWdEhlYWRpbmdQYWlyICovXG5mdW5jdGlvbiBwYXJzZV9WdEhlYWRpbmdQYWlyKGJsb2IpIHtcblx0dmFyIGhlYWRpbmdTdHJpbmcgPSBwYXJzZV9UeXBlZFByb3BlcnR5VmFsdWUoYmxvYiwgVlRfVVNUUik7XG5cdHZhciBoZWFkZXJQYXJ0cyA9IHBhcnNlX1R5cGVkUHJvcGVydHlWYWx1ZShibG9iLCBWVF9JNCk7XG5cdHJldHVybiBbaGVhZGluZ1N0cmluZywgaGVhZGVyUGFydHNdO1xufVxuXG4vKiBbTVMtT1NIQVJFRF0gMi4zLjMuMS4xNCBWdFZlY0hlYWRpbmdQYWlyVmFsdWUgKi9cbmZ1bmN0aW9uIHBhcnNlX1Z0VmVjSGVhZGluZ1BhaXJWYWx1ZShibG9iKSB7XG5cdHZhciBjRWxlbWVudHMgPSBibG9iLnJlYWRfc2hpZnQoNCk7XG5cdHZhciBvdXQgPSBbXTtcblx0Zm9yKHZhciBpID0gMDsgaSAhPSBjRWxlbWVudHMgLyAyOyArK2kpIG91dC5wdXNoKHBhcnNlX1Z0SGVhZGluZ1BhaXIoYmxvYikpO1xuXHRyZXR1cm4gb3V0O1xufVxuXG4vKiBbTVMtT1NIQVJFRF0gMi4zLjMuMS4xNSBWdFZlY0hlYWRpbmdQYWlyICovXG5mdW5jdGlvbiBwYXJzZV9WdFZlY0hlYWRpbmdQYWlyKGJsb2IpIHtcblx0Ly8gTk9URTogV2hlbiBpbnZva2VkLCB3VHlwZSAmIHBhZGRpbmcgd2VyZSBhbHJlYWR5IGNvbnN1bWVkXG5cdHJldHVybiBwYXJzZV9WdFZlY0hlYWRpbmdQYWlyVmFsdWUoYmxvYik7XG59XG5cbi8qIFtNUy1PTEVQU10gMi4xOC4xIERpY3Rpb25hcnkgKHVzZXMgMi4xNywgMi4xNikgKi9cbmZ1bmN0aW9uIHBhcnNlX2RpY3Rpb25hcnkoYmxvYixDb2RlUGFnZSkge1xuXHR2YXIgY250ID0gYmxvYi5yZWFkX3NoaWZ0KDQpO1xuXHR2YXIgZGljdCA9ICh7fSk7XG5cdGZvcih2YXIgaiA9IDA7IGogIT0gY250OyArK2opIHtcblx0XHR2YXIgcGlkID0gYmxvYi5yZWFkX3NoaWZ0KDQpO1xuXHRcdHZhciBsZW4gPSBibG9iLnJlYWRfc2hpZnQoNCk7XG5cdFx0ZGljdFtwaWRdID0gYmxvYi5yZWFkX3NoaWZ0KGxlbiwgKENvZGVQYWdlID09PSAweDRCMCA/J3V0ZjE2bGUnOid1dGY4JykpLnJlcGxhY2UoY2hyMCwnJykucmVwbGFjZShjaHIxLCchJyk7XG5cdFx0aWYoQ29kZVBhZ2UgPT09IDB4NEIwICYmIChsZW4gJSAyKSkgYmxvYi5sICs9IDI7XG5cdH1cblx0aWYoYmxvYi5sICYgMykgYmxvYi5sID0gKGJsb2IubD4+MisxKTw8Mjtcblx0cmV0dXJuIGRpY3Q7XG59XG5cbi8qIFtNUy1PTEVQU10gMi45IEJMT0IgKi9cbmZ1bmN0aW9uIHBhcnNlX0JMT0IoYmxvYikge1xuXHR2YXIgc2l6ZSA9IGJsb2IucmVhZF9zaGlmdCg0KTtcblx0dmFyIGJ5dGVzID0gYmxvYi5zbGljZShibG9iLmwsYmxvYi5sK3NpemUpO1xuXHRibG9iLmwgKz0gc2l6ZTtcblx0aWYoKHNpemUgJiAzKSA+IDApIGJsb2IubCArPSAoNCAtIChzaXplICYgMykpICYgMztcblx0cmV0dXJuIGJ5dGVzO1xufVxuXG4vKiBbTVMtT0xFUFNdIDIuMTEgQ2xpcGJvYXJkRGF0YSAqL1xuZnVuY3Rpb24gcGFyc2VfQ2xpcGJvYXJkRGF0YShibG9iKSB7XG5cdC8vIFRPRE9cblx0dmFyIG8gPSB7fTtcblx0by5TaXplID0gYmxvYi5yZWFkX3NoaWZ0KDQpO1xuXHQvL28uRm9ybWF0ID0gYmxvYi5yZWFkX3NoaWZ0KDQpO1xuXHRibG9iLmwgKz0gby5TaXplICsgMyAtIChvLlNpemUgLSAxKSAlIDQ7XG5cdHJldHVybiBvO1xufVxuXG4vKiBbTVMtT0xFUFNdIDIuMTUgVHlwZWRQcm9wZXJ0eVZhbHVlICovXG5mdW5jdGlvbiBwYXJzZV9UeXBlZFByb3BlcnR5VmFsdWUoYmxvYiwgdHlwZSwgX29wdHMpIHtcblx0dmFyIHQgPSBibG9iLnJlYWRfc2hpZnQoMiksIHJldCwgb3B0cyA9IF9vcHRzfHx7fTtcblx0YmxvYi5sICs9IDI7XG5cdGlmKHR5cGUgIT09IFZUX1ZBUklBTlQpXG5cdGlmKHQgIT09IHR5cGUgJiYgVlRfQ1VTVE9NLmluZGV4T2YodHlwZSk9PT0tMSkgdGhyb3cgbmV3IEVycm9yKCdFeHBlY3RlZCB0eXBlICcgKyB0eXBlICsgJyBzYXcgJyArIHQpO1xuXHRzd2l0Y2godHlwZSA9PT0gVlRfVkFSSUFOVCA/IHQgOiB0eXBlKSB7XG5cdFx0Y2FzZSAweDAyIC8qVlRfSTIqLzogcmV0ID0gYmxvYi5yZWFkX3NoaWZ0KDIsICdpJyk7IGlmKCFvcHRzLnJhdykgYmxvYi5sICs9IDI7IHJldHVybiByZXQ7XG5cdFx0Y2FzZSAweDAzIC8qVlRfSTQqLzogcmV0ID0gYmxvYi5yZWFkX3NoaWZ0KDQsICdpJyk7IHJldHVybiByZXQ7XG5cdFx0Y2FzZSAweDBCIC8qVlRfQk9PTCovOiByZXR1cm4gYmxvYi5yZWFkX3NoaWZ0KDQpICE9PSAweDA7XG5cdFx0Y2FzZSAweDEzIC8qVlRfVUk0Ki86IHJldCA9IGJsb2IucmVhZF9zaGlmdCg0KTsgcmV0dXJuIHJldDtcblx0XHRjYXNlIDB4MUUgLypWVF9MUFNUUiovOiByZXR1cm4gcGFyc2VfbHBzdHIoYmxvYiwgdCwgNCkucmVwbGFjZShjaHIwLCcnKTtcblx0XHRjYXNlIDB4MUYgLypWVF9MUFdTVFIqLzogcmV0dXJuIHBhcnNlX2xwd3N0cihibG9iKTtcblx0XHRjYXNlIDB4NDAgLypWVF9GSUxFVElNRSovOiByZXR1cm4gcGFyc2VfRklMRVRJTUUoYmxvYik7XG5cdFx0Y2FzZSAweDQxIC8qVlRfQkxPQiovOiByZXR1cm4gcGFyc2VfQkxPQihibG9iKTtcblx0XHRjYXNlIDB4NDcgLypWVF9DRiovOiByZXR1cm4gcGFyc2VfQ2xpcGJvYXJkRGF0YShibG9iKTtcblx0XHRjYXNlIDB4NTAgLypWVF9TVFJJTkcqLzogcmV0dXJuIHBhcnNlX1Z0U3RyaW5nKGJsb2IsIHQsICFvcHRzLnJhdykucmVwbGFjZShjaHIwLCcnKTtcblx0XHRjYXNlIDB4NTEgLypWVF9VU1RSKi86IHJldHVybiBwYXJzZV9WdFVuYWxpZ25lZFN0cmluZyhibG9iLCB0LyosIDQqLykucmVwbGFjZShjaHIwLCcnKTtcblx0XHRjYXNlIDB4MTAwQyAvKlZUX1ZFQ1RPUnxWVF9WQVJJQU5UKi86IHJldHVybiBwYXJzZV9WdFZlY0hlYWRpbmdQYWlyKGJsb2IpO1xuXHRcdGNhc2UgMHgxMDFFIC8qVlRfTFBTVFIqLzogcmV0dXJuIHBhcnNlX1Z0VmVjVW5hbGlnbmVkTHBzdHIoYmxvYik7XG5cdFx0ZGVmYXVsdDogdGhyb3cgbmV3IEVycm9yKFwiVHlwZWRQcm9wZXJ0eVZhbHVlIHVucmVjb2duaXplZCB0eXBlIFwiICsgdHlwZSArIFwiIFwiICsgdCk7XG5cdH1cbn1cbmZ1bmN0aW9uIHdyaXRlX1R5cGVkUHJvcGVydHlWYWx1ZSh0eXBlLCB2YWx1ZSkge1xuXHR2YXIgbyA9IG5ld19idWYoNCksIHAgPSBuZXdfYnVmKDQpO1xuXHRvLndyaXRlX3NoaWZ0KDQsIHR5cGUgPT0gMHg1MCA/IDB4MUYgOiB0eXBlKTtcblx0c3dpdGNoKHR5cGUpIHtcblx0XHRjYXNlIDB4MDMgLypWVF9JNCovOiBwLndyaXRlX3NoaWZ0KC00LCB2YWx1ZSk7IGJyZWFrO1xuXHRcdGNhc2UgMHgwNSAvKlZUX0k0Ki86IHAgPSBuZXdfYnVmKDgpOyBwLndyaXRlX3NoaWZ0KDgsIHZhbHVlLCAnZicpOyBicmVhaztcblx0XHRjYXNlIDB4MEIgLypWVF9CT09MKi86IHAud3JpdGVfc2hpZnQoNCwgdmFsdWUgPyAweDAxIDogMHgwMCk7IGJyZWFrO1xuXHRcdGNhc2UgMHg0MCAvKlZUX0ZJTEVUSU1FKi86ICBwID0gd3JpdGVfRklMRVRJTUUodmFsdWUpOyBicmVhaztcblx0XHRjYXNlIDB4MUYgLypWVF9MUFdTVFIqLzpcblx0XHRjYXNlIDB4NTAgLypWVF9TVFJJTkcqLzpcbnAgPSBuZXdfYnVmKDQgKyAyICogKHZhbHVlLmxlbmd0aCArIDEpICsgKHZhbHVlLmxlbmd0aCAlIDIgPyAwIDogMikpO1xuXHRcdFx0cC53cml0ZV9zaGlmdCg0LCB2YWx1ZS5sZW5ndGggKyAxKTtcblx0XHRcdHAud3JpdGVfc2hpZnQoMCwgdmFsdWUsIFwiZGJjc1wiKTtcblx0XHRcdHdoaWxlKHAubCAhPSBwLmxlbmd0aCkgcC53cml0ZV9zaGlmdCgxLCAwKTtcblx0XHRcdGJyZWFrO1xuXHRcdGRlZmF1bHQ6IHRocm93IG5ldyBFcnJvcihcIlR5cGVkUHJvcGVydHlWYWx1ZSB1bnJlY29nbml6ZWQgdHlwZSBcIiArIHR5cGUgKyBcIiBcIiArIHZhbHVlKTtcblx0fVxuXHRyZXR1cm4gYmNvbmNhdChbbywgcF0pO1xufVxuXG4vKiBbTVMtT0xFUFNdIDIuMjAgUHJvcGVydHlTZXQgKi9cbmZ1bmN0aW9uIHBhcnNlX1Byb3BlcnR5U2V0KGJsb2IsIFBJRFNJKSB7XG5cdHZhciBzdGFydF9hZGRyID0gYmxvYi5sO1xuXHR2YXIgc2l6ZSA9IGJsb2IucmVhZF9zaGlmdCg0KTtcblx0dmFyIE51bVByb3BzID0gYmxvYi5yZWFkX3NoaWZ0KDQpO1xuXHR2YXIgUHJvcHMgPSBbXSwgaSA9IDA7XG5cdHZhciBDb2RlUGFnZSA9IDA7XG5cdHZhciBEaWN0aW9uYXJ5ID0gLTEsIERpY3RPYmogPSAoe30pO1xuXHRmb3IoaSA9IDA7IGkgIT0gTnVtUHJvcHM7ICsraSkge1xuXHRcdHZhciBQcm9wSUQgPSBibG9iLnJlYWRfc2hpZnQoNCk7XG5cdFx0dmFyIE9mZnNldCA9IGJsb2IucmVhZF9zaGlmdCg0KTtcblx0XHRQcm9wc1tpXSA9IFtQcm9wSUQsIE9mZnNldCArIHN0YXJ0X2FkZHJdO1xuXHR9XG5cdFByb3BzLnNvcnQoZnVuY3Rpb24oeCx5KSB7IHJldHVybiB4WzFdIC0geVsxXTsgfSk7XG5cdHZhciBQcm9wSCA9IHt9O1xuXHRmb3IoaSA9IDA7IGkgIT0gTnVtUHJvcHM7ICsraSkge1xuXHRcdGlmKGJsb2IubCAhPT0gUHJvcHNbaV1bMV0pIHtcblx0XHRcdHZhciBmYWlsID0gdHJ1ZTtcblx0XHRcdGlmKGk+MCAmJiBQSURTSSkgc3dpdGNoKFBJRFNJW1Byb3BzW2ktMV1bMF1dLnQpIHtcblx0XHRcdFx0Y2FzZSAweDAyIC8qVlRfSTIqLzogaWYoYmxvYi5sKzIgPT09IFByb3BzW2ldWzFdKSB7IGJsb2IubCs9MjsgZmFpbCA9IGZhbHNlOyB9IGJyZWFrO1xuXHRcdFx0XHRjYXNlIDB4NTAgLypWVF9TVFJJTkcqLzogaWYoYmxvYi5sIDw9IFByb3BzW2ldWzFdKSB7IGJsb2IubD1Qcm9wc1tpXVsxXTsgZmFpbCA9IGZhbHNlOyB9IGJyZWFrO1xuXHRcdFx0XHRjYXNlIDB4MTAwQyAvKlZUX1ZFQ1RPUnxWVF9WQVJJQU5UKi86IGlmKGJsb2IubCA8PSBQcm9wc1tpXVsxXSkgeyBibG9iLmw9UHJvcHNbaV1bMV07IGZhaWwgPSBmYWxzZTsgfSBicmVhaztcblx0XHRcdH1cblx0XHRcdGlmKCghUElEU0l8fGk9PTApICYmIGJsb2IubCA8PSBQcm9wc1tpXVsxXSkgeyBmYWlsPWZhbHNlOyBibG9iLmwgPSBQcm9wc1tpXVsxXTsgfVxuXHRcdFx0aWYoZmFpbCkgdGhyb3cgbmV3IEVycm9yKFwiUmVhZCBFcnJvcjogRXhwZWN0ZWQgYWRkcmVzcyBcIiArIFByb3BzW2ldWzFdICsgJyBhdCAnICsgYmxvYi5sICsgJyA6JyArIGkpO1xuXHRcdH1cblx0XHRpZihQSURTSSkge1xuXHRcdFx0dmFyIHBpZGRzaSA9IFBJRFNJW1Byb3BzW2ldWzBdXTtcblx0XHRcdFByb3BIW3BpZGRzaS5uXSA9IHBhcnNlX1R5cGVkUHJvcGVydHlWYWx1ZShibG9iLCBwaWRkc2kudCwge3Jhdzp0cnVlfSk7XG5cdFx0XHRpZihwaWRkc2kucCA9PT0gJ3ZlcnNpb24nKSBQcm9wSFtwaWRkc2kubl0gPSBTdHJpbmcoUHJvcEhbcGlkZHNpLm5dID4+IDE2KSArIFwiLlwiICsgKFwiMDAwMFwiICsgU3RyaW5nKFByb3BIW3BpZGRzaS5uXSAmIDB4RkZGRikpLnNsaWNlKC00KTtcblx0XHRcdGlmKHBpZGRzaS5uID09IFwiQ29kZVBhZ2VcIikgc3dpdGNoKFByb3BIW3BpZGRzaS5uXSkge1xuXHRcdFx0XHRjYXNlIDA6IFByb3BIW3BpZGRzaS5uXSA9IDEyNTI7XG5cdFx0XHRcdFx0LyogZmFsbHMgdGhyb3VnaCAqL1xuXHRcdFx0XHRjYXNlIDg3NDpcblx0XHRcdFx0Y2FzZSA5MzI6XG5cdFx0XHRcdGNhc2UgOTM2OlxuXHRcdFx0XHRjYXNlIDk0OTpcblx0XHRcdFx0Y2FzZSA5NTA6XG5cdFx0XHRcdGNhc2UgMTI1MDpcblx0XHRcdFx0Y2FzZSAxMjUxOlxuXHRcdFx0XHRjYXNlIDEyNTM6XG5cdFx0XHRcdGNhc2UgMTI1NDpcblx0XHRcdFx0Y2FzZSAxMjU1OlxuXHRcdFx0XHRjYXNlIDEyNTY6XG5cdFx0XHRcdGNhc2UgMTI1Nzpcblx0XHRcdFx0Y2FzZSAxMjU4OlxuXHRcdFx0XHRjYXNlIDEwMDAwOlxuXHRcdFx0XHRjYXNlIDEyMDA6XG5cdFx0XHRcdGNhc2UgMTIwMTpcblx0XHRcdFx0Y2FzZSAxMjUyOlxuXHRcdFx0XHRjYXNlIDY1MDAwOiBjYXNlIC01MzY6XG5cdFx0XHRcdGNhc2UgNjUwMDE6IGNhc2UgLTUzNTpcblx0XHRcdFx0XHRzZXRfY3AoQ29kZVBhZ2UgPSAoUHJvcEhbcGlkZHNpLm5dPj4+MCkgJiAweEZGRkYpOyBicmVhaztcblx0XHRcdFx0ZGVmYXVsdDogdGhyb3cgbmV3IEVycm9yKFwiVW5zdXBwb3J0ZWQgQ29kZVBhZ2U6IFwiICsgUHJvcEhbcGlkZHNpLm5dKTtcblx0XHRcdH1cblx0XHR9IGVsc2Uge1xuXHRcdFx0aWYoUHJvcHNbaV1bMF0gPT09IDB4MSkge1xuXHRcdFx0XHRDb2RlUGFnZSA9IFByb3BILkNvZGVQYWdlID0gKHBhcnNlX1R5cGVkUHJvcGVydHlWYWx1ZShibG9iLCBWVF9JMikpO1xuXHRcdFx0XHRzZXRfY3AoQ29kZVBhZ2UpO1xuXHRcdFx0XHRpZihEaWN0aW9uYXJ5ICE9PSAtMSkge1xuXHRcdFx0XHRcdHZhciBvbGRwb3MgPSBibG9iLmw7XG5cdFx0XHRcdFx0YmxvYi5sID0gUHJvcHNbRGljdGlvbmFyeV1bMV07XG5cdFx0XHRcdFx0RGljdE9iaiA9IHBhcnNlX2RpY3Rpb25hcnkoYmxvYixDb2RlUGFnZSk7XG5cdFx0XHRcdFx0YmxvYi5sID0gb2xkcG9zO1xuXHRcdFx0XHR9XG5cdFx0XHR9IGVsc2UgaWYoUHJvcHNbaV1bMF0gPT09IDApIHtcblx0XHRcdFx0aWYoQ29kZVBhZ2UgPT09IDApIHsgRGljdGlvbmFyeSA9IGk7IGJsb2IubCA9IFByb3BzW2krMV1bMV07IGNvbnRpbnVlOyB9XG5cdFx0XHRcdERpY3RPYmogPSBwYXJzZV9kaWN0aW9uYXJ5KGJsb2IsQ29kZVBhZ2UpO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0dmFyIG5hbWUgPSBEaWN0T2JqW1Byb3BzW2ldWzBdXTtcblx0XHRcdFx0dmFyIHZhbDtcblx0XHRcdFx0LyogW01TLU9TSEFSRURdIDIuMy4zLjIuMy4xLjIgKyBQUk9QVkFSSUFOVCAqL1xuXHRcdFx0XHRzd2l0Y2goYmxvYltibG9iLmxdKSB7XG5cdFx0XHRcdFx0Y2FzZSAweDQxIC8qVlRfQkxPQiovOiBibG9iLmwgKz0gNDsgdmFsID0gcGFyc2VfQkxPQihibG9iKTsgYnJlYWs7XG5cdFx0XHRcdFx0Y2FzZSAweDFFIC8qVlRfTFBTVFIqLzogYmxvYi5sICs9IDQ7IHZhbCA9IHBhcnNlX1Z0U3RyaW5nKGJsb2IsIGJsb2JbYmxvYi5sLTRdKS5yZXBsYWNlKC9cXHUwMDAwKyQvLFwiXCIpOyBicmVhaztcblx0XHRcdFx0XHRjYXNlIDB4MUYgLypWVF9MUFdTVFIqLzogYmxvYi5sICs9IDQ7IHZhbCA9IHBhcnNlX1Z0U3RyaW5nKGJsb2IsIGJsb2JbYmxvYi5sLTRdKS5yZXBsYWNlKC9cXHUwMDAwKyQvLFwiXCIpOyBicmVhaztcblx0XHRcdFx0XHRjYXNlIDB4MDMgLypWVF9JNCovOiBibG9iLmwgKz0gNDsgdmFsID0gYmxvYi5yZWFkX3NoaWZ0KDQsICdpJyk7IGJyZWFrO1xuXHRcdFx0XHRcdGNhc2UgMHgxMyAvKlZUX1VJNCovOiBibG9iLmwgKz0gNDsgdmFsID0gYmxvYi5yZWFkX3NoaWZ0KDQpOyBicmVhaztcblx0XHRcdFx0XHRjYXNlIDB4MDUgLypWVF9SOCovOiBibG9iLmwgKz0gNDsgdmFsID0gYmxvYi5yZWFkX3NoaWZ0KDgsICdmJyk7IGJyZWFrO1xuXHRcdFx0XHRcdGNhc2UgMHgwQiAvKlZUX0JPT0wqLzogYmxvYi5sICs9IDQ7IHZhbCA9IHBhcnNlYm9vbChibG9iLCA0KTsgYnJlYWs7XG5cdFx0XHRcdFx0Y2FzZSAweDQwIC8qVlRfRklMRVRJTUUqLzogYmxvYi5sICs9IDQ7IHZhbCA9IHBhcnNlRGF0ZShwYXJzZV9GSUxFVElNRShibG9iKSk7IGJyZWFrO1xuXHRcdFx0XHRcdGRlZmF1bHQ6IHRocm93IG5ldyBFcnJvcihcInVucGFyc2VkIHZhbHVlOiBcIiArIGJsb2JbYmxvYi5sXSk7XG5cdFx0XHRcdH1cblx0XHRcdFx0UHJvcEhbbmFtZV0gPSB2YWw7XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cdGJsb2IubCA9IHN0YXJ0X2FkZHIgKyBzaXplOyAvKiBzdGVwIGFoZWFkIHRvIHNraXAgcGFkZGluZyAqL1xuXHRyZXR1cm4gUHJvcEg7XG59XG52YXIgWExTUFNTa2lwID0gWyBcIkNvZGVQYWdlXCIsIFwiVGh1bWJuYWlsXCIsIFwiX1BJRF9MSU5LQkFTRVwiLCBcIl9QSURfSExJTktTXCIsIFwiU3lzdGVtSWRlbnRpZmllclwiLCBcIkZNVElEXCIgXS5jb25jYXQoUHNldWRvUHJvcHNQYWlycyk7XG5mdW5jdGlvbiBndWVzc19wcm9wZXJ0eV90eXBlKHZhbCkge1xuXHRzd2l0Y2godHlwZW9mIHZhbCkge1xuXHRcdGNhc2UgXCJib29sZWFuXCI6IHJldHVybiAweDBCO1xuXHRcdGNhc2UgXCJudW1iZXJcIjogcmV0dXJuICgodmFsfDApPT12YWwpID8gMHgwMyA6IDB4MDU7XG5cdFx0Y2FzZSBcInN0cmluZ1wiOiByZXR1cm4gMHgxRjtcblx0XHRjYXNlIFwib2JqZWN0XCI6IGlmKHZhbCBpbnN0YW5jZW9mIERhdGUpIHJldHVybiAweDQwOyBicmVhaztcblx0fVxuXHRyZXR1cm4gLTE7XG59XG5mdW5jdGlvbiB3cml0ZV9Qcm9wZXJ0eVNldChlbnRyaWVzLCBSRSwgUElEU0kpIHtcblx0dmFyIGhkciA9IG5ld19idWYoOCksIHBpYW8gPSBbXSwgcHJvcCA9IFtdO1xuXHR2YXIgc3ogPSA4LCBpID0gMDtcblxuXHR2YXIgcHIgPSBuZXdfYnVmKDgpLCBwaW8gPSBuZXdfYnVmKDgpO1xuXHRwci53cml0ZV9zaGlmdCg0LCAweDAwMDIpO1xuXHRwci53cml0ZV9zaGlmdCg0LCAweDA0QjApO1xuXHRwaW8ud3JpdGVfc2hpZnQoNCwgMHgwMDAxKTtcblx0cHJvcC5wdXNoKHByKTsgcGlhby5wdXNoKHBpbyk7XG5cdHN6ICs9IDggKyBwci5sZW5ndGg7XG5cblx0aWYoIVJFKSB7XG5cdFx0cGlvID0gbmV3X2J1Zig4KTtcblx0XHRwaW8ud3JpdGVfc2hpZnQoNCwgMCk7XG5cdFx0cGlhby51bnNoaWZ0KHBpbyk7XG5cblx0XHR2YXIgYnVmcyA9IFtuZXdfYnVmKDQpXTtcblx0XHRidWZzWzBdLndyaXRlX3NoaWZ0KDQsIGVudHJpZXMubGVuZ3RoKTtcblx0XHRmb3IoaSA9IDA7IGkgPCBlbnRyaWVzLmxlbmd0aDsgKytpKSB7XG5cdFx0XHR2YXIgdmFsdWUgPSBlbnRyaWVzW2ldWzBdO1xuXHRcdFx0cHIgPSBuZXdfYnVmKDQgKyA0ICsgMiAqICh2YWx1ZS5sZW5ndGggKyAxKSArICh2YWx1ZS5sZW5ndGggJSAyID8gMCA6IDIpKTtcblx0XHRcdHByLndyaXRlX3NoaWZ0KDQsIGkrMik7XG5cdFx0XHRwci53cml0ZV9zaGlmdCg0LCB2YWx1ZS5sZW5ndGggKyAxKTtcblx0XHRcdHByLndyaXRlX3NoaWZ0KDAsIHZhbHVlLCBcImRiY3NcIik7XG5cdFx0XHR3aGlsZShwci5sICE9IHByLmxlbmd0aCkgcHIud3JpdGVfc2hpZnQoMSwgMCk7XG5cdFx0XHRidWZzLnB1c2gocHIpO1xuXHRcdH1cblx0XHRwciA9IGJjb25jYXQoYnVmcyk7XG5cdFx0cHJvcC51bnNoaWZ0KHByKTtcblx0XHRzeiArPSA4ICsgcHIubGVuZ3RoO1xuXHR9XG5cblx0Zm9yKGkgPSAwOyBpIDwgZW50cmllcy5sZW5ndGg7ICsraSkge1xuXHRcdGlmKFJFICYmICFSRVtlbnRyaWVzW2ldWzBdXSkgY29udGludWU7XG5cdFx0aWYoWExTUFNTa2lwLmluZGV4T2YoZW50cmllc1tpXVswXSkgPiAtMSkgY29udGludWU7XG5cdFx0aWYoZW50cmllc1tpXVsxXSA9PSBudWxsKSBjb250aW51ZTtcblxuXHRcdHZhciB2YWwgPSBlbnRyaWVzW2ldWzFdLCBpZHggPSAwO1xuXHRcdGlmKFJFKSB7XG5cdFx0XHRpZHggPSArUkVbZW50cmllc1tpXVswXV07XG5cdFx0XHR2YXIgcGluZm8gPSAoUElEU0kpW2lkeF07XG5cdFx0XHRpZihwaW5mby5wID09IFwidmVyc2lvblwiICYmIHR5cGVvZiB2YWwgPT0gXCJzdHJpbmdcIikge1xudmFyIGFyciA9IHZhbC5zcGxpdChcIi5cIik7XG5cdFx0XHRcdHZhbCA9ICgoK2FyclswXSk8PDE2KSArICgoK2FyclsxXSl8fDApO1xuXHRcdFx0fVxuXHRcdFx0cHIgPSB3cml0ZV9UeXBlZFByb3BlcnR5VmFsdWUocGluZm8udCwgdmFsKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0dmFyIFQgPSBndWVzc19wcm9wZXJ0eV90eXBlKHZhbCk7XG5cdFx0XHRpZihUID09IC0xKSB7IFQgPSAweDFGOyB2YWwgPSBTdHJpbmcodmFsKTsgfVxuXHRcdFx0cHIgPSB3cml0ZV9UeXBlZFByb3BlcnR5VmFsdWUoVCwgdmFsKTtcblx0XHR9XG5cdFx0cHJvcC5wdXNoKHByKTtcblxuXHRcdHBpbyA9IG5ld19idWYoOCk7XG5cdFx0cGlvLndyaXRlX3NoaWZ0KDQsICFSRSA/IDIraSA6IGlkeCk7XG5cdFx0cGlhby5wdXNoKHBpbyk7XG5cblx0XHRzeiArPSA4ICsgcHIubGVuZ3RoO1xuXHR9XG5cblx0dmFyIHcgPSA4ICogKHByb3AubGVuZ3RoICsgMSk7XG5cdGZvcihpID0gMDsgaSA8IHByb3AubGVuZ3RoOyArK2kpIHsgcGlhb1tpXS53cml0ZV9zaGlmdCg0LCB3KTsgdyArPSBwcm9wW2ldLmxlbmd0aDsgfVxuXHRoZHIud3JpdGVfc2hpZnQoNCwgc3opO1xuXHRoZHIud3JpdGVfc2hpZnQoNCwgcHJvcC5sZW5ndGgpO1xuXHRyZXR1cm4gYmNvbmNhdChbaGRyXS5jb25jYXQocGlhbykuY29uY2F0KHByb3ApKTtcbn1cblxuLyogW01TLU9MRVBTXSAyLjIxIFByb3BlcnR5U2V0U3RyZWFtICovXG5mdW5jdGlvbiBwYXJzZV9Qcm9wZXJ0eVNldFN0cmVhbShmaWxlLCBQSURTSSwgY2xzaWQpIHtcblx0dmFyIGJsb2IgPSBmaWxlLmNvbnRlbnQ7XG5cdGlmKCFibG9iKSByZXR1cm4gKHt9KTtcblx0cHJlcF9ibG9iKGJsb2IsIDApO1xuXG5cdHZhciBOdW1TZXRzLCBGTVRJRDAsIEZNVElEMSwgT2Zmc2V0MCwgT2Zmc2V0MSA9IDA7XG5cdGJsb2IuY2hrKCdmZWZmJywgJ0J5dGUgT3JkZXI6ICcpO1xuXG5cdC8qdmFyIHZlcnMgPSAqL2Jsb2IucmVhZF9zaGlmdCgyKTsgLy8gVE9ETzogY2hlY2sgdmVyc2lvblxuXHR2YXIgU3lzdGVtSWRlbnRpZmllciA9IGJsb2IucmVhZF9zaGlmdCg0KTtcblx0dmFyIENMU0lEID0gYmxvYi5yZWFkX3NoaWZ0KDE2KTtcblx0aWYoQ0xTSUQgIT09IENGQi51dGlscy5jb25zdHMuSEVBREVSX0NMU0lEICYmIENMU0lEICE9PSBjbHNpZCkgdGhyb3cgbmV3IEVycm9yKFwiQmFkIFByb3BlcnR5U2V0IENMU0lEIFwiICsgQ0xTSUQpO1xuXHROdW1TZXRzID0gYmxvYi5yZWFkX3NoaWZ0KDQpO1xuXHRpZihOdW1TZXRzICE9PSAxICYmIE51bVNldHMgIT09IDIpIHRocm93IG5ldyBFcnJvcihcIlVucmVjb2duaXplZCAjU2V0czogXCIgKyBOdW1TZXRzKTtcblx0Rk1USUQwID0gYmxvYi5yZWFkX3NoaWZ0KDE2KTsgT2Zmc2V0MCA9IGJsb2IucmVhZF9zaGlmdCg0KTtcblxuXHRpZihOdW1TZXRzID09PSAxICYmIE9mZnNldDAgIT09IGJsb2IubCkgdGhyb3cgbmV3IEVycm9yKFwiTGVuZ3RoIG1pc21hdGNoOiBcIiArIE9mZnNldDAgKyBcIiAhPT0gXCIgKyBibG9iLmwpO1xuXHRlbHNlIGlmKE51bVNldHMgPT09IDIpIHsgRk1USUQxID0gYmxvYi5yZWFkX3NoaWZ0KDE2KTsgT2Zmc2V0MSA9IGJsb2IucmVhZF9zaGlmdCg0KTsgfVxuXHR2YXIgUFNldDAgPSBwYXJzZV9Qcm9wZXJ0eVNldChibG9iLCBQSURTSSk7XG5cblx0dmFyIHJ2YWwgPSAoeyBTeXN0ZW1JZGVudGlmaWVyOiBTeXN0ZW1JZGVudGlmaWVyIH0pO1xuXHRmb3IodmFyIHkgaW4gUFNldDApIHJ2YWxbeV0gPSBQU2V0MFt5XTtcblx0Ly9ydmFsLmJsb2IgPSBibG9iO1xuXHRydmFsLkZNVElEID0gRk1USUQwO1xuXHQvL3J2YWwuUFNldDAgPSBQU2V0MDtcblx0aWYoTnVtU2V0cyA9PT0gMSkgcmV0dXJuIHJ2YWw7XG5cdGlmKE9mZnNldDEgLSBibG9iLmwgPT0gMikgYmxvYi5sICs9IDI7XG5cdGlmKGJsb2IubCAhPT0gT2Zmc2V0MSkgdGhyb3cgbmV3IEVycm9yKFwiTGVuZ3RoIG1pc21hdGNoIDI6IFwiICsgYmxvYi5sICsgXCIgIT09IFwiICsgT2Zmc2V0MSk7XG5cdHZhciBQU2V0MTtcblx0dHJ5IHsgUFNldDEgPSBwYXJzZV9Qcm9wZXJ0eVNldChibG9iLCBudWxsKTsgfSBjYXRjaChlKSB7LyogZW1wdHkgKi99XG5cdGZvcih5IGluIFBTZXQxKSBydmFsW3ldID0gUFNldDFbeV07XG5cdHJ2YWwuRk1USUQgPSBbRk1USUQwLCBGTVRJRDFdOyAvLyBUT0RPOiB2ZXJpZnkgRk1USUQwLzFcblx0cmV0dXJuIHJ2YWw7XG59XG5mdW5jdGlvbiB3cml0ZV9Qcm9wZXJ0eVNldFN0cmVhbShlbnRyaWVzLCBjbHNpZCwgUkUsIFBJRFNJLCBlbnRyaWVzMiwgY2xzaWQyKSB7XG5cdHZhciBoZHIgPSBuZXdfYnVmKGVudHJpZXMyID8gNjggOiA0OCk7XG5cdHZhciBidWZzID0gW2hkcl07XG5cdGhkci53cml0ZV9zaGlmdCgyLCAweEZGRkUpO1xuXHRoZHIud3JpdGVfc2hpZnQoMiwgMHgwMDAwKTsgLyogVE9ETzogdHlwZSAxIHByb3BzICovXG5cdGhkci53cml0ZV9zaGlmdCg0LCAweDMyMzYzMjM3KTtcblx0aGRyLndyaXRlX3NoaWZ0KDE2LCBDRkIudXRpbHMuY29uc3RzLkhFQURFUl9DTFNJRCwgXCJoZXhcIik7XG5cdGhkci53cml0ZV9zaGlmdCg0LCAoZW50cmllczIgPyAyIDogMSkpO1xuXHRoZHIud3JpdGVfc2hpZnQoMTYsIGNsc2lkLCBcImhleFwiKTtcblx0aGRyLndyaXRlX3NoaWZ0KDQsIChlbnRyaWVzMiA/IDY4IDogNDgpKTtcblx0dmFyIHBzMCA9IHdyaXRlX1Byb3BlcnR5U2V0KGVudHJpZXMsIFJFLCBQSURTSSk7XG5cdGJ1ZnMucHVzaChwczApO1xuXG5cdGlmKGVudHJpZXMyKSB7XG5cdFx0dmFyIHBzMSA9IHdyaXRlX1Byb3BlcnR5U2V0KGVudHJpZXMyLCBudWxsLCBudWxsKTtcblx0XHRoZHIud3JpdGVfc2hpZnQoMTYsIGNsc2lkMiwgXCJoZXhcIik7XG5cdFx0aGRyLndyaXRlX3NoaWZ0KDQsIDY4ICsgcHMwLmxlbmd0aCk7XG5cdFx0YnVmcy5wdXNoKHBzMSk7XG5cdH1cblx0cmV0dXJuIGJjb25jYXQoYnVmcyk7XG59XG5cbmZ1bmN0aW9uIHBhcnNlbm9vcDIoYmxvYiwgbGVuZ3RoKSB7IGJsb2IucmVhZF9zaGlmdChsZW5ndGgpOyByZXR1cm4gbnVsbDsgfVxuZnVuY3Rpb24gd3JpdGV6ZXJvZXMobiwgbykgeyBpZighbykgbz1uZXdfYnVmKG4pOyBmb3IodmFyIGo9MDsgajxuOyArK2opIG8ud3JpdGVfc2hpZnQoMSwgMCk7IHJldHVybiBvOyB9XG5cbmZ1bmN0aW9uIHBhcnNsdXJwKGJsb2IsIGxlbmd0aCwgY2IpIHtcblx0dmFyIGFyciA9IFtdLCB0YXJnZXQgPSBibG9iLmwgKyBsZW5ndGg7XG5cdHdoaWxlKGJsb2IubCA8IHRhcmdldCkgYXJyLnB1c2goY2IoYmxvYiwgdGFyZ2V0IC0gYmxvYi5sKSk7XG5cdGlmKHRhcmdldCAhPT0gYmxvYi5sKSB0aHJvdyBuZXcgRXJyb3IoXCJTbHVycCBlcnJvclwiKTtcblx0cmV0dXJuIGFycjtcbn1cblxuZnVuY3Rpb24gcGFyc2Vib29sKGJsb2IsIGxlbmd0aCkgeyByZXR1cm4gYmxvYi5yZWFkX3NoaWZ0KGxlbmd0aCkgPT09IDB4MTsgfVxuZnVuY3Rpb24gd3JpdGVib29sKHYsIG8pIHsgaWYoIW8pIG89bmV3X2J1ZigyKTsgby53cml0ZV9zaGlmdCgyLCArISF2KTsgcmV0dXJuIG87IH1cblxuZnVuY3Rpb24gcGFyc2V1aW50MTYoYmxvYikgeyByZXR1cm4gYmxvYi5yZWFkX3NoaWZ0KDIsICd1Jyk7IH1cbmZ1bmN0aW9uIHdyaXRldWludDE2KHYsIG8pIHsgaWYoIW8pIG89bmV3X2J1ZigyKTsgby53cml0ZV9zaGlmdCgyLCB2KTsgcmV0dXJuIG87IH1cbmZ1bmN0aW9uIHBhcnNldWludDE2YShibG9iLCBsZW5ndGgpIHsgcmV0dXJuIHBhcnNsdXJwKGJsb2IsbGVuZ3RoLHBhcnNldWludDE2KTt9XG5cbi8qIC0tLSAyLjUgU3RydWN0dXJlcyAtLS0gKi9cblxuLyogW01TLVhMU10gMi41LjEwIEJlcyAoYm9vbGVhbiBvciBlcnJvcikgKi9cbmZ1bmN0aW9uIHBhcnNlX0JlcyhibG9iKSB7XG5cdHZhciB2ID0gYmxvYi5yZWFkX3NoaWZ0KDEpLCB0ID0gYmxvYi5yZWFkX3NoaWZ0KDEpO1xuXHRyZXR1cm4gdCA9PT0gMHgwMSA/IHYgOiB2ID09PSAweDAxO1xufVxuZnVuY3Rpb24gd3JpdGVfQmVzKHYsIHQsIG8pIHtcblx0aWYoIW8pIG8gPSBuZXdfYnVmKDIpO1xuXHRvLndyaXRlX3NoaWZ0KDEsICt2KTtcblx0by53cml0ZV9zaGlmdCgxLCAoKHQgPT0gJ2UnKSA/IDEgOiAwKSk7XG5cdHJldHVybiBvO1xufVxuXG4vKiBbTVMtWExTXSAyLjUuMjQwIFNob3J0WExVbmljb2RlU3RyaW5nICovXG5mdW5jdGlvbiBwYXJzZV9TaG9ydFhMVW5pY29kZVN0cmluZyhibG9iLCBsZW5ndGgsIG9wdHMpIHtcblx0dmFyIGNjaCA9IGJsb2IucmVhZF9zaGlmdChvcHRzICYmIG9wdHMuYmlmZiA+PSAxMiA/IDIgOiAxKTtcblx0dmFyIGVuY29kaW5nID0gJ3NiY3MtY29udCc7XG5cdHZhciBjcCA9IGN1cnJlbnRfY29kZXBhZ2U7XG5cdGlmKG9wdHMgJiYgb3B0cy5iaWZmID49IDgpIGN1cnJlbnRfY29kZXBhZ2UgPSAxMjAwO1xuXHRpZighb3B0cyB8fCBvcHRzLmJpZmYgPT0gOCApIHtcblx0XHR2YXIgZkhpZ2hCeXRlID0gYmxvYi5yZWFkX3NoaWZ0KDEpO1xuXHRcdGlmKGZIaWdoQnl0ZSkgeyBlbmNvZGluZyA9ICdkYmNzLWNvbnQnOyB9XG5cdH0gZWxzZSBpZihvcHRzLmJpZmYgPT0gMTIpIHtcblx0XHRlbmNvZGluZyA9ICd3c3RyJztcblx0fVxuXHRpZihvcHRzLmJpZmYgPj0gMiAmJiBvcHRzLmJpZmYgPD0gNSkgZW5jb2RpbmcgPSAnY3BzdHInO1xuXHR2YXIgbyA9IGNjaCA/IGJsb2IucmVhZF9zaGlmdChjY2gsIGVuY29kaW5nKSA6IFwiXCI7XG5cdGN1cnJlbnRfY29kZXBhZ2UgPSBjcDtcblx0cmV0dXJuIG87XG59XG5cbi8qIDIuNS4yOTMgWExVbmljb2RlUmljaEV4dGVuZGVkU3RyaW5nICovXG5mdW5jdGlvbiBwYXJzZV9YTFVuaWNvZGVSaWNoRXh0ZW5kZWRTdHJpbmcoYmxvYikge1xuXHR2YXIgY3AgPSBjdXJyZW50X2NvZGVwYWdlO1xuXHRjdXJyZW50X2NvZGVwYWdlID0gMTIwMDtcblx0dmFyIGNjaCA9IGJsb2IucmVhZF9zaGlmdCgyKSwgZmxhZ3MgPSBibG9iLnJlYWRfc2hpZnQoMSk7XG5cdHZhciAvKmZIaWdoQnl0ZSA9IGZsYWdzICYgMHgxLCovIGZFeHRTdCA9IGZsYWdzICYgMHg0LCBmUmljaFN0ID0gZmxhZ3MgJiAweDg7XG5cdHZhciB3aWR0aCA9IDEgKyAoZmxhZ3MgJiAweDEpOyAvLyAweDAgLT4gdXRmOCwgMHgxIC0+IGRiY3Ncblx0dmFyIGNSdW4gPSAwLCBjYkV4dFJzdDtcblx0dmFyIHogPSB7fTtcblx0aWYoZlJpY2hTdCkgY1J1biA9IGJsb2IucmVhZF9zaGlmdCgyKTtcblx0aWYoZkV4dFN0KSBjYkV4dFJzdCA9IGJsb2IucmVhZF9zaGlmdCg0KTtcblx0dmFyIGVuY29kaW5nID0gd2lkdGggPT0gMiA/ICdkYmNzLWNvbnQnIDogJ3NiY3MtY29udCc7XG5cdHZhciBtc2cgPSBjY2ggPT09IDAgPyBcIlwiIDogYmxvYi5yZWFkX3NoaWZ0KGNjaCwgZW5jb2RpbmcpO1xuXHRpZihmUmljaFN0KSBibG9iLmwgKz0gNCAqIGNSdW47IC8vVE9ETzogcGFyc2UgdGhpc1xuXHRpZihmRXh0U3QpIGJsb2IubCArPSBjYkV4dFJzdDsgLy9UT0RPOiBwYXJzZSB0aGlzXG5cdHoudCA9IG1zZztcblx0aWYoIWZSaWNoU3QpIHsgei5yYXcgPSBcIjx0PlwiICsgei50ICsgXCI8L3Q+XCI7IHouciA9IHoudDsgfVxuXHRjdXJyZW50X2NvZGVwYWdlID0gY3A7XG5cdHJldHVybiB6O1xufVxuZnVuY3Rpb24gd3JpdGVfWExVbmljb2RlUmljaEV4dGVuZGVkU3RyaW5nKHhsc3RyKSB7XG5cdHZhciBzdHIgPSAoeGxzdHIudHx8XCJcIiksIG5mbXRzID0gMTtcblxuXHR2YXIgaGRyID0gbmV3X2J1ZigzICsgKG5mbXRzID4gMSA/IDIgOiAwKSk7XG5cdGhkci53cml0ZV9zaGlmdCgyLCBzdHIubGVuZ3RoKTtcblx0aGRyLndyaXRlX3NoaWZ0KDEsIChuZm10cyA+IDEgPyAweDA4IDogMHgwMCkgfCAweDAxKTtcblx0aWYobmZtdHMgPiAxKSBoZHIud3JpdGVfc2hpZnQoMiwgbmZtdHMpO1xuXG5cdHZhciBvdGV4dCA9IG5ld19idWYoMiAqIHN0ci5sZW5ndGgpO1xuXHRvdGV4dC53cml0ZV9zaGlmdCgyICogc3RyLmxlbmd0aCwgc3RyLCAndXRmMTZsZScpO1xuXG5cdHZhciBvdXQgPSBbaGRyLCBvdGV4dF07XG5cblx0cmV0dXJuIGJjb25jYXQob3V0KTtcbn1cblxuLyogMi41LjI5NiBYTFVuaWNvZGVTdHJpbmdOb0NjaCAqL1xuZnVuY3Rpb24gcGFyc2VfWExVbmljb2RlU3RyaW5nTm9DY2goYmxvYiwgY2NoLCBvcHRzKSB7XG5cdHZhciByZXR2YWw7XG5cdGlmKG9wdHMpIHtcblx0XHRpZihvcHRzLmJpZmYgPj0gMiAmJiBvcHRzLmJpZmYgPD0gNSkgcmV0dXJuIGJsb2IucmVhZF9zaGlmdChjY2gsICdjcHN0cicpO1xuXHRcdGlmKG9wdHMuYmlmZiA+PSAxMikgcmV0dXJuIGJsb2IucmVhZF9zaGlmdChjY2gsICdkYmNzLWNvbnQnKTtcblx0fVxuXHR2YXIgZkhpZ2hCeXRlID0gYmxvYi5yZWFkX3NoaWZ0KDEpO1xuXHRpZihmSGlnaEJ5dGU9PT0wKSB7IHJldHZhbCA9IGJsb2IucmVhZF9zaGlmdChjY2gsICdzYmNzLWNvbnQnKTsgfVxuXHRlbHNlIHsgcmV0dmFsID0gYmxvYi5yZWFkX3NoaWZ0KGNjaCwgJ2RiY3MtY29udCcpOyB9XG5cdHJldHVybiByZXR2YWw7XG59XG5cbi8qIDIuNS4yOTQgWExVbmljb2RlU3RyaW5nICovXG5mdW5jdGlvbiBwYXJzZV9YTFVuaWNvZGVTdHJpbmcoYmxvYiwgbGVuZ3RoLCBvcHRzKSB7XG5cdHZhciBjY2ggPSBibG9iLnJlYWRfc2hpZnQob3B0cyAmJiBvcHRzLmJpZmYgPT0gMiA/IDEgOiAyKTtcblx0aWYoY2NoID09PSAwKSB7IGJsb2IubCsrOyByZXR1cm4gXCJcIjsgfVxuXHRyZXR1cm4gcGFyc2VfWExVbmljb2RlU3RyaW5nTm9DY2goYmxvYiwgY2NoLCBvcHRzKTtcbn1cbi8qIEJJRkY1IG92ZXJyaWRlICovXG5mdW5jdGlvbiBwYXJzZV9YTFVuaWNvZGVTdHJpbmcyKGJsb2IsIGxlbmd0aCwgb3B0cykge1xuXHRpZihvcHRzLmJpZmYgPiA1KSByZXR1cm4gcGFyc2VfWExVbmljb2RlU3RyaW5nKGJsb2IsIGxlbmd0aCwgb3B0cyk7XG5cdHZhciBjY2ggPSBibG9iLnJlYWRfc2hpZnQoMSk7XG5cdGlmKGNjaCA9PT0gMCkgeyBibG9iLmwrKzsgcmV0dXJuIFwiXCI7IH1cblx0cmV0dXJuIGJsb2IucmVhZF9zaGlmdChjY2gsIChvcHRzLmJpZmYgPD0gNCB8fCAhYmxvYi5sZW5zICkgPyAnY3BzdHInIDogJ3NiY3MtY29udCcpO1xufVxuLyogVE9ETzogQklGRjUgYW5kIGxvd2VyLCBjb2RlcGFnZSBhd2FyZW5lc3MgKi9cbmZ1bmN0aW9uIHdyaXRlX1hMVW5pY29kZVN0cmluZyhzdHIsIG9wdHMsIG8pIHtcblx0aWYoIW8pIG8gPSBuZXdfYnVmKDMgKyAyICogc3RyLmxlbmd0aCk7XG5cdG8ud3JpdGVfc2hpZnQoMiwgc3RyLmxlbmd0aCk7XG5cdG8ud3JpdGVfc2hpZnQoMSwgMSk7XG5cdG8ud3JpdGVfc2hpZnQoMzEsIHN0ciwgJ3V0ZjE2bGUnKTtcblx0cmV0dXJuIG87XG59XG5cbi8qIFtNUy1YTFNdIDIuNS42MSBDb250cm9sSW5mbyAqL1xuZnVuY3Rpb24gcGFyc2VfQ29udHJvbEluZm8oYmxvYikge1xuXHR2YXIgZmxhZ3MgPSBibG9iLnJlYWRfc2hpZnQoMSk7XG5cdGJsb2IubCsrO1xuXHR2YXIgYWNjZWwgPSBibG9iLnJlYWRfc2hpZnQoMik7XG5cdGJsb2IubCArPSAyO1xuXHRyZXR1cm4gW2ZsYWdzLCBhY2NlbF07XG59XG5cbi8qIFtNUy1PU0hBUkVEXSAyLjMuNy42IFVSTE1vbmlrZXIgVE9ETzogZmxhZ3MgKi9cbmZ1bmN0aW9uIHBhcnNlX1VSTE1vbmlrZXIoYmxvYikge1xuXHR2YXIgbGVuID0gYmxvYi5yZWFkX3NoaWZ0KDQpLCBzdGFydCA9IGJsb2IubDtcblx0dmFyIGV4dHJhID0gZmFsc2U7XG5cdGlmKGxlbiA+IDI0KSB7XG5cdFx0LyogbG9vayBhaGVhZCAqL1xuXHRcdGJsb2IubCArPSBsZW4gLSAyNDtcblx0XHRpZihibG9iLnJlYWRfc2hpZnQoMTYpID09PSBcIjc5NTg4MWY0M2IxZDdmNDhhZjJjODI1ZGM0ODUyNzYzXCIpIGV4dHJhID0gdHJ1ZTtcblx0XHRibG9iLmwgPSBzdGFydDtcblx0fVxuXHR2YXIgdXJsID0gYmxvYi5yZWFkX3NoaWZ0KChleHRyYT9sZW4tMjQ6bGVuKT4+MSwgJ3V0ZjE2bGUnKS5yZXBsYWNlKGNocjAsXCJcIik7XG5cdGlmKGV4dHJhKSBibG9iLmwgKz0gMjQ7XG5cdHJldHVybiB1cmw7XG59XG5cbi8qIFtNUy1PU0hBUkVEXSAyLjMuNy44IEZpbGVNb25pa2VyIFRPRE86IGFsbCBmaWVsZHMgKi9cbmZ1bmN0aW9uIHBhcnNlX0ZpbGVNb25pa2VyKGJsb2IpIHtcblx0YmxvYi5sICs9IDI7IC8vdmFyIGNBbnRpID0gYmxvYi5yZWFkX3NoaWZ0KDIpO1xuXHR2YXIgYW5zaVBhdGggPSBibG9iLnJlYWRfc2hpZnQoMCwgJ2xwc3RyLWFuc2knKTtcblx0YmxvYi5sICs9IDI7IC8vdmFyIGVuZFNlcnZlciA9IGJsb2IucmVhZF9zaGlmdCgyKTtcblx0aWYoYmxvYi5yZWFkX3NoaWZ0KDIpICE9IDB4REVBRCkgdGhyb3cgbmV3IEVycm9yKFwiQmFkIEZpbGVNb25pa2VyXCIpO1xuXHR2YXIgc3ogPSBibG9iLnJlYWRfc2hpZnQoNCk7XG5cdGlmKHN6ID09PSAwKSByZXR1cm4gYW5zaVBhdGgucmVwbGFjZSgvXFxcXC9nLFwiL1wiKTtcblx0dmFyIGJ5dGVzID0gYmxvYi5yZWFkX3NoaWZ0KDQpO1xuXHRpZihibG9iLnJlYWRfc2hpZnQoMikgIT0gMykgdGhyb3cgbmV3IEVycm9yKFwiQmFkIEZpbGVNb25pa2VyXCIpO1xuXHR2YXIgdW5pY29kZVBhdGggPSBibG9iLnJlYWRfc2hpZnQoYnl0ZXM+PjEsICd1dGYxNmxlJykucmVwbGFjZShjaHIwLFwiXCIpO1xuXHRyZXR1cm4gdW5pY29kZVBhdGg7XG59XG5cbi8qIFtNUy1PU0hBUkVEXSAyLjMuNy4yIEh5cGVybGlua01vbmlrZXIgVE9ETzogYWxsIHRoZSBtb25pa2VycyAqL1xuZnVuY3Rpb24gcGFyc2VfSHlwZXJsaW5rTW9uaWtlcihibG9iLCBsZW5ndGgpIHtcblx0dmFyIGNsc2lkID0gYmxvYi5yZWFkX3NoaWZ0KDE2KTsgbGVuZ3RoIC09IDE2O1xuXHRzd2l0Y2goY2xzaWQpIHtcblx0XHRjYXNlIFwiZTBjOWVhNzlmOWJhY2UxMThjODIwMGFhMDA0YmE5MGJcIjogcmV0dXJuIHBhcnNlX1VSTE1vbmlrZXIoYmxvYiwgbGVuZ3RoKTtcblx0XHRjYXNlIFwiMDMwMzAwMDAwMDAwMDAwMGMwMDAwMDAwMDAwMDAwNDZcIjogcmV0dXJuIHBhcnNlX0ZpbGVNb25pa2VyKGJsb2IsIGxlbmd0aCk7XG5cdFx0ZGVmYXVsdDogdGhyb3cgbmV3IEVycm9yKFwiVW5zdXBwb3J0ZWQgTW9uaWtlciBcIiArIGNsc2lkKTtcblx0fVxufVxuXG4vKiBbTVMtT1NIQVJFRF0gMi4zLjcuOSBIeXBlcmxpbmtTdHJpbmcgKi9cbmZ1bmN0aW9uIHBhcnNlX0h5cGVybGlua1N0cmluZyhibG9iKSB7XG5cdHZhciBsZW4gPSBibG9iLnJlYWRfc2hpZnQoNCk7XG5cdHZhciBvID0gbGVuID4gMCA/IGJsb2IucmVhZF9zaGlmdChsZW4sICd1dGYxNmxlJykucmVwbGFjZShjaHIwLCBcIlwiKSA6IFwiXCI7XG5cdHJldHVybiBvO1xufVxuXG4vKiBbTVMtT1NIQVJFRF0gMi4zLjcuMSBIeXBlcmxpbmsgT2JqZWN0ICovXG5mdW5jdGlvbiBwYXJzZV9IeXBlcmxpbmsoYmxvYiwgbGVuZ3RoKSB7XG5cdHZhciBlbmQgPSBibG9iLmwgKyBsZW5ndGg7XG5cdHZhciBzVmVyID0gYmxvYi5yZWFkX3NoaWZ0KDQpO1xuXHRpZihzVmVyICE9PSAyKSB0aHJvdyBuZXcgRXJyb3IoXCJVbnJlY29nbml6ZWQgc3RyZWFtVmVyc2lvbjogXCIgKyBzVmVyKTtcblx0dmFyIGZsYWdzID0gYmxvYi5yZWFkX3NoaWZ0KDIpO1xuXHRibG9iLmwgKz0gMjtcblx0dmFyIGRpc3BsYXlOYW1lLCB0YXJnZXRGcmFtZU5hbWUsIG1vbmlrZXIsIG9sZU1vbmlrZXIsIExvYz1cIlwiLCBndWlkLCBmaWxlVGltZTtcblx0aWYoZmxhZ3MgJiAweDAwMTApIGRpc3BsYXlOYW1lID0gcGFyc2VfSHlwZXJsaW5rU3RyaW5nKGJsb2IsIGVuZCAtIGJsb2IubCk7XG5cdGlmKGZsYWdzICYgMHgwMDgwKSB0YXJnZXRGcmFtZU5hbWUgPSBwYXJzZV9IeXBlcmxpbmtTdHJpbmcoYmxvYiwgZW5kIC0gYmxvYi5sKTtcblx0aWYoKGZsYWdzICYgMHgwMTAxKSA9PT0gMHgwMTAxKSBtb25pa2VyID0gcGFyc2VfSHlwZXJsaW5rU3RyaW5nKGJsb2IsIGVuZCAtIGJsb2IubCk7XG5cdGlmKChmbGFncyAmIDB4MDEwMSkgPT09IDB4MDAwMSkgb2xlTW9uaWtlciA9IHBhcnNlX0h5cGVybGlua01vbmlrZXIoYmxvYiwgZW5kIC0gYmxvYi5sKTtcblx0aWYoZmxhZ3MgJiAweDAwMDgpIExvYyA9IHBhcnNlX0h5cGVybGlua1N0cmluZyhibG9iLCBlbmQgLSBibG9iLmwpO1xuXHRpZihmbGFncyAmIDB4MDAyMCkgZ3VpZCA9IGJsb2IucmVhZF9zaGlmdCgxNik7XG5cdGlmKGZsYWdzICYgMHgwMDQwKSBmaWxlVGltZSA9IHBhcnNlX0ZJTEVUSU1FKGJsb2IvKiwgOCovKTtcblx0YmxvYi5sID0gZW5kO1xuXHR2YXIgdGFyZ2V0ID0gdGFyZ2V0RnJhbWVOYW1lfHxtb25pa2VyfHxvbGVNb25pa2VyfHxcIlwiO1xuXHRpZih0YXJnZXQgJiYgTG9jKSB0YXJnZXQrPVwiI1wiK0xvYztcblx0aWYoIXRhcmdldCkgdGFyZ2V0ID0gXCIjXCIgKyBMb2M7XG5cdHZhciBvdXQgPSAoe1RhcmdldDp0YXJnZXR9KTtcblx0aWYoZ3VpZCkgb3V0Lmd1aWQgPSBndWlkO1xuXHRpZihmaWxlVGltZSkgb3V0LnRpbWUgPSBmaWxlVGltZTtcblx0aWYoZGlzcGxheU5hbWUpIG91dC5Ub29sdGlwID0gZGlzcGxheU5hbWU7XG5cdHJldHVybiBvdXQ7XG59XG5mdW5jdGlvbiB3cml0ZV9IeXBlcmxpbmsoaGwpIHtcblx0dmFyIG91dCA9IG5ld19idWYoNTEyKSwgaSA9IDA7XG5cdHZhciBUYXJnZXQgPSBobC5UYXJnZXQ7XG5cdHZhciBGID0gVGFyZ2V0LmluZGV4T2YoXCIjXCIpID4gLTEgPyAweDFmIDogMHgxNztcblx0c3dpdGNoKFRhcmdldC5jaGFyQXQoMCkpIHsgY2FzZSBcIiNcIjogRj0weDFjOyBicmVhazsgY2FzZSBcIi5cIjogRiY9fjI7IGJyZWFrOyB9XG5cdG91dC53cml0ZV9zaGlmdCg0LDIpOyBvdXQud3JpdGVfc2hpZnQoNCwgRik7XG5cdHZhciBkYXRhID0gWzgsNjgxNTgyNyw2NjE5MjM3LDQ4NDk3ODAsODNdOyBmb3IoaSA9IDA7IGkgPCBkYXRhLmxlbmd0aDsgKytpKSBvdXQud3JpdGVfc2hpZnQoNCwgZGF0YVtpXSk7XG5cdGlmKEYgPT0gMHgxQykge1xuXHRcdFRhcmdldCA9IFRhcmdldC5zbGljZSgxKTtcblx0XHRvdXQud3JpdGVfc2hpZnQoNCwgVGFyZ2V0Lmxlbmd0aCArIDEpO1xuXHRcdGZvcihpID0gMDsgaSA8IFRhcmdldC5sZW5ndGg7ICsraSkgb3V0LndyaXRlX3NoaWZ0KDIsIFRhcmdldC5jaGFyQ29kZUF0KGkpKTtcblx0XHRvdXQud3JpdGVfc2hpZnQoMiwgMCk7XG5cdH0gZWxzZSBpZihGICYgMHgwMikge1xuXHRcdGRhdGEgPSBcImUwIGM5IGVhIDc5IGY5IGJhIGNlIDExIDhjIDgyIDAwIGFhIDAwIDRiIGE5IDBiXCIuc3BsaXQoXCIgXCIpO1xuXHRcdGZvcihpID0gMDsgaSA8IGRhdGEubGVuZ3RoOyArK2kpIG91dC53cml0ZV9zaGlmdCgxLCBwYXJzZUludChkYXRhW2ldLCAxNikpO1xuXHRcdG91dC53cml0ZV9zaGlmdCg0LCAyKihUYXJnZXQubGVuZ3RoICsgMSkpO1xuXHRcdGZvcihpID0gMDsgaSA8IFRhcmdldC5sZW5ndGg7ICsraSkgb3V0LndyaXRlX3NoaWZ0KDIsIFRhcmdldC5jaGFyQ29kZUF0KGkpKTtcblx0XHRvdXQud3JpdGVfc2hpZnQoMiwgMCk7XG5cdH0gZWxzZSB7XG5cdFx0ZGF0YSA9IFwiMDMgMDMgMDAgMDAgMDAgMDAgMDAgMDAgYzAgMDAgMDAgMDAgMDAgMDAgMDAgNDZcIi5zcGxpdChcIiBcIik7XG5cdFx0Zm9yKGkgPSAwOyBpIDwgZGF0YS5sZW5ndGg7ICsraSkgb3V0LndyaXRlX3NoaWZ0KDEsIHBhcnNlSW50KGRhdGFbaV0sIDE2KSk7XG5cdFx0dmFyIFAgPSAwO1xuXHRcdHdoaWxlKFRhcmdldC5zbGljZShQKjMsUCozKzMpPT1cIi4uL1wifHxUYXJnZXQuc2xpY2UoUCozLFAqMyszKT09XCIuLlxcXFxcIikgKytQO1xuXHRcdG91dC53cml0ZV9zaGlmdCgyLCBQKTtcblx0XHRvdXQud3JpdGVfc2hpZnQoNCwgVGFyZ2V0Lmxlbmd0aCArIDEpO1xuXHRcdGZvcihpID0gMDsgaSA8IFRhcmdldC5sZW5ndGg7ICsraSkgb3V0LndyaXRlX3NoaWZ0KDEsIFRhcmdldC5jaGFyQ29kZUF0KGkpICYgMHhGRik7XG5cdFx0b3V0LndyaXRlX3NoaWZ0KDEsIDApO1xuXHRcdG91dC53cml0ZV9zaGlmdCgyLCAweEZGRkYpO1xuXHRcdG91dC53cml0ZV9zaGlmdCgyLCAweERFQUQpO1xuXHRcdGZvcihpID0gMDsgaSA8IDY7ICsraSkgb3V0LndyaXRlX3NoaWZ0KDQsIDApO1xuXHR9XG5cdHJldHVybiBvdXQuc2xpY2UoMCwgb3V0LmwpO1xufVxuXG4vKiAyLjUuMTc4IExvbmdSR0JBICovXG5mdW5jdGlvbiBwYXJzZV9Mb25nUkdCQShibG9iKSB7IHZhciByID0gYmxvYi5yZWFkX3NoaWZ0KDEpLCBnID0gYmxvYi5yZWFkX3NoaWZ0KDEpLCBiID0gYmxvYi5yZWFkX3NoaWZ0KDEpLCBhID0gYmxvYi5yZWFkX3NoaWZ0KDEpOyByZXR1cm4gW3IsZyxiLGFdOyB9XG5cbi8qIDIuNS4xNzcgTG9uZ1JHQiAqL1xuZnVuY3Rpb24gcGFyc2VfTG9uZ1JHQihibG9iLCBsZW5ndGgpIHsgdmFyIHggPSBwYXJzZV9Mb25nUkdCQShibG9iLCBsZW5ndGgpOyB4WzNdID0gMDsgcmV0dXJuIHg7IH1cblxuXG4vKiBbTVMtWExTXSAyLjUuMTkgKi9cbmZ1bmN0aW9uIHBhcnNlX1hMU0NlbGwoYmxvYikge1xuXHR2YXIgcncgPSBibG9iLnJlYWRfc2hpZnQoMik7IC8vIDAtaW5kZXhlZFxuXHR2YXIgY29sID0gYmxvYi5yZWFkX3NoaWZ0KDIpO1xuXHR2YXIgaXhmZSA9IGJsb2IucmVhZF9zaGlmdCgyKTtcblx0cmV0dXJuICh7cjpydywgYzpjb2wsIGl4ZmU6aXhmZX0pO1xufVxuZnVuY3Rpb24gd3JpdGVfWExTQ2VsbChSLCBDLCBpeGZlLCBvKSB7XG5cdGlmKCFvKSBvID0gbmV3X2J1Zig2KTtcblx0by53cml0ZV9zaGlmdCgyLCBSKTtcblx0by53cml0ZV9zaGlmdCgyLCBDKTtcblx0by53cml0ZV9zaGlmdCgyLCBpeGZlfHwwKTtcblx0cmV0dXJuIG87XG59XG5cbi8qIFtNUy1YTFNdIDIuNS4xMzQgKi9cbmZ1bmN0aW9uIHBhcnNlX2ZydEhlYWRlcihibG9iKSB7XG5cdHZhciBydCA9IGJsb2IucmVhZF9zaGlmdCgyKTtcblx0dmFyIGZsYWdzID0gYmxvYi5yZWFkX3NoaWZ0KDIpOyAvLyBUT0RPOiBwYXJzZSB0aGVzZSBmbGFnc1xuXHRibG9iLmwgKz0gODtcblx0cmV0dXJuIHt0eXBlOiBydCwgZmxhZ3M6IGZsYWdzfTtcbn1cblxuXG5cbmZ1bmN0aW9uIHBhcnNlX09wdFhMVW5pY29kZVN0cmluZyhibG9iLCBsZW5ndGgsIG9wdHMpIHsgcmV0dXJuIGxlbmd0aCA9PT0gMCA/IFwiXCIgOiBwYXJzZV9YTFVuaWNvZGVTdHJpbmcyKGJsb2IsIGxlbmd0aCwgb3B0cyk7IH1cblxuLyogW01TLVhMU10gMi41LjM0NCAqL1xuZnVuY3Rpb24gcGFyc2VfWFRJKGJsb2IsIGxlbmd0aCwgb3B0cykge1xuXHR2YXIgdyA9IG9wdHMuYmlmZiA+IDggPyA0IDogMjtcblx0dmFyIGlTdXBCb29rID0gYmxvYi5yZWFkX3NoaWZ0KHcpLCBpdGFiRmlyc3QgPSBibG9iLnJlYWRfc2hpZnQodywnaScpLCBpdGFiTGFzdCA9IGJsb2IucmVhZF9zaGlmdCh3LCdpJyk7XG5cdHJldHVybiBbaVN1cEJvb2ssIGl0YWJGaXJzdCwgaXRhYkxhc3RdO1xufVxuXG4vKiBbTVMtWExTXSAyLjUuMjE4ICovXG5mdW5jdGlvbiBwYXJzZV9Sa1JlYyhibG9iKSB7XG5cdHZhciBpeGZlID0gYmxvYi5yZWFkX3NoaWZ0KDIpO1xuXHR2YXIgUksgPSBwYXJzZV9Sa051bWJlcihibG9iKTtcblx0cmV0dXJuIFtpeGZlLCBSS107XG59XG5cbi8qIFtNUy1YTFNdIDIuNS4xICovXG5mdW5jdGlvbiBwYXJzZV9BZGRpblVkZihibG9iLCBsZW5ndGgsIG9wdHMpIHtcblx0YmxvYi5sICs9IDQ7IGxlbmd0aCAtPSA0O1xuXHR2YXIgbCA9IGJsb2IubCArIGxlbmd0aDtcblx0dmFyIHVkZk5hbWUgPSBwYXJzZV9TaG9ydFhMVW5pY29kZVN0cmluZyhibG9iLCBsZW5ndGgsIG9wdHMpO1xuXHR2YXIgY2IgPSBibG9iLnJlYWRfc2hpZnQoMik7XG5cdGwgLT0gYmxvYi5sO1xuXHRpZihjYiAhPT0gbCkgdGhyb3cgbmV3IEVycm9yKFwiTWFsZm9ybWVkIEFkZGluVWRmOiBwYWRkaW5nID0gXCIgKyBsICsgXCIgIT0gXCIgKyBjYik7XG5cdGJsb2IubCArPSBjYjtcblx0cmV0dXJuIHVkZk5hbWU7XG59XG5cbi8qIFtNUy1YTFNdIDIuNS4yMDkgVE9ETzogQ2hlY2sgc2l6ZXMgKi9cbmZ1bmN0aW9uIHBhcnNlX1JlZjhVKGJsb2IpIHtcblx0dmFyIHJ3Rmlyc3QgPSBibG9iLnJlYWRfc2hpZnQoMik7XG5cdHZhciByd0xhc3QgPSBibG9iLnJlYWRfc2hpZnQoMik7XG5cdHZhciBjb2xGaXJzdCA9IGJsb2IucmVhZF9zaGlmdCgyKTtcblx0dmFyIGNvbExhc3QgPSBibG9iLnJlYWRfc2hpZnQoMik7XG5cdHJldHVybiB7czp7Yzpjb2xGaXJzdCwgcjpyd0ZpcnN0fSwgZTp7Yzpjb2xMYXN0LHI6cndMYXN0fX07XG59XG5mdW5jdGlvbiB3cml0ZV9SZWY4VShyLCBvKSB7XG5cdGlmKCFvKSBvID0gbmV3X2J1Zig4KTtcblx0by53cml0ZV9zaGlmdCgyLCByLnMucik7XG5cdG8ud3JpdGVfc2hpZnQoMiwgci5lLnIpO1xuXHRvLndyaXRlX3NoaWZ0KDIsIHIucy5jKTtcblx0by53cml0ZV9zaGlmdCgyLCByLmUuYyk7XG5cdHJldHVybiBvO1xufVxuXG4vKiBbTVMtWExTXSAyLjUuMjExICovXG5mdW5jdGlvbiBwYXJzZV9SZWZVKGJsb2IpIHtcblx0dmFyIHJ3Rmlyc3QgPSBibG9iLnJlYWRfc2hpZnQoMik7XG5cdHZhciByd0xhc3QgPSBibG9iLnJlYWRfc2hpZnQoMik7XG5cdHZhciBjb2xGaXJzdCA9IGJsb2IucmVhZF9zaGlmdCgxKTtcblx0dmFyIGNvbExhc3QgPSBibG9iLnJlYWRfc2hpZnQoMSk7XG5cdHJldHVybiB7czp7Yzpjb2xGaXJzdCwgcjpyd0ZpcnN0fSwgZTp7Yzpjb2xMYXN0LHI6cndMYXN0fX07XG59XG5cbi8qIFtNUy1YTFNdIDIuNS4yMDcgKi9cbnZhciBwYXJzZV9SZWYgPSBwYXJzZV9SZWZVO1xuXG4vKiBbTVMtWExTXSAyLjUuMTQzICovXG5mdW5jdGlvbiBwYXJzZV9GdENtbyhibG9iKSB7XG5cdGJsb2IubCArPSA0O1xuXHR2YXIgb3QgPSBibG9iLnJlYWRfc2hpZnQoMik7XG5cdHZhciBpZCA9IGJsb2IucmVhZF9zaGlmdCgyKTtcblx0dmFyIGZsYWdzID0gYmxvYi5yZWFkX3NoaWZ0KDIpO1xuXHRibG9iLmwrPTEyO1xuXHRyZXR1cm4gW2lkLCBvdCwgZmxhZ3NdO1xufVxuXG4vKiBbTVMtWExTXSAyLjUuMTQ5ICovXG5mdW5jdGlvbiBwYXJzZV9GdE50cyhibG9iKSB7XG5cdHZhciBvdXQgPSB7fTtcblx0YmxvYi5sICs9IDQ7XG5cdGJsb2IubCArPSAxNjsgLy8gR1VJRCBUT0RPXG5cdG91dC5mU2hhcmVkTm90ZSA9IGJsb2IucmVhZF9zaGlmdCgyKTtcblx0YmxvYi5sICs9IDQ7XG5cdHJldHVybiBvdXQ7XG59XG5cbi8qIFtNUy1YTFNdIDIuNS4xNDIgKi9cbmZ1bmN0aW9uIHBhcnNlX0Z0Q2YoYmxvYikge1xuXHR2YXIgb3V0ID0ge307XG5cdGJsb2IubCArPSA0O1xuXHRibG9iLmNmID0gYmxvYi5yZWFkX3NoaWZ0KDIpO1xuXHRyZXR1cm4gb3V0O1xufVxuXG4vKiBbTVMtWExTXSAyLjUuMTQwIC0gMi41LjE1NCBhbmQgZnJpZW5kcyAqL1xuZnVuY3Rpb24gcGFyc2VfRnRTa2lwKGJsb2IpIHsgYmxvYi5sICs9IDI7IGJsb2IubCArPSBibG9iLnJlYWRfc2hpZnQoMik7IH1cbnZhciBGdFRhYiA9IHtcbjB4MDA6IHBhcnNlX0Z0U2tpcCwgICAgICAvKiBGdEVuZCAqL1xuMHgwNDogcGFyc2VfRnRTa2lwLCAgICAgIC8qIEZ0TWFjcm8gKi9cbjB4MDU6IHBhcnNlX0Z0U2tpcCwgICAgICAvKiBGdEJ1dHRvbiAqL1xuMHgwNjogcGFyc2VfRnRTa2lwLCAgICAgIC8qIEZ0R21vICovXG4weDA3OiBwYXJzZV9GdENmLCAgICAgICAgLyogRnRDZiAqL1xuMHgwODogcGFyc2VfRnRTa2lwLCAgICAgIC8qIEZ0UGlvR3JiaXQgKi9cbjB4MDk6IHBhcnNlX0Z0U2tpcCwgICAgICAvKiBGdFBpY3RGbWxhICovXG4weDBBOiBwYXJzZV9GdFNraXAsICAgICAgLyogRnRDYmxzICovXG4weDBCOiBwYXJzZV9GdFNraXAsICAgICAgLyogRnRSYm8gKi9cbjB4MEM6IHBhcnNlX0Z0U2tpcCwgICAgICAvKiBGdFNicyAqL1xuMHgwRDogcGFyc2VfRnROdHMsICAgICAgIC8qIEZ0TnRzICovXG4weDBFOiBwYXJzZV9GdFNraXAsICAgICAgLyogRnRTYnNGbWxhICovXG4weDBGOiBwYXJzZV9GdFNraXAsICAgICAgLyogRnRHYm9EYXRhICovXG4weDEwOiBwYXJzZV9GdFNraXAsICAgICAgLyogRnRFZG9EYXRhICovXG4weDExOiBwYXJzZV9GdFNraXAsICAgICAgLyogRnRSYm9EYXRhICovXG4weDEyOiBwYXJzZV9GdFNraXAsICAgICAgLyogRnRDYmxzRGF0YSAqL1xuMHgxMzogcGFyc2VfRnRTa2lwLCAgICAgIC8qIEZ0TGJzRGF0YSAqL1xuMHgxNDogcGFyc2VfRnRTa2lwLCAgICAgIC8qIEZ0Q2Jsc0ZtbGEgKi9cbjB4MTU6IHBhcnNlX0Z0Q21vXG59O1xuZnVuY3Rpb24gcGFyc2VfRnRBcnJheShibG9iLCBsZW5ndGgpIHtcblx0dmFyIHRndCA9IGJsb2IubCArIGxlbmd0aDtcblx0dmFyIGZ0cyA9IFtdO1xuXHR3aGlsZShibG9iLmwgPCB0Z3QpIHtcblx0XHR2YXIgZnQgPSBibG9iLnJlYWRfc2hpZnQoMik7XG5cdFx0YmxvYi5sLT0yO1xuXHRcdHRyeSB7XG5cdFx0XHRmdHMucHVzaChGdFRhYltmdF0oYmxvYiwgdGd0IC0gYmxvYi5sKSk7XG5cdFx0fSBjYXRjaChlKSB7IGJsb2IubCA9IHRndDsgcmV0dXJuIGZ0czsgfVxuXHR9XG5cdGlmKGJsb2IubCAhPSB0Z3QpIGJsb2IubCA9IHRndDsgLy90aHJvdyBuZXcgRXJyb3IoXCJiYWQgT2JqZWN0IEZ0LXNlcXVlbmNlXCIpO1xuXHRyZXR1cm4gZnRzO1xufVxuXG4vKiAtLS0gMi40IFJlY29yZHMgLS0tICovXG5cbi8qIFtNUy1YTFNdIDIuNC4yMSAqL1xuZnVuY3Rpb24gcGFyc2VfQk9GKGJsb2IsIGxlbmd0aCkge1xuXHR2YXIgbyA9IHtCSUZGVmVyOjAsIGR0OjB9O1xuXHRvLkJJRkZWZXIgPSBibG9iLnJlYWRfc2hpZnQoMik7IGxlbmd0aCAtPSAyO1xuXHRpZihsZW5ndGggPj0gMikgeyBvLmR0ID0gYmxvYi5yZWFkX3NoaWZ0KDIpOyBibG9iLmwgLT0gMjsgfVxuXHRzd2l0Y2goby5CSUZGVmVyKSB7XG5cdFx0Y2FzZSAweDA2MDA6IC8qIEJJRkY4ICovXG5cdFx0Y2FzZSAweDA1MDA6IC8qIEJJRkY1ICovXG5cdFx0Y2FzZSAweDA0MDA6IC8qIEJJRkY0ICovXG5cdFx0Y2FzZSAweDAzMDA6IC8qIEJJRkYzICovXG5cdFx0Y2FzZSAweDAyMDA6IC8qIEJJRkYyICovXG5cdFx0Y2FzZSAweDAwMDI6IGNhc2UgMHgwMDA3OiAvKiBCSUZGMiAqL1xuXHRcdFx0YnJlYWs7XG5cdFx0ZGVmYXVsdDogaWYobGVuZ3RoID4gNikgdGhyb3cgbmV3IEVycm9yKFwiVW5leHBlY3RlZCBCSUZGIFZlciBcIiArIG8uQklGRlZlcik7XG5cdH1cblxuXHRibG9iLnJlYWRfc2hpZnQobGVuZ3RoKTtcblx0cmV0dXJuIG87XG59XG5mdW5jdGlvbiB3cml0ZV9CT0Yod2IsIHQsIG8pIHtcblx0dmFyIGggPSAweDA2MDAsIHcgPSAxNjtcblx0c3dpdGNoKG8uYm9va1R5cGUpIHtcblx0XHRjYXNlICdiaWZmOCc6IGJyZWFrO1xuXHRcdGNhc2UgJ2JpZmY1JzogaCA9IDB4MDUwMDsgdyA9IDg7IGJyZWFrO1xuXHRcdGNhc2UgJ2JpZmY0JzogaCA9IDB4MDAwNDsgdyA9IDY7IGJyZWFrO1xuXHRcdGNhc2UgJ2JpZmYzJzogaCA9IDB4MDAwMzsgdyA9IDY7IGJyZWFrO1xuXHRcdGNhc2UgJ2JpZmYyJzogaCA9IDB4MDAwMjsgdyA9IDQ7IGJyZWFrO1xuXHRcdGNhc2UgJ3hsYSc6IGJyZWFrO1xuXHRcdGRlZmF1bHQ6IHRocm93IG5ldyBFcnJvcihcInVuc3VwcG9ydGVkIEJJRkYgdmVyc2lvblwiKTtcblx0fVxuXHR2YXIgb3V0ID0gbmV3X2J1Zih3KTtcblx0b3V0LndyaXRlX3NoaWZ0KDIsIGgpO1xuXHRvdXQud3JpdGVfc2hpZnQoMiwgdCk7XG5cdGlmKHcgPiA0KSBvdXQud3JpdGVfc2hpZnQoMiwgMHg3MjYyKTtcblx0aWYodyA+IDYpIG91dC53cml0ZV9zaGlmdCgyLCAweDA3Q0QpO1xuXHRpZih3ID4gOCkge1xuXHRcdG91dC53cml0ZV9zaGlmdCgyLCAweEMwMDkpO1xuXHRcdG91dC53cml0ZV9zaGlmdCgyLCAweDAwMDEpO1xuXHRcdG91dC53cml0ZV9zaGlmdCgyLCAweDA3MDYpO1xuXHRcdG91dC53cml0ZV9zaGlmdCgyLCAweDAwMDApO1xuXHR9XG5cdHJldHVybiBvdXQ7XG59XG5cblxuLyogW01TLVhMU10gMi40LjE0NiAqL1xuZnVuY3Rpb24gcGFyc2VfSW50ZXJmYWNlSGRyKGJsb2IsIGxlbmd0aCkge1xuXHRpZihsZW5ndGggPT09IDApIHJldHVybiAweDA0YjA7XG5cdGlmKChibG9iLnJlYWRfc2hpZnQoMikpIT09MHgwNGIwKXsvKiBlbXB0eSAqL31cblx0cmV0dXJuIDB4MDRiMDtcbn1cblxuXG4vKiBbTVMtWExTXSAyLjQuMzQ5ICovXG5mdW5jdGlvbiBwYXJzZV9Xcml0ZUFjY2VzcyhibG9iLCBsZW5ndGgsIG9wdHMpIHtcblx0aWYob3B0cy5lbmMpIHsgYmxvYi5sICs9IGxlbmd0aDsgcmV0dXJuIFwiXCI7IH1cblx0dmFyIGwgPSBibG9iLmw7XG5cdC8vIFRPRE86IG1ha2Ugc3VyZSBYTFVuaWNvZGVTdHJpbmcgZG9lc250IG92ZXJydW5cblx0dmFyIFVzZXJOYW1lID0gcGFyc2VfWExVbmljb2RlU3RyaW5nMihibG9iLCAwLCBvcHRzKTtcblx0YmxvYi5yZWFkX3NoaWZ0KGxlbmd0aCArIGwgLSBibG9iLmwpO1xuXHRyZXR1cm4gVXNlck5hbWU7XG59XG5mdW5jdGlvbiB3cml0ZV9Xcml0ZUFjY2VzcyhzLCBvcHRzKSB7XG5cdHZhciBiOCA9ICFvcHRzIHx8IG9wdHMuYmlmZiA9PSA4O1xuXHR2YXIgbyA9IG5ld19idWYoYjggPyAxMTIgOiA1NCk7XG5cdG8ud3JpdGVfc2hpZnQob3B0cy5iaWZmID09IDggPyAyIDogMSwgNyk7XG5cdGlmKGI4KSBvLndyaXRlX3NoaWZ0KDEsIDApO1xuXHRvLndyaXRlX3NoaWZ0KDQsIDB4MzMzMzY4NTMpO1xuXHRvLndyaXRlX3NoaWZ0KDQsICgweDAwNTM0QTc0IHwgKGI4ID8gMCA6IDB4MjAwMDAwMDApKSk7XG5cdHdoaWxlKG8ubCA8IG8ubGVuZ3RoKSBvLndyaXRlX3NoaWZ0KDEsIChiOCA/IDAgOiAzMikpO1xuXHRyZXR1cm4gbztcbn1cblxuLyogW01TLVhMU10gMi40LjM1MSAqL1xuZnVuY3Rpb24gcGFyc2VfV3NCb29sKGJsb2IsIGxlbmd0aCwgb3B0cykge1xuXHR2YXIgZmxhZ3MgPSBvcHRzICYmIG9wdHMuYmlmZiA9PSA4IHx8IGxlbmd0aCA9PSAyID8gYmxvYi5yZWFkX3NoaWZ0KDIpIDogKGJsb2IubCArPSBsZW5ndGgsIDApO1xuXHRyZXR1cm4geyBmRGlhbG9nOiBmbGFncyAmIDB4MTAgfTtcbn1cblxuLyogW01TLVhMU10gMi40LjI4ICovXG5mdW5jdGlvbiBwYXJzZV9Cb3VuZFNoZWV0OChibG9iLCBsZW5ndGgsIG9wdHMpIHtcblx0dmFyIHBvcyA9IGJsb2IucmVhZF9zaGlmdCg0KTtcblx0dmFyIGhpZGRlbiA9IGJsb2IucmVhZF9zaGlmdCgxKSAmIDB4MDM7XG5cdHZhciBkdCA9IGJsb2IucmVhZF9zaGlmdCgxKTtcblx0c3dpdGNoKGR0KSB7XG5cdFx0Y2FzZSAwOiBkdCA9ICdXb3Jrc2hlZXQnOyBicmVhaztcblx0XHRjYXNlIDE6IGR0ID0gJ01hY3Jvc2hlZXQnOyBicmVhaztcblx0XHRjYXNlIDI6IGR0ID0gJ0NoYXJ0c2hlZXQnOyBicmVhaztcblx0XHRjYXNlIDY6IGR0ID0gJ1ZCQU1vZHVsZSc7IGJyZWFrO1xuXHR9XG5cdHZhciBuYW1lID0gcGFyc2VfU2hvcnRYTFVuaWNvZGVTdHJpbmcoYmxvYiwgMCwgb3B0cyk7XG5cdGlmKG5hbWUubGVuZ3RoID09PSAwKSBuYW1lID0gXCJTaGVldDFcIjtcblx0cmV0dXJuIHsgcG9zOnBvcywgaHM6aGlkZGVuLCBkdDpkdCwgbmFtZTpuYW1lIH07XG59XG5mdW5jdGlvbiB3cml0ZV9Cb3VuZFNoZWV0OChkYXRhLCBvcHRzKSB7XG5cdHZhciB3ID0gKCFvcHRzIHx8IG9wdHMuYmlmZiA+PSA4ID8gMiA6IDEpO1xuXHR2YXIgbyA9IG5ld19idWYoOCArIHcgKiBkYXRhLm5hbWUubGVuZ3RoKTtcblx0by53cml0ZV9zaGlmdCg0LCBkYXRhLnBvcyk7XG5cdG8ud3JpdGVfc2hpZnQoMSwgZGF0YS5ocyB8fCAwKTtcblx0by53cml0ZV9zaGlmdCgxLCBkYXRhLmR0KTtcblx0by53cml0ZV9zaGlmdCgxLCBkYXRhLm5hbWUubGVuZ3RoKTtcblx0aWYob3B0cy5iaWZmID49IDgpIG8ud3JpdGVfc2hpZnQoMSwgMSk7XG5cdG8ud3JpdGVfc2hpZnQodyAqIGRhdGEubmFtZS5sZW5ndGgsIGRhdGEubmFtZSwgb3B0cy5iaWZmIDwgOCA/ICdzYmNzJyA6ICd1dGYxNmxlJyk7XG5cdHZhciBvdXQgPSBvLnNsaWNlKDAsIG8ubCk7XG5cdG91dC5sID0gby5sOyByZXR1cm4gb3V0O1xufVxuXG4vKiBbTVMtWExTXSAyLjQuMjY1IFRPRE8gKi9cbmZ1bmN0aW9uIHBhcnNlX1NTVChibG9iLCBsZW5ndGgpIHtcblx0dmFyIGVuZCA9IGJsb2IubCArIGxlbmd0aDtcblx0dmFyIGNudCA9IGJsb2IucmVhZF9zaGlmdCg0KTtcblx0dmFyIHVjbnQgPSBibG9iLnJlYWRfc2hpZnQoNCk7XG5cdHZhciBzdHJzID0gKFtdKTtcblx0Zm9yKHZhciBpID0gMDsgaSAhPSB1Y250ICYmIGJsb2IubCA8IGVuZDsgKytpKSB7XG5cdFx0c3Rycy5wdXNoKHBhcnNlX1hMVW5pY29kZVJpY2hFeHRlbmRlZFN0cmluZyhibG9iKSk7XG5cdH1cblx0c3Rycy5Db3VudCA9IGNudDsgc3Rycy5VbmlxdWUgPSB1Y250O1xuXHRyZXR1cm4gc3Rycztcbn1cbmZ1bmN0aW9uIHdyaXRlX1NTVChzc3QsIG9wdHMpIHtcblx0dmFyIGhlYWRlciA9IG5ld19idWYoOCk7XG5cdGhlYWRlci53cml0ZV9zaGlmdCg0LCBzc3QuQ291bnQpO1xuXHRoZWFkZXIud3JpdGVfc2hpZnQoNCwgc3N0LlVuaXF1ZSk7XG5cdHZhciBzdHJzID0gW107XG5cdGZvcih2YXIgaiA9IDA7IGogPCBzc3QubGVuZ3RoOyArK2opIHN0cnNbal0gPSB3cml0ZV9YTFVuaWNvZGVSaWNoRXh0ZW5kZWRTdHJpbmcoc3N0W2pdLCBvcHRzKTtcblx0dmFyIG8gPSBiY29uY2F0KFtoZWFkZXJdLmNvbmNhdChzdHJzKSk7XG5vLnBhcnRzID0gW2hlYWRlci5sZW5ndGhdLmNvbmNhdChzdHJzLm1hcChmdW5jdGlvbihzdHIpIHsgcmV0dXJuIHN0ci5sZW5ndGg7IH0pKTtcblx0cmV0dXJuIG87XG59XG5cbi8qIFtNUy1YTFNdIDIuNC4xMDcgKi9cbmZ1bmN0aW9uIHBhcnNlX0V4dFNTVChibG9iLCBsZW5ndGgpIHtcblx0dmFyIGV4dHNzdCA9IHt9O1xuXHRleHRzc3QuZHNzdCA9IGJsb2IucmVhZF9zaGlmdCgyKTtcblx0YmxvYi5sICs9IGxlbmd0aC0yO1xuXHRyZXR1cm4gZXh0c3N0O1xufVxuXG5cbi8qIFtNUy1YTFNdIDIuNC4yMjEgVE9ETzogY2hlY2sgQklGRjItNCAqL1xuZnVuY3Rpb24gcGFyc2VfUm93KGJsb2IpIHtcblx0dmFyIHogPSAoe30pO1xuXHR6LnIgPSBibG9iLnJlYWRfc2hpZnQoMik7XG5cdHouYyA9IGJsb2IucmVhZF9zaGlmdCgyKTtcblx0ei5jbnQgPSBibG9iLnJlYWRfc2hpZnQoMikgLSB6LmM7XG5cdHZhciBtaXlSdyA9IGJsb2IucmVhZF9zaGlmdCgyKTtcblx0YmxvYi5sICs9IDQ7IC8vIHJlc2VydmVkKDIpLCB1bnVzZWQoMilcblx0dmFyIGZsYWdzID0gYmxvYi5yZWFkX3NoaWZ0KDEpOyAvLyB2YXJpb3VzIGZsYWdzXG5cdGJsb2IubCArPSAzOyAvLyByZXNlcnZlZCg4KSwgaXhmZSgxMiksIGZsYWdzKDQpXG5cdGlmKGZsYWdzICYgMHgwNykgei5sZXZlbCA9IGZsYWdzICYgMHgwNztcblx0Ly8gY29sbGFwc2VkOiBmbGFncyAmIDB4MTBcblx0aWYoZmxhZ3MgJiAweDIwKSB6LmhpZGRlbiA9IHRydWU7XG5cdGlmKGZsYWdzICYgMHg0MCkgei5ocHQgPSBtaXlSdyAvIDIwO1xuXHRyZXR1cm4gejtcbn1cblxuXG4vKiBbTVMtWExTXSAyLjQuMTI1ICovXG5mdW5jdGlvbiBwYXJzZV9Gb3JjZUZ1bGxDYWxjdWxhdGlvbihibG9iKSB7XG5cdHZhciBoZWFkZXIgPSBwYXJzZV9mcnRIZWFkZXIoYmxvYik7XG5cdGlmKGhlYWRlci50eXBlICE9IDB4MDhBMykgdGhyb3cgbmV3IEVycm9yKFwiSW52YWxpZCBGdXR1cmUgUmVjb3JkIFwiICsgaGVhZGVyLnR5cGUpO1xuXHR2YXIgZnVsbGNhbGMgPSBibG9iLnJlYWRfc2hpZnQoNCk7XG5cdHJldHVybiBmdWxsY2FsYyAhPT0gMHgwO1xufVxuXG5cblxuXG5cbi8qIFtNUy1YTFNdIDIuNC4yMTUgcnQgKi9cbmZ1bmN0aW9uIHBhcnNlX1JlY2FsY0lkKGJsb2IpIHtcblx0YmxvYi5yZWFkX3NoaWZ0KDIpO1xuXHRyZXR1cm4gYmxvYi5yZWFkX3NoaWZ0KDQpO1xufVxuXG4vKiBbTVMtWExTXSAyLjQuODcgKi9cbmZ1bmN0aW9uIHBhcnNlX0RlZmF1bHRSb3dIZWlnaHQoYmxvYiwgbGVuZ3RoLCBvcHRzKSB7XG5cdHZhciBmID0gMDtcblx0aWYoIShvcHRzICYmIG9wdHMuYmlmZiA9PSAyKSkge1xuXHRcdGYgPSBibG9iLnJlYWRfc2hpZnQoMik7XG5cdH1cblx0dmFyIG1peVJ3ID0gYmxvYi5yZWFkX3NoaWZ0KDIpO1xuXHRpZigob3B0cyAmJiBvcHRzLmJpZmYgPT0gMikpIHtcblx0XHRmID0gMSAtIChtaXlSdyA+PiAxNSk7IG1peVJ3ICY9IDB4N2ZmZjtcblx0fVxuXHR2YXIgZmwgPSB7VW5zeW5jZWQ6ZiYxLER5WmVybzooZiYyKT4+MSxFeEFzYzooZiY0KT4+MixFeERzYzooZiY4KT4+M307XG5cdHJldHVybiBbZmwsIG1peVJ3XTtcbn1cblxuLyogW01TLVhMU10gMi40LjM0NSBUT0RPICovXG5mdW5jdGlvbiBwYXJzZV9XaW5kb3cxKGJsb2IpIHtcblx0dmFyIHhXbiA9IGJsb2IucmVhZF9zaGlmdCgyKSwgeVduID0gYmxvYi5yZWFkX3NoaWZ0KDIpLCBkeFduID0gYmxvYi5yZWFkX3NoaWZ0KDIpLCBkeVduID0gYmxvYi5yZWFkX3NoaWZ0KDIpO1xuXHR2YXIgZmxhZ3MgPSBibG9iLnJlYWRfc2hpZnQoMiksIGlUYWJDdXIgPSBibG9iLnJlYWRfc2hpZnQoMiksIGlUYWJGaXJzdCA9IGJsb2IucmVhZF9zaGlmdCgyKTtcblx0dmFyIGN0YWJTZWwgPSBibG9iLnJlYWRfc2hpZnQoMiksIHdUYWJSYXRpbyA9IGJsb2IucmVhZF9zaGlmdCgyKTtcblx0cmV0dXJuIHsgUG9zOiBbeFduLCB5V25dLCBEaW06IFtkeFduLCBkeVduXSwgRmxhZ3M6IGZsYWdzLCBDdXJUYWI6IGlUYWJDdXIsXG5cdFx0Rmlyc3RUYWI6IGlUYWJGaXJzdCwgU2VsZWN0ZWQ6IGN0YWJTZWwsIFRhYlJhdGlvOiB3VGFiUmF0aW8gfTtcbn1cbmZ1bmN0aW9uIHdyaXRlX1dpbmRvdzEoKSB7XG5cdHZhciBvID0gbmV3X2J1ZigxOCk7XG5cdG8ud3JpdGVfc2hpZnQoMiwgMCk7XG5cdG8ud3JpdGVfc2hpZnQoMiwgMCk7XG5cdG8ud3JpdGVfc2hpZnQoMiwgMHg3MjYwKTtcblx0by53cml0ZV9zaGlmdCgyLCAweDQ0YzApO1xuXHRvLndyaXRlX3NoaWZ0KDIsIDB4MzgpO1xuXHRvLndyaXRlX3NoaWZ0KDIsIDApO1xuXHRvLndyaXRlX3NoaWZ0KDIsIDApO1xuXHRvLndyaXRlX3NoaWZ0KDIsIDEpO1xuXHRvLndyaXRlX3NoaWZ0KDIsIDB4MDFmNCk7XG5cdHJldHVybiBvO1xufVxuLyogW01TLVhMU10gMi40LjM0NiBUT0RPICovXG5mdW5jdGlvbiBwYXJzZV9XaW5kb3cyKGJsb2IsIGxlbmd0aCwgb3B0cykge1xuXHRpZihvcHRzICYmIG9wdHMuYmlmZiA+PSAyICYmIG9wdHMuYmlmZiA8IDUpIHJldHVybiB7fTtcblx0dmFyIGYgPSBibG9iLnJlYWRfc2hpZnQoMik7XG5cdHJldHVybiB7IFJUTDogZiAmIDB4NDAgfTtcbn1cbmZ1bmN0aW9uIHdyaXRlX1dpbmRvdzIodmlldykge1xuXHR2YXIgbyA9IG5ld19idWYoMTgpLCBmID0gMHg2YjY7XG5cdGlmKHZpZXcgJiYgdmlldy5SVEwpIGYgfD0gMHg0MDtcblx0by53cml0ZV9zaGlmdCgyLCBmKTtcblx0by53cml0ZV9zaGlmdCg0LCAwKTtcblx0by53cml0ZV9zaGlmdCg0LCA2NCk7XG5cdG8ud3JpdGVfc2hpZnQoNCwgMCk7XG5cdG8ud3JpdGVfc2hpZnQoNCwgMCk7XG5cdHJldHVybiBvO1xufVxuXG4vKiBbTVMtWExTXSAyLjQuMTg5IFRPRE8gKi9cbmZ1bmN0aW9uIHBhcnNlX1BhbmUoLypibG9iLCBsZW5ndGgsIG9wdHMqLykge1xufVxuXG4vKiBbTVMtWExTXSAyLjQuMTIyIFRPRE8gKi9cbmZ1bmN0aW9uIHBhcnNlX0ZvbnQoYmxvYiwgbGVuZ3RoLCBvcHRzKSB7XG5cdHZhciBvID0ge1xuXHRcdGR5SGVpZ2h0OiBibG9iLnJlYWRfc2hpZnQoMiksXG5cdFx0Zmw6IGJsb2IucmVhZF9zaGlmdCgyKVxuXHR9O1xuXHRzd2l0Y2goKG9wdHMgJiYgb3B0cy5iaWZmKSB8fCA4KSB7XG5cdFx0Y2FzZSAyOiBicmVhaztcblx0XHRjYXNlIDM6IGNhc2UgNDogYmxvYi5sICs9IDI7IGJyZWFrO1xuXHRcdGRlZmF1bHQ6IGJsb2IubCArPSAxMDsgYnJlYWs7XG5cdH1cblx0by5uYW1lID0gcGFyc2VfU2hvcnRYTFVuaWNvZGVTdHJpbmcoYmxvYiwgMCwgb3B0cyk7XG5cdHJldHVybiBvO1xufVxuZnVuY3Rpb24gd3JpdGVfRm9udChkYXRhLCBvcHRzKSB7XG5cdHZhciBuYW1lID0gZGF0YS5uYW1lIHx8IFwiQXJpYWxcIjtcblx0dmFyIGI1ID0gKG9wdHMgJiYgKG9wdHMuYmlmZiA9PSA1KSksIHcgPSAoYjUgPyAoMTUgKyBuYW1lLmxlbmd0aCkgOiAoMTYgKyAyICogbmFtZS5sZW5ndGgpKTtcblx0dmFyIG8gPSBuZXdfYnVmKHcpO1xuXHRvLndyaXRlX3NoaWZ0KDIsIChkYXRhLnN6IHx8IDEyKSAqIDIwKTtcblx0by53cml0ZV9zaGlmdCg0LCAwKTtcblx0by53cml0ZV9zaGlmdCgyLCA0MDApO1xuXHRvLndyaXRlX3NoaWZ0KDQsIDApO1xuXHRvLndyaXRlX3NoaWZ0KDIsIDApO1xuXHRvLndyaXRlX3NoaWZ0KDEsIG5hbWUubGVuZ3RoKTtcblx0aWYoIWI1KSBvLndyaXRlX3NoaWZ0KDEsIDEpO1xuXHRvLndyaXRlX3NoaWZ0KChiNSA/IDEgOiAyKSAqIG5hbWUubGVuZ3RoLCBuYW1lLCAoYjUgPyBcInNiY3NcIiA6IFwidXRmMTZsZVwiKSk7XG5cdHJldHVybiBvO1xufVxuXG4vKiBbTVMtWExTXSAyLjQuMTQ5ICovXG5mdW5jdGlvbiBwYXJzZV9MYWJlbFNzdChibG9iKSB7XG5cdHZhciBjZWxsID0gcGFyc2VfWExTQ2VsbChibG9iKTtcblx0Y2VsbC5pc3N0ID0gYmxvYi5yZWFkX3NoaWZ0KDQpO1xuXHRyZXR1cm4gY2VsbDtcbn1cbmZ1bmN0aW9uIHdyaXRlX0xhYmVsU3N0KFIsIEMsIHYsIG9zICkge1xuXHR2YXIgbyA9IG5ld19idWYoMTApO1xuXHR3cml0ZV9YTFNDZWxsKFIsIEMsIG9zLCBvKTtcblx0by53cml0ZV9zaGlmdCg0LCB2KTtcblx0cmV0dXJuIG87XG59XG5cbi8qIFtNUy1YTFNdIDIuNC4xNDggKi9cbmZ1bmN0aW9uIHBhcnNlX0xhYmVsKGJsb2IsIGxlbmd0aCwgb3B0cykge1xuXHR2YXIgdGFyZ2V0ID0gYmxvYi5sICsgbGVuZ3RoO1xuXHR2YXIgY2VsbCA9IHBhcnNlX1hMU0NlbGwoYmxvYiwgNik7XG5cdGlmKG9wdHMuYmlmZiA9PSAyKSBibG9iLmwrKztcblx0dmFyIHN0ciA9IHBhcnNlX1hMVW5pY29kZVN0cmluZyhibG9iLCB0YXJnZXQgLSBibG9iLmwsIG9wdHMpO1xuXHRjZWxsLnZhbCA9IHN0cjtcblx0cmV0dXJuIGNlbGw7XG59XG5mdW5jdGlvbiB3cml0ZV9MYWJlbChSLCBDLCB2LCBvcywgb3B0cykge1xuXHR2YXIgYjggPSAhb3B0cyB8fCBvcHRzLmJpZmYgPT0gODtcblx0dmFyIG8gPSBuZXdfYnVmKDYgKyAyICsgKCtiOCkgKyAoMSArIGI4KSAqIHYubGVuZ3RoKTtcblx0d3JpdGVfWExTQ2VsbChSLCBDLCBvcywgbyk7XG5cdG8ud3JpdGVfc2hpZnQoMiwgdi5sZW5ndGgpO1xuXHRpZihiOCkgby53cml0ZV9zaGlmdCgxLCAxKTtcblx0by53cml0ZV9zaGlmdCgoMSArIGI4KSAqIHYubGVuZ3RoLCB2LCBiOCA/ICd1dGYxNmxlJyA6ICdzYmNzJyk7XG5cdHJldHVybiBvO1xufVxuXG5cbi8qIFtNUy1YTFNdIDIuNC4xMjYgTnVtYmVyIEZvcm1hdHMgKi9cbmZ1bmN0aW9uIHBhcnNlX0Zvcm1hdChibG9iLCBsZW5ndGgsIG9wdHMpIHtcblx0dmFyIG51bUZtdElkID0gYmxvYi5yZWFkX3NoaWZ0KDIpO1xuXHR2YXIgZm10c3RyID0gcGFyc2VfWExVbmljb2RlU3RyaW5nMihibG9iLCAwLCBvcHRzKTtcblx0cmV0dXJuIFtudW1GbXRJZCwgZm10c3RyXTtcbn1cbmZ1bmN0aW9uIHdyaXRlX0Zvcm1hdChpLCBmLCBvcHRzLCBvKSB7XG5cdHZhciBiNSA9IChvcHRzICYmIChvcHRzLmJpZmYgPT0gNSkpO1xuXHRpZighbykgbyA9IG5ld19idWYoYjUgPyAoMyArIGYubGVuZ3RoKSA6ICg1ICsgMiAqIGYubGVuZ3RoKSk7XG5cdG8ud3JpdGVfc2hpZnQoMiwgaSk7XG5cdG8ud3JpdGVfc2hpZnQoKGI1ID8gMSA6IDIpLCBmLmxlbmd0aCk7XG5cdGlmKCFiNSkgby53cml0ZV9zaGlmdCgxLCAxKTtcblx0by53cml0ZV9zaGlmdCgoYjUgPyAxIDogMikgKiBmLmxlbmd0aCwgZiwgKGI1ID8gJ3NiY3MnIDogJ3V0ZjE2bGUnKSk7XG5cdHZhciBvdXQgPSAoby5sZW5ndGggPiBvLmwpID8gby5zbGljZSgwLCBvLmwpIDogbztcblx0aWYob3V0LmwgPT0gbnVsbCkgb3V0LmwgPSBvdXQubGVuZ3RoO1xuXHRyZXR1cm4gb3V0O1xufVxudmFyIHBhcnNlX0JJRkYyRm9ybWF0ID0gcGFyc2VfWExVbmljb2RlU3RyaW5nMjtcblxuLyogW01TLVhMU10gMi40LjkwICovXG5mdW5jdGlvbiBwYXJzZV9EaW1lbnNpb25zKGJsb2IsIGxlbmd0aCwgb3B0cykge1xuXHR2YXIgZW5kID0gYmxvYi5sICsgbGVuZ3RoO1xuXHR2YXIgdyA9IG9wdHMuYmlmZiA9PSA4IHx8ICFvcHRzLmJpZmYgPyA0IDogMjtcblx0dmFyIHIgPSBibG9iLnJlYWRfc2hpZnQodyksIFIgPSBibG9iLnJlYWRfc2hpZnQodyk7XG5cdHZhciBjID0gYmxvYi5yZWFkX3NoaWZ0KDIpLCBDID0gYmxvYi5yZWFkX3NoaWZ0KDIpO1xuXHRibG9iLmwgPSBlbmQ7XG5cdHJldHVybiB7czoge3I6ciwgYzpjfSwgZToge3I6UiwgYzpDfX07XG59XG5mdW5jdGlvbiB3cml0ZV9EaW1lbnNpb25zKHJhbmdlLCBvcHRzKSB7XG5cdHZhciB3ID0gb3B0cy5iaWZmID09IDggfHwgIW9wdHMuYmlmZiA/IDQgOiAyO1xuXHR2YXIgbyA9IG5ld19idWYoMip3ICsgNik7XG5cdG8ud3JpdGVfc2hpZnQodywgcmFuZ2Uucy5yKTtcblx0by53cml0ZV9zaGlmdCh3LCByYW5nZS5lLnIgKyAxKTtcblx0by53cml0ZV9zaGlmdCgyLCByYW5nZS5zLmMpO1xuXHRvLndyaXRlX3NoaWZ0KDIsIHJhbmdlLmUuYyArIDEpO1xuXHRvLndyaXRlX3NoaWZ0KDIsIDApO1xuXHRyZXR1cm4gbztcbn1cblxuLyogW01TLVhMU10gMi40LjIyMCAqL1xuZnVuY3Rpb24gcGFyc2VfUksoYmxvYikge1xuXHR2YXIgcncgPSBibG9iLnJlYWRfc2hpZnQoMiksIGNvbCA9IGJsb2IucmVhZF9zaGlmdCgyKTtcblx0dmFyIHJrcmVjID0gcGFyc2VfUmtSZWMoYmxvYik7XG5cdHJldHVybiB7cjpydywgYzpjb2wsIGl4ZmU6cmtyZWNbMF0sIHJrbnVtOnJrcmVjWzFdfTtcbn1cblxuLyogW01TLVhMU10gMi40LjE3NSAqL1xuZnVuY3Rpb24gcGFyc2VfTXVsUmsoYmxvYiwgbGVuZ3RoKSB7XG5cdHZhciB0YXJnZXQgPSBibG9iLmwgKyBsZW5ndGggLSAyO1xuXHR2YXIgcncgPSBibG9iLnJlYWRfc2hpZnQoMiksIGNvbCA9IGJsb2IucmVhZF9zaGlmdCgyKTtcblx0dmFyIHJrcmVjcyA9IFtdO1xuXHR3aGlsZShibG9iLmwgPCB0YXJnZXQpIHJrcmVjcy5wdXNoKHBhcnNlX1JrUmVjKGJsb2IpKTtcblx0aWYoYmxvYi5sICE9PSB0YXJnZXQpIHRocm93IG5ldyBFcnJvcihcIk11bFJLIHJlYWQgZXJyb3JcIik7XG5cdHZhciBsYXN0Y29sID0gYmxvYi5yZWFkX3NoaWZ0KDIpO1xuXHRpZihya3JlY3MubGVuZ3RoICE9IGxhc3Rjb2wgLSBjb2wgKyAxKSB0aHJvdyBuZXcgRXJyb3IoXCJNdWxSSyBsZW5ndGggbWlzbWF0Y2hcIik7XG5cdHJldHVybiB7cjpydywgYzpjb2wsIEM6bGFzdGNvbCwgcmtyZWM6cmtyZWNzfTtcbn1cbi8qIFtNUy1YTFNdIDIuNC4xNzQgKi9cbmZ1bmN0aW9uIHBhcnNlX011bEJsYW5rKGJsb2IsIGxlbmd0aCkge1xuXHR2YXIgdGFyZ2V0ID0gYmxvYi5sICsgbGVuZ3RoIC0gMjtcblx0dmFyIHJ3ID0gYmxvYi5yZWFkX3NoaWZ0KDIpLCBjb2wgPSBibG9iLnJlYWRfc2hpZnQoMik7XG5cdHZhciBpeGZlcyA9IFtdO1xuXHR3aGlsZShibG9iLmwgPCB0YXJnZXQpIGl4ZmVzLnB1c2goYmxvYi5yZWFkX3NoaWZ0KDIpKTtcblx0aWYoYmxvYi5sICE9PSB0YXJnZXQpIHRocm93IG5ldyBFcnJvcihcIk11bEJsYW5rIHJlYWQgZXJyb3JcIik7XG5cdHZhciBsYXN0Y29sID0gYmxvYi5yZWFkX3NoaWZ0KDIpO1xuXHRpZihpeGZlcy5sZW5ndGggIT0gbGFzdGNvbCAtIGNvbCArIDEpIHRocm93IG5ldyBFcnJvcihcIk11bEJsYW5rIGxlbmd0aCBtaXNtYXRjaFwiKTtcblx0cmV0dXJuIHtyOnJ3LCBjOmNvbCwgQzpsYXN0Y29sLCBpeGZlOml4ZmVzfTtcbn1cblxuLyogW01TLVhMU10gMi41LjIwIDIuNS4yNDkgVE9ETzogaW50ZXJwcmV0IHZhbHVlcyBoZXJlICovXG5mdW5jdGlvbiBwYXJzZV9DZWxsU3R5bGVYRihibG9iLCBsZW5ndGgsIHN0eWxlLCBvcHRzKSB7XG5cdHZhciBvID0ge307XG5cdHZhciBhID0gYmxvYi5yZWFkX3NoaWZ0KDQpLCBiID0gYmxvYi5yZWFkX3NoaWZ0KDQpO1xuXHR2YXIgYyA9IGJsb2IucmVhZF9zaGlmdCg0KSwgZCA9IGJsb2IucmVhZF9zaGlmdCgyKTtcblx0by5wYXR0ZXJuVHlwZSA9IFhMU0ZpbGxQYXR0ZXJuW2MgPj4gMjZdO1xuXG5cdGlmKCFvcHRzLmNlbGxTdHlsZXMpIHJldHVybiBvO1xuXHRvLmFsYyA9IGEgJiAweDA3O1xuXHRvLmZXcmFwID0gKGEgPj4gMykgJiAweDAxO1xuXHRvLmFsY1YgPSAoYSA+PiA0KSAmIDB4MDc7XG5cdG8uZkp1c3RMYXN0ID0gKGEgPj4gNykgJiAweDAxO1xuXHRvLnRyb3QgPSAoYSA+PiA4KSAmIDB4RkY7XG5cdG8uY0luZGVudCA9IChhID4+IDE2KSAmIDB4MEY7XG5cdG8uZlNocmlua1RvRml0ID0gKGEgPj4gMjApICYgMHgwMTtcblx0by5pUmVhZE9yZGVyID0gKGEgPj4gMjIpICYgMHgwMjtcblx0by5mQXRyTnVtID0gKGEgPj4gMjYpICYgMHgwMTtcblx0by5mQXRyRm50ID0gKGEgPj4gMjcpICYgMHgwMTtcblx0by5mQXRyQWxjID0gKGEgPj4gMjgpICYgMHgwMTtcblx0by5mQXRyQmRyID0gKGEgPj4gMjkpICYgMHgwMTtcblx0by5mQXRyUGF0ID0gKGEgPj4gMzApICYgMHgwMTtcblx0by5mQXRyUHJvdCA9IChhID4+IDMxKSAmIDB4MDE7XG5cblx0by5kZ0xlZnQgPSBiICYgMHgwRjtcblx0by5kZ1JpZ2h0ID0gKGIgPj4gNCkgJiAweDBGO1xuXHRvLmRnVG9wID0gKGIgPj4gOCkgJiAweDBGO1xuXHRvLmRnQm90dG9tID0gKGIgPj4gMTIpICYgMHgwRjtcblx0by5pY3ZMZWZ0ID0gKGIgPj4gMTYpICYgMHg3Rjtcblx0by5pY3ZSaWdodCA9IChiID4+IDIzKSAmIDB4N0Y7XG5cdG8uZ3JiaXREaWFnID0gKGIgPj4gMzApICYgMHgwMztcblxuXHRvLmljdlRvcCA9IGMgJiAweDdGO1xuXHRvLmljdkJvdHRvbSA9IChjID4+IDcpICYgMHg3Rjtcblx0by5pY3ZEaWFnID0gKGMgPj4gMTQpICYgMHg3Rjtcblx0by5kZ0RpYWcgPSAoYyA+PiAyMSkgJiAweDBGO1xuXG5cdG8uaWN2Rm9yZSA9IGQgJiAweDdGO1xuXHRvLmljdkJhY2sgPSAoZCA+PiA3KSAmIDB4N0Y7XG5cdG8uZnN4QnV0dG9uID0gKGQgPj4gMTQpICYgMHgwMTtcblx0cmV0dXJuIG87XG59XG4vL2Z1bmN0aW9uIHBhcnNlX0NlbGxYRihibG9iLCBsZW5ndGgsIG9wdHMpIHtyZXR1cm4gcGFyc2VfQ2VsbFN0eWxlWEYoYmxvYixsZW5ndGgsMCwgb3B0cyk7fVxuLy9mdW5jdGlvbiBwYXJzZV9TdHlsZVhGKGJsb2IsIGxlbmd0aCwgb3B0cykge3JldHVybiBwYXJzZV9DZWxsU3R5bGVYRihibG9iLGxlbmd0aCwxLCBvcHRzKTt9XG5cbi8qIFtNUy1YTFNdIDIuNC4zNTMgVE9ETzogYWN0dWFsbHkgZG8gdGhpcyByaWdodCAqL1xuZnVuY3Rpb24gcGFyc2VfWEYoYmxvYiwgbGVuZ3RoLCBvcHRzKSB7XG5cdHZhciBvID0ge307XG5cdG8uaWZudCA9IGJsb2IucmVhZF9zaGlmdCgyKTsgby5udW1GbXRJZCA9IGJsb2IucmVhZF9zaGlmdCgyKTsgby5mbGFncyA9IGJsb2IucmVhZF9zaGlmdCgyKTtcblx0by5mU3R5bGUgPSAoby5mbGFncyA+PiAyKSAmIDB4MDE7XG5cdGxlbmd0aCAtPSA2O1xuXHRvLmRhdGEgPSBwYXJzZV9DZWxsU3R5bGVYRihibG9iLCBsZW5ndGgsIG8uZlN0eWxlLCBvcHRzKTtcblx0cmV0dXJuIG87XG59XG5mdW5jdGlvbiB3cml0ZV9YRihkYXRhLCBpeGZlUCwgb3B0cywgbykge1xuXHR2YXIgYjUgPSAob3B0cyAmJiAob3B0cy5iaWZmID09IDUpKTtcblx0aWYoIW8pIG8gPSBuZXdfYnVmKGI1ID8gMTYgOiAyMCk7XG5cdG8ud3JpdGVfc2hpZnQoMiwgMCk7XG5cdGlmKGRhdGEuc3R5bGUpIHtcblx0XHRvLndyaXRlX3NoaWZ0KDIsIChkYXRhLm51bUZtdElkfHwwKSk7XG5cdFx0by53cml0ZV9zaGlmdCgyLCAweEZGRjQpO1xuXHR9IGVsc2Uge1xuXHRcdG8ud3JpdGVfc2hpZnQoMiwgKGRhdGEubnVtRm10SWR8fDApKTtcblx0XHRvLndyaXRlX3NoaWZ0KDIsIChpeGZlUDw8NCkpO1xuXHR9XG5cdG8ud3JpdGVfc2hpZnQoNCwgMCk7XG5cdG8ud3JpdGVfc2hpZnQoNCwgMCk7XG5cdGlmKCFiNSkgby53cml0ZV9zaGlmdCg0LCAwKTtcblx0by53cml0ZV9zaGlmdCgyLCAwKTtcblx0cmV0dXJuIG87XG59XG5cbi8qIFtNUy1YTFNdIDIuNC4xMzQgKi9cbmZ1bmN0aW9uIHBhcnNlX0d1dHMoYmxvYikge1xuXHRibG9iLmwgKz0gNDtcblx0dmFyIG91dCA9IFtibG9iLnJlYWRfc2hpZnQoMiksIGJsb2IucmVhZF9zaGlmdCgyKV07XG5cdGlmKG91dFswXSAhPT0gMCkgb3V0WzBdLS07XG5cdGlmKG91dFsxXSAhPT0gMCkgb3V0WzFdLS07XG5cdGlmKG91dFswXSA+IDcgfHwgb3V0WzFdID4gNykgdGhyb3cgbmV3IEVycm9yKFwiQmFkIEd1dHRlcnM6IFwiICsgb3V0LmpvaW4oXCJ8XCIpKTtcblx0cmV0dXJuIG91dDtcbn1cbmZ1bmN0aW9uIHdyaXRlX0d1dHMoZ3V0cykge1xuXHR2YXIgbyA9IG5ld19idWYoOCk7XG5cdG8ud3JpdGVfc2hpZnQoNCwgMCk7XG5cdG8ud3JpdGVfc2hpZnQoMiwgZ3V0c1swXSA/IGd1dHNbMF0gKyAxIDogMCk7XG5cdG8ud3JpdGVfc2hpZnQoMiwgZ3V0c1sxXSA/IGd1dHNbMV0gKyAxIDogMCk7XG5cdHJldHVybiBvO1xufVxuXG4vKiBbTVMtWExTXSAyLjQuMjQgKi9cbmZ1bmN0aW9uIHBhcnNlX0Jvb2xFcnIoYmxvYiwgbGVuZ3RoLCBvcHRzKSB7XG5cdHZhciBjZWxsID0gcGFyc2VfWExTQ2VsbChibG9iLCA2KTtcblx0aWYob3B0cy5iaWZmID09IDIpICsrYmxvYi5sO1xuXHR2YXIgdmFsID0gcGFyc2VfQmVzKGJsb2IsIDIpO1xuXHRjZWxsLnZhbCA9IHZhbDtcblx0Y2VsbC50ID0gKHZhbCA9PT0gdHJ1ZSB8fCB2YWwgPT09IGZhbHNlKSA/ICdiJyA6ICdlJztcblx0cmV0dXJuIGNlbGw7XG59XG5mdW5jdGlvbiB3cml0ZV9Cb29sRXJyKFIsIEMsIHYsIG9zLCBvcHRzLCB0KSB7XG5cdHZhciBvID0gbmV3X2J1Zig4KTtcblx0d3JpdGVfWExTQ2VsbChSLCBDLCBvcywgbyk7XG5cdHdyaXRlX0Jlcyh2LCB0LCBvKTtcblx0cmV0dXJuIG87XG59XG5cbi8qIFtNUy1YTFNdIDIuNC4xODAgTnVtYmVyICovXG5mdW5jdGlvbiBwYXJzZV9OdW1iZXIoYmxvYikge1xuXHR2YXIgY2VsbCA9IHBhcnNlX1hMU0NlbGwoYmxvYiwgNik7XG5cdHZhciB4bnVtID0gcGFyc2VfWG51bShibG9iLCA4KTtcblx0Y2VsbC52YWwgPSB4bnVtO1xuXHRyZXR1cm4gY2VsbDtcbn1cbmZ1bmN0aW9uIHdyaXRlX051bWJlcihSLCBDLCB2LCBvcykge1xuXHR2YXIgbyA9IG5ld19idWYoMTQpO1xuXHR3cml0ZV9YTFNDZWxsKFIsIEMsIG9zLCBvKTtcblx0d3JpdGVfWG51bSh2LCBvKTtcblx0cmV0dXJuIG87XG59XG5cbnZhciBwYXJzZV9YTEhlYWRlckZvb3RlciA9IHBhcnNlX09wdFhMVW5pY29kZVN0cmluZzsgLy8gVE9ETzogcGFyc2UgMi40LjEzNlxuXG4vKiBbTVMtWExTXSAyLjQuMjcxICovXG5mdW5jdGlvbiBwYXJzZV9TdXBCb29rKGJsb2IsIGxlbmd0aCwgb3B0cykge1xuXHR2YXIgZW5kID0gYmxvYi5sICsgbGVuZ3RoO1xuXHR2YXIgY3RhYiA9IGJsb2IucmVhZF9zaGlmdCgyKTtcblx0dmFyIGNjaCA9IGJsb2IucmVhZF9zaGlmdCgyKTtcblx0b3B0cy5zYmNjaCA9IGNjaDtcblx0aWYoY2NoID09IDB4MDQwMSB8fCBjY2ggPT0gMHgzQTAxKSByZXR1cm4gW2NjaCwgY3RhYl07XG5cdGlmKGNjaCA8IDB4MDEgfHwgY2NoID4weGZmKSB0aHJvdyBuZXcgRXJyb3IoXCJVbmV4cGVjdGVkIFN1cEJvb2sgdHlwZTogXCIrY2NoKTtcblx0dmFyIHZpcnRQYXRoID0gcGFyc2VfWExVbmljb2RlU3RyaW5nTm9DY2goYmxvYiwgY2NoKTtcblx0LyogVE9ETzogMi41LjI3NyBWaXJ0dWFsIFBhdGggKi9cblx0dmFyIHJnc3QgPSBbXTtcblx0d2hpbGUoZW5kID4gYmxvYi5sKSByZ3N0LnB1c2gocGFyc2VfWExVbmljb2RlU3RyaW5nKGJsb2IpKTtcblx0cmV0dXJuIFtjY2gsIGN0YWIsIHZpcnRQYXRoLCByZ3N0XTtcbn1cblxuLyogW01TLVhMU10gMi40LjEwNSBUT0RPICovXG5mdW5jdGlvbiBwYXJzZV9FeHRlcm5OYW1lKGJsb2IsIGxlbmd0aCwgb3B0cykge1xuXHR2YXIgZmxhZ3MgPSBibG9iLnJlYWRfc2hpZnQoMik7XG5cdHZhciBib2R5O1xuXHR2YXIgbyA9ICh7XG5cdFx0ZkJ1aWx0SW46IGZsYWdzICYgMHgwMSxcblx0XHRmV2FudEFkdmlzZTogKGZsYWdzID4+PiAxKSAmIDB4MDEsXG5cdFx0ZldhbnRQaWN0OiAoZmxhZ3MgPj4+IDIpICYgMHgwMSxcblx0XHRmT2xlOiAoZmxhZ3MgPj4+IDMpICYgMHgwMSxcblx0XHRmT2xlTGluazogKGZsYWdzID4+PiA0KSAmIDB4MDEsXG5cdFx0Y2Y6IChmbGFncyA+Pj4gNSkgJiAweDNGRixcblx0XHRmSWNvbjogZmxhZ3MgPj4+IDE1ICYgMHgwMVxuXHR9KTtcblx0aWYob3B0cy5zYmNjaCA9PT0gMHgzQTAxKSBib2R5ID0gcGFyc2VfQWRkaW5VZGYoYmxvYiwgbGVuZ3RoLTIsIG9wdHMpO1xuXHQvL2Vsc2UgdGhyb3cgbmV3IEVycm9yKFwidW5zdXBwb3J0ZWQgU3VwQm9vayBjY2g6IFwiICsgb3B0cy5zYmNjaCk7XG5cdG8uYm9keSA9IGJvZHkgfHwgYmxvYi5yZWFkX3NoaWZ0KGxlbmd0aC0yKTtcblx0aWYodHlwZW9mIGJvZHkgPT09IFwic3RyaW5nXCIpIG8uTmFtZSA9IGJvZHk7XG5cdHJldHVybiBvO1xufVxuXG4vKiBbTVMtWExTXSAyLjQuMTUwIFRPRE8gKi9cbnZhciBYTFNMYmxCdWlsdEluID0gW1xuXHRcIl94bG5tLkNvbnNvbGlkYXRlX0FyZWFcIixcblx0XCJfeGxubS5BdXRvX09wZW5cIixcblx0XCJfeGxubS5BdXRvX0Nsb3NlXCIsXG5cdFwiX3hsbm0uRXh0cmFjdFwiLFxuXHRcIl94bG5tLkRhdGFiYXNlXCIsXG5cdFwiX3hsbm0uQ3JpdGVyaWFcIixcblx0XCJfeGxubS5QcmludF9BcmVhXCIsXG5cdFwiX3hsbm0uUHJpbnRfVGl0bGVzXCIsXG5cdFwiX3hsbm0uUmVjb3JkZXJcIixcblx0XCJfeGxubS5EYXRhX0Zvcm1cIixcblx0XCJfeGxubS5BdXRvX0FjdGl2YXRlXCIsXG5cdFwiX3hsbm0uQXV0b19EZWFjdGl2YXRlXCIsXG5cdFwiX3hsbm0uU2hlZXRfVGl0bGVcIixcblx0XCJfeGxubS5fRmlsdGVyRGF0YWJhc2VcIlxuXTtcbmZ1bmN0aW9uIHBhcnNlX0xibChibG9iLCBsZW5ndGgsIG9wdHMpIHtcblx0dmFyIHRhcmdldCA9IGJsb2IubCArIGxlbmd0aDtcblx0dmFyIGZsYWdzID0gYmxvYi5yZWFkX3NoaWZ0KDIpO1xuXHR2YXIgY2hLZXkgPSBibG9iLnJlYWRfc2hpZnQoMSk7XG5cdHZhciBjY2ggPSBibG9iLnJlYWRfc2hpZnQoMSk7XG5cdHZhciBjY2UgPSBibG9iLnJlYWRfc2hpZnQob3B0cyAmJiBvcHRzLmJpZmYgPT0gMiA/IDEgOiAyKTtcblx0dmFyIGl0YWIgPSAwO1xuXHRpZighb3B0cyB8fCBvcHRzLmJpZmYgPj0gNSkge1xuXHRcdGlmKG9wdHMuYmlmZiAhPSA1KSBibG9iLmwgKz0gMjtcblx0XHRpdGFiID0gYmxvYi5yZWFkX3NoaWZ0KDIpO1xuXHRcdGlmKG9wdHMuYmlmZiA9PSA1KSBibG9iLmwgKz0gMjtcblx0XHRibG9iLmwgKz0gNDtcblx0fVxuXHR2YXIgbmFtZSA9IHBhcnNlX1hMVW5pY29kZVN0cmluZ05vQ2NoKGJsb2IsIGNjaCwgb3B0cyk7XG5cdGlmKGZsYWdzICYgMHgyMCkgbmFtZSA9IFhMU0xibEJ1aWx0SW5bbmFtZS5jaGFyQ29kZUF0KDApXTtcblx0dmFyIG5wZmxlbiA9IHRhcmdldCAtIGJsb2IubDsgaWYob3B0cyAmJiBvcHRzLmJpZmYgPT0gMikgLS1ucGZsZW47XG5cdHZhciByZ2NlID0gKHRhcmdldCA9PSBibG9iLmwgfHwgY2NlID09PSAwIHx8ICEobnBmbGVuID4gMCkpID8gW10gOiBwYXJzZV9OYW1lUGFyc2VkRm9ybXVsYShibG9iLCBucGZsZW4sIG9wdHMsIGNjZSk7XG5cdHJldHVybiB7XG5cdFx0Y2hLZXk6IGNoS2V5LFxuXHRcdE5hbWU6IG5hbWUsXG5cdFx0aXRhYjogaXRhYixcblx0XHRyZ2NlOiByZ2NlXG5cdH07XG59XG5cbi8qIFtNUy1YTFNdIDIuNC4xMDYgVE9ETzogdmVyaWZ5IGZpbGVuYW1lIGVuY29kaW5nICovXG5mdW5jdGlvbiBwYXJzZV9FeHRlcm5TaGVldChibG9iLCBsZW5ndGgsIG9wdHMpIHtcblx0aWYob3B0cy5iaWZmIDwgOCkgcmV0dXJuIHBhcnNlX0JJRkY1RXh0ZXJuU2hlZXQoYmxvYiwgbGVuZ3RoLCBvcHRzKTtcblx0dmFyIG8gPSBbXSwgdGFyZ2V0ID0gYmxvYi5sICsgbGVuZ3RoLCBsZW4gPSBibG9iLnJlYWRfc2hpZnQob3B0cy5iaWZmID4gOCA/IDQgOiAyKTtcblx0d2hpbGUobGVuLS0gIT09IDApIG8ucHVzaChwYXJzZV9YVEkoYmxvYiwgb3B0cy5iaWZmID4gOCA/IDEyIDogNiwgb3B0cykpO1xuXHRcdC8vIFtpU3VwQm9vaywgaXRhYkZpcnN0LCBpdGFiTGFzdF07XG5cdGlmKGJsb2IubCAhPSB0YXJnZXQpIHRocm93IG5ldyBFcnJvcihcIkJhZCBFeHRlcm5TaGVldDogXCIgKyBibG9iLmwgKyBcIiAhPSBcIiArIHRhcmdldCk7XG5cdHJldHVybiBvO1xufVxuZnVuY3Rpb24gcGFyc2VfQklGRjVFeHRlcm5TaGVldChibG9iLCBsZW5ndGgsIG9wdHMpIHtcblx0aWYoYmxvYltibG9iLmwgKyAxXSA9PSAweDAzKSBibG9iW2Jsb2IubF0rKztcblx0dmFyIG8gPSBwYXJzZV9TaG9ydFhMVW5pY29kZVN0cmluZyhibG9iLCBsZW5ndGgsIG9wdHMpO1xuXHRyZXR1cm4gby5jaGFyQ29kZUF0KDApID09IDB4MDMgPyBvLnNsaWNlKDEpIDogbztcbn1cblxuLyogW01TLVhMU10gMi40LjE3NiBUT0RPOiBjaGVjayBvbGRlciBiaWZmICovXG5mdW5jdGlvbiBwYXJzZV9OYW1lQ210KGJsb2IsIGxlbmd0aCwgb3B0cykge1xuXHRpZihvcHRzLmJpZmYgPCA4KSB7IGJsb2IubCArPSBsZW5ndGg7IHJldHVybjsgfVxuXHR2YXIgY2NoTmFtZSA9IGJsb2IucmVhZF9zaGlmdCgyKTtcblx0dmFyIGNjaENvbW1lbnQgPSBibG9iLnJlYWRfc2hpZnQoMik7XG5cdHZhciBuYW1lID0gcGFyc2VfWExVbmljb2RlU3RyaW5nTm9DY2goYmxvYiwgY2NoTmFtZSwgb3B0cyk7XG5cdHZhciBjb21tZW50ID0gcGFyc2VfWExVbmljb2RlU3RyaW5nTm9DY2goYmxvYiwgY2NoQ29tbWVudCwgb3B0cyk7XG5cdHJldHVybiBbbmFtZSwgY29tbWVudF07XG59XG5cbi8qIFtNUy1YTFNdIDIuNC4yNjAgKi9cbmZ1bmN0aW9uIHBhcnNlX1NockZtbGEoYmxvYiwgbGVuZ3RoLCBvcHRzKSB7XG5cdHZhciByZWYgPSBwYXJzZV9SZWZVKGJsb2IsIDYpO1xuXHRibG9iLmwrKztcblx0dmFyIGNVc2UgPSBibG9iLnJlYWRfc2hpZnQoMSk7XG5cdGxlbmd0aCAtPSA4O1xuXHRyZXR1cm4gW3BhcnNlX1NoYXJlZFBhcnNlZEZvcm11bGEoYmxvYiwgbGVuZ3RoLCBvcHRzKSwgY1VzZSwgcmVmXTtcbn1cblxuLyogW01TLVhMU10gMi40LjQgVE9ETyAqL1xuZnVuY3Rpb24gcGFyc2VfQXJyYXkoYmxvYiwgbGVuZ3RoLCBvcHRzKSB7XG5cdHZhciByZWYgPSBwYXJzZV9SZWYoYmxvYiwgNik7XG5cdC8qIFRPRE86IGZBbHdheXNDYWxjICovXG5cdHN3aXRjaChvcHRzLmJpZmYpIHtcblx0XHRjYXNlIDI6IGJsb2IubCArKzsgbGVuZ3RoIC09IDc7IGJyZWFrO1xuXHRcdGNhc2UgMzogY2FzZSA0OiBibG9iLmwgKz0gMjsgbGVuZ3RoIC09IDg7IGJyZWFrO1xuXHRcdGRlZmF1bHQ6IGJsb2IubCArPSA2OyBsZW5ndGggLT0gMTI7XG5cdH1cblx0cmV0dXJuIFtyZWYsIHBhcnNlX0FycmF5UGFyc2VkRm9ybXVsYShibG9iLCBsZW5ndGgsIG9wdHMsIHJlZildO1xufVxuXG4vKiBbTVMtWExTXSAyLjQuMTczICovXG5mdW5jdGlvbiBwYXJzZV9NVFJTZXR0aW5ncyhibG9iKSB7XG5cdHZhciBmTVRSRW5hYmxlZCA9IGJsb2IucmVhZF9zaGlmdCg0KSAhPT0gMHgwMDtcblx0dmFyIGZVc2VyU2V0VGhyZWFkQ291bnQgPSBibG9iLnJlYWRfc2hpZnQoNCkgIT09IDB4MDA7XG5cdHZhciBjVXNlclRocmVhZENvdW50ID0gYmxvYi5yZWFkX3NoaWZ0KDQpO1xuXHRyZXR1cm4gW2ZNVFJFbmFibGVkLCBmVXNlclNldFRocmVhZENvdW50LCBjVXNlclRocmVhZENvdW50XTtcbn1cblxuLyogW01TLVhMU10gMi41LjE4NiBUT0RPOiBCSUZGNSAqL1xuZnVuY3Rpb24gcGFyc2VfTm90ZVNoKGJsb2IsIGxlbmd0aCwgb3B0cykge1xuXHRpZihvcHRzLmJpZmYgPCA4KSByZXR1cm47XG5cdHZhciByb3cgPSBibG9iLnJlYWRfc2hpZnQoMiksIGNvbCA9IGJsb2IucmVhZF9zaGlmdCgyKTtcblx0dmFyIGZsYWdzID0gYmxvYi5yZWFkX3NoaWZ0KDIpLCBpZE9iaiA9IGJsb2IucmVhZF9zaGlmdCgyKTtcblx0dmFyIHN0QXV0aG9yID0gcGFyc2VfWExVbmljb2RlU3RyaW5nMihibG9iLCAwLCBvcHRzKTtcblx0aWYob3B0cy5iaWZmIDwgOCkgYmxvYi5yZWFkX3NoaWZ0KDEpO1xuXHRyZXR1cm4gW3tyOnJvdyxjOmNvbH0sIHN0QXV0aG9yLCBpZE9iaiwgZmxhZ3NdO1xufVxuXG4vKiBbTVMtWExTXSAyLjQuMTc5ICovXG5mdW5jdGlvbiBwYXJzZV9Ob3RlKGJsb2IsIGxlbmd0aCwgb3B0cykge1xuXHQvKiBUT0RPOiBTdXBwb3J0IHJldmlzaW9ucyAqL1xuXHRyZXR1cm4gcGFyc2VfTm90ZVNoKGJsb2IsIGxlbmd0aCwgb3B0cyk7XG59XG5cbi8qIFtNUy1YTFNdIDIuNC4xNjggKi9cbmZ1bmN0aW9uIHBhcnNlX01lcmdlQ2VsbHMoYmxvYiwgbGVuZ3RoKSB7XG5cdHZhciBtZXJnZXMgPSBbXTtcblx0dmFyIGNtY3MgPSBibG9iLnJlYWRfc2hpZnQoMik7XG5cdHdoaWxlIChjbWNzLS0pIG1lcmdlcy5wdXNoKHBhcnNlX1JlZjhVKGJsb2IsbGVuZ3RoKSk7XG5cdHJldHVybiBtZXJnZXM7XG59XG5mdW5jdGlvbiB3cml0ZV9NZXJnZUNlbGxzKG1lcmdlcykge1xuXHR2YXIgbyA9IG5ld19idWYoMiArIG1lcmdlcy5sZW5ndGggKiA4KTtcblx0by53cml0ZV9zaGlmdCgyLCBtZXJnZXMubGVuZ3RoKTtcblx0Zm9yKHZhciBpID0gMDsgaSA8IG1lcmdlcy5sZW5ndGg7ICsraSkgd3JpdGVfUmVmOFUobWVyZ2VzW2ldLCBvKTtcblx0cmV0dXJuIG87XG59XG5cbi8qIFtNUy1YTFNdIDIuNC4xODEgVE9ETzogcGFyc2UgYWxsIHRoZSB0aGluZ3MhICovXG5mdW5jdGlvbiBwYXJzZV9PYmooYmxvYiwgbGVuZ3RoLCBvcHRzKSB7XG5cdGlmKG9wdHMgJiYgb3B0cy5iaWZmIDwgOCkgcmV0dXJuIHBhcnNlX0JJRkY1T2JqKGJsb2IsIGxlbmd0aCwgb3B0cyk7XG5cdHZhciBjbW8gPSBwYXJzZV9GdENtbyhibG9iLCAyMik7IC8vIGlkLCBvdCwgZmxhZ3Ncblx0dmFyIGZ0cyA9IHBhcnNlX0Z0QXJyYXkoYmxvYiwgbGVuZ3RoLTIyLCBjbW9bMV0pO1xuXHRyZXR1cm4geyBjbW86IGNtbywgZnQ6ZnRzIH07XG59XG4vKiBmcm9tIG9sZGVyIHNwZWMgKi9cbnZhciBwYXJzZV9CSUZGNU9UID0gW107XG5wYXJzZV9CSUZGNU9UWzB4MDhdID0gZnVuY3Rpb24oYmxvYiwgbGVuZ3RoKSB7XG5cdHZhciB0Z3QgPSBibG9iLmwgKyBsZW5ndGg7XG5cdGJsb2IubCArPSAxMDsgLy8gdG9kb1xuXHR2YXIgY2YgPSBibG9iLnJlYWRfc2hpZnQoMik7XG5cdGJsb2IubCArPSA0O1xuXHRibG9iLmwgKz0gMjsgLy92YXIgY2JQaWN0Rm1sYSA9IGJsb2IucmVhZF9zaGlmdCgyKTtcblx0YmxvYi5sICs9IDI7XG5cdGJsb2IubCArPSAyOyAvL3ZhciBncmJpdCA9IGJsb2IucmVhZF9zaGlmdCgyKTtcblx0YmxvYi5sICs9IDQ7XG5cdHZhciBjY2hOYW1lID0gYmxvYi5yZWFkX3NoaWZ0KDEpO1xuXHRibG9iLmwgKz0gY2NoTmFtZTsgLy8gVE9ETzogc3ROYW1lXG5cdGJsb2IubCA9IHRndDsgLy8gVE9ETzogZm1sYVxuXHRyZXR1cm4geyBmbXQ6Y2YgfTtcbn07XG5cbmZ1bmN0aW9uIHBhcnNlX0JJRkY1T2JqKGJsb2IsIGxlbmd0aCwgb3B0cykge1xuXHRibG9iLmwgKz0gNDsgLy92YXIgY250ID0gYmxvYi5yZWFkX3NoaWZ0KDQpO1xuXHR2YXIgb3QgPSBibG9iLnJlYWRfc2hpZnQoMik7XG5cdHZhciBpZCA9IGJsb2IucmVhZF9zaGlmdCgyKTtcblx0dmFyIGdyYml0ID0gYmxvYi5yZWFkX3NoaWZ0KDIpO1xuXHRibG9iLmwgKz0gMjsgLy92YXIgY29sTCA9IGJsb2IucmVhZF9zaGlmdCgyKTtcblx0YmxvYi5sICs9IDI7IC8vdmFyIGR4TCA9IGJsb2IucmVhZF9zaGlmdCgyKTtcblx0YmxvYi5sICs9IDI7IC8vdmFyIHJ3VCA9IGJsb2IucmVhZF9zaGlmdCgyKTtcblx0YmxvYi5sICs9IDI7IC8vdmFyIGR5VCA9IGJsb2IucmVhZF9zaGlmdCgyKTtcblx0YmxvYi5sICs9IDI7IC8vdmFyIGNvbFIgPSBibG9iLnJlYWRfc2hpZnQoMik7XG5cdGJsb2IubCArPSAyOyAvL3ZhciBkeFIgPSBibG9iLnJlYWRfc2hpZnQoMik7XG5cdGJsb2IubCArPSAyOyAvL3ZhciByd0IgPSBibG9iLnJlYWRfc2hpZnQoMik7XG5cdGJsb2IubCArPSAyOyAvL3ZhciBkeUIgPSBibG9iLnJlYWRfc2hpZnQoMik7XG5cdGJsb2IubCArPSAyOyAvL3ZhciBjYk1hY3JvID0gYmxvYi5yZWFkX3NoaWZ0KDIpO1xuXHRibG9iLmwgKz0gNjtcblx0bGVuZ3RoIC09IDM2O1xuXHR2YXIgZnRzID0gW107XG5cdGZ0cy5wdXNoKChwYXJzZV9CSUZGNU9UW290XXx8cGFyc2Vub29wKShibG9iLCBsZW5ndGgsIG9wdHMpKTtcblx0cmV0dXJuIHsgY21vOiBbaWQsIG90LCBncmJpdF0sIGZ0OmZ0cyB9O1xufVxuXG4vKiBbTVMtWExTXSAyLjQuMzI5IFRPRE86IHBhcnNlIHByb3Blcmx5ICovXG5mdW5jdGlvbiBwYXJzZV9UeE8oYmxvYiwgbGVuZ3RoLCBvcHRzKSB7XG5cdHZhciBzID0gYmxvYi5sO1xuXHR2YXIgdGV4dHMgPSBcIlwiO1xudHJ5IHtcblx0YmxvYi5sICs9IDQ7XG5cdHZhciBvdCA9IChvcHRzLmxhc3RvYmp8fHtjbW86WzAsMF19KS5jbW9bMV07XG5cdHZhciBjb250cm9sSW5mbzsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby11bnVzZWQtdmFyc1xuXHRpZihbMCw1LDcsMTEsMTIsMTRdLmluZGV4T2Yob3QpID09IC0xKSBibG9iLmwgKz0gNjtcblx0ZWxzZSBjb250cm9sSW5mbyA9IHBhcnNlX0NvbnRyb2xJbmZvKGJsb2IsIDYsIG9wdHMpO1xuXHR2YXIgY2NoVGV4dCA9IGJsb2IucmVhZF9zaGlmdCgyKTtcblx0Lyp2YXIgY2JSdW5zID0gKi9ibG9iLnJlYWRfc2hpZnQoMik7XG5cdC8qdmFyIGlmbnRFbXB0eSA9ICovcGFyc2V1aW50MTYoYmxvYiwgMik7XG5cdHZhciBsZW4gPSBibG9iLnJlYWRfc2hpZnQoMik7XG5cdGJsb2IubCArPSBsZW47XG5cdC8vdmFyIGZtbGEgPSBwYXJzZV9PYmpGbWxhKGJsb2IsIHMgKyBsZW5ndGggLSBibG9iLmwpO1xuXG5cdGZvcih2YXIgaSA9IDE7IGkgPCBibG9iLmxlbnMubGVuZ3RoLTE7ICsraSkge1xuXHRcdGlmKGJsb2IubC1zICE9IGJsb2IubGVuc1tpXSkgdGhyb3cgbmV3IEVycm9yKFwiVHhPOiBiYWQgY29udGludWUgcmVjb3JkXCIpO1xuXHRcdHZhciBoZHIgPSBibG9iW2Jsb2IubF07XG5cdFx0dmFyIHQgPSBwYXJzZV9YTFVuaWNvZGVTdHJpbmdOb0NjaChibG9iLCBibG9iLmxlbnNbaSsxXS1ibG9iLmxlbnNbaV0tMSk7XG5cdFx0dGV4dHMgKz0gdDtcblx0XHRpZih0ZXh0cy5sZW5ndGggPj0gKGhkciA/IGNjaFRleHQgOiAyKmNjaFRleHQpKSBicmVhaztcblx0fVxuXHRpZih0ZXh0cy5sZW5ndGggIT09IGNjaFRleHQgJiYgdGV4dHMubGVuZ3RoICE9PSBjY2hUZXh0KjIpIHtcblx0XHR0aHJvdyBuZXcgRXJyb3IoXCJjY2hUZXh0OiBcIiArIGNjaFRleHQgKyBcIiAhPSBcIiArIHRleHRzLmxlbmd0aCk7XG5cdH1cblxuXHRibG9iLmwgPSBzICsgbGVuZ3RoO1xuXHQvKiBbTVMtWExTXSAyLjUuMjcyIFR4T1J1bnMgKi9cbi8vXHR2YXIgcmdUeG9SdW5zID0gW107XG4vL1x0Zm9yKHZhciBqID0gMDsgaiAhPSBjYlJ1bnMvOC0xOyArK2opIGJsb2IubCArPSA4O1xuLy9cdHZhciBjY2hUZXh0MiA9IGJsb2IucmVhZF9zaGlmdCgyKTtcbi8vXHRpZihjY2hUZXh0MiAhPT0gY2NoVGV4dCkgdGhyb3cgbmV3IEVycm9yKFwiVHhPTGFzdFJ1biBtaXNtYXRjaDogXCIgKyBjY2hUZXh0MiArIFwiIFwiICsgY2NoVGV4dCk7XG4vL1x0YmxvYi5sICs9IDY7XG4vL1x0aWYocyArIGxlbmd0aCAhPSBibG9iLmwpIHRocm93IG5ldyBFcnJvcihcIlR4TyBcIiArIChzICsgbGVuZ3RoKSArIFwiLCBhdCBcIiArIGJsb2IubCk7XG5cdHJldHVybiB7IHQ6IHRleHRzIH07XG59IGNhdGNoKGUpIHsgYmxvYi5sID0gcyArIGxlbmd0aDsgcmV0dXJuIHsgdDogdGV4dHMgfTsgfVxufVxuXG4vKiBbTVMtWExTXSAyLjQuMTQwICovXG5mdW5jdGlvbiBwYXJzZV9ITGluayhibG9iLCBsZW5ndGgpIHtcblx0dmFyIHJlZiA9IHBhcnNlX1JlZjhVKGJsb2IsIDgpO1xuXHRibG9iLmwgKz0gMTY7IC8qIENMU0lEICovXG5cdHZhciBobGluayA9IHBhcnNlX0h5cGVybGluayhibG9iLCBsZW5ndGgtMjQpO1xuXHRyZXR1cm4gW3JlZiwgaGxpbmtdO1xufVxuZnVuY3Rpb24gd3JpdGVfSExpbmsoaGwpIHtcblx0dmFyIE8gPSBuZXdfYnVmKDI0KTtcblx0dmFyIHJlZiA9IGRlY29kZV9jZWxsKGhsWzBdKTtcblx0Ty53cml0ZV9zaGlmdCgyLCByZWYucik7IE8ud3JpdGVfc2hpZnQoMiwgcmVmLnIpO1xuXHRPLndyaXRlX3NoaWZ0KDIsIHJlZi5jKTsgTy53cml0ZV9zaGlmdCgyLCByZWYuYyk7XG5cdHZhciBjbHNpZCA9IFwiZDAgYzkgZWEgNzkgZjkgYmEgY2UgMTEgOGMgODIgMDAgYWEgMDAgNGIgYTkgMGJcIi5zcGxpdChcIiBcIik7XG5cdGZvcih2YXIgaSA9IDA7IGkgPCAxNjsgKytpKSBPLndyaXRlX3NoaWZ0KDEsIHBhcnNlSW50KGNsc2lkW2ldLCAxNikpO1xuXHRyZXR1cm4gYmNvbmNhdChbTywgd3JpdGVfSHlwZXJsaW5rKGhsWzFdKV0pO1xufVxuXG5cbi8qIFtNUy1YTFNdIDIuNC4xNDEgKi9cbmZ1bmN0aW9uIHBhcnNlX0hMaW5rVG9vbHRpcChibG9iLCBsZW5ndGgpIHtcblx0YmxvYi5yZWFkX3NoaWZ0KDIpO1xuXHR2YXIgcmVmID0gcGFyc2VfUmVmOFUoYmxvYiwgOCk7XG5cdHZhciB3elRvb2x0aXAgPSBibG9iLnJlYWRfc2hpZnQoKGxlbmd0aC0xMCkvMiwgJ2RiY3MtY29udCcpO1xuXHR3elRvb2x0aXAgPSB3elRvb2x0aXAucmVwbGFjZShjaHIwLFwiXCIpO1xuXHRyZXR1cm4gW3JlZiwgd3pUb29sdGlwXTtcbn1cbmZ1bmN0aW9uIHdyaXRlX0hMaW5rVG9vbHRpcChobCkge1xuXHR2YXIgVFQgPSBobFsxXS5Ub29sdGlwO1xuXHR2YXIgTyA9IG5ld19idWYoMTAgKyAyICogKFRULmxlbmd0aCArIDEpKTtcblx0Ty53cml0ZV9zaGlmdCgyLCAweDA4MDApO1xuXHR2YXIgcmVmID0gZGVjb2RlX2NlbGwoaGxbMF0pO1xuXHRPLndyaXRlX3NoaWZ0KDIsIHJlZi5yKTsgTy53cml0ZV9zaGlmdCgyLCByZWYucik7XG5cdE8ud3JpdGVfc2hpZnQoMiwgcmVmLmMpOyBPLndyaXRlX3NoaWZ0KDIsIHJlZi5jKTtcblx0Zm9yKHZhciBpID0gMDsgaSA8IFRULmxlbmd0aDsgKytpKSBPLndyaXRlX3NoaWZ0KDIsIFRULmNoYXJDb2RlQXQoaSkpO1xuXHRPLndyaXRlX3NoaWZ0KDIsIDApO1xuXHRyZXR1cm4gTztcbn1cblxuLyogW01TLVhMU10gMi40LjYzICovXG5mdW5jdGlvbiBwYXJzZV9Db3VudHJ5KGJsb2IpIHtcblx0dmFyIG8gPSBbMCwwXSwgZDtcblx0ZCA9IGJsb2IucmVhZF9zaGlmdCgyKTsgb1swXSA9IENvdW50cnlFbnVtW2RdIHx8IGQ7XG5cdGQgPSBibG9iLnJlYWRfc2hpZnQoMik7IG9bMV0gPSBDb3VudHJ5RW51bVtkXSB8fCBkO1xuXHRyZXR1cm4gbztcbn1cbmZ1bmN0aW9uIHdyaXRlX0NvdW50cnkobykge1xuXHRpZighbykgbyA9IG5ld19idWYoNCk7XG5cdG8ud3JpdGVfc2hpZnQoMiwgMHgwMSk7XG5cdG8ud3JpdGVfc2hpZnQoMiwgMHgwMSk7XG5cdHJldHVybiBvO1xufVxuXG4vKiBbTVMtWExTXSAyLjQuNTAgQ2xydENsaWVudCAqL1xuZnVuY3Rpb24gcGFyc2VfQ2xydENsaWVudChibG9iKSB7XG5cdHZhciBjY3YgPSBibG9iLnJlYWRfc2hpZnQoMik7XG5cdHZhciBvID0gW107XG5cdHdoaWxlKGNjdi0tPjApIG8ucHVzaChwYXJzZV9Mb25nUkdCKGJsb2IsIDgpKTtcblx0cmV0dXJuIG87XG59XG5cbi8qIFtNUy1YTFNdIDIuNC4xODggKi9cbmZ1bmN0aW9uIHBhcnNlX1BhbGV0dGUoYmxvYikge1xuXHR2YXIgY2N2ID0gYmxvYi5yZWFkX3NoaWZ0KDIpO1xuXHR2YXIgbyA9IFtdO1xuXHR3aGlsZShjY3YtLT4wKSBvLnB1c2gocGFyc2VfTG9uZ1JHQihibG9iLCA4KSk7XG5cdHJldHVybiBvO1xufVxuXG4vKiBbTVMtWExTXSAyLjQuMzU0ICovXG5mdW5jdGlvbiBwYXJzZV9YRkNSQyhibG9iKSB7XG5cdGJsb2IubCArPSAyO1xuXHR2YXIgbyA9IHtjeGZzOjAsIGNyYzowfTtcblx0by5jeGZzID0gYmxvYi5yZWFkX3NoaWZ0KDIpO1xuXHRvLmNyYyA9IGJsb2IucmVhZF9zaGlmdCg0KTtcblx0cmV0dXJuIG87XG59XG5cbi8qIFtNUy1YTFNdIDIuNC41MyBUT0RPOiBwYXJzZSBmbGFncyAqL1xuLyogW01TLVhMU0JdIDIuNC4zMjMgVE9ETzogcGFyc2UgZmxhZ3MgKi9cbmZ1bmN0aW9uIHBhcnNlX0NvbEluZm8oYmxvYiwgbGVuZ3RoLCBvcHRzKSB7XG5cdGlmKCFvcHRzLmNlbGxTdHlsZXMpIHJldHVybiBwYXJzZW5vb3AoYmxvYiwgbGVuZ3RoKTtcblx0dmFyIHcgPSBvcHRzICYmIG9wdHMuYmlmZiA+PSAxMiA/IDQgOiAyO1xuXHR2YXIgY29sRmlyc3QgPSBibG9iLnJlYWRfc2hpZnQodyk7XG5cdHZhciBjb2xMYXN0ID0gYmxvYi5yZWFkX3NoaWZ0KHcpO1xuXHR2YXIgY29sZHggPSBibG9iLnJlYWRfc2hpZnQodyk7XG5cdHZhciBpeGZlID0gYmxvYi5yZWFkX3NoaWZ0KHcpO1xuXHR2YXIgZmxhZ3MgPSBibG9iLnJlYWRfc2hpZnQoMik7XG5cdGlmKHcgPT0gMikgYmxvYi5sICs9IDI7XG5cdHZhciBvID0gKHtzOmNvbEZpcnN0LCBlOmNvbExhc3QsIHc6Y29sZHgsIGl4ZmU6aXhmZSwgZmxhZ3M6ZmxhZ3N9KTtcblx0aWYob3B0cy5iaWZmID49IDUgfHwgIW9wdHMuYmlmZikgby5sZXZlbCA9IChmbGFncyA+PiA4KSAmIDB4Nztcblx0cmV0dXJuIG87XG59XG5cbi8qIFtNUy1YTFNdIDIuNC4yNTcgKi9cbmZ1bmN0aW9uIHBhcnNlX1NldHVwKGJsb2IsIGxlbmd0aCkge1xuXHR2YXIgbyA9IHt9O1xuXHRpZihsZW5ndGggPCAzMikgcmV0dXJuIG87XG5cdGJsb2IubCArPSAxNjtcblx0by5oZWFkZXIgPSBwYXJzZV9YbnVtKGJsb2IsIDgpO1xuXHRvLmZvb3RlciA9IHBhcnNlX1hudW0oYmxvYiwgOCk7XG5cdGJsb2IubCArPSAyO1xuXHRyZXR1cm4gbztcbn1cblxuLyogW01TLVhMU10gMi40LjI2MSAqL1xuZnVuY3Rpb24gcGFyc2VfU2h0UHJvcHMoYmxvYiwgbGVuZ3RoLCBvcHRzKSB7XG5cdHZhciBkZWYgPSB7YXJlYTpmYWxzZX07XG5cdGlmKG9wdHMuYmlmZiAhPSA1KSB7IGJsb2IubCArPSBsZW5ndGg7IHJldHVybiBkZWY7IH1cblx0dmFyIGQgPSBibG9iLnJlYWRfc2hpZnQoMSk7IGJsb2IubCArPSAzO1xuXHRpZigoZCAmIDB4MTApKSBkZWYuYXJlYSA9IHRydWU7XG5cdHJldHVybiBkZWY7XG59XG5cbi8qIFtNUy1YTFNdIDIuNC4yNDEgKi9cbmZ1bmN0aW9uIHdyaXRlX1JSVGFiSWQobikge1xuXHR2YXIgb3V0ID0gbmV3X2J1ZigyICogbik7XG5cdGZvcih2YXIgaSA9IDA7IGkgPCBuOyArK2kpIG91dC53cml0ZV9zaGlmdCgyLCBpKzEpO1xuXHRyZXR1cm4gb3V0O1xufVxuXG52YXIgcGFyc2VfQmxhbmsgPSBwYXJzZV9YTFNDZWxsOyAvKiBbTVMtWExTXSAyLjQuMjAgSnVzdCB0aGUgY2VsbCAqL1xudmFyIHBhcnNlX1NjbCA9IHBhcnNldWludDE2YTsgLyogW01TLVhMU10gMi40LjI0NyBudW0sIGRlbiAqL1xudmFyIHBhcnNlX1N0cmluZyA9IHBhcnNlX1hMVW5pY29kZVN0cmluZzsgLyogW01TLVhMU10gMi40LjI2OCAqL1xuXG4vKiAtLS0gU3BlY2lmaWMgdG8gdmVyc2lvbnMgYmVmb3JlIEJJRkY4IC0tLSAqL1xuZnVuY3Rpb24gcGFyc2VfSW1EYXRhKGJsb2IpIHtcblx0dmFyIGNmID0gYmxvYi5yZWFkX3NoaWZ0KDIpO1xuXHR2YXIgZW52ID0gYmxvYi5yZWFkX3NoaWZ0KDIpO1xuXHR2YXIgbGNiID0gYmxvYi5yZWFkX3NoaWZ0KDQpO1xuXHR2YXIgbyA9IHtmbXQ6Y2YsIGVudjplbnYsIGxlbjpsY2IsIGRhdGE6YmxvYi5zbGljZShibG9iLmwsYmxvYi5sK2xjYil9O1xuXHRibG9iLmwgKz0gbGNiO1xuXHRyZXR1cm4gbztcbn1cblxuLyogQklGRjJfPz8/IHdoZXJlID8/PyBpcyB0aGUgbmFtZSBmcm9tIFtYTFNdICovXG5mdW5jdGlvbiBwYXJzZV9CSUZGMlNUUihibG9iLCBsZW5ndGgsIG9wdHMpIHtcblx0dmFyIGNlbGwgPSBwYXJzZV9YTFNDZWxsKGJsb2IsIDYpO1xuXHQrK2Jsb2IubDtcblx0dmFyIHN0ciA9IHBhcnNlX1hMVW5pY29kZVN0cmluZzIoYmxvYiwgbGVuZ3RoLTcsIG9wdHMpO1xuXHRjZWxsLnQgPSAnc3RyJztcblx0Y2VsbC52YWwgPSBzdHI7XG5cdHJldHVybiBjZWxsO1xufVxuXG5mdW5jdGlvbiBwYXJzZV9CSUZGMk5VTShibG9iKSB7XG5cdHZhciBjZWxsID0gcGFyc2VfWExTQ2VsbChibG9iLCA2KTtcblx0KytibG9iLmw7XG5cdHZhciBudW0gPSBwYXJzZV9YbnVtKGJsb2IsIDgpO1xuXHRjZWxsLnQgPSAnbic7XG5cdGNlbGwudmFsID0gbnVtO1xuXHRyZXR1cm4gY2VsbDtcbn1cbmZ1bmN0aW9uIHdyaXRlX0JJRkYyTlVNKHIsIGMsIHZhbCkge1xuXHR2YXIgb3V0ID0gbmV3X2J1ZigxNSk7XG5cdHdyaXRlX0JJRkYyQ2VsbChvdXQsIHIsIGMpO1xuXHRvdXQud3JpdGVfc2hpZnQoOCwgdmFsLCAnZicpO1xuXHRyZXR1cm4gb3V0O1xufVxuXG5mdW5jdGlvbiBwYXJzZV9CSUZGMklOVChibG9iKSB7XG5cdHZhciBjZWxsID0gcGFyc2VfWExTQ2VsbChibG9iLCA2KTtcblx0KytibG9iLmw7XG5cdHZhciBudW0gPSBibG9iLnJlYWRfc2hpZnQoMik7XG5cdGNlbGwudCA9ICduJztcblx0Y2VsbC52YWwgPSBudW07XG5cdHJldHVybiBjZWxsO1xufVxuZnVuY3Rpb24gd3JpdGVfQklGRjJJTlQociwgYywgdmFsKSB7XG5cdHZhciBvdXQgPSBuZXdfYnVmKDkpO1xuXHR3cml0ZV9CSUZGMkNlbGwob3V0LCByLCBjKTtcblx0b3V0LndyaXRlX3NoaWZ0KDIsIHZhbCk7XG5cdHJldHVybiBvdXQ7XG59XG5cbmZ1bmN0aW9uIHBhcnNlX0JJRkYyU1RSSU5HKGJsb2IpIHtcblx0dmFyIGNjaCA9IGJsb2IucmVhZF9zaGlmdCgxKTtcblx0aWYoY2NoID09PSAwKSB7IGJsb2IubCsrOyByZXR1cm4gXCJcIjsgfVxuXHRyZXR1cm4gYmxvYi5yZWFkX3NoaWZ0KGNjaCwgJ3NiY3MtY29udCcpO1xufVxuXG4vKiBUT0RPOiBjb252ZXJ0IHRvIEJJRkY4IGZvbnQgc3RydWN0ICovXG5mdW5jdGlvbiBwYXJzZV9CSUZGMkZPTlRYVFJBKGJsb2IsIGxlbmd0aCkge1xuXHRibG9iLmwgKz0gNjsgLy8gdW5rbm93blxuXHRibG9iLmwgKz0gMjsgLy8gZm9udCB3ZWlnaHQgXCJibHNcIlxuXHRibG9iLmwgKz0gMTsgLy8gY2hhcnNldFxuXHRibG9iLmwgKz0gMzsgLy8gdW5rbm93blxuXHRibG9iLmwgKz0gMTsgLy8gZm9udCBmYW1pbHlcblx0YmxvYi5sICs9IGxlbmd0aCAtIDEzO1xufVxuXG4vKiBUT0RPOiBwYXJzZSByaWNoIHRleHQgcnVucyAqL1xuZnVuY3Rpb24gcGFyc2VfUlN0cmluZyhibG9iLCBsZW5ndGgsIG9wdHMpIHtcblx0dmFyIGVuZCA9IGJsb2IubCArIGxlbmd0aDtcblx0dmFyIGNlbGwgPSBwYXJzZV9YTFNDZWxsKGJsb2IsIDYpO1xuXHR2YXIgY2NoID0gYmxvYi5yZWFkX3NoaWZ0KDIpO1xuXHR2YXIgc3RyID0gcGFyc2VfWExVbmljb2RlU3RyaW5nTm9DY2goYmxvYiwgY2NoLCBvcHRzKTtcblx0YmxvYi5sID0gZW5kO1xuXHRjZWxsLnQgPSAnc3RyJztcblx0Y2VsbC52YWwgPSBzdHI7XG5cdHJldHVybiBjZWxsO1xufVxuLyogZnJvbSBqcy1oYXJiIChDKSAyMDE0LXByZXNlbnQgIFNoZWV0SlMgKi9cbnZhciBEQkYgPSAoZnVuY3Rpb24oKSB7XG52YXIgZGJmX2NvZGVwYWdlX21hcCA9IHtcblx0LyogQ29kZSBQYWdlcyBTdXBwb3J0ZWQgYnkgVmlzdWFsIEZveFBybyAqL1xuMHgwMTogICA0MzcsICAgICAgICAgICAweDAyOiAgIDg1MCxcbjB4MDM6ICAxMjUyLCAgICAgICAgICAgMHgwNDogMTAwMDAsXG4weDY0OiAgIDg1MiwgICAgICAgICAgIDB4NjU6ICAgODY2LFxuMHg2NjogICA4NjUsICAgICAgICAgICAweDY3OiAgIDg2MSxcbjB4Njg6ICAgODk1LCAgICAgICAgICAgMHg2OTogICA2MjAsXG4weDZBOiAgIDczNywgICAgICAgICAgIDB4NkI6ICAgODU3LFxuMHg3ODogICA5NTAsICAgICAgICAgICAweDc5OiAgIDk0OSxcbjB4N0E6ICAgOTM2LCAgICAgICAgICAgMHg3QjogICA5MzIsXG4weDdDOiAgIDg3NCwgICAgICAgICAgIDB4N0Q6ICAxMjU1LFxuMHg3RTogIDEyNTYsICAgICAgICAgICAweDk2OiAxMDAwNyxcbjB4OTc6IDEwMDI5LCAgICAgICAgICAgMHg5ODogMTAwMDYsXG4weEM4OiAgMTI1MCwgICAgICAgICAgIDB4Qzk6ICAxMjUxLFxuMHhDQTogIDEyNTQsICAgICAgICAgICAweENCOiAgMTI1MyxcblxuXHQvKiBzaGFwZWZpbGUgREJGIGV4dGVuc2lvbiAqL1xuMHgwMDogMjAxMjcsICAgICAgICAgICAweDA4OiAgIDg2NSxcbjB4MDk6ICAgNDM3LCAgICAgICAgICAgMHgwQTogICA4NTAsXG4weDBCOiAgIDQzNywgICAgICAgICAgIDB4MEQ6ICAgNDM3LFxuMHgwRTogICA4NTAsICAgICAgICAgICAweDBGOiAgIDQzNyxcbjB4MTA6ICAgODUwLCAgICAgICAgICAgMHgxMTogICA0MzcsXG4weDEyOiAgIDg1MCwgICAgICAgICAgIDB4MTM6ICAgOTMyLFxuMHgxNDogICA4NTAsICAgICAgICAgICAweDE1OiAgIDQzNyxcbjB4MTY6ICAgODUwLCAgICAgICAgICAgMHgxNzogICA4NjUsXG4weDE4OiAgIDQzNywgICAgICAgICAgIDB4MTk6ICAgNDM3LFxuMHgxQTogICA4NTAsICAgICAgICAgICAweDFCOiAgIDQzNyxcbjB4MUM6ICAgODYzLCAgICAgICAgICAgMHgxRDogICA4NTAsXG4weDFGOiAgIDg1MiwgICAgICAgICAgIDB4MjI6ICAgODUyLFxuMHgyMzogICA4NTIsICAgICAgICAgICAweDI0OiAgIDg2MCxcbjB4MjU6ICAgODUwLCAgICAgICAgICAgMHgyNjogICA4NjYsXG4weDM3OiAgIDg1MCwgICAgICAgICAgIDB4NDA6ICAgODUyLFxuMHg0RDogICA5MzYsICAgICAgICAgICAweDRFOiAgIDk0OSxcbjB4NEY6ICAgOTUwLCAgICAgICAgICAgMHg1MDogICA4NzQsXG4weDU3OiAgMTI1MiwgICAgICAgICAgIDB4NTg6ICAxMjUyLFxuMHg1OTogIDEyNTIsICAgICAgICAgICAweDZDOiAgIDg2MyxcbjB4ODY6ICAgNzM3LCAgICAgICAgICAgMHg4NzogICA4NTIsXG4weDg4OiAgIDg1NywgICAgICAgICAgIDB4Q0M6ICAxMjU3LFxuXG4weEZGOiAxNjk2OVxufTtcbnZhciBkYmZfcmV2ZXJzZV9tYXAgPSBldmVydCh7XG4weDAxOiAgIDQzNywgICAgICAgICAgIDB4MDI6ICAgODUwLFxuMHgwMzogIDEyNTIsICAgICAgICAgICAweDA0OiAxMDAwMCxcbjB4NjQ6ICAgODUyLCAgICAgICAgICAgMHg2NTogICA4NjYsXG4weDY2OiAgIDg2NSwgICAgICAgICAgIDB4Njc6ICAgODYxLFxuMHg2ODogICA4OTUsICAgICAgICAgICAweDY5OiAgIDYyMCxcbjB4NkE6ICAgNzM3LCAgICAgICAgICAgMHg2QjogICA4NTcsXG4weDc4OiAgIDk1MCwgICAgICAgICAgIDB4Nzk6ICAgOTQ5LFxuMHg3QTogICA5MzYsICAgICAgICAgICAweDdCOiAgIDkzMixcbjB4N0M6ICAgODc0LCAgICAgICAgICAgMHg3RDogIDEyNTUsXG4weDdFOiAgMTI1NiwgICAgICAgICAgIDB4OTY6IDEwMDA3LFxuMHg5NzogMTAwMjksICAgICAgICAgICAweDk4OiAxMDAwNixcbjB4Qzg6ICAxMjUwLCAgICAgICAgICAgMHhDOTogIDEyNTEsXG4weENBOiAgMTI1NCwgICAgICAgICAgIDB4Q0I6ICAxMjUzLFxuMHgwMDogMjAxMjdcbn0pO1xudmFyIERCRl9TVVBQT1JURURfVkVSU0lPTlMgPSBbMHgwMiwgMHgwMywgMHgzMCwgMHgzMSwgMHg4MywgMHg4QiwgMHg4QywgMHhGNV07XG4vKiBUT0RPOiBmaW5kIGFuIGFjdHVhbCBzcGVjaWZpY2F0aW9uICovXG5mdW5jdGlvbiBkYmZfdG9fYW9hKGJ1Ziwgb3B0cykge1xuXHR2YXIgb3V0ID0gW107XG5cdHZhciBkID0gKG5ld19yYXdfYnVmKDEpKTtcblx0c3dpdGNoKG9wdHMudHlwZSkge1xuXHRcdGNhc2UgJ2Jhc2U2NCc6IGQgPSBzMmEoQmFzZTY0LmRlY29kZShidWYpKTsgYnJlYWs7XG5cdFx0Y2FzZSAnYmluYXJ5JzogZCA9IHMyYShidWYpOyBicmVhaztcblx0XHRjYXNlICdidWZmZXInOlxuXHRcdGNhc2UgJ2FycmF5JzogZCA9IGJ1ZjsgYnJlYWs7XG5cdH1cblx0cHJlcF9ibG9iKGQsIDApO1xuXG5cdC8qIGhlYWRlciAqL1xuXHR2YXIgZnQgPSBkLnJlYWRfc2hpZnQoMSk7XG5cdHZhciBtZW1vID0gISEoZnQgJiAweDg4KTtcblx0dmFyIHZmcCA9IGZhbHNlLCBsNyA9IGZhbHNlO1xuXHRzd2l0Y2goZnQpIHtcblx0XHRjYXNlIDB4MDI6IGJyZWFrOyAvLyBkQkFTRSBJSVxuXHRcdGNhc2UgMHgwMzogYnJlYWs7IC8vIGRCQVNFIElJSVxuXHRcdGNhc2UgMHgzMDogdmZwID0gdHJ1ZTsgbWVtbyA9IHRydWU7IGJyZWFrOyAvLyBWRlBcblx0XHRjYXNlIDB4MzE6IHZmcCA9IHRydWU7IG1lbW8gPSB0cnVlOyBicmVhazsgLy8gVkZQIHdpdGggYXV0b2luY3JlbWVudFxuXHRcdC8vIDB4NDMgZEJBU0UgSVYgU1FMIHRhYmxlIGZpbGVzXG5cdFx0Ly8gMHg2MyBkQkFTRSBJViBTUUwgc3lzdGVtIGZpbGVzXG5cdFx0Y2FzZSAweDgzOiBicmVhazsgLy8gZEJBU0UgSUlJIHdpdGggbWVtb1xuXHRcdGNhc2UgMHg4QjogYnJlYWs7IC8vIGRCQVNFIElWIHdpdGggbWVtb1xuXHRcdGNhc2UgMHg4QzogbDcgPSB0cnVlOyBicmVhazsgLy8gZEJBU0UgTGV2ZWwgNyB3aXRoIG1lbW9cblx0XHQvLyBjYXNlIDB4Q0IgZEJBU0UgSVYgU1FMIHRhYmxlIGZpbGVzIHdpdGggbWVtb1xuXHRcdGNhc2UgMHhGNTogYnJlYWs7IC8vIEZveFBybyAyLnggd2l0aCBtZW1vXG5cdFx0Ly8gY2FzZSAweEZCIEZveEJBU0Vcblx0XHRkZWZhdWx0OiB0aHJvdyBuZXcgRXJyb3IoXCJEQkYgVW5zdXBwb3J0ZWQgVmVyc2lvbjogXCIgKyBmdC50b1N0cmluZygxNikpO1xuXHR9XG5cblx0dmFyIG5yb3cgPSAwLCBmcG9zID0gMHgwMjA5O1xuXHRpZihmdCA9PSAweDAyKSBucm93ID0gZC5yZWFkX3NoaWZ0KDIpO1xuXHRkLmwgKz0gMzsgLy8gZEJBU0UgSUkgc3RvcmVzIERETU1ZWSBkYXRlLCBvdGhlcnMgdXNlIFlZTU1ERFxuXHRpZihmdCAhPSAweDAyKSBucm93ID0gZC5yZWFkX3NoaWZ0KDQpO1xuXHRpZihucm93ID4gMTA0ODU3NikgbnJvdyA9IDFlNjtcblxuXHRpZihmdCAhPSAweDAyKSBmcG9zID0gZC5yZWFkX3NoaWZ0KDIpOyAvLyBoZWFkZXIgbGVuZ3RoXG5cdHZhciBybGVuID0gZC5yZWFkX3NoaWZ0KDIpOyAvLyByZWNvcmQgbGVuZ3RoXG5cblx0dmFyIC8qZmxhZ3MgPSAwLCovIGN1cnJlbnRfY3AgPSBvcHRzLmNvZGVwYWdlIHx8IDEyNTI7XG5cdGlmKGZ0ICE9IDB4MDIpIHsgLy8gMjAgcmVzZXJ2ZWQgYnl0ZXNcblx0XHRkLmwrPTE2O1xuXHRcdC8qZmxhZ3MgPSAqL2QucmVhZF9zaGlmdCgxKTtcblx0XHQvL2lmKG1lbW8gJiYgKChmbGFncyAmIDB4MDIpID09PSAwKSkgdGhyb3cgbmV3IEVycm9yKFwiREJGIEZsYWdzIFwiICsgZmxhZ3MudG9TdHJpbmcoMTYpICsgXCIgZnQgXCIgKyBmdC50b1N0cmluZygxNikpO1xuXG5cdFx0LyogY29kZXBhZ2UgcHJlc2VudCBpbiBGb3hQcm8gYW5kIGRCQVNFIExldmVsIDcgKi9cblx0XHRpZihkW2QubF0gIT09IDApIGN1cnJlbnRfY3AgPSBkYmZfY29kZXBhZ2VfbWFwW2RbZC5sXV07XG5cdFx0ZC5sKz0xO1xuXG5cdFx0ZC5sKz0yO1xuXHR9XG5cdGlmKGw3KSBkLmwgKz0gMzY7IC8vIExldmVsIDc6IDMyIGJ5dGUgXCJMYW5ndWFnZSBkcml2ZXIgbmFtZVwiLCA0IGJ5dGUgcmVzZXJ2ZWRcblxudmFyIGZpZWxkcyA9IFtdLCBmaWVsZCA9ICh7fSk7XG5cdHZhciBoZW5kID0gTWF0aC5taW4oZC5sZW5ndGgsIChmdCA9PSAweDAyID8gMHgyMDkgOiAoZnBvcyAtIDEwIC0gKHZmcCA/IDI2NCA6IDApKSkpO1xuXHR2YXIgd3cgPSBsNyA/IDMyIDogMTE7XG5cdHdoaWxlKGQubCA8IGhlbmQgJiYgZFtkLmxdICE9IDB4MGQpIHtcblx0XHRmaWVsZCA9ICh7fSk7XG5cdFx0ZmllbGQubmFtZSA9IGNwdGFibGUudXRpbHMuZGVjb2RlKGN1cnJlbnRfY3AsIGQuc2xpY2UoZC5sLCBkLmwrd3cpKS5yZXBsYWNlKC9bXFx1MDAwMFxcclxcbl0uKiQvZyxcIlwiKTtcblx0XHRkLmwgKz0gd3c7XG5cdFx0ZmllbGQudHlwZSA9IFN0cmluZy5mcm9tQ2hhckNvZGUoZC5yZWFkX3NoaWZ0KDEpKTtcblx0XHRpZihmdCAhPSAweDAyICYmICFsNykgZmllbGQub2Zmc2V0ID0gZC5yZWFkX3NoaWZ0KDQpO1xuXHRcdGZpZWxkLmxlbiA9IGQucmVhZF9zaGlmdCgxKTtcblx0XHRpZihmdCA9PSAweDAyKSBmaWVsZC5vZmZzZXQgPSBkLnJlYWRfc2hpZnQoMik7XG5cdFx0ZmllbGQuZGVjID0gZC5yZWFkX3NoaWZ0KDEpO1xuXHRcdGlmKGZpZWxkLm5hbWUubGVuZ3RoKSBmaWVsZHMucHVzaChmaWVsZCk7XG5cdFx0aWYoZnQgIT0gMHgwMikgZC5sICs9IGw3ID8gMTMgOiAxNDtcblx0XHRzd2l0Y2goZmllbGQudHlwZSkge1xuXHRcdFx0Y2FzZSAnQic6IC8vIERvdWJsZSAoVkZQKSAvIEJpbmFyeSAoZEJBU0UgTDcpXG5cdFx0XHRcdGlmKCghdmZwIHx8IGZpZWxkLmxlbiAhPSA4KSAmJiBvcHRzLldURikgY29uc29sZS5sb2coJ1NraXBwaW5nICcgKyBmaWVsZC5uYW1lICsgJzonICsgZmllbGQudHlwZSk7XG5cdFx0XHRcdGJyZWFrO1xuXHRcdFx0Y2FzZSAnRyc6IC8vIEdlbmVyYWwgKEZveFBybyBhbmQgZEJBU0UgTDcpXG5cdFx0XHRjYXNlICdQJzogLy8gUGljdHVyZSAoRm94UHJvIGFuZCBkQkFTRSBMNylcblx0XHRcdFx0aWYob3B0cy5XVEYpIGNvbnNvbGUubG9nKCdTa2lwcGluZyAnICsgZmllbGQubmFtZSArICc6JyArIGZpZWxkLnR5cGUpO1xuXHRcdFx0XHRicmVhaztcblx0XHRcdGNhc2UgJysnOiAvLyBBdXRvaW5jcmVtZW50IChkQkFTRSBMNyBvbmx5KVxuXHRcdFx0Y2FzZSAnMCc6IC8vIF9OdWxsRmxhZ3MgKFZGUCBvbmx5KVxuXHRcdFx0Y2FzZSAnQCc6IC8vIFRpbWVzdGFtcCAoZEJBU0UgTDcgb25seSlcblx0XHRcdGNhc2UgJ0MnOiAvLyBDaGFyYWN0ZXIgKGRCQVNFIElJKVxuXHRcdFx0Y2FzZSAnRCc6IC8vIERhdGUgKGRCQVNFIElJSSlcblx0XHRcdGNhc2UgJ0YnOiAvLyBGbG9hdCAoZEJBU0UgSVYpXG5cdFx0XHRjYXNlICdJJzogLy8gTG9uZyAoVkZQIGFuZCBkQkFTRSBMNylcblx0XHRcdGNhc2UgJ0wnOiAvLyBMb2dpY2FsIChkQkFTRSBJSSlcblx0XHRcdGNhc2UgJ00nOiAvLyBNZW1vIChkQkFTRSBJSUkpXG5cdFx0XHRjYXNlICdOJzogLy8gTnVtYmVyIChkQkFTRSBJSSlcblx0XHRcdGNhc2UgJ08nOiAvLyBEb3VibGUgKGRCQVNFIEw3IG9ubHkpXG5cdFx0XHRjYXNlICdUJzogLy8gRGF0ZXRpbWUgKFZGUCBvbmx5KVxuXHRcdFx0Y2FzZSAnWSc6IC8vIEN1cnJlbmN5IChWRlAgb25seSlcblx0XHRcdFx0YnJlYWs7XG5cdFx0XHRkZWZhdWx0OiB0aHJvdyBuZXcgRXJyb3IoJ1Vua25vd24gRmllbGQgVHlwZTogJyArIGZpZWxkLnR5cGUpO1xuXHRcdH1cblx0fVxuXG5cdGlmKGRbZC5sXSAhPT0gMHgwRCkgZC5sID0gZnBvcy0xO1xuXHRpZihkLnJlYWRfc2hpZnQoMSkgIT09IDB4MEQpIHRocm93IG5ldyBFcnJvcihcIkRCRiBUZXJtaW5hdG9yIG5vdCBmb3VuZCBcIiArIGQubCArIFwiIFwiICsgZFtkLmxdKTtcblx0ZC5sID0gZnBvcztcblxuXHQvKiBkYXRhICovXG5cdHZhciBSID0gMCwgQyA9IDA7XG5cdG91dFswXSA9IFtdO1xuXHRmb3IoQyA9IDA7IEMgIT0gZmllbGRzLmxlbmd0aDsgKytDKSBvdXRbMF1bQ10gPSBmaWVsZHNbQ10ubmFtZTtcblx0d2hpbGUobnJvdy0tID4gMCkge1xuXHRcdGlmKGRbZC5sXSA9PT0gMHgyQSkge1xuXHRcdFx0Ly8gVE9ETzogcmVjb3JkIG1hcmtlZCBhcyBkZWxldGVkIC0tIGNyZWF0ZSBhIGhpZGRlbiByb3c/XG5cdFx0XHRkLmwrPXJsZW47XG5cdFx0XHRjb250aW51ZTtcblx0XHR9XG5cdFx0KytkLmw7XG5cdFx0b3V0WysrUl0gPSBbXTsgQyA9IDA7XG5cdFx0Zm9yKEMgPSAwOyBDICE9IGZpZWxkcy5sZW5ndGg7ICsrQykge1xuXHRcdFx0dmFyIGRkID0gZC5zbGljZShkLmwsIGQubCtmaWVsZHNbQ10ubGVuKTsgZC5sKz1maWVsZHNbQ10ubGVuO1xuXHRcdFx0cHJlcF9ibG9iKGRkLCAwKTtcblx0XHRcdHZhciBzID0gY3B0YWJsZS51dGlscy5kZWNvZGUoY3VycmVudF9jcCwgZGQpO1xuXHRcdFx0c3dpdGNoKGZpZWxkc1tDXS50eXBlKSB7XG5cdFx0XHRcdGNhc2UgJ0MnOlxuXHRcdFx0XHRcdC8vIE5PVEU6IGl0IGlzIGNvbnZlbnRpb25hbCB0byB3cml0ZSAnICAvICAvICAnIGZvciBlbXB0eSBkYXRlc1xuXHRcdFx0XHRcdGlmKHMudHJpbSgpLmxlbmd0aCkgb3V0W1JdW0NdID0gcy5yZXBsYWNlKC9cXHMrJC8sXCJcIik7XG5cdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdGNhc2UgJ0QnOlxuXHRcdFx0XHRcdGlmKHMubGVuZ3RoID09PSA4KSBvdXRbUl1bQ10gPSBuZXcgRGF0ZSgrcy5zbGljZSgwLDQpLCArcy5zbGljZSg0LDYpLTEsICtzLnNsaWNlKDYsOCkpO1xuXHRcdFx0XHRcdGVsc2Ugb3V0W1JdW0NdID0gcztcblx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0Y2FzZSAnRic6IG91dFtSXVtDXSA9IHBhcnNlRmxvYXQocy50cmltKCkpOyBicmVhaztcblx0XHRcdFx0Y2FzZSAnKyc6IGNhc2UgJ0knOiBvdXRbUl1bQ10gPSBsNyA/IGRkLnJlYWRfc2hpZnQoLTQsICdpJykgXiAweDgwMDAwMDAwIDogZGQucmVhZF9zaGlmdCg0LCAnaScpOyBicmVhaztcblx0XHRcdFx0Y2FzZSAnTCc6IHN3aXRjaChzLnRyaW0oKS50b1VwcGVyQ2FzZSgpKSB7XG5cdFx0XHRcdFx0Y2FzZSAnWSc6IGNhc2UgJ1QnOiBvdXRbUl1bQ10gPSB0cnVlOyBicmVhaztcblx0XHRcdFx0XHRjYXNlICdOJzogY2FzZSAnRic6IG91dFtSXVtDXSA9IGZhbHNlOyBicmVhaztcblx0XHRcdFx0XHRjYXNlICcnOiBjYXNlICc/JzogYnJlYWs7XG5cdFx0XHRcdFx0ZGVmYXVsdDogdGhyb3cgbmV3IEVycm9yKFwiREJGIFVucmVjb2duaXplZCBMOnxcIiArIHMgKyBcInxcIik7XG5cdFx0XHRcdFx0fSBicmVhaztcblx0XHRcdFx0Y2FzZSAnTSc6IC8qIFRPRE86IGhhbmRsZSBtZW1vIGZpbGVzICovXG5cdFx0XHRcdFx0aWYoIW1lbW8pIHRocm93IG5ldyBFcnJvcihcIkRCRiBVbmV4cGVjdGVkIE1FTU8gZm9yIHR5cGUgXCIgKyBmdC50b1N0cmluZygxNikpO1xuXHRcdFx0XHRcdG91dFtSXVtDXSA9IFwiIyNNRU1PIyNcIiArIChsNyA/IHBhcnNlSW50KHMudHJpbSgpLCAxMCk6IGRkLnJlYWRfc2hpZnQoNCkpO1xuXHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRjYXNlICdOJzpcblx0XHRcdFx0XHRzID0gcy5yZXBsYWNlKC9cXHUwMDAwL2csXCJcIikudHJpbSgpO1xuXHRcdFx0XHRcdC8vIE5PVEU6IGRCQVNFIElJIGludGVycHJldHMgXCIgIC4gIFwiIGFzIDBcblx0XHRcdFx0XHRpZihzICYmIHMgIT0gXCIuXCIpIG91dFtSXVtDXSA9ICtzIHx8IDA7IGJyZWFrO1xuXHRcdFx0XHRjYXNlICdAJzpcblx0XHRcdFx0XHQvLyBOT1RFOiBkQkFTRSBzcGVjcyBhcHBlYXIgdG8gYmUgaW5jb3JyZWN0XG5cdFx0XHRcdFx0b3V0W1JdW0NdID0gbmV3IERhdGUoZGQucmVhZF9zaGlmdCgtOCwgJ2YnKSAtIDB4Mzg4MzE3NTMzNDAwKTtcblx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0Y2FzZSAnVCc6IG91dFtSXVtDXSA9IG5ldyBEYXRlKChkZC5yZWFkX3NoaWZ0KDQpIC0gMHgyNTNEOEMpICogMHg1MjY1QzAwICsgZGQucmVhZF9zaGlmdCg0KSk7IGJyZWFrO1xuXHRcdFx0XHRjYXNlICdZJzogb3V0W1JdW0NdID0gZGQucmVhZF9zaGlmdCg0LCdpJykvMWU0OyBicmVhaztcblx0XHRcdFx0Y2FzZSAnTyc6IG91dFtSXVtDXSA9IC1kZC5yZWFkX3NoaWZ0KC04LCAnZicpOyBicmVhaztcblx0XHRcdFx0Y2FzZSAnQic6IGlmKHZmcCAmJiBmaWVsZHNbQ10ubGVuID09IDgpIHsgb3V0W1JdW0NdID0gZGQucmVhZF9zaGlmdCg4LCdmJyk7IGJyZWFrOyB9XG5cdFx0XHRcdFx0LyogZmFsbHMgdGhyb3VnaCAqL1xuXHRcdFx0XHRjYXNlICdHJzogY2FzZSAnUCc6IGRkLmwgKz0gZmllbGRzW0NdLmxlbjsgYnJlYWs7XG5cdFx0XHRcdGNhc2UgJzAnOlxuXHRcdFx0XHRcdGlmKGZpZWxkc1tDXS5uYW1lID09PSAnX051bGxGbGFncycpIGJyZWFrO1xuXHRcdFx0XHRcdC8qIGZhbGxzIHRocm91Z2ggKi9cblx0XHRcdFx0ZGVmYXVsdDogdGhyb3cgbmV3IEVycm9yKFwiREJGIFVuc3VwcG9ydGVkIGRhdGEgdHlwZSBcIiArIGZpZWxkc1tDXS50eXBlKTtcblx0XHRcdH1cblx0XHR9XG5cdH1cblx0aWYoZnQgIT0gMHgwMikgaWYoZC5sIDwgZC5sZW5ndGggJiYgZFtkLmwrK10gIT0gMHgxQSkgdGhyb3cgbmV3IEVycm9yKFwiREJGIEVPRiBNYXJrZXIgbWlzc2luZyBcIiArIChkLmwtMSkgKyBcIiBvZiBcIiArIGQubGVuZ3RoICsgXCIgXCIgKyBkW2QubC0xXS50b1N0cmluZygxNikpO1xuXHRpZihvcHRzICYmIG9wdHMuc2hlZXRSb3dzKSBvdXQgPSBvdXQuc2xpY2UoMCwgb3B0cy5zaGVldFJvd3MpO1xuXHRyZXR1cm4gb3V0O1xufVxuXG5mdW5jdGlvbiBkYmZfdG9fc2hlZXQoYnVmLCBvcHRzKSB7XG5cdHZhciBvID0gb3B0cyB8fCB7fTtcblx0aWYoIW8uZGF0ZU5GKSBvLmRhdGVORiA9IFwieXl5eW1tZGRcIjtcblx0cmV0dXJuIGFvYV90b19zaGVldChkYmZfdG9fYW9hKGJ1ZiwgbyksIG8pO1xufVxuXG5mdW5jdGlvbiBkYmZfdG9fd29ya2Jvb2soYnVmLCBvcHRzKSB7XG5cdHRyeSB7IHJldHVybiBzaGVldF90b193b3JrYm9vayhkYmZfdG9fc2hlZXQoYnVmLCBvcHRzKSwgb3B0cyk7IH1cblx0Y2F0Y2goZSkgeyBpZihvcHRzICYmIG9wdHMuV1RGKSB0aHJvdyBlOyB9XG5cdHJldHVybiAoe1NoZWV0TmFtZXM6W10sU2hlZXRzOnt9fSk7XG59XG5cbnZhciBfUkxFTiA9IHsgJ0InOiA4LCAnQyc6IDI1MCwgJ0wnOiAxLCAnRCc6IDgsICc/JzogMCwgJyc6IDAgfTtcbmZ1bmN0aW9uIHNoZWV0X3RvX2RiZih3cywgb3B0cykge1xuXHR2YXIgbyA9IG9wdHMgfHwge307XG5cdGlmKCtvLmNvZGVwYWdlID49IDApIHNldF9jcCgrby5jb2RlcGFnZSk7XG5cdGlmKG8udHlwZSA9PSBcInN0cmluZ1wiKSB0aHJvdyBuZXcgRXJyb3IoXCJDYW5ub3Qgd3JpdGUgREJGIHRvIEpTIHN0cmluZ1wiKTtcblx0dmFyIGJhID0gYnVmX2FycmF5KCk7XG5cdHZhciBhb2EgPSBzaGVldF90b19qc29uKHdzLCB7aGVhZGVyOjEsIHJhdzp0cnVlLCBjZWxsRGF0ZXM6dHJ1ZX0pO1xuXHR2YXIgaGVhZGVycyA9IGFvYVswXSwgZGF0YSA9IGFvYS5zbGljZSgxKTtcblx0dmFyIGkgPSAwLCBqID0gMCwgaGNudCA9IDAsIHJsZW4gPSAxO1xuXHRmb3IoaSA9IDA7IGkgPCBoZWFkZXJzLmxlbmd0aDsgKytpKSB7XG5cdFx0aWYoaSA9PSBudWxsKSBjb250aW51ZTtcblx0XHQrK2hjbnQ7XG5cdFx0aWYodHlwZW9mIGhlYWRlcnNbaV0gPT09ICdudW1iZXInKSBoZWFkZXJzW2ldID0gaGVhZGVyc1tpXS50b1N0cmluZygxMCk7XG5cdFx0aWYodHlwZW9mIGhlYWRlcnNbaV0gIT09ICdzdHJpbmcnKSB0aHJvdyBuZXcgRXJyb3IoXCJEQkYgSW52YWxpZCBjb2x1bW4gbmFtZSBcIiArIGhlYWRlcnNbaV0gKyBcIiB8XCIgKyAodHlwZW9mIGhlYWRlcnNbaV0pICsgXCJ8XCIpO1xuXHRcdGlmKGhlYWRlcnMuaW5kZXhPZihoZWFkZXJzW2ldKSAhPT0gaSkgZm9yKGo9MDsgajwxMDI0Oysrailcblx0XHRcdGlmKGhlYWRlcnMuaW5kZXhPZihoZWFkZXJzW2ldICsgXCJfXCIgKyBqKSA9PSAtMSkgeyBoZWFkZXJzW2ldICs9IFwiX1wiICsgajsgYnJlYWs7IH1cblx0fVxuXHR2YXIgcmFuZ2UgPSBzYWZlX2RlY29kZV9yYW5nZSh3c1snIXJlZiddKTtcblx0dmFyIGNvbHR5cGVzID0gW107XG5cdGZvcihpID0gMDsgaSA8PSByYW5nZS5lLmMgLSByYW5nZS5zLmM7ICsraSkge1xuXHRcdHZhciBjb2wgPSBbXTtcblx0XHRmb3Ioaj0wOyBqIDwgZGF0YS5sZW5ndGg7ICsraikge1xuXHRcdFx0aWYoZGF0YVtqXVtpXSAhPSBudWxsKSBjb2wucHVzaChkYXRhW2pdW2ldKTtcblx0XHR9XG5cdFx0aWYoY29sLmxlbmd0aCA9PSAwIHx8IGhlYWRlcnNbaV0gPT0gbnVsbCkgeyBjb2x0eXBlc1tpXSA9ICc/JzsgY29udGludWU7IH1cblx0XHR2YXIgZ3Vlc3MgPSAnJywgX2d1ZXNzID0gJyc7XG5cdFx0Zm9yKGogPSAwOyBqIDwgY29sLmxlbmd0aDsgKytqKSB7XG5cdFx0XHRzd2l0Y2godHlwZW9mIGNvbFtqXSkge1xuXHRcdFx0XHQvKiBUT0RPOiBjaGVjayBpZiBMMiBjb21wYXQgaXMgZGVzaXJlZCAqL1xuXHRcdFx0XHRjYXNlICdudW1iZXInOiBfZ3Vlc3MgPSAnQic7IGJyZWFrO1xuXHRcdFx0XHRjYXNlICdzdHJpbmcnOiBfZ3Vlc3MgPSAnQyc7IGJyZWFrO1xuXHRcdFx0XHRjYXNlICdib29sZWFuJzogX2d1ZXNzID0gJ0wnOyBicmVhaztcblx0XHRcdFx0Y2FzZSAnb2JqZWN0JzogX2d1ZXNzID0gY29sW2pdIGluc3RhbmNlb2YgRGF0ZSA/ICdEJyA6ICdDJzsgYnJlYWs7XG5cdFx0XHRcdGRlZmF1bHQ6IF9ndWVzcyA9ICdDJztcblx0XHRcdH1cblx0XHRcdGd1ZXNzID0gZ3Vlc3MgJiYgZ3Vlc3MgIT0gX2d1ZXNzID8gJ0MnIDogX2d1ZXNzO1xuXHRcdFx0aWYoZ3Vlc3MgPT0gJ0MnKSBicmVhaztcblx0XHR9XG5cdFx0cmxlbiArPSBfUkxFTltndWVzc10gfHwgMDtcblx0XHRjb2x0eXBlc1tpXSA9IGd1ZXNzO1xuXHR9XG5cblx0dmFyIGggPSBiYS5uZXh0KDMyKTtcblx0aC53cml0ZV9zaGlmdCg0LCAweDEzMDIxMTMwKTtcblx0aC53cml0ZV9zaGlmdCg0LCBkYXRhLmxlbmd0aCk7XG5cdGgud3JpdGVfc2hpZnQoMiwgMjk2ICsgMzIgKiBoY250KTtcblx0aC53cml0ZV9zaGlmdCgyLCBybGVuKTtcblx0Zm9yKGk9MDsgaSA8IDQ7ICsraSkgaC53cml0ZV9zaGlmdCg0LCAwKTtcblx0aC53cml0ZV9zaGlmdCg0LCAweDAwMDAwMDAwIHwgKCgrZGJmX3JldmVyc2VfbWFwW2N1cnJlbnRfYW5zaV0gfHwgMHgwMyk8PDgpKTtcblxuXHRmb3IoaSA9IDAsIGogPSAwOyBpIDwgaGVhZGVycy5sZW5ndGg7ICsraSkge1xuXHRcdGlmKGhlYWRlcnNbaV0gPT0gbnVsbCkgY29udGludWU7XG5cdFx0dmFyIGhmID0gYmEubmV4dCgzMik7XG5cdFx0dmFyIF9mID0gKGhlYWRlcnNbaV0uc2xpY2UoLTEwKSArIFwiXFx4MDBcXHgwMFxceDAwXFx4MDBcXHgwMFxceDAwXFx4MDBcXHgwMFxceDAwXFx4MDBcXHgwMFwiKS5zbGljZSgwLCAxMSk7XG5cdFx0aGYud3JpdGVfc2hpZnQoMSwgX2YsIFwic2Jjc1wiKTtcblx0XHRoZi53cml0ZV9zaGlmdCgxLCBjb2x0eXBlc1tpXSA9PSAnPycgPyAnQycgOiBjb2x0eXBlc1tpXSwgXCJzYmNzXCIpO1xuXHRcdGhmLndyaXRlX3NoaWZ0KDQsIGopO1xuXHRcdGhmLndyaXRlX3NoaWZ0KDEsIF9STEVOW2NvbHR5cGVzW2ldXSB8fCAwKTtcblx0XHRoZi53cml0ZV9zaGlmdCgxLCAwKTtcblx0XHRoZi53cml0ZV9zaGlmdCgxLCAweDAyKTtcblx0XHRoZi53cml0ZV9zaGlmdCg0LCAwKTtcblx0XHRoZi53cml0ZV9zaGlmdCgxLCAwKTtcblx0XHRoZi53cml0ZV9zaGlmdCg0LCAwKTtcblx0XHRoZi53cml0ZV9zaGlmdCg0LCAwKTtcblx0XHRqICs9IF9STEVOW2NvbHR5cGVzW2ldXSB8fCAwO1xuXHR9XG5cblx0dmFyIGhiID0gYmEubmV4dCgyNjQpO1xuXHRoYi53cml0ZV9zaGlmdCg0LCAweDAwMDAwMDBEKTtcblx0Zm9yKGk9MDsgaSA8IDY1OysraSkgaGIud3JpdGVfc2hpZnQoNCwgMHgwMDAwMDAwMCk7XG5cdGZvcihpPTA7IGkgPCBkYXRhLmxlbmd0aDsgKytpKSB7XG5cdFx0dmFyIHJvdXQgPSBiYS5uZXh0KHJsZW4pO1xuXHRcdHJvdXQud3JpdGVfc2hpZnQoMSwgMCk7XG5cdFx0Zm9yKGo9MDsgajxoZWFkZXJzLmxlbmd0aDsgKytqKSB7XG5cdFx0XHRpZihoZWFkZXJzW2pdID09IG51bGwpIGNvbnRpbnVlO1xuXHRcdFx0c3dpdGNoKGNvbHR5cGVzW2pdKSB7XG5cdFx0XHRcdGNhc2UgJ0wnOiByb3V0LndyaXRlX3NoaWZ0KDEsIGRhdGFbaV1bal0gPT0gbnVsbCA/IDB4M0YgOiBkYXRhW2ldW2pdID8gMHg1NCA6IDB4NDYpOyBicmVhaztcblx0XHRcdFx0Y2FzZSAnQic6IHJvdXQud3JpdGVfc2hpZnQoOCwgZGF0YVtpXVtqXXx8MCwgJ2YnKTsgYnJlYWs7XG5cdFx0XHRcdGNhc2UgJ0QnOlxuXHRcdFx0XHRcdGlmKCFkYXRhW2ldW2pdKSByb3V0LndyaXRlX3NoaWZ0KDgsIFwiMDAwMDAwMDBcIiwgXCJzYmNzXCIpO1xuXHRcdFx0XHRcdGVsc2Uge1xuXHRcdFx0XHRcdFx0cm91dC53cml0ZV9zaGlmdCg0LCAoXCIwMDAwXCIrZGF0YVtpXVtqXS5nZXRGdWxsWWVhcigpKS5zbGljZSgtNCksIFwic2Jjc1wiKTtcblx0XHRcdFx0XHRcdHJvdXQud3JpdGVfc2hpZnQoMiwgKFwiMDBcIisoZGF0YVtpXVtqXS5nZXRNb250aCgpKzEpKS5zbGljZSgtMiksIFwic2Jjc1wiKTtcblx0XHRcdFx0XHRcdHJvdXQud3JpdGVfc2hpZnQoMiwgKFwiMDBcIitkYXRhW2ldW2pdLmdldERhdGUoKSkuc2xpY2UoLTIpLCBcInNiY3NcIik7XG5cdFx0XHRcdFx0fSBicmVhaztcblx0XHRcdFx0Y2FzZSAnQyc6XG5cdFx0XHRcdFx0dmFyIF9zID0gU3RyaW5nKGRhdGFbaV1bal18fFwiXCIpO1xuXHRcdFx0XHRcdHJvdXQud3JpdGVfc2hpZnQoMSwgX3MsIFwic2Jjc1wiKTtcblx0XHRcdFx0XHRmb3IoaGNudD0wOyBoY250IDwgMjUwLV9zLmxlbmd0aDsgKytoY250KSByb3V0LndyaXRlX3NoaWZ0KDEsIDB4MjApOyBicmVhaztcblx0XHRcdH1cblx0XHR9XG5cdFx0Ly8gZGF0YVxuXHR9XG5cdGJhLm5leHQoMSkud3JpdGVfc2hpZnQoMSwgMHgxQSk7XG5cdHJldHVybiBiYS5lbmQoKTtcbn1cblx0cmV0dXJuIHtcblx0XHR2ZXJzaW9uczogREJGX1NVUFBPUlRFRF9WRVJTSU9OUyxcblx0XHR0b193b3JrYm9vazogZGJmX3RvX3dvcmtib29rLFxuXHRcdHRvX3NoZWV0OiBkYmZfdG9fc2hlZXQsXG5cdFx0ZnJvbV9zaGVldDogc2hlZXRfdG9fZGJmXG5cdH07XG59KSgpO1xuXG52YXIgU1lMSyA9IChmdW5jdGlvbigpIHtcblx0LyogVE9ETzogc3RyZXNzIHRlc3Qgc2VxdWVuY2VzICovXG5cdHZhciBzeWxrX2VzY2FwZXMgPSAoe1xuXHRcdEFBOifDgCcsIEJBOifDgScsIENBOifDgicsIERBOjE5NSwgSEE6J8OEJywgSkE6MTk3LFxuXHRcdEFFOifDiCcsIEJFOifDiScsIENFOifDiicsICAgICAgICAgSEU6J8OLJyxcblx0XHRBSTonw4wnLCBCSTonw40nLCBDSTonw44nLCAgICAgICAgIEhJOifDjycsXG5cdFx0QU86J8OSJywgQk86J8OTJywgQ086J8OUJywgRE86MjEzLCBITzonw5YnLFxuXHRcdEFVOifDmScsIEJVOifDmicsIENVOifDmycsICAgICAgICAgSFU6J8OcJyxcblx0XHRBYTonw6AnLCBCYTonw6EnLCBDYTonw6InLCBEYToyMjcsIEhhOifDpCcsIEphOjIyOSxcblx0XHRBZTonw6gnLCBCZTonw6knLCBDZTonw6onLCAgICAgICAgIEhlOifDqycsXG5cdFx0QWk6J8OsJywgQmk6J8OtJywgQ2k6J8OuJywgICAgICAgICBIaTonw68nLFxuXHRcdEFvOifDsicsIEJvOifDsycsIENvOifDtCcsIERvOjI0NSwgSG86J8O2Jyxcblx0XHRBdTonw7knLCBCdTonw7onLCBDdTonw7snLCAgICAgICAgIEh1OifDvCcsXG5cdFx0S0M6J8OHJywgS2M6J8OnJywgcTonw6YnLCAgejonxZMnLCAgYTonw4YnLCAgajonxZInLFxuXHRcdEROOjIwOSwgRG46MjQxLCBIeToyNTUsXG5cdFx0UzoxNjksICBjOjE3MCwgIFI6MTc0LCAgQjoxODAsXG4wOjE3NiwgICAgMToxNzcsICAyOjE3OCxcbjM6MTc5LCAgICA1OjE4MSwgIDY6MTgyLFxuNzoxODMsICAgIFE6MTg1LCAgazoxODYsICBiOjIwOCwgIGk6MjE2LCAgbDoyMjIsICBzOjI0MCwgIHk6MjQ4LFxuXHRcdFwiIVwiOjE2MSwgJ1wiJzoxNjIsIFwiI1wiOjE2MywgXCIoXCI6MTY0LCBcIiVcIjoxNjUsIFwiJ1wiOjE2NywgXCJIIFwiOjE2OCxcblx0XHRcIitcIjoxNzEsIFwiO1wiOjE4NywgXCI8XCI6MTg4LCBcIj1cIjoxODksIFwiPlwiOjE5MCwgXCI/XCI6MTkxLCBcIntcIjoyMjNcblx0fSk7XG5cdHZhciBzeWxrX2NoYXJfcmVnZXggPSBuZXcgUmVnRXhwKFwiXFx1MDAxQk4oXCIgKyBrZXlzKHN5bGtfZXNjYXBlcykuam9pbihcInxcIikucmVwbGFjZSgvXFx8XFx8XFx8LywgXCJ8XFxcXHx8XCIpLnJlcGxhY2UoLyhbPygpK10pL2csXCJcXFxcJDFcIikgKyBcInxcXFxcfClcIiwgXCJnbVwiKTtcblx0dmFyIHN5bGtfY2hhcl9mbiA9IGZ1bmN0aW9uKF8sICQxKXsgdmFyIG8gPSBzeWxrX2VzY2FwZXNbJDFdOyByZXR1cm4gdHlwZW9mIG8gPT0gXCJudW1iZXJcIiA/IF9nZXRhbnNpKG8pIDogbzsgfTtcblx0dmFyIGRlY29kZV9zeWxrX2NoYXIgPSBmdW5jdGlvbigkJCwgJDEsICQyKSB7IHZhciBuZXdjYyA9ICgoJDEuY2hhckNvZGVBdCgwKSAtIDB4MjApPDw0KSB8ICgkMi5jaGFyQ29kZUF0KDApIC0gMHgzMCk7IHJldHVybiBuZXdjYyA9PSA1OSA/ICQkIDogX2dldGFuc2kobmV3Y2MpOyB9O1xuXHRzeWxrX2VzY2FwZXNbXCJ8XCJdID0gMjU0O1xuXHQvKiBUT0RPOiBmaW5kIGFuIGFjdHVhbCBzcGVjaWZpY2F0aW9uICovXG5cdGZ1bmN0aW9uIHN5bGtfdG9fYW9hKGQsIG9wdHMpIHtcblx0XHRzd2l0Y2gob3B0cy50eXBlKSB7XG5cdFx0XHRjYXNlICdiYXNlNjQnOiByZXR1cm4gc3lsa190b19hb2Ffc3RyKEJhc2U2NC5kZWNvZGUoZCksIG9wdHMpO1xuXHRcdFx0Y2FzZSAnYmluYXJ5JzogcmV0dXJuIHN5bGtfdG9fYW9hX3N0cihkLCBvcHRzKTtcblx0XHRcdGNhc2UgJ2J1ZmZlcic6IHJldHVybiBzeWxrX3RvX2FvYV9zdHIoZC50b1N0cmluZygnYmluYXJ5JyksIG9wdHMpO1xuXHRcdFx0Y2FzZSAnYXJyYXknOiByZXR1cm4gc3lsa190b19hb2Ffc3RyKGNjMnN0cihkKSwgb3B0cyk7XG5cdFx0fVxuXHRcdHRocm93IG5ldyBFcnJvcihcIlVucmVjb2duaXplZCB0eXBlIFwiICsgb3B0cy50eXBlKTtcblx0fVxuXHRmdW5jdGlvbiBzeWxrX3RvX2FvYV9zdHIoc3RyLCBvcHRzKSB7XG5cdFx0dmFyIHJlY29yZHMgPSBzdHIuc3BsaXQoL1tcXG5cXHJdKy8pLCBSID0gLTEsIEMgPSAtMSwgcmkgPSAwLCByaiA9IDAsIGFyciA9IFtdO1xuXHRcdHZhciBmb3JtYXRzID0gW107XG5cdFx0dmFyIG5leHRfY2VsbF9mb3JtYXQgPSBudWxsO1xuXHRcdHZhciBzaHQgPSB7fSwgcm93aW5mbyA9IFtdLCBjb2xpbmZvID0gW10sIGN3ID0gW107XG5cdFx0dmFyIE12YWwgPSAwLCBqO1xuXHRcdGlmKCtvcHRzLmNvZGVwYWdlID49IDApIHNldF9jcCgrb3B0cy5jb2RlcGFnZSk7XG5cdFx0Zm9yICg7IHJpICE9PSByZWNvcmRzLmxlbmd0aDsgKytyaSkge1xuXHRcdFx0TXZhbCA9IDA7XG5cdFx0XHR2YXIgcnN0cj1yZWNvcmRzW3JpXS50cmltKCkucmVwbGFjZSgvXFx4MUIoW1xceDIwLVxceDJGXSkoW1xceDMwLVxceDNGXSkvZywgZGVjb2RlX3N5bGtfY2hhcikucmVwbGFjZShzeWxrX2NoYXJfcmVnZXgsIHN5bGtfY2hhcl9mbik7XG5cdFx0XHR2YXIgcmVjb3JkPXJzdHIucmVwbGFjZSgvOzsvZywgXCJcXHUwMDAwXCIpLnNwbGl0KFwiO1wiKS5tYXAoZnVuY3Rpb24oeCkgeyByZXR1cm4geC5yZXBsYWNlKC9cXHUwMDAwL2csIFwiO1wiKTsgfSk7XG5cdFx0XHR2YXIgUlQ9cmVjb3JkWzBdLCB2YWw7XG5cdFx0XHRpZihyc3RyLmxlbmd0aCA+IDApIHN3aXRjaChSVCkge1xuXHRcdFx0Y2FzZSAnSUQnOiBicmVhazsgLyogaGVhZGVyICovXG5cdFx0XHRjYXNlICdFJzogYnJlYWs7IC8qIEVPRiAqL1xuXHRcdFx0Y2FzZSAnQic6IGJyZWFrOyAvKiBkaW1lbnNpb25zICovXG5cdFx0XHRjYXNlICdPJzogYnJlYWs7IC8qIG9wdGlvbnM/ICovXG5cdFx0XHRjYXNlICdQJzpcblx0XHRcdFx0aWYocmVjb3JkWzFdLmNoYXJBdCgwKSA9PSAnUCcpXG5cdFx0XHRcdFx0Zm9ybWF0cy5wdXNoKHJzdHIuc2xpY2UoMykucmVwbGFjZSgvOzsvZywgXCI7XCIpKTtcblx0XHRcdFx0YnJlYWs7XG5cdFx0XHRjYXNlICdDJzpcblx0XHRcdHZhciBDX3NlZW5fSyA9IGZhbHNlLCBDX3NlZW5fWCA9IGZhbHNlLCBDX3NlZW5fUyA9IGZhbHNlLCBDX3NlZW5fRSA9IGZhbHNlLCBfUiA9IC0xLCBfQyA9IC0xO1xuXHRcdFx0Zm9yKHJqPTE7IHJqPHJlY29yZC5sZW5ndGg7ICsrcmopIHN3aXRjaChyZWNvcmRbcmpdLmNoYXJBdCgwKSkge1xuXHRcdFx0XHRjYXNlICdBJzogYnJlYWs7IC8vIFRPRE86IGNvbW1lbnRcblx0XHRcdFx0Y2FzZSAnWCc6IEMgPSBwYXJzZUludChyZWNvcmRbcmpdLnNsaWNlKDEpKS0xOyBDX3NlZW5fWCA9IHRydWU7IGJyZWFrO1xuXHRcdFx0XHRjYXNlICdZJzpcblx0XHRcdFx0XHRSID0gcGFyc2VJbnQocmVjb3JkW3JqXS5zbGljZSgxKSktMTsgaWYoIUNfc2Vlbl9YKSBDID0gMDtcblx0XHRcdFx0XHRmb3IoaiA9IGFyci5sZW5ndGg7IGogPD0gUjsgKytqKSBhcnJbal0gPSBbXTtcblx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0Y2FzZSAnSyc6XG5cdFx0XHRcdFx0dmFsID0gcmVjb3JkW3JqXS5zbGljZSgxKTtcblx0XHRcdFx0XHRpZih2YWwuY2hhckF0KDApID09PSAnXCInKSB2YWwgPSB2YWwuc2xpY2UoMSx2YWwubGVuZ3RoIC0gMSk7XG5cdFx0XHRcdFx0ZWxzZSBpZih2YWwgPT09ICdUUlVFJykgdmFsID0gdHJ1ZTtcblx0XHRcdFx0XHRlbHNlIGlmKHZhbCA9PT0gJ0ZBTFNFJykgdmFsID0gZmFsc2U7XG5cdFx0XHRcdFx0ZWxzZSBpZighaXNOYU4oZnV6enludW0odmFsKSkpIHtcblx0XHRcdFx0XHRcdHZhbCA9IGZ1enp5bnVtKHZhbCk7XG5cdFx0XHRcdFx0XHRpZihuZXh0X2NlbGxfZm9ybWF0ICE9PSBudWxsICYmIFNTRi5pc19kYXRlKG5leHRfY2VsbF9mb3JtYXQpKSB2YWwgPSBudW1kYXRlKHZhbCk7XG5cdFx0XHRcdFx0fSBlbHNlIGlmKCFpc05hTihmdXp6eWRhdGUodmFsKS5nZXREYXRlKCkpKSB7XG5cdFx0XHRcdFx0XHR2YWwgPSBwYXJzZURhdGUodmFsKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0aWYodHlwZW9mIGNwdGFibGUgIT09ICd1bmRlZmluZWQnICYmIHR5cGVvZiB2YWwgPT0gXCJzdHJpbmdcIiAmJiAoKG9wdHN8fHt9KS50eXBlICE9IFwic3RyaW5nXCIpICYmIChvcHRzfHx7fSkuY29kZXBhZ2UpIHZhbCA9IGNwdGFibGUudXRpbHMuZGVjb2RlKG9wdHMuY29kZXBhZ2UsIHZhbCk7XG5cdFx0XHRcdFx0Q19zZWVuX0sgPSB0cnVlO1xuXHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRjYXNlICdFJzpcblx0XHRcdFx0XHRDX3NlZW5fRSA9IHRydWU7XG5cdFx0XHRcdFx0dmFyIGZvcm11bGEgPSByY190b19hMShyZWNvcmRbcmpdLnNsaWNlKDEpLCB7cjpSLGM6Q30pO1xuXHRcdFx0XHRcdGFycltSXVtDXSA9IFthcnJbUl1bQ10sIGZvcm11bGFdO1xuXHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRjYXNlICdTJzpcblx0XHRcdFx0XHRDX3NlZW5fUyA9IHRydWU7XG5cdFx0XHRcdFx0YXJyW1JdW0NdID0gW2FycltSXVtDXSwgXCJTNVNcIl07XG5cdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdGNhc2UgJ0cnOiBicmVhazsgLy8gdW5rbm93blxuXHRcdFx0XHRjYXNlICdSJzogX1IgPSBwYXJzZUludChyZWNvcmRbcmpdLnNsaWNlKDEpKS0xOyBicmVhaztcblx0XHRcdFx0Y2FzZSAnQyc6IF9DID0gcGFyc2VJbnQocmVjb3JkW3JqXS5zbGljZSgxKSktMTsgYnJlYWs7XG5cdFx0XHRcdGRlZmF1bHQ6IGlmKG9wdHMgJiYgb3B0cy5XVEYpIHRocm93IG5ldyBFcnJvcihcIlNZTEsgYmFkIHJlY29yZCBcIiArIHJzdHIpO1xuXHRcdFx0fVxuXHRcdFx0aWYoQ19zZWVuX0spIHtcblx0XHRcdFx0aWYoYXJyW1JdW0NdICYmIGFycltSXVtDXS5sZW5ndGggPT0gMikgYXJyW1JdW0NdWzBdID0gdmFsO1xuXHRcdFx0XHRlbHNlIGFycltSXVtDXSA9IHZhbDtcblx0XHRcdFx0bmV4dF9jZWxsX2Zvcm1hdCA9IG51bGw7XG5cdFx0XHR9XG5cdFx0XHRpZihDX3NlZW5fUykge1xuXHRcdFx0XHRpZihDX3NlZW5fRSkgdGhyb3cgbmV3IEVycm9yKFwiU1lMSyBzaGFyZWQgZm9ybXVsYSBjYW5ub3QgaGF2ZSBvd24gZm9ybXVsYVwiKTtcblx0XHRcdFx0dmFyIHNocmJhc2UgPSBfUiA+IC0xICYmIGFycltfUl1bX0NdO1xuXHRcdFx0XHRpZighc2hyYmFzZSB8fCAhc2hyYmFzZVsxXSkgdGhyb3cgbmV3IEVycm9yKFwiU1lMSyBzaGFyZWQgZm9ybXVsYSBjYW5ub3QgZmluZCBiYXNlXCIpO1xuXHRcdFx0XHRhcnJbUl1bQ11bMV0gPSBzaGlmdF9mb3JtdWxhX3N0cihzaHJiYXNlWzFdLCB7cjogUiAtIF9SLCBjOiBDIC0gX0N9KTtcblx0XHRcdH1cblx0XHRcdGJyZWFrO1xuXHRcdFx0Y2FzZSAnRic6XG5cdFx0XHR2YXIgRl9zZWVuID0gMDtcblx0XHRcdGZvcihyaj0xOyByajxyZWNvcmQubGVuZ3RoOyArK3JqKSBzd2l0Y2gocmVjb3JkW3JqXS5jaGFyQXQoMCkpIHtcblx0XHRcdFx0Y2FzZSAnWCc6IEMgPSBwYXJzZUludChyZWNvcmRbcmpdLnNsaWNlKDEpKS0xOyArK0Zfc2VlbjsgYnJlYWs7XG5cdFx0XHRcdGNhc2UgJ1knOlxuXHRcdFx0XHRcdFIgPSBwYXJzZUludChyZWNvcmRbcmpdLnNsaWNlKDEpKS0xOyAvKkMgPSAwOyovXG5cdFx0XHRcdFx0Zm9yKGogPSBhcnIubGVuZ3RoOyBqIDw9IFI7ICsraikgYXJyW2pdID0gW107XG5cdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdGNhc2UgJ00nOiBNdmFsID0gcGFyc2VJbnQocmVjb3JkW3JqXS5zbGljZSgxKSkgLyAyMDsgYnJlYWs7XG5cdFx0XHRcdGNhc2UgJ0YnOiBicmVhazsgLyogPz8/ICovXG5cdFx0XHRcdGNhc2UgJ0cnOiBicmVhazsgLyogaGlkZSBncmlkICovXG5cdFx0XHRcdGNhc2UgJ1AnOlxuXHRcdFx0XHRcdG5leHRfY2VsbF9mb3JtYXQgPSBmb3JtYXRzW3BhcnNlSW50KHJlY29yZFtyal0uc2xpY2UoMSkpXTtcblx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0Y2FzZSAnUyc6IGJyZWFrOyAvKiBjZWxsIHN0eWxlICovXG5cdFx0XHRcdGNhc2UgJ0QnOiBicmVhazsgLyogY29sdW1uICovXG5cdFx0XHRcdGNhc2UgJ04nOiBicmVhazsgLyogZm9udCAqL1xuXHRcdFx0XHRjYXNlICdXJzpcblx0XHRcdFx0XHRjdyA9IHJlY29yZFtyal0uc2xpY2UoMSkuc3BsaXQoXCIgXCIpO1xuXHRcdFx0XHRcdGZvcihqID0gcGFyc2VJbnQoY3dbMF0sIDEwKTsgaiA8PSBwYXJzZUludChjd1sxXSwgMTApOyArK2opIHtcblx0XHRcdFx0XHRcdE12YWwgPSBwYXJzZUludChjd1syXSwgMTApO1xuXHRcdFx0XHRcdFx0Y29saW5mb1tqLTFdID0gTXZhbCA9PT0gMCA/IHtoaWRkZW46dHJ1ZX06IHt3Y2g6TXZhbH07IHByb2Nlc3NfY29sKGNvbGluZm9bai0xXSk7XG5cdFx0XHRcdFx0fSBicmVhaztcblx0XHRcdFx0Y2FzZSAnQyc6IC8qIGRlZmF1bHQgY29sdW1uIGZvcm1hdCAqL1xuXHRcdFx0XHRcdEMgPSBwYXJzZUludChyZWNvcmRbcmpdLnNsaWNlKDEpKS0xO1xuXHRcdFx0XHRcdGlmKCFjb2xpbmZvW0NdKSBjb2xpbmZvW0NdID0ge307XG5cdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdGNhc2UgJ1InOiAvKiByb3cgcHJvcGVydGllcyAqL1xuXHRcdFx0XHRcdFIgPSBwYXJzZUludChyZWNvcmRbcmpdLnNsaWNlKDEpKS0xO1xuXHRcdFx0XHRcdGlmKCFyb3dpbmZvW1JdKSByb3dpbmZvW1JdID0ge307XG5cdFx0XHRcdFx0aWYoTXZhbCA+IDApIHsgcm93aW5mb1tSXS5ocHQgPSBNdmFsOyByb3dpbmZvW1JdLmhweCA9IHB0MnB4KE12YWwpOyB9XG5cdFx0XHRcdFx0ZWxzZSBpZihNdmFsID09PSAwKSByb3dpbmZvW1JdLmhpZGRlbiA9IHRydWU7XG5cdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdGRlZmF1bHQ6IGlmKG9wdHMgJiYgb3B0cy5XVEYpIHRocm93IG5ldyBFcnJvcihcIlNZTEsgYmFkIHJlY29yZCBcIiArIHJzdHIpO1xuXHRcdFx0fVxuXHRcdFx0aWYoRl9zZWVuIDwgMSkgbmV4dF9jZWxsX2Zvcm1hdCA9IG51bGw7IGJyZWFrO1xuXHRcdFx0ZGVmYXVsdDogaWYob3B0cyAmJiBvcHRzLldURikgdGhyb3cgbmV3IEVycm9yKFwiU1lMSyBiYWQgcmVjb3JkIFwiICsgcnN0cik7XG5cdFx0XHR9XG5cdFx0fVxuXHRcdGlmKHJvd2luZm8ubGVuZ3RoID4gMCkgc2h0Wychcm93cyddID0gcm93aW5mbztcblx0XHRpZihjb2xpbmZvLmxlbmd0aCA+IDApIHNodFsnIWNvbHMnXSA9IGNvbGluZm87XG5cdFx0aWYob3B0cyAmJiBvcHRzLnNoZWV0Um93cykgYXJyID0gYXJyLnNsaWNlKDAsIG9wdHMuc2hlZXRSb3dzKTtcblx0XHRyZXR1cm4gW2Fyciwgc2h0XTtcblx0fVxuXG5cdGZ1bmN0aW9uIHN5bGtfdG9fc2hlZXQoZCwgb3B0cykge1xuXHRcdHZhciBhb2FzaHQgPSBzeWxrX3RvX2FvYShkLCBvcHRzKTtcblx0XHR2YXIgYW9hID0gYW9hc2h0WzBdLCB3cyA9IGFvYXNodFsxXTtcblx0XHR2YXIgbyA9IGFvYV90b19zaGVldChhb2EsIG9wdHMpO1xuXHRcdGtleXMod3MpLmZvckVhY2goZnVuY3Rpb24oaykgeyBvW2tdID0gd3Nba107IH0pO1xuXHRcdHJldHVybiBvO1xuXHR9XG5cblx0ZnVuY3Rpb24gc3lsa190b193b3JrYm9vayhkLCBvcHRzKSB7IHJldHVybiBzaGVldF90b193b3JrYm9vayhzeWxrX3RvX3NoZWV0KGQsIG9wdHMpLCBvcHRzKTsgfVxuXG5cdGZ1bmN0aW9uIHdyaXRlX3dzX2NlbGxfc3lsayhjZWxsLCB3cywgUiwgQykge1xuXHRcdHZhciBvID0gXCJDO1lcIiArIChSKzEpICsgXCI7WFwiICsgKEMrMSkgKyBcIjtLXCI7XG5cdFx0c3dpdGNoKGNlbGwudCkge1xuXHRcdFx0Y2FzZSAnbic6XG5cdFx0XHRcdG8gKz0gKGNlbGwudnx8MCk7XG5cdFx0XHRcdGlmKGNlbGwuZiAmJiAhY2VsbC5GKSBvICs9IFwiO0VcIiArIGExX3RvX3JjKGNlbGwuZiwge3I6UiwgYzpDfSk7IGJyZWFrO1xuXHRcdFx0Y2FzZSAnYic6IG8gKz0gY2VsbC52ID8gXCJUUlVFXCIgOiBcIkZBTFNFXCI7IGJyZWFrO1xuXHRcdFx0Y2FzZSAnZSc6IG8gKz0gY2VsbC53IHx8IGNlbGwudjsgYnJlYWs7XG5cdFx0XHRjYXNlICdkJzogbyArPSAnXCInICsgKGNlbGwudyB8fCBjZWxsLnYpICsgJ1wiJzsgYnJlYWs7XG5cdFx0XHRjYXNlICdzJzogbyArPSAnXCInICsgY2VsbC52LnJlcGxhY2UoL1wiL2csXCJcIikgKyAnXCInOyBicmVhaztcblx0XHR9XG5cdFx0cmV0dXJuIG87XG5cdH1cblxuXHRmdW5jdGlvbiB3cml0ZV93c19jb2xzX3N5bGsob3V0LCBjb2xzKSB7XG5cdFx0Y29scy5mb3JFYWNoKGZ1bmN0aW9uKGNvbCwgaSkge1xuXHRcdFx0dmFyIHJlYyA9IFwiRjtXXCIgKyAoaSsxKSArIFwiIFwiICsgKGkrMSkgKyBcIiBcIjtcblx0XHRcdGlmKGNvbC5oaWRkZW4pIHJlYyArPSBcIjBcIjtcblx0XHRcdGVsc2Uge1xuXHRcdFx0XHRpZih0eXBlb2YgY29sLndpZHRoID09ICdudW1iZXInKSBjb2wud3B4ID0gd2lkdGgycHgoY29sLndpZHRoKTtcblx0XHRcdFx0aWYodHlwZW9mIGNvbC53cHggPT0gJ251bWJlcicpIGNvbC53Y2ggPSBweDJjaGFyKGNvbC53cHgpO1xuXHRcdFx0XHRpZih0eXBlb2YgY29sLndjaCA9PSAnbnVtYmVyJykgcmVjICs9IE1hdGgucm91bmQoY29sLndjaCk7XG5cdFx0XHR9XG5cdFx0XHRpZihyZWMuY2hhckF0KHJlYy5sZW5ndGggLSAxKSAhPSBcIiBcIikgb3V0LnB1c2gocmVjKTtcblx0XHR9KTtcblx0fVxuXG5cdGZ1bmN0aW9uIHdyaXRlX3dzX3Jvd3Nfc3lsayhvdXQsIHJvd3MpIHtcblx0XHRyb3dzLmZvckVhY2goZnVuY3Rpb24ocm93LCBpKSB7XG5cdFx0XHR2YXIgcmVjID0gXCJGO1wiO1xuXHRcdFx0aWYocm93LmhpZGRlbikgcmVjICs9IFwiTTA7XCI7XG5cdFx0XHRlbHNlIGlmKHJvdy5ocHQpIHJlYyArPSBcIk1cIiArIDIwICogcm93LmhwdCArIFwiO1wiO1xuXHRcdFx0ZWxzZSBpZihyb3cuaHB4KSByZWMgKz0gXCJNXCIgKyAyMCAqIHB4MnB0KHJvdy5ocHgpICsgXCI7XCI7XG5cdFx0XHRpZihyZWMubGVuZ3RoID4gMikgb3V0LnB1c2gocmVjICsgXCJSXCIgKyAoaSsxKSk7XG5cdFx0fSk7XG5cdH1cblxuXHRmdW5jdGlvbiBzaGVldF90b19zeWxrKHdzLCBvcHRzKSB7XG5cdFx0dmFyIHByZWFtYmxlID0gW1wiSUQ7UFdYTDtOO0VcIl0sIG8gPSBbXTtcblx0XHR2YXIgciA9IHNhZmVfZGVjb2RlX3JhbmdlKHdzWychcmVmJ10pLCBjZWxsO1xuXHRcdHZhciBkZW5zZSA9IEFycmF5LmlzQXJyYXkod3MpO1xuXHRcdHZhciBSUyA9IFwiXFxyXFxuXCI7XG5cblx0XHRwcmVhbWJsZS5wdXNoKFwiUDtQR2VuZXJhbFwiKTtcblx0XHRwcmVhbWJsZS5wdXNoKFwiRjtQMDtERzBHODtNMjU1XCIpO1xuXHRcdGlmKHdzWychY29scyddKSB3cml0ZV93c19jb2xzX3N5bGsocHJlYW1ibGUsIHdzWychY29scyddKTtcblx0XHRpZih3c1snIXJvd3MnXSkgd3JpdGVfd3Nfcm93c19zeWxrKHByZWFtYmxlLCB3c1snIXJvd3MnXSk7XG5cblx0XHRwcmVhbWJsZS5wdXNoKFwiQjtZXCIgKyAoci5lLnIgLSByLnMuciArIDEpICsgXCI7WFwiICsgKHIuZS5jIC0gci5zLmMgKyAxKSArIFwiO0RcIiArIFtyLnMuYyxyLnMucixyLmUuYyxyLmUucl0uam9pbihcIiBcIikpO1xuXHRcdGZvcih2YXIgUiA9IHIucy5yOyBSIDw9IHIuZS5yOyArK1IpIHtcblx0XHRcdGZvcih2YXIgQyA9IHIucy5jOyBDIDw9IHIuZS5jOyArK0MpIHtcblx0XHRcdFx0dmFyIGNvb3JkID0gZW5jb2RlX2NlbGwoe3I6UixjOkN9KTtcblx0XHRcdFx0Y2VsbCA9IGRlbnNlID8gKHdzW1JdfHxbXSlbQ106IHdzW2Nvb3JkXTtcblx0XHRcdFx0aWYoIWNlbGwgfHwgKGNlbGwudiA9PSBudWxsICYmICghY2VsbC5mIHx8IGNlbGwuRikpKSBjb250aW51ZTtcblx0XHRcdFx0by5wdXNoKHdyaXRlX3dzX2NlbGxfc3lsayhjZWxsLCB3cywgUiwgQywgb3B0cykpO1xuXHRcdFx0fVxuXHRcdH1cblx0XHRyZXR1cm4gcHJlYW1ibGUuam9pbihSUykgKyBSUyArIG8uam9pbihSUykgKyBSUyArIFwiRVwiICsgUlM7XG5cdH1cblxuXHRyZXR1cm4ge1xuXHRcdHRvX3dvcmtib29rOiBzeWxrX3RvX3dvcmtib29rLFxuXHRcdHRvX3NoZWV0OiBzeWxrX3RvX3NoZWV0LFxuXHRcdGZyb21fc2hlZXQ6IHNoZWV0X3RvX3N5bGtcblx0fTtcbn0pKCk7XG5cbnZhciBESUYgPSAoZnVuY3Rpb24oKSB7XG5cdGZ1bmN0aW9uIGRpZl90b19hb2EoZCwgb3B0cykge1xuXHRcdHN3aXRjaChvcHRzLnR5cGUpIHtcblx0XHRcdGNhc2UgJ2Jhc2U2NCc6IHJldHVybiBkaWZfdG9fYW9hX3N0cihCYXNlNjQuZGVjb2RlKGQpLCBvcHRzKTtcblx0XHRcdGNhc2UgJ2JpbmFyeSc6IHJldHVybiBkaWZfdG9fYW9hX3N0cihkLCBvcHRzKTtcblx0XHRcdGNhc2UgJ2J1ZmZlcic6IHJldHVybiBkaWZfdG9fYW9hX3N0cihkLnRvU3RyaW5nKCdiaW5hcnknKSwgb3B0cyk7XG5cdFx0XHRjYXNlICdhcnJheSc6IHJldHVybiBkaWZfdG9fYW9hX3N0cihjYzJzdHIoZCksIG9wdHMpO1xuXHRcdH1cblx0XHR0aHJvdyBuZXcgRXJyb3IoXCJVbnJlY29nbml6ZWQgdHlwZSBcIiArIG9wdHMudHlwZSk7XG5cdH1cblx0ZnVuY3Rpb24gZGlmX3RvX2FvYV9zdHIoc3RyLCBvcHRzKSB7XG5cdFx0dmFyIHJlY29yZHMgPSBzdHIuc3BsaXQoJ1xcbicpLCBSID0gLTEsIEMgPSAtMSwgcmkgPSAwLCBhcnIgPSBbXTtcblx0XHRmb3IgKDsgcmkgIT09IHJlY29yZHMubGVuZ3RoOyArK3JpKSB7XG5cdFx0XHRpZiAocmVjb3Jkc1tyaV0udHJpbSgpID09PSAnQk9UJykgeyBhcnJbKytSXSA9IFtdOyBDID0gMDsgY29udGludWU7IH1cblx0XHRcdGlmIChSIDwgMCkgY29udGludWU7XG5cdFx0XHR2YXIgbWV0YWRhdGEgPSByZWNvcmRzW3JpXS50cmltKCkuc3BsaXQoXCIsXCIpO1xuXHRcdFx0dmFyIHR5cGUgPSBtZXRhZGF0YVswXSwgdmFsdWUgPSBtZXRhZGF0YVsxXTtcblx0XHRcdCsrcmk7XG5cdFx0XHR2YXIgZGF0YSA9IHJlY29yZHNbcmldLnRyaW0oKTtcblx0XHRcdHN3aXRjaCAoK3R5cGUpIHtcblx0XHRcdFx0Y2FzZSAtMTpcblx0XHRcdFx0XHRpZiAoZGF0YSA9PT0gJ0JPVCcpIHsgYXJyWysrUl0gPSBbXTsgQyA9IDA7IGNvbnRpbnVlOyB9XG5cdFx0XHRcdFx0ZWxzZSBpZiAoZGF0YSAhPT0gJ0VPRCcpIHRocm93IG5ldyBFcnJvcihcIlVucmVjb2duaXplZCBESUYgc3BlY2lhbCBjb21tYW5kIFwiICsgZGF0YSk7XG5cdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdGNhc2UgMDpcblx0XHRcdFx0XHRpZihkYXRhID09PSAnVFJVRScpIGFycltSXVtDXSA9IHRydWU7XG5cdFx0XHRcdFx0ZWxzZSBpZihkYXRhID09PSAnRkFMU0UnKSBhcnJbUl1bQ10gPSBmYWxzZTtcblx0XHRcdFx0XHRlbHNlIGlmKCFpc05hTihmdXp6eW51bSh2YWx1ZSkpKSBhcnJbUl1bQ10gPSBmdXp6eW51bSh2YWx1ZSk7XG5cdFx0XHRcdFx0ZWxzZSBpZighaXNOYU4oZnV6enlkYXRlKHZhbHVlKS5nZXREYXRlKCkpKSBhcnJbUl1bQ10gPSBwYXJzZURhdGUodmFsdWUpO1xuXHRcdFx0XHRcdGVsc2UgYXJyW1JdW0NdID0gdmFsdWU7XG5cdFx0XHRcdFx0KytDOyBicmVhaztcblx0XHRcdFx0Y2FzZSAxOlxuXHRcdFx0XHRcdGRhdGEgPSBkYXRhLnNsaWNlKDEsZGF0YS5sZW5ndGgtMSk7XG5cdFx0XHRcdFx0YXJyW1JdW0MrK10gPSBkYXRhICE9PSAnJyA/IGRhdGEgOiBudWxsO1xuXHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0fVxuXHRcdFx0aWYgKGRhdGEgPT09ICdFT0QnKSBicmVhaztcblx0XHR9XG5cdFx0aWYob3B0cyAmJiBvcHRzLnNoZWV0Um93cykgYXJyID0gYXJyLnNsaWNlKDAsIG9wdHMuc2hlZXRSb3dzKTtcblx0XHRyZXR1cm4gYXJyO1xuXHR9XG5cblx0ZnVuY3Rpb24gZGlmX3RvX3NoZWV0KHN0ciwgb3B0cykgeyByZXR1cm4gYW9hX3RvX3NoZWV0KGRpZl90b19hb2Eoc3RyLCBvcHRzKSwgb3B0cyk7IH1cblx0ZnVuY3Rpb24gZGlmX3RvX3dvcmtib29rKHN0ciwgb3B0cykgeyByZXR1cm4gc2hlZXRfdG9fd29ya2Jvb2soZGlmX3RvX3NoZWV0KHN0ciwgb3B0cyksIG9wdHMpOyB9XG5cblx0dmFyIHNoZWV0X3RvX2RpZiA9IChmdW5jdGlvbigpIHtcblx0XHR2YXIgcHVzaF9maWVsZCA9IGZ1bmN0aW9uIHBmKG8sIHRvcGljLCB2LCBuLCBzKSB7XG5cdFx0XHRvLnB1c2godG9waWMpO1xuXHRcdFx0by5wdXNoKHYgKyBcIixcIiArIG4pO1xuXHRcdFx0by5wdXNoKCdcIicgKyBzLnJlcGxhY2UoL1wiL2csJ1wiXCInKSArICdcIicpO1xuXHRcdH07XG5cdFx0dmFyIHB1c2hfdmFsdWUgPSBmdW5jdGlvbiBwbyhvLCB0eXBlLCB2LCBzKSB7XG5cdFx0XHRvLnB1c2godHlwZSArIFwiLFwiICsgdik7XG5cdFx0XHRvLnB1c2godHlwZSA9PSAxID8gJ1wiJyArIHMucmVwbGFjZSgvXCIvZywnXCJcIicpICsgJ1wiJyA6IHMpO1xuXHRcdH07XG5cdFx0cmV0dXJuIGZ1bmN0aW9uIHNoZWV0X3RvX2RpZih3cykge1xuXHRcdFx0dmFyIG8gPSBbXTtcblx0XHRcdHZhciByID0gc2FmZV9kZWNvZGVfcmFuZ2Uod3NbJyFyZWYnXSksIGNlbGw7XG5cdFx0XHR2YXIgZGVuc2UgPSBBcnJheS5pc0FycmF5KHdzKTtcblx0XHRcdHB1c2hfZmllbGQobywgXCJUQUJMRVwiLCAwLCAxLCBcInNoZWV0anNcIik7XG5cdFx0XHRwdXNoX2ZpZWxkKG8sIFwiVkVDVE9SU1wiLCAwLCByLmUuciAtIHIucy5yICsgMSxcIlwiKTtcblx0XHRcdHB1c2hfZmllbGQobywgXCJUVVBMRVNcIiwgMCwgci5lLmMgLSByLnMuYyArIDEsXCJcIik7XG5cdFx0XHRwdXNoX2ZpZWxkKG8sIFwiREFUQVwiLCAwLCAwLFwiXCIpO1xuXHRcdFx0Zm9yKHZhciBSID0gci5zLnI7IFIgPD0gci5lLnI7ICsrUikge1xuXHRcdFx0XHRwdXNoX3ZhbHVlKG8sIC0xLCAwLCBcIkJPVFwiKTtcblx0XHRcdFx0Zm9yKHZhciBDID0gci5zLmM7IEMgPD0gci5lLmM7ICsrQykge1xuXHRcdFx0XHRcdHZhciBjb29yZCA9IGVuY29kZV9jZWxsKHtyOlIsYzpDfSk7XG5cdFx0XHRcdFx0Y2VsbCA9IGRlbnNlID8gKHdzW1JdfHxbXSlbQ10gOiB3c1tjb29yZF07XG5cdFx0XHRcdFx0aWYoIWNlbGwpIHsgcHVzaF92YWx1ZShvLCAxLCAwLCBcIlwiKTsgY29udGludWU7fVxuXHRcdFx0XHRcdHN3aXRjaChjZWxsLnQpIHtcblx0XHRcdFx0XHRcdGNhc2UgJ24nOlxuXHRcdFx0XHRcdFx0XHR2YXIgdmFsID0gRElGX1hMID8gY2VsbC53IDogY2VsbC52O1xuXHRcdFx0XHRcdFx0XHRpZighdmFsICYmIGNlbGwudiAhPSBudWxsKSB2YWwgPSBjZWxsLnY7XG5cdFx0XHRcdFx0XHRcdGlmKHZhbCA9PSBudWxsKSB7XG5cdFx0XHRcdFx0XHRcdFx0aWYoRElGX1hMICYmIGNlbGwuZiAmJiAhY2VsbC5GKSBwdXNoX3ZhbHVlKG8sIDEsIDAsIFwiPVwiICsgY2VsbC5mKTtcblx0XHRcdFx0XHRcdFx0XHRlbHNlIHB1c2hfdmFsdWUobywgMSwgMCwgXCJcIik7XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0ZWxzZSBwdXNoX3ZhbHVlKG8sIDAsIHZhbCwgXCJWXCIpO1xuXHRcdFx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0XHRcdGNhc2UgJ2InOlxuXHRcdFx0XHRcdFx0XHRwdXNoX3ZhbHVlKG8sIDAsIGNlbGwudiA/IDEgOiAwLCBjZWxsLnYgPyBcIlRSVUVcIiA6IFwiRkFMU0VcIik7XG5cdFx0XHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRcdFx0Y2FzZSAncyc6XG5cdFx0XHRcdFx0XHRcdHB1c2hfdmFsdWUobywgMSwgMCwgKCFESUZfWEwgfHwgaXNOYU4oY2VsbC52KSkgPyBjZWxsLnYgOiAnPVwiJyArIGNlbGwudiArICdcIicpO1xuXHRcdFx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0XHRcdGNhc2UgJ2QnOlxuXHRcdFx0XHRcdFx0XHRpZighY2VsbC53KSBjZWxsLncgPSBTU0YuZm9ybWF0KGNlbGwueiB8fCBTU0YuX3RhYmxlWzE0XSwgZGF0ZW51bShwYXJzZURhdGUoY2VsbC52KSkpO1xuXHRcdFx0XHRcdFx0XHRpZihESUZfWEwpIHB1c2hfdmFsdWUobywgMCwgY2VsbC53LCBcIlZcIik7XG5cdFx0XHRcdFx0XHRcdGVsc2UgcHVzaF92YWx1ZShvLCAxLCAwLCBjZWxsLncpO1xuXHRcdFx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0XHRcdGRlZmF1bHQ6IHB1c2hfdmFsdWUobywgMSwgMCwgXCJcIik7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0XHRwdXNoX3ZhbHVlKG8sIC0xLCAwLCBcIkVPRFwiKTtcblx0XHRcdHZhciBSUyA9IFwiXFxyXFxuXCI7XG5cdFx0XHR2YXIgb28gPSBvLmpvaW4oUlMpO1xuXHRcdFx0Ly93aGlsZSgob28ubGVuZ3RoICYgMHg3RikgIT0gMCkgb28gKz0gXCJcXDBcIjtcblx0XHRcdHJldHVybiBvbztcblx0XHR9O1xuXHR9KSgpO1xuXHRyZXR1cm4ge1xuXHRcdHRvX3dvcmtib29rOiBkaWZfdG9fd29ya2Jvb2ssXG5cdFx0dG9fc2hlZXQ6IGRpZl90b19zaGVldCxcblx0XHRmcm9tX3NoZWV0OiBzaGVldF90b19kaWZcblx0fTtcbn0pKCk7XG5cbnZhciBFVEggPSAoZnVuY3Rpb24oKSB7XG5cdGZ1bmN0aW9uIGRlY29kZShzKSB7IHJldHVybiBzLnJlcGxhY2UoL1xcXFxiL2csXCJcXFxcXCIpLnJlcGxhY2UoL1xcXFxjL2csXCI6XCIpLnJlcGxhY2UoL1xcXFxuL2csXCJcXG5cIik7IH1cblx0ZnVuY3Rpb24gZW5jb2RlKHMpIHsgcmV0dXJuIHMucmVwbGFjZSgvXFxcXC9nLCBcIlxcXFxiXCIpLnJlcGxhY2UoLzovZywgXCJcXFxcY1wiKS5yZXBsYWNlKC9cXG4vZyxcIlxcXFxuXCIpOyB9XG5cblx0ZnVuY3Rpb24gZXRoX3RvX2FvYShzdHIsIG9wdHMpIHtcblx0XHR2YXIgcmVjb3JkcyA9IHN0ci5zcGxpdCgnXFxuJyksIFIgPSAtMSwgQyA9IC0xLCByaSA9IDAsIGFyciA9IFtdO1xuXHRcdGZvciAoOyByaSAhPT0gcmVjb3Jkcy5sZW5ndGg7ICsrcmkpIHtcblx0XHRcdHZhciByZWNvcmQgPSByZWNvcmRzW3JpXS50cmltKCkuc3BsaXQoXCI6XCIpO1xuXHRcdFx0aWYocmVjb3JkWzBdICE9PSAnY2VsbCcpIGNvbnRpbnVlO1xuXHRcdFx0dmFyIGFkZHIgPSBkZWNvZGVfY2VsbChyZWNvcmRbMV0pO1xuXHRcdFx0aWYoYXJyLmxlbmd0aCA8PSBhZGRyLnIpIGZvcihSID0gYXJyLmxlbmd0aDsgUiA8PSBhZGRyLnI7ICsrUikgaWYoIWFycltSXSkgYXJyW1JdID0gW107XG5cdFx0XHRSID0gYWRkci5yOyBDID0gYWRkci5jO1xuXHRcdFx0c3dpdGNoKHJlY29yZFsyXSkge1xuXHRcdFx0XHRjYXNlICd0JzogYXJyW1JdW0NdID0gZGVjb2RlKHJlY29yZFszXSk7IGJyZWFrO1xuXHRcdFx0XHRjYXNlICd2JzogYXJyW1JdW0NdID0gK3JlY29yZFszXTsgYnJlYWs7XG5cdFx0XHRcdGNhc2UgJ3Z0Zic6IHZhciBfZiA9IHJlY29yZFtyZWNvcmQubGVuZ3RoIC0gMV07XG5cdFx0XHRcdFx0LyogZmFsbHMgdGhyb3VnaCAqL1xuXHRcdFx0XHRjYXNlICd2dGMnOlxuXHRcdFx0XHRcdHN3aXRjaChyZWNvcmRbM10pIHtcblx0XHRcdFx0XHRcdGNhc2UgJ25sJzogYXJyW1JdW0NdID0gK3JlY29yZFs0XSA/IHRydWUgOiBmYWxzZTsgYnJlYWs7XG5cdFx0XHRcdFx0XHRkZWZhdWx0OiBhcnJbUl1bQ10gPSArcmVjb3JkWzRdOyBicmVhaztcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0aWYocmVjb3JkWzJdID09ICd2dGYnKSBhcnJbUl1bQ10gPSBbYXJyW1JdW0NdLCBfZl07XG5cdFx0XHR9XG5cdFx0fVxuXHRcdGlmKG9wdHMgJiYgb3B0cy5zaGVldFJvd3MpIGFyciA9IGFyci5zbGljZSgwLCBvcHRzLnNoZWV0Um93cyk7XG5cdFx0cmV0dXJuIGFycjtcblx0fVxuXG5cdGZ1bmN0aW9uIGV0aF90b19zaGVldChkLCBvcHRzKSB7IHJldHVybiBhb2FfdG9fc2hlZXQoZXRoX3RvX2FvYShkLCBvcHRzKSwgb3B0cyk7IH1cblx0ZnVuY3Rpb24gZXRoX3RvX3dvcmtib29rKGQsIG9wdHMpIHsgcmV0dXJuIHNoZWV0X3RvX3dvcmtib29rKGV0aF90b19zaGVldChkLCBvcHRzKSwgb3B0cyk7IH1cblxuXHR2YXIgaGVhZGVyID0gW1xuXHRcdFwic29jaWFsY2FsYzp2ZXJzaW9uOjEuNVwiLFxuXHRcdFwiTUlNRS1WZXJzaW9uOiAxLjBcIixcblx0XHRcIkNvbnRlbnQtVHlwZTogbXVsdGlwYXJ0L21peGVkOyBib3VuZGFyeT1Tb2NpYWxDYWxjU3ByZWFkc2hlZXRDb250cm9sU2F2ZVwiXG5cdF0uam9pbihcIlxcblwiKTtcblxuXHR2YXIgc2VwID0gW1xuXHRcdFwiLS1Tb2NpYWxDYWxjU3ByZWFkc2hlZXRDb250cm9sU2F2ZVwiLFxuXHRcdFwiQ29udGVudC10eXBlOiB0ZXh0L3BsYWluOyBjaGFyc2V0PVVURi04XCJcblx0XS5qb2luKFwiXFxuXCIpICsgXCJcXG5cIjtcblxuXHQvKiBUT0RPOiB0aGUgb3RoZXIgcGFydHMgKi9cblx0dmFyIG1ldGEgPSBbXG5cdFx0XCIjIFNvY2lhbENhbGMgU3ByZWFkc2hlZXQgQ29udHJvbCBTYXZlXCIsXG5cdFx0XCJwYXJ0OnNoZWV0XCJcblx0XS5qb2luKFwiXFxuXCIpO1xuXG5cdHZhciBlbmQgPSBcIi0tU29jaWFsQ2FsY1NwcmVhZHNoZWV0Q29udHJvbFNhdmUtLVwiO1xuXG5cdGZ1bmN0aW9uIHNoZWV0X3RvX2V0aF9kYXRhKHdzKSB7XG5cdFx0aWYoIXdzIHx8ICF3c1snIXJlZiddKSByZXR1cm4gXCJcIjtcblx0XHR2YXIgbyA9IFtdLCBvbyA9IFtdLCBjZWxsLCBjb29yZCA9IFwiXCI7XG5cdFx0dmFyIHIgPSBkZWNvZGVfcmFuZ2Uod3NbJyFyZWYnXSk7XG5cdFx0dmFyIGRlbnNlID0gQXJyYXkuaXNBcnJheSh3cyk7XG5cdFx0Zm9yKHZhciBSID0gci5zLnI7IFIgPD0gci5lLnI7ICsrUikge1xuXHRcdFx0Zm9yKHZhciBDID0gci5zLmM7IEMgPD0gci5lLmM7ICsrQykge1xuXHRcdFx0XHRjb29yZCA9IGVuY29kZV9jZWxsKHtyOlIsYzpDfSk7XG5cdFx0XHRcdGNlbGwgPSBkZW5zZSA/ICh3c1tSXXx8W10pW0NdIDogd3NbY29vcmRdO1xuXHRcdFx0XHRpZighY2VsbCB8fCBjZWxsLnYgPT0gbnVsbCB8fCBjZWxsLnQgPT09ICd6JykgY29udGludWU7XG5cdFx0XHRcdG9vID0gW1wiY2VsbFwiLCBjb29yZCwgJ3QnXTtcblx0XHRcdFx0c3dpdGNoKGNlbGwudCkge1xuXHRcdFx0XHRcdGNhc2UgJ3MnOiBjYXNlICdzdHInOiBvby5wdXNoKGVuY29kZShjZWxsLnYpKTsgYnJlYWs7XG5cdFx0XHRcdFx0Y2FzZSAnbic6XG5cdFx0XHRcdFx0XHRpZighY2VsbC5mKSB7IG9vWzJdPSd2Jzsgb29bM109Y2VsbC52OyB9XG5cdFx0XHRcdFx0XHRlbHNlIHsgb29bMl09J3Z0Zic7IG9vWzNdPSduJzsgb29bNF09Y2VsbC52OyBvb1s1XT1lbmNvZGUoY2VsbC5mKTsgfVxuXHRcdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdFx0Y2FzZSAnYic6XG5cdFx0XHRcdFx0XHRvb1syXSA9ICd2dCcrKGNlbGwuZj8nZic6J2MnKTsgb29bM109J25sJzsgb29bNF09Y2VsbC52P1wiMVwiOlwiMFwiO1xuXHRcdFx0XHRcdFx0b29bNV0gPSBlbmNvZGUoY2VsbC5mfHwoY2VsbC52PydUUlVFJzonRkFMU0UnKSk7XG5cdFx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0XHRjYXNlICdkJzpcblx0XHRcdFx0XHRcdHZhciB0ID0gZGF0ZW51bShwYXJzZURhdGUoY2VsbC52KSk7XG5cdFx0XHRcdFx0XHRvb1syXSA9ICd2dGMnOyBvb1szXSA9ICduZCc7IG9vWzRdID0gXCJcIit0O1xuXHRcdFx0XHRcdFx0b29bNV0gPSBjZWxsLncgfHwgU1NGLmZvcm1hdChjZWxsLnogfHwgU1NGLl90YWJsZVsxNF0sIHQpO1xuXHRcdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdFx0Y2FzZSAnZSc6IGNvbnRpbnVlO1xuXHRcdFx0XHR9XG5cdFx0XHRcdG8ucHVzaChvby5qb2luKFwiOlwiKSk7XG5cdFx0XHR9XG5cdFx0fVxuXHRcdG8ucHVzaChcInNoZWV0OmM6XCIgKyAoci5lLmMtci5zLmMrMSkgKyBcIjpyOlwiICsgKHIuZS5yLXIucy5yKzEpICsgXCI6dHZmOjFcIik7XG5cdFx0by5wdXNoKFwidmFsdWVmb3JtYXQ6MTp0ZXh0LXdpa2lcIik7XG5cdFx0Ly9vLnB1c2goXCJjb3BpZWRmcm9tOlwiICsgd3NbJyFyZWYnXSk7IC8vIGNsaXBib2FyZCBvbmx5XG5cdFx0cmV0dXJuIG8uam9pbihcIlxcblwiKTtcblx0fVxuXG5cdGZ1bmN0aW9uIHNoZWV0X3RvX2V0aCh3cykge1xuXHRcdHJldHVybiBbaGVhZGVyLCBzZXAsIG1ldGEsIHNlcCwgc2hlZXRfdG9fZXRoX2RhdGEod3MpLCBlbmRdLmpvaW4oXCJcXG5cIik7XG5cdFx0Ly8gcmV0dXJuIFtcInZlcnNpb246MS41XCIsIHNoZWV0X3RvX2V0aF9kYXRhKHdzKV0uam9pbihcIlxcblwiKTsgLy8gY2xpcGJvYXJkIGZvcm1cblx0fVxuXG5cdHJldHVybiB7XG5cdFx0dG9fd29ya2Jvb2s6IGV0aF90b193b3JrYm9vayxcblx0XHR0b19zaGVldDogZXRoX3RvX3NoZWV0LFxuXHRcdGZyb21fc2hlZXQ6IHNoZWV0X3RvX2V0aFxuXHR9O1xufSkoKTtcblxudmFyIFBSTiA9IChmdW5jdGlvbigpIHtcblx0ZnVuY3Rpb24gc2V0X3RleHRfYXJyKGRhdGEsIGFyciwgUiwgQywgbykge1xuXHRcdGlmKG8ucmF3KSBhcnJbUl1bQ10gPSBkYXRhO1xuXHRcdGVsc2UgaWYoZGF0YSA9PT0gXCJcIil7LyogZW1wdHkgKi99XG5cdFx0ZWxzZSBpZihkYXRhID09PSAnVFJVRScpIGFycltSXVtDXSA9IHRydWU7XG5cdFx0ZWxzZSBpZihkYXRhID09PSAnRkFMU0UnKSBhcnJbUl1bQ10gPSBmYWxzZTtcblx0XHRlbHNlIGlmKCFpc05hTihmdXp6eW51bShkYXRhKSkpIGFycltSXVtDXSA9IGZ1enp5bnVtKGRhdGEpO1xuXHRcdGVsc2UgaWYoIWlzTmFOKGZ1enp5ZGF0ZShkYXRhKS5nZXREYXRlKCkpKSBhcnJbUl1bQ10gPSBwYXJzZURhdGUoZGF0YSk7XG5cdFx0ZWxzZSBhcnJbUl1bQ10gPSBkYXRhO1xuXHR9XG5cblx0ZnVuY3Rpb24gcHJuX3RvX2FvYV9zdHIoZiwgb3B0cykge1xuXHRcdHZhciBvID0gb3B0cyB8fCB7fTtcblx0XHR2YXIgYXJyID0gKFtdKTtcblx0XHRpZighZiB8fCBmLmxlbmd0aCA9PT0gMCkgcmV0dXJuIGFycjtcblx0XHR2YXIgbGluZXMgPSBmLnNwbGl0KC9bXFxyXFxuXS8pO1xuXHRcdHZhciBMID0gbGluZXMubGVuZ3RoIC0gMTtcblx0XHR3aGlsZShMID49IDAgJiYgbGluZXNbTF0ubGVuZ3RoID09PSAwKSAtLUw7XG5cdFx0dmFyIHN0YXJ0ID0gMTAsIGlkeCA9IDA7XG5cdFx0dmFyIFIgPSAwO1xuXHRcdGZvcig7IFIgPD0gTDsgKytSKSB7XG5cdFx0XHRpZHggPSBsaW5lc1tSXS5pbmRleE9mKFwiIFwiKTtcblx0XHRcdGlmKGlkeCA9PSAtMSkgaWR4ID0gbGluZXNbUl0ubGVuZ3RoOyBlbHNlIGlkeCsrO1xuXHRcdFx0c3RhcnQgPSBNYXRoLm1heChzdGFydCwgaWR4KTtcblx0XHR9XG5cdFx0Zm9yKFIgPSAwOyBSIDw9IEw7ICsrUikge1xuXHRcdFx0YXJyW1JdID0gW107XG5cdFx0XHQvKiBUT0RPOiBjb25maXJtIHRoYXQgd2lkdGhzIGFyZSBhbHdheXMgMTAgKi9cblx0XHRcdHZhciBDID0gMDtcblx0XHRcdHNldF90ZXh0X2FycihsaW5lc1tSXS5zbGljZSgwLCBzdGFydCkudHJpbSgpLCBhcnIsIFIsIEMsIG8pO1xuXHRcdFx0Zm9yKEMgPSAxOyBDIDw9IChsaW5lc1tSXS5sZW5ndGggLSBzdGFydCkvMTAgKyAxOyArK0MpXG5cdFx0XHRcdHNldF90ZXh0X2FycihsaW5lc1tSXS5zbGljZShzdGFydCsoQy0xKSoxMCxzdGFydCtDKjEwKS50cmltKCksYXJyLFIsQyxvKTtcblx0XHR9XG5cdFx0aWYoby5zaGVldFJvd3MpIGFyciA9IGFyci5zbGljZSgwLCBvLnNoZWV0Um93cyk7XG5cdFx0cmV0dXJuIGFycjtcblx0fVxuXG5cdC8vIExpc3Qgb2YgYWNjZXB0ZWQgQ1NWIHNlcGFyYXRvcnNcblx0dmFyIGd1ZXNzX3NlcHMgPSB7XG4weDJDOiAnLCcsXG4weDA5OiBcIlxcdFwiLFxuMHgzQjogJzsnXG5cdH07XG5cblx0Ly8gQ1NWIHNlcGFyYXRvciB3ZWlnaHRzIHRvIGJlIHVzZWQgaW4gY2FzZSBvZiBlcXVhbCBudW1iZXJzXG5cdHZhciBndWVzc19zZXBfd2VpZ2h0cyA9IHtcbjB4MkM6IDMsXG4weDA5OiAyLFxuMHgzQjogMVxuXHR9O1xuXG5cdGZ1bmN0aW9uIGd1ZXNzX3NlcChzdHIpIHtcblx0XHR2YXIgY250ID0ge30sIGluc3RyID0gZmFsc2UsIGVuZCA9IDAsIGNjID0gMDtcblx0XHRmb3IoO2VuZCA8IHN0ci5sZW5ndGg7KytlbmQpIHtcblx0XHRcdGlmKChjYz1zdHIuY2hhckNvZGVBdChlbmQpKSA9PSAweDIyKSBpbnN0ciA9ICFpbnN0cjtcblx0XHRcdGVsc2UgaWYoIWluc3RyICYmIGNjIGluIGd1ZXNzX3NlcHMpIGNudFtjY10gPSAoY250W2NjXXx8MCkrMTtcblx0XHR9XG5cblx0XHRjYyA9IFtdO1xuXHRcdGZvcihlbmQgaW4gY250KSBpZiAoIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChjbnQsIGVuZCkgKSB7XG5cdFx0XHRjYy5wdXNoKFsgY250W2VuZF0sIGVuZCBdKTtcblx0XHR9XG5cblx0XHRpZiAoICFjYy5sZW5ndGggKSB7XG5cdFx0XHRjbnQgPSBndWVzc19zZXBfd2VpZ2h0cztcblx0XHRcdGZvcihlbmQgaW4gY250KSBpZiAoIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChjbnQsIGVuZCkgKSB7XG5cdFx0XHRcdGNjLnB1c2goWyBjbnRbZW5kXSwgZW5kIF0pO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdGNjLnNvcnQoZnVuY3Rpb24oYSwgYikgeyByZXR1cm4gYVswXSAtIGJbMF0gfHwgZ3Vlc3Nfc2VwX3dlaWdodHNbYVsxXV0gLSBndWVzc19zZXBfd2VpZ2h0c1tiWzFdXTsgfSk7XG5cblx0XHRyZXR1cm4gZ3Vlc3Nfc2Vwc1tjYy5wb3AoKVsxXV07XG5cdH1cblxuXHRmdW5jdGlvbiBkc3ZfdG9fc2hlZXRfc3RyKHN0ciwgb3B0cykge1xuXHRcdHZhciBvID0gb3B0cyB8fCB7fTtcblx0XHR2YXIgc2VwID0gXCJcIjtcblx0XHRpZihERU5TRSAhPSBudWxsICYmIG8uZGVuc2UgPT0gbnVsbCkgby5kZW5zZSA9IERFTlNFO1xuXHRcdHZhciB3cyA9IG8uZGVuc2UgPyAoW10pIDogKHt9KTtcblx0XHR2YXIgcmFuZ2UgPSAoe3M6IHtjOjAsIHI6MH0sIGU6IHtjOjAsIHI6MH19KTtcblxuXHRcdGlmKHN0ci5zbGljZSgwLDQpID09IFwic2VwPVwiKSB7XG5cdFx0XHQvLyBJZiB0aGUgbGluZSBlbmRzIGluIFxcclxcblxuXHRcdFx0aWYoc3RyLmNoYXJDb2RlQXQoNSkgPT0gMTMgJiYgc3RyLmNoYXJDb2RlQXQoNikgPT0gMTAgKSB7XG5cdFx0XHRcdHNlcCA9IHN0ci5jaGFyQXQoNCk7IHN0ciA9IHN0ci5zbGljZSg3KTtcblx0XHRcdH1cblx0XHRcdC8vIElmIGxpbmUgZW5kcyBpbiBcXHIgT1IgXFxuXG5cdFx0XHRlbHNlIGlmKHN0ci5jaGFyQ29kZUF0KDUpID09IDEzIHx8IHN0ci5jaGFyQ29kZUF0KDUpID09IDEwICkge1xuXHRcdFx0XHRzZXAgPSBzdHIuY2hhckF0KDQpOyBzdHIgPSBzdHIuc2xpY2UoNik7XG5cdFx0XHR9XG5cdFx0XHRlbHNlIHNlcCA9IGd1ZXNzX3NlcChzdHIuc2xpY2UoMCwxMDI0KSk7XG5cdFx0fVxuXHRcdGVsc2Ugc2VwID0gZ3Vlc3Nfc2VwKHN0ci5zbGljZSgwLDEwMjQpKTtcblx0XHR2YXIgUiA9IDAsIEMgPSAwLCB2ID0gMDtcblx0XHR2YXIgc3RhcnQgPSAwLCBlbmQgPSAwLCBzZXBjYyA9IHNlcC5jaGFyQ29kZUF0KDApLCBpbnN0ciA9IGZhbHNlLCBjYz0wO1xuXHRcdHN0ciA9IHN0ci5yZXBsYWNlKC9cXHJcXG4vbWcsIFwiXFxuXCIpO1xuXHRcdHZhciBfcmUgPSBvLmRhdGVORiAhPSBudWxsID8gZGF0ZU5GX3JlZ2V4KG8uZGF0ZU5GKSA6IG51bGw7XG5cdFx0ZnVuY3Rpb24gZmluaXNoX2NlbGwoKSB7XG5cdFx0XHR2YXIgcyA9IHN0ci5zbGljZShzdGFydCwgZW5kKTtcblx0XHRcdHZhciBjZWxsID0gKHt9KTtcblx0XHRcdGlmKHMuY2hhckF0KDApID09ICdcIicgJiYgcy5jaGFyQXQocy5sZW5ndGggLSAxKSA9PSAnXCInKSBzID0gcy5zbGljZSgxLC0xKS5yZXBsYWNlKC9cIlwiL2csJ1wiJyk7XG5cdFx0XHRpZihzLmxlbmd0aCA9PT0gMCkgY2VsbC50ID0gJ3onO1xuXHRcdFx0ZWxzZSBpZihvLnJhdykgeyBjZWxsLnQgPSAncyc7IGNlbGwudiA9IHM7IH1cblx0XHRcdGVsc2UgaWYocy50cmltKCkubGVuZ3RoID09PSAwKSB7IGNlbGwudCA9ICdzJzsgY2VsbC52ID0gczsgfVxuXHRcdFx0ZWxzZSBpZihzLmNoYXJDb2RlQXQoMCkgPT0gMHgzRCkge1xuXHRcdFx0XHRpZihzLmNoYXJDb2RlQXQoMSkgPT0gMHgyMiAmJiBzLmNoYXJDb2RlQXQocy5sZW5ndGggLSAxKSA9PSAweDIyKSB7IGNlbGwudCA9ICdzJzsgY2VsbC52ID0gcy5zbGljZSgyLC0xKS5yZXBsYWNlKC9cIlwiL2csJ1wiJyk7IH1cblx0XHRcdFx0ZWxzZSBpZihmdXp6eWZtbGEocykpIHsgY2VsbC50ID0gJ24nOyBjZWxsLmYgPSBzLnNsaWNlKDEpOyB9XG5cdFx0XHRcdGVsc2UgeyBjZWxsLnQgPSAncyc7IGNlbGwudiA9IHM7IH0gfVxuXHRcdFx0ZWxzZSBpZihzID09IFwiVFJVRVwiKSB7IGNlbGwudCA9ICdiJzsgY2VsbC52ID0gdHJ1ZTsgfVxuXHRcdFx0ZWxzZSBpZihzID09IFwiRkFMU0VcIikgeyBjZWxsLnQgPSAnYic7IGNlbGwudiA9IGZhbHNlOyB9XG5cdFx0XHRlbHNlIGlmKCFpc05hTih2ID0gZnV6enludW0ocykpKSB7IGNlbGwudCA9ICduJzsgaWYoby5jZWxsVGV4dCAhPT0gZmFsc2UpIGNlbGwudyA9IHM7IGNlbGwudiA9IHY7IH1cblx0XHRcdGVsc2UgaWYoIWlzTmFOKGZ1enp5ZGF0ZShzKS5nZXREYXRlKCkpIHx8IF9yZSAmJiBzLm1hdGNoKF9yZSkpIHtcblx0XHRcdFx0Y2VsbC56ID0gby5kYXRlTkYgfHwgU1NGLl90YWJsZVsxNF07XG5cdFx0XHRcdHZhciBrID0gMDtcblx0XHRcdFx0aWYoX3JlICYmIHMubWF0Y2goX3JlKSl7IHM9ZGF0ZU5GX2ZpeChzLCBvLmRhdGVORiwgKHMubWF0Y2goX3JlKXx8W10pKTsgaz0xOyB9XG5cdFx0XHRcdGlmKG8uY2VsbERhdGVzKSB7IGNlbGwudCA9ICdkJzsgY2VsbC52ID0gcGFyc2VEYXRlKHMsIGspOyB9XG5cdFx0XHRcdGVsc2UgeyBjZWxsLnQgPSAnbic7IGNlbGwudiA9IGRhdGVudW0ocGFyc2VEYXRlKHMsIGspKTsgfVxuXHRcdFx0XHRpZihvLmNlbGxUZXh0ICE9PSBmYWxzZSkgY2VsbC53ID0gU1NGLmZvcm1hdChjZWxsLnosIGNlbGwudiBpbnN0YW5jZW9mIERhdGUgPyBkYXRlbnVtKGNlbGwudik6Y2VsbC52KTtcblx0XHRcdFx0aWYoIW8uY2VsbE5GKSBkZWxldGUgY2VsbC56O1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0Y2VsbC50ID0gJ3MnO1xuXHRcdFx0XHRjZWxsLnYgPSBzO1xuXHRcdFx0fVxuXHRcdFx0aWYoY2VsbC50ID09ICd6Jyl7fVxuXHRcdFx0ZWxzZSBpZihvLmRlbnNlKSB7IGlmKCF3c1tSXSkgd3NbUl0gPSBbXTsgd3NbUl1bQ10gPSBjZWxsOyB9XG5cdFx0XHRlbHNlIHdzW2VuY29kZV9jZWxsKHtjOkMscjpSfSldID0gY2VsbDtcblx0XHRcdHN0YXJ0ID0gZW5kKzE7XG5cdFx0XHRpZihyYW5nZS5lLmMgPCBDKSByYW5nZS5lLmMgPSBDO1xuXHRcdFx0aWYocmFuZ2UuZS5yIDwgUikgcmFuZ2UuZS5yID0gUjtcblx0XHRcdGlmKGNjID09IHNlcGNjKSArK0M7IGVsc2UgeyBDID0gMDsgKytSOyBpZihvLnNoZWV0Um93cyAmJiBvLnNoZWV0Um93cyA8PSBSKSByZXR1cm4gdHJ1ZTsgfVxuXHRcdH1cblx0XHRvdXRlcjogZm9yKDtlbmQgPCBzdHIubGVuZ3RoOysrZW5kKSBzd2l0Y2goKGNjPXN0ci5jaGFyQ29kZUF0KGVuZCkpKSB7XG5cdFx0XHRjYXNlIDB4MjI6IGluc3RyID0gIWluc3RyOyBicmVhaztcblx0XHRcdGNhc2Ugc2VwY2M6IGNhc2UgMHgwYTogY2FzZSAweDBkOiBpZighaW5zdHIgJiYgZmluaXNoX2NlbGwoKSkgYnJlYWsgb3V0ZXI7IGJyZWFrO1xuXHRcdFx0ZGVmYXVsdDogYnJlYWs7XG5cdFx0fVxuXHRcdGlmKGVuZCAtIHN0YXJ0ID4gMCkgZmluaXNoX2NlbGwoKTtcblxuXHRcdHdzWychcmVmJ10gPSBlbmNvZGVfcmFuZ2UocmFuZ2UpO1xuXHRcdHJldHVybiB3cztcblx0fVxuXG5cdGZ1bmN0aW9uIHBybl90b19zaGVldF9zdHIoc3RyLCBvcHRzKSB7XG5cdFx0aWYoIShvcHRzICYmIG9wdHMuUFJOKSkgcmV0dXJuIGRzdl90b19zaGVldF9zdHIoc3RyLCBvcHRzKTtcblx0XHRpZihzdHIuc2xpY2UoMCw0KSA9PSBcInNlcD1cIikgcmV0dXJuIGRzdl90b19zaGVldF9zdHIoc3RyLCBvcHRzKTtcblx0XHRpZihzdHIuaW5kZXhPZihcIlxcdFwiKSA+PSAwIHx8IHN0ci5pbmRleE9mKFwiLFwiKSA+PSAwIHx8IHN0ci5pbmRleE9mKFwiO1wiKSA+PSAwKSByZXR1cm4gZHN2X3RvX3NoZWV0X3N0cihzdHIsIG9wdHMpO1xuXHRcdHJldHVybiBhb2FfdG9fc2hlZXQocHJuX3RvX2FvYV9zdHIoc3RyLCBvcHRzKSwgb3B0cyk7XG5cdH1cblxuXHRmdW5jdGlvbiBwcm5fdG9fc2hlZXQoZCwgb3B0cykge1xuXHRcdHZhciBzdHIgPSBcIlwiLCBieXRlcyA9IG9wdHMudHlwZSA9PSAnc3RyaW5nJyA/IFswLDAsMCwwXSA6IGZpcnN0Ynl0ZShkLCBvcHRzKTtcblx0XHRzd2l0Y2gob3B0cy50eXBlKSB7XG5cdFx0XHRjYXNlICdiYXNlNjQnOiBzdHIgPSBCYXNlNjQuZGVjb2RlKGQpOyBicmVhaztcblx0XHRcdGNhc2UgJ2JpbmFyeSc6IHN0ciA9IGQ7IGJyZWFrO1xuXHRcdFx0Y2FzZSAnYnVmZmVyJzpcblx0XHRcdFx0aWYob3B0cy5jb2RlcGFnZSA9PSA2NTAwMSkgc3RyID0gZC50b1N0cmluZygndXRmOCcpO1xuXHRcdFx0XHRlbHNlIGlmKG9wdHMuY29kZXBhZ2UgJiYgdHlwZW9mIGNwdGFibGUgIT09ICd1bmRlZmluZWQnKSBzdHIgPSBjcHRhYmxlLnV0aWxzLmRlY29kZShvcHRzLmNvZGVwYWdlLCBkKTtcblx0XHRcdFx0ZWxzZSBzdHIgPSBkLnRvU3RyaW5nKCdiaW5hcnknKTtcblx0XHRcdFx0YnJlYWs7XG5cdFx0XHRjYXNlICdhcnJheSc6IHN0ciA9IGNjMnN0cihkKTsgYnJlYWs7XG5cdFx0XHRjYXNlICdzdHJpbmcnOiBzdHIgPSBkOyBicmVhaztcblx0XHRcdGRlZmF1bHQ6IHRocm93IG5ldyBFcnJvcihcIlVucmVjb2duaXplZCB0eXBlIFwiICsgb3B0cy50eXBlKTtcblx0XHR9XG5cdFx0aWYoYnl0ZXNbMF0gPT0gMHhFRiAmJiBieXRlc1sxXSA9PSAweEJCICYmIGJ5dGVzWzJdID09IDB4QkYpIHN0ciA9IHV0ZjhyZWFkKHN0ci5zbGljZSgzKSk7XG5cdFx0ZWxzZSBpZigob3B0cy50eXBlID09ICdiaW5hcnknKSAmJiB0eXBlb2YgY3B0YWJsZSAhPT0gJ3VuZGVmaW5lZCcgJiYgb3B0cy5jb2RlcGFnZSkgIHN0ciA9IGNwdGFibGUudXRpbHMuZGVjb2RlKG9wdHMuY29kZXBhZ2UsIGNwdGFibGUudXRpbHMuZW5jb2RlKDI4NTkxLHN0cikpO1xuXHRcdGlmKHN0ci5zbGljZSgwLDE5KSA9PSBcInNvY2lhbGNhbGM6dmVyc2lvbjpcIikgcmV0dXJuIEVUSC50b19zaGVldChvcHRzLnR5cGUgPT0gJ3N0cmluZycgPyBzdHIgOiB1dGY4cmVhZChzdHIpLCBvcHRzKTtcblx0XHRyZXR1cm4gcHJuX3RvX3NoZWV0X3N0cihzdHIsIG9wdHMpO1xuXHR9XG5cblx0ZnVuY3Rpb24gcHJuX3RvX3dvcmtib29rKGQsIG9wdHMpIHsgcmV0dXJuIHNoZWV0X3RvX3dvcmtib29rKHBybl90b19zaGVldChkLCBvcHRzKSwgb3B0cyk7IH1cblxuXHRmdW5jdGlvbiBzaGVldF90b19wcm4od3MpIHtcblx0XHR2YXIgbyA9IFtdO1xuXHRcdHZhciByID0gc2FmZV9kZWNvZGVfcmFuZ2Uod3NbJyFyZWYnXSksIGNlbGw7XG5cdFx0dmFyIGRlbnNlID0gQXJyYXkuaXNBcnJheSh3cyk7XG5cdFx0Zm9yKHZhciBSID0gci5zLnI7IFIgPD0gci5lLnI7ICsrUikge1xuXHRcdFx0dmFyIG9vID0gW107XG5cdFx0XHRmb3IodmFyIEMgPSByLnMuYzsgQyA8PSByLmUuYzsgKytDKSB7XG5cdFx0XHRcdHZhciBjb29yZCA9IGVuY29kZV9jZWxsKHtyOlIsYzpDfSk7XG5cdFx0XHRcdGNlbGwgPSBkZW5zZSA/ICh3c1tSXXx8W10pW0NdIDogd3NbY29vcmRdO1xuXHRcdFx0XHRpZighY2VsbCB8fCBjZWxsLnYgPT0gbnVsbCkgeyBvby5wdXNoKFwiICAgICAgICAgIFwiKTsgY29udGludWU7IH1cblx0XHRcdFx0dmFyIHcgPSAoY2VsbC53IHx8IChmb3JtYXRfY2VsbChjZWxsKSwgY2VsbC53KSB8fCBcIlwiKS5zbGljZSgwLDEwKTtcblx0XHRcdFx0d2hpbGUody5sZW5ndGggPCAxMCkgdyArPSBcIiBcIjtcblx0XHRcdFx0b28ucHVzaCh3ICsgKEMgPT09IDAgPyBcIiBcIiA6IFwiXCIpKTtcblx0XHRcdH1cblx0XHRcdG8ucHVzaChvby5qb2luKFwiXCIpKTtcblx0XHR9XG5cdFx0cmV0dXJuIG8uam9pbihcIlxcblwiKTtcblx0fVxuXG5cdHJldHVybiB7XG5cdFx0dG9fd29ya2Jvb2s6IHBybl90b193b3JrYm9vayxcblx0XHR0b19zaGVldDogcHJuX3RvX3NoZWV0LFxuXHRcdGZyb21fc2hlZXQ6IHNoZWV0X3RvX3ByblxuXHR9O1xufSkoKTtcblxuLyogRXhjZWwgZGVmYXVsdHMgdG8gU1lMSyBidXQgd2FybnMgaWYgZGF0YSBpcyBub3QgdmFsaWQgKi9cbmZ1bmN0aW9uIHJlYWRfd2JfSUQoZCwgb3B0cykge1xuXHR2YXIgbyA9IG9wdHMgfHwge30sIE9MRF9XVEYgPSAhIW8uV1RGOyBvLldURiA9IHRydWU7XG5cdHRyeSB7XG5cdFx0dmFyIG91dCA9IFNZTEsudG9fd29ya2Jvb2soZCwgbyk7XG5cdFx0by5XVEYgPSBPTERfV1RGO1xuXHRcdHJldHVybiBvdXQ7XG5cdH0gY2F0Y2goZSkge1xuXHRcdG8uV1RGID0gT0xEX1dURjtcblx0XHRpZighZS5tZXNzYWdlLm1hdGNoKC9TWUxLIGJhZCByZWNvcmQgSUQvKSAmJiBPTERfV1RGKSB0aHJvdyBlO1xuXHRcdHJldHVybiBQUk4udG9fd29ya2Jvb2soZCwgb3B0cyk7XG5cdH1cbn1cblxudmFyIFdLXyA9IChmdW5jdGlvbigpIHtcblx0ZnVuY3Rpb24gbG90dXNob3BwZXIoZGF0YSwgY2IsIG9wdHMpIHtcblx0XHRpZighZGF0YSkgcmV0dXJuO1xuXHRcdHByZXBfYmxvYihkYXRhLCBkYXRhLmwgfHwgMCk7XG5cdFx0dmFyIEVudW0gPSBvcHRzLkVudW0gfHwgV0sxRW51bTtcblx0XHR3aGlsZShkYXRhLmwgPCBkYXRhLmxlbmd0aCkge1xuXHRcdFx0dmFyIFJUID0gZGF0YS5yZWFkX3NoaWZ0KDIpO1xuXHRcdFx0dmFyIFIgPSBFbnVtW1JUXSB8fCBFbnVtWzB4RkZdO1xuXHRcdFx0dmFyIGxlbmd0aCA9IGRhdGEucmVhZF9zaGlmdCgyKTtcblx0XHRcdHZhciB0Z3QgPSBkYXRhLmwgKyBsZW5ndGg7XG5cdFx0XHR2YXIgZCA9IChSLmZ8fHBhcnNlbm9vcCkoZGF0YSwgbGVuZ3RoLCBvcHRzKTtcblx0XHRcdGRhdGEubCA9IHRndDtcblx0XHRcdGlmKGNiKGQsIFIubiwgUlQpKSByZXR1cm47XG5cdFx0fVxuXHR9XG5cblx0ZnVuY3Rpb24gbG90dXNfdG9fd29ya2Jvb2soZCwgb3B0cykge1xuXHRcdHN3aXRjaChvcHRzLnR5cGUpIHtcblx0XHRcdGNhc2UgJ2Jhc2U2NCc6IHJldHVybiBsb3R1c190b193b3JrYm9va19idWYoczJhKEJhc2U2NC5kZWNvZGUoZCkpLCBvcHRzKTtcblx0XHRcdGNhc2UgJ2JpbmFyeSc6IHJldHVybiBsb3R1c190b193b3JrYm9va19idWYoczJhKGQpLCBvcHRzKTtcblx0XHRcdGNhc2UgJ2J1ZmZlcic6XG5cdFx0XHRjYXNlICdhcnJheSc6IHJldHVybiBsb3R1c190b193b3JrYm9va19idWYoZCwgb3B0cyk7XG5cdFx0fVxuXHRcdHRocm93IFwiVW5zdXBwb3J0ZWQgdHlwZSBcIiArIG9wdHMudHlwZTtcblx0fVxuXG5cdGZ1bmN0aW9uIGxvdHVzX3RvX3dvcmtib29rX2J1ZihkLCBvcHRzKSB7XG5cdFx0aWYoIWQpIHJldHVybiBkO1xuXHRcdHZhciBvID0gb3B0cyB8fCB7fTtcblx0XHRpZihERU5TRSAhPSBudWxsICYmIG8uZGVuc2UgPT0gbnVsbCkgby5kZW5zZSA9IERFTlNFO1xuXHRcdHZhciBzID0gKChvLmRlbnNlID8gW10gOiB7fSkpLCBuID0gXCJTaGVldDFcIiwgc2lkeCA9IDA7XG5cdFx0dmFyIHNoZWV0cyA9IHt9LCBzbmFtZXMgPSBbbl07XG5cblx0XHR2YXIgcmVmZ3Vlc3MgPSB7czoge3I6MCwgYzowfSwgZToge3I6MCwgYzowfSB9O1xuXHRcdHZhciBzaGVldFJvd3MgPSBvLnNoZWV0Um93cyB8fCAwO1xuXG5cdFx0aWYoZFsyXSA9PSAweDAyKSBvLkVudW0gPSBXSzFFbnVtO1xuXHRcdGVsc2UgaWYoZFsyXSA9PSAweDFhKSBvLkVudW0gPSBXSzNFbnVtO1xuXHRcdGVsc2UgaWYoZFsyXSA9PSAweDBlKSB7IG8uRW51bSA9IFdLM0VudW07IG8ucXBybyA9IHRydWU7IGQubCA9IDA7IH1cblx0XHRlbHNlIHRocm93IG5ldyBFcnJvcihcIlVucmVjb2duaXplZCBMT1RVUyBCT0YgXCIgKyBkWzJdKTtcblx0XHRsb3R1c2hvcHBlcihkLCBmdW5jdGlvbih2YWwsIFJuLCBSVCkge1xuXHRcdFx0aWYoZFsyXSA9PSAweDAyKSBzd2l0Y2goUlQpIHtcblx0XHRcdFx0Y2FzZSAweDAwOlxuXHRcdFx0XHRcdG8udmVycyA9IHZhbDtcblx0XHRcdFx0XHRpZih2YWwgPj0gMHgxMDAwKSBvLnFwcm8gPSB0cnVlO1xuXHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRjYXNlIDB4MDY6IHJlZmd1ZXNzID0gdmFsOyBicmVhazsgLyogUkFOR0UgKi9cblx0XHRcdFx0Y2FzZSAweDBGOiAvKiBMQUJFTCAqL1xuXHRcdFx0XHRcdGlmKCFvLnFwcm8pIHZhbFsxXS52ID0gdmFsWzFdLnYuc2xpY2UoMSk7XG5cdFx0XHRcdFx0LyogZmFsbHMgdGhyb3VnaCAqL1xuXHRcdFx0XHRjYXNlIDB4MEQ6IC8qIElOVEVHRVIgKi9cblx0XHRcdFx0Y2FzZSAweDBFOiAvKiBOVU1CRVIgKi9cblx0XHRcdFx0Y2FzZSAweDEwOiAvKiBGT1JNVUxBICovXG5cdFx0XHRcdGNhc2UgMHgzMzogLyogU1RSSU5HICovXG5cdFx0XHRcdFx0LyogVE9ETzogYWN0dWFsIHRyYW5zbGF0aW9uIG9mIHRoZSBmb3JtYXQgY29kZSAqL1xuXHRcdFx0XHRcdGlmKFJUID09IDB4MEUgJiYgKHZhbFsyXSAmIDB4NzApID09IDB4NzAgJiYgKHZhbFsyXSAmIDB4MEYpID4gMSAmJiAodmFsWzJdICYgMHgwRikgPCAxNSkge1xuXHRcdFx0XHRcdFx0dmFsWzFdLnogPSBvLmRhdGVORiB8fCBTU0YuX3RhYmxlWzE0XTtcblx0XHRcdFx0XHRcdGlmKG8uY2VsbERhdGVzKSB7IHZhbFsxXS50ID0gJ2QnOyB2YWxbMV0udiA9IG51bWRhdGUodmFsWzFdLnYpOyB9XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdGlmKG8uZGVuc2UpIHtcblx0XHRcdFx0XHRcdGlmKCFzW3ZhbFswXS5yXSkgc1t2YWxbMF0ucl0gPSBbXTtcblx0XHRcdFx0XHRcdHNbdmFsWzBdLnJdW3ZhbFswXS5jXSA9IHZhbFsxXTtcblx0XHRcdFx0XHR9IGVsc2Ugc1tlbmNvZGVfY2VsbCh2YWxbMF0pXSA9IHZhbFsxXTtcblx0XHRcdFx0XHRicmVhaztcblx0XHRcdH0gZWxzZSBzd2l0Y2goUlQpIHtcblx0XHRcdFx0Y2FzZSAweDE2OiAvKiBMQUJFTDE2ICovXG5cdFx0XHRcdFx0dmFsWzFdLnYgPSB2YWxbMV0udi5zbGljZSgxKTtcblx0XHRcdFx0XHQvKiBmYWxscyB0aHJvdWdoICovXG5cdFx0XHRcdGNhc2UgMHgxNzogLyogTlVNQkVSMTcgKi9cblx0XHRcdFx0Y2FzZSAweDE4OiAvKiBOVU1CRVIxOCAqL1xuXHRcdFx0XHRjYXNlIDB4MTk6IC8qIEZPUk1VTEExOSAqL1xuXHRcdFx0XHRjYXNlIDB4MjU6IC8qIE5VTUJFUjI1ICovXG5cdFx0XHRcdGNhc2UgMHgyNzogLyogTlVNQkVSMjcgKi9cblx0XHRcdFx0Y2FzZSAweDI4OiAvKiBGT1JNVUxBMjggKi9cblx0XHRcdFx0XHRpZih2YWxbM10gPiBzaWR4KSB7XG5cdFx0XHRcdFx0XHRzW1wiIXJlZlwiXSA9IGVuY29kZV9yYW5nZShyZWZndWVzcyk7XG5cdFx0XHRcdFx0XHRzaGVldHNbbl0gPSBzO1xuXHRcdFx0XHRcdFx0cyA9IChvLmRlbnNlID8gW10gOiB7fSk7XG5cdFx0XHRcdFx0XHRyZWZndWVzcyA9IHtzOiB7cjowLCBjOjB9LCBlOiB7cjowLCBjOjB9IH07XG5cdFx0XHRcdFx0XHRzaWR4ID0gdmFsWzNdOyBuID0gXCJTaGVldFwiICsgKHNpZHggKyAxKTtcblx0XHRcdFx0XHRcdHNuYW1lcy5wdXNoKG4pO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRpZihzaGVldFJvd3MgPiAwICYmIHZhbFswXS5yID49IHNoZWV0Um93cykgYnJlYWs7XG5cdFx0XHRcdFx0aWYoby5kZW5zZSkge1xuXHRcdFx0XHRcdFx0aWYoIXNbdmFsWzBdLnJdKSBzW3ZhbFswXS5yXSA9IFtdO1xuXHRcdFx0XHRcdFx0c1t2YWxbMF0ucl1bdmFsWzBdLmNdID0gdmFsWzFdO1xuXHRcdFx0XHRcdH0gZWxzZSBzW2VuY29kZV9jZWxsKHZhbFswXSldID0gdmFsWzFdO1xuXHRcdFx0XHRcdGlmKHJlZmd1ZXNzLmUuYyA8IHZhbFswXS5jKSByZWZndWVzcy5lLmMgPSB2YWxbMF0uYztcblx0XHRcdFx0XHRpZihyZWZndWVzcy5lLnIgPCB2YWxbMF0ucikgcmVmZ3Vlc3MuZS5yID0gdmFsWzBdLnI7XG5cdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdGRlZmF1bHQ6IGJyZWFrO1xuXHRcdFx0fVxuXHRcdH0sIG8pO1xuXG5cdFx0c1tcIiFyZWZcIl0gPSBlbmNvZGVfcmFuZ2UocmVmZ3Vlc3MpO1xuXHRcdHNoZWV0c1tuXSA9IHM7XG5cdFx0cmV0dXJuIHsgU2hlZXROYW1lczogc25hbWVzLCBTaGVldHM6c2hlZXRzIH07XG5cdH1cblxuXHRmdW5jdGlvbiBwYXJzZV9SQU5HRShibG9iKSB7XG5cdFx0dmFyIG8gPSB7czp7YzowLHI6MH0sZTp7YzowLHI6MH19O1xuXHRcdG8ucy5jID0gYmxvYi5yZWFkX3NoaWZ0KDIpO1xuXHRcdG8ucy5yID0gYmxvYi5yZWFkX3NoaWZ0KDIpO1xuXHRcdG8uZS5jID0gYmxvYi5yZWFkX3NoaWZ0KDIpO1xuXHRcdG8uZS5yID0gYmxvYi5yZWFkX3NoaWZ0KDIpO1xuXHRcdGlmKG8ucy5jID09IDB4RkZGRikgby5zLmMgPSBvLmUuYyA9IG8ucy5yID0gby5lLnIgPSAwO1xuXHRcdHJldHVybiBvO1xuXHR9XG5cblx0ZnVuY3Rpb24gcGFyc2VfY2VsbChibG9iLCBsZW5ndGgsIG9wdHMpIHtcblx0XHR2YXIgbyA9IFt7YzowLHI6MH0sIHt0OiduJyx2OjB9LCAwXTtcblx0XHRpZihvcHRzLnFwcm8gJiYgb3B0cy52ZXJzICE9IDB4NTEyMCkge1xuXHRcdFx0b1swXS5jID0gYmxvYi5yZWFkX3NoaWZ0KDEpO1xuXHRcdFx0YmxvYi5sKys7XG5cdFx0XHRvWzBdLnIgPSBibG9iLnJlYWRfc2hpZnQoMik7XG5cdFx0XHRibG9iLmwrPTI7XG5cdFx0fSBlbHNlIHtcblx0XHRcdG9bMl0gPSBibG9iLnJlYWRfc2hpZnQoMSk7XG5cdFx0XHRvWzBdLmMgPSBibG9iLnJlYWRfc2hpZnQoMik7IG9bMF0uciA9IGJsb2IucmVhZF9zaGlmdCgyKTtcblx0XHR9XG5cdFx0cmV0dXJuIG87XG5cdH1cblxuXHRmdW5jdGlvbiBwYXJzZV9MQUJFTChibG9iLCBsZW5ndGgsIG9wdHMpIHtcblx0XHR2YXIgdGd0ID0gYmxvYi5sICsgbGVuZ3RoO1xuXHRcdHZhciBvID0gcGFyc2VfY2VsbChibG9iLCBsZW5ndGgsIG9wdHMpO1xuXHRcdG9bMV0udCA9ICdzJztcblx0XHRpZihvcHRzLnZlcnMgPT0gMHg1MTIwKSB7XG5cdFx0XHRibG9iLmwrKztcblx0XHRcdHZhciBsZW4gPSBibG9iLnJlYWRfc2hpZnQoMSk7XG5cdFx0XHRvWzFdLnYgPSBibG9iLnJlYWRfc2hpZnQobGVuLCAndXRmOCcpO1xuXHRcdFx0cmV0dXJuIG87XG5cdFx0fVxuXHRcdGlmKG9wdHMucXBybykgYmxvYi5sKys7XG5cdFx0b1sxXS52ID0gYmxvYi5yZWFkX3NoaWZ0KHRndCAtIGJsb2IubCwgJ2NzdHInKTtcblx0XHRyZXR1cm4gbztcblx0fVxuXG5cdGZ1bmN0aW9uIHBhcnNlX0lOVEVHRVIoYmxvYiwgbGVuZ3RoLCBvcHRzKSB7XG5cdFx0dmFyIG8gPSBwYXJzZV9jZWxsKGJsb2IsIGxlbmd0aCwgb3B0cyk7XG5cdFx0b1sxXS52ID0gYmxvYi5yZWFkX3NoaWZ0KDIsICdpJyk7XG5cdFx0cmV0dXJuIG87XG5cdH1cblxuXHRmdW5jdGlvbiBwYXJzZV9OVU1CRVIoYmxvYiwgbGVuZ3RoLCBvcHRzKSB7XG5cdFx0dmFyIG8gPSBwYXJzZV9jZWxsKGJsb2IsIGxlbmd0aCwgb3B0cyk7XG5cdFx0b1sxXS52ID0gYmxvYi5yZWFkX3NoaWZ0KDgsICdmJyk7XG5cdFx0cmV0dXJuIG87XG5cdH1cblxuXHRmdW5jdGlvbiBwYXJzZV9GT1JNVUxBKGJsb2IsIGxlbmd0aCwgb3B0cykge1xuXHRcdHZhciB0Z3QgPSBibG9iLmwgKyBsZW5ndGg7XG5cdFx0dmFyIG8gPSBwYXJzZV9jZWxsKGJsb2IsIGxlbmd0aCwgb3B0cyk7XG5cdFx0LyogVE9ETzogZm9ybXVsYSAqL1xuXHRcdG9bMV0udiA9IGJsb2IucmVhZF9zaGlmdCg4LCAnZicpO1xuXHRcdGlmKG9wdHMucXBybykgYmxvYi5sID0gdGd0O1xuXHRcdGVsc2Uge1xuXHRcdFx0dmFyIGZsZW4gPSBibG9iLnJlYWRfc2hpZnQoMik7XG5cdFx0XHRibG9iLmwgKz0gZmxlbjtcblx0XHR9XG5cdFx0cmV0dXJuIG87XG5cdH1cblxuXHRmdW5jdGlvbiBwYXJzZV9jZWxsXzMoYmxvYikge1xuXHRcdHZhciBvID0gW3tjOjAscjowfSwge3Q6J24nLHY6MH0sIDBdO1xuXHRcdG9bMF0uciA9IGJsb2IucmVhZF9zaGlmdCgyKTsgb1szXSA9IGJsb2JbYmxvYi5sKytdOyBvWzBdLmMgPSBibG9iW2Jsb2IubCsrXTtcblx0XHRyZXR1cm4gbztcblx0fVxuXG5cdGZ1bmN0aW9uIHBhcnNlX0xBQkVMXzE2KGJsb2IsIGxlbmd0aCkge1xuXHRcdHZhciBvID0gcGFyc2VfY2VsbF8zKGJsb2IsIGxlbmd0aCk7XG5cdFx0b1sxXS50ID0gJ3MnO1xuXHRcdG9bMV0udiA9IGJsb2IucmVhZF9zaGlmdChsZW5ndGggLSA0LCAnY3N0cicpO1xuXHRcdHJldHVybiBvO1xuXHR9XG5cblx0ZnVuY3Rpb24gcGFyc2VfTlVNQkVSXzE4KGJsb2IsIGxlbmd0aCkge1xuXHRcdHZhciBvID0gcGFyc2VfY2VsbF8zKGJsb2IsIGxlbmd0aCk7XG5cdFx0b1sxXS52ID0gYmxvYi5yZWFkX3NoaWZ0KDIpO1xuXHRcdHZhciB2ID0gb1sxXS52ID4+IDE7XG5cdFx0LyogVE9ETzogZmlndXJlIG91dCBhbGwgb2YgdGhlIGNvcm5lciBjYXNlcyAqL1xuXHRcdGlmKG9bMV0udiAmIDB4MSkge1xuXHRcdFx0c3dpdGNoKHYgJiAweDA3KSB7XG5cdFx0XHRcdGNhc2UgMTogdiA9ICh2ID4+IDMpICogNTAwOyBicmVhaztcblx0XHRcdFx0Y2FzZSAyOiB2ID0gKHYgPj4gMykgLyAyMDsgYnJlYWs7XG5cdFx0XHRcdGNhc2UgNDogdiA9ICh2ID4+IDMpIC8gMjAwMDsgYnJlYWs7XG5cdFx0XHRcdGNhc2UgNjogdiA9ICh2ID4+IDMpIC8gMTY7IGJyZWFrO1xuXHRcdFx0XHRjYXNlIDc6IHYgPSAodiA+PiAzKSAvIDY0OyBicmVhaztcblx0XHRcdFx0ZGVmYXVsdDogdGhyb3cgXCJ1bmtub3duIE5VTUJFUl8xOCBlbmNvZGluZyBcIiArICh2ICYgMHgwNyk7XG5cdFx0XHR9XG5cdFx0fVxuXHRcdG9bMV0udiA9IHY7XG5cdFx0cmV0dXJuIG87XG5cdH1cblxuXHRmdW5jdGlvbiBwYXJzZV9OVU1CRVJfMTcoYmxvYiwgbGVuZ3RoKSB7XG5cdFx0dmFyIG8gPSBwYXJzZV9jZWxsXzMoYmxvYiwgbGVuZ3RoKTtcblx0XHR2YXIgdjEgPSBibG9iLnJlYWRfc2hpZnQoNCk7XG5cdFx0dmFyIHYyID0gYmxvYi5yZWFkX3NoaWZ0KDQpO1xuXHRcdHZhciBlID0gYmxvYi5yZWFkX3NoaWZ0KDIpO1xuXHRcdGlmKGUgPT0gMHhGRkZGKSB7IG9bMV0udiA9IDA7IHJldHVybiBvOyB9XG5cdFx0dmFyIHMgPSBlICYgMHg4MDAwOyBlID0gKGUmMHg3RkZGKSAtIDE2NDQ2O1xuXHRcdG9bMV0udiA9IChzKjIgLSAxKSAqICgoZSA+IDAgPyAodjIgPDwgZSkgOiAodjIgPj4+IC1lKSkgKyAoZSA+IC0zMiA/ICh2MSA8PCAoZSArIDMyKSkgOiAodjEgPj4+IC0oZSArIDMyKSkpKTtcblx0XHRyZXR1cm4gbztcblx0fVxuXG5cdGZ1bmN0aW9uIHBhcnNlX0ZPUk1VTEFfMTkoYmxvYiwgbGVuZ3RoKSB7XG5cdFx0dmFyIG8gPSBwYXJzZV9OVU1CRVJfMTcoYmxvYiwgMTQpO1xuXHRcdGJsb2IubCArPSBsZW5ndGggLSAxNDsgLyogVE9ETzogZm9ybXVsYSAqL1xuXHRcdHJldHVybiBvO1xuXHR9XG5cblx0ZnVuY3Rpb24gcGFyc2VfTlVNQkVSXzI1KGJsb2IsIGxlbmd0aCkge1xuXHRcdHZhciBvID0gcGFyc2VfY2VsbF8zKGJsb2IsIGxlbmd0aCk7XG5cdFx0dmFyIHYxID0gYmxvYi5yZWFkX3NoaWZ0KDQpO1xuXHRcdG9bMV0udiA9IHYxID4+IDY7XG5cdFx0cmV0dXJuIG87XG5cdH1cblxuXHRmdW5jdGlvbiBwYXJzZV9OVU1CRVJfMjcoYmxvYiwgbGVuZ3RoKSB7XG5cdFx0dmFyIG8gPSBwYXJzZV9jZWxsXzMoYmxvYiwgbGVuZ3RoKTtcblx0XHR2YXIgdjEgPSBibG9iLnJlYWRfc2hpZnQoOCwnZicpO1xuXHRcdG9bMV0udiA9IHYxO1xuXHRcdHJldHVybiBvO1xuXHR9XG5cblx0ZnVuY3Rpb24gcGFyc2VfRk9STVVMQV8yOChibG9iLCBsZW5ndGgpIHtcblx0XHR2YXIgbyA9IHBhcnNlX05VTUJFUl8yNyhibG9iLCAxNCk7XG5cdFx0YmxvYi5sICs9IGxlbmd0aCAtIDEwOyAvKiBUT0RPOiBmb3JtdWxhICovXG5cdFx0cmV0dXJuIG87XG5cdH1cblxuXHR2YXIgV0sxRW51bSA9IHtcbjB4MDAwMDogeyBuOlwiQk9GXCIsIGY6cGFyc2V1aW50MTYgfSxcbjB4MDAwMTogeyBuOlwiRU9GXCIgfSxcbjB4MDAwMjogeyBuOlwiQ0FMQ01PREVcIiB9LFxuMHgwMDAzOiB7IG46XCJDQUxDT1JERVJcIiB9LFxuMHgwMDA0OiB7IG46XCJTUExJVFwiIH0sXG4weDAwMDU6IHsgbjpcIlNZTkNcIiB9LFxuMHgwMDA2OiB7IG46XCJSQU5HRVwiLCBmOnBhcnNlX1JBTkdFIH0sXG4weDAwMDc6IHsgbjpcIldJTkRPVzFcIiB9LFxuMHgwMDA4OiB7IG46XCJDT0xXMVwiIH0sXG4weDAwMDk6IHsgbjpcIldJTlRXT1wiIH0sXG4weDAwMEE6IHsgbjpcIkNPTFcyXCIgfSxcbjB4MDAwQjogeyBuOlwiTkFNRVwiIH0sXG4weDAwMEM6IHsgbjpcIkJMQU5LXCIgfSxcbjB4MDAwRDogeyBuOlwiSU5URUdFUlwiLCBmOnBhcnNlX0lOVEVHRVIgfSxcbjB4MDAwRTogeyBuOlwiTlVNQkVSXCIsIGY6cGFyc2VfTlVNQkVSIH0sXG4weDAwMEY6IHsgbjpcIkxBQkVMXCIsIGY6cGFyc2VfTEFCRUwgfSxcbjB4MDAxMDogeyBuOlwiRk9STVVMQVwiLCBmOnBhcnNlX0ZPUk1VTEEgfSxcbjB4MDAxODogeyBuOlwiVEFCTEVcIiB9LFxuMHgwMDE5OiB7IG46XCJPUkFOR0VcIiB9LFxuMHgwMDFBOiB7IG46XCJQUkFOR0VcIiB9LFxuMHgwMDFCOiB7IG46XCJTUkFOR0VcIiB9LFxuMHgwMDFDOiB7IG46XCJGUkFOR0VcIiB9LFxuMHgwMDFEOiB7IG46XCJLUkFOR0UxXCIgfSxcbjB4MDAyMDogeyBuOlwiSFJBTkdFXCIgfSxcbjB4MDAyMzogeyBuOlwiS1JBTkdFMlwiIH0sXG4weDAwMjQ6IHsgbjpcIlBST1RFQ1wiIH0sXG4weDAwMjU6IHsgbjpcIkZPT1RFUlwiIH0sXG4weDAwMjY6IHsgbjpcIkhFQURFUlwiIH0sXG4weDAwMjc6IHsgbjpcIlNFVFVQXCIgfSxcbjB4MDAyODogeyBuOlwiTUFSR0lOU1wiIH0sXG4weDAwMjk6IHsgbjpcIkxBQkVMRk1UXCIgfSxcbjB4MDAyQTogeyBuOlwiVElUTEVTXCIgfSxcbjB4MDAyQjogeyBuOlwiU0hFRVRKU1wiIH0sXG4weDAwMkQ6IHsgbjpcIkdSQVBIXCIgfSxcbjB4MDAyRTogeyBuOlwiTkdSQVBIXCIgfSxcbjB4MDAyRjogeyBuOlwiQ0FMQ0NPVU5UXCIgfSxcbjB4MDAzMDogeyBuOlwiVU5GT1JNQVRURURcIiB9LFxuMHgwMDMxOiB7IG46XCJDVVJTT1JXMTJcIiB9LFxuMHgwMDMyOiB7IG46XCJXSU5ET1dcIiB9LFxuMHgwMDMzOiB7IG46XCJTVFJJTkdcIiwgZjpwYXJzZV9MQUJFTCB9LFxuMHgwMDM3OiB7IG46XCJQQVNTV09SRFwiIH0sXG4weDAwMzg6IHsgbjpcIkxPQ0tFRFwiIH0sXG4weDAwM0M6IHsgbjpcIlFVRVJZXCIgfSxcbjB4MDAzRDogeyBuOlwiUVVFUllOQU1FXCIgfSxcbjB4MDAzRTogeyBuOlwiUFJJTlRcIiB9LFxuMHgwMDNGOiB7IG46XCJQUklOVE5BTUVcIiB9LFxuMHgwMDQwOiB7IG46XCJHUkFQSDJcIiB9LFxuMHgwMDQxOiB7IG46XCJHUkFQSE5BTUVcIiB9LFxuMHgwMDQyOiB7IG46XCJaT09NXCIgfSxcbjB4MDA0MzogeyBuOlwiU1lNU1BMSVRcIiB9LFxuMHgwMDQ0OiB7IG46XCJOU1JPV1NcIiB9LFxuMHgwMDQ1OiB7IG46XCJOU0NPTFNcIiB9LFxuMHgwMDQ2OiB7IG46XCJSVUxFUlwiIH0sXG4weDAwNDc6IHsgbjpcIk5OQU1FXCIgfSxcbjB4MDA0ODogeyBuOlwiQUNPTU1cIiB9LFxuMHgwMDQ5OiB7IG46XCJBTUFDUk9cIiB9LFxuMHgwMDRBOiB7IG46XCJQQVJTRVwiIH0sXG4weDAwRkY6IHsgbjpcIlwiLCBmOnBhcnNlbm9vcCB9XG5cdH07XG5cblx0dmFyIFdLM0VudW0gPSB7XG4weDAwMDA6IHsgbjpcIkJPRlwiIH0sXG4weDAwMDE6IHsgbjpcIkVPRlwiIH0sXG4weDAwMDM6IHsgbjpcIj8/XCIgfSxcbjB4MDAwNDogeyBuOlwiPz9cIiB9LFxuMHgwMDA1OiB7IG46XCI/P1wiIH0sXG4weDAwMDY6IHsgbjpcIj8/XCIgfSxcbjB4MDAwNzogeyBuOlwiPz9cIiB9LFxuMHgwMDA5OiB7IG46XCI/P1wiIH0sXG4weDAwMGE6IHsgbjpcIj8/XCIgfSxcbjB4MDAwYjogeyBuOlwiPz9cIiB9LFxuMHgwMDBjOiB7IG46XCI/P1wiIH0sXG4weDAwMGU6IHsgbjpcIj8/XCIgfSxcbjB4MDAwZjogeyBuOlwiPz9cIiB9LFxuMHgwMDEwOiB7IG46XCI/P1wiIH0sXG4weDAwMTE6IHsgbjpcIj8/XCIgfSxcbjB4MDAxMjogeyBuOlwiPz9cIiB9LFxuMHgwMDEzOiB7IG46XCI/P1wiIH0sXG4weDAwMTU6IHsgbjpcIj8/XCIgfSxcbjB4MDAxNjogeyBuOlwiTEFCRUwxNlwiLCBmOnBhcnNlX0xBQkVMXzE2fSxcbjB4MDAxNzogeyBuOlwiTlVNQkVSMTdcIiwgZjpwYXJzZV9OVU1CRVJfMTcgfSxcbjB4MDAxODogeyBuOlwiTlVNQkVSMThcIiwgZjpwYXJzZV9OVU1CRVJfMTggfSxcbjB4MDAxOTogeyBuOlwiRk9STVVMQTE5XCIsIGY6cGFyc2VfRk9STVVMQV8xOX0sXG4weDAwMWE6IHsgbjpcIj8/XCIgfSxcbjB4MDAxYjogeyBuOlwiPz9cIiB9LFxuMHgwMDFjOiB7IG46XCI/P1wiIH0sXG4weDAwMWQ6IHsgbjpcIj8/XCIgfSxcbjB4MDAxZTogeyBuOlwiPz9cIiB9LFxuMHgwMDFmOiB7IG46XCI/P1wiIH0sXG4weDAwMjE6IHsgbjpcIj8/XCIgfSxcbjB4MDAyNTogeyBuOlwiTlVNQkVSMjVcIiwgZjpwYXJzZV9OVU1CRVJfMjUgfSxcbjB4MDAyNzogeyBuOlwiTlVNQkVSMjdcIiwgZjpwYXJzZV9OVU1CRVJfMjcgfSxcbjB4MDAyODogeyBuOlwiRk9STVVMQTI4XCIsIGY6cGFyc2VfRk9STVVMQV8yOCB9LFxuMHgwMEZGOiB7IG46XCJcIiwgZjpwYXJzZW5vb3AgfVxuXHR9O1xuXHRyZXR1cm4ge1xuXHRcdHRvX3dvcmtib29rOiBsb3R1c190b193b3JrYm9va1xuXHR9O1xufSkoKTtcbi8qIDE4LjQuNyByUHIgQ1RfUlByRWx0ICovXG5mdW5jdGlvbiBwYXJzZV9ycHIocnByKSB7XG5cdHZhciBmb250ID0ge30sIG0gPSBycHIubWF0Y2godGFncmVnZXgpLCBpID0gMDtcblx0dmFyIHBhc3MgPSBmYWxzZTtcblx0aWYobSkgZm9yKDtpIT1tLmxlbmd0aDsgKytpKSB7XG5cdFx0dmFyIHkgPSBwYXJzZXhtbHRhZyhtW2ldKTtcblx0XHRzd2l0Y2goeVswXS5yZXBsYWNlKC9cXHcqOi9nLFwiXCIpKSB7XG5cdFx0XHQvKiAxOC44LjEyIGNvbmRlbnNlIENUX0Jvb2xlYW5Qcm9wZXJ0eSAqL1xuXHRcdFx0LyogKiogbm90IHJlcXVpcmVkIC4gKi9cblx0XHRcdGNhc2UgJzxjb25kZW5zZSc6IGJyZWFrO1xuXHRcdFx0LyogMTguOC4xNyBleHRlbmQgQ1RfQm9vbGVhblByb3BlcnR5ICovXG5cdFx0XHQvKiAqKiBub3QgcmVxdWlyZWQgLiAqL1xuXHRcdFx0Y2FzZSAnPGV4dGVuZCc6IGJyZWFrO1xuXHRcdFx0LyogMTguOC4zNiBzaGFkb3cgQ1RfQm9vbGVhblByb3BlcnR5ICovXG5cdFx0XHQvKiAqKiBub3QgcmVxdWlyZWQgLiAqL1xuXHRcdFx0Y2FzZSAnPHNoYWRvdyc6XG5cdFx0XHRcdGlmKCF5LnZhbCkgYnJlYWs7XG5cdFx0XHRcdC8qIGZhbGxzIHRocm91Z2ggKi9cblx0XHRcdGNhc2UgJzxzaGFkb3c+Jzpcblx0XHRcdGNhc2UgJzxzaGFkb3cvPic6IGZvbnQuc2hhZG93ID0gMTsgYnJlYWs7XG5cdFx0XHRjYXNlICc8L3NoYWRvdz4nOiBicmVhaztcblxuXHRcdFx0LyogMTguNC4xIGNoYXJzZXQgQ1RfSW50UHJvcGVydHkgVE9ETyAqL1xuXHRcdFx0Y2FzZSAnPGNoYXJzZXQnOlxuXHRcdFx0XHRpZih5LnZhbCA9PSAnMScpIGJyZWFrO1xuXHRcdFx0XHRmb250LmNwID0gQ1MyQ1BbcGFyc2VJbnQoeS52YWwsIDEwKV07XG5cdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHQvKiAxOC40LjIgb3V0bGluZSBDVF9Cb29sZWFuUHJvcGVydHkgVE9ETyAqL1xuXHRcdFx0Y2FzZSAnPG91dGxpbmUnOlxuXHRcdFx0XHRpZigheS52YWwpIGJyZWFrO1xuXHRcdFx0XHQvKiBmYWxscyB0aHJvdWdoICovXG5cdFx0XHRjYXNlICc8b3V0bGluZT4nOlxuXHRcdFx0Y2FzZSAnPG91dGxpbmUvPic6IGZvbnQub3V0bGluZSA9IDE7IGJyZWFrO1xuXHRcdFx0Y2FzZSAnPC9vdXRsaW5lPic6IGJyZWFrO1xuXG5cdFx0XHQvKiAxOC40LjUgckZvbnQgQ1RfRm9udE5hbWUgKi9cblx0XHRcdGNhc2UgJzxyRm9udCc6IGZvbnQubmFtZSA9IHkudmFsOyBicmVhaztcblxuXHRcdFx0LyogMTguNC4xMSBzeiBDVF9Gb250U2l6ZSAqL1xuXHRcdFx0Y2FzZSAnPHN6JzogZm9udC5zeiA9IHkudmFsOyBicmVhaztcblxuXHRcdFx0LyogMTguNC4xMCBzdHJpa2UgQ1RfQm9vbGVhblByb3BlcnR5ICovXG5cdFx0XHRjYXNlICc8c3RyaWtlJzpcblx0XHRcdFx0aWYoIXkudmFsKSBicmVhaztcblx0XHRcdFx0LyogZmFsbHMgdGhyb3VnaCAqL1xuXHRcdFx0Y2FzZSAnPHN0cmlrZT4nOlxuXHRcdFx0Y2FzZSAnPHN0cmlrZS8+JzogZm9udC5zdHJpa2UgPSAxOyBicmVhaztcblx0XHRcdGNhc2UgJzwvc3RyaWtlPic6IGJyZWFrO1xuXG5cdFx0XHQvKiAxOC40LjEzIHUgQ1RfVW5kZXJsaW5lUHJvcGVydHkgKi9cblx0XHRcdGNhc2UgJzx1Jzpcblx0XHRcdFx0aWYoIXkudmFsKSBicmVhaztcblx0XHRcdFx0c3dpdGNoKHkudmFsKSB7XG5cdFx0XHRcdFx0Y2FzZSAnZG91YmxlJzogZm9udC51dmFsID0gXCJkb3VibGVcIjsgYnJlYWs7XG5cdFx0XHRcdFx0Y2FzZSAnc2luZ2xlQWNjb3VudGluZyc6IGZvbnQudXZhbCA9IFwic2luZ2xlLWFjY291bnRpbmdcIjsgYnJlYWs7XG5cdFx0XHRcdFx0Y2FzZSAnZG91YmxlQWNjb3VudGluZyc6IGZvbnQudXZhbCA9IFwiZG91YmxlLWFjY291bnRpbmdcIjsgYnJlYWs7XG5cdFx0XHRcdH1cblx0XHRcdFx0LyogZmFsbHMgdGhyb3VnaCAqL1xuXHRcdFx0Y2FzZSAnPHU+Jzpcblx0XHRcdGNhc2UgJzx1Lz4nOiBmb250LnUgPSAxOyBicmVhaztcblx0XHRcdGNhc2UgJzwvdT4nOiBicmVhaztcblxuXHRcdFx0LyogMTguOC4yIGIgKi9cblx0XHRcdGNhc2UgJzxiJzpcblx0XHRcdFx0aWYoeS52YWwgPT0gJzAnKSBicmVhaztcblx0XHRcdFx0LyogZmFsbHMgdGhyb3VnaCAqL1xuXHRcdFx0Y2FzZSAnPGI+Jzpcblx0XHRcdGNhc2UgJzxiLz4nOiBmb250LmIgPSAxOyBicmVhaztcblx0XHRcdGNhc2UgJzwvYj4nOiBicmVhaztcblxuXHRcdFx0LyogMTguOC4yNiBpICovXG5cdFx0XHRjYXNlICc8aSc6XG5cdFx0XHRcdGlmKHkudmFsID09ICcwJykgYnJlYWs7XG5cdFx0XHRcdC8qIGZhbGxzIHRocm91Z2ggKi9cblx0XHRcdGNhc2UgJzxpPic6XG5cdFx0XHRjYXNlICc8aS8+JzogZm9udC5pID0gMTsgYnJlYWs7XG5cdFx0XHRjYXNlICc8L2k+JzogYnJlYWs7XG5cblx0XHRcdC8qIDE4LjMuMS4xNSBjb2xvciBDVF9Db2xvciBUT0RPOiB0aW50LCB0aGVtZSwgYXV0bywgaW5kZXhlZCAqL1xuXHRcdFx0Y2FzZSAnPGNvbG9yJzpcblx0XHRcdFx0aWYoeS5yZ2IpIGZvbnQuY29sb3IgPSB5LnJnYi5zbGljZSgyLDgpO1xuXHRcdFx0XHRicmVhaztcblxuXHRcdFx0LyogMTguOC4xOCBmYW1pbHkgU1RfRm9udEZhbWlseSAqL1xuXHRcdFx0Y2FzZSAnPGZhbWlseSc6IGZvbnQuZmFtaWx5ID0geS52YWw7IGJyZWFrO1xuXG5cdFx0XHQvKiAxOC40LjE0IHZlcnRBbGlnbiBDVF9WZXJ0aWNhbEFsaWduRm9udFByb3BlcnR5IFRPRE8gKi9cblx0XHRcdGNhc2UgJzx2ZXJ0QWxpZ24nOiBmb250LnZhbGlnbiA9IHkudmFsOyBicmVhaztcblxuXHRcdFx0LyogMTguOC4zNSBzY2hlbWUgQ1RfRm9udFNjaGVtZSBUT0RPICovXG5cdFx0XHRjYXNlICc8c2NoZW1lJzogYnJlYWs7XG5cblx0XHRcdC8qIDE4LjIuMTAgZXh0THN0IENUX0V4dGVuc2lvbkxpc3QgPyAqL1xuXHRcdFx0Y2FzZSAnPGV4dExzdCc6IGNhc2UgJzxleHRMc3Q+JzogY2FzZSAnPC9leHRMc3Q+JzogYnJlYWs7XG5cdFx0XHRjYXNlICc8ZXh0JzogcGFzcyA9IHRydWU7IGJyZWFrO1xuXHRcdFx0Y2FzZSAnPC9leHQ+JzogcGFzcyA9IGZhbHNlOyBicmVhaztcblx0XHRcdGRlZmF1bHQ6XG5cdFx0XHRcdGlmKHlbMF0uY2hhckNvZGVBdCgxKSAhPT0gNDcgJiYgIXBhc3MpIHRocm93IG5ldyBFcnJvcignVW5yZWNvZ25pemVkIHJpY2ggZm9ybWF0ICcgKyB5WzBdKTtcblx0XHR9XG5cdH1cblx0cmV0dXJuIGZvbnQ7XG59XG5cbnZhciBwYXJzZV9ycyA9IChmdW5jdGlvbigpIHtcblx0dmFyIHRyZWdleCA9IG1hdGNodGFnKFwidFwiKSwgcnByZWdleCA9IG1hdGNodGFnKFwiclByXCIpO1xuXHQvKiAxOC40LjQgciBDVF9SRWx0ICovXG5cdGZ1bmN0aW9uIHBhcnNlX3Iocikge1xuXHRcdC8qIDE4LjQuMTIgdCBTVF9Yc3RyaW5nICovXG5cdFx0dmFyIHQgPSByLm1hdGNoKHRyZWdleCkvKiwgY3AgPSA2NTAwMSovO1xuXHRcdGlmKCF0KSByZXR1cm4ge3Q6XCJzXCIsIHY6XCJcIn07XG5cblx0XHR2YXIgbyA9ICh7dDoncycsIHY6dW5lc2NhcGV4bWwodFsxXSl9KTtcblx0XHR2YXIgcnByID0gci5tYXRjaChycHJlZ2V4KTtcblx0XHRpZihycHIpIG8ucyA9IHBhcnNlX3JwcihycHJbMV0pO1xuXHRcdHJldHVybiBvO1xuXHR9XG5cdHZhciBycmVnZXggPSAvPCg/Olxcdys6KT9yPi9nLCByZW5kID0gLzxcXC8oPzpcXHcrOik/cj4vO1xuXHRyZXR1cm4gZnVuY3Rpb24gcGFyc2VfcnMocnMpIHtcblx0XHRyZXR1cm4gcnMucmVwbGFjZShycmVnZXgsXCJcIikuc3BsaXQocmVuZCkubWFwKHBhcnNlX3IpLmZpbHRlcihmdW5jdGlvbihyKSB7IHJldHVybiByLnY7IH0pO1xuXHR9O1xufSkoKTtcblxuXG4vKiBQYXJzZSBhIGxpc3Qgb2YgPHI+IHRhZ3MgKi9cbnZhciByc190b19odG1sID0gKGZ1bmN0aW9uIHBhcnNlX3JzX2ZhY3RvcnkoKSB7XG5cdHZhciBubHJlZ2V4ID0gLyhcXHJcXG58XFxuKS9nO1xuXHRmdW5jdGlvbiBwYXJzZV9ycHIyKGZvbnQsIGludHJvLCBvdXRybykge1xuXHRcdHZhciBzdHlsZSA9IFtdO1xuXG5cdFx0aWYoZm9udC51KSBzdHlsZS5wdXNoKFwidGV4dC1kZWNvcmF0aW9uOiB1bmRlcmxpbmU7XCIpO1xuXHRcdGlmKGZvbnQudXZhbCkgc3R5bGUucHVzaChcInRleHQtdW5kZXJsaW5lLXN0eWxlOlwiICsgZm9udC51dmFsICsgXCI7XCIpO1xuXHRcdGlmKGZvbnQuc3opIHN0eWxlLnB1c2goXCJmb250LXNpemU6XCIgKyBmb250LnN6ICsgXCJwdDtcIik7XG5cdFx0aWYoZm9udC5vdXRsaW5lKSBzdHlsZS5wdXNoKFwidGV4dC1lZmZlY3Q6IG91dGxpbmU7XCIpO1xuXHRcdGlmKGZvbnQuc2hhZG93KSBzdHlsZS5wdXNoKFwidGV4dC1zaGFkb3c6IGF1dG87XCIpO1xuXHRcdGludHJvLnB1c2goJzxzcGFuIHN0eWxlPVwiJyArIHN0eWxlLmpvaW4oXCJcIikgKyAnXCI+Jyk7XG5cblx0XHRpZihmb250LmIpIHsgaW50cm8ucHVzaChcIjxiPlwiKTsgb3V0cm8ucHVzaChcIjwvYj5cIik7IH1cblx0XHRpZihmb250LmkpIHsgaW50cm8ucHVzaChcIjxpPlwiKTsgb3V0cm8ucHVzaChcIjwvaT5cIik7IH1cblx0XHRpZihmb250LnN0cmlrZSkgeyBpbnRyby5wdXNoKFwiPHM+XCIpOyBvdXRyby5wdXNoKFwiPC9zPlwiKTsgfVxuXG5cdFx0dmFyIGFsaWduID0gZm9udC52YWxpZ24gfHwgXCJcIjtcblx0XHRpZihhbGlnbiA9PSBcInN1cGVyc2NyaXB0XCIgfHwgYWxpZ24gPT0gXCJzdXBlclwiKSBhbGlnbiA9IFwic3VwXCI7XG5cdFx0ZWxzZSBpZihhbGlnbiA9PSBcInN1YnNjcmlwdFwiKSBhbGlnbiA9IFwic3ViXCI7XG5cdFx0aWYoYWxpZ24gIT0gXCJcIikgeyBpbnRyby5wdXNoKFwiPFwiICsgYWxpZ24gKyBcIj5cIik7IG91dHJvLnB1c2goXCI8L1wiICsgYWxpZ24gKyBcIj5cIik7IH1cblxuXHRcdG91dHJvLnB1c2goXCI8L3NwYW4+XCIpO1xuXHRcdHJldHVybiBmb250O1xuXHR9XG5cblx0LyogMTguNC40IHIgQ1RfUkVsdCAqL1xuXHRmdW5jdGlvbiByX3RvX2h0bWwocikge1xuXHRcdHZhciB0ZXJtcyA9IFtbXSxyLnYsW11dO1xuXHRcdGlmKCFyLnYpIHJldHVybiBcIlwiO1xuXG5cdFx0aWYoci5zKSBwYXJzZV9ycHIyKHIucywgdGVybXNbMF0sIHRlcm1zWzJdKTtcblxuXHRcdHJldHVybiB0ZXJtc1swXS5qb2luKFwiXCIpICsgdGVybXNbMV0ucmVwbGFjZShubHJlZ2V4LCc8YnIvPicpICsgdGVybXNbMl0uam9pbihcIlwiKTtcblx0fVxuXG5cdHJldHVybiBmdW5jdGlvbiBwYXJzZV9ycyhycykge1xuXHRcdHJldHVybiBycy5tYXAocl90b19odG1sKS5qb2luKFwiXCIpO1xuXHR9O1xufSkoKTtcblxuLyogMTguNC44IHNpIENUX1JzdCAqL1xudmFyIHNpdHJlZ2V4ID0gLzwoPzpcXHcrOik/dFtePl0qPihbXjxdKik8XFwvKD86XFx3KzopP3Q+L2csIHNpcnJlZ2V4ID0gLzwoPzpcXHcrOik/cj4vO1xudmFyIHNpcnBocmVnZXggPSAvPCg/Olxcdys6KT9yUGguKj8+KFtcXHNcXFNdKj8pPFxcLyg/Olxcdys6KT9yUGg+L2c7XG5mdW5jdGlvbiBwYXJzZV9zaSh4LCBvcHRzKSB7XG5cdHZhciBodG1sID0gb3B0cyA/IG9wdHMuY2VsbEhUTUwgOiB0cnVlO1xuXHR2YXIgeiA9IHt9O1xuXHRpZigheCkgcmV0dXJuIHsgdDogXCJcIiB9O1xuXHQvL3ZhciB5O1xuXHQvKiAxOC40LjEyIHQgU1RfWHN0cmluZyAoUGxhaW50ZXh0IFN0cmluZykgKi9cblx0Ly8gVE9ETzogaXMgd2hpdGVzcGFjZSBhY3R1YWxseSB2YWxpZCBoZXJlP1xuXHRpZih4Lm1hdGNoKC9eXFxzKjwoPzpcXHcrOik/dFtePl0qPi8pKSB7XG5cdFx0ei50ID0gdW5lc2NhcGV4bWwodXRmOHJlYWQoeC5zbGljZSh4LmluZGV4T2YoXCI+XCIpKzEpLnNwbGl0KC88XFwvKD86XFx3KzopP3Q+LylbMF18fFwiXCIpKTtcblx0XHR6LnIgPSB1dGY4cmVhZCh4KTtcblx0XHRpZihodG1sKSB6LmggPSBlc2NhcGVodG1sKHoudCk7XG5cdH1cblx0LyogMTguNC40IHIgQ1RfUkVsdCAoUmljaCBUZXh0IFJ1bikgKi9cblx0ZWxzZSBpZigoLyp5ID0gKi94Lm1hdGNoKHNpcnJlZ2V4KSkpIHtcblx0XHR6LnIgPSB1dGY4cmVhZCh4KTtcblx0XHR6LnQgPSB1bmVzY2FwZXhtbCh1dGY4cmVhZCgoeC5yZXBsYWNlKHNpcnBocmVnZXgsICcnKS5tYXRjaChzaXRyZWdleCl8fFtdKS5qb2luKFwiXCIpLnJlcGxhY2UodGFncmVnZXgsXCJcIikpKTtcblx0XHRpZihodG1sKSB6LmggPSByc190b19odG1sKHBhcnNlX3JzKHoucikpO1xuXHR9XG5cdC8qIDE4LjQuMyBwaG9uZXRpY1ByIENUX1Bob25ldGljUHIgKFRPRE86IG5lZWRlZCBmb3IgQXNpYW4gc3VwcG9ydCkgKi9cblx0LyogMTguNC42IHJQaCBDVF9QaG9uZXRpY1J1biAoVE9ETzogbmVlZGVkIGZvciBBc2lhbiBzdXBwb3J0KSAqL1xuXHRyZXR1cm4gejtcbn1cblxuLyogMTguNCBTaGFyZWQgU3RyaW5nIFRhYmxlICovXG52YXIgc3N0cjAgPSAvPCg/Olxcdys6KT9zc3QoW14+XSopPihbXFxzXFxTXSopPFxcLyg/Olxcdys6KT9zc3Q+LztcbnZhciBzc3RyMSA9IC88KD86XFx3KzopPyg/OnNpfHNzdEl0ZW0pPi9nO1xudmFyIHNzdHIyID0gLzxcXC8oPzpcXHcrOik/KD86c2l8c3N0SXRlbSk+LztcbmZ1bmN0aW9uIHBhcnNlX3NzdF94bWwoZGF0YSwgb3B0cykge1xuXHR2YXIgcyA9IChbXSksIHNzID0gXCJcIjtcblx0aWYoIWRhdGEpIHJldHVybiBzO1xuXHQvKiAxOC40Ljkgc3N0IENUX1NzdCAqL1xuXHR2YXIgc3N0ID0gZGF0YS5tYXRjaChzc3RyMCk7XG5cdGlmKHNzdCkge1xuXHRcdHNzID0gc3N0WzJdLnJlcGxhY2Uoc3N0cjEsXCJcIikuc3BsaXQoc3N0cjIpO1xuXHRcdGZvcih2YXIgaSA9IDA7IGkgIT0gc3MubGVuZ3RoOyArK2kpIHtcblx0XHRcdHZhciBvID0gcGFyc2Vfc2koc3NbaV0udHJpbSgpLCBvcHRzKTtcblx0XHRcdGlmKG8gIT0gbnVsbCkgc1tzLmxlbmd0aF0gPSBvO1xuXHRcdH1cblx0XHRzc3QgPSBwYXJzZXhtbHRhZyhzc3RbMV0pOyBzLkNvdW50ID0gc3N0LmNvdW50OyBzLlVuaXF1ZSA9IHNzdC51bmlxdWVDb3VudDtcblx0fVxuXHRyZXR1cm4gcztcbn1cblxuUkVMUy5TU1QgPSBcImh0dHA6Ly9zY2hlbWFzLm9wZW54bWxmb3JtYXRzLm9yZy9vZmZpY2VEb2N1bWVudC8yMDA2L3JlbGF0aW9uc2hpcHMvc2hhcmVkU3RyaW5nc1wiO1xudmFyIHN0cmF5d3NyZWdleCA9IC9eXFxzfFxccyR8W1xcdFxcblxccl0vO1xuZnVuY3Rpb24gd3JpdGVfc3N0X3htbChzc3QsIG9wdHMpIHtcblx0aWYoIW9wdHMuYm9va1NTVCkgcmV0dXJuIFwiXCI7XG5cdHZhciBvID0gW1hNTF9IRUFERVJdO1xuXHRvW28ubGVuZ3RoXSA9ICh3cml0ZXh0YWcoJ3NzdCcsIG51bGwsIHtcblx0XHR4bWxuczogWE1MTlMubWFpblswXSxcblx0XHRjb3VudDogc3N0LkNvdW50LFxuXHRcdHVuaXF1ZUNvdW50OiBzc3QuVW5pcXVlXG5cdH0pKTtcblx0Zm9yKHZhciBpID0gMDsgaSAhPSBzc3QubGVuZ3RoOyArK2kpIHsgaWYoc3N0W2ldID09IG51bGwpIGNvbnRpbnVlO1xuXHRcdHZhciBzID0gc3N0W2ldO1xuXHRcdHZhciBzaXRhZyA9IFwiPHNpPlwiO1xuXHRcdGlmKHMucikgc2l0YWcgKz0gcy5yO1xuXHRcdGVsc2Uge1xuXHRcdFx0c2l0YWcgKz0gXCI8dFwiO1xuXHRcdFx0aWYoIXMudCkgcy50ID0gXCJcIjtcblx0XHRcdGlmKHMudC5tYXRjaChzdHJheXdzcmVnZXgpKSBzaXRhZyArPSAnIHhtbDpzcGFjZT1cInByZXNlcnZlXCInO1xuXHRcdFx0c2l0YWcgKz0gXCI+XCIgKyBlc2NhcGV4bWwocy50KSArIFwiPC90PlwiO1xuXHRcdH1cblx0XHRzaXRhZyArPSBcIjwvc2k+XCI7XG5cdFx0b1tvLmxlbmd0aF0gPSAoc2l0YWcpO1xuXHR9XG5cdGlmKG8ubGVuZ3RoPjIpeyBvW28ubGVuZ3RoXSA9ICgnPC9zc3Q+Jyk7IG9bMV09b1sxXS5yZXBsYWNlKFwiLz5cIixcIj5cIik7IH1cblx0cmV0dXJuIG8uam9pbihcIlwiKTtcbn1cbi8qIFtNUy1YTFNCXSAyLjQuMjIxIEJydEJlZ2luU3N0ICovXG5mdW5jdGlvbiBwYXJzZV9CcnRCZWdpblNzdChkYXRhKSB7XG5cdHJldHVybiBbZGF0YS5yZWFkX3NoaWZ0KDQpLCBkYXRhLnJlYWRfc2hpZnQoNCldO1xufVxuXG4vKiBbTVMtWExTQl0gMi4xLjcuNDUgU2hhcmVkIFN0cmluZ3MgKi9cbmZ1bmN0aW9uIHBhcnNlX3NzdF9iaW4oZGF0YSwgb3B0cykge1xuXHR2YXIgcyA9IChbXSk7XG5cdHZhciBwYXNzID0gZmFsc2U7XG5cdHJlY29yZGhvcHBlcihkYXRhLCBmdW5jdGlvbiBob3BwZXJfc3N0KHZhbCwgUl9uLCBSVCkge1xuXHRcdHN3aXRjaChSVCkge1xuXHRcdFx0Y2FzZSAweDAwOUY6IC8qICdCcnRCZWdpblNzdCcgKi9cblx0XHRcdFx0cy5Db3VudCA9IHZhbFswXTsgcy5VbmlxdWUgPSB2YWxbMV07IGJyZWFrO1xuXHRcdFx0Y2FzZSAweDAwMTM6IC8qICdCcnRTU1RJdGVtJyAqL1xuXHRcdFx0XHRzLnB1c2godmFsKTsgYnJlYWs7XG5cdFx0XHRjYXNlIDB4MDBBMDogLyogJ0JydEVuZFNzdCcgKi9cblx0XHRcdFx0cmV0dXJuIHRydWU7XG5cblx0XHRcdGNhc2UgMHgwMDIzOiAvKiAnQnJ0RlJUQmVnaW4nICovXG5cdFx0XHRcdHBhc3MgPSB0cnVlOyBicmVhaztcblx0XHRcdGNhc2UgMHgwMDI0OiAvKiAnQnJ0RlJURW5kJyAqL1xuXHRcdFx0XHRwYXNzID0gZmFsc2U7IGJyZWFrO1xuXG5cdFx0XHRkZWZhdWx0OlxuXHRcdFx0XHRpZihSX24uaW5kZXhPZihcIkJlZ2luXCIpID4gMCl7LyogZW1wdHkgKi99XG5cdFx0XHRcdGVsc2UgaWYoUl9uLmluZGV4T2YoXCJFbmRcIikgPiAwKXsvKiBlbXB0eSAqL31cblx0XHRcdFx0aWYoIXBhc3MgfHwgb3B0cy5XVEYpIHRocm93IG5ldyBFcnJvcihcIlVuZXhwZWN0ZWQgcmVjb3JkIFwiICsgUlQgKyBcIiBcIiArIFJfbik7XG5cdFx0fVxuXHR9KTtcblx0cmV0dXJuIHM7XG59XG5cbmZ1bmN0aW9uIHdyaXRlX0JydEJlZ2luU3N0KHNzdCwgbykge1xuXHRpZighbykgbyA9IG5ld19idWYoOCk7XG5cdG8ud3JpdGVfc2hpZnQoNCwgc3N0LkNvdW50KTtcblx0by53cml0ZV9zaGlmdCg0LCBzc3QuVW5pcXVlKTtcblx0cmV0dXJuIG87XG59XG5cbnZhciB3cml0ZV9CcnRTU1RJdGVtID0gd3JpdGVfUmljaFN0cjtcblxuZnVuY3Rpb24gd3JpdGVfc3N0X2Jpbihzc3QpIHtcblx0dmFyIGJhID0gYnVmX2FycmF5KCk7XG5cdHdyaXRlX3JlY29yZChiYSwgXCJCcnRCZWdpblNzdFwiLCB3cml0ZV9CcnRCZWdpblNzdChzc3QpKTtcblx0Zm9yKHZhciBpID0gMDsgaSA8IHNzdC5sZW5ndGg7ICsraSkgd3JpdGVfcmVjb3JkKGJhLCBcIkJydFNTVEl0ZW1cIiwgd3JpdGVfQnJ0U1NUSXRlbShzc3RbaV0pKTtcblx0LyogRlJUU1NUICovXG5cdHdyaXRlX3JlY29yZChiYSwgXCJCcnRFbmRTc3RcIik7XG5cdHJldHVybiBiYS5lbmQoKTtcbn1cbmZ1bmN0aW9uIF9KUzJBTlNJKHN0cikge1xuXHRpZih0eXBlb2YgY3B0YWJsZSAhPT0gJ3VuZGVmaW5lZCcpIHJldHVybiBjcHRhYmxlLnV0aWxzLmVuY29kZShjdXJyZW50X2Fuc2ksIHN0cik7XG5cdHZhciBvID0gW10sIG9vID0gc3RyLnNwbGl0KFwiXCIpO1xuXHRmb3IodmFyIGkgPSAwOyBpIDwgb28ubGVuZ3RoOyArK2kpIG9baV0gPSBvb1tpXS5jaGFyQ29kZUF0KDApO1xuXHRyZXR1cm4gbztcbn1cblxuLyogW01TLU9GRkNSWVBUT10gMi4xLjQgVmVyc2lvbiAqL1xuZnVuY3Rpb24gcGFyc2VfQ1JZUFRPVmVyc2lvbihibG9iLCBsZW5ndGgpIHtcblx0dmFyIG8gPSB7fTtcblx0by5NYWpvciA9IGJsb2IucmVhZF9zaGlmdCgyKTtcblx0by5NaW5vciA9IGJsb2IucmVhZF9zaGlmdCgyKTtcbmlmKGxlbmd0aCA+PSA0KSBibG9iLmwgKz0gbGVuZ3RoIC0gNDtcblx0cmV0dXJuIG87XG59XG5cbi8qIFtNUy1PRkZDUllQVE9dIDIuMS41IERhdGFTcGFjZVZlcnNpb25JbmZvICovXG5mdW5jdGlvbiBwYXJzZV9EYXRhU3BhY2VWZXJzaW9uSW5mbyhibG9iKSB7XG5cdHZhciBvID0ge307XG5cdG8uaWQgPSBibG9iLnJlYWRfc2hpZnQoMCwgJ2xwcDQnKTtcblx0by5SID0gcGFyc2VfQ1JZUFRPVmVyc2lvbihibG9iLCA0KTtcblx0by5VID0gcGFyc2VfQ1JZUFRPVmVyc2lvbihibG9iLCA0KTtcblx0by5XID0gcGFyc2VfQ1JZUFRPVmVyc2lvbihibG9iLCA0KTtcblx0cmV0dXJuIG87XG59XG5cbi8qIFtNUy1PRkZDUllQVE9dIDIuMS42LjEgRGF0YVNwYWNlTWFwRW50cnkgU3RydWN0dXJlICovXG5mdW5jdGlvbiBwYXJzZV9EYXRhU3BhY2VNYXBFbnRyeShibG9iKSB7XG5cdHZhciBsZW4gPSBibG9iLnJlYWRfc2hpZnQoNCk7XG5cdHZhciBlbmQgPSBibG9iLmwgKyBsZW4gLSA0O1xuXHR2YXIgbyA9IHt9O1xuXHR2YXIgY250ID0gYmxvYi5yZWFkX3NoaWZ0KDQpO1xuXHR2YXIgY29tcHMgPSBbXTtcblx0LyogW01TLU9GRkNSWVBUT10gMi4xLjYuMiBEYXRhU3BhY2VSZWZlcmVuY2VDb21wb25lbnQgU3RydWN0dXJlICovXG5cdHdoaWxlKGNudC0tID4gMCkgY29tcHMucHVzaCh7IHQ6IGJsb2IucmVhZF9zaGlmdCg0KSwgdjogYmxvYi5yZWFkX3NoaWZ0KDAsICdscHA0JykgfSk7XG5cdG8ubmFtZSA9IGJsb2IucmVhZF9zaGlmdCgwLCAnbHBwNCcpO1xuXHRvLmNvbXBzID0gY29tcHM7XG5cdGlmKGJsb2IubCAhPSBlbmQpIHRocm93IG5ldyBFcnJvcihcIkJhZCBEYXRhU3BhY2VNYXBFbnRyeTogXCIgKyBibG9iLmwgKyBcIiAhPSBcIiArIGVuZCk7XG5cdHJldHVybiBvO1xufVxuXG4vKiBbTVMtT0ZGQ1JZUFRPXSAyLjEuNiBEYXRhU3BhY2VNYXAgKi9cbmZ1bmN0aW9uIHBhcnNlX0RhdGFTcGFjZU1hcChibG9iKSB7XG5cdHZhciBvID0gW107XG5cdGJsb2IubCArPSA0OyAvLyBtdXN0IGJlIDB4OFxuXHR2YXIgY250ID0gYmxvYi5yZWFkX3NoaWZ0KDQpO1xuXHR3aGlsZShjbnQtLSA+IDApIG8ucHVzaChwYXJzZV9EYXRhU3BhY2VNYXBFbnRyeShibG9iKSk7XG5cdHJldHVybiBvO1xufVxuXG4vKiBbTVMtT0ZGQ1JZUFRPXSAyLjEuNyBEYXRhU3BhY2VEZWZpbml0aW9uICovXG5mdW5jdGlvbiBwYXJzZV9EYXRhU3BhY2VEZWZpbml0aW9uKGJsb2IpIHtcblx0dmFyIG8gPSBbXTtcblx0YmxvYi5sICs9IDQ7IC8vIG11c3QgYmUgMHg4XG5cdHZhciBjbnQgPSBibG9iLnJlYWRfc2hpZnQoNCk7XG5cdHdoaWxlKGNudC0tID4gMCkgby5wdXNoKGJsb2IucmVhZF9zaGlmdCgwLCAnbHBwNCcpKTtcblx0cmV0dXJuIG87XG59XG5cbi8qIFtNUy1PRkZDUllQVE9dIDIuMS44IERhdGFTcGFjZURlZmluaXRpb24gKi9cbmZ1bmN0aW9uIHBhcnNlX1RyYW5zZm9ybUluZm9IZWFkZXIoYmxvYikge1xuXHR2YXIgbyA9IHt9O1xuXHQvKnZhciBsZW4gPSAqL2Jsb2IucmVhZF9zaGlmdCg0KTtcblx0YmxvYi5sICs9IDQ7IC8vIG11c3QgYmUgMHgxXG5cdG8uaWQgPSBibG9iLnJlYWRfc2hpZnQoMCwgJ2xwcDQnKTtcblx0by5uYW1lID0gYmxvYi5yZWFkX3NoaWZ0KDAsICdscHA0Jyk7XG5cdG8uUiA9IHBhcnNlX0NSWVBUT1ZlcnNpb24oYmxvYiwgNCk7XG5cdG8uVSA9IHBhcnNlX0NSWVBUT1ZlcnNpb24oYmxvYiwgNCk7XG5cdG8uVyA9IHBhcnNlX0NSWVBUT1ZlcnNpb24oYmxvYiwgNCk7XG5cdHJldHVybiBvO1xufVxuXG5mdW5jdGlvbiBwYXJzZV9QcmltYXJ5KGJsb2IpIHtcblx0LyogW01TLU9GRkNSWVBUT10gMi4yLjYgSVJNRFNUcmFuc2Zvcm1JbmZvICovXG5cdHZhciBoZHIgPSBwYXJzZV9UcmFuc2Zvcm1JbmZvSGVhZGVyKGJsb2IpO1xuXHQvKiBbTVMtT0ZGQ1JZUFRPXSAyLjEuOSBFbmNyeXB0aW9uVHJhbnNmb3JtSW5mbyAqL1xuXHRoZHIuZW5hbWUgPSBibG9iLnJlYWRfc2hpZnQoMCwgJzhscHA0Jyk7XG5cdGhkci5ibGtzeiA9IGJsb2IucmVhZF9zaGlmdCg0KTtcblx0aGRyLmNtb2RlID0gYmxvYi5yZWFkX3NoaWZ0KDQpO1xuXHRpZihibG9iLnJlYWRfc2hpZnQoNCkgIT0gMHgwNCkgdGhyb3cgbmV3IEVycm9yKFwiQmFkICFQcmltYXJ5IHJlY29yZFwiKTtcblx0cmV0dXJuIGhkcjtcbn1cblxuLyogW01TLU9GRkNSWVBUT10gMi4zLjIgRW5jcnlwdGlvbiBIZWFkZXIgKi9cbmZ1bmN0aW9uIHBhcnNlX0VuY3J5cHRpb25IZWFkZXIoYmxvYiwgbGVuZ3RoKSB7XG5cdHZhciB0Z3QgPSBibG9iLmwgKyBsZW5ndGg7XG5cdHZhciBvID0ge307XG5cdG8uRmxhZ3MgPSAoYmxvYi5yZWFkX3NoaWZ0KDQpICYgMHgzRik7XG5cdGJsb2IubCArPSA0O1xuXHRvLkFsZ0lEID0gYmxvYi5yZWFkX3NoaWZ0KDQpO1xuXHR2YXIgdmFsaWQgPSBmYWxzZTtcblx0c3dpdGNoKG8uQWxnSUQpIHtcblx0XHRjYXNlIDB4NjYwRTogY2FzZSAweDY2MEY6IGNhc2UgMHg2NjEwOiB2YWxpZCA9IChvLkZsYWdzID09IDB4MjQpOyBicmVhaztcblx0XHRjYXNlIDB4NjgwMTogdmFsaWQgPSAoby5GbGFncyA9PSAweDA0KTsgYnJlYWs7XG5cdFx0Y2FzZSAwOiB2YWxpZCA9IChvLkZsYWdzID09IDB4MTAgfHwgby5GbGFncyA9PSAweDA0IHx8IG8uRmxhZ3MgPT0gMHgyNCk7IGJyZWFrO1xuXHRcdGRlZmF1bHQ6IHRocm93ICdVbnJlY29nbml6ZWQgZW5jcnlwdGlvbiBhbGdvcml0aG06ICcgKyBvLkFsZ0lEO1xuXHR9XG5cdGlmKCF2YWxpZCkgdGhyb3cgbmV3IEVycm9yKFwiRW5jcnlwdGlvbiBGbGFncy9BbGdJRCBtaXNtYXRjaFwiKTtcblx0by5BbGdJREhhc2ggPSBibG9iLnJlYWRfc2hpZnQoNCk7XG5cdG8uS2V5U2l6ZSA9IGJsb2IucmVhZF9zaGlmdCg0KTtcblx0by5Qcm92aWRlclR5cGUgPSBibG9iLnJlYWRfc2hpZnQoNCk7XG5cdGJsb2IubCArPSA4O1xuXHRvLkNTUE5hbWUgPSBibG9iLnJlYWRfc2hpZnQoKHRndC1ibG9iLmwpPj4xLCAndXRmMTZsZScpO1xuXHRibG9iLmwgPSB0Z3Q7XG5cdHJldHVybiBvO1xufVxuXG4vKiBbTVMtT0ZGQ1JZUFRPXSAyLjMuMyBFbmNyeXB0aW9uIFZlcmlmaWVyICovXG5mdW5jdGlvbiBwYXJzZV9FbmNyeXB0aW9uVmVyaWZpZXIoYmxvYiwgbGVuZ3RoKSB7XG5cdHZhciBvID0ge30sIHRndCA9IGJsb2IubCArIGxlbmd0aDtcblx0YmxvYi5sICs9IDQ7IC8vIFNhbHRTaXplIG11c3QgYmUgMHgxMFxuXHRvLlNhbHQgPSBibG9iLnNsaWNlKGJsb2IubCwgYmxvYi5sKzE2KTsgYmxvYi5sICs9IDE2O1xuXHRvLlZlcmlmaWVyID0gYmxvYi5zbGljZShibG9iLmwsIGJsb2IubCsxNik7IGJsb2IubCArPSAxNjtcblx0Lyp2YXIgc3ogPSAqL2Jsb2IucmVhZF9zaGlmdCg0KTtcblx0by5WZXJpZmllckhhc2ggPSBibG9iLnNsaWNlKGJsb2IubCwgdGd0KTsgYmxvYi5sID0gdGd0O1xuXHRyZXR1cm4gbztcbn1cblxuLyogW01TLU9GRkNSWVBUT10gMi4zLjQuKiBFbmNyeXB0aW9uSW5mbyBTdHJlYW0gKi9cbmZ1bmN0aW9uIHBhcnNlX0VuY3J5cHRpb25JbmZvKGJsb2IpIHtcblx0dmFyIHZlcnMgPSBwYXJzZV9DUllQVE9WZXJzaW9uKGJsb2IpO1xuXHRzd2l0Y2godmVycy5NaW5vcikge1xuXHRcdGNhc2UgMHgwMjogcmV0dXJuIFt2ZXJzLk1pbm9yLCBwYXJzZV9FbmNJbmZvU3RkKGJsb2IsIHZlcnMpXTtcblx0XHRjYXNlIDB4MDM6IHJldHVybiBbdmVycy5NaW5vciwgcGFyc2VfRW5jSW5mb0V4dChibG9iLCB2ZXJzKV07XG5cdFx0Y2FzZSAweDA0OiByZXR1cm4gW3ZlcnMuTWlub3IsIHBhcnNlX0VuY0luZm9BZ2woYmxvYiwgdmVycyldO1xuXHR9XG5cdHRocm93IG5ldyBFcnJvcihcIkVDTUEtMzc2IEVuY3J5cHRlZCBmaWxlIHVucmVjb2duaXplZCBWZXJzaW9uOiBcIiArIHZlcnMuTWlub3IpO1xufVxuXG4vKiBbTVMtT0ZGQ1JZUFRPXSAyLjMuNC41ICBFbmNyeXB0aW9uSW5mbyBTdHJlYW0gKFN0YW5kYXJkIEVuY3J5cHRpb24pICovXG5mdW5jdGlvbiBwYXJzZV9FbmNJbmZvU3RkKGJsb2IpIHtcblx0dmFyIGZsYWdzID0gYmxvYi5yZWFkX3NoaWZ0KDQpO1xuXHRpZigoZmxhZ3MgJiAweDNGKSAhPSAweDI0KSB0aHJvdyBuZXcgRXJyb3IoXCJFbmNyeXB0aW9uSW5mbyBtaXNtYXRjaFwiKTtcblx0dmFyIHN6ID0gYmxvYi5yZWFkX3NoaWZ0KDQpO1xuXHQvL3ZhciB0Z3QgPSBibG9iLmwgKyBzejtcblx0dmFyIGhkciA9IHBhcnNlX0VuY3J5cHRpb25IZWFkZXIoYmxvYiwgc3opO1xuXHR2YXIgdmVyaWZpZXIgPSBwYXJzZV9FbmNyeXB0aW9uVmVyaWZpZXIoYmxvYiwgYmxvYi5sZW5ndGggLSBibG9iLmwpO1xuXHRyZXR1cm4geyB0OlwiU3RkXCIsIGg6aGRyLCB2OnZlcmlmaWVyIH07XG59XG4vKiBbTVMtT0ZGQ1JZUFRPXSAyLjMuNC42ICBFbmNyeXB0aW9uSW5mbyBTdHJlYW0gKEV4dGVuc2libGUgRW5jcnlwdGlvbikgKi9cbmZ1bmN0aW9uIHBhcnNlX0VuY0luZm9FeHQoKSB7IHRocm93IG5ldyBFcnJvcihcIkZpbGUgaXMgcGFzc3dvcmQtcHJvdGVjdGVkOiBFQ01BLTM3NiBFeHRlbnNpYmxlXCIpOyB9XG4vKiBbTVMtT0ZGQ1JZUFRPXSAyLjMuNC4xMCBFbmNyeXB0aW9uSW5mbyBTdHJlYW0gKEFnaWxlIEVuY3J5cHRpb24pICovXG5mdW5jdGlvbiBwYXJzZV9FbmNJbmZvQWdsKGJsb2IpIHtcblx0dmFyIEtleURhdGEgPSBbXCJzYWx0U2l6ZVwiLFwiYmxvY2tTaXplXCIsXCJrZXlCaXRzXCIsXCJoYXNoU2l6ZVwiLFwiY2lwaGVyQWxnb3JpdGhtXCIsXCJjaXBoZXJDaGFpbmluZ1wiLFwiaGFzaEFsZ29yaXRobVwiLFwic2FsdFZhbHVlXCJdO1xuXHRibG9iLmwrPTQ7XG5cdHZhciB4bWwgPSBibG9iLnJlYWRfc2hpZnQoYmxvYi5sZW5ndGggLSBibG9iLmwsICd1dGY4Jyk7XG5cdHZhciBvID0ge307XG5cdHhtbC5yZXBsYWNlKHRhZ3JlZ2V4LCBmdW5jdGlvbiB4bWxfYWdpbGUoeCkge1xuXHRcdHZhciB5ID0gcGFyc2V4bWx0YWcoeCk7XG5cdFx0c3dpdGNoKHN0cmlwX25zKHlbMF0pKSB7XG5cdFx0XHRjYXNlICc8P3htbCc6IGJyZWFrO1xuXHRcdFx0Y2FzZSAnPGVuY3J5cHRpb24nOiBjYXNlICc8L2VuY3J5cHRpb24+JzogYnJlYWs7XG5cdFx0XHRjYXNlICc8a2V5RGF0YSc6IEtleURhdGEuZm9yRWFjaChmdW5jdGlvbihrKSB7IG9ba10gPSB5W2tdOyB9KTsgYnJlYWs7XG5cdFx0XHRjYXNlICc8ZGF0YUludGVncml0eSc6IG8uZW5jcnlwdGVkSG1hY0tleSA9IHkuZW5jcnlwdGVkSG1hY0tleTsgby5lbmNyeXB0ZWRIbWFjVmFsdWUgPSB5LmVuY3J5cHRlZEhtYWNWYWx1ZTsgYnJlYWs7XG5cdFx0XHRjYXNlICc8a2V5RW5jcnlwdG9ycz4nOiBjYXNlICc8a2V5RW5jcnlwdG9ycyc6IG8uZW5jcyA9IFtdOyBicmVhaztcblx0XHRcdGNhc2UgJzwva2V5RW5jcnlwdG9ycz4nOiBicmVhaztcblxuXHRcdFx0Y2FzZSAnPGtleUVuY3J5cHRvcic6IG8udXJpID0geS51cmk7IGJyZWFrO1xuXHRcdFx0Y2FzZSAnPC9rZXlFbmNyeXB0b3I+JzogYnJlYWs7XG5cdFx0XHRjYXNlICc8ZW5jcnlwdGVkS2V5Jzogby5lbmNzLnB1c2goeSk7IGJyZWFrO1xuXHRcdFx0ZGVmYXVsdDogdGhyb3cgeVswXTtcblx0XHR9XG5cdH0pO1xuXHRyZXR1cm4gbztcbn1cblxuLyogW01TLU9GRkNSWVBUT10gMi4zLjUuMSBSQzQgQ3J5cHRvQVBJIEVuY3J5cHRpb24gSGVhZGVyICovXG5mdW5jdGlvbiBwYXJzZV9SQzRDcnlwdG9IZWFkZXIoYmxvYiwgbGVuZ3RoKSB7XG5cdHZhciBvID0ge307XG5cdHZhciB2ZXJzID0gby5FbmNyeXB0aW9uVmVyc2lvbkluZm8gPSBwYXJzZV9DUllQVE9WZXJzaW9uKGJsb2IsIDQpOyBsZW5ndGggLT0gNDtcblx0aWYodmVycy5NaW5vciAhPSAyKSB0aHJvdyBuZXcgRXJyb3IoJ3VucmVjb2duaXplZCBtaW5vciB2ZXJzaW9uIGNvZGU6ICcgKyB2ZXJzLk1pbm9yKTtcblx0aWYodmVycy5NYWpvciA+IDQgfHwgdmVycy5NYWpvciA8IDIpIHRocm93IG5ldyBFcnJvcigndW5yZWNvZ25pemVkIG1ham9yIHZlcnNpb24gY29kZTogJyArIHZlcnMuTWFqb3IpO1xuXHRvLkZsYWdzID0gYmxvYi5yZWFkX3NoaWZ0KDQpOyBsZW5ndGggLT0gNDtcblx0dmFyIHN6ID0gYmxvYi5yZWFkX3NoaWZ0KDQpOyBsZW5ndGggLT0gNDtcblx0by5FbmNyeXB0aW9uSGVhZGVyID0gcGFyc2VfRW5jcnlwdGlvbkhlYWRlcihibG9iLCBzeik7IGxlbmd0aCAtPSBzejtcblx0by5FbmNyeXB0aW9uVmVyaWZpZXIgPSBwYXJzZV9FbmNyeXB0aW9uVmVyaWZpZXIoYmxvYiwgbGVuZ3RoKTtcblx0cmV0dXJuIG87XG59XG4vKiBbTVMtT0ZGQ1JZUFRPXSAyLjMuNi4xIFJDNCBFbmNyeXB0aW9uIEhlYWRlciAqL1xuZnVuY3Rpb24gcGFyc2VfUkM0SGVhZGVyKGJsb2IpIHtcblx0dmFyIG8gPSB7fTtcblx0dmFyIHZlcnMgPSBvLkVuY3J5cHRpb25WZXJzaW9uSW5mbyA9IHBhcnNlX0NSWVBUT1ZlcnNpb24oYmxvYiwgNCk7XG5cdGlmKHZlcnMuTWFqb3IgIT0gMSB8fCB2ZXJzLk1pbm9yICE9IDEpIHRocm93ICd1bnJlY29nbml6ZWQgdmVyc2lvbiBjb2RlICcgKyB2ZXJzLk1ham9yICsgJyA6ICcgKyB2ZXJzLk1pbm9yO1xuXHRvLlNhbHQgPSBibG9iLnJlYWRfc2hpZnQoMTYpO1xuXHRvLkVuY3J5cHRlZFZlcmlmaWVyID0gYmxvYi5yZWFkX3NoaWZ0KDE2KTtcblx0by5FbmNyeXB0ZWRWZXJpZmllckhhc2ggPSBibG9iLnJlYWRfc2hpZnQoMTYpO1xuXHRyZXR1cm4gbztcbn1cblxuLyogW01TLU9GRkNSWVBUT10gMi4zLjcuMSBCaW5hcnkgRG9jdW1lbnQgUGFzc3dvcmQgVmVyaWZpZXIgRGVyaXZhdGlvbiAqL1xuZnVuY3Rpb24gY3J5cHRvX0NyZWF0ZVBhc3N3b3JkVmVyaWZpZXJfTWV0aG9kMShQYXNzd29yZCkge1xuXHR2YXIgVmVyaWZpZXIgPSAweDAwMDAsIFBhc3N3b3JkQXJyYXk7XG5cdHZhciBQYXNzd29yZERlY29kZWQgPSBfSlMyQU5TSShQYXNzd29yZCk7XG5cdHZhciBsZW4gPSBQYXNzd29yZERlY29kZWQubGVuZ3RoICsgMSwgaSwgUGFzc3dvcmRCeXRlO1xuXHR2YXIgSW50ZXJtZWRpYXRlMSwgSW50ZXJtZWRpYXRlMiwgSW50ZXJtZWRpYXRlMztcblx0UGFzc3dvcmRBcnJheSA9IG5ld19yYXdfYnVmKGxlbik7XG5cdFBhc3N3b3JkQXJyYXlbMF0gPSBQYXNzd29yZERlY29kZWQubGVuZ3RoO1xuXHRmb3IoaSA9IDE7IGkgIT0gbGVuOyArK2kpIFBhc3N3b3JkQXJyYXlbaV0gPSBQYXNzd29yZERlY29kZWRbaS0xXTtcblx0Zm9yKGkgPSBsZW4tMTsgaSA+PSAwOyAtLWkpIHtcblx0XHRQYXNzd29yZEJ5dGUgPSBQYXNzd29yZEFycmF5W2ldO1xuXHRcdEludGVybWVkaWF0ZTEgPSAoKFZlcmlmaWVyICYgMHg0MDAwKSA9PT0gMHgwMDAwKSA/IDAgOiAxO1xuXHRcdEludGVybWVkaWF0ZTIgPSAoVmVyaWZpZXIgPDwgMSkgJiAweDdGRkY7XG5cdFx0SW50ZXJtZWRpYXRlMyA9IEludGVybWVkaWF0ZTEgfCBJbnRlcm1lZGlhdGUyO1xuXHRcdFZlcmlmaWVyID0gSW50ZXJtZWRpYXRlMyBeIFBhc3N3b3JkQnl0ZTtcblx0fVxuXHRyZXR1cm4gVmVyaWZpZXIgXiAweENFNEI7XG59XG5cbi8qIFtNUy1PRkZDUllQVE9dIDIuMy43LjIgQmluYXJ5IERvY3VtZW50IFhPUiBBcnJheSBJbml0aWFsaXphdGlvbiAqL1xudmFyIGNyeXB0b19DcmVhdGVYb3JBcnJheV9NZXRob2QxID0gKGZ1bmN0aW9uKCkge1xuXHR2YXIgUGFkQXJyYXkgPSBbMHhCQiwgMHhGRiwgMHhGRiwgMHhCQSwgMHhGRiwgMHhGRiwgMHhCOSwgMHg4MCwgMHgwMCwgMHhCRSwgMHgwRiwgMHgwMCwgMHhCRiwgMHgwRiwgMHgwMF07XG5cdHZhciBJbml0aWFsQ29kZSA9IFsweEUxRjAsIDB4MUQwRiwgMHhDQzlDLCAweDg0QzAsIDB4MTEwQywgMHgwRTEwLCAweEYxQ0UsIDB4MzEzRSwgMHgxODcyLCAweEUxMzksIDB4RDQwRiwgMHg4NEY5LCAweDI4MEMsIDB4QTk2QSwgMHg0RUMzXTtcblx0dmFyIFhvck1hdHJpeCA9IFsweEFFRkMsIDB4NEREOSwgMHg5QkIyLCAweDI3NDUsIDB4NEU4QSwgMHg5RDE0LCAweDJBMDksIDB4N0I2MSwgMHhGNkMyLCAweEZEQTUsIDB4RUI2QiwgMHhDNkY3LCAweDlEQ0YsIDB4MkJCRiwgMHg0NTYzLCAweDhBQzYsIDB4MDVBRCwgMHgwQjVBLCAweDE2QjQsIDB4MkQ2OCwgMHg1QUQwLCAweDAzNzUsIDB4MDZFQSwgMHgwREQ0LCAweDFCQTgsIDB4Mzc1MCwgMHg2RUEwLCAweERENDAsIDB4RDg0OSwgMHhBMEIzLCAweDUxNDcsIDB4QTI4RSwgMHg1NTNELCAweEFBN0EsIDB4NDRENSwgMHg2RjQ1LCAweERFOEEsIDB4QUQzNSwgMHg0QTRCLCAweDk0OTYsIDB4MzkwRCwgMHg3MjFBLCAweEVCMjMsIDB4QzY2NywgMHg5Q0VGLCAweDI5RkYsIDB4NTNGRSwgMHhBN0ZDLCAweDVGRDksIDB4NDdEMywgMHg4RkE2LCAweDBGNkQsIDB4MUVEQSwgMHgzREI0LCAweDdCNjgsIDB4RjZEMCwgMHhCODYxLCAweDYwRTMsIDB4QzFDNiwgMHg5M0FELCAweDM3N0IsIDB4NkVGNiwgMHhEREVDLCAweDQ1QTAsIDB4OEI0MCwgMHgwNkExLCAweDBENDIsIDB4MUE4NCwgMHgzNTA4LCAweDZBMTAsIDB4QUE1MSwgMHg0NDgzLCAweDg5MDYsIDB4MDIyRCwgMHgwNDVBLCAweDA4QjQsIDB4MTE2OCwgMHg3NkI0LCAweEVENjgsIDB4Q0FGMSwgMHg4NUMzLCAweDFCQTcsIDB4Mzc0RSwgMHg2RTlDLCAweDM3MzAsIDB4NkU2MCwgMHhEQ0MwLCAweEE5QTEsIDB4NDM2MywgMHg4NkM2LCAweDFEQUQsIDB4MzMzMSwgMHg2NjYyLCAweENDQzQsIDB4ODlBOSwgMHgwMzczLCAweDA2RTYsIDB4MERDQywgMHgxMDIxLCAweDIwNDIsIDB4NDA4NCwgMHg4MTA4LCAweDEyMzEsIDB4MjQ2MiwgMHg0OEM0XTtcblx0dmFyIFJvciA9IGZ1bmN0aW9uKEJ5dGUpIHsgcmV0dXJuICgoQnl0ZS8yKSB8IChCeXRlKjEyOCkpICYgMHhGRjsgfTtcblx0dmFyIFhvclJvciA9IGZ1bmN0aW9uKGJ5dGUxLCBieXRlMikgeyByZXR1cm4gUm9yKGJ5dGUxIF4gYnl0ZTIpOyB9O1xuXHR2YXIgQ3JlYXRlWG9yS2V5X01ldGhvZDEgPSBmdW5jdGlvbihQYXNzd29yZCkge1xuXHRcdHZhciBYb3JLZXkgPSBJbml0aWFsQ29kZVtQYXNzd29yZC5sZW5ndGggLSAxXTtcblx0XHR2YXIgQ3VycmVudEVsZW1lbnQgPSAweDY4O1xuXHRcdGZvcih2YXIgaSA9IFBhc3N3b3JkLmxlbmd0aC0xOyBpID49IDA7IC0taSkge1xuXHRcdFx0dmFyIENoYXIgPSBQYXNzd29yZFtpXTtcblx0XHRcdGZvcih2YXIgaiA9IDA7IGogIT0gNzsgKytqKSB7XG5cdFx0XHRcdGlmKENoYXIgJiAweDQwKSBYb3JLZXkgXj0gWG9yTWF0cml4W0N1cnJlbnRFbGVtZW50XTtcblx0XHRcdFx0Q2hhciAqPSAyOyAtLUN1cnJlbnRFbGVtZW50O1xuXHRcdFx0fVxuXHRcdH1cblx0XHRyZXR1cm4gWG9yS2V5O1xuXHR9O1xuXHRyZXR1cm4gZnVuY3Rpb24ocGFzc3dvcmQpIHtcblx0XHR2YXIgUGFzc3dvcmQgPSBfSlMyQU5TSShwYXNzd29yZCk7XG5cdFx0dmFyIFhvcktleSA9IENyZWF0ZVhvcktleV9NZXRob2QxKFBhc3N3b3JkKTtcblx0XHR2YXIgSW5kZXggPSBQYXNzd29yZC5sZW5ndGg7XG5cdFx0dmFyIE9iZnVzY2F0aW9uQXJyYXkgPSBuZXdfcmF3X2J1ZigxNik7XG5cdFx0Zm9yKHZhciBpID0gMDsgaSAhPSAxNjsgKytpKSBPYmZ1c2NhdGlvbkFycmF5W2ldID0gMHgwMDtcblx0XHR2YXIgVGVtcCwgUGFzc3dvcmRMYXN0Q2hhciwgUGFkSW5kZXg7XG5cdFx0aWYoKEluZGV4ICYgMSkgPT09IDEpIHtcblx0XHRcdFRlbXAgPSBYb3JLZXkgPj4gODtcblx0XHRcdE9iZnVzY2F0aW9uQXJyYXlbSW5kZXhdID0gWG9yUm9yKFBhZEFycmF5WzBdLCBUZW1wKTtcblx0XHRcdC0tSW5kZXg7XG5cdFx0XHRUZW1wID0gWG9yS2V5ICYgMHhGRjtcblx0XHRcdFBhc3N3b3JkTGFzdENoYXIgPSBQYXNzd29yZFtQYXNzd29yZC5sZW5ndGggLSAxXTtcblx0XHRcdE9iZnVzY2F0aW9uQXJyYXlbSW5kZXhdID0gWG9yUm9yKFBhc3N3b3JkTGFzdENoYXIsIFRlbXApO1xuXHRcdH1cblx0XHR3aGlsZShJbmRleCA+IDApIHtcblx0XHRcdC0tSW5kZXg7XG5cdFx0XHRUZW1wID0gWG9yS2V5ID4+IDg7XG5cdFx0XHRPYmZ1c2NhdGlvbkFycmF5W0luZGV4XSA9IFhvclJvcihQYXNzd29yZFtJbmRleF0sIFRlbXApO1xuXHRcdFx0LS1JbmRleDtcblx0XHRcdFRlbXAgPSBYb3JLZXkgJiAweEZGO1xuXHRcdFx0T2JmdXNjYXRpb25BcnJheVtJbmRleF0gPSBYb3JSb3IoUGFzc3dvcmRbSW5kZXhdLCBUZW1wKTtcblx0XHR9XG5cdFx0SW5kZXggPSAxNTtcblx0XHRQYWRJbmRleCA9IDE1IC0gUGFzc3dvcmQubGVuZ3RoO1xuXHRcdHdoaWxlKFBhZEluZGV4ID4gMCkge1xuXHRcdFx0VGVtcCA9IFhvcktleSA+PiA4O1xuXHRcdFx0T2JmdXNjYXRpb25BcnJheVtJbmRleF0gPSBYb3JSb3IoUGFkQXJyYXlbUGFkSW5kZXhdLCBUZW1wKTtcblx0XHRcdC0tSW5kZXg7XG5cdFx0XHQtLVBhZEluZGV4O1xuXHRcdFx0VGVtcCA9IFhvcktleSAmIDB4RkY7XG5cdFx0XHRPYmZ1c2NhdGlvbkFycmF5W0luZGV4XSA9IFhvclJvcihQYXNzd29yZFtJbmRleF0sIFRlbXApO1xuXHRcdFx0LS1JbmRleDtcblx0XHRcdC0tUGFkSW5kZXg7XG5cdFx0fVxuXHRcdHJldHVybiBPYmZ1c2NhdGlvbkFycmF5O1xuXHR9O1xufSkoKTtcblxuLyogW01TLU9GRkNSWVBUT10gMi4zLjcuMyBCaW5hcnkgRG9jdW1lbnQgWE9SIERhdGEgVHJhbnNmb3JtYXRpb24gTWV0aG9kIDEgKi9cbnZhciBjcnlwdG9fRGVjcnlwdERhdGFfTWV0aG9kMSA9IGZ1bmN0aW9uKHBhc3N3b3JkLCBEYXRhLCBYb3JBcnJheUluZGV4LCBYb3JBcnJheSwgTykge1xuXHQvKiBJZiBYb3JBcnJheSBpcyBzZXQsIHVzZSBpdDsgaWYgTyBpcyBub3Qgc2V0LCBtYWtlIGNoYW5nZXMgaW4tcGxhY2UgKi9cblx0aWYoIU8pIE8gPSBEYXRhO1xuXHRpZighWG9yQXJyYXkpIFhvckFycmF5ID0gY3J5cHRvX0NyZWF0ZVhvckFycmF5X01ldGhvZDEocGFzc3dvcmQpO1xuXHR2YXIgSW5kZXgsIFZhbHVlO1xuXHRmb3IoSW5kZXggPSAwOyBJbmRleCAhPSBEYXRhLmxlbmd0aDsgKytJbmRleCkge1xuXHRcdFZhbHVlID0gRGF0YVtJbmRleF07XG5cdFx0VmFsdWUgXj0gWG9yQXJyYXlbWG9yQXJyYXlJbmRleF07XG5cdFx0VmFsdWUgPSAoKFZhbHVlPj41KSB8IChWYWx1ZTw8MykpICYgMHhGRjtcblx0XHRPW0luZGV4XSA9IFZhbHVlO1xuXHRcdCsrWG9yQXJyYXlJbmRleDtcblx0fVxuXHRyZXR1cm4gW08sIFhvckFycmF5SW5kZXgsIFhvckFycmF5XTtcbn07XG5cbnZhciBjcnlwdG9fTWFrZVhvckRlY3J5cHRvciA9IGZ1bmN0aW9uKHBhc3N3b3JkKSB7XG5cdHZhciBYb3JBcnJheUluZGV4ID0gMCwgWG9yQXJyYXkgPSBjcnlwdG9fQ3JlYXRlWG9yQXJyYXlfTWV0aG9kMShwYXNzd29yZCk7XG5cdHJldHVybiBmdW5jdGlvbihEYXRhKSB7XG5cdFx0dmFyIE8gPSBjcnlwdG9fRGVjcnlwdERhdGFfTWV0aG9kMShcIlwiLCBEYXRhLCBYb3JBcnJheUluZGV4LCBYb3JBcnJheSk7XG5cdFx0WG9yQXJyYXlJbmRleCA9IE9bMV07XG5cdFx0cmV0dXJuIE9bMF07XG5cdH07XG59O1xuXG4vKiAyLjUuMzQzICovXG5mdW5jdGlvbiBwYXJzZV9YT1JPYmZ1c2NhdGlvbihibG9iLCBsZW5ndGgsIG9wdHMsIG91dCkge1xuXHR2YXIgbyA9ICh7IGtleTogcGFyc2V1aW50MTYoYmxvYiksIHZlcmlmaWNhdGlvbkJ5dGVzOiBwYXJzZXVpbnQxNihibG9iKSB9KTtcblx0aWYob3B0cy5wYXNzd29yZCkgby52ZXJpZmllciA9IGNyeXB0b19DcmVhdGVQYXNzd29yZFZlcmlmaWVyX01ldGhvZDEob3B0cy5wYXNzd29yZCk7XG5cdG91dC52YWxpZCA9IG8udmVyaWZpY2F0aW9uQnl0ZXMgPT09IG8udmVyaWZpZXI7XG5cdGlmKG91dC52YWxpZCkgb3V0Lmluc2l0dSA9IGNyeXB0b19NYWtlWG9yRGVjcnlwdG9yKG9wdHMucGFzc3dvcmQpO1xuXHRyZXR1cm4gbztcbn1cblxuLyogMi40LjExNyAqL1xuZnVuY3Rpb24gcGFyc2VfRmlsZVBhc3NIZWFkZXIoYmxvYiwgbGVuZ3RoLCBvbykge1xuXHR2YXIgbyA9IG9vIHx8IHt9OyBvLkluZm8gPSBibG9iLnJlYWRfc2hpZnQoMik7IGJsb2IubCAtPSAyO1xuXHRpZihvLkluZm8gPT09IDEpIG8uRGF0YSA9IHBhcnNlX1JDNEhlYWRlcihibG9iLCBsZW5ndGgpO1xuXHRlbHNlIG8uRGF0YSA9IHBhcnNlX1JDNENyeXB0b0hlYWRlcihibG9iLCBsZW5ndGgpO1xuXHRyZXR1cm4gbztcbn1cbmZ1bmN0aW9uIHBhcnNlX0ZpbGVQYXNzKGJsb2IsIGxlbmd0aCwgb3B0cykge1xuXHR2YXIgbyA9ICh7IFR5cGU6IG9wdHMuYmlmZiA+PSA4ID8gYmxvYi5yZWFkX3NoaWZ0KDIpIDogMCB9KTsgLyogd0VuY3J5cHRpb25UeXBlICovXG5cdGlmKG8uVHlwZSkgcGFyc2VfRmlsZVBhc3NIZWFkZXIoYmxvYiwgbGVuZ3RoLTIsIG8pO1xuXHRlbHNlIHBhcnNlX1hPUk9iZnVzY2F0aW9uKGJsb2IsIG9wdHMuYmlmZiA+PSA4ID8gbGVuZ3RoIDogbGVuZ3RoIC0gMiwgb3B0cywgbyk7XG5cdHJldHVybiBvO1xufVxuXG5cbnZhciBSVEYgPSAoZnVuY3Rpb24oKSB7XG5cdGZ1bmN0aW9uIHJ0Zl90b19zaGVldChkLCBvcHRzKSB7XG5cdFx0c3dpdGNoKG9wdHMudHlwZSkge1xuXHRcdFx0Y2FzZSAnYmFzZTY0JzogcmV0dXJuIHJ0Zl90b19zaGVldF9zdHIoQmFzZTY0LmRlY29kZShkKSwgb3B0cyk7XG5cdFx0XHRjYXNlICdiaW5hcnknOiByZXR1cm4gcnRmX3RvX3NoZWV0X3N0cihkLCBvcHRzKTtcblx0XHRcdGNhc2UgJ2J1ZmZlcic6IHJldHVybiBydGZfdG9fc2hlZXRfc3RyKGQudG9TdHJpbmcoJ2JpbmFyeScpLCBvcHRzKTtcblx0XHRcdGNhc2UgJ2FycmF5JzogIHJldHVybiBydGZfdG9fc2hlZXRfc3RyKGNjMnN0cihkKSwgb3B0cyk7XG5cdFx0fVxuXHRcdHRocm93IG5ldyBFcnJvcihcIlVucmVjb2duaXplZCB0eXBlIFwiICsgb3B0cy50eXBlKTtcblx0fVxuXG5cdGZ1bmN0aW9uIHJ0Zl90b19zaGVldF9zdHIoc3RyLCBvcHRzKSB7XG5cdFx0dmFyIG8gPSBvcHRzIHx8IHt9O1xuXHRcdHZhciB3cyA9IG8uZGVuc2UgPyAoW10pIDogKHt9KTtcblx0XHR2YXIgcmFuZ2UgPSAoe3M6IHtjOjAsIHI6MH0sIGU6IHtjOjAsIHI6MH19KTtcblxuXHRcdC8vIFRPRE86IHBhcnNlXG5cdFx0aWYoIXN0ci5tYXRjaCgvXFxcXHRyb3dkLykpIHRocm93IG5ldyBFcnJvcihcIlJURiBtaXNzaW5nIHRhYmxlXCIpO1xuXG5cdFx0d3NbJyFyZWYnXSA9IGVuY29kZV9yYW5nZShyYW5nZSk7XG5cdFx0cmV0dXJuIHdzO1xuXHR9XG5cblx0ZnVuY3Rpb24gcnRmX3RvX3dvcmtib29rKGQsIG9wdHMpIHsgcmV0dXJuIHNoZWV0X3RvX3dvcmtib29rKHJ0Zl90b19zaGVldChkLCBvcHRzKSwgb3B0cyk7IH1cblxuXHQvKiBUT0RPOiB0aGlzIGlzIGEgc3R1YiAqL1xuXHRmdW5jdGlvbiBzaGVldF90b19ydGYod3MpIHtcblx0XHR2YXIgbyA9IFtcIntcXFxccnRmMVxcXFxhbnNpXCJdO1xuXHRcdHZhciByID0gc2FmZV9kZWNvZGVfcmFuZ2Uod3NbJyFyZWYnXSksIGNlbGw7XG5cdFx0dmFyIGRlbnNlID0gQXJyYXkuaXNBcnJheSh3cyk7XG5cdFx0Zm9yKHZhciBSID0gci5zLnI7IFIgPD0gci5lLnI7ICsrUikge1xuXHRcdFx0by5wdXNoKFwiXFxcXHRyb3dkXFxcXHRyYXV0b2ZpdDFcIik7XG5cdFx0XHRmb3IodmFyIEMgPSByLnMuYzsgQyA8PSByLmUuYzsgKytDKSBvLnB1c2goXCJcXFxcY2VsbHhcIiArIChDKzEpKTtcblx0XHRcdG8ucHVzaChcIlxcXFxwYXJkXFxcXGludGJsXCIpO1xuXHRcdFx0Zm9yKEMgPSByLnMuYzsgQyA8PSByLmUuYzsgKytDKSB7XG5cdFx0XHRcdHZhciBjb29yZCA9IGVuY29kZV9jZWxsKHtyOlIsYzpDfSk7XG5cdFx0XHRcdGNlbGwgPSBkZW5zZSA/ICh3c1tSXXx8W10pW0NdOiB3c1tjb29yZF07XG5cdFx0XHRcdGlmKCFjZWxsIHx8IGNlbGwudiA9PSBudWxsICYmICghY2VsbC5mIHx8IGNlbGwuRikpIGNvbnRpbnVlO1xuXHRcdFx0XHRvLnB1c2goXCIgXCIgKyAoY2VsbC53IHx8IChmb3JtYXRfY2VsbChjZWxsKSwgY2VsbC53KSkpO1xuXHRcdFx0XHRvLnB1c2goXCJcXFxcY2VsbFwiKTtcblx0XHRcdH1cblx0XHRcdG8ucHVzaChcIlxcXFxwYXJkXFxcXGludGJsXFxcXHJvd1wiKTtcblx0XHR9XG5cdFx0cmV0dXJuIG8uam9pbihcIlwiKSArIFwifVwiO1xuXHR9XG5cblx0cmV0dXJuIHtcblx0XHR0b193b3JrYm9vazogcnRmX3RvX3dvcmtib29rLFxuXHRcdHRvX3NoZWV0OiBydGZfdG9fc2hlZXQsXG5cdFx0ZnJvbV9zaGVldDogc2hlZXRfdG9fcnRmXG5cdH07XG59KSgpO1xuZnVuY3Rpb24gaGV4MlJHQihoKSB7XG5cdHZhciBvID0gaC5zbGljZShoWzBdPT09XCIjXCI/MTowKS5zbGljZSgwLDYpO1xuXHRyZXR1cm4gW3BhcnNlSW50KG8uc2xpY2UoMCwyKSwxNikscGFyc2VJbnQoby5zbGljZSgyLDQpLDE2KSxwYXJzZUludChvLnNsaWNlKDQsNiksMTYpXTtcbn1cbmZ1bmN0aW9uIHJnYjJIZXgocmdiKSB7XG5cdGZvcih2YXIgaT0wLG89MTsgaSE9MzsgKytpKSBvID0gbyoyNTYgKyAocmdiW2ldPjI1NT8yNTU6cmdiW2ldPDA/MDpyZ2JbaV0pO1xuXHRyZXR1cm4gby50b1N0cmluZygxNikudG9VcHBlckNhc2UoKS5zbGljZSgxKTtcbn1cblxuZnVuY3Rpb24gcmdiMkhTTChyZ2IpIHtcblx0dmFyIFIgPSByZ2JbMF0vMjU1LCBHID0gcmdiWzFdLzI1NSwgQj1yZ2JbMl0vMjU1O1xuXHR2YXIgTSA9IE1hdGgubWF4KFIsIEcsIEIpLCBtID0gTWF0aC5taW4oUiwgRywgQiksIEMgPSBNIC0gbTtcblx0aWYoQyA9PT0gMCkgcmV0dXJuIFswLCAwLCBSXTtcblxuXHR2YXIgSDYgPSAwLCBTID0gMCwgTDIgPSAoTSArIG0pO1xuXHRTID0gQyAvIChMMiA+IDEgPyAyIC0gTDIgOiBMMik7XG5cdHN3aXRjaChNKXtcblx0XHRjYXNlIFI6IEg2ID0gKChHIC0gQikgLyBDICsgNiklNjsgYnJlYWs7XG5cdFx0Y2FzZSBHOiBINiA9ICgoQiAtIFIpIC8gQyArIDIpOyBicmVhaztcblx0XHRjYXNlIEI6IEg2ID0gKChSIC0gRykgLyBDICsgNCk7IGJyZWFrO1xuXHR9XG5cdHJldHVybiBbSDYgLyA2LCBTLCBMMiAvIDJdO1xufVxuXG5mdW5jdGlvbiBoc2wyUkdCKGhzbCl7XG5cdHZhciBIID0gaHNsWzBdLCBTID0gaHNsWzFdLCBMID0gaHNsWzJdO1xuXHR2YXIgQyA9IFMgKiAyICogKEwgPCAwLjUgPyBMIDogMSAtIEwpLCBtID0gTCAtIEMvMjtcblx0dmFyIHJnYiA9IFttLG0sbV0sIGg2ID0gNipIO1xuXG5cdHZhciBYO1xuXHRpZihTICE9PSAwKSBzd2l0Y2goaDZ8MCkge1xuXHRcdGNhc2UgMDogY2FzZSA2OiBYID0gQyAqIGg2OyByZ2JbMF0gKz0gQzsgcmdiWzFdICs9IFg7IGJyZWFrO1xuXHRcdGNhc2UgMTogWCA9IEMgKiAoMiAtIGg2KTsgICByZ2JbMF0gKz0gWDsgcmdiWzFdICs9IEM7IGJyZWFrO1xuXHRcdGNhc2UgMjogWCA9IEMgKiAoaDYgLSAyKTsgICByZ2JbMV0gKz0gQzsgcmdiWzJdICs9IFg7IGJyZWFrO1xuXHRcdGNhc2UgMzogWCA9IEMgKiAoNCAtIGg2KTsgICByZ2JbMV0gKz0gWDsgcmdiWzJdICs9IEM7IGJyZWFrO1xuXHRcdGNhc2UgNDogWCA9IEMgKiAoaDYgLSA0KTsgICByZ2JbMl0gKz0gQzsgcmdiWzBdICs9IFg7IGJyZWFrO1xuXHRcdGNhc2UgNTogWCA9IEMgKiAoNiAtIGg2KTsgICByZ2JbMl0gKz0gWDsgcmdiWzBdICs9IEM7IGJyZWFrO1xuXHR9XG5cdGZvcih2YXIgaSA9IDA7IGkgIT0gMzsgKytpKSByZ2JbaV0gPSBNYXRoLnJvdW5kKHJnYltpXSoyNTUpO1xuXHRyZXR1cm4gcmdiO1xufVxuXG4vKiAxOC44LjMgYmdDb2xvciB0aW50IGFsZ29yaXRobSAqL1xuZnVuY3Rpb24gcmdiX3RpbnQoaGV4LCB0aW50KSB7XG5cdGlmKHRpbnQgPT09IDApIHJldHVybiBoZXg7XG5cdHZhciBoc2wgPSByZ2IySFNMKGhleDJSR0IoaGV4KSk7XG5cdGlmICh0aW50IDwgMCkgaHNsWzJdID0gaHNsWzJdICogKDEgKyB0aW50KTtcblx0ZWxzZSBoc2xbMl0gPSAxIC0gKDEgLSBoc2xbMl0pICogKDEgLSB0aW50KTtcblx0cmV0dXJuIHJnYjJIZXgoaHNsMlJHQihoc2wpKTtcbn1cblxuLyogMTguMy4xLjEzIHdpZHRoIGNhbGN1bGF0aW9ucyAqL1xuLyogW01TLU9JMjk1MDBdIDIuMS41OTUgQ29sdW1uIFdpZHRoICYgRm9ybWF0dGluZyAqL1xudmFyIERFRl9NRFcgPSA2LCBNQVhfTURXID0gMTUsIE1JTl9NRFcgPSAxLCBNRFcgPSBERUZfTURXO1xuZnVuY3Rpb24gd2lkdGgycHgod2lkdGgpIHsgcmV0dXJuIE1hdGguZmxvb3IoKCB3aWR0aCArIChNYXRoLnJvdW5kKDEyOC9NRFcpKS8yNTYgKSogTURXICk7IH1cbmZ1bmN0aW9uIHB4MmNoYXIocHgpIHsgcmV0dXJuIChNYXRoLmZsb29yKChweCAtIDUpL01EVyAqIDEwMCArIDAuNSkpLzEwMDsgfVxuZnVuY3Rpb24gY2hhcjJ3aWR0aChjaHIpIHsgcmV0dXJuIChNYXRoLnJvdW5kKChjaHIgKiBNRFcgKyA1KS9NRFcqMjU2KSkvMjU2OyB9XG4vL2Z1bmN0aW9uIHB4MmNoYXJfKHB4KSB7IHJldHVybiAoKChweCAtIDUpL01EVyAqIDEwMCArIDAuNSkpLzEwMDsgfVxuLy9mdW5jdGlvbiBjaGFyMndpZHRoXyhjaHIpIHsgcmV0dXJuICgoKGNociAqIE1EVyArIDUpL01EVyoyNTYpKS8yNTY7IH1cbmZ1bmN0aW9uIGN5Y2xlX3dpZHRoKGNvbGx3KSB7IHJldHVybiBjaGFyMndpZHRoKHB4MmNoYXIod2lkdGgycHgoY29sbHcpKSk7IH1cbi8qIFhMU1gvWExTQi9YTFMgc3BlY2lmeSB3aWR0aCBpbiB1bml0cyBvZiBNRFcgKi9cbmZ1bmN0aW9uIGZpbmRfbWR3X2NvbHcoY29sbHcpIHtcblx0dmFyIGRlbHRhID0gTWF0aC5hYnMoY29sbHcgLSBjeWNsZV93aWR0aChjb2xsdykpLCBfTURXID0gTURXO1xuXHRpZihkZWx0YSA+IDAuMDA1KSBmb3IoTURXPU1JTl9NRFc7IE1EVzxNQVhfTURXOyArK01EVykgaWYoTWF0aC5hYnMoY29sbHcgLSBjeWNsZV93aWR0aChjb2xsdykpIDw9IGRlbHRhKSB7IGRlbHRhID0gTWF0aC5hYnMoY29sbHcgLSBjeWNsZV93aWR0aChjb2xsdykpOyBfTURXID0gTURXOyB9XG5cdE1EVyA9IF9NRFc7XG59XG4vKiBYTE1MIHNwZWNpZmllcyB3aWR0aCBpbiB0ZXJtcyBvZiBwaXhlbHMgKi9cbi8qZnVuY3Rpb24gZmluZF9tZHdfd3B4KHdweCkge1xuXHR2YXIgZGVsdGEgPSBJbmZpbml0eSwgZ3Vlc3MgPSAwLCBfTURXID0gTUlOX01EVztcblx0Zm9yKE1EVz1NSU5fTURXOyBNRFc8TUFYX01EVzsgKytNRFcpIHtcblx0XHRndWVzcyA9IGNoYXIyd2lkdGhfKHB4MmNoYXJfKHdweCkpKjI1Njtcblx0XHRndWVzcyA9IChndWVzcykgJSAxO1xuXHRcdGlmKGd1ZXNzID4gMC41KSBndWVzcy0tO1xuXHRcdGlmKE1hdGguYWJzKGd1ZXNzKSA8IGRlbHRhKSB7IGRlbHRhID0gTWF0aC5hYnMoZ3Vlc3MpOyBfTURXID0gTURXOyB9XG5cdH1cblx0TURXID0gX01EVztcbn0qL1xuXG5mdW5jdGlvbiBwcm9jZXNzX2NvbChjb2xsKSB7XG5cdGlmKGNvbGwud2lkdGgpIHtcblx0XHRjb2xsLndweCA9IHdpZHRoMnB4KGNvbGwud2lkdGgpO1xuXHRcdGNvbGwud2NoID0gcHgyY2hhcihjb2xsLndweCk7XG5cdFx0Y29sbC5NRFcgPSBNRFc7XG5cdH0gZWxzZSBpZihjb2xsLndweCkge1xuXHRcdGNvbGwud2NoID0gcHgyY2hhcihjb2xsLndweCk7XG5cdFx0Y29sbC53aWR0aCA9IGNoYXIyd2lkdGgoY29sbC53Y2gpO1xuXHRcdGNvbGwuTURXID0gTURXO1xuXHR9IGVsc2UgaWYodHlwZW9mIGNvbGwud2NoID09ICdudW1iZXInKSB7XG5cdFx0Y29sbC53aWR0aCA9IGNoYXIyd2lkdGgoY29sbC53Y2gpO1xuXHRcdGNvbGwud3B4ID0gd2lkdGgycHgoY29sbC53aWR0aCk7XG5cdFx0Y29sbC5NRFcgPSBNRFc7XG5cdH1cblx0aWYoY29sbC5jdXN0b21XaWR0aCkgZGVsZXRlIGNvbGwuY3VzdG9tV2lkdGg7XG59XG5cbnZhciBERUZfUFBJID0gOTYsIFBQSSA9IERFRl9QUEk7XG5mdW5jdGlvbiBweDJwdChweCkgeyByZXR1cm4gcHggKiA5NiAvIFBQSTsgfVxuZnVuY3Rpb24gcHQycHgocHQpIHsgcmV0dXJuIHB0ICogUFBJIC8gOTY7IH1cblxuLyogW01TLUVYU1BYTUwzXSAyLjQuNTQgU1RfZW5tUGF0dGVybiAqL1xudmFyIFhMTUxQYXR0ZXJuVHlwZU1hcCA9IHtcblx0XCJOb25lXCI6IFwibm9uZVwiLFxuXHRcIlNvbGlkXCI6IFwic29saWRcIixcblx0XCJHcmF5NTBcIjogXCJtZWRpdW1HcmF5XCIsXG5cdFwiR3JheTc1XCI6IFwiZGFya0dyYXlcIixcblx0XCJHcmF5MjVcIjogXCJsaWdodEdyYXlcIixcblx0XCJIb3J6U3RyaXBlXCI6IFwiZGFya0hvcml6b250YWxcIixcblx0XCJWZXJ0U3RyaXBlXCI6IFwiZGFya1ZlcnRpY2FsXCIsXG5cdFwiUmV2ZXJzZURpYWdTdHJpcGVcIjogXCJkYXJrRG93blwiLFxuXHRcIkRpYWdTdHJpcGVcIjogXCJkYXJrVXBcIixcblx0XCJEaWFnQ3Jvc3NcIjogXCJkYXJrR3JpZFwiLFxuXHRcIlRoaWNrRGlhZ0Nyb3NzXCI6IFwiZGFya1RyZWxsaXNcIixcblx0XCJUaGluSG9yelN0cmlwZVwiOiBcImxpZ2h0SG9yaXpvbnRhbFwiLFxuXHRcIlRoaW5WZXJ0U3RyaXBlXCI6IFwibGlnaHRWZXJ0aWNhbFwiLFxuXHRcIlRoaW5SZXZlcnNlRGlhZ1N0cmlwZVwiOiBcImxpZ2h0RG93blwiLFxuXHRcIlRoaW5Ib3J6Q3Jvc3NcIjogXCJsaWdodEdyaWRcIlxufTtcblxuLyogMTguOC41IGJvcmRlcnMgQ1RfQm9yZGVycyAqL1xuZnVuY3Rpb24gcGFyc2VfYm9yZGVycyh0LCBzdHlsZXMsIHRoZW1lcywgb3B0cykge1xuXHRzdHlsZXMuQm9yZGVycyA9IFtdO1xuXHR2YXIgYm9yZGVyID0ge307XG5cdHZhciBwYXNzID0gZmFsc2U7XG5cdCh0WzBdLm1hdGNoKHRhZ3JlZ2V4KXx8W10pLmZvckVhY2goZnVuY3Rpb24oeCkge1xuXHRcdHZhciB5ID0gcGFyc2V4bWx0YWcoeCk7XG5cdFx0c3dpdGNoKHN0cmlwX25zKHlbMF0pKSB7XG5cdFx0XHRjYXNlICc8Ym9yZGVycyc6IGNhc2UgJzxib3JkZXJzPic6IGNhc2UgJzwvYm9yZGVycz4nOiBicmVhaztcblxuXHRcdFx0LyogMTguOC40IGJvcmRlciBDVF9Cb3JkZXIgKi9cblx0XHRcdGNhc2UgJzxib3JkZXInOiBjYXNlICc8Ym9yZGVyPic6IGNhc2UgJzxib3JkZXIvPic6XG5cdFx0XHRcdGJvcmRlciA9IHt9O1xuXHRcdFx0XHRpZih5LmRpYWdvbmFsVXApIGJvcmRlci5kaWFnb25hbFVwID0gcGFyc2V4bWxib29sKHkuZGlhZ29uYWxVcCk7XG5cdFx0XHRcdGlmKHkuZGlhZ29uYWxEb3duKSBib3JkZXIuZGlhZ29uYWxEb3duID0gcGFyc2V4bWxib29sKHkuZGlhZ29uYWxEb3duKTtcblx0XHRcdFx0c3R5bGVzLkJvcmRlcnMucHVzaChib3JkZXIpO1xuXHRcdFx0XHRicmVhaztcblx0XHRcdGNhc2UgJzwvYm9yZGVyPic6IGJyZWFrO1xuXG5cdFx0XHQvKiBub3RlOiBub3QgaW4gc3BlYywgYXBwZWFycyB0byBiZSBDVF9Cb3JkZXJQciAqL1xuXHRcdFx0Y2FzZSAnPGxlZnQvPic6IGJyZWFrO1xuXHRcdFx0Y2FzZSAnPGxlZnQnOiBjYXNlICc8bGVmdD4nOiBicmVhaztcblx0XHRcdGNhc2UgJzwvbGVmdD4nOiBicmVhaztcblxuXHRcdFx0Lyogbm90ZTogbm90IGluIHNwZWMsIGFwcGVhcnMgdG8gYmUgQ1RfQm9yZGVyUHIgKi9cblx0XHRcdGNhc2UgJzxyaWdodC8+JzogYnJlYWs7XG5cdFx0XHRjYXNlICc8cmlnaHQnOiBjYXNlICc8cmlnaHQ+JzogYnJlYWs7XG5cdFx0XHRjYXNlICc8L3JpZ2h0Pic6IGJyZWFrO1xuXG5cdFx0XHQvKiAxOC44LjQzIHRvcCBDVF9Cb3JkZXJQciAqL1xuXHRcdFx0Y2FzZSAnPHRvcC8+JzogYnJlYWs7XG5cdFx0XHRjYXNlICc8dG9wJzogY2FzZSAnPHRvcD4nOiBicmVhaztcblx0XHRcdGNhc2UgJzwvdG9wPic6IGJyZWFrO1xuXG5cdFx0XHQvKiAxOC44LjYgYm90dG9tIENUX0JvcmRlclByICovXG5cdFx0XHRjYXNlICc8Ym90dG9tLz4nOiBicmVhaztcblx0XHRcdGNhc2UgJzxib3R0b20nOiBjYXNlICc8Ym90dG9tPic6IGJyZWFrO1xuXHRcdFx0Y2FzZSAnPC9ib3R0b20+JzogYnJlYWs7XG5cblx0XHRcdC8qIDE4LjguMTMgZGlhZ29uYWwgQ1RfQm9yZGVyUHIgKi9cblx0XHRcdGNhc2UgJzxkaWFnb25hbCc6IGNhc2UgJzxkaWFnb25hbD4nOiBjYXNlICc8ZGlhZ29uYWwvPic6IGJyZWFrO1xuXHRcdFx0Y2FzZSAnPC9kaWFnb25hbD4nOiBicmVhaztcblxuXHRcdFx0LyogMTguOC4yNSBob3Jpem9udGFsIENUX0JvcmRlclByICovXG5cdFx0XHRjYXNlICc8aG9yaXpvbnRhbCc6IGNhc2UgJzxob3Jpem9udGFsPic6IGNhc2UgJzxob3Jpem9udGFsLz4nOiBicmVhaztcblx0XHRcdGNhc2UgJzwvaG9yaXpvbnRhbD4nOiBicmVhaztcblxuXHRcdFx0LyogMTguOC40NCB2ZXJ0aWNhbCBDVF9Cb3JkZXJQciAqL1xuXHRcdFx0Y2FzZSAnPHZlcnRpY2FsJzogY2FzZSAnPHZlcnRpY2FsPic6IGNhc2UgJzx2ZXJ0aWNhbC8+JzogYnJlYWs7XG5cdFx0XHRjYXNlICc8L3ZlcnRpY2FsPic6IGJyZWFrO1xuXG5cdFx0XHQvKiAxOC44LjM3IHN0YXJ0IENUX0JvcmRlclByICovXG5cdFx0XHRjYXNlICc8c3RhcnQnOiBjYXNlICc8c3RhcnQ+JzogY2FzZSAnPHN0YXJ0Lz4nOiBicmVhaztcblx0XHRcdGNhc2UgJzwvc3RhcnQ+JzogYnJlYWs7XG5cblx0XHRcdC8qIDE4LjguMTYgZW5kIENUX0JvcmRlclByICovXG5cdFx0XHRjYXNlICc8ZW5kJzogY2FzZSAnPGVuZD4nOiBjYXNlICc8ZW5kLz4nOiBicmVhaztcblx0XHRcdGNhc2UgJzwvZW5kPic6IGJyZWFrO1xuXG5cdFx0XHQvKiAxOC44Lj8gY29sb3IgQ1RfQ29sb3IgKi9cblx0XHRcdGNhc2UgJzxjb2xvcic6IGNhc2UgJzxjb2xvcj4nOlxuXHRcdFx0XHRicmVhaztcblx0XHRcdGNhc2UgJzxjb2xvci8+JzogY2FzZSAnPC9jb2xvcj4nOiBicmVhaztcblxuXHRcdFx0LyogMTguMi4xMCBleHRMc3QgQ1RfRXh0ZW5zaW9uTGlzdCA/ICovXG5cdFx0XHRjYXNlICc8ZXh0THN0JzogY2FzZSAnPGV4dExzdD4nOiBjYXNlICc8L2V4dExzdD4nOiBicmVhaztcblx0XHRcdGNhc2UgJzxleHQnOiBwYXNzID0gdHJ1ZTsgYnJlYWs7XG5cdFx0XHRjYXNlICc8L2V4dD4nOiBwYXNzID0gZmFsc2U7IGJyZWFrO1xuXHRcdFx0ZGVmYXVsdDogaWYob3B0cyAmJiBvcHRzLldURikge1xuXHRcdFx0XHRpZighcGFzcykgdGhyb3cgbmV3IEVycm9yKCd1bnJlY29nbml6ZWQgJyArIHlbMF0gKyAnIGluIGJvcmRlcnMnKTtcblx0XHRcdH1cblx0XHR9XG5cdH0pO1xufVxuXG4vKiAxOC44LjIxIGZpbGxzIENUX0ZpbGxzICovXG5mdW5jdGlvbiBwYXJzZV9maWxscyh0LCBzdHlsZXMsIHRoZW1lcywgb3B0cykge1xuXHRzdHlsZXMuRmlsbHMgPSBbXTtcblx0dmFyIGZpbGwgPSB7fTtcblx0dmFyIHBhc3MgPSBmYWxzZTtcblx0KHRbMF0ubWF0Y2godGFncmVnZXgpfHxbXSkuZm9yRWFjaChmdW5jdGlvbih4KSB7XG5cdFx0dmFyIHkgPSBwYXJzZXhtbHRhZyh4KTtcblx0XHRzd2l0Y2goc3RyaXBfbnMoeVswXSkpIHtcblx0XHRcdGNhc2UgJzxmaWxscyc6IGNhc2UgJzxmaWxscz4nOiBjYXNlICc8L2ZpbGxzPic6IGJyZWFrO1xuXG5cdFx0XHQvKiAxOC44LjIwIGZpbGwgQ1RfRmlsbCAqL1xuXHRcdFx0Y2FzZSAnPGZpbGw+JzogY2FzZSAnPGZpbGwnOiBjYXNlICc8ZmlsbC8+Jzpcblx0XHRcdFx0ZmlsbCA9IHt9OyBzdHlsZXMuRmlsbHMucHVzaChmaWxsKTsgYnJlYWs7XG5cdFx0XHRjYXNlICc8L2ZpbGw+JzogYnJlYWs7XG5cblx0XHRcdC8qIDE4LjguMjQgZ3JhZGllbnRGaWxsIENUX0dyYWRpZW50RmlsbCAqL1xuXHRcdFx0Y2FzZSAnPGdyYWRpZW50RmlsbD4nOiBicmVhaztcblx0XHRcdGNhc2UgJzxncmFkaWVudEZpbGwnOlxuXHRcdFx0Y2FzZSAnPC9ncmFkaWVudEZpbGw+Jzogc3R5bGVzLkZpbGxzLnB1c2goZmlsbCk7IGZpbGwgPSB7fTsgYnJlYWs7XG5cblx0XHRcdC8qIDE4LjguMzIgcGF0dGVybkZpbGwgQ1RfUGF0dGVybkZpbGwgKi9cblx0XHRcdGNhc2UgJzxwYXR0ZXJuRmlsbCc6IGNhc2UgJzxwYXR0ZXJuRmlsbD4nOlxuXHRcdFx0XHRpZih5LnBhdHRlcm5UeXBlKSBmaWxsLnBhdHRlcm5UeXBlID0geS5wYXR0ZXJuVHlwZTtcblx0XHRcdFx0YnJlYWs7XG5cdFx0XHRjYXNlICc8cGF0dGVybkZpbGwvPic6IGNhc2UgJzwvcGF0dGVybkZpbGw+JzogYnJlYWs7XG5cblx0XHRcdC8qIDE4LjguMyBiZ0NvbG9yIENUX0NvbG9yICovXG5cdFx0XHRjYXNlICc8YmdDb2xvcic6XG5cdFx0XHRcdGlmKCFmaWxsLmJnQ29sb3IpIGZpbGwuYmdDb2xvciA9IHt9O1xuXHRcdFx0XHRpZih5LmluZGV4ZWQpIGZpbGwuYmdDb2xvci5pbmRleGVkID0gcGFyc2VJbnQoeS5pbmRleGVkLCAxMCk7XG5cdFx0XHRcdGlmKHkudGhlbWUpIGZpbGwuYmdDb2xvci50aGVtZSA9IHBhcnNlSW50KHkudGhlbWUsIDEwKTtcblx0XHRcdFx0aWYoeS50aW50KSBmaWxsLmJnQ29sb3IudGludCA9IHBhcnNlRmxvYXQoeS50aW50KTtcblx0XHRcdFx0LyogRXhjZWwgdXNlcyBBUkdCIHN0cmluZ3MgKi9cblx0XHRcdFx0aWYoeS5yZ2IpIGZpbGwuYmdDb2xvci5yZ2IgPSB5LnJnYi5zbGljZSgtNik7XG5cdFx0XHRcdGJyZWFrO1xuXHRcdFx0Y2FzZSAnPGJnQ29sb3IvPic6IGNhc2UgJzwvYmdDb2xvcj4nOiBicmVhaztcblxuXHRcdFx0LyogMTguOC4xOSBmZ0NvbG9yIENUX0NvbG9yICovXG5cdFx0XHRjYXNlICc8ZmdDb2xvcic6XG5cdFx0XHRcdGlmKCFmaWxsLmZnQ29sb3IpIGZpbGwuZmdDb2xvciA9IHt9O1xuXHRcdFx0XHRpZih5LnRoZW1lKSBmaWxsLmZnQ29sb3IudGhlbWUgPSBwYXJzZUludCh5LnRoZW1lLCAxMCk7XG5cdFx0XHRcdGlmKHkudGludCkgZmlsbC5mZ0NvbG9yLnRpbnQgPSBwYXJzZUZsb2F0KHkudGludCk7XG5cdFx0XHRcdC8qIEV4Y2VsIHVzZXMgQVJHQiBzdHJpbmdzICovXG5cdFx0XHRcdGlmKHkucmdiICE9IG51bGwpIGZpbGwuZmdDb2xvci5yZ2IgPSB5LnJnYi5zbGljZSgtNik7XG5cdFx0XHRcdGJyZWFrO1xuXHRcdFx0Y2FzZSAnPGZnQ29sb3IvPic6IGNhc2UgJzwvZmdDb2xvcj4nOiBicmVhaztcblxuXHRcdFx0LyogMTguOC4zOCBzdG9wIENUX0dyYWRpZW50U3RvcCAqL1xuXHRcdFx0Y2FzZSAnPHN0b3AnOiBjYXNlICc8c3RvcC8+JzogYnJlYWs7XG5cdFx0XHRjYXNlICc8L3N0b3A+JzogYnJlYWs7XG5cblx0XHRcdC8qIDE4LjguPyBjb2xvciBDVF9Db2xvciAqL1xuXHRcdFx0Y2FzZSAnPGNvbG9yJzogY2FzZSAnPGNvbG9yLz4nOiBicmVhaztcblx0XHRcdGNhc2UgJzwvY29sb3I+JzogYnJlYWs7XG5cblx0XHRcdC8qIDE4LjIuMTAgZXh0THN0IENUX0V4dGVuc2lvbkxpc3QgPyAqL1xuXHRcdFx0Y2FzZSAnPGV4dExzdCc6IGNhc2UgJzxleHRMc3Q+JzogY2FzZSAnPC9leHRMc3Q+JzogYnJlYWs7XG5cdFx0XHRjYXNlICc8ZXh0JzogcGFzcyA9IHRydWU7IGJyZWFrO1xuXHRcdFx0Y2FzZSAnPC9leHQ+JzogcGFzcyA9IGZhbHNlOyBicmVhaztcblx0XHRcdGRlZmF1bHQ6IGlmKG9wdHMgJiYgb3B0cy5XVEYpIHtcblx0XHRcdFx0aWYoIXBhc3MpIHRocm93IG5ldyBFcnJvcigndW5yZWNvZ25pemVkICcgKyB5WzBdICsgJyBpbiBmaWxscycpO1xuXHRcdFx0fVxuXHRcdH1cblx0fSk7XG59XG5cbi8qIDE4LjguMjMgZm9udHMgQ1RfRm9udHMgKi9cbmZ1bmN0aW9uIHBhcnNlX2ZvbnRzKHQsIHN0eWxlcywgdGhlbWVzLCBvcHRzKSB7XG5cdHN0eWxlcy5Gb250cyA9IFtdO1xuXHR2YXIgZm9udCA9IHt9O1xuXHR2YXIgcGFzcyA9IGZhbHNlO1xuXHQodFswXS5tYXRjaCh0YWdyZWdleCl8fFtdKS5mb3JFYWNoKGZ1bmN0aW9uKHgpIHtcblx0XHR2YXIgeSA9IHBhcnNleG1sdGFnKHgpO1xuXHRcdHN3aXRjaChzdHJpcF9ucyh5WzBdKSkge1xuXHRcdFx0Y2FzZSAnPGZvbnRzJzogY2FzZSAnPGZvbnRzPic6IGNhc2UgJzwvZm9udHM+JzogYnJlYWs7XG5cblx0XHRcdC8qIDE4LjguMjIgZm9udCBDVF9Gb250ICovXG5cdFx0XHRjYXNlICc8Zm9udCc6IGNhc2UgJzxmb250Pic6IGJyZWFrO1xuXHRcdFx0Y2FzZSAnPC9mb250Pic6IGNhc2UgJzxmb250Lz4nOlxuXHRcdFx0XHRzdHlsZXMuRm9udHMucHVzaChmb250KTtcblx0XHRcdFx0Zm9udCA9IHt9O1xuXHRcdFx0XHRicmVhaztcblxuXHRcdFx0LyogMTguOC4yOSBuYW1lIENUX0ZvbnROYW1lICovXG5cdFx0XHRjYXNlICc8bmFtZSc6IGlmKHkudmFsKSBmb250Lm5hbWUgPSB1dGY4cmVhZCh5LnZhbCk7IGJyZWFrO1xuXHRcdFx0Y2FzZSAnPG5hbWUvPic6IGNhc2UgJzwvbmFtZT4nOiBicmVhaztcblxuXHRcdFx0LyogMTguOC4yICBiIENUX0Jvb2xlYW5Qcm9wZXJ0eSAqL1xuXHRcdFx0Y2FzZSAnPGInOiBmb250LmJvbGQgPSB5LnZhbCA/IHBhcnNleG1sYm9vbCh5LnZhbCkgOiAxOyBicmVhaztcblx0XHRcdGNhc2UgJzxiLz4nOiBmb250LmJvbGQgPSAxOyBicmVhaztcblxuXHRcdFx0LyogMTguOC4yNiBpIENUX0Jvb2xlYW5Qcm9wZXJ0eSAqL1xuXHRcdFx0Y2FzZSAnPGknOiBmb250Lml0YWxpYyA9IHkudmFsID8gcGFyc2V4bWxib29sKHkudmFsKSA6IDE7IGJyZWFrO1xuXHRcdFx0Y2FzZSAnPGkvPic6IGZvbnQuaXRhbGljID0gMTsgYnJlYWs7XG5cblx0XHRcdC8qIDE4LjQuMTMgdSBDVF9VbmRlcmxpbmVQcm9wZXJ0eSAqL1xuXHRcdFx0Y2FzZSAnPHUnOlxuXHRcdFx0XHRzd2l0Y2goeS52YWwpIHtcblx0XHRcdFx0XHRjYXNlIFwibm9uZVwiOiBmb250LnVuZGVybGluZSA9IDB4MDA7IGJyZWFrO1xuXHRcdFx0XHRcdGNhc2UgXCJzaW5nbGVcIjogZm9udC51bmRlcmxpbmUgPSAweDAxOyBicmVhaztcblx0XHRcdFx0XHRjYXNlIFwiZG91YmxlXCI6IGZvbnQudW5kZXJsaW5lID0gMHgwMjsgYnJlYWs7XG5cdFx0XHRcdFx0Y2FzZSBcInNpbmdsZUFjY291bnRpbmdcIjogZm9udC51bmRlcmxpbmUgPSAweDIxOyBicmVhaztcblx0XHRcdFx0XHRjYXNlIFwiZG91YmxlQWNjb3VudGluZ1wiOiBmb250LnVuZGVybGluZSA9IDB4MjI7IGJyZWFrO1xuXHRcdFx0XHR9IGJyZWFrO1xuXHRcdFx0Y2FzZSAnPHUvPic6IGZvbnQudW5kZXJsaW5lID0gMTsgYnJlYWs7XG5cblx0XHRcdC8qIDE4LjQuMTAgc3RyaWtlIENUX0Jvb2xlYW5Qcm9wZXJ0eSAqL1xuXHRcdFx0Y2FzZSAnPHN0cmlrZSc6IGZvbnQuc3RyaWtlID0geS52YWwgPyBwYXJzZXhtbGJvb2woeS52YWwpIDogMTsgYnJlYWs7XG5cdFx0XHRjYXNlICc8c3RyaWtlLz4nOiBmb250LnN0cmlrZSA9IDE7IGJyZWFrO1xuXG5cdFx0XHQvKiAxOC40LjIgIG91dGxpbmUgQ1RfQm9vbGVhblByb3BlcnR5ICovXG5cdFx0XHRjYXNlICc8b3V0bGluZSc6IGZvbnQub3V0bGluZSA9IHkudmFsID8gcGFyc2V4bWxib29sKHkudmFsKSA6IDE7IGJyZWFrO1xuXHRcdFx0Y2FzZSAnPG91dGxpbmUvPic6IGZvbnQub3V0bGluZSA9IDE7IGJyZWFrO1xuXG5cdFx0XHQvKiAxOC44LjM2IHNoYWRvdyBDVF9Cb29sZWFuUHJvcGVydHkgKi9cblx0XHRcdGNhc2UgJzxzaGFkb3cnOiBmb250LnNoYWRvdyA9IHkudmFsID8gcGFyc2V4bWxib29sKHkudmFsKSA6IDE7IGJyZWFrO1xuXHRcdFx0Y2FzZSAnPHNoYWRvdy8+JzogZm9udC5zaGFkb3cgPSAxOyBicmVhaztcblxuXHRcdFx0LyogMTguOC4xMiBjb25kZW5zZSBDVF9Cb29sZWFuUHJvcGVydHkgKi9cblx0XHRcdGNhc2UgJzxjb25kZW5zZSc6IGZvbnQuY29uZGVuc2UgPSB5LnZhbCA/IHBhcnNleG1sYm9vbCh5LnZhbCkgOiAxOyBicmVhaztcblx0XHRcdGNhc2UgJzxjb25kZW5zZS8+JzogZm9udC5jb25kZW5zZSA9IDE7IGJyZWFrO1xuXG5cdFx0XHQvKiAxOC44LjE3IGV4dGVuZCBDVF9Cb29sZWFuUHJvcGVydHkgKi9cblx0XHRcdGNhc2UgJzxleHRlbmQnOiBmb250LmV4dGVuZCA9IHkudmFsID8gcGFyc2V4bWxib29sKHkudmFsKSA6IDE7IGJyZWFrO1xuXHRcdFx0Y2FzZSAnPGV4dGVuZC8+JzogZm9udC5leHRlbmQgPSAxOyBicmVhaztcblxuXHRcdFx0LyogMTguNC4xMSBzeiBDVF9Gb250U2l6ZSAqL1xuXHRcdFx0Y2FzZSAnPHN6JzogaWYoeS52YWwpIGZvbnQuc3ogPSAreS52YWw7IGJyZWFrO1xuXHRcdFx0Y2FzZSAnPHN6Lz4nOiBjYXNlICc8L3N6Pic6IGJyZWFrO1xuXG5cdFx0XHQvKiAxOC40LjE0IHZlcnRBbGlnbiBDVF9WZXJ0aWNhbEFsaWduRm9udFByb3BlcnR5ICovXG5cdFx0XHRjYXNlICc8dmVydEFsaWduJzogaWYoeS52YWwpIGZvbnQudmVydEFsaWduID0geS52YWw7IGJyZWFrO1xuXHRcdFx0Y2FzZSAnPHZlcnRBbGlnbi8+JzogY2FzZSAnPC92ZXJ0QWxpZ24+JzogYnJlYWs7XG5cblx0XHRcdC8qIDE4LjguMTggZmFtaWx5IENUX0ZvbnRGYW1pbHkgKi9cblx0XHRcdGNhc2UgJzxmYW1pbHknOiBpZih5LnZhbCkgZm9udC5mYW1pbHkgPSBwYXJzZUludCh5LnZhbCwxMCk7IGJyZWFrO1xuXHRcdFx0Y2FzZSAnPGZhbWlseS8+JzogY2FzZSAnPC9mYW1pbHk+JzogYnJlYWs7XG5cblx0XHRcdC8qIDE4LjguMzUgc2NoZW1lIENUX0ZvbnRTY2hlbWUgKi9cblx0XHRcdGNhc2UgJzxzY2hlbWUnOiBpZih5LnZhbCkgZm9udC5zY2hlbWUgPSB5LnZhbDsgYnJlYWs7XG5cdFx0XHRjYXNlICc8c2NoZW1lLz4nOiBjYXNlICc8L3NjaGVtZT4nOiBicmVhaztcblxuXHRcdFx0LyogMTguNC4xIGNoYXJzZXQgQ1RfSW50UHJvcGVydHkgKi9cblx0XHRcdGNhc2UgJzxjaGFyc2V0Jzpcblx0XHRcdFx0aWYoeS52YWwgPT0gJzEnKSBicmVhaztcblx0XHRcdFx0eS5jb2RlcGFnZSA9IENTMkNQW3BhcnNlSW50KHkudmFsLCAxMCldO1xuXHRcdFx0XHRicmVhaztcblxuXHRcdFx0LyogMTguPy4/IGNvbG9yIENUX0NvbG9yICovXG5cdFx0XHRjYXNlICc8Y29sb3InOlxuXHRcdFx0XHRpZighZm9udC5jb2xvcikgZm9udC5jb2xvciA9IHt9O1xuXHRcdFx0XHRpZih5LmF1dG8pIGZvbnQuY29sb3IuYXV0byA9IHBhcnNleG1sYm9vbCh5LmF1dG8pO1xuXG5cdFx0XHRcdGlmKHkucmdiKSBmb250LmNvbG9yLnJnYiA9IHkucmdiLnNsaWNlKC02KTtcblx0XHRcdFx0ZWxzZSBpZih5LmluZGV4ZWQpIHtcblx0XHRcdFx0XHRmb250LmNvbG9yLmluZGV4ID0gcGFyc2VJbnQoeS5pbmRleGVkLCAxMCk7XG5cdFx0XHRcdFx0dmFyIGljdiA9IFhMU0ljdltmb250LmNvbG9yLmluZGV4XTtcblx0XHRcdFx0XHRpZihmb250LmNvbG9yLmluZGV4ID09IDgxKSBpY3YgPSBYTFNJY3ZbMV07XG5cdFx0XHRcdFx0aWYoIWljdikgdGhyb3cgbmV3IEVycm9yKHgpO1xuXHRcdFx0XHRcdGZvbnQuY29sb3IucmdiID0gaWN2WzBdLnRvU3RyaW5nKDE2KSArIGljdlsxXS50b1N0cmluZygxNikgKyBpY3ZbMl0udG9TdHJpbmcoMTYpO1xuXHRcdFx0XHR9IGVsc2UgaWYoeS50aGVtZSkge1xuXHRcdFx0XHRcdGZvbnQuY29sb3IudGhlbWUgPSBwYXJzZUludCh5LnRoZW1lLCAxMCk7XG5cdFx0XHRcdFx0aWYoeS50aW50KSBmb250LmNvbG9yLnRpbnQgPSBwYXJzZUZsb2F0KHkudGludCk7XG5cdFx0XHRcdFx0aWYoeS50aGVtZSAmJiB0aGVtZXMudGhlbWVFbGVtZW50cyAmJiB0aGVtZXMudGhlbWVFbGVtZW50cy5jbHJTY2hlbWUpIHtcblx0XHRcdFx0XHRcdGZvbnQuY29sb3IucmdiID0gcmdiX3RpbnQodGhlbWVzLnRoZW1lRWxlbWVudHMuY2xyU2NoZW1lW2ZvbnQuY29sb3IudGhlbWVdLnJnYiwgZm9udC5jb2xvci50aW50IHx8IDApO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXG5cdFx0XHRcdGJyZWFrO1xuXHRcdFx0Y2FzZSAnPGNvbG9yLz4nOiBjYXNlICc8L2NvbG9yPic6IGJyZWFrO1xuXG5cdFx0XHQvKiBub3RlOiBzb21ldGltZXMgbWM6QWx0ZXJuYXRlQ29udGVudCBhcHBlYXJzIGJhcmUgKi9cblx0XHRcdGNhc2UgJzxBbHRlcm5hdGVDb250ZW50JzogcGFzcyA9IHRydWU7IGJyZWFrO1xuXHRcdFx0Y2FzZSAnPC9BbHRlcm5hdGVDb250ZW50Pic6IHBhc3MgPSBmYWxzZTsgYnJlYWs7XG5cblx0XHRcdC8qIDE4LjIuMTAgZXh0THN0IENUX0V4dGVuc2lvbkxpc3QgPyAqL1xuXHRcdFx0Y2FzZSAnPGV4dExzdCc6IGNhc2UgJzxleHRMc3Q+JzogY2FzZSAnPC9leHRMc3Q+JzogYnJlYWs7XG5cdFx0XHRjYXNlICc8ZXh0JzogcGFzcyA9IHRydWU7IGJyZWFrO1xuXHRcdFx0Y2FzZSAnPC9leHQ+JzogcGFzcyA9IGZhbHNlOyBicmVhaztcblx0XHRcdGRlZmF1bHQ6IGlmKG9wdHMgJiYgb3B0cy5XVEYpIHtcblx0XHRcdFx0aWYoIXBhc3MpIHRocm93IG5ldyBFcnJvcigndW5yZWNvZ25pemVkICcgKyB5WzBdICsgJyBpbiBmb250cycpO1xuXHRcdFx0fVxuXHRcdH1cblx0fSk7XG59XG5cbi8qIDE4LjguMzEgbnVtRm10cyBDVF9OdW1GbXRzICovXG5mdW5jdGlvbiBwYXJzZV9udW1GbXRzKHQsIHN0eWxlcywgb3B0cykge1xuXHRzdHlsZXMuTnVtYmVyRm10ID0gW107XG5cdHZhciBrLypBcnJheTxudW1iZXI+Ki8gPSAoa2V5cyhTU0YuX3RhYmxlKSk7XG5cdGZvcih2YXIgaT0wOyBpIDwgay5sZW5ndGg7ICsraSkgc3R5bGVzLk51bWJlckZtdFtrW2ldXSA9IFNTRi5fdGFibGVba1tpXV07XG5cdHZhciBtID0gdFswXS5tYXRjaCh0YWdyZWdleCk7XG5cdGlmKCFtKSByZXR1cm47XG5cdGZvcihpPTA7IGkgPCBtLmxlbmd0aDsgKytpKSB7XG5cdFx0dmFyIHkgPSBwYXJzZXhtbHRhZyhtW2ldKTtcblx0XHRzd2l0Y2goc3RyaXBfbnMoeVswXSkpIHtcblx0XHRcdGNhc2UgJzxudW1GbXRzJzogY2FzZSAnPC9udW1GbXRzPic6IGNhc2UgJzxudW1GbXRzLz4nOiBjYXNlICc8bnVtRm10cz4nOiBicmVhaztcblx0XHRcdGNhc2UgJzxudW1GbXQnOiB7XG5cdFx0XHRcdHZhciBmPXVuZXNjYXBleG1sKHV0ZjhyZWFkKHkuZm9ybWF0Q29kZSkpLCBqPXBhcnNlSW50KHkubnVtRm10SWQsMTApO1xuXHRcdFx0XHRzdHlsZXMuTnVtYmVyRm10W2pdID0gZjtcblx0XHRcdFx0aWYoaj4wKSB7XG5cdFx0XHRcdFx0aWYoaiA+IDB4MTg4KSB7XG5cdFx0XHRcdFx0XHRmb3IoaiA9IDB4MTg4OyBqID4gMHgzYzsgLS1qKSBpZihzdHlsZXMuTnVtYmVyRm10W2pdID09IG51bGwpIGJyZWFrO1xuXHRcdFx0XHRcdFx0c3R5bGVzLk51bWJlckZtdFtqXSA9IGY7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFNTRi5sb2FkKGYsaik7XG5cdFx0XHRcdH1cblx0XHRcdH0gYnJlYWs7XG5cdFx0XHRjYXNlICc8L251bUZtdD4nOiBicmVhaztcblx0XHRcdGRlZmF1bHQ6IGlmKG9wdHMuV1RGKSB0aHJvdyBuZXcgRXJyb3IoJ3VucmVjb2duaXplZCAnICsgeVswXSArICcgaW4gbnVtRm10cycpO1xuXHRcdH1cblx0fVxufVxuXG5mdW5jdGlvbiB3cml0ZV9udW1GbXRzKE5GKSB7XG5cdHZhciBvID0gW1wiPG51bUZtdHM+XCJdO1xuXHRbWzUsOF0sWzIzLDI2XSxbNDEsNDRdLFsvKjYzKi81MCwvKjY2XSxbMTY0LCovMzkyXV0uZm9yRWFjaChmdW5jdGlvbihyKSB7XG5cdFx0Zm9yKHZhciBpID0gclswXTsgaSA8PSByWzFdOyArK2kpIGlmKE5GW2ldICE9IG51bGwpIG9bby5sZW5ndGhdID0gKHdyaXRleHRhZygnbnVtRm10JyxudWxsLHtudW1GbXRJZDppLGZvcm1hdENvZGU6ZXNjYXBleG1sKE5GW2ldKX0pKTtcblx0fSk7XG5cdGlmKG8ubGVuZ3RoID09PSAxKSByZXR1cm4gXCJcIjtcblx0b1tvLmxlbmd0aF0gPSAoXCI8L251bUZtdHM+XCIpO1xuXHRvWzBdID0gd3JpdGV4dGFnKCdudW1GbXRzJywgbnVsbCwgeyBjb3VudDpvLmxlbmd0aC0yIH0pLnJlcGxhY2UoXCIvPlwiLCBcIj5cIik7XG5cdHJldHVybiBvLmpvaW4oXCJcIik7XG59XG5cbi8qIDE4LjguMTAgY2VsbFhmcyBDVF9DZWxsWGZzICovXG52YXIgY2VsbFhGX3VpbnQgPSBbIFwibnVtRm10SWRcIiwgXCJmaWxsSWRcIiwgXCJmb250SWRcIiwgXCJib3JkZXJJZFwiLCBcInhmSWRcIiBdO1xudmFyIGNlbGxYRl9ib29sID0gWyBcImFwcGx5QWxpZ25tZW50XCIsIFwiYXBwbHlCb3JkZXJcIiwgXCJhcHBseUZpbGxcIiwgXCJhcHBseUZvbnRcIiwgXCJhcHBseU51bWJlckZvcm1hdFwiLCBcImFwcGx5UHJvdGVjdGlvblwiLCBcInBpdm90QnV0dG9uXCIsIFwicXVvdGVQcmVmaXhcIiBdO1xuZnVuY3Rpb24gcGFyc2VfY2VsbFhmcyh0LCBzdHlsZXMsIG9wdHMpIHtcblx0c3R5bGVzLkNlbGxYZiA9IFtdO1xuXHR2YXIgeGY7XG5cdHZhciBwYXNzID0gZmFsc2U7XG5cdCh0WzBdLm1hdGNoKHRhZ3JlZ2V4KXx8W10pLmZvckVhY2goZnVuY3Rpb24oeCkge1xuXHRcdHZhciB5ID0gcGFyc2V4bWx0YWcoeCksIGkgPSAwO1xuXHRcdHN3aXRjaChzdHJpcF9ucyh5WzBdKSkge1xuXHRcdFx0Y2FzZSAnPGNlbGxYZnMnOiBjYXNlICc8Y2VsbFhmcz4nOiBjYXNlICc8Y2VsbFhmcy8+JzogY2FzZSAnPC9jZWxsWGZzPic6IGJyZWFrO1xuXG5cdFx0XHQvKiAxOC44LjQ1IHhmIENUX1hmICovXG5cdFx0XHRjYXNlICc8eGYnOiBjYXNlICc8eGYvPic6XG5cdFx0XHRcdHhmID0geTtcblx0XHRcdFx0ZGVsZXRlIHhmWzBdO1xuXHRcdFx0XHRmb3IoaSA9IDA7IGkgPCBjZWxsWEZfdWludC5sZW5ndGg7ICsraSkgaWYoeGZbY2VsbFhGX3VpbnRbaV1dKVxuXHRcdFx0XHRcdHhmW2NlbGxYRl91aW50W2ldXSA9IHBhcnNlSW50KHhmW2NlbGxYRl91aW50W2ldXSwgMTApO1xuXHRcdFx0XHRmb3IoaSA9IDA7IGkgPCBjZWxsWEZfYm9vbC5sZW5ndGg7ICsraSkgaWYoeGZbY2VsbFhGX2Jvb2xbaV1dKVxuXHRcdFx0XHRcdHhmW2NlbGxYRl9ib29sW2ldXSA9IHBhcnNleG1sYm9vbCh4ZltjZWxsWEZfYm9vbFtpXV0pO1xuXHRcdFx0XHRpZih4Zi5udW1GbXRJZCA+IDB4MTg4KSB7XG5cdFx0XHRcdFx0Zm9yKGkgPSAweDE4ODsgaSA+IDB4M2M7IC0taSkgaWYoc3R5bGVzLk51bWJlckZtdFt4Zi5udW1GbXRJZF0gPT0gc3R5bGVzLk51bWJlckZtdFtpXSkgeyB4Zi5udW1GbXRJZCA9IGk7IGJyZWFrOyB9XG5cdFx0XHRcdH1cblx0XHRcdFx0c3R5bGVzLkNlbGxYZi5wdXNoKHhmKTsgYnJlYWs7XG5cdFx0XHRjYXNlICc8L3hmPic6IGJyZWFrO1xuXG5cdFx0XHQvKiAxOC44LjEgYWxpZ25tZW50IENUX0NlbGxBbGlnbm1lbnQgKi9cblx0XHRcdGNhc2UgJzxhbGlnbm1lbnQnOiBjYXNlICc8YWxpZ25tZW50Lz4nOlxuXHRcdFx0XHR2YXIgYWxpZ25tZW50ID0ge307XG5cdFx0XHRcdGlmKHkudmVydGljYWwpIGFsaWdubWVudC52ZXJ0aWNhbCA9IHkudmVydGljYWw7XG5cdFx0XHRcdGlmKHkuaG9yaXpvbnRhbCkgYWxpZ25tZW50Lmhvcml6b250YWwgPSB5Lmhvcml6b250YWw7XG5cdFx0XHRcdGlmKHkudGV4dFJvdGF0aW9uICE9IG51bGwpIGFsaWdubWVudC50ZXh0Um90YXRpb24gPSB5LnRleHRSb3RhdGlvbjtcblx0XHRcdFx0aWYoeS5pbmRlbnQpIGFsaWdubWVudC5pbmRlbnQgPSB5LmluZGVudDtcblx0XHRcdFx0aWYoeS53cmFwVGV4dCkgYWxpZ25tZW50LndyYXBUZXh0ID0gcGFyc2V4bWxib29sKHkud3JhcFRleHQpO1xuXHRcdFx0XHR4Zi5hbGlnbm1lbnQgPSBhbGlnbm1lbnQ7XG5cdFx0XHRcdGJyZWFrO1xuXHRcdFx0Y2FzZSAnPC9hbGlnbm1lbnQ+JzogYnJlYWs7XG5cblx0XHRcdC8qIDE4LjguMzMgcHJvdGVjdGlvbiBDVF9DZWxsUHJvdGVjdGlvbiAqL1xuXHRcdFx0Y2FzZSAnPHByb3RlY3Rpb24nOlxuXHRcdFx0XHRicmVhaztcblx0XHRcdGNhc2UgJzwvcHJvdGVjdGlvbj4nOiBjYXNlICc8cHJvdGVjdGlvbi8+JzogYnJlYWs7XG5cblx0XHRcdC8qIG5vdGU6IHNvbWV0aW1lcyBtYzpBbHRlcm5hdGVDb250ZW50IGFwcGVhcnMgYmFyZSAqL1xuXHRcdFx0Y2FzZSAnPEFsdGVybmF0ZUNvbnRlbnQnOiBwYXNzID0gdHJ1ZTsgYnJlYWs7XG5cdFx0XHRjYXNlICc8L0FsdGVybmF0ZUNvbnRlbnQ+JzogcGFzcyA9IGZhbHNlOyBicmVhaztcblxuXHRcdFx0LyogMTguMi4xMCBleHRMc3QgQ1RfRXh0ZW5zaW9uTGlzdCA/ICovXG5cdFx0XHRjYXNlICc8ZXh0THN0JzogY2FzZSAnPGV4dExzdD4nOiBjYXNlICc8L2V4dExzdD4nOiBicmVhaztcblx0XHRcdGNhc2UgJzxleHQnOiBwYXNzID0gdHJ1ZTsgYnJlYWs7XG5cdFx0XHRjYXNlICc8L2V4dD4nOiBwYXNzID0gZmFsc2U7IGJyZWFrO1xuXHRcdFx0ZGVmYXVsdDogaWYob3B0cyAmJiBvcHRzLldURikge1xuXHRcdFx0XHRpZighcGFzcykgdGhyb3cgbmV3IEVycm9yKCd1bnJlY29nbml6ZWQgJyArIHlbMF0gKyAnIGluIGNlbGxYZnMnKTtcblx0XHRcdH1cblx0XHR9XG5cdH0pO1xufVxuXG5mdW5jdGlvbiB3cml0ZV9jZWxsWGZzKGNlbGxYZnMpIHtcblx0dmFyIG8gPSBbXTtcblx0b1tvLmxlbmd0aF0gPSAod3JpdGV4dGFnKCdjZWxsWGZzJyxudWxsKSk7XG5cdGNlbGxYZnMuZm9yRWFjaChmdW5jdGlvbihjKSB7XG5cdFx0b1tvLmxlbmd0aF0gPSAod3JpdGV4dGFnKCd4ZicsIG51bGwsIGMpKTtcblx0fSk7XG5cdG9bby5sZW5ndGhdID0gKFwiPC9jZWxsWGZzPlwiKTtcblx0aWYoby5sZW5ndGggPT09IDIpIHJldHVybiBcIlwiO1xuXHRvWzBdID0gd3JpdGV4dGFnKCdjZWxsWGZzJyxudWxsLCB7Y291bnQ6by5sZW5ndGgtMn0pLnJlcGxhY2UoXCIvPlwiLFwiPlwiKTtcblx0cmV0dXJuIG8uam9pbihcIlwiKTtcbn1cblxuLyogMTguOCBTdHlsZXMgQ1RfU3R5bGVzaGVldCovXG52YXIgcGFyc2Vfc3R5X3htbD0gKGZ1bmN0aW9uIG1ha2VfcHN0eXgoKSB7XG52YXIgbnVtRm10UmVnZXggPSAvPCg/Olxcdys6KT9udW1GbXRzKFtePl0qKT5bXFxTXFxzXSo/PFxcLyg/Olxcdys6KT9udW1GbXRzPi87XG52YXIgY2VsbFhmUmVnZXggPSAvPCg/Olxcdys6KT9jZWxsWGZzKFtePl0qKT5bXFxTXFxzXSo/PFxcLyg/Olxcdys6KT9jZWxsWGZzPi87XG52YXIgZmlsbHNSZWdleCA9IC88KD86XFx3KzopP2ZpbGxzKFtePl0qKT5bXFxTXFxzXSo/PFxcLyg/Olxcdys6KT9maWxscz4vO1xudmFyIGZvbnRzUmVnZXggPSAvPCg/Olxcdys6KT9mb250cyhbXj5dKik+W1xcU1xcc10qPzxcXC8oPzpcXHcrOik/Zm9udHM+LztcbnZhciBib3JkZXJzUmVnZXggPSAvPCg/Olxcdys6KT9ib3JkZXJzKFtePl0qKT5bXFxTXFxzXSo/PFxcLyg/Olxcdys6KT9ib3JkZXJzPi87XG5cbnJldHVybiBmdW5jdGlvbiBwYXJzZV9zdHlfeG1sKGRhdGEsIHRoZW1lcywgb3B0cykge1xuXHR2YXIgc3R5bGVzID0ge307XG5cdGlmKCFkYXRhKSByZXR1cm4gc3R5bGVzO1xuXHRkYXRhID0gZGF0YS5yZXBsYWNlKC88IS0tKFtcXHNcXFNdKj8pLS0+L21nLFwiXCIpLnJlcGxhY2UoLzwhRE9DVFlQRVteXFxbXSpcXFtbXlxcXV0qXFxdPi9nbSxcIlwiKTtcblx0LyogMTguOC4zOSBzdHlsZVNoZWV0IENUX1N0eWxlc2hlZXQgKi9cblx0dmFyIHQ7XG5cblx0LyogMTguOC4zMSBudW1GbXRzIENUX051bUZtdHMgPyAqL1xuXHRpZigodD1kYXRhLm1hdGNoKG51bUZtdFJlZ2V4KSkpIHBhcnNlX251bUZtdHModCwgc3R5bGVzLCBvcHRzKTtcblxuXHQvKiAxOC44LjIzIGZvbnRzIENUX0ZvbnRzID8gKi9cblx0aWYoKHQ9ZGF0YS5tYXRjaChmb250c1JlZ2V4KSkpIHBhcnNlX2ZvbnRzKHQsIHN0eWxlcywgdGhlbWVzLCBvcHRzKTtcblxuXHQvKiAxOC44LjIxIGZpbGxzIENUX0ZpbGxzID8gKi9cblx0aWYoKHQ9ZGF0YS5tYXRjaChmaWxsc1JlZ2V4KSkpIHBhcnNlX2ZpbGxzKHQsIHN0eWxlcywgdGhlbWVzLCBvcHRzKTtcblxuXHQvKiAxOC44LjUgIGJvcmRlcnMgQ1RfQm9yZGVycyA/ICovXG5cdGlmKCh0PWRhdGEubWF0Y2goYm9yZGVyc1JlZ2V4KSkpIHBhcnNlX2JvcmRlcnModCwgc3R5bGVzLCB0aGVtZXMsIG9wdHMpO1xuXG5cdC8qIDE4LjguOSAgY2VsbFN0eWxlWGZzIENUX0NlbGxTdHlsZVhmcyA/ICovXG5cdC8qIDE4LjguOCAgY2VsbFN0eWxlcyBDVF9DZWxsU3R5bGVzID8gKi9cblxuXHQvKiAxOC44LjEwIGNlbGxYZnMgQ1RfQ2VsbFhmcyA/ICovXG5cdGlmKCh0PWRhdGEubWF0Y2goY2VsbFhmUmVnZXgpKSkgcGFyc2VfY2VsbFhmcyh0LCBzdHlsZXMsIG9wdHMpO1xuXG5cdC8qIDE4LjguMTUgZHhmcyBDVF9EeGZzID8gKi9cblx0LyogMTguOC40MiB0YWJsZVN0eWxlcyBDVF9UYWJsZVN0eWxlcyA/ICovXG5cdC8qIDE4LjguMTEgY29sb3JzIENUX0NvbG9ycyA/ICovXG5cdC8qIDE4LjIuMTAgZXh0THN0IENUX0V4dGVuc2lvbkxpc3QgPyAqL1xuXG5cdHJldHVybiBzdHlsZXM7XG59O1xufSkoKTtcblxudmFyIFNUWUxFU19YTUxfUk9PVCA9IHdyaXRleHRhZygnc3R5bGVTaGVldCcsIG51bGwsIHtcblx0J3htbG5zJzogWE1MTlMubWFpblswXSxcblx0J3htbG5zOnZ0JzogWE1MTlMudnRcbn0pO1xuXG5SRUxTLlNUWSA9IFwiaHR0cDovL3NjaGVtYXMub3BlbnhtbGZvcm1hdHMub3JnL29mZmljZURvY3VtZW50LzIwMDYvcmVsYXRpb25zaGlwcy9zdHlsZXNcIjtcblxuZnVuY3Rpb24gd3JpdGVfc3R5X3htbCh3Yiwgb3B0cykge1xuXHR2YXIgbyA9IFtYTUxfSEVBREVSLCBTVFlMRVNfWE1MX1JPT1RdLCB3O1xuXHRpZih3Yi5TU0YgJiYgKHcgPSB3cml0ZV9udW1GbXRzKHdiLlNTRikpICE9IG51bGwpIG9bby5sZW5ndGhdID0gdztcblx0b1tvLmxlbmd0aF0gPSAoJzxmb250cyBjb3VudD1cIjFcIj48Zm9udD48c3ogdmFsPVwiMTJcIi8+PGNvbG9yIHRoZW1lPVwiMVwiLz48bmFtZSB2YWw9XCJDYWxpYnJpXCIvPjxmYW1pbHkgdmFsPVwiMlwiLz48c2NoZW1lIHZhbD1cIm1pbm9yXCIvPjwvZm9udD48L2ZvbnRzPicpO1xuXHRvW28ubGVuZ3RoXSA9ICgnPGZpbGxzIGNvdW50PVwiMlwiPjxmaWxsPjxwYXR0ZXJuRmlsbCBwYXR0ZXJuVHlwZT1cIm5vbmVcIi8+PC9maWxsPjxmaWxsPjxwYXR0ZXJuRmlsbCBwYXR0ZXJuVHlwZT1cImdyYXkxMjVcIi8+PC9maWxsPjwvZmlsbHM+Jyk7XG5cdG9bby5sZW5ndGhdID0gKCc8Ym9yZGVycyBjb3VudD1cIjFcIj48Ym9yZGVyPjxsZWZ0Lz48cmlnaHQvPjx0b3AvPjxib3R0b20vPjxkaWFnb25hbC8+PC9ib3JkZXI+PC9ib3JkZXJzPicpO1xuXHRvW28ubGVuZ3RoXSA9ICgnPGNlbGxTdHlsZVhmcyBjb3VudD1cIjFcIj48eGYgbnVtRm10SWQ9XCIwXCIgZm9udElkPVwiMFwiIGZpbGxJZD1cIjBcIiBib3JkZXJJZD1cIjBcIi8+PC9jZWxsU3R5bGVYZnM+Jyk7XG5cdGlmKCh3ID0gd3JpdGVfY2VsbFhmcyhvcHRzLmNlbGxYZnMpKSkgb1tvLmxlbmd0aF0gPSAodyk7XG5cdG9bby5sZW5ndGhdID0gKCc8Y2VsbFN0eWxlcyBjb3VudD1cIjFcIj48Y2VsbFN0eWxlIG5hbWU9XCJOb3JtYWxcIiB4ZklkPVwiMFwiIGJ1aWx0aW5JZD1cIjBcIi8+PC9jZWxsU3R5bGVzPicpO1xuXHRvW28ubGVuZ3RoXSA9ICgnPGR4ZnMgY291bnQ9XCIwXCIvPicpO1xuXHRvW28ubGVuZ3RoXSA9ICgnPHRhYmxlU3R5bGVzIGNvdW50PVwiMFwiIGRlZmF1bHRUYWJsZVN0eWxlPVwiVGFibGVTdHlsZU1lZGl1bTlcIiBkZWZhdWx0UGl2b3RTdHlsZT1cIlBpdm90U3R5bGVNZWRpdW00XCIvPicpO1xuXG5cdGlmKG8ubGVuZ3RoPjIpeyBvW28ubGVuZ3RoXSA9ICgnPC9zdHlsZVNoZWV0PicpOyBvWzFdPW9bMV0ucmVwbGFjZShcIi8+XCIsXCI+XCIpOyB9XG5cdHJldHVybiBvLmpvaW4oXCJcIik7XG59XG4vKiBbTVMtWExTQl0gMi40LjY1NyBCcnRGbXQgKi9cbmZ1bmN0aW9uIHBhcnNlX0JydEZtdChkYXRhLCBsZW5ndGgpIHtcblx0dmFyIG51bUZtdElkID0gZGF0YS5yZWFkX3NoaWZ0KDIpO1xuXHR2YXIgc3RGbXRDb2RlID0gcGFyc2VfWExXaWRlU3RyaW5nKGRhdGEsbGVuZ3RoLTIpO1xuXHRyZXR1cm4gW251bUZtdElkLCBzdEZtdENvZGVdO1xufVxuZnVuY3Rpb24gd3JpdGVfQnJ0Rm10KGksIGYsIG8pIHtcblx0aWYoIW8pIG8gPSBuZXdfYnVmKDYgKyA0ICogZi5sZW5ndGgpO1xuXHRvLndyaXRlX3NoaWZ0KDIsIGkpO1xuXHR3cml0ZV9YTFdpZGVTdHJpbmcoZiwgbyk7XG5cdHZhciBvdXQgPSAoby5sZW5ndGggPiBvLmwpID8gby5zbGljZSgwLCBvLmwpIDogbztcblx0aWYoby5sID09IG51bGwpIG8ubCA9IG8ubGVuZ3RoO1xuXHRyZXR1cm4gb3V0O1xufVxuXG4vKiBbTVMtWExTQl0gMi40LjY1OSBCcnRGb250IFRPRE8gKi9cbmZ1bmN0aW9uIHBhcnNlX0JydEZvbnQoZGF0YSwgbGVuZ3RoLCBvcHRzKSB7XG5cdHZhciBvdXQgPSAoe30pO1xuXG5cdG91dC5zeiA9IGRhdGEucmVhZF9zaGlmdCgyKSAvIDIwO1xuXG5cdHZhciBncmJpdCA9IHBhcnNlX0ZvbnRGbGFncyhkYXRhLCAyLCBvcHRzKTtcblx0aWYoZ3JiaXQuZkl0YWxpYykgb3V0Lml0YWxpYyA9IDE7XG5cdGlmKGdyYml0LmZDb25kZW5zZSkgb3V0LmNvbmRlbnNlID0gMTtcblx0aWYoZ3JiaXQuZkV4dGVuZCkgb3V0LmV4dGVuZCA9IDE7XG5cdGlmKGdyYml0LmZTaGFkb3cpIG91dC5zaGFkb3cgPSAxO1xuXHRpZihncmJpdC5mT3V0bGluZSkgb3V0Lm91dGxpbmUgPSAxO1xuXHRpZihncmJpdC5mU3RyaWtlb3V0KSBvdXQuc3RyaWtlID0gMTtcblxuXHR2YXIgYmxzID0gZGF0YS5yZWFkX3NoaWZ0KDIpO1xuXHRpZihibHMgPT09IDB4MDJCQykgb3V0LmJvbGQgPSAxO1xuXG5cdHN3aXRjaChkYXRhLnJlYWRfc2hpZnQoMikpIHtcblx0XHQvKiBjYXNlIDA6IG91dC52ZXJ0QWxpZ24gPSBcImJhc2VsaW5lXCI7IGJyZWFrOyAqL1xuXHRcdGNhc2UgMTogb3V0LnZlcnRBbGlnbiA9IFwic3VwZXJzY3JpcHRcIjsgYnJlYWs7XG5cdFx0Y2FzZSAyOiBvdXQudmVydEFsaWduID0gXCJzdWJzY3JpcHRcIjsgYnJlYWs7XG5cdH1cblxuXHR2YXIgdW5kZXJsaW5lID0gZGF0YS5yZWFkX3NoaWZ0KDEpO1xuXHRpZih1bmRlcmxpbmUgIT0gMCkgb3V0LnVuZGVybGluZSA9IHVuZGVybGluZTtcblxuXHR2YXIgZmFtaWx5ID0gZGF0YS5yZWFkX3NoaWZ0KDEpO1xuXHRpZihmYW1pbHkgPiAwKSBvdXQuZmFtaWx5ID0gZmFtaWx5O1xuXG5cdHZhciBiQ2hhclNldCA9IGRhdGEucmVhZF9zaGlmdCgxKTtcblx0aWYoYkNoYXJTZXQgPiAwKSBvdXQuY2hhcnNldCA9IGJDaGFyU2V0O1xuXG5cdGRhdGEubCsrO1xuXHRvdXQuY29sb3IgPSBwYXJzZV9CcnRDb2xvcihkYXRhLCA4KTtcblxuXHRzd2l0Y2goZGF0YS5yZWFkX3NoaWZ0KDEpKSB7XG5cdFx0LyogY2FzZSAwOiBvdXQuc2NoZW1lID0gXCJub25lXCI6IGJyZWFrOyAqL1xuXHRcdGNhc2UgMTogb3V0LnNjaGVtZSA9IFwibWFqb3JcIjsgYnJlYWs7XG5cdFx0Y2FzZSAyOiBvdXQuc2NoZW1lID0gXCJtaW5vclwiOyBicmVhaztcblx0fVxuXG5cdG91dC5uYW1lID0gcGFyc2VfWExXaWRlU3RyaW5nKGRhdGEsIGxlbmd0aCAtIDIxKTtcblxuXHRyZXR1cm4gb3V0O1xufVxuZnVuY3Rpb24gd3JpdGVfQnJ0Rm9udChmb250LCBvKSB7XG5cdGlmKCFvKSBvID0gbmV3X2J1ZigyNSs0KjMyKTtcblx0by53cml0ZV9zaGlmdCgyLCBmb250LnN6ICogMjApO1xuXHR3cml0ZV9Gb250RmxhZ3MoZm9udCwgbyk7XG5cdG8ud3JpdGVfc2hpZnQoMiwgZm9udC5ib2xkID8gMHgwMkJDIDogMHgwMTkwKTtcblx0dmFyIHNzcyA9IDA7XG5cdGlmKGZvbnQudmVydEFsaWduID09IFwic3VwZXJzY3JpcHRcIikgc3NzID0gMTtcblx0ZWxzZSBpZihmb250LnZlcnRBbGlnbiA9PSBcInN1YnNjcmlwdFwiKSBzc3MgPSAyO1xuXHRvLndyaXRlX3NoaWZ0KDIsIHNzcyk7XG5cdG8ud3JpdGVfc2hpZnQoMSwgZm9udC51bmRlcmxpbmUgfHwgMCk7XG5cdG8ud3JpdGVfc2hpZnQoMSwgZm9udC5mYW1pbHkgfHwgMCk7XG5cdG8ud3JpdGVfc2hpZnQoMSwgZm9udC5jaGFyc2V0IHx8IDApO1xuXHRvLndyaXRlX3NoaWZ0KDEsIDApO1xuXHR3cml0ZV9CcnRDb2xvcihmb250LmNvbG9yLCBvKTtcblx0dmFyIHNjaGVtZSA9IDA7XG5cdGlmKGZvbnQuc2NoZW1lID09IFwibWFqb3JcIikgc2NoZW1lID0gMTtcblx0aWYoZm9udC5zY2hlbWUgPT0gXCJtaW5vclwiKSBzY2hlbWUgPSAyO1xuXHRvLndyaXRlX3NoaWZ0KDEsIHNjaGVtZSk7XG5cdHdyaXRlX1hMV2lkZVN0cmluZyhmb250Lm5hbWUsIG8pO1xuXHRyZXR1cm4gby5sZW5ndGggPiBvLmwgPyBvLnNsaWNlKDAsIG8ubCkgOiBvO1xufVxuXG4vKiBbTVMtWExTQl0gMi40LjY1MCBCcnRGaWxsICovXG52YXIgWExTQkZpbGxQVE5hbWVzID0gW1xuXHRcIm5vbmVcIixcblx0XCJzb2xpZFwiLFxuXHRcIm1lZGl1bUdyYXlcIixcblx0XCJkYXJrR3JheVwiLFxuXHRcImxpZ2h0R3JheVwiLFxuXHRcImRhcmtIb3Jpem9udGFsXCIsXG5cdFwiZGFya1ZlcnRpY2FsXCIsXG5cdFwiZGFya0Rvd25cIixcblx0XCJkYXJrVXBcIixcblx0XCJkYXJrR3JpZFwiLFxuXHRcImRhcmtUcmVsbGlzXCIsXG5cdFwibGlnaHRIb3Jpem9udGFsXCIsXG5cdFwibGlnaHRWZXJ0aWNhbFwiLFxuXHRcImxpZ2h0RG93blwiLFxuXHRcImxpZ2h0VXBcIixcblx0XCJsaWdodEdyaWRcIixcblx0XCJsaWdodFRyZWxsaXNcIixcblx0XCJncmF5MTI1XCIsXG5cdFwiZ3JheTA2MjVcIlxuXTtcbnZhciByZXZfWExTQkZpbGxQVE5hbWVzID0gKGV2ZXJ0KFhMU0JGaWxsUFROYW1lcykpO1xuLyogVE9ETzogZ3JhZGllbnQgZmlsbCByZXByZXNlbnRhdGlvbiAqL1xudmFyIHBhcnNlX0JydEZpbGwgPSBwYXJzZW5vb3A7XG5mdW5jdGlvbiB3cml0ZV9CcnRGaWxsKGZpbGwsIG8pIHtcblx0aWYoIW8pIG8gPSBuZXdfYnVmKDQqMyArIDgqNyArIDE2KjEpO1xuXHR2YXIgZmxzID0gcmV2X1hMU0JGaWxsUFROYW1lc1tmaWxsLnBhdHRlcm5UeXBlXTtcblx0aWYoZmxzID09IG51bGwpIGZscyA9IDB4Mjg7XG5cdG8ud3JpdGVfc2hpZnQoNCwgZmxzKTtcblx0dmFyIGogPSAwO1xuXHRpZihmbHMgIT0gMHgyOCkge1xuXHRcdC8qIFRPRE86IGN1c3RvbSBGRyBDb2xvciAqL1xuXHRcdHdyaXRlX0JydENvbG9yKHthdXRvOjF9LCBvKTtcblx0XHQvKiBUT0RPOiBjdXN0b20gQkcgQ29sb3IgKi9cblx0XHR3cml0ZV9CcnRDb2xvcih7YXV0bzoxfSwgbyk7XG5cblx0XHRmb3IoOyBqIDwgMTI7ICsraikgby53cml0ZV9zaGlmdCg0LCAwKTtcblx0fSBlbHNlIHtcblx0XHRmb3IoOyBqIDwgNDsgKytqKSBvLndyaXRlX3NoaWZ0KDQsIDApO1xuXG5cdFx0Zm9yKDsgaiA8IDEyOyArK2opIG8ud3JpdGVfc2hpZnQoNCwgMCk7IC8qIFRPRE8gKi9cblx0XHQvKiBpR3JhZGllbnRUeXBlICovXG5cdFx0LyogeG51bURlZ3JlZSAqL1xuXHRcdC8qIHhudW1GaWxsVG9MZWZ0ICovXG5cdFx0LyogeG51bUZpbGxUb1JpZ2h0ICovXG5cdFx0LyogeG51bUZpbGxUb1RvcCAqL1xuXHRcdC8qIHhudW1GaWxsVG9Cb3R0b20gKi9cblx0XHQvKiBjTnVtU3RvcCAqL1xuXHRcdC8qIHhmaWxsR3JhZGllbnRTdG9wICovXG5cdH1cblx0cmV0dXJuIG8ubGVuZ3RoID4gby5sID8gby5zbGljZSgwLCBvLmwpIDogbztcbn1cblxuLyogW01TLVhMU0JdIDIuNC44MjQgQnJ0WEYgKi9cbmZ1bmN0aW9uIHBhcnNlX0JydFhGKGRhdGEsIGxlbmd0aCkge1xuXHR2YXIgdGd0ID0gZGF0YS5sICsgbGVuZ3RoO1xuXHR2YXIgaXhmZVBhcmVudCA9IGRhdGEucmVhZF9zaGlmdCgyKTtcblx0dmFyIGlmbXQgPSBkYXRhLnJlYWRfc2hpZnQoMik7XG5cdGRhdGEubCA9IHRndDtcblx0cmV0dXJuIHtpeGZlOml4ZmVQYXJlbnQsIG51bUZtdElkOmlmbXQgfTtcbn1cbmZ1bmN0aW9uIHdyaXRlX0JydFhGKGRhdGEsIGl4ZmVQLCBvKSB7XG5cdGlmKCFvKSBvID0gbmV3X2J1ZigxNik7XG5cdG8ud3JpdGVfc2hpZnQoMiwgaXhmZVB8fDApO1xuXHRvLndyaXRlX3NoaWZ0KDIsIGRhdGEubnVtRm10SWR8fDApO1xuXHRvLndyaXRlX3NoaWZ0KDIsIDApOyAvKiBpRm9udCAqL1xuXHRvLndyaXRlX3NoaWZ0KDIsIDApOyAvKiBpRmlsbCAqL1xuXHRvLndyaXRlX3NoaWZ0KDIsIDApOyAvKiBpeEJvcmRlciAqL1xuXHRvLndyaXRlX3NoaWZ0KDEsIDApOyAvKiB0cm90ICovXG5cdG8ud3JpdGVfc2hpZnQoMSwgMCk7IC8qIGluZGVudCAqL1xuXHR2YXIgZmxvdyA9IDA7XG5cdG8ud3JpdGVfc2hpZnQoMSwgZmxvdyk7IC8qIGZsYWdzICovXG5cdG8ud3JpdGVfc2hpZnQoMSwgMCk7IC8qIGZsYWdzICovXG5cdG8ud3JpdGVfc2hpZnQoMSwgMCk7IC8qIHhmR3JiaXRBdHIgKi9cblx0by53cml0ZV9zaGlmdCgxLCAwKTtcblx0cmV0dXJuIG87XG59XG5cbi8qIFtNUy1YTFNCXSAyLjUuNCBCbHhmIFRPRE8gKi9cbmZ1bmN0aW9uIHdyaXRlX0JseGYoZGF0YSwgbykge1xuXHRpZighbykgbyA9IG5ld19idWYoMTApO1xuXHRvLndyaXRlX3NoaWZ0KDEsIDApOyAvKiBkZyAqL1xuXHRvLndyaXRlX3NoaWZ0KDEsIDApO1xuXHRvLndyaXRlX3NoaWZ0KDQsIDApOyAvKiBjb2xvciAqL1xuXHRvLndyaXRlX3NoaWZ0KDQsIDApOyAvKiBjb2xvciAqL1xuXHRyZXR1cm4gbztcbn1cbi8qIFtNUy1YTFNCXSAyLjQuMzAyIEJydEJvcmRlciBUT0RPICovXG52YXIgcGFyc2VfQnJ0Qm9yZGVyID0gcGFyc2Vub29wO1xuZnVuY3Rpb24gd3JpdGVfQnJ0Qm9yZGVyKGJvcmRlciwgbykge1xuXHRpZighbykgbyA9IG5ld19idWYoNTEpO1xuXHRvLndyaXRlX3NoaWZ0KDEsIDApOyAvKiBkaWFnb25hbCAqL1xuXHR3cml0ZV9CbHhmKG51bGwsIG8pOyAvKiB0b3AgKi9cblx0d3JpdGVfQmx4ZihudWxsLCBvKTsgLyogYm90dG9tICovXG5cdHdyaXRlX0JseGYobnVsbCwgbyk7IC8qIGxlZnQgKi9cblx0d3JpdGVfQmx4ZihudWxsLCBvKTsgLyogcmlnaHQgKi9cblx0d3JpdGVfQmx4ZihudWxsLCBvKTsgLyogZGlhZyAqL1xuXHRyZXR1cm4gby5sZW5ndGggPiBvLmwgPyBvLnNsaWNlKDAsIG8ubCkgOiBvO1xufVxuXG4vKiBbTVMtWExTQl0gMi40Ljc2MyBCcnRTdHlsZSBUT0RPICovXG5mdW5jdGlvbiB3cml0ZV9CcnRTdHlsZShzdHlsZSwgbykge1xuXHRpZighbykgbyA9IG5ld19idWYoMTIrNCoxMCk7XG5cdG8ud3JpdGVfc2hpZnQoNCwgc3R5bGUueGZJZCk7XG5cdG8ud3JpdGVfc2hpZnQoMiwgMSk7XG5cdG8ud3JpdGVfc2hpZnQoMSwgK3N0eWxlLmJ1aWx0aW5JZCk7XG5cdG8ud3JpdGVfc2hpZnQoMSwgMCk7IC8qIGlMZXZlbCAqL1xuXHR3cml0ZV9YTE51bGxhYmxlV2lkZVN0cmluZyhzdHlsZS5uYW1lIHx8IFwiXCIsIG8pO1xuXHRyZXR1cm4gby5sZW5ndGggPiBvLmwgPyBvLnNsaWNlKDAsIG8ubCkgOiBvO1xufVxuXG4vKiBbTVMtWExTQl0gMi40LjI3MiBCcnRCZWdpblRhYmxlU3R5bGVzICovXG5mdW5jdGlvbiB3cml0ZV9CcnRCZWdpblRhYmxlU3R5bGVzKGNudCwgZGVmVGFibGVTdHlsZSwgZGVmUGl2b3RTdHlsZSkge1xuXHR2YXIgbyA9IG5ld19idWYoNCsyNTYqMio0KTtcblx0by53cml0ZV9zaGlmdCg0LCBjbnQpO1xuXHR3cml0ZV9YTE51bGxhYmxlV2lkZVN0cmluZyhkZWZUYWJsZVN0eWxlLCBvKTtcblx0d3JpdGVfWExOdWxsYWJsZVdpZGVTdHJpbmcoZGVmUGl2b3RTdHlsZSwgbyk7XG5cdHJldHVybiBvLmxlbmd0aCA+IG8ubCA/IG8uc2xpY2UoMCwgby5sKSA6IG87XG59XG5cbi8qIFtNUy1YTFNCXSAyLjEuNy41MCBTdHlsZXMgKi9cbmZ1bmN0aW9uIHBhcnNlX3N0eV9iaW4oZGF0YSwgdGhlbWVzLCBvcHRzKSB7XG5cdHZhciBzdHlsZXMgPSB7fTtcblx0c3R5bGVzLk51bWJlckZtdCA9IChbXSk7XG5cdGZvcih2YXIgeSBpbiBTU0YuX3RhYmxlKSBzdHlsZXMuTnVtYmVyRm10W3ldID0gU1NGLl90YWJsZVt5XTtcblxuXHRzdHlsZXMuQ2VsbFhmID0gW107XG5cdHN0eWxlcy5Gb250cyA9IFtdO1xuXHR2YXIgc3RhdGUgPSBbXTtcblx0dmFyIHBhc3MgPSBmYWxzZTtcblx0cmVjb3JkaG9wcGVyKGRhdGEsIGZ1bmN0aW9uIGhvcHBlcl9zdHkodmFsLCBSX24sIFJUKSB7XG5cdFx0c3dpdGNoKFJUKSB7XG5cdFx0XHRjYXNlIDB4MDAyQzogLyogJ0JydEZtdCcgKi9cblx0XHRcdFx0c3R5bGVzLk51bWJlckZtdFt2YWxbMF1dID0gdmFsWzFdOyBTU0YubG9hZCh2YWxbMV0sIHZhbFswXSk7XG5cdFx0XHRcdGJyZWFrO1xuXHRcdFx0Y2FzZSAweDAwMkI6IC8qICdCcnRGb250JyAqL1xuXHRcdFx0XHRzdHlsZXMuRm9udHMucHVzaCh2YWwpO1xuXHRcdFx0XHRpZih2YWwuY29sb3IudGhlbWUgIT0gbnVsbCAmJiB0aGVtZXMgJiYgdGhlbWVzLnRoZW1lRWxlbWVudHMgJiYgdGhlbWVzLnRoZW1lRWxlbWVudHMuY2xyU2NoZW1lKSB7XG5cdFx0XHRcdFx0dmFsLmNvbG9yLnJnYiA9IHJnYl90aW50KHRoZW1lcy50aGVtZUVsZW1lbnRzLmNsclNjaGVtZVt2YWwuY29sb3IudGhlbWVdLnJnYiwgdmFsLmNvbG9yLnRpbnQgfHwgMCk7XG5cdFx0XHRcdH1cblx0XHRcdFx0YnJlYWs7XG5cdFx0XHRjYXNlIDB4MDQwMTogLyogJ0JydEtub3duRm9udHMnICovIGJyZWFrO1xuXHRcdFx0Y2FzZSAweDAwMkQ6IC8qICdCcnRGaWxsJyAqL1xuXHRcdFx0XHRicmVhaztcblx0XHRcdGNhc2UgMHgwMDJFOiAvKiAnQnJ0Qm9yZGVyJyAqL1xuXHRcdFx0XHRicmVhaztcblx0XHRcdGNhc2UgMHgwMDJGOiAvKiAnQnJ0WEYnICovXG5cdFx0XHRcdGlmKHN0YXRlW3N0YXRlLmxlbmd0aCAtIDFdID09IFwiQnJ0QmVnaW5DZWxsWEZzXCIpIHtcblx0XHRcdFx0XHRzdHlsZXMuQ2VsbFhmLnB1c2godmFsKTtcblx0XHRcdFx0fVxuXHRcdFx0XHRicmVhaztcblx0XHRcdGNhc2UgMHgwMDMwOiAvKiAnQnJ0U3R5bGUnICovXG5cdFx0XHRjYXNlIDB4MDFGQjogLyogJ0JydERYRicgKi9cblx0XHRcdGNhc2UgMHgwMjNDOiAvKiAnQnJ0TVJVQ29sb3InICovXG5cdFx0XHRjYXNlIDB4MDFEQjogLyogJ0JydEluZGV4ZWRDb2xvcic6ICovXG5cdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRjYXNlIDB4MDQ5MzogLyogJ0JydERYRjE0JyAqL1xuXHRcdFx0Y2FzZSAweDA4MzY6IC8qICdCcnREWEYxNScgKi9cblx0XHRcdGNhc2UgMHgwNDZBOiAvKiAnQnJ0U2xpY2VyU3R5bGVFbGVtZW50JyAqL1xuXHRcdFx0Y2FzZSAweDAyMDA6IC8qICdCcnRUYWJsZVN0eWxlRWxlbWVudCcgKi9cblx0XHRcdGNhc2UgMHgwODJGOiAvKiAnQnJ0VGltZWxpbmVTdHlsZUVsZW1lbnQnICovXG5cdFx0XHRjYXNlIDB4MEMwMDogLyogJ0JydFVpZCcgKi9cblx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdGNhc2UgMHgwMDIzOiAvKiAnQnJ0RlJUQmVnaW4nICovXG5cdFx0XHRcdHBhc3MgPSB0cnVlOyBicmVhaztcblx0XHRcdGNhc2UgMHgwMDI0OiAvKiAnQnJ0RlJURW5kJyAqL1xuXHRcdFx0XHRwYXNzID0gZmFsc2U7IGJyZWFrO1xuXHRcdFx0Y2FzZSAweDAwMjU6IC8qICdCcnRBQ0JlZ2luJyAqL1xuXHRcdFx0XHRzdGF0ZS5wdXNoKFJfbik7IHBhc3MgPSB0cnVlOyBicmVhaztcblx0XHRcdGNhc2UgMHgwMDI2OiAvKiAnQnJ0QUNFbmQnICovXG5cdFx0XHRcdHN0YXRlLnBvcCgpOyBwYXNzID0gZmFsc2U7IGJyZWFrO1xuXG5cdFx0XHRkZWZhdWx0OlxuXHRcdFx0XHRpZigoUl9ufHxcIlwiKS5pbmRleE9mKFwiQmVnaW5cIikgPiAwKSBzdGF0ZS5wdXNoKFJfbik7XG5cdFx0XHRcdGVsc2UgaWYoKFJfbnx8XCJcIikuaW5kZXhPZihcIkVuZFwiKSA+IDApIHN0YXRlLnBvcCgpO1xuXHRcdFx0XHRlbHNlIGlmKCFwYXNzIHx8IChvcHRzLldURiAmJiBzdGF0ZVtzdGF0ZS5sZW5ndGgtMV0gIT0gXCJCcnRBQ0JlZ2luXCIpKSB0aHJvdyBuZXcgRXJyb3IoXCJVbmV4cGVjdGVkIHJlY29yZCBcIiArIFJUICsgXCIgXCIgKyBSX24pO1xuXHRcdH1cblx0fSk7XG5cdHJldHVybiBzdHlsZXM7XG59XG5cbmZ1bmN0aW9uIHdyaXRlX0ZNVFNfYmluKGJhLCBORikge1xuXHRpZighTkYpIHJldHVybjtcblx0dmFyIGNudCA9IDA7XG5cdFtbNSw4XSxbMjMsMjZdLFs0MSw0NF0sWy8qNjMqLzUwLC8qNjZdLFsxNjQsKi8zOTJdXS5mb3JFYWNoKGZ1bmN0aW9uKHIpIHtcbmZvcih2YXIgaSA9IHJbMF07IGkgPD0gclsxXTsgKytpKSBpZihORltpXSAhPSBudWxsKSArK2NudDtcblx0fSk7XG5cblx0aWYoY250ID09IDApIHJldHVybjtcblx0d3JpdGVfcmVjb3JkKGJhLCBcIkJydEJlZ2luRm10c1wiLCB3cml0ZV9VSW50MzJMRShjbnQpKTtcblx0W1s1LDhdLFsyMywyNl0sWzQxLDQ0XSxbLyo2MyovNTAsLyo2Nl0sWzE2NCwqLzM5Ml1dLmZvckVhY2goZnVuY3Rpb24ocikge1xuZm9yKHZhciBpID0gclswXTsgaSA8PSByWzFdOyArK2kpIGlmKE5GW2ldICE9IG51bGwpIHdyaXRlX3JlY29yZChiYSwgXCJCcnRGbXRcIiwgd3JpdGVfQnJ0Rm10KGksIE5GW2ldKSk7XG5cdH0pO1xuXHR3cml0ZV9yZWNvcmQoYmEsIFwiQnJ0RW5kRm10c1wiKTtcbn1cblxuZnVuY3Rpb24gd3JpdGVfRk9OVFNfYmluKGJhKSB7XG5cdHZhciBjbnQgPSAxO1xuXG5cdGlmKGNudCA9PSAwKSByZXR1cm47XG5cdHdyaXRlX3JlY29yZChiYSwgXCJCcnRCZWdpbkZvbnRzXCIsIHdyaXRlX1VJbnQzMkxFKGNudCkpO1xuXHR3cml0ZV9yZWNvcmQoYmEsIFwiQnJ0Rm9udFwiLCB3cml0ZV9CcnRGb250KHtcblx0XHRzejoxMixcblx0XHRjb2xvcjoge3RoZW1lOjF9LFxuXHRcdG5hbWU6IFwiQ2FsaWJyaVwiLFxuXHRcdGZhbWlseTogMixcblx0XHRzY2hlbWU6IFwibWlub3JcIlxuXHR9KSk7XG5cdC8qIDEqNjU0OTFCcnRGb250IFtBQ0ZPTlRTXSAqL1xuXHR3cml0ZV9yZWNvcmQoYmEsIFwiQnJ0RW5kRm9udHNcIik7XG59XG5cbmZ1bmN0aW9uIHdyaXRlX0ZJTExTX2JpbihiYSkge1xuXHR2YXIgY250ID0gMjtcblxuXHRpZihjbnQgPT0gMCkgcmV0dXJuO1xuXHR3cml0ZV9yZWNvcmQoYmEsIFwiQnJ0QmVnaW5GaWxsc1wiLCB3cml0ZV9VSW50MzJMRShjbnQpKTtcblx0d3JpdGVfcmVjb3JkKGJhLCBcIkJydEZpbGxcIiwgd3JpdGVfQnJ0RmlsbCh7cGF0dGVyblR5cGU6XCJub25lXCJ9KSk7XG5cdHdyaXRlX3JlY29yZChiYSwgXCJCcnRGaWxsXCIsIHdyaXRlX0JydEZpbGwoe3BhdHRlcm5UeXBlOlwiZ3JheTEyNVwifSkpO1xuXHQvKiAxKjY1NDMxQnJ0RmlsbCAqL1xuXHR3cml0ZV9yZWNvcmQoYmEsIFwiQnJ0RW5kRmlsbHNcIik7XG59XG5cbmZ1bmN0aW9uIHdyaXRlX0JPUkRFUlNfYmluKGJhKSB7XG5cdHZhciBjbnQgPSAxO1xuXG5cdGlmKGNudCA9PSAwKSByZXR1cm47XG5cdHdyaXRlX3JlY29yZChiYSwgXCJCcnRCZWdpbkJvcmRlcnNcIiwgd3JpdGVfVUludDMyTEUoY250KSk7XG5cdHdyaXRlX3JlY29yZChiYSwgXCJCcnRCb3JkZXJcIiwgd3JpdGVfQnJ0Qm9yZGVyKHt9KSk7XG5cdC8qIDEqNjU0MzBCcnRCb3JkZXIgKi9cblx0d3JpdGVfcmVjb3JkKGJhLCBcIkJydEVuZEJvcmRlcnNcIik7XG59XG5cbmZ1bmN0aW9uIHdyaXRlX0NFTExTVFlMRVhGU19iaW4oYmEpIHtcblx0dmFyIGNudCA9IDE7XG5cdHdyaXRlX3JlY29yZChiYSwgXCJCcnRCZWdpbkNlbGxTdHlsZVhGc1wiLCB3cml0ZV9VSW50MzJMRShjbnQpKTtcblx0d3JpdGVfcmVjb3JkKGJhLCBcIkJydFhGXCIsIHdyaXRlX0JydFhGKHtcblx0XHRudW1GbXRJZDogMCxcblx0XHRmb250SWQ6ICAgMCxcblx0XHRmaWxsSWQ6ICAgMCxcblx0XHRib3JkZXJJZDogMFxuXHR9LCAweEZGRkYpKTtcblx0LyogMSo2NTQzMChCcnRYRiAqRlJUKSAqL1xuXHR3cml0ZV9yZWNvcmQoYmEsIFwiQnJ0RW5kQ2VsbFN0eWxlWEZzXCIpO1xufVxuXG5mdW5jdGlvbiB3cml0ZV9DRUxMWEZTX2JpbihiYSwgZGF0YSkge1xuXHR3cml0ZV9yZWNvcmQoYmEsIFwiQnJ0QmVnaW5DZWxsWEZzXCIsIHdyaXRlX1VJbnQzMkxFKGRhdGEubGVuZ3RoKSk7XG5cdGRhdGEuZm9yRWFjaChmdW5jdGlvbihjKSB7IHdyaXRlX3JlY29yZChiYSwgXCJCcnRYRlwiLCB3cml0ZV9CcnRYRihjLDApKTsgfSk7XG5cdC8qIDEqNjU0MzAoQnJ0WEYgKkZSVCkgKi9cblx0d3JpdGVfcmVjb3JkKGJhLCBcIkJydEVuZENlbGxYRnNcIik7XG59XG5cbmZ1bmN0aW9uIHdyaXRlX1NUWUxFU19iaW4oYmEpIHtcblx0dmFyIGNudCA9IDE7XG5cblx0d3JpdGVfcmVjb3JkKGJhLCBcIkJydEJlZ2luU3R5bGVzXCIsIHdyaXRlX1VJbnQzMkxFKGNudCkpO1xuXHR3cml0ZV9yZWNvcmQoYmEsIFwiQnJ0U3R5bGVcIiwgd3JpdGVfQnJ0U3R5bGUoe1xuXHRcdHhmSWQ6MCxcblx0XHRidWlsdGluSWQ6MCxcblx0XHRuYW1lOlwiTm9ybWFsXCJcblx0fSkpO1xuXHQvKiAxKjY1NDMwKEJydFN0eWxlICpGUlQpICovXG5cdHdyaXRlX3JlY29yZChiYSwgXCJCcnRFbmRTdHlsZXNcIik7XG59XG5cbmZ1bmN0aW9uIHdyaXRlX0RYRlNfYmluKGJhKSB7XG5cdHZhciBjbnQgPSAwO1xuXG5cdHdyaXRlX3JlY29yZChiYSwgXCJCcnRCZWdpbkRYRnNcIiwgd3JpdGVfVUludDMyTEUoY250KSk7XG5cdC8qICoyMTQ3NDgzNjQ3KEJydERYRiAqRlJUKSAqL1xuXHR3cml0ZV9yZWNvcmQoYmEsIFwiQnJ0RW5kRFhGc1wiKTtcbn1cblxuZnVuY3Rpb24gd3JpdGVfVEFCTEVTVFlMRVNfYmluKGJhKSB7XG5cdHZhciBjbnQgPSAwO1xuXG5cdHdyaXRlX3JlY29yZChiYSwgXCJCcnRCZWdpblRhYmxlU3R5bGVzXCIsIHdyaXRlX0JydEJlZ2luVGFibGVTdHlsZXMoY250LCBcIlRhYmxlU3R5bGVNZWRpdW05XCIsIFwiUGl2b3RTdHlsZU1lZGl1bTRcIikpO1xuXHQvKiAqVEFCTEVTVFlMRSAqL1xuXHR3cml0ZV9yZWNvcmQoYmEsIFwiQnJ0RW5kVGFibGVTdHlsZXNcIik7XG59XG5cbmZ1bmN0aW9uIHdyaXRlX0NPTE9SUEFMRVRURV9iaW4oKSB7XG5cdHJldHVybjtcblx0LyogQnJ0QmVnaW5Db2xvclBhbGV0dGUgW0lOREVYRURDT0xPUlNdIFtNUlVDT0xPUlNdIEJydEVuZENvbG9yUGFsZXR0ZSAqL1xufVxuXG4vKiBbTVMtWExTQl0gMi4xLjcuNTAgU3R5bGVzICovXG5mdW5jdGlvbiB3cml0ZV9zdHlfYmluKHdiLCBvcHRzKSB7XG5cdHZhciBiYSA9IGJ1Zl9hcnJheSgpO1xuXHR3cml0ZV9yZWNvcmQoYmEsIFwiQnJ0QmVnaW5TdHlsZVNoZWV0XCIpO1xuXHR3cml0ZV9GTVRTX2JpbihiYSwgd2IuU1NGKTtcblx0d3JpdGVfRk9OVFNfYmluKGJhLCB3Yik7XG5cdHdyaXRlX0ZJTExTX2JpbihiYSwgd2IpO1xuXHR3cml0ZV9CT1JERVJTX2JpbihiYSwgd2IpO1xuXHR3cml0ZV9DRUxMU1RZTEVYRlNfYmluKGJhLCB3Yik7XG5cdHdyaXRlX0NFTExYRlNfYmluKGJhLCBvcHRzLmNlbGxYZnMpO1xuXHR3cml0ZV9TVFlMRVNfYmluKGJhLCB3Yik7XG5cdHdyaXRlX0RYRlNfYmluKGJhLCB3Yik7XG5cdHdyaXRlX1RBQkxFU1RZTEVTX2JpbihiYSwgd2IpO1xuXHR3cml0ZV9DT0xPUlBBTEVUVEVfYmluKGJhLCB3Yik7XG5cdC8qIEZSVFNUWUxFU0hFRVQqL1xuXHR3cml0ZV9yZWNvcmQoYmEsIFwiQnJ0RW5kU3R5bGVTaGVldFwiKTtcblx0cmV0dXJuIGJhLmVuZCgpO1xufVxuUkVMUy5USEVNRSA9IFwiaHR0cDovL3NjaGVtYXMub3BlbnhtbGZvcm1hdHMub3JnL29mZmljZURvY3VtZW50LzIwMDYvcmVsYXRpb25zaGlwcy90aGVtZVwiO1xuXG4vKiBFdmVuIHRob3VnaCB0aGVtZSBsYXlvdXQgaXMgZGsxIGx0MSBkazIgbHQyLCB0cnVlIG9yZGVyIGlzIGx0MSBkazEgbHQyIGRrMiAqL1xudmFyIFhMU1hUaGVtZUNsclNjaGVtZSA9IFtcblx0JzwvYTpsdDE+JywgJzwvYTpkazE+JywgJzwvYTpsdDI+JywgJzwvYTpkazI+Jyxcblx0JzwvYTphY2NlbnQxPicsICc8L2E6YWNjZW50Mj4nLCAnPC9hOmFjY2VudDM+Jyxcblx0JzwvYTphY2NlbnQ0PicsICc8L2E6YWNjZW50NT4nLCAnPC9hOmFjY2VudDY+Jyxcblx0JzwvYTpobGluaz4nLCAnPC9hOmZvbEhsaW5rPidcbl07XG4vKiAyMC4xLjYuMiBjbHJTY2hlbWUgQ1RfQ29sb3JTY2hlbWUgKi9cbmZ1bmN0aW9uIHBhcnNlX2NsclNjaGVtZSh0LCB0aGVtZXMsIG9wdHMpIHtcblx0dGhlbWVzLnRoZW1lRWxlbWVudHMuY2xyU2NoZW1lID0gW107XG5cdHZhciBjb2xvciA9IHt9O1xuXHQodFswXS5tYXRjaCh0YWdyZWdleCl8fFtdKS5mb3JFYWNoKGZ1bmN0aW9uKHgpIHtcblx0XHR2YXIgeSA9IHBhcnNleG1sdGFnKHgpO1xuXHRcdHN3aXRjaCh5WzBdKSB7XG5cdFx0XHQvKiAyMC4xLjYuMiBjbHJTY2hlbWUgKENvbG9yIFNjaGVtZSkgQ1RfQ29sb3JTY2hlbWUgKi9cblx0XHRcdGNhc2UgJzxhOmNsclNjaGVtZSc6IGNhc2UgJzwvYTpjbHJTY2hlbWU+JzogYnJlYWs7XG5cblx0XHRcdC8qIDIwLjEuMi4zLjMyIHNyZ2JDbHIgQ1RfU1JnYkNvbG9yICovXG5cdFx0XHRjYXNlICc8YTpzcmdiQ2xyJzpcblx0XHRcdFx0Y29sb3IucmdiID0geS52YWw7IGJyZWFrO1xuXG5cdFx0XHQvKiAyMC4xLjIuMy4zMyBzeXNDbHIgQ1RfU3lzdGVtQ29sb3IgKi9cblx0XHRcdGNhc2UgJzxhOnN5c0Nscic6XG5cdFx0XHRcdGNvbG9yLnJnYiA9IHkubGFzdENscjsgYnJlYWs7XG5cblx0XHRcdC8qIDIwLjEuNC4xLjEgYWNjZW50MSAoQWNjZW50IDEpICovXG5cdFx0XHQvKiAyMC4xLjQuMS4yIGFjY2VudDIgKEFjY2VudCAyKSAqL1xuXHRcdFx0LyogMjAuMS40LjEuMyBhY2NlbnQzIChBY2NlbnQgMykgKi9cblx0XHRcdC8qIDIwLjEuNC4xLjQgYWNjZW50NCAoQWNjZW50IDQpICovXG5cdFx0XHQvKiAyMC4xLjQuMS41IGFjY2VudDUgKEFjY2VudCA1KSAqL1xuXHRcdFx0LyogMjAuMS40LjEuNiBhY2NlbnQ2IChBY2NlbnQgNikgKi9cblx0XHRcdC8qIDIwLjEuNC4xLjkgZGsxIChEYXJrIDEpICovXG5cdFx0XHQvKiAyMC4xLjQuMS4xMCBkazIgKERhcmsgMikgKi9cblx0XHRcdC8qIDIwLjEuNC4xLjE1IGZvbEhsaW5rIChGb2xsb3dlZCBIeXBlcmxpbmspICovXG5cdFx0XHQvKiAyMC4xLjQuMS4xOSBobGluayAoSHlwZXJsaW5rKSAqL1xuXHRcdFx0LyogMjAuMS40LjEuMjIgbHQxIChMaWdodCAxKSAqL1xuXHRcdFx0LyogMjAuMS40LjEuMjMgbHQyIChMaWdodCAyKSAqL1xuXHRcdFx0Y2FzZSAnPGE6ZGsxPic6IGNhc2UgJzwvYTpkazE+Jzpcblx0XHRcdGNhc2UgJzxhOmx0MT4nOiBjYXNlICc8L2E6bHQxPic6XG5cdFx0XHRjYXNlICc8YTpkazI+JzogY2FzZSAnPC9hOmRrMj4nOlxuXHRcdFx0Y2FzZSAnPGE6bHQyPic6IGNhc2UgJzwvYTpsdDI+Jzpcblx0XHRcdGNhc2UgJzxhOmFjY2VudDE+JzogY2FzZSAnPC9hOmFjY2VudDE+Jzpcblx0XHRcdGNhc2UgJzxhOmFjY2VudDI+JzogY2FzZSAnPC9hOmFjY2VudDI+Jzpcblx0XHRcdGNhc2UgJzxhOmFjY2VudDM+JzogY2FzZSAnPC9hOmFjY2VudDM+Jzpcblx0XHRcdGNhc2UgJzxhOmFjY2VudDQ+JzogY2FzZSAnPC9hOmFjY2VudDQ+Jzpcblx0XHRcdGNhc2UgJzxhOmFjY2VudDU+JzogY2FzZSAnPC9hOmFjY2VudDU+Jzpcblx0XHRcdGNhc2UgJzxhOmFjY2VudDY+JzogY2FzZSAnPC9hOmFjY2VudDY+Jzpcblx0XHRcdGNhc2UgJzxhOmhsaW5rPic6IGNhc2UgJzwvYTpobGluaz4nOlxuXHRcdFx0Y2FzZSAnPGE6Zm9sSGxpbms+JzogY2FzZSAnPC9hOmZvbEhsaW5rPic6XG5cdFx0XHRcdGlmICh5WzBdLmNoYXJBdCgxKSA9PT0gJy8nKSB7XG5cdFx0XHRcdFx0dGhlbWVzLnRoZW1lRWxlbWVudHMuY2xyU2NoZW1lW1hMU1hUaGVtZUNsclNjaGVtZS5pbmRleE9mKHlbMF0pXSA9IGNvbG9yO1xuXHRcdFx0XHRcdGNvbG9yID0ge307XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0Y29sb3IubmFtZSA9IHlbMF0uc2xpY2UoMywgeVswXS5sZW5ndGggLSAxKTtcblx0XHRcdFx0fVxuXHRcdFx0XHRicmVhaztcblxuXHRcdFx0ZGVmYXVsdDogaWYob3B0cyAmJiBvcHRzLldURikgdGhyb3cgbmV3IEVycm9yKCdVbnJlY29nbml6ZWQgJyArIHlbMF0gKyAnIGluIGNsclNjaGVtZScpO1xuXHRcdH1cblx0fSk7XG59XG5cbi8qIDIwLjEuNC4xLjE4IGZvbnRTY2hlbWUgQ1RfRm9udFNjaGVtZSAqL1xuZnVuY3Rpb24gcGFyc2VfZm9udFNjaGVtZSgpIHsgfVxuXG4vKiAyMC4xLjQuMS4xNSBmbXRTY2hlbWUgQ1RfU3R5bGVNYXRyaXggKi9cbmZ1bmN0aW9uIHBhcnNlX2ZtdFNjaGVtZSgpIHsgfVxuXG52YXIgY2xyc3JlZ2V4ID0gLzxhOmNsclNjaGVtZShbXj5dKik+W1xcc1xcU10qPFxcL2E6Y2xyU2NoZW1lPi87XG52YXIgZm50c3JlZ2V4ID0gLzxhOmZvbnRTY2hlbWUoW14+XSopPltcXHNcXFNdKjxcXC9hOmZvbnRTY2hlbWU+LztcbnZhciBmbXRzcmVnZXggPSAvPGE6Zm10U2NoZW1lKFtePl0qKT5bXFxzXFxTXSo8XFwvYTpmbXRTY2hlbWU+LztcblxuLyogMjAuMS42LjEwIHRoZW1lRWxlbWVudHMgQ1RfQmFzZVN0eWxlcyAqL1xuZnVuY3Rpb24gcGFyc2VfdGhlbWVFbGVtZW50cyhkYXRhLCB0aGVtZXMsIG9wdHMpIHtcblx0dGhlbWVzLnRoZW1lRWxlbWVudHMgPSB7fTtcblxuXHR2YXIgdDtcblxuXHRbXG5cdFx0LyogY2xyU2NoZW1lIENUX0NvbG9yU2NoZW1lICovXG5cdFx0WydjbHJTY2hlbWUnLCBjbHJzcmVnZXgsIHBhcnNlX2NsclNjaGVtZV0sXG5cdFx0LyogZm9udFNjaGVtZSBDVF9Gb250U2NoZW1lICovXG5cdFx0Wydmb250U2NoZW1lJywgZm50c3JlZ2V4LCBwYXJzZV9mb250U2NoZW1lXSxcblx0XHQvKiBmbXRTY2hlbWUgQ1RfU3R5bGVNYXRyaXggKi9cblx0XHRbJ2ZtdFNjaGVtZScsIGZtdHNyZWdleCwgcGFyc2VfZm10U2NoZW1lXVxuXHRdLmZvckVhY2goZnVuY3Rpb24obSkge1xuXHRcdGlmKCEodD1kYXRhLm1hdGNoKG1bMV0pKSkgdGhyb3cgbmV3IEVycm9yKG1bMF0gKyAnIG5vdCBmb3VuZCBpbiB0aGVtZUVsZW1lbnRzJyk7XG5cdFx0bVsyXSh0LCB0aGVtZXMsIG9wdHMpO1xuXHR9KTtcbn1cblxudmFyIHRoZW1lbHRyZWdleCA9IC88YTp0aGVtZUVsZW1lbnRzKFtePl0qKT5bXFxzXFxTXSo8XFwvYTp0aGVtZUVsZW1lbnRzPi87XG5cbi8qIDE0LjIuNyBUaGVtZSBQYXJ0ICovXG5mdW5jdGlvbiBwYXJzZV90aGVtZV94bWwoZGF0YSwgb3B0cykge1xuXHQvKiAyMC4xLjYuOSB0aGVtZSBDVF9PZmZpY2VTdHlsZVNoZWV0ICovXG5cdGlmKCFkYXRhIHx8IGRhdGEubGVuZ3RoID09PSAwKSByZXR1cm4gcGFyc2VfdGhlbWVfeG1sKHdyaXRlX3RoZW1lKCkpO1xuXG5cdHZhciB0O1xuXHR2YXIgdGhlbWVzID0ge307XG5cblx0LyogdGhlbWVFbGVtZW50cyBDVF9CYXNlU3R5bGVzICovXG5cdGlmKCEodD1kYXRhLm1hdGNoKHRoZW1lbHRyZWdleCkpKSB0aHJvdyBuZXcgRXJyb3IoJ3RoZW1lRWxlbWVudHMgbm90IGZvdW5kIGluIHRoZW1lJyk7XG5cdHBhcnNlX3RoZW1lRWxlbWVudHModFswXSwgdGhlbWVzLCBvcHRzKTtcblx0dGhlbWVzLnJhdyA9IGRhdGE7XG5cdHJldHVybiB0aGVtZXM7XG59XG5cbmZ1bmN0aW9uIHdyaXRlX3RoZW1lKFRoZW1lcywgb3B0cykge1xuXHRpZihvcHRzICYmIG9wdHMudGhlbWVYTFNYKSByZXR1cm4gb3B0cy50aGVtZVhMU1g7XG5cdGlmKFRoZW1lcyAmJiB0eXBlb2YgVGhlbWVzLnJhdyA9PSBcInN0cmluZ1wiKSByZXR1cm4gVGhlbWVzLnJhdztcblx0dmFyIG8gPSBbWE1MX0hFQURFUl07XG5cdG9bby5sZW5ndGhdID0gJzxhOnRoZW1lIHhtbG5zOmE9XCJodHRwOi8vc2NoZW1hcy5vcGVueG1sZm9ybWF0cy5vcmcvZHJhd2luZ21sLzIwMDYvbWFpblwiIG5hbWU9XCJPZmZpY2UgVGhlbWVcIj4nO1xuXHRvW28ubGVuZ3RoXSA9ICAnPGE6dGhlbWVFbGVtZW50cz4nO1xuXG5cdG9bby5sZW5ndGhdID0gICAnPGE6Y2xyU2NoZW1lIG5hbWU9XCJPZmZpY2VcIj4nO1xuXHRvW28ubGVuZ3RoXSA9ICAgICc8YTpkazE+PGE6c3lzQ2xyIHZhbD1cIndpbmRvd1RleHRcIiBsYXN0Q2xyPVwiMDAwMDAwXCIvPjwvYTpkazE+Jztcblx0b1tvLmxlbmd0aF0gPSAgICAnPGE6bHQxPjxhOnN5c0NsciB2YWw9XCJ3aW5kb3dcIiBsYXN0Q2xyPVwiRkZGRkZGXCIvPjwvYTpsdDE+Jztcblx0b1tvLmxlbmd0aF0gPSAgICAnPGE6ZGsyPjxhOnNyZ2JDbHIgdmFsPVwiMUY0OTdEXCIvPjwvYTpkazI+Jztcblx0b1tvLmxlbmd0aF0gPSAgICAnPGE6bHQyPjxhOnNyZ2JDbHIgdmFsPVwiRUVFQ0UxXCIvPjwvYTpsdDI+Jztcblx0b1tvLmxlbmd0aF0gPSAgICAnPGE6YWNjZW50MT48YTpzcmdiQ2xyIHZhbD1cIjRGODFCRFwiLz48L2E6YWNjZW50MT4nO1xuXHRvW28ubGVuZ3RoXSA9ICAgICc8YTphY2NlbnQyPjxhOnNyZ2JDbHIgdmFsPVwiQzA1MDREXCIvPjwvYTphY2NlbnQyPic7XG5cdG9bby5sZW5ndGhdID0gICAgJzxhOmFjY2VudDM+PGE6c3JnYkNsciB2YWw9XCI5QkJCNTlcIi8+PC9hOmFjY2VudDM+Jztcblx0b1tvLmxlbmd0aF0gPSAgICAnPGE6YWNjZW50ND48YTpzcmdiQ2xyIHZhbD1cIjgwNjRBMlwiLz48L2E6YWNjZW50ND4nO1xuXHRvW28ubGVuZ3RoXSA9ICAgICc8YTphY2NlbnQ1PjxhOnNyZ2JDbHIgdmFsPVwiNEJBQ0M2XCIvPjwvYTphY2NlbnQ1Pic7XG5cdG9bby5sZW5ndGhdID0gICAgJzxhOmFjY2VudDY+PGE6c3JnYkNsciB2YWw9XCJGNzk2NDZcIi8+PC9hOmFjY2VudDY+Jztcblx0b1tvLmxlbmd0aF0gPSAgICAnPGE6aGxpbms+PGE6c3JnYkNsciB2YWw9XCIwMDAwRkZcIi8+PC9hOmhsaW5rPic7XG5cdG9bby5sZW5ndGhdID0gICAgJzxhOmZvbEhsaW5rPjxhOnNyZ2JDbHIgdmFsPVwiODAwMDgwXCIvPjwvYTpmb2xIbGluaz4nO1xuXHRvW28ubGVuZ3RoXSA9ICAgJzwvYTpjbHJTY2hlbWU+JztcblxuXHRvW28ubGVuZ3RoXSA9ICAgJzxhOmZvbnRTY2hlbWUgbmFtZT1cIk9mZmljZVwiPic7XG5cdG9bby5sZW5ndGhdID0gICAgJzxhOm1ham9yRm9udD4nO1xuXHRvW28ubGVuZ3RoXSA9ICAgICAnPGE6bGF0aW4gdHlwZWZhY2U9XCJDYW1icmlhXCIvPic7XG5cdG9bby5sZW5ndGhdID0gICAgICc8YTplYSB0eXBlZmFjZT1cIlwiLz4nO1xuXHRvW28ubGVuZ3RoXSA9ICAgICAnPGE6Y3MgdHlwZWZhY2U9XCJcIi8+Jztcblx0b1tvLmxlbmd0aF0gPSAgICAgJzxhOmZvbnQgc2NyaXB0PVwiSnBhblwiIHR5cGVmYWNlPVwi77yt77yzIO+8sOOCtOOCt+ODg+OCr1wiLz4nO1xuXHRvW28ubGVuZ3RoXSA9ICAgICAnPGE6Zm9udCBzY3JpcHQ9XCJIYW5nXCIgdHlwZWZhY2U9XCLrp5HsnYAg6rOg65SVXCIvPic7XG5cdG9bby5sZW5ndGhdID0gICAgICc8YTpmb250IHNjcmlwdD1cIkhhbnNcIiB0eXBlZmFjZT1cIuWui+S9k1wiLz4nO1xuXHRvW28ubGVuZ3RoXSA9ICAgICAnPGE6Zm9udCBzY3JpcHQ9XCJIYW50XCIgdHlwZWZhY2U9XCLmlrDntLDmmI7pq5RcIi8+Jztcblx0b1tvLmxlbmd0aF0gPSAgICAgJzxhOmZvbnQgc2NyaXB0PVwiQXJhYlwiIHR5cGVmYWNlPVwiVGltZXMgTmV3IFJvbWFuXCIvPic7XG5cdG9bby5sZW5ndGhdID0gICAgICc8YTpmb250IHNjcmlwdD1cIkhlYnJcIiB0eXBlZmFjZT1cIlRpbWVzIE5ldyBSb21hblwiLz4nO1xuXHRvW28ubGVuZ3RoXSA9ICAgICAnPGE6Zm9udCBzY3JpcHQ9XCJUaGFpXCIgdHlwZWZhY2U9XCJUYWhvbWFcIi8+Jztcblx0b1tvLmxlbmd0aF0gPSAgICAgJzxhOmZvbnQgc2NyaXB0PVwiRXRoaVwiIHR5cGVmYWNlPVwiTnlhbGFcIi8+Jztcblx0b1tvLmxlbmd0aF0gPSAgICAgJzxhOmZvbnQgc2NyaXB0PVwiQmVuZ1wiIHR5cGVmYWNlPVwiVnJpbmRhXCIvPic7XG5cdG9bby5sZW5ndGhdID0gICAgICc8YTpmb250IHNjcmlwdD1cIkd1anJcIiB0eXBlZmFjZT1cIlNocnV0aVwiLz4nO1xuXHRvW28ubGVuZ3RoXSA9ICAgICAnPGE6Zm9udCBzY3JpcHQ9XCJLaG1yXCIgdHlwZWZhY2U9XCJNb29sQm9yYW5cIi8+Jztcblx0b1tvLmxlbmd0aF0gPSAgICAgJzxhOmZvbnQgc2NyaXB0PVwiS25kYVwiIHR5cGVmYWNlPVwiVHVuZ2FcIi8+Jztcblx0b1tvLmxlbmd0aF0gPSAgICAgJzxhOmZvbnQgc2NyaXB0PVwiR3VydVwiIHR5cGVmYWNlPVwiUmFhdmlcIi8+Jztcblx0b1tvLmxlbmd0aF0gPSAgICAgJzxhOmZvbnQgc2NyaXB0PVwiQ2Fuc1wiIHR5cGVmYWNlPVwiRXVwaGVtaWFcIi8+Jztcblx0b1tvLmxlbmd0aF0gPSAgICAgJzxhOmZvbnQgc2NyaXB0PVwiQ2hlclwiIHR5cGVmYWNlPVwiUGxhbnRhZ2VuZXQgQ2hlcm9rZWVcIi8+Jztcblx0b1tvLmxlbmd0aF0gPSAgICAgJzxhOmZvbnQgc2NyaXB0PVwiWWlpaVwiIHR5cGVmYWNlPVwiTWljcm9zb2Z0IFlpIEJhaXRpXCIvPic7XG5cdG9bby5sZW5ndGhdID0gICAgICc8YTpmb250IHNjcmlwdD1cIlRpYnRcIiB0eXBlZmFjZT1cIk1pY3Jvc29mdCBIaW1hbGF5YVwiLz4nO1xuXHRvW28ubGVuZ3RoXSA9ICAgICAnPGE6Zm9udCBzY3JpcHQ9XCJUaGFhXCIgdHlwZWZhY2U9XCJNViBCb2xpXCIvPic7XG5cdG9bby5sZW5ndGhdID0gICAgICc8YTpmb250IHNjcmlwdD1cIkRldmFcIiB0eXBlZmFjZT1cIk1hbmdhbFwiLz4nO1xuXHRvW28ubGVuZ3RoXSA9ICAgICAnPGE6Zm9udCBzY3JpcHQ9XCJUZWx1XCIgdHlwZWZhY2U9XCJHYXV0YW1pXCIvPic7XG5cdG9bby5sZW5ndGhdID0gICAgICc8YTpmb250IHNjcmlwdD1cIlRhbWxcIiB0eXBlZmFjZT1cIkxhdGhhXCIvPic7XG5cdG9bby5sZW5ndGhdID0gICAgICc8YTpmb250IHNjcmlwdD1cIlN5cmNcIiB0eXBlZmFjZT1cIkVzdHJhbmdlbG8gRWRlc3NhXCIvPic7XG5cdG9bby5sZW5ndGhdID0gICAgICc8YTpmb250IHNjcmlwdD1cIk9yeWFcIiB0eXBlZmFjZT1cIkthbGluZ2FcIi8+Jztcblx0b1tvLmxlbmd0aF0gPSAgICAgJzxhOmZvbnQgc2NyaXB0PVwiTWx5bVwiIHR5cGVmYWNlPVwiS2FydGlrYVwiLz4nO1xuXHRvW28ubGVuZ3RoXSA9ICAgICAnPGE6Zm9udCBzY3JpcHQ9XCJMYW9vXCIgdHlwZWZhY2U9XCJEb2tDaGFtcGFcIi8+Jztcblx0b1tvLmxlbmd0aF0gPSAgICAgJzxhOmZvbnQgc2NyaXB0PVwiU2luaFwiIHR5cGVmYWNlPVwiSXNrb29sYSBQb3RhXCIvPic7XG5cdG9bby5sZW5ndGhdID0gICAgICc8YTpmb250IHNjcmlwdD1cIk1vbmdcIiB0eXBlZmFjZT1cIk1vbmdvbGlhbiBCYWl0aVwiLz4nO1xuXHRvW28ubGVuZ3RoXSA9ICAgICAnPGE6Zm9udCBzY3JpcHQ9XCJWaWV0XCIgdHlwZWZhY2U9XCJUaW1lcyBOZXcgUm9tYW5cIi8+Jztcblx0b1tvLmxlbmd0aF0gPSAgICAgJzxhOmZvbnQgc2NyaXB0PVwiVWlnaFwiIHR5cGVmYWNlPVwiTWljcm9zb2Z0IFVpZ2h1clwiLz4nO1xuXHRvW28ubGVuZ3RoXSA9ICAgICAnPGE6Zm9udCBzY3JpcHQ9XCJHZW9yXCIgdHlwZWZhY2U9XCJTeWxmYWVuXCIvPic7XG5cdG9bby5sZW5ndGhdID0gICAgJzwvYTptYWpvckZvbnQ+Jztcblx0b1tvLmxlbmd0aF0gPSAgICAnPGE6bWlub3JGb250Pic7XG5cdG9bby5sZW5ndGhdID0gICAgICc8YTpsYXRpbiB0eXBlZmFjZT1cIkNhbGlicmlcIi8+Jztcblx0b1tvLmxlbmd0aF0gPSAgICAgJzxhOmVhIHR5cGVmYWNlPVwiXCIvPic7XG5cdG9bby5sZW5ndGhdID0gICAgICc8YTpjcyB0eXBlZmFjZT1cIlwiLz4nO1xuXHRvW28ubGVuZ3RoXSA9ICAgICAnPGE6Zm9udCBzY3JpcHQ9XCJKcGFuXCIgdHlwZWZhY2U9XCLvvK3vvLMg77yw44K044K344OD44KvXCIvPic7XG5cdG9bby5sZW5ndGhdID0gICAgICc8YTpmb250IHNjcmlwdD1cIkhhbmdcIiB0eXBlZmFjZT1cIuunkeydgCDqs6DrlJVcIi8+Jztcblx0b1tvLmxlbmd0aF0gPSAgICAgJzxhOmZvbnQgc2NyaXB0PVwiSGFuc1wiIHR5cGVmYWNlPVwi5a6L5L2TXCIvPic7XG5cdG9bby5sZW5ndGhdID0gICAgICc8YTpmb250IHNjcmlwdD1cIkhhbnRcIiB0eXBlZmFjZT1cIuaWsOe0sOaYjumrlFwiLz4nO1xuXHRvW28ubGVuZ3RoXSA9ICAgICAnPGE6Zm9udCBzY3JpcHQ9XCJBcmFiXCIgdHlwZWZhY2U9XCJBcmlhbFwiLz4nO1xuXHRvW28ubGVuZ3RoXSA9ICAgICAnPGE6Zm9udCBzY3JpcHQ9XCJIZWJyXCIgdHlwZWZhY2U9XCJBcmlhbFwiLz4nO1xuXHRvW28ubGVuZ3RoXSA9ICAgICAnPGE6Zm9udCBzY3JpcHQ9XCJUaGFpXCIgdHlwZWZhY2U9XCJUYWhvbWFcIi8+Jztcblx0b1tvLmxlbmd0aF0gPSAgICAgJzxhOmZvbnQgc2NyaXB0PVwiRXRoaVwiIHR5cGVmYWNlPVwiTnlhbGFcIi8+Jztcblx0b1tvLmxlbmd0aF0gPSAgICAgJzxhOmZvbnQgc2NyaXB0PVwiQmVuZ1wiIHR5cGVmYWNlPVwiVnJpbmRhXCIvPic7XG5cdG9bby5sZW5ndGhdID0gICAgICc8YTpmb250IHNjcmlwdD1cIkd1anJcIiB0eXBlZmFjZT1cIlNocnV0aVwiLz4nO1xuXHRvW28ubGVuZ3RoXSA9ICAgICAnPGE6Zm9udCBzY3JpcHQ9XCJLaG1yXCIgdHlwZWZhY2U9XCJEYXVuUGVuaFwiLz4nO1xuXHRvW28ubGVuZ3RoXSA9ICAgICAnPGE6Zm9udCBzY3JpcHQ9XCJLbmRhXCIgdHlwZWZhY2U9XCJUdW5nYVwiLz4nO1xuXHRvW28ubGVuZ3RoXSA9ICAgICAnPGE6Zm9udCBzY3JpcHQ9XCJHdXJ1XCIgdHlwZWZhY2U9XCJSYWF2aVwiLz4nO1xuXHRvW28ubGVuZ3RoXSA9ICAgICAnPGE6Zm9udCBzY3JpcHQ9XCJDYW5zXCIgdHlwZWZhY2U9XCJFdXBoZW1pYVwiLz4nO1xuXHRvW28ubGVuZ3RoXSA9ICAgICAnPGE6Zm9udCBzY3JpcHQ9XCJDaGVyXCIgdHlwZWZhY2U9XCJQbGFudGFnZW5ldCBDaGVyb2tlZVwiLz4nO1xuXHRvW28ubGVuZ3RoXSA9ICAgICAnPGE6Zm9udCBzY3JpcHQ9XCJZaWlpXCIgdHlwZWZhY2U9XCJNaWNyb3NvZnQgWWkgQmFpdGlcIi8+Jztcblx0b1tvLmxlbmd0aF0gPSAgICAgJzxhOmZvbnQgc2NyaXB0PVwiVGlidFwiIHR5cGVmYWNlPVwiTWljcm9zb2Z0IEhpbWFsYXlhXCIvPic7XG5cdG9bby5sZW5ndGhdID0gICAgICc8YTpmb250IHNjcmlwdD1cIlRoYWFcIiB0eXBlZmFjZT1cIk1WIEJvbGlcIi8+Jztcblx0b1tvLmxlbmd0aF0gPSAgICAgJzxhOmZvbnQgc2NyaXB0PVwiRGV2YVwiIHR5cGVmYWNlPVwiTWFuZ2FsXCIvPic7XG5cdG9bby5sZW5ndGhdID0gICAgICc8YTpmb250IHNjcmlwdD1cIlRlbHVcIiB0eXBlZmFjZT1cIkdhdXRhbWlcIi8+Jztcblx0b1tvLmxlbmd0aF0gPSAgICAgJzxhOmZvbnQgc2NyaXB0PVwiVGFtbFwiIHR5cGVmYWNlPVwiTGF0aGFcIi8+Jztcblx0b1tvLmxlbmd0aF0gPSAgICAgJzxhOmZvbnQgc2NyaXB0PVwiU3lyY1wiIHR5cGVmYWNlPVwiRXN0cmFuZ2VsbyBFZGVzc2FcIi8+Jztcblx0b1tvLmxlbmd0aF0gPSAgICAgJzxhOmZvbnQgc2NyaXB0PVwiT3J5YVwiIHR5cGVmYWNlPVwiS2FsaW5nYVwiLz4nO1xuXHRvW28ubGVuZ3RoXSA9ICAgICAnPGE6Zm9udCBzY3JpcHQ9XCJNbHltXCIgdHlwZWZhY2U9XCJLYXJ0aWthXCIvPic7XG5cdG9bby5sZW5ndGhdID0gICAgICc8YTpmb250IHNjcmlwdD1cIkxhb29cIiB0eXBlZmFjZT1cIkRva0NoYW1wYVwiLz4nO1xuXHRvW28ubGVuZ3RoXSA9ICAgICAnPGE6Zm9udCBzY3JpcHQ9XCJTaW5oXCIgdHlwZWZhY2U9XCJJc2tvb2xhIFBvdGFcIi8+Jztcblx0b1tvLmxlbmd0aF0gPSAgICAgJzxhOmZvbnQgc2NyaXB0PVwiTW9uZ1wiIHR5cGVmYWNlPVwiTW9uZ29saWFuIEJhaXRpXCIvPic7XG5cdG9bby5sZW5ndGhdID0gICAgICc8YTpmb250IHNjcmlwdD1cIlZpZXRcIiB0eXBlZmFjZT1cIkFyaWFsXCIvPic7XG5cdG9bby5sZW5ndGhdID0gICAgICc8YTpmb250IHNjcmlwdD1cIlVpZ2hcIiB0eXBlZmFjZT1cIk1pY3Jvc29mdCBVaWdodXJcIi8+Jztcblx0b1tvLmxlbmd0aF0gPSAgICAgJzxhOmZvbnQgc2NyaXB0PVwiR2VvclwiIHR5cGVmYWNlPVwiU3lsZmFlblwiLz4nO1xuXHRvW28ubGVuZ3RoXSA9ICAgICc8L2E6bWlub3JGb250Pic7XG5cdG9bby5sZW5ndGhdID0gICAnPC9hOmZvbnRTY2hlbWU+JztcblxuXHRvW28ubGVuZ3RoXSA9ICAgJzxhOmZtdFNjaGVtZSBuYW1lPVwiT2ZmaWNlXCI+Jztcblx0b1tvLmxlbmd0aF0gPSAgICAnPGE6ZmlsbFN0eWxlTHN0Pic7XG5cdG9bby5sZW5ndGhdID0gICAgICc8YTpzb2xpZEZpbGw+PGE6c2NoZW1lQ2xyIHZhbD1cInBoQ2xyXCIvPjwvYTpzb2xpZEZpbGw+Jztcblx0b1tvLmxlbmd0aF0gPSAgICAgJzxhOmdyYWRGaWxsIHJvdFdpdGhTaGFwZT1cIjFcIj4nO1xuXHRvW28ubGVuZ3RoXSA9ICAgICAgJzxhOmdzTHN0Pic7XG5cdG9bby5sZW5ndGhdID0gICAgICAgJzxhOmdzIHBvcz1cIjBcIj48YTpzY2hlbWVDbHIgdmFsPVwicGhDbHJcIj48YTp0aW50IHZhbD1cIjUwMDAwXCIvPjxhOnNhdE1vZCB2YWw9XCIzMDAwMDBcIi8+PC9hOnNjaGVtZUNscj48L2E6Z3M+Jztcblx0b1tvLmxlbmd0aF0gPSAgICAgICAnPGE6Z3MgcG9zPVwiMzUwMDBcIj48YTpzY2hlbWVDbHIgdmFsPVwicGhDbHJcIj48YTp0aW50IHZhbD1cIjM3MDAwXCIvPjxhOnNhdE1vZCB2YWw9XCIzMDAwMDBcIi8+PC9hOnNjaGVtZUNscj48L2E6Z3M+Jztcblx0b1tvLmxlbmd0aF0gPSAgICAgICAnPGE6Z3MgcG9zPVwiMTAwMDAwXCI+PGE6c2NoZW1lQ2xyIHZhbD1cInBoQ2xyXCI+PGE6dGludCB2YWw9XCIxNTAwMFwiLz48YTpzYXRNb2QgdmFsPVwiMzUwMDAwXCIvPjwvYTpzY2hlbWVDbHI+PC9hOmdzPic7XG5cdG9bby5sZW5ndGhdID0gICAgICAnPC9hOmdzTHN0Pic7XG5cdG9bby5sZW5ndGhdID0gICAgICAnPGE6bGluIGFuZz1cIjE2MjAwMDAwXCIgc2NhbGVkPVwiMVwiLz4nO1xuXHRvW28ubGVuZ3RoXSA9ICAgICAnPC9hOmdyYWRGaWxsPic7XG5cdG9bby5sZW5ndGhdID0gICAgICc8YTpncmFkRmlsbCByb3RXaXRoU2hhcGU9XCIxXCI+Jztcblx0b1tvLmxlbmd0aF0gPSAgICAgICc8YTpnc0xzdD4nO1xuXHRvW28ubGVuZ3RoXSA9ICAgICAgICc8YTpncyBwb3M9XCIwXCI+PGE6c2NoZW1lQ2xyIHZhbD1cInBoQ2xyXCI+PGE6dGludCB2YWw9XCIxMDAwMDBcIi8+PGE6c2hhZGUgdmFsPVwiMTAwMDAwXCIvPjxhOnNhdE1vZCB2YWw9XCIxMzAwMDBcIi8+PC9hOnNjaGVtZUNscj48L2E6Z3M+Jztcblx0b1tvLmxlbmd0aF0gPSAgICAgICAnPGE6Z3MgcG9zPVwiMTAwMDAwXCI+PGE6c2NoZW1lQ2xyIHZhbD1cInBoQ2xyXCI+PGE6dGludCB2YWw9XCI1MDAwMFwiLz48YTpzaGFkZSB2YWw9XCIxMDAwMDBcIi8+PGE6c2F0TW9kIHZhbD1cIjM1MDAwMFwiLz48L2E6c2NoZW1lQ2xyPjwvYTpncz4nO1xuXHRvW28ubGVuZ3RoXSA9ICAgICAgJzwvYTpnc0xzdD4nO1xuXHRvW28ubGVuZ3RoXSA9ICAgICAgJzxhOmxpbiBhbmc9XCIxNjIwMDAwMFwiIHNjYWxlZD1cIjBcIi8+Jztcblx0b1tvLmxlbmd0aF0gPSAgICAgJzwvYTpncmFkRmlsbD4nO1xuXHRvW28ubGVuZ3RoXSA9ICAgICc8L2E6ZmlsbFN0eWxlTHN0Pic7XG5cdG9bby5sZW5ndGhdID0gICAgJzxhOmxuU3R5bGVMc3Q+Jztcblx0b1tvLmxlbmd0aF0gPSAgICAgJzxhOmxuIHc9XCI5NTI1XCIgY2FwPVwiZmxhdFwiIGNtcGQ9XCJzbmdcIiBhbGduPVwiY3RyXCI+PGE6c29saWRGaWxsPjxhOnNjaGVtZUNsciB2YWw9XCJwaENsclwiPjxhOnNoYWRlIHZhbD1cIjk1MDAwXCIvPjxhOnNhdE1vZCB2YWw9XCIxMDUwMDBcIi8+PC9hOnNjaGVtZUNscj48L2E6c29saWRGaWxsPjxhOnByc3REYXNoIHZhbD1cInNvbGlkXCIvPjwvYTpsbj4nO1xuXHRvW28ubGVuZ3RoXSA9ICAgICAnPGE6bG4gdz1cIjI1NDAwXCIgY2FwPVwiZmxhdFwiIGNtcGQ9XCJzbmdcIiBhbGduPVwiY3RyXCI+PGE6c29saWRGaWxsPjxhOnNjaGVtZUNsciB2YWw9XCJwaENsclwiLz48L2E6c29saWRGaWxsPjxhOnByc3REYXNoIHZhbD1cInNvbGlkXCIvPjwvYTpsbj4nO1xuXHRvW28ubGVuZ3RoXSA9ICAgICAnPGE6bG4gdz1cIjM4MTAwXCIgY2FwPVwiZmxhdFwiIGNtcGQ9XCJzbmdcIiBhbGduPVwiY3RyXCI+PGE6c29saWRGaWxsPjxhOnNjaGVtZUNsciB2YWw9XCJwaENsclwiLz48L2E6c29saWRGaWxsPjxhOnByc3REYXNoIHZhbD1cInNvbGlkXCIvPjwvYTpsbj4nO1xuXHRvW28ubGVuZ3RoXSA9ICAgICc8L2E6bG5TdHlsZUxzdD4nO1xuXHRvW28ubGVuZ3RoXSA9ICAgICc8YTplZmZlY3RTdHlsZUxzdD4nO1xuXHRvW28ubGVuZ3RoXSA9ICAgICAnPGE6ZWZmZWN0U3R5bGU+Jztcblx0b1tvLmxlbmd0aF0gPSAgICAgICc8YTplZmZlY3RMc3Q+Jztcblx0b1tvLmxlbmd0aF0gPSAgICAgICAnPGE6b3V0ZXJTaGR3IGJsdXJSYWQ9XCI0MDAwMFwiIGRpc3Q9XCIyMDAwMFwiIGRpcj1cIjU0MDAwMDBcIiByb3RXaXRoU2hhcGU9XCIwXCI+PGE6c3JnYkNsciB2YWw9XCIwMDAwMDBcIj48YTphbHBoYSB2YWw9XCIzODAwMFwiLz48L2E6c3JnYkNscj48L2E6b3V0ZXJTaGR3Pic7XG5cdG9bby5sZW5ndGhdID0gICAgICAnPC9hOmVmZmVjdExzdD4nO1xuXHRvW28ubGVuZ3RoXSA9ICAgICAnPC9hOmVmZmVjdFN0eWxlPic7XG5cdG9bby5sZW5ndGhdID0gICAgICc8YTplZmZlY3RTdHlsZT4nO1xuXHRvW28ubGVuZ3RoXSA9ICAgICAgJzxhOmVmZmVjdExzdD4nO1xuXHRvW28ubGVuZ3RoXSA9ICAgICAgICc8YTpvdXRlclNoZHcgYmx1clJhZD1cIjQwMDAwXCIgZGlzdD1cIjIzMDAwXCIgZGlyPVwiNTQwMDAwMFwiIHJvdFdpdGhTaGFwZT1cIjBcIj48YTpzcmdiQ2xyIHZhbD1cIjAwMDAwMFwiPjxhOmFscGhhIHZhbD1cIjM1MDAwXCIvPjwvYTpzcmdiQ2xyPjwvYTpvdXRlclNoZHc+Jztcblx0b1tvLmxlbmd0aF0gPSAgICAgICc8L2E6ZWZmZWN0THN0Pic7XG5cdG9bby5sZW5ndGhdID0gICAgICc8L2E6ZWZmZWN0U3R5bGU+Jztcblx0b1tvLmxlbmd0aF0gPSAgICAgJzxhOmVmZmVjdFN0eWxlPic7XG5cdG9bby5sZW5ndGhdID0gICAgICAnPGE6ZWZmZWN0THN0Pic7XG5cdG9bby5sZW5ndGhdID0gICAgICAgJzxhOm91dGVyU2hkdyBibHVyUmFkPVwiNDAwMDBcIiBkaXN0PVwiMjMwMDBcIiBkaXI9XCI1NDAwMDAwXCIgcm90V2l0aFNoYXBlPVwiMFwiPjxhOnNyZ2JDbHIgdmFsPVwiMDAwMDAwXCI+PGE6YWxwaGEgdmFsPVwiMzUwMDBcIi8+PC9hOnNyZ2JDbHI+PC9hOm91dGVyU2hkdz4nO1xuXHRvW28ubGVuZ3RoXSA9ICAgICAgJzwvYTplZmZlY3RMc3Q+Jztcblx0b1tvLmxlbmd0aF0gPSAgICAgICc8YTpzY2VuZTNkPjxhOmNhbWVyYSBwcnN0PVwib3J0aG9ncmFwaGljRnJvbnRcIj48YTpyb3QgbGF0PVwiMFwiIGxvbj1cIjBcIiByZXY9XCIwXCIvPjwvYTpjYW1lcmE+PGE6bGlnaHRSaWcgcmlnPVwidGhyZWVQdFwiIGRpcj1cInRcIj48YTpyb3QgbGF0PVwiMFwiIGxvbj1cIjBcIiByZXY9XCIxMjAwMDAwXCIvPjwvYTpsaWdodFJpZz48L2E6c2NlbmUzZD4nO1xuXHRvW28ubGVuZ3RoXSA9ICAgICAgJzxhOnNwM2Q+PGE6YmV2ZWxUIHc9XCI2MzUwMFwiIGg9XCIyNTQwMFwiLz48L2E6c3AzZD4nO1xuXHRvW28ubGVuZ3RoXSA9ICAgICAnPC9hOmVmZmVjdFN0eWxlPic7XG5cdG9bby5sZW5ndGhdID0gICAgJzwvYTplZmZlY3RTdHlsZUxzdD4nO1xuXHRvW28ubGVuZ3RoXSA9ICAgICc8YTpiZ0ZpbGxTdHlsZUxzdD4nO1xuXHRvW28ubGVuZ3RoXSA9ICAgICAnPGE6c29saWRGaWxsPjxhOnNjaGVtZUNsciB2YWw9XCJwaENsclwiLz48L2E6c29saWRGaWxsPic7XG5cdG9bby5sZW5ndGhdID0gICAgICc8YTpncmFkRmlsbCByb3RXaXRoU2hhcGU9XCIxXCI+Jztcblx0b1tvLmxlbmd0aF0gPSAgICAgICc8YTpnc0xzdD4nO1xuXHRvW28ubGVuZ3RoXSA9ICAgICAgICc8YTpncyBwb3M9XCIwXCI+PGE6c2NoZW1lQ2xyIHZhbD1cInBoQ2xyXCI+PGE6dGludCB2YWw9XCI0MDAwMFwiLz48YTpzYXRNb2QgdmFsPVwiMzUwMDAwXCIvPjwvYTpzY2hlbWVDbHI+PC9hOmdzPic7XG5cdG9bby5sZW5ndGhdID0gICAgICAgJzxhOmdzIHBvcz1cIjQwMDAwXCI+PGE6c2NoZW1lQ2xyIHZhbD1cInBoQ2xyXCI+PGE6dGludCB2YWw9XCI0NTAwMFwiLz48YTpzaGFkZSB2YWw9XCI5OTAwMFwiLz48YTpzYXRNb2QgdmFsPVwiMzUwMDAwXCIvPjwvYTpzY2hlbWVDbHI+PC9hOmdzPic7XG5cdG9bby5sZW5ndGhdID0gICAgICAgJzxhOmdzIHBvcz1cIjEwMDAwMFwiPjxhOnNjaGVtZUNsciB2YWw9XCJwaENsclwiPjxhOnNoYWRlIHZhbD1cIjIwMDAwXCIvPjxhOnNhdE1vZCB2YWw9XCIyNTUwMDBcIi8+PC9hOnNjaGVtZUNscj48L2E6Z3M+Jztcblx0b1tvLmxlbmd0aF0gPSAgICAgICc8L2E6Z3NMc3Q+Jztcblx0b1tvLmxlbmd0aF0gPSAgICAgICc8YTpwYXRoIHBhdGg9XCJjaXJjbGVcIj48YTpmaWxsVG9SZWN0IGw9XCI1MDAwMFwiIHQ9XCItODAwMDBcIiByPVwiNTAwMDBcIiBiPVwiMTgwMDAwXCIvPjwvYTpwYXRoPic7XG5cdG9bby5sZW5ndGhdID0gICAgICc8L2E6Z3JhZEZpbGw+Jztcblx0b1tvLmxlbmd0aF0gPSAgICAgJzxhOmdyYWRGaWxsIHJvdFdpdGhTaGFwZT1cIjFcIj4nO1xuXHRvW28ubGVuZ3RoXSA9ICAgICAgJzxhOmdzTHN0Pic7XG5cdG9bby5sZW5ndGhdID0gICAgICAgJzxhOmdzIHBvcz1cIjBcIj48YTpzY2hlbWVDbHIgdmFsPVwicGhDbHJcIj48YTp0aW50IHZhbD1cIjgwMDAwXCIvPjxhOnNhdE1vZCB2YWw9XCIzMDAwMDBcIi8+PC9hOnNjaGVtZUNscj48L2E6Z3M+Jztcblx0b1tvLmxlbmd0aF0gPSAgICAgICAnPGE6Z3MgcG9zPVwiMTAwMDAwXCI+PGE6c2NoZW1lQ2xyIHZhbD1cInBoQ2xyXCI+PGE6c2hhZGUgdmFsPVwiMzAwMDBcIi8+PGE6c2F0TW9kIHZhbD1cIjIwMDAwMFwiLz48L2E6c2NoZW1lQ2xyPjwvYTpncz4nO1xuXHRvW28ubGVuZ3RoXSA9ICAgICAgJzwvYTpnc0xzdD4nO1xuXHRvW28ubGVuZ3RoXSA9ICAgICAgJzxhOnBhdGggcGF0aD1cImNpcmNsZVwiPjxhOmZpbGxUb1JlY3QgbD1cIjUwMDAwXCIgdD1cIjUwMDAwXCIgcj1cIjUwMDAwXCIgYj1cIjUwMDAwXCIvPjwvYTpwYXRoPic7XG5cdG9bby5sZW5ndGhdID0gICAgICc8L2E6Z3JhZEZpbGw+Jztcblx0b1tvLmxlbmd0aF0gPSAgICAnPC9hOmJnRmlsbFN0eWxlTHN0Pic7XG5cdG9bby5sZW5ndGhdID0gICAnPC9hOmZtdFNjaGVtZT4nO1xuXHRvW28ubGVuZ3RoXSA9ICAnPC9hOnRoZW1lRWxlbWVudHM+JztcblxuXHRvW28ubGVuZ3RoXSA9ICAnPGE6b2JqZWN0RGVmYXVsdHM+Jztcblx0b1tvLmxlbmd0aF0gPSAgICc8YTpzcERlZj4nO1xuXHRvW28ubGVuZ3RoXSA9ICAgICc8YTpzcFByLz48YTpib2R5UHIvPjxhOmxzdFN0eWxlLz48YTpzdHlsZT48YTpsblJlZiBpZHg9XCIxXCI+PGE6c2NoZW1lQ2xyIHZhbD1cImFjY2VudDFcIi8+PC9hOmxuUmVmPjxhOmZpbGxSZWYgaWR4PVwiM1wiPjxhOnNjaGVtZUNsciB2YWw9XCJhY2NlbnQxXCIvPjwvYTpmaWxsUmVmPjxhOmVmZmVjdFJlZiBpZHg9XCIyXCI+PGE6c2NoZW1lQ2xyIHZhbD1cImFjY2VudDFcIi8+PC9hOmVmZmVjdFJlZj48YTpmb250UmVmIGlkeD1cIm1pbm9yXCI+PGE6c2NoZW1lQ2xyIHZhbD1cImx0MVwiLz48L2E6Zm9udFJlZj48L2E6c3R5bGU+Jztcblx0b1tvLmxlbmd0aF0gPSAgICc8L2E6c3BEZWY+Jztcblx0b1tvLmxlbmd0aF0gPSAgICc8YTpsbkRlZj4nO1xuXHRvW28ubGVuZ3RoXSA9ICAgICc8YTpzcFByLz48YTpib2R5UHIvPjxhOmxzdFN0eWxlLz48YTpzdHlsZT48YTpsblJlZiBpZHg9XCIyXCI+PGE6c2NoZW1lQ2xyIHZhbD1cImFjY2VudDFcIi8+PC9hOmxuUmVmPjxhOmZpbGxSZWYgaWR4PVwiMFwiPjxhOnNjaGVtZUNsciB2YWw9XCJhY2NlbnQxXCIvPjwvYTpmaWxsUmVmPjxhOmVmZmVjdFJlZiBpZHg9XCIxXCI+PGE6c2NoZW1lQ2xyIHZhbD1cImFjY2VudDFcIi8+PC9hOmVmZmVjdFJlZj48YTpmb250UmVmIGlkeD1cIm1pbm9yXCI+PGE6c2NoZW1lQ2xyIHZhbD1cInR4MVwiLz48L2E6Zm9udFJlZj48L2E6c3R5bGU+Jztcblx0b1tvLmxlbmd0aF0gPSAgICc8L2E6bG5EZWY+Jztcblx0b1tvLmxlbmd0aF0gPSAgJzwvYTpvYmplY3REZWZhdWx0cz4nO1xuXHRvW28ubGVuZ3RoXSA9ICAnPGE6ZXh0cmFDbHJTY2hlbWVMc3QvPic7XG5cdG9bby5sZW5ndGhdID0gJzwvYTp0aGVtZT4nO1xuXHRyZXR1cm4gby5qb2luKFwiXCIpO1xufVxuLyogW01TLVhMU10gMi40LjMyNiBUT0RPOiBwYXlsb2FkIGlzIGEgemlwIGZpbGUgKi9cbmZ1bmN0aW9uIHBhcnNlX1RoZW1lKGJsb2IsIGxlbmd0aCwgb3B0cykge1xuXHR2YXIgZW5kID0gYmxvYi5sICsgbGVuZ3RoO1xuXHR2YXIgZHdUaGVtZVZlcnNpb24gPSBibG9iLnJlYWRfc2hpZnQoNCk7XG5cdGlmKGR3VGhlbWVWZXJzaW9uID09PSAxMjQyMjYpIHJldHVybjtcblx0aWYoIW9wdHMuY2VsbFN0eWxlcyB8fCAhanN6aXApIHsgYmxvYi5sID0gZW5kOyByZXR1cm47IH1cblx0dmFyIGRhdGEgPSBibG9iLnNsaWNlKGJsb2IubCk7XG5cdGJsb2IubCA9IGVuZDtcblx0dmFyIHppcDsgdHJ5IHsgemlwID0gbmV3IGpzemlwKGRhdGEpOyB9IGNhdGNoKGUpIHsgcmV0dXJuOyB9XG5cdHZhciB0aGVtZVhNTCA9IGdldHppcHN0cih6aXAsIFwidGhlbWUvdGhlbWUvdGhlbWUxLnhtbFwiLCB0cnVlKTtcblx0aWYoIXRoZW1lWE1MKSByZXR1cm47XG5cdHJldHVybiBwYXJzZV90aGVtZV94bWwodGhlbWVYTUwsIG9wdHMpO1xufVxuXG4vKiAyLjUuNDkgKi9cbmZ1bmN0aW9uIHBhcnNlX0NvbG9yVGhlbWUoYmxvYikgeyByZXR1cm4gYmxvYi5yZWFkX3NoaWZ0KDQpOyB9XG5cbi8qIDIuNS4xNTUgKi9cbmZ1bmN0aW9uIHBhcnNlX0Z1bGxDb2xvckV4dChibG9iKSB7XG5cdHZhciBvID0ge307XG5cdG8ueGNsclR5cGUgPSBibG9iLnJlYWRfc2hpZnQoMik7XG5cdG8ublRpbnRTaGFkZSA9IGJsb2IucmVhZF9zaGlmdCgyKTtcblx0c3dpdGNoKG8ueGNsclR5cGUpIHtcblx0XHRjYXNlIDA6IGJsb2IubCArPSA0OyBicmVhaztcblx0XHRjYXNlIDE6IG8ueGNsclZhbHVlID0gcGFyc2VfSWN2WEYoYmxvYiwgNCk7IGJyZWFrO1xuXHRcdGNhc2UgMjogby54Y2xyVmFsdWUgPSBwYXJzZV9Mb25nUkdCQShibG9iLCA0KTsgYnJlYWs7XG5cdFx0Y2FzZSAzOiBvLnhjbHJWYWx1ZSA9IHBhcnNlX0NvbG9yVGhlbWUoYmxvYiwgNCk7IGJyZWFrO1xuXHRcdGNhc2UgNDogYmxvYi5sICs9IDQ7IGJyZWFrO1xuXHR9XG5cdGJsb2IubCArPSA4O1xuXHRyZXR1cm4gbztcbn1cblxuLyogMi41LjE2NCBUT0RPOiByZWFkIDcgYml0cyovXG5mdW5jdGlvbiBwYXJzZV9JY3ZYRihibG9iLCBsZW5ndGgpIHtcblx0cmV0dXJuIHBhcnNlbm9vcChibG9iLCBsZW5ndGgpO1xufVxuXG4vKiAyLjUuMjgwICovXG5mdW5jdGlvbiBwYXJzZV9YRkV4dEdyYWRpZW50KGJsb2IsIGxlbmd0aCkge1xuXHRyZXR1cm4gcGFyc2Vub29wKGJsb2IsIGxlbmd0aCk7XG59XG5cbi8qIFtNUy1YTFNdIDIuNS4xMDggKi9cbmZ1bmN0aW9uIHBhcnNlX0V4dFByb3AoYmxvYikge1xuXHR2YXIgZXh0VHlwZSA9IGJsb2IucmVhZF9zaGlmdCgyKTtcblx0dmFyIGNiID0gYmxvYi5yZWFkX3NoaWZ0KDIpIC0gNDtcblx0dmFyIG8gPSBbZXh0VHlwZV07XG5cdHN3aXRjaChleHRUeXBlKSB7XG5cdFx0Y2FzZSAweDA0OiBjYXNlIDB4MDU6IGNhc2UgMHgwNzogY2FzZSAweDA4OlxuXHRcdGNhc2UgMHgwOTogY2FzZSAweDBBOiBjYXNlIDB4MEI6IGNhc2UgMHgwRDpcblx0XHRcdG9bMV0gPSBwYXJzZV9GdWxsQ29sb3JFeHQoYmxvYiwgY2IpOyBicmVhaztcblx0XHRjYXNlIDB4MDY6IG9bMV0gPSBwYXJzZV9YRkV4dEdyYWRpZW50KGJsb2IsIGNiKTsgYnJlYWs7XG5cdFx0Y2FzZSAweDBFOiBjYXNlIDB4MEY6IG9bMV0gPSBibG9iLnJlYWRfc2hpZnQoY2IgPT09IDEgPyAxIDogMik7IGJyZWFrO1xuXHRcdGRlZmF1bHQ6IHRocm93IG5ldyBFcnJvcihcIlVucmVjb2duaXplZCBFeHRQcm9wIHR5cGU6IFwiICsgZXh0VHlwZSArIFwiIFwiICsgY2IpO1xuXHR9XG5cdHJldHVybiBvO1xufVxuXG4vKiAyLjQuMzU1ICovXG5mdW5jdGlvbiBwYXJzZV9YRkV4dChibG9iLCBsZW5ndGgpIHtcblx0dmFyIGVuZCA9IGJsb2IubCArIGxlbmd0aDtcblx0YmxvYi5sICs9IDI7XG5cdHZhciBpeGZlID0gYmxvYi5yZWFkX3NoaWZ0KDIpO1xuXHRibG9iLmwgKz0gMjtcblx0dmFyIGNleHRzID0gYmxvYi5yZWFkX3NoaWZ0KDIpO1xuXHR2YXIgZXh0ID0gW107XG5cdHdoaWxlKGNleHRzLS0gPiAwKSBleHQucHVzaChwYXJzZV9FeHRQcm9wKGJsb2IsIGVuZC1ibG9iLmwpKTtcblx0cmV0dXJuIHtpeGZlOml4ZmUsIGV4dDpleHR9O1xufVxuXG4vKiB4ZiBpcyBhbiBYRiwgc2VlIHBhcnNlX1hGRXh0IGZvciB4ZmV4dCAqL1xuZnVuY3Rpb24gdXBkYXRlX3hmZXh0KHhmLCB4ZmV4dCkge1xuXHR4ZmV4dC5mb3JFYWNoKGZ1bmN0aW9uKHhmZSkge1xuXHRcdHN3aXRjaCh4ZmVbMF0pIHsgLyogMi41LjEwOCBleHRQcm9wRGF0YSAqL1xuXHRcdFx0Y2FzZSAweDA0OiBicmVhazsgLyogZm9yZWdyb3VuZCBjb2xvciAqL1xuXHRcdFx0Y2FzZSAweDA1OiBicmVhazsgLyogYmFja2dyb3VuZCBjb2xvciAqL1xuXHRcdFx0Y2FzZSAweDA2OiBicmVhazsgLyogZ3JhZGllbnQgZmlsbCAqL1xuXHRcdFx0Y2FzZSAweDA3OiBicmVhazsgLyogdG9wIGNlbGwgYm9yZGVyIGNvbG9yICovXG5cdFx0XHRjYXNlIDB4MDg6IGJyZWFrOyAvKiBib3R0b20gY2VsbCBib3JkZXIgY29sb3IgKi9cblx0XHRcdGNhc2UgMHgwOTogYnJlYWs7IC8qIGxlZnQgY2VsbCBib3JkZXIgY29sb3IgKi9cblx0XHRcdGNhc2UgMHgwYTogYnJlYWs7IC8qIHJpZ2h0IGNlbGwgYm9yZGVyIGNvbG9yICovXG5cdFx0XHRjYXNlIDB4MGI6IGJyZWFrOyAvKiBkaWFnb25hbCBjZWxsIGJvcmRlciBjb2xvciAqL1xuXHRcdFx0Y2FzZSAweDBkOiAvKiB0ZXh0IGNvbG9yICovXG5cdFx0XHRcdGJyZWFrO1xuXHRcdFx0Y2FzZSAweDBlOiBicmVhazsgLyogZm9udCBzY2hlbWUgKi9cblx0XHRcdGNhc2UgMHgwZjogYnJlYWs7IC8qIGluZGVudGF0aW9uIGxldmVsICovXG5cdFx0fVxuXHR9KTtcbn1cblxuLyogMTguNiBDYWxjdWxhdGlvbiBDaGFpbiAqL1xuZnVuY3Rpb24gcGFyc2VfY2NfeG1sKGRhdGEpIHtcblx0dmFyIGQgPSBbXTtcblx0aWYoIWRhdGEpIHJldHVybiBkO1xuXHR2YXIgaSA9IDE7XG5cdChkYXRhLm1hdGNoKHRhZ3JlZ2V4KXx8W10pLmZvckVhY2goZnVuY3Rpb24oeCkge1xuXHRcdHZhciB5ID0gcGFyc2V4bWx0YWcoeCk7XG5cdFx0c3dpdGNoKHlbMF0pIHtcblx0XHRcdGNhc2UgJzw/eG1sJzogYnJlYWs7XG5cdFx0XHQvKiAxOC42LjIgIGNhbGNDaGFpbiBDVF9DYWxjQ2hhaW4gMSAqL1xuXHRcdFx0Y2FzZSAnPGNhbGNDaGFpbic6IGNhc2UgJzxjYWxjQ2hhaW4+JzogY2FzZSAnPC9jYWxjQ2hhaW4+JzogYnJlYWs7XG5cdFx0XHQvKiAxOC42LjEgIGMgQ1RfQ2FsY0NlbGwgMSAqL1xuXHRcdFx0Y2FzZSAnPGMnOiBkZWxldGUgeVswXTsgaWYoeS5pKSBpID0geS5pOyBlbHNlIHkuaSA9IGk7IGQucHVzaCh5KTsgYnJlYWs7XG5cdFx0fVxuXHR9KTtcblx0cmV0dXJuIGQ7XG59XG5cbi8vZnVuY3Rpb24gd3JpdGVfY2NfeG1sKGRhdGEsIG9wdHMpIHsgfVxuXG4vKiBbTVMtWExTQl0gMi42LjQuMSAqL1xuZnVuY3Rpb24gcGFyc2VfQnJ0Q2FsY0NoYWluSXRlbSQoZGF0YSkge1xuXHR2YXIgb3V0ID0ge307XG5cdG91dC5pID0gZGF0YS5yZWFkX3NoaWZ0KDQpO1xuXHR2YXIgY2VsbCA9IHt9O1xuXHRjZWxsLnIgPSBkYXRhLnJlYWRfc2hpZnQoNCk7XG5cdGNlbGwuYyA9IGRhdGEucmVhZF9zaGlmdCg0KTtcblx0b3V0LnIgPSBlbmNvZGVfY2VsbChjZWxsKTtcblx0dmFyIGZsYWdzID0gZGF0YS5yZWFkX3NoaWZ0KDEpO1xuXHRpZihmbGFncyAmIDB4Mikgb3V0LmwgPSAnMSc7XG5cdGlmKGZsYWdzICYgMHg4KSBvdXQuYSA9ICcxJztcblx0cmV0dXJuIG91dDtcbn1cblxuLyogMTguNiBDYWxjdWxhdGlvbiBDaGFpbiAqL1xuZnVuY3Rpb24gcGFyc2VfY2NfYmluKGRhdGEsIG5hbWUsIG9wdHMpIHtcblx0dmFyIG91dCA9IFtdO1xuXHR2YXIgcGFzcyA9IGZhbHNlO1xuXHRyZWNvcmRob3BwZXIoZGF0YSwgZnVuY3Rpb24gaG9wcGVyX2NjKHZhbCwgUl9uLCBSVCkge1xuXHRcdHN3aXRjaChSVCkge1xuXHRcdFx0Y2FzZSAweDAwM0Y6IC8qICdCcnRDYWxjQ2hhaW5JdGVtJCcgKi9cblx0XHRcdFx0b3V0LnB1c2godmFsKTsgYnJlYWs7XG5cblx0XHRcdGRlZmF1bHQ6XG5cdFx0XHRcdGlmKChSX258fFwiXCIpLmluZGV4T2YoXCJCZWdpblwiKSA+IDApey8qIGVtcHR5ICovfVxuXHRcdFx0XHRlbHNlIGlmKChSX258fFwiXCIpLmluZGV4T2YoXCJFbmRcIikgPiAwKXsvKiBlbXB0eSAqL31cblx0XHRcdFx0ZWxzZSBpZighcGFzcyB8fCBvcHRzLldURikgdGhyb3cgbmV3IEVycm9yKFwiVW5leHBlY3RlZCByZWNvcmQgXCIgKyBSVCArIFwiIFwiICsgUl9uKTtcblx0XHR9XG5cdH0pO1xuXHRyZXR1cm4gb3V0O1xufVxuXG4vL2Z1bmN0aW9uIHdyaXRlX2NjX2JpbihkYXRhLCBvcHRzKSB7IH1cbi8qIDE4LjE0IFN1cHBsZW1lbnRhcnkgV29ya2Jvb2sgRGF0YSAqL1xuZnVuY3Rpb24gcGFyc2VfeGxpbmtfeG1sKCkge1xuXHQvL3ZhciBvcHRzID0gX29wdHMgfHwge307XG5cdC8vaWYob3B0cy5XVEYpIHRocm93IFwiWExTWCBFeHRlcm5hbCBMaW5rXCI7XG59XG5cbi8qIFtNUy1YTFNCXSAyLjEuNy4yNSBFeHRlcm5hbCBMaW5rICovXG5mdW5jdGlvbiBwYXJzZV94bGlua19iaW4oZGF0YSwgcmVsLCBuYW1lLCBfb3B0cykge1xuXHRpZighZGF0YSkgcmV0dXJuIGRhdGE7XG5cdHZhciBvcHRzID0gX29wdHMgfHwge307XG5cblx0dmFyIHBhc3MgPSBmYWxzZSwgZW5kID0gZmFsc2U7XG5cblx0cmVjb3JkaG9wcGVyKGRhdGEsIGZ1bmN0aW9uIHhsaW5rX3BhcnNlKHZhbCwgUl9uLCBSVCkge1xuXHRcdGlmKGVuZCkgcmV0dXJuO1xuXHRcdHN3aXRjaChSVCkge1xuXHRcdFx0Y2FzZSAweDAxNjc6IC8qICdCcnRTdXBUYWJzJyAqL1xuXHRcdFx0Y2FzZSAweDAxNkI6IC8qICdCcnRFeHRlcm5UYWJsZVN0YXJ0JyAqL1xuXHRcdFx0Y2FzZSAweDAxNkM6IC8qICdCcnRFeHRlcm5UYWJsZUVuZCcgKi9cblx0XHRcdGNhc2UgMHgwMTZFOiAvKiAnQnJ0RXh0ZXJuUm93SGRyJyAqL1xuXHRcdFx0Y2FzZSAweDAxNkY6IC8qICdCcnRFeHRlcm5DZWxsQmxhbmsnICovXG5cdFx0XHRjYXNlIDB4MDE3MDogLyogJ0JydEV4dGVybkNlbGxSZWFsJyAqL1xuXHRcdFx0Y2FzZSAweDAxNzE6IC8qICdCcnRFeHRlcm5DZWxsQm9vbCcgKi9cblx0XHRcdGNhc2UgMHgwMTcyOiAvKiAnQnJ0RXh0ZXJuQ2VsbEVycm9yJyAqL1xuXHRcdFx0Y2FzZSAweDAxNzM6IC8qICdCcnRFeHRlcm5DZWxsU3RyaW5nJyAqL1xuXHRcdFx0Y2FzZSAweDAxRDg6IC8qICdCcnRFeHRlcm5WYWx1ZU1ldGEnICovXG5cdFx0XHRjYXNlIDB4MDI0MTogLyogJ0JydFN1cE5hbWVTdGFydCcgKi9cblx0XHRcdGNhc2UgMHgwMjQyOiAvKiAnQnJ0U3VwTmFtZVZhbHVlU3RhcnQnICovXG5cdFx0XHRjYXNlIDB4MDI0MzogLyogJ0JydFN1cE5hbWVWYWx1ZUVuZCcgKi9cblx0XHRcdGNhc2UgMHgwMjQ0OiAvKiAnQnJ0U3VwTmFtZU51bScgKi9cblx0XHRcdGNhc2UgMHgwMjQ1OiAvKiAnQnJ0U3VwTmFtZUVycicgKi9cblx0XHRcdGNhc2UgMHgwMjQ2OiAvKiAnQnJ0U3VwTmFtZVN0JyAqL1xuXHRcdFx0Y2FzZSAweDAyNDc6IC8qICdCcnRTdXBOYW1lTmlsJyAqL1xuXHRcdFx0Y2FzZSAweDAyNDg6IC8qICdCcnRTdXBOYW1lQm9vbCcgKi9cblx0XHRcdGNhc2UgMHgwMjQ5OiAvKiAnQnJ0U3VwTmFtZUZtbGEnICovXG5cdFx0XHRjYXNlIDB4MDI0QTogLyogJ0JydFN1cE5hbWVCaXRzJyAqL1xuXHRcdFx0Y2FzZSAweDAyNEI6IC8qICdCcnRTdXBOYW1lRW5kJyAqL1xuXHRcdFx0XHRicmVhaztcblxuXHRcdFx0Y2FzZSAweDAwMjM6IC8qICdCcnRGUlRCZWdpbicgKi9cblx0XHRcdFx0cGFzcyA9IHRydWU7IGJyZWFrO1xuXHRcdFx0Y2FzZSAweDAwMjQ6IC8qICdCcnRGUlRFbmQnICovXG5cdFx0XHRcdHBhc3MgPSBmYWxzZTsgYnJlYWs7XG5cblx0XHRcdGRlZmF1bHQ6XG5cdFx0XHRcdGlmKChSX258fFwiXCIpLmluZGV4T2YoXCJCZWdpblwiKSA+IDApey8qIGVtcHR5ICovfVxuXHRcdFx0XHRlbHNlIGlmKChSX258fFwiXCIpLmluZGV4T2YoXCJFbmRcIikgPiAwKXsvKiBlbXB0eSAqL31cblx0XHRcdFx0ZWxzZSBpZighcGFzcyB8fCBvcHRzLldURikgdGhyb3cgbmV3IEVycm9yKFwiVW5leHBlY3RlZCByZWNvcmQgXCIgKyBSVC50b1N0cmluZygxNikgKyBcIiBcIiArIFJfbik7XG5cdFx0fVxuXHR9LCBvcHRzKTtcbn1cbi8qIDIwLjUgRHJhd2luZ01MIC0gU3ByZWFkc2hlZXRNTCBEcmF3aW5nICovXG5SRUxTLklNRyA9IFwiaHR0cDovL3NjaGVtYXMub3BlbnhtbGZvcm1hdHMub3JnL29mZmljZURvY3VtZW50LzIwMDYvcmVsYXRpb25zaGlwcy9pbWFnZVwiO1xuUkVMUy5EUkFXID0gXCJodHRwOi8vc2NoZW1hcy5vcGVueG1sZm9ybWF0cy5vcmcvb2ZmaWNlRG9jdW1lbnQvMjAwNi9yZWxhdGlvbnNoaXBzL2RyYXdpbmdcIjtcblxuLyogMjAuNS4yLjM1IHdzRHIgQ1RfRHJhd2luZyAqL1xuZnVuY3Rpb24gcGFyc2VfZHJhd2luZyhkYXRhLCByZWxzKSB7XG5cdGlmKCFkYXRhKSByZXR1cm4gXCI/P1wiO1xuXHQvKlxuXHQgIENoYXJ0c2hlZXQgRHJhd2luZzpcblx0ICAgLSAyMC41LjIuMzUgd3NEciBDVF9EcmF3aW5nXG5cdCAgICAtIDIwLjUuMi4xICBhYnNvbHV0ZUFuY2hvciBDVF9BYnNvbHV0ZUFuY2hvclxuXHQgICAgIC0gMjAuNS4yLjE2IGdyYXBoaWNGcmFtZSBDVF9HcmFwaGljYWxPYmplY3RGcmFtZVxuXHQgICAgICAtIDIwLjEuMi4yLjE2IGdyYXBoaWMgQ1RfR3JhcGhpY2FsT2JqZWN0XG5cdCAgICAgICAtIDIwLjEuMi4yLjE3IGdyYXBoaWNEYXRhIENUX0dyYXBoaWNhbE9iamVjdERhdGFcbiAgICAgICAgICAtIGNoYXJ0IHJlZmVyZW5jZVxuXHQgICB0aGUgYWN0dWFsIHR5cGUgaXMgYmFzZWQgb24gdGhlIFVSSSBvZiB0aGUgZ3JhcGhpY0RhdGFcblx0XHRUT0RPOiBoYW5kbGUgZW1iZWRkZWQgY2hhcnRzIGFuZCBvdGhlciB0eXBlcyBvZiBncmFwaGljc1xuXHQqL1xuXHR2YXIgaWQgPSAoZGF0YS5tYXRjaCgvPGM6Y2hhcnQgW14+XSpyOmlkPVwiKFteXCJdKilcIi8pfHxbXCJcIixcIlwiXSlbMV07XG5cblx0cmV0dXJuIHJlbHNbJyFpZCddW2lkXS5UYXJnZXQ7XG59XG5cbi8qIEwuNS41LjIgU3ByZWFkc2hlZXRNTCBDb21tZW50cyArIFZNTCBTY2hlbWEgKi9cbnZhciBfc2hhcGVpZCA9IDEwMjQ7XG5mdW5jdGlvbiB3cml0ZV9jb21tZW50c192bWwocklkLCBjb21tZW50cykge1xuXHR2YXIgY3NpemUgPSBbMjE2MDAsIDIxNjAwXTtcblx0LyogTC41LjIuMS4yIFBhdGggQXR0cmlidXRlICovXG5cdHZhciBiYm94ID0gW1wibTAsMGwwXCIsY3NpemVbMV0sY3NpemVbMF0sY3NpemVbMV0sY3NpemVbMF0sXCIweGVcIl0uam9pbihcIixcIik7XG5cdHZhciBvID0gW1xuXHRcdHdyaXRleHRhZyhcInhtbFwiLCBudWxsLCB7ICd4bWxuczp2JzogWExNTE5TLnYsICd4bWxuczpvJzogWExNTE5TLm8sICd4bWxuczp4JzogWExNTE5TLngsICd4bWxuczptdic6IFhMTUxOUy5tdiB9KS5yZXBsYWNlKC9cXC8+LyxcIj5cIiksXG5cdFx0d3JpdGV4dGFnKFwibzpzaGFwZWxheW91dFwiLCB3cml0ZXh0YWcoXCJvOmlkbWFwXCIsIG51bGwsIHsndjpleHQnOlwiZWRpdFwiLCAnZGF0YSc6cklkfSksIHsndjpleHQnOlwiZWRpdFwifSksXG5cdFx0d3JpdGV4dGFnKFwidjpzaGFwZXR5cGVcIiwgW1xuXHRcdFx0d3JpdGV4dGFnKFwidjpzdHJva2VcIiwgbnVsbCwge2pvaW5zdHlsZTpcIm1pdGVyXCJ9KSxcblx0XHRcdHdyaXRleHRhZyhcInY6cGF0aFwiLCBudWxsLCB7Z3JhZGllbnRzaGFwZW9rOlwidFwiLCAnbzpjb25uZWN0dHlwZSc6XCJyZWN0XCJ9KVxuXHRcdF0uam9pbihcIlwiKSwge2lkOlwiX3gwMDAwX3QyMDJcIiwgJ286c3B0JzoyMDIsIGNvb3Jkc2l6ZTpjc2l6ZS5qb2luKFwiLFwiKSxwYXRoOmJib3h9KVxuXHRdO1xuXHR3aGlsZShfc2hhcGVpZCA8IHJJZCAqIDEwMDApIF9zaGFwZWlkICs9IDEwMDA7XG5cblx0Y29tbWVudHMuZm9yRWFjaChmdW5jdGlvbih4KSB7XG5cdHZhciBjID0gZGVjb2RlX2NlbGwoeFswXSk7XG5cdHZhciBmaWxsb3B0cyA9IHsnY29sb3IyJzpcIiNCRUZGODJcIiwgJ3R5cGUnOlwiZ3JhZGllbnRcIn07XG5cdGlmKGZpbGxvcHRzLnR5cGUgPT0gXCJncmFkaWVudFwiKSBmaWxsb3B0cy5hbmdsZSA9IFwiLTE4MFwiO1xuXHR2YXIgZmlsbHBhcm0gPSBmaWxsb3B0cy50eXBlID09IFwiZ3JhZGllbnRcIiA/IHdyaXRleHRhZyhcIm86ZmlsbFwiLCBudWxsLCB7dHlwZTpcImdyYWRpZW50VW5zY2FsZWRcIiwgJ3Y6ZXh0JzpcInZpZXdcIn0pIDogbnVsbDtcblx0dmFyIGZpbGx4bWwgPSB3cml0ZXh0YWcoJ3Y6ZmlsbCcsIGZpbGxwYXJtLCBmaWxsb3B0cyk7XG5cblx0dmFyIHNoYWRhdGEgPSAoe29uOlwidFwiLCAnb2JzY3VyZWQnOlwidFwifSk7XG5cdCsrX3NoYXBlaWQ7XG5cblx0byA9IG8uY29uY2F0KFtcblx0Jzx2OnNoYXBlJyArIHd4dF9oZWxwZXIoe1xuXHRcdGlkOidfeDAwMDBfcycgKyBfc2hhcGVpZCxcblx0XHR0eXBlOlwiI194MDAwMF90MjAyXCIsXG5cdFx0c3R5bGU6XCJwb3NpdGlvbjphYnNvbHV0ZTsgbWFyZ2luLWxlZnQ6ODBwdDttYXJnaW4tdG9wOjVwdDt3aWR0aDoxMDRwdDtoZWlnaHQ6NjRwdDt6LWluZGV4OjEwXCIgKyAoeFsxXS5oaWRkZW4gPyBcIjt2aXNpYmlsaXR5OmhpZGRlblwiIDogXCJcIikgLFxuXHRcdGZpbGxjb2xvcjpcIiNFQ0ZBRDRcIixcblx0XHRzdHJva2Vjb2xvcjpcIiNlZGVhYTFcIlxuXHR9KSArICc+Jyxcblx0XHRmaWxseG1sLFxuXHRcdHdyaXRleHRhZyhcInY6c2hhZG93XCIsIG51bGwsIHNoYWRhdGEpLFxuXHRcdHdyaXRleHRhZyhcInY6cGF0aFwiLCBudWxsLCB7J286Y29ubmVjdHR5cGUnOlwibm9uZVwifSksXG5cdFx0Jzx2OnRleHRib3g+PGRpdiBzdHlsZT1cInRleHQtYWxpZ246bGVmdFwiPjwvZGl2Pjwvdjp0ZXh0Ym94PicsXG5cdFx0Jzx4OkNsaWVudERhdGEgT2JqZWN0VHlwZT1cIk5vdGVcIj4nLFxuXHRcdFx0Jzx4Ok1vdmVXaXRoQ2VsbHMvPicsXG5cdFx0XHQnPHg6U2l6ZVdpdGhDZWxscy8+Jyxcblx0XHRcdC8qIFBhcnQgNCAxOS40LjIuMyBBbmNob3IgKEFuY2hvcikgKi9cblx0XHRcdHdyaXRldGFnKCd4OkFuY2hvcicsIFtjLmMrMSwgMCwgYy5yKzEsIDAsIGMuYyszLCAyMCwgYy5yKzUsIDIwXS5qb2luKFwiLFwiKSksXG5cdFx0XHR3cml0ZXRhZygneDpBdXRvRmlsbCcsIFwiRmFsc2VcIiksXG5cdFx0XHR3cml0ZXRhZygneDpSb3cnLCBTdHJpbmcoYy5yKSksXG5cdFx0XHR3cml0ZXRhZygneDpDb2x1bW4nLCBTdHJpbmcoYy5jKSksXG5cdFx0XHR4WzFdLmhpZGRlbiA/ICcnIDogJzx4OlZpc2libGUvPicsXG5cdFx0JzwveDpDbGllbnREYXRhPicsXG5cdCc8L3Y6c2hhcGU+J1xuXHRdKTsgfSk7XG5cdG8ucHVzaCgnPC94bWw+Jyk7XG5cdHJldHVybiBvLmpvaW4oXCJcIik7XG59XG5SRUxTLkNNTlQgPSBcImh0dHA6Ly9zY2hlbWFzLm9wZW54bWxmb3JtYXRzLm9yZy9vZmZpY2VEb2N1bWVudC8yMDA2L3JlbGF0aW9uc2hpcHMvY29tbWVudHNcIjtcblxuZnVuY3Rpb24gc2hlZXRfaW5zZXJ0X2NvbW1lbnRzKHNoZWV0LCBjb21tZW50cykge1xuXHR2YXIgZGVuc2UgPSBBcnJheS5pc0FycmF5KHNoZWV0KTtcblx0dmFyIGNlbGw7XG5cdGNvbW1lbnRzLmZvckVhY2goZnVuY3Rpb24oY29tbWVudCkge1xuXHRcdHZhciByID0gZGVjb2RlX2NlbGwoY29tbWVudC5yZWYpO1xuXHRcdGlmKGRlbnNlKSB7XG5cdFx0XHRpZighc2hlZXRbci5yXSkgc2hlZXRbci5yXSA9IFtdO1xuXHRcdFx0Y2VsbCA9IHNoZWV0W3Iucl1bci5jXTtcblx0XHR9IGVsc2UgY2VsbCA9IHNoZWV0W2NvbW1lbnQucmVmXTtcblx0XHRpZiAoIWNlbGwpIHtcblx0XHRcdGNlbGwgPSAoe3Q6XCJ6XCJ9KTtcblx0XHRcdGlmKGRlbnNlKSBzaGVldFtyLnJdW3IuY10gPSBjZWxsO1xuXHRcdFx0ZWxzZSBzaGVldFtjb21tZW50LnJlZl0gPSBjZWxsO1xuXHRcdFx0dmFyIHJhbmdlID0gc2FmZV9kZWNvZGVfcmFuZ2Uoc2hlZXRbXCIhcmVmXCJdfHxcIkJEV0dPMTAwMDAwMTpBMVwiKTtcblx0XHRcdGlmKHJhbmdlLnMuciA+IHIucikgcmFuZ2Uucy5yID0gci5yO1xuXHRcdFx0aWYocmFuZ2UuZS5yIDwgci5yKSByYW5nZS5lLnIgPSByLnI7XG5cdFx0XHRpZihyYW5nZS5zLmMgPiByLmMpIHJhbmdlLnMuYyA9IHIuYztcblx0XHRcdGlmKHJhbmdlLmUuYyA8IHIuYykgcmFuZ2UuZS5jID0gci5jO1xuXHRcdFx0dmFyIGVuY29kZWQgPSBlbmNvZGVfcmFuZ2UocmFuZ2UpO1xuXHRcdFx0aWYgKGVuY29kZWQgIT09IHNoZWV0W1wiIXJlZlwiXSkgc2hlZXRbXCIhcmVmXCJdID0gZW5jb2RlZDtcblx0XHR9XG5cblx0XHRpZiAoIWNlbGwuYykgY2VsbC5jID0gW107XG5cdFx0dmFyIG8gPSAoe2E6IGNvbW1lbnQuYXV0aG9yLCB0OiBjb21tZW50LnQsIHI6IGNvbW1lbnQucn0pO1xuXHRcdGlmKGNvbW1lbnQuaCkgby5oID0gY29tbWVudC5oO1xuXHRcdGNlbGwuYy5wdXNoKG8pO1xuXHR9KTtcbn1cblxuLyogMTguNyBDb21tZW50cyAqL1xuZnVuY3Rpb24gcGFyc2VfY29tbWVudHNfeG1sKGRhdGEsIG9wdHMpIHtcblx0LyogMTguNy42IENUX0NvbW1lbnRzICovXG5cdGlmKGRhdGEubWF0Y2goLzwoPzpcXHcrOik/Y29tbWVudHMgKlxcLz4vKSkgcmV0dXJuIFtdO1xuXHR2YXIgYXV0aG9ycyA9IFtdO1xuXHR2YXIgY29tbWVudExpc3QgPSBbXTtcblx0dmFyIGF1dGh0YWcgPSBkYXRhLm1hdGNoKC88KD86XFx3KzopP2F1dGhvcnM+KFtcXHNcXFNdKik8XFwvKD86XFx3KzopP2F1dGhvcnM+Lyk7XG5cdGlmKGF1dGh0YWcgJiYgYXV0aHRhZ1sxXSkgYXV0aHRhZ1sxXS5zcGxpdCgvPFxcL1xcdyo6P2F1dGhvcj4vKS5mb3JFYWNoKGZ1bmN0aW9uKHgpIHtcblx0XHRpZih4ID09PSBcIlwiIHx8IHgudHJpbSgpID09PSBcIlwiKSByZXR1cm47XG5cdFx0dmFyIGEgPSB4Lm1hdGNoKC88KD86XFx3KzopP2F1dGhvcltePl0qPiguKikvKTtcblx0XHRpZihhKSBhdXRob3JzLnB1c2goYVsxXSk7XG5cdH0pO1xuXHR2YXIgY21udHRhZyA9IGRhdGEubWF0Y2goLzwoPzpcXHcrOik/Y29tbWVudExpc3Q+KFtcXHNcXFNdKik8XFwvKD86XFx3KzopP2NvbW1lbnRMaXN0Pi8pO1xuXHRpZihjbW50dGFnICYmIGNtbnR0YWdbMV0pIGNtbnR0YWdbMV0uc3BsaXQoLzxcXC9cXHcqOj9jb21tZW50Pi8pLmZvckVhY2goZnVuY3Rpb24oeCkge1xuXHRcdGlmKHggPT09IFwiXCIgfHwgeC50cmltKCkgPT09IFwiXCIpIHJldHVybjtcblx0XHR2YXIgY20gPSB4Lm1hdGNoKC88KD86XFx3KzopP2NvbW1lbnRbXj5dKj4vKTtcblx0XHRpZighY20pIHJldHVybjtcblx0XHR2YXIgeSA9IHBhcnNleG1sdGFnKGNtWzBdKTtcblx0XHR2YXIgY29tbWVudCA9ICh7IGF1dGhvcjogeS5hdXRob3JJZCAmJiBhdXRob3JzW3kuYXV0aG9ySWRdIHx8IFwic2hlZXRqc2dob3N0XCIsIHJlZjogeS5yZWYsIGd1aWQ6IHkuZ3VpZCB9KTtcblx0XHR2YXIgY2VsbCA9IGRlY29kZV9jZWxsKHkucmVmKTtcblx0XHRpZihvcHRzLnNoZWV0Um93cyAmJiBvcHRzLnNoZWV0Um93cyA8PSBjZWxsLnIpIHJldHVybjtcblx0XHR2YXIgdGV4dE1hdGNoID0geC5tYXRjaCgvPCg/Olxcdys6KT90ZXh0PihbXFxzXFxTXSopPFxcLyg/Olxcdys6KT90ZXh0Pi8pO1xuXHRcdHZhciBydCA9ICEhdGV4dE1hdGNoICYmICEhdGV4dE1hdGNoWzFdICYmIHBhcnNlX3NpKHRleHRNYXRjaFsxXSkgfHwge3I6XCJcIix0OlwiXCIsaDpcIlwifTtcblx0XHRjb21tZW50LnIgPSBydC5yO1xuXHRcdGlmKHJ0LnIgPT0gXCI8dD48L3Q+XCIpIHJ0LnQgPSBydC5oID0gXCJcIjtcblx0XHRjb21tZW50LnQgPSBydC50LnJlcGxhY2UoL1xcclxcbi9nLFwiXFxuXCIpLnJlcGxhY2UoL1xcci9nLFwiXFxuXCIpO1xuXHRcdGlmKG9wdHMuY2VsbEhUTUwpIGNvbW1lbnQuaCA9IHJ0Lmg7XG5cdFx0Y29tbWVudExpc3QucHVzaChjb21tZW50KTtcblx0fSk7XG5cdHJldHVybiBjb21tZW50TGlzdDtcbn1cblxudmFyIENNTlRfWE1MX1JPT1QgPSB3cml0ZXh0YWcoJ2NvbW1lbnRzJywgbnVsbCwgeyAneG1sbnMnOiBYTUxOUy5tYWluWzBdIH0pO1xuZnVuY3Rpb24gd3JpdGVfY29tbWVudHNfeG1sKGRhdGEpIHtcblx0dmFyIG8gPSBbWE1MX0hFQURFUiwgQ01OVF9YTUxfUk9PVF07XG5cblx0dmFyIGlhdXRob3IgPSBbXTtcblx0by5wdXNoKFwiPGF1dGhvcnM+XCIpO1xuXHRkYXRhLmZvckVhY2goZnVuY3Rpb24oeCkgeyB4WzFdLmZvckVhY2goZnVuY3Rpb24odykgeyB2YXIgYSA9IGVzY2FwZXhtbCh3LmEpO1xuXHRcdGlmKGlhdXRob3IuaW5kZXhPZihhKSA+IC0xKSByZXR1cm47XG5cdFx0aWF1dGhvci5wdXNoKGEpO1xuXHRcdG8ucHVzaChcIjxhdXRob3I+XCIgKyBhICsgXCI8L2F1dGhvcj5cIik7XG5cdH0pOyB9KTtcblx0by5wdXNoKFwiPC9hdXRob3JzPlwiKTtcblx0by5wdXNoKFwiPGNvbW1lbnRMaXN0PlwiKTtcblx0ZGF0YS5mb3JFYWNoKGZ1bmN0aW9uKGQpIHtcblx0XHRkWzFdLmZvckVhY2goZnVuY3Rpb24oYykge1xuXHRcdFx0LyogMTguNy4zIENUX0NvbW1lbnQgKi9cblx0XHRcdG8ucHVzaCgnPGNvbW1lbnQgcmVmPVwiJyArIGRbMF0gKyAnXCIgYXV0aG9ySWQ9XCInICsgaWF1dGhvci5pbmRleE9mKGVzY2FwZXhtbChjLmEpKSArICdcIj48dGV4dD4nKTtcblx0XHRcdG8ucHVzaCh3cml0ZXRhZyhcInRcIiwgYy50ID09IG51bGwgPyBcIlwiIDogZXNjYXBleG1sKGMudCkpKTtcblx0XHRcdG8ucHVzaCgnPC90ZXh0PjwvY29tbWVudD4nKTtcblx0XHR9KTtcblx0fSk7XG5cdG8ucHVzaChcIjwvY29tbWVudExpc3Q+XCIpO1xuXHRpZihvLmxlbmd0aD4yKSB7IG9bby5sZW5ndGhdID0gKCc8L2NvbW1lbnRzPicpOyBvWzFdPW9bMV0ucmVwbGFjZShcIi8+XCIsXCI+XCIpOyB9XG5cdHJldHVybiBvLmpvaW4oXCJcIik7XG59XG4vKiBbTVMtWExTQl0gMi40LjI4IEJydEJlZ2luQ29tbWVudCAqL1xuZnVuY3Rpb24gcGFyc2VfQnJ0QmVnaW5Db21tZW50KGRhdGEpIHtcblx0dmFyIG91dCA9IHt9O1xuXHRvdXQuaWF1dGhvciA9IGRhdGEucmVhZF9zaGlmdCg0KTtcblx0dmFyIHJmeCA9IHBhcnNlX1VuY2hlY2tlZFJmWChkYXRhLCAxNik7XG5cdG91dC5yZnggPSByZngucztcblx0b3V0LnJlZiA9IGVuY29kZV9jZWxsKHJmeC5zKTtcblx0ZGF0YS5sICs9IDE2OyAvKnZhciBndWlkID0gcGFyc2VfR1VJRChkYXRhKTsgKi9cblx0cmV0dXJuIG91dDtcbn1cbmZ1bmN0aW9uIHdyaXRlX0JydEJlZ2luQ29tbWVudChkYXRhLCBvKSB7XG5cdGlmKG8gPT0gbnVsbCkgbyA9IG5ld19idWYoMzYpO1xuXHRvLndyaXRlX3NoaWZ0KDQsIGRhdGFbMV0uaWF1dGhvcik7XG5cdHdyaXRlX1VuY2hlY2tlZFJmWCgoZGF0YVswXSksIG8pO1xuXHRvLndyaXRlX3NoaWZ0KDQsIDApO1xuXHRvLndyaXRlX3NoaWZ0KDQsIDApO1xuXHRvLndyaXRlX3NoaWZ0KDQsIDApO1xuXHRvLndyaXRlX3NoaWZ0KDQsIDApO1xuXHRyZXR1cm4gbztcbn1cblxuLyogW01TLVhMU0JdIDIuNC4zMjcgQnJ0Q29tbWVudEF1dGhvciAqL1xudmFyIHBhcnNlX0JydENvbW1lbnRBdXRob3IgPSBwYXJzZV9YTFdpZGVTdHJpbmc7XG5mdW5jdGlvbiB3cml0ZV9CcnRDb21tZW50QXV0aG9yKGRhdGEpIHsgcmV0dXJuIHdyaXRlX1hMV2lkZVN0cmluZyhkYXRhLnNsaWNlKDAsIDU0KSk7IH1cblxuLyogW01TLVhMU0JdIDIuMS43LjggQ29tbWVudHMgKi9cbmZ1bmN0aW9uIHBhcnNlX2NvbW1lbnRzX2JpbihkYXRhLCBvcHRzKSB7XG5cdHZhciBvdXQgPSBbXTtcblx0dmFyIGF1dGhvcnMgPSBbXTtcblx0dmFyIGMgPSB7fTtcblx0dmFyIHBhc3MgPSBmYWxzZTtcblx0cmVjb3JkaG9wcGVyKGRhdGEsIGZ1bmN0aW9uIGhvcHBlcl9jbW50KHZhbCwgUl9uLCBSVCkge1xuXHRcdHN3aXRjaChSVCkge1xuXHRcdFx0Y2FzZSAweDAyNzg6IC8qICdCcnRDb21tZW50QXV0aG9yJyAqL1xuXHRcdFx0XHRhdXRob3JzLnB1c2godmFsKTsgYnJlYWs7XG5cdFx0XHRjYXNlIDB4MDI3QjogLyogJ0JydEJlZ2luQ29tbWVudCcgKi9cblx0XHRcdFx0YyA9IHZhbDsgYnJlYWs7XG5cdFx0XHRjYXNlIDB4MDI3RDogLyogJ0JydENvbW1lbnRUZXh0JyAqL1xuXHRcdFx0XHRjLnQgPSB2YWwudDsgYy5oID0gdmFsLmg7IGMuciA9IHZhbC5yOyBicmVhaztcblx0XHRcdGNhc2UgMHgwMjdDOiAvKiAnQnJ0RW5kQ29tbWVudCcgKi9cblx0XHRcdFx0Yy5hdXRob3IgPSBhdXRob3JzW2MuaWF1dGhvcl07XG5cdFx0XHRcdGRlbGV0ZSAoYykuaWF1dGhvcjtcblx0XHRcdFx0aWYob3B0cy5zaGVldFJvd3MgJiYgYy5yZnggJiYgb3B0cy5zaGVldFJvd3MgPD0gYy5yZngucikgYnJlYWs7XG5cdFx0XHRcdGlmKCFjLnQpIGMudCA9IFwiXCI7XG5cdFx0XHRcdGRlbGV0ZSBjLnJmeDsgb3V0LnB1c2goYyk7IGJyZWFrO1xuXG5cdFx0XHRjYXNlIDB4MEMwMDogLyogJ0JydFVpZCcgKi9cblx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdGNhc2UgMHgwMDIzOiAvKiAnQnJ0RlJUQmVnaW4nICovXG5cdFx0XHRcdHBhc3MgPSB0cnVlOyBicmVhaztcblx0XHRcdGNhc2UgMHgwMDI0OiAvKiAnQnJ0RlJURW5kJyAqL1xuXHRcdFx0XHRwYXNzID0gZmFsc2U7IGJyZWFrO1xuXHRcdFx0Y2FzZSAweDAwMjU6IC8qICdCcnRBQ0JlZ2luJyAqLyBicmVhaztcblx0XHRcdGNhc2UgMHgwMDI2OiAvKiAnQnJ0QUNFbmQnICovIGJyZWFrO1xuXG5cblx0XHRcdGRlZmF1bHQ6XG5cdFx0XHRcdGlmKChSX258fFwiXCIpLmluZGV4T2YoXCJCZWdpblwiKSA+IDApey8qIGVtcHR5ICovfVxuXHRcdFx0XHRlbHNlIGlmKChSX258fFwiXCIpLmluZGV4T2YoXCJFbmRcIikgPiAwKXsvKiBlbXB0eSAqL31cblx0XHRcdFx0ZWxzZSBpZighcGFzcyB8fCBvcHRzLldURikgdGhyb3cgbmV3IEVycm9yKFwiVW5leHBlY3RlZCByZWNvcmQgXCIgKyBSVCArIFwiIFwiICsgUl9uKTtcblx0XHR9XG5cdH0pO1xuXHRyZXR1cm4gb3V0O1xufVxuXG5mdW5jdGlvbiB3cml0ZV9jb21tZW50c19iaW4oZGF0YSkge1xuXHR2YXIgYmEgPSBidWZfYXJyYXkoKTtcblx0dmFyIGlhdXRob3IgPSBbXTtcblx0d3JpdGVfcmVjb3JkKGJhLCBcIkJydEJlZ2luQ29tbWVudHNcIik7XG5cblx0d3JpdGVfcmVjb3JkKGJhLCBcIkJydEJlZ2luQ29tbWVudEF1dGhvcnNcIik7XG5cdGRhdGEuZm9yRWFjaChmdW5jdGlvbihjb21tZW50KSB7XG5cdFx0Y29tbWVudFsxXS5mb3JFYWNoKGZ1bmN0aW9uKGMpIHtcblx0XHRcdGlmKGlhdXRob3IuaW5kZXhPZihjLmEpID4gLTEpIHJldHVybjtcblx0XHRcdGlhdXRob3IucHVzaChjLmEuc2xpY2UoMCw1NCkpO1xuXHRcdFx0d3JpdGVfcmVjb3JkKGJhLCBcIkJydENvbW1lbnRBdXRob3JcIiwgd3JpdGVfQnJ0Q29tbWVudEF1dGhvcihjLmEpKTtcblx0XHR9KTtcblx0fSk7XG5cdHdyaXRlX3JlY29yZChiYSwgXCJCcnRFbmRDb21tZW50QXV0aG9yc1wiKTtcblxuXHR3cml0ZV9yZWNvcmQoYmEsIFwiQnJ0QmVnaW5Db21tZW50TGlzdFwiKTtcblx0ZGF0YS5mb3JFYWNoKGZ1bmN0aW9uKGNvbW1lbnQpIHtcblx0XHRjb21tZW50WzFdLmZvckVhY2goZnVuY3Rpb24oYykge1xuXHRcdFx0Yy5pYXV0aG9yID0gaWF1dGhvci5pbmRleE9mKGMuYSk7XG5cdFx0XHR2YXIgcmFuZ2UgPSB7czpkZWNvZGVfY2VsbChjb21tZW50WzBdKSxlOmRlY29kZV9jZWxsKGNvbW1lbnRbMF0pfTtcblx0XHRcdHdyaXRlX3JlY29yZChiYSwgXCJCcnRCZWdpbkNvbW1lbnRcIiwgd3JpdGVfQnJ0QmVnaW5Db21tZW50KFtyYW5nZSwgY10pKTtcblx0XHRcdGlmKGMudCAmJiBjLnQubGVuZ3RoID4gMCkgd3JpdGVfcmVjb3JkKGJhLCBcIkJydENvbW1lbnRUZXh0XCIsIHdyaXRlX0JydENvbW1lbnRUZXh0KGMpKTtcblx0XHRcdHdyaXRlX3JlY29yZChiYSwgXCJCcnRFbmRDb21tZW50XCIpO1xuXHRcdFx0ZGVsZXRlIGMuaWF1dGhvcjtcblx0XHR9KTtcblx0fSk7XG5cdHdyaXRlX3JlY29yZChiYSwgXCJCcnRFbmRDb21tZW50TGlzdFwiKTtcblxuXHR3cml0ZV9yZWNvcmQoYmEsIFwiQnJ0RW5kQ29tbWVudHNcIik7XG5cdHJldHVybiBiYS5lbmQoKTtcbn1cbnZhciBDVF9WQkEgPSBcImFwcGxpY2F0aW9uL3ZuZC5tcy1vZmZpY2UudmJhUHJvamVjdFwiO1xuZnVuY3Rpb24gbWFrZV92YmFfeGxzKGNmYikge1xuXHR2YXIgbmV3Y2ZiID0gQ0ZCLnV0aWxzLmNmYl9uZXcoe3Jvb3Q6XCJSXCJ9KTtcblx0Y2ZiLkZ1bGxQYXRocy5mb3JFYWNoKGZ1bmN0aW9uKHAsIGkpIHtcblx0XHRpZihwLnNsaWNlKC0xKSA9PT0gXCIvXCIgfHwgIXAubWF0Y2goL19WQkFfUFJPSkVDVF9DVVIvKSkgcmV0dXJuO1xuXHRcdHZhciBuZXdwYXRoID0gcC5yZXBsYWNlKC9eW15cXC9dKi8sXCJSXCIpLnJlcGxhY2UoL1xcL19WQkFfUFJPSkVDVF9DVVJcXHUwMDAwKi8sIFwiXCIpO1xuXHRcdENGQi51dGlscy5jZmJfYWRkKG5ld2NmYiwgbmV3cGF0aCwgY2ZiLkZpbGVJbmRleFtpXS5jb250ZW50KTtcblx0fSk7XG5cdHJldHVybiBDRkIud3JpdGUobmV3Y2ZiKTtcbn1cblxuZnVuY3Rpb24gZmlsbF92YmFfeGxzKGNmYiwgdmJhKSB7XG5cdHZiYS5GdWxsUGF0aHMuZm9yRWFjaChmdW5jdGlvbihwLCBpKSB7XG5cdFx0aWYoaSA9PSAwKSByZXR1cm47XG5cdFx0dmFyIG5ld3BhdGggPSBwLnJlcGxhY2UoL1teXFwvXSpbXFwvXS8sIFwiL19WQkFfUFJPSkVDVF9DVVIvXCIpO1xuXHRcdGlmKG5ld3BhdGguc2xpY2UoLTEpICE9PSBcIi9cIikgQ0ZCLnV0aWxzLmNmYl9hZGQoY2ZiLCBuZXdwYXRoLCB2YmEuRmlsZUluZGV4W2ldLmNvbnRlbnQpO1xuXHR9KTtcbn1cblxudmFyIFZCQUZNVFMgPSBbIFwieGxzYlwiLCBcInhsc21cIiwgXCJ4bGFtXCIsIFwiYmlmZjhcIiwgXCJ4bGFcIiBdO1xuXG5SRUxTLkRTID0gXCJodHRwOi8vc2NoZW1hcy5vcGVueG1sZm9ybWF0cy5vcmcvb2ZmaWNlRG9jdW1lbnQvMjAwNi9yZWxhdGlvbnNoaXBzL2RpYWxvZ3NoZWV0XCI7XG5SRUxTLk1TID0gXCJodHRwOi8vc2NoZW1hcy5taWNyb3NvZnQuY29tL29mZmljZS8yMDA2L3JlbGF0aW9uc2hpcHMveGxNYWNyb3NoZWV0XCI7XG5cbi8qIG1hY3JvIGFuZCBkaWFsb2cgc2hlZXQgc3R1YnMgKi9cbmZ1bmN0aW9uIHBhcnNlX2RzX2JpbigpIHsgcmV0dXJuIHsnIXR5cGUnOidkaWFsb2cnfTsgfVxuZnVuY3Rpb24gcGFyc2VfZHNfeG1sKCkgeyByZXR1cm4geychdHlwZSc6J2RpYWxvZyd9OyB9XG5mdW5jdGlvbiBwYXJzZV9tc19iaW4oKSB7IHJldHVybiB7JyF0eXBlJzonbWFjcm8nfTsgfVxuZnVuY3Rpb24gcGFyc2VfbXNfeG1sKCkgeyByZXR1cm4geychdHlwZSc6J21hY3JvJ307IH1cbi8qIFRPRE86IGl0IHdpbGwgYmUgdXNlZnVsIHRvIHBhcnNlIHRoZSBmdW5jdGlvbiBzdHIgKi9cbnZhciByY190b19hMSA9IChmdW5jdGlvbigpe1xuXHR2YXIgcmNyZWdleCA9IC8oXnxbXkEtWmEtel9dKVIoXFxbPy0/XFxkK1xcXXxbMS05XVxcZCp8KUMoXFxbPy0/XFxkK1xcXXxbMS05XVxcZCp8KSg/IVtBLVphLXowLTlfXSkvZztcblx0dmFyIHJjYmFzZSA9ICh7cjowLGM6MH0pO1xuXHRmdW5jdGlvbiByY2Z1bmMoJCQsJDEsJDIsJDMpIHtcblx0XHR2YXIgY1JlbCA9IGZhbHNlLCByUmVsID0gZmFsc2U7XG5cblx0XHRpZigkMi5sZW5ndGggPT0gMCkgclJlbCA9IHRydWU7XG5cdFx0ZWxzZSBpZigkMi5jaGFyQXQoMCkgPT0gXCJbXCIpIHsgclJlbCA9IHRydWU7ICQyID0gJDIuc2xpY2UoMSwgLTEpOyB9XG5cblx0XHRpZigkMy5sZW5ndGggPT0gMCkgY1JlbCA9IHRydWU7XG5cdFx0ZWxzZSBpZigkMy5jaGFyQXQoMCkgPT0gXCJbXCIpIHsgY1JlbCA9IHRydWU7ICQzID0gJDMuc2xpY2UoMSwgLTEpOyB9XG5cblx0XHR2YXIgUiA9ICQyLmxlbmd0aD4wP3BhcnNlSW50KCQyLDEwKXwwOjAsIEMgPSAkMy5sZW5ndGg+MD9wYXJzZUludCgkMywxMCl8MDowO1xuXG5cdFx0aWYoY1JlbCkgQyArPSByY2Jhc2UuYzsgZWxzZSAtLUM7XG5cdFx0aWYoclJlbCkgUiArPSByY2Jhc2UucjsgZWxzZSAtLVI7XG5cdFx0cmV0dXJuICQxICsgKGNSZWwgPyBcIlwiIDogXCIkXCIpICsgZW5jb2RlX2NvbChDKSArIChyUmVsID8gXCJcIiA6IFwiJFwiKSArIGVuY29kZV9yb3coUik7XG5cdH1cblx0cmV0dXJuIGZ1bmN0aW9uIHJjX3RvX2ExKGZzdHIsIGJhc2UpIHtcblx0XHRyY2Jhc2UgPSBiYXNlO1xuXHRcdHJldHVybiBmc3RyLnJlcGxhY2UocmNyZWdleCwgcmNmdW5jKTtcblx0fTtcbn0pKCk7XG5cbnZhciBjcmVmcmVnZXggPSAvKF58W14uX0EtWjAtOV0pKFskXT8pKFtBLVpdezEsMn18W0EtV11bQS1aXXsyfXxYW0EtRV1bQS1aXXxYRltBLURdKShbJF0/KSgxMFswLTNdXFxkezR9fDEwNFswLTddXFxkezN9fDEwNDhbMC00XVxcZHsyfXwxMDQ4NVswLTZdXFxkfDEwNDg1N1swLTZdfFsxLTldXFxkezAsNX0pKD8hW18uXFwoQS1aYS16MC05XSkvZztcbnZhciBhMV90b19yYyA9KGZ1bmN0aW9uKCl7XG5cdHJldHVybiBmdW5jdGlvbiBhMV90b19yYyhmc3RyLCBiYXNlKSB7XG5cdFx0cmV0dXJuIGZzdHIucmVwbGFjZShjcmVmcmVnZXgsIGZ1bmN0aW9uKCQwLCAkMSwgJDIsICQzLCAkNCwgJDUpIHtcblx0XHRcdHZhciBjID0gZGVjb2RlX2NvbCgkMykgLSAoJDIgPyAwIDogYmFzZS5jKTtcblx0XHRcdHZhciByID0gZGVjb2RlX3JvdygkNSkgLSAoJDQgPyAwIDogYmFzZS5yKTtcblx0XHRcdHZhciBSID0gKHIgPT0gMCA/IFwiXCIgOiAhJDQgPyBcIltcIiArIHIgKyBcIl1cIiA6IChyKzEpKTtcblx0XHRcdHZhciBDID0gKGMgPT0gMCA/IFwiXCIgOiAhJDIgPyBcIltcIiArIGMgKyBcIl1cIiA6IChjKzEpKTtcblx0XHRcdHJldHVybiAkMSArIFwiUlwiICsgUiArIFwiQ1wiICsgQztcblx0XHR9KTtcblx0fTtcbn0pKCk7XG5cbi8qIG5vIGRlZmluZWQgbmFtZSBjYW4gY29sbGlkZSB3aXRoIGEgdmFsaWQgY2VsbCBhZGRyZXNzIEExOlhGRDEwNDg1NzYgLi4uIGV4Y2VwdCBMT0cxMCEgKi9cbmZ1bmN0aW9uIHNoaWZ0X2Zvcm11bGFfc3RyKGYsIGRlbHRhKSB7XG5cdHJldHVybiBmLnJlcGxhY2UoY3JlZnJlZ2V4LCBmdW5jdGlvbigkMCwgJDEsICQyLCAkMywgJDQsICQ1KSB7XG5cdFx0cmV0dXJuICQxKygkMj09XCIkXCIgPyAkMiskMyA6IGVuY29kZV9jb2woZGVjb2RlX2NvbCgkMykrZGVsdGEuYykpKygkND09XCIkXCIgPyAkNCskNSA6IGVuY29kZV9yb3coZGVjb2RlX3JvdygkNSkgKyBkZWx0YS5yKSk7XG5cdH0pO1xufVxuXG5mdW5jdGlvbiBzaGlmdF9mb3JtdWxhX3hsc3goZiwgcmFuZ2UsIGNlbGwpIHtcblx0dmFyIHIgPSBkZWNvZGVfcmFuZ2UocmFuZ2UpLCBzID0gci5zLCBjID0gZGVjb2RlX2NlbGwoY2VsbCk7XG5cdHZhciBkZWx0YSA9IHtyOmMuciAtIHMuciwgYzpjLmMgLSBzLmN9O1xuXHRyZXR1cm4gc2hpZnRfZm9ybXVsYV9zdHIoZiwgZGVsdGEpO1xufVxuXG4vKiBUT0RPOiBwYXJzZSBmb3JtdWxhICovXG5mdW5jdGlvbiBmdXp6eWZtbGEoZikge1xuXHRpZihmLmxlbmd0aCA9PSAxKSByZXR1cm4gZmFsc2U7XG5cdHJldHVybiB0cnVlO1xufVxuXG5mdW5jdGlvbiBfeGxmbihmKSB7XG5cdHJldHVybiBmLnJlcGxhY2UoL194bGZuXFwuL2csXCJcIik7XG59XG5mdW5jdGlvbiBwYXJzZXJlYWQxKGJsb2IpIHsgYmxvYi5sKz0xOyByZXR1cm47IH1cblxuLyogW01TLVhMU10gMi41LjUxICovXG5mdW5jdGlvbiBwYXJzZV9Db2xSZWxVKGJsb2IsIGxlbmd0aCkge1xuXHR2YXIgYyA9IGJsb2IucmVhZF9zaGlmdChsZW5ndGggPT0gMSA/IDEgOiAyKTtcblx0cmV0dXJuIFtjICYgMHgzRkZGLCAoYyA+PiAxNCkgJiAxLCAoYyA+PiAxNSkgJiAxXTtcbn1cblxuLyogW01TLVhMU10gMi41LjE5OC4xMDUgOyBbTVMtWExTQl0gMi41Ljk3Ljg5ICovXG5mdW5jdGlvbiBwYXJzZV9SZ2NlQXJlYShibG9iLCBsZW5ndGgsIG9wdHMpIHtcblx0dmFyIHcgPSAyO1xuXHRpZihvcHRzKSB7XG5cdFx0aWYob3B0cy5iaWZmID49IDIgJiYgb3B0cy5iaWZmIDw9IDUpIHJldHVybiBwYXJzZV9SZ2NlQXJlYV9CSUZGMihibG9iLCBsZW5ndGgsIG9wdHMpO1xuXHRcdGVsc2UgaWYob3B0cy5iaWZmID09IDEyKSB3ID0gNDtcblx0fVxuXHR2YXIgcj1ibG9iLnJlYWRfc2hpZnQodyksIFI9YmxvYi5yZWFkX3NoaWZ0KHcpO1xuXHR2YXIgYz1wYXJzZV9Db2xSZWxVKGJsb2IsIDIpO1xuXHR2YXIgQz1wYXJzZV9Db2xSZWxVKGJsb2IsIDIpO1xuXHRyZXR1cm4geyBzOntyOnIsIGM6Y1swXSwgY1JlbDpjWzFdLCByUmVsOmNbMl19LCBlOntyOlIsIGM6Q1swXSwgY1JlbDpDWzFdLCByUmVsOkNbMl19IH07XG59XG4vKiBCSUZGIDItNSBlbmNvZGVzIGZsYWdzIGluIHRoZSByb3cgZmllbGQgKi9cbmZ1bmN0aW9uIHBhcnNlX1JnY2VBcmVhX0JJRkYyKGJsb2IpIHtcblx0dmFyIHI9cGFyc2VfQ29sUmVsVShibG9iLCAyKSwgUj1wYXJzZV9Db2xSZWxVKGJsb2IsIDIpO1xuXHR2YXIgYz1ibG9iLnJlYWRfc2hpZnQoMSk7XG5cdHZhciBDPWJsb2IucmVhZF9zaGlmdCgxKTtcblx0cmV0dXJuIHsgczp7cjpyWzBdLCBjOmMsIGNSZWw6clsxXSwgclJlbDpyWzJdfSwgZTp7cjpSWzBdLCBjOkMsIGNSZWw6UlsxXSwgclJlbDpSWzJdfSB9O1xufVxuXG4vKiBbTVMtWExTXSAyLjUuMTk4LjEwNSA7IFtNUy1YTFNCXSAyLjUuOTcuOTAgKi9cbmZ1bmN0aW9uIHBhcnNlX1JnY2VBcmVhUmVsKGJsb2IsIGxlbmd0aCwgb3B0cykge1xuXHRpZihvcHRzLmJpZmYgPCA4KSByZXR1cm4gcGFyc2VfUmdjZUFyZWFfQklGRjIoYmxvYiwgbGVuZ3RoLCBvcHRzKTtcblx0dmFyIHI9YmxvYi5yZWFkX3NoaWZ0KG9wdHMuYmlmZiA9PSAxMiA/IDQgOiAyKSwgUj1ibG9iLnJlYWRfc2hpZnQob3B0cy5iaWZmID09IDEyID8gNCA6IDIpO1xuXHR2YXIgYz1wYXJzZV9Db2xSZWxVKGJsb2IsIDIpO1xuXHR2YXIgQz1wYXJzZV9Db2xSZWxVKGJsb2IsIDIpO1xuXHRyZXR1cm4geyBzOntyOnIsIGM6Y1swXSwgY1JlbDpjWzFdLCByUmVsOmNbMl19LCBlOntyOlIsIGM6Q1swXSwgY1JlbDpDWzFdLCByUmVsOkNbMl19IH07XG59XG5cbi8qIFtNUy1YTFNdIDIuNS4xOTguMTA5IDsgW01TLVhMU0JdIDIuNS45Ny45MSAqL1xuZnVuY3Rpb24gcGFyc2VfUmdjZUxvYyhibG9iLCBsZW5ndGgsIG9wdHMpIHtcblx0aWYob3B0cyAmJiBvcHRzLmJpZmYgPj0gMiAmJiBvcHRzLmJpZmYgPD0gNSkgcmV0dXJuIHBhcnNlX1JnY2VMb2NfQklGRjIoYmxvYiwgbGVuZ3RoLCBvcHRzKTtcblx0dmFyIHIgPSBibG9iLnJlYWRfc2hpZnQob3B0cyAmJiBvcHRzLmJpZmYgPT0gMTIgPyA0IDogMik7XG5cdHZhciBjID0gcGFyc2VfQ29sUmVsVShibG9iLCAyKTtcblx0cmV0dXJuIHtyOnIsIGM6Y1swXSwgY1JlbDpjWzFdLCByUmVsOmNbMl19O1xufVxuZnVuY3Rpb24gcGFyc2VfUmdjZUxvY19CSUZGMihibG9iKSB7XG5cdHZhciByID0gcGFyc2VfQ29sUmVsVShibG9iLCAyKTtcblx0dmFyIGMgPSBibG9iLnJlYWRfc2hpZnQoMSk7XG5cdHJldHVybiB7cjpyWzBdLCBjOmMsIGNSZWw6clsxXSwgclJlbDpyWzJdfTtcbn1cblxuLyogW01TLVhMU10gMi41LjE5OC4xMDcsIDIuNS40NyAqL1xuZnVuY3Rpb24gcGFyc2VfUmdjZUVsZkxvYyhibG9iKSB7XG5cdHZhciByID0gYmxvYi5yZWFkX3NoaWZ0KDIpO1xuXHR2YXIgYyA9IGJsb2IucmVhZF9zaGlmdCgyKTtcblx0cmV0dXJuIHtyOnIsIGM6YyAmIDB4RkYsIGZRdW90ZWQ6ISEoYyAmIDB4NDAwMCksIGNSZWw6Yz4+MTUsIHJSZWw6Yz4+MTUgfTtcbn1cblxuLyogW01TLVhMU10gMi41LjE5OC4xMTEgOyBbTVMtWExTQl0gMi41Ljk3LjkyIFRPRE8gKi9cbmZ1bmN0aW9uIHBhcnNlX1JnY2VMb2NSZWwoYmxvYiwgbGVuZ3RoLCBvcHRzKSB7XG5cdHZhciBiaWZmID0gb3B0cyAmJiBvcHRzLmJpZmYgPyBvcHRzLmJpZmYgOiA4O1xuXHRpZihiaWZmID49IDIgJiYgYmlmZiA8PSA1KSByZXR1cm4gcGFyc2VfUmdjZUxvY1JlbF9CSUZGMihibG9iLCBsZW5ndGgsIG9wdHMpO1xuXHR2YXIgciA9IGJsb2IucmVhZF9zaGlmdChiaWZmID49IDEyID8gNCA6IDIpO1xuXHR2YXIgY2wgPSBibG9iLnJlYWRfc2hpZnQoMik7XG5cdHZhciBjUmVsID0gKGNsICYgMHg0MDAwKSA+PiAxNCwgclJlbCA9IChjbCAmIDB4ODAwMCkgPj4gMTU7XG5cdGNsICY9IDB4M0ZGRjtcblx0aWYoclJlbCA9PSAxKSB3aGlsZShyID4gMHg3RkZGRikgciAtPSAweDEwMDAwMDtcblx0aWYoY1JlbCA9PSAxKSB3aGlsZShjbCA+IDB4MUZGRikgY2wgPSBjbCAtIDB4NDAwMDtcblx0cmV0dXJuIHtyOnIsYzpjbCxjUmVsOmNSZWwsclJlbDpyUmVsfTtcbn1cbmZ1bmN0aW9uIHBhcnNlX1JnY2VMb2NSZWxfQklGRjIoYmxvYikge1xuXHR2YXIgcmwgPSBibG9iLnJlYWRfc2hpZnQoMik7XG5cdHZhciBjID0gYmxvYi5yZWFkX3NoaWZ0KDEpO1xuXHR2YXIgclJlbCA9IChybCAmIDB4ODAwMCkgPj4gMTUsIGNSZWwgPSAocmwgJiAweDQwMDApID4+IDE0O1xuXHRybCAmPSAweDNGRkY7XG5cdGlmKHJSZWwgPT0gMSAmJiBybCA+PSAweDIwMDApIHJsID0gcmwgLSAweDQwMDA7XG5cdGlmKGNSZWwgPT0gMSAmJiBjID49IDB4ODApIGMgPSBjIC0gMHgxMDA7XG5cdHJldHVybiB7cjpybCxjOmMsY1JlbDpjUmVsLHJSZWw6clJlbH07XG59XG5cbi8qIFtNUy1YTFNdIDIuNS4xOTguMjcgOyBbTVMtWExTQl0gMi41Ljk3LjE4ICovXG5mdW5jdGlvbiBwYXJzZV9QdGdBcmVhKGJsb2IsIGxlbmd0aCwgb3B0cykge1xuXHR2YXIgdHlwZSA9IChibG9iW2Jsb2IubCsrXSAmIDB4NjApID4+IDU7XG5cdHZhciBhcmVhID0gcGFyc2VfUmdjZUFyZWEoYmxvYiwgb3B0cy5iaWZmID49IDIgJiYgb3B0cy5iaWZmIDw9IDUgPyA2IDogOCwgb3B0cyk7XG5cdHJldHVybiBbdHlwZSwgYXJlYV07XG59XG5cbi8qIFtNUy1YTFNdIDIuNS4xOTguMjggOyBbTVMtWExTQl0gMi41Ljk3LjE5ICovXG5mdW5jdGlvbiBwYXJzZV9QdGdBcmVhM2QoYmxvYiwgbGVuZ3RoLCBvcHRzKSB7XG5cdHZhciB0eXBlID0gKGJsb2JbYmxvYi5sKytdICYgMHg2MCkgPj4gNTtcblx0dmFyIGl4dGkgPSBibG9iLnJlYWRfc2hpZnQoMiwgJ2knKTtcblx0dmFyIHcgPSA4O1xuXHRpZihvcHRzKSBzd2l0Y2gob3B0cy5iaWZmKSB7XG5cdFx0Y2FzZSA1OiBibG9iLmwgKz0gMTI7IHcgPSA2OyBicmVhaztcblx0XHRjYXNlIDEyOiB3ID0gMTI7IGJyZWFrO1xuXHR9XG5cdHZhciBhcmVhID0gcGFyc2VfUmdjZUFyZWEoYmxvYiwgdywgb3B0cyk7XG5cdHJldHVybiBbdHlwZSwgaXh0aSwgYXJlYV07XG59XG5cbi8qIFtNUy1YTFNdIDIuNS4xOTguMjkgOyBbTVMtWExTQl0gMi41Ljk3LjIwICovXG5mdW5jdGlvbiBwYXJzZV9QdGdBcmVhRXJyKGJsb2IsIGxlbmd0aCwgb3B0cykge1xuXHR2YXIgdHlwZSA9IChibG9iW2Jsb2IubCsrXSAmIDB4NjApID4+IDU7XG5cdGJsb2IubCArPSBvcHRzICYmIChvcHRzLmJpZmYgPiA4KSA/IDEyIDogKG9wdHMuYmlmZiA8IDggPyA2IDogOCk7XG5cdHJldHVybiBbdHlwZV07XG59XG4vKiBbTVMtWExTXSAyLjUuMTk4LjMwIDsgW01TLVhMU0JdIDIuNS45Ny4yMSAqL1xuZnVuY3Rpb24gcGFyc2VfUHRnQXJlYUVycjNkKGJsb2IsIGxlbmd0aCwgb3B0cykge1xuXHR2YXIgdHlwZSA9IChibG9iW2Jsb2IubCsrXSAmIDB4NjApID4+IDU7XG5cdHZhciBpeHRpID0gYmxvYi5yZWFkX3NoaWZ0KDIpO1xuXHR2YXIgdyA9IDg7XG5cdGlmKG9wdHMpIHN3aXRjaChvcHRzLmJpZmYpIHtcblx0XHRjYXNlIDU6IGJsb2IubCArPSAxMjsgdyA9IDY7IGJyZWFrO1xuXHRcdGNhc2UgMTI6IHcgPSAxMjsgYnJlYWs7XG5cdH1cblx0YmxvYi5sICs9IHc7XG5cdHJldHVybiBbdHlwZSwgaXh0aV07XG59XG5cbi8qIFtNUy1YTFNdIDIuNS4xOTguMzEgOyBbTVMtWExTQl0gMi41Ljk3LjIyICovXG5mdW5jdGlvbiBwYXJzZV9QdGdBcmVhTihibG9iLCBsZW5ndGgsIG9wdHMpIHtcblx0dmFyIHR5cGUgPSAoYmxvYltibG9iLmwrK10gJiAweDYwKSA+PiA1O1xuXHR2YXIgYXJlYSA9IHBhcnNlX1JnY2VBcmVhUmVsKGJsb2IsIGxlbmd0aCAtIDEsIG9wdHMpO1xuXHRyZXR1cm4gW3R5cGUsIGFyZWFdO1xufVxuXG4vKiBbTVMtWExTXSAyLjUuMTk4LjMyIDsgW01TLVhMU0JdIDIuNS45Ny4yMyAqL1xuZnVuY3Rpb24gcGFyc2VfUHRnQXJyYXkoYmxvYiwgbGVuZ3RoLCBvcHRzKSB7XG5cdHZhciB0eXBlID0gKGJsb2JbYmxvYi5sKytdICYgMHg2MCkgPj4gNTtcblx0YmxvYi5sICs9IG9wdHMuYmlmZiA9PSAyID8gNiA6IG9wdHMuYmlmZiA9PSAxMiA/IDE0IDogNztcblx0cmV0dXJuIFt0eXBlXTtcbn1cblxuLyogW01TLVhMU10gMi41LjE5OC4zMyA7IFtNUy1YTFNCXSAyLjUuOTcuMjQgKi9cbmZ1bmN0aW9uIHBhcnNlX1B0Z0F0dHJCYXhjZWwoYmxvYikge1xuXHR2YXIgYml0U2VtaSA9IGJsb2JbYmxvYi5sKzFdICYgMHgwMTsgLyogMSA9IHZvbGF0aWxlICovXG5cdHZhciBiaXRCYXhjZWwgPSAxO1xuXHRibG9iLmwgKz0gNDtcblx0cmV0dXJuIFtiaXRTZW1pLCBiaXRCYXhjZWxdO1xufVxuXG4vKiBbTVMtWExTXSAyLjUuMTk4LjM0IDsgW01TLVhMU0JdIDIuNS45Ny4yNSAqL1xuZnVuY3Rpb24gcGFyc2VfUHRnQXR0ckNob29zZShibG9iLCBsZW5ndGgsIG9wdHMpIHtcblx0YmxvYi5sICs9Mjtcblx0dmFyIG9mZnNldCA9IGJsb2IucmVhZF9zaGlmdChvcHRzICYmIG9wdHMuYmlmZiA9PSAyID8gMSA6IDIpO1xuXHR2YXIgbyA9IFtdO1xuXHQvKiBvZmZzZXQgaXMgMSBsZXNzIHRoYW4gdGhlIG51bWJlciBvZiBlbGVtZW50cyAqL1xuXHRmb3IodmFyIGkgPSAwOyBpIDw9IG9mZnNldDsgKytpKSBvLnB1c2goYmxvYi5yZWFkX3NoaWZ0KG9wdHMgJiYgb3B0cy5iaWZmID09IDIgPyAxIDogMikpO1xuXHRyZXR1cm4gbztcbn1cblxuLyogW01TLVhMU10gMi41LjE5OC4zNSA7IFtNUy1YTFNCXSAyLjUuOTcuMjYgKi9cbmZ1bmN0aW9uIHBhcnNlX1B0Z0F0dHJHb3RvKGJsb2IsIGxlbmd0aCwgb3B0cykge1xuXHR2YXIgYml0R290byA9IChibG9iW2Jsb2IubCsxXSAmIDB4RkYpID8gMSA6IDA7XG5cdGJsb2IubCArPSAyO1xuXHRyZXR1cm4gW2JpdEdvdG8sIGJsb2IucmVhZF9zaGlmdChvcHRzICYmIG9wdHMuYmlmZiA9PSAyID8gMSA6IDIpXTtcbn1cblxuLyogW01TLVhMU10gMi41LjE5OC4zNiA7IFtNUy1YTFNCXSAyLjUuOTcuMjcgKi9cbmZ1bmN0aW9uIHBhcnNlX1B0Z0F0dHJJZihibG9iLCBsZW5ndGgsIG9wdHMpIHtcblx0dmFyIGJpdElmID0gKGJsb2JbYmxvYi5sKzFdICYgMHhGRikgPyAxIDogMDtcblx0YmxvYi5sICs9IDI7XG5cdHJldHVybiBbYml0SWYsIGJsb2IucmVhZF9zaGlmdChvcHRzICYmIG9wdHMuYmlmZiA9PSAyID8gMSA6IDIpXTtcbn1cblxuLyogW01TLVhMU0JdIDIuNS45Ny4yOCAqL1xuZnVuY3Rpb24gcGFyc2VfUHRnQXR0cklmRXJyb3IoYmxvYikge1xuXHR2YXIgYml0SWYgPSAoYmxvYltibG9iLmwrMV0gJiAweEZGKSA/IDEgOiAwO1xuXHRibG9iLmwgKz0gMjtcblx0cmV0dXJuIFtiaXRJZiwgYmxvYi5yZWFkX3NoaWZ0KDIpXTtcbn1cblxuLyogW01TLVhMU10gMi41LjE5OC4zNyA7IFtNUy1YTFNCXSAyLjUuOTcuMjkgKi9cbmZ1bmN0aW9uIHBhcnNlX1B0Z0F0dHJTZW1pKGJsb2IsIGxlbmd0aCwgb3B0cykge1xuXHR2YXIgYml0U2VtaSA9IChibG9iW2Jsb2IubCsxXSAmIDB4RkYpID8gMSA6IDA7XG5cdGJsb2IubCArPSBvcHRzICYmIG9wdHMuYmlmZiA9PSAyID8gMyA6IDQ7XG5cdHJldHVybiBbYml0U2VtaV07XG59XG5cbi8qIFtNUy1YTFNdIDIuNS4xOTguNDAgOyBbTVMtWExTQl0gMi41Ljk3LjMyICovXG5mdW5jdGlvbiBwYXJzZV9QdGdBdHRyU3BhY2VUeXBlKGJsb2IpIHtcblx0dmFyIHR5cGUgPSBibG9iLnJlYWRfc2hpZnQoMSksIGNjaCA9IGJsb2IucmVhZF9zaGlmdCgxKTtcblx0cmV0dXJuIFt0eXBlLCBjY2hdO1xufVxuXG4vKiBbTVMtWExTXSAyLjUuMTk4LjM4IDsgW01TLVhMU0JdIDIuNS45Ny4zMCAqL1xuZnVuY3Rpb24gcGFyc2VfUHRnQXR0clNwYWNlKGJsb2IpIHtcblx0YmxvYi5yZWFkX3NoaWZ0KDIpO1xuXHRyZXR1cm4gcGFyc2VfUHRnQXR0clNwYWNlVHlwZShibG9iLCAyKTtcbn1cblxuLyogW01TLVhMU10gMi41LjE5OC4zOSA7IFtNUy1YTFNCXSAyLjUuOTcuMzEgKi9cbmZ1bmN0aW9uIHBhcnNlX1B0Z0F0dHJTcGFjZVNlbWkoYmxvYikge1xuXHRibG9iLnJlYWRfc2hpZnQoMik7XG5cdHJldHVybiBwYXJzZV9QdGdBdHRyU3BhY2VUeXBlKGJsb2IsIDIpO1xufVxuXG4vKiBbTVMtWExTXSAyLjUuMTk4Ljg0IDsgW01TLVhMU0JdIDIuNS45Ny42OCBUT0RPICovXG5mdW5jdGlvbiBwYXJzZV9QdGdSZWYoYmxvYiwgbGVuZ3RoLCBvcHRzKSB7XG5cdC8vdmFyIHB0ZyA9IGJsb2JbYmxvYi5sXSAmIDB4MUY7XG5cdHZhciB0eXBlID0gKGJsb2JbYmxvYi5sXSAmIDB4NjApPj41O1xuXHRibG9iLmwgKz0gMTtcblx0dmFyIGxvYyA9IHBhcnNlX1JnY2VMb2MoYmxvYiwgMCwgb3B0cyk7XG5cdHJldHVybiBbdHlwZSwgbG9jXTtcbn1cblxuLyogW01TLVhMU10gMi41LjE5OC44OCA7IFtNUy1YTFNCXSAyLjUuOTcuNzIgVE9ETyAqL1xuZnVuY3Rpb24gcGFyc2VfUHRnUmVmTihibG9iLCBsZW5ndGgsIG9wdHMpIHtcblx0dmFyIHR5cGUgPSAoYmxvYltibG9iLmxdICYgMHg2MCk+PjU7XG5cdGJsb2IubCArPSAxO1xuXHR2YXIgbG9jID0gcGFyc2VfUmdjZUxvY1JlbChibG9iLCAwLCBvcHRzKTtcblx0cmV0dXJuIFt0eXBlLCBsb2NdO1xufVxuXG4vKiBbTVMtWExTXSAyLjUuMTk4Ljg1IDsgW01TLVhMU0JdIDIuNS45Ny42OSBUT0RPICovXG5mdW5jdGlvbiBwYXJzZV9QdGdSZWYzZChibG9iLCBsZW5ndGgsIG9wdHMpIHtcblx0dmFyIHR5cGUgPSAoYmxvYltibG9iLmxdICYgMHg2MCk+PjU7XG5cdGJsb2IubCArPSAxO1xuXHR2YXIgaXh0aSA9IGJsb2IucmVhZF9zaGlmdCgyKTsgLy8gWHRpSW5kZXhcblx0aWYob3B0cyAmJiBvcHRzLmJpZmYgPT0gNSkgYmxvYi5sICs9IDEyO1xuXHR2YXIgbG9jID0gcGFyc2VfUmdjZUxvYyhibG9iLCAwLCBvcHRzKTsgLy8gVE9ETzogb3IgUmdjZUxvY1JlbFxuXHRyZXR1cm4gW3R5cGUsIGl4dGksIGxvY107XG59XG5cblxuLyogW01TLVhMU10gMi41LjE5OC42MiA7IFtNUy1YTFNCXSAyLjUuOTcuNDUgVE9ETyAqL1xuZnVuY3Rpb24gcGFyc2VfUHRnRnVuYyhibG9iLCBsZW5ndGgsIG9wdHMpIHtcblx0Ly92YXIgcHRnID0gYmxvYltibG9iLmxdICYgMHgxRjtcblx0dmFyIHR5cGUgPSAoYmxvYltibG9iLmxdICYgMHg2MCk+PjU7XG5cdGJsb2IubCArPSAxO1xuXHR2YXIgaWZ0YWIgPSBibG9iLnJlYWRfc2hpZnQob3B0cyAmJiBvcHRzLmJpZmYgPD0gMyA/IDEgOiAyKTtcblx0cmV0dXJuIFtGdGFiQXJnY1tpZnRhYl0sIEZ0YWJbaWZ0YWJdLCB0eXBlXTtcbn1cbi8qIFtNUy1YTFNdIDIuNS4xOTguNjMgOyBbTVMtWExTQl0gMi41Ljk3LjQ2IFRPRE8gKi9cbmZ1bmN0aW9uIHBhcnNlX1B0Z0Z1bmNWYXIoYmxvYiwgbGVuZ3RoLCBvcHRzKSB7XG5cdHZhciB0eXBlID0gYmxvYltibG9iLmwrK107XG5cdHZhciBjcGFyYW1zID0gYmxvYi5yZWFkX3NoaWZ0KDEpLCB0YWIgPSBvcHRzICYmIG9wdHMuYmlmZiA8PSAzID8gWyh0eXBlID09IDB4NTggPyAtMSA6IDApLCBibG9iLnJlYWRfc2hpZnQoMSldOiBwYXJzZXRhYihibG9iKTtcblx0cmV0dXJuIFtjcGFyYW1zLCAodGFiWzBdID09PSAwID8gRnRhYiA6IENldGFiKVt0YWJbMV1dXTtcbn1cblxuZnVuY3Rpb24gcGFyc2V0YWIoYmxvYikge1xuXHRyZXR1cm4gW2Jsb2JbYmxvYi5sKzFdPj43LCBibG9iLnJlYWRfc2hpZnQoMikgJiAweDdGRkZdO1xufVxuXG4vKiBbTVMtWExTXSAyLjUuMTk4LjQxIDsgW01TLVhMU0JdIDIuNS45Ny4zMyAqL1xuZnVuY3Rpb24gcGFyc2VfUHRnQXR0clN1bShibG9iLCBsZW5ndGgsIG9wdHMpIHtcblx0YmxvYi5sICs9IG9wdHMgJiYgb3B0cy5iaWZmID09IDIgPyAzIDogNDsgcmV0dXJuO1xufVxuXG4vKiBbTVMtWExTXSAyLjUuMTk4LjU4IDsgW01TLVhMU0JdIDIuNS45Ny40MCAqL1xuZnVuY3Rpb24gcGFyc2VfUHRnRXhwKGJsb2IsIGxlbmd0aCwgb3B0cykge1xuXHRibG9iLmwrKztcblx0aWYob3B0cyAmJiBvcHRzLmJpZmYgPT0gMTIpIHJldHVybiBbYmxvYi5yZWFkX3NoaWZ0KDQsICdpJyksIDBdO1xuXHR2YXIgcm93ID0gYmxvYi5yZWFkX3NoaWZ0KDIpO1xuXHR2YXIgY29sID0gYmxvYi5yZWFkX3NoaWZ0KG9wdHMgJiYgb3B0cy5iaWZmID09IDIgPyAxIDogMik7XG5cdHJldHVybiBbcm93LCBjb2xdO1xufVxuXG4vKiBbTVMtWExTXSAyLjUuMTk4LjU3IDsgW01TLVhMU0JdIDIuNS45Ny4zOSAqL1xuZnVuY3Rpb24gcGFyc2VfUHRnRXJyKGJsb2IpIHsgYmxvYi5sKys7IHJldHVybiBCRXJyW2Jsb2IucmVhZF9zaGlmdCgxKV07IH1cblxuLyogW01TLVhMU10gMi41LjE5OC42NiA7IFtNUy1YTFNCXSAyLjUuOTcuNDkgKi9cbmZ1bmN0aW9uIHBhcnNlX1B0Z0ludChibG9iKSB7IGJsb2IubCsrOyByZXR1cm4gYmxvYi5yZWFkX3NoaWZ0KDIpOyB9XG5cbi8qIFtNUy1YTFNdIDIuNS4xOTguNDIgOyBbTVMtWExTQl0gMi41Ljk3LjM0ICovXG5mdW5jdGlvbiBwYXJzZV9QdGdCb29sKGJsb2IpIHsgYmxvYi5sKys7IHJldHVybiBibG9iLnJlYWRfc2hpZnQoMSkhPT0wO31cblxuLyogW01TLVhMU10gMi41LjE5OC43OSA7IFtNUy1YTFNCXSAyLjUuOTcuNjMgKi9cbmZ1bmN0aW9uIHBhcnNlX1B0Z051bShibG9iKSB7IGJsb2IubCsrOyByZXR1cm4gcGFyc2VfWG51bShibG9iLCA4KTsgfVxuXG4vKiBbTVMtWExTXSAyLjUuMTk4Ljg5IDsgW01TLVhMU0JdIDIuNS45Ny43NCAqL1xuZnVuY3Rpb24gcGFyc2VfUHRnU3RyKGJsb2IsIGxlbmd0aCwgb3B0cykgeyBibG9iLmwrKzsgcmV0dXJuIHBhcnNlX1Nob3J0WExVbmljb2RlU3RyaW5nKGJsb2IsIGxlbmd0aC0xLCBvcHRzKTsgfVxuXG4vKiBbTVMtWExTXSAyLjUuMTkyLjExMiArIDIuNS4xOTIuMTF7Myw0LDUsNiw3fSAqL1xuLyogW01TLVhMU0JdIDIuNS45Ny45MyArIDIuNS45Ny45ezQsNSw2LDd9ICovXG5mdW5jdGlvbiBwYXJzZV9TZXJBcihibG9iLCBiaWZmKSB7XG5cdHZhciB2YWwgPSBbYmxvYi5yZWFkX3NoaWZ0KDEpXTtcblx0aWYoYmlmZiA9PSAxMikgc3dpdGNoKHZhbFswXSkge1xuXHRcdGNhc2UgMHgwMjogdmFsWzBdID0gMHgwNDsgYnJlYWs7IC8qIFNlckJvb2wgKi9cblx0XHRjYXNlIDB4MDQ6IHZhbFswXSA9IDB4MTA7IGJyZWFrOyAvKiBTZXJFcnIgKi9cblx0XHRjYXNlIDB4MDA6IHZhbFswXSA9IDB4MDE7IGJyZWFrOyAvKiBTZXJOdW0gKi9cblx0XHRjYXNlIDB4MDE6IHZhbFswXSA9IDB4MDI7IGJyZWFrOyAvKiBTZXJTdHIgKi9cblx0fVxuXHRzd2l0Y2godmFsWzBdKSB7XG5cdFx0Y2FzZSAweDA0OiAvKiBTZXJCb29sIC0tIGJvb2xlYW4gKi9cblx0XHRcdHZhbFsxXSA9IHBhcnNlYm9vbChibG9iLCAxKSA/ICdUUlVFJyA6ICdGQUxTRSc7XG5cdFx0XHRpZihiaWZmICE9IDEyKSBibG9iLmwgKz0gNzsgYnJlYWs7XG5cdFx0Y2FzZSAweDI1OiAvKiBhcHBlYXJzIHRvIGJlIGFuIGFsaWFzICovXG5cdFx0Y2FzZSAweDEwOiAvKiBTZXJFcnIgLS0gZXJyb3IgKi9cblx0XHRcdHZhbFsxXSA9IEJFcnJbYmxvYltibG9iLmxdXTtcblx0XHRcdGJsb2IubCArPSAoKGJpZmYgPT0gMTIpID8gNCA6IDgpOyBicmVhaztcblx0XHRjYXNlIDB4MDA6IC8qIFNlck5pbCAtLSBob25lc3RseSwgSSdtIG5vdCBzdXJlIGhvdyB0byByZXByb2R1Y2UgdGhpcyAqL1xuXHRcdFx0YmxvYi5sICs9IDg7IGJyZWFrO1xuXHRcdGNhc2UgMHgwMTogLyogU2VyTnVtIC0tIFhudW0gKi9cblx0XHRcdHZhbFsxXSA9IHBhcnNlX1hudW0oYmxvYiwgOCk7IGJyZWFrO1xuXHRcdGNhc2UgMHgwMjogLyogU2VyU3RyIC0tIFhMVW5pY29kZVN0cmluZyAoPDI1NiBjaGFycykgKi9cblx0XHRcdHZhbFsxXSA9IHBhcnNlX1hMVW5pY29kZVN0cmluZzIoYmxvYiwgMCwge2JpZmY6YmlmZiA+IDAgJiYgYmlmZiA8IDggPyAyIDogYmlmZn0pOyBicmVhaztcblx0XHRkZWZhdWx0OiB0aHJvdyBuZXcgRXJyb3IoXCJCYWQgU2VyQXI6IFwiICsgdmFsWzBdKTsgLyogVW5yZWFjaGFibGUgKi9cblx0fVxuXHRyZXR1cm4gdmFsO1xufVxuXG4vKiBbTVMtWExTXSAyLjUuMTk4LjYxIDsgW01TLVhMU0JdIDIuNS45Ny40NCAqL1xuZnVuY3Rpb24gcGFyc2VfUHRnRXh0cmFNZW0oYmxvYiwgY2NlLCBvcHRzKSB7XG5cdHZhciBjb3VudCA9IGJsb2IucmVhZF9zaGlmdCgob3B0cy5iaWZmID09IDEyKSA/IDQgOiAyKTtcblx0dmFyIG91dCA9IFtdO1xuXHRmb3IodmFyIGkgPSAwOyBpICE9IGNvdW50OyArK2kpIG91dC5wdXNoKCgob3B0cy5iaWZmID09IDEyKSA/IHBhcnNlX1VuY2hlY2tlZFJmWCA6IHBhcnNlX1JlZjhVKShibG9iLCA4KSk7XG5cdHJldHVybiBvdXQ7XG59XG5cbi8qIFtNUy1YTFNdIDIuNS4xOTguNTkgOyBbTVMtWExTQl0gMi41Ljk3LjQxICovXG5mdW5jdGlvbiBwYXJzZV9QdGdFeHRyYUFycmF5KGJsb2IsIGxlbmd0aCwgb3B0cykge1xuXHR2YXIgcm93cyA9IDAsIGNvbHMgPSAwO1xuXHRpZihvcHRzLmJpZmYgPT0gMTIpIHtcblx0XHRyb3dzID0gYmxvYi5yZWFkX3NoaWZ0KDQpOyAvLyBEUndcblx0XHRjb2xzID0gYmxvYi5yZWFkX3NoaWZ0KDQpOyAvLyBEQ29sXG5cdH0gZWxzZSB7XG5cdFx0Y29scyA9IDEgKyBibG9iLnJlYWRfc2hpZnQoMSk7IC8vRENvbEJ5dGVVXG5cdFx0cm93cyA9IDEgKyBibG9iLnJlYWRfc2hpZnQoMik7IC8vRFJ3XG5cdH1cblx0aWYob3B0cy5iaWZmID49IDIgJiYgb3B0cy5iaWZmIDwgOCkgeyAtLXJvd3M7IGlmKC0tY29scyA9PSAwKSBjb2xzID0gMHgxMDA7IH1cblx0Ly8gJEZsb3dJZ25vcmVcblx0Zm9yKHZhciBpID0gMCwgbyA9IFtdOyBpICE9IHJvd3MgJiYgKG9baV0gPSBbXSk7ICsraSlcblx0XHRmb3IodmFyIGogPSAwOyBqICE9IGNvbHM7ICsraikgb1tpXVtqXSA9IHBhcnNlX1NlckFyKGJsb2IsIG9wdHMuYmlmZik7XG5cdHJldHVybiBvO1xufVxuXG4vKiBbTVMtWExTXSAyLjUuMTk4Ljc2IDsgW01TLVhMU0JdIDIuNS45Ny42MCAqL1xuZnVuY3Rpb24gcGFyc2VfUHRnTmFtZShibG9iLCBsZW5ndGgsIG9wdHMpIHtcblx0dmFyIHR5cGUgPSAoYmxvYi5yZWFkX3NoaWZ0KDEpID4+PiA1KSAmIDB4MDM7XG5cdHZhciB3ID0gKCFvcHRzIHx8IChvcHRzLmJpZmYgPj0gOCkpID8gNCA6IDI7XG5cdHZhciBuYW1laW5kZXggPSBibG9iLnJlYWRfc2hpZnQodyk7XG5cdHN3aXRjaChvcHRzLmJpZmYpIHtcblx0XHRjYXNlIDI6IGJsb2IubCArPSA1OyBicmVhaztcblx0XHRjYXNlIDM6IGNhc2UgNDogYmxvYi5sICs9IDg7IGJyZWFrO1xuXHRcdGNhc2UgNTogYmxvYi5sICs9IDEyOyBicmVhaztcblx0fVxuXHRyZXR1cm4gW3R5cGUsIDAsIG5hbWVpbmRleF07XG59XG5cbi8qIFtNUy1YTFNdIDIuNS4xOTguNzcgOyBbTVMtWExTQl0gMi41Ljk3LjYxICovXG5mdW5jdGlvbiBwYXJzZV9QdGdOYW1lWChibG9iLCBsZW5ndGgsIG9wdHMpIHtcblx0aWYob3B0cy5iaWZmID09IDUpIHJldHVybiBwYXJzZV9QdGdOYW1lWF9CSUZGNShibG9iLCBsZW5ndGgsIG9wdHMpO1xuXHR2YXIgdHlwZSA9IChibG9iLnJlYWRfc2hpZnQoMSkgPj4+IDUpICYgMHgwMztcblx0dmFyIGl4dGkgPSBibG9iLnJlYWRfc2hpZnQoMik7IC8vIFh0aUluZGV4XG5cdHZhciBuYW1laW5kZXggPSBibG9iLnJlYWRfc2hpZnQoNCk7XG5cdHJldHVybiBbdHlwZSwgaXh0aSwgbmFtZWluZGV4XTtcbn1cbmZ1bmN0aW9uIHBhcnNlX1B0Z05hbWVYX0JJRkY1KGJsb2IpIHtcblx0dmFyIHR5cGUgPSAoYmxvYi5yZWFkX3NoaWZ0KDEpID4+PiA1KSAmIDB4MDM7XG5cdHZhciBpeHRpID0gYmxvYi5yZWFkX3NoaWZ0KDIsICdpJyk7IC8vIFh0aUluZGV4XG5cdGJsb2IubCArPSA4O1xuXHR2YXIgbmFtZWluZGV4ID0gYmxvYi5yZWFkX3NoaWZ0KDIpO1xuXHRibG9iLmwgKz0gMTI7XG5cdHJldHVybiBbdHlwZSwgaXh0aSwgbmFtZWluZGV4XTtcbn1cblxuLyogW01TLVhMU10gMi41LjE5OC43MCA7IFtNUy1YTFNCXSAyLjUuOTcuNTQgKi9cbmZ1bmN0aW9uIHBhcnNlX1B0Z01lbUFyZWEoYmxvYiwgbGVuZ3RoLCBvcHRzKSB7XG5cdHZhciB0eXBlID0gKGJsb2IucmVhZF9zaGlmdCgxKSA+Pj4gNSkgJiAweDAzO1xuXHRibG9iLmwgKz0gKG9wdHMgJiYgb3B0cy5iaWZmID09IDIgPyAzIDogNCk7XG5cdHZhciBjY2UgPSBibG9iLnJlYWRfc2hpZnQob3B0cyAmJiBvcHRzLmJpZmYgPT0gMiA/IDEgOiAyKTtcblx0cmV0dXJuIFt0eXBlLCBjY2VdO1xufVxuXG4vKiBbTVMtWExTXSAyLjUuMTk4LjcyIDsgW01TLVhMU0JdIDIuNS45Ny41NiAqL1xuZnVuY3Rpb24gcGFyc2VfUHRnTWVtRnVuYyhibG9iLCBsZW5ndGgsIG9wdHMpIHtcblx0dmFyIHR5cGUgPSAoYmxvYi5yZWFkX3NoaWZ0KDEpID4+PiA1KSAmIDB4MDM7XG5cdHZhciBjY2UgPSBibG9iLnJlYWRfc2hpZnQob3B0cyAmJiBvcHRzLmJpZmYgPT0gMiA/IDEgOiAyKTtcblx0cmV0dXJuIFt0eXBlLCBjY2VdO1xufVxuXG5cbi8qIFtNUy1YTFNdIDIuNS4xOTguODYgOyBbTVMtWExTQl0gMi41Ljk3LjY5ICovXG5mdW5jdGlvbiBwYXJzZV9QdGdSZWZFcnIoYmxvYiwgbGVuZ3RoLCBvcHRzKSB7XG5cdHZhciB0eXBlID0gKGJsb2IucmVhZF9zaGlmdCgxKSA+Pj4gNSkgJiAweDAzO1xuXHRibG9iLmwgKz0gNDtcblx0aWYob3B0cy5iaWZmIDwgOCkgYmxvYi5sLS07XG5cdGlmKG9wdHMuYmlmZiA9PSAxMikgYmxvYi5sICs9IDI7XG5cdHJldHVybiBbdHlwZV07XG59XG5cbi8qIFtNUy1YTFNdIDIuNS4xOTguODcgOyBbTVMtWExTQl0gMi41Ljk3LjcxICovXG5mdW5jdGlvbiBwYXJzZV9QdGdSZWZFcnIzZChibG9iLCBsZW5ndGgsIG9wdHMpIHtcblx0dmFyIHR5cGUgPSAoYmxvYltibG9iLmwrK10gJiAweDYwKSA+PiA1O1xuXHR2YXIgaXh0aSA9IGJsb2IucmVhZF9zaGlmdCgyKTtcblx0dmFyIHcgPSA0O1xuXHRpZihvcHRzKSBzd2l0Y2gob3B0cy5iaWZmKSB7XG5cdFx0Y2FzZSA1OiB3ID0gMTU7IGJyZWFrO1xuXHRcdGNhc2UgMTI6IHcgPSA2OyBicmVhaztcblx0fVxuXHRibG9iLmwgKz0gdztcblx0cmV0dXJuIFt0eXBlLCBpeHRpXTtcbn1cblxuLyogW01TLVhMU10gMi41LjE5OC43MSA7IFtNUy1YTFNCXSAyLjUuOTcuNTUgKi9cbnZhciBwYXJzZV9QdGdNZW1FcnIgPSBwYXJzZW5vb3A7XG4vKiBbTVMtWExTXSAyLjUuMTk4LjczICA7IFtNUy1YTFNCXSAyLjUuOTcuNTcgKi9cbnZhciBwYXJzZV9QdGdNZW1Ob01lbSA9IHBhcnNlbm9vcDtcbi8qIFtNUy1YTFNdIDIuNS4xOTguOTIgKi9cbnZhciBwYXJzZV9QdGdUYmwgPSBwYXJzZW5vb3A7XG5cbmZ1bmN0aW9uIHBhcnNlX1B0Z0VsZkxvYyhibG9iLCBsZW5ndGgsIG9wdHMpIHtcblx0YmxvYi5sICs9IDI7XG5cdHJldHVybiBbcGFyc2VfUmdjZUVsZkxvYyhibG9iLCA0LCBvcHRzKV07XG59XG5mdW5jdGlvbiBwYXJzZV9QdGdFbGZOb29wKGJsb2IpIHtcblx0YmxvYi5sICs9IDY7XG5cdHJldHVybiBbXTtcbn1cbi8qIFtNUy1YTFNdIDIuNS4xOTguNDYgKi9cbnZhciBwYXJzZV9QdGdFbGZDb2wgPSBwYXJzZV9QdGdFbGZMb2M7XG4vKiBbTVMtWExTXSAyLjUuMTk4LjQ3ICovXG52YXIgcGFyc2VfUHRnRWxmQ29sUyA9IHBhcnNlX1B0Z0VsZk5vb3A7XG4vKiBbTVMtWExTXSAyLjUuMTk4LjQ4ICovXG52YXIgcGFyc2VfUHRnRWxmQ29sU1YgPSBwYXJzZV9QdGdFbGZOb29wO1xuLyogW01TLVhMU10gMi41LjE5OC40OSAqL1xudmFyIHBhcnNlX1B0Z0VsZkNvbFYgPSBwYXJzZV9QdGdFbGZMb2M7XG4vKiBbTVMtWExTXSAyLjUuMTk4LjUwICovXG5mdW5jdGlvbiBwYXJzZV9QdGdFbGZMZWwoYmxvYikge1xuXHRibG9iLmwgKz0gMjtcblx0cmV0dXJuIFtwYXJzZXVpbnQxNihibG9iKSwgYmxvYi5yZWFkX3NoaWZ0KDIpICYgMHgwMV07XG59XG4vKiBbTVMtWExTXSAyLjUuMTk4LjUxICovXG52YXIgcGFyc2VfUHRnRWxmUmFkaWNhbCA9IHBhcnNlX1B0Z0VsZkxvYztcbi8qIFtNUy1YTFNdIDIuNS4xOTguNTIgKi9cbnZhciBwYXJzZV9QdGdFbGZSYWRpY2FsTGVsID0gcGFyc2VfUHRnRWxmTGVsO1xuLyogW01TLVhMU10gMi41LjE5OC41MyAqL1xudmFyIHBhcnNlX1B0Z0VsZlJhZGljYWxTID0gcGFyc2VfUHRnRWxmTm9vcDtcbi8qIFtNUy1YTFNdIDIuNS4xOTguNTQgKi9cbnZhciBwYXJzZV9QdGdFbGZSdyA9IHBhcnNlX1B0Z0VsZkxvYztcbi8qIFtNUy1YTFNdIDIuNS4xOTguNTUgKi9cbnZhciBwYXJzZV9QdGdFbGZSd1YgPSBwYXJzZV9QdGdFbGZMb2M7XG5cbi8qIFtNUy1YTFNCXSAyLjUuOTcuNTIgVE9ETyAqL1xudmFyIFB0Z0xpc3RSVCA9IFtcblx0XCJEYXRhXCIsXG5cdFwiQWxsXCIsXG5cdFwiSGVhZGVyc1wiLFxuXHRcIj8/XCIsXG5cdFwiP0RhdGEyXCIsXG5cdFwiPz9cIixcblx0XCI/RGF0YUhlYWRlcnNcIixcblx0XCI/P1wiLFxuXHRcIlRvdGFsc1wiLFxuXHRcIj8/XCIsXG5cdFwiPz9cIixcblx0XCI/P1wiLFxuXHRcIj9EYXRhVG90YWxzXCIsXG5cdFwiPz9cIixcblx0XCI/P1wiLFxuXHRcIj8/XCIsXG5cdFwiP0N1cnJlbnRcIlxuXTtcbmZ1bmN0aW9uIHBhcnNlX1B0Z0xpc3QoYmxvYikge1xuXHRibG9iLmwgKz0gMjtcblx0dmFyIGl4dGkgPSBibG9iLnJlYWRfc2hpZnQoMik7XG5cdHZhciBmbGFncyA9IGJsb2IucmVhZF9zaGlmdCgyKTtcblx0dmFyIGlkeCA9IGJsb2IucmVhZF9zaGlmdCg0KTtcblx0dmFyIGMgPSBibG9iLnJlYWRfc2hpZnQoMik7XG5cdHZhciBDID0gYmxvYi5yZWFkX3NoaWZ0KDIpO1xuXHR2YXIgcnQgPSBQdGdMaXN0UlRbKGZsYWdzID4+IDIpICYgMHgxRl07XG5cdHJldHVybiB7aXh0aTogaXh0aSwgY29sdHlwZTooZmxhZ3MmMHgzKSwgcnQ6cnQsIGlkeDppZHgsIGM6YywgQzpDfTtcbn1cbi8qIFtNUy1YTFNdIDIuNS4xOTguOTEgOyBbTVMtWExTQl0gMi41Ljk3Ljc2ICovXG5mdW5jdGlvbiBwYXJzZV9QdGdTeE5hbWUoYmxvYikge1xuXHRibG9iLmwgKz0gMjtcblx0cmV0dXJuIFtibG9iLnJlYWRfc2hpZnQoNCldO1xufVxuXG4vKiBbWExTXSBvbGQgc3BlYyAqL1xuZnVuY3Rpb24gcGFyc2VfUHRnU2hlZXQoYmxvYiwgbGVuZ3RoLCBvcHRzKSB7XG5cdGJsb2IubCArPSA1O1xuXHRibG9iLmwgKz0gMjtcblx0YmxvYi5sICs9IChvcHRzLmJpZmYgPT0gMiA/IDEgOiA0KTtcblx0cmV0dXJuIFtcIlBUR1NIRUVUXCJdO1xufVxuZnVuY3Rpb24gcGFyc2VfUHRnRW5kU2hlZXQoYmxvYiwgbGVuZ3RoLCBvcHRzKSB7XG5cdGJsb2IubCArPSAob3B0cy5iaWZmID09IDIgPyA0IDogNSk7XG5cdHJldHVybiBbXCJQVEdFTkRTSEVFVFwiXTtcbn1cbmZ1bmN0aW9uIHBhcnNlX1B0Z01lbUFyZWFOKGJsb2IpIHtcblx0dmFyIHR5cGUgPSAoYmxvYi5yZWFkX3NoaWZ0KDEpID4+PiA1KSAmIDB4MDM7XG5cdHZhciBjY2UgPSBibG9iLnJlYWRfc2hpZnQoMik7XG5cdHJldHVybiBbdHlwZSwgY2NlXTtcbn1cbmZ1bmN0aW9uIHBhcnNlX1B0Z01lbU5vTWVtTihibG9iKSB7XG5cdHZhciB0eXBlID0gKGJsb2IucmVhZF9zaGlmdCgxKSA+Pj4gNSkgJiAweDAzO1xuXHR2YXIgY2NlID0gYmxvYi5yZWFkX3NoaWZ0KDIpO1xuXHRyZXR1cm4gW3R5cGUsIGNjZV07XG59XG5mdW5jdGlvbiBwYXJzZV9QdGdBdHRyTm9vcChibG9iKSB7XG5cdGJsb2IubCArPSA0O1xuXHRyZXR1cm4gWzAsIDBdO1xufVxuXG4vKiBbTVMtWExTXSAyLjUuMTk4LjI1IDsgW01TLVhMU0JdIDIuNS45Ny4xNiAqL1xudmFyIFB0Z1R5cGVzID0ge1xuMHgwMTogeyBuOidQdGdFeHAnLCBmOnBhcnNlX1B0Z0V4cCB9LFxuMHgwMjogeyBuOidQdGdUYmwnLCBmOnBhcnNlX1B0Z1RibCB9LFxuMHgwMzogeyBuOidQdGdBZGQnLCBmOnBhcnNlcmVhZDEgfSxcbjB4MDQ6IHsgbjonUHRnU3ViJywgZjpwYXJzZXJlYWQxIH0sXG4weDA1OiB7IG46J1B0Z011bCcsIGY6cGFyc2VyZWFkMSB9LFxuMHgwNjogeyBuOidQdGdEaXYnLCBmOnBhcnNlcmVhZDEgfSxcbjB4MDc6IHsgbjonUHRnUG93ZXInLCBmOnBhcnNlcmVhZDEgfSxcbjB4MDg6IHsgbjonUHRnQ29uY2F0JywgZjpwYXJzZXJlYWQxIH0sXG4weDA5OiB7IG46J1B0Z0x0JywgZjpwYXJzZXJlYWQxIH0sXG4weDBBOiB7IG46J1B0Z0xlJywgZjpwYXJzZXJlYWQxIH0sXG4weDBCOiB7IG46J1B0Z0VxJywgZjpwYXJzZXJlYWQxIH0sXG4weDBDOiB7IG46J1B0Z0dlJywgZjpwYXJzZXJlYWQxIH0sXG4weDBEOiB7IG46J1B0Z0d0JywgZjpwYXJzZXJlYWQxIH0sXG4weDBFOiB7IG46J1B0Z05lJywgZjpwYXJzZXJlYWQxIH0sXG4weDBGOiB7IG46J1B0Z0lzZWN0JywgZjpwYXJzZXJlYWQxIH0sXG4weDEwOiB7IG46J1B0Z1VuaW9uJywgZjpwYXJzZXJlYWQxIH0sXG4weDExOiB7IG46J1B0Z1JhbmdlJywgZjpwYXJzZXJlYWQxIH0sXG4weDEyOiB7IG46J1B0Z1VwbHVzJywgZjpwYXJzZXJlYWQxIH0sXG4weDEzOiB7IG46J1B0Z1VtaW51cycsIGY6cGFyc2VyZWFkMSB9LFxuMHgxNDogeyBuOidQdGdQZXJjZW50JywgZjpwYXJzZXJlYWQxIH0sXG4weDE1OiB7IG46J1B0Z1BhcmVuJywgZjpwYXJzZXJlYWQxIH0sXG4weDE2OiB7IG46J1B0Z01pc3NBcmcnLCBmOnBhcnNlcmVhZDEgfSxcbjB4MTc6IHsgbjonUHRnU3RyJywgZjpwYXJzZV9QdGdTdHIgfSxcbjB4MUE6IHsgbjonUHRnU2hlZXQnLCBmOnBhcnNlX1B0Z1NoZWV0IH0sXG4weDFCOiB7IG46J1B0Z0VuZFNoZWV0JywgZjpwYXJzZV9QdGdFbmRTaGVldCB9LFxuMHgxQzogeyBuOidQdGdFcnInLCBmOnBhcnNlX1B0Z0VyciB9LFxuMHgxRDogeyBuOidQdGdCb29sJywgZjpwYXJzZV9QdGdCb29sIH0sXG4weDFFOiB7IG46J1B0Z0ludCcsIGY6cGFyc2VfUHRnSW50IH0sXG4weDFGOiB7IG46J1B0Z051bScsIGY6cGFyc2VfUHRnTnVtIH0sXG4weDIwOiB7IG46J1B0Z0FycmF5JywgZjpwYXJzZV9QdGdBcnJheSB9LFxuMHgyMTogeyBuOidQdGdGdW5jJywgZjpwYXJzZV9QdGdGdW5jIH0sXG4weDIyOiB7IG46J1B0Z0Z1bmNWYXInLCBmOnBhcnNlX1B0Z0Z1bmNWYXIgfSxcbjB4MjM6IHsgbjonUHRnTmFtZScsIGY6cGFyc2VfUHRnTmFtZSB9LFxuMHgyNDogeyBuOidQdGdSZWYnLCBmOnBhcnNlX1B0Z1JlZiB9LFxuMHgyNTogeyBuOidQdGdBcmVhJywgZjpwYXJzZV9QdGdBcmVhIH0sXG4weDI2OiB7IG46J1B0Z01lbUFyZWEnLCBmOnBhcnNlX1B0Z01lbUFyZWEgfSxcbjB4Mjc6IHsgbjonUHRnTWVtRXJyJywgZjpwYXJzZV9QdGdNZW1FcnIgfSxcbjB4Mjg6IHsgbjonUHRnTWVtTm9NZW0nLCBmOnBhcnNlX1B0Z01lbU5vTWVtIH0sXG4weDI5OiB7IG46J1B0Z01lbUZ1bmMnLCBmOnBhcnNlX1B0Z01lbUZ1bmMgfSxcbjB4MkE6IHsgbjonUHRnUmVmRXJyJywgZjpwYXJzZV9QdGdSZWZFcnIgfSxcbjB4MkI6IHsgbjonUHRnQXJlYUVycicsIGY6cGFyc2VfUHRnQXJlYUVyciB9LFxuMHgyQzogeyBuOidQdGdSZWZOJywgZjpwYXJzZV9QdGdSZWZOIH0sXG4weDJEOiB7IG46J1B0Z0FyZWFOJywgZjpwYXJzZV9QdGdBcmVhTiB9LFxuMHgyRTogeyBuOidQdGdNZW1BcmVhTicsIGY6cGFyc2VfUHRnTWVtQXJlYU4gfSxcbjB4MkY6IHsgbjonUHRnTWVtTm9NZW1OJywgZjpwYXJzZV9QdGdNZW1Ob01lbU4gfSxcbjB4Mzk6IHsgbjonUHRnTmFtZVgnLCBmOnBhcnNlX1B0Z05hbWVYIH0sXG4weDNBOiB7IG46J1B0Z1JlZjNkJywgZjpwYXJzZV9QdGdSZWYzZCB9LFxuMHgzQjogeyBuOidQdGdBcmVhM2QnLCBmOnBhcnNlX1B0Z0FyZWEzZCB9LFxuMHgzQzogeyBuOidQdGdSZWZFcnIzZCcsIGY6cGFyc2VfUHRnUmVmRXJyM2QgfSxcbjB4M0Q6IHsgbjonUHRnQXJlYUVycjNkJywgZjpwYXJzZV9QdGdBcmVhRXJyM2QgfSxcbjB4RkY6IHt9XG59O1xuLyogVGhlc2UgYXJlIGR1cGxpY2F0ZWQgaW4gdGhlIFB0Z1R5cGVzIHRhYmxlICovXG52YXIgUHRnRHVwZXMgPSB7XG4weDQwOiAweDIwLCAweDYwOiAweDIwLFxuMHg0MTogMHgyMSwgMHg2MTogMHgyMSxcbjB4NDI6IDB4MjIsIDB4NjI6IDB4MjIsXG4weDQzOiAweDIzLCAweDYzOiAweDIzLFxuMHg0NDogMHgyNCwgMHg2NDogMHgyNCxcbjB4NDU6IDB4MjUsIDB4NjU6IDB4MjUsXG4weDQ2OiAweDI2LCAweDY2OiAweDI2LFxuMHg0NzogMHgyNywgMHg2NzogMHgyNyxcbjB4NDg6IDB4MjgsIDB4Njg6IDB4MjgsXG4weDQ5OiAweDI5LCAweDY5OiAweDI5LFxuMHg0QTogMHgyQSwgMHg2QTogMHgyQSxcbjB4NEI6IDB4MkIsIDB4NkI6IDB4MkIsXG4weDRDOiAweDJDLCAweDZDOiAweDJDLFxuMHg0RDogMHgyRCwgMHg2RDogMHgyRCxcbjB4NEU6IDB4MkUsIDB4NkU6IDB4MkUsXG4weDRGOiAweDJGLCAweDZGOiAweDJGLFxuMHg1ODogMHgyMiwgMHg3ODogMHgyMixcbjB4NTk6IDB4MzksIDB4Nzk6IDB4MzksXG4weDVBOiAweDNBLCAweDdBOiAweDNBLFxuMHg1QjogMHgzQiwgMHg3QjogMHgzQixcbjB4NUM6IDB4M0MsIDB4N0M6IDB4M0MsXG4weDVEOiAweDNELCAweDdEOiAweDNEXG59O1xuKGZ1bmN0aW9uKCl7Zm9yKHZhciB5IGluIFB0Z0R1cGVzKSBQdGdUeXBlc1t5XSA9IFB0Z1R5cGVzW1B0Z0R1cGVzW3ldXTt9KSgpO1xuXG52YXIgUHRnMTggPSB7XG4weDAxOiB7IG46J1B0Z0VsZkxlbCcsIGY6cGFyc2VfUHRnRWxmTGVsIH0sXG4weDAyOiB7IG46J1B0Z0VsZlJ3JywgZjpwYXJzZV9QdGdFbGZSdyB9LFxuMHgwMzogeyBuOidQdGdFbGZDb2wnLCBmOnBhcnNlX1B0Z0VsZkNvbCB9LFxuMHgwNjogeyBuOidQdGdFbGZSd1YnLCBmOnBhcnNlX1B0Z0VsZlJ3ViB9LFxuMHgwNzogeyBuOidQdGdFbGZDb2xWJywgZjpwYXJzZV9QdGdFbGZDb2xWIH0sXG4weDBBOiB7IG46J1B0Z0VsZlJhZGljYWwnLCBmOnBhcnNlX1B0Z0VsZlJhZGljYWwgfSxcbjB4MEI6IHsgbjonUHRnRWxmUmFkaWNhbFMnLCBmOnBhcnNlX1B0Z0VsZlJhZGljYWxTIH0sXG4weDBEOiB7IG46J1B0Z0VsZkNvbFMnLCBmOnBhcnNlX1B0Z0VsZkNvbFMgfSxcbjB4MEY6IHsgbjonUHRnRWxmQ29sU1YnLCBmOnBhcnNlX1B0Z0VsZkNvbFNWIH0sXG4weDEwOiB7IG46J1B0Z0VsZlJhZGljYWxMZWwnLCBmOnBhcnNlX1B0Z0VsZlJhZGljYWxMZWwgfSxcbjB4MTk6IHsgbjonUHRnTGlzdCcsIGY6cGFyc2VfUHRnTGlzdCB9LFxuMHgxRDogeyBuOidQdGdTeE5hbWUnLCBmOnBhcnNlX1B0Z1N4TmFtZSB9LFxuMHhGRjoge31cbn07XG52YXIgUHRnMTkgPSB7XG4weDAwOiB7IG46J1B0Z0F0dHJOb29wJywgZjpwYXJzZV9QdGdBdHRyTm9vcCB9LFxuMHgwMTogeyBuOidQdGdBdHRyU2VtaScsIGY6cGFyc2VfUHRnQXR0clNlbWkgfSxcbjB4MDI6IHsgbjonUHRnQXR0cklmJywgZjpwYXJzZV9QdGdBdHRySWYgfSxcbjB4MDQ6IHsgbjonUHRnQXR0ckNob29zZScsIGY6cGFyc2VfUHRnQXR0ckNob29zZSB9LFxuMHgwODogeyBuOidQdGdBdHRyR290bycsIGY6cGFyc2VfUHRnQXR0ckdvdG8gfSxcbjB4MTA6IHsgbjonUHRnQXR0clN1bScsIGY6cGFyc2VfUHRnQXR0clN1bSB9LFxuMHgyMDogeyBuOidQdGdBdHRyQmF4Y2VsJywgZjpwYXJzZV9QdGdBdHRyQmF4Y2VsIH0sXG4weDQwOiB7IG46J1B0Z0F0dHJTcGFjZScsIGY6cGFyc2VfUHRnQXR0clNwYWNlIH0sXG4weDQxOiB7IG46J1B0Z0F0dHJTcGFjZVNlbWknLCBmOnBhcnNlX1B0Z0F0dHJTcGFjZVNlbWkgfSxcbjB4ODA6IHsgbjonUHRnQXR0cklmRXJyb3InLCBmOnBhcnNlX1B0Z0F0dHJJZkVycm9yIH0sXG4weEZGOiB7fVxufTtcblB0ZzE5WzB4MjFdID0gUHRnMTlbMHgyMF07XG5cbi8qIFtNUy1YTFNdIDIuNS4xOTguMTAzIDsgW01TLVhMU0JdIDIuNS45Ny44NyAqL1xuZnVuY3Rpb24gcGFyc2VfUmdiRXh0cmEoYmxvYiwgbGVuZ3RoLCByZ2NlLCBvcHRzKSB7XG5cdGlmKG9wdHMuYmlmZiA8IDgpIHJldHVybiBwYXJzZW5vb3AoYmxvYiwgbGVuZ3RoKTtcblx0dmFyIHRhcmdldCA9IGJsb2IubCArIGxlbmd0aDtcblx0dmFyIG8gPSBbXTtcblx0Zm9yKHZhciBpID0gMDsgaSAhPT0gcmdjZS5sZW5ndGg7ICsraSkge1xuXHRcdHN3aXRjaChyZ2NlW2ldWzBdKSB7XG5cdFx0XHRjYXNlICdQdGdBcnJheSc6IC8qIFB0Z0FycmF5IC0+IFB0Z0V4dHJhQXJyYXkgKi9cblx0XHRcdFx0cmdjZVtpXVsxXSA9IHBhcnNlX1B0Z0V4dHJhQXJyYXkoYmxvYiwgMCwgb3B0cyk7XG5cdFx0XHRcdG8ucHVzaChyZ2NlW2ldWzFdKTtcblx0XHRcdFx0YnJlYWs7XG5cdFx0XHRjYXNlICdQdGdNZW1BcmVhJzogLyogUHRnTWVtQXJlYSAtPiBQdGdFeHRyYU1lbSAqL1xuXHRcdFx0XHRyZ2NlW2ldWzJdID0gcGFyc2VfUHRnRXh0cmFNZW0oYmxvYiwgcmdjZVtpXVsxXSwgb3B0cyk7XG5cdFx0XHRcdG8ucHVzaChyZ2NlW2ldWzJdKTtcblx0XHRcdFx0YnJlYWs7XG5cdFx0XHRjYXNlICdQdGdFeHAnOiAvKiBQdGdFeHAgLT4gUHRnRXh0cmFDb2wgKi9cblx0XHRcdFx0aWYob3B0cyAmJiBvcHRzLmJpZmYgPT0gMTIpIHtcblx0XHRcdFx0XHRyZ2NlW2ldWzFdWzFdID0gYmxvYi5yZWFkX3NoaWZ0KDQpO1xuXHRcdFx0XHRcdG8ucHVzaChyZ2NlW2ldWzFdKTtcblx0XHRcdFx0fSBicmVhaztcblx0XHRcdGNhc2UgJ1B0Z0xpc3QnOiAvKiBUT0RPOiBQdGdMaXN0IC0+IFB0Z0V4dHJhTGlzdCAqL1xuXHRcdFx0Y2FzZSAnUHRnRWxmUmFkaWNhbFMnOiAvKiBUT0RPOiBQdGdFbGZSYWRpY2FsUyAtPiBQdGdFeHRyYUVsZiAqL1xuXHRcdFx0Y2FzZSAnUHRnRWxmQ29sUyc6IC8qIFRPRE86IFB0Z0VsZkNvbFMgLT4gUHRnRXh0cmFFbGYgKi9cblx0XHRcdGNhc2UgJ1B0Z0VsZkNvbFNWJzogLyogVE9ETzogUHRnRWxmQ29sU1YgLT4gUHRnRXh0cmFFbGYgKi9cblx0XHRcdFx0dGhyb3cgXCJVbnN1cHBvcnRlZCBcIiArIHJnY2VbaV1bMF07XG5cdFx0XHRkZWZhdWx0OiBicmVhaztcblx0XHR9XG5cdH1cblx0bGVuZ3RoID0gdGFyZ2V0IC0gYmxvYi5sO1xuXHQvKiBub3RlOiB0aGlzIGlzIHRlY2huaWNhbGx5IGFuIGVycm9yIGJ1dCBFeGNlbCBkaXNyZWdhcmRzICovXG5cdC8vaWYodGFyZ2V0ICE9PSBibG9iLmwgJiYgYmxvYi5sICE9PSB0YXJnZXQgLSBsZW5ndGgpIHRocm93IG5ldyBFcnJvcih0YXJnZXQgKyBcIiAhPSBcIiArIGJsb2IubCk7XG5cdGlmKGxlbmd0aCAhPT0gMCkgby5wdXNoKHBhcnNlbm9vcChibG9iLCBsZW5ndGgpKTtcblx0cmV0dXJuIG87XG59XG5cbi8qIFtNUy1YTFNdIDIuNS4xOTguMTA0IDsgW01TLVhMU0JdIDIuNS45Ny44OCAqL1xuZnVuY3Rpb24gcGFyc2VfUmdjZShibG9iLCBsZW5ndGgsIG9wdHMpIHtcblx0dmFyIHRhcmdldCA9IGJsb2IubCArIGxlbmd0aDtcblx0dmFyIFIsIGlkLCBwdGdzID0gW107XG5cdHdoaWxlKHRhcmdldCAhPSBibG9iLmwpIHtcblx0XHRsZW5ndGggPSB0YXJnZXQgLSBibG9iLmw7XG5cdFx0aWQgPSBibG9iW2Jsb2IubF07XG5cdFx0UiA9IFB0Z1R5cGVzW2lkXTtcblx0XHRpZihpZCA9PT0gMHgxOCB8fCBpZCA9PT0gMHgxOSkgUiA9IChpZCA9PT0gMHgxOCA/IFB0ZzE4IDogUHRnMTkpW2Jsb2JbYmxvYi5sICsgMV1dO1xuXHRcdGlmKCFSIHx8ICFSLmYpIHsgLypwdGdzLnB1c2gqLyhwYXJzZW5vb3AoYmxvYiwgbGVuZ3RoKSk7IH1cblx0XHRlbHNlIHsgcHRncy5wdXNoKFtSLm4sIFIuZihibG9iLCBsZW5ndGgsIG9wdHMpXSk7IH1cblx0fVxuXHRyZXR1cm4gcHRncztcbn1cblxuZnVuY3Rpb24gc3RyaW5naWZ5X2FycmF5KGYpIHtcblx0dmFyIG8gPSBbXTtcblx0Zm9yKHZhciBpID0gMDsgaSA8IGYubGVuZ3RoOyArK2kpIHtcblx0XHR2YXIgeCA9IGZbaV0sIHIgPSBbXTtcblx0XHRmb3IodmFyIGogPSAwOyBqIDwgeC5sZW5ndGg7ICsraikge1xuXHRcdFx0dmFyIHkgPSB4W2pdO1xuXHRcdFx0aWYoeSkgc3dpdGNoKHlbMF0pIHtcblx0XHRcdFx0Ly8gVE9ETzogaGFuZGxlIGVtYmVkZGVkIHF1b3Rlc1xuXHRcdFx0XHRjYXNlIDB4MDI6XG5yLnB1c2goJ1wiJyArIHlbMV0ucmVwbGFjZSgvXCIvZywnXCJcIicpICsgJ1wiJyk7IGJyZWFrO1xuXHRcdFx0XHRkZWZhdWx0OiByLnB1c2goeVsxXSk7XG5cdFx0XHR9IGVsc2Ugci5wdXNoKFwiXCIpO1xuXHRcdH1cblx0XHRvLnB1c2goci5qb2luKFwiLFwiKSk7XG5cdH1cblx0cmV0dXJuIG8uam9pbihcIjtcIik7XG59XG5cbi8qIFtNUy1YTFNdIDIuMi4yIDsgW01TLVhMU0JdIDIuMi4yIFRPRE8gKi9cbnZhciBQdGdCaW5PcCA9IHtcblx0UHRnQWRkOiBcIitcIixcblx0UHRnQ29uY2F0OiBcIiZcIixcblx0UHRnRGl2OiBcIi9cIixcblx0UHRnRXE6IFwiPVwiLFxuXHRQdGdHZTogXCI+PVwiLFxuXHRQdGdHdDogXCI+XCIsXG5cdFB0Z0xlOiBcIjw9XCIsXG5cdFB0Z0x0OiBcIjxcIixcblx0UHRnTXVsOiBcIipcIixcblx0UHRnTmU6IFwiPD5cIixcblx0UHRnUG93ZXI6IFwiXlwiLFxuXHRQdGdTdWI6IFwiLVwiXG59O1xuXG4vLyBMaXN0IG9mIGludmFsaWQgY2hhcmFjdGVycyBuZWVkcyB0byBiZSB0ZXN0ZWQgZnVydGhlclxudmFyIHF1b3RlQ2hhcmFjdGVycyAgPSBuZXcgUmVnRXhwKC9bXlxcd1xcdTRFMDAtXFx1OUZGRlxcdTMwNDAtXFx1MzBGRl0vKTtcbmZ1bmN0aW9uIGZvcm11bGFfcXVvdGVfc2hlZXRfbmFtZShzbmFtZSwgb3B0cykge1xuXHRpZighc25hbWUgJiYgIShvcHRzICYmIG9wdHMuYmlmZiA8PSA1ICYmIG9wdHMuYmlmZiA+PSAyKSkgdGhyb3cgbmV3IEVycm9yKFwiZW1wdHkgc2hlZXQgbmFtZVwiKTtcblx0aWYgKHF1b3RlQ2hhcmFjdGVycy50ZXN0KHNuYW1lKSkgcmV0dXJuIFwiJ1wiICsgc25hbWUgKyBcIidcIjtcblx0cmV0dXJuIHNuYW1lO1xufVxuZnVuY3Rpb24gZ2V0X2l4dGlfcmF3KHN1cGJvb2tzLCBpeHRpLCBvcHRzKSB7XG5cdGlmKCFzdXBib29rcykgcmV0dXJuIFwiU0gzM1RKU0VSUjBcIjtcblx0aWYob3B0cy5iaWZmID4gOCAmJiAoIXN1cGJvb2tzLlhUSSB8fCAhc3VwYm9va3MuWFRJW2l4dGldKSkgcmV0dXJuIHN1cGJvb2tzLlNoZWV0TmFtZXNbaXh0aV07XG5cdGlmKCFzdXBib29rcy5YVEkpIHJldHVybiBcIlNIMzNUSlNFUlI2XCI7XG5cdHZhciBYVEkgPSBzdXBib29rcy5YVElbaXh0aV07XG5cdGlmKG9wdHMuYmlmZiA8IDgpIHtcblx0XHRpZihpeHRpID4gMTAwMDApIGl4dGktPSA2NTUzNjtcblx0XHRpZihpeHRpIDwgMCkgaXh0aSA9IC1peHRpO1xuXHRcdHJldHVybiBpeHRpID09IDAgPyBcIlwiIDogc3VwYm9va3MuWFRJW2l4dGkgLSAxXTtcblx0fVxuXHRpZighWFRJKSByZXR1cm4gXCJTSDMzVEpTRVJSMVwiO1xuXHR2YXIgbyA9IFwiXCI7XG5cdGlmKG9wdHMuYmlmZiA+IDgpIHN3aXRjaChzdXBib29rc1tYVElbMF1dWzBdKSB7XG5cdFx0Y2FzZSAweDAxNjU6IC8qICdCcnRTdXBTZWxmJyAqL1xuXHRcdFx0byA9IFhUSVsxXSA9PSAtMSA/IFwiI1JFRlwiIDogc3VwYm9va3MuU2hlZXROYW1lc1tYVElbMV1dO1xuXHRcdFx0cmV0dXJuIFhUSVsxXSA9PSBYVElbMl0gPyBvIDogbyArIFwiOlwiICsgc3VwYm9va3MuU2hlZXROYW1lc1tYVElbMl1dO1xuXHRcdGNhc2UgMHgwMTY2OiAvKiAnQnJ0U3VwU2FtZScgKi9cblx0XHRcdGlmKG9wdHMuU0lEICE9IG51bGwpIHJldHVybiBzdXBib29rcy5TaGVldE5hbWVzW29wdHMuU0lEXTtcblx0XHRcdHJldHVybiBcIlNIMzNUSlNTQU1FXCIgKyBzdXBib29rc1tYVElbMF1dWzBdO1xuXHRcdGNhc2UgMHgwMTYzOiAvKiAnQnJ0U3VwQm9va1NyYycgKi9cblx0XHRcdC8qIGZhbGxzIHRocm91Z2ggKi9cblx0XHRkZWZhdWx0OiByZXR1cm4gXCJTSDMzVEpTU1JDXCIgKyBzdXBib29rc1tYVElbMF1dWzBdO1xuXHR9XG5cdHN3aXRjaChzdXBib29rc1tYVElbMF1dWzBdWzBdKSB7XG5cdFx0Y2FzZSAweDA0MDE6XG5cdFx0XHRvID0gWFRJWzFdID09IC0xID8gXCIjUkVGXCIgOiAoc3VwYm9va3MuU2hlZXROYW1lc1tYVElbMV1dIHx8IFwiU0gzM1RKU0VSUjNcIik7XG5cdFx0XHRyZXR1cm4gWFRJWzFdID09IFhUSVsyXSA/IG8gOiBvICsgXCI6XCIgKyBzdXBib29rcy5TaGVldE5hbWVzW1hUSVsyXV07XG5cdFx0Y2FzZSAweDNBMDE6IHJldHVybiBzdXBib29rc1tYVElbMF1dLnNsaWNlKDEpLm1hcChmdW5jdGlvbihuYW1lKSB7IHJldHVybiBuYW1lLk5hbWU7IH0pLmpvaW4oXCI7O1wiKTsgLy9yZXR1cm4gXCJTSDMzVEpTRVJSOFwiO1xuXHRcdGRlZmF1bHQ6XG5cdFx0XHRpZighc3VwYm9va3NbWFRJWzBdXVswXVszXSkgcmV0dXJuIFwiU0gzM1RKU0VSUjJcIjtcblx0XHRcdG8gPSBYVElbMV0gPT0gLTEgPyBcIiNSRUZcIiA6IChzdXBib29rc1tYVElbMF1dWzBdWzNdW1hUSVsxXV0gfHwgXCJTSDMzVEpTRVJSNFwiKTtcblx0XHRcdHJldHVybiBYVElbMV0gPT0gWFRJWzJdID8gbyA6IG8gKyBcIjpcIiArIHN1cGJvb2tzW1hUSVswXV1bMF1bM11bWFRJWzJdXTtcblx0fVxufVxuZnVuY3Rpb24gZ2V0X2l4dGkoc3VwYm9va3MsIGl4dGksIG9wdHMpIHtcblx0cmV0dXJuIGZvcm11bGFfcXVvdGVfc2hlZXRfbmFtZShnZXRfaXh0aV9yYXcoc3VwYm9va3MsIGl4dGksIG9wdHMpLCBvcHRzKTtcbn1cbmZ1bmN0aW9uIHN0cmluZ2lmeV9mb3JtdWxhKGZvcm11bGEvKkFycmF5PGFueT4qLywgcmFuZ2UsIGNlbGwsIHN1cGJvb2tzLCBvcHRzKSB7XG5cdHZhciBiaWZmID0gKG9wdHMgJiYgb3B0cy5iaWZmKSB8fCA4O1xuXHR2YXIgX3JhbmdlID0gLypyYW5nZSAhPSBudWxsID8gcmFuZ2UgOiovIHtzOntjOjAsIHI6MH0sZTp7YzowLCByOjB9fTtcblx0dmFyIHN0YWNrID0gW10sIGUxLCBlMiwgIGMsIGl4dGk9MCwgbmFtZWlkeD0wLCByLCBzbmFtZT1cIlwiO1xuXHRpZighZm9ybXVsYVswXSB8fCAhZm9ybXVsYVswXVswXSkgcmV0dXJuIFwiXCI7XG5cdHZhciBsYXN0X3NwID0gLTEsIHNwID0gXCJcIjtcblx0Zm9yKHZhciBmZiA9IDAsIGZmbGVuID0gZm9ybXVsYVswXS5sZW5ndGg7IGZmIDwgZmZsZW47ICsrZmYpIHtcblx0XHR2YXIgZiA9IGZvcm11bGFbMF1bZmZdO1xuXHRcdHN3aXRjaChmWzBdKSB7XG5cdFx0XHRjYXNlICdQdGdVbWludXMnOiAvKiBbTVMtWExTXSAyLjUuMTk4LjkzICovXG5cdFx0XHRcdHN0YWNrLnB1c2goXCItXCIgKyBzdGFjay5wb3AoKSk7IGJyZWFrO1xuXHRcdFx0Y2FzZSAnUHRnVXBsdXMnOiAvKiBbTVMtWExTXSAyLjUuMTk4Ljk1ICovXG5cdFx0XHRcdHN0YWNrLnB1c2goXCIrXCIgKyBzdGFjay5wb3AoKSk7IGJyZWFrO1xuXHRcdFx0Y2FzZSAnUHRnUGVyY2VudCc6IC8qIFtNUy1YTFNdIDIuNS4xOTguODEgKi9cblx0XHRcdFx0c3RhY2sucHVzaChzdGFjay5wb3AoKSArIFwiJVwiKTsgYnJlYWs7XG5cblx0XHRcdGNhc2UgJ1B0Z0FkZCc6ICAgIC8qIFtNUy1YTFNdIDIuNS4xOTguMjYgKi9cblx0XHRcdGNhc2UgJ1B0Z0NvbmNhdCc6IC8qIFtNUy1YTFNdIDIuNS4xOTguNDMgKi9cblx0XHRcdGNhc2UgJ1B0Z0Rpdic6ICAgIC8qIFtNUy1YTFNdIDIuNS4xOTguNDUgKi9cblx0XHRcdGNhc2UgJ1B0Z0VxJzogICAgIC8qIFtNUy1YTFNdIDIuNS4xOTguNTYgKi9cblx0XHRcdGNhc2UgJ1B0Z0dlJzogICAgIC8qIFtNUy1YTFNdIDIuNS4xOTguNjQgKi9cblx0XHRcdGNhc2UgJ1B0Z0d0JzogICAgIC8qIFtNUy1YTFNdIDIuNS4xOTguNjUgKi9cblx0XHRcdGNhc2UgJ1B0Z0xlJzogICAgIC8qIFtNUy1YTFNdIDIuNS4xOTguNjggKi9cblx0XHRcdGNhc2UgJ1B0Z0x0JzogICAgIC8qIFtNUy1YTFNdIDIuNS4xOTguNjkgKi9cblx0XHRcdGNhc2UgJ1B0Z011bCc6ICAgIC8qIFtNUy1YTFNdIDIuNS4xOTguNzUgKi9cblx0XHRcdGNhc2UgJ1B0Z05lJzogICAgIC8qIFtNUy1YTFNdIDIuNS4xOTguNzggKi9cblx0XHRcdGNhc2UgJ1B0Z1Bvd2VyJzogIC8qIFtNUy1YTFNdIDIuNS4xOTguODIgKi9cblx0XHRcdGNhc2UgJ1B0Z1N1Yic6ICAgIC8qIFtNUy1YTFNdIDIuNS4xOTguOTAgKi9cblx0XHRcdFx0ZTEgPSBzdGFjay5wb3AoKTsgZTIgPSBzdGFjay5wb3AoKTtcblx0XHRcdFx0aWYobGFzdF9zcCA+PSAwKSB7XG5cdFx0XHRcdFx0c3dpdGNoKGZvcm11bGFbMF1bbGFzdF9zcF1bMV1bMF0pIHtcblx0XHRcdFx0XHRcdGNhc2UgMDpcblx0XHRcdFx0XHRcdFx0Ly8gJEZsb3dJZ25vcmVcblx0XHRcdFx0XHRcdFx0c3AgPSBmaWxsKFwiIFwiLCBmb3JtdWxhWzBdW2xhc3Rfc3BdWzFdWzFdKTsgYnJlYWs7XG5cdFx0XHRcdFx0XHRjYXNlIDE6XG5cdFx0XHRcdFx0XHRcdC8vICRGbG93SWdub3JlXG5cdFx0XHRcdFx0XHRcdHNwID0gZmlsbChcIlxcclwiLCBmb3JtdWxhWzBdW2xhc3Rfc3BdWzFdWzFdKTsgYnJlYWs7XG5cdFx0XHRcdFx0XHRkZWZhdWx0OlxuXHRcdFx0XHRcdFx0XHRzcCA9IFwiXCI7XG5cdFx0XHRcdFx0XHRcdC8vICRGbG93SWdub3JlXG5cdFx0XHRcdFx0XHRcdGlmKG9wdHMuV1RGKSB0aHJvdyBuZXcgRXJyb3IoXCJVbmV4cGVjdGVkIFB0Z0F0dHJTcGFjZVR5cGUgXCIgKyBmb3JtdWxhWzBdW2xhc3Rfc3BdWzFdWzBdKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0ZTIgPSBlMiArIHNwO1xuXHRcdFx0XHRcdGxhc3Rfc3AgPSAtMTtcblx0XHRcdFx0fVxuXHRcdFx0XHRzdGFjay5wdXNoKGUyK1B0Z0Jpbk9wW2ZbMF1dK2UxKTtcblx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdGNhc2UgJ1B0Z0lzZWN0JzogLyogW01TLVhMU10gMi41LjE5OC42NyAqL1xuXHRcdFx0XHRlMSA9IHN0YWNrLnBvcCgpOyBlMiA9IHN0YWNrLnBvcCgpO1xuXHRcdFx0XHRzdGFjay5wdXNoKGUyK1wiIFwiK2UxKTtcblx0XHRcdFx0YnJlYWs7XG5cdFx0XHRjYXNlICdQdGdVbmlvbic6IC8qIFtNUy1YTFNdIDIuNS4xOTguOTQgKi9cblx0XHRcdFx0ZTEgPSBzdGFjay5wb3AoKTsgZTIgPSBzdGFjay5wb3AoKTtcblx0XHRcdFx0c3RhY2sucHVzaChlMitcIixcIitlMSk7XG5cdFx0XHRcdGJyZWFrO1xuXHRcdFx0Y2FzZSAnUHRnUmFuZ2UnOiAvKiBbTVMtWExTXSAyLjUuMTk4LjgzICovXG5cdFx0XHRcdGUxID0gc3RhY2sucG9wKCk7IGUyID0gc3RhY2sucG9wKCk7XG5cdFx0XHRcdHN0YWNrLnB1c2goZTIrXCI6XCIrZTEpO1xuXHRcdFx0XHRicmVhaztcblxuXHRcdFx0Y2FzZSAnUHRnQXR0ckNob29zZSc6IC8qIFtNUy1YTFNdIDIuNS4xOTguMzQgKi9cblx0XHRcdFx0YnJlYWs7XG5cdFx0XHRjYXNlICdQdGdBdHRyR290byc6IC8qIFtNUy1YTFNdIDIuNS4xOTguMzUgKi9cblx0XHRcdFx0YnJlYWs7XG5cdFx0XHRjYXNlICdQdGdBdHRySWYnOiAvKiBbTVMtWExTXSAyLjUuMTk4LjM2ICovXG5cdFx0XHRcdGJyZWFrO1xuXHRcdFx0Y2FzZSAnUHRnQXR0cklmRXJyb3InOiAvKiBbTVMtWExTQl0gMi41Ljk3LjI4ICovXG5cdFx0XHRcdGJyZWFrO1xuXG5cblx0XHRcdGNhc2UgJ1B0Z1JlZic6IC8qIFtNUy1YTFNdIDIuNS4xOTguODQgKi9cbmMgPSBzaGlmdF9jZWxsX3hscygoZlsxXVsxXSksIF9yYW5nZSwgb3B0cyk7XG5cdFx0XHRcdHN0YWNrLnB1c2goZW5jb2RlX2NlbGxfeGxzKGMsIGJpZmYpKTtcblx0XHRcdFx0YnJlYWs7XG5cdFx0XHRjYXNlICdQdGdSZWZOJzogLyogW01TLVhMU10gMi41LjE5OC44OCAqL1xuYyA9IGNlbGwgPyBzaGlmdF9jZWxsX3hscygoZlsxXVsxXSksIGNlbGwsIG9wdHMpIDogKGZbMV1bMV0pO1xuXHRcdFx0XHRzdGFjay5wdXNoKGVuY29kZV9jZWxsX3hscyhjLCBiaWZmKSk7XG5cdFx0XHRcdGJyZWFrO1xuXHRcdFx0Y2FzZSAnUHRnUmVmM2QnOiAvKiBbTVMtWExTXSAyLjUuMTk4Ljg1ICovXG5peHRpID0gZlsxXVsxXTsgYyA9IHNoaWZ0X2NlbGxfeGxzKChmWzFdWzJdKSwgX3JhbmdlLCBvcHRzKTtcblx0XHRcdFx0c25hbWUgPSBnZXRfaXh0aShzdXBib29rcywgaXh0aSwgb3B0cyk7XG5cdFx0XHRcdHZhciB3ID0gc25hbWU7IC8qIElFOSBmYWlscyBvbiBkZWZpbmVkIG5hbWVzICovIC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tdW51c2VkLXZhcnNcblx0XHRcdFx0c3RhY2sucHVzaChzbmFtZSArIFwiIVwiICsgZW5jb2RlX2NlbGxfeGxzKGMsIGJpZmYpKTtcblx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdGNhc2UgJ1B0Z0Z1bmMnOiAvKiBbTVMtWExTXSAyLjUuMTk4LjYyICovXG5cdFx0XHRjYXNlICdQdGdGdW5jVmFyJzogLyogW01TLVhMU10gMi41LjE5OC42MyAqL1xuXHRcdFx0XHQvKiBmWzFdID0gW2FyZ2MsIGZ1bmMsIHR5cGVdICovXG5cdFx0XHRcdHZhciBhcmdjID0gKGZbMV1bMF0pLCBmdW5jID0gKGZbMV1bMV0pO1xuXHRcdFx0XHRpZighYXJnYykgYXJnYyA9IDA7XG5cdFx0XHRcdGFyZ2MgJj0gMHg3Rjtcblx0XHRcdFx0dmFyIGFyZ3MgPSBhcmdjID09IDAgPyBbXSA6IHN0YWNrLnNsaWNlKC1hcmdjKTtcblx0XHRcdFx0c3RhY2subGVuZ3RoIC09IGFyZ2M7XG5cdFx0XHRcdGlmKGZ1bmMgPT09ICdVc2VyJykgZnVuYyA9IGFyZ3Muc2hpZnQoKTtcblx0XHRcdFx0c3RhY2sucHVzaChmdW5jICsgXCIoXCIgKyBhcmdzLmpvaW4oXCIsXCIpICsgXCIpXCIpO1xuXHRcdFx0XHRicmVhaztcblxuXHRcdFx0Y2FzZSAnUHRnQm9vbCc6IC8qIFtNUy1YTFNdIDIuNS4xOTguNDIgKi9cblx0XHRcdFx0c3RhY2sucHVzaChmWzFdID8gXCJUUlVFXCIgOiBcIkZBTFNFXCIpOyBicmVhaztcblx0XHRcdGNhc2UgJ1B0Z0ludCc6IC8qIFtNUy1YTFNdIDIuNS4xOTguNjYgKi9cblx0XHRcdFx0c3RhY2sucHVzaChmWzFdKTsgYnJlYWs7XG5cdFx0XHRjYXNlICdQdGdOdW0nOiAvKiBbTVMtWExTXSAyLjUuMTk4Ljc5IFRPRE86IHByZWNpc2lvbj8gKi9cblx0XHRcdFx0c3RhY2sucHVzaChTdHJpbmcoZlsxXSkpOyBicmVhaztcblx0XHRcdGNhc2UgJ1B0Z1N0cic6IC8qIFtNUy1YTFNdIDIuNS4xOTguODkgKi9cblx0XHRcdFx0Ly8gJEZsb3dJZ25vcmVcblx0XHRcdFx0c3RhY2sucHVzaCgnXCInICsgZlsxXS5yZXBsYWNlKC9cIi9nLCAnXCJcIicpICsgJ1wiJyk7IGJyZWFrO1xuXHRcdFx0Y2FzZSAnUHRnRXJyJzogLyogW01TLVhMU10gMi41LjE5OC41NyAqL1xuXHRcdFx0XHRzdGFjay5wdXNoKGZbMV0pOyBicmVhaztcblx0XHRcdGNhc2UgJ1B0Z0FyZWFOJzogLyogW01TLVhMU10gMi41LjE5OC4zMSBUT0RPICovXG5yID0gc2hpZnRfcmFuZ2VfeGxzKGZbMV1bMV0sIGNlbGwgPyB7czpjZWxsfSA6IF9yYW5nZSwgb3B0cyk7XG5cdFx0XHRcdHN0YWNrLnB1c2goZW5jb2RlX3JhbmdlX3hscygociksIG9wdHMpKTtcblx0XHRcdFx0YnJlYWs7XG5cdFx0XHRjYXNlICdQdGdBcmVhJzogLyogW01TLVhMU10gMi41LjE5OC4yNyBUT0RPOiBmaXhlZCBwb2ludHMgKi9cbnIgPSBzaGlmdF9yYW5nZV94bHMoZlsxXVsxXSwgX3JhbmdlLCBvcHRzKTtcblx0XHRcdFx0c3RhY2sucHVzaChlbmNvZGVfcmFuZ2VfeGxzKChyKSwgb3B0cykpO1xuXHRcdFx0XHRicmVhaztcblx0XHRcdGNhc2UgJ1B0Z0FyZWEzZCc6IC8qIFtNUy1YTFNdIDIuNS4xOTguMjggVE9ETyAqL1xuaXh0aSA9IGZbMV1bMV07IHIgPSBmWzFdWzJdO1xuXHRcdFx0XHRzbmFtZSA9IGdldF9peHRpKHN1cGJvb2tzLCBpeHRpLCBvcHRzKTtcblx0XHRcdFx0c3RhY2sucHVzaChzbmFtZSArIFwiIVwiICsgZW5jb2RlX3JhbmdlX3hscygociksIG9wdHMpKTtcblx0XHRcdFx0YnJlYWs7XG5cdFx0XHRjYXNlICdQdGdBdHRyU3VtJzogLyogW01TLVhMU10gMi41LjE5OC40MSAqL1xuXHRcdFx0XHRzdGFjay5wdXNoKFwiU1VNKFwiICsgc3RhY2sucG9wKCkgKyBcIilcIik7XG5cdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRjYXNlICdQdGdBdHRyQmF4Y2VsJzogLyogW01TLVhMU10gMi41LjE5OC4zMyAqL1xuXHRcdFx0Y2FzZSAnUHRnQXR0clNlbWknOiAvKiBbTVMtWExTXSAyLjUuMTk4LjM3ICovXG5cdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRjYXNlICdQdGdOYW1lJzogLyogW01TLVhMU10gMi41LjE5OC43NiA7IFtNUy1YTFNCXSAyLjUuOTcuNjAgVE9ETzogcmV2aXNpb25zICovXG5cdFx0XHRcdC8qIGZbMV0gPSB0eXBlLCAwLCBuYW1laW5kZXggKi9cblx0XHRcdFx0bmFtZWlkeCA9IChmWzFdWzJdKTtcblx0XHRcdFx0dmFyIGxibCA9IChzdXBib29rcy5uYW1lc3x8W10pW25hbWVpZHgtMV0gfHwgKHN1cGJvb2tzWzBdfHxbXSlbbmFtZWlkeF07XG5cdFx0XHRcdHZhciBuYW1lID0gbGJsID8gbGJsLk5hbWUgOiBcIlNIMzNUSlNOQU1FXCIgKyBTdHJpbmcobmFtZWlkeCk7XG5cdFx0XHRcdGlmKG5hbWUgaW4gWExTWEZ1dHVyZUZ1bmN0aW9ucykgbmFtZSA9IFhMU1hGdXR1cmVGdW5jdGlvbnNbbmFtZV07XG5cdFx0XHRcdHN0YWNrLnB1c2gobmFtZSk7XG5cdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRjYXNlICdQdGdOYW1lWCc6IC8qIFtNUy1YTFNdIDIuNS4xOTguNzcgOyBbTVMtWExTQl0gMi41Ljk3LjYxIFRPRE86IHJldmlzaW9ucyAqL1xuXHRcdFx0XHQvKiBmWzFdID0gdHlwZSwgaXh0aSwgbmFtZWluZGV4ICovXG5cdFx0XHRcdHZhciBib29raWR4ID0gKGZbMV1bMV0pOyBuYW1laWR4ID0gKGZbMV1bMl0pOyB2YXIgZXh0ZXJuYm9vaztcblx0XHRcdFx0LyogVE9ETzogUHJvcGVybHkgaGFuZGxlIG1pc3NpbmcgdmFsdWVzIC0tIHRoaXMgc2hvdWxkIGJlIHVzaW5nIGdldF9peHRpX3JhdyBwcmltYXJpbHkgKi9cblx0XHRcdFx0aWYob3B0cy5iaWZmIDw9IDUpIHtcblx0XHRcdFx0XHRpZihib29raWR4IDwgMCkgYm9va2lkeCA9IC1ib29raWR4O1xuXHRcdFx0XHRcdGlmKHN1cGJvb2tzW2Jvb2tpZHhdKSBleHRlcm5ib29rID0gc3VwYm9va3NbYm9va2lkeF1bbmFtZWlkeF07XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0dmFyIG8gPSBcIlwiO1xuXHRcdFx0XHRcdGlmKCgoc3VwYm9va3NbYm9va2lkeF18fFtdKVswXXx8W10pWzBdID09IDB4M0EwMSl7LyogZW1wdHkgKi99XG5cdFx0XHRcdFx0ZWxzZSBpZigoKHN1cGJvb2tzW2Jvb2tpZHhdfHxbXSlbMF18fFtdKVswXSA9PSAweDA0MDEpe1xuXHRcdFx0XHRcdFx0aWYoc3VwYm9va3NbYm9va2lkeF1bbmFtZWlkeF0gJiYgc3VwYm9va3NbYm9va2lkeF1bbmFtZWlkeF0uaXRhYiA+IDApIHtcblx0XHRcdFx0XHRcdFx0byA9IHN1cGJvb2tzLlNoZWV0TmFtZXNbc3VwYm9va3NbYm9va2lkeF1bbmFtZWlkeF0uaXRhYi0xXSArIFwiIVwiO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRlbHNlIG8gPSBzdXBib29rcy5TaGVldE5hbWVzW25hbWVpZHgtMV0rIFwiIVwiO1xuXHRcdFx0XHRcdGlmKHN1cGJvb2tzW2Jvb2tpZHhdICYmIHN1cGJvb2tzW2Jvb2tpZHhdW25hbWVpZHhdKSBvICs9IHN1cGJvb2tzW2Jvb2tpZHhdW25hbWVpZHhdLk5hbWU7XG5cdFx0XHRcdFx0ZWxzZSBpZihzdXBib29rc1swXSAmJiBzdXBib29rc1swXVtuYW1laWR4XSkgbyArPSBzdXBib29rc1swXVtuYW1laWR4XS5OYW1lO1xuXHRcdFx0XHRcdGVsc2Uge1xuXHRcdFx0XHRcdFx0dmFyIGl4dGlkYXRhID0gZ2V0X2l4dGlfcmF3KHN1cGJvb2tzLCBib29raWR4LCBvcHRzKS5zcGxpdChcIjs7XCIpO1xuXHRcdFx0XHRcdFx0aWYoaXh0aWRhdGFbbmFtZWlkeCAtIDFdKSBvID0gaXh0aWRhdGFbbmFtZWlkeCAtIDFdOyAvLyBUT0RPOiBjb25maXJtIHRoaXMgaXMgY29ycmVjdFxuXHRcdFx0XHRcdFx0ZWxzZSBvICs9IFwiU0gzM1RKU0VSUlhcIjtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0c3RhY2sucHVzaChvKTtcblx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0fVxuXHRcdFx0XHRpZighZXh0ZXJuYm9vaykgZXh0ZXJuYm9vayA9IHtOYW1lOiBcIlNIMzNUSlNFUlJZXCJ9O1xuXHRcdFx0XHRzdGFjay5wdXNoKGV4dGVybmJvb2suTmFtZSk7XG5cdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRjYXNlICdQdGdQYXJlbic6IC8qIFtNUy1YTFNdIDIuNS4xOTguODAgKi9cblx0XHRcdFx0dmFyIGxwID0gJygnLCBycCA9ICcpJztcblx0XHRcdFx0aWYobGFzdF9zcCA+PSAwKSB7XG5cdFx0XHRcdFx0c3AgPSBcIlwiO1xuXHRcdFx0XHRcdHN3aXRjaChmb3JtdWxhWzBdW2xhc3Rfc3BdWzFdWzBdKSB7XG5cdFx0XHRcdFx0XHQvLyAkRmxvd0lnbm9yZVxuXHRcdFx0XHRcdFx0Y2FzZSAyOiBscCA9IGZpbGwoXCIgXCIsIGZvcm11bGFbMF1bbGFzdF9zcF1bMV1bMV0pICsgbHA7IGJyZWFrO1xuXHRcdFx0XHRcdFx0Ly8gJEZsb3dJZ25vcmVcblx0XHRcdFx0XHRcdGNhc2UgMzogbHAgPSBmaWxsKFwiXFxyXCIsIGZvcm11bGFbMF1bbGFzdF9zcF1bMV1bMV0pICsgbHA7IGJyZWFrO1xuXHRcdFx0XHRcdFx0Ly8gJEZsb3dJZ25vcmVcblx0XHRcdFx0XHRcdGNhc2UgNDogcnAgPSBmaWxsKFwiIFwiLCBmb3JtdWxhWzBdW2xhc3Rfc3BdWzFdWzFdKSArIHJwOyBicmVhaztcblx0XHRcdFx0XHRcdC8vICRGbG93SWdub3JlXG5cdFx0XHRcdFx0XHRjYXNlIDU6IHJwID0gZmlsbChcIlxcclwiLCBmb3JtdWxhWzBdW2xhc3Rfc3BdWzFdWzFdKSArIHJwOyBicmVhaztcblx0XHRcdFx0XHRcdGRlZmF1bHQ6XG5cdFx0XHRcdFx0XHRcdC8vICRGbG93SWdub3JlXG5cdFx0XHRcdFx0XHRcdGlmKG9wdHMuV1RGKSB0aHJvdyBuZXcgRXJyb3IoXCJVbmV4cGVjdGVkIFB0Z0F0dHJTcGFjZVR5cGUgXCIgKyBmb3JtdWxhWzBdW2xhc3Rfc3BdWzFdWzBdKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0bGFzdF9zcCA9IC0xO1xuXHRcdFx0XHR9XG5cdFx0XHRcdHN0YWNrLnB1c2gobHAgKyBzdGFjay5wb3AoKSArIHJwKTsgYnJlYWs7XG5cblx0XHRcdGNhc2UgJ1B0Z1JlZkVycic6IC8qIFtNUy1YTFNdIDIuNS4xOTguODYgKi9cblx0XHRcdFx0c3RhY2sucHVzaCgnI1JFRiEnKTsgYnJlYWs7XG5cblx0XHRcdGNhc2UgJ1B0Z1JlZkVycjNkJzogLyogW01TLVhMU10gMi41LjE5OC44NyAqL1xuXHRcdFx0XHRzdGFjay5wdXNoKCcjUkVGIScpOyBicmVhaztcblxuXHRcdFx0Y2FzZSAnUHRnRXhwJzogLyogW01TLVhMU10gMi41LjE5OC41OCBUT0RPICovXG5cdFx0XHRcdGMgPSB7YzooZlsxXVsxXSkscjooZlsxXVswXSl9O1xuXHRcdFx0XHR2YXIgcSA9ICh7YzogY2VsbC5jLCByOmNlbGwucn0pO1xuXHRcdFx0XHRpZihzdXBib29rcy5zaGFyZWRmW2VuY29kZV9jZWxsKGMpXSkge1xuXHRcdFx0XHRcdHZhciBwYXJzZWRmID0gKHN1cGJvb2tzLnNoYXJlZGZbZW5jb2RlX2NlbGwoYyldKTtcblx0XHRcdFx0XHRzdGFjay5wdXNoKHN0cmluZ2lmeV9mb3JtdWxhKHBhcnNlZGYsIF9yYW5nZSwgcSwgc3VwYm9va3MsIG9wdHMpKTtcblx0XHRcdFx0fVxuXHRcdFx0XHRlbHNlIHtcblx0XHRcdFx0XHR2YXIgZm5kID0gZmFsc2U7XG5cdFx0XHRcdFx0Zm9yKGUxPTA7ZTEhPXN1cGJvb2tzLmFycmF5Zi5sZW5ndGg7ICsrZTEpIHtcblx0XHRcdFx0XHRcdC8qIFRPRE86IHNob3VsZCBiZSBzb21ldGhpbmcgbGlrZSByYW5nZV9oYXMgKi9cblx0XHRcdFx0XHRcdGUyID0gc3VwYm9va3MuYXJyYXlmW2UxXTtcblx0XHRcdFx0XHRcdGlmKGMuYyA8IGUyWzBdLnMuYyB8fCBjLmMgPiBlMlswXS5lLmMpIGNvbnRpbnVlO1xuXHRcdFx0XHRcdFx0aWYoYy5yIDwgZTJbMF0ucy5yIHx8IGMuciA+IGUyWzBdLmUucikgY29udGludWU7XG5cdFx0XHRcdFx0XHRzdGFjay5wdXNoKHN0cmluZ2lmeV9mb3JtdWxhKGUyWzFdLCBfcmFuZ2UsIHEsIHN1cGJvb2tzLCBvcHRzKSk7XG5cdFx0XHRcdFx0XHRmbmQgPSB0cnVlO1xuXHRcdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdGlmKCFmbmQpIHN0YWNrLnB1c2goZlsxXSk7XG5cdFx0XHRcdH1cblx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdGNhc2UgJ1B0Z0FycmF5JzogLyogW01TLVhMU10gMi41LjE5OC4zMiBUT0RPICovXG5cdFx0XHRcdHN0YWNrLnB1c2goXCJ7XCIgKyBzdHJpbmdpZnlfYXJyYXkoZlsxXSkgKyBcIn1cIik7XG5cdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRjYXNlICdQdGdNZW1BcmVhJzogLyogW01TLVhMU10gMi41LjE5OC43MCBUT0RPOiBjb25maXJtIHRoaXMgaXMgYSBub24tZGlzcGxheSAqL1xuXHRcdFx0XHQvL3N0YWNrLnB1c2goXCIoXCIgKyBmWzJdLm1hcChlbmNvZGVfcmFuZ2UpLmpvaW4oXCIsXCIpICsgXCIpXCIpO1xuXHRcdFx0XHRicmVhaztcblxuXHRcdFx0Y2FzZSAnUHRnQXR0clNwYWNlJzogLyogW01TLVhMU10gMi41LjE5OC4zOCAqL1xuXHRcdFx0Y2FzZSAnUHRnQXR0clNwYWNlU2VtaSc6IC8qIFtNUy1YTFNdIDIuNS4xOTguMzkgKi9cblx0XHRcdFx0bGFzdF9zcCA9IGZmO1xuXHRcdFx0XHRicmVhaztcblxuXHRcdFx0Y2FzZSAnUHRnVGJsJzogLyogW01TLVhMU10gMi41LjE5OC45MiBUT0RPICovXG5cdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRjYXNlICdQdGdNZW1FcnInOiAvKiBbTVMtWExTXSAyLjUuMTk4LjcxICovXG5cdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRjYXNlICdQdGdNaXNzQXJnJzogLyogW01TLVhMU10gMi41LjE5OC43NCAqL1xuXHRcdFx0XHRzdGFjay5wdXNoKFwiXCIpO1xuXHRcdFx0XHRicmVhaztcblxuXHRcdFx0Y2FzZSAnUHRnQXJlYUVycic6IC8qIFtNUy1YTFNdIDIuNS4xOTguMjkgKi9cblx0XHRcdFx0c3RhY2sucHVzaChcIiNSRUYhXCIpOyBicmVhaztcblxuXHRcdFx0Y2FzZSAnUHRnQXJlYUVycjNkJzogLyogW01TLVhMU10gMi41LjE5OC4zMCAqL1xuXHRcdFx0XHRzdGFjay5wdXNoKFwiI1JFRiFcIik7IGJyZWFrO1xuXG5cdFx0XHRjYXNlICdQdGdMaXN0JzogLyogW01TLVhMU0JdIDIuNS45Ny41MiAqL1xuXHRcdFx0XHQvLyAkRmxvd0lnbm9yZVxuXHRcdFx0XHRzdGFjay5wdXNoKFwiVGFibGVcIiArIGZbMV0uaWR4ICsgXCJbI1wiICsgZlsxXS5ydCArIFwiXVwiKTtcblx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdGNhc2UgJ1B0Z01lbUFyZWFOJzpcblx0XHRcdGNhc2UgJ1B0Z01lbU5vTWVtTic6XG5cdFx0XHRjYXNlICdQdGdBdHRyTm9vcCc6XG5cdFx0XHRjYXNlICdQdGdTaGVldCc6XG5cdFx0XHRjYXNlICdQdGdFbmRTaGVldCc6XG5cdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRjYXNlICdQdGdNZW1GdW5jJzogLyogW01TLVhMU10gMi41LjE5OC43MiBUT0RPICovXG5cdFx0XHRcdGJyZWFrO1xuXHRcdFx0Y2FzZSAnUHRnTWVtTm9NZW0nOiAvKiBbTVMtWExTXSAyLjUuMTk4LjczIFRPRE8gKi9cblx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdGNhc2UgJ1B0Z0VsZkNvbCc6IC8qIFtNUy1YTFNdIDIuNS4xOTguNDYgKi9cblx0XHRcdGNhc2UgJ1B0Z0VsZkNvbFMnOiAvKiBbTVMtWExTXSAyLjUuMTk4LjQ3ICovXG5cdFx0XHRjYXNlICdQdGdFbGZDb2xTVic6IC8qIFtNUy1YTFNdIDIuNS4xOTguNDggKi9cblx0XHRcdGNhc2UgJ1B0Z0VsZkNvbFYnOiAvKiBbTVMtWExTXSAyLjUuMTk4LjQ5ICovXG5cdFx0XHRjYXNlICdQdGdFbGZMZWwnOiAvKiBbTVMtWExTXSAyLjUuMTk4LjUwICovXG5cdFx0XHRjYXNlICdQdGdFbGZSYWRpY2FsJzogLyogW01TLVhMU10gMi41LjE5OC41MSAqL1xuXHRcdFx0Y2FzZSAnUHRnRWxmUmFkaWNhbExlbCc6IC8qIFtNUy1YTFNdIDIuNS4xOTguNTIgKi9cblx0XHRcdGNhc2UgJ1B0Z0VsZlJhZGljYWxTJzogLyogW01TLVhMU10gMi41LjE5OC41MyAqL1xuXHRcdFx0Y2FzZSAnUHRnRWxmUncnOiAvKiBbTVMtWExTXSAyLjUuMTk4LjU0ICovXG5cdFx0XHRjYXNlICdQdGdFbGZSd1YnOiAvKiBbTVMtWExTXSAyLjUuMTk4LjU1ICovXG5cdFx0XHRcdHRocm93IG5ldyBFcnJvcihcIlVuc3VwcG9ydGVkIEVMRnNcIik7XG5cblx0XHRcdGNhc2UgJ1B0Z1N4TmFtZSc6IC8qIFtNUy1YTFNdIDIuNS4xOTguOTEgVE9ETyAtLSBmaW5kIGEgdGVzdCBjYXNlICovXG5cdFx0XHRcdHRocm93IG5ldyBFcnJvcignVW5yZWNvZ25pemVkIEZvcm11bGEgVG9rZW46ICcgKyBTdHJpbmcoZikpO1xuXHRcdFx0ZGVmYXVsdDogdGhyb3cgbmV3IEVycm9yKCdVbnJlY29nbml6ZWQgRm9ybXVsYSBUb2tlbjogJyArIFN0cmluZyhmKSk7XG5cdFx0fVxuXHRcdHZhciBQdGdOb25EaXNwID0gWydQdGdBdHRyU3BhY2UnLCAnUHRnQXR0clNwYWNlU2VtaScsICdQdGdBdHRyR290byddO1xuXHRcdGlmKG9wdHMuYmlmZiAhPSAzKSBpZihsYXN0X3NwID49IDAgJiYgUHRnTm9uRGlzcC5pbmRleE9mKGZvcm11bGFbMF1bZmZdWzBdKSA9PSAtMSkge1xuXHRcdFx0ZiA9IGZvcm11bGFbMF1bbGFzdF9zcF07XG5cdFx0XHR2YXIgX2xlZnQgPSB0cnVlO1xuXHRcdFx0c3dpdGNoKGZbMV1bMF0pIHtcblx0XHRcdFx0Lyogbm90ZTogc29tZSBiYWQgWExTQiBmaWxlcyBvbWl0IHRoZSBQdGdQYXJlbiAqL1xuXHRcdFx0XHRjYXNlIDQ6IF9sZWZ0ID0gZmFsc2U7XG5cdFx0XHRcdC8qIGZhbGxzIHRocm91Z2ggKi9cblx0XHRcdFx0Y2FzZSAwOlxuXHRcdFx0XHRcdC8vICRGbG93SWdub3JlXG5cdFx0XHRcdFx0c3AgPSBmaWxsKFwiIFwiLCBmWzFdWzFdKTsgYnJlYWs7XG5cdFx0XHRcdGNhc2UgNTogX2xlZnQgPSBmYWxzZTtcblx0XHRcdFx0LyogZmFsbHMgdGhyb3VnaCAqL1xuXHRcdFx0XHRjYXNlIDE6XG5cdFx0XHRcdFx0Ly8gJEZsb3dJZ25vcmVcblx0XHRcdFx0XHRzcCA9IGZpbGwoXCJcXHJcIiwgZlsxXVsxXSk7IGJyZWFrO1xuXHRcdFx0XHRkZWZhdWx0OlxuXHRcdFx0XHRcdHNwID0gXCJcIjtcblx0XHRcdFx0XHQvLyAkRmxvd0lnbm9yZVxuXHRcdFx0XHRcdGlmKG9wdHMuV1RGKSB0aHJvdyBuZXcgRXJyb3IoXCJVbmV4cGVjdGVkIFB0Z0F0dHJTcGFjZVR5cGUgXCIgKyBmWzFdWzBdKTtcblx0XHRcdH1cblx0XHRcdHN0YWNrLnB1c2goKF9sZWZ0ID8gc3AgOiBcIlwiKSArIHN0YWNrLnBvcCgpICsgKF9sZWZ0ID8gXCJcIiA6IHNwKSk7XG5cdFx0XHRsYXN0X3NwID0gLTE7XG5cdFx0fVxuXHR9XG5cdGlmKHN0YWNrLmxlbmd0aCA+IDEgJiYgb3B0cy5XVEYpIHRocm93IG5ldyBFcnJvcihcImJhZCBmb3JtdWxhIHN0YWNrXCIpO1xuXHRyZXR1cm4gc3RhY2tbMF07XG59XG5cbi8qIFtNUy1YTFNdIDIuNS4xOTguMSBUT0RPICovXG5mdW5jdGlvbiBwYXJzZV9BcnJheVBhcnNlZEZvcm11bGEoYmxvYiwgbGVuZ3RoLCBvcHRzKSB7XG5cdHZhciB0YXJnZXQgPSBibG9iLmwgKyBsZW5ndGgsIGxlbiA9IG9wdHMuYmlmZiA9PSAyID8gMSA6IDI7XG5cdHZhciByZ2NiLCBjY2UgPSBibG9iLnJlYWRfc2hpZnQobGVuKTsgLy8gbGVuZ3RoIG9mIHJnY2Vcblx0aWYoY2NlID09IDB4RkZGRikgcmV0dXJuIFtbXSxwYXJzZW5vb3AoYmxvYiwgbGVuZ3RoLTIpXTtcblx0dmFyIHJnY2UgPSBwYXJzZV9SZ2NlKGJsb2IsIGNjZSwgb3B0cyk7XG5cdGlmKGxlbmd0aCAhPT0gY2NlICsgbGVuKSByZ2NiID0gcGFyc2VfUmdiRXh0cmEoYmxvYiwgbGVuZ3RoIC0gY2NlIC0gbGVuLCByZ2NlLCBvcHRzKTtcblx0YmxvYi5sID0gdGFyZ2V0O1xuXHRyZXR1cm4gW3JnY2UsIHJnY2JdO1xufVxuXG4vKiBbTVMtWExTXSAyLjUuMTk4LjMgVE9ETyAqL1xuZnVuY3Rpb24gcGFyc2VfWExTQ2VsbFBhcnNlZEZvcm11bGEoYmxvYiwgbGVuZ3RoLCBvcHRzKSB7XG5cdHZhciB0YXJnZXQgPSBibG9iLmwgKyBsZW5ndGgsIGxlbiA9IG9wdHMuYmlmZiA9PSAyID8gMSA6IDI7XG5cdHZhciByZ2NiLCBjY2UgPSBibG9iLnJlYWRfc2hpZnQobGVuKTsgLy8gbGVuZ3RoIG9mIHJnY2Vcblx0aWYoY2NlID09IDB4RkZGRikgcmV0dXJuIFtbXSxwYXJzZW5vb3AoYmxvYiwgbGVuZ3RoLTIpXTtcblx0dmFyIHJnY2UgPSBwYXJzZV9SZ2NlKGJsb2IsIGNjZSwgb3B0cyk7XG5cdGlmKGxlbmd0aCAhPT0gY2NlICsgbGVuKSByZ2NiID0gcGFyc2VfUmdiRXh0cmEoYmxvYiwgbGVuZ3RoIC0gY2NlIC0gbGVuLCByZ2NlLCBvcHRzKTtcblx0YmxvYi5sID0gdGFyZ2V0O1xuXHRyZXR1cm4gW3JnY2UsIHJnY2JdO1xufVxuXG4vKiBbTVMtWExTXSAyLjUuMTk4LjIxICovXG5mdW5jdGlvbiBwYXJzZV9OYW1lUGFyc2VkRm9ybXVsYShibG9iLCBsZW5ndGgsIG9wdHMsIGNjZSkge1xuXHR2YXIgdGFyZ2V0ID0gYmxvYi5sICsgbGVuZ3RoO1xuXHR2YXIgcmdjZSA9IHBhcnNlX1JnY2UoYmxvYiwgY2NlLCBvcHRzKTtcblx0dmFyIHJnY2I7XG5cdGlmKHRhcmdldCAhPT0gYmxvYi5sKSByZ2NiID0gcGFyc2VfUmdiRXh0cmEoYmxvYiwgdGFyZ2V0IC0gYmxvYi5sLCByZ2NlLCBvcHRzKTtcblx0cmV0dXJuIFtyZ2NlLCByZ2NiXTtcbn1cblxuLyogW01TLVhMU10gMi41LjE5OC4xMTggVE9ETyAqL1xuZnVuY3Rpb24gcGFyc2VfU2hhcmVkUGFyc2VkRm9ybXVsYShibG9iLCBsZW5ndGgsIG9wdHMpIHtcblx0dmFyIHRhcmdldCA9IGJsb2IubCArIGxlbmd0aDtcblx0dmFyIHJnY2IsIGNjZSA9IGJsb2IucmVhZF9zaGlmdCgyKTsgLy8gbGVuZ3RoIG9mIHJnY2Vcblx0dmFyIHJnY2UgPSBwYXJzZV9SZ2NlKGJsb2IsIGNjZSwgb3B0cyk7XG5cdGlmKGNjZSA9PSAweEZGRkYpIHJldHVybiBbW10scGFyc2Vub29wKGJsb2IsIGxlbmd0aC0yKV07XG5cdGlmKGxlbmd0aCAhPT0gY2NlICsgMikgcmdjYiA9IHBhcnNlX1JnYkV4dHJhKGJsb2IsIHRhcmdldCAtIGNjZSAtIDIsIHJnY2UsIG9wdHMpO1xuXHRyZXR1cm4gW3JnY2UsIHJnY2JdO1xufVxuXG4vKiBbTVMtWExTXSAyLjUuMTMzIFRPRE86IGhvdyB0byBlbWl0IGVtcHR5IHN0cmluZ3M/ICovXG5mdW5jdGlvbiBwYXJzZV9Gb3JtdWxhVmFsdWUoYmxvYikge1xuXHR2YXIgYjtcblx0aWYoX19yZWFkVUludDE2TEUoYmxvYixibG9iLmwgKyA2KSAhPT0gMHhGRkZGKSByZXR1cm4gW3BhcnNlX1hudW0oYmxvYiksJ24nXTtcblx0c3dpdGNoKGJsb2JbYmxvYi5sXSkge1xuXHRcdGNhc2UgMHgwMDogYmxvYi5sICs9IDg7IHJldHVybiBbXCJTdHJpbmdcIiwgJ3MnXTtcblx0XHRjYXNlIDB4MDE6IGIgPSBibG9iW2Jsb2IubCsyXSA9PT0gMHgxOyBibG9iLmwgKz0gODsgcmV0dXJuIFtiLCdiJ107XG5cdFx0Y2FzZSAweDAyOiBiID0gYmxvYltibG9iLmwrMl07IGJsb2IubCArPSA4OyByZXR1cm4gW2IsJ2UnXTtcblx0XHRjYXNlIDB4MDM6IGJsb2IubCArPSA4OyByZXR1cm4gW1wiXCIsJ3MnXTtcblx0fVxuXHRyZXR1cm4gW107XG59XG5mdW5jdGlvbiB3cml0ZV9Gb3JtdWxhVmFsdWUodmFsdWUpIHtcblx0aWYodmFsdWUgPT0gbnVsbCkge1xuXHRcdC8vIEJsYW5rIFN0cmluZyBWYWx1ZVxuXHRcdHZhciBvID0gbmV3X2J1Zig4KTtcblx0XHRvLndyaXRlX3NoaWZ0KDEsIDB4MDMpO1xuXHRcdG8ud3JpdGVfc2hpZnQoMSwgMCk7XG5cdFx0by53cml0ZV9zaGlmdCgyLCAwKTtcblx0XHRvLndyaXRlX3NoaWZ0KDIsIDApO1xuXHRcdG8ud3JpdGVfc2hpZnQoMiwgMHhGRkZGKTtcblx0XHRyZXR1cm4gbztcblx0fSBlbHNlIGlmKHR5cGVvZiB2YWx1ZSA9PSBcIm51bWJlclwiKSByZXR1cm4gd3JpdGVfWG51bSh2YWx1ZSk7XG5cdHJldHVybiB3cml0ZV9YbnVtKDApO1xufVxuXG4vKiBbTVMtWExTXSAyLjQuMTI3IFRPRE8gKi9cbmZ1bmN0aW9uIHBhcnNlX0Zvcm11bGEoYmxvYiwgbGVuZ3RoLCBvcHRzKSB7XG5cdHZhciBlbmQgPSBibG9iLmwgKyBsZW5ndGg7XG5cdHZhciBjZWxsID0gcGFyc2VfWExTQ2VsbChibG9iLCA2KTtcblx0aWYob3B0cy5iaWZmID09IDIpICsrYmxvYi5sO1xuXHR2YXIgdmFsID0gcGFyc2VfRm9ybXVsYVZhbHVlKGJsb2IsOCk7XG5cdHZhciBmbGFncyA9IGJsb2IucmVhZF9zaGlmdCgxKTtcblx0aWYob3B0cy5iaWZmICE9IDIpIHtcblx0XHRibG9iLnJlYWRfc2hpZnQoMSk7XG5cdFx0aWYob3B0cy5iaWZmID49IDUpIHtcblx0XHRcdC8qdmFyIGNobiA9ICovYmxvYi5yZWFkX3NoaWZ0KDQpO1xuXHRcdH1cblx0fVxuXHR2YXIgY2JmID0gcGFyc2VfWExTQ2VsbFBhcnNlZEZvcm11bGEoYmxvYiwgZW5kIC0gYmxvYi5sLCBvcHRzKTtcblx0cmV0dXJuIHtjZWxsOmNlbGwsIHZhbDp2YWxbMF0sIGZvcm11bGE6Y2JmLCBzaGFyZWQ6IChmbGFncyA+PiAzKSAmIDEsIHR0OnZhbFsxXX07XG59XG5mdW5jdGlvbiB3cml0ZV9Gb3JtdWxhKGNlbGwsIFIsIEMsIG9wdHMsIG9zKSB7XG5cdC8vIENlbGxcblx0dmFyIG8xID0gd3JpdGVfWExTQ2VsbChSLCBDLCBvcyk7XG5cblx0Ly8gRm9ybXVsYVZhbHVlXG5cdHZhciBvMiA9IHdyaXRlX0Zvcm11bGFWYWx1ZShjZWxsLnYpO1xuXG5cdC8vIGZsYWdzICsgY2FjaGVcblx0dmFyIG8zID0gbmV3X2J1Zig2KTtcblx0dmFyIGZsYWdzID0gMHgwMSB8IDB4MjA7XG5cdG8zLndyaXRlX3NoaWZ0KDIsIGZsYWdzKTtcblx0bzMud3JpdGVfc2hpZnQoNCwgMCk7XG5cblx0Ly8gQ2VsbFBhcnNlZEZvcm11bGFcblx0dmFyIGJmID0gbmV3X2J1ZihjZWxsLmJmLmxlbmd0aCk7XG5cdGZvcih2YXIgaSA9IDA7IGkgPCBjZWxsLmJmLmxlbmd0aDsgKytpKSBiZltpXSA9IGNlbGwuYmZbaV07XG5cblx0dmFyIG91dCA9IGJjb25jYXQoW28xLCBvMiwgbzMsIGJmXSk7XG5cdHJldHVybiBvdXQ7XG59XG5cblxuLyogWExTQiBQYXJzZWQgRm9ybXVsYSByZWNvcmRzIGhhdmUgdGhlIHNhbWUgc2hhcGUgKi9cbmZ1bmN0aW9uIHBhcnNlX1hMU0JQYXJzZWRGb3JtdWxhKGRhdGEsIGxlbmd0aCwgb3B0cykge1xuXHR2YXIgY2NlID0gZGF0YS5yZWFkX3NoaWZ0KDQpO1xuXHR2YXIgcmdjZSA9IHBhcnNlX1JnY2UoZGF0YSwgY2NlLCBvcHRzKTtcblx0dmFyIGNiID0gZGF0YS5yZWFkX3NoaWZ0KDQpO1xuXHR2YXIgcmdjYiA9IGNiID4gMCA/IHBhcnNlX1JnYkV4dHJhKGRhdGEsIGNiLCByZ2NlLCBvcHRzKSA6IG51bGw7XG5cdHJldHVybiBbcmdjZSwgcmdjYl07XG59XG5cbi8qIFtNUy1YTFNCXSAyLjUuOTcuMSBBcnJheVBhcnNlZEZvcm11bGEgKi9cbnZhciBwYXJzZV9YTFNCQXJyYXlQYXJzZWRGb3JtdWxhID0gcGFyc2VfWExTQlBhcnNlZEZvcm11bGE7XG4vKiBbTVMtWExTQl0gMi41Ljk3LjQgQ2VsbFBhcnNlZEZvcm11bGEgKi9cbnZhciBwYXJzZV9YTFNCQ2VsbFBhcnNlZEZvcm11bGEgPSBwYXJzZV9YTFNCUGFyc2VkRm9ybXVsYTtcbi8qIFtNUy1YTFNCXSAyLjUuOTcuOCBEVlBhcnNlZEZvcm11bGEgKi9cbi8vdmFyIHBhcnNlX1hMU0JEVlBhcnNlZEZvcm11bGEgPSBwYXJzZV9YTFNCUGFyc2VkRm9ybXVsYTtcbi8qIFtNUy1YTFNCXSAyLjUuOTcuOSBGUlRQYXJzZWRGb3JtdWxhICovXG4vL3ZhciBwYXJzZV9YTFNCRlJUUGFyc2VkRm9ybXVsYSA9IHBhcnNlX1hMU0JQYXJzZWRGb3JtdWxhMjtcbi8qIFtNUy1YTFNCXSAyLjUuOTcuMTIgTmFtZVBhcnNlZEZvcm11bGEgKi9cbnZhciBwYXJzZV9YTFNCTmFtZVBhcnNlZEZvcm11bGEgPSBwYXJzZV9YTFNCUGFyc2VkRm9ybXVsYTtcbi8qIFtNUy1YTFNCXSAyLjUuOTcuOTggU2hhcmVkUGFyc2VkRm9ybXVsYSAqL1xudmFyIHBhcnNlX1hMU0JTaGFyZWRQYXJzZWRGb3JtdWxhID0gcGFyc2VfWExTQlBhcnNlZEZvcm11bGE7XG4vKiBbTVMtWExTXSAyLjUuMTk4LjQgKi9cbnZhciBDZXRhYiA9IHtcbjB4MDAwMDogJ0JFRVAnLFxuMHgwMDAxOiAnT1BFTicsXG4weDAwMDI6ICdPUEVOLkxJTktTJyxcbjB4MDAwMzogJ0NMT1NFLkFMTCcsXG4weDAwMDQ6ICdTQVZFJyxcbjB4MDAwNTogJ1NBVkUuQVMnLFxuMHgwMDA2OiAnRklMRS5ERUxFVEUnLFxuMHgwMDA3OiAnUEFHRS5TRVRVUCcsXG4weDAwMDg6ICdQUklOVCcsXG4weDAwMDk6ICdQUklOVEVSLlNFVFVQJyxcbjB4MDAwQTogJ1FVSVQnLFxuMHgwMDBCOiAnTkVXLldJTkRPVycsXG4weDAwMEM6ICdBUlJBTkdFLkFMTCcsXG4weDAwMEQ6ICdXSU5ET1cuU0laRScsXG4weDAwMEU6ICdXSU5ET1cuTU9WRScsXG4weDAwMEY6ICdGVUxMJyxcbjB4MDAxMDogJ0NMT1NFJyxcbjB4MDAxMTogJ1JVTicsXG4weDAwMTY6ICdTRVQuUFJJTlQuQVJFQScsXG4weDAwMTc6ICdTRVQuUFJJTlQuVElUTEVTJyxcbjB4MDAxODogJ1NFVC5QQUdFLkJSRUFLJyxcbjB4MDAxOTogJ1JFTU9WRS5QQUdFLkJSRUFLJyxcbjB4MDAxQTogJ0ZPTlQnLFxuMHgwMDFCOiAnRElTUExBWScsXG4weDAwMUM6ICdQUk9URUNULkRPQ1VNRU5UJyxcbjB4MDAxRDogJ1BSRUNJU0lPTicsXG4weDAwMUU6ICdBMS5SMUMxJyxcbjB4MDAxRjogJ0NBTENVTEFURS5OT1cnLFxuMHgwMDIwOiAnQ0FMQ1VMQVRJT04nLFxuMHgwMDIyOiAnREFUQS5GSU5EJyxcbjB4MDAyMzogJ0VYVFJBQ1QnLFxuMHgwMDI0OiAnREFUQS5ERUxFVEUnLFxuMHgwMDI1OiAnU0VULkRBVEFCQVNFJyxcbjB4MDAyNjogJ1NFVC5DUklURVJJQScsXG4weDAwMjc6ICdTT1JUJyxcbjB4MDAyODogJ0RBVEEuU0VSSUVTJyxcbjB4MDAyOTogJ1RBQkxFJyxcbjB4MDAyQTogJ0ZPUk1BVC5OVU1CRVInLFxuMHgwMDJCOiAnQUxJR05NRU5UJyxcbjB4MDAyQzogJ1NUWUxFJyxcbjB4MDAyRDogJ0JPUkRFUicsXG4weDAwMkU6ICdDRUxMLlBST1RFQ1RJT04nLFxuMHgwMDJGOiAnQ09MVU1OLldJRFRIJyxcbjB4MDAzMDogJ1VORE8nLFxuMHgwMDMxOiAnQ1VUJyxcbjB4MDAzMjogJ0NPUFknLFxuMHgwMDMzOiAnUEFTVEUnLFxuMHgwMDM0OiAnQ0xFQVInLFxuMHgwMDM1OiAnUEFTVEUuU1BFQ0lBTCcsXG4weDAwMzY6ICdFRElULkRFTEVURScsXG4weDAwMzc6ICdJTlNFUlQnLFxuMHgwMDM4OiAnRklMTC5SSUdIVCcsXG4weDAwMzk6ICdGSUxMLkRPV04nLFxuMHgwMDNEOiAnREVGSU5FLk5BTUUnLFxuMHgwMDNFOiAnQ1JFQVRFLk5BTUVTJyxcbjB4MDAzRjogJ0ZPUk1VTEEuR09UTycsXG4weDAwNDA6ICdGT1JNVUxBLkZJTkQnLFxuMHgwMDQxOiAnU0VMRUNULkxBU1QuQ0VMTCcsXG4weDAwNDI6ICdTSE9XLkFDVElWRS5DRUxMJyxcbjB4MDA0MzogJ0dBTExFUlkuQVJFQScsXG4weDAwNDQ6ICdHQUxMRVJZLkJBUicsXG4weDAwNDU6ICdHQUxMRVJZLkNPTFVNTicsXG4weDAwNDY6ICdHQUxMRVJZLkxJTkUnLFxuMHgwMDQ3OiAnR0FMTEVSWS5QSUUnLFxuMHgwMDQ4OiAnR0FMTEVSWS5TQ0FUVEVSJyxcbjB4MDA0OTogJ0NPTUJJTkFUSU9OJyxcbjB4MDA0QTogJ1BSRUZFUlJFRCcsXG4weDAwNEI6ICdBREQuT1ZFUkxBWScsXG4weDAwNEM6ICdHUklETElORVMnLFxuMHgwMDREOiAnU0VULlBSRUZFUlJFRCcsXG4weDAwNEU6ICdBWEVTJyxcbjB4MDA0RjogJ0xFR0VORCcsXG4weDAwNTA6ICdBVFRBQ0guVEVYVCcsXG4weDAwNTE6ICdBREQuQVJST1cnLFxuMHgwMDUyOiAnU0VMRUNULkNIQVJUJyxcbjB4MDA1MzogJ1NFTEVDVC5QTE9ULkFSRUEnLFxuMHgwMDU0OiAnUEFUVEVSTlMnLFxuMHgwMDU1OiAnTUFJTi5DSEFSVCcsXG4weDAwNTY6ICdPVkVSTEFZJyxcbjB4MDA1NzogJ1NDQUxFJyxcbjB4MDA1ODogJ0ZPUk1BVC5MRUdFTkQnLFxuMHgwMDU5OiAnRk9STUFULlRFWFQnLFxuMHgwMDVBOiAnRURJVC5SRVBFQVQnLFxuMHgwMDVCOiAnUEFSU0UnLFxuMHgwMDVDOiAnSlVTVElGWScsXG4weDAwNUQ6ICdISURFJyxcbjB4MDA1RTogJ1VOSElERScsXG4weDAwNUY6ICdXT1JLU1BBQ0UnLFxuMHgwMDYwOiAnRk9STVVMQScsXG4weDAwNjE6ICdGT1JNVUxBLkZJTEwnLFxuMHgwMDYyOiAnRk9STVVMQS5BUlJBWScsXG4weDAwNjM6ICdEQVRBLkZJTkQuTkVYVCcsXG4weDAwNjQ6ICdEQVRBLkZJTkQuUFJFVicsXG4weDAwNjU6ICdGT1JNVUxBLkZJTkQuTkVYVCcsXG4weDAwNjY6ICdGT1JNVUxBLkZJTkQuUFJFVicsXG4weDAwNjc6ICdBQ1RJVkFURScsXG4weDAwNjg6ICdBQ1RJVkFURS5ORVhUJyxcbjB4MDA2OTogJ0FDVElWQVRFLlBSRVYnLFxuMHgwMDZBOiAnVU5MT0NLRUQuTkVYVCcsXG4weDAwNkI6ICdVTkxPQ0tFRC5QUkVWJyxcbjB4MDA2QzogJ0NPUFkuUElDVFVSRScsXG4weDAwNkQ6ICdTRUxFQ1QnLFxuMHgwMDZFOiAnREVMRVRFLk5BTUUnLFxuMHgwMDZGOiAnREVMRVRFLkZPUk1BVCcsXG4weDAwNzA6ICdWTElORScsXG4weDAwNzE6ICdITElORScsXG4weDAwNzI6ICdWUEFHRScsXG4weDAwNzM6ICdIUEFHRScsXG4weDAwNzQ6ICdWU0NST0xMJyxcbjB4MDA3NTogJ0hTQ1JPTEwnLFxuMHgwMDc2OiAnQUxFUlQnLFxuMHgwMDc3OiAnTkVXJyxcbjB4MDA3ODogJ0NBTkNFTC5DT1BZJyxcbjB4MDA3OTogJ1NIT1cuQ0xJUEJPQVJEJyxcbjB4MDA3QTogJ01FU1NBR0UnLFxuMHgwMDdDOiAnUEFTVEUuTElOSycsXG4weDAwN0Q6ICdBUFAuQUNUSVZBVEUnLFxuMHgwMDdFOiAnREVMRVRFLkFSUk9XJyxcbjB4MDA3RjogJ1JPVy5IRUlHSFQnLFxuMHgwMDgwOiAnRk9STUFULk1PVkUnLFxuMHgwMDgxOiAnRk9STUFULlNJWkUnLFxuMHgwMDgyOiAnRk9STVVMQS5SRVBMQUNFJyxcbjB4MDA4MzogJ1NFTkQuS0VZUycsXG4weDAwODQ6ICdTRUxFQ1QuU1BFQ0lBTCcsXG4weDAwODU6ICdBUFBMWS5OQU1FUycsXG4weDAwODY6ICdSRVBMQUNFLkZPTlQnLFxuMHgwMDg3OiAnRlJFRVpFLlBBTkVTJyxcbjB4MDA4ODogJ1NIT1cuSU5GTycsXG4weDAwODk6ICdTUExJVCcsXG4weDAwOEE6ICdPTi5XSU5ET1cnLFxuMHgwMDhCOiAnT04uREFUQScsXG4weDAwOEM6ICdESVNBQkxFLklOUFVUJyxcbjB4MDA4RTogJ09VVExJTkUnLFxuMHgwMDhGOiAnTElTVC5OQU1FUycsXG4weDAwOTA6ICdGSUxFLkNMT1NFJyxcbjB4MDA5MTogJ1NBVkUuV09SS0JPT0snLFxuMHgwMDkyOiAnREFUQS5GT1JNJyxcbjB4MDA5MzogJ0NPUFkuQ0hBUlQnLFxuMHgwMDk0OiAnT04uVElNRScsXG4weDAwOTU6ICdXQUlUJyxcbjB4MDA5NjogJ0ZPUk1BVC5GT05UJyxcbjB4MDA5NzogJ0ZJTEwuVVAnLFxuMHgwMDk4OiAnRklMTC5MRUZUJyxcbjB4MDA5OTogJ0RFTEVURS5PVkVSTEFZJyxcbjB4MDA5QjogJ1NIT1JULk1FTlVTJyxcbjB4MDA5RjogJ1NFVC5VUERBVEUuU1RBVFVTJyxcbjB4MDBBMTogJ0NPTE9SLlBBTEVUVEUnLFxuMHgwMEEyOiAnREVMRVRFLlNUWUxFJyxcbjB4MDBBMzogJ1dJTkRPVy5SRVNUT1JFJyxcbjB4MDBBNDogJ1dJTkRPVy5NQVhJTUlaRScsXG4weDAwQTY6ICdDSEFOR0UuTElOSycsXG4weDAwQTc6ICdDQUxDVUxBVEUuRE9DVU1FTlQnLFxuMHgwMEE4OiAnT04uS0VZJyxcbjB4MDBBOTogJ0FQUC5SRVNUT1JFJyxcbjB4MDBBQTogJ0FQUC5NT1ZFJyxcbjB4MDBBQjogJ0FQUC5TSVpFJyxcbjB4MDBBQzogJ0FQUC5NSU5JTUlaRScsXG4weDAwQUQ6ICdBUFAuTUFYSU1JWkUnLFxuMHgwMEFFOiAnQlJJTkcuVE8uRlJPTlQnLFxuMHgwMEFGOiAnU0VORC5UTy5CQUNLJyxcbjB4MDBCOTogJ01BSU4uQ0hBUlQuVFlQRScsXG4weDAwQkE6ICdPVkVSTEFZLkNIQVJULlRZUEUnLFxuMHgwMEJCOiAnU0VMRUNULkVORCcsXG4weDAwQkM6ICdPUEVOLk1BSUwnLFxuMHgwMEJEOiAnU0VORC5NQUlMJyxcbjB4MDBCRTogJ1NUQU5EQVJELkZPTlQnLFxuMHgwMEJGOiAnQ09OU09MSURBVEUnLFxuMHgwMEMwOiAnU09SVC5TUEVDSUFMJyxcbjB4MDBDMTogJ0dBTExFUlkuM0QuQVJFQScsXG4weDAwQzI6ICdHQUxMRVJZLjNELkNPTFVNTicsXG4weDAwQzM6ICdHQUxMRVJZLjNELkxJTkUnLFxuMHgwMEM0OiAnR0FMTEVSWS4zRC5QSUUnLFxuMHgwMEM1OiAnVklFVy4zRCcsXG4weDAwQzY6ICdHT0FMLlNFRUsnLFxuMHgwMEM3OiAnV09SS0dST1VQJyxcbjB4MDBDODogJ0ZJTEwuR1JPVVAnLFxuMHgwMEM5OiAnVVBEQVRFLkxJTksnLFxuMHgwMENBOiAnUFJPTU9URScsXG4weDAwQ0I6ICdERU1PVEUnLFxuMHgwMENDOiAnU0hPVy5ERVRBSUwnLFxuMHgwMENFOiAnVU5HUk9VUCcsXG4weDAwQ0Y6ICdPQkpFQ1QuUFJPUEVSVElFUycsXG4weDAwRDA6ICdTQVZFLk5FVy5PQkpFQ1QnLFxuMHgwMEQxOiAnU0hBUkUnLFxuMHgwMEQyOiAnU0hBUkUuTkFNRScsXG4weDAwRDM6ICdEVVBMSUNBVEUnLFxuMHgwMEQ0OiAnQVBQTFkuU1RZTEUnLFxuMHgwMEQ1OiAnQVNTSUdOLlRPLk9CSkVDVCcsXG4weDAwRDY6ICdPQkpFQ1QuUFJPVEVDVElPTicsXG4weDAwRDc6ICdISURFLk9CSkVDVCcsXG4weDAwRDg6ICdTRVQuRVhUUkFDVCcsXG4weDAwRDk6ICdDUkVBVEUuUFVCTElTSEVSJyxcbjB4MDBEQTogJ1NVQlNDUklCRS5UTycsXG4weDAwREI6ICdBVFRSSUJVVEVTJyxcbjB4MDBEQzogJ1NIT1cuVE9PTEJBUicsXG4weDAwREU6ICdQUklOVC5QUkVWSUVXJyxcbjB4MDBERjogJ0VESVQuQ09MT1InLFxuMHgwMEUwOiAnU0hPVy5MRVZFTFMnLFxuMHgwMEUxOiAnRk9STUFULk1BSU4nLFxuMHgwMEUyOiAnRk9STUFULk9WRVJMQVknLFxuMHgwMEUzOiAnT04uUkVDQUxDJyxcbjB4MDBFNDogJ0VESVQuU0VSSUVTJyxcbjB4MDBFNTogJ0RFRklORS5TVFlMRScsXG4weDAwRjA6ICdMSU5FLlBSSU5UJyxcbjB4MDBGMzogJ0VOVEVSLkRBVEEnLFxuMHgwMEY5OiAnR0FMTEVSWS5SQURBUicsXG4weDAwRkE6ICdNRVJHRS5TVFlMRVMnLFxuMHgwMEZCOiAnRURJVElPTi5PUFRJT05TJyxcbjB4MDBGQzogJ1BBU1RFLlBJQ1RVUkUnLFxuMHgwMEZEOiAnUEFTVEUuUElDVFVSRS5MSU5LJyxcbjB4MDBGRTogJ1NQRUxMSU5HJyxcbjB4MDEwMDogJ1pPT00nLFxuMHgwMTAzOiAnSU5TRVJULk9CSkVDVCcsXG4weDAxMDQ6ICdXSU5ET1cuTUlOSU1JWkUnLFxuMHgwMTA5OiAnU09VTkQuTk9URScsXG4weDAxMEE6ICdTT1VORC5QTEFZJyxcbjB4MDEwQjogJ0ZPUk1BVC5TSEFQRScsXG4weDAxMEM6ICdFWFRFTkQuUE9MWUdPTicsXG4weDAxMEQ6ICdGT1JNQVQuQVVUTycsXG4weDAxMTA6ICdHQUxMRVJZLjNELkJBUicsXG4weDAxMTE6ICdHQUxMRVJZLjNELlNVUkZBQ0UnLFxuMHgwMTEyOiAnRklMTC5BVVRPJyxcbjB4MDExNDogJ0NVU1RPTUlaRS5UT09MQkFSJyxcbjB4MDExNTogJ0FERC5UT09MJyxcbjB4MDExNjogJ0VESVQuT0JKRUNUJyxcbjB4MDExNzogJ09OLkRPVUJMRUNMSUNLJyxcbjB4MDExODogJ09OLkVOVFJZJyxcbjB4MDExOTogJ1dPUktCT09LLkFERCcsXG4weDAxMUE6ICdXT1JLQk9PSy5NT1ZFJyxcbjB4MDExQjogJ1dPUktCT09LLkNPUFknLFxuMHgwMTFDOiAnV09SS0JPT0suT1BUSU9OUycsXG4weDAxMUQ6ICdTQVZFLldPUktTUEFDRScsXG4weDAxMjA6ICdDSEFSVC5XSVpBUkQnLFxuMHgwMTIxOiAnREVMRVRFLlRPT0wnLFxuMHgwMTIyOiAnTU9WRS5UT09MJyxcbjB4MDEyMzogJ1dPUktCT09LLlNFTEVDVCcsXG4weDAxMjQ6ICdXT1JLQk9PSy5BQ1RJVkFURScsXG4weDAxMjU6ICdBU1NJR04uVE8uVE9PTCcsXG4weDAxMjc6ICdDT1BZLlRPT0wnLFxuMHgwMTI4OiAnUkVTRVQuVE9PTCcsXG4weDAxMjk6ICdDT05TVFJBSU4uTlVNRVJJQycsXG4weDAxMkE6ICdQQVNURS5UT09MJyxcbjB4MDEyRTogJ1dPUktCT09LLk5FVycsXG4weDAxMzE6ICdTQ0VOQVJJTy5DRUxMUycsXG4weDAxMzI6ICdTQ0VOQVJJTy5ERUxFVEUnLFxuMHgwMTMzOiAnU0NFTkFSSU8uQUREJyxcbjB4MDEzNDogJ1NDRU5BUklPLkVESVQnLFxuMHgwMTM1OiAnU0NFTkFSSU8uU0hPVycsXG4weDAxMzY6ICdTQ0VOQVJJTy5TSE9XLk5FWFQnLFxuMHgwMTM3OiAnU0NFTkFSSU8uU1VNTUFSWScsXG4weDAxMzg6ICdQSVZPVC5UQUJMRS5XSVpBUkQnLFxuMHgwMTM5OiAnUElWT1QuRklFTEQuUFJPUEVSVElFUycsXG4weDAxM0E6ICdQSVZPVC5GSUVMRCcsXG4weDAxM0I6ICdQSVZPVC5JVEVNJyxcbjB4MDEzQzogJ1BJVk9ULkFERC5GSUVMRFMnLFxuMHgwMTNFOiAnT1BUSU9OUy5DQUxDVUxBVElPTicsXG4weDAxM0Y6ICdPUFRJT05TLkVESVQnLFxuMHgwMTQwOiAnT1BUSU9OUy5WSUVXJyxcbjB4MDE0MTogJ0FERElOLk1BTkFHRVInLFxuMHgwMTQyOiAnTUVOVS5FRElUT1InLFxuMHgwMTQzOiAnQVRUQUNILlRPT0xCQVJTJyxcbjB4MDE0NDogJ1ZCQUFjdGl2YXRlJyxcbjB4MDE0NTogJ09QVElPTlMuQ0hBUlQnLFxuMHgwMTQ4OiAnVkJBLklOU0VSVC5GSUxFJyxcbjB4MDE0QTogJ1ZCQS5QUk9DRURVUkUuREVGSU5JVElPTicsXG4weDAxNTA6ICdST1VUSU5HLlNMSVAnLFxuMHgwMTUyOiAnUk9VVEUuRE9DVU1FTlQnLFxuMHgwMTUzOiAnTUFJTC5MT0dPTicsXG4weDAxNTY6ICdJTlNFUlQuUElDVFVSRScsXG4weDAxNTc6ICdFRElULlRPT0wnLFxuMHgwMTU4OiAnR0FMTEVSWS5ET1VHSE5VVCcsXG4weDAxNUU6ICdDSEFSVC5UUkVORCcsXG4weDAxNjA6ICdQSVZPVC5JVEVNLlBST1BFUlRJRVMnLFxuMHgwMTYyOiAnV09SS0JPT0suSU5TRVJUJyxcbjB4MDE2MzogJ09QVElPTlMuVFJBTlNJVElPTicsXG4weDAxNjQ6ICdPUFRJT05TLkdFTkVSQUwnLFxuMHgwMTcyOiAnRklMVEVSLkFEVkFOQ0VEJyxcbjB4MDE3NTogJ01BSUwuQURELk1BSUxFUicsXG4weDAxNzY6ICdNQUlMLkRFTEVURS5NQUlMRVInLFxuMHgwMTc3OiAnTUFJTC5SRVBMWScsXG4weDAxNzg6ICdNQUlMLlJFUExZLkFMTCcsXG4weDAxNzk6ICdNQUlMLkZPUldBUkQnLFxuMHgwMTdBOiAnTUFJTC5ORVhULkxFVFRFUicsXG4weDAxN0I6ICdEQVRBLkxBQkVMJyxcbjB4MDE3QzogJ0lOU0VSVC5USVRMRScsXG4weDAxN0Q6ICdGT05ULlBST1BFUlRJRVMnLFxuMHgwMTdFOiAnTUFDUk8uT1BUSU9OUycsXG4weDAxN0Y6ICdXT1JLQk9PSy5ISURFJyxcbjB4MDE4MDogJ1dPUktCT09LLlVOSElERScsXG4weDAxODE6ICdXT1JLQk9PSy5ERUxFVEUnLFxuMHgwMTgyOiAnV09SS0JPT0suTkFNRScsXG4weDAxODQ6ICdHQUxMRVJZLkNVU1RPTScsXG4weDAxODY6ICdBREQuQ0hBUlQuQVVUT0ZPUk1BVCcsXG4weDAxODc6ICdERUxFVEUuQ0hBUlQuQVVUT0ZPUk1BVCcsXG4weDAxODg6ICdDSEFSVC5BREQuREFUQScsXG4weDAxODk6ICdBVVRPLk9VVExJTkUnLFxuMHgwMThBOiAnVEFCLk9SREVSJyxcbjB4MDE4QjogJ1NIT1cuRElBTE9HJyxcbjB4MDE4QzogJ1NFTEVDVC5BTEwnLFxuMHgwMThEOiAnVU5HUk9VUC5TSEVFVFMnLFxuMHgwMThFOiAnU1VCVE9UQUwuQ1JFQVRFJyxcbjB4MDE4RjogJ1NVQlRPVEFMLlJFTU9WRScsXG4weDAxOTA6ICdSRU5BTUUuT0JKRUNUJyxcbjB4MDE5QzogJ1dPUktCT09LLlNDUk9MTCcsXG4weDAxOUQ6ICdXT1JLQk9PSy5ORVhUJyxcbjB4MDE5RTogJ1dPUktCT09LLlBSRVYnLFxuMHgwMTlGOiAnV09SS0JPT0suVEFCLlNQTElUJyxcbjB4MDFBMDogJ0ZVTEwuU0NSRUVOJyxcbjB4MDFBMTogJ1dPUktCT09LLlBST1RFQ1QnLFxuMHgwMUE0OiAnU0NST0xMQkFSLlBST1BFUlRJRVMnLFxuMHgwMUE1OiAnUElWT1QuU0hPVy5QQUdFUycsXG4weDAxQTY6ICdURVhULlRPLkNPTFVNTlMnLFxuMHgwMUE3OiAnRk9STUFULkNIQVJUVFlQRScsXG4weDAxQTg6ICdMSU5LLkZPUk1BVCcsXG4weDAxQTk6ICdUUkFDRVIuRElTUExBWScsXG4weDAxQUU6ICdUUkFDRVIuTkFWSUdBVEUnLFxuMHgwMUFGOiAnVFJBQ0VSLkNMRUFSJyxcbjB4MDFCMDogJ1RSQUNFUi5FUlJPUicsXG4weDAxQjE6ICdQSVZPVC5GSUVMRC5HUk9VUCcsXG4weDAxQjI6ICdQSVZPVC5GSUVMRC5VTkdST1VQJyxcbjB4MDFCMzogJ0NIRUNLQk9YLlBST1BFUlRJRVMnLFxuMHgwMUI0OiAnTEFCRUwuUFJPUEVSVElFUycsXG4weDAxQjU6ICdMSVNUQk9YLlBST1BFUlRJRVMnLFxuMHgwMUI2OiAnRURJVEJPWC5QUk9QRVJUSUVTJyxcbjB4MDFCNzogJ1BJVk9ULlJFRlJFU0gnLFxuMHgwMUI4OiAnTElOSy5DT01CTycsXG4weDAxQjk6ICdPUEVOLlRFWFQnLFxuMHgwMUJBOiAnSElERS5ESUFMT0cnLFxuMHgwMUJCOiAnU0VULkRJQUxPRy5GT0NVUycsXG4weDAxQkM6ICdFTkFCTEUuT0JKRUNUJyxcbjB4MDFCRDogJ1BVU0hCVVRUT04uUFJPUEVSVElFUycsXG4weDAxQkU6ICdTRVQuRElBTE9HLkRFRkFVTFQnLFxuMHgwMUJGOiAnRklMVEVSJyxcbjB4MDFDMDogJ0ZJTFRFUi5TSE9XLkFMTCcsXG4weDAxQzE6ICdDTEVBUi5PVVRMSU5FJyxcbjB4MDFDMjogJ0ZVTkNUSU9OLldJWkFSRCcsXG4weDAxQzM6ICdBREQuTElTVC5JVEVNJyxcbjB4MDFDNDogJ1NFVC5MSVNULklURU0nLFxuMHgwMUM1OiAnUkVNT1ZFLkxJU1QuSVRFTScsXG4weDAxQzY6ICdTRUxFQ1QuTElTVC5JVEVNJyxcbjB4MDFDNzogJ1NFVC5DT05UUk9MLlZBTFVFJyxcbjB4MDFDODogJ1NBVkUuQ09QWS5BUycsXG4weDAxQ0E6ICdPUFRJT05TLkxJU1RTLkFERCcsXG4weDAxQ0I6ICdPUFRJT05TLkxJU1RTLkRFTEVURScsXG4weDAxQ0M6ICdTRVJJRVMuQVhFUycsXG4weDAxQ0Q6ICdTRVJJRVMuWCcsXG4weDAxQ0U6ICdTRVJJRVMuWScsXG4weDAxQ0Y6ICdFUlJPUkJBUi5YJyxcbjB4MDFEMDogJ0VSUk9SQkFSLlknLFxuMHgwMUQxOiAnRk9STUFULkNIQVJUJyxcbjB4MDFEMjogJ1NFUklFUy5PUkRFUicsXG4weDAxRDM6ICdNQUlMLkxPR09GRicsXG4weDAxRDQ6ICdDTEVBUi5ST1VUSU5HLlNMSVAnLFxuMHgwMUQ1OiAnQVBQLkFDVElWQVRFLk1JQ1JPU09GVCcsXG4weDAxRDY6ICdNQUlMLkVESVQuTUFJTEVSJyxcbjB4MDFENzogJ09OLlNIRUVUJyxcbjB4MDFEODogJ1NUQU5EQVJELldJRFRIJyxcbjB4MDFEOTogJ1NDRU5BUklPLk1FUkdFJyxcbjB4MDFEQTogJ1NVTU1BUlkuSU5GTycsXG4weDAxREI6ICdGSU5ELkZJTEUnLFxuMHgwMURDOiAnQUNUSVZFLkNFTEwuRk9OVCcsXG4weDAxREQ6ICdFTkFCTEUuVElQV0laQVJEJyxcbjB4MDFERTogJ1ZCQS5NQUtFLkFERElOJyxcbjB4MDFFMDogJ0lOU0VSVERBVEFUQUJMRScsXG4weDAxRTE6ICdXT1JLR1JPVVAuT1BUSU9OUycsXG4weDAxRTI6ICdNQUlMLlNFTkQuTUFJTEVSJyxcbjB4MDFFNTogJ0FVVE9DT1JSRUNUJyxcbjB4MDFFOTogJ1BPU1QuRE9DVU1FTlQnLFxuMHgwMUVCOiAnUElDS0xJU1QnLFxuMHgwMUVEOiAnVklFVy5TSE9XJyxcbjB4MDFFRTogJ1ZJRVcuREVGSU5FJyxcbjB4MDFFRjogJ1ZJRVcuREVMRVRFJyxcbjB4MDFGRDogJ1NIRUVULkJBQ0tHUk9VTkQnLFxuMHgwMUZFOiAnSU5TRVJULk1BUC5PQkpFQ1QnLFxuMHgwMUZGOiAnT1BUSU9OUy5NRU5PTk8nLFxuMHgwMjA1OiAnTVNPQ0hFQ0tTJyxcbjB4MDIwNjogJ05PUk1BTCcsXG4weDAyMDc6ICdMQVlPVVQnLFxuMHgwMjA4OiAnUk0uUFJJTlQuQVJFQScsXG4weDAyMDk6ICdDTEVBUi5QUklOVC5BUkVBJyxcbjB4MDIwQTogJ0FERC5QUklOVC5BUkVBJyxcbjB4MDIwQjogJ01PVkUuQlJLJyxcbjB4MDIyMTogJ0hJREVDVVJSLk5PVEUnLFxuMHgwMjIyOiAnSElERUFMTC5OT1RFUycsXG4weDAyMjM6ICdERUxFVEUuTk9URScsXG4weDAyMjQ6ICdUUkFWRVJTRS5OT1RFUycsXG4weDAyMjU6ICdBQ1RJVkFURS5OT1RFUycsXG4weDAyNkM6ICdQUk9URUNULlJFVklTSU9OUycsXG4weDAyNkQ6ICdVTlBST1RFQ1QuUkVWSVNJT05TJyxcbjB4MDI4NzogJ09QVElPTlMuTUUnLFxuMHgwMjhEOiAnV0VCLlBVQkxJU0gnLFxuMHgwMjlCOiAnTkVXV0VCUVVFUlknLFxuMHgwMkExOiAnUElWT1QuVEFCTEUuQ0hBUlQnLFxuMHgwMkYxOiAnT1BUSU9OUy5TQVZFJyxcbjB4MDJGMzogJ09QVElPTlMuU1BFTEwnLFxuMHgwMzI4OiAnSElERUFMTC5JTktBTk5PVFMnXG59O1xuXG4vKiBbTVMtWExTXSAyLjUuMTk4LjE3ICovXG4vKiBbTVMtWExTQl0gMi41Ljk3LjEwICovXG52YXIgRnRhYiA9IHtcbjB4MDAwMDogJ0NPVU5UJyxcbjB4MDAwMTogJ0lGJyxcbjB4MDAwMjogJ0lTTkEnLFxuMHgwMDAzOiAnSVNFUlJPUicsXG4weDAwMDQ6ICdTVU0nLFxuMHgwMDA1OiAnQVZFUkFHRScsXG4weDAwMDY6ICdNSU4nLFxuMHgwMDA3OiAnTUFYJyxcbjB4MDAwODogJ1JPVycsXG4weDAwMDk6ICdDT0xVTU4nLFxuMHgwMDBBOiAnTkEnLFxuMHgwMDBCOiAnTlBWJyxcbjB4MDAwQzogJ1NUREVWJyxcbjB4MDAwRDogJ0RPTExBUicsXG4weDAwMEU6ICdGSVhFRCcsXG4weDAwMEY6ICdTSU4nLFxuMHgwMDEwOiAnQ09TJyxcbjB4MDAxMTogJ1RBTicsXG4weDAwMTI6ICdBVEFOJyxcbjB4MDAxMzogJ1BJJyxcbjB4MDAxNDogJ1NRUlQnLFxuMHgwMDE1OiAnRVhQJyxcbjB4MDAxNjogJ0xOJyxcbjB4MDAxNzogJ0xPRzEwJyxcbjB4MDAxODogJ0FCUycsXG4weDAwMTk6ICdJTlQnLFxuMHgwMDFBOiAnU0lHTicsXG4weDAwMUI6ICdST1VORCcsXG4weDAwMUM6ICdMT09LVVAnLFxuMHgwMDFEOiAnSU5ERVgnLFxuMHgwMDFFOiAnUkVQVCcsXG4weDAwMUY6ICdNSUQnLFxuMHgwMDIwOiAnTEVOJyxcbjB4MDAyMTogJ1ZBTFVFJyxcbjB4MDAyMjogJ1RSVUUnLFxuMHgwMDIzOiAnRkFMU0UnLFxuMHgwMDI0OiAnQU5EJyxcbjB4MDAyNTogJ09SJyxcbjB4MDAyNjogJ05PVCcsXG4weDAwMjc6ICdNT0QnLFxuMHgwMDI4OiAnRENPVU5UJyxcbjB4MDAyOTogJ0RTVU0nLFxuMHgwMDJBOiAnREFWRVJBR0UnLFxuMHgwMDJCOiAnRE1JTicsXG4weDAwMkM6ICdETUFYJyxcbjB4MDAyRDogJ0RTVERFVicsXG4weDAwMkU6ICdWQVInLFxuMHgwMDJGOiAnRFZBUicsXG4weDAwMzA6ICdURVhUJyxcbjB4MDAzMTogJ0xJTkVTVCcsXG4weDAwMzI6ICdUUkVORCcsXG4weDAwMzM6ICdMT0dFU1QnLFxuMHgwMDM0OiAnR1JPV1RIJyxcbjB4MDAzNTogJ0dPVE8nLFxuMHgwMDM2OiAnSEFMVCcsXG4weDAwMzc6ICdSRVRVUk4nLFxuMHgwMDM4OiAnUFYnLFxuMHgwMDM5OiAnRlYnLFxuMHgwMDNBOiAnTlBFUicsXG4weDAwM0I6ICdQTVQnLFxuMHgwMDNDOiAnUkFURScsXG4weDAwM0Q6ICdNSVJSJyxcbjB4MDAzRTogJ0lSUicsXG4weDAwM0Y6ICdSQU5EJyxcbjB4MDA0MDogJ01BVENIJyxcbjB4MDA0MTogJ0RBVEUnLFxuMHgwMDQyOiAnVElNRScsXG4weDAwNDM6ICdEQVknLFxuMHgwMDQ0OiAnTU9OVEgnLFxuMHgwMDQ1OiAnWUVBUicsXG4weDAwNDY6ICdXRUVLREFZJyxcbjB4MDA0NzogJ0hPVVInLFxuMHgwMDQ4OiAnTUlOVVRFJyxcbjB4MDA0OTogJ1NFQ09ORCcsXG4weDAwNEE6ICdOT1cnLFxuMHgwMDRCOiAnQVJFQVMnLFxuMHgwMDRDOiAnUk9XUycsXG4weDAwNEQ6ICdDT0xVTU5TJyxcbjB4MDA0RTogJ09GRlNFVCcsXG4weDAwNEY6ICdBQlNSRUYnLFxuMHgwMDUwOiAnUkVMUkVGJyxcbjB4MDA1MTogJ0FSR1VNRU5UJyxcbjB4MDA1MjogJ1NFQVJDSCcsXG4weDAwNTM6ICdUUkFOU1BPU0UnLFxuMHgwMDU0OiAnRVJST1InLFxuMHgwMDU1OiAnU1RFUCcsXG4weDAwNTY6ICdUWVBFJyxcbjB4MDA1NzogJ0VDSE8nLFxuMHgwMDU4OiAnU0VULk5BTUUnLFxuMHgwMDU5OiAnQ0FMTEVSJyxcbjB4MDA1QTogJ0RFUkVGJyxcbjB4MDA1QjogJ1dJTkRPV1MnLFxuMHgwMDVDOiAnU0VSSUVTJyxcbjB4MDA1RDogJ0RPQ1VNRU5UUycsXG4weDAwNUU6ICdBQ1RJVkUuQ0VMTCcsXG4weDAwNUY6ICdTRUxFQ1RJT04nLFxuMHgwMDYwOiAnUkVTVUxUJyxcbjB4MDA2MTogJ0FUQU4yJyxcbjB4MDA2MjogJ0FTSU4nLFxuMHgwMDYzOiAnQUNPUycsXG4weDAwNjQ6ICdDSE9PU0UnLFxuMHgwMDY1OiAnSExPT0tVUCcsXG4weDAwNjY6ICdWTE9PS1VQJyxcbjB4MDA2NzogJ0xJTktTJyxcbjB4MDA2ODogJ0lOUFVUJyxcbjB4MDA2OTogJ0lTUkVGJyxcbjB4MDA2QTogJ0dFVC5GT1JNVUxBJyxcbjB4MDA2QjogJ0dFVC5OQU1FJyxcbjB4MDA2QzogJ1NFVC5WQUxVRScsXG4weDAwNkQ6ICdMT0cnLFxuMHgwMDZFOiAnRVhFQycsXG4weDAwNkY6ICdDSEFSJyxcbjB4MDA3MDogJ0xPV0VSJyxcbjB4MDA3MTogJ1VQUEVSJyxcbjB4MDA3MjogJ1BST1BFUicsXG4weDAwNzM6ICdMRUZUJyxcbjB4MDA3NDogJ1JJR0hUJyxcbjB4MDA3NTogJ0VYQUNUJyxcbjB4MDA3NjogJ1RSSU0nLFxuMHgwMDc3OiAnUkVQTEFDRScsXG4weDAwNzg6ICdTVUJTVElUVVRFJyxcbjB4MDA3OTogJ0NPREUnLFxuMHgwMDdBOiAnTkFNRVMnLFxuMHgwMDdCOiAnRElSRUNUT1JZJyxcbjB4MDA3QzogJ0ZJTkQnLFxuMHgwMDdEOiAnQ0VMTCcsXG4weDAwN0U6ICdJU0VSUicsXG4weDAwN0Y6ICdJU1RFWFQnLFxuMHgwMDgwOiAnSVNOVU1CRVInLFxuMHgwMDgxOiAnSVNCTEFOSycsXG4weDAwODI6ICdUJyxcbjB4MDA4MzogJ04nLFxuMHgwMDg0OiAnRk9QRU4nLFxuMHgwMDg1OiAnRkNMT1NFJyxcbjB4MDA4NjogJ0ZTSVpFJyxcbjB4MDA4NzogJ0ZSRUFETE4nLFxuMHgwMDg4OiAnRlJFQUQnLFxuMHgwMDg5OiAnRldSSVRFTE4nLFxuMHgwMDhBOiAnRldSSVRFJyxcbjB4MDA4QjogJ0ZQT1MnLFxuMHgwMDhDOiAnREFURVZBTFVFJyxcbjB4MDA4RDogJ1RJTUVWQUxVRScsXG4weDAwOEU6ICdTTE4nLFxuMHgwMDhGOiAnU1lEJyxcbjB4MDA5MDogJ0REQicsXG4weDAwOTE6ICdHRVQuREVGJyxcbjB4MDA5MjogJ1JFRlRFWFQnLFxuMHgwMDkzOiAnVEVYVFJFRicsXG4weDAwOTQ6ICdJTkRJUkVDVCcsXG4weDAwOTU6ICdSRUdJU1RFUicsXG4weDAwOTY6ICdDQUxMJyxcbjB4MDA5NzogJ0FERC5CQVInLFxuMHgwMDk4OiAnQURELk1FTlUnLFxuMHgwMDk5OiAnQURELkNPTU1BTkQnLFxuMHgwMDlBOiAnRU5BQkxFLkNPTU1BTkQnLFxuMHgwMDlCOiAnQ0hFQ0suQ09NTUFORCcsXG4weDAwOUM6ICdSRU5BTUUuQ09NTUFORCcsXG4weDAwOUQ6ICdTSE9XLkJBUicsXG4weDAwOUU6ICdERUxFVEUuTUVOVScsXG4weDAwOUY6ICdERUxFVEUuQ09NTUFORCcsXG4weDAwQTA6ICdHRVQuQ0hBUlQuSVRFTScsXG4weDAwQTE6ICdESUFMT0cuQk9YJyxcbjB4MDBBMjogJ0NMRUFOJyxcbjB4MDBBMzogJ01ERVRFUk0nLFxuMHgwMEE0OiAnTUlOVkVSU0UnLFxuMHgwMEE1OiAnTU1VTFQnLFxuMHgwMEE2OiAnRklMRVMnLFxuMHgwMEE3OiAnSVBNVCcsXG4weDAwQTg6ICdQUE1UJyxcbjB4MDBBOTogJ0NPVU5UQScsXG4weDAwQUE6ICdDQU5DRUwuS0VZJyxcbjB4MDBBQjogJ0ZPUicsXG4weDAwQUM6ICdXSElMRScsXG4weDAwQUQ6ICdCUkVBSycsXG4weDAwQUU6ICdORVhUJyxcbjB4MDBBRjogJ0lOSVRJQVRFJyxcbjB4MDBCMDogJ1JFUVVFU1QnLFxuMHgwMEIxOiAnUE9LRScsXG4weDAwQjI6ICdFWEVDVVRFJyxcbjB4MDBCMzogJ1RFUk1JTkFURScsXG4weDAwQjQ6ICdSRVNUQVJUJyxcbjB4MDBCNTogJ0hFTFAnLFxuMHgwMEI2OiAnR0VULkJBUicsXG4weDAwQjc6ICdQUk9EVUNUJyxcbjB4MDBCODogJ0ZBQ1QnLFxuMHgwMEI5OiAnR0VULkNFTEwnLFxuMHgwMEJBOiAnR0VULldPUktTUEFDRScsXG4weDAwQkI6ICdHRVQuV0lORE9XJyxcbjB4MDBCQzogJ0dFVC5ET0NVTUVOVCcsXG4weDAwQkQ6ICdEUFJPRFVDVCcsXG4weDAwQkU6ICdJU05PTlRFWFQnLFxuMHgwMEJGOiAnR0VULk5PVEUnLFxuMHgwMEMwOiAnTk9URScsXG4weDAwQzE6ICdTVERFVlAnLFxuMHgwMEMyOiAnVkFSUCcsXG4weDAwQzM6ICdEU1RERVZQJyxcbjB4MDBDNDogJ0RWQVJQJyxcbjB4MDBDNTogJ1RSVU5DJyxcbjB4MDBDNjogJ0lTTE9HSUNBTCcsXG4weDAwQzc6ICdEQ09VTlRBJyxcbjB4MDBDODogJ0RFTEVURS5CQVInLFxuMHgwMEM5OiAnVU5SRUdJU1RFUicsXG4weDAwQ0M6ICdVU0RPTExBUicsXG4weDAwQ0Q6ICdGSU5EQicsXG4weDAwQ0U6ICdTRUFSQ0hCJyxcbjB4MDBDRjogJ1JFUExBQ0VCJyxcbjB4MDBEMDogJ0xFRlRCJyxcbjB4MDBEMTogJ1JJR0hUQicsXG4weDAwRDI6ICdNSURCJyxcbjB4MDBEMzogJ0xFTkInLFxuMHgwMEQ0OiAnUk9VTkRVUCcsXG4weDAwRDU6ICdST1VORERPV04nLFxuMHgwMEQ2OiAnQVNDJyxcbjB4MDBENzogJ0RCQ1MnLFxuMHgwMEQ4OiAnUkFOSycsXG4weDAwREI6ICdBRERSRVNTJyxcbjB4MDBEQzogJ0RBWVMzNjAnLFxuMHgwMEREOiAnVE9EQVknLFxuMHgwMERFOiAnVkRCJyxcbjB4MDBERjogJ0VMU0UnLFxuMHgwMEUwOiAnRUxTRS5JRicsXG4weDAwRTE6ICdFTkQuSUYnLFxuMHgwMEUyOiAnRk9SLkNFTEwnLFxuMHgwMEUzOiAnTUVESUFOJyxcbjB4MDBFNDogJ1NVTVBST0RVQ1QnLFxuMHgwMEU1OiAnU0lOSCcsXG4weDAwRTY6ICdDT1NIJyxcbjB4MDBFNzogJ1RBTkgnLFxuMHgwMEU4OiAnQVNJTkgnLFxuMHgwMEU5OiAnQUNPU0gnLFxuMHgwMEVBOiAnQVRBTkgnLFxuMHgwMEVCOiAnREdFVCcsXG4weDAwRUM6ICdDUkVBVEUuT0JKRUNUJyxcbjB4MDBFRDogJ1ZPTEFUSUxFJyxcbjB4MDBFRTogJ0xBU1QuRVJST1InLFxuMHgwMEVGOiAnQ1VTVE9NLlVORE8nLFxuMHgwMEYwOiAnQ1VTVE9NLlJFUEVBVCcsXG4weDAwRjE6ICdGT1JNVUxBLkNPTlZFUlQnLFxuMHgwMEYyOiAnR0VULkxJTksuSU5GTycsXG4weDAwRjM6ICdURVhULkJPWCcsXG4weDAwRjQ6ICdJTkZPJyxcbjB4MDBGNTogJ0dST1VQJyxcbjB4MDBGNjogJ0dFVC5PQkpFQ1QnLFxuMHgwMEY3OiAnREInLFxuMHgwMEY4OiAnUEFVU0UnLFxuMHgwMEZCOiAnUkVTVU1FJyxcbjB4MDBGQzogJ0ZSRVFVRU5DWScsXG4weDAwRkQ6ICdBREQuVE9PTEJBUicsXG4weDAwRkU6ICdERUxFVEUuVE9PTEJBUicsXG4weDAwRkY6ICdVc2VyJyxcbjB4MDEwMDogJ1JFU0VULlRPT0xCQVInLFxuMHgwMTAxOiAnRVZBTFVBVEUnLFxuMHgwMTAyOiAnR0VULlRPT0xCQVInLFxuMHgwMTAzOiAnR0VULlRPT0wnLFxuMHgwMTA0OiAnU1BFTExJTkcuQ0hFQ0snLFxuMHgwMTA1OiAnRVJST1IuVFlQRScsXG4weDAxMDY6ICdBUFAuVElUTEUnLFxuMHgwMTA3OiAnV0lORE9XLlRJVExFJyxcbjB4MDEwODogJ1NBVkUuVE9PTEJBUicsXG4weDAxMDk6ICdFTkFCTEUuVE9PTCcsXG4weDAxMEE6ICdQUkVTUy5UT09MJyxcbjB4MDEwQjogJ1JFR0lTVEVSLklEJyxcbjB4MDEwQzogJ0dFVC5XT1JLQk9PSycsXG4weDAxMEQ6ICdBVkVERVYnLFxuMHgwMTBFOiAnQkVUQURJU1QnLFxuMHgwMTBGOiAnR0FNTUFMTicsXG4weDAxMTA6ICdCRVRBSU5WJyxcbjB4MDExMTogJ0JJTk9NRElTVCcsXG4weDAxMTI6ICdDSElESVNUJyxcbjB4MDExMzogJ0NISUlOVicsXG4weDAxMTQ6ICdDT01CSU4nLFxuMHgwMTE1OiAnQ09ORklERU5DRScsXG4weDAxMTY6ICdDUklUQklOT00nLFxuMHgwMTE3OiAnRVZFTicsXG4weDAxMTg6ICdFWFBPTkRJU1QnLFxuMHgwMTE5OiAnRkRJU1QnLFxuMHgwMTFBOiAnRklOVicsXG4weDAxMUI6ICdGSVNIRVInLFxuMHgwMTFDOiAnRklTSEVSSU5WJyxcbjB4MDExRDogJ0ZMT09SJyxcbjB4MDExRTogJ0dBTU1BRElTVCcsXG4weDAxMUY6ICdHQU1NQUlOVicsXG4weDAxMjA6ICdDRUlMSU5HJyxcbjB4MDEyMTogJ0hZUEdFT01ESVNUJyxcbjB4MDEyMjogJ0xPR05PUk1ESVNUJyxcbjB4MDEyMzogJ0xPR0lOVicsXG4weDAxMjQ6ICdORUdCSU5PTURJU1QnLFxuMHgwMTI1OiAnTk9STURJU1QnLFxuMHgwMTI2OiAnTk9STVNESVNUJyxcbjB4MDEyNzogJ05PUk1JTlYnLFxuMHgwMTI4OiAnTk9STVNJTlYnLFxuMHgwMTI5OiAnU1RBTkRBUkRJWkUnLFxuMHgwMTJBOiAnT0REJyxcbjB4MDEyQjogJ1BFUk1VVCcsXG4weDAxMkM6ICdQT0lTU09OJyxcbjB4MDEyRDogJ1RESVNUJyxcbjB4MDEyRTogJ1dFSUJVTEwnLFxuMHgwMTJGOiAnU1VNWE1ZMicsXG4weDAxMzA6ICdTVU1YMk1ZMicsXG4weDAxMzE6ICdTVU1YMlBZMicsXG4weDAxMzI6ICdDSElURVNUJyxcbjB4MDEzMzogJ0NPUlJFTCcsXG4weDAxMzQ6ICdDT1ZBUicsXG4weDAxMzU6ICdGT1JFQ0FTVCcsXG4weDAxMzY6ICdGVEVTVCcsXG4weDAxMzc6ICdJTlRFUkNFUFQnLFxuMHgwMTM4OiAnUEVBUlNPTicsXG4weDAxMzk6ICdSU1EnLFxuMHgwMTNBOiAnU1RFWVgnLFxuMHgwMTNCOiAnU0xPUEUnLFxuMHgwMTNDOiAnVFRFU1QnLFxuMHgwMTNEOiAnUFJPQicsXG4weDAxM0U6ICdERVZTUScsXG4weDAxM0Y6ICdHRU9NRUFOJyxcbjB4MDE0MDogJ0hBUk1FQU4nLFxuMHgwMTQxOiAnU1VNU1EnLFxuMHgwMTQyOiAnS1VSVCcsXG4weDAxNDM6ICdTS0VXJyxcbjB4MDE0NDogJ1pURVNUJyxcbjB4MDE0NTogJ0xBUkdFJyxcbjB4MDE0NjogJ1NNQUxMJyxcbjB4MDE0NzogJ1FVQVJUSUxFJyxcbjB4MDE0ODogJ1BFUkNFTlRJTEUnLFxuMHgwMTQ5OiAnUEVSQ0VOVFJBTksnLFxuMHgwMTRBOiAnTU9ERScsXG4weDAxNEI6ICdUUklNTUVBTicsXG4weDAxNEM6ICdUSU5WJyxcbjB4MDE0RTogJ01PVklFLkNPTU1BTkQnLFxuMHgwMTRGOiAnR0VULk1PVklFJyxcbjB4MDE1MDogJ0NPTkNBVEVOQVRFJyxcbjB4MDE1MTogJ1BPV0VSJyxcbjB4MDE1MjogJ1BJVk9ULkFERC5EQVRBJyxcbjB4MDE1MzogJ0dFVC5QSVZPVC5UQUJMRScsXG4weDAxNTQ6ICdHRVQuUElWT1QuRklFTEQnLFxuMHgwMTU1OiAnR0VULlBJVk9ULklURU0nLFxuMHgwMTU2OiAnUkFESUFOUycsXG4weDAxNTc6ICdERUdSRUVTJyxcbjB4MDE1ODogJ1NVQlRPVEFMJyxcbjB4MDE1OTogJ1NVTUlGJyxcbjB4MDE1QTogJ0NPVU5USUYnLFxuMHgwMTVCOiAnQ09VTlRCTEFOSycsXG4weDAxNUM6ICdTQ0VOQVJJTy5HRVQnLFxuMHgwMTVEOiAnT1BUSU9OUy5MSVNUUy5HRVQnLFxuMHgwMTVFOiAnSVNQTVQnLFxuMHgwMTVGOiAnREFURURJRicsXG4weDAxNjA6ICdEQVRFU1RSSU5HJyxcbjB4MDE2MTogJ05VTUJFUlNUUklORycsXG4weDAxNjI6ICdST01BTicsXG4weDAxNjM6ICdPUEVOLkRJQUxPRycsXG4weDAxNjQ6ICdTQVZFLkRJQUxPRycsXG4weDAxNjU6ICdWSUVXLkdFVCcsXG4weDAxNjY6ICdHRVRQSVZPVERBVEEnLFxuMHgwMTY3OiAnSFlQRVJMSU5LJyxcbjB4MDE2ODogJ1BIT05FVElDJyxcbjB4MDE2OTogJ0FWRVJBR0VBJyxcbjB4MDE2QTogJ01BWEEnLFxuMHgwMTZCOiAnTUlOQScsXG4weDAxNkM6ICdTVERFVlBBJyxcbjB4MDE2RDogJ1ZBUlBBJyxcbjB4MDE2RTogJ1NUREVWQScsXG4weDAxNkY6ICdWQVJBJyxcbjB4MDE3MDogJ0JBSFRURVhUJyxcbjB4MDE3MTogJ1RIQUlEQVlPRldFRUsnLFxuMHgwMTcyOiAnVEhBSURJR0lUJyxcbjB4MDE3MzogJ1RIQUlNT05USE9GWUVBUicsXG4weDAxNzQ6ICdUSEFJTlVNU09VTkQnLFxuMHgwMTc1OiAnVEhBSU5VTVNUUklORycsXG4weDAxNzY6ICdUSEFJU1RSSU5HTEVOR1RIJyxcbjB4MDE3NzogJ0lTVEhBSURJR0lUJyxcbjB4MDE3ODogJ1JPVU5EQkFIVERPV04nLFxuMHgwMTc5OiAnUk9VTkRCQUhUVVAnLFxuMHgwMTdBOiAnVEhBSVlFQVInLFxuMHgwMTdCOiAnUlREJyxcblxuMHgwMTdDOiAnQ1VCRVZBTFVFJyxcbjB4MDE3RDogJ0NVQkVNRU1CRVInLFxuMHgwMTdFOiAnQ1VCRU1FTUJFUlBST1BFUlRZJyxcbjB4MDE3RjogJ0NVQkVSQU5LRURNRU1CRVInLFxuMHgwMTgwOiAnSEVYMkJJTicsXG4weDAxODE6ICdIRVgyREVDJyxcbjB4MDE4MjogJ0hFWDJPQ1QnLFxuMHgwMTgzOiAnREVDMkJJTicsXG4weDAxODQ6ICdERUMySEVYJyxcbjB4MDE4NTogJ0RFQzJPQ1QnLFxuMHgwMTg2OiAnT0NUMkJJTicsXG4weDAxODc6ICdPQ1QySEVYJyxcbjB4MDE4ODogJ09DVDJERUMnLFxuMHgwMTg5OiAnQklOMkRFQycsXG4weDAxOEE6ICdCSU4yT0NUJyxcbjB4MDE4QjogJ0JJTjJIRVgnLFxuMHgwMThDOiAnSU1TVUInLFxuMHgwMThEOiAnSU1ESVYnLFxuMHgwMThFOiAnSU1QT1dFUicsXG4weDAxOEY6ICdJTUFCUycsXG4weDAxOTA6ICdJTVNRUlQnLFxuMHgwMTkxOiAnSU1MTicsXG4weDAxOTI6ICdJTUxPRzInLFxuMHgwMTkzOiAnSU1MT0cxMCcsXG4weDAxOTQ6ICdJTVNJTicsXG4weDAxOTU6ICdJTUNPUycsXG4weDAxOTY6ICdJTUVYUCcsXG4weDAxOTc6ICdJTUFSR1VNRU5UJyxcbjB4MDE5ODogJ0lNQ09OSlVHQVRFJyxcbjB4MDE5OTogJ0lNQUdJTkFSWScsXG4weDAxOUE6ICdJTVJFQUwnLFxuMHgwMTlCOiAnQ09NUExFWCcsXG4weDAxOUM6ICdJTVNVTScsXG4weDAxOUQ6ICdJTVBST0RVQ1QnLFxuMHgwMTlFOiAnU0VSSUVTU1VNJyxcbjB4MDE5RjogJ0ZBQ1RET1VCTEUnLFxuMHgwMUEwOiAnU1FSVFBJJyxcbjB4MDFBMTogJ1FVT1RJRU5UJyxcbjB4MDFBMjogJ0RFTFRBJyxcbjB4MDFBMzogJ0dFU1RFUCcsXG4weDAxQTQ6ICdJU0VWRU4nLFxuMHgwMUE1OiAnSVNPREQnLFxuMHgwMUE2OiAnTVJPVU5EJyxcbjB4MDFBNzogJ0VSRicsXG4weDAxQTg6ICdFUkZDJyxcbjB4MDFBOTogJ0JFU1NFTEonLFxuMHgwMUFBOiAnQkVTU0VMSycsXG4weDAxQUI6ICdCRVNTRUxZJyxcbjB4MDFBQzogJ0JFU1NFTEknLFxuMHgwMUFEOiAnWElSUicsXG4weDAxQUU6ICdYTlBWJyxcbjB4MDFBRjogJ1BSSUNFTUFUJyxcbjB4MDFCMDogJ1lJRUxETUFUJyxcbjB4MDFCMTogJ0lOVFJBVEUnLFxuMHgwMUIyOiAnUkVDRUlWRUQnLFxuMHgwMUIzOiAnRElTQycsXG4weDAxQjQ6ICdQUklDRURJU0MnLFxuMHgwMUI1OiAnWUlFTERESVNDJyxcbjB4MDFCNjogJ1RCSUxMRVEnLFxuMHgwMUI3OiAnVEJJTExQUklDRScsXG4weDAxQjg6ICdUQklMTFlJRUxEJyxcbjB4MDFCOTogJ1BSSUNFJyxcbjB4MDFCQTogJ1lJRUxEJyxcbjB4MDFCQjogJ0RPTExBUkRFJyxcbjB4MDFCQzogJ0RPTExBUkZSJyxcbjB4MDFCRDogJ05PTUlOQUwnLFxuMHgwMUJFOiAnRUZGRUNUJyxcbjB4MDFCRjogJ0NVTVBSSU5DJyxcbjB4MDFDMDogJ0NVTUlQTVQnLFxuMHgwMUMxOiAnRURBVEUnLFxuMHgwMUMyOiAnRU9NT05USCcsXG4weDAxQzM6ICdZRUFSRlJBQycsXG4weDAxQzQ6ICdDT1VQREFZQlMnLFxuMHgwMUM1OiAnQ09VUERBWVMnLFxuMHgwMUM2OiAnQ09VUERBWVNOQycsXG4weDAxQzc6ICdDT1VQTkNEJyxcbjB4MDFDODogJ0NPVVBOVU0nLFxuMHgwMUM5OiAnQ09VUFBDRCcsXG4weDAxQ0E6ICdEVVJBVElPTicsXG4weDAxQ0I6ICdNRFVSQVRJT04nLFxuMHgwMUNDOiAnT0RETFBSSUNFJyxcbjB4MDFDRDogJ09ERExZSUVMRCcsXG4weDAxQ0U6ICdPRERGUFJJQ0UnLFxuMHgwMUNGOiAnT0RERllJRUxEJyxcbjB4MDFEMDogJ1JBTkRCRVRXRUVOJyxcbjB4MDFEMTogJ1dFRUtOVU0nLFxuMHgwMUQyOiAnQU1PUkRFR1JDJyxcbjB4MDFEMzogJ0FNT1JMSU5DJyxcbjB4MDFENDogJ0NPTlZFUlQnLFxuMHgwMkQ0OiAnU0hFRVRKUycsXG4weDAxRDU6ICdBQ0NSSU5UJyxcbjB4MDFENjogJ0FDQ1JJTlRNJyxcbjB4MDFENzogJ1dPUktEQVknLFxuMHgwMUQ4OiAnTkVUV09SS0RBWVMnLFxuMHgwMUQ5OiAnR0NEJyxcbjB4MDFEQTogJ01VTFRJTk9NSUFMJyxcbjB4MDFEQjogJ0xDTScsXG4weDAxREM6ICdGVlNDSEVEVUxFJyxcbjB4MDFERDogJ0NVQkVLUElNRU1CRVInLFxuMHgwMURFOiAnQ1VCRVNFVCcsXG4weDAxREY6ICdDVUJFU0VUQ09VTlQnLFxuMHgwMUUwOiAnSUZFUlJPUicsXG4weDAxRTE6ICdDT1VOVElGUycsXG4weDAxRTI6ICdTVU1JRlMnLFxuMHgwMUUzOiAnQVZFUkFHRUlGJyxcbjB4MDFFNDogJ0FWRVJBR0VJRlMnXG59O1xudmFyIEZ0YWJBcmdjID0ge1xuMHgwMDAyOiAxLCAvKiBJU05BICovXG4weDAwMDM6IDEsIC8qIElTRVJST1IgKi9cbjB4MDAwQTogMCwgLyogTkEgKi9cbjB4MDAwRjogMSwgLyogU0lOICovXG4weDAwMTA6IDEsIC8qIENPUyAqL1xuMHgwMDExOiAxLCAvKiBUQU4gKi9cbjB4MDAxMjogMSwgLyogQVRBTiAqL1xuMHgwMDEzOiAwLCAvKiBQSSAqL1xuMHgwMDE0OiAxLCAvKiBTUVJUICovXG4weDAwMTU6IDEsIC8qIEVYUCAqL1xuMHgwMDE2OiAxLCAvKiBMTiAqL1xuMHgwMDE3OiAxLCAvKiBMT0cxMCAqL1xuMHgwMDE4OiAxLCAvKiBBQlMgKi9cbjB4MDAxOTogMSwgLyogSU5UICovXG4weDAwMUE6IDEsIC8qIFNJR04gKi9cbjB4MDAxQjogMiwgLyogUk9VTkQgKi9cbjB4MDAxRTogMiwgLyogUkVQVCAqL1xuMHgwMDFGOiAzLCAvKiBNSUQgKi9cbjB4MDAyMDogMSwgLyogTEVOICovXG4weDAwMjE6IDEsIC8qIFZBTFVFICovXG4weDAwMjI6IDAsIC8qIFRSVUUgKi9cbjB4MDAyMzogMCwgLyogRkFMU0UgKi9cbjB4MDAyNjogMSwgLyogTk9UICovXG4weDAwMjc6IDIsIC8qIE1PRCAqL1xuMHgwMDI4OiAzLCAvKiBEQ09VTlQgKi9cbjB4MDAyOTogMywgLyogRFNVTSAqL1xuMHgwMDJBOiAzLCAvKiBEQVZFUkFHRSAqL1xuMHgwMDJCOiAzLCAvKiBETUlOICovXG4weDAwMkM6IDMsIC8qIERNQVggKi9cbjB4MDAyRDogMywgLyogRFNUREVWICovXG4weDAwMkY6IDMsIC8qIERWQVIgKi9cbjB4MDAzMDogMiwgLyogVEVYVCAqL1xuMHgwMDM1OiAxLCAvKiBHT1RPICovXG4weDAwM0Q6IDMsIC8qIE1JUlIgKi9cbjB4MDAzRjogMCwgLyogUkFORCAqL1xuMHgwMDQxOiAzLCAvKiBEQVRFICovXG4weDAwNDI6IDMsIC8qIFRJTUUgKi9cbjB4MDA0MzogMSwgLyogREFZICovXG4weDAwNDQ6IDEsIC8qIE1PTlRIICovXG4weDAwNDU6IDEsIC8qIFlFQVIgKi9cbjB4MDA0NjogMSwgLyogV0VFS0RBWSAqL1xuMHgwMDQ3OiAxLCAvKiBIT1VSICovXG4weDAwNDg6IDEsIC8qIE1JTlVURSAqL1xuMHgwMDQ5OiAxLCAvKiBTRUNPTkQgKi9cbjB4MDA0QTogMCwgLyogTk9XICovXG4weDAwNEI6IDEsIC8qIEFSRUFTICovXG4weDAwNEM6IDEsIC8qIFJPV1MgKi9cbjB4MDA0RDogMSwgLyogQ09MVU1OUyAqL1xuMHgwMDRGOiAyLCAvKiBBQlNSRUYgKi9cbjB4MDA1MDogMiwgLyogUkVMUkVGICovXG4weDAwNTM6IDEsIC8qIFRSQU5TUE9TRSAqL1xuMHgwMDU1OiAwLCAvKiBTVEVQICovXG4weDAwNTY6IDEsIC8qIFRZUEUgKi9cbjB4MDA1OTogMCwgLyogQ0FMTEVSICovXG4weDAwNUE6IDEsIC8qIERFUkVGICovXG4weDAwNUU6IDAsIC8qIEFDVElWRS5DRUxMICovXG4weDAwNUY6IDAsIC8qIFNFTEVDVElPTiAqL1xuMHgwMDYxOiAyLCAvKiBBVEFOMiAqL1xuMHgwMDYyOiAxLCAvKiBBU0lOICovXG4weDAwNjM6IDEsIC8qIEFDT1MgKi9cbjB4MDA2NTogMywgLyogSExPT0tVUCAqL1xuMHgwMDY2OiAzLCAvKiBWTE9PS1VQICovXG4weDAwNjk6IDEsIC8qIElTUkVGICovXG4weDAwNkE6IDEsIC8qIEdFVC5GT1JNVUxBICovXG4weDAwNkM6IDIsIC8qIFNFVC5WQUxVRSAqL1xuMHgwMDZGOiAxLCAvKiBDSEFSICovXG4weDAwNzA6IDEsIC8qIExPV0VSICovXG4weDAwNzE6IDEsIC8qIFVQUEVSICovXG4weDAwNzI6IDEsIC8qIFBST1BFUiAqL1xuMHgwMDc1OiAyLCAvKiBFWEFDVCAqL1xuMHgwMDc2OiAxLCAvKiBUUklNICovXG4weDAwNzc6IDQsIC8qIFJFUExBQ0UgKi9cbjB4MDA3OTogMSwgLyogQ09ERSAqL1xuMHgwMDdFOiAxLCAvKiBJU0VSUiAqL1xuMHgwMDdGOiAxLCAvKiBJU1RFWFQgKi9cbjB4MDA4MDogMSwgLyogSVNOVU1CRVIgKi9cbjB4MDA4MTogMSwgLyogSVNCTEFOSyAqL1xuMHgwMDgyOiAxLCAvKiBUICovXG4weDAwODM6IDEsIC8qIE4gKi9cbjB4MDA4NTogMSwgLyogRkNMT1NFICovXG4weDAwODY6IDEsIC8qIEZTSVpFICovXG4weDAwODc6IDEsIC8qIEZSRUFETE4gKi9cbjB4MDA4ODogMiwgLyogRlJFQUQgKi9cbjB4MDA4OTogMiwgLyogRldSSVRFTE4gKi9cbjB4MDA4QTogMiwgLyogRldSSVRFICovXG4weDAwOEM6IDEsIC8qIERBVEVWQUxVRSAqL1xuMHgwMDhEOiAxLCAvKiBUSU1FVkFMVUUgKi9cbjB4MDA4RTogMywgLyogU0xOICovXG4weDAwOEY6IDQsIC8qIFNZRCAqL1xuMHgwMDkwOiA0LCAvKiBEREIgKi9cbjB4MDBBMTogMSwgLyogRElBTE9HLkJPWCAqL1xuMHgwMEEyOiAxLCAvKiBDTEVBTiAqL1xuMHgwMEEzOiAxLCAvKiBNREVURVJNICovXG4weDAwQTQ6IDEsIC8qIE1JTlZFUlNFICovXG4weDAwQTU6IDIsIC8qIE1NVUxUICovXG4weDAwQUM6IDEsIC8qIFdISUxFICovXG4weDAwQUY6IDIsIC8qIElOSVRJQVRFICovXG4weDAwQjA6IDIsIC8qIFJFUVVFU1QgKi9cbjB4MDBCMTogMywgLyogUE9LRSAqL1xuMHgwMEIyOiAyLCAvKiBFWEVDVVRFICovXG4weDAwQjM6IDEsIC8qIFRFUk1JTkFURSAqL1xuMHgwMEI4OiAxLCAvKiBGQUNUICovXG4weDAwQkE6IDEsIC8qIEdFVC5XT1JLU1BBQ0UgKi9cbjB4MDBCRDogMywgLyogRFBST0RVQ1QgKi9cbjB4MDBCRTogMSwgLyogSVNOT05URVhUICovXG4weDAwQzM6IDMsIC8qIERTVERFVlAgKi9cbjB4MDBDNDogMywgLyogRFZBUlAgKi9cbjB4MDBDNTogMSwgLyogVFJVTkMgKi9cbjB4MDBDNjogMSwgLyogSVNMT0dJQ0FMICovXG4weDAwQzc6IDMsIC8qIERDT1VOVEEgKi9cbjB4MDBDOTogMSwgLyogVU5SRUdJU1RFUiAqL1xuMHgwMENGOiA0LCAvKiBSRVBMQUNFQiAqL1xuMHgwMEQyOiAzLCAvKiBNSURCICovXG4weDAwRDM6IDEsIC8qIExFTkIgKi9cbjB4MDBENDogMiwgLyogUk9VTkRVUCAqL1xuMHgwMEQ1OiAyLCAvKiBST1VORERPV04gKi9cbjB4MDBENjogMSwgLyogQVNDICovXG4weDAwRDc6IDEsIC8qIERCQ1MgKi9cbjB4MDBFMTogMCwgLyogRU5ELklGICovXG4weDAwRTU6IDEsIC8qIFNJTkggKi9cbjB4MDBFNjogMSwgLyogQ09TSCAqL1xuMHgwMEU3OiAxLCAvKiBUQU5IICovXG4weDAwRTg6IDEsIC8qIEFTSU5IICovXG4weDAwRTk6IDEsIC8qIEFDT1NIICovXG4weDAwRUE6IDEsIC8qIEFUQU5IICovXG4weDAwRUI6IDMsIC8qIERHRVQgKi9cbjB4MDBGNDogMSwgLyogSU5GTyAqL1xuMHgwMEY3OiA0LCAvKiBEQiAqL1xuMHgwMEZDOiAyLCAvKiBGUkVRVUVOQ1kgKi9cbjB4MDEwMTogMSwgLyogRVZBTFVBVEUgKi9cbjB4MDEwNTogMSwgLyogRVJST1IuVFlQRSAqL1xuMHgwMTBGOiAxLCAvKiBHQU1NQUxOICovXG4weDAxMTE6IDQsIC8qIEJJTk9NRElTVCAqL1xuMHgwMTEyOiAyLCAvKiBDSElESVNUICovXG4weDAxMTM6IDIsIC8qIENISUlOViAqL1xuMHgwMTE0OiAyLCAvKiBDT01CSU4gKi9cbjB4MDExNTogMywgLyogQ09ORklERU5DRSAqL1xuMHgwMTE2OiAzLCAvKiBDUklUQklOT00gKi9cbjB4MDExNzogMSwgLyogRVZFTiAqL1xuMHgwMTE4OiAzLCAvKiBFWFBPTkRJU1QgKi9cbjB4MDExOTogMywgLyogRkRJU1QgKi9cbjB4MDExQTogMywgLyogRklOViAqL1xuMHgwMTFCOiAxLCAvKiBGSVNIRVIgKi9cbjB4MDExQzogMSwgLyogRklTSEVSSU5WICovXG4weDAxMUQ6IDIsIC8qIEZMT09SICovXG4weDAxMUU6IDQsIC8qIEdBTU1BRElTVCAqL1xuMHgwMTFGOiAzLCAvKiBHQU1NQUlOViAqL1xuMHgwMTIwOiAyLCAvKiBDRUlMSU5HICovXG4weDAxMjE6IDQsIC8qIEhZUEdFT01ESVNUICovXG4weDAxMjI6IDMsIC8qIExPR05PUk1ESVNUICovXG4weDAxMjM6IDMsIC8qIExPR0lOViAqL1xuMHgwMTI0OiAzLCAvKiBORUdCSU5PTURJU1QgKi9cbjB4MDEyNTogNCwgLyogTk9STURJU1QgKi9cbjB4MDEyNjogMSwgLyogTk9STVNESVNUICovXG4weDAxMjc6IDMsIC8qIE5PUk1JTlYgKi9cbjB4MDEyODogMSwgLyogTk9STVNJTlYgKi9cbjB4MDEyOTogMywgLyogU1RBTkRBUkRJWkUgKi9cbjB4MDEyQTogMSwgLyogT0REICovXG4weDAxMkI6IDIsIC8qIFBFUk1VVCAqL1xuMHgwMTJDOiAzLCAvKiBQT0lTU09OICovXG4weDAxMkQ6IDMsIC8qIFRESVNUICovXG4weDAxMkU6IDQsIC8qIFdFSUJVTEwgKi9cbjB4MDEyRjogMiwgLyogU1VNWE1ZMiAqL1xuMHgwMTMwOiAyLCAvKiBTVU1YMk1ZMiAqL1xuMHgwMTMxOiAyLCAvKiBTVU1YMlBZMiAqL1xuMHgwMTMyOiAyLCAvKiBDSElURVNUICovXG4weDAxMzM6IDIsIC8qIENPUlJFTCAqL1xuMHgwMTM0OiAyLCAvKiBDT1ZBUiAqL1xuMHgwMTM1OiAzLCAvKiBGT1JFQ0FTVCAqL1xuMHgwMTM2OiAyLCAvKiBGVEVTVCAqL1xuMHgwMTM3OiAyLCAvKiBJTlRFUkNFUFQgKi9cbjB4MDEzODogMiwgLyogUEVBUlNPTiAqL1xuMHgwMTM5OiAyLCAvKiBSU1EgKi9cbjB4MDEzQTogMiwgLyogU1RFWVggKi9cbjB4MDEzQjogMiwgLyogU0xPUEUgKi9cbjB4MDEzQzogNCwgLyogVFRFU1QgKi9cbjB4MDE0NTogMiwgLyogTEFSR0UgKi9cbjB4MDE0NjogMiwgLyogU01BTEwgKi9cbjB4MDE0NzogMiwgLyogUVVBUlRJTEUgKi9cbjB4MDE0ODogMiwgLyogUEVSQ0VOVElMRSAqL1xuMHgwMTRCOiAyLCAvKiBUUklNTUVBTiAqL1xuMHgwMTRDOiAyLCAvKiBUSU5WICovXG4weDAxNTE6IDIsIC8qIFBPV0VSICovXG4weDAxNTY6IDEsIC8qIFJBRElBTlMgKi9cbjB4MDE1NzogMSwgLyogREVHUkVFUyAqL1xuMHgwMTVBOiAyLCAvKiBDT1VOVElGICovXG4weDAxNUI6IDEsIC8qIENPVU5UQkxBTksgKi9cbjB4MDE1RTogNCwgLyogSVNQTVQgKi9cbjB4MDE1RjogMywgLyogREFURURJRiAqL1xuMHgwMTYwOiAxLCAvKiBEQVRFU1RSSU5HICovXG4weDAxNjE6IDIsIC8qIE5VTUJFUlNUUklORyAqL1xuMHgwMTY4OiAxLCAvKiBQSE9ORVRJQyAqL1xuMHgwMTcwOiAxLCAvKiBCQUhUVEVYVCAqL1xuMHgwMTcxOiAxLCAvKiBUSEFJREFZT0ZXRUVLICovXG4weDAxNzI6IDEsIC8qIFRIQUlESUdJVCAqL1xuMHgwMTczOiAxLCAvKiBUSEFJTU9OVEhPRllFQVIgKi9cbjB4MDE3NDogMSwgLyogVEhBSU5VTVNPVU5EICovXG4weDAxNzU6IDEsIC8qIFRIQUlOVU1TVFJJTkcgKi9cbjB4MDE3NjogMSwgLyogVEhBSVNUUklOR0xFTkdUSCAqL1xuMHgwMTc3OiAxLCAvKiBJU1RIQUlESUdJVCAqL1xuMHgwMTc4OiAxLCAvKiBST1VOREJBSFRET1dOICovXG4weDAxNzk6IDEsIC8qIFJPVU5EQkFIVFVQICovXG4weDAxN0E6IDEsIC8qIFRIQUlZRUFSICovXG4weDAxN0U6IDMsIC8qIENVQkVNRU1CRVJQUk9QRVJUWSAqL1xuMHgwMTgxOiAxLCAvKiBIRVgyREVDICovXG4weDAxODg6IDEsIC8qIE9DVDJERUMgKi9cbjB4MDE4OTogMSwgLyogQklOMkRFQyAqL1xuMHgwMThDOiAyLCAvKiBJTVNVQiAqL1xuMHgwMThEOiAyLCAvKiBJTURJViAqL1xuMHgwMThFOiAyLCAvKiBJTVBPV0VSICovXG4weDAxOEY6IDEsIC8qIElNQUJTICovXG4weDAxOTA6IDEsIC8qIElNU1FSVCAqL1xuMHgwMTkxOiAxLCAvKiBJTUxOICovXG4weDAxOTI6IDEsIC8qIElNTE9HMiAqL1xuMHgwMTkzOiAxLCAvKiBJTUxPRzEwICovXG4weDAxOTQ6IDEsIC8qIElNU0lOICovXG4weDAxOTU6IDEsIC8qIElNQ09TICovXG4weDAxOTY6IDEsIC8qIElNRVhQICovXG4weDAxOTc6IDEsIC8qIElNQVJHVU1FTlQgKi9cbjB4MDE5ODogMSwgLyogSU1DT05KVUdBVEUgKi9cbjB4MDE5OTogMSwgLyogSU1BR0lOQVJZICovXG4weDAxOUE6IDEsIC8qIElNUkVBTCAqL1xuMHgwMTlFOiA0LCAvKiBTRVJJRVNTVU0gKi9cbjB4MDE5RjogMSwgLyogRkFDVERPVUJMRSAqL1xuMHgwMUEwOiAxLCAvKiBTUVJUUEkgKi9cbjB4MDFBMTogMiwgLyogUVVPVElFTlQgKi9cbjB4MDFBNDogMSwgLyogSVNFVkVOICovXG4weDAxQTU6IDEsIC8qIElTT0REICovXG4weDAxQTY6IDIsIC8qIE1ST1VORCAqL1xuMHgwMUE4OiAxLCAvKiBFUkZDICovXG4weDAxQTk6IDIsIC8qIEJFU1NFTEogKi9cbjB4MDFBQTogMiwgLyogQkVTU0VMSyAqL1xuMHgwMUFCOiAyLCAvKiBCRVNTRUxZICovXG4weDAxQUM6IDIsIC8qIEJFU1NFTEkgKi9cbjB4MDFBRTogMywgLyogWE5QViAqL1xuMHgwMUI2OiAzLCAvKiBUQklMTEVRICovXG4weDAxQjc6IDMsIC8qIFRCSUxMUFJJQ0UgKi9cbjB4MDFCODogMywgLyogVEJJTExZSUVMRCAqL1xuMHgwMUJCOiAyLCAvKiBET0xMQVJERSAqL1xuMHgwMUJDOiAyLCAvKiBET0xMQVJGUiAqL1xuMHgwMUJEOiAyLCAvKiBOT01JTkFMICovXG4weDAxQkU6IDIsIC8qIEVGRkVDVCAqL1xuMHgwMUJGOiA2LCAvKiBDVU1QUklOQyAqL1xuMHgwMUMwOiA2LCAvKiBDVU1JUE1UICovXG4weDAxQzE6IDIsIC8qIEVEQVRFICovXG4weDAxQzI6IDIsIC8qIEVPTU9OVEggKi9cbjB4MDFEMDogMiwgLyogUkFOREJFVFdFRU4gKi9cbjB4MDFENDogMywgLyogQ09OVkVSVCAqL1xuMHgwMURDOiAyLCAvKiBGVlNDSEVEVUxFICovXG4weDAxREY6IDEsIC8qIENVQkVTRVRDT1VOVCAqL1xuMHgwMUUwOiAyLCAvKiBJRkVSUk9SICovXG4weEZGRkY6IDBcbn07XG4vKiBbTVMtWExTWF0gMi4yLjMgRnVuY3Rpb25zICovXG4vKiBbTVMtWExTQl0gMi41Ljk3LjEwIEZ0YWIgKi9cbnZhciBYTFNYRnV0dXJlRnVuY3Rpb25zID0ge1xuXHRcIl94bGZuLkFDT1RcIjogXCJBQ09UXCIsXG5cdFwiX3hsZm4uQUNPVEhcIjogXCJBQ09USFwiLFxuXHRcIl94bGZuLkFHR1JFR0FURVwiOiBcIkFHR1JFR0FURVwiLFxuXHRcIl94bGZuLkFSQUJJQ1wiOiBcIkFSQUJJQ1wiLFxuXHRcIl94bGZuLkFWRVJBR0VJRlwiOiBcIkFWRVJBR0VJRlwiLFxuXHRcIl94bGZuLkFWRVJBR0VJRlNcIjogXCJBVkVSQUdFSUZTXCIsXG5cdFwiX3hsZm4uQkFTRVwiOiBcIkJBU0VcIixcblx0XCJfeGxmbi5CRVRBLkRJU1RcIjogXCJCRVRBLkRJU1RcIixcblx0XCJfeGxmbi5CRVRBLklOVlwiOiBcIkJFVEEuSU5WXCIsXG5cdFwiX3hsZm4uQklOT00uRElTVFwiOiBcIkJJTk9NLkRJU1RcIixcblx0XCJfeGxmbi5CSU5PTS5ESVNULlJBTkdFXCI6IFwiQklOT00uRElTVC5SQU5HRVwiLFxuXHRcIl94bGZuLkJJTk9NLklOVlwiOiBcIkJJTk9NLklOVlwiLFxuXHRcIl94bGZuLkJJVEFORFwiOiBcIkJJVEFORFwiLFxuXHRcIl94bGZuLkJJVExTSElGVFwiOiBcIkJJVExTSElGVFwiLFxuXHRcIl94bGZuLkJJVE9SXCI6IFwiQklUT1JcIixcblx0XCJfeGxmbi5CSVRSU0hJRlRcIjogXCJCSVRSU0hJRlRcIixcblx0XCJfeGxmbi5CSVRYT1JcIjogXCJCSVRYT1JcIixcblx0XCJfeGxmbi5DRUlMSU5HLk1BVEhcIjogXCJDRUlMSU5HLk1BVEhcIixcblx0XCJfeGxmbi5DRUlMSU5HLlBSRUNJU0VcIjogXCJDRUlMSU5HLlBSRUNJU0VcIixcblx0XCJfeGxmbi5DSElTUS5ESVNUXCI6IFwiQ0hJU1EuRElTVFwiLFxuXHRcIl94bGZuLkNISVNRLkRJU1QuUlRcIjogXCJDSElTUS5ESVNULlJUXCIsXG5cdFwiX3hsZm4uQ0hJU1EuSU5WXCI6IFwiQ0hJU1EuSU5WXCIsXG5cdFwiX3hsZm4uQ0hJU1EuSU5WLlJUXCI6IFwiQ0hJU1EuSU5WLlJUXCIsXG5cdFwiX3hsZm4uQ0hJU1EuVEVTVFwiOiBcIkNISVNRLlRFU1RcIixcblx0XCJfeGxmbi5DT01CSU5BXCI6IFwiQ09NQklOQVwiLFxuXHRcIl94bGZuLkNPTkNBVFwiOiBcIkNPTkNBVFwiLFxuXHRcIl94bGZuLkNPTkZJREVOQ0UuTk9STVwiOiBcIkNPTkZJREVOQ0UuTk9STVwiLFxuXHRcIl94bGZuLkNPTkZJREVOQ0UuVFwiOiBcIkNPTkZJREVOQ0UuVFwiLFxuXHRcIl94bGZuLkNPVFwiOiBcIkNPVFwiLFxuXHRcIl94bGZuLkNPVEhcIjogXCJDT1RIXCIsXG5cdFwiX3hsZm4uQ09VTlRJRlNcIjogXCJDT1VOVElGU1wiLFxuXHRcIl94bGZuLkNPVkFSSUFOQ0UuUFwiOiBcIkNPVkFSSUFOQ0UuUFwiLFxuXHRcIl94bGZuLkNPVkFSSUFOQ0UuU1wiOiBcIkNPVkFSSUFOQ0UuU1wiLFxuXHRcIl94bGZuLkNTQ1wiOiBcIkNTQ1wiLFxuXHRcIl94bGZuLkNTQ0hcIjogXCJDU0NIXCIsXG5cdFwiX3hsZm4uREFZU1wiOiBcIkRBWVNcIixcblx0XCJfeGxmbi5ERUNJTUFMXCI6IFwiREVDSU1BTFwiLFxuXHRcIl94bGZuLkVDTUEuQ0VJTElOR1wiOiBcIkVDTUEuQ0VJTElOR1wiLFxuXHRcIl94bGZuLkVSRi5QUkVDSVNFXCI6IFwiRVJGLlBSRUNJU0VcIixcblx0XCJfeGxmbi5FUkZDLlBSRUNJU0VcIjogXCJFUkZDLlBSRUNJU0VcIixcblx0XCJfeGxmbi5FWFBPTi5ESVNUXCI6IFwiRVhQT04uRElTVFwiLFxuXHRcIl94bGZuLkYuRElTVFwiOiBcIkYuRElTVFwiLFxuXHRcIl94bGZuLkYuRElTVC5SVFwiOiBcIkYuRElTVC5SVFwiLFxuXHRcIl94bGZuLkYuSU5WXCI6IFwiRi5JTlZcIixcblx0XCJfeGxmbi5GLklOVi5SVFwiOiBcIkYuSU5WLlJUXCIsXG5cdFwiX3hsZm4uRi5URVNUXCI6IFwiRi5URVNUXCIsXG5cdFwiX3hsZm4uRklMVEVSWE1MXCI6IFwiRklMVEVSWE1MXCIsXG5cdFwiX3hsZm4uRkxPT1IuTUFUSFwiOiBcIkZMT09SLk1BVEhcIixcblx0XCJfeGxmbi5GTE9PUi5QUkVDSVNFXCI6IFwiRkxPT1IuUFJFQ0lTRVwiLFxuXHRcIl94bGZuLkZPUkVDQVNULkVUU1wiOiBcIkZPUkVDQVNULkVUU1wiLFxuXHRcIl94bGZuLkZPUkVDQVNULkVUUy5DT05GSU5UXCI6IFwiRk9SRUNBU1QuRVRTLkNPTkZJTlRcIixcblx0XCJfeGxmbi5GT1JFQ0FTVC5FVFMuU0VBU09OQUxJVFlcIjogXCJGT1JFQ0FTVC5FVFMuU0VBU09OQUxJVFlcIixcblx0XCJfeGxmbi5GT1JFQ0FTVC5FVFMuU1RBVFwiOiBcIkZPUkVDQVNULkVUUy5TVEFUXCIsXG5cdFwiX3hsZm4uRk9SRUNBU1QuTElORUFSXCI6IFwiRk9SRUNBU1QuTElORUFSXCIsXG5cdFwiX3hsZm4uRk9STVVMQVRFWFRcIjogXCJGT1JNVUxBVEVYVFwiLFxuXHRcIl94bGZuLkdBTU1BXCI6IFwiR0FNTUFcIixcblx0XCJfeGxmbi5HQU1NQS5ESVNUXCI6IFwiR0FNTUEuRElTVFwiLFxuXHRcIl94bGZuLkdBTU1BLklOVlwiOiBcIkdBTU1BLklOVlwiLFxuXHRcIl94bGZuLkdBTU1BTE4uUFJFQ0lTRVwiOiBcIkdBTU1BTE4uUFJFQ0lTRVwiLFxuXHRcIl94bGZuLkdBVVNTXCI6IFwiR0FVU1NcIixcblx0XCJfeGxmbi5IWVBHRU9NLkRJU1RcIjogXCJIWVBHRU9NLkRJU1RcIixcblx0XCJfeGxmbi5JRkVSUk9SXCI6IFwiSUZFUlJPUlwiLFxuXHRcIl94bGZuLklGTkFcIjogXCJJRk5BXCIsXG5cdFwiX3hsZm4uSUZTXCI6IFwiSUZTXCIsXG5cdFwiX3hsZm4uSU1DT1NIXCI6IFwiSU1DT1NIXCIsXG5cdFwiX3hsZm4uSU1DT1RcIjogXCJJTUNPVFwiLFxuXHRcIl94bGZuLklNQ1NDXCI6IFwiSU1DU0NcIixcblx0XCJfeGxmbi5JTUNTQ0hcIjogXCJJTUNTQ0hcIixcblx0XCJfeGxmbi5JTVNFQ1wiOiBcIklNU0VDXCIsXG5cdFwiX3hsZm4uSU1TRUNIXCI6IFwiSU1TRUNIXCIsXG5cdFwiX3hsZm4uSU1TSU5IXCI6IFwiSU1TSU5IXCIsXG5cdFwiX3hsZm4uSU1UQU5cIjogXCJJTVRBTlwiLFxuXHRcIl94bGZuLklTRk9STVVMQVwiOiBcIklTRk9STVVMQVwiLFxuXHRcIl94bGZuLklTTy5DRUlMSU5HXCI6IFwiSVNPLkNFSUxJTkdcIixcblx0XCJfeGxmbi5JU09XRUVLTlVNXCI6IFwiSVNPV0VFS05VTVwiLFxuXHRcIl94bGZuLkxPR05PUk0uRElTVFwiOiBcIkxPR05PUk0uRElTVFwiLFxuXHRcIl94bGZuLkxPR05PUk0uSU5WXCI6IFwiTE9HTk9STS5JTlZcIixcblx0XCJfeGxmbi5NQVhJRlNcIjogXCJNQVhJRlNcIixcblx0XCJfeGxmbi5NSU5JRlNcIjogXCJNSU5JRlNcIixcblx0XCJfeGxmbi5NT0RFLk1VTFRcIjogXCJNT0RFLk1VTFRcIixcblx0XCJfeGxmbi5NT0RFLlNOR0xcIjogXCJNT0RFLlNOR0xcIixcblx0XCJfeGxmbi5NVU5JVFwiOiBcIk1VTklUXCIsXG5cdFwiX3hsZm4uTkVHQklOT00uRElTVFwiOiBcIk5FR0JJTk9NLkRJU1RcIixcblx0XCJfeGxmbi5ORVRXT1JLREFZUy5JTlRMXCI6IFwiTkVUV09SS0RBWVMuSU5UTFwiLFxuXHRcIl94bGZuLk5JR0JJTk9NXCI6IFwiTklHQklOT01cIixcblx0XCJfeGxmbi5OT1JNLkRJU1RcIjogXCJOT1JNLkRJU1RcIixcblx0XCJfeGxmbi5OT1JNLklOVlwiOiBcIk5PUk0uSU5WXCIsXG5cdFwiX3hsZm4uTk9STS5TLkRJU1RcIjogXCJOT1JNLlMuRElTVFwiLFxuXHRcIl94bGZuLk5PUk0uUy5JTlZcIjogXCJOT1JNLlMuSU5WXCIsXG5cdFwiX3hsZm4uTlVNQkVSVkFMVUVcIjogXCJOVU1CRVJWQUxVRVwiLFxuXHRcIl94bGZuLlBEVVJBVElPTlwiOiBcIlBEVVJBVElPTlwiLFxuXHRcIl94bGZuLlBFUkNFTlRJTEUuRVhDXCI6IFwiUEVSQ0VOVElMRS5FWENcIixcblx0XCJfeGxmbi5QRVJDRU5USUxFLklOQ1wiOiBcIlBFUkNFTlRJTEUuSU5DXCIsXG5cdFwiX3hsZm4uUEVSQ0VOVFJBTksuRVhDXCI6IFwiUEVSQ0VOVFJBTksuRVhDXCIsXG5cdFwiX3hsZm4uUEVSQ0VOVFJBTksuSU5DXCI6IFwiUEVSQ0VOVFJBTksuSU5DXCIsXG5cdFwiX3hsZm4uUEVSTVVUQVRJT05BXCI6IFwiUEVSTVVUQVRJT05BXCIsXG5cdFwiX3hsZm4uUEhJXCI6IFwiUEhJXCIsXG5cdFwiX3hsZm4uUE9JU1NPTi5ESVNUXCI6IFwiUE9JU1NPTi5ESVNUXCIsXG5cdFwiX3hsZm4uUVVBUlRJTEUuRVhDXCI6IFwiUVVBUlRJTEUuRVhDXCIsXG5cdFwiX3hsZm4uUVVBUlRJTEUuSU5DXCI6IFwiUVVBUlRJTEUuSU5DXCIsXG5cdFwiX3hsZm4uUVVFUllTVFJJTkdcIjogXCJRVUVSWVNUUklOR1wiLFxuXHRcIl94bGZuLlJBTksuQVZHXCI6IFwiUkFOSy5BVkdcIixcblx0XCJfeGxmbi5SQU5LLkVRXCI6IFwiUkFOSy5FUVwiLFxuXHRcIl94bGZuLlJSSVwiOiBcIlJSSVwiLFxuXHRcIl94bGZuLlNFQ1wiOiBcIlNFQ1wiLFxuXHRcIl94bGZuLlNFQ0hcIjogXCJTRUNIXCIsXG5cdFwiX3hsZm4uU0hFRVRcIjogXCJTSEVFVFwiLFxuXHRcIl94bGZuLlNIRUVUU1wiOiBcIlNIRUVUU1wiLFxuXHRcIl94bGZuLlNLRVcuUFwiOiBcIlNLRVcuUFwiLFxuXHRcIl94bGZuLlNUREVWLlBcIjogXCJTVERFVi5QXCIsXG5cdFwiX3hsZm4uU1RERVYuU1wiOiBcIlNUREVWLlNcIixcblx0XCJfeGxmbi5TVU1JRlNcIjogXCJTVU1JRlNcIixcblx0XCJfeGxmbi5TV0lUQ0hcIjogXCJTV0lUQ0hcIixcblx0XCJfeGxmbi5ULkRJU1RcIjogXCJULkRJU1RcIixcblx0XCJfeGxmbi5ULkRJU1QuMlRcIjogXCJULkRJU1QuMlRcIixcblx0XCJfeGxmbi5ULkRJU1QuUlRcIjogXCJULkRJU1QuUlRcIixcblx0XCJfeGxmbi5ULklOVlwiOiBcIlQuSU5WXCIsXG5cdFwiX3hsZm4uVC5JTlYuMlRcIjogXCJULklOVi4yVFwiLFxuXHRcIl94bGZuLlQuVEVTVFwiOiBcIlQuVEVTVFwiLFxuXHRcIl94bGZuLlRFWFRKT0lOXCI6IFwiVEVYVEpPSU5cIixcblx0XCJfeGxmbi5VTklDSEFSXCI6IFwiVU5JQ0hBUlwiLFxuXHRcIl94bGZuLlVOSUNPREVcIjogXCJVTklDT0RFXCIsXG5cdFwiX3hsZm4uVkFSLlBcIjogXCJWQVIuUFwiLFxuXHRcIl94bGZuLlZBUi5TXCI6IFwiVkFSLlNcIixcblx0XCJfeGxmbi5XRUJTRVJWSUNFXCI6IFwiV0VCU0VSVklDRVwiLFxuXHRcIl94bGZuLldFSUJVTEwuRElTVFwiOiBcIldFSUJVTEwuRElTVFwiLFxuXHRcIl94bGZuLldPUktEQVkuSU5UTFwiOiBcIldPUktEQVkuSU5UTFwiLFxuXHRcIl94bGZuLlhPUlwiOiBcIlhPUlwiLFxuXHRcIl94bGZuLlouVEVTVFwiOiBcIlouVEVTVFwiXG59O1xuXG4vKiBQYXJ0IDMgVE9ETzogYWN0dWFsbHkgcGFyc2UgZm9ybXVsYWUgKi9cbmZ1bmN0aW9uIG9kc190b19jc2ZfZm9ybXVsYShmKSB7XG5cdGlmKGYuc2xpY2UoMCwzKSA9PSBcIm9mOlwiKSBmID0gZi5zbGljZSgzKTtcblx0LyogNS4yIEJhc2ljIEV4cHJlc3Npb25zICovXG5cdGlmKGYuY2hhckNvZGVBdCgwKSA9PSA2MSkge1xuXHRcdGYgPSBmLnNsaWNlKDEpO1xuXHRcdGlmKGYuY2hhckNvZGVBdCgwKSA9PSA2MSkgZiA9IGYuc2xpY2UoMSk7XG5cdH1cblx0ZiA9IGYucmVwbGFjZSgvQ09NXFwuTUlDUk9TT0ZUXFwuL2csIFwiXCIpO1xuXHQvKiBQYXJ0IDMgU2VjdGlvbiA1LjggUmVmZXJlbmNlcyAqL1xuXHRmID0gZi5yZXBsYWNlKC9cXFsoKD86XFwuW0EtWl0rWzAtOV0rKSg/OjpcXC5bQS1aXStbMC05XSspPylcXF0vZywgZnVuY3Rpb24oJCQsICQxKSB7IHJldHVybiAkMS5yZXBsYWNlKC9cXC4vZyxcIlwiKTsgfSk7XG5cdC8qIFRPRE86IHNvbWV0aGluZyBvdGhlciB0aGFuIHRoaXMgKi9cblx0ZiA9IGYucmVwbGFjZSgvXFxbLigjW0EtWl0qWz8hXSlcXF0vZywgXCIkMVwiKTtcblx0cmV0dXJuIGYucmVwbGFjZSgvWzt+XS9nLFwiLFwiKS5yZXBsYWNlKC9cXHwvZyxcIjtcIik7XG59XG5cbmZ1bmN0aW9uIGNzZl90b19vZHNfZm9ybXVsYShmKSB7XG5cdHZhciBvID0gXCJvZjo9XCIgKyBmLnJlcGxhY2UoY3JlZnJlZ2V4LCBcIiQxWy4kMiQzJDQkNV1cIikucmVwbGFjZSgvXFxdOlxcWy9nLFwiOlwiKTtcblx0LyogVE9ETzogc29tZXRoaW5nIG90aGVyIHRoYW4gdGhpcyAqL1xuXHRyZXR1cm4gby5yZXBsYWNlKC87L2csIFwifFwiKS5yZXBsYWNlKC8sL2csXCI7XCIpO1xufVxuXG5mdW5jdGlvbiBvZHNfdG9fY3NmXzNEKHIpIHtcblx0dmFyIGEgPSByLnNwbGl0KFwiOlwiKTtcblx0dmFyIHMgPSBhWzBdLnNwbGl0KFwiLlwiKVswXTtcblx0cmV0dXJuIFtzLCBhWzBdLnNwbGl0KFwiLlwiKVsxXSArIChhLmxlbmd0aCA+IDEgPyAoXCI6XCIgKyAoYVsxXS5zcGxpdChcIi5cIilbMV0gfHwgYVsxXS5zcGxpdChcIi5cIilbMF0pKSA6IFwiXCIpXTtcbn1cblxuZnVuY3Rpb24gY3NmX3RvX29kc18zRChyKSB7XG5cdHJldHVybiByLnJlcGxhY2UoL1xcLi8sXCIhXCIpO1xufVxuXG52YXIgc3RycyA9IHt9OyAvLyBzaGFyZWQgc3RyaW5nc1xudmFyIF9zc2ZvcHRzID0ge307IC8vIHNwcmVhZHNoZWV0IGZvcm1hdHRpbmcgb3B0aW9uc1xuXG5SRUxTLldTID0gW1xuXHRcImh0dHA6Ly9zY2hlbWFzLm9wZW54bWxmb3JtYXRzLm9yZy9vZmZpY2VEb2N1bWVudC8yMDA2L3JlbGF0aW9uc2hpcHMvd29ya3NoZWV0XCIsXG5cdFwiaHR0cDovL3B1cmwub2NsYy5vcmcvb294bWwvb2ZmaWNlRG9jdW1lbnQvcmVsYXRpb25zaGlwcy93b3Jrc2hlZXRcIlxuXTtcblxuLypnbG9iYWwgTWFwICovXG52YXIgYnJvd3Nlcl9oYXNfTWFwID0gdHlwZW9mIE1hcCAhPT0gJ3VuZGVmaW5lZCc7XG5cbmZ1bmN0aW9uIGdldF9zc3RfaWQoc3N0LCBzdHIsIHJldikge1xuXHR2YXIgaSA9IDAsIGxlbiA9IHNzdC5sZW5ndGg7XG5cdGlmKHJldikge1xuXHRcdGlmKGJyb3dzZXJfaGFzX01hcCA/IHJldi5oYXMoc3RyKSA6IE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChyZXYsIHN0cikpIHtcblx0XHRcdHZhciByZXZhcnIgPSBicm93c2VyX2hhc19NYXAgPyByZXYuZ2V0KHN0cikgOiByZXZbc3RyXTtcblx0XHRcdGZvcig7IGkgPCByZXZhcnIubGVuZ3RoOyArK2kpIHtcblx0XHRcdFx0aWYoc3N0W3JldmFycltpXV0udCA9PT0gc3RyKSB7IHNzdC5Db3VudCArKzsgcmV0dXJuIHJldmFycltpXTsgfVxuXHRcdFx0fVxuXHRcdH1cblx0fSBlbHNlIGZvcig7IGkgPCBsZW47ICsraSkge1xuXHRcdGlmKHNzdFtpXS50ID09PSBzdHIpIHsgc3N0LkNvdW50ICsrOyByZXR1cm4gaTsgfVxuXHR9XG5cdHNzdFtsZW5dID0gKHt0OnN0cn0pOyBzc3QuQ291bnQgKys7IHNzdC5VbmlxdWUgKys7XG5cdGlmKHJldikge1xuXHRcdGlmKGJyb3dzZXJfaGFzX01hcCkge1xuXHRcdFx0aWYoIXJldi5oYXMoc3RyKSkgcmV2LnNldChzdHIsIFtdKTtcblx0XHRcdHJldi5nZXQoc3RyKS5wdXNoKGxlbik7XG5cdFx0fSBlbHNlIHtcblx0XHRcdGlmKCFPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwocmV2LCBzdHIpKSByZXZbc3RyXSA9IFtdO1xuXHRcdFx0cmV2W3N0cl0ucHVzaChsZW4pO1xuXHRcdH1cblx0fVxuXHRyZXR1cm4gbGVuO1xufVxuXG5mdW5jdGlvbiBjb2xfb2JqX3coQywgY29sKSB7XG5cdHZhciBwID0gKHttaW46QysxLG1heDpDKzF9KTtcblx0Lyogd2NoIChjaGFycyksIHdweCAocGl4ZWxzKSAqL1xuXHR2YXIgd2NoID0gLTE7XG5cdGlmKGNvbC5NRFcpIE1EVyA9IGNvbC5NRFc7XG5cdGlmKGNvbC53aWR0aCAhPSBudWxsKSBwLmN1c3RvbVdpZHRoID0gMTtcblx0ZWxzZSBpZihjb2wud3B4ICE9IG51bGwpIHdjaCA9IHB4MmNoYXIoY29sLndweCk7XG5cdGVsc2UgaWYoY29sLndjaCAhPSBudWxsKSB3Y2ggPSBjb2wud2NoO1xuXHRpZih3Y2ggPiAtMSkgeyBwLndpZHRoID0gY2hhcjJ3aWR0aCh3Y2gpOyBwLmN1c3RvbVdpZHRoID0gMTsgfVxuXHRlbHNlIGlmKGNvbC53aWR0aCAhPSBudWxsKSBwLndpZHRoID0gY29sLndpZHRoO1xuXHRpZihjb2wuaGlkZGVuKSBwLmhpZGRlbiA9IHRydWU7XG5cdHJldHVybiBwO1xufVxuXG5mdW5jdGlvbiBkZWZhdWx0X21hcmdpbnMobWFyZ2lucywgbW9kZSkge1xuXHRpZighbWFyZ2lucykgcmV0dXJuO1xuXHR2YXIgZGVmcyA9IFswLjcsIDAuNywgMC43NSwgMC43NSwgMC4zLCAwLjNdO1xuXHRpZihtb2RlID09ICd4bG1sJykgZGVmcyA9IFsxLCAxLCAxLCAxLCAwLjUsIDAuNV07XG5cdGlmKG1hcmdpbnMubGVmdCAgID09IG51bGwpIG1hcmdpbnMubGVmdCAgID0gZGVmc1swXTtcblx0aWYobWFyZ2lucy5yaWdodCAgPT0gbnVsbCkgbWFyZ2lucy5yaWdodCAgPSBkZWZzWzFdO1xuXHRpZihtYXJnaW5zLnRvcCAgICA9PSBudWxsKSBtYXJnaW5zLnRvcCAgICA9IGRlZnNbMl07XG5cdGlmKG1hcmdpbnMuYm90dG9tID09IG51bGwpIG1hcmdpbnMuYm90dG9tID0gZGVmc1szXTtcblx0aWYobWFyZ2lucy5oZWFkZXIgPT0gbnVsbCkgbWFyZ2lucy5oZWFkZXIgPSBkZWZzWzRdO1xuXHRpZihtYXJnaW5zLmZvb3RlciA9PSBudWxsKSBtYXJnaW5zLmZvb3RlciA9IGRlZnNbNV07XG59XG5cbmZ1bmN0aW9uIGdldF9jZWxsX3N0eWxlKHN0eWxlcywgY2VsbCwgb3B0cykge1xuXHR2YXIgeiA9IG9wdHMucmV2c3NmW2NlbGwueiAhPSBudWxsID8gY2VsbC56IDogXCJHZW5lcmFsXCJdO1xuXHR2YXIgaSA9IDB4M2MsIGxlbiA9IHN0eWxlcy5sZW5ndGg7XG5cdGlmKHogPT0gbnVsbCAmJiBvcHRzLnNzZikge1xuXHRcdGZvcig7IGkgPCAweDE4ODsgKytpKSBpZihvcHRzLnNzZltpXSA9PSBudWxsKSB7XG5cdFx0XHRTU0YubG9hZChjZWxsLnosIGkpO1xuXHRcdFx0Ly8gJEZsb3dJZ25vcmVcblx0XHRcdG9wdHMuc3NmW2ldID0gY2VsbC56O1xuXHRcdFx0b3B0cy5yZXZzc2ZbY2VsbC56XSA9IHogPSBpO1xuXHRcdFx0YnJlYWs7XG5cdFx0fVxuXHR9XG5cdGZvcihpID0gMDsgaSAhPSBsZW47ICsraSkgaWYoc3R5bGVzW2ldLm51bUZtdElkID09PSB6KSByZXR1cm4gaTtcblx0c3R5bGVzW2xlbl0gPSB7XG5cdFx0bnVtRm10SWQ6eixcblx0XHRmb250SWQ6MCxcblx0XHRmaWxsSWQ6MCxcblx0XHRib3JkZXJJZDowLFxuXHRcdHhmSWQ6MCxcblx0XHRhcHBseU51bWJlckZvcm1hdDoxXG5cdH07XG5cdHJldHVybiBsZW47XG59XG5cbmZ1bmN0aW9uIHNhZmVfZm9ybWF0KHAsIGZtdGlkLCBmaWxsaWQsIG9wdHMsIHRoZW1lcywgc3R5bGVzKSB7XG5cdHRyeSB7XG5cdFx0aWYob3B0cy5jZWxsTkYpIHAueiA9IFNTRi5fdGFibGVbZm10aWRdO1xuXHR9IGNhdGNoKGUpIHsgaWYob3B0cy5XVEYpIHRocm93IGU7IH1cblx0aWYocC50ID09PSAneicpIHJldHVybjtcblx0aWYocC50ID09PSAnZCcgJiYgdHlwZW9mIHAudiA9PT0gJ3N0cmluZycpIHAudiA9IHBhcnNlRGF0ZShwLnYpO1xuXHRpZighb3B0cyB8fCBvcHRzLmNlbGxUZXh0ICE9PSBmYWxzZSkgdHJ5IHtcblx0XHRpZihTU0YuX3RhYmxlW2ZtdGlkXSA9PSBudWxsKSBTU0YubG9hZChTU0ZJbXBsaWNpdFtmbXRpZF0gfHwgXCJHZW5lcmFsXCIsIGZtdGlkKTtcblx0XHRpZihwLnQgPT09ICdlJykgcC53ID0gcC53IHx8IEJFcnJbcC52XTtcblx0XHRlbHNlIGlmKGZtdGlkID09PSAwKSB7XG5cdFx0XHRpZihwLnQgPT09ICduJykge1xuXHRcdFx0XHRpZigocC52fDApID09PSBwLnYpIHAudyA9IFNTRi5fZ2VuZXJhbF9pbnQocC52KTtcblx0XHRcdFx0ZWxzZSBwLncgPSBTU0YuX2dlbmVyYWxfbnVtKHAudik7XG5cdFx0XHR9XG5cdFx0XHRlbHNlIGlmKHAudCA9PT0gJ2QnKSB7XG5cdFx0XHRcdHZhciBkZCA9IGRhdGVudW0ocC52KTtcblx0XHRcdFx0aWYoKGRkfDApID09PSBkZCkgcC53ID0gU1NGLl9nZW5lcmFsX2ludChkZCk7XG5cdFx0XHRcdGVsc2UgcC53ID0gU1NGLl9nZW5lcmFsX251bShkZCk7XG5cdFx0XHR9XG5cdFx0XHRlbHNlIGlmKHAudiA9PT0gdW5kZWZpbmVkKSByZXR1cm4gXCJcIjtcblx0XHRcdGVsc2UgcC53ID0gU1NGLl9nZW5lcmFsKHAudixfc3Nmb3B0cyk7XG5cdFx0fVxuXHRcdGVsc2UgaWYocC50ID09PSAnZCcpIHAudyA9IFNTRi5mb3JtYXQoZm10aWQsZGF0ZW51bShwLnYpLF9zc2ZvcHRzKTtcblx0XHRlbHNlIHAudyA9IFNTRi5mb3JtYXQoZm10aWQscC52LF9zc2ZvcHRzKTtcblx0fSBjYXRjaChlKSB7IGlmKG9wdHMuV1RGKSB0aHJvdyBlOyB9XG5cdGlmKCFvcHRzLmNlbGxTdHlsZXMpIHJldHVybjtcblx0aWYoZmlsbGlkICE9IG51bGwpIHRyeSB7XG5cdFx0cC5zID0gc3R5bGVzLkZpbGxzW2ZpbGxpZF07XG5cdFx0aWYgKHAucy5mZ0NvbG9yICYmIHAucy5mZ0NvbG9yLnRoZW1lICYmICFwLnMuZmdDb2xvci5yZ2IpIHtcblx0XHRcdHAucy5mZ0NvbG9yLnJnYiA9IHJnYl90aW50KHRoZW1lcy50aGVtZUVsZW1lbnRzLmNsclNjaGVtZVtwLnMuZmdDb2xvci50aGVtZV0ucmdiLCBwLnMuZmdDb2xvci50aW50IHx8IDApO1xuXHRcdFx0aWYob3B0cy5XVEYpIHAucy5mZ0NvbG9yLnJhd19yZ2IgPSB0aGVtZXMudGhlbWVFbGVtZW50cy5jbHJTY2hlbWVbcC5zLmZnQ29sb3IudGhlbWVdLnJnYjtcblx0XHR9XG5cdFx0aWYgKHAucy5iZ0NvbG9yICYmIHAucy5iZ0NvbG9yLnRoZW1lKSB7XG5cdFx0XHRwLnMuYmdDb2xvci5yZ2IgPSByZ2JfdGludCh0aGVtZXMudGhlbWVFbGVtZW50cy5jbHJTY2hlbWVbcC5zLmJnQ29sb3IudGhlbWVdLnJnYiwgcC5zLmJnQ29sb3IudGludCB8fCAwKTtcblx0XHRcdGlmKG9wdHMuV1RGKSBwLnMuYmdDb2xvci5yYXdfcmdiID0gdGhlbWVzLnRoZW1lRWxlbWVudHMuY2xyU2NoZW1lW3Aucy5iZ0NvbG9yLnRoZW1lXS5yZ2I7XG5cdFx0fVxuXHR9IGNhdGNoKGUpIHsgaWYob3B0cy5XVEYgJiYgc3R5bGVzLkZpbGxzKSB0aHJvdyBlOyB9XG59XG5cbmZ1bmN0aW9uIGNoZWNrX3dzKHdzLCBzbmFtZSwgaSkge1xuXHRpZih3cyAmJiB3c1snIXJlZiddKSB7XG5cdFx0dmFyIHJhbmdlID0gc2FmZV9kZWNvZGVfcmFuZ2Uod3NbJyFyZWYnXSk7XG5cdFx0aWYocmFuZ2UuZS5jIDwgcmFuZ2Uucy5jIHx8IHJhbmdlLmUuciA8IHJhbmdlLnMucikgdGhyb3cgbmV3IEVycm9yKFwiQmFkIHJhbmdlIChcIiArIGkgKyBcIik6IFwiICsgd3NbJyFyZWYnXSk7XG5cdH1cbn1cbmZ1bmN0aW9uIHBhcnNlX3dzX3htbF9kaW0od3MsIHMpIHtcblx0dmFyIGQgPSBzYWZlX2RlY29kZV9yYW5nZShzKTtcblx0aWYoZC5zLnI8PWQuZS5yICYmIGQucy5jPD1kLmUuYyAmJiBkLnMucj49MCAmJiBkLnMuYz49MCkgd3NbXCIhcmVmXCJdID0gZW5jb2RlX3JhbmdlKGQpO1xufVxudmFyIG1lcmdlY3JlZ2V4ID0gLzwoPzpcXHc6KT9tZXJnZUNlbGwgcmVmPVwiW0EtWjAtOTpdK1wiXFxzKltcXC9dPz4vZztcbnZhciBzaGVldGRhdGFyZWdleCA9IC88KD86XFx3KzopP3NoZWV0RGF0YVtePl0qPihbXFxzXFxTXSopPFxcLyg/Olxcdys6KT9zaGVldERhdGE+LztcbnZhciBobGlua3JlZ2V4ID0gLzwoPzpcXHc6KT9oeXBlcmxpbmsgW14+XSo+L21nO1xudmFyIGRpbXJlZ2V4ID0gL1wiKFxcdyo6XFx3KilcIi87XG52YXIgY29scmVnZXggPSAvPCg/OlxcdzopP2NvbFxcYltePl0qW1xcL10/Pi9nO1xudmFyIGFmcmVnZXggPSAvPCg/OlxcdzopP2F1dG9GaWx0ZXJbXj5dKihbXFwvXXw+KFtcXHNcXFNdKik8XFwvKD86XFx3Oik/YXV0b0ZpbHRlcik+L2c7XG52YXIgbWFyZ2lucmVnZXg9IC88KD86XFx3Oik/cGFnZU1hcmdpbnNbXj5dKlxcLz4vZztcbnZhciBzaGVldHBycmVnZXggPSAvPCg/OlxcdzopP3NoZWV0UHJcXGIoPzpbXj5hLXpdW14+XSopP1xcLz4vO1xudmFyIHN2c3JlZ2V4ID0gLzwoPzpcXHc6KT9zaGVldFZpZXdzW14+XSooPzpbXFwvXXw+KFtcXHNcXFNdKik8XFwvKD86XFx3Oik/c2hlZXRWaWV3cyk+LztcblxuLyogMTguMyBXb3Jrc2hlZXRzICovXG5mdW5jdGlvbiBwYXJzZV93c194bWwoZGF0YSwgb3B0cywgaWR4LCByZWxzLCB3YiwgdGhlbWVzLCBzdHlsZXMpIHtcblx0aWYoIWRhdGEpIHJldHVybiBkYXRhO1xuXHRpZighcmVscykgcmVscyA9IHsnIWlkJzp7fX07XG5cdGlmKERFTlNFICE9IG51bGwgJiYgb3B0cy5kZW5zZSA9PSBudWxsKSBvcHRzLmRlbnNlID0gREVOU0U7XG5cblx0LyogMTguMy4xLjk5IHdvcmtzaGVldCBDVF9Xb3Jrc2hlZXQgKi9cblx0dmFyIHMgPSBvcHRzLmRlbnNlID8gKFtdKSA6ICh7fSk7XG5cdHZhciByZWZndWVzcyA9ICh7czoge3I6MjAwMDAwMCwgYzoyMDAwMDAwfSwgZToge3I6MCwgYzowfSB9KTtcblxuXHR2YXIgZGF0YTEgPSBcIlwiLCBkYXRhMiA9IFwiXCI7XG5cdHZhciBtdGNoID0gZGF0YS5tYXRjaChzaGVldGRhdGFyZWdleCk7XG5cdGlmKG10Y2gpIHtcblx0XHRkYXRhMSA9IGRhdGEuc2xpY2UoMCwgbXRjaC5pbmRleCk7XG5cdFx0ZGF0YTIgPSBkYXRhLnNsaWNlKG10Y2guaW5kZXggKyBtdGNoWzBdLmxlbmd0aCk7XG5cdH0gZWxzZSBkYXRhMSA9IGRhdGEyID0gZGF0YTtcblxuXHQvKiAxOC4zLjEuODIgc2hlZXRQciBDVF9TaGVldFByICovXG5cdHZhciBzaGVldFByID0gZGF0YTEubWF0Y2goc2hlZXRwcnJlZ2V4KTtcblx0aWYoc2hlZXRQcikgcGFyc2Vfd3NfeG1sX3NoZWV0cHIoc2hlZXRQclswXSwgcywgd2IsIGlkeCk7XG5cblx0LyogMTguMy4xLjM1IGRpbWVuc2lvbiBDVF9TaGVldERpbWVuc2lvbiAqL1xuXHR2YXIgcmlkeCA9IChkYXRhMS5tYXRjaCgvPCg/Olxcdyo6KT9kaW1lbnNpb24vKXx8e2luZGV4Oi0xfSkuaW5kZXg7XG5cdGlmKHJpZHggPiAwKSB7XG5cdFx0dmFyIHJlZiA9IGRhdGExLnNsaWNlKHJpZHgscmlkeCs1MCkubWF0Y2goZGltcmVnZXgpO1xuXHRcdGlmKHJlZikgcGFyc2Vfd3NfeG1sX2RpbShzLCByZWZbMV0pO1xuXHR9XG5cblx0LyogMTguMy4xLjg4IHNoZWV0Vmlld3MgQ1RfU2hlZXRWaWV3cyAqL1xuXHR2YXIgc3ZzID0gZGF0YTEubWF0Y2goc3ZzcmVnZXgpO1xuXHRpZihzdnMgJiYgc3ZzWzFdKSBwYXJzZV93c194bWxfc2hlZXR2aWV3cyhzdnNbMV0sIHdiKTtcblxuXHQvKiAxOC4zLjEuMTcgY29scyBDVF9Db2xzICovXG5cdHZhciBjb2x1bW5zID0gW107XG5cdGlmKG9wdHMuY2VsbFN0eWxlcykge1xuXHRcdC8qIDE4LjMuMS4xMyBjb2wgQ1RfQ29sICovXG5cdFx0dmFyIGNvbHMgPSBkYXRhMS5tYXRjaChjb2xyZWdleCk7XG5cdFx0aWYoY29scykgcGFyc2Vfd3NfeG1sX2NvbHMoY29sdW1ucywgY29scyk7XG5cdH1cblxuXHQvKiAxOC4zLjEuODAgc2hlZXREYXRhIENUX1NoZWV0RGF0YSA/ICovXG5cdGlmKG10Y2gpIHBhcnNlX3dzX3htbF9kYXRhKG10Y2hbMV0sIHMsIG9wdHMsIHJlZmd1ZXNzLCB0aGVtZXMsIHN0eWxlcyk7XG5cblx0LyogMTguMy4xLjIgIGF1dG9GaWx0ZXIgQ1RfQXV0b0ZpbHRlciAqL1xuXHR2YXIgYWZpbHRlciA9IGRhdGEyLm1hdGNoKGFmcmVnZXgpO1xuXHRpZihhZmlsdGVyKSBzWychYXV0b2ZpbHRlciddID0gcGFyc2Vfd3NfeG1sX2F1dG9maWx0ZXIoYWZpbHRlclswXSk7XG5cblx0LyogMTguMy4xLjU1IG1lcmdlQ2VsbHMgQ1RfTWVyZ2VDZWxscyAqL1xuXHR2YXIgbWVyZ2VzID0gW107XG5cdHZhciBfbWVyZ2UgPSBkYXRhMi5tYXRjaChtZXJnZWNyZWdleCk7XG5cdGlmKF9tZXJnZSkgZm9yKHJpZHggPSAwOyByaWR4ICE9IF9tZXJnZS5sZW5ndGg7ICsrcmlkeClcblx0XHRtZXJnZXNbcmlkeF0gPSBzYWZlX2RlY29kZV9yYW5nZShfbWVyZ2VbcmlkeF0uc2xpY2UoX21lcmdlW3JpZHhdLmluZGV4T2YoXCJcXFwiXCIpKzEpKTtcblxuXHQvKiAxOC4zLjEuNDggaHlwZXJsaW5rcyBDVF9IeXBlcmxpbmtzICovXG5cdHZhciBobGluayA9IGRhdGEyLm1hdGNoKGhsaW5rcmVnZXgpO1xuXHRpZihobGluaykgcGFyc2Vfd3NfeG1sX2hsaW5rcyhzLCBobGluaywgcmVscyk7XG5cblx0LyogMTguMy4xLjYyIHBhZ2VNYXJnaW5zIENUX1BhZ2VNYXJnaW5zICovXG5cdHZhciBtYXJnaW5zID0gZGF0YTIubWF0Y2gobWFyZ2lucmVnZXgpO1xuXHRpZihtYXJnaW5zKSBzWychbWFyZ2lucyddID0gcGFyc2Vfd3NfeG1sX21hcmdpbnMocGFyc2V4bWx0YWcobWFyZ2luc1swXSkpO1xuXG5cdGlmKCFzW1wiIXJlZlwiXSAmJiByZWZndWVzcy5lLmMgPj0gcmVmZ3Vlc3Mucy5jICYmIHJlZmd1ZXNzLmUuciA+PSByZWZndWVzcy5zLnIpIHNbXCIhcmVmXCJdID0gZW5jb2RlX3JhbmdlKHJlZmd1ZXNzKTtcblx0aWYob3B0cy5zaGVldFJvd3MgPiAwICYmIHNbXCIhcmVmXCJdKSB7XG5cdFx0dmFyIHRtcHJlZiA9IHNhZmVfZGVjb2RlX3JhbmdlKHNbXCIhcmVmXCJdKTtcblx0XHRpZihvcHRzLnNoZWV0Um93cyA8PSArdG1wcmVmLmUucikge1xuXHRcdFx0dG1wcmVmLmUuciA9IG9wdHMuc2hlZXRSb3dzIC0gMTtcblx0XHRcdGlmKHRtcHJlZi5lLnIgPiByZWZndWVzcy5lLnIpIHRtcHJlZi5lLnIgPSByZWZndWVzcy5lLnI7XG5cdFx0XHRpZih0bXByZWYuZS5yIDwgdG1wcmVmLnMucikgdG1wcmVmLnMuciA9IHRtcHJlZi5lLnI7XG5cdFx0XHRpZih0bXByZWYuZS5jID4gcmVmZ3Vlc3MuZS5jKSB0bXByZWYuZS5jID0gcmVmZ3Vlc3MuZS5jO1xuXHRcdFx0aWYodG1wcmVmLmUuYyA8IHRtcHJlZi5zLmMpIHRtcHJlZi5zLmMgPSB0bXByZWYuZS5jO1xuXHRcdFx0c1tcIiFmdWxscmVmXCJdID0gc1tcIiFyZWZcIl07XG5cdFx0XHRzW1wiIXJlZlwiXSA9IGVuY29kZV9yYW5nZSh0bXByZWYpO1xuXHRcdH1cblx0fVxuXHRpZihjb2x1bW5zLmxlbmd0aCA+IDApIHNbXCIhY29sc1wiXSA9IGNvbHVtbnM7XG5cdGlmKG1lcmdlcy5sZW5ndGggPiAwKSBzW1wiIW1lcmdlc1wiXSA9IG1lcmdlcztcblx0cmV0dXJuIHM7XG59XG5cbmZ1bmN0aW9uIHdyaXRlX3dzX3htbF9tZXJnZXMobWVyZ2VzKSB7XG5cdGlmKG1lcmdlcy5sZW5ndGggPT09IDApIHJldHVybiBcIlwiO1xuXHR2YXIgbyA9ICc8bWVyZ2VDZWxscyBjb3VudD1cIicgKyBtZXJnZXMubGVuZ3RoICsgJ1wiPic7XG5cdGZvcih2YXIgaSA9IDA7IGkgIT0gbWVyZ2VzLmxlbmd0aDsgKytpKSBvICs9ICc8bWVyZ2VDZWxsIHJlZj1cIicgKyBlbmNvZGVfcmFuZ2UobWVyZ2VzW2ldKSArICdcIi8+Jztcblx0cmV0dXJuIG8gKyAnPC9tZXJnZUNlbGxzPic7XG59XG5cbi8qIDE4LjMuMS44Mi0zIHNoZWV0UHIgQ1RfQ2hhcnRzaGVldFByIC8gQ1RfU2hlZXRQciAqL1xuZnVuY3Rpb24gcGFyc2Vfd3NfeG1sX3NoZWV0cHIoc2hlZXRQciwgcywgd2IsIGlkeCkge1xuXHR2YXIgZGF0YSA9IHBhcnNleG1sdGFnKHNoZWV0UHIpO1xuXHRpZighd2IuU2hlZXRzW2lkeF0pIHdiLlNoZWV0c1tpZHhdID0ge307XG5cdGlmKGRhdGEuY29kZU5hbWUpIHdiLlNoZWV0c1tpZHhdLkNvZGVOYW1lID0gdW5lc2NhcGV4bWwodXRmOHJlYWQoZGF0YS5jb2RlTmFtZSkpO1xufVxuZnVuY3Rpb24gd3JpdGVfd3NfeG1sX3NoZWV0cHIod3MsIHdiLCBpZHgsIG9wdHMsIG8pIHtcblx0dmFyIG5lZWRlZCA9IGZhbHNlO1xuXHR2YXIgcHJvcHMgPSB7fSwgcGF5bG9hZCA9IG51bGw7XG5cdGlmKG9wdHMuYm9va1R5cGUgIT09ICd4bHN4JyAmJiB3Yi52YmFyYXcpIHtcblx0XHR2YXIgY25hbWUgPSB3Yi5TaGVldE5hbWVzW2lkeF07XG5cdFx0dHJ5IHsgaWYod2IuV29ya2Jvb2spIGNuYW1lID0gd2IuV29ya2Jvb2suU2hlZXRzW2lkeF0uQ29kZU5hbWUgfHwgY25hbWU7IH0gY2F0Y2goZSkge31cblx0XHRuZWVkZWQgPSB0cnVlO1xuXHRcdHByb3BzLmNvZGVOYW1lID0gdXRmOHdyaXRlKGVzY2FwZXhtbChjbmFtZSkpO1xuXHR9XG5cblx0aWYod3MgJiYgd3NbXCIhb3V0bGluZVwiXSkge1xuXHRcdHZhciBvdXRsaW5lcHJvcHMgPSB7c3VtbWFyeUJlbG93OjEsIHN1bW1hcnlSaWdodDoxfTtcblx0XHRpZih3c1tcIiFvdXRsaW5lXCJdLmFib3ZlKSBvdXRsaW5lcHJvcHMuc3VtbWFyeUJlbG93ID0gMDtcblx0XHRpZih3c1tcIiFvdXRsaW5lXCJdLmxlZnQpIG91dGxpbmVwcm9wcy5zdW1tYXJ5UmlnaHQgPSAwO1xuXHRcdHBheWxvYWQgPSAocGF5bG9hZHx8XCJcIikgKyB3cml0ZXh0YWcoJ291dGxpbmVQcicsIG51bGwsIG91dGxpbmVwcm9wcyk7XG5cdH1cblxuXHRpZighbmVlZGVkICYmICFwYXlsb2FkKSByZXR1cm47XG5cdG9bby5sZW5ndGhdID0gKHdyaXRleHRhZygnc2hlZXRQcicsIHBheWxvYWQsIHByb3BzKSk7XG59XG5cbi8qIDE4LjMuMS44NSBzaGVldFByb3RlY3Rpb24gQ1RfU2hlZXRQcm90ZWN0aW9uICovXG52YXIgc2hlZXRwcm90X2RlZmZhbHNlID0gW1wib2JqZWN0c1wiLCBcInNjZW5hcmlvc1wiLCBcInNlbGVjdExvY2tlZENlbGxzXCIsIFwic2VsZWN0VW5sb2NrZWRDZWxsc1wiXTtcbnZhciBzaGVldHByb3RfZGVmdHJ1ZSA9IFtcblx0XCJmb3JtYXRDb2x1bW5zXCIsIFwiZm9ybWF0Um93c1wiLCBcImZvcm1hdENlbGxzXCIsXG5cdFwiaW5zZXJ0Q29sdW1uc1wiLCBcImluc2VydFJvd3NcIiwgXCJpbnNlcnRIeXBlcmxpbmtzXCIsXG5cdFwiZGVsZXRlQ29sdW1uc1wiLCBcImRlbGV0ZVJvd3NcIixcblx0XCJzb3J0XCIsIFwiYXV0b0ZpbHRlclwiLCBcInBpdm90VGFibGVzXCJcbl07XG5mdW5jdGlvbiB3cml0ZV93c194bWxfcHJvdGVjdGlvbihzcCkge1xuXHQvLyBhbGdvcml0aG1OYW1lLCBoYXNoVmFsdWUsIHNhbHRWYWx1ZSwgc3BpbkNvdW50XG5cdHZhciBvID0gKHtzaGVldDoxfSk7XG5cdHNoZWV0cHJvdF9kZWZmYWxzZS5mb3JFYWNoKGZ1bmN0aW9uKG4pIHsgaWYoc3Bbbl0gIT0gbnVsbCAmJiBzcFtuXSkgb1tuXSA9IFwiMVwiOyB9KTtcblx0c2hlZXRwcm90X2RlZnRydWUuZm9yRWFjaChmdW5jdGlvbihuKSB7IGlmKHNwW25dICE9IG51bGwgJiYgIXNwW25dKSBvW25dID0gXCIwXCI7IH0pO1xuXHQvKiBUT0RPOiBhbGdvcml0aG0gKi9cblx0aWYoc3AucGFzc3dvcmQpIG8ucGFzc3dvcmQgPSBjcnlwdG9fQ3JlYXRlUGFzc3dvcmRWZXJpZmllcl9NZXRob2QxKHNwLnBhc3N3b3JkKS50b1N0cmluZygxNikudG9VcHBlckNhc2UoKTtcblx0cmV0dXJuIHdyaXRleHRhZygnc2hlZXRQcm90ZWN0aW9uJywgbnVsbCwgbyk7XG59XG5cbmZ1bmN0aW9uIHBhcnNlX3dzX3htbF9obGlua3MocywgZGF0YSwgcmVscykge1xuXHR2YXIgZGVuc2UgPSBBcnJheS5pc0FycmF5KHMpO1xuXHRmb3IodmFyIGkgPSAwOyBpICE9IGRhdGEubGVuZ3RoOyArK2kpIHtcblx0XHR2YXIgdmFsID0gcGFyc2V4bWx0YWcodXRmOHJlYWQoZGF0YVtpXSksIHRydWUpO1xuXHRcdGlmKCF2YWwucmVmKSByZXR1cm47XG5cdFx0dmFyIHJlbCA9ICgocmVscyB8fCB7fSlbJyFpZCddfHxbXSlbdmFsLmlkXTtcblx0XHRpZihyZWwpIHtcblx0XHRcdHZhbC5UYXJnZXQgPSByZWwuVGFyZ2V0O1xuXHRcdFx0aWYodmFsLmxvY2F0aW9uKSB2YWwuVGFyZ2V0ICs9IFwiI1wiK3ZhbC5sb2NhdGlvbjtcblx0XHR9IGVsc2Uge1xuXHRcdFx0dmFsLlRhcmdldCA9IFwiI1wiICsgdmFsLmxvY2F0aW9uO1xuXHRcdFx0cmVsID0ge1RhcmdldDogdmFsLlRhcmdldCwgVGFyZ2V0TW9kZTogJ0ludGVybmFsJ307XG5cdFx0fVxuXHRcdHZhbC5SZWwgPSByZWw7XG5cdFx0aWYodmFsLnRvb2x0aXApIHsgdmFsLlRvb2x0aXAgPSB2YWwudG9vbHRpcDsgZGVsZXRlIHZhbC50b29sdGlwOyB9XG5cdFx0dmFyIHJuZyA9IHNhZmVfZGVjb2RlX3JhbmdlKHZhbC5yZWYpO1xuXHRcdGZvcih2YXIgUj1ybmcucy5yO1I8PXJuZy5lLnI7KytSKSBmb3IodmFyIEM9cm5nLnMuYztDPD1ybmcuZS5jOysrQykge1xuXHRcdFx0dmFyIGFkZHIgPSBlbmNvZGVfY2VsbCh7YzpDLHI6Un0pO1xuXHRcdFx0aWYoZGVuc2UpIHtcblx0XHRcdFx0aWYoIXNbUl0pIHNbUl0gPSBbXTtcblx0XHRcdFx0aWYoIXNbUl1bQ10pIHNbUl1bQ10gPSB7dDpcInpcIix2OnVuZGVmaW5lZH07XG5cdFx0XHRcdHNbUl1bQ10ubCA9IHZhbDtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdGlmKCFzW2FkZHJdKSBzW2FkZHJdID0ge3Q6XCJ6XCIsdjp1bmRlZmluZWR9O1xuXHRcdFx0XHRzW2FkZHJdLmwgPSB2YWw7XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG59XG5cbmZ1bmN0aW9uIHBhcnNlX3dzX3htbF9tYXJnaW5zKG1hcmdpbikge1xuXHR2YXIgbyA9IHt9O1xuXHRbXCJsZWZ0XCIsIFwicmlnaHRcIiwgXCJ0b3BcIiwgXCJib3R0b21cIiwgXCJoZWFkZXJcIiwgXCJmb290ZXJcIl0uZm9yRWFjaChmdW5jdGlvbihrKSB7XG5cdFx0aWYobWFyZ2luW2tdKSBvW2tdID0gcGFyc2VGbG9hdChtYXJnaW5ba10pO1xuXHR9KTtcblx0cmV0dXJuIG87XG59XG5mdW5jdGlvbiB3cml0ZV93c194bWxfbWFyZ2lucyhtYXJnaW4pIHtcblx0ZGVmYXVsdF9tYXJnaW5zKG1hcmdpbik7XG5cdHJldHVybiB3cml0ZXh0YWcoJ3BhZ2VNYXJnaW5zJywgbnVsbCwgbWFyZ2luKTtcbn1cblxuZnVuY3Rpb24gcGFyc2Vfd3NfeG1sX2NvbHMoY29sdW1ucywgY29scykge1xuXHR2YXIgc2VlbmNvbCA9IGZhbHNlO1xuXHRmb3IodmFyIGNvbGkgPSAwOyBjb2xpICE9IGNvbHMubGVuZ3RoOyArK2NvbGkpIHtcblx0XHR2YXIgY29sbCA9IHBhcnNleG1sdGFnKGNvbHNbY29saV0sIHRydWUpO1xuXHRcdGlmKGNvbGwuaGlkZGVuKSBjb2xsLmhpZGRlbiA9IHBhcnNleG1sYm9vbChjb2xsLmhpZGRlbik7XG5cdFx0dmFyIGNvbG09cGFyc2VJbnQoY29sbC5taW4sIDEwKS0xLCBjb2xNPXBhcnNlSW50KGNvbGwubWF4LDEwKS0xO1xuXHRcdGRlbGV0ZSBjb2xsLm1pbjsgZGVsZXRlIGNvbGwubWF4OyBjb2xsLndpZHRoID0gK2NvbGwud2lkdGg7XG5cdFx0aWYoIXNlZW5jb2wgJiYgY29sbC53aWR0aCkgeyBzZWVuY29sID0gdHJ1ZTsgZmluZF9tZHdfY29sdyhjb2xsLndpZHRoKTsgfVxuXHRcdHByb2Nlc3NfY29sKGNvbGwpO1xuXHRcdHdoaWxlKGNvbG0gPD0gY29sTSkgY29sdW1uc1tjb2xtKytdID0gZHVwKGNvbGwpO1xuXHR9XG59XG5mdW5jdGlvbiB3cml0ZV93c194bWxfY29scyh3cywgY29scykge1xuXHR2YXIgbyA9IFtcIjxjb2xzPlwiXSwgY29sO1xuXHRmb3IodmFyIGkgPSAwOyBpICE9IGNvbHMubGVuZ3RoOyArK2kpIHtcblx0XHRpZighKGNvbCA9IGNvbHNbaV0pKSBjb250aW51ZTtcblx0XHRvW28ubGVuZ3RoXSA9ICh3cml0ZXh0YWcoJ2NvbCcsIG51bGwsIGNvbF9vYmpfdyhpLCBjb2wpKSk7XG5cdH1cblx0b1tvLmxlbmd0aF0gPSBcIjwvY29scz5cIjtcblx0cmV0dXJuIG8uam9pbihcIlwiKTtcbn1cblxuZnVuY3Rpb24gcGFyc2Vfd3NfeG1sX2F1dG9maWx0ZXIoZGF0YSkge1xuXHR2YXIgbyA9IHsgcmVmOiAoZGF0YS5tYXRjaCgvcmVmPVwiKFteXCJdKilcIi8pfHxbXSlbMV19O1xuXHRyZXR1cm4gbztcbn1cbmZ1bmN0aW9uIHdyaXRlX3dzX3htbF9hdXRvZmlsdGVyKGRhdGEsIHdzLCB3YiwgaWR4KSB7XG5cdHZhciByZWYgPSB0eXBlb2YgZGF0YS5yZWYgPT0gXCJzdHJpbmdcIiA/IGRhdGEucmVmIDogZW5jb2RlX3JhbmdlKGRhdGEucmVmKTtcblx0aWYoIXdiLldvcmtib29rKSB3Yi5Xb3JrYm9vayA9ICh7U2hlZXRzOltdfSk7XG5cdGlmKCF3Yi5Xb3JrYm9vay5OYW1lcykgd2IuV29ya2Jvb2suTmFtZXMgPSBbXTtcblx0dmFyIG5hbWVzID0gd2IuV29ya2Jvb2suTmFtZXM7XG5cdHZhciByYW5nZSA9IGRlY29kZV9yYW5nZShyZWYpO1xuXHRpZihyYW5nZS5zLnIgPT0gcmFuZ2UuZS5yKSB7IHJhbmdlLmUuciA9IGRlY29kZV9yYW5nZSh3c1tcIiFyZWZcIl0pLmUucjsgcmVmID0gZW5jb2RlX3JhbmdlKHJhbmdlKTsgfVxuXHRmb3IodmFyIGkgPSAwOyBpIDwgbmFtZXMubGVuZ3RoOyArK2kpIHtcblx0XHR2YXIgbmFtZSA9IG5hbWVzW2ldO1xuXHRcdGlmKG5hbWUuTmFtZSAhPSAnX3hsbm0uX0ZpbHRlckRhdGFiYXNlJykgY29udGludWU7XG5cdFx0aWYobmFtZS5TaGVldCAhPSBpZHgpIGNvbnRpbnVlO1xuXHRcdG5hbWUuUmVmID0gXCInXCIgKyB3Yi5TaGVldE5hbWVzW2lkeF0gKyBcIichXCIgKyByZWY7IGJyZWFrO1xuXHR9XG5cdGlmKGkgPT0gbmFtZXMubGVuZ3RoKSBuYW1lcy5wdXNoKHsgTmFtZTogJ194bG5tLl9GaWx0ZXJEYXRhYmFzZScsIFNoZWV0OiBpZHgsIFJlZjogXCInXCIgKyB3Yi5TaGVldE5hbWVzW2lkeF0gKyBcIichXCIgKyByZWYgIH0pO1xuXHRyZXR1cm4gd3JpdGV4dGFnKFwiYXV0b0ZpbHRlclwiLCBudWxsLCB7cmVmOnJlZn0pO1xufVxuXG4vKiAxOC4zLjEuODggc2hlZXRWaWV3cyBDVF9TaGVldFZpZXdzICovXG4vKiAxOC4zLjEuODcgc2hlZXRWaWV3IENUX1NoZWV0VmlldyAqL1xudmFyIHN2aWV3cmVnZXggPSAvPCg/OlxcdzopP3NoZWV0Vmlldyg/OltePmEtel1bXj5dKik/XFwvPz4vO1xuZnVuY3Rpb24gcGFyc2Vfd3NfeG1sX3NoZWV0dmlld3MoZGF0YSwgd2IpIHtcblx0aWYoIXdiLlZpZXdzKSB3Yi5WaWV3cyA9IFt7fV07XG5cdChkYXRhLm1hdGNoKHN2aWV3cmVnZXgpfHxbXSkuZm9yRWFjaChmdW5jdGlvbihyLCBpKSB7XG5cdFx0dmFyIHRhZyA9IHBhcnNleG1sdGFnKHIpO1xuXHRcdC8vICRGbG93SWdub3JlXG5cdFx0aWYoIXdiLlZpZXdzW2ldKSB3Yi5WaWV3c1tpXSA9IHt9O1xuXHRcdC8vICRGbG93SWdub3JlXG5cdFx0aWYoK3RhZy56b29tU2NhbGUpIHdiLlZpZXdzW2ldLnpvb20gPSArdGFnLnpvb21TY2FsZTtcblx0XHQvLyAkRmxvd0lnbm9yZVxuXHRcdGlmKHBhcnNleG1sYm9vbCh0YWcucmlnaHRUb0xlZnQpKSB3Yi5WaWV3c1tpXS5SVEwgPSB0cnVlO1xuXHR9KTtcbn1cbmZ1bmN0aW9uIHdyaXRlX3dzX3htbF9zaGVldHZpZXdzKHdzLCBvcHRzLCBpZHgsIHdiKSB7XG5cdHZhciBzdmlldyA9ICh7d29ya2Jvb2tWaWV3SWQ6XCIwXCJ9KTtcblx0Ly8gJEZsb3dJZ25vcmVcblx0aWYoKCgod2J8fHt9KS5Xb3JrYm9va3x8e30pLlZpZXdzfHxbXSlbMF0pIHN2aWV3LnJpZ2h0VG9MZWZ0ID0gd2IuV29ya2Jvb2suVmlld3NbMF0uUlRMID8gXCIxXCIgOiBcIjBcIjtcblx0cmV0dXJuIHdyaXRleHRhZyhcInNoZWV0Vmlld3NcIiwgd3JpdGV4dGFnKFwic2hlZXRWaWV3XCIsIG51bGwsIHN2aWV3KSwge30pO1xufVxuXG5mdW5jdGlvbiB3cml0ZV93c194bWxfY2VsbChjZWxsLCByZWYsIHdzLCBvcHRzKSB7XG5cdGlmKGNlbGwudiA9PT0gdW5kZWZpbmVkICYmIHR5cGVvZiBjZWxsLmYgIT09IFwic3RyaW5nXCIgfHwgY2VsbC50ID09PSAneicpIHJldHVybiBcIlwiO1xuXHR2YXIgdnYgPSBcIlwiO1xuXHR2YXIgb2xkdCA9IGNlbGwudCwgb2xkdiA9IGNlbGwudjtcblx0aWYoY2VsbC50ICE9PSBcInpcIikgc3dpdGNoKGNlbGwudCkge1xuXHRcdGNhc2UgJ2InOiB2diA9IGNlbGwudiA/IFwiMVwiIDogXCIwXCI7IGJyZWFrO1xuXHRcdGNhc2UgJ24nOiB2diA9ICcnK2NlbGwudjsgYnJlYWs7XG5cdFx0Y2FzZSAnZSc6IHZ2ID0gQkVycltjZWxsLnZdOyBicmVhaztcblx0XHRjYXNlICdkJzpcblx0XHRcdGlmKG9wdHMgJiYgb3B0cy5jZWxsRGF0ZXMpIHZ2ID0gcGFyc2VEYXRlKGNlbGwudiwgLTEpLnRvSVNPU3RyaW5nKCk7XG5cdFx0XHRlbHNlIHtcblx0XHRcdFx0Y2VsbCA9IGR1cChjZWxsKTtcblx0XHRcdFx0Y2VsbC50ID0gJ24nO1xuXHRcdFx0XHR2diA9ICcnKyhjZWxsLnYgPSBkYXRlbnVtKHBhcnNlRGF0ZShjZWxsLnYpKSk7XG5cdFx0XHR9XG5cdFx0XHRpZih0eXBlb2YgY2VsbC56ID09PSAndW5kZWZpbmVkJykgY2VsbC56ID0gU1NGLl90YWJsZVsxNF07XG5cdFx0XHRicmVhaztcblx0XHRkZWZhdWx0OiB2diA9IGNlbGwudjsgYnJlYWs7XG5cdH1cblx0dmFyIHYgPSB3cml0ZXRhZygndicsIGVzY2FwZXhtbCh2dikpLCBvID0gKHtyOnJlZn0pO1xuXHQvKiBUT0RPOiBjZWxsIHN0eWxlICovXG5cdHZhciBvcyA9IGdldF9jZWxsX3N0eWxlKG9wdHMuY2VsbFhmcywgY2VsbCwgb3B0cyk7XG5cdGlmKG9zICE9PSAwKSBvLnMgPSBvcztcblx0c3dpdGNoKGNlbGwudCkge1xuXHRcdGNhc2UgJ24nOiBicmVhaztcblx0XHRjYXNlICdkJzogby50ID0gXCJkXCI7IGJyZWFrO1xuXHRcdGNhc2UgJ2InOiBvLnQgPSBcImJcIjsgYnJlYWs7XG5cdFx0Y2FzZSAnZSc6IG8udCA9IFwiZVwiOyBicmVhaztcblx0XHRjYXNlICd6JzogYnJlYWs7XG5cdFx0ZGVmYXVsdDogaWYoY2VsbC52ID09IG51bGwpIHsgZGVsZXRlIGNlbGwudDsgYnJlYWs7IH1cblx0XHRcdGlmKG9wdHMgJiYgb3B0cy5ib29rU1NUKSB7XG5cdFx0XHRcdHYgPSB3cml0ZXRhZygndicsICcnK2dldF9zc3RfaWQob3B0cy5TdHJpbmdzLCBjZWxsLnYsIG9wdHMucmV2U3RyaW5ncykpO1xuXHRcdFx0XHRvLnQgPSBcInNcIjsgYnJlYWs7XG5cdFx0XHR9XG5cdFx0XHRvLnQgPSBcInN0clwiOyBicmVhaztcblx0fVxuXHRpZihjZWxsLnQgIT0gb2xkdCkgeyBjZWxsLnQgPSBvbGR0OyBjZWxsLnYgPSBvbGR2OyB9XG5cdGlmKHR5cGVvZiBjZWxsLmYgPT0gXCJzdHJpbmdcIiAmJiBjZWxsLmYpIHtcblx0XHR2YXIgZmYgPSBjZWxsLkYgJiYgY2VsbC5GLnNsaWNlKDAsIHJlZi5sZW5ndGgpID09IHJlZiA/IHt0OlwiYXJyYXlcIiwgcmVmOmNlbGwuRn0gOiBudWxsO1xuXHRcdHYgPSB3cml0ZXh0YWcoJ2YnLCBlc2NhcGV4bWwoY2VsbC5mKSwgZmYpICsgKGNlbGwudiAhPSBudWxsID8gdiA6IFwiXCIpO1xuXHR9XG5cdGlmKGNlbGwubCkgd3NbJyFsaW5rcyddLnB1c2goW3JlZiwgY2VsbC5sXSk7XG5cdGlmKGNlbGwuYykgd3NbJyFjb21tZW50cyddLnB1c2goW3JlZiwgY2VsbC5jXSk7XG5cdHJldHVybiB3cml0ZXh0YWcoJ2MnLCB2LCBvKTtcbn1cblxudmFyIHBhcnNlX3dzX3htbF9kYXRhID0gKGZ1bmN0aW9uKCkge1xuXHR2YXIgY2VsbHJlZ2V4ID0gLzwoPzpcXHcrOik/Y1sgXFwvPl0vLCByb3dyZWdleCA9IC88XFwvKD86XFx3KzopP3Jvdz4vO1xuXHR2YXIgcnJlZ2V4ID0gL3I9W1wiJ10oW15cIiddKilbXCInXS8sIGlzcmVnZXggPSAvPCg/Olxcdys6KT9pcz4oW1xcU1xcc10qPyk8XFwvKD86XFx3KzopP2lzPi87XG5cdHZhciByZWZyZWdleCA9IC9yZWY9W1wiJ10oW15cIiddKilbXCInXS87XG5cdHZhciBtYXRjaF92ID0gbWF0Y2h0YWcoXCJ2XCIpLCBtYXRjaF9mID0gbWF0Y2h0YWcoXCJmXCIpO1xuXG5yZXR1cm4gZnVuY3Rpb24gcGFyc2Vfd3NfeG1sX2RhdGEoc2RhdGEsIHMsIG9wdHMsIGd1ZXNzLCB0aGVtZXMsIHN0eWxlcykge1xuXHR2YXIgcmkgPSAwLCB4ID0gXCJcIiwgY2VsbHMgPSBbXSwgY3JlZiA9IFtdLCBpZHg9MCwgaT0wLCBjYz0wLCBkPVwiXCIsIHA7XG5cdHZhciB0YWcsIHRhZ3IgPSAwLCB0YWdjID0gMDtcblx0dmFyIHNzdHIsIGZ0YWc7XG5cdHZhciBmbXRpZCA9IDAsIGZpbGxpZCA9IDA7XG5cdHZhciBkb19mb3JtYXQgPSBBcnJheS5pc0FycmF5KHN0eWxlcy5DZWxsWGYpLCBjZjtcblx0dmFyIGFycmF5ZiA9IFtdO1xuXHR2YXIgc2hhcmVkZiA9IFtdO1xuXHR2YXIgZGVuc2UgPSBBcnJheS5pc0FycmF5KHMpO1xuXHR2YXIgcm93cyA9IFtdLCByb3dvYmogPSB7fSwgcm93cml0ZSA9IGZhbHNlO1xuXHR2YXIgc2hlZXRTdHVicyA9ICEhb3B0cy5zaGVldFN0dWJzO1xuXHRmb3IodmFyIG1hcnIgPSBzZGF0YS5zcGxpdChyb3dyZWdleCksIG10ID0gMCwgbWFycmxlbiA9IG1hcnIubGVuZ3RoOyBtdCAhPSBtYXJybGVuOyArK210KSB7XG5cdFx0eCA9IG1hcnJbbXRdLnRyaW0oKTtcblx0XHR2YXIgeGxlbiA9IHgubGVuZ3RoO1xuXHRcdGlmKHhsZW4gPT09IDApIGNvbnRpbnVlO1xuXG5cdFx0LyogMTguMy4xLjczIHJvdyBDVF9Sb3cgKi9cblx0XHRmb3IocmkgPSAwOyByaSA8IHhsZW47ICsrcmkpIGlmKHguY2hhckNvZGVBdChyaSkgPT09IDYyKSBicmVhazsgKytyaTtcblx0XHR0YWcgPSBwYXJzZXhtbHRhZyh4LnNsaWNlKDAscmkpLCB0cnVlKTtcblx0XHR0YWdyID0gdGFnLnIgIT0gbnVsbCA/IHBhcnNlSW50KHRhZy5yLCAxMCkgOiB0YWdyKzE7IHRhZ2MgPSAtMTtcblx0XHRpZihvcHRzLnNoZWV0Um93cyAmJiBvcHRzLnNoZWV0Um93cyA8IHRhZ3IpIGNvbnRpbnVlO1xuXHRcdGlmKGd1ZXNzLnMuciA+IHRhZ3IgLSAxKSBndWVzcy5zLnIgPSB0YWdyIC0gMTtcblx0XHRpZihndWVzcy5lLnIgPCB0YWdyIC0gMSkgZ3Vlc3MuZS5yID0gdGFnciAtIDE7XG5cblx0XHRpZihvcHRzICYmIG9wdHMuY2VsbFN0eWxlcykge1xuXHRcdFx0cm93b2JqID0ge307IHJvd3JpdGUgPSBmYWxzZTtcblx0XHRcdGlmKHRhZy5odCkgeyByb3dyaXRlID0gdHJ1ZTsgcm93b2JqLmhwdCA9IHBhcnNlRmxvYXQodGFnLmh0KTsgcm93b2JqLmhweCA9IHB0MnB4KHJvd29iai5ocHQpOyB9XG5cdFx0XHRpZih0YWcuaGlkZGVuID09IFwiMVwiKSB7IHJvd3JpdGUgPSB0cnVlOyByb3dvYmouaGlkZGVuID0gdHJ1ZTsgfVxuXHRcdFx0aWYodGFnLm91dGxpbmVMZXZlbCAhPSBudWxsKSB7IHJvd3JpdGUgPSB0cnVlOyByb3dvYmoubGV2ZWwgPSArdGFnLm91dGxpbmVMZXZlbDsgfVxuXHRcdFx0aWYocm93cml0ZSkgcm93c1t0YWdyLTFdID0gcm93b2JqO1xuXHRcdH1cblxuXHRcdC8qIDE4LjMuMS40IGMgQ1RfQ2VsbCAqL1xuXHRcdGNlbGxzID0geC5zbGljZShyaSkuc3BsaXQoY2VsbHJlZ2V4KTtcblx0XHRmb3IodmFyIHJzbGljZSA9IDA7IHJzbGljZSAhPSBjZWxscy5sZW5ndGg7ICsrcnNsaWNlKSBpZihjZWxsc1tyc2xpY2VdLnRyaW0oKS5jaGFyQXQoMCkgIT0gXCI8XCIpIGJyZWFrO1xuXHRcdGNlbGxzID0gY2VsbHMuc2xpY2UocnNsaWNlKTtcblx0XHRmb3IocmkgPSAwOyByaSAhPSBjZWxscy5sZW5ndGg7ICsrcmkpIHtcblx0XHRcdHggPSBjZWxsc1tyaV0udHJpbSgpO1xuXHRcdFx0aWYoeC5sZW5ndGggPT09IDApIGNvbnRpbnVlO1xuXHRcdFx0Y3JlZiA9IHgubWF0Y2gocnJlZ2V4KTsgaWR4ID0gcmk7IGk9MDsgY2M9MDtcblx0XHRcdHggPSBcIjxjIFwiICsgKHguc2xpY2UoMCwxKT09XCI8XCI/XCI+XCI6XCJcIikgKyB4O1xuXHRcdFx0aWYoY3JlZiAhPSBudWxsICYmIGNyZWYubGVuZ3RoID09PSAyKSB7XG5cdFx0XHRcdGlkeCA9IDA7IGQ9Y3JlZlsxXTtcblx0XHRcdFx0Zm9yKGk9MDsgaSAhPSBkLmxlbmd0aDsgKytpKSB7XG5cdFx0XHRcdFx0aWYoKGNjPWQuY2hhckNvZGVBdChpKS02NCkgPCAxIHx8IGNjID4gMjYpIGJyZWFrO1xuXHRcdFx0XHRcdGlkeCA9IDI2KmlkeCArIGNjO1xuXHRcdFx0XHR9XG5cdFx0XHRcdC0taWR4O1xuXHRcdFx0XHR0YWdjID0gaWR4O1xuXHRcdFx0fSBlbHNlICsrdGFnYztcblx0XHRcdGZvcihpID0gMDsgaSAhPSB4Lmxlbmd0aDsgKytpKSBpZih4LmNoYXJDb2RlQXQoaSkgPT09IDYyKSBicmVhazsgKytpO1xuXHRcdFx0dGFnID0gcGFyc2V4bWx0YWcoeC5zbGljZSgwLGkpLCB0cnVlKTtcblx0XHRcdGlmKCF0YWcucikgdGFnLnIgPSBlbmNvZGVfY2VsbCh7cjp0YWdyLTEsIGM6dGFnY30pO1xuXHRcdFx0ZCA9IHguc2xpY2UoaSk7XG5cdFx0XHRwID0gKHt0OlwiXCJ9KTtcblxuXHRcdFx0aWYoKGNyZWY9ZC5tYXRjaChtYXRjaF92KSkhPSBudWxsICYmIGNyZWZbMV0gIT09ICcnKSBwLnY9dW5lc2NhcGV4bWwoY3JlZlsxXSk7XG5cdFx0XHRpZihvcHRzLmNlbGxGb3JtdWxhKSB7XG5cdFx0XHRcdGlmKChjcmVmPWQubWF0Y2gobWF0Y2hfZikpIT0gbnVsbCAmJiBjcmVmWzFdICE9PSAnJykge1xuXHRcdFx0XHRcdC8qIFRPRE86IG1hdGNoIGFnYWluc3QgWExTWEZ1dHVyZUZ1bmN0aW9ucyAqL1xuXHRcdFx0XHRcdHAuZj11bmVzY2FwZXhtbCh1dGY4cmVhZChjcmVmWzFdKSkucmVwbGFjZSgvXFxyXFxuL2csIFwiXFxuXCIpO1xuXHRcdFx0XHRcdGlmKCFvcHRzLnhsZm4pIHAuZiA9IF94bGZuKHAuZik7XG5cdFx0XHRcdFx0aWYoY3JlZlswXS5pbmRleE9mKCd0PVwiYXJyYXlcIicpID4gLTEpIHtcblx0XHRcdFx0XHRcdHAuRiA9IChkLm1hdGNoKHJlZnJlZ2V4KXx8W10pWzFdO1xuXHRcdFx0XHRcdFx0aWYocC5GLmluZGV4T2YoXCI6XCIpID4gLTEpIGFycmF5Zi5wdXNoKFtzYWZlX2RlY29kZV9yYW5nZShwLkYpLCBwLkZdKTtcblx0XHRcdFx0XHR9IGVsc2UgaWYoY3JlZlswXS5pbmRleE9mKCd0PVwic2hhcmVkXCInKSA+IC0xKSB7XG5cdFx0XHRcdFx0XHQvLyBUT0RPOiBwYXJzZSBmb3JtdWxhXG5cdFx0XHRcdFx0XHRmdGFnID0gcGFyc2V4bWx0YWcoY3JlZlswXSk7XG5cdFx0XHRcdFx0XHR2YXIgX19fZiA9IHVuZXNjYXBleG1sKHV0ZjhyZWFkKGNyZWZbMV0pKTtcblx0XHRcdFx0XHRcdGlmKCFvcHRzLnhsZm4pIF9fX2YgPSBfeGxmbihfX19mKTtcblx0XHRcdFx0XHRcdHNoYXJlZGZbcGFyc2VJbnQoZnRhZy5zaSwgMTApXSA9IFtmdGFnLCBfX19mLCB0YWcucl07XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9IGVsc2UgaWYoKGNyZWY9ZC5tYXRjaCgvPGZbXj5dKlxcLz4vKSkpIHtcblx0XHRcdFx0XHRmdGFnID0gcGFyc2V4bWx0YWcoY3JlZlswXSk7XG5cdFx0XHRcdFx0aWYoc2hhcmVkZltmdGFnLnNpXSkgcC5mID0gc2hpZnRfZm9ybXVsYV94bHN4KHNoYXJlZGZbZnRhZy5zaV1bMV0sIHNoYXJlZGZbZnRhZy5zaV1bMl0vKlswXS5yZWYqLywgdGFnLnIpO1xuXHRcdFx0XHR9XG5cdFx0XHRcdC8qIFRPRE86IGZhY3RvciBvdXQgY29udGFpbnMgbG9naWMgKi9cblx0XHRcdFx0dmFyIF90YWcgPSBkZWNvZGVfY2VsbCh0YWcucik7XG5cdFx0XHRcdGZvcihpID0gMDsgaSA8IGFycmF5Zi5sZW5ndGg7ICsraSlcblx0XHRcdFx0XHRpZihfdGFnLnIgPj0gYXJyYXlmW2ldWzBdLnMuciAmJiBfdGFnLnIgPD0gYXJyYXlmW2ldWzBdLmUucilcblx0XHRcdFx0XHRcdGlmKF90YWcuYyA+PSBhcnJheWZbaV1bMF0ucy5jICYmIF90YWcuYyA8PSBhcnJheWZbaV1bMF0uZS5jKVxuXHRcdFx0XHRcdFx0XHRwLkYgPSBhcnJheWZbaV1bMV07XG5cdFx0XHR9XG5cblx0XHRcdGlmKHRhZy50ID09IG51bGwgJiYgcC52ID09PSB1bmRlZmluZWQpIHtcblx0XHRcdFx0aWYocC5mIHx8IHAuRikge1xuXHRcdFx0XHRcdHAudiA9IDA7IHAudCA9IFwiblwiO1xuXHRcdFx0XHR9IGVsc2UgaWYoIXNoZWV0U3R1YnMpIGNvbnRpbnVlO1xuXHRcdFx0XHRlbHNlIHAudCA9IFwielwiO1xuXHRcdFx0fVxuXHRcdFx0ZWxzZSBwLnQgPSB0YWcudCB8fCBcIm5cIjtcblx0XHRcdGlmKGd1ZXNzLnMuYyA+IHRhZ2MpIGd1ZXNzLnMuYyA9IHRhZ2M7XG5cdFx0XHRpZihndWVzcy5lLmMgPCB0YWdjKSBndWVzcy5lLmMgPSB0YWdjO1xuXHRcdFx0LyogMTguMTguMTEgdCBTVF9DZWxsVHlwZSAqL1xuXHRcdFx0c3dpdGNoKHAudCkge1xuXHRcdFx0XHRjYXNlICduJzpcblx0XHRcdFx0XHRpZihwLnYgPT0gXCJcIiB8fCBwLnYgPT0gbnVsbCkge1xuXHRcdFx0XHRcdFx0aWYoIXNoZWV0U3R1YnMpIGNvbnRpbnVlO1xuXHRcdFx0XHRcdFx0cC50ID0gJ3onO1xuXHRcdFx0XHRcdH0gZWxzZSBwLnYgPSBwYXJzZUZsb2F0KHAudik7XG5cdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdGNhc2UgJ3MnOlxuXHRcdFx0XHRcdGlmKHR5cGVvZiBwLnYgPT0gJ3VuZGVmaW5lZCcpIHtcblx0XHRcdFx0XHRcdGlmKCFzaGVldFN0dWJzKSBjb250aW51ZTtcblx0XHRcdFx0XHRcdHAudCA9ICd6Jztcblx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0c3N0ciA9IHN0cnNbcGFyc2VJbnQocC52LCAxMCldO1xuXHRcdFx0XHRcdFx0cC52ID0gc3N0ci50O1xuXHRcdFx0XHRcdFx0cC5yID0gc3N0ci5yO1xuXHRcdFx0XHRcdFx0aWYob3B0cy5jZWxsSFRNTCkgcC5oID0gc3N0ci5oO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0Y2FzZSAnc3RyJzpcblx0XHRcdFx0XHRwLnQgPSBcInNcIjtcblx0XHRcdFx0XHRwLnYgPSAocC52IT1udWxsKSA/IHV0ZjhyZWFkKHAudikgOiAnJztcblx0XHRcdFx0XHRpZihvcHRzLmNlbGxIVE1MKSBwLmggPSBlc2NhcGVodG1sKHAudik7XG5cdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdGNhc2UgJ2lubGluZVN0cic6XG5cdFx0XHRcdFx0Y3JlZiA9IGQubWF0Y2goaXNyZWdleCk7XG5cdFx0XHRcdFx0cC50ID0gJ3MnO1xuXHRcdFx0XHRcdGlmKGNyZWYgIT0gbnVsbCAmJiAoc3N0ciA9IHBhcnNlX3NpKGNyZWZbMV0pKSkge1xuXHRcdFx0XHRcdFx0cC52ID0gc3N0ci50O1xuXHRcdFx0XHRcdFx0aWYob3B0cy5jZWxsSFRNTCkgcC5oID0gc3N0ci5oO1xuXHRcdFx0XHRcdH0gZWxzZSBwLnYgPSBcIlwiO1xuXHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRjYXNlICdiJzogcC52ID0gcGFyc2V4bWxib29sKHAudik7IGJyZWFrO1xuXHRcdFx0XHRjYXNlICdkJzpcblx0XHRcdFx0XHRpZihvcHRzLmNlbGxEYXRlcykgcC52ID0gcGFyc2VEYXRlKHAudiwgMSk7XG5cdFx0XHRcdFx0ZWxzZSB7IHAudiA9IGRhdGVudW0ocGFyc2VEYXRlKHAudiwgMSkpOyBwLnQgPSAnbic7IH1cblx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0LyogZXJyb3Igc3RyaW5nIGluIC53LCBudW1iZXIgaW4gLnYgKi9cblx0XHRcdFx0Y2FzZSAnZSc6XG5cdFx0XHRcdFx0aWYoIW9wdHMgfHwgb3B0cy5jZWxsVGV4dCAhPT0gZmFsc2UpIHAudyA9IHAudjtcblx0XHRcdFx0XHRwLnYgPSBSQkVycltwLnZdOyBicmVhaztcblx0XHRcdH1cblx0XHRcdC8qIGZvcm1hdHRpbmcgKi9cblx0XHRcdGZtdGlkID0gZmlsbGlkID0gMDtcblx0XHRcdGNmID0gbnVsbDtcblx0XHRcdGlmKGRvX2Zvcm1hdCAmJiB0YWcucyAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRcdGNmID0gc3R5bGVzLkNlbGxYZlt0YWcuc107XG5cdFx0XHRcdGlmKGNmICE9IG51bGwpIHtcblx0XHRcdFx0XHRpZihjZi5udW1GbXRJZCAhPSBudWxsKSBmbXRpZCA9IGNmLm51bUZtdElkO1xuXHRcdFx0XHRcdGlmKG9wdHMuY2VsbFN0eWxlcykge1xuXHRcdFx0XHRcdFx0aWYoY2YuZmlsbElkICE9IG51bGwpIGZpbGxpZCA9IGNmLmZpbGxJZDtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHRcdHNhZmVfZm9ybWF0KHAsIGZtdGlkLCBmaWxsaWQsIG9wdHMsIHRoZW1lcywgc3R5bGVzKTtcblx0XHRcdGlmKG9wdHMuY2VsbERhdGVzICYmIGRvX2Zvcm1hdCAmJiBwLnQgPT0gJ24nICYmIFNTRi5pc19kYXRlKFNTRi5fdGFibGVbZm10aWRdKSkgeyBwLnQgPSAnZCc7IHAudiA9IG51bWRhdGUocC52KTsgfVxuXHRcdFx0aWYoZGVuc2UpIHtcblx0XHRcdFx0dmFyIF9yID0gZGVjb2RlX2NlbGwodGFnLnIpO1xuXHRcdFx0XHRpZighc1tfci5yXSkgc1tfci5yXSA9IFtdO1xuXHRcdFx0XHRzW19yLnJdW19yLmNdID0gcDtcblx0XHRcdH0gZWxzZSBzW3RhZy5yXSA9IHA7XG5cdFx0fVxuXHR9XG5cdGlmKHJvd3MubGVuZ3RoID4gMCkgc1snIXJvd3MnXSA9IHJvd3M7XG59OyB9KSgpO1xuXG5mdW5jdGlvbiB3cml0ZV93c194bWxfZGF0YSh3cywgb3B0cywgaWR4LCB3Yikge1xuXHR2YXIgbyA9IFtdLCByID0gW10sIHJhbmdlID0gc2FmZV9kZWNvZGVfcmFuZ2Uod3NbJyFyZWYnXSksIGNlbGw9XCJcIiwgcmVmLCByciA9IFwiXCIsIGNvbHMgPSBbXSwgUj0wLCBDPTAsIHJvd3MgPSB3c1snIXJvd3MnXTtcblx0dmFyIGRlbnNlID0gQXJyYXkuaXNBcnJheSh3cyk7XG5cdHZhciBwYXJhbXMgPSAoe3I6cnJ9KSwgcm93LCBoZWlnaHQgPSAtMTtcblx0Zm9yKEMgPSByYW5nZS5zLmM7IEMgPD0gcmFuZ2UuZS5jOyArK0MpIGNvbHNbQ10gPSBlbmNvZGVfY29sKEMpO1xuXHRmb3IoUiA9IHJhbmdlLnMucjsgUiA8PSByYW5nZS5lLnI7ICsrUikge1xuXHRcdHIgPSBbXTtcblx0XHRyciA9IGVuY29kZV9yb3coUik7XG5cdFx0Zm9yKEMgPSByYW5nZS5zLmM7IEMgPD0gcmFuZ2UuZS5jOyArK0MpIHtcblx0XHRcdHJlZiA9IGNvbHNbQ10gKyBycjtcblx0XHRcdHZhciBfY2VsbCA9IGRlbnNlID8gKHdzW1JdfHxbXSlbQ106IHdzW3JlZl07XG5cdFx0XHRpZihfY2VsbCA9PT0gdW5kZWZpbmVkKSBjb250aW51ZTtcblx0XHRcdGlmKChjZWxsID0gd3JpdGVfd3NfeG1sX2NlbGwoX2NlbGwsIHJlZiwgd3MsIG9wdHMsIGlkeCwgd2IpKSAhPSBudWxsKSByLnB1c2goY2VsbCk7XG5cdFx0fVxuXHRcdGlmKHIubGVuZ3RoID4gMCB8fCAocm93cyAmJiByb3dzW1JdKSkge1xuXHRcdFx0cGFyYW1zID0gKHtyOnJyfSk7XG5cdFx0XHRpZihyb3dzICYmIHJvd3NbUl0pIHtcblx0XHRcdFx0cm93ID0gcm93c1tSXTtcblx0XHRcdFx0aWYocm93LmhpZGRlbikgcGFyYW1zLmhpZGRlbiA9IDE7XG5cdFx0XHRcdGhlaWdodCA9IC0xO1xuXHRcdFx0XHRpZihyb3cuaHB4KSBoZWlnaHQgPSBweDJwdChyb3cuaHB4KTtcblx0XHRcdFx0ZWxzZSBpZihyb3cuaHB0KSBoZWlnaHQgPSByb3cuaHB0O1xuXHRcdFx0XHRpZihoZWlnaHQgPiAtMSkgeyBwYXJhbXMuaHQgPSBoZWlnaHQ7IHBhcmFtcy5jdXN0b21IZWlnaHQgPSAxOyB9XG5cdFx0XHRcdGlmKHJvdy5sZXZlbCkgeyBwYXJhbXMub3V0bGluZUxldmVsID0gcm93LmxldmVsOyB9XG5cdFx0XHR9XG5cdFx0XHRvW28ubGVuZ3RoXSA9ICh3cml0ZXh0YWcoJ3JvdycsIHIuam9pbihcIlwiKSwgcGFyYW1zKSk7XG5cdFx0fVxuXHR9XG5cdGlmKHJvd3MpIGZvcig7IFIgPCByb3dzLmxlbmd0aDsgKytSKSB7XG5cdFx0aWYocm93cyAmJiByb3dzW1JdKSB7XG5cdFx0XHRwYXJhbXMgPSAoe3I6UisxfSk7XG5cdFx0XHRyb3cgPSByb3dzW1JdO1xuXHRcdFx0aWYocm93LmhpZGRlbikgcGFyYW1zLmhpZGRlbiA9IDE7XG5cdFx0XHRoZWlnaHQgPSAtMTtcblx0XHRcdGlmIChyb3cuaHB4KSBoZWlnaHQgPSBweDJwdChyb3cuaHB4KTtcblx0XHRcdGVsc2UgaWYgKHJvdy5ocHQpIGhlaWdodCA9IHJvdy5ocHQ7XG5cdFx0XHRpZiAoaGVpZ2h0ID4gLTEpIHsgcGFyYW1zLmh0ID0gaGVpZ2h0OyBwYXJhbXMuY3VzdG9tSGVpZ2h0ID0gMTsgfVxuXHRcdFx0aWYgKHJvdy5sZXZlbCkgeyBwYXJhbXMub3V0bGluZUxldmVsID0gcm93LmxldmVsOyB9XG5cdFx0XHRvW28ubGVuZ3RoXSA9ICh3cml0ZXh0YWcoJ3JvdycsIFwiXCIsIHBhcmFtcykpO1xuXHRcdH1cblx0fVxuXHRyZXR1cm4gby5qb2luKFwiXCIpO1xufVxuXG52YXIgV1NfWE1MX1JPT1QgPSB3cml0ZXh0YWcoJ3dvcmtzaGVldCcsIG51bGwsIHtcblx0J3htbG5zJzogWE1MTlMubWFpblswXSxcblx0J3htbG5zOnInOiBYTUxOUy5yXG59KTtcblxuZnVuY3Rpb24gd3JpdGVfd3NfeG1sKGlkeCwgb3B0cywgd2IsIHJlbHMpIHtcblx0dmFyIG8gPSBbWE1MX0hFQURFUiwgV1NfWE1MX1JPT1RdO1xuXHR2YXIgcyA9IHdiLlNoZWV0TmFtZXNbaWR4XSwgc2lkeCA9IDAsIHJkYXRhID0gXCJcIjtcblx0dmFyIHdzID0gd2IuU2hlZXRzW3NdO1xuXHRpZih3cyA9PSBudWxsKSB3cyA9IHt9O1xuXHR2YXIgcmVmID0gd3NbJyFyZWYnXSB8fCAnQTEnO1xuXHR2YXIgcmFuZ2UgPSBzYWZlX2RlY29kZV9yYW5nZShyZWYpO1xuXHRpZihyYW5nZS5lLmMgPiAweDNGRkYgfHwgcmFuZ2UuZS5yID4gMHhGRkZGRikge1xuXHRcdGlmKG9wdHMuV1RGKSB0aHJvdyBuZXcgRXJyb3IoXCJSYW5nZSBcIiArIHJlZiArIFwiIGV4Y2VlZHMgZm9ybWF0IGxpbWl0IEExOlhGRDEwNDg1NzZcIik7XG5cdFx0cmFuZ2UuZS5jID0gTWF0aC5taW4ocmFuZ2UuZS5jLCAweDNGRkYpO1xuXHRcdHJhbmdlLmUuciA9IE1hdGgubWluKHJhbmdlLmUuYywgMHhGRkZGRik7XG5cdFx0cmVmID0gZW5jb2RlX3JhbmdlKHJhbmdlKTtcblx0fVxuXHRpZighcmVscykgcmVscyA9IHt9O1xuXHR3c1snIWNvbW1lbnRzJ10gPSBbXTtcblx0dmFyIF9kcmF3aW5nID0gW107XG5cblx0d3JpdGVfd3NfeG1sX3NoZWV0cHIod3MsIHdiLCBpZHgsIG9wdHMsIG8pO1xuXG5cdG9bby5sZW5ndGhdID0gKHdyaXRleHRhZygnZGltZW5zaW9uJywgbnVsbCwgeydyZWYnOiByZWZ9KSk7XG5cblx0b1tvLmxlbmd0aF0gPSB3cml0ZV93c194bWxfc2hlZXR2aWV3cyh3cywgb3B0cywgaWR4LCB3Yik7XG5cblx0LyogVE9ETzogc3RvcmUgaW4gV0IsIHByb2Nlc3Mgc3R5bGVzICovXG5cdGlmKG9wdHMuc2hlZXRGb3JtYXQpIG9bby5sZW5ndGhdID0gKHdyaXRleHRhZygnc2hlZXRGb3JtYXRQcicsIG51bGwsIHtcblx0XHRkZWZhdWx0Um93SGVpZ2h0Om9wdHMuc2hlZXRGb3JtYXQuZGVmYXVsdFJvd0hlaWdodHx8JzE2Jyxcblx0XHRiYXNlQ29sV2lkdGg6b3B0cy5zaGVldEZvcm1hdC5iYXNlQ29sV2lkdGh8fCcxMCcsXG5cdFx0b3V0bGluZUxldmVsUm93Om9wdHMuc2hlZXRGb3JtYXQub3V0bGluZUxldmVsUm93fHwnNydcblx0fSkpO1xuXG5cdGlmKHdzWychY29scyddICE9IG51bGwgJiYgd3NbJyFjb2xzJ10ubGVuZ3RoID4gMCkgb1tvLmxlbmd0aF0gPSAod3JpdGVfd3NfeG1sX2NvbHMod3MsIHdzWychY29scyddKSk7XG5cblx0b1tzaWR4ID0gby5sZW5ndGhdID0gJzxzaGVldERhdGEvPic7XG5cdHdzWychbGlua3MnXSA9IFtdO1xuXHRpZih3c1snIXJlZiddICE9IG51bGwpIHtcblx0XHRyZGF0YSA9IHdyaXRlX3dzX3htbF9kYXRhKHdzLCBvcHRzLCBpZHgsIHdiLCByZWxzKTtcblx0XHRpZihyZGF0YS5sZW5ndGggPiAwKSBvW28ubGVuZ3RoXSA9IChyZGF0YSk7XG5cdH1cblx0aWYoby5sZW5ndGg+c2lkeCsxKSB7IG9bby5sZW5ndGhdID0gKCc8L3NoZWV0RGF0YT4nKTsgb1tzaWR4XT1vW3NpZHhdLnJlcGxhY2UoXCIvPlwiLFwiPlwiKTsgfVxuXG5cdC8qIHNoZWV0Q2FsY1ByICovXG5cblx0aWYod3NbJyFwcm90ZWN0J10gIT0gbnVsbCkgb1tvLmxlbmd0aF0gPSB3cml0ZV93c194bWxfcHJvdGVjdGlvbih3c1snIXByb3RlY3QnXSk7XG5cblx0LyogcHJvdGVjdGVkUmFuZ2VzICovXG5cdC8qIHNjZW5hcmlvcyAqL1xuXG5cdGlmKHdzWychYXV0b2ZpbHRlciddICE9IG51bGwpIG9bby5sZW5ndGhdID0gd3JpdGVfd3NfeG1sX2F1dG9maWx0ZXIod3NbJyFhdXRvZmlsdGVyJ10sIHdzLCB3YiwgaWR4KTtcblxuXHQvKiBzb3J0U3RhdGUgKi9cblx0LyogZGF0YUNvbnNvbGlkYXRlICovXG5cdC8qIGN1c3RvbVNoZWV0Vmlld3MgKi9cblxuXHRpZih3c1snIW1lcmdlcyddICE9IG51bGwgJiYgd3NbJyFtZXJnZXMnXS5sZW5ndGggPiAwKSBvW28ubGVuZ3RoXSA9ICh3cml0ZV93c194bWxfbWVyZ2VzKHdzWychbWVyZ2VzJ10pKTtcblxuXHQvKiBwaG9uZXRpY1ByICovXG5cdC8qIGNvbmRpdGlvbmFsRm9ybWF0dGluZyAqL1xuXHQvKiBkYXRhVmFsaWRhdGlvbnMgKi9cblxuXHR2YXIgcmVsYyA9IC0xLCByZWwsIHJJZCA9IC0xO1xuXHRpZih3c1snIWxpbmtzJ10ubGVuZ3RoID4gMCkge1xuXHRcdG9bby5sZW5ndGhdID0gXCI8aHlwZXJsaW5rcz5cIjtcbndzWychbGlua3MnXS5mb3JFYWNoKGZ1bmN0aW9uKGwpIHtcblx0XHRcdGlmKCFsWzFdLlRhcmdldCkgcmV0dXJuO1xuXHRcdFx0cmVsID0gKHtcInJlZlwiOmxbMF19KTtcblx0XHRcdGlmKGxbMV0uVGFyZ2V0LmNoYXJBdCgwKSAhPSBcIiNcIikge1xuXHRcdFx0XHRySWQgPSBhZGRfcmVscyhyZWxzLCAtMSwgZXNjYXBleG1sKGxbMV0uVGFyZ2V0KS5yZXBsYWNlKC8jLiokLywgXCJcIiksIFJFTFMuSExJTkspO1xuXHRcdFx0XHRyZWxbXCJyOmlkXCJdID0gXCJySWRcIitySWQ7XG5cdFx0XHR9XG5cdFx0XHRpZigocmVsYyA9IGxbMV0uVGFyZ2V0LmluZGV4T2YoXCIjXCIpKSA+IC0xKSByZWwubG9jYXRpb24gPSBlc2NhcGV4bWwobFsxXS5UYXJnZXQuc2xpY2UocmVsYysxKSk7XG5cdFx0XHRpZihsWzFdLlRvb2x0aXApIHJlbC50b29sdGlwID0gZXNjYXBleG1sKGxbMV0uVG9vbHRpcCk7XG5cdFx0XHRvW28ubGVuZ3RoXSA9IHdyaXRleHRhZyhcImh5cGVybGlua1wiLG51bGwscmVsKTtcblx0XHR9KTtcblx0XHRvW28ubGVuZ3RoXSA9IFwiPC9oeXBlcmxpbmtzPlwiO1xuXHR9XG5cdGRlbGV0ZSB3c1snIWxpbmtzJ107XG5cblx0LyogcHJpbnRPcHRpb25zICovXG5cblx0aWYod3NbJyFtYXJnaW5zJ10gIT0gbnVsbCkgb1tvLmxlbmd0aF0gPSAgd3JpdGVfd3NfeG1sX21hcmdpbnMod3NbJyFtYXJnaW5zJ10pO1xuXG5cdC8qIHBhZ2VTZXR1cCAqL1xuXHQvKiBoZWFkZXJGb290ZXIgKi9cblx0Lyogcm93QnJlYWtzICovXG5cdC8qIGNvbEJyZWFrcyAqL1xuXHQvKiBjdXN0b21Qcm9wZXJ0aWVzICovXG5cdC8qIGNlbGxXYXRjaGVzICovXG5cblx0aWYoIW9wdHMgfHwgb3B0cy5pZ25vcmVFQyB8fCAob3B0cy5pZ25vcmVFQyA9PSAodm9pZCAwKSkpIG9bby5sZW5ndGhdID0gd3JpdGV0YWcoXCJpZ25vcmVkRXJyb3JzXCIsIHdyaXRleHRhZyhcImlnbm9yZWRFcnJvclwiLCBudWxsLCB7bnVtYmVyU3RvcmVkQXNUZXh0OjEsIHNxcmVmOnJlZn0pKTtcblxuXHQvKiBzbWFydFRhZ3MgKi9cblxuXHRpZihfZHJhd2luZy5sZW5ndGggPiAwKSB7XG5cdFx0cklkID0gYWRkX3JlbHMocmVscywgLTEsIFwiLi4vZHJhd2luZ3MvZHJhd2luZ1wiICsgKGlkeCsxKSArIFwiLnhtbFwiLCBSRUxTLkRSQVcpO1xuXHRcdG9bby5sZW5ndGhdID0gd3JpdGV4dGFnKFwiZHJhd2luZ1wiLCBudWxsLCB7XCJyOmlkXCI6XCJySWRcIiArIHJJZH0pO1xuXHRcdHdzWychZHJhd2luZyddID0gX2RyYXdpbmc7XG5cdH1cblxuXHRpZih3c1snIWNvbW1lbnRzJ10ubGVuZ3RoID4gMCkge1xuXHRcdHJJZCA9IGFkZF9yZWxzKHJlbHMsIC0xLCBcIi4uL2RyYXdpbmdzL3ZtbERyYXdpbmdcIiArIChpZHgrMSkgKyBcIi52bWxcIiwgUkVMUy5WTUwpO1xuXHRcdG9bby5sZW5ndGhdID0gd3JpdGV4dGFnKFwibGVnYWN5RHJhd2luZ1wiLCBudWxsLCB7XCJyOmlkXCI6XCJySWRcIiArIHJJZH0pO1xuXHRcdHdzWychbGVnYWN5J10gPSBySWQ7XG5cdH1cblxuXHQvKiBsZWdhY3lEcmF3aW5nSEYgKi9cblx0LyogcGljdHVyZSAqL1xuXHQvKiBvbGVPYmplY3RzICovXG5cdC8qIGNvbnRyb2xzICovXG5cdC8qIHdlYlB1Ymxpc2hJdGVtcyAqL1xuXHQvKiB0YWJsZVBhcnRzICovXG5cdC8qIGV4dExzdCAqL1xuXG5cdGlmKG8ubGVuZ3RoPjEpIHsgb1tvLmxlbmd0aF0gPSAoJzwvd29ya3NoZWV0PicpOyBvWzFdPW9bMV0ucmVwbGFjZShcIi8+XCIsXCI+XCIpOyB9XG5cdHJldHVybiBvLmpvaW4oXCJcIik7XG59XG5cbi8qIFtNUy1YTFNCXSAyLjQuNzI2IEJydFJvd0hkciAqL1xuZnVuY3Rpb24gcGFyc2VfQnJ0Um93SGRyKGRhdGEsIGxlbmd0aCkge1xuXHR2YXIgeiA9ICh7fSk7XG5cdHZhciB0Z3QgPSBkYXRhLmwgKyBsZW5ndGg7XG5cdHouciA9IGRhdGEucmVhZF9zaGlmdCg0KTtcblx0ZGF0YS5sICs9IDQ7IC8vIFRPRE86IGl4ZmVcblx0dmFyIG1peVJ3ID0gZGF0YS5yZWFkX3NoaWZ0KDIpO1xuXHRkYXRhLmwgKz0gMTsgLy8gVE9ETzogdG9wL2JvdCBwYWRkaW5nXG5cdHZhciBmbGFncyA9IGRhdGEucmVhZF9zaGlmdCgxKTtcblx0ZGF0YS5sID0gdGd0O1xuXHRpZihmbGFncyAmIDB4MDcpIHoubGV2ZWwgPSBmbGFncyAmIDB4MDc7XG5cdGlmKGZsYWdzICYgMHgxMCkgei5oaWRkZW4gPSB0cnVlO1xuXHRpZihmbGFncyAmIDB4MjApIHouaHB0ID0gbWl5UncgLyAyMDtcblx0cmV0dXJuIHo7XG59XG5mdW5jdGlvbiB3cml0ZV9CcnRSb3dIZHIoUiwgcmFuZ2UsIHdzKSB7XG5cdHZhciBvID0gbmV3X2J1ZigxNys4KjE2KTtcblx0dmFyIHJvdyA9ICh3c1snIXJvd3MnXXx8W10pW1JdfHx7fTtcblx0by53cml0ZV9zaGlmdCg0LCBSKTtcblxuXHRvLndyaXRlX3NoaWZ0KDQsIDApOyAvKiBUT0RPOiBpeGZlICovXG5cblx0dmFyIG1peVJ3ID0gMHgwMTQwO1xuXHRpZihyb3cuaHB4KSBtaXlSdyA9IHB4MnB0KHJvdy5ocHgpICogMjA7XG5cdGVsc2UgaWYocm93LmhwdCkgbWl5UncgPSByb3cuaHB0ICogMjA7XG5cdG8ud3JpdGVfc2hpZnQoMiwgbWl5UncpO1xuXG5cdG8ud3JpdGVfc2hpZnQoMSwgMCk7IC8qIHRvcC9ib3QgcGFkZGluZyAqL1xuXG5cdHZhciBmbGFncyA9IDB4MDtcblx0aWYocm93LmxldmVsKSBmbGFncyB8PSByb3cubGV2ZWw7XG5cdGlmKHJvdy5oaWRkZW4pIGZsYWdzIHw9IDB4MTA7XG5cdGlmKHJvdy5ocHggfHwgcm93LmhwdCkgZmxhZ3MgfD0gMHgyMDtcblx0by53cml0ZV9zaGlmdCgxLCBmbGFncyk7XG5cblx0by53cml0ZV9zaGlmdCgxLCAwKTsgLyogcGhvbmV0aWMgZ3VpZGUgKi9cblxuXHQvKiBbTVMtWExTQl0gMi41LjggQnJ0Q29sU3BhbiBleHBsYWlucyB0aGUgbWVjaGFuaXNtICovXG5cdHZhciBuY29sc3BhbiA9IDAsIGxjcyA9IG8ubDtcblx0by5sICs9IDQ7XG5cblx0dmFyIGNhZGRyID0ge3I6UiwgYzowfTtcblx0Zm9yKHZhciBpID0gMDsgaSA8IDE2OyArK2kpIHtcblx0XHRpZigocmFuZ2Uucy5jID4gKChpKzEpIDw8IDEwKSkgfHwgKHJhbmdlLmUuYyA8IChpIDw8IDEwKSkpIGNvbnRpbnVlO1xuXHRcdHZhciBmaXJzdCA9IC0xLCBsYXN0ID0gLTE7XG5cdFx0Zm9yKHZhciBqID0gKGk8PDEwKTsgaiA8ICgoaSsxKTw8MTApOyArK2opIHtcblx0XHRcdGNhZGRyLmMgPSBqO1xuXHRcdFx0dmFyIGNlbGwgPSBBcnJheS5pc0FycmF5KHdzKSA/ICh3c1tjYWRkci5yXXx8W10pW2NhZGRyLmNdIDogd3NbZW5jb2RlX2NlbGwoY2FkZHIpXTtcblx0XHRcdGlmKGNlbGwpIHsgaWYoZmlyc3QgPCAwKSBmaXJzdCA9IGo7IGxhc3QgPSBqOyB9XG5cdFx0fVxuXHRcdGlmKGZpcnN0IDwgMCkgY29udGludWU7XG5cdFx0KytuY29sc3Bhbjtcblx0XHRvLndyaXRlX3NoaWZ0KDQsIGZpcnN0KTtcblx0XHRvLndyaXRlX3NoaWZ0KDQsIGxhc3QpO1xuXHR9XG5cblx0dmFyIGwgPSBvLmw7XG5cdG8ubCA9IGxjcztcblx0by53cml0ZV9zaGlmdCg0LCBuY29sc3Bhbik7XG5cdG8ubCA9IGw7XG5cblx0cmV0dXJuIG8ubGVuZ3RoID4gby5sID8gby5zbGljZSgwLCBvLmwpIDogbztcbn1cbmZ1bmN0aW9uIHdyaXRlX3Jvd19oZWFkZXIoYmEsIHdzLCByYW5nZSwgUikge1xuXHR2YXIgbyA9IHdyaXRlX0JydFJvd0hkcihSLCByYW5nZSwgd3MpO1xuXHRpZigoby5sZW5ndGggPiAxNykgfHwgKHdzWychcm93cyddfHxbXSlbUl0pIHdyaXRlX3JlY29yZChiYSwgJ0JydFJvd0hkcicsIG8pO1xufVxuXG4vKiBbTVMtWExTQl0gMi40LjgyMCBCcnRXc0RpbSAqL1xudmFyIHBhcnNlX0JydFdzRGltID0gcGFyc2VfVW5jaGVja2VkUmZYO1xudmFyIHdyaXRlX0JydFdzRGltID0gd3JpdGVfVW5jaGVja2VkUmZYO1xuXG4vKiBbTVMtWExTQl0gMi40LjgyMSBCcnRXc0ZtdEluZm8gKi9cbmZ1bmN0aW9uIHBhcnNlX0JydFdzRm10SW5mbygpIHtcbn1cbi8vZnVuY3Rpb24gd3JpdGVfQnJ0V3NGbXRJbmZvKHdzLCBvKSB7IH1cblxuLyogW01TLVhMU0JdIDIuNC44MjMgQnJ0V3NQcm9wICovXG5mdW5jdGlvbiBwYXJzZV9CcnRXc1Byb3AoZGF0YSwgbGVuZ3RoKSB7XG5cdHZhciB6ID0ge307XG5cdC8qIFRPRE86IHB1bGwgZmxhZ3MgKi9cblx0ZGF0YS5sICs9IDE5O1xuXHR6Lm5hbWUgPSBwYXJzZV9YTFNCQ29kZU5hbWUoZGF0YSwgbGVuZ3RoIC0gMTkpO1xuXHRyZXR1cm4gejtcbn1cbmZ1bmN0aW9uIHdyaXRlX0JydFdzUHJvcChzdHIsIG8pIHtcblx0aWYobyA9PSBudWxsKSBvID0gbmV3X2J1Zig4NCs0KnN0ci5sZW5ndGgpO1xuXHRmb3IodmFyIGkgPSAwOyBpIDwgMzsgKytpKSBvLndyaXRlX3NoaWZ0KDEsMCk7XG5cdHdyaXRlX0JydENvbG9yKHthdXRvOjF9LCBvKTtcblx0by53cml0ZV9zaGlmdCgtNCwtMSk7XG5cdG8ud3JpdGVfc2hpZnQoLTQsLTEpO1xuXHR3cml0ZV9YTFNCQ29kZU5hbWUoc3RyLCBvKTtcblx0cmV0dXJuIG8uc2xpY2UoMCwgby5sKTtcbn1cblxuLyogW01TLVhMU0JdIDIuNC4zMDYgQnJ0Q2VsbEJsYW5rICovXG5mdW5jdGlvbiBwYXJzZV9CcnRDZWxsQmxhbmsoZGF0YSkge1xuXHR2YXIgY2VsbCA9IHBhcnNlX1hMU0JDZWxsKGRhdGEpO1xuXHRyZXR1cm4gW2NlbGxdO1xufVxuZnVuY3Rpb24gd3JpdGVfQnJ0Q2VsbEJsYW5rKGNlbGwsIG5jZWxsLCBvKSB7XG5cdGlmKG8gPT0gbnVsbCkgbyA9IG5ld19idWYoOCk7XG5cdHJldHVybiB3cml0ZV9YTFNCQ2VsbChuY2VsbCwgbyk7XG59XG5mdW5jdGlvbiBwYXJzZV9CcnRTaG9ydEJsYW5rKGRhdGEpIHtcblx0dmFyIGNlbGwgPSBwYXJzZV9YTFNCU2hvcnRDZWxsKGRhdGEpO1xuXHRyZXR1cm4gW2NlbGxdO1xufVxuZnVuY3Rpb24gd3JpdGVfQnJ0U2hvcnRCbGFuayhjZWxsLCBuY2VsbCwgbykge1xuXHRpZihvID09IG51bGwpIG8gPSBuZXdfYnVmKDQpO1xuXHRyZXR1cm4gd3JpdGVfWExTQlNob3J0Q2VsbChuY2VsbCwgbyk7XG59XG5cbi8qIFtNUy1YTFNCXSAyLjQuMzA3IEJydENlbGxCb29sICovXG5mdW5jdGlvbiBwYXJzZV9CcnRDZWxsQm9vbChkYXRhKSB7XG5cdHZhciBjZWxsID0gcGFyc2VfWExTQkNlbGwoZGF0YSk7XG5cdHZhciBmQm9vbCA9IGRhdGEucmVhZF9zaGlmdCgxKTtcblx0cmV0dXJuIFtjZWxsLCBmQm9vbCwgJ2InXTtcbn1cbmZ1bmN0aW9uIHdyaXRlX0JydENlbGxCb29sKGNlbGwsIG5jZWxsLCBvKSB7XG5cdGlmKG8gPT0gbnVsbCkgbyA9IG5ld19idWYoOSk7XG5cdHdyaXRlX1hMU0JDZWxsKG5jZWxsLCBvKTtcblx0by53cml0ZV9zaGlmdCgxLCBjZWxsLnYgPyAxIDogMCk7XG5cdHJldHVybiBvO1xufVxuZnVuY3Rpb24gcGFyc2VfQnJ0U2hvcnRCb29sKGRhdGEpIHtcblx0dmFyIGNlbGwgPSBwYXJzZV9YTFNCU2hvcnRDZWxsKGRhdGEpO1xuXHR2YXIgZkJvb2wgPSBkYXRhLnJlYWRfc2hpZnQoMSk7XG5cdHJldHVybiBbY2VsbCwgZkJvb2wsICdiJ107XG59XG5mdW5jdGlvbiB3cml0ZV9CcnRTaG9ydEJvb2woY2VsbCwgbmNlbGwsIG8pIHtcblx0aWYobyA9PSBudWxsKSBvID0gbmV3X2J1Zig1KTtcblx0d3JpdGVfWExTQlNob3J0Q2VsbChuY2VsbCwgbyk7XG5cdG8ud3JpdGVfc2hpZnQoMSwgY2VsbC52ID8gMSA6IDApO1xuXHRyZXR1cm4gbztcbn1cblxuLyogW01TLVhMU0JdIDIuNC4zMDggQnJ0Q2VsbEVycm9yICovXG5mdW5jdGlvbiBwYXJzZV9CcnRDZWxsRXJyb3IoZGF0YSkge1xuXHR2YXIgY2VsbCA9IHBhcnNlX1hMU0JDZWxsKGRhdGEpO1xuXHR2YXIgYkVycm9yID0gZGF0YS5yZWFkX3NoaWZ0KDEpO1xuXHRyZXR1cm4gW2NlbGwsIGJFcnJvciwgJ2UnXTtcbn1cbmZ1bmN0aW9uIHdyaXRlX0JydENlbGxFcnJvcihjZWxsLCBuY2VsbCwgbykge1xuXHRpZihvID09IG51bGwpIG8gPSBuZXdfYnVmKDkpO1xuXHR3cml0ZV9YTFNCQ2VsbChuY2VsbCwgbyk7XG5cdG8ud3JpdGVfc2hpZnQoMSwgY2VsbC52KTtcblx0cmV0dXJuIG87XG59XG5mdW5jdGlvbiBwYXJzZV9CcnRTaG9ydEVycm9yKGRhdGEpIHtcblx0dmFyIGNlbGwgPSBwYXJzZV9YTFNCU2hvcnRDZWxsKGRhdGEpO1xuXHR2YXIgYkVycm9yID0gZGF0YS5yZWFkX3NoaWZ0KDEpO1xuXHRyZXR1cm4gW2NlbGwsIGJFcnJvciwgJ2UnXTtcbn1cbmZ1bmN0aW9uIHdyaXRlX0JydFNob3J0RXJyb3IoY2VsbCwgbmNlbGwsIG8pIHtcblx0aWYobyA9PSBudWxsKSBvID0gbmV3X2J1Zig4KTtcblx0d3JpdGVfWExTQlNob3J0Q2VsbChuY2VsbCwgbyk7XG5cdG8ud3JpdGVfc2hpZnQoMSwgY2VsbC52KTtcblx0by53cml0ZV9zaGlmdCgyLCAwKTtcblx0by53cml0ZV9zaGlmdCgxLCAwKTtcblx0cmV0dXJuIG87XG59XG5cblxuLyogW01TLVhMU0JdIDIuNC4zMTEgQnJ0Q2VsbElzc3QgKi9cbmZ1bmN0aW9uIHBhcnNlX0JydENlbGxJc3N0KGRhdGEpIHtcblx0dmFyIGNlbGwgPSBwYXJzZV9YTFNCQ2VsbChkYXRhKTtcblx0dmFyIGlzc3QgPSBkYXRhLnJlYWRfc2hpZnQoNCk7XG5cdHJldHVybiBbY2VsbCwgaXNzdCwgJ3MnXTtcbn1cbmZ1bmN0aW9uIHdyaXRlX0JydENlbGxJc3N0KGNlbGwsIG5jZWxsLCBvKSB7XG5cdGlmKG8gPT0gbnVsbCkgbyA9IG5ld19idWYoMTIpO1xuXHR3cml0ZV9YTFNCQ2VsbChuY2VsbCwgbyk7XG5cdG8ud3JpdGVfc2hpZnQoNCwgbmNlbGwudik7XG5cdHJldHVybiBvO1xufVxuZnVuY3Rpb24gcGFyc2VfQnJ0U2hvcnRJc3N0KGRhdGEpIHtcblx0dmFyIGNlbGwgPSBwYXJzZV9YTFNCU2hvcnRDZWxsKGRhdGEpO1xuXHR2YXIgaXNzdCA9IGRhdGEucmVhZF9zaGlmdCg0KTtcblx0cmV0dXJuIFtjZWxsLCBpc3N0LCAncyddO1xufVxuZnVuY3Rpb24gd3JpdGVfQnJ0U2hvcnRJc3N0KGNlbGwsIG5jZWxsLCBvKSB7XG5cdGlmKG8gPT0gbnVsbCkgbyA9IG5ld19idWYoOCk7XG5cdHdyaXRlX1hMU0JTaG9ydENlbGwobmNlbGwsIG8pO1xuXHRvLndyaXRlX3NoaWZ0KDQsIG5jZWxsLnYpO1xuXHRyZXR1cm4gbztcbn1cblxuLyogW01TLVhMU0JdIDIuNC4zMTMgQnJ0Q2VsbFJlYWwgKi9cbmZ1bmN0aW9uIHBhcnNlX0JydENlbGxSZWFsKGRhdGEpIHtcblx0dmFyIGNlbGwgPSBwYXJzZV9YTFNCQ2VsbChkYXRhKTtcblx0dmFyIHZhbHVlID0gcGFyc2VfWG51bShkYXRhKTtcblx0cmV0dXJuIFtjZWxsLCB2YWx1ZSwgJ24nXTtcbn1cbmZ1bmN0aW9uIHdyaXRlX0JydENlbGxSZWFsKGNlbGwsIG5jZWxsLCBvKSB7XG5cdGlmKG8gPT0gbnVsbCkgbyA9IG5ld19idWYoMTYpO1xuXHR3cml0ZV9YTFNCQ2VsbChuY2VsbCwgbyk7XG5cdHdyaXRlX1hudW0oY2VsbC52LCBvKTtcblx0cmV0dXJuIG87XG59XG5mdW5jdGlvbiBwYXJzZV9CcnRTaG9ydFJlYWwoZGF0YSkge1xuXHR2YXIgY2VsbCA9IHBhcnNlX1hMU0JTaG9ydENlbGwoZGF0YSk7XG5cdHZhciB2YWx1ZSA9IHBhcnNlX1hudW0oZGF0YSk7XG5cdHJldHVybiBbY2VsbCwgdmFsdWUsICduJ107XG59XG5mdW5jdGlvbiB3cml0ZV9CcnRTaG9ydFJlYWwoY2VsbCwgbmNlbGwsIG8pIHtcblx0aWYobyA9PSBudWxsKSBvID0gbmV3X2J1ZigxMik7XG5cdHdyaXRlX1hMU0JTaG9ydENlbGwobmNlbGwsIG8pO1xuXHR3cml0ZV9YbnVtKGNlbGwudiwgbyk7XG5cdHJldHVybiBvO1xufVxuXG4vKiBbTVMtWExTQl0gMi40LjMxNCBCcnRDZWxsUmsgKi9cbmZ1bmN0aW9uIHBhcnNlX0JydENlbGxSayhkYXRhKSB7XG5cdHZhciBjZWxsID0gcGFyc2VfWExTQkNlbGwoZGF0YSk7XG5cdHZhciB2YWx1ZSA9IHBhcnNlX1JrTnVtYmVyKGRhdGEpO1xuXHRyZXR1cm4gW2NlbGwsIHZhbHVlLCAnbiddO1xufVxuZnVuY3Rpb24gd3JpdGVfQnJ0Q2VsbFJrKGNlbGwsIG5jZWxsLCBvKSB7XG5cdGlmKG8gPT0gbnVsbCkgbyA9IG5ld19idWYoMTIpO1xuXHR3cml0ZV9YTFNCQ2VsbChuY2VsbCwgbyk7XG5cdHdyaXRlX1JrTnVtYmVyKGNlbGwudiwgbyk7XG5cdHJldHVybiBvO1xufVxuZnVuY3Rpb24gcGFyc2VfQnJ0U2hvcnRSayhkYXRhKSB7XG5cdHZhciBjZWxsID0gcGFyc2VfWExTQlNob3J0Q2VsbChkYXRhKTtcblx0dmFyIHZhbHVlID0gcGFyc2VfUmtOdW1iZXIoZGF0YSk7XG5cdHJldHVybiBbY2VsbCwgdmFsdWUsICduJ107XG59XG5mdW5jdGlvbiB3cml0ZV9CcnRTaG9ydFJrKGNlbGwsIG5jZWxsLCBvKSB7XG5cdGlmKG8gPT0gbnVsbCkgbyA9IG5ld19idWYoOCk7XG5cdHdyaXRlX1hMU0JTaG9ydENlbGwobmNlbGwsIG8pO1xuXHR3cml0ZV9Sa051bWJlcihjZWxsLnYsIG8pO1xuXHRyZXR1cm4gbztcbn1cblxuXG4vKiBbTVMtWExTQl0gMi40LjMxNyBCcnRDZWxsU3QgKi9cbmZ1bmN0aW9uIHBhcnNlX0JydENlbGxTdChkYXRhKSB7XG5cdHZhciBjZWxsID0gcGFyc2VfWExTQkNlbGwoZGF0YSk7XG5cdHZhciB2YWx1ZSA9IHBhcnNlX1hMV2lkZVN0cmluZyhkYXRhKTtcblx0cmV0dXJuIFtjZWxsLCB2YWx1ZSwgJ3N0ciddO1xufVxuZnVuY3Rpb24gd3JpdGVfQnJ0Q2VsbFN0KGNlbGwsIG5jZWxsLCBvKSB7XG5cdGlmKG8gPT0gbnVsbCkgbyA9IG5ld19idWYoMTIgKyA0ICogY2VsbC52Lmxlbmd0aCk7XG5cdHdyaXRlX1hMU0JDZWxsKG5jZWxsLCBvKTtcblx0d3JpdGVfWExXaWRlU3RyaW5nKGNlbGwudiwgbyk7XG5cdHJldHVybiBvLmxlbmd0aCA+IG8ubCA/IG8uc2xpY2UoMCwgby5sKSA6IG87XG59XG5mdW5jdGlvbiBwYXJzZV9CcnRTaG9ydFN0KGRhdGEpIHtcblx0dmFyIGNlbGwgPSBwYXJzZV9YTFNCU2hvcnRDZWxsKGRhdGEpO1xuXHR2YXIgdmFsdWUgPSBwYXJzZV9YTFdpZGVTdHJpbmcoZGF0YSk7XG5cdHJldHVybiBbY2VsbCwgdmFsdWUsICdzdHInXTtcbn1cbmZ1bmN0aW9uIHdyaXRlX0JydFNob3J0U3QoY2VsbCwgbmNlbGwsIG8pIHtcblx0aWYobyA9PSBudWxsKSBvID0gbmV3X2J1Zig4ICsgNCAqIGNlbGwudi5sZW5ndGgpO1xuXHR3cml0ZV9YTFNCU2hvcnRDZWxsKG5jZWxsLCBvKTtcblx0d3JpdGVfWExXaWRlU3RyaW5nKGNlbGwudiwgbyk7XG5cdHJldHVybiBvLmxlbmd0aCA+IG8ubCA/IG8uc2xpY2UoMCwgby5sKSA6IG87XG59XG5cbi8qIFtNUy1YTFNCXSAyLjQuNjUzIEJydEZtbGFCb29sICovXG5mdW5jdGlvbiBwYXJzZV9CcnRGbWxhQm9vbChkYXRhLCBsZW5ndGgsIG9wdHMpIHtcblx0dmFyIGVuZCA9IGRhdGEubCArIGxlbmd0aDtcblx0dmFyIGNlbGwgPSBwYXJzZV9YTFNCQ2VsbChkYXRhKTtcblx0Y2VsbC5yID0gb3B0c1snIXJvdyddO1xuXHR2YXIgdmFsdWUgPSBkYXRhLnJlYWRfc2hpZnQoMSk7XG5cdHZhciBvID0gW2NlbGwsIHZhbHVlLCAnYiddO1xuXHRpZihvcHRzLmNlbGxGb3JtdWxhKSB7XG5cdFx0ZGF0YS5sICs9IDI7XG5cdFx0dmFyIGZvcm11bGEgPSBwYXJzZV9YTFNCQ2VsbFBhcnNlZEZvcm11bGEoZGF0YSwgZW5kIC0gZGF0YS5sLCBvcHRzKTtcblx0XHRvWzNdID0gc3RyaW5naWZ5X2Zvcm11bGEoZm9ybXVsYSwgbnVsbC8qcmFuZ2UqLywgY2VsbCwgb3B0cy5zdXBib29rcywgb3B0cyk7LyogVE9ETyAqL1xuXHR9XG5cdGVsc2UgZGF0YS5sID0gZW5kO1xuXHRyZXR1cm4gbztcbn1cblxuLyogW01TLVhMU0JdIDIuNC42NTQgQnJ0Rm1sYUVycm9yICovXG5mdW5jdGlvbiBwYXJzZV9CcnRGbWxhRXJyb3IoZGF0YSwgbGVuZ3RoLCBvcHRzKSB7XG5cdHZhciBlbmQgPSBkYXRhLmwgKyBsZW5ndGg7XG5cdHZhciBjZWxsID0gcGFyc2VfWExTQkNlbGwoZGF0YSk7XG5cdGNlbGwuciA9IG9wdHNbJyFyb3cnXTtcblx0dmFyIHZhbHVlID0gZGF0YS5yZWFkX3NoaWZ0KDEpO1xuXHR2YXIgbyA9IFtjZWxsLCB2YWx1ZSwgJ2UnXTtcblx0aWYob3B0cy5jZWxsRm9ybXVsYSkge1xuXHRcdGRhdGEubCArPSAyO1xuXHRcdHZhciBmb3JtdWxhID0gcGFyc2VfWExTQkNlbGxQYXJzZWRGb3JtdWxhKGRhdGEsIGVuZCAtIGRhdGEubCwgb3B0cyk7XG5cdFx0b1szXSA9IHN0cmluZ2lmeV9mb3JtdWxhKGZvcm11bGEsIG51bGwvKnJhbmdlKi8sIGNlbGwsIG9wdHMuc3VwYm9va3MsIG9wdHMpOy8qIFRPRE8gKi9cblx0fVxuXHRlbHNlIGRhdGEubCA9IGVuZDtcblx0cmV0dXJuIG87XG59XG5cbi8qIFtNUy1YTFNCXSAyLjQuNjU1IEJydEZtbGFOdW0gKi9cbmZ1bmN0aW9uIHBhcnNlX0JydEZtbGFOdW0oZGF0YSwgbGVuZ3RoLCBvcHRzKSB7XG5cdHZhciBlbmQgPSBkYXRhLmwgKyBsZW5ndGg7XG5cdHZhciBjZWxsID0gcGFyc2VfWExTQkNlbGwoZGF0YSk7XG5cdGNlbGwuciA9IG9wdHNbJyFyb3cnXTtcblx0dmFyIHZhbHVlID0gcGFyc2VfWG51bShkYXRhKTtcblx0dmFyIG8gPSBbY2VsbCwgdmFsdWUsICduJ107XG5cdGlmKG9wdHMuY2VsbEZvcm11bGEpIHtcblx0XHRkYXRhLmwgKz0gMjtcblx0XHR2YXIgZm9ybXVsYSA9IHBhcnNlX1hMU0JDZWxsUGFyc2VkRm9ybXVsYShkYXRhLCBlbmQgLSBkYXRhLmwsIG9wdHMpO1xuXHRcdG9bM10gPSBzdHJpbmdpZnlfZm9ybXVsYShmb3JtdWxhLCBudWxsLypyYW5nZSovLCBjZWxsLCBvcHRzLnN1cGJvb2tzLCBvcHRzKTsvKiBUT0RPICovXG5cdH1cblx0ZWxzZSBkYXRhLmwgPSBlbmQ7XG5cdHJldHVybiBvO1xufVxuXG4vKiBbTVMtWExTQl0gMi40LjY1NiBCcnRGbWxhU3RyaW5nICovXG5mdW5jdGlvbiBwYXJzZV9CcnRGbWxhU3RyaW5nKGRhdGEsIGxlbmd0aCwgb3B0cykge1xuXHR2YXIgZW5kID0gZGF0YS5sICsgbGVuZ3RoO1xuXHR2YXIgY2VsbCA9IHBhcnNlX1hMU0JDZWxsKGRhdGEpO1xuXHRjZWxsLnIgPSBvcHRzWychcm93J107XG5cdHZhciB2YWx1ZSA9IHBhcnNlX1hMV2lkZVN0cmluZyhkYXRhKTtcblx0dmFyIG8gPSBbY2VsbCwgdmFsdWUsICdzdHInXTtcblx0aWYob3B0cy5jZWxsRm9ybXVsYSkge1xuXHRcdGRhdGEubCArPSAyO1xuXHRcdHZhciBmb3JtdWxhID0gcGFyc2VfWExTQkNlbGxQYXJzZWRGb3JtdWxhKGRhdGEsIGVuZCAtIGRhdGEubCwgb3B0cyk7XG5cdFx0b1szXSA9IHN0cmluZ2lmeV9mb3JtdWxhKGZvcm11bGEsIG51bGwvKnJhbmdlKi8sIGNlbGwsIG9wdHMuc3VwYm9va3MsIG9wdHMpOy8qIFRPRE8gKi9cblx0fVxuXHRlbHNlIGRhdGEubCA9IGVuZDtcblx0cmV0dXJuIG87XG59XG5cbi8qIFtNUy1YTFNCXSAyLjQuNjgyIEJydE1lcmdlQ2VsbCAqL1xudmFyIHBhcnNlX0JydE1lcmdlQ2VsbCA9IHBhcnNlX1VuY2hlY2tlZFJmWDtcbnZhciB3cml0ZV9CcnRNZXJnZUNlbGwgPSB3cml0ZV9VbmNoZWNrZWRSZlg7XG4vKiBbTVMtWExTQl0gMi40LjEwNyBCcnRCZWdpbk1lcmdlQ2VsbHMgKi9cbmZ1bmN0aW9uIHdyaXRlX0JydEJlZ2luTWVyZ2VDZWxscyhjbnQsIG8pIHtcblx0aWYobyA9PSBudWxsKSBvID0gbmV3X2J1Zig0KTtcblx0by53cml0ZV9zaGlmdCg0LCBjbnQpO1xuXHRyZXR1cm4gbztcbn1cblxuLyogW01TLVhMU0JdIDIuNC42NjIgQnJ0SExpbmsgKi9cbmZ1bmN0aW9uIHBhcnNlX0JydEhMaW5rKGRhdGEsIGxlbmd0aCkge1xuXHR2YXIgZW5kID0gZGF0YS5sICsgbGVuZ3RoO1xuXHR2YXIgcmZ4ID0gcGFyc2VfVW5jaGVja2VkUmZYKGRhdGEsIDE2KTtcblx0dmFyIHJlbElkID0gcGFyc2VfWExOdWxsYWJsZVdpZGVTdHJpbmcoZGF0YSk7XG5cdHZhciBsb2MgPSBwYXJzZV9YTFdpZGVTdHJpbmcoZGF0YSk7XG5cdHZhciB0b29sdGlwID0gcGFyc2VfWExXaWRlU3RyaW5nKGRhdGEpO1xuXHR2YXIgZGlzcGxheSA9IHBhcnNlX1hMV2lkZVN0cmluZyhkYXRhKTtcblx0ZGF0YS5sID0gZW5kO1xuXHR2YXIgbyA9ICh7cmZ4OnJmeCwgcmVsSWQ6cmVsSWQsIGxvYzpsb2MsIGRpc3BsYXk6ZGlzcGxheX0pO1xuXHRpZih0b29sdGlwKSBvLlRvb2x0aXAgPSB0b29sdGlwO1xuXHRyZXR1cm4gbztcbn1cbmZ1bmN0aW9uIHdyaXRlX0JydEhMaW5rKGwsIHJJZCkge1xuXHR2YXIgbyA9IG5ld19idWYoNTArNCoobFsxXS5UYXJnZXQubGVuZ3RoICsgKGxbMV0uVG9vbHRpcCB8fCBcIlwiKS5sZW5ndGgpKTtcblx0d3JpdGVfVW5jaGVja2VkUmZYKHtzOmRlY29kZV9jZWxsKGxbMF0pLCBlOmRlY29kZV9jZWxsKGxbMF0pfSwgbyk7XG5cdHdyaXRlX1JlbElEKFwicklkXCIgKyBySWQsIG8pO1xuXHR2YXIgbG9jaWR4ID0gbFsxXS5UYXJnZXQuaW5kZXhPZihcIiNcIik7XG5cdHZhciBsb2MgPSBsb2NpZHggPT0gLTEgPyBcIlwiIDogbFsxXS5UYXJnZXQuc2xpY2UobG9jaWR4KzEpO1xuXHR3cml0ZV9YTFdpZGVTdHJpbmcobG9jIHx8IFwiXCIsIG8pO1xuXHR3cml0ZV9YTFdpZGVTdHJpbmcobFsxXS5Ub29sdGlwIHx8IFwiXCIsIG8pO1xuXHR3cml0ZV9YTFdpZGVTdHJpbmcoXCJcIiwgbyk7XG5cdHJldHVybiBvLnNsaWNlKDAsIG8ubCk7XG59XG5cbi8qIFtNUy1YTFNCXSAyLjQuNjkyIEJydFBhbmUgKi9cbmZ1bmN0aW9uIHBhcnNlX0JydFBhbmUoLypkYXRhLCBsZW5ndGgsIG9wdHMqLykge1xufVxuXG4vKiBbTVMtWExTQl0gMi40LjYgQnJ0QXJyRm1sYSAqL1xuZnVuY3Rpb24gcGFyc2VfQnJ0QXJyRm1sYShkYXRhLCBsZW5ndGgsIG9wdHMpIHtcblx0dmFyIGVuZCA9IGRhdGEubCArIGxlbmd0aDtcblx0dmFyIHJmeCA9IHBhcnNlX1JmWChkYXRhLCAxNik7XG5cdHZhciBmQWx3YXlzQ2FsYyA9IGRhdGEucmVhZF9zaGlmdCgxKTtcblx0dmFyIG8gPSBbcmZ4XTsgb1syXSA9IGZBbHdheXNDYWxjO1xuXHRpZihvcHRzLmNlbGxGb3JtdWxhKSB7XG5cdFx0dmFyIGZvcm11bGEgPSBwYXJzZV9YTFNCQXJyYXlQYXJzZWRGb3JtdWxhKGRhdGEsIGVuZCAtIGRhdGEubCwgb3B0cyk7XG5cdFx0b1sxXSA9IGZvcm11bGE7XG5cdH0gZWxzZSBkYXRhLmwgPSBlbmQ7XG5cdHJldHVybiBvO1xufVxuXG4vKiBbTVMtWExTQl0gMi40Ljc1MCBCcnRTaHJGbWxhICovXG5mdW5jdGlvbiBwYXJzZV9CcnRTaHJGbWxhKGRhdGEsIGxlbmd0aCwgb3B0cykge1xuXHR2YXIgZW5kID0gZGF0YS5sICsgbGVuZ3RoO1xuXHR2YXIgcmZ4ID0gcGFyc2VfVW5jaGVja2VkUmZYKGRhdGEsIDE2KTtcblx0dmFyIG8gPSBbcmZ4XTtcblx0aWYob3B0cy5jZWxsRm9ybXVsYSkge1xuXHRcdHZhciBmb3JtdWxhID0gcGFyc2VfWExTQlNoYXJlZFBhcnNlZEZvcm11bGEoZGF0YSwgZW5kIC0gZGF0YS5sLCBvcHRzKTtcblx0XHRvWzFdID0gZm9ybXVsYTtcblx0XHRkYXRhLmwgPSBlbmQ7XG5cdH0gZWxzZSBkYXRhLmwgPSBlbmQ7XG5cdHJldHVybiBvO1xufVxuXG4vKiBbTVMtWExTQl0gMi40LjMyMyBCcnRDb2xJbmZvICovXG4vKiBUT0RPOiBvbmNlIFhMUyBDb2xJbmZvIGlzIHNldCwgY29tYmluZSB0aGUgZnVuY3Rpb25zICovXG5mdW5jdGlvbiB3cml0ZV9CcnRDb2xJbmZvKEMsIGNvbCwgbykge1xuXHRpZihvID09IG51bGwpIG8gPSBuZXdfYnVmKDE4KTtcblx0dmFyIHAgPSBjb2xfb2JqX3coQywgY29sKTtcblx0by53cml0ZV9zaGlmdCgtNCwgQyk7XG5cdG8ud3JpdGVfc2hpZnQoLTQsIEMpO1xuXHRvLndyaXRlX3NoaWZ0KDQsIChwLndpZHRoIHx8IDEwKSAqIDI1Nik7XG5cdG8ud3JpdGVfc2hpZnQoNCwgMC8qaXhmZSovKTsgLy8gc3R5bGVcblx0dmFyIGZsYWdzID0gMDtcblx0aWYoY29sLmhpZGRlbikgZmxhZ3MgfD0gMHgwMTtcblx0aWYodHlwZW9mIHAud2lkdGggPT0gJ251bWJlcicpIGZsYWdzIHw9IDB4MDI7XG5cdGlmKGNvbC5sZXZlbCkgZmxhZ3MgfD0gKGNvbC5sZXZlbCA8PCA4KTtcblx0by53cml0ZV9zaGlmdCgyLCBmbGFncyk7IC8vIGJpdCBmbGFnXG5cdHJldHVybiBvO1xufVxuXG4vKiBbTVMtWExTQl0gMi40LjY3OCBCcnRNYXJnaW5zICovXG52YXIgQnJ0TWFyZ2luS2V5cyA9IFtcImxlZnRcIixcInJpZ2h0XCIsXCJ0b3BcIixcImJvdHRvbVwiLFwiaGVhZGVyXCIsXCJmb290ZXJcIl07XG5mdW5jdGlvbiBwYXJzZV9CcnRNYXJnaW5zKGRhdGEpIHtcblx0dmFyIG1hcmdpbnMgPSAoe30pO1xuXHRCcnRNYXJnaW5LZXlzLmZvckVhY2goZnVuY3Rpb24oaykgeyBtYXJnaW5zW2tdID0gcGFyc2VfWG51bShkYXRhLCA4KTsgfSk7XG5cdHJldHVybiBtYXJnaW5zO1xufVxuZnVuY3Rpb24gd3JpdGVfQnJ0TWFyZ2lucyhtYXJnaW5zLCBvKSB7XG5cdGlmKG8gPT0gbnVsbCkgbyA9IG5ld19idWYoNio4KTtcblx0ZGVmYXVsdF9tYXJnaW5zKG1hcmdpbnMpO1xuXHRCcnRNYXJnaW5LZXlzLmZvckVhY2goZnVuY3Rpb24oaykgeyB3cml0ZV9YbnVtKChtYXJnaW5zKVtrXSwgbyk7IH0pO1xuXHRyZXR1cm4gbztcbn1cblxuLyogW01TLVhMU0JdIDIuNC4yOTkgQnJ0QmVnaW5Xc1ZpZXcgKi9cbmZ1bmN0aW9uIHBhcnNlX0JydEJlZ2luV3NWaWV3KGRhdGEpIHtcblx0dmFyIGYgPSBkYXRhLnJlYWRfc2hpZnQoMik7XG5cdGRhdGEubCArPSAyODtcblx0cmV0dXJuIHsgUlRMOiBmICYgMHgyMCB9O1xufVxuZnVuY3Rpb24gd3JpdGVfQnJ0QmVnaW5Xc1ZpZXcod3MsIFdvcmtib29rLCBvKSB7XG5cdGlmKG8gPT0gbnVsbCkgbyA9IG5ld19idWYoMzApO1xuXHR2YXIgZiA9IDB4MzljO1xuXHRpZigoKChXb3JrYm9va3x8e30pLlZpZXdzfHxbXSlbMF18fHt9KS5SVEwpIGYgfD0gMHgyMDtcblx0by53cml0ZV9zaGlmdCgyLCBmKTsgLy8gYml0IGZsYWdcblx0by53cml0ZV9zaGlmdCg0LCAwKTtcblx0by53cml0ZV9zaGlmdCg0LCAwKTsgLy8gdmlldyBmaXJzdCByb3dcblx0by53cml0ZV9zaGlmdCg0LCAwKTsgLy8gdmlldyBmaXJzdCBjb2xcblx0by53cml0ZV9zaGlmdCgxLCAwKTsgLy8gZ3JpZGxpbmUgY29sb3IgSUNWXG5cdG8ud3JpdGVfc2hpZnQoMSwgMCk7XG5cdG8ud3JpdGVfc2hpZnQoMiwgMCk7XG5cdG8ud3JpdGVfc2hpZnQoMiwgMTAwKTsgLy8gem9vbSBzY2FsZVxuXHRvLndyaXRlX3NoaWZ0KDIsIDApO1xuXHRvLndyaXRlX3NoaWZ0KDIsIDApO1xuXHRvLndyaXRlX3NoaWZ0KDIsIDApO1xuXHRvLndyaXRlX3NoaWZ0KDQsIDApOyAvLyB3b3JrYm9vayB2aWV3IGlkXG5cdHJldHVybiBvO1xufVxuXG4vKiBbTVMtWExTQl0gMi40LjMwOSBCcnRDZWxsSWdub3JlRUMgKi9cbmZ1bmN0aW9uIHdyaXRlX0JydENlbGxJZ25vcmVFQyhyZWYpIHtcblx0dmFyIG8gPSBuZXdfYnVmKDI0KTtcblx0by53cml0ZV9zaGlmdCg0LCA0KTtcblx0by53cml0ZV9zaGlmdCg0LCAxKTtcblx0d3JpdGVfVW5jaGVja2VkUmZYKHJlZiwgbyk7XG5cdHJldHVybiBvO1xufVxuXG4vKiBbTVMtWExTQl0gMi40Ljc0OCBCcnRTaGVldFByb3RlY3Rpb24gKi9cbmZ1bmN0aW9uIHdyaXRlX0JydFNoZWV0UHJvdGVjdGlvbihzcCwgbykge1xuXHRpZihvID09IG51bGwpIG8gPSBuZXdfYnVmKDE2KjQrMik7XG5cdG8ud3JpdGVfc2hpZnQoMiwgc3AucGFzc3dvcmQgPyBjcnlwdG9fQ3JlYXRlUGFzc3dvcmRWZXJpZmllcl9NZXRob2QxKHNwLnBhc3N3b3JkKSA6IDApO1xuXHRvLndyaXRlX3NoaWZ0KDQsIDEpOyAvLyB0aGlzIHJlY29yZCBzaG91bGQgbm90IGJlIHdyaXR0ZW4gaWYgbm8gcHJvdGVjdGlvblxuXHRbXG5cdFx0W1wib2JqZWN0c1wiLCAgICAgICAgICAgICBmYWxzZV0sIC8vIGZPYmplY3RzXG5cdFx0W1wic2NlbmFyaW9zXCIsICAgICAgICAgICBmYWxzZV0sIC8vIGZTY2VuYXJpb3Ncblx0XHRbXCJmb3JtYXRDZWxsc1wiLCAgICAgICAgICB0cnVlXSwgLy8gZkZvcm1hdENlbGxzXG5cdFx0W1wiZm9ybWF0Q29sdW1uc1wiLCAgICAgICAgdHJ1ZV0sIC8vIGZGb3JtYXRDb2x1bW5zXG5cdFx0W1wiZm9ybWF0Um93c1wiLCAgICAgICAgICAgdHJ1ZV0sIC8vIGZGb3JtYXRSb3dzXG5cdFx0W1wiaW5zZXJ0Q29sdW1uc1wiLCAgICAgICAgdHJ1ZV0sIC8vIGZJbnNlcnRDb2x1bW5zXG5cdFx0W1wiaW5zZXJ0Um93c1wiLCAgICAgICAgICAgdHJ1ZV0sIC8vIGZJbnNlcnRSb3dzXG5cdFx0W1wiaW5zZXJ0SHlwZXJsaW5rc1wiLCAgICAgdHJ1ZV0sIC8vIGZJbnNlcnRIeXBlcmxpbmtzXG5cdFx0W1wiZGVsZXRlQ29sdW1uc1wiLCAgICAgICAgdHJ1ZV0sIC8vIGZEZWxldGVDb2x1bW5zXG5cdFx0W1wiZGVsZXRlUm93c1wiLCAgICAgICAgICAgdHJ1ZV0sIC8vIGZEZWxldGVSb3dzXG5cdFx0W1wic2VsZWN0TG9ja2VkQ2VsbHNcIiwgICBmYWxzZV0sIC8vIGZTZWxMb2NrZWRDZWxsc1xuXHRcdFtcInNvcnRcIiwgICAgICAgICAgICAgICAgIHRydWVdLCAvLyBmU29ydFxuXHRcdFtcImF1dG9GaWx0ZXJcIiwgICAgICAgICAgIHRydWVdLCAvLyBmQXV0b0ZpbHRlclxuXHRcdFtcInBpdm90VGFibGVzXCIsICAgICAgICAgIHRydWVdLCAvLyBmUGl2b3RUYWJsZXNcblx0XHRbXCJzZWxlY3RVbmxvY2tlZENlbGxzXCIsIGZhbHNlXSAgLy8gZlNlbFVubG9ja2VkQ2VsbHNcblx0XS5mb3JFYWNoKGZ1bmN0aW9uKG4pIHtcbmlmKG5bMV0pIG8ud3JpdGVfc2hpZnQoNCwgc3BbblswXV0gIT0gbnVsbCAmJiAhc3BbblswXV0gPyAxIDogMCk7XG5cdFx0ZWxzZSAgICAgIG8ud3JpdGVfc2hpZnQoNCwgc3BbblswXV0gIT0gbnVsbCAmJiBzcFtuWzBdXSA/IDAgOiAxKTtcblx0fSk7XG5cdHJldHVybiBvO1xufVxuXG5mdW5jdGlvbiBwYXJzZV9CcnREVmFsKC8qZGF0YSwgbGVuZ3RoLCBvcHRzKi8pIHtcbn1cbmZ1bmN0aW9uIHBhcnNlX0JydERWYWwxNCgvKmRhdGEsIGxlbmd0aCwgb3B0cyovKSB7XG59XG4vKiBbTVMtWExTQl0gMi4xLjcuNjEgV29ya3NoZWV0ICovXG5mdW5jdGlvbiBwYXJzZV93c19iaW4oZGF0YSwgX29wdHMsIGlkeCwgcmVscywgd2IsIHRoZW1lcywgc3R5bGVzKSB7XG5cdGlmKCFkYXRhKSByZXR1cm4gZGF0YTtcblx0dmFyIG9wdHMgPSBfb3B0cyB8fCB7fTtcblx0aWYoIXJlbHMpIHJlbHMgPSB7JyFpZCc6e319O1xuXHRpZihERU5TRSAhPSBudWxsICYmIG9wdHMuZGVuc2UgPT0gbnVsbCkgb3B0cy5kZW5zZSA9IERFTlNFO1xuXHR2YXIgcyA9IChvcHRzLmRlbnNlID8gW10gOiB7fSk7XG5cblx0dmFyIHJlZjtcblx0dmFyIHJlZmd1ZXNzID0ge3M6IHtyOjIwMDAwMDAsIGM6MjAwMDAwMH0sIGU6IHtyOjAsIGM6MH0gfTtcblxuXHR2YXIgc3RhdGUgPSBbXTtcblx0dmFyIHBhc3MgPSBmYWxzZSwgZW5kID0gZmFsc2U7XG5cdHZhciByb3csIHAsIGNmLCBSLCBDLCBhZGRyLCBzc3RyLCByciwgY2VsbDtcblx0dmFyIG1lcmdlcyA9IFtdO1xuXHRvcHRzLmJpZmYgPSAxMjtcblx0b3B0c1snIXJvdyddID0gMDtcblxuXHR2YXIgYWkgPSAwLCBhZiA9IGZhbHNlO1xuXG5cdHZhciBhcnJheWYgPSBbXTtcblx0dmFyIHNoYXJlZGYgPSB7fTtcblx0dmFyIHN1cGJvb2tzID0gb3B0cy5zdXBib29rcyB8fCB3Yi5zdXBib29rcyB8fCAoW1tdXSk7XG5cdHN1cGJvb2tzLnNoYXJlZGYgPSBzaGFyZWRmO1xuXHRzdXBib29rcy5hcnJheWYgPSBhcnJheWY7XG5cdHN1cGJvb2tzLlNoZWV0TmFtZXMgPSB3Yi5TaGVldE5hbWVzIHx8IHdiLlNoZWV0cy5tYXAoZnVuY3Rpb24oeCkgeyByZXR1cm4geC5uYW1lOyB9KTtcblx0aWYoIW9wdHMuc3VwYm9va3MpIHtcblx0XHRvcHRzLnN1cGJvb2tzID0gc3VwYm9va3M7XG5cdFx0aWYod2IuTmFtZXMpIGZvcih2YXIgaSA9IDA7IGkgPCB3Yi5OYW1lcy5sZW5ndGg7ICsraSkgc3VwYm9va3NbMF1baSsxXSA9IHdiLk5hbWVzW2ldO1xuXHR9XG5cblx0dmFyIGNvbGluZm8gPSBbXSwgcm93aW5mbyA9IFtdO1xuXHR2YXIgc2VlbmNvbCA9IGZhbHNlO1xuXG5cdFhMU0JSZWNvcmRFbnVtWzB4MDAxMF0gPSB7IG46XCJCcnRTaG9ydFJlYWxcIiwgZjpwYXJzZV9CcnRTaG9ydFJlYWwgfTtcblxuXHRyZWNvcmRob3BwZXIoZGF0YSwgZnVuY3Rpb24gd3NfcGFyc2UodmFsLCBSX24sIFJUKSB7XG5cdFx0aWYoZW5kKSByZXR1cm47XG5cdFx0c3dpdGNoKFJUKSB7XG5cdFx0XHRjYXNlIDB4MDA5NDogLyogJ0JydFdzRGltJyAqL1xuXHRcdFx0XHRyZWYgPSB2YWw7IGJyZWFrO1xuXHRcdFx0Y2FzZSAweDAwMDA6IC8qICdCcnRSb3dIZHInICovXG5cdFx0XHRcdHJvdyA9IHZhbDtcblx0XHRcdFx0aWYob3B0cy5zaGVldFJvd3MgJiYgb3B0cy5zaGVldFJvd3MgPD0gcm93LnIpIGVuZD10cnVlO1xuXHRcdFx0XHRyciA9IGVuY29kZV9yb3coUiA9IHJvdy5yKTtcblx0XHRcdFx0b3B0c1snIXJvdyddID0gcm93LnI7XG5cdFx0XHRcdGlmKHZhbC5oaWRkZW4gfHwgdmFsLmhwdCB8fCB2YWwubGV2ZWwgIT0gbnVsbCkge1xuXHRcdFx0XHRcdGlmKHZhbC5ocHQpIHZhbC5ocHggPSBwdDJweCh2YWwuaHB0KTtcblx0XHRcdFx0XHRyb3dpbmZvW3ZhbC5yXSA9IHZhbDtcblx0XHRcdFx0fVxuXHRcdFx0XHRicmVhaztcblxuXHRcdFx0Y2FzZSAweDAwMDI6IC8qICdCcnRDZWxsUmsnICovXG5cdFx0XHRjYXNlIDB4MDAwMzogLyogJ0JydENlbGxFcnJvcicgKi9cblx0XHRcdGNhc2UgMHgwMDA0OiAvKiAnQnJ0Q2VsbEJvb2wnICovXG5cdFx0XHRjYXNlIDB4MDAwNTogLyogJ0JydENlbGxSZWFsJyAqL1xuXHRcdFx0Y2FzZSAweDAwMDY6IC8qICdCcnRDZWxsU3QnICovXG5cdFx0XHRjYXNlIDB4MDAwNzogLyogJ0JydENlbGxJc3N0JyAqL1xuXHRcdFx0Y2FzZSAweDAwMDg6IC8qICdCcnRGbWxhU3RyaW5nJyAqL1xuXHRcdFx0Y2FzZSAweDAwMDk6IC8qICdCcnRGbWxhTnVtJyAqL1xuXHRcdFx0Y2FzZSAweDAwMEE6IC8qICdCcnRGbWxhQm9vbCcgKi9cblx0XHRcdGNhc2UgMHgwMDBCOiAvKiAnQnJ0Rm1sYUVycm9yJyAqL1xuXHRcdFx0Y2FzZSAweDAwMEQ6IC8qICdCcnRTaG9ydFJrJyAqL1xuXHRcdFx0Y2FzZSAweDAwMEU6IC8qICdCcnRTaG9ydEVycm9yJyAqL1xuXHRcdFx0Y2FzZSAweDAwMEY6IC8qICdCcnRTaG9ydEJvb2wnICovXG5cdFx0XHRjYXNlIDB4MDAxMDogLyogJ0JydFNob3J0UmVhbCcgKi9cblx0XHRcdGNhc2UgMHgwMDExOiAvKiAnQnJ0U2hvcnRTdCcgKi9cblx0XHRcdGNhc2UgMHgwMDEyOiAvKiAnQnJ0U2hvcnRJc3N0JyAqL1xuXHRcdFx0XHRwID0gKHt0OnZhbFsyXX0pO1xuXHRcdFx0XHRzd2l0Y2godmFsWzJdKSB7XG5cdFx0XHRcdFx0Y2FzZSAnbic6IHAudiA9IHZhbFsxXTsgYnJlYWs7XG5cdFx0XHRcdFx0Y2FzZSAncyc6IHNzdHIgPSBzdHJzW3ZhbFsxXV07IHAudiA9IHNzdHIudDsgcC5yID0gc3N0ci5yOyBicmVhaztcblx0XHRcdFx0XHRjYXNlICdiJzogcC52ID0gdmFsWzFdID8gdHJ1ZSA6IGZhbHNlOyBicmVhaztcblx0XHRcdFx0XHRjYXNlICdlJzogcC52ID0gdmFsWzFdOyBpZihvcHRzLmNlbGxUZXh0ICE9PSBmYWxzZSkgcC53ID0gQkVycltwLnZdOyBicmVhaztcblx0XHRcdFx0XHRjYXNlICdzdHInOiBwLnQgPSAncyc7IHAudiA9IHZhbFsxXTsgYnJlYWs7XG5cdFx0XHRcdH1cblx0XHRcdFx0aWYoKGNmID0gc3R5bGVzLkNlbGxYZlt2YWxbMF0uaVN0eWxlUmVmXSkpIHNhZmVfZm9ybWF0KHAsY2YubnVtRm10SWQsbnVsbCxvcHRzLCB0aGVtZXMsIHN0eWxlcyk7XG5cdFx0XHRcdEMgPSB2YWxbMF0uYyA9PSAtMSA/IEMgKyAxIDogdmFsWzBdLmM7XG5cdFx0XHRcdGlmKG9wdHMuZGVuc2UpIHsgaWYoIXNbUl0pIHNbUl0gPSBbXTsgc1tSXVtDXSA9IHA7IH1cblx0XHRcdFx0ZWxzZSBzW2VuY29kZV9jb2woQykgKyBycl0gPSBwO1xuXHRcdFx0XHRpZihvcHRzLmNlbGxGb3JtdWxhKSB7XG5cdFx0XHRcdFx0YWYgPSBmYWxzZTtcblx0XHRcdFx0XHRmb3IoYWkgPSAwOyBhaSA8IGFycmF5Zi5sZW5ndGg7ICsrYWkpIHtcblx0XHRcdFx0XHRcdHZhciBhaWkgPSBhcnJheWZbYWldO1xuXHRcdFx0XHRcdFx0aWYocm93LnIgPj0gYWlpWzBdLnMuciAmJiByb3cuciA8PSBhaWlbMF0uZS5yKVxuXHRcdFx0XHRcdFx0XHRpZihDID49IGFpaVswXS5zLmMgJiYgQyA8PSBhaWlbMF0uZS5jKSB7XG5cdFx0XHRcdFx0XHRcdFx0cC5GID0gZW5jb2RlX3JhbmdlKGFpaVswXSk7IGFmID0gdHJ1ZTtcblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRpZighYWYgJiYgdmFsLmxlbmd0aCA+IDMpIHAuZiA9IHZhbFszXTtcblx0XHRcdFx0fVxuXHRcdFx0XHRpZihyZWZndWVzcy5zLnIgPiByb3cucikgcmVmZ3Vlc3Mucy5yID0gcm93LnI7XG5cdFx0XHRcdGlmKHJlZmd1ZXNzLnMuYyA+IEMpIHJlZmd1ZXNzLnMuYyA9IEM7XG5cdFx0XHRcdGlmKHJlZmd1ZXNzLmUuciA8IHJvdy5yKSByZWZndWVzcy5lLnIgPSByb3cucjtcblx0XHRcdFx0aWYocmVmZ3Vlc3MuZS5jIDwgQykgcmVmZ3Vlc3MuZS5jID0gQztcblx0XHRcdFx0aWYob3B0cy5jZWxsRGF0ZXMgJiYgY2YgJiYgcC50ID09ICduJyAmJiBTU0YuaXNfZGF0ZShTU0YuX3RhYmxlW2NmLm51bUZtdElkXSkpIHtcblx0XHRcdFx0XHR2YXIgX2QgPSBTU0YucGFyc2VfZGF0ZV9jb2RlKHAudik7IGlmKF9kKSB7IHAudCA9ICdkJzsgcC52ID0gbmV3IERhdGUoX2QueSwgX2QubS0xLF9kLmQsX2QuSCxfZC5NLF9kLlMsX2QudSk7IH1cblx0XHRcdFx0fVxuXHRcdFx0XHRicmVhaztcblxuXHRcdFx0Y2FzZSAweDAwMDE6IC8qICdCcnRDZWxsQmxhbmsnICovXG5cdFx0XHRjYXNlIDB4MDAwQzogLyogJ0JydFNob3J0QmxhbmsnICovXG5cdFx0XHRcdGlmKCFvcHRzLnNoZWV0U3R1YnMgfHwgcGFzcykgYnJlYWs7XG5cdFx0XHRcdHAgPSAoe3Q6J3onLHY6dW5kZWZpbmVkfSk7XG5cdFx0XHRcdEMgPSB2YWxbMF0uYyA9PSAtMSA/IEMgKyAxIDogdmFsWzBdLmM7XG5cdFx0XHRcdGlmKG9wdHMuZGVuc2UpIHsgaWYoIXNbUl0pIHNbUl0gPSBbXTsgc1tSXVtDXSA9IHA7IH1cblx0XHRcdFx0ZWxzZSBzW2VuY29kZV9jb2woQykgKyBycl0gPSBwO1xuXHRcdFx0XHRpZihyZWZndWVzcy5zLnIgPiByb3cucikgcmVmZ3Vlc3Mucy5yID0gcm93LnI7XG5cdFx0XHRcdGlmKHJlZmd1ZXNzLnMuYyA+IEMpIHJlZmd1ZXNzLnMuYyA9IEM7XG5cdFx0XHRcdGlmKHJlZmd1ZXNzLmUuciA8IHJvdy5yKSByZWZndWVzcy5lLnIgPSByb3cucjtcblx0XHRcdFx0aWYocmVmZ3Vlc3MuZS5jIDwgQykgcmVmZ3Vlc3MuZS5jID0gQztcblx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdGNhc2UgMHgwMEIwOiAvKiAnQnJ0TWVyZ2VDZWxsJyAqL1xuXHRcdFx0XHRtZXJnZXMucHVzaCh2YWwpOyBicmVhaztcblxuXHRcdFx0Y2FzZSAweDAxRUU6IC8qICdCcnRITGluaycgKi9cblx0XHRcdFx0dmFyIHJlbCA9IHJlbHNbJyFpZCddW3ZhbC5yZWxJZF07XG5cdFx0XHRcdGlmKHJlbCkge1xuXHRcdFx0XHRcdHZhbC5UYXJnZXQgPSByZWwuVGFyZ2V0O1xuXHRcdFx0XHRcdGlmKHZhbC5sb2MpIHZhbC5UYXJnZXQgKz0gXCIjXCIrdmFsLmxvYztcblx0XHRcdFx0XHR2YWwuUmVsID0gcmVsO1xuXHRcdFx0XHR9IGVsc2UgaWYodmFsLnJlbElkID09ICcnKSB7XG5cdFx0XHRcdFx0dmFsLlRhcmdldCA9IFwiI1wiICsgdmFsLmxvYztcblx0XHRcdFx0fVxuXHRcdFx0XHRmb3IoUj12YWwucmZ4LnMucjtSPD12YWwucmZ4LmUucjsrK1IpIGZvcihDPXZhbC5yZngucy5jO0M8PXZhbC5yZnguZS5jOysrQykge1xuXHRcdFx0XHRcdGlmKG9wdHMuZGVuc2UpIHtcblx0XHRcdFx0XHRcdGlmKCFzW1JdKSBzW1JdID0gW107XG5cdFx0XHRcdFx0XHRpZighc1tSXVtDXSkgc1tSXVtDXSA9IHt0Oid6Jyx2OnVuZGVmaW5lZH07XG5cdFx0XHRcdFx0XHRzW1JdW0NdLmwgPSB2YWw7XG5cdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdGFkZHIgPSBlbmNvZGVfY2VsbCh7YzpDLHI6Un0pO1xuXHRcdFx0XHRcdFx0aWYoIXNbYWRkcl0pIHNbYWRkcl0gPSB7dDoneicsdjp1bmRlZmluZWR9O1xuXHRcdFx0XHRcdFx0c1thZGRyXS5sID0gdmFsO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0XHRicmVhaztcblxuXHRcdFx0Y2FzZSAweDAxQUE6IC8qICdCcnRBcnJGbWxhJyAqL1xuXHRcdFx0XHRpZighb3B0cy5jZWxsRm9ybXVsYSkgYnJlYWs7XG5cdFx0XHRcdGFycmF5Zi5wdXNoKHZhbCk7XG5cdFx0XHRcdGNlbGwgPSAoKG9wdHMuZGVuc2UgPyBzW1JdW0NdIDogc1tlbmNvZGVfY29sKEMpICsgcnJdKSk7XG5cdFx0XHRcdGNlbGwuZiA9IHN0cmluZ2lmeV9mb3JtdWxhKHZhbFsxXSwgcmVmZ3Vlc3MsIHtyOnJvdy5yLCBjOkN9LCBzdXBib29rcywgb3B0cyk7XG5cdFx0XHRcdGNlbGwuRiA9IGVuY29kZV9yYW5nZSh2YWxbMF0pO1xuXHRcdFx0XHRicmVhaztcblx0XHRcdGNhc2UgMHgwMUFCOiAvKiAnQnJ0U2hyRm1sYScgKi9cblx0XHRcdFx0aWYoIW9wdHMuY2VsbEZvcm11bGEpIGJyZWFrO1xuXHRcdFx0XHRzaGFyZWRmW2VuY29kZV9jZWxsKHZhbFswXS5zKV0gPSB2YWxbMV07XG5cdFx0XHRcdGNlbGwgPSAob3B0cy5kZW5zZSA/IHNbUl1bQ10gOiBzW2VuY29kZV9jb2woQykgKyBycl0pO1xuXHRcdFx0XHRjZWxsLmYgPSBzdHJpbmdpZnlfZm9ybXVsYSh2YWxbMV0sIHJlZmd1ZXNzLCB7cjpyb3cuciwgYzpDfSwgc3VwYm9va3MsIG9wdHMpO1xuXHRcdFx0XHRicmVhaztcblxuXHRcdFx0LyogaWRlbnRpY2FsIHRvICdDb2xJbmZvJyBpbiBYTFMgKi9cblx0XHRcdGNhc2UgMHgwMDNDOiAvKiAnQnJ0Q29sSW5mbycgKi9cblx0XHRcdFx0aWYoIW9wdHMuY2VsbFN0eWxlcykgYnJlYWs7XG5cdFx0XHRcdHdoaWxlKHZhbC5lID49IHZhbC5zKSB7XG5cdFx0XHRcdFx0Y29saW5mb1t2YWwuZS0tXSA9IHsgd2lkdGg6IHZhbC53LzI1NiwgaGlkZGVuOiAhISh2YWwuZmxhZ3MgJiAweDAxKSwgbGV2ZWw6IHZhbC5sZXZlbCB9O1xuXHRcdFx0XHRcdGlmKCFzZWVuY29sKSB7IHNlZW5jb2wgPSB0cnVlOyBmaW5kX21kd19jb2x3KHZhbC53LzI1Nik7IH1cblx0XHRcdFx0XHRwcm9jZXNzX2NvbChjb2xpbmZvW3ZhbC5lKzFdKTtcblx0XHRcdFx0fVxuXHRcdFx0XHRicmVhaztcblxuXHRcdFx0Y2FzZSAweDAwQTE6IC8qICdCcnRCZWdpbkFGaWx0ZXInICovXG5cdFx0XHRcdHNbJyFhdXRvZmlsdGVyJ10gPSB7IHJlZjplbmNvZGVfcmFuZ2UodmFsKSB9O1xuXHRcdFx0XHRicmVhaztcblxuXHRcdFx0Y2FzZSAweDAxREM6IC8qICdCcnRNYXJnaW5zJyAqL1xuXHRcdFx0XHRzWychbWFyZ2lucyddID0gdmFsO1xuXHRcdFx0XHRicmVhaztcblxuXHRcdFx0Y2FzZSAweDAwOTM6IC8qICdCcnRXc1Byb3AnICovXG5cdFx0XHRcdGlmKCF3Yi5TaGVldHNbaWR4XSkgd2IuU2hlZXRzW2lkeF0gPSB7fTtcblx0XHRcdFx0aWYodmFsLm5hbWUpIHdiLlNoZWV0c1tpZHhdLkNvZGVOYW1lID0gdmFsLm5hbWU7XG5cdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRjYXNlIDB4MDA4OTogLyogJ0JydEJlZ2luV3NWaWV3JyAqL1xuXHRcdFx0XHRpZighd2IuVmlld3MpIHdiLlZpZXdzID0gW3t9XTtcblx0XHRcdFx0aWYoIXdiLlZpZXdzWzBdKSB3Yi5WaWV3c1swXSA9IHt9O1xuXHRcdFx0XHRpZih2YWwuUlRMKSB3Yi5WaWV3c1swXS5SVEwgPSB0cnVlO1xuXHRcdFx0XHRicmVhaztcblxuXHRcdFx0Y2FzZSAweDAxRTU6IC8qICdCcnRXc0ZtdEluZm8nICovXG5cdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRjYXNlIDB4MDA0MDogLyogJ0JydERWYWwnICovXG5cdFx0XHRjYXNlIDB4MDQxRDogLyogJ0JydERWYWwxNCcgKi9cblx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdGNhc2UgMHgwMDk3OiAvKiAnQnJ0UGFuZScgKi9cblx0XHRcdFx0YnJlYWs7XG5cdFx0XHRjYXNlIDB4MDA5ODogLyogJ0JydFNlbCcgKi9cblx0XHRcdGNhc2UgMHgwMEFGOiAvKiAnQnJ0QUZpbHRlckRhdGVHcm91cEl0ZW0nICovXG5cdFx0XHRjYXNlIDB4MDI4NDogLyogJ0JydEFjdGl2ZVgnICovXG5cdFx0XHRjYXNlIDB4MDI3MTogLyogJ0JydEJpZ05hbWUnICovXG5cdFx0XHRjYXNlIDB4MDIzMjogLyogJ0JydEJrSGltJyAqL1xuXHRcdFx0Y2FzZSAweDAxOEM6IC8qICdCcnRCcmsnICovXG5cdFx0XHRjYXNlIDB4MDQ1ODogLyogJ0JydENGSWNvbicgKi9cblx0XHRcdGNhc2UgMHgwNDdBOiAvKiAnQnJ0Q0ZSdWxlRXh0JyAqL1xuXHRcdFx0Y2FzZSAweDAxRDc6IC8qICdCcnRDRlZPJyAqL1xuXHRcdFx0Y2FzZSAweDA0MUE6IC8qICdCcnRDRlZPMTQnICovXG5cdFx0XHRjYXNlIDB4MDI4OTogLyogJ0JydENlbGxJZ25vcmVFQycgKi9cblx0XHRcdGNhc2UgMHgwNDUxOiAvKiAnQnJ0Q2VsbElnbm9yZUVDMTQnICovXG5cdFx0XHRjYXNlIDB4MDAzMTogLyogJ0JydENlbGxNZXRhJyAqL1xuXHRcdFx0Y2FzZSAweDAyNEQ6IC8qICdCcnRDZWxsU21hcnRUYWdQcm9wZXJ0eScgKi9cblx0XHRcdGNhc2UgMHgwMjVGOiAvKiAnQnJ0Q2VsbFdhdGNoJyAqL1xuXHRcdFx0Y2FzZSAweDAyMzQ6IC8qICdCcnRDb2xvcicgKi9cblx0XHRcdGNhc2UgMHgwNDFGOiAvKiAnQnJ0Q29sb3IxNCcgKi9cblx0XHRcdGNhc2UgMHgwMEE4OiAvKiAnQnJ0Q29sb3JGaWx0ZXInICovXG5cdFx0XHRjYXNlIDB4MDBBRTogLyogJ0JydEN1c3RvbUZpbHRlcicgKi9cblx0XHRcdGNhc2UgMHgwNDlDOiAvKiAnQnJ0Q3VzdG9tRmlsdGVyMTQnICovXG5cdFx0XHRjYXNlIDB4MDFGMzogLyogJ0JydERSZWYnICovXG5cdFx0XHRjYXNlIDB4MDFGQjogLyogJ0JydERYRicgKi9cblx0XHRcdGNhc2UgMHgwMjI2OiAvKiAnQnJ0RHJhd2luZycgKi9cblx0XHRcdGNhc2UgMHgwMEFCOiAvKiAnQnJ0RHluYW1pY0ZpbHRlcicgKi9cblx0XHRcdGNhc2UgMHgwMEE3OiAvKiAnQnJ0RmlsdGVyJyAqL1xuXHRcdFx0Y2FzZSAweDA0OTk6IC8qICdCcnRGaWx0ZXIxNCcgKi9cblx0XHRcdGNhc2UgMHgwMEE5OiAvKiAnQnJ0SWNvbkZpbHRlcicgKi9cblx0XHRcdGNhc2UgMHgwNDlEOiAvKiAnQnJ0SWNvbkZpbHRlcjE0JyAqL1xuXHRcdFx0Y2FzZSAweDAyMjc6IC8qICdCcnRMZWdhY3lEcmF3aW5nJyAqL1xuXHRcdFx0Y2FzZSAweDAyMjg6IC8qICdCcnRMZWdhY3lEcmF3aW5nSEYnICovXG5cdFx0XHRjYXNlIDB4MDI5NTogLyogJ0JydExpc3RQYXJ0JyAqL1xuXHRcdFx0Y2FzZSAweDAyN0Y6IC8qICdCcnRPbGVPYmplY3QnICovXG5cdFx0XHRjYXNlIDB4MDFERTogLyogJ0JydFBhZ2VTZXR1cCcgKi9cblx0XHRcdGNhc2UgMHgwMjE5OiAvKiAnQnJ0UGhvbmV0aWNJbmZvJyAqL1xuXHRcdFx0Y2FzZSAweDAxREQ6IC8qICdCcnRQcmludE9wdGlvbnMnICovXG5cdFx0XHRjYXNlIDB4MDIxODogLyogJ0JydFJhbmdlUHJvdGVjdGlvbicgKi9cblx0XHRcdGNhc2UgMHgwNDRGOiAvKiAnQnJ0UmFuZ2VQcm90ZWN0aW9uMTQnICovXG5cdFx0XHRjYXNlIDB4MDJBODogLyogJ0JydFJhbmdlUHJvdGVjdGlvbklzbycgKi9cblx0XHRcdGNhc2UgMHgwNDUwOiAvKiAnQnJ0UmFuZ2VQcm90ZWN0aW9uSXNvMTQnICovXG5cdFx0XHRjYXNlIDB4MDQwMDogLyogJ0JydFJ3RGVzY2VudCcgKi9cblx0XHRcdGNhc2UgMHgwMjk3OiAvKiAnQnJ0U2hlZXRDYWxjUHJvcCcgKi9cblx0XHRcdGNhc2UgMHgwMjE3OiAvKiAnQnJ0U2hlZXRQcm90ZWN0aW9uJyAqL1xuXHRcdFx0Y2FzZSAweDAyQTY6IC8qICdCcnRTaGVldFByb3RlY3Rpb25Jc28nICovXG5cdFx0XHRjYXNlIDB4MDFGODogLyogJ0JydFNsYycgKi9cblx0XHRcdGNhc2UgMHgwNDEzOiAvKiAnQnJ0U3BhcmtsaW5lJyAqL1xuXHRcdFx0Y2FzZSAweDAxQUM6IC8qICdCcnRUYWJsZScgKi9cblx0XHRcdGNhc2UgMHgwMEFBOiAvKiAnQnJ0VG9wMTBGaWx0ZXInICovXG5cdFx0XHRjYXNlIDB4MEMwMDogLyogJ0JydFVpZCcgKi9cblx0XHRcdGNhc2UgMHgwMDMyOiAvKiAnQnJ0VmFsdWVNZXRhJyAqL1xuXHRcdFx0Y2FzZSAweDA4MTY6IC8qICdCcnRXZWJFeHRlbnNpb24nICovXG5cdFx0XHRjYXNlIDB4MDQxNTogLyogJ0JydFdzRm10SW5mb0V4MTQnICovXG5cdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRjYXNlIDB4MDAyMzogLyogJ0JydEZSVEJlZ2luJyAqL1xuXHRcdFx0XHRwYXNzID0gdHJ1ZTsgYnJlYWs7XG5cdFx0XHRjYXNlIDB4MDAyNDogLyogJ0JydEZSVEVuZCcgKi9cblx0XHRcdFx0cGFzcyA9IGZhbHNlOyBicmVhaztcblx0XHRcdGNhc2UgMHgwMDI1OiAvKiAnQnJ0QUNCZWdpbicgKi9cblx0XHRcdFx0c3RhdGUucHVzaChSX24pOyBwYXNzID0gdHJ1ZTsgYnJlYWs7XG5cdFx0XHRjYXNlIDB4MDAyNjogLyogJ0JydEFDRW5kJyAqL1xuXHRcdFx0XHRzdGF0ZS5wb3AoKTsgcGFzcyA9IGZhbHNlOyBicmVhaztcblxuXHRcdFx0ZGVmYXVsdDpcblx0XHRcdFx0aWYoKFJfbnx8XCJcIikuaW5kZXhPZihcIkJlZ2luXCIpID4gMCl7LyogZW1wdHkgKi99XG5cdFx0XHRcdGVsc2UgaWYoKFJfbnx8XCJcIikuaW5kZXhPZihcIkVuZFwiKSA+IDApey8qIGVtcHR5ICovfVxuXHRcdFx0XHRlbHNlIGlmKCFwYXNzIHx8IG9wdHMuV1RGKSB0aHJvdyBuZXcgRXJyb3IoXCJVbmV4cGVjdGVkIHJlY29yZCBcIiArIFJUICsgXCIgXCIgKyBSX24pO1xuXHRcdH1cblx0fSwgb3B0cyk7XG5cblx0ZGVsZXRlIG9wdHMuc3VwYm9va3M7XG5cdGRlbGV0ZSBvcHRzWychcm93J107XG5cblx0aWYoIXNbXCIhcmVmXCJdICYmIChyZWZndWVzcy5zLnIgPCAyMDAwMDAwIHx8IHJlZiAmJiAocmVmLmUuciA+IDAgfHwgcmVmLmUuYyA+IDAgfHwgcmVmLnMuciA+IDAgfHwgcmVmLnMuYyA+IDApKSkgc1tcIiFyZWZcIl0gPSBlbmNvZGVfcmFuZ2UocmVmIHx8IHJlZmd1ZXNzKTtcblx0aWYob3B0cy5zaGVldFJvd3MgJiYgc1tcIiFyZWZcIl0pIHtcblx0XHR2YXIgdG1wcmVmID0gc2FmZV9kZWNvZGVfcmFuZ2Uoc1tcIiFyZWZcIl0pO1xuXHRcdGlmKG9wdHMuc2hlZXRSb3dzIDw9ICt0bXByZWYuZS5yKSB7XG5cdFx0XHR0bXByZWYuZS5yID0gb3B0cy5zaGVldFJvd3MgLSAxO1xuXHRcdFx0aWYodG1wcmVmLmUuciA+IHJlZmd1ZXNzLmUucikgdG1wcmVmLmUuciA9IHJlZmd1ZXNzLmUucjtcblx0XHRcdGlmKHRtcHJlZi5lLnIgPCB0bXByZWYucy5yKSB0bXByZWYucy5yID0gdG1wcmVmLmUucjtcblx0XHRcdGlmKHRtcHJlZi5lLmMgPiByZWZndWVzcy5lLmMpIHRtcHJlZi5lLmMgPSByZWZndWVzcy5lLmM7XG5cdFx0XHRpZih0bXByZWYuZS5jIDwgdG1wcmVmLnMuYykgdG1wcmVmLnMuYyA9IHRtcHJlZi5lLmM7XG5cdFx0XHRzW1wiIWZ1bGxyZWZcIl0gPSBzW1wiIXJlZlwiXTtcblx0XHRcdHNbXCIhcmVmXCJdID0gZW5jb2RlX3JhbmdlKHRtcHJlZik7XG5cdFx0fVxuXHR9XG5cdGlmKG1lcmdlcy5sZW5ndGggPiAwKSBzW1wiIW1lcmdlc1wiXSA9IG1lcmdlcztcblx0aWYoY29saW5mby5sZW5ndGggPiAwKSBzW1wiIWNvbHNcIl0gPSBjb2xpbmZvO1xuXHRpZihyb3dpbmZvLmxlbmd0aCA+IDApIHNbXCIhcm93c1wiXSA9IHJvd2luZm87XG5cdHJldHVybiBzO1xufVxuXG4vKiBUT0RPOiBzb21ldGhpbmcgdXNlZnVsIC0tIHRoaXMgaXMgYSBzdHViICovXG5mdW5jdGlvbiB3cml0ZV93c19iaW5fY2VsbChiYSwgY2VsbCwgUiwgQywgb3B0cywgd3MsIGxhc3Rfc2Vlbikge1xuXHRpZihjZWxsLnYgPT09IHVuZGVmaW5lZCkgcmV0dXJuIGZhbHNlO1xuXHR2YXIgdnYgPSBcIlwiO1xuXHRzd2l0Y2goY2VsbC50KSB7XG5cdFx0Y2FzZSAnYic6IHZ2ID0gY2VsbC52ID8gXCIxXCIgOiBcIjBcIjsgYnJlYWs7XG5cdFx0Y2FzZSAnZCc6IC8vIG5vIEJydENlbGxEYXRlIDooXG5cdFx0XHRjZWxsID0gZHVwKGNlbGwpO1xuXHRcdFx0Y2VsbC56ID0gY2VsbC56IHx8IFNTRi5fdGFibGVbMTRdO1xuXHRcdFx0Y2VsbC52ID0gZGF0ZW51bShwYXJzZURhdGUoY2VsbC52KSk7IGNlbGwudCA9ICduJztcblx0XHRcdGJyZWFrO1xuXHRcdC8qIGZhbGxzIHRocm91Z2ggKi9cblx0XHRjYXNlICduJzogY2FzZSAnZSc6IHZ2ID0gJycrY2VsbC52OyBicmVhaztcblx0XHRkZWZhdWx0OiB2diA9IGNlbGwudjsgYnJlYWs7XG5cdH1cblx0dmFyIG8gPSAoe3I6UiwgYzpDfSk7XG5cdC8qIFRPRE86IGNlbGwgc3R5bGUgKi9cblx0by5zID0gZ2V0X2NlbGxfc3R5bGUob3B0cy5jZWxsWGZzLCBjZWxsLCBvcHRzKTtcblx0aWYoY2VsbC5sKSB3c1snIWxpbmtzJ10ucHVzaChbZW5jb2RlX2NlbGwobyksIGNlbGwubF0pO1xuXHRpZihjZWxsLmMpIHdzWychY29tbWVudHMnXS5wdXNoKFtlbmNvZGVfY2VsbChvKSwgY2VsbC5jXSk7XG5cdHN3aXRjaChjZWxsLnQpIHtcblx0XHRjYXNlICdzJzogY2FzZSAnc3RyJzpcblx0XHRcdGlmKG9wdHMuYm9va1NTVCkge1xuXHRcdFx0XHR2diA9IGdldF9zc3RfaWQob3B0cy5TdHJpbmdzLCAoY2VsbC52KSwgb3B0cy5yZXZTdHJpbmdzKTtcblx0XHRcdFx0by50ID0gXCJzXCI7IG8udiA9IHZ2O1xuXHRcdFx0XHRpZihsYXN0X3NlZW4pIHdyaXRlX3JlY29yZChiYSwgXCJCcnRTaG9ydElzc3RcIiwgd3JpdGVfQnJ0U2hvcnRJc3N0KGNlbGwsIG8pKTtcblx0XHRcdFx0ZWxzZSB3cml0ZV9yZWNvcmQoYmEsIFwiQnJ0Q2VsbElzc3RcIiwgd3JpdGVfQnJ0Q2VsbElzc3QoY2VsbCwgbykpO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0by50ID0gXCJzdHJcIjtcblx0XHRcdFx0aWYobGFzdF9zZWVuKSB3cml0ZV9yZWNvcmQoYmEsIFwiQnJ0U2hvcnRTdFwiLCB3cml0ZV9CcnRTaG9ydFN0KGNlbGwsIG8pKTtcblx0XHRcdFx0ZWxzZSB3cml0ZV9yZWNvcmQoYmEsIFwiQnJ0Q2VsbFN0XCIsIHdyaXRlX0JydENlbGxTdChjZWxsLCBvKSk7XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHRjYXNlICduJzpcblx0XHRcdC8qIFRPRE86IGRldGVybWluZSB0aHJlc2hvbGQgZm9yIFJlYWwgdnMgUksgKi9cblx0XHRcdGlmKGNlbGwudiA9PSAoY2VsbC52IHwgMCkgJiYgY2VsbC52ID4gLTEwMDAgJiYgY2VsbC52IDwgMTAwMCkge1xuXHRcdFx0XHRpZihsYXN0X3NlZW4pIHdyaXRlX3JlY29yZChiYSwgXCJCcnRTaG9ydFJrXCIsIHdyaXRlX0JydFNob3J0UmsoY2VsbCwgbykpO1xuXHRcdFx0XHRlbHNlIHdyaXRlX3JlY29yZChiYSwgXCJCcnRDZWxsUmtcIiwgd3JpdGVfQnJ0Q2VsbFJrKGNlbGwsIG8pKTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdGlmKGxhc3Rfc2Vlbikgd3JpdGVfcmVjb3JkKGJhLCBcIkJydFNob3J0UmVhbFwiLCB3cml0ZV9CcnRTaG9ydFJlYWwoY2VsbCwgbykpO1xuXHRcdFx0XHRlbHNlIHdyaXRlX3JlY29yZChiYSwgXCJCcnRDZWxsUmVhbFwiLCB3cml0ZV9CcnRDZWxsUmVhbChjZWxsLCBvKSk7XG5cdFx0XHR9IHJldHVybiB0cnVlO1xuXHRcdGNhc2UgJ2InOlxuXHRcdFx0by50ID0gXCJiXCI7XG5cdFx0XHRpZihsYXN0X3NlZW4pIHdyaXRlX3JlY29yZChiYSwgXCJCcnRTaG9ydEJvb2xcIiwgd3JpdGVfQnJ0U2hvcnRCb29sKGNlbGwsIG8pKTtcblx0XHRcdGVsc2Ugd3JpdGVfcmVjb3JkKGJhLCBcIkJydENlbGxCb29sXCIsIHdyaXRlX0JydENlbGxCb29sKGNlbGwsIG8pKTtcblx0XHRcdHJldHVybiB0cnVlO1xuXHRcdGNhc2UgJ2UnOlxuXHRcdFx0by50ID0gXCJlXCI7XG5cdFx0XHRpZihsYXN0X3NlZW4pIHdyaXRlX3JlY29yZChiYSwgXCJCcnRTaG9ydEVycm9yXCIsIHdyaXRlX0JydFNob3J0RXJyb3IoY2VsbCwgbykpO1xuXHRcdFx0ZWxzZSB3cml0ZV9yZWNvcmQoYmEsIFwiQnJ0Q2VsbEVycm9yXCIsIHdyaXRlX0JydENlbGxFcnJvcihjZWxsLCBvKSk7XG5cdFx0XHRyZXR1cm4gdHJ1ZTtcblx0fVxuXHRpZihsYXN0X3NlZW4pIHdyaXRlX3JlY29yZChiYSwgXCJCcnRTaG9ydEJsYW5rXCIsIHdyaXRlX0JydFNob3J0QmxhbmsoY2VsbCwgbykpO1xuXHRlbHNlIHdyaXRlX3JlY29yZChiYSwgXCJCcnRDZWxsQmxhbmtcIiwgd3JpdGVfQnJ0Q2VsbEJsYW5rKGNlbGwsIG8pKTtcblx0cmV0dXJuIHRydWU7XG59XG5cbmZ1bmN0aW9uIHdyaXRlX0NFTExUQUJMRShiYSwgd3MsIGlkeCwgb3B0cykge1xuXHR2YXIgcmFuZ2UgPSBzYWZlX2RlY29kZV9yYW5nZSh3c1snIXJlZiddIHx8IFwiQTFcIiksIHJlZiwgcnIgPSBcIlwiLCBjb2xzID0gW107XG5cdHdyaXRlX3JlY29yZChiYSwgJ0JydEJlZ2luU2hlZXREYXRhJyk7XG5cdHZhciBkZW5zZSA9IEFycmF5LmlzQXJyYXkod3MpO1xuXHR2YXIgY2FwID0gcmFuZ2UuZS5yO1xuXHRpZih3c1snIXJvd3MnXSkgY2FwID0gTWF0aC5tYXgocmFuZ2UuZS5yLCB3c1snIXJvd3MnXS5sZW5ndGggLSAxKTtcblx0Zm9yKHZhciBSID0gcmFuZ2Uucy5yOyBSIDw9IGNhcDsgKytSKSB7XG5cdFx0cnIgPSBlbmNvZGVfcm93KFIpO1xuXHRcdC8qIFtBQ0NFTExUQUJMRV0gKi9cblx0XHQvKiBCcnRSb3dIZHIgKi9cblx0XHR3cml0ZV9yb3dfaGVhZGVyKGJhLCB3cywgcmFuZ2UsIFIpO1xuXHRcdHZhciBsYXN0X3NlZW4gPSBmYWxzZTtcblx0XHRpZihSIDw9IHJhbmdlLmUucikgZm9yKHZhciBDID0gcmFuZ2Uucy5jOyBDIDw9IHJhbmdlLmUuYzsgKytDKSB7XG5cdFx0XHQvKiAqMTYzODRDRUxMICovXG5cdFx0XHRpZihSID09PSByYW5nZS5zLnIpIGNvbHNbQ10gPSBlbmNvZGVfY29sKEMpO1xuXHRcdFx0cmVmID0gY29sc1tDXSArIHJyO1xuXHRcdFx0dmFyIGNlbGwgPSBkZW5zZSA/ICh3c1tSXXx8W10pW0NdIDogd3NbcmVmXTtcblx0XHRcdGlmKCFjZWxsKSB7IGxhc3Rfc2VlbiA9IGZhbHNlOyBjb250aW51ZTsgfVxuXHRcdFx0Lyogd3JpdGUgY2VsbCAqL1xuXHRcdFx0bGFzdF9zZWVuID0gd3JpdGVfd3NfYmluX2NlbGwoYmEsIGNlbGwsIFIsIEMsIG9wdHMsIHdzLCBsYXN0X3NlZW4pO1xuXHRcdH1cblx0fVxuXHR3cml0ZV9yZWNvcmQoYmEsICdCcnRFbmRTaGVldERhdGEnKTtcbn1cblxuZnVuY3Rpb24gd3JpdGVfTUVSR0VDRUxMUyhiYSwgd3MpIHtcblx0aWYoIXdzIHx8ICF3c1snIW1lcmdlcyddKSByZXR1cm47XG5cdHdyaXRlX3JlY29yZChiYSwgJ0JydEJlZ2luTWVyZ2VDZWxscycsIHdyaXRlX0JydEJlZ2luTWVyZ2VDZWxscyh3c1snIW1lcmdlcyddLmxlbmd0aCkpO1xuXHR3c1snIW1lcmdlcyddLmZvckVhY2goZnVuY3Rpb24obSkgeyB3cml0ZV9yZWNvcmQoYmEsICdCcnRNZXJnZUNlbGwnLCB3cml0ZV9CcnRNZXJnZUNlbGwobSkpOyB9KTtcblx0d3JpdGVfcmVjb3JkKGJhLCAnQnJ0RW5kTWVyZ2VDZWxscycpO1xufVxuXG5mdW5jdGlvbiB3cml0ZV9DT0xJTkZPUyhiYSwgd3MpIHtcblx0aWYoIXdzIHx8ICF3c1snIWNvbHMnXSkgcmV0dXJuO1xuXHR3cml0ZV9yZWNvcmQoYmEsICdCcnRCZWdpbkNvbEluZm9zJyk7XG5cdHdzWychY29scyddLmZvckVhY2goZnVuY3Rpb24obSwgaSkgeyBpZihtKSB3cml0ZV9yZWNvcmQoYmEsICdCcnRDb2xJbmZvJywgd3JpdGVfQnJ0Q29sSW5mbyhpLCBtKSk7IH0pO1xuXHR3cml0ZV9yZWNvcmQoYmEsICdCcnRFbmRDb2xJbmZvcycpO1xufVxuXG5mdW5jdGlvbiB3cml0ZV9JR05PUkVFQ1MoYmEsIHdzKSB7XG5cdGlmKCF3cyB8fCAhd3NbJyFyZWYnXSkgcmV0dXJuO1xuXHR3cml0ZV9yZWNvcmQoYmEsICdCcnRCZWdpbkNlbGxJZ25vcmVFQ3MnKTtcblx0d3JpdGVfcmVjb3JkKGJhLCAnQnJ0Q2VsbElnbm9yZUVDJywgd3JpdGVfQnJ0Q2VsbElnbm9yZUVDKHNhZmVfZGVjb2RlX3JhbmdlKHdzWychcmVmJ10pKSk7XG5cdHdyaXRlX3JlY29yZChiYSwgJ0JydEVuZENlbGxJZ25vcmVFQ3MnKTtcbn1cblxuZnVuY3Rpb24gd3JpdGVfSExJTktTKGJhLCB3cywgcmVscykge1xuXHQvKiAqQnJ0SExpbmsgKi9cblx0d3NbJyFsaW5rcyddLmZvckVhY2goZnVuY3Rpb24obCkge1xuXHRcdGlmKCFsWzFdLlRhcmdldCkgcmV0dXJuO1xuXHRcdHZhciBySWQgPSBhZGRfcmVscyhyZWxzLCAtMSwgbFsxXS5UYXJnZXQucmVwbGFjZSgvIy4qJC8sIFwiXCIpLCBSRUxTLkhMSU5LKTtcblx0XHR3cml0ZV9yZWNvcmQoYmEsIFwiQnJ0SExpbmtcIiwgd3JpdGVfQnJ0SExpbmsobCwgcklkKSk7XG5cdH0pO1xuXHRkZWxldGUgd3NbJyFsaW5rcyddO1xufVxuZnVuY3Rpb24gd3JpdGVfTEVHQUNZRFJBV0lORyhiYSwgd3MsIGlkeCwgcmVscykge1xuXHQvKiBbQnJ0TGVnYWN5RHJhd2luZ10gKi9cblx0aWYod3NbJyFjb21tZW50cyddLmxlbmd0aCA+IDApIHtcblx0XHR2YXIgcklkID0gYWRkX3JlbHMocmVscywgLTEsIFwiLi4vZHJhd2luZ3Mvdm1sRHJhd2luZ1wiICsgKGlkeCsxKSArIFwiLnZtbFwiLCBSRUxTLlZNTCk7XG5cdFx0d3JpdGVfcmVjb3JkKGJhLCBcIkJydExlZ2FjeURyYXdpbmdcIiwgd3JpdGVfUmVsSUQoXCJySWRcIiArIHJJZCkpO1xuXHRcdHdzWychbGVnYWN5J10gPSBySWQ7XG5cdH1cbn1cblxuZnVuY3Rpb24gd3JpdGVfQVVUT0ZJTFRFUihiYSwgd3MsIHdiLCBpZHgpIHtcblx0aWYoIXdzWychYXV0b2ZpbHRlciddKSByZXR1cm47XG5cdHZhciBkYXRhID0gd3NbJyFhdXRvZmlsdGVyJ107XG5cdHZhciByZWYgPSB0eXBlb2YgZGF0YS5yZWYgPT09IFwic3RyaW5nXCIgPyBkYXRhLnJlZiA6IGVuY29kZV9yYW5nZShkYXRhLnJlZik7XG5cblx0LyogVXBkYXRlIEZpbHRlckRhdGFiYXNlIGRlZmluZWQgbmFtZSBmb3IgdGhlIHdvcmtzaGVldCAqL1xuXHRpZighd2IuV29ya2Jvb2spIHdiLldvcmtib29rID0gKHtTaGVldHM6W119KTtcblx0aWYoIXdiLldvcmtib29rLk5hbWVzKSB3Yi5Xb3JrYm9vay5OYW1lcyA9IFtdO1xuXHR2YXIgbmFtZXMgPSB3Yi5Xb3JrYm9vay5OYW1lcztcblx0dmFyIHJhbmdlID0gZGVjb2RlX3JhbmdlKHJlZik7XG5cdGlmKHJhbmdlLnMuciA9PSByYW5nZS5lLnIpIHsgcmFuZ2UuZS5yID0gZGVjb2RlX3JhbmdlKHdzW1wiIXJlZlwiXSkuZS5yOyByZWYgPSBlbmNvZGVfcmFuZ2UocmFuZ2UpOyB9XG5cdGZvcih2YXIgaSA9IDA7IGkgPCBuYW1lcy5sZW5ndGg7ICsraSkge1xuXHRcdHZhciBuYW1lID0gbmFtZXNbaV07XG5cdFx0aWYobmFtZS5OYW1lICE9ICdfeGxubS5fRmlsdGVyRGF0YWJhc2UnKSBjb250aW51ZTtcblx0XHRpZihuYW1lLlNoZWV0ICE9IGlkeCkgY29udGludWU7XG5cdFx0bmFtZS5SZWYgPSBcIidcIiArIHdiLlNoZWV0TmFtZXNbaWR4XSArIFwiJyFcIiArIHJlZjsgYnJlYWs7XG5cdH1cblx0aWYoaSA9PSBuYW1lcy5sZW5ndGgpIG5hbWVzLnB1c2goeyBOYW1lOiAnX3hsbm0uX0ZpbHRlckRhdGFiYXNlJywgU2hlZXQ6IGlkeCwgUmVmOiBcIidcIiArIHdiLlNoZWV0TmFtZXNbaWR4XSArIFwiJyFcIiArIHJlZiAgfSk7XG5cblx0d3JpdGVfcmVjb3JkKGJhLCBcIkJydEJlZ2luQUZpbHRlclwiLCB3cml0ZV9VbmNoZWNrZWRSZlgoc2FmZV9kZWNvZGVfcmFuZ2UocmVmKSkpO1xuXHQvKiAqRklMVEVSQ09MVU1OICovXG5cdC8qIFtTT1JUU1RBVEVdICovXG5cdC8qIEJydEVuZEFGaWx0ZXIgKi9cblx0d3JpdGVfcmVjb3JkKGJhLCBcIkJydEVuZEFGaWx0ZXJcIik7XG59XG5cbmZ1bmN0aW9uIHdyaXRlX1dTVklFV1MyKGJhLCB3cywgV29ya2Jvb2spIHtcblx0d3JpdGVfcmVjb3JkKGJhLCBcIkJydEJlZ2luV3NWaWV3c1wiKTtcblx0eyAvKiAxKldTVklFVzIgKi9cblx0XHQvKiBbQUNVSURdICovXG5cdFx0d3JpdGVfcmVjb3JkKGJhLCBcIkJydEJlZ2luV3NWaWV3XCIsIHdyaXRlX0JydEJlZ2luV3NWaWV3KHdzLCBXb3JrYm9vaykpO1xuXHRcdC8qIFtCcnRQYW5lXSAqL1xuXHRcdC8qICo0QnJ0U2VsICovXG5cdFx0LyogKjRTWFNFTEVDVCAqL1xuXHRcdC8qICpGUlQgKi9cblx0XHR3cml0ZV9yZWNvcmQoYmEsIFwiQnJ0RW5kV3NWaWV3XCIpO1xuXHR9XG5cdC8qICpGUlQgKi9cblx0d3JpdGVfcmVjb3JkKGJhLCBcIkJydEVuZFdzVmlld3NcIik7XG59XG5cbmZ1bmN0aW9uIHdyaXRlX1dTRk1USU5GTygpIHtcblx0LyogW0FDV1NGTVRJTkZPXSAqL1xuXHQvL3dyaXRlX3JlY29yZChiYSwgXCJCcnRXc0ZtdEluZm9cIiwgd3JpdGVfQnJ0V3NGbXRJbmZvKHdzKSk7XG59XG5cbmZ1bmN0aW9uIHdyaXRlX1NIRUVUUFJPVEVDVChiYSwgd3MpIHtcblx0aWYoIXdzWychcHJvdGVjdCddKSByZXR1cm47XG5cdC8qIFtCcnRTaGVldFByb3RlY3Rpb25Jc29dICovXG5cdHdyaXRlX3JlY29yZChiYSwgXCJCcnRTaGVldFByb3RlY3Rpb25cIiwgd3JpdGVfQnJ0U2hlZXRQcm90ZWN0aW9uKHdzWychcHJvdGVjdCddKSk7XG59XG5cbmZ1bmN0aW9uIHdyaXRlX3dzX2JpbihpZHgsIG9wdHMsIHdiLCByZWxzKSB7XG5cdHZhciBiYSA9IGJ1Zl9hcnJheSgpO1xuXHR2YXIgcyA9IHdiLlNoZWV0TmFtZXNbaWR4XSwgd3MgPSB3Yi5TaGVldHNbc10gfHwge307XG5cdHZhciBjID0gczsgdHJ5IHsgaWYod2IgJiYgd2IuV29ya2Jvb2spIGMgPSB3Yi5Xb3JrYm9vay5TaGVldHNbaWR4XS5Db2RlTmFtZSB8fCBjOyB9IGNhdGNoKGUpIHt9XG5cdHZhciByID0gc2FmZV9kZWNvZGVfcmFuZ2Uod3NbJyFyZWYnXSB8fCBcIkExXCIpO1xuXHRpZihyLmUuYyA+IDB4M0ZGRiB8fCByLmUuciA+IDB4RkZGRkYpIHtcblx0XHRpZihvcHRzLldURikgdGhyb3cgbmV3IEVycm9yKFwiUmFuZ2UgXCIgKyAod3NbJyFyZWYnXSB8fCBcIkExXCIpICsgXCIgZXhjZWVkcyBmb3JtYXQgbGltaXQgQTE6WEZEMTA0ODU3NlwiKTtcblx0XHRyLmUuYyA9IE1hdGgubWluKHIuZS5jLCAweDNGRkYpO1xuXHRcdHIuZS5yID0gTWF0aC5taW4oci5lLmMsIDB4RkZGRkYpO1xuXHR9XG5cdHdzWychbGlua3MnXSA9IFtdO1xuXHQvKiBwYXNzZWQgYmFjayB0byB3cml0ZV96aXAgYW5kIHJlbW92ZWQgdGhlcmUgKi9cblx0d3NbJyFjb21tZW50cyddID0gW107XG5cdHdyaXRlX3JlY29yZChiYSwgXCJCcnRCZWdpblNoZWV0XCIpO1xuXHRpZih3Yi52YmFyYXcpIHdyaXRlX3JlY29yZChiYSwgXCJCcnRXc1Byb3BcIiwgd3JpdGVfQnJ0V3NQcm9wKGMpKTtcblx0d3JpdGVfcmVjb3JkKGJhLCBcIkJydFdzRGltXCIsIHdyaXRlX0JydFdzRGltKHIpKTtcblx0d3JpdGVfV1NWSUVXUzIoYmEsIHdzLCB3Yi5Xb3JrYm9vayk7XG5cdHdyaXRlX1dTRk1USU5GTyhiYSwgd3MpO1xuXHR3cml0ZV9DT0xJTkZPUyhiYSwgd3MsIGlkeCwgb3B0cywgd2IpO1xuXHR3cml0ZV9DRUxMVEFCTEUoYmEsIHdzLCBpZHgsIG9wdHMsIHdiKTtcblx0LyogW0JydFNoZWV0Q2FsY1Byb3BdICovXG5cdHdyaXRlX1NIRUVUUFJPVEVDVChiYSwgd3MpO1xuXHQvKiAqKFtCcnRSYW5nZVByb3RlY3Rpb25Jc29dIEJydFJhbmdlUHJvdGVjdGlvbikgKi9cblx0LyogW1NDRU5NQU5dICovXG5cdHdyaXRlX0FVVE9GSUxURVIoYmEsIHdzLCB3YiwgaWR4KTtcblx0LyogW1NPUlRTVEFURV0gKi9cblx0LyogW0RDT05dICovXG5cdC8qIFtVU0VSU0hWSUVXU10gKi9cblx0d3JpdGVfTUVSR0VDRUxMUyhiYSwgd3MpO1xuXHQvKiBbQnJ0UGhvbmV0aWNJbmZvXSAqL1xuXHQvKiAqQ09ORElUSU9OQUxGT1JNQVRUSU5HICovXG5cdC8qIFtEVkFMU10gKi9cblx0d3JpdGVfSExJTktTKGJhLCB3cywgcmVscyk7XG5cdC8qIFtCcnRQcmludE9wdGlvbnNdICovXG5cdGlmKHdzWychbWFyZ2lucyddKSB3cml0ZV9yZWNvcmQoYmEsIFwiQnJ0TWFyZ2luc1wiLCB3cml0ZV9CcnRNYXJnaW5zKHdzWychbWFyZ2lucyddKSk7XG5cdC8qIFtCcnRQYWdlU2V0dXBdICovXG5cdC8qIFtIRUFERVJGT09URVJdICovXG5cdC8qIFtSV0JSS10gKi9cblx0LyogW0NPTEJSS10gKi9cblx0LyogKkJydEJpZ05hbWUgKi9cblx0LyogW0NFTExXQVRDSEVTXSAqL1xuXHRpZighb3B0cyB8fCBvcHRzLmlnbm9yZUVDIHx8IChvcHRzLmlnbm9yZUVDID09ICh2b2lkIDApKSkgd3JpdGVfSUdOT1JFRUNTKGJhLCB3cyk7XG5cdC8qIFtTTUFSVFRBR1NdICovXG5cdC8qIFtCcnREcmF3aW5nXSAqL1xuXHR3cml0ZV9MRUdBQ1lEUkFXSU5HKGJhLCB3cywgaWR4LCByZWxzKTtcblx0LyogW0JydExlZ2FjeURyYXdpbmdIRl0gKi9cblx0LyogW0JydEJrSGltXSAqL1xuXHQvKiBbT0xFT0JKRUNUU10gKi9cblx0LyogW0FDVElWRVhDT05UUk9MU10gKi9cblx0LyogW1dFQlBVQklURU1TXSAqL1xuXHQvKiBbTElTVFBBUlRTXSAqL1xuXHQvKiBGUlRXT1JLU0hFRVQgKi9cblx0d3JpdGVfcmVjb3JkKGJhLCBcIkJydEVuZFNoZWV0XCIpO1xuXHRyZXR1cm4gYmEuZW5kKCk7XG59XG5SRUxTLkNIQVJUID0gXCJodHRwOi8vc2NoZW1hcy5vcGVueG1sZm9ybWF0cy5vcmcvb2ZmaWNlRG9jdW1lbnQvMjAwNi9yZWxhdGlvbnNoaXBzL2NoYXJ0XCI7XG5SRUxTLkNIQVJURVggPSBcImh0dHA6Ly9zY2hlbWFzLm1pY3Jvc29mdC5jb20vb2ZmaWNlLzIwMTQvcmVsYXRpb25zaGlwcy9jaGFydEV4XCI7XG5cbmZ1bmN0aW9uIHBhcnNlX0NhY2hlKGRhdGEpIHtcblx0dmFyIGNvbCA9IFtdO1xuXHR2YXIgbnVtID0gZGF0YS5tYXRjaCgvXjxjOm51bUNhY2hlPi8pO1xuXHR2YXIgZjtcblxuXHQvKiAyMS4yLjIuMTUwIHB0IENUX051bVZhbCAqL1xuXHQoZGF0YS5tYXRjaCgvPGM6cHQgaWR4PVwiKFxcZCopXCI+KC4qPyk8XFwvYzpwdD4vbWcpfHxbXSkuZm9yRWFjaChmdW5jdGlvbihwdCkge1xuXHRcdHZhciBxID0gcHQubWF0Y2goLzxjOnB0IGlkeD1cIihcXGQqPylcIj48Yzp2PiguKik8XFwvYzp2PjxcXC9jOnB0Pi8pO1xuXHRcdGlmKCFxKSByZXR1cm47XG5cdFx0Y29sWytxWzFdXSA9IG51bSA/ICtxWzJdIDogcVsyXTtcblx0fSk7XG5cblx0LyogMjEuMi4yLjcxIGZvcm1hdENvZGUgQ1RfWHN0cmluZyAqL1xuXHR2YXIgbmYgPSB1bmVzY2FwZXhtbCgoZGF0YS5tYXRjaCgvPGM6Zm9ybWF0Q29kZT4oW1xcc1xcU10qPyk8XFwvYzpmb3JtYXRDb2RlPi8pIHx8IFtcIlwiLFwiR2VuZXJhbFwiXSlbMV0pO1xuXG5cdChkYXRhLm1hdGNoKC88YzpmPiguKj8pPFxcL2M6Zj4vbWcpfHxbXSkuZm9yRWFjaChmdW5jdGlvbihGKSB7IGYgPSBGLnJlcGxhY2UoLzwuKj8+L2csXCJcIik7IH0pO1xuXG5cdHJldHVybiBbY29sLCBuZiwgZl07XG59XG5cbi8qIDIxLjIgRHJhd2luZ01MIC0gQ2hhcnRzICovXG5mdW5jdGlvbiBwYXJzZV9jaGFydChkYXRhLCBuYW1lLCBvcHRzLCByZWxzLCB3YiwgY3NoZWV0KSB7XG5cdHZhciBjcyA9ICgoY3NoZWV0IHx8IHtcIiF0eXBlXCI6XCJjaGFydFwifSkpO1xuXHRpZighZGF0YSkgcmV0dXJuIGNzaGVldDtcblx0LyogMjEuMi4yLjI3IGNoYXJ0IENUX0NoYXJ0ICovXG5cblx0dmFyIEMgPSAwLCBSID0gMCwgY29sID0gXCJBXCI7XG5cdHZhciByZWZndWVzcyA9IHtzOiB7cjoyMDAwMDAwLCBjOjIwMDAwMDB9LCBlOiB7cjowLCBjOjB9IH07XG5cblx0LyogMjEuMi4yLjEyMCBudW1DYWNoZSBDVF9OdW1EYXRhICovXG5cdChkYXRhLm1hdGNoKC88YzpudW1DYWNoZT5bXFxzXFxTXSo/PFxcL2M6bnVtQ2FjaGU+L2dtKXx8W10pLmZvckVhY2goZnVuY3Rpb24obmMpIHtcblx0XHR2YXIgY2FjaGUgPSBwYXJzZV9DYWNoZShuYyk7XG5cdFx0cmVmZ3Vlc3Mucy5yID0gcmVmZ3Vlc3Mucy5jID0gMDtcblx0XHRyZWZndWVzcy5lLmMgPSBDO1xuXHRcdGNvbCA9IGVuY29kZV9jb2woQyk7XG5cdFx0Y2FjaGVbMF0uZm9yRWFjaChmdW5jdGlvbihuLGkpIHtcblx0XHRcdGNzW2NvbCArIGVuY29kZV9yb3coaSldID0ge3Q6J24nLCB2Om4sIHo6Y2FjaGVbMV0gfTtcblx0XHRcdFIgPSBpO1xuXHRcdH0pO1xuXHRcdGlmKHJlZmd1ZXNzLmUuciA8IFIpIHJlZmd1ZXNzLmUuciA9IFI7XG5cdFx0KytDO1xuXHR9KTtcblx0aWYoQyA+IDApIGNzW1wiIXJlZlwiXSA9IGVuY29kZV9yYW5nZShyZWZndWVzcyk7XG5cdHJldHVybiBjcztcbn1cblJFTFMuQ1MgPSBcImh0dHA6Ly9zY2hlbWFzLm9wZW54bWxmb3JtYXRzLm9yZy9vZmZpY2VEb2N1bWVudC8yMDA2L3JlbGF0aW9uc2hpcHMvY2hhcnRzaGVldFwiO1xuXG52YXIgQ1NfWE1MX1JPT1QgPSB3cml0ZXh0YWcoJ2NoYXJ0c2hlZXQnLCBudWxsLCB7XG5cdCd4bWxucyc6IFhNTE5TLm1haW5bMF0sXG5cdCd4bWxuczpyJzogWE1MTlMuclxufSk7XG5cbi8qIDE4LjMgV29ya3NoZWV0cyBhbHNvIGNvdmVycyBDaGFydHNoZWV0cyAqL1xuZnVuY3Rpb24gcGFyc2VfY3NfeG1sKGRhdGEsIG9wdHMsIGlkeCwgcmVscywgd2IpIHtcblx0aWYoIWRhdGEpIHJldHVybiBkYXRhO1xuXHQvKiAxOC4zLjEuMTIgY2hhcnRzaGVldCBDVF9DaGFydFNoZWV0ICovXG5cdGlmKCFyZWxzKSByZWxzID0geychaWQnOnt9fTtcblx0dmFyIHMgPSAoeychdHlwZSc6XCJjaGFydFwiLCAnIWRyYXdlbCc6bnVsbCwgJyFyZWwnOlwiXCJ9KTtcblx0dmFyIG07XG5cblx0LyogMTguMy4xLjgzIHNoZWV0UHIgQ1RfQ2hhcnRzaGVldFByICovXG5cdHZhciBzaGVldFByID0gZGF0YS5tYXRjaChzaGVldHBycmVnZXgpO1xuXHRpZihzaGVldFByKSBwYXJzZV93c194bWxfc2hlZXRwcihzaGVldFByWzBdLCBzLCB3YiwgaWR4KTtcblxuXHQvKiAxOC4zLjEuMzYgZHJhd2luZyBDVF9EcmF3aW5nICovXG5cdGlmKChtID0gZGF0YS5tYXRjaCgvZHJhd2luZyByOmlkPVwiKC4qPylcIi8pKSkgc1snIXJlbCddID0gbVsxXTtcblxuXHRpZihyZWxzWychaWQnXVtzWychcmVsJ11dKSBzWychZHJhd2VsJ10gPSByZWxzWychaWQnXVtzWychcmVsJ11dO1xuXHRyZXR1cm4gcztcbn1cbmZ1bmN0aW9uIHdyaXRlX2NzX3htbChpZHgsIG9wdHMsIHdiLCByZWxzKSB7XG5cdHZhciBvID0gW1hNTF9IRUFERVIsIENTX1hNTF9ST09UXTtcblx0b1tvLmxlbmd0aF0gPSB3cml0ZXh0YWcoXCJkcmF3aW5nXCIsIG51bGwsIHtcInI6aWRcIjogXCJySWQxXCJ9KTtcblx0YWRkX3JlbHMocmVscywgLTEsIFwiLi4vZHJhd2luZ3MvZHJhd2luZ1wiICsgKGlkeCsxKSArIFwiLnhtbFwiLCBSRUxTLkRSQVcpO1xuXHRpZihvLmxlbmd0aD4yKSB7IG9bby5sZW5ndGhdID0gKCc8L2NoYXJ0c2hlZXQ+Jyk7IG9bMV09b1sxXS5yZXBsYWNlKFwiLz5cIixcIj5cIik7IH1cblx0cmV0dXJuIG8uam9pbihcIlwiKTtcbn1cblxuLyogW01TLVhMU0JdIDIuNC4zMzEgQnJ0Q3NQcm9wICovXG5mdW5jdGlvbiBwYXJzZV9CcnRDc1Byb3AoZGF0YSwgbGVuZ3RoKSB7XG5cdGRhdGEubCArPSAxMDtcblx0dmFyIG5hbWUgPSBwYXJzZV9YTFdpZGVTdHJpbmcoZGF0YSwgbGVuZ3RoIC0gMTApO1xuXHRyZXR1cm4geyBuYW1lOiBuYW1lIH07XG59XG5cbi8qIFtNUy1YTFNCXSAyLjEuNy43IENoYXJ0IFNoZWV0ICovXG5mdW5jdGlvbiBwYXJzZV9jc19iaW4oZGF0YSwgb3B0cywgaWR4LCByZWxzLCB3Yikge1xuXHRpZighZGF0YSkgcmV0dXJuIGRhdGE7XG5cdGlmKCFyZWxzKSByZWxzID0geychaWQnOnt9fTtcblx0dmFyIHMgPSB7JyF0eXBlJzpcImNoYXJ0XCIsICchZHJhd2VsJzpudWxsLCAnIXJlbCc6XCJcIn07XG5cdHZhciBzdGF0ZSA9IFtdO1xuXHR2YXIgcGFzcyA9IGZhbHNlO1xuXHRyZWNvcmRob3BwZXIoZGF0YSwgZnVuY3Rpb24gY3NfcGFyc2UodmFsLCBSX24sIFJUKSB7XG5cdFx0c3dpdGNoKFJUKSB7XG5cblx0XHRcdGNhc2UgMHgwMjI2OiAvKiAnQnJ0RHJhd2luZycgKi9cblx0XHRcdFx0c1snIXJlbCddID0gdmFsOyBicmVhaztcblxuXHRcdFx0Y2FzZSAweDAyOEI6IC8qICdCcnRDc1Byb3AnICovXG5cdFx0XHRcdGlmKCF3Yi5TaGVldHNbaWR4XSkgd2IuU2hlZXRzW2lkeF0gPSB7fTtcblx0XHRcdFx0aWYodmFsLm5hbWUpIHdiLlNoZWV0c1tpZHhdLkNvZGVOYW1lID0gdmFsLm5hbWU7XG5cdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRjYXNlIDB4MDIzMjogLyogJ0JydEJrSGltJyAqL1xuXHRcdFx0Y2FzZSAweDAyOEM6IC8qICdCcnRDc1BhZ2VTZXR1cCcgKi9cblx0XHRcdGNhc2UgMHgwMjlEOiAvKiAnQnJ0Q3NQcm90ZWN0aW9uJyAqL1xuXHRcdFx0Y2FzZSAweDAyQTc6IC8qICdCcnRDc1Byb3RlY3Rpb25Jc28nICovXG5cdFx0XHRjYXNlIDB4MDIyNzogLyogJ0JydExlZ2FjeURyYXdpbmcnICovXG5cdFx0XHRjYXNlIDB4MDIyODogLyogJ0JydExlZ2FjeURyYXdpbmdIRicgKi9cblx0XHRcdGNhc2UgMHgwMURDOiAvKiAnQnJ0TWFyZ2lucycgKi9cblx0XHRcdGNhc2UgMHgwQzAwOiAvKiAnQnJ0VWlkJyAqL1xuXHRcdFx0XHRicmVhaztcblxuXHRcdFx0Y2FzZSAweDAwMjM6IC8qICdCcnRGUlRCZWdpbicgKi9cblx0XHRcdFx0cGFzcyA9IHRydWU7IGJyZWFrO1xuXHRcdFx0Y2FzZSAweDAwMjQ6IC8qICdCcnRGUlRFbmQnICovXG5cdFx0XHRcdHBhc3MgPSBmYWxzZTsgYnJlYWs7XG5cdFx0XHRjYXNlIDB4MDAyNTogLyogJ0JydEFDQmVnaW4nICovXG5cdFx0XHRcdHN0YXRlLnB1c2goUl9uKTsgYnJlYWs7XG5cdFx0XHRjYXNlIDB4MDAyNjogLyogJ0JydEFDRW5kJyAqL1xuXHRcdFx0XHRzdGF0ZS5wb3AoKTsgYnJlYWs7XG5cblx0XHRcdGRlZmF1bHQ6XG5cdFx0XHRcdGlmKChSX258fFwiXCIpLmluZGV4T2YoXCJCZWdpblwiKSA+IDApIHN0YXRlLnB1c2goUl9uKTtcblx0XHRcdFx0ZWxzZSBpZigoUl9ufHxcIlwiKS5pbmRleE9mKFwiRW5kXCIpID4gMCkgc3RhdGUucG9wKCk7XG5cdFx0XHRcdGVsc2UgaWYoIXBhc3MgfHwgb3B0cy5XVEYpIHRocm93IG5ldyBFcnJvcihcIlVuZXhwZWN0ZWQgcmVjb3JkIFwiICsgUlQgKyBcIiBcIiArIFJfbik7XG5cdFx0fVxuXHR9LCBvcHRzKTtcblxuXHRpZihyZWxzWychaWQnXVtzWychcmVsJ11dKSBzWychZHJhd2VsJ10gPSByZWxzWychaWQnXVtzWychcmVsJ11dO1xuXHRyZXR1cm4gcztcbn1cbmZ1bmN0aW9uIHdyaXRlX2NzX2JpbigpIHtcblx0dmFyIGJhID0gYnVmX2FycmF5KCk7XG5cdHdyaXRlX3JlY29yZChiYSwgXCJCcnRCZWdpblNoZWV0XCIpO1xuXHQvKiBbQnJ0Q3NQcm9wXSAqL1xuXHQvKiBDU1ZJRVdTICovXG5cdC8qIFtbQnJ0Q3NQcm90ZWN0aW9uSXNvXSBCcnRDc1Byb3RlY3Rpb25dICovXG5cdC8qIFtVU0VSQ1NWSUVXU10gKi9cblx0LyogW0JydE1hcmdpbnNdICovXG5cdC8qIFtCcnRDc1BhZ2VTZXR1cF0gKi9cblx0LyogW0hFQURFUkZPT1RFUl0gKi9cblx0LyogQnJ0RHJhd2luZyAqL1xuXHQvKiBbQnJ0TGVnYWN5RHJhd2luZ10gKi9cblx0LyogW0JydExlZ2FjeURyYXdpbmdIRl0gKi9cblx0LyogW0JydEJrSGltXSAqL1xuXHQvKiBbV0VCUFVCSVRFTVNdICovXG5cdC8qIEZSVENIQVJUU0hFRVQgKi9cblx0d3JpdGVfcmVjb3JkKGJhLCBcIkJydEVuZFNoZWV0XCIpO1xuXHRyZXR1cm4gYmEuZW5kKCk7XG59XG4vKiAxOC4yLjI4IChDVF9Xb3JrYm9va1Byb3RlY3Rpb24pIERlZmF1bHRzICovXG52YXIgV0JQcm9wc0RlZiA9IFtcblx0WydhbGxvd1JlZnJlc2hRdWVyeScsICAgICAgICAgICBmYWxzZSwgXCJib29sXCJdLFxuXHRbJ2F1dG9Db21wcmVzc1BpY3R1cmVzJywgICAgICAgIHRydWUsICBcImJvb2xcIl0sXG5cdFsnYmFja3VwRmlsZScsICAgICAgICAgICAgICAgICAgZmFsc2UsIFwiYm9vbFwiXSxcblx0WydjaGVja0NvbXBhdGliaWxpdHknLCAgICAgICAgICBmYWxzZSwgXCJib29sXCJdLFxuXHRbJ0NvZGVOYW1lJywgICAgICAgICAgICAgICAgICAgICcnXSxcblx0WydkYXRlMTkwNCcsICAgICAgICAgICAgICAgICAgICBmYWxzZSwgXCJib29sXCJdLFxuXHRbJ2RlZmF1bHRUaGVtZVZlcnNpb24nLCAgICAgICAgIDAsICAgICAgXCJpbnRcIl0sXG5cdFsnZmlsdGVyUHJpdmFjeScsICAgICAgICAgICAgICAgZmFsc2UsIFwiYm9vbFwiXSxcblx0WydoaWRlUGl2b3RGaWVsZExpc3QnLCAgICAgICAgICBmYWxzZSwgXCJib29sXCJdLFxuXHRbJ3Byb21wdGVkU29sdXRpb25zJywgICAgICAgICAgIGZhbHNlLCBcImJvb2xcIl0sXG5cdFsncHVibGlzaEl0ZW1zJywgICAgICAgICAgICAgICAgZmFsc2UsIFwiYm9vbFwiXSxcblx0WydyZWZyZXNoQWxsQ29ubmVjdGlvbnMnLCAgICAgICBmYWxzZSwgXCJib29sXCJdLFxuXHRbJ3NhdmVFeHRlcm5hbExpbmtWYWx1ZXMnLCAgICAgIHRydWUsICBcImJvb2xcIl0sXG5cdFsnc2hvd0JvcmRlclVuc2VsZWN0ZWRUYWJsZXMnLCAgdHJ1ZSwgIFwiYm9vbFwiXSxcblx0WydzaG93SW5rQW5ub3RhdGlvbicsICAgICAgICAgICB0cnVlLCAgXCJib29sXCJdLFxuXHRbJ3Nob3dPYmplY3RzJywgICAgICAgICAgICAgICAgICdhbGwnXSxcblx0WydzaG93UGl2b3RDaGFydEZpbHRlcicsICAgICAgICBmYWxzZSwgXCJib29sXCJdLFxuXHRbJ3VwZGF0ZUxpbmtzJywgJ3VzZXJTZXQnXVxuXTtcblxuLyogMTguMi4zMCAoQ1RfQm9va1ZpZXcpIERlZmF1bHRzICovXG52YXIgV0JWaWV3RGVmID0gW1xuXHRbJ2FjdGl2ZVRhYicsICAgICAgICAgICAgICAgICAgIDAsICAgICAgXCJpbnRcIl0sXG5cdFsnYXV0b0ZpbHRlckRhdGVHcm91cGluZycsICAgICAgdHJ1ZSwgIFwiYm9vbFwiXSxcblx0WydmaXJzdFNoZWV0JywgICAgICAgICAgICAgICAgICAwLCAgICAgIFwiaW50XCJdLFxuXHRbJ21pbmltaXplZCcsICAgICAgICAgICAgICAgICAgIGZhbHNlLCBcImJvb2xcIl0sXG5cdFsnc2hvd0hvcml6b250YWxTY3JvbGwnLCAgICAgICAgdHJ1ZSwgIFwiYm9vbFwiXSxcblx0WydzaG93U2hlZXRUYWJzJywgICAgICAgICAgICAgICB0cnVlLCAgXCJib29sXCJdLFxuXHRbJ3Nob3dWZXJ0aWNhbFNjcm9sbCcsICAgICAgICAgIHRydWUsICBcImJvb2xcIl0sXG5cdFsndGFiUmF0aW8nLCAgICAgICAgICAgICAgICAgICAgNjAwLCAgICBcImludFwiXSxcblx0Wyd2aXNpYmlsaXR5JywgICAgICAgICAgICAgICAgICAndmlzaWJsZSddXG5cdC8vd2luZG93e0hlaWdodCxXaWR0aH0sIHt4LHl9V2luZG93XG5dO1xuXG4vKiAxOC4yLjE5IChDVF9TaGVldCkgRGVmYXVsdHMgKi9cbnZhciBTaGVldERlZiA9IFtcblx0Ly9bJ3N0YXRlJywgJ3Zpc2libGUnXVxuXTtcblxuLyogMTguMi4yICAoQ1RfQ2FsY1ByKSBEZWZhdWx0cyAqL1xudmFyIENhbGNQckRlZiA9IFtcblx0WydjYWxjQ29tcGxldGVkJywgJ3RydWUnXSxcblx0WydjYWxjTW9kZScsICdhdXRvJ10sXG5cdFsnY2FsY09uU2F2ZScsICd0cnVlJ10sXG5cdFsnY29uY3VycmVudENhbGMnLCAndHJ1ZSddLFxuXHRbJ2Z1bGxDYWxjT25Mb2FkJywgJ2ZhbHNlJ10sXG5cdFsnZnVsbFByZWNpc2lvbicsICd0cnVlJ10sXG5cdFsnaXRlcmF0ZScsICdmYWxzZSddLFxuXHRbJ2l0ZXJhdGVDb3VudCcsICcxMDAnXSxcblx0WydpdGVyYXRlRGVsdGEnLCAnMC4wMDEnXSxcblx0WydyZWZNb2RlJywgJ0ExJ11cbl07XG5cbi8qIDE4LjIuMyAoQ1RfQ3VzdG9tV29ya2Jvb2tWaWV3KSBEZWZhdWx0cyAqL1xuLyp2YXIgQ3VzdG9tV0JWaWV3RGVmID0gW1xuXHRbJ2F1dG9VcGRhdGUnLCAnZmFsc2UnXSxcblx0WydjaGFuZ2VzU2F2ZWRXaW4nLCAnZmFsc2UnXSxcblx0WydpbmNsdWRlSGlkZGVuUm93Q29sJywgJ3RydWUnXSxcblx0WydpbmNsdWRlUHJpbnRTZXR0aW5ncycsICd0cnVlJ10sXG5cdFsnbWF4aW1pemVkJywgJ2ZhbHNlJ10sXG5cdFsnbWluaW1pemVkJywgJ2ZhbHNlJ10sXG5cdFsnb25seVN5bmMnLCAnZmFsc2UnXSxcblx0WydwZXJzb25hbFZpZXcnLCAnZmFsc2UnXSxcblx0WydzaG93Q29tbWVudHMnLCAnY29tbUluZGljYXRvciddLFxuXHRbJ3Nob3dGb3JtdWxhQmFyJywgJ3RydWUnXSxcblx0WydzaG93SG9yaXpvbnRhbFNjcm9sbCcsICd0cnVlJ10sXG5cdFsnc2hvd09iamVjdHMnLCAnYWxsJ10sXG5cdFsnc2hvd1NoZWV0VGFicycsICd0cnVlJ10sXG5cdFsnc2hvd1N0YXR1c2JhcicsICd0cnVlJ10sXG5cdFsnc2hvd1ZlcnRpY2FsU2Nyb2xsJywgJ3RydWUnXSxcblx0Wyd0YWJSYXRpbycsICc2MDAnXSxcblx0Wyd4V2luZG93JywgJzAnXSxcblx0Wyd5V2luZG93JywgJzAnXVxuXTsqL1xuXG5mdW5jdGlvbiBwdXNoX2RlZmF1bHRzX2FycmF5KHRhcmdldCwgZGVmYXVsdHMpIHtcblx0Zm9yKHZhciBqID0gMDsgaiAhPSB0YXJnZXQubGVuZ3RoOyArK2opIHsgdmFyIHcgPSB0YXJnZXRbal07XG5cdFx0Zm9yKHZhciBpPTA7IGkgIT0gZGVmYXVsdHMubGVuZ3RoOyArK2kpIHsgdmFyIHogPSBkZWZhdWx0c1tpXTtcblx0XHRcdGlmKHdbelswXV0gPT0gbnVsbCkgd1t6WzBdXSA9IHpbMV07XG5cdFx0XHRlbHNlIHN3aXRjaCh6WzJdKSB7XG5cdFx0XHRjYXNlIFwiYm9vbFwiOiBpZih0eXBlb2Ygd1t6WzBdXSA9PSBcInN0cmluZ1wiKSB3W3pbMF1dID0gcGFyc2V4bWxib29sKHdbelswXV0pOyBicmVhaztcblx0XHRcdGNhc2UgXCJpbnRcIjogaWYodHlwZW9mIHdbelswXV0gPT0gXCJzdHJpbmdcIikgd1t6WzBdXSA9IHBhcnNlSW50KHdbelswXV0sIDEwKTsgYnJlYWs7XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG59XG5mdW5jdGlvbiBwdXNoX2RlZmF1bHRzKHRhcmdldCwgZGVmYXVsdHMpIHtcblx0Zm9yKHZhciBpID0gMDsgaSAhPSBkZWZhdWx0cy5sZW5ndGg7ICsraSkgeyB2YXIgeiA9IGRlZmF1bHRzW2ldO1xuXHRcdGlmKHRhcmdldFt6WzBdXSA9PSBudWxsKSB0YXJnZXRbelswXV0gPSB6WzFdO1xuXHRcdGVsc2Ugc3dpdGNoKHpbMl0pIHtcblx0XHRcdGNhc2UgXCJib29sXCI6IGlmKHR5cGVvZiB0YXJnZXRbelswXV0gPT0gXCJzdHJpbmdcIikgdGFyZ2V0W3pbMF1dID0gcGFyc2V4bWxib29sKHRhcmdldFt6WzBdXSk7IGJyZWFrO1xuXHRcdFx0Y2FzZSBcImludFwiOiBpZih0eXBlb2YgdGFyZ2V0W3pbMF1dID09IFwic3RyaW5nXCIpIHRhcmdldFt6WzBdXSA9IHBhcnNlSW50KHRhcmdldFt6WzBdXSwgMTApOyBicmVhaztcblx0XHR9XG5cdH1cbn1cblxuZnVuY3Rpb24gcGFyc2Vfd2JfZGVmYXVsdHMod2IpIHtcblx0cHVzaF9kZWZhdWx0cyh3Yi5XQlByb3BzLCBXQlByb3BzRGVmKTtcblx0cHVzaF9kZWZhdWx0cyh3Yi5DYWxjUHIsIENhbGNQckRlZik7XG5cblx0cHVzaF9kZWZhdWx0c19hcnJheSh3Yi5XQlZpZXcsIFdCVmlld0RlZik7XG5cdHB1c2hfZGVmYXVsdHNfYXJyYXkod2IuU2hlZXRzLCBTaGVldERlZik7XG5cblx0X3NzZm9wdHMuZGF0ZTE5MDQgPSBwYXJzZXhtbGJvb2wod2IuV0JQcm9wcy5kYXRlMTkwNCk7XG59XG5cbmZ1bmN0aW9uIHNhZmUxOTA0KHdiKSB7XG5cdC8qIFRPRE86IHN0b3JlIGRhdGUxOTA0IHNvbWV3aGVyZSBlbHNlICovXG5cdGlmKCF3Yi5Xb3JrYm9vaykgcmV0dXJuIFwiZmFsc2VcIjtcblx0aWYoIXdiLldvcmtib29rLldCUHJvcHMpIHJldHVybiBcImZhbHNlXCI7XG5cdHJldHVybiBwYXJzZXhtbGJvb2wod2IuV29ya2Jvb2suV0JQcm9wcy5kYXRlMTkwNCkgPyBcInRydWVcIiA6IFwiZmFsc2VcIjtcbn1cblxudmFyIGJhZGNoYXJzID0gXCJdWyo/XFwvXFxcXFwiLnNwbGl0KFwiXCIpO1xuZnVuY3Rpb24gY2hlY2tfd3NfbmFtZShuLCBzYWZlKSB7XG5cdGlmKG4ubGVuZ3RoID4gMzEpIHsgaWYoc2FmZSkgcmV0dXJuIGZhbHNlOyB0aHJvdyBuZXcgRXJyb3IoXCJTaGVldCBuYW1lcyBjYW5ub3QgZXhjZWVkIDMxIGNoYXJzXCIpOyB9XG5cdHZhciBfZ29vZCA9IHRydWU7XG5cdGJhZGNoYXJzLmZvckVhY2goZnVuY3Rpb24oYykge1xuXHRcdGlmKG4uaW5kZXhPZihjKSA9PSAtMSkgcmV0dXJuO1xuXHRcdGlmKCFzYWZlKSB0aHJvdyBuZXcgRXJyb3IoXCJTaGVldCBuYW1lIGNhbm5vdCBjb250YWluIDogXFxcXCAvID8gKiBbIF1cIik7XG5cdFx0X2dvb2QgPSBmYWxzZTtcblx0fSk7XG5cdHJldHVybiBfZ29vZDtcbn1cbmZ1bmN0aW9uIGNoZWNrX3diX25hbWVzKE4sIFMsIGNvZGVzKSB7XG5cdE4uZm9yRWFjaChmdW5jdGlvbihuLGkpIHtcblx0XHRjaGVja193c19uYW1lKG4pO1xuXHRcdGZvcih2YXIgaiA9IDA7IGogPCBpOyArK2opIGlmKG4gPT0gTltqXSkgdGhyb3cgbmV3IEVycm9yKFwiRHVwbGljYXRlIFNoZWV0IE5hbWU6IFwiICsgbik7XG5cdFx0aWYoY29kZXMpIHtcblx0XHRcdHZhciBjbiA9IChTICYmIFNbaV0gJiYgU1tpXS5Db2RlTmFtZSkgfHwgbjtcblx0XHRcdGlmKGNuLmNoYXJDb2RlQXQoMCkgPT0gOTUgJiYgY24ubGVuZ3RoID4gMjIpIHRocm93IG5ldyBFcnJvcihcIkJhZCBDb2RlIE5hbWU6IFdvcmtzaGVldFwiICsgY24pO1xuXHRcdH1cblx0fSk7XG59XG5mdW5jdGlvbiBjaGVja193Yih3Yikge1xuXHRpZighd2IgfHwgIXdiLlNoZWV0TmFtZXMgfHwgIXdiLlNoZWV0cykgdGhyb3cgbmV3IEVycm9yKFwiSW52YWxpZCBXb3JrYm9va1wiKTtcblx0aWYoIXdiLlNoZWV0TmFtZXMubGVuZ3RoKSB0aHJvdyBuZXcgRXJyb3IoXCJXb3JrYm9vayBpcyBlbXB0eVwiKTtcblx0dmFyIFNoZWV0cyA9ICh3Yi5Xb3JrYm9vayAmJiB3Yi5Xb3JrYm9vay5TaGVldHMpIHx8IFtdO1xuXHRjaGVja193Yl9uYW1lcyh3Yi5TaGVldE5hbWVzLCBTaGVldHMsICEhd2IudmJhcmF3KTtcblx0Zm9yKHZhciBpID0gMDsgaSA8IHdiLlNoZWV0TmFtZXMubGVuZ3RoOyArK2kpIGNoZWNrX3dzKHdiLlNoZWV0c1t3Yi5TaGVldE5hbWVzW2ldXSwgd2IuU2hlZXROYW1lc1tpXSwgaSk7XG5cdC8qIFRPRE86IHZhbGlkYXRlIHdvcmtib29rICovXG59XG4vKiAxOC4yIFdvcmtib29rICovXG52YXIgd2Juc3JlZ2V4ID0gLzxcXHcrOndvcmtib29rLztcbmZ1bmN0aW9uIHBhcnNlX3diX3htbChkYXRhLCBvcHRzKSB7XG5cdGlmKCFkYXRhKSB0aHJvdyBuZXcgRXJyb3IoXCJDb3VsZCBub3QgZmluZCBmaWxlXCIpO1xuXHR2YXIgd2IgPSB7IEFwcFZlcnNpb246e30sIFdCUHJvcHM6e30sIFdCVmlldzpbXSwgU2hlZXRzOltdLCBDYWxjUHI6e30sIE5hbWVzOltdLCB4bWxuczogXCJcIiB9O1xuXHR2YXIgcGFzcyA9IGZhbHNlLCB4bWxucyA9IFwieG1sbnNcIjtcblx0dmFyIGRuYW1lID0ge30sIGRuc3RhcnQgPSAwO1xuXHRkYXRhLnJlcGxhY2UodGFncmVnZXgsIGZ1bmN0aW9uIHhtbF93Yih4LCBpZHgpIHtcblx0XHR2YXIgeSA9IHBhcnNleG1sdGFnKHgpO1xuXHRcdHN3aXRjaChzdHJpcF9ucyh5WzBdKSkge1xuXHRcdFx0Y2FzZSAnPD94bWwnOiBicmVhaztcblxuXHRcdFx0LyogMTguMi4yNyB3b3JrYm9vayBDVF9Xb3JrYm9vayAxICovXG5cdFx0XHRjYXNlICc8d29ya2Jvb2snOlxuXHRcdFx0XHRpZih4Lm1hdGNoKHdibnNyZWdleCkpIHhtbG5zID0gXCJ4bWxuc1wiICsgeC5tYXRjaCgvPChcXHcrKTovKVsxXTtcblx0XHRcdFx0d2IueG1sbnMgPSB5W3htbG5zXTtcblx0XHRcdFx0YnJlYWs7XG5cdFx0XHRjYXNlICc8L3dvcmtib29rPic6IGJyZWFrO1xuXG5cdFx0XHQvKiAxOC4yLjEzIGZpbGVWZXJzaW9uIENUX0ZpbGVWZXJzaW9uID8gKi9cblx0XHRcdGNhc2UgJzxmaWxlVmVyc2lvbic6IGRlbGV0ZSB5WzBdOyB3Yi5BcHBWZXJzaW9uID0geTsgYnJlYWs7XG5cdFx0XHRjYXNlICc8ZmlsZVZlcnNpb24vPic6IGNhc2UgJzwvZmlsZVZlcnNpb24+JzogYnJlYWs7XG5cblx0XHRcdC8qIDE4LjIuMTIgZmlsZVNoYXJpbmcgQ1RfRmlsZVNoYXJpbmcgPyAqL1xuXHRcdFx0Y2FzZSAnPGZpbGVTaGFyaW5nJzpcblx0XHRcdFx0YnJlYWs7XG5cdFx0XHRjYXNlICc8ZmlsZVNoYXJpbmcvPic6IGJyZWFrO1xuXG5cdFx0XHQvKiAxOC4yLjI4IHdvcmtib29rUHIgQ1RfV29ya2Jvb2tQciA/ICovXG5cdFx0XHRjYXNlICc8d29ya2Jvb2tQcic6XG5cdFx0XHRjYXNlICc8d29ya2Jvb2tQci8+Jzpcblx0XHRcdFx0V0JQcm9wc0RlZi5mb3JFYWNoKGZ1bmN0aW9uKHcpIHtcblx0XHRcdFx0XHRpZih5W3dbMF1dID09IG51bGwpIHJldHVybjtcblx0XHRcdFx0XHRzd2l0Y2god1syXSkge1xuXHRcdFx0XHRcdFx0Y2FzZSBcImJvb2xcIjogd2IuV0JQcm9wc1t3WzBdXSA9IHBhcnNleG1sYm9vbCh5W3dbMF1dKTsgYnJlYWs7XG5cdFx0XHRcdFx0XHRjYXNlIFwiaW50XCI6IHdiLldCUHJvcHNbd1swXV0gPSBwYXJzZUludCh5W3dbMF1dLCAxMCk7IGJyZWFrO1xuXHRcdFx0XHRcdFx0ZGVmYXVsdDogd2IuV0JQcm9wc1t3WzBdXSA9IHlbd1swXV07XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9KTtcblx0XHRcdFx0aWYoeS5jb2RlTmFtZSkgd2IuV0JQcm9wcy5Db2RlTmFtZSA9IHV0ZjhyZWFkKHkuY29kZU5hbWUpO1xuXHRcdFx0XHRicmVhaztcblx0XHRcdGNhc2UgJzwvd29ya2Jvb2tQcj4nOiBicmVhaztcblxuXHRcdFx0LyogMTguMi4yOSB3b3JrYm9va1Byb3RlY3Rpb24gQ1RfV29ya2Jvb2tQcm90ZWN0aW9uID8gKi9cblx0XHRcdGNhc2UgJzx3b3JrYm9va1Byb3RlY3Rpb24nOlxuXHRcdFx0XHRicmVhaztcblx0XHRcdGNhc2UgJzx3b3JrYm9va1Byb3RlY3Rpb24vPic6IGJyZWFrO1xuXG5cdFx0XHQvKiAxOC4yLjEgIGJvb2tWaWV3cyBDVF9Cb29rVmlld3MgPyAqL1xuXHRcdFx0Y2FzZSAnPGJvb2tWaWV3cyc6IGNhc2UgJzxib29rVmlld3M+JzogY2FzZSAnPC9ib29rVmlld3M+JzogYnJlYWs7XG5cdFx0XHQvKiAxOC4yLjMwICAgd29ya2Jvb2tWaWV3IENUX0Jvb2tWaWV3ICsgKi9cblx0XHRcdGNhc2UgJzx3b3JrYm9va1ZpZXcnOiBjYXNlICc8d29ya2Jvb2tWaWV3Lz4nOiBkZWxldGUgeVswXTsgd2IuV0JWaWV3LnB1c2goeSk7IGJyZWFrO1xuXHRcdFx0Y2FzZSAnPC93b3JrYm9va1ZpZXc+JzogYnJlYWs7XG5cblx0XHRcdC8qIDE4LjIuMjAgc2hlZXRzIENUX1NoZWV0cyAxICovXG5cdFx0XHRjYXNlICc8c2hlZXRzJzogY2FzZSAnPHNoZWV0cz4nOiBjYXNlICc8L3NoZWV0cz4nOiBicmVhazsgLy8gYWdncmVnYXRlIHNoZWV0XG5cdFx0XHQvKiAxOC4yLjE5ICAgc2hlZXQgQ1RfU2hlZXQgKyAqL1xuXHRcdFx0Y2FzZSAnPHNoZWV0Jzpcblx0XHRcdFx0c3dpdGNoKHkuc3RhdGUpIHtcblx0XHRcdFx0XHRjYXNlIFwiaGlkZGVuXCI6IHkuSGlkZGVuID0gMTsgYnJlYWs7XG5cdFx0XHRcdFx0Y2FzZSBcInZlcnlIaWRkZW5cIjogeS5IaWRkZW4gPSAyOyBicmVhaztcblx0XHRcdFx0XHRkZWZhdWx0OiB5LkhpZGRlbiA9IDA7XG5cdFx0XHRcdH1cblx0XHRcdFx0ZGVsZXRlIHkuc3RhdGU7XG5cdFx0XHRcdHkubmFtZSA9IHVuZXNjYXBleG1sKHV0ZjhyZWFkKHkubmFtZSkpO1xuXHRcdFx0XHRkZWxldGUgeVswXTsgd2IuU2hlZXRzLnB1c2goeSk7IGJyZWFrO1xuXHRcdFx0Y2FzZSAnPC9zaGVldD4nOiBicmVhaztcblxuXHRcdFx0LyogMTguMi4xNSBmdW5jdGlvbkdyb3VwcyBDVF9GdW5jdGlvbkdyb3VwcyA/ICovXG5cdFx0XHRjYXNlICc8ZnVuY3Rpb25Hcm91cHMnOiBjYXNlICc8ZnVuY3Rpb25Hcm91cHMvPic6IGJyZWFrO1xuXHRcdFx0LyogMTguMi4xNCAgIGZ1bmN0aW9uR3JvdXAgQ1RfRnVuY3Rpb25Hcm91cCArICovXG5cdFx0XHRjYXNlICc8ZnVuY3Rpb25Hcm91cCc6IGJyZWFrO1xuXG5cdFx0XHQvKiAxOC4yLjkgIGV4dGVybmFsUmVmZXJlbmNlcyBDVF9FeHRlcm5hbFJlZmVyZW5jZXMgPyAqL1xuXHRcdFx0Y2FzZSAnPGV4dGVybmFsUmVmZXJlbmNlcyc6IGNhc2UgJzwvZXh0ZXJuYWxSZWZlcmVuY2VzPic6IGNhc2UgJzxleHRlcm5hbFJlZmVyZW5jZXM+JzogYnJlYWs7XG5cdFx0XHQvKiAxOC4yLjggICAgZXh0ZXJuYWxSZWZlcmVuY2UgQ1RfRXh0ZXJuYWxSZWZlcmVuY2UgKyAqL1xuXHRcdFx0Y2FzZSAnPGV4dGVybmFsUmVmZXJlbmNlJzogYnJlYWs7XG5cblx0XHRcdC8qIDE4LjIuNiAgZGVmaW5lZE5hbWVzIENUX0RlZmluZWROYW1lcyA/ICovXG5cdFx0XHRjYXNlICc8ZGVmaW5lZE5hbWVzLz4nOiBicmVhaztcblx0XHRcdGNhc2UgJzxkZWZpbmVkTmFtZXM+JzogY2FzZSAnPGRlZmluZWROYW1lcyc6IHBhc3M9dHJ1ZTsgYnJlYWs7XG5cdFx0XHRjYXNlICc8L2RlZmluZWROYW1lcz4nOiBwYXNzPWZhbHNlOyBicmVhaztcblx0XHRcdC8qIDE4LjIuNSAgICBkZWZpbmVkTmFtZSBDVF9EZWZpbmVkTmFtZSArICovXG5cdFx0XHRjYXNlICc8ZGVmaW5lZE5hbWUnOiB7XG5cdFx0XHRcdGRuYW1lID0ge307XG5cdFx0XHRcdGRuYW1lLk5hbWUgPSB1dGY4cmVhZCh5Lm5hbWUpO1xuXHRcdFx0XHRpZih5LmNvbW1lbnQpIGRuYW1lLkNvbW1lbnQgPSB5LmNvbW1lbnQ7XG5cdFx0XHRcdGlmKHkubG9jYWxTaGVldElkKSBkbmFtZS5TaGVldCA9ICt5LmxvY2FsU2hlZXRJZDtcblx0XHRcdFx0aWYocGFyc2V4bWxib29sKHkuaGlkZGVufHxcIjBcIikpIGRuYW1lLkhpZGRlbiA9IHRydWU7XG5cdFx0XHRcdGRuc3RhcnQgPSBpZHggKyB4Lmxlbmd0aDtcblx0XHRcdH1cdGJyZWFrO1xuXHRcdFx0Y2FzZSAnPC9kZWZpbmVkTmFtZT4nOiB7XG5cdFx0XHRcdGRuYW1lLlJlZiA9IHVuZXNjYXBleG1sKHV0ZjhyZWFkKGRhdGEuc2xpY2UoZG5zdGFydCwgaWR4KSkpO1xuXHRcdFx0XHR3Yi5OYW1lcy5wdXNoKGRuYW1lKTtcblx0XHRcdH0gYnJlYWs7XG5cdFx0XHRjYXNlICc8ZGVmaW5lZE5hbWUvPic6IGJyZWFrO1xuXG5cdFx0XHQvKiAxOC4yLjIgIGNhbGNQciBDVF9DYWxjUHIgPyAqL1xuXHRcdFx0Y2FzZSAnPGNhbGNQcic6IGRlbGV0ZSB5WzBdOyB3Yi5DYWxjUHIgPSB5OyBicmVhaztcblx0XHRcdGNhc2UgJzxjYWxjUHIvPic6IGRlbGV0ZSB5WzBdOyB3Yi5DYWxjUHIgPSB5OyBicmVhaztcblx0XHRcdGNhc2UgJzwvY2FsY1ByPic6IGJyZWFrO1xuXG5cdFx0XHQvKiAxOC4yLjE2IG9sZVNpemUgQ1RfT2xlU2l6ZSA/IChyZWYgcmVxdWlyZWQpICovXG5cdFx0XHRjYXNlICc8b2xlU2l6ZSc6IGJyZWFrO1xuXG5cdFx0XHQvKiAxOC4yLjQgIGN1c3RvbVdvcmtib29rVmlld3MgQ1RfQ3VzdG9tV29ya2Jvb2tWaWV3cyA/ICovXG5cdFx0XHRjYXNlICc8Y3VzdG9tV29ya2Jvb2tWaWV3cz4nOiBjYXNlICc8L2N1c3RvbVdvcmtib29rVmlld3M+JzogY2FzZSAnPGN1c3RvbVdvcmtib29rVmlld3MnOiBicmVhaztcblx0XHRcdC8qIDE4LjIuMyAgY3VzdG9tV29ya2Jvb2tWaWV3IENUX0N1c3RvbVdvcmtib29rVmlldyArICovXG5cdFx0XHRjYXNlICc8Y3VzdG9tV29ya2Jvb2tWaWV3JzogY2FzZSAnPC9jdXN0b21Xb3JrYm9va1ZpZXc+JzogYnJlYWs7XG5cblx0XHRcdC8qIDE4LjIuMTggcGl2b3RDYWNoZXMgQ1RfUGl2b3RDYWNoZXMgPyAqL1xuXHRcdFx0Y2FzZSAnPHBpdm90Q2FjaGVzPic6IGNhc2UgJzwvcGl2b3RDYWNoZXM+JzogY2FzZSAnPHBpdm90Q2FjaGVzJzogYnJlYWs7XG5cdFx0XHQvKiAxOC4yLjE3IHBpdm90Q2FjaGUgQ1RfUGl2b3RDYWNoZSA/ICovXG5cdFx0XHRjYXNlICc8cGl2b3RDYWNoZSc6IGJyZWFrO1xuXG5cdFx0XHQvKiAxOC4yLjIxIHNtYXJ0VGFnUHIgQ1RfU21hcnRUYWdQciA/ICovXG5cdFx0XHRjYXNlICc8c21hcnRUYWdQcic6IGNhc2UgJzxzbWFydFRhZ1ByLz4nOiBicmVhaztcblxuXHRcdFx0LyogMTguMi4yMyBzbWFydFRhZ1R5cGVzIENUX1NtYXJ0VGFnVHlwZXMgPyAqL1xuXHRcdFx0Y2FzZSAnPHNtYXJ0VGFnVHlwZXMnOiBjYXNlICc8c21hcnRUYWdUeXBlcz4nOiBjYXNlICc8L3NtYXJ0VGFnVHlwZXM+JzogYnJlYWs7XG5cdFx0XHQvKiAxOC4yLjIyIHNtYXJ0VGFnVHlwZSBDVF9TbWFydFRhZ1R5cGUgPyAqL1xuXHRcdFx0Y2FzZSAnPHNtYXJ0VGFnVHlwZSc6IGJyZWFrO1xuXG5cdFx0XHQvKiAxOC4yLjI0IHdlYlB1Ymxpc2hpbmcgQ1RfV2ViUHVibGlzaGluZyA/ICovXG5cdFx0XHRjYXNlICc8d2ViUHVibGlzaGluZyc6IGNhc2UgJzx3ZWJQdWJsaXNoaW5nLz4nOiBicmVhaztcblxuXHRcdFx0LyogMTguMi4xMSBmaWxlUmVjb3ZlcnlQciBDVF9GaWxlUmVjb3ZlcnlQciA/ICovXG5cdFx0XHRjYXNlICc8ZmlsZVJlY292ZXJ5UHInOiBjYXNlICc8ZmlsZVJlY292ZXJ5UHIvPic6IGJyZWFrO1xuXG5cdFx0XHQvKiAxOC4yLjI2IHdlYlB1Ymxpc2hPYmplY3RzIENUX1dlYlB1Ymxpc2hPYmplY3RzID8gKi9cblx0XHRcdGNhc2UgJzx3ZWJQdWJsaXNoT2JqZWN0cz4nOiBjYXNlICc8d2ViUHVibGlzaE9iamVjdHMnOiBjYXNlICc8L3dlYlB1Ymxpc2hPYmplY3RzPic6IGJyZWFrO1xuXHRcdFx0LyogMTguMi4yNSB3ZWJQdWJsaXNoT2JqZWN0IENUX1dlYlB1Ymxpc2hPYmplY3QgPyAqL1xuXHRcdFx0Y2FzZSAnPHdlYlB1Ymxpc2hPYmplY3QnOiBicmVhaztcblxuXHRcdFx0LyogMTguMi4xMCBleHRMc3QgQ1RfRXh0ZW5zaW9uTGlzdCA/ICovXG5cdFx0XHRjYXNlICc8ZXh0THN0JzogY2FzZSAnPGV4dExzdD4nOiBjYXNlICc8L2V4dExzdD4nOiBjYXNlICc8ZXh0THN0Lz4nOiBicmVhaztcblx0XHRcdC8qIDE4LjIuNyAgZXh0IENUX0V4dGVuc2lvbiArICovXG5cdFx0XHRjYXNlICc8ZXh0JzogcGFzcz10cnVlOyBicmVhazsgLy9UT0RPOiBjaGVjayB3aXRoIHZlcnNpb25zIG9mIGV4Y2VsXG5cdFx0XHRjYXNlICc8L2V4dD4nOiBwYXNzPWZhbHNlOyBicmVhaztcblxuXHRcdFx0LyogT3RoZXJzICovXG5cdFx0XHRjYXNlICc8QXJjaElEJzogYnJlYWs7XG5cdFx0XHRjYXNlICc8QWx0ZXJuYXRlQ29udGVudCc6XG5cdFx0XHRjYXNlICc8QWx0ZXJuYXRlQ29udGVudD4nOiBwYXNzPXRydWU7IGJyZWFrO1xuXHRcdFx0Y2FzZSAnPC9BbHRlcm5hdGVDb250ZW50Pic6IHBhc3M9ZmFsc2U7IGJyZWFrO1xuXG5cdFx0XHQvKiBUT0RPICovXG5cdFx0XHRjYXNlICc8cmV2aXNpb25QdHInOiBicmVhaztcblxuXHRcdFx0ZGVmYXVsdDogaWYoIXBhc3MgJiYgb3B0cy5XVEYpIHRocm93IG5ldyBFcnJvcigndW5yZWNvZ25pemVkICcgKyB5WzBdICsgJyBpbiB3b3JrYm9vaycpO1xuXHRcdH1cblx0XHRyZXR1cm4geDtcblx0fSk7XG5cdGlmKFhNTE5TLm1haW4uaW5kZXhPZih3Yi54bWxucykgPT09IC0xKSB0aHJvdyBuZXcgRXJyb3IoXCJVbmtub3duIE5hbWVzcGFjZTogXCIgKyB3Yi54bWxucyk7XG5cblx0cGFyc2Vfd2JfZGVmYXVsdHMod2IpO1xuXG5cdHJldHVybiB3Yjtcbn1cblxudmFyIFdCX1hNTF9ST09UID0gd3JpdGV4dGFnKCd3b3JrYm9vaycsIG51bGwsIHtcblx0J3htbG5zJzogWE1MTlMubWFpblswXSxcblx0Ly8neG1sbnM6bXgnOiBYTUxOUy5teCxcblx0Ly8neG1sbnM6cyc6IFhNTE5TLm1haW5bMF0sXG5cdCd4bWxuczpyJzogWE1MTlMuclxufSk7XG5cbmZ1bmN0aW9uIHdyaXRlX3diX3htbCh3Yikge1xuXHR2YXIgbyA9IFtYTUxfSEVBREVSXTtcblx0b1tvLmxlbmd0aF0gPSBXQl9YTUxfUk9PVDtcblxuXHR2YXIgd3JpdGVfbmFtZXMgPSAod2IuV29ya2Jvb2sgJiYgKHdiLldvcmtib29rLk5hbWVzfHxbXSkubGVuZ3RoID4gMCk7XG5cblx0LyogZmlsZVZlcnNpb24gKi9cblx0LyogZmlsZVNoYXJpbmcgKi9cblxuXHR2YXIgd29ya2Jvb2tQciA9ICh7Y29kZU5hbWU6XCJUaGlzV29ya2Jvb2tcIn0pO1xuXHRpZih3Yi5Xb3JrYm9vayAmJiB3Yi5Xb3JrYm9vay5XQlByb3BzKSB7XG5cdFx0V0JQcm9wc0RlZi5mb3JFYWNoKGZ1bmN0aW9uKHgpIHtcbmlmKCh3Yi5Xb3JrYm9vay5XQlByb3BzW3hbMF1dKSA9PSBudWxsKSByZXR1cm47XG5cdFx0XHRpZigod2IuV29ya2Jvb2suV0JQcm9wc1t4WzBdXSkgPT0geFsxXSkgcmV0dXJuO1xuXHRcdFx0d29ya2Jvb2tQclt4WzBdXSA9ICh3Yi5Xb3JrYm9vay5XQlByb3BzW3hbMF1dKTtcblx0XHR9KTtcbmlmKHdiLldvcmtib29rLldCUHJvcHMuQ29kZU5hbWUpIHsgd29ya2Jvb2tQci5jb2RlTmFtZSA9IHdiLldvcmtib29rLldCUHJvcHMuQ29kZU5hbWU7IGRlbGV0ZSB3b3JrYm9va1ByLkNvZGVOYW1lOyB9XG5cdH1cblx0b1tvLmxlbmd0aF0gPSAod3JpdGV4dGFnKCd3b3JrYm9va1ByJywgbnVsbCwgd29ya2Jvb2tQcikpO1xuXG5cdC8qIHdvcmtib29rUHJvdGVjdGlvbiAqL1xuXG5cdHZhciBzaGVldHMgPSB3Yi5Xb3JrYm9vayAmJiB3Yi5Xb3JrYm9vay5TaGVldHMgfHwgW107XG5cdHZhciBpID0gMDtcblxuXHQvKiBib29rVmlld3Mgb25seSB3cml0dGVuIGlmIGZpcnN0IHdvcmtzaGVldCBpcyBoaWRkZW4gKi9cblx0aWYoc2hlZXRzICYmIHNoZWV0c1swXSAmJiAhIXNoZWV0c1swXS5IaWRkZW4pIHtcblx0XHRvW28ubGVuZ3RoXSA9IFwiPGJvb2tWaWV3cz5cIjtcblx0XHRmb3IoaSA9IDA7IGkgIT0gd2IuU2hlZXROYW1lcy5sZW5ndGg7ICsraSkge1xuXHRcdFx0aWYoIXNoZWV0c1tpXSkgYnJlYWs7XG5cdFx0XHRpZighc2hlZXRzW2ldLkhpZGRlbikgYnJlYWs7XG5cdFx0fVxuXHRcdGlmKGkgPT0gd2IuU2hlZXROYW1lcy5sZW5ndGgpIGkgPSAwO1xuXHRcdG9bby5sZW5ndGhdID0gJzx3b3JrYm9va1ZpZXcgZmlyc3RTaGVldD1cIicgKyBpICsgJ1wiIGFjdGl2ZVRhYj1cIicgKyBpICsgJ1wiLz4nO1xuXHRcdG9bby5sZW5ndGhdID0gXCI8L2Jvb2tWaWV3cz5cIjtcblx0fVxuXG5cdG9bby5sZW5ndGhdID0gXCI8c2hlZXRzPlwiO1xuXHRmb3IoaSA9IDA7IGkgIT0gd2IuU2hlZXROYW1lcy5sZW5ndGg7ICsraSkge1xuXHRcdHZhciBzaHQgPSAoe25hbWU6ZXNjYXBleG1sKHdiLlNoZWV0TmFtZXNbaV0uc2xpY2UoMCwzMSkpfSk7XG5cdFx0c2h0LnNoZWV0SWQgPSBcIlwiKyhpKzEpO1xuXHRcdHNodFtcInI6aWRcIl0gPSBcInJJZFwiKyhpKzEpO1xuXHRcdGlmKHNoZWV0c1tpXSkgc3dpdGNoKHNoZWV0c1tpXS5IaWRkZW4pIHtcblx0XHRcdGNhc2UgMTogc2h0LnN0YXRlID0gXCJoaWRkZW5cIjsgYnJlYWs7XG5cdFx0XHRjYXNlIDI6IHNodC5zdGF0ZSA9IFwidmVyeUhpZGRlblwiOyBicmVhaztcblx0XHR9XG5cdFx0b1tvLmxlbmd0aF0gPSAod3JpdGV4dGFnKCdzaGVldCcsbnVsbCxzaHQpKTtcblx0fVxuXHRvW28ubGVuZ3RoXSA9IFwiPC9zaGVldHM+XCI7XG5cblx0LyogZnVuY3Rpb25Hcm91cHMgKi9cblx0LyogZXh0ZXJuYWxSZWZlcmVuY2VzICovXG5cblx0aWYod3JpdGVfbmFtZXMpIHtcblx0XHRvW28ubGVuZ3RoXSA9IFwiPGRlZmluZWROYW1lcz5cIjtcblx0XHRpZih3Yi5Xb3JrYm9vayAmJiB3Yi5Xb3JrYm9vay5OYW1lcykgd2IuV29ya2Jvb2suTmFtZXMuZm9yRWFjaChmdW5jdGlvbihuKSB7XG5cdFx0XHR2YXIgZCA9IHtuYW1lOm4uTmFtZX07XG5cdFx0XHRpZihuLkNvbW1lbnQpIGQuY29tbWVudCA9IG4uQ29tbWVudDtcblx0XHRcdGlmKG4uU2hlZXQgIT0gbnVsbCkgZC5sb2NhbFNoZWV0SWQgPSBcIlwiK24uU2hlZXQ7XG5cdFx0XHRpZihuLkhpZGRlbikgZC5oaWRkZW4gPSBcIjFcIjtcblx0XHRcdGlmKCFuLlJlZikgcmV0dXJuO1xuXHRcdFx0b1tvLmxlbmd0aF0gPSB3cml0ZXh0YWcoJ2RlZmluZWROYW1lJywgZXNjYXBleG1sKG4uUmVmKSwgZCk7XG5cdFx0fSk7XG5cdFx0b1tvLmxlbmd0aF0gPSBcIjwvZGVmaW5lZE5hbWVzPlwiO1xuXHR9XG5cblx0LyogY2FsY1ByICovXG5cdC8qIG9sZVNpemUgKi9cblx0LyogY3VzdG9tV29ya2Jvb2tWaWV3cyAqL1xuXHQvKiBwaXZvdENhY2hlcyAqL1xuXHQvKiBzbWFydFRhZ1ByICovXG5cdC8qIHNtYXJ0VGFnVHlwZXMgKi9cblx0Lyogd2ViUHVibGlzaGluZyAqL1xuXHQvKiBmaWxlUmVjb3ZlcnlQciAqL1xuXHQvKiB3ZWJQdWJsaXNoT2JqZWN0cyAqL1xuXHQvKiBleHRMc3QgKi9cblxuXHRpZihvLmxlbmd0aD4yKXsgb1tvLmxlbmd0aF0gPSAnPC93b3JrYm9vaz4nOyBvWzFdPW9bMV0ucmVwbGFjZShcIi8+XCIsXCI+XCIpOyB9XG5cdHJldHVybiBvLmpvaW4oXCJcIik7XG59XG4vKiBbTVMtWExTQl0gMi40LjMwNCBCcnRCdW5kbGVTaCAqL1xuZnVuY3Rpb24gcGFyc2VfQnJ0QnVuZGxlU2goZGF0YSwgbGVuZ3RoKSB7XG5cdHZhciB6ID0ge307XG5cdHouSGlkZGVuID0gZGF0YS5yZWFkX3NoaWZ0KDQpOyAvL2hzU3RhdGUgU1RfU2hlZXRTdGF0ZVxuXHR6LmlUYWJJRCA9IGRhdGEucmVhZF9zaGlmdCg0KTtcblx0ei5zdHJSZWxJRCA9IHBhcnNlX1JlbElEKGRhdGEsbGVuZ3RoLTgpO1xuXHR6Lm5hbWUgPSBwYXJzZV9YTFdpZGVTdHJpbmcoZGF0YSk7XG5cdHJldHVybiB6O1xufVxuZnVuY3Rpb24gd3JpdGVfQnJ0QnVuZGxlU2goZGF0YSwgbykge1xuXHRpZighbykgbyA9IG5ld19idWYoMTI3KTtcblx0by53cml0ZV9zaGlmdCg0LCBkYXRhLkhpZGRlbik7XG5cdG8ud3JpdGVfc2hpZnQoNCwgZGF0YS5pVGFiSUQpO1xuXHR3cml0ZV9SZWxJRChkYXRhLnN0clJlbElELCBvKTtcblx0d3JpdGVfWExXaWRlU3RyaW5nKGRhdGEubmFtZS5zbGljZSgwLDMxKSwgbyk7XG5cdHJldHVybiBvLmxlbmd0aCA+IG8ubCA/IG8uc2xpY2UoMCwgby5sKSA6IG87XG59XG5cbi8qIFtNUy1YTFNCXSAyLjQuODE1IEJydFdiUHJvcCAqL1xuZnVuY3Rpb24gcGFyc2VfQnJ0V2JQcm9wKGRhdGEsIGxlbmd0aCkge1xuXHR2YXIgbyA9ICh7fSk7XG5cdHZhciBmbGFncyA9IGRhdGEucmVhZF9zaGlmdCg0KTtcblx0by5kZWZhdWx0VGhlbWVWZXJzaW9uID0gZGF0YS5yZWFkX3NoaWZ0KDQpO1xuXHR2YXIgc3RyTmFtZSA9IChsZW5ndGggPiA4KSA/IHBhcnNlX1hMV2lkZVN0cmluZyhkYXRhKSA6IFwiXCI7XG5cdGlmKHN0ck5hbWUubGVuZ3RoID4gMCkgby5Db2RlTmFtZSA9IHN0ck5hbWU7XG5cdG8uYXV0b0NvbXByZXNzUGljdHVyZXMgPSAhIShmbGFncyAmIDB4MTAwMDApO1xuXHRvLmJhY2t1cEZpbGUgPSAhIShmbGFncyAmIDB4NDApO1xuXHRvLmNoZWNrQ29tcGF0aWJpbGl0eSA9ICEhKGZsYWdzICYgMHgxMDAwKTtcblx0by5kYXRlMTkwNCA9ICEhKGZsYWdzICYgMHgwMSk7XG5cdG8uZmlsdGVyUHJpdmFjeSA9ICEhKGZsYWdzICYgMHgwOCk7XG5cdG8uaGlkZVBpdm90RmllbGRMaXN0ID0gISEoZmxhZ3MgJiAweDQwMCk7XG5cdG8ucHJvbXB0ZWRTb2x1dGlvbnMgPSAhIShmbGFncyAmIDB4MTApO1xuXHRvLnB1Ymxpc2hJdGVtcyA9ICEhKGZsYWdzICYgMHg4MDApO1xuXHRvLnJlZnJlc2hBbGxDb25uZWN0aW9ucyA9ICEhKGZsYWdzICYgMHg0MDAwMCk7XG5cdG8uc2F2ZUV4dGVybmFsTGlua1ZhbHVlcyA9ICEhKGZsYWdzICYgMHg4MCk7XG5cdG8uc2hvd0JvcmRlclVuc2VsZWN0ZWRUYWJsZXMgPSAhIShmbGFncyAmIDB4MDQpO1xuXHRvLnNob3dJbmtBbm5vdGF0aW9uID0gISEoZmxhZ3MgJiAweDIwKTtcblx0by5zaG93T2JqZWN0cyA9IFtcImFsbFwiLCBcInBsYWNlaG9sZGVyc1wiLCBcIm5vbmVcIl1bKGZsYWdzID4+IDEzKSAmIDB4MDNdO1xuXHRvLnNob3dQaXZvdENoYXJ0RmlsdGVyID0gISEoZmxhZ3MgJiAweDgwMDApO1xuXHRvLnVwZGF0ZUxpbmtzID0gW1widXNlclNldFwiLCBcIm5ldmVyXCIsIFwiYWx3YXlzXCJdWyhmbGFncyA+PiA4KSAmIDB4MDNdO1xuXHRyZXR1cm4gbztcbn1cbmZ1bmN0aW9uIHdyaXRlX0JydFdiUHJvcChkYXRhLCBvKSB7XG5cdGlmKCFvKSBvID0gbmV3X2J1Zig3Mik7XG5cdHZhciBmbGFncyA9IDA7XG5cdGlmKGRhdGEpIHtcblx0XHQvKiBUT0RPOiBtaXJyb3IgcGFyc2VfQnJ0V2JQcm9wIGZpZWxkcyAqL1xuXHRcdGlmKGRhdGEuZmlsdGVyUHJpdmFjeSkgZmxhZ3MgfD0gMHgwODtcblx0fVxuXHRvLndyaXRlX3NoaWZ0KDQsIGZsYWdzKTtcblx0by53cml0ZV9zaGlmdCg0LCAwKTtcblx0d3JpdGVfWExTQkNvZGVOYW1lKGRhdGEgJiYgZGF0YS5Db2RlTmFtZSB8fCBcIlRoaXNXb3JrYm9va1wiLCBvKTtcblx0cmV0dXJuIG8uc2xpY2UoMCwgby5sKTtcbn1cblxuZnVuY3Rpb24gcGFyc2VfQnJ0RlJUQXJjaElEJChkYXRhLCBsZW5ndGgpIHtcblx0dmFyIG8gPSB7fTtcblx0ZGF0YS5yZWFkX3NoaWZ0KDQpO1xuXHRvLkFyY2hJRCA9IGRhdGEucmVhZF9zaGlmdCg0KTtcblx0ZGF0YS5sICs9IGxlbmd0aCAtIDg7XG5cdHJldHVybiBvO1xufVxuXG4vKiBbTVMtWExTQl0gMi40LjY4NyBCcnROYW1lICovXG5mdW5jdGlvbiBwYXJzZV9CcnROYW1lKGRhdGEsIGxlbmd0aCwgb3B0cykge1xuXHR2YXIgZW5kID0gZGF0YS5sICsgbGVuZ3RoO1xuXHRkYXRhLmwgKz0gNDsgLy92YXIgZmxhZ3MgPSBkYXRhLnJlYWRfc2hpZnQoNCk7XG5cdGRhdGEubCArPSAxOyAvL3ZhciBjaEtleSA9IGRhdGEucmVhZF9zaGlmdCgxKTtcblx0dmFyIGl0YWIgPSBkYXRhLnJlYWRfc2hpZnQoNCk7XG5cdHZhciBuYW1lID0gcGFyc2VfWExOYW1lV2lkZVN0cmluZyhkYXRhKTtcblx0dmFyIGZvcm11bGEgPSBwYXJzZV9YTFNCTmFtZVBhcnNlZEZvcm11bGEoZGF0YSwgMCwgb3B0cyk7XG5cdHZhciBjb21tZW50ID0gcGFyc2VfWExOdWxsYWJsZVdpZGVTdHJpbmcoZGF0YSk7XG5cdC8vaWYoMCAvKiBmUHJvYyAqLykge1xuXHRcdC8vIHVudXNlZHN0cmluZzE6IFhMTnVsbGFibGVXaWRlU3RyaW5nXG5cdFx0Ly8gZGVzY3JpcHRpb246IFhMTnVsbGFibGVXaWRlU3RyaW5nXG5cdFx0Ly8gaGVscFRvcGljOiBYTE51bGxhYmxlV2lkZVN0cmluZ1xuXHRcdC8vIHVudXNlZHN0cmluZzI6IFhMTnVsbGFibGVXaWRlU3RyaW5nXG5cdC8vfVxuXHRkYXRhLmwgPSBlbmQ7XG5cdHZhciBvdXQgPSAoe05hbWU6bmFtZSwgUHRnOmZvcm11bGF9KTtcblx0aWYoaXRhYiA8IDB4RkZGRkZGRikgb3V0LlNoZWV0ID0gaXRhYjtcblx0aWYoY29tbWVudCkgb3V0LkNvbW1lbnQgPSBjb21tZW50O1xuXHRyZXR1cm4gb3V0O1xufVxuXG4vKiBbTVMtWExTQl0gMi4xLjcuNjEgV29ya2Jvb2sgKi9cbmZ1bmN0aW9uIHBhcnNlX3diX2JpbihkYXRhLCBvcHRzKSB7XG5cdHZhciB3YiA9IHsgQXBwVmVyc2lvbjp7fSwgV0JQcm9wczp7fSwgV0JWaWV3OltdLCBTaGVldHM6W10sIENhbGNQcjp7fSwgeG1sbnM6IFwiXCIgfTtcblx0dmFyIHN0YXRlID0gW107XG5cdHZhciBwYXNzID0gZmFsc2U7XG5cblx0aWYoIW9wdHMpIG9wdHMgPSB7fTtcblx0b3B0cy5iaWZmID0gMTI7XG5cblx0dmFyIE5hbWVzID0gW107XG5cdHZhciBzdXBib29rcyA9IChbW11dKTtcblx0c3VwYm9va3MuU2hlZXROYW1lcyA9IFtdO1xuXHRzdXBib29rcy5YVEkgPSBbXTtcblxuXHRYTFNCUmVjb3JkRW51bVsweDAwMTBdID0geyBuOlwiQnJ0RlJUQXJjaElEJFwiLCBmOnBhcnNlX0JydEZSVEFyY2hJRCQgfTtcblxuXHRyZWNvcmRob3BwZXIoZGF0YSwgZnVuY3Rpb24gaG9wcGVyX3diKHZhbCwgUl9uLCBSVCkge1xuXHRcdHN3aXRjaChSVCkge1xuXHRcdFx0Y2FzZSAweDAwOUM6IC8qICdCcnRCdW5kbGVTaCcgKi9cblx0XHRcdFx0c3VwYm9va3MuU2hlZXROYW1lcy5wdXNoKHZhbC5uYW1lKTtcblx0XHRcdFx0d2IuU2hlZXRzLnB1c2godmFsKTsgYnJlYWs7XG5cblx0XHRcdGNhc2UgMHgwMDk5OiAvKiAnQnJ0V2JQcm9wJyAqL1xuXHRcdFx0XHR3Yi5XQlByb3BzID0gdmFsOyBicmVhaztcblxuXHRcdFx0Y2FzZSAweDAwMjc6IC8qICdCcnROYW1lJyAqL1xuXHRcdFx0XHRpZih2YWwuU2hlZXQgIT0gbnVsbCkgb3B0cy5TSUQgPSB2YWwuU2hlZXQ7XG5cdFx0XHRcdHZhbC5SZWYgPSBzdHJpbmdpZnlfZm9ybXVsYSh2YWwuUHRnLCBudWxsLCBudWxsLCBzdXBib29rcywgb3B0cyk7XG5cdFx0XHRcdGRlbGV0ZSBvcHRzLlNJRDtcblx0XHRcdFx0ZGVsZXRlIHZhbC5QdGc7XG5cdFx0XHRcdE5hbWVzLnB1c2godmFsKTtcblx0XHRcdFx0YnJlYWs7XG5cdFx0XHRjYXNlIDB4MDQwQzogLyogJ0JydE5hbWVFeHQnICovIGJyZWFrO1xuXG5cdFx0XHRjYXNlIDB4MDE2NTogLyogJ0JydFN1cFNlbGYnICovXG5cdFx0XHRjYXNlIDB4MDE2NjogLyogJ0JydFN1cFNhbWUnICovXG5cdFx0XHRjYXNlIDB4MDE2MzogLyogJ0JydFN1cEJvb2tTcmMnICovXG5cdFx0XHRjYXNlIDB4MDI5QjogLyogJ0JydFN1cEFkZGluJyAqL1xuXHRcdFx0XHRpZighc3VwYm9va3NbMF0ubGVuZ3RoKSBzdXBib29rc1swXSA9IFtSVCwgdmFsXTtcblx0XHRcdFx0ZWxzZSBzdXBib29rcy5wdXNoKFtSVCwgdmFsXSk7XG5cdFx0XHRcdHN1cGJvb2tzW3N1cGJvb2tzLmxlbmd0aCAtIDFdLlhUSSA9IFtdO1xuXHRcdFx0XHRicmVhaztcblx0XHRcdGNhc2UgMHgwMTZBOiAvKiAnQnJ0RXh0ZXJuU2hlZXQnICovXG5cdFx0XHRcdGlmKHN1cGJvb2tzLmxlbmd0aCA9PT0gMCkgeyBzdXBib29rc1swXSA9IFtdOyBzdXBib29rc1swXS5YVEkgPSBbXTsgfVxuXHRcdFx0XHRzdXBib29rc1tzdXBib29rcy5sZW5ndGggLSAxXS5YVEkgPSBzdXBib29rc1tzdXBib29rcy5sZW5ndGggLSAxXS5YVEkuY29uY2F0KHZhbCk7XG5cdFx0XHRcdHN1cGJvb2tzLlhUSSA9IHN1cGJvb2tzLlhUSS5jb25jYXQodmFsKTtcblx0XHRcdFx0YnJlYWs7XG5cdFx0XHRjYXNlIDB4MDE2OTogLyogJ0JydFBsYWNlaG9sZGVyTmFtZScgKi9cblx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdGNhc2UgMHgwODE3OiAvKiAnQnJ0QWJzUGF0aDE1JyAqL1xuXHRcdFx0Y2FzZSAweDAwOUU6IC8qICdCcnRCb29rVmlldycgKi9cblx0XHRcdGNhc2UgMHgwMDhGOiAvKiAnQnJ0QmVnaW5CdW5kbGVTaHMnICovXG5cdFx0XHRjYXNlIDB4MDI5ODogLyogJ0JydEJlZ2luRm5Hcm91cCcgKi9cblx0XHRcdGNhc2UgMHgwMTYxOiAvKiAnQnJ0QmVnaW5FeHRlcm5hbHMnICovXG5cdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHQvKiBjYXNlICdCcnRNb2RlbFRpbWVHcm91cGluZ0NhbGNDb2wnICovXG5cdFx0XHRjYXNlIDB4MEMwMDogLyogJ0JydFVpZCcgKi9cblx0XHRcdGNhc2UgMHgwQzAxOiAvKiAnQnJ0UmV2aXNpb25QdHInICovXG5cdFx0XHRjYXNlIDB4MDIxNjogLyogJ0JydEJvb2tQcm90ZWN0aW9uJyAqL1xuXHRcdFx0Y2FzZSAweDAyQTU6IC8qICdCcnRCb29rUHJvdGVjdGlvbklzbycgKi9cblx0XHRcdGNhc2UgMHgwMDlEOiAvKiAnQnJ0Q2FsY1Byb3AnICovXG5cdFx0XHRjYXNlIDB4MDI2MjogLyogJ0JydENyYXNoUmVjRXJyJyAqL1xuXHRcdFx0Y2FzZSAweDA4MDI6IC8qICdCcnREZWNvdXBsZWRQaXZvdENhY2hlSUQnICovXG5cdFx0XHRjYXNlIDB4MDA5QjogLyogJ0JydEZpbGVSZWNvdmVyJyAqL1xuXHRcdFx0Y2FzZSAweDAyMjQ6IC8qICdCcnRGaWxlU2hhcmluZycgKi9cblx0XHRcdGNhc2UgMHgwMkE0OiAvKiAnQnJ0RmlsZVNoYXJpbmdJc28nICovXG5cdFx0XHRjYXNlIDB4MDA4MDogLyogJ0JydEZpbGVWZXJzaW9uJyAqL1xuXHRcdFx0Y2FzZSAweDAyOTk6IC8qICdCcnRGbkdyb3VwJyAqL1xuXHRcdFx0Y2FzZSAweDA4NTA6IC8qICdCcnRNb2RlbFJlbGF0aW9uc2hpcCcgKi9cblx0XHRcdGNhc2UgMHgwODREOiAvKiAnQnJ0TW9kZWxUYWJsZScgKi9cblx0XHRcdGNhc2UgMHgwMjI1OiAvKiAnQnJ0T2xlU2l6ZScgKi9cblx0XHRcdGNhc2UgMHgwODA1OiAvKiAnQnJ0UGl2b3RUYWJsZVJlZicgKi9cblx0XHRcdGNhc2UgMHgwMjU0OiAvKiAnQnJ0U21hcnRUYWdUeXBlJyAqL1xuXHRcdFx0Y2FzZSAweDA4MUM6IC8qICdCcnRUYWJsZVNsaWNlckNhY2hlSUQnICovXG5cdFx0XHRjYXNlIDB4MDgxQjogLyogJ0JydFRhYmxlU2xpY2VyQ2FjaGVJRHMnICovXG5cdFx0XHRjYXNlIDB4MDgyMjogLyogJ0JydFRpbWVsaW5lQ2FjaGVQaXZvdENhY2hlSUQnICovXG5cdFx0XHRjYXNlIDB4MDE4RDogLyogJ0JydFVzZXJCb29rVmlldycgKi9cblx0XHRcdGNhc2UgMHgwMDlBOiAvKiAnQnJ0V2JGYWN0b2lkJyAqL1xuXHRcdFx0Y2FzZSAweDA0NUQ6IC8qICdCcnRXYlByb3AxNCcgKi9cblx0XHRcdGNhc2UgMHgwMjI5OiAvKiAnQnJ0V2ViT3B0JyAqL1xuXHRcdFx0Y2FzZSAweDA4MkI6IC8qICdCcnRXb3JrQm9va1ByMTUnICovXG5cdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRjYXNlIDB4MDAyMzogLyogJ0JydEZSVEJlZ2luJyAqL1xuXHRcdFx0XHRzdGF0ZS5wdXNoKFJfbik7IHBhc3MgPSB0cnVlOyBicmVhaztcblx0XHRcdGNhc2UgMHgwMDI0OiAvKiAnQnJ0RlJURW5kJyAqL1xuXHRcdFx0XHRzdGF0ZS5wb3AoKTsgcGFzcyA9IGZhbHNlOyBicmVhaztcblx0XHRcdGNhc2UgMHgwMDI1OiAvKiAnQnJ0QUNCZWdpbicgKi9cblx0XHRcdFx0c3RhdGUucHVzaChSX24pOyBwYXNzID0gdHJ1ZTsgYnJlYWs7XG5cdFx0XHRjYXNlIDB4MDAyNjogLyogJ0JydEFDRW5kJyAqL1xuXHRcdFx0XHRzdGF0ZS5wb3AoKTsgcGFzcyA9IGZhbHNlOyBicmVhaztcblxuXHRcdFx0Y2FzZSAweDAwMTA6IC8qICdCcnRGUlRBcmNoSUQkJyAqLyBicmVhaztcblxuXHRcdFx0ZGVmYXVsdDpcblx0XHRcdFx0aWYoKFJfbnx8XCJcIikuaW5kZXhPZihcIkJlZ2luXCIpID4gMCl7LyogZW1wdHkgKi99XG5cdFx0XHRcdGVsc2UgaWYoKFJfbnx8XCJcIikuaW5kZXhPZihcIkVuZFwiKSA+IDApey8qIGVtcHR5ICovfVxuXHRcdFx0XHRlbHNlIGlmKCFwYXNzIHx8IChvcHRzLldURiAmJiBzdGF0ZVtzdGF0ZS5sZW5ndGgtMV0gIT0gXCJCcnRBQ0JlZ2luXCIgJiYgc3RhdGVbc3RhdGUubGVuZ3RoLTFdICE9IFwiQnJ0RlJUQmVnaW5cIikpIHRocm93IG5ldyBFcnJvcihcIlVuZXhwZWN0ZWQgcmVjb3JkIFwiICsgUlQgKyBcIiBcIiArIFJfbik7XG5cdFx0fVxuXHR9LCBvcHRzKTtcblxuXHRwYXJzZV93Yl9kZWZhdWx0cyh3Yik7XG5cblx0Ly8gJEZsb3dJZ25vcmVcblx0d2IuTmFtZXMgPSBOYW1lcztcblxuXHQod2IpLnN1cGJvb2tzID0gc3VwYm9va3M7XG5cdHJldHVybiB3Yjtcbn1cblxuZnVuY3Rpb24gd3JpdGVfQlVORExFU0hTKGJhLCB3Yikge1xuXHR3cml0ZV9yZWNvcmQoYmEsIFwiQnJ0QmVnaW5CdW5kbGVTaHNcIik7XG5cdGZvcih2YXIgaWR4ID0gMDsgaWR4ICE9IHdiLlNoZWV0TmFtZXMubGVuZ3RoOyArK2lkeCkge1xuXHRcdHZhciB2aXogPSB3Yi5Xb3JrYm9vayAmJiB3Yi5Xb3JrYm9vay5TaGVldHMgJiYgd2IuV29ya2Jvb2suU2hlZXRzW2lkeF0gJiYgd2IuV29ya2Jvb2suU2hlZXRzW2lkeF0uSGlkZGVuIHx8IDA7XG5cdFx0dmFyIGQgPSB7IEhpZGRlbjogdml6LCBpVGFiSUQ6IGlkeCsxLCBzdHJSZWxJRDogJ3JJZCcgKyAoaWR4KzEpLCBuYW1lOiB3Yi5TaGVldE5hbWVzW2lkeF0gfTtcblx0XHR3cml0ZV9yZWNvcmQoYmEsIFwiQnJ0QnVuZGxlU2hcIiwgd3JpdGVfQnJ0QnVuZGxlU2goZCkpO1xuXHR9XG5cdHdyaXRlX3JlY29yZChiYSwgXCJCcnRFbmRCdW5kbGVTaHNcIik7XG59XG5cbi8qIFtNUy1YTFNCXSAyLjQuNjQ5IEJydEZpbGVWZXJzaW9uICovXG5mdW5jdGlvbiB3cml0ZV9CcnRGaWxlVmVyc2lvbihkYXRhLCBvKSB7XG5cdGlmKCFvKSBvID0gbmV3X2J1ZigxMjcpO1xuXHRmb3IodmFyIGkgPSAwOyBpICE9IDQ7ICsraSkgby53cml0ZV9zaGlmdCg0LCAwKTtcblx0d3JpdGVfWExXaWRlU3RyaW5nKFwiU2hlZXRKU1wiLCBvKTtcblx0d3JpdGVfWExXaWRlU3RyaW5nKFhMU1gudmVyc2lvbiwgbyk7XG5cdHdyaXRlX1hMV2lkZVN0cmluZyhYTFNYLnZlcnNpb24sIG8pO1xuXHR3cml0ZV9YTFdpZGVTdHJpbmcoXCI3MjYyXCIsIG8pO1xuXHRvLmxlbmd0aCA9IG8ubDtcblx0cmV0dXJuIG8ubGVuZ3RoID4gby5sID8gby5zbGljZSgwLCBvLmwpIDogbztcbn1cblxuLyogW01TLVhMU0JdIDIuNC4zMDEgQnJ0Qm9va1ZpZXcgKi9cbmZ1bmN0aW9uIHdyaXRlX0JydEJvb2tWaWV3KGlkeCwgbykge1xuXHRpZighbykgbyA9IG5ld19idWYoMjkpO1xuXHRvLndyaXRlX3NoaWZ0KC00LCAwKTtcblx0by53cml0ZV9zaGlmdCgtNCwgNDYwKTtcblx0by53cml0ZV9zaGlmdCg0LCAgMjg4MDApO1xuXHRvLndyaXRlX3NoaWZ0KDQsICAxNzYwMCk7XG5cdG8ud3JpdGVfc2hpZnQoNCwgIDUwMCk7XG5cdG8ud3JpdGVfc2hpZnQoNCwgIGlkeCk7XG5cdG8ud3JpdGVfc2hpZnQoNCwgIGlkeCk7XG5cdHZhciBmbGFncyA9IDB4Nzg7XG5cdG8ud3JpdGVfc2hpZnQoMSwgIGZsYWdzKTtcblx0cmV0dXJuIG8ubGVuZ3RoID4gby5sID8gby5zbGljZSgwLCBvLmwpIDogbztcbn1cblxuZnVuY3Rpb24gd3JpdGVfQk9PS1ZJRVdTKGJhLCB3Yikge1xuXHQvKiByZXF1aXJlZCBpZiBoaWRkZW4gdGFiIGFwcGVhcnMgYmVmb3JlIHZpc2libGUgdGFiICovXG5cdGlmKCF3Yi5Xb3JrYm9vayB8fCAhd2IuV29ya2Jvb2suU2hlZXRzKSByZXR1cm47XG5cdHZhciBzaGVldHMgPSB3Yi5Xb3JrYm9vay5TaGVldHM7XG5cdHZhciBpID0gMCwgdmlzdGFiID0gLTEsIGhpZGRlbiA9IC0xO1xuXHRmb3IoOyBpIDwgc2hlZXRzLmxlbmd0aDsgKytpKSB7XG5cdFx0aWYoIXNoZWV0c1tpXSB8fCAhc2hlZXRzW2ldLkhpZGRlbiAmJiB2aXN0YWIgPT0gLTEpIHZpc3RhYiA9IGk7XG5cdFx0ZWxzZSBpZihzaGVldHNbaV0uSGlkZGVuID09IDEgJiYgaGlkZGVuID09IC0xKSBoaWRkZW4gPSBpO1xuXHR9XG5cdGlmKGhpZGRlbiA+IHZpc3RhYikgcmV0dXJuO1xuXHR3cml0ZV9yZWNvcmQoYmEsIFwiQnJ0QmVnaW5Cb29rVmlld3NcIik7XG5cdHdyaXRlX3JlY29yZChiYSwgXCJCcnRCb29rVmlld1wiLCB3cml0ZV9CcnRCb29rVmlldyh2aXN0YWIpKTtcblx0LyogMSooQnJ0Qm9va1ZpZXcgKkZSVCkgKi9cblx0d3JpdGVfcmVjb3JkKGJhLCBcIkJydEVuZEJvb2tWaWV3c1wiKTtcbn1cblxuLyogW01TLVhMU0JdIDIuNC4zMDUgQnJ0Q2FsY1Byb3AgKi9cbi8qZnVuY3Rpb24gd3JpdGVfQnJ0Q2FsY1Byb3AoZGF0YSwgbykge1xuXHRpZighbykgbyA9IG5ld19idWYoMjYpO1xuXHRvLndyaXRlX3NoaWZ0KDQsMCk7IC8vIGZvcmNlIHJlY2FsY1xuXHRvLndyaXRlX3NoaWZ0KDQsMSk7XG5cdG8ud3JpdGVfc2hpZnQoNCwwKTtcblx0d3JpdGVfWG51bSgwLCBvKTtcblx0by53cml0ZV9zaGlmdCgtNCwgMTAyMyk7XG5cdG8ud3JpdGVfc2hpZnQoMSwgMHgzMyk7XG5cdG8ud3JpdGVfc2hpZnQoMSwgMHgwMCk7XG5cdHJldHVybiBvO1xufSovXG5cbi8qIFtNUy1YTFNCXSAyLjQuNjQ2IEJydEZpbGVSZWNvdmVyICovXG4vKmZ1bmN0aW9uIHdyaXRlX0JydEZpbGVSZWNvdmVyKGRhdGEsIG8pIHtcblx0aWYoIW8pIG8gPSBuZXdfYnVmKDEpO1xuXHRvLndyaXRlX3NoaWZ0KDEsMCk7XG5cdHJldHVybiBvO1xufSovXG5cbi8qIFtNUy1YTFNCXSAyLjEuNy42MSBXb3JrYm9vayAqL1xuZnVuY3Rpb24gd3JpdGVfd2JfYmluKHdiLCBvcHRzKSB7XG5cdHZhciBiYSA9IGJ1Zl9hcnJheSgpO1xuXHR3cml0ZV9yZWNvcmQoYmEsIFwiQnJ0QmVnaW5Cb29rXCIpO1xuXHR3cml0ZV9yZWNvcmQoYmEsIFwiQnJ0RmlsZVZlcnNpb25cIiwgd3JpdGVfQnJ0RmlsZVZlcnNpb24oKSk7XG5cdC8qIFtbQnJ0RmlsZVNoYXJpbmdJc29dIEJydEZpbGVTaGFyaW5nXSAqL1xuXHR3cml0ZV9yZWNvcmQoYmEsIFwiQnJ0V2JQcm9wXCIsIHdyaXRlX0JydFdiUHJvcCh3Yi5Xb3JrYm9vayAmJiB3Yi5Xb3JrYm9vay5XQlByb3BzIHx8IG51bGwpKTtcblx0LyogW0FDQUJTUEFUSF0gKi9cblx0LyogW1tCcnRCb29rUHJvdGVjdGlvbklzb10gQnJ0Qm9va1Byb3RlY3Rpb25dICovXG5cdHdyaXRlX0JPT0tWSUVXUyhiYSwgd2IsIG9wdHMpO1xuXHR3cml0ZV9CVU5ETEVTSFMoYmEsIHdiLCBvcHRzKTtcblx0LyogW0ZOR1JPVVBdICovXG5cdC8qIFtFWFRFUk5BTFNdICovXG5cdC8qICpCcnROYW1lICovXG5cdC8qIHdyaXRlX3JlY29yZChiYSwgXCJCcnRDYWxjUHJvcFwiLCB3cml0ZV9CcnRDYWxjUHJvcCgpKTsgKi9cblx0LyogW0JydE9sZVNpemVdICovXG5cdC8qICooQnJ0VXNlckJvb2tWaWV3ICpGUlQpICovXG5cdC8qIFtQSVZPVENBQ0hFSURTXSAqL1xuXHQvKiBbQnJ0V2JGYWN0b2lkXSAqL1xuXHQvKiBbU01BUlRUQUdUWVBFU10gKi9cblx0LyogW0JydFdlYk9wdF0gKi9cblx0Lyogd3JpdGVfcmVjb3JkKGJhLCBcIkJydEZpbGVSZWNvdmVyXCIsIHdyaXRlX0JydEZpbGVSZWNvdmVyKCkpOyAqL1xuXHQvKiBbV0VCUFVCSVRFTVNdICovXG5cdC8qIFtDUkVSUlNdICovXG5cdC8qIEZSVFdPUktCT09LICovXG5cdHdyaXRlX3JlY29yZChiYSwgXCJCcnRFbmRCb29rXCIpO1xuXG5cdHJldHVybiBiYS5lbmQoKTtcbn1cbmZ1bmN0aW9uIHBhcnNlX3diKGRhdGEsIG5hbWUsIG9wdHMpIHtcblx0aWYobmFtZS5zbGljZSgtNCk9PT1cIi5iaW5cIikgcmV0dXJuIHBhcnNlX3diX2JpbigoZGF0YSksIG9wdHMpO1xuXHRyZXR1cm4gcGFyc2Vfd2JfeG1sKChkYXRhKSwgb3B0cyk7XG59XG5cbmZ1bmN0aW9uIHBhcnNlX3dzKGRhdGEsIG5hbWUsIGlkeCwgb3B0cywgcmVscywgd2IsIHRoZW1lcywgc3R5bGVzKSB7XG5cdGlmKG5hbWUuc2xpY2UoLTQpPT09XCIuYmluXCIpIHJldHVybiBwYXJzZV93c19iaW4oKGRhdGEpLCBvcHRzLCBpZHgsIHJlbHMsIHdiLCB0aGVtZXMsIHN0eWxlcyk7XG5cdHJldHVybiBwYXJzZV93c194bWwoKGRhdGEpLCBvcHRzLCBpZHgsIHJlbHMsIHdiLCB0aGVtZXMsIHN0eWxlcyk7XG59XG5cbmZ1bmN0aW9uIHBhcnNlX2NzKGRhdGEsIG5hbWUsIGlkeCwgb3B0cywgcmVscywgd2IsIHRoZW1lcywgc3R5bGVzKSB7XG5cdGlmKG5hbWUuc2xpY2UoLTQpPT09XCIuYmluXCIpIHJldHVybiBwYXJzZV9jc19iaW4oKGRhdGEpLCBvcHRzLCBpZHgsIHJlbHMsIHdiLCB0aGVtZXMsIHN0eWxlcyk7XG5cdHJldHVybiBwYXJzZV9jc194bWwoKGRhdGEpLCBvcHRzLCBpZHgsIHJlbHMsIHdiLCB0aGVtZXMsIHN0eWxlcyk7XG59XG5cbmZ1bmN0aW9uIHBhcnNlX21zKGRhdGEsIG5hbWUsIGlkeCwgb3B0cywgcmVscywgd2IsIHRoZW1lcywgc3R5bGVzKSB7XG5cdGlmKG5hbWUuc2xpY2UoLTQpPT09XCIuYmluXCIpIHJldHVybiBwYXJzZV9tc19iaW4oKGRhdGEpLCBvcHRzLCBpZHgsIHJlbHMsIHdiLCB0aGVtZXMsIHN0eWxlcyk7XG5cdHJldHVybiBwYXJzZV9tc194bWwoKGRhdGEpLCBvcHRzLCBpZHgsIHJlbHMsIHdiLCB0aGVtZXMsIHN0eWxlcyk7XG59XG5cbmZ1bmN0aW9uIHBhcnNlX2RzKGRhdGEsIG5hbWUsIGlkeCwgb3B0cywgcmVscywgd2IsIHRoZW1lcywgc3R5bGVzKSB7XG5cdGlmKG5hbWUuc2xpY2UoLTQpPT09XCIuYmluXCIpIHJldHVybiBwYXJzZV9kc19iaW4oKGRhdGEpLCBvcHRzLCBpZHgsIHJlbHMsIHdiLCB0aGVtZXMsIHN0eWxlcyk7XG5cdHJldHVybiBwYXJzZV9kc194bWwoKGRhdGEpLCBvcHRzLCBpZHgsIHJlbHMsIHdiLCB0aGVtZXMsIHN0eWxlcyk7XG59XG5cbmZ1bmN0aW9uIHBhcnNlX3N0eShkYXRhLCBuYW1lLCB0aGVtZXMsIG9wdHMpIHtcblx0aWYobmFtZS5zbGljZSgtNCk9PT1cIi5iaW5cIikgcmV0dXJuIHBhcnNlX3N0eV9iaW4oKGRhdGEpLCB0aGVtZXMsIG9wdHMpO1xuXHRyZXR1cm4gcGFyc2Vfc3R5X3htbCgoZGF0YSksIHRoZW1lcywgb3B0cyk7XG59XG5cbmZ1bmN0aW9uIHBhcnNlX3RoZW1lKGRhdGEsIG5hbWUsIG9wdHMpIHtcblx0cmV0dXJuIHBhcnNlX3RoZW1lX3htbChkYXRhLCBvcHRzKTtcbn1cblxuZnVuY3Rpb24gcGFyc2Vfc3N0KGRhdGEsIG5hbWUsIG9wdHMpIHtcblx0aWYobmFtZS5zbGljZSgtNCk9PT1cIi5iaW5cIikgcmV0dXJuIHBhcnNlX3NzdF9iaW4oKGRhdGEpLCBvcHRzKTtcblx0cmV0dXJuIHBhcnNlX3NzdF94bWwoKGRhdGEpLCBvcHRzKTtcbn1cblxuZnVuY3Rpb24gcGFyc2VfY21udChkYXRhLCBuYW1lLCBvcHRzKSB7XG5cdGlmKG5hbWUuc2xpY2UoLTQpPT09XCIuYmluXCIpIHJldHVybiBwYXJzZV9jb21tZW50c19iaW4oKGRhdGEpLCBvcHRzKTtcblx0cmV0dXJuIHBhcnNlX2NvbW1lbnRzX3htbCgoZGF0YSksIG9wdHMpO1xufVxuXG5mdW5jdGlvbiBwYXJzZV9jYyhkYXRhLCBuYW1lLCBvcHRzKSB7XG5cdGlmKG5hbWUuc2xpY2UoLTQpPT09XCIuYmluXCIpIHJldHVybiBwYXJzZV9jY19iaW4oKGRhdGEpLCBuYW1lLCBvcHRzKTtcblx0cmV0dXJuIHBhcnNlX2NjX3htbCgoZGF0YSksIG5hbWUsIG9wdHMpO1xufVxuXG5mdW5jdGlvbiBwYXJzZV94bGluayhkYXRhLCByZWwsIG5hbWUsIG9wdHMpIHtcblx0aWYobmFtZS5zbGljZSgtNCk9PT1cIi5iaW5cIikgcmV0dXJuIHBhcnNlX3hsaW5rX2JpbigoZGF0YSksIHJlbCwgbmFtZSwgb3B0cyk7XG5cdHJldHVybiBwYXJzZV94bGlua194bWwoKGRhdGEpLCByZWwsIG5hbWUsIG9wdHMpO1xufVxuXG5mdW5jdGlvbiB3cml0ZV93Yih3YiwgbmFtZSwgb3B0cykge1xuXHRyZXR1cm4gKG5hbWUuc2xpY2UoLTQpPT09XCIuYmluXCIgPyB3cml0ZV93Yl9iaW4gOiB3cml0ZV93Yl94bWwpKHdiLCBvcHRzKTtcbn1cblxuZnVuY3Rpb24gd3JpdGVfd3MoZGF0YSwgbmFtZSwgb3B0cywgd2IsIHJlbHMpIHtcblx0cmV0dXJuIChuYW1lLnNsaWNlKC00KT09PVwiLmJpblwiID8gd3JpdGVfd3NfYmluIDogd3JpdGVfd3NfeG1sKShkYXRhLCBvcHRzLCB3YiwgcmVscyk7XG59XG5cbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11bnVzZWQtdmFyc1xuZnVuY3Rpb24gd3JpdGVfY3MoZGF0YSwgbmFtZSwgb3B0cywgd2IsIHJlbHMpIHtcblx0cmV0dXJuIChuYW1lLnNsaWNlKC00KT09PVwiLmJpblwiID8gd3JpdGVfY3NfYmluIDogd3JpdGVfY3NfeG1sKShkYXRhLCBvcHRzLCB3YiwgcmVscyk7XG59XG5cbmZ1bmN0aW9uIHdyaXRlX3N0eShkYXRhLCBuYW1lLCBvcHRzKSB7XG5cdHJldHVybiAobmFtZS5zbGljZSgtNCk9PT1cIi5iaW5cIiA/IHdyaXRlX3N0eV9iaW4gOiB3cml0ZV9zdHlfeG1sKShkYXRhLCBvcHRzKTtcbn1cblxuZnVuY3Rpb24gd3JpdGVfc3N0KGRhdGEsIG5hbWUsIG9wdHMpIHtcblx0cmV0dXJuIChuYW1lLnNsaWNlKC00KT09PVwiLmJpblwiID8gd3JpdGVfc3N0X2JpbiA6IHdyaXRlX3NzdF94bWwpKGRhdGEsIG9wdHMpO1xufVxuXG5mdW5jdGlvbiB3cml0ZV9jbW50KGRhdGEsIG5hbWUsIG9wdHMpIHtcblx0cmV0dXJuIChuYW1lLnNsaWNlKC00KT09PVwiLmJpblwiID8gd3JpdGVfY29tbWVudHNfYmluIDogd3JpdGVfY29tbWVudHNfeG1sKShkYXRhLCBvcHRzKTtcbn1cbi8qXG5mdW5jdGlvbiB3cml0ZV9jYyhkYXRhLCBuYW1lOnN0cmluZywgb3B0cykge1xuXHRyZXR1cm4gKG5hbWUuc2xpY2UoLTQpPT09XCIuYmluXCIgPyB3cml0ZV9jY19iaW4gOiB3cml0ZV9jY194bWwpKGRhdGEsIG9wdHMpO1xufVxuKi9cbnZhciBhdHRyZWdleGcyPS8oW1xcdzpdKyk9KCg/OlwiKShbXlwiXSopKD86XCIpfCg/OicpKFteJ10qKSg/OicpKS9nO1xudmFyIGF0dHJlZ2V4Mj0vKFtcXHc6XSspPSgoPzpcIikoPzpbXlwiXSopKD86XCIpfCg/OicpKD86W14nXSopKD86JykpLztcbmZ1bmN0aW9uIHhsbWxfcGFyc2V4bWx0YWcodGFnLCBza2lwX3Jvb3QpIHtcblx0dmFyIHdvcmRzID0gdGFnLnNwbGl0KC9cXHMrLyk7XG5cdHZhciB6ID0gKFtdKTsgaWYoIXNraXBfcm9vdCkgelswXSA9IHdvcmRzWzBdO1xuXHRpZih3b3Jkcy5sZW5ndGggPT09IDEpIHJldHVybiB6O1xuXHR2YXIgbSA9IHRhZy5tYXRjaChhdHRyZWdleGcyKSwgeSwgaiwgdywgaTtcblx0aWYobSkgZm9yKGkgPSAwOyBpICE9IG0ubGVuZ3RoOyArK2kpIHtcblx0XHR5ID0gbVtpXS5tYXRjaChhdHRyZWdleDIpO1xuaWYoKGo9eVsxXS5pbmRleE9mKFwiOlwiKSkgPT09IC0xKSB6W3lbMV1dID0geVsyXS5zbGljZSgxLHlbMl0ubGVuZ3RoLTEpO1xuXHRcdGVsc2Uge1xuXHRcdFx0aWYoeVsxXS5zbGljZSgwLDYpID09PSBcInhtbG5zOlwiKSB3ID0gXCJ4bWxuc1wiK3lbMV0uc2xpY2UoNik7XG5cdFx0XHRlbHNlIHcgPSB5WzFdLnNsaWNlKGorMSk7XG5cdFx0XHR6W3ddID0geVsyXS5zbGljZSgxLHlbMl0ubGVuZ3RoLTEpO1xuXHRcdH1cblx0fVxuXHRyZXR1cm4gejtcbn1cbmZ1bmN0aW9uIHhsbWxfcGFyc2V4bWx0YWdvYmoodGFnKSB7XG5cdHZhciB3b3JkcyA9IHRhZy5zcGxpdCgvXFxzKy8pO1xuXHR2YXIgeiA9IHt9O1xuXHRpZih3b3Jkcy5sZW5ndGggPT09IDEpIHJldHVybiB6O1xuXHR2YXIgbSA9IHRhZy5tYXRjaChhdHRyZWdleGcyKSwgeSwgaiwgdywgaTtcblx0aWYobSkgZm9yKGkgPSAwOyBpICE9IG0ubGVuZ3RoOyArK2kpIHtcblx0XHR5ID0gbVtpXS5tYXRjaChhdHRyZWdleDIpO1xuaWYoKGo9eVsxXS5pbmRleE9mKFwiOlwiKSkgPT09IC0xKSB6W3lbMV1dID0geVsyXS5zbGljZSgxLHlbMl0ubGVuZ3RoLTEpO1xuXHRcdGVsc2Uge1xuXHRcdFx0aWYoeVsxXS5zbGljZSgwLDYpID09PSBcInhtbG5zOlwiKSB3ID0gXCJ4bWxuc1wiK3lbMV0uc2xpY2UoNik7XG5cdFx0XHRlbHNlIHcgPSB5WzFdLnNsaWNlKGorMSk7XG5cdFx0XHR6W3ddID0geVsyXS5zbGljZSgxLHlbMl0ubGVuZ3RoLTEpO1xuXHRcdH1cblx0fVxuXHRyZXR1cm4gejtcbn1cblxuLy8gLS0tLVxuXG5mdW5jdGlvbiB4bG1sX2Zvcm1hdChmb3JtYXQsIHZhbHVlKSB7XG5cdHZhciBmbXQgPSBYTE1MRm9ybWF0TWFwW2Zvcm1hdF0gfHwgdW5lc2NhcGV4bWwoZm9ybWF0KTtcblx0aWYoZm10ID09PSBcIkdlbmVyYWxcIikgcmV0dXJuIFNTRi5fZ2VuZXJhbCh2YWx1ZSk7XG5cdHJldHVybiBTU0YuZm9ybWF0KGZtdCwgdmFsdWUpO1xufVxuXG5mdW5jdGlvbiB4bG1sX3NldF9jdXN0cHJvcChDdXN0cHJvcHMsIGtleSwgY3AsIHZhbCkge1xuXHR2YXIgb3ZhbCA9IHZhbDtcblx0c3dpdGNoKChjcFswXS5tYXRjaCgvZHQ6ZHQ9XCIoW1xcdy5dKylcIi8pfHxbXCJcIixcIlwiXSlbMV0pIHtcblx0XHRjYXNlIFwiYm9vbGVhblwiOiBvdmFsID0gcGFyc2V4bWxib29sKHZhbCk7IGJyZWFrO1xuXHRcdGNhc2UgXCJpMlwiOiBjYXNlIFwiaW50XCI6IG92YWwgPSBwYXJzZUludCh2YWwsIDEwKTsgYnJlYWs7XG5cdFx0Y2FzZSBcInI0XCI6IGNhc2UgXCJmbG9hdFwiOiBvdmFsID0gcGFyc2VGbG9hdCh2YWwpOyBicmVhaztcblx0XHRjYXNlIFwiZGF0ZVwiOiBjYXNlIFwiZGF0ZVRpbWUudHpcIjogb3ZhbCA9IHBhcnNlRGF0ZSh2YWwpOyBicmVhaztcblx0XHRjYXNlIFwiaThcIjogY2FzZSBcInN0cmluZ1wiOiBjYXNlIFwiZml4ZWRcIjogY2FzZSBcInV1aWRcIjogY2FzZSBcImJpbi5iYXNlNjRcIjogYnJlYWs7XG5cdFx0ZGVmYXVsdDogdGhyb3cgbmV3IEVycm9yKFwiYmFkIGN1c3Rwcm9wOlwiICsgY3BbMF0pO1xuXHR9XG5cdEN1c3Rwcm9wc1t1bmVzY2FwZXhtbChrZXkpXSA9IG92YWw7XG59XG5cbmZ1bmN0aW9uIHNhZmVfZm9ybWF0X3hsbWwoY2VsbCwgbmYsIG8pIHtcblx0aWYoY2VsbC50ID09PSAneicpIHJldHVybjtcblx0aWYoIW8gfHwgby5jZWxsVGV4dCAhPT0gZmFsc2UpIHRyeSB7XG5cdFx0aWYoY2VsbC50ID09PSAnZScpIHsgY2VsbC53ID0gY2VsbC53IHx8IEJFcnJbY2VsbC52XTsgfVxuXHRcdGVsc2UgaWYobmYgPT09IFwiR2VuZXJhbFwiKSB7XG5cdFx0XHRpZihjZWxsLnQgPT09ICduJykge1xuXHRcdFx0XHRpZigoY2VsbC52fDApID09PSBjZWxsLnYpIGNlbGwudyA9IFNTRi5fZ2VuZXJhbF9pbnQoY2VsbC52KTtcblx0XHRcdFx0ZWxzZSBjZWxsLncgPSBTU0YuX2dlbmVyYWxfbnVtKGNlbGwudik7XG5cdFx0XHR9XG5cdFx0XHRlbHNlIGNlbGwudyA9IFNTRi5fZ2VuZXJhbChjZWxsLnYpO1xuXHRcdH1cblx0XHRlbHNlIGNlbGwudyA9IHhsbWxfZm9ybWF0KG5mfHxcIkdlbmVyYWxcIiwgY2VsbC52KTtcblx0fSBjYXRjaChlKSB7IGlmKG8uV1RGKSB0aHJvdyBlOyB9XG5cdHRyeSB7XG5cdFx0dmFyIHogPSBYTE1MRm9ybWF0TWFwW25mXXx8bmZ8fFwiR2VuZXJhbFwiO1xuXHRcdGlmKG8uY2VsbE5GKSBjZWxsLnogPSB6O1xuXHRcdGlmKG8uY2VsbERhdGVzICYmIGNlbGwudCA9PSAnbicgJiYgU1NGLmlzX2RhdGUoeikpIHtcblx0XHRcdHZhciBfZCA9IFNTRi5wYXJzZV9kYXRlX2NvZGUoY2VsbC52KTsgaWYoX2QpIHsgY2VsbC50ID0gJ2QnOyBjZWxsLnYgPSBuZXcgRGF0ZShfZC55LCBfZC5tLTEsX2QuZCxfZC5ILF9kLk0sX2QuUyxfZC51KTsgfVxuXHRcdH1cblx0fSBjYXRjaChlKSB7IGlmKG8uV1RGKSB0aHJvdyBlOyB9XG59XG5cbmZ1bmN0aW9uIHByb2Nlc3Nfc3R5bGVfeGxtbChzdHlsZXMsIHN0YWcsIG9wdHMpIHtcblx0aWYob3B0cy5jZWxsU3R5bGVzKSB7XG5cdFx0aWYoc3RhZy5JbnRlcmlvcikge1xuXHRcdFx0dmFyIEkgPSBzdGFnLkludGVyaW9yO1xuXHRcdFx0aWYoSS5QYXR0ZXJuKSBJLnBhdHRlcm5UeXBlID0gWExNTFBhdHRlcm5UeXBlTWFwW0kuUGF0dGVybl0gfHwgSS5QYXR0ZXJuO1xuXHRcdH1cblx0fVxuXHRzdHlsZXNbc3RhZy5JRF0gPSBzdGFnO1xufVxuXG4vKiBUT0RPOiB0aGVyZSBtdXN0IGV4aXN0IHNvbWUgZm9ybSBvZiBPU1AtYmxlc3NlZCBzcGVjICovXG5mdW5jdGlvbiBwYXJzZV94bG1sX2RhdGEoeG1sLCBzcywgZGF0YSwgY2VsbCwgYmFzZSwgc3R5bGVzLCBjc3R5LCByb3csIGFycmF5Ziwgbykge1xuXHR2YXIgbmYgPSBcIkdlbmVyYWxcIiwgc2lkID0gY2VsbC5TdHlsZUlELCBTID0ge307IG8gPSBvIHx8IHt9O1xuXHR2YXIgaW50ZXJpb3JzID0gW107XG5cdHZhciBpID0gMDtcblx0aWYoc2lkID09PSB1bmRlZmluZWQgJiYgcm93KSBzaWQgPSByb3cuU3R5bGVJRDtcblx0aWYoc2lkID09PSB1bmRlZmluZWQgJiYgY3N0eSkgc2lkID0gY3N0eS5TdHlsZUlEO1xuXHR3aGlsZShzdHlsZXNbc2lkXSAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0aWYoc3R5bGVzW3NpZF0ubmYpIG5mID0gc3R5bGVzW3NpZF0ubmY7XG5cdFx0aWYoc3R5bGVzW3NpZF0uSW50ZXJpb3IpIGludGVyaW9ycy5wdXNoKHN0eWxlc1tzaWRdLkludGVyaW9yKTtcblx0XHRpZighc3R5bGVzW3NpZF0uUGFyZW50KSBicmVhaztcblx0XHRzaWQgPSBzdHlsZXNbc2lkXS5QYXJlbnQ7XG5cdH1cblx0c3dpdGNoKGRhdGEuVHlwZSkge1xuXHRcdGNhc2UgJ0Jvb2xlYW4nOlxuXHRcdFx0Y2VsbC50ID0gJ2InO1xuXHRcdFx0Y2VsbC52ID0gcGFyc2V4bWxib29sKHhtbCk7XG5cdFx0XHRicmVhaztcblx0XHRjYXNlICdTdHJpbmcnOlxuXHRcdFx0Y2VsbC50ID0gJ3MnOyBjZWxsLnIgPSB4bG1sX2ZpeHN0cih1bmVzY2FwZXhtbCh4bWwpKTtcblx0XHRcdGNlbGwudiA9ICh4bWwuaW5kZXhPZihcIjxcIikgPiAtMSA/IHVuZXNjYXBleG1sKHNzfHx4bWwpLnJlcGxhY2UoLzwuKj8+L2csIFwiXCIpIDogY2VsbC5yKTsgLy8gdG9kbzogQlIgZXRjXG5cdFx0XHRicmVhaztcblx0XHRjYXNlICdEYXRlVGltZSc6XG5cdFx0XHRpZih4bWwuc2xpY2UoLTEpICE9IFwiWlwiKSB4bWwgKz0gXCJaXCI7XG5cdFx0XHRjZWxsLnYgPSAocGFyc2VEYXRlKHhtbCkgLSBuZXcgRGF0ZShEYXRlLlVUQygxODk5LCAxMSwgMzApKSkgLyAoMjQgKiA2MCAqIDYwICogMTAwMCk7XG5cdFx0XHRpZihjZWxsLnYgIT09IGNlbGwudikgY2VsbC52ID0gdW5lc2NhcGV4bWwoeG1sKTtcblx0XHRcdGVsc2UgaWYoY2VsbC52PDYwKSBjZWxsLnYgPSBjZWxsLnYgLTE7XG5cdFx0XHRpZighbmYgfHwgbmYgPT0gXCJHZW5lcmFsXCIpIG5mID0gXCJ5eXl5LW1tLWRkXCI7XG5cdFx0XHQvKiBmYWxscyB0aHJvdWdoICovXG5cdFx0Y2FzZSAnTnVtYmVyJzpcblx0XHRcdGlmKGNlbGwudiA9PT0gdW5kZWZpbmVkKSBjZWxsLnY9K3htbDtcblx0XHRcdGlmKCFjZWxsLnQpIGNlbGwudCA9ICduJztcblx0XHRcdGJyZWFrO1xuXHRcdGNhc2UgJ0Vycm9yJzogY2VsbC50ID0gJ2UnOyBjZWxsLnYgPSBSQkVyclt4bWxdOyBpZihvLmNlbGxUZXh0ICE9PSBmYWxzZSkgY2VsbC53ID0geG1sOyBicmVhaztcblx0XHRkZWZhdWx0OlxuXHRcdFx0aWYoeG1sID09IFwiXCIgJiYgc3MgPT0gXCJcIikgeyBjZWxsLnQgPSAneic7IH1cblx0XHRcdGVsc2UgeyBjZWxsLnQgPSAncyc7IGNlbGwudiA9IHhsbWxfZml4c3RyKHNzfHx4bWwpOyB9XG5cdFx0XHRicmVhaztcblx0fVxuXHRzYWZlX2Zvcm1hdF94bG1sKGNlbGwsIG5mLCBvKTtcblx0aWYoby5jZWxsRm9ybXVsYSAhPT0gZmFsc2UpIHtcblx0XHRpZihjZWxsLkZvcm11bGEpIHtcblx0XHRcdHZhciBmc3RyID0gdW5lc2NhcGV4bWwoY2VsbC5Gb3JtdWxhKTtcblx0XHRcdC8qIHN0cmljdGx5IHNwZWFraW5nLCB0aGUgbGVhZGluZyA9IGlzIHJlcXVpcmVkIGJ1dCBzb21lIHdyaXRlcnMgb21pdCAqL1xuXHRcdFx0aWYoZnN0ci5jaGFyQ29kZUF0KDApID09IDYxIC8qID0gKi8pIGZzdHIgPSBmc3RyLnNsaWNlKDEpO1xuXHRcdFx0Y2VsbC5mID0gcmNfdG9fYTEoZnN0ciwgYmFzZSk7XG5cdFx0XHRkZWxldGUgY2VsbC5Gb3JtdWxhO1xuXHRcdFx0aWYoY2VsbC5BcnJheVJhbmdlID09IFwiUkNcIikgY2VsbC5GID0gcmNfdG9fYTEoXCJSQzpSQ1wiLCBiYXNlKTtcblx0XHRcdGVsc2UgaWYoY2VsbC5BcnJheVJhbmdlKSB7XG5cdFx0XHRcdGNlbGwuRiA9IHJjX3RvX2ExKGNlbGwuQXJyYXlSYW5nZSwgYmFzZSk7XG5cdFx0XHRcdGFycmF5Zi5wdXNoKFtzYWZlX2RlY29kZV9yYW5nZShjZWxsLkYpLCBjZWxsLkZdKTtcblx0XHRcdH1cblx0XHR9IGVsc2Uge1xuXHRcdFx0Zm9yKGkgPSAwOyBpIDwgYXJyYXlmLmxlbmd0aDsgKytpKVxuXHRcdFx0XHRpZihiYXNlLnIgPj0gYXJyYXlmW2ldWzBdLnMuciAmJiBiYXNlLnIgPD0gYXJyYXlmW2ldWzBdLmUucilcblx0XHRcdFx0XHRpZihiYXNlLmMgPj0gYXJyYXlmW2ldWzBdLnMuYyAmJiBiYXNlLmMgPD0gYXJyYXlmW2ldWzBdLmUuYylcblx0XHRcdFx0XHRcdGNlbGwuRiA9IGFycmF5ZltpXVsxXTtcblx0XHR9XG5cdH1cblx0aWYoby5jZWxsU3R5bGVzKSB7XG5cdFx0aW50ZXJpb3JzLmZvckVhY2goZnVuY3Rpb24oeCkge1xuXHRcdFx0aWYoIVMucGF0dGVyblR5cGUgJiYgeC5wYXR0ZXJuVHlwZSkgUy5wYXR0ZXJuVHlwZSA9IHgucGF0dGVyblR5cGU7XG5cdFx0fSk7XG5cdFx0Y2VsbC5zID0gUztcblx0fVxuXHRpZihjZWxsLlN0eWxlSUQgIT09IHVuZGVmaW5lZCkgY2VsbC5peGZlID0gY2VsbC5TdHlsZUlEO1xufVxuXG5mdW5jdGlvbiB4bG1sX2NsZWFuX2NvbW1lbnQoY29tbWVudCkge1xuXHRjb21tZW50LnQgPSBjb21tZW50LnYgfHwgXCJcIjtcblx0Y29tbWVudC50ID0gY29tbWVudC50LnJlcGxhY2UoL1xcclxcbi9nLFwiXFxuXCIpLnJlcGxhY2UoL1xcci9nLFwiXFxuXCIpO1xuXHRjb21tZW50LnYgPSBjb21tZW50LncgPSBjb21tZW50Lml4ZmUgPSB1bmRlZmluZWQ7XG59XG5cbmZ1bmN0aW9uIHhsbWxfbm9ybWFsaXplKGQpIHtcblx0aWYoaGFzX2J1ZiAmJiBCdWZmZXIuaXNCdWZmZXIoZCkpIHJldHVybiBkLnRvU3RyaW5nKCd1dGY4Jyk7XG5cdGlmKHR5cGVvZiBkID09PSAnc3RyaW5nJykgcmV0dXJuIGQ7XG5cdC8qIGR1a3RhcGUgKi9cblx0aWYodHlwZW9mIFVpbnQ4QXJyYXkgIT09ICd1bmRlZmluZWQnICYmIGQgaW5zdGFuY2VvZiBVaW50OEFycmF5KSByZXR1cm4gdXRmOHJlYWQoYTJzKGFiMmEoZCkpKTtcblx0dGhyb3cgbmV3IEVycm9yKFwiQmFkIGlucHV0IGZvcm1hdDogZXhwZWN0ZWQgQnVmZmVyIG9yIHN0cmluZ1wiKTtcbn1cblxuLyogVE9ETzogRXZlcnl0aGluZyAqL1xuLyogVU9TIHVzZXMgQ0pLIGluIHRhZ3MgKi9cbnZhciB4bG1scmVnZXggPSAvPChcXC8/KShbXlxccz8+PCFcXC86XSo6fCkoW15cXHM/PD46XFwvXSspKD86W1xccz86XFwvXVtePl0qKT8+L21nO1xuLy92YXIgeGxtbHJlZ2V4ID0gLzwoXFwvPykoW2EtejAtOV0qOnwpKFxcdyspW14+XSo+L21nO1xuZnVuY3Rpb24gcGFyc2VfeGxtbF94bWwoZCwgX29wdHMpIHtcblx0dmFyIG9wdHMgPSBfb3B0cyB8fCB7fTtcblx0bWFrZV9zc2YoU1NGKTtcblx0dmFyIHN0ciA9IGRlYm9tKHhsbWxfbm9ybWFsaXplKGQpKTtcblx0aWYob3B0cy50eXBlID09ICdiaW5hcnknIHx8IG9wdHMudHlwZSA9PSAnYXJyYXknIHx8IG9wdHMudHlwZSA9PSAnYmFzZTY0Jykge1xuXHRcdGlmKHR5cGVvZiBjcHRhYmxlICE9PSAndW5kZWZpbmVkJykgc3RyID0gY3B0YWJsZS51dGlscy5kZWNvZGUoNjUwMDEsIGNoYXJfY29kZXMoc3RyKSk7XG5cdFx0ZWxzZSBzdHIgPSB1dGY4cmVhZChzdHIpO1xuXHR9XG5cdHZhciBvcGVuaW5nID0gc3RyLnNsaWNlKDAsIDEwMjQpLnRvTG93ZXJDYXNlKCksIGlzaHRtbCA9IGZhbHNlO1xuXHRpZihvcGVuaW5nLmluZGV4T2YoXCI8P3htbFwiKSA9PSAtMSkgW1wiaHRtbFwiLCBcInRhYmxlXCIsIFwiaGVhZFwiLCBcIm1ldGFcIiwgXCJzY3JpcHRcIiwgXCJzdHlsZVwiLCBcImRpdlwiXS5mb3JFYWNoKGZ1bmN0aW9uKHRhZykgeyBpZihvcGVuaW5nLmluZGV4T2YoXCI8XCIgKyB0YWcpID49IDApIGlzaHRtbCA9IHRydWU7IH0pO1xuXHRpZihpc2h0bWwpIHJldHVybiBIVE1MXy50b193b3JrYm9vayhzdHIsIG9wdHMpO1xuXHR2YXIgUm47XG5cdHZhciBzdGF0ZSA9IFtdLCB0bXA7XG5cdGlmKERFTlNFICE9IG51bGwgJiYgb3B0cy5kZW5zZSA9PSBudWxsKSBvcHRzLmRlbnNlID0gREVOU0U7XG5cdHZhciBzaGVldHMgPSB7fSwgc2hlZXRuYW1lcyA9IFtdLCBjdXJzaGVldCA9IChvcHRzLmRlbnNlID8gW10gOiB7fSksIHNoZWV0bmFtZSA9IFwiXCI7XG5cdHZhciB0YWJsZSA9IHt9LCBjZWxsID0gKHt9KSwgcm93ID0ge307Ly8gZXNsaW50LWRpc2FibGUtbGluZSBuby11bnVzZWQtdmFyc1xuXHR2YXIgZHRhZyA9IHhsbWxfcGFyc2V4bWx0YWcoJzxEYXRhIHNzOlR5cGU9XCJTdHJpbmdcIj4nKSwgZGlkeCA9IDA7XG5cdHZhciBjID0gMCwgciA9IDA7XG5cdHZhciByZWZndWVzcyA9IHtzOiB7cjoyMDAwMDAwLCBjOjIwMDAwMDB9LCBlOiB7cjowLCBjOjB9IH07XG5cdHZhciBzdHlsZXMgPSB7fSwgc3RhZyA9IHt9O1xuXHR2YXIgc3MgPSBcIlwiLCBmaWR4ID0gMDtcblx0dmFyIG1lcmdlcyA9IFtdO1xuXHR2YXIgUHJvcHMgPSB7fSwgQ3VzdHByb3BzID0ge30sIHBpZHggPSAwLCBjcCA9IFtdO1xuXHR2YXIgY29tbWVudHMgPSBbXSwgY29tbWVudCA9ICh7fSk7XG5cdHZhciBjc3R5cyA9IFtdLCBjc3R5LCBzZWVuY29sID0gZmFsc2U7XG5cdHZhciBhcnJheWYgPSBbXTtcblx0dmFyIHJvd2luZm8gPSBbXSwgcm93b2JqID0ge30sIGNjID0gMCwgcnIgPSAwO1xuXHR2YXIgV29ya2Jvb2sgPSAoeyBTaGVldHM6W10sIFdCUHJvcHM6e2RhdGUxOTA0OmZhbHNlfSB9KSwgd3Nwcm9wcyA9IHt9O1xuXHR4bG1scmVnZXgubGFzdEluZGV4ID0gMDtcblx0c3RyID0gc3RyLnJlcGxhY2UoLzwhLS0oW1xcc1xcU10qPyktLT4vbWcsXCJcIik7XG5cdHZhciByYXdfUm4zID0gXCJcIjtcblx0d2hpbGUoKFJuID0geGxtbHJlZ2V4LmV4ZWMoc3RyKSkpIHN3aXRjaCgoUm5bM10gPSAocmF3X1JuMyA9IFJuWzNdKS50b0xvd2VyQ2FzZSgpKSkge1xuXHRcdGNhc2UgJ2RhdGEnIC8qY2FzZSAnRGF0YScqLzpcblx0XHRcdGlmKHJhd19SbjMgPT0gXCJkYXRhXCIpIHtcblx0XHRcdFx0aWYoUm5bMV09PT0nLycpe2lmKCh0bXA9c3RhdGUucG9wKCkpWzBdIT09Um5bM10pIHRocm93IG5ldyBFcnJvcihcIkJhZCBzdGF0ZTogXCIrdG1wLmpvaW4oXCJ8XCIpKTt9XG5cdFx0XHRcdGVsc2UgaWYoUm5bMF0uY2hhckF0KFJuWzBdLmxlbmd0aC0yKSAhPT0gJy8nKSBzdGF0ZS5wdXNoKFtSblszXSwgdHJ1ZV0pO1xuXHRcdFx0XHRicmVhaztcblx0XHRcdH1cblx0XHRcdGlmKHN0YXRlW3N0YXRlLmxlbmd0aC0xXVsxXSkgYnJlYWs7XG5cdFx0XHRpZihSblsxXT09PScvJykgcGFyc2VfeGxtbF9kYXRhKHN0ci5zbGljZShkaWR4LCBSbi5pbmRleCksIHNzLCBkdGFnLCBzdGF0ZVtzdGF0ZS5sZW5ndGgtMV1bMF09PS8qXCJDb21tZW50XCIqL1wiY29tbWVudFwiP2NvbW1lbnQ6Y2VsbCwge2M6YyxyOnJ9LCBzdHlsZXMsIGNzdHlzW2NdLCByb3csIGFycmF5Ziwgb3B0cyk7XG5cdFx0XHRlbHNlIHsgc3MgPSBcIlwiOyBkdGFnID0geGxtbF9wYXJzZXhtbHRhZyhSblswXSk7IGRpZHggPSBSbi5pbmRleCArIFJuWzBdLmxlbmd0aDsgfVxuXHRcdFx0YnJlYWs7XG5cdFx0Y2FzZSAnY2VsbCcgLypjYXNlICdDZWxsJyovOlxuXHRcdFx0aWYoUm5bMV09PT0nLycpe1xuXHRcdFx0XHRpZihjb21tZW50cy5sZW5ndGggPiAwKSBjZWxsLmMgPSBjb21tZW50cztcblx0XHRcdFx0aWYoKCFvcHRzLnNoZWV0Um93cyB8fCBvcHRzLnNoZWV0Um93cyA+IHIpICYmIGNlbGwudiAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRcdFx0aWYob3B0cy5kZW5zZSkge1xuXHRcdFx0XHRcdFx0aWYoIWN1cnNoZWV0W3JdKSBjdXJzaGVldFtyXSA9IFtdO1xuXHRcdFx0XHRcdFx0Y3Vyc2hlZXRbcl1bY10gPSBjZWxsO1xuXHRcdFx0XHRcdH0gZWxzZSBjdXJzaGVldFtlbmNvZGVfY29sKGMpICsgZW5jb2RlX3JvdyhyKV0gPSBjZWxsO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGlmKGNlbGwuSFJlZikge1xuXHRcdFx0XHRcdGNlbGwubCA9ICh7VGFyZ2V0OmNlbGwuSFJlZn0pO1xuXHRcdFx0XHRcdGlmKGNlbGwuSFJlZlNjcmVlblRpcCkgY2VsbC5sLlRvb2x0aXAgPSBjZWxsLkhSZWZTY3JlZW5UaXA7XG5cdFx0XHRcdFx0ZGVsZXRlIGNlbGwuSFJlZjsgZGVsZXRlIGNlbGwuSFJlZlNjcmVlblRpcDtcblx0XHRcdFx0fVxuXHRcdFx0XHRpZihjZWxsLk1lcmdlQWNyb3NzIHx8IGNlbGwuTWVyZ2VEb3duKSB7XG5cdFx0XHRcdFx0Y2MgPSBjICsgKHBhcnNlSW50KGNlbGwuTWVyZ2VBY3Jvc3MsMTApfDApO1xuXHRcdFx0XHRcdHJyID0gciArIChwYXJzZUludChjZWxsLk1lcmdlRG93biwxMCl8MCk7XG5cdFx0XHRcdFx0bWVyZ2VzLnB1c2goe3M6e2M6YyxyOnJ9LGU6e2M6Y2Mscjpycn19KTtcblx0XHRcdFx0fVxuXHRcdFx0XHRpZighb3B0cy5zaGVldFN0dWJzKSB7IGlmKGNlbGwuTWVyZ2VBY3Jvc3MpIGMgPSBjYyArIDE7IGVsc2UgKytjOyB9XG5cdFx0XHRcdGVsc2UgaWYoY2VsbC5NZXJnZUFjcm9zcyB8fCBjZWxsLk1lcmdlRG93bikge1xuZm9yKHZhciBjbWEgPSBjOyBjbWEgPD0gY2M7ICsrY21hKSB7XG5cdFx0XHRcdFx0XHRmb3IodmFyIGNtZCA9IHI7IGNtZCA8PSBycjsgKytjbWQpIHtcblx0XHRcdFx0XHRcdFx0aWYoY21hID4gYyB8fCBjbWQgPiByKSB7XG5cdFx0XHRcdFx0XHRcdFx0aWYob3B0cy5kZW5zZSkge1xuXHRcdFx0XHRcdFx0XHRcdFx0aWYoIWN1cnNoZWV0W2NtZF0pIGN1cnNoZWV0W2NtZF0gPSBbXTtcblx0XHRcdFx0XHRcdFx0XHRcdGN1cnNoZWV0W2NtZF1bY21hXSA9IHt0Oid6J307XG5cdFx0XHRcdFx0XHRcdFx0fSBlbHNlIGN1cnNoZWV0W2VuY29kZV9jb2woY21hKSArIGVuY29kZV9yb3coY21kKV0gPSB7dDoneid9O1xuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdGMgPSBjYyArIDE7XG5cdFx0XHRcdH1cblx0XHRcdFx0ZWxzZSArK2M7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRjZWxsID0geGxtbF9wYXJzZXhtbHRhZ29iaihSblswXSk7XG5cdFx0XHRcdGlmKGNlbGwuSW5kZXgpIGMgPSArY2VsbC5JbmRleCAtIDE7XG5cdFx0XHRcdGlmKGMgPCByZWZndWVzcy5zLmMpIHJlZmd1ZXNzLnMuYyA9IGM7XG5cdFx0XHRcdGlmKGMgPiByZWZndWVzcy5lLmMpIHJlZmd1ZXNzLmUuYyA9IGM7XG5cdFx0XHRcdGlmKFJuWzBdLnNsaWNlKC0yKSA9PT0gXCIvPlwiKSArK2M7XG5cdFx0XHRcdGNvbW1lbnRzID0gW107XG5cdFx0XHR9XG5cdFx0XHRicmVhaztcblx0XHRjYXNlICdyb3cnIC8qY2FzZSAnUm93JyovOlxuXHRcdFx0aWYoUm5bMV09PT0nLycgfHwgUm5bMF0uc2xpY2UoLTIpID09PSBcIi8+XCIpIHtcblx0XHRcdFx0aWYociA8IHJlZmd1ZXNzLnMucikgcmVmZ3Vlc3Mucy5yID0gcjtcblx0XHRcdFx0aWYociA+IHJlZmd1ZXNzLmUucikgcmVmZ3Vlc3MuZS5yID0gcjtcblx0XHRcdFx0aWYoUm5bMF0uc2xpY2UoLTIpID09PSBcIi8+XCIpIHtcblx0XHRcdFx0XHRyb3cgPSB4bG1sX3BhcnNleG1sdGFnKFJuWzBdKTtcblx0XHRcdFx0XHRpZihyb3cuSW5kZXgpIHIgPSArcm93LkluZGV4IC0gMTtcblx0XHRcdFx0fVxuXHRcdFx0XHRjID0gMDsgKytyO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0cm93ID0geGxtbF9wYXJzZXhtbHRhZyhSblswXSk7XG5cdFx0XHRcdGlmKHJvdy5JbmRleCkgciA9ICtyb3cuSW5kZXggLSAxO1xuXHRcdFx0XHRyb3dvYmogPSB7fTtcblx0XHRcdFx0aWYocm93LkF1dG9GaXRIZWlnaHQgPT0gXCIwXCIgfHwgcm93LkhlaWdodCkge1xuXHRcdFx0XHRcdHJvd29iai5ocHggPSBwYXJzZUludChyb3cuSGVpZ2h0LCAxMCk7IHJvd29iai5ocHQgPSBweDJwdChyb3dvYmouaHB4KTtcblx0XHRcdFx0XHRyb3dpbmZvW3JdID0gcm93b2JqO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGlmKHJvdy5IaWRkZW4gPT0gXCIxXCIpIHsgcm93b2JqLmhpZGRlbiA9IHRydWU7IHJvd2luZm9bcl0gPSByb3dvYmo7IH1cblx0XHRcdH1cblx0XHRcdGJyZWFrO1xuXHRcdGNhc2UgJ3dvcmtzaGVldCcgLypjYXNlICdXb3Jrc2hlZXQnKi86IC8qIFRPRE86IHJlYWQgcmFuZ2UgZnJvbSBGdWxsUm93cy9GdWxsQ29sdW1ucyAqL1xuXHRcdFx0aWYoUm5bMV09PT0nLycpe1xuXHRcdFx0XHRpZigodG1wPXN0YXRlLnBvcCgpKVswXSE9PVJuWzNdKSB0aHJvdyBuZXcgRXJyb3IoXCJCYWQgc3RhdGU6IFwiK3RtcC5qb2luKFwifFwiKSk7XG5cdFx0XHRcdHNoZWV0bmFtZXMucHVzaChzaGVldG5hbWUpO1xuXHRcdFx0XHRpZihyZWZndWVzcy5zLnIgPD0gcmVmZ3Vlc3MuZS5yICYmIHJlZmd1ZXNzLnMuYyA8PSByZWZndWVzcy5lLmMpIHtcblx0XHRcdFx0XHRjdXJzaGVldFtcIiFyZWZcIl0gPSBlbmNvZGVfcmFuZ2UocmVmZ3Vlc3MpO1xuXHRcdFx0XHRcdGlmKG9wdHMuc2hlZXRSb3dzICYmIG9wdHMuc2hlZXRSb3dzIDw9IHJlZmd1ZXNzLmUucikge1xuXHRcdFx0XHRcdFx0Y3Vyc2hlZXRbXCIhZnVsbHJlZlwiXSA9IGN1cnNoZWV0W1wiIXJlZlwiXTtcblx0XHRcdFx0XHRcdHJlZmd1ZXNzLmUuciA9IG9wdHMuc2hlZXRSb3dzIC0gMTtcblx0XHRcdFx0XHRcdGN1cnNoZWV0W1wiIXJlZlwiXSA9IGVuY29kZV9yYW5nZShyZWZndWVzcyk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHRcdGlmKG1lcmdlcy5sZW5ndGgpIGN1cnNoZWV0W1wiIW1lcmdlc1wiXSA9IG1lcmdlcztcblx0XHRcdFx0aWYoY3N0eXMubGVuZ3RoID4gMCkgY3Vyc2hlZXRbXCIhY29sc1wiXSA9IGNzdHlzO1xuXHRcdFx0XHRpZihyb3dpbmZvLmxlbmd0aCA+IDApIGN1cnNoZWV0W1wiIXJvd3NcIl0gPSByb3dpbmZvO1xuXHRcdFx0XHRzaGVldHNbc2hlZXRuYW1lXSA9IGN1cnNoZWV0O1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0cmVmZ3Vlc3MgPSB7czoge3I6MjAwMDAwMCwgYzoyMDAwMDAwfSwgZToge3I6MCwgYzowfSB9O1xuXHRcdFx0XHRyID0gYyA9IDA7XG5cdFx0XHRcdHN0YXRlLnB1c2goW1JuWzNdLCBmYWxzZV0pO1xuXHRcdFx0XHR0bXAgPSB4bG1sX3BhcnNleG1sdGFnKFJuWzBdKTtcblx0XHRcdFx0c2hlZXRuYW1lID0gdW5lc2NhcGV4bWwodG1wLk5hbWUpO1xuXHRcdFx0XHRjdXJzaGVldCA9IChvcHRzLmRlbnNlID8gW10gOiB7fSk7XG5cdFx0XHRcdG1lcmdlcyA9IFtdO1xuXHRcdFx0XHRhcnJheWYgPSBbXTtcblx0XHRcdFx0cm93aW5mbyA9IFtdO1xuXHRcdFx0XHR3c3Byb3BzID0ge25hbWU6c2hlZXRuYW1lLCBIaWRkZW46MH07XG5cdFx0XHRcdFdvcmtib29rLlNoZWV0cy5wdXNoKHdzcHJvcHMpO1xuXHRcdFx0fVxuXHRcdFx0YnJlYWs7XG5cdFx0Y2FzZSAndGFibGUnIC8qY2FzZSAnVGFibGUnKi86XG5cdFx0XHRpZihSblsxXT09PScvJyl7aWYoKHRtcD1zdGF0ZS5wb3AoKSlbMF0hPT1SblszXSkgdGhyb3cgbmV3IEVycm9yKFwiQmFkIHN0YXRlOiBcIit0bXAuam9pbihcInxcIikpO31cblx0XHRcdGVsc2UgaWYoUm5bMF0uc2xpY2UoLTIpID09IFwiLz5cIikgYnJlYWs7XG5cdFx0XHRlbHNlIHtcblx0XHRcdFx0dGFibGUgPSB4bG1sX3BhcnNleG1sdGFnKFJuWzBdKTtcblx0XHRcdFx0c3RhdGUucHVzaChbUm5bM10sIGZhbHNlXSk7XG5cdFx0XHRcdGNzdHlzID0gW107IHNlZW5jb2wgPSBmYWxzZTtcblx0XHRcdH1cblx0XHRcdGJyZWFrO1xuXG5cdFx0Y2FzZSAnc3R5bGUnIC8qY2FzZSAnU3R5bGUnKi86XG5cdFx0XHRpZihSblsxXT09PScvJykgcHJvY2Vzc19zdHlsZV94bG1sKHN0eWxlcywgc3RhZywgb3B0cyk7XG5cdFx0XHRlbHNlIHN0YWcgPSB4bG1sX3BhcnNleG1sdGFnKFJuWzBdKTtcblx0XHRcdGJyZWFrO1xuXG5cdFx0Y2FzZSAnbnVtYmVyZm9ybWF0JyAvKmNhc2UgJ051bWJlckZvcm1hdCcqLzpcblx0XHRcdHN0YWcubmYgPSB1bmVzY2FwZXhtbCh4bG1sX3BhcnNleG1sdGFnKFJuWzBdKS5Gb3JtYXQgfHwgXCJHZW5lcmFsXCIpO1xuXHRcdFx0aWYoWExNTEZvcm1hdE1hcFtzdGFnLm5mXSkgc3RhZy5uZiA9IFhMTUxGb3JtYXRNYXBbc3RhZy5uZl07XG5cdFx0XHRmb3IodmFyIHNzZmlkeCA9IDA7IHNzZmlkeCAhPSAweDE4ODsgKytzc2ZpZHgpIGlmKFNTRi5fdGFibGVbc3NmaWR4XSA9PSBzdGFnLm5mKSBicmVhaztcblx0XHRcdGlmKHNzZmlkeCA9PSAweDE4OCkgZm9yKHNzZmlkeCA9IDB4Mzk7IHNzZmlkeCAhPSAweDE4ODsgKytzc2ZpZHgpIGlmKFNTRi5fdGFibGVbc3NmaWR4XSA9PSBudWxsKSB7IFNTRi5sb2FkKHN0YWcubmYsIHNzZmlkeCk7IGJyZWFrOyB9XG5cdFx0XHRicmVhaztcblxuXHRcdGNhc2UgJ2NvbHVtbicgLypjYXNlICdDb2x1bW4nKi86XG5cdFx0XHRpZihzdGF0ZVtzdGF0ZS5sZW5ndGgtMV1bMF0gIT09IC8qJ1RhYmxlJyovJ3RhYmxlJykgYnJlYWs7XG5cdFx0XHRjc3R5ID0geGxtbF9wYXJzZXhtbHRhZyhSblswXSk7XG5cdFx0XHRpZihjc3R5LkhpZGRlbikgeyBjc3R5LmhpZGRlbiA9IHRydWU7IGRlbGV0ZSBjc3R5LkhpZGRlbjsgfVxuXHRcdFx0aWYoY3N0eS5XaWR0aCkgY3N0eS53cHggPSBwYXJzZUludChjc3R5LldpZHRoLCAxMCk7XG5cdFx0XHRpZighc2VlbmNvbCAmJiBjc3R5LndweCA+IDEwKSB7XG5cdFx0XHRcdHNlZW5jb2wgPSB0cnVlOyBNRFcgPSBERUZfTURXOyAvL2ZpbmRfbWR3X3dweChjc3R5LndweCk7XG5cdFx0XHRcdGZvcih2YXIgX2NvbCA9IDA7IF9jb2wgPCBjc3R5cy5sZW5ndGg7ICsrX2NvbCkgaWYoY3N0eXNbX2NvbF0pIHByb2Nlc3NfY29sKGNzdHlzW19jb2xdKTtcblx0XHRcdH1cblx0XHRcdGlmKHNlZW5jb2wpIHByb2Nlc3NfY29sKGNzdHkpO1xuXHRcdFx0Y3N0eXNbKGNzdHkuSW5kZXgtMXx8Y3N0eXMubGVuZ3RoKV0gPSBjc3R5O1xuXHRcdFx0Zm9yKHZhciBpID0gMDsgaSA8ICtjc3R5LlNwYW47ICsraSkgY3N0eXNbY3N0eXMubGVuZ3RoXSA9IGR1cChjc3R5KTtcblx0XHRcdGJyZWFrO1xuXG5cdFx0Y2FzZSAnbmFtZWRyYW5nZScgLypjYXNlICdOYW1lZFJhbmdlJyovOlxuXHRcdFx0aWYoUm5bMV09PT0nLycpIGJyZWFrO1xuXHRcdFx0aWYoIVdvcmtib29rLk5hbWVzKSBXb3JrYm9vay5OYW1lcyA9IFtdO1xuXHRcdFx0dmFyIF9OYW1lZFJhbmdlID0gcGFyc2V4bWx0YWcoUm5bMF0pO1xuXHRcdFx0dmFyIF9EZWZpbmVkTmFtZSA9ICh7XG5cdFx0XHRcdE5hbWU6IF9OYW1lZFJhbmdlLk5hbWUsXG5cdFx0XHRcdFJlZjogcmNfdG9fYTEoX05hbWVkUmFuZ2UuUmVmZXJzVG8uc2xpY2UoMSksIHtyOjAsIGM6MH0pXG5cdFx0XHR9KTtcblx0XHRcdGlmKFdvcmtib29rLlNoZWV0cy5sZW5ndGg+MCkgX0RlZmluZWROYW1lLlNoZWV0PVdvcmtib29rLlNoZWV0cy5sZW5ndGgtMTtcbldvcmtib29rLk5hbWVzLnB1c2goX0RlZmluZWROYW1lKTtcblx0XHRcdGJyZWFrO1xuXG5cdFx0Y2FzZSAnbmFtZWRjZWxsJyAvKmNhc2UgJ05hbWVkQ2VsbCcqLzogYnJlYWs7XG5cdFx0Y2FzZSAnYicgLypjYXNlICdCJyovOiBicmVhaztcblx0XHRjYXNlICdpJyAvKmNhc2UgJ0knKi86IGJyZWFrO1xuXHRcdGNhc2UgJ3UnIC8qY2FzZSAnVScqLzogYnJlYWs7XG5cdFx0Y2FzZSAncycgLypjYXNlICdTJyovOiBicmVhaztcblx0XHRjYXNlICdlbScgLypjYXNlICdFTScqLzogYnJlYWs7XG5cdFx0Y2FzZSAnaDInIC8qY2FzZSAnSDInKi86IGJyZWFrO1xuXHRcdGNhc2UgJ2gzJyAvKmNhc2UgJ0gzJyovOiBicmVhaztcblx0XHRjYXNlICdzdWInIC8qY2FzZSAnU3ViJyovOiBicmVhaztcblx0XHRjYXNlICdzdXAnIC8qY2FzZSAnU3VwJyovOiBicmVhaztcblx0XHRjYXNlICdzcGFuJyAvKmNhc2UgJ1NwYW4nKi86IGJyZWFrO1xuXHRcdGNhc2UgJ2FsaWdubWVudCcgLypjYXNlICdBbGlnbm1lbnQnKi86XG5cdFx0XHRicmVhaztcblx0XHRjYXNlICdib3JkZXJzJyAvKmNhc2UgJ0JvcmRlcnMnKi86IGJyZWFrO1xuXHRcdGNhc2UgJ2JvcmRlcicgLypjYXNlICdCb3JkZXInKi86IGJyZWFrO1xuXHRcdGNhc2UgJ2ZvbnQnIC8qY2FzZSAnRm9udCcqLzpcblx0XHRcdGlmKFJuWzBdLnNsaWNlKC0yKSA9PT0gXCIvPlwiKSBicmVhaztcblx0XHRcdGVsc2UgaWYoUm5bMV09PT1cIi9cIikgc3MgKz0gc3RyLnNsaWNlKGZpZHgsIFJuLmluZGV4KTtcblx0XHRcdGVsc2UgZmlkeCA9IFJuLmluZGV4ICsgUm5bMF0ubGVuZ3RoO1xuXHRcdFx0YnJlYWs7XG5cdFx0Y2FzZSAnaW50ZXJpb3InIC8qY2FzZSAnSW50ZXJpb3InKi86XG5cdFx0XHRpZighb3B0cy5jZWxsU3R5bGVzKSBicmVhaztcblx0XHRcdHN0YWcuSW50ZXJpb3IgPSB4bG1sX3BhcnNleG1sdGFnKFJuWzBdKTtcblx0XHRcdGJyZWFrO1xuXHRcdGNhc2UgJ3Byb3RlY3Rpb24nIC8qY2FzZSAnUHJvdGVjdGlvbicqLzogYnJlYWs7XG5cblx0XHRjYXNlICdhdXRob3InIC8qY2FzZSAnQXV0aG9yJyovOlxuXHRcdGNhc2UgJ3RpdGxlJyAvKmNhc2UgJ1RpdGxlJyovOlxuXHRcdGNhc2UgJ2Rlc2NyaXB0aW9uJyAvKmNhc2UgJ0Rlc2NyaXB0aW9uJyovOlxuXHRcdGNhc2UgJ2NyZWF0ZWQnIC8qY2FzZSAnQ3JlYXRlZCcqLzpcblx0XHRjYXNlICdrZXl3b3JkcycgLypjYXNlICdLZXl3b3JkcycqLzpcblx0XHRjYXNlICdzdWJqZWN0JyAvKmNhc2UgJ1N1YmplY3QnKi86XG5cdFx0Y2FzZSAnY2F0ZWdvcnknIC8qY2FzZSAnQ2F0ZWdvcnknKi86XG5cdFx0Y2FzZSAnY29tcGFueScgLypjYXNlICdDb21wYW55JyovOlxuXHRcdGNhc2UgJ2xhc3RhdXRob3InIC8qY2FzZSAnTGFzdEF1dGhvcicqLzpcblx0XHRjYXNlICdsYXN0c2F2ZWQnIC8qY2FzZSAnTGFzdFNhdmVkJyovOlxuXHRcdGNhc2UgJ2xhc3RwcmludGVkJyAvKmNhc2UgJ0xhc3RQcmludGVkJyovOlxuXHRcdGNhc2UgJ3ZlcnNpb24nIC8qY2FzZSAnVmVyc2lvbicqLzpcblx0XHRjYXNlICdyZXZpc2lvbicgLypjYXNlICdSZXZpc2lvbicqLzpcblx0XHRjYXNlICd0b3RhbHRpbWUnIC8qY2FzZSAnVG90YWxUaW1lJyovOlxuXHRcdGNhc2UgJ2h5cGVybGlua2Jhc2UnIC8qY2FzZSAnSHlwZXJsaW5rQmFzZScqLzpcblx0XHRjYXNlICdtYW5hZ2VyJyAvKmNhc2UgJ01hbmFnZXInKi86XG5cdFx0Y2FzZSAnY29udGVudHN0YXR1cycgLypjYXNlICdDb250ZW50U3RhdHVzJyovOlxuXHRcdGNhc2UgJ2lkZW50aWZpZXInIC8qY2FzZSAnSWRlbnRpZmllcicqLzpcblx0XHRjYXNlICdsYW5ndWFnZScgLypjYXNlICdMYW5ndWFnZScqLzpcblx0XHRjYXNlICdhcHBuYW1lJyAvKmNhc2UgJ0FwcE5hbWUnKi86XG5cdFx0XHRpZihSblswXS5zbGljZSgtMikgPT09IFwiLz5cIikgYnJlYWs7XG5cdFx0XHRlbHNlIGlmKFJuWzFdPT09XCIvXCIpIHhsbWxfc2V0X3Byb3AoUHJvcHMsIHJhd19SbjMsIHN0ci5zbGljZShwaWR4LCBSbi5pbmRleCkpO1xuXHRcdFx0ZWxzZSBwaWR4ID0gUm4uaW5kZXggKyBSblswXS5sZW5ndGg7XG5cdFx0XHRicmVhaztcblx0XHRjYXNlICdwYXJhZ3JhcGhzJyAvKmNhc2UgJ1BhcmFncmFwaHMnKi86IGJyZWFrO1xuXG5cdFx0Y2FzZSAnc3R5bGVzJyAvKmNhc2UgJ1N0eWxlcycqLzpcblx0XHRjYXNlICd3b3JrYm9vaycgLypjYXNlICdXb3JrYm9vaycqLzpcblx0XHRcdGlmKFJuWzFdPT09Jy8nKXtpZigodG1wPXN0YXRlLnBvcCgpKVswXSE9PVJuWzNdKSB0aHJvdyBuZXcgRXJyb3IoXCJCYWQgc3RhdGU6IFwiK3RtcC5qb2luKFwifFwiKSk7fVxuXHRcdFx0ZWxzZSBzdGF0ZS5wdXNoKFtSblszXSwgZmFsc2VdKTtcblx0XHRcdGJyZWFrO1xuXG5cdFx0Y2FzZSAnY29tbWVudCcgLypjYXNlICdDb21tZW50JyovOlxuXHRcdFx0aWYoUm5bMV09PT0nLycpe1xuXHRcdFx0XHRpZigodG1wPXN0YXRlLnBvcCgpKVswXSE9PVJuWzNdKSB0aHJvdyBuZXcgRXJyb3IoXCJCYWQgc3RhdGU6IFwiK3RtcC5qb2luKFwifFwiKSk7XG5cdFx0XHRcdHhsbWxfY2xlYW5fY29tbWVudChjb21tZW50KTtcblx0XHRcdFx0Y29tbWVudHMucHVzaChjb21tZW50KTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdHN0YXRlLnB1c2goW1JuWzNdLCBmYWxzZV0pO1xuXHRcdFx0XHR0bXAgPSB4bG1sX3BhcnNleG1sdGFnKFJuWzBdKTtcblx0XHRcdFx0Y29tbWVudCA9ICh7YTp0bXAuQXV0aG9yfSk7XG5cdFx0XHR9XG5cdFx0XHRicmVhaztcblxuXHRcdGNhc2UgJ2F1dG9maWx0ZXInIC8qY2FzZSAnQXV0b0ZpbHRlcicqLzpcblx0XHRcdGlmKFJuWzFdPT09Jy8nKXtpZigodG1wPXN0YXRlLnBvcCgpKVswXSE9PVJuWzNdKSB0aHJvdyBuZXcgRXJyb3IoXCJCYWQgc3RhdGU6IFwiK3RtcC5qb2luKFwifFwiKSk7fVxuXHRcdFx0ZWxzZSBpZihSblswXS5jaGFyQXQoUm5bMF0ubGVuZ3RoLTIpICE9PSAnLycpIHtcblx0XHRcdFx0dmFyIEF1dG9GaWx0ZXIgPSB4bG1sX3BhcnNleG1sdGFnKFJuWzBdKTtcblx0XHRcdFx0Y3Vyc2hlZXRbJyFhdXRvZmlsdGVyJ10gPSB7IHJlZjpyY190b19hMShBdXRvRmlsdGVyLlJhbmdlKS5yZXBsYWNlKC9cXCQvZyxcIlwiKSB9O1xuXHRcdFx0XHRzdGF0ZS5wdXNoKFtSblszXSwgdHJ1ZV0pO1xuXHRcdFx0fVxuXHRcdFx0YnJlYWs7XG5cblx0XHRjYXNlICduYW1lJyAvKmNhc2UgJ05hbWUnKi86IGJyZWFrO1xuXG5cdFx0Y2FzZSAnZGF0YXZhbGlkYXRpb24nIC8qY2FzZSAnRGF0YVZhbGlkYXRpb24nKi86XG5cdFx0XHRpZihSblsxXT09PScvJyl7XG5cdFx0XHRcdGlmKCh0bXA9c3RhdGUucG9wKCkpWzBdIT09Um5bM10pIHRocm93IG5ldyBFcnJvcihcIkJhZCBzdGF0ZTogXCIrdG1wLmpvaW4oXCJ8XCIpKTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdGlmKFJuWzBdLmNoYXJBdChSblswXS5sZW5ndGgtMikgIT09ICcvJykgc3RhdGUucHVzaChbUm5bM10sIHRydWVdKTtcblx0XHRcdH1cblx0XHRcdGJyZWFrO1xuXG5cdFx0Y2FzZSAncGl4ZWxzcGVyaW5jaCcgLypjYXNlICdQaXhlbHNQZXJJbmNoJyovOlxuXHRcdFx0YnJlYWs7XG5cdFx0Y2FzZSAnY29tcG9uZW50b3B0aW9ucycgLypjYXNlICdDb21wb25lbnRPcHRpb25zJyovOlxuXHRcdGNhc2UgJ2RvY3VtZW50cHJvcGVydGllcycgLypjYXNlICdEb2N1bWVudFByb3BlcnRpZXMnKi86XG5cdFx0Y2FzZSAnY3VzdG9tZG9jdW1lbnRwcm9wZXJ0aWVzJyAvKmNhc2UgJ0N1c3RvbURvY3VtZW50UHJvcGVydGllcycqLzpcblx0XHRjYXNlICdvZmZpY2Vkb2N1bWVudHNldHRpbmdzJyAvKmNhc2UgJ09mZmljZURvY3VtZW50U2V0dGluZ3MnKi86XG5cdFx0Y2FzZSAncGl2b3R0YWJsZScgLypjYXNlICdQaXZvdFRhYmxlJyovOlxuXHRcdGNhc2UgJ3Bpdm90Y2FjaGUnIC8qY2FzZSAnUGl2b3RDYWNoZScqLzpcblx0XHRjYXNlICduYW1lcycgLypjYXNlICdOYW1lcycqLzpcblx0XHRjYXNlICdtYXBpbmZvJyAvKmNhc2UgJ01hcEluZm8nKi86XG5cdFx0Y2FzZSAncGFnZWJyZWFrcycgLypjYXNlICdQYWdlQnJlYWtzJyovOlxuXHRcdGNhc2UgJ3F1ZXJ5dGFibGUnIC8qY2FzZSAnUXVlcnlUYWJsZScqLzpcblx0XHRjYXNlICdzb3J0aW5nJyAvKmNhc2UgJ1NvcnRpbmcnKi86XG5cdFx0Y2FzZSAnc2NoZW1hJyAvKmNhc2UgJ1NjaGVtYScqLzogLy9jYXNlICdkYXRhJyAvKmNhc2UgJ2RhdGEnKi86XG5cdFx0Y2FzZSAnY29uZGl0aW9uYWxmb3JtYXR0aW5nJyAvKmNhc2UgJ0NvbmRpdGlvbmFsRm9ybWF0dGluZycqLzpcblx0XHRjYXNlICdzbWFydHRhZ3R5cGUnIC8qY2FzZSAnU21hcnRUYWdUeXBlJyovOlxuXHRcdGNhc2UgJ3NtYXJ0dGFncycgLypjYXNlICdTbWFydFRhZ3MnKi86XG5cdFx0Y2FzZSAnZXhjZWx3b3JrYm9vaycgLypjYXNlICdFeGNlbFdvcmtib29rJyovOlxuXHRcdGNhc2UgJ3dvcmtib29rb3B0aW9ucycgLypjYXNlICdXb3JrYm9va09wdGlvbnMnKi86XG5cdFx0Y2FzZSAnd29ya3NoZWV0b3B0aW9ucycgLypjYXNlICdXb3Jrc2hlZXRPcHRpb25zJyovOlxuXHRcdFx0aWYoUm5bMV09PT0nLycpe2lmKCh0bXA9c3RhdGUucG9wKCkpWzBdIT09Um5bM10pIHRocm93IG5ldyBFcnJvcihcIkJhZCBzdGF0ZTogXCIrdG1wLmpvaW4oXCJ8XCIpKTt9XG5cdFx0XHRlbHNlIGlmKFJuWzBdLmNoYXJBdChSblswXS5sZW5ndGgtMikgIT09ICcvJykgc3RhdGUucHVzaChbUm5bM10sIHRydWVdKTtcblx0XHRcdGJyZWFrO1xuXG5cdFx0ZGVmYXVsdDpcblx0XHRcdC8qIEZPRFMgZmlsZSByb290IGlzIDxvZmZpY2U6ZG9jdW1lbnQ+ICovXG5cdFx0XHRpZihzdGF0ZS5sZW5ndGggPT0gMCAmJiBSblszXSA9PSBcImRvY3VtZW50XCIpIHJldHVybiBwYXJzZV9mb2RzKHN0ciwgb3B0cyk7XG5cdFx0XHQvKiBVT1MgZmlsZSByb290IGlzIDx1b2Y6VU9GPiAqL1xuXHRcdFx0aWYoc3RhdGUubGVuZ3RoID09IDAgJiYgUm5bM10gPT0gXCJ1b2ZcIi8qXCJVT0ZcIiovKSByZXR1cm4gcGFyc2VfZm9kcyhzdHIsIG9wdHMpO1xuXG5cdFx0XHR2YXIgc2VlbiA9IHRydWU7XG5cdFx0XHRzd2l0Y2goc3RhdGVbc3RhdGUubGVuZ3RoLTFdWzBdKSB7XG5cdFx0XHRcdC8qIE9mZmljZURvY3VtZW50U2V0dGluZ3MgKi9cblx0XHRcdFx0Y2FzZSAnb2ZmaWNlZG9jdW1lbnRzZXR0aW5ncycgLypjYXNlICdPZmZpY2VEb2N1bWVudFNldHRpbmdzJyovOiBzd2l0Y2goUm5bM10pIHtcblx0XHRcdFx0XHRjYXNlICdhbGxvd3BuZycgLypjYXNlICdBbGxvd1BORycqLzogYnJlYWs7XG5cdFx0XHRcdFx0Y2FzZSAncmVtb3ZlcGVyc29uYWxpbmZvcm1hdGlvbicgLypjYXNlICdSZW1vdmVQZXJzb25hbEluZm9ybWF0aW9uJyovOiBicmVhaztcblx0XHRcdFx0XHRjYXNlICdkb3dubG9hZGNvbXBvbmVudHMnIC8qY2FzZSAnRG93bmxvYWRDb21wb25lbnRzJyovOiBicmVhaztcblx0XHRcdFx0XHRjYXNlICdsb2NhdGlvbm9mY29tcG9uZW50cycgLypjYXNlICdMb2NhdGlvbk9mQ29tcG9uZW50cycqLzogYnJlYWs7XG5cdFx0XHRcdFx0Y2FzZSAnY29sb3JzJyAvKmNhc2UgJ0NvbG9ycycqLzogYnJlYWs7XG5cdFx0XHRcdFx0Y2FzZSAnY29sb3InIC8qY2FzZSAnQ29sb3InKi86IGJyZWFrO1xuXHRcdFx0XHRcdGNhc2UgJ2luZGV4JyAvKmNhc2UgJ0luZGV4JyovOiBicmVhaztcblx0XHRcdFx0XHRjYXNlICdyZ2InIC8qY2FzZSAnUkdCJyovOiBicmVhaztcblx0XHRcdFx0XHRjYXNlICd0YXJnZXRzY3JlZW5zaXplJyAvKmNhc2UgJ1RhcmdldFNjcmVlblNpemUnKi86IGJyZWFrO1xuXHRcdFx0XHRcdGNhc2UgJ3JlYWRvbmx5cmVjb21tZW5kZWQnIC8qY2FzZSAnUmVhZE9ubHlSZWNvbW1lbmRlZCcqLzogYnJlYWs7XG5cdFx0XHRcdFx0ZGVmYXVsdDogc2VlbiA9IGZhbHNlO1xuXHRcdFx0XHR9IGJyZWFrO1xuXG5cdFx0XHRcdC8qIENvbXBvbmVudE9wdGlvbnMgKi9cblx0XHRcdFx0Y2FzZSAnY29tcG9uZW50b3B0aW9ucycgLypjYXNlICdDb21wb25lbnRPcHRpb25zJyovOiBzd2l0Y2goUm5bM10pIHtcblx0XHRcdFx0XHRjYXNlICd0b29sYmFyJyAvKmNhc2UgJ1Rvb2xiYXInKi86IGJyZWFrO1xuXHRcdFx0XHRcdGNhc2UgJ2hpZGVvZmZpY2Vsb2dvJyAvKmNhc2UgJ0hpZGVPZmZpY2VMb2dvJyovOiBicmVhaztcblx0XHRcdFx0XHRjYXNlICdzcHJlYWRzaGVldGF1dG9maXQnIC8qY2FzZSAnU3ByZWFkc2hlZXRBdXRvRml0JyovOiBicmVhaztcblx0XHRcdFx0XHRjYXNlICdsYWJlbCcgLypjYXNlICdMYWJlbCcqLzogYnJlYWs7XG5cdFx0XHRcdFx0Y2FzZSAnY2FwdGlvbicgLypjYXNlICdDYXB0aW9uJyovOiBicmVhaztcblx0XHRcdFx0XHRjYXNlICdtYXhoZWlnaHQnIC8qY2FzZSAnTWF4SGVpZ2h0JyovOiBicmVhaztcblx0XHRcdFx0XHRjYXNlICdtYXh3aWR0aCcgLypjYXNlICdNYXhXaWR0aCcqLzogYnJlYWs7XG5cdFx0XHRcdFx0Y2FzZSAnbmV4dHNoZWV0bnVtYmVyJyAvKmNhc2UgJ05leHRTaGVldE51bWJlcicqLzogYnJlYWs7XG5cdFx0XHRcdFx0ZGVmYXVsdDogc2VlbiA9IGZhbHNlO1xuXHRcdFx0XHR9IGJyZWFrO1xuXG5cdFx0XHRcdC8qIEV4Y2VsV29ya2Jvb2sgKi9cblx0XHRcdFx0Y2FzZSAnZXhjZWx3b3JrYm9vaycgLypjYXNlICdFeGNlbFdvcmtib29rJyovOiBzd2l0Y2goUm5bM10pIHtcblx0XHRcdFx0XHRjYXNlICdkYXRlMTkwNCcgLypjYXNlICdEYXRlMTkwNCcqLzpcbldvcmtib29rLldCUHJvcHMuZGF0ZTE5MDQgPSB0cnVlO1xuXHRcdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdFx0Y2FzZSAnd2luZG93aGVpZ2h0JyAvKmNhc2UgJ1dpbmRvd0hlaWdodCcqLzogYnJlYWs7XG5cdFx0XHRcdFx0Y2FzZSAnd2luZG93d2lkdGgnIC8qY2FzZSAnV2luZG93V2lkdGgnKi86IGJyZWFrO1xuXHRcdFx0XHRcdGNhc2UgJ3dpbmRvd3RvcHgnIC8qY2FzZSAnV2luZG93VG9wWCcqLzogYnJlYWs7XG5cdFx0XHRcdFx0Y2FzZSAnd2luZG93dG9weScgLypjYXNlICdXaW5kb3dUb3BZJyovOiBicmVhaztcblx0XHRcdFx0XHRjYXNlICd0YWJyYXRpbycgLypjYXNlICdUYWJSYXRpbycqLzogYnJlYWs7XG5cdFx0XHRcdFx0Y2FzZSAncHJvdGVjdHN0cnVjdHVyZScgLypjYXNlICdQcm90ZWN0U3RydWN0dXJlJyovOiBicmVhaztcblx0XHRcdFx0XHRjYXNlICdwcm90ZWN0d2luZG93JyAvKmNhc2UgJ1Byb3RlY3RXaW5kb3cnKi86IGJyZWFrO1xuXHRcdFx0XHRcdGNhc2UgJ3Byb3RlY3R3aW5kb3dzJyAvKmNhc2UgJ1Byb3RlY3RXaW5kb3dzJyovOiBicmVhaztcblx0XHRcdFx0XHRjYXNlICdhY3RpdmVzaGVldCcgLypjYXNlICdBY3RpdmVTaGVldCcqLzogYnJlYWs7XG5cdFx0XHRcdFx0Y2FzZSAnZGlzcGxheWlua25vdGVzJyAvKmNhc2UgJ0Rpc3BsYXlJbmtOb3RlcycqLzogYnJlYWs7XG5cdFx0XHRcdFx0Y2FzZSAnZmlyc3R2aXNpYmxlc2hlZXQnIC8qY2FzZSAnRmlyc3RWaXNpYmxlU2hlZXQnKi86IGJyZWFrO1xuXHRcdFx0XHRcdGNhc2UgJ3N1cGJvb2snIC8qY2FzZSAnU3VwQm9vaycqLzogYnJlYWs7XG5cdFx0XHRcdFx0Y2FzZSAnc2hlZXRuYW1lJyAvKmNhc2UgJ1NoZWV0TmFtZScqLzogYnJlYWs7XG5cdFx0XHRcdFx0Y2FzZSAnc2hlZXRpbmRleCcgLypjYXNlICdTaGVldEluZGV4JyovOiBicmVhaztcblx0XHRcdFx0XHRjYXNlICdzaGVldGluZGV4Zmlyc3QnIC8qY2FzZSAnU2hlZXRJbmRleEZpcnN0JyovOiBicmVhaztcblx0XHRcdFx0XHRjYXNlICdzaGVldGluZGV4bGFzdCcgLypjYXNlICdTaGVldEluZGV4TGFzdCcqLzogYnJlYWs7XG5cdFx0XHRcdFx0Y2FzZSAnZGxsJyAvKmNhc2UgJ0RsbCcqLzogYnJlYWs7XG5cdFx0XHRcdFx0Y2FzZSAnYWNjZXB0bGFiZWxzaW5mb3JtdWxhcycgLypjYXNlICdBY2NlcHRMYWJlbHNJbkZvcm11bGFzJyovOiBicmVhaztcblx0XHRcdFx0XHRjYXNlICdkb25vdHNhdmVsaW5rdmFsdWVzJyAvKmNhc2UgJ0RvTm90U2F2ZUxpbmtWYWx1ZXMnKi86IGJyZWFrO1xuXHRcdFx0XHRcdGNhc2UgJ2l0ZXJhdGlvbicgLypjYXNlICdJdGVyYXRpb24nKi86IGJyZWFrO1xuXHRcdFx0XHRcdGNhc2UgJ21heGl0ZXJhdGlvbnMnIC8qY2FzZSAnTWF4SXRlcmF0aW9ucycqLzogYnJlYWs7XG5cdFx0XHRcdFx0Y2FzZSAnbWF4Y2hhbmdlJyAvKmNhc2UgJ01heENoYW5nZScqLzogYnJlYWs7XG5cdFx0XHRcdFx0Y2FzZSAncGF0aCcgLypjYXNlICdQYXRoJyovOiBicmVhaztcblx0XHRcdFx0XHRjYXNlICd4Y3QnIC8qY2FzZSAnWGN0JyovOiBicmVhaztcblx0XHRcdFx0XHRjYXNlICdjb3VudCcgLypjYXNlICdDb3VudCcqLzogYnJlYWs7XG5cdFx0XHRcdFx0Y2FzZSAnc2VsZWN0ZWRzaGVldHMnIC8qY2FzZSAnU2VsZWN0ZWRTaGVldHMnKi86IGJyZWFrO1xuXHRcdFx0XHRcdGNhc2UgJ2NhbGN1bGF0aW9uJyAvKmNhc2UgJ0NhbGN1bGF0aW9uJyovOiBicmVhaztcblx0XHRcdFx0XHRjYXNlICd1bmNhbGNlZCcgLypjYXNlICdVbmNhbGNlZCcqLzogYnJlYWs7XG5cdFx0XHRcdFx0Y2FzZSAnc3RhcnR1cHByb21wdCcgLypjYXNlICdTdGFydHVwUHJvbXB0JyovOiBicmVhaztcblx0XHRcdFx0XHRjYXNlICdjcm4nIC8qY2FzZSAnQ3JuJyovOiBicmVhaztcblx0XHRcdFx0XHRjYXNlICdleHRlcm5uYW1lJyAvKmNhc2UgJ0V4dGVybk5hbWUnKi86IGJyZWFrO1xuXHRcdFx0XHRcdGNhc2UgJ2Zvcm11bGEnIC8qY2FzZSAnRm9ybXVsYScqLzogYnJlYWs7XG5cdFx0XHRcdFx0Y2FzZSAnY29sZmlyc3QnIC8qY2FzZSAnQ29sRmlyc3QnKi86IGJyZWFrO1xuXHRcdFx0XHRcdGNhc2UgJ2NvbGxhc3QnIC8qY2FzZSAnQ29sTGFzdCcqLzogYnJlYWs7XG5cdFx0XHRcdFx0Y2FzZSAnd2FudGFkdmlzZScgLypjYXNlICdXYW50QWR2aXNlJyovOiBicmVhaztcblx0XHRcdFx0XHRjYXNlICdib29sZWFuJyAvKmNhc2UgJ0Jvb2xlYW4nKi86IGJyZWFrO1xuXHRcdFx0XHRcdGNhc2UgJ2Vycm9yJyAvKmNhc2UgJ0Vycm9yJyovOiBicmVhaztcblx0XHRcdFx0XHRjYXNlICd0ZXh0JyAvKmNhc2UgJ1RleHQnKi86IGJyZWFrO1xuXHRcdFx0XHRcdGNhc2UgJ29sZScgLypjYXNlICdPTEUnKi86IGJyZWFrO1xuXHRcdFx0XHRcdGNhc2UgJ25vYXV0b3JlY292ZXInIC8qY2FzZSAnTm9BdXRvUmVjb3ZlcicqLzogYnJlYWs7XG5cdFx0XHRcdFx0Y2FzZSAncHVibGlzaG9iamVjdHMnIC8qY2FzZSAnUHVibGlzaE9iamVjdHMnKi86IGJyZWFrO1xuXHRcdFx0XHRcdGNhc2UgJ2Rvbm90Y2FsY3VsYXRlYmVmb3Jlc2F2ZScgLypjYXNlICdEb05vdENhbGN1bGF0ZUJlZm9yZVNhdmUnKi86IGJyZWFrO1xuXHRcdFx0XHRcdGNhc2UgJ251bWJlcicgLypjYXNlICdOdW1iZXInKi86IGJyZWFrO1xuXHRcdFx0XHRcdGNhc2UgJ3JlZm1vZGVyMWMxJyAvKmNhc2UgJ1JlZk1vZGVSMUMxJyovOiBicmVhaztcblx0XHRcdFx0XHRjYXNlICdlbWJlZHNhdmVzbWFydHRhZ3MnIC8qY2FzZSAnRW1iZWRTYXZlU21hcnRUYWdzJyovOiBicmVhaztcblx0XHRcdFx0XHRkZWZhdWx0OiBzZWVuID0gZmFsc2U7XG5cdFx0XHRcdH0gYnJlYWs7XG5cblx0XHRcdFx0LyogV29ya2Jvb2tPcHRpb25zICovXG5cdFx0XHRcdGNhc2UgJ3dvcmtib29rb3B0aW9ucycgLypjYXNlICdXb3JrYm9va09wdGlvbnMnKi86IHN3aXRjaChSblszXSkge1xuXHRcdFx0XHRcdGNhc2UgJ293Y3ZlcnNpb24nIC8qY2FzZSAnT1dDVmVyc2lvbicqLzogYnJlYWs7XG5cdFx0XHRcdFx0Y2FzZSAnaGVpZ2h0JyAvKmNhc2UgJ0hlaWdodCcqLzogYnJlYWs7XG5cdFx0XHRcdFx0Y2FzZSAnd2lkdGgnIC8qY2FzZSAnV2lkdGgnKi86IGJyZWFrO1xuXHRcdFx0XHRcdGRlZmF1bHQ6IHNlZW4gPSBmYWxzZTtcblx0XHRcdFx0fSBicmVhaztcblxuXHRcdFx0XHQvKiBXb3Jrc2hlZXRPcHRpb25zICovXG5cdFx0XHRcdGNhc2UgJ3dvcmtzaGVldG9wdGlvbnMnIC8qY2FzZSAnV29ya3NoZWV0T3B0aW9ucycqLzogc3dpdGNoKFJuWzNdKSB7XG5cdFx0XHRcdFx0Y2FzZSAndmlzaWJsZScgLypjYXNlICdWaXNpYmxlJyovOlxuXHRcdFx0XHRcdFx0aWYoUm5bMF0uc2xpY2UoLTIpID09PSBcIi8+XCIpey8qIGVtcHR5ICovfVxuXHRcdFx0XHRcdFx0ZWxzZSBpZihSblsxXT09PVwiL1wiKSBzd2l0Y2goc3RyLnNsaWNlKHBpZHgsIFJuLmluZGV4KSkge1xuXHRcdFx0XHRcdFx0XHRjYXNlIFwiU2hlZXRIaWRkZW5cIjogd3Nwcm9wcy5IaWRkZW4gPSAxOyBicmVhaztcblx0XHRcdFx0XHRcdFx0Y2FzZSBcIlNoZWV0VmVyeUhpZGRlblwiOiB3c3Byb3BzLkhpZGRlbiA9IDI7IGJyZWFrO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0ZWxzZSBwaWR4ID0gUm4uaW5kZXggKyBSblswXS5sZW5ndGg7XG5cdFx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0XHRjYXNlICdoZWFkZXInIC8qY2FzZSAnSGVhZGVyJyovOlxuXHRcdFx0XHRcdFx0aWYoIWN1cnNoZWV0WychbWFyZ2lucyddKSBkZWZhdWx0X21hcmdpbnMoY3Vyc2hlZXRbJyFtYXJnaW5zJ109e30sICd4bG1sJyk7XG5cdFx0XHRcdFx0XHRjdXJzaGVldFsnIW1hcmdpbnMnXS5oZWFkZXIgPSBwYXJzZXhtbHRhZyhSblswXSkuTWFyZ2luO1xuXHRcdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdFx0Y2FzZSAnZm9vdGVyJyAvKmNhc2UgJ0Zvb3RlcicqLzpcblx0XHRcdFx0XHRcdGlmKCFjdXJzaGVldFsnIW1hcmdpbnMnXSkgZGVmYXVsdF9tYXJnaW5zKGN1cnNoZWV0WychbWFyZ2lucyddPXt9LCAneGxtbCcpO1xuXHRcdFx0XHRcdFx0Y3Vyc2hlZXRbJyFtYXJnaW5zJ10uZm9vdGVyID0gcGFyc2V4bWx0YWcoUm5bMF0pLk1hcmdpbjtcblx0XHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRcdGNhc2UgJ3BhZ2VtYXJnaW5zJyAvKmNhc2UgJ1BhZ2VNYXJnaW5zJyovOlxuXHRcdFx0XHRcdFx0dmFyIHBhZ2VtYXJnaW5zID0gcGFyc2V4bWx0YWcoUm5bMF0pO1xuXHRcdFx0XHRcdFx0aWYoIWN1cnNoZWV0WychbWFyZ2lucyddKSBkZWZhdWx0X21hcmdpbnMoY3Vyc2hlZXRbJyFtYXJnaW5zJ109e30sJ3hsbWwnKTtcblx0XHRcdFx0XHRcdGlmKHBhZ2VtYXJnaW5zLlRvcCkgY3Vyc2hlZXRbJyFtYXJnaW5zJ10udG9wID0gcGFnZW1hcmdpbnMuVG9wO1xuXHRcdFx0XHRcdFx0aWYocGFnZW1hcmdpbnMuTGVmdCkgY3Vyc2hlZXRbJyFtYXJnaW5zJ10ubGVmdCA9IHBhZ2VtYXJnaW5zLkxlZnQ7XG5cdFx0XHRcdFx0XHRpZihwYWdlbWFyZ2lucy5SaWdodCkgY3Vyc2hlZXRbJyFtYXJnaW5zJ10ucmlnaHQgPSBwYWdlbWFyZ2lucy5SaWdodDtcblx0XHRcdFx0XHRcdGlmKHBhZ2VtYXJnaW5zLkJvdHRvbSkgY3Vyc2hlZXRbJyFtYXJnaW5zJ10uYm90dG9tID0gcGFnZW1hcmdpbnMuQm90dG9tO1xuXHRcdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdFx0Y2FzZSAnZGlzcGxheXJpZ2h0dG9sZWZ0JyAvKmNhc2UgJ0Rpc3BsYXlSaWdodFRvTGVmdCcqLzpcblx0XHRcdFx0XHRcdGlmKCFXb3JrYm9vay5WaWV3cykgV29ya2Jvb2suVmlld3MgPSBbXTtcblx0XHRcdFx0XHRcdGlmKCFXb3JrYm9vay5WaWV3c1swXSkgV29ya2Jvb2suVmlld3NbMF0gPSB7fTtcblx0XHRcdFx0XHRcdFdvcmtib29rLlZpZXdzWzBdLlJUTCA9IHRydWU7XG5cdFx0XHRcdFx0XHRicmVhaztcblxuXHRcdFx0XHRcdGNhc2UgJ2ZyZWV6ZXBhbmVzJyAvKmNhc2UgJ0ZyZWV6ZVBhbmVzJyovOiBicmVhaztcblx0XHRcdFx0XHRjYXNlICdmcm96ZW5ub3NwbGl0JyAvKmNhc2UgJ0Zyb3plbk5vU3BsaXQnKi86IGJyZWFrO1xuXG5cdFx0XHRcdFx0Y2FzZSAnc3BsaXRob3Jpem9udGFsJyAvKmNhc2UgJ1NwbGl0SG9yaXpvbnRhbCcqLzpcblx0XHRcdFx0XHRjYXNlICdzcGxpdHZlcnRpY2FsJyAvKmNhc2UgJ1NwbGl0VmVydGljYWwnKi86XG5cdFx0XHRcdFx0XHRicmVhaztcblxuXHRcdFx0XHRcdGNhc2UgJ2Rvbm90ZGlzcGxheWdyaWRsaW5lcycgLypjYXNlICdEb05vdERpc3BsYXlHcmlkbGluZXMnKi86XG5cdFx0XHRcdFx0XHRicmVhaztcblxuXHRcdFx0XHRcdGNhc2UgJ2FjdGl2ZXJvdycgLypjYXNlICdBY3RpdmVSb3cnKi86IGJyZWFrO1xuXHRcdFx0XHRcdGNhc2UgJ2FjdGl2ZWNvbCcgLypjYXNlICdBY3RpdmVDb2wnKi86IGJyZWFrO1xuXHRcdFx0XHRcdGNhc2UgJ3RvcHJvd2JvdHRvbXBhbmUnIC8qY2FzZSAnVG9wUm93Qm90dG9tUGFuZScqLzogYnJlYWs7XG5cdFx0XHRcdFx0Y2FzZSAnbGVmdGNvbHVtbnJpZ2h0cGFuZScgLypjYXNlICdMZWZ0Q29sdW1uUmlnaHRQYW5lJyovOiBicmVhaztcblxuXHRcdFx0XHRcdGNhc2UgJ3Vuc3luY2VkJyAvKmNhc2UgJ1Vuc3luY2VkJyovOiBicmVhaztcblx0XHRcdFx0XHRjYXNlICdwcmludCcgLypjYXNlICdQcmludCcqLzogYnJlYWs7XG5cdFx0XHRcdFx0Y2FzZSAncGFuZXMnIC8qY2FzZSAnUGFuZXMnKi86IGJyZWFrO1xuXHRcdFx0XHRcdGNhc2UgJ3NjYWxlJyAvKmNhc2UgJ1NjYWxlJyovOiBicmVhaztcblx0XHRcdFx0XHRjYXNlICdwYW5lJyAvKmNhc2UgJ1BhbmUnKi86IGJyZWFrO1xuXHRcdFx0XHRcdGNhc2UgJ251bWJlcicgLypjYXNlICdOdW1iZXInKi86IGJyZWFrO1xuXHRcdFx0XHRcdGNhc2UgJ2xheW91dCcgLypjYXNlICdMYXlvdXQnKi86IGJyZWFrO1xuXHRcdFx0XHRcdGNhc2UgJ3BhZ2VzZXR1cCcgLypjYXNlICdQYWdlU2V0dXAnKi86IGJyZWFrO1xuXHRcdFx0XHRcdGNhc2UgJ3NlbGVjdGVkJyAvKmNhc2UgJ1NlbGVjdGVkJyovOiBicmVhaztcblx0XHRcdFx0XHRjYXNlICdwcm90ZWN0b2JqZWN0cycgLypjYXNlICdQcm90ZWN0T2JqZWN0cycqLzogYnJlYWs7XG5cdFx0XHRcdFx0Y2FzZSAnZW5hYmxlc2VsZWN0aW9uJyAvKmNhc2UgJ0VuYWJsZVNlbGVjdGlvbicqLzogYnJlYWs7XG5cdFx0XHRcdFx0Y2FzZSAncHJvdGVjdHNjZW5hcmlvcycgLypjYXNlICdQcm90ZWN0U2NlbmFyaW9zJyovOiBicmVhaztcblx0XHRcdFx0XHRjYXNlICd2YWxpZHByaW50ZXJpbmZvJyAvKmNhc2UgJ1ZhbGlkUHJpbnRlckluZm8nKi86IGJyZWFrO1xuXHRcdFx0XHRcdGNhc2UgJ2hvcml6b250YWxyZXNvbHV0aW9uJyAvKmNhc2UgJ0hvcml6b250YWxSZXNvbHV0aW9uJyovOiBicmVhaztcblx0XHRcdFx0XHRjYXNlICd2ZXJ0aWNhbHJlc29sdXRpb24nIC8qY2FzZSAnVmVydGljYWxSZXNvbHV0aW9uJyovOiBicmVhaztcblx0XHRcdFx0XHRjYXNlICdudW1iZXJvZmNvcGllcycgLypjYXNlICdOdW1iZXJvZkNvcGllcycqLzogYnJlYWs7XG5cdFx0XHRcdFx0Y2FzZSAnYWN0aXZlcGFuZScgLypjYXNlICdBY3RpdmVQYW5lJyovOiBicmVhaztcblx0XHRcdFx0XHRjYXNlICd0b3Byb3d2aXNpYmxlJyAvKmNhc2UgJ1RvcFJvd1Zpc2libGUnKi86IGJyZWFrO1xuXHRcdFx0XHRcdGNhc2UgJ2xlZnRjb2x1bW52aXNpYmxlJyAvKmNhc2UgJ0xlZnRDb2x1bW5WaXNpYmxlJyovOiBicmVhaztcblx0XHRcdFx0XHRjYXNlICdmaXR0b3BhZ2UnIC8qY2FzZSAnRml0VG9QYWdlJyovOiBicmVhaztcblx0XHRcdFx0XHRjYXNlICdyYW5nZXNlbGVjdGlvbicgLypjYXNlICdSYW5nZVNlbGVjdGlvbicqLzogYnJlYWs7XG5cdFx0XHRcdFx0Y2FzZSAncGFwZXJzaXplaW5kZXgnIC8qY2FzZSAnUGFwZXJTaXplSW5kZXgnKi86IGJyZWFrO1xuXHRcdFx0XHRcdGNhc2UgJ3BhZ2VsYXlvdXR6b29tJyAvKmNhc2UgJ1BhZ2VMYXlvdXRab29tJyovOiBicmVhaztcblx0XHRcdFx0XHRjYXNlICdwYWdlYnJlYWt6b29tJyAvKmNhc2UgJ1BhZ2VCcmVha1pvb20nKi86IGJyZWFrO1xuXHRcdFx0XHRcdGNhc2UgJ2ZpbHRlcm9uJyAvKmNhc2UgJ0ZpbHRlck9uJyovOiBicmVhaztcblx0XHRcdFx0XHRjYXNlICdmaXR3aWR0aCcgLypjYXNlICdGaXRXaWR0aCcqLzogYnJlYWs7XG5cdFx0XHRcdFx0Y2FzZSAnZml0aGVpZ2h0JyAvKmNhc2UgJ0ZpdEhlaWdodCcqLzogYnJlYWs7XG5cdFx0XHRcdFx0Y2FzZSAnY29tbWVudHNsYXlvdXQnIC8qY2FzZSAnQ29tbWVudHNMYXlvdXQnKi86IGJyZWFrO1xuXHRcdFx0XHRcdGNhc2UgJ3pvb20nIC8qY2FzZSAnWm9vbScqLzogYnJlYWs7XG5cdFx0XHRcdFx0Y2FzZSAnbGVmdHRvcmlnaHQnIC8qY2FzZSAnTGVmdFRvUmlnaHQnKi86IGJyZWFrO1xuXHRcdFx0XHRcdGNhc2UgJ2dyaWRsaW5lcycgLypjYXNlICdHcmlkbGluZXMnKi86IGJyZWFrO1xuXHRcdFx0XHRcdGNhc2UgJ2FsbG93c29ydCcgLypjYXNlICdBbGxvd1NvcnQnKi86IGJyZWFrO1xuXHRcdFx0XHRcdGNhc2UgJ2FsbG93ZmlsdGVyJyAvKmNhc2UgJ0FsbG93RmlsdGVyJyovOiBicmVhaztcblx0XHRcdFx0XHRjYXNlICdhbGxvd2luc2VydHJvd3MnIC8qY2FzZSAnQWxsb3dJbnNlcnRSb3dzJyovOiBicmVhaztcblx0XHRcdFx0XHRjYXNlICdhbGxvd2RlbGV0ZXJvd3MnIC8qY2FzZSAnQWxsb3dEZWxldGVSb3dzJyovOiBicmVhaztcblx0XHRcdFx0XHRjYXNlICdhbGxvd2luc2VydGNvbHMnIC8qY2FzZSAnQWxsb3dJbnNlcnRDb2xzJyovOiBicmVhaztcblx0XHRcdFx0XHRjYXNlICdhbGxvd2RlbGV0ZWNvbHMnIC8qY2FzZSAnQWxsb3dEZWxldGVDb2xzJyovOiBicmVhaztcblx0XHRcdFx0XHRjYXNlICdhbGxvd2luc2VydGh5cGVybGlua3MnIC8qY2FzZSAnQWxsb3dJbnNlcnRIeXBlcmxpbmtzJyovOiBicmVhaztcblx0XHRcdFx0XHRjYXNlICdhbGxvd2Zvcm1hdGNlbGxzJyAvKmNhc2UgJ0FsbG93Rm9ybWF0Q2VsbHMnKi86IGJyZWFrO1xuXHRcdFx0XHRcdGNhc2UgJ2FsbG93c2l6ZWNvbHMnIC8qY2FzZSAnQWxsb3dTaXplQ29scycqLzogYnJlYWs7XG5cdFx0XHRcdFx0Y2FzZSAnYWxsb3dzaXplcm93cycgLypjYXNlICdBbGxvd1NpemVSb3dzJyovOiBicmVhaztcblx0XHRcdFx0XHRjYXNlICdub3N1bW1hcnlyb3dzYmVsb3dkZXRhaWwnIC8qY2FzZSAnTm9TdW1tYXJ5Um93c0JlbG93RGV0YWlsJyovOiBicmVhaztcblx0XHRcdFx0XHRjYXNlICd0YWJjb2xvcmluZGV4JyAvKmNhc2UgJ1RhYkNvbG9ySW5kZXgnKi86IGJyZWFrO1xuXHRcdFx0XHRcdGNhc2UgJ2Rvbm90ZGlzcGxheWhlYWRpbmdzJyAvKmNhc2UgJ0RvTm90RGlzcGxheUhlYWRpbmdzJyovOiBicmVhaztcblx0XHRcdFx0XHRjYXNlICdzaG93cGFnZWxheW91dHpvb20nIC8qY2FzZSAnU2hvd1BhZ2VMYXlvdXRab29tJyovOiBicmVhaztcblx0XHRcdFx0XHRjYXNlICdub3N1bW1hcnljb2x1bW5zcmlnaHRkZXRhaWwnIC8qY2FzZSAnTm9TdW1tYXJ5Q29sdW1uc1JpZ2h0RGV0YWlsJyovOiBicmVhaztcblx0XHRcdFx0XHRjYXNlICdibGFja2FuZHdoaXRlJyAvKmNhc2UgJ0JsYWNrQW5kV2hpdGUnKi86IGJyZWFrO1xuXHRcdFx0XHRcdGNhc2UgJ2Rvbm90ZGlzcGxheXplcm9zJyAvKmNhc2UgJ0RvTm90RGlzcGxheVplcm9zJyovOiBicmVhaztcblx0XHRcdFx0XHRjYXNlICdkaXNwbGF5cGFnZWJyZWFrJyAvKmNhc2UgJ0Rpc3BsYXlQYWdlQnJlYWsnKi86IGJyZWFrO1xuXHRcdFx0XHRcdGNhc2UgJ3Jvd2NvbGhlYWRpbmdzJyAvKmNhc2UgJ1Jvd0NvbEhlYWRpbmdzJyovOiBicmVhaztcblx0XHRcdFx0XHRjYXNlICdkb25vdGRpc3BsYXlvdXRsaW5lJyAvKmNhc2UgJ0RvTm90RGlzcGxheU91dGxpbmUnKi86IGJyZWFrO1xuXHRcdFx0XHRcdGNhc2UgJ25vb3JpZW50YXRpb24nIC8qY2FzZSAnTm9PcmllbnRhdGlvbicqLzogYnJlYWs7XG5cdFx0XHRcdFx0Y2FzZSAnYWxsb3d1c2VwaXZvdHRhYmxlcycgLypjYXNlICdBbGxvd1VzZVBpdm90VGFibGVzJyovOiBicmVhaztcblx0XHRcdFx0XHRjYXNlICd6ZXJvaGVpZ2h0JyAvKmNhc2UgJ1plcm9IZWlnaHQnKi86IGJyZWFrO1xuXHRcdFx0XHRcdGNhc2UgJ3ZpZXdhYmxlcmFuZ2UnIC8qY2FzZSAnVmlld2FibGVSYW5nZScqLzogYnJlYWs7XG5cdFx0XHRcdFx0Y2FzZSAnc2VsZWN0aW9uJyAvKmNhc2UgJ1NlbGVjdGlvbicqLzogYnJlYWs7XG5cdFx0XHRcdFx0Y2FzZSAncHJvdGVjdGNvbnRlbnRzJyAvKmNhc2UgJ1Byb3RlY3RDb250ZW50cycqLzogYnJlYWs7XG5cdFx0XHRcdFx0ZGVmYXVsdDogc2VlbiA9IGZhbHNlO1xuXHRcdFx0XHR9IGJyZWFrO1xuXG5cdFx0XHRcdC8qIFBpdm90VGFibGUgKi9cblx0XHRcdFx0Y2FzZSAncGl2b3R0YWJsZScgLypjYXNlICdQaXZvdFRhYmxlJyovOiBjYXNlICdwaXZvdGNhY2hlJyAvKmNhc2UgJ1Bpdm90Q2FjaGUnKi86IHN3aXRjaChSblszXSkge1xuXHRcdFx0XHRcdGNhc2UgJ2ltbWVkaWF0ZWl0ZW1zb25kcm9wJyAvKmNhc2UgJ0ltbWVkaWF0ZUl0ZW1zT25Ecm9wJyovOiBicmVhaztcblx0XHRcdFx0XHRjYXNlICdzaG93cGFnZW11bHRpcGxlaXRlbWxhYmVsJyAvKmNhc2UgJ1Nob3dQYWdlTXVsdGlwbGVJdGVtTGFiZWwnKi86IGJyZWFrO1xuXHRcdFx0XHRcdGNhc2UgJ2NvbXBhY3Ryb3dpbmRlbnQnIC8qY2FzZSAnQ29tcGFjdFJvd0luZGVudCcqLzogYnJlYWs7XG5cdFx0XHRcdFx0Y2FzZSAnbG9jYXRpb24nIC8qY2FzZSAnTG9jYXRpb24nKi86IGJyZWFrO1xuXHRcdFx0XHRcdGNhc2UgJ3Bpdm90ZmllbGQnIC8qY2FzZSAnUGl2b3RGaWVsZCcqLzogYnJlYWs7XG5cdFx0XHRcdFx0Y2FzZSAnb3JpZW50YXRpb24nIC8qY2FzZSAnT3JpZW50YXRpb24nKi86IGJyZWFrO1xuXHRcdFx0XHRcdGNhc2UgJ2xheW91dGZvcm0nIC8qY2FzZSAnTGF5b3V0Rm9ybScqLzogYnJlYWs7XG5cdFx0XHRcdFx0Y2FzZSAnbGF5b3V0c3VidG90YWxsb2NhdGlvbicgLypjYXNlICdMYXlvdXRTdWJ0b3RhbExvY2F0aW9uJyovOiBicmVhaztcblx0XHRcdFx0XHRjYXNlICdsYXlvdXRjb21wYWN0cm93JyAvKmNhc2UgJ0xheW91dENvbXBhY3RSb3cnKi86IGJyZWFrO1xuXHRcdFx0XHRcdGNhc2UgJ3Bvc2l0aW9uJyAvKmNhc2UgJ1Bvc2l0aW9uJyovOiBicmVhaztcblx0XHRcdFx0XHRjYXNlICdwaXZvdGl0ZW0nIC8qY2FzZSAnUGl2b3RJdGVtJyovOiBicmVhaztcblx0XHRcdFx0XHRjYXNlICdkYXRhdHlwZScgLypjYXNlICdEYXRhVHlwZScqLzogYnJlYWs7XG5cdFx0XHRcdFx0Y2FzZSAnZGF0YWZpZWxkJyAvKmNhc2UgJ0RhdGFGaWVsZCcqLzogYnJlYWs7XG5cdFx0XHRcdFx0Y2FzZSAnc291cmNlbmFtZScgLypjYXNlICdTb3VyY2VOYW1lJyovOiBicmVhaztcblx0XHRcdFx0XHRjYXNlICdwYXJlbnRmaWVsZCcgLypjYXNlICdQYXJlbnRGaWVsZCcqLzogYnJlYWs7XG5cdFx0XHRcdFx0Y2FzZSAncHRsaW5laXRlbXMnIC8qY2FzZSAnUFRMaW5lSXRlbXMnKi86IGJyZWFrO1xuXHRcdFx0XHRcdGNhc2UgJ3B0bGluZWl0ZW0nIC8qY2FzZSAnUFRMaW5lSXRlbScqLzogYnJlYWs7XG5cdFx0XHRcdFx0Y2FzZSAnY291bnRvZnNhbWVpdGVtcycgLypjYXNlICdDb3VudE9mU2FtZUl0ZW1zJyovOiBicmVhaztcblx0XHRcdFx0XHRjYXNlICdpdGVtJyAvKmNhc2UgJ0l0ZW0nKi86IGJyZWFrO1xuXHRcdFx0XHRcdGNhc2UgJ2l0ZW10eXBlJyAvKmNhc2UgJ0l0ZW1UeXBlJyovOiBicmVhaztcblx0XHRcdFx0XHRjYXNlICdwdHNvdXJjZScgLypjYXNlICdQVFNvdXJjZScqLzogYnJlYWs7XG5cdFx0XHRcdFx0Y2FzZSAnY2FjaGVpbmRleCcgLypjYXNlICdDYWNoZUluZGV4JyovOiBicmVhaztcblx0XHRcdFx0XHRjYXNlICdjb25zb2xpZGF0aW9ucmVmZXJlbmNlJyAvKmNhc2UgJ0NvbnNvbGlkYXRpb25SZWZlcmVuY2UnKi86IGJyZWFrO1xuXHRcdFx0XHRcdGNhc2UgJ2ZpbGVuYW1lJyAvKmNhc2UgJ0ZpbGVOYW1lJyovOiBicmVhaztcblx0XHRcdFx0XHRjYXNlICdyZWZlcmVuY2UnIC8qY2FzZSAnUmVmZXJlbmNlJyovOiBicmVhaztcblx0XHRcdFx0XHRjYXNlICdub2NvbHVtbmdyYW5kJyAvKmNhc2UgJ05vQ29sdW1uR3JhbmQnKi86IGJyZWFrO1xuXHRcdFx0XHRcdGNhc2UgJ25vcm93Z3JhbmQnIC8qY2FzZSAnTm9Sb3dHcmFuZCcqLzogYnJlYWs7XG5cdFx0XHRcdFx0Y2FzZSAnYmxhbmtsaW5lYWZ0ZXJpdGVtcycgLypjYXNlICdCbGFua0xpbmVBZnRlckl0ZW1zJyovOiBicmVhaztcblx0XHRcdFx0XHRjYXNlICdoaWRkZW4nIC8qY2FzZSAnSGlkZGVuJyovOiBicmVhaztcblx0XHRcdFx0XHRjYXNlICdzdWJ0b3RhbCcgLypjYXNlICdTdWJ0b3RhbCcqLzogYnJlYWs7XG5cdFx0XHRcdFx0Y2FzZSAnYmFzZWZpZWxkJyAvKmNhc2UgJ0Jhc2VGaWVsZCcqLzogYnJlYWs7XG5cdFx0XHRcdFx0Y2FzZSAnbWFwY2hpbGRpdGVtcycgLypjYXNlICdNYXBDaGlsZEl0ZW1zJyovOiBicmVhaztcblx0XHRcdFx0XHRjYXNlICdmdW5jdGlvbicgLypjYXNlICdGdW5jdGlvbicqLzogYnJlYWs7XG5cdFx0XHRcdFx0Y2FzZSAncmVmcmVzaG9uZmlsZW9wZW4nIC8qY2FzZSAnUmVmcmVzaE9uRmlsZU9wZW4nKi86IGJyZWFrO1xuXHRcdFx0XHRcdGNhc2UgJ3ByaW50c2V0dGl0bGVzJyAvKmNhc2UgJ1ByaW50U2V0VGl0bGVzJyovOiBicmVhaztcblx0XHRcdFx0XHRjYXNlICdtZXJnZWxhYmVscycgLypjYXNlICdNZXJnZUxhYmVscycqLzogYnJlYWs7XG5cdFx0XHRcdFx0Y2FzZSAnZGVmYXVsdHZlcnNpb24nIC8qY2FzZSAnRGVmYXVsdFZlcnNpb24nKi86IGJyZWFrO1xuXHRcdFx0XHRcdGNhc2UgJ3JlZnJlc2huYW1lJyAvKmNhc2UgJ1JlZnJlc2hOYW1lJyovOiBicmVhaztcblx0XHRcdFx0XHRjYXNlICdyZWZyZXNoZGF0ZScgLypjYXNlICdSZWZyZXNoRGF0ZScqLzogYnJlYWs7XG5cdFx0XHRcdFx0Y2FzZSAncmVmcmVzaGRhdGVjb3B5JyAvKmNhc2UgJ1JlZnJlc2hEYXRlQ29weScqLzogYnJlYWs7XG5cdFx0XHRcdFx0Y2FzZSAndmVyc2lvbmxhc3RyZWZyZXNoJyAvKmNhc2UgJ1ZlcnNpb25MYXN0UmVmcmVzaCcqLzogYnJlYWs7XG5cdFx0XHRcdFx0Y2FzZSAndmVyc2lvbmxhc3R1cGRhdGUnIC8qY2FzZSAnVmVyc2lvbkxhc3RVcGRhdGUnKi86IGJyZWFrO1xuXHRcdFx0XHRcdGNhc2UgJ3ZlcnNpb251cGRhdGVhYmxlbWluJyAvKmNhc2UgJ1ZlcnNpb25VcGRhdGVhYmxlTWluJyovOiBicmVhaztcblx0XHRcdFx0XHRjYXNlICd2ZXJzaW9ucmVmcmVzaGFibGVtaW4nIC8qY2FzZSAnVmVyc2lvblJlZnJlc2hhYmxlTWluJyovOiBicmVhaztcblx0XHRcdFx0XHRjYXNlICdjYWxjdWxhdGlvbicgLypjYXNlICdDYWxjdWxhdGlvbicqLzogYnJlYWs7XG5cdFx0XHRcdFx0ZGVmYXVsdDogc2VlbiA9IGZhbHNlO1xuXHRcdFx0XHR9IGJyZWFrO1xuXG5cdFx0XHRcdC8qIFBhZ2VCcmVha3MgKi9cblx0XHRcdFx0Y2FzZSAncGFnZWJyZWFrcycgLypjYXNlICdQYWdlQnJlYWtzJyovOiBzd2l0Y2goUm5bM10pIHtcblx0XHRcdFx0XHRjYXNlICdjb2xicmVha3MnIC8qY2FzZSAnQ29sQnJlYWtzJyovOiBicmVhaztcblx0XHRcdFx0XHRjYXNlICdjb2xicmVhaycgLypjYXNlICdDb2xCcmVhaycqLzogYnJlYWs7XG5cdFx0XHRcdFx0Y2FzZSAncm93YnJlYWtzJyAvKmNhc2UgJ1Jvd0JyZWFrcycqLzogYnJlYWs7XG5cdFx0XHRcdFx0Y2FzZSAncm93YnJlYWsnIC8qY2FzZSAnUm93QnJlYWsnKi86IGJyZWFrO1xuXHRcdFx0XHRcdGNhc2UgJ2NvbHN0YXJ0JyAvKmNhc2UgJ0NvbFN0YXJ0JyovOiBicmVhaztcblx0XHRcdFx0XHRjYXNlICdjb2xlbmQnIC8qY2FzZSAnQ29sRW5kJyovOiBicmVhaztcblx0XHRcdFx0XHRjYXNlICdyb3dlbmQnIC8qY2FzZSAnUm93RW5kJyovOiBicmVhaztcblx0XHRcdFx0XHRkZWZhdWx0OiBzZWVuID0gZmFsc2U7XG5cdFx0XHRcdH0gYnJlYWs7XG5cblx0XHRcdFx0LyogQXV0b0ZpbHRlciAqL1xuXHRcdFx0XHRjYXNlICdhdXRvZmlsdGVyJyAvKmNhc2UgJ0F1dG9GaWx0ZXInKi86IHN3aXRjaChSblszXSkge1xuXHRcdFx0XHRcdGNhc2UgJ2F1dG9maWx0ZXJjb2x1bW4nIC8qY2FzZSAnQXV0b0ZpbHRlckNvbHVtbicqLzogYnJlYWs7XG5cdFx0XHRcdFx0Y2FzZSAnYXV0b2ZpbHRlcmNvbmRpdGlvbicgLypjYXNlICdBdXRvRmlsdGVyQ29uZGl0aW9uJyovOiBicmVhaztcblx0XHRcdFx0XHRjYXNlICdhdXRvZmlsdGVyYW5kJyAvKmNhc2UgJ0F1dG9GaWx0ZXJBbmQnKi86IGJyZWFrO1xuXHRcdFx0XHRcdGNhc2UgJ2F1dG9maWx0ZXJvcicgLypjYXNlICdBdXRvRmlsdGVyT3InKi86IGJyZWFrO1xuXHRcdFx0XHRcdGRlZmF1bHQ6IHNlZW4gPSBmYWxzZTtcblx0XHRcdFx0fSBicmVhaztcblxuXHRcdFx0XHQvKiBRdWVyeVRhYmxlICovXG5cdFx0XHRcdGNhc2UgJ3F1ZXJ5dGFibGUnIC8qY2FzZSAnUXVlcnlUYWJsZScqLzogc3dpdGNoKFJuWzNdKSB7XG5cdFx0XHRcdFx0Y2FzZSAnaWQnIC8qY2FzZSAnSWQnKi86IGJyZWFrO1xuXHRcdFx0XHRcdGNhc2UgJ2F1dG9mb3JtYXRmb250JyAvKmNhc2UgJ0F1dG9Gb3JtYXRGb250JyovOiBicmVhaztcblx0XHRcdFx0XHRjYXNlICdhdXRvZm9ybWF0cGF0dGVybicgLypjYXNlICdBdXRvRm9ybWF0UGF0dGVybicqLzogYnJlYWs7XG5cdFx0XHRcdFx0Y2FzZSAncXVlcnlzb3VyY2UnIC8qY2FzZSAnUXVlcnlTb3VyY2UnKi86IGJyZWFrO1xuXHRcdFx0XHRcdGNhc2UgJ3F1ZXJ5dHlwZScgLypjYXNlICdRdWVyeVR5cGUnKi86IGJyZWFrO1xuXHRcdFx0XHRcdGNhc2UgJ2VuYWJsZXJlZGlyZWN0aW9ucycgLypjYXNlICdFbmFibGVSZWRpcmVjdGlvbnMnKi86IGJyZWFrO1xuXHRcdFx0XHRcdGNhc2UgJ3JlZnJlc2hlZGlueGw5JyAvKmNhc2UgJ1JlZnJlc2hlZEluWGw5JyovOiBicmVhaztcblx0XHRcdFx0XHRjYXNlICd1cmxzdHJpbmcnIC8qY2FzZSAnVVJMU3RyaW5nJyovOiBicmVhaztcblx0XHRcdFx0XHRjYXNlICdodG1sdGFibGVzJyAvKmNhc2UgJ0hUTUxUYWJsZXMnKi86IGJyZWFrO1xuXHRcdFx0XHRcdGNhc2UgJ2Nvbm5lY3Rpb24nIC8qY2FzZSAnQ29ubmVjdGlvbicqLzogYnJlYWs7XG5cdFx0XHRcdFx0Y2FzZSAnY29tbWFuZHRleHQnIC8qY2FzZSAnQ29tbWFuZFRleHQnKi86IGJyZWFrO1xuXHRcdFx0XHRcdGNhc2UgJ3JlZnJlc2hpbmZvJyAvKmNhc2UgJ1JlZnJlc2hJbmZvJyovOiBicmVhaztcblx0XHRcdFx0XHRjYXNlICdub3RpdGxlcycgLypjYXNlICdOb1RpdGxlcycqLzogYnJlYWs7XG5cdFx0XHRcdFx0Y2FzZSAnbmV4dGlkJyAvKmNhc2UgJ05leHRJZCcqLzogYnJlYWs7XG5cdFx0XHRcdFx0Y2FzZSAnY29sdW1uaW5mbycgLypjYXNlICdDb2x1bW5JbmZvJyovOiBicmVhaztcblx0XHRcdFx0XHRjYXNlICdvdmVyd3JpdGVjZWxscycgLypjYXNlICdPdmVyd3JpdGVDZWxscycqLzogYnJlYWs7XG5cdFx0XHRcdFx0Y2FzZSAnZG9ub3Rwcm9tcHRmb3JmaWxlJyAvKmNhc2UgJ0RvTm90UHJvbXB0Rm9yRmlsZScqLzogYnJlYWs7XG5cdFx0XHRcdFx0Y2FzZSAndGV4dHdpemFyZHNldHRpbmdzJyAvKmNhc2UgJ1RleHRXaXphcmRTZXR0aW5ncycqLzogYnJlYWs7XG5cdFx0XHRcdFx0Y2FzZSAnc291cmNlJyAvKmNhc2UgJ1NvdXJjZScqLzogYnJlYWs7XG5cdFx0XHRcdFx0Y2FzZSAnbnVtYmVyJyAvKmNhc2UgJ051bWJlcicqLzogYnJlYWs7XG5cdFx0XHRcdFx0Y2FzZSAnZGVjaW1hbCcgLypjYXNlICdEZWNpbWFsJyovOiBicmVhaztcblx0XHRcdFx0XHRjYXNlICd0aG91c2FuZHNlcGFyYXRvcicgLypjYXNlICdUaG91c2FuZFNlcGFyYXRvcicqLzogYnJlYWs7XG5cdFx0XHRcdFx0Y2FzZSAndHJhaWxpbmdtaW51c251bWJlcnMnIC8qY2FzZSAnVHJhaWxpbmdNaW51c051bWJlcnMnKi86IGJyZWFrO1xuXHRcdFx0XHRcdGNhc2UgJ2Zvcm1hdHNldHRpbmdzJyAvKmNhc2UgJ0Zvcm1hdFNldHRpbmdzJyovOiBicmVhaztcblx0XHRcdFx0XHRjYXNlICdmaWVsZHR5cGUnIC8qY2FzZSAnRmllbGRUeXBlJyovOiBicmVhaztcblx0XHRcdFx0XHRjYXNlICdkZWxpbWl0ZXJzJyAvKmNhc2UgJ0RlbGltaXRlcnMnKi86IGJyZWFrO1xuXHRcdFx0XHRcdGNhc2UgJ3RhYicgLypjYXNlICdUYWInKi86IGJyZWFrO1xuXHRcdFx0XHRcdGNhc2UgJ2NvbW1hJyAvKmNhc2UgJ0NvbW1hJyovOiBicmVhaztcblx0XHRcdFx0XHRjYXNlICdhdXRvZm9ybWF0bmFtZScgLypjYXNlICdBdXRvRm9ybWF0TmFtZScqLzogYnJlYWs7XG5cdFx0XHRcdFx0Y2FzZSAndmVyc2lvbmxhc3RlZGl0JyAvKmNhc2UgJ1ZlcnNpb25MYXN0RWRpdCcqLzogYnJlYWs7XG5cdFx0XHRcdFx0Y2FzZSAndmVyc2lvbmxhc3RyZWZyZXNoJyAvKmNhc2UgJ1ZlcnNpb25MYXN0UmVmcmVzaCcqLzogYnJlYWs7XG5cdFx0XHRcdFx0ZGVmYXVsdDogc2VlbiA9IGZhbHNlO1xuXHRcdFx0XHR9IGJyZWFrO1xuXG5cdFx0XHRcdGNhc2UgJ2RhdGF2YWxpZGF0aW9uJyAvKmNhc2UgJ0RhdGFWYWxpZGF0aW9uJyovOlxuXHRcdFx0XHRzd2l0Y2goUm5bM10pIHtcblx0XHRcdFx0XHRjYXNlICdyYW5nZScgLypjYXNlICdSYW5nZScqLzogYnJlYWs7XG5cblx0XHRcdFx0XHRjYXNlICd0eXBlJyAvKmNhc2UgJ1R5cGUnKi86IGJyZWFrO1xuXHRcdFx0XHRcdGNhc2UgJ21pbicgLypjYXNlICdNaW4nKi86IGJyZWFrO1xuXHRcdFx0XHRcdGNhc2UgJ21heCcgLypjYXNlICdNYXgnKi86IGJyZWFrO1xuXHRcdFx0XHRcdGNhc2UgJ3NvcnQnIC8qY2FzZSAnU29ydCcqLzogYnJlYWs7XG5cdFx0XHRcdFx0Y2FzZSAnZGVzY2VuZGluZycgLypjYXNlICdEZXNjZW5kaW5nJyovOiBicmVhaztcblx0XHRcdFx0XHRjYXNlICdvcmRlcicgLypjYXNlICdPcmRlcicqLzogYnJlYWs7XG5cdFx0XHRcdFx0Y2FzZSAnY2FzZXNlbnNpdGl2ZScgLypjYXNlICdDYXNlU2Vuc2l0aXZlJyovOiBicmVhaztcblx0XHRcdFx0XHRjYXNlICd2YWx1ZScgLypjYXNlICdWYWx1ZScqLzogYnJlYWs7XG5cdFx0XHRcdFx0Y2FzZSAnZXJyb3JzdHlsZScgLypjYXNlICdFcnJvclN0eWxlJyovOiBicmVhaztcblx0XHRcdFx0XHRjYXNlICdlcnJvcm1lc3NhZ2UnIC8qY2FzZSAnRXJyb3JNZXNzYWdlJyovOiBicmVhaztcblx0XHRcdFx0XHRjYXNlICdlcnJvcnRpdGxlJyAvKmNhc2UgJ0Vycm9yVGl0bGUnKi86IGJyZWFrO1xuXHRcdFx0XHRcdGNhc2UgJ2lucHV0bWVzc2FnZScgLypjYXNlICdJbnB1dE1lc3NhZ2UnKi86IGJyZWFrO1xuXHRcdFx0XHRcdGNhc2UgJ2lucHV0dGl0bGUnIC8qY2FzZSAnSW5wdXRUaXRsZScqLzogYnJlYWs7XG5cdFx0XHRcdFx0Y2FzZSAnY29tYm9oaWRlJyAvKmNhc2UgJ0NvbWJvSGlkZScqLzogYnJlYWs7XG5cdFx0XHRcdFx0Y2FzZSAnaW5wdXRoaWRlJyAvKmNhc2UgJ0lucHV0SGlkZScqLzogYnJlYWs7XG5cdFx0XHRcdFx0Y2FzZSAnY29uZGl0aW9uJyAvKmNhc2UgJ0NvbmRpdGlvbicqLzogYnJlYWs7XG5cdFx0XHRcdFx0Y2FzZSAncXVhbGlmaWVyJyAvKmNhc2UgJ1F1YWxpZmllcicqLzogYnJlYWs7XG5cdFx0XHRcdFx0Y2FzZSAndXNlYmxhbmsnIC8qY2FzZSAnVXNlQmxhbmsnKi86IGJyZWFrO1xuXHRcdFx0XHRcdGNhc2UgJ3ZhbHVlMScgLypjYXNlICdWYWx1ZTEnKi86IGJyZWFrO1xuXHRcdFx0XHRcdGNhc2UgJ3ZhbHVlMicgLypjYXNlICdWYWx1ZTInKi86IGJyZWFrO1xuXHRcdFx0XHRcdGNhc2UgJ2Zvcm1hdCcgLypjYXNlICdGb3JtYXQnKi86IGJyZWFrO1xuXG5cdFx0XHRcdFx0Y2FzZSAnY2VsbHJhbmdlbGlzdCcgLypjYXNlICdDZWxsUmFuZ2VMaXN0JyovOiBicmVhaztcblx0XHRcdFx0XHRkZWZhdWx0OiBzZWVuID0gZmFsc2U7XG5cdFx0XHRcdH0gYnJlYWs7XG5cblx0XHRcdFx0Y2FzZSAnc29ydGluZycgLypjYXNlICdTb3J0aW5nJyovOlxuXHRcdFx0XHRjYXNlICdjb25kaXRpb25hbGZvcm1hdHRpbmcnIC8qY2FzZSAnQ29uZGl0aW9uYWxGb3JtYXR0aW5nJyovOlxuXHRcdFx0XHRzd2l0Y2goUm5bM10pIHtcblx0XHRcdFx0XHRjYXNlICdyYW5nZScgLypjYXNlICdSYW5nZScqLzogYnJlYWs7XG5cdFx0XHRcdFx0Y2FzZSAndHlwZScgLypjYXNlICdUeXBlJyovOiBicmVhaztcblx0XHRcdFx0XHRjYXNlICdtaW4nIC8qY2FzZSAnTWluJyovOiBicmVhaztcblx0XHRcdFx0XHRjYXNlICdtYXgnIC8qY2FzZSAnTWF4JyovOiBicmVhaztcblx0XHRcdFx0XHRjYXNlICdzb3J0JyAvKmNhc2UgJ1NvcnQnKi86IGJyZWFrO1xuXHRcdFx0XHRcdGNhc2UgJ2Rlc2NlbmRpbmcnIC8qY2FzZSAnRGVzY2VuZGluZycqLzogYnJlYWs7XG5cdFx0XHRcdFx0Y2FzZSAnb3JkZXInIC8qY2FzZSAnT3JkZXInKi86IGJyZWFrO1xuXHRcdFx0XHRcdGNhc2UgJ2Nhc2VzZW5zaXRpdmUnIC8qY2FzZSAnQ2FzZVNlbnNpdGl2ZScqLzogYnJlYWs7XG5cdFx0XHRcdFx0Y2FzZSAndmFsdWUnIC8qY2FzZSAnVmFsdWUnKi86IGJyZWFrO1xuXHRcdFx0XHRcdGNhc2UgJ2Vycm9yc3R5bGUnIC8qY2FzZSAnRXJyb3JTdHlsZScqLzogYnJlYWs7XG5cdFx0XHRcdFx0Y2FzZSAnZXJyb3JtZXNzYWdlJyAvKmNhc2UgJ0Vycm9yTWVzc2FnZScqLzogYnJlYWs7XG5cdFx0XHRcdFx0Y2FzZSAnZXJyb3J0aXRsZScgLypjYXNlICdFcnJvclRpdGxlJyovOiBicmVhaztcblx0XHRcdFx0XHRjYXNlICdjZWxscmFuZ2VsaXN0JyAvKmNhc2UgJ0NlbGxSYW5nZUxpc3QnKi86IGJyZWFrO1xuXHRcdFx0XHRcdGNhc2UgJ2lucHV0bWVzc2FnZScgLypjYXNlICdJbnB1dE1lc3NhZ2UnKi86IGJyZWFrO1xuXHRcdFx0XHRcdGNhc2UgJ2lucHV0dGl0bGUnIC8qY2FzZSAnSW5wdXRUaXRsZScqLzogYnJlYWs7XG5cdFx0XHRcdFx0Y2FzZSAnY29tYm9oaWRlJyAvKmNhc2UgJ0NvbWJvSGlkZScqLzogYnJlYWs7XG5cdFx0XHRcdFx0Y2FzZSAnaW5wdXRoaWRlJyAvKmNhc2UgJ0lucHV0SGlkZScqLzogYnJlYWs7XG5cdFx0XHRcdFx0Y2FzZSAnY29uZGl0aW9uJyAvKmNhc2UgJ0NvbmRpdGlvbicqLzogYnJlYWs7XG5cdFx0XHRcdFx0Y2FzZSAncXVhbGlmaWVyJyAvKmNhc2UgJ1F1YWxpZmllcicqLzogYnJlYWs7XG5cdFx0XHRcdFx0Y2FzZSAndXNlYmxhbmsnIC8qY2FzZSAnVXNlQmxhbmsnKi86IGJyZWFrO1xuXHRcdFx0XHRcdGNhc2UgJ3ZhbHVlMScgLypjYXNlICdWYWx1ZTEnKi86IGJyZWFrO1xuXHRcdFx0XHRcdGNhc2UgJ3ZhbHVlMicgLypjYXNlICdWYWx1ZTInKi86IGJyZWFrO1xuXHRcdFx0XHRcdGNhc2UgJ2Zvcm1hdCcgLypjYXNlICdGb3JtYXQnKi86IGJyZWFrO1xuXHRcdFx0XHRcdGRlZmF1bHQ6IHNlZW4gPSBmYWxzZTtcblx0XHRcdFx0fSBicmVhaztcblxuXHRcdFx0XHQvKiBNYXBJbmZvIChzY2hlbWEpICovXG5cdFx0XHRcdGNhc2UgJ21hcGluZm8nIC8qY2FzZSAnTWFwSW5mbycqLzogY2FzZSAnc2NoZW1hJyAvKmNhc2UgJ1NjaGVtYScqLzogY2FzZSAnZGF0YScgLypjYXNlICdkYXRhJyovOiBzd2l0Y2goUm5bM10pIHtcblx0XHRcdFx0XHRjYXNlICdtYXAnIC8qY2FzZSAnTWFwJyovOiBicmVhaztcblx0XHRcdFx0XHRjYXNlICdlbnRyeScgLypjYXNlICdFbnRyeScqLzogYnJlYWs7XG5cdFx0XHRcdFx0Y2FzZSAncmFuZ2UnIC8qY2FzZSAnUmFuZ2UnKi86IGJyZWFrO1xuXHRcdFx0XHRcdGNhc2UgJ3hwYXRoJyAvKmNhc2UgJ1hQYXRoJyovOiBicmVhaztcblx0XHRcdFx0XHRjYXNlICdmaWVsZCcgLypjYXNlICdGaWVsZCcqLzogYnJlYWs7XG5cdFx0XHRcdFx0Y2FzZSAneHNkdHlwZScgLypjYXNlICdYU0RUeXBlJyovOiBicmVhaztcblx0XHRcdFx0XHRjYXNlICdmaWx0ZXJvbicgLypjYXNlICdGaWx0ZXJPbicqLzogYnJlYWs7XG5cdFx0XHRcdFx0Y2FzZSAnYWdncmVnYXRlJyAvKmNhc2UgJ0FnZ3JlZ2F0ZScqLzogYnJlYWs7XG5cdFx0XHRcdFx0Y2FzZSAnZWxlbWVudHR5cGUnIC8qY2FzZSAnRWxlbWVudFR5cGUnKi86IGJyZWFrO1xuXHRcdFx0XHRcdGNhc2UgJ2F0dHJpYnV0ZXR5cGUnIC8qY2FzZSAnQXR0cmlidXRlVHlwZScqLzogYnJlYWs7XG5cdFx0XHRcdC8qIFRoZXNlIGFyZSBmcm9tIHhzZCAoWE1MIFNjaGVtYSBEZWZpbml0aW9uKSAqL1xuXHRcdFx0XHRcdGNhc2UgJ3NjaGVtYScgLypjYXNlICdzY2hlbWEnKi86XG5cdFx0XHRcdFx0Y2FzZSAnZWxlbWVudCcgLypjYXNlICdlbGVtZW50JyovOlxuXHRcdFx0XHRcdGNhc2UgJ2NvbXBsZXh0eXBlJyAvKmNhc2UgJ2NvbXBsZXhUeXBlJyovOlxuXHRcdFx0XHRcdGNhc2UgJ2RhdGF0eXBlJyAvKmNhc2UgJ2RhdGF0eXBlJyovOlxuXHRcdFx0XHRcdGNhc2UgJ2FsbCcgLypjYXNlICdhbGwnKi86XG5cdFx0XHRcdFx0Y2FzZSAnYXR0cmlidXRlJyAvKmNhc2UgJ2F0dHJpYnV0ZScqLzpcblx0XHRcdFx0XHRjYXNlICdleHRlbmRzJyAvKmNhc2UgJ2V4dGVuZHMnKi86IGJyZWFrO1xuXG5cdFx0XHRcdFx0Y2FzZSAncm93JyAvKmNhc2UgJ3JvdycqLzogYnJlYWs7XG5cdFx0XHRcdFx0ZGVmYXVsdDogc2VlbiA9IGZhbHNlO1xuXHRcdFx0XHR9IGJyZWFrO1xuXG5cdFx0XHRcdC8qIFNtYXJ0VGFncyAoY2FuIGJlIGFueXRoaW5nKSAqL1xuXHRcdFx0XHRjYXNlICdzbWFydHRhZ3MnIC8qY2FzZSAnU21hcnRUYWdzJyovOiBicmVhaztcblxuXHRcdFx0XHRkZWZhdWx0OiBzZWVuID0gZmFsc2U7IGJyZWFrO1xuXHRcdFx0fVxuXHRcdFx0aWYoc2VlbikgYnJlYWs7XG5cdFx0XHQvKiBDdXN0b21Eb2N1bWVudFByb3BlcnRpZXMgKi9cblx0XHRcdGlmKFJuWzNdLm1hdGNoKC8hXFxbQ0RBVEEvKSkgYnJlYWs7XG5cdFx0XHRpZighc3RhdGVbc3RhdGUubGVuZ3RoLTFdWzFdKSB0aHJvdyAnVW5yZWNvZ25pemVkIHRhZzogJyArIFJuWzNdICsgXCJ8XCIgKyBzdGF0ZS5qb2luKFwifFwiKTtcblx0XHRcdGlmKHN0YXRlW3N0YXRlLmxlbmd0aC0xXVswXT09PS8qJ0N1c3RvbURvY3VtZW50UHJvcGVydGllcycqLydjdXN0b21kb2N1bWVudHByb3BlcnRpZXMnKSB7XG5cdFx0XHRcdGlmKFJuWzBdLnNsaWNlKC0yKSA9PT0gXCIvPlwiKSBicmVhaztcblx0XHRcdFx0ZWxzZSBpZihSblsxXT09PVwiL1wiKSB4bG1sX3NldF9jdXN0cHJvcChDdXN0cHJvcHMsIHJhd19SbjMsIGNwLCBzdHIuc2xpY2UocGlkeCwgUm4uaW5kZXgpKTtcblx0XHRcdFx0ZWxzZSB7IGNwID0gUm47IHBpZHggPSBSbi5pbmRleCArIFJuWzBdLmxlbmd0aDsgfVxuXHRcdFx0XHRicmVhaztcblx0XHRcdH1cblx0XHRcdGlmKG9wdHMuV1RGKSB0aHJvdyAnVW5yZWNvZ25pemVkIHRhZzogJyArIFJuWzNdICsgXCJ8XCIgKyBzdGF0ZS5qb2luKFwifFwiKTtcblx0fVxuXHR2YXIgb3V0ID0gKHt9KTtcblx0aWYoIW9wdHMuYm9va1NoZWV0cyAmJiAhb3B0cy5ib29rUHJvcHMpIG91dC5TaGVldHMgPSBzaGVldHM7XG5cdG91dC5TaGVldE5hbWVzID0gc2hlZXRuYW1lcztcblx0b3V0Lldvcmtib29rID0gV29ya2Jvb2s7XG5cdG91dC5TU0YgPSBTU0YuZ2V0X3RhYmxlKCk7XG5cdG91dC5Qcm9wcyA9IFByb3BzO1xuXHRvdXQuQ3VzdHByb3BzID0gQ3VzdHByb3BzO1xuXHRyZXR1cm4gb3V0O1xufVxuXG5mdW5jdGlvbiBwYXJzZV94bG1sKGRhdGEsIG9wdHMpIHtcblx0Zml4X3JlYWRfb3B0cyhvcHRzPW9wdHN8fHt9KTtcblx0c3dpdGNoKG9wdHMudHlwZXx8XCJiYXNlNjRcIikge1xuXHRcdGNhc2UgXCJiYXNlNjRcIjogcmV0dXJuIHBhcnNlX3hsbWxfeG1sKEJhc2U2NC5kZWNvZGUoZGF0YSksIG9wdHMpO1xuXHRcdGNhc2UgXCJiaW5hcnlcIjogY2FzZSBcImJ1ZmZlclwiOiBjYXNlIFwiZmlsZVwiOiByZXR1cm4gcGFyc2VfeGxtbF94bWwoZGF0YSwgb3B0cyk7XG5cdFx0Y2FzZSBcImFycmF5XCI6IHJldHVybiBwYXJzZV94bG1sX3htbChhMnMoZGF0YSksIG9wdHMpO1xuXHR9XG59XG5cbi8qIFRPRE8gKi9cbmZ1bmN0aW9uIHdyaXRlX3Byb3BzX3hsbWwod2IsIG9wdHMpIHtcblx0dmFyIG8gPSBbXTtcblx0LyogRG9jdW1lbnRQcm9wZXJ0aWVzICovXG5cdGlmKHdiLlByb3BzKSBvLnB1c2goeGxtbF93cml0ZV9kb2Nwcm9wcyh3Yi5Qcm9wcywgb3B0cykpO1xuXHQvKiBDdXN0b21Eb2N1bWVudFByb3BlcnRpZXMgKi9cblx0aWYod2IuQ3VzdHByb3BzKSBvLnB1c2goeGxtbF93cml0ZV9jdXN0cHJvcHMod2IuUHJvcHMsIHdiLkN1c3Rwcm9wcywgb3B0cykpO1xuXHRyZXR1cm4gby5qb2luKFwiXCIpO1xufVxuLyogVE9ETyAqL1xuZnVuY3Rpb24gd3JpdGVfd2JfeGxtbCgpIHtcblx0LyogT2ZmaWNlRG9jdW1lbnRTZXR0aW5ncyAqL1xuXHQvKiBFeGNlbFdvcmtib29rICovXG5cdHJldHVybiBcIlwiO1xufVxuLyogVE9ETyAqL1xuZnVuY3Rpb24gd3JpdGVfc3R5X3hsbWwod2IsIG9wdHMpIHtcblx0LyogU3R5bGVzICovXG5cdHZhciBzdHlsZXMgPSBbJzxTdHlsZSBzczpJRD1cIkRlZmF1bHRcIiBzczpOYW1lPVwiTm9ybWFsXCI+PE51bWJlckZvcm1hdC8+PC9TdHlsZT4nXTtcblx0b3B0cy5jZWxsWGZzLmZvckVhY2goZnVuY3Rpb24oeGYsIGlkKSB7XG5cdFx0dmFyIHBheWxvYWQgPSBbXTtcblx0XHRwYXlsb2FkLnB1c2god3JpdGV4dGFnKCdOdW1iZXJGb3JtYXQnLCBudWxsLCB7XCJzczpGb3JtYXRcIjogZXNjYXBleG1sKFNTRi5fdGFibGVbeGYubnVtRm10SWRdKX0pKTtcblxuXHRcdHZhciBvID0ge1wic3M6SURcIjogXCJzXCIgKyAoMjEraWQpfTtcblx0XHRzdHlsZXMucHVzaCh3cml0ZXh0YWcoJ1N0eWxlJywgcGF5bG9hZC5qb2luKFwiXCIpLCBvKSk7XG5cdH0pO1xuXHRyZXR1cm4gd3JpdGV4dGFnKFwiU3R5bGVzXCIsIHN0eWxlcy5qb2luKFwiXCIpKTtcbn1cbmZ1bmN0aW9uIHdyaXRlX25hbWVfeGxtbChuKSB7IHJldHVybiB3cml0ZXh0YWcoXCJOYW1lZFJhbmdlXCIsIG51bGwsIHtcInNzOk5hbWVcIjogbi5OYW1lLCBcInNzOlJlZmVyc1RvXCI6XCI9XCIgKyBhMV90b19yYyhuLlJlZiwge3I6MCxjOjB9KX0pOyB9XG5mdW5jdGlvbiB3cml0ZV9uYW1lc194bG1sKHdiKSB7XG5cdGlmKCEoKHdifHx7fSkuV29ya2Jvb2t8fHt9KS5OYW1lcykgcmV0dXJuIFwiXCI7XG52YXIgbmFtZXMgPSB3Yi5Xb3JrYm9vay5OYW1lcztcblx0dmFyIG91dCA9IFtdO1xuXHRmb3IodmFyIGkgPSAwOyBpIDwgbmFtZXMubGVuZ3RoOyArK2kpIHtcblx0XHR2YXIgbiA9IG5hbWVzW2ldO1xuXHRcdGlmKG4uU2hlZXQgIT0gbnVsbCkgY29udGludWU7XG5cdFx0aWYobi5OYW1lLm1hdGNoKC9eX3hsZm5cXC4vKSkgY29udGludWU7XG5cdFx0b3V0LnB1c2god3JpdGVfbmFtZV94bG1sKG4pKTtcblx0fVxuXHRyZXR1cm4gd3JpdGV4dGFnKFwiTmFtZXNcIiwgb3V0LmpvaW4oXCJcIikpO1xufVxuZnVuY3Rpb24gd3JpdGVfd3NfeGxtbF9uYW1lcyh3cywgb3B0cywgaWR4LCB3Yikge1xuXHRpZighd3MpIHJldHVybiBcIlwiO1xuXHRpZighKCh3Ynx8e30pLldvcmtib29rfHx7fSkuTmFtZXMpIHJldHVybiBcIlwiO1xudmFyIG5hbWVzID0gd2IuV29ya2Jvb2suTmFtZXM7XG5cdHZhciBvdXQgPSBbXTtcblx0Zm9yKHZhciBpID0gMDsgaSA8IG5hbWVzLmxlbmd0aDsgKytpKSB7XG5cdFx0dmFyIG4gPSBuYW1lc1tpXTtcblx0XHRpZihuLlNoZWV0ICE9IGlkeCkgY29udGludWU7XG5cdFx0Lypzd2l0Y2gobi5OYW1lKSB7XG5cdFx0XHRjYXNlIFwiX1wiOiBjb250aW51ZTtcblx0XHR9Ki9cblx0XHRpZihuLk5hbWUubWF0Y2goL15feGxmblxcLi8pKSBjb250aW51ZTtcblx0XHRvdXQucHVzaCh3cml0ZV9uYW1lX3hsbWwobikpO1xuXHR9XG5cdHJldHVybiBvdXQuam9pbihcIlwiKTtcbn1cbi8qIFdvcmtzaGVldE9wdGlvbnMgKi9cbmZ1bmN0aW9uIHdyaXRlX3dzX3hsbWxfd3NvcHRzKHdzLCBvcHRzLCBpZHgsIHdiKSB7XG5cdGlmKCF3cykgcmV0dXJuIFwiXCI7XG5cdHZhciBvID0gW107XG5cdC8qIE5PVEU6IHNwZWMgdGVjaG5pY2FsbHkgYWxsb3dzIGFueSBvcmRlciwgYnV0IHN0aWNrIHdpdGggaW1wbGllZCBvcmRlciAqL1xuXG5cdC8qIEZpdFRvUGFnZSAqL1xuXHQvKiBEb05vdERpc3BsYXlDb2xIZWFkZXJzICovXG5cdC8qIERvTm90RGlzcGxheVJvd0hlYWRlcnMgKi9cblx0LyogVmlld2FibGVSYW5nZSAqL1xuXHQvKiBTZWxlY3Rpb24gKi9cblx0LyogR3JpZGxpbmVDb2xvciAqL1xuXHQvKiBOYW1lICovXG5cdC8qIEV4Y2VsV29ya3NoZWV0VHlwZSAqL1xuXHQvKiBJbnRsTWFjcm8gKi9cblx0LyogVW5zeW5jZWQgKi9cblx0LyogU2VsZWN0ZWQgKi9cblx0LyogQ29kZU5hbWUgKi9cblxuXHRpZih3c1snIW1hcmdpbnMnXSkge1xuXHRcdG8ucHVzaChcIjxQYWdlU2V0dXA+XCIpO1xuXHRcdGlmKHdzWychbWFyZ2lucyddLmhlYWRlcikgby5wdXNoKHdyaXRleHRhZyhcIkhlYWRlclwiLCBudWxsLCB7J3g6TWFyZ2luJzp3c1snIW1hcmdpbnMnXS5oZWFkZXJ9KSk7XG5cdFx0aWYod3NbJyFtYXJnaW5zJ10uZm9vdGVyKSBvLnB1c2god3JpdGV4dGFnKFwiRm9vdGVyXCIsIG51bGwsIHsneDpNYXJnaW4nOndzWychbWFyZ2lucyddLmZvb3Rlcn0pKTtcblx0XHRvLnB1c2god3JpdGV4dGFnKFwiUGFnZU1hcmdpbnNcIiwgbnVsbCwge1xuXHRcdFx0J3g6Qm90dG9tJzogd3NbJyFtYXJnaW5zJ10uYm90dG9tIHx8IFwiMC43NVwiLFxuXHRcdFx0J3g6TGVmdCc6IHdzWychbWFyZ2lucyddLmxlZnQgfHwgXCIwLjdcIixcblx0XHRcdCd4OlJpZ2h0Jzogd3NbJyFtYXJnaW5zJ10ucmlnaHQgfHwgXCIwLjdcIixcblx0XHRcdCd4OlRvcCc6IHdzWychbWFyZ2lucyddLnRvcCB8fCBcIjAuNzVcIlxuXHRcdH0pKTtcblx0XHRvLnB1c2goXCI8L1BhZ2VTZXR1cD5cIik7XG5cdH1cblxuXHQvKiBQYWdlU2V0dXAgKi9cblx0LyogRGlzcGxheVBhZ2VCcmVhayAqL1xuXHQvKiBUcmFuc2l0aW9uRXhwcmVzc2lvbkV2YWx1YXRpb24gKi9cblx0LyogVHJhbnNpdGlvbkZvcm11bGFFbnRyeSAqL1xuXHQvKiBQcmludCAqL1xuXHQvKiBab29tICovXG5cdC8qIFBhZ2VMYXlvdXRab29tICovXG5cdC8qIFBhZ2VCcmVha1pvb20gKi9cblx0LyogU2hvd1BhZ2VCcmVha1pvb20gKi9cblx0LyogRGVmYXVsdFJvd0hlaWdodCAqL1xuXHQvKiBEZWZhdWx0Q29sdW1uV2lkdGggKi9cblx0LyogU3RhbmRhcmRXaWR0aCAqL1xuXG5cdGlmKHdiICYmIHdiLldvcmtib29rICYmIHdiLldvcmtib29rLlNoZWV0cyAmJiB3Yi5Xb3JrYm9vay5TaGVldHNbaWR4XSkge1xuXHRcdC8qIFZpc2libGUgKi9cblx0XHRpZih3Yi5Xb3JrYm9vay5TaGVldHNbaWR4XS5IaWRkZW4pIG8ucHVzaCh3cml0ZXh0YWcoXCJWaXNpYmxlXCIsICh3Yi5Xb3JrYm9vay5TaGVldHNbaWR4XS5IaWRkZW4gPT0gMSA/IFwiU2hlZXRIaWRkZW5cIiA6IFwiU2hlZXRWZXJ5SGlkZGVuXCIpLCB7fSkpO1xuXHRcdGVsc2Uge1xuXHRcdFx0LyogU2VsZWN0ZWQgKi9cblx0XHRcdGZvcih2YXIgaSA9IDA7IGkgPCBpZHg7ICsraSkgaWYod2IuV29ya2Jvb2suU2hlZXRzW2ldICYmICF3Yi5Xb3JrYm9vay5TaGVldHNbaV0uSGlkZGVuKSBicmVhaztcblx0XHRcdGlmKGkgPT0gaWR4KSBvLnB1c2goXCI8U2VsZWN0ZWQvPlwiKTtcblx0XHR9XG5cdH1cblxuXHQvKiBMZWZ0Q29sdW1uVmlzaWJsZSAqL1xuXG5cdGlmKCgoKCh3Ynx8e30pLldvcmtib29rfHx7fSkuVmlld3N8fFtdKVswXXx8e30pLlJUTCkgby5wdXNoKFwiPERpc3BsYXlSaWdodFRvTGVmdC8+XCIpO1xuXG5cdC8qIEdyaWRsaW5lQ29sb3JJbmRleCAqL1xuXHQvKiBEaXNwbGF5Rm9ybXVsYXMgKi9cblx0LyogRG9Ob3REaXNwbGF5R3JpZGxpbmVzICovXG5cdC8qIERvTm90RGlzcGxheUhlYWRpbmdzICovXG5cdC8qIERvTm90RGlzcGxheU91dGxpbmUgKi9cblx0LyogQXBwbHlBdXRvbWF0aWNPdXRsaW5lU3R5bGVzICovXG5cdC8qIE5vU3VtbWFyeVJvd3NCZWxvd0RldGFpbCAqL1xuXHQvKiBOb1N1bW1hcnlDb2x1bW5zUmlnaHREZXRhaWwgKi9cblx0LyogRG9Ob3REaXNwbGF5WmVyb3MgKi9cblx0LyogQWN0aXZlUm93ICovXG5cdC8qIEFjdGl2ZUNvbHVtbiAqL1xuXHQvKiBGaWx0ZXJPbiAqL1xuXHQvKiBSYW5nZVNlbGVjdGlvbiAqL1xuXHQvKiBUb3BSb3dWaXNpYmxlICovXG5cdC8qIFRvcFJvd0JvdHRvbVBhbmUgKi9cblx0LyogTGVmdENvbHVtblJpZ2h0UGFuZSAqL1xuXHQvKiBBY3RpdmVQYW5lICovXG5cdC8qIFNwbGl0SG9yaXpvbnRhbCAqL1xuXHQvKiBTcGxpdFZlcnRpY2FsICovXG5cdC8qIEZyZWV6ZVBhbmVzICovXG5cdC8qIEZyb3plbk5vU3BsaXQgKi9cblx0LyogVGFiQ29sb3JJbmRleCAqL1xuXHQvKiBQYW5lcyAqL1xuXG5cdC8qIE5PVEU6IFBhc3N3b3JkIG5vdCBzdXBwb3J0ZWQgaW4gWExNTCBGb3JtYXQgKi9cblx0aWYod3NbJyFwcm90ZWN0J10pIHtcblx0XHRvLnB1c2god3JpdGV0YWcoXCJQcm90ZWN0Q29udGVudHNcIiwgXCJUcnVlXCIpKTtcblx0XHRpZih3c1snIXByb3RlY3QnXS5vYmplY3RzKSBvLnB1c2god3JpdGV0YWcoXCJQcm90ZWN0T2JqZWN0c1wiLCBcIlRydWVcIikpO1xuXHRcdGlmKHdzWychcHJvdGVjdCddLnNjZW5hcmlvcykgby5wdXNoKHdyaXRldGFnKFwiUHJvdGVjdFNjZW5hcmlvc1wiLCBcIlRydWVcIikpO1xuXHRcdGlmKHdzWychcHJvdGVjdCddLnNlbGVjdExvY2tlZENlbGxzICE9IG51bGwgJiYgIXdzWychcHJvdGVjdCddLnNlbGVjdExvY2tlZENlbGxzKSBvLnB1c2god3JpdGV0YWcoXCJFbmFibGVTZWxlY3Rpb25cIiwgXCJOb1NlbGVjdGlvblwiKSk7XG5cdFx0ZWxzZSBpZih3c1snIXByb3RlY3QnXS5zZWxlY3RVbmxvY2tlZENlbGxzICE9IG51bGwgJiYgIXdzWychcHJvdGVjdCddLnNlbGVjdFVubG9ja2VkQ2VsbHMpIG8ucHVzaCh3cml0ZXRhZyhcIkVuYWJsZVNlbGVjdGlvblwiLCBcIlVubG9ja2VkQ2VsbHNcIikpO1xuXHRbXG5cdFx0WyBcImZvcm1hdENlbGxzXCIsIFwiQWxsb3dGb3JtYXRDZWxsc1wiIF0sXG5cdFx0WyBcImZvcm1hdENvbHVtbnNcIiwgXCJBbGxvd1NpemVDb2xzXCIgXSxcblx0XHRbIFwiZm9ybWF0Um93c1wiLCBcIkFsbG93U2l6ZVJvd3NcIiBdLFxuXHRcdFsgXCJpbnNlcnRDb2x1bW5zXCIsIFwiQWxsb3dJbnNlcnRDb2xzXCIgXSxcblx0XHRbIFwiaW5zZXJ0Um93c1wiLCBcIkFsbG93SW5zZXJ0Um93c1wiIF0sXG5cdFx0WyBcImluc2VydEh5cGVybGlua3NcIiwgXCJBbGxvd0luc2VydEh5cGVybGlua3NcIiBdLFxuXHRcdFsgXCJkZWxldGVDb2x1bW5zXCIsIFwiQWxsb3dEZWxldGVDb2xzXCIgXSxcblx0XHRbIFwiZGVsZXRlUm93c1wiLCBcIkFsbG93RGVsZXRlUm93c1wiIF0sXG5cdFx0WyBcInNvcnRcIiwgXCJBbGxvd1NvcnRcIiBdLFxuXHRcdFsgXCJhdXRvRmlsdGVyXCIsIFwiQWxsb3dGaWx0ZXJcIiBdLFxuXHRcdFsgXCJwaXZvdFRhYmxlc1wiLCBcIkFsbG93VXNlUGl2b3RUYWJsZXNcIiBdXG5cdF0uZm9yRWFjaChmdW5jdGlvbih4KSB7IGlmKHdzWychcHJvdGVjdCddW3hbMF1dKSBvLnB1c2goXCI8XCIreFsxXStcIi8+XCIpOyB9KTtcblx0fVxuXG5cdGlmKG8ubGVuZ3RoID09IDApIHJldHVybiBcIlwiO1xuXHRyZXR1cm4gd3JpdGV4dGFnKFwiV29ya3NoZWV0T3B0aW9uc1wiLCBvLmpvaW4oXCJcIiksIHt4bWxuczpYTE1MTlMueH0pO1xufVxuZnVuY3Rpb24gd3JpdGVfd3NfeGxtbF9jb21tZW50KGNvbW1lbnRzKSB7XG5cdHJldHVybiBjb21tZW50cy5tYXAoZnVuY3Rpb24oYykge1xuXHRcdC8vIFRPRE86IGZvcm1hdHRlZCB0ZXh0XG5cdFx0dmFyIHQgPSB4bG1sX3VuZml4c3RyKGMudHx8XCJcIik7XG5cdFx0dmFyIGQgPXdyaXRleHRhZyhcInNzOkRhdGFcIiwgdCwge1wieG1sbnNcIjpcImh0dHA6Ly93d3cudzMub3JnL1RSL1JFQy1odG1sNDBcIn0pO1xuXHRcdHJldHVybiB3cml0ZXh0YWcoXCJDb21tZW50XCIsIGQsIHtcInNzOkF1dGhvclwiOmMuYX0pO1xuXHR9KS5qb2luKFwiXCIpO1xufVxuZnVuY3Rpb24gd3JpdGVfd3NfeGxtbF9jZWxsKGNlbGwsIHJlZiwgd3MsIG9wdHMsIGlkeCwgd2IsIGFkZHIpe1xuXHRpZighY2VsbCB8fCAoY2VsbC52ID09IHVuZGVmaW5lZCAmJiBjZWxsLmYgPT0gdW5kZWZpbmVkKSkgcmV0dXJuIFwiXCI7XG5cblx0dmFyIGF0dHIgPSB7fTtcblx0aWYoY2VsbC5mKSBhdHRyW1wic3M6Rm9ybXVsYVwiXSA9IFwiPVwiICsgZXNjYXBleG1sKGExX3RvX3JjKGNlbGwuZiwgYWRkcikpO1xuXHRpZihjZWxsLkYgJiYgY2VsbC5GLnNsaWNlKDAsIHJlZi5sZW5ndGgpID09IHJlZikge1xuXHRcdHZhciBlbmQgPSBkZWNvZGVfY2VsbChjZWxsLkYuc2xpY2UocmVmLmxlbmd0aCArIDEpKTtcblx0XHRhdHRyW1wic3M6QXJyYXlSYW5nZVwiXSA9IFwiUkM6UlwiICsgKGVuZC5yID09IGFkZHIuciA/IFwiXCIgOiBcIltcIiArIChlbmQuciAtIGFkZHIucikgKyBcIl1cIikgKyBcIkNcIiArIChlbmQuYyA9PSBhZGRyLmMgPyBcIlwiIDogXCJbXCIgKyAoZW5kLmMgLSBhZGRyLmMpICsgXCJdXCIpO1xuXHR9XG5cblx0aWYoY2VsbC5sICYmIGNlbGwubC5UYXJnZXQpIHtcblx0XHRhdHRyW1wic3M6SFJlZlwiXSA9IGVzY2FwZXhtbChjZWxsLmwuVGFyZ2V0KTtcblx0XHRpZihjZWxsLmwuVG9vbHRpcCkgYXR0cltcIng6SFJlZlNjcmVlblRpcFwiXSA9IGVzY2FwZXhtbChjZWxsLmwuVG9vbHRpcCk7XG5cdH1cblxuXHRpZih3c1snIW1lcmdlcyddKSB7XG5cdFx0dmFyIG1hcnIgPSB3c1snIW1lcmdlcyddO1xuXHRcdGZvcih2YXIgbWkgPSAwOyBtaSAhPSBtYXJyLmxlbmd0aDsgKyttaSkge1xuXHRcdFx0aWYobWFyclttaV0ucy5jICE9IGFkZHIuYyB8fCBtYXJyW21pXS5zLnIgIT0gYWRkci5yKSBjb250aW51ZTtcblx0XHRcdGlmKG1hcnJbbWldLmUuYyA+IG1hcnJbbWldLnMuYykgYXR0clsnc3M6TWVyZ2VBY3Jvc3MnXSA9IG1hcnJbbWldLmUuYyAtIG1hcnJbbWldLnMuYztcblx0XHRcdGlmKG1hcnJbbWldLmUuciA+IG1hcnJbbWldLnMucikgYXR0clsnc3M6TWVyZ2VEb3duJ10gPSBtYXJyW21pXS5lLnIgLSBtYXJyW21pXS5zLnI7XG5cdFx0fVxuXHR9XG5cblx0dmFyIHQgPSBcIlwiLCBwID0gXCJcIjtcblx0c3dpdGNoKGNlbGwudCkge1xuXHRcdGNhc2UgJ3onOiBpZighb3B0cy5zaGVldFN0dWJzKSByZXR1cm4gXCJcIjsgYnJlYWs7XG5cdFx0Y2FzZSAnbic6IHQgPSAnTnVtYmVyJzsgcCA9IFN0cmluZyhjZWxsLnYpOyBicmVhaztcblx0XHRjYXNlICdiJzogdCA9ICdCb29sZWFuJzsgcCA9IChjZWxsLnYgPyBcIjFcIiA6IFwiMFwiKTsgYnJlYWs7XG5cdFx0Y2FzZSAnZSc6IHQgPSAnRXJyb3InOyBwID0gQkVycltjZWxsLnZdOyBicmVhaztcblx0XHRjYXNlICdkJzogdCA9ICdEYXRlVGltZSc7IHAgPSBuZXcgRGF0ZShjZWxsLnYpLnRvSVNPU3RyaW5nKCk7IGlmKGNlbGwueiA9PSBudWxsKSBjZWxsLnogPSBjZWxsLnogfHwgU1NGLl90YWJsZVsxNF07IGJyZWFrO1xuXHRcdGNhc2UgJ3MnOiB0ID0gJ1N0cmluZyc7IHAgPSBlc2NhcGV4bG1sKGNlbGwudnx8XCJcIik7IGJyZWFrO1xuXHR9XG5cdC8qIFRPRE86IGNlbGwgc3R5bGUgKi9cblx0dmFyIG9zID0gZ2V0X2NlbGxfc3R5bGUob3B0cy5jZWxsWGZzLCBjZWxsLCBvcHRzKTtcblx0YXR0cltcInNzOlN0eWxlSURcIl0gPSBcInNcIiArICgyMStvcyk7XG5cdGF0dHJbXCJzczpJbmRleFwiXSA9IGFkZHIuYyArIDE7XG5cdHZhciBfdiA9IChjZWxsLnYgIT0gbnVsbCA/IHAgOiBcIlwiKTtcblx0dmFyIG0gPSBjZWxsLnQgPT0gJ3onID8gXCJcIiA6ICgnPERhdGEgc3M6VHlwZT1cIicgKyB0ICsgJ1wiPicgKyBfdiArICc8L0RhdGE+Jyk7XG5cblx0aWYoKGNlbGwuY3x8W10pLmxlbmd0aCA+IDApIG0gKz0gd3JpdGVfd3NfeGxtbF9jb21tZW50KGNlbGwuYyk7XG5cblx0cmV0dXJuIHdyaXRleHRhZyhcIkNlbGxcIiwgbSwgYXR0cik7XG59XG5mdW5jdGlvbiB3cml0ZV93c194bG1sX3JvdyhSLCByb3cpIHtcblx0dmFyIG8gPSAnPFJvdyBzczpJbmRleD1cIicgKyAoUisxKSArICdcIic7XG5cdGlmKHJvdykge1xuXHRcdGlmKHJvdy5ocHQgJiYgIXJvdy5ocHgpIHJvdy5ocHggPSBwdDJweChyb3cuaHB0KTtcblx0XHRpZihyb3cuaHB4KSBvICs9ICcgc3M6QXV0b0ZpdEhlaWdodD1cIjBcIiBzczpIZWlnaHQ9XCInICsgcm93LmhweCArICdcIic7XG5cdFx0aWYocm93LmhpZGRlbikgbyArPSAnIHNzOkhpZGRlbj1cIjFcIic7XG5cdH1cblx0cmV0dXJuIG8gKyAnPic7XG59XG4vKiBUT0RPICovXG5mdW5jdGlvbiB3cml0ZV93c194bG1sX3RhYmxlKHdzLCBvcHRzLCBpZHgsIHdiKSB7XG5cdGlmKCF3c1snIXJlZiddKSByZXR1cm4gXCJcIjtcblx0dmFyIHJhbmdlID0gc2FmZV9kZWNvZGVfcmFuZ2Uod3NbJyFyZWYnXSk7XG5cdHZhciBtYXJyID0gd3NbJyFtZXJnZXMnXSB8fCBbXSwgbWkgPSAwO1xuXHR2YXIgbyA9IFtdO1xuXHRpZih3c1snIWNvbHMnXSkgd3NbJyFjb2xzJ10uZm9yRWFjaChmdW5jdGlvbihuLCBpKSB7XG5cdFx0cHJvY2Vzc19jb2wobik7XG5cdFx0dmFyIHcgPSAhIW4ud2lkdGg7XG5cdFx0dmFyIHAgPSBjb2xfb2JqX3coaSwgbik7XG5cdFx0dmFyIGsgPSB7XCJzczpJbmRleFwiOmkrMX07XG5cdFx0aWYodykga1snc3M6V2lkdGgnXSA9IHdpZHRoMnB4KHAud2lkdGgpO1xuXHRcdGlmKG4uaGlkZGVuKSBrWydzczpIaWRkZW4nXT1cIjFcIjtcblx0XHRvLnB1c2god3JpdGV4dGFnKFwiQ29sdW1uXCIsbnVsbCxrKSk7XG5cdH0pO1xuXHR2YXIgZGVuc2UgPSBBcnJheS5pc0FycmF5KHdzKTtcblx0Zm9yKHZhciBSID0gcmFuZ2Uucy5yOyBSIDw9IHJhbmdlLmUucjsgKytSKSB7XG5cdFx0dmFyIHJvdyA9IFt3cml0ZV93c194bG1sX3JvdyhSLCAod3NbJyFyb3dzJ118fFtdKVtSXSldO1xuXHRcdGZvcih2YXIgQyA9IHJhbmdlLnMuYzsgQyA8PSByYW5nZS5lLmM7ICsrQykge1xuXHRcdFx0dmFyIHNraXAgPSBmYWxzZTtcblx0XHRcdGZvcihtaSA9IDA7IG1pICE9IG1hcnIubGVuZ3RoOyArK21pKSB7XG5cdFx0XHRcdGlmKG1hcnJbbWldLnMuYyA+IEMpIGNvbnRpbnVlO1xuXHRcdFx0XHRpZihtYXJyW21pXS5zLnIgPiBSKSBjb250aW51ZTtcblx0XHRcdFx0aWYobWFyclttaV0uZS5jIDwgQykgY29udGludWU7XG5cdFx0XHRcdGlmKG1hcnJbbWldLmUuciA8IFIpIGNvbnRpbnVlO1xuXHRcdFx0XHRpZihtYXJyW21pXS5zLmMgIT0gQyB8fCBtYXJyW21pXS5zLnIgIT0gUikgc2tpcCA9IHRydWU7XG5cdFx0XHRcdGJyZWFrO1xuXHRcdFx0fVxuXHRcdFx0aWYoc2tpcCkgY29udGludWU7XG5cdFx0XHR2YXIgYWRkciA9IHtyOlIsYzpDfTtcblx0XHRcdHZhciByZWYgPSBlbmNvZGVfY2VsbChhZGRyKSwgY2VsbCA9IGRlbnNlID8gKHdzW1JdfHxbXSlbQ10gOiB3c1tyZWZdO1xuXHRcdFx0cm93LnB1c2god3JpdGVfd3NfeGxtbF9jZWxsKGNlbGwsIHJlZiwgd3MsIG9wdHMsIGlkeCwgd2IsIGFkZHIpKTtcblx0XHR9XG5cdFx0cm93LnB1c2goXCI8L1Jvdz5cIik7XG5cdFx0aWYocm93Lmxlbmd0aCA+IDIpIG8ucHVzaChyb3cuam9pbihcIlwiKSk7XG5cdH1cblx0cmV0dXJuIG8uam9pbihcIlwiKTtcbn1cbmZ1bmN0aW9uIHdyaXRlX3dzX3hsbWwoaWR4LCBvcHRzLCB3Yikge1xuXHR2YXIgbyA9IFtdO1xuXHR2YXIgcyA9IHdiLlNoZWV0TmFtZXNbaWR4XTtcblx0dmFyIHdzID0gd2IuU2hlZXRzW3NdO1xuXG5cdHZhciB0ID0gd3MgPyB3cml0ZV93c194bG1sX25hbWVzKHdzLCBvcHRzLCBpZHgsIHdiKSA6IFwiXCI7XG5cdGlmKHQubGVuZ3RoID4gMCkgby5wdXNoKFwiPE5hbWVzPlwiICsgdCArIFwiPC9OYW1lcz5cIik7XG5cblx0LyogVGFibGUgKi9cblx0dCA9IHdzID8gd3JpdGVfd3NfeGxtbF90YWJsZSh3cywgb3B0cywgaWR4LCB3YikgOiBcIlwiO1xuXHRpZih0Lmxlbmd0aCA+IDApIG8ucHVzaChcIjxUYWJsZT5cIiArIHQgKyBcIjwvVGFibGU+XCIpO1xuXG5cdC8qIFdvcmtzaGVldE9wdGlvbnMgKi9cblx0by5wdXNoKHdyaXRlX3dzX3hsbWxfd3NvcHRzKHdzLCBvcHRzLCBpZHgsIHdiKSk7XG5cblx0cmV0dXJuIG8uam9pbihcIlwiKTtcbn1cbmZ1bmN0aW9uIHdyaXRlX3hsbWwod2IsIG9wdHMpIHtcblx0aWYoIW9wdHMpIG9wdHMgPSB7fTtcblx0aWYoIXdiLlNTRikgd2IuU1NGID0gU1NGLmdldF90YWJsZSgpO1xuXHRpZih3Yi5TU0YpIHtcblx0XHRtYWtlX3NzZihTU0YpOyBTU0YubG9hZF90YWJsZSh3Yi5TU0YpO1xuXHRcdC8vICRGbG93SWdub3JlXG5cdFx0b3B0cy5yZXZzc2YgPSBldmVydF9udW0od2IuU1NGKTsgb3B0cy5yZXZzc2Zbd2IuU1NGWzY1NTM1XV0gPSAwO1xuXHRcdG9wdHMuc3NmID0gd2IuU1NGO1xuXHRcdG9wdHMuY2VsbFhmcyA9IFtdO1xuXHRcdGdldF9jZWxsX3N0eWxlKG9wdHMuY2VsbFhmcywge30sIHtyZXZzc2Y6e1wiR2VuZXJhbFwiOjB9fSk7XG5cdH1cblx0dmFyIGQgPSBbXTtcblx0ZC5wdXNoKHdyaXRlX3Byb3BzX3hsbWwod2IsIG9wdHMpKTtcblx0ZC5wdXNoKHdyaXRlX3diX3hsbWwod2IsIG9wdHMpKTtcblx0ZC5wdXNoKFwiXCIpO1xuXHRkLnB1c2goXCJcIik7XG5cdGZvcih2YXIgaSA9IDA7IGkgPCB3Yi5TaGVldE5hbWVzLmxlbmd0aDsgKytpKVxuXHRcdGQucHVzaCh3cml0ZXh0YWcoXCJXb3Jrc2hlZXRcIiwgd3JpdGVfd3NfeGxtbChpLCBvcHRzLCB3YiksIHtcInNzOk5hbWVcIjplc2NhcGV4bWwod2IuU2hlZXROYW1lc1tpXSl9KSk7XG5cdGRbMl0gPSB3cml0ZV9zdHlfeGxtbCh3Yiwgb3B0cyk7XG5cdGRbM10gPSB3cml0ZV9uYW1lc194bG1sKHdiLCBvcHRzKTtcblx0cmV0dXJuIFhNTF9IRUFERVIgKyB3cml0ZXh0YWcoXCJXb3JrYm9va1wiLCBkLmpvaW4oXCJcIiksIHtcblx0XHQneG1sbnMnOiAgICAgIFhMTUxOUy5zcyxcblx0XHQneG1sbnM6byc6ICAgIFhMTUxOUy5vLFxuXHRcdCd4bWxuczp4JzogICAgWExNTE5TLngsXG5cdFx0J3htbG5zOnNzJzogICBYTE1MTlMuc3MsXG5cdFx0J3htbG5zOmR0JzogICBYTE1MTlMuZHQsXG5cdFx0J3htbG5zOmh0bWwnOiBYTE1MTlMuaHRtbFxuXHR9KTtcbn1cbi8qIFtNUy1PTEVEU10gMi4zLjggQ29tcE9ialN0cmVhbSAqL1xuZnVuY3Rpb24gcGFyc2VfY29tcG9iaihvYmopIHtcblx0dmFyIHYgPSB7fTtcblx0dmFyIG8gPSBvYmouY29udGVudDtcbi8qIFtNUy1PTEVEU10gMi4zLjcgQ29tcE9iakhlYWRlciAtLSBBbGwgZmllbGRzIE1VU1QgYmUgaWdub3JlZCAqL1xuXHRvLmwgPSAyODtcblxuXHR2LkFuc2lVc2VyVHlwZSA9IG8ucmVhZF9zaGlmdCgwLCBcImxwc3RyLWFuc2lcIik7XG5cdHYuQW5zaUNsaXBib2FyZEZvcm1hdCA9IHBhcnNlX0NsaXBib2FyZEZvcm1hdE9yQW5zaVN0cmluZyhvKTtcblxuXHRpZihvLmxlbmd0aCAtIG8ubCA8PSA0KSByZXR1cm4gdjtcblxuXHR2YXIgbSA9IG8ucmVhZF9zaGlmdCg0KTtcblx0aWYobSA9PSAwIHx8IG0gPiA0MCkgcmV0dXJuIHY7XG5cdG8ubC09NDsgdi5SZXNlcnZlZDEgPSBvLnJlYWRfc2hpZnQoMCwgXCJscHN0ci1hbnNpXCIpO1xuXG5cdGlmKG8ubGVuZ3RoIC0gby5sIDw9IDQpIHJldHVybiB2O1xuXHRtID0gby5yZWFkX3NoaWZ0KDQpO1xuXHRpZihtICE9PSAweDcxYjIzOWY0KSByZXR1cm4gdjtcblx0di5Vbmljb2RlQ2xpcGJvYXJkRm9ybWF0ID0gcGFyc2VfQ2xpcGJvYXJkRm9ybWF0T3JVbmljb2RlU3RyaW5nKG8pO1xuXG5cdG0gPSBvLnJlYWRfc2hpZnQoNCk7XG5cdGlmKG0gPT0gMCB8fCBtID4gNDApIHJldHVybiB2O1xuXHRvLmwtPTQ7IHYuUmVzZXJ2ZWQyID0gby5yZWFkX3NoaWZ0KDAsIFwibHB3c3RyXCIpO1xufVxuXG4vKlxuXHRDb250aW51ZSBsb2dpYyBmb3I6XG5cdC0gMi40LjU4IENvbnRpbnVlXG5cdC0gMi40LjU5IENvbnRpbnVlQmlnTmFtZVxuXHQtIDIuNC42MCBDb250aW51ZUZydFxuXHQtIDIuNC42MSBDb250aW51ZUZydDExXG5cdC0gMi40LjYyIENvbnRpbnVlRnJ0MTJcbiovXG5mdW5jdGlvbiBzbHVycChSLCBibG9iLCBsZW5ndGgsIG9wdHMpIHtcblx0dmFyIGwgPSBsZW5ndGg7XG5cdHZhciBidWZzID0gW107XG5cdHZhciBkID0gYmxvYi5zbGljZShibG9iLmwsYmxvYi5sK2wpO1xuXHRpZihvcHRzICYmIG9wdHMuZW5jICYmIG9wdHMuZW5jLmluc2l0dSAmJiBkLmxlbmd0aCA+IDApIHN3aXRjaChSLm4pIHtcblx0Y2FzZSAnQk9GJzogY2FzZSAnRmlsZVBhc3MnOiBjYXNlICdGaWxlTG9jayc6IGNhc2UgJ0ludGVyZmFjZUhkcic6IGNhc2UgJ1JSREluZm8nOiBjYXNlICdSUkRIZWFkJzogY2FzZSAnVXNyRXhjbCc6IGNhc2UgJ0VPRic6XG5cdFx0YnJlYWs7XG5cdGNhc2UgJ0JvdW5kU2hlZXQ4Jzpcblx0XHRicmVhaztcblx0ZGVmYXVsdDpcblx0XHRvcHRzLmVuYy5pbnNpdHUoZCk7XG5cdH1cblx0YnVmcy5wdXNoKGQpO1xuXHRibG9iLmwgKz0gbDtcblx0dmFyIG5leHQgPSAoWExTUmVjb3JkRW51bVtfX3JlYWRVSW50MTZMRShibG9iLGJsb2IubCldKTtcblx0dmFyIHN0YXJ0ID0gMDtcblx0d2hpbGUobmV4dCAhPSBudWxsICYmIG5leHQubi5zbGljZSgwLDgpID09PSAnQ29udGludWUnKSB7XG5cdFx0bCA9IF9fcmVhZFVJbnQxNkxFKGJsb2IsYmxvYi5sKzIpO1xuXHRcdHN0YXJ0ID0gYmxvYi5sICsgNDtcblx0XHRpZihuZXh0Lm4gPT0gJ0NvbnRpbnVlRnJ0Jykgc3RhcnQgKz0gNDtcblx0XHRlbHNlIGlmKG5leHQubi5zbGljZSgwLDExKSA9PSAnQ29udGludWVGcnQnKSB7XG5cdFx0XHRzdGFydCArPSAxMjtcblx0XHR9XG5cdFx0ZCA9IGJsb2Iuc2xpY2Uoc3RhcnQsYmxvYi5sKzQrbCk7XG5cdFx0YnVmcy5wdXNoKGQpO1xuXHRcdGJsb2IubCArPSA0K2w7XG5cdFx0bmV4dCA9IChYTFNSZWNvcmRFbnVtW19fcmVhZFVJbnQxNkxFKGJsb2IsIGJsb2IubCldKTtcblx0fVxuXHR2YXIgYiA9IChiY29uY2F0KGJ1ZnMpKTtcblx0cHJlcF9ibG9iKGIsIDApO1xuXHR2YXIgbGwgPSAwOyBiLmxlbnMgPSBbXTtcblx0Zm9yKHZhciBqID0gMDsgaiA8IGJ1ZnMubGVuZ3RoOyArK2opIHsgYi5sZW5zLnB1c2gobGwpOyBsbCArPSBidWZzW2pdLmxlbmd0aDsgfVxuXHRpZihiLmxlbmd0aCA8IGxlbmd0aCkgdGhyb3cgXCJYTFMgUmVjb3JkIFwiICsgKFIgJiYgUi5uIHx8IFwiPz9cIikgKyBcIiBUcnVuY2F0ZWQ6IFwiICsgYi5sZW5ndGggKyBcIiA8IFwiICsgbGVuZ3RoO1xuXHRyZXR1cm4gUi5mKGIsIGIubGVuZ3RoLCBvcHRzKTtcbn1cblxuZnVuY3Rpb24gc2FmZV9mb3JtYXRfeGYocCwgb3B0cywgZGF0ZTE5MDQpIHtcblx0aWYocC50ID09PSAneicpIHJldHVybjtcblx0aWYoIXAuWEYpIHJldHVybjtcblx0dmFyIGZtdGlkID0gMDtcblx0dHJ5IHtcblx0XHRmbXRpZCA9IHAueiB8fCBwLlhGLm51bUZtdElkIHx8IDA7XG5cdFx0aWYob3B0cy5jZWxsTkYpIHAueiA9IFNTRi5fdGFibGVbZm10aWRdO1xuXHR9IGNhdGNoKGUpIHsgaWYob3B0cy5XVEYpIHRocm93IGU7IH1cblx0aWYoIW9wdHMgfHwgb3B0cy5jZWxsVGV4dCAhPT0gZmFsc2UpIHRyeSB7XG5cdFx0aWYocC50ID09PSAnZScpIHsgcC53ID0gcC53IHx8IEJFcnJbcC52XTsgfVxuXHRcdGVsc2UgaWYoZm10aWQgPT09IDAgfHwgZm10aWQgPT0gXCJHZW5lcmFsXCIpIHtcblx0XHRcdGlmKHAudCA9PT0gJ24nKSB7XG5cdFx0XHRcdGlmKChwLnZ8MCkgPT09IHAudikgcC53ID0gU1NGLl9nZW5lcmFsX2ludChwLnYpO1xuXHRcdFx0XHRlbHNlIHAudyA9IFNTRi5fZ2VuZXJhbF9udW0ocC52KTtcblx0XHRcdH1cblx0XHRcdGVsc2UgcC53ID0gU1NGLl9nZW5lcmFsKHAudik7XG5cdFx0fVxuXHRcdGVsc2UgcC53ID0gU1NGLmZvcm1hdChmbXRpZCxwLnYsIHtkYXRlMTkwNDohIWRhdGUxOTA0fSk7XG5cdH0gY2F0Y2goZSkgeyBpZihvcHRzLldURikgdGhyb3cgZTsgfVxuXHRpZihvcHRzLmNlbGxEYXRlcyAmJiBmbXRpZCAmJiBwLnQgPT0gJ24nICYmIFNTRi5pc19kYXRlKFNTRi5fdGFibGVbZm10aWRdIHx8IFN0cmluZyhmbXRpZCkpKSB7XG5cdFx0dmFyIF9kID0gU1NGLnBhcnNlX2RhdGVfY29kZShwLnYpOyBpZihfZCkgeyBwLnQgPSAnZCc7IHAudiA9IG5ldyBEYXRlKF9kLnksIF9kLm0tMSxfZC5kLF9kLkgsX2QuTSxfZC5TLF9kLnUpOyB9XG5cdH1cbn1cblxuZnVuY3Rpb24gbWFrZV9jZWxsKHZhbCwgaXhmZSwgdCkge1xuXHRyZXR1cm4gKHt2OnZhbCwgaXhmZTppeGZlLCB0OnR9KTtcbn1cblxuLy8gMi4zLjJcbmZ1bmN0aW9uIHBhcnNlX3dvcmtib29rKGJsb2IsIG9wdGlvbnMpIHtcblx0dmFyIHdiID0gKHtvcHRzOnt9fSk7XG5cdHZhciBTaGVldHMgPSB7fTtcblx0aWYoREVOU0UgIT0gbnVsbCAmJiBvcHRpb25zLmRlbnNlID09IG51bGwpIG9wdGlvbnMuZGVuc2UgPSBERU5TRTtcblx0dmFyIG91dCA9ICgob3B0aW9ucy5kZW5zZSA/IFtdIDoge30pKTtcblx0dmFyIERpcmVjdG9yeSA9IHt9O1xuXHR2YXIgcmFuZ2UgPSAoe30pO1xuXHR2YXIgbGFzdF9mb3JtdWxhID0gbnVsbDtcblx0dmFyIHNzdCA9IChbXSk7XG5cdHZhciBjdXJfc2hlZXQgPSBcIlwiO1xuXHR2YXIgUHJlYW1ibGUgPSB7fTtcblx0dmFyIGxhc3RjZWxsLCBsYXN0X2NlbGwgPSBcIlwiLCBjYywgY21udCwgcm5nQywgcm5nUjtcblx0dmFyIHNoYXJlZGYgPSB7fTtcblx0dmFyIGFycmF5ZiA9IFtdO1xuXHR2YXIgdGVtcF92YWw7XG5cdHZhciBjb3VudHJ5O1xuXHR2YXIgY2VsbF92YWxpZCA9IHRydWU7XG5cdHZhciBYRnMgPSBbXTsgLyogWEYgcmVjb3JkcyAqL1xuXHR2YXIgcGFsZXR0ZSA9IFtdO1xuXHR2YXIgV29ya2Jvb2sgPSAoeyBTaGVldHM6W10sIFdCUHJvcHM6e2RhdGUxOTA0OmZhbHNlfSwgVmlld3M6W3t9XSB9KSwgd3Nwcm9wcyA9IHt9O1xuXHR2YXIgZ2V0X3JnYiA9IGZ1bmN0aW9uIGdldHJnYihpY3YpIHtcblx0XHRpZihpY3YgPCA4KSByZXR1cm4gWExTSWN2W2ljdl07XG5cdFx0aWYoaWN2IDwgNjQpIHJldHVybiBwYWxldHRlW2ljdi04XSB8fCBYTFNJY3ZbaWN2XTtcblx0XHRyZXR1cm4gWExTSWN2W2ljdl07XG5cdH07XG5cdHZhciBwcm9jZXNzX2NlbGxfc3R5bGUgPSBmdW5jdGlvbiBwY3MoY2VsbCwgbGluZSwgb3B0aW9ucykge1xuXHRcdHZhciB4ZmQgPSBsaW5lLlhGLmRhdGE7XG5cdFx0aWYoIXhmZCB8fCAheGZkLnBhdHRlcm5UeXBlIHx8ICFvcHRpb25zIHx8ICFvcHRpb25zLmNlbGxTdHlsZXMpIHJldHVybjtcblx0XHRsaW5lLnMgPSAoe30pO1xuXHRcdGxpbmUucy5wYXR0ZXJuVHlwZSA9IHhmZC5wYXR0ZXJuVHlwZTtcblx0XHR2YXIgdDtcblx0XHRpZigodCA9IHJnYjJIZXgoZ2V0X3JnYih4ZmQuaWN2Rm9yZSkpKSkgeyBsaW5lLnMuZmdDb2xvciA9IHtyZ2I6dH07IH1cblx0XHRpZigodCA9IHJnYjJIZXgoZ2V0X3JnYih4ZmQuaWN2QmFjaykpKSkgeyBsaW5lLnMuYmdDb2xvciA9IHtyZ2I6dH07IH1cblx0fTtcblx0dmFyIGFkZGNlbGwgPSBmdW5jdGlvbiBhZGRjZWxsKGNlbGwsIGxpbmUsIG9wdGlvbnMpIHtcblx0XHRpZihmaWxlX2RlcHRoID4gMSkgcmV0dXJuO1xuXHRcdGlmKG9wdGlvbnMuc2hlZXRSb3dzICYmIGNlbGwuciA+PSBvcHRpb25zLnNoZWV0Um93cykgY2VsbF92YWxpZCA9IGZhbHNlO1xuXHRcdGlmKCFjZWxsX3ZhbGlkKSByZXR1cm47XG5cdFx0aWYob3B0aW9ucy5jZWxsU3R5bGVzICYmIGxpbmUuWEYgJiYgbGluZS5YRi5kYXRhKSBwcm9jZXNzX2NlbGxfc3R5bGUoY2VsbCwgbGluZSwgb3B0aW9ucyk7XG5cdFx0ZGVsZXRlIGxpbmUuaXhmZTsgZGVsZXRlIGxpbmUuWEY7XG5cdFx0bGFzdGNlbGwgPSBjZWxsO1xuXHRcdGxhc3RfY2VsbCA9IGVuY29kZV9jZWxsKGNlbGwpO1xuXHRcdGlmKCFyYW5nZSB8fCAhcmFuZ2UucyB8fCAhcmFuZ2UuZSkgcmFuZ2UgPSB7czp7cjowLGM6MH0sZTp7cjowLGM6MH19O1xuXHRcdGlmKGNlbGwuciA8IHJhbmdlLnMucikgcmFuZ2Uucy5yID0gY2VsbC5yO1xuXHRcdGlmKGNlbGwuYyA8IHJhbmdlLnMuYykgcmFuZ2Uucy5jID0gY2VsbC5jO1xuXHRcdGlmKGNlbGwuciArIDEgPiByYW5nZS5lLnIpIHJhbmdlLmUuciA9IGNlbGwuciArIDE7XG5cdFx0aWYoY2VsbC5jICsgMSA+IHJhbmdlLmUuYykgcmFuZ2UuZS5jID0gY2VsbC5jICsgMTtcblx0XHRpZihvcHRpb25zLmNlbGxGb3JtdWxhICYmIGxpbmUuZikge1xuXHRcdFx0Zm9yKHZhciBhZmkgPSAwOyBhZmkgPCBhcnJheWYubGVuZ3RoOyArK2FmaSkge1xuXHRcdFx0XHRpZihhcnJheWZbYWZpXVswXS5zLmMgPiBjZWxsLmMgfHwgYXJyYXlmW2FmaV1bMF0ucy5yID4gY2VsbC5yKSBjb250aW51ZTtcblx0XHRcdFx0aWYoYXJyYXlmW2FmaV1bMF0uZS5jIDwgY2VsbC5jIHx8IGFycmF5ZlthZmldWzBdLmUuciA8IGNlbGwucikgY29udGludWU7XG5cdFx0XHRcdGxpbmUuRiA9IGVuY29kZV9yYW5nZShhcnJheWZbYWZpXVswXSk7XG5cdFx0XHRcdGlmKGFycmF5ZlthZmldWzBdLnMuYyAhPSBjZWxsLmMgfHwgYXJyYXlmW2FmaV1bMF0ucy5yICE9IGNlbGwucikgZGVsZXRlIGxpbmUuZjtcblx0XHRcdFx0aWYobGluZS5mKSBsaW5lLmYgPSBcIlwiICsgc3RyaW5naWZ5X2Zvcm11bGEoYXJyYXlmW2FmaV1bMV0sIHJhbmdlLCBjZWxsLCBzdXBib29rcywgb3B0cyk7XG5cdFx0XHRcdGJyZWFrO1xuXHRcdFx0fVxuXHRcdH1cblx0XHR7XG5cdFx0XHRpZihvcHRpb25zLmRlbnNlKSB7XG5cdFx0XHRcdGlmKCFvdXRbY2VsbC5yXSkgb3V0W2NlbGwucl0gPSBbXTtcblx0XHRcdFx0b3V0W2NlbGwucl1bY2VsbC5jXSA9IGxpbmU7XG5cdFx0XHR9IGVsc2Ugb3V0W2xhc3RfY2VsbF0gPSBsaW5lO1xuXHRcdH1cblx0fTtcblx0dmFyIG9wdHMgPSAoe1xuXHRcdGVuYzogZmFsc2UsIC8vIGVuY3J5cHRlZFxuXHRcdHNiY2NoOiAwLCAvLyBjY2ggaW4gdGhlIHByZWNlZGluZyBTdXBCb29rXG5cdFx0c25hbWVzOiBbXSwgLy8gc2hlZXRuYW1lc1xuXHRcdHNoYXJlZGY6IHNoYXJlZGYsIC8vIHNoYXJlZCBmb3JtdWxhZSBieSBhZGRyZXNzXG5cdFx0YXJyYXlmOiBhcnJheWYsIC8vIGFycmF5IGZvcm11bGFlIGFycmF5XG5cdFx0cnJ0YWJpZDogW10sIC8vIFJSVGFiSWRcblx0XHRsYXN0dXNlcjogXCJcIiwgLy8gTGFzdCBVc2VyIGZyb20gV3JpdGVBY2Nlc3Ncblx0XHRiaWZmOiA4LCAvLyBCSUZGIHZlcnNpb25cblx0XHRjb2RlcGFnZTogMCwgLy8gQ1AgZnJvbSBDb2RlUGFnZSByZWNvcmRcblx0XHR3aW5sb2NrZWQ6IDAsIC8vIGZMb2NrV24gZnJvbSBXaW5Qcm90ZWN0XG5cdFx0Y2VsbFN0eWxlczogISFvcHRpb25zICYmICEhb3B0aW9ucy5jZWxsU3R5bGVzLFxuXHRcdFdURjogISFvcHRpb25zICYmICEhb3B0aW9ucy53dGZcblx0fSk7XG5cdGlmKG9wdGlvbnMucGFzc3dvcmQpIG9wdHMucGFzc3dvcmQgPSBvcHRpb25zLnBhc3N3b3JkO1xuXHR2YXIgdGhlbWVzO1xuXHR2YXIgbWVyZ2VzID0gW107XG5cdHZhciBvYmplY3RzID0gW107XG5cdHZhciBjb2xpbmZvID0gW10sIHJvd2luZm8gPSBbXTtcblx0Ly8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVudXNlZC12YXJzXG5cdHZhciBkZWZ3aWR0aCA9IDAsIGRlZmhlaWdodCA9IDA7IC8vIHR3aXBzIC8gTURXIHJlc3BlY3RpdmVseVxuXHR2YXIgc2VlbmNvbCA9IGZhbHNlO1xuXHR2YXIgc3VwYm9va3MgPSAoW10pOyAvLyAxLWluZGV4ZWQsIHdpbGwgaG9sZCBleHRlcm4gbmFtZXNcblx0c3VwYm9va3MuU2hlZXROYW1lcyA9IG9wdHMuc25hbWVzO1xuXHRzdXBib29rcy5zaGFyZWRmID0gb3B0cy5zaGFyZWRmO1xuXHRzdXBib29rcy5hcnJheWYgPSBvcHRzLmFycmF5Zjtcblx0c3VwYm9va3MubmFtZXMgPSBbXTtcblx0c3VwYm9va3MuWFRJID0gW107XG5cdHZhciBsYXN0X1JuID0gJyc7XG5cdHZhciBmaWxlX2RlcHRoID0gMDsgLyogVE9ETzogbWFrZSBhIHJlYWwgc3RhY2sgKi9cblx0dmFyIEJJRkYyRm10ID0gMCwgQklGRjJGbXRUYWJsZSA9IFtdO1xuXHR2YXIgRmlsdGVyRGF0YWJhc2VzID0gW107IC8qIFRPRE86IHNvcnQgb3V0IHN1cGJvb2tzIGFuZCBwcm9jZXNzIGVsc2V3aGVyZSAqL1xuXHR2YXIgbGFzdF9sYmw7XG5cblx0LyogZXhwbGljaXQgb3ZlcnJpZGUgZm9yIHNvbWUgYnJva2VuIHdyaXRlcnMgKi9cblx0b3B0cy5jb2RlcGFnZSA9IDEyMDA7XG5cdHNldF9jcCgxMjAwKTtcblx0dmFyIHNlZW5fY29kZXBhZ2UgPSBmYWxzZTtcblx0d2hpbGUoYmxvYi5sIDwgYmxvYi5sZW5ndGggLSAxKSB7XG5cdFx0dmFyIHMgPSBibG9iLmw7XG5cdFx0dmFyIFJlY29yZFR5cGUgPSBibG9iLnJlYWRfc2hpZnQoMik7XG5cdFx0aWYoUmVjb3JkVHlwZSA9PT0gMCAmJiBsYXN0X1JuID09PSAnRU9GJykgYnJlYWs7XG5cdFx0dmFyIGxlbmd0aCA9IChibG9iLmwgPT09IGJsb2IubGVuZ3RoID8gMCA6IGJsb2IucmVhZF9zaGlmdCgyKSk7XG5cdFx0dmFyIFIgPSBYTFNSZWNvcmRFbnVtW1JlY29yZFR5cGVdO1xuXHRcdC8vY29uc29sZS5sb2coUmVjb3JkVHlwZS50b1N0cmluZygxNiksIFJlY29yZFR5cGUsIFIsIGJsb2IubCwgbGVuZ3RoLCBibG9iLmxlbmd0aCk7XG5cdFx0Ly9pZighUikgY29uc29sZS5sb2coYmxvYi5zbGljZShibG9iLmwsIGJsb2IubCArIGxlbmd0aCkpO1xuXHRcdGlmKFIgJiYgUi5mKSB7XG5cdFx0XHRpZihvcHRpb25zLmJvb2tTaGVldHMpIHtcblx0XHRcdFx0aWYobGFzdF9SbiA9PT0gJ0JvdW5kU2hlZXQ4JyAmJiBSLm4gIT09ICdCb3VuZFNoZWV0OCcpIGJyZWFrO1xuXHRcdFx0fVxuXHRcdFx0bGFzdF9SbiA9IFIubjtcblx0XHRcdGlmKFIuciA9PT0gMiB8fCBSLnIgPT0gMTIpIHtcblx0XHRcdFx0dmFyIHJ0ID0gYmxvYi5yZWFkX3NoaWZ0KDIpOyBsZW5ndGggLT0gMjtcblx0XHRcdFx0aWYoIW9wdHMuZW5jICYmIHJ0ICE9PSBSZWNvcmRUeXBlICYmICgoKHJ0JjB4RkYpPDw4KXwocnQ+PjgpKSAhPT0gUmVjb3JkVHlwZSkgdGhyb3cgbmV3IEVycm9yKFwicnQgbWlzbWF0Y2g6IFwiICsgcnQgKyBcIiE9XCIgKyBSZWNvcmRUeXBlKTtcblx0XHRcdFx0aWYoUi5yID09IDEyKXsgYmxvYi5sICs9IDEwOyBsZW5ndGggLT0gMTA7IH0gLy8gc2tpcCBGUlRcblx0XHRcdH1cblx0XHRcdC8vY29uc29sZS5lcnJvcihSLGJsb2IubCxsZW5ndGgsYmxvYi5sZW5ndGgpO1xuXHRcdFx0dmFyIHZhbCA9ICh7fSk7XG5cdFx0XHRpZihSLm4gPT09ICdFT0YnKSB2YWwgPSBSLmYoYmxvYiwgbGVuZ3RoLCBvcHRzKTtcblx0XHRcdGVsc2UgdmFsID0gc2x1cnAoUiwgYmxvYiwgbGVuZ3RoLCBvcHRzKTtcblx0XHRcdHZhciBSbiA9IFIubjtcbmlmKGZpbGVfZGVwdGggPT0gMCAmJiBSbiAhPSAnQk9GJykgY29udGludWU7XG5cdFx0XHQvKiBuZXN0ZWQgc3dpdGNoIHN0YXRlbWVudHMgdG8gd29ya2Fyb3VuZCBWOCAxMjggbGltaXQgKi9cblx0XHRcdHN3aXRjaChSbikge1xuXHRcdFx0XHQvKiBXb3JrYm9vayBPcHRpb25zICovXG5cdFx0XHRcdGNhc2UgJ0RhdGUxOTA0JzpcbndiLm9wdHMuRGF0ZTE5MDQgPSBXb3JrYm9vay5XQlByb3BzLmRhdGUxOTA0ID0gdmFsOyBicmVhaztcblx0XHRcdFx0Y2FzZSAnV3JpdGVQcm90ZWN0Jzogd2Iub3B0cy5Xcml0ZVByb3RlY3QgPSB0cnVlOyBicmVhaztcblx0XHRcdFx0Y2FzZSAnRmlsZVBhc3MnOlxuXHRcdFx0XHRcdGlmKCFvcHRzLmVuYykgYmxvYi5sID0gMDtcblx0XHRcdFx0XHRvcHRzLmVuYyA9IHZhbDtcblx0XHRcdFx0XHRpZighb3B0aW9ucy5wYXNzd29yZCkgdGhyb3cgbmV3IEVycm9yKFwiRmlsZSBpcyBwYXNzd29yZC1wcm90ZWN0ZWRcIik7XG5cdFx0XHRcdFx0aWYodmFsLnZhbGlkID09IG51bGwpIHRocm93IG5ldyBFcnJvcihcIkVuY3J5cHRpb24gc2NoZW1lIHVuc3VwcG9ydGVkXCIpO1xuXHRcdFx0XHRcdGlmKCF2YWwudmFsaWQpIHRocm93IG5ldyBFcnJvcihcIlBhc3N3b3JkIGlzIGluY29ycmVjdFwiKTtcblx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0Y2FzZSAnV3JpdGVBY2Nlc3MnOiBvcHRzLmxhc3R1c2VyID0gdmFsOyBicmVhaztcblx0XHRcdFx0Y2FzZSAnRmlsZVNoYXJpbmcnOiBicmVhazsgLy9UT0RPXG5cdFx0XHRcdGNhc2UgJ0NvZGVQYWdlJzpcblx0XHRcdFx0XHR2YXIgY3B2YWwgPSBOdW1iZXIodmFsKTtcblx0XHRcdFx0XHQvKiBvdmVycmlkZXMgYmFzZWQgb24gdGVzdCBjYXNlcyAqL1xuXHRcdFx0XHRcdHN3aXRjaChjcHZhbCkge1xuXHRcdFx0XHRcdFx0Y2FzZSAweDUyMTI6IGNwdmFsID0gIDEyMDA7IGJyZWFrO1xuXHRcdFx0XHRcdFx0Y2FzZSAweDgwMDA6IGNwdmFsID0gMTAwMDA7IGJyZWFrO1xuXHRcdFx0XHRcdFx0Y2FzZSAweDgwMDE6IGNwdmFsID0gIDEyNTI7IGJyZWFrO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRzZXRfY3Aob3B0cy5jb2RlcGFnZSA9IGNwdmFsKTtcblx0XHRcdFx0XHRzZWVuX2NvZGVwYWdlID0gdHJ1ZTtcblx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0Y2FzZSAnUlJUYWJJZCc6IG9wdHMucnJ0YWJpZCA9IHZhbDsgYnJlYWs7XG5cdFx0XHRcdGNhc2UgJ1dpblByb3RlY3QnOiBvcHRzLndpbmxvY2tlZCA9IHZhbDsgYnJlYWs7XG5cdFx0XHRcdGNhc2UgJ1RlbXBsYXRlJzogYnJlYWs7IC8vIFRPRE9cblx0XHRcdFx0Y2FzZSAnQm9va0Jvb2wnOiBicmVhazsgLy8gVE9ET1xuXHRcdFx0XHRjYXNlICdVc2VzRUxGcyc6IGJyZWFrO1xuXHRcdFx0XHRjYXNlICdNVFJTZXR0aW5ncyc6IGJyZWFrO1xuXHRcdFx0XHRjYXNlICdSZWZyZXNoQWxsJzpcblx0XHRcdFx0Y2FzZSAnQ2FsY0NvdW50Jzpcblx0XHRcdFx0Y2FzZSAnQ2FsY0RlbHRhJzpcblx0XHRcdFx0Y2FzZSAnQ2FsY0l0ZXInOlxuXHRcdFx0XHRjYXNlICdDYWxjTW9kZSc6XG5cdFx0XHRcdGNhc2UgJ0NhbGNQcmVjaXNpb24nOlxuXHRcdFx0XHRjYXNlICdDYWxjU2F2ZVJlY2FsYyc6XG5cdFx0XHRcdFx0d2Iub3B0c1tSbl0gPSB2YWw7IGJyZWFrO1xuXHRcdFx0XHRjYXNlICdDYWxjUmVmTW9kZSc6IG9wdHMuQ2FsY1JlZk1vZGUgPSB2YWw7IGJyZWFrOyAvLyBUT0RPOiBpbXBsZW1lbnQgUjFDMVxuXHRcdFx0XHRjYXNlICdVbmNhbGNlZCc6IGJyZWFrO1xuXHRcdFx0XHRjYXNlICdGb3JjZUZ1bGxDYWxjdWxhdGlvbic6IHdiLm9wdHMuRnVsbENhbGMgPSB2YWw7IGJyZWFrO1xuXHRcdFx0XHRjYXNlICdXc0Jvb2wnOlxuXHRcdFx0XHRcdGlmKHZhbC5mRGlhbG9nKSBvdXRbXCIhdHlwZVwiXSA9IFwiZGlhbG9nXCI7XG5cdFx0XHRcdFx0YnJlYWs7IC8vIFRPRE9cblx0XHRcdFx0Y2FzZSAnWEYnOlxuXHRcdFx0XHRcdFhGcy5wdXNoKHZhbCk7IGJyZWFrO1xuXHRcdFx0XHRjYXNlICdFeHRTU1QnOiBicmVhazsgLy8gVE9ET1xuXHRcdFx0XHRjYXNlICdCb29rRXh0JzogYnJlYWs7IC8vIFRPRE9cblx0XHRcdFx0Y2FzZSAnUmljaFRleHRTdHJlYW0nOiBicmVhaztcblx0XHRcdFx0Y2FzZSAnQmtIaW0nOiBicmVhaztcblxuXHRcdFx0XHRjYXNlICdTdXBCb29rJzpcblx0XHRcdFx0XHRzdXBib29rcy5wdXNoKFt2YWxdKTtcblx0XHRcdFx0XHRzdXBib29rc1tzdXBib29rcy5sZW5ndGgtMV0uWFRJID0gW107XG5cdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdGNhc2UgJ0V4dGVybk5hbWUnOlxuXHRcdFx0XHRcdHN1cGJvb2tzW3N1cGJvb2tzLmxlbmd0aC0xXS5wdXNoKHZhbCk7XG5cdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdGNhc2UgJ0luZGV4JzogYnJlYWs7IC8vIFRPRE9cblx0XHRcdFx0Y2FzZSAnTGJsJzpcblx0XHRcdFx0XHRsYXN0X2xibCA9ICh7XG5cdFx0XHRcdFx0XHROYW1lOiB2YWwuTmFtZSxcblx0XHRcdFx0XHRcdFJlZjogc3RyaW5naWZ5X2Zvcm11bGEodmFsLnJnY2UscmFuZ2UsbnVsbCxzdXBib29rcyxvcHRzKVxuXHRcdFx0XHRcdH0pO1xuXHRcdFx0XHRcdGlmKHZhbC5pdGFiID4gMCkgbGFzdF9sYmwuU2hlZXQgPSB2YWwuaXRhYiAtIDE7XG5cdFx0XHRcdFx0c3VwYm9va3MubmFtZXMucHVzaChsYXN0X2xibCk7XG5cdFx0XHRcdFx0aWYoIXN1cGJvb2tzWzBdKSB7IHN1cGJvb2tzWzBdID0gW107IHN1cGJvb2tzWzBdLlhUSSA9IFtdOyB9XG5cdFx0XHRcdFx0c3VwYm9va3Nbc3VwYm9va3MubGVuZ3RoLTFdLnB1c2godmFsKTtcblx0XHRcdFx0XHRpZih2YWwuTmFtZSA9PSBcIl94bG5tLl9GaWx0ZXJEYXRhYmFzZVwiICYmIHZhbC5pdGFiID4gMClcblx0XHRcdFx0XHRcdGlmKHZhbC5yZ2NlICYmIHZhbC5yZ2NlWzBdICYmIHZhbC5yZ2NlWzBdWzBdICYmIHZhbC5yZ2NlWzBdWzBdWzBdID09ICdQdGdBcmVhM2QnKVxuXHRcdFx0XHRcdFx0XHRGaWx0ZXJEYXRhYmFzZXNbdmFsLml0YWIgLSAxXSA9IHsgcmVmOiBlbmNvZGVfcmFuZ2UodmFsLnJnY2VbMF1bMF1bMV1bMl0pIH07XG5cdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdGNhc2UgJ0V4dGVybkNvdW50Jzogb3B0cy5FeHRlcm5Db3VudCA9IHZhbDsgYnJlYWs7XG5cdFx0XHRcdGNhc2UgJ0V4dGVyblNoZWV0Jzpcblx0XHRcdFx0XHRpZihzdXBib29rcy5sZW5ndGggPT0gMCkgeyBzdXBib29rc1swXSA9IFtdOyBzdXBib29rc1swXS5YVEkgPSBbXTsgfVxuXHRcdFx0XHRcdHN1cGJvb2tzW3N1cGJvb2tzLmxlbmd0aCAtIDFdLlhUSSA9IHN1cGJvb2tzW3N1cGJvb2tzLmxlbmd0aCAtIDFdLlhUSS5jb25jYXQodmFsKTsgc3VwYm9va3MuWFRJID0gc3VwYm9va3MuWFRJLmNvbmNhdCh2YWwpOyBicmVhaztcblx0XHRcdFx0Y2FzZSAnTmFtZUNtdCc6XG5cdFx0XHRcdFx0LyogVE9ETzogc2VhcmNoIGZvciBjb3JyZWN0IG5hbWUgKi9cblx0XHRcdFx0XHRpZihvcHRzLmJpZmYgPCA4KSBicmVhaztcblx0XHRcdFx0XHRpZihsYXN0X2xibCAhPSBudWxsKSBsYXN0X2xibC5Db21tZW50ID0gdmFsWzFdO1xuXHRcdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRcdGNhc2UgJ1Byb3RlY3QnOiBvdXRbXCIhcHJvdGVjdFwiXSA9IHZhbDsgYnJlYWs7IC8qIGZvciBzaGVldCBvciBib29rICovXG5cdFx0XHRcdGNhc2UgJ1Bhc3N3b3JkJzogaWYodmFsICE9PSAwICYmIG9wdHMuV1RGKSBjb25zb2xlLmVycm9yKFwiUGFzc3dvcmQgdmVyaWZpZXI6IFwiICsgdmFsKTsgYnJlYWs7XG5cdFx0XHRcdGNhc2UgJ1Byb3Q0UmV2JzogY2FzZSAnUHJvdDRSZXZQYXNzJzogYnJlYWs7IC8qVE9ETzogUmV2aXNpb24gQ29udHJvbCovXG5cblx0XHRcdFx0Y2FzZSAnQm91bmRTaGVldDgnOiB7XG5cdFx0XHRcdFx0RGlyZWN0b3J5W3ZhbC5wb3NdID0gdmFsO1xuXHRcdFx0XHRcdG9wdHMuc25hbWVzLnB1c2godmFsLm5hbWUpO1xuXHRcdFx0XHR9IGJyZWFrO1xuXHRcdFx0XHRjYXNlICdFT0YnOiB7XG5cdFx0XHRcdFx0aWYoLS1maWxlX2RlcHRoKSBicmVhaztcblx0XHRcdFx0XHRpZihyYW5nZS5lKSB7XG5cdFx0XHRcdFx0XHRpZihyYW5nZS5lLnIgPiAwICYmIHJhbmdlLmUuYyA+IDApIHtcblx0XHRcdFx0XHRcdFx0cmFuZ2UuZS5yLS07IHJhbmdlLmUuYy0tO1xuXHRcdFx0XHRcdFx0XHRvdXRbXCIhcmVmXCJdID0gZW5jb2RlX3JhbmdlKHJhbmdlKTtcblx0XHRcdFx0XHRcdFx0aWYob3B0aW9ucy5zaGVldFJvd3MgJiYgb3B0aW9ucy5zaGVldFJvd3MgPD0gcmFuZ2UuZS5yKSB7XG5cdFx0XHRcdFx0XHRcdFx0dmFyIHRtcHJpID0gcmFuZ2UuZS5yO1xuXHRcdFx0XHRcdFx0XHRcdHJhbmdlLmUuciA9IG9wdGlvbnMuc2hlZXRSb3dzIC0gMTtcblx0XHRcdFx0XHRcdFx0XHRvdXRbXCIhZnVsbHJlZlwiXSA9IG91dFtcIiFyZWZcIl07XG5cdFx0XHRcdFx0XHRcdFx0b3V0W1wiIXJlZlwiXSA9IGVuY29kZV9yYW5nZShyYW5nZSk7XG5cdFx0XHRcdFx0XHRcdFx0cmFuZ2UuZS5yID0gdG1wcmk7XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0cmFuZ2UuZS5yKys7IHJhbmdlLmUuYysrO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0aWYobWVyZ2VzLmxlbmd0aCA+IDApIG91dFtcIiFtZXJnZXNcIl0gPSBtZXJnZXM7XG5cdFx0XHRcdFx0XHRpZihvYmplY3RzLmxlbmd0aCA+IDApIG91dFtcIiFvYmplY3RzXCJdID0gb2JqZWN0cztcblx0XHRcdFx0XHRcdGlmKGNvbGluZm8ubGVuZ3RoID4gMCkgb3V0W1wiIWNvbHNcIl0gPSBjb2xpbmZvO1xuXHRcdFx0XHRcdFx0aWYocm93aW5mby5sZW5ndGggPiAwKSBvdXRbXCIhcm93c1wiXSA9IHJvd2luZm87XG5cdFx0XHRcdFx0XHRXb3JrYm9vay5TaGVldHMucHVzaCh3c3Byb3BzKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0aWYoY3VyX3NoZWV0ID09PSBcIlwiKSBQcmVhbWJsZSA9IG91dDsgZWxzZSBTaGVldHNbY3VyX3NoZWV0XSA9IG91dDtcblx0XHRcdFx0XHRvdXQgPSAoKG9wdGlvbnMuZGVuc2UgPyBbXSA6IHt9KSk7XG5cdFx0XHRcdH0gYnJlYWs7XG5cdFx0XHRcdGNhc2UgJ0JPRic6IHtcblx0XHRcdFx0XHRpZihvcHRzLmJpZmYgPT09IDgpIG9wdHMuYmlmZiA9IHtcbjB4MDAwOToyLFxuMHgwMjA5OjMsXG4weDA0MDk6NFxuXHRcdFx0XHRcdH1bUmVjb3JkVHlwZV0gfHwge1xuMHgwMjAwOjIsXG4weDAzMDA6MyxcbjB4MDQwMDo0LFxuMHgwNTAwOjUsXG4weDA2MDA6OCxcbjB4MDAwMjoyLFxuMHgwMDA3OjJcblx0XHRcdFx0XHR9W3ZhbC5CSUZGVmVyXSB8fCA4O1xuXHRcdFx0XHRcdGlmKG9wdHMuYmlmZiA9PSA4ICYmIHZhbC5CSUZGVmVyID09IDAgJiYgdmFsLmR0ID09IDE2KSBvcHRzLmJpZmYgPSAyO1xuXHRcdFx0XHRcdGlmKGZpbGVfZGVwdGgrKykgYnJlYWs7XG5cdFx0XHRcdFx0Y2VsbF92YWxpZCA9IHRydWU7XG5cdFx0XHRcdFx0b3V0ID0gKChvcHRpb25zLmRlbnNlID8gW10gOiB7fSkpO1xuXG5cdFx0XHRcdFx0aWYob3B0cy5iaWZmIDwgOCAmJiAhc2Vlbl9jb2RlcGFnZSkgeyBzZWVuX2NvZGVwYWdlID0gdHJ1ZTsgc2V0X2NwKG9wdHMuY29kZXBhZ2UgPSBvcHRpb25zLmNvZGVwYWdlIHx8IDEyNTIpOyB9XG5cdFx0XHRcdFx0aWYob3B0cy5iaWZmIDwgNSkge1xuXHRcdFx0XHRcdFx0aWYoY3VyX3NoZWV0ID09PSBcIlwiKSBjdXJfc2hlZXQgPSBcIlNoZWV0MVwiO1xuXHRcdFx0XHRcdFx0cmFuZ2UgPSB7czp7cjowLGM6MH0sZTp7cjowLGM6MH19O1xuXHRcdFx0XHRcdFx0LyogZmFrZSBCb3VuZFNoZWV0OCAqL1xuXHRcdFx0XHRcdFx0dmFyIGZha2ViczggPSB7cG9zOiBibG9iLmwgLSBsZW5ndGgsIG5hbWU6Y3VyX3NoZWV0fTtcblx0XHRcdFx0XHRcdERpcmVjdG9yeVtmYWtlYnM4LnBvc10gPSBmYWtlYnM4O1xuXHRcdFx0XHRcdFx0b3B0cy5zbmFtZXMucHVzaChjdXJfc2hlZXQpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRlbHNlIGN1cl9zaGVldCA9IChEaXJlY3Rvcnlbc10gfHwge25hbWU6XCJcIn0pLm5hbWU7XG5cdFx0XHRcdFx0aWYodmFsLmR0ID09IDB4MjApIG91dFtcIiF0eXBlXCJdID0gXCJjaGFydFwiO1xuXHRcdFx0XHRcdGlmKHZhbC5kdCA9PSAweDQwKSBvdXRbXCIhdHlwZVwiXSA9IFwibWFjcm9cIjtcblx0XHRcdFx0XHRtZXJnZXMgPSBbXTtcblx0XHRcdFx0XHRvYmplY3RzID0gW107XG5cdFx0XHRcdFx0b3B0cy5hcnJheWYgPSBhcnJheWYgPSBbXTtcblx0XHRcdFx0XHRjb2xpbmZvID0gW107IHJvd2luZm8gPSBbXTtcblx0XHRcdFx0XHRkZWZ3aWR0aCA9IGRlZmhlaWdodCA9IDA7XG5cdFx0XHRcdFx0c2VlbmNvbCA9IGZhbHNlO1xuXHRcdFx0XHRcdHdzcHJvcHMgPSB7SGlkZGVuOihEaXJlY3Rvcnlbc118fHtoczowfSkuaHMsIG5hbWU6Y3VyX3NoZWV0IH07XG5cdFx0XHRcdH0gYnJlYWs7XG5cblx0XHRcdFx0Y2FzZSAnTnVtYmVyJzogY2FzZSAnQklGRjJOVU0nOiBjYXNlICdCSUZGMklOVCc6IHtcblx0XHRcdFx0XHRpZihvdXRbXCIhdHlwZVwiXSA9PSBcImNoYXJ0XCIpIGlmKG9wdGlvbnMuZGVuc2UgPyAob3V0W3ZhbC5yXXx8W10pW3ZhbC5jXTogb3V0W2VuY29kZV9jZWxsKHtjOnZhbC5jLCByOnZhbC5yfSldKSArK3ZhbC5jO1xuXHRcdFx0XHRcdHRlbXBfdmFsID0gKHtpeGZlOiB2YWwuaXhmZSwgWEY6IFhGc1t2YWwuaXhmZV18fHt9LCB2OnZhbC52YWwsIHQ6J24nfSk7XG5cdFx0XHRcdFx0aWYoQklGRjJGbXQgPiAwKSB0ZW1wX3ZhbC56ID0gQklGRjJGbXRUYWJsZVsodGVtcF92YWwuaXhmZT4+OCkgJiAweDFGXTtcblx0XHRcdFx0XHRzYWZlX2Zvcm1hdF94Zih0ZW1wX3ZhbCwgb3B0aW9ucywgd2Iub3B0cy5EYXRlMTkwNCk7XG5cdFx0XHRcdFx0YWRkY2VsbCh7Yzp2YWwuYywgcjp2YWwucn0sIHRlbXBfdmFsLCBvcHRpb25zKTtcblx0XHRcdFx0fSBicmVhaztcblx0XHRcdFx0Y2FzZSAnQm9vbEVycic6IHtcblx0XHRcdFx0XHR0ZW1wX3ZhbCA9ICh7aXhmZTogdmFsLml4ZmUsIFhGOiBYRnNbdmFsLml4ZmVdLCB2OnZhbC52YWwsIHQ6dmFsLnR9KTtcblx0XHRcdFx0XHRpZihCSUZGMkZtdCA+IDApIHRlbXBfdmFsLnogPSBCSUZGMkZtdFRhYmxlWyh0ZW1wX3ZhbC5peGZlPj44KSAmIDB4MUZdO1xuXHRcdFx0XHRcdHNhZmVfZm9ybWF0X3hmKHRlbXBfdmFsLCBvcHRpb25zLCB3Yi5vcHRzLkRhdGUxOTA0KTtcblx0XHRcdFx0XHRhZGRjZWxsKHtjOnZhbC5jLCByOnZhbC5yfSwgdGVtcF92YWwsIG9wdGlvbnMpO1xuXHRcdFx0XHR9IGJyZWFrO1xuXHRcdFx0XHRjYXNlICdSSyc6IHtcblx0XHRcdFx0XHR0ZW1wX3ZhbCA9ICh7aXhmZTogdmFsLml4ZmUsIFhGOiBYRnNbdmFsLml4ZmVdLCB2OnZhbC5ya251bSwgdDonbid9KTtcblx0XHRcdFx0XHRpZihCSUZGMkZtdCA+IDApIHRlbXBfdmFsLnogPSBCSUZGMkZtdFRhYmxlWyh0ZW1wX3ZhbC5peGZlPj44KSAmIDB4MUZdO1xuXHRcdFx0XHRcdHNhZmVfZm9ybWF0X3hmKHRlbXBfdmFsLCBvcHRpb25zLCB3Yi5vcHRzLkRhdGUxOTA0KTtcblx0XHRcdFx0XHRhZGRjZWxsKHtjOnZhbC5jLCByOnZhbC5yfSwgdGVtcF92YWwsIG9wdGlvbnMpO1xuXHRcdFx0XHR9IGJyZWFrO1xuXHRcdFx0XHRjYXNlICdNdWxSayc6IHtcblx0XHRcdFx0XHRmb3IodmFyIGogPSB2YWwuYzsgaiA8PSB2YWwuQzsgKytqKSB7XG5cdFx0XHRcdFx0XHR2YXIgaXhmZSA9IHZhbC5ya3JlY1tqLXZhbC5jXVswXTtcblx0XHRcdFx0XHRcdHRlbXBfdmFsPSAoe2l4ZmU6aXhmZSwgWEY6WEZzW2l4ZmVdLCB2OnZhbC5ya3JlY1tqLXZhbC5jXVsxXSwgdDonbid9KTtcblx0XHRcdFx0XHRcdGlmKEJJRkYyRm10ID4gMCkgdGVtcF92YWwueiA9IEJJRkYyRm10VGFibGVbKHRlbXBfdmFsLml4ZmU+PjgpICYgMHgxRl07XG5cdFx0XHRcdFx0XHRzYWZlX2Zvcm1hdF94Zih0ZW1wX3ZhbCwgb3B0aW9ucywgd2Iub3B0cy5EYXRlMTkwNCk7XG5cdFx0XHRcdFx0XHRhZGRjZWxsKHtjOmosIHI6dmFsLnJ9LCB0ZW1wX3ZhbCwgb3B0aW9ucyk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9IGJyZWFrO1xuXHRcdFx0XHRjYXNlICdGb3JtdWxhJzoge1xuXHRcdFx0XHRcdGlmKHZhbC52YWwgPT0gJ1N0cmluZycpIHsgbGFzdF9mb3JtdWxhID0gdmFsOyBicmVhazsgfVxuXHRcdFx0XHRcdHRlbXBfdmFsID0gbWFrZV9jZWxsKHZhbC52YWwsIHZhbC5jZWxsLml4ZmUsIHZhbC50dCk7XG5cdFx0XHRcdFx0dGVtcF92YWwuWEYgPSBYRnNbdGVtcF92YWwuaXhmZV07XG5cdFx0XHRcdFx0aWYob3B0aW9ucy5jZWxsRm9ybXVsYSkge1xuXHRcdFx0XHRcdFx0dmFyIF9mID0gdmFsLmZvcm11bGE7XG5cdFx0XHRcdFx0XHRpZihfZiAmJiBfZlswXSAmJiBfZlswXVswXSAmJiBfZlswXVswXVswXSA9PSAnUHRnRXhwJykge1xuXHRcdFx0XHRcdFx0XHR2YXIgX2ZyID0gX2ZbMF1bMF1bMV1bMF0sIF9mYyA9IF9mWzBdWzBdWzFdWzFdO1xuXHRcdFx0XHRcdFx0XHR2YXIgX2ZlID0gZW5jb2RlX2NlbGwoe3I6X2ZyLCBjOl9mY30pO1xuXHRcdFx0XHRcdFx0XHRpZihzaGFyZWRmW19mZV0pIHRlbXBfdmFsLmYgPSBcIlwiK3N0cmluZ2lmeV9mb3JtdWxhKHZhbC5mb3JtdWxhLHJhbmdlLHZhbC5jZWxsLHN1cGJvb2tzLCBvcHRzKTtcblx0XHRcdFx0XHRcdFx0ZWxzZSB0ZW1wX3ZhbC5GID0gKChvcHRpb25zLmRlbnNlID8gKG91dFtfZnJdfHxbXSlbX2ZjXTogb3V0W19mZV0pIHx8IHt9KS5GO1xuXHRcdFx0XHRcdFx0fSBlbHNlIHRlbXBfdmFsLmYgPSBcIlwiK3N0cmluZ2lmeV9mb3JtdWxhKHZhbC5mb3JtdWxhLHJhbmdlLHZhbC5jZWxsLHN1cGJvb2tzLCBvcHRzKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0aWYoQklGRjJGbXQgPiAwKSB0ZW1wX3ZhbC56ID0gQklGRjJGbXRUYWJsZVsodGVtcF92YWwuaXhmZT4+OCkgJiAweDFGXTtcblx0XHRcdFx0XHRzYWZlX2Zvcm1hdF94Zih0ZW1wX3ZhbCwgb3B0aW9ucywgd2Iub3B0cy5EYXRlMTkwNCk7XG5cdFx0XHRcdFx0YWRkY2VsbCh2YWwuY2VsbCwgdGVtcF92YWwsIG9wdGlvbnMpO1xuXHRcdFx0XHRcdGxhc3RfZm9ybXVsYSA9IHZhbDtcblx0XHRcdFx0fSBicmVhaztcblx0XHRcdFx0Y2FzZSAnU3RyaW5nJzoge1xuXHRcdFx0XHRcdGlmKGxhc3RfZm9ybXVsYSkgeyAvKiB0ZWNobmljYWxseSBhbHdheXMgdHJ1ZSAqL1xuXHRcdFx0XHRcdFx0bGFzdF9mb3JtdWxhLnZhbCA9IHZhbDtcblx0XHRcdFx0XHRcdHRlbXBfdmFsID0gbWFrZV9jZWxsKHZhbCwgbGFzdF9mb3JtdWxhLmNlbGwuaXhmZSwgJ3MnKTtcblx0XHRcdFx0XHRcdHRlbXBfdmFsLlhGID0gWEZzW3RlbXBfdmFsLml4ZmVdO1xuXHRcdFx0XHRcdFx0aWYob3B0aW9ucy5jZWxsRm9ybXVsYSkge1xuXHRcdFx0XHRcdFx0XHR0ZW1wX3ZhbC5mID0gXCJcIitzdHJpbmdpZnlfZm9ybXVsYShsYXN0X2Zvcm11bGEuZm9ybXVsYSwgcmFuZ2UsIGxhc3RfZm9ybXVsYS5jZWxsLCBzdXBib29rcywgb3B0cyk7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRpZihCSUZGMkZtdCA+IDApIHRlbXBfdmFsLnogPSBCSUZGMkZtdFRhYmxlWyh0ZW1wX3ZhbC5peGZlPj44KSAmIDB4MUZdO1xuXHRcdFx0XHRcdFx0c2FmZV9mb3JtYXRfeGYodGVtcF92YWwsIG9wdGlvbnMsIHdiLm9wdHMuRGF0ZTE5MDQpO1xuXHRcdFx0XHRcdFx0YWRkY2VsbChsYXN0X2Zvcm11bGEuY2VsbCwgdGVtcF92YWwsIG9wdGlvbnMpO1xuXHRcdFx0XHRcdFx0bGFzdF9mb3JtdWxhID0gbnVsbDtcblx0XHRcdFx0XHR9IGVsc2UgdGhyb3cgbmV3IEVycm9yKFwiU3RyaW5nIHJlY29yZCBleHBlY3RzIEZvcm11bGFcIik7XG5cdFx0XHRcdH0gYnJlYWs7XG5cdFx0XHRcdGNhc2UgJ0FycmF5Jzoge1xuXHRcdFx0XHRcdGFycmF5Zi5wdXNoKHZhbCk7XG5cdFx0XHRcdFx0dmFyIF9hcnJheXN0YXJ0ID0gZW5jb2RlX2NlbGwodmFsWzBdLnMpO1xuXHRcdFx0XHRcdGNjID0gb3B0aW9ucy5kZW5zZSA/IChvdXRbdmFsWzBdLnMucl18fFtdKVt2YWxbMF0ucy5jXSA6IG91dFtfYXJyYXlzdGFydF07XG5cdFx0XHRcdFx0aWYob3B0aW9ucy5jZWxsRm9ybXVsYSAmJiBjYykge1xuXHRcdFx0XHRcdFx0aWYoIWxhc3RfZm9ybXVsYSkgYnJlYWs7IC8qIHRlY2huaWNhbGx5IHVucmVhY2hhYmxlICovXG5cdFx0XHRcdFx0XHRpZighX2FycmF5c3RhcnQgfHwgIWNjKSBicmVhaztcblx0XHRcdFx0XHRcdGNjLmYgPSBcIlwiK3N0cmluZ2lmeV9mb3JtdWxhKHZhbFsxXSwgcmFuZ2UsIHZhbFswXSwgc3VwYm9va3MsIG9wdHMpO1xuXHRcdFx0XHRcdFx0Y2MuRiA9IGVuY29kZV9yYW5nZSh2YWxbMF0pO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSBicmVhaztcblx0XHRcdFx0Y2FzZSAnU2hyRm1sYSc6IHtcblx0XHRcdFx0XHRpZighY2VsbF92YWxpZCkgYnJlYWs7XG5cdFx0XHRcdFx0aWYoIW9wdGlvbnMuY2VsbEZvcm11bGEpIGJyZWFrO1xuXHRcdFx0XHRcdGlmKGxhc3RfY2VsbCkge1xuXHRcdFx0XHRcdFx0LyogVE9ETzogY2FwdHVyZSByYW5nZSAqL1xuXHRcdFx0XHRcdFx0aWYoIWxhc3RfZm9ybXVsYSkgYnJlYWs7IC8qIHRlY2huaWNhbGx5IHVucmVhY2hhYmxlICovXG5cdFx0XHRcdFx0XHRzaGFyZWRmW2VuY29kZV9jZWxsKGxhc3RfZm9ybXVsYS5jZWxsKV09IHZhbFswXTtcblx0XHRcdFx0XHRcdGNjID0gb3B0aW9ucy5kZW5zZSA/IChvdXRbbGFzdF9mb3JtdWxhLmNlbGwucl18fFtdKVtsYXN0X2Zvcm11bGEuY2VsbC5jXSA6IG91dFtlbmNvZGVfY2VsbChsYXN0X2Zvcm11bGEuY2VsbCldO1xuXHRcdFx0XHRcdFx0KGNjfHx7fSkuZiA9IFwiXCIrc3RyaW5naWZ5X2Zvcm11bGEodmFsWzBdLCByYW5nZSwgbGFzdGNlbGwsIHN1cGJvb2tzLCBvcHRzKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0gYnJlYWs7XG5cdFx0XHRcdGNhc2UgJ0xhYmVsU3N0Jzpcblx0XHRcdFx0XHR0ZW1wX3ZhbD1tYWtlX2NlbGwoc3N0W3ZhbC5pc3N0XS50LCB2YWwuaXhmZSwgJ3MnKTtcblx0XHRcdFx0XHRpZihzc3RbdmFsLmlzc3RdLmgpIHRlbXBfdmFsLmggPSBzc3RbdmFsLmlzc3RdLmg7XG5cdFx0XHRcdFx0dGVtcF92YWwuWEYgPSBYRnNbdGVtcF92YWwuaXhmZV07XG5cdFx0XHRcdFx0aWYoQklGRjJGbXQgPiAwKSB0ZW1wX3ZhbC56ID0gQklGRjJGbXRUYWJsZVsodGVtcF92YWwuaXhmZT4+OCkgJiAweDFGXTtcblx0XHRcdFx0XHRzYWZlX2Zvcm1hdF94Zih0ZW1wX3ZhbCwgb3B0aW9ucywgd2Iub3B0cy5EYXRlMTkwNCk7XG5cdFx0XHRcdFx0YWRkY2VsbCh7Yzp2YWwuYywgcjp2YWwucn0sIHRlbXBfdmFsLCBvcHRpb25zKTtcblx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0Y2FzZSAnQmxhbmsnOiBpZihvcHRpb25zLnNoZWV0U3R1YnMpIHtcblx0XHRcdFx0XHR0ZW1wX3ZhbCA9ICh7aXhmZTogdmFsLml4ZmUsIFhGOiBYRnNbdmFsLml4ZmVdLCB0Oid6J30pO1xuXHRcdFx0XHRcdGlmKEJJRkYyRm10ID4gMCkgdGVtcF92YWwueiA9IEJJRkYyRm10VGFibGVbKHRlbXBfdmFsLml4ZmU+PjgpICYgMHgxRl07XG5cdFx0XHRcdFx0c2FmZV9mb3JtYXRfeGYodGVtcF92YWwsIG9wdGlvbnMsIHdiLm9wdHMuRGF0ZTE5MDQpO1xuXHRcdFx0XHRcdGFkZGNlbGwoe2M6dmFsLmMsIHI6dmFsLnJ9LCB0ZW1wX3ZhbCwgb3B0aW9ucyk7XG5cdFx0XHRcdH0gYnJlYWs7XG5cdFx0XHRcdGNhc2UgJ011bEJsYW5rJzogaWYob3B0aW9ucy5zaGVldFN0dWJzKSB7XG5cdFx0XHRcdFx0Zm9yKHZhciBfaiA9IHZhbC5jOyBfaiA8PSB2YWwuQzsgKytfaikge1xuXHRcdFx0XHRcdFx0dmFyIF9peGZlID0gdmFsLml4ZmVbX2otdmFsLmNdO1xuXHRcdFx0XHRcdFx0dGVtcF92YWw9ICh7aXhmZTpfaXhmZSwgWEY6WEZzW19peGZlXSwgdDoneid9KTtcblx0XHRcdFx0XHRcdGlmKEJJRkYyRm10ID4gMCkgdGVtcF92YWwueiA9IEJJRkYyRm10VGFibGVbKHRlbXBfdmFsLml4ZmU+PjgpICYgMHgxRl07XG5cdFx0XHRcdFx0XHRzYWZlX2Zvcm1hdF94Zih0ZW1wX3ZhbCwgb3B0aW9ucywgd2Iub3B0cy5EYXRlMTkwNCk7XG5cdFx0XHRcdFx0XHRhZGRjZWxsKHtjOl9qLCByOnZhbC5yfSwgdGVtcF92YWwsIG9wdGlvbnMpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSBicmVhaztcblx0XHRcdFx0Y2FzZSAnUlN0cmluZyc6XG5cdFx0XHRcdGNhc2UgJ0xhYmVsJzogY2FzZSAnQklGRjJTVFInOlxuXHRcdFx0XHRcdHRlbXBfdmFsPW1ha2VfY2VsbCh2YWwudmFsLCB2YWwuaXhmZSwgJ3MnKTtcblx0XHRcdFx0XHR0ZW1wX3ZhbC5YRiA9IFhGc1t0ZW1wX3ZhbC5peGZlXTtcblx0XHRcdFx0XHRpZihCSUZGMkZtdCA+IDApIHRlbXBfdmFsLnogPSBCSUZGMkZtdFRhYmxlWyh0ZW1wX3ZhbC5peGZlPj44KSAmIDB4MUZdO1xuXHRcdFx0XHRcdHNhZmVfZm9ybWF0X3hmKHRlbXBfdmFsLCBvcHRpb25zLCB3Yi5vcHRzLkRhdGUxOTA0KTtcblx0XHRcdFx0XHRhZGRjZWxsKHtjOnZhbC5jLCByOnZhbC5yfSwgdGVtcF92YWwsIG9wdGlvbnMpO1xuXHRcdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRcdGNhc2UgJ0RpbWVuc2lvbnMnOiB7XG5cdFx0XHRcdFx0aWYoZmlsZV9kZXB0aCA9PT0gMSkgcmFuZ2UgPSB2YWw7IC8qIFRPRE86IHN0YWNrICovXG5cdFx0XHRcdH0gYnJlYWs7XG5cdFx0XHRcdGNhc2UgJ1NTVCc6IHtcblx0XHRcdFx0XHRzc3QgPSB2YWw7XG5cdFx0XHRcdH0gYnJlYWs7XG5cdFx0XHRcdGNhc2UgJ0Zvcm1hdCc6IHsgLyogdmFsID0gW2lkLCBmbXRdICovXG5cdFx0XHRcdFx0aWYob3B0cy5iaWZmID09IDQpIHtcblx0XHRcdFx0XHRcdEJJRkYyRm10VGFibGVbQklGRjJGbXQrK10gPSB2YWxbMV07XG5cdFx0XHRcdFx0XHRmb3IodmFyIGI0aWR4ID0gMDsgYjRpZHggPCBCSUZGMkZtdCArIDE2MzsgKytiNGlkeCkgaWYoU1NGLl90YWJsZVtiNGlkeF0gPT0gdmFsWzFdKSBicmVhaztcblx0XHRcdFx0XHRcdGlmKGI0aWR4ID49IDE2MykgU1NGLmxvYWQodmFsWzFdLCBCSUZGMkZtdCArIDE2Myk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdGVsc2UgU1NGLmxvYWQodmFsWzFdLCB2YWxbMF0pO1xuXHRcdFx0XHR9IGJyZWFrO1xuXHRcdFx0XHRjYXNlICdCSUZGMkZPUk1BVCc6IHtcblx0XHRcdFx0XHRCSUZGMkZtdFRhYmxlW0JJRkYyRm10KytdID0gdmFsO1xuXHRcdFx0XHRcdGZvcih2YXIgYjJpZHggPSAwOyBiMmlkeCA8IEJJRkYyRm10ICsgMTYzOyArK2IyaWR4KSBpZihTU0YuX3RhYmxlW2IyaWR4XSA9PSB2YWwpIGJyZWFrO1xuXHRcdFx0XHRcdGlmKGIyaWR4ID49IDE2MykgU1NGLmxvYWQodmFsLCBCSUZGMkZtdCArIDE2Myk7XG5cdFx0XHRcdH0gYnJlYWs7XG5cblx0XHRcdFx0Y2FzZSAnTWVyZ2VDZWxscyc6IG1lcmdlcyA9IG1lcmdlcy5jb25jYXQodmFsKTsgYnJlYWs7XG5cblx0XHRcdFx0Y2FzZSAnT2JqJzogb2JqZWN0c1t2YWwuY21vWzBdXSA9IG9wdHMubGFzdG9iaiA9IHZhbDsgYnJlYWs7XG5cdFx0XHRcdGNhc2UgJ1R4Tyc6IG9wdHMubGFzdG9iai5UeE8gPSB2YWw7IGJyZWFrO1xuXHRcdFx0XHRjYXNlICdJbURhdGEnOiBvcHRzLmxhc3RvYmouSW1EYXRhID0gdmFsOyBicmVhaztcblxuXHRcdFx0XHRjYXNlICdITGluayc6IHtcblx0XHRcdFx0XHRmb3Iocm5nUiA9IHZhbFswXS5zLnI7IHJuZ1IgPD0gdmFsWzBdLmUucjsgKytybmdSKVxuXHRcdFx0XHRcdFx0Zm9yKHJuZ0MgPSB2YWxbMF0ucy5jOyBybmdDIDw9IHZhbFswXS5lLmM7ICsrcm5nQykge1xuXHRcdFx0XHRcdFx0XHRjYyA9IG9wdGlvbnMuZGVuc2UgPyAob3V0W3JuZ1JdfHxbXSlbcm5nQ10gOiBvdXRbZW5jb2RlX2NlbGwoe2M6cm5nQyxyOnJuZ1J9KV07XG5cdFx0XHRcdFx0XHRcdGlmKGNjKSBjYy5sID0gdmFsWzFdO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHR9IGJyZWFrO1xuXHRcdFx0XHRjYXNlICdITGlua1Rvb2x0aXAnOiB7XG5cdFx0XHRcdFx0Zm9yKHJuZ1IgPSB2YWxbMF0ucy5yOyBybmdSIDw9IHZhbFswXS5lLnI7ICsrcm5nUilcblx0XHRcdFx0XHRcdGZvcihybmdDID0gdmFsWzBdLnMuYzsgcm5nQyA8PSB2YWxbMF0uZS5jOyArK3JuZ0MpIHtcblx0XHRcdFx0XHRcdFx0Y2MgPSBvcHRpb25zLmRlbnNlID8gKG91dFtybmdSXXx8W10pW3JuZ0NdIDogb3V0W2VuY29kZV9jZWxsKHtjOnJuZ0MscjpybmdSfSldO1xuXHRcdFx0XHRcdFx0XHRpZihjYyAmJiBjYy5sKSBjYy5sLlRvb2x0aXAgPSB2YWxbMV07XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0fSBicmVhaztcblxuXHRcdFx0XHQvKiBDb21tZW50cyAqL1xuXHRcdFx0XHRjYXNlICdOb3RlJzoge1xuXHRcdFx0XHRcdGlmKG9wdHMuYmlmZiA8PSA1ICYmIG9wdHMuYmlmZiA+PSAyKSBicmVhazsgLyogVE9ETzogQklGRjUgKi9cblx0XHRcdFx0XHRjYyA9IG9wdGlvbnMuZGVuc2UgPyAob3V0W3ZhbFswXS5yXXx8W10pW3ZhbFswXS5jXSA6IG91dFtlbmNvZGVfY2VsbCh2YWxbMF0pXTtcblx0XHRcdFx0XHR2YXIgbm90ZW9iaiA9IG9iamVjdHNbdmFsWzJdXTtcblx0XHRcdFx0XHRpZighY2MpIHtcblx0XHRcdFx0XHRcdGlmKG9wdGlvbnMuZGVuc2UpIHtcblx0XHRcdFx0XHRcdFx0aWYoIW91dFt2YWxbMF0ucl0pIG91dFt2YWxbMF0ucl0gPSBbXTtcblx0XHRcdFx0XHRcdFx0Y2MgPSBvdXRbdmFsWzBdLnJdW3ZhbFswXS5jXSA9ICh7dDpcInpcIn0pO1xuXHRcdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdFx0Y2MgPSBvdXRbZW5jb2RlX2NlbGwodmFsWzBdKV0gPSAoe3Q6XCJ6XCJ9KTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdHJhbmdlLmUuciA9IE1hdGgubWF4KHJhbmdlLmUuciwgdmFsWzBdLnIpO1xuXHRcdFx0XHRcdFx0cmFuZ2Uucy5yID0gTWF0aC5taW4ocmFuZ2Uucy5yLCB2YWxbMF0ucik7XG5cdFx0XHRcdFx0XHRyYW5nZS5lLmMgPSBNYXRoLm1heChyYW5nZS5lLmMsIHZhbFswXS5jKTtcblx0XHRcdFx0XHRcdHJhbmdlLnMuYyA9IE1hdGgubWluKHJhbmdlLnMuYywgdmFsWzBdLmMpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRpZighY2MuYykgY2MuYyA9IFtdO1xuXHRcdFx0XHRcdGNtbnQgPSB7YTp2YWxbMV0sdDpub3Rlb2JqLlR4Ty50fTtcblx0XHRcdFx0XHRjYy5jLnB1c2goY21udCk7XG5cdFx0XHRcdH0gYnJlYWs7XG5cblx0XHRcdFx0ZGVmYXVsdDogc3dpdGNoKFIubikgeyAvKiBuZXN0ZWQgKi9cblx0XHRcdFx0Y2FzZSAnQ2xydENsaWVudCc6IGJyZWFrO1xuXHRcdFx0XHRjYXNlICdYRkV4dCc6IHVwZGF0ZV94ZmV4dChYRnNbdmFsLml4ZmVdLCB2YWwuZXh0KTsgYnJlYWs7XG5cblx0XHRcdFx0Y2FzZSAnRGVmQ29sV2lkdGgnOiBkZWZ3aWR0aCA9IHZhbDsgYnJlYWs7XG5cdFx0XHRcdGNhc2UgJ0RlZmF1bHRSb3dIZWlnaHQnOiBkZWZoZWlnaHQgPSB2YWxbMV07IGJyZWFrOyAvLyBUT0RPOiBmbGFnc1xuXG5cdFx0XHRcdGNhc2UgJ0NvbEluZm8nOiB7XG5cdFx0XHRcdFx0aWYoIW9wdHMuY2VsbFN0eWxlcykgYnJlYWs7XG5cdFx0XHRcdFx0d2hpbGUodmFsLmUgPj0gdmFsLnMpIHtcblx0XHRcdFx0XHRcdGNvbGluZm9bdmFsLmUtLV0gPSB7IHdpZHRoOiB2YWwudy8yNTYgfTtcblx0XHRcdFx0XHRcdGlmKCFzZWVuY29sKSB7IHNlZW5jb2wgPSB0cnVlOyBmaW5kX21kd19jb2x3KHZhbC53LzI1Nik7IH1cblx0XHRcdFx0XHRcdHByb2Nlc3NfY29sKGNvbGluZm9bdmFsLmUrMV0pO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSBicmVhaztcblx0XHRcdFx0Y2FzZSAnUm93Jzoge1xuXHRcdFx0XHRcdHZhciByb3dvYmogPSB7fTtcblx0XHRcdFx0XHRpZih2YWwubGV2ZWwgIT0gbnVsbCkgeyByb3dpbmZvW3ZhbC5yXSA9IHJvd29iajsgcm93b2JqLmxldmVsID0gdmFsLmxldmVsOyB9XG5cdFx0XHRcdFx0aWYodmFsLmhpZGRlbikgeyByb3dpbmZvW3ZhbC5yXSA9IHJvd29iajsgcm93b2JqLmhpZGRlbiA9IHRydWU7IH1cblx0XHRcdFx0XHRpZih2YWwuaHB0KSB7XG5cdFx0XHRcdFx0XHRyb3dpbmZvW3ZhbC5yXSA9IHJvd29iajtcblx0XHRcdFx0XHRcdHJvd29iai5ocHQgPSB2YWwuaHB0OyByb3dvYmouaHB4ID0gcHQycHgodmFsLmhwdCk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9IGJyZWFrO1xuXG5cdFx0XHRcdGNhc2UgJ0xlZnRNYXJnaW4nOlxuXHRcdFx0XHRjYXNlICdSaWdodE1hcmdpbic6XG5cdFx0XHRcdGNhc2UgJ1RvcE1hcmdpbic6XG5cdFx0XHRcdGNhc2UgJ0JvdHRvbU1hcmdpbic6XG5cdFx0XHRcdFx0aWYoIW91dFsnIW1hcmdpbnMnXSkgZGVmYXVsdF9tYXJnaW5zKG91dFsnIW1hcmdpbnMnXSA9IHt9KTtcblx0XHRcdFx0XHRvdXRbJyFtYXJnaW5zJ11bUm4uc2xpY2UoMCwtNikudG9Mb3dlckNhc2UoKV0gPSB2YWw7XG5cdFx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdFx0Y2FzZSAnU2V0dXAnOiAvLyBUT0RPXG5cdFx0XHRcdFx0aWYoIW91dFsnIW1hcmdpbnMnXSkgZGVmYXVsdF9tYXJnaW5zKG91dFsnIW1hcmdpbnMnXSA9IHt9KTtcblx0XHRcdFx0XHRvdXRbJyFtYXJnaW5zJ10uaGVhZGVyID0gdmFsLmhlYWRlcjtcblx0XHRcdFx0XHRvdXRbJyFtYXJnaW5zJ10uZm9vdGVyID0gdmFsLmZvb3Rlcjtcblx0XHRcdFx0XHRicmVhaztcblxuXHRcdFx0XHRjYXNlICdXaW5kb3cyJzogLy8gVE9ET1xuXHRcdFx0XHRcdC8vICRGbG93SWdub3JlXG5cdFx0XHRcdFx0aWYodmFsLlJUTCkgV29ya2Jvb2suVmlld3NbMF0uUlRMID0gdHJ1ZTtcblx0XHRcdFx0XHRicmVhaztcblxuXHRcdFx0XHRjYXNlICdIZWFkZXInOiBicmVhazsgLy8gVE9ET1xuXHRcdFx0XHRjYXNlICdGb290ZXInOiBicmVhazsgLy8gVE9ET1xuXHRcdFx0XHRjYXNlICdIQ2VudGVyJzogYnJlYWs7IC8vIFRPRE9cblx0XHRcdFx0Y2FzZSAnVkNlbnRlcic6IGJyZWFrOyAvLyBUT0RPXG5cdFx0XHRcdGNhc2UgJ1Bscyc6IGJyZWFrOyAvLyBUT0RPXG5cdFx0XHRcdGNhc2UgJ0dDVyc6IGJyZWFrO1xuXHRcdFx0XHRjYXNlICdMSFJlY29yZCc6IGJyZWFrO1xuXHRcdFx0XHRjYXNlICdEQkNlbGwnOiBicmVhazsgLy8gVE9ET1xuXHRcdFx0XHRjYXNlICdFbnRFeFUyJzogYnJlYWs7IC8vIFRPRE9cblx0XHRcdFx0Y2FzZSAnU3hWaWV3JzogYnJlYWs7IC8vIFRPRE9cblx0XHRcdFx0Y2FzZSAnU3h2ZCc6IGJyZWFrOyAvLyBUT0RPXG5cdFx0XHRcdGNhc2UgJ1NYVkknOiBicmVhazsgLy8gVE9ET1xuXHRcdFx0XHRjYXNlICdTWFZERXgnOiBicmVhazsgLy8gVE9ET1xuXHRcdFx0XHRjYXNlICdTeEl2ZCc6IGJyZWFrOyAvLyBUT0RPXG5cdFx0XHRcdGNhc2UgJ1NYU3RyaW5nJzogYnJlYWs7IC8vIFRPRE9cblx0XHRcdFx0Y2FzZSAnU3luYyc6IGJyZWFrO1xuXHRcdFx0XHRjYXNlICdBZGRpbic6IGJyZWFrO1xuXHRcdFx0XHRjYXNlICdTWERJJzogYnJlYWs7IC8vIFRPRE9cblx0XHRcdFx0Y2FzZSAnU1hMSSc6IGJyZWFrOyAvLyBUT0RPXG5cdFx0XHRcdGNhc2UgJ1NYRXgnOiBicmVhazsgLy8gVE9ET1xuXHRcdFx0XHRjYXNlICdRc2lTWFRhZyc6IGJyZWFrOyAvLyBUT0RPXG5cdFx0XHRcdGNhc2UgJ1NlbGVjdGlvbic6IGJyZWFrO1xuXHRcdFx0XHRjYXNlICdGZWF0JzogYnJlYWs7XG5cdFx0XHRcdGNhc2UgJ0ZlYXRIZHInOiBjYXNlICdGZWF0SGRyMTEnOiBicmVhaztcblx0XHRcdFx0Y2FzZSAnRmVhdHVyZTExJzogY2FzZSAnRmVhdHVyZTEyJzogY2FzZSAnTGlzdDEyJzogYnJlYWs7XG5cdFx0XHRcdGNhc2UgJ0NvdW50cnknOiBjb3VudHJ5ID0gdmFsOyBicmVhaztcblx0XHRcdFx0Y2FzZSAnUmVjYWxjSWQnOiBicmVhaztcblx0XHRcdFx0Y2FzZSAnRHhHQ29sJzogYnJlYWs7IC8vIFRPRE86IGh0bWxpZnlcblx0XHRcdFx0Y2FzZSAnRmJpJzogY2FzZSAnRmJpMic6IGNhc2UgJ0dlbEZyYW1lJzogYnJlYWs7XG5cdFx0XHRcdGNhc2UgJ0ZvbnQnOiBicmVhazsgLy8gVE9ET1xuXHRcdFx0XHRjYXNlICdYRkNSQyc6IGJyZWFrOyAvLyBUT0RPXG5cdFx0XHRcdGNhc2UgJ1N0eWxlJzogYnJlYWs7IC8vIFRPRE9cblx0XHRcdFx0Y2FzZSAnU3R5bGVFeHQnOiBicmVhazsgLy8gVE9ET1xuXHRcdFx0XHRjYXNlICdQYWxldHRlJzogcGFsZXR0ZSA9IHZhbDsgYnJlYWs7XG5cdFx0XHRcdGNhc2UgJ1RoZW1lJzogdGhlbWVzID0gdmFsOyBicmVhaztcblx0XHRcdFx0LyogUHJvdGVjdGlvbiAqL1xuXHRcdFx0XHRjYXNlICdTY2VuYXJpb1Byb3RlY3QnOiBicmVhaztcblx0XHRcdFx0Y2FzZSAnT2JqUHJvdGVjdCc6IGJyZWFrO1xuXG5cdFx0XHRcdC8qIENvbmRpdGlvbmFsIEZvcm1hdHRpbmcgKi9cblx0XHRcdFx0Y2FzZSAnQ29uZEZtdDEyJzogYnJlYWs7XG5cblx0XHRcdFx0LyogVGFibGUgKi9cblx0XHRcdFx0Y2FzZSAnVGFibGUnOiBicmVhazsgLy8gVE9ET1xuXHRcdFx0XHRjYXNlICdUYWJsZVN0eWxlcyc6IGJyZWFrOyAvLyBUT0RPXG5cdFx0XHRcdGNhc2UgJ1RhYmxlU3R5bGUnOiBicmVhazsgLy8gVE9ET1xuXHRcdFx0XHRjYXNlICdUYWJsZVN0eWxlRWxlbWVudCc6IGJyZWFrOyAvLyBUT0RPXG5cblx0XHRcdFx0LyogUGl2b3RUYWJsZSAqL1xuXHRcdFx0XHRjYXNlICdTWFN0cmVhbUlEJzogYnJlYWs7IC8vIFRPRE9cblx0XHRcdFx0Y2FzZSAnU1hWUyc6IGJyZWFrOyAvLyBUT0RPXG5cdFx0XHRcdGNhc2UgJ0RDb25SZWYnOiBicmVhazsgLy8gVE9ET1xuXHRcdFx0XHRjYXNlICdTWEFkZGwnOiBicmVhazsgLy8gVE9ET1xuXHRcdFx0XHRjYXNlICdEQ29uQmluJzogYnJlYWs7IC8vIFRPRE9cblx0XHRcdFx0Y2FzZSAnRENvbk5hbWUnOiBicmVhazsgLy8gVE9ET1xuXHRcdFx0XHRjYXNlICdTWFBJJzogYnJlYWs7IC8vIFRPRE9cblx0XHRcdFx0Y2FzZSAnU3hGb3JtYXQnOiBicmVhazsgLy8gVE9ET1xuXHRcdFx0XHRjYXNlICdTeFNlbGVjdCc6IGJyZWFrOyAvLyBUT0RPXG5cdFx0XHRcdGNhc2UgJ1N4UnVsZSc6IGJyZWFrOyAvLyBUT0RPXG5cdFx0XHRcdGNhc2UgJ1N4RmlsdCc6IGJyZWFrOyAvLyBUT0RPXG5cdFx0XHRcdGNhc2UgJ1N4SXRtJzogYnJlYWs7IC8vIFRPRE9cblx0XHRcdFx0Y2FzZSAnU3hEWEYnOiBicmVhazsgLy8gVE9ET1xuXG5cdFx0XHRcdC8qIFNjZW5hcmlvIE1hbmFnZXIgKi9cblx0XHRcdFx0Y2FzZSAnU2Nlbk1hbic6IGJyZWFrO1xuXG5cdFx0XHRcdC8qIERhdGEgQ29uc29saWRhdGlvbiAqL1xuXHRcdFx0XHRjYXNlICdEQ29uJzogYnJlYWs7XG5cblx0XHRcdFx0LyogV2F0Y2hlZCBDZWxsICovXG5cdFx0XHRcdGNhc2UgJ0NlbGxXYXRjaCc6IGJyZWFrO1xuXG5cdFx0XHRcdC8qIFByaW50IFNldHRpbmdzICovXG5cdFx0XHRcdGNhc2UgJ1ByaW50Um93Q29sJzogYnJlYWs7XG5cdFx0XHRcdGNhc2UgJ1ByaW50R3JpZCc6IGJyZWFrO1xuXHRcdFx0XHRjYXNlICdQcmludFNpemUnOiBicmVhaztcblxuXHRcdFx0XHRjYXNlICdYQ1QnOiBicmVhaztcblx0XHRcdFx0Y2FzZSAnQ1JOJzogYnJlYWs7XG5cblx0XHRcdFx0Y2FzZSAnU2NsJzoge1xuXHRcdFx0XHRcdC8vY29uc29sZS5sb2coXCJab29tIExldmVsOlwiLCB2YWxbMF0vdmFsWzFdLHZhbCk7XG5cdFx0XHRcdH0gYnJlYWs7XG5cdFx0XHRcdGNhc2UgJ1NoZWV0RXh0Jzoge1xuXHRcdFx0XHRcdC8qIGVtcHR5ICovXG5cdFx0XHRcdH0gYnJlYWs7XG5cdFx0XHRcdGNhc2UgJ1NoZWV0RXh0T3B0aW9uYWwnOiB7XG5cdFx0XHRcdFx0LyogZW1wdHkgKi9cblx0XHRcdFx0fSBicmVhaztcblxuXHRcdFx0XHQvKiBWQkEgKi9cblx0XHRcdFx0Y2FzZSAnT2JOb01hY3Jvcyc6IHtcblx0XHRcdFx0XHQvKiBlbXB0eSAqL1xuXHRcdFx0XHR9IGJyZWFrO1xuXHRcdFx0XHRjYXNlICdPYlByb2onOiB7XG5cdFx0XHRcdFx0LyogZW1wdHkgKi9cblx0XHRcdFx0fSBicmVhaztcblx0XHRcdFx0Y2FzZSAnQ29kZU5hbWUnOiB7XG5pZighY3VyX3NoZWV0KSBXb3JrYm9vay5XQlByb3BzLkNvZGVOYW1lID0gdmFsIHx8IFwiVGhpc1dvcmtib29rXCI7XG5cdFx0XHRcdFx0ZWxzZSB3c3Byb3BzLkNvZGVOYW1lID0gdmFsIHx8IHdzcHJvcHMubmFtZTtcblx0XHRcdFx0fSBicmVhaztcblx0XHRcdFx0Y2FzZSAnR1VJRFR5cGVMaWInOiB7XG5cdFx0XHRcdFx0LyogZW1wdHkgKi9cblx0XHRcdFx0fSBicmVhaztcblxuXHRcdFx0XHRjYXNlICdXT3B0JzogYnJlYWs7IC8vIFRPRE86IFdURj9cblx0XHRcdFx0Y2FzZSAnUGhvbmV0aWNJbmZvJzogYnJlYWs7XG5cblx0XHRcdFx0Y2FzZSAnT2xlT2JqZWN0U2l6ZSc6IGJyZWFrO1xuXG5cdFx0XHRcdC8qIERpZmZlcmVudGlhbCBGb3JtYXR0aW5nICovXG5cdFx0XHRcdGNhc2UgJ0RYRic6IGNhc2UgJ0RYRk4nOiBjYXNlICdEWEZOMTInOiBjYXNlICdEWEZOMTJMaXN0JzogY2FzZSAnRFhGTjEyTm9DQic6IGJyZWFrO1xuXG5cdFx0XHRcdC8qIERhdGEgVmFsaWRhdGlvbiAqL1xuXHRcdFx0XHRjYXNlICdEdic6IGNhc2UgJ0RWYWwnOiBicmVhaztcblxuXHRcdFx0XHQvKiBEYXRhIFNlcmllcyAqL1xuXHRcdFx0XHRjYXNlICdCUkFJJzogY2FzZSAnU2VyaWVzJzogY2FzZSAnU2VyaWVzVGV4dCc6IGJyZWFrO1xuXG5cdFx0XHRcdC8qIERhdGEgQ29ubmVjdGlvbiAqL1xuXHRcdFx0XHRjYXNlICdEQ29ubic6IGJyZWFrO1xuXHRcdFx0XHRjYXNlICdEYk9yUGFyYW1RcnknOiBicmVhaztcblx0XHRcdFx0Y2FzZSAnREJRdWVyeUV4dCc6IGJyZWFrO1xuXG5cdFx0XHRcdGNhc2UgJ09sZURiQ29ubic6IGJyZWFrO1xuXHRcdFx0XHRjYXNlICdFeHRTdHJpbmcnOiBicmVhaztcblxuXHRcdFx0XHQvKiBGb3JtYXR0aW5nICovXG5cdFx0XHRcdGNhc2UgJ0lGbXRSZWNvcmQnOiBicmVhaztcblx0XHRcdFx0Y2FzZSAnQ29uZEZtdCc6IGNhc2UgJ0NGJzogY2FzZSAnQ0YxMic6IGNhc2UgJ0NGRXgnOiBicmVhaztcblxuXHRcdFx0XHQvKiBFeHBsaWNpdGx5IElnbm9yZWQgKi9cblx0XHRcdFx0Y2FzZSAnRXhjZWw5RmlsZSc6IGJyZWFrO1xuXHRcdFx0XHRjYXNlICdVbml0cyc6IGJyZWFrO1xuXHRcdFx0XHRjYXNlICdJbnRlcmZhY2VIZHInOiBjYXNlICdNbXMnOiBjYXNlICdJbnRlcmZhY2VFbmQnOiBjYXNlICdEU0YnOiBicmVhaztcblx0XHRcdFx0Y2FzZSAnQnVpbHRJbkZuR3JvdXBDb3VudCc6IC8qIDIuNC4zMCAweDBFIG9yIDB4MTAgYnV0IGV4Y2VsIDIwMTEgZ2VuZXJhdGVzIDB4MTE/ICovIGJyZWFrO1xuXHRcdFx0XHQvKiBWaWV3IFN0dWZmICovXG5cdFx0XHRcdGNhc2UgJ1dpbmRvdzEnOiBjYXNlICdIaWRlT2JqJzogY2FzZSAnR3JpZFNldCc6IGNhc2UgJ0d1dHMnOlxuXHRcdFx0XHRjYXNlICdVc2VyQlZpZXcnOiBjYXNlICdVc2VyU1ZpZXdCZWdpbic6IGNhc2UgJ1VzZXJTVmlld0VuZCc6IGJyZWFrO1xuXHRcdFx0XHRjYXNlICdQYW5lJzogYnJlYWs7XG5cdFx0XHRcdGRlZmF1bHQ6IHN3aXRjaChSLm4pIHsgLyogbmVzdGVkICovXG5cdFx0XHRcdC8qIENoYXJ0ICovXG5cdFx0XHRcdGNhc2UgJ0RhdCc6XG5cdFx0XHRcdGNhc2UgJ0JlZ2luJzogY2FzZSAnRW5kJzpcblx0XHRcdFx0Y2FzZSAnU3RhcnRCbG9jayc6IGNhc2UgJ0VuZEJsb2NrJzpcblx0XHRcdFx0Y2FzZSAnRnJhbWUnOiBjYXNlICdBcmVhJzpcblx0XHRcdFx0Y2FzZSAnQXhpcyc6IGNhc2UgJ0F4aXNMaW5lJzogY2FzZSAnVGljayc6IGJyZWFrO1xuXHRcdFx0XHRjYXNlICdBeGVzVXNlZCc6XG5cdFx0XHRcdGNhc2UgJ0NydExheW91dDEyJzogY2FzZSAnQ3J0TGF5b3V0MTJBJzogY2FzZSAnQ3J0TGluayc6IGNhc2UgJ0NydExpbmUnOiBjYXNlICdDcnRNbEZydCc6IGNhc2UgJ0NydE1sRnJ0Q29udGludWUnOiBicmVhaztcblx0XHRcdFx0Y2FzZSAnTGluZUZvcm1hdCc6IGNhc2UgJ0FyZWFGb3JtYXQnOlxuXHRcdFx0XHRjYXNlICdDaGFydCc6IGNhc2UgJ0NoYXJ0M2QnOiBjYXNlICdDaGFydDNEQmFyU2hhcGUnOiBjYXNlICdDaGFydEZvcm1hdCc6IGNhc2UgJ0NoYXJ0RnJ0SW5mbyc6IGJyZWFrO1xuXHRcdFx0XHRjYXNlICdQbG90QXJlYSc6IGNhc2UgJ1Bsb3RHcm93dGgnOiBicmVhaztcblx0XHRcdFx0Y2FzZSAnU2VyaWVzTGlzdCc6IGNhc2UgJ1NlclBhcmVudCc6IGNhc2UgJ1NlckF1eFRyZW5kJzogYnJlYWs7XG5cdFx0XHRcdGNhc2UgJ0RhdGFGb3JtYXQnOiBjYXNlICdTZXJUb0NydCc6IGNhc2UgJ0ZvbnRYJzogYnJlYWs7XG5cdFx0XHRcdGNhc2UgJ0NhdFNlclJhbmdlJzogY2FzZSAnQXhjRXh0JzogY2FzZSAnU2VyRm10JzogYnJlYWs7XG5cdFx0XHRcdGNhc2UgJ1NodFByb3BzJzogYnJlYWs7XG5cdFx0XHRcdGNhc2UgJ0RlZmF1bHRUZXh0JzogY2FzZSAnVGV4dCc6IGNhc2UgJ0NhdExhYic6IGJyZWFrO1xuXHRcdFx0XHRjYXNlICdEYXRhTGFiRXh0Q29udGVudHMnOiBicmVhaztcblx0XHRcdFx0Y2FzZSAnTGVnZW5kJzogY2FzZSAnTGVnZW5kRXhjZXB0aW9uJzogYnJlYWs7XG5cdFx0XHRcdGNhc2UgJ1BpZSc6IGNhc2UgJ1NjYXR0ZXInOiBicmVhaztcblx0XHRcdFx0Y2FzZSAnUGllRm9ybWF0JzogY2FzZSAnTWFya2VyRm9ybWF0JzogYnJlYWs7XG5cdFx0XHRcdGNhc2UgJ1N0YXJ0T2JqZWN0JzogY2FzZSAnRW5kT2JqZWN0JzogYnJlYWs7XG5cdFx0XHRcdGNhc2UgJ0FsUnVucyc6IGNhc2UgJ09iamVjdExpbmsnOiBicmVhaztcblx0XHRcdFx0Y2FzZSAnU0lJbmRleCc6IGJyZWFrO1xuXHRcdFx0XHRjYXNlICdBdHRhY2hlZExhYmVsJzogY2FzZSAnWU11bHQnOiBicmVhaztcblxuXHRcdFx0XHQvKiBDaGFydCBHcm91cCAqL1xuXHRcdFx0XHRjYXNlICdMaW5lJzogY2FzZSAnQmFyJzogYnJlYWs7XG5cdFx0XHRcdGNhc2UgJ1N1cmYnOiBicmVhaztcblxuXHRcdFx0XHQvKiBBeGlzIEdyb3VwICovXG5cdFx0XHRcdGNhc2UgJ0F4aXNQYXJlbnQnOiBicmVhaztcblx0XHRcdFx0Y2FzZSAnUG9zJzogYnJlYWs7XG5cdFx0XHRcdGNhc2UgJ1ZhbHVlUmFuZ2UnOiBicmVhaztcblxuXHRcdFx0XHQvKiBQaXZvdCBDaGFydCAqL1xuXHRcdFx0XHRjYXNlICdTWFZpZXdFeDknOiBicmVhazsgLy8gVE9ET1xuXHRcdFx0XHRjYXNlICdTWFZpZXdMaW5rJzogYnJlYWs7XG5cdFx0XHRcdGNhc2UgJ1Bpdm90Q2hhcnRCaXRzJzogYnJlYWs7XG5cdFx0XHRcdGNhc2UgJ1NCYXNlUmVmJzogYnJlYWs7XG5cdFx0XHRcdGNhc2UgJ1RleHRQcm9wc1N0cmVhbSc6IGJyZWFrO1xuXG5cdFx0XHRcdC8qIENoYXJ0IE1pc2MgKi9cblx0XHRcdFx0Y2FzZSAnTG5FeHQnOiBicmVhaztcblx0XHRcdFx0Y2FzZSAnTWtyRXh0JzogYnJlYWs7XG5cdFx0XHRcdGNhc2UgJ0NydENvb3B0JzogYnJlYWs7XG5cblx0XHRcdFx0LyogUXVlcnkgVGFibGUgKi9cblx0XHRcdFx0Y2FzZSAnUXNpJzogY2FzZSAnUXNpZic6IGNhc2UgJ1FzaXInOiBjYXNlICdRc2lTWFRhZyc6IGJyZWFrO1xuXHRcdFx0XHRjYXNlICdUeHRRcnknOiBicmVhaztcblxuXHRcdFx0XHQvKiBGaWx0ZXIgKi9cblx0XHRcdFx0Y2FzZSAnRmlsdGVyTW9kZSc6IGJyZWFrO1xuXHRcdFx0XHRjYXNlICdBdXRvRmlsdGVyJzogY2FzZSAnQXV0b0ZpbHRlckluZm8nOiBicmVhaztcblx0XHRcdFx0Y2FzZSAnQXV0b0ZpbHRlcjEyJzogYnJlYWs7XG5cdFx0XHRcdGNhc2UgJ0Ryb3BEb3duT2JqSWRzJzogYnJlYWs7XG5cdFx0XHRcdGNhc2UgJ1NvcnQnOiBicmVhaztcblx0XHRcdFx0Y2FzZSAnU29ydERhdGEnOiBicmVhaztcblxuXHRcdFx0XHQvKiBEcmF3aW5nICovXG5cdFx0XHRcdGNhc2UgJ1NoYXBlUHJvcHNTdHJlYW0nOiBicmVhaztcblx0XHRcdFx0Y2FzZSAnTXNvRHJhd2luZyc6IGNhc2UgJ01zb0RyYXdpbmdHcm91cCc6IGNhc2UgJ01zb0RyYXdpbmdTZWxlY3Rpb24nOiBicmVhaztcblx0XHRcdFx0LyogUHViIFN0dWZmICovXG5cdFx0XHRcdGNhc2UgJ1dlYlB1Yic6IGNhc2UgJ0F1dG9XZWJQdWInOiBicmVhaztcblxuXHRcdFx0XHQvKiBQcmludCBTdHVmZiAqL1xuXHRcdFx0XHRjYXNlICdIZWFkZXJGb290ZXInOiBjYXNlICdIRlBpY3R1cmUnOiBjYXNlICdQTFYnOlxuXHRcdFx0XHRjYXNlICdIb3Jpem9udGFsUGFnZUJyZWFrcyc6IGNhc2UgJ1ZlcnRpY2FsUGFnZUJyZWFrcyc6IGJyZWFrO1xuXHRcdFx0XHQvKiBCZWhhdmlvcmFsICovXG5cdFx0XHRcdGNhc2UgJ0JhY2t1cCc6IGNhc2UgJ0NvbXByZXNzUGljdHVyZXMnOiBjYXNlICdDb21wYXQxMic6IGJyZWFrO1xuXG5cdFx0XHRcdC8qIFNob3VsZCBub3QgSGFwcGVuICovXG5cdFx0XHRcdGNhc2UgJ0NvbnRpbnVlJzogY2FzZSAnQ29udGludWVGcnQxMic6IGJyZWFrO1xuXG5cdFx0XHRcdC8qIEZ1dHVyZSBSZWNvcmRzICovXG5cdFx0XHRcdGNhc2UgJ0ZydEZvbnRMaXN0JzogY2FzZSAnRnJ0V3JhcHBlcic6IGJyZWFrO1xuXG5cdFx0XHRcdGRlZmF1bHQ6IHN3aXRjaChSLm4pIHsgLyogbmVzdGVkICovXG5cdFx0XHRcdC8qIEJJRkY1IHJlY29yZHMgKi9cblx0XHRcdFx0Y2FzZSAnVGFiSWRDb25mJzogY2FzZSAnUmFkYXInOiBjYXNlICdSYWRhckFyZWEnOiBjYXNlICdEcm9wQmFyJzogY2FzZSAnSW50bCc6IGNhc2UgJ0Nvb3JkTGlzdCc6IGNhc2UgJ1NlckF1eEVyckJhcic6IGJyZWFrO1xuXG5cdFx0XHRcdC8qIEJJRkYyLTQgcmVjb3JkcyAqL1xuXHRcdFx0XHRjYXNlICdCSUZGMkZPTlRDTFInOiBjYXNlICdCSUZGMkZNVENOVCc6IGNhc2UgJ0JJRkYyRk9OVFhUUkEnOiBicmVhaztcblx0XHRcdFx0Y2FzZSAnQklGRjJYRic6IGNhc2UgJ0JJRkYzWEYnOiBjYXNlICdCSUZGNFhGJzogYnJlYWs7XG5cdFx0XHRcdGNhc2UgJ0JJRkY0Rk1UQ05UJzogY2FzZSAnQklGRjJST1cnOiBjYXNlICdCSUZGMldJTkRPVzInOiBicmVhaztcblxuXHRcdFx0XHQvKiBNaXNjZWxsYW5lb3VzICovXG5cdFx0XHRcdGNhc2UgJ1NDRU5BUklPJzogY2FzZSAnRENvbkJpbic6IGNhc2UgJ1BpY0YnOiBjYXNlICdEYXRhTGFiRXh0Jzpcblx0XHRcdFx0Y2FzZSAnTGVsJzogY2FzZSAnQm9wUG9wJzogY2FzZSAnQm9wUG9wQ3VzdG9tJzogY2FzZSAnUmVhbFRpbWVEYXRhJzpcblx0XHRcdFx0Y2FzZSAnTmFtZSc6IGJyZWFrO1xuXHRcdFx0XHRjYXNlICdMSE5HcmFwaCc6IGNhc2UgJ0ZuR3JvdXBOYW1lJzogY2FzZSAnQWRkTWVudSc6IGNhc2UgJ0xQcic6IGJyZWFrO1xuXHRcdFx0XHRjYXNlICdMaXN0T2JqJzogY2FzZSAnTGlzdEZpZWxkJzogYnJlYWs7XG5cdFx0XHRcdGNhc2UgJ1JSU29ydCc6IGJyZWFrO1xuXHRcdFx0XHRjYXNlICdCaWdOYW1lJzogYnJlYWs7XG5cdFx0XHRcdGNhc2UgJ1Rvb2xiYXJIZHInOiBjYXNlICdUb29sYmFyRW5kJzogYnJlYWs7XG5cdFx0XHRcdGNhc2UgJ0RERU9iak5hbWUnOiBicmVhaztcblx0XHRcdFx0Y2FzZSAnRlJUQXJjaElkJCc6IGJyZWFrO1xuXHRcdFx0XHRkZWZhdWx0OiBpZihvcHRpb25zLldURikgdGhyb3cgJ1VucmVjb2duaXplZCBSZWNvcmQgJyArIFIubjtcblx0XHRcdH19fX1cblx0XHR9IGVsc2UgYmxvYi5sICs9IGxlbmd0aDtcblx0fVxuXHR3Yi5TaGVldE5hbWVzPWtleXMoRGlyZWN0b3J5KS5zb3J0KGZ1bmN0aW9uKGEsYikgeyByZXR1cm4gTnVtYmVyKGEpIC0gTnVtYmVyKGIpOyB9KS5tYXAoZnVuY3Rpb24oeCl7cmV0dXJuIERpcmVjdG9yeVt4XS5uYW1lO30pO1xuXHRpZighb3B0aW9ucy5ib29rU2hlZXRzKSB3Yi5TaGVldHM9U2hlZXRzO1xuXHRpZih3Yi5TaGVldHMpIEZpbHRlckRhdGFiYXNlcy5mb3JFYWNoKGZ1bmN0aW9uKHIsaSkgeyB3Yi5TaGVldHNbd2IuU2hlZXROYW1lc1tpXV1bJyFhdXRvZmlsdGVyJ10gPSByOyB9KTtcblx0d2IuUHJlYW1ibGU9UHJlYW1ibGU7XG5cdHdiLlN0cmluZ3MgPSBzc3Q7XG5cdHdiLlNTRiA9IFNTRi5nZXRfdGFibGUoKTtcblx0aWYob3B0cy5lbmMpIHdiLkVuY3J5cHRpb24gPSBvcHRzLmVuYztcblx0aWYodGhlbWVzKSB3Yi5UaGVtZXMgPSB0aGVtZXM7XG5cdHdiLk1ldGFkYXRhID0ge307XG5cdGlmKGNvdW50cnkgIT09IHVuZGVmaW5lZCkgd2IuTWV0YWRhdGEuQ291bnRyeSA9IGNvdW50cnk7XG5cdGlmKHN1cGJvb2tzLm5hbWVzLmxlbmd0aCA+IDApIFdvcmtib29rLk5hbWVzID0gc3VwYm9va3MubmFtZXM7XG5cdHdiLldvcmtib29rID0gV29ya2Jvb2s7XG5cdHJldHVybiB3Yjtcbn1cblxuLyogVE9ETzogc3BsaXQgcHJvcHMqL1xudmFyIFBTQ0xTSUQgPSB7XG5cdFNJOiBcImUwODU5ZmYyZjk0ZjY4MTBhYjkxMDgwMDJiMjdiM2Q5XCIsXG5cdERTSTogXCIwMmQ1Y2RkNTljMmUxYjEwOTM5NzA4MDAyYjJjZjlhZVwiLFxuXHRVREk6IFwiMDVkNWNkZDU5YzJlMWIxMDkzOTcwODAwMmIyY2Y5YWVcIlxufTtcbmZ1bmN0aW9uIHBhcnNlX3hsc19wcm9wcyhjZmIsIHByb3BzLCBvKSB7XG5cdC8qIFtNUy1PU0hBUkVEXSAyLjMuMy4yLjIgRG9jdW1lbnQgU3VtbWFyeSBJbmZvcm1hdGlvbiBQcm9wZXJ0eSBTZXQgKi9cblx0dmFyIERTSSA9IENGQi5maW5kKGNmYiwgJyFEb2N1bWVudFN1bW1hcnlJbmZvcm1hdGlvbicpO1xuXHRpZihEU0kgJiYgRFNJLnNpemUgPiAwKSB0cnkge1xuXHRcdHZhciBEb2NTdW1tYXJ5ID0gcGFyc2VfUHJvcGVydHlTZXRTdHJlYW0oRFNJLCBEb2NTdW1tYXJ5UElERFNJLCBQU0NMU0lELkRTSSk7XG5cdFx0Zm9yKHZhciBkIGluIERvY1N1bW1hcnkpIHByb3BzW2RdID0gRG9jU3VtbWFyeVtkXTtcblx0fSBjYXRjaChlKSB7aWYoby5XVEYpIHRocm93IGU7LyogZW1wdHkgKi99XG5cblx0LyogW01TLU9TSEFSRURdIDIuMy4zLjIuMSBTdW1tYXJ5IEluZm9ybWF0aW9uIFByb3BlcnR5IFNldCovXG5cdHZhciBTSSA9IENGQi5maW5kKGNmYiwgJyFTdW1tYXJ5SW5mb3JtYXRpb24nKTtcblx0aWYoU0kgJiYgU0kuc2l6ZSA+IDApIHRyeSB7XG5cdFx0dmFyIFN1bW1hcnkgPSBwYXJzZV9Qcm9wZXJ0eVNldFN0cmVhbShTSSwgU3VtbWFyeVBJRFNJLCBQU0NMU0lELlNJKTtcblx0XHRmb3IodmFyIHMgaW4gU3VtbWFyeSkgaWYocHJvcHNbc10gPT0gbnVsbCkgcHJvcHNbc10gPSBTdW1tYXJ5W3NdO1xuXHR9IGNhdGNoKGUpIHtpZihvLldURikgdGhyb3cgZTsvKiBlbXB0eSAqL31cblxuXHRpZihwcm9wcy5IZWFkaW5nUGFpcnMgJiYgcHJvcHMuVGl0bGVzT2ZQYXJ0cykge1xuXHRcdGxvYWRfcHJvcHNfcGFpcnMocHJvcHMuSGVhZGluZ1BhaXJzLCBwcm9wcy5UaXRsZXNPZlBhcnRzLCBwcm9wcywgbyk7XG5cdFx0ZGVsZXRlIHByb3BzLkhlYWRpbmdQYWlyczsgZGVsZXRlIHByb3BzLlRpdGxlc09mUGFydHM7XG5cdH1cbn1cbmZ1bmN0aW9uIHdyaXRlX3hsc19wcm9wcyh3YiwgY2ZiKSB7XG5cdHZhciBEU0VudHJpZXMgPSBbXSwgU0VudHJpZXMgPSBbXSwgQ0VudHJpZXMgPSBbXTtcblx0dmFyIGkgPSAwLCBLZXlzO1xuXHRpZih3Yi5Qcm9wcykge1xuXHRcdEtleXMgPSBrZXlzKHdiLlByb3BzKTtcblx0XHQvLyAkRmxvd0lnbm9yZVxuXHRcdGZvcihpID0gMDsgaSA8IEtleXMubGVuZ3RoOyArK2kpIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoRG9jU3VtbWFyeVJFLCBLZXlzW2ldKSA/IERTRW50cmllcyA6IE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChTdW1tYXJ5UkUsIEtleXNbaV0pID8gU0VudHJpZXMgOiBDRW50cmllcykucHVzaChbS2V5c1tpXSwgd2IuUHJvcHNbS2V5c1tpXV1dKTtcblx0fVxuXHRpZih3Yi5DdXN0cHJvcHMpIHtcblx0XHRLZXlzID0ga2V5cyh3Yi5DdXN0cHJvcHMpO1xuXHRcdC8vICRGbG93SWdub3JlXG5cdFx0Zm9yKGkgPSAwOyBpIDwgS2V5cy5sZW5ndGg7ICsraSkgaWYoIU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbCgod2IuUHJvcHN8fHt9KSwgS2V5c1tpXSkpIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoRG9jU3VtbWFyeVJFLCBLZXlzW2ldKSA/IERTRW50cmllcyA6IE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChTdW1tYXJ5UkUsIEtleXNbaV0pID8gU0VudHJpZXMgOiBDRW50cmllcykucHVzaChbS2V5c1tpXSwgd2IuQ3VzdHByb3BzW0tleXNbaV1dXSk7XG5cdH1cblx0dmFyIENFbnRyaWVzMiA9IFtdO1xuXHRmb3IoaSA9IDA7IGkgPCBDRW50cmllcy5sZW5ndGg7ICsraSkge1xuXHRcdGlmKFhMU1BTU2tpcC5pbmRleE9mKENFbnRyaWVzW2ldWzBdKSA+IC0xKSBjb250aW51ZTtcblx0XHRpZihDRW50cmllc1tpXVsxXSA9PSBudWxsKSBjb250aW51ZTtcblx0XHRDRW50cmllczIucHVzaChDRW50cmllc1tpXSk7XG5cdH1cblx0aWYoU0VudHJpZXMubGVuZ3RoKSBDRkIudXRpbHMuY2ZiX2FkZChjZmIsIFwiL1xcdTAwMDVTdW1tYXJ5SW5mb3JtYXRpb25cIiwgd3JpdGVfUHJvcGVydHlTZXRTdHJlYW0oU0VudHJpZXMsIFBTQ0xTSUQuU0ksIFN1bW1hcnlSRSwgU3VtbWFyeVBJRFNJKSk7XG5cdGlmKERTRW50cmllcy5sZW5ndGggfHwgQ0VudHJpZXMyLmxlbmd0aCkgQ0ZCLnV0aWxzLmNmYl9hZGQoY2ZiLCBcIi9cXHUwMDA1RG9jdW1lbnRTdW1tYXJ5SW5mb3JtYXRpb25cIiwgd3JpdGVfUHJvcGVydHlTZXRTdHJlYW0oRFNFbnRyaWVzLCBQU0NMU0lELkRTSSwgRG9jU3VtbWFyeVJFLCBEb2NTdW1tYXJ5UElERFNJLCBDRW50cmllczIubGVuZ3RoID8gQ0VudHJpZXMyIDogbnVsbCwgUFNDTFNJRC5VREkpKTtcbn1cblxuZnVuY3Rpb24gcGFyc2VfeGxzY2ZiKGNmYiwgb3B0aW9ucykge1xuaWYoIW9wdGlvbnMpIG9wdGlvbnMgPSB7fTtcbmZpeF9yZWFkX29wdHMob3B0aW9ucyk7XG5yZXNldF9jcCgpO1xuaWYob3B0aW9ucy5jb2RlcGFnZSkgc2V0X2Fuc2kob3B0aW9ucy5jb2RlcGFnZSk7XG52YXIgQ29tcE9iaiwgV0I7XG5pZihjZmIuRnVsbFBhdGhzKSB7XG5cdGlmKENGQi5maW5kKGNmYiwgJy9lbmNyeXB0aW9uJykpIHRocm93IG5ldyBFcnJvcihcIkZpbGUgaXMgcGFzc3dvcmQtcHJvdGVjdGVkXCIpO1xuXHRDb21wT2JqID0gQ0ZCLmZpbmQoY2ZiLCAnIUNvbXBPYmonKTtcblx0V0IgPSBDRkIuZmluZChjZmIsICcvV29ya2Jvb2snKSB8fCBDRkIuZmluZChjZmIsICcvQm9vaycpO1xufSBlbHNlIHtcblx0c3dpdGNoKG9wdGlvbnMudHlwZSkge1xuXHRcdGNhc2UgJ2Jhc2U2NCc6IGNmYiA9IHMyYShCYXNlNjQuZGVjb2RlKGNmYikpOyBicmVhaztcblx0XHRjYXNlICdiaW5hcnknOiBjZmIgPSBzMmEoY2ZiKTsgYnJlYWs7XG5cdFx0Y2FzZSAnYnVmZmVyJzogYnJlYWs7XG5cdFx0Y2FzZSAnYXJyYXknOiBpZighQXJyYXkuaXNBcnJheShjZmIpKSBjZmIgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChjZmIpOyBicmVhaztcblx0fVxuXHRwcmVwX2Jsb2IoY2ZiLCAwKTtcblx0V0IgPSAoe2NvbnRlbnQ6IGNmYn0pO1xufVxudmFyIFdvcmtib29rUDtcblxudmFyIF9kYXRhO1xuaWYoQ29tcE9iaikgcGFyc2VfY29tcG9iaihDb21wT2JqKTtcbmlmKG9wdGlvbnMuYm9va1Byb3BzICYmICFvcHRpb25zLmJvb2tTaGVldHMpIFdvcmtib29rUCA9ICh7fSk7XG5lbHNlIHtcblx0dmFyIFQgPSBoYXNfYnVmID8gJ2J1ZmZlcicgOiAnYXJyYXknO1xuXHRpZihXQiAmJiBXQi5jb250ZW50KSBXb3JrYm9va1AgPSBwYXJzZV93b3JrYm9vayhXQi5jb250ZW50LCBvcHRpb25zKTtcblx0LyogUXVhdHRybyBQcm8gNy04ICovXG5cdGVsc2UgaWYoKF9kYXRhPUNGQi5maW5kKGNmYiwgJ1BlcmZlY3RPZmZpY2VfTUFJTicpKSAmJiBfZGF0YS5jb250ZW50KSBXb3JrYm9va1AgPSBXS18udG9fd29ya2Jvb2soX2RhdGEuY29udGVudCwgKG9wdGlvbnMudHlwZSA9IFQsIG9wdGlvbnMpKTtcblx0LyogUXVhdHRybyBQcm8gOSAqL1xuXHRlbHNlIGlmKChfZGF0YT1DRkIuZmluZChjZmIsICdOYXRpdmVDb250ZW50X01BSU4nKSkgJiYgX2RhdGEuY29udGVudCkgV29ya2Jvb2tQID0gV0tfLnRvX3dvcmtib29rKF9kYXRhLmNvbnRlbnQsIChvcHRpb25zLnR5cGUgPSBULCBvcHRpb25zKSk7XG5cdGVsc2UgdGhyb3cgbmV3IEVycm9yKFwiQ2Fubm90IGZpbmQgV29ya2Jvb2sgc3RyZWFtXCIpO1xuXHRpZihvcHRpb25zLmJvb2tWQkEgJiYgY2ZiLkZ1bGxQYXRocyAmJiBDRkIuZmluZChjZmIsICcvX1ZCQV9QUk9KRUNUX0NVUi9WQkEvZGlyJykpIFdvcmtib29rUC52YmFyYXcgPSBtYWtlX3ZiYV94bHMoY2ZiKTtcbn1cblxudmFyIHByb3BzID0ge307XG5pZihjZmIuRnVsbFBhdGhzKSBwYXJzZV94bHNfcHJvcHMoY2ZiLCBwcm9wcywgb3B0aW9ucyk7XG5cbldvcmtib29rUC5Qcm9wcyA9IFdvcmtib29rUC5DdXN0cHJvcHMgPSBwcm9wczsgLyogVE9ETzogc3BsaXQgdXAgcHJvcGVydGllcyAqL1xuaWYob3B0aW9ucy5ib29rRmlsZXMpIFdvcmtib29rUC5jZmIgPSBjZmI7XG4vKldvcmtib29rUC5Db21wT2JqUCA9IENvbXBPYmpQOyAvLyBUT0RPOiBzdG9yYWdlPyAqL1xucmV0dXJuIFdvcmtib29rUDtcbn1cblxuXG5mdW5jdGlvbiB3cml0ZV94bHNjZmIod2IsIG9wdHMpIHtcblx0dmFyIG8gPSBvcHRzIHx8IHt9O1xuXHR2YXIgY2ZiID0gQ0ZCLnV0aWxzLmNmYl9uZXcoe3Jvb3Q6XCJSXCJ9KTtcblx0dmFyIHdicGF0aCA9IFwiL1dvcmtib29rXCI7XG5cdHN3aXRjaChvLmJvb2tUeXBlIHx8IFwieGxzXCIpIHtcblx0XHRjYXNlIFwieGxzXCI6IG8uYm9va1R5cGUgPSBcImJpZmY4XCI7XG5cdFx0LyogZmFsbHMgdGhyb3VnaCAqL1xuXHRcdGNhc2UgXCJ4bGFcIjogaWYoIW8uYm9va1R5cGUpIG8uYm9va1R5cGUgPSBcInhsYVwiO1xuXHRcdC8qIGZhbGxzIHRocm91Z2ggKi9cblx0XHRjYXNlIFwiYmlmZjhcIjogd2JwYXRoID0gXCIvV29ya2Jvb2tcIjsgby5iaWZmID0gODsgYnJlYWs7XG5cdFx0Y2FzZSBcImJpZmY1XCI6IHdicGF0aCA9IFwiL0Jvb2tcIjsgby5iaWZmID0gNTsgYnJlYWs7XG5cdFx0ZGVmYXVsdDogdGhyb3cgbmV3IEVycm9yKFwiaW52YWxpZCB0eXBlIFwiICsgby5ib29rVHlwZSArIFwiIGZvciBYTFMgQ0ZCXCIpO1xuXHR9XG5cdENGQi51dGlscy5jZmJfYWRkKGNmYiwgd2JwYXRoLCB3cml0ZV9iaWZmX2J1Zih3YiwgbykpO1xuXHRpZihvLmJpZmYgPT0gOCAmJiAod2IuUHJvcHMgfHwgd2IuQ3VzdHByb3BzKSkgd3JpdGVfeGxzX3Byb3BzKHdiLCBjZmIpO1xuXHQvLyBUT0RPOiBTSSwgRFNJLCBDT1xuXHRpZihvLmJpZmYgPT0gOCAmJiB3Yi52YmFyYXcpIGZpbGxfdmJhX3hscyhjZmIsIENGQi5yZWFkKHdiLnZiYXJhdywge3R5cGU6IHR5cGVvZiB3Yi52YmFyYXcgPT0gXCJzdHJpbmdcIiA/IFwiYmluYXJ5XCIgOiBcImJ1ZmZlclwifSkpO1xuXHRyZXR1cm4gY2ZiO1xufVxuLyogW01TLVhMU0JdIDIuMyBSZWNvcmQgRW51bWVyYXRpb24gKi9cbnZhciBYTFNCUmVjb3JkRW51bSA9IHtcbjB4MDAwMDogeyBuOlwiQnJ0Um93SGRyXCIsIGY6cGFyc2VfQnJ0Um93SGRyIH0sXG4weDAwMDE6IHsgbjpcIkJydENlbGxCbGFua1wiLCBmOnBhcnNlX0JydENlbGxCbGFuayB9LFxuMHgwMDAyOiB7IG46XCJCcnRDZWxsUmtcIiwgZjpwYXJzZV9CcnRDZWxsUmsgfSxcbjB4MDAwMzogeyBuOlwiQnJ0Q2VsbEVycm9yXCIsIGY6cGFyc2VfQnJ0Q2VsbEVycm9yIH0sXG4weDAwMDQ6IHsgbjpcIkJydENlbGxCb29sXCIsIGY6cGFyc2VfQnJ0Q2VsbEJvb2wgfSxcbjB4MDAwNTogeyBuOlwiQnJ0Q2VsbFJlYWxcIiwgZjpwYXJzZV9CcnRDZWxsUmVhbCB9LFxuMHgwMDA2OiB7IG46XCJCcnRDZWxsU3RcIiwgZjpwYXJzZV9CcnRDZWxsU3QgfSxcbjB4MDAwNzogeyBuOlwiQnJ0Q2VsbElzc3RcIiwgZjpwYXJzZV9CcnRDZWxsSXNzdCB9LFxuMHgwMDA4OiB7IG46XCJCcnRGbWxhU3RyaW5nXCIsIGY6cGFyc2VfQnJ0Rm1sYVN0cmluZyB9LFxuMHgwMDA5OiB7IG46XCJCcnRGbWxhTnVtXCIsIGY6cGFyc2VfQnJ0Rm1sYU51bSB9LFxuMHgwMDBBOiB7IG46XCJCcnRGbWxhQm9vbFwiLCBmOnBhcnNlX0JydEZtbGFCb29sIH0sXG4weDAwMEI6IHsgbjpcIkJydEZtbGFFcnJvclwiLCBmOnBhcnNlX0JydEZtbGFFcnJvciB9LFxuMHgwMDBDOiB7IG46XCJCcnRTaG9ydEJsYW5rXCIsIGY6cGFyc2VfQnJ0U2hvcnRCbGFuayB9LFxuMHgwMDBEOiB7IG46XCJCcnRTaG9ydFJrXCIsIGY6cGFyc2VfQnJ0U2hvcnRSayB9LFxuMHgwMDBFOiB7IG46XCJCcnRTaG9ydEVycm9yXCIsIGY6cGFyc2VfQnJ0U2hvcnRFcnJvciB9LFxuMHgwMDBGOiB7IG46XCJCcnRTaG9ydEJvb2xcIiwgZjpwYXJzZV9CcnRTaG9ydEJvb2wgfSxcbjB4MDAxMDogeyBuOlwiQnJ0U2hvcnRSZWFsXCIsIGY6cGFyc2VfQnJ0U2hvcnRSZWFsIH0sXG4weDAwMTE6IHsgbjpcIkJydFNob3J0U3RcIiwgZjpwYXJzZV9CcnRTaG9ydFN0IH0sXG4weDAwMTI6IHsgbjpcIkJydFNob3J0SXNzdFwiLCBmOnBhcnNlX0JydFNob3J0SXNzdCB9LFxuMHgwMDEzOiB7IG46XCJCcnRTU1RJdGVtXCIsIGY6cGFyc2VfUmljaFN0ciB9LFxuMHgwMDE0OiB7IG46XCJCcnRQQ0RJTWlzc2luZ1wiIH0sXG4weDAwMTU6IHsgbjpcIkJydFBDRElOdW1iZXJcIiB9LFxuMHgwMDE2OiB7IG46XCJCcnRQQ0RJQm9vbGVhblwiIH0sXG4weDAwMTc6IHsgbjpcIkJydFBDRElFcnJvclwiIH0sXG4weDAwMTg6IHsgbjpcIkJydFBDRElTdHJpbmdcIiB9LFxuMHgwMDE5OiB7IG46XCJCcnRQQ0RJRGF0ZXRpbWVcIiB9LFxuMHgwMDFBOiB7IG46XCJCcnRQQ0RJSW5kZXhcIiB9LFxuMHgwMDFCOiB7IG46XCJCcnRQQ0RJQU1pc3NpbmdcIiB9LFxuMHgwMDFDOiB7IG46XCJCcnRQQ0RJQU51bWJlclwiIH0sXG4weDAwMUQ6IHsgbjpcIkJydFBDRElBQm9vbGVhblwiIH0sXG4weDAwMUU6IHsgbjpcIkJydFBDRElBRXJyb3JcIiB9LFxuMHgwMDFGOiB7IG46XCJCcnRQQ0RJQVN0cmluZ1wiIH0sXG4weDAwMjA6IHsgbjpcIkJydFBDRElBRGF0ZXRpbWVcIiB9LFxuMHgwMDIxOiB7IG46XCJCcnRQQ1JSZWNvcmRcIiB9LFxuMHgwMDIyOiB7IG46XCJCcnRQQ1JSZWNvcmREdFwiIH0sXG4weDAwMjM6IHsgbjpcIkJydEZSVEJlZ2luXCIgfSxcbjB4MDAyNDogeyBuOlwiQnJ0RlJURW5kXCIgfSxcbjB4MDAyNTogeyBuOlwiQnJ0QUNCZWdpblwiIH0sXG4weDAwMjY6IHsgbjpcIkJydEFDRW5kXCIgfSxcbjB4MDAyNzogeyBuOlwiQnJ0TmFtZVwiLCBmOnBhcnNlX0JydE5hbWUgfSxcbjB4MDAyODogeyBuOlwiQnJ0SW5kZXhSb3dCbG9ja1wiIH0sXG4weDAwMkE6IHsgbjpcIkJydEluZGV4QmxvY2tcIiB9LFxuMHgwMDJCOiB7IG46XCJCcnRGb250XCIsIGY6cGFyc2VfQnJ0Rm9udCB9LFxuMHgwMDJDOiB7IG46XCJCcnRGbXRcIiwgZjpwYXJzZV9CcnRGbXQgfSxcbjB4MDAyRDogeyBuOlwiQnJ0RmlsbFwiLCBmOnBhcnNlX0JydEZpbGwgfSxcbjB4MDAyRTogeyBuOlwiQnJ0Qm9yZGVyXCIsIGY6cGFyc2VfQnJ0Qm9yZGVyIH0sXG4weDAwMkY6IHsgbjpcIkJydFhGXCIsIGY6cGFyc2VfQnJ0WEYgfSxcbjB4MDAzMDogeyBuOlwiQnJ0U3R5bGVcIiB9LFxuMHgwMDMxOiB7IG46XCJCcnRDZWxsTWV0YVwiIH0sXG4weDAwMzI6IHsgbjpcIkJydFZhbHVlTWV0YVwiIH0sXG4weDAwMzM6IHsgbjpcIkJydE1kYlwiIH0sXG4weDAwMzQ6IHsgbjpcIkJydEJlZ2luRm1kXCIgfSxcbjB4MDAzNTogeyBuOlwiQnJ0RW5kRm1kXCIgfSxcbjB4MDAzNjogeyBuOlwiQnJ0QmVnaW5NZHhcIiB9LFxuMHgwMDM3OiB7IG46XCJCcnRFbmRNZHhcIiB9LFxuMHgwMDM4OiB7IG46XCJCcnRCZWdpbk1keFR1cGxlXCIgfSxcbjB4MDAzOTogeyBuOlwiQnJ0RW5kTWR4VHVwbGVcIiB9LFxuMHgwMDNBOiB7IG46XCJCcnRNZHhNYnJJc3RyXCIgfSxcbjB4MDAzQjogeyBuOlwiQnJ0U3RyXCIgfSxcbjB4MDAzQzogeyBuOlwiQnJ0Q29sSW5mb1wiLCBmOnBhcnNlX0NvbEluZm8gfSxcbjB4MDAzRTogeyBuOlwiQnJ0Q2VsbFJTdHJpbmdcIiB9LFxuMHgwMDNGOiB7IG46XCJCcnRDYWxjQ2hhaW5JdGVtJFwiLCBmOnBhcnNlX0JydENhbGNDaGFpbkl0ZW0kIH0sXG4weDAwNDA6IHsgbjpcIkJydERWYWxcIiwgZjpwYXJzZV9CcnREVmFsIH0sXG4weDAwNDE6IHsgbjpcIkJydFN4dmNlbGxOdW1cIiB9LFxuMHgwMDQyOiB7IG46XCJCcnRTeHZjZWxsU3RyXCIgfSxcbjB4MDA0MzogeyBuOlwiQnJ0U3h2Y2VsbEJvb2xcIiB9LFxuMHgwMDQ0OiB7IG46XCJCcnRTeHZjZWxsRXJyXCIgfSxcbjB4MDA0NTogeyBuOlwiQnJ0U3h2Y2VsbERhdGVcIiB9LFxuMHgwMDQ2OiB7IG46XCJCcnRTeHZjZWxsTmlsXCIgfSxcbjB4MDA4MDogeyBuOlwiQnJ0RmlsZVZlcnNpb25cIiB9LFxuMHgwMDgxOiB7IG46XCJCcnRCZWdpblNoZWV0XCIgfSxcbjB4MDA4MjogeyBuOlwiQnJ0RW5kU2hlZXRcIiB9LFxuMHgwMDgzOiB7IG46XCJCcnRCZWdpbkJvb2tcIiwgZjpwYXJzZW5vb3AsIHA6MCB9LFxuMHgwMDg0OiB7IG46XCJCcnRFbmRCb29rXCIgfSxcbjB4MDA4NTogeyBuOlwiQnJ0QmVnaW5Xc1ZpZXdzXCIgfSxcbjB4MDA4NjogeyBuOlwiQnJ0RW5kV3NWaWV3c1wiIH0sXG4weDAwODc6IHsgbjpcIkJydEJlZ2luQm9va1ZpZXdzXCIgfSxcbjB4MDA4ODogeyBuOlwiQnJ0RW5kQm9va1ZpZXdzXCIgfSxcbjB4MDA4OTogeyBuOlwiQnJ0QmVnaW5Xc1ZpZXdcIiwgZjpwYXJzZV9CcnRCZWdpbldzVmlldyB9LFxuMHgwMDhBOiB7IG46XCJCcnRFbmRXc1ZpZXdcIiB9LFxuMHgwMDhCOiB7IG46XCJCcnRCZWdpbkNzVmlld3NcIiB9LFxuMHgwMDhDOiB7IG46XCJCcnRFbmRDc1ZpZXdzXCIgfSxcbjB4MDA4RDogeyBuOlwiQnJ0QmVnaW5Dc1ZpZXdcIiB9LFxuMHgwMDhFOiB7IG46XCJCcnRFbmRDc1ZpZXdcIiB9LFxuMHgwMDhGOiB7IG46XCJCcnRCZWdpbkJ1bmRsZVNoc1wiIH0sXG4weDAwOTA6IHsgbjpcIkJydEVuZEJ1bmRsZVNoc1wiIH0sXG4weDAwOTE6IHsgbjpcIkJydEJlZ2luU2hlZXREYXRhXCIgfSxcbjB4MDA5MjogeyBuOlwiQnJ0RW5kU2hlZXREYXRhXCIgfSxcbjB4MDA5MzogeyBuOlwiQnJ0V3NQcm9wXCIsIGY6cGFyc2VfQnJ0V3NQcm9wIH0sXG4weDAwOTQ6IHsgbjpcIkJydFdzRGltXCIsIGY6cGFyc2VfQnJ0V3NEaW0sIHA6MTYgfSxcbjB4MDA5NzogeyBuOlwiQnJ0UGFuZVwiLCBmOnBhcnNlX0JydFBhbmUgfSxcbjB4MDA5ODogeyBuOlwiQnJ0U2VsXCIgfSxcbjB4MDA5OTogeyBuOlwiQnJ0V2JQcm9wXCIsIGY6cGFyc2VfQnJ0V2JQcm9wIH0sXG4weDAwOUE6IHsgbjpcIkJydFdiRmFjdG9pZFwiIH0sXG4weDAwOUI6IHsgbjpcIkJydEZpbGVSZWNvdmVyXCIgfSxcbjB4MDA5QzogeyBuOlwiQnJ0QnVuZGxlU2hcIiwgZjpwYXJzZV9CcnRCdW5kbGVTaCB9LFxuMHgwMDlEOiB7IG46XCJCcnRDYWxjUHJvcFwiIH0sXG4weDAwOUU6IHsgbjpcIkJydEJvb2tWaWV3XCIgfSxcbjB4MDA5RjogeyBuOlwiQnJ0QmVnaW5Tc3RcIiwgZjpwYXJzZV9CcnRCZWdpblNzdCB9LFxuMHgwMEEwOiB7IG46XCJCcnRFbmRTc3RcIiB9LFxuMHgwMEExOiB7IG46XCJCcnRCZWdpbkFGaWx0ZXJcIiwgZjpwYXJzZV9VbmNoZWNrZWRSZlggfSxcbjB4MDBBMjogeyBuOlwiQnJ0RW5kQUZpbHRlclwiIH0sXG4weDAwQTM6IHsgbjpcIkJydEJlZ2luRmlsdGVyQ29sdW1uXCIgfSxcbjB4MDBBNDogeyBuOlwiQnJ0RW5kRmlsdGVyQ29sdW1uXCIgfSxcbjB4MDBBNTogeyBuOlwiQnJ0QmVnaW5GaWx0ZXJzXCIgfSxcbjB4MDBBNjogeyBuOlwiQnJ0RW5kRmlsdGVyc1wiIH0sXG4weDAwQTc6IHsgbjpcIkJydEZpbHRlclwiIH0sXG4weDAwQTg6IHsgbjpcIkJydENvbG9yRmlsdGVyXCIgfSxcbjB4MDBBOTogeyBuOlwiQnJ0SWNvbkZpbHRlclwiIH0sXG4weDAwQUE6IHsgbjpcIkJydFRvcDEwRmlsdGVyXCIgfSxcbjB4MDBBQjogeyBuOlwiQnJ0RHluYW1pY0ZpbHRlclwiIH0sXG4weDAwQUM6IHsgbjpcIkJydEJlZ2luQ3VzdG9tRmlsdGVyc1wiIH0sXG4weDAwQUQ6IHsgbjpcIkJydEVuZEN1c3RvbUZpbHRlcnNcIiB9LFxuMHgwMEFFOiB7IG46XCJCcnRDdXN0b21GaWx0ZXJcIiB9LFxuMHgwMEFGOiB7IG46XCJCcnRBRmlsdGVyRGF0ZUdyb3VwSXRlbVwiIH0sXG4weDAwQjA6IHsgbjpcIkJydE1lcmdlQ2VsbFwiLCBmOnBhcnNlX0JydE1lcmdlQ2VsbCB9LFxuMHgwMEIxOiB7IG46XCJCcnRCZWdpbk1lcmdlQ2VsbHNcIiB9LFxuMHgwMEIyOiB7IG46XCJCcnRFbmRNZXJnZUNlbGxzXCIgfSxcbjB4MDBCMzogeyBuOlwiQnJ0QmVnaW5QaXZvdENhY2hlRGVmXCIgfSxcbjB4MDBCNDogeyBuOlwiQnJ0RW5kUGl2b3RDYWNoZURlZlwiIH0sXG4weDAwQjU6IHsgbjpcIkJydEJlZ2luUENERmllbGRzXCIgfSxcbjB4MDBCNjogeyBuOlwiQnJ0RW5kUENERmllbGRzXCIgfSxcbjB4MDBCNzogeyBuOlwiQnJ0QmVnaW5QQ0RGaWVsZFwiIH0sXG4weDAwQjg6IHsgbjpcIkJydEVuZFBDREZpZWxkXCIgfSxcbjB4MDBCOTogeyBuOlwiQnJ0QmVnaW5QQ0RTb3VyY2VcIiB9LFxuMHgwMEJBOiB7IG46XCJCcnRFbmRQQ0RTb3VyY2VcIiB9LFxuMHgwMEJCOiB7IG46XCJCcnRCZWdpblBDRFNSYW5nZVwiIH0sXG4weDAwQkM6IHsgbjpcIkJydEVuZFBDRFNSYW5nZVwiIH0sXG4weDAwQkQ6IHsgbjpcIkJydEJlZ2luUENERkF0YmxcIiB9LFxuMHgwMEJFOiB7IG46XCJCcnRFbmRQQ0RGQXRibFwiIH0sXG4weDAwQkY6IHsgbjpcIkJydEJlZ2luUENESVJ1blwiIH0sXG4weDAwQzA6IHsgbjpcIkJydEVuZFBDRElSdW5cIiB9LFxuMHgwMEMxOiB7IG46XCJCcnRCZWdpblBpdm90Q2FjaGVSZWNvcmRzXCIgfSxcbjB4MDBDMjogeyBuOlwiQnJ0RW5kUGl2b3RDYWNoZVJlY29yZHNcIiB9LFxuMHgwMEMzOiB7IG46XCJCcnRCZWdpblBDREhpZXJhcmNoaWVzXCIgfSxcbjB4MDBDNDogeyBuOlwiQnJ0RW5kUENESGllcmFyY2hpZXNcIiB9LFxuMHgwMEM1OiB7IG46XCJCcnRCZWdpblBDREhpZXJhcmNoeVwiIH0sXG4weDAwQzY6IHsgbjpcIkJydEVuZFBDREhpZXJhcmNoeVwiIH0sXG4weDAwQzc6IHsgbjpcIkJydEJlZ2luUENESEZpZWxkc1VzYWdlXCIgfSxcbjB4MDBDODogeyBuOlwiQnJ0RW5kUENESEZpZWxkc1VzYWdlXCIgfSxcbjB4MDBDOTogeyBuOlwiQnJ0QmVnaW5FeHRDb25uZWN0aW9uXCIgfSxcbjB4MDBDQTogeyBuOlwiQnJ0RW5kRXh0Q29ubmVjdGlvblwiIH0sXG4weDAwQ0I6IHsgbjpcIkJydEJlZ2luRUNEYlByb3BzXCIgfSxcbjB4MDBDQzogeyBuOlwiQnJ0RW5kRUNEYlByb3BzXCIgfSxcbjB4MDBDRDogeyBuOlwiQnJ0QmVnaW5FQ09sYXBQcm9wc1wiIH0sXG4weDAwQ0U6IHsgbjpcIkJydEVuZEVDT2xhcFByb3BzXCIgfSxcbjB4MDBDRjogeyBuOlwiQnJ0QmVnaW5QQ0RTQ29uc29sXCIgfSxcbjB4MDBEMDogeyBuOlwiQnJ0RW5kUENEU0NvbnNvbFwiIH0sXG4weDAwRDE6IHsgbjpcIkJydEJlZ2luUENEU0NQYWdlc1wiIH0sXG4weDAwRDI6IHsgbjpcIkJydEVuZFBDRFNDUGFnZXNcIiB9LFxuMHgwMEQzOiB7IG46XCJCcnRCZWdpblBDRFNDUGFnZVwiIH0sXG4weDAwRDQ6IHsgbjpcIkJydEVuZFBDRFNDUGFnZVwiIH0sXG4weDAwRDU6IHsgbjpcIkJydEJlZ2luUENEU0NQSXRlbVwiIH0sXG4weDAwRDY6IHsgbjpcIkJydEVuZFBDRFNDUEl0ZW1cIiB9LFxuMHgwMEQ3OiB7IG46XCJCcnRCZWdpblBDRFNDU2V0c1wiIH0sXG4weDAwRDg6IHsgbjpcIkJydEVuZFBDRFNDU2V0c1wiIH0sXG4weDAwRDk6IHsgbjpcIkJydEJlZ2luUENEU0NTZXRcIiB9LFxuMHgwMERBOiB7IG46XCJCcnRFbmRQQ0RTQ1NldFwiIH0sXG4weDAwREI6IHsgbjpcIkJydEJlZ2luUENERkdyb3VwXCIgfSxcbjB4MDBEQzogeyBuOlwiQnJ0RW5kUENERkdyb3VwXCIgfSxcbjB4MDBERDogeyBuOlwiQnJ0QmVnaW5QQ0RGR0l0ZW1zXCIgfSxcbjB4MDBERTogeyBuOlwiQnJ0RW5kUENERkdJdGVtc1wiIH0sXG4weDAwREY6IHsgbjpcIkJydEJlZ2luUENERkdSYW5nZVwiIH0sXG4weDAwRTA6IHsgbjpcIkJydEVuZFBDREZHUmFuZ2VcIiB9LFxuMHgwMEUxOiB7IG46XCJCcnRCZWdpblBDREZHRGlzY3JldGVcIiB9LFxuMHgwMEUyOiB7IG46XCJCcnRFbmRQQ0RGR0Rpc2NyZXRlXCIgfSxcbjB4MDBFMzogeyBuOlwiQnJ0QmVnaW5QQ0RTRFR1cGxlQ2FjaGVcIiB9LFxuMHgwMEU0OiB7IG46XCJCcnRFbmRQQ0RTRFR1cGxlQ2FjaGVcIiB9LFxuMHgwMEU1OiB7IG46XCJCcnRCZWdpblBDRFNEVENFbnRyaWVzXCIgfSxcbjB4MDBFNjogeyBuOlwiQnJ0RW5kUENEU0RUQ0VudHJpZXNcIiB9LFxuMHgwMEU3OiB7IG46XCJCcnRCZWdpblBDRFNEVENFTWVtYmVyc1wiIH0sXG4weDAwRTg6IHsgbjpcIkJydEVuZFBDRFNEVENFTWVtYmVyc1wiIH0sXG4weDAwRTk6IHsgbjpcIkJydEJlZ2luUENEU0RUQ0VNZW1iZXJcIiB9LFxuMHgwMEVBOiB7IG46XCJCcnRFbmRQQ0RTRFRDRU1lbWJlclwiIH0sXG4weDAwRUI6IHsgbjpcIkJydEJlZ2luUENEU0RUQ1F1ZXJpZXNcIiB9LFxuMHgwMEVDOiB7IG46XCJCcnRFbmRQQ0RTRFRDUXVlcmllc1wiIH0sXG4weDAwRUQ6IHsgbjpcIkJydEJlZ2luUENEU0RUQ1F1ZXJ5XCIgfSxcbjB4MDBFRTogeyBuOlwiQnJ0RW5kUENEU0RUQ1F1ZXJ5XCIgfSxcbjB4MDBFRjogeyBuOlwiQnJ0QmVnaW5QQ0RTRFRDU2V0c1wiIH0sXG4weDAwRjA6IHsgbjpcIkJydEVuZFBDRFNEVENTZXRzXCIgfSxcbjB4MDBGMTogeyBuOlwiQnJ0QmVnaW5QQ0RTRFRDU2V0XCIgfSxcbjB4MDBGMjogeyBuOlwiQnJ0RW5kUENEU0RUQ1NldFwiIH0sXG4weDAwRjM6IHsgbjpcIkJydEJlZ2luUENEQ2FsY0l0ZW1zXCIgfSxcbjB4MDBGNDogeyBuOlwiQnJ0RW5kUENEQ2FsY0l0ZW1zXCIgfSxcbjB4MDBGNTogeyBuOlwiQnJ0QmVnaW5QQ0RDYWxjSXRlbVwiIH0sXG4weDAwRjY6IHsgbjpcIkJydEVuZFBDRENhbGNJdGVtXCIgfSxcbjB4MDBGNzogeyBuOlwiQnJ0QmVnaW5QUnVsZVwiIH0sXG4weDAwRjg6IHsgbjpcIkJydEVuZFBSdWxlXCIgfSxcbjB4MDBGOTogeyBuOlwiQnJ0QmVnaW5QUkZpbHRlcnNcIiB9LFxuMHgwMEZBOiB7IG46XCJCcnRFbmRQUkZpbHRlcnNcIiB9LFxuMHgwMEZCOiB7IG46XCJCcnRCZWdpblBSRmlsdGVyXCIgfSxcbjB4MDBGQzogeyBuOlwiQnJ0RW5kUFJGaWx0ZXJcIiB9LFxuMHgwMEZEOiB7IG46XCJCcnRCZWdpblBOYW1lc1wiIH0sXG4weDAwRkU6IHsgbjpcIkJydEVuZFBOYW1lc1wiIH0sXG4weDAwRkY6IHsgbjpcIkJydEJlZ2luUE5hbWVcIiB9LFxuMHgwMTAwOiB7IG46XCJCcnRFbmRQTmFtZVwiIH0sXG4weDAxMDE6IHsgbjpcIkJydEJlZ2luUE5QYWlyc1wiIH0sXG4weDAxMDI6IHsgbjpcIkJydEVuZFBOUGFpcnNcIiB9LFxuMHgwMTAzOiB7IG46XCJCcnRCZWdpblBOUGFpclwiIH0sXG4weDAxMDQ6IHsgbjpcIkJydEVuZFBOUGFpclwiIH0sXG4weDAxMDU6IHsgbjpcIkJydEJlZ2luRUNXZWJQcm9wc1wiIH0sXG4weDAxMDY6IHsgbjpcIkJydEVuZEVDV2ViUHJvcHNcIiB9LFxuMHgwMTA3OiB7IG46XCJCcnRCZWdpbkVjV3BUYWJsZXNcIiB9LFxuMHgwMTA4OiB7IG46XCJCcnRFbmRFQ1dQVGFibGVzXCIgfSxcbjB4MDEwOTogeyBuOlwiQnJ0QmVnaW5FQ1BhcmFtc1wiIH0sXG4weDAxMEE6IHsgbjpcIkJydEVuZEVDUGFyYW1zXCIgfSxcbjB4MDEwQjogeyBuOlwiQnJ0QmVnaW5FQ1BhcmFtXCIgfSxcbjB4MDEwQzogeyBuOlwiQnJ0RW5kRUNQYXJhbVwiIH0sXG4weDAxMEQ6IHsgbjpcIkJydEJlZ2luUENES1BJc1wiIH0sXG4weDAxMEU6IHsgbjpcIkJydEVuZFBDREtQSXNcIiB9LFxuMHgwMTBGOiB7IG46XCJCcnRCZWdpblBDREtQSVwiIH0sXG4weDAxMTA6IHsgbjpcIkJydEVuZFBDREtQSVwiIH0sXG4weDAxMTE6IHsgbjpcIkJydEJlZ2luRGltc1wiIH0sXG4weDAxMTI6IHsgbjpcIkJydEVuZERpbXNcIiB9LFxuMHgwMTEzOiB7IG46XCJCcnRCZWdpbkRpbVwiIH0sXG4weDAxMTQ6IHsgbjpcIkJydEVuZERpbVwiIH0sXG4weDAxMTU6IHsgbjpcIkJydEluZGV4UGFydEVuZFwiIH0sXG4weDAxMTY6IHsgbjpcIkJydEJlZ2luU3R5bGVTaGVldFwiIH0sXG4weDAxMTc6IHsgbjpcIkJydEVuZFN0eWxlU2hlZXRcIiB9LFxuMHgwMTE4OiB7IG46XCJCcnRCZWdpblNYVmlld1wiIH0sXG4weDAxMTk6IHsgbjpcIkJydEVuZFNYVklcIiB9LFxuMHgwMTFBOiB7IG46XCJCcnRCZWdpblNYVklcIiB9LFxuMHgwMTFCOiB7IG46XCJCcnRCZWdpblNYVklzXCIgfSxcbjB4MDExQzogeyBuOlwiQnJ0RW5kU1hWSXNcIiB9LFxuMHgwMTFEOiB7IG46XCJCcnRCZWdpblNYVkRcIiB9LFxuMHgwMTFFOiB7IG46XCJCcnRFbmRTWFZEXCIgfSxcbjB4MDExRjogeyBuOlwiQnJ0QmVnaW5TWFZEc1wiIH0sXG4weDAxMjA6IHsgbjpcIkJydEVuZFNYVkRzXCIgfSxcbjB4MDEyMTogeyBuOlwiQnJ0QmVnaW5TWFBJXCIgfSxcbjB4MDEyMjogeyBuOlwiQnJ0RW5kU1hQSVwiIH0sXG4weDAxMjM6IHsgbjpcIkJydEJlZ2luU1hQSXNcIiB9LFxuMHgwMTI0OiB7IG46XCJCcnRFbmRTWFBJc1wiIH0sXG4weDAxMjU6IHsgbjpcIkJydEJlZ2luU1hESVwiIH0sXG4weDAxMjY6IHsgbjpcIkJydEVuZFNYRElcIiB9LFxuMHgwMTI3OiB7IG46XCJCcnRCZWdpblNYRElzXCIgfSxcbjB4MDEyODogeyBuOlwiQnJ0RW5kU1hESXNcIiB9LFxuMHgwMTI5OiB7IG46XCJCcnRCZWdpblNYTElcIiB9LFxuMHgwMTJBOiB7IG46XCJCcnRFbmRTWExJXCIgfSxcbjB4MDEyQjogeyBuOlwiQnJ0QmVnaW5TWExJUndzXCIgfSxcbjB4MDEyQzogeyBuOlwiQnJ0RW5kU1hMSVJ3c1wiIH0sXG4weDAxMkQ6IHsgbjpcIkJydEJlZ2luU1hMSUNvbHNcIiB9LFxuMHgwMTJFOiB7IG46XCJCcnRFbmRTWExJQ29sc1wiIH0sXG4weDAxMkY6IHsgbjpcIkJydEJlZ2luU1hGb3JtYXRcIiB9LFxuMHgwMTMwOiB7IG46XCJCcnRFbmRTWEZvcm1hdFwiIH0sXG4weDAxMzE6IHsgbjpcIkJydEJlZ2luU1hGb3JtYXRzXCIgfSxcbjB4MDEzMjogeyBuOlwiQnJ0RW5kU3hGb3JtYXRzXCIgfSxcbjB4MDEzMzogeyBuOlwiQnJ0QmVnaW5TeFNlbGVjdFwiIH0sXG4weDAxMzQ6IHsgbjpcIkJydEVuZFN4U2VsZWN0XCIgfSxcbjB4MDEzNTogeyBuOlwiQnJ0QmVnaW5JU1hWRFJ3c1wiIH0sXG4weDAxMzY6IHsgbjpcIkJydEVuZElTWFZEUndzXCIgfSxcbjB4MDEzNzogeyBuOlwiQnJ0QmVnaW5JU1hWRENvbHNcIiB9LFxuMHgwMTM4OiB7IG46XCJCcnRFbmRJU1hWRENvbHNcIiB9LFxuMHgwMTM5OiB7IG46XCJCcnRFbmRTWExvY2F0aW9uXCIgfSxcbjB4MDEzQTogeyBuOlwiQnJ0QmVnaW5TWExvY2F0aW9uXCIgfSxcbjB4MDEzQjogeyBuOlwiQnJ0RW5kU1hWaWV3XCIgfSxcbjB4MDEzQzogeyBuOlwiQnJ0QmVnaW5TWFRIc1wiIH0sXG4weDAxM0Q6IHsgbjpcIkJydEVuZFNYVEhzXCIgfSxcbjB4MDEzRTogeyBuOlwiQnJ0QmVnaW5TWFRIXCIgfSxcbjB4MDEzRjogeyBuOlwiQnJ0RW5kU1hUSFwiIH0sXG4weDAxNDA6IHsgbjpcIkJydEJlZ2luSVNYVEhSd3NcIiB9LFxuMHgwMTQxOiB7IG46XCJCcnRFbmRJU1hUSFJ3c1wiIH0sXG4weDAxNDI6IHsgbjpcIkJydEJlZ2luSVNYVEhDb2xzXCIgfSxcbjB4MDE0MzogeyBuOlwiQnJ0RW5kSVNYVEhDb2xzXCIgfSxcbjB4MDE0NDogeyBuOlwiQnJ0QmVnaW5TWFRETVBTXCIgfSxcbjB4MDE0NTogeyBuOlwiQnJ0RW5kU1hURE1Qc1wiIH0sXG4weDAxNDY6IHsgbjpcIkJydEJlZ2luU1hURE1QXCIgfSxcbjB4MDE0NzogeyBuOlwiQnJ0RW5kU1hURE1QXCIgfSxcbjB4MDE0ODogeyBuOlwiQnJ0QmVnaW5TWFRISXRlbXNcIiB9LFxuMHgwMTQ5OiB7IG46XCJCcnRFbmRTWFRISXRlbXNcIiB9LFxuMHgwMTRBOiB7IG46XCJCcnRCZWdpblNYVEhJdGVtXCIgfSxcbjB4MDE0QjogeyBuOlwiQnJ0RW5kU1hUSEl0ZW1cIiB9LFxuMHgwMTRDOiB7IG46XCJCcnRCZWdpbk1ldGFkYXRhXCIgfSxcbjB4MDE0RDogeyBuOlwiQnJ0RW5kTWV0YWRhdGFcIiB9LFxuMHgwMTRFOiB7IG46XCJCcnRCZWdpbkVzbWR0aW5mb1wiIH0sXG4weDAxNEY6IHsgbjpcIkJydE1kdGluZm9cIiB9LFxuMHgwMTUwOiB7IG46XCJCcnRFbmRFc21kdGluZm9cIiB9LFxuMHgwMTUxOiB7IG46XCJCcnRCZWdpbkVzbWRiXCIgfSxcbjB4MDE1MjogeyBuOlwiQnJ0RW5kRXNtZGJcIiB9LFxuMHgwMTUzOiB7IG46XCJCcnRCZWdpbkVzZm1kXCIgfSxcbjB4MDE1NDogeyBuOlwiQnJ0RW5kRXNmbWRcIiB9LFxuMHgwMTU1OiB7IG46XCJCcnRCZWdpblNpbmdsZUNlbGxzXCIgfSxcbjB4MDE1NjogeyBuOlwiQnJ0RW5kU2luZ2xlQ2VsbHNcIiB9LFxuMHgwMTU3OiB7IG46XCJCcnRCZWdpbkxpc3RcIiB9LFxuMHgwMTU4OiB7IG46XCJCcnRFbmRMaXN0XCIgfSxcbjB4MDE1OTogeyBuOlwiQnJ0QmVnaW5MaXN0Q29sc1wiIH0sXG4weDAxNUE6IHsgbjpcIkJydEVuZExpc3RDb2xzXCIgfSxcbjB4MDE1QjogeyBuOlwiQnJ0QmVnaW5MaXN0Q29sXCIgfSxcbjB4MDE1QzogeyBuOlwiQnJ0RW5kTGlzdENvbFwiIH0sXG4weDAxNUQ6IHsgbjpcIkJydEJlZ2luTGlzdFhtbENQclwiIH0sXG4weDAxNUU6IHsgbjpcIkJydEVuZExpc3RYbWxDUHJcIiB9LFxuMHgwMTVGOiB7IG46XCJCcnRMaXN0Q0NGbWxhXCIgfSxcbjB4MDE2MDogeyBuOlwiQnJ0TGlzdFRyRm1sYVwiIH0sXG4weDAxNjE6IHsgbjpcIkJydEJlZ2luRXh0ZXJuYWxzXCIgfSxcbjB4MDE2MjogeyBuOlwiQnJ0RW5kRXh0ZXJuYWxzXCIgfSxcbjB4MDE2MzogeyBuOlwiQnJ0U3VwQm9va1NyY1wiLCBmOnBhcnNlX1JlbElEfSxcbjB4MDE2NTogeyBuOlwiQnJ0U3VwU2VsZlwiIH0sXG4weDAxNjY6IHsgbjpcIkJydFN1cFNhbWVcIiB9LFxuMHgwMTY3OiB7IG46XCJCcnRTdXBUYWJzXCIgfSxcbjB4MDE2ODogeyBuOlwiQnJ0QmVnaW5TdXBCb29rXCIgfSxcbjB4MDE2OTogeyBuOlwiQnJ0UGxhY2Vob2xkZXJOYW1lXCIgfSxcbjB4MDE2QTogeyBuOlwiQnJ0RXh0ZXJuU2hlZXRcIiwgZjpwYXJzZV9FeHRlcm5TaGVldCB9LFxuMHgwMTZCOiB7IG46XCJCcnRFeHRlcm5UYWJsZVN0YXJ0XCIgfSxcbjB4MDE2QzogeyBuOlwiQnJ0RXh0ZXJuVGFibGVFbmRcIiB9LFxuMHgwMTZFOiB7IG46XCJCcnRFeHRlcm5Sb3dIZHJcIiB9LFxuMHgwMTZGOiB7IG46XCJCcnRFeHRlcm5DZWxsQmxhbmtcIiB9LFxuMHgwMTcwOiB7IG46XCJCcnRFeHRlcm5DZWxsUmVhbFwiIH0sXG4weDAxNzE6IHsgbjpcIkJydEV4dGVybkNlbGxCb29sXCIgfSxcbjB4MDE3MjogeyBuOlwiQnJ0RXh0ZXJuQ2VsbEVycm9yXCIgfSxcbjB4MDE3MzogeyBuOlwiQnJ0RXh0ZXJuQ2VsbFN0cmluZ1wiIH0sXG4weDAxNzQ6IHsgbjpcIkJydEJlZ2luRXNtZHhcIiB9LFxuMHgwMTc1OiB7IG46XCJCcnRFbmRFc21keFwiIH0sXG4weDAxNzY6IHsgbjpcIkJydEJlZ2luTWR4U2V0XCIgfSxcbjB4MDE3NzogeyBuOlwiQnJ0RW5kTWR4U2V0XCIgfSxcbjB4MDE3ODogeyBuOlwiQnJ0QmVnaW5NZHhNYnJQcm9wXCIgfSxcbjB4MDE3OTogeyBuOlwiQnJ0RW5kTWR4TWJyUHJvcFwiIH0sXG4weDAxN0E6IHsgbjpcIkJydEJlZ2luTWR4S1BJXCIgfSxcbjB4MDE3QjogeyBuOlwiQnJ0RW5kTWR4S1BJXCIgfSxcbjB4MDE3QzogeyBuOlwiQnJ0QmVnaW5Fc3N0clwiIH0sXG4weDAxN0Q6IHsgbjpcIkJydEVuZEVzc3RyXCIgfSxcbjB4MDE3RTogeyBuOlwiQnJ0QmVnaW5QUkZJdGVtXCIgfSxcbjB4MDE3RjogeyBuOlwiQnJ0RW5kUFJGSXRlbVwiIH0sXG4weDAxODA6IHsgbjpcIkJydEJlZ2luUGl2b3RDYWNoZUlEc1wiIH0sXG4weDAxODE6IHsgbjpcIkJydEVuZFBpdm90Q2FjaGVJRHNcIiB9LFxuMHgwMTgyOiB7IG46XCJCcnRCZWdpblBpdm90Q2FjaGVJRFwiIH0sXG4weDAxODM6IHsgbjpcIkJydEVuZFBpdm90Q2FjaGVJRFwiIH0sXG4weDAxODQ6IHsgbjpcIkJydEJlZ2luSVNYVklzXCIgfSxcbjB4MDE4NTogeyBuOlwiQnJ0RW5kSVNYVklzXCIgfSxcbjB4MDE4NjogeyBuOlwiQnJ0QmVnaW5Db2xJbmZvc1wiIH0sXG4weDAxODc6IHsgbjpcIkJydEVuZENvbEluZm9zXCIgfSxcbjB4MDE4ODogeyBuOlwiQnJ0QmVnaW5Sd0Jya1wiIH0sXG4weDAxODk6IHsgbjpcIkJydEVuZFJ3QnJrXCIgfSxcbjB4MDE4QTogeyBuOlwiQnJ0QmVnaW5Db2xCcmtcIiB9LFxuMHgwMThCOiB7IG46XCJCcnRFbmRDb2xCcmtcIiB9LFxuMHgwMThDOiB7IG46XCJCcnRCcmtcIiB9LFxuMHgwMThEOiB7IG46XCJCcnRVc2VyQm9va1ZpZXdcIiB9LFxuMHgwMThFOiB7IG46XCJCcnRJbmZvXCIgfSxcbjB4MDE4RjogeyBuOlwiQnJ0Q1VzclwiIH0sXG4weDAxOTA6IHsgbjpcIkJydFVzclwiIH0sXG4weDAxOTE6IHsgbjpcIkJydEJlZ2luVXNlcnNcIiB9LFxuMHgwMTkzOiB7IG46XCJCcnRFT0ZcIiB9LFxuMHgwMTk0OiB7IG46XCJCcnRVQ1JcIiB9LFxuMHgwMTk1OiB7IG46XCJCcnRSUkluc0RlbFwiIH0sXG4weDAxOTY6IHsgbjpcIkJydFJSRW5kSW5zRGVsXCIgfSxcbjB4MDE5NzogeyBuOlwiQnJ0UlJNb3ZlXCIgfSxcbjB4MDE5ODogeyBuOlwiQnJ0UlJFbmRNb3ZlXCIgfSxcbjB4MDE5OTogeyBuOlwiQnJ0UlJDaGdDZWxsXCIgfSxcbjB4MDE5QTogeyBuOlwiQnJ0UlJFbmRDaGdDZWxsXCIgfSxcbjB4MDE5QjogeyBuOlwiQnJ0UlJIZWFkZXJcIiB9LFxuMHgwMTlDOiB7IG46XCJCcnRSUlVzZXJWaWV3XCIgfSxcbjB4MDE5RDogeyBuOlwiQnJ0UlJSZW5TaGVldFwiIH0sXG4weDAxOUU6IHsgbjpcIkJydFJSSW5zZXJ0U2hcIiB9LFxuMHgwMTlGOiB7IG46XCJCcnRSUkRlZk5hbWVcIiB9LFxuMHgwMUEwOiB7IG46XCJCcnRSUk5vdGVcIiB9LFxuMHgwMUExOiB7IG46XCJCcnRSUkNvbmZsaWN0XCIgfSxcbjB4MDFBMjogeyBuOlwiQnJ0UlJUUVNJRlwiIH0sXG4weDAxQTM6IHsgbjpcIkJydFJSRm9ybWF0XCIgfSxcbjB4MDFBNDogeyBuOlwiQnJ0UlJFbmRGb3JtYXRcIiB9LFxuMHgwMUE1OiB7IG46XCJCcnRSUkF1dG9GbXRcIiB9LFxuMHgwMUE2OiB7IG46XCJCcnRCZWdpblVzZXJTaFZpZXdzXCIgfSxcbjB4MDFBNzogeyBuOlwiQnJ0QmVnaW5Vc2VyU2hWaWV3XCIgfSxcbjB4MDFBODogeyBuOlwiQnJ0RW5kVXNlclNoVmlld1wiIH0sXG4weDAxQTk6IHsgbjpcIkJydEVuZFVzZXJTaFZpZXdzXCIgfSxcbjB4MDFBQTogeyBuOlwiQnJ0QXJyRm1sYVwiLCBmOnBhcnNlX0JydEFyckZtbGEgfSxcbjB4MDFBQjogeyBuOlwiQnJ0U2hyRm1sYVwiLCBmOnBhcnNlX0JydFNockZtbGEgfSxcbjB4MDFBQzogeyBuOlwiQnJ0VGFibGVcIiB9LFxuMHgwMUFEOiB7IG46XCJCcnRCZWdpbkV4dENvbm5lY3Rpb25zXCIgfSxcbjB4MDFBRTogeyBuOlwiQnJ0RW5kRXh0Q29ubmVjdGlvbnNcIiB9LFxuMHgwMUFGOiB7IG46XCJCcnRCZWdpblBDRENhbGNNZW1zXCIgfSxcbjB4MDFCMDogeyBuOlwiQnJ0RW5kUENEQ2FsY01lbXNcIiB9LFxuMHgwMUIxOiB7IG46XCJCcnRCZWdpblBDRENhbGNNZW1cIiB9LFxuMHgwMUIyOiB7IG46XCJCcnRFbmRQQ0RDYWxjTWVtXCIgfSxcbjB4MDFCMzogeyBuOlwiQnJ0QmVnaW5QQ0RIR0xldmVsc1wiIH0sXG4weDAxQjQ6IHsgbjpcIkJydEVuZFBDREhHTGV2ZWxzXCIgfSxcbjB4MDFCNTogeyBuOlwiQnJ0QmVnaW5QQ0RIR0xldmVsXCIgfSxcbjB4MDFCNjogeyBuOlwiQnJ0RW5kUENESEdMZXZlbFwiIH0sXG4weDAxQjc6IHsgbjpcIkJydEJlZ2luUENESEdMR3JvdXBzXCIgfSxcbjB4MDFCODogeyBuOlwiQnJ0RW5kUENESEdMR3JvdXBzXCIgfSxcbjB4MDFCOTogeyBuOlwiQnJ0QmVnaW5QQ0RIR0xHcm91cFwiIH0sXG4weDAxQkE6IHsgbjpcIkJydEVuZFBDREhHTEdyb3VwXCIgfSxcbjB4MDFCQjogeyBuOlwiQnJ0QmVnaW5QQ0RIR0xHTWVtYmVyc1wiIH0sXG4weDAxQkM6IHsgbjpcIkJydEVuZFBDREhHTEdNZW1iZXJzXCIgfSxcbjB4MDFCRDogeyBuOlwiQnJ0QmVnaW5QQ0RIR0xHTWVtYmVyXCIgfSxcbjB4MDFCRTogeyBuOlwiQnJ0RW5kUENESEdMR01lbWJlclwiIH0sXG4weDAxQkY6IHsgbjpcIkJydEJlZ2luUVNJXCIgfSxcbjB4MDFDMDogeyBuOlwiQnJ0RW5kUVNJXCIgfSxcbjB4MDFDMTogeyBuOlwiQnJ0QmVnaW5RU0lSXCIgfSxcbjB4MDFDMjogeyBuOlwiQnJ0RW5kUVNJUlwiIH0sXG4weDAxQzM6IHsgbjpcIkJydEJlZ2luRGVsZXRlZE5hbWVzXCIgfSxcbjB4MDFDNDogeyBuOlwiQnJ0RW5kRGVsZXRlZE5hbWVzXCIgfSxcbjB4MDFDNTogeyBuOlwiQnJ0QmVnaW5EZWxldGVkTmFtZVwiIH0sXG4weDAxQzY6IHsgbjpcIkJydEVuZERlbGV0ZWROYW1lXCIgfSxcbjB4MDFDNzogeyBuOlwiQnJ0QmVnaW5RU0lGc1wiIH0sXG4weDAxQzg6IHsgbjpcIkJydEVuZFFTSUZzXCIgfSxcbjB4MDFDOTogeyBuOlwiQnJ0QmVnaW5RU0lGXCIgfSxcbjB4MDFDQTogeyBuOlwiQnJ0RW5kUVNJRlwiIH0sXG4weDAxQ0I6IHsgbjpcIkJydEJlZ2luQXV0b1NvcnRTY29wZVwiIH0sXG4weDAxQ0M6IHsgbjpcIkJydEVuZEF1dG9Tb3J0U2NvcGVcIiB9LFxuMHgwMUNEOiB7IG46XCJCcnRCZWdpbkNvbmRpdGlvbmFsRm9ybWF0dGluZ1wiIH0sXG4weDAxQ0U6IHsgbjpcIkJydEVuZENvbmRpdGlvbmFsRm9ybWF0dGluZ1wiIH0sXG4weDAxQ0Y6IHsgbjpcIkJydEJlZ2luQ0ZSdWxlXCIgfSxcbjB4MDFEMDogeyBuOlwiQnJ0RW5kQ0ZSdWxlXCIgfSxcbjB4MDFEMTogeyBuOlwiQnJ0QmVnaW5JY29uU2V0XCIgfSxcbjB4MDFEMjogeyBuOlwiQnJ0RW5kSWNvblNldFwiIH0sXG4weDAxRDM6IHsgbjpcIkJydEJlZ2luRGF0YWJhclwiIH0sXG4weDAxRDQ6IHsgbjpcIkJydEVuZERhdGFiYXJcIiB9LFxuMHgwMUQ1OiB7IG46XCJCcnRCZWdpbkNvbG9yU2NhbGVcIiB9LFxuMHgwMUQ2OiB7IG46XCJCcnRFbmRDb2xvclNjYWxlXCIgfSxcbjB4MDFENzogeyBuOlwiQnJ0Q0ZWT1wiIH0sXG4weDAxRDg6IHsgbjpcIkJydEV4dGVyblZhbHVlTWV0YVwiIH0sXG4weDAxRDk6IHsgbjpcIkJydEJlZ2luQ29sb3JQYWxldHRlXCIgfSxcbjB4MDFEQTogeyBuOlwiQnJ0RW5kQ29sb3JQYWxldHRlXCIgfSxcbjB4MDFEQjogeyBuOlwiQnJ0SW5kZXhlZENvbG9yXCIgfSxcbjB4MDFEQzogeyBuOlwiQnJ0TWFyZ2luc1wiLCBmOnBhcnNlX0JydE1hcmdpbnMgfSxcbjB4MDFERDogeyBuOlwiQnJ0UHJpbnRPcHRpb25zXCIgfSxcbjB4MDFERTogeyBuOlwiQnJ0UGFnZVNldHVwXCIgfSxcbjB4MDFERjogeyBuOlwiQnJ0QmVnaW5IZWFkZXJGb290ZXJcIiB9LFxuMHgwMUUwOiB7IG46XCJCcnRFbmRIZWFkZXJGb290ZXJcIiB9LFxuMHgwMUUxOiB7IG46XCJCcnRCZWdpblNYQ3J0Rm9ybWF0XCIgfSxcbjB4MDFFMjogeyBuOlwiQnJ0RW5kU1hDcnRGb3JtYXRcIiB9LFxuMHgwMUUzOiB7IG46XCJCcnRCZWdpblNYQ3J0Rm9ybWF0c1wiIH0sXG4weDAxRTQ6IHsgbjpcIkJydEVuZFNYQ3J0Rm9ybWF0c1wiIH0sXG4weDAxRTU6IHsgbjpcIkJydFdzRm10SW5mb1wiLCBmOnBhcnNlX0JydFdzRm10SW5mbyB9LFxuMHgwMUU2OiB7IG46XCJCcnRCZWdpbk1nc1wiIH0sXG4weDAxRTc6IHsgbjpcIkJydEVuZE1Hc1wiIH0sXG4weDAxRTg6IHsgbjpcIkJydEJlZ2luTUdNYXBzXCIgfSxcbjB4MDFFOTogeyBuOlwiQnJ0RW5kTUdNYXBzXCIgfSxcbjB4MDFFQTogeyBuOlwiQnJ0QmVnaW5NR1wiIH0sXG4weDAxRUI6IHsgbjpcIkJydEVuZE1HXCIgfSxcbjB4MDFFQzogeyBuOlwiQnJ0QmVnaW5NYXBcIiB9LFxuMHgwMUVEOiB7IG46XCJCcnRFbmRNYXBcIiB9LFxuMHgwMUVFOiB7IG46XCJCcnRITGlua1wiLCBmOnBhcnNlX0JydEhMaW5rIH0sXG4weDAxRUY6IHsgbjpcIkJydEJlZ2luRENvblwiIH0sXG4weDAxRjA6IHsgbjpcIkJydEVuZERDb25cIiB9LFxuMHgwMUYxOiB7IG46XCJCcnRCZWdpbkRSZWZzXCIgfSxcbjB4MDFGMjogeyBuOlwiQnJ0RW5kRFJlZnNcIiB9LFxuMHgwMUYzOiB7IG46XCJCcnREUmVmXCIgfSxcbjB4MDFGNDogeyBuOlwiQnJ0QmVnaW5TY2VuTWFuXCIgfSxcbjB4MDFGNTogeyBuOlwiQnJ0RW5kU2Nlbk1hblwiIH0sXG4weDAxRjY6IHsgbjpcIkJydEJlZ2luU2N0XCIgfSxcbjB4MDFGNzogeyBuOlwiQnJ0RW5kU2N0XCIgfSxcbjB4MDFGODogeyBuOlwiQnJ0U2xjXCIgfSxcbjB4MDFGOTogeyBuOlwiQnJ0QmVnaW5EWEZzXCIgfSxcbjB4MDFGQTogeyBuOlwiQnJ0RW5kRFhGc1wiIH0sXG4weDAxRkI6IHsgbjpcIkJydERYRlwiIH0sXG4weDAxRkM6IHsgbjpcIkJydEJlZ2luVGFibGVTdHlsZXNcIiB9LFxuMHgwMUZEOiB7IG46XCJCcnRFbmRUYWJsZVN0eWxlc1wiIH0sXG4weDAxRkU6IHsgbjpcIkJydEJlZ2luVGFibGVTdHlsZVwiIH0sXG4weDAxRkY6IHsgbjpcIkJydEVuZFRhYmxlU3R5bGVcIiB9LFxuMHgwMjAwOiB7IG46XCJCcnRUYWJsZVN0eWxlRWxlbWVudFwiIH0sXG4weDAyMDE6IHsgbjpcIkJydFRhYmxlU3R5bGVDbGllbnRcIiB9LFxuMHgwMjAyOiB7IG46XCJCcnRCZWdpblZvbERlcHNcIiB9LFxuMHgwMjAzOiB7IG46XCJCcnRFbmRWb2xEZXBzXCIgfSxcbjB4MDIwNDogeyBuOlwiQnJ0QmVnaW5Wb2xUeXBlXCIgfSxcbjB4MDIwNTogeyBuOlwiQnJ0RW5kVm9sVHlwZVwiIH0sXG4weDAyMDY6IHsgbjpcIkJydEJlZ2luVm9sTWFpblwiIH0sXG4weDAyMDc6IHsgbjpcIkJydEVuZFZvbE1haW5cIiB9LFxuMHgwMjA4OiB7IG46XCJCcnRCZWdpblZvbFRvcGljXCIgfSxcbjB4MDIwOTogeyBuOlwiQnJ0RW5kVm9sVG9waWNcIiB9LFxuMHgwMjBBOiB7IG46XCJCcnRWb2xTdWJ0b3BpY1wiIH0sXG4weDAyMEI6IHsgbjpcIkJydFZvbFJlZlwiIH0sXG4weDAyMEM6IHsgbjpcIkJydFZvbE51bVwiIH0sXG4weDAyMEQ6IHsgbjpcIkJydFZvbEVyclwiIH0sXG4weDAyMEU6IHsgbjpcIkJydFZvbFN0clwiIH0sXG4weDAyMEY6IHsgbjpcIkJydFZvbEJvb2xcIiB9LFxuMHgwMjEwOiB7IG46XCJCcnRCZWdpbkNhbGNDaGFpbiRcIiB9LFxuMHgwMjExOiB7IG46XCJCcnRFbmRDYWxjQ2hhaW4kXCIgfSxcbjB4MDIxMjogeyBuOlwiQnJ0QmVnaW5Tb3J0U3RhdGVcIiB9LFxuMHgwMjEzOiB7IG46XCJCcnRFbmRTb3J0U3RhdGVcIiB9LFxuMHgwMjE0OiB7IG46XCJCcnRCZWdpblNvcnRDb25kXCIgfSxcbjB4MDIxNTogeyBuOlwiQnJ0RW5kU29ydENvbmRcIiB9LFxuMHgwMjE2OiB7IG46XCJCcnRCb29rUHJvdGVjdGlvblwiIH0sXG4weDAyMTc6IHsgbjpcIkJydFNoZWV0UHJvdGVjdGlvblwiIH0sXG4weDAyMTg6IHsgbjpcIkJydFJhbmdlUHJvdGVjdGlvblwiIH0sXG4weDAyMTk6IHsgbjpcIkJydFBob25ldGljSW5mb1wiIH0sXG4weDAyMUE6IHsgbjpcIkJydEJlZ2luRUNUeHRXaXpcIiB9LFxuMHgwMjFCOiB7IG46XCJCcnRFbmRFQ1R4dFdpelwiIH0sXG4weDAyMUM6IHsgbjpcIkJydEJlZ2luRUNUV0ZsZEluZm9Mc3RcIiB9LFxuMHgwMjFEOiB7IG46XCJCcnRFbmRFQ1RXRmxkSW5mb0xzdFwiIH0sXG4weDAyMUU6IHsgbjpcIkJydEJlZ2luRUNUd0ZsZEluZm9cIiB9LFxuMHgwMjI0OiB7IG46XCJCcnRGaWxlU2hhcmluZ1wiIH0sXG4weDAyMjU6IHsgbjpcIkJydE9sZVNpemVcIiB9LFxuMHgwMjI2OiB7IG46XCJCcnREcmF3aW5nXCIsIGY6cGFyc2VfUmVsSUQgfSxcbjB4MDIyNzogeyBuOlwiQnJ0TGVnYWN5RHJhd2luZ1wiIH0sXG4weDAyMjg6IHsgbjpcIkJydExlZ2FjeURyYXdpbmdIRlwiIH0sXG4weDAyMjk6IHsgbjpcIkJydFdlYk9wdFwiIH0sXG4weDAyMkE6IHsgbjpcIkJydEJlZ2luV2ViUHViSXRlbXNcIiB9LFxuMHgwMjJCOiB7IG46XCJCcnRFbmRXZWJQdWJJdGVtc1wiIH0sXG4weDAyMkM6IHsgbjpcIkJydEJlZ2luV2ViUHViSXRlbVwiIH0sXG4weDAyMkQ6IHsgbjpcIkJydEVuZFdlYlB1Ykl0ZW1cIiB9LFxuMHgwMjJFOiB7IG46XCJCcnRCZWdpblNYQ29uZEZtdFwiIH0sXG4weDAyMkY6IHsgbjpcIkJydEVuZFNYQ29uZEZtdFwiIH0sXG4weDAyMzA6IHsgbjpcIkJydEJlZ2luU1hDb25kRm10c1wiIH0sXG4weDAyMzE6IHsgbjpcIkJydEVuZFNYQ29uZEZtdHNcIiB9LFxuMHgwMjMyOiB7IG46XCJCcnRCa0hpbVwiIH0sXG4weDAyMzQ6IHsgbjpcIkJydENvbG9yXCIgfSxcbjB4MDIzNTogeyBuOlwiQnJ0QmVnaW5JbmRleGVkQ29sb3JzXCIgfSxcbjB4MDIzNjogeyBuOlwiQnJ0RW5kSW5kZXhlZENvbG9yc1wiIH0sXG4weDAyMzk6IHsgbjpcIkJydEJlZ2luTVJVQ29sb3JzXCIgfSxcbjB4MDIzQTogeyBuOlwiQnJ0RW5kTVJVQ29sb3JzXCIgfSxcbjB4MDIzQzogeyBuOlwiQnJ0TVJVQ29sb3JcIiB9LFxuMHgwMjNEOiB7IG46XCJCcnRCZWdpbkRWYWxzXCIgfSxcbjB4MDIzRTogeyBuOlwiQnJ0RW5kRFZhbHNcIiB9LFxuMHgwMjQxOiB7IG46XCJCcnRTdXBOYW1lU3RhcnRcIiB9LFxuMHgwMjQyOiB7IG46XCJCcnRTdXBOYW1lVmFsdWVTdGFydFwiIH0sXG4weDAyNDM6IHsgbjpcIkJydFN1cE5hbWVWYWx1ZUVuZFwiIH0sXG4weDAyNDQ6IHsgbjpcIkJydFN1cE5hbWVOdW1cIiB9LFxuMHgwMjQ1OiB7IG46XCJCcnRTdXBOYW1lRXJyXCIgfSxcbjB4MDI0NjogeyBuOlwiQnJ0U3VwTmFtZVN0XCIgfSxcbjB4MDI0NzogeyBuOlwiQnJ0U3VwTmFtZU5pbFwiIH0sXG4weDAyNDg6IHsgbjpcIkJydFN1cE5hbWVCb29sXCIgfSxcbjB4MDI0OTogeyBuOlwiQnJ0U3VwTmFtZUZtbGFcIiB9LFxuMHgwMjRBOiB7IG46XCJCcnRTdXBOYW1lQml0c1wiIH0sXG4weDAyNEI6IHsgbjpcIkJydFN1cE5hbWVFbmRcIiB9LFxuMHgwMjRDOiB7IG46XCJCcnRFbmRTdXBCb29rXCIgfSxcbjB4MDI0RDogeyBuOlwiQnJ0Q2VsbFNtYXJ0VGFnUHJvcGVydHlcIiB9LFxuMHgwMjRFOiB7IG46XCJCcnRCZWdpbkNlbGxTbWFydFRhZ1wiIH0sXG4weDAyNEY6IHsgbjpcIkJydEVuZENlbGxTbWFydFRhZ1wiIH0sXG4weDAyNTA6IHsgbjpcIkJydEJlZ2luQ2VsbFNtYXJ0VGFnc1wiIH0sXG4weDAyNTE6IHsgbjpcIkJydEVuZENlbGxTbWFydFRhZ3NcIiB9LFxuMHgwMjUyOiB7IG46XCJCcnRCZWdpblNtYXJ0VGFnc1wiIH0sXG4weDAyNTM6IHsgbjpcIkJydEVuZFNtYXJ0VGFnc1wiIH0sXG4weDAyNTQ6IHsgbjpcIkJydFNtYXJ0VGFnVHlwZVwiIH0sXG4weDAyNTU6IHsgbjpcIkJydEJlZ2luU21hcnRUYWdUeXBlc1wiIH0sXG4weDAyNTY6IHsgbjpcIkJydEVuZFNtYXJ0VGFnVHlwZXNcIiB9LFxuMHgwMjU3OiB7IG46XCJCcnRCZWdpblNYRmlsdGVyc1wiIH0sXG4weDAyNTg6IHsgbjpcIkJydEVuZFNYRmlsdGVyc1wiIH0sXG4weDAyNTk6IHsgbjpcIkJydEJlZ2luU1hGSUxURVJcIiB9LFxuMHgwMjVBOiB7IG46XCJCcnRFbmRTWEZpbHRlclwiIH0sXG4weDAyNUI6IHsgbjpcIkJydEJlZ2luRmlsbHNcIiB9LFxuMHgwMjVDOiB7IG46XCJCcnRFbmRGaWxsc1wiIH0sXG4weDAyNUQ6IHsgbjpcIkJydEJlZ2luQ2VsbFdhdGNoZXNcIiB9LFxuMHgwMjVFOiB7IG46XCJCcnRFbmRDZWxsV2F0Y2hlc1wiIH0sXG4weDAyNUY6IHsgbjpcIkJydENlbGxXYXRjaFwiIH0sXG4weDAyNjA6IHsgbjpcIkJydEJlZ2luQ1JFcnJzXCIgfSxcbjB4MDI2MTogeyBuOlwiQnJ0RW5kQ1JFcnJzXCIgfSxcbjB4MDI2MjogeyBuOlwiQnJ0Q3Jhc2hSZWNFcnJcIiB9LFxuMHgwMjYzOiB7IG46XCJCcnRCZWdpbkZvbnRzXCIgfSxcbjB4MDI2NDogeyBuOlwiQnJ0RW5kRm9udHNcIiB9LFxuMHgwMjY1OiB7IG46XCJCcnRCZWdpbkJvcmRlcnNcIiB9LFxuMHgwMjY2OiB7IG46XCJCcnRFbmRCb3JkZXJzXCIgfSxcbjB4MDI2NzogeyBuOlwiQnJ0QmVnaW5GbXRzXCIgfSxcbjB4MDI2ODogeyBuOlwiQnJ0RW5kRm10c1wiIH0sXG4weDAyNjk6IHsgbjpcIkJydEJlZ2luQ2VsbFhGc1wiIH0sXG4weDAyNkE6IHsgbjpcIkJydEVuZENlbGxYRnNcIiB9LFxuMHgwMjZCOiB7IG46XCJCcnRCZWdpblN0eWxlc1wiIH0sXG4weDAyNkM6IHsgbjpcIkJydEVuZFN0eWxlc1wiIH0sXG4weDAyNzE6IHsgbjpcIkJydEJpZ05hbWVcIiB9LFxuMHgwMjcyOiB7IG46XCJCcnRCZWdpbkNlbGxTdHlsZVhGc1wiIH0sXG4weDAyNzM6IHsgbjpcIkJydEVuZENlbGxTdHlsZVhGc1wiIH0sXG4weDAyNzQ6IHsgbjpcIkJydEJlZ2luQ29tbWVudHNcIiB9LFxuMHgwMjc1OiB7IG46XCJCcnRFbmRDb21tZW50c1wiIH0sXG4weDAyNzY6IHsgbjpcIkJydEJlZ2luQ29tbWVudEF1dGhvcnNcIiB9LFxuMHgwMjc3OiB7IG46XCJCcnRFbmRDb21tZW50QXV0aG9yc1wiIH0sXG4weDAyNzg6IHsgbjpcIkJydENvbW1lbnRBdXRob3JcIiwgZjpwYXJzZV9CcnRDb21tZW50QXV0aG9yIH0sXG4weDAyNzk6IHsgbjpcIkJydEJlZ2luQ29tbWVudExpc3RcIiB9LFxuMHgwMjdBOiB7IG46XCJCcnRFbmRDb21tZW50TGlzdFwiIH0sXG4weDAyN0I6IHsgbjpcIkJydEJlZ2luQ29tbWVudFwiLCBmOnBhcnNlX0JydEJlZ2luQ29tbWVudH0sXG4weDAyN0M6IHsgbjpcIkJydEVuZENvbW1lbnRcIiB9LFxuMHgwMjdEOiB7IG46XCJCcnRDb21tZW50VGV4dFwiLCBmOnBhcnNlX0JydENvbW1lbnRUZXh0IH0sXG4weDAyN0U6IHsgbjpcIkJydEJlZ2luT2xlT2JqZWN0c1wiIH0sXG4weDAyN0Y6IHsgbjpcIkJydE9sZU9iamVjdFwiIH0sXG4weDAyODA6IHsgbjpcIkJydEVuZE9sZU9iamVjdHNcIiB9LFxuMHgwMjgxOiB7IG46XCJCcnRCZWdpblN4cnVsZXNcIiB9LFxuMHgwMjgyOiB7IG46XCJCcnRFbmRTeFJ1bGVzXCIgfSxcbjB4MDI4MzogeyBuOlwiQnJ0QmVnaW5BY3RpdmVYQ29udHJvbHNcIiB9LFxuMHgwMjg0OiB7IG46XCJCcnRBY3RpdmVYXCIgfSxcbjB4MDI4NTogeyBuOlwiQnJ0RW5kQWN0aXZlWENvbnRyb2xzXCIgfSxcbjB4MDI4NjogeyBuOlwiQnJ0QmVnaW5QQ0RTRFRDRU1lbWJlcnNTb3J0QnlcIiB9LFxuMHgwMjg4OiB7IG46XCJCcnRCZWdpbkNlbGxJZ25vcmVFQ3NcIiB9LFxuMHgwMjg5OiB7IG46XCJCcnRDZWxsSWdub3JlRUNcIiB9LFxuMHgwMjhBOiB7IG46XCJCcnRFbmRDZWxsSWdub3JlRUNzXCIgfSxcbjB4MDI4QjogeyBuOlwiQnJ0Q3NQcm9wXCIsIGY6cGFyc2VfQnJ0Q3NQcm9wIH0sXG4weDAyOEM6IHsgbjpcIkJydENzUGFnZVNldHVwXCIgfSxcbjB4MDI4RDogeyBuOlwiQnJ0QmVnaW5Vc2VyQ3NWaWV3c1wiIH0sXG4weDAyOEU6IHsgbjpcIkJydEVuZFVzZXJDc1ZpZXdzXCIgfSxcbjB4MDI4RjogeyBuOlwiQnJ0QmVnaW5Vc2VyQ3NWaWV3XCIgfSxcbjB4MDI5MDogeyBuOlwiQnJ0RW5kVXNlckNzVmlld1wiIH0sXG4weDAyOTE6IHsgbjpcIkJydEJlZ2luUGNkU0ZDSUVudHJpZXNcIiB9LFxuMHgwMjkyOiB7IG46XCJCcnRFbmRQQ0RTRkNJRW50cmllc1wiIH0sXG4weDAyOTM6IHsgbjpcIkJydFBDRFNGQ0lFbnRyeVwiIH0sXG4weDAyOTQ6IHsgbjpcIkJydEJlZ2luTGlzdFBhcnRzXCIgfSxcbjB4MDI5NTogeyBuOlwiQnJ0TGlzdFBhcnRcIiB9LFxuMHgwMjk2OiB7IG46XCJCcnRFbmRMaXN0UGFydHNcIiB9LFxuMHgwMjk3OiB7IG46XCJCcnRTaGVldENhbGNQcm9wXCIgfSxcbjB4MDI5ODogeyBuOlwiQnJ0QmVnaW5Gbkdyb3VwXCIgfSxcbjB4MDI5OTogeyBuOlwiQnJ0Rm5Hcm91cFwiIH0sXG4weDAyOUE6IHsgbjpcIkJydEVuZEZuR3JvdXBcIiB9LFxuMHgwMjlCOiB7IG46XCJCcnRTdXBBZGRpblwiIH0sXG4weDAyOUM6IHsgbjpcIkJydFNYVERNUE9yZGVyXCIgfSxcbjB4MDI5RDogeyBuOlwiQnJ0Q3NQcm90ZWN0aW9uXCIgfSxcbjB4MDI5RjogeyBuOlwiQnJ0QmVnaW5Xc1NvcnRNYXBcIiB9LFxuMHgwMkEwOiB7IG46XCJCcnRFbmRXc1NvcnRNYXBcIiB9LFxuMHgwMkExOiB7IG46XCJCcnRCZWdpblJSU29ydFwiIH0sXG4weDAyQTI6IHsgbjpcIkJydEVuZFJSU29ydFwiIH0sXG4weDAyQTM6IHsgbjpcIkJydFJSU29ydEl0ZW1cIiB9LFxuMHgwMkE0OiB7IG46XCJCcnRGaWxlU2hhcmluZ0lzb1wiIH0sXG4weDAyQTU6IHsgbjpcIkJydEJvb2tQcm90ZWN0aW9uSXNvXCIgfSxcbjB4MDJBNjogeyBuOlwiQnJ0U2hlZXRQcm90ZWN0aW9uSXNvXCIgfSxcbjB4MDJBNzogeyBuOlwiQnJ0Q3NQcm90ZWN0aW9uSXNvXCIgfSxcbjB4MDJBODogeyBuOlwiQnJ0UmFuZ2VQcm90ZWN0aW9uSXNvXCIgfSxcbjB4MDJBOTogeyBuOlwiQnJ0RFZhbExpc3RcIiB9LFxuMHgwNDAwOiB7IG46XCJCcnRSd0Rlc2NlbnRcIiB9LFxuMHgwNDAxOiB7IG46XCJCcnRLbm93bkZvbnRzXCIgfSxcbjB4MDQwMjogeyBuOlwiQnJ0QmVnaW5TWFR1cGxlU2V0XCIgfSxcbjB4MDQwMzogeyBuOlwiQnJ0RW5kU1hUdXBsZVNldFwiIH0sXG4weDA0MDQ6IHsgbjpcIkJydEJlZ2luU1hUdXBsZVNldEhlYWRlclwiIH0sXG4weDA0MDU6IHsgbjpcIkJydEVuZFNYVHVwbGVTZXRIZWFkZXJcIiB9LFxuMHgwNDA2OiB7IG46XCJCcnRTWFR1cGxlU2V0SGVhZGVySXRlbVwiIH0sXG4weDA0MDc6IHsgbjpcIkJydEJlZ2luU1hUdXBsZVNldERhdGFcIiB9LFxuMHgwNDA4OiB7IG46XCJCcnRFbmRTWFR1cGxlU2V0RGF0YVwiIH0sXG4weDA0MDk6IHsgbjpcIkJydEJlZ2luU1hUdXBsZVNldFJvd1wiIH0sXG4weDA0MEE6IHsgbjpcIkJydEVuZFNYVHVwbGVTZXRSb3dcIiB9LFxuMHgwNDBCOiB7IG46XCJCcnRTWFR1cGxlU2V0Um93SXRlbVwiIH0sXG4weDA0MEM6IHsgbjpcIkJydE5hbWVFeHRcIiB9LFxuMHgwNDBEOiB7IG46XCJCcnRQQ0RIMTRcIiB9LFxuMHgwNDBFOiB7IG46XCJCcnRCZWdpblBDRENhbGNNZW0xNFwiIH0sXG4weDA0MEY6IHsgbjpcIkJydEVuZFBDRENhbGNNZW0xNFwiIH0sXG4weDA0MTA6IHsgbjpcIkJydFNYVEgxNFwiIH0sXG4weDA0MTE6IHsgbjpcIkJydEJlZ2luU3BhcmtsaW5lR3JvdXBcIiB9LFxuMHgwNDEyOiB7IG46XCJCcnRFbmRTcGFya2xpbmVHcm91cFwiIH0sXG4weDA0MTM6IHsgbjpcIkJydFNwYXJrbGluZVwiIH0sXG4weDA0MTQ6IHsgbjpcIkJydFNYREkxNFwiIH0sXG4weDA0MTU6IHsgbjpcIkJydFdzRm10SW5mb0V4MTRcIiB9LFxuMHgwNDE2OiB7IG46XCJCcnRCZWdpbkNvbmRpdGlvbmFsRm9ybWF0dGluZzE0XCIgfSxcbjB4MDQxNzogeyBuOlwiQnJ0RW5kQ29uZGl0aW9uYWxGb3JtYXR0aW5nMTRcIiB9LFxuMHgwNDE4OiB7IG46XCJCcnRCZWdpbkNGUnVsZTE0XCIgfSxcbjB4MDQxOTogeyBuOlwiQnJ0RW5kQ0ZSdWxlMTRcIiB9LFxuMHgwNDFBOiB7IG46XCJCcnRDRlZPMTRcIiB9LFxuMHgwNDFCOiB7IG46XCJCcnRCZWdpbkRhdGFiYXIxNFwiIH0sXG4weDA0MUM6IHsgbjpcIkJydEJlZ2luSWNvblNldDE0XCIgfSxcbjB4MDQxRDogeyBuOlwiQnJ0RFZhbDE0XCIsIGY6IHBhcnNlX0JydERWYWwxNCB9LFxuMHgwNDFFOiB7IG46XCJCcnRCZWdpbkRWYWxzMTRcIiB9LFxuMHgwNDFGOiB7IG46XCJCcnRDb2xvcjE0XCIgfSxcbjB4MDQyMDogeyBuOlwiQnJ0QmVnaW5TcGFya2xpbmVzXCIgfSxcbjB4MDQyMTogeyBuOlwiQnJ0RW5kU3BhcmtsaW5lc1wiIH0sXG4weDA0MjI6IHsgbjpcIkJydEJlZ2luU3BhcmtsaW5lR3JvdXBzXCIgfSxcbjB4MDQyMzogeyBuOlwiQnJ0RW5kU3BhcmtsaW5lR3JvdXBzXCIgfSxcbjB4MDQyNTogeyBuOlwiQnJ0U1hWRDE0XCIgfSxcbjB4MDQyNjogeyBuOlwiQnJ0QmVnaW5TWFZpZXcxNFwiIH0sXG4weDA0Mjc6IHsgbjpcIkJydEVuZFNYVmlldzE0XCIgfSxcbjB4MDQyODogeyBuOlwiQnJ0QmVnaW5TWFZpZXcxNlwiIH0sXG4weDA0Mjk6IHsgbjpcIkJydEVuZFNYVmlldzE2XCIgfSxcbjB4MDQyQTogeyBuOlwiQnJ0QmVnaW5QQ0QxNFwiIH0sXG4weDA0MkI6IHsgbjpcIkJydEVuZFBDRDE0XCIgfSxcbjB4MDQyQzogeyBuOlwiQnJ0QmVnaW5FeHRDb25uMTRcIiB9LFxuMHgwNDJEOiB7IG46XCJCcnRFbmRFeHRDb25uMTRcIiB9LFxuMHgwNDJFOiB7IG46XCJCcnRCZWdpblNsaWNlckNhY2hlSURzXCIgfSxcbjB4MDQyRjogeyBuOlwiQnJ0RW5kU2xpY2VyQ2FjaGVJRHNcIiB9LFxuMHgwNDMwOiB7IG46XCJCcnRCZWdpblNsaWNlckNhY2hlSURcIiB9LFxuMHgwNDMxOiB7IG46XCJCcnRFbmRTbGljZXJDYWNoZUlEXCIgfSxcbjB4MDQzMzogeyBuOlwiQnJ0QmVnaW5TbGljZXJDYWNoZVwiIH0sXG4weDA0MzQ6IHsgbjpcIkJydEVuZFNsaWNlckNhY2hlXCIgfSxcbjB4MDQzNTogeyBuOlwiQnJ0QmVnaW5TbGljZXJDYWNoZURlZlwiIH0sXG4weDA0MzY6IHsgbjpcIkJydEVuZFNsaWNlckNhY2hlRGVmXCIgfSxcbjB4MDQzNzogeyBuOlwiQnJ0QmVnaW5TbGljZXJzRXhcIiB9LFxuMHgwNDM4OiB7IG46XCJCcnRFbmRTbGljZXJzRXhcIiB9LFxuMHgwNDM5OiB7IG46XCJCcnRCZWdpblNsaWNlckV4XCIgfSxcbjB4MDQzQTogeyBuOlwiQnJ0RW5kU2xpY2VyRXhcIiB9LFxuMHgwNDNCOiB7IG46XCJCcnRCZWdpblNsaWNlclwiIH0sXG4weDA0M0M6IHsgbjpcIkJydEVuZFNsaWNlclwiIH0sXG4weDA0M0Q6IHsgbjpcIkJydFNsaWNlckNhY2hlUGl2b3RUYWJsZXNcIiB9LFxuMHgwNDNFOiB7IG46XCJCcnRCZWdpblNsaWNlckNhY2hlT2xhcEltcGxcIiB9LFxuMHgwNDNGOiB7IG46XCJCcnRFbmRTbGljZXJDYWNoZU9sYXBJbXBsXCIgfSxcbjB4MDQ0MDogeyBuOlwiQnJ0QmVnaW5TbGljZXJDYWNoZUxldmVsc0RhdGFcIiB9LFxuMHgwNDQxOiB7IG46XCJCcnRFbmRTbGljZXJDYWNoZUxldmVsc0RhdGFcIiB9LFxuMHgwNDQyOiB7IG46XCJCcnRCZWdpblNsaWNlckNhY2hlTGV2ZWxEYXRhXCIgfSxcbjB4MDQ0MzogeyBuOlwiQnJ0RW5kU2xpY2VyQ2FjaGVMZXZlbERhdGFcIiB9LFxuMHgwNDQ0OiB7IG46XCJCcnRCZWdpblNsaWNlckNhY2hlU2lSYW5nZXNcIiB9LFxuMHgwNDQ1OiB7IG46XCJCcnRFbmRTbGljZXJDYWNoZVNpUmFuZ2VzXCIgfSxcbjB4MDQ0NjogeyBuOlwiQnJ0QmVnaW5TbGljZXJDYWNoZVNpUmFuZ2VcIiB9LFxuMHgwNDQ3OiB7IG46XCJCcnRFbmRTbGljZXJDYWNoZVNpUmFuZ2VcIiB9LFxuMHgwNDQ4OiB7IG46XCJCcnRTbGljZXJDYWNoZU9sYXBJdGVtXCIgfSxcbjB4MDQ0OTogeyBuOlwiQnJ0QmVnaW5TbGljZXJDYWNoZVNlbGVjdGlvbnNcIiB9LFxuMHgwNDRBOiB7IG46XCJCcnRTbGljZXJDYWNoZVNlbGVjdGlvblwiIH0sXG4weDA0NEI6IHsgbjpcIkJydEVuZFNsaWNlckNhY2hlU2VsZWN0aW9uc1wiIH0sXG4weDA0NEM6IHsgbjpcIkJydEJlZ2luU2xpY2VyQ2FjaGVOYXRpdmVcIiB9LFxuMHgwNDREOiB7IG46XCJCcnRFbmRTbGljZXJDYWNoZU5hdGl2ZVwiIH0sXG4weDA0NEU6IHsgbjpcIkJydFNsaWNlckNhY2hlTmF0aXZlSXRlbVwiIH0sXG4weDA0NEY6IHsgbjpcIkJydFJhbmdlUHJvdGVjdGlvbjE0XCIgfSxcbjB4MDQ1MDogeyBuOlwiQnJ0UmFuZ2VQcm90ZWN0aW9uSXNvMTRcIiB9LFxuMHgwNDUxOiB7IG46XCJCcnRDZWxsSWdub3JlRUMxNFwiIH0sXG4weDA0NTc6IHsgbjpcIkJydExpc3QxNFwiIH0sXG4weDA0NTg6IHsgbjpcIkJydENGSWNvblwiIH0sXG4weDA0NTk6IHsgbjpcIkJydEJlZ2luU2xpY2VyQ2FjaGVzUGl2b3RDYWNoZUlEc1wiIH0sXG4weDA0NUE6IHsgbjpcIkJydEVuZFNsaWNlckNhY2hlc1Bpdm90Q2FjaGVJRHNcIiB9LFxuMHgwNDVCOiB7IG46XCJCcnRCZWdpblNsaWNlcnNcIiB9LFxuMHgwNDVDOiB7IG46XCJCcnRFbmRTbGljZXJzXCIgfSxcbjB4MDQ1RDogeyBuOlwiQnJ0V2JQcm9wMTRcIiB9LFxuMHgwNDVFOiB7IG46XCJCcnRCZWdpblNYRWRpdFwiIH0sXG4weDA0NUY6IHsgbjpcIkJydEVuZFNYRWRpdFwiIH0sXG4weDA0NjA6IHsgbjpcIkJydEJlZ2luU1hFZGl0c1wiIH0sXG4weDA0NjE6IHsgbjpcIkJydEVuZFNYRWRpdHNcIiB9LFxuMHgwNDYyOiB7IG46XCJCcnRCZWdpblNYQ2hhbmdlXCIgfSxcbjB4MDQ2MzogeyBuOlwiQnJ0RW5kU1hDaGFuZ2VcIiB9LFxuMHgwNDY0OiB7IG46XCJCcnRCZWdpblNYQ2hhbmdlc1wiIH0sXG4weDA0NjU6IHsgbjpcIkJydEVuZFNYQ2hhbmdlc1wiIH0sXG4weDA0NjY6IHsgbjpcIkJydFNYVHVwbGVJdGVtc1wiIH0sXG4weDA0Njg6IHsgbjpcIkJydEJlZ2luU2xpY2VyU3R5bGVcIiB9LFxuMHgwNDY5OiB7IG46XCJCcnRFbmRTbGljZXJTdHlsZVwiIH0sXG4weDA0NkE6IHsgbjpcIkJydFNsaWNlclN0eWxlRWxlbWVudFwiIH0sXG4weDA0NkI6IHsgbjpcIkJydEJlZ2luU3R5bGVTaGVldEV4dDE0XCIgfSxcbjB4MDQ2QzogeyBuOlwiQnJ0RW5kU3R5bGVTaGVldEV4dDE0XCIgfSxcbjB4MDQ2RDogeyBuOlwiQnJ0QmVnaW5TbGljZXJDYWNoZXNQaXZvdENhY2hlSURcIiB9LFxuMHgwNDZFOiB7IG46XCJCcnRFbmRTbGljZXJDYWNoZXNQaXZvdENhY2hlSURcIiB9LFxuMHgwNDZGOiB7IG46XCJCcnRCZWdpbkNvbmRpdGlvbmFsRm9ybWF0dGluZ3NcIiB9LFxuMHgwNDcwOiB7IG46XCJCcnRFbmRDb25kaXRpb25hbEZvcm1hdHRpbmdzXCIgfSxcbjB4MDQ3MTogeyBuOlwiQnJ0QmVnaW5QQ0RDYWxjTWVtRXh0XCIgfSxcbjB4MDQ3MjogeyBuOlwiQnJ0RW5kUENEQ2FsY01lbUV4dFwiIH0sXG4weDA0NzM6IHsgbjpcIkJydEJlZ2luUENEQ2FsY01lbXNFeHRcIiB9LFxuMHgwNDc0OiB7IG46XCJCcnRFbmRQQ0RDYWxjTWVtc0V4dFwiIH0sXG4weDA0NzU6IHsgbjpcIkJydFBDREZpZWxkMTRcIiB9LFxuMHgwNDc2OiB7IG46XCJCcnRCZWdpblNsaWNlclN0eWxlc1wiIH0sXG4weDA0Nzc6IHsgbjpcIkJydEVuZFNsaWNlclN0eWxlc1wiIH0sXG4weDA0Nzg6IHsgbjpcIkJydEJlZ2luU2xpY2VyU3R5bGVFbGVtZW50c1wiIH0sXG4weDA0Nzk6IHsgbjpcIkJydEVuZFNsaWNlclN0eWxlRWxlbWVudHNcIiB9LFxuMHgwNDdBOiB7IG46XCJCcnRDRlJ1bGVFeHRcIiB9LFxuMHgwNDdCOiB7IG46XCJCcnRCZWdpblNYQ29uZEZtdDE0XCIgfSxcbjB4MDQ3QzogeyBuOlwiQnJ0RW5kU1hDb25kRm10MTRcIiB9LFxuMHgwNDdEOiB7IG46XCJCcnRCZWdpblNYQ29uZEZtdHMxNFwiIH0sXG4weDA0N0U6IHsgbjpcIkJydEVuZFNYQ29uZEZtdHMxNFwiIH0sXG4weDA0ODA6IHsgbjpcIkJydEJlZ2luU29ydENvbmQxNFwiIH0sXG4weDA0ODE6IHsgbjpcIkJydEVuZFNvcnRDb25kMTRcIiB9LFxuMHgwNDgyOiB7IG46XCJCcnRFbmREVmFsczE0XCIgfSxcbjB4MDQ4MzogeyBuOlwiQnJ0RW5kSWNvblNldDE0XCIgfSxcbjB4MDQ4NDogeyBuOlwiQnJ0RW5kRGF0YWJhcjE0XCIgfSxcbjB4MDQ4NTogeyBuOlwiQnJ0QmVnaW5Db2xvclNjYWxlMTRcIiB9LFxuMHgwNDg2OiB7IG46XCJCcnRFbmRDb2xvclNjYWxlMTRcIiB9LFxuMHgwNDg3OiB7IG46XCJCcnRCZWdpblN4cnVsZXMxNFwiIH0sXG4weDA0ODg6IHsgbjpcIkJydEVuZFN4cnVsZXMxNFwiIH0sXG4weDA0ODk6IHsgbjpcIkJydEJlZ2luUFJ1bGUxNFwiIH0sXG4weDA0OEE6IHsgbjpcIkJydEVuZFBSdWxlMTRcIiB9LFxuMHgwNDhCOiB7IG46XCJCcnRCZWdpblBSRmlsdGVyczE0XCIgfSxcbjB4MDQ4QzogeyBuOlwiQnJ0RW5kUFJGaWx0ZXJzMTRcIiB9LFxuMHgwNDhEOiB7IG46XCJCcnRCZWdpblBSRmlsdGVyMTRcIiB9LFxuMHgwNDhFOiB7IG46XCJCcnRFbmRQUkZpbHRlcjE0XCIgfSxcbjB4MDQ4RjogeyBuOlwiQnJ0QmVnaW5QUkZJdGVtMTRcIiB9LFxuMHgwNDkwOiB7IG46XCJCcnRFbmRQUkZJdGVtMTRcIiB9LFxuMHgwNDkxOiB7IG46XCJCcnRCZWdpbkNlbGxJZ25vcmVFQ3MxNFwiIH0sXG4weDA0OTI6IHsgbjpcIkJydEVuZENlbGxJZ25vcmVFQ3MxNFwiIH0sXG4weDA0OTM6IHsgbjpcIkJydER4ZjE0XCIgfSxcbjB4MDQ5NDogeyBuOlwiQnJ0QmVnaW5EeEYxNHNcIiB9LFxuMHgwNDk1OiB7IG46XCJCcnRFbmREeGYxNHNcIiB9LFxuMHgwNDk5OiB7IG46XCJCcnRGaWx0ZXIxNFwiIH0sXG4weDA0OUE6IHsgbjpcIkJydEJlZ2luQ3VzdG9tRmlsdGVyczE0XCIgfSxcbjB4MDQ5QzogeyBuOlwiQnJ0Q3VzdG9tRmlsdGVyMTRcIiB9LFxuMHgwNDlEOiB7IG46XCJCcnRJY29uRmlsdGVyMTRcIiB9LFxuMHgwNDlFOiB7IG46XCJCcnRQaXZvdENhY2hlQ29ubmVjdGlvbk5hbWVcIiB9LFxuMHgwODAwOiB7IG46XCJCcnRCZWdpbkRlY291cGxlZFBpdm90Q2FjaGVJRHNcIiB9LFxuMHgwODAxOiB7IG46XCJCcnRFbmREZWNvdXBsZWRQaXZvdENhY2hlSURzXCIgfSxcbjB4MDgwMjogeyBuOlwiQnJ0RGVjb3VwbGVkUGl2b3RDYWNoZUlEXCIgfSxcbjB4MDgwMzogeyBuOlwiQnJ0QmVnaW5QaXZvdFRhYmxlUmVmc1wiIH0sXG4weDA4MDQ6IHsgbjpcIkJydEVuZFBpdm90VGFibGVSZWZzXCIgfSxcbjB4MDgwNTogeyBuOlwiQnJ0UGl2b3RUYWJsZVJlZlwiIH0sXG4weDA4MDY6IHsgbjpcIkJydFNsaWNlckNhY2hlQm9va1Bpdm90VGFibGVzXCIgfSxcbjB4MDgwNzogeyBuOlwiQnJ0QmVnaW5TeHZjZWxsc1wiIH0sXG4weDA4MDg6IHsgbjpcIkJydEVuZFN4dmNlbGxzXCIgfSxcbjB4MDgwOTogeyBuOlwiQnJ0QmVnaW5TeFJvd1wiIH0sXG4weDA4MEE6IHsgbjpcIkJydEVuZFN4Um93XCIgfSxcbjB4MDgwQzogeyBuOlwiQnJ0UGNkQ2FsY01lbTE1XCIgfSxcbjB4MDgxMzogeyBuOlwiQnJ0UXNpMTVcIiB9LFxuMHgwODE0OiB7IG46XCJCcnRCZWdpbldlYkV4dGVuc2lvbnNcIiB9LFxuMHgwODE1OiB7IG46XCJCcnRFbmRXZWJFeHRlbnNpb25zXCIgfSxcbjB4MDgxNjogeyBuOlwiQnJ0V2ViRXh0ZW5zaW9uXCIgfSxcbjB4MDgxNzogeyBuOlwiQnJ0QWJzUGF0aDE1XCIgfSxcbjB4MDgxODogeyBuOlwiQnJ0QmVnaW5QaXZvdFRhYmxlVUlTZXR0aW5nc1wiIH0sXG4weDA4MTk6IHsgbjpcIkJydEVuZFBpdm90VGFibGVVSVNldHRpbmdzXCIgfSxcbjB4MDgxQjogeyBuOlwiQnJ0VGFibGVTbGljZXJDYWNoZUlEc1wiIH0sXG4weDA4MUM6IHsgbjpcIkJydFRhYmxlU2xpY2VyQ2FjaGVJRFwiIH0sXG4weDA4MUQ6IHsgbjpcIkJydEJlZ2luVGFibGVTbGljZXJDYWNoZVwiIH0sXG4weDA4MUU6IHsgbjpcIkJydEVuZFRhYmxlU2xpY2VyQ2FjaGVcIiB9LFxuMHgwODFGOiB7IG46XCJCcnRTeEZpbHRlcjE1XCIgfSxcbjB4MDgyMDogeyBuOlwiQnJ0QmVnaW5UaW1lbGluZUNhY2hlUGl2b3RDYWNoZUlEc1wiIH0sXG4weDA4MjE6IHsgbjpcIkJydEVuZFRpbWVsaW5lQ2FjaGVQaXZvdENhY2hlSURzXCIgfSxcbjB4MDgyMjogeyBuOlwiQnJ0VGltZWxpbmVDYWNoZVBpdm90Q2FjaGVJRFwiIH0sXG4weDA4MjM6IHsgbjpcIkJydEJlZ2luVGltZWxpbmVDYWNoZUlEc1wiIH0sXG4weDA4MjQ6IHsgbjpcIkJydEVuZFRpbWVsaW5lQ2FjaGVJRHNcIiB9LFxuMHgwODI1OiB7IG46XCJCcnRCZWdpblRpbWVsaW5lQ2FjaGVJRFwiIH0sXG4weDA4MjY6IHsgbjpcIkJydEVuZFRpbWVsaW5lQ2FjaGVJRFwiIH0sXG4weDA4Mjc6IHsgbjpcIkJydEJlZ2luVGltZWxpbmVzRXhcIiB9LFxuMHgwODI4OiB7IG46XCJCcnRFbmRUaW1lbGluZXNFeFwiIH0sXG4weDA4Mjk6IHsgbjpcIkJydEJlZ2luVGltZWxpbmVFeFwiIH0sXG4weDA4MkE6IHsgbjpcIkJydEVuZFRpbWVsaW5lRXhcIiB9LFxuMHgwODJCOiB7IG46XCJCcnRXb3JrQm9va1ByMTVcIiB9LFxuMHgwODJDOiB7IG46XCJCcnRQQ0RIMTVcIiB9LFxuMHgwODJEOiB7IG46XCJCcnRCZWdpblRpbWVsaW5lU3R5bGVcIiB9LFxuMHgwODJFOiB7IG46XCJCcnRFbmRUaW1lbGluZVN0eWxlXCIgfSxcbjB4MDgyRjogeyBuOlwiQnJ0VGltZWxpbmVTdHlsZUVsZW1lbnRcIiB9LFxuMHgwODMwOiB7IG46XCJCcnRCZWdpblRpbWVsaW5lU3R5bGVzaGVldEV4dDE1XCIgfSxcbjB4MDgzMTogeyBuOlwiQnJ0RW5kVGltZWxpbmVTdHlsZXNoZWV0RXh0MTVcIiB9LFxuMHgwODMyOiB7IG46XCJCcnRCZWdpblRpbWVsaW5lU3R5bGVzXCIgfSxcbjB4MDgzMzogeyBuOlwiQnJ0RW5kVGltZWxpbmVTdHlsZXNcIiB9LFxuMHgwODM0OiB7IG46XCJCcnRCZWdpblRpbWVsaW5lU3R5bGVFbGVtZW50c1wiIH0sXG4weDA4MzU6IHsgbjpcIkJydEVuZFRpbWVsaW5lU3R5bGVFbGVtZW50c1wiIH0sXG4weDA4MzY6IHsgbjpcIkJydER4ZjE1XCIgfSxcbjB4MDgzNzogeyBuOlwiQnJ0QmVnaW5EeGZzMTVcIiB9LFxuMHgwODM4OiB7IG46XCJicnRFbmREeGZzMTVcIiB9LFxuMHgwODM5OiB7IG46XCJCcnRTbGljZXJDYWNoZUhpZGVJdGVtc1dpdGhOb0RhdGFcIiB9LFxuMHgwODNBOiB7IG46XCJCcnRCZWdpbkl0ZW1VbmlxdWVOYW1lc1wiIH0sXG4weDA4M0I6IHsgbjpcIkJydEVuZEl0ZW1VbmlxdWVOYW1lc1wiIH0sXG4weDA4M0M6IHsgbjpcIkJydEl0ZW1VbmlxdWVOYW1lXCIgfSxcbjB4MDgzRDogeyBuOlwiQnJ0QmVnaW5FeHRDb25uMTVcIiB9LFxuMHgwODNFOiB7IG46XCJCcnRFbmRFeHRDb25uMTVcIiB9LFxuMHgwODNGOiB7IG46XCJCcnRCZWdpbk9sZWRiUHIxNVwiIH0sXG4weDA4NDA6IHsgbjpcIkJydEVuZE9sZWRiUHIxNVwiIH0sXG4weDA4NDE6IHsgbjpcIkJydEJlZ2luRGF0YUZlZWRQcjE1XCIgfSxcbjB4MDg0MjogeyBuOlwiQnJ0RW5kRGF0YUZlZWRQcjE1XCIgfSxcbjB4MDg0MzogeyBuOlwiQnJ0VGV4dFByMTVcIiB9LFxuMHgwODQ0OiB7IG46XCJCcnRSYW5nZVByMTVcIiB9LFxuMHgwODQ1OiB7IG46XCJCcnREYkNvbW1hbmQxNVwiIH0sXG4weDA4NDY6IHsgbjpcIkJydEJlZ2luRGJUYWJsZXMxNVwiIH0sXG4weDA4NDc6IHsgbjpcIkJydEVuZERiVGFibGVzMTVcIiB9LFxuMHgwODQ4OiB7IG46XCJCcnREYlRhYmxlMTVcIiB9LFxuMHgwODQ5OiB7IG46XCJCcnRCZWdpbkRhdGFNb2RlbFwiIH0sXG4weDA4NEE6IHsgbjpcIkJydEVuZERhdGFNb2RlbFwiIH0sXG4weDA4NEI6IHsgbjpcIkJydEJlZ2luTW9kZWxUYWJsZXNcIiB9LFxuMHgwODRDOiB7IG46XCJCcnRFbmRNb2RlbFRhYmxlc1wiIH0sXG4weDA4NEQ6IHsgbjpcIkJydE1vZGVsVGFibGVcIiB9LFxuMHgwODRFOiB7IG46XCJCcnRCZWdpbk1vZGVsUmVsYXRpb25zaGlwc1wiIH0sXG4weDA4NEY6IHsgbjpcIkJydEVuZE1vZGVsUmVsYXRpb25zaGlwc1wiIH0sXG4weDA4NTA6IHsgbjpcIkJydE1vZGVsUmVsYXRpb25zaGlwXCIgfSxcbjB4MDg1MTogeyBuOlwiQnJ0QmVnaW5FQ1R4dFdpejE1XCIgfSxcbjB4MDg1MjogeyBuOlwiQnJ0RW5kRUNUeHRXaXoxNVwiIH0sXG4weDA4NTM6IHsgbjpcIkJydEJlZ2luRUNUV0ZsZEluZm9Mc3QxNVwiIH0sXG4weDA4NTQ6IHsgbjpcIkJydEVuZEVDVFdGbGRJbmZvTHN0MTVcIiB9LFxuMHgwODU1OiB7IG46XCJCcnRCZWdpbkVDVFdGbGRJbmZvMTVcIiB9LFxuMHgwODU2OiB7IG46XCJCcnRGaWVsZExpc3RBY3RpdmVJdGVtXCIgfSxcbjB4MDg1NzogeyBuOlwiQnJ0UGl2b3RDYWNoZUlkVmVyc2lvblwiIH0sXG4weDA4NTg6IHsgbjpcIkJydFNYREkxNVwiIH0sXG4weDA4NTk6IHsgbjpcIkJydEJlZ2luTW9kZWxUaW1lR3JvdXBpbmdzXCIgfSxcbjB4MDg1QTogeyBuOlwiQnJ0RW5kTW9kZWxUaW1lR3JvdXBpbmdzXCIgfSxcbjB4MDg1QjogeyBuOlwiQnJ0QmVnaW5Nb2RlbFRpbWVHcm91cGluZ1wiIH0sXG4weDA4NUM6IHsgbjpcIkJydEVuZE1vZGVsVGltZUdyb3VwaW5nXCIgfSxcbjB4MDg1RDogeyBuOlwiQnJ0TW9kZWxUaW1lR3JvdXBpbmdDYWxjQ29sXCIgfSxcbjB4MEMwMDogeyBuOlwiQnJ0VWlkXCIgfSxcbjB4MEMwMTogeyBuOlwiQnJ0UmV2aXNpb25QdHJcIiB9LFxuMHgxM2U3OiB7IG46XCJCcnRCZWdpbkNhbGNGZWF0dXJlc1wiIH0sXG4weDEzZTg6IHsgbjpcIkJydEVuZENhbGNGZWF0dXJlc1wiIH0sXG4weDEzZTk6IHsgbjpcIkJydENhbGNGZWF0dXJlXCIgfSxcbjB4RkZGRjogeyBuOlwiXCIgfVxufTtcblxudmFyIFhMU0JSRSA9IGV2ZXJ0X2tleShYTFNCUmVjb3JkRW51bSwgJ24nKTtcblhMU0JSRVtcIkJydEZSVEFyY2hJRCRcIl0gPSAweDAwMTA7XG5cbi8qIFtNUy1YTFNdIDIuMyBSZWNvcmQgRW51bWVyYXRpb24gKi9cbnZhciBYTFNSZWNvcmRFbnVtID0ge1xuMHgwMDAzOiB7IG46XCJCSUZGMk5VTVwiLCBmOnBhcnNlX0JJRkYyTlVNIH0sXG4weDAwMDQ6IHsgbjpcIkJJRkYyU1RSXCIsIGY6cGFyc2VfQklGRjJTVFIgfSxcbjB4MDAwNjogeyBuOlwiRm9ybXVsYVwiLCBmOnBhcnNlX0Zvcm11bGEgfSxcbjB4MDAwOTogeyBuOidCT0YnLCBmOnBhcnNlX0JPRiB9LFxuMHgwMDBhOiB7IG46J0VPRicsIGY6cGFyc2Vub29wMiB9LFxuMHgwMDBjOiB7IG46XCJDYWxjQ291bnRcIiwgZjpwYXJzZXVpbnQxNiB9LFxuMHgwMDBkOiB7IG46XCJDYWxjTW9kZVwiLCBmOnBhcnNldWludDE2IH0sXG4weDAwMGU6IHsgbjpcIkNhbGNQcmVjaXNpb25cIiwgZjpwYXJzZWJvb2wgfSxcbjB4MDAwZjogeyBuOlwiQ2FsY1JlZk1vZGVcIiwgZjpwYXJzZWJvb2wgfSxcbjB4MDAxMDogeyBuOlwiQ2FsY0RlbHRhXCIsIGY6cGFyc2VfWG51bSB9LFxuMHgwMDExOiB7IG46XCJDYWxjSXRlclwiLCBmOnBhcnNlYm9vbCB9LFxuMHgwMDEyOiB7IG46XCJQcm90ZWN0XCIsIGY6cGFyc2Vib29sIH0sXG4weDAwMTM6IHsgbjpcIlBhc3N3b3JkXCIsIGY6cGFyc2V1aW50MTYgfSxcbjB4MDAxNDogeyBuOlwiSGVhZGVyXCIsIGY6cGFyc2VfWExIZWFkZXJGb290ZXIgfSxcbjB4MDAxNTogeyBuOlwiRm9vdGVyXCIsIGY6cGFyc2VfWExIZWFkZXJGb290ZXIgfSxcbjB4MDAxNzogeyBuOlwiRXh0ZXJuU2hlZXRcIiwgZjpwYXJzZV9FeHRlcm5TaGVldCB9LFxuMHgwMDE4OiB7IG46XCJMYmxcIiwgZjpwYXJzZV9MYmwgfSxcbjB4MDAxOTogeyBuOlwiV2luUHJvdGVjdFwiLCBmOnBhcnNlYm9vbCB9LFxuMHgwMDFhOiB7IG46XCJWZXJ0aWNhbFBhZ2VCcmVha3NcIiB9LFxuMHgwMDFiOiB7IG46XCJIb3Jpem9udGFsUGFnZUJyZWFrc1wiIH0sXG4weDAwMWM6IHsgbjpcIk5vdGVcIiwgZjpwYXJzZV9Ob3RlIH0sXG4weDAwMWQ6IHsgbjpcIlNlbGVjdGlvblwiIH0sXG4weDAwMjI6IHsgbjpcIkRhdGUxOTA0XCIsIGY6cGFyc2Vib29sIH0sXG4weDAwMjM6IHsgbjpcIkV4dGVybk5hbWVcIiwgZjpwYXJzZV9FeHRlcm5OYW1lIH0sXG4weDAwMjQ6IHsgbjpcIkNPTFdJRFRIXCIgfSxcbjB4MDAyNjogeyBuOlwiTGVmdE1hcmdpblwiLCBmOnBhcnNlX1hudW0gfSxcbjB4MDAyNzogeyBuOlwiUmlnaHRNYXJnaW5cIiwgZjpwYXJzZV9YbnVtIH0sXG4weDAwMjg6IHsgbjpcIlRvcE1hcmdpblwiLCBmOnBhcnNlX1hudW0gfSxcbjB4MDAyOTogeyBuOlwiQm90dG9tTWFyZ2luXCIsIGY6cGFyc2VfWG51bSB9LFxuMHgwMDJhOiB7IG46XCJQcmludFJvd0NvbFwiLCBmOnBhcnNlYm9vbCB9LFxuMHgwMDJiOiB7IG46XCJQcmludEdyaWRcIiwgZjpwYXJzZWJvb2wgfSxcbjB4MDAyZjogeyBuOlwiRmlsZVBhc3NcIiwgZjpwYXJzZV9GaWxlUGFzcyB9LFxuMHgwMDMxOiB7IG46XCJGb250XCIsIGY6cGFyc2VfRm9udCB9LFxuMHgwMDMzOiB7IG46XCJQcmludFNpemVcIiwgZjpwYXJzZXVpbnQxNiB9LFxuMHgwMDNjOiB7IG46XCJDb250aW51ZVwiIH0sXG4weDAwM2Q6IHsgbjpcIldpbmRvdzFcIiwgZjpwYXJzZV9XaW5kb3cxIH0sXG4weDAwNDA6IHsgbjpcIkJhY2t1cFwiLCBmOnBhcnNlYm9vbCB9LFxuMHgwMDQxOiB7IG46XCJQYW5lXCIsIGY6cGFyc2VfUGFuZSB9LFxuMHgwMDQyOiB7IG46J0NvZGVQYWdlJywgZjpwYXJzZXVpbnQxNiB9LFxuMHgwMDRkOiB7IG46XCJQbHNcIiB9LFxuMHgwMDUwOiB7IG46XCJEQ29uXCIgfSxcbjB4MDA1MTogeyBuOlwiRENvblJlZlwiIH0sXG4weDAwNTI6IHsgbjpcIkRDb25OYW1lXCIgfSxcbjB4MDA1NTogeyBuOlwiRGVmQ29sV2lkdGhcIiwgZjpwYXJzZXVpbnQxNiB9LFxuMHgwMDU5OiB7IG46XCJYQ1RcIiB9LFxuMHgwMDVhOiB7IG46XCJDUk5cIiB9LFxuMHgwMDViOiB7IG46XCJGaWxlU2hhcmluZ1wiIH0sXG4weDAwNWM6IHsgbjonV3JpdGVBY2Nlc3MnLCBmOnBhcnNlX1dyaXRlQWNjZXNzIH0sXG4weDAwNWQ6IHsgbjpcIk9ialwiLCBmOnBhcnNlX09iaiB9LFxuMHgwMDVlOiB7IG46XCJVbmNhbGNlZFwiIH0sXG4weDAwNWY6IHsgbjpcIkNhbGNTYXZlUmVjYWxjXCIsIGY6cGFyc2Vib29sIH0sXG4weDAwNjA6IHsgbjpcIlRlbXBsYXRlXCIgfSxcbjB4MDA2MTogeyBuOlwiSW50bFwiIH0sXG4weDAwNjM6IHsgbjpcIk9ialByb3RlY3RcIiwgZjpwYXJzZWJvb2wgfSxcbjB4MDA3ZDogeyBuOlwiQ29sSW5mb1wiLCBmOnBhcnNlX0NvbEluZm8gfSxcbjB4MDA4MDogeyBuOlwiR3V0c1wiLCBmOnBhcnNlX0d1dHMgfSxcbjB4MDA4MTogeyBuOlwiV3NCb29sXCIsIGY6cGFyc2VfV3NCb29sIH0sXG4weDAwODI6IHsgbjpcIkdyaWRTZXRcIiwgZjpwYXJzZXVpbnQxNiB9LFxuMHgwMDgzOiB7IG46XCJIQ2VudGVyXCIsIGY6cGFyc2Vib29sIH0sXG4weDAwODQ6IHsgbjpcIlZDZW50ZXJcIiwgZjpwYXJzZWJvb2wgfSxcbjB4MDA4NTogeyBuOidCb3VuZFNoZWV0OCcsIGY6cGFyc2VfQm91bmRTaGVldDggfSxcbjB4MDA4NjogeyBuOlwiV3JpdGVQcm90ZWN0XCIgfSxcbjB4MDA4YzogeyBuOlwiQ291bnRyeVwiLCBmOnBhcnNlX0NvdW50cnkgfSxcbjB4MDA4ZDogeyBuOlwiSGlkZU9ialwiLCBmOnBhcnNldWludDE2IH0sXG4weDAwOTA6IHsgbjpcIlNvcnRcIiB9LFxuMHgwMDkyOiB7IG46XCJQYWxldHRlXCIsIGY6cGFyc2VfUGFsZXR0ZSB9LFxuMHgwMDk3OiB7IG46XCJTeW5jXCIgfSxcbjB4MDA5ODogeyBuOlwiTFByXCIgfSxcbjB4MDA5OTogeyBuOlwiRHhHQ29sXCIgfSxcbjB4MDA5YTogeyBuOlwiRm5Hcm91cE5hbWVcIiB9LFxuMHgwMDliOiB7IG46XCJGaWx0ZXJNb2RlXCIgfSxcbjB4MDA5YzogeyBuOlwiQnVpbHRJbkZuR3JvdXBDb3VudFwiLCBmOnBhcnNldWludDE2IH0sXG4weDAwOWQ6IHsgbjpcIkF1dG9GaWx0ZXJJbmZvXCIgfSxcbjB4MDA5ZTogeyBuOlwiQXV0b0ZpbHRlclwiIH0sXG4weDAwYTA6IHsgbjpcIlNjbFwiLCBmOnBhcnNlX1NjbCB9LFxuMHgwMGExOiB7IG46XCJTZXR1cFwiLCBmOnBhcnNlX1NldHVwIH0sXG4weDAwYWU6IHsgbjpcIlNjZW5NYW5cIiB9LFxuMHgwMGFmOiB7IG46XCJTQ0VOQVJJT1wiIH0sXG4weDAwYjA6IHsgbjpcIlN4Vmlld1wiIH0sXG4weDAwYjE6IHsgbjpcIlN4dmRcIiB9LFxuMHgwMGIyOiB7IG46XCJTWFZJXCIgfSxcbjB4MDBiNDogeyBuOlwiU3hJdmRcIiB9LFxuMHgwMGI1OiB7IG46XCJTWExJXCIgfSxcbjB4MDBiNjogeyBuOlwiU1hQSVwiIH0sXG4weDAwYjg6IHsgbjpcIkRvY1JvdXRlXCIgfSxcbjB4MDBiOTogeyBuOlwiUmVjaXBOYW1lXCIgfSxcbjB4MDBiZDogeyBuOlwiTXVsUmtcIiwgZjpwYXJzZV9NdWxSayB9LFxuMHgwMGJlOiB7IG46XCJNdWxCbGFua1wiLCBmOnBhcnNlX011bEJsYW5rIH0sXG4weDAwYzE6IHsgbjonTW1zJywgZjpwYXJzZW5vb3AyIH0sXG4weDAwYzU6IHsgbjpcIlNYRElcIiB9LFxuMHgwMGM2OiB7IG46XCJTWERCXCIgfSxcbjB4MDBjNzogeyBuOlwiU1hGREJcIiB9LFxuMHgwMGM4OiB7IG46XCJTWERCQlwiIH0sXG4weDAwYzk6IHsgbjpcIlNYTnVtXCIgfSxcbjB4MDBjYTogeyBuOlwiU3hCb29sXCIsIGY6cGFyc2Vib29sIH0sXG4weDAwY2I6IHsgbjpcIlN4RXJyXCIgfSxcbjB4MDBjYzogeyBuOlwiU1hJbnRcIiB9LFxuMHgwMGNkOiB7IG46XCJTWFN0cmluZ1wiIH0sXG4weDAwY2U6IHsgbjpcIlNYRHRyXCIgfSxcbjB4MDBjZjogeyBuOlwiU3hOaWxcIiB9LFxuMHgwMGQwOiB7IG46XCJTWFRibFwiIH0sXG4weDAwZDE6IHsgbjpcIlNYVEJSR0lJVE1cIiB9LFxuMHgwMGQyOiB7IG46XCJTeFRicGdcIiB9LFxuMHgwMGQzOiB7IG46XCJPYlByb2pcIiB9LFxuMHgwMGQ1OiB7IG46XCJTWFN0cmVhbUlEXCIgfSxcbjB4MDBkNzogeyBuOlwiREJDZWxsXCIgfSxcbjB4MDBkODogeyBuOlwiU1hSbmdcIiB9LFxuMHgwMGQ5OiB7IG46XCJTeElzeG9wZXJcIiB9LFxuMHgwMGRhOiB7IG46XCJCb29rQm9vbFwiLCBmOnBhcnNldWludDE2IH0sXG4weDAwZGM6IHsgbjpcIkRiT3JQYXJhbVFyeVwiIH0sXG4weDAwZGQ6IHsgbjpcIlNjZW5hcmlvUHJvdGVjdFwiLCBmOnBhcnNlYm9vbCB9LFxuMHgwMGRlOiB7IG46XCJPbGVPYmplY3RTaXplXCIgfSxcbjB4MDBlMDogeyBuOlwiWEZcIiwgZjpwYXJzZV9YRiB9LFxuMHgwMGUxOiB7IG46J0ludGVyZmFjZUhkcicsIGY6cGFyc2VfSW50ZXJmYWNlSGRyIH0sXG4weDAwZTI6IHsgbjonSW50ZXJmYWNlRW5kJywgZjpwYXJzZW5vb3AyIH0sXG4weDAwZTM6IHsgbjpcIlNYVlNcIiB9LFxuMHgwMGU1OiB7IG46XCJNZXJnZUNlbGxzXCIsIGY6cGFyc2VfTWVyZ2VDZWxscyB9LFxuMHgwMGU5OiB7IG46XCJCa0hpbVwiIH0sXG4weDAwZWI6IHsgbjpcIk1zb0RyYXdpbmdHcm91cFwiIH0sXG4weDAwZWM6IHsgbjpcIk1zb0RyYXdpbmdcIiB9LFxuMHgwMGVkOiB7IG46XCJNc29EcmF3aW5nU2VsZWN0aW9uXCIgfSxcbjB4MDBlZjogeyBuOlwiUGhvbmV0aWNJbmZvXCIgfSxcbjB4MDBmMDogeyBuOlwiU3hSdWxlXCIgfSxcbjB4MDBmMTogeyBuOlwiU1hFeFwiIH0sXG4weDAwZjI6IHsgbjpcIlN4RmlsdFwiIH0sXG4weDAwZjQ6IHsgbjpcIlN4RFhGXCIgfSxcbjB4MDBmNTogeyBuOlwiU3hJdG1cIiB9LFxuMHgwMGY2OiB7IG46XCJTeE5hbWVcIiB9LFxuMHgwMGY3OiB7IG46XCJTeFNlbGVjdFwiIH0sXG4weDAwZjg6IHsgbjpcIlNYUGFpclwiIH0sXG4weDAwZjk6IHsgbjpcIlN4Rm1sYVwiIH0sXG4weDAwZmI6IHsgbjpcIlN4Rm9ybWF0XCIgfSxcbjB4MDBmYzogeyBuOlwiU1NUXCIsIGY6cGFyc2VfU1NUIH0sXG4weDAwZmQ6IHsgbjpcIkxhYmVsU3N0XCIsIGY6cGFyc2VfTGFiZWxTc3QgfSxcbjB4MDBmZjogeyBuOlwiRXh0U1NUXCIsIGY6cGFyc2VfRXh0U1NUIH0sXG4weDAxMDA6IHsgbjpcIlNYVkRFeFwiIH0sXG4weDAxMDM6IHsgbjpcIlNYRm9ybXVsYVwiIH0sXG4weDAxMjI6IHsgbjpcIlNYREJFeFwiIH0sXG4weDAxMzc6IHsgbjpcIlJSREluc0RlbFwiIH0sXG4weDAxMzg6IHsgbjpcIlJSREhlYWRcIiB9LFxuMHgwMTNiOiB7IG46XCJSUkRDaGdDZWxsXCIgfSxcbjB4MDEzZDogeyBuOlwiUlJUYWJJZFwiLCBmOnBhcnNldWludDE2YSB9LFxuMHgwMTNlOiB7IG46XCJSUkRSZW5TaGVldFwiIH0sXG4weDAxM2Y6IHsgbjpcIlJSU29ydFwiIH0sXG4weDAxNDA6IHsgbjpcIlJSRE1vdmVcIiB9LFxuMHgwMTRhOiB7IG46XCJSUkZvcm1hdFwiIH0sXG4weDAxNGI6IHsgbjpcIlJSQXV0b0ZtdFwiIH0sXG4weDAxNGQ6IHsgbjpcIlJSSW5zZXJ0U2hcIiB9LFxuMHgwMTRlOiB7IG46XCJSUkRNb3ZlQmVnaW5cIiB9LFxuMHgwMTRmOiB7IG46XCJSUkRNb3ZlRW5kXCIgfSxcbjB4MDE1MDogeyBuOlwiUlJESW5zRGVsQmVnaW5cIiB9LFxuMHgwMTUxOiB7IG46XCJSUkRJbnNEZWxFbmRcIiB9LFxuMHgwMTUyOiB7IG46XCJSUkRDb25mbGljdFwiIH0sXG4weDAxNTM6IHsgbjpcIlJSRERlZk5hbWVcIiB9LFxuMHgwMTU0OiB7IG46XCJSUkRSc3RFdHhwXCIgfSxcbjB4MDE1ZjogeyBuOlwiTFJuZ1wiIH0sXG4weDAxNjA6IHsgbjpcIlVzZXNFTEZzXCIsIGY6cGFyc2Vib29sIH0sXG4weDAxNjE6IHsgbjpcIkRTRlwiLCBmOnBhcnNlbm9vcDIgfSxcbjB4MDE5MTogeyBuOlwiQ1VzclwiIH0sXG4weDAxOTI6IHsgbjpcIkNiVXNyXCIgfSxcbjB4MDE5MzogeyBuOlwiVXNySW5mb1wiIH0sXG4weDAxOTQ6IHsgbjpcIlVzckV4Y2xcIiB9LFxuMHgwMTk1OiB7IG46XCJGaWxlTG9ja1wiIH0sXG4weDAxOTY6IHsgbjpcIlJSREluZm9cIiB9LFxuMHgwMTk3OiB7IG46XCJCQ1VzcnNcIiB9LFxuMHgwMTk4OiB7IG46XCJVc3JDaGtcIiB9LFxuMHgwMWE5OiB7IG46XCJVc2VyQlZpZXdcIiB9LFxuMHgwMWFhOiB7IG46XCJVc2VyU1ZpZXdCZWdpblwiIH0sXG4weDAxYWI6IHsgbjpcIlVzZXJTVmlld0VuZFwiIH0sXG4weDAxYWM6IHsgbjpcIlJSRFVzZXJWaWV3XCIgfSxcbjB4MDFhZDogeyBuOlwiUXNpXCIgfSxcbjB4MDFhZTogeyBuOlwiU3VwQm9va1wiLCBmOnBhcnNlX1N1cEJvb2sgfSxcbjB4MDFhZjogeyBuOlwiUHJvdDRSZXZcIiwgZjpwYXJzZWJvb2wgfSxcbjB4MDFiMDogeyBuOlwiQ29uZEZtdFwiIH0sXG4weDAxYjE6IHsgbjpcIkNGXCIgfSxcbjB4MDFiMjogeyBuOlwiRFZhbFwiIH0sXG4weDAxYjU6IHsgbjpcIkRDb25CaW5cIiB9LFxuMHgwMWI2OiB7IG46XCJUeE9cIiwgZjpwYXJzZV9UeE8gfSxcbjB4MDFiNzogeyBuOlwiUmVmcmVzaEFsbFwiLCBmOnBhcnNlYm9vbCB9LFxuMHgwMWI4OiB7IG46XCJITGlua1wiLCBmOnBhcnNlX0hMaW5rIH0sXG4weDAxYjk6IHsgbjpcIkxlbFwiIH0sXG4weDAxYmE6IHsgbjpcIkNvZGVOYW1lXCIsIGY6cGFyc2VfWExVbmljb2RlU3RyaW5nIH0sXG4weDAxYmI6IHsgbjpcIlNYRkRCVHlwZVwiIH0sXG4weDAxYmM6IHsgbjpcIlByb3Q0UmV2UGFzc1wiLCBmOnBhcnNldWludDE2IH0sXG4weDAxYmQ6IHsgbjpcIk9iTm9NYWNyb3NcIiB9LFxuMHgwMWJlOiB7IG46XCJEdlwiIH0sXG4weDAxYzA6IHsgbjpcIkV4Y2VsOUZpbGVcIiwgZjpwYXJzZW5vb3AyIH0sXG4weDAxYzE6IHsgbjpcIlJlY2FsY0lkXCIsIGY6cGFyc2VfUmVjYWxjSWQsIHI6Mn0sXG4weDAxYzI6IHsgbjpcIkVudEV4VTJcIiwgZjpwYXJzZW5vb3AyIH0sXG4weDAyMDA6IHsgbjpcIkRpbWVuc2lvbnNcIiwgZjpwYXJzZV9EaW1lbnNpb25zIH0sXG4weDAyMDE6IHsgbjpcIkJsYW5rXCIsIGY6cGFyc2VfQmxhbmsgfSxcbjB4MDIwMzogeyBuOlwiTnVtYmVyXCIsIGY6cGFyc2VfTnVtYmVyIH0sXG4weDAyMDQ6IHsgbjpcIkxhYmVsXCIsIGY6cGFyc2VfTGFiZWwgfSxcbjB4MDIwNTogeyBuOlwiQm9vbEVyclwiLCBmOnBhcnNlX0Jvb2xFcnIgfSxcbjB4MDIwNjogeyBuOlwiRm9ybXVsYVwiLCBmOnBhcnNlX0Zvcm11bGEgfSxcbjB4MDIwNzogeyBuOlwiU3RyaW5nXCIsIGY6cGFyc2VfU3RyaW5nIH0sXG4weDAyMDg6IHsgbjonUm93JywgZjpwYXJzZV9Sb3cgfSxcbjB4MDIwYjogeyBuOlwiSW5kZXhcIiB9LFxuMHgwMjIxOiB7IG46XCJBcnJheVwiLCBmOnBhcnNlX0FycmF5IH0sXG4weDAyMjU6IHsgbjpcIkRlZmF1bHRSb3dIZWlnaHRcIiwgZjpwYXJzZV9EZWZhdWx0Um93SGVpZ2h0IH0sXG4weDAyMzY6IHsgbjpcIlRhYmxlXCIgfSxcbjB4MDIzZTogeyBuOlwiV2luZG93MlwiLCBmOnBhcnNlX1dpbmRvdzIgfSxcbjB4MDI3ZTogeyBuOlwiUktcIiwgZjpwYXJzZV9SSyB9LFxuMHgwMjkzOiB7IG46XCJTdHlsZVwiIH0sXG4weDA0MDY6IHsgbjpcIkZvcm11bGFcIiwgZjpwYXJzZV9Gb3JtdWxhIH0sXG4weDA0MTg6IHsgbjpcIkJpZ05hbWVcIiB9LFxuMHgwNDFlOiB7IG46XCJGb3JtYXRcIiwgZjpwYXJzZV9Gb3JtYXQgfSxcbjB4MDQzYzogeyBuOlwiQ29udGludWVCaWdOYW1lXCIgfSxcbjB4MDRiYzogeyBuOlwiU2hyRm1sYVwiLCBmOnBhcnNlX1NockZtbGEgfSxcbjB4MDgwMDogeyBuOlwiSExpbmtUb29sdGlwXCIsIGY6cGFyc2VfSExpbmtUb29sdGlwIH0sXG4weDA4MDE6IHsgbjpcIldlYlB1YlwiIH0sXG4weDA4MDI6IHsgbjpcIlFzaVNYVGFnXCIgfSxcbjB4MDgwMzogeyBuOlwiREJRdWVyeUV4dFwiIH0sXG4weDA4MDQ6IHsgbjpcIkV4dFN0cmluZ1wiIH0sXG4weDA4MDU6IHsgbjpcIlR4dFFyeVwiIH0sXG4weDA4MDY6IHsgbjpcIlFzaXJcIiB9LFxuMHgwODA3OiB7IG46XCJRc2lmXCIgfSxcbjB4MDgwODogeyBuOlwiUlJEVFFTSUZcIiB9LFxuMHgwODA5OiB7IG46J0JPRicsIGY6cGFyc2VfQk9GIH0sXG4weDA4MGE6IHsgbjpcIk9sZURiQ29ublwiIH0sXG4weDA4MGI6IHsgbjpcIldPcHRcIiB9LFxuMHgwODBjOiB7IG46XCJTWFZpZXdFeFwiIH0sXG4weDA4MGQ6IHsgbjpcIlNYVEhcIiB9LFxuMHgwODBlOiB7IG46XCJTWFBJRXhcIiB9LFxuMHgwODBmOiB7IG46XCJTWFZEVEV4XCIgfSxcbjB4MDgxMDogeyBuOlwiU1hWaWV3RXg5XCIgfSxcbjB4MDgxMjogeyBuOlwiQ29udGludWVGcnRcIiB9LFxuMHgwODEzOiB7IG46XCJSZWFsVGltZURhdGFcIiB9LFxuMHgwODUwOiB7IG46XCJDaGFydEZydEluZm9cIiB9LFxuMHgwODUxOiB7IG46XCJGcnRXcmFwcGVyXCIgfSxcbjB4MDg1MjogeyBuOlwiU3RhcnRCbG9ja1wiIH0sXG4weDA4NTM6IHsgbjpcIkVuZEJsb2NrXCIgfSxcbjB4MDg1NDogeyBuOlwiU3RhcnRPYmplY3RcIiB9LFxuMHgwODU1OiB7IG46XCJFbmRPYmplY3RcIiB9LFxuMHgwODU2OiB7IG46XCJDYXRMYWJcIiB9LFxuMHgwODU3OiB7IG46XCJZTXVsdFwiIH0sXG4weDA4NTg6IHsgbjpcIlNYVmlld0xpbmtcIiB9LFxuMHgwODU5OiB7IG46XCJQaXZvdENoYXJ0Qml0c1wiIH0sXG4weDA4NWE6IHsgbjpcIkZydEZvbnRMaXN0XCIgfSxcbjB4MDg2MjogeyBuOlwiU2hlZXRFeHRcIiB9LFxuMHgwODYzOiB7IG46XCJCb29rRXh0XCIsIHI6MTJ9LFxuMHgwODY0OiB7IG46XCJTWEFkZGxcIiB9LFxuMHgwODY1OiB7IG46XCJDckVyclwiIH0sXG4weDA4NjY6IHsgbjpcIkhGUGljdHVyZVwiIH0sXG4weDA4Njc6IHsgbjonRmVhdEhkcicsIGY6cGFyc2Vub29wMiB9LFxuMHgwODY4OiB7IG46XCJGZWF0XCIgfSxcbjB4MDg2YTogeyBuOlwiRGF0YUxhYkV4dFwiIH0sXG4weDA4NmI6IHsgbjpcIkRhdGFMYWJFeHRDb250ZW50c1wiIH0sXG4weDA4NmM6IHsgbjpcIkNlbGxXYXRjaFwiIH0sXG4weDA4NzE6IHsgbjpcIkZlYXRIZHIxMVwiIH0sXG4weDA4NzI6IHsgbjpcIkZlYXR1cmUxMVwiIH0sXG4weDA4NzQ6IHsgbjpcIkRyb3BEb3duT2JqSWRzXCIgfSxcbjB4MDg3NTogeyBuOlwiQ29udGludWVGcnQxMVwiIH0sXG4weDA4NzY6IHsgbjpcIkRDb25uXCIgfSxcbjB4MDg3NzogeyBuOlwiTGlzdDEyXCIgfSxcbjB4MDg3ODogeyBuOlwiRmVhdHVyZTEyXCIgfSxcbjB4MDg3OTogeyBuOlwiQ29uZEZtdDEyXCIgfSxcbjB4MDg3YTogeyBuOlwiQ0YxMlwiIH0sXG4weDA4N2I6IHsgbjpcIkNGRXhcIiB9LFxuMHgwODdjOiB7IG46XCJYRkNSQ1wiLCBmOnBhcnNlX1hGQ1JDLCByOjEyIH0sXG4weDA4N2Q6IHsgbjpcIlhGRXh0XCIsIGY6cGFyc2VfWEZFeHQsIHI6MTIgfSxcbjB4MDg3ZTogeyBuOlwiQXV0b0ZpbHRlcjEyXCIgfSxcbjB4MDg3ZjogeyBuOlwiQ29udGludWVGcnQxMlwiIH0sXG4weDA4ODQ6IHsgbjpcIk1EVEluZm9cIiB9LFxuMHgwODg1OiB7IG46XCJNRFhTdHJcIiB9LFxuMHgwODg2OiB7IG46XCJNRFhUdXBsZVwiIH0sXG4weDA4ODc6IHsgbjpcIk1EWFNldFwiIH0sXG4weDA4ODg6IHsgbjpcIk1EWFByb3BcIiB9LFxuMHgwODg5OiB7IG46XCJNRFhLUElcIiB9LFxuMHgwODhhOiB7IG46XCJNREJcIiB9LFxuMHgwODhiOiB7IG46XCJQTFZcIiB9LFxuMHgwODhjOiB7IG46XCJDb21wYXQxMlwiLCBmOnBhcnNlYm9vbCwgcjoxMiB9LFxuMHgwODhkOiB7IG46XCJEWEZcIiB9LFxuMHgwODhlOiB7IG46XCJUYWJsZVN0eWxlc1wiLCByOjEyIH0sXG4weDA4OGY6IHsgbjpcIlRhYmxlU3R5bGVcIiB9LFxuMHgwODkwOiB7IG46XCJUYWJsZVN0eWxlRWxlbWVudFwiIH0sXG4weDA4OTI6IHsgbjpcIlN0eWxlRXh0XCIgfSxcbjB4MDg5MzogeyBuOlwiTmFtZVB1Ymxpc2hcIiB9LFxuMHgwODk0OiB7IG46XCJOYW1lQ210XCIsIGY6cGFyc2VfTmFtZUNtdCwgcjoxMiB9LFxuMHgwODk1OiB7IG46XCJTb3J0RGF0YVwiIH0sXG4weDA4OTY6IHsgbjpcIlRoZW1lXCIsIGY6cGFyc2VfVGhlbWUsIHI6MTIgfSxcbjB4MDg5NzogeyBuOlwiR1VJRFR5cGVMaWJcIiB9LFxuMHgwODk4OiB7IG46XCJGbkdycDEyXCIgfSxcbjB4MDg5OTogeyBuOlwiTmFtZUZuR3JwMTJcIiB9LFxuMHgwODlhOiB7IG46XCJNVFJTZXR0aW5nc1wiLCBmOnBhcnNlX01UUlNldHRpbmdzLCByOjEyIH0sXG4weDA4OWI6IHsgbjpcIkNvbXByZXNzUGljdHVyZXNcIiwgZjpwYXJzZW5vb3AyIH0sXG4weDA4OWM6IHsgbjpcIkhlYWRlckZvb3RlclwiIH0sXG4weDA4OWQ6IHsgbjpcIkNydExheW91dDEyXCIgfSxcbjB4MDg5ZTogeyBuOlwiQ3J0TWxGcnRcIiB9LFxuMHgwODlmOiB7IG46XCJDcnRNbEZydENvbnRpbnVlXCIgfSxcbjB4MDhhMzogeyBuOlwiRm9yY2VGdWxsQ2FsY3VsYXRpb25cIiwgZjpwYXJzZV9Gb3JjZUZ1bGxDYWxjdWxhdGlvbiB9LFxuMHgwOGE0OiB7IG46XCJTaGFwZVByb3BzU3RyZWFtXCIgfSxcbjB4MDhhNTogeyBuOlwiVGV4dFByb3BzU3RyZWFtXCIgfSxcbjB4MDhhNjogeyBuOlwiUmljaFRleHRTdHJlYW1cIiB9LFxuMHgwOGE3OiB7IG46XCJDcnRMYXlvdXQxMkFcIiB9LFxuMHgxMDAxOiB7IG46XCJVbml0c1wiIH0sXG4weDEwMDI6IHsgbjpcIkNoYXJ0XCIgfSxcbjB4MTAwMzogeyBuOlwiU2VyaWVzXCIgfSxcbjB4MTAwNjogeyBuOlwiRGF0YUZvcm1hdFwiIH0sXG4weDEwMDc6IHsgbjpcIkxpbmVGb3JtYXRcIiB9LFxuMHgxMDA5OiB7IG46XCJNYXJrZXJGb3JtYXRcIiB9LFxuMHgxMDBhOiB7IG46XCJBcmVhRm9ybWF0XCIgfSxcbjB4MTAwYjogeyBuOlwiUGllRm9ybWF0XCIgfSxcbjB4MTAwYzogeyBuOlwiQXR0YWNoZWRMYWJlbFwiIH0sXG4weDEwMGQ6IHsgbjpcIlNlcmllc1RleHRcIiB9LFxuMHgxMDE0OiB7IG46XCJDaGFydEZvcm1hdFwiIH0sXG4weDEwMTU6IHsgbjpcIkxlZ2VuZFwiIH0sXG4weDEwMTY6IHsgbjpcIlNlcmllc0xpc3RcIiB9LFxuMHgxMDE3OiB7IG46XCJCYXJcIiB9LFxuMHgxMDE4OiB7IG46XCJMaW5lXCIgfSxcbjB4MTAxOTogeyBuOlwiUGllXCIgfSxcbjB4MTAxYTogeyBuOlwiQXJlYVwiIH0sXG4weDEwMWI6IHsgbjpcIlNjYXR0ZXJcIiB9LFxuMHgxMDFjOiB7IG46XCJDcnRMaW5lXCIgfSxcbjB4MTAxZDogeyBuOlwiQXhpc1wiIH0sXG4weDEwMWU6IHsgbjpcIlRpY2tcIiB9LFxuMHgxMDFmOiB7IG46XCJWYWx1ZVJhbmdlXCIgfSxcbjB4MTAyMDogeyBuOlwiQ2F0U2VyUmFuZ2VcIiB9LFxuMHgxMDIxOiB7IG46XCJBeGlzTGluZVwiIH0sXG4weDEwMjI6IHsgbjpcIkNydExpbmtcIiB9LFxuMHgxMDI0OiB7IG46XCJEZWZhdWx0VGV4dFwiIH0sXG4weDEwMjU6IHsgbjpcIlRleHRcIiB9LFxuMHgxMDI2OiB7IG46XCJGb250WFwiLCBmOnBhcnNldWludDE2IH0sXG4weDEwMjc6IHsgbjpcIk9iamVjdExpbmtcIiB9LFxuMHgxMDMyOiB7IG46XCJGcmFtZVwiIH0sXG4weDEwMzM6IHsgbjpcIkJlZ2luXCIgfSxcbjB4MTAzNDogeyBuOlwiRW5kXCIgfSxcbjB4MTAzNTogeyBuOlwiUGxvdEFyZWFcIiB9LFxuMHgxMDNhOiB7IG46XCJDaGFydDNkXCIgfSxcbjB4MTAzYzogeyBuOlwiUGljRlwiIH0sXG4weDEwM2Q6IHsgbjpcIkRyb3BCYXJcIiB9LFxuMHgxMDNlOiB7IG46XCJSYWRhclwiIH0sXG4weDEwM2Y6IHsgbjpcIlN1cmZcIiB9LFxuMHgxMDQwOiB7IG46XCJSYWRhckFyZWFcIiB9LFxuMHgxMDQxOiB7IG46XCJBeGlzUGFyZW50XCIgfSxcbjB4MTA0MzogeyBuOlwiTGVnZW5kRXhjZXB0aW9uXCIgfSxcbjB4MTA0NDogeyBuOlwiU2h0UHJvcHNcIiwgZjpwYXJzZV9TaHRQcm9wcyB9LFxuMHgxMDQ1OiB7IG46XCJTZXJUb0NydFwiIH0sXG4weDEwNDY6IHsgbjpcIkF4ZXNVc2VkXCIgfSxcbjB4MTA0ODogeyBuOlwiU0Jhc2VSZWZcIiB9LFxuMHgxMDRhOiB7IG46XCJTZXJQYXJlbnRcIiB9LFxuMHgxMDRiOiB7IG46XCJTZXJBdXhUcmVuZFwiIH0sXG4weDEwNGU6IHsgbjpcIklGbXRSZWNvcmRcIiB9LFxuMHgxMDRmOiB7IG46XCJQb3NcIiB9LFxuMHgxMDUwOiB7IG46XCJBbFJ1bnNcIiB9LFxuMHgxMDUxOiB7IG46XCJCUkFJXCIgfSxcbjB4MTA1YjogeyBuOlwiU2VyQXV4RXJyQmFyXCIgfSxcbjB4MTA1YzogeyBuOlwiQ2xydENsaWVudFwiLCBmOnBhcnNlX0NscnRDbGllbnQgfSxcbjB4MTA1ZDogeyBuOlwiU2VyRm10XCIgfSxcbjB4MTA1ZjogeyBuOlwiQ2hhcnQzREJhclNoYXBlXCIgfSxcbjB4MTA2MDogeyBuOlwiRmJpXCIgfSxcbjB4MTA2MTogeyBuOlwiQm9wUG9wXCIgfSxcbjB4MTA2MjogeyBuOlwiQXhjRXh0XCIgfSxcbjB4MTA2MzogeyBuOlwiRGF0XCIgfSxcbjB4MTA2NDogeyBuOlwiUGxvdEdyb3d0aFwiIH0sXG4weDEwNjU6IHsgbjpcIlNJSW5kZXhcIiB9LFxuMHgxMDY2OiB7IG46XCJHZWxGcmFtZVwiIH0sXG4weDEwNjc6IHsgbjpcIkJvcFBvcEN1c3RvbVwiIH0sXG4weDEwNjg6IHsgbjpcIkZiaTJcIiB9LFxuXG4weDAwMDA6IHsgbjpcIkRpbWVuc2lvbnNcIiwgZjpwYXJzZV9EaW1lbnNpb25zIH0sXG4weDAwMDI6IHsgbjpcIkJJRkYySU5UXCIsIGY6cGFyc2VfQklGRjJJTlQgfSxcbjB4MDAwNTogeyBuOlwiQm9vbEVyclwiLCBmOnBhcnNlX0Jvb2xFcnIgfSxcbjB4MDAwNzogeyBuOlwiU3RyaW5nXCIsIGY6cGFyc2VfQklGRjJTVFJJTkcgfSxcbjB4MDAwODogeyBuOlwiQklGRjJST1dcIiB9LFxuMHgwMDBiOiB7IG46XCJJbmRleFwiIH0sXG4weDAwMTY6IHsgbjpcIkV4dGVybkNvdW50XCIsIGY6cGFyc2V1aW50MTYgfSxcbjB4MDAxZTogeyBuOlwiQklGRjJGT1JNQVRcIiwgZjpwYXJzZV9CSUZGMkZvcm1hdCB9LFxuMHgwMDFmOiB7IG46XCJCSUZGMkZNVENOVFwiIH0sIC8qIDE2LWJpdCBjbnQgb2YgQklGRjJGT1JNQVQgcmVjb3JkcyAqL1xuMHgwMDIwOiB7IG46XCJCSUZGMkNPTElORk9cIiB9LFxuMHgwMDIxOiB7IG46XCJBcnJheVwiLCBmOnBhcnNlX0FycmF5IH0sXG4weDAwMjU6IHsgbjpcIkRlZmF1bHRSb3dIZWlnaHRcIiwgZjpwYXJzZV9EZWZhdWx0Um93SGVpZ2h0IH0sXG4weDAwMzI6IHsgbjpcIkJJRkYyRk9OVFhUUkFcIiwgZjpwYXJzZV9CSUZGMkZPTlRYVFJBIH0sXG4weDAwMzQ6IHsgbjpcIkRERU9iak5hbWVcIiB9LFxuMHgwMDNlOiB7IG46XCJCSUZGMldJTkRPVzJcIiB9LFxuMHgwMDQzOiB7IG46XCJCSUZGMlhGXCIgfSxcbjB4MDA0NTogeyBuOlwiQklGRjJGT05UQ0xSXCIgfSxcbjB4MDA1NjogeyBuOlwiQklGRjRGTVRDTlRcIiB9LCAvKiAxNi1iaXQgY250LCBzaW1pbGFyIHRvIEJJRkYyICovXG4weDAwN2U6IHsgbjpcIlJLXCIgfSwgLyogTm90IG5lY2Vzc2FyaWx5IHNhbWUgYXMgMHgwMjdlICovXG4weDAwN2Y6IHsgbjpcIkltRGF0YVwiLCBmOnBhcnNlX0ltRGF0YSB9LFxuMHgwMDg3OiB7IG46XCJBZGRpblwiIH0sXG4weDAwODg6IHsgbjpcIkVkZ1wiIH0sXG4weDAwODk6IHsgbjpcIlB1YlwiIH0sXG4weDAwOTE6IHsgbjpcIlN1YlwiIH0sXG4weDAwOTQ6IHsgbjpcIkxIUmVjb3JkXCIgfSxcbjB4MDA5NTogeyBuOlwiTEhOR3JhcGhcIiB9LFxuMHgwMDk2OiB7IG46XCJTb3VuZFwiIH0sXG4weDAwYTk6IHsgbjpcIkNvb3JkTGlzdFwiIH0sXG4weDAwYWI6IHsgbjpcIkdDV1wiIH0sXG4weDAwYmM6IHsgbjpcIlNockZtbGFcIiB9LCAvKiBOb3QgbmVjZXNzYXJpbHkgc2FtZSBhcyAweDA0YmMgKi9cbjB4MDBiZjogeyBuOlwiVG9vbGJhckhkclwiIH0sXG4weDAwYzA6IHsgbjpcIlRvb2xiYXJFbmRcIiB9LFxuMHgwMGMyOiB7IG46XCJBZGRNZW51XCIgfSxcbjB4MDBjMzogeyBuOlwiRGVsTWVudVwiIH0sXG4weDAwZDY6IHsgbjpcIlJTdHJpbmdcIiwgZjpwYXJzZV9SU3RyaW5nIH0sXG4weDAwZGY6IHsgbjpcIlVERGVzY1wiIH0sXG4weDAwZWE6IHsgbjpcIlRhYklkQ29uZlwiIH0sXG4weDAxNjI6IHsgbjpcIlhMNU1vZGlmeVwiIH0sXG4weDAxYTU6IHsgbjpcIkZpbGVTaGFyaW5nMlwiIH0sXG4weDAyMDk6IHsgbjonQk9GJywgZjpwYXJzZV9CT0YgfSxcbjB4MDIxODogeyBuOlwiTGJsXCIsIGY6cGFyc2VfTGJsIH0sXG4weDAyMjM6IHsgbjpcIkV4dGVybk5hbWVcIiwgZjpwYXJzZV9FeHRlcm5OYW1lIH0sXG4weDAyMzE6IHsgbjpcIkZvbnRcIiB9LFxuMHgwMjQzOiB7IG46XCJCSUZGM1hGXCIgfSxcbjB4MDQwOTogeyBuOidCT0YnLCBmOnBhcnNlX0JPRiB9LFxuMHgwNDQzOiB7IG46XCJCSUZGNFhGXCIgfSxcbjB4MDg2ZDogeyBuOlwiRmVhdEluZm9cIiB9LFxuMHgwODczOiB7IG46XCJGZWF0SW5mbzExXCIgfSxcbjB4MDg4MTogeyBuOlwiU1hBZGRsMTJcIiB9LFxuMHgwOGMwOiB7IG46XCJBdXRvV2ViUHViXCIgfSxcbjB4MDhjMTogeyBuOlwiTGlzdE9ialwiIH0sXG4weDA4YzI6IHsgbjpcIkxpc3RGaWVsZFwiIH0sXG4weDA4YzM6IHsgbjpcIkxpc3REVlwiIH0sXG4weDA4YzQ6IHsgbjpcIkxpc3RDb25kRm10XCIgfSxcbjB4MDhjNTogeyBuOlwiTGlzdENGXCIgfSxcbjB4MDhjNjogeyBuOlwiRk1RcnlcIiB9LFxuMHgwOGM3OiB7IG46XCJGTVNRcnlcIiB9LFxuMHgwOGM4OiB7IG46XCJQTFZcIiB9LFxuMHgwOGM5OiB7IG46XCJMbkV4dFwiIH0sXG4weDA4Y2E6IHsgbjpcIk1rckV4dFwiIH0sXG4weDA4Y2I6IHsgbjpcIkNydENvb3B0XCIgfSxcbjB4MDhkNjogeyBuOlwiRlJUQXJjaElkJFwiLCByOjEyIH0sXG5cbjB4NzI2Mjoge31cbn07XG5cbnZhciBYTFNSRSA9IGV2ZXJ0X2tleShYTFNSZWNvcmRFbnVtLCAnbicpO1xuZnVuY3Rpb24gd3JpdGVfYmlmZl9yZWMoYmEsIHR5cGUsIHBheWxvYWQsIGxlbmd0aCkge1xuXHR2YXIgdCA9ICt0eXBlIHx8ICtYTFNSRVt0eXBlXTtcblx0aWYoaXNOYU4odCkpIHJldHVybjtcblx0dmFyIGxlbiA9IGxlbmd0aCB8fCAocGF5bG9hZHx8W10pLmxlbmd0aCB8fCAwO1xuXHR2YXIgbyA9IGJhLm5leHQoNCk7XG5cdG8ud3JpdGVfc2hpZnQoMiwgdCk7XG5cdG8ud3JpdGVfc2hpZnQoMiwgbGVuKTtcblx0aWYobGVuID4gMCAmJiBpc19idWYocGF5bG9hZCkpIGJhLnB1c2gocGF5bG9hZCk7XG59XG5cbmZ1bmN0aW9uIHdyaXRlX2JpZmZfY29udGludWUoYmEsIHR5cGUsIHBheWxvYWQsIGxlbmd0aCkge1xuXHR2YXIgbGVuID0gbGVuZ3RoIHx8IChwYXlsb2FkfHxbXSkubGVuZ3RoIHx8IDA7XG5cdGlmKGxlbiA8PSA4MjI0KSByZXR1cm4gd3JpdGVfYmlmZl9yZWMoYmEsIHR5cGUsIHBheWxvYWQsIGxlbik7XG5cdHZhciB0ID0gK3R5cGUgfHwgK1hMU1JFW3R5cGVdO1xuXHRpZihpc05hTih0KSkgcmV0dXJuO1xuXHR2YXIgcGFydHMgPSBwYXlsb2FkLnBhcnRzIHx8IFtdLCBzaWR4ID0gMDtcblx0dmFyIGkgPSAwLCB3ID0gMDtcblx0d2hpbGUodyArIChwYXJ0c1tzaWR4XSB8fCA4MjI0KSA8PSA4MjI0KSB7IHcrPSAocGFydHNbc2lkeF0gfHwgODIyNCk7IHNpZHgrKzsgfVxuXHR2YXIgbyA9IGJhLm5leHQoNCk7XG5cdG8ud3JpdGVfc2hpZnQoMiwgdCk7XG5cdG8ud3JpdGVfc2hpZnQoMiwgdyk7XG5cdGJhLnB1c2gocGF5bG9hZC5zbGljZShpLCBpICsgdykpO1xuXHRpICs9IHc7XG5cdHdoaWxlKGkgPCBsZW4pIHtcblx0XHRvID0gYmEubmV4dCg0KTtcblx0XHRvLndyaXRlX3NoaWZ0KDIsIDB4M2MpOyAvLyBUT0RPOiBmaWd1cmUgb3V0IGNvcnJlY3QgY29udGludWUgdHlwZVxuXHRcdHcgPSAwO1xuXHRcdHdoaWxlKHcgKyAocGFydHNbc2lkeF0gfHwgODIyNCkgPD0gODIyNCkgeyB3Kz0gKHBhcnRzW3NpZHhdIHx8IDgyMjQpOyBzaWR4Kys7IH1cblx0XHRvLndyaXRlX3NoaWZ0KDIsIHcpO1xuXHRcdGJhLnB1c2gocGF5bG9hZC5zbGljZShpLCBpK3cpKTsgaSs9IHc7XG5cdH1cbn1cblxuZnVuY3Rpb24gd3JpdGVfQklGRjJDZWxsKG91dCwgciwgYykge1xuXHRpZighb3V0KSBvdXQgPSBuZXdfYnVmKDcpO1xuXHRvdXQud3JpdGVfc2hpZnQoMiwgcik7XG5cdG91dC53cml0ZV9zaGlmdCgyLCBjKTtcblx0b3V0LndyaXRlX3NoaWZ0KDIsIDApO1xuXHRvdXQud3JpdGVfc2hpZnQoMSwgMCk7XG5cdHJldHVybiBvdXQ7XG59XG5cbmZ1bmN0aW9uIHdyaXRlX0JJRkYyQkVSUihyLCBjLCB2YWwsIHQpIHtcblx0dmFyIG91dCA9IG5ld19idWYoOSk7XG5cdHdyaXRlX0JJRkYyQ2VsbChvdXQsIHIsIGMpO1xuXHRpZih0ID09ICdlJykgeyBvdXQud3JpdGVfc2hpZnQoMSwgdmFsKTsgb3V0LndyaXRlX3NoaWZ0KDEsIDEpOyB9XG5cdGVsc2UgeyBvdXQud3JpdGVfc2hpZnQoMSwgdmFsPzE6MCk7IG91dC53cml0ZV9zaGlmdCgxLCAwKTsgfVxuXHRyZXR1cm4gb3V0O1xufVxuXG4vKiBUT0RPOiBjb2RlcGFnZSwgbGFyZ2Ugc3RyaW5ncyAqL1xuZnVuY3Rpb24gd3JpdGVfQklGRjJMQUJFTChyLCBjLCB2YWwpIHtcblx0dmFyIG91dCA9IG5ld19idWYoOCArIDIqdmFsLmxlbmd0aCk7XG5cdHdyaXRlX0JJRkYyQ2VsbChvdXQsIHIsIGMpO1xuXHRvdXQud3JpdGVfc2hpZnQoMSwgdmFsLmxlbmd0aCk7XG5cdG91dC53cml0ZV9zaGlmdCh2YWwubGVuZ3RoLCB2YWwsICdzYmNzJyk7XG5cdHJldHVybiBvdXQubCA8IG91dC5sZW5ndGggPyBvdXQuc2xpY2UoMCwgb3V0LmwpIDogb3V0O1xufVxuXG5mdW5jdGlvbiB3cml0ZV93c19iaWZmMl9jZWxsKGJhLCBjZWxsLCBSLCBDKSB7XG5cdGlmKGNlbGwudiAhPSBudWxsKSBzd2l0Y2goY2VsbC50KSB7XG5cdFx0Y2FzZSAnZCc6IGNhc2UgJ24nOlxuXHRcdFx0dmFyIHYgPSBjZWxsLnQgPT0gJ2QnID8gZGF0ZW51bShwYXJzZURhdGUoY2VsbC52KSkgOiBjZWxsLnY7XG5cdFx0XHRpZigodiA9PSAodnwwKSkgJiYgKHYgPj0gMCkgJiYgKHYgPCA2NTUzNikpXG5cdFx0XHRcdHdyaXRlX2JpZmZfcmVjKGJhLCAweDAwMDIsIHdyaXRlX0JJRkYySU5UKFIsIEMsIHYpKTtcblx0XHRcdGVsc2Vcblx0XHRcdFx0d3JpdGVfYmlmZl9yZWMoYmEsIDB4MDAwMywgd3JpdGVfQklGRjJOVU0oUixDLCB2KSk7XG5cdFx0XHRyZXR1cm47XG5cdFx0Y2FzZSAnYic6IGNhc2UgJ2UnOiB3cml0ZV9iaWZmX3JlYyhiYSwgMHgwMDA1LCB3cml0ZV9CSUZGMkJFUlIoUiwgQywgY2VsbC52LCBjZWxsLnQpKTsgcmV0dXJuO1xuXHRcdC8qIFRPRE86IGNvZGVwYWdlLCBzc3QgKi9cblx0XHRjYXNlICdzJzogY2FzZSAnc3RyJzpcblx0XHRcdHdyaXRlX2JpZmZfcmVjKGJhLCAweDAwMDQsIHdyaXRlX0JJRkYyTEFCRUwoUiwgQywgY2VsbC52KSk7XG5cdFx0XHRyZXR1cm47XG5cdH1cblx0d3JpdGVfYmlmZl9yZWMoYmEsIDB4MDAwMSwgd3JpdGVfQklGRjJDZWxsKG51bGwsIFIsIEMpKTtcbn1cblxuZnVuY3Rpb24gd3JpdGVfd3NfYmlmZjIoYmEsIHdzLCBpZHgsIG9wdHMpIHtcblx0dmFyIGRlbnNlID0gQXJyYXkuaXNBcnJheSh3cyk7XG5cdHZhciByYW5nZSA9IHNhZmVfZGVjb2RlX3JhbmdlKHdzWychcmVmJ10gfHwgXCJBMVwiKSwgcmVmLCByciA9IFwiXCIsIGNvbHMgPSBbXTtcblx0aWYocmFuZ2UuZS5jID4gMHhGRiB8fCByYW5nZS5lLnIgPiAweDNGRkYpIHtcblx0XHRpZihvcHRzLldURikgdGhyb3cgbmV3IEVycm9yKFwiUmFuZ2UgXCIgKyAod3NbJyFyZWYnXSB8fCBcIkExXCIpICsgXCIgZXhjZWVkcyBmb3JtYXQgbGltaXQgQTE6SVYxNjM4NFwiKTtcblx0XHRyYW5nZS5lLmMgPSBNYXRoLm1pbihyYW5nZS5lLmMsIDB4RkYpO1xuXHRcdHJhbmdlLmUuciA9IE1hdGgubWluKHJhbmdlLmUuYywgMHgzRkZGKTtcblx0XHRyZWYgPSBlbmNvZGVfcmFuZ2UocmFuZ2UpO1xuXHR9XG5cdGZvcih2YXIgUiA9IHJhbmdlLnMucjsgUiA8PSByYW5nZS5lLnI7ICsrUikge1xuXHRcdHJyID0gZW5jb2RlX3JvdyhSKTtcblx0XHRmb3IodmFyIEMgPSByYW5nZS5zLmM7IEMgPD0gcmFuZ2UuZS5jOyArK0MpIHtcblx0XHRcdGlmKFIgPT09IHJhbmdlLnMucikgY29sc1tDXSA9IGVuY29kZV9jb2woQyk7XG5cdFx0XHRyZWYgPSBjb2xzW0NdICsgcnI7XG5cdFx0XHR2YXIgY2VsbCA9IGRlbnNlID8gKHdzW1JdfHxbXSlbQ10gOiB3c1tyZWZdO1xuXHRcdFx0aWYoIWNlbGwpIGNvbnRpbnVlO1xuXHRcdFx0Lyogd3JpdGUgY2VsbCAqL1xuXHRcdFx0d3JpdGVfd3NfYmlmZjJfY2VsbChiYSwgY2VsbCwgUiwgQywgb3B0cyk7XG5cdFx0fVxuXHR9XG59XG5cbi8qIEJhc2VkIG9uIHRlc3QgZmlsZXMgKi9cbmZ1bmN0aW9uIHdyaXRlX2JpZmYyX2J1Zih3Yiwgb3B0cykge1xuXHR2YXIgbyA9IG9wdHMgfHwge307XG5cdGlmKERFTlNFICE9IG51bGwgJiYgby5kZW5zZSA9PSBudWxsKSBvLmRlbnNlID0gREVOU0U7XG5cdHZhciBiYSA9IGJ1Zl9hcnJheSgpO1xuXHR2YXIgaWR4ID0gMDtcblx0Zm9yKHZhciBpPTA7aTx3Yi5TaGVldE5hbWVzLmxlbmd0aDsrK2kpIGlmKHdiLlNoZWV0TmFtZXNbaV0gPT0gby5zaGVldCkgaWR4PWk7XG5cdGlmKGlkeCA9PSAwICYmICEhby5zaGVldCAmJiB3Yi5TaGVldE5hbWVzWzBdICE9IG8uc2hlZXQpIHRocm93IG5ldyBFcnJvcihcIlNoZWV0IG5vdCBmb3VuZDogXCIgKyBvLnNoZWV0KTtcblx0d3JpdGVfYmlmZl9yZWMoYmEsIDB4MDAwOSwgd3JpdGVfQk9GKHdiLCAweDEwLCBvKSk7XG5cdC8qIC4uLiAqL1xuXHR3cml0ZV93c19iaWZmMihiYSwgd2IuU2hlZXRzW3diLlNoZWV0TmFtZXNbaWR4XV0sIGlkeCwgbywgd2IpO1xuXHQvKiAuLi4gKi9cblx0d3JpdGVfYmlmZl9yZWMoYmEsIDB4MDAwQSk7XG5cdHJldHVybiBiYS5lbmQoKTtcbn1cblxuZnVuY3Rpb24gd3JpdGVfRk9OVFNfYmlmZjgoYmEsIGRhdGEsIG9wdHMpIHtcblx0d3JpdGVfYmlmZl9yZWMoYmEsIFwiRm9udFwiLCB3cml0ZV9Gb250KHtcblx0XHRzejoxMixcblx0XHRjb2xvcjoge3RoZW1lOjF9LFxuXHRcdG5hbWU6IFwiQXJpYWxcIixcblx0XHRmYW1pbHk6IDIsXG5cdFx0c2NoZW1lOiBcIm1pbm9yXCJcblx0fSwgb3B0cykpO1xufVxuXG5cbmZ1bmN0aW9uIHdyaXRlX0ZNVFNfYmlmZjgoYmEsIE5GLCBvcHRzKSB7XG5cdGlmKCFORikgcmV0dXJuO1xuXHRbWzUsOF0sWzIzLDI2XSxbNDEsNDRdLFsvKjYzKi81MCwvKjY2XSxbMTY0LCovMzkyXV0uZm9yRWFjaChmdW5jdGlvbihyKSB7XG5mb3IodmFyIGkgPSByWzBdOyBpIDw9IHJbMV07ICsraSkgaWYoTkZbaV0gIT0gbnVsbCkgd3JpdGVfYmlmZl9yZWMoYmEsIFwiRm9ybWF0XCIsIHdyaXRlX0Zvcm1hdChpLCBORltpXSwgb3B0cykpO1xuXHR9KTtcbn1cblxuZnVuY3Rpb24gd3JpdGVfRkVBVChiYSwgd3MpIHtcblx0LyogW01TLVhMU10gMi40LjExMiAqL1xuXHR2YXIgbyA9IG5ld19idWYoMTkpO1xuXHRvLndyaXRlX3NoaWZ0KDQsIDB4ODY3KTsgby53cml0ZV9zaGlmdCg0LCAwKTsgby53cml0ZV9zaGlmdCg0LCAwKTtcblx0by53cml0ZV9zaGlmdCgyLCAzKTsgby53cml0ZV9zaGlmdCgxLCAxKTsgby53cml0ZV9zaGlmdCg0LCAwKTtcblx0d3JpdGVfYmlmZl9yZWMoYmEsIFwiRmVhdEhkclwiLCBvKTtcblx0LyogW01TLVhMU10gMi40LjExMSAqL1xuXHRvID0gbmV3X2J1ZigzOSk7XG5cdG8ud3JpdGVfc2hpZnQoNCwgMHg4NjgpOyBvLndyaXRlX3NoaWZ0KDQsIDApOyBvLndyaXRlX3NoaWZ0KDQsIDApO1xuXHRvLndyaXRlX3NoaWZ0KDIsIDMpOyBvLndyaXRlX3NoaWZ0KDEsIDApOyBvLndyaXRlX3NoaWZ0KDQsIDApO1xuXHRvLndyaXRlX3NoaWZ0KDIsIDEpOyBvLndyaXRlX3NoaWZ0KDQsIDQpOyBvLndyaXRlX3NoaWZ0KDIsIDApO1xuXHR3cml0ZV9SZWY4VShzYWZlX2RlY29kZV9yYW5nZSh3c1snIXJlZiddfHxcIkExXCIpLCBvKTtcblx0by53cml0ZV9zaGlmdCg0LCA0KTtcblx0d3JpdGVfYmlmZl9yZWMoYmEsIFwiRmVhdFwiLCBvKTtcbn1cblxuZnVuY3Rpb24gd3JpdGVfQ0VMTFhGU19iaWZmOChiYSwgb3B0cykge1xuXHRmb3IodmFyIGkgPSAwOyBpIDwgMTY7ICsraSkgd3JpdGVfYmlmZl9yZWMoYmEsIFwiWEZcIiwgd3JpdGVfWEYoe251bUZtdElkOjAsIHN0eWxlOnRydWV9LCAwLCBvcHRzKSk7XG5cdG9wdHMuY2VsbFhmcy5mb3JFYWNoKGZ1bmN0aW9uKGMpIHtcblx0XHR3cml0ZV9iaWZmX3JlYyhiYSwgXCJYRlwiLCB3cml0ZV9YRihjLCAwLCBvcHRzKSk7XG5cdH0pO1xufVxuXG5mdW5jdGlvbiB3cml0ZV93c19iaWZmOF9obGlua3MoYmEsIHdzKSB7XG5cdGZvcih2YXIgUj0wOyBSPHdzWychbGlua3MnXS5sZW5ndGg7ICsrUikge1xuXHRcdHZhciBITCA9IHdzWychbGlua3MnXVtSXTtcblx0XHR3cml0ZV9iaWZmX3JlYyhiYSwgXCJITGlua1wiLCB3cml0ZV9ITGluayhITCkpO1xuXHRcdGlmKEhMWzFdLlRvb2x0aXApIHdyaXRlX2JpZmZfcmVjKGJhLCBcIkhMaW5rVG9vbHRpcFwiLCB3cml0ZV9ITGlua1Rvb2x0aXAoSEwpKTtcblx0fVxuXHRkZWxldGUgd3NbJyFsaW5rcyddO1xufVxuXG5mdW5jdGlvbiB3cml0ZV93c19iaWZmOF9jZWxsKGJhLCBjZWxsLCBSLCBDLCBvcHRzKSB7XG5cdHZhciBvcyA9IDE2ICsgZ2V0X2NlbGxfc3R5bGUob3B0cy5jZWxsWGZzLCBjZWxsLCBvcHRzKTtcblx0aWYoY2VsbC52ID09IG51bGwgJiYgIWNlbGwuYmYpIHtcblx0XHR3cml0ZV9iaWZmX3JlYyhiYSwgXCJCbGFua1wiLCB3cml0ZV9YTFNDZWxsKFIsIEMsIG9zKSk7XG5cdFx0cmV0dXJuO1xuXHR9XG5cdGlmKGNlbGwuYmYpIHdyaXRlX2JpZmZfcmVjKGJhLCBcIkZvcm11bGFcIiwgd3JpdGVfRm9ybXVsYShjZWxsLCBSLCBDLCBvcHRzLCBvcykpO1xuXHRlbHNlIHN3aXRjaChjZWxsLnQpIHtcblx0XHRjYXNlICdkJzogY2FzZSAnbic6XG5cdFx0XHR2YXIgdiA9IGNlbGwudCA9PSAnZCcgPyBkYXRlbnVtKHBhcnNlRGF0ZShjZWxsLnYpKSA6IGNlbGwudjtcblx0XHRcdC8qIFRPRE86IGVtaXQgUksgYXMgYXBwcm9wcmlhdGUgKi9cblx0XHRcdHdyaXRlX2JpZmZfcmVjKGJhLCBcIk51bWJlclwiLCB3cml0ZV9OdW1iZXIoUiwgQywgdiwgb3MsIG9wdHMpKTtcblx0XHRcdGJyZWFrO1xuXHRcdGNhc2UgJ2InOiBjYXNlICdlJzpcblx0XHRcdHdyaXRlX2JpZmZfcmVjKGJhLCAweDAyMDUsIHdyaXRlX0Jvb2xFcnIoUiwgQywgY2VsbC52LCBvcywgb3B0cywgY2VsbC50KSk7XG5cdFx0XHRicmVhaztcblx0XHQvKiBUT0RPOiBjb2RlcGFnZSwgc3N0ICovXG5cdFx0Y2FzZSAncyc6IGNhc2UgJ3N0cic6XG5cdFx0XHRpZihvcHRzLmJvb2tTU1QpIHtcblx0XHRcdFx0dmFyIGlzc3QgPSBnZXRfc3N0X2lkKG9wdHMuU3RyaW5ncywgY2VsbC52LCBvcHRzLnJldlN0cmluZ3MpO1xuXHRcdFx0XHR3cml0ZV9iaWZmX3JlYyhiYSwgXCJMYWJlbFNzdFwiLCB3cml0ZV9MYWJlbFNzdChSLCBDLCBpc3N0LCBvcywgb3B0cykpO1xuXHRcdFx0fSBlbHNlIHdyaXRlX2JpZmZfcmVjKGJhLCBcIkxhYmVsXCIsIHdyaXRlX0xhYmVsKFIsIEMsIGNlbGwudiwgb3MsIG9wdHMpKTtcblx0XHRcdGJyZWFrO1xuXHRcdGRlZmF1bHQ6XG5cdFx0XHR3cml0ZV9iaWZmX3JlYyhiYSwgXCJCbGFua1wiLCB3cml0ZV9YTFNDZWxsKFIsIEMsIG9zKSk7XG5cdH1cbn1cblxuLyogW01TLVhMU10gMi4xLjcuMjAuNSAqL1xuZnVuY3Rpb24gd3JpdGVfd3NfYmlmZjgoaWR4LCBvcHRzLCB3Yikge1xuXHR2YXIgYmEgPSBidWZfYXJyYXkoKTtcblx0dmFyIHMgPSB3Yi5TaGVldE5hbWVzW2lkeF0sIHdzID0gd2IuU2hlZXRzW3NdIHx8IHt9O1xuXHR2YXIgX1dCID0gKCh3Ynx8e30pLldvcmtib29rfHx7fSk7XG5cdHZhciBfc2hlZXQgPSAoKF9XQi5TaGVldHN8fFtdKVtpZHhdfHx7fSk7XG5cdHZhciBkZW5zZSA9IEFycmF5LmlzQXJyYXkod3MpO1xuXHR2YXIgYjggPSBvcHRzLmJpZmYgPT0gODtcblx0dmFyIHJlZiwgcnIgPSBcIlwiLCBjb2xzID0gW107XG5cdHZhciByYW5nZSA9IHNhZmVfZGVjb2RlX3JhbmdlKHdzWychcmVmJ10gfHwgXCJBMVwiKTtcblx0dmFyIE1BWF9ST1dTID0gYjggPyA2NTUzNiA6IDE2Mzg0O1xuXHRpZihyYW5nZS5lLmMgPiAweEZGIHx8IHJhbmdlLmUuciA+PSBNQVhfUk9XUykge1xuXHRcdGlmKG9wdHMuV1RGKSB0aHJvdyBuZXcgRXJyb3IoXCJSYW5nZSBcIiArICh3c1snIXJlZiddIHx8IFwiQTFcIikgKyBcIiBleGNlZWRzIGZvcm1hdCBsaW1pdCBBMTpJVjE2Mzg0XCIpO1xuXHRcdHJhbmdlLmUuYyA9IE1hdGgubWluKHJhbmdlLmUuYywgMHhGRik7XG5cdFx0cmFuZ2UuZS5yID0gTWF0aC5taW4ocmFuZ2UuZS5jLCBNQVhfUk9XUy0xKTtcblx0fVxuXG5cdHdyaXRlX2JpZmZfcmVjKGJhLCAweDA4MDksIHdyaXRlX0JPRih3YiwgMHgxMCwgb3B0cykpO1xuXHQvKiBbVW5jYWxjZWRdIEluZGV4ICovXG5cdHdyaXRlX2JpZmZfcmVjKGJhLCBcIkNhbGNNb2RlXCIsIHdyaXRldWludDE2KDEpKTtcblx0d3JpdGVfYmlmZl9yZWMoYmEsIFwiQ2FsY0NvdW50XCIsIHdyaXRldWludDE2KDEwMCkpO1xuXHR3cml0ZV9iaWZmX3JlYyhiYSwgXCJDYWxjUmVmTW9kZVwiLCB3cml0ZWJvb2wodHJ1ZSkpO1xuXHR3cml0ZV9iaWZmX3JlYyhiYSwgXCJDYWxjSXRlclwiLCB3cml0ZWJvb2woZmFsc2UpKTtcblx0d3JpdGVfYmlmZl9yZWMoYmEsIFwiQ2FsY0RlbHRhXCIsIHdyaXRlX1hudW0oMC4wMDEpKTtcblx0d3JpdGVfYmlmZl9yZWMoYmEsIFwiQ2FsY1NhdmVSZWNhbGNcIiwgd3JpdGVib29sKHRydWUpKTtcblx0d3JpdGVfYmlmZl9yZWMoYmEsIFwiUHJpbnRSb3dDb2xcIiwgd3JpdGVib29sKGZhbHNlKSk7XG5cdHdyaXRlX2JpZmZfcmVjKGJhLCBcIlByaW50R3JpZFwiLCB3cml0ZWJvb2woZmFsc2UpKTtcblx0d3JpdGVfYmlmZl9yZWMoYmEsIFwiR3JpZFNldFwiLCB3cml0ZXVpbnQxNigxKSk7XG5cdHdyaXRlX2JpZmZfcmVjKGJhLCBcIkd1dHNcIiwgd3JpdGVfR3V0cyhbMCwwXSkpO1xuXHQvKiBEZWZhdWx0Um93SGVpZ2h0IFdzQm9vbCBbU3luY10gW0xQcl0gW0hvcml6b250YWxQYWdlQnJlYWtzXSBbVmVydGljYWxQYWdlQnJlYWtzXSAqL1xuXHQvKiBIZWFkZXIgKHN0cmluZykgKi9cblx0LyogRm9vdGVyIChzdHJpbmcpICovXG5cdHdyaXRlX2JpZmZfcmVjKGJhLCBcIkhDZW50ZXJcIiwgd3JpdGVib29sKGZhbHNlKSk7XG5cdHdyaXRlX2JpZmZfcmVjKGJhLCBcIlZDZW50ZXJcIiwgd3JpdGVib29sKGZhbHNlKSk7XG5cdC8qIC4uLiAqL1xuXHR3cml0ZV9iaWZmX3JlYyhiYSwgMHgyMDAsIHdyaXRlX0RpbWVuc2lvbnMocmFuZ2UsIG9wdHMpKTtcblx0LyogLi4uICovXG5cblx0aWYoYjgpIHdzWychbGlua3MnXSA9IFtdO1xuXHRmb3IodmFyIFIgPSByYW5nZS5zLnI7IFIgPD0gcmFuZ2UuZS5yOyArK1IpIHtcblx0XHRyciA9IGVuY29kZV9yb3coUik7XG5cdFx0Zm9yKHZhciBDID0gcmFuZ2Uucy5jOyBDIDw9IHJhbmdlLmUuYzsgKytDKSB7XG5cdFx0XHRpZihSID09PSByYW5nZS5zLnIpIGNvbHNbQ10gPSBlbmNvZGVfY29sKEMpO1xuXHRcdFx0cmVmID0gY29sc1tDXSArIHJyO1xuXHRcdFx0dmFyIGNlbGwgPSBkZW5zZSA/ICh3c1tSXXx8W10pW0NdIDogd3NbcmVmXTtcblx0XHRcdGlmKCFjZWxsKSBjb250aW51ZTtcblx0XHRcdC8qIHdyaXRlIGNlbGwgKi9cblx0XHRcdHdyaXRlX3dzX2JpZmY4X2NlbGwoYmEsIGNlbGwsIFIsIEMsIG9wdHMpO1xuXHRcdFx0aWYoYjggJiYgY2VsbC5sKSB3c1snIWxpbmtzJ10ucHVzaChbcmVmLCBjZWxsLmxdKTtcblx0XHR9XG5cdH1cblx0dmFyIGNuYW1lID0gX3NoZWV0LkNvZGVOYW1lIHx8IF9zaGVldC5uYW1lIHx8IHM7XG5cdC8qIC4uLiAqL1xuXHRpZihiOCkgd3JpdGVfYmlmZl9yZWMoYmEsIFwiV2luZG93MlwiLCB3cml0ZV9XaW5kb3cyKChfV0IuVmlld3N8fFtdKVswXSkpO1xuXHQvKiAuLi4gKi9cblx0aWYoYjggJiYgKHdzWychbWVyZ2VzJ118fFtdKS5sZW5ndGgpIHdyaXRlX2JpZmZfcmVjKGJhLCBcIk1lcmdlQ2VsbHNcIiwgd3JpdGVfTWVyZ2VDZWxscyh3c1snIW1lcmdlcyddKSk7XG5cdC8qIFtMUm5nXSAqUVVFUllUQUJMRSBbUEhPTkVUSUNJTkZPXSBDT05ERk1UUyAqL1xuXHRpZihiOCkgd3JpdGVfd3NfYmlmZjhfaGxpbmtzKGJhLCB3cyk7XG5cdC8qIFtEVkFMXSAqL1xuXHR3cml0ZV9iaWZmX3JlYyhiYSwgXCJDb2RlTmFtZVwiLCB3cml0ZV9YTFVuaWNvZGVTdHJpbmcoY25hbWUsIG9wdHMpKTtcblx0LyogKldlYlB1YiAqQ2VsbFdhdGNoIFtTaGVldEV4dF0gKi9cblx0aWYoYjgpIHdyaXRlX0ZFQVQoYmEsIHdzKTtcblx0LyogKkZFQVQxMSAqUkVDT1JEMTIgKi9cblx0d3JpdGVfYmlmZl9yZWMoYmEsIFwiRU9GXCIpO1xuXHRyZXR1cm4gYmEuZW5kKCk7XG59XG5cbi8qIFtNUy1YTFNdIDIuMS43LjIwLjMgKi9cbmZ1bmN0aW9uIHdyaXRlX2JpZmY4X2dsb2JhbCh3YiwgYnVmcywgb3B0cykge1xuXHR2YXIgQSA9IGJ1Zl9hcnJheSgpO1xuXHR2YXIgX1dCID0gKCh3Ynx8e30pLldvcmtib29rfHx7fSk7XG5cdHZhciBfc2hlZXRzID0gKF9XQi5TaGVldHN8fFtdKTtcblx0dmFyIF93YiA9IF9XQi5XQlByb3BzfHx7fTtcblx0dmFyIGI4ID0gb3B0cy5iaWZmID09IDgsIGI1ID0gb3B0cy5iaWZmID09IDU7XG5cdHdyaXRlX2JpZmZfcmVjKEEsIDB4MDgwOSwgd3JpdGVfQk9GKHdiLCAweDA1LCBvcHRzKSk7XG5cdGlmKG9wdHMuYm9va1R5cGUgPT0gXCJ4bGFcIikgd3JpdGVfYmlmZl9yZWMoQSwgXCJBZGRpblwiKTtcblx0d3JpdGVfYmlmZl9yZWMoQSwgXCJJbnRlcmZhY2VIZHJcIiwgYjggPyB3cml0ZXVpbnQxNigweDA0YjApIDogbnVsbCk7XG5cdHdyaXRlX2JpZmZfcmVjKEEsIFwiTW1zXCIsIHdyaXRlemVyb2VzKDIpKTtcblx0aWYoYjUpIHdyaXRlX2JpZmZfcmVjKEEsIFwiVG9vbGJhckhkclwiKTtcblx0aWYoYjUpIHdyaXRlX2JpZmZfcmVjKEEsIFwiVG9vbGJhckVuZFwiKTtcblx0d3JpdGVfYmlmZl9yZWMoQSwgXCJJbnRlcmZhY2VFbmRcIik7XG5cdHdyaXRlX2JpZmZfcmVjKEEsIFwiV3JpdGVBY2Nlc3NcIiwgd3JpdGVfV3JpdGVBY2Nlc3MoXCJTaGVldEpTXCIsIG9wdHMpKTtcblx0LyogW0ZpbGVTaGFyaW5nXSAqL1xuXHR3cml0ZV9iaWZmX3JlYyhBLCBcIkNvZGVQYWdlXCIsIHdyaXRldWludDE2KGI4ID8gMHgwNGIwIDogMHgwNEU0KSk7XG5cdC8qICoyMDQ3IExlbCAqL1xuXHRpZihiOCkgd3JpdGVfYmlmZl9yZWMoQSwgXCJEU0ZcIiwgd3JpdGV1aW50MTYoMCkpO1xuXHRpZihiOCkgd3JpdGVfYmlmZl9yZWMoQSwgXCJFeGNlbDlGaWxlXCIpO1xuXHR3cml0ZV9iaWZmX3JlYyhBLCBcIlJSVGFiSWRcIiwgd3JpdGVfUlJUYWJJZCh3Yi5TaGVldE5hbWVzLmxlbmd0aCkpO1xuXHRpZihiOCAmJiB3Yi52YmFyYXcpIHdyaXRlX2JpZmZfcmVjKEEsIFwiT2JQcm9qXCIpO1xuXHQvKiBbT2JOb01hY3Jvc10gKi9cblx0aWYoYjggJiYgd2IudmJhcmF3KSB7XG5cdFx0dmFyIGNuYW1lID0gX3diLkNvZGVOYW1lIHx8IFwiVGhpc1dvcmtib29rXCI7XG5cdFx0d3JpdGVfYmlmZl9yZWMoQSwgXCJDb2RlTmFtZVwiLCB3cml0ZV9YTFVuaWNvZGVTdHJpbmcoY25hbWUsIG9wdHMpKTtcblx0fVxuXHR3cml0ZV9iaWZmX3JlYyhBLCBcIkJ1aWx0SW5Gbkdyb3VwQ291bnRcIiwgd3JpdGV1aW50MTYoMHgxMSkpO1xuXHQvKiAqRm5Hcm91cE5hbWUgKkZuR3JwMTIgKi9cblx0LyogKkxibCAqL1xuXHQvKiBbT2xlT2JqZWN0U2l6ZV0gKi9cblx0d3JpdGVfYmlmZl9yZWMoQSwgXCJXaW5Qcm90ZWN0XCIsIHdyaXRlYm9vbChmYWxzZSkpO1xuXHR3cml0ZV9iaWZmX3JlYyhBLCBcIlByb3RlY3RcIiwgd3JpdGVib29sKGZhbHNlKSk7XG5cdHdyaXRlX2JpZmZfcmVjKEEsIFwiUGFzc3dvcmRcIiwgd3JpdGV1aW50MTYoMCkpO1xuXHRpZihiOCkgd3JpdGVfYmlmZl9yZWMoQSwgXCJQcm90NFJldlwiLCB3cml0ZWJvb2woZmFsc2UpKTtcblx0aWYoYjgpIHdyaXRlX2JpZmZfcmVjKEEsIFwiUHJvdDRSZXZQYXNzXCIsIHdyaXRldWludDE2KDApKTtcblx0d3JpdGVfYmlmZl9yZWMoQSwgXCJXaW5kb3cxXCIsIHdyaXRlX1dpbmRvdzEob3B0cykpO1xuXHR3cml0ZV9iaWZmX3JlYyhBLCBcIkJhY2t1cFwiLCB3cml0ZWJvb2woZmFsc2UpKTtcblx0d3JpdGVfYmlmZl9yZWMoQSwgXCJIaWRlT2JqXCIsIHdyaXRldWludDE2KDApKTtcblx0d3JpdGVfYmlmZl9yZWMoQSwgXCJEYXRlMTkwNFwiLCB3cml0ZWJvb2woc2FmZTE5MDQod2IpPT1cInRydWVcIikpO1xuXHR3cml0ZV9iaWZmX3JlYyhBLCBcIkNhbGNQcmVjaXNpb25cIiwgd3JpdGVib29sKHRydWUpKTtcblx0aWYoYjgpIHdyaXRlX2JpZmZfcmVjKEEsIFwiUmVmcmVzaEFsbFwiLCB3cml0ZWJvb2woZmFsc2UpKTtcblx0d3JpdGVfYmlmZl9yZWMoQSwgXCJCb29rQm9vbFwiLCB3cml0ZXVpbnQxNigwKSk7XG5cdC8qIC4uLiAqL1xuXHR3cml0ZV9GT05UU19iaWZmOChBLCB3Yiwgb3B0cyk7XG5cdHdyaXRlX0ZNVFNfYmlmZjgoQSwgd2IuU1NGLCBvcHRzKTtcblx0d3JpdGVfQ0VMTFhGU19iaWZmOChBLCBvcHRzKTtcblx0LyogLi4uICovXG5cdGlmKGI4KSB3cml0ZV9iaWZmX3JlYyhBLCBcIlVzZXNFTEZzXCIsIHdyaXRlYm9vbChmYWxzZSkpO1xuXHR2YXIgYSA9IEEuZW5kKCk7XG5cblx0dmFyIEMgPSBidWZfYXJyYXkoKTtcblx0LyogTUVUQURBVEEgW01UUlNldHRpbmdzXSBbRm9yY2VGdWxsQ2FsY3VsYXRpb25dICovXG5cdGlmKGI4KSB3cml0ZV9iaWZmX3JlYyhDLCBcIkNvdW50cnlcIiwgd3JpdGVfQ291bnRyeSgpKTtcblx0LyogKlNVUEJPT0sgKkxCTCAqUlREIFtSZWNhbGNJZF0gKkhGUGljdHVyZSAqTVNPRFJBV0lOR0dST1VQICovXG5cblx0LyogQklGRjg6IFtTU1QgKkNvbnRpbnVlXSBFeHRTU1QgKi9cblx0aWYoYjggJiYgb3B0cy5TdHJpbmdzKSB3cml0ZV9iaWZmX2NvbnRpbnVlKEMsIFwiU1NUXCIsIHdyaXRlX1NTVChvcHRzLlN0cmluZ3MsIG9wdHMpKTtcblxuXHQvKiAqV2ViUHViIFtXT3B0XSBbQ3JFcnJdIFtCb29rRXh0XSAqRmVhdEhkciAqRENvbm4gW1RIRU1FXSBbQ29tcHJlc3NQaWN0dXJlc10gW0NvbXBhdDEyXSBbR1VJRFR5cGVMaWJdICovXG5cdHdyaXRlX2JpZmZfcmVjKEMsIFwiRU9GXCIpO1xuXHR2YXIgYyA9IEMuZW5kKCk7XG5cblx0dmFyIEIgPSBidWZfYXJyYXkoKTtcblx0dmFyIGJsZW4gPSAwLCBqID0gMDtcblx0Zm9yKGogPSAwOyBqIDwgd2IuU2hlZXROYW1lcy5sZW5ndGg7ICsraikgYmxlbiArPSAoYjggPyAxMiA6IDExKSArIChiOCA/IDIgOiAxKSAqIHdiLlNoZWV0TmFtZXNbal0ubGVuZ3RoO1xuXHR2YXIgc3RhcnQgPSBhLmxlbmd0aCArIGJsZW4gKyBjLmxlbmd0aDtcblx0Zm9yKGogPSAwOyBqIDwgd2IuU2hlZXROYW1lcy5sZW5ndGg7ICsraikge1xuXHRcdHZhciBfc2hlZXQgPSBfc2hlZXRzW2pdIHx8ICh7fSk7XG5cdFx0d3JpdGVfYmlmZl9yZWMoQiwgXCJCb3VuZFNoZWV0OFwiLCB3cml0ZV9Cb3VuZFNoZWV0OCh7cG9zOnN0YXJ0LCBoczpfc2hlZXQuSGlkZGVufHwwLCBkdDowLCBuYW1lOndiLlNoZWV0TmFtZXNbal19LCBvcHRzKSk7XG5cdFx0c3RhcnQgKz0gYnVmc1tqXS5sZW5ndGg7XG5cdH1cblx0LyogMSpCb3VuZFNoZWV0OCAqL1xuXHR2YXIgYiA9IEIuZW5kKCk7XG5cdGlmKGJsZW4gIT0gYi5sZW5ndGgpIHRocm93IG5ldyBFcnJvcihcIkJTOCBcIiArIGJsZW4gKyBcIiAhPSBcIiArIGIubGVuZ3RoKTtcblxuXHR2YXIgb3V0ID0gW107XG5cdGlmKGEubGVuZ3RoKSBvdXQucHVzaChhKTtcblx0aWYoYi5sZW5ndGgpIG91dC5wdXNoKGIpO1xuXHRpZihjLmxlbmd0aCkgb3V0LnB1c2goYyk7XG5cdHJldHVybiBfX3RvQnVmZmVyKFtvdXRdKTtcbn1cblxuLyogW01TLVhMU10gMi4xLjcuMjAgV29ya2Jvb2sgU3RyZWFtICovXG5mdW5jdGlvbiB3cml0ZV9iaWZmOF9idWYod2IsIG9wdHMpIHtcblx0dmFyIG8gPSBvcHRzIHx8IHt9O1xuXHR2YXIgYnVmcyA9IFtdO1xuXG5cdGlmKHdiICYmICF3Yi5TU0YpIHtcblx0XHR3Yi5TU0YgPSBTU0YuZ2V0X3RhYmxlKCk7XG5cdH1cblx0aWYod2IgJiYgd2IuU1NGKSB7XG5cdFx0bWFrZV9zc2YoU1NGKTsgU1NGLmxvYWRfdGFibGUod2IuU1NGKTtcblx0XHQvLyAkRmxvd0lnbm9yZVxuXHRcdG8ucmV2c3NmID0gZXZlcnRfbnVtKHdiLlNTRik7IG8ucmV2c3NmW3diLlNTRls2NTUzNV1dID0gMDtcblx0XHRvLnNzZiA9IHdiLlNTRjtcblx0fVxuXG5cdG8uU3RyaW5ncyA9IFtdOyBvLlN0cmluZ3MuQ291bnQgPSAwOyBvLlN0cmluZ3MuVW5pcXVlID0gMDtcblx0Zml4X3dyaXRlX29wdHMobyk7XG5cblx0by5jZWxsWGZzID0gW107XG5cdGdldF9jZWxsX3N0eWxlKG8uY2VsbFhmcywge30sIHtyZXZzc2Y6e1wiR2VuZXJhbFwiOjB9fSk7XG5cblx0aWYoIXdiLlByb3BzKSB3Yi5Qcm9wcyA9IHt9O1xuXG5cdGZvcih2YXIgaSA9IDA7IGkgPCB3Yi5TaGVldE5hbWVzLmxlbmd0aDsgKytpKSBidWZzW2J1ZnMubGVuZ3RoXSA9IHdyaXRlX3dzX2JpZmY4KGksIG8sIHdiKTtcblx0YnVmcy51bnNoaWZ0KHdyaXRlX2JpZmY4X2dsb2JhbCh3YiwgYnVmcywgbykpO1xuXHRyZXR1cm4gX190b0J1ZmZlcihbYnVmc10pO1xufVxuXG5mdW5jdGlvbiB3cml0ZV9iaWZmX2J1Zih3Yiwgb3B0cykge1xuXHR2YXIgbyA9IG9wdHMgfHwge307XG5cdHN3aXRjaChvLmJpZmYgfHwgMikge1xuXHRcdGNhc2UgODogY2FzZSA1OiByZXR1cm4gd3JpdGVfYmlmZjhfYnVmKHdiLCBvcHRzKTtcblx0XHRjYXNlIDQ6IGNhc2UgMzogY2FzZSAyOiByZXR1cm4gd3JpdGVfYmlmZjJfYnVmKHdiLCBvcHRzKTtcblx0fVxuXHR0aHJvdyBuZXcgRXJyb3IoXCJpbnZhbGlkIHR5cGUgXCIgKyBvLmJvb2tUeXBlICsgXCIgZm9yIEJJRkZcIik7XG59XG4vKiBub3RlOiBicm93c2VyIERPTSBlbGVtZW50IGNhbm5vdCBzZWUgbXNvLSBzdHlsZSBhdHRycywgbXVzdCBwYXJzZSAqL1xudmFyIEhUTUxfID0gKGZ1bmN0aW9uKCkge1xuXHRmdW5jdGlvbiBodG1sX3RvX3NoZWV0KHN0ciwgX29wdHMpIHtcblx0XHR2YXIgb3B0cyA9IF9vcHRzIHx8IHt9O1xuXHRcdGlmKERFTlNFICE9IG51bGwgJiYgb3B0cy5kZW5zZSA9PSBudWxsKSBvcHRzLmRlbnNlID0gREVOU0U7XG5cdFx0dmFyIHdzID0gb3B0cy5kZW5zZSA/IChbXSkgOiAoe30pO1xuXHRcdHN0ciA9IHN0ci5yZXBsYWNlKC88IS0tLio/LS0+L2csIFwiXCIpO1xuXHRcdHZhciBtdGNoID0gc3RyLm1hdGNoKC88dGFibGUvaSk7XG5cdFx0aWYoIW10Y2gpIHRocm93IG5ldyBFcnJvcihcIkludmFsaWQgSFRNTDogY291bGQgbm90IGZpbmQgPHRhYmxlPlwiKTtcblx0XHR2YXIgbXRjaDIgPSBzdHIubWF0Y2goLzxcXC90YWJsZS9pKTtcblx0XHR2YXIgaSA9IG10Y2guaW5kZXgsIGogPSBtdGNoMiAmJiBtdGNoMi5pbmRleCB8fCBzdHIubGVuZ3RoO1xuXHRcdHZhciByb3dzID0gc3BsaXRfcmVnZXgoc3RyLnNsaWNlKGksIGopLCAvKDo/PHRyW14+XSo+KS9pLCBcIjx0cj5cIik7XG5cdFx0dmFyIFIgPSAtMSwgQyA9IDAsIFJTID0gMCwgQ1MgPSAwO1xuXHRcdHZhciByYW5nZSA9IHtzOntyOjEwMDAwMDAwLCBjOjEwMDAwMDAwfSxlOntyOjAsYzowfX07XG5cdFx0dmFyIG1lcmdlcyA9IFtdO1xuXHRcdGZvcihpID0gMDsgaSA8IHJvd3MubGVuZ3RoOyArK2kpIHtcblx0XHRcdHZhciByb3cgPSByb3dzW2ldLnRyaW0oKTtcblx0XHRcdHZhciBoZCA9IHJvdy5zbGljZSgwLDMpLnRvTG93ZXJDYXNlKCk7XG5cdFx0XHRpZihoZCA9PSBcIjx0clwiKSB7ICsrUjsgaWYob3B0cy5zaGVldFJvd3MgJiYgb3B0cy5zaGVldFJvd3MgPD0gUikgeyAtLVI7IGJyZWFrOyB9IEMgPSAwOyBjb250aW51ZTsgfVxuXHRcdFx0aWYoaGQgIT0gXCI8dGRcIiAmJiBoZCAhPSBcIjx0aFwiKSBjb250aW51ZTtcblx0XHRcdHZhciBjZWxscyA9IHJvdy5zcGxpdCgvPFxcL3RbZGhdPi9pKTtcblx0XHRcdGZvcihqID0gMDsgaiA8IGNlbGxzLmxlbmd0aDsgKytqKSB7XG5cdFx0XHRcdHZhciBjZWxsID0gY2VsbHNbal0udHJpbSgpO1xuXHRcdFx0XHRpZighY2VsbC5tYXRjaCgvPHRbZGhdL2kpKSBjb250aW51ZTtcblx0XHRcdFx0dmFyIG0gPSBjZWxsLCBjYyA9IDA7XG5cdFx0XHRcdC8qIFRPRE86IHBhcnNlIHN0eWxlcyBldGMgKi9cblx0XHRcdFx0d2hpbGUobS5jaGFyQXQoMCkgPT0gXCI8XCIgJiYgKGNjID0gbS5pbmRleE9mKFwiPlwiKSkgPiAtMSkgbSA9IG0uc2xpY2UoY2MrMSk7XG5cdFx0XHRcdGZvcih2YXIgbWlkeCA9IDA7IG1pZHggPCBtZXJnZXMubGVuZ3RoOyArK21pZHgpIHtcblx0XHRcdFx0XHR2YXIgX21lcmdlID0gbWVyZ2VzW21pZHhdO1xuXHRcdFx0XHRcdGlmKF9tZXJnZS5zLmMgPT0gQyAmJiBfbWVyZ2Uucy5yIDwgUiAmJiBSIDw9IF9tZXJnZS5lLnIpIHsgQyA9IF9tZXJnZS5lLmMgKyAxOyBtaWR4ID0gLTE7IH1cblx0XHRcdFx0fVxuXHRcdFx0XHR2YXIgdGFnID0gcGFyc2V4bWx0YWcoY2VsbC5zbGljZSgwLCBjZWxsLmluZGV4T2YoXCI+XCIpKSk7XG5cdFx0XHRcdENTID0gdGFnLmNvbHNwYW4gPyArdGFnLmNvbHNwYW4gOiAxO1xuXHRcdFx0XHRpZigoUlMgPSArdGFnLnJvd3NwYW4pPjEgfHwgQ1M+MSkgbWVyZ2VzLnB1c2goe3M6e3I6UixjOkN9LGU6e3I6UiArIChSU3x8MSkgLSAxLCBjOkMgKyBDUyAtIDF9fSk7XG5cdFx0XHRcdHZhciBfdCA9IHRhZy50IHx8IFwiXCI7XG5cdFx0XHRcdC8qIFRPRE86IGdlbmVyYXRlIHN0dWIgY2VsbHMgKi9cblx0XHRcdFx0aWYoIW0ubGVuZ3RoKSB7IEMgKz0gQ1M7IGNvbnRpbnVlOyB9XG5cdFx0XHRcdG0gPSBodG1sZGVjb2RlKG0pO1xuXHRcdFx0XHRpZihyYW5nZS5zLnIgPiBSKSByYW5nZS5zLnIgPSBSOyBpZihyYW5nZS5lLnIgPCBSKSByYW5nZS5lLnIgPSBSO1xuXHRcdFx0XHRpZihyYW5nZS5zLmMgPiBDKSByYW5nZS5zLmMgPSBDOyBpZihyYW5nZS5lLmMgPCBDKSByYW5nZS5lLmMgPSBDO1xuXHRcdFx0XHRpZighbS5sZW5ndGgpIGNvbnRpbnVlO1xuXHRcdFx0XHR2YXIgbyA9IHt0OidzJywgdjptfTtcblx0XHRcdFx0aWYob3B0cy5yYXcgfHwgIW0udHJpbSgpLmxlbmd0aCB8fCBfdCA9PSAncycpe31cblx0XHRcdFx0ZWxzZSBpZihtID09PSAnVFJVRScpIG8gPSB7dDonYicsIHY6dHJ1ZX07XG5cdFx0XHRcdGVsc2UgaWYobSA9PT0gJ0ZBTFNFJykgbyA9IHt0OidiJywgdjpmYWxzZX07XG5cdFx0XHRcdGVsc2UgaWYoIWlzTmFOKGZ1enp5bnVtKG0pKSkgbyA9IHt0OiduJywgdjpmdXp6eW51bShtKX07XG5cdFx0XHRcdGVsc2UgaWYoIWlzTmFOKGZ1enp5ZGF0ZShtKS5nZXREYXRlKCkpKSB7XG5cdFx0XHRcdFx0byA9ICh7dDonZCcsIHY6cGFyc2VEYXRlKG0pfSk7XG5cdFx0XHRcdFx0aWYoIW9wdHMuY2VsbERhdGVzKSBvID0gKHt0OiduJywgdjpkYXRlbnVtKG8udil9KTtcblx0XHRcdFx0XHRvLnogPSBvcHRzLmRhdGVORiB8fCBTU0YuX3RhYmxlWzE0XTtcblx0XHRcdFx0fVxuXHRcdFx0XHRpZihvcHRzLmRlbnNlKSB7IGlmKCF3c1tSXSkgd3NbUl0gPSBbXTsgd3NbUl1bQ10gPSBvOyB9XG5cdFx0XHRcdGVsc2Ugd3NbZW5jb2RlX2NlbGwoe3I6UiwgYzpDfSldID0gbztcblx0XHRcdFx0QyArPSBDUztcblx0XHRcdH1cblx0XHR9XG5cdFx0d3NbJyFyZWYnXSA9IGVuY29kZV9yYW5nZShyYW5nZSk7XG5cdFx0aWYobWVyZ2VzLmxlbmd0aCkgd3NbXCIhbWVyZ2VzXCJdID0gbWVyZ2VzO1xuXHRcdHJldHVybiB3cztcblx0fVxuXHRmdW5jdGlvbiBodG1sX3RvX2Jvb2soc3RyLCBvcHRzKSB7XG5cdFx0cmV0dXJuIHNoZWV0X3RvX3dvcmtib29rKGh0bWxfdG9fc2hlZXQoc3RyLCBvcHRzKSwgb3B0cyk7XG5cdH1cblx0ZnVuY3Rpb24gbWFrZV9odG1sX3Jvdyh3cywgciwgUiwgbykge1xuXHRcdHZhciBNID0gKHdzWychbWVyZ2VzJ10gfHxbXSk7XG5cdFx0dmFyIG9vID0gW107XG5cdFx0Zm9yKHZhciBDID0gci5zLmM7IEMgPD0gci5lLmM7ICsrQykge1xuXHRcdFx0dmFyIFJTID0gMCwgQ1MgPSAwO1xuXHRcdFx0Zm9yKHZhciBqID0gMDsgaiA8IE0ubGVuZ3RoOyArK2opIHtcblx0XHRcdFx0aWYoTVtqXS5zLnIgPiBSIHx8IE1bal0ucy5jID4gQykgY29udGludWU7XG5cdFx0XHRcdGlmKE1bal0uZS5yIDwgUiB8fCBNW2pdLmUuYyA8IEMpIGNvbnRpbnVlO1xuXHRcdFx0XHRpZihNW2pdLnMuciA8IFIgfHwgTVtqXS5zLmMgPCBDKSB7IFJTID0gLTE7IGJyZWFrOyB9XG5cdFx0XHRcdFJTID0gTVtqXS5lLnIgLSBNW2pdLnMuciArIDE7IENTID0gTVtqXS5lLmMgLSBNW2pdLnMuYyArIDE7IGJyZWFrO1xuXHRcdFx0fVxuXHRcdFx0aWYoUlMgPCAwKSBjb250aW51ZTtcblx0XHRcdHZhciBjb29yZCA9IGVuY29kZV9jZWxsKHtyOlIsYzpDfSk7XG5cdFx0XHR2YXIgY2VsbCA9IG8uZGVuc2UgPyAod3NbUl18fFtdKVtDXSA6IHdzW2Nvb3JkXTtcblx0XHRcdC8qIFRPRE86IGh0bWwgZW50aXRpZXMgKi9cblx0XHRcdHZhciB3ID0gKGNlbGwgJiYgY2VsbC52ICE9IG51bGwpICYmIChjZWxsLmggfHwgZXNjYXBlaHRtbChjZWxsLncgfHwgKGZvcm1hdF9jZWxsKGNlbGwpLCBjZWxsLncpIHx8IFwiXCIpKSB8fCBcIlwiO1xuXHRcdFx0dmFyIHNwID0gKHt9KTtcblx0XHRcdGlmKFJTID4gMSkgc3Aucm93c3BhbiA9IFJTO1xuXHRcdFx0aWYoQ1MgPiAxKSBzcC5jb2xzcGFuID0gQ1M7XG5cdFx0XHRzcC50ID0gY2VsbCAmJiBjZWxsLnQgfHwgJ3onO1xuXHRcdFx0aWYoby5lZGl0YWJsZSkgdyA9ICc8c3BhbiBjb250ZW50ZWRpdGFibGU9XCJ0cnVlXCI+JyArIHcgKyAnPC9zcGFuPic7XG5cdFx0XHRzcC5pZCA9IChvLmlkIHx8IFwic2pzXCIpICsgXCItXCIgKyBjb29yZDtcblx0XHRcdGlmKHNwLnQgIT0gXCJ6XCIpIHsgc3AudiA9IGNlbGwudjsgaWYoY2VsbC56ICE9IG51bGwpIHNwLnogPSBjZWxsLno7IH1cblx0XHRcdG9vLnB1c2god3JpdGV4dGFnKCd0ZCcsIHcsIHNwKSk7XG5cdFx0fVxuXHRcdHZhciBwcmVhbWJsZSA9IFwiPHRyPlwiO1xuXHRcdHJldHVybiBwcmVhbWJsZSArIG9vLmpvaW4oXCJcIikgKyBcIjwvdHI+XCI7XG5cdH1cblx0ZnVuY3Rpb24gbWFrZV9odG1sX3ByZWFtYmxlKHdzLCBSLCBvKSB7XG5cdFx0dmFyIG91dCA9IFtdO1xuXHRcdHJldHVybiBvdXQuam9pbihcIlwiKSArICc8dGFibGUnICsgKG8gJiYgby5pZCA/ICcgaWQ9XCInICsgby5pZCArICdcIicgOiBcIlwiKSArICc+Jztcblx0fVxuXHR2YXIgX0JFR0lOID0gJzxodG1sPjxoZWFkPjxtZXRhIGNoYXJzZXQ9XCJ1dGYtOFwiLz48dGl0bGU+U2hlZXRKUyBUYWJsZSBFeHBvcnQ8L3RpdGxlPjwvaGVhZD48Ym9keT4nO1xuXHR2YXIgX0VORCA9ICc8L2JvZHk+PC9odG1sPic7XG5cdGZ1bmN0aW9uIHNoZWV0X3RvX2h0bWwod3MsIG9wdHMvKiwgd2I6P1dvcmtib29rKi8pIHtcblx0XHR2YXIgbyA9IG9wdHMgfHwge307XG5cdFx0dmFyIGhlYWRlciA9IG8uaGVhZGVyICE9IG51bGwgPyBvLmhlYWRlciA6IF9CRUdJTjtcblx0XHR2YXIgZm9vdGVyID0gby5mb290ZXIgIT0gbnVsbCA/IG8uZm9vdGVyIDogX0VORDtcblx0XHR2YXIgb3V0ID0gW2hlYWRlcl07XG5cdFx0dmFyIHIgPSBkZWNvZGVfcmFuZ2Uod3NbJyFyZWYnXSk7XG5cdFx0by5kZW5zZSA9IEFycmF5LmlzQXJyYXkod3MpO1xuXHRcdG91dC5wdXNoKG1ha2VfaHRtbF9wcmVhbWJsZSh3cywgciwgbykpO1xuXHRcdGZvcih2YXIgUiA9IHIucy5yOyBSIDw9IHIuZS5yOyArK1IpIG91dC5wdXNoKG1ha2VfaHRtbF9yb3cod3MsIHIsIFIsIG8pKTtcblx0XHRvdXQucHVzaChcIjwvdGFibGU+XCIgKyBmb290ZXIpO1xuXHRcdHJldHVybiBvdXQuam9pbihcIlwiKTtcblxuXHR9XG5cdHJldHVybiB7XG5cdFx0dG9fd29ya2Jvb2s6IGh0bWxfdG9fYm9vayxcblx0XHR0b19zaGVldDogaHRtbF90b19zaGVldCxcblx0XHRfcm93OiBtYWtlX2h0bWxfcm93LFxuXHRcdEJFR0lOOiBfQkVHSU4sXG5cdFx0RU5EOiBfRU5ELFxuXHRcdF9wcmVhbWJsZTogbWFrZV9odG1sX3ByZWFtYmxlLFxuXHRcdGZyb21fc2hlZXQ6IHNoZWV0X3RvX2h0bWxcblx0fTtcbn0pKCk7XG5cbmZ1bmN0aW9uIHNoZWV0X2FkZF9kb20od3MsIHRhYmxlLCBfb3B0cykge1xuXHR2YXIgb3B0cyA9IF9vcHRzIHx8IHt9O1xuXHRpZihERU5TRSAhPSBudWxsKSBvcHRzLmRlbnNlID0gREVOU0U7XG5cdHZhciBvcl9SID0gMCwgb3JfQyA9IDA7XG5cdGlmKG9wdHMub3JpZ2luICE9IG51bGwpIHtcblx0XHRpZih0eXBlb2Ygb3B0cy5vcmlnaW4gPT0gJ251bWJlcicpIG9yX1IgPSBvcHRzLm9yaWdpbjtcblx0XHRlbHNlIHtcblx0XHRcdHZhciBfb3JpZ2luID0gdHlwZW9mIG9wdHMub3JpZ2luID09IFwic3RyaW5nXCIgPyBkZWNvZGVfY2VsbChvcHRzLm9yaWdpbikgOiBvcHRzLm9yaWdpbjtcblx0XHRcdG9yX1IgPSBfb3JpZ2luLnI7IG9yX0MgPSBfb3JpZ2luLmM7XG5cdFx0fVxuXHR9XG5cdHZhciByb3dzID0gdGFibGUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoJ3RyJyk7XG5cdHZhciBzaGVldFJvd3MgPSBNYXRoLm1pbihvcHRzLnNoZWV0Um93c3x8MTAwMDAwMDAsIHJvd3MubGVuZ3RoKTtcblx0dmFyIHJhbmdlID0ge3M6e3I6MCxjOjB9LGU6e3I6b3JfUixjOm9yX0N9fTtcblx0aWYod3NbXCIhcmVmXCJdKSB7XG5cdFx0dmFyIF9yYW5nZSA9IGRlY29kZV9yYW5nZSh3c1tcIiFyZWZcIl0pO1xuXHRcdHJhbmdlLnMuciA9IE1hdGgubWluKHJhbmdlLnMuciwgX3JhbmdlLnMucik7XG5cdFx0cmFuZ2Uucy5jID0gTWF0aC5taW4ocmFuZ2Uucy5jLCBfcmFuZ2Uucy5jKTtcblx0XHRyYW5nZS5lLnIgPSBNYXRoLm1heChyYW5nZS5lLnIsIF9yYW5nZS5lLnIpO1xuXHRcdHJhbmdlLmUuYyA9IE1hdGgubWF4KHJhbmdlLmUuYywgX3JhbmdlLmUuYyk7XG5cdFx0aWYob3JfUiA9PSAtMSkgcmFuZ2UuZS5yID0gb3JfUiA9IF9yYW5nZS5lLnIgKyAxO1xuXHR9XG5cdHZhciBtZXJnZXMgPSBbXSwgbWlkeCA9IDA7XG5cdHZhciByb3dpbmZvID0gd3NbXCIhcm93c1wiXSB8fCAod3NbXCIhcm93c1wiXSA9IFtdKTtcblx0dmFyIF9SID0gMCwgUiA9IDAsIF9DID0gMCwgQyA9IDAsIFJTID0gMCwgQ1MgPSAwO1xuXHRpZighd3NbXCIhY29sc1wiXSkgd3NbJyFjb2xzJ10gPSBbXTtcblx0Zm9yKDsgX1IgPCByb3dzLmxlbmd0aCAmJiBSIDwgc2hlZXRSb3dzOyArK19SKSB7XG5cdFx0dmFyIHJvdyA9IHJvd3NbX1JdO1xuXHRcdGlmIChpc19kb21fZWxlbWVudF9oaWRkZW4ocm93KSkge1xuXHRcdFx0aWYgKG9wdHMuZGlzcGxheSkgY29udGludWU7XG5cdFx0XHRyb3dpbmZvW1JdID0ge2hpZGRlbjogdHJ1ZX07XG5cdFx0fVxuXHRcdHZhciBlbHRzID0gKHJvdy5jaGlsZHJlbik7XG5cdFx0Zm9yKF9DID0gQyA9IDA7IF9DIDwgZWx0cy5sZW5ndGg7ICsrX0MpIHtcblx0XHRcdHZhciBlbHQgPSBlbHRzW19DXTtcblx0XHRcdGlmIChvcHRzLmRpc3BsYXkgJiYgaXNfZG9tX2VsZW1lbnRfaGlkZGVuKGVsdCkpIGNvbnRpbnVlO1xuXHRcdFx0dmFyIHYgPSBlbHQuaGFzQXR0cmlidXRlKCd2JykgPyBlbHQuZ2V0QXR0cmlidXRlKCd2JykgOiBodG1sZGVjb2RlKGVsdC5pbm5lckhUTUwpO1xuXHRcdFx0dmFyIHogPSBlbHQuZ2V0QXR0cmlidXRlKCd6Jyk7XG5cdFx0XHRmb3IobWlkeCA9IDA7IG1pZHggPCBtZXJnZXMubGVuZ3RoOyArK21pZHgpIHtcblx0XHRcdFx0dmFyIG0gPSBtZXJnZXNbbWlkeF07XG5cdFx0XHRcdGlmKG0ucy5jID09IEMgKyBvcl9DICYmIG0ucy5yIDwgUiArIG9yX1IgJiYgUiArIG9yX1IgPD0gbS5lLnIpIHsgQyA9IG0uZS5jKzEgLSBvcl9DOyBtaWR4ID0gLTE7IH1cblx0XHRcdH1cblx0XHRcdC8qIFRPRE86IGZpZ3VyZSBvdXQgaG93IHRvIGV4dHJhY3Qgbm9uc3RhbmRhcmQgbXNvLSBzdHlsZSAqL1xuXHRcdFx0Q1MgPSArZWx0LmdldEF0dHJpYnV0ZShcImNvbHNwYW5cIikgfHwgMTtcblx0XHRcdGlmKCAoKFJTID0gKCtlbHQuZ2V0QXR0cmlidXRlKFwicm93c3BhblwiKSB8fCAxKSkpPjEgfHwgQ1M+MSkgbWVyZ2VzLnB1c2goe3M6e3I6UiArIG9yX1IsYzpDICsgb3JfQ30sZTp7cjpSICsgb3JfUiArIChSU3x8MSkgLSAxLCBjOkMgKyBvcl9DICsgKENTfHwxKSAtIDF9fSk7XG5cdFx0XHR2YXIgbyA9IHt0OidzJywgdjp2fTtcblx0XHRcdHZhciBfdCA9IGVsdC5nZXRBdHRyaWJ1dGUoXCJ0XCIpIHx8IFwiXCI7XG5cdFx0XHRpZih2ICE9IG51bGwpIHtcblx0XHRcdFx0aWYodi5sZW5ndGggPT0gMCkgby50ID0gX3QgfHwgJ3onO1xuXHRcdFx0XHRlbHNlIGlmKG9wdHMucmF3IHx8IHYudHJpbSgpLmxlbmd0aCA9PSAwIHx8IF90ID09IFwic1wiKXt9XG5cdFx0XHRcdGVsc2UgaWYodiA9PT0gJ1RSVUUnKSBvID0ge3Q6J2InLCB2OnRydWV9O1xuXHRcdFx0XHRlbHNlIGlmKHYgPT09ICdGQUxTRScpIG8gPSB7dDonYicsIHY6ZmFsc2V9O1xuXHRcdFx0XHRlbHNlIGlmKCFpc05hTihmdXp6eW51bSh2KSkpIG8gPSB7dDonbicsIHY6ZnV6enludW0odil9O1xuXHRcdFx0XHRlbHNlIGlmKCFpc05hTihmdXp6eWRhdGUodikuZ2V0RGF0ZSgpKSkge1xuXHRcdFx0XHRcdG8gPSAoe3Q6J2QnLCB2OnBhcnNlRGF0ZSh2KX0pO1xuXHRcdFx0XHRcdGlmKCFvcHRzLmNlbGxEYXRlcykgbyA9ICh7dDonbicsIHY6ZGF0ZW51bShvLnYpfSk7XG5cdFx0XHRcdFx0by56ID0gb3B0cy5kYXRlTkYgfHwgU1NGLl90YWJsZVsxNF07XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHRcdGlmKG8ueiA9PT0gdW5kZWZpbmVkICYmIHogIT0gbnVsbCkgby56ID0gejtcblx0XHRcdGlmKG9wdHMuZGVuc2UpIHsgaWYoIXdzW1IgKyBvcl9SXSkgd3NbUiArIG9yX1JdID0gW107IHdzW1IgKyBvcl9SXVtDICsgb3JfQ10gPSBvOyB9XG5cdFx0XHRlbHNlIHdzW2VuY29kZV9jZWxsKHtjOkMgKyBvcl9DLCByOlIgKyBvcl9SfSldID0gbztcblx0XHRcdGlmKHJhbmdlLmUuYyA8IEMgKyBvcl9DKSByYW5nZS5lLmMgPSBDICsgb3JfQztcblx0XHRcdEMgKz0gQ1M7XG5cdFx0fVxuXHRcdCsrUjtcblx0fVxuXHRpZihtZXJnZXMubGVuZ3RoKSB3c1snIW1lcmdlcyddID0gKHdzW1wiIW1lcmdlc1wiXSB8fCBbXSkuY29uY2F0KG1lcmdlcyk7XG5cdHJhbmdlLmUuciA9IE1hdGgubWF4KHJhbmdlLmUuciwgUiAtIDEgKyBvcl9SKTtcblx0d3NbJyFyZWYnXSA9IGVuY29kZV9yYW5nZShyYW5nZSk7XG5cdGlmKFIgPj0gc2hlZXRSb3dzKSB3c1snIWZ1bGxyZWYnXSA9IGVuY29kZV9yYW5nZSgocmFuZ2UuZS5yID0gcm93cy5sZW5ndGgtX1IrUi0xICsgb3JfUixyYW5nZSkpOyAvLyBXZSBjYW4gY291bnQgdGhlIHJlYWwgbnVtYmVyIG9mIHJvd3MgdG8gcGFyc2UgYnV0IHdlIGRvbid0IHRvIGltcHJvdmUgdGhlIHBlcmZvcm1hbmNlXG5cdHJldHVybiB3cztcbn1cblxuZnVuY3Rpb24gcGFyc2VfZG9tX3RhYmxlKHRhYmxlLCBfb3B0cykge1xuXHR2YXIgb3B0cyA9IF9vcHRzIHx8IHt9O1xuXHR2YXIgd3MgPSBvcHRzLmRlbnNlID8gKFtdKSA6ICh7fSk7XG5cdHJldHVybiBzaGVldF9hZGRfZG9tKHdzLCB0YWJsZSwgX29wdHMpO1xufVxuXG5mdW5jdGlvbiB0YWJsZV90b19ib29rKHRhYmxlLCBvcHRzKSB7XG5cdHJldHVybiBzaGVldF90b193b3JrYm9vayhwYXJzZV9kb21fdGFibGUodGFibGUsIG9wdHMpLCBvcHRzKTtcbn1cblxuZnVuY3Rpb24gaXNfZG9tX2VsZW1lbnRfaGlkZGVuKGVsZW1lbnQpIHtcblx0dmFyIGRpc3BsYXkgPSAnJztcblx0dmFyIGdldF9jb21wdXRlZF9zdHlsZSA9IGdldF9nZXRfY29tcHV0ZWRfc3R5bGVfZnVuY3Rpb24oZWxlbWVudCk7XG5cdGlmKGdldF9jb21wdXRlZF9zdHlsZSkgZGlzcGxheSA9IGdldF9jb21wdXRlZF9zdHlsZShlbGVtZW50KS5nZXRQcm9wZXJ0eVZhbHVlKCdkaXNwbGF5Jyk7XG5cdGlmKCFkaXNwbGF5KSBkaXNwbGF5ID0gZWxlbWVudC5zdHlsZS5kaXNwbGF5OyAvLyBGYWxsYmFjayBmb3IgY2FzZXMgd2hlbiBnZXRDb21wdXRlZFN0eWxlIGlzIG5vdCBhdmFpbGFibGUgKGUuZy4gYW4gb2xkIGJyb3dzZXIgb3Igc29tZSBOb2RlLmpzIGVudmlyb25tZW50cykgb3IgZG9lc24ndCB3b3JrIChlLmcuIGlmIHRoZSBlbGVtZW50IGlzIG5vdCBpbnNlcnRlZCB0byBhIGRvY3VtZW50KVxuXHRyZXR1cm4gZGlzcGxheSA9PT0gJ25vbmUnO1xufVxuXG4vKiBnbG9iYWwgZ2V0Q29tcHV0ZWRTdHlsZSAqL1xuZnVuY3Rpb24gZ2V0X2dldF9jb21wdXRlZF9zdHlsZV9mdW5jdGlvbihlbGVtZW50KSB7XG5cdC8vIFRoZSBwcm9wZXIgZ2V0Q29tcHV0ZWRTdHlsZSBpbXBsZW1lbnRhdGlvbiBpcyB0aGUgb25lIGRlZmluZWQgaW4gdGhlIGVsZW1lbnQgd2luZG93XG5cdGlmKGVsZW1lbnQub3duZXJEb2N1bWVudC5kZWZhdWx0VmlldyAmJiB0eXBlb2YgZWxlbWVudC5vd25lckRvY3VtZW50LmRlZmF1bHRWaWV3LmdldENvbXB1dGVkU3R5bGUgPT09ICdmdW5jdGlvbicpIHJldHVybiBlbGVtZW50Lm93bmVyRG9jdW1lbnQuZGVmYXVsdFZpZXcuZ2V0Q29tcHV0ZWRTdHlsZTtcblx0Ly8gSWYgaXQgaXMgbm90IGF2YWlsYWJsZSwgdHJ5IHRvIGdldCBvbmUgZnJvbSB0aGUgZ2xvYmFsIG5hbWVzcGFjZVxuXHRpZih0eXBlb2YgZ2V0Q29tcHV0ZWRTdHlsZSA9PT0gJ2Z1bmN0aW9uJykgcmV0dXJuIGdldENvbXB1dGVkU3R5bGU7XG5cdHJldHVybiBudWxsO1xufVxuLyogT3BlbkRvY3VtZW50ICovXG52YXIgcGFyc2VfY29udGVudF94bWwgPSAoZnVuY3Rpb24oKSB7XG5cblx0dmFyIHBhcnNlX3RleHRfcCA9IGZ1bmN0aW9uKHRleHQpIHtcblx0XHQvKiA2LjEuMiBXaGl0ZSBTcGFjZSBDaGFyYWN0ZXJzICovXG5cdFx0dmFyIGZpeGVkID0gdGV4dFxuXHRcdFx0LnJlcGxhY2UoL1tcXHRcXHJcXG5dL2csIFwiIFwiKS50cmltKCkucmVwbGFjZSgvICsvZywgXCIgXCIpXG5cdFx0XHQucmVwbGFjZSgvPHRleHQ6c1xcLz4vZyxcIiBcIilcblx0XHRcdC5yZXBsYWNlKC88dGV4dDpzIHRleHQ6Yz1cIihcXGQrKVwiXFwvPi9nLCBmdW5jdGlvbigkJCwkMSkgeyByZXR1cm4gQXJyYXkocGFyc2VJbnQoJDEsMTApKzEpLmpvaW4oXCIgXCIpOyB9KVxuXHRcdFx0LnJlcGxhY2UoLzx0ZXh0OnRhYltePl0qXFwvPi9nLFwiXFx0XCIpXG5cdFx0XHQucmVwbGFjZSgvPHRleHQ6bGluZS1icmVha1xcLz4vZyxcIlxcblwiKTtcblx0XHR2YXIgdiA9IHVuZXNjYXBleG1sKGZpeGVkLnJlcGxhY2UoLzxbXj5dKj4vZyxcIlwiKSk7XG5cblx0XHRyZXR1cm4gW3ZdO1xuXHR9O1xuXG5cdHZhciBudW1iZXJfZm9ybWF0cyA9IHtcblx0XHQvKiBvZHMgbmFtZTogW3Nob3J0IHNzZiBmbXQsIGxvbmcgc3NmIGZtdF0gKi9cblx0XHRkYXk6ICAgICAgICAgICBbXCJkXCIsICAgXCJkZFwiXSxcblx0XHRtb250aDogICAgICAgICBbXCJtXCIsICAgXCJtbVwiXSxcblx0XHR5ZWFyOiAgICAgICAgICBbXCJ5XCIsICAgXCJ5eVwiXSxcblx0XHRob3VyczogICAgICAgICBbXCJoXCIsICAgXCJoaFwiXSxcblx0XHRtaW51dGVzOiAgICAgICBbXCJtXCIsICAgXCJtbVwiXSxcblx0XHRzZWNvbmRzOiAgICAgICBbXCJzXCIsICAgXCJzc1wiXSxcblx0XHRcImFtLXBtXCI6ICAgICAgIFtcIkEvUFwiLCBcIkFNL1BNXCJdLFxuXHRcdFwiZGF5LW9mLXdlZWtcIjogW1wiZGRkXCIsIFwiZGRkZFwiXSxcblx0XHRlcmE6ICAgICAgICAgICBbXCJlXCIsICAgXCJlZVwiXSxcblx0XHQvKiB0aGVyZSBpcyBubyBuYXRpdmUgcmVwcmVzZW50YXRpb24gb2YgTE8gXCJRXCIgZm9ybWF0ICovXG5cdFx0cXVhcnRlcjogICAgICAgW1wiXFxcXFFtXCIsIFwibVxcXFxcXFwidGggcXVhcnRlclxcXCJcIl1cblx0fTtcblxuXHRyZXR1cm4gZnVuY3Rpb24gcGN4KGQsIF9vcHRzKSB7XG5cdFx0dmFyIG9wdHMgPSBfb3B0cyB8fCB7fTtcblx0XHRpZihERU5TRSAhPSBudWxsICYmIG9wdHMuZGVuc2UgPT0gbnVsbCkgb3B0cy5kZW5zZSA9IERFTlNFO1xuXHRcdHZhciBzdHIgPSB4bG1sX25vcm1hbGl6ZShkKTtcblx0XHR2YXIgc3RhdGUgPSBbXSwgdG1wO1xuXHRcdHZhciB0YWc7XG5cdFx0dmFyIE5GdGFnID0ge25hbWU6XCJcIn0sIE5GID0gXCJcIiwgcGlkeCA9IDA7XG5cdFx0dmFyIHNoZWV0YWc7XG5cdFx0dmFyIHJvd3RhZztcblx0XHR2YXIgU2hlZXRzID0ge30sIFNoZWV0TmFtZXMgPSBbXTtcblx0XHR2YXIgd3MgPSBvcHRzLmRlbnNlID8gKFtdKSA6ICh7fSk7XG5cdFx0dmFyIFJuLCBxO1xuXHRcdHZhciBjdGFnID0gKHt2YWx1ZTpcIlwifSk7XG5cdFx0dmFyIHRleHRwID0gXCJcIiwgdGV4dHBpZHggPSAwLCB0ZXh0cHRhZztcblx0XHR2YXIgdGV4dFIgPSBbXTtcblx0XHR2YXIgUiA9IC0xLCBDID0gLTEsIHJhbmdlID0ge3M6IHtyOjEwMDAwMDAsYzoxMDAwMDAwMH0sIGU6IHtyOjAsIGM6MH19O1xuXHRcdHZhciByb3dfb2wgPSAwO1xuXHRcdHZhciBudW1iZXJfZm9ybWF0X21hcCA9IHt9O1xuXHRcdHZhciBtZXJnZXMgPSBbXSwgbXJhbmdlID0ge30sIG1SID0gMCwgbUMgPSAwO1xuXHRcdHZhciByb3dpbmZvID0gW10sIHJvd3BlYXQgPSAxLCBjb2xwZWF0ID0gMTtcblx0XHR2YXIgYXJyYXlmID0gW107XG5cdFx0dmFyIFdCID0ge05hbWVzOltdfTtcblx0XHR2YXIgYXRhZyA9ICh7fSk7XG5cdFx0dmFyIF9SZWYgPSBbXCJcIiwgXCJcIl07XG5cdFx0dmFyIGNvbW1lbnRzID0gW10sIGNvbW1lbnQgPSAoe30pO1xuXHRcdHZhciBjcmVhdG9yID0gXCJcIiwgY3JlYXRvcmlkeCA9IDA7XG5cdFx0dmFyIGlzc3R1YiA9IGZhbHNlLCBpbnRhYmxlID0gZmFsc2U7XG5cdFx0dmFyIGkgPSAwO1xuXHRcdHhsbWxyZWdleC5sYXN0SW5kZXggPSAwO1xuXHRcdHN0ciA9IHN0ci5yZXBsYWNlKC88IS0tKFtcXHNcXFNdKj8pLS0+L21nLFwiXCIpLnJlcGxhY2UoLzwhRE9DVFlQRVteXFxbXSpcXFtbXlxcXV0qXFxdPi9nbSxcIlwiKTtcblx0XHR3aGlsZSgoUm4gPSB4bG1scmVnZXguZXhlYyhzdHIpKSkgc3dpdGNoKChSblszXT1SblszXS5yZXBsYWNlKC9fLiokLyxcIlwiKSkpIHtcblxuXHRcdFx0Y2FzZSAndGFibGUnOiBjYXNlICflt6XkvZzooagnOiAvLyA5LjEuMiA8dGFibGU6dGFibGU+XG5cdFx0XHRcdGlmKFJuWzFdPT09Jy8nKSB7XG5cdFx0XHRcdFx0aWYocmFuZ2UuZS5jID49IHJhbmdlLnMuYyAmJiByYW5nZS5lLnIgPj0gcmFuZ2Uucy5yKSB3c1snIXJlZiddID0gZW5jb2RlX3JhbmdlKHJhbmdlKTtcblx0XHRcdFx0XHRlbHNlIHdzWychcmVmJ10gPSBcIkExOkExXCI7XG5cdFx0XHRcdFx0aWYob3B0cy5zaGVldFJvd3MgPiAwICYmIG9wdHMuc2hlZXRSb3dzIDw9IHJhbmdlLmUucikge1xuXHRcdFx0XHRcdFx0d3NbJyFmdWxscmVmJ10gPSB3c1snIXJlZiddO1xuXHRcdFx0XHRcdFx0cmFuZ2UuZS5yID0gb3B0cy5zaGVldFJvd3MgLSAxO1xuXHRcdFx0XHRcdFx0d3NbJyFyZWYnXSA9IGVuY29kZV9yYW5nZShyYW5nZSk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdGlmKG1lcmdlcy5sZW5ndGgpIHdzWychbWVyZ2VzJ10gPSBtZXJnZXM7XG5cdFx0XHRcdFx0aWYocm93aW5mby5sZW5ndGgpIHdzW1wiIXJvd3NcIl0gPSByb3dpbmZvO1xuXHRcdFx0XHRcdHNoZWV0YWcubmFtZSA9IHNoZWV0YWdbJ+WQjeensCddIHx8IHNoZWV0YWcubmFtZTtcblx0XHRcdFx0XHRpZih0eXBlb2YgSlNPTiAhPT0gJ3VuZGVmaW5lZCcpIEpTT04uc3RyaW5naWZ5KHNoZWV0YWcpO1xuXHRcdFx0XHRcdFNoZWV0TmFtZXMucHVzaChzaGVldGFnLm5hbWUpO1xuXHRcdFx0XHRcdFNoZWV0c1tzaGVldGFnLm5hbWVdID0gd3M7XG5cdFx0XHRcdFx0aW50YWJsZSA9IGZhbHNlO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGVsc2UgaWYoUm5bMF0uY2hhckF0KFJuWzBdLmxlbmd0aC0yKSAhPT0gJy8nKSB7XG5cdFx0XHRcdFx0c2hlZXRhZyA9IHBhcnNleG1sdGFnKFJuWzBdLCBmYWxzZSk7XG5cdFx0XHRcdFx0UiA9IEMgPSAtMTtcblx0XHRcdFx0XHRyYW5nZS5zLnIgPSByYW5nZS5zLmMgPSAxMDAwMDAwMDsgcmFuZ2UuZS5yID0gcmFuZ2UuZS5jID0gMDtcblx0XHRcdFx0XHR3cyA9IG9wdHMuZGVuc2UgPyAoW10pIDogKHt9KTsgbWVyZ2VzID0gW107XG5cdFx0XHRcdFx0cm93aW5mbyA9IFtdO1xuXHRcdFx0XHRcdGludGFibGUgPSB0cnVlO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRjYXNlICd0YWJsZS1yb3ctZ3JvdXAnOiAvLyA5LjEuOSA8dGFibGU6dGFibGUtcm93LWdyb3VwPlxuXHRcdFx0XHRpZihSblsxXSA9PT0gXCIvXCIpIC0tcm93X29sOyBlbHNlICsrcm93X29sO1xuXHRcdFx0XHRicmVhaztcblx0XHRcdGNhc2UgJ3RhYmxlLXJvdyc6IGNhc2UgJ+ihjCc6IC8vIDkuMS4zIDx0YWJsZTp0YWJsZS1yb3c+XG5cdFx0XHRcdGlmKFJuWzFdID09PSAnLycpIHsgUis9cm93cGVhdDsgcm93cGVhdCA9IDE7IGJyZWFrOyB9XG5cdFx0XHRcdHJvd3RhZyA9IHBhcnNleG1sdGFnKFJuWzBdLCBmYWxzZSk7XG5cdFx0XHRcdGlmKHJvd3RhZ1sn6KGM5Y+3J10pIFIgPSByb3d0YWdbJ+ihjOWPtyddIC0gMTsgZWxzZSBpZihSID09IC0xKSBSID0gMDtcblx0XHRcdFx0cm93cGVhdCA9ICtyb3d0YWdbJ251bWJlci1yb3dzLXJlcGVhdGVkJ10gfHwgMTtcblx0XHRcdFx0LyogVE9ETzogcmVtb3ZlIG1hZ2ljICovXG5cdFx0XHRcdGlmKHJvd3BlYXQgPCAxMCkgZm9yKGkgPSAwOyBpIDwgcm93cGVhdDsgKytpKSBpZihyb3dfb2wgPiAwKSByb3dpbmZvW1IgKyBpXSA9IHtsZXZlbDogcm93X29sfTtcblx0XHRcdFx0QyA9IC0xOyBicmVhaztcblx0XHRcdGNhc2UgJ2NvdmVyZWQtdGFibGUtY2VsbCc6IC8vIDkuMS41IDx0YWJsZTpjb3ZlcmVkLXRhYmxlLWNlbGw+XG5cdFx0XHRcdGlmKFJuWzFdICE9PSAnLycpICsrQztcblx0XHRcdFx0aWYob3B0cy5zaGVldFN0dWJzKSB7XG5cdFx0XHRcdFx0aWYob3B0cy5kZW5zZSkgeyBpZighd3NbUl0pIHdzW1JdID0gW107IHdzW1JdW0NdID0ge3Q6J3onfTsgfVxuXHRcdFx0XHRcdGVsc2Ugd3NbZW5jb2RlX2NlbGwoe3I6UixjOkN9KV0gPSB7dDoneid9O1xuXHRcdFx0XHR9XG5cdFx0XHRcdHRleHRwID0gXCJcIjsgdGV4dFIgPSBbXTtcblx0XHRcdFx0YnJlYWs7IC8qIHN0dWIgKi9cblx0XHRcdGNhc2UgJ3RhYmxlLWNlbGwnOiBjYXNlICfmlbDmja4nOlxuXHRcdFx0XHRpZihSblswXS5jaGFyQXQoUm5bMF0ubGVuZ3RoLTIpID09PSAnLycpIHtcblx0XHRcdFx0XHQrK0M7XG5cdFx0XHRcdFx0Y3RhZyA9IHBhcnNleG1sdGFnKFJuWzBdLCBmYWxzZSk7XG5cdFx0XHRcdFx0Y29scGVhdCA9IHBhcnNlSW50KGN0YWdbJ251bWJlci1jb2x1bW5zLXJlcGVhdGVkJ118fFwiMVwiLCAxMCk7XG5cdFx0XHRcdFx0cSA9ICh7dDoneicsIHY6bnVsbH0pO1xuXHRcdFx0XHRcdGlmKGN0YWcuZm9ybXVsYSAmJiBvcHRzLmNlbGxGb3JtdWxhICE9IGZhbHNlKSBxLmYgPSBvZHNfdG9fY3NmX2Zvcm11bGEodW5lc2NhcGV4bWwoY3RhZy5mb3JtdWxhKSk7XG5cdFx0XHRcdFx0aWYoKGN0YWdbJ+aVsOaNruexu+WeiyddIHx8IGN0YWdbJ3ZhbHVlLXR5cGUnXSkgPT0gXCJzdHJpbmdcIikge1xuXHRcdFx0XHRcdFx0cS50ID0gXCJzXCI7IHEudiA9IHVuZXNjYXBleG1sKGN0YWdbJ3N0cmluZy12YWx1ZSddIHx8IFwiXCIpO1xuXHRcdFx0XHRcdFx0aWYob3B0cy5kZW5zZSkge1xuXHRcdFx0XHRcdFx0XHRpZighd3NbUl0pIHdzW1JdID0gW107XG5cdFx0XHRcdFx0XHRcdHdzW1JdW0NdID0gcTtcblx0XHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRcdHdzW2VuY29kZV9jZWxsKHtyOlIsYzpDfSldID0gcTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0Qys9IGNvbHBlYXQtMTtcblx0XHRcdFx0fSBlbHNlIGlmKFJuWzFdIT09Jy8nKSB7XG5cdFx0XHRcdFx0KytDO1xuXHRcdFx0XHRcdGNvbHBlYXQgPSAxO1xuXHRcdFx0XHRcdHZhciBycHRSID0gcm93cGVhdCA/IFIgKyByb3dwZWF0IC0gMSA6IFI7XG5cdFx0XHRcdFx0aWYoQyA+IHJhbmdlLmUuYykgcmFuZ2UuZS5jID0gQztcblx0XHRcdFx0XHRpZihDIDwgcmFuZ2Uucy5jKSByYW5nZS5zLmMgPSBDO1xuXHRcdFx0XHRcdGlmKFIgPCByYW5nZS5zLnIpIHJhbmdlLnMuciA9IFI7XG5cdFx0XHRcdFx0aWYocnB0UiA+IHJhbmdlLmUucikgcmFuZ2UuZS5yID0gcnB0Ujtcblx0XHRcdFx0XHRjdGFnID0gcGFyc2V4bWx0YWcoUm5bMF0sIGZhbHNlKTtcblx0XHRcdFx0XHRjb21tZW50cyA9IFtdOyBjb21tZW50ID0gKHt9KTtcblx0XHRcdFx0XHRxID0gKHt0OmN0YWdbJ+aVsOaNruexu+WeiyddIHx8IGN0YWdbJ3ZhbHVlLXR5cGUnXSwgdjpudWxsfSk7XG5cdFx0XHRcdFx0aWYob3B0cy5jZWxsRm9ybXVsYSkge1xuXHRcdFx0XHRcdFx0aWYoY3RhZy5mb3JtdWxhKSBjdGFnLmZvcm11bGEgPSB1bmVzY2FwZXhtbChjdGFnLmZvcm11bGEpO1xuXHRcdFx0XHRcdFx0aWYoY3RhZ1snbnVtYmVyLW1hdHJpeC1jb2x1bW5zLXNwYW5uZWQnXSAmJiBjdGFnWydudW1iZXItbWF0cml4LXJvd3Mtc3Bhbm5lZCddKSB7XG5cdFx0XHRcdFx0XHRcdG1SID0gcGFyc2VJbnQoY3RhZ1snbnVtYmVyLW1hdHJpeC1yb3dzLXNwYW5uZWQnXSwxMCkgfHwgMDtcblx0XHRcdFx0XHRcdFx0bUMgPSBwYXJzZUludChjdGFnWydudW1iZXItbWF0cml4LWNvbHVtbnMtc3Bhbm5lZCddLDEwKSB8fCAwO1xuXHRcdFx0XHRcdFx0XHRtcmFuZ2UgPSB7czoge3I6UixjOkN9LCBlOntyOlIgKyBtUi0xLGM6QyArIG1DLTF9fTtcblx0XHRcdFx0XHRcdFx0cS5GID0gZW5jb2RlX3JhbmdlKG1yYW5nZSk7XG5cdFx0XHRcdFx0XHRcdGFycmF5Zi5wdXNoKFttcmFuZ2UsIHEuRl0pO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0aWYoY3RhZy5mb3JtdWxhKSBxLmYgPSBvZHNfdG9fY3NmX2Zvcm11bGEoY3RhZy5mb3JtdWxhKTtcblx0XHRcdFx0XHRcdGVsc2UgZm9yKGkgPSAwOyBpIDwgYXJyYXlmLmxlbmd0aDsgKytpKVxuXHRcdFx0XHRcdFx0XHRpZihSID49IGFycmF5ZltpXVswXS5zLnIgJiYgUiA8PSBhcnJheWZbaV1bMF0uZS5yKVxuXHRcdFx0XHRcdFx0XHRcdGlmKEMgPj0gYXJyYXlmW2ldWzBdLnMuYyAmJiBDIDw9IGFycmF5ZltpXVswXS5lLmMpXG5cdFx0XHRcdFx0XHRcdFx0XHRxLkYgPSBhcnJheWZbaV1bMV07XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdGlmKGN0YWdbJ251bWJlci1jb2x1bW5zLXNwYW5uZWQnXSB8fCBjdGFnWydudW1iZXItcm93cy1zcGFubmVkJ10pIHtcblx0XHRcdFx0XHRcdG1SID0gcGFyc2VJbnQoY3RhZ1snbnVtYmVyLXJvd3Mtc3Bhbm5lZCddLDEwKSB8fCAwO1xuXHRcdFx0XHRcdFx0bUMgPSBwYXJzZUludChjdGFnWydudW1iZXItY29sdW1ucy1zcGFubmVkJ10sMTApIHx8IDA7XG5cdFx0XHRcdFx0XHRtcmFuZ2UgPSB7czoge3I6UixjOkN9LCBlOntyOlIgKyBtUi0xLGM6QyArIG1DLTF9fTtcblx0XHRcdFx0XHRcdG1lcmdlcy5wdXNoKG1yYW5nZSk7XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0LyogMTkuNjc1LjIgdGFibGU6bnVtYmVyLWNvbHVtbnMtcmVwZWF0ZWQgKi9cblx0XHRcdFx0XHRpZihjdGFnWydudW1iZXItY29sdW1ucy1yZXBlYXRlZCddKSBjb2xwZWF0ID0gcGFyc2VJbnQoY3RhZ1snbnVtYmVyLWNvbHVtbnMtcmVwZWF0ZWQnXSwgMTApO1xuXG5cdFx0XHRcdFx0LyogMTkuMzg1IG9mZmljZTp2YWx1ZS10eXBlICovXG5cdFx0XHRcdFx0c3dpdGNoKHEudCkge1xuXHRcdFx0XHRcdFx0Y2FzZSAnYm9vbGVhbic6IHEudCA9ICdiJzsgcS52ID0gcGFyc2V4bWxib29sKGN0YWdbJ2Jvb2xlYW4tdmFsdWUnXSk7IGJyZWFrO1xuXHRcdFx0XHRcdFx0Y2FzZSAnZmxvYXQnOiBxLnQgPSAnbic7IHEudiA9IHBhcnNlRmxvYXQoY3RhZy52YWx1ZSk7IGJyZWFrO1xuXHRcdFx0XHRcdFx0Y2FzZSAncGVyY2VudGFnZSc6IHEudCA9ICduJzsgcS52ID0gcGFyc2VGbG9hdChjdGFnLnZhbHVlKTsgYnJlYWs7XG5cdFx0XHRcdFx0XHRjYXNlICdjdXJyZW5jeSc6IHEudCA9ICduJzsgcS52ID0gcGFyc2VGbG9hdChjdGFnLnZhbHVlKTsgYnJlYWs7XG5cdFx0XHRcdFx0XHRjYXNlICdkYXRlJzogcS50ID0gJ2QnOyBxLnYgPSBwYXJzZURhdGUoY3RhZ1snZGF0ZS12YWx1ZSddKTtcblx0XHRcdFx0XHRcdFx0aWYoIW9wdHMuY2VsbERhdGVzKSB7IHEudCA9ICduJzsgcS52ID0gZGF0ZW51bShxLnYpOyB9XG5cdFx0XHRcdFx0XHRcdHEueiA9ICdtL2QveXknOyBicmVhaztcblx0XHRcdFx0XHRcdGNhc2UgJ3RpbWUnOiBxLnQgPSAnbic7IHEudiA9IHBhcnNlX2lzb2R1cihjdGFnWyd0aW1lLXZhbHVlJ10pLzg2NDAwOyBicmVhaztcblx0XHRcdFx0XHRcdGNhc2UgJ251bWJlcic6IHEudCA9ICduJzsgcS52ID0gcGFyc2VGbG9hdChjdGFnWyfmlbDmja7mlbDlgLwnXSk7IGJyZWFrO1xuXHRcdFx0XHRcdFx0ZGVmYXVsdDpcblx0XHRcdFx0XHRcdFx0aWYocS50ID09PSAnc3RyaW5nJyB8fCBxLnQgPT09ICd0ZXh0JyB8fCAhcS50KSB7XG5cdFx0XHRcdFx0XHRcdFx0cS50ID0gJ3MnO1xuXHRcdFx0XHRcdFx0XHRcdGlmKGN0YWdbJ3N0cmluZy12YWx1ZSddICE9IG51bGwpIHsgdGV4dHAgPSB1bmVzY2FwZXhtbChjdGFnWydzdHJpbmctdmFsdWUnXSk7IHRleHRSID0gW107IH1cblx0XHRcdFx0XHRcdFx0fSBlbHNlIHRocm93IG5ldyBFcnJvcignVW5zdXBwb3J0ZWQgdmFsdWUgdHlwZSAnICsgcS50KTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0aXNzdHViID0gZmFsc2U7XG5cdFx0XHRcdFx0aWYocS50ID09PSAncycpIHtcblx0XHRcdFx0XHRcdHEudiA9IHRleHRwIHx8ICcnO1xuXHRcdFx0XHRcdFx0aWYodGV4dFIubGVuZ3RoKSBxLlIgPSB0ZXh0Ujtcblx0XHRcdFx0XHRcdGlzc3R1YiA9IHRleHRwaWR4ID09IDA7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdGlmKGF0YWcuVGFyZ2V0KSBxLmwgPSBhdGFnO1xuXHRcdFx0XHRcdGlmKGNvbW1lbnRzLmxlbmd0aCA+IDApIHsgcS5jID0gY29tbWVudHM7IGNvbW1lbnRzID0gW107IH1cblx0XHRcdFx0XHRpZih0ZXh0cCAmJiBvcHRzLmNlbGxUZXh0ICE9PSBmYWxzZSkgcS53ID0gdGV4dHA7XG5cdFx0XHRcdFx0aWYoaXNzdHViKSB7IHEudCA9IFwielwiOyBkZWxldGUgcS52OyB9XG5cdFx0XHRcdFx0aWYoIWlzc3R1YiB8fCBvcHRzLnNoZWV0U3R1YnMpIHtcblx0XHRcdFx0XHRcdGlmKCEob3B0cy5zaGVldFJvd3MgJiYgb3B0cy5zaGVldFJvd3MgPD0gUikpIHtcblx0XHRcdFx0XHRcdFx0Zm9yKHZhciBycHQgPSAwOyBycHQgPCByb3dwZWF0OyArK3JwdCkge1xuXHRcdFx0XHRcdFx0XHRcdGNvbHBlYXQgPSBwYXJzZUludChjdGFnWydudW1iZXItY29sdW1ucy1yZXBlYXRlZCddfHxcIjFcIiwgMTApO1xuXHRcdFx0XHRcdFx0XHRcdGlmKG9wdHMuZGVuc2UpIHtcblx0XHRcdFx0XHRcdFx0XHRcdGlmKCF3c1tSICsgcnB0XSkgd3NbUiArIHJwdF0gPSBbXTtcblx0XHRcdFx0XHRcdFx0XHRcdHdzW1IgKyBycHRdW0NdID0gcnB0ID09IDAgPyBxIDogZHVwKHEpO1xuXHRcdFx0XHRcdFx0XHRcdFx0d2hpbGUoLS1jb2xwZWF0ID4gMCkgd3NbUiArIHJwdF1bQyArIGNvbHBlYXRdID0gZHVwKHEpO1xuXHRcdFx0XHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRcdFx0XHR3c1tlbmNvZGVfY2VsbCh7cjpSICsgcnB0LGM6Q30pXSA9IHE7XG5cdFx0XHRcdFx0XHRcdFx0XHR3aGlsZSgtLWNvbHBlYXQgPiAwKSB3c1tlbmNvZGVfY2VsbCh7cjpSICsgcnB0LGM6QyArIGNvbHBlYXR9KV0gPSBkdXAocSk7XG5cdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRcdGlmKHJhbmdlLmUuYyA8PSBDKSByYW5nZS5lLmMgPSBDO1xuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdGNvbHBlYXQgPSBwYXJzZUludChjdGFnWydudW1iZXItY29sdW1ucy1yZXBlYXRlZCddfHxcIjFcIiwgMTApO1xuXHRcdFx0XHRcdEMgKz0gY29scGVhdC0xOyBjb2xwZWF0ID0gMDtcblx0XHRcdFx0XHRxID0ge307XG5cdFx0XHRcdFx0dGV4dHAgPSBcIlwiOyB0ZXh0UiA9IFtdO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGF0YWcgPSAoe30pO1xuXHRcdFx0XHRicmVhazsgLy8gOS4xLjQgPHRhYmxlOnRhYmxlLWNlbGw+XG5cblx0XHRcdC8qIHB1cmUgc3RhdGUgKi9cblx0XHRcdGNhc2UgJ2RvY3VtZW50JzogLy8gVE9ETzogPG9mZmljZTpkb2N1bWVudD4gaXMgdGhlIHJvb3QgZm9yIEZPRFNcblx0XHRcdGNhc2UgJ2RvY3VtZW50LWNvbnRlbnQnOiBjYXNlICfnlLXlrZDooajmoLzmlofmoaMnOiAvLyAzLjEuMy4yIDxvZmZpY2U6ZG9jdW1lbnQtY29udGVudD5cblx0XHRcdGNhc2UgJ3NwcmVhZHNoZWV0JzogY2FzZSAn5Li75L2TJzogLy8gMy43IDxvZmZpY2U6c3ByZWFkc2hlZXQ+XG5cdFx0XHRjYXNlICdzY3JpcHRzJzogLy8gMy4xMiA8b2ZmaWNlOnNjcmlwdHM+XG5cdFx0XHRjYXNlICdzdHlsZXMnOiAvLyBUT0RPIDxvZmZpY2U6c3R5bGVzPlxuXHRcdFx0Y2FzZSAnZm9udC1mYWNlLWRlY2xzJzogLy8gMy4xNCA8b2ZmaWNlOmZvbnQtZmFjZS1kZWNscz5cblx0XHRcdGNhc2UgJ21hc3Rlci1zdHlsZXMnOiAvLzMuMTUuNCA8b2ZmaWNlOm1hc3Rlci1zdHlsZXM+IC0tIHJlbGV2YW50IGZvciBGT0RTXG5cdFx0XHRcdGlmKFJuWzFdPT09Jy8nKXtpZigodG1wPXN0YXRlLnBvcCgpKVswXSE9PVJuWzNdKSB0aHJvdyBcIkJhZCBzdGF0ZTogXCIrdG1wO31cblx0XHRcdFx0ZWxzZSBpZihSblswXS5jaGFyQXQoUm5bMF0ubGVuZ3RoLTIpICE9PSAnLycpIHN0YXRlLnB1c2goW1JuWzNdLCB0cnVlXSk7XG5cdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRjYXNlICdhbm5vdGF0aW9uJzogLy8gMTQuMSA8b2ZmaWNlOmFubm90YXRpb24+XG5cdFx0XHRcdGlmKFJuWzFdPT09Jy8nKXtcblx0XHRcdFx0XHRpZigodG1wPXN0YXRlLnBvcCgpKVswXSE9PVJuWzNdKSB0aHJvdyBcIkJhZCBzdGF0ZTogXCIrdG1wO1xuXHRcdFx0XHRcdGNvbW1lbnQudCA9IHRleHRwO1xuXHRcdFx0XHRcdGlmKHRleHRSLmxlbmd0aCkgY29tbWVudC5SID0gdGV4dFI7XG5cdFx0XHRcdFx0Y29tbWVudC5hID0gY3JlYXRvcjtcblx0XHRcdFx0XHRjb21tZW50cy5wdXNoKGNvbW1lbnQpO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGVsc2UgaWYoUm5bMF0uY2hhckF0KFJuWzBdLmxlbmd0aC0yKSAhPT0gJy8nKSB7c3RhdGUucHVzaChbUm5bM10sIGZhbHNlXSk7fVxuXHRcdFx0XHRjcmVhdG9yID0gXCJcIjsgY3JlYXRvcmlkeCA9IDA7XG5cdFx0XHRcdHRleHRwID0gXCJcIjsgdGV4dHBpZHggPSAwOyB0ZXh0UiA9IFtdO1xuXHRcdFx0XHRicmVhaztcblxuXHRcdFx0Y2FzZSAnY3JlYXRvcic6IC8vIDQuMy4yLjcgPGRjOmNyZWF0b3I+XG5cdFx0XHRcdGlmKFJuWzFdPT09Jy8nKSB7IGNyZWF0b3IgPSBzdHIuc2xpY2UoY3JlYXRvcmlkeCxSbi5pbmRleCk7IH1cblx0XHRcdFx0ZWxzZSBjcmVhdG9yaWR4ID0gUm4uaW5kZXggKyBSblswXS5sZW5ndGg7XG5cdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHQvKiBpZ25vcmUgc3RhdGUgKi9cblx0XHRcdGNhc2UgJ21ldGEnOiBjYXNlICflhYPmlbDmja4nOiAvLyBUT0RPOiA8b2ZmaWNlOm1ldGE+IDx1b2Y65YWD5pWw5o2uPiBGT0RTL1VPRlxuXHRcdFx0Y2FzZSAnc2V0dGluZ3MnOiAvLyBUT0RPOiA8b2ZmaWNlOnNldHRpbmdzPlxuXHRcdFx0Y2FzZSAnY29uZmlnLWl0ZW0tc2V0JzogLy8gVE9ETzogPG9mZmljZTpjb25maWctaXRlbS1zZXQ+XG5cdFx0XHRjYXNlICdjb25maWctaXRlbS1tYXAtaW5kZXhlZCc6IC8vIFRPRE86IDxvZmZpY2U6Y29uZmlnLWl0ZW0tbWFwLWluZGV4ZWQ+XG5cdFx0XHRjYXNlICdjb25maWctaXRlbS1tYXAtZW50cnknOiAvLyBUT0RPOiA8b2ZmaWNlOmNvbmZpZy1pdGVtLW1hcC1lbnRyeT5cblx0XHRcdGNhc2UgJ2NvbmZpZy1pdGVtLW1hcC1uYW1lZCc6IC8vIFRPRE86IDxvZmZpY2U6Y29uZmlnLWl0ZW0tbWFwLWVudHJ5PlxuXHRcdFx0Y2FzZSAnc2hhcGVzJzogLy8gOS4yLjggPHRhYmxlOnNoYXBlcz5cblx0XHRcdGNhc2UgJ2ZyYW1lJzogLy8gMTAuNC4yIDxkcmF3OmZyYW1lPlxuXHRcdFx0Y2FzZSAndGV4dC1ib3gnOiAvLyAxMC40LjMgPGRyYXc6dGV4dC1ib3g+XG5cdFx0XHRjYXNlICdpbWFnZSc6IC8vIDEwLjQuNCA8ZHJhdzppbWFnZT5cblx0XHRcdGNhc2UgJ2RhdGEtcGlsb3QtdGFibGVzJzogLy8gOS42LjIgPHRhYmxlOmRhdGEtcGlsb3QtdGFibGVzPlxuXHRcdFx0Y2FzZSAnbGlzdC1zdHlsZSc6IC8vIDE2LjMwIDx0ZXh0Omxpc3Qtc3R5bGU+XG5cdFx0XHRjYXNlICdmb3JtJzogLy8gMTMuMTMgPGZvcm06Zm9ybT5cblx0XHRcdGNhc2UgJ2RkZS1saW5rcyc6IC8vIDkuOCA8dGFibGU6ZGRlLWxpbmtzPlxuXHRcdFx0Y2FzZSAnZXZlbnQtbGlzdGVuZXJzJzogLy8gVE9ET1xuXHRcdFx0Y2FzZSAnY2hhcnQnOiAvLyBUT0RPXG5cdFx0XHRcdGlmKFJuWzFdPT09Jy8nKXtpZigodG1wPXN0YXRlLnBvcCgpKVswXSE9PVJuWzNdKSB0aHJvdyBcIkJhZCBzdGF0ZTogXCIrdG1wO31cblx0XHRcdFx0ZWxzZSBpZihSblswXS5jaGFyQXQoUm5bMF0ubGVuZ3RoLTIpICE9PSAnLycpIHN0YXRlLnB1c2goW1JuWzNdLCBmYWxzZV0pO1xuXHRcdFx0XHR0ZXh0cCA9IFwiXCI7IHRleHRwaWR4ID0gMDsgdGV4dFIgPSBbXTtcblx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdGNhc2UgJ3NjaWVudGlmaWMtbnVtYmVyJzogLy8gVE9ETzogPG51bWJlcjpzY2llbnRpZmljLW51bWJlcj5cblx0XHRcdFx0YnJlYWs7XG5cdFx0XHRjYXNlICdjdXJyZW5jeS1zeW1ib2wnOiAvLyBUT0RPOiA8bnVtYmVyOmN1cnJlbmN5LXN5bWJvbD5cblx0XHRcdFx0YnJlYWs7XG5cdFx0XHRjYXNlICdjdXJyZW5jeS1zdHlsZSc6IC8vIFRPRE86IDxudW1iZXI6Y3VycmVuY3ktc3R5bGU+XG5cdFx0XHRcdGJyZWFrO1xuXHRcdFx0Y2FzZSAnbnVtYmVyLXN0eWxlJzogLy8gMTYuMjcuMiA8bnVtYmVyOm51bWJlci1zdHlsZT5cblx0XHRcdGNhc2UgJ3BlcmNlbnRhZ2Utc3R5bGUnOiAvLyAxNi4yNy45IDxudW1iZXI6cGVyY2VudGFnZS1zdHlsZT5cblx0XHRcdGNhc2UgJ2RhdGUtc3R5bGUnOiAvLyAxNi4yNy4xMCA8bnVtYmVyOmRhdGUtc3R5bGU+XG5cdFx0XHRjYXNlICd0aW1lLXN0eWxlJzogLy8gMTYuMjcuMTggPG51bWJlcjp0aW1lLXN0eWxlPlxuXHRcdFx0XHRpZihSblsxXT09PScvJyl7XG5cdFx0XHRcdFx0bnVtYmVyX2Zvcm1hdF9tYXBbTkZ0YWcubmFtZV0gPSBORjtcblx0XHRcdFx0XHRpZigodG1wPXN0YXRlLnBvcCgpKVswXSE9PVJuWzNdKSB0aHJvdyBcIkJhZCBzdGF0ZTogXCIrdG1wO1xuXHRcdFx0XHR9IGVsc2UgaWYoUm5bMF0uY2hhckF0KFJuWzBdLmxlbmd0aC0yKSAhPT0gJy8nKSB7XG5cdFx0XHRcdFx0TkYgPSBcIlwiO1xuXHRcdFx0XHRcdE5GdGFnID0gcGFyc2V4bWx0YWcoUm5bMF0sIGZhbHNlKTtcblx0XHRcdFx0XHRzdGF0ZS5wdXNoKFtSblszXSwgdHJ1ZV0pO1xuXHRcdFx0XHR9IGJyZWFrO1xuXG5cdFx0XHRjYXNlICdzY3JpcHQnOiBicmVhazsgLy8gMy4xMyA8b2ZmaWNlOnNjcmlwdD5cblx0XHRcdGNhc2UgJ2xpYnJhcmllcyc6IGJyZWFrOyAvLyBUT0RPOiA8b29vOmxpYnJhcmllcz5cblx0XHRcdGNhc2UgJ2F1dG9tYXRpYy1zdHlsZXMnOiBicmVhazsgLy8gMy4xNS4zIDxvZmZpY2U6YXV0b21hdGljLXN0eWxlcz5cblxuXHRcdFx0Y2FzZSAnZGVmYXVsdC1zdHlsZSc6IC8vIFRPRE86IDxzdHlsZTpkZWZhdWx0LXN0eWxlPlxuXHRcdFx0Y2FzZSAncGFnZS1sYXlvdXQnOiBicmVhazsgLy8gVE9ETzogPHN0eWxlOnBhZ2UtbGF5b3V0PlxuXHRcdFx0Y2FzZSAnc3R5bGUnOiAvLyAxNi4yIDxzdHlsZTpzdHlsZT5cblx0XHRcdFx0YnJlYWs7XG5cdFx0XHRjYXNlICdtYXAnOiBicmVhazsgLy8gMTYuMyA8c3R5bGU6bWFwPlxuXHRcdFx0Y2FzZSAnZm9udC1mYWNlJzogYnJlYWs7IC8vIDE2LjIxIDxzdHlsZTpmb250LWZhY2U+XG5cblx0XHRcdGNhc2UgJ3BhcmFncmFwaC1wcm9wZXJ0aWVzJzogYnJlYWs7IC8vIDE3LjYgPHN0eWxlOnBhcmFncmFwaC1wcm9wZXJ0aWVzPlxuXHRcdFx0Y2FzZSAndGFibGUtcHJvcGVydGllcyc6IGJyZWFrOyAvLyAxNy4xNSA8c3R5bGU6dGFibGUtcHJvcGVydGllcz5cblx0XHRcdGNhc2UgJ3RhYmxlLWNvbHVtbi1wcm9wZXJ0aWVzJzogYnJlYWs7IC8vIDE3LjE2IDxzdHlsZTp0YWJsZS1jb2x1bW4tcHJvcGVydGllcz5cblx0XHRcdGNhc2UgJ3RhYmxlLXJvdy1wcm9wZXJ0aWVzJzogYnJlYWs7IC8vIDE3LjE3IDxzdHlsZTp0YWJsZS1yb3ctcHJvcGVydGllcz5cblx0XHRcdGNhc2UgJ3RhYmxlLWNlbGwtcHJvcGVydGllcyc6IGJyZWFrOyAvLyAxNy4xOCA8c3R5bGU6dGFibGUtY2VsbC1wcm9wZXJ0aWVzPlxuXG5cdFx0XHRjYXNlICdudW1iZXInOiAvLyAxNi4yNy4zIDxudW1iZXI6bnVtYmVyPlxuXHRcdFx0XHRzd2l0Y2goc3RhdGVbc3RhdGUubGVuZ3RoLTFdWzBdKSB7XG5cdFx0XHRcdFx0Y2FzZSAndGltZS1zdHlsZSc6XG5cdFx0XHRcdFx0Y2FzZSAnZGF0ZS1zdHlsZSc6XG5cdFx0XHRcdFx0XHR0YWcgPSBwYXJzZXhtbHRhZyhSblswXSwgZmFsc2UpO1xuXHRcdFx0XHRcdFx0TkYgKz0gbnVtYmVyX2Zvcm1hdHNbUm5bM11dW3RhZy5zdHlsZT09PSdsb25nJz8xOjBdOyBicmVhaztcblx0XHRcdFx0fSBicmVhaztcblxuXHRcdFx0Y2FzZSAnZnJhY3Rpb24nOiBicmVhazsgLy8gVE9ETyAxNi4yNy42IDxudW1iZXI6ZnJhY3Rpb24+XG5cblx0XHRcdGNhc2UgJ2RheSc6IC8vIDE2LjI3LjExIDxudW1iZXI6ZGF5PlxuXHRcdFx0Y2FzZSAnbW9udGgnOiAvLyAxNi4yNy4xMiA8bnVtYmVyOm1vbnRoPlxuXHRcdFx0Y2FzZSAneWVhcic6IC8vIDE2LjI3LjEzIDxudW1iZXI6eWVhcj5cblx0XHRcdGNhc2UgJ2VyYSc6IC8vIDE2LjI3LjE0IDxudW1iZXI6ZXJhPlxuXHRcdFx0Y2FzZSAnZGF5LW9mLXdlZWsnOiAvLyAxNi4yNy4xNSA8bnVtYmVyOmRheS1vZi13ZWVrPlxuXHRcdFx0Y2FzZSAnd2Vlay1vZi15ZWFyJzogLy8gMTYuMjcuMTYgPG51bWJlcjp3ZWVrLW9mLXllYXI+XG5cdFx0XHRjYXNlICdxdWFydGVyJzogLy8gMTYuMjcuMTcgPG51bWJlcjpxdWFydGVyPlxuXHRcdFx0Y2FzZSAnaG91cnMnOiAvLyAxNi4yNy4xOSA8bnVtYmVyOmhvdXJzPlxuXHRcdFx0Y2FzZSAnbWludXRlcyc6IC8vIDE2LjI3LjIwIDxudW1iZXI6bWludXRlcz5cblx0XHRcdGNhc2UgJ3NlY29uZHMnOiAvLyAxNi4yNy4yMSA8bnVtYmVyOnNlY29uZHM+XG5cdFx0XHRjYXNlICdhbS1wbSc6IC8vIDE2LjI3LjIyIDxudW1iZXI6YW0tcG0+XG5cdFx0XHRcdHN3aXRjaChzdGF0ZVtzdGF0ZS5sZW5ndGgtMV1bMF0pIHtcblx0XHRcdFx0XHRjYXNlICd0aW1lLXN0eWxlJzpcblx0XHRcdFx0XHRjYXNlICdkYXRlLXN0eWxlJzpcblx0XHRcdFx0XHRcdHRhZyA9IHBhcnNleG1sdGFnKFJuWzBdLCBmYWxzZSk7XG5cdFx0XHRcdFx0XHRORiArPSBudW1iZXJfZm9ybWF0c1tSblszXV1bdGFnLnN0eWxlPT09J2xvbmcnPzE6MF07IGJyZWFrO1xuXHRcdFx0XHR9IGJyZWFrO1xuXG5cdFx0XHRjYXNlICdib29sZWFuLXN0eWxlJzogYnJlYWs7IC8vIDE2LjI3LjIzIDxudW1iZXI6Ym9vbGVhbi1zdHlsZT5cblx0XHRcdGNhc2UgJ2Jvb2xlYW4nOiBicmVhazsgLy8gMTYuMjcuMjQgPG51bWJlcjpib29sZWFuPlxuXHRcdFx0Y2FzZSAndGV4dC1zdHlsZSc6IGJyZWFrOyAvLyAxNi4yNy4yNSA8bnVtYmVyOnRleHQtc3R5bGU+XG5cdFx0XHRjYXNlICd0ZXh0JzogLy8gMTYuMjcuMjYgPG51bWJlcjp0ZXh0PlxuXHRcdFx0XHRpZihSblswXS5zbGljZSgtMikgPT09IFwiLz5cIikgYnJlYWs7XG5cdFx0XHRcdGVsc2UgaWYoUm5bMV09PT1cIi9cIikgc3dpdGNoKHN0YXRlW3N0YXRlLmxlbmd0aC0xXVswXSkge1xuXHRcdFx0XHRcdGNhc2UgJ251bWJlci1zdHlsZSc6XG5cdFx0XHRcdFx0Y2FzZSAnZGF0ZS1zdHlsZSc6XG5cdFx0XHRcdFx0Y2FzZSAndGltZS1zdHlsZSc6XG5cdFx0XHRcdFx0XHRORiArPSBzdHIuc2xpY2UocGlkeCwgUm4uaW5kZXgpO1xuXHRcdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdH1cblx0XHRcdFx0ZWxzZSBwaWR4ID0gUm4uaW5kZXggKyBSblswXS5sZW5ndGg7XG5cdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRjYXNlICduYW1lZC1yYW5nZSc6IC8vIDkuNC4xMiA8dGFibGU6bmFtZWQtcmFuZ2U+XG5cdFx0XHRcdHRhZyA9IHBhcnNleG1sdGFnKFJuWzBdLCBmYWxzZSk7XG5cdFx0XHRcdF9SZWYgPSBvZHNfdG9fY3NmXzNEKHRhZ1snY2VsbC1yYW5nZS1hZGRyZXNzJ10pO1xuXHRcdFx0XHR2YXIgbnJhbmdlID0gKHtOYW1lOnRhZy5uYW1lLCBSZWY6X1JlZlswXSArICchJyArIF9SZWZbMV19KTtcblx0XHRcdFx0aWYoaW50YWJsZSkgbnJhbmdlLlNoZWV0ID0gU2hlZXROYW1lcy5sZW5ndGg7XG5cdFx0XHRcdFdCLk5hbWVzLnB1c2gobnJhbmdlKTtcblx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdGNhc2UgJ3RleHQtY29udGVudCc6IGJyZWFrOyAvLyAxNi4yNy4yNyA8bnVtYmVyOnRleHQtY29udGVudD5cblx0XHRcdGNhc2UgJ3RleHQtcHJvcGVydGllcyc6IGJyZWFrOyAvLyAxNi4yNy4yNyA8c3R5bGU6dGV4dC1wcm9wZXJ0aWVzPlxuXHRcdFx0Y2FzZSAnZW1iZWRkZWQtdGV4dCc6IGJyZWFrOyAvLyAxNi4yNy40IDxudW1iZXI6ZW1iZWRkZWQtdGV4dD5cblxuXHRcdFx0Y2FzZSAnYm9keSc6IGNhc2UgJ+eUteWtkOihqOagvCc6IGJyZWFrOyAvLyAzLjMgMTYuOS42IDE5LjcyNi4zXG5cblx0XHRcdGNhc2UgJ2Zvcm1zJzogYnJlYWs7IC8vIDEyLjI1LjIgMTMuMlxuXHRcdFx0Y2FzZSAndGFibGUtY29sdW1uJzogYnJlYWs7IC8vIDkuMS42IDx0YWJsZTp0YWJsZS1jb2x1bW4+XG5cdFx0XHRjYXNlICd0YWJsZS1oZWFkZXItcm93cyc6IGJyZWFrOyAvLyA5LjEuNyA8dGFibGU6dGFibGUtaGVhZGVyLXJvd3M+XG5cdFx0XHRjYXNlICd0YWJsZS1yb3dzJzogYnJlYWs7IC8vIDkuMS4xMiA8dGFibGU6dGFibGUtcm93cz5cblx0XHRcdC8qIFRPRE86IG91dGxpbmUgbGV2ZWxzICovXG5cdFx0XHRjYXNlICd0YWJsZS1jb2x1bW4tZ3JvdXAnOiBicmVhazsgLy8gOS4xLjEwIDx0YWJsZTp0YWJsZS1jb2x1bW4tZ3JvdXA+XG5cdFx0XHRjYXNlICd0YWJsZS1oZWFkZXItY29sdW1ucyc6IGJyZWFrOyAvLyA5LjEuMTEgPHRhYmxlOnRhYmxlLWhlYWRlci1jb2x1bW5zPlxuXHRcdFx0Y2FzZSAndGFibGUtY29sdW1ucyc6IGJyZWFrOyAvLyA5LjEuMTIgPHRhYmxlOnRhYmxlLWNvbHVtbnM+XG5cblx0XHRcdGNhc2UgJ251bGwtZGF0ZSc6IGJyZWFrOyAvLyA5LjQuMiA8dGFibGU6bnVsbC1kYXRlPiBUT0RPOiBkYXRlMTkwNFxuXG5cdFx0XHRjYXNlICdncmFwaGljLXByb3BlcnRpZXMnOiBicmVhazsgLy8gMTcuMjEgPHN0eWxlOmdyYXBoaWMtcHJvcGVydGllcz5cblx0XHRcdGNhc2UgJ2NhbGN1bGF0aW9uLXNldHRpbmdzJzogYnJlYWs7IC8vIDkuNC4xIDx0YWJsZTpjYWxjdWxhdGlvbi1zZXR0aW5ncz5cblx0XHRcdGNhc2UgJ25hbWVkLWV4cHJlc3Npb25zJzogYnJlYWs7IC8vIDkuNC4xMSA8dGFibGU6bmFtZWQtZXhwcmVzc2lvbnM+XG5cdFx0XHRjYXNlICdsYWJlbC1yYW5nZSc6IGJyZWFrOyAvLyA5LjQuOSA8dGFibGU6bGFiZWwtcmFuZ2U+XG5cdFx0XHRjYXNlICdsYWJlbC1yYW5nZXMnOiBicmVhazsgLy8gOS40LjEwIDx0YWJsZTpsYWJlbC1yYW5nZXM+XG5cdFx0XHRjYXNlICduYW1lZC1leHByZXNzaW9uJzogYnJlYWs7IC8vIDkuNC4xMyA8dGFibGU6bmFtZWQtZXhwcmVzc2lvbj5cblx0XHRcdGNhc2UgJ3NvcnQnOiBicmVhazsgLy8gOS40LjE5IDx0YWJsZTpzb3J0PlxuXHRcdFx0Y2FzZSAnc29ydC1ieSc6IGJyZWFrOyAvLyA5LjQuMjAgPHRhYmxlOnNvcnQtYnk+XG5cdFx0XHRjYXNlICdzb3J0LWdyb3Vwcyc6IGJyZWFrOyAvLyA5LjQuMjIgPHRhYmxlOnNvcnQtZ3JvdXBzPlxuXG5cdFx0XHRjYXNlICd0YWInOiBicmVhazsgLy8gNi4xLjQgPHRleHQ6dGFiPlxuXHRcdFx0Y2FzZSAnbGluZS1icmVhayc6IGJyZWFrOyAvLyA2LjEuNSA8dGV4dDpsaW5lLWJyZWFrPlxuXHRcdFx0Y2FzZSAnc3Bhbic6IGJyZWFrOyAvLyA2LjEuNyA8dGV4dDpzcGFuPlxuXHRcdFx0Y2FzZSAncCc6IGNhc2UgJ+aWh+acrOS4sic6IC8vIDUuMS4zIDx0ZXh0OnA+XG5cdFx0XHRcdGlmKFsnbWFzdGVyLXN0eWxlcyddLmluZGV4T2Yoc3RhdGVbc3RhdGUubGVuZ3RoLTFdWzBdKSA+IC0xKSBicmVhaztcblx0XHRcdFx0aWYoUm5bMV09PT0nLycgJiYgKCFjdGFnIHx8ICFjdGFnWydzdHJpbmctdmFsdWUnXSkpIHtcblx0XHRcdFx0XHR2YXIgcHRwID0gcGFyc2VfdGV4dF9wKHN0ci5zbGljZSh0ZXh0cGlkeCxSbi5pbmRleCksIHRleHRwdGFnKTtcblx0XHRcdFx0XHR0ZXh0cCA9ICh0ZXh0cC5sZW5ndGggPiAwID8gdGV4dHAgKyBcIlxcblwiIDogXCJcIikgKyBwdHBbMF07XG5cdFx0XHRcdH0gZWxzZSB7IHRleHRwdGFnID0gcGFyc2V4bWx0YWcoUm5bMF0sIGZhbHNlKTsgdGV4dHBpZHggPSBSbi5pbmRleCArIFJuWzBdLmxlbmd0aDsgfVxuXHRcdFx0XHRicmVhazsgLy8gPHRleHQ6cD5cblx0XHRcdGNhc2UgJ3MnOiBicmVhazsgLy8gPHRleHQ6cz5cblxuXHRcdFx0Y2FzZSAnZGF0YWJhc2UtcmFuZ2UnOiAvLyA5LjQuMTUgPHRhYmxlOmRhdGFiYXNlLXJhbmdlPlxuXHRcdFx0XHRpZihSblsxXT09PScvJykgYnJlYWs7XG5cdFx0XHRcdHRyeSB7XG5cdFx0XHRcdFx0X1JlZiA9IG9kc190b19jc2ZfM0QocGFyc2V4bWx0YWcoUm5bMF0pWyd0YXJnZXQtcmFuZ2UtYWRkcmVzcyddKTtcblx0XHRcdFx0XHRTaGVldHNbX1JlZlswXV1bJyFhdXRvZmlsdGVyJ10gPSB7IHJlZjpfUmVmWzFdIH07XG5cdFx0XHRcdH0gY2F0Y2goZSkgey8qIGVtcHR5ICovfVxuXHRcdFx0XHRicmVhaztcblxuXHRcdFx0Y2FzZSAnZGF0ZSc6IGJyZWFrOyAvLyA8KjpkYXRlPlxuXG5cdFx0XHRjYXNlICdvYmplY3QnOiBicmVhazsgLy8gMTAuNC42LjIgPGRyYXc6b2JqZWN0PlxuXHRcdFx0Y2FzZSAndGl0bGUnOiBjYXNlICfmoIfpopgnOiBicmVhazsgLy8gPCo6dGl0bGU+IE9SIDx1b2Y65qCH6aKYPlxuXHRcdFx0Y2FzZSAnZGVzYyc6IGJyZWFrOyAvLyA8KjpkZXNjPlxuXHRcdFx0Y2FzZSAnYmluYXJ5LWRhdGEnOiBicmVhazsgLy8gMTAuNC41IFRPRE86IGI2NCBibG9iXG5cblx0XHRcdC8qIDkuMiBBZHZhbmNlZCBUYWJsZXMgKi9cblx0XHRcdGNhc2UgJ3RhYmxlLXNvdXJjZSc6IGJyZWFrOyAvLyA5LjIuNlxuXHRcdFx0Y2FzZSAnc2NlbmFyaW8nOiBicmVhazsgLy8gOS4yLjZcblxuXHRcdFx0Y2FzZSAnaXRlcmF0aW9uJzogYnJlYWs7IC8vIDkuNC4zIDx0YWJsZTppdGVyYXRpb24+XG5cdFx0XHRjYXNlICdjb250ZW50LXZhbGlkYXRpb25zJzogYnJlYWs7IC8vIDkuNC40IDx0YWJsZTpcblx0XHRcdGNhc2UgJ2NvbnRlbnQtdmFsaWRhdGlvbic6IGJyZWFrOyAvLyA5LjQuNSA8dGFibGU6XG5cdFx0XHRjYXNlICdoZWxwLW1lc3NhZ2UnOiBicmVhazsgLy8gOS40LjYgPHRhYmxlOlxuXHRcdFx0Y2FzZSAnZXJyb3ItbWVzc2FnZSc6IGJyZWFrOyAvLyA5LjQuNyA8dGFibGU6XG5cdFx0XHRjYXNlICdkYXRhYmFzZS1yYW5nZXMnOiBicmVhazsgLy8gOS40LjE0IDx0YWJsZTpkYXRhYmFzZS1yYW5nZXM+XG5cdFx0XHRjYXNlICdmaWx0ZXInOiBicmVhazsgLy8gOS41LjIgPHRhYmxlOmZpbHRlcj5cblx0XHRcdGNhc2UgJ2ZpbHRlci1hbmQnOiBicmVhazsgLy8gOS41LjMgPHRhYmxlOmZpbHRlci1hbmQ+XG5cdFx0XHRjYXNlICdmaWx0ZXItb3InOiBicmVhazsgLy8gOS41LjQgPHRhYmxlOmZpbHRlci1vcj5cblx0XHRcdGNhc2UgJ2ZpbHRlci1jb25kaXRpb24nOiBicmVhazsgLy8gOS41LjUgPHRhYmxlOmZpbHRlci1jb25kaXRpb24+XG5cblx0XHRcdGNhc2UgJ2xpc3QtbGV2ZWwtc3R5bGUtYnVsbGV0JzogYnJlYWs7IC8vIDE2LjMxIDx0ZXh0OlxuXHRcdFx0Y2FzZSAnbGlzdC1sZXZlbC1zdHlsZS1udW1iZXInOiBicmVhazsgLy8gMTYuMzIgPHRleHQ6XG5cdFx0XHRjYXNlICdsaXN0LWxldmVsLXByb3BlcnRpZXMnOiBicmVhazsgLy8gMTcuMTkgPHN0eWxlOlxuXG5cdFx0XHQvKiA3LjMgRG9jdW1lbnQgRmllbGRzICovXG5cdFx0XHRjYXNlICdzZW5kZXItZmlyc3RuYW1lJzogLy8gNy4zLjYuMlxuXHRcdFx0Y2FzZSAnc2VuZGVyLWxhc3RuYW1lJzogLy8gNy4zLjYuM1xuXHRcdFx0Y2FzZSAnc2VuZGVyLWluaXRpYWxzJzogLy8gNy4zLjYuNFxuXHRcdFx0Y2FzZSAnc2VuZGVyLXRpdGxlJzogLy8gNy4zLjYuNVxuXHRcdFx0Y2FzZSAnc2VuZGVyLXBvc2l0aW9uJzogLy8gNy4zLjYuNlxuXHRcdFx0Y2FzZSAnc2VuZGVyLWVtYWlsJzogLy8gNy4zLjYuN1xuXHRcdFx0Y2FzZSAnc2VuZGVyLXBob25lLXByaXZhdGUnOiAvLyA3LjMuNi44XG5cdFx0XHRjYXNlICdzZW5kZXItZmF4JzogLy8gNy4zLjYuOVxuXHRcdFx0Y2FzZSAnc2VuZGVyLWNvbXBhbnknOiAvLyA3LjMuNi4xMFxuXHRcdFx0Y2FzZSAnc2VuZGVyLXBob25lLXdvcmsnOiAvLyA3LjMuNi4xMVxuXHRcdFx0Y2FzZSAnc2VuZGVyLXN0cmVldCc6IC8vIDcuMy42LjEyXG5cdFx0XHRjYXNlICdzZW5kZXItY2l0eSc6IC8vIDcuMy42LjEzXG5cdFx0XHRjYXNlICdzZW5kZXItcG9zdGFsLWNvZGUnOiAvLyA3LjMuNi4xNFxuXHRcdFx0Y2FzZSAnc2VuZGVyLWNvdW50cnknOiAvLyA3LjMuNi4xNVxuXHRcdFx0Y2FzZSAnc2VuZGVyLXN0YXRlLW9yLXByb3ZpbmNlJzogLy8gNy4zLjYuMTZcblx0XHRcdGNhc2UgJ2F1dGhvci1uYW1lJzogLy8gNy4zLjcuMVxuXHRcdFx0Y2FzZSAnYXV0aG9yLWluaXRpYWxzJzogLy8gNy4zLjcuMlxuXHRcdFx0Y2FzZSAnY2hhcHRlcic6IC8vIDcuMy44XG5cdFx0XHRjYXNlICdmaWxlLW5hbWUnOiAvLyA3LjMuOVxuXHRcdFx0Y2FzZSAndGVtcGxhdGUtbmFtZSc6IC8vIDcuMy45XG5cdFx0XHRjYXNlICdzaGVldC1uYW1lJzogLy8gNy4zLjlcblx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdGNhc2UgJ2V2ZW50LWxpc3RlbmVyJzpcblx0XHRcdFx0YnJlYWs7XG5cdFx0XHQvKiBUT0RPOiBGT0RTIFByb3BlcnRpZXMgKi9cblx0XHRcdGNhc2UgJ2luaXRpYWwtY3JlYXRvcic6XG5cdFx0XHRjYXNlICdjcmVhdGlvbi1kYXRlJzpcblx0XHRcdGNhc2UgJ3ByaW50LWRhdGUnOlxuXHRcdFx0Y2FzZSAnZ2VuZXJhdG9yJzpcblx0XHRcdGNhc2UgJ2RvY3VtZW50LXN0YXRpc3RpYyc6XG5cdFx0XHRjYXNlICd1c2VyLWRlZmluZWQnOlxuXHRcdFx0Y2FzZSAnZWRpdGluZy1kdXJhdGlvbic6XG5cdFx0XHRjYXNlICdlZGl0aW5nLWN5Y2xlcyc6XG5cdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHQvKiBUT0RPOiBGT0RTIENvbmZpZyAqL1xuXHRcdFx0Y2FzZSAnY29uZmlnLWl0ZW0nOlxuXHRcdFx0XHRicmVhaztcblxuXHRcdFx0LyogVE9ETzogc3R5bGUgdG9rZW5zICovXG5cdFx0XHRjYXNlICdwYWdlLW51bWJlcic6IGJyZWFrOyAvLyBUT0RPIDx0ZXh0OnBhZ2UtbnVtYmVyPlxuXHRcdFx0Y2FzZSAncGFnZS1jb3VudCc6IGJyZWFrOyAvLyBUT0RPIDx0ZXh0OnBhZ2UtY291bnQ+XG5cdFx0XHRjYXNlICd0aW1lJzogYnJlYWs7IC8vIFRPRE8gPHRleHQ6dGltZT5cblxuXHRcdFx0LyogOS4zIEFkdmFuY2VkIFRhYmxlIENlbGxzICovXG5cdFx0XHRjYXNlICdjZWxsLXJhbmdlLXNvdXJjZSc6IGJyZWFrOyAvLyA5LjMuMSA8dGFibGU6XG5cdFx0XHRjYXNlICdkZXRlY3RpdmUnOiBicmVhazsgLy8gOS4zLjIgPHRhYmxlOlxuXHRcdFx0Y2FzZSAnb3BlcmF0aW9uJzogYnJlYWs7IC8vIDkuMy4zIDx0YWJsZTpcblx0XHRcdGNhc2UgJ2hpZ2hsaWdodGVkLXJhbmdlJzogYnJlYWs7IC8vIDkuMy40IDx0YWJsZTpcblxuXHRcdFx0LyogOS42IERhdGEgUGlsb3QgVGFibGVzIDx0YWJsZTogKi9cblx0XHRcdGNhc2UgJ2RhdGEtcGlsb3QtdGFibGUnOiAvLyA5LjYuM1xuXHRcdFx0Y2FzZSAnc291cmNlLWNlbGwtcmFuZ2UnOiAvLyA5LjYuNVxuXHRcdFx0Y2FzZSAnc291cmNlLXNlcnZpY2UnOiAvLyA5LjYuNlxuXHRcdFx0Y2FzZSAnZGF0YS1waWxvdC1maWVsZCc6IC8vIDkuNi43XG5cdFx0XHRjYXNlICdkYXRhLXBpbG90LWxldmVsJzogLy8gOS42Ljhcblx0XHRcdGNhc2UgJ2RhdGEtcGlsb3Qtc3VidG90YWxzJzogLy8gOS42Ljlcblx0XHRcdGNhc2UgJ2RhdGEtcGlsb3Qtc3VidG90YWwnOiAvLyA5LjYuMTBcblx0XHRcdGNhc2UgJ2RhdGEtcGlsb3QtbWVtYmVycyc6IC8vIDkuNi4xMVxuXHRcdFx0Y2FzZSAnZGF0YS1waWxvdC1tZW1iZXInOiAvLyA5LjYuMTJcblx0XHRcdGNhc2UgJ2RhdGEtcGlsb3QtZGlzcGxheS1pbmZvJzogLy8gOS42LjEzXG5cdFx0XHRjYXNlICdkYXRhLXBpbG90LXNvcnQtaW5mbyc6IC8vIDkuNi4xNFxuXHRcdFx0Y2FzZSAnZGF0YS1waWxvdC1sYXlvdXQtaW5mbyc6IC8vIDkuNi4xNVxuXHRcdFx0Y2FzZSAnZGF0YS1waWxvdC1maWVsZC1yZWZlcmVuY2UnOiAvLyA5LjYuMTZcblx0XHRcdGNhc2UgJ2RhdGEtcGlsb3QtZ3JvdXBzJzogLy8gOS42LjE3XG5cdFx0XHRjYXNlICdkYXRhLXBpbG90LWdyb3VwJzogLy8gOS42LjE4XG5cdFx0XHRjYXNlICdkYXRhLXBpbG90LWdyb3VwLW1lbWJlcic6IC8vIDkuNi4xOVxuXHRcdFx0XHRicmVhaztcblxuXHRcdFx0LyogMTAuMyBEcmF3aW5nIFNoYXBlcyAqL1xuXHRcdFx0Y2FzZSAncmVjdCc6IC8vIDEwLjMuMlxuXHRcdFx0XHRicmVhaztcblxuXHRcdFx0LyogMTQuNiBEREUgQ29ubmVjdGlvbnMgKi9cblx0XHRcdGNhc2UgJ2RkZS1jb25uZWN0aW9uLWRlY2xzJzogLy8gMTQuNi4yIDx0ZXh0OlxuXHRcdFx0Y2FzZSAnZGRlLWNvbm5lY3Rpb24tZGVjbCc6IC8vIDE0LjYuMyA8dGV4dDpcblx0XHRcdGNhc2UgJ2RkZS1saW5rJzogLy8gMTQuNi40IDx0YWJsZTpcblx0XHRcdGNhc2UgJ2RkZS1zb3VyY2UnOiAvLyAxNC42LjUgPG9mZmljZTpcblx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdGNhc2UgJ3Byb3BlcnRpZXMnOiBicmVhazsgLy8gMTMuNyA8Zm9ybTpwcm9wZXJ0aWVzPlxuXHRcdFx0Y2FzZSAncHJvcGVydHknOiBicmVhazsgLy8gMTMuOCA8Zm9ybTpwcm9wZXJ0eT5cblxuXHRcdFx0Y2FzZSAnYSc6IC8vIDYuMS44IGh5cGVybGlua1xuXHRcdFx0XHRpZihSblsxXSE9PSAnLycpIHtcblx0XHRcdFx0XHRhdGFnID0gcGFyc2V4bWx0YWcoUm5bMF0sIGZhbHNlKTtcblx0XHRcdFx0XHRpZighYXRhZy5ocmVmKSBicmVhaztcblx0XHRcdFx0XHRhdGFnLlRhcmdldCA9IGF0YWcuaHJlZjsgZGVsZXRlIGF0YWcuaHJlZjtcblx0XHRcdFx0XHRpZihhdGFnLlRhcmdldC5jaGFyQXQoMCkgPT0gXCIjXCIgJiYgYXRhZy5UYXJnZXQuaW5kZXhPZihcIi5cIikgPiAtMSkge1xuXHRcdFx0XHRcdFx0X1JlZiA9IG9kc190b19jc2ZfM0QoYXRhZy5UYXJnZXQuc2xpY2UoMSkpO1xuXHRcdFx0XHRcdFx0YXRhZy5UYXJnZXQgPSBcIiNcIiArIF9SZWZbMF0gKyBcIiFcIiArIF9SZWZbMV07XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHQvKiBub24tc3RhbmRhcmQgKi9cblx0XHRcdGNhc2UgJ3RhYmxlLXByb3RlY3Rpb24nOiBicmVhaztcblx0XHRcdGNhc2UgJ2RhdGEtcGlsb3QtZ3JhbmQtdG90YWwnOiBicmVhazsgLy8gPHRhYmxlOlxuXHRcdFx0Y2FzZSAnb2ZmaWNlLWRvY3VtZW50LWNvbW1vbi1hdHRycyc6IGJyZWFrOyAvLyBiYXJlXG5cdFx0XHRkZWZhdWx0OiBzd2l0Y2goUm5bMl0pIHtcblx0XHRcdFx0Y2FzZSAnZGM6JzogICAgICAgLy8gVE9ETzogcHJvcGVydGllc1xuXHRcdFx0XHRjYXNlICdjYWxjZXh0Oic6ICAvLyBpZ25vcmUgdW5kb2N1bWVudGVkIGV4dGVuc2lvbnNcblx0XHRcdFx0Y2FzZSAnbG9leHQ6JzogICAgLy8gaWdub3JlIHVuZG9jdW1lbnRlZCBleHRlbnNpb25zXG5cdFx0XHRcdGNhc2UgJ29vbzonOiAgICAgIC8vIGlnbm9yZSB1bmRvY3VtZW50ZWQgZXh0ZW5zaW9uc1xuXHRcdFx0XHRjYXNlICdjaGFydG9vbzonOiAvLyBpZ25vcmUgdW5kb2N1bWVudGVkIGV4dGVuc2lvbnNcblx0XHRcdFx0Y2FzZSAnZHJhdzonOiAgICAgLy8gVE9ETzogZHJhd2luZ1xuXHRcdFx0XHRjYXNlICdzdHlsZTonOiAgICAvLyBUT0RPOiBzdHlsZXNcblx0XHRcdFx0Y2FzZSAnY2hhcnQ6JzogICAgLy8gVE9ETzogY2hhcnRzXG5cdFx0XHRcdGNhc2UgJ2Zvcm06JzogICAgIC8vIFRPRE86IGZvcm1zXG5cdFx0XHRcdGNhc2UgJ3VvZjonOiAgICAgIC8vIFRPRE86IHVvZlxuXHRcdFx0XHRjYXNlICfooag6JzogICAgICAgLy8gVE9ETzogdW9mXG5cdFx0XHRcdGNhc2UgJ+WtlzonOiAgICAgICAvLyBUT0RPOiB1b2Zcblx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0ZGVmYXVsdDogaWYob3B0cy5XVEYpIHRocm93IG5ldyBFcnJvcihSbik7XG5cdFx0XHR9XG5cdFx0fVxuXHRcdHZhciBvdXQgPSAoe1xuXHRcdFx0U2hlZXRzOiBTaGVldHMsXG5cdFx0XHRTaGVldE5hbWVzOiBTaGVldE5hbWVzLFxuXHRcdFx0V29ya2Jvb2s6IFdCXG5cdFx0fSk7XG5cdFx0aWYob3B0cy5ib29rU2hlZXRzKSBkZWxldGUgb3V0LlNoZWV0cztcblx0XHRyZXR1cm4gb3V0O1xuXHR9O1xufSkoKTtcblxuZnVuY3Rpb24gcGFyc2Vfb2RzKHppcCwgb3B0cykge1xuXHRvcHRzID0gb3B0cyB8fCAoe30pO1xuXHR2YXIgb2RzID0gISFzYWZlZ2V0emlwZmlsZSh6aXAsICdvYmplY3RkYXRhJyk7XG5cdGlmKG9kcykgcGFyc2VfbWFuaWZlc3QoZ2V0emlwZGF0YSh6aXAsICdNRVRBLUlORi9tYW5pZmVzdC54bWwnKSwgb3B0cyk7XG5cdHZhciBjb250ZW50ID0gZ2V0emlwc3RyKHppcCwgJ2NvbnRlbnQueG1sJyk7XG5cdGlmKCFjb250ZW50KSB0aHJvdyBuZXcgRXJyb3IoXCJNaXNzaW5nIGNvbnRlbnQueG1sIGluIFwiICsgKG9kcyA/IFwiT0RTXCIgOiBcIlVPRlwiKSsgXCIgZmlsZVwiKTtcblx0dmFyIHdiID0gcGFyc2VfY29udGVudF94bWwob2RzID8gY29udGVudCA6IHV0ZjhyZWFkKGNvbnRlbnQpLCBvcHRzKTtcblx0aWYoc2FmZWdldHppcGZpbGUoemlwLCAnbWV0YS54bWwnKSkgd2IuUHJvcHMgPSBwYXJzZV9jb3JlX3Byb3BzKGdldHppcGRhdGEoemlwLCAnbWV0YS54bWwnKSk7XG5cdHJldHVybiB3Yjtcbn1cbmZ1bmN0aW9uIHBhcnNlX2ZvZHMoZGF0YSwgb3B0cykge1xuXHRyZXR1cm4gcGFyc2VfY29udGVudF94bWwoZGF0YSwgb3B0cyk7XG59XG5cbi8qIE9wZW5Eb2N1bWVudCAqL1xudmFyIHdyaXRlX3N0eWxlc19vZHMgPSAoZnVuY3Rpb24oKSB7XG5cdHZhciBwYXlsb2FkID0gJzxvZmZpY2U6ZG9jdW1lbnQtc3R5bGVzICcgKyB3eHRfaGVscGVyKHtcblx0XHQneG1sbnM6b2ZmaWNlJzogICBcInVybjpvYXNpczpuYW1lczp0YzpvcGVuZG9jdW1lbnQ6eG1sbnM6b2ZmaWNlOjEuMFwiLFxuXHRcdCd4bWxuczp0YWJsZSc6ICAgIFwidXJuOm9hc2lzOm5hbWVzOnRjOm9wZW5kb2N1bWVudDp4bWxuczp0YWJsZToxLjBcIixcblx0XHQneG1sbnM6c3R5bGUnOiAgICBcInVybjpvYXNpczpuYW1lczp0YzpvcGVuZG9jdW1lbnQ6eG1sbnM6c3R5bGU6MS4wXCIsXG5cdFx0J3htbG5zOnRleHQnOiAgICAgXCJ1cm46b2FzaXM6bmFtZXM6dGM6b3BlbmRvY3VtZW50OnhtbG5zOnRleHQ6MS4wXCIsXG5cdFx0J3htbG5zOmRyYXcnOiAgICAgXCJ1cm46b2FzaXM6bmFtZXM6dGM6b3BlbmRvY3VtZW50OnhtbG5zOmRyYXdpbmc6MS4wXCIsXG5cdFx0J3htbG5zOmZvJzogICAgICAgXCJ1cm46b2FzaXM6bmFtZXM6dGM6b3BlbmRvY3VtZW50OnhtbG5zOnhzbC1mby1jb21wYXRpYmxlOjEuMFwiLFxuXHRcdCd4bWxuczp4bGluayc6ICAgIFwiaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGlua1wiLFxuXHRcdCd4bWxuczpkYyc6ICAgICAgIFwiaHR0cDovL3B1cmwub3JnL2RjL2VsZW1lbnRzLzEuMS9cIixcblx0XHQneG1sbnM6bnVtYmVyJzogICBcInVybjpvYXNpczpuYW1lczp0YzpvcGVuZG9jdW1lbnQ6eG1sbnM6ZGF0YXN0eWxlOjEuMFwiLFxuXHRcdCd4bWxuczpzdmcnOiAgICAgIFwidXJuOm9hc2lzOm5hbWVzOnRjOm9wZW5kb2N1bWVudDp4bWxuczpzdmctY29tcGF0aWJsZToxLjBcIixcblx0XHQneG1sbnM6b2YnOiAgICAgICBcInVybjpvYXNpczpuYW1lczp0YzpvcGVuZG9jdW1lbnQ6eG1sbnM6b2Y6MS4yXCIsXG5cdFx0J29mZmljZTp2ZXJzaW9uJzogXCIxLjJcIlxuXHR9KSArICc+PC9vZmZpY2U6ZG9jdW1lbnQtc3R5bGVzPic7XG5cdHJldHVybiBmdW5jdGlvbiB3c28oKSB7XG5cdFx0cmV0dXJuIFhNTF9IRUFERVIgKyBwYXlsb2FkO1xuXHR9O1xufSkoKTtcbnZhciB3cml0ZV9jb250ZW50X29kcyA9IChmdW5jdGlvbigpIHtcblx0LyogNi4xLjIgV2hpdGUgU3BhY2UgQ2hhcmFjdGVycyAqL1xuXHR2YXIgd3JpdGVfdGV4dF9wID0gZnVuY3Rpb24odGV4dCkge1xuXHRcdHJldHVybiBlc2NhcGV4bWwodGV4dClcblx0XHRcdC5yZXBsYWNlKC8gICsvZywgZnVuY3Rpb24oJCQpe3JldHVybiAnPHRleHQ6cyB0ZXh0OmM9XCInKyQkLmxlbmd0aCsnXCIvPic7fSlcblx0XHRcdC5yZXBsYWNlKC9cXHQvZywgXCI8dGV4dDp0YWIvPlwiKVxuXHRcdFx0LnJlcGxhY2UoL1xcbi9nLCBcIjx0ZXh0OmxpbmUtYnJlYWsvPlwiKVxuXHRcdFx0LnJlcGxhY2UoL14gLywgXCI8dGV4dDpzLz5cIikucmVwbGFjZSgvICQvLCBcIjx0ZXh0OnMvPlwiKTtcblx0fTtcblxuXHR2YXIgbnVsbF9jZWxsX3htbCA9ICcgICAgICAgICAgPHRhYmxlOnRhYmxlLWNlbGwgLz5cXG4nO1xuXHR2YXIgY292ZXJlZF9jZWxsX3htbCA9ICcgICAgICAgICAgPHRhYmxlOmNvdmVyZWQtdGFibGUtY2VsbC8+XFxuJztcblx0dmFyIHdyaXRlX3dzID0gZnVuY3Rpb24od3MsIHdiLCBpKSB7XG5cdFx0LyogU2VjdGlvbiA5IFRhYmxlcyAqL1xuXHRcdHZhciBvID0gW107XG5cdFx0by5wdXNoKCcgICAgICA8dGFibGU6dGFibGUgdGFibGU6bmFtZT1cIicgKyBlc2NhcGV4bWwod2IuU2hlZXROYW1lc1tpXSkgKyAnXCIgdGFibGU6c3R5bGUtbmFtZT1cInRhMVwiPlxcbicpO1xuXHRcdHZhciBSPTAsQz0wLCByYW5nZSA9IGRlY29kZV9yYW5nZSh3c1snIXJlZiddKTtcblx0XHR2YXIgbWFyciA9IHdzWychbWVyZ2VzJ10gfHwgW10sIG1pID0gMDtcblx0XHR2YXIgZGVuc2UgPSBBcnJheS5pc0FycmF5KHdzKTtcblx0XHRmb3IoUiA9IDA7IFIgPCByYW5nZS5zLnI7ICsrUikgby5wdXNoKCcgICAgICAgIDx0YWJsZTp0YWJsZS1yb3c+PC90YWJsZTp0YWJsZS1yb3c+XFxuJyk7XG5cdFx0Zm9yKDsgUiA8PSByYW5nZS5lLnI7ICsrUikge1xuXHRcdFx0by5wdXNoKCcgICAgICAgIDx0YWJsZTp0YWJsZS1yb3c+XFxuJyk7XG5cdFx0XHRmb3IoQz0wOyBDIDwgcmFuZ2Uucy5jOyArK0MpIG8ucHVzaChudWxsX2NlbGxfeG1sKTtcblx0XHRcdGZvcig7IEMgPD0gcmFuZ2UuZS5jOyArK0MpIHtcblx0XHRcdFx0dmFyIHNraXAgPSBmYWxzZSwgY3QgPSB7fSwgdGV4dHAgPSBcIlwiO1xuXHRcdFx0XHRmb3IobWkgPSAwOyBtaSAhPSBtYXJyLmxlbmd0aDsgKyttaSkge1xuXHRcdFx0XHRcdGlmKG1hcnJbbWldLnMuYyA+IEMpIGNvbnRpbnVlO1xuXHRcdFx0XHRcdGlmKG1hcnJbbWldLnMuciA+IFIpIGNvbnRpbnVlO1xuXHRcdFx0XHRcdGlmKG1hcnJbbWldLmUuYyA8IEMpIGNvbnRpbnVlO1xuXHRcdFx0XHRcdGlmKG1hcnJbbWldLmUuciA8IFIpIGNvbnRpbnVlO1xuXHRcdFx0XHRcdGlmKG1hcnJbbWldLnMuYyAhPSBDIHx8IG1hcnJbbWldLnMuciAhPSBSKSBza2lwID0gdHJ1ZTtcblx0XHRcdFx0XHRjdFsndGFibGU6bnVtYmVyLWNvbHVtbnMtc3Bhbm5lZCddID0gKG1hcnJbbWldLmUuYyAtIG1hcnJbbWldLnMuYyArIDEpO1xuXHRcdFx0XHRcdGN0Wyd0YWJsZTpudW1iZXItcm93cy1zcGFubmVkJ10gPSAgICAobWFyclttaV0uZS5yIC0gbWFyclttaV0ucy5yICsgMSk7XG5cdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdH1cblx0XHRcdFx0aWYoc2tpcCkgeyBvLnB1c2goY292ZXJlZF9jZWxsX3htbCk7IGNvbnRpbnVlOyB9XG5cdFx0XHRcdHZhciByZWYgPSBlbmNvZGVfY2VsbCh7cjpSLCBjOkN9KSwgY2VsbCA9IGRlbnNlID8gKHdzW1JdfHxbXSlbQ106IHdzW3JlZl07XG5cdFx0XHRcdGlmKGNlbGwgJiYgY2VsbC5mKSB7XG5cdFx0XHRcdFx0Y3RbJ3RhYmxlOmZvcm11bGEnXSA9IGVzY2FwZXhtbChjc2ZfdG9fb2RzX2Zvcm11bGEoY2VsbC5mKSk7XG5cdFx0XHRcdFx0aWYoY2VsbC5GKSB7XG5cdFx0XHRcdFx0XHRpZihjZWxsLkYuc2xpY2UoMCwgcmVmLmxlbmd0aCkgPT0gcmVmKSB7XG5cdFx0XHRcdFx0XHRcdHZhciBfRnJlZiA9IGRlY29kZV9yYW5nZShjZWxsLkYpO1xuXHRcdFx0XHRcdFx0XHRjdFsndGFibGU6bnVtYmVyLW1hdHJpeC1jb2x1bW5zLXNwYW5uZWQnXSA9IChfRnJlZi5lLmMgLSBfRnJlZi5zLmMgKyAxKTtcblx0XHRcdFx0XHRcdFx0Y3RbJ3RhYmxlOm51bWJlci1tYXRyaXgtcm93cy1zcGFubmVkJ10gPSAgICAoX0ZyZWYuZS5yIC0gX0ZyZWYucy5yICsgMSk7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHRcdGlmKCFjZWxsKSB7IG8ucHVzaChudWxsX2NlbGxfeG1sKTsgY29udGludWU7IH1cblx0XHRcdFx0c3dpdGNoKGNlbGwudCkge1xuXHRcdFx0XHRcdGNhc2UgJ2InOlxuXHRcdFx0XHRcdFx0dGV4dHAgPSAoY2VsbC52ID8gJ1RSVUUnIDogJ0ZBTFNFJyk7XG5cdFx0XHRcdFx0XHRjdFsnb2ZmaWNlOnZhbHVlLXR5cGUnXSA9IFwiYm9vbGVhblwiO1xuXHRcdFx0XHRcdFx0Y3RbJ29mZmljZTpib29sZWFuLXZhbHVlJ10gPSAoY2VsbC52ID8gJ3RydWUnIDogJ2ZhbHNlJyk7XG5cdFx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0XHRjYXNlICduJzpcblx0XHRcdFx0XHRcdHRleHRwID0gKGNlbGwud3x8U3RyaW5nKGNlbGwudnx8MCkpO1xuXHRcdFx0XHRcdFx0Y3RbJ29mZmljZTp2YWx1ZS10eXBlJ10gPSBcImZsb2F0XCI7XG5cdFx0XHRcdFx0XHRjdFsnb2ZmaWNlOnZhbHVlJ10gPSAoY2VsbC52fHwwKTtcblx0XHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRcdGNhc2UgJ3MnOiBjYXNlICdzdHInOlxuXHRcdFx0XHRcdFx0dGV4dHAgPSBjZWxsLnYgPT0gbnVsbCA/IFwiXCIgOiBjZWxsLnY7XG5cdFx0XHRcdFx0XHRjdFsnb2ZmaWNlOnZhbHVlLXR5cGUnXSA9IFwic3RyaW5nXCI7XG5cdFx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0XHRjYXNlICdkJzpcblx0XHRcdFx0XHRcdHRleHRwID0gKGNlbGwud3x8KHBhcnNlRGF0ZShjZWxsLnYpLnRvSVNPU3RyaW5nKCkpKTtcblx0XHRcdFx0XHRcdGN0WydvZmZpY2U6dmFsdWUtdHlwZSddID0gXCJkYXRlXCI7XG5cdFx0XHRcdFx0XHRjdFsnb2ZmaWNlOmRhdGUtdmFsdWUnXSA9IChwYXJzZURhdGUoY2VsbC52KS50b0lTT1N0cmluZygpKTtcblx0XHRcdFx0XHRcdGN0Wyd0YWJsZTpzdHlsZS1uYW1lJ10gPSBcImNlMVwiO1xuXHRcdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdFx0Ly9jYXNlICdlJzpcblx0XHRcdFx0XHRkZWZhdWx0OiBvLnB1c2gobnVsbF9jZWxsX3htbCk7IGNvbnRpbnVlO1xuXHRcdFx0XHR9XG5cdFx0XHRcdHZhciB0ZXh0X3AgPSB3cml0ZV90ZXh0X3AodGV4dHApO1xuXHRcdFx0XHRpZihjZWxsLmwgJiYgY2VsbC5sLlRhcmdldCkge1xuXHRcdFx0XHRcdHZhciBfdGd0ID0gY2VsbC5sLlRhcmdldDsgX3RndCA9IF90Z3QuY2hhckF0KDApID09IFwiI1wiID8gXCIjXCIgKyBjc2ZfdG9fb2RzXzNEKF90Z3Quc2xpY2UoMSkpIDogX3RndDtcblx0XHRcdFx0XHR0ZXh0X3AgPSB3cml0ZXh0YWcoJ3RleHQ6YScsIHRleHRfcCwgeyd4bGluazpocmVmJzogX3RndH0pO1xuXHRcdFx0XHR9XG5cdFx0XHRcdG8ucHVzaCgnICAgICAgICAgICcgKyB3cml0ZXh0YWcoJ3RhYmxlOnRhYmxlLWNlbGwnLCB3cml0ZXh0YWcoJ3RleHQ6cCcsIHRleHRfcCwge30pLCBjdCkgKyAnXFxuJyk7XG5cdFx0XHR9XG5cdFx0XHRvLnB1c2goJyAgICAgICAgPC90YWJsZTp0YWJsZS1yb3c+XFxuJyk7XG5cdFx0fVxuXHRcdG8ucHVzaCgnICAgICAgPC90YWJsZTp0YWJsZT5cXG4nKTtcblx0XHRyZXR1cm4gby5qb2luKFwiXCIpO1xuXHR9O1xuXG5cdHZhciB3cml0ZV9hdXRvbWF0aWNfc3R5bGVzX29kcyA9IGZ1bmN0aW9uKG8pIHtcblx0XHRvLnB1c2goJyA8b2ZmaWNlOmF1dG9tYXRpYy1zdHlsZXM+XFxuJyk7XG5cblx0XHRvLnB1c2goJyAgPG51bWJlcjpkYXRlLXN0eWxlIHN0eWxlOm5hbWU9XCJOMzdcIiBudW1iZXI6YXV0b21hdGljLW9yZGVyPVwidHJ1ZVwiPlxcbicpO1xuXHRcdG8ucHVzaCgnICAgPG51bWJlcjptb250aCBudW1iZXI6c3R5bGU9XCJsb25nXCIvPlxcbicpO1xuXHRcdG8ucHVzaCgnICAgPG51bWJlcjp0ZXh0Pi88L251bWJlcjp0ZXh0PlxcbicpO1xuXHRcdG8ucHVzaCgnICAgPG51bWJlcjpkYXkgbnVtYmVyOnN0eWxlPVwibG9uZ1wiLz5cXG4nKTtcblx0XHRvLnB1c2goJyAgIDxudW1iZXI6dGV4dD4vPC9udW1iZXI6dGV4dD5cXG4nKTtcblx0XHRvLnB1c2goJyAgIDxudW1iZXI6eWVhci8+XFxuJyk7XG5cdFx0by5wdXNoKCcgIDwvbnVtYmVyOmRhdGUtc3R5bGU+XFxuJyk7XG5cblx0XHQvKiB0YWJsZSAqL1xuXHRcdG8ucHVzaCgnICA8c3R5bGU6c3R5bGUgc3R5bGU6bmFtZT1cInRhMVwiIHN0eWxlOmZhbWlseT1cInRhYmxlXCI+XFxuJyk7IC8vIHN0eWxlOm1hc3Rlci1wYWdlLW5hbWU9XCJtcDFcIj5cXG4nKTtcblx0XHRvLnB1c2goJyAgIDxzdHlsZTp0YWJsZS1wcm9wZXJ0aWVzIHRhYmxlOmRpc3BsYXk9XCJ0cnVlXCIgc3R5bGU6d3JpdGluZy1tb2RlPVwibHItdGJcIi8+XFxuJyk7XG5cdFx0by5wdXNoKCcgIDwvc3R5bGU6c3R5bGU+XFxuJyk7XG5cblx0XHQvKiB0YWJsZSBjZWxscywgdGV4dCAqL1xuXHRcdG8ucHVzaCgnICA8c3R5bGU6c3R5bGUgc3R5bGU6bmFtZT1cImNlMVwiIHN0eWxlOmZhbWlseT1cInRhYmxlLWNlbGxcIiBzdHlsZTpwYXJlbnQtc3R5bGUtbmFtZT1cIkRlZmF1bHRcIiBzdHlsZTpkYXRhLXN0eWxlLW5hbWU9XCJOMzdcIi8+XFxuJyk7XG5cblx0XHQvKiBwYWdlLWxheW91dCAqL1xuXG5cdFx0by5wdXNoKCcgPC9vZmZpY2U6YXV0b21hdGljLXN0eWxlcz5cXG4nKTtcblx0fTtcblxuXHRyZXR1cm4gZnVuY3Rpb24gd2N4KHdiLCBvcHRzKSB7XG5cdFx0dmFyIG8gPSBbWE1MX0hFQURFUl07XG5cdFx0LyogMy4xLjMuMiAqL1xuXHRcdHZhciBhdHRyID0gd3h0X2hlbHBlcih7XG5cdFx0XHQneG1sbnM6b2ZmaWNlJzogICAgICAgXCJ1cm46b2FzaXM6bmFtZXM6dGM6b3BlbmRvY3VtZW50OnhtbG5zOm9mZmljZToxLjBcIixcblx0XHRcdCd4bWxuczp0YWJsZSc6ICAgICAgICBcInVybjpvYXNpczpuYW1lczp0YzpvcGVuZG9jdW1lbnQ6eG1sbnM6dGFibGU6MS4wXCIsXG5cdFx0XHQneG1sbnM6c3R5bGUnOiAgICAgICAgXCJ1cm46b2FzaXM6bmFtZXM6dGM6b3BlbmRvY3VtZW50OnhtbG5zOnN0eWxlOjEuMFwiLFxuXHRcdFx0J3htbG5zOnRleHQnOiAgICAgICAgIFwidXJuOm9hc2lzOm5hbWVzOnRjOm9wZW5kb2N1bWVudDp4bWxuczp0ZXh0OjEuMFwiLFxuXHRcdFx0J3htbG5zOmRyYXcnOiAgICAgICAgIFwidXJuOm9hc2lzOm5hbWVzOnRjOm9wZW5kb2N1bWVudDp4bWxuczpkcmF3aW5nOjEuMFwiLFxuXHRcdFx0J3htbG5zOmZvJzogICAgICAgICAgIFwidXJuOm9hc2lzOm5hbWVzOnRjOm9wZW5kb2N1bWVudDp4bWxuczp4c2wtZm8tY29tcGF0aWJsZToxLjBcIixcblx0XHRcdCd4bWxuczp4bGluayc6ICAgICAgICBcImh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmtcIixcblx0XHRcdCd4bWxuczpkYyc6ICAgICAgICAgICBcImh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvXCIsXG5cdFx0XHQneG1sbnM6bWV0YSc6ICAgICAgICAgXCJ1cm46b2FzaXM6bmFtZXM6dGM6b3BlbmRvY3VtZW50OnhtbG5zOm1ldGE6MS4wXCIsXG5cdFx0XHQneG1sbnM6bnVtYmVyJzogICAgICAgXCJ1cm46b2FzaXM6bmFtZXM6dGM6b3BlbmRvY3VtZW50OnhtbG5zOmRhdGFzdHlsZToxLjBcIixcblx0XHRcdCd4bWxuczpwcmVzZW50YXRpb24nOiBcInVybjpvYXNpczpuYW1lczp0YzpvcGVuZG9jdW1lbnQ6eG1sbnM6cHJlc2VudGF0aW9uOjEuMFwiLFxuXHRcdFx0J3htbG5zOnN2Zyc6ICAgICAgICAgIFwidXJuOm9hc2lzOm5hbWVzOnRjOm9wZW5kb2N1bWVudDp4bWxuczpzdmctY29tcGF0aWJsZToxLjBcIixcblx0XHRcdCd4bWxuczpjaGFydCc6ICAgICAgICBcInVybjpvYXNpczpuYW1lczp0YzpvcGVuZG9jdW1lbnQ6eG1sbnM6Y2hhcnQ6MS4wXCIsXG5cdFx0XHQneG1sbnM6ZHIzZCc6ICAgICAgICAgXCJ1cm46b2FzaXM6bmFtZXM6dGM6b3BlbmRvY3VtZW50OnhtbG5zOmRyM2Q6MS4wXCIsXG5cdFx0XHQneG1sbnM6bWF0aCc6ICAgICAgICAgXCJodHRwOi8vd3d3LnczLm9yZy8xOTk4L01hdGgvTWF0aE1MXCIsXG5cdFx0XHQneG1sbnM6Zm9ybSc6ICAgICAgICAgXCJ1cm46b2FzaXM6bmFtZXM6dGM6b3BlbmRvY3VtZW50OnhtbG5zOmZvcm06MS4wXCIsXG5cdFx0XHQneG1sbnM6c2NyaXB0JzogICAgICAgXCJ1cm46b2FzaXM6bmFtZXM6dGM6b3BlbmRvY3VtZW50OnhtbG5zOnNjcmlwdDoxLjBcIixcblx0XHRcdCd4bWxuczpvb28nOiAgICAgICAgICBcImh0dHA6Ly9vcGVub2ZmaWNlLm9yZy8yMDA0L29mZmljZVwiLFxuXHRcdFx0J3htbG5zOm9vb3cnOiAgICAgICAgIFwiaHR0cDovL29wZW5vZmZpY2Uub3JnLzIwMDQvd3JpdGVyXCIsXG5cdFx0XHQneG1sbnM6b29vYyc6ICAgICAgICAgXCJodHRwOi8vb3Blbm9mZmljZS5vcmcvMjAwNC9jYWxjXCIsXG5cdFx0XHQneG1sbnM6ZG9tJzogICAgICAgICAgXCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL3htbC1ldmVudHNcIixcblx0XHRcdCd4bWxuczp4Zm9ybXMnOiAgICAgICBcImh0dHA6Ly93d3cudzMub3JnLzIwMDIveGZvcm1zXCIsXG5cdFx0XHQneG1sbnM6eHNkJzogICAgICAgICAgXCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYVwiLFxuXHRcdFx0J3htbG5zOnhzaSc6ICAgICAgICAgIFwiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2VcIixcblx0XHRcdCd4bWxuczpzaGVldCc6ICAgICAgICBcInVybjpvYXNpczpuYW1lczp0YzpvcGVuZG9jdW1lbnQ6c2gzM3RqczoxLjBcIixcblx0XHRcdCd4bWxuczpycHQnOiAgICAgICAgICBcImh0dHA6Ly9vcGVub2ZmaWNlLm9yZy8yMDA1L3JlcG9ydFwiLFxuXHRcdFx0J3htbG5zOm9mJzogICAgICAgICAgIFwidXJuOm9hc2lzOm5hbWVzOnRjOm9wZW5kb2N1bWVudDp4bWxuczpvZjoxLjJcIixcblx0XHRcdCd4bWxuczp4aHRtbCc6ICAgICAgICBcImh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWxcIixcblx0XHRcdCd4bWxuczpncmRkbCc6ICAgICAgICBcImh0dHA6Ly93d3cudzMub3JnLzIwMDMvZy9kYXRhLXZpZXcjXCIsXG5cdFx0XHQneG1sbnM6dGFibGVvb28nOiAgICAgXCJodHRwOi8vb3Blbm9mZmljZS5vcmcvMjAwOS90YWJsZVwiLFxuXHRcdFx0J3htbG5zOmRyYXdvb28nOiAgICAgIFwiaHR0cDovL29wZW5vZmZpY2Uub3JnLzIwMTAvZHJhd1wiLFxuXHRcdFx0J3htbG5zOmNhbGNleHQnOiAgICAgIFwidXJuOm9yZzpkb2N1bWVudGZvdW5kYXRpb246bmFtZXM6ZXhwZXJpbWVudGFsOmNhbGM6eG1sbnM6Y2FsY2V4dDoxLjBcIixcblx0XHRcdCd4bWxuczpsb2V4dCc6ICAgICAgICBcInVybjpvcmc6ZG9jdW1lbnRmb3VuZGF0aW9uOm5hbWVzOmV4cGVyaW1lbnRhbDpvZmZpY2U6eG1sbnM6bG9leHQ6MS4wXCIsXG5cdFx0XHQneG1sbnM6ZmllbGQnOiAgICAgICAgXCJ1cm46b3Blbm9mZmljZTpuYW1lczpleHBlcmltZW50YWw6b29vLW1zLWludGVyb3A6eG1sbnM6ZmllbGQ6MS4wXCIsXG5cdFx0XHQneG1sbnM6Zm9ybXgnOiAgICAgICAgXCJ1cm46b3Blbm9mZmljZTpuYW1lczpleHBlcmltZW50YWw6b294bWwtb2RmLWludGVyb3A6eG1sbnM6Zm9ybToxLjBcIixcblx0XHRcdCd4bWxuczpjc3MzdCc6ICAgICAgICBcImh0dHA6Ly93d3cudzMub3JnL1RSL2NzczMtdGV4dC9cIixcblx0XHRcdCdvZmZpY2U6dmVyc2lvbic6ICAgICBcIjEuMlwiXG5cdFx0fSk7XG5cblx0XHR2YXIgZm9kcyA9IHd4dF9oZWxwZXIoe1xuXHRcdFx0J3htbG5zOmNvbmZpZyc6ICAgIFwidXJuOm9hc2lzOm5hbWVzOnRjOm9wZW5kb2N1bWVudDp4bWxuczpjb25maWc6MS4wXCIsXG5cdFx0XHQnb2ZmaWNlOm1pbWV0eXBlJzogXCJhcHBsaWNhdGlvbi92bmQub2FzaXMub3BlbmRvY3VtZW50LnNwcmVhZHNoZWV0XCJcblx0XHR9KTtcblxuXHRcdGlmKG9wdHMuYm9va1R5cGUgPT0gXCJmb2RzXCIpIG8ucHVzaCgnPG9mZmljZTpkb2N1bWVudCcgKyBhdHRyICsgZm9kcyArICc+XFxuJyk7XG5cdFx0ZWxzZSBvLnB1c2goJzxvZmZpY2U6ZG9jdW1lbnQtY29udGVudCcgKyBhdHRyICArICc+XFxuJyk7XG5cdFx0d3JpdGVfYXV0b21hdGljX3N0eWxlc19vZHMobyk7XG5cdFx0by5wdXNoKCcgIDxvZmZpY2U6Ym9keT5cXG4nKTtcblx0XHRvLnB1c2goJyAgICA8b2ZmaWNlOnNwcmVhZHNoZWV0PlxcbicpO1xuXHRcdGZvcih2YXIgaSA9IDA7IGkgIT0gd2IuU2hlZXROYW1lcy5sZW5ndGg7ICsraSkgby5wdXNoKHdyaXRlX3dzKHdiLlNoZWV0c1t3Yi5TaGVldE5hbWVzW2ldXSwgd2IsIGksIG9wdHMpKTtcblx0XHRvLnB1c2goJyAgICA8L29mZmljZTpzcHJlYWRzaGVldD5cXG4nKTtcblx0XHRvLnB1c2goJyAgPC9vZmZpY2U6Ym9keT5cXG4nKTtcblx0XHRpZihvcHRzLmJvb2tUeXBlID09IFwiZm9kc1wiKSBvLnB1c2goJzwvb2ZmaWNlOmRvY3VtZW50PicpO1xuXHRcdGVsc2Ugby5wdXNoKCc8L29mZmljZTpkb2N1bWVudC1jb250ZW50PicpO1xuXHRcdHJldHVybiBvLmpvaW4oXCJcIik7XG5cdH07XG59KSgpO1xuXG5mdW5jdGlvbiB3cml0ZV9vZHMod2IsIG9wdHMpIHtcblx0aWYob3B0cy5ib29rVHlwZSA9PSBcImZvZHNcIikgcmV0dXJuIHdyaXRlX2NvbnRlbnRfb2RzKHdiLCBvcHRzKTtcblxudmFyIHppcCA9IHppcF9uZXcoKTtcblx0dmFyIGYgPSBcIlwiO1xuXG5cdHZhciBtYW5pZmVzdCA9IFtdO1xuXHR2YXIgcmRmID0gW107XG5cblx0LyogUGFydCAzIFNlY3Rpb24gMy4zIE1JTUUgTWVkaWEgVHlwZSAqL1xuXHRmID0gXCJtaW1ldHlwZVwiO1xuXHR6aXBfYWRkX2ZpbGUoemlwLCBmLCBcImFwcGxpY2F0aW9uL3ZuZC5vYXNpcy5vcGVuZG9jdW1lbnQuc3ByZWFkc2hlZXRcIik7XG5cblx0LyogUGFydCAxIFNlY3Rpb24gMi4yIERvY3VtZW50cyAqL1xuXHRmID0gXCJjb250ZW50LnhtbFwiO1xuXHR6aXBfYWRkX2ZpbGUoemlwLCBmLCB3cml0ZV9jb250ZW50X29kcyh3Yiwgb3B0cykpO1xuXHRtYW5pZmVzdC5wdXNoKFtmLCBcInRleHQveG1sXCJdKTtcblx0cmRmLnB1c2goW2YsIFwiQ29udGVudEZpbGVcIl0pO1xuXG5cdC8qIFRPRE86IHRoZXNlIGFyZSBoYXJkLWNvZGVkIHN0eWxlcyB0byBzYXRpYXRlIGV4Y2VsICovXG5cdGYgPSBcInN0eWxlcy54bWxcIjtcblx0emlwX2FkZF9maWxlKHppcCwgZiwgd3JpdGVfc3R5bGVzX29kcyh3Yiwgb3B0cykpO1xuXHRtYW5pZmVzdC5wdXNoKFtmLCBcInRleHQveG1sXCJdKTtcblx0cmRmLnB1c2goW2YsIFwiU3R5bGVzRmlsZVwiXSk7XG5cblx0LyogVE9ETzogdGhpcyBpcyBoYXJkLWNvZGVkIHRvIHNhdGlhdGUgZXhjZWwgKi9cblx0ZiA9IFwibWV0YS54bWxcIjtcblx0emlwX2FkZF9maWxlKHppcCwgZiwgd3JpdGVfbWV0YV9vZHMoKSk7XG5cdG1hbmlmZXN0LnB1c2goW2YsIFwidGV4dC94bWxcIl0pO1xuXHRyZGYucHVzaChbZiwgXCJNZXRhZGF0YUZpbGVcIl0pO1xuXG5cdC8qIFBhcnQgMyBTZWN0aW9uIDYgTWV0YWRhdGEgTWFuaWZlc3QgRmlsZSAqL1xuXHRmID0gXCJtYW5pZmVzdC5yZGZcIjtcblx0emlwX2FkZF9maWxlKHppcCwgZiwgd3JpdGVfcmRmKHJkZi8qLCBvcHRzKi8pKTtcblx0bWFuaWZlc3QucHVzaChbZiwgXCJhcHBsaWNhdGlvbi9yZGYreG1sXCJdKTtcblxuXHQvKiBQYXJ0IDMgU2VjdGlvbiA0IE1hbmlmZXN0IEZpbGUgKi9cblx0ZiA9IFwiTUVUQS1JTkYvbWFuaWZlc3QueG1sXCI7XG5cdHppcF9hZGRfZmlsZSh6aXAsIGYsIHdyaXRlX21hbmlmZXN0KG1hbmlmZXN0LyosIG9wdHMqLykpO1xuXG5cdHJldHVybiB6aXA7XG59XG5cbmZ1bmN0aW9uIHdyaXRlX3NoZWV0X2luZGV4KHdiLCBzaGVldCkge1xuXHRpZighc2hlZXQpIHJldHVybiAwO1xuXHR2YXIgaWR4ID0gd2IuU2hlZXROYW1lcy5pbmRleE9mKHNoZWV0KTtcblx0aWYoaWR4ID09IC0xKSB0aHJvdyBuZXcgRXJyb3IoXCJTaGVldCBub3QgZm91bmQ6IFwiICsgc2hlZXQpO1xuXHRyZXR1cm4gaWR4O1xufVxuXG5mdW5jdGlvbiB3cml0ZV9vYmpfc3RyKGZhY3RvcnkpIHtcblx0cmV0dXJuIGZ1bmN0aW9uIHdyaXRlX3N0cih3Yiwgbykge1xuXHRcdHZhciBpZHggPSB3cml0ZV9zaGVldF9pbmRleCh3Yiwgby5zaGVldCk7XG5cdFx0cmV0dXJuIGZhY3RvcnkuZnJvbV9zaGVldCh3Yi5TaGVldHNbd2IuU2hlZXROYW1lc1tpZHhdXSwgbywgd2IpO1xuXHR9O1xufVxuXG52YXIgd3JpdGVfaHRtX3N0ciA9IHdyaXRlX29ial9zdHIoSFRNTF8pO1xudmFyIHdyaXRlX2Nzdl9zdHIgPSB3cml0ZV9vYmpfc3RyKHtmcm9tX3NoZWV0OnNoZWV0X3RvX2Nzdn0pO1xudmFyIHdyaXRlX3Nsa19zdHIgPSB3cml0ZV9vYmpfc3RyKHR5cGVvZiBTWUxLICE9PSBcInVuZGVmaW5lZFwiID8gU1lMSyA6IHt9KTtcbnZhciB3cml0ZV9kaWZfc3RyID0gd3JpdGVfb2JqX3N0cih0eXBlb2YgRElGICE9PSBcInVuZGVmaW5lZFwiID8gRElGIDoge30pO1xudmFyIHdyaXRlX3Bybl9zdHIgPSB3cml0ZV9vYmpfc3RyKHR5cGVvZiBQUk4gIT09IFwidW5kZWZpbmVkXCIgPyBQUk4gOiB7fSk7XG52YXIgd3JpdGVfcnRmX3N0ciA9IHdyaXRlX29ial9zdHIodHlwZW9mIFJURiAhPT0gXCJ1bmRlZmluZWRcIiA/IFJURiA6IHt9KTtcbnZhciB3cml0ZV90eHRfc3RyID0gd3JpdGVfb2JqX3N0cih7ZnJvbV9zaGVldDpzaGVldF90b190eHR9KTtcbnZhciB3cml0ZV9kYmZfYnVmID0gd3JpdGVfb2JqX3N0cih0eXBlb2YgREJGICE9PSBcInVuZGVmaW5lZFwiID8gREJGIDoge30pO1xudmFyIHdyaXRlX2V0aF9zdHIgPSB3cml0ZV9vYmpfc3RyKHR5cGVvZiBFVEggIT09IFwidW5kZWZpbmVkXCIgPyBFVEggOiB7fSk7XG5cbmZ1bmN0aW9uIGZpeF9vcHRzX2Z1bmMoZGVmYXVsdHMpIHtcblx0cmV0dXJuIGZ1bmN0aW9uIGZpeF9vcHRzKG9wdHMpIHtcblx0XHRmb3IodmFyIGkgPSAwOyBpICE9IGRlZmF1bHRzLmxlbmd0aDsgKytpKSB7XG5cdFx0XHR2YXIgZCA9IGRlZmF1bHRzW2ldO1xuXHRcdFx0aWYob3B0c1tkWzBdXSA9PT0gdW5kZWZpbmVkKSBvcHRzW2RbMF1dID0gZFsxXTtcblx0XHRcdGlmKGRbMl0gPT09ICduJykgb3B0c1tkWzBdXSA9IE51bWJlcihvcHRzW2RbMF1dKTtcblx0XHR9XG5cdH07XG59XG5cbnZhciBmaXhfcmVhZF9vcHRzID0gZnVuY3Rpb24ob3B0cykge1xuZml4X29wdHNfZnVuYyhbXG5cdFsnY2VsbE5GJywgZmFsc2VdLCAvKiBlbWl0IGNlbGwgbnVtYmVyIGZvcm1hdCBzdHJpbmcgYXMgLnogKi9cblx0WydjZWxsSFRNTCcsIHRydWVdLCAvKiBlbWl0IGh0bWwgc3RyaW5nIGFzIC5oICovXG5cdFsnY2VsbEZvcm11bGEnLCB0cnVlXSwgLyogZW1pdCBmb3JtdWxhZSBhcyAuZiAqL1xuXHRbJ2NlbGxTdHlsZXMnLCBmYWxzZV0sIC8qIGVtaXRzIHN0eWxlL3RoZW1lIGFzIC5zICovXG5cdFsnY2VsbFRleHQnLCB0cnVlXSwgLyogZW1pdCBmb3JtYXR0ZWQgdGV4dCBhcyAudyAqL1xuXHRbJ2NlbGxEYXRlcycsIGZhbHNlXSwgLyogZW1pdCBkYXRlIGNlbGxzIHdpdGggdHlwZSBgZGAgKi9cblxuXHRbJ3NoZWV0U3R1YnMnLCBmYWxzZV0sIC8qIGVtaXQgZW1wdHkgY2VsbHMgKi9cblx0WydzaGVldFJvd3MnLCAwLCAnbiddLCAvKiByZWFkIG4gcm93cyAoMCA9IHJlYWQgYWxsIHJvd3MpICovXG5cblx0Wydib29rRGVwcycsIGZhbHNlXSwgLyogcGFyc2UgY2FsY3VsYXRpb24gY2hhaW5zICovXG5cdFsnYm9va1NoZWV0cycsIGZhbHNlXSwgLyogb25seSB0cnkgdG8gZ2V0IHNoZWV0IG5hbWVzIChubyBTaGVldHMpICovXG5cdFsnYm9va1Byb3BzJywgZmFsc2VdLCAvKiBvbmx5IHRyeSB0byBnZXQgcHJvcGVydGllcyAobm8gU2hlZXRzKSAqL1xuXHRbJ2Jvb2tGaWxlcycsIGZhbHNlXSwgLyogaW5jbHVkZSByYXcgZmlsZSBzdHJ1Y3R1cmUgKGtleXMsIGZpbGVzLCBjZmIpICovXG5cdFsnYm9va1ZCQScsIGZhbHNlXSwgLyogaW5jbHVkZSB2YmEgcmF3IGRhdGEgKHZiYXJhdykgKi9cblxuXHRbJ3Bhc3N3b3JkJywnJ10sIC8qIHBhc3N3b3JkICovXG5cdFsnV1RGJywgZmFsc2VdIC8qIFdURiBtb2RlICh0aHJvd3MgZXJyb3JzKSAqL1xuXSkob3B0cyk7XG59O1xuXG52YXIgZml4X3dyaXRlX29wdHMgPSBmaXhfb3B0c19mdW5jKFtcblx0WydjZWxsRGF0ZXMnLCBmYWxzZV0sIC8qIHdyaXRlIGRhdGUgY2VsbHMgd2l0aCB0eXBlIGBkYCAqL1xuXG5cdFsnYm9va1NTVCcsIGZhbHNlXSwgLyogR2VuZXJhdGUgU2hhcmVkIFN0cmluZyBUYWJsZSAqL1xuXG5cdFsnYm9va1R5cGUnLCAneGxzeCddLCAvKiBUeXBlIG9mIHdvcmtib29rICh4bHN4L20vYikgKi9cblxuXHRbJ2NvbXByZXNzaW9uJywgZmFsc2VdLCAvKiBVc2UgZmlsZSBjb21wcmVzc2lvbiAqL1xuXG5cdFsnV1RGJywgZmFsc2VdIC8qIFdURiBtb2RlICh0aHJvd3MgZXJyb3JzKSAqL1xuXSk7XG5mdW5jdGlvbiBnZXRfc2hlZXRfdHlwZShuKSB7XG5cdGlmKFJFTFMuV1MuaW5kZXhPZihuKSA+IC0xKSByZXR1cm4gXCJzaGVldFwiO1xuXHRpZihSRUxTLkNTICYmIG4gPT0gUkVMUy5DUykgcmV0dXJuIFwiY2hhcnRcIjtcblx0aWYoUkVMUy5EUyAmJiBuID09IFJFTFMuRFMpIHJldHVybiBcImRpYWxvZ1wiO1xuXHRpZihSRUxTLk1TICYmIG4gPT0gUkVMUy5NUykgcmV0dXJuIFwibWFjcm9cIjtcblx0cmV0dXJuIChuICYmIG4ubGVuZ3RoKSA/IG4gOiBcInNoZWV0XCI7XG59XG5mdW5jdGlvbiBzYWZlX3BhcnNlX3dicmVscyh3YnJlbHMsIHNoZWV0cykge1xuXHRpZighd2JyZWxzKSByZXR1cm4gMDtcblx0dHJ5IHtcblx0XHR3YnJlbHMgPSBzaGVldHMubWFwKGZ1bmN0aW9uIHB3YnIodykgeyBpZighdy5pZCkgdy5pZCA9IHcuc3RyUmVsSUQ7IHJldHVybiBbdy5uYW1lLCB3YnJlbHNbJyFpZCddW3cuaWRdLlRhcmdldCwgZ2V0X3NoZWV0X3R5cGUod2JyZWxzWychaWQnXVt3LmlkXS5UeXBlKV07IH0pO1xuXHR9IGNhdGNoKGUpIHsgcmV0dXJuIG51bGw7IH1cblx0cmV0dXJuICF3YnJlbHMgfHwgd2JyZWxzLmxlbmd0aCA9PT0gMCA/IG51bGwgOiB3YnJlbHM7XG59XG5cbmZ1bmN0aW9uIHNhZmVfcGFyc2Vfc2hlZXQoemlwLCBwYXRoLCByZWxzUGF0aCwgc2hlZXQsIGlkeCwgc2hlZXRSZWxzLCBzaGVldHMsIHN0eXBlLCBvcHRzLCB3YiwgdGhlbWVzLCBzdHlsZXMpIHtcblx0dHJ5IHtcblx0XHRzaGVldFJlbHNbc2hlZXRdPXBhcnNlX3JlbHMoZ2V0emlwc3RyKHppcCwgcmVsc1BhdGgsIHRydWUpLCBwYXRoKTtcblx0XHR2YXIgZGF0YSA9IGdldHppcGRhdGEoemlwLCBwYXRoKTtcblx0XHR2YXIgX3dzO1xuXHRcdHN3aXRjaChzdHlwZSkge1xuXHRcdFx0Y2FzZSAnc2hlZXQnOiAgX3dzID0gcGFyc2Vfd3MoZGF0YSwgcGF0aCwgaWR4LCBvcHRzLCBzaGVldFJlbHNbc2hlZXRdLCB3YiwgdGhlbWVzLCBzdHlsZXMpOyBicmVhaztcblx0XHRcdGNhc2UgJ2NoYXJ0JzogIF93cyA9IHBhcnNlX2NzKGRhdGEsIHBhdGgsIGlkeCwgb3B0cywgc2hlZXRSZWxzW3NoZWV0XSwgd2IsIHRoZW1lcywgc3R5bGVzKTtcblx0XHRcdFx0aWYoIV93cyB8fCAhX3dzWychZHJhd2VsJ10pIGJyZWFrO1xuXHRcdFx0XHR2YXIgZGZpbGUgPSByZXNvbHZlX3BhdGgoX3dzWychZHJhd2VsJ10uVGFyZ2V0LCBwYXRoKTtcblx0XHRcdFx0dmFyIGRyZWxzcCA9IGdldF9yZWxzX3BhdGgoZGZpbGUpO1xuXHRcdFx0XHR2YXIgZHJhdyA9IHBhcnNlX2RyYXdpbmcoZ2V0emlwc3RyKHppcCwgZGZpbGUsIHRydWUpLCBwYXJzZV9yZWxzKGdldHppcHN0cih6aXAsIGRyZWxzcCwgdHJ1ZSksIGRmaWxlKSk7XG5cdFx0XHRcdHZhciBjaGFydHAgPSByZXNvbHZlX3BhdGgoZHJhdywgZGZpbGUpO1xuXHRcdFx0XHR2YXIgY3JlbHNwID0gZ2V0X3JlbHNfcGF0aChjaGFydHApO1xuXHRcdFx0XHRfd3MgPSBwYXJzZV9jaGFydChnZXR6aXBzdHIoemlwLCBjaGFydHAsIHRydWUpLCBjaGFydHAsIG9wdHMsIHBhcnNlX3JlbHMoZ2V0emlwc3RyKHppcCwgY3JlbHNwLCB0cnVlKSwgY2hhcnRwKSwgd2IsIF93cyk7XG5cdFx0XHRcdGJyZWFrO1xuXHRcdFx0Y2FzZSAnbWFjcm8nOiAgX3dzID0gcGFyc2VfbXMoZGF0YSwgcGF0aCwgaWR4LCBvcHRzLCBzaGVldFJlbHNbc2hlZXRdLCB3YiwgdGhlbWVzLCBzdHlsZXMpOyBicmVhaztcblx0XHRcdGNhc2UgJ2RpYWxvZyc6IF93cyA9IHBhcnNlX2RzKGRhdGEsIHBhdGgsIGlkeCwgb3B0cywgc2hlZXRSZWxzW3NoZWV0XSwgd2IsIHRoZW1lcywgc3R5bGVzKTsgYnJlYWs7XG5cdFx0XHRkZWZhdWx0OiB0aHJvdyBuZXcgRXJyb3IoXCJVbnJlY29nbml6ZWQgc2hlZXQgdHlwZSBcIiArIHN0eXBlKTtcblx0XHR9XG5cdFx0c2hlZXRzW3NoZWV0XSA9IF93cztcblxuXHRcdC8qIHNjYW4gcmVscyBmb3IgY29tbWVudHMgKi9cblx0XHR2YXIgY29tbWVudHMgPSBbXTtcblx0XHRpZihzaGVldFJlbHMgJiYgc2hlZXRSZWxzW3NoZWV0XSkga2V5cyhzaGVldFJlbHNbc2hlZXRdKS5mb3JFYWNoKGZ1bmN0aW9uKG4pIHtcblx0XHRcdGlmKHNoZWV0UmVsc1tzaGVldF1bbl0uVHlwZSA9PSBSRUxTLkNNTlQpIHtcblx0XHRcdFx0dmFyIGRmaWxlID0gcmVzb2x2ZV9wYXRoKHNoZWV0UmVsc1tzaGVldF1bbl0uVGFyZ2V0LCBwYXRoKTtcblx0XHRcdFx0Y29tbWVudHMgPSBwYXJzZV9jbW50KGdldHppcGRhdGEoemlwLCBkZmlsZSwgdHJ1ZSksIGRmaWxlLCBvcHRzKTtcblx0XHRcdFx0aWYoIWNvbW1lbnRzIHx8ICFjb21tZW50cy5sZW5ndGgpIHJldHVybjtcblx0XHRcdFx0c2hlZXRfaW5zZXJ0X2NvbW1lbnRzKF93cywgY29tbWVudHMpO1xuXHRcdFx0fVxuXHRcdH0pO1xuXHR9IGNhdGNoKGUpIHsgaWYob3B0cy5XVEYpIHRocm93IGU7IH1cbn1cblxuZnVuY3Rpb24gc3RyaXBfZnJvbnRfc2xhc2goeCkgeyByZXR1cm4geC5jaGFyQXQoMCkgPT0gJy8nID8geC5zbGljZSgxKSA6IHg7IH1cblxuZnVuY3Rpb24gcGFyc2VfemlwKHppcCwgb3B0cykge1xuXHRtYWtlX3NzZihTU0YpO1xuXHRvcHRzID0gb3B0cyB8fCB7fTtcblx0Zml4X3JlYWRfb3B0cyhvcHRzKTtcblxuXHQvKiBPcGVuRG9jdW1lbnQgUGFydCAzIFNlY3Rpb24gMi4yLjEgT3BlbkRvY3VtZW50IFBhY2thZ2UgKi9cblx0aWYoc2FmZWdldHppcGZpbGUoemlwLCAnTUVUQS1JTkYvbWFuaWZlc3QueG1sJykpIHJldHVybiBwYXJzZV9vZHMoemlwLCBvcHRzKTtcblx0LyogVU9DICovXG5cdGlmKHNhZmVnZXR6aXBmaWxlKHppcCwgJ29iamVjdGRhdGEueG1sJykpIHJldHVybiBwYXJzZV9vZHMoemlwLCBvcHRzKTtcblx0LyogTnVtYmVycyAqL1xuXHRpZihzYWZlZ2V0emlwZmlsZSh6aXAsICdJbmRleC9Eb2N1bWVudC5pd2EnKSkgdGhyb3cgbmV3IEVycm9yKCdVbnN1cHBvcnRlZCBOVU1CRVJTIGZpbGUnKTtcblxuXHR2YXIgZW50cmllcyA9IHppcGVudHJpZXMoemlwKTtcblx0dmFyIGRpciA9IHBhcnNlX2N0KChnZXR6aXBzdHIoemlwLCAnW0NvbnRlbnRfVHlwZXNdLnhtbCcpKSk7XG5cdHZhciB4bHNiID0gZmFsc2U7XG5cdHZhciBzaGVldHMsIGJpbm5hbWU7XG5cdGlmKGRpci53b3JrYm9va3MubGVuZ3RoID09PSAwKSB7XG5cdFx0YmlubmFtZSA9IFwieGwvd29ya2Jvb2sueG1sXCI7XG5cdFx0aWYoZ2V0emlwZGF0YSh6aXAsYmlubmFtZSwgdHJ1ZSkpIGRpci53b3JrYm9va3MucHVzaChiaW5uYW1lKTtcblx0fVxuXHRpZihkaXIud29ya2Jvb2tzLmxlbmd0aCA9PT0gMCkge1xuXHRcdGJpbm5hbWUgPSBcInhsL3dvcmtib29rLmJpblwiO1xuXHRcdGlmKCFnZXR6aXBkYXRhKHppcCxiaW5uYW1lLHRydWUpKSB0aHJvdyBuZXcgRXJyb3IoXCJDb3VsZCBub3QgZmluZCB3b3JrYm9va1wiKTtcblx0XHRkaXIud29ya2Jvb2tzLnB1c2goYmlubmFtZSk7XG5cdFx0eGxzYiA9IHRydWU7XG5cdH1cblx0aWYoZGlyLndvcmtib29rc1swXS5zbGljZSgtMykgPT0gXCJiaW5cIikgeGxzYiA9IHRydWU7XG5cblx0dmFyIHRoZW1lcyA9ICh7fSk7XG5cdHZhciBzdHlsZXMgPSAoe30pO1xuXHRpZighb3B0cy5ib29rU2hlZXRzICYmICFvcHRzLmJvb2tQcm9wcykge1xuXHRcdHN0cnMgPSBbXTtcblx0XHRpZihkaXIuc3N0KSB0cnkgeyBzdHJzPXBhcnNlX3NzdChnZXR6aXBkYXRhKHppcCwgc3RyaXBfZnJvbnRfc2xhc2goZGlyLnNzdCkpLCBkaXIuc3N0LCBvcHRzKTsgfSBjYXRjaChlKSB7IGlmKG9wdHMuV1RGKSB0aHJvdyBlOyB9XG5cblx0XHRpZihvcHRzLmNlbGxTdHlsZXMgJiYgZGlyLnRoZW1lcy5sZW5ndGgpIHRoZW1lcyA9IHBhcnNlX3RoZW1lKGdldHppcHN0cih6aXAsIGRpci50aGVtZXNbMF0ucmVwbGFjZSgvXlxcLy8sJycpLCB0cnVlKXx8XCJcIixkaXIudGhlbWVzWzBdLCBvcHRzKTtcblxuXHRcdGlmKGRpci5zdHlsZSkgc3R5bGVzID0gcGFyc2Vfc3R5KGdldHppcGRhdGEoemlwLCBzdHJpcF9mcm9udF9zbGFzaChkaXIuc3R5bGUpKSwgZGlyLnN0eWxlLCB0aGVtZXMsIG9wdHMpO1xuXHR9XG5cblx0Lyp2YXIgZXh0ZXJuYm9va3MgPSAqL2Rpci5saW5rcy5tYXAoZnVuY3Rpb24obGluaykge1xuXHRcdHRyeSB7XG5cdFx0XHR2YXIgcmVscyA9IHBhcnNlX3JlbHMoZ2V0emlwc3RyKHppcCwgZ2V0X3JlbHNfcGF0aChzdHJpcF9mcm9udF9zbGFzaChsaW5rKSkpLCBsaW5rKTtcblx0XHRcdHJldHVybiBwYXJzZV94bGluayhnZXR6aXBkYXRhKHppcCwgc3RyaXBfZnJvbnRfc2xhc2gobGluaykpLCByZWxzLCBsaW5rLCBvcHRzKTtcblx0XHR9IGNhdGNoKGUpIHt9XG5cdH0pO1xuXG5cdHZhciB3YiA9IHBhcnNlX3diKGdldHppcGRhdGEoemlwLCBzdHJpcF9mcm9udF9zbGFzaChkaXIud29ya2Jvb2tzWzBdKSksIGRpci53b3JrYm9va3NbMF0sIG9wdHMpO1xuXG5cdHZhciBwcm9wcyA9IHt9LCBwcm9wZGF0YSA9IFwiXCI7XG5cblx0aWYoZGlyLmNvcmVwcm9wcy5sZW5ndGgpIHtcblx0XHRwcm9wZGF0YSA9IGdldHppcGRhdGEoemlwLCBzdHJpcF9mcm9udF9zbGFzaChkaXIuY29yZXByb3BzWzBdKSwgdHJ1ZSk7XG5cdFx0aWYocHJvcGRhdGEpIHByb3BzID0gcGFyc2VfY29yZV9wcm9wcyhwcm9wZGF0YSk7XG5cdFx0aWYoZGlyLmV4dHByb3BzLmxlbmd0aCAhPT0gMCkge1xuXHRcdFx0cHJvcGRhdGEgPSBnZXR6aXBkYXRhKHppcCwgc3RyaXBfZnJvbnRfc2xhc2goZGlyLmV4dHByb3BzWzBdKSwgdHJ1ZSk7XG5cdFx0XHRpZihwcm9wZGF0YSkgcGFyc2VfZXh0X3Byb3BzKHByb3BkYXRhLCBwcm9wcywgb3B0cyk7XG5cdFx0fVxuXHR9XG5cblx0dmFyIGN1c3Rwcm9wcyA9IHt9O1xuXHRpZighb3B0cy5ib29rU2hlZXRzIHx8IG9wdHMuYm9va1Byb3BzKSB7XG5cdFx0aWYgKGRpci5jdXN0cHJvcHMubGVuZ3RoICE9PSAwKSB7XG5cdFx0XHRwcm9wZGF0YSA9IGdldHppcHN0cih6aXAsIHN0cmlwX2Zyb250X3NsYXNoKGRpci5jdXN0cHJvcHNbMF0pLCB0cnVlKTtcblx0XHRcdGlmKHByb3BkYXRhKSBjdXN0cHJvcHMgPSBwYXJzZV9jdXN0X3Byb3BzKHByb3BkYXRhLCBvcHRzKTtcblx0XHR9XG5cdH1cblxuXHR2YXIgb3V0ID0gKHt9KTtcblx0aWYob3B0cy5ib29rU2hlZXRzIHx8IG9wdHMuYm9va1Byb3BzKSB7XG5cdFx0aWYod2IuU2hlZXRzKSBzaGVldHMgPSB3Yi5TaGVldHMubWFwKGZ1bmN0aW9uIHBsdWNrKHgpeyByZXR1cm4geC5uYW1lOyB9KTtcblx0XHRlbHNlIGlmKHByb3BzLldvcmtzaGVldHMgJiYgcHJvcHMuU2hlZXROYW1lcy5sZW5ndGggPiAwKSBzaGVldHM9cHJvcHMuU2hlZXROYW1lcztcblx0XHRpZihvcHRzLmJvb2tQcm9wcykgeyBvdXQuUHJvcHMgPSBwcm9wczsgb3V0LkN1c3Rwcm9wcyA9IGN1c3Rwcm9wczsgfVxuXHRcdGlmKG9wdHMuYm9va1NoZWV0cyAmJiB0eXBlb2Ygc2hlZXRzICE9PSAndW5kZWZpbmVkJykgb3V0LlNoZWV0TmFtZXMgPSBzaGVldHM7XG5cdFx0aWYob3B0cy5ib29rU2hlZXRzID8gb3V0LlNoZWV0TmFtZXMgOiBvcHRzLmJvb2tQcm9wcykgcmV0dXJuIG91dDtcblx0fVxuXHRzaGVldHMgPSB7fTtcblxuXHR2YXIgZGVwcyA9IHt9O1xuXHRpZihvcHRzLmJvb2tEZXBzICYmIGRpci5jYWxjY2hhaW4pIGRlcHM9cGFyc2VfY2MoZ2V0emlwZGF0YSh6aXAsIHN0cmlwX2Zyb250X3NsYXNoKGRpci5jYWxjY2hhaW4pKSxkaXIuY2FsY2NoYWluLG9wdHMpO1xuXG5cdHZhciBpPTA7XG5cdHZhciBzaGVldFJlbHMgPSAoe30pO1xuXHR2YXIgcGF0aCwgcmVsc1BhdGg7XG5cblx0e1xuXHRcdHZhciB3YnNoZWV0cyA9IHdiLlNoZWV0cztcblx0XHRwcm9wcy5Xb3Jrc2hlZXRzID0gd2JzaGVldHMubGVuZ3RoO1xuXHRcdHByb3BzLlNoZWV0TmFtZXMgPSBbXTtcblx0XHRmb3IodmFyIGogPSAwOyBqICE9IHdic2hlZXRzLmxlbmd0aDsgKytqKSB7XG5cdFx0XHRwcm9wcy5TaGVldE5hbWVzW2pdID0gd2JzaGVldHNbal0ubmFtZTtcblx0XHR9XG5cdH1cblxuXHR2YXIgd2JleHQgPSB4bHNiID8gXCJiaW5cIiA6IFwieG1sXCI7XG5cdHZhciB3YnJlbHNpID0gZGlyLndvcmtib29rc1swXS5sYXN0SW5kZXhPZihcIi9cIik7XG5cdHZhciB3YnJlbHNmaWxlID0gKGRpci53b3JrYm9va3NbMF0uc2xpY2UoMCwgd2JyZWxzaSsxKSArIFwiX3JlbHMvXCIgKyBkaXIud29ya2Jvb2tzWzBdLnNsaWNlKHdicmVsc2krMSkgKyBcIi5yZWxzXCIpLnJlcGxhY2UoL15cXC8vLFwiXCIpO1xuXHRpZighc2FmZWdldHppcGZpbGUoemlwLCB3YnJlbHNmaWxlKSkgd2JyZWxzZmlsZSA9ICd4bC9fcmVscy93b3JrYm9vay4nICsgd2JleHQgKyAnLnJlbHMnO1xuXHR2YXIgd2JyZWxzID0gcGFyc2VfcmVscyhnZXR6aXBzdHIoemlwLCB3YnJlbHNmaWxlLCB0cnVlKSwgd2JyZWxzZmlsZSk7XG5cdGlmKHdicmVscykgd2JyZWxzID0gc2FmZV9wYXJzZV93YnJlbHMod2JyZWxzLCB3Yi5TaGVldHMpO1xuXG5cdC8qIE51bWJlcnMgaU9TIGhhY2sgKi9cblx0dmFyIG5tb2RlID0gKGdldHppcGRhdGEoemlwLFwieGwvd29ya3NoZWV0cy9zaGVldC54bWxcIix0cnVlKSk/MTowO1xuXHR3c2xvb3A6IGZvcihpID0gMDsgaSAhPSBwcm9wcy5Xb3Jrc2hlZXRzOyArK2kpIHtcblx0XHR2YXIgc3R5cGUgPSBcInNoZWV0XCI7XG5cdFx0aWYod2JyZWxzICYmIHdicmVsc1tpXSkge1xuXHRcdFx0cGF0aCA9ICd4bC8nICsgKHdicmVsc1tpXVsxXSkucmVwbGFjZSgvW1xcL10/eGxcXC8vLCBcIlwiKTtcblx0XHRcdGlmKCFzYWZlZ2V0emlwZmlsZSh6aXAsIHBhdGgpKSBwYXRoID0gd2JyZWxzW2ldWzFdO1xuXHRcdFx0aWYoIXNhZmVnZXR6aXBmaWxlKHppcCwgcGF0aCkpIHBhdGggPSB3YnJlbHNmaWxlLnJlcGxhY2UoL19yZWxzXFwvLiokLyxcIlwiKSArIHdicmVsc1tpXVsxXTtcblx0XHRcdHN0eXBlID0gd2JyZWxzW2ldWzJdO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRwYXRoID0gJ3hsL3dvcmtzaGVldHMvc2hlZXQnKyhpKzEtbm1vZGUpK1wiLlwiICsgd2JleHQ7XG5cdFx0XHRwYXRoID0gcGF0aC5yZXBsYWNlKC9zaGVldDBcXC4vLFwic2hlZXQuXCIpO1xuXHRcdH1cblx0XHRyZWxzUGF0aCA9IHBhdGgucmVwbGFjZSgvXiguKikoXFwvKShbXlxcL10qKSQvLCBcIiQxL19yZWxzLyQzLnJlbHNcIik7XG5cdFx0aWYob3B0cyAmJiBvcHRzLnNoZWV0cyAhPSBudWxsKSBzd2l0Y2godHlwZW9mIG9wdHMuc2hlZXRzKSB7XG5cdFx0XHRjYXNlIFwibnVtYmVyXCI6IGlmKGkgIT0gb3B0cy5zaGVldHMpIGNvbnRpbnVlIHdzbG9vcDsgYnJlYWs7XG5cdFx0XHRjYXNlIFwic3RyaW5nXCI6IGlmKHByb3BzLlNoZWV0TmFtZXNbaV0udG9Mb3dlckNhc2UoKSAhPSBvcHRzLnNoZWV0cy50b0xvd2VyQ2FzZSgpKSBjb250aW51ZSB3c2xvb3A7IGJyZWFrO1xuXHRcdFx0ZGVmYXVsdDogaWYoQXJyYXkuaXNBcnJheSAmJiBBcnJheS5pc0FycmF5KG9wdHMuc2hlZXRzKSkge1xuXHRcdFx0XHR2YXIgc25qc2VlbiA9IGZhbHNlO1xuXHRcdFx0XHRmb3IodmFyIHNuaiA9IDA7IHNuaiAhPSBvcHRzLnNoZWV0cy5sZW5ndGg7ICsrc25qKSB7XG5cdFx0XHRcdFx0aWYodHlwZW9mIG9wdHMuc2hlZXRzW3Nual0gPT0gXCJudW1iZXJcIiAmJiBvcHRzLnNoZWV0c1tzbmpdID09IGkpIHNuanNlZW49MTtcblx0XHRcdFx0XHRpZih0eXBlb2Ygb3B0cy5zaGVldHNbc25qXSA9PSBcInN0cmluZ1wiICYmIG9wdHMuc2hlZXRzW3Nual0udG9Mb3dlckNhc2UoKSA9PSBwcm9wcy5TaGVldE5hbWVzW2ldLnRvTG93ZXJDYXNlKCkpIHNuanNlZW4gPSAxO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGlmKCFzbmpzZWVuKSBjb250aW51ZSB3c2xvb3A7XG5cdFx0XHR9XG5cdFx0fVxuXHRcdHNhZmVfcGFyc2Vfc2hlZXQoemlwLCBwYXRoLCByZWxzUGF0aCwgcHJvcHMuU2hlZXROYW1lc1tpXSwgaSwgc2hlZXRSZWxzLCBzaGVldHMsIHN0eXBlLCBvcHRzLCB3YiwgdGhlbWVzLCBzdHlsZXMpO1xuXHR9XG5cblx0b3V0ID0gKHtcblx0XHREaXJlY3Rvcnk6IGRpcixcblx0XHRXb3JrYm9vazogd2IsXG5cdFx0UHJvcHM6IHByb3BzLFxuXHRcdEN1c3Rwcm9wczogY3VzdHByb3BzLFxuXHRcdERlcHM6IGRlcHMsXG5cdFx0U2hlZXRzOiBzaGVldHMsXG5cdFx0U2hlZXROYW1lczogcHJvcHMuU2hlZXROYW1lcyxcblx0XHRTdHJpbmdzOiBzdHJzLFxuXHRcdFN0eWxlczogc3R5bGVzLFxuXHRcdFRoZW1lczogdGhlbWVzLFxuXHRcdFNTRjogU1NGLmdldF90YWJsZSgpXG5cdH0pO1xuXHRpZihvcHRzICYmIG9wdHMuYm9va0ZpbGVzKSB7XG5cdFx0b3V0LmtleXMgPSBlbnRyaWVzO1xuXHRcdG91dC5maWxlcyA9IHppcC5maWxlcztcblx0fVxuXHRpZihvcHRzICYmIG9wdHMuYm9va1ZCQSkge1xuXHRcdGlmKGRpci52YmEubGVuZ3RoID4gMCkgb3V0LnZiYXJhdyA9IGdldHppcGRhdGEoemlwLHN0cmlwX2Zyb250X3NsYXNoKGRpci52YmFbMF0pLHRydWUpO1xuXHRcdGVsc2UgaWYoZGlyLmRlZmF1bHRzICYmIGRpci5kZWZhdWx0cy5iaW4gPT09IENUX1ZCQSkgb3V0LnZiYXJhdyA9IGdldHppcGRhdGEoemlwLCAneGwvdmJhUHJvamVjdC5iaW4nLHRydWUpO1xuXHR9XG5cdHJldHVybiBvdXQ7XG59XG5cbi8qIFtNUy1PRkZDUllQVE9dIDIuMS4xICovXG5mdW5jdGlvbiBwYXJzZV94bHN4Y2ZiKGNmYiwgX29wdHMpIHtcblx0dmFyIG9wdHMgPSBfb3B0cyB8fCB7fTtcblx0dmFyIGYgPSAnV29ya2Jvb2snLCBkYXRhID0gQ0ZCLmZpbmQoY2ZiLCBmKTtcblx0dHJ5IHtcblx0ZiA9ICcvIURhdGFTcGFjZXMvVmVyc2lvbic7XG5cdGRhdGEgPSBDRkIuZmluZChjZmIsIGYpOyBpZighZGF0YSB8fCAhZGF0YS5jb250ZW50KSB0aHJvdyBuZXcgRXJyb3IoXCJFQ01BLTM3NiBFbmNyeXB0ZWQgZmlsZSBtaXNzaW5nIFwiICsgZik7XG5cdC8qdmFyIHZlcnNpb24gPSAqL3BhcnNlX0RhdGFTcGFjZVZlcnNpb25JbmZvKGRhdGEuY29udGVudCk7XG5cblx0LyogMi4zLjQuMSAqL1xuXHRmID0gJy8hRGF0YVNwYWNlcy9EYXRhU3BhY2VNYXAnO1xuXHRkYXRhID0gQ0ZCLmZpbmQoY2ZiLCBmKTsgaWYoIWRhdGEgfHwgIWRhdGEuY29udGVudCkgdGhyb3cgbmV3IEVycm9yKFwiRUNNQS0zNzYgRW5jcnlwdGVkIGZpbGUgbWlzc2luZyBcIiArIGYpO1xuXHR2YXIgZHNtID0gcGFyc2VfRGF0YVNwYWNlTWFwKGRhdGEuY29udGVudCk7XG5cdGlmKGRzbS5sZW5ndGggIT09IDEgfHwgZHNtWzBdLmNvbXBzLmxlbmd0aCAhPT0gMSB8fCBkc21bMF0uY29tcHNbMF0udCAhPT0gMCB8fCBkc21bMF0ubmFtZSAhPT0gXCJTdHJvbmdFbmNyeXB0aW9uRGF0YVNwYWNlXCIgfHwgZHNtWzBdLmNvbXBzWzBdLnYgIT09IFwiRW5jcnlwdGVkUGFja2FnZVwiKVxuXHRcdHRocm93IG5ldyBFcnJvcihcIkVDTUEtMzc2IEVuY3J5cHRlZCBmaWxlIGJhZCBcIiArIGYpO1xuXG5cdC8qIDIuMy40LjIgKi9cblx0ZiA9ICcvIURhdGFTcGFjZXMvRGF0YVNwYWNlSW5mby9TdHJvbmdFbmNyeXB0aW9uRGF0YVNwYWNlJztcblx0ZGF0YSA9IENGQi5maW5kKGNmYiwgZik7IGlmKCFkYXRhIHx8ICFkYXRhLmNvbnRlbnQpIHRocm93IG5ldyBFcnJvcihcIkVDTUEtMzc2IEVuY3J5cHRlZCBmaWxlIG1pc3NpbmcgXCIgKyBmKTtcblx0dmFyIHNlZHMgPSBwYXJzZV9EYXRhU3BhY2VEZWZpbml0aW9uKGRhdGEuY29udGVudCk7XG5cdGlmKHNlZHMubGVuZ3RoICE9IDEgfHwgc2Vkc1swXSAhPSBcIlN0cm9uZ0VuY3J5cHRpb25UcmFuc2Zvcm1cIilcblx0XHR0aHJvdyBuZXcgRXJyb3IoXCJFQ01BLTM3NiBFbmNyeXB0ZWQgZmlsZSBiYWQgXCIgKyBmKTtcblxuXHQvKiAyLjMuNC4zICovXG5cdGYgPSAnLyFEYXRhU3BhY2VzL1RyYW5zZm9ybUluZm8vU3Ryb25nRW5jcnlwdGlvblRyYW5zZm9ybS8hUHJpbWFyeSc7XG5cdGRhdGEgPSBDRkIuZmluZChjZmIsIGYpOyBpZighZGF0YSB8fCAhZGF0YS5jb250ZW50KSB0aHJvdyBuZXcgRXJyb3IoXCJFQ01BLTM3NiBFbmNyeXB0ZWQgZmlsZSBtaXNzaW5nIFwiICsgZik7XG5cdC8qdmFyIGhkciA9ICovcGFyc2VfUHJpbWFyeShkYXRhLmNvbnRlbnQpO1xuXHR9IGNhdGNoKGUpIHt9XG5cblx0ZiA9ICcvRW5jcnlwdGlvbkluZm8nO1xuXHRkYXRhID0gQ0ZCLmZpbmQoY2ZiLCBmKTsgaWYoIWRhdGEgfHwgIWRhdGEuY29udGVudCkgdGhyb3cgbmV3IEVycm9yKFwiRUNNQS0zNzYgRW5jcnlwdGVkIGZpbGUgbWlzc2luZyBcIiArIGYpO1xuXHR2YXIgZWluZm8gPSBwYXJzZV9FbmNyeXB0aW9uSW5mbyhkYXRhLmNvbnRlbnQpO1xuXG5cdC8qIDIuMy40LjQgKi9cblx0ZiA9ICcvRW5jcnlwdGVkUGFja2FnZSc7XG5cdGRhdGEgPSBDRkIuZmluZChjZmIsIGYpOyBpZighZGF0YSB8fCAhZGF0YS5jb250ZW50KSB0aHJvdyBuZXcgRXJyb3IoXCJFQ01BLTM3NiBFbmNyeXB0ZWQgZmlsZSBtaXNzaW5nIFwiICsgZik7XG5cbi8qZ2xvYmFsIGRlY3J5cHRfYWdpbGUgKi9cbmlmKGVpbmZvWzBdID09IDB4MDQgJiYgdHlwZW9mIGRlY3J5cHRfYWdpbGUgIT09ICd1bmRlZmluZWQnKSByZXR1cm4gZGVjcnlwdF9hZ2lsZShlaW5mb1sxXSwgZGF0YS5jb250ZW50LCBvcHRzLnBhc3N3b3JkIHx8IFwiXCIsIG9wdHMpO1xuLypnbG9iYWwgZGVjcnlwdF9zdGQ3NiAqL1xuaWYoZWluZm9bMF0gPT0gMHgwMiAmJiB0eXBlb2YgZGVjcnlwdF9zdGQ3NiAhPT0gJ3VuZGVmaW5lZCcpIHJldHVybiBkZWNyeXB0X3N0ZDc2KGVpbmZvWzFdLCBkYXRhLmNvbnRlbnQsIG9wdHMucGFzc3dvcmQgfHwgXCJcIiwgb3B0cyk7XG5cdHRocm93IG5ldyBFcnJvcihcIkZpbGUgaXMgcGFzc3dvcmQtcHJvdGVjdGVkXCIpO1xufVxuXG5mdW5jdGlvbiB3cml0ZV96aXAod2IsIG9wdHMpIHtcblx0X3NoYXBlaWQgPSAxMDI0O1xuXHRpZihvcHRzLmJvb2tUeXBlID09IFwib2RzXCIpIHJldHVybiB3cml0ZV9vZHMod2IsIG9wdHMpO1xuXHRpZih3YiAmJiAhd2IuU1NGKSB7XG5cdFx0d2IuU1NGID0gU1NGLmdldF90YWJsZSgpO1xuXHR9XG5cdGlmKHdiICYmIHdiLlNTRikge1xuXHRcdG1ha2Vfc3NmKFNTRik7IFNTRi5sb2FkX3RhYmxlKHdiLlNTRik7XG5cdFx0Ly8gJEZsb3dJZ25vcmVcblx0XHRvcHRzLnJldnNzZiA9IGV2ZXJ0X251bSh3Yi5TU0YpOyBvcHRzLnJldnNzZlt3Yi5TU0ZbNjU1MzVdXSA9IDA7XG5cdFx0b3B0cy5zc2YgPSB3Yi5TU0Y7XG5cdH1cblx0b3B0cy5yZWxzID0ge307IG9wdHMud2JyZWxzID0ge307XG5cdG9wdHMuU3RyaW5ncyA9IFtdOyBvcHRzLlN0cmluZ3MuQ291bnQgPSAwOyBvcHRzLlN0cmluZ3MuVW5pcXVlID0gMDtcblx0aWYoYnJvd3Nlcl9oYXNfTWFwKSBvcHRzLnJldlN0cmluZ3MgPSBuZXcgTWFwKCk7XG5cdGVsc2UgeyBvcHRzLnJldlN0cmluZ3MgPSB7fTsgb3B0cy5yZXZTdHJpbmdzLmZvbyA9IFtdOyBkZWxldGUgb3B0cy5yZXZTdHJpbmdzLmZvbzsgfVxuXHR2YXIgd2JleHQgPSBvcHRzLmJvb2tUeXBlID09IFwieGxzYlwiID8gXCJiaW5cIiA6IFwieG1sXCI7XG5cdHZhciB2YmFmbXQgPSBWQkFGTVRTLmluZGV4T2Yob3B0cy5ib29rVHlwZSkgPiAtMTtcblx0dmFyIGN0ID0gbmV3X2N0KCk7XG5cdGZpeF93cml0ZV9vcHRzKG9wdHMgPSBvcHRzIHx8IHt9KTtcbnZhciB6aXAgPSB6aXBfbmV3KCk7XG5cdHZhciBmID0gXCJcIiwgcklkID0gMDtcblxuXHRvcHRzLmNlbGxYZnMgPSBbXTtcblx0Z2V0X2NlbGxfc3R5bGUob3B0cy5jZWxsWGZzLCB7fSwge3JldnNzZjp7XCJHZW5lcmFsXCI6MH19KTtcblxuXHRpZighd2IuUHJvcHMpIHdiLlByb3BzID0ge307XG5cblx0ZiA9IFwiZG9jUHJvcHMvY29yZS54bWxcIjtcblx0emlwX2FkZF9maWxlKHppcCwgZiwgd3JpdGVfY29yZV9wcm9wcyh3Yi5Qcm9wcywgb3B0cykpO1xuXHRjdC5jb3JlcHJvcHMucHVzaChmKTtcblx0YWRkX3JlbHMob3B0cy5yZWxzLCAyLCBmLCBSRUxTLkNPUkVfUFJPUFMpO1xuXG5mID0gXCJkb2NQcm9wcy9hcHAueG1sXCI7XG5cdGlmKHdiLlByb3BzICYmIHdiLlByb3BzLlNoZWV0TmFtZXMpey8qIGVtcHR5ICovfVxuXHRlbHNlIGlmKCF3Yi5Xb3JrYm9vayB8fCAhd2IuV29ya2Jvb2suU2hlZXRzKSB3Yi5Qcm9wcy5TaGVldE5hbWVzID0gd2IuU2hlZXROYW1lcztcblx0ZWxzZSB7XG5cdFx0dmFyIF9zbiA9IFtdO1xuXHRcdGZvcih2YXIgX2kgPSAwOyBfaSA8IHdiLlNoZWV0TmFtZXMubGVuZ3RoOyArK19pKVxuXHRcdFx0aWYoKHdiLldvcmtib29rLlNoZWV0c1tfaV18fHt9KS5IaWRkZW4gIT0gMikgX3NuLnB1c2god2IuU2hlZXROYW1lc1tfaV0pO1xuXHRcdHdiLlByb3BzLlNoZWV0TmFtZXMgPSBfc247XG5cdH1cblx0d2IuUHJvcHMuV29ya3NoZWV0cyA9IHdiLlByb3BzLlNoZWV0TmFtZXMubGVuZ3RoO1xuXHR6aXBfYWRkX2ZpbGUoemlwLCBmLCB3cml0ZV9leHRfcHJvcHMod2IuUHJvcHMsIG9wdHMpKTtcblx0Y3QuZXh0cHJvcHMucHVzaChmKTtcblx0YWRkX3JlbHMob3B0cy5yZWxzLCAzLCBmLCBSRUxTLkVYVF9QUk9QUyk7XG5cblx0aWYod2IuQ3VzdHByb3BzICE9PSB3Yi5Qcm9wcyAmJiBrZXlzKHdiLkN1c3Rwcm9wc3x8e30pLmxlbmd0aCA+IDApIHtcblx0XHRmID0gXCJkb2NQcm9wcy9jdXN0b20ueG1sXCI7XG5cdFx0emlwX2FkZF9maWxlKHppcCwgZiwgd3JpdGVfY3VzdF9wcm9wcyh3Yi5DdXN0cHJvcHMsIG9wdHMpKTtcblx0XHRjdC5jdXN0cHJvcHMucHVzaChmKTtcblx0XHRhZGRfcmVscyhvcHRzLnJlbHMsIDQsIGYsIFJFTFMuQ1VTVF9QUk9QUyk7XG5cdH1cblxuXHRmb3IocklkPTE7cklkIDw9IHdiLlNoZWV0TmFtZXMubGVuZ3RoOyArK3JJZCkge1xuXHRcdHZhciB3c3JlbHMgPSB7JyFpZCc6e319O1xuXHRcdHZhciB3cyA9IHdiLlNoZWV0c1t3Yi5TaGVldE5hbWVzW3JJZC0xXV07XG5cdFx0dmFyIF90eXBlID0gKHdzIHx8IHt9KVtcIiF0eXBlXCJdIHx8IFwic2hlZXRcIjtcblx0XHRzd2l0Y2goX3R5cGUpIHtcblx0XHRjYXNlIFwiY2hhcnRcIjpcblx0XHRcdC8qIGZhbGxzIHRocm91Z2ggKi9cblx0XHRkZWZhdWx0OlxuXHRcdFx0ZiA9IFwieGwvd29ya3NoZWV0cy9zaGVldFwiICsgcklkICsgXCIuXCIgKyB3YmV4dDtcblx0XHRcdHppcF9hZGRfZmlsZSh6aXAsIGYsIHdyaXRlX3dzKHJJZC0xLCBmLCBvcHRzLCB3Yiwgd3NyZWxzKSk7XG5cdFx0XHRjdC5zaGVldHMucHVzaChmKTtcblx0XHRcdGFkZF9yZWxzKG9wdHMud2JyZWxzLCAtMSwgXCJ3b3Jrc2hlZXRzL3NoZWV0XCIgKyBySWQgKyBcIi5cIiArIHdiZXh0LCBSRUxTLldTWzBdKTtcblx0XHR9XG5cblx0XHRpZih3cykge1xuXHRcdFx0dmFyIGNvbW1lbnRzID0gd3NbJyFjb21tZW50cyddO1xuXHRcdFx0dmFyIG5lZWRfdm1sID0gZmFsc2U7XG5cdFx0XHRpZihjb21tZW50cyAmJiBjb21tZW50cy5sZW5ndGggPiAwKSB7XG5cdFx0XHRcdHZhciBjZiA9IFwieGwvY29tbWVudHNcIiArIHJJZCArIFwiLlwiICsgd2JleHQ7XG5cdFx0XHRcdHppcF9hZGRfZmlsZSh6aXAsIGNmLCB3cml0ZV9jbW50KGNvbW1lbnRzLCBjZiwgb3B0cykpO1xuXHRcdFx0XHRjdC5jb21tZW50cy5wdXNoKGNmKTtcblx0XHRcdFx0YWRkX3JlbHMod3NyZWxzLCAtMSwgXCIuLi9jb21tZW50c1wiICsgcklkICsgXCIuXCIgKyB3YmV4dCwgUkVMUy5DTU5UKTtcblx0XHRcdFx0bmVlZF92bWwgPSB0cnVlO1xuXHRcdFx0fVxuXHRcdFx0aWYod3NbJyFsZWdhY3knXSkge1xuXHRcdFx0XHRpZihuZWVkX3ZtbCkgemlwX2FkZF9maWxlKHppcCwgXCJ4bC9kcmF3aW5ncy92bWxEcmF3aW5nXCIgKyAocklkKSArIFwiLnZtbFwiLCB3cml0ZV9jb21tZW50c192bWwocklkLCB3c1snIWNvbW1lbnRzJ10pKTtcblx0XHRcdH1cblx0XHRcdGRlbGV0ZSB3c1snIWNvbW1lbnRzJ107XG5cdFx0XHRkZWxldGUgd3NbJyFsZWdhY3knXTtcblx0XHR9XG5cblx0XHRpZih3c3JlbHNbJyFpZCddLnJJZDEpIHppcF9hZGRfZmlsZSh6aXAsIGdldF9yZWxzX3BhdGgoZiksIHdyaXRlX3JlbHMod3NyZWxzKSk7XG5cdH1cblxuXHRpZihvcHRzLlN0cmluZ3MgIT0gbnVsbCAmJiBvcHRzLlN0cmluZ3MubGVuZ3RoID4gMCkge1xuXHRcdGYgPSBcInhsL3NoYXJlZFN0cmluZ3MuXCIgKyB3YmV4dDtcblx0XHR6aXBfYWRkX2ZpbGUoemlwLCBmLCB3cml0ZV9zc3Qob3B0cy5TdHJpbmdzLCBmLCBvcHRzKSk7XG5cdFx0Y3Quc3Rycy5wdXNoKGYpO1xuXHRcdGFkZF9yZWxzKG9wdHMud2JyZWxzLCAtMSwgXCJzaGFyZWRTdHJpbmdzLlwiICsgd2JleHQsIFJFTFMuU1NUKTtcblx0fVxuXG5cdGYgPSBcInhsL3dvcmtib29rLlwiICsgd2JleHQ7XG5cdHppcF9hZGRfZmlsZSh6aXAsIGYsIHdyaXRlX3diKHdiLCBmLCBvcHRzKSk7XG5cdGN0Lndvcmtib29rcy5wdXNoKGYpO1xuXHRhZGRfcmVscyhvcHRzLnJlbHMsIDEsIGYsIFJFTFMuV0IpO1xuXG5cdC8qIFRPRE86IHNvbWV0aGluZyBtb3JlIGludGVsbGlnZW50IHdpdGggdGhlbWVzICovXG5cblx0ZiA9IFwieGwvdGhlbWUvdGhlbWUxLnhtbFwiO1xuXHR6aXBfYWRkX2ZpbGUoemlwLCBmLCB3cml0ZV90aGVtZSh3Yi5UaGVtZXMsIG9wdHMpKTtcblx0Y3QudGhlbWVzLnB1c2goZik7XG5cdGFkZF9yZWxzKG9wdHMud2JyZWxzLCAtMSwgXCJ0aGVtZS90aGVtZTEueG1sXCIsIFJFTFMuVEhFTUUpO1xuXG5cdC8qIFRPRE86IHNvbWV0aGluZyBtb3JlIGludGVsbGlnZW50IHdpdGggc3R5bGVzICovXG5cblx0ZiA9IFwieGwvc3R5bGVzLlwiICsgd2JleHQ7XG5cdHppcF9hZGRfZmlsZSh6aXAsIGYsIHdyaXRlX3N0eSh3YiwgZiwgb3B0cykpO1xuXHRjdC5zdHlsZXMucHVzaChmKTtcblx0YWRkX3JlbHMob3B0cy53YnJlbHMsIC0xLCBcInN0eWxlcy5cIiArIHdiZXh0LCBSRUxTLlNUWSk7XG5cblx0aWYod2IudmJhcmF3ICYmIHZiYWZtdCkge1xuXHRcdGYgPSBcInhsL3ZiYVByb2plY3QuYmluXCI7XG5cdFx0emlwX2FkZF9maWxlKHppcCwgZiwgd2IudmJhcmF3KTtcblx0XHRjdC52YmEucHVzaChmKTtcblx0XHRhZGRfcmVscyhvcHRzLndicmVscywgLTEsIFwidmJhUHJvamVjdC5iaW5cIiwgUkVMUy5WQkEpO1xuXHR9XG5cblx0emlwX2FkZF9maWxlKHppcCwgXCJbQ29udGVudF9UeXBlc10ueG1sXCIsIHdyaXRlX2N0KGN0LCBvcHRzKSk7XG5cdHppcF9hZGRfZmlsZSh6aXAsICdfcmVscy8ucmVscycsIHdyaXRlX3JlbHMob3B0cy5yZWxzKSk7XG5cdHppcF9hZGRfZmlsZSh6aXAsICd4bC9fcmVscy93b3JrYm9vay4nICsgd2JleHQgKyAnLnJlbHMnLCB3cml0ZV9yZWxzKG9wdHMud2JyZWxzKSk7XG5cblx0ZGVsZXRlIG9wdHMucmV2c3NmOyBkZWxldGUgb3B0cy5zc2Y7XG5cdHJldHVybiB6aXA7XG59XG5mdW5jdGlvbiBmaXJzdGJ5dGUoZixvKSB7XG5cdHZhciB4ID0gXCJcIjtcblx0c3dpdGNoKChvfHx7fSkudHlwZSB8fCBcImJhc2U2NFwiKSB7XG5cdFx0Y2FzZSAnYnVmZmVyJzogcmV0dXJuIFtmWzBdLCBmWzFdLCBmWzJdLCBmWzNdLCBmWzRdLCBmWzVdLCBmWzZdLCBmWzddXTtcblx0XHRjYXNlICdiYXNlNjQnOiB4ID0gQmFzZTY0LmRlY29kZShmLnNsaWNlKDAsMTIpKTsgYnJlYWs7XG5cdFx0Y2FzZSAnYmluYXJ5JzogeCA9IGY7IGJyZWFrO1xuXHRcdGNhc2UgJ2FycmF5JzogIHJldHVybiBbZlswXSwgZlsxXSwgZlsyXSwgZlszXSwgZls0XSwgZls1XSwgZls2XSwgZls3XV07XG5cdFx0ZGVmYXVsdDogdGhyb3cgbmV3IEVycm9yKFwiVW5yZWNvZ25pemVkIHR5cGUgXCIgKyAobyAmJiBvLnR5cGUgfHwgXCJ1bmRlZmluZWRcIikpO1xuXHR9XG5cdHJldHVybiBbeC5jaGFyQ29kZUF0KDApLCB4LmNoYXJDb2RlQXQoMSksIHguY2hhckNvZGVBdCgyKSwgeC5jaGFyQ29kZUF0KDMpLCB4LmNoYXJDb2RlQXQoNCksIHguY2hhckNvZGVBdCg1KSwgeC5jaGFyQ29kZUF0KDYpLCB4LmNoYXJDb2RlQXQoNyldO1xufVxuXG5mdW5jdGlvbiByZWFkX2NmYihjZmIsIG9wdHMpIHtcblx0aWYoQ0ZCLmZpbmQoY2ZiLCBcIkVuY3J5cHRlZFBhY2thZ2VcIikpIHJldHVybiBwYXJzZV94bHN4Y2ZiKGNmYiwgb3B0cyk7XG5cdHJldHVybiBwYXJzZV94bHNjZmIoY2ZiLCBvcHRzKTtcbn1cblxuZnVuY3Rpb24gcmVhZF96aXAoZGF0YSwgb3B0cykge1xudmFyIHppcCwgZCA9IGRhdGE7XG5cdHZhciBvID0gb3B0c3x8e307XG5cdGlmKCFvLnR5cGUpIG8udHlwZSA9IChoYXNfYnVmICYmIEJ1ZmZlci5pc0J1ZmZlcihkYXRhKSkgPyBcImJ1ZmZlclwiIDogXCJiYXNlNjRcIjtcblx0emlwID0gemlwX3JlYWQoZCwgbyk7XG5cdHJldHVybiBwYXJzZV96aXAoemlwLCBvKTtcbn1cblxuZnVuY3Rpb24gcmVhZF9wbGFpbnRleHQoZGF0YSwgbykge1xuXHR2YXIgaSA9IDA7XG5cdG1haW46IHdoaWxlKGkgPCBkYXRhLmxlbmd0aCkgc3dpdGNoKGRhdGEuY2hhckNvZGVBdChpKSkge1xuXHRcdGNhc2UgMHgwQTogY2FzZSAweDBEOiBjYXNlIDB4MjA6ICsraTsgYnJlYWs7XG5cdFx0Y2FzZSAweDNDOiByZXR1cm4gcGFyc2VfeGxtbChkYXRhLnNsaWNlKGkpLG8pO1xuXHRcdGRlZmF1bHQ6IGJyZWFrIG1haW47XG5cdH1cblx0cmV0dXJuIFBSTi50b193b3JrYm9vayhkYXRhLCBvKTtcbn1cblxuZnVuY3Rpb24gcmVhZF9wbGFpbnRleHRfcmF3KGRhdGEsIG8pIHtcblx0dmFyIHN0ciA9IFwiXCIsIGJ5dGVzID0gZmlyc3RieXRlKGRhdGEsIG8pO1xuXHRzd2l0Y2goby50eXBlKSB7XG5cdFx0Y2FzZSAnYmFzZTY0Jzogc3RyID0gQmFzZTY0LmRlY29kZShkYXRhKTsgYnJlYWs7XG5cdFx0Y2FzZSAnYmluYXJ5Jzogc3RyID0gZGF0YTsgYnJlYWs7XG5cdFx0Y2FzZSAnYnVmZmVyJzogc3RyID0gZGF0YS50b1N0cmluZygnYmluYXJ5Jyk7IGJyZWFrO1xuXHRcdGNhc2UgJ2FycmF5Jzogc3RyID0gY2Myc3RyKGRhdGEpOyBicmVhaztcblx0XHRkZWZhdWx0OiB0aHJvdyBuZXcgRXJyb3IoXCJVbnJlY29nbml6ZWQgdHlwZSBcIiArIG8udHlwZSk7XG5cdH1cblx0aWYoYnl0ZXNbMF0gPT0gMHhFRiAmJiBieXRlc1sxXSA9PSAweEJCICYmIGJ5dGVzWzJdID09IDB4QkYpIHN0ciA9IHV0ZjhyZWFkKHN0cik7XG5cdHJldHVybiByZWFkX3BsYWludGV4dChzdHIsIG8pO1xufVxuXG5mdW5jdGlvbiByZWFkX3V0ZjE2KGRhdGEsIG8pIHtcblx0dmFyIGQgPSBkYXRhO1xuXHRpZihvLnR5cGUgPT0gJ2Jhc2U2NCcpIGQgPSBCYXNlNjQuZGVjb2RlKGQpO1xuXHRkID0gY3B0YWJsZS51dGlscy5kZWNvZGUoMTIwMCwgZC5zbGljZSgyKSwgJ3N0cicpO1xuXHRvLnR5cGUgPSBcImJpbmFyeVwiO1xuXHRyZXR1cm4gcmVhZF9wbGFpbnRleHQoZCwgbyk7XG59XG5cbmZ1bmN0aW9uIGJzdHJpZnkoZGF0YSkge1xuXHRyZXR1cm4gIWRhdGEubWF0Y2goL1teXFx4MDAtXFx4N0ZdLykgPyBkYXRhIDogdXRmOHdyaXRlKGRhdGEpO1xufVxuXG5mdW5jdGlvbiByZWFkX3BybihkYXRhLCBkLCBvLCBzdHIpIHtcblx0aWYoc3RyKSB7IG8udHlwZSA9IFwic3RyaW5nXCI7IHJldHVybiBQUk4udG9fd29ya2Jvb2soZGF0YSwgbyk7IH1cblx0cmV0dXJuIFBSTi50b193b3JrYm9vayhkLCBvKTtcbn1cblxuZnVuY3Rpb24gcmVhZFN5bmMoZGF0YSwgb3B0cykge1xuXHRyZXNldF9jcCgpO1xuXHRpZih0eXBlb2YgQXJyYXlCdWZmZXIgIT09ICd1bmRlZmluZWQnICYmIGRhdGEgaW5zdGFuY2VvZiBBcnJheUJ1ZmZlcikgcmV0dXJuIHJlYWRTeW5jKG5ldyBVaW50OEFycmF5KGRhdGEpLCBvcHRzKTtcblx0dmFyIGQgPSBkYXRhLCBuID0gWzAsMCwwLDBdLCBzdHIgPSBmYWxzZTtcblx0dmFyIG8gPSBvcHRzfHx7fTtcblx0aWYoby5jZWxsU3R5bGVzKSB7IG8uY2VsbE5GID0gdHJ1ZTsgby5zaGVldFN0dWJzID0gdHJ1ZTsgfVxuXHRfc3Nmb3B0cyA9IHt9O1xuXHRpZihvLmRhdGVORikgX3NzZm9wdHMuZGF0ZU5GID0gby5kYXRlTkY7XG5cdGlmKCFvLnR5cGUpIG8udHlwZSA9IChoYXNfYnVmICYmIEJ1ZmZlci5pc0J1ZmZlcihkYXRhKSkgPyBcImJ1ZmZlclwiIDogXCJiYXNlNjRcIjtcblx0aWYoby50eXBlID09IFwiZmlsZVwiKSB7IG8udHlwZSA9IGhhc19idWYgPyBcImJ1ZmZlclwiIDogXCJiaW5hcnlcIjsgZCA9IHJlYWRfYmluYXJ5KGRhdGEpOyB9XG5cdGlmKG8udHlwZSA9PSBcInN0cmluZ1wiKSB7IHN0ciA9IHRydWU7IG8udHlwZSA9IFwiYmluYXJ5XCI7IG8uY29kZXBhZ2UgPSA2NTAwMTsgZCA9IGJzdHJpZnkoZGF0YSk7IH1cblx0aWYoby50eXBlID09ICdhcnJheScgJiYgdHlwZW9mIFVpbnQ4QXJyYXkgIT09ICd1bmRlZmluZWQnICYmIGRhdGEgaW5zdGFuY2VvZiBVaW50OEFycmF5ICYmIHR5cGVvZiBBcnJheUJ1ZmZlciAhPT0gJ3VuZGVmaW5lZCcpIHtcblx0XHQvLyAkRmxvd0lnbm9yZVxuXHRcdHZhciBhYj1uZXcgQXJyYXlCdWZmZXIoMyksIHZ1PW5ldyBVaW50OEFycmF5KGFiKTsgdnUuZm9vPVwiYmFyXCI7XG5cdFx0Ly8gJEZsb3dJZ25vcmVcblx0XHRpZighdnUuZm9vKSB7bz1kdXAobyk7IG8udHlwZT0nYXJyYXknOyByZXR1cm4gcmVhZFN5bmMoYWIyYShkKSwgbyk7fVxuXHR9XG5cdHN3aXRjaCgobiA9IGZpcnN0Ynl0ZShkLCBvKSlbMF0pIHtcblx0XHRjYXNlIDB4RDA6IGlmKG5bMV0gPT09IDB4Q0YgJiYgblsyXSA9PT0gMHgxMSAmJiBuWzNdID09PSAweEUwICYmIG5bNF0gPT09IDB4QTEgJiYgbls1XSA9PT0gMHhCMSAmJiBuWzZdID09PSAweDFBICYmIG5bN10gPT09IDB4RTEpIHJldHVybiByZWFkX2NmYihDRkIucmVhZChkLCBvKSwgbyk7IGJyZWFrO1xuXHRcdGNhc2UgMHgwOTogaWYoblsxXSA8PSAweDA0KSByZXR1cm4gcGFyc2VfeGxzY2ZiKGQsIG8pOyBicmVhaztcblx0XHRjYXNlIDB4M0M6IHJldHVybiBwYXJzZV94bG1sKGQsIG8pO1xuXHRcdGNhc2UgMHg0OTpcblx0XHRcdGlmKG5bMV0gPT09IDB4NDkgJiYgblsyXSA9PT0gMHgyYSAmJiBuWzNdID09PSAweDAwKSB0aHJvdyBuZXcgRXJyb3IoXCJUSUZGIEltYWdlIEZpbGUgaXMgbm90IGEgc3ByZWFkc2hlZXRcIik7XG5cdFx0XHRpZihuWzFdID09PSAweDQ0KSByZXR1cm4gcmVhZF93Yl9JRChkLCBvKTtcblx0XHRcdGJyZWFrO1xuXHRcdGNhc2UgMHg1NDogaWYoblsxXSA9PT0gMHg0MSAmJiBuWzJdID09PSAweDQyICYmIG5bM10gPT09IDB4NEMpIHJldHVybiBESUYudG9fd29ya2Jvb2soZCwgbyk7IGJyZWFrO1xuXHRcdGNhc2UgMHg1MDogcmV0dXJuIChuWzFdID09PSAweDRCICYmIG5bMl0gPCAweDA5ICYmIG5bM10gPCAweDA5KSA/IHJlYWRfemlwKGQsIG8pIDogcmVhZF9wcm4oZGF0YSwgZCwgbywgc3RyKTtcblx0XHRjYXNlIDB4RUY6IHJldHVybiBuWzNdID09PSAweDNDID8gcGFyc2VfeGxtbChkLCBvKSA6IHJlYWRfcHJuKGRhdGEsIGQsIG8sIHN0cik7XG5cdFx0Y2FzZSAweEZGOiBpZihuWzFdID09PSAweEZFKSB7IHJldHVybiByZWFkX3V0ZjE2KGQsIG8pOyB9IGJyZWFrO1xuXHRcdGNhc2UgMHgwMDogaWYoblsxXSA9PT0gMHgwMCAmJiBuWzJdID49IDB4MDIgJiYgblszXSA9PT0gMHgwMCkgcmV0dXJuIFdLXy50b193b3JrYm9vayhkLCBvKTsgYnJlYWs7XG5cdFx0Y2FzZSAweDAzOiBjYXNlIDB4ODM6IGNhc2UgMHg4QjogY2FzZSAweDhDOiByZXR1cm4gREJGLnRvX3dvcmtib29rKGQsIG8pO1xuXHRcdGNhc2UgMHg3QjogaWYoblsxXSA9PT0gMHg1QyAmJiBuWzJdID09PSAweDcyICYmIG5bM10gPT09IDB4NzQpIHJldHVybiBSVEYudG9fd29ya2Jvb2soZCwgbyk7IGJyZWFrO1xuXHRcdGNhc2UgMHgwQTogY2FzZSAweDBEOiBjYXNlIDB4MjA6IHJldHVybiByZWFkX3BsYWludGV4dF9yYXcoZCwgbyk7XG5cdH1cblx0aWYoREJGLnZlcnNpb25zLmluZGV4T2YoblswXSkgPiAtMSAmJiBuWzJdIDw9IDEyICYmIG5bM10gPD0gMzEpIHJldHVybiBEQkYudG9fd29ya2Jvb2soZCwgbyk7XG5cdHJldHVybiByZWFkX3BybihkYXRhLCBkLCBvLCBzdHIpO1xufVxuXG5mdW5jdGlvbiByZWFkRmlsZVN5bmMoZmlsZW5hbWUsIG9wdHMpIHtcblx0dmFyIG8gPSBvcHRzfHx7fTsgby50eXBlID0gJ2ZpbGUnO1xuXHRyZXR1cm4gcmVhZFN5bmMoZmlsZW5hbWUsIG8pO1xufVxuZnVuY3Rpb24gd3JpdGVfY2ZiX2N0cihjZmIsIG8pIHtcblx0c3dpdGNoKG8udHlwZSkge1xuXHRcdGNhc2UgXCJiYXNlNjRcIjogY2FzZSBcImJpbmFyeVwiOiBicmVhaztcblx0XHRjYXNlIFwiYnVmZmVyXCI6IGNhc2UgXCJhcnJheVwiOiBvLnR5cGUgPSBcIlwiOyBicmVhaztcblx0XHRjYXNlIFwiZmlsZVwiOiByZXR1cm4gd3JpdGVfZGwoby5maWxlLCBDRkIud3JpdGUoY2ZiLCB7dHlwZTpoYXNfYnVmID8gJ2J1ZmZlcicgOiBcIlwifSkpO1xuXHRcdGNhc2UgXCJzdHJpbmdcIjogdGhyb3cgbmV3IEVycm9yKFwiJ3N0cmluZycgb3V0cHV0IHR5cGUgaW52YWxpZCBmb3IgJ1wiICsgby5ib29rVHlwZSArIFwiJyBmaWxlc1wiKTtcblx0XHRkZWZhdWx0OiB0aHJvdyBuZXcgRXJyb3IoXCJVbnJlY29nbml6ZWQgdHlwZSBcIiArIG8udHlwZSk7XG5cdH1cblx0cmV0dXJuIENGQi53cml0ZShjZmIsIG8pO1xufVxuXG5mdW5jdGlvbiB3cml0ZV96aXBfdHlwZSh3Yiwgb3B0cykge1xuXHR2YXIgbyA9IG9wdHN8fHt9O1xuXHR2YXIgeiA9IHdyaXRlX3ppcCh3Yiwgbyk7XG5cdHZhciBvb3B0cyA9IHt9O1xuXHRpZihvLmNvbXByZXNzaW9uKSBvb3B0cy5jb21wcmVzc2lvbiA9ICdERUZMQVRFJztcblx0aWYoby5wYXNzd29yZCkgb29wdHMudHlwZSA9IGhhc19idWYgPyBcIm5vZGVidWZmZXJcIiA6IFwic3RyaW5nXCI7XG5cdGVsc2Ugc3dpdGNoKG8udHlwZSkge1xuXHRcdGNhc2UgXCJiYXNlNjRcIjogb29wdHMudHlwZSA9IFwiYmFzZTY0XCI7IGJyZWFrO1xuXHRcdGNhc2UgXCJiaW5hcnlcIjogb29wdHMudHlwZSA9IFwic3RyaW5nXCI7IGJyZWFrO1xuXHRcdGNhc2UgXCJzdHJpbmdcIjogdGhyb3cgbmV3IEVycm9yKFwiJ3N0cmluZycgb3V0cHV0IHR5cGUgaW52YWxpZCBmb3IgJ1wiICsgby5ib29rVHlwZSArIFwiJyBmaWxlc1wiKTtcblx0XHRjYXNlIFwiYnVmZmVyXCI6XG5cdFx0Y2FzZSBcImZpbGVcIjogb29wdHMudHlwZSA9IGhhc19idWYgPyBcIm5vZGVidWZmZXJcIiA6IFwic3RyaW5nXCI7IGJyZWFrO1xuXHRcdGRlZmF1bHQ6IHRocm93IG5ldyBFcnJvcihcIlVucmVjb2duaXplZCB0eXBlIFwiICsgby50eXBlKTtcblx0fVxuXHR2YXIgb3V0ID0gei5GdWxsUGF0aHMgPyBDRkIud3JpdGUoeiwge2ZpbGVUeXBlOlwiemlwXCIsIHR5cGU6IHtcIm5vZGVidWZmZXJcIjogXCJidWZmZXJcIiwgXCJzdHJpbmdcIjogXCJiaW5hcnlcIn1bb29wdHMudHlwZV0gfHwgb29wdHMudHlwZX0pIDogei5nZW5lcmF0ZShvb3B0cyk7XG4vKmpzaGludCAtVzA4MyAqL1xuXHRpZihvLnBhc3N3b3JkICYmIHR5cGVvZiBlbmNyeXB0X2FnaWxlICE9PSAndW5kZWZpbmVkJykgcmV0dXJuIHdyaXRlX2NmYl9jdHIoZW5jcnlwdF9hZ2lsZShvdXQsIG8ucGFzc3dvcmQpLCBvKTsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby11bmRlZlxuLypqc2hpbnQgK1cwODMgKi9cblx0aWYoby50eXBlID09PSBcImZpbGVcIikgcmV0dXJuIHdyaXRlX2RsKG8uZmlsZSwgb3V0KTtcblx0cmV0dXJuIG8udHlwZSA9PSBcInN0cmluZ1wiID8gdXRmOHJlYWQob3V0KSA6IG91dDtcbn1cblxuZnVuY3Rpb24gd3JpdGVfY2ZiX3R5cGUod2IsIG9wdHMpIHtcblx0dmFyIG8gPSBvcHRzfHx7fTtcblx0dmFyIGNmYiA9IHdyaXRlX3hsc2NmYih3Yiwgbyk7XG5cdHJldHVybiB3cml0ZV9jZmJfY3RyKGNmYiwgbyk7XG59XG5cbmZ1bmN0aW9uIHdyaXRlX3N0cmluZ190eXBlKG91dCwgb3B0cywgYm9tKSB7XG5cdGlmKCFib20pIGJvbSA9IFwiXCI7XG5cdHZhciBvID0gYm9tICsgb3V0O1xuXHRzd2l0Y2gob3B0cy50eXBlKSB7XG5cdFx0Y2FzZSBcImJhc2U2NFwiOiByZXR1cm4gQmFzZTY0LmVuY29kZSh1dGY4d3JpdGUobykpO1xuXHRcdGNhc2UgXCJiaW5hcnlcIjogcmV0dXJuIHV0Zjh3cml0ZShvKTtcblx0XHRjYXNlIFwic3RyaW5nXCI6IHJldHVybiBvdXQ7XG5cdFx0Y2FzZSBcImZpbGVcIjogcmV0dXJuIHdyaXRlX2RsKG9wdHMuZmlsZSwgbywgJ3V0ZjgnKTtcblx0XHRjYXNlIFwiYnVmZmVyXCI6IHtcblx0XHRcdGlmKGhhc19idWYpIHJldHVybiBCdWZmZXJfZnJvbShvLCAndXRmOCcpO1xuXHRcdFx0ZWxzZSByZXR1cm4gd3JpdGVfc3RyaW5nX3R5cGUobywge3R5cGU6J2JpbmFyeSd9KS5zcGxpdChcIlwiKS5tYXAoZnVuY3Rpb24oYykgeyByZXR1cm4gYy5jaGFyQ29kZUF0KDApOyB9KTtcblx0XHR9XG5cdH1cblx0dGhyb3cgbmV3IEVycm9yKFwiVW5yZWNvZ25pemVkIHR5cGUgXCIgKyBvcHRzLnR5cGUpO1xufVxuXG5mdW5jdGlvbiB3cml0ZV9zdHh0X3R5cGUob3V0LCBvcHRzKSB7XG5cdHN3aXRjaChvcHRzLnR5cGUpIHtcblx0XHRjYXNlIFwiYmFzZTY0XCI6IHJldHVybiBCYXNlNjQuZW5jb2RlKG91dCk7XG5cdFx0Y2FzZSBcImJpbmFyeVwiOiByZXR1cm4gb3V0O1xuXHRcdGNhc2UgXCJzdHJpbmdcIjogcmV0dXJuIG91dDsgLyogb3ZlcnJpZGUgaW4gc2hlZXRfdG9fdHh0ICovXG5cdFx0Y2FzZSBcImZpbGVcIjogcmV0dXJuIHdyaXRlX2RsKG9wdHMuZmlsZSwgb3V0LCAnYmluYXJ5Jyk7XG5cdFx0Y2FzZSBcImJ1ZmZlclwiOiB7XG5cdFx0XHRpZihoYXNfYnVmKSByZXR1cm4gQnVmZmVyX2Zyb20ob3V0LCAnYmluYXJ5Jyk7XG5cdFx0XHRlbHNlIHJldHVybiBvdXQuc3BsaXQoXCJcIikubWFwKGZ1bmN0aW9uKGMpIHsgcmV0dXJuIGMuY2hhckNvZGVBdCgwKTsgfSk7XG5cdFx0fVxuXHR9XG5cdHRocm93IG5ldyBFcnJvcihcIlVucmVjb2duaXplZCB0eXBlIFwiICsgb3B0cy50eXBlKTtcbn1cblxuLyogVE9ETzogdGVzdCBjb25zaXN0ZW5jeSAqL1xuZnVuY3Rpb24gd3JpdGVfYmluYXJ5X3R5cGUob3V0LCBvcHRzKSB7XG5cdHN3aXRjaChvcHRzLnR5cGUpIHtcblx0XHRjYXNlIFwic3RyaW5nXCI6XG5cdFx0Y2FzZSBcImJhc2U2NFwiOlxuXHRcdGNhc2UgXCJiaW5hcnlcIjpcblx0XHRcdHZhciBic3RyID0gXCJcIjtcblx0XHRcdC8vICRGbG93SWdub3JlXG5cdFx0XHRmb3IodmFyIGkgPSAwOyBpIDwgb3V0Lmxlbmd0aDsgKytpKSBic3RyICs9IFN0cmluZy5mcm9tQ2hhckNvZGUob3V0W2ldKTtcblx0XHRcdHJldHVybiBvcHRzLnR5cGUgPT0gJ2Jhc2U2NCcgPyBCYXNlNjQuZW5jb2RlKGJzdHIpIDogb3B0cy50eXBlID09ICdzdHJpbmcnID8gdXRmOHJlYWQoYnN0cikgOiBic3RyO1xuXHRcdGNhc2UgXCJmaWxlXCI6IHJldHVybiB3cml0ZV9kbChvcHRzLmZpbGUsIG91dCk7XG5cdFx0Y2FzZSBcImJ1ZmZlclwiOiByZXR1cm4gb3V0O1xuXHRcdGRlZmF1bHQ6IHRocm93IG5ldyBFcnJvcihcIlVucmVjb2duaXplZCB0eXBlIFwiICsgb3B0cy50eXBlKTtcblx0fVxufVxuXG5mdW5jdGlvbiB3cml0ZVN5bmMod2IsIG9wdHMpIHtcblx0cmVzZXRfY3AoKTtcblx0Y2hlY2tfd2Iod2IpO1xuXHR2YXIgbyA9IG9wdHN8fHt9O1xuXHRpZihvLmNlbGxTdHlsZXMpIHsgby5jZWxsTkYgPSB0cnVlOyBvLnNoZWV0U3R1YnMgPSB0cnVlOyB9XG5cdGlmKG8udHlwZSA9PSBcImFycmF5XCIpIHsgby50eXBlID0gXCJiaW5hcnlcIjsgdmFyIG91dCA9ICh3cml0ZVN5bmMod2IsIG8pKTsgby50eXBlID0gXCJhcnJheVwiOyByZXR1cm4gczJhYihvdXQpOyB9XG5cdHN3aXRjaChvLmJvb2tUeXBlIHx8ICd4bHNiJykge1xuXHRcdGNhc2UgJ3htbCc6XG5cdFx0Y2FzZSAneGxtbCc6IHJldHVybiB3cml0ZV9zdHJpbmdfdHlwZSh3cml0ZV94bG1sKHdiLCBvKSwgbyk7XG5cdFx0Y2FzZSAnc2xrJzpcblx0XHRjYXNlICdzeWxrJzogcmV0dXJuIHdyaXRlX3N0cmluZ190eXBlKHdyaXRlX3Nsa19zdHIod2IsIG8pLCBvKTtcblx0XHRjYXNlICdodG0nOlxuXHRcdGNhc2UgJ2h0bWwnOiByZXR1cm4gd3JpdGVfc3RyaW5nX3R5cGUod3JpdGVfaHRtX3N0cih3YiwgbyksIG8pO1xuXHRcdGNhc2UgJ3R4dCc6IHJldHVybiB3cml0ZV9zdHh0X3R5cGUod3JpdGVfdHh0X3N0cih3YiwgbyksIG8pO1xuXHRcdGNhc2UgJ2Nzdic6IHJldHVybiB3cml0ZV9zdHJpbmdfdHlwZSh3cml0ZV9jc3Zfc3RyKHdiLCBvKSwgbywgXCJcXHVmZWZmXCIpO1xuXHRcdGNhc2UgJ2RpZic6IHJldHVybiB3cml0ZV9zdHJpbmdfdHlwZSh3cml0ZV9kaWZfc3RyKHdiLCBvKSwgbyk7XG5cdFx0Y2FzZSAnZGJmJzogcmV0dXJuIHdyaXRlX2JpbmFyeV90eXBlKHdyaXRlX2RiZl9idWYod2IsIG8pLCBvKTtcblx0XHRjYXNlICdwcm4nOiByZXR1cm4gd3JpdGVfc3RyaW5nX3R5cGUod3JpdGVfcHJuX3N0cih3YiwgbyksIG8pO1xuXHRcdGNhc2UgJ3J0Zic6IHJldHVybiB3cml0ZV9zdHJpbmdfdHlwZSh3cml0ZV9ydGZfc3RyKHdiLCBvKSwgbyk7XG5cdFx0Y2FzZSAnZXRoJzogcmV0dXJuIHdyaXRlX3N0cmluZ190eXBlKHdyaXRlX2V0aF9zdHIod2IsIG8pLCBvKTtcblx0XHRjYXNlICdmb2RzJzogcmV0dXJuIHdyaXRlX3N0cmluZ190eXBlKHdyaXRlX29kcyh3YiwgbyksIG8pO1xuXHRcdGNhc2UgJ2JpZmYyJzogaWYoIW8uYmlmZikgby5iaWZmID0gMjsgLyogZmFsbHMgdGhyb3VnaCAqL1xuXHRcdGNhc2UgJ2JpZmYzJzogaWYoIW8uYmlmZikgby5iaWZmID0gMzsgLyogZmFsbHMgdGhyb3VnaCAqL1xuXHRcdGNhc2UgJ2JpZmY0JzogaWYoIW8uYmlmZikgby5iaWZmID0gNDsgcmV0dXJuIHdyaXRlX2JpbmFyeV90eXBlKHdyaXRlX2JpZmZfYnVmKHdiLCBvKSwgbyk7XG5cdFx0Y2FzZSAnYmlmZjUnOiBpZighby5iaWZmKSBvLmJpZmYgPSA1OyAvKiBmYWxscyB0aHJvdWdoICovXG5cdFx0Y2FzZSAnYmlmZjgnOlxuXHRcdGNhc2UgJ3hsYSc6XG5cdFx0Y2FzZSAneGxzJzogaWYoIW8uYmlmZikgby5iaWZmID0gODsgcmV0dXJuIHdyaXRlX2NmYl90eXBlKHdiLCBvKTtcblx0XHRjYXNlICd4bHN4Jzpcblx0XHRjYXNlICd4bHNtJzpcblx0XHRjYXNlICd4bGFtJzpcblx0XHRjYXNlICd4bHNiJzpcblx0XHRjYXNlICdvZHMnOiByZXR1cm4gd3JpdGVfemlwX3R5cGUod2IsIG8pO1xuXHRcdGRlZmF1bHQ6IHRocm93IG5ldyBFcnJvciAoXCJVbnJlY29nbml6ZWQgYm9va1R5cGUgfFwiICsgby5ib29rVHlwZSArIFwifFwiKTtcblx0fVxufVxuXG5mdW5jdGlvbiByZXNvbHZlX2Jvb2tfdHlwZShvKSB7XG5cdGlmKG8uYm9va1R5cGUpIHJldHVybjtcblx0dmFyIF9CVCA9IHtcblx0XHRcInhsc1wiOiBcImJpZmY4XCIsXG5cdFx0XCJodG1cIjogXCJodG1sXCIsXG5cdFx0XCJzbGtcIjogXCJzeWxrXCIsXG5cdFx0XCJzb2NpYWxjYWxjXCI6IFwiZXRoXCIsXG5cdFx0XCJTaDMzdEpTXCI6IFwiV1RGXCJcblx0fTtcblx0dmFyIGV4dCA9IG8uZmlsZS5zbGljZShvLmZpbGUubGFzdEluZGV4T2YoXCIuXCIpKS50b0xvd2VyQ2FzZSgpO1xuXHRpZihleHQubWF0Y2goL15cXC5bYS16XSskLykpIG8uYm9va1R5cGUgPSBleHQuc2xpY2UoMSk7XG5cdG8uYm9va1R5cGUgPSBfQlRbby5ib29rVHlwZV0gfHwgby5ib29rVHlwZTtcbn1cblxuZnVuY3Rpb24gd3JpdGVGaWxlU3luYyh3YiwgZmlsZW5hbWUsIG9wdHMpIHtcblx0dmFyIG8gPSBvcHRzfHx7fTsgby50eXBlID0gJ2ZpbGUnO1xuXHRvLmZpbGUgPSBmaWxlbmFtZTtcblx0cmVzb2x2ZV9ib29rX3R5cGUobyk7XG5cdHJldHVybiB3cml0ZVN5bmMod2IsIG8pO1xufVxuXG5mdW5jdGlvbiB3cml0ZUZpbGVBc3luYyhmaWxlbmFtZSwgd2IsIG9wdHMsIGNiKSB7XG5cdHZhciBvID0gb3B0c3x8e307IG8udHlwZSA9ICdmaWxlJztcblx0by5maWxlID0gZmlsZW5hbWU7XG5cdHJlc29sdmVfYm9va190eXBlKG8pO1xuXHRvLnR5cGUgPSAnYnVmZmVyJztcblx0dmFyIF9jYiA9IGNiOyBpZighKF9jYiBpbnN0YW5jZW9mIEZ1bmN0aW9uKSkgX2NiID0gKG9wdHMpO1xuXHRyZXR1cm4gX2ZzLndyaXRlRmlsZShmaWxlbmFtZSwgd3JpdGVTeW5jKHdiLCBvKSwgX2NiKTtcbn1cbmZ1bmN0aW9uIG1ha2VfanNvbl9yb3coc2hlZXQsIHIsIFIsIGNvbHMsIGhlYWRlciwgaGRyLCBkZW5zZSwgbykge1xuXHR2YXIgcnIgPSBlbmNvZGVfcm93KFIpO1xuXHR2YXIgZGVmdmFsID0gby5kZWZ2YWwsIHJhdyA9IG8ucmF3IHx8ICFPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwobywgXCJyYXdcIik7XG5cdHZhciBpc2VtcHR5ID0gdHJ1ZTtcblx0dmFyIHJvdyA9IChoZWFkZXIgPT09IDEpID8gW10gOiB7fTtcblx0aWYoaGVhZGVyICE9PSAxKSB7XG5cdFx0aWYoT2JqZWN0LmRlZmluZVByb3BlcnR5KSB0cnkgeyBPYmplY3QuZGVmaW5lUHJvcGVydHkocm93LCAnX19yb3dOdW1fXycsIHt2YWx1ZTpSLCBlbnVtZXJhYmxlOmZhbHNlfSk7IH0gY2F0Y2goZSkgeyByb3cuX19yb3dOdW1fXyA9IFI7IH1cblx0XHRlbHNlIHJvdy5fX3Jvd051bV9fID0gUjtcblx0fVxuXHRpZighZGVuc2UgfHwgc2hlZXRbUl0pIGZvciAodmFyIEMgPSByLnMuYzsgQyA8PSByLmUuYzsgKytDKSB7XG5cdFx0dmFyIHZhbCA9IGRlbnNlID8gc2hlZXRbUl1bQ10gOiBzaGVldFtjb2xzW0NdICsgcnJdO1xuXHRcdGlmKHZhbCA9PT0gdW5kZWZpbmVkIHx8IHZhbC50ID09PSB1bmRlZmluZWQpIHtcblx0XHRcdGlmKGRlZnZhbCA9PT0gdW5kZWZpbmVkKSBjb250aW51ZTtcblx0XHRcdGlmKGhkcltDXSAhPSBudWxsKSB7IHJvd1toZHJbQ11dID0gZGVmdmFsOyB9XG5cdFx0XHRjb250aW51ZTtcblx0XHR9XG5cdFx0dmFyIHYgPSB2YWwudjtcblx0XHRzd2l0Y2godmFsLnQpe1xuXHRcdFx0Y2FzZSAneic6IGlmKHYgPT0gbnVsbCkgYnJlYWs7IGNvbnRpbnVlO1xuXHRcdFx0Y2FzZSAnZSc6IHYgPSB2b2lkIDA7IGJyZWFrO1xuXHRcdFx0Y2FzZSAncyc6IGNhc2UgJ2QnOiBjYXNlICdiJzogY2FzZSAnbic6IGJyZWFrO1xuXHRcdFx0ZGVmYXVsdDogdGhyb3cgbmV3IEVycm9yKCd1bnJlY29nbml6ZWQgdHlwZSAnICsgdmFsLnQpO1xuXHRcdH1cblx0XHRpZihoZHJbQ10gIT0gbnVsbCkge1xuXHRcdFx0aWYodiA9PSBudWxsKSB7XG5cdFx0XHRcdGlmKGRlZnZhbCAhPT0gdW5kZWZpbmVkKSByb3dbaGRyW0NdXSA9IGRlZnZhbDtcblx0XHRcdFx0ZWxzZSBpZihyYXcgJiYgdiA9PT0gbnVsbCkgcm93W2hkcltDXV0gPSBudWxsO1xuXHRcdFx0XHRlbHNlIGNvbnRpbnVlO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0cm93W2hkcltDXV0gPSByYXcgfHwgKG8ucmF3TnVtYmVycyAmJiB2YWwudCA9PSBcIm5cIikgPyB2IDogZm9ybWF0X2NlbGwodmFsLHYsbyk7XG5cdFx0XHR9XG5cdFx0XHRpZih2ICE9IG51bGwpIGlzZW1wdHkgPSBmYWxzZTtcblx0XHR9XG5cdH1cblx0cmV0dXJuIHsgcm93OiByb3csIGlzZW1wdHk6IGlzZW1wdHkgfTtcbn1cblxuXG5mdW5jdGlvbiBzaGVldF90b19qc29uKHNoZWV0LCBvcHRzKSB7XG5cdGlmKHNoZWV0ID09IG51bGwgfHwgc2hlZXRbXCIhcmVmXCJdID09IG51bGwpIHJldHVybiBbXTtcblx0dmFyIHZhbCA9IHt0OiduJyx2OjB9LCBoZWFkZXIgPSAwLCBvZmZzZXQgPSAxLCBoZHIgPSBbXSwgdj0wLCB2dj1cIlwiO1xuXHR2YXIgciA9IHtzOntyOjAsYzowfSxlOntyOjAsYzowfX07XG5cdHZhciBvID0gb3B0cyB8fCB7fTtcblx0dmFyIHJhbmdlID0gby5yYW5nZSAhPSBudWxsID8gby5yYW5nZSA6IHNoZWV0W1wiIXJlZlwiXTtcblx0aWYoby5oZWFkZXIgPT09IDEpIGhlYWRlciA9IDE7XG5cdGVsc2UgaWYoby5oZWFkZXIgPT09IFwiQVwiKSBoZWFkZXIgPSAyO1xuXHRlbHNlIGlmKEFycmF5LmlzQXJyYXkoby5oZWFkZXIpKSBoZWFkZXIgPSAzO1xuXHRlbHNlIGlmKG8uaGVhZGVyID09IG51bGwpIGhlYWRlciA9IDA7XG5cdHN3aXRjaCh0eXBlb2YgcmFuZ2UpIHtcblx0XHRjYXNlICdzdHJpbmcnOiByID0gc2FmZV9kZWNvZGVfcmFuZ2UocmFuZ2UpOyBicmVhaztcblx0XHRjYXNlICdudW1iZXInOiByID0gc2FmZV9kZWNvZGVfcmFuZ2Uoc2hlZXRbXCIhcmVmXCJdKTsgci5zLnIgPSByYW5nZTsgYnJlYWs7XG5cdFx0ZGVmYXVsdDogciA9IHJhbmdlO1xuXHR9XG5cdGlmKGhlYWRlciA+IDApIG9mZnNldCA9IDA7XG5cdHZhciByciA9IGVuY29kZV9yb3coci5zLnIpO1xuXHR2YXIgY29scyA9IFtdO1xuXHR2YXIgb3V0ID0gW107XG5cdHZhciBvdXRpID0gMCwgY291bnRlciA9IDA7XG5cdHZhciBkZW5zZSA9IEFycmF5LmlzQXJyYXkoc2hlZXQpO1xuXHR2YXIgUiA9IHIucy5yLCBDID0gMCwgQ0MgPSAwO1xuXHRpZihkZW5zZSAmJiAhc2hlZXRbUl0pIHNoZWV0W1JdID0gW107XG5cdGZvcihDID0gci5zLmM7IEMgPD0gci5lLmM7ICsrQykge1xuXHRcdGNvbHNbQ10gPSBlbmNvZGVfY29sKEMpO1xuXHRcdHZhbCA9IGRlbnNlID8gc2hlZXRbUl1bQ10gOiBzaGVldFtjb2xzW0NdICsgcnJdO1xuXHRcdHN3aXRjaChoZWFkZXIpIHtcblx0XHRcdGNhc2UgMTogaGRyW0NdID0gQyAtIHIucy5jOyBicmVhaztcblx0XHRcdGNhc2UgMjogaGRyW0NdID0gY29sc1tDXTsgYnJlYWs7XG5cdFx0XHRjYXNlIDM6IGhkcltDXSA9IG8uaGVhZGVyW0MgLSByLnMuY107IGJyZWFrO1xuXHRcdFx0ZGVmYXVsdDpcblx0XHRcdFx0aWYodmFsID09IG51bGwpIHZhbCA9IHt3OiBcIl9fRU1QVFlcIiwgdDogXCJzXCJ9O1xuXHRcdFx0XHR2diA9IHYgPSBmb3JtYXRfY2VsbCh2YWwsIG51bGwsIG8pO1xuXHRcdFx0XHRjb3VudGVyID0gMDtcblx0XHRcdFx0Zm9yKENDID0gMDsgQ0MgPCBoZHIubGVuZ3RoOyArK0NDKSBpZihoZHJbQ0NdID09IHZ2KSB2diA9IHYgKyBcIl9cIiArICgrK2NvdW50ZXIpO1xuXHRcdFx0XHRoZHJbQ10gPSB2djtcblx0XHR9XG5cdH1cblx0Zm9yIChSID0gci5zLnIgKyBvZmZzZXQ7IFIgPD0gci5lLnI7ICsrUikge1xuXHRcdHZhciByb3cgPSBtYWtlX2pzb25fcm93KHNoZWV0LCByLCBSLCBjb2xzLCBoZWFkZXIsIGhkciwgZGVuc2UsIG8pO1xuXHRcdGlmKChyb3cuaXNlbXB0eSA9PT0gZmFsc2UpIHx8IChoZWFkZXIgPT09IDEgPyBvLmJsYW5rcm93cyAhPT0gZmFsc2UgOiAhIW8uYmxhbmtyb3dzKSkgb3V0W291dGkrK10gPSByb3cucm93O1xuXHR9XG5cdG91dC5sZW5ndGggPSBvdXRpO1xuXHRyZXR1cm4gb3V0O1xufVxuXG52YXIgcXJlZyA9IC9cIi9nO1xuZnVuY3Rpb24gbWFrZV9jc3Zfcm93KHNoZWV0LCByLCBSLCBjb2xzLCBmcywgcnMsIEZTLCBvKSB7XG5cdHZhciBpc2VtcHR5ID0gdHJ1ZTtcblx0dmFyIHJvdyA9IFtdLCB0eHQgPSBcIlwiLCByciA9IGVuY29kZV9yb3coUik7XG5cdGZvcih2YXIgQyA9IHIucy5jOyBDIDw9IHIuZS5jOyArK0MpIHtcblx0XHRpZiAoIWNvbHNbQ10pIGNvbnRpbnVlO1xuXHRcdHZhciB2YWwgPSBvLmRlbnNlID8gKHNoZWV0W1JdfHxbXSlbQ106IHNoZWV0W2NvbHNbQ10gKyBycl07XG5cdFx0aWYodmFsID09IG51bGwpIHR4dCA9IFwiXCI7XG5cdFx0ZWxzZSBpZih2YWwudiAhPSBudWxsKSB7XG5cdFx0XHRpc2VtcHR5ID0gZmFsc2U7XG5cdFx0XHR0eHQgPSAnJysoby5yYXdOdW1iZXJzICYmIHZhbC50ID09IFwiblwiID8gdmFsLnYgOiBmb3JtYXRfY2VsbCh2YWwsIG51bGwsIG8pKTtcblx0XHRcdGZvcih2YXIgaSA9IDAsIGNjID0gMDsgaSAhPT0gdHh0Lmxlbmd0aDsgKytpKSBpZigoY2MgPSB0eHQuY2hhckNvZGVBdChpKSkgPT09IGZzIHx8IGNjID09PSBycyB8fCBjYyA9PT0gMzQgfHwgby5mb3JjZVF1b3Rlcykge3R4dCA9IFwiXFxcIlwiICsgdHh0LnJlcGxhY2UocXJlZywgJ1wiXCInKSArIFwiXFxcIlwiOyBicmVhazsgfVxuXHRcdFx0aWYodHh0ID09IFwiSURcIikgdHh0ID0gJ1wiSURcIic7XG5cdFx0fSBlbHNlIGlmKHZhbC5mICE9IG51bGwgJiYgIXZhbC5GKSB7XG5cdFx0XHRpc2VtcHR5ID0gZmFsc2U7XG5cdFx0XHR0eHQgPSAnPScgKyB2YWwuZjsgaWYodHh0LmluZGV4T2YoXCIsXCIpID49IDApIHR4dCA9ICdcIicgKyB0eHQucmVwbGFjZShxcmVnLCAnXCJcIicpICsgJ1wiJztcblx0XHR9IGVsc2UgdHh0ID0gXCJcIjtcblx0XHQvKiBOT1RFOiBFeGNlbCBDU1YgZG9lcyBub3Qgc3VwcG9ydCBhcnJheSBmb3JtdWxhZSAqL1xuXHRcdHJvdy5wdXNoKHR4dCk7XG5cdH1cblx0aWYoby5ibGFua3Jvd3MgPT09IGZhbHNlICYmIGlzZW1wdHkpIHJldHVybiBudWxsO1xuXHRyZXR1cm4gcm93LmpvaW4oRlMpO1xufVxuXG5mdW5jdGlvbiBzaGVldF90b19jc3Yoc2hlZXQsIG9wdHMpIHtcblx0dmFyIG91dCA9IFtdO1xuXHR2YXIgbyA9IG9wdHMgPT0gbnVsbCA/IHt9IDogb3B0cztcblx0aWYoc2hlZXQgPT0gbnVsbCB8fCBzaGVldFtcIiFyZWZcIl0gPT0gbnVsbCkgcmV0dXJuIFwiXCI7XG5cdHZhciByID0gc2FmZV9kZWNvZGVfcmFuZ2Uoc2hlZXRbXCIhcmVmXCJdKTtcblx0dmFyIEZTID0gby5GUyAhPT0gdW5kZWZpbmVkID8gby5GUyA6IFwiLFwiLCBmcyA9IEZTLmNoYXJDb2RlQXQoMCk7XG5cdHZhciBSUyA9IG8uUlMgIT09IHVuZGVmaW5lZCA/IG8uUlMgOiBcIlxcblwiLCBycyA9IFJTLmNoYXJDb2RlQXQoMCk7XG5cdHZhciBlbmRyZWdleCA9IG5ldyBSZWdFeHAoKEZTPT1cInxcIiA/IFwiXFxcXHxcIiA6IEZTKStcIiskXCIpO1xuXHR2YXIgcm93ID0gXCJcIiwgY29scyA9IFtdO1xuXHRvLmRlbnNlID0gQXJyYXkuaXNBcnJheShzaGVldCk7XG5cdHZhciBjb2xpbmZvID0gby5za2lwSGlkZGVuICYmIHNoZWV0W1wiIWNvbHNcIl0gfHwgW107XG5cdHZhciByb3dpbmZvID0gby5za2lwSGlkZGVuICYmIHNoZWV0W1wiIXJvd3NcIl0gfHwgW107XG5cdGZvcih2YXIgQyA9IHIucy5jOyBDIDw9IHIuZS5jOyArK0MpIGlmICghKChjb2xpbmZvW0NdfHx7fSkuaGlkZGVuKSkgY29sc1tDXSA9IGVuY29kZV9jb2woQyk7XG5cdGZvcih2YXIgUiA9IHIucy5yOyBSIDw9IHIuZS5yOyArK1IpIHtcblx0XHRpZiAoKHJvd2luZm9bUl18fHt9KS5oaWRkZW4pIGNvbnRpbnVlO1xuXHRcdHJvdyA9IG1ha2VfY3N2X3JvdyhzaGVldCwgciwgUiwgY29scywgZnMsIHJzLCBGUywgbyk7XG5cdFx0aWYocm93ID09IG51bGwpIHsgY29udGludWU7IH1cblx0XHRpZihvLnN0cmlwKSByb3cgPSByb3cucmVwbGFjZShlbmRyZWdleCxcIlwiKTtcblx0XHRvdXQucHVzaChyb3cgKyBSUyk7XG5cdH1cblx0ZGVsZXRlIG8uZGVuc2U7XG5cdHJldHVybiBvdXQuam9pbihcIlwiKTtcbn1cblxuZnVuY3Rpb24gc2hlZXRfdG9fdHh0KHNoZWV0LCBvcHRzKSB7XG5cdGlmKCFvcHRzKSBvcHRzID0ge307IG9wdHMuRlMgPSBcIlxcdFwiOyBvcHRzLlJTID0gXCJcXG5cIjtcblx0dmFyIHMgPSBzaGVldF90b19jc3Yoc2hlZXQsIG9wdHMpO1xuXHRpZih0eXBlb2YgY3B0YWJsZSA9PSAndW5kZWZpbmVkJyB8fCBvcHRzLnR5cGUgPT0gJ3N0cmluZycpIHJldHVybiBzO1xuXHR2YXIgbyA9IGNwdGFibGUudXRpbHMuZW5jb2RlKDEyMDAsIHMsICdzdHInKTtcblx0cmV0dXJuIFN0cmluZy5mcm9tQ2hhckNvZGUoMjU1KSArIFN0cmluZy5mcm9tQ2hhckNvZGUoMjU0KSArIG87XG59XG5cbmZ1bmN0aW9uIHNoZWV0X3RvX2Zvcm11bGFlKHNoZWV0KSB7XG5cdHZhciB5ID0gXCJcIiwgeCwgdmFsPVwiXCI7XG5cdGlmKHNoZWV0ID09IG51bGwgfHwgc2hlZXRbXCIhcmVmXCJdID09IG51bGwpIHJldHVybiBbXTtcblx0dmFyIHIgPSBzYWZlX2RlY29kZV9yYW5nZShzaGVldFsnIXJlZiddKSwgcnIgPSBcIlwiLCBjb2xzID0gW10sIEM7XG5cdHZhciBjbWRzID0gW107XG5cdHZhciBkZW5zZSA9IEFycmF5LmlzQXJyYXkoc2hlZXQpO1xuXHRmb3IoQyA9IHIucy5jOyBDIDw9IHIuZS5jOyArK0MpIGNvbHNbQ10gPSBlbmNvZGVfY29sKEMpO1xuXHRmb3IodmFyIFIgPSByLnMucjsgUiA8PSByLmUucjsgKytSKSB7XG5cdFx0cnIgPSBlbmNvZGVfcm93KFIpO1xuXHRcdGZvcihDID0gci5zLmM7IEMgPD0gci5lLmM7ICsrQykge1xuXHRcdFx0eSA9IGNvbHNbQ10gKyBycjtcblx0XHRcdHggPSBkZW5zZSA/IChzaGVldFtSXXx8W10pW0NdIDogc2hlZXRbeV07XG5cdFx0XHR2YWwgPSBcIlwiO1xuXHRcdFx0aWYoeCA9PT0gdW5kZWZpbmVkKSBjb250aW51ZTtcblx0XHRcdGVsc2UgaWYoeC5GICE9IG51bGwpIHtcblx0XHRcdFx0eSA9IHguRjtcblx0XHRcdFx0aWYoIXguZikgY29udGludWU7XG5cdFx0XHRcdHZhbCA9IHguZjtcblx0XHRcdFx0aWYoeS5pbmRleE9mKFwiOlwiKSA9PSAtMSkgeSA9IHkgKyBcIjpcIiArIHk7XG5cdFx0XHR9XG5cdFx0XHRpZih4LmYgIT0gbnVsbCkgdmFsID0geC5mO1xuXHRcdFx0ZWxzZSBpZih4LnQgPT0gJ3onKSBjb250aW51ZTtcblx0XHRcdGVsc2UgaWYoeC50ID09ICduJyAmJiB4LnYgIT0gbnVsbCkgdmFsID0gXCJcIiArIHgudjtcblx0XHRcdGVsc2UgaWYoeC50ID09ICdiJykgdmFsID0geC52ID8gXCJUUlVFXCIgOiBcIkZBTFNFXCI7XG5cdFx0XHRlbHNlIGlmKHgudyAhPT0gdW5kZWZpbmVkKSB2YWwgPSBcIidcIiArIHgudztcblx0XHRcdGVsc2UgaWYoeC52ID09PSB1bmRlZmluZWQpIGNvbnRpbnVlO1xuXHRcdFx0ZWxzZSBpZih4LnQgPT0gJ3MnKSB2YWwgPSBcIidcIiArIHgudjtcblx0XHRcdGVsc2UgdmFsID0gXCJcIit4LnY7XG5cdFx0XHRjbWRzW2NtZHMubGVuZ3RoXSA9IHkgKyBcIj1cIiArIHZhbDtcblx0XHR9XG5cdH1cblx0cmV0dXJuIGNtZHM7XG59XG5cbmZ1bmN0aW9uIHNoZWV0X2FkZF9qc29uKF93cywganMsIG9wdHMpIHtcblx0dmFyIG8gPSBvcHRzIHx8IHt9O1xuXHR2YXIgb2Zmc2V0ID0gKyFvLnNraXBIZWFkZXI7XG5cdHZhciB3cyA9IF93cyB8fCAoe30pO1xuXHR2YXIgX1IgPSAwLCBfQyA9IDA7XG5cdGlmKHdzICYmIG8ub3JpZ2luICE9IG51bGwpIHtcblx0XHRpZih0eXBlb2Ygby5vcmlnaW4gPT0gJ251bWJlcicpIF9SID0gby5vcmlnaW47XG5cdFx0ZWxzZSB7XG5cdFx0XHR2YXIgX29yaWdpbiA9IHR5cGVvZiBvLm9yaWdpbiA9PSBcInN0cmluZ1wiID8gZGVjb2RlX2NlbGwoby5vcmlnaW4pIDogby5vcmlnaW47XG5cdFx0XHRfUiA9IF9vcmlnaW4ucjsgX0MgPSBfb3JpZ2luLmM7XG5cdFx0fVxuXHR9XG5cdHZhciBjZWxsO1xuXHR2YXIgcmFuZ2UgPSAoe3M6IHtjOjAsIHI6MH0sIGU6IHtjOl9DLCByOl9SICsganMubGVuZ3RoIC0gMSArIG9mZnNldH19KTtcblx0aWYod3NbJyFyZWYnXSkge1xuXHRcdHZhciBfcmFuZ2UgPSBzYWZlX2RlY29kZV9yYW5nZSh3c1snIXJlZiddKTtcblx0XHRyYW5nZS5lLmMgPSBNYXRoLm1heChyYW5nZS5lLmMsIF9yYW5nZS5lLmMpO1xuXHRcdHJhbmdlLmUuciA9IE1hdGgubWF4KHJhbmdlLmUuciwgX3JhbmdlLmUucik7XG5cdFx0aWYoX1IgPT0gLTEpIHsgX1IgPSBfcmFuZ2UuZS5yICsgMTsgcmFuZ2UuZS5yID0gX1IgKyBqcy5sZW5ndGggLSAxICsgb2Zmc2V0OyB9XG5cdH0gZWxzZSB7XG5cdFx0aWYoX1IgPT0gLTEpIHsgX1IgPSAwOyByYW5nZS5lLnIgPSBqcy5sZW5ndGggLSAxICsgb2Zmc2V0OyB9XG5cdH1cblx0dmFyIGhkciA9IG8uaGVhZGVyIHx8IFtdLCBDID0gMDtcblxuXHRqcy5mb3JFYWNoKGZ1bmN0aW9uIChKUywgUikge1xuXHRcdGtleXMoSlMpLmZvckVhY2goZnVuY3Rpb24oaykge1xuXHRcdFx0aWYoKEM9aGRyLmluZGV4T2YoaykpID09IC0xKSBoZHJbQz1oZHIubGVuZ3RoXSA9IGs7XG5cdFx0XHR2YXIgdiA9IEpTW2tdO1xuXHRcdFx0dmFyIHQgPSAneic7XG5cdFx0XHR2YXIgeiA9IFwiXCI7XG5cdFx0XHR2YXIgcmVmID0gZW5jb2RlX2NlbGwoe2M6X0MgKyBDLHI6X1IgKyBSICsgb2Zmc2V0fSk7XG5cdFx0XHRjZWxsID0gdXRpbHMuc2hlZXRfZ2V0X2NlbGwod3MsIHJlZik7XG5cdFx0XHRpZih2ICYmIHR5cGVvZiB2ID09PSAnb2JqZWN0JyAmJiAhKHYgaW5zdGFuY2VvZiBEYXRlKSl7XG5cdFx0XHRcdHdzW3JlZl0gPSB2O1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0aWYodHlwZW9mIHYgPT0gJ251bWJlcicpIHQgPSAnbic7XG5cdFx0XHRcdGVsc2UgaWYodHlwZW9mIHYgPT0gJ2Jvb2xlYW4nKSB0ID0gJ2InO1xuXHRcdFx0XHRlbHNlIGlmKHR5cGVvZiB2ID09ICdzdHJpbmcnKSB0ID0gJ3MnO1xuXHRcdFx0XHRlbHNlIGlmKHYgaW5zdGFuY2VvZiBEYXRlKSB7XG5cdFx0XHRcdFx0dCA9ICdkJztcblx0XHRcdFx0XHRpZighby5jZWxsRGF0ZXMpIHsgdCA9ICduJzsgdiA9IGRhdGVudW0odik7IH1cblx0XHRcdFx0XHR6ID0gKG8uZGF0ZU5GIHx8IFNTRi5fdGFibGVbMTRdKTtcblx0XHRcdFx0fVxuXHRcdFx0XHRpZighY2VsbCkgd3NbcmVmXSA9IGNlbGwgPSAoe3Q6dCwgdjp2fSk7XG5cdFx0XHRcdGVsc2Uge1xuXHRcdFx0XHRcdGNlbGwudCA9IHQ7IGNlbGwudiA9IHY7XG5cdFx0XHRcdFx0ZGVsZXRlIGNlbGwudzsgZGVsZXRlIGNlbGwuUjtcblx0XHRcdFx0XHRpZih6KSBjZWxsLnogPSB6O1xuXHRcdFx0XHR9XG5cdFx0XHRcdGlmKHopIGNlbGwueiA9IHo7XG5cdFx0XHR9XG5cdFx0fSk7XG5cdH0pO1xuXHRyYW5nZS5lLmMgPSBNYXRoLm1heChyYW5nZS5lLmMsIF9DICsgaGRyLmxlbmd0aCAtIDEpO1xuXHR2YXIgX19SID0gZW5jb2RlX3JvdyhfUik7XG5cdGlmKG9mZnNldCkgZm9yKEMgPSAwOyBDIDwgaGRyLmxlbmd0aDsgKytDKSB3c1tlbmNvZGVfY29sKEMgKyBfQykgKyBfX1JdID0ge3Q6J3MnLCB2OmhkcltDXX07XG5cdHdzWychcmVmJ10gPSBlbmNvZGVfcmFuZ2UocmFuZ2UpO1xuXHRyZXR1cm4gd3M7XG59XG5mdW5jdGlvbiBqc29uX3RvX3NoZWV0KGpzLCBvcHRzKSB7IHJldHVybiBzaGVldF9hZGRfanNvbihudWxsLCBqcywgb3B0cyk7IH1cblxudmFyIHV0aWxzID0ge1xuXHRlbmNvZGVfY29sOiBlbmNvZGVfY29sLFxuXHRlbmNvZGVfcm93OiBlbmNvZGVfcm93LFxuXHRlbmNvZGVfY2VsbDogZW5jb2RlX2NlbGwsXG5cdGVuY29kZV9yYW5nZTogZW5jb2RlX3JhbmdlLFxuXHRkZWNvZGVfY29sOiBkZWNvZGVfY29sLFxuXHRkZWNvZGVfcm93OiBkZWNvZGVfcm93LFxuXHRzcGxpdF9jZWxsOiBzcGxpdF9jZWxsLFxuXHRkZWNvZGVfY2VsbDogZGVjb2RlX2NlbGwsXG5cdGRlY29kZV9yYW5nZTogZGVjb2RlX3JhbmdlLFxuXHRmb3JtYXRfY2VsbDogZm9ybWF0X2NlbGwsXG5cdGdldF9mb3JtdWxhZTogc2hlZXRfdG9fZm9ybXVsYWUsXG5cdG1ha2VfY3N2OiBzaGVldF90b19jc3YsXG5cdG1ha2VfanNvbjogc2hlZXRfdG9fanNvbixcblx0bWFrZV9mb3JtdWxhZTogc2hlZXRfdG9fZm9ybXVsYWUsXG5cdHNoZWV0X2FkZF9hb2E6IHNoZWV0X2FkZF9hb2EsXG5cdHNoZWV0X2FkZF9qc29uOiBzaGVldF9hZGRfanNvbixcblx0c2hlZXRfYWRkX2RvbTogc2hlZXRfYWRkX2RvbSxcblx0YW9hX3RvX3NoZWV0OiBhb2FfdG9fc2hlZXQsXG5cdGpzb25fdG9fc2hlZXQ6IGpzb25fdG9fc2hlZXQsXG5cdHRhYmxlX3RvX3NoZWV0OiBwYXJzZV9kb21fdGFibGUsXG5cdHRhYmxlX3RvX2Jvb2s6IHRhYmxlX3RvX2Jvb2ssXG5cdHNoZWV0X3RvX2Nzdjogc2hlZXRfdG9fY3N2LFxuXHRzaGVldF90b190eHQ6IHNoZWV0X3RvX3R4dCxcblx0c2hlZXRfdG9fanNvbjogc2hlZXRfdG9fanNvbixcblx0c2hlZXRfdG9faHRtbDogSFRNTF8uZnJvbV9zaGVldCxcblx0c2hlZXRfdG9fZm9ybXVsYWU6IHNoZWV0X3RvX2Zvcm11bGFlLFxuXHRzaGVldF90b19yb3dfb2JqZWN0X2FycmF5OiBzaGVldF90b19qc29uXG59O1xuXG4oZnVuY3Rpb24odXRpbHMpIHtcbnV0aWxzLmNvbnN0cyA9IHV0aWxzLmNvbnN0cyB8fCB7fTtcbmZ1bmN0aW9uIGFkZF9jb25zdHMoUi8qQXJyYXk8YW55PiovKSB7IFIuZm9yRWFjaChmdW5jdGlvbihhKXsgdXRpbHMuY29uc3RzW2FbMF1dID0gYVsxXTsgfSk7IH1cblxuZnVuY3Rpb24gZ2V0X2RlZmF1bHQoeCwgeSwgeikgeyByZXR1cm4geFt5XSAhPSBudWxsID8geFt5XSA6ICh4W3ldID0geik7IH1cblxuLyogZ2V0IGNlbGwsIGNyZWF0aW5nIGEgc3R1YiBpZiBuZWNlc3NhcnkgKi9cbmZ1bmN0aW9uIHdzX2dldF9jZWxsX3N0dWIod3MsIFIsIEMpIHtcblx0LyogQTEgY2VsbCBhZGRyZXNzICovXG5cdGlmKHR5cGVvZiBSID09IFwic3RyaW5nXCIpIHtcblx0XHQvKiBkZW5zZSAqL1xuXHRcdGlmKEFycmF5LmlzQXJyYXkod3MpKSB7XG5cdFx0XHR2YXIgUkMgPSBkZWNvZGVfY2VsbChSKTtcblx0XHRcdGlmKCF3c1tSQy5yXSkgd3NbUkMucl0gPSBbXTtcblx0XHRcdHJldHVybiB3c1tSQy5yXVtSQy5jXSB8fCAod3NbUkMucl1bUkMuY10gPSB7dDoneid9KTtcblx0XHR9XG5cdFx0cmV0dXJuIHdzW1JdIHx8ICh3c1tSXSA9IHt0Oid6J30pO1xuXHR9XG5cdC8qIGNlbGwgYWRkcmVzcyBvYmplY3QgKi9cblx0aWYodHlwZW9mIFIgIT0gXCJudW1iZXJcIikgcmV0dXJuIHdzX2dldF9jZWxsX3N0dWIod3MsIGVuY29kZV9jZWxsKFIpKTtcblx0LyogUiBhbmQgQyBhcmUgMC1iYXNlZCBpbmRpY2VzICovXG5cdHJldHVybiB3c19nZXRfY2VsbF9zdHViKHdzLCBlbmNvZGVfY2VsbCh7cjpSLGM6Q3x8MH0pKTtcbn1cbnV0aWxzLnNoZWV0X2dldF9jZWxsID0gd3NfZ2V0X2NlbGxfc3R1YjtcblxuLyogZmluZCBzaGVldCBpbmRleCBmb3IgZ2l2ZW4gbmFtZSAvIHZhbGlkYXRlIGluZGV4ICovXG5mdW5jdGlvbiB3Yl9zaGVldF9pZHgod2IsIHNoKSB7XG5cdGlmKHR5cGVvZiBzaCA9PSBcIm51bWJlclwiKSB7XG5cdFx0aWYoc2ggPj0gMCAmJiB3Yi5TaGVldE5hbWVzLmxlbmd0aCA+IHNoKSByZXR1cm4gc2g7XG5cdFx0dGhyb3cgbmV3IEVycm9yKFwiQ2Fubm90IGZpbmQgc2hlZXQgIyBcIiArIHNoKTtcblx0fSBlbHNlIGlmKHR5cGVvZiBzaCA9PSBcInN0cmluZ1wiKSB7XG5cdFx0dmFyIGlkeCA9IHdiLlNoZWV0TmFtZXMuaW5kZXhPZihzaCk7XG5cdFx0aWYoaWR4ID4gLTEpIHJldHVybiBpZHg7XG5cdFx0dGhyb3cgbmV3IEVycm9yKFwiQ2Fubm90IGZpbmQgc2hlZXQgbmFtZSB8XCIgKyBzaCArIFwifFwiKTtcblx0fSBlbHNlIHRocm93IG5ldyBFcnJvcihcIkNhbm5vdCBmaW5kIHNoZWV0IHxcIiArIHNoICsgXCJ8XCIpO1xufVxuXG4vKiBzaW1wbGUgYmxhbmsgd29ya2Jvb2sgb2JqZWN0ICovXG51dGlscy5ib29rX25ldyA9IGZ1bmN0aW9uKCkge1xuXHRyZXR1cm4geyBTaGVldE5hbWVzOiBbXSwgU2hlZXRzOiB7fSB9O1xufTtcblxuLyogYWRkIGEgd29ya3NoZWV0IHRvIHRoZSBlbmQgb2YgYSBnaXZlbiB3b3JrYm9vayAqL1xudXRpbHMuYm9va19hcHBlbmRfc2hlZXQgPSBmdW5jdGlvbih3Yiwgd3MsIG5hbWUpIHtcblx0aWYoIW5hbWUpIGZvcih2YXIgaSA9IDE7IGkgPD0gMHhGRkZGOyArK2ksIG5hbWUgPSB1bmRlZmluZWQpIGlmKHdiLlNoZWV0TmFtZXMuaW5kZXhPZihuYW1lID0gXCJTaGVldFwiICsgaSkgPT0gLTEpIGJyZWFrO1xuXHRpZighbmFtZSB8fCB3Yi5TaGVldE5hbWVzLmxlbmd0aCA+PSAweEZGRkYpIHRocm93IG5ldyBFcnJvcihcIlRvbyBtYW55IHdvcmtzaGVldHNcIik7XG5cdGNoZWNrX3dzX25hbWUobmFtZSk7XG5cdGlmKHdiLlNoZWV0TmFtZXMuaW5kZXhPZihuYW1lKSA+PSAwKSB0aHJvdyBuZXcgRXJyb3IoXCJXb3Jrc2hlZXQgd2l0aCBuYW1lIHxcIiArIG5hbWUgKyBcInwgYWxyZWFkeSBleGlzdHMhXCIpO1xuXG5cdHdiLlNoZWV0TmFtZXMucHVzaChuYW1lKTtcblx0d2IuU2hlZXRzW25hbWVdID0gd3M7XG59O1xuXG4vKiBzZXQgc2hlZXQgdmlzaWJpbGl0eSAodmlzaWJsZS9oaWRkZW4vdmVyeSBoaWRkZW4pICovXG51dGlscy5ib29rX3NldF9zaGVldF92aXNpYmlsaXR5ID0gZnVuY3Rpb24od2IsIHNoLCB2aXMpIHtcblx0Z2V0X2RlZmF1bHQod2IsXCJXb3JrYm9va1wiLHt9KTtcblx0Z2V0X2RlZmF1bHQod2IuV29ya2Jvb2ssXCJTaGVldHNcIixbXSk7XG5cblx0dmFyIGlkeCA9IHdiX3NoZWV0X2lkeCh3Yiwgc2gpO1xuXHQvLyAkRmxvd0lnbm9yZVxuXHRnZXRfZGVmYXVsdCh3Yi5Xb3JrYm9vay5TaGVldHMsaWR4LCB7fSk7XG5cblx0c3dpdGNoKHZpcykge1xuXHRcdGNhc2UgMDogY2FzZSAxOiBjYXNlIDI6IGJyZWFrO1xuXHRcdGRlZmF1bHQ6IHRocm93IG5ldyBFcnJvcihcIkJhZCBzaGVldCB2aXNpYmlsaXR5IHNldHRpbmcgXCIgKyB2aXMpO1xuXHR9XG5cdC8vICRGbG93SWdub3JlXG5cdHdiLldvcmtib29rLlNoZWV0c1tpZHhdLkhpZGRlbiA9IHZpcztcbn07XG5hZGRfY29uc3RzKFtcblx0W1wiU0hFRVRfVklTSUJMRVwiLCAwXSxcblx0W1wiU0hFRVRfSElEREVOXCIsIDFdLFxuXHRbXCJTSEVFVF9WRVJZX0hJRERFTlwiLCAyXVxuXSk7XG5cbi8qIHNldCBudW1iZXIgZm9ybWF0ICovXG51dGlscy5jZWxsX3NldF9udW1iZXJfZm9ybWF0ID0gZnVuY3Rpb24oY2VsbCwgZm10KSB7XG5cdGNlbGwueiA9IGZtdDtcblx0cmV0dXJuIGNlbGw7XG59O1xuXG4vKiBzZXQgY2VsbCBoeXBlcmxpbmsgKi9cbnV0aWxzLmNlbGxfc2V0X2h5cGVybGluayA9IGZ1bmN0aW9uKGNlbGwsIHRhcmdldCwgdG9vbHRpcCkge1xuXHRpZighdGFyZ2V0KSB7XG5cdFx0ZGVsZXRlIGNlbGwubDtcblx0fSBlbHNlIHtcblx0XHRjZWxsLmwgPSAoeyBUYXJnZXQ6IHRhcmdldCB9KTtcblx0XHRpZih0b29sdGlwKSBjZWxsLmwuVG9vbHRpcCA9IHRvb2x0aXA7XG5cdH1cblx0cmV0dXJuIGNlbGw7XG59O1xudXRpbHMuY2VsbF9zZXRfaW50ZXJuYWxfbGluayA9IGZ1bmN0aW9uKGNlbGwsIHJhbmdlLCB0b29sdGlwKSB7IHJldHVybiB1dGlscy5jZWxsX3NldF9oeXBlcmxpbmsoY2VsbCwgXCIjXCIgKyByYW5nZSwgdG9vbHRpcCk7IH07XG5cbi8qIGFkZCB0byBjZWxsIGNvbW1lbnRzICovXG51dGlscy5jZWxsX2FkZF9jb21tZW50ID0gZnVuY3Rpb24oY2VsbCwgdGV4dCwgYXV0aG9yKSB7XG5cdGlmKCFjZWxsLmMpIGNlbGwuYyA9IFtdO1xuXHRjZWxsLmMucHVzaCh7dDp0ZXh0LCBhOmF1dGhvcnx8XCJTaGVldEpTXCJ9KTtcbn07XG5cbi8qIHNldCBhcnJheSBmb3JtdWxhIGFuZCBmbHVzaCByZWxhdGVkIGNlbGxzICovXG51dGlscy5zaGVldF9zZXRfYXJyYXlfZm9ybXVsYSA9IGZ1bmN0aW9uKHdzLCByYW5nZSwgZm9ybXVsYSkge1xuXHR2YXIgcm5nID0gdHlwZW9mIHJhbmdlICE9IFwic3RyaW5nXCIgPyByYW5nZSA6IHNhZmVfZGVjb2RlX3JhbmdlKHJhbmdlKTtcblx0dmFyIHJuZ3N0ciA9IHR5cGVvZiByYW5nZSA9PSBcInN0cmluZ1wiID8gcmFuZ2UgOiBlbmNvZGVfcmFuZ2UocmFuZ2UpO1xuXHRmb3IodmFyIFIgPSBybmcucy5yOyBSIDw9IHJuZy5lLnI7ICsrUikgZm9yKHZhciBDID0gcm5nLnMuYzsgQyA8PSBybmcuZS5jOyArK0MpIHtcblx0XHR2YXIgY2VsbCA9IHdzX2dldF9jZWxsX3N0dWIod3MsIFIsIEMpO1xuXHRcdGNlbGwudCA9ICduJztcblx0XHRjZWxsLkYgPSBybmdzdHI7XG5cdFx0ZGVsZXRlIGNlbGwudjtcblx0XHRpZihSID09IHJuZy5zLnIgJiYgQyA9PSBybmcucy5jKSBjZWxsLmYgPSBmb3JtdWxhO1xuXHR9XG5cdHJldHVybiB3cztcbn07XG5cbnJldHVybiB1dGlscztcbn0pKHV0aWxzKTtcblxuaWYoaGFzX2J1ZiAmJiB0eXBlb2YgcmVxdWlyZSAhPSAndW5kZWZpbmVkJykgKGZ1bmN0aW9uKCkge1xuXHR2YXIgUmVhZGFibGUgPSByZXF1aXJlKCdzdHJlYW0nKS5SZWFkYWJsZTtcblxuXHR2YXIgd3JpdGVfY3N2X3N0cmVhbSA9IGZ1bmN0aW9uKHNoZWV0LCBvcHRzKSB7XG5cdFx0dmFyIHN0cmVhbSA9IFJlYWRhYmxlKCk7XG5cdFx0dmFyIG8gPSBvcHRzID09IG51bGwgPyB7fSA6IG9wdHM7XG5cdFx0aWYoc2hlZXQgPT0gbnVsbCB8fCBzaGVldFtcIiFyZWZcIl0gPT0gbnVsbCkgeyBzdHJlYW0ucHVzaChudWxsKTsgcmV0dXJuIHN0cmVhbTsgfVxuXHRcdHZhciByID0gc2FmZV9kZWNvZGVfcmFuZ2Uoc2hlZXRbXCIhcmVmXCJdKTtcblx0XHR2YXIgRlMgPSBvLkZTICE9PSB1bmRlZmluZWQgPyBvLkZTIDogXCIsXCIsIGZzID0gRlMuY2hhckNvZGVBdCgwKTtcblx0XHR2YXIgUlMgPSBvLlJTICE9PSB1bmRlZmluZWQgPyBvLlJTIDogXCJcXG5cIiwgcnMgPSBSUy5jaGFyQ29kZUF0KDApO1xuXHRcdHZhciBlbmRyZWdleCA9IG5ldyBSZWdFeHAoKEZTPT1cInxcIiA/IFwiXFxcXHxcIiA6IEZTKStcIiskXCIpO1xuXHRcdHZhciByb3cgPSBcIlwiLCBjb2xzID0gW107XG5cdFx0by5kZW5zZSA9IEFycmF5LmlzQXJyYXkoc2hlZXQpO1xuXHRcdHZhciBjb2xpbmZvID0gby5za2lwSGlkZGVuICYmIHNoZWV0W1wiIWNvbHNcIl0gfHwgW107XG5cdFx0dmFyIHJvd2luZm8gPSBvLnNraXBIaWRkZW4gJiYgc2hlZXRbXCIhcm93c1wiXSB8fCBbXTtcblx0XHRmb3IodmFyIEMgPSByLnMuYzsgQyA8PSByLmUuYzsgKytDKSBpZiAoISgoY29saW5mb1tDXXx8e30pLmhpZGRlbikpIGNvbHNbQ10gPSBlbmNvZGVfY29sKEMpO1xuXHRcdHZhciBSID0gci5zLnI7XG5cdFx0dmFyIEJPTSA9IGZhbHNlO1xuXHRcdHN0cmVhbS5fcmVhZCA9IGZ1bmN0aW9uKCkge1xuXHRcdFx0aWYoIUJPTSkgeyBCT00gPSB0cnVlOyByZXR1cm4gc3RyZWFtLnB1c2goXCJcXHVGRUZGXCIpOyB9XG5cdFx0XHR3aGlsZShSIDw9IHIuZS5yKSB7XG5cdFx0XHRcdCsrUjtcblx0XHRcdFx0aWYgKChyb3dpbmZvW1ItMV18fHt9KS5oaWRkZW4pIGNvbnRpbnVlO1xuXHRcdFx0XHRyb3cgPSBtYWtlX2Nzdl9yb3coc2hlZXQsIHIsIFItMSwgY29scywgZnMsIHJzLCBGUywgbyk7XG5cdFx0XHRcdGlmKHJvdyAhPSBudWxsKSB7XG5cdFx0XHRcdFx0aWYoby5zdHJpcCkgcm93ID0gcm93LnJlcGxhY2UoZW5kcmVnZXgsXCJcIik7XG5cdFx0XHRcdFx0c3RyZWFtLnB1c2gocm93ICsgUlMpO1xuXHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0XHRpZihSID4gci5lLnIpIHJldHVybiBzdHJlYW0ucHVzaChudWxsKTtcblx0XHR9O1xuXHRcdHJldHVybiBzdHJlYW07XG5cdH07XG5cblx0dmFyIHdyaXRlX2h0bWxfc3RyZWFtID0gZnVuY3Rpb24od3MsIG9wdHMpIHtcblx0XHR2YXIgc3RyZWFtID0gUmVhZGFibGUoKTtcblxuXHRcdHZhciBvID0gb3B0cyB8fCB7fTtcblx0XHR2YXIgaGVhZGVyID0gby5oZWFkZXIgIT0gbnVsbCA/IG8uaGVhZGVyIDogSFRNTF8uQkVHSU47XG5cdFx0dmFyIGZvb3RlciA9IG8uZm9vdGVyICE9IG51bGwgPyBvLmZvb3RlciA6IEhUTUxfLkVORDtcblx0XHRzdHJlYW0ucHVzaChoZWFkZXIpO1xuXHRcdHZhciByID0gZGVjb2RlX3JhbmdlKHdzWychcmVmJ10pO1xuXHRcdG8uZGVuc2UgPSBBcnJheS5pc0FycmF5KHdzKTtcblx0XHRzdHJlYW0ucHVzaChIVE1MXy5fcHJlYW1ibGUod3MsIHIsIG8pKTtcblx0XHR2YXIgUiA9IHIucy5yO1xuXHRcdHZhciBlbmQgPSBmYWxzZTtcblx0XHRzdHJlYW0uX3JlYWQgPSBmdW5jdGlvbigpIHtcblx0XHRcdGlmKFIgPiByLmUucikge1xuXHRcdFx0XHRpZighZW5kKSB7IGVuZCA9IHRydWU7IHN0cmVhbS5wdXNoKFwiPC90YWJsZT5cIiArIGZvb3Rlcik7IH1cblx0XHRcdFx0cmV0dXJuIHN0cmVhbS5wdXNoKG51bGwpO1xuXHRcdFx0fVxuXHRcdFx0d2hpbGUoUiA8PSByLmUucikge1xuXHRcdFx0XHRzdHJlYW0ucHVzaChIVE1MXy5fcm93KHdzLCByLCBSLCBvKSk7XG5cdFx0XHRcdCsrUjtcblx0XHRcdFx0YnJlYWs7XG5cdFx0XHR9XG5cdFx0fTtcblx0XHRyZXR1cm4gc3RyZWFtO1xuXHR9O1xuXG5cdHZhciB3cml0ZV9qc29uX3N0cmVhbSA9IGZ1bmN0aW9uKHNoZWV0LCBvcHRzKSB7XG5cdFx0dmFyIHN0cmVhbSA9IFJlYWRhYmxlKHtvYmplY3RNb2RlOnRydWV9KTtcblxuXHRcdGlmKHNoZWV0ID09IG51bGwgfHwgc2hlZXRbXCIhcmVmXCJdID09IG51bGwpIHsgc3RyZWFtLnB1c2gobnVsbCk7IHJldHVybiBzdHJlYW07IH1cblx0XHR2YXIgdmFsID0ge3Q6J24nLHY6MH0sIGhlYWRlciA9IDAsIG9mZnNldCA9IDEsIGhkciA9IFtdLCB2PTAsIHZ2PVwiXCI7XG5cdFx0dmFyIHIgPSB7czp7cjowLGM6MH0sZTp7cjowLGM6MH19O1xuXHRcdHZhciBvID0gb3B0cyB8fCB7fTtcblx0XHR2YXIgcmFuZ2UgPSBvLnJhbmdlICE9IG51bGwgPyBvLnJhbmdlIDogc2hlZXRbXCIhcmVmXCJdO1xuXHRcdGlmKG8uaGVhZGVyID09PSAxKSBoZWFkZXIgPSAxO1xuXHRcdGVsc2UgaWYoby5oZWFkZXIgPT09IFwiQVwiKSBoZWFkZXIgPSAyO1xuXHRcdGVsc2UgaWYoQXJyYXkuaXNBcnJheShvLmhlYWRlcikpIGhlYWRlciA9IDM7XG5cdFx0c3dpdGNoKHR5cGVvZiByYW5nZSkge1xuXHRcdFx0Y2FzZSAnc3RyaW5nJzogciA9IHNhZmVfZGVjb2RlX3JhbmdlKHJhbmdlKTsgYnJlYWs7XG5cdFx0XHRjYXNlICdudW1iZXInOiByID0gc2FmZV9kZWNvZGVfcmFuZ2Uoc2hlZXRbXCIhcmVmXCJdKTsgci5zLnIgPSByYW5nZTsgYnJlYWs7XG5cdFx0XHRkZWZhdWx0OiByID0gcmFuZ2U7XG5cdFx0fVxuXHRcdGlmKGhlYWRlciA+IDApIG9mZnNldCA9IDA7XG5cdFx0dmFyIHJyID0gZW5jb2RlX3JvdyhyLnMucik7XG5cdFx0dmFyIGNvbHMgPSBbXTtcblx0XHR2YXIgY291bnRlciA9IDA7XG5cdFx0dmFyIGRlbnNlID0gQXJyYXkuaXNBcnJheShzaGVldCk7XG5cdFx0dmFyIFIgPSByLnMuciwgQyA9IDAsIENDID0gMDtcblx0XHRpZihkZW5zZSAmJiAhc2hlZXRbUl0pIHNoZWV0W1JdID0gW107XG5cdFx0Zm9yKEMgPSByLnMuYzsgQyA8PSByLmUuYzsgKytDKSB7XG5cdFx0XHRjb2xzW0NdID0gZW5jb2RlX2NvbChDKTtcblx0XHRcdHZhbCA9IGRlbnNlID8gc2hlZXRbUl1bQ10gOiBzaGVldFtjb2xzW0NdICsgcnJdO1xuXHRcdFx0c3dpdGNoKGhlYWRlcikge1xuXHRcdFx0XHRjYXNlIDE6IGhkcltDXSA9IEMgLSByLnMuYzsgYnJlYWs7XG5cdFx0XHRcdGNhc2UgMjogaGRyW0NdID0gY29sc1tDXTsgYnJlYWs7XG5cdFx0XHRcdGNhc2UgMzogaGRyW0NdID0gby5oZWFkZXJbQyAtIHIucy5jXTsgYnJlYWs7XG5cdFx0XHRcdGRlZmF1bHQ6XG5cdFx0XHRcdFx0aWYodmFsID09IG51bGwpIHZhbCA9IHt3OiBcIl9fRU1QVFlcIiwgdDogXCJzXCJ9O1xuXHRcdFx0XHRcdHZ2ID0gdiA9IGZvcm1hdF9jZWxsKHZhbCwgbnVsbCwgbyk7XG5cdFx0XHRcdFx0Y291bnRlciA9IDA7XG5cdFx0XHRcdFx0Zm9yKENDID0gMDsgQ0MgPCBoZHIubGVuZ3RoOyArK0NDKSBpZihoZHJbQ0NdID09IHZ2KSB2diA9IHYgKyBcIl9cIiArICgrK2NvdW50ZXIpO1xuXHRcdFx0XHRcdGhkcltDXSA9IHZ2O1xuXHRcdFx0fVxuXHRcdH1cblx0XHRSID0gci5zLnIgKyBvZmZzZXQ7XG5cdFx0c3RyZWFtLl9yZWFkID0gZnVuY3Rpb24oKSB7XG5cdFx0XHRpZihSID4gci5lLnIpIHJldHVybiBzdHJlYW0ucHVzaChudWxsKTtcblx0XHRcdHdoaWxlKFIgPD0gci5lLnIpIHtcblx0XHRcdFx0Ly9pZiAoKHJvd2luZm9bUi0xXXx8e30pLmhpZGRlbikgY29udGludWU7XG5cdFx0XHRcdHZhciByb3cgPSBtYWtlX2pzb25fcm93KHNoZWV0LCByLCBSLCBjb2xzLCBoZWFkZXIsIGhkciwgZGVuc2UsIG8pO1xuXHRcdFx0XHQrK1I7XG5cdFx0XHRcdGlmKChyb3cuaXNlbXB0eSA9PT0gZmFsc2UpIHx8IChoZWFkZXIgPT09IDEgPyBvLmJsYW5rcm93cyAhPT0gZmFsc2UgOiAhIW8uYmxhbmtyb3dzKSkge1xuXHRcdFx0XHRcdHN0cmVhbS5wdXNoKHJvdy5yb3cpO1xuXHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fTtcblx0XHRyZXR1cm4gc3RyZWFtO1xuXHR9O1xuXG5cdFhMU1guc3RyZWFtID0ge1xuXHRcdHRvX2pzb246IHdyaXRlX2pzb25fc3RyZWFtLFxuXHRcdHRvX2h0bWw6IHdyaXRlX2h0bWxfc3RyZWFtLFxuXHRcdHRvX2Nzdjogd3JpdGVfY3N2X3N0cmVhbVxuXHR9O1xufSkoKTtcblxuaWYodHlwZW9mIHBhcnNlX3hsc2NmYiAhPT0gXCJ1bmRlZmluZWRcIikgWExTWC5wYXJzZV94bHNjZmIgPSBwYXJzZV94bHNjZmI7XG5YTFNYLnBhcnNlX3ppcCA9IHBhcnNlX3ppcDtcblhMU1gucmVhZCA9IHJlYWRTeW5jOyAvL3hsc3JlYWRcblhMU1gucmVhZEZpbGUgPSByZWFkRmlsZVN5bmM7IC8vcmVhZEZpbGVcblhMU1gucmVhZEZpbGVTeW5jID0gcmVhZEZpbGVTeW5jO1xuWExTWC53cml0ZSA9IHdyaXRlU3luYztcblhMU1gud3JpdGVGaWxlID0gd3JpdGVGaWxlU3luYztcblhMU1gud3JpdGVGaWxlU3luYyA9IHdyaXRlRmlsZVN5bmM7XG5YTFNYLndyaXRlRmlsZUFzeW5jID0gd3JpdGVGaWxlQXN5bmM7XG5YTFNYLnV0aWxzID0gdXRpbHM7XG5YTFNYLlNTRiA9IFNTRjtcbmlmKHR5cGVvZiBDRkIgIT09IFwidW5kZWZpbmVkXCIpIFhMU1guQ0ZCID0gQ0ZCO1xufVxuLypnbG9iYWwgZGVmaW5lICovXG5pZih0eXBlb2YgZXhwb3J0cyAhPT0gJ3VuZGVmaW5lZCcpIG1ha2VfeGxzeF9saWIoZXhwb3J0cyk7XG5lbHNlIGlmKHR5cGVvZiBtb2R1bGUgIT09ICd1bmRlZmluZWQnICYmIG1vZHVsZS5leHBvcnRzKSBtYWtlX3hsc3hfbGliKG1vZHVsZS5leHBvcnRzKTtcbmVsc2UgaWYodHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kKSBkZWZpbmUoZnVuY3Rpb24oKSB7IGlmKCFYTFNYLnZlcnNpb24pIG1ha2VfeGxzeF9saWIoWExTWCk7IHJldHVybiBYTFNYOyB9KTtcbmVsc2UgbWFrZV94bHN4X2xpYihYTFNYKTtcbi8qZXhwb3J0ZWQgWExTLCBPRFMgKi9cbnZhciBYTFMgPSBYTFNYLCBPRFMgPSBYTFNYO1xuIl0sInNvdXJjZVJvb3QiOiIifQ==