|
- (self["webpackChunk"] = self["webpackChunk"] || []).push([["vendors-node_modules_xlsx_xlsx_js"],{
-
- /***/ "./node_modules/xlsx/dist/cpexcel.js":
- /*!*******************************************!*\
- !*** ./node_modules/xlsx/dist/cpexcel.js ***!
- \*******************************************/
- /***/ (function(module) {
-
- /*! cpexcel.js (C) 2013-present SheetJS -- http://sheetjs.com */
- /*jshint -W100 */
- var cptable = {version:"1.15.0"};
- 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 }; })();
- 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 }; })();
- 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 }; })();
- 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 }; })();
- 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 }; })();
- 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 }; })();
- 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 }; })();
- 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 }; })();
- 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 }; })();
- 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 }; })();
- 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 }; })();
- cptable[932] = (function(){ var d = [], e = {}, D = [], j;
- 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("");
- 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];}
- D[129] = "���������������������������������������������������������������� 、。,.・:;?!゛゜´`¨^ ̄_ヽヾゝゞ〃仝々〆〇ー―‐/\~∥|…‥‘’“”()〔〕[]{}〈〉《》「」『』【】+-±×�÷=≠<>≦≧∞∴♂♀°′″℃¥$¢£%#&*@§☆★○●◎◇◆□■△▲▽▼※〒→←↑↓〓�����������∈∋⊆⊇⊂⊃∪∩��������∧∨¬⇒⇔∀∃�����������∠⊥⌒∂∇≡≒≪≫√∽∝∵∫∬�������ʼn♯♭♪†‡¶����◯���".split("");
- 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];}
- D[130] = "�������������������������������������������������������������������������������0123456789�������ABCDEFGHIJKLMNOPQRSTUVWXYZ�������abcdefghijklmnopqrstuvwxyz����ぁあぃいぅうぇえぉおかがきぎくぐけげこごさざしじすずせぜそぞただちぢっつづてでとどなにぬねのはばぱひびぴふぶぷへべぺほぼぽまみむめもゃやゅゆょよらりるれろゎわゐゑをん��������������".split("");
- 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];}
- D[131] = "����������������������������������������������������������������ァアィイゥウェエォオカガキギクグケゲコゴサザシジスズセゼソゾタダチヂッツヅテデトドナニヌネノハバパヒビピフブプヘベペホボポマミ�ムメモャヤュユョヨラリルレロヮワヰヱヲンヴヵヶ��������ΑΒΓΔΕΖΗΘΙΚΛΜΝΞΟΠΡΣΤΥΦΧΨΩ��������αβγδεζηθικλμνξοπρστυφχψω�����������������������������������������".split("");
- 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];}
- D[132] = "����������������������������������������������������������������АБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯ���������������абвгдеёжзийклмн�опрстуфхцчшщъыьэюя�������������─│┌┐┘└├┬┤┴┼━┃┏┓┛┗┣┳┫┻╋┠┯┨┷┿┝┰┥┸╂�����������������������������������������������������������������".split("");
- 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];}
- D[135] = "����������������������������������������������������������������①②③④⑤⑥⑦⑧⑨⑩⑪⑫⑬⑭⑮⑯⑰⑱⑲⑳ⅠⅡⅢⅣⅤⅥⅦⅧⅨⅩ�㍉㌔㌢㍍㌘㌧㌃㌶㍑㍗㌍㌦㌣㌫㍊㌻㎜㎝㎞㎎㎏㏄㎡��������㍻�〝〟№㏍℡㊤㊥㊦㊧㊨㈱㈲㈹㍾㍽㍼≒≡∫∮∑√⊥∠∟⊿∵∩∪���������������������������������������������������������������������������������������������������".split("");
- 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];}
- D[136] = "���������������������������������������������������������������������������������������������������������������������������������������������������������������亜唖娃阿哀愛挨姶逢葵茜穐悪握渥旭葦芦鯵梓圧斡扱宛姐虻飴絢綾鮎或粟袷安庵按暗案闇鞍杏以伊位依偉囲夷委威尉惟意慰易椅為畏異移維緯胃萎衣謂違遺医井亥域育郁磯一壱溢逸稲茨芋鰯允印咽員因姻引飲淫胤蔭���".split("");
- 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];}
- D[137] = "����������������������������������������������������������������院陰隠韻吋右宇烏羽迂雨卯鵜窺丑碓臼渦嘘唄欝蔚鰻姥厩浦瓜閏噂云運雲荏餌叡営嬰影映曳栄永泳洩瑛盈穎頴英衛詠鋭液疫益駅悦謁越閲榎厭円�園堰奄宴延怨掩援沿演炎焔煙燕猿縁艶苑薗遠鉛鴛塩於汚甥凹央奥往応押旺横欧殴王翁襖鴬鴎黄岡沖荻億屋憶臆桶牡乙俺卸恩温穏音下化仮何伽価佳加可嘉夏嫁家寡科暇果架歌河火珂禍禾稼箇花苛茄荷華菓蝦課嘩貨迦過霞蚊俄峨我牙画臥芽蛾賀雅餓駕介会解回塊壊廻快怪悔恢懐戒拐改���".split("");
- 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];}
- D[138] = "����������������������������������������������������������������魁晦械海灰界皆絵芥蟹開階貝凱劾外咳害崖慨概涯碍蓋街該鎧骸浬馨蛙垣柿蛎鈎劃嚇各廓拡撹格核殻獲確穫覚角赫較郭閣隔革学岳楽額顎掛笠樫�橿梶鰍潟割喝恰括活渇滑葛褐轄且鰹叶椛樺鞄株兜竃蒲釜鎌噛鴨栢茅萱粥刈苅瓦乾侃冠寒刊勘勧巻喚堪姦完官寛干幹患感慣憾換敢柑桓棺款歓汗漢澗潅環甘監看竿管簡緩缶翰肝艦莞観諌貫還鑑間閑関陥韓館舘丸含岸巌玩癌眼岩翫贋雁頑顔願企伎危喜器基奇嬉寄岐希幾忌揮机旗既期棋棄���".split("");
- 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];}
- D[139] = "����������������������������������������������������������������機帰毅気汽畿祈季稀紀徽規記貴起軌輝飢騎鬼亀偽儀妓宜戯技擬欺犠疑祇義蟻誼議掬菊鞠吉吃喫桔橘詰砧杵黍却客脚虐逆丘久仇休及吸宮弓急救�朽求汲泣灸球究窮笈級糾給旧牛去居巨拒拠挙渠虚許距鋸漁禦魚亨享京供侠僑兇競共凶協匡卿叫喬境峡強彊怯恐恭挟教橋況狂狭矯胸脅興蕎郷鏡響饗驚仰凝尭暁業局曲極玉桐粁僅勤均巾錦斤欣欽琴禁禽筋緊芹菌衿襟謹近金吟銀九倶句区狗玖矩苦躯駆駈駒具愚虞喰空偶寓遇隅串櫛釧屑屈���".split("");
- 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];}
- D[140] = "����������������������������������������������������������������掘窟沓靴轡窪熊隈粂栗繰桑鍬勲君薫訓群軍郡卦袈祁係傾刑兄啓圭珪型契形径恵慶慧憩掲携敬景桂渓畦稽系経継繋罫茎荊蛍計詣警軽頚鶏芸迎鯨�劇戟撃激隙桁傑欠決潔穴結血訣月件倹倦健兼券剣喧圏堅嫌建憲懸拳捲検権牽犬献研硯絹県肩見謙賢軒遣鍵険顕験鹸元原厳幻弦減源玄現絃舷言諺限乎個古呼固姑孤己庫弧戸故枯湖狐糊袴股胡菰虎誇跨鈷雇顧鼓五互伍午呉吾娯後御悟梧檎瑚碁語誤護醐乞鯉交佼侯候倖光公功効勾厚口向���".split("");
- 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];}
- D[141] = "����������������������������������������������������������������后喉坑垢好孔孝宏工巧巷幸広庚康弘恒慌抗拘控攻昂晃更杭校梗構江洪浩港溝甲皇硬稿糠紅紘絞綱耕考肯肱腔膏航荒行衡講貢購郊酵鉱砿鋼閤降�項香高鴻剛劫号合壕拷濠豪轟麹克刻告国穀酷鵠黒獄漉腰甑忽惚骨狛込此頃今困坤墾婚恨懇昏昆根梱混痕紺艮魂些佐叉唆嵯左差査沙瑳砂詐鎖裟坐座挫債催再最哉塞妻宰彩才採栽歳済災采犀砕砦祭斎細菜裁載際剤在材罪財冴坂阪堺榊肴咲崎埼碕鷺作削咋搾昨朔柵窄策索錯桜鮭笹匙冊刷���".split("");
- 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];}
- D[142] = "����������������������������������������������������������������察拶撮擦札殺薩雑皐鯖捌錆鮫皿晒三傘参山惨撒散桟燦珊産算纂蚕讃賛酸餐斬暫残仕仔伺使刺司史嗣四士始姉姿子屍市師志思指支孜斯施旨枝止�死氏獅祉私糸紙紫肢脂至視詞詩試誌諮資賜雌飼歯事似侍児字寺慈持時次滋治爾璽痔磁示而耳自蒔辞汐鹿式識鴫竺軸宍雫七叱執失嫉室悉湿漆疾質実蔀篠偲柴芝屡蕊縞舎写射捨赦斜煮社紗者謝車遮蛇邪借勺尺杓灼爵酌釈錫若寂弱惹主取守手朱殊狩珠種腫趣酒首儒受呪寿授樹綬需囚収周���".split("");
- 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];}
- D[143] = "����������������������������������������������������������������宗就州修愁拾洲秀秋終繍習臭舟蒐衆襲讐蹴輯週酋酬集醜什住充十従戎柔汁渋獣縦重銃叔夙宿淑祝縮粛塾熟出術述俊峻春瞬竣舜駿准循旬楯殉淳�準潤盾純巡遵醇順処初所暑曙渚庶緒署書薯藷諸助叙女序徐恕鋤除傷償勝匠升召哨商唱嘗奨妾娼宵将小少尚庄床廠彰承抄招掌捷昇昌昭晶松梢樟樵沼消渉湘焼焦照症省硝礁祥称章笑粧紹肖菖蒋蕉衝裳訟証詔詳象賞醤鉦鍾鐘障鞘上丈丞乗冗剰城場壌嬢常情擾条杖浄状畳穣蒸譲醸錠嘱埴飾���".split("");
- 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];}
- D[144] = "����������������������������������������������������������������拭植殖燭織職色触食蝕辱尻伸信侵唇娠寝審心慎振新晋森榛浸深申疹真神秦紳臣芯薪親診身辛進針震人仁刃塵壬尋甚尽腎訊迅陣靭笥諏須酢図厨�逗吹垂帥推水炊睡粋翠衰遂酔錐錘随瑞髄崇嵩数枢趨雛据杉椙菅頗雀裾澄摺寸世瀬畝是凄制勢姓征性成政整星晴棲栖正清牲生盛精聖声製西誠誓請逝醒青静斉税脆隻席惜戚斥昔析石積籍績脊責赤跡蹟碩切拙接摂折設窃節説雪絶舌蝉仙先千占宣専尖川戦扇撰栓栴泉浅洗染潜煎煽旋穿箭線���".split("");
- 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];}
- D[145] = "����������������������������������������������������������������繊羨腺舛船薦詮賎践選遷銭銑閃鮮前善漸然全禅繕膳糎噌塑岨措曾曽楚狙疏疎礎祖租粗素組蘇訴阻遡鼠僧創双叢倉喪壮奏爽宋層匝惣想捜掃挿掻�操早曹巣槍槽漕燥争痩相窓糟総綜聡草荘葬蒼藻装走送遭鎗霜騒像増憎臓蔵贈造促側則即息捉束測足速俗属賊族続卒袖其揃存孫尊損村遜他多太汰詑唾堕妥惰打柁舵楕陀駄騨体堆対耐岱帯待怠態戴替泰滞胎腿苔袋貸退逮隊黛鯛代台大第醍題鷹滝瀧卓啄宅托択拓沢濯琢託鐸濁諾茸凧蛸只���".split("");
- 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];}
- D[146] = "����������������������������������������������������������������叩但達辰奪脱巽竪辿棚谷狸鱈樽誰丹単嘆坦担探旦歎淡湛炭短端箪綻耽胆蛋誕鍛団壇弾断暖檀段男談値知地弛恥智池痴稚置致蜘遅馳築畜竹筑蓄�逐秩窒茶嫡着中仲宙忠抽昼柱注虫衷註酎鋳駐樗瀦猪苧著貯丁兆凋喋寵帖帳庁弔張彫徴懲挑暢朝潮牒町眺聴脹腸蝶調諜超跳銚長頂鳥勅捗直朕沈珍賃鎮陳津墜椎槌追鎚痛通塚栂掴槻佃漬柘辻蔦綴鍔椿潰坪壷嬬紬爪吊釣鶴亭低停偵剃貞呈堤定帝底庭廷弟悌抵挺提梯汀碇禎程締艇訂諦蹄逓���".split("");
- 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];}
- D[147] = "����������������������������������������������������������������邸鄭釘鼎泥摘擢敵滴的笛適鏑溺哲徹撤轍迭鉄典填天展店添纏甜貼転顛点伝殿澱田電兎吐堵塗妬屠徒斗杜渡登菟賭途都鍍砥砺努度土奴怒倒党冬�凍刀唐塔塘套宕島嶋悼投搭東桃梼棟盗淘湯涛灯燈当痘祷等答筒糖統到董蕩藤討謄豆踏逃透鐙陶頭騰闘働動同堂導憧撞洞瞳童胴萄道銅峠鴇匿得徳涜特督禿篤毒独読栃橡凸突椴届鳶苫寅酉瀞噸屯惇敦沌豚遁頓呑曇鈍奈那内乍凪薙謎灘捺鍋楢馴縄畷南楠軟難汝二尼弐迩匂賑肉虹廿日乳入���".split("");
- 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];}
- D[148] = "����������������������������������������������������������������如尿韮任妊忍認濡禰祢寧葱猫熱年念捻撚燃粘乃廼之埜嚢悩濃納能脳膿農覗蚤巴把播覇杷波派琶破婆罵芭馬俳廃拝排敗杯盃牌背肺輩配倍培媒梅�楳煤狽買売賠陪這蝿秤矧萩伯剥博拍柏泊白箔粕舶薄迫曝漠爆縛莫駁麦函箱硲箸肇筈櫨幡肌畑畠八鉢溌発醗髪伐罰抜筏閥鳩噺塙蛤隼伴判半反叛帆搬斑板氾汎版犯班畔繁般藩販範釆煩頒飯挽晩番盤磐蕃蛮匪卑否妃庇彼悲扉批披斐比泌疲皮碑秘緋罷肥被誹費避非飛樋簸備尾微枇毘琵眉美���".split("");
- 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];}
- D[149] = "����������������������������������������������������������������鼻柊稗匹疋髭彦膝菱肘弼必畢筆逼桧姫媛紐百謬俵彪標氷漂瓢票表評豹廟描病秒苗錨鋲蒜蛭鰭品彬斌浜瀕貧賓頻敏瓶不付埠夫婦富冨布府怖扶敷�斧普浮父符腐膚芙譜負賦赴阜附侮撫武舞葡蕪部封楓風葺蕗伏副復幅服福腹複覆淵弗払沸仏物鮒分吻噴墳憤扮焚奮粉糞紛雰文聞丙併兵塀幣平弊柄並蔽閉陛米頁僻壁癖碧別瞥蔑箆偏変片篇編辺返遍便勉娩弁鞭保舗鋪圃捕歩甫補輔穂募墓慕戊暮母簿菩倣俸包呆報奉宝峰峯崩庖抱捧放方朋���".split("");
- 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];}
- D[150] = "����������������������������������������������������������������法泡烹砲縫胞芳萌蓬蜂褒訪豊邦鋒飽鳳鵬乏亡傍剖坊妨帽忘忙房暴望某棒冒紡肪膨謀貌貿鉾防吠頬北僕卜墨撲朴牧睦穆釦勃没殆堀幌奔本翻凡盆�摩磨魔麻埋妹昧枚毎哩槙幕膜枕鮪柾鱒桝亦俣又抹末沫迄侭繭麿万慢満漫蔓味未魅巳箕岬密蜜湊蓑稔脈妙粍民眠務夢無牟矛霧鵡椋婿娘冥名命明盟迷銘鳴姪牝滅免棉綿緬面麺摸模茂妄孟毛猛盲網耗蒙儲木黙目杢勿餅尤戻籾貰問悶紋門匁也冶夜爺耶野弥矢厄役約薬訳躍靖柳薮鑓愉愈油癒���".split("");
- 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];}
- D[151] = "����������������������������������������������������������������諭輸唯佑優勇友宥幽悠憂揖有柚湧涌猶猷由祐裕誘遊邑郵雄融夕予余与誉輿預傭幼妖容庸揚揺擁曜楊様洋溶熔用窯羊耀葉蓉要謡踊遥陽養慾抑欲�沃浴翌翼淀羅螺裸来莱頼雷洛絡落酪乱卵嵐欄濫藍蘭覧利吏履李梨理璃痢裏裡里離陸律率立葎掠略劉流溜琉留硫粒隆竜龍侶慮旅虜了亮僚両凌寮料梁涼猟療瞭稜糧良諒遼量陵領力緑倫厘林淋燐琳臨輪隣鱗麟瑠塁涙累類令伶例冷励嶺怜玲礼苓鈴隷零霊麗齢暦歴列劣烈裂廉恋憐漣煉簾練聯���".split("");
- 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];}
- D[152] = "����������������������������������������������������������������蓮連錬呂魯櫓炉賂路露労婁廊弄朗楼榔浪漏牢狼篭老聾蝋郎六麓禄肋録論倭和話歪賄脇惑枠鷲亙亘鰐詫藁蕨椀湾碗腕��������������������������������������������弌丐丕个丱丶丼丿乂乖乘亂亅豫亊舒弍于亞亟亠亢亰亳亶从仍仄仆仂仗仞仭仟价伉佚估佛佝佗佇佶侈侏侘佻佩佰侑佯來侖儘俔俟俎俘俛俑俚俐俤俥倚倨倔倪倥倅伜俶倡倩倬俾俯們倆偃假會偕偐偈做偖偬偸傀傚傅傴傲���".split("");
- 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];}
- D[153] = "����������������������������������������������������������������僉僊傳僂僖僞僥僭僣僮價僵儉儁儂儖儕儔儚儡儺儷儼儻儿兀兒兌兔兢竸兩兪兮冀冂囘册冉冏冑冓冕冖冤冦冢冩冪冫决冱冲冰况冽凅凉凛几處凩凭�凰凵凾刄刋刔刎刧刪刮刳刹剏剄剋剌剞剔剪剴剩剳剿剽劍劔劒剱劈劑辨辧劬劭劼劵勁勍勗勞勣勦飭勠勳勵勸勹匆匈甸匍匐匏匕匚匣匯匱匳匸區卆卅丗卉卍凖卞卩卮夘卻卷厂厖厠厦厥厮厰厶參簒雙叟曼燮叮叨叭叺吁吽呀听吭吼吮吶吩吝呎咏呵咎呟呱呷呰咒呻咀呶咄咐咆哇咢咸咥咬哄哈咨���".split("");
- 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];}
- D[154] = "����������������������������������������������������������������咫哂咤咾咼哘哥哦唏唔哽哮哭哺哢唹啀啣啌售啜啅啖啗唸唳啝喙喀咯喊喟啻啾喘喞單啼喃喩喇喨嗚嗅嗟嗄嗜嗤嗔嘔嗷嘖嗾嗽嘛嗹噎噐營嘴嘶嘲嘸�噫噤嘯噬噪嚆嚀嚊嚠嚔嚏嚥嚮嚶嚴囂嚼囁囃囀囈囎囑囓囗囮囹圀囿圄圉圈國圍圓團圖嗇圜圦圷圸坎圻址坏坩埀垈坡坿垉垓垠垳垤垪垰埃埆埔埒埓堊埖埣堋堙堝塲堡塢塋塰毀塒堽塹墅墹墟墫墺壞墻墸墮壅壓壑壗壙壘壥壜壤壟壯壺壹壻壼壽夂夊夐夛梦夥夬夭夲夸夾竒奕奐奎奚奘奢奠奧奬奩���".split("");
- 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];}
- D[155] = "����������������������������������������������������������������奸妁妝佞侫妣妲姆姨姜妍姙姚娥娟娑娜娉娚婀婬婉娵娶婢婪媚媼媾嫋嫂媽嫣嫗嫦嫩嫖嫺嫻嬌嬋嬖嬲嫐嬪嬶嬾孃孅孀孑孕孚孛孥孩孰孳孵學斈孺宀�它宦宸寃寇寉寔寐寤實寢寞寥寫寰寶寳尅將專對尓尠尢尨尸尹屁屆屎屓屐屏孱屬屮乢屶屹岌岑岔妛岫岻岶岼岷峅岾峇峙峩峽峺峭嶌峪崋崕崗嵜崟崛崑崔崢崚崙崘嵌嵒嵎嵋嵬嵳嵶嶇嶄嶂嶢嶝嶬嶮嶽嶐嶷嶼巉巍巓巒巖巛巫已巵帋帚帙帑帛帶帷幄幃幀幎幗幔幟幢幤幇幵并幺麼广庠廁廂廈廐廏���".split("");
- 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];}
- D[156] = "����������������������������������������������������������������廖廣廝廚廛廢廡廨廩廬廱廳廰廴廸廾弃弉彝彜弋弑弖弩弭弸彁彈彌彎弯彑彖彗彙彡彭彳彷徃徂彿徊很徑徇從徙徘徠徨徭徼忖忻忤忸忱忝悳忿怡恠�怙怐怩怎怱怛怕怫怦怏怺恚恁恪恷恟恊恆恍恣恃恤恂恬恫恙悁悍惧悃悚悄悛悖悗悒悧悋惡悸惠惓悴忰悽惆悵惘慍愕愆惶惷愀惴惺愃愡惻惱愍愎慇愾愨愧慊愿愼愬愴愽慂慄慳慷慘慙慚慫慴慯慥慱慟慝慓慵憙憖憇憬憔憚憊憑憫憮懌懊應懷懈懃懆憺懋罹懍懦懣懶懺懴懿懽懼懾戀戈戉戍戌戔戛���".split("");
- 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];}
- D[157] = "����������������������������������������������������������������戞戡截戮戰戲戳扁扎扞扣扛扠扨扼抂抉找抒抓抖拔抃抔拗拑抻拏拿拆擔拈拜拌拊拂拇抛拉挌拮拱挧挂挈拯拵捐挾捍搜捏掖掎掀掫捶掣掏掉掟掵捫�捩掾揩揀揆揣揉插揶揄搖搴搆搓搦搶攝搗搨搏摧摯摶摎攪撕撓撥撩撈撼據擒擅擇撻擘擂擱擧舉擠擡抬擣擯攬擶擴擲擺攀擽攘攜攅攤攣攫攴攵攷收攸畋效敖敕敍敘敞敝敲數斂斃變斛斟斫斷旃旆旁旄旌旒旛旙无旡旱杲昊昃旻杳昵昶昴昜晏晄晉晁晞晝晤晧晨晟晢晰暃暈暎暉暄暘暝曁暹曉暾暼���".split("");
- 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];}
- D[158] = "����������������������������������������������������������������曄暸曖曚曠昿曦曩曰曵曷朏朖朞朦朧霸朮朿朶杁朸朷杆杞杠杙杣杤枉杰枩杼杪枌枋枦枡枅枷柯枴柬枳柩枸柤柞柝柢柮枹柎柆柧檜栞框栩桀桍栲桎�梳栫桙档桷桿梟梏梭梔條梛梃檮梹桴梵梠梺椏梍桾椁棊椈棘椢椦棡椌棍棔棧棕椶椒椄棗棣椥棹棠棯椨椪椚椣椡棆楹楷楜楸楫楔楾楮椹楴椽楙椰楡楞楝榁楪榲榮槐榿槁槓榾槎寨槊槝榻槃榧樮榑榠榜榕榴槞槨樂樛槿權槹槲槧樅榱樞槭樔槫樊樒櫁樣樓橄樌橲樶橸橇橢橙橦橈樸樢檐檍檠檄檢檣���".split("");
- 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];}
- D[159] = "����������������������������������������������������������������檗蘗檻櫃櫂檸檳檬櫞櫑櫟檪櫚櫪櫻欅蘖櫺欒欖鬱欟欸欷盜欹飮歇歃歉歐歙歔歛歟歡歸歹歿殀殄殃殍殘殕殞殤殪殫殯殲殱殳殷殼毆毋毓毟毬毫毳毯�麾氈氓气氛氤氣汞汕汢汪沂沍沚沁沛汾汨汳沒沐泄泱泓沽泗泅泝沮沱沾沺泛泯泙泪洟衍洶洫洽洸洙洵洳洒洌浣涓浤浚浹浙涎涕濤涅淹渕渊涵淇淦涸淆淬淞淌淨淒淅淺淙淤淕淪淮渭湮渮渙湲湟渾渣湫渫湶湍渟湃渺湎渤滿渝游溂溪溘滉溷滓溽溯滄溲滔滕溏溥滂溟潁漑灌滬滸滾漿滲漱滯漲滌���".split("");
- 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];}
- D[224] = "����������������������������������������������������������������漾漓滷澆潺潸澁澀潯潛濳潭澂潼潘澎澑濂潦澳澣澡澤澹濆澪濟濕濬濔濘濱濮濛瀉瀋濺瀑瀁瀏濾瀛瀚潴瀝瀘瀟瀰瀾瀲灑灣炙炒炯烱炬炸炳炮烟烋烝�烙焉烽焜焙煥煕熈煦煢煌煖煬熏燻熄熕熨熬燗熹熾燒燉燔燎燠燬燧燵燼燹燿爍爐爛爨爭爬爰爲爻爼爿牀牆牋牘牴牾犂犁犇犒犖犢犧犹犲狃狆狄狎狒狢狠狡狹狷倏猗猊猜猖猝猴猯猩猥猾獎獏默獗獪獨獰獸獵獻獺珈玳珎玻珀珥珮珞璢琅瑯琥珸琲琺瑕琿瑟瑙瑁瑜瑩瑰瑣瑪瑶瑾璋璞璧瓊瓏瓔珱���".split("");
- 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];}
- D[225] = "����������������������������������������������������������������瓠瓣瓧瓩瓮瓲瓰瓱瓸瓷甄甃甅甌甎甍甕甓甞甦甬甼畄畍畊畉畛畆畚畩畤畧畫畭畸當疆疇畴疊疉疂疔疚疝疥疣痂疳痃疵疽疸疼疱痍痊痒痙痣痞痾痿�痼瘁痰痺痲痳瘋瘍瘉瘟瘧瘠瘡瘢瘤瘴瘰瘻癇癈癆癜癘癡癢癨癩癪癧癬癰癲癶癸發皀皃皈皋皎皖皓皙皚皰皴皸皹皺盂盍盖盒盞盡盥盧盪蘯盻眈眇眄眩眤眞眥眦眛眷眸睇睚睨睫睛睥睿睾睹瞎瞋瞑瞠瞞瞰瞶瞹瞿瞼瞽瞻矇矍矗矚矜矣矮矼砌砒礦砠礪硅碎硴碆硼碚碌碣碵碪碯磑磆磋磔碾碼磅磊磬���".split("");
- 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];}
- D[226] = "����������������������������������������������������������������磧磚磽磴礇礒礑礙礬礫祀祠祗祟祚祕祓祺祿禊禝禧齋禪禮禳禹禺秉秕秧秬秡秣稈稍稘稙稠稟禀稱稻稾稷穃穗穉穡穢穩龝穰穹穽窈窗窕窘窖窩竈窰�窶竅竄窿邃竇竊竍竏竕竓站竚竝竡竢竦竭竰笂笏笊笆笳笘笙笞笵笨笶筐筺笄筍笋筌筅筵筥筴筧筰筱筬筮箝箘箟箍箜箚箋箒箏筝箙篋篁篌篏箴篆篝篩簑簔篦篥籠簀簇簓篳篷簗簍篶簣簧簪簟簷簫簽籌籃籔籏籀籐籘籟籤籖籥籬籵粃粐粤粭粢粫粡粨粳粲粱粮粹粽糀糅糂糘糒糜糢鬻糯糲糴糶糺紆���".split("");
- 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];}
- D[227] = "����������������������������������������������������������������紂紜紕紊絅絋紮紲紿紵絆絳絖絎絲絨絮絏絣經綉絛綏絽綛綺綮綣綵緇綽綫總綢綯緜綸綟綰緘緝緤緞緻緲緡縅縊縣縡縒縱縟縉縋縢繆繦縻縵縹繃縷�縲縺繧繝繖繞繙繚繹繪繩繼繻纃緕繽辮繿纈纉續纒纐纓纔纖纎纛纜缸缺罅罌罍罎罐网罕罔罘罟罠罨罩罧罸羂羆羃羈羇羌羔羞羝羚羣羯羲羹羮羶羸譱翅翆翊翕翔翡翦翩翳翹飜耆耄耋耒耘耙耜耡耨耿耻聊聆聒聘聚聟聢聨聳聲聰聶聹聽聿肄肆肅肛肓肚肭冐肬胛胥胙胝胄胚胖脉胯胱脛脩脣脯腋���".split("");
- 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];}
- D[228] = "����������������������������������������������������������������隋腆脾腓腑胼腱腮腥腦腴膃膈膊膀膂膠膕膤膣腟膓膩膰膵膾膸膽臀臂膺臉臍臑臙臘臈臚臟臠臧臺臻臾舁舂舅與舊舍舐舖舩舫舸舳艀艙艘艝艚艟艤�艢艨艪艫舮艱艷艸艾芍芒芫芟芻芬苡苣苟苒苴苳苺莓范苻苹苞茆苜茉苙茵茴茖茲茱荀茹荐荅茯茫茗茘莅莚莪莟莢莖茣莎莇莊荼莵荳荵莠莉莨菴萓菫菎菽萃菘萋菁菷萇菠菲萍萢萠莽萸蔆菻葭萪萼蕚蒄葷葫蒭葮蒂葩葆萬葯葹萵蓊葢蒹蒿蒟蓙蓍蒻蓚蓐蓁蓆蓖蒡蔡蓿蓴蔗蔘蔬蔟蔕蔔蓼蕀蕣蕘蕈���".split("");
- 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];}
- D[229] = "����������������������������������������������������������������蕁蘂蕋蕕薀薤薈薑薊薨蕭薔薛藪薇薜蕷蕾薐藉薺藏薹藐藕藝藥藜藹蘊蘓蘋藾藺蘆蘢蘚蘰蘿虍乕虔號虧虱蚓蚣蚩蚪蚋蚌蚶蚯蛄蛆蚰蛉蠣蚫蛔蛞蛩蛬�蛟蛛蛯蜒蜆蜈蜀蜃蛻蜑蜉蜍蛹蜊蜴蜿蜷蜻蜥蜩蜚蝠蝟蝸蝌蝎蝴蝗蝨蝮蝙蝓蝣蝪蠅螢螟螂螯蟋螽蟀蟐雖螫蟄螳蟇蟆螻蟯蟲蟠蠏蠍蟾蟶蟷蠎蟒蠑蠖蠕蠢蠡蠱蠶蠹蠧蠻衄衂衒衙衞衢衫袁衾袞衵衽袵衲袂袗袒袮袙袢袍袤袰袿袱裃裄裔裘裙裝裹褂裼裴裨裲褄褌褊褓襃褞褥褪褫襁襄褻褶褸襌褝襠襞���".split("");
- 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];}
- D[230] = "����������������������������������������������������������������襦襤襭襪襯襴襷襾覃覈覊覓覘覡覩覦覬覯覲覺覽覿觀觚觜觝觧觴觸訃訖訐訌訛訝訥訶詁詛詒詆詈詼詭詬詢誅誂誄誨誡誑誥誦誚誣諄諍諂諚諫諳諧�諤諱謔諠諢諷諞諛謌謇謚諡謖謐謗謠謳鞫謦謫謾謨譁譌譏譎證譖譛譚譫譟譬譯譴譽讀讌讎讒讓讖讙讚谺豁谿豈豌豎豐豕豢豬豸豺貂貉貅貊貍貎貔豼貘戝貭貪貽貲貳貮貶賈賁賤賣賚賽賺賻贄贅贊贇贏贍贐齎贓賍贔贖赧赭赱赳趁趙跂趾趺跏跚跖跌跛跋跪跫跟跣跼踈踉跿踝踞踐踟蹂踵踰踴蹊���".split("");
- 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];}
- D[231] = "����������������������������������������������������������������蹇蹉蹌蹐蹈蹙蹤蹠踪蹣蹕蹶蹲蹼躁躇躅躄躋躊躓躑躔躙躪躡躬躰軆躱躾軅軈軋軛軣軼軻軫軾輊輅輕輒輙輓輜輟輛輌輦輳輻輹轅轂輾轌轉轆轎轗轜�轢轣轤辜辟辣辭辯辷迚迥迢迪迯邇迴逅迹迺逑逕逡逍逞逖逋逧逶逵逹迸遏遐遑遒逎遉逾遖遘遞遨遯遶隨遲邂遽邁邀邊邉邏邨邯邱邵郢郤扈郛鄂鄒鄙鄲鄰酊酖酘酣酥酩酳酲醋醉醂醢醫醯醪醵醴醺釀釁釉釋釐釖釟釡釛釼釵釶鈞釿鈔鈬鈕鈑鉞鉗鉅鉉鉤鉈銕鈿鉋鉐銜銖銓銛鉚鋏銹銷鋩錏鋺鍄錮���".split("");
- 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];}
- D[232] = "����������������������������������������������������������������錙錢錚錣錺錵錻鍜鍠鍼鍮鍖鎰鎬鎭鎔鎹鏖鏗鏨鏥鏘鏃鏝鏐鏈鏤鐚鐔鐓鐃鐇鐐鐶鐫鐵鐡鐺鑁鑒鑄鑛鑠鑢鑞鑪鈩鑰鑵鑷鑽鑚鑼鑾钁鑿閂閇閊閔閖閘閙�閠閨閧閭閼閻閹閾闊濶闃闍闌闕闔闖關闡闥闢阡阨阮阯陂陌陏陋陷陜陞陝陟陦陲陬隍隘隕隗險隧隱隲隰隴隶隸隹雎雋雉雍襍雜霍雕雹霄霆霈霓霎霑霏霖霙霤霪霰霹霽霾靄靆靈靂靉靜靠靤靦靨勒靫靱靹鞅靼鞁靺鞆鞋鞏鞐鞜鞨鞦鞣鞳鞴韃韆韈韋韜韭齏韲竟韶韵頏頌頸頤頡頷頽顆顏顋顫顯顰���".split("");
- 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];}
- D[233] = "����������������������������������������������������������������顱顴顳颪颯颱颶飄飃飆飩飫餃餉餒餔餘餡餝餞餤餠餬餮餽餾饂饉饅饐饋饑饒饌饕馗馘馥馭馮馼駟駛駝駘駑駭駮駱駲駻駸騁騏騅駢騙騫騷驅驂驀驃�騾驕驍驛驗驟驢驥驤驩驫驪骭骰骼髀髏髑髓體髞髟髢髣髦髯髫髮髴髱髷髻鬆鬘鬚鬟鬢鬣鬥鬧鬨鬩鬪鬮鬯鬲魄魃魏魍魎魑魘魴鮓鮃鮑鮖鮗鮟鮠鮨鮴鯀鯊鮹鯆鯏鯑鯒鯣鯢鯤鯔鯡鰺鯲鯱鯰鰕鰔鰉鰓鰌鰆鰈鰒鰊鰄鰮鰛鰥鰤鰡鰰鱇鰲鱆鰾鱚鱠鱧鱶鱸鳧鳬鳰鴉鴈鳫鴃鴆鴪鴦鶯鴣鴟鵄鴕鴒鵁鴿鴾鵆鵈���".split("");
- 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];}
- D[234] = "����������������������������������������������������������������鵝鵞鵤鵑鵐鵙鵲鶉鶇鶫鵯鵺鶚鶤鶩鶲鷄鷁鶻鶸鶺鷆鷏鷂鷙鷓鷸鷦鷭鷯鷽鸚鸛鸞鹵鹹鹽麁麈麋麌麒麕麑麝麥麩麸麪麭靡黌黎黏黐黔黜點黝黠黥黨黯�黴黶黷黹黻黼黽鼇鼈皷鼕鼡鼬鼾齊齒齔齣齟齠齡齦齧齬齪齷齲齶龕龜龠堯槇遙瑤凜熙�������������������������������������������������������������������������������������������".split("");
- 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];}
- D[237] = "����������������������������������������������������������������纊褜鍈銈蓜俉炻昱棈鋹曻彅丨仡仼伀伃伹佖侒侊侚侔俍偀倢俿倞偆偰偂傔僴僘兊兤冝冾凬刕劜劦勀勛匀匇匤卲厓厲叝﨎咜咊咩哿喆坙坥垬埈埇﨏�塚增墲夋奓奛奝奣妤妺孖寀甯寘寬尞岦岺峵崧嵓﨑嵂嵭嶸嶹巐弡弴彧德忞恝悅悊惞惕愠惲愑愷愰憘戓抦揵摠撝擎敎昀昕昻昉昮昞昤晥晗晙晴晳暙暠暲暿曺朎朗杦枻桒柀栁桄棏﨓楨﨔榘槢樰橫橆橳橾櫢櫤毖氿汜沆汯泚洄涇浯涖涬淏淸淲淼渹湜渧渼溿澈澵濵瀅瀇瀨炅炫焏焄煜煆煇凞燁燾犱���".split("");
- 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];}
- D[238] = "����������������������������������������������������������������犾猤猪獷玽珉珖珣珒琇珵琦琪琩琮瑢璉璟甁畯皂皜皞皛皦益睆劯砡硎硤硺礰礼神祥禔福禛竑竧靖竫箞精絈絜綷綠緖繒罇羡羽茁荢荿菇菶葈蒴蕓蕙�蕫﨟薰蘒﨡蠇裵訒訷詹誧誾諟諸諶譓譿賰賴贒赶﨣軏﨤逸遧郞都鄕鄧釚釗釞釭釮釤釥鈆鈐鈊鈺鉀鈼鉎鉙鉑鈹鉧銧鉷鉸鋧鋗鋙鋐﨧鋕鋠鋓錥錡鋻﨨錞鋿錝錂鍰鍗鎤鏆鏞鏸鐱鑅鑈閒隆﨩隝隯霳霻靃靍靏靑靕顗顥飯飼餧館馞驎髙髜魵魲鮏鮱鮻鰀鵰鵫鶴鸙黑��ⅰⅱⅲⅳⅴⅵⅶⅷⅸⅹ¬¦'"���".split("");
- 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];}
- D[250] = "����������������������������������������������������������������ⅰⅱⅲⅳⅴⅵⅶⅷⅸⅹⅠⅡⅢⅣⅤⅥⅦⅧⅨⅩ¬¦'"㈱№℡∵纊褜鍈銈蓜俉炻昱棈鋹曻彅丨仡仼伀伃伹佖侒侊侚侔俍偀倢俿倞偆偰偂傔僴僘兊�兤冝冾凬刕劜劦勀勛匀匇匤卲厓厲叝﨎咜咊咩哿喆坙坥垬埈埇﨏塚增墲夋奓奛奝奣妤妺孖寀甯寘寬尞岦岺峵崧嵓﨑嵂嵭嶸嶹巐弡弴彧德忞恝悅悊惞惕愠惲愑愷愰憘戓抦揵摠撝擎敎昀昕昻昉昮昞昤晥晗晙晴晳暙暠暲暿曺朎朗杦枻桒柀栁桄棏﨓楨﨔榘槢樰橫橆橳橾櫢櫤毖氿汜沆汯泚洄涇浯���".split("");
- 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];}
- D[251] = "����������������������������������������������������������������涖涬淏淸淲淼渹湜渧渼溿澈澵濵瀅瀇瀨炅炫焏焄煜煆煇凞燁燾犱犾猤猪獷玽珉珖珣珒琇珵琦琪琩琮瑢璉璟甁畯皂皜皞皛皦益睆劯砡硎硤硺礰礼神�祥禔福禛竑竧靖竫箞精絈絜綷綠緖繒罇羡羽茁荢荿菇菶葈蒴蕓蕙蕫﨟薰蘒﨡蠇裵訒訷詹誧誾諟諸諶譓譿賰賴贒赶﨣軏﨤逸遧郞都鄕鄧釚釗釞釭釮釤釥鈆鈐鈊鈺鉀鈼鉎鉙鉑鈹鉧銧鉷鉸鋧鋗鋙鋐﨧鋕鋠鋓錥錡鋻﨨錞鋿錝錂鍰鍗鎤鏆鏞鏸鐱鑅鑈閒隆﨩隝隯霳霻靃靍靏靑靕顗顥飯飼餧館馞驎髙���".split("");
- 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];}
- D[252] = "����������������������������������������������������������������髜魵魲鮏鮱鮻鰀鵰鵫鶴鸙黑������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������".split("");
- 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];}
- return {"enc": e, "dec": d }; })();
- cptable[936] = (function(){ var d = [], e = {}, D = [], j;
- 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("");
- 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];}
- D[129] = "����������������������������������������������������������������丂丄丅丆丏丒丗丟丠両丣並丩丮丯丱丳丵丷丼乀乁乂乄乆乊乑乕乗乚乛乢乣乤乥乧乨乪乫乬乭乮乯乲乴乵乶乷乸乹乺乻乼乽乿亀亁亂亃亄亅亇亊�亐亖亗亙亜亝亞亣亪亯亰亱亴亶亷亸亹亼亽亾仈仌仏仐仒仚仛仜仠仢仦仧仩仭仮仯仱仴仸仹仺仼仾伀伂伃伄伅伆伇伈伋伌伒伓伔伕伖伜伝伡伣伨伩伬伭伮伱伳伵伷伹伻伾伿佀佁佂佄佅佇佈佉佊佋佌佒佔佖佡佢佦佨佪佫佭佮佱佲併佷佸佹佺佽侀侁侂侅來侇侊侌侎侐侒侓侕侖侘侙侚侜侞侟価侢�".split("");
- 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];}
- D[130] = "����������������������������������������������������������������侤侫侭侰侱侲侳侴侶侷侸侹侺侻侼侽侾俀俁係俆俇俈俉俋俌俍俒俓俔俕俖俙俛俠俢俤俥俧俫俬俰俲俴俵俶俷俹俻俼俽俿倀倁倂倃倄倅倆倇倈倉倊�個倎倐們倓倕倖倗倛倝倞倠倢倣値倧倫倯倰倱倲倳倴倵倶倷倸倹倻倽倿偀偁偂偄偅偆偉偊偋偍偐偑偒偓偔偖偗偘偙偛偝偞偟偠偡偢偣偤偦偧偨偩偪偫偭偮偯偰偱偲偳側偵偸偹偺偼偽傁傂傃傄傆傇傉傊傋傌傎傏傐傑傒傓傔傕傖傗傘備傚傛傜傝傞傟傠傡傢傤傦傪傫傭傮傯傰傱傳傴債傶傷傸傹傼�".split("");
- 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];}
- D[131] = "����������������������������������������������������������������傽傾傿僀僁僂僃僄僅僆僇僈僉僊僋僌働僎僐僑僒僓僔僕僗僘僙僛僜僝僞僟僠僡僢僣僤僥僨僩僪僫僯僰僱僲僴僶僷僸價僺僼僽僾僿儀儁儂儃億儅儈�儉儊儌儍儎儏儐儑儓儔儕儖儗儘儙儚儛儜儝儞償儠儢儣儤儥儦儧儨儩優儫儬儭儮儯儰儱儲儳儴儵儶儷儸儹儺儻儼儽儾兂兇兊兌兎兏児兒兓兗兘兙兛兝兞兟兠兡兣兤兦內兩兪兯兲兺兾兿冃冄円冇冊冋冎冏冐冑冓冔冘冚冝冞冟冡冣冦冧冨冩冪冭冮冴冸冹冺冾冿凁凂凃凅凈凊凍凎凐凒凓凔凕凖凗�".split("");
- 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];}
- D[132] = "����������������������������������������������������������������凘凙凚凜凞凟凢凣凥処凧凨凩凪凬凮凱凲凴凷凾刄刅刉刋刌刏刐刓刔刕刜刞刟刡刢刣別刦刧刪刬刯刱刲刴刵刼刾剄剅剆則剈剉剋剎剏剒剓剕剗剘�剙剚剛剝剟剠剢剣剤剦剨剫剬剭剮剰剱剳剴創剶剷剸剹剺剻剼剾劀劃劄劅劆劇劉劊劋劌劍劎劏劑劒劔劕劖劗劘劙劚劜劤劥劦劧劮劯劰労劵劶劷劸効劺劻劼劽勀勁勂勄勅勆勈勊勌勍勎勏勑勓勔動勗務勚勛勜勝勞勠勡勢勣勥勦勧勨勩勪勫勬勭勮勯勱勲勳勴勵勶勷勸勻勼勽匁匂匃匄匇匉匊匋匌匎�".split("");
- 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];}
- D[133] = "����������������������������������������������������������������匑匒匓匔匘匛匜匞匟匢匤匥匧匨匩匫匬匭匯匰匱匲匳匴匵匶匷匸匼匽區卂卄卆卋卌卍卐協単卙卛卝卥卨卪卬卭卲卶卹卻卼卽卾厀厁厃厇厈厊厎厏�厐厑厒厓厔厖厗厙厛厜厞厠厡厤厧厪厫厬厭厯厰厱厲厳厴厵厷厸厹厺厼厽厾叀參叄叅叆叇収叏叐叒叓叕叚叜叝叞叡叢叧叴叺叾叿吀吂吅吇吋吔吘吙吚吜吢吤吥吪吰吳吶吷吺吽吿呁呂呄呅呇呉呌呍呎呏呑呚呝呞呟呠呡呣呥呧呩呪呫呬呭呮呯呰呴呹呺呾呿咁咃咅咇咈咉咊咍咑咓咗咘咜咞咟咠咡�".split("");
- 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];}
- D[134] = "����������������������������������������������������������������咢咥咮咰咲咵咶咷咹咺咼咾哃哅哊哋哖哘哛哠員哢哣哤哫哬哯哰哱哴哵哶哷哸哹哻哾唀唂唃唄唅唈唊唋唌唍唎唒唓唕唖唗唘唙唚唜唝唞唟唡唥唦�唨唩唫唭唲唴唵唶唸唹唺唻唽啀啂啅啇啈啋啌啍啎問啑啒啓啔啗啘啙啚啛啝啞啟啠啢啣啨啩啫啯啰啱啲啳啴啹啺啽啿喅喆喌喍喎喐喒喓喕喖喗喚喛喞喠喡喢喣喤喥喦喨喩喪喫喬喭單喯喰喲喴営喸喺喼喿嗀嗁嗂嗃嗆嗇嗈嗊嗋嗎嗏嗐嗕嗗嗘嗙嗚嗛嗞嗠嗢嗧嗩嗭嗮嗰嗱嗴嗶嗸嗹嗺嗻嗼嗿嘂嘃嘄嘅�".split("");
- 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];}
- D[135] = "����������������������������������������������������������������嘆嘇嘊嘋嘍嘐嘑嘒嘓嘔嘕嘖嘗嘙嘚嘜嘝嘠嘡嘢嘥嘦嘨嘩嘪嘫嘮嘯嘰嘳嘵嘷嘸嘺嘼嘽嘾噀噁噂噃噄噅噆噇噈噉噊噋噏噐噑噒噓噕噖噚噛噝噞噟噠噡�噣噥噦噧噭噮噯噰噲噳噴噵噷噸噹噺噽噾噿嚀嚁嚂嚃嚄嚇嚈嚉嚊嚋嚌嚍嚐嚑嚒嚔嚕嚖嚗嚘嚙嚚嚛嚜嚝嚞嚟嚠嚡嚢嚤嚥嚦嚧嚨嚩嚪嚫嚬嚭嚮嚰嚱嚲嚳嚴嚵嚶嚸嚹嚺嚻嚽嚾嚿囀囁囂囃囄囅囆囇囈囉囋囌囍囎囏囐囑囒囓囕囖囘囙囜団囥囦囧囨囩囪囬囮囯囲図囶囷囸囻囼圀圁圂圅圇國圌圍圎圏圐圑�".split("");
- 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];}
- D[136] = "����������������������������������������������������������������園圓圔圕圖圗團圙圚圛圝圞圠圡圢圤圥圦圧圫圱圲圴圵圶圷圸圼圽圿坁坃坄坅坆坈坉坋坒坓坔坕坖坘坙坢坣坥坧坬坮坰坱坲坴坵坸坹坺坽坾坿垀�垁垇垈垉垊垍垎垏垐垑垔垕垖垗垘垙垚垜垝垞垟垥垨垪垬垯垰垱垳垵垶垷垹垺垻垼垽垾垿埀埁埄埅埆埇埈埉埊埌埍埐埑埓埖埗埛埜埞埡埢埣埥埦埧埨埩埪埫埬埮埰埱埲埳埵埶執埻埼埾埿堁堃堄堅堈堉堊堌堎堏堐堒堓堔堖堗堘堚堛堜堝堟堢堣堥堦堧堨堩堫堬堭堮堯報堲堳場堶堷堸堹堺堻堼堽�".split("");
- 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];}
- D[137] = "����������������������������������������������������������������堾堿塀塁塂塃塅塆塇塈塉塊塋塎塏塐塒塓塕塖塗塙塚塛塜塝塟塠塡塢塣塤塦塧塨塩塪塭塮塯塰塱塲塳塴塵塶塷塸塹塺塻塼塽塿墂墄墆墇墈墊墋墌�墍墎墏墐墑墔墕墖増墘墛墜墝墠墡墢墣墤墥墦墧墪墫墬墭墮墯墰墱墲墳墴墵墶墷墸墹墺墻墽墾墿壀壂壃壄壆壇壈壉壊壋壌壍壎壏壐壒壓壔壖壗壘壙壚壛壜壝壞壟壠壡壢壣壥壦壧壨壩壪壭壯壱売壴壵壷壸壺壻壼壽壾壿夀夁夃夅夆夈変夊夋夌夎夐夑夒夓夗夘夛夝夞夠夡夢夣夦夨夬夰夲夳夵夶夻�".split("");
- 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];}
- D[138] = "����������������������������������������������������������������夽夾夿奀奃奅奆奊奌奍奐奒奓奙奛奜奝奞奟奡奣奤奦奧奨奩奪奫奬奭奮奯奰奱奲奵奷奺奻奼奾奿妀妅妉妋妌妎妏妐妑妔妕妘妚妛妜妝妟妠妡妢妦�妧妬妭妰妱妳妴妵妶妷妸妺妼妽妿姀姁姂姃姄姅姇姈姉姌姍姎姏姕姖姙姛姞姟姠姡姢姤姦姧姩姪姫姭姮姯姰姱姲姳姴姵姶姷姸姺姼姽姾娀娂娊娋娍娎娏娐娒娔娕娖娗娙娚娛娝娞娡娢娤娦娧娨娪娫娬娭娮娯娰娳娵娷娸娹娺娻娽娾娿婁婂婃婄婅婇婈婋婌婍婎婏婐婑婒婓婔婖婗婘婙婛婜婝婞婟婠�".split("");
- 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];}
- D[139] = "����������������������������������������������������������������婡婣婤婥婦婨婩婫婬婭婮婯婰婱婲婳婸婹婻婼婽婾媀媁媂媃媄媅媆媇媈媉媊媋媌媍媎媏媐媑媓媔媕媖媗媘媙媜媝媞媟媠媡媢媣媤媥媦媧媨媩媫媬�媭媮媯媰媱媴媶媷媹媺媻媼媽媿嫀嫃嫄嫅嫆嫇嫈嫊嫋嫍嫎嫏嫐嫑嫓嫕嫗嫙嫚嫛嫝嫞嫟嫢嫤嫥嫧嫨嫪嫬嫭嫮嫯嫰嫲嫳嫴嫵嫶嫷嫸嫹嫺嫻嫼嫽嫾嫿嬀嬁嬂嬃嬄嬅嬆嬇嬈嬊嬋嬌嬍嬎嬏嬐嬑嬒嬓嬔嬕嬘嬙嬚嬛嬜嬝嬞嬟嬠嬡嬢嬣嬤嬥嬦嬧嬨嬩嬪嬫嬬嬭嬮嬯嬰嬱嬳嬵嬶嬸嬹嬺嬻嬼嬽嬾嬿孁孂孃孄孅孆孇�".split("");
- 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];}
- D[140] = "����������������������������������������������������������������孈孉孊孋孌孍孎孏孒孖孞孠孡孧孨孫孭孮孯孲孴孶孷學孹孻孼孾孿宂宆宊宍宎宐宑宒宔宖実宧宨宩宬宭宮宯宱宲宷宺宻宼寀寁寃寈寉寊寋寍寎寏�寑寔寕寖寗寘寙寚寛寜寠寢寣實寧審寪寫寬寭寯寱寲寳寴寵寶寷寽対尀専尃尅將專尋尌對導尐尒尓尗尙尛尞尟尠尡尣尦尨尩尪尫尭尮尯尰尲尳尵尶尷屃屄屆屇屌屍屒屓屔屖屗屘屚屛屜屝屟屢層屧屨屩屪屫屬屭屰屲屳屴屵屶屷屸屻屼屽屾岀岃岄岅岆岇岉岊岋岎岏岒岓岕岝岞岟岠岡岤岥岦岧岨�".split("");
- 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];}
- D[141] = "����������������������������������������������������������������岪岮岯岰岲岴岶岹岺岻岼岾峀峂峃峅峆峇峈峉峊峌峍峎峏峐峑峓峔峕峖峗峘峚峛峜峝峞峟峠峢峣峧峩峫峬峮峯峱峲峳峴峵島峷峸峹峺峼峽峾峿崀�崁崄崅崈崉崊崋崌崍崏崐崑崒崓崕崗崘崙崚崜崝崟崠崡崢崣崥崨崪崫崬崯崰崱崲崳崵崶崷崸崹崺崻崼崿嵀嵁嵂嵃嵄嵅嵆嵈嵉嵍嵎嵏嵐嵑嵒嵓嵔嵕嵖嵗嵙嵚嵜嵞嵟嵠嵡嵢嵣嵤嵥嵦嵧嵨嵪嵭嵮嵰嵱嵲嵳嵵嵶嵷嵸嵹嵺嵻嵼嵽嵾嵿嶀嶁嶃嶄嶅嶆嶇嶈嶉嶊嶋嶌嶍嶎嶏嶐嶑嶒嶓嶔嶕嶖嶗嶘嶚嶛嶜嶞嶟嶠�".split("");
- 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];}
- D[142] = "����������������������������������������������������������������嶡嶢嶣嶤嶥嶦嶧嶨嶩嶪嶫嶬嶭嶮嶯嶰嶱嶲嶳嶴嶵嶶嶸嶹嶺嶻嶼嶽嶾嶿巀巁巂巃巄巆巇巈巉巊巋巌巎巏巐巑巒巓巔巕巖巗巘巙巚巜巟巠巣巤巪巬巭�巰巵巶巸巹巺巻巼巿帀帄帇帉帊帋帍帎帒帓帗帞帟帠帡帢帣帤帥帨帩帪師帬帯帰帲帳帴帵帶帹帺帾帿幀幁幃幆幇幈幉幊幋幍幎幏幐幑幒幓幖幗幘幙幚幜幝幟幠幣幤幥幦幧幨幩幪幫幬幭幮幯幰幱幵幷幹幾庁庂広庅庈庉庌庍庎庒庘庛庝庡庢庣庤庨庩庪庫庬庮庯庰庱庲庴庺庻庼庽庿廀廁廂廃廄廅�".split("");
- 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];}
- D[143] = "����������������������������������������������������������������廆廇廈廋廌廍廎廏廐廔廕廗廘廙廚廜廝廞廟廠廡廢廣廤廥廦廧廩廫廬廭廮廯廰廱廲廳廵廸廹廻廼廽弅弆弇弉弌弍弎弐弒弔弖弙弚弜弝弞弡弢弣弤�弨弫弬弮弰弲弳弴張弶強弸弻弽弾弿彁彂彃彄彅彆彇彈彉彊彋彌彍彎彏彑彔彙彚彛彜彞彟彠彣彥彧彨彫彮彯彲彴彵彶彸彺彽彾彿徃徆徍徎徏徑従徔徖徚徛徝從徟徠徢徣徤徥徦徧復徫徬徯徰徱徲徳徴徶徸徹徺徻徾徿忀忁忂忇忈忊忋忎忓忔忕忚忛応忞忟忢忣忥忦忨忩忬忯忰忲忳忴忶忷忹忺忼怇�".split("");
- 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];}
- D[144] = "����������������������������������������������������������������怈怉怋怌怐怑怓怗怘怚怞怟怢怣怤怬怭怮怰怱怲怳怴怶怷怸怹怺怽怾恀恄恅恆恇恈恉恊恌恎恏恑恓恔恖恗恘恛恜恞恟恠恡恥恦恮恱恲恴恵恷恾悀�悁悂悅悆悇悈悊悋悎悏悐悑悓悕悗悘悙悜悞悡悢悤悥悧悩悪悮悰悳悵悶悷悹悺悽悾悿惀惁惂惃惄惇惈惉惌惍惎惏惐惒惓惔惖惗惙惛惞惡惢惣惤惥惪惱惲惵惷惸惻惼惽惾惿愂愃愄愅愇愊愋愌愐愑愒愓愔愖愗愘愙愛愜愝愞愡愢愥愨愩愪愬愭愮愯愰愱愲愳愴愵愶愷愸愹愺愻愼愽愾慀慁慂慃慄慅慆�".split("");
- 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];}
- D[145] = "����������������������������������������������������������������慇慉態慍慏慐慒慓慔慖慗慘慙慚慛慜慞慟慠慡慣慤慥慦慩慪慫慬慭慮慯慱慲慳慴慶慸慹慺慻慼慽慾慿憀憁憂憃憄憅憆憇憈憉憊憌憍憏憐憑憒憓憕�憖憗憘憙憚憛憜憞憟憠憡憢憣憤憥憦憪憫憭憮憯憰憱憲憳憴憵憶憸憹憺憻憼憽憿懀懁懃懄懅懆懇應懌懍懎懏懐懓懕懖懗懘懙懚懛懜懝懞懟懠懡懢懣懤懥懧懨懩懪懫懬懭懮懯懰懱懲懳懴懶懷懸懹懺懻懼懽懾戀戁戂戃戄戅戇戉戓戔戙戜戝戞戠戣戦戧戨戩戫戭戯戰戱戲戵戶戸戹戺戻戼扂扄扅扆扊�".split("");
- 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];}
- D[146] = "����������������������������������������������������������������扏扐払扖扗扙扚扜扝扞扟扠扡扢扤扥扨扱扲扴扵扷扸扺扻扽抁抂抃抅抆抇抈抋抌抍抎抏抐抔抙抜抝択抣抦抧抩抪抭抮抯抰抲抳抴抶抷抸抺抾拀拁�拃拋拏拑拕拝拞拠拡拤拪拫拰拲拵拸拹拺拻挀挃挄挅挆挊挋挌挍挏挐挒挓挔挕挗挘挙挜挦挧挩挬挭挮挰挱挳挴挵挶挷挸挻挼挾挿捀捁捄捇捈捊捑捒捓捔捖捗捘捙捚捛捜捝捠捤捥捦捨捪捫捬捯捰捲捳捴捵捸捹捼捽捾捿掁掃掄掅掆掋掍掑掓掔掕掗掙掚掛掜掝掞掟採掤掦掫掯掱掲掵掶掹掻掽掿揀�".split("");
- 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];}
- D[147] = "����������������������������������������������������������������揁揂揃揅揇揈揊揋揌揑揓揔揕揗揘揙揚換揜揝揟揢揤揥揦揧揨揫揬揮揯揰揱揳揵揷揹揺揻揼揾搃搄搆搇搈搉搊損搎搑搒搕搖搗搘搙搚搝搟搢搣搤�搥搧搨搩搫搮搯搰搱搲搳搵搶搷搸搹搻搼搾摀摂摃摉摋摌摍摎摏摐摑摓摕摖摗摙摚摛摜摝摟摠摡摢摣摤摥摦摨摪摫摬摮摯摰摱摲摳摴摵摶摷摻摼摽摾摿撀撁撃撆撈撉撊撋撌撍撎撏撐撓撔撗撘撚撛撜撝撟撠撡撢撣撥撦撧撨撪撫撯撱撲撳撴撶撹撻撽撾撿擁擃擄擆擇擈擉擊擋擌擏擑擓擔擕擖擙據�".split("");
- 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];}
- D[148] = "����������������������������������������������������������������擛擜擝擟擠擡擣擥擧擨擩擪擫擬擭擮擯擰擱擲擳擴擵擶擷擸擹擺擻擼擽擾擿攁攂攃攄攅攆攇攈攊攋攌攍攎攏攐攑攓攔攕攖攗攙攚攛攜攝攞攟攠攡�攢攣攤攦攧攨攩攪攬攭攰攱攲攳攷攺攼攽敀敁敂敃敄敆敇敊敋敍敎敐敒敓敔敗敘敚敜敟敠敡敤敥敧敨敩敪敭敮敯敱敳敵敶數敹敺敻敼敽敾敿斀斁斂斃斄斅斆斈斉斊斍斎斏斒斔斕斖斘斚斝斞斠斢斣斦斨斪斬斮斱斲斳斴斵斶斷斸斺斻斾斿旀旂旇旈旉旊旍旐旑旓旔旕旘旙旚旛旜旝旞旟旡旣旤旪旫�".split("");
- 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];}
- D[149] = "����������������������������������������������������������������旲旳旴旵旸旹旻旼旽旾旿昁昄昅昇昈昉昋昍昐昑昒昖昗昘昚昛昜昞昡昢昣昤昦昩昪昫昬昮昰昲昳昷昸昹昺昻昽昿晀時晄晅晆晇晈晉晊晍晎晐晑晘�晙晛晜晝晞晠晢晣晥晧晩晪晫晬晭晱晲晳晵晸晹晻晼晽晿暀暁暃暅暆暈暉暊暋暍暎暏暐暒暓暔暕暘暙暚暛暜暞暟暠暡暢暣暤暥暦暩暪暫暬暭暯暰暱暲暳暵暶暷暸暺暻暼暽暿曀曁曂曃曄曅曆曇曈曉曊曋曌曍曎曏曐曑曒曓曔曕曖曗曘曚曞曟曠曡曢曣曤曥曧曨曪曫曬曭曮曯曱曵曶書曺曻曽朁朂會�".split("");
- 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];}
- D[150] = "����������������������������������������������������������������朄朅朆朇朌朎朏朑朒朓朖朘朙朚朜朞朠朡朢朣朤朥朧朩朮朰朲朳朶朷朸朹朻朼朾朿杁杄杅杇杊杋杍杒杔杕杗杘杙杚杛杝杢杣杤杦杧杫杬杮東杴杶�杸杹杺杻杽枀枂枃枅枆枈枊枌枍枎枏枑枒枓枔枖枙枛枟枠枡枤枦枩枬枮枱枲枴枹枺枻枼枽枾枿柀柂柅柆柇柈柉柊柋柌柍柎柕柖柗柛柟柡柣柤柦柧柨柪柫柭柮柲柵柶柷柸柹柺査柼柾栁栂栃栄栆栍栐栒栔栕栘栙栚栛栜栞栟栠栢栣栤栥栦栧栨栫栬栭栮栯栰栱栴栵栶栺栻栿桇桋桍桏桒桖桗桘桙桚桛�".split("");
- 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];}
- D[151] = "����������������������������������������������������������������桜桝桞桟桪桬桭桮桯桰桱桲桳桵桸桹桺桻桼桽桾桿梀梂梄梇梈梉梊梋梌梍梎梐梑梒梔梕梖梘梙梚梛梜條梞梟梠梡梣梤梥梩梪梫梬梮梱梲梴梶梷梸�梹梺梻梼梽梾梿棁棃棄棅棆棇棈棊棌棎棏棐棑棓棔棖棗棙棛棜棝棞棟棡棢棤棥棦棧棨棩棪棫棬棭棯棲棳棴棶棷棸棻棽棾棿椀椂椃椄椆椇椈椉椊椌椏椑椓椔椕椖椗椘椙椚椛検椝椞椡椢椣椥椦椧椨椩椪椫椬椮椯椱椲椳椵椶椷椸椺椻椼椾楀楁楃楄楅楆楇楈楉楊楋楌楍楎楏楐楑楒楓楕楖楘楙楛楜楟�".split("");
- 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];}
- D[152] = "����������������������������������������������������������������楡楢楤楥楧楨楩楪楬業楯楰楲楳楴極楶楺楻楽楾楿榁榃榅榊榋榌榎榏榐榑榒榓榖榗榙榚榝榞榟榠榡榢榣榤榥榦榩榪榬榮榯榰榲榳榵榶榸榹榺榼榽�榾榿槀槂槃槄槅槆槇槈槉構槍槏槑槒槓槕槖槗様槙槚槜槝槞槡槢槣槤槥槦槧槨槩槪槫槬槮槯槰槱槳槴槵槶槷槸槹槺槻槼槾樀樁樂樃樄樅樆樇樈樉樋樌樍樎樏樐樑樒樓樔樕樖標樚樛樜樝樞樠樢樣樤樥樦樧権樫樬樭樮樰樲樳樴樶樷樸樹樺樻樼樿橀橁橂橃橅橆橈橉橊橋橌橍橎橏橑橒橓橔橕橖橗橚�".split("");
- 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];}
- D[153] = "����������������������������������������������������������������橜橝橞機橠橢橣橤橦橧橨橩橪橫橬橭橮橯橰橲橳橴橵橶橷橸橺橻橽橾橿檁檂檃檅檆檇檈檉檊檋檌檍檏檒檓檔檕檖檘檙檚檛檜檝檞檟檡檢檣檤檥檦�檧檨檪檭檮檯檰檱檲檳檴檵檶檷檸檹檺檻檼檽檾檿櫀櫁櫂櫃櫄櫅櫆櫇櫈櫉櫊櫋櫌櫍櫎櫏櫐櫑櫒櫓櫔櫕櫖櫗櫘櫙櫚櫛櫜櫝櫞櫟櫠櫡櫢櫣櫤櫥櫦櫧櫨櫩櫪櫫櫬櫭櫮櫯櫰櫱櫲櫳櫴櫵櫶櫷櫸櫹櫺櫻櫼櫽櫾櫿欀欁欂欃欄欅欆欇欈欉權欋欌欍欎欏欐欑欒欓欔欕欖欗欘欙欚欛欜欝欞欟欥欦欨欩欪欫欬欭欮�".split("");
- 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];}
- D[154] = "����������������������������������������������������������������欯欰欱欳欴欵欶欸欻欼欽欿歀歁歂歄歅歈歊歋歍歎歏歐歑歒歓歔歕歖歗歘歚歛歜歝歞歟歠歡歨歩歫歬歭歮歯歰歱歲歳歴歵歶歷歸歺歽歾歿殀殅殈�殌殎殏殐殑殔殕殗殘殙殜殝殞殟殠殢殣殤殥殦殧殨殩殫殬殭殮殯殰殱殲殶殸殹殺殻殼殽殾毀毃毄毆毇毈毉毊毌毎毐毑毘毚毜毝毞毟毠毢毣毤毥毦毧毨毩毬毭毮毰毱毲毴毶毷毸毺毻毼毾毿氀氁氂氃氄氈氉氊氋氌氎氒気氜氝氞氠氣氥氫氬氭氱氳氶氷氹氺氻氼氾氿汃汄汅汈汋汌汍汎汏汑汒汓汖汘�".split("");
- 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];}
- D[155] = "����������������������������������������������������������������汙汚汢汣汥汦汧汫汬汭汮汯汱汳汵汷汸決汻汼汿沀沄沇沊沋沍沎沑沒沕沖沗沘沚沜沝沞沠沢沨沬沯沰沴沵沶沷沺泀況泂泃泆泇泈泋泍泎泏泑泒泘�泙泚泜泝泟泤泦泧泩泬泭泲泴泹泿洀洂洃洅洆洈洉洊洍洏洐洑洓洔洕洖洘洜洝洟洠洡洢洣洤洦洨洩洬洭洯洰洴洶洷洸洺洿浀浂浄浉浌浐浕浖浗浘浛浝浟浡浢浤浥浧浨浫浬浭浰浱浲浳浵浶浹浺浻浽浾浿涀涁涃涄涆涇涊涋涍涏涐涒涖涗涘涙涚涜涢涥涬涭涰涱涳涴涶涷涹涺涻涼涽涾淁淂淃淈淉淊�".split("");
- 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];}
- D[156] = "����������������������������������������������������������������淍淎淏淐淒淓淔淕淗淚淛淜淟淢淣淥淧淨淩淪淭淯淰淲淴淵淶淸淺淽淾淿渀渁渂渃渄渆渇済渉渋渏渒渓渕渘渙減渜渞渟渢渦渧渨渪測渮渰渱渳渵�渶渷渹渻渼渽渾渿湀湁湂湅湆湇湈湉湊湋湌湏湐湑湒湕湗湙湚湜湝湞湠湡湢湣湤湥湦湧湨湩湪湬湭湯湰湱湲湳湴湵湶湷湸湹湺湻湼湽満溁溂溄溇溈溊溋溌溍溎溑溒溓溔溕準溗溙溚溛溝溞溠溡溣溤溦溨溩溫溬溭溮溰溳溵溸溹溼溾溿滀滃滄滅滆滈滉滊滌滍滎滐滒滖滘滙滛滜滝滣滧滪滫滬滭滮滯�".split("");
- 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];}
- D[157] = "����������������������������������������������������������������滰滱滲滳滵滶滷滸滺滻滼滽滾滿漀漁漃漄漅漇漈漊漋漌漍漎漐漑漒漖漗漘漙漚漛漜漝漞漟漡漢漣漥漦漧漨漬漮漰漲漴漵漷漸漹漺漻漼漽漿潀潁潂�潃潄潅潈潉潊潌潎潏潐潑潒潓潔潕潖潗潙潚潛潝潟潠潡潣潤潥潧潨潩潪潫潬潯潰潱潳潵潶潷潹潻潽潾潿澀澁澂澃澅澆澇澊澋澏澐澑澒澓澔澕澖澗澘澙澚澛澝澞澟澠澢澣澤澥澦澨澩澪澫澬澭澮澯澰澱澲澴澵澷澸澺澻澼澽澾澿濁濃濄濅濆濇濈濊濋濌濍濎濏濐濓濔濕濖濗濘濙濚濛濜濝濟濢濣濤濥�".split("");
- 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];}
- D[158] = "����������������������������������������������������������������濦濧濨濩濪濫濬濭濰濱濲濳濴濵濶濷濸濹濺濻濼濽濾濿瀀瀁瀂瀃瀄瀅瀆瀇瀈瀉瀊瀋瀌瀍瀎瀏瀐瀒瀓瀔瀕瀖瀗瀘瀙瀜瀝瀞瀟瀠瀡瀢瀤瀥瀦瀧瀨瀩瀪�瀫瀬瀭瀮瀯瀰瀱瀲瀳瀴瀶瀷瀸瀺瀻瀼瀽瀾瀿灀灁灂灃灄灅灆灇灈灉灊灋灍灎灐灑灒灓灔灕灖灗灘灙灚灛灜灝灟灠灡灢灣灤灥灦灧灨灩灪灮灱灲灳灴灷灹灺灻災炁炂炃炄炆炇炈炋炌炍炏炐炑炓炗炘炚炛炞炟炠炡炢炣炤炥炦炧炨炩炪炰炲炴炵炶為炾炿烄烅烆烇烉烋烌烍烎烏烐烑烒烓烔烕烖烗烚�".split("");
- 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];}
- D[159] = "����������������������������������������������������������������烜烝烞烠烡烢烣烥烪烮烰烱烲烳烴烵烶烸烺烻烼烾烿焀焁焂焃焄焅焆焇焈焋焌焍焎焏焑焒焔焗焛焜焝焞焟焠無焢焣焤焥焧焨焩焪焫焬焭焮焲焳焴�焵焷焸焹焺焻焼焽焾焿煀煁煂煃煄煆煇煈煉煋煍煏煐煑煒煓煔煕煖煗煘煙煚煛煝煟煠煡煢煣煥煩煪煫煬煭煯煰煱煴煵煶煷煹煻煼煾煿熀熁熂熃熅熆熇熈熉熋熌熍熎熐熑熒熓熕熖熗熚熛熜熝熞熡熢熣熤熥熦熧熩熪熫熭熮熯熰熱熲熴熶熷熸熺熻熼熽熾熿燀燁燂燄燅燆燇燈燉燊燋燌燍燏燐燑燒燓�".split("");
- 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];}
- D[160] = "����������������������������������������������������������������燖燗燘燙燚燛燜燝燞營燡燢燣燤燦燨燩燪燫燬燭燯燰燱燲燳燴燵燶燷燸燺燻燼燽燾燿爀爁爂爃爄爅爇爈爉爊爋爌爍爎爏爐爑爒爓爔爕爖爗爘爙爚�爛爜爞爟爠爡爢爣爤爥爦爧爩爫爭爮爯爲爳爴爺爼爾牀牁牂牃牄牅牆牉牊牋牎牏牐牑牓牔牕牗牘牚牜牞牠牣牤牥牨牪牫牬牭牰牱牳牴牶牷牸牻牼牽犂犃犅犆犇犈犉犌犎犐犑犓犔犕犖犗犘犙犚犛犜犝犞犠犡犢犣犤犥犦犧犨犩犪犫犮犱犲犳犵犺犻犼犽犾犿狀狅狆狇狉狊狋狌狏狑狓狔狕狖狘狚狛�".split("");
- 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];}
- D[161] = "����������������������������������������������������������������������������������������������������������������������������������������������������������������� 、。·ˉˇ¨〃々—~‖…‘’“”〔〕〈〉《》「」『』〖〗【】±×÷∶∧∨∑∏∪∩∈∷√⊥∥∠⌒⊙∫∮≡≌≈∽∝≠≮≯≤≥∞∵∴♂♀°′″℃$¤¢£‰§№☆★○●◎◇◆□■△▲※→←↑↓〓�".split("");
- 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];}
- D[162] = "�����������������������������������������������������������������������������������������������������������������������������������������������������������������ⅰⅱⅲⅳⅴⅵⅶⅷⅸⅹ������⒈⒉⒊⒋⒌⒍⒎⒏⒐⒑⒒⒓⒔⒕⒖⒗⒘⒙⒚⒛⑴⑵⑶⑷⑸⑹⑺⑻⑼⑽⑾⑿⒀⒁⒂⒃⒄⒅⒆⒇①②③④⑤⑥⑦⑧⑨⑩��㈠㈡㈢㈣㈤㈥㈦㈧㈨㈩��ⅠⅡⅢⅣⅤⅥⅦⅧⅨⅩⅪⅫ���".split("");
- 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];}
- D[163] = "�����������������������������������������������������������������������������������������������������������������������������������������������������������������!"#¥%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|} ̄�".split("");
- 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];}
- D[164] = "�����������������������������������������������������������������������������������������������������������������������������������������������������������������ぁあぃいぅうぇえぉおかがきぎくぐけげこごさざしじすずせぜそぞただちぢっつづてでとどなにぬねのはばぱひびぴふぶぷへべぺほぼぽまみむめもゃやゅゆょよらりるれろゎわゐゑをん������������".split("");
- 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];}
- D[165] = "�����������������������������������������������������������������������������������������������������������������������������������������������������������������ァアィイゥウェエォオカガキギクグケゲコゴサザシジスズセゼソゾタダチヂッツヅテデトドナニヌネノハバパヒビピフブプヘベペホボポマミムメモャヤュユョヨラリルレロヮワヰヱヲンヴヵヶ���������".split("");
- 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];}
- D[166] = "�����������������������������������������������������������������������������������������������������������������������������������������������������������������ΑΒΓΔΕΖΗΘΙΚΛΜΝΞΟΠΡΣΤΥΦΧΨΩ��������αβγδεζηθικλμνξοπρστυφχψω�������︵︶︹︺︿﹀︽︾﹁﹂﹃﹄��︻︼︷︸︱�︳︴����������".split("");
- 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];}
- D[167] = "�����������������������������������������������������������������������������������������������������������������������������������������������������������������АБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯ���������������абвгдеёжзийклмнопрстуфхцчшщъыьэюя��������������".split("");
- 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];}
- D[168] = "����������������������������������������������������������������ˊˋ˙–―‥‵℅℉↖↗↘↙∕∟∣≒≦≧⊿═║╒╓╔╕╖╗╘╙╚╛╜╝╞╟╠╡╢╣╤╥╦╧╨╩╪╫╬╭╮╯╰╱╲╳▁▂▃▄▅▆▇�█▉▊▋▌▍▎▏▓▔▕▼▽◢◣◤◥☉⊕〒〝〞�����������āáǎàēéěèīíǐìōóǒòūúǔùǖǘǚǜüêɑ�ńň�ɡ����ㄅㄆㄇㄈㄉㄊㄋㄌㄍㄎㄏㄐㄑㄒㄓㄔㄕㄖㄗㄘㄙㄚㄛㄜㄝㄞㄟㄠㄡㄢㄣㄤㄥㄦㄧㄨㄩ����������������������".split("");
- 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];}
- D[169] = "����������������������������������������������������������������〡〢〣〤〥〦〧〨〩㊣㎎㎏㎜㎝㎞㎡㏄㏎㏑㏒㏕︰¬¦�℡㈱�‐���ー゛゜ヽヾ〆ゝゞ﹉﹊﹋﹌﹍﹎﹏﹐﹑﹒﹔﹕﹖﹗﹙﹚﹛﹜﹝﹞﹟﹠﹡�﹢﹣﹤﹥﹦﹨﹩﹪﹫�������������〇�������������─━│┃┄┅┆┇┈┉┊┋┌┍┎┏┐┑┒┓└┕┖┗┘┙┚┛├┝┞┟┠┡┢┣┤┥┦┧┨┩┪┫┬┭┮┯┰┱┲┳┴┵┶┷┸┹┺┻┼┽┾┿╀╁╂╃╄╅╆╇╈╉╊╋����������������".split("");
- 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];}
- D[170] = "����������������������������������������������������������������狜狝狟狢狣狤狥狦狧狪狫狵狶狹狽狾狿猀猂猄猅猆猇猈猉猋猌猍猏猐猑猒猔猘猙猚猟猠猣猤猦猧猨猭猯猰猲猳猵猶猺猻猼猽獀獁獂獃獄獅獆獇獈�獉獊獋獌獎獏獑獓獔獕獖獘獙獚獛獜獝獞獟獡獢獣獤獥獦獧獨獩獪獫獮獰獱�����������������������������������������������������������������������������������������������".split("");
- 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];}
- D[171] = "����������������������������������������������������������������獲獳獴獵獶獷獸獹獺獻獼獽獿玀玁玂玃玅玆玈玊玌玍玏玐玒玓玔玕玗玘玙玚玜玝玞玠玡玣玤玥玦玧玨玪玬玭玱玴玵玶玸玹玼玽玾玿珁珃珄珅珆珇�珋珌珎珒珓珔珕珖珗珘珚珛珜珝珟珡珢珣珤珦珨珪珫珬珮珯珰珱珳珴珵珶珷�����������������������������������������������������������������������������������������������".split("");
- 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];}
- D[172] = "����������������������������������������������������������������珸珹珺珻珼珽現珿琀琁琂琄琇琈琋琌琍琎琑琒琓琔琕琖琗琘琙琜琝琞琟琠琡琣琤琧琩琫琭琯琱琲琷琸琹琺琻琽琾琿瑀瑂瑃瑄瑅瑆瑇瑈瑉瑊瑋瑌瑍�瑎瑏瑐瑑瑒瑓瑔瑖瑘瑝瑠瑡瑢瑣瑤瑥瑦瑧瑨瑩瑪瑫瑬瑮瑯瑱瑲瑳瑴瑵瑸瑹瑺�����������������������������������������������������������������������������������������������".split("");
- 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];}
- D[173] = "����������������������������������������������������������������瑻瑼瑽瑿璂璄璅璆璈璉璊璌璍璏璑璒璓璔璕璖璗璘璙璚璛璝璟璠璡璢璣璤璥璦璪璫璬璭璮璯環璱璲璳璴璵璶璷璸璹璻璼璽璾璿瓀瓁瓂瓃瓄瓅瓆瓇�瓈瓉瓊瓋瓌瓍瓎瓏瓐瓑瓓瓔瓕瓖瓗瓘瓙瓚瓛瓝瓟瓡瓥瓧瓨瓩瓪瓫瓬瓭瓰瓱瓲�����������������������������������������������������������������������������������������������".split("");
- 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];}
- D[174] = "����������������������������������������������������������������瓳瓵瓸瓹瓺瓻瓼瓽瓾甀甁甂甃甅甆甇甈甉甊甋甌甎甐甒甔甕甖甗甛甝甞甠甡產産甤甦甧甪甮甴甶甹甼甽甿畁畂畃畄畆畇畉畊畍畐畑畒畓畕畖畗畘�畝畞畟畠畡畢畣畤畧畨畩畫畬畭畮畯異畱畳畵當畷畺畻畼畽畾疀疁疂疄疅疇�����������������������������������������������������������������������������������������������".split("");
- 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];}
- D[175] = "����������������������������������������������������������������疈疉疊疌疍疎疐疓疕疘疛疜疞疢疦疧疨疩疪疭疶疷疺疻疿痀痁痆痋痌痎痏痐痑痓痗痙痚痜痝痟痠痡痥痩痬痭痮痯痲痳痵痶痷痸痺痻痽痾瘂瘄瘆瘇�瘈瘉瘋瘍瘎瘏瘑瘒瘓瘔瘖瘚瘜瘝瘞瘡瘣瘧瘨瘬瘮瘯瘱瘲瘶瘷瘹瘺瘻瘽癁療癄�����������������������������������������������������������������������������������������������".split("");
- 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];}
- D[176] = "����������������������������������������������������������������癅癆癇癈癉癊癋癎癏癐癑癒癓癕癗癘癙癚癛癝癟癠癡癢癤癥癦癧癨癩癪癬癭癮癰癱癲癳癴癵癶癷癹発發癿皀皁皃皅皉皊皌皍皏皐皒皔皕皗皘皚皛�皜皝皞皟皠皡皢皣皥皦皧皨皩皪皫皬皭皯皰皳皵皶皷皸皹皺皻皼皽皾盀盁盃啊阿埃挨哎唉哀皑癌蔼矮艾碍爱隘鞍氨安俺按暗岸胺案肮昂盎凹敖熬翱袄傲奥懊澳芭捌扒叭吧笆八疤巴拔跋靶把耙坝霸罢爸白柏百摆佰败拜稗斑班搬扳般颁板版扮拌伴瓣半办绊邦帮梆榜膀绑棒磅蚌镑傍谤苞胞包褒剥�".split("");
- 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];}
- D[177] = "����������������������������������������������������������������盄盇盉盋盌盓盕盙盚盜盝盞盠盡盢監盤盦盧盨盩盪盫盬盭盰盳盵盶盷盺盻盽盿眀眂眃眅眆眊県眎眏眐眑眒眓眔眕眖眗眘眛眜眝眞眡眣眤眥眧眪眫�眬眮眰眱眲眳眴眹眻眽眾眿睂睄睅睆睈睉睊睋睌睍睎睏睒睓睔睕睖睗睘睙睜薄雹保堡饱宝抱报暴豹鲍爆杯碑悲卑北辈背贝钡倍狈备惫焙被奔苯本笨崩绷甭泵蹦迸逼鼻比鄙笔彼碧蓖蔽毕毙毖币庇痹闭敝弊必辟壁臂避陛鞭边编贬扁便变卞辨辩辫遍标彪膘表鳖憋别瘪彬斌濒滨宾摈兵冰柄丙秉饼炳�".split("");
- 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];}
- D[178] = "����������������������������������������������������������������睝睞睟睠睤睧睩睪睭睮睯睰睱睲睳睴睵睶睷睸睺睻睼瞁瞂瞃瞆瞇瞈瞉瞊瞋瞏瞐瞓瞔瞕瞖瞗瞘瞙瞚瞛瞜瞝瞞瞡瞣瞤瞦瞨瞫瞭瞮瞯瞱瞲瞴瞶瞷瞸瞹瞺�瞼瞾矀矁矂矃矄矅矆矇矈矉矊矋矌矎矏矐矑矒矓矔矕矖矘矙矚矝矞矟矠矡矤病并玻菠播拨钵波博勃搏铂箔伯帛舶脖膊渤泊驳捕卜哺补埠不布步簿部怖擦猜裁材才财睬踩采彩菜蔡餐参蚕残惭惨灿苍舱仓沧藏操糙槽曹草厕策侧册测层蹭插叉茬茶查碴搽察岔差诧拆柴豺搀掺蝉馋谗缠铲产阐颤昌猖�".split("");
- 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];}
- D[179] = "����������������������������������������������������������������矦矨矪矯矰矱矲矴矵矷矹矺矻矼砃砄砅砆砇砈砊砋砎砏砐砓砕砙砛砞砠砡砢砤砨砪砫砮砯砱砲砳砵砶砽砿硁硂硃硄硆硈硉硊硋硍硏硑硓硔硘硙硚�硛硜硞硟硠硡硢硣硤硥硦硧硨硩硯硰硱硲硳硴硵硶硸硹硺硻硽硾硿碀碁碂碃场尝常长偿肠厂敞畅唱倡超抄钞朝嘲潮巢吵炒车扯撤掣彻澈郴臣辰尘晨忱沉陈趁衬撑称城橙成呈乘程惩澄诚承逞骋秤吃痴持匙池迟弛驰耻齿侈尺赤翅斥炽充冲虫崇宠抽酬畴踌稠愁筹仇绸瞅丑臭初出橱厨躇锄雏滁除楚�".split("");
- 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];}
- D[180] = "����������������������������������������������������������������碄碅碆碈碊碋碏碐碒碔碕碖碙碝碞碠碢碤碦碨碩碪碫碬碭碮碯碵碶碷碸確碻碼碽碿磀磂磃磄磆磇磈磌磍磎磏磑磒磓磖磗磘磚磛磜磝磞磟磠磡磢磣�磤磥磦磧磩磪磫磭磮磯磰磱磳磵磶磸磹磻磼磽磾磿礀礂礃礄礆礇礈礉礊礋礌础储矗搐触处揣川穿椽传船喘串疮窗幢床闯创吹炊捶锤垂春椿醇唇淳纯蠢戳绰疵茨磁雌辞慈瓷词此刺赐次聪葱囱匆从丛凑粗醋簇促蹿篡窜摧崔催脆瘁粹淬翠村存寸磋撮搓措挫错搭达答瘩打大呆歹傣戴带殆代贷袋待逮�".split("");
- 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];}
- D[181] = "����������������������������������������������������������������礍礎礏礐礑礒礔礕礖礗礘礙礚礛礜礝礟礠礡礢礣礥礦礧礨礩礪礫礬礭礮礯礰礱礲礳礵礶礷礸礹礽礿祂祃祄祅祇祊祋祌祍祎祏祐祑祒祔祕祘祙祡祣�祤祦祩祪祫祬祮祰祱祲祳祴祵祶祹祻祼祽祾祿禂禃禆禇禈禉禋禌禍禎禐禑禒怠耽担丹单郸掸胆旦氮但惮淡诞弹蛋当挡党荡档刀捣蹈倒岛祷导到稻悼道盗德得的蹬灯登等瞪凳邓堤低滴迪敌笛狄涤翟嫡抵底地蒂第帝弟递缔颠掂滇碘点典靛垫电佃甸店惦奠淀殿碉叼雕凋刁掉吊钓调跌爹碟蝶迭谍叠�".split("");
- 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];}
- D[182] = "����������������������������������������������������������������禓禔禕禖禗禘禙禛禜禝禞禟禠禡禢禣禤禥禦禨禩禪禫禬禭禮禯禰禱禲禴禵禶禷禸禼禿秂秄秅秇秈秊秌秎秏秐秓秔秖秗秙秚秛秜秝秞秠秡秢秥秨秪�秬秮秱秲秳秴秵秶秷秹秺秼秾秿稁稄稅稇稈稉稊稌稏稐稑稒稓稕稖稘稙稛稜丁盯叮钉顶鼎锭定订丢东冬董懂动栋侗恫冻洞兜抖斗陡豆逗痘都督毒犊独读堵睹赌杜镀肚度渡妒端短锻段断缎堆兑队对墩吨蹲敦顿囤钝盾遁掇哆多夺垛躲朵跺舵剁惰堕蛾峨鹅俄额讹娥恶厄扼遏鄂饿恩而儿耳尔饵洱二�".split("");
- 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];}
- D[183] = "����������������������������������������������������������������稝稟稡稢稤稥稦稧稨稩稪稫稬稭種稯稰稱稲稴稵稶稸稺稾穀穁穂穃穄穅穇穈穉穊穋穌積穎穏穐穒穓穔穕穖穘穙穚穛穜穝穞穟穠穡穢穣穤穥穦穧穨�穩穪穫穬穭穮穯穱穲穳穵穻穼穽穾窂窅窇窉窊窋窌窎窏窐窓窔窙窚窛窞窡窢贰发罚筏伐乏阀法珐藩帆番翻樊矾钒繁凡烦反返范贩犯饭泛坊芳方肪房防妨仿访纺放菲非啡飞肥匪诽吠肺废沸费芬酚吩氛分纷坟焚汾粉奋份忿愤粪丰封枫蜂峰锋风疯烽逢冯缝讽奉凤佛否夫敷肤孵扶拂辐幅氟符伏俘服�".split("");
- 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];}
- D[184] = "����������������������������������������������������������������窣窤窧窩窪窫窮窯窰窱窲窴窵窶窷窸窹窺窻窼窽窾竀竁竂竃竄竅竆竇竈竉竊竌竍竎竏竐竑竒竓竔竕竗竘竚竛竜竝竡竢竤竧竨竩竪竫竬竮竰竱竲竳�竴竵競竷竸竻竼竾笀笁笂笅笇笉笌笍笎笐笒笓笖笗笘笚笜笝笟笡笢笣笧笩笭浮涪福袱弗甫抚辅俯釜斧脯腑府腐赴副覆赋复傅付阜父腹负富讣附妇缚咐噶嘎该改概钙盖溉干甘杆柑竿肝赶感秆敢赣冈刚钢缸肛纲岗港杠篙皋高膏羔糕搞镐稿告哥歌搁戈鸽胳疙割革葛格蛤阁隔铬个各给根跟耕更庚羹�".split("");
- 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];}
- D[185] = "����������������������������������������������������������������笯笰笲笴笵笶笷笹笻笽笿筀筁筂筃筄筆筈筊筍筎筓筕筗筙筜筞筟筡筣筤筥筦筧筨筩筪筫筬筭筯筰筳筴筶筸筺筼筽筿箁箂箃箄箆箇箈箉箊箋箌箎箏�箑箒箓箖箘箙箚箛箞箟箠箣箤箥箮箯箰箲箳箵箶箷箹箺箻箼箽箾箿節篂篃範埂耿梗工攻功恭龚供躬公宫弓巩汞拱贡共钩勾沟苟狗垢构购够辜菇咕箍估沽孤姑鼓古蛊骨谷股故顾固雇刮瓜剐寡挂褂乖拐怪棺关官冠观管馆罐惯灌贯光广逛瑰规圭硅归龟闺轨鬼诡癸桂柜跪贵刽辊滚棍锅郭国果裹过哈�".split("");
- 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];}
- D[186] = "����������������������������������������������������������������篅篈築篊篋篍篎篏篐篒篔篕篖篗篘篛篜篞篟篠篢篣篤篧篨篩篫篬篭篯篰篲篳篴篵篶篸篹篺篻篽篿簀簁簂簃簄簅簆簈簉簊簍簎簐簑簒簓簔簕簗簘簙�簚簛簜簝簞簠簡簢簣簤簥簨簩簫簬簭簮簯簰簱簲簳簴簵簶簷簹簺簻簼簽簾籂骸孩海氦亥害骇酣憨邯韩含涵寒函喊罕翰撼捍旱憾悍焊汗汉夯杭航壕嚎豪毫郝好耗号浩呵喝荷菏核禾和何合盒貉阂河涸赫褐鹤贺嘿黑痕很狠恨哼亨横衡恒轰哄烘虹鸿洪宏弘红喉侯猴吼厚候后呼乎忽瑚壶葫胡蝴狐糊湖�".split("");
- 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];}
- D[187] = "����������������������������������������������������������������籃籄籅籆籇籈籉籊籋籌籎籏籐籑籒籓籔籕籖籗籘籙籚籛籜籝籞籟籠籡籢籣籤籥籦籧籨籩籪籫籬籭籮籯籰籱籲籵籶籷籸籹籺籾籿粀粁粂粃粄粅粆粇�粈粊粋粌粍粎粏粐粓粔粖粙粚粛粠粡粣粦粧粨粩粫粬粭粯粰粴粵粶粷粸粺粻弧虎唬护互沪户花哗华猾滑画划化话槐徊怀淮坏欢环桓还缓换患唤痪豢焕涣宦幻荒慌黄磺蝗簧皇凰惶煌晃幌恍谎灰挥辉徽恢蛔回毁悔慧卉惠晦贿秽会烩汇讳诲绘荤昏婚魂浑混豁活伙火获或惑霍货祸击圾基机畸稽积箕�".split("");
- 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];}
- D[188] = "����������������������������������������������������������������粿糀糂糃糄糆糉糋糎糏糐糑糒糓糔糘糚糛糝糞糡糢糣糤糥糦糧糩糪糫糬糭糮糰糱糲糳糴糵糶糷糹糺糼糽糾糿紀紁紂紃約紅紆紇紈紉紋紌納紎紏紐�紑紒紓純紕紖紗紘紙級紛紜紝紞紟紡紣紤紥紦紨紩紪紬紭紮細紱紲紳紴紵紶肌饥迹激讥鸡姬绩缉吉极棘辑籍集及急疾汲即嫉级挤几脊己蓟技冀季伎祭剂悸济寄寂计记既忌际妓继纪嘉枷夹佳家加荚颊贾甲钾假稼价架驾嫁歼监坚尖笺间煎兼肩艰奸缄茧检柬碱硷拣捡简俭剪减荐槛鉴践贱见键箭件�".split("");
- 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];}
- D[189] = "����������������������������������������������������������������紷紸紹紺紻紼紽紾紿絀絁終絃組絅絆絇絈絉絊絋経絍絎絏結絑絒絓絔絕絖絗絘絙絚絛絜絝絞絟絠絡絢絣絤絥給絧絨絩絪絫絬絭絯絰統絲絳絴絵絶�絸絹絺絻絼絽絾絿綀綁綂綃綄綅綆綇綈綉綊綋綌綍綎綏綐綑綒經綔綕綖綗綘健舰剑饯渐溅涧建僵姜将浆江疆蒋桨奖讲匠酱降蕉椒礁焦胶交郊浇骄娇嚼搅铰矫侥脚狡角饺缴绞剿教酵轿较叫窖揭接皆秸街阶截劫节桔杰捷睫竭洁结解姐戒藉芥界借介疥诫届巾筋斤金今津襟紧锦仅谨进靳晋禁近烬浸�".split("");
- 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];}
- D[190] = "����������������������������������������������������������������継続綛綜綝綞綟綠綡綢綣綤綥綧綨綩綪綫綬維綯綰綱網綳綴綵綶綷綸綹綺綻綼綽綾綿緀緁緂緃緄緅緆緇緈緉緊緋緌緍緎総緐緑緒緓緔緕緖緗緘緙�線緛緜緝緞緟締緡緢緣緤緥緦緧編緩緪緫緬緭緮緯緰緱緲緳練緵緶緷緸緹緺尽劲荆兢茎睛晶鲸京惊精粳经井警景颈静境敬镜径痉靖竟竞净炯窘揪究纠玖韭久灸九酒厩救旧臼舅咎就疚鞠拘狙疽居驹菊局咀矩举沮聚拒据巨具距踞锯俱句惧炬剧捐鹃娟倦眷卷绢撅攫抉掘倔爵觉决诀绝均菌钧军君峻�".split("");
- 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];}
- D[191] = "����������������������������������������������������������������緻緼緽緾緿縀縁縂縃縄縅縆縇縈縉縊縋縌縍縎縏縐縑縒縓縔縕縖縗縘縙縚縛縜縝縞縟縠縡縢縣縤縥縦縧縨縩縪縫縬縭縮縯縰縱縲縳縴縵縶縷縸縹�縺縼總績縿繀繂繃繄繅繆繈繉繊繋繌繍繎繏繐繑繒繓織繕繖繗繘繙繚繛繜繝俊竣浚郡骏喀咖卡咯开揩楷凯慨刊堪勘坎砍看康慷糠扛抗亢炕考拷烤靠坷苛柯棵磕颗科壳咳可渴克刻客课肯啃垦恳坑吭空恐孔控抠口扣寇枯哭窟苦酷库裤夸垮挎跨胯块筷侩快宽款匡筐狂框矿眶旷况亏盔岿窥葵奎魁傀�".split("");
- 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];}
- D[192] = "����������������������������������������������������������������繞繟繠繡繢繣繤繥繦繧繨繩繪繫繬繭繮繯繰繱繲繳繴繵繶繷繸繹繺繻繼繽繾繿纀纁纃纄纅纆纇纈纉纊纋續纍纎纏纐纑纒纓纔纕纖纗纘纙纚纜纝纞�纮纴纻纼绖绤绬绹缊缐缞缷缹缻缼缽缾缿罀罁罃罆罇罈罉罊罋罌罍罎罏罒罓馈愧溃坤昆捆困括扩廓阔垃拉喇蜡腊辣啦莱来赖蓝婪栏拦篮阑兰澜谰揽览懒缆烂滥琅榔狼廊郎朗浪捞劳牢老佬姥酪烙涝勒乐雷镭蕾磊累儡垒擂肋类泪棱楞冷厘梨犁黎篱狸离漓理李里鲤礼莉荔吏栗丽厉励砾历利傈例俐�".split("");
- 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];}
- D[193] = "����������������������������������������������������������������罖罙罛罜罝罞罠罣罤罥罦罧罫罬罭罯罰罳罵罶罷罸罺罻罼罽罿羀羂羃羄羅羆羇羈羉羋羍羏羐羑羒羓羕羖羗羘羙羛羜羠羢羣羥羦羨義羪羫羬羭羮羱�羳羴羵羶羷羺羻羾翀翂翃翄翆翇翈翉翋翍翏翐翑習翓翖翗翙翚翛翜翝翞翢翣痢立粒沥隶力璃哩俩联莲连镰廉怜涟帘敛脸链恋炼练粮凉梁粱良两辆量晾亮谅撩聊僚疗燎寥辽潦了撂镣廖料列裂烈劣猎琳林磷霖临邻鳞淋凛赁吝拎玲菱零龄铃伶羚凌灵陵岭领另令溜琉榴硫馏留刘瘤流柳六龙聋咙笼窿�".split("");
- 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];}
- D[194] = "����������������������������������������������������������������翤翧翨翪翫翬翭翯翲翴翵翶翷翸翹翺翽翾翿耂耇耈耉耊耎耏耑耓耚耛耝耞耟耡耣耤耫耬耭耮耯耰耲耴耹耺耼耾聀聁聄聅聇聈聉聎聏聐聑聓聕聖聗�聙聛聜聝聞聟聠聡聢聣聤聥聦聧聨聫聬聭聮聯聰聲聳聴聵聶職聸聹聺聻聼聽隆垄拢陇楼娄搂篓漏陋芦卢颅庐炉掳卤虏鲁麓碌露路赂鹿潞禄录陆戮驴吕铝侣旅履屡缕虑氯律率滤绿峦挛孪滦卵乱掠略抡轮伦仑沦纶论萝螺罗逻锣箩骡裸落洛骆络妈麻玛码蚂马骂嘛吗埋买麦卖迈脉瞒馒蛮满蔓曼慢漫�".split("");
- 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];}
- D[195] = "����������������������������������������������������������������聾肁肂肅肈肊肍肎肏肐肑肒肔肕肗肙肞肣肦肧肨肬肰肳肵肶肸肹肻胅胇胈胉胊胋胏胐胑胒胓胔胕胘胟胠胢胣胦胮胵胷胹胻胾胿脀脁脃脄脅脇脈脋�脌脕脗脙脛脜脝脟脠脡脢脣脤脥脦脧脨脩脪脫脭脮脰脳脴脵脷脹脺脻脼脽脿谩芒茫盲氓忙莽猫茅锚毛矛铆卯茂冒帽貌贸么玫枚梅酶霉煤没眉媒镁每美昧寐妹媚门闷们萌蒙檬盟锰猛梦孟眯醚靡糜迷谜弥米秘觅泌蜜密幂棉眠绵冕免勉娩缅面苗描瞄藐秒渺庙妙蔑灭民抿皿敏悯闽明螟鸣铭名命谬摸�".split("");
- 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];}
- D[196] = "����������������������������������������������������������������腀腁腂腃腄腅腇腉腍腎腏腒腖腗腘腛腜腝腞腟腡腢腣腤腦腨腪腫腬腯腲腳腵腶腷腸膁膃膄膅膆膇膉膋膌膍膎膐膒膓膔膕膖膗膙膚膞膟膠膡膢膤膥�膧膩膫膬膭膮膯膰膱膲膴膵膶膷膸膹膼膽膾膿臄臅臇臈臉臋臍臎臏臐臑臒臓摹蘑模膜磨摩魔抹末莫墨默沫漠寞陌谋牟某拇牡亩姆母墓暮幕募慕木目睦牧穆拿哪呐钠那娜纳氖乃奶耐奈南男难囊挠脑恼闹淖呢馁内嫩能妮霓倪泥尼拟你匿腻逆溺蔫拈年碾撵捻念娘酿鸟尿捏聂孽啮镊镍涅您柠狞凝宁�".split("");
- 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];}
- D[197] = "����������������������������������������������������������������臔臕臖臗臘臙臚臛臜臝臞臟臠臡臢臤臥臦臨臩臫臮臯臰臱臲臵臶臷臸臹臺臽臿舃與興舉舊舋舎舏舑舓舕舖舗舘舙舚舝舠舤舥舦舧舩舮舲舺舼舽舿�艀艁艂艃艅艆艈艊艌艍艎艐艑艒艓艔艕艖艗艙艛艜艝艞艠艡艢艣艤艥艦艧艩拧泞牛扭钮纽脓浓农弄奴努怒女暖虐疟挪懦糯诺哦欧鸥殴藕呕偶沤啪趴爬帕怕琶拍排牌徘湃派攀潘盘磐盼畔判叛乓庞旁耪胖抛咆刨炮袍跑泡呸胚培裴赔陪配佩沛喷盆砰抨烹澎彭蓬棚硼篷膨朋鹏捧碰坯砒霹批披劈琵毗�".split("");
- 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];}
- D[198] = "����������������������������������������������������������������艪艫艬艭艱艵艶艷艸艻艼芀芁芃芅芆芇芉芌芐芓芔芕芖芚芛芞芠芢芣芧芲芵芶芺芻芼芿苀苂苃苅苆苉苐苖苙苚苝苢苧苨苩苪苬苭苮苰苲苳苵苶苸�苺苼苽苾苿茀茊茋茍茐茒茓茖茘茙茝茞茟茠茡茢茣茤茥茦茩茪茮茰茲茷茻茽啤脾疲皮匹痞僻屁譬篇偏片骗飘漂瓢票撇瞥拼频贫品聘乒坪苹萍平凭瓶评屏坡泼颇婆破魄迫粕剖扑铺仆莆葡菩蒲埔朴圃普浦谱曝瀑期欺栖戚妻七凄漆柒沏其棋奇歧畦崎脐齐旗祈祁骑起岂乞企启契砌器气迄弃汽泣讫掐�".split("");
- 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];}
- D[199] = "����������������������������������������������������������������茾茿荁荂荄荅荈荊荋荌荍荎荓荕荖荗荘荙荝荢荰荱荲荳荴荵荶荹荺荾荿莀莁莂莃莄莇莈莊莋莌莍莏莐莑莔莕莖莗莙莚莝莟莡莢莣莤莥莦莧莬莭莮�莯莵莻莾莿菂菃菄菆菈菉菋菍菎菐菑菒菓菕菗菙菚菛菞菢菣菤菦菧菨菫菬菭恰洽牵扦钎铅千迁签仟谦乾黔钱钳前潜遣浅谴堑嵌欠歉枪呛腔羌墙蔷强抢橇锹敲悄桥瞧乔侨巧鞘撬翘峭俏窍切茄且怯窃钦侵亲秦琴勤芹擒禽寝沁青轻氢倾卿清擎晴氰情顷请庆琼穷秋丘邱球求囚酋泅趋区蛆曲躯屈驱渠�".split("");
- 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];}
- D[200] = "����������������������������������������������������������������菮華菳菴菵菶菷菺菻菼菾菿萀萂萅萇萈萉萊萐萒萓萔萕萖萗萙萚萛萞萟萠萡萢萣萩萪萫萬萭萮萯萰萲萳萴萵萶萷萹萺萻萾萿葀葁葂葃葄葅葇葈葉�葊葋葌葍葎葏葐葒葓葔葕葖葘葝葞葟葠葢葤葥葦葧葨葪葮葯葰葲葴葷葹葻葼取娶龋趣去圈颧权醛泉全痊拳犬券劝缺炔瘸却鹊榷确雀裙群然燃冉染瓤壤攘嚷让饶扰绕惹热壬仁人忍韧任认刃妊纫扔仍日戎茸蓉荣融熔溶容绒冗揉柔肉茹蠕儒孺如辱乳汝入褥软阮蕊瑞锐闰润若弱撒洒萨腮鳃塞赛三叁�".split("");
- 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];}
- D[201] = "����������������������������������������������������������������葽葾葿蒀蒁蒃蒄蒅蒆蒊蒍蒏蒐蒑蒒蒓蒔蒕蒖蒘蒚蒛蒝蒞蒟蒠蒢蒣蒤蒥蒦蒧蒨蒩蒪蒫蒬蒭蒮蒰蒱蒳蒵蒶蒷蒻蒼蒾蓀蓂蓃蓅蓆蓇蓈蓋蓌蓎蓏蓒蓔蓕蓗�蓘蓙蓚蓛蓜蓞蓡蓢蓤蓧蓨蓩蓪蓫蓭蓮蓯蓱蓲蓳蓴蓵蓶蓷蓸蓹蓺蓻蓽蓾蔀蔁蔂伞散桑嗓丧搔骚扫嫂瑟色涩森僧莎砂杀刹沙纱傻啥煞筛晒珊苫杉山删煽衫闪陕擅赡膳善汕扇缮墒伤商赏晌上尚裳梢捎稍烧芍勺韶少哨邵绍奢赊蛇舌舍赦摄射慑涉社设砷申呻伸身深娠绅神沈审婶甚肾慎渗声生甥牲升绳�".split("");
- 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];}
- D[202] = "����������������������������������������������������������������蔃蔄蔅蔆蔇蔈蔉蔊蔋蔍蔎蔏蔐蔒蔔蔕蔖蔘蔙蔛蔜蔝蔞蔠蔢蔣蔤蔥蔦蔧蔨蔩蔪蔭蔮蔯蔰蔱蔲蔳蔴蔵蔶蔾蔿蕀蕁蕂蕄蕅蕆蕇蕋蕌蕍蕎蕏蕐蕑蕒蕓蕔蕕�蕗蕘蕚蕛蕜蕝蕟蕠蕡蕢蕣蕥蕦蕧蕩蕪蕫蕬蕭蕮蕯蕰蕱蕳蕵蕶蕷蕸蕼蕽蕿薀薁省盛剩胜圣师失狮施湿诗尸虱十石拾时什食蚀实识史矢使屎驶始式示士世柿事拭誓逝势是嗜噬适仕侍释饰氏市恃室视试收手首守寿授售受瘦兽蔬枢梳殊抒输叔舒淑疏书赎孰熟薯暑曙署蜀黍鼠属术述树束戍竖墅庶数漱�".split("");
- 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];}
- D[203] = "����������������������������������������������������������������薂薃薆薈薉薊薋薌薍薎薐薑薒薓薔薕薖薗薘薙薚薝薞薟薠薡薢薣薥薦薧薩薫薬薭薱薲薳薴薵薶薸薺薻薼薽薾薿藀藂藃藄藅藆藇藈藊藋藌藍藎藑藒�藔藖藗藘藙藚藛藝藞藟藠藡藢藣藥藦藧藨藪藫藬藭藮藯藰藱藲藳藴藵藶藷藸恕刷耍摔衰甩帅栓拴霜双爽谁水睡税吮瞬顺舜说硕朔烁斯撕嘶思私司丝死肆寺嗣四伺似饲巳松耸怂颂送宋讼诵搜艘擞嗽苏酥俗素速粟僳塑溯宿诉肃酸蒜算虽隋随绥髓碎岁穗遂隧祟孙损笋蓑梭唆缩琐索锁所塌他它她塔�".split("");
- 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];}
- D[204] = "����������������������������������������������������������������藹藺藼藽藾蘀蘁蘂蘃蘄蘆蘇蘈蘉蘊蘋蘌蘍蘎蘏蘐蘒蘓蘔蘕蘗蘘蘙蘚蘛蘜蘝蘞蘟蘠蘡蘢蘣蘤蘥蘦蘨蘪蘫蘬蘭蘮蘯蘰蘱蘲蘳蘴蘵蘶蘷蘹蘺蘻蘽蘾蘿虀�虁虂虃虄虅虆虇虈虉虊虋虌虒虓處虖虗虘虙虛虜虝號虠虡虣虤虥虦虧虨虩虪獭挞蹋踏胎苔抬台泰酞太态汰坍摊贪瘫滩坛檀痰潭谭谈坦毯袒碳探叹炭汤塘搪堂棠膛唐糖倘躺淌趟烫掏涛滔绦萄桃逃淘陶讨套特藤腾疼誊梯剔踢锑提题蹄啼体替嚏惕涕剃屉天添填田甜恬舔腆挑条迢眺跳贴铁帖厅听烃�".split("");
- 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];}
- D[205] = "����������������������������������������������������������������虭虯虰虲虳虴虵虶虷虸蚃蚄蚅蚆蚇蚈蚉蚎蚏蚐蚑蚒蚔蚖蚗蚘蚙蚚蚛蚞蚟蚠蚡蚢蚥蚦蚫蚭蚮蚲蚳蚷蚸蚹蚻蚼蚽蚾蚿蛁蛂蛃蛅蛈蛌蛍蛒蛓蛕蛖蛗蛚蛜�蛝蛠蛡蛢蛣蛥蛦蛧蛨蛪蛫蛬蛯蛵蛶蛷蛺蛻蛼蛽蛿蜁蜄蜅蜆蜋蜌蜎蜏蜐蜑蜔蜖汀廷停亭庭挺艇通桐酮瞳同铜彤童桶捅筒统痛偷投头透凸秃突图徒途涂屠土吐兔湍团推颓腿蜕褪退吞屯臀拖托脱鸵陀驮驼椭妥拓唾挖哇蛙洼娃瓦袜歪外豌弯湾玩顽丸烷完碗挽晚皖惋宛婉万腕汪王亡枉网往旺望忘妄威�".split("");
- 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];}
- D[206] = "����������������������������������������������������������������蜙蜛蜝蜟蜠蜤蜦蜧蜨蜪蜫蜬蜭蜯蜰蜲蜳蜵蜶蜸蜹蜺蜼蜽蝀蝁蝂蝃蝄蝅蝆蝊蝋蝍蝏蝐蝑蝒蝔蝕蝖蝘蝚蝛蝜蝝蝞蝟蝡蝢蝦蝧蝨蝩蝪蝫蝬蝭蝯蝱蝲蝳蝵�蝷蝸蝹蝺蝿螀螁螄螆螇螉螊螌螎螏螐螑螒螔螕螖螘螙螚螛螜螝螞螠螡螢螣螤巍微危韦违桅围唯惟为潍维苇萎委伟伪尾纬未蔚味畏胃喂魏位渭谓尉慰卫瘟温蚊文闻纹吻稳紊问嗡翁瓮挝蜗涡窝我斡卧握沃巫呜钨乌污诬屋无芜梧吾吴毋武五捂午舞伍侮坞戊雾晤物勿务悟误昔熙析西硒矽晰嘻吸锡牺�".split("");
- 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];}
- D[207] = "����������������������������������������������������������������螥螦螧螩螪螮螰螱螲螴螶螷螸螹螻螼螾螿蟁蟂蟃蟄蟅蟇蟈蟉蟌蟍蟎蟏蟐蟔蟕蟖蟗蟘蟙蟚蟜蟝蟞蟟蟡蟢蟣蟤蟦蟧蟨蟩蟫蟬蟭蟯蟰蟱蟲蟳蟴蟵蟶蟷蟸�蟺蟻蟼蟽蟿蠀蠁蠂蠄蠅蠆蠇蠈蠉蠋蠌蠍蠎蠏蠐蠑蠒蠔蠗蠘蠙蠚蠜蠝蠞蠟蠠蠣稀息希悉膝夕惜熄烯溪汐犀檄袭席习媳喜铣洗系隙戏细瞎虾匣霞辖暇峡侠狭下厦夏吓掀锨先仙鲜纤咸贤衔舷闲涎弦嫌显险现献县腺馅羡宪陷限线相厢镶香箱襄湘乡翔祥详想响享项巷橡像向象萧硝霄削哮嚣销消宵淆晓�".split("");
- 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];}
- D[208] = "����������������������������������������������������������������蠤蠥蠦蠧蠨蠩蠪蠫蠬蠭蠮蠯蠰蠱蠳蠴蠵蠶蠷蠸蠺蠻蠽蠾蠿衁衂衃衆衇衈衉衊衋衎衏衐衑衒術衕衖衘衚衛衜衝衞衟衠衦衧衪衭衯衱衳衴衵衶衸衹衺�衻衼袀袃袆袇袉袊袌袎袏袐袑袓袔袕袗袘袙袚袛袝袞袟袠袡袣袥袦袧袨袩袪小孝校肖啸笑效楔些歇蝎鞋协挟携邪斜胁谐写械卸蟹懈泄泻谢屑薪芯锌欣辛新忻心信衅星腥猩惺兴刑型形邢行醒幸杏性姓兄凶胸匈汹雄熊休修羞朽嗅锈秀袖绣墟戌需虚嘘须徐许蓄酗叙旭序畜恤絮婿绪续轩喧宣悬旋玄�".split("");
- 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];}
- D[209] = "����������������������������������������������������������������袬袮袯袰袲袳袴袵袶袸袹袺袻袽袾袿裀裃裄裇裈裊裋裌裍裏裐裑裓裖裗裚裛補裝裞裠裡裦裧裩裪裫裬裭裮裯裲裵裶裷裺裻製裿褀褁褃褄褅褆複褈�褉褋褌褍褎褏褑褔褕褖褗褘褜褝褞褟褠褢褣褤褦褧褨褩褬褭褮褯褱褲褳褵褷选癣眩绚靴薛学穴雪血勋熏循旬询寻驯巡殉汛训讯逊迅压押鸦鸭呀丫芽牙蚜崖衙涯雅哑亚讶焉咽阉烟淹盐严研蜒岩延言颜阎炎沿奄掩眼衍演艳堰燕厌砚雁唁彦焰宴谚验殃央鸯秧杨扬佯疡羊洋阳氧仰痒养样漾邀腰妖瑶�".split("");
- 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];}
- D[210] = "����������������������������������������������������������������褸褹褺褻褼褽褾褿襀襂襃襅襆襇襈襉襊襋襌襍襎襏襐襑襒襓襔襕襖襗襘襙襚襛襜襝襠襡襢襣襤襥襧襨襩襪襫襬襭襮襯襰襱襲襳襴襵襶襷襸襹襺襼�襽襾覀覂覄覅覇覈覉覊見覌覍覎規覐覑覒覓覔覕視覗覘覙覚覛覜覝覞覟覠覡摇尧遥窑谣姚咬舀药要耀椰噎耶爷野冶也页掖业叶曳腋夜液一壹医揖铱依伊衣颐夷遗移仪胰疑沂宜姨彝椅蚁倚已乙矣以艺抑易邑屹亿役臆逸肄疫亦裔意毅忆义益溢诣议谊译异翼翌绎茵荫因殷音阴姻吟银淫寅饮尹引隐�".split("");
- 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];}
- D[211] = "����������������������������������������������������������������覢覣覤覥覦覧覨覩親覫覬覭覮覯覰覱覲観覴覵覶覷覸覹覺覻覼覽覾覿觀觃觍觓觔觕觗觘觙觛觝觟觠觡觢觤觧觨觩觪觬觭觮觰觱觲觴觵觶觷觸觹觺�觻觼觽觾觿訁訂訃訄訅訆計訉訊訋訌訍討訏訐訑訒訓訔訕訖託記訙訚訛訜訝印英樱婴鹰应缨莹萤营荧蝇迎赢盈影颖硬映哟拥佣臃痈庸雍踊蛹咏泳涌永恿勇用幽优悠忧尤由邮铀犹油游酉有友右佑釉诱又幼迂淤于盂榆虞愚舆余俞逾鱼愉渝渔隅予娱雨与屿禹宇语羽玉域芋郁吁遇喻峪御愈欲狱育誉�".split("");
- 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];}
- D[212] = "����������������������������������������������������������������訞訟訠訡訢訣訤訥訦訧訨訩訪訫訬設訮訯訰許訲訳訴訵訶訷訸訹診註証訽訿詀詁詂詃詄詅詆詇詉詊詋詌詍詎詏詐詑詒詓詔評詖詗詘詙詚詛詜詝詞�詟詠詡詢詣詤詥試詧詨詩詪詫詬詭詮詯詰話該詳詴詵詶詷詸詺詻詼詽詾詿誀浴寓裕预豫驭鸳渊冤元垣袁原援辕园员圆猿源缘远苑愿怨院曰约越跃钥岳粤月悦阅耘云郧匀陨允运蕴酝晕韵孕匝砸杂栽哉灾宰载再在咱攒暂赞赃脏葬遭糟凿藻枣早澡蚤躁噪造皂灶燥责择则泽贼怎增憎曾赠扎喳渣札轧�".split("");
- 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];}
- D[213] = "����������������������������������������������������������������誁誂誃誄誅誆誇誈誋誌認誎誏誐誑誒誔誕誖誗誘誙誚誛誜誝語誟誠誡誢誣誤誥誦誧誨誩說誫説読誮誯誰誱課誳誴誵誶誷誸誹誺誻誼誽誾調諀諁諂�諃諄諅諆談諈諉諊請諌諍諎諏諐諑諒諓諔諕論諗諘諙諚諛諜諝諞諟諠諡諢諣铡闸眨栅榨咋乍炸诈摘斋宅窄债寨瞻毡詹粘沾盏斩辗崭展蘸栈占战站湛绽樟章彰漳张掌涨杖丈帐账仗胀瘴障招昭找沼赵照罩兆肇召遮折哲蛰辙者锗蔗这浙珍斟真甄砧臻贞针侦枕疹诊震振镇阵蒸挣睁征狰争怔整拯正政�".split("");
- 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];}
- D[214] = "����������������������������������������������������������������諤諥諦諧諨諩諪諫諬諭諮諯諰諱諲諳諴諵諶諷諸諹諺諻諼諽諾諿謀謁謂謃謄謅謆謈謉謊謋謌謍謎謏謐謑謒謓謔謕謖謗謘謙謚講謜謝謞謟謠謡謢謣�謤謥謧謨謩謪謫謬謭謮謯謰謱謲謳謴謵謶謷謸謹謺謻謼謽謾謿譀譁譂譃譄譅帧症郑证芝枝支吱蜘知肢脂汁之织职直植殖执值侄址指止趾只旨纸志挚掷至致置帜峙制智秩稚质炙痔滞治窒中盅忠钟衷终种肿重仲众舟周州洲诌粥轴肘帚咒皱宙昼骤珠株蛛朱猪诸诛逐竹烛煮拄瞩嘱主著柱助蛀贮铸筑�".split("");
- 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];}
- D[215] = "����������������������������������������������������������������譆譇譈證譊譋譌譍譎譏譐譑譒譓譔譕譖譗識譙譚譛譜譝譞譟譠譡譢譣譤譥譧譨譩譪譫譭譮譯議譱譲譳譴譵譶護譸譹譺譻譼譽譾譿讀讁讂讃讄讅讆�讇讈讉變讋讌讍讎讏讐讑讒讓讔讕讖讗讘讙讚讛讜讝讞讟讬讱讻诇诐诪谉谞住注祝驻抓爪拽专砖转撰赚篆桩庄装妆撞壮状椎锥追赘坠缀谆准捉拙卓桌琢茁酌啄着灼浊兹咨资姿滋淄孜紫仔籽滓子自渍字鬃棕踪宗综总纵邹走奏揍租足卒族祖诅阻组钻纂嘴醉最罪尊遵昨左佐柞做作坐座������".split("");
- 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];}
- D[216] = "����������������������������������������������������������������谸谹谺谻谼谽谾谿豀豂豃豄豅豈豊豋豍豎豏豐豑豒豓豔豖豗豘豙豛豜豝豞豟豠豣豤豥豦豧豨豩豬豭豮豯豰豱豲豴豵豶豷豻豼豽豾豿貀貁貃貄貆貇�貈貋貍貎貏貐貑貒貓貕貖貗貙貚貛貜貝貞貟負財貢貣貤貥貦貧貨販貪貫責貭亍丌兀丐廿卅丕亘丞鬲孬噩丨禺丿匕乇夭爻卮氐囟胤馗毓睾鼗丶亟鼐乜乩亓芈孛啬嘏仄厍厝厣厥厮靥赝匚叵匦匮匾赜卦卣刂刈刎刭刳刿剀剌剞剡剜蒯剽劂劁劐劓冂罔亻仃仉仂仨仡仫仞伛仳伢佤仵伥伧伉伫佞佧攸佚佝�".split("");
- 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];}
- D[217] = "����������������������������������������������������������������貮貯貰貱貲貳貴貵貶買貸貹貺費貼貽貾貿賀賁賂賃賄賅賆資賈賉賊賋賌賍賎賏賐賑賒賓賔賕賖賗賘賙賚賛賜賝賞賟賠賡賢賣賤賥賦賧賨賩質賫賬�賭賮賯賰賱賲賳賴賵賶賷賸賹賺賻購賽賾賿贀贁贂贃贄贅贆贇贈贉贊贋贌贍佟佗伲伽佶佴侑侉侃侏佾佻侪佼侬侔俦俨俪俅俚俣俜俑俟俸倩偌俳倬倏倮倭俾倜倌倥倨偾偃偕偈偎偬偻傥傧傩傺僖儆僭僬僦僮儇儋仝氽佘佥俎龠汆籴兮巽黉馘冁夔勹匍訇匐凫夙兕亠兖亳衮袤亵脔裒禀嬴蠃羸冫冱冽冼�".split("");
- 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];}
- D[218] = "����������������������������������������������������������������贎贏贐贑贒贓贔贕贖贗贘贙贚贛贜贠赑赒赗赟赥赨赩赪赬赮赯赱赲赸赹赺赻赼赽赾赿趀趂趃趆趇趈趉趌趍趎趏趐趒趓趕趖趗趘趙趚趛趜趝趞趠趡�趢趤趥趦趧趨趩趪趫趬趭趮趯趰趲趶趷趹趻趽跀跁跂跅跇跈跉跊跍跐跒跓跔凇冖冢冥讠讦讧讪讴讵讷诂诃诋诏诎诒诓诔诖诘诙诜诟诠诤诨诩诮诰诳诶诹诼诿谀谂谄谇谌谏谑谒谔谕谖谙谛谘谝谟谠谡谥谧谪谫谮谯谲谳谵谶卩卺阝阢阡阱阪阽阼陂陉陔陟陧陬陲陴隈隍隗隰邗邛邝邙邬邡邴邳邶邺�".split("");
- 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];}
- D[219] = "����������������������������������������������������������������跕跘跙跜跠跡跢跥跦跧跩跭跮跰跱跲跴跶跼跾跿踀踁踂踃踄踆踇踈踋踍踎踐踑踒踓踕踖踗踘踙踚踛踜踠踡踤踥踦踧踨踫踭踰踲踳踴踶踷踸踻踼踾�踿蹃蹅蹆蹌蹍蹎蹏蹐蹓蹔蹕蹖蹗蹘蹚蹛蹜蹝蹞蹟蹠蹡蹢蹣蹤蹥蹧蹨蹪蹫蹮蹱邸邰郏郅邾郐郄郇郓郦郢郜郗郛郫郯郾鄄鄢鄞鄣鄱鄯鄹酃酆刍奂劢劬劭劾哿勐勖勰叟燮矍廴凵凼鬯厶弁畚巯坌垩垡塾墼壅壑圩圬圪圳圹圮圯坜圻坂坩垅坫垆坼坻坨坭坶坳垭垤垌垲埏垧垴垓垠埕埘埚埙埒垸埴埯埸埤埝�".split("");
- 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];}
- D[220] = "����������������������������������������������������������������蹳蹵蹷蹸蹹蹺蹻蹽蹾躀躂躃躄躆躈躉躊躋躌躍躎躑躒躓躕躖躗躘躙躚躛躝躟躠躡躢躣躤躥躦躧躨躩躪躭躮躰躱躳躴躵躶躷躸躹躻躼躽躾躿軀軁軂�軃軄軅軆軇軈軉車軋軌軍軏軐軑軒軓軔軕軖軗軘軙軚軛軜軝軞軟軠軡転軣軤堋堍埽埭堀堞堙塄堠塥塬墁墉墚墀馨鼙懿艹艽艿芏芊芨芄芎芑芗芙芫芸芾芰苈苊苣芘芷芮苋苌苁芩芴芡芪芟苄苎芤苡茉苷苤茏茇苜苴苒苘茌苻苓茑茚茆茔茕苠苕茜荑荛荜茈莒茼茴茱莛荞茯荏荇荃荟荀茗荠茭茺茳荦荥�".split("");
- 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];}
- D[221] = "����������������������������������������������������������������軥軦軧軨軩軪軫軬軭軮軯軰軱軲軳軴軵軶軷軸軹軺軻軼軽軾軿輀輁輂較輄輅輆輇輈載輊輋輌輍輎輏輐輑輒輓輔輕輖輗輘輙輚輛輜輝輞輟輠輡輢輣�輤輥輦輧輨輩輪輫輬輭輮輯輰輱輲輳輴輵輶輷輸輹輺輻輼輽輾輿轀轁轂轃轄荨茛荩荬荪荭荮莰荸莳莴莠莪莓莜莅荼莶莩荽莸荻莘莞莨莺莼菁萁菥菘堇萘萋菝菽菖萜萸萑萆菔菟萏萃菸菹菪菅菀萦菰菡葜葑葚葙葳蒇蒈葺蒉葸萼葆葩葶蒌蒎萱葭蓁蓍蓐蓦蒽蓓蓊蒿蒺蓠蒡蒹蒴蒗蓥蓣蔌甍蔸蓰蔹蔟蔺�".split("");
- 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];}
- D[222] = "����������������������������������������������������������������轅轆轇轈轉轊轋轌轍轎轏轐轑轒轓轔轕轖轗轘轙轚轛轜轝轞轟轠轡轢轣轤轥轪辀辌辒辝辠辡辢辤辥辦辧辪辬辭辮辯農辳辴辵辷辸辺辻込辿迀迃迆�迉迊迋迌迍迏迒迖迗迚迠迡迣迧迬迯迱迲迴迵迶迺迻迼迾迿逇逈逌逎逓逕逘蕖蔻蓿蓼蕙蕈蕨蕤蕞蕺瞢蕃蕲蕻薤薨薇薏蕹薮薜薅薹薷薰藓藁藜藿蘧蘅蘩蘖蘼廾弈夼奁耷奕奚奘匏尢尥尬尴扌扪抟抻拊拚拗拮挢拶挹捋捃掭揶捱捺掎掴捭掬掊捩掮掼揲揸揠揿揄揞揎摒揆掾摅摁搋搛搠搌搦搡摞撄摭撖�".split("");
- 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];}
- D[223] = "����������������������������������������������������������������這逜連逤逥逧逨逩逪逫逬逰週進逳逴逷逹逺逽逿遀遃遅遆遈遉遊運遌過達違遖遙遚遜遝遞遟遠遡遤遦遧適遪遫遬遯遰遱遲遳遶遷選遹遺遻遼遾邁�還邅邆邇邉邊邌邍邎邏邐邒邔邖邘邚邜邞邟邠邤邥邧邨邩邫邭邲邷邼邽邿郀摺撷撸撙撺擀擐擗擤擢攉攥攮弋忒甙弑卟叱叽叩叨叻吒吖吆呋呒呓呔呖呃吡呗呙吣吲咂咔呷呱呤咚咛咄呶呦咝哐咭哂咴哒咧咦哓哔呲咣哕咻咿哌哙哚哜咩咪咤哝哏哞唛哧唠哽唔哳唢唣唏唑唧唪啧喏喵啉啭啁啕唿啐唼�".split("");
- 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];}
- D[224] = "����������������������������������������������������������������郂郃郆郈郉郋郌郍郒郔郕郖郘郙郚郞郟郠郣郤郥郩郪郬郮郰郱郲郳郵郶郷郹郺郻郼郿鄀鄁鄃鄅鄆鄇鄈鄉鄊鄋鄌鄍鄎鄏鄐鄑鄒鄓鄔鄕鄖鄗鄘鄚鄛鄜�鄝鄟鄠鄡鄤鄥鄦鄧鄨鄩鄪鄫鄬鄭鄮鄰鄲鄳鄴鄵鄶鄷鄸鄺鄻鄼鄽鄾鄿酀酁酂酄唷啖啵啶啷唳唰啜喋嗒喃喱喹喈喁喟啾嗖喑啻嗟喽喾喔喙嗪嗷嗉嘟嗑嗫嗬嗔嗦嗝嗄嗯嗥嗲嗳嗌嗍嗨嗵嗤辔嘞嘈嘌嘁嘤嘣嗾嘀嘧嘭噘嘹噗嘬噍噢噙噜噌噔嚆噤噱噫噻噼嚅嚓嚯囔囗囝囡囵囫囹囿圄圊圉圜帏帙帔帑帱帻帼�".split("");
- 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];}
- D[225] = "����������������������������������������������������������������酅酇酈酑酓酔酕酖酘酙酛酜酟酠酦酧酨酫酭酳酺酻酼醀醁醂醃醄醆醈醊醎醏醓醔醕醖醗醘醙醜醝醞醟醠醡醤醥醦醧醨醩醫醬醰醱醲醳醶醷醸醹醻�醼醽醾醿釀釁釂釃釄釅釆釈釋釐釒釓釔釕釖釗釘釙釚釛針釞釟釠釡釢釣釤釥帷幄幔幛幞幡岌屺岍岐岖岈岘岙岑岚岜岵岢岽岬岫岱岣峁岷峄峒峤峋峥崂崃崧崦崮崤崞崆崛嵘崾崴崽嵬嵛嵯嵝嵫嵋嵊嵩嵴嶂嶙嶝豳嶷巅彳彷徂徇徉後徕徙徜徨徭徵徼衢彡犭犰犴犷犸狃狁狎狍狒狨狯狩狲狴狷猁狳猃狺�".split("");
- 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];}
- D[226] = "����������������������������������������������������������������釦釧釨釩釪釫釬釭釮釯釰釱釲釳釴釵釶釷釸釹釺釻釼釽釾釿鈀鈁鈂鈃鈄鈅鈆鈇鈈鈉鈊鈋鈌鈍鈎鈏鈐鈑鈒鈓鈔鈕鈖鈗鈘鈙鈚鈛鈜鈝鈞鈟鈠鈡鈢鈣鈤�鈥鈦鈧鈨鈩鈪鈫鈬鈭鈮鈯鈰鈱鈲鈳鈴鈵鈶鈷鈸鈹鈺鈻鈼鈽鈾鈿鉀鉁鉂鉃鉄鉅狻猗猓猡猊猞猝猕猢猹猥猬猸猱獐獍獗獠獬獯獾舛夥飧夤夂饣饧饨饩饪饫饬饴饷饽馀馄馇馊馍馐馑馓馔馕庀庑庋庖庥庠庹庵庾庳赓廒廑廛廨廪膺忄忉忖忏怃忮怄忡忤忾怅怆忪忭忸怙怵怦怛怏怍怩怫怊怿怡恸恹恻恺恂�".split("");
- 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];}
- D[227] = "����������������������������������������������������������������鉆鉇鉈鉉鉊鉋鉌鉍鉎鉏鉐鉑鉒鉓鉔鉕鉖鉗鉘鉙鉚鉛鉜鉝鉞鉟鉠鉡鉢鉣鉤鉥鉦鉧鉨鉩鉪鉫鉬鉭鉮鉯鉰鉱鉲鉳鉵鉶鉷鉸鉹鉺鉻鉼鉽鉾鉿銀銁銂銃銄銅�銆銇銈銉銊銋銌銍銏銐銑銒銓銔銕銖銗銘銙銚銛銜銝銞銟銠銡銢銣銤銥銦銧恪恽悖悚悭悝悃悒悌悛惬悻悱惝惘惆惚悴愠愦愕愣惴愀愎愫慊慵憬憔憧憷懔懵忝隳闩闫闱闳闵闶闼闾阃阄阆阈阊阋阌阍阏阒阕阖阗阙阚丬爿戕氵汔汜汊沣沅沐沔沌汨汩汴汶沆沩泐泔沭泷泸泱泗沲泠泖泺泫泮沱泓泯泾�".split("");
- 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];}
- D[228] = "����������������������������������������������������������������銨銩銪銫銬銭銯銰銱銲銳銴銵銶銷銸銹銺銻銼銽銾銿鋀鋁鋂鋃鋄鋅鋆鋇鋉鋊鋋鋌鋍鋎鋏鋐鋑鋒鋓鋔鋕鋖鋗鋘鋙鋚鋛鋜鋝鋞鋟鋠鋡鋢鋣鋤鋥鋦鋧鋨�鋩鋪鋫鋬鋭鋮鋯鋰鋱鋲鋳鋴鋵鋶鋷鋸鋹鋺鋻鋼鋽鋾鋿錀錁錂錃錄錅錆錇錈錉洹洧洌浃浈洇洄洙洎洫浍洮洵洚浏浒浔洳涑浯涞涠浞涓涔浜浠浼浣渚淇淅淞渎涿淠渑淦淝淙渖涫渌涮渫湮湎湫溲湟溆湓湔渲渥湄滟溱溘滠漭滢溥溧溽溻溷滗溴滏溏滂溟潢潆潇漤漕滹漯漶潋潴漪漉漩澉澍澌潸潲潼潺濑�".split("");
- 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];}
- D[229] = "����������������������������������������������������������������錊錋錌錍錎錏錐錑錒錓錔錕錖錗錘錙錚錛錜錝錞錟錠錡錢錣錤錥錦錧錨錩錪錫錬錭錮錯錰錱録錳錴錵錶錷錸錹錺錻錼錽錿鍀鍁鍂鍃鍄鍅鍆鍇鍈鍉�鍊鍋鍌鍍鍎鍏鍐鍑鍒鍓鍔鍕鍖鍗鍘鍙鍚鍛鍜鍝鍞鍟鍠鍡鍢鍣鍤鍥鍦鍧鍨鍩鍫濉澧澹澶濂濡濮濞濠濯瀚瀣瀛瀹瀵灏灞宀宄宕宓宥宸甯骞搴寤寮褰寰蹇謇辶迓迕迥迮迤迩迦迳迨逅逄逋逦逑逍逖逡逵逶逭逯遄遑遒遐遨遘遢遛暹遴遽邂邈邃邋彐彗彖彘尻咫屐屙孱屣屦羼弪弩弭艴弼鬻屮妁妃妍妩妪妣�".split("");
- 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];}
- D[230] = "����������������������������������������������������������������鍬鍭鍮鍯鍰鍱鍲鍳鍴鍵鍶鍷鍸鍹鍺鍻鍼鍽鍾鍿鎀鎁鎂鎃鎄鎅鎆鎇鎈鎉鎊鎋鎌鎍鎎鎐鎑鎒鎓鎔鎕鎖鎗鎘鎙鎚鎛鎜鎝鎞鎟鎠鎡鎢鎣鎤鎥鎦鎧鎨鎩鎪鎫�鎬鎭鎮鎯鎰鎱鎲鎳鎴鎵鎶鎷鎸鎹鎺鎻鎼鎽鎾鎿鏀鏁鏂鏃鏄鏅鏆鏇鏈鏉鏋鏌鏍妗姊妫妞妤姒妲妯姗妾娅娆姝娈姣姘姹娌娉娲娴娑娣娓婀婧婊婕娼婢婵胬媪媛婷婺媾嫫媲嫒嫔媸嫠嫣嫱嫖嫦嫘嫜嬉嬗嬖嬲嬷孀尕尜孚孥孳孑孓孢驵驷驸驺驿驽骀骁骅骈骊骐骒骓骖骘骛骜骝骟骠骢骣骥骧纟纡纣纥纨纩�".split("");
- 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];}
- D[231] = "����������������������������������������������������������������鏎鏏鏐鏑鏒鏓鏔鏕鏗鏘鏙鏚鏛鏜鏝鏞鏟鏠鏡鏢鏣鏤鏥鏦鏧鏨鏩鏪鏫鏬鏭鏮鏯鏰鏱鏲鏳鏴鏵鏶鏷鏸鏹鏺鏻鏼鏽鏾鏿鐀鐁鐂鐃鐄鐅鐆鐇鐈鐉鐊鐋鐌鐍�鐎鐏鐐鐑鐒鐓鐔鐕鐖鐗鐘鐙鐚鐛鐜鐝鐞鐟鐠鐡鐢鐣鐤鐥鐦鐧鐨鐩鐪鐫鐬鐭鐮纭纰纾绀绁绂绉绋绌绐绔绗绛绠绡绨绫绮绯绱绲缍绶绺绻绾缁缂缃缇缈缋缌缏缑缒缗缙缜缛缟缡缢缣缤缥缦缧缪缫缬缭缯缰缱缲缳缵幺畿巛甾邕玎玑玮玢玟珏珂珑玷玳珀珉珈珥珙顼琊珩珧珞玺珲琏琪瑛琦琥琨琰琮琬�".split("");
- 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];}
- D[232] = "����������������������������������������������������������������鐯鐰鐱鐲鐳鐴鐵鐶鐷鐸鐹鐺鐻鐼鐽鐿鑀鑁鑂鑃鑄鑅鑆鑇鑈鑉鑊鑋鑌鑍鑎鑏鑐鑑鑒鑓鑔鑕鑖鑗鑘鑙鑚鑛鑜鑝鑞鑟鑠鑡鑢鑣鑤鑥鑦鑧鑨鑩鑪鑬鑭鑮鑯�鑰鑱鑲鑳鑴鑵鑶鑷鑸鑹鑺鑻鑼鑽鑾鑿钀钁钂钃钄钑钖钘铇铏铓铔铚铦铻锜锠琛琚瑁瑜瑗瑕瑙瑷瑭瑾璜璎璀璁璇璋璞璨璩璐璧瓒璺韪韫韬杌杓杞杈杩枥枇杪杳枘枧杵枨枞枭枋杷杼柰栉柘栊柩枰栌柙枵柚枳柝栀柃枸柢栎柁柽栲栳桠桡桎桢桄桤梃栝桕桦桁桧桀栾桊桉栩梵梏桴桷梓桫棂楮棼椟椠棹�".split("");
- 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];}
- D[233] = "����������������������������������������������������������������锧锳锽镃镈镋镕镚镠镮镴镵長镸镹镺镻镼镽镾門閁閂閃閄閅閆閇閈閉閊開閌閍閎閏閐閑閒間閔閕閖閗閘閙閚閛閜閝閞閟閠閡関閣閤閥閦閧閨閩閪�閫閬閭閮閯閰閱閲閳閴閵閶閷閸閹閺閻閼閽閾閿闀闁闂闃闄闅闆闇闈闉闊闋椤棰椋椁楗棣椐楱椹楠楂楝榄楫榀榘楸椴槌榇榈槎榉楦楣楹榛榧榻榫榭槔榱槁槊槟榕槠榍槿樯槭樗樘橥槲橄樾檠橐橛樵檎橹樽樨橘橼檑檐檩檗檫猷獒殁殂殇殄殒殓殍殚殛殡殪轫轭轱轲轳轵轶轸轷轹轺轼轾辁辂辄辇辋�".split("");
- 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];}
- D[234] = "����������������������������������������������������������������闌闍闎闏闐闑闒闓闔闕闖闗闘闙闚闛關闝闞闟闠闡闢闣闤闥闦闧闬闿阇阓阘阛阞阠阣阤阥阦阧阨阩阫阬阭阯阰阷阸阹阺阾陁陃陊陎陏陑陒陓陖陗�陘陙陚陜陝陞陠陣陥陦陫陭陮陯陰陱陳陸陹険陻陼陽陾陿隀隁隂隃隄隇隉隊辍辎辏辘辚軎戋戗戛戟戢戡戥戤戬臧瓯瓴瓿甏甑甓攴旮旯旰昊昙杲昃昕昀炅曷昝昴昱昶昵耆晟晔晁晏晖晡晗晷暄暌暧暝暾曛曜曦曩贲贳贶贻贽赀赅赆赈赉赇赍赕赙觇觊觋觌觎觏觐觑牮犟牝牦牯牾牿犄犋犍犏犒挈挲掰�".split("");
- 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];}
- D[235] = "����������������������������������������������������������������隌階隑隒隓隕隖隚際隝隞隟隠隡隢隣隤隥隦隨隩險隫隬隭隮隯隱隲隴隵隷隸隺隻隿雂雃雈雊雋雐雑雓雔雖雗雘雙雚雛雜雝雞雟雡離難雤雥雦雧雫�雬雭雮雰雱雲雴雵雸雺電雼雽雿霂霃霅霊霋霌霐霑霒霔霕霗霘霙霚霛霝霟霠搿擘耄毪毳毽毵毹氅氇氆氍氕氘氙氚氡氩氤氪氲攵敕敫牍牒牖爰虢刖肟肜肓肼朊肽肱肫肭肴肷胧胨胩胪胛胂胄胙胍胗朐胝胫胱胴胭脍脎胲胼朕脒豚脶脞脬脘脲腈腌腓腴腙腚腱腠腩腼腽腭腧塍媵膈膂膑滕膣膪臌朦臊膻�".split("");
- 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];}
- D[236] = "����������������������������������������������������������������霡霢霣霤霥霦霧霨霩霫霬霮霯霱霳霴霵霶霷霺霻霼霽霿靀靁靂靃靄靅靆靇靈靉靊靋靌靍靎靏靐靑靔靕靗靘靚靜靝靟靣靤靦靧靨靪靫靬靭靮靯靰靱�靲靵靷靸靹靺靻靽靾靿鞀鞁鞂鞃鞄鞆鞇鞈鞉鞊鞌鞎鞏鞐鞓鞕鞖鞗鞙鞚鞛鞜鞝臁膦欤欷欹歃歆歙飑飒飓飕飙飚殳彀毂觳斐齑斓於旆旄旃旌旎旒旖炀炜炖炝炻烀炷炫炱烨烊焐焓焖焯焱煳煜煨煅煲煊煸煺熘熳熵熨熠燠燔燧燹爝爨灬焘煦熹戾戽扃扈扉礻祀祆祉祛祜祓祚祢祗祠祯祧祺禅禊禚禧禳忑忐�".split("");
- 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];}
- D[237] = "����������������������������������������������������������������鞞鞟鞡鞢鞤鞥鞦鞧鞨鞩鞪鞬鞮鞰鞱鞳鞵鞶鞷鞸鞹鞺鞻鞼鞽鞾鞿韀韁韂韃韄韅韆韇韈韉韊韋韌韍韎韏韐韑韒韓韔韕韖韗韘韙韚韛韜韝韞韟韠韡韢韣�韤韥韨韮韯韰韱韲韴韷韸韹韺韻韼韽韾響頀頁頂頃頄項順頇須頉頊頋頌頍頎怼恝恚恧恁恙恣悫愆愍慝憩憝懋懑戆肀聿沓泶淼矶矸砀砉砗砘砑斫砭砜砝砹砺砻砟砼砥砬砣砩硎硭硖硗砦硐硇硌硪碛碓碚碇碜碡碣碲碹碥磔磙磉磬磲礅磴礓礤礞礴龛黹黻黼盱眄眍盹眇眈眚眢眙眭眦眵眸睐睑睇睃睚睨�".split("");
- 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];}
- D[238] = "����������������������������������������������������������������頏預頑頒頓頔頕頖頗領頙頚頛頜頝頞頟頠頡頢頣頤頥頦頧頨頩頪頫頬頭頮頯頰頱頲頳頴頵頶頷頸頹頺頻頼頽頾頿顀顁顂顃顄顅顆顇顈顉顊顋題額�顎顏顐顑顒顓顔顕顖顗願顙顚顛顜顝類顟顠顡顢顣顤顥顦顧顨顩顪顫顬顭顮睢睥睿瞍睽瞀瞌瞑瞟瞠瞰瞵瞽町畀畎畋畈畛畲畹疃罘罡罟詈罨罴罱罹羁罾盍盥蠲钅钆钇钋钊钌钍钏钐钔钗钕钚钛钜钣钤钫钪钭钬钯钰钲钴钶钷钸钹钺钼钽钿铄铈铉铊铋铌铍铎铐铑铒铕铖铗铙铘铛铞铟铠铢铤铥铧铨铪�".split("");
- 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];}
- D[239] = "����������������������������������������������������������������顯顰顱顲顳顴颋颎颒颕颙颣風颩颪颫颬颭颮颯颰颱颲颳颴颵颶颷颸颹颺颻颼颽颾颿飀飁飂飃飄飅飆飇飈飉飊飋飌飍飏飐飔飖飗飛飜飝飠飡飢飣飤�飥飦飩飪飫飬飭飮飯飰飱飲飳飴飵飶飷飸飹飺飻飼飽飾飿餀餁餂餃餄餅餆餇铩铫铮铯铳铴铵铷铹铼铽铿锃锂锆锇锉锊锍锎锏锒锓锔锕锖锘锛锝锞锟锢锪锫锩锬锱锲锴锶锷锸锼锾锿镂锵镄镅镆镉镌镎镏镒镓镔镖镗镘镙镛镞镟镝镡镢镤镥镦镧镨镩镪镫镬镯镱镲镳锺矧矬雉秕秭秣秫稆嵇稃稂稞稔�".split("");
- 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];}
- D[240] = "����������������������������������������������������������������餈餉養餋餌餎餏餑餒餓餔餕餖餗餘餙餚餛餜餝餞餟餠餡餢餣餤餥餦餧館餩餪餫餬餭餯餰餱餲餳餴餵餶餷餸餹餺餻餼餽餾餿饀饁饂饃饄饅饆饇饈饉�饊饋饌饍饎饏饐饑饒饓饖饗饘饙饚饛饜饝饞饟饠饡饢饤饦饳饸饹饻饾馂馃馉稹稷穑黏馥穰皈皎皓皙皤瓞瓠甬鸠鸢鸨鸩鸪鸫鸬鸲鸱鸶鸸鸷鸹鸺鸾鹁鹂鹄鹆鹇鹈鹉鹋鹌鹎鹑鹕鹗鹚鹛鹜鹞鹣鹦鹧鹨鹩鹪鹫鹬鹱鹭鹳疒疔疖疠疝疬疣疳疴疸痄疱疰痃痂痖痍痣痨痦痤痫痧瘃痱痼痿瘐瘀瘅瘌瘗瘊瘥瘘瘕瘙�".split("");
- 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];}
- D[241] = "����������������������������������������������������������������馌馎馚馛馜馝馞馟馠馡馢馣馤馦馧馩馪馫馬馭馮馯馰馱馲馳馴馵馶馷馸馹馺馻馼馽馾馿駀駁駂駃駄駅駆駇駈駉駊駋駌駍駎駏駐駑駒駓駔駕駖駗駘�駙駚駛駜駝駞駟駠駡駢駣駤駥駦駧駨駩駪駫駬駭駮駯駰駱駲駳駴駵駶駷駸駹瘛瘼瘢瘠癀瘭瘰瘿瘵癃瘾瘳癍癞癔癜癖癫癯翊竦穸穹窀窆窈窕窦窠窬窨窭窳衤衩衲衽衿袂袢裆袷袼裉裢裎裣裥裱褚裼裨裾裰褡褙褓褛褊褴褫褶襁襦襻疋胥皲皴矜耒耔耖耜耠耢耥耦耧耩耨耱耋耵聃聆聍聒聩聱覃顸颀颃�".split("");
- 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];}
- D[242] = "����������������������������������������������������������������駺駻駼駽駾駿騀騁騂騃騄騅騆騇騈騉騊騋騌騍騎騏騐騑騒験騔騕騖騗騘騙騚騛騜騝騞騟騠騡騢騣騤騥騦騧騨騩騪騫騬騭騮騯騰騱騲騳騴騵騶騷騸�騹騺騻騼騽騾騿驀驁驂驃驄驅驆驇驈驉驊驋驌驍驎驏驐驑驒驓驔驕驖驗驘驙颉颌颍颏颔颚颛颞颟颡颢颥颦虍虔虬虮虿虺虼虻蚨蚍蚋蚬蚝蚧蚣蚪蚓蚩蚶蛄蚵蛎蚰蚺蚱蚯蛉蛏蚴蛩蛱蛲蛭蛳蛐蜓蛞蛴蛟蛘蛑蜃蜇蛸蜈蜊蜍蜉蜣蜻蜞蜥蜮蜚蜾蝈蜴蜱蜩蜷蜿螂蜢蝽蝾蝻蝠蝰蝌蝮螋蝓蝣蝼蝤蝙蝥螓螯螨蟒�".split("");
- 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];}
- D[243] = "����������������������������������������������������������������驚驛驜驝驞驟驠驡驢驣驤驥驦驧驨驩驪驫驲骃骉骍骎骔骕骙骦骩骪骫骬骭骮骯骲骳骴骵骹骻骽骾骿髃髄髆髇髈髉髊髍髎髏髐髒體髕髖髗髙髚髛髜�髝髞髠髢髣髤髥髧髨髩髪髬髮髰髱髲髳髴髵髶髷髸髺髼髽髾髿鬀鬁鬂鬄鬅鬆蟆螈螅螭螗螃螫蟥螬螵螳蟋蟓螽蟑蟀蟊蟛蟪蟠蟮蠖蠓蟾蠊蠛蠡蠹蠼缶罂罄罅舐竺竽笈笃笄笕笊笫笏筇笸笪笙笮笱笠笥笤笳笾笞筘筚筅筵筌筝筠筮筻筢筲筱箐箦箧箸箬箝箨箅箪箜箢箫箴篑篁篌篝篚篥篦篪簌篾篼簏簖簋�".split("");
- 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];}
- D[244] = "����������������������������������������������������������������鬇鬉鬊鬋鬌鬍鬎鬐鬑鬒鬔鬕鬖鬗鬘鬙鬚鬛鬜鬝鬞鬠鬡鬢鬤鬥鬦鬧鬨鬩鬪鬫鬬鬭鬮鬰鬱鬳鬴鬵鬶鬷鬸鬹鬺鬽鬾鬿魀魆魊魋魌魎魐魒魓魕魖魗魘魙魚�魛魜魝魞魟魠魡魢魣魤魥魦魧魨魩魪魫魬魭魮魯魰魱魲魳魴魵魶魷魸魹魺魻簟簪簦簸籁籀臾舁舂舄臬衄舡舢舣舭舯舨舫舸舻舳舴舾艄艉艋艏艚艟艨衾袅袈裘裟襞羝羟羧羯羰羲籼敉粑粝粜粞粢粲粼粽糁糇糌糍糈糅糗糨艮暨羿翎翕翥翡翦翩翮翳糸絷綦綮繇纛麸麴赳趄趔趑趱赧赭豇豉酊酐酎酏酤�".split("");
- 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];}
- D[245] = "����������������������������������������������������������������魼魽魾魿鮀鮁鮂鮃鮄鮅鮆鮇鮈鮉鮊鮋鮌鮍鮎鮏鮐鮑鮒鮓鮔鮕鮖鮗鮘鮙鮚鮛鮜鮝鮞鮟鮠鮡鮢鮣鮤鮥鮦鮧鮨鮩鮪鮫鮬鮭鮮鮯鮰鮱鮲鮳鮴鮵鮶鮷鮸鮹鮺�鮻鮼鮽鮾鮿鯀鯁鯂鯃鯄鯅鯆鯇鯈鯉鯊鯋鯌鯍鯎鯏鯐鯑鯒鯓鯔鯕鯖鯗鯘鯙鯚鯛酢酡酰酩酯酽酾酲酴酹醌醅醐醍醑醢醣醪醭醮醯醵醴醺豕鹾趸跫踅蹙蹩趵趿趼趺跄跖跗跚跞跎跏跛跆跬跷跸跣跹跻跤踉跽踔踝踟踬踮踣踯踺蹀踹踵踽踱蹉蹁蹂蹑蹒蹊蹰蹶蹼蹯蹴躅躏躔躐躜躞豸貂貊貅貘貔斛觖觞觚觜�".split("");
- 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];}
- D[246] = "����������������������������������������������������������������鯜鯝鯞鯟鯠鯡鯢鯣鯤鯥鯦鯧鯨鯩鯪鯫鯬鯭鯮鯯鯰鯱鯲鯳鯴鯵鯶鯷鯸鯹鯺鯻鯼鯽鯾鯿鰀鰁鰂鰃鰄鰅鰆鰇鰈鰉鰊鰋鰌鰍鰎鰏鰐鰑鰒鰓鰔鰕鰖鰗鰘鰙鰚�鰛鰜鰝鰞鰟鰠鰡鰢鰣鰤鰥鰦鰧鰨鰩鰪鰫鰬鰭鰮鰯鰰鰱鰲鰳鰴鰵鰶鰷鰸鰹鰺鰻觥觫觯訾謦靓雩雳雯霆霁霈霏霎霪霭霰霾龀龃龅龆龇龈龉龊龌黾鼋鼍隹隼隽雎雒瞿雠銎銮鋈錾鍪鏊鎏鐾鑫鱿鲂鲅鲆鲇鲈稣鲋鲎鲐鲑鲒鲔鲕鲚鲛鲞鲟鲠鲡鲢鲣鲥鲦鲧鲨鲩鲫鲭鲮鲰鲱鲲鲳鲴鲵鲶鲷鲺鲻鲼鲽鳄鳅鳆鳇鳊鳋�".split("");
- 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];}
- D[247] = "����������������������������������������������������������������鰼鰽鰾鰿鱀鱁鱂鱃鱄鱅鱆鱇鱈鱉鱊鱋鱌鱍鱎鱏鱐鱑鱒鱓鱔鱕鱖鱗鱘鱙鱚鱛鱜鱝鱞鱟鱠鱡鱢鱣鱤鱥鱦鱧鱨鱩鱪鱫鱬鱭鱮鱯鱰鱱鱲鱳鱴鱵鱶鱷鱸鱹鱺�鱻鱽鱾鲀鲃鲄鲉鲊鲌鲏鲓鲖鲗鲘鲙鲝鲪鲬鲯鲹鲾鲿鳀鳁鳂鳈鳉鳑鳒鳚鳛鳠鳡鳌鳍鳎鳏鳐鳓鳔鳕鳗鳘鳙鳜鳝鳟鳢靼鞅鞑鞒鞔鞯鞫鞣鞲鞴骱骰骷鹘骶骺骼髁髀髅髂髋髌髑魅魃魇魉魈魍魑飨餍餮饕饔髟髡髦髯髫髻髭髹鬈鬏鬓鬟鬣麽麾縻麂麇麈麋麒鏖麝麟黛黜黝黠黟黢黩黧黥黪黯鼢鼬鼯鼹鼷鼽鼾齄�".split("");
- 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];}
- D[248] = "����������������������������������������������������������������鳣鳤鳥鳦鳧鳨鳩鳪鳫鳬鳭鳮鳯鳰鳱鳲鳳鳴鳵鳶鳷鳸鳹鳺鳻鳼鳽鳾鳿鴀鴁鴂鴃鴄鴅鴆鴇鴈鴉鴊鴋鴌鴍鴎鴏鴐鴑鴒鴓鴔鴕鴖鴗鴘鴙鴚鴛鴜鴝鴞鴟鴠鴡�鴢鴣鴤鴥鴦鴧鴨鴩鴪鴫鴬鴭鴮鴯鴰鴱鴲鴳鴴鴵鴶鴷鴸鴹鴺鴻鴼鴽鴾鴿鵀鵁鵂�����������������������������������������������������������������������������������������������".split("");
- 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];}
- D[249] = "����������������������������������������������������������������鵃鵄鵅鵆鵇鵈鵉鵊鵋鵌鵍鵎鵏鵐鵑鵒鵓鵔鵕鵖鵗鵘鵙鵚鵛鵜鵝鵞鵟鵠鵡鵢鵣鵤鵥鵦鵧鵨鵩鵪鵫鵬鵭鵮鵯鵰鵱鵲鵳鵴鵵鵶鵷鵸鵹鵺鵻鵼鵽鵾鵿鶀鶁�鶂鶃鶄鶅鶆鶇鶈鶉鶊鶋鶌鶍鶎鶏鶐鶑鶒鶓鶔鶕鶖鶗鶘鶙鶚鶛鶜鶝鶞鶟鶠鶡鶢�����������������������������������������������������������������������������������������������".split("");
- 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];}
- D[250] = "����������������������������������������������������������������鶣鶤鶥鶦鶧鶨鶩鶪鶫鶬鶭鶮鶯鶰鶱鶲鶳鶴鶵鶶鶷鶸鶹鶺鶻鶼鶽鶾鶿鷀鷁鷂鷃鷄鷅鷆鷇鷈鷉鷊鷋鷌鷍鷎鷏鷐鷑鷒鷓鷔鷕鷖鷗鷘鷙鷚鷛鷜鷝鷞鷟鷠鷡�鷢鷣鷤鷥鷦鷧鷨鷩鷪鷫鷬鷭鷮鷯鷰鷱鷲鷳鷴鷵鷶鷷鷸鷹鷺鷻鷼鷽鷾鷿鸀鸁鸂�����������������������������������������������������������������������������������������������".split("");
- 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];}
- D[251] = "����������������������������������������������������������������鸃鸄鸅鸆鸇鸈鸉鸊鸋鸌鸍鸎鸏鸐鸑鸒鸓鸔鸕鸖鸗鸘鸙鸚鸛鸜鸝鸞鸤鸧鸮鸰鸴鸻鸼鹀鹍鹐鹒鹓鹔鹖鹙鹝鹟鹠鹡鹢鹥鹮鹯鹲鹴鹵鹶鹷鹸鹹鹺鹻鹼鹽麀�麁麃麄麅麆麉麊麌麍麎麏麐麑麔麕麖麗麘麙麚麛麜麞麠麡麢麣麤麥麧麨麩麪�����������������������������������������������������������������������������������������������".split("");
- 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];}
- D[252] = "����������������������������������������������������������������麫麬麭麮麯麰麱麲麳麵麶麷麹麺麼麿黀黁黂黃黅黆黇黈黊黋黌黐黒黓黕黖黗黙黚點黡黣黤黦黨黫黬黭黮黰黱黲黳黴黵黶黷黸黺黽黿鼀鼁鼂鼃鼄鼅�鼆鼇鼈鼉鼊鼌鼏鼑鼒鼔鼕鼖鼘鼚鼛鼜鼝鼞鼟鼡鼣鼤鼥鼦鼧鼨鼩鼪鼫鼭鼮鼰鼱�����������������������������������������������������������������������������������������������".split("");
- 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];}
- D[253] = "����������������������������������������������������������������鼲鼳鼴鼵鼶鼸鼺鼼鼿齀齁齂齃齅齆齇齈齉齊齋齌齍齎齏齒齓齔齕齖齗齘齙齚齛齜齝齞齟齠齡齢齣齤齥齦齧齨齩齪齫齬齭齮齯齰齱齲齳齴齵齶齷齸�齹齺齻齼齽齾龁龂龍龎龏龐龑龒龓龔龕龖龗龘龜龝龞龡龢龣龤龥郎凉秊裏隣�����������������������������������������������������������������������������������������������".split("");
- 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];}
- D[254] = "����������������������������������������������������������������兀嗀﨎﨏﨑﨓﨔礼﨟蘒﨡﨣﨤﨧﨨﨩��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������".split("");
- 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];}
- return {"enc": e, "dec": d }; })();
- cptable[949] = (function(){ var d = [], e = {}, D = [], j;
- 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("");
- 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];}
- D[129] = "�����������������������������������������������������������������갂갃갅갆갋갌갍갎갏갘갞갟갡갢갣갥갦갧갨갩갪갫갮갲갳갴������갵갶갷갺갻갽갾갿걁걂걃걄걅걆걇걈걉걊걌걎걏걐걑걒걓걕������걖걗걙걚걛걝걞걟걠걡걢걣걤걥걦걧걨걩걪걫걬걭걮걯걲걳걵걶걹걻걼걽걾걿겂겇겈겍겎겏겑겒겓겕겖겗겘겙겚겛겞겢겣겤겥겦겧겫겭겮겱겲겳겴겵겶겷겺겾겿곀곂곃곅곆곇곉곊곋곍곎곏곐곑곒곓곔곖곘곙곚곛곜곝곞곟곢곣곥곦곩곫곭곮곲곴곷곸곹곺곻곾곿괁괂괃괅괇괈괉괊괋괎괐괒괓�".split("");
- 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];}
- D[130] = "�����������������������������������������������������������������괔괕괖괗괙괚괛괝괞괟괡괢괣괤괥괦괧괨괪괫괮괯괰괱괲괳������괶괷괹괺괻괽괾괿굀굁굂굃굆굈굊굋굌굍굎굏굑굒굓굕굖굗������굙굚굛굜굝굞굟굠굢굤굥굦굧굨굩굪굫굮굯굱굲굷굸굹굺굾궀궃궄궅궆궇궊궋궍궎궏궑궒궓궔궕궖궗궘궙궚궛궞궟궠궡궢궣궥궦궧궨궩궪궫궬궭궮궯궰궱궲궳궴궵궶궸궹궺궻궼궽궾궿귂귃귅귆귇귉귊귋귌귍귎귏귒귔귕귖귗귘귙귚귛귝귞귟귡귢귣귥귦귧귨귩귪귫귬귭귮귯귰귱귲귳귴귵귶귷�".split("");
- 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];}
- D[131] = "�����������������������������������������������������������������귺귻귽귾긂긃긄긅긆긇긊긌긎긏긐긑긒긓긕긖긗긘긙긚긛긜������긝긞긟긠긡긢긣긤긥긦긧긨긩긪긫긬긭긮긯긲긳긵긶긹긻긼������긽긾긿깂깄깇깈깉깋깏깑깒깓깕깗깘깙깚깛깞깢깣깤깦깧깪깫깭깮깯깱깲깳깴깵깶깷깺깾깿꺀꺁꺂꺃꺆꺇꺈꺉꺊꺋꺍꺎꺏꺐꺑꺒꺓꺔꺕꺖꺗꺘꺙꺚꺛꺜꺝꺞꺟꺠꺡꺢꺣꺤꺥꺦꺧꺨꺩꺪꺫꺬꺭꺮꺯꺰꺱꺲꺳꺴꺵꺶꺷꺸꺹꺺꺻꺿껁껂껃껅껆껇껈껉껊껋껎껒껓껔껕껖껗껚껛껝껞껟껠껡껢껣껤껥�".split("");
- 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];}
- D[132] = "�����������������������������������������������������������������껦껧껩껪껬껮껯껰껱껲껳껵껶껷껹껺껻껽껾껿꼀꼁꼂꼃꼄꼅������꼆꼉꼊꼋꼌꼎꼏꼑꼒꼓꼔꼕꼖꼗꼘꼙꼚꼛꼜꼝꼞꼟꼠꼡꼢꼣������꼤꼥꼦꼧꼨꼩꼪꼫꼮꼯꼱꼳꼵꼶꼷꼸꼹꼺꼻꼾꽀꽄꽅꽆꽇꽊꽋꽌꽍꽎꽏꽑꽒꽓꽔꽕꽖꽗꽘꽙꽚꽛꽞꽟꽠꽡꽢꽣꽦꽧꽨꽩꽪꽫꽬꽭꽮꽯꽰꽱꽲꽳꽴꽵꽶꽷꽸꽺꽻꽼꽽꽾꽿꾁꾂꾃꾅꾆꾇꾉꾊꾋꾌꾍꾎꾏꾒꾓꾔꾖꾗꾘꾙꾚꾛꾝꾞꾟꾠꾡꾢꾣꾤꾥꾦꾧꾨꾩꾪꾫꾬꾭꾮꾯꾰꾱꾲꾳꾴꾵꾶꾷꾺꾻꾽꾾�".split("");
- 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];}
- D[133] = "�����������������������������������������������������������������꾿꿁꿂꿃꿄꿅꿆꿊꿌꿏꿐꿑꿒꿓꿕꿖꿗꿘꿙꿚꿛꿝꿞꿟꿠꿡������꿢꿣꿤꿥꿦꿧꿪꿫꿬꿭꿮꿯꿲꿳꿵꿶꿷꿹꿺꿻꿼꿽꿾꿿뀂뀃������뀅뀆뀇뀈뀉뀊뀋뀍뀎뀏뀑뀒뀓뀕뀖뀗뀘뀙뀚뀛뀞뀟뀠뀡뀢뀣뀤뀥뀦뀧뀩뀪뀫뀬뀭뀮뀯뀰뀱뀲뀳뀴뀵뀶뀷뀸뀹뀺뀻뀼뀽뀾뀿끀끁끂끃끆끇끉끋끍끏끐끑끒끖끘끚끛끜끞끟끠끡끢끣끤끥끦끧끨끩끪끫끬끭끮끯끰끱끲끳끴끵끶끷끸끹끺끻끾끿낁낂낃낅낆낇낈낉낊낋낎낐낒낓낔낕낖낗낛낝낞낣낤�".split("");
- 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];}
- D[134] = "�����������������������������������������������������������������낥낦낧낪낰낲낶낷낹낺낻낽낾낿냀냁냂냃냆냊냋냌냍냎냏냒������냓냕냖냗냙냚냛냜냝냞냟냡냢냣냤냦냧냨냩냪냫냬냭냮냯냰������냱냲냳냴냵냶냷냸냹냺냻냼냽냾냿넀넁넂넃넄넅넆넇넊넍넎넏넑넔넕넖넗넚넞넟넠넡넢넦넧넩넪넫넭넮넯넰넱넲넳넶넺넻넼넽넾넿녂녃녅녆녇녉녊녋녌녍녎녏녒녓녖녗녙녚녛녝녞녟녡녢녣녤녥녦녧녨녩녪녫녬녭녮녯녰녱녲녳녴녵녶녷녺녻녽녾녿놁놃놄놅놆놇놊놌놎놏놐놑놕놖놗놙놚놛놝�".split("");
- 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];}
- D[135] = "�����������������������������������������������������������������놞놟놠놡놢놣놤놥놦놧놩놪놫놬놭놮놯놰놱놲놳놴놵놶놷놸������놹놺놻놼놽놾놿뇀뇁뇂뇃뇄뇅뇆뇇뇈뇉뇊뇋뇍뇎뇏뇑뇒뇓뇕������뇖뇗뇘뇙뇚뇛뇞뇠뇡뇢뇣뇤뇥뇦뇧뇪뇫뇭뇮뇯뇱뇲뇳뇴뇵뇶뇷뇸뇺뇼뇾뇿눀눁눂눃눆눇눉눊눍눎눏눐눑눒눓눖눘눚눛눜눝눞눟눡눢눣눤눥눦눧눨눩눪눫눬눭눮눯눰눱눲눳눵눶눷눸눹눺눻눽눾눿뉀뉁뉂뉃뉄뉅뉆뉇뉈뉉뉊뉋뉌뉍뉎뉏뉐뉑뉒뉓뉔뉕뉖뉗뉙뉚뉛뉝뉞뉟뉡뉢뉣뉤뉥뉦뉧뉪뉫뉬뉭뉮�".split("");
- 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];}
- D[136] = "�����������������������������������������������������������������뉯뉰뉱뉲뉳뉶뉷뉸뉹뉺뉻뉽뉾뉿늀늁늂늃늆늇늈늊늋늌늍늎������늏늒늓늕늖늗늛늜늝늞늟늢늤늧늨늩늫늭늮늯늱늲늳늵늶늷������늸늹늺늻늼늽늾늿닀닁닂닃닄닅닆닇닊닋닍닎닏닑닓닔닕닖닗닚닜닞닟닠닡닣닧닩닪닰닱닲닶닼닽닾댂댃댅댆댇댉댊댋댌댍댎댏댒댖댗댘댙댚댛댝댞댟댠댡댢댣댤댥댦댧댨댩댪댫댬댭댮댯댰댱댲댳댴댵댶댷댸댹댺댻댼댽댾댿덀덁덂덃덄덅덆덇덈덉덊덋덌덍덎덏덐덑덒덓덗덙덚덝덠덡덢덣�".split("");
- 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];}
- D[137] = "�����������������������������������������������������������������덦덨덪덬덭덯덲덳덵덶덷덹덺덻덼덽덾덿뎂뎆뎇뎈뎉뎊뎋뎍������뎎뎏뎑뎒뎓뎕뎖뎗뎘뎙뎚뎛뎜뎝뎞뎟뎢뎣뎤뎥뎦뎧뎩뎪뎫뎭������뎮뎯뎰뎱뎲뎳뎴뎵뎶뎷뎸뎹뎺뎻뎼뎽뎾뎿돀돁돂돃돆돇돉돊돍돏돑돒돓돖돘돚돜돞돟돡돢돣돥돦돧돩돪돫돬돭돮돯돰돱돲돳돴돵돶돷돸돹돺돻돽돾돿됀됁됂됃됄됅됆됇됈됉됊됋됌됍됎됏됑됒됓됔됕됖됗됙됚됛됝됞됟됡됢됣됤됥됦됧됪됬됭됮됯됰됱됲됳됵됶됷됸됹됺됻됼됽됾됿둀둁둂둃둄�".split("");
- 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];}
- D[138] = "�����������������������������������������������������������������둅둆둇둈둉둊둋둌둍둎둏둒둓둕둖둗둙둚둛둜둝둞둟둢둤둦������둧둨둩둪둫둭둮둯둰둱둲둳둴둵둶둷둸둹둺둻둼둽둾둿뒁뒂������뒃뒄뒅뒆뒇뒉뒊뒋뒌뒍뒎뒏뒐뒑뒒뒓뒔뒕뒖뒗뒘뒙뒚뒛뒜뒞뒟뒠뒡뒢뒣뒥뒦뒧뒩뒪뒫뒭뒮뒯뒰뒱뒲뒳뒴뒶뒸뒺뒻뒼뒽뒾뒿듁듂듃듅듆듇듉듊듋듌듍듎듏듑듒듓듔듖듗듘듙듚듛듞듟듡듢듥듧듨듩듪듫듮듰듲듳듴듵듶듷듹듺듻듼듽듾듿딀딁딂딃딄딅딆딇딈딉딊딋딌딍딎딏딐딑딒딓딖딗딙딚딝�".split("");
- 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];}
- D[139] = "�����������������������������������������������������������������딞딟딠딡딢딣딦딫딬딭딮딯딲딳딵딶딷딹딺딻딼딽딾딿땂땆������땇땈땉땊땎땏땑땒땓땕땖땗땘땙땚땛땞땢땣땤땥땦땧땨땩땪������땫땬땭땮땯땰땱땲땳땴땵땶땷땸땹땺땻땼땽땾땿떀떁떂떃떄떅떆떇떈떉떊떋떌떍떎떏떐떑떒떓떔떕떖떗떘떙떚떛떜떝떞떟떢떣떥떦떧떩떬떭떮떯떲떶떷떸떹떺떾떿뗁뗂뗃뗅뗆뗇뗈뗉뗊뗋뗎뗒뗓뗔뗕뗖뗗뗙뗚뗛뗜뗝뗞뗟뗠뗡뗢뗣뗤뗥뗦뗧뗨뗩뗪뗫뗭뗮뗯뗰뗱뗲뗳뗴뗵뗶뗷뗸뗹뗺뗻뗼뗽뗾뗿�".split("");
- 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];}
- D[140] = "�����������������������������������������������������������������똀똁똂똃똄똅똆똇똈똉똊똋똌똍똎똏똒똓똕똖똗똙똚똛똜똝������똞똟똠똡똢똣똤똦똧똨똩똪똫똭똮똯똰똱똲똳똵똶똷똸똹똺������똻똼똽똾똿뙀뙁뙂뙃뙄뙅뙆뙇뙉뙊뙋뙌뙍뙎뙏뙐뙑뙒뙓뙔뙕뙖뙗뙘뙙뙚뙛뙜뙝뙞뙟뙠뙡뙢뙣뙥뙦뙧뙩뙪뙫뙬뙭뙮뙯뙰뙱뙲뙳뙴뙵뙶뙷뙸뙹뙺뙻뙼뙽뙾뙿뚀뚁뚂뚃뚄뚅뚆뚇뚈뚉뚊뚋뚌뚍뚎뚏뚐뚑뚒뚓뚔뚕뚖뚗뚘뚙뚚뚛뚞뚟뚡뚢뚣뚥뚦뚧뚨뚩뚪뚭뚮뚯뚰뚲뚳뚴뚵뚶뚷뚸뚹뚺뚻뚼뚽뚾뚿뛀뛁뛂�".split("");
- 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];}
- D[141] = "�����������������������������������������������������������������뛃뛄뛅뛆뛇뛈뛉뛊뛋뛌뛍뛎뛏뛐뛑뛒뛓뛕뛖뛗뛘뛙뛚뛛뛜뛝������뛞뛟뛠뛡뛢뛣뛤뛥뛦뛧뛨뛩뛪뛫뛬뛭뛮뛯뛱뛲뛳뛵뛶뛷뛹뛺������뛻뛼뛽뛾뛿뜂뜃뜄뜆뜇뜈뜉뜊뜋뜌뜍뜎뜏뜐뜑뜒뜓뜔뜕뜖뜗뜘뜙뜚뜛뜜뜝뜞뜟뜠뜡뜢뜣뜤뜥뜦뜧뜪뜫뜭뜮뜱뜲뜳뜴뜵뜶뜷뜺뜼뜽뜾뜿띀띁띂띃띅띆띇띉띊띋띍띎띏띐띑띒띓띖띗띘띙띚띛띜띝띞띟띡띢띣띥띦띧띩띪띫띬띭띮띯띲띴띶띷띸띹띺띻띾띿랁랂랃랅랆랇랈랉랊랋랎랓랔랕랚랛랝랞�".split("");
- 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];}
- D[142] = "�����������������������������������������������������������������랟랡랢랣랤랥랦랧랪랮랯랰랱랲랳랶랷랹랺랻랼랽랾랿럀럁������럂럃럄럅럆럈럊럋럌럍럎럏럐럑럒럓럔럕럖럗럘럙럚럛럜럝������럞럟럠럡럢럣럤럥럦럧럨럩럪럫럮럯럱럲럳럵럶럷럸럹럺럻럾렂렃렄렅렆렊렋렍렎렏렑렒렓렔렕렖렗렚렜렞렟렠렡렢렣렦렧렩렪렫렭렮렯렰렱렲렳렶렺렻렼렽렾렿롁롂롃롅롆롇롈롉롊롋롌롍롎롏롐롒롔롕롖롗롘롙롚롛롞롟롡롢롣롥롦롧롨롩롪롫롮롰롲롳롴롵롶롷롹롺롻롽롾롿뢀뢁뢂뢃뢄�".split("");
- 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];}
- D[143] = "�����������������������������������������������������������������뢅뢆뢇뢈뢉뢊뢋뢌뢎뢏뢐뢑뢒뢓뢔뢕뢖뢗뢘뢙뢚뢛뢜뢝뢞뢟������뢠뢡뢢뢣뢤뢥뢦뢧뢩뢪뢫뢬뢭뢮뢯뢱뢲뢳뢵뢶뢷뢹뢺뢻뢼뢽������뢾뢿룂룄룆룇룈룉룊룋룍룎룏룑룒룓룕룖룗룘룙룚룛룜룞룠룢룣룤룥룦룧룪룫룭룮룯룱룲룳룴룵룶룷룺룼룾룿뤀뤁뤂뤃뤅뤆뤇뤈뤉뤊뤋뤌뤍뤎뤏뤐뤑뤒뤓뤔뤕뤖뤗뤙뤚뤛뤜뤝뤞뤟뤡뤢뤣뤤뤥뤦뤧뤨뤩뤪뤫뤬뤭뤮뤯뤰뤱뤲뤳뤴뤵뤶뤷뤸뤹뤺뤻뤾뤿륁륂륃륅륆륇륈륉륊륋륍륎륐륒륓륔륕륖륗�".split("");
- 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];}
- D[144] = "�����������������������������������������������������������������륚륛륝륞륟륡륢륣륤륥륦륧륪륬륮륯륰륱륲륳륶륷륹륺륻륽������륾륿릀릁릂릃릆릈릋릌릏릐릑릒릓릔릕릖릗릘릙릚릛릜릝릞������릟릠릡릢릣릤릥릦릧릨릩릪릫릮릯릱릲릳릵릶릷릸릹릺릻릾맀맂맃맄맅맆맇맊맋맍맓맔맕맖맗맚맜맟맠맢맦맧맩맪맫맭맮맯맰맱맲맳맶맻맼맽맾맿먂먃먄먅먆먇먉먊먋먌먍먎먏먐먑먒먓먔먖먗먘먙먚먛먜먝먞먟먠먡먢먣먤먥먦먧먨먩먪먫먬먭먮먯먰먱먲먳먴먵먶먷먺먻먽먾먿멁멃멄멅멆�".split("");
- 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];}
- D[145] = "�����������������������������������������������������������������멇멊멌멏멐멑멒멖멗멙멚멛멝멞멟멠멡멢멣멦멪멫멬멭멮멯������멲멳멵멶멷멹멺멻멼멽멾멿몀몁몂몆몈몉몊몋몍몎몏몐몑몒������몓몔몕몖몗몘몙몚몛몜몝몞몟몠몡몢몣몤몥몦몧몪몭몮몯몱몳몴몵몶몷몺몼몾몿뫀뫁뫂뫃뫅뫆뫇뫉뫊뫋뫌뫍뫎뫏뫐뫑뫒뫓뫔뫕뫖뫗뫚뫛뫜뫝뫞뫟뫠뫡뫢뫣뫤뫥뫦뫧뫨뫩뫪뫫뫬뫭뫮뫯뫰뫱뫲뫳뫴뫵뫶뫷뫸뫹뫺뫻뫽뫾뫿묁묂묃묅묆묇묈묉묊묋묌묎묐묒묓묔묕묖묗묙묚묛묝묞묟묡묢묣묤묥묦묧�".split("");
- 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];}
- D[146] = "�����������������������������������������������������������������묨묪묬묭묮묯묰묱묲묳묷묹묺묿뭀뭁뭂뭃뭆뭈뭊뭋뭌뭎뭑뭒������뭓뭕뭖뭗뭙뭚뭛뭜뭝뭞뭟뭠뭢뭤뭥뭦뭧뭨뭩뭪뭫뭭뭮뭯뭰뭱������뭲뭳뭴뭵뭶뭷뭸뭹뭺뭻뭼뭽뭾뭿뮀뮁뮂뮃뮄뮅뮆뮇뮉뮊뮋뮍뮎뮏뮑뮒뮓뮔뮕뮖뮗뮘뮙뮚뮛뮜뮝뮞뮟뮠뮡뮢뮣뮥뮦뮧뮩뮪뮫뮭뮮뮯뮰뮱뮲뮳뮵뮶뮸뮹뮺뮻뮼뮽뮾뮿믁믂믃믅믆믇믉믊믋믌믍믎믏믑믒믔믕믖믗믘믙믚믛믜믝믞믟믠믡믢믣믤믥믦믧믨믩믪믫믬믭믮믯믰믱믲믳믴믵믶믷믺믻믽믾밁�".split("");
- 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];}
- D[147] = "�����������������������������������������������������������������밃밄밅밆밇밊밎밐밒밓밙밚밠밡밢밣밦밨밪밫밬밮밯밲밳밵������밶밷밹밺밻밼밽밾밿뱂뱆뱇뱈뱊뱋뱎뱏뱑뱒뱓뱔뱕뱖뱗뱘뱙������뱚뱛뱜뱞뱟뱠뱡뱢뱣뱤뱥뱦뱧뱨뱩뱪뱫뱬뱭뱮뱯뱰뱱뱲뱳뱴뱵뱶뱷뱸뱹뱺뱻뱼뱽뱾뱿벀벁벂벃벆벇벉벊벍벏벐벑벒벓벖벘벛벜벝벞벟벢벣벥벦벩벪벫벬벭벮벯벲벶벷벸벹벺벻벾벿볁볂볃볅볆볇볈볉볊볋볌볎볒볓볔볖볗볙볚볛볝볞볟볠볡볢볣볤볥볦볧볨볩볪볫볬볭볮볯볰볱볲볳볷볹볺볻볽�".split("");
- 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];}
- D[148] = "�����������������������������������������������������������������볾볿봀봁봂봃봆봈봊봋봌봍봎봏봑봒봓봕봖봗봘봙봚봛봜봝������봞봟봠봡봢봣봥봦봧봨봩봪봫봭봮봯봰봱봲봳봴봵봶봷봸봹������봺봻봼봽봾봿뵁뵂뵃뵄뵅뵆뵇뵊뵋뵍뵎뵏뵑뵒뵓뵔뵕뵖뵗뵚뵛뵜뵝뵞뵟뵠뵡뵢뵣뵥뵦뵧뵩뵪뵫뵬뵭뵮뵯뵰뵱뵲뵳뵴뵵뵶뵷뵸뵹뵺뵻뵼뵽뵾뵿붂붃붅붆붋붌붍붎붏붒붔붖붗붘붛붝붞붟붠붡붢붣붥붦붧붨붩붪붫붬붭붮붯붱붲붳붴붵붶붷붹붺붻붼붽붾붿뷀뷁뷂뷃뷄뷅뷆뷇뷈뷉뷊뷋뷌뷍뷎뷏뷐뷑�".split("");
- 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];}
- D[149] = "�����������������������������������������������������������������뷒뷓뷖뷗뷙뷚뷛뷝뷞뷟뷠뷡뷢뷣뷤뷥뷦뷧뷨뷪뷫뷬뷭뷮뷯뷱������뷲뷳뷵뷶뷷뷹뷺뷻뷼뷽뷾뷿븁븂븄븆븇븈븉븊븋븎븏븑븒븓������븕븖븗븘븙븚븛븞븠븡븢븣븤븥븦븧븨븩븪븫븬븭븮븯븰븱븲븳븴븵븶븷븸븹븺븻븼븽븾븿빀빁빂빃빆빇빉빊빋빍빏빐빑빒빓빖빘빜빝빞빟빢빣빥빦빧빩빫빬빭빮빯빲빶빷빸빹빺빾빿뺁뺂뺃뺅뺆뺇뺈뺉뺊뺋뺎뺒뺓뺔뺕뺖뺗뺚뺛뺜뺝뺞뺟뺠뺡뺢뺣뺤뺥뺦뺧뺩뺪뺫뺬뺭뺮뺯뺰뺱뺲뺳뺴뺵뺶뺷�".split("");
- 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];}
- D[150] = "�����������������������������������������������������������������뺸뺹뺺뺻뺼뺽뺾뺿뻀뻁뻂뻃뻄뻅뻆뻇뻈뻉뻊뻋뻌뻍뻎뻏뻒뻓������뻕뻖뻙뻚뻛뻜뻝뻞뻟뻡뻢뻦뻧뻨뻩뻪뻫뻭뻮뻯뻰뻱뻲뻳뻴뻵������뻶뻷뻸뻹뻺뻻뻼뻽뻾뻿뼀뼂뼃뼄뼅뼆뼇뼊뼋뼌뼍뼎뼏뼐뼑뼒뼓뼔뼕뼖뼗뼚뼞뼟뼠뼡뼢뼣뼤뼥뼦뼧뼨뼩뼪뼫뼬뼭뼮뼯뼰뼱뼲뼳뼴뼵뼶뼷뼸뼹뼺뼻뼼뼽뼾뼿뽂뽃뽅뽆뽇뽉뽊뽋뽌뽍뽎뽏뽒뽓뽔뽖뽗뽘뽙뽚뽛뽜뽝뽞뽟뽠뽡뽢뽣뽤뽥뽦뽧뽨뽩뽪뽫뽬뽭뽮뽯뽰뽱뽲뽳뽴뽵뽶뽷뽸뽹뽺뽻뽼뽽뽾뽿뾀뾁뾂�".split("");
- 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];}
- D[151] = "�����������������������������������������������������������������뾃뾄뾅뾆뾇뾈뾉뾊뾋뾌뾍뾎뾏뾐뾑뾒뾓뾕뾖뾗뾘뾙뾚뾛뾜뾝������뾞뾟뾠뾡뾢뾣뾤뾥뾦뾧뾨뾩뾪뾫뾬뾭뾮뾯뾱뾲뾳뾴뾵뾶뾷뾸������뾹뾺뾻뾼뾽뾾뾿뿀뿁뿂뿃뿄뿆뿇뿈뿉뿊뿋뿎뿏뿑뿒뿓뿕뿖뿗뿘뿙뿚뿛뿝뿞뿠뿢뿣뿤뿥뿦뿧뿨뿩뿪뿫뿬뿭뿮뿯뿰뿱뿲뿳뿴뿵뿶뿷뿸뿹뿺뿻뿼뿽뿾뿿쀀쀁쀂쀃쀄쀅쀆쀇쀈쀉쀊쀋쀌쀍쀎쀏쀐쀑쀒쀓쀔쀕쀖쀗쀘쀙쀚쀛쀜쀝쀞쀟쀠쀡쀢쀣쀤쀥쀦쀧쀨쀩쀪쀫쀬쀭쀮쀯쀰쀱쀲쀳쀴쀵쀶쀷쀸쀹쀺쀻쀽쀾쀿�".split("");
- 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];}
- D[152] = "�����������������������������������������������������������������쁀쁁쁂쁃쁄쁅쁆쁇쁈쁉쁊쁋쁌쁍쁎쁏쁐쁒쁓쁔쁕쁖쁗쁙쁚쁛������쁝쁞쁟쁡쁢쁣쁤쁥쁦쁧쁪쁫쁬쁭쁮쁯쁰쁱쁲쁳쁴쁵쁶쁷쁸쁹������쁺쁻쁼쁽쁾쁿삀삁삂삃삄삅삆삇삈삉삊삋삌삍삎삏삒삓삕삖삗삙삚삛삜삝삞삟삢삤삦삧삨삩삪삫삮삱삲삷삸삹삺삻삾샂샃샄샆샇샊샋샍샎샏샑샒샓샔샕샖샗샚샞샟샠샡샢샣샦샧샩샪샫샭샮샯샰샱샲샳샶샸샺샻샼샽샾샿섁섂섃섅섆섇섉섊섋섌섍섎섏섑섒섓섔섖섗섘섙섚섛섡섢섥섨섩섪섫섮�".split("");
- 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];}
- D[153] = "�����������������������������������������������������������������섲섳섴섵섷섺섻섽섾섿셁셂셃셄셅셆셇셊셎셏셐셑셒셓셖셗������셙셚셛셝셞셟셠셡셢셣셦셪셫셬셭셮셯셱셲셳셵셶셷셹셺셻������셼셽셾셿솀솁솂솃솄솆솇솈솉솊솋솏솑솒솓솕솗솘솙솚솛솞솠솢솣솤솦솧솪솫솭솮솯솱솲솳솴솵솶솷솸솹솺솻솼솾솿쇀쇁쇂쇃쇅쇆쇇쇉쇊쇋쇍쇎쇏쇐쇑쇒쇓쇕쇖쇙쇚쇛쇜쇝쇞쇟쇡쇢쇣쇥쇦쇧쇩쇪쇫쇬쇭쇮쇯쇲쇴쇵쇶쇷쇸쇹쇺쇻쇾쇿숁숂숃숅숆숇숈숉숊숋숎숐숒숓숔숕숖숗숚숛숝숞숡숢숣�".split("");
- 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];}
- D[154] = "�����������������������������������������������������������������숤숥숦숧숪숬숮숰숳숵숶숷숸숹숺숻숼숽숾숿쉀쉁쉂쉃쉄쉅������쉆쉇쉉쉊쉋쉌쉍쉎쉏쉒쉓쉕쉖쉗쉙쉚쉛쉜쉝쉞쉟쉡쉢쉣쉤쉦������쉧쉨쉩쉪쉫쉮쉯쉱쉲쉳쉵쉶쉷쉸쉹쉺쉻쉾슀슂슃슄슅슆슇슊슋슌슍슎슏슑슒슓슔슕슖슗슙슚슜슞슟슠슡슢슣슦슧슩슪슫슮슯슰슱슲슳슶슸슺슻슼슽슾슿싀싁싂싃싄싅싆싇싈싉싊싋싌싍싎싏싐싑싒싓싔싕싖싗싘싙싚싛싞싟싡싢싥싦싧싨싩싪싮싰싲싳싴싵싷싺싽싾싿쌁쌂쌃쌄쌅쌆쌇쌊쌋쌎쌏�".split("");
- 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];}
- D[155] = "�����������������������������������������������������������������쌐쌑쌒쌖쌗쌙쌚쌛쌝쌞쌟쌠쌡쌢쌣쌦쌧쌪쌫쌬쌭쌮쌯쌰쌱쌲������쌳쌴쌵쌶쌷쌸쌹쌺쌻쌼쌽쌾쌿썀썁썂썃썄썆썇썈썉썊썋썌썍������썎썏썐썑썒썓썔썕썖썗썘썙썚썛썜썝썞썟썠썡썢썣썤썥썦썧썪썫썭썮썯썱썳썴썵썶썷썺썻썾썿쎀쎁쎂쎃쎅쎆쎇쎉쎊쎋쎍쎎쎏쎐쎑쎒쎓쎔쎕쎖쎗쎘쎙쎚쎛쎜쎝쎞쎟쎠쎡쎢쎣쎤쎥쎦쎧쎨쎩쎪쎫쎬쎭쎮쎯쎰쎱쎲쎳쎴쎵쎶쎷쎸쎹쎺쎻쎼쎽쎾쎿쏁쏂쏃쏄쏅쏆쏇쏈쏉쏊쏋쏌쏍쏎쏏쏐쏑쏒쏓쏔쏕쏖쏗쏚�".split("");
- 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];}
- D[156] = "�����������������������������������������������������������������쏛쏝쏞쏡쏣쏤쏥쏦쏧쏪쏫쏬쏮쏯쏰쏱쏲쏳쏶쏷쏹쏺쏻쏼쏽쏾������쏿쐀쐁쐂쐃쐄쐅쐆쐇쐉쐊쐋쐌쐍쐎쐏쐑쐒쐓쐔쐕쐖쐗쐘쐙쐚������쐛쐜쐝쐞쐟쐠쐡쐢쐣쐥쐦쐧쐨쐩쐪쐫쐭쐮쐯쐱쐲쐳쐵쐶쐷쐸쐹쐺쐻쐾쐿쑀쑁쑂쑃쑄쑅쑆쑇쑉쑊쑋쑌쑍쑎쑏쑐쑑쑒쑓쑔쑕쑖쑗쑘쑙쑚쑛쑜쑝쑞쑟쑠쑡쑢쑣쑦쑧쑩쑪쑫쑭쑮쑯쑰쑱쑲쑳쑶쑷쑸쑺쑻쑼쑽쑾쑿쒁쒂쒃쒄쒅쒆쒇쒈쒉쒊쒋쒌쒍쒎쒏쒐쒑쒒쒓쒕쒖쒗쒘쒙쒚쒛쒝쒞쒟쒠쒡쒢쒣쒤쒥쒦쒧쒨쒩�".split("");
- 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];}
- D[157] = "�����������������������������������������������������������������쒪쒫쒬쒭쒮쒯쒰쒱쒲쒳쒴쒵쒶쒷쒹쒺쒻쒽쒾쒿쓀쓁쓂쓃쓄쓅������쓆쓇쓈쓉쓊쓋쓌쓍쓎쓏쓐쓑쓒쓓쓔쓕쓖쓗쓘쓙쓚쓛쓜쓝쓞쓟������쓠쓡쓢쓣쓤쓥쓦쓧쓨쓪쓫쓬쓭쓮쓯쓲쓳쓵쓶쓷쓹쓻쓼쓽쓾씂씃씄씅씆씇씈씉씊씋씍씎씏씑씒씓씕씖씗씘씙씚씛씝씞씟씠씡씢씣씤씥씦씧씪씫씭씮씯씱씲씳씴씵씶씷씺씼씾씿앀앁앂앃앆앇앋앏앐앑앒앖앚앛앜앟앢앣앥앦앧앩앪앫앬앭앮앯앲앶앷앸앹앺앻앾앿얁얂얃얅얆얈얉얊얋얎얐얒얓얔�".split("");
- 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];}
- D[158] = "�����������������������������������������������������������������얖얙얚얛얝얞얟얡얢얣얤얥얦얧얨얪얫얬얭얮얯얰얱얲얳얶������얷얺얿엀엁엂엃엋엍엏엒엓엕엖엗엙엚엛엜엝엞엟엢엤엦엧������엨엩엪엫엯엱엲엳엵엸엹엺엻옂옃옄옉옊옋옍옎옏옑옒옓옔옕옖옗옚옝옞옟옠옡옢옣옦옧옩옪옫옯옱옲옶옸옺옼옽옾옿왂왃왅왆왇왉왊왋왌왍왎왏왒왖왗왘왙왚왛왞왟왡왢왣왤왥왦왧왨왩왪왫왭왮왰왲왳왴왵왶왷왺왻왽왾왿욁욂욃욄욅욆욇욊욌욎욏욐욑욒욓욖욗욙욚욛욝욞욟욠욡욢욣욦�".split("");
- 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];}
- D[159] = "�����������������������������������������������������������������욨욪욫욬욭욮욯욲욳욵욶욷욻욼욽욾욿웂웄웆웇웈웉웊웋웎������웏웑웒웓웕웖웗웘웙웚웛웞웟웢웣웤웥웦웧웪웫웭웮웯웱웲������웳웴웵웶웷웺웻웼웾웿윀윁윂윃윆윇윉윊윋윍윎윏윐윑윒윓윖윘윚윛윜윝윞윟윢윣윥윦윧윩윪윫윬윭윮윯윲윴윶윸윹윺윻윾윿읁읂읃읅읆읇읈읉읋읎읐읙읚읛읝읞읟읡읢읣읤읥읦읧읩읪읬읭읮읯읰읱읲읳읶읷읹읺읻읿잀잁잂잆잋잌잍잏잒잓잕잙잛잜잝잞잟잢잧잨잩잪잫잮잯잱잲잳잵잶잷�".split("");
- 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];}
- D[160] = "�����������������������������������������������������������������잸잹잺잻잾쟂쟃쟄쟅쟆쟇쟊쟋쟍쟏쟑쟒쟓쟔쟕쟖쟗쟙쟚쟛쟜������쟞쟟쟠쟡쟢쟣쟥쟦쟧쟩쟪쟫쟭쟮쟯쟰쟱쟲쟳쟴쟵쟶쟷쟸쟹쟺������쟻쟼쟽쟾쟿젂젃젅젆젇젉젋젌젍젎젏젒젔젗젘젙젚젛젞젟젡젢젣젥젦젧젨젩젪젫젮젰젲젳젴젵젶젷젹젺젻젽젾젿졁졂졃졄졅졆졇졊졋졎졏졐졑졒졓졕졖졗졘졙졚졛졜졝졞졟졠졡졢졣졤졥졦졧졨졩졪졫졬졭졮졯졲졳졵졶졷졹졻졼졽졾졿좂좄좈좉좊좎좏좐좑좒좓좕좖좗좘좙좚좛좜좞좠좢좣좤�".split("");
- 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];}
- D[161] = "�����������������������������������������������������������������좥좦좧좩좪좫좬좭좮좯좰좱좲좳좴좵좶좷좸좹좺좻좾좿죀죁������죂죃죅죆죇죉죊죋죍죎죏죐죑죒죓죖죘죚죛죜죝죞죟죢죣죥������죦죧죨죩죪죫죬죭죮죯죰죱죲죳죴죶죷죸죹죺죻죾죿줁줂줃줇줈줉줊줋줎 、。·‥…¨〃―∥\∼‘’“”〔〕〈〉《》「」『』【】±×÷≠≤≥∞∴°′″℃Å¢£¥♂♀∠⊥⌒∂∇≡≒§※☆★○●◎◇◆□■△▲▽▼→←↑↓↔〓≪≫√∽∝∵∫∬∈∋⊆⊇⊂⊃∪∩∧∨¬�".split("");
- 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];}
- D[162] = "�����������������������������������������������������������������줐줒줓줔줕줖줗줙줚줛줜줝줞줟줠줡줢줣줤줥줦줧줨줩줪줫������줭줮줯줰줱줲줳줵줶줷줸줹줺줻줼줽줾줿쥀쥁쥂쥃쥄쥅쥆쥇������쥈쥉쥊쥋쥌쥍쥎쥏쥒쥓쥕쥖쥗쥙쥚쥛쥜쥝쥞쥟쥢쥤쥥쥦쥧쥨쥩쥪쥫쥭쥮쥯⇒⇔∀∃´~ˇ˘˝˚˙¸˛¡¿ː∮∑∏¤℉‰◁◀▷▶♤♠♡♥♧♣⊙◈▣◐◑▒▤▥▨▧▦▩♨☏☎☜☞¶†‡↕↗↙↖↘♭♩♪♬㉿㈜№㏇™㏂㏘℡€®������������������������".split("");
- 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];}
- D[163] = "�����������������������������������������������������������������쥱쥲쥳쥵쥶쥷쥸쥹쥺쥻쥽쥾쥿즀즁즂즃즄즅즆즇즊즋즍즎즏������즑즒즓즔즕즖즗즚즜즞즟즠즡즢즣즤즥즦즧즨즩즪즫즬즭즮������즯즰즱즲즳즴즵즶즷즸즹즺즻즼즽즾즿짂짃짅짆짉짋짌짍짎짏짒짔짗짘짛!"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[₩]^_`abcdefghijklmnopqrstuvwxyz{|} ̄�".split("");
- 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];}
- D[164] = "�����������������������������������������������������������������짞짟짡짣짥짦짨짩짪짫짮짲짳짴짵짶짷짺짻짽짾짿쨁쨂쨃쨄������쨅쨆쨇쨊쨎쨏쨐쨑쨒쨓쨕쨖쨗쨙쨚쨛쨜쨝쨞쨟쨠쨡쨢쨣쨤쨥������쨦쨧쨨쨪쨫쨬쨭쨮쨯쨰쨱쨲쨳쨴쨵쨶쨷쨸쨹쨺쨻쨼쨽쨾쨿쩀쩁쩂쩃쩄쩅쩆ㄱㄲㄳㄴㄵㄶㄷㄸㄹㄺㄻㄼㄽㄾㄿㅀㅁㅂㅃㅄㅅㅆㅇㅈㅉㅊㅋㅌㅍㅎㅏㅐㅑㅒㅓㅔㅕㅖㅗㅘㅙㅚㅛㅜㅝㅞㅟㅠㅡㅢㅣㅤㅥㅦㅧㅨㅩㅪㅫㅬㅭㅮㅯㅰㅱㅲㅳㅴㅵㅶㅷㅸㅹㅺㅻㅼㅽㅾㅿㆀㆁㆂㆃㆄㆅㆆㆇㆈㆉㆊㆋㆌㆍㆎ�".split("");
- 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];}
- D[165] = "�����������������������������������������������������������������쩇쩈쩉쩊쩋쩎쩏쩑쩒쩓쩕쩖쩗쩘쩙쩚쩛쩞쩢쩣쩤쩥쩦쩧쩩쩪������쩫쩬쩭쩮쩯쩰쩱쩲쩳쩴쩵쩶쩷쩸쩹쩺쩻쩼쩾쩿쪀쪁쪂쪃쪅쪆������쪇쪈쪉쪊쪋쪌쪍쪎쪏쪐쪑쪒쪓쪔쪕쪖쪗쪙쪚쪛쪜쪝쪞쪟쪠쪡쪢쪣쪤쪥쪦쪧ⅰⅱⅲⅳⅴⅵⅶⅷⅸⅹ�����ⅠⅡⅢⅣⅤⅥⅦⅧⅨⅩ�������ΑΒΓΔΕΖΗΘΙΚΛΜΝΞΟΠΡΣΤΥΦΧΨΩ��������αβγδεζηθικλμνξοπρστυφχψω�������".split("");
- 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];}
- D[166] = "�����������������������������������������������������������������쪨쪩쪪쪫쪬쪭쪮쪯쪰쪱쪲쪳쪴쪵쪶쪷쪸쪹쪺쪻쪾쪿쫁쫂쫃쫅������쫆쫇쫈쫉쫊쫋쫎쫐쫒쫔쫕쫖쫗쫚쫛쫜쫝쫞쫟쫡쫢쫣쫤쫥쫦쫧������쫨쫩쫪쫫쫭쫮쫯쫰쫱쫲쫳쫵쫶쫷쫸쫹쫺쫻쫼쫽쫾쫿쬀쬁쬂쬃쬄쬅쬆쬇쬉쬊─│┌┐┘└├┬┤┴┼━┃┏┓┛┗┣┳┫┻╋┠┯┨┷┿┝┰┥┸╂┒┑┚┙┖┕┎┍┞┟┡┢┦┧┩┪┭┮┱┲┵┶┹┺┽┾╀╁╃╄╅╆╇╈╉╊���������������������������".split("");
- 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];}
- D[167] = "�����������������������������������������������������������������쬋쬌쬍쬎쬏쬑쬒쬓쬕쬖쬗쬙쬚쬛쬜쬝쬞쬟쬢쬣쬤쬥쬦쬧쬨쬩������쬪쬫쬬쬭쬮쬯쬰쬱쬲쬳쬴쬵쬶쬷쬸쬹쬺쬻쬼쬽쬾쬿쭀쭂쭃쭄������쭅쭆쭇쭊쭋쭍쭎쭏쭑쭒쭓쭔쭕쭖쭗쭚쭛쭜쭞쭟쭠쭡쭢쭣쭥쭦쭧쭨쭩쭪쭫쭬㎕㎖㎗ℓ㎘㏄㎣㎤㎥㎦㎙㎚㎛㎜㎝㎞㎟㎠㎡㎢㏊㎍㎎㎏㏏㎈㎉㏈㎧㎨㎰㎱㎲㎳㎴㎵㎶㎷㎸㎹㎀㎁㎂㎃㎄㎺㎻㎼㎽㎾㎿㎐㎑㎒㎓㎔Ω㏀㏁㎊㎋㎌㏖㏅㎭㎮㎯㏛㎩㎪㎫㎬㏝㏐㏓㏃㏉㏜㏆����������������".split("");
- 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];}
- D[168] = "�����������������������������������������������������������������쭭쭮쭯쭰쭱쭲쭳쭴쭵쭶쭷쭺쭻쭼쭽쭾쭿쮀쮁쮂쮃쮄쮅쮆쮇쮈������쮉쮊쮋쮌쮍쮎쮏쮐쮑쮒쮓쮔쮕쮖쮗쮘쮙쮚쮛쮝쮞쮟쮠쮡쮢쮣������쮤쮥쮦쮧쮨쮩쮪쮫쮬쮭쮮쮯쮰쮱쮲쮳쮴쮵쮶쮷쮹쮺쮻쮼쮽쮾쮿쯀쯁쯂쯃쯄ÆЪĦ�IJ�ĿŁØŒºÞŦŊ�㉠㉡㉢㉣㉤㉥㉦㉧㉨㉩㉪㉫㉬㉭㉮㉯㉰㉱㉲㉳㉴㉵㉶㉷㉸㉹㉺㉻ⓐⓑⓒⓓⓔⓕⓖⓗⓘⓙⓚⓛⓜⓝⓞⓟⓠⓡⓢⓣⓤⓥⓦⓧⓨⓩ①②③④⑤⑥⑦⑧⑨⑩⑪⑫⑬⑭⑮½⅓⅔¼¾⅛⅜⅝⅞�".split("");
- 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];}
- D[169] = "�����������������������������������������������������������������쯅쯆쯇쯈쯉쯊쯋쯌쯍쯎쯏쯐쯑쯒쯓쯕쯖쯗쯘쯙쯚쯛쯜쯝쯞쯟������쯠쯡쯢쯣쯥쯦쯨쯪쯫쯬쯭쯮쯯쯰쯱쯲쯳쯴쯵쯶쯷쯸쯹쯺쯻쯼������쯽쯾쯿찀찁찂찃찄찅찆찇찈찉찊찋찎찏찑찒찓찕찖찗찘찙찚찛찞찟찠찣찤æđðħıijĸŀłøœßþŧŋʼn㈀㈁㈂㈃㈄㈅㈆㈇㈈㈉㈊㈋㈌㈍㈎㈏㈐㈑㈒㈓㈔㈕㈖㈗㈘㈙㈚㈛⒜⒝⒞⒟⒠⒡⒢⒣⒤⒥⒦⒧⒨⒩⒪⒫⒬⒭⒮⒯⒰⒱⒲⒳⒴⒵⑴⑵⑶⑷⑸⑹⑺⑻⑼⑽⑾⑿⒀⒁⒂¹²³⁴ⁿ₁₂₃₄�".split("");
- 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];}
- D[170] = "�����������������������������������������������������������������찥찦찪찫찭찯찱찲찳찴찵찶찷찺찿챀챁챂챃챆챇챉챊챋챍챎������챏챐챑챒챓챖챚챛챜챝챞챟챡챢챣챥챧챩챪챫챬챭챮챯챱챲������챳챴챶챷챸챹챺챻챼챽챾챿첀첁첂첃첄첅첆첇첈첉첊첋첌첍첎첏첐첑첒첓ぁあぃいぅうぇえぉおかがきぎくぐけげこごさざしじすずせぜそぞただちぢっつづてでとどなにぬねのはばぱひびぴふぶぷへべぺほぼぽまみむめもゃやゅゆょよらりるれろゎわゐゑをん������������".split("");
- 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];}
- D[171] = "�����������������������������������������������������������������첔첕첖첗첚첛첝첞첟첡첢첣첤첥첦첧첪첮첯첰첱첲첳첶첷첹������첺첻첽첾첿쳀쳁쳂쳃쳆쳈쳊쳋쳌쳍쳎쳏쳑쳒쳓쳕쳖쳗쳘쳙쳚������쳛쳜쳝쳞쳟쳠쳡쳢쳣쳥쳦쳧쳨쳩쳪쳫쳭쳮쳯쳱쳲쳳쳴쳵쳶쳷쳸쳹쳺쳻쳼쳽ァアィイゥウェエォオカガキギクグケゲコゴサザシジスズセゼソゾタダチヂッツヅテデトドナニヌネノハバパヒビピフブプヘベペホボポマミムメモャヤュユョヨラリルレロヮワヰヱヲンヴヵヶ���������".split("");
- 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];}
- D[172] = "�����������������������������������������������������������������쳾쳿촀촂촃촄촅촆촇촊촋촍촎촏촑촒촓촔촕촖촗촚촜촞촟촠������촡촢촣촥촦촧촩촪촫촭촮촯촰촱촲촳촴촵촶촷촸촺촻촼촽촾������촿쵀쵁쵂쵃쵄쵅쵆쵇쵈쵉쵊쵋쵌쵍쵎쵏쵐쵑쵒쵓쵔쵕쵖쵗쵘쵙쵚쵛쵝쵞쵟АБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯ���������������абвгдеёжзийклмнопрстуфхцчшщъыьэюя��������������".split("");
- 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];}
- D[173] = "�����������������������������������������������������������������쵡쵢쵣쵥쵦쵧쵨쵩쵪쵫쵮쵰쵲쵳쵴쵵쵶쵷쵹쵺쵻쵼쵽쵾쵿춀������춁춂춃춄춅춆춇춉춊춋춌춍춎춏춐춑춒춓춖춗춙춚춛춝춞춟������춠춡춢춣춦춨춪춫춬춭춮춯춱춲춳춴춵춶춷춸춹춺춻춼춽춾춿췀췁췂췃췅�����������������������������������������������������������������������������������������������".split("");
- 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];}
- D[174] = "�����������������������������������������������������������������췆췇췈췉췊췋췍췎췏췑췒췓췔췕췖췗췘췙췚췛췜췝췞췟췠췡������췢췣췤췥췦췧췩췪췫췭췮췯췱췲췳췴췵췶췷췺췼췾췿츀츁츂������츃츅츆츇츉츊츋츍츎츏츐츑츒츓츕츖츗츘츚츛츜츝츞츟츢츣츥츦츧츩츪츫�����������������������������������������������������������������������������������������������".split("");
- 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];}
- D[175] = "�����������������������������������������������������������������츬츭츮츯츲츴츶츷츸츹츺츻츼츽츾츿칀칁칂칃칄칅칆칇칈칉������칊칋칌칍칎칏칐칑칒칓칔칕칖칗칚칛칝칞칢칣칤칥칦칧칪칬������칮칯칰칱칲칳칶칷칹칺칻칽칾칿캀캁캂캃캆캈캊캋캌캍캎캏캒캓캕캖캗캙�����������������������������������������������������������������������������������������������".split("");
- 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];}
- D[176] = "�����������������������������������������������������������������캚캛캜캝캞캟캢캦캧캨캩캪캫캮캯캰캱캲캳캴캵캶캷캸캹캺������캻캼캽캾캿컀컂컃컄컅컆컇컈컉컊컋컌컍컎컏컐컑컒컓컔컕������컖컗컘컙컚컛컜컝컞컟컠컡컢컣컦컧컩컪컭컮컯컰컱컲컳컶컺컻컼컽컾컿가각간갇갈갉갊감갑값갓갔강갖갗같갚갛개객갠갤갬갭갯갰갱갸갹갼걀걋걍걔걘걜거걱건걷걸걺검겁것겄겅겆겉겊겋게겐겔겜겝겟겠겡겨격겪견겯결겸겹겻겼경곁계곈곌곕곗고곡곤곧골곪곬곯곰곱곳공곶과곽관괄괆�".split("");
- 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];}
- D[177] = "�����������������������������������������������������������������켂켃켅켆켇켉켊켋켌켍켎켏켒켔켖켗켘켙켚켛켝켞켟켡켢켣������켥켦켧켨켩켪켫켮켲켳켴켵켶켷켹켺켻켼켽켾켿콀콁콂콃콄������콅콆콇콈콉콊콋콌콍콎콏콐콑콒콓콖콗콙콚콛콝콞콟콠콡콢콣콦콨콪콫콬괌괍괏광괘괜괠괩괬괭괴괵괸괼굄굅굇굉교굔굘굡굣구국군굳굴굵굶굻굼굽굿궁궂궈궉권궐궜궝궤궷귀귁귄귈귐귑귓규균귤그극근귿글긁금급긋긍긔기긱긴긷길긺김깁깃깅깆깊까깍깎깐깔깖깜깝깟깠깡깥깨깩깬깰깸�".split("");
- 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];}
- D[178] = "�����������������������������������������������������������������콭콮콯콲콳콵콶콷콹콺콻콼콽콾콿쾁쾂쾃쾄쾆쾇쾈쾉쾊쾋쾍������쾎쾏쾐쾑쾒쾓쾔쾕쾖쾗쾘쾙쾚쾛쾜쾝쾞쾟쾠쾢쾣쾤쾥쾦쾧쾩������쾪쾫쾬쾭쾮쾯쾱쾲쾳쾴쾵쾶쾷쾸쾹쾺쾻쾼쾽쾾쾿쿀쿁쿂쿃쿅쿆쿇쿈쿉쿊쿋깹깻깼깽꺄꺅꺌꺼꺽꺾껀껄껌껍껏껐껑께껙껜껨껫껭껴껸껼꼇꼈꼍꼐꼬꼭꼰꼲꼴꼼꼽꼿꽁꽂꽃꽈꽉꽐꽜꽝꽤꽥꽹꾀꾄꾈꾐꾑꾕꾜꾸꾹꾼꿀꿇꿈꿉꿋꿍꿎꿔꿜꿨꿩꿰꿱꿴꿸뀀뀁뀄뀌뀐뀔뀜뀝뀨끄끅끈끊끌끎끓끔끕끗끙�".split("");
- 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];}
- D[179] = "�����������������������������������������������������������������쿌쿍쿎쿏쿐쿑쿒쿓쿔쿕쿖쿗쿘쿙쿚쿛쿜쿝쿞쿟쿢쿣쿥쿦쿧쿩������쿪쿫쿬쿭쿮쿯쿲쿴쿶쿷쿸쿹쿺쿻쿽쿾쿿퀁퀂퀃퀅퀆퀇퀈퀉퀊������퀋퀌퀍퀎퀏퀐퀒퀓퀔퀕퀖퀗퀙퀚퀛퀜퀝퀞퀟퀠퀡퀢퀣퀤퀥퀦퀧퀨퀩퀪퀫퀬끝끼끽낀낄낌낍낏낑나낙낚난낟날낡낢남납낫났낭낮낯낱낳내낵낸낼냄냅냇냈냉냐냑냔냘냠냥너넉넋넌널넒넓넘넙넛넜넝넣네넥넨넬넴넵넷넸넹녀녁년녈념녑녔녕녘녜녠노녹논놀놂놈놉놋농높놓놔놘놜놨뇌뇐뇔뇜뇝�".split("");
- 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];}
- D[180] = "�����������������������������������������������������������������퀮퀯퀰퀱퀲퀳퀶퀷퀹퀺퀻퀽퀾퀿큀큁큂큃큆큈큊큋큌큍큎큏������큑큒큓큕큖큗큙큚큛큜큝큞큟큡큢큣큤큥큦큧큨큩큪큫큮큯������큱큲큳큵큶큷큸큹큺큻큾큿킀킂킃킄킅킆킇킈킉킊킋킌킍킎킏킐킑킒킓킔뇟뇨뇩뇬뇰뇹뇻뇽누눅눈눋눌눔눕눗눙눠눴눼뉘뉜뉠뉨뉩뉴뉵뉼늄늅늉느늑는늘늙늚늠늡늣능늦늪늬늰늴니닉닌닐닒님닙닛닝닢다닥닦단닫달닭닮닯닳담답닷닸당닺닻닿대댁댄댈댐댑댓댔댕댜더덕덖던덛덜덞덟덤덥�".split("");
- 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];}
- D[181] = "�����������������������������������������������������������������킕킖킗킘킙킚킛킜킝킞킟킠킡킢킣킦킧킩킪킫킭킮킯킰킱킲������킳킶킸킺킻킼킽킾킿탂탃탅탆탇탊탋탌탍탎탏탒탖탗탘탙탚������탛탞탟탡탢탣탥탦탧탨탩탪탫탮탲탳탴탵탶탷탹탺탻탼탽탾탿턀턁턂턃턄덧덩덫덮데덱덴델뎀뎁뎃뎄뎅뎌뎐뎔뎠뎡뎨뎬도독돈돋돌돎돐돔돕돗동돛돝돠돤돨돼됐되된될됨됩됫됴두둑둔둘둠둡둣둥둬뒀뒈뒝뒤뒨뒬뒵뒷뒹듀듄듈듐듕드득든듣들듦듬듭듯등듸디딕딘딛딜딤딥딧딨딩딪따딱딴딸�".split("");
- 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];}
- D[182] = "�����������������������������������������������������������������턅턆턇턈턉턊턋턌턎턏턐턑턒턓턔턕턖턗턘턙턚턛턜턝턞턟������턠턡턢턣턤턥턦턧턨턩턪턫턬턭턮턯턲턳턵턶턷턹턻턼턽턾������턿텂텆텇텈텉텊텋텎텏텑텒텓텕텖텗텘텙텚텛텞텠텢텣텤텥텦텧텩텪텫텭땀땁땃땄땅땋때땍땐땔땜땝땟땠땡떠떡떤떨떪떫떰떱떳떴떵떻떼떽뗀뗄뗌뗍뗏뗐뗑뗘뗬또똑똔똘똥똬똴뙈뙤뙨뚜뚝뚠뚤뚫뚬뚱뛔뛰뛴뛸뜀뜁뜅뜨뜩뜬뜯뜰뜸뜹뜻띄띈띌띔띕띠띤띨띰띱띳띵라락란랄람랍랏랐랑랒랖랗�".split("");
- 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];}
- D[183] = "�����������������������������������������������������������������텮텯텰텱텲텳텴텵텶텷텸텹텺텻텽텾텿톀톁톂톃톅톆톇톉톊������톋톌톍톎톏톐톑톒톓톔톕톖톗톘톙톚톛톜톝톞톟톢톣톥톦톧������톩톪톫톬톭톮톯톲톴톶톷톸톹톻톽톾톿퇁퇂퇃퇄퇅퇆퇇퇈퇉퇊퇋퇌퇍퇎퇏래랙랜랠램랩랫랬랭랴략랸럇량러럭런럴럼럽럿렀렁렇레렉렌렐렘렙렛렝려력련렬렴렵렷렸령례롄롑롓로록론롤롬롭롯롱롸롼뢍뢨뢰뢴뢸룀룁룃룅료룐룔룝룟룡루룩룬룰룸룹룻룽뤄뤘뤠뤼뤽륀륄륌륏륑류륙륜률륨륩�".split("");
- 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];}
- D[184] = "�����������������������������������������������������������������퇐퇑퇒퇓퇔퇕퇖퇗퇙퇚퇛퇜퇝퇞퇟퇠퇡퇢퇣퇤퇥퇦퇧퇨퇩퇪������퇫퇬퇭퇮퇯퇰퇱퇲퇳퇵퇶퇷퇹퇺퇻퇼퇽퇾퇿툀툁툂툃툄툅툆������툈툊툋툌툍툎툏툑툒툓툔툕툖툗툘툙툚툛툜툝툞툟툠툡툢툣툤툥툦툧툨툩륫륭르륵른를름릅릇릉릊릍릎리릭린릴림립릿링마막만많맏말맑맒맘맙맛망맞맡맣매맥맨맬맴맵맷맸맹맺먀먁먈먕머먹먼멀멂멈멉멋멍멎멓메멕멘멜멤멥멧멨멩며멱면멸몃몄명몇몌모목몫몬몰몲몸몹못몽뫄뫈뫘뫙뫼�".split("");
- 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];}
- D[185] = "�����������������������������������������������������������������툪툫툮툯툱툲툳툵툶툷툸툹툺툻툾퉀퉂퉃퉄퉅퉆퉇퉉퉊퉋퉌������퉍퉎퉏퉐퉑퉒퉓퉔퉕퉖퉗퉘퉙퉚퉛퉝퉞퉟퉠퉡퉢퉣퉥퉦퉧퉨������퉩퉪퉫퉬퉭퉮퉯퉰퉱퉲퉳퉴퉵퉶퉷퉸퉹퉺퉻퉼퉽퉾퉿튂튃튅튆튇튉튊튋튌묀묄묍묏묑묘묜묠묩묫무묵묶문묻물묽묾뭄뭅뭇뭉뭍뭏뭐뭔뭘뭡뭣뭬뮈뮌뮐뮤뮨뮬뮴뮷므믄믈믐믓미믹민믿밀밂밈밉밋밌밍및밑바박밖밗반받발밝밞밟밤밥밧방밭배백밴밸뱀뱁뱃뱄뱅뱉뱌뱍뱐뱝버벅번벋벌벎범법벗�".split("");
- 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];}
- D[186] = "�����������������������������������������������������������������튍튎튏튒튓튔튖튗튘튙튚튛튝튞튟튡튢튣튥튦튧튨튩튪튫튭������튮튯튰튲튳튴튵튶튷튺튻튽튾틁틃틄틅틆틇틊틌틍틎틏틐틑������틒틓틕틖틗틙틚틛틝틞틟틠틡틢틣틦틧틨틩틪틫틬틭틮틯틲틳틵틶틷틹틺벙벚베벡벤벧벨벰벱벳벴벵벼벽변별볍볏볐병볕볘볜보복볶본볼봄봅봇봉봐봔봤봬뵀뵈뵉뵌뵐뵘뵙뵤뵨부북분붇불붉붊붐붑붓붕붙붚붜붤붰붸뷔뷕뷘뷜뷩뷰뷴뷸븀븃븅브븍븐블븜븝븟비빅빈빌빎빔빕빗빙빚빛빠빡빤�".split("");
- 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];}
- D[187] = "�����������������������������������������������������������������틻틼틽틾틿팂팄팆팇팈팉팊팋팏팑팒팓팕팗팘팙팚팛팞팢팣������팤팦팧팪팫팭팮팯팱팲팳팴팵팶팷팺팾팿퍀퍁퍂퍃퍆퍇퍈퍉������퍊퍋퍌퍍퍎퍏퍐퍑퍒퍓퍔퍕퍖퍗퍘퍙퍚퍛퍜퍝퍞퍟퍠퍡퍢퍣퍤퍥퍦퍧퍨퍩빨빪빰빱빳빴빵빻빼빽뺀뺄뺌뺍뺏뺐뺑뺘뺙뺨뻐뻑뻔뻗뻘뻠뻣뻤뻥뻬뼁뼈뼉뼘뼙뼛뼜뼝뽀뽁뽄뽈뽐뽑뽕뾔뾰뿅뿌뿍뿐뿔뿜뿟뿡쀼쁑쁘쁜쁠쁨쁩삐삑삔삘삠삡삣삥사삭삯산삳살삵삶삼삽삿샀상샅새색샌샐샘샙샛샜생샤�".split("");
- 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];}
- D[188] = "�����������������������������������������������������������������퍪퍫퍬퍭퍮퍯퍰퍱퍲퍳퍴퍵퍶퍷퍸퍹퍺퍻퍾퍿펁펂펃펅펆펇������펈펉펊펋펎펒펓펔펕펖펗펚펛펝펞펟펡펢펣펤펥펦펧펪펬펮������펯펰펱펲펳펵펶펷펹펺펻펽펾펿폀폁폂폃폆폇폊폋폌폍폎폏폑폒폓폔폕폖샥샨샬샴샵샷샹섀섄섈섐섕서석섞섟선섣설섦섧섬섭섯섰성섶세섹센셀셈셉셋셌셍셔셕션셜셤셥셧셨셩셰셴셸솅소속솎손솔솖솜솝솟송솥솨솩솬솰솽쇄쇈쇌쇔쇗쇘쇠쇤쇨쇰쇱쇳쇼쇽숀숄숌숍숏숑수숙순숟술숨숩숫숭�".split("");
- 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];}
- D[189] = "�����������������������������������������������������������������폗폙폚폛폜폝폞폟폠폢폤폥폦폧폨폩폪폫폮폯폱폲폳폵폶폷������폸폹폺폻폾퐀퐂퐃퐄퐅퐆퐇퐉퐊퐋퐌퐍퐎퐏퐐퐑퐒퐓퐔퐕퐖������퐗퐘퐙퐚퐛퐜퐞퐟퐠퐡퐢퐣퐤퐥퐦퐧퐨퐩퐪퐫퐬퐭퐮퐯퐰퐱퐲퐳퐴퐵퐶퐷숯숱숲숴쉈쉐쉑쉔쉘쉠쉥쉬쉭쉰쉴쉼쉽쉿슁슈슉슐슘슛슝스슥슨슬슭슴습슷승시식신싣실싫심십싯싱싶싸싹싻싼쌀쌈쌉쌌쌍쌓쌔쌕쌘쌜쌤쌥쌨쌩썅써썩썬썰썲썸썹썼썽쎄쎈쎌쏀쏘쏙쏜쏟쏠쏢쏨쏩쏭쏴쏵쏸쐈쐐쐤쐬쐰�".split("");
- 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];}
- D[190] = "�����������������������������������������������������������������퐸퐹퐺퐻퐼퐽퐾퐿푁푂푃푅푆푇푈푉푊푋푌푍푎푏푐푑푒푓������푔푕푖푗푘푙푚푛푝푞푟푡푢푣푥푦푧푨푩푪푫푬푮푰푱푲������푳푴푵푶푷푺푻푽푾풁풃풄풅풆풇풊풌풎풏풐풑풒풓풕풖풗풘풙풚풛풜풝쐴쐼쐽쑈쑤쑥쑨쑬쑴쑵쑹쒀쒔쒜쒸쒼쓩쓰쓱쓴쓸쓺쓿씀씁씌씐씔씜씨씩씬씰씸씹씻씽아악안앉않알앍앎앓암압앗았앙앝앞애액앤앨앰앱앳앴앵야약얀얄얇얌얍얏양얕얗얘얜얠얩어억언얹얻얼얽얾엄업없엇었엉엊엌엎�".split("");
- 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];}
- D[191] = "�����������������������������������������������������������������풞풟풠풡풢풣풤풥풦풧풨풪풫풬풭풮풯풰풱풲풳풴풵풶풷풸������풹풺풻풼풽풾풿퓀퓁퓂퓃퓄퓅퓆퓇퓈퓉퓊퓋퓍퓎퓏퓑퓒퓓퓕������퓖퓗퓘퓙퓚퓛퓝퓞퓠퓡퓢퓣퓤퓥퓦퓧퓩퓪퓫퓭퓮퓯퓱퓲퓳퓴퓵퓶퓷퓹퓺퓼에엑엔엘엠엡엣엥여역엮연열엶엷염엽엾엿였영옅옆옇예옌옐옘옙옛옜오옥온올옭옮옰옳옴옵옷옹옻와왁완왈왐왑왓왔왕왜왝왠왬왯왱외왹왼욀욈욉욋욍요욕욘욜욤욥욧용우욱운울욹욺움웁웃웅워웍원월웜웝웠웡웨�".split("");
- 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];}
- D[192] = "�����������������������������������������������������������������퓾퓿픀픁픂픃픅픆픇픉픊픋픍픎픏픐픑픒픓픖픘픙픚픛픜픝������픞픟픠픡픢픣픤픥픦픧픨픩픪픫픬픭픮픯픰픱픲픳픴픵픶픷������픸픹픺픻픾픿핁핂핃핅핆핇핈핉핊핋핎핐핒핓핔핕핖핗핚핛핝핞핟핡핢핣웩웬웰웸웹웽위윅윈윌윔윕윗윙유육윤율윰윱윳융윷으윽은을읊음읍읏응읒읓읔읕읖읗의읜읠읨읫이익인일읽읾잃임입잇있잉잊잎자작잔잖잗잘잚잠잡잣잤장잦재잭잰잴잼잽잿쟀쟁쟈쟉쟌쟎쟐쟘쟝쟤쟨쟬저적전절젊�".split("");
- 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];}
- D[193] = "�����������������������������������������������������������������핤핦핧핪핬핮핯핰핱핲핳핶핷핹핺핻핽핾핿햀햁햂햃햆햊햋������햌햍햎햏햑햒햓햔햕햖햗햘햙햚햛햜햝햞햟햠햡햢햣햤햦햧������햨햩햪햫햬햭햮햯햰햱햲햳햴햵햶햷햸햹햺햻햼햽햾햿헀헁헂헃헄헅헆헇점접젓정젖제젝젠젤젬젭젯젱져젼졀졈졉졌졍졔조족존졸졺좀좁좃종좆좇좋좌좍좔좝좟좡좨좼좽죄죈죌죔죕죗죙죠죡죤죵주죽준줄줅줆줌줍줏중줘줬줴쥐쥑쥔쥘쥠쥡쥣쥬쥰쥴쥼즈즉즌즐즘즙즛증지직진짇질짊짐집짓�".split("");
- 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];}
- D[194] = "�����������������������������������������������������������������헊헋헍헎헏헑헓헔헕헖헗헚헜헞헟헠헡헢헣헦헧헩헪헫헭헮������헯헰헱헲헳헶헸헺헻헼헽헾헿혂혃혅혆혇혉혊혋혌혍혎혏혒������혖혗혘혙혚혛혝혞혟혡혢혣혥혦혧혨혩혪혫혬혮혯혰혱혲혳혴혵혶혷혺혻징짖짙짚짜짝짠짢짤짧짬짭짯짰짱째짹짼쨀쨈쨉쨋쨌쨍쨔쨘쨩쩌쩍쩐쩔쩜쩝쩟쩠쩡쩨쩽쪄쪘쪼쪽쫀쫄쫌쫍쫏쫑쫓쫘쫙쫠쫬쫴쬈쬐쬔쬘쬠쬡쭁쭈쭉쭌쭐쭘쭙쭝쭤쭸쭹쮜쮸쯔쯤쯧쯩찌찍찐찔찜찝찡찢찧차착찬찮찰참찹찻�".split("");
- 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];}
- D[195] = "�����������������������������������������������������������������혽혾혿홁홂홃홄홆홇홊홌홎홏홐홒홓홖홗홙홚홛홝홞홟홠홡������홢홣홤홥홦홨홪홫홬홭홮홯홲홳홵홶홷홸홹홺홻홼홽홾홿횀������횁횂횄횆횇횈횉횊횋횎횏횑횒횓횕횖횗횘횙횚횛횜횞횠횢횣횤횥횦횧횩횪찼창찾채책챈챌챔챕챗챘챙챠챤챦챨챰챵처척천철첨첩첫첬청체첵첸첼쳄쳅쳇쳉쳐쳔쳤쳬쳰촁초촉촌촐촘촙촛총촤촨촬촹최쵠쵤쵬쵭쵯쵱쵸춈추축춘출춤춥춧충춰췄췌췐취췬췰췸췹췻췽츄츈츌츔츙츠측츤츨츰츱츳층�".split("");
- 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];}
- D[196] = "�����������������������������������������������������������������횫횭횮횯횱횲횳횴횵횶횷횸횺횼횽횾횿훀훁훂훃훆훇훉훊훋������훍훎훏훐훒훓훕훖훘훚훛훜훝훞훟훡훢훣훥훦훧훩훪훫훬훭������훮훯훱훲훳훴훶훷훸훹훺훻훾훿휁휂휃휅휆휇휈휉휊휋휌휍휎휏휐휒휓휔치칙친칟칠칡침칩칫칭카칵칸칼캄캅캇캉캐캑캔캘캠캡캣캤캥캬캭컁커컥컨컫컬컴컵컷컸컹케켁켄켈켐켑켓켕켜켠켤켬켭켯켰켱켸코콕콘콜콤콥콧콩콰콱콴콸쾀쾅쾌쾡쾨쾰쿄쿠쿡쿤쿨쿰쿱쿳쿵쿼퀀퀄퀑퀘퀭퀴퀵퀸퀼�".split("");
- 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];}
- D[197] = "�����������������������������������������������������������������휕휖휗휚휛휝휞휟휡휢휣휤휥휦휧휪휬휮휯휰휱휲휳휶휷휹������휺휻휽휾휿흀흁흂흃흅흆흈흊흋흌흍흎흏흒흓흕흚흛흜흝흞������흟흢흤흦흧흨흪흫흭흮흯흱흲흳흵흶흷흸흹흺흻흾흿힀힂힃힄힅힆힇힊힋큄큅큇큉큐큔큘큠크큭큰클큼큽킁키킥킨킬킴킵킷킹타탁탄탈탉탐탑탓탔탕태택탠탤탬탭탯탰탱탸턍터턱턴털턺텀텁텃텄텅테텍텐텔템텝텟텡텨텬텼톄톈토톡톤톨톰톱톳통톺톼퇀퇘퇴퇸툇툉툐투툭툰툴툼툽툿퉁퉈퉜�".split("");
- 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];}
- D[198] = "�����������������������������������������������������������������힍힎힏힑힒힓힔힕힖힗힚힜힞힟힠힡힢힣������������������������������������������������������������������������������퉤튀튁튄튈튐튑튕튜튠튤튬튱트특튼튿틀틂틈틉틋틔틘틜틤틥티틱틴틸팀팁팃팅파팍팎판팔팖팜팝팟팠팡팥패팩팬팰팸팹팻팼팽퍄퍅퍼퍽펀펄펌펍펏펐펑페펙펜펠펨펩펫펭펴편펼폄폅폈평폐폘폡폣포폭폰폴폼폽폿퐁�".split("");
- 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];}
- D[199] = "�����������������������������������������������������������������������������������������������������������������������������������������������������������������퐈퐝푀푄표푠푤푭푯푸푹푼푿풀풂품풉풋풍풔풩퓌퓐퓔퓜퓟퓨퓬퓰퓸퓻퓽프픈플픔픕픗피픽핀필핌핍핏핑하학한할핥함합핫항해핵핸핼햄햅햇했행햐향허헉헌헐헒험헙헛헝헤헥헨헬헴헵헷헹혀혁현혈혐협혓혔형혜혠�".split("");
- 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];}
- D[200] = "�����������������������������������������������������������������������������������������������������������������������������������������������������������������혤혭호혹혼홀홅홈홉홋홍홑화확환활홧황홰홱홴횃횅회획횐횔횝횟횡효횬횰횹횻후훅훈훌훑훔훗훙훠훤훨훰훵훼훽휀휄휑휘휙휜휠휨휩휫휭휴휵휸휼흄흇흉흐흑흔흖흗흘흙흠흡흣흥흩희흰흴흼흽힁히힉힌힐힘힙힛힝�".split("");
- 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];}
- D[202] = "�����������������������������������������������������������������������������������������������������������������������������������������������������������������伽佳假價加可呵哥嘉嫁家暇架枷柯歌珂痂稼苛茄街袈訶賈跏軻迦駕刻却各恪慤殼珏脚覺角閣侃刊墾奸姦干幹懇揀杆柬桿澗癎看磵稈竿簡肝艮艱諫間乫喝曷渴碣竭葛褐蝎鞨勘坎堪嵌感憾戡敢柑橄減甘疳監瞰紺邯鑑鑒龕�".split("");
- 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];}
- D[203] = "�����������������������������������������������������������������������������������������������������������������������������������������������������������������匣岬甲胛鉀閘剛堈姜岡崗康强彊慷江畺疆糠絳綱羌腔舡薑襁講鋼降鱇介价個凱塏愷愾慨改槪漑疥皆盖箇芥蓋豈鎧開喀客坑更粳羹醵倨去居巨拒据據擧渠炬祛距踞車遽鉅鋸乾件健巾建愆楗腱虔蹇鍵騫乞傑杰桀儉劍劒檢�".split("");
- 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];}
- D[204] = "�����������������������������������������������������������������������������������������������������������������������������������������������������������������瞼鈐黔劫怯迲偈憩揭擊格檄激膈覡隔堅牽犬甄絹繭肩見譴遣鵑抉決潔結缺訣兼慊箝謙鉗鎌京俓倞傾儆勁勍卿坰境庚徑慶憬擎敬景暻更梗涇炅烱璟璥瓊痙硬磬竟競絅經耕耿脛莖警輕逕鏡頃頸驚鯨係啓堺契季屆悸戒桂械�".split("");
- 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];}
- D[205] = "�����������������������������������������������������������������������������������������������������������������������������������������������������������������棨溪界癸磎稽系繫繼計誡谿階鷄古叩告呱固姑孤尻庫拷攷故敲暠枯槁沽痼皐睾稿羔考股膏苦苽菰藁蠱袴誥賈辜錮雇顧高鼓哭斛曲梏穀谷鵠困坤崑昆梱棍滾琨袞鯤汨滑骨供公共功孔工恐恭拱控攻珙空蚣貢鞏串寡戈果瓜�".split("");
- 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];}
- D[206] = "�����������������������������������������������������������������������������������������������������������������������������������������������������������������科菓誇課跨過鍋顆廓槨藿郭串冠官寬慣棺款灌琯瓘管罐菅觀貫關館刮恝括适侊光匡壙廣曠洸炚狂珖筐胱鑛卦掛罫乖傀塊壞怪愧拐槐魁宏紘肱轟交僑咬喬嬌嶠巧攪敎校橋狡皎矯絞翹膠蕎蛟較轎郊餃驕鮫丘久九仇俱具勾�".split("");
- 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];}
- D[207] = "�����������������������������������������������������������������������������������������������������������������������������������������������������������������區口句咎嘔坵垢寇嶇廐懼拘救枸柩構歐毆毬求溝灸狗玖球瞿矩究絿耉臼舅舊苟衢謳購軀逑邱鉤銶駒驅鳩鷗龜國局菊鞠鞫麴君窘群裙軍郡堀屈掘窟宮弓穹窮芎躬倦券勸卷圈拳捲權淃眷厥獗蕨蹶闕机櫃潰詭軌饋句晷歸貴�".split("");
- 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];}
- D[208] = "�����������������������������������������������������������������������������������������������������������������������������������������������������������������鬼龜叫圭奎揆槻珪硅窺竅糾葵規赳逵閨勻均畇筠菌鈞龜橘克剋劇戟棘極隙僅劤勤懃斤根槿瑾筋芹菫覲謹近饉契今妗擒昑檎琴禁禽芩衾衿襟金錦伋及急扱汲級給亘兢矜肯企伎其冀嗜器圻基埼夔奇妓寄岐崎己幾忌技旗旣�".split("");
- 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];}
- D[209] = "�����������������������������������������������������������������������������������������������������������������������������������������������������������������朞期杞棋棄機欺氣汽沂淇玘琦琪璂璣畸畿碁磯祁祇祈祺箕紀綺羈耆耭肌記譏豈起錡錤飢饑騎騏驥麒緊佶吉拮桔金喫儺喇奈娜懦懶拏拿癩羅蘿螺裸邏那樂洛烙珞落諾酪駱亂卵暖欄煖爛蘭難鸞捏捺南嵐枏楠湳濫男藍襤拉�".split("");
- 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];}
- D[210] = "�����������������������������������������������������������������������������������������������������������������������������������������������������������������納臘蠟衲囊娘廊朗浪狼郎乃來內奈柰耐冷女年撚秊念恬拈捻寧寗努勞奴弩怒擄櫓爐瑙盧老蘆虜路露駑魯鷺碌祿綠菉錄鹿論壟弄濃籠聾膿農惱牢磊腦賂雷尿壘屢樓淚漏累縷陋嫩訥杻紐勒肋凜凌稜綾能菱陵尼泥匿溺多茶�".split("");
- 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];}
- D[211] = "�����������������������������������������������������������������������������������������������������������������������������������������������������������������丹亶但單團壇彖斷旦檀段湍短端簞緞蛋袒鄲鍛撻澾獺疸達啖坍憺擔曇淡湛潭澹痰聃膽蕁覃談譚錟沓畓答踏遝唐堂塘幢戇撞棠當糖螳黨代垈坮大對岱帶待戴擡玳臺袋貸隊黛宅德悳倒刀到圖堵塗導屠島嶋度徒悼挑掉搗桃�".split("");
- 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];}
- D[212] = "�����������������������������������������������������������������������������������������������������������������������������������������������������������������棹櫂淘渡滔濤燾盜睹禱稻萄覩賭跳蹈逃途道都鍍陶韜毒瀆牘犢獨督禿篤纛讀墩惇敦旽暾沌焞燉豚頓乭突仝冬凍動同憧東桐棟洞潼疼瞳童胴董銅兜斗杜枓痘竇荳讀豆逗頭屯臀芚遁遯鈍得嶝橙燈登等藤謄鄧騰喇懶拏癩羅�".split("");
- 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];}
- D[213] = "�����������������������������������������������������������������������������������������������������������������������������������������������������������������蘿螺裸邏樂洛烙珞絡落諾酪駱丹亂卵欄欒瀾爛蘭鸞剌辣嵐擥攬欖濫籃纜藍襤覽拉臘蠟廊朗浪狼琅瑯螂郞來崍徠萊冷掠略亮倆兩凉梁樑粮粱糧良諒輛量侶儷勵呂廬慮戾旅櫚濾礪藜蠣閭驢驪麗黎力曆歷瀝礫轢靂憐戀攣漣�".split("");
- 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];}
- D[214] = "�����������������������������������������������������������������������������������������������������������������������������������������������������������������煉璉練聯蓮輦連鍊冽列劣洌烈裂廉斂殮濂簾獵令伶囹寧岺嶺怜玲笭羚翎聆逞鈴零靈領齡例澧禮醴隷勞怒撈擄櫓潞瀘爐盧老蘆虜路輅露魯鷺鹵碌祿綠菉錄鹿麓論壟弄朧瀧瓏籠聾儡瀨牢磊賂賚賴雷了僚寮廖料燎療瞭聊蓼�".split("");
- 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];}
- D[215] = "�����������������������������������������������������������������������������������������������������������������������������������������������������������������遼鬧龍壘婁屢樓淚漏瘻累縷蔞褸鏤陋劉旒柳榴流溜瀏琉瑠留瘤硫謬類六戮陸侖倫崙淪綸輪律慄栗率隆勒肋凜凌楞稜綾菱陵俚利厘吏唎履悧李梨浬犁狸理璃異痢籬罹羸莉裏裡里釐離鯉吝潾燐璘藺躪隣鱗麟林淋琳臨霖砬�".split("");
- 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];}
- D[216] = "�����������������������������������������������������������������������������������������������������������������������������������������������������������������立笠粒摩瑪痲碼磨馬魔麻寞幕漠膜莫邈万卍娩巒彎慢挽晩曼滿漫灣瞞萬蔓蠻輓饅鰻唜抹末沫茉襪靺亡妄忘忙望網罔芒茫莽輞邙埋妹媒寐昧枚梅每煤罵買賣邁魅脈貊陌驀麥孟氓猛盲盟萌冪覓免冕勉棉沔眄眠綿緬面麵滅�".split("");
- 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];}
- D[217] = "�����������������������������������������������������������������������������������������������������������������������������������������������������������������蔑冥名命明暝椧溟皿瞑茗蓂螟酩銘鳴袂侮冒募姆帽慕摸摹暮某模母毛牟牡瑁眸矛耗芼茅謀謨貌木沐牧目睦穆鶩歿沒夢朦蒙卯墓妙廟描昴杳渺猫竗苗錨務巫憮懋戊拇撫无楙武毋無珷畝繆舞茂蕪誣貿霧鵡墨默們刎吻問文�".split("");
- 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];}
- D[218] = "�����������������������������������������������������������������������������������������������������������������������������������������������������������������汶紊紋聞蚊門雯勿沕物味媚尾嵋彌微未梶楣渼湄眉米美薇謎迷靡黴岷悶愍憫敏旻旼民泯玟珉緡閔密蜜謐剝博拍搏撲朴樸泊珀璞箔粕縛膊舶薄迫雹駁伴半反叛拌搬攀斑槃泮潘班畔瘢盤盼磐磻礬絆般蟠返頒飯勃拔撥渤潑�".split("");
- 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];}
- D[219] = "�����������������������������������������������������������������������������������������������������������������������������������������������������������������發跋醱鉢髮魃倣傍坊妨尨幇彷房放方旁昉枋榜滂磅紡肪膀舫芳蒡蚌訪謗邦防龐倍俳北培徘拜排杯湃焙盃背胚裴裵褙賠輩配陪伯佰帛柏栢白百魄幡樊煩燔番磻繁蕃藩飜伐筏罰閥凡帆梵氾汎泛犯範范法琺僻劈壁擘檗璧癖�".split("");
- 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];}
- D[220] = "�����������������������������������������������������������������������������������������������������������������������������������������������������������������碧蘗闢霹便卞弁變辨辯邊別瞥鱉鼈丙倂兵屛幷昞昺柄棅炳甁病秉竝輧餠騈保堡報寶普步洑湺潽珤甫菩補褓譜輔伏僕匐卜宓復服福腹茯蔔複覆輹輻馥鰒本乶俸奉封峯峰捧棒烽熢琫縫蓬蜂逢鋒鳳不付俯傅剖副否咐埠夫婦�".split("");
- 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];}
- D[221] = "�����������������������������������������������������������������������������������������������������������������������������������������������������������������孚孵富府復扶敷斧浮溥父符簿缶腐腑膚艀芙莩訃負賦賻赴趺部釜阜附駙鳧北分吩噴墳奔奮忿憤扮昐汾焚盆粉糞紛芬賁雰不佛弗彿拂崩朋棚硼繃鵬丕備匕匪卑妃婢庇悲憊扉批斐枇榧比毖毗毘沸泌琵痺砒碑秕秘粃緋翡肥�".split("");
- 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];}
- D[222] = "�����������������������������������������������������������������������������������������������������������������������������������������������������������������脾臂菲蜚裨誹譬費鄙非飛鼻嚬嬪彬斌檳殯浜濱瀕牝玭貧賓頻憑氷聘騁乍事些仕伺似使俟僿史司唆嗣四士奢娑寫寺射巳師徙思捨斜斯柶査梭死沙泗渣瀉獅砂社祀祠私篩紗絲肆舍莎蓑蛇裟詐詞謝賜赦辭邪飼駟麝削數朔索�".split("");
- 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];}
- D[223] = "�����������������������������������������������������������������������������������������������������������������������������������������������������������������傘刪山散汕珊産疝算蒜酸霰乷撒殺煞薩三參杉森渗芟蔘衫揷澁鈒颯上傷像償商喪嘗孀尙峠常床庠廂想桑橡湘爽牀狀相祥箱翔裳觴詳象賞霜塞璽賽嗇塞穡索色牲生甥省笙墅壻嶼序庶徐恕抒捿敍暑曙書栖棲犀瑞筮絮緖署�".split("");
- 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];}
- D[224] = "�����������������������������������������������������������������������������������������������������������������������������������������������������������������胥舒薯西誓逝鋤黍鼠夕奭席惜昔晳析汐淅潟石碩蓆釋錫仙僊先善嬋宣扇敾旋渲煽琁瑄璇璿癬禪線繕羨腺膳船蘚蟬詵跣選銑鐥饍鮮卨屑楔泄洩渫舌薛褻設說雪齧剡暹殲纖蟾贍閃陝攝涉燮葉城姓宬性惺成星晟猩珹盛省筬�".split("");
- 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];}
- D[225] = "�����������������������������������������������������������������������������������������������������������������������������������������������������������������聖聲腥誠醒世勢歲洗稅笹細說貰召嘯塑宵小少巢所掃搔昭梳沼消溯瀟炤燒甦疏疎瘙笑篠簫素紹蔬蕭蘇訴逍遡邵銷韶騷俗屬束涑粟續謖贖速孫巽損蓀遜飡率宋悚松淞訟誦送頌刷殺灑碎鎖衰釗修受嗽囚垂壽嫂守岫峀帥愁�".split("");
- 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];}
- D[226] = "�����������������������������������������������������������������������������������������������������������������������������������������������������������������戍手授搜收數樹殊水洙漱燧狩獸琇璲瘦睡秀穗竪粹綏綬繡羞脩茱蒐蓚藪袖誰讐輸遂邃酬銖銹隋隧隨雖需須首髓鬚叔塾夙孰宿淑潚熟琡璹肅菽巡徇循恂旬栒楯橓殉洵淳珣盾瞬筍純脣舜荀蓴蕣詢諄醇錞順馴戌術述鉥崇崧�".split("");
- 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];}
- D[227] = "�����������������������������������������������������������������������������������������������������������������������������������������������������������������嵩瑟膝蝨濕拾習褶襲丞乘僧勝升承昇繩蠅陞侍匙嘶始媤尸屎屍市弑恃施是時枾柴猜矢示翅蒔蓍視試詩諡豕豺埴寔式息拭植殖湜熄篒蝕識軾食飾伸侁信呻娠宸愼新晨燼申神紳腎臣莘薪藎蜃訊身辛辰迅失室實悉審尋心沁�".split("");
- 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];}
- D[228] = "�����������������������������������������������������������������������������������������������������������������������������������������������������������������沈深瀋甚芯諶什十拾雙氏亞俄兒啞娥峨我牙芽莪蛾衙訝阿雅餓鴉鵝堊岳嶽幄惡愕握樂渥鄂鍔顎鰐齷安岸按晏案眼雁鞍顔鮟斡謁軋閼唵岩巖庵暗癌菴闇壓押狎鴨仰央怏昻殃秧鴦厓哀埃崖愛曖涯碍艾隘靄厄扼掖液縊腋額�".split("");
- 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];}
- D[229] = "�����������������������������������������������������������������������������������������������������������������������������������������������������������������櫻罌鶯鸚也倻冶夜惹揶椰爺耶若野弱掠略約若葯蒻藥躍亮佯兩凉壤孃恙揚攘敭暘梁楊樣洋瀁煬痒瘍禳穰糧羊良襄諒讓釀陽量養圄御於漁瘀禦語馭魚齬億憶抑檍臆偃堰彦焉言諺孼蘖俺儼嚴奄掩淹嶪業円予余勵呂女如廬�".split("");
- 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];}
- D[230] = "�����������������������������������������������������������������������������������������������������������������������������������������������������������������旅歟汝濾璵礖礪與艅茹輿轝閭餘驪麗黎亦力域役易曆歷疫繹譯轢逆驛嚥堧姸娟宴年延憐戀捐挻撚椽沇沿涎涓淵演漣烟然煙煉燃燕璉硏硯秊筵緣練縯聯衍軟輦蓮連鉛鍊鳶列劣咽悅涅烈熱裂說閱厭廉念捻染殮炎焰琰艶苒�".split("");
- 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];}
- D[231] = "�����������������������������������������������������������������������������������������������������������������������������������������������������������������簾閻髥鹽曄獵燁葉令囹塋寧嶺嶸影怜映暎楹榮永泳渶潁濚瀛瀯煐營獰玲瑛瑩瓔盈穎纓羚聆英詠迎鈴鍈零霙靈領乂倪例刈叡曳汭濊猊睿穢芮藝蘂禮裔詣譽豫醴銳隸霓預五伍俉傲午吾吳嗚塢墺奧娛寤悟惡懊敖旿晤梧汚澳�".split("");
- 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];}
- D[232] = "�����������������������������������������������������������������������������������������������������������������������������������������������������������������烏熬獒筽蜈誤鰲鼇屋沃獄玉鈺溫瑥瘟穩縕蘊兀壅擁瓮甕癰翁邕雍饔渦瓦窩窪臥蛙蝸訛婉完宛梡椀浣玩琓琬碗緩翫脘腕莞豌阮頑曰往旺枉汪王倭娃歪矮外嵬巍猥畏了僚僥凹堯夭妖姚寥寮尿嶢拗搖撓擾料曜樂橈燎燿瑤療�".split("");
- 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];}
- D[233] = "�����������������������������������������������������������������������������������������������������������������������������������������������������������������窈窯繇繞耀腰蓼蟯要謠遙遼邀饒慾欲浴縟褥辱俑傭冗勇埇墉容庸慂榕涌湧溶熔瑢用甬聳茸蓉踊鎔鏞龍于佑偶優又友右宇寓尤愚憂旴牛玗瑀盂祐禑禹紆羽芋藕虞迂遇郵釪隅雨雩勖彧旭昱栯煜稶郁頊云暈橒殞澐熉耘芸蕓�".split("");
- 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];}
- D[234] = "�����������������������������������������������������������������������������������������������������������������������������������������������������������������運隕雲韻蔚鬱亐熊雄元原員圓園垣媛嫄寃怨愿援沅洹湲源爰猿瑗苑袁轅遠阮院願鴛月越鉞位偉僞危圍委威尉慰暐渭爲瑋緯胃萎葦蔿蝟衛褘謂違韋魏乳侑儒兪劉唯喩孺宥幼幽庾悠惟愈愉揄攸有杻柔柚柳楡楢油洧流游溜�".split("");
- 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];}
- D[235] = "�����������������������������������������������������������������������������������������������������������������������������������������������������������������濡猶猷琉瑜由留癒硫紐維臾萸裕誘諛諭踰蹂遊逾遺酉釉鍮類六堉戮毓肉育陸倫允奫尹崙淪潤玧胤贇輪鈗閏律慄栗率聿戎瀜絨融隆垠恩慇殷誾銀隱乙吟淫蔭陰音飮揖泣邑凝應膺鷹依倚儀宜意懿擬椅毅疑矣義艤薏蟻衣誼�".split("");
- 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];}
- D[236] = "�����������������������������������������������������������������������������������������������������������������������������������������������������������������議醫二以伊利吏夷姨履已弛彛怡易李梨泥爾珥理異痍痢移罹而耳肄苡荑裏裡貽貳邇里離飴餌匿溺瀷益翊翌翼謚人仁刃印吝咽因姻寅引忍湮燐璘絪茵藺蚓認隣靭靷鱗麟一佚佾壹日溢逸鎰馹任壬妊姙恁林淋稔臨荏賃入卄�".split("");
- 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];}
- D[237] = "�����������������������������������������������������������������������������������������������������������������������������������������������������������������立笠粒仍剩孕芿仔刺咨姉姿子字孜恣慈滋炙煮玆瓷疵磁紫者自茨蔗藉諮資雌作勺嚼斫昨灼炸爵綽芍酌雀鵲孱棧殘潺盞岑暫潛箴簪蠶雜丈仗匠場墻壯奬將帳庄張掌暲杖樟檣欌漿牆狀獐璋章粧腸臟臧莊葬蔣薔藏裝贓醬長�".split("");
- 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];}
- D[238] = "�����������������������������������������������������������������������������������������������������������������������������������������������������������������障再哉在宰才材栽梓渽滓災縡裁財載齋齎爭箏諍錚佇低儲咀姐底抵杵楮樗沮渚狙猪疽箸紵苧菹著藷詛貯躇這邸雎齟勣吊嫡寂摘敵滴狄炙的積笛籍績翟荻謫賊赤跡蹟迪迹適鏑佃佺傳全典前剪塡塼奠專展廛悛戰栓殿氈澱�".split("");
- 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];}
- D[239] = "�����������������������������������������������������������������������������������������������������������������������������������������������������������������煎琠田甸畑癲筌箋箭篆纏詮輾轉鈿銓錢鐫電顚顫餞切截折浙癤竊節絶占岾店漸点粘霑鮎點接摺蝶丁井亭停偵呈姃定幀庭廷征情挺政整旌晶晸柾楨檉正汀淀淨渟湞瀞炡玎珽町睛碇禎程穽精綎艇訂諪貞鄭酊釘鉦鋌錠霆靖�".split("");
- 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];}
- D[240] = "�����������������������������������������������������������������������������������������������������������������������������������������������������������������靜頂鼎制劑啼堤帝弟悌提梯濟祭第臍薺製諸蹄醍除際霽題齊俎兆凋助嘲弔彫措操早晁曺曹朝條棗槽漕潮照燥爪璪眺祖祚租稠窕粗糟組繰肇藻蚤詔調趙躁造遭釣阻雕鳥族簇足鏃存尊卒拙猝倧宗從悰慫棕淙琮種終綜縱腫�".split("");
- 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];}
- D[241] = "�����������������������������������������������������������������������������������������������������������������������������������������������������������������踪踵鍾鐘佐坐左座挫罪主住侏做姝胄呪周嗾奏宙州廚晝朱柱株注洲湊澍炷珠疇籌紂紬綢舟蛛註誅走躊輳週酎酒鑄駐竹粥俊儁准埈寯峻晙樽浚準濬焌畯竣蠢逡遵雋駿茁中仲衆重卽櫛楫汁葺增憎曾拯烝甑症繒蒸證贈之只�".split("");
- 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];}
- D[242] = "�����������������������������������������������������������������������������������������������������������������������������������������������������������������咫地址志持指摯支旨智枝枳止池沚漬知砥祉祗紙肢脂至芝芷蜘誌識贄趾遲直稙稷織職唇嗔塵振搢晉晋桭榛殄津溱珍瑨璡畛疹盡眞瞋秦縉縝臻蔯袗診賑軫辰進鎭陣陳震侄叱姪嫉帙桎瓆疾秩窒膣蛭質跌迭斟朕什執潗緝輯�".split("");
- 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];}
- D[243] = "�����������������������������������������������������������������������������������������������������������������������������������������������������������������鏶集徵懲澄且侘借叉嗟嵯差次此磋箚茶蹉車遮捉搾着窄錯鑿齪撰澯燦璨瓚竄簒纂粲纘讚贊鑽餐饌刹察擦札紮僭參塹慘慙懺斬站讒讖倉倡創唱娼廠彰愴敞昌昶暢槍滄漲猖瘡窓脹艙菖蒼債埰寀寨彩採砦綵菜蔡采釵冊柵策�".split("");
- 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];}
- D[244] = "�����������������������������������������������������������������������������������������������������������������������������������������������������������������責凄妻悽處倜刺剔尺慽戚拓擲斥滌瘠脊蹠陟隻仟千喘天川擅泉淺玔穿舛薦賤踐遷釧闡阡韆凸哲喆徹撤澈綴輟轍鐵僉尖沾添甛瞻簽籤詹諂堞妾帖捷牒疊睫諜貼輒廳晴淸聽菁請靑鯖切剃替涕滯締諦逮遞體初剿哨憔抄招梢�".split("");
- 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];}
- D[245] = "�����������������������������������������������������������������������������������������������������������������������������������������������������������������椒楚樵炒焦硝礁礎秒稍肖艸苕草蕉貂超酢醋醮促囑燭矗蜀觸寸忖村邨叢塚寵悤憁摠總聰蔥銃撮催崔最墜抽推椎楸樞湫皺秋芻萩諏趨追鄒酋醜錐錘鎚雛騶鰍丑畜祝竺筑築縮蓄蹙蹴軸逐春椿瑃出朮黜充忠沖蟲衝衷悴膵萃�".split("");
- 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];}
- D[246] = "�����������������������������������������������������������������������������������������������������������������������������������������������������������������贅取吹嘴娶就炊翠聚脆臭趣醉驟鷲側仄厠惻測層侈値嗤峙幟恥梔治淄熾痔痴癡稚穉緇緻置致蚩輜雉馳齒則勅飭親七柒漆侵寢枕沈浸琛砧針鍼蟄秤稱快他咤唾墮妥惰打拖朶楕舵陀馱駝倬卓啄坼度托拓擢晫柝濁濯琢琸託�".split("");
- 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];}
- D[247] = "�����������������������������������������������������������������������������������������������������������������������������������������������������������������鐸呑嘆坦彈憚歎灘炭綻誕奪脫探眈耽貪塔搭榻宕帑湯糖蕩兌台太怠態殆汰泰笞胎苔跆邰颱宅擇澤撑攄兎吐土討慟桶洞痛筒統通堆槌腿褪退頹偸套妬投透鬪慝特闖坡婆巴把播擺杷波派爬琶破罷芭跛頗判坂板版瓣販辦鈑�".split("");
- 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];}
- D[248] = "�����������������������������������������������������������������������������������������������������������������������������������������������������������������阪八叭捌佩唄悖敗沛浿牌狽稗覇貝彭澎烹膨愎便偏扁片篇編翩遍鞭騙貶坪平枰萍評吠嬖幣廢弊斃肺蔽閉陛佈包匍匏咆哺圃布怖抛抱捕暴泡浦疱砲胞脯苞葡蒲袍褒逋鋪飽鮑幅暴曝瀑爆輻俵剽彪慓杓標漂瓢票表豹飇飄驃�".split("");
- 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];}
- D[249] = "�����������������������������������������������������������������������������������������������������������������������������������������������������������������品稟楓諷豊風馮彼披疲皮被避陂匹弼必泌珌畢疋筆苾馝乏逼下何厦夏廈昰河瑕荷蝦賀遐霞鰕壑學虐謔鶴寒恨悍旱汗漢澣瀚罕翰閑閒限韓割轄函含咸啣喊檻涵緘艦銜陷鹹合哈盒蛤閤闔陜亢伉姮嫦巷恒抗杭桁沆港缸肛航�".split("");
- 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];}
- D[250] = "�����������������������������������������������������������������������������������������������������������������������������������������������������������������行降項亥偕咳垓奚孩害懈楷海瀣蟹解該諧邂駭骸劾核倖幸杏荇行享向嚮珦鄕響餉饗香噓墟虛許憲櫶獻軒歇險驗奕爀赫革俔峴弦懸晛泫炫玄玹現眩睍絃絢縣舷衒見賢鉉顯孑穴血頁嫌俠協夾峽挾浹狹脅脇莢鋏頰亨兄刑型�".split("");
- 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];}
- D[251] = "�����������������������������������������������������������������������������������������������������������������������������������������������������������������形泂滎瀅灐炯熒珩瑩荊螢衡逈邢鎣馨兮彗惠慧暳蕙蹊醯鞋乎互呼壕壺好岵弧戶扈昊晧毫浩淏湖滸澔濠濩灝狐琥瑚瓠皓祜糊縞胡芦葫蒿虎號蝴護豪鎬頀顥惑或酷婚昏混渾琿魂忽惚笏哄弘汞泓洪烘紅虹訌鴻化和嬅樺火畵�".split("");
- 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];}
- D[252] = "�����������������������������������������������������������������������������������������������������������������������������������������������������������������禍禾花華話譁貨靴廓擴攫確碻穫丸喚奐宦幻患換歡晥桓渙煥環紈還驩鰥活滑猾豁闊凰幌徨恍惶愰慌晃晄榥況湟滉潢煌璜皇篁簧荒蝗遑隍黃匯回廻徊恢悔懷晦會檜淮澮灰獪繪膾茴蛔誨賄劃獲宖橫鐄哮嚆孝效斅曉梟涍淆�".split("");
- 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];}
- D[253] = "�����������������������������������������������������������������������������������������������������������������������������������������������������������������爻肴酵驍侯候厚后吼喉嗅帿後朽煦珝逅勛勳塤壎焄熏燻薰訓暈薨喧暄煊萱卉喙毁彙徽揮暉煇諱輝麾休携烋畦虧恤譎鷸兇凶匈洶胸黑昕欣炘痕吃屹紇訖欠欽歆吸恰洽翕興僖凞喜噫囍姬嬉希憙憘戱晞曦熙熹熺犧禧稀羲詰�".split("");
- 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];}
- return {"enc": e, "dec": d }; })();
- cptable[950] = (function(){ var d = [], e = {}, D = [], j;
- 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("");
- 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];}
- D[161] = "���������������������������������������������������������������� ,、。.‧;:?!︰…‥﹐﹑﹒·﹔﹕﹖﹗|–︱—︳╴︴﹏()︵︶{}︷︸〔〕︹︺【】︻︼《》︽︾〈〉︿﹀「」﹁﹂『』﹃﹄﹙﹚����������������������������������﹛﹜﹝﹞‘’“”〝〞‵′#&*※§〃○●△▲◎☆★◇◆□■▽▼㊣℅¯ ̄_ˍ﹉﹊﹍﹎﹋﹌﹟﹠﹡+-×÷±√<>=≦≧≠∞≒≡﹢﹣﹤﹥﹦~∩∪⊥∠∟⊿㏒㏑∫∮∵∴♀♂⊕⊙↑↓←→↖↗↙↘∥∣/�".split("");
- 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];}
- D[162] = "����������������������������������������������������������������\∕﹨$¥〒¢£%@℃℉﹩﹪﹫㏕㎜㎝㎞㏎㎡㎎㎏㏄°兙兛兞兝兡兣嗧瓩糎▁▂▃▄▅▆▇█▏▎▍▌▋▊▉┼┴┬┤├▔─│▕┌┐└┘╭����������������������������������╮╰╯═╞╪╡◢◣◥◤╱╲╳0123456789ⅠⅡⅢⅣⅤⅥⅦⅧⅨⅩ〡〢〣〤〥〦〧〨〩十卄卅ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuv�".split("");
- 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];}
- D[163] = "����������������������������������������������������������������wxyzΑΒΓΔΕΖΗΘΙΚΛΜΝΞΟΠΡΣΤΥΦΧΨΩαβγδεζηθικλμνξοπρστυφχψωㄅㄆㄇㄈㄉㄊㄋㄌㄍㄎㄏ����������������������������������ㄐㄑㄒㄓㄔㄕㄖㄗㄘㄙㄚㄛㄜㄝㄞㄟㄠㄡㄢㄣㄤㄥㄦㄧㄨㄩ˙ˉˊˇˋ���������������������������������€������������������������������".split("");
- 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];}
- D[164] = "����������������������������������������������������������������一乙丁七乃九了二人儿入八几刀刁力匕十卜又三下丈上丫丸凡久么也乞于亡兀刃勺千叉口土士夕大女子孑孓寸小尢尸山川工己已巳巾干廾弋弓才����������������������������������丑丐不中丰丹之尹予云井互五亢仁什仃仆仇仍今介仄元允內六兮公冗凶分切刈勻勾勿化匹午升卅卞厄友及反壬天夫太夭孔少尤尺屯巴幻廿弔引心戈戶手扎支文斗斤方日曰月木欠止歹毋比毛氏水火爪父爻片牙牛犬王丙�".split("");
- 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];}
- D[165] = "����������������������������������������������������������������世丕且丘主乍乏乎以付仔仕他仗代令仙仞充兄冉冊冬凹出凸刊加功包匆北匝仟半卉卡占卯卮去可古右召叮叩叨叼司叵叫另只史叱台句叭叻四囚外����������������������������������央失奴奶孕它尼巨巧左市布平幼弁弘弗必戊打扔扒扑斥旦朮本未末札正母民氐永汁汀氾犯玄玉瓜瓦甘生用甩田由甲申疋白皮皿目矛矢石示禾穴立丞丟乒乓乩亙交亦亥仿伉伙伊伕伍伐休伏仲件任仰仳份企伋光兇兆先全�".split("");
- 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];}
- D[166] = "����������������������������������������������������������������共再冰列刑划刎刖劣匈匡匠印危吉吏同吊吐吁吋各向名合吃后吆吒因回囝圳地在圭圬圯圩夙多夷夸妄奸妃好她如妁字存宇守宅安寺尖屹州帆并年����������������������������������式弛忙忖戎戌戍成扣扛托收早旨旬旭曲曳有朽朴朱朵次此死氖汝汗汙江池汐汕污汛汍汎灰牟牝百竹米糸缶羊羽老考而耒耳聿肉肋肌臣自至臼舌舛舟艮色艾虫血行衣西阡串亨位住佇佗佞伴佛何估佐佑伽伺伸佃佔似但佣�".split("");
- 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];}
- D[167] = "����������������������������������������������������������������作你伯低伶余佝佈佚兌克免兵冶冷別判利刪刨劫助努劬匣即卵吝吭吞吾否呎吧呆呃吳呈呂君吩告吹吻吸吮吵吶吠吼呀吱含吟听囪困囤囫坊坑址坍����������������������������������均坎圾坐坏圻壯夾妝妒妨妞妣妙妖妍妤妓妊妥孝孜孚孛完宋宏尬局屁尿尾岐岑岔岌巫希序庇床廷弄弟彤形彷役忘忌志忍忱快忸忪戒我抄抗抖技扶抉扭把扼找批扳抒扯折扮投抓抑抆改攻攸旱更束李杏材村杜杖杞杉杆杠�".split("");
- 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];}
- D[168] = "����������������������������������������������������������������杓杗步每求汞沙沁沈沉沅沛汪決沐汰沌汨沖沒汽沃汲汾汴沆汶沍沔沘沂灶灼災灸牢牡牠狄狂玖甬甫男甸皂盯矣私秀禿究系罕肖肓肝肘肛肚育良芒����������������������������������芋芍見角言谷豆豕貝赤走足身車辛辰迂迆迅迄巡邑邢邪邦那酉釆里防阮阱阪阬並乖乳事些亞享京佯依侍佳使佬供例來侃佰併侈佩佻侖佾侏侑佺兔兒兕兩具其典冽函刻券刷刺到刮制剁劾劻卒協卓卑卦卷卸卹取叔受味呵�".split("");
- 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];}
- D[169] = "����������������������������������������������������������������咖呸咕咀呻呷咄咒咆呼咐呱呶和咚呢周咋命咎固垃坷坪坩坡坦坤坼夜奉奇奈奄奔妾妻委妹妮姑姆姐姍始姓姊妯妳姒姅孟孤季宗定官宜宙宛尚屈居����������������������������������屆岷岡岸岩岫岱岳帘帚帖帕帛帑幸庚店府底庖延弦弧弩往征彿彼忝忠忽念忿怏怔怯怵怖怪怕怡性怩怫怛或戕房戾所承拉拌拄抿拂抹拒招披拓拔拋拈抨抽押拐拙拇拍抵拚抱拘拖拗拆抬拎放斧於旺昔易昌昆昂明昀昏昕昊�".split("");
- 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];}
- D[170] = "����������������������������������������������������������������昇服朋杭枋枕東果杳杷枇枝林杯杰板枉松析杵枚枓杼杪杲欣武歧歿氓氛泣注泳沱泌泥河沽沾沼波沫法泓沸泄油況沮泗泅泱沿治泡泛泊沬泯泜泖泠����������������������������������炕炎炒炊炙爬爭爸版牧物狀狎狙狗狐玩玨玟玫玥甽疝疙疚的盂盲直知矽社祀祁秉秈空穹竺糾罔羌羋者肺肥肢肱股肫肩肴肪肯臥臾舍芳芝芙芭芽芟芹花芬芥芯芸芣芰芾芷虎虱初表軋迎返近邵邸邱邶采金長門阜陀阿阻附�".split("");
- 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];}
- D[171] = "����������������������������������������������������������������陂隹雨青非亟亭亮信侵侯便俠俑俏保促侶俘俟俊俗侮俐俄係俚俎俞侷兗冒冑冠剎剃削前剌剋則勇勉勃勁匍南卻厚叛咬哀咨哎哉咸咦咳哇哂咽咪品����������������������������������哄哈咯咫咱咻咩咧咿囿垂型垠垣垢城垮垓奕契奏奎奐姜姘姿姣姨娃姥姪姚姦威姻孩宣宦室客宥封屎屏屍屋峙峒巷帝帥帟幽庠度建弈弭彥很待徊律徇後徉怒思怠急怎怨恍恰恨恢恆恃恬恫恪恤扁拜挖按拼拭持拮拽指拱拷�".split("");
- 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];}
- D[172] = "����������������������������������������������������������������拯括拾拴挑挂政故斫施既春昭映昧是星昨昱昤曷柿染柱柔某柬架枯柵柩柯柄柑枴柚查枸柏柞柳枰柙柢柝柒歪殃殆段毒毗氟泉洋洲洪流津洌洱洞洗����������������������������������活洽派洶洛泵洹洧洸洩洮洵洎洫炫為炳炬炯炭炸炮炤爰牲牯牴狩狠狡玷珊玻玲珍珀玳甚甭畏界畎畋疫疤疥疢疣癸皆皇皈盈盆盃盅省盹相眉看盾盼眇矜砂研砌砍祆祉祈祇禹禺科秒秋穿突竿竽籽紂紅紀紉紇約紆缸美羿耄�".split("");
- 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];}
- D[173] = "����������������������������������������������������������������耐耍耑耶胖胥胚胃胄背胡胛胎胞胤胝致舢苧范茅苣苛苦茄若茂茉苒苗英茁苜苔苑苞苓苟苯茆虐虹虻虺衍衫要觔計訂訃貞負赴赳趴軍軌述迦迢迪迥����������������������������������迭迫迤迨郊郎郁郃酋酊重閂限陋陌降面革韋韭音頁風飛食首香乘亳倌倍倣俯倦倥俸倩倖倆值借倚倒們俺倀倔倨俱倡個候倘俳修倭倪俾倫倉兼冤冥冢凍凌准凋剖剜剔剛剝匪卿原厝叟哨唐唁唷哼哥哲唆哺唔哩哭員唉哮哪�".split("");
- 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];}
- D[174] = "����������������������������������������������������������������哦唧唇哽唏圃圄埂埔埋埃堉夏套奘奚娑娘娜娟娛娓姬娠娣娩娥娌娉孫屘宰害家宴宮宵容宸射屑展屐峭峽峻峪峨峰島崁峴差席師庫庭座弱徒徑徐恙����������������������������������恣恥恐恕恭恩息悄悟悚悍悔悌悅悖扇拳挈拿捎挾振捕捂捆捏捉挺捐挽挪挫挨捍捌效敉料旁旅時晉晏晃晒晌晅晁書朔朕朗校核案框桓根桂桔栩梳栗桌桑栽柴桐桀格桃株桅栓栘桁殊殉殷氣氧氨氦氤泰浪涕消涇浦浸海浙涓�".split("");
- 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];}
- D[175] = "����������������������������������������������������������������浬涉浮浚浴浩涌涊浹涅浥涔烊烘烤烙烈烏爹特狼狹狽狸狷玆班琉珮珠珪珞畔畝畜畚留疾病症疲疳疽疼疹痂疸皋皰益盍盎眩真眠眨矩砰砧砸砝破砷����������������������������������砥砭砠砟砲祕祐祠祟祖神祝祗祚秤秣秧租秦秩秘窄窈站笆笑粉紡紗紋紊素索純紐紕級紜納紙紛缺罟羔翅翁耆耘耕耙耗耽耿胱脂胰脅胭胴脆胸胳脈能脊胼胯臭臬舀舐航舫舨般芻茫荒荔荊茸荐草茵茴荏茲茹茶茗荀茱茨荃�".split("");
- 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];}
- D[176] = "����������������������������������������������������������������虔蚊蚪蚓蚤蚩蚌蚣蚜衰衷袁袂衽衹記訐討訌訕訊託訓訖訏訑豈豺豹財貢起躬軒軔軏辱送逆迷退迺迴逃追逅迸邕郡郝郢酒配酌釘針釗釜釙閃院陣陡����������������������������������陛陝除陘陞隻飢馬骨高鬥鬲鬼乾偺偽停假偃偌做偉健偶偎偕偵側偷偏倏偯偭兜冕凰剪副勒務勘動匐匏匙匿區匾參曼商啪啦啄啞啡啃啊唱啖問啕唯啤唸售啜唬啣唳啁啗圈國圉域堅堊堆埠埤基堂堵執培夠奢娶婁婉婦婪婀�".split("");
- 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];}
- D[177] = "����������������������������������������������������������������娼婢婚婆婊孰寇寅寄寂宿密尉專將屠屜屝崇崆崎崛崖崢崑崩崔崙崤崧崗巢常帶帳帷康庸庶庵庾張強彗彬彩彫得徙從徘御徠徜恿患悉悠您惋悴惦悽����������������������������������情悻悵惜悼惘惕惆惟悸惚惇戚戛扈掠控捲掖探接捷捧掘措捱掩掉掃掛捫推掄授掙採掬排掏掀捻捩捨捺敝敖救教敗啟敏敘敕敔斜斛斬族旋旌旎晝晚晤晨晦晞曹勗望梁梯梢梓梵桿桶梱梧梗械梃棄梭梆梅梔條梨梟梡梂欲殺�".split("");
- 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];}
- D[178] = "����������������������������������������������������������������毫毬氫涎涼淳淙液淡淌淤添淺清淇淋涯淑涮淞淹涸混淵淅淒渚涵淚淫淘淪深淮淨淆淄涪淬涿淦烹焉焊烽烯爽牽犁猜猛猖猓猙率琅琊球理現琍瓠瓶����������������������������������瓷甜產略畦畢異疏痔痕疵痊痍皎盔盒盛眷眾眼眶眸眺硫硃硎祥票祭移窒窕笠笨笛第符笙笞笮粒粗粕絆絃統紮紹紼絀細紳組累終紲紱缽羞羚翌翎習耜聊聆脯脖脣脫脩脰脤舂舵舷舶船莎莞莘荸莢莖莽莫莒莊莓莉莠荷荻荼�".split("");
- 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];}
- D[179] = "����������������������������������������������������������������莆莧處彪蛇蛀蚶蛄蚵蛆蛋蚱蚯蛉術袞袈被袒袖袍袋覓規訪訝訣訥許設訟訛訢豉豚販責貫貨貪貧赧赦趾趺軛軟這逍通逗連速逝逐逕逞造透逢逖逛途����������������������������������部郭都酗野釵釦釣釧釭釩閉陪陵陳陸陰陴陶陷陬雀雪雩章竟頂頃魚鳥鹵鹿麥麻傢傍傅備傑傀傖傘傚最凱割剴創剩勞勝勛博厥啻喀喧啼喊喝喘喂喜喪喔喇喋喃喳單喟唾喲喚喻喬喱啾喉喫喙圍堯堪場堤堰報堡堝堠壹壺奠�".split("");
- 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];}
- D[180] = "����������������������������������������������������������������婷媚婿媒媛媧孳孱寒富寓寐尊尋就嵌嵐崴嵇巽幅帽幀幃幾廊廁廂廄弼彭復循徨惑惡悲悶惠愜愣惺愕惰惻惴慨惱愎惶愉愀愒戟扉掣掌描揀揩揉揆揍����������������������������������插揣提握揖揭揮捶援揪換摒揚揹敞敦敢散斑斐斯普晰晴晶景暑智晾晷曾替期朝棺棕棠棘棗椅棟棵森棧棹棒棲棣棋棍植椒椎棉棚楮棻款欺欽殘殖殼毯氮氯氬港游湔渡渲湧湊渠渥渣減湛湘渤湖湮渭渦湯渴湍渺測湃渝渾滋�".split("");
- 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];}
- D[181] = "����������������������������������������������������������������溉渙湎湣湄湲湩湟焙焚焦焰無然煮焜牌犄犀猶猥猴猩琺琪琳琢琥琵琶琴琯琛琦琨甥甦畫番痢痛痣痙痘痞痠登發皖皓皴盜睏短硝硬硯稍稈程稅稀窘����������������������������������窗窖童竣等策筆筐筒答筍筋筏筑粟粥絞結絨絕紫絮絲絡給絢絰絳善翔翕耋聒肅腕腔腋腑腎脹腆脾腌腓腴舒舜菩萃菸萍菠菅萋菁華菱菴著萊菰萌菌菽菲菊萸萎萄菜萇菔菟虛蛟蛙蛭蛔蛛蛤蛐蛞街裁裂袱覃視註詠評詞証詁�".split("");
- 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];}
- D[182] = "����������������������������������������������������������������詔詛詐詆訴診訶詖象貂貯貼貳貽賁費賀貴買貶貿貸越超趁跎距跋跚跑跌跛跆軻軸軼辜逮逵週逸進逶鄂郵鄉郾酣酥量鈔鈕鈣鈉鈞鈍鈐鈇鈑閔閏開閑����������������������������������間閒閎隊階隋陽隅隆隍陲隄雁雅雄集雇雯雲韌項順須飧飪飯飩飲飭馮馭黃黍黑亂傭債傲傳僅傾催傷傻傯僇剿剷剽募勦勤勢勣匯嗟嗨嗓嗦嗎嗜嗇嗑嗣嗤嗯嗚嗡嗅嗆嗥嗉園圓塞塑塘塗塚塔填塌塭塊塢塒塋奧嫁嫉嫌媾媽媼�".split("");
- 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];}
- D[183] = "����������������������������������������������������������������媳嫂媲嵩嵯幌幹廉廈弒彙徬微愚意慈感想愛惹愁愈慎慌慄慍愾愴愧愍愆愷戡戢搓搾搞搪搭搽搬搏搜搔損搶搖搗搆敬斟新暗暉暇暈暖暄暘暍會榔業����������������������������������楚楷楠楔極椰概楊楨楫楞楓楹榆楝楣楛歇歲毀殿毓毽溢溯滓溶滂源溝滇滅溥溘溼溺溫滑準溜滄滔溪溧溴煎煙煩煤煉照煜煬煦煌煥煞煆煨煖爺牒猷獅猿猾瑯瑚瑕瑟瑞瑁琿瑙瑛瑜當畸瘀痰瘁痲痱痺痿痴痳盞盟睛睫睦睞督�".split("");
- 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];}
- D[184] = "����������������������������������������������������������������睹睪睬睜睥睨睢矮碎碰碗碘碌碉硼碑碓硿祺祿禁萬禽稜稚稠稔稟稞窟窠筷節筠筮筧粱粳粵經絹綑綁綏絛置罩罪署義羨群聖聘肆肄腱腰腸腥腮腳腫����������������������������������腹腺腦舅艇蒂葷落萱葵葦葫葉葬葛萼萵葡董葩葭葆虞虜號蛹蜓蜈蜇蜀蛾蛻蜂蜃蜆蜊衙裟裔裙補裘裝裡裊裕裒覜解詫該詳試詩詰誇詼詣誠話誅詭詢詮詬詹詻訾詨豢貊貉賊資賈賄貲賃賂賅跡跟跨路跳跺跪跤跦躲較載軾輊�".split("");
- 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];}
- D[185] = "����������������������������������������������������������������辟農運遊道遂達逼違遐遇遏過遍遑逾遁鄒鄗酬酪酩釉鈷鉗鈸鈽鉀鈾鉛鉋鉤鉑鈴鉉鉍鉅鈹鈿鉚閘隘隔隕雍雋雉雊雷電雹零靖靴靶預頑頓頊頒頌飼飴����������������������������������飽飾馳馱馴髡鳩麂鼎鼓鼠僧僮僥僖僭僚僕像僑僱僎僩兢凳劃劂匱厭嗾嘀嘛嘗嗽嘔嘆嘉嘍嘎嗷嘖嘟嘈嘐嗶團圖塵塾境墓墊塹墅塽壽夥夢夤奪奩嫡嫦嫩嫗嫖嫘嫣孵寞寧寡寥實寨寢寤察對屢嶄嶇幛幣幕幗幔廓廖弊彆彰徹慇�".split("");
- 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];}
- D[186] = "����������������������������������������������������������������愿態慷慢慣慟慚慘慵截撇摘摔撤摸摟摺摑摧搴摭摻敲斡旗旖暢暨暝榜榨榕槁榮槓構榛榷榻榫榴槐槍榭槌榦槃榣歉歌氳漳演滾漓滴漩漾漠漬漏漂漢����������������������������������滿滯漆漱漸漲漣漕漫漯澈漪滬漁滲滌滷熔熙煽熊熄熒爾犒犖獄獐瑤瑣瑪瑰瑭甄疑瘧瘍瘋瘉瘓盡監瞄睽睿睡磁碟碧碳碩碣禎福禍種稱窪窩竭端管箕箋筵算箝箔箏箸箇箄粹粽精綻綰綜綽綾綠緊綴網綱綺綢綿綵綸維緒緇綬�".split("");
- 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];}
- D[187] = "����������������������������������������������������������������罰翠翡翟聞聚肇腐膀膏膈膊腿膂臧臺與舔舞艋蓉蒿蓆蓄蒙蒞蒲蒜蓋蒸蓀蓓蒐蒼蓑蓊蜿蜜蜻蜢蜥蜴蜘蝕蜷蜩裳褂裴裹裸製裨褚裯誦誌語誣認誡誓誤����������������������������������說誥誨誘誑誚誧豪貍貌賓賑賒赫趙趕跼輔輒輕輓辣遠遘遜遣遙遞遢遝遛鄙鄘鄞酵酸酷酴鉸銀銅銘銖鉻銓銜銨鉼銑閡閨閩閣閥閤隙障際雌雒需靼鞅韶頗領颯颱餃餅餌餉駁骯骰髦魁魂鳴鳶鳳麼鼻齊億儀僻僵價儂儈儉儅凜�".split("");
- 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];}
- D[188] = "����������������������������������������������������������������劇劈劉劍劊勰厲嘮嘻嘹嘲嘿嘴嘩噓噎噗噴嘶嘯嘰墀墟增墳墜墮墩墦奭嬉嫻嬋嫵嬌嬈寮寬審寫層履嶝嶔幢幟幡廢廚廟廝廣廠彈影德徵慶慧慮慝慕憂����������������������������������慼慰慫慾憧憐憫憎憬憚憤憔憮戮摩摯摹撞撲撈撐撰撥撓撕撩撒撮播撫撚撬撙撢撳敵敷數暮暫暴暱樣樟槨樁樞標槽模樓樊槳樂樅槭樑歐歎殤毅毆漿潼澄潑潦潔澆潭潛潸潮澎潺潰潤澗潘滕潯潠潟熟熬熱熨牖犛獎獗瑩璋璃�".split("");
- 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];}
- D[189] = "����������������������������������������������������������������瑾璀畿瘠瘩瘟瘤瘦瘡瘢皚皺盤瞎瞇瞌瞑瞋磋磅確磊碾磕碼磐稿稼穀稽稷稻窯窮箭箱範箴篆篇篁箠篌糊締練緯緻緘緬緝編緣線緞緩綞緙緲緹罵罷羯����������������������������������翩耦膛膜膝膠膚膘蔗蔽蔚蓮蔬蔭蔓蔑蔣蔡蔔蓬蔥蓿蔆螂蝴蝶蝠蝦蝸蝨蝙蝗蝌蝓衛衝褐複褒褓褕褊誼諒談諄誕請諸課諉諂調誰論諍誶誹諛豌豎豬賠賞賦賤賬賭賢賣賜質賡赭趟趣踫踐踝踢踏踩踟踡踞躺輝輛輟輩輦輪輜輞�".split("");
- 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];}
- D[190] = "����������������������������������������������������������������輥適遮遨遭遷鄰鄭鄧鄱醇醉醋醃鋅銻銷鋪銬鋤鋁銳銼鋒鋇鋰銲閭閱霄霆震霉靠鞍鞋鞏頡頫頜颳養餓餒餘駝駐駟駛駑駕駒駙骷髮髯鬧魅魄魷魯鴆鴉����������������������������������鴃麩麾黎墨齒儒儘儔儐儕冀冪凝劑劓勳噙噫噹噩噤噸噪器噥噱噯噬噢噶壁墾壇壅奮嬝嬴學寰導彊憲憑憩憊懍憶憾懊懈戰擅擁擋撻撼據擄擇擂操撿擒擔撾整曆曉暹曄曇暸樽樸樺橙橫橘樹橄橢橡橋橇樵機橈歙歷氅濂澱澡�".split("");
- 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];}
- D[191] = "����������������������������������������������������������������濃澤濁澧澳激澹澶澦澠澴熾燉燐燒燈燕熹燎燙燜燃燄獨璜璣璘璟璞瓢甌甍瘴瘸瘺盧盥瞠瞞瞟瞥磨磚磬磧禦積穎穆穌穋窺篙簑築篤篛篡篩篦糕糖縊����������������������������������縑縈縛縣縞縝縉縐罹羲翰翱翮耨膳膩膨臻興艘艙蕊蕙蕈蕨蕩蕃蕉蕭蕪蕞螃螟螞螢融衡褪褲褥褫褡親覦諦諺諫諱謀諜諧諮諾謁謂諷諭諳諶諼豫豭貓賴蹄踱踴蹂踹踵輻輯輸輳辨辦遵遴選遲遼遺鄴醒錠錶鋸錳錯錢鋼錫錄錚�".split("");
- 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];}
- D[192] = "����������������������������������������������������������������錐錦錡錕錮錙閻隧隨險雕霎霑霖霍霓霏靛靜靦鞘頰頸頻頷頭頹頤餐館餞餛餡餚駭駢駱骸骼髻髭鬨鮑鴕鴣鴦鴨鴒鴛默黔龍龜優償儡儲勵嚎嚀嚐嚅嚇����������������������������������嚏壕壓壑壎嬰嬪嬤孺尷屨嶼嶺嶽嶸幫彌徽應懂懇懦懋戲戴擎擊擘擠擰擦擬擱擢擭斂斃曙曖檀檔檄檢檜櫛檣橾檗檐檠歜殮毚氈濘濱濟濠濛濤濫濯澀濬濡濩濕濮濰燧營燮燦燥燭燬燴燠爵牆獰獲璩環璦璨癆療癌盪瞳瞪瞰瞬�".split("");
- 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];}
- D[193] = "����������������������������������������������������������������瞧瞭矯磷磺磴磯礁禧禪穗窿簇簍篾篷簌篠糠糜糞糢糟糙糝縮績繆縷縲繃縫總縱繅繁縴縹繈縵縿縯罄翳翼聱聲聰聯聳臆臃膺臂臀膿膽臉膾臨舉艱薪����������������������������������薄蕾薜薑薔薯薛薇薨薊虧蟀蟑螳蟒蟆螫螻螺蟈蟋褻褶襄褸褽覬謎謗謙講謊謠謝謄謐豁谿豳賺賽購賸賻趨蹉蹋蹈蹊轄輾轂轅輿避遽還邁邂邀鄹醣醞醜鍍鎂錨鍵鍊鍥鍋錘鍾鍬鍛鍰鍚鍔闊闋闌闈闆隱隸雖霜霞鞠韓顆颶餵騁�".split("");
- 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];}
- D[194] = "����������������������������������������������������������������駿鮮鮫鮪鮭鴻鴿麋黏點黜黝黛鼾齋叢嚕嚮壙壘嬸彝懣戳擴擲擾攆擺擻擷斷曜朦檳檬櫃檻檸櫂檮檯歟歸殯瀉瀋濾瀆濺瀑瀏燻燼燾燸獷獵璧璿甕癖癘����������������������������������癒瞽瞿瞻瞼礎禮穡穢穠竄竅簫簧簪簞簣簡糧織繕繞繚繡繒繙罈翹翻職聶臍臏舊藏薩藍藐藉薰薺薹薦蟯蟬蟲蟠覆覲觴謨謹謬謫豐贅蹙蹣蹦蹤蹟蹕軀轉轍邇邃邈醫醬釐鎔鎊鎖鎢鎳鎮鎬鎰鎘鎚鎗闔闖闐闕離雜雙雛雞霤鞣鞦�".split("");
- 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];}
- D[195] = "����������������������������������������������������������������鞭韹額顏題顎顓颺餾餿餽餮馥騎髁鬃鬆魏魎魍鯊鯉鯽鯈鯀鵑鵝鵠黠鼕鼬儳嚥壞壟壢寵龐廬懲懷懶懵攀攏曠曝櫥櫝櫚櫓瀛瀟瀨瀚瀝瀕瀘爆爍牘犢獸����������������������������������獺璽瓊瓣疇疆癟癡矇礙禱穫穩簾簿簸簽簷籀繫繭繹繩繪羅繳羶羹羸臘藩藝藪藕藤藥藷蟻蠅蠍蟹蟾襠襟襖襞譁譜識證譚譎譏譆譙贈贊蹼蹲躇蹶蹬蹺蹴轔轎辭邊邋醱醮鏡鏑鏟鏃鏈鏜鏝鏖鏢鏍鏘鏤鏗鏨關隴難霪霧靡韜韻類�".split("");
- 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];}
- D[196] = "����������������������������������������������������������������願顛颼饅饉騖騙鬍鯨鯧鯖鯛鶉鵡鵲鵪鵬麒麗麓麴勸嚨嚷嚶嚴嚼壤孀孃孽寶巉懸懺攘攔攙曦朧櫬瀾瀰瀲爐獻瓏癢癥礦礪礬礫竇競籌籃籍糯糰辮繽繼����������������������������������纂罌耀臚艦藻藹蘑藺蘆蘋蘇蘊蠔蠕襤覺觸議譬警譯譟譫贏贍躉躁躅躂醴釋鐘鐃鏽闡霰飄饒饑馨騫騰騷騵鰓鰍鹹麵黨鼯齟齣齡儷儸囁囀囂夔屬巍懼懾攝攜斕曩櫻欄櫺殲灌爛犧瓖瓔癩矓籐纏續羼蘗蘭蘚蠣蠢蠡蠟襪襬覽譴�".split("");
- 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];}
- D[197] = "����������������������������������������������������������������護譽贓躊躍躋轟辯醺鐮鐳鐵鐺鐸鐲鐫闢霸霹露響顧顥饗驅驃驀騾髏魔魑鰭鰥鶯鶴鷂鶸麝黯鼙齜齦齧儼儻囈囊囉孿巔巒彎懿攤權歡灑灘玀瓤疊癮癬����������������������������������禳籠籟聾聽臟襲襯觼讀贖贗躑躓轡酈鑄鑑鑒霽霾韃韁顫饕驕驍髒鬚鱉鰱鰾鰻鷓鷗鼴齬齪龔囌巖戀攣攫攪曬欐瓚竊籤籣籥纓纖纔臢蘸蘿蠱變邐邏鑣鑠鑤靨顯饜驚驛驗髓體髑鱔鱗鱖鷥麟黴囑壩攬灞癱癲矗罐羈蠶蠹衢讓讒�".split("");
- 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];}
- D[198] = "����������������������������������������������������������������讖艷贛釀鑪靂靈靄韆顰驟鬢魘鱟鷹鷺鹼鹽鼇齷齲廳欖灣籬籮蠻觀躡釁鑲鑰顱饞髖鬣黌灤矚讚鑷韉驢驥纜讜躪釅鑽鑾鑼鱷鱸黷豔鑿鸚爨驪鬱鸛鸞籲���������������������������������������������������������������������������������������������������������������������������������".split("");
- 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];}
- D[201] = "����������������������������������������������������������������乂乜凵匚厂万丌乇亍囗兀屮彳丏冇与丮亓仂仉仈冘勼卬厹圠夃夬尐巿旡殳毌气爿丱丼仨仜仩仡仝仚刌匜卌圢圣夗夯宁宄尒尻屴屳帄庀庂忉戉扐氕����������������������������������氶汃氿氻犮犰玊禸肊阞伎优伬仵伔仱伀价伈伝伂伅伢伓伄仴伒冱刓刉刐劦匢匟卍厊吇囡囟圮圪圴夼妀奼妅奻奾奷奿孖尕尥屼屺屻屾巟幵庄异弚彴忕忔忏扜扞扤扡扦扢扙扠扚扥旯旮朾朹朸朻机朿朼朳氘汆汒汜汏汊汔汋�".split("");
- 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];}
- D[202] = "����������������������������������������������������������������汌灱牞犴犵玎甪癿穵网艸艼芀艽艿虍襾邙邗邘邛邔阢阤阠阣佖伻佢佉体佤伾佧佒佟佁佘伭伳伿佡冏冹刜刞刡劭劮匉卣卲厎厏吰吷吪呔呅吙吜吥吘����������������������������������吽呏呁吨吤呇囮囧囥坁坅坌坉坋坒夆奀妦妘妠妗妎妢妐妏妧妡宎宒尨尪岍岏岈岋岉岒岊岆岓岕巠帊帎庋庉庌庈庍弅弝彸彶忒忑忐忭忨忮忳忡忤忣忺忯忷忻怀忴戺抃抌抎抏抔抇扱扻扺扰抁抈扷扽扲扴攷旰旴旳旲旵杅杇�".split("");
- 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];}
- D[203] = "����������������������������������������������������������������杙杕杌杈杝杍杚杋毐氙氚汸汧汫沄沋沏汱汯汩沚汭沇沕沜汦汳汥汻沎灴灺牣犿犽狃狆狁犺狅玕玗玓玔玒町甹疔疕皁礽耴肕肙肐肒肜芐芏芅芎芑芓����������������������������������芊芃芄豸迉辿邟邡邥邞邧邠阰阨阯阭丳侘佼侅佽侀侇佶佴侉侄佷佌侗佪侚佹侁佸侐侜侔侞侒侂侕佫佮冞冼冾刵刲刳剆刱劼匊匋匼厒厔咇呿咁咑咂咈呫呺呾呥呬呴呦咍呯呡呠咘呣呧呤囷囹坯坲坭坫坱坰坶垀坵坻坳坴坢�".split("");
- 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];}
- D[204] = "����������������������������������������������������������������坨坽夌奅妵妺姏姎妲姌姁妶妼姃姖妱妽姀姈妴姇孢孥宓宕屄屇岮岤岠岵岯岨岬岟岣岭岢岪岧岝岥岶岰岦帗帔帙弨弢弣弤彔徂彾彽忞忥怭怦怙怲怋����������������������������������怴怊怗怳怚怞怬怢怍怐怮怓怑怌怉怜戔戽抭抴拑抾抪抶拊抮抳抯抻抩抰抸攽斨斻昉旼昄昒昈旻昃昋昍昅旽昑昐曶朊枅杬枎枒杶杻枘枆构杴枍枌杺枟枑枙枃杽极杸杹枔欥殀歾毞氝沓泬泫泮泙沶泔沭泧沷泐泂沺泃泆泭泲�".split("");
- 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];}
- D[205] = "����������������������������������������������������������������泒泝沴沊沝沀泞泀洰泍泇沰泹泏泩泑炔炘炅炓炆炄炑炖炂炚炃牪狖狋狘狉狜狒狔狚狌狑玤玡玭玦玢玠玬玝瓝瓨甿畀甾疌疘皯盳盱盰盵矸矼矹矻矺����������������������������������矷祂礿秅穸穻竻籵糽耵肏肮肣肸肵肭舠芠苀芫芚芘芛芵芧芮芼芞芺芴芨芡芩苂芤苃芶芢虰虯虭虮豖迒迋迓迍迖迕迗邲邴邯邳邰阹阽阼阺陃俍俅俓侲俉俋俁俔俜俙侻侳俛俇俖侺俀侹俬剄剉勀勂匽卼厗厖厙厘咺咡咭咥哏�".split("");
- 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];}
- D[206] = "����������������������������������������������������������������哃茍咷咮哖咶哅哆咠呰咼咢咾呲哞咰垵垞垟垤垌垗垝垛垔垘垏垙垥垚垕壴复奓姡姞姮娀姱姝姺姽姼姶姤姲姷姛姩姳姵姠姾姴姭宨屌峐峘峌峗峋峛����������������������������������峞峚峉峇峊峖峓峔峏峈峆峎峟峸巹帡帢帣帠帤庰庤庢庛庣庥弇弮彖徆怷怹恔恲恞恅恓恇恉恛恌恀恂恟怤恄恘恦恮扂扃拏挍挋拵挎挃拫拹挏挌拸拶挀挓挔拺挕拻拰敁敃斪斿昶昡昲昵昜昦昢昳昫昺昝昴昹昮朏朐柁柲柈枺�".split("");
- 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];}
- D[207] = "����������������������������������������������������������������柜枻柸柘柀枷柅柫柤柟枵柍枳柷柶柮柣柂枹柎柧柰枲柼柆柭柌枮柦柛柺柉柊柃柪柋欨殂殄殶毖毘毠氠氡洨洴洭洟洼洿洒洊泚洳洄洙洺洚洑洀洝浂����������������������������������洁洘洷洃洏浀洇洠洬洈洢洉洐炷炟炾炱炰炡炴炵炩牁牉牊牬牰牳牮狊狤狨狫狟狪狦狣玅珌珂珈珅玹玶玵玴珫玿珇玾珃珆玸珋瓬瓮甮畇畈疧疪癹盄眈眃眄眅眊盷盻盺矧矨砆砑砒砅砐砏砎砉砃砓祊祌祋祅祄秕种秏秖秎窀�".split("");
- 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];}
- D[208] = "����������������������������������������������������������������穾竑笀笁籺籸籹籿粀粁紃紈紁罘羑羍羾耇耎耏耔耷胘胇胠胑胈胂胐胅胣胙胜胊胕胉胏胗胦胍臿舡芔苙苾苹茇苨茀苕茺苫苖苴苬苡苲苵茌苻苶苰苪����������������������������������苤苠苺苳苭虷虴虼虳衁衎衧衪衩觓訄訇赲迣迡迮迠郱邽邿郕郅邾郇郋郈釔釓陔陏陑陓陊陎倞倅倇倓倢倰倛俵俴倳倷倬俶俷倗倜倠倧倵倯倱倎党冔冓凊凄凅凈凎剡剚剒剞剟剕剢勍匎厞唦哢唗唒哧哳哤唚哿唄唈哫唑唅哱�".split("");
- 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];}
- D[209] = "����������������������������������������������������������������唊哻哷哸哠唎唃唋圁圂埌堲埕埒垺埆垽垼垸垶垿埇埐垹埁夎奊娙娖娭娮娕娏娗娊娞娳孬宧宭宬尃屖屔峬峿峮峱峷崀峹帩帨庨庮庪庬弳弰彧恝恚恧����������������������������������恁悢悈悀悒悁悝悃悕悛悗悇悜悎戙扆拲挐捖挬捄捅挶捃揤挹捋捊挼挩捁挴捘捔捙挭捇挳捚捑挸捗捀捈敊敆旆旃旄旂晊晟晇晑朒朓栟栚桉栲栳栻桋桏栖栱栜栵栫栭栯桎桄栴栝栒栔栦栨栮桍栺栥栠欬欯欭欱欴歭肂殈毦毤�".split("");
- 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];}
- D[210] = "����������������������������������������������������������������毨毣毢毧氥浺浣浤浶洍浡涒浘浢浭浯涑涍淯浿涆浞浧浠涗浰浼浟涂涘洯浨涋浾涀涄洖涃浻浽浵涐烜烓烑烝烋缹烢烗烒烞烠烔烍烅烆烇烚烎烡牂牸����������������������������������牷牶猀狺狴狾狶狳狻猁珓珙珥珖玼珧珣珩珜珒珛珔珝珚珗珘珨瓞瓟瓴瓵甡畛畟疰痁疻痄痀疿疶疺皊盉眝眛眐眓眒眣眑眕眙眚眢眧砣砬砢砵砯砨砮砫砡砩砳砪砱祔祛祏祜祓祒祑秫秬秠秮秭秪秜秞秝窆窉窅窋窌窊窇竘笐�".split("");
- 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];}
- D[211] = "����������������������������������������������������������������笄笓笅笏笈笊笎笉笒粄粑粊粌粈粍粅紞紝紑紎紘紖紓紟紒紏紌罜罡罞罠罝罛羖羒翃翂翀耖耾耹胺胲胹胵脁胻脀舁舯舥茳茭荄茙荑茥荖茿荁茦茜茢����������������������������������荂荎茛茪茈茼荍茖茤茠茷茯茩荇荅荌荓茞茬荋茧荈虓虒蚢蚨蚖蚍蚑蚞蚇蚗蚆蚋蚚蚅蚥蚙蚡蚧蚕蚘蚎蚝蚐蚔衃衄衭衵衶衲袀衱衿衯袃衾衴衼訒豇豗豻貤貣赶赸趵趷趶軑軓迾迵适迿迻逄迼迶郖郠郙郚郣郟郥郘郛郗郜郤酐�".split("");
- 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];}
- D[212] = "����������������������������������������������������������������酎酏釕釢釚陜陟隼飣髟鬯乿偰偪偡偞偠偓偋偝偲偈偍偁偛偊偢倕偅偟偩偫偣偤偆偀偮偳偗偑凐剫剭剬剮勖勓匭厜啵啶唼啍啐唴唪啑啢唶唵唰啒啅����������������������������������唌唲啥啎唹啈唭唻啀啋圊圇埻堔埢埶埜埴堀埭埽堈埸堋埳埏堇埮埣埲埥埬埡堎埼堐埧堁堌埱埩埰堍堄奜婠婘婕婧婞娸娵婭婐婟婥婬婓婤婗婃婝婒婄婛婈媎娾婍娹婌婰婩婇婑婖婂婜孲孮寁寀屙崞崋崝崚崠崌崨崍崦崥崏�".split("");
- 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];}
- D[213] = "����������������������������������������������������������������崰崒崣崟崮帾帴庱庴庹庲庳弶弸徛徖徟悊悐悆悾悰悺惓惔惏惤惙惝惈悱惛悷惊悿惃惍惀挲捥掊掂捽掽掞掭掝掗掫掎捯掇掐据掯捵掜捭掮捼掤挻掟����������������������������������捸掅掁掑掍捰敓旍晥晡晛晙晜晢朘桹梇梐梜桭桮梮梫楖桯梣梬梩桵桴梲梏桷梒桼桫桲梪梀桱桾梛梖梋梠梉梤桸桻梑梌梊桽欶欳欷欸殑殏殍殎殌氪淀涫涴涳湴涬淩淢涷淶淔渀淈淠淟淖涾淥淜淝淛淴淊涽淭淰涺淕淂淏淉�".split("");
- 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];}
- D[214] = "����������������������������������������������������������������淐淲淓淽淗淍淣涻烺焍烷焗烴焌烰焄烳焐烼烿焆焓焀烸烶焋焂焎牾牻牼牿猝猗猇猑猘猊猈狿猏猞玈珶珸珵琄琁珽琇琀珺珼珿琌琋珴琈畤畣痎痒痏����������������������������������痋痌痑痐皏皉盓眹眯眭眱眲眴眳眽眥眻眵硈硒硉硍硊硌砦硅硐祤祧祩祪祣祫祡离秺秸秶秷窏窔窐笵筇笴笥笰笢笤笳笘笪笝笱笫笭笯笲笸笚笣粔粘粖粣紵紽紸紶紺絅紬紩絁絇紾紿絊紻紨罣羕羜羝羛翊翋翍翐翑翇翏翉耟�".split("");
- 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];}
- D[215] = "����������������������������������������������������������������耞耛聇聃聈脘脥脙脛脭脟脬脞脡脕脧脝脢舑舸舳舺舴舲艴莐莣莨莍荺荳莤荴莏莁莕莙荵莔莩荽莃莌莝莛莪莋荾莥莯莈莗莰荿莦莇莮荶莚虙虖蚿蚷����������������������������������蛂蛁蛅蚺蚰蛈蚹蚳蚸蛌蚴蚻蚼蛃蚽蚾衒袉袕袨袢袪袚袑袡袟袘袧袙袛袗袤袬袌袓袎覂觖觙觕訰訧訬訞谹谻豜豝豽貥赽赻赹趼跂趹趿跁軘軞軝軜軗軠軡逤逋逑逜逌逡郯郪郰郴郲郳郔郫郬郩酖酘酚酓酕釬釴釱釳釸釤釹釪�".split("");
- 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];}
- D[216] = "����������������������������������������������������������������釫釷釨釮镺閆閈陼陭陫陱陯隿靪頄飥馗傛傕傔傞傋傣傃傌傎傝偨傜傒傂傇兟凔匒匑厤厧喑喨喥喭啷噅喢喓喈喏喵喁喣喒喤啽喌喦啿喕喡喎圌堩堷����������������������������������堙堞堧堣堨埵塈堥堜堛堳堿堶堮堹堸堭堬堻奡媯媔媟婺媢媞婸媦婼媥媬媕媮娷媄媊媗媃媋媩婻婽媌媜媏媓媝寪寍寋寔寑寊寎尌尰崷嵃嵫嵁嵋崿崵嵑嵎嵕崳崺嵒崽崱嵙嵂崹嵉崸崼崲崶嵀嵅幄幁彘徦徥徫惉悹惌惢惎惄愔�".split("");
- 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];}
- D[217] = "����������������������������������������������������������������惲愊愖愅惵愓惸惼惾惁愃愘愝愐惿愄愋扊掔掱掰揎揥揨揯揃撝揳揊揠揶揕揲揵摡揟掾揝揜揄揘揓揂揇揌揋揈揰揗揙攲敧敪敤敜敨敥斌斝斞斮旐旒����������������������������������晼晬晻暀晱晹晪晲朁椌棓椄棜椪棬棪棱椏棖棷棫棤棶椓椐棳棡椇棌椈楰梴椑棯棆椔棸棐棽棼棨椋椊椗棎棈棝棞棦棴棑椆棔棩椕椥棇欹欻欿欼殔殗殙殕殽毰毲毳氰淼湆湇渟湉溈渼渽湅湢渫渿湁湝湳渜渳湋湀湑渻渃渮湞�".split("");
- 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];}
- D[218] = "����������������������������������������������������������������湨湜湡渱渨湠湱湫渹渢渰湓湥渧湸湤湷湕湹湒湦渵渶湚焠焞焯烻焮焱焣焥焢焲焟焨焺焛牋牚犈犉犆犅犋猒猋猰猢猱猳猧猲猭猦猣猵猌琮琬琰琫琖����������������������������������琚琡琭琱琤琣琝琩琠琲瓻甯畯畬痧痚痡痦痝痟痤痗皕皒盚睆睇睄睍睅睊睎睋睌矞矬硠硤硥硜硭硱硪确硰硩硨硞硢祴祳祲祰稂稊稃稌稄窙竦竤筊笻筄筈筌筎筀筘筅粢粞粨粡絘絯絣絓絖絧絪絏絭絜絫絒絔絩絑絟絎缾缿罥�".split("");
- 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];}
- D[219] = "����������������������������������������������������������������罦羢羠羡翗聑聏聐胾胔腃腊腒腏腇脽腍脺臦臮臷臸臹舄舼舽舿艵茻菏菹萣菀菨萒菧菤菼菶萐菆菈菫菣莿萁菝菥菘菿菡菋菎菖菵菉萉萏菞萑萆菂菳����������������������������������菕菺菇菑菪萓菃菬菮菄菻菗菢萛菛菾蛘蛢蛦蛓蛣蛚蛪蛝蛫蛜蛬蛩蛗蛨蛑衈衖衕袺裗袹袸裀袾袶袼袷袽袲褁裉覕覘覗觝觚觛詎詍訹詙詀詗詘詄詅詒詈詑詊詌詏豟貁貀貺貾貰貹貵趄趀趉跘跓跍跇跖跜跏跕跙跈跗跅軯軷軺�".split("");
- 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];}
- D[220] = "����������������������������������������������������������������軹軦軮軥軵軧軨軶軫軱軬軴軩逭逴逯鄆鄬鄄郿郼鄈郹郻鄁鄀鄇鄅鄃酡酤酟酢酠鈁鈊鈥鈃鈚鈦鈏鈌鈀鈒釿釽鈆鈄鈧鈂鈜鈤鈙鈗鈅鈖镻閍閌閐隇陾隈����������������������������������隉隃隀雂雈雃雱雰靬靰靮頇颩飫鳦黹亃亄亶傽傿僆傮僄僊傴僈僂傰僁傺傱僋僉傶傸凗剺剸剻剼嗃嗛嗌嗐嗋嗊嗝嗀嗔嗄嗩喿嗒喍嗏嗕嗢嗖嗈嗲嗍嗙嗂圔塓塨塤塏塍塉塯塕塎塝塙塥塛堽塣塱壼嫇嫄嫋媺媸媱媵媰媿嫈媻嫆�".split("");
- 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];}
- D[221] = "����������������������������������������������������������������媷嫀嫊媴媶嫍媹媐寖寘寙尟尳嵱嵣嵊嵥嵲嵬嵞嵨嵧嵢巰幏幎幊幍幋廅廌廆廋廇彀徯徭惷慉慊愫慅愶愲愮慆愯慏愩慀戠酨戣戥戤揅揱揫搐搒搉搠搤����������������������������������搳摃搟搕搘搹搷搢搣搌搦搰搨摁搵搯搊搚摀搥搧搋揧搛搮搡搎敯斒旓暆暌暕暐暋暊暙暔晸朠楦楟椸楎楢楱椿楅楪椹楂楗楙楺楈楉椵楬椳椽楥棰楸椴楩楀楯楄楶楘楁楴楌椻楋椷楜楏楑椲楒椯楻椼歆歅歃歂歈歁殛嗀毻毼�".split("");
- 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];}
- D[222] = "����������������������������������������������������������������毹毷毸溛滖滈溏滀溟溓溔溠溱溹滆滒溽滁溞滉溷溰滍溦滏溲溾滃滜滘溙溒溎溍溤溡溿溳滐滊溗溮溣煇煔煒煣煠煁煝煢煲煸煪煡煂煘煃煋煰煟煐煓����������������������������������煄煍煚牏犍犌犑犐犎猼獂猻猺獀獊獉瑄瑊瑋瑒瑑瑗瑀瑏瑐瑎瑂瑆瑍瑔瓡瓿瓾瓽甝畹畷榃痯瘏瘃痷痾痼痹痸瘐痻痶痭痵痽皙皵盝睕睟睠睒睖睚睩睧睔睙睭矠碇碚碔碏碄碕碅碆碡碃硹碙碀碖硻祼禂祽祹稑稘稙稒稗稕稢稓�".split("");
- 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];}
- D[223] = "����������������������������������������������������������������稛稐窣窢窞竫筦筤筭筴筩筲筥筳筱筰筡筸筶筣粲粴粯綈綆綀綍絿綅絺綎絻綃絼綌綔綄絽綒罭罫罧罨罬羦羥羧翛翜耡腤腠腷腜腩腛腢腲朡腞腶腧腯����������������������������������腄腡舝艉艄艀艂艅蓱萿葖葶葹蒏蒍葥葑葀蒆葧萰葍葽葚葙葴葳葝蔇葞萷萺萴葺葃葸萲葅萩菙葋萯葂萭葟葰萹葎葌葒葯蓅蒎萻葇萶萳葨葾葄萫葠葔葮葐蜋蜄蛷蜌蛺蛖蛵蝍蛸蜎蜉蜁蛶蜍蜅裖裋裍裎裞裛裚裌裐覅覛觟觥觤�".split("");
- 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];}
- D[224] = "����������������������������������������������������������������觡觠觢觜触詶誆詿詡訿詷誂誄詵誃誁詴詺谼豋豊豥豤豦貆貄貅賌赨赩趑趌趎趏趍趓趔趐趒跰跠跬跱跮跐跩跣跢跧跲跫跴輆軿輁輀輅輇輈輂輋遒逿����������������������������������遄遉逽鄐鄍鄏鄑鄖鄔鄋鄎酮酯鉈鉒鈰鈺鉦鈳鉥鉞銃鈮鉊鉆鉭鉬鉏鉠鉧鉯鈶鉡鉰鈱鉔鉣鉐鉲鉎鉓鉌鉖鈲閟閜閞閛隒隓隑隗雎雺雽雸雵靳靷靸靲頏頍頎颬飶飹馯馲馰馵骭骫魛鳪鳭鳧麀黽僦僔僗僨僳僛僪僝僤僓僬僰僯僣僠�".split("");
- 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];}
- D[225] = "����������������������������������������������������������������凘劀劁勩勫匰厬嘧嘕嘌嘒嗼嘏嘜嘁嘓嘂嗺嘝嘄嗿嗹墉塼墐墘墆墁塿塴墋塺墇墑墎塶墂墈塻墔墏壾奫嫜嫮嫥嫕嫪嫚嫭嫫嫳嫢嫠嫛嫬嫞嫝嫙嫨嫟孷寠����������������������������������寣屣嶂嶀嵽嶆嵺嶁嵷嶊嶉嶈嵾嵼嶍嵹嵿幘幙幓廘廑廗廎廜廕廙廒廔彄彃彯徶愬愨慁慞慱慳慒慓慲慬憀慴慔慺慛慥愻慪慡慖戩戧戫搫摍摛摝摴摶摲摳摽摵摦撦摎撂摞摜摋摓摠摐摿搿摬摫摙摥摷敳斠暡暠暟朅朄朢榱榶槉�".split("");
- 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];}
- D[226] = "����������������������������������������������������������������榠槎榖榰榬榼榑榙榎榧榍榩榾榯榿槄榽榤槔榹槊榚槏榳榓榪榡榞槙榗榐槂榵榥槆歊歍歋殞殟殠毃毄毾滎滵滱漃漥滸漷滻漮漉潎漙漚漧漘漻漒滭漊����������������������������������漶潳滹滮漭潀漰漼漵滫漇漎潃漅滽滶漹漜滼漺漟漍漞漈漡熇熐熉熀熅熂熏煻熆熁熗牄牓犗犕犓獃獍獑獌瑢瑳瑱瑵瑲瑧瑮甀甂甃畽疐瘖瘈瘌瘕瘑瘊瘔皸瞁睼瞅瞂睮瞀睯睾瞃碲碪碴碭碨硾碫碞碥碠碬碢碤禘禊禋禖禕禔禓�".split("");
- 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];}
- D[227] = "����������������������������������������������������������������禗禈禒禐稫穊稰稯稨稦窨窫窬竮箈箜箊箑箐箖箍箌箛箎箅箘劄箙箤箂粻粿粼粺綧綷緂綣綪緁緀緅綝緎緄緆緋緌綯綹綖綼綟綦綮綩綡緉罳翢翣翥翞����������������������������������耤聝聜膉膆膃膇膍膌膋舕蒗蒤蒡蒟蒺蓎蓂蒬蒮蒫蒹蒴蓁蓍蒪蒚蒱蓐蒝蒧蒻蒢蒔蓇蓌蒛蒩蒯蒨蓖蒘蒶蓏蒠蓗蓔蓒蓛蒰蒑虡蜳蜣蜨蝫蝀蜮蜞蜡蜙蜛蝃蜬蝁蜾蝆蜠蜲蜪蜭蜼蜒蜺蜱蜵蝂蜦蜧蜸蜤蜚蜰蜑裷裧裱裲裺裾裮裼裶裻�".split("");
- 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];}
- D[228] = "����������������������������������������������������������������裰裬裫覝覡覟覞觩觫觨誫誙誋誒誏誖谽豨豩賕賏賗趖踉踂跿踍跽踊踃踇踆踅跾踀踄輐輑輎輍鄣鄜鄠鄢鄟鄝鄚鄤鄡鄛酺酲酹酳銥銤鉶銛鉺銠銔銪銍����������������������������������銦銚銫鉹銗鉿銣鋮銎銂銕銢鉽銈銡銊銆銌銙銧鉾銇銩銝銋鈭隞隡雿靘靽靺靾鞃鞀鞂靻鞄鞁靿韎韍頖颭颮餂餀餇馝馜駃馹馻馺駂馽駇骱髣髧鬾鬿魠魡魟鳱鳲鳵麧僿儃儰僸儆儇僶僾儋儌僽儊劋劌勱勯噈噂噌嘵噁噊噉噆噘�".split("");
- 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];}
- D[229] = "����������������������������������������������������������������噚噀嘳嘽嘬嘾嘸嘪嘺圚墫墝墱墠墣墯墬墥墡壿嫿嫴嫽嫷嫶嬃嫸嬂嫹嬁嬇嬅嬏屧嶙嶗嶟嶒嶢嶓嶕嶠嶜嶡嶚嶞幩幝幠幜緳廛廞廡彉徲憋憃慹憱憰憢憉����������������������������������憛憓憯憭憟憒憪憡憍慦憳戭摮摰撖撠撅撗撜撏撋撊撌撣撟摨撱撘敶敺敹敻斲斳暵暰暩暲暷暪暯樀樆樗槥槸樕槱槤樠槿槬槢樛樝槾樧槲槮樔槷槧橀樈槦槻樍槼槫樉樄樘樥樏槶樦樇槴樖歑殥殣殢殦氁氀毿氂潁漦潾澇濆澒�".split("");
- 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];}
- D[230] = "����������������������������������������������������������������澍澉澌潢潏澅潚澖潶潬澂潕潲潒潐潗澔澓潝漀潡潫潽潧澐潓澋潩潿澕潣潷潪潻熲熯熛熰熠熚熩熵熝熥熞熤熡熪熜熧熳犘犚獘獒獞獟獠獝獛獡獚獙����������������������������������獢璇璉璊璆璁瑽璅璈瑼瑹甈甇畾瘥瘞瘙瘝瘜瘣瘚瘨瘛皜皝皞皛瞍瞏瞉瞈磍碻磏磌磑磎磔磈磃磄磉禚禡禠禜禢禛歶稹窲窴窳箷篋箾箬篎箯箹篊箵糅糈糌糋緷緛緪緧緗緡縃緺緦緶緱緰緮緟罶羬羰羭翭翫翪翬翦翨聤聧膣膟�".split("");
- 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];}
- D[231] = "����������������������������������������������������������������膞膕膢膙膗舖艏艓艒艐艎艑蔤蔻蔏蔀蔩蔎蔉蔍蔟蔊蔧蔜蓻蔫蓺蔈蔌蓴蔪蓲蔕蓷蓫蓳蓼蔒蓪蓩蔖蓾蔨蔝蔮蔂蓽蔞蓶蔱蔦蓧蓨蓰蓯蓹蔘蔠蔰蔋蔙蔯虢����������������������������������蝖蝣蝤蝷蟡蝳蝘蝔蝛蝒蝡蝚蝑蝞蝭蝪蝐蝎蝟蝝蝯蝬蝺蝮蝜蝥蝏蝻蝵蝢蝧蝩衚褅褌褔褋褗褘褙褆褖褑褎褉覢覤覣觭觰觬諏諆誸諓諑諔諕誻諗誾諀諅諘諃誺誽諙谾豍貏賥賟賙賨賚賝賧趠趜趡趛踠踣踥踤踮踕踛踖踑踙踦踧�".split("");
- 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];}
- D[232] = "����������������������������������������������������������������踔踒踘踓踜踗踚輬輤輘輚輠輣輖輗遳遰遯遧遫鄯鄫鄩鄪鄲鄦鄮醅醆醊醁醂醄醀鋐鋃鋄鋀鋙銶鋏鋱鋟鋘鋩鋗鋝鋌鋯鋂鋨鋊鋈鋎鋦鋍鋕鋉鋠鋞鋧鋑鋓����������������������������������銵鋡鋆銴镼閬閫閮閰隤隢雓霅霈霂靚鞊鞎鞈韐韏頞頝頦頩頨頠頛頧颲餈飺餑餔餖餗餕駜駍駏駓駔駎駉駖駘駋駗駌骳髬髫髳髲髱魆魃魧魴魱魦魶魵魰魨魤魬鳼鳺鳽鳿鳷鴇鴀鳹鳻鴈鴅鴄麃黓鼏鼐儜儓儗儚儑凞匴叡噰噠噮�".split("");
- 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];}
- D[233] = "����������������������������������������������������������������噳噦噣噭噲噞噷圜圛壈墽壉墿墺壂墼壆嬗嬙嬛嬡嬔嬓嬐嬖嬨嬚嬠嬞寯嶬嶱嶩嶧嶵嶰嶮嶪嶨嶲嶭嶯嶴幧幨幦幯廩廧廦廨廥彋徼憝憨憖懅憴懆懁懌憺����������������������������������憿憸憌擗擖擐擏擉撽撉擃擛擳擙攳敿敼斢曈暾曀曊曋曏暽暻暺曌朣樴橦橉橧樲橨樾橝橭橶橛橑樨橚樻樿橁橪橤橐橏橔橯橩橠樼橞橖橕橍橎橆歕歔歖殧殪殫毈毇氄氃氆澭濋澣濇澼濎濈潞濄澽澞濊澨瀄澥澮澺澬澪濏澿澸�".split("");
- 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];}
- D[234] = "����������������������������������������������������������������澢濉澫濍澯澲澰燅燂熿熸燖燀燁燋燔燊燇燏熽燘熼燆燚燛犝犞獩獦獧獬獥獫獪瑿璚璠璔璒璕璡甋疀瘯瘭瘱瘽瘳瘼瘵瘲瘰皻盦瞚瞝瞡瞜瞛瞢瞣瞕瞙����������������������������������瞗磝磩磥磪磞磣磛磡磢磭磟磠禤穄穈穇窶窸窵窱窷篞篣篧篝篕篥篚篨篹篔篪篢篜篫篘篟糒糔糗糐糑縒縡縗縌縟縠縓縎縜縕縚縢縋縏縖縍縔縥縤罃罻罼罺羱翯耪耩聬膱膦膮膹膵膫膰膬膴膲膷膧臲艕艖艗蕖蕅蕫蕍蕓蕡蕘�".split("");
- 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];}
- D[235] = "����������������������������������������������������������������蕀蕆蕤蕁蕢蕄蕑蕇蕣蔾蕛蕱蕎蕮蕵蕕蕧蕠薌蕦蕝蕔蕥蕬虣虥虤螛螏螗螓螒螈螁螖螘蝹螇螣螅螐螑螝螄螔螜螚螉褞褦褰褭褮褧褱褢褩褣褯褬褟觱諠����������������������������������諢諲諴諵諝謔諤諟諰諈諞諡諨諿諯諻貑貒貐賵賮賱賰賳赬赮趥趧踳踾踸蹀蹅踶踼踽蹁踰踿躽輶輮輵輲輹輷輴遶遹遻邆郺鄳鄵鄶醓醐醑醍醏錧錞錈錟錆錏鍺錸錼錛錣錒錁鍆錭錎錍鋋錝鋺錥錓鋹鋷錴錂錤鋿錩錹錵錪錔錌�".split("");
- 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];}
- D[236] = "����������������������������������������������������������������錋鋾錉錀鋻錖閼闍閾閹閺閶閿閵閽隩雔霋霒霐鞙鞗鞔韰韸頵頯頲餤餟餧餩馞駮駬駥駤駰駣駪駩駧骹骿骴骻髶髺髹髷鬳鮀鮅鮇魼魾魻鮂鮓鮒鮐魺鮕����������������������������������魽鮈鴥鴗鴠鴞鴔鴩鴝鴘鴢鴐鴙鴟麈麆麇麮麭黕黖黺鼒鼽儦儥儢儤儠儩勴嚓嚌嚍嚆嚄嚃噾嚂噿嚁壖壔壏壒嬭嬥嬲嬣嬬嬧嬦嬯嬮孻寱寲嶷幬幪徾徻懃憵憼懧懠懥懤懨懞擯擩擣擫擤擨斁斀斶旚曒檍檖檁檥檉檟檛檡檞檇檓檎�".split("");
- 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];}
- D[237] = "����������������������������������������������������������������檕檃檨檤檑橿檦檚檅檌檒歛殭氉濌澩濴濔濣濜濭濧濦濞濲濝濢濨燡燱燨燲燤燰燢獳獮獯璗璲璫璐璪璭璱璥璯甐甑甒甏疄癃癈癉癇皤盩瞵瞫瞲瞷瞶����������������������������������瞴瞱瞨矰磳磽礂磻磼磲礅磹磾礄禫禨穜穛穖穘穔穚窾竀竁簅簏篲簀篿篻簎篴簋篳簂簉簃簁篸篽簆篰篱簐簊糨縭縼繂縳顈縸縪繉繀繇縩繌縰縻縶繄縺罅罿罾罽翴翲耬膻臄臌臊臅臇膼臩艛艚艜薃薀薏薧薕薠薋薣蕻薤薚薞�".split("");
- 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];}
- D[238] = "����������������������������������������������������������������蕷蕼薉薡蕺蕸蕗薎薖薆薍薙薝薁薢薂薈薅蕹蕶薘薐薟虨螾螪螭蟅螰螬螹螵螼螮蟉蟃蟂蟌螷螯蟄蟊螴螶螿螸螽蟞螲褵褳褼褾襁襒褷襂覭覯覮觲觳謞����������������������������������謘謖謑謅謋謢謏謒謕謇謍謈謆謜謓謚豏豰豲豱豯貕貔賹赯蹎蹍蹓蹐蹌蹇轃轀邅遾鄸醚醢醛醙醟醡醝醠鎡鎃鎯鍤鍖鍇鍼鍘鍜鍶鍉鍐鍑鍠鍭鎏鍌鍪鍹鍗鍕鍒鍏鍱鍷鍻鍡鍞鍣鍧鎀鍎鍙闇闀闉闃闅閷隮隰隬霠霟霘霝霙鞚鞡鞜�".split("");
- 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];}
- D[239] = "����������������������������������������������������������������鞞鞝韕韔韱顁顄顊顉顅顃餥餫餬餪餳餲餯餭餱餰馘馣馡騂駺駴駷駹駸駶駻駽駾駼騃骾髾髽鬁髼魈鮚鮨鮞鮛鮦鮡鮥鮤鮆鮢鮠鮯鴳鵁鵧鴶鴮鴯鴱鴸鴰����������������������������������鵅鵂鵃鴾鴷鵀鴽翵鴭麊麉麍麰黈黚黻黿鼤鼣鼢齔龠儱儭儮嚘嚜嚗嚚嚝嚙奰嬼屩屪巀幭幮懘懟懭懮懱懪懰懫懖懩擿攄擽擸攁攃擼斔旛曚曛曘櫅檹檽櫡櫆檺檶檷櫇檴檭歞毉氋瀇瀌瀍瀁瀅瀔瀎濿瀀濻瀦濼濷瀊爁燿燹爃燽獶�".split("");
- 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];}
- D[240] = "����������������������������������������������������������������璸瓀璵瓁璾璶璻瓂甔甓癜癤癙癐癓癗癚皦皽盬矂瞺磿礌礓礔礉礐礒礑禭禬穟簜簩簙簠簟簭簝簦簨簢簥簰繜繐繖繣繘繢繟繑繠繗繓羵羳翷翸聵臑臒����������������������������������臐艟艞薴藆藀藃藂薳薵薽藇藄薿藋藎藈藅薱薶藒蘤薸薷薾虩蟧蟦蟢蟛蟫蟪蟥蟟蟳蟤蟔蟜蟓蟭蟘蟣螤蟗蟙蠁蟴蟨蟝襓襋襏襌襆襐襑襉謪謧謣謳謰謵譇謯謼謾謱謥謷謦謶謮謤謻謽謺豂豵貙貘貗賾贄贂贀蹜蹢蹠蹗蹖蹞蹥蹧�".split("");
- 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];}
- D[241] = "����������������������������������������������������������������蹛蹚蹡蹝蹩蹔轆轇轈轋鄨鄺鄻鄾醨醥醧醯醪鎵鎌鎒鎷鎛鎝鎉鎧鎎鎪鎞鎦鎕鎈鎙鎟鎍鎱鎑鎲鎤鎨鎴鎣鎥闒闓闑隳雗雚巂雟雘雝霣霢霥鞬鞮鞨鞫鞤鞪����������������������������������鞢鞥韗韙韖韘韺顐顑顒颸饁餼餺騏騋騉騍騄騑騊騅騇騆髀髜鬈鬄鬅鬩鬵魊魌魋鯇鯆鯃鮿鯁鮵鮸鯓鮶鯄鮹鮽鵜鵓鵏鵊鵛鵋鵙鵖鵌鵗鵒鵔鵟鵘鵚麎麌黟鼁鼀鼖鼥鼫鼪鼩鼨齌齕儴儵劖勷厴嚫嚭嚦嚧嚪嚬壚壝壛夒嬽嬾嬿巃幰�".split("");
- 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];}
- D[242] = "����������������������������������������������������������������徿懻攇攐攍攉攌攎斄旞旝曞櫧櫠櫌櫑櫙櫋櫟櫜櫐櫫櫏櫍櫞歠殰氌瀙瀧瀠瀖瀫瀡瀢瀣瀩瀗瀤瀜瀪爌爊爇爂爅犥犦犤犣犡瓋瓅璷瓃甖癠矉矊矄矱礝礛����������������������������������礡礜礗礞禰穧穨簳簼簹簬簻糬糪繶繵繸繰繷繯繺繲繴繨罋罊羃羆羷翽翾聸臗臕艤艡艣藫藱藭藙藡藨藚藗藬藲藸藘藟藣藜藑藰藦藯藞藢蠀蟺蠃蟶蟷蠉蠌蠋蠆蟼蠈蟿蠊蠂襢襚襛襗襡襜襘襝襙覈覷覶觶譐譈譊譀譓譖譔譋譕�".split("");
- 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];}
- D[243] = "����������������������������������������������������������������譑譂譒譗豃豷豶貚贆贇贉趬趪趭趫蹭蹸蹳蹪蹯蹻軂轒轑轏轐轓辴酀鄿醰醭鏞鏇鏏鏂鏚鏐鏹鏬鏌鏙鎩鏦鏊鏔鏮鏣鏕鏄鏎鏀鏒鏧镽闚闛雡霩霫霬霨霦����������������������������������鞳鞷鞶韝韞韟顜顙顝顗颿颽颻颾饈饇饃馦馧騚騕騥騝騤騛騢騠騧騣騞騜騔髂鬋鬊鬎鬌鬷鯪鯫鯠鯞鯤鯦鯢鯰鯔鯗鯬鯜鯙鯥鯕鯡鯚鵷鶁鶊鶄鶈鵱鶀鵸鶆鶋鶌鵽鵫鵴鵵鵰鵩鶅鵳鵻鶂鵯鵹鵿鶇鵨麔麑黀黼鼭齀齁齍齖齗齘匷嚲�".split("");
- 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];}
- D[244] = "����������������������������������������������������������������嚵嚳壣孅巆巇廮廯忀忁懹攗攖攕攓旟曨曣曤櫳櫰櫪櫨櫹櫱櫮櫯瀼瀵瀯瀷瀴瀱灂瀸瀿瀺瀹灀瀻瀳灁爓爔犨獽獼璺皫皪皾盭矌矎矏矍矲礥礣礧礨礤礩����������������������������������禲穮穬穭竷籉籈籊籇籅糮繻繾纁纀羺翿聹臛臙舋艨艩蘢藿蘁藾蘛蘀藶蘄蘉蘅蘌藽蠙蠐蠑蠗蠓蠖襣襦覹觷譠譪譝譨譣譥譧譭趮躆躈躄轙轖轗轕轘轚邍酃酁醷醵醲醳鐋鐓鏻鐠鐏鐔鏾鐕鐐鐨鐙鐍鏵鐀鏷鐇鐎鐖鐒鏺鐉鏸鐊鏿�".split("");
- 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];}
- D[245] = "����������������������������������������������������������������鏼鐌鏶鐑鐆闞闠闟霮霯鞹鞻韽韾顠顢顣顟飁飂饐饎饙饌饋饓騲騴騱騬騪騶騩騮騸騭髇髊髆鬐鬒鬑鰋鰈鯷鰅鰒鯸鱀鰇鰎鰆鰗鰔鰉鶟鶙鶤鶝鶒鶘鶐鶛����������������������������������鶠鶔鶜鶪鶗鶡鶚鶢鶨鶞鶣鶿鶩鶖鶦鶧麙麛麚黥黤黧黦鼰鼮齛齠齞齝齙龑儺儹劘劗囃嚽嚾孈孇巋巏廱懽攛欂櫼欃櫸欀灃灄灊灈灉灅灆爝爚爙獾甗癪矐礭礱礯籔籓糲纊纇纈纋纆纍罍羻耰臝蘘蘪蘦蘟蘣蘜蘙蘧蘮蘡蘠蘩蘞蘥�".split("");
- 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];}
- D[246] = "����������������������������������������������������������������蠩蠝蠛蠠蠤蠜蠫衊襭襩襮襫觺譹譸譅譺譻贐贔趯躎躌轞轛轝酆酄酅醹鐿鐻鐶鐩鐽鐼鐰鐹鐪鐷鐬鑀鐱闥闤闣霵霺鞿韡顤飉飆飀饘饖騹騽驆驄驂驁騺����������������������������������騿髍鬕鬗鬘鬖鬺魒鰫鰝鰜鰬鰣鰨鰩鰤鰡鶷鶶鶼鷁鷇鷊鷏鶾鷅鷃鶻鶵鷎鶹鶺鶬鷈鶱鶭鷌鶳鷍鶲鹺麜黫黮黭鼛鼘鼚鼱齎齥齤龒亹囆囅囋奱孋孌巕巑廲攡攠攦攢欋欈欉氍灕灖灗灒爞爟犩獿瓘瓕瓙瓗癭皭礵禴穰穱籗籜籙籛籚�".split("");
- 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];}
- D[247] = "����������������������������������������������������������������糴糱纑罏羇臞艫蘴蘵蘳蘬蘲蘶蠬蠨蠦蠪蠥襱覿覾觻譾讄讂讆讅譿贕躕躔躚躒躐躖躗轠轢酇鑌鑐鑊鑋鑏鑇鑅鑈鑉鑆霿韣顪顩飋饔饛驎驓驔驌驏驈驊����������������������������������驉驒驐髐鬙鬫鬻魖魕鱆鱈鰿鱄鰹鰳鱁鰼鰷鰴鰲鰽鰶鷛鷒鷞鷚鷋鷐鷜鷑鷟鷩鷙鷘鷖鷵鷕鷝麶黰鼵鼳鼲齂齫龕龢儽劙壨壧奲孍巘蠯彏戁戃戄攩攥斖曫欑欒欏毊灛灚爢玂玁玃癰矔籧籦纕艬蘺虀蘹蘼蘱蘻蘾蠰蠲蠮蠳襶襴襳觾�".split("");
- 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];}
- D[248] = "����������������������������������������������������������������讌讎讋讈豅贙躘轤轣醼鑢鑕鑝鑗鑞韄韅頀驖驙鬞鬟鬠鱒鱘鱐鱊鱍鱋鱕鱙鱌鱎鷻鷷鷯鷣鷫鷸鷤鷶鷡鷮鷦鷲鷰鷢鷬鷴鷳鷨鷭黂黐黲黳鼆鼜鼸鼷鼶齃齏����������������������������������齱齰齮齯囓囍孎屭攭曭曮欓灟灡灝灠爣瓛瓥矕礸禷禶籪纗羉艭虃蠸蠷蠵衋讔讕躞躟躠躝醾醽釂鑫鑨鑩雥靆靃靇韇韥驞髕魙鱣鱧鱦鱢鱞鱠鸂鷾鸇鸃鸆鸅鸀鸁鸉鷿鷽鸄麠鼞齆齴齵齶囔攮斸欘欙欗欚灢爦犪矘矙礹籩籫糶纚�".split("");
- 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];}
- D[249] = "����������������������������������������������������������������纘纛纙臠臡虆虇虈襹襺襼襻觿讘讙躥躤躣鑮鑭鑯鑱鑳靉顲饟鱨鱮鱭鸋鸍鸐鸏鸒鸑麡黵鼉齇齸齻齺齹圞灦籯蠼趲躦釃鑴鑸鑶鑵驠鱴鱳鱱鱵鸔鸓黶鼊����������������������������������龤灨灥糷虪蠾蠽蠿讞貜躩軉靋顳顴飌饡馫驤驦驧鬤鸕鸗齈戇欞爧虌躨钂钀钁驩驨鬮鸙爩虋讟钃鱹麷癵驫鱺鸝灩灪麤齾齉龘碁銹裏墻恒粧嫺╔╦╗╠╬╣╚╩╝╒╤╕╞╪╡╘╧╛╓╥╖╟╫╢╙╨╜║═╭╮╰╯▓�".split("");
- 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];}
- return {"enc": e, "dec": d }; })();
- 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 }; })();
- 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 }; })();
- 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 }; })();
- 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 }; })();
- 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 }; })();
- 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 }; })();
- 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 }; })();
- 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 }; })();
- 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 }; })();
- 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 }; })();
- 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 }; })();
- 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 }; })();
- cptable[10008] = (function(){ var d = [], e = {}, D = [], j;
- 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("");
- 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];}
- D[161] = "����������������������������������������������������������������������������������������������������������������������������������������������������������������� 、。・ˉˇ¨〃々―~�…‘’“”〔〕〈〉《》「」『』〖〗【】±×÷∶∧∨∑∏∪∩∈∷√⊥∥∠⌒⊙∫∮≡≌≈∽∝≠≮≯≤≥∞∵∴♂♀°′″℃$¤¢£‰§№☆★○●◎◇◆□■△▲※→←↑↓〓�".split("");
- 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];}
- D[162] = "���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������⒈⒉⒊⒋⒌⒍⒎⒏⒐⒑⒒⒓⒔⒕⒖⒗⒘⒙⒚⒛⑴⑵⑶⑷⑸⑹⑺⑻⑼⑽⑾⑿⒀⒁⒂⒃⒄⒅⒆⒇①②③④⑤⑥⑦⑧⑨⑩��㈠㈡㈢㈣㈤㈥㈦㈧㈨㈩��ⅠⅡⅢⅣⅤⅥⅦⅧⅨⅩⅪⅫ���".split("");
- 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];}
- D[163] = "�����������������������������������������������������������������������������������������������������������������������������������������������������������������!"#¥%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|} ̄�".split("");
- 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];}
- D[164] = "�����������������������������������������������������������������������������������������������������������������������������������������������������������������ぁあぃいぅうぇえぉおかがきぎくぐけげこごさざしじすずせぜそぞただちぢっつづてでとどなにぬねのはばぱひびぴふぶぷへべぺほぼぽまみむめもゃやゅゆょよらりるれろゎわゐゑをん������������".split("");
- 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];}
- D[165] = "�����������������������������������������������������������������������������������������������������������������������������������������������������������������ァアィイゥウェエォオカガキギクグケゲコゴサザシジスズセゼソゾタダチヂッツヅテデトドナニヌネノハバパヒビピフブプヘベペホボポマミムメモャヤュユョヨラリルレロヮワヰヱヲンヴヵヶ���������".split("");
- 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];}
- D[166] = "�����������������������������������������������������������������������������������������������������������������������������������������������������������������ΑΒΓΔΕΖΗΘΙΚΛΜΝΞΟΠΡΣΤΥΦΧΨΩ��������αβγδεζηθικλμνξοπρστυφχψω���������������������������������������".split("");
- 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];}
- D[167] = "�����������������������������������������������������������������������������������������������������������������������������������������������������������������АБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯ���������������абвгдеёжзийклмнопрстуфхцчшщъыьэюя��������������".split("");
- 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];}
- D[168] = "�����������������������������������������������������������������������������������������������������������������������������������������������������������������āáǎàēéěèīíǐìōóǒòūúǔùǖǘǚǜüê����������ㄅㄆㄇㄈㄉㄊㄋㄌㄍㄎㄏㄐㄑㄒㄓㄔㄕㄖㄗㄘㄙㄚㄛㄜㄝㄞㄟㄠㄡㄢㄣㄤㄥㄦㄧㄨㄩ����������������������".split("");
- 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];}
- D[169] = "��������������������������������������������������������������������������������������������������������������������������������������������������������������������─━│┃┄┅┆┇┈┉┊┋┌┍┎┏┐┑┒┓└┕┖┗┘┙┚┛├┝┞┟┠┡┢┣┤┥┦┧┨┩┪┫┬┭┮┯┰┱┲┳┴┵┶┷┸┹┺┻┼┽┾┿╀╁╂╃╄╅╆╇╈╉╊╋����������������".split("");
- 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];}
- D[176] = "�����������������������������������������������������������������������������������������������������������������������������������������������������������������啊阿埃挨哎唉哀皑癌蔼矮艾碍爱隘鞍氨安俺按暗岸胺案肮昂盎凹敖熬翱袄傲奥懊澳芭捌扒叭吧笆八疤巴拔跋靶把耙坝霸罢爸白柏百摆佰败拜稗斑班搬扳般颁板版扮拌伴瓣半办绊邦帮梆榜膀绑棒磅蚌镑傍谤苞胞包褒剥�".split("");
- 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];}
- D[177] = "�����������������������������������������������������������������������������������������������������������������������������������������������������������������薄雹保堡饱宝抱报暴豹鲍爆杯碑悲卑北辈背贝钡倍狈备惫焙被奔苯本笨崩绷甭泵蹦迸逼鼻比鄙笔彼碧蓖蔽毕毙毖币庇痹闭敝弊必辟壁臂避陛鞭边编贬扁便变卞辨辩辫遍标彪膘表鳖憋别瘪彬斌濒滨宾摈兵冰柄丙秉饼炳�".split("");
- 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];}
- D[178] = "�����������������������������������������������������������������������������������������������������������������������������������������������������������������病并玻菠播拨钵波博勃搏铂箔伯帛舶脖膊渤泊驳捕卜哺补埠不布步簿部怖擦猜裁材才财睬踩采彩菜蔡餐参蚕残惭惨灿苍舱仓沧藏操糙槽曹草厕策侧册测层蹭插叉茬茶查碴搽察岔差诧拆柴豺搀掺蝉馋谗缠铲产阐颤昌猖�".split("");
- 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];}
- D[179] = "�����������������������������������������������������������������������������������������������������������������������������������������������������������������场尝常长偿肠厂敞畅唱倡超抄钞朝嘲潮巢吵炒车扯撤掣彻澈郴臣辰尘晨忱沉陈趁衬撑称城橙成呈乘程惩澄诚承逞骋秤吃痴持匙池迟弛驰耻齿侈尺赤翅斥炽充冲虫崇宠抽酬畴踌稠愁筹仇绸瞅丑臭初出橱厨躇锄雏滁除楚�".split("");
- 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];}
- D[180] = "�����������������������������������������������������������������������������������������������������������������������������������������������������������������础储矗搐触处揣川穿椽传船喘串疮窗幢床闯创吹炊捶锤垂春椿醇唇淳纯蠢戳绰疵茨磁雌辞慈瓷词此刺赐次聪葱囱匆从丛凑粗醋簇促蹿篡窜摧崔催脆瘁粹淬翠村存寸磋撮搓措挫错搭达答瘩打大呆歹傣戴带殆代贷袋待逮�".split("");
- 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];}
- D[181] = "�����������������������������������������������������������������������������������������������������������������������������������������������������������������怠耽担丹单郸掸胆旦氮但惮淡诞弹蛋当挡党荡档刀捣蹈倒岛祷导到稻悼道盗德得的蹬灯登等瞪凳邓堤低滴迪敌笛狄涤翟嫡抵底地蒂第帝弟递缔颠掂滇碘点典靛垫电佃甸店惦奠淀殿碉叼雕凋刁掉吊钓调跌爹碟蝶迭谍叠�".split("");
- 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];}
- D[182] = "�����������������������������������������������������������������������������������������������������������������������������������������������������������������丁盯叮钉顶鼎锭定订丢东冬董懂动栋侗恫冻洞兜抖斗陡豆逗痘都督毒犊独读堵睹赌杜镀肚度渡妒端短锻段断缎堆兑队对墩吨蹲敦顿囤钝盾遁掇哆多夺垛躲朵跺舵剁惰堕蛾峨鹅俄额讹娥恶厄扼遏鄂饿恩而儿耳尔饵洱二�".split("");
- 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];}
- D[183] = "�����������������������������������������������������������������������������������������������������������������������������������������������������������������贰发罚筏伐乏阀法珐藩帆番翻樊矾钒繁凡烦反返范贩犯饭泛坊芳方肪房防妨仿访纺放菲非啡飞肥匪诽吠肺废沸费芬酚吩氛分纷坟焚汾粉奋份忿愤粪丰封枫蜂峰锋风疯烽逢冯缝讽奉凤佛否夫敷肤孵扶拂辐幅氟符伏俘服�".split("");
- 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];}
- D[184] = "�����������������������������������������������������������������������������������������������������������������������������������������������������������������浮涪福袱弗甫抚辅俯釜斧脯腑府腐赴副覆赋复傅付阜父腹负富讣附妇缚咐噶嘎该改概钙盖溉干甘杆柑竿肝赶感秆敢赣冈刚钢缸肛纲岗港杠篙皋高膏羔糕搞镐稿告哥歌搁戈鸽胳疙割革葛格蛤阁隔铬个各给根跟耕更庚羹�".split("");
- 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];}
- D[185] = "�����������������������������������������������������������������������������������������������������������������������������������������������������������������埂耿梗工攻功恭龚供躬公宫弓巩汞拱贡共钩勾沟苟狗垢构购够辜菇咕箍估沽孤姑鼓古蛊骨谷股故顾固雇刮瓜剐寡挂褂乖拐怪棺关官冠观管馆罐惯灌贯光广逛瑰规圭硅归龟闺轨鬼诡癸桂柜跪贵刽辊滚棍锅郭国果裹过哈�".split("");
- 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];}
- D[186] = "�����������������������������������������������������������������������������������������������������������������������������������������������������������������骸孩海氦亥害骇酣憨邯韩含涵寒函喊罕翰撼捍旱憾悍焊汗汉夯杭航壕嚎豪毫郝好耗号浩呵喝荷菏核禾和何合盒貉阂河涸赫褐鹤贺嘿黑痕很狠恨哼亨横衡恒轰哄烘虹鸿洪宏弘红喉侯猴吼厚候后呼乎忽瑚壶葫胡蝴狐糊湖�".split("");
- 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];}
- D[187] = "�����������������������������������������������������������������������������������������������������������������������������������������������������������������弧虎唬护互沪户花哗华猾滑画划化话槐徊怀淮坏欢环桓还缓换患唤痪豢焕涣宦幻荒慌黄磺蝗簧皇凰惶煌晃幌恍谎灰挥辉徽恢蛔回毁悔慧卉惠晦贿秽会烩汇讳诲绘荤昏婚魂浑混豁活伙火获或惑霍货祸击圾基机畸稽积箕�".split("");
- 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];}
- D[188] = "�����������������������������������������������������������������������������������������������������������������������������������������������������������������肌饥迹激讥鸡姬绩缉吉极棘辑籍集及急疾汲即嫉级挤几脊己蓟技冀季伎祭剂悸济寄寂计记既忌际妓继纪嘉枷夹佳家加荚颊贾甲钾假稼价架驾嫁歼监坚尖笺间煎兼肩艰奸缄茧检柬碱硷拣捡简俭剪减荐槛鉴践贱见键箭件�".split("");
- 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];}
- D[189] = "�����������������������������������������������������������������������������������������������������������������������������������������������������������������健舰剑饯渐溅涧建僵姜将浆江疆蒋桨奖讲匠酱降蕉椒礁焦胶交郊浇骄娇嚼搅铰矫侥脚狡角饺缴绞剿教酵轿较叫窖揭接皆秸街阶截劫节桔杰捷睫竭洁结解姐戒藉芥界借介疥诫届巾筋斤金今津襟紧锦仅谨进靳晋禁近烬浸�".split("");
- 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];}
- D[190] = "�����������������������������������������������������������������������������������������������������������������������������������������������������������������尽劲荆兢茎睛晶鲸京惊精粳经井警景颈静境敬镜径痉靖竟竞净炯窘揪究纠玖韭久灸九酒厩救旧臼舅咎就疚鞠拘狙疽居驹菊局咀矩举沮聚拒据巨具距踞锯俱句惧炬剧捐鹃娟倦眷卷绢撅攫抉掘倔爵觉决诀绝均菌钧军君峻�".split("");
- 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];}
- D[191] = "�����������������������������������������������������������������������������������������������������������������������������������������������������������������俊竣浚郡骏喀咖卡咯开揩楷凯慨刊堪勘坎砍看康慷糠扛抗亢炕考拷烤靠坷苛柯棵磕颗科壳咳可渴克刻客课肯啃垦恳坑吭空恐孔控抠口扣寇枯哭窟苦酷库裤夸垮挎跨胯块筷侩快宽款匡筐狂框矿眶旷况亏盔岿窥葵奎魁傀�".split("");
- 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];}
- D[192] = "�����������������������������������������������������������������������������������������������������������������������������������������������������������������馈愧溃坤昆捆困括扩廓阔垃拉喇蜡腊辣啦莱来赖蓝婪栏拦篮阑兰澜谰揽览懒缆烂滥琅榔狼廊郎朗浪捞劳牢老佬姥酪烙涝勒乐雷镭蕾磊累儡垒擂肋类泪棱楞冷厘梨犁黎篱狸离漓理李里鲤礼莉荔吏栗丽厉励砾历利傈例俐�".split("");
- 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];}
- D[193] = "�����������������������������������������������������������������������������������������������������������������������������������������������������������������痢立粒沥隶力璃哩俩联莲连镰廉怜涟帘敛脸链恋炼练粮凉梁粱良两辆量晾亮谅撩聊僚疗燎寥辽潦了撂镣廖料列裂烈劣猎琳林磷霖临邻鳞淋凛赁吝拎玲菱零龄铃伶羚凌灵陵岭领另令溜琉榴硫馏留刘瘤流柳六龙聋咙笼窿�".split("");
- 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];}
- D[194] = "�����������������������������������������������������������������������������������������������������������������������������������������������������������������隆垄拢陇楼娄搂篓漏陋芦卢颅庐炉掳卤虏鲁麓碌露路赂鹿潞禄录陆戮驴吕铝侣旅履屡缕虑氯律率滤绿峦挛孪滦卵乱掠略抡轮伦仑沦纶论萝螺罗逻锣箩骡裸落洛骆络妈麻玛码蚂马骂嘛吗埋买麦卖迈脉瞒馒蛮满蔓曼慢漫�".split("");
- 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];}
- D[195] = "�����������������������������������������������������������������������������������������������������������������������������������������������������������������谩芒茫盲氓忙莽猫茅锚毛矛铆卯茂冒帽貌贸么玫枚梅酶霉煤没眉媒镁每美昧寐妹媚门闷们萌蒙檬盟锰猛梦孟眯醚靡糜迷谜弥米秘觅泌蜜密幂棉眠绵冕免勉娩缅面苗描瞄藐秒渺庙妙蔑灭民抿皿敏悯闽明螟鸣铭名命谬摸�".split("");
- 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];}
- D[196] = "�����������������������������������������������������������������������������������������������������������������������������������������������������������������摹蘑模膜磨摩魔抹末莫墨默沫漠寞陌谋牟某拇牡亩姆母墓暮幕募慕木目睦牧穆拿哪呐钠那娜纳氖乃奶耐奈南男难囊挠脑恼闹淖呢馁内嫩能妮霓倪泥尼拟你匿腻逆溺蔫拈年碾撵捻念娘酿鸟尿捏聂孽啮镊镍涅您柠狞凝宁�".split("");
- 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];}
- D[197] = "�����������������������������������������������������������������������������������������������������������������������������������������������������������������拧泞牛扭钮纽脓浓农弄奴努怒女暖虐疟挪懦糯诺哦欧鸥殴藕呕偶沤啪趴爬帕怕琶拍排牌徘湃派攀潘盘磐盼畔判叛乓庞旁耪胖抛咆刨炮袍跑泡呸胚培裴赔陪配佩沛喷盆砰抨烹澎彭蓬棚硼篷膨朋鹏捧碰坯砒霹批披劈琵毗�".split("");
- 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];}
- D[198] = "�����������������������������������������������������������������������������������������������������������������������������������������������������������������啤脾疲皮匹痞僻屁譬篇偏片骗飘漂瓢票撇瞥拼频贫品聘乒坪苹萍平凭瓶评屏坡泼颇婆破魄迫粕剖扑铺仆莆葡菩蒲埔朴圃普浦谱曝瀑期欺栖戚妻七凄漆柒沏其棋奇歧畦崎脐齐旗祈祁骑起岂乞企启契砌器气迄弃汽泣讫掐�".split("");
- 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];}
- D[199] = "�����������������������������������������������������������������������������������������������������������������������������������������������������������������恰洽牵扦钎铅千迁签仟谦乾黔钱钳前潜遣浅谴堑嵌欠歉枪呛腔羌墙蔷强抢橇锹敲悄桥瞧乔侨巧鞘撬翘峭俏窍切茄且怯窃钦侵亲秦琴勤芹擒禽寝沁青轻氢倾卿清擎晴氰情顷请庆琼穷秋丘邱球求囚酋泅趋区蛆曲躯屈驱渠�".split("");
- 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];}
- D[200] = "�����������������������������������������������������������������������������������������������������������������������������������������������������������������取娶龋趣去圈颧权醛泉全痊拳犬券劝缺炔瘸却鹊榷确雀裙群然燃冉染瓤壤攘嚷让饶扰绕惹热壬仁人忍韧任认刃妊纫扔仍日戎茸蓉荣融熔溶容绒冗揉柔肉茹蠕儒孺如辱乳汝入褥软阮蕊瑞锐闰润若弱撒洒萨腮鳃塞赛三叁�".split("");
- 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];}
- D[201] = "�����������������������������������������������������������������������������������������������������������������������������������������������������������������伞散桑嗓丧搔骚扫嫂瑟色涩森僧莎砂杀刹沙纱傻啥煞筛晒珊苫杉山删煽衫闪陕擅赡膳善汕扇缮墒伤商赏晌上尚裳梢捎稍烧芍勺韶少哨邵绍奢赊蛇舌舍赦摄射慑涉社设砷申呻伸身深娠绅神沈审婶甚肾慎渗声生甥牲升绳�".split("");
- 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];}
- D[202] = "�����������������������������������������������������������������������������������������������������������������������������������������������������������������省盛剩胜圣师失狮施湿诗尸虱十石拾时什食蚀实识史矢使屎驶始式示士世柿事拭誓逝势是嗜噬适仕侍释饰氏市恃室视试收手首守寿授售受瘦兽蔬枢梳殊抒输叔舒淑疏书赎孰熟薯暑曙署蜀黍鼠属术述树束戍竖墅庶数漱�".split("");
- 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];}
- D[203] = "�����������������������������������������������������������������������������������������������������������������������������������������������������������������恕刷耍摔衰甩帅栓拴霜双爽谁水睡税吮瞬顺舜说硕朔烁斯撕嘶思私司丝死肆寺嗣四伺似饲巳松耸怂颂送宋讼诵搜艘擞嗽苏酥俗素速粟僳塑溯宿诉肃酸蒜算虽隋随绥髓碎岁穗遂隧祟孙损笋蓑梭唆缩琐索锁所塌他它她塔�".split("");
- 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];}
- D[204] = "�����������������������������������������������������������������������������������������������������������������������������������������������������������������獭挞蹋踏胎苔抬台泰酞太态汰坍摊贪瘫滩坛檀痰潭谭谈坦毯袒碳探叹炭汤塘搪堂棠膛唐糖倘躺淌趟烫掏涛滔绦萄桃逃淘陶讨套特藤腾疼誊梯剔踢锑提题蹄啼体替嚏惕涕剃屉天添填田甜恬舔腆挑条迢眺跳贴铁帖厅听烃�".split("");
- 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];}
- D[205] = "�����������������������������������������������������������������������������������������������������������������������������������������������������������������汀廷停亭庭挺艇通桐酮瞳同铜彤童桶捅筒统痛偷投头透凸秃突图徒途涂屠土吐兔湍团推颓腿蜕褪退吞屯臀拖托脱鸵陀驮驼椭妥拓唾挖哇蛙洼娃瓦袜歪外豌弯湾玩顽丸烷完碗挽晚皖惋宛婉万腕汪王亡枉网往旺望忘妄威�".split("");
- 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];}
- D[206] = "�����������������������������������������������������������������������������������������������������������������������������������������������������������������巍微危韦违桅围唯惟为潍维苇萎委伟伪尾纬未蔚味畏胃喂魏位渭谓尉慰卫瘟温蚊文闻纹吻稳紊问嗡翁瓮挝蜗涡窝我斡卧握沃巫呜钨乌污诬屋无芜梧吾吴毋武五捂午舞伍侮坞戊雾晤物勿务悟误昔熙析西硒矽晰嘻吸锡牺�".split("");
- 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];}
- D[207] = "�����������������������������������������������������������������������������������������������������������������������������������������������������������������稀息希悉膝夕惜熄烯溪汐犀檄袭席习媳喜铣洗系隙戏细瞎虾匣霞辖暇峡侠狭下厦夏吓掀锨先仙鲜纤咸贤衔舷闲涎弦嫌显险现献县腺馅羡宪陷限线相厢镶香箱襄湘乡翔祥详想响享项巷橡像向象萧硝霄削哮嚣销消宵淆晓�".split("");
- 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];}
- D[208] = "�����������������������������������������������������������������������������������������������������������������������������������������������������������������小孝校肖啸笑效楔些歇蝎鞋协挟携邪斜胁谐写械卸蟹懈泄泻谢屑薪芯锌欣辛新忻心信衅星腥猩惺兴刑型形邢行醒幸杏性姓兄凶胸匈汹雄熊休修羞朽嗅锈秀袖绣墟戌需虚嘘须徐许蓄酗叙旭序畜恤絮婿绪续轩喧宣悬旋玄�".split("");
- 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];}
- D[209] = "�����������������������������������������������������������������������������������������������������������������������������������������������������������������选癣眩绚靴薛学穴雪血勋熏循旬询寻驯巡殉汛训讯逊迅压押鸦鸭呀丫芽牙蚜崖衙涯雅哑亚讶焉咽阉烟淹盐严研蜒岩延言颜阎炎沿奄掩眼衍演艳堰燕厌砚雁唁彦焰宴谚验殃央鸯秧杨扬佯疡羊洋阳氧仰痒养样漾邀腰妖瑶�".split("");
- 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];}
- D[210] = "�����������������������������������������������������������������������������������������������������������������������������������������������������������������摇尧遥窑谣姚咬舀药要耀椰噎耶爷野冶也页掖业叶曳腋夜液一壹医揖铱依伊衣颐夷遗移仪胰疑沂宜姨彝椅蚁倚已乙矣以艺抑易邑屹亿役臆逸肄疫亦裔意毅忆义益溢诣议谊译异翼翌绎茵荫因殷音阴姻吟银淫寅饮尹引隐�".split("");
- 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];}
- D[211] = "�����������������������������������������������������������������������������������������������������������������������������������������������������������������印英樱婴鹰应缨莹萤营荧蝇迎赢盈影颖硬映哟拥佣臃痈庸雍踊蛹咏泳涌永恿勇用幽优悠忧尤由邮铀犹油游酉有友右佑釉诱又幼迂淤于盂榆虞愚舆余俞逾鱼愉渝渔隅予娱雨与屿禹宇语羽玉域芋郁吁遇喻峪御愈欲狱育誉�".split("");
- 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];}
- D[212] = "�����������������������������������������������������������������������������������������������������������������������������������������������������������������浴寓裕预豫驭鸳渊冤元垣袁原援辕园员圆猿源缘远苑愿怨院曰约越跃钥岳粤月悦阅耘云郧匀陨允运蕴酝晕韵孕匝砸杂栽哉灾宰载再在咱攒暂赞赃脏葬遭糟凿藻枣早澡蚤躁噪造皂灶燥责择则泽贼怎增憎曾赠扎喳渣札轧�".split("");
- 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];}
- D[213] = "�����������������������������������������������������������������������������������������������������������������������������������������������������������������铡闸眨栅榨咋乍炸诈摘斋宅窄债寨瞻毡詹粘沾盏斩辗崭展蘸栈占战站湛绽樟章彰漳张掌涨杖丈帐账仗胀瘴障招昭找沼赵照罩兆肇召遮折哲蛰辙者锗蔗这浙珍斟真甄砧臻贞针侦枕疹诊震振镇阵蒸挣睁征狰争怔整拯正政�".split("");
- 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];}
- D[214] = "�����������������������������������������������������������������������������������������������������������������������������������������������������������������帧症郑证芝枝支吱蜘知肢脂汁之织职直植殖执值侄址指止趾只旨纸志挚掷至致置帜峙制智秩稚质炙痔滞治窒中盅忠钟衷终种肿重仲众舟周州洲诌粥轴肘帚咒皱宙昼骤珠株蛛朱猪诸诛逐竹烛煮拄瞩嘱主著柱助蛀贮铸筑�".split("");
- 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];}
- D[215] = "�����������������������������������������������������������������������������������������������������������������������������������������������������������������住注祝驻抓爪拽专砖转撰赚篆桩庄装妆撞壮状椎锥追赘坠缀谆准捉拙卓桌琢茁酌啄着灼浊兹咨资姿滋淄孜紫仔籽滓子自渍字鬃棕踪宗综总纵邹走奏揍租足卒族祖诅阻组钻纂嘴醉最罪尊遵昨左佐柞做作坐座������".split("");
- 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];}
- D[216] = "�����������������������������������������������������������������������������������������������������������������������������������������������������������������亍丌兀丐廿卅丕亘丞鬲孬噩丨禺丿匕乇夭爻卮氐囟胤馗毓睾鼗丶亟鼐乜乩亓芈孛啬嘏仄厍厝厣厥厮靥赝匚叵匦匮匾赜卦卣刂刈刎刭刳刿剀剌剞剡剜蒯剽劂劁劐劓冂罔亻仃仉仂仨仡仫仞伛仳伢佤仵伥伧伉伫佞佧攸佚佝�".split("");
- 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];}
- D[217] = "�����������������������������������������������������������������������������������������������������������������������������������������������������������������佟佗伲伽佶佴侑侉侃侏佾佻侪佼侬侔俦俨俪俅俚俣俜俑俟俸倩偌俳倬倏倮倭俾倜倌倥倨偾偃偕偈偎偬偻傥傧傩傺僖儆僭僬僦僮儇儋仝氽佘佥俎龠汆籴兮巽黉馘冁夔勹匍訇匐凫夙兕亠兖亳衮袤亵脔裒禀嬴蠃羸冫冱冽冼�".split("");
- 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];}
- D[218] = "�����������������������������������������������������������������������������������������������������������������������������������������������������������������凇冖冢冥讠讦讧讪讴讵讷诂诃诋诏诎诒诓诔诖诘诙诜诟诠诤诨诩诮诰诳诶诹诼诿谀谂谄谇谌谏谑谒谔谕谖谙谛谘谝谟谠谡谥谧谪谫谮谯谲谳谵谶卩卺阝阢阡阱阪阽阼陂陉陔陟陧陬陲陴隈隍隗隰邗邛邝邙邬邡邴邳邶邺�".split("");
- 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];}
- D[219] = "�����������������������������������������������������������������������������������������������������������������������������������������������������������������邸邰郏郅邾郐郄郇郓郦郢郜郗郛郫郯郾鄄鄢鄞鄣鄱鄯鄹酃酆刍奂劢劬劭劾哿勐勖勰叟燮矍廴凵凼鬯厶弁畚巯坌垩垡塾墼壅壑圩圬圪圳圹圮圯坜圻坂坩垅坫垆坼坻坨坭坶坳垭垤垌垲埏垧垴垓垠埕埘埚埙埒垸埴埯埸埤埝�".split("");
- 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];}
- D[220] = "�����������������������������������������������������������������������������������������������������������������������������������������������������������������堋堍埽埭堀堞堙塄堠塥塬墁墉墚墀馨鼙懿艹艽艿芏芊芨芄芎芑芗芙芫芸芾芰苈苊苣芘芷芮苋苌苁芩芴芡芪芟苄苎芤苡茉苷苤茏茇苜苴苒苘茌苻苓茑茚茆茔茕苠苕茜荑荛荜茈莒茼茴茱莛荞茯荏荇荃荟荀茗荠茭茺茳荦荥�".split("");
- 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];}
- D[221] = "�����������������������������������������������������������������������������������������������������������������������������������������������������������������荨茛荩荬荪荭荮莰荸莳莴莠莪莓莜莅荼莶莩荽莸荻莘莞莨莺莼菁萁菥菘堇萘萋菝菽菖萜萸萑萆菔菟萏萃菸菹菪菅菀萦菰菡葜葑葚葙葳蒇蒈葺蒉葸萼葆葩葶蒌蒎萱葭蓁蓍蓐蓦蒽蓓蓊蒿蒺蓠蒡蒹蒴蒗蓥蓣蔌甍蔸蓰蔹蔟蔺�".split("");
- 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];}
- D[222] = "�����������������������������������������������������������������������������������������������������������������������������������������������������������������蕖蔻蓿蓼蕙蕈蕨蕤蕞蕺瞢蕃蕲蕻薤薨薇薏蕹薮薜薅薹薷薰藓藁藜藿蘧蘅蘩蘖蘼廾弈夼奁耷奕奚奘匏尢尥尬尴扌扪抟抻拊拚拗拮挢拶挹捋捃掭揶捱捺掎掴捭掬掊捩掮掼揲揸揠揿揄揞揎摒揆掾摅摁搋搛搠搌搦搡摞撄摭撖�".split("");
- 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];}
- D[223] = "�����������������������������������������������������������������������������������������������������������������������������������������������������������������摺撷撸撙撺擀擐擗擤擢攉攥攮弋忒甙弑卟叱叽叩叨叻吒吖吆呋呒呓呔呖呃吡呗呙吣吲咂咔呷呱呤咚咛咄呶呦咝哐咭哂咴哒咧咦哓哔呲咣哕咻咿哌哙哚哜咩咪咤哝哏哞唛哧唠哽唔哳唢唣唏唑唧唪啧喏喵啉啭啁啕唿啐唼�".split("");
- 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];}
- D[224] = "�����������������������������������������������������������������������������������������������������������������������������������������������������������������唷啖啵啶啷唳唰啜喋嗒喃喱喹喈喁喟啾嗖喑啻嗟喽喾喔喙嗪嗷嗉嘟嗑嗫嗬嗔嗦嗝嗄嗯嗥嗲嗳嗌嗍嗨嗵嗤辔嘞嘈嘌嘁嘤嘣嗾嘀嘧嘭噘嘹噗嘬噍噢噙噜噌噔嚆噤噱噫噻噼嚅嚓嚯囔囗囝囡囵囫囹囿圄圊圉圜帏帙帔帑帱帻帼�".split("");
- 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];}
- D[225] = "�����������������������������������������������������������������������������������������������������������������������������������������������������������������帷幄幔幛幞幡岌屺岍岐岖岈岘岙岑岚岜岵岢岽岬岫岱岣峁岷峄峒峤峋峥崂崃崧崦崮崤崞崆崛嵘崾崴崽嵬嵛嵯嵝嵫嵋嵊嵩嵴嶂嶙嶝豳嶷巅彳彷徂徇徉後徕徙徜徨徭徵徼衢彡犭犰犴犷犸狃狁狎狍狒狨狯狩狲狴狷猁狳猃狺�".split("");
- 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];}
- D[226] = "�����������������������������������������������������������������������������������������������������������������������������������������������������������������狻猗猓猡猊猞猝猕猢猹猥猬猸猱獐獍獗獠獬獯獾舛夥飧夤夂饣饧饨饩饪饫饬饴饷饽馀馄馇馊馍馐馑馓馔馕庀庑庋庖庥庠庹庵庾庳赓廒廑廛廨廪膺忄忉忖忏怃忮怄忡忤忾怅怆忪忭忸怙怵怦怛怏怍怩怫怊怿怡恸恹恻恺恂�".split("");
- 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];}
- D[227] = "�����������������������������������������������������������������������������������������������������������������������������������������������������������������恪恽悖悚悭悝悃悒悌悛惬悻悱惝惘惆惚悴愠愦愕愣惴愀愎愫慊慵憬憔憧憷懔懵忝隳闩闫闱闳闵闶闼闾阃阄阆阈阊阋阌阍阏阒阕阖阗阙阚丬爿戕氵汔汜汊沣沅沐沔沌汨汩汴汶沆沩泐泔沭泷泸泱泗沲泠泖泺泫泮沱泓泯泾�".split("");
- 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];}
- D[228] = "�����������������������������������������������������������������������������������������������������������������������������������������������������������������洹洧洌浃浈洇洄洙洎洫浍洮洵洚浏浒浔洳涑浯涞涠浞涓涔浜浠浼浣渚淇淅淞渎涿淠渑淦淝淙渖涫渌涮渫湮湎湫溲湟溆湓湔渲渥湄滟溱溘滠漭滢溥溧溽溻溷滗溴滏溏滂溟潢潆潇漤漕滹漯漶潋潴漪漉漩澉澍澌潸潲潼潺濑�".split("");
- 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];}
- D[229] = "�����������������������������������������������������������������������������������������������������������������������������������������������������������������濉澧澹澶濂濡濮濞濠濯瀚瀣瀛瀹瀵灏灞宀宄宕宓宥宸甯骞搴寤寮褰寰蹇謇辶迓迕迥迮迤迩迦迳迨逅逄逋逦逑逍逖逡逵逶逭逯遄遑遒遐遨遘遢遛暹遴遽邂邈邃邋彐彗彖彘尻咫屐屙孱屣屦羼弪弩弭艴弼鬻屮妁妃妍妩妪妣�".split("");
- 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];}
- D[230] = "�����������������������������������������������������������������������������������������������������������������������������������������������������������������妗姊妫妞妤姒妲妯姗妾娅娆姝娈姣姘姹娌娉娲娴娑娣娓婀婧婊婕娼婢婵胬媪媛婷婺媾嫫媲嫒嫔媸嫠嫣嫱嫖嫦嫘嫜嬉嬗嬖嬲嬷孀尕尜孚孥孳孑孓孢驵驷驸驺驿驽骀骁骅骈骊骐骒骓骖骘骛骜骝骟骠骢骣骥骧纟纡纣纥纨纩�".split("");
- 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];}
- D[231] = "�����������������������������������������������������������������������������������������������������������������������������������������������������������������纭纰纾绀绁绂绉绋绌绐绔绗绛绠绡绨绫绮绯绱绲缍绶绺绻绾缁缂缃缇缈缋缌缏缑缒缗缙缜缛缟缡缢缣缤缥缦缧缪缫缬缭缯缰缱缲缳缵幺畿巛甾邕玎玑玮玢玟珏珂珑玷玳珀珉珈珥珙顼琊珩珧珞玺珲琏琪瑛琦琥琨琰琮琬�".split("");
- 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];}
- D[232] = "�����������������������������������������������������������������������������������������������������������������������������������������������������������������琛琚瑁瑜瑗瑕瑙瑷瑭瑾璜璎璀璁璇璋璞璨璩璐璧瓒璺韪韫韬杌杓杞杈杩枥枇杪杳枘枧杵枨枞枭枋杷杼柰栉柘栊柩枰栌柙枵柚枳柝栀柃枸柢栎柁柽栲栳桠桡桎桢桄桤梃栝桕桦桁桧桀栾桊桉栩梵梏桴桷梓桫棂楮棼椟椠棹�".split("");
- 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];}
- D[233] = "�����������������������������������������������������������������������������������������������������������������������������������������������������������������椤棰椋椁楗棣椐楱椹楠楂楝榄楫榀榘楸椴槌榇榈槎榉楦楣楹榛榧榻榫榭槔榱槁槊槟榕槠榍槿樯槭樗樘橥槲橄樾檠橐橛樵檎橹樽樨橘橼檑檐檩檗檫猷獒殁殂殇殄殒殓殍殚殛殡殪轫轭轱轲轳轵轶轸轷轹轺轼轾辁辂辄辇辋�".split("");
- 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];}
- D[234] = "�����������������������������������������������������������������������������������������������������������������������������������������������������������������辍辎辏辘辚軎戋戗戛戟戢戡戥戤戬臧瓯瓴瓿甏甑甓攴旮旯旰昊昙杲昃昕昀炅曷昝昴昱昶昵耆晟晔晁晏晖晡晗晷暄暌暧暝暾曛曜曦曩贲贳贶贻贽赀赅赆赈赉赇赍赕赙觇觊觋觌觎觏觐觑牮犟牝牦牯牾牿犄犋犍犏犒挈挲掰�".split("");
- 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];}
- D[235] = "�����������������������������������������������������������������������������������������������������������������������������������������������������������������搿擘耄毪毳毽毵毹氅氇氆氍氕氘氙氚氡氩氤氪氲攵敕敫牍牒牖爰虢刖肟肜肓肼朊肽肱肫肭肴肷胧胨胩胪胛胂胄胙胍胗朐胝胫胱胴胭脍脎胲胼朕脒豚脶脞脬脘脲腈腌腓腴腙腚腱腠腩腼腽腭腧塍媵膈膂膑滕膣膪臌朦臊膻�".split("");
- 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];}
- D[236] = "�����������������������������������������������������������������������������������������������������������������������������������������������������������������臁膦欤欷欹歃歆歙飑飒飓飕飙飚殳彀毂觳斐齑斓於旆旄旃旌旎旒旖炀炜炖炝炻烀炷炫炱烨烊焐焓焖焯焱煳煜煨煅煲煊煸煺熘熳熵熨熠燠燔燧燹爝爨灬焘煦熹戾戽扃扈扉礻祀祆祉祛祜祓祚祢祗祠祯祧祺禅禊禚禧禳忑忐�".split("");
- 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];}
- D[237] = "�����������������������������������������������������������������������������������������������������������������������������������������������������������������怼恝恚恧恁恙恣悫愆愍慝憩憝懋懑戆肀聿沓泶淼矶矸砀砉砗砘砑斫砭砜砝砹砺砻砟砼砥砬砣砩硎硭硖硗砦硐硇硌硪碛碓碚碇碜碡碣碲碹碥磔磙磉磬磲礅磴礓礤礞礴龛黹黻黼盱眄眍盹眇眈眚眢眙眭眦眵眸睐睑睇睃睚睨�".split("");
- 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];}
- D[238] = "�����������������������������������������������������������������������������������������������������������������������������������������������������������������睢睥睿瞍睽瞀瞌瞑瞟瞠瞰瞵瞽町畀畎畋畈畛畲畹疃罘罡罟詈罨罴罱罹羁罾盍盥蠲钅钆钇钋钊钌钍钏钐钔钗钕钚钛钜钣钤钫钪钭钬钯钰钲钴钶钷钸钹钺钼钽钿铄铈铉铊铋铌铍铎铐铑铒铕铖铗铙铘铛铞铟铠铢铤铥铧铨铪�".split("");
- 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];}
- D[239] = "�����������������������������������������������������������������������������������������������������������������������������������������������������������������铩铫铮铯铳铴铵铷铹铼铽铿锃锂锆锇锉锊锍锎锏锒锓锔锕锖锘锛锝锞锟锢锪锫锩锬锱锲锴锶锷锸锼锾锿镂锵镄镅镆镉镌镎镏镒镓镔镖镗镘镙镛镞镟镝镡镢镤镥镦镧镨镩镪镫镬镯镱镲镳锺矧矬雉秕秭秣秫稆嵇稃稂稞稔�".split("");
- 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];}
- D[240] = "�����������������������������������������������������������������������������������������������������������������������������������������������������������������稹稷穑黏馥穰皈皎皓皙皤瓞瓠甬鸠鸢鸨鸩鸪鸫鸬鸲鸱鸶鸸鸷鸹鸺鸾鹁鹂鹄鹆鹇鹈鹉鹋鹌鹎鹑鹕鹗鹚鹛鹜鹞鹣鹦鹧鹨鹩鹪鹫鹬鹱鹭鹳疒疔疖疠疝疬疣疳疴疸痄疱疰痃痂痖痍痣痨痦痤痫痧瘃痱痼痿瘐瘀瘅瘌瘗瘊瘥瘘瘕瘙�".split("");
- 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];}
- D[241] = "�����������������������������������������������������������������������������������������������������������������������������������������������������������������瘛瘼瘢瘠癀瘭瘰瘿瘵癃瘾瘳癍癞癔癜癖癫癯翊竦穸穹窀窆窈窕窦窠窬窨窭窳衤衩衲衽衿袂袢裆袷袼裉裢裎裣裥裱褚裼裨裾裰褡褙褓褛褊褴褫褶襁襦襻疋胥皲皴矜耒耔耖耜耠耢耥耦耧耩耨耱耋耵聃聆聍聒聩聱覃顸颀颃�".split("");
- 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];}
- D[242] = "�����������������������������������������������������������������������������������������������������������������������������������������������������������������颉颌颍颏颔颚颛颞颟颡颢颥颦虍虔虬虮虿虺虼虻蚨蚍蚋蚬蚝蚧蚣蚪蚓蚩蚶蛄蚵蛎蚰蚺蚱蚯蛉蛏蚴蛩蛱蛲蛭蛳蛐蜓蛞蛴蛟蛘蛑蜃蜇蛸蜈蜊蜍蜉蜣蜻蜞蜥蜮蜚蜾蝈蜴蜱蜩蜷蜿螂蜢蝽蝾蝻蝠蝰蝌蝮螋蝓蝣蝼蝤蝙蝥螓螯螨蟒�".split("");
- 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];}
- D[243] = "�����������������������������������������������������������������������������������������������������������������������������������������������������������������蟆螈螅螭螗螃螫蟥螬螵螳蟋蟓螽蟑蟀蟊蟛蟪蟠蟮蠖蠓蟾蠊蠛蠡蠹蠼缶罂罄罅舐竺竽笈笃笄笕笊笫笏筇笸笪笙笮笱笠笥笤笳笾笞筘筚筅筵筌筝筠筮筻筢筲筱箐箦箧箸箬箝箨箅箪箜箢箫箴篑篁篌篝篚篥篦篪簌篾篼簏簖簋�".split("");
- 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];}
- D[244] = "�����������������������������������������������������������������������������������������������������������������������������������������������������������������簟簪簦簸籁籀臾舁舂舄臬衄舡舢舣舭舯舨舫舸舻舳舴舾艄艉艋艏艚艟艨衾袅袈裘裟襞羝羟羧羯羰羲籼敉粑粝粜粞粢粲粼粽糁糇糌糍糈糅糗糨艮暨羿翎翕翥翡翦翩翮翳糸絷綦綮繇纛麸麴赳趄趔趑趱赧赭豇豉酊酐酎酏酤�".split("");
- 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];}
- D[245] = "�����������������������������������������������������������������������������������������������������������������������������������������������������������������酢酡酰酩酯酽酾酲酴酹醌醅醐醍醑醢醣醪醭醮醯醵醴醺豕鹾趸跫踅蹙蹩趵趿趼趺跄跖跗跚跞跎跏跛跆跬跷跸跣跹跻跤踉跽踔踝踟踬踮踣踯踺蹀踹踵踽踱蹉蹁蹂蹑蹒蹊蹰蹶蹼蹯蹴躅躏躔躐躜躞豸貂貊貅貘貔斛觖觞觚觜�".split("");
- 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];}
- D[246] = "�����������������������������������������������������������������������������������������������������������������������������������������������������������������觥觫觯訾謦靓雩雳雯霆霁霈霏霎霪霭霰霾龀龃龅龆龇龈龉龊龌黾鼋鼍隹隼隽雎雒瞿雠銎銮鋈錾鍪鏊鎏鐾鑫鱿鲂鲅鲆鲇鲈稣鲋鲎鲐鲑鲒鲔鲕鲚鲛鲞鲟鲠鲡鲢鲣鲥鲦鲧鲨鲩鲫鲭鲮鲰鲱鲲鲳鲴鲵鲶鲷鲺鲻鲼鲽鳄鳅鳆鳇鳊鳋�".split("");
- 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];}
- D[247] = "�����������������������������������������������������������������������������������������������������������������������������������������������������������������鳌鳍鳎鳏鳐鳓鳔鳕鳗鳘鳙鳜鳝鳟鳢靼鞅鞑鞒鞔鞯鞫鞣鞲鞴骱骰骷鹘骶骺骼髁髀髅髂髋髌髑魅魃魇魉魈魍魑飨餍餮饕饔髟髡髦髯髫髻髭髹鬈鬏鬓鬟鬣麽麾縻麂麇麈麋麒鏖麝麟黛黜黝黠黟黢黩黧黥黪黯鼢鼬鼯鼹鼷鼽鼾齄�".split("");
- 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];}
- return {"enc": e, "dec": d }; })();
- 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 }; })();
- 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 }; })();
- 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 }; })();
- 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 }; })();
- // eslint-disable-next-line no-undef
- if ( true && module.exports && typeof DO_NOT_EXPORT_CODEPAGE === 'undefined') module.exports = cptable;
- /*! cputils.js (C) 2013-present SheetJS -- http://sheetjs.com */
- /* vim: set ft=javascript: */
- /*jshint newcap: false */
- (function(root, factory) {
- /*jshint ignore:start */
- /*eslint-disable */
- "use strict";
- if(typeof cptable === "undefined") {
- if(true){
- var cpt = cptable;
- if ( true && module.exports && typeof DO_NOT_EXPORT_CODEPAGE === 'undefined') module.exports = factory(cpt);
- else root.cptable = factory(cpt);
- } else {}
- } else cptable = factory(cptable);
- /*eslint-enable */
- /*jshint ignore:end */
- }(this, function(cpt){
- "use strict";
- /*global module, Buffer */
- var magic = {
- "1200":"utf16le",
- "1201":"utf16be",
- "12000":"utf32le",
- "12001":"utf32be",
- "16969":"utf64le",
- "20127":"ascii",
- "65000":"utf7",
- "65001":"utf8"
- };
-
- var sbcs_cache = [874,1250,1251,1252,1253,1254,1255,1256,10000];
- var dbcs_cache = [932,936,949,950];
- var magic_cache = [65001];
- var magic_decode = {};
- var magic_encode = {};
- var cpdcache = {};
- var cpecache = {};
-
- var sfcc = function sfcc(x) { return String.fromCharCode(x); };
- var cca = function cca(x) { return x.charCodeAt(0); };
-
- var has_buf = (typeof Buffer !== 'undefined');
- var Buffer_from = function(){};
- if(has_buf) {
- var nbfs = !Buffer.from;
- if(!nbfs) try { Buffer.from("foo", "utf8"); } catch(e) { nbfs = true; }
- Buffer_from = nbfs ? function(buf, enc) { return (enc) ? new Buffer(buf, enc) : new Buffer(buf); } : Buffer.from.bind(Buffer);
- // $FlowIgnore
- if(!Buffer.allocUnsafe) Buffer.allocUnsafe = function(n) { return new Buffer(n); };
-
- var mdl = 1024, mdb = Buffer.allocUnsafe(mdl);
- var make_EE = function make_EE(E){
- var EE = Buffer.allocUnsafe(65536);
- for(var i = 0; i < 65536;++i) EE[i] = 0;
- var keys = Object.keys(E), len = keys.length;
- for(var ee = 0, e = keys[ee]; ee < len; ++ee) {
- if(!(e = keys[ee])) continue;
- EE[e.charCodeAt(0)] = E[e];
- }
- return EE;
- };
- var sbcs_encode = function make_sbcs_encode(cp) {
- var EE = make_EE(cpt[cp].enc);
- return function sbcs_e(data, ofmt) {
- var len = data.length;
- var out, i=0, j=0, D=0, w=0;
- if(typeof data === 'string') {
- out = Buffer.allocUnsafe(len);
- for(i = 0; i < len; ++i) out[i] = EE[data.charCodeAt(i)];
- } else if(Buffer.isBuffer(data)) {
- out = Buffer.allocUnsafe(2*len);
- j = 0;
- for(i = 0; i < len; ++i) {
- D = data[i];
- if(D < 128) out[j++] = EE[D];
- else if(D < 224) { out[j++] = EE[((D&31)<<6)+(data[i+1]&63)]; ++i; }
- else if(D < 240) { out[j++] = EE[((D&15)<<12)+((data[i+1]&63)<<6)+(data[i+2]&63)]; i+=2; }
- else {
- w = ((D&7)<<18)+((data[i+1]&63)<<12)+((data[i+2]&63)<<6)+(data[i+3]&63); i+=3;
- if(w < 65536) out[j++] = EE[w];
- else { w -= 65536; out[j++] = EE[0xD800 + ((w>>10)&1023)]; out[j++] = EE[0xDC00 + (w&1023)]; }
- }
- }
- out = out.slice(0,j);
- } else {
- out = Buffer.allocUnsafe(len);
- for(i = 0; i < len; ++i) out[i] = EE[data[i].charCodeAt(0)];
- }
- if(!ofmt || ofmt === 'buf') return out;
- if(ofmt !== 'arr') return out.toString('binary');
- return [].slice.call(out);
- };
- };
- var sbcs_decode = function make_sbcs_decode(cp) {
- var D = cpt[cp].dec;
- var DD = Buffer.allocUnsafe(131072), d=0, c="";
- for(d=0;d<D.length;++d) {
- if(!(c=D[d])) continue;
- var w = c.charCodeAt(0);
- DD[2*d] = w&255; DD[2*d+1] = w>>8;
- }
- return function sbcs_d(data) {
- var len = data.length, i=0, j=0;
- if(2 * len > mdl) { mdl = 2 * len; mdb = Buffer.allocUnsafe(mdl); }
- if(Buffer.isBuffer(data)) {
- for(i = 0; i < len; i++) {
- j = 2*data[i];
- mdb[2*i] = DD[j]; mdb[2*i+1] = DD[j+1];
- }
- } else if(typeof data === "string") {
- for(i = 0; i < len; i++) {
- j = 2*data.charCodeAt(i);
- mdb[2*i] = DD[j]; mdb[2*i+1] = DD[j+1];
- }
- } else {
- for(i = 0; i < len; i++) {
- j = 2*data[i];
- mdb[2*i] = DD[j]; mdb[2*i+1] = DD[j+1];
- }
- }
- return mdb.slice(0, 2 * len).toString('ucs2');
- };
- };
- var dbcs_encode = function make_dbcs_encode(cp) {
- var E = cpt[cp].enc;
- var EE = Buffer.allocUnsafe(131072);
- for(var i = 0; i < 131072; ++i) EE[i] = 0;
- var keys = Object.keys(E);
- for(var ee = 0, e = keys[ee]; ee < keys.length; ++ee) {
- if(!(e = keys[ee])) continue;
- var f = e.charCodeAt(0);
- EE[2*f] = E[e] & 255; EE[2*f+1] = E[e]>>8;
- }
- return function dbcs_e(data, ofmt) {
- var len = data.length, out = Buffer.allocUnsafe(2*len), i=0, j=0, jj=0, k=0, D=0;
- if(typeof data === 'string') {
- for(i = k = 0; i < len; ++i) {
- j = data.charCodeAt(i)*2;
- out[k++] = EE[j+1] || EE[j]; if(EE[j+1] > 0) out[k++] = EE[j];
- }
- out = out.slice(0,k);
- } else if(Buffer.isBuffer(data)) {
- for(i = k = 0; i < len; ++i) {
- D = data[i];
- if(D < 128) j = D;
- else if(D < 224) { j = ((D&31)<<6)+(data[i+1]&63); ++i; }
- else if(D < 240) { j = ((D&15)<<12)+((data[i+1]&63)<<6)+(data[i+2]&63); i+=2; }
- else { j = ((D&7)<<18)+((data[i+1]&63)<<12)+((data[i+2]&63)<<6)+(data[i+3]&63); i+=3; }
- if(j<65536) { j*=2; out[k++] = EE[j+1] || EE[j]; if(EE[j+1] > 0) out[k++] = EE[j]; }
- else { jj = j-65536;
- j=2*(0xD800 + ((jj>>10)&1023)); out[k++] = EE[j+1] || EE[j]; if(EE[j+1] > 0) out[k++] = EE[j];
- j=2*(0xDC00 + (jj&1023)); out[k++] = EE[j+1] || EE[j]; if(EE[j+1] > 0) out[k++] = EE[j];
- }
- }
- out = out.slice(0,k);
- } else {
- for(i = k = 0; i < len; i++) {
- j = data[i].charCodeAt(0)*2;
- out[k++] = EE[j+1] || EE[j]; if(EE[j+1] > 0) out[k++] = EE[j];
- }
- }
- if(!ofmt || ofmt === 'buf') return out;
- if(ofmt !== 'arr') return out.toString('binary');
- return [].slice.call(out);
- };
- };
- var dbcs_decode = function make_dbcs_decode(cp) {
- var D = cpt[cp].dec;
- var DD = Buffer.allocUnsafe(131072), d=0, c, w=0, j=0, i=0;
- for(i = 0; i < 65536; ++i) { DD[2*i] = 0xFF; DD[2*i+1] = 0xFD;}
- for(d = 0; d < D.length; ++d) {
- if(!(c=D[d])) continue;
- w = c.charCodeAt(0);
- j = 2*d;
- DD[j] = w&255; DD[j+1] = w>>8;
- }
- return function dbcs_d(data) {
- var len = data.length, out = Buffer.allocUnsafe(2*len), i=0, j=0, k=0;
- if(Buffer.isBuffer(data)) {
- for(i = 0; i < len; i++) {
- j = 2*data[i];
- if(DD[j]===0xFF && DD[j+1]===0xFD) { j=2*((data[i]<<8)+data[i+1]); ++i; }
- out[k++] = DD[j]; out[k++] = DD[j+1];
- }
- } else if(typeof data === "string") {
- for(i = 0; i < len; i++) {
- j = 2*data.charCodeAt(i);
- if(DD[j]===0xFF && DD[j+1]===0xFD) { j=2*((data.charCodeAt(i)<<8)+data.charCodeAt(i+1)); ++i; }
- out[k++] = DD[j]; out[k++] = DD[j+1];
- }
- } else {
- for(i = 0; i < len; i++) {
- j = 2*data[i];
- if(DD[j]===0xFF && DD[j+1]===0xFD) { j=2*((data[i]<<8)+data[i+1]); ++i; }
- out[k++] = DD[j]; out[k++] = DD[j+1];
- }
- }
- return out.slice(0,k).toString('ucs2');
- };
- };
- magic_decode[65001] = function utf8_d(data) {
- if(typeof data === "string") return utf8_d(data.split("").map(cca));
- var len = data.length, w = 0, ww = 0;
- if(4 * len > mdl) { mdl = 4 * len; mdb = Buffer.allocUnsafe(mdl); }
- var i = 0;
- if(len >= 3 && data[0] == 0xEF) if(data[1] == 0xBB && data[2] == 0xBF) i = 3;
- for(var j = 1, k = 0, D = 0; i < len; i+=j) {
- j = 1; D = data[i];
- if(D < 128) w = D;
- else if(D < 224) { w=(D&31)*64+(data[i+1]&63); j=2; }
- else if(D < 240) { w=((D&15)<<12)+(data[i+1]&63)*64+(data[i+2]&63); j=3; }
- else { w=(D&7)*262144+((data[i+1]&63)<<12)+(data[i+2]&63)*64+(data[i+3]&63); j=4; }
- if(w < 65536) { mdb[k++] = w&255; mdb[k++] = w>>8; }
- else {
- w -= 65536; ww = 0xD800 + ((w>>10)&1023); w = 0xDC00 + (w&1023);
- mdb[k++] = ww&255; mdb[k++] = ww>>>8; mdb[k++] = w&255; mdb[k++] = (w>>>8)&255;
- }
- }
- return mdb.slice(0,k).toString('ucs2');
- };
- magic_encode[65001] = function utf8_e(data, ofmt) {
- if(has_buf && Buffer.isBuffer(data)) {
- if(!ofmt || ofmt === 'buf') return data;
- if(ofmt !== 'arr') return data.toString('binary');
- return [].slice.call(data);
- }
- var len = data.length, w = 0, ww = 0, j = 0;
- var direct = typeof data === "string";
- if(4 * len > mdl) { mdl = 4 * len; mdb = Buffer.allocUnsafe(mdl); }
- for(var i = 0; i < len; ++i) {
- w = direct ? data.charCodeAt(i) : data[i].charCodeAt(0);
- if(w <= 0x007F) mdb[j++] = w;
- else if(w <= 0x07FF) {
- mdb[j++] = 192 + (w >> 6);
- mdb[j++] = 128 + (w&63);
- } else if(w >= 0xD800 && w <= 0xDFFF) {
- w -= 0xD800; ++i;
- ww = (direct ? data.charCodeAt(i) : data[i].charCodeAt(0)) - 0xDC00 + (w << 10);
- mdb[j++] = 240 + ((ww>>>18) & 0x07);
- mdb[j++] = 144 + ((ww>>>12) & 0x3F);
- mdb[j++] = 128 + ((ww>>>6) & 0x3F);
- mdb[j++] = 128 + (ww & 0x3F);
- } else {
- mdb[j++] = 224 + (w >> 12);
- mdb[j++] = 128 + ((w >> 6)&63);
- mdb[j++] = 128 + (w&63);
- }
- }
- if(!ofmt || ofmt === 'buf') return mdb.slice(0,j);
- if(ofmt !== 'arr') return mdb.slice(0,j).toString('binary');
- return [].slice.call(mdb, 0, j);
- };
- }
-
- var encache = function encache() {
- if(has_buf) {
- if(cpdcache[sbcs_cache[0]]) return;
- var i=0, s=0;
- for(i = 0; i < sbcs_cache.length; ++i) {
- s = sbcs_cache[i];
- if(cpt[s]) {
- cpdcache[s] = sbcs_decode(s);
- cpecache[s] = sbcs_encode(s);
- }
- }
- for(i = 0; i < dbcs_cache.length; ++i) {
- s = dbcs_cache[i];
- if(cpt[s]) {
- cpdcache[s] = dbcs_decode(s);
- cpecache[s] = dbcs_encode(s);
- }
- }
- for(i = 0; i < magic_cache.length; ++i) {
- s = magic_cache[i];
- if(magic_decode[s]) cpdcache[s] = magic_decode[s];
- if(magic_encode[s]) cpecache[s] = magic_encode[s];
- }
- }
- };
- var null_enc = function(data, ofmt) { void ofmt; return ""; };
- var cp_decache = function cp_decache(cp) { delete cpdcache[cp]; delete cpecache[cp]; };
- var decache = function decache() {
- if(has_buf) {
- if(!cpdcache[sbcs_cache[0]]) return;
- sbcs_cache.forEach(cp_decache);
- dbcs_cache.forEach(cp_decache);
- magic_cache.forEach(cp_decache);
- }
- last_enc = null_enc; last_cp = 0;
- };
- var cache = {
- encache: encache,
- decache: decache,
- sbcs: sbcs_cache,
- dbcs: dbcs_cache
- };
-
- encache();
-
- var BM = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
- var SetD = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789'(),-./:?";
- var last_enc = null_enc, last_cp = 0;
- var encode = function encode(cp, data, ofmt) {
- if(cp === last_cp && last_enc) { return last_enc(data, ofmt); }
- if(cpecache[cp]) { last_enc = cpecache[last_cp=cp]; return last_enc(data, ofmt); }
- if(has_buf && Buffer.isBuffer(data)) data = data.toString('utf8');
- var len = data.length;
- var out = has_buf ? Buffer.allocUnsafe(4*len) : [], w=0, i=0, j = 0, ww=0;
- var C = cpt[cp], E, M = "";
- var isstr = typeof data === 'string';
- if(C && (E=C.enc)) for(i = 0; i < len; ++i, ++j) {
- w = E[isstr? data.charAt(i) : data[i]];
- if(w > 255) {
- out[j] = w>>8;
- out[++j] = w&255;
- } else out[j] = w&255;
- }
- else if((M=magic[cp])) switch(M) {
- case "utf8":
- if(has_buf && isstr) { out = Buffer_from(data, M); j = out.length; break; }
- for(i = 0; i < len; ++i, ++j) {
- w = isstr ? data.charCodeAt(i) : data[i].charCodeAt(0);
- if(w <= 0x007F) out[j] = w;
- else if(w <= 0x07FF) {
- out[j] = 192 + (w >> 6);
- out[++j] = 128 + (w&63);
- } else if(w >= 0xD800 && w <= 0xDFFF) {
- w -= 0xD800;
- ww = (isstr ? data.charCodeAt(++i) : data[++i].charCodeAt(0)) - 0xDC00 + (w << 10);
- out[j] = 240 + ((ww>>>18) & 0x07);
- out[++j] = 144 + ((ww>>>12) & 0x3F);
- out[++j] = 128 + ((ww>>>6) & 0x3F);
- out[++j] = 128 + (ww & 0x3F);
- } else {
- out[j] = 224 + (w >> 12);
- out[++j] = 128 + ((w >> 6)&63);
- out[++j] = 128 + (w&63);
- }
- }
- break;
- case "ascii":
- if(has_buf && typeof data === "string") { out = Buffer_from(data, M); j = out.length; break; }
- for(i = 0; i < len; ++i, ++j) {
- w = isstr ? data.charCodeAt(i) : data[i].charCodeAt(0);
- if(w <= 0x007F) out[j] = w;
- else throw new Error("bad ascii " + w);
- }
- break;
- case "utf16le":
- if(has_buf && typeof data === "string") { out = Buffer_from(data, M); j = out.length; break; }
- for(i = 0; i < len; ++i) {
- w = isstr ? data.charCodeAt(i) : data[i].charCodeAt(0);
- out[j++] = w&255;
- out[j++] = w>>8;
- }
- break;
- case "utf16be":
- for(i = 0; i < len; ++i) {
- w = isstr ? data.charCodeAt(i) : data[i].charCodeAt(0);
- out[j++] = w>>8;
- out[j++] = w&255;
- }
- break;
- case "utf32le":
- for(i = 0; i < len; ++i) {
- w = isstr ? data.charCodeAt(i) : data[i].charCodeAt(0);
- if(w >= 0xD800 && w <= 0xDFFF) w = 0x10000 + ((w - 0xD800) << 10) + (data[++i].charCodeAt(0) - 0xDC00);
- out[j++] = w&255; w >>= 8;
- out[j++] = w&255; w >>= 8;
- out[j++] = w&255; w >>= 8;
- out[j++] = w&255;
- }
- break;
- case "utf32be":
- for(i = 0; i < len; ++i) {
- w = isstr ? data.charCodeAt(i) : data[i].charCodeAt(0);
- if(w >= 0xD800 && w <= 0xDFFF) w = 0x10000 + ((w - 0xD800) << 10) + (data[++i].charCodeAt(0) - 0xDC00);
- out[j+3] = w&255; w >>= 8;
- out[j+2] = w&255; w >>= 8;
- out[j+1] = w&255; w >>= 8;
- out[j] = w&255;
- j+=4;
- }
- break;
- case "utf7":
- for(i = 0; i < len; i++) {
- var c = isstr ? data.charAt(i) : data[i].charAt(0);
- if(c === "+") { out[j++] = 0x2b; out[j++] = 0x2d; continue; }
- if(SetD.indexOf(c) > -1) { out[j++] = c.charCodeAt(0); continue; }
- var tt = encode(1201, c);
- out[j++] = 0x2b;
- out[j++] = BM.charCodeAt(tt[0]>>2);
- out[j++] = BM.charCodeAt(((tt[0]&0x03)<<4) + ((tt[1]||0)>>4));
- out[j++] = BM.charCodeAt(((tt[1]&0x0F)<<2) + ((tt[2]||0)>>6));
- out[j++] = 0x2d;
- }
- break;
- default: throw new Error("Unsupported magic: " + cp + " " + magic[cp]);
- }
- else throw new Error("Unrecognized CP: " + cp);
- out = out.slice(0,j);
- if(!has_buf) return (ofmt == 'str') ? (out).map(sfcc).join("") : out;
- if(!ofmt || ofmt === 'buf') return out;
- if(ofmt !== 'arr') return out.toString('binary');
- return [].slice.call(out);
- };
- var decode = function decode(cp, data) {
- var F; if((F=cpdcache[cp])) return F(data);
- if(typeof data === "string") return decode(cp, data.split("").map(cca));
- var len = data.length, out = new Array(len), s="", w=0, i=0, j=1, k=0, ww=0;
- var C = cpt[cp], D, M="";
- if(C && (D=C.dec)) {
- for(i = 0; i < len; i+=j) {
- j = 2;
- s = D[(data[i]<<8)+ data[i+1]];
- if(!s) {
- j = 1;
- s = D[data[i]];
- }
- if(!s) throw new Error('Unrecognized code: ' + data[i] + ' ' + data[i+j-1] + ' ' + i + ' ' + j + ' ' + D[data[i]]);
- out[k++] = s;
- }
- }
- else if((M=magic[cp])) switch(M) {
- case "utf8":
- if(len >= 3 && data[0] == 0xEF) if(data[1] == 0xBB && data[2] == 0xBF) i = 3;
- for(; i < len; i+=j) {
- j = 1;
- if(data[i] < 128) w = data[i];
- else if(data[i] < 224) { w=(data[i]&31)*64+(data[i+1]&63); j=2; }
- else if(data[i] < 240) { w=((data[i]&15)<<12)+(data[i+1]&63)*64+(data[i+2]&63); j=3; }
- else { w=(data[i]&7)*262144+((data[i+1]&63)<<12)+(data[i+2]&63)*64+(data[i+3]&63); j=4; }
- if(w < 65536) { out[k++] = String.fromCharCode(w); }
- else {
- w -= 65536; ww = 0xD800 + ((w>>10)&1023); w = 0xDC00 + (w&1023);
- out[k++] = String.fromCharCode(ww); out[k++] = String.fromCharCode(w);
- }
- }
- break;
- case "ascii":
- if(has_buf && Buffer.isBuffer(data)) return data.toString(M);
- for(i = 0; i < len; i++) out[i] = String.fromCharCode(data[i]);
- k = len; break;
- case "utf16le":
- if(len >= 2 && data[0] == 0xFF) if(data[1] == 0xFE) i = 2;
- if(has_buf && Buffer.isBuffer(data)) return data.toString(M);
- j = 2;
- for(; i+1 < len; i+=j) {
- out[k++] = String.fromCharCode((data[i+1]<<8) + data[i]);
- }
- break;
- case "utf16be":
- if(len >= 2 && data[0] == 0xFE) if(data[1] == 0xFF) i = 2;
- j = 2;
- for(; i+1 < len; i+=j) {
- out[k++] = String.fromCharCode((data[i]<<8) + data[i+1]);
- }
- break;
- case "utf32le":
- if(len >= 4 && data[0] == 0xFF) if(data[1] == 0xFE && data[2] === 0 && data[3] === 0) i = 4;
- j = 4;
- for(; i < len; i+=j) {
- w = (data[i+3]<<24) + (data[i+2]<<16) + (data[i+1]<<8) + (data[i]);
- if(w > 0xFFFF) {
- w -= 0x10000;
- out[k++] = String.fromCharCode(0xD800 + ((w >> 10) & 0x3FF));
- out[k++] = String.fromCharCode(0xDC00 + (w & 0x3FF));
- }
- else out[k++] = String.fromCharCode(w);
- }
- break;
- case "utf32be":
- if(len >= 4 && data[3] == 0xFF) if(data[2] == 0xFE && data[1] === 0 && data[0] === 0) i = 4;
- j = 4;
- for(; i < len; i+=j) {
- w = (data[i]<<24) + (data[i+1]<<16) + (data[i+2]<<8) + (data[i+3]);
- if(w > 0xFFFF) {
- w -= 0x10000;
- out[k++] = String.fromCharCode(0xD800 + ((w >> 10) & 0x3FF));
- out[k++] = String.fromCharCode(0xDC00 + (w & 0x3FF));
- }
- else out[k++] = String.fromCharCode(w);
- }
- break;
- case "utf7":
- if(len >= 4 && data[0] == 0x2B && data[1] == 0x2F && data[2] == 0x76) {
- if(len >= 5 && data[3] == 0x38 && data[4] == 0x2D) i = 5;
- else if(data[3] == 0x38 || data[3] == 0x39 || data[3] == 0x2B || data[3] == 0x2F) i = 4;
- }
- for(; i < len; i+=j) {
- if(data[i] !== 0x2b) { j=1; out[k++] = String.fromCharCode(data[i]); continue; }
- j=1;
- if(data[i+1] === 0x2d) { j = 2; out[k++] = "+"; continue; }
- // eslint-disable-next-line no-useless-escape
- while(String.fromCharCode(data[i+j]).match(/[A-Za-z0-9+\/]/)) j++;
- var dash = 0;
- if(data[i+j] === 0x2d) { ++j; dash=1; }
- var tt = [];
- var o64 = "";
- var c1=0, c2=0, c3=0;
- var e1=0, e2=0, e3=0, e4=0;
- for(var l = 1; l < j - dash;) {
- e1 = BM.indexOf(String.fromCharCode(data[i+l++]));
- e2 = BM.indexOf(String.fromCharCode(data[i+l++]));
- c1 = e1 << 2 | e2 >> 4;
- tt.push(c1);
- e3 = BM.indexOf(String.fromCharCode(data[i+l++]));
- if(e3 === -1) break;
- c2 = (e2 & 15) << 4 | e3 >> 2;
- tt.push(c2);
- e4 = BM.indexOf(String.fromCharCode(data[i+l++]));
- if(e4 === -1) break;
- c3 = (e3 & 3) << 6 | e4;
- if(e4 < 64) tt.push(c3);
- }
- o64 = decode(1201, tt);
- for(l = 0; l < o64.length; ++l) out[k++] = o64.charAt(l);
- }
- break;
- default: throw new Error("Unsupported magic: " + cp + " " + magic[cp]);
- }
- else throw new Error("Unrecognized CP: " + cp);
- return out.slice(0,k).join("");
- };
- var hascp = function hascp(cp) { return !!(cpt[cp] || magic[cp]); };
- cpt.utils = { decode: decode, encode: encode, hascp: hascp, magic: magic, cache:cache };
- return cpt;
- }));
-
-
- /***/ }),
-
- /***/ "./node_modules/xlsx/jszip.js":
- /*!************************************!*\
- !*** ./node_modules/xlsx/jszip.js ***!
- \************************************/
- /***/ ((module, exports, __webpack_require__) => {
-
- var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;/*
-
- JSZip - A Javascript class for generating and reading zip files
- <http://stuartk.com/jszip>
-
- (c) 2009-2014 Stuart Knightley <stuart [at] stuartk.com>
- Dual licenced under the MIT license or GPLv3. See https://raw.github.com/Stuk/jszip/master/LICENSE.markdown.
-
- JSZip uses the library pako released under the MIT license :
- https://github.com/nodeca/pako/blob/master/LICENSE
-
- Note: since JSZip 3 removed critical functionality, this version assigns to the
- `JSZipSync` variable. Another JSZip version can be loaded in parallel.
- */
- (function(e){
- if( true&&"undefined"==typeof DO_NOT_EXPORT_JSZIP)module.exports=e();
- else if( true&&"undefined"==typeof DO_NOT_EXPORT_JSZIP){JSZipSync=e();!(__WEBPACK_AMD_DEFINE_ARRAY__ = [], __WEBPACK_AMD_DEFINE_FACTORY__ = (e),
- __WEBPACK_AMD_DEFINE_RESULT__ = (typeof __WEBPACK_AMD_DEFINE_FACTORY__ === 'function' ?
- (__WEBPACK_AMD_DEFINE_FACTORY__.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__)) : __WEBPACK_AMD_DEFINE_FACTORY__),
- __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));}
- else{
- var f;
- "undefined"!=typeof globalThis?f=globalThis:
- "undefined"!=typeof window?f=window:
- "undefined"!=typeof __webpack_require__.g?f=__webpack_require__.g:
- "undefined"!=typeof $ && $.global?f=$.global:
- "undefined"!=typeof self&&(f=self),f.JSZipSync=e()
- }
- }(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){
- 'use strict';
- // private property
- var _keyStr = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=";
-
-
- // public method for encoding
- exports.encode = function(input, utf8) {
- var output = "";
- var chr1, chr2, chr3, enc1, enc2, enc3, enc4;
- var i = 0;
-
- while (i < input.length) {
-
- chr1 = input.charCodeAt(i++);
- chr2 = input.charCodeAt(i++);
- chr3 = input.charCodeAt(i++);
-
- enc1 = chr1 >> 2;
- enc2 = ((chr1 & 3) << 4) | (chr2 >> 4);
- enc3 = ((chr2 & 15) << 2) | (chr3 >> 6);
- enc4 = chr3 & 63;
-
- if (isNaN(chr2)) {
- enc3 = enc4 = 64;
- }
- else if (isNaN(chr3)) {
- enc4 = 64;
- }
-
- output = output + _keyStr.charAt(enc1) + _keyStr.charAt(enc2) + _keyStr.charAt(enc3) + _keyStr.charAt(enc4);
-
- }
-
- return output;
- };
-
- // public method for decoding
- exports.decode = function(input, utf8) {
- var output = "";
- var chr1, chr2, chr3;
- var enc1, enc2, enc3, enc4;
- var i = 0;
-
- input = input.replace(/[^A-Za-z0-9\+\/\=]/g, "");
-
- while (i < input.length) {
-
- enc1 = _keyStr.indexOf(input.charAt(i++));
- enc2 = _keyStr.indexOf(input.charAt(i++));
- enc3 = _keyStr.indexOf(input.charAt(i++));
- enc4 = _keyStr.indexOf(input.charAt(i++));
-
- chr1 = (enc1 << 2) | (enc2 >> 4);
- chr2 = ((enc2 & 15) << 4) | (enc3 >> 2);
- chr3 = ((enc3 & 3) << 6) | enc4;
-
- output = output + String.fromCharCode(chr1);
-
- if (enc3 != 64) {
- output = output + String.fromCharCode(chr2);
- }
- if (enc4 != 64) {
- output = output + String.fromCharCode(chr3);
- }
-
- }
-
- return output;
-
- };
-
- },{}],2:[function(_dereq_,module,exports){
- 'use strict';
- function CompressedObject() {
- this.compressedSize = 0;
- this.uncompressedSize = 0;
- this.crc32 = 0;
- this.compressionMethod = null;
- this.compressedContent = null;
- }
-
- CompressedObject.prototype = {
- /**
- * Return the decompressed content in an unspecified format.
- * The format will depend on the decompressor.
- * @return {Object} the decompressed content.
- */
- getContent: function() {
- return null; // see implementation
- },
- /**
- * Return the compressed content in an unspecified format.
- * The format will depend on the compressed conten source.
- * @return {Object} the compressed content.
- */
- getCompressedContent: function() {
- return null; // see implementation
- }
- };
- module.exports = CompressedObject;
-
- },{}],3:[function(_dereq_,module,exports){
- 'use strict';
- exports.STORE = {
- magic: "\x00\x00",
- compress: function(content) {
- return content; // no compression
- },
- uncompress: function(content) {
- return content; // no compression
- },
- compressInputType: null,
- uncompressInputType: null
- };
- exports.DEFLATE = _dereq_('./flate');
-
- },{"./flate":8}],4:[function(_dereq_,module,exports){
- 'use strict';
-
- var utils = _dereq_('./utils');
-
- var table = [
- 0x00000000, 0x77073096, 0xEE0E612C, 0x990951BA,
- 0x076DC419, 0x706AF48F, 0xE963A535, 0x9E6495A3,
- 0x0EDB8832, 0x79DCB8A4, 0xE0D5E91E, 0x97D2D988,
- 0x09B64C2B, 0x7EB17CBD, 0xE7B82D07, 0x90BF1D91,
- 0x1DB71064, 0x6AB020F2, 0xF3B97148, 0x84BE41DE,
- 0x1ADAD47D, 0x6DDDE4EB, 0xF4D4B551, 0x83D385C7,
- 0x136C9856, 0x646BA8C0, 0xFD62F97A, 0x8A65C9EC,
- 0x14015C4F, 0x63066CD9, 0xFA0F3D63, 0x8D080DF5,
- 0x3B6E20C8, 0x4C69105E, 0xD56041E4, 0xA2677172,
- 0x3C03E4D1, 0x4B04D447, 0xD20D85FD, 0xA50AB56B,
- 0x35B5A8FA, 0x42B2986C, 0xDBBBC9D6, 0xACBCF940,
- 0x32D86CE3, 0x45DF5C75, 0xDCD60DCF, 0xABD13D59,
- 0x26D930AC, 0x51DE003A, 0xC8D75180, 0xBFD06116,
- 0x21B4F4B5, 0x56B3C423, 0xCFBA9599, 0xB8BDA50F,
- 0x2802B89E, 0x5F058808, 0xC60CD9B2, 0xB10BE924,
- 0x2F6F7C87, 0x58684C11, 0xC1611DAB, 0xB6662D3D,
- 0x76DC4190, 0x01DB7106, 0x98D220BC, 0xEFD5102A,
- 0x71B18589, 0x06B6B51F, 0x9FBFE4A5, 0xE8B8D433,
- 0x7807C9A2, 0x0F00F934, 0x9609A88E, 0xE10E9818,
- 0x7F6A0DBB, 0x086D3D2D, 0x91646C97, 0xE6635C01,
- 0x6B6B51F4, 0x1C6C6162, 0x856530D8, 0xF262004E,
- 0x6C0695ED, 0x1B01A57B, 0x8208F4C1, 0xF50FC457,
- 0x65B0D9C6, 0x12B7E950, 0x8BBEB8EA, 0xFCB9887C,
- 0x62DD1DDF, 0x15DA2D49, 0x8CD37CF3, 0xFBD44C65,
- 0x4DB26158, 0x3AB551CE, 0xA3BC0074, 0xD4BB30E2,
- 0x4ADFA541, 0x3DD895D7, 0xA4D1C46D, 0xD3D6F4FB,
- 0x4369E96A, 0x346ED9FC, 0xAD678846, 0xDA60B8D0,
- 0x44042D73, 0x33031DE5, 0xAA0A4C5F, 0xDD0D7CC9,
- 0x5005713C, 0x270241AA, 0xBE0B1010, 0xC90C2086,
- 0x5768B525, 0x206F85B3, 0xB966D409, 0xCE61E49F,
- 0x5EDEF90E, 0x29D9C998, 0xB0D09822, 0xC7D7A8B4,
- 0x59B33D17, 0x2EB40D81, 0xB7BD5C3B, 0xC0BA6CAD,
- 0xEDB88320, 0x9ABFB3B6, 0x03B6E20C, 0x74B1D29A,
- 0xEAD54739, 0x9DD277AF, 0x04DB2615, 0x73DC1683,
- 0xE3630B12, 0x94643B84, 0x0D6D6A3E, 0x7A6A5AA8,
- 0xE40ECF0B, 0x9309FF9D, 0x0A00AE27, 0x7D079EB1,
- 0xF00F9344, 0x8708A3D2, 0x1E01F268, 0x6906C2FE,
- 0xF762575D, 0x806567CB, 0x196C3671, 0x6E6B06E7,
- 0xFED41B76, 0x89D32BE0, 0x10DA7A5A, 0x67DD4ACC,
- 0xF9B9DF6F, 0x8EBEEFF9, 0x17B7BE43, 0x60B08ED5,
- 0xD6D6A3E8, 0xA1D1937E, 0x38D8C2C4, 0x4FDFF252,
- 0xD1BB67F1, 0xA6BC5767, 0x3FB506DD, 0x48B2364B,
- 0xD80D2BDA, 0xAF0A1B4C, 0x36034AF6, 0x41047A60,
- 0xDF60EFC3, 0xA867DF55, 0x316E8EEF, 0x4669BE79,
- 0xCB61B38C, 0xBC66831A, 0x256FD2A0, 0x5268E236,
- 0xCC0C7795, 0xBB0B4703, 0x220216B9, 0x5505262F,
- 0xC5BA3BBE, 0xB2BD0B28, 0x2BB45A92, 0x5CB36A04,
- 0xC2D7FFA7, 0xB5D0CF31, 0x2CD99E8B, 0x5BDEAE1D,
- 0x9B64C2B0, 0xEC63F226, 0x756AA39C, 0x026D930A,
- 0x9C0906A9, 0xEB0E363F, 0x72076785, 0x05005713,
- 0x95BF4A82, 0xE2B87A14, 0x7BB12BAE, 0x0CB61B38,
- 0x92D28E9B, 0xE5D5BE0D, 0x7CDCEFB7, 0x0BDBDF21,
- 0x86D3D2D4, 0xF1D4E242, 0x68DDB3F8, 0x1FDA836E,
- 0x81BE16CD, 0xF6B9265B, 0x6FB077E1, 0x18B74777,
- 0x88085AE6, 0xFF0F6A70, 0x66063BCA, 0x11010B5C,
- 0x8F659EFF, 0xF862AE69, 0x616BFFD3, 0x166CCF45,
- 0xA00AE278, 0xD70DD2EE, 0x4E048354, 0x3903B3C2,
- 0xA7672661, 0xD06016F7, 0x4969474D, 0x3E6E77DB,
- 0xAED16A4A, 0xD9D65ADC, 0x40DF0B66, 0x37D83BF0,
- 0xA9BCAE53, 0xDEBB9EC5, 0x47B2CF7F, 0x30B5FFE9,
- 0xBDBDF21C, 0xCABAC28A, 0x53B39330, 0x24B4A3A6,
- 0xBAD03605, 0xCDD70693, 0x54DE5729, 0x23D967BF,
- 0xB3667A2E, 0xC4614AB8, 0x5D681B02, 0x2A6F2B94,
- 0xB40BBE37, 0xC30C8EA1, 0x5A05DF1B, 0x2D02EF8D
- ];
-
- /**
- *
- * Javascript crc32
- * http://www.webtoolkit.info/
- *
- */
- module.exports = function crc32(input, crc) {
- if (typeof input === "undefined" || !input.length) {
- return 0;
- }
-
- var isArray = utils.getTypeOf(input) !== "string";
-
- if (typeof(crc) == "undefined") {
- crc = 0;
- }
- var x = 0;
- var y = 0;
- var b = 0;
-
- crc = crc ^ (-1);
- for (var i = 0, iTop = input.length; i < iTop; i++) {
- b = isArray ? input[i] : input.charCodeAt(i);
- y = (crc ^ b) & 0xFF;
- x = table[y];
- crc = (crc >>> 8) ^ x;
- }
-
- return crc ^ (-1);
- };
- // vim: set shiftwidth=4 softtabstop=4:
-
- },{"./utils":21}],5:[function(_dereq_,module,exports){
- 'use strict';
- var utils = _dereq_('./utils');
-
- function DataReader(data) {
- this.data = null; // type : see implementation
- this.length = 0;
- this.index = 0;
- }
- DataReader.prototype = {
- /**
- * Check that the offset will not go too far.
- * @param {string} offset the additional offset to check.
- * @throws {Error} an Error if the offset is out of bounds.
- */
- checkOffset: function(offset) {
- this.checkIndex(this.index + offset);
- },
- /**
- * Check that the specifed index will not be too far.
- * @param {string} newIndex the index to check.
- * @throws {Error} an Error if the index is out of bounds.
- */
- checkIndex: function(newIndex) {
- if (this.length < newIndex || newIndex < 0) {
- throw new Error("End of data reached (data length = " + this.length + ", asked index = " + (newIndex) + "). Corrupted zip ?");
- }
- },
- /**
- * Change the index.
- * @param {number} newIndex The new index.
- * @throws {Error} if the new index is out of the data.
- */
- setIndex: function(newIndex) {
- this.checkIndex(newIndex);
- this.index = newIndex;
- },
- /**
- * Skip the next n bytes.
- * @param {number} n the number of bytes to skip.
- * @throws {Error} if the new index is out of the data.
- */
- skip: function(n) {
- this.setIndex(this.index + n);
- },
- /**
- * Get the byte at the specified index.
- * @param {number} i the index to use.
- * @return {number} a byte.
- */
- byteAt: function(i) {
- // see implementations
- },
- /**
- * Get the next number with a given byte size.
- * @param {number} size the number of bytes to read.
- * @return {number} the corresponding number.
- */
- readInt: function(size) {
- var result = 0,
- i;
- this.checkOffset(size);
- for (i = this.index + size - 1; i >= this.index; i--) {
- result = (result << 8) + this.byteAt(i);
- }
- this.index += size;
- return result;
- },
- /**
- * Get the next string with a given byte size.
- * @param {number} size the number of bytes to read.
- * @return {string} the corresponding string.
- */
- readString: function(size) {
- return utils.transformTo("string", this.readData(size));
- },
- /**
- * Get raw data without conversion, <size> bytes.
- * @param {number} size the number of bytes to read.
- * @return {Object} the raw data, implementation specific.
- */
- readData: function(size) {
- // see implementations
- },
- /**
- * Find the last occurence of a zip signature (4 bytes).
- * @param {string} sig the signature to find.
- * @return {number} the index of the last occurence, -1 if not found.
- */
- lastIndexOfSignature: function(sig) {
- // see implementations
- },
- /**
- * Get the next date.
- * @return {Date} the date.
- */
- readDate: function() {
- var dostime = this.readInt(4);
- return new Date(
- ((dostime >> 25) & 0x7f) + 1980, // year
- ((dostime >> 21) & 0x0f) - 1, // month
- (dostime >> 16) & 0x1f, // day
- (dostime >> 11) & 0x1f, // hour
- (dostime >> 5) & 0x3f, // minute
- (dostime & 0x1f) << 1); // second
- }
- };
- module.exports = DataReader;
-
- },{"./utils":21}],6:[function(_dereq_,module,exports){
- 'use strict';
- exports.base64 = false;
- exports.binary = false;
- exports.dir = false;
- exports.createFolders = false;
- exports.date = null;
- exports.compression = null;
- exports.comment = null;
-
- },{}],7:[function(_dereq_,module,exports){
- 'use strict';
- var utils = _dereq_('./utils');
-
- /**
- * @deprecated
- * This function will be removed in a future version without replacement.
- */
- exports.string2binary = function(str) {
- return utils.string2binary(str);
- };
-
- /**
- * @deprecated
- * This function will be removed in a future version without replacement.
- */
- exports.string2Uint8Array = function(str) {
- return utils.transformTo("uint8array", str);
- };
-
- /**
- * @deprecated
- * This function will be removed in a future version without replacement.
- */
- exports.uint8Array2String = function(array) {
- return utils.transformTo("string", array);
- };
-
- /**
- * @deprecated
- * This function will be removed in a future version without replacement.
- */
- exports.string2Blob = function(str) {
- var buffer = utils.transformTo("arraybuffer", str);
- return utils.arrayBuffer2Blob(buffer);
- };
-
- /**
- * @deprecated
- * This function will be removed in a future version without replacement.
- */
- exports.arrayBuffer2Blob = function(buffer) {
- return utils.arrayBuffer2Blob(buffer);
- };
-
- /**
- * @deprecated
- * This function will be removed in a future version without replacement.
- */
- exports.transformTo = function(outputType, input) {
- return utils.transformTo(outputType, input);
- };
-
- /**
- * @deprecated
- * This function will be removed in a future version without replacement.
- */
- exports.getTypeOf = function(input) {
- return utils.getTypeOf(input);
- };
-
- /**
- * @deprecated
- * This function will be removed in a future version without replacement.
- */
- exports.checkSupport = function(type) {
- return utils.checkSupport(type);
- };
-
- /**
- * @deprecated
- * This value will be removed in a future version without replacement.
- */
- exports.MAX_VALUE_16BITS = utils.MAX_VALUE_16BITS;
-
- /**
- * @deprecated
- * This value will be removed in a future version without replacement.
- */
- exports.MAX_VALUE_32BITS = utils.MAX_VALUE_32BITS;
-
-
- /**
- * @deprecated
- * This function will be removed in a future version without replacement.
- */
- exports.pretty = function(str) {
- return utils.pretty(str);
- };
-
- /**
- * @deprecated
- * This function will be removed in a future version without replacement.
- */
- exports.findCompression = function(compressionMethod) {
- return utils.findCompression(compressionMethod);
- };
-
- /**
- * @deprecated
- * This function will be removed in a future version without replacement.
- */
- exports.isRegExp = function (object) {
- return utils.isRegExp(object);
- };
-
-
- },{"./utils":21}],8:[function(_dereq_,module,exports){
- 'use strict';
- var USE_TYPEDARRAY = (typeof Uint8Array !== 'undefined') && (typeof Uint16Array !== 'undefined') && (typeof Uint32Array !== 'undefined');
-
- var pako = _dereq_("pako");
- exports.uncompressInputType = USE_TYPEDARRAY ? "uint8array" : "array";
- exports.compressInputType = USE_TYPEDARRAY ? "uint8array" : "array";
-
- exports.magic = "\x08\x00";
- exports.compress = function(input) {
- return pako.deflateRaw(input);
- };
- exports.uncompress = function(input) {
- return pako.inflateRaw(input);
- };
-
- },{"pako":24}],9:[function(_dereq_,module,exports){
- 'use strict';
-
- var base64 = _dereq_('./base64');
-
- /**
- Usage:
- zip = new JSZip();
- zip.file("hello.txt", "Hello, World!").file("tempfile", "nothing");
- zip.folder("images").file("smile.gif", base64Data, {base64: true});
- zip.file("Xmas.txt", "Ho ho ho !", {date : new Date("December 25, 2007 00:00:01")});
- zip.remove("tempfile");
-
- base64zip = zip.generate();
-
- **/
-
- /**
- * Representation a of zip file in js
- * @constructor
- * @param {String=|ArrayBuffer=|Uint8Array=} data the data to load, if any (optional).
- * @param {Object=} options the options for creating this objects (optional).
- */
- function JSZipSync(data, options) {
- // if this constructor is used without `new`, it adds `new` before itself:
- if(!(this instanceof JSZipSync)) return new JSZipSync(data, options);
-
- // object containing the files :
- // {
- // "folder/" : {...},
- // "folder/data.txt" : {...}
- // }
- this.files = {};
-
- this.comment = null;
-
- // Where we are in the hierarchy
- this.root = "";
- if (data) {
- this.load(data, options);
- }
- this.clone = function() {
- var newObj = new JSZipSync();
- for (var i in this) {
- if (typeof this[i] !== "function") {
- newObj[i] = this[i];
- }
- }
- return newObj;
- };
- }
- JSZipSync.prototype = _dereq_('./object');
- JSZipSync.prototype.load = _dereq_('./load');
- JSZipSync.support = _dereq_('./support');
- JSZipSync.defaults = _dereq_('./defaults');
-
- /**
- * @deprecated
- * This namespace will be removed in a future version without replacement.
- */
- JSZipSync.utils = _dereq_('./deprecatedPublicUtils');
-
- JSZipSync.base64 = {
- /**
- * @deprecated
- * This method will be removed in a future version without replacement.
- */
- encode : function(input) {
- return base64.encode(input);
- },
- /**
- * @deprecated
- * This method will be removed in a future version without replacement.
- */
- decode : function(input) {
- return base64.decode(input);
- }
- };
- JSZipSync.compressions = _dereq_('./compressions');
- module.exports = JSZipSync;
-
- },{"./base64":1,"./compressions":3,"./defaults":6,"./deprecatedPublicUtils":7,"./load":10,"./object":13,"./support":17}],10:[function(_dereq_,module,exports){
- 'use strict';
- var base64 = _dereq_('./base64');
- var ZipEntries = _dereq_('./zipEntries');
- module.exports = function(data, options) {
- var files, zipEntries, i, input;
- options = options || {};
- if (options.base64) {
- data = base64.decode(data);
- }
-
- zipEntries = new ZipEntries(data, options);
- files = zipEntries.files;
- for (i = 0; i < files.length; i++) {
- input = files[i];
- this.file(input.fileName, input.decompressed, {
- binary: true,
- optimizedBinaryString: true,
- date: input.date,
- dir: input.dir,
- comment : input.fileComment.length ? input.fileComment : null,
- createFolders: options.createFolders
- });
- }
- if (zipEntries.zipComment.length) {
- this.comment = zipEntries.zipComment;
- }
-
- return this;
- };
-
- },{"./base64":1,"./zipEntries":22}],11:[function(_dereq_,module,exports){
- (function (Buffer){
- 'use strict';
- var Buffer_from = /*::(*/function(){}/*:: :any)*/;
- if(typeof Buffer !== 'undefined') {
- var nbfs = !Buffer.from;
- if(!nbfs) try { Buffer.from("foo", "utf8"); } catch(e) { nbfs = true; }
- Buffer_from = nbfs ? function(buf, enc) { return (enc) ? new Buffer(buf, enc) : new Buffer(buf); } : Buffer.from.bind(Buffer);
- // $FlowIgnore
- if(!Buffer.alloc) Buffer.alloc = function(n) { return new Buffer(n); };
- }
- module.exports = function(data, encoding){
- return typeof data == 'number' ? Buffer.alloc(data) : Buffer_from(data, encoding);
- };
- module.exports.test = function(b){
- return Buffer.isBuffer(b);
- };
- }).call(this,(typeof Buffer !== "undefined" ? Buffer : undefined))
- },{}],12:[function(_dereq_,module,exports){
- 'use strict';
- var Uint8ArrayReader = _dereq_('./uint8ArrayReader');
-
- function NodeBufferReader(data) {
- this.data = data;
- this.length = this.data.length;
- this.index = 0;
- }
- NodeBufferReader.prototype = new Uint8ArrayReader();
-
- /**
- * @see DataReader.readData
- */
- NodeBufferReader.prototype.readData = function(size) {
- this.checkOffset(size);
- var result = this.data.slice(this.index, this.index + size);
- this.index += size;
- return result;
- };
- module.exports = NodeBufferReader;
-
- },{"./uint8ArrayReader":18}],13:[function(_dereq_,module,exports){
- 'use strict';
- var support = _dereq_('./support');
- var utils = _dereq_('./utils');
- var crc32 = _dereq_('./crc32');
- var signature = _dereq_('./signature');
- var defaults = _dereq_('./defaults');
- var base64 = _dereq_('./base64');
- var compressions = _dereq_('./compressions');
- var CompressedObject = _dereq_('./compressedObject');
- var nodeBuffer = _dereq_('./nodeBuffer');
- var utf8 = _dereq_('./utf8');
- var StringWriter = _dereq_('./stringWriter');
- var Uint8ArrayWriter = _dereq_('./uint8ArrayWriter');
-
- /**
- * Returns the raw data of a ZipObject, decompress the content if necessary.
- * @param {ZipObject} file the file to use.
- * @return {String|ArrayBuffer|Uint8Array|Buffer} the data.
- */
- var getRawData = function(file) {
- if (file._data instanceof CompressedObject) {
- file._data = file._data.getContent();
- file.options.binary = true;
- file.options.base64 = false;
-
- if (utils.getTypeOf(file._data) === "uint8array") {
- var copy = file._data;
- // when reading an arraybuffer, the CompressedObject mechanism will keep it and subarray() a Uint8Array.
- // if we request a file in the same format, we might get the same Uint8Array or its ArrayBuffer (the original zip file).
- file._data = new Uint8Array(copy.length);
- // with an empty Uint8Array, Opera fails with a "Offset larger than array size"
- if (copy.length !== 0) {
- file._data.set(copy, 0);
- }
- }
- }
- return file._data;
- };
-
- /**
- * Returns the data of a ZipObject in a binary form. If the content is an unicode string, encode it.
- * @param {ZipObject} file the file to use.
- * @return {String|ArrayBuffer|Uint8Array|Buffer} the data.
- */
- var getBinaryData = function(file) {
- var result = getRawData(file),
- type = utils.getTypeOf(result);
- if (type === "string") {
- if (!file.options.binary) {
- // unicode text !
- // unicode string => binary string is a painful process, check if we can avoid it.
- if (support.nodebuffer) {
- return nodeBuffer(result, "utf-8");
- }
- }
- return file.asBinary();
- }
- return result;
- };
-
- /**
- * Transform this._data into a string.
- * @param {function} filter a function String -> String, applied if not null on the result.
- * @return {String} the string representing this._data.
- */
- var dataToString = function(asUTF8) {
- var result = getRawData(this);
- if (result === null || typeof result === "undefined") {
- return "";
- }
- // if the data is a base64 string, we decode it before checking the encoding !
- if (this.options.base64) {
- result = base64.decode(result);
- }
- if (asUTF8 && this.options.binary) {
- // JSZip.prototype.utf8decode supports arrays as input
- // skip to array => string step, utf8decode will do it.
- result = out.utf8decode(result);
- }
- else {
- // no utf8 transformation, do the array => string step.
- result = utils.transformTo("string", result);
- }
-
- if (!asUTF8 && !this.options.binary) {
- result = utils.transformTo("string", out.utf8encode(result));
- }
- return result;
- };
- /**
- * A simple object representing a file in the zip file.
- * @constructor
- * @param {string} name the name of the file
- * @param {String|ArrayBuffer|Uint8Array|Buffer} data the data
- * @param {Object} options the options of the file
- */
- var ZipObject = function(name, data, options) {
- this.name = name;
- this.dir = options.dir;
- this.date = options.date;
- this.comment = options.comment;
-
- this._data = data;
- this.options = options;
-
- /*
- * This object contains initial values for dir and date.
- * With them, we can check if the user changed the deprecated metadata in
- * `ZipObject#options` or not.
- */
- this._initialMetadata = {
- dir : options.dir,
- date : options.date
- };
- };
-
- ZipObject.prototype = {
- /**
- * Return the content as UTF8 string.
- * @return {string} the UTF8 string.
- */
- asText: function() {
- return dataToString.call(this, true);
- },
- /**
- * Returns the binary content.
- * @return {string} the content as binary.
- */
- asBinary: function() {
- return dataToString.call(this, false);
- },
- /**
- * Returns the content as a nodejs Buffer.
- * @return {Buffer} the content as a Buffer.
- */
- asNodeBuffer: function() {
- var result = getBinaryData(this);
- return utils.transformTo("nodebuffer", result);
- },
- /**
- * Returns the content as an Uint8Array.
- * @return {Uint8Array} the content as an Uint8Array.
- */
- asUint8Array: function() {
- var result = getBinaryData(this);
- return utils.transformTo("uint8array", result);
- },
- /**
- * Returns the content as an ArrayBuffer.
- * @return {ArrayBuffer} the content as an ArrayBufer.
- */
- asArrayBuffer: function() {
- return this.asUint8Array().buffer;
- }
- };
-
- /**
- * Transform an integer into a string in hexadecimal.
- * @private
- * @param {number} dec the number to convert.
- * @param {number} bytes the number of bytes to generate.
- * @returns {string} the result.
- */
- var decToHex = function(dec, bytes) {
- var hex = "",
- i;
- for (i = 0; i < bytes; i++) {
- hex += String.fromCharCode(dec & 0xff);
- dec = dec >>> 8;
- }
- return hex;
- };
-
- /**
- * Merge the objects passed as parameters into a new one.
- * @private
- * @param {...Object} var_args All objects to merge.
- * @return {Object} a new object with the data of the others.
- */
- var extend = function() {
- var result = {}, i, attr;
- for (i = 0; i < arguments.length; i++) { // arguments is not enumerable in some browsers
- for (attr in arguments[i]) {
- if (arguments[i].hasOwnProperty(attr) && typeof result[attr] === "undefined") {
- result[attr] = arguments[i][attr];
- }
- }
- }
- return result;
- };
-
- /**
- * Transforms the (incomplete) options from the user into the complete
- * set of options to create a file.
- * @private
- * @param {Object} o the options from the user.
- * @return {Object} the complete set of options.
- */
- var prepareFileAttrs = function(o) {
- o = o || {};
- if (o.base64 === true && (o.binary === null || o.binary === undefined)) {
- o.binary = true;
- }
- o = extend(o, defaults);
- o.date = o.date || new Date();
- if (o.compression !== null) o.compression = o.compression.toUpperCase();
-
- return o;
- };
-
- /**
- * Add a file in the current folder.
- * @private
- * @param {string} name the name of the file
- * @param {String|ArrayBuffer|Uint8Array|Buffer} data the data of the file
- * @param {Object} o the options of the file
- * @return {Object} the new file.
- */
- var fileAdd = function(name, data, o) {
- // be sure sub folders exist
- var dataType = utils.getTypeOf(data),
- parent;
-
- o = prepareFileAttrs(o);
-
- if (o.createFolders && (parent = parentFolder(name))) {
- folderAdd.call(this, parent, true);
- }
-
- if (o.dir || data === null || typeof data === "undefined") {
- o.base64 = false;
- o.binary = false;
- data = null;
- }
- else if (dataType === "string") {
- if (o.binary && !o.base64) {
- // optimizedBinaryString == true means that the file has already been filtered with a 0xFF mask
- if (o.optimizedBinaryString !== true) {
- // this is a string, not in a base64 format.
- // Be sure that this is a correct "binary string"
- data = utils.string2binary(data);
- }
- }
- }
- else { // arraybuffer, uint8array, ...
- o.base64 = false;
- o.binary = true;
-
- if (!dataType && !(data instanceof CompressedObject)) {
- throw new Error("The data of '" + name + "' is in an unsupported format !");
- }
-
- // special case : it's way easier to work with Uint8Array than with ArrayBuffer
- if (dataType === "arraybuffer") {
- data = utils.transformTo("uint8array", data);
- }
- }
-
- var object = new ZipObject(name, data, o);
- this.files[name] = object;
- return object;
- };
-
- /**
- * Find the parent folder of the path.
- * @private
- * @param {string} path the path to use
- * @return {string} the parent folder, or ""
- */
- var parentFolder = function (path) {
- if (path.slice(-1) == '/') {
- path = path.substring(0, path.length - 1);
- }
- var lastSlash = path.lastIndexOf('/');
- return (lastSlash > 0) ? path.substring(0, lastSlash) : "";
- };
-
- /**
- * Add a (sub) folder in the current folder.
- * @private
- * @param {string} name the folder's name
- * @param {boolean=} [createFolders] If true, automatically create sub
- * folders. Defaults to false.
- * @return {Object} the new folder.
- */
- var folderAdd = function(name, createFolders) {
- // Check the name ends with a /
- if (name.slice(-1) != "/") {
- name += "/"; // IE doesn't like substr(-1)
- }
-
- createFolders = (typeof createFolders !== 'undefined') ? createFolders : false;
-
- // Does this folder already exist?
- if (!this.files[name]) {
- fileAdd.call(this, name, null, {
- dir: true,
- createFolders: createFolders
- });
- }
- return this.files[name];
- };
-
- /**
- * Generate a JSZip.CompressedObject for a given zipOject.
- * @param {ZipObject} file the object to read.
- * @param {JSZip.compression} compression the compression to use.
- * @return {JSZip.CompressedObject} the compressed result.
- */
- var generateCompressedObjectFrom = function(file, compression) {
- var result = new CompressedObject(),
- content;
-
- // the data has not been decompressed, we might reuse things !
- if (file._data instanceof CompressedObject) {
- result.uncompressedSize = file._data.uncompressedSize;
- result.crc32 = file._data.crc32;
-
- if (result.uncompressedSize === 0 || file.dir) {
- compression = compressions['STORE'];
- result.compressedContent = "";
- result.crc32 = 0;
- }
- else if (file._data.compressionMethod === compression.magic) {
- result.compressedContent = file._data.getCompressedContent();
- }
- else {
- content = file._data.getContent();
- // need to decompress / recompress
- result.compressedContent = compression.compress(utils.transformTo(compression.compressInputType, content));
- }
- }
- else {
- // have uncompressed data
- content = getBinaryData(file);
- if (!content || content.length === 0 || file.dir) {
- compression = compressions['STORE'];
- content = "";
- }
- result.uncompressedSize = content.length;
- result.crc32 = crc32(content);
- result.compressedContent = compression.compress(utils.transformTo(compression.compressInputType, content));
- }
-
- result.compressedSize = result.compressedContent.length;
- result.compressionMethod = compression.magic;
-
- return result;
- };
-
- /**
- * Generate the various parts used in the construction of the final zip file.
- * @param {string} name the file name.
- * @param {ZipObject} file the file content.
- * @param {JSZip.CompressedObject} compressedObject the compressed object.
- * @param {number} offset the current offset from the start of the zip file.
- * @return {object} the zip parts.
- */
- var generateZipParts = function(name, file, compressedObject, offset) {
- var data = compressedObject.compressedContent,
- utfEncodedFileName = utils.transformTo("string", utf8.utf8encode(file.name)),
- comment = file.comment || "",
- utfEncodedComment = utils.transformTo("string", utf8.utf8encode(comment)),
- useUTF8ForFileName = utfEncodedFileName.length !== file.name.length,
- useUTF8ForComment = utfEncodedComment.length !== comment.length,
- o = file.options,
- dosTime,
- dosDate,
- extraFields = "",
- unicodePathExtraField = "",
- unicodeCommentExtraField = "",
- dir, date;
-
-
- // handle the deprecated options.dir
- if (file._initialMetadata.dir !== file.dir) {
- dir = file.dir;
- } else {
- dir = o.dir;
- }
-
- // handle the deprecated options.date
- if(file._initialMetadata.date !== file.date) {
- date = file.date;
- } else {
- date = o.date;
- }
-
-
- dosTime = date.getHours();
- dosTime = dosTime << 6;
- dosTime = dosTime | date.getMinutes();
- dosTime = dosTime << 5;
- dosTime = dosTime | date.getSeconds() / 2;
-
- dosDate = date.getFullYear() - 1980;
- dosDate = dosDate << 4;
- dosDate = dosDate | (date.getMonth() + 1);
- dosDate = dosDate << 5;
- dosDate = dosDate | date.getDate();
-
- if (useUTF8ForFileName) {
- // set the unicode path extra field. unzip needs at least one extra
- // field to correctly handle unicode path, so using the path is as good
- // as any other information. This could improve the situation with
- // other archive managers too.
- // This field is usually used without the utf8 flag, with a non
- // unicode path in the header (winrar, winzip). This helps (a bit)
- // with the messy Windows' default compressed folders feature but
- // breaks on p7zip which doesn't seek the unicode path extra field.
- // So for now, UTF-8 everywhere !
- unicodePathExtraField =
- // Version
- decToHex(1, 1) +
- // NameCRC32
- decToHex(crc32(utfEncodedFileName), 4) +
- // UnicodeName
- utfEncodedFileName;
-
- extraFields +=
- // Info-ZIP Unicode Path Extra Field
- "\x75\x70" +
- // size
- decToHex(unicodePathExtraField.length, 2) +
- // content
- unicodePathExtraField;
- }
-
- if(useUTF8ForComment) {
-
- unicodeCommentExtraField =
- // Version
- decToHex(1, 1) +
- // CommentCRC32
- decToHex(this.crc32(utfEncodedComment), 4) +
- // UnicodeName
- utfEncodedComment;
-
- extraFields +=
- // Info-ZIP Unicode Path Extra Field
- "\x75\x63" +
- // size
- decToHex(unicodeCommentExtraField.length, 2) +
- // content
- unicodeCommentExtraField;
- }
-
- var header = "";
-
- // version needed to extract
- header += "\x0A\x00";
- // general purpose bit flag
- // set bit 11 if utf8
- header += (useUTF8ForFileName || useUTF8ForComment) ? "\x00\x08" : "\x00\x00";
- // compression method
- header += compressedObject.compressionMethod;
- // last mod file time
- header += decToHex(dosTime, 2);
- // last mod file date
- header += decToHex(dosDate, 2);
- // crc-32
- header += decToHex(compressedObject.crc32, 4);
- // compressed size
- header += decToHex(compressedObject.compressedSize, 4);
- // uncompressed size
- header += decToHex(compressedObject.uncompressedSize, 4);
- // file name length
- header += decToHex(utfEncodedFileName.length, 2);
- // extra field length
- header += decToHex(extraFields.length, 2);
-
-
- var fileRecord = signature.LOCAL_FILE_HEADER + header + utfEncodedFileName + extraFields;
-
- var dirRecord = signature.CENTRAL_FILE_HEADER +
- // version made by (00: DOS)
- "\x14\x00" +
- // file header (common to file and central directory)
- header +
- // file comment length
- decToHex(utfEncodedComment.length, 2) +
- // disk number start
- "\x00\x00" +
- // internal file attributes TODO
- "\x00\x00" +
- // external file attributes
- (dir === true ? "\x10\x00\x00\x00" : "\x00\x00\x00\x00") +
- // relative offset of local header
- decToHex(offset, 4) +
- // file name
- utfEncodedFileName +
- // extra field
- extraFields +
- // file comment
- utfEncodedComment;
-
- return {
- fileRecord: fileRecord,
- dirRecord: dirRecord,
- compressedObject: compressedObject
- };
- };
-
-
- // return the actual prototype of JSZip
- var out = {
- /**
- * Read an existing zip and merge the data in the current JSZip object.
- * The implementation is in jszip-load.js, don't forget to include it.
- * @param {String|ArrayBuffer|Uint8Array|Buffer} stream The stream to load
- * @param {Object} options Options for loading the stream.
- * options.base64 : is the stream in base64 ? default : false
- * @return {JSZip} the current JSZip object
- */
- load: function(stream, options) {
- throw new Error("Load method is not defined. Is the file jszip-load.js included ?");
- },
-
- /**
- * Filter nested files/folders with the specified function.
- * @param {Function} search the predicate to use :
- * function (relativePath, file) {...}
- * It takes 2 arguments : the relative path and the file.
- * @return {Array} An array of matching elements.
- */
- filter: function(search) {
- var result = [],
- filename, relativePath, file, fileClone;
- for (filename in this.files) {
- if (!this.files.hasOwnProperty(filename)) {
- continue;
- }
- file = this.files[filename];
- // return a new object, don't let the user mess with our internal objects :)
- fileClone = new ZipObject(file.name, file._data, extend(file.options));
- relativePath = filename.slice(this.root.length, filename.length);
- if (filename.slice(0, this.root.length) === this.root && // the file is in the current root
- search(relativePath, fileClone)) { // and the file matches the function
- result.push(fileClone);
- }
- }
- return result;
- },
-
- /**
- * Add a file to the zip file, or search a file.
- * @param {string|RegExp} name The name of the file to add (if data is defined),
- * the name of the file to find (if no data) or a regex to match files.
- * @param {String|ArrayBuffer|Uint8Array|Buffer} data The file data, either raw or base64 encoded
- * @param {Object} o File options
- * @return {JSZip|Object|Array} this JSZip object (when adding a file),
- * a file (when searching by string) or an array of files (when searching by regex).
- */
- file: function(name, data, o) {
- if (arguments.length === 1) {
- if (utils.isRegExp(name)) {
- var regexp = name;
- return this.filter(function(relativePath, file) {
- return !file.dir && regexp.test(relativePath);
- });
- }
- else { // text
- return this.filter(function(relativePath, file) {
- return !file.dir && relativePath === name;
- })[0] || null;
- }
- }
- else { // more than one argument : we have data !
- name = this.root + name;
- fileAdd.call(this, name, data, o);
- }
- return this;
- },
-
- /**
- * Add a directory to the zip file, or search.
- * @param {String|RegExp} arg The name of the directory to add, or a regex to search folders.
- * @return {JSZip} an object with the new directory as the root, or an array containing matching folders.
- */
- folder: function(arg) {
- if (!arg) {
- return this;
- }
-
- if (utils.isRegExp(arg)) {
- return this.filter(function(relativePath, file) {
- return file.dir && arg.test(relativePath);
- });
- }
-
- // else, name is a new folder
- var name = this.root + arg;
- var newFolder = folderAdd.call(this, name);
-
- // Allow chaining by returning a new object with this folder as the root
- var ret = this.clone();
- ret.root = newFolder.name;
- return ret;
- },
-
- /**
- * Delete a file, or a directory and all sub-files, from the zip
- * @param {string} name the name of the file to delete
- * @return {JSZip} this JSZip object
- */
- remove: function(name) {
- name = this.root + name;
- var file = this.files[name];
- if (!file) {
- // Look for any folders
- if (name.slice(-1) != "/") {
- name += "/";
- }
- file = this.files[name];
- }
-
- if (file && !file.dir) {
- // file
- delete this.files[name];
- } else {
- // maybe a folder, delete recursively
- var kids = this.filter(function(relativePath, file) {
- return file.name.slice(0, name.length) === name;
- });
- for (var i = 0; i < kids.length; i++) {
- delete this.files[kids[i].name];
- }
- }
-
- return this;
- },
-
- /**
- * Generate the complete zip file
- * @param {Object} options the options to generate the zip file :
- * - base64, (deprecated, use type instead) true to generate base64.
- * - compression, "STORE" by default.
- * - type, "base64" by default. Values are : string, base64, uint8array, arraybuffer, blob.
- * @return {String|Uint8Array|ArrayBuffer|Buffer|Blob} the zip file
- */
- generate: function(options) {
- options = extend(options || {}, {
- base64: true,
- compression: "STORE",
- type: "base64",
- comment: null
- });
-
- utils.checkSupport(options.type);
-
- var zipData = [],
- localDirLength = 0,
- centralDirLength = 0,
- writer, i,
- utfEncodedComment = utils.transformTo("string", this.utf8encode(options.comment || this.comment || ""));
-
- // first, generate all the zip parts.
- for (var name in this.files) {
- if (!this.files.hasOwnProperty(name)) {
- continue;
- }
- var file = this.files[name];
-
- var compressionName = file.options.compression || options.compression.toUpperCase();
- var compression = compressions[compressionName];
- if (!compression) {
- throw new Error(compressionName + " is not a valid compression method !");
- }
-
- var compressedObject = generateCompressedObjectFrom.call(this, file, compression);
-
- var zipPart = generateZipParts.call(this, name, file, compressedObject, localDirLength);
- localDirLength += zipPart.fileRecord.length + compressedObject.compressedSize;
- centralDirLength += zipPart.dirRecord.length;
- zipData.push(zipPart);
- }
-
- var dirEnd = "";
-
- // end of central dir signature
- dirEnd = signature.CENTRAL_DIRECTORY_END +
- // number of this disk
- "\x00\x00" +
- // number of the disk with the start of the central directory
- "\x00\x00" +
- // total number of entries in the central directory on this disk
- decToHex(zipData.length, 2) +
- // total number of entries in the central directory
- decToHex(zipData.length, 2) +
- // size of the central directory 4 bytes
- decToHex(centralDirLength, 4) +
- // offset of start of central directory with respect to the starting disk number
- decToHex(localDirLength, 4) +
- // .ZIP file comment length
- decToHex(utfEncodedComment.length, 2) +
- // .ZIP file comment
- utfEncodedComment;
-
-
- // we have all the parts (and the total length)
- // time to create a writer !
- var typeName = options.type.toLowerCase();
- if(typeName==="uint8array"||typeName==="arraybuffer"||typeName==="blob"||typeName==="nodebuffer") {
- writer = new Uint8ArrayWriter(localDirLength + centralDirLength + dirEnd.length);
- }else{
- writer = new StringWriter(localDirLength + centralDirLength + dirEnd.length);
- }
-
- for (i = 0; i < zipData.length; i++) {
- writer.append(zipData[i].fileRecord);
- writer.append(zipData[i].compressedObject.compressedContent);
- }
- for (i = 0; i < zipData.length; i++) {
- writer.append(zipData[i].dirRecord);
- }
-
- writer.append(dirEnd);
-
- var zip = writer.finalize();
-
-
-
- switch(options.type.toLowerCase()) {
- // case "zip is an Uint8Array"
- case "uint8array" :
- case "arraybuffer" :
- case "nodebuffer" :
- return utils.transformTo(options.type.toLowerCase(), zip);
- case "blob" :
- return utils.arrayBuffer2Blob(utils.transformTo("arraybuffer", zip));
- // case "zip is a string"
- case "base64" :
- return (options.base64) ? base64.encode(zip) : zip;
- default : // case "string" :
- return zip;
- }
-
- },
-
- /**
- * @deprecated
- * This method will be removed in a future version without replacement.
- */
- crc32: function (input, crc) {
- return crc32(input, crc);
- },
-
- /**
- * @deprecated
- * This method will be removed in a future version without replacement.
- */
- utf8encode: function (string) {
- return utils.transformTo("string", utf8.utf8encode(string));
- },
-
- /**
- * @deprecated
- * This method will be removed in a future version without replacement.
- */
- utf8decode: function (input) {
- return utf8.utf8decode(input);
- }
- };
- module.exports = out;
-
- },{"./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){
- 'use strict';
- exports.LOCAL_FILE_HEADER = "PK\x03\x04";
- exports.CENTRAL_FILE_HEADER = "PK\x01\x02";
- exports.CENTRAL_DIRECTORY_END = "PK\x05\x06";
- exports.ZIP64_CENTRAL_DIRECTORY_LOCATOR = "PK\x06\x07";
- exports.ZIP64_CENTRAL_DIRECTORY_END = "PK\x06\x06";
- exports.DATA_DESCRIPTOR = "PK\x07\x08";
-
- },{}],15:[function(_dereq_,module,exports){
- 'use strict';
- var DataReader = _dereq_('./dataReader');
- var utils = _dereq_('./utils');
-
- function StringReader(data, optimizedBinaryString) {
- this.data = data;
- if (!optimizedBinaryString) {
- this.data = utils.string2binary(this.data);
- }
- this.length = this.data.length;
- this.index = 0;
- }
- StringReader.prototype = new DataReader();
- /**
- * @see DataReader.byteAt
- */
- StringReader.prototype.byteAt = function(i) {
- return this.data.charCodeAt(i);
- };
- /**
- * @see DataReader.lastIndexOfSignature
- */
- StringReader.prototype.lastIndexOfSignature = function(sig) {
- return this.data.lastIndexOf(sig);
- };
- /**
- * @see DataReader.readData
- */
- StringReader.prototype.readData = function(size) {
- this.checkOffset(size);
- // this will work because the constructor applied the "& 0xff" mask.
- var result = this.data.slice(this.index, this.index + size);
- this.index += size;
- return result;
- };
- module.exports = StringReader;
-
- },{"./dataReader":5,"./utils":21}],16:[function(_dereq_,module,exports){
- 'use strict';
-
- var utils = _dereq_('./utils');
-
- /**
- * An object to write any content to a string.
- * @constructor
- */
- var StringWriter = function() {
- this.data = [];
- };
- StringWriter.prototype = {
- /**
- * Append any content to the current string.
- * @param {Object} input the content to add.
- */
- append: function(input) {
- input = utils.transformTo("string", input);
- this.data.push(input);
- },
- /**
- * Finalize the construction an return the result.
- * @return {string} the generated string.
- */
- finalize: function() {
- return this.data.join("");
- }
- };
-
- module.exports = StringWriter;
-
- },{"./utils":21}],17:[function(_dereq_,module,exports){
- (function (Buffer){
- 'use strict';
- exports.base64 = true;
- exports.array = true;
- exports.string = true;
- exports.arraybuffer = typeof ArrayBuffer !== "undefined" && typeof Uint8Array !== "undefined";
- // contains true if JSZip can read/generate nodejs Buffer, false otherwise.
- // Browserify will provide a Buffer implementation for browsers, which is
- // an augmented Uint8Array (i.e., can be used as either Buffer or U8).
- exports.nodebuffer = typeof Buffer !== "undefined";
- // contains true if JSZip can read/generate Uint8Array, false otherwise.
- exports.uint8array = typeof Uint8Array !== "undefined";
-
- if (typeof ArrayBuffer === "undefined") {
- exports.blob = false;
- }
- else {
- var buffer = new ArrayBuffer(0);
- try {
- exports.blob = new Blob([buffer], {
- type: "application/zip"
- }).size === 0;
- }
- catch (e) {
- try {
- var Builder = window.BlobBuilder || window.WebKitBlobBuilder || window.MozBlobBuilder || window.MSBlobBuilder;
- var builder = new Builder();
- builder.append(buffer);
- exports.blob = builder.getBlob('application/zip').size === 0;
- }
- catch (e) {
- exports.blob = false;
- }
- }
- }
-
- }).call(this,(typeof Buffer !== "undefined" ? Buffer : undefined))
- },{}],18:[function(_dereq_,module,exports){
- 'use strict';
- var DataReader = _dereq_('./dataReader');
-
- function Uint8ArrayReader(data) {
- if (data) {
- this.data = data;
- this.length = this.data.length;
- this.index = 0;
- }
- }
- Uint8ArrayReader.prototype = new DataReader();
- /**
- * @see DataReader.byteAt
- */
- Uint8ArrayReader.prototype.byteAt = function(i) {
- return this.data[i];
- };
- /**
- * @see DataReader.lastIndexOfSignature
- */
- Uint8ArrayReader.prototype.lastIndexOfSignature = function(sig) {
- var sig0 = sig.charCodeAt(0),
- sig1 = sig.charCodeAt(1),
- sig2 = sig.charCodeAt(2),
- sig3 = sig.charCodeAt(3);
- for (var i = this.length - 4; i >= 0; --i) {
- if (this.data[i] === sig0 && this.data[i + 1] === sig1 && this.data[i + 2] === sig2 && this.data[i + 3] === sig3) {
- return i;
- }
- }
-
- return -1;
- };
- /**
- * @see DataReader.readData
- */
- Uint8ArrayReader.prototype.readData = function(size) {
- this.checkOffset(size);
- if(size === 0) {
- // in IE10, when using subarray(idx, idx), we get the array [0x00] instead of [].
- return new Uint8Array(0);
- }
- var result = this.data.subarray(this.index, this.index + size);
- this.index += size;
- return result;
- };
- module.exports = Uint8ArrayReader;
-
- },{"./dataReader":5}],19:[function(_dereq_,module,exports){
- 'use strict';
-
- var utils = _dereq_('./utils');
-
- /**
- * An object to write any content to an Uint8Array.
- * @constructor
- * @param {number} length The length of the array.
- */
- var Uint8ArrayWriter = function(length) {
- this.data = new Uint8Array(length);
- this.index = 0;
- };
- Uint8ArrayWriter.prototype = {
- /**
- * Append any content to the current array.
- * @param {Object} input the content to add.
- */
- append: function(input) {
- if (input.length !== 0) {
- // with an empty Uint8Array, Opera fails with a "Offset larger than array size"
- input = utils.transformTo("uint8array", input);
- this.data.set(input, this.index);
- this.index += input.length;
- }
- },
- /**
- * Finalize the construction an return the result.
- * @return {Uint8Array} the generated array.
- */
- finalize: function() {
- return this.data;
- }
- };
-
- module.exports = Uint8ArrayWriter;
-
- },{"./utils":21}],20:[function(_dereq_,module,exports){
- 'use strict';
-
- var utils = _dereq_('./utils');
- var support = _dereq_('./support');
- var nodeBuffer = _dereq_('./nodeBuffer');
-
- /**
- * The following functions come from pako, from pako/lib/utils/strings
- * released under the MIT license, see pako https://github.com/nodeca/pako/
- */
-
- // Table with utf8 lengths (calculated by first byte of sequence)
- // Note, that 5 & 6-byte values and some 4-byte values can not be represented in JS,
- // because max possible codepoint is 0x10ffff
- var _utf8len = new Array(256);
- for (var i=0; i<256; i++) {
- _utf8len[i] = (i >= 252 ? 6 : i >= 248 ? 5 : i >= 240 ? 4 : i >= 224 ? 3 : i >= 192 ? 2 : 1);
- }
- _utf8len[254]=_utf8len[254]=1; // Invalid sequence start
-
- // convert string to array (typed, when possible)
- var string2buf = function (str) {
- var buf, c, c2, m_pos, i, str_len = str.length, buf_len = 0;
-
- // count binary size
- for (m_pos = 0; m_pos < str_len; m_pos++) {
- c = str.charCodeAt(m_pos);
- if (((c & 0xfc00) === 0xd800) && (m_pos+1 < str_len)) {
- c2 = str.charCodeAt(m_pos+1);
- if ((c2 & 0xfc00) === 0xdc00) {
- c = 0x10000 + ((c - 0xd800) << 10) + (c2 - 0xdc00);
- m_pos++;
- }
- }
- buf_len += (c < 0x80) ? 1 : ((c < 0x800) ? 2 : ((c < 0x10000) ? 3 : 4));
- }
-
- // allocate buffer
- if (support.uint8array) {
- buf = new Uint8Array(buf_len);
- } else {
- buf = new Array(buf_len);
- }
-
- // convert
- for (i=0, m_pos = 0; i < buf_len; m_pos++) {
- c = str.charCodeAt(m_pos);
- if ((c & 0xfc00) === 0xd800 && (m_pos+1 < str_len)) {
- c2 = str.charCodeAt(m_pos+1);
- if ((c2 & 0xfc00) === 0xdc00) {
- c = 0x10000 + ((c - 0xd800) << 10) + (c2 - 0xdc00);
- m_pos++;
- }
- }
- if (c < 0x80) {
- /* one byte */
- buf[i++] = c;
- } else if (c < 0x800) {
- /* two bytes */
- buf[i++] = 0xC0 | (c >>> 6);
- buf[i++] = 0x80 | (c & 0x3f);
- } else if (c < 0x10000) {
- /* three bytes */
- buf[i++] = 0xE0 | (c >>> 12);
- buf[i++] = 0x80 | ((c >>> 6) & 0x3f);
- buf[i++] = 0x80 | (c & 0x3f);
- } else {
- /* four bytes */
- buf[i++] = 0xf0 | (c >>> 18);
- buf[i++] = 0x80 | ((c >>> 12) & 0x3f);
- buf[i++] = 0x80 | ((c >>> 6) & 0x3f);
- buf[i++] = 0x80 | (c & 0x3f);
- }
- }
-
- return buf;
- };
-
- // Calculate max possible position in utf8 buffer,
- // that will not break sequence. If that's not possible
- // - (very small limits) return max size as is.
- //
- // buf[] - utf8 bytes array
- // max - length limit (mandatory);
- var utf8border = function(buf, max) {
- var pos;
-
- max = max || buf.length;
- if (max > buf.length) { max = buf.length; }
-
- // go back from last position, until start of sequence found
- pos = max-1;
- while (pos >= 0 && (buf[pos] & 0xC0) === 0x80) { pos--; }
-
- // Fuckup - very small and broken sequence,
- // return max, because we should return something anyway.
- if (pos < 0) { return max; }
-
- // If we came to start of buffer - that means vuffer is too small,
- // return max too.
- if (pos === 0) { return max; }
-
- return (pos + _utf8len[buf[pos]] > max) ? pos : max;
- };
-
- // convert array to string
- var buf2string = function (buf) {
- var str, i, out, c, c_len;
- var len = buf.length;
-
- // Reserve max possible length (2 words per char)
- // NB: by unknown reasons, Array is significantly faster for
- // String.fromCharCode.apply than Uint16Array.
- var utf16buf = new Array(len*2);
-
- for (out=0, i=0; i<len;) {
- c = buf[i++];
- // quick process ascii
- if (c < 0x80) { utf16buf[out++] = c; continue; }
-
- c_len = _utf8len[c];
- // skip 5 & 6 byte codes
- if (c_len > 4) { utf16buf[out++] = 0xfffd; i += c_len-1; continue; }
-
- // apply mask on first byte
- c &= c_len === 2 ? 0x1f : c_len === 3 ? 0x0f : 0x07;
- // join the rest
- while (c_len > 1 && i < len) {
- c = (c << 6) | (buf[i++] & 0x3f);
- c_len--;
- }
-
- // terminated by end of string?
- if (c_len > 1) { utf16buf[out++] = 0xfffd; continue; }
-
- if (c < 0x10000) {
- utf16buf[out++] = c;
- } else {
- c -= 0x10000;
- utf16buf[out++] = 0xd800 | ((c >> 10) & 0x3ff);
- utf16buf[out++] = 0xdc00 | (c & 0x3ff);
- }
- }
-
- // shrinkBuf(utf16buf, out)
- if (utf16buf.length !== out) {
- if(utf16buf.subarray) {
- utf16buf = utf16buf.subarray(0, out);
- } else {
- utf16buf.length = out;
- }
- }
-
- // return String.fromCharCode.apply(null, utf16buf);
- return utils.applyFromCharCode(utf16buf);
- };
-
-
- // That's all for the pako functions.
-
-
- /**
- * Transform a javascript string into an array (typed if possible) of bytes,
- * UTF-8 encoded.
- * @param {String} str the string to encode
- * @return {Array|Uint8Array|Buffer} the UTF-8 encoded string.
- */
- exports.utf8encode = function utf8encode(str) {
- if (support.nodebuffer) {
- return nodeBuffer(str, "utf-8");
- }
-
- return string2buf(str);
- };
-
-
- /**
- * Transform a bytes array (or a representation) representing an UTF-8 encoded
- * string into a javascript string.
- * @param {Array|Uint8Array|Buffer} buf the data de decode
- * @return {String} the decoded string.
- */
- exports.utf8decode = function utf8decode(buf) {
- if (support.nodebuffer) {
- return utils.transformTo("nodebuffer", buf).toString("utf-8");
- }
-
- buf = utils.transformTo(support.uint8array ? "uint8array" : "array", buf);
-
- // return buf2string(buf);
- // Chrome prefers to work with "small" chunks of data
- // for the method buf2string.
- // Firefox and Chrome has their own shortcut, IE doesn't seem to really care.
- var result = [], k = 0, len = buf.length, chunk = 65536;
- while (k < len) {
- var nextBoundary = utf8border(buf, Math.min(k + chunk, len));
- if (support.uint8array) {
- result.push(buf2string(buf.subarray(k, nextBoundary)));
- } else {
- result.push(buf2string(buf.slice(k, nextBoundary)));
- }
- k = nextBoundary;
- }
- return result.join("");
-
- };
- // vim: set shiftwidth=4 softtabstop=4:
-
- },{"./nodeBuffer":11,"./support":17,"./utils":21}],21:[function(_dereq_,module,exports){
- 'use strict';
- var support = _dereq_('./support');
- var compressions = _dereq_('./compressions');
- var nodeBuffer = _dereq_('./nodeBuffer');
- /**
- * Convert a string to a "binary string" : a string containing only char codes between 0 and 255.
- * @param {string} str the string to transform.
- * @return {String} the binary string.
- */
- exports.string2binary = function(str) {
- var result = "";
- for (var i = 0; i < str.length; i++) {
- result += String.fromCharCode(str.charCodeAt(i) & 0xff);
- }
- return result;
- };
- exports.arrayBuffer2Blob = function(buffer) {
- exports.checkSupport("blob");
-
- try {
- // Blob constructor
- return new Blob([buffer], {
- type: "application/zip"
- });
- }
- catch (e) {
-
- try {
- // deprecated, browser only, old way
- var Builder = window.BlobBuilder || window.WebKitBlobBuilder || window.MozBlobBuilder || window.MSBlobBuilder;
- var builder = new Builder();
- builder.append(buffer);
- return builder.getBlob('application/zip');
- }
- catch (e) {
-
- // well, fuck ?!
- throw new Error("Bug : can't construct the Blob.");
- }
- }
-
-
- };
- /**
- * The identity function.
- * @param {Object} input the input.
- * @return {Object} the same input.
- */
- function identity(input) {
- return input;
- }
-
- /**
- * Fill in an array with a string.
- * @param {String} str the string to use.
- * @param {Array|ArrayBuffer|Uint8Array|Buffer} array the array to fill in (will be mutated).
- * @return {Array|ArrayBuffer|Uint8Array|Buffer} the updated array.
- */
- function stringToArrayLike(str, array) {
- for (var i = 0; i < str.length; ++i) {
- array[i] = str.charCodeAt(i) & 0xFF;
- }
- return array;
- }
-
- /**
- * Transform an array-like object to a string.
- * @param {Array|ArrayBuffer|Uint8Array|Buffer} array the array to transform.
- * @return {String} the result.
- */
- function arrayLikeToString(array) {
- // Performances notes :
- // --------------------
- // String.fromCharCode.apply(null, array) is the fastest, see
- // see http://jsperf.com/converting-a-uint8array-to-a-string/2
- // but the stack is limited (and we can get huge arrays !).
- //
- // result += String.fromCharCode(array[i]); generate too many strings !
- //
- // This code is inspired by http://jsperf.com/arraybuffer-to-string-apply-performance/2
- var chunk = 65536;
- var result = [],
- len = array.length,
- type = exports.getTypeOf(array),
- k = 0,
- canUseApply = true;
- try {
- switch(type) {
- case "uint8array":
- String.fromCharCode.apply(null, new Uint8Array(0));
- break;
- case "nodebuffer":
- String.fromCharCode.apply(null, nodeBuffer(0));
- break;
- }
- } catch(e) {
- canUseApply = false;
- }
-
- // no apply : slow and painful algorithm
- // default browser on android 4.*
- if (!canUseApply) {
- var resultStr = "";
- for(var i = 0; i < array.length;i++) {
- resultStr += String.fromCharCode(array[i]);
- }
- return resultStr;
- }
- while (k < len && chunk > 1) {
- try {
- if (type === "array" || type === "nodebuffer") {
- result.push(String.fromCharCode.apply(null, array.slice(k, Math.min(k + chunk, len))));
- }
- else {
- result.push(String.fromCharCode.apply(null, array.subarray(k, Math.min(k + chunk, len))));
- }
- k += chunk;
- }
- catch (e) {
- chunk = Math.floor(chunk / 2);
- }
- }
- return result.join("");
- }
-
- exports.applyFromCharCode = arrayLikeToString;
-
-
- /**
- * Copy the data from an array-like to an other array-like.
- * @param {Array|ArrayBuffer|Uint8Array|Buffer} arrayFrom the origin array.
- * @param {Array|ArrayBuffer|Uint8Array|Buffer} arrayTo the destination array which will be mutated.
- * @return {Array|ArrayBuffer|Uint8Array|Buffer} the updated destination array.
- */
- function arrayLikeToArrayLike(arrayFrom, arrayTo) {
- for (var i = 0; i < arrayFrom.length; i++) {
- arrayTo[i] = arrayFrom[i];
- }
- return arrayTo;
- }
-
- // a matrix containing functions to transform everything into everything.
- var transform = {};
-
- // string to ?
- transform["string"] = {
- "string": identity,
- "array": function(input) {
- return stringToArrayLike(input, new Array(input.length));
- },
- "arraybuffer": function(input) {
- return transform["string"]["uint8array"](input).buffer;
- },
- "uint8array": function(input) {
- return stringToArrayLike(input, new Uint8Array(input.length));
- },
- "nodebuffer": function(input) {
- return stringToArrayLike(input, nodeBuffer(input.length));
- }
- };
-
- // array to ?
- transform["array"] = {
- "string": arrayLikeToString,
- "array": identity,
- "arraybuffer": function(input) {
- return (new Uint8Array(input)).buffer;
- },
- "uint8array": function(input) {
- return new Uint8Array(input);
- },
- "nodebuffer": function(input) {
- return nodeBuffer(input);
- }
- };
-
- // arraybuffer to ?
- transform["arraybuffer"] = {
- "string": function(input) {
- return arrayLikeToString(new Uint8Array(input));
- },
- "array": function(input) {
- return arrayLikeToArrayLike(new Uint8Array(input), new Array(input.byteLength));
- },
- "arraybuffer": identity,
- "uint8array": function(input) {
- return new Uint8Array(input);
- },
- "nodebuffer": function(input) {
- return nodeBuffer(new Uint8Array(input));
- }
- };
-
- // uint8array to ?
- transform["uint8array"] = {
- "string": arrayLikeToString,
- "array": function(input) {
- return arrayLikeToArrayLike(input, new Array(input.length));
- },
- "arraybuffer": function(input) {
- return input.buffer;
- },
- "uint8array": identity,
- "nodebuffer": function(input) {
- return nodeBuffer(input);
- }
- };
-
- // nodebuffer to ?
- transform["nodebuffer"] = {
- "string": arrayLikeToString,
- "array": function(input) {
- return arrayLikeToArrayLike(input, new Array(input.length));
- },
- "arraybuffer": function(input) {
- return transform["nodebuffer"]["uint8array"](input).buffer;
- },
- "uint8array": function(input) {
- return arrayLikeToArrayLike(input, new Uint8Array(input.length));
- },
- "nodebuffer": identity
- };
-
- /**
- * Transform an input into any type.
- * The supported output type are : string, array, uint8array, arraybuffer, nodebuffer.
- * If no output type is specified, the unmodified input will be returned.
- * @param {String} outputType the output type.
- * @param {String|Array|ArrayBuffer|Uint8Array|Buffer} input the input to convert.
- * @throws {Error} an Error if the browser doesn't support the requested output type.
- */
- exports.transformTo = function(outputType, input) {
- if (!input) {
- // undefined, null, etc
- // an empty string won't harm.
- input = "";
- }
- if (!outputType) {
- return input;
- }
- exports.checkSupport(outputType);
- var inputType = exports.getTypeOf(input);
- var result = transform[inputType][outputType](input);
- return result;
- };
-
- /**
- * Return the type of the input.
- * The type will be in a format valid for JSZip.utils.transformTo : string, array, uint8array, arraybuffer.
- * @param {Object} input the input to identify.
- * @return {String} the (lowercase) type of the input.
- */
- exports.getTypeOf = function(input) {
- if (typeof input === "string") {
- return "string";
- }
- if (Object.prototype.toString.call(input) === "[object Array]") {
- return "array";
- }
- if (support.nodebuffer && nodeBuffer.test(input)) {
- return "nodebuffer";
- }
- if (support.uint8array && input instanceof Uint8Array) {
- return "uint8array";
- }
- if (support.arraybuffer && input instanceof ArrayBuffer) {
- return "arraybuffer";
- }
- };
-
- /**
- * Throw an exception if the type is not supported.
- * @param {String} type the type to check.
- * @throws {Error} an Error if the browser doesn't support the requested type.
- */
- exports.checkSupport = function(type) {
- var supported = support[type.toLowerCase()];
- if (!supported) {
- throw new Error(type + " is not supported by this browser");
- }
- };
- exports.MAX_VALUE_16BITS = 65535;
- exports.MAX_VALUE_32BITS = -1; // well, "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF" is parsed as -1
-
- /**
- * Prettify a string read as binary.
- * @param {string} str the string to prettify.
- * @return {string} a pretty string.
- */
- exports.pretty = function(str) {
- var res = '',
- code, i;
- for (i = 0; i < (str || "").length; i++) {
- code = str.charCodeAt(i);
- res += '\\x' + (code < 16 ? "0" : "") + code.toString(16).toUpperCase();
- }
- return res;
- };
-
- /**
- * Find a compression registered in JSZip.
- * @param {string} compressionMethod the method magic to find.
- * @return {Object|null} the JSZip compression object, null if none found.
- */
- exports.findCompression = function(compressionMethod) {
- for (var method in compressions) {
- if (!compressions.hasOwnProperty(method)) {
- continue;
- }
- if (compressions[method].magic === compressionMethod) {
- return compressions[method];
- }
- }
- return null;
- };
- /**
- * Cross-window, cross-Node-context regular expression detection
- * @param {Object} object Anything
- * @return {Boolean} true if the object is a regular expression,
- * false otherwise
- */
- exports.isRegExp = function (object) {
- return Object.prototype.toString.call(object) === "[object RegExp]";
- };
-
-
- },{"./compressions":3,"./nodeBuffer":11,"./support":17}],22:[function(_dereq_,module,exports){
- 'use strict';
- var StringReader = _dereq_('./stringReader');
- var NodeBufferReader = _dereq_('./nodeBufferReader');
- var Uint8ArrayReader = _dereq_('./uint8ArrayReader');
- var utils = _dereq_('./utils');
- var sig = _dereq_('./signature');
- var ZipEntry = _dereq_('./zipEntry');
- var support = _dereq_('./support');
- var jszipProto = _dereq_('./object');
- // class ZipEntries {{{
- /**
- * All the entries in the zip file.
- * @constructor
- * @param {String|ArrayBuffer|Uint8Array} data the binary stream to load.
- * @param {Object} loadOptions Options for loading the stream.
- */
- function ZipEntries(data, loadOptions) {
- this.files = [];
- this.loadOptions = loadOptions;
- if (data) {
- this.load(data);
- }
- }
- ZipEntries.prototype = {
- /**
- * Check that the reader is on the speficied signature.
- * @param {string} expectedSignature the expected signature.
- * @throws {Error} if it is an other signature.
- */
- checkSignature: function(expectedSignature) {
- var signature = this.reader.readString(4);
- if (signature !== expectedSignature) {
- throw new Error("Corrupted zip or bug : unexpected signature " + "(" + utils.pretty(signature) + ", expected " + utils.pretty(expectedSignature) + ")");
- }
- },
- /**
- * Read the end of the central directory.
- */
- readBlockEndOfCentral: function() {
- this.diskNumber = this.reader.readInt(2);
- this.diskWithCentralDirStart = this.reader.readInt(2);
- this.centralDirRecordsOnThisDisk = this.reader.readInt(2);
- this.centralDirRecords = this.reader.readInt(2);
- this.centralDirSize = this.reader.readInt(4);
- this.centralDirOffset = this.reader.readInt(4);
-
- this.zipCommentLength = this.reader.readInt(2);
- // warning : the encoding depends of the system locale
- // On a linux machine with LANG=en_US.utf8, this field is utf8 encoded.
- // On a windows machine, this field is encoded with the localized windows code page.
- this.zipComment = this.reader.readString(this.zipCommentLength);
- // To get consistent behavior with the generation part, we will assume that
- // this is utf8 encoded.
- this.zipComment = jszipProto.utf8decode(this.zipComment);
- },
- /**
- * Read the end of the Zip 64 central directory.
- * Not merged with the method readEndOfCentral :
- * The end of central can coexist with its Zip64 brother,
- * I don't want to read the wrong number of bytes !
- */
- readBlockZip64EndOfCentral: function() {
- this.zip64EndOfCentralSize = this.reader.readInt(8);
- this.versionMadeBy = this.reader.readString(2);
- this.versionNeeded = this.reader.readInt(2);
- this.diskNumber = this.reader.readInt(4);
- this.diskWithCentralDirStart = this.reader.readInt(4);
- this.centralDirRecordsOnThisDisk = this.reader.readInt(8);
- this.centralDirRecords = this.reader.readInt(8);
- this.centralDirSize = this.reader.readInt(8);
- this.centralDirOffset = this.reader.readInt(8);
-
- this.zip64ExtensibleData = {};
- var extraDataSize = this.zip64EndOfCentralSize - 44,
- index = 0,
- extraFieldId,
- extraFieldLength,
- extraFieldValue;
- while (index < extraDataSize) {
- extraFieldId = this.reader.readInt(2);
- extraFieldLength = this.reader.readInt(4);
- extraFieldValue = this.reader.readString(extraFieldLength);
- this.zip64ExtensibleData[extraFieldId] = {
- id: extraFieldId,
- length: extraFieldLength,
- value: extraFieldValue
- };
- }
- },
- /**
- * Read the end of the Zip 64 central directory locator.
- */
- readBlockZip64EndOfCentralLocator: function() {
- this.diskWithZip64CentralDirStart = this.reader.readInt(4);
- this.relativeOffsetEndOfZip64CentralDir = this.reader.readInt(8);
- this.disksCount = this.reader.readInt(4);
- if (this.disksCount > 1) {
- throw new Error("Multi-volumes zip are not supported");
- }
- },
- /**
- * Read the local files, based on the offset read in the central part.
- */
- readLocalFiles: function() {
- var i, file;
- for (i = 0; i < this.files.length; i++) {
- file = this.files[i];
- this.reader.setIndex(file.localHeaderOffset);
- this.checkSignature(sig.LOCAL_FILE_HEADER);
- file.readLocalPart(this.reader);
- file.handleUTF8();
- }
- },
- /**
- * Read the central directory.
- */
- readCentralDir: function() {
- var file;
-
- this.reader.setIndex(this.centralDirOffset);
- while (this.reader.readString(4) === sig.CENTRAL_FILE_HEADER) {
- file = new ZipEntry({
- zip64: this.zip64
- }, this.loadOptions);
- file.readCentralPart(this.reader);
- this.files.push(file);
- }
- },
- /**
- * Read the end of central directory.
- */
- readEndOfCentral: function() {
- var offset = this.reader.lastIndexOfSignature(sig.CENTRAL_DIRECTORY_END);
- if (offset === -1) {
- throw new Error("Corrupted zip : can't find end of central directory");
- }
- this.reader.setIndex(offset);
- this.checkSignature(sig.CENTRAL_DIRECTORY_END);
- this.readBlockEndOfCentral();
-
-
- /* extract from the zip spec :
- 4) If one of the fields in the end of central directory
- record is too small to hold required data, the field
- should be set to -1 (0xFFFF or 0xFFFFFFFF) and the
- ZIP64 format record should be created.
- 5) The end of central directory record and the
- Zip64 end of central directory locator record must
- reside on the same disk when splitting or spanning
- an archive.
- */
- 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) {
- this.zip64 = true;
-
- /*
- Warning : the zip64 extension is supported, but ONLY if the 64bits integer read from
- the zip file can fit into a 32bits integer. This cannot be solved : Javascript represents
- all numbers as 64-bit double precision IEEE 754 floating point numbers.
- So, we have 53bits for integers and bitwise operations treat everything as 32bits.
- see https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Operators/Bitwise_Operators
- and http://www.ecma-international.org/publications/files/ECMA-ST/ECMA-262.pdf section 8.5
- */
-
- // should look for a zip64 EOCD locator
- offset = this.reader.lastIndexOfSignature(sig.ZIP64_CENTRAL_DIRECTORY_LOCATOR);
- if (offset === -1) {
- throw new Error("Corrupted zip : can't find the ZIP64 end of central directory locator");
- }
- this.reader.setIndex(offset);
- this.checkSignature(sig.ZIP64_CENTRAL_DIRECTORY_LOCATOR);
- this.readBlockZip64EndOfCentralLocator();
-
- // now the zip64 EOCD record
- this.reader.setIndex(this.relativeOffsetEndOfZip64CentralDir);
- this.checkSignature(sig.ZIP64_CENTRAL_DIRECTORY_END);
- this.readBlockZip64EndOfCentral();
- }
- },
- prepareReader: function(data) {
- var type = utils.getTypeOf(data);
- if (type === "string" && !support.uint8array) {
- this.reader = new StringReader(data, this.loadOptions.optimizedBinaryString);
- }
- else if (type === "nodebuffer") {
- this.reader = new NodeBufferReader(data);
- }
- else {
- this.reader = new Uint8ArrayReader(utils.transformTo("uint8array", data));
- }
- },
- /**
- * Read a zip file and create ZipEntries.
- * @param {String|ArrayBuffer|Uint8Array|Buffer} data the binary string representing a zip file.
- */
- load: function(data) {
- this.prepareReader(data);
- this.readEndOfCentral();
- this.readCentralDir();
- this.readLocalFiles();
- }
- };
- // }}} end of ZipEntries
- module.exports = ZipEntries;
-
- },{"./nodeBufferReader":12,"./object":13,"./signature":14,"./stringReader":15,"./support":17,"./uint8ArrayReader":18,"./utils":21,"./zipEntry":23}],23:[function(_dereq_,module,exports){
- 'use strict';
- var StringReader = _dereq_('./stringReader');
- var utils = _dereq_('./utils');
- var CompressedObject = _dereq_('./compressedObject');
- var jszipProto = _dereq_('./object');
- // class ZipEntry {{{
- /**
- * An entry in the zip file.
- * @constructor
- * @param {Object} options Options of the current file.
- * @param {Object} loadOptions Options for loading the stream.
- */
- function ZipEntry(options, loadOptions) {
- this.options = options;
- this.loadOptions = loadOptions;
- }
- ZipEntry.prototype = {
- /**
- * say if the file is encrypted.
- * @return {boolean} true if the file is encrypted, false otherwise.
- */
- isEncrypted: function() {
- // bit 1 is set
- return (this.bitFlag & 0x0001) === 0x0001;
- },
- /**
- * say if the file has utf-8 filename/comment.
- * @return {boolean} true if the filename/comment is in utf-8, false otherwise.
- */
- useUTF8: function() {
- // bit 11 is set
- return (this.bitFlag & 0x0800) === 0x0800;
- },
- /**
- * Prepare the function used to generate the compressed content from this ZipFile.
- * @param {DataReader} reader the reader to use.
- * @param {number} from the offset from where we should read the data.
- * @param {number} length the length of the data to read.
- * @return {Function} the callback to get the compressed content (the type depends of the DataReader class).
- */
- prepareCompressedContent: function(reader, from, length) {
- return function() {
- var previousIndex = reader.index;
- reader.setIndex(from);
- var compressedFileData = reader.readData(length);
- reader.setIndex(previousIndex);
-
- return compressedFileData;
- };
- },
- /**
- * Prepare the function used to generate the uncompressed content from this ZipFile.
- * @param {DataReader} reader the reader to use.
- * @param {number} from the offset from where we should read the data.
- * @param {number} length the length of the data to read.
- * @param {JSZip.compression} compression the compression used on this file.
- * @param {number} uncompressedSize the uncompressed size to expect.
- * @return {Function} the callback to get the uncompressed content (the type depends of the DataReader class).
- */
- prepareContent: function(reader, from, length, compression, uncompressedSize) {
- return function() {
-
- var compressedFileData = utils.transformTo(compression.uncompressInputType, this.getCompressedContent());
- var uncompressedFileData = compression.uncompress(compressedFileData);
-
- if (uncompressedFileData.length !== uncompressedSize) {
- throw new Error("Bug : uncompressed data size mismatch");
- }
-
- return uncompressedFileData;
- };
- },
- /**
- * Read the local part of a zip file and add the info in this object.
- * @param {DataReader} reader the reader to use.
- */
- readLocalPart: function(reader) {
- var compression, localExtraFieldsLength;
-
- // we already know everything from the central dir !
- // If the central dir data are false, we are doomed.
- // On the bright side, the local part is scary : zip64, data descriptors, both, etc.
- // The less data we get here, the more reliable this should be.
- // Let's skip the whole header and dash to the data !
- reader.skip(22);
- // in some zip created on windows, the filename stored in the central dir contains \ instead of /.
- // Strangely, the filename here is OK.
- // I would love to treat these zip files as corrupted (see http://www.info-zip.org/FAQ.html#backslashes
- // or APPNOTE#4.4.17.1, "All slashes MUST be forward slashes '/'") but there are a lot of bad zip generators...
- // Search "unzip mismatching "local" filename continuing with "central" filename version" on
- // the internet.
- //
- // I think I see the logic here : the central directory is used to display
- // content and the local directory is used to extract the files. Mixing / and \
- // may be used to display \ to windows users and use / when extracting the files.
- // Unfortunately, this lead also to some issues : http://seclists.org/fulldisclosure/2009/Sep/394
- this.fileNameLength = reader.readInt(2);
- localExtraFieldsLength = reader.readInt(2); // can't be sure this will be the same as the central dir
- this.fileName = reader.readString(this.fileNameLength);
- reader.skip(localExtraFieldsLength);
-
- if (this.compressedSize == -1 || this.uncompressedSize == -1) {
- throw new Error("Bug or corrupted zip : didn't get enough informations from the central directory " + "(compressedSize == -1 || uncompressedSize == -1)");
- }
-
- compression = utils.findCompression(this.compressionMethod);
- if (compression === null) { // no compression found
- throw new Error("Corrupted zip : compression " + utils.pretty(this.compressionMethod) + " unknown (inner file : " + this.fileName + ")");
- }
- this.decompressed = new CompressedObject();
- this.decompressed.compressedSize = this.compressedSize;
- this.decompressed.uncompressedSize = this.uncompressedSize;
- this.decompressed.crc32 = this.crc32;
- this.decompressed.compressionMethod = this.compressionMethod;
- this.decompressed.getCompressedContent = this.prepareCompressedContent(reader, reader.index, this.compressedSize, compression);
- this.decompressed.getContent = this.prepareContent(reader, reader.index, this.compressedSize, compression, this.uncompressedSize);
-
- // we need to compute the crc32...
- if (this.loadOptions.checkCRC32) {
- this.decompressed = utils.transformTo("string", this.decompressed.getContent());
- if (jszipProto.crc32(this.decompressed) !== this.crc32) {
- throw new Error("Corrupted zip : CRC32 mismatch");
- }
- }
- },
-
- /**
- * Read the central part of a zip file and add the info in this object.
- * @param {DataReader} reader the reader to use.
- */
- readCentralPart: function(reader) {
- this.versionMadeBy = reader.readString(2);
- this.versionNeeded = reader.readInt(2);
- this.bitFlag = reader.readInt(2);
- this.compressionMethod = reader.readString(2);
- this.date = reader.readDate();
- this.crc32 = reader.readInt(4);
- this.compressedSize = reader.readInt(4);
- this.uncompressedSize = reader.readInt(4);
- this.fileNameLength = reader.readInt(2);
- this.extraFieldsLength = reader.readInt(2);
- this.fileCommentLength = reader.readInt(2);
- this.diskNumberStart = reader.readInt(2);
- this.internalFileAttributes = reader.readInt(2);
- this.externalFileAttributes = reader.readInt(4);
- this.localHeaderOffset = reader.readInt(4);
-
- if (this.isEncrypted()) {
- throw new Error("Encrypted zip are not supported");
- }
-
- this.fileName = reader.readString(this.fileNameLength);
- this.readExtraFields(reader);
- this.parseZIP64ExtraField(reader);
- this.fileComment = reader.readString(this.fileCommentLength);
-
- // warning, this is true only for zip with madeBy == DOS (plateform dependent feature)
- this.dir = this.externalFileAttributes & 0x00000010 ? true : false;
- },
- /**
- * Parse the ZIP64 extra field and merge the info in the current ZipEntry.
- * @param {DataReader} reader the reader to use.
- */
- parseZIP64ExtraField: function(reader) {
-
- if (!this.extraFields[0x0001]) {
- return;
- }
-
- // should be something, preparing the extra reader
- var extraReader = new StringReader(this.extraFields[0x0001].value);
-
- // I really hope that these 64bits integer can fit in 32 bits integer, because js
- // won't let us have more.
- if (this.uncompressedSize === utils.MAX_VALUE_32BITS) {
- this.uncompressedSize = extraReader.readInt(8);
- }
- if (this.compressedSize === utils.MAX_VALUE_32BITS) {
- this.compressedSize = extraReader.readInt(8);
- }
- if (this.localHeaderOffset === utils.MAX_VALUE_32BITS) {
- this.localHeaderOffset = extraReader.readInt(8);
- }
- if (this.diskNumberStart === utils.MAX_VALUE_32BITS) {
- this.diskNumberStart = extraReader.readInt(4);
- }
- },
- /**
- * Read the central part of a zip file and add the info in this object.
- * @param {DataReader} reader the reader to use.
- */
- readExtraFields: function(reader) {
- var start = reader.index,
- extraFieldId,
- extraFieldLength,
- extraFieldValue;
-
- this.extraFields = this.extraFields || {};
-
- while (reader.index < start + this.extraFieldsLength) {
- extraFieldId = reader.readInt(2);
- extraFieldLength = reader.readInt(2);
- extraFieldValue = reader.readString(extraFieldLength);
-
- this.extraFields[extraFieldId] = {
- id: extraFieldId,
- length: extraFieldLength,
- value: extraFieldValue
- };
- }
- },
- /**
- * Apply an UTF8 transformation if needed.
- */
- handleUTF8: function() {
- if (this.useUTF8()) {
- this.fileName = jszipProto.utf8decode(this.fileName);
- this.fileComment = jszipProto.utf8decode(this.fileComment);
- } else {
- var upath = this.findExtraFieldUnicodePath();
- if (upath !== null) {
- this.fileName = upath;
- }
- var ucomment = this.findExtraFieldUnicodeComment();
- if (ucomment !== null) {
- this.fileComment = ucomment;
- }
- }
- },
-
- /**
- * Find the unicode path declared in the extra field, if any.
- * @return {String} the unicode path, null otherwise.
- */
- findExtraFieldUnicodePath: function() {
- var upathField = this.extraFields[0x7075];
- if (upathField) {
- var extraReader = new StringReader(upathField.value);
-
- // wrong version
- if (extraReader.readInt(1) !== 1) {
- return null;
- }
-
- // the crc of the filename changed, this field is out of date.
- if (jszipProto.crc32(this.fileName) !== extraReader.readInt(4)) {
- return null;
- }
-
- return jszipProto.utf8decode(extraReader.readString(upathField.length - 5));
- }
- return null;
- },
-
- /**
- * Find the unicode comment declared in the extra field, if any.
- * @return {String} the unicode comment, null otherwise.
- */
- findExtraFieldUnicodeComment: function() {
- var ucommentField = this.extraFields[0x6375];
- if (ucommentField) {
- var extraReader = new StringReader(ucommentField.value);
-
- // wrong version
- if (extraReader.readInt(1) !== 1) {
- return null;
- }
-
- // the crc of the comment changed, this field is out of date.
- if (jszipProto.crc32(this.fileComment) !== extraReader.readInt(4)) {
- return null;
- }
-
- return jszipProto.utf8decode(extraReader.readString(ucommentField.length - 5));
- }
- return null;
- }
- };
- module.exports = ZipEntry;
-
- },{"./compressedObject":2,"./object":13,"./stringReader":15,"./utils":21}],24:[function(_dereq_,module,exports){
- // Top level file is just a mixin of submodules & constants
- 'use strict';
-
- var assign = _dereq_('./lib/utils/common').assign;
-
- var deflate = _dereq_('./lib/deflate');
- var inflate = _dereq_('./lib/inflate');
- var constants = _dereq_('./lib/zlib/constants');
-
- var pako = {};
-
- assign(pako, deflate, inflate, constants);
-
- module.exports = pako;
- },{"./lib/deflate":25,"./lib/inflate":26,"./lib/utils/common":27,"./lib/zlib/constants":30}],25:[function(_dereq_,module,exports){
- 'use strict';
-
-
- var zlib_deflate = _dereq_('./zlib/deflate.js');
- var utils = _dereq_('./utils/common');
- var strings = _dereq_('./utils/strings');
- var msg = _dereq_('./zlib/messages');
- var zstream = _dereq_('./zlib/zstream');
-
-
- /* Public constants ==========================================================*/
- /* ===========================================================================*/
-
- var Z_NO_FLUSH = 0;
- var Z_FINISH = 4;
-
- var Z_OK = 0;
- var Z_STREAM_END = 1;
-
- var Z_DEFAULT_COMPRESSION = -1;
-
- var Z_DEFAULT_STRATEGY = 0;
-
- var Z_DEFLATED = 8;
-
- /* ===========================================================================*/
-
-
- /**
- * class Deflate
- *
- * Generic JS-style wrapper for zlib calls. If you don't need
- * streaming behaviour - use more simple functions: [[deflate]],
- * [[deflateRaw]] and [[gzip]].
- **/
-
- /* internal
- * Deflate.chunks -> Array
- *
- * Chunks of output data, if [[Deflate#onData]] not overriden.
- **/
-
- /**
- * Deflate.result -> Uint8Array|Array
- *
- * Compressed result, generated by default [[Deflate#onData]]
- * and [[Deflate#onEnd]] handlers. Filled after you push last chunk
- * (call [[Deflate#push]] with `Z_FINISH` / `true` param).
- **/
-
- /**
- * Deflate.err -> Number
- *
- * Error code after deflate finished. 0 (Z_OK) on success.
- * You will not need it in real life, because deflate errors
- * are possible only on wrong options or bad `onData` / `onEnd`
- * custom handlers.
- **/
-
- /**
- * Deflate.msg -> String
- *
- * Error message, if [[Deflate.err]] != 0
- **/
-
-
- /**
- * new Deflate(options)
- * - options (Object): zlib deflate options.
- *
- * Creates new deflator instance with specified params. Throws exception
- * on bad params. Supported options:
- *
- * - `level`
- * - `windowBits`
- * - `memLevel`
- * - `strategy`
- *
- * [http://zlib.net/manual.html#Advanced](http://zlib.net/manual.html#Advanced)
- * for more information on these.
- *
- * Additional options, for internal needs:
- *
- * - `chunkSize` - size of generated data chunks (16K by default)
- * - `raw` (Boolean) - do raw deflate
- * - `gzip` (Boolean) - create gzip wrapper
- * - `to` (String) - if equal to 'string', then result will be "binary string"
- * (each char code [0..255])
- * - `header` (Object) - custom header for gzip
- * - `text` (Boolean) - true if compressed data believed to be text
- * - `time` (Number) - modification time, unix timestamp
- * - `os` (Number) - operation system code
- * - `extra` (Array) - array of bytes with extra data (max 65536)
- * - `name` (String) - file name (binary string)
- * - `comment` (String) - comment (binary string)
- * - `hcrc` (Boolean) - true if header crc should be added
- *
- * ##### Example:
- *
- * ```javascript
- * var pako = require('pako')
- * , chunk1 = Uint8Array([1,2,3,4,5,6,7,8,9])
- * , chunk2 = Uint8Array([10,11,12,13,14,15,16,17,18,19]);
- *
- * var deflate = new pako.Deflate({ level: 3});
- *
- * deflate.push(chunk1, false);
- * deflate.push(chunk2, true); // true -> last chunk
- *
- * if (deflate.err) { throw new Error(deflate.err); }
- *
- * console.log(deflate.result);
- * ```
- **/
- var Deflate = function(options) {
-
- this.options = utils.assign({
- level: Z_DEFAULT_COMPRESSION,
- method: Z_DEFLATED,
- chunkSize: 16384,
- windowBits: 15,
- memLevel: 8,
- strategy: Z_DEFAULT_STRATEGY,
- to: ''
- }, options || {});
-
- var opt = this.options;
-
- if (opt.raw && (opt.windowBits > 0)) {
- opt.windowBits = -opt.windowBits;
- }
-
- else if (opt.gzip && (opt.windowBits > 0) && (opt.windowBits < 16)) {
- opt.windowBits += 16;
- }
-
- this.err = 0; // error code, if happens (0 = Z_OK)
- this.msg = ''; // error message
- this.ended = false; // used to avoid multiple onEnd() calls
- this.chunks = []; // chunks of compressed data
-
- this.strm = new zstream();
- this.strm.avail_out = 0;
-
- var status = zlib_deflate.deflateInit2(
- this.strm,
- opt.level,
- opt.method,
- opt.windowBits,
- opt.memLevel,
- opt.strategy
- );
-
- if (status !== Z_OK) {
- throw new Error(msg[status]);
- }
-
- if (opt.header) {
- zlib_deflate.deflateSetHeader(this.strm, opt.header);
- }
- };
-
- /**
- * Deflate#push(data[, mode]) -> Boolean
- * - data (Uint8Array|Array|String): input data. Strings will be converted to
- * utf8 byte sequence.
- * - mode (Number|Boolean): 0..6 for corresponding Z_NO_FLUSH..Z_TREE modes.
- * See constants. Skipped or `false` means Z_NO_FLUSH, `true` meansh Z_FINISH.
- *
- * Sends input data to deflate pipe, generating [[Deflate#onData]] calls with
- * new compressed chunks. Returns `true` on success. The last data block must have
- * mode Z_FINISH (or `true`). That flush internal pending buffers and call
- * [[Deflate#onEnd]].
- *
- * On fail call [[Deflate#onEnd]] with error code and return false.
- *
- * We strongly recommend to use `Uint8Array` on input for best speed (output
- * array format is detected automatically). Also, don't skip last param and always
- * use the same type in your code (boolean or number). That will improve JS speed.
- *
- * For regular `Array`-s make sure all elements are [0..255].
- *
- * ##### Example
- *
- * ```javascript
- * push(chunk, false); // push one of data chunks
- * ...
- * push(chunk, true); // push last chunk
- * ```
- **/
- Deflate.prototype.push = function(data, mode) {
- var strm = this.strm;
- var chunkSize = this.options.chunkSize;
- var status, _mode;
-
- if (this.ended) { return false; }
-
- _mode = (mode === ~~mode) ? mode : ((mode === true) ? Z_FINISH : Z_NO_FLUSH);
-
- // Convert data if needed
- if (typeof data === 'string') {
- // If we need to compress text, change encoding to utf8.
- strm.input = strings.string2buf(data);
- } else {
- strm.input = data;
- }
-
- strm.next_in = 0;
- strm.avail_in = strm.input.length;
-
- do {
- if (strm.avail_out === 0) {
- strm.output = new utils.Buf8(chunkSize);
- strm.next_out = 0;
- strm.avail_out = chunkSize;
- }
- status = zlib_deflate.deflate(strm, _mode); /* no bad return value */
-
- if (status !== Z_STREAM_END && status !== Z_OK) {
- this.onEnd(status);
- this.ended = true;
- return false;
- }
- if (strm.avail_out === 0 || (strm.avail_in === 0 && _mode === Z_FINISH)) {
- if (this.options.to === 'string') {
- this.onData(strings.buf2binstring(utils.shrinkBuf(strm.output, strm.next_out)));
- } else {
- this.onData(utils.shrinkBuf(strm.output, strm.next_out));
- }
- }
- } while ((strm.avail_in > 0 || strm.avail_out === 0) && status !== Z_STREAM_END);
-
- // Finalize on the last chunk.
- if (_mode === Z_FINISH) {
- status = zlib_deflate.deflateEnd(this.strm);
- this.onEnd(status);
- this.ended = true;
- return status === Z_OK;
- }
-
- return true;
- };
-
-
- /**
- * Deflate#onData(chunk) -> Void
- * - chunk (Uint8Array|Array|String): ouput data. Type of array depends
- * on js engine support. When string output requested, each chunk
- * will be string.
- *
- * By default, stores data blocks in `chunks[]` property and glue
- * those in `onEnd`. Override this handler, if you need another behaviour.
- **/
- Deflate.prototype.onData = function(chunk) {
- this.chunks.push(chunk);
- };
-
-
- /**
- * Deflate#onEnd(status) -> Void
- * - status (Number): deflate status. 0 (Z_OK) on success,
- * other if not.
- *
- * Called once after you tell deflate that input stream complete
- * or error happenned. By default - join collected chunks,
- * free memory and fill `results` / `err` properties.
- **/
- Deflate.prototype.onEnd = function(status) {
- // On success - join
- if (status === Z_OK) {
- if (this.options.to === 'string') {
- this.result = this.chunks.join('');
- } else {
- this.result = utils.flattenChunks(this.chunks);
- }
- }
- this.chunks = [];
- this.err = status;
- this.msg = this.strm.msg;
- };
-
-
- /**
- * deflate(data[, options]) -> Uint8Array|Array|String
- * - data (Uint8Array|Array|String): input data to compress.
- * - options (Object): zlib deflate options.
- *
- * Compress `data` with deflate alrorythm and `options`.
- *
- * Supported options are:
- *
- * - level
- * - windowBits
- * - memLevel
- * - strategy
- *
- * [http://zlib.net/manual.html#Advanced](http://zlib.net/manual.html#Advanced)
- * for more information on these.
- *
- * Sugar (options):
- *
- * - `raw` (Boolean) - say that we work with raw stream, if you don't wish to specify
- * negative windowBits implicitly.
- * - `to` (String) - if equal to 'string', then result will be "binary string"
- * (each char code [0..255])
- *
- * ##### Example:
- *
- * ```javascript
- * var pako = require('pako')
- * , data = Uint8Array([1,2,3,4,5,6,7,8,9]);
- *
- * console.log(pako.deflate(data));
- * ```
- **/
- function deflate(input, options) {
- var deflator = new Deflate(options);
-
- deflator.push(input, true);
-
- // That will never happens, if you don't cheat with options :)
- if (deflator.err) { throw deflator.msg; }
-
- return deflator.result;
- }
-
-
- /**
- * deflateRaw(data[, options]) -> Uint8Array|Array|String
- * - data (Uint8Array|Array|String): input data to compress.
- * - options (Object): zlib deflate options.
- *
- * The same as [[deflate]], but creates raw data, without wrapper
- * (header and adler32 crc).
- **/
- function deflateRaw(input, options) {
- options = options || {};
- options.raw = true;
- return deflate(input, options);
- }
-
-
- /**
- * gzip(data[, options]) -> Uint8Array|Array|String
- * - data (Uint8Array|Array|String): input data to compress.
- * - options (Object): zlib deflate options.
- *
- * The same as [[deflate]], but create gzip wrapper instead of
- * deflate one.
- **/
- function gzip(input, options) {
- options = options || {};
- options.gzip = true;
- return deflate(input, options);
- }
-
-
- exports.Deflate = Deflate;
- exports.deflate = deflate;
- exports.deflateRaw = deflateRaw;
- exports.gzip = gzip;
- },{"./utils/common":27,"./utils/strings":28,"./zlib/deflate.js":32,"./zlib/messages":37,"./zlib/zstream":39}],26:[function(_dereq_,module,exports){
- 'use strict';
-
-
- var zlib_inflate = _dereq_('./zlib/inflate.js');
- var utils = _dereq_('./utils/common');
- var strings = _dereq_('./utils/strings');
- var c = _dereq_('./zlib/constants');
- var msg = _dereq_('./zlib/messages');
- var zstream = _dereq_('./zlib/zstream');
- var gzheader = _dereq_('./zlib/gzheader');
-
-
- /**
- * class Inflate
- *
- * Generic JS-style wrapper for zlib calls. If you don't need
- * streaming behaviour - use more simple functions: [[inflate]]
- * and [[inflateRaw]].
- **/
-
- /* internal
- * inflate.chunks -> Array
- *
- * Chunks of output data, if [[Inflate#onData]] not overriden.
- **/
-
- /**
- * Inflate.result -> Uint8Array|Array|String
- *
- * Uncompressed result, generated by default [[Inflate#onData]]
- * and [[Inflate#onEnd]] handlers. Filled after you push last chunk
- * (call [[Inflate#push]] with `Z_FINISH` / `true` param).
- **/
-
- /**
- * Inflate.err -> Number
- *
- * Error code after inflate finished. 0 (Z_OK) on success.
- * Should be checked if broken data possible.
- **/
-
- /**
- * Inflate.msg -> String
- *
- * Error message, if [[Inflate.err]] != 0
- **/
-
-
- /**
- * new Inflate(options)
- * - options (Object): zlib inflate options.
- *
- * Creates new inflator instance with specified params. Throws exception
- * on bad params. Supported options:
- *
- * - `windowBits`
- *
- * [http://zlib.net/manual.html#Advanced](http://zlib.net/manual.html#Advanced)
- * for more information on these.
- *
- * Additional options, for internal needs:
- *
- * - `chunkSize` - size of generated data chunks (16K by default)
- * - `raw` (Boolean) - do raw inflate
- * - `to` (String) - if equal to 'string', then result will be converted
- * from utf8 to utf16 (javascript) string. When string output requested,
- * chunk length can differ from `chunkSize`, depending on content.
- *
- * By default, when no options set, autodetect deflate/gzip data format via
- * wrapper header.
- *
- * ##### Example:
- *
- * ```javascript
- * var pako = require('pako')
- * , chunk1 = Uint8Array([1,2,3,4,5,6,7,8,9])
- * , chunk2 = Uint8Array([10,11,12,13,14,15,16,17,18,19]);
- *
- * var inflate = new pako.Inflate({ level: 3});
- *
- * inflate.push(chunk1, false);
- * inflate.push(chunk2, true); // true -> last chunk
- *
- * if (inflate.err) { throw new Error(inflate.err); }
- *
- * console.log(inflate.result);
- * ```
- **/
- var Inflate = function(options) {
-
- this.options = utils.assign({
- chunkSize: 16384,
- windowBits: 0,
- to: ''
- }, options || {});
-
- var opt = this.options;
-
- // Force window size for `raw` data, if not set directly,
- // because we have no header for autodetect.
- if (opt.raw && (opt.windowBits >= 0) && (opt.windowBits < 16)) {
- opt.windowBits = -opt.windowBits;
- if (opt.windowBits === 0) { opt.windowBits = -15; }
- }
-
- // If `windowBits` not defined (and mode not raw) - set autodetect flag for gzip/deflate
- if ((opt.windowBits >= 0) && (opt.windowBits < 16) &&
- !(options && options.windowBits)) {
- opt.windowBits += 32;
- }
-
- // Gzip header has no info about windows size, we can do autodetect only
- // for deflate. So, if window size not set, force it to max when gzip possible
- if ((opt.windowBits > 15) && (opt.windowBits < 48)) {
- // bit 3 (16) -> gzipped data
- // bit 4 (32) -> autodetect gzip/deflate
- if ((opt.windowBits & 15) === 0) {
- opt.windowBits |= 15;
- }
- }
-
- this.err = 0; // error code, if happens (0 = Z_OK)
- this.msg = ''; // error message
- this.ended = false; // used to avoid multiple onEnd() calls
- this.chunks = []; // chunks of compressed data
-
- this.strm = new zstream();
- this.strm.avail_out = 0;
-
- var status = zlib_inflate.inflateInit2(
- this.strm,
- opt.windowBits
- );
-
- if (status !== c.Z_OK) {
- throw new Error(msg[status]);
- }
-
- this.header = new gzheader();
-
- zlib_inflate.inflateGetHeader(this.strm, this.header);
- };
-
- /**
- * Inflate#push(data[, mode]) -> Boolean
- * - data (Uint8Array|Array|String): input data
- * - mode (Number|Boolean): 0..6 for corresponding Z_NO_FLUSH..Z_TREE modes.
- * See constants. Skipped or `false` means Z_NO_FLUSH, `true` meansh Z_FINISH.
- *
- * Sends input data to inflate pipe, generating [[Inflate#onData]] calls with
- * new output chunks. Returns `true` on success. The last data block must have
- * mode Z_FINISH (or `true`). That flush internal pending buffers and call
- * [[Inflate#onEnd]].
- *
- * On fail call [[Inflate#onEnd]] with error code and return false.
- *
- * We strongly recommend to use `Uint8Array` on input for best speed (output
- * format is detected automatically). Also, don't skip last param and always
- * use the same type in your code (boolean or number). That will improve JS speed.
- *
- * For regular `Array`-s make sure all elements are [0..255].
- *
- * ##### Example
- *
- * ```javascript
- * push(chunk, false); // push one of data chunks
- * ...
- * push(chunk, true); // push last chunk
- * ```
- **/
- Inflate.prototype.push = function(data, mode) {
- var strm = this.strm;
- var chunkSize = this.options.chunkSize;
- var status, _mode;
- var next_out_utf8, tail, utf8str;
-
- if (this.ended) { return false; }
- _mode = (mode === ~~mode) ? mode : ((mode === true) ? c.Z_FINISH : c.Z_NO_FLUSH);
-
- // Convert data if needed
- if (typeof data === 'string') {
- // Only binary strings can be decompressed on practice
- strm.input = strings.binstring2buf(data);
- } else {
- strm.input = data;
- }
-
- strm.next_in = 0;
- strm.avail_in = strm.input.length;
-
- do {
- if (strm.avail_out === 0) {
- strm.output = new utils.Buf8(chunkSize);
- strm.next_out = 0;
- strm.avail_out = chunkSize;
- }
-
- status = zlib_inflate.inflate(strm, c.Z_NO_FLUSH); /* no bad return value */
-
- if (status !== c.Z_STREAM_END && status !== c.Z_OK) {
- this.onEnd(status);
- this.ended = true;
- return false;
- }
-
- if (strm.next_out) {
- if (strm.avail_out === 0 || status === c.Z_STREAM_END || (strm.avail_in === 0 && _mode === c.Z_FINISH)) {
-
- if (this.options.to === 'string') {
-
- next_out_utf8 = strings.utf8border(strm.output, strm.next_out);
-
- tail = strm.next_out - next_out_utf8;
- utf8str = strings.buf2string(strm.output, next_out_utf8);
-
- // move tail
- strm.next_out = tail;
- strm.avail_out = chunkSize - tail;
- if (tail) { utils.arraySet(strm.output, strm.output, next_out_utf8, tail, 0); }
-
- this.onData(utf8str);
-
- } else {
- this.onData(utils.shrinkBuf(strm.output, strm.next_out));
- }
- }
- }
- } while ((strm.avail_in > 0) && status !== c.Z_STREAM_END);
-
- if (status === c.Z_STREAM_END) {
- _mode = c.Z_FINISH;
- }
- // Finalize on the last chunk.
- if (_mode === c.Z_FINISH) {
- status = zlib_inflate.inflateEnd(this.strm);
- this.onEnd(status);
- this.ended = true;
- return status === c.Z_OK;
- }
-
- return true;
- };
-
-
- /**
- * Inflate#onData(chunk) -> Void
- * - chunk (Uint8Array|Array|String): ouput data. Type of array depends
- * on js engine support. When string output requested, each chunk
- * will be string.
- *
- * By default, stores data blocks in `chunks[]` property and glue
- * those in `onEnd`. Override this handler, if you need another behaviour.
- **/
- Inflate.prototype.onData = function(chunk) {
- this.chunks.push(chunk);
- };
-
-
- /**
- * Inflate#onEnd(status) -> Void
- * - status (Number): inflate status. 0 (Z_OK) on success,
- * other if not.
- *
- * Called once after you tell inflate that input stream complete
- * or error happenned. By default - join collected chunks,
- * free memory and fill `results` / `err` properties.
- **/
- Inflate.prototype.onEnd = function(status) {
- // On success - join
- if (status === c.Z_OK) {
- if (this.options.to === 'string') {
- // Glue & convert here, until we teach pako to send
- // utf8 alligned strings to onData
- this.result = this.chunks.join('');
- } else {
- this.result = utils.flattenChunks(this.chunks);
- }
- }
- this.chunks = [];
- this.err = status;
- this.msg = this.strm.msg;
- };
-
-
- /**
- * inflate(data[, options]) -> Uint8Array|Array|String
- * - data (Uint8Array|Array|String): input data to decompress.
- * - options (Object): zlib inflate options.
- *
- * Decompress `data` with inflate/ungzip and `options`. Autodetect
- * format via wrapper header by default. That's why we don't provide
- * separate `ungzip` method.
- *
- * Supported options are:
- *
- * - windowBits
- *
- * [http://zlib.net/manual.html#Advanced](http://zlib.net/manual.html#Advanced)
- * for more information.
- *
- * Sugar (options):
- *
- * - `raw` (Boolean) - say that we work with raw stream, if you don't wish to specify
- * negative windowBits implicitly.
- * - `to` (String) - if equal to 'string', then result will be converted
- * from utf8 to utf16 (javascript) string. When string output requested,
- * chunk length can differ from `chunkSize`, depending on content.
- *
- *
- * ##### Example:
- *
- * ```javascript
- * var pako = require('pako')
- * , input = pako.deflate([1,2,3,4,5,6,7,8,9])
- * , output;
- *
- * try {
- * output = pako.inflate(input);
- * } catch (err)
- * console.log(err);
- * }
- * ```
- **/
- function inflate(input, options) {
- var inflator = new Inflate(options);
-
- inflator.push(input, true);
-
- // That will never happens, if you don't cheat with options :)
- if (inflator.err) { throw inflator.msg; }
-
- return inflator.result;
- }
-
-
- /**
- * inflateRaw(data[, options]) -> Uint8Array|Array|String
- * - data (Uint8Array|Array|String): input data to decompress.
- * - options (Object): zlib inflate options.
- *
- * The same as [[inflate]], but creates raw data, without wrapper
- * (header and adler32 crc).
- **/
- function inflateRaw(input, options) {
- options = options || {};
- options.raw = true;
- return inflate(input, options);
- }
-
-
- /**
- * ungzip(data[, options]) -> Uint8Array|Array|String
- * - data (Uint8Array|Array|String): input data to decompress.
- * - options (Object): zlib inflate options.
- *
- * Just shortcut to [[inflate]], because it autodetects format
- * by header.content. Done for convenience.
- **/
-
-
- exports.Inflate = Inflate;
- exports.inflate = inflate;
- exports.inflateRaw = inflateRaw;
- exports.ungzip = inflate;
-
- },{"./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){
- 'use strict';
-
-
- var TYPED_OK = (typeof Uint8Array !== 'undefined') &&
- (typeof Uint16Array !== 'undefined') &&
- (typeof Int32Array !== 'undefined');
-
-
- exports.assign = function (obj /*from1, from2, from3, ...*/) {
- var sources = Array.prototype.slice.call(arguments, 1);
- while (sources.length) {
- var source = sources.shift();
- if (!source) { continue; }
-
- if (typeof(source) !== 'object') {
- throw new TypeError(source + 'must be non-object');
- }
-
- for (var p in source) {
- if (source.hasOwnProperty(p)) {
- obj[p] = source[p];
- }
- }
- }
-
- return obj;
- };
-
-
- // reduce buffer size, avoiding mem copy
- exports.shrinkBuf = function (buf, size) {
- if (buf.length === size) { return buf; }
- if (buf.subarray) { return buf.subarray(0, size); }
- buf.length = size;
- return buf;
- };
-
-
- var fnTyped = {
- arraySet: function (dest, src, src_offs, len, dest_offs) {
- if (src.subarray && dest.subarray) {
- dest.set(src.subarray(src_offs, src_offs+len), dest_offs);
- return;
- }
- // Fallback to ordinary array
- for(var i=0; i<len; i++) {
- dest[dest_offs + i] = src[src_offs + i];
- }
- },
- // Join array of chunks to single array.
- flattenChunks: function(chunks) {
- var i, l, len, pos, chunk, result;
-
- // calculate data length
- len = 0;
- for (i=0, l=chunks.length; i<l; i++) {
- len += chunks[i].length;
- }
-
- // join chunks
- result = new Uint8Array(len);
- pos = 0;
- for (i=0, l=chunks.length; i<l; i++) {
- chunk = chunks[i];
- result.set(chunk, pos);
- pos += chunk.length;
- }
-
- return result;
- }
- };
-
- var fnUntyped = {
- arraySet: function (dest, src, src_offs, len, dest_offs) {
- for(var i=0; i<len; i++) {
- dest[dest_offs + i] = src[src_offs + i];
- }
- },
- // Join array of chunks to single array.
- flattenChunks: function(chunks) {
- return [].concat.apply([], chunks);
- }
- };
-
-
- // Enable/Disable typed arrays use, for testing
- //
- exports.setTyped = function (on) {
- if (on) {
- exports.Buf8 = Uint8Array;
- exports.Buf16 = Uint16Array;
- exports.Buf32 = Int32Array;
- exports.assign(exports, fnTyped);
- } else {
- exports.Buf8 = Array;
- exports.Buf16 = Array;
- exports.Buf32 = Array;
- exports.assign(exports, fnUntyped);
- }
- };
-
- exports.setTyped(TYPED_OK);
- },{}],28:[function(_dereq_,module,exports){
- // String encode/decode helpers
- 'use strict';
-
-
- var utils = _dereq_('./common');
-
-
- // Quick check if we can use fast array to bin string conversion
- //
- // - apply(Array) can fail on Android 2.2
- // - apply(Uint8Array) can fail on iOS 5.1 Safary
- //
- var STR_APPLY_OK = true;
- var STR_APPLY_UIA_OK = true;
-
- try { String.fromCharCode.apply(null, [0]); } catch(__) { STR_APPLY_OK = false; }
- try { String.fromCharCode.apply(null, new Uint8Array(1)); } catch(__) { STR_APPLY_UIA_OK = false; }
-
-
- // Table with utf8 lengths (calculated by first byte of sequence)
- // Note, that 5 & 6-byte values and some 4-byte values can not be represented in JS,
- // because max possible codepoint is 0x10ffff
- var _utf8len = new utils.Buf8(256);
- for (var i=0; i<256; i++) {
- _utf8len[i] = (i >= 252 ? 6 : i >= 248 ? 5 : i >= 240 ? 4 : i >= 224 ? 3 : i >= 192 ? 2 : 1);
- }
- _utf8len[254]=_utf8len[254]=1; // Invalid sequence start
-
-
- // convert string to array (typed, when possible)
- exports.string2buf = function (str) {
- var buf, c, c2, m_pos, i, str_len = str.length, buf_len = 0;
-
- // count binary size
- for (m_pos = 0; m_pos < str_len; m_pos++) {
- c = str.charCodeAt(m_pos);
- if ((c & 0xfc00) === 0xd800 && (m_pos+1 < str_len)) {
- c2 = str.charCodeAt(m_pos+1);
- if ((c2 & 0xfc00) === 0xdc00) {
- c = 0x10000 + ((c - 0xd800) << 10) + (c2 - 0xdc00);
- m_pos++;
- }
- }
- buf_len += c < 0x80 ? 1 : c < 0x800 ? 2 : c < 0x10000 ? 3 : 4;
- }
-
- // allocate buffer
- buf = new utils.Buf8(buf_len);
-
- // convert
- for (i=0, m_pos = 0; i < buf_len; m_pos++) {
- c = str.charCodeAt(m_pos);
- if ((c & 0xfc00) === 0xd800 && (m_pos+1 < str_len)) {
- c2 = str.charCodeAt(m_pos+1);
- if ((c2 & 0xfc00) === 0xdc00) {
- c = 0x10000 + ((c - 0xd800) << 10) + (c2 - 0xdc00);
- m_pos++;
- }
- }
- if (c < 0x80) {
- /* one byte */
- buf[i++] = c;
- } else if (c < 0x800) {
- /* two bytes */
- buf[i++] = 0xC0 | (c >>> 6);
- buf[i++] = 0x80 | (c & 0x3f);
- } else if (c < 0x10000) {
- /* three bytes */
- buf[i++] = 0xE0 | (c >>> 12);
- buf[i++] = 0x80 | (c >>> 6 & 0x3f);
- buf[i++] = 0x80 | (c & 0x3f);
- } else {
- /* four bytes */
- buf[i++] = 0xf0 | (c >>> 18);
- buf[i++] = 0x80 | (c >>> 12 & 0x3f);
- buf[i++] = 0x80 | (c >>> 6 & 0x3f);
- buf[i++] = 0x80 | (c & 0x3f);
- }
- }
-
- return buf;
- };
-
- // Helper (used in 2 places)
- function buf2binstring(buf, len) {
- // use fallback for big arrays to avoid stack overflow
- if (len < 65537) {
- if ((buf.subarray && STR_APPLY_UIA_OK) || (!buf.subarray && STR_APPLY_OK)) {
- return String.fromCharCode.apply(null, utils.shrinkBuf(buf, len));
- }
- }
-
- var result = '';
- for(var i=0; i < len; i++) {
- result += String.fromCharCode(buf[i]);
- }
- return result;
- }
-
-
- // Convert byte array to binary string
- exports.buf2binstring = function(buf) {
- return buf2binstring(buf, buf.length);
- };
-
-
- // Convert binary string (typed, when possible)
- exports.binstring2buf = function(str) {
- var buf = new utils.Buf8(str.length);
- for(var i=0, len=buf.length; i < len; i++) {
- buf[i] = str.charCodeAt(i);
- }
- return buf;
- };
-
-
- // convert array to string
- exports.buf2string = function (buf, max) {
- var i, out, c, c_len;
- var len = max || buf.length;
-
- // Reserve max possible length (2 words per char)
- // NB: by unknown reasons, Array is significantly faster for
- // String.fromCharCode.apply than Uint16Array.
- var utf16buf = new Array(len*2);
-
- for (out=0, i=0; i<len;) {
- c = buf[i++];
- // quick process ascii
- if (c < 0x80) { utf16buf[out++] = c; continue; }
-
- c_len = _utf8len[c];
- // skip 5 & 6 byte codes
- if (c_len > 4) { utf16buf[out++] = 0xfffd; i += c_len-1; continue; }
-
- // apply mask on first byte
- c &= c_len === 2 ? 0x1f : c_len === 3 ? 0x0f : 0x07;
- // join the rest
- while (c_len > 1 && i < len) {
- c = (c << 6) | (buf[i++] & 0x3f);
- c_len--;
- }
-
- // terminated by end of string?
- if (c_len > 1) { utf16buf[out++] = 0xfffd; continue; }
-
- if (c < 0x10000) {
- utf16buf[out++] = c;
- } else {
- c -= 0x10000;
- utf16buf[out++] = 0xd800 | ((c >> 10) & 0x3ff);
- utf16buf[out++] = 0xdc00 | (c & 0x3ff);
- }
- }
-
- return buf2binstring(utf16buf, out);
- };
-
-
- // Calculate max possible position in utf8 buffer,
- // that will not break sequence. If that's not possible
- // - (very small limits) return max size as is.
- //
- // buf[] - utf8 bytes array
- // max - length limit (mandatory);
- exports.utf8border = function(buf, max) {
- var pos;
-
- max = max || buf.length;
- if (max > buf.length) { max = buf.length; }
-
- // go back from last position, until start of sequence found
- pos = max-1;
- while (pos >= 0 && (buf[pos] & 0xC0) === 0x80) { pos--; }
-
- // Fuckup - very small and broken sequence,
- // return max, because we should return something anyway.
- if (pos < 0) { return max; }
-
- // If we came to start of buffer - that means vuffer is too small,
- // return max too.
- if (pos === 0) { return max; }
-
- return (pos + _utf8len[buf[pos]] > max) ? pos : max;
- };
-
- },{"./common":27}],29:[function(_dereq_,module,exports){
- 'use strict';
-
- // Note: adler32 takes 12% for level 0 and 2% for level 6.
- // It doesn't worth to make additional optimizationa as in original.
- // Small size is preferable.
-
- function adler32(adler, buf, len, pos) {
- var s1 = (adler & 0xffff) |0
- , s2 = ((adler >>> 16) & 0xffff) |0
- , n = 0;
-
- while (len !== 0) {
- // Set limit ~ twice less than 5552, to keep
- // s2 in 31-bits, because we force signed ints.
- // in other case %= will fail.
- n = len > 2000 ? 2000 : len;
- len -= n;
-
- do {
- s1 = (s1 + buf[pos++]) |0;
- s2 = (s2 + s1) |0;
- } while (--n);
-
- s1 %= 65521;
- s2 %= 65521;
- }
-
- return (s1 | (s2 << 16)) |0;
- }
-
-
- module.exports = adler32;
- },{}],30:[function(_dereq_,module,exports){
- module.exports = {
-
- /* Allowed flush values; see deflate() and inflate() below for details */
- Z_NO_FLUSH: 0,
- Z_PARTIAL_FLUSH: 1,
- Z_SYNC_FLUSH: 2,
- Z_FULL_FLUSH: 3,
- Z_FINISH: 4,
- Z_BLOCK: 5,
- Z_TREES: 6,
-
- /* Return codes for the compression/decompression functions. Negative values
- * are errors, positive values are used for special but normal events.
- */
- Z_OK: 0,
- Z_STREAM_END: 1,
- Z_NEED_DICT: 2,
- Z_ERRNO: -1,
- Z_STREAM_ERROR: -2,
- Z_DATA_ERROR: -3,
- //Z_MEM_ERROR: -4,
- Z_BUF_ERROR: -5,
- //Z_VERSION_ERROR: -6,
-
- /* compression levels */
- Z_NO_COMPRESSION: 0,
- Z_BEST_SPEED: 1,
- Z_BEST_COMPRESSION: 9,
- Z_DEFAULT_COMPRESSION: -1,
-
-
- Z_FILTERED: 1,
- Z_HUFFMAN_ONLY: 2,
- Z_RLE: 3,
- Z_FIXED: 4,
- Z_DEFAULT_STRATEGY: 0,
-
- /* Possible values of the data_type field (though see inflate()) */
- Z_BINARY: 0,
- Z_TEXT: 1,
- //Z_ASCII: 1, // = Z_TEXT (deprecated)
- Z_UNKNOWN: 2,
-
- /* The deflate compression method */
- Z_DEFLATED: 8
- //Z_NULL: null // Use -1 or null inline, depending on var type
- };
- },{}],31:[function(_dereq_,module,exports){
- 'use strict';
-
- // Note: we can't get significant speed boost here.
- // So write code to minimize size - no pregenerated tables
- // and array tools dependencies.
-
-
- // Use ordinary array, since untyped makes no boost here
- function makeTable() {
- var c, table = [];
-
- for(var n =0; n < 256; n++){
- c = n;
- for(var k =0; k < 8; k++){
- c = ((c&1) ? (0xEDB88320 ^ (c >>> 1)) : (c >>> 1));
- }
- table[n] = c;
- }
-
- return table;
- }
-
- // Create table on load. Just 255 signed longs. Not a problem.
- var crcTable = makeTable();
-
-
- function crc32(crc, buf, len, pos) {
- var t = crcTable
- , end = pos + len;
-
- crc = crc ^ (-1);
-
- for (var i = pos; i < end; i++ ) {
- crc = (crc >>> 8) ^ t[(crc ^ buf[i]) & 0xFF];
- }
-
- return (crc ^ (-1)); // >>> 0;
- }
-
-
- module.exports = crc32;
- },{}],32:[function(_dereq_,module,exports){
- 'use strict';
-
- var utils = _dereq_('../utils/common');
- var trees = _dereq_('./trees');
- var adler32 = _dereq_('./adler32');
- var crc32 = _dereq_('./crc32');
- var msg = _dereq_('./messages');
-
- /* Public constants ==========================================================*/
- /* ===========================================================================*/
-
-
- /* Allowed flush values; see deflate() and inflate() below for details */
- var Z_NO_FLUSH = 0;
- var Z_PARTIAL_FLUSH = 1;
- //var Z_SYNC_FLUSH = 2;
- var Z_FULL_FLUSH = 3;
- var Z_FINISH = 4;
- var Z_BLOCK = 5;
- //var Z_TREES = 6;
-
-
- /* Return codes for the compression/decompression functions. Negative values
- * are errors, positive values are used for special but normal events.
- */
- var Z_OK = 0;
- var Z_STREAM_END = 1;
- //var Z_NEED_DICT = 2;
- //var Z_ERRNO = -1;
- var Z_STREAM_ERROR = -2;
- var Z_DATA_ERROR = -3;
- //var Z_MEM_ERROR = -4;
- var Z_BUF_ERROR = -5;
- //var Z_VERSION_ERROR = -6;
-
-
- /* compression levels */
- //var Z_NO_COMPRESSION = 0;
- //var Z_BEST_SPEED = 1;
- //var Z_BEST_COMPRESSION = 9;
- var Z_DEFAULT_COMPRESSION = -1;
-
-
- var Z_FILTERED = 1;
- var Z_HUFFMAN_ONLY = 2;
- var Z_RLE = 3;
- var Z_FIXED = 4;
- var Z_DEFAULT_STRATEGY = 0;
-
- /* Possible values of the data_type field (though see inflate()) */
- //var Z_BINARY = 0;
- //var Z_TEXT = 1;
- //var Z_ASCII = 1; // = Z_TEXT
- var Z_UNKNOWN = 2;
-
-
- /* The deflate compression method */
- var Z_DEFLATED = 8;
-
- /*============================================================================*/
-
-
- var MAX_MEM_LEVEL = 9;
- /* Maximum value for memLevel in deflateInit2 */
- var MAX_WBITS = 15;
- /* 32K LZ77 window */
- var DEF_MEM_LEVEL = 8;
-
-
- var LENGTH_CODES = 29;
- /* number of length codes, not counting the special END_BLOCK code */
- var LITERALS = 256;
- /* number of literal bytes 0..255 */
- var L_CODES = LITERALS + 1 + LENGTH_CODES;
- /* number of Literal or Length codes, including the END_BLOCK code */
- var D_CODES = 30;
- /* number of distance codes */
- var BL_CODES = 19;
- /* number of codes used to transfer the bit lengths */
- var HEAP_SIZE = 2*L_CODES + 1;
- /* maximum heap size */
- var MAX_BITS = 15;
- /* All codes must not exceed MAX_BITS bits */
-
- var MIN_MATCH = 3;
- var MAX_MATCH = 258;
- var MIN_LOOKAHEAD = (MAX_MATCH + MIN_MATCH + 1);
-
- var PRESET_DICT = 0x20;
-
- var INIT_STATE = 42;
- var EXTRA_STATE = 69;
- var NAME_STATE = 73;
- var COMMENT_STATE = 91;
- var HCRC_STATE = 103;
- var BUSY_STATE = 113;
- var FINISH_STATE = 666;
-
- var BS_NEED_MORE = 1; /* block not completed, need more input or more output */
- var BS_BLOCK_DONE = 2; /* block flush performed */
- var BS_FINISH_STARTED = 3; /* finish started, need only more output at next deflate */
- var BS_FINISH_DONE = 4; /* finish done, accept no more input or output */
-
- var OS_CODE = 0x03; // Unix :) . Don't detect, use this default.
-
- function err(strm, errorCode) {
- strm.msg = msg[errorCode];
- return errorCode;
- }
-
- function rank(f) {
- return ((f) << 1) - ((f) > 4 ? 9 : 0);
- }
-
- function zero(buf) { var len = buf.length; while (--len >= 0) { buf[len] = 0; } }
-
-
- /* =========================================================================
- * Flush as much pending output as possible. All deflate() output goes
- * through this function so some applications may wish to modify it
- * to avoid allocating a large strm->output buffer and copying into it.
- * (See also read_buf()).
- */
- function flush_pending(strm) {
- var s = strm.state;
-
- //_tr_flush_bits(s);
- var len = s.pending;
- if (len > strm.avail_out) {
- len = strm.avail_out;
- }
- if (len === 0) { return; }
-
- utils.arraySet(strm.output, s.pending_buf, s.pending_out, len, strm.next_out);
- strm.next_out += len;
- s.pending_out += len;
- strm.total_out += len;
- strm.avail_out -= len;
- s.pending -= len;
- if (s.pending === 0) {
- s.pending_out = 0;
- }
- }
-
-
- function flush_block_only (s, last) {
- trees._tr_flush_block(s, (s.block_start >= 0 ? s.block_start : -1), s.strstart - s.block_start, last);
- s.block_start = s.strstart;
- flush_pending(s.strm);
- }
-
-
- function put_byte(s, b) {
- s.pending_buf[s.pending++] = b;
- }
-
-
- /* =========================================================================
- * Put a short in the pending buffer. The 16-bit value is put in MSB order.
- * IN assertion: the stream state is correct and there is enough room in
- * pending_buf.
- */
- function putShortMSB(s, b) {
- // put_byte(s, (Byte)(b >> 8));
- // put_byte(s, (Byte)(b & 0xff));
- s.pending_buf[s.pending++] = (b >>> 8) & 0xff;
- s.pending_buf[s.pending++] = b & 0xff;
- }
-
-
- /* ===========================================================================
- * Read a new buffer from the current input stream, update the adler32
- * and total number of bytes read. All deflate() input goes through
- * this function so some applications may wish to modify it to avoid
- * allocating a large strm->input buffer and copying from it.
- * (See also flush_pending()).
- */
- function read_buf(strm, buf, start, size) {
- var len = strm.avail_in;
-
- if (len > size) { len = size; }
- if (len === 0) { return 0; }
-
- strm.avail_in -= len;
-
- utils.arraySet(buf, strm.input, strm.next_in, len, start);
- if (strm.state.wrap === 1) {
- strm.adler = adler32(strm.adler, buf, len, start);
- }
-
- else if (strm.state.wrap === 2) {
- strm.adler = crc32(strm.adler, buf, len, start);
- }
-
- strm.next_in += len;
- strm.total_in += len;
-
- return len;
- }
-
-
- /* ===========================================================================
- * Set match_start to the longest match starting at the given string and
- * return its length. Matches shorter or equal to prev_length are discarded,
- * in which case the result is equal to prev_length and match_start is
- * garbage.
- * IN assertions: cur_match is the head of the hash chain for the current
- * string (strstart) and its distance is <= MAX_DIST, and prev_length >= 1
- * OUT assertion: the match length is not greater than s->lookahead.
- */
- function longest_match(s, cur_match) {
- var chain_length = s.max_chain_length; /* max hash chain length */
- var scan = s.strstart; /* current string */
- var match; /* matched string */
- var len; /* length of current match */
- var best_len = s.prev_length; /* best match length so far */
- var nice_match = s.nice_match; /* stop if match long enough */
- var limit = (s.strstart > (s.w_size - MIN_LOOKAHEAD)) ?
- s.strstart - (s.w_size - MIN_LOOKAHEAD) : 0/*NIL*/;
-
- var _win = s.window; // shortcut
-
- var wmask = s.w_mask;
- var prev = s.prev;
-
- /* Stop when cur_match becomes <= limit. To simplify the code,
- * we prevent matches with the string of window index 0.
- */
-
- var strend = s.strstart + MAX_MATCH;
- var scan_end1 = _win[scan + best_len - 1];
- var scan_end = _win[scan + best_len];
-
- /* The code is optimized for HASH_BITS >= 8 and MAX_MATCH-2 multiple of 16.
- * It is easy to get rid of this optimization if necessary.
- */
- // Assert(s->hash_bits >= 8 && MAX_MATCH == 258, "Code too clever");
-
- /* Do not waste too much time if we already have a good match: */
- if (s.prev_length >= s.good_match) {
- chain_length >>= 2;
- }
- /* Do not look for matches beyond the end of the input. This is necessary
- * to make deflate deterministic.
- */
- if (nice_match > s.lookahead) { nice_match = s.lookahead; }
-
- // Assert((ulg)s->strstart <= s->window_size-MIN_LOOKAHEAD, "need lookahead");
-
- do {
- // Assert(cur_match < s->strstart, "no future");
- match = cur_match;
-
- /* Skip to next match if the match length cannot increase
- * or if the match length is less than 2. Note that the checks below
- * for insufficient lookahead only occur occasionally for performance
- * reasons. Therefore uninitialized memory will be accessed, and
- * conditional jumps will be made that depend on those values.
- * However the length of the match is limited to the lookahead, so
- * the output of deflate is not affected by the uninitialized values.
- */
-
- if (_win[match + best_len] !== scan_end ||
- _win[match + best_len - 1] !== scan_end1 ||
- _win[match] !== _win[scan] ||
- _win[++match] !== _win[scan + 1]) {
- continue;
- }
-
- /* The check at best_len-1 can be removed because it will be made
- * again later. (This heuristic is not always a win.)
- * It is not necessary to compare scan[2] and match[2] since they
- * are always equal when the other bytes match, given that
- * the hash keys are equal and that HASH_BITS >= 8.
- */
- scan += 2;
- match++;
- // Assert(*scan == *match, "match[2]?");
-
- /* We check for insufficient lookahead only every 8th comparison;
- * the 256th check will be made at strstart+258.
- */
- do {
- /*jshint noempty:false*/
- } while (_win[++scan] === _win[++match] && _win[++scan] === _win[++match] &&
- _win[++scan] === _win[++match] && _win[++scan] === _win[++match] &&
- _win[++scan] === _win[++match] && _win[++scan] === _win[++match] &&
- _win[++scan] === _win[++match] && _win[++scan] === _win[++match] &&
- scan < strend);
-
- // Assert(scan <= s->window+(unsigned)(s->window_size-1), "wild scan");
-
- len = MAX_MATCH - (strend - scan);
- scan = strend - MAX_MATCH;
-
- if (len > best_len) {
- s.match_start = cur_match;
- best_len = len;
- if (len >= nice_match) {
- break;
- }
- scan_end1 = _win[scan + best_len - 1];
- scan_end = _win[scan + best_len];
- }
- } while ((cur_match = prev[cur_match & wmask]) > limit && --chain_length !== 0);
-
- if (best_len <= s.lookahead) {
- return best_len;
- }
- return s.lookahead;
- }
-
-
- /* ===========================================================================
- * Fill the window when the lookahead becomes insufficient.
- * Updates strstart and lookahead.
- *
- * IN assertion: lookahead < MIN_LOOKAHEAD
- * OUT assertions: strstart <= window_size-MIN_LOOKAHEAD
- * At least one byte has been read, or avail_in == 0; reads are
- * performed for at least two bytes (required for the zip translate_eol
- * option -- not supported here).
- */
- function fill_window(s) {
- var _w_size = s.w_size;
- var p, n, m, more, str;
-
- //Assert(s->lookahead < MIN_LOOKAHEAD, "already enough lookahead");
-
- do {
- more = s.window_size - s.lookahead - s.strstart;
-
- // JS ints have 32 bit, block below not needed
- /* Deal with !@#$% 64K limit: */
- //if (sizeof(int) <= 2) {
- // if (more == 0 && s->strstart == 0 && s->lookahead == 0) {
- // more = wsize;
- //
- // } else if (more == (unsigned)(-1)) {
- // /* Very unlikely, but possible on 16 bit machine if
- // * strstart == 0 && lookahead == 1 (input done a byte at time)
- // */
- // more--;
- // }
- //}
-
-
- /* If the window is almost full and there is insufficient lookahead,
- * move the upper half to the lower one to make room in the upper half.
- */
- if (s.strstart >= _w_size + (_w_size - MIN_LOOKAHEAD)) {
-
- utils.arraySet(s.window, s.window, _w_size, _w_size, 0);
- s.match_start -= _w_size;
- s.strstart -= _w_size;
- /* we now have strstart >= MAX_DIST */
- s.block_start -= _w_size;
-
- /* Slide the hash table (could be avoided with 32 bit values
- at the expense of memory usage). We slide even when level == 0
- to keep the hash table consistent if we switch back to level > 0
- later. (Using level 0 permanently is not an optimal usage of
- zlib, so we don't care about this pathological case.)
- */
-
- n = s.hash_size;
- p = n;
- do {
- m = s.head[--p];
- s.head[p] = (m >= _w_size ? m - _w_size : 0);
- } while (--n);
-
- n = _w_size;
- p = n;
- do {
- m = s.prev[--p];
- s.prev[p] = (m >= _w_size ? m - _w_size : 0);
- /* If n is not on any hash chain, prev[n] is garbage but
- * its value will never be used.
- */
- } while (--n);
-
- more += _w_size;
- }
- if (s.strm.avail_in === 0) {
- break;
- }
-
- /* If there was no sliding:
- * strstart <= WSIZE+MAX_DIST-1 && lookahead <= MIN_LOOKAHEAD - 1 &&
- * more == window_size - lookahead - strstart
- * => more >= window_size - (MIN_LOOKAHEAD-1 + WSIZE + MAX_DIST-1)
- * => more >= window_size - 2*WSIZE + 2
- * In the BIG_MEM or MMAP case (not yet supported),
- * window_size == input_size + MIN_LOOKAHEAD &&
- * strstart + s->lookahead <= input_size => more >= MIN_LOOKAHEAD.
- * Otherwise, window_size == 2*WSIZE so more >= 2.
- * If there was sliding, more >= WSIZE. So in all cases, more >= 2.
- */
- //Assert(more >= 2, "more < 2");
- n = read_buf(s.strm, s.window, s.strstart + s.lookahead, more);
- s.lookahead += n;
-
- /* Initialize the hash value now that we have some input: */
- if (s.lookahead + s.insert >= MIN_MATCH) {
- str = s.strstart - s.insert;
- s.ins_h = s.window[str];
-
- /* UPDATE_HASH(s, s->ins_h, s->window[str + 1]); */
- s.ins_h = ((s.ins_h << s.hash_shift) ^ s.window[str + 1]) & s.hash_mask;
- //#if MIN_MATCH != 3
- // Call update_hash() MIN_MATCH-3 more times
- //#endif
- while (s.insert) {
- /* UPDATE_HASH(s, s->ins_h, s->window[str + MIN_MATCH-1]); */
- s.ins_h = ((s.ins_h << s.hash_shift) ^ s.window[str + MIN_MATCH-1]) & s.hash_mask;
-
- s.prev[str & s.w_mask] = s.head[s.ins_h];
- s.head[s.ins_h] = str;
- str++;
- s.insert--;
- if (s.lookahead + s.insert < MIN_MATCH) {
- break;
- }
- }
- }
- /* If the whole input has less than MIN_MATCH bytes, ins_h is garbage,
- * but this is not important since only literal bytes will be emitted.
- */
-
- } while (s.lookahead < MIN_LOOKAHEAD && s.strm.avail_in !== 0);
-
- /* If the WIN_INIT bytes after the end of the current data have never been
- * written, then zero those bytes in order to avoid memory check reports of
- * the use of uninitialized (or uninitialised as Julian writes) bytes by
- * the longest match routines. Update the high water mark for the next
- * time through here. WIN_INIT is set to MAX_MATCH since the longest match
- * routines allow scanning to strstart + MAX_MATCH, ignoring lookahead.
- */
- // if (s.high_water < s.window_size) {
- // var curr = s.strstart + s.lookahead;
- // var init = 0;
- //
- // if (s.high_water < curr) {
- // /* Previous high water mark below current data -- zero WIN_INIT
- // * bytes or up to end of window, whichever is less.
- // */
- // init = s.window_size - curr;
- // if (init > WIN_INIT)
- // init = WIN_INIT;
- // zmemzero(s->window + curr, (unsigned)init);
- // s->high_water = curr + init;
- // }
- // else if (s->high_water < (ulg)curr + WIN_INIT) {
- // /* High water mark at or above current data, but below current data
- // * plus WIN_INIT -- zero out to current data plus WIN_INIT, or up
- // * to end of window, whichever is less.
- // */
- // init = (ulg)curr + WIN_INIT - s->high_water;
- // if (init > s->window_size - s->high_water)
- // init = s->window_size - s->high_water;
- // zmemzero(s->window + s->high_water, (unsigned)init);
- // s->high_water += init;
- // }
- // }
- //
- // Assert((ulg)s->strstart <= s->window_size - MIN_LOOKAHEAD,
- // "not enough room for search");
- }
-
- /* ===========================================================================
- * Copy without compression as much as possible from the input stream, return
- * the current block state.
- * This function does not insert new strings in the dictionary since
- * uncompressible data is probably not useful. This function is used
- * only for the level=0 compression option.
- * NOTE: this function should be optimized to avoid extra copying from
- * window to pending_buf.
- */
- function deflate_stored(s, flush) {
- /* Stored blocks are limited to 0xffff bytes, pending_buf is limited
- * to pending_buf_size, and each stored block has a 5 byte header:
- */
- var max_block_size = 0xffff;
-
- if (max_block_size > s.pending_buf_size - 5) {
- max_block_size = s.pending_buf_size - 5;
- }
-
- /* Copy as much as possible from input to output: */
- for (;;) {
- /* Fill the window as much as possible: */
- if (s.lookahead <= 1) {
-
- //Assert(s->strstart < s->w_size+MAX_DIST(s) ||
- // s->block_start >= (long)s->w_size, "slide too late");
- // if (!(s.strstart < s.w_size + (s.w_size - MIN_LOOKAHEAD) ||
- // s.block_start >= s.w_size)) {
- // throw new Error("slide too late");
- // }
-
- fill_window(s);
- if (s.lookahead === 0 && flush === Z_NO_FLUSH) {
- return BS_NEED_MORE;
- }
-
- if (s.lookahead === 0) {
- break;
- }
- /* flush the current block */
- }
- //Assert(s->block_start >= 0L, "block gone");
- // if (s.block_start < 0) throw new Error("block gone");
-
- s.strstart += s.lookahead;
- s.lookahead = 0;
-
- /* Emit a stored block if pending_buf will be full: */
- var max_start = s.block_start + max_block_size;
-
- if (s.strstart === 0 || s.strstart >= max_start) {
- /* strstart == 0 is possible when wraparound on 16-bit machine */
- s.lookahead = s.strstart - max_start;
- s.strstart = max_start;
- /*** FLUSH_BLOCK(s, 0); ***/
- flush_block_only(s, false);
- if (s.strm.avail_out === 0) {
- return BS_NEED_MORE;
- }
- /***/
-
-
- }
- /* Flush if we may have to slide, otherwise block_start may become
- * negative and the data will be gone:
- */
- if (s.strstart - s.block_start >= (s.w_size - MIN_LOOKAHEAD)) {
- /*** FLUSH_BLOCK(s, 0); ***/
- flush_block_only(s, false);
- if (s.strm.avail_out === 0) {
- return BS_NEED_MORE;
- }
- /***/
- }
- }
-
- s.insert = 0;
-
- if (flush === Z_FINISH) {
- /*** FLUSH_BLOCK(s, 1); ***/
- flush_block_only(s, true);
- if (s.strm.avail_out === 0) {
- return BS_FINISH_STARTED;
- }
- /***/
- return BS_FINISH_DONE;
- }
-
- if (s.strstart > s.block_start) {
- /*** FLUSH_BLOCK(s, 0); ***/
- flush_block_only(s, false);
- if (s.strm.avail_out === 0) {
- return BS_NEED_MORE;
- }
- /***/
- }
-
- return BS_NEED_MORE;
- }
-
- /* ===========================================================================
- * Compress as much as possible from the input stream, return the current
- * block state.
- * This function does not perform lazy evaluation of matches and inserts
- * new strings in the dictionary only for unmatched strings or for short
- * matches. It is used only for the fast compression options.
- */
- function deflate_fast(s, flush) {
- var hash_head; /* head of the hash chain */
- var bflush; /* set if current block must be flushed */
-
- for (;;) {
- /* Make sure that we always have enough lookahead, except
- * at the end of the input file. We need MAX_MATCH bytes
- * for the next match, plus MIN_MATCH bytes to insert the
- * string following the next match.
- */
- if (s.lookahead < MIN_LOOKAHEAD) {
- fill_window(s);
- if (s.lookahead < MIN_LOOKAHEAD && flush === Z_NO_FLUSH) {
- return BS_NEED_MORE;
- }
- if (s.lookahead === 0) {
- break; /* flush the current block */
- }
- }
-
- /* Insert the string window[strstart .. strstart+2] in the
- * dictionary, and set hash_head to the head of the hash chain:
- */
- hash_head = 0/*NIL*/;
- if (s.lookahead >= MIN_MATCH) {
- /*** INSERT_STRING(s, s.strstart, hash_head); ***/
- s.ins_h = ((s.ins_h << s.hash_shift) ^ s.window[s.strstart + MIN_MATCH - 1]) & s.hash_mask;
- hash_head = s.prev[s.strstart & s.w_mask] = s.head[s.ins_h];
- s.head[s.ins_h] = s.strstart;
- /***/
- }
-
- /* Find the longest match, discarding those <= prev_length.
- * At this point we have always match_length < MIN_MATCH
- */
- if (hash_head !== 0/*NIL*/ && ((s.strstart - hash_head) <= (s.w_size - MIN_LOOKAHEAD))) {
- /* To simplify the code, we prevent matches with the string
- * of window index 0 (in particular we have to avoid a match
- * of the string with itself at the start of the input file).
- */
- s.match_length = longest_match(s, hash_head);
- /* longest_match() sets match_start */
- }
- if (s.match_length >= MIN_MATCH) {
- // check_match(s, s.strstart, s.match_start, s.match_length); // for debug only
-
- /*** _tr_tally_dist(s, s.strstart - s.match_start,
- s.match_length - MIN_MATCH, bflush); ***/
- bflush = trees._tr_tally(s, s.strstart - s.match_start, s.match_length - MIN_MATCH);
-
- s.lookahead -= s.match_length;
-
- /* Insert new strings in the hash table only if the match length
- * is not too large. This saves time but degrades compression.
- */
- if (s.match_length <= s.max_lazy_match/*max_insert_length*/ && s.lookahead >= MIN_MATCH) {
- s.match_length--; /* string at strstart already in table */
- do {
- s.strstart++;
- /*** INSERT_STRING(s, s.strstart, hash_head); ***/
- s.ins_h = ((s.ins_h << s.hash_shift) ^ s.window[s.strstart + MIN_MATCH - 1]) & s.hash_mask;
- hash_head = s.prev[s.strstart & s.w_mask] = s.head[s.ins_h];
- s.head[s.ins_h] = s.strstart;
- /***/
- /* strstart never exceeds WSIZE-MAX_MATCH, so there are
- * always MIN_MATCH bytes ahead.
- */
- } while (--s.match_length !== 0);
- s.strstart++;
- } else
- {
- s.strstart += s.match_length;
- s.match_length = 0;
- s.ins_h = s.window[s.strstart];
- /* UPDATE_HASH(s, s.ins_h, s.window[s.strstart+1]); */
- s.ins_h = ((s.ins_h << s.hash_shift) ^ s.window[s.strstart + 1]) & s.hash_mask;
-
- //#if MIN_MATCH != 3
- // Call UPDATE_HASH() MIN_MATCH-3 more times
- //#endif
- /* If lookahead < MIN_MATCH, ins_h is garbage, but it does not
- * matter since it will be recomputed at next deflate call.
- */
- }
- } else {
- /* No match, output a literal byte */
- //Tracevv((stderr,"%c", s.window[s.strstart]));
- /*** _tr_tally_lit(s, s.window[s.strstart], bflush); ***/
- bflush = trees._tr_tally(s, 0, s.window[s.strstart]);
-
- s.lookahead--;
- s.strstart++;
- }
- if (bflush) {
- /*** FLUSH_BLOCK(s, 0); ***/
- flush_block_only(s, false);
- if (s.strm.avail_out === 0) {
- return BS_NEED_MORE;
- }
- /***/
- }
- }
- s.insert = ((s.strstart < (MIN_MATCH-1)) ? s.strstart : MIN_MATCH-1);
- if (flush === Z_FINISH) {
- /*** FLUSH_BLOCK(s, 1); ***/
- flush_block_only(s, true);
- if (s.strm.avail_out === 0) {
- return BS_FINISH_STARTED;
- }
- /***/
- return BS_FINISH_DONE;
- }
- if (s.last_lit) {
- /*** FLUSH_BLOCK(s, 0); ***/
- flush_block_only(s, false);
- if (s.strm.avail_out === 0) {
- return BS_NEED_MORE;
- }
- /***/
- }
- return BS_BLOCK_DONE;
- }
-
- /* ===========================================================================
- * Same as above, but achieves better compression. We use a lazy
- * evaluation for matches: a match is finally adopted only if there is
- * no better match at the next window position.
- */
- function deflate_slow(s, flush) {
- var hash_head; /* head of hash chain */
- var bflush; /* set if current block must be flushed */
-
- var max_insert;
-
- /* Process the input block. */
- for (;;) {
- /* Make sure that we always have enough lookahead, except
- * at the end of the input file. We need MAX_MATCH bytes
- * for the next match, plus MIN_MATCH bytes to insert the
- * string following the next match.
- */
- if (s.lookahead < MIN_LOOKAHEAD) {
- fill_window(s);
- if (s.lookahead < MIN_LOOKAHEAD && flush === Z_NO_FLUSH) {
- return BS_NEED_MORE;
- }
- if (s.lookahead === 0) { break; } /* flush the current block */
- }
-
- /* Insert the string window[strstart .. strstart+2] in the
- * dictionary, and set hash_head to the head of the hash chain:
- */
- hash_head = 0/*NIL*/;
- if (s.lookahead >= MIN_MATCH) {
- /*** INSERT_STRING(s, s.strstart, hash_head); ***/
- s.ins_h = ((s.ins_h << s.hash_shift) ^ s.window[s.strstart + MIN_MATCH - 1]) & s.hash_mask;
- hash_head = s.prev[s.strstart & s.w_mask] = s.head[s.ins_h];
- s.head[s.ins_h] = s.strstart;
- /***/
- }
-
- /* Find the longest match, discarding those <= prev_length.
- */
- s.prev_length = s.match_length;
- s.prev_match = s.match_start;
- s.match_length = MIN_MATCH-1;
-
- if (hash_head !== 0/*NIL*/ && s.prev_length < s.max_lazy_match &&
- s.strstart - hash_head <= (s.w_size-MIN_LOOKAHEAD)/*MAX_DIST(s)*/) {
- /* To simplify the code, we prevent matches with the string
- * of window index 0 (in particular we have to avoid a match
- * of the string with itself at the start of the input file).
- */
- s.match_length = longest_match(s, hash_head);
- /* longest_match() sets match_start */
-
- if (s.match_length <= 5 &&
- (s.strategy === Z_FILTERED || (s.match_length === MIN_MATCH && s.strstart - s.match_start > 4096/*TOO_FAR*/))) {
-
- /* If prev_match is also MIN_MATCH, match_start is garbage
- * but we will ignore the current match anyway.
- */
- s.match_length = MIN_MATCH-1;
- }
- }
- /* If there was a match at the previous step and the current
- * match is not better, output the previous match:
- */
- if (s.prev_length >= MIN_MATCH && s.match_length <= s.prev_length) {
- max_insert = s.strstart + s.lookahead - MIN_MATCH;
- /* Do not insert strings in hash table beyond this. */
-
- //check_match(s, s.strstart-1, s.prev_match, s.prev_length);
-
- /***_tr_tally_dist(s, s.strstart - 1 - s.prev_match,
- s.prev_length - MIN_MATCH, bflush);***/
- bflush = trees._tr_tally(s, s.strstart - 1- s.prev_match, s.prev_length - MIN_MATCH);
- /* Insert in hash table all strings up to the end of the match.
- * strstart-1 and strstart are already inserted. If there is not
- * enough lookahead, the last two strings are not inserted in
- * the hash table.
- */
- s.lookahead -= s.prev_length-1;
- s.prev_length -= 2;
- do {
- if (++s.strstart <= max_insert) {
- /*** INSERT_STRING(s, s.strstart, hash_head); ***/
- s.ins_h = ((s.ins_h << s.hash_shift) ^ s.window[s.strstart + MIN_MATCH - 1]) & s.hash_mask;
- hash_head = s.prev[s.strstart & s.w_mask] = s.head[s.ins_h];
- s.head[s.ins_h] = s.strstart;
- /***/
- }
- } while (--s.prev_length !== 0);
- s.match_available = 0;
- s.match_length = MIN_MATCH-1;
- s.strstart++;
-
- if (bflush) {
- /*** FLUSH_BLOCK(s, 0); ***/
- flush_block_only(s, false);
- if (s.strm.avail_out === 0) {
- return BS_NEED_MORE;
- }
- /***/
- }
-
- } else if (s.match_available) {
- /* If there was no match at the previous position, output a
- * single literal. If there was a match but the current match
- * is longer, truncate the previous match to a single literal.
- */
- //Tracevv((stderr,"%c", s->window[s->strstart-1]));
- /*** _tr_tally_lit(s, s.window[s.strstart-1], bflush); ***/
- bflush = trees._tr_tally(s, 0, s.window[s.strstart-1]);
-
- if (bflush) {
- /*** FLUSH_BLOCK_ONLY(s, 0) ***/
- flush_block_only(s, false);
- /***/
- }
- s.strstart++;
- s.lookahead--;
- if (s.strm.avail_out === 0) {
- return BS_NEED_MORE;
- }
- } else {
- /* There is no previous match to compare with, wait for
- * the next step to decide.
- */
- s.match_available = 1;
- s.strstart++;
- s.lookahead--;
- }
- }
- //Assert (flush != Z_NO_FLUSH, "no flush?");
- if (s.match_available) {
- //Tracevv((stderr,"%c", s->window[s->strstart-1]));
- /*** _tr_tally_lit(s, s.window[s.strstart-1], bflush); ***/
- bflush = trees._tr_tally(s, 0, s.window[s.strstart-1]);
-
- s.match_available = 0;
- }
- s.insert = s.strstart < MIN_MATCH-1 ? s.strstart : MIN_MATCH-1;
- if (flush === Z_FINISH) {
- /*** FLUSH_BLOCK(s, 1); ***/
- flush_block_only(s, true);
- if (s.strm.avail_out === 0) {
- return BS_FINISH_STARTED;
- }
- /***/
- return BS_FINISH_DONE;
- }
- if (s.last_lit) {
- /*** FLUSH_BLOCK(s, 0); ***/
- flush_block_only(s, false);
- if (s.strm.avail_out === 0) {
- return BS_NEED_MORE;
- }
- /***/
- }
-
- return BS_BLOCK_DONE;
- }
-
-
- /* ===========================================================================
- * For Z_RLE, simply look for runs of bytes, generate matches only of distance
- * one. Do not maintain a hash table. (It will be regenerated if this run of
- * deflate switches away from Z_RLE.)
- */
- function deflate_rle(s, flush) {
- var bflush; /* set if current block must be flushed */
- var prev; /* byte at distance one to match */
- var scan, strend; /* scan goes up to strend for length of run */
-
- var _win = s.window;
-
- for (;;) {
- /* Make sure that we always have enough lookahead, except
- * at the end of the input file. We need MAX_MATCH bytes
- * for the longest run, plus one for the unrolled loop.
- */
- if (s.lookahead <= MAX_MATCH) {
- fill_window(s);
- if (s.lookahead <= MAX_MATCH && flush === Z_NO_FLUSH) {
- return BS_NEED_MORE;
- }
- if (s.lookahead === 0) { break; } /* flush the current block */
- }
-
- /* See how many times the previous byte repeats */
- s.match_length = 0;
- if (s.lookahead >= MIN_MATCH && s.strstart > 0) {
- scan = s.strstart - 1;
- prev = _win[scan];
- if (prev === _win[++scan] && prev === _win[++scan] && prev === _win[++scan]) {
- strend = s.strstart + MAX_MATCH;
- do {
- /*jshint noempty:false*/
- } while (prev === _win[++scan] && prev === _win[++scan] &&
- prev === _win[++scan] && prev === _win[++scan] &&
- prev === _win[++scan] && prev === _win[++scan] &&
- prev === _win[++scan] && prev === _win[++scan] &&
- scan < strend);
- s.match_length = MAX_MATCH - (strend - scan);
- if (s.match_length > s.lookahead) {
- s.match_length = s.lookahead;
- }
- }
- //Assert(scan <= s->window+(uInt)(s->window_size-1), "wild scan");
- }
-
- /* Emit match if have run of MIN_MATCH or longer, else emit literal */
- if (s.match_length >= MIN_MATCH) {
- //check_match(s, s.strstart, s.strstart - 1, s.match_length);
-
- /*** _tr_tally_dist(s, 1, s.match_length - MIN_MATCH, bflush); ***/
- bflush = trees._tr_tally(s, 1, s.match_length - MIN_MATCH);
-
- s.lookahead -= s.match_length;
- s.strstart += s.match_length;
- s.match_length = 0;
- } else {
- /* No match, output a literal byte */
- //Tracevv((stderr,"%c", s->window[s->strstart]));
- /*** _tr_tally_lit(s, s.window[s.strstart], bflush); ***/
- bflush = trees._tr_tally(s, 0, s.window[s.strstart]);
-
- s.lookahead--;
- s.strstart++;
- }
- if (bflush) {
- /*** FLUSH_BLOCK(s, 0); ***/
- flush_block_only(s, false);
- if (s.strm.avail_out === 0) {
- return BS_NEED_MORE;
- }
- /***/
- }
- }
- s.insert = 0;
- if (flush === Z_FINISH) {
- /*** FLUSH_BLOCK(s, 1); ***/
- flush_block_only(s, true);
- if (s.strm.avail_out === 0) {
- return BS_FINISH_STARTED;
- }
- /***/
- return BS_FINISH_DONE;
- }
- if (s.last_lit) {
- /*** FLUSH_BLOCK(s, 0); ***/
- flush_block_only(s, false);
- if (s.strm.avail_out === 0) {
- return BS_NEED_MORE;
- }
- /***/
- }
- return BS_BLOCK_DONE;
- }
-
- /* ===========================================================================
- * For Z_HUFFMAN_ONLY, do not look for matches. Do not maintain a hash table.
- * (It will be regenerated if this run of deflate switches away from Huffman.)
- */
- function deflate_huff(s, flush) {
- var bflush; /* set if current block must be flushed */
-
- for (;;) {
- /* Make sure that we have a literal to write. */
- if (s.lookahead === 0) {
- fill_window(s);
- if (s.lookahead === 0) {
- if (flush === Z_NO_FLUSH) {
- return BS_NEED_MORE;
- }
- break; /* flush the current block */
- }
- }
-
- /* Output a literal byte */
- s.match_length = 0;
- //Tracevv((stderr,"%c", s->window[s->strstart]));
- /*** _tr_tally_lit(s, s.window[s.strstart], bflush); ***/
- bflush = trees._tr_tally(s, 0, s.window[s.strstart]);
- s.lookahead--;
- s.strstart++;
- if (bflush) {
- /*** FLUSH_BLOCK(s, 0); ***/
- flush_block_only(s, false);
- if (s.strm.avail_out === 0) {
- return BS_NEED_MORE;
- }
- /***/
- }
- }
- s.insert = 0;
- if (flush === Z_FINISH) {
- /*** FLUSH_BLOCK(s, 1); ***/
- flush_block_only(s, true);
- if (s.strm.avail_out === 0) {
- return BS_FINISH_STARTED;
- }
- /***/
- return BS_FINISH_DONE;
- }
- if (s.last_lit) {
- /*** FLUSH_BLOCK(s, 0); ***/
- flush_block_only(s, false);
- if (s.strm.avail_out === 0) {
- return BS_NEED_MORE;
- }
- /***/
- }
- return BS_BLOCK_DONE;
- }
-
- /* Values for max_lazy_match, good_match and max_chain_length, depending on
- * the desired pack level (0..9). The values given below have been tuned to
- * exclude worst case performance for pathological files. Better values may be
- * found for specific files.
- */
- var Config = function (good_length, max_lazy, nice_length, max_chain, func) {
- this.good_length = good_length;
- this.max_lazy = max_lazy;
- this.nice_length = nice_length;
- this.max_chain = max_chain;
- this.func = func;
- };
-
- var configuration_table;
-
- configuration_table = [
- /* good lazy nice chain */
- new Config(0, 0, 0, 0, deflate_stored), /* 0 store only */
- new Config(4, 4, 8, 4, deflate_fast), /* 1 max speed, no lazy matches */
- new Config(4, 5, 16, 8, deflate_fast), /* 2 */
- new Config(4, 6, 32, 32, deflate_fast), /* 3 */
-
- new Config(4, 4, 16, 16, deflate_slow), /* 4 lazy matches */
- new Config(8, 16, 32, 32, deflate_slow), /* 5 */
- new Config(8, 16, 128, 128, deflate_slow), /* 6 */
- new Config(8, 32, 128, 256, deflate_slow), /* 7 */
- new Config(32, 128, 258, 1024, deflate_slow), /* 8 */
- new Config(32, 258, 258, 4096, deflate_slow) /* 9 max compression */
- ];
-
-
- /* ===========================================================================
- * Initialize the "longest match" routines for a new zlib stream
- */
- function lm_init(s) {
- s.window_size = 2 * s.w_size;
-
- /*** CLEAR_HASH(s); ***/
- zero(s.head); // Fill with NIL (= 0);
-
- /* Set the default configuration parameters:
- */
- s.max_lazy_match = configuration_table[s.level].max_lazy;
- s.good_match = configuration_table[s.level].good_length;
- s.nice_match = configuration_table[s.level].nice_length;
- s.max_chain_length = configuration_table[s.level].max_chain;
-
- s.strstart = 0;
- s.block_start = 0;
- s.lookahead = 0;
- s.insert = 0;
- s.match_length = s.prev_length = MIN_MATCH - 1;
- s.match_available = 0;
- s.ins_h = 0;
- }
-
-
- function DeflateState() {
- this.strm = null; /* pointer back to this zlib stream */
- this.status = 0; /* as the name implies */
- this.pending_buf = null; /* output still pending */
- this.pending_buf_size = 0; /* size of pending_buf */
- this.pending_out = 0; /* next pending byte to output to the stream */
- this.pending = 0; /* nb of bytes in the pending buffer */
- this.wrap = 0; /* bit 0 true for zlib, bit 1 true for gzip */
- this.gzhead = null; /* gzip header information to write */
- this.gzindex = 0; /* where in extra, name, or comment */
- this.method = Z_DEFLATED; /* can only be DEFLATED */
- this.last_flush = -1; /* value of flush param for previous deflate call */
-
- this.w_size = 0; /* LZ77 window size (32K by default) */
- this.w_bits = 0; /* log2(w_size) (8..16) */
- this.w_mask = 0; /* w_size - 1 */
-
- this.window = null;
- /* Sliding window. Input bytes are read into the second half of the window,
- * and move to the first half later to keep a dictionary of at least wSize
- * bytes. With this organization, matches are limited to a distance of
- * wSize-MAX_MATCH bytes, but this ensures that IO is always
- * performed with a length multiple of the block size.
- */
-
- this.window_size = 0;
- /* Actual size of window: 2*wSize, except when the user input buffer
- * is directly used as sliding window.
- */
-
- this.prev = null;
- /* Link to older string with same hash index. To limit the size of this
- * array to 64K, this link is maintained only for the last 32K strings.
- * An index in this array is thus a window index modulo 32K.
- */
-
- this.head = null; /* Heads of the hash chains or NIL. */
-
- this.ins_h = 0; /* hash index of string to be inserted */
- this.hash_size = 0; /* number of elements in hash table */
- this.hash_bits = 0; /* log2(hash_size) */
- this.hash_mask = 0; /* hash_size-1 */
-
- this.hash_shift = 0;
- /* Number of bits by which ins_h must be shifted at each input
- * step. It must be such that after MIN_MATCH steps, the oldest
- * byte no longer takes part in the hash key, that is:
- * hash_shift * MIN_MATCH >= hash_bits
- */
-
- this.block_start = 0;
- /* Window position at the beginning of the current output block. Gets
- * negative when the window is moved backwards.
- */
-
- this.match_length = 0; /* length of best match */
- this.prev_match = 0; /* previous match */
- this.match_available = 0; /* set if previous match exists */
- this.strstart = 0; /* start of string to insert */
- this.match_start = 0; /* start of matching string */
- this.lookahead = 0; /* number of valid bytes ahead in window */
-
- this.prev_length = 0;
- /* Length of the best match at previous step. Matches not greater than this
- * are discarded. This is used in the lazy match evaluation.
- */
-
- this.max_chain_length = 0;
- /* To speed up deflation, hash chains are never searched beyond this
- * length. A higher limit improves compression ratio but degrades the
- * speed.
- */
-
- this.max_lazy_match = 0;
- /* Attempt to find a better match only when the current match is strictly
- * smaller than this value. This mechanism is used only for compression
- * levels >= 4.
- */
- // That's alias to max_lazy_match, don't use directly
- //this.max_insert_length = 0;
- /* Insert new strings in the hash table only if the match length is not
- * greater than this length. This saves time but degrades compression.
- * max_insert_length is used only for compression levels <= 3.
- */
-
- this.level = 0; /* compression level (1..9) */
- this.strategy = 0; /* favor or force Huffman coding*/
-
- this.good_match = 0;
- /* Use a faster search when the previous match is longer than this */
-
- this.nice_match = 0; /* Stop searching when current match exceeds this */
-
- /* used by trees.c: */
-
- /* Didn't use ct_data typedef below to suppress compiler warning */
-
- // struct ct_data_s dyn_ltree[HEAP_SIZE]; /* literal and length tree */
- // struct ct_data_s dyn_dtree[2*D_CODES+1]; /* distance tree */
- // struct ct_data_s bl_tree[2*BL_CODES+1]; /* Huffman tree for bit lengths */
-
- // Use flat array of DOUBLE size, with interleaved fata,
- // because JS does not support effective
- this.dyn_ltree = new utils.Buf16(HEAP_SIZE * 2);
- this.dyn_dtree = new utils.Buf16((2*D_CODES+1) * 2);
- this.bl_tree = new utils.Buf16((2*BL_CODES+1) * 2);
- zero(this.dyn_ltree);
- zero(this.dyn_dtree);
- zero(this.bl_tree);
-
- this.l_desc = null; /* desc. for literal tree */
- this.d_desc = null; /* desc. for distance tree */
- this.bl_desc = null; /* desc. for bit length tree */
-
- //ush bl_count[MAX_BITS+1];
- this.bl_count = new utils.Buf16(MAX_BITS+1);
- /* number of codes at each bit length for an optimal tree */
-
- //int heap[2*L_CODES+1]; /* heap used to build the Huffman trees */
- this.heap = new utils.Buf16(2*L_CODES+1); /* heap used to build the Huffman trees */
- zero(this.heap);
-
- this.heap_len = 0; /* number of elements in the heap */
- this.heap_max = 0; /* element of largest frequency */
- /* The sons of heap[n] are heap[2*n] and heap[2*n+1]. heap[0] is not used.
- * The same heap array is used to build all trees.
- */
-
- this.depth = new utils.Buf16(2*L_CODES+1); //uch depth[2*L_CODES+1];
- zero(this.depth);
- /* Depth of each subtree used as tie breaker for trees of equal frequency
- */
-
- this.l_buf = 0; /* buffer index for literals or lengths */
-
- this.lit_bufsize = 0;
- /* Size of match buffer for literals/lengths. There are 4 reasons for
- * limiting lit_bufsize to 64K:
- * - frequencies can be kept in 16 bit counters
- * - if compression is not successful for the first block, all input
- * data is still in the window so we can still emit a stored block even
- * when input comes from standard input. (This can also be done for
- * all blocks if lit_bufsize is not greater than 32K.)
- * - if compression is not successful for a file smaller than 64K, we can
- * even emit a stored file instead of a stored block (saving 5 bytes).
- * This is applicable only for zip (not gzip or zlib).
- * - creating new Huffman trees less frequently may not provide fast
- * adaptation to changes in the input data statistics. (Take for
- * example a binary file with poorly compressible code followed by
- * a highly compressible string table.) Smaller buffer sizes give
- * fast adaptation but have of course the overhead of transmitting
- * trees more frequently.
- * - I can't count above 4
- */
-
- this.last_lit = 0; /* running index in l_buf */
-
- this.d_buf = 0;
- /* Buffer index for distances. To simplify the code, d_buf and l_buf have
- * the same number of elements. To use different lengths, an extra flag
- * array would be necessary.
- */
-
- this.opt_len = 0; /* bit length of current block with optimal trees */
- this.static_len = 0; /* bit length of current block with static trees */
- this.matches = 0; /* number of string matches in current block */
- this.insert = 0; /* bytes at end of window left to insert */
-
-
- this.bi_buf = 0;
- /* Output buffer. bits are inserted starting at the bottom (least
- * significant bits).
- */
- this.bi_valid = 0;
- /* Number of valid bits in bi_buf. All bits above the last valid bit
- * are always zero.
- */
-
- // Used for window memory init. We safely ignore it for JS. That makes
- // sense only for pointers and memory check tools.
- //this.high_water = 0;
- /* High water mark offset in window for initialized bytes -- bytes above
- * this are set to zero in order to avoid memory check warnings when
- * longest match routines access bytes past the input. This is then
- * updated to the new high water mark.
- */
- }
-
-
- function deflateResetKeep(strm) {
- var s;
-
- if (!strm || !strm.state) {
- return err(strm, Z_STREAM_ERROR);
- }
-
- strm.total_in = strm.total_out = 0;
- strm.data_type = Z_UNKNOWN;
-
- s = strm.state;
- s.pending = 0;
- s.pending_out = 0;
-
- if (s.wrap < 0) {
- s.wrap = -s.wrap;
- /* was made negative by deflate(..., Z_FINISH); */
- }
- s.status = (s.wrap ? INIT_STATE : BUSY_STATE);
- strm.adler = (s.wrap === 2) ?
- 0 // crc32(0, Z_NULL, 0)
- :
- 1; // adler32(0, Z_NULL, 0)
- s.last_flush = Z_NO_FLUSH;
- trees._tr_init(s);
- return Z_OK;
- }
-
-
- function deflateReset(strm) {
- var ret = deflateResetKeep(strm);
- if (ret === Z_OK) {
- lm_init(strm.state);
- }
- return ret;
- }
-
-
- function deflateSetHeader(strm, head) {
- if (!strm || !strm.state) { return Z_STREAM_ERROR; }
- if (strm.state.wrap !== 2) { return Z_STREAM_ERROR; }
- strm.state.gzhead = head;
- return Z_OK;
- }
-
-
- function deflateInit2(strm, level, method, windowBits, memLevel, strategy) {
- if (!strm) { // === Z_NULL
- return Z_STREAM_ERROR;
- }
- var wrap = 1;
-
- if (level === Z_DEFAULT_COMPRESSION) {
- level = 6;
- }
-
- if (windowBits < 0) { /* suppress zlib wrapper */
- wrap = 0;
- windowBits = -windowBits;
- }
-
- else if (windowBits > 15) {
- wrap = 2; /* write gzip wrapper instead */
- windowBits -= 16;
- }
-
-
- if (memLevel < 1 || memLevel > MAX_MEM_LEVEL || method !== Z_DEFLATED ||
- windowBits < 8 || windowBits > 15 || level < 0 || level > 9 ||
- strategy < 0 || strategy > Z_FIXED) {
- return err(strm, Z_STREAM_ERROR);
- }
-
-
- if (windowBits === 8) {
- windowBits = 9;
- }
- /* until 256-byte window bug fixed */
-
- var s = new DeflateState();
-
- strm.state = s;
- s.strm = strm;
-
- s.wrap = wrap;
- s.gzhead = null;
- s.w_bits = windowBits;
- s.w_size = 1 << s.w_bits;
- s.w_mask = s.w_size - 1;
-
- s.hash_bits = memLevel + 7;
- s.hash_size = 1 << s.hash_bits;
- s.hash_mask = s.hash_size - 1;
- s.hash_shift = ~~((s.hash_bits + MIN_MATCH - 1) / MIN_MATCH);
-
- s.window = new utils.Buf8(s.w_size * 2);
- s.head = new utils.Buf16(s.hash_size);
- s.prev = new utils.Buf16(s.w_size);
-
- // Don't need mem init magic for JS.
- //s.high_water = 0; /* nothing written to s->window yet */
-
- s.lit_bufsize = 1 << (memLevel + 6); /* 16K elements by default */
-
- s.pending_buf_size = s.lit_bufsize * 4;
- s.pending_buf = new utils.Buf8(s.pending_buf_size);
-
- s.d_buf = s.lit_bufsize >> 1;
- s.l_buf = (1 + 2) * s.lit_bufsize;
-
- s.level = level;
- s.strategy = strategy;
- s.method = method;
-
- return deflateReset(strm);
- }
-
- function deflateInit(strm, level) {
- return deflateInit2(strm, level, Z_DEFLATED, MAX_WBITS, DEF_MEM_LEVEL, Z_DEFAULT_STRATEGY);
- }
-
-
- function deflate(strm, flush) {
- var old_flush, s;
- var beg, val; // for gzip header write only
-
- if (!strm || !strm.state ||
- flush > Z_BLOCK || flush < 0) {
- return strm ? err(strm, Z_STREAM_ERROR) : Z_STREAM_ERROR;
- }
-
- s = strm.state;
-
- if (!strm.output ||
- (!strm.input && strm.avail_in !== 0) ||
- (s.status === FINISH_STATE && flush !== Z_FINISH)) {
- return err(strm, (strm.avail_out === 0) ? Z_BUF_ERROR : Z_STREAM_ERROR);
- }
-
- s.strm = strm; /* just in case */
- old_flush = s.last_flush;
- s.last_flush = flush;
-
- /* Write the header */
- if (s.status === INIT_STATE) {
-
- if (s.wrap === 2) { // GZIP header
- strm.adler = 0; //crc32(0L, Z_NULL, 0);
- put_byte(s, 31);
- put_byte(s, 139);
- put_byte(s, 8);
- if (!s.gzhead) { // s->gzhead == Z_NULL
- put_byte(s, 0);
- put_byte(s, 0);
- put_byte(s, 0);
- put_byte(s, 0);
- put_byte(s, 0);
- put_byte(s, s.level === 9 ? 2 :
- (s.strategy >= Z_HUFFMAN_ONLY || s.level < 2 ?
- 4 : 0));
- put_byte(s, OS_CODE);
- s.status = BUSY_STATE;
- }
- else {
- put_byte(s, (s.gzhead.text ? 1 : 0) +
- (s.gzhead.hcrc ? 2 : 0) +
- (!s.gzhead.extra ? 0 : 4) +
- (!s.gzhead.name ? 0 : 8) +
- (!s.gzhead.comment ? 0 : 16)
- );
- put_byte(s, s.gzhead.time & 0xff);
- put_byte(s, (s.gzhead.time >> 8) & 0xff);
- put_byte(s, (s.gzhead.time >> 16) & 0xff);
- put_byte(s, (s.gzhead.time >> 24) & 0xff);
- put_byte(s, s.level === 9 ? 2 :
- (s.strategy >= Z_HUFFMAN_ONLY || s.level < 2 ?
- 4 : 0));
- put_byte(s, s.gzhead.os & 0xff);
- if (s.gzhead.extra && s.gzhead.extra.length) {
- put_byte(s, s.gzhead.extra.length & 0xff);
- put_byte(s, (s.gzhead.extra.length >> 8) & 0xff);
- }
- if (s.gzhead.hcrc) {
- strm.adler = crc32(strm.adler, s.pending_buf, s.pending, 0);
- }
- s.gzindex = 0;
- s.status = EXTRA_STATE;
- }
- }
- else // DEFLATE header
- {
- var header = (Z_DEFLATED + ((s.w_bits - 8) << 4)) << 8;
- var level_flags = -1;
-
- if (s.strategy >= Z_HUFFMAN_ONLY || s.level < 2) {
- level_flags = 0;
- } else if (s.level < 6) {
- level_flags = 1;
- } else if (s.level === 6) {
- level_flags = 2;
- } else {
- level_flags = 3;
- }
- header |= (level_flags << 6);
- if (s.strstart !== 0) { header |= PRESET_DICT; }
- header += 31 - (header % 31);
-
- s.status = BUSY_STATE;
- putShortMSB(s, header);
-
- /* Save the adler32 of the preset dictionary: */
- if (s.strstart !== 0) {
- putShortMSB(s, strm.adler >>> 16);
- putShortMSB(s, strm.adler & 0xffff);
- }
- strm.adler = 1; // adler32(0L, Z_NULL, 0);
- }
- }
-
- //#ifdef GZIP
- if (s.status === EXTRA_STATE) {
- if (s.gzhead.extra/* != Z_NULL*/) {
- beg = s.pending; /* start of bytes to update crc */
-
- while (s.gzindex < (s.gzhead.extra.length & 0xffff)) {
- if (s.pending === s.pending_buf_size) {
- if (s.gzhead.hcrc && s.pending > beg) {
- strm.adler = crc32(strm.adler, s.pending_buf, s.pending - beg, beg);
- }
- flush_pending(strm);
- beg = s.pending;
- if (s.pending === s.pending_buf_size) {
- break;
- }
- }
- put_byte(s, s.gzhead.extra[s.gzindex] & 0xff);
- s.gzindex++;
- }
- if (s.gzhead.hcrc && s.pending > beg) {
- strm.adler = crc32(strm.adler, s.pending_buf, s.pending - beg, beg);
- }
- if (s.gzindex === s.gzhead.extra.length) {
- s.gzindex = 0;
- s.status = NAME_STATE;
- }
- }
- else {
- s.status = NAME_STATE;
- }
- }
- if (s.status === NAME_STATE) {
- if (s.gzhead.name/* != Z_NULL*/) {
- beg = s.pending; /* start of bytes to update crc */
- //int val;
-
- do {
- if (s.pending === s.pending_buf_size) {
- if (s.gzhead.hcrc && s.pending > beg) {
- strm.adler = crc32(strm.adler, s.pending_buf, s.pending - beg, beg);
- }
- flush_pending(strm);
- beg = s.pending;
- if (s.pending === s.pending_buf_size) {
- val = 1;
- break;
- }
- }
- // JS specific: little magic to add zero terminator to end of string
- if (s.gzindex < s.gzhead.name.length) {
- val = s.gzhead.name.charCodeAt(s.gzindex++) & 0xff;
- } else {
- val = 0;
- }
- put_byte(s, val);
- } while (val !== 0);
-
- if (s.gzhead.hcrc && s.pending > beg){
- strm.adler = crc32(strm.adler, s.pending_buf, s.pending - beg, beg);
- }
- if (val === 0) {
- s.gzindex = 0;
- s.status = COMMENT_STATE;
- }
- }
- else {
- s.status = COMMENT_STATE;
- }
- }
- if (s.status === COMMENT_STATE) {
- if (s.gzhead.comment/* != Z_NULL*/) {
- beg = s.pending; /* start of bytes to update crc */
- //int val;
-
- do {
- if (s.pending === s.pending_buf_size) {
- if (s.gzhead.hcrc && s.pending > beg) {
- strm.adler = crc32(strm.adler, s.pending_buf, s.pending - beg, beg);
- }
- flush_pending(strm);
- beg = s.pending;
- if (s.pending === s.pending_buf_size) {
- val = 1;
- break;
- }
- }
- // JS specific: little magic to add zero terminator to end of string
- if (s.gzindex < s.gzhead.comment.length) {
- val = s.gzhead.comment.charCodeAt(s.gzindex++) & 0xff;
- } else {
- val = 0;
- }
- put_byte(s, val);
- } while (val !== 0);
-
- if (s.gzhead.hcrc && s.pending > beg) {
- strm.adler = crc32(strm.adler, s.pending_buf, s.pending - beg, beg);
- }
- if (val === 0) {
- s.status = HCRC_STATE;
- }
- }
- else {
- s.status = HCRC_STATE;
- }
- }
- if (s.status === HCRC_STATE) {
- if (s.gzhead.hcrc) {
- if (s.pending + 2 > s.pending_buf_size) {
- flush_pending(strm);
- }
- if (s.pending + 2 <= s.pending_buf_size) {
- put_byte(s, strm.adler & 0xff);
- put_byte(s, (strm.adler >> 8) & 0xff);
- strm.adler = 0; //crc32(0L, Z_NULL, 0);
- s.status = BUSY_STATE;
- }
- }
- else {
- s.status = BUSY_STATE;
- }
- }
- //#endif
-
- /* Flush as much pending output as possible */
- if (s.pending !== 0) {
- flush_pending(strm);
- if (strm.avail_out === 0) {
- /* Since avail_out is 0, deflate will be called again with
- * more output space, but possibly with both pending and
- * avail_in equal to zero. There won't be anything to do,
- * but this is not an error situation so make sure we
- * return OK instead of BUF_ERROR at next call of deflate:
- */
- s.last_flush = -1;
- return Z_OK;
- }
-
- /* Make sure there is something to do and avoid duplicate consecutive
- * flushes. For repeated and useless calls with Z_FINISH, we keep
- * returning Z_STREAM_END instead of Z_BUF_ERROR.
- */
- } else if (strm.avail_in === 0 && rank(flush) <= rank(old_flush) &&
- flush !== Z_FINISH) {
- return err(strm, Z_BUF_ERROR);
- }
-
- /* User must not provide more input after the first FINISH: */
- if (s.status === FINISH_STATE && strm.avail_in !== 0) {
- return err(strm, Z_BUF_ERROR);
- }
-
- /* Start a new block or continue the current one.
- */
- if (strm.avail_in !== 0 || s.lookahead !== 0 ||
- (flush !== Z_NO_FLUSH && s.status !== FINISH_STATE)) {
- var bstate = (s.strategy === Z_HUFFMAN_ONLY) ? deflate_huff(s, flush) :
- (s.strategy === Z_RLE ? deflate_rle(s, flush) :
- configuration_table[s.level].func(s, flush));
-
- if (bstate === BS_FINISH_STARTED || bstate === BS_FINISH_DONE) {
- s.status = FINISH_STATE;
- }
- if (bstate === BS_NEED_MORE || bstate === BS_FINISH_STARTED) {
- if (strm.avail_out === 0) {
- s.last_flush = -1;
- /* avoid BUF_ERROR next call, see above */
- }
- return Z_OK;
- /* If flush != Z_NO_FLUSH && avail_out == 0, the next call
- * of deflate should use the same flush parameter to make sure
- * that the flush is complete. So we don't have to output an
- * empty block here, this will be done at next call. This also
- * ensures that for a very small output buffer, we emit at most
- * one empty block.
- */
- }
- if (bstate === BS_BLOCK_DONE) {
- if (flush === Z_PARTIAL_FLUSH) {
- trees._tr_align(s);
- }
- else if (flush !== Z_BLOCK) { /* FULL_FLUSH or SYNC_FLUSH */
-
- trees._tr_stored_block(s, 0, 0, false);
- /* For a full flush, this empty block will be recognized
- * as a special marker by inflate_sync().
- */
- if (flush === Z_FULL_FLUSH) {
- /*** CLEAR_HASH(s); ***/ /* forget history */
- zero(s.head); // Fill with NIL (= 0);
-
- if (s.lookahead === 0) {
- s.strstart = 0;
- s.block_start = 0;
- s.insert = 0;
- }
- }
- }
- flush_pending(strm);
- if (strm.avail_out === 0) {
- s.last_flush = -1; /* avoid BUF_ERROR at next call, see above */
- return Z_OK;
- }
- }
- }
- //Assert(strm->avail_out > 0, "bug2");
- //if (strm.avail_out <= 0) { throw new Error("bug2");}
-
- if (flush !== Z_FINISH) { return Z_OK; }
- if (s.wrap <= 0) { return Z_STREAM_END; }
-
- /* Write the trailer */
- if (s.wrap === 2) {
- put_byte(s, strm.adler & 0xff);
- put_byte(s, (strm.adler >> 8) & 0xff);
- put_byte(s, (strm.adler >> 16) & 0xff);
- put_byte(s, (strm.adler >> 24) & 0xff);
- put_byte(s, strm.total_in & 0xff);
- put_byte(s, (strm.total_in >> 8) & 0xff);
- put_byte(s, (strm.total_in >> 16) & 0xff);
- put_byte(s, (strm.total_in >> 24) & 0xff);
- }
- else
- {
- putShortMSB(s, strm.adler >>> 16);
- putShortMSB(s, strm.adler & 0xffff);
- }
-
- flush_pending(strm);
- /* If avail_out is zero, the application will call deflate again
- * to flush the rest.
- */
- if (s.wrap > 0) { s.wrap = -s.wrap; }
- /* write the trailer only once! */
- return s.pending !== 0 ? Z_OK : Z_STREAM_END;
- }
-
- function deflateEnd(strm) {
- var status;
-
- if (!strm/*== Z_NULL*/ || !strm.state/*== Z_NULL*/) {
- return Z_STREAM_ERROR;
- }
-
- status = strm.state.status;
- if (status !== INIT_STATE &&
- status !== EXTRA_STATE &&
- status !== NAME_STATE &&
- status !== COMMENT_STATE &&
- status !== HCRC_STATE &&
- status !== BUSY_STATE &&
- status !== FINISH_STATE
- ) {
- return err(strm, Z_STREAM_ERROR);
- }
-
- strm.state = null;
-
- return status === BUSY_STATE ? err(strm, Z_DATA_ERROR) : Z_OK;
- }
-
- /* =========================================================================
- * Copy the source state to the destination state
- */
- //function deflateCopy(dest, source) {
- //
- //}
-
- exports.deflateInit = deflateInit;
- exports.deflateInit2 = deflateInit2;
- exports.deflateReset = deflateReset;
- exports.deflateResetKeep = deflateResetKeep;
- exports.deflateSetHeader = deflateSetHeader;
- exports.deflate = deflate;
- exports.deflateEnd = deflateEnd;
- exports.deflateInfo = 'pako deflate (from Nodeca project)';
-
- /* Not implemented
- exports.deflateBound = deflateBound;
- exports.deflateCopy = deflateCopy;
- exports.deflateSetDictionary = deflateSetDictionary;
- exports.deflateParams = deflateParams;
- exports.deflatePending = deflatePending;
- exports.deflatePrime = deflatePrime;
- exports.deflateTune = deflateTune;
- */
- },{"../utils/common":27,"./adler32":29,"./crc32":31,"./messages":37,"./trees":38}],33:[function(_dereq_,module,exports){
- 'use strict';
-
-
- function GZheader() {
- /* true if compressed data believed to be text */
- this.text = 0;
- /* modification time */
- this.time = 0;
- /* extra flags (not used when writing a gzip file) */
- this.xflags = 0;
- /* operating system */
- this.os = 0;
- /* pointer to extra field or Z_NULL if none */
- this.extra = null;
- /* extra field length (valid if extra != Z_NULL) */
- this.extra_len = 0; // Actually, we don't need it in JS,
- // but leave for few code modifications
-
- //
- // Setup limits is not necessary because in js we should not preallocate memory
- // for inflate use constant limit in 65536 bytes
- //
-
- /* space at extra (only when reading header) */
- // this.extra_max = 0;
- /* pointer to zero-terminated file name or Z_NULL */
- this.name = '';
- /* space at name (only when reading header) */
- // this.name_max = 0;
- /* pointer to zero-terminated comment or Z_NULL */
- this.comment = '';
- /* space at comment (only when reading header) */
- // this.comm_max = 0;
- /* true if there was or will be a header crc */
- this.hcrc = 0;
- /* true when done reading gzip header (not used when writing a gzip file) */
- this.done = false;
- }
-
- module.exports = GZheader;
- },{}],34:[function(_dereq_,module,exports){
- 'use strict';
-
- // See state defs from inflate.js
- var BAD = 30; /* got a data error -- remain here until reset */
- var TYPE = 12; /* i: waiting for type bits, including last-flag bit */
-
- /*
- Decode literal, length, and distance codes and write out the resulting
- literal and match bytes until either not enough input or output is
- available, an end-of-block is encountered, or a data error is encountered.
- When large enough input and output buffers are supplied to inflate(), for
- example, a 16K input buffer and a 64K output buffer, more than 95% of the
- inflate execution time is spent in this routine.
-
- Entry assumptions:
-
- state.mode === LEN
- strm.avail_in >= 6
- strm.avail_out >= 258
- start >= strm.avail_out
- state.bits < 8
-
- On return, state.mode is one of:
-
- LEN -- ran out of enough output space or enough available input
- TYPE -- reached end of block code, inflate() to interpret next block
- BAD -- error in block data
-
- Notes:
-
- - The maximum input bits used by a length/distance pair is 15 bits for the
- length code, 5 bits for the length extra, 15 bits for the distance code,
- and 13 bits for the distance extra. This totals 48 bits, or six bytes.
- Therefore if strm.avail_in >= 6, then there is enough input to avoid
- checking for available input while decoding.
-
- - The maximum bytes that a single length/distance pair can output is 258
- bytes, which is the maximum length that can be coded. inflate_fast()
- requires strm.avail_out >= 258 for each loop to avoid checking for
- output space.
- */
- module.exports = function inflate_fast(strm, start) {
- var state;
- var _in; /* local strm.input */
- var last; /* have enough input while in < last */
- var _out; /* local strm.output */
- var beg; /* inflate()'s initial strm.output */
- var end; /* while out < end, enough space available */
- //#ifdef INFLATE_STRICT
- var dmax; /* maximum distance from zlib header */
- //#endif
- var wsize; /* window size or zero if not using window */
- var whave; /* valid bytes in the window */
- var wnext; /* window write index */
- var window; /* allocated sliding window, if wsize != 0 */
- var hold; /* local strm.hold */
- var bits; /* local strm.bits */
- var lcode; /* local strm.lencode */
- var dcode; /* local strm.distcode */
- var lmask; /* mask for first level of length codes */
- var dmask; /* mask for first level of distance codes */
- var here; /* retrieved table entry */
- var op; /* code bits, operation, extra bits, or */
- /* window position, window bytes to copy */
- var len; /* match length, unused bytes */
- var dist; /* match distance */
- var from; /* where to copy match from */
- var from_source;
-
-
- var input, output; // JS specific, because we have no pointers
-
- /* copy state to local variables */
- state = strm.state;
- //here = state.here;
- _in = strm.next_in;
- input = strm.input;
- last = _in + (strm.avail_in - 5);
- _out = strm.next_out;
- output = strm.output;
- beg = _out - (start - strm.avail_out);
- end = _out + (strm.avail_out - 257);
- //#ifdef INFLATE_STRICT
- dmax = state.dmax;
- //#endif
- wsize = state.wsize;
- whave = state.whave;
- wnext = state.wnext;
- window = state.window;
- hold = state.hold;
- bits = state.bits;
- lcode = state.lencode;
- dcode = state.distcode;
- lmask = (1 << state.lenbits) - 1;
- dmask = (1 << state.distbits) - 1;
-
-
- /* decode literals and length/distances until end-of-block or not enough
- input data or output space */
-
- top:
- do {
- if (bits < 15) {
- hold += input[_in++] << bits;
- bits += 8;
- hold += input[_in++] << bits;
- bits += 8;
- }
-
- here = lcode[hold & lmask];
-
- dolen:
- for (;;) { // Goto emulation
- op = here >>> 24/*here.bits*/;
- hold >>>= op;
- bits -= op;
- op = (here >>> 16) & 0xff/*here.op*/;
- if (op === 0) { /* literal */
- //Tracevv((stderr, here.val >= 0x20 && here.val < 0x7f ?
- // "inflate: literal '%c'\n" :
- // "inflate: literal 0x%02x\n", here.val));
- output[_out++] = here & 0xffff/*here.val*/;
- }
- else if (op & 16) { /* length base */
- len = here & 0xffff/*here.val*/;
- op &= 15; /* number of extra bits */
- if (op) {
- if (bits < op) {
- hold += input[_in++] << bits;
- bits += 8;
- }
- len += hold & ((1 << op) - 1);
- hold >>>= op;
- bits -= op;
- }
- //Tracevv((stderr, "inflate: length %u\n", len));
- if (bits < 15) {
- hold += input[_in++] << bits;
- bits += 8;
- hold += input[_in++] << bits;
- bits += 8;
- }
- here = dcode[hold & dmask];
-
- dodist:
- for (;;) { // goto emulation
- op = here >>> 24/*here.bits*/;
- hold >>>= op;
- bits -= op;
- op = (here >>> 16) & 0xff/*here.op*/;
-
- if (op & 16) { /* distance base */
- dist = here & 0xffff/*here.val*/;
- op &= 15; /* number of extra bits */
- if (bits < op) {
- hold += input[_in++] << bits;
- bits += 8;
- if (bits < op) {
- hold += input[_in++] << bits;
- bits += 8;
- }
- }
- dist += hold & ((1 << op) - 1);
- //#ifdef INFLATE_STRICT
- if (dist > dmax) {
- strm.msg = 'invalid distance too far back';
- state.mode = BAD;
- break top;
- }
- //#endif
- hold >>>= op;
- bits -= op;
- //Tracevv((stderr, "inflate: distance %u\n", dist));
- op = _out - beg; /* max distance in output */
- if (dist > op) { /* see if copy from window */
- op = dist - op; /* distance back in window */
- if (op > whave) {
- if (state.sane) {
- strm.msg = 'invalid distance too far back';
- state.mode = BAD;
- break top;
- }
-
- // (!) This block is disabled in zlib defailts,
- // don't enable it for binary compatibility
- //#ifdef INFLATE_ALLOW_INVALID_DISTANCE_TOOFAR_ARRR
- // if (len <= op - whave) {
- // do {
- // output[_out++] = 0;
- // } while (--len);
- // continue top;
- // }
- // len -= op - whave;
- // do {
- // output[_out++] = 0;
- // } while (--op > whave);
- // if (op === 0) {
- // from = _out - dist;
- // do {
- // output[_out++] = output[from++];
- // } while (--len);
- // continue top;
- // }
- //#endif
- }
- from = 0; // window index
- from_source = window;
- if (wnext === 0) { /* very common case */
- from += wsize - op;
- if (op < len) { /* some from window */
- len -= op;
- do {
- output[_out++] = window[from++];
- } while (--op);
- from = _out - dist; /* rest from output */
- from_source = output;
- }
- }
- else if (wnext < op) { /* wrap around window */
- from += wsize + wnext - op;
- op -= wnext;
- if (op < len) { /* some from end of window */
- len -= op;
- do {
- output[_out++] = window[from++];
- } while (--op);
- from = 0;
- if (wnext < len) { /* some from start of window */
- op = wnext;
- len -= op;
- do {
- output[_out++] = window[from++];
- } while (--op);
- from = _out - dist; /* rest from output */
- from_source = output;
- }
- }
- }
- else { /* contiguous in window */
- from += wnext - op;
- if (op < len) { /* some from window */
- len -= op;
- do {
- output[_out++] = window[from++];
- } while (--op);
- from = _out - dist; /* rest from output */
- from_source = output;
- }
- }
- while (len > 2) {
- output[_out++] = from_source[from++];
- output[_out++] = from_source[from++];
- output[_out++] = from_source[from++];
- len -= 3;
- }
- if (len) {
- output[_out++] = from_source[from++];
- if (len > 1) {
- output[_out++] = from_source[from++];
- }
- }
- }
- else {
- from = _out - dist; /* copy direct from output */
- do { /* minimum length is three */
- output[_out++] = output[from++];
- output[_out++] = output[from++];
- output[_out++] = output[from++];
- len -= 3;
- } while (len > 2);
- if (len) {
- output[_out++] = output[from++];
- if (len > 1) {
- output[_out++] = output[from++];
- }
- }
- }
- }
- else if ((op & 64) === 0) { /* 2nd level distance code */
- here = dcode[(here & 0xffff)/*here.val*/ + (hold & ((1 << op) - 1))];
- continue dodist;
- }
- else {
- strm.msg = 'invalid distance code';
- state.mode = BAD;
- break top;
- }
-
- break; // need to emulate goto via "continue"
- }
- }
- else if ((op & 64) === 0) { /* 2nd level length code */
- here = lcode[(here & 0xffff)/*here.val*/ + (hold & ((1 << op) - 1))];
- continue dolen;
- }
- else if (op & 32) { /* end-of-block */
- //Tracevv((stderr, "inflate: end of block\n"));
- state.mode = TYPE;
- break top;
- }
- else {
- strm.msg = 'invalid literal/length code';
- state.mode = BAD;
- break top;
- }
-
- break; // need to emulate goto via "continue"
- }
- } while (_in < last && _out < end);
-
- /* return unused bytes (on entry, bits < 8, so in won't go too far back) */
- len = bits >> 3;
- _in -= len;
- bits -= len << 3;
- hold &= (1 << bits) - 1;
-
- /* update state and return */
- strm.next_in = _in;
- strm.next_out = _out;
- strm.avail_in = (_in < last ? 5 + (last - _in) : 5 - (_in - last));
- strm.avail_out = (_out < end ? 257 + (end - _out) : 257 - (_out - end));
- state.hold = hold;
- state.bits = bits;
- return;
- };
-
- },{}],35:[function(_dereq_,module,exports){
- 'use strict';
-
-
- var utils = _dereq_('../utils/common');
- var adler32 = _dereq_('./adler32');
- var crc32 = _dereq_('./crc32');
- var inflate_fast = _dereq_('./inffast');
- var inflate_table = _dereq_('./inftrees');
-
- var CODES = 0;
- var LENS = 1;
- var DISTS = 2;
-
- /* Public constants ==========================================================*/
- /* ===========================================================================*/
-
-
- /* Allowed flush values; see deflate() and inflate() below for details */
- //var Z_NO_FLUSH = 0;
- //var Z_PARTIAL_FLUSH = 1;
- //var Z_SYNC_FLUSH = 2;
- //var Z_FULL_FLUSH = 3;
- var Z_FINISH = 4;
- var Z_BLOCK = 5;
- var Z_TREES = 6;
-
-
- /* Return codes for the compression/decompression functions. Negative values
- * are errors, positive values are used for special but normal events.
- */
- var Z_OK = 0;
- var Z_STREAM_END = 1;
- var Z_NEED_DICT = 2;
- //var Z_ERRNO = -1;
- var Z_STREAM_ERROR = -2;
- var Z_DATA_ERROR = -3;
- var Z_MEM_ERROR = -4;
- var Z_BUF_ERROR = -5;
- //var Z_VERSION_ERROR = -6;
-
- /* The deflate compression method */
- var Z_DEFLATED = 8;
-
-
- /* STATES ====================================================================*/
- /* ===========================================================================*/
-
-
- var HEAD = 1; /* i: waiting for magic header */
- var FLAGS = 2; /* i: waiting for method and flags (gzip) */
- var TIME = 3; /* i: waiting for modification time (gzip) */
- var OS = 4; /* i: waiting for extra flags and operating system (gzip) */
- var EXLEN = 5; /* i: waiting for extra length (gzip) */
- var EXTRA = 6; /* i: waiting for extra bytes (gzip) */
- var NAME = 7; /* i: waiting for end of file name (gzip) */
- var COMMENT = 8; /* i: waiting for end of comment (gzip) */
- var HCRC = 9; /* i: waiting for header crc (gzip) */
- var DICTID = 10; /* i: waiting for dictionary check value */
- var DICT = 11; /* waiting for inflateSetDictionary() call */
- var TYPE = 12; /* i: waiting for type bits, including last-flag bit */
- var TYPEDO = 13; /* i: same, but skip check to exit inflate on new block */
- var STORED = 14; /* i: waiting for stored size (length and complement) */
- var COPY_ = 15; /* i/o: same as COPY below, but only first time in */
- var COPY = 16; /* i/o: waiting for input or output to copy stored block */
- var TABLE = 17; /* i: waiting for dynamic block table lengths */
- var LENLENS = 18; /* i: waiting for code length code lengths */
- var CODELENS = 19; /* i: waiting for length/lit and distance code lengths */
- var LEN_ = 20; /* i: same as LEN below, but only first time in */
- var LEN = 21; /* i: waiting for length/lit/eob code */
- var LENEXT = 22; /* i: waiting for length extra bits */
- var DIST = 23; /* i: waiting for distance code */
- var DISTEXT = 24; /* i: waiting for distance extra bits */
- var MATCH = 25; /* o: waiting for output space to copy string */
- var LIT = 26; /* o: waiting for output space to write literal */
- var CHECK = 27; /* i: waiting for 32-bit check value */
- var LENGTH = 28; /* i: waiting for 32-bit length (gzip) */
- var DONE = 29; /* finished check, done -- remain here until reset */
- var BAD = 30; /* got a data error -- remain here until reset */
- var MEM = 31; /* got an inflate() memory error -- remain here until reset */
- var SYNC = 32; /* looking for synchronization bytes to restart inflate() */
-
- /* ===========================================================================*/
-
-
-
- var ENOUGH_LENS = 852;
- var ENOUGH_DISTS = 592;
- //var ENOUGH = (ENOUGH_LENS+ENOUGH_DISTS);
-
- var MAX_WBITS = 15;
- /* 32K LZ77 window */
- var DEF_WBITS = MAX_WBITS;
-
-
- function ZSWAP32(q) {
- return (((q >>> 24) & 0xff) +
- ((q >>> 8) & 0xff00) +
- ((q & 0xff00) << 8) +
- ((q & 0xff) << 24));
- }
-
-
- function InflateState() {
- this.mode = 0; /* current inflate mode */
- this.last = false; /* true if processing last block */
- this.wrap = 0; /* bit 0 true for zlib, bit 1 true for gzip */
- this.havedict = false; /* true if dictionary provided */
- this.flags = 0; /* gzip header method and flags (0 if zlib) */
- this.dmax = 0; /* zlib header max distance (INFLATE_STRICT) */
- this.check = 0; /* protected copy of check value */
- this.total = 0; /* protected copy of output count */
- // TODO: may be {}
- this.head = null; /* where to save gzip header information */
-
- /* sliding window */
- this.wbits = 0; /* log base 2 of requested window size */
- this.wsize = 0; /* window size or zero if not using window */
- this.whave = 0; /* valid bytes in the window */
- this.wnext = 0; /* window write index */
- this.window = null; /* allocated sliding window, if needed */
-
- /* bit accumulator */
- this.hold = 0; /* input bit accumulator */
- this.bits = 0; /* number of bits in "in" */
-
- /* for string and stored block copying */
- this.length = 0; /* literal or length of data to copy */
- this.offset = 0; /* distance back to copy string from */
-
- /* for table and code decoding */
- this.extra = 0; /* extra bits needed */
-
- /* fixed and dynamic code tables */
- this.lencode = null; /* starting table for length/literal codes */
- this.distcode = null; /* starting table for distance codes */
- this.lenbits = 0; /* index bits for lencode */
- this.distbits = 0; /* index bits for distcode */
-
- /* dynamic table building */
- this.ncode = 0; /* number of code length code lengths */
- this.nlen = 0; /* number of length code lengths */
- this.ndist = 0; /* number of distance code lengths */
- this.have = 0; /* number of code lengths in lens[] */
- this.next = null; /* next available space in codes[] */
-
- this.lens = new utils.Buf16(320); /* temporary storage for code lengths */
- this.work = new utils.Buf16(288); /* work area for code table building */
-
- /*
- because we don't have pointers in js, we use lencode and distcode directly
- as buffers so we don't need codes
- */
- //this.codes = new utils.Buf32(ENOUGH); /* space for code tables */
- this.lendyn = null; /* dynamic table for length/literal codes (JS specific) */
- this.distdyn = null; /* dynamic table for distance codes (JS specific) */
- this.sane = 0; /* if false, allow invalid distance too far */
- this.back = 0; /* bits back of last unprocessed length/lit */
- this.was = 0; /* initial length of match */
- }
-
- function inflateResetKeep(strm) {
- var state;
-
- if (!strm || !strm.state) { return Z_STREAM_ERROR; }
- state = strm.state;
- strm.total_in = strm.total_out = state.total = 0;
- strm.msg = ''; /*Z_NULL*/
- if (state.wrap) { /* to support ill-conceived Java test suite */
- strm.adler = state.wrap & 1;
- }
- state.mode = HEAD;
- state.last = 0;
- state.havedict = 0;
- state.dmax = 32768;
- state.head = null/*Z_NULL*/;
- state.hold = 0;
- state.bits = 0;
- //state.lencode = state.distcode = state.next = state.codes;
- state.lencode = state.lendyn = new utils.Buf32(ENOUGH_LENS);
- state.distcode = state.distdyn = new utils.Buf32(ENOUGH_DISTS);
-
- state.sane = 1;
- state.back = -1;
- //Tracev((stderr, "inflate: reset\n"));
- return Z_OK;
- }
-
- function inflateReset(strm) {
- var state;
-
- if (!strm || !strm.state) { return Z_STREAM_ERROR; }
- state = strm.state;
- state.wsize = 0;
- state.whave = 0;
- state.wnext = 0;
- return inflateResetKeep(strm);
-
- }
-
- function inflateReset2(strm, windowBits) {
- var wrap;
- var state;
-
- /* get the state */
- if (!strm || !strm.state) { return Z_STREAM_ERROR; }
- state = strm.state;
-
- /* extract wrap request from windowBits parameter */
- if (windowBits < 0) {
- wrap = 0;
- windowBits = -windowBits;
- }
- else {
- wrap = (windowBits >> 4) + 1;
- if (windowBits < 48) {
- windowBits &= 15;
- }
- }
-
- /* set number of window bits, free window if different */
- if (windowBits && (windowBits < 8 || windowBits > 15)) {
- return Z_STREAM_ERROR;
- }
- if (state.window !== null && state.wbits !== windowBits) {
- state.window = null;
- }
-
- /* update state and reset the rest of it */
- state.wrap = wrap;
- state.wbits = windowBits;
- return inflateReset(strm);
- }
-
- function inflateInit2(strm, windowBits) {
- var ret;
- var state;
-
- if (!strm) { return Z_STREAM_ERROR; }
- //strm.msg = Z_NULL; /* in case we return an error */
-
- state = new InflateState();
-
- //if (state === Z_NULL) return Z_MEM_ERROR;
- //Tracev((stderr, "inflate: allocated\n"));
- strm.state = state;
- state.window = null/*Z_NULL*/;
- ret = inflateReset2(strm, windowBits);
- if (ret !== Z_OK) {
- strm.state = null/*Z_NULL*/;
- }
- return ret;
- }
-
- function inflateInit(strm) {
- return inflateInit2(strm, DEF_WBITS);
- }
-
-
- /*
- Return state with length and distance decoding tables and index sizes set to
- fixed code decoding. Normally this returns fixed tables from inffixed.h.
- If BUILDFIXED is defined, then instead this routine builds the tables the
- first time it's called, and returns those tables the first time and
- thereafter. This reduces the size of the code by about 2K bytes, in
- exchange for a little execution time. However, BUILDFIXED should not be
- used for threaded applications, since the rewriting of the tables and virgin
- may not be thread-safe.
- */
- var virgin = true;
-
- var lenfix, distfix; // We have no pointers in JS, so keep tables separate
-
- function fixedtables(state) {
- /* build fixed huffman tables if first call (may not be thread safe) */
- if (virgin) {
- var sym;
-
- lenfix = new utils.Buf32(512);
- distfix = new utils.Buf32(32);
-
- /* literal/length table */
- sym = 0;
- while (sym < 144) { state.lens[sym++] = 8; }
- while (sym < 256) { state.lens[sym++] = 9; }
- while (sym < 280) { state.lens[sym++] = 7; }
- while (sym < 288) { state.lens[sym++] = 8; }
-
- inflate_table(LENS, state.lens, 0, 288, lenfix, 0, state.work, {bits: 9});
-
- /* distance table */
- sym = 0;
- while (sym < 32) { state.lens[sym++] = 5; }
-
- inflate_table(DISTS, state.lens, 0, 32, distfix, 0, state.work, {bits: 5});
-
- /* do this just once */
- virgin = false;
- }
-
- state.lencode = lenfix;
- state.lenbits = 9;
- state.distcode = distfix;
- state.distbits = 5;
- }
-
-
- /*
- Update the window with the last wsize (normally 32K) bytes written before
- returning. If window does not exist yet, create it. This is only called
- when a window is already in use, or when output has been written during this
- inflate call, but the end of the deflate stream has not been reached yet.
- It is also called to create a window for dictionary data when a dictionary
- is loaded.
-
- Providing output buffers larger than 32K to inflate() should provide a speed
- advantage, since only the last 32K of output is copied to the sliding window
- upon return from inflate(), and since all distances after the first 32K of
- output will fall in the output data, making match copies simpler and faster.
- The advantage may be dependent on the size of the processor's data caches.
- */
- function updatewindow(strm, src, end, copy) {
- var dist;
- var state = strm.state;
-
- /* if it hasn't been done already, allocate space for the window */
- if (state.window === null) {
- state.wsize = 1 << state.wbits;
- state.wnext = 0;
- state.whave = 0;
-
- state.window = new utils.Buf8(state.wsize);
- }
-
- /* copy state->wsize or less output bytes into the circular window */
- if (copy >= state.wsize) {
- utils.arraySet(state.window,src, end - state.wsize, state.wsize, 0);
- state.wnext = 0;
- state.whave = state.wsize;
- }
- else {
- dist = state.wsize - state.wnext;
- if (dist > copy) {
- dist = copy;
- }
- //zmemcpy(state->window + state->wnext, end - copy, dist);
- utils.arraySet(state.window,src, end - copy, dist, state.wnext);
- copy -= dist;
- if (copy) {
- //zmemcpy(state->window, end - copy, copy);
- utils.arraySet(state.window,src, end - copy, copy, 0);
- state.wnext = copy;
- state.whave = state.wsize;
- }
- else {
- state.wnext += dist;
- if (state.wnext === state.wsize) { state.wnext = 0; }
- if (state.whave < state.wsize) { state.whave += dist; }
- }
- }
- return 0;
- }
-
- function inflate(strm, flush) {
- var state;
- var input, output; // input/output buffers
- var next; /* next input INDEX */
- var put; /* next output INDEX */
- var have, left; /* available input and output */
- var hold; /* bit buffer */
- var bits; /* bits in bit buffer */
- var _in, _out; /* save starting available input and output */
- var copy; /* number of stored or match bytes to copy */
- var from; /* where to copy match bytes from */
- var from_source;
- var here = 0; /* current decoding table entry */
- var here_bits, here_op, here_val; // paked "here" denormalized (JS specific)
- //var last; /* parent table entry */
- var last_bits, last_op, last_val; // paked "last" denormalized (JS specific)
- var len; /* length to copy for repeats, bits to drop */
- var ret; /* return code */
- var hbuf = new utils.Buf8(4); /* buffer for gzip header crc calculation */
- var opts;
-
- var n; // temporary var for NEED_BITS
-
- var order = /* permutation of code lengths */
- [16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15];
-
-
- if (!strm || !strm.state || !strm.output ||
- (!strm.input && strm.avail_in !== 0)) {
- return Z_STREAM_ERROR;
- }
-
- state = strm.state;
- if (state.mode === TYPE) { state.mode = TYPEDO; } /* skip check */
-
-
- //--- LOAD() ---
- put = strm.next_out;
- output = strm.output;
- left = strm.avail_out;
- next = strm.next_in;
- input = strm.input;
- have = strm.avail_in;
- hold = state.hold;
- bits = state.bits;
- //---
-
- _in = have;
- _out = left;
- ret = Z_OK;
-
- inf_leave: // goto emulation
- for (;;) {
- switch (state.mode) {
- case HEAD:
- if (state.wrap === 0) {
- state.mode = TYPEDO;
- break;
- }
- //=== NEEDBITS(16);
- while (bits < 16) {
- if (have === 0) { break inf_leave; }
- have--;
- hold += input[next++] << bits;
- bits += 8;
- }
- //===//
- if ((state.wrap & 2) && hold === 0x8b1f) { /* gzip header */
- state.check = 0/*crc32(0L, Z_NULL, 0)*/;
- //=== CRC2(state.check, hold);
- hbuf[0] = hold & 0xff;
- hbuf[1] = (hold >>> 8) & 0xff;
- state.check = crc32(state.check, hbuf, 2, 0);
- //===//
-
- //=== INITBITS();
- hold = 0;
- bits = 0;
- //===//
- state.mode = FLAGS;
- break;
- }
- state.flags = 0; /* expect zlib header */
- if (state.head) {
- state.head.done = false;
- }
- if (!(state.wrap & 1) || /* check if zlib header allowed */
- (((hold & 0xff)/*BITS(8)*/ << 8) + (hold >> 8)) % 31) {
- strm.msg = 'incorrect header check';
- state.mode = BAD;
- break;
- }
- if ((hold & 0x0f)/*BITS(4)*/ !== Z_DEFLATED) {
- strm.msg = 'unknown compression method';
- state.mode = BAD;
- break;
- }
- //--- DROPBITS(4) ---//
- hold >>>= 4;
- bits -= 4;
- //---//
- len = (hold & 0x0f)/*BITS(4)*/ + 8;
- if (state.wbits === 0) {
- state.wbits = len;
- }
- else if (len > state.wbits) {
- strm.msg = 'invalid window size';
- state.mode = BAD;
- break;
- }
- state.dmax = 1 << len;
- //Tracev((stderr, "inflate: zlib header ok\n"));
- strm.adler = state.check = 1/*adler32(0L, Z_NULL, 0)*/;
- state.mode = hold & 0x200 ? DICTID : TYPE;
- //=== INITBITS();
- hold = 0;
- bits = 0;
- //===//
- break;
- case FLAGS:
- //=== NEEDBITS(16); */
- while (bits < 16) {
- if (have === 0) { break inf_leave; }
- have--;
- hold += input[next++] << bits;
- bits += 8;
- }
- //===//
- state.flags = hold;
- if ((state.flags & 0xff) !== Z_DEFLATED) {
- strm.msg = 'unknown compression method';
- state.mode = BAD;
- break;
- }
- if (state.flags & 0xe000) {
- strm.msg = 'unknown header flags set';
- state.mode = BAD;
- break;
- }
- if (state.head) {
- state.head.text = ((hold >> 8) & 1);
- }
- if (state.flags & 0x0200) {
- //=== CRC2(state.check, hold);
- hbuf[0] = hold & 0xff;
- hbuf[1] = (hold >>> 8) & 0xff;
- state.check = crc32(state.check, hbuf, 2, 0);
- //===//
- }
- //=== INITBITS();
- hold = 0;
- bits = 0;
- //===//
- state.mode = TIME;
- /* falls through */
- case TIME:
- //=== NEEDBITS(32); */
- while (bits < 32) {
- if (have === 0) { break inf_leave; }
- have--;
- hold += input[next++] << bits;
- bits += 8;
- }
- //===//
- if (state.head) {
- state.head.time = hold;
- }
- if (state.flags & 0x0200) {
- //=== CRC4(state.check, hold)
- hbuf[0] = hold & 0xff;
- hbuf[1] = (hold >>> 8) & 0xff;
- hbuf[2] = (hold >>> 16) & 0xff;
- hbuf[3] = (hold >>> 24) & 0xff;
- state.check = crc32(state.check, hbuf, 4, 0);
- //===
- }
- //=== INITBITS();
- hold = 0;
- bits = 0;
- //===//
- state.mode = OS;
- /* falls through */
- case OS:
- //=== NEEDBITS(16); */
- while (bits < 16) {
- if (have === 0) { break inf_leave; }
- have--;
- hold += input[next++] << bits;
- bits += 8;
- }
- //===//
- if (state.head) {
- state.head.xflags = (hold & 0xff);
- state.head.os = (hold >> 8);
- }
- if (state.flags & 0x0200) {
- //=== CRC2(state.check, hold);
- hbuf[0] = hold & 0xff;
- hbuf[1] = (hold >>> 8) & 0xff;
- state.check = crc32(state.check, hbuf, 2, 0);
- //===//
- }
- //=== INITBITS();
- hold = 0;
- bits = 0;
- //===//
- state.mode = EXLEN;
- /* falls through */
- case EXLEN:
- if (state.flags & 0x0400) {
- //=== NEEDBITS(16); */
- while (bits < 16) {
- if (have === 0) { break inf_leave; }
- have--;
- hold += input[next++] << bits;
- bits += 8;
- }
- //===//
- state.length = hold;
- if (state.head) {
- state.head.extra_len = hold;
- }
- if (state.flags & 0x0200) {
- //=== CRC2(state.check, hold);
- hbuf[0] = hold & 0xff;
- hbuf[1] = (hold >>> 8) & 0xff;
- state.check = crc32(state.check, hbuf, 2, 0);
- //===//
- }
- //=== INITBITS();
- hold = 0;
- bits = 0;
- //===//
- }
- else if (state.head) {
- state.head.extra = null/*Z_NULL*/;
- }
- state.mode = EXTRA;
- /* falls through */
- case EXTRA:
- if (state.flags & 0x0400) {
- copy = state.length;
- if (copy > have) { copy = have; }
- if (copy) {
- if (state.head) {
- len = state.head.extra_len - state.length;
- if (!state.head.extra) {
- // Use untyped array for more conveniend processing later
- state.head.extra = new Array(state.head.extra_len);
- }
- utils.arraySet(
- state.head.extra,
- input,
- next,
- // extra field is limited to 65536 bytes
- // - no need for additional size check
- copy,
- /*len + copy > state.head.extra_max - len ? state.head.extra_max : copy,*/
- len
- );
- //zmemcpy(state.head.extra + len, next,
- // len + copy > state.head.extra_max ?
- // state.head.extra_max - len : copy);
- }
- if (state.flags & 0x0200) {
- state.check = crc32(state.check, input, copy, next);
- }
- have -= copy;
- next += copy;
- state.length -= copy;
- }
- if (state.length) { break inf_leave; }
- }
- state.length = 0;
- state.mode = NAME;
- /* falls through */
- case NAME:
- if (state.flags & 0x0800) {
- if (have === 0) { break inf_leave; }
- copy = 0;
- do {
- // TODO: 2 or 1 bytes?
- len = input[next + copy++];
- /* use constant limit because in js we should not preallocate memory */
- if (state.head && len &&
- (state.length < 65536 /*state.head.name_max*/)) {
- state.head.name += String.fromCharCode(len);
- }
- } while (len && copy < have);
-
- if (state.flags & 0x0200) {
- state.check = crc32(state.check, input, copy, next);
- }
- have -= copy;
- next += copy;
- if (len) { break inf_leave; }
- }
- else if (state.head) {
- state.head.name = null;
- }
- state.length = 0;
- state.mode = COMMENT;
- /* falls through */
- case COMMENT:
- if (state.flags & 0x1000) {
- if (have === 0) { break inf_leave; }
- copy = 0;
- do {
- len = input[next + copy++];
- /* use constant limit because in js we should not preallocate memory */
- if (state.head && len &&
- (state.length < 65536 /*state.head.comm_max*/)) {
- state.head.comment += String.fromCharCode(len);
- }
- } while (len && copy < have);
- if (state.flags & 0x0200) {
- state.check = crc32(state.check, input, copy, next);
- }
- have -= copy;
- next += copy;
- if (len) { break inf_leave; }
- }
- else if (state.head) {
- state.head.comment = null;
- }
- state.mode = HCRC;
- /* falls through */
- case HCRC:
- if (state.flags & 0x0200) {
- //=== NEEDBITS(16); */
- while (bits < 16) {
- if (have === 0) { break inf_leave; }
- have--;
- hold += input[next++] << bits;
- bits += 8;
- }
- //===//
- if (hold !== (state.check & 0xffff)) {
- strm.msg = 'header crc mismatch';
- state.mode = BAD;
- break;
- }
- //=== INITBITS();
- hold = 0;
- bits = 0;
- //===//
- }
- if (state.head) {
- state.head.hcrc = ((state.flags >> 9) & 1);
- state.head.done = true;
- }
- strm.adler = state.check = 0 /*crc32(0L, Z_NULL, 0)*/;
- state.mode = TYPE;
- break;
- case DICTID:
- //=== NEEDBITS(32); */
- while (bits < 32) {
- if (have === 0) { break inf_leave; }
- have--;
- hold += input[next++] << bits;
- bits += 8;
- }
- //===//
- strm.adler = state.check = ZSWAP32(hold);
- //=== INITBITS();
- hold = 0;
- bits = 0;
- //===//
- state.mode = DICT;
- /* falls through */
- case DICT:
- if (state.havedict === 0) {
- //--- RESTORE() ---
- strm.next_out = put;
- strm.avail_out = left;
- strm.next_in = next;
- strm.avail_in = have;
- state.hold = hold;
- state.bits = bits;
- //---
- return Z_NEED_DICT;
- }
- strm.adler = state.check = 1/*adler32(0L, Z_NULL, 0)*/;
- state.mode = TYPE;
- /* falls through */
- case TYPE:
- if (flush === Z_BLOCK || flush === Z_TREES) { break inf_leave; }
- /* falls through */
- case TYPEDO:
- if (state.last) {
- //--- BYTEBITS() ---//
- hold >>>= bits & 7;
- bits -= bits & 7;
- //---//
- state.mode = CHECK;
- break;
- }
- //=== NEEDBITS(3); */
- while (bits < 3) {
- if (have === 0) { break inf_leave; }
- have--;
- hold += input[next++] << bits;
- bits += 8;
- }
- //===//
- state.last = (hold & 0x01)/*BITS(1)*/;
- //--- DROPBITS(1) ---//
- hold >>>= 1;
- bits -= 1;
- //---//
-
- switch ((hold & 0x03)/*BITS(2)*/) {
- case 0: /* stored block */
- //Tracev((stderr, "inflate: stored block%s\n",
- // state.last ? " (last)" : ""));
- state.mode = STORED;
- break;
- case 1: /* fixed block */
- fixedtables(state);
- //Tracev((stderr, "inflate: fixed codes block%s\n",
- // state.last ? " (last)" : ""));
- state.mode = LEN_; /* decode codes */
- if (flush === Z_TREES) {
- //--- DROPBITS(2) ---//
- hold >>>= 2;
- bits -= 2;
- //---//
- break inf_leave;
- }
- break;
- case 2: /* dynamic block */
- //Tracev((stderr, "inflate: dynamic codes block%s\n",
- // state.last ? " (last)" : ""));
- state.mode = TABLE;
- break;
- case 3:
- strm.msg = 'invalid block type';
- state.mode = BAD;
- }
- //--- DROPBITS(2) ---//
- hold >>>= 2;
- bits -= 2;
- //---//
- break;
- case STORED:
- //--- BYTEBITS() ---// /* go to byte boundary */
- hold >>>= bits & 7;
- bits -= bits & 7;
- //---//
- //=== NEEDBITS(32); */
- while (bits < 32) {
- if (have === 0) { break inf_leave; }
- have--;
- hold += input[next++] << bits;
- bits += 8;
- }
- //===//
- if ((hold & 0xffff) !== ((hold >>> 16) ^ 0xffff)) {
- strm.msg = 'invalid stored block lengths';
- state.mode = BAD;
- break;
- }
- state.length = hold & 0xffff;
- //Tracev((stderr, "inflate: stored length %u\n",
- // state.length));
- //=== INITBITS();
- hold = 0;
- bits = 0;
- //===//
- state.mode = COPY_;
- if (flush === Z_TREES) { break inf_leave; }
- /* falls through */
- case COPY_:
- state.mode = COPY;
- /* falls through */
- case COPY:
- copy = state.length;
- if (copy) {
- if (copy > have) { copy = have; }
- if (copy > left) { copy = left; }
- if (copy === 0) { break inf_leave; }
- //--- zmemcpy(put, next, copy); ---
- utils.arraySet(output, input, next, copy, put);
- //---//
- have -= copy;
- next += copy;
- left -= copy;
- put += copy;
- state.length -= copy;
- break;
- }
- //Tracev((stderr, "inflate: stored end\n"));
- state.mode = TYPE;
- break;
- case TABLE:
- //=== NEEDBITS(14); */
- while (bits < 14) {
- if (have === 0) { break inf_leave; }
- have--;
- hold += input[next++] << bits;
- bits += 8;
- }
- //===//
- state.nlen = (hold & 0x1f)/*BITS(5)*/ + 257;
- //--- DROPBITS(5) ---//
- hold >>>= 5;
- bits -= 5;
- //---//
- state.ndist = (hold & 0x1f)/*BITS(5)*/ + 1;
- //--- DROPBITS(5) ---//
- hold >>>= 5;
- bits -= 5;
- //---//
- state.ncode = (hold & 0x0f)/*BITS(4)*/ + 4;
- //--- DROPBITS(4) ---//
- hold >>>= 4;
- bits -= 4;
- //---//
- //#ifndef PKZIP_BUG_WORKAROUND
- if (state.nlen > 286 || state.ndist > 30) {
- strm.msg = 'too many length or distance symbols';
- state.mode = BAD;
- break;
- }
- //#endif
- //Tracev((stderr, "inflate: table sizes ok\n"));
- state.have = 0;
- state.mode = LENLENS;
- /* falls through */
- case LENLENS:
- while (state.have < state.ncode) {
- //=== NEEDBITS(3);
- while (bits < 3) {
- if (have === 0) { break inf_leave; }
- have--;
- hold += input[next++] << bits;
- bits += 8;
- }
- //===//
- state.lens[order[state.have++]] = (hold & 0x07);//BITS(3);
- //--- DROPBITS(3) ---//
- hold >>>= 3;
- bits -= 3;
- //---//
- }
- while (state.have < 19) {
- state.lens[order[state.have++]] = 0;
- }
- // We have separate tables & no pointers. 2 commented lines below not needed.
- //state.next = state.codes;
- //state.lencode = state.next;
- // Switch to use dynamic table
- state.lencode = state.lendyn;
- state.lenbits = 7;
-
- opts = {bits: state.lenbits};
- ret = inflate_table(CODES, state.lens, 0, 19, state.lencode, 0, state.work, opts);
- state.lenbits = opts.bits;
-
- if (ret) {
- strm.msg = 'invalid code lengths set';
- state.mode = BAD;
- break;
- }
- //Tracev((stderr, "inflate: code lengths ok\n"));
- state.have = 0;
- state.mode = CODELENS;
- /* falls through */
- case CODELENS:
- while (state.have < state.nlen + state.ndist) {
- for (;;) {
- here = state.lencode[hold & ((1 << state.lenbits) - 1)];/*BITS(state.lenbits)*/
- here_bits = here >>> 24;
- here_op = (here >>> 16) & 0xff;
- here_val = here & 0xffff;
-
- if ((here_bits) <= bits) { break; }
- //--- PULLBYTE() ---//
- if (have === 0) { break inf_leave; }
- have--;
- hold += input[next++] << bits;
- bits += 8;
- //---//
- }
- if (here_val < 16) {
- //--- DROPBITS(here.bits) ---//
- hold >>>= here_bits;
- bits -= here_bits;
- //---//
- state.lens[state.have++] = here_val;
- }
- else {
- if (here_val === 16) {
- //=== NEEDBITS(here.bits + 2);
- n = here_bits + 2;
- while (bits < n) {
- if (have === 0) { break inf_leave; }
- have--;
- hold += input[next++] << bits;
- bits += 8;
- }
- //===//
- //--- DROPBITS(here.bits) ---//
- hold >>>= here_bits;
- bits -= here_bits;
- //---//
- if (state.have === 0) {
- strm.msg = 'invalid bit length repeat';
- state.mode = BAD;
- break;
- }
- len = state.lens[state.have - 1];
- copy = 3 + (hold & 0x03);//BITS(2);
- //--- DROPBITS(2) ---//
- hold >>>= 2;
- bits -= 2;
- //---//
- }
- else if (here_val === 17) {
- //=== NEEDBITS(here.bits + 3);
- n = here_bits + 3;
- while (bits < n) {
- if (have === 0) { break inf_leave; }
- have--;
- hold += input[next++] << bits;
- bits += 8;
- }
- //===//
- //--- DROPBITS(here.bits) ---//
- hold >>>= here_bits;
- bits -= here_bits;
- //---//
- len = 0;
- copy = 3 + (hold & 0x07);//BITS(3);
- //--- DROPBITS(3) ---//
- hold >>>= 3;
- bits -= 3;
- //---//
- }
- else {
- //=== NEEDBITS(here.bits + 7);
- n = here_bits + 7;
- while (bits < n) {
- if (have === 0) { break inf_leave; }
- have--;
- hold += input[next++] << bits;
- bits += 8;
- }
- //===//
- //--- DROPBITS(here.bits) ---//
- hold >>>= here_bits;
- bits -= here_bits;
- //---//
- len = 0;
- copy = 11 + (hold & 0x7f);//BITS(7);
- //--- DROPBITS(7) ---//
- hold >>>= 7;
- bits -= 7;
- //---//
- }
- if (state.have + copy > state.nlen + state.ndist) {
- strm.msg = 'invalid bit length repeat';
- state.mode = BAD;
- break;
- }
- while (copy--) {
- state.lens[state.have++] = len;
- }
- }
- }
-
- /* handle error breaks in while */
- if (state.mode === BAD) { break; }
-
- /* check for end-of-block code (better have one) */
- if (state.lens[256] === 0) {
- strm.msg = 'invalid code -- missing end-of-block';
- state.mode = BAD;
- break;
- }
-
- /* build code tables -- note: do not change the lenbits or distbits
- values here (9 and 6) without reading the comments in inftrees.h
- concerning the ENOUGH constants, which depend on those values */
- state.lenbits = 9;
-
- opts = {bits: state.lenbits};
- ret = inflate_table(LENS, state.lens, 0, state.nlen, state.lencode, 0, state.work, opts);
- // We have separate tables & no pointers. 2 commented lines below not needed.
- // state.next_index = opts.table_index;
- state.lenbits = opts.bits;
- // state.lencode = state.next;
-
- if (ret) {
- strm.msg = 'invalid literal/lengths set';
- state.mode = BAD;
- break;
- }
-
- state.distbits = 6;
- //state.distcode.copy(state.codes);
- // Switch to use dynamic table
- state.distcode = state.distdyn;
- opts = {bits: state.distbits};
- ret = inflate_table(DISTS, state.lens, state.nlen, state.ndist, state.distcode, 0, state.work, opts);
- // We have separate tables & no pointers. 2 commented lines below not needed.
- // state.next_index = opts.table_index;
- state.distbits = opts.bits;
- // state.distcode = state.next;
-
- if (ret) {
- strm.msg = 'invalid distances set';
- state.mode = BAD;
- break;
- }
- //Tracev((stderr, 'inflate: codes ok\n'));
- state.mode = LEN_;
- if (flush === Z_TREES) { break inf_leave; }
- /* falls through */
- case LEN_:
- state.mode = LEN;
- /* falls through */
- case LEN:
- if (have >= 6 && left >= 258) {
- //--- RESTORE() ---
- strm.next_out = put;
- strm.avail_out = left;
- strm.next_in = next;
- strm.avail_in = have;
- state.hold = hold;
- state.bits = bits;
- //---
- inflate_fast(strm, _out);
- //--- LOAD() ---
- put = strm.next_out;
- output = strm.output;
- left = strm.avail_out;
- next = strm.next_in;
- input = strm.input;
- have = strm.avail_in;
- hold = state.hold;
- bits = state.bits;
- //---
-
- if (state.mode === TYPE) {
- state.back = -1;
- }
- break;
- }
- state.back = 0;
- for (;;) {
- here = state.lencode[hold & ((1 << state.lenbits) -1)]; /*BITS(state.lenbits)*/
- here_bits = here >>> 24;
- here_op = (here >>> 16) & 0xff;
- here_val = here & 0xffff;
-
- if (here_bits <= bits) { break; }
- //--- PULLBYTE() ---//
- if (have === 0) { break inf_leave; }
- have--;
- hold += input[next++] << bits;
- bits += 8;
- //---//
- }
- if (here_op && (here_op & 0xf0) === 0) {
- last_bits = here_bits;
- last_op = here_op;
- last_val = here_val;
- for (;;) {
- here = state.lencode[last_val +
- ((hold & ((1 << (last_bits + last_op)) -1))/*BITS(last.bits + last.op)*/ >> last_bits)];
- here_bits = here >>> 24;
- here_op = (here >>> 16) & 0xff;
- here_val = here & 0xffff;
-
- if ((last_bits + here_bits) <= bits) { break; }
- //--- PULLBYTE() ---//
- if (have === 0) { break inf_leave; }
- have--;
- hold += input[next++] << bits;
- bits += 8;
- //---//
- }
- //--- DROPBITS(last.bits) ---//
- hold >>>= last_bits;
- bits -= last_bits;
- //---//
- state.back += last_bits;
- }
- //--- DROPBITS(here.bits) ---//
- hold >>>= here_bits;
- bits -= here_bits;
- //---//
- state.back += here_bits;
- state.length = here_val;
- if (here_op === 0) {
- //Tracevv((stderr, here.val >= 0x20 && here.val < 0x7f ?
- // "inflate: literal '%c'\n" :
- // "inflate: literal 0x%02x\n", here.val));
- state.mode = LIT;
- break;
- }
- if (here_op & 32) {
- //Tracevv((stderr, "inflate: end of block\n"));
- state.back = -1;
- state.mode = TYPE;
- break;
- }
- if (here_op & 64) {
- strm.msg = 'invalid literal/length code';
- state.mode = BAD;
- break;
- }
- state.extra = here_op & 15;
- state.mode = LENEXT;
- /* falls through */
- case LENEXT:
- if (state.extra) {
- //=== NEEDBITS(state.extra);
- n = state.extra;
- while (bits < n) {
- if (have === 0) { break inf_leave; }
- have--;
- hold += input[next++] << bits;
- bits += 8;
- }
- //===//
- state.length += hold & ((1 << state.extra) -1)/*BITS(state.extra)*/;
- //--- DROPBITS(state.extra) ---//
- hold >>>= state.extra;
- bits -= state.extra;
- //---//
- state.back += state.extra;
- }
- //Tracevv((stderr, "inflate: length %u\n", state.length));
- state.was = state.length;
- state.mode = DIST;
- /* falls through */
- case DIST:
- for (;;) {
- here = state.distcode[hold & ((1 << state.distbits) -1)];/*BITS(state.distbits)*/
- here_bits = here >>> 24;
- here_op = (here >>> 16) & 0xff;
- here_val = here & 0xffff;
-
- if ((here_bits) <= bits) { break; }
- //--- PULLBYTE() ---//
- if (have === 0) { break inf_leave; }
- have--;
- hold += input[next++] << bits;
- bits += 8;
- //---//
- }
- if ((here_op & 0xf0) === 0) {
- last_bits = here_bits;
- last_op = here_op;
- last_val = here_val;
- for (;;) {
- here = state.distcode[last_val +
- ((hold & ((1 << (last_bits + last_op)) -1))/*BITS(last.bits + last.op)*/ >> last_bits)];
- here_bits = here >>> 24;
- here_op = (here >>> 16) & 0xff;
- here_val = here & 0xffff;
-
- if ((last_bits + here_bits) <= bits) { break; }
- //--- PULLBYTE() ---//
- if (have === 0) { break inf_leave; }
- have--;
- hold += input[next++] << bits;
- bits += 8;
- //---//
- }
- //--- DROPBITS(last.bits) ---//
- hold >>>= last_bits;
- bits -= last_bits;
- //---//
- state.back += last_bits;
- }
- //--- DROPBITS(here.bits) ---//
- hold >>>= here_bits;
- bits -= here_bits;
- //---//
- state.back += here_bits;
- if (here_op & 64) {
- strm.msg = 'invalid distance code';
- state.mode = BAD;
- break;
- }
- state.offset = here_val;
- state.extra = (here_op) & 15;
- state.mode = DISTEXT;
- /* falls through */
- case DISTEXT:
- if (state.extra) {
- //=== NEEDBITS(state.extra);
- n = state.extra;
- while (bits < n) {
- if (have === 0) { break inf_leave; }
- have--;
- hold += input[next++] << bits;
- bits += 8;
- }
- //===//
- state.offset += hold & ((1 << state.extra) -1)/*BITS(state.extra)*/;
- //--- DROPBITS(state.extra) ---//
- hold >>>= state.extra;
- bits -= state.extra;
- //---//
- state.back += state.extra;
- }
- //#ifdef INFLATE_STRICT
- if (state.offset > state.dmax) {
- strm.msg = 'invalid distance too far back';
- state.mode = BAD;
- break;
- }
- //#endif
- //Tracevv((stderr, "inflate: distance %u\n", state.offset));
- state.mode = MATCH;
- /* falls through */
- case MATCH:
- if (left === 0) { break inf_leave; }
- copy = _out - left;
- if (state.offset > copy) { /* copy from window */
- copy = state.offset - copy;
- if (copy > state.whave) {
- if (state.sane) {
- strm.msg = 'invalid distance too far back';
- state.mode = BAD;
- break;
- }
- // (!) This block is disabled in zlib defailts,
- // don't enable it for binary compatibility
- //#ifdef INFLATE_ALLOW_INVALID_DISTANCE_TOOFAR_ARRR
- // Trace((stderr, "inflate.c too far\n"));
- // copy -= state.whave;
- // if (copy > state.length) { copy = state.length; }
- // if (copy > left) { copy = left; }
- // left -= copy;
- // state.length -= copy;
- // do {
- // output[put++] = 0;
- // } while (--copy);
- // if (state.length === 0) { state.mode = LEN; }
- // break;
- //#endif
- }
- if (copy > state.wnext) {
- copy -= state.wnext;
- from = state.wsize - copy;
- }
- else {
- from = state.wnext - copy;
- }
- if (copy > state.length) { copy = state.length; }
- from_source = state.window;
- }
- else { /* copy from output */
- from_source = output;
- from = put - state.offset;
- copy = state.length;
- }
- if (copy > left) { copy = left; }
- left -= copy;
- state.length -= copy;
- do {
- output[put++] = from_source[from++];
- } while (--copy);
- if (state.length === 0) { state.mode = LEN; }
- break;
- case LIT:
- if (left === 0) { break inf_leave; }
- output[put++] = state.length;
- left--;
- state.mode = LEN;
- break;
- case CHECK:
- if (state.wrap) {
- //=== NEEDBITS(32);
- while (bits < 32) {
- if (have === 0) { break inf_leave; }
- have--;
- // Use '|' insdead of '+' to make sure that result is signed
- hold |= input[next++] << bits;
- bits += 8;
- }
- //===//
- _out -= left;
- strm.total_out += _out;
- state.total += _out;
- if (_out) {
- strm.adler = state.check =
- /*UPDATE(state.check, put - _out, _out);*/
- (state.flags ? crc32(state.check, output, _out, put - _out) : adler32(state.check, output, _out, put - _out));
-
- }
- _out = left;
- // NB: crc32 stored as signed 32-bit int, ZSWAP32 returns signed too
- if ((state.flags ? hold : ZSWAP32(hold)) !== state.check) {
- strm.msg = 'incorrect data check';
- state.mode = BAD;
- break;
- }
- //=== INITBITS();
- hold = 0;
- bits = 0;
- //===//
- //Tracev((stderr, "inflate: check matches trailer\n"));
- }
- state.mode = LENGTH;
- /* falls through */
- case LENGTH:
- if (state.wrap && state.flags) {
- //=== NEEDBITS(32);
- while (bits < 32) {
- if (have === 0) { break inf_leave; }
- have--;
- hold += input[next++] << bits;
- bits += 8;
- }
- //===//
- if (hold !== (state.total & 0xffffffff)) {
- strm.msg = 'incorrect length check';
- state.mode = BAD;
- break;
- }
- //=== INITBITS();
- hold = 0;
- bits = 0;
- //===//
- //Tracev((stderr, "inflate: length matches trailer\n"));
- }
- state.mode = DONE;
- /* falls through */
- case DONE:
- ret = Z_STREAM_END;
- break inf_leave;
- case BAD:
- ret = Z_DATA_ERROR;
- break inf_leave;
- case MEM:
- return Z_MEM_ERROR;
- case SYNC:
- /* falls through */
- default:
- return Z_STREAM_ERROR;
- }
- }
-
- // inf_leave <- here is real place for "goto inf_leave", emulated via "break inf_leave"
-
- /*
- Return from inflate(), updating the total counts and the check value.
- If there was no progress during the inflate() call, return a buffer
- error. Call updatewindow() to create and/or update the window state.
- Note: a memory error from inflate() is non-recoverable.
- */
-
- //--- RESTORE() ---
- strm.next_out = put;
- strm.avail_out = left;
- strm.next_in = next;
- strm.avail_in = have;
- state.hold = hold;
- state.bits = bits;
- //---
-
- if (state.wsize || (_out !== strm.avail_out && state.mode < BAD &&
- (state.mode < CHECK || flush !== Z_FINISH))) {
- if (updatewindow(strm, strm.output, strm.next_out, _out - strm.avail_out)) {
- state.mode = MEM;
- return Z_MEM_ERROR;
- }
- }
- _in -= strm.avail_in;
- _out -= strm.avail_out;
- strm.total_in += _in;
- strm.total_out += _out;
- state.total += _out;
- if (state.wrap && _out) {
- strm.adler = state.check = /*UPDATE(state.check, strm.next_out - _out, _out);*/
- (state.flags ? crc32(state.check, output, _out, strm.next_out - _out) : adler32(state.check, output, _out, strm.next_out - _out));
- }
- strm.data_type = state.bits + (state.last ? 64 : 0) +
- (state.mode === TYPE ? 128 : 0) +
- (state.mode === LEN_ || state.mode === COPY_ ? 256 : 0);
- if (((_in === 0 && _out === 0) || flush === Z_FINISH) && ret === Z_OK) {
- ret = Z_BUF_ERROR;
- }
- return ret;
- }
-
- function inflateEnd(strm) {
-
- if (!strm || !strm.state /*|| strm->zfree == (free_func)0*/) {
- return Z_STREAM_ERROR;
- }
-
- var state = strm.state;
- if (state.window) {
- state.window = null;
- }
- strm.state = null;
- return Z_OK;
- }
-
- function inflateGetHeader(strm, head) {
- var state;
-
- /* check state */
- if (!strm || !strm.state) { return Z_STREAM_ERROR; }
- state = strm.state;
- if ((state.wrap & 2) === 0) { return Z_STREAM_ERROR; }
-
- /* save header structure */
- state.head = head;
- head.done = false;
- return Z_OK;
- }
-
-
- exports.inflateReset = inflateReset;
- exports.inflateReset2 = inflateReset2;
- exports.inflateResetKeep = inflateResetKeep;
- exports.inflateInit = inflateInit;
- exports.inflateInit2 = inflateInit2;
- exports.inflate = inflate;
- exports.inflateEnd = inflateEnd;
- exports.inflateGetHeader = inflateGetHeader;
- exports.inflateInfo = 'pako inflate (from Nodeca project)';
-
- /* Not implemented
- exports.inflateCopy = inflateCopy;
- exports.inflateGetDictionary = inflateGetDictionary;
- exports.inflateMark = inflateMark;
- exports.inflatePrime = inflatePrime;
- exports.inflateSetDictionary = inflateSetDictionary;
- exports.inflateSync = inflateSync;
- exports.inflateSyncPoint = inflateSyncPoint;
- exports.inflateUndermine = inflateUndermine;
- */
- },{"../utils/common":27,"./adler32":29,"./crc32":31,"./inffast":34,"./inftrees":36}],36:[function(_dereq_,module,exports){
- 'use strict';
-
-
- var utils = _dereq_('../utils/common');
-
- var MAXBITS = 15;
- var ENOUGH_LENS = 852;
- var ENOUGH_DISTS = 592;
- //var ENOUGH = (ENOUGH_LENS+ENOUGH_DISTS);
-
- var CODES = 0;
- var LENS = 1;
- var DISTS = 2;
-
- var lbase = [ /* Length codes 257..285 base */
- 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, 0, 0
- ];
-
- var lext = [ /* Length codes 257..285 extra */
- 16, 16, 16, 16, 16, 16, 16, 16, 17, 17, 17, 17, 18, 18, 18, 18,
- 19, 19, 19, 19, 20, 20, 20, 20, 21, 21, 21, 21, 16, 72, 78
- ];
-
- var dbase = [ /* Distance codes 0..29 base */
- 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, 0, 0
- ];
-
- var dext = [ /* Distance codes 0..29 extra */
- 16, 16, 16, 16, 17, 17, 18, 18, 19, 19, 20, 20, 21, 21, 22, 22,
- 23, 23, 24, 24, 25, 25, 26, 26, 27, 27,
- 28, 28, 29, 29, 64, 64
- ];
-
- module.exports = function inflate_table(type, lens, lens_index, codes, table, table_index, work, opts)
- {
- var bits = opts.bits;
- //here = opts.here; /* table entry for duplication */
-
- var len = 0; /* a code's length in bits */
- var sym = 0; /* index of code symbols */
- var min = 0, max = 0; /* minimum and maximum code lengths */
- var root = 0; /* number of index bits for root table */
- var curr = 0; /* number of index bits for current table */
- var drop = 0; /* code bits to drop for sub-table */
- var left = 0; /* number of prefix codes available */
- var used = 0; /* code entries in table used */
- var huff = 0; /* Huffman code */
- var incr; /* for incrementing code, index */
- var fill; /* index for replicating entries */
- var low; /* low bits for current root entry */
- var mask; /* mask for low root bits */
- var next; /* next available space in table */
- var base = null; /* base value table to use */
- var base_index = 0;
- // var shoextra; /* extra bits table to use */
- var end; /* use base and extra for symbol > end */
- var count = new utils.Buf16(MAXBITS+1); //[MAXBITS+1]; /* number of codes of each length */
- var offs = new utils.Buf16(MAXBITS+1); //[MAXBITS+1]; /* offsets in table for each length */
- var extra = null;
- var extra_index = 0;
-
- var here_bits, here_op, here_val;
-
- /*
- Process a set of code lengths to create a canonical Huffman code. The
- code lengths are lens[0..codes-1]. Each length corresponds to the
- symbols 0..codes-1. The Huffman code is generated by first sorting the
- symbols by length from short to long, and retaining the symbol order
- for codes with equal lengths. Then the code starts with all zero bits
- for the first code of the shortest length, and the codes are integer
- increments for the same length, and zeros are appended as the length
- increases. For the deflate format, these bits are stored backwards
- from their more natural integer increment ordering, and so when the
- decoding tables are built in the large loop below, the integer codes
- are incremented backwards.
-
- This routine assumes, but does not check, that all of the entries in
- lens[] are in the range 0..MAXBITS. The caller must assure this.
- 1..MAXBITS is interpreted as that code length. zero means that that
- symbol does not occur in this code.
-
- The codes are sorted by computing a count of codes for each length,
- creating from that a table of starting indices for each length in the
- sorted table, and then entering the symbols in order in the sorted
- table. The sorted table is work[], with that space being provided by
- the caller.
-
- The length counts are used for other purposes as well, i.e. finding
- the minimum and maximum length codes, determining if there are any
- codes at all, checking for a valid set of lengths, and looking ahead
- at length counts to determine sub-table sizes when building the
- decoding tables.
- */
-
- /* accumulate lengths for codes (assumes lens[] all in 0..MAXBITS) */
- for (len = 0; len <= MAXBITS; len++) {
- count[len] = 0;
- }
- for (sym = 0; sym < codes; sym++) {
- count[lens[lens_index + sym]]++;
- }
-
- /* bound code lengths, force root to be within code lengths */
- root = bits;
- for (max = MAXBITS; max >= 1; max--) {
- if (count[max] !== 0) { break; }
- }
- if (root > max) {
- root = max;
- }
- if (max === 0) { /* no symbols to code at all */
- //table.op[opts.table_index] = 64; //here.op = (var char)64; /* invalid code marker */
- //table.bits[opts.table_index] = 1; //here.bits = (var char)1;
- //table.val[opts.table_index++] = 0; //here.val = (var short)0;
- table[table_index++] = (1 << 24) | (64 << 16) | 0;
-
-
- //table.op[opts.table_index] = 64;
- //table.bits[opts.table_index] = 1;
- //table.val[opts.table_index++] = 0;
- table[table_index++] = (1 << 24) | (64 << 16) | 0;
-
- opts.bits = 1;
- return 0; /* no symbols, but wait for decoding to report error */
- }
- for (min = 1; min < max; min++) {
- if (count[min] !== 0) { break; }
- }
- if (root < min) {
- root = min;
- }
-
- /* check for an over-subscribed or incomplete set of lengths */
- left = 1;
- for (len = 1; len <= MAXBITS; len++) {
- left <<= 1;
- left -= count[len];
- if (left < 0) {
- return -1;
- } /* over-subscribed */
- }
- if (left > 0 && (type === CODES || max !== 1)) {
- return -1; /* incomplete set */
- }
-
- /* generate offsets into symbol table for each length for sorting */
- offs[1] = 0;
- for (len = 1; len < MAXBITS; len++) {
- offs[len + 1] = offs[len] + count[len];
- }
-
- /* sort symbols by length, by symbol order within each length */
- for (sym = 0; sym < codes; sym++) {
- if (lens[lens_index + sym] !== 0) {
- work[offs[lens[lens_index + sym]]++] = sym;
- }
- }
-
- /*
- Create and fill in decoding tables. In this loop, the table being
- filled is at next and has curr index bits. The code being used is huff
- with length len. That code is converted to an index by dropping drop
- bits off of the bottom. For codes where len is less than drop + curr,
- those top drop + curr - len bits are incremented through all values to
- fill the table with replicated entries.
-
- root is the number of index bits for the root table. When len exceeds
- root, sub-tables are created pointed to by the root entry with an index
- of the low root bits of huff. This is saved in low to check for when a
- new sub-table should be started. drop is zero when the root table is
- being filled, and drop is root when sub-tables are being filled.
-
- When a new sub-table is needed, it is necessary to look ahead in the
- code lengths to determine what size sub-table is needed. The length
- counts are used for this, and so count[] is decremented as codes are
- entered in the tables.
-
- used keeps track of how many table entries have been allocated from the
- provided *table space. It is checked for LENS and DIST tables against
- the constants ENOUGH_LENS and ENOUGH_DISTS to guard against changes in
- the initial root table size constants. See the comments in inftrees.h
- for more information.
-
- sym increments through all symbols, and the loop terminates when
- all codes of length max, i.e. all codes, have been processed. This
- routine permits incomplete codes, so another loop after this one fills
- in the rest of the decoding tables with invalid code markers.
- */
-
- /* set up for code type */
- // poor man optimization - use if-else instead of switch,
- // to avoid deopts in old v8
- if (type === CODES) {
- base = extra = work; /* dummy value--not used */
- end = 19;
- } else if (type === LENS) {
- base = lbase;
- base_index -= 257;
- extra = lext;
- extra_index -= 257;
- end = 256;
- } else { /* DISTS */
- base = dbase;
- extra = dext;
- end = -1;
- }
-
- /* initialize opts for loop */
- huff = 0; /* starting code */
- sym = 0; /* starting code symbol */
- len = min; /* starting code length */
- next = table_index; /* current table to fill in */
- curr = root; /* current table index bits */
- drop = 0; /* current bits to drop from code for index */
- low = -1; /* trigger new sub-table when len > root */
- used = 1 << root; /* use root table entries */
- mask = used - 1; /* mask for comparing low */
-
- /* check available table space */
- if ((type === LENS && used > ENOUGH_LENS) ||
- (type === DISTS && used > ENOUGH_DISTS)) {
- return 1;
- }
-
- var i=0;
- /* process all codes and make table entries */
- for (;;) {
- i++;
- /* create table entry */
- here_bits = len - drop;
- if (work[sym] < end) {
- here_op = 0;
- here_val = work[sym];
- }
- else if (work[sym] > end) {
- here_op = extra[extra_index + work[sym]];
- here_val = base[base_index + work[sym]];
- }
- else {
- here_op = 32 + 64; /* end of block */
- here_val = 0;
- }
-
- /* replicate for those indices with low len bits equal to huff */
- incr = 1 << (len - drop);
- fill = 1 << curr;
- min = fill; /* save offset to next table */
- do {
- fill -= incr;
- table[next + (huff >> drop) + fill] = (here_bits << 24) | (here_op << 16) | here_val |0;
- } while (fill !== 0);
-
- /* backwards increment the len-bit code huff */
- incr = 1 << (len - 1);
- while (huff & incr) {
- incr >>= 1;
- }
- if (incr !== 0) {
- huff &= incr - 1;
- huff += incr;
- } else {
- huff = 0;
- }
-
- /* go to next symbol, update count, len */
- sym++;
- if (--count[len] === 0) {
- if (len === max) { break; }
- len = lens[lens_index + work[sym]];
- }
-
- /* create new sub-table if needed */
- if (len > root && (huff & mask) !== low) {
- /* if first time, transition to sub-tables */
- if (drop === 0) {
- drop = root;
- }
-
- /* increment past last table */
- next += min; /* here min is 1 << curr */
-
- /* determine length of next table */
- curr = len - drop;
- left = 1 << curr;
- while (curr + drop < max) {
- left -= count[curr + drop];
- if (left <= 0) { break; }
- curr++;
- left <<= 1;
- }
-
- /* check for enough space */
- used += 1 << curr;
- if ((type === LENS && used > ENOUGH_LENS) ||
- (type === DISTS && used > ENOUGH_DISTS)) {
- return 1;
- }
-
- /* point entry in root table to sub-table */
- low = huff & mask;
- /*table.op[low] = curr;
- table.bits[low] = root;
- table.val[low] = next - opts.table_index;*/
- table[low] = (root << 24) | (curr << 16) | (next - table_index) |0;
- }
- }
-
- /* fill in remaining table entry if code is incomplete (guaranteed to have
- at most one remaining entry, since if the code is incomplete, the
- maximum code length that was allowed to get this far is one bit) */
- if (huff !== 0) {
- //table.op[next + huff] = 64; /* invalid code marker */
- //table.bits[next + huff] = len - drop;
- //table.val[next + huff] = 0;
- table[next + huff] = ((len - drop) << 24) | (64 << 16) |0;
- }
-
- /* set return parameters */
- //opts.table_index += used;
- opts.bits = root;
- return 0;
- };
-
- },{"../utils/common":27}],37:[function(_dereq_,module,exports){
- 'use strict';
-
- module.exports = {
- '2': 'need dictionary', /* Z_NEED_DICT 2 */
- '1': 'stream end', /* Z_STREAM_END 1 */
- '0': '', /* Z_OK 0 */
- '-1': 'file error', /* Z_ERRNO (-1) */
- '-2': 'stream error', /* Z_STREAM_ERROR (-2) */
- '-3': 'data error', /* Z_DATA_ERROR (-3) */
- '-4': 'insufficient memory', /* Z_MEM_ERROR (-4) */
- '-5': 'buffer error', /* Z_BUF_ERROR (-5) */
- '-6': 'incompatible version' /* Z_VERSION_ERROR (-6) */
- };
- },{}],38:[function(_dereq_,module,exports){
- 'use strict';
-
-
- var utils = _dereq_('../utils/common');
-
- /* Public constants ==========================================================*/
- /* ===========================================================================*/
-
-
- //var Z_FILTERED = 1;
- //var Z_HUFFMAN_ONLY = 2;
- //var Z_RLE = 3;
- var Z_FIXED = 4;
- //var Z_DEFAULT_STRATEGY = 0;
-
- /* Possible values of the data_type field (though see inflate()) */
- var Z_BINARY = 0;
- var Z_TEXT = 1;
- //var Z_ASCII = 1; // = Z_TEXT
- var Z_UNKNOWN = 2;
-
- /*============================================================================*/
-
-
- function zero(buf) { var len = buf.length; while (--len >= 0) { buf[len] = 0; } }
-
- // From zutil.h
-
- var STORED_BLOCK = 0;
- var STATIC_TREES = 1;
- var DYN_TREES = 2;
- /* The three kinds of block type */
-
- var MIN_MATCH = 3;
- var MAX_MATCH = 258;
- /* The minimum and maximum match lengths */
-
- // From deflate.h
- /* ===========================================================================
- * Internal compression state.
- */
-
- var LENGTH_CODES = 29;
- /* number of length codes, not counting the special END_BLOCK code */
-
- var LITERALS = 256;
- /* number of literal bytes 0..255 */
-
- var L_CODES = LITERALS + 1 + LENGTH_CODES;
- /* number of Literal or Length codes, including the END_BLOCK code */
-
- var D_CODES = 30;
- /* number of distance codes */
-
- var BL_CODES = 19;
- /* number of codes used to transfer the bit lengths */
-
- var HEAP_SIZE = 2*L_CODES + 1;
- /* maximum heap size */
-
- var MAX_BITS = 15;
- /* All codes must not exceed MAX_BITS bits */
-
- var Buf_size = 16;
- /* size of bit buffer in bi_buf */
-
-
- /* ===========================================================================
- * Constants
- */
-
- var MAX_BL_BITS = 7;
- /* Bit length codes must not exceed MAX_BL_BITS bits */
-
- var END_BLOCK = 256;
- /* end of block literal code */
-
- var REP_3_6 = 16;
- /* repeat previous bit length 3-6 times (2 bits of repeat count) */
-
- var REPZ_3_10 = 17;
- /* repeat a zero length 3-10 times (3 bits of repeat count) */
-
- var REPZ_11_138 = 18;
- /* repeat a zero length 11-138 times (7 bits of repeat count) */
-
- var extra_lbits = /* extra bits for each length code */
- [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];
-
- var extra_dbits = /* extra bits for each distance code */
- [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];
-
- var extra_blbits = /* extra bits for each bit length code */
- [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,3,7];
-
- var bl_order =
- [16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15];
- /* The lengths of the bit length codes are sent in order of decreasing
- * probability, to avoid transmitting the lengths for unused bit length codes.
- */
-
- /* ===========================================================================
- * Local data. These are initialized only once.
- */
-
- // We pre-fill arrays with 0 to avoid uninitialized gaps
-
- var DIST_CODE_LEN = 512; /* see definition of array dist_code below */
-
- // !!!! Use flat array insdead of structure, Freq = i*2, Len = i*2+1
- var static_ltree = new Array((L_CODES+2) * 2);
- zero(static_ltree);
- /* The static literal tree. Since the bit lengths are imposed, there is no
- * need for the L_CODES extra codes used during heap construction. However
- * The codes 286 and 287 are needed to build a canonical tree (see _tr_init
- * below).
- */
-
- var static_dtree = new Array(D_CODES * 2);
- zero(static_dtree);
- /* The static distance tree. (Actually a trivial tree since all codes use
- * 5 bits.)
- */
-
- var _dist_code = new Array(DIST_CODE_LEN);
- zero(_dist_code);
- /* Distance codes. The first 256 values correspond to the distances
- * 3 .. 258, the last 256 values correspond to the top 8 bits of
- * the 15 bit distances.
- */
-
- var _length_code = new Array(MAX_MATCH-MIN_MATCH+1);
- zero(_length_code);
- /* length code for each normalized match length (0 == MIN_MATCH) */
-
- var base_length = new Array(LENGTH_CODES);
- zero(base_length);
- /* First normalized length for each code (0 = MIN_MATCH) */
-
- var base_dist = new Array(D_CODES);
- zero(base_dist);
- /* First normalized distance for each code (0 = distance of 1) */
-
-
- var StaticTreeDesc = function (static_tree, extra_bits, extra_base, elems, max_length) {
-
- this.static_tree = static_tree; /* static tree or NULL */
- this.extra_bits = extra_bits; /* extra bits for each code or NULL */
- this.extra_base = extra_base; /* base index for extra_bits */
- this.elems = elems; /* max number of elements in the tree */
- this.max_length = max_length; /* max bit length for the codes */
-
- // show if `static_tree` has data or dummy - needed for monomorphic objects
- this.has_stree = static_tree && static_tree.length;
- };
-
-
- var static_l_desc;
- var static_d_desc;
- var static_bl_desc;
-
-
- var TreeDesc = function(dyn_tree, stat_desc) {
- this.dyn_tree = dyn_tree; /* the dynamic tree */
- this.max_code = 0; /* largest code with non zero frequency */
- this.stat_desc = stat_desc; /* the corresponding static tree */
- };
-
-
-
- function d_code(dist) {
- return dist < 256 ? _dist_code[dist] : _dist_code[256 + (dist >>> 7)];
- }
-
-
- /* ===========================================================================
- * Output a short LSB first on the stream.
- * IN assertion: there is enough room in pendingBuf.
- */
- function put_short (s, w) {
- // put_byte(s, (uch)((w) & 0xff));
- // put_byte(s, (uch)((ush)(w) >> 8));
- s.pending_buf[s.pending++] = (w) & 0xff;
- s.pending_buf[s.pending++] = (w >>> 8) & 0xff;
- }
-
-
- /* ===========================================================================
- * Send a value on a given number of bits.
- * IN assertion: length <= 16 and value fits in length bits.
- */
- function send_bits(s, value, length) {
- if (s.bi_valid > (Buf_size - length)) {
- s.bi_buf |= (value << s.bi_valid) & 0xffff;
- put_short(s, s.bi_buf);
- s.bi_buf = value >> (Buf_size - s.bi_valid);
- s.bi_valid += length - Buf_size;
- } else {
- s.bi_buf |= (value << s.bi_valid) & 0xffff;
- s.bi_valid += length;
- }
- }
-
-
- function send_code(s, c, tree) {
- send_bits(s, tree[c*2]/*.Code*/, tree[c*2 + 1]/*.Len*/);
- }
-
-
- /* ===========================================================================
- * Reverse the first len bits of a code, using straightforward code (a faster
- * method would use a table)
- * IN assertion: 1 <= len <= 15
- */
- function bi_reverse(code, len) {
- var res = 0;
- do {
- res |= code & 1;
- code >>>= 1;
- res <<= 1;
- } while (--len > 0);
- return res >>> 1;
- }
-
-
- /* ===========================================================================
- * Flush the bit buffer, keeping at most 7 bits in it.
- */
- function bi_flush(s) {
- if (s.bi_valid === 16) {
- put_short(s, s.bi_buf);
- s.bi_buf = 0;
- s.bi_valid = 0;
-
- } else if (s.bi_valid >= 8) {
- s.pending_buf[s.pending++] = s.bi_buf & 0xff;
- s.bi_buf >>= 8;
- s.bi_valid -= 8;
- }
- }
-
-
- /* ===========================================================================
- * Compute the optimal bit lengths for a tree and update the total bit length
- * for the current block.
- * IN assertion: the fields freq and dad are set, heap[heap_max] and
- * above are the tree nodes sorted by increasing frequency.
- * OUT assertions: the field len is set to the optimal bit length, the
- * array bl_count contains the frequencies for each bit length.
- * The length opt_len is updated; static_len is also updated if stree is
- * not null.
- */
- function gen_bitlen(s, desc)
- // deflate_state *s;
- // tree_desc *desc; /* the tree descriptor */
- {
- var tree = desc.dyn_tree;
- var max_code = desc.max_code;
- var stree = desc.stat_desc.static_tree;
- var has_stree = desc.stat_desc.has_stree;
- var extra = desc.stat_desc.extra_bits;
- var base = desc.stat_desc.extra_base;
- var max_length = desc.stat_desc.max_length;
- var h; /* heap index */
- var n, m; /* iterate over the tree elements */
- var bits; /* bit length */
- var xbits; /* extra bits */
- var f; /* frequency */
- var overflow = 0; /* number of elements with bit length too large */
-
- for (bits = 0; bits <= MAX_BITS; bits++) {
- s.bl_count[bits] = 0;
- }
-
- /* In a first pass, compute the optimal bit lengths (which may
- * overflow in the case of the bit length tree).
- */
- tree[s.heap[s.heap_max]*2 + 1]/*.Len*/ = 0; /* root of the heap */
-
- for (h = s.heap_max+1; h < HEAP_SIZE; h++) {
- n = s.heap[h];
- bits = tree[tree[n*2 +1]/*.Dad*/ * 2 + 1]/*.Len*/ + 1;
- if (bits > max_length) {
- bits = max_length;
- overflow++;
- }
- tree[n*2 + 1]/*.Len*/ = bits;
- /* We overwrite tree[n].Dad which is no longer needed */
-
- if (n > max_code) { continue; } /* not a leaf node */
-
- s.bl_count[bits]++;
- xbits = 0;
- if (n >= base) {
- xbits = extra[n-base];
- }
- f = tree[n * 2]/*.Freq*/;
- s.opt_len += f * (bits + xbits);
- if (has_stree) {
- s.static_len += f * (stree[n*2 + 1]/*.Len*/ + xbits);
- }
- }
- if (overflow === 0) { return; }
-
- // Trace((stderr,"\nbit length overflow\n"));
- /* This happens for example on obj2 and pic of the Calgary corpus */
-
- /* Find the first bit length which could increase: */
- do {
- bits = max_length-1;
- while (s.bl_count[bits] === 0) { bits--; }
- s.bl_count[bits]--; /* move one leaf down the tree */
- s.bl_count[bits+1] += 2; /* move one overflow item as its brother */
- s.bl_count[max_length]--;
- /* The brother of the overflow item also moves one step up,
- * but this does not affect bl_count[max_length]
- */
- overflow -= 2;
- } while (overflow > 0);
-
- /* Now recompute all bit lengths, scanning in increasing frequency.
- * h is still equal to HEAP_SIZE. (It is simpler to reconstruct all
- * lengths instead of fixing only the wrong ones. This idea is taken
- * from 'ar' written by Haruhiko Okumura.)
- */
- for (bits = max_length; bits !== 0; bits--) {
- n = s.bl_count[bits];
- while (n !== 0) {
- m = s.heap[--h];
- if (m > max_code) { continue; }
- if (tree[m*2 + 1]/*.Len*/ !== bits) {
- // Trace((stderr,"code %d bits %d->%d\n", m, tree[m].Len, bits));
- s.opt_len += (bits - tree[m*2 + 1]/*.Len*/)*tree[m*2]/*.Freq*/;
- tree[m*2 + 1]/*.Len*/ = bits;
- }
- n--;
- }
- }
- }
-
-
- /* ===========================================================================
- * Generate the codes for a given tree and bit counts (which need not be
- * optimal).
- * IN assertion: the array bl_count contains the bit length statistics for
- * the given tree and the field len is set for all tree elements.
- * OUT assertion: the field code is set for all tree elements of non
- * zero code length.
- */
- function gen_codes(tree, max_code, bl_count)
- // ct_data *tree; /* the tree to decorate */
- // int max_code; /* largest code with non zero frequency */
- // ushf *bl_count; /* number of codes at each bit length */
- {
- var next_code = new Array(MAX_BITS+1); /* next code value for each bit length */
- var code = 0; /* running code value */
- var bits; /* bit index */
- var n; /* code index */
-
- /* The distribution counts are first used to generate the code values
- * without bit reversal.
- */
- for (bits = 1; bits <= MAX_BITS; bits++) {
- next_code[bits] = code = (code + bl_count[bits-1]) << 1;
- }
- /* Check that the bit counts in bl_count are consistent. The last code
- * must be all ones.
- */
- //Assert (code + bl_count[MAX_BITS]-1 == (1<<MAX_BITS)-1,
- // "inconsistent bit counts");
- //Tracev((stderr,"\ngen_codes: max_code %d ", max_code));
-
- for (n = 0; n <= max_code; n++) {
- var len = tree[n*2 + 1]/*.Len*/;
- if (len === 0) { continue; }
- /* Now reverse the bits */
- tree[n*2]/*.Code*/ = bi_reverse(next_code[len]++, len);
-
- //Tracecv(tree != static_ltree, (stderr,"\nn %3d %c l %2d c %4x (%x) ",
- // n, (isgraph(n) ? n : ' '), len, tree[n].Code, next_code[len]-1));
- }
- }
-
-
- /* ===========================================================================
- * Initialize the various 'constant' tables.
- */
- function tr_static_init() {
- var n; /* iterates over tree elements */
- var bits; /* bit counter */
- var length; /* length value */
- var code; /* code value */
- var dist; /* distance index */
- var bl_count = new Array(MAX_BITS+1);
- /* number of codes at each bit length for an optimal tree */
-
- // do check in _tr_init()
- //if (static_init_done) return;
-
- /* For some embedded targets, global variables are not initialized: */
- /*#ifdef NO_INIT_GLOBAL_POINTERS
- static_l_desc.static_tree = static_ltree;
- static_l_desc.extra_bits = extra_lbits;
- static_d_desc.static_tree = static_dtree;
- static_d_desc.extra_bits = extra_dbits;
- static_bl_desc.extra_bits = extra_blbits;
- #endif*/
-
- /* Initialize the mapping length (0..255) -> length code (0..28) */
- length = 0;
- for (code = 0; code < LENGTH_CODES-1; code++) {
- base_length[code] = length;
- for (n = 0; n < (1<<extra_lbits[code]); n++) {
- _length_code[length++] = code;
- }
- }
- //Assert (length == 256, "tr_static_init: length != 256");
- /* Note that the length 255 (match length 258) can be represented
- * in two different ways: code 284 + 5 bits or code 285, so we
- * overwrite length_code[255] to use the best encoding:
- */
- _length_code[length-1] = code;
-
- /* Initialize the mapping dist (0..32K) -> dist code (0..29) */
- dist = 0;
- for (code = 0 ; code < 16; code++) {
- base_dist[code] = dist;
- for (n = 0; n < (1<<extra_dbits[code]); n++) {
- _dist_code[dist++] = code;
- }
- }
- //Assert (dist == 256, "tr_static_init: dist != 256");
- dist >>= 7; /* from now on, all distances are divided by 128 */
- for ( ; code < D_CODES; code++) {
- base_dist[code] = dist << 7;
- for (n = 0; n < (1<<(extra_dbits[code]-7)); n++) {
- _dist_code[256 + dist++] = code;
- }
- }
- //Assert (dist == 256, "tr_static_init: 256+dist != 512");
-
- /* Construct the codes of the static literal tree */
- for (bits = 0; bits <= MAX_BITS; bits++) {
- bl_count[bits] = 0;
- }
-
- n = 0;
- while (n <= 143) {
- static_ltree[n*2 + 1]/*.Len*/ = 8;
- n++;
- bl_count[8]++;
- }
- while (n <= 255) {
- static_ltree[n*2 + 1]/*.Len*/ = 9;
- n++;
- bl_count[9]++;
- }
- while (n <= 279) {
- static_ltree[n*2 + 1]/*.Len*/ = 7;
- n++;
- bl_count[7]++;
- }
- while (n <= 287) {
- static_ltree[n*2 + 1]/*.Len*/ = 8;
- n++;
- bl_count[8]++;
- }
- /* Codes 286 and 287 do not exist, but we must include them in the
- * tree construction to get a canonical Huffman tree (longest code
- * all ones)
- */
- gen_codes(static_ltree, L_CODES+1, bl_count);
-
- /* The static distance tree is trivial: */
- for (n = 0; n < D_CODES; n++) {
- static_dtree[n*2 + 1]/*.Len*/ = 5;
- static_dtree[n*2]/*.Code*/ = bi_reverse(n, 5);
- }
-
- // Now data ready and we can init static trees
- static_l_desc = new StaticTreeDesc(static_ltree, extra_lbits, LITERALS+1, L_CODES, MAX_BITS);
- static_d_desc = new StaticTreeDesc(static_dtree, extra_dbits, 0, D_CODES, MAX_BITS);
- static_bl_desc =new StaticTreeDesc(new Array(0), extra_blbits, 0, BL_CODES, MAX_BL_BITS);
-
- //static_init_done = true;
- }
-
-
- /* ===========================================================================
- * Initialize a new block.
- */
- function init_block(s) {
- var n; /* iterates over tree elements */
-
- /* Initialize the trees. */
- for (n = 0; n < L_CODES; n++) { s.dyn_ltree[n*2]/*.Freq*/ = 0; }
- for (n = 0; n < D_CODES; n++) { s.dyn_dtree[n*2]/*.Freq*/ = 0; }
- for (n = 0; n < BL_CODES; n++) { s.bl_tree[n*2]/*.Freq*/ = 0; }
-
- s.dyn_ltree[END_BLOCK*2]/*.Freq*/ = 1;
- s.opt_len = s.static_len = 0;
- s.last_lit = s.matches = 0;
- }
-
-
- /* ===========================================================================
- * Flush the bit buffer and align the output on a byte boundary
- */
- function bi_windup(s)
- {
- if (s.bi_valid > 8) {
- put_short(s, s.bi_buf);
- } else if (s.bi_valid > 0) {
- //put_byte(s, (Byte)s->bi_buf);
- s.pending_buf[s.pending++] = s.bi_buf;
- }
- s.bi_buf = 0;
- s.bi_valid = 0;
- }
-
- /* ===========================================================================
- * Copy a stored block, storing first the length and its
- * one's complement if requested.
- */
- function copy_block(s, buf, len, header)
- //DeflateState *s;
- //charf *buf; /* the input data */
- //unsigned len; /* its length */
- //int header; /* true if block header must be written */
- {
- bi_windup(s); /* align on byte boundary */
-
- if (header) {
- put_short(s, len);
- put_short(s, ~len);
- }
- // while (len--) {
- // put_byte(s, *buf++);
- // }
- utils.arraySet(s.pending_buf, s.window, buf, len, s.pending);
- s.pending += len;
- }
-
- /* ===========================================================================
- * Compares to subtrees, using the tree depth as tie breaker when
- * the subtrees have equal frequency. This minimizes the worst case length.
- */
- function smaller(tree, n, m, depth) {
- var _n2 = n*2;
- var _m2 = m*2;
- return (tree[_n2]/*.Freq*/ < tree[_m2]/*.Freq*/ ||
- (tree[_n2]/*.Freq*/ === tree[_m2]/*.Freq*/ && depth[n] <= depth[m]));
- }
-
- /* ===========================================================================
- * Restore the heap property by moving down the tree starting at node k,
- * exchanging a node with the smallest of its two sons if necessary, stopping
- * when the heap property is re-established (each father smaller than its
- * two sons).
- */
- function pqdownheap(s, tree, k)
- // deflate_state *s;
- // ct_data *tree; /* the tree to restore */
- // int k; /* node to move down */
- {
- var v = s.heap[k];
- var j = k << 1; /* left son of k */
- while (j <= s.heap_len) {
- /* Set j to the smallest of the two sons: */
- if (j < s.heap_len &&
- smaller(tree, s.heap[j+1], s.heap[j], s.depth)) {
- j++;
- }
- /* Exit if v is smaller than both sons */
- if (smaller(tree, v, s.heap[j], s.depth)) { break; }
-
- /* Exchange v with the smallest son */
- s.heap[k] = s.heap[j];
- k = j;
-
- /* And continue down the tree, setting j to the left son of k */
- j <<= 1;
- }
- s.heap[k] = v;
- }
-
-
- // inlined manually
- // var SMALLEST = 1;
-
- /* ===========================================================================
- * Send the block data compressed using the given Huffman trees
- */
- function compress_block(s, ltree, dtree)
- // deflate_state *s;
- // const ct_data *ltree; /* literal tree */
- // const ct_data *dtree; /* distance tree */
- {
- var dist; /* distance of matched string */
- var lc; /* match length or unmatched char (if dist == 0) */
- var lx = 0; /* running index in l_buf */
- var code; /* the code to send */
- var extra; /* number of extra bits to send */
-
- if (s.last_lit !== 0) {
- do {
- dist = (s.pending_buf[s.d_buf + lx*2] << 8) | (s.pending_buf[s.d_buf + lx*2 + 1]);
- lc = s.pending_buf[s.l_buf + lx];
- lx++;
-
- if (dist === 0) {
- send_code(s, lc, ltree); /* send a literal byte */
- //Tracecv(isgraph(lc), (stderr," '%c' ", lc));
- } else {
- /* Here, lc is the match length - MIN_MATCH */
- code = _length_code[lc];
- send_code(s, code+LITERALS+1, ltree); /* send the length code */
- extra = extra_lbits[code];
- if (extra !== 0) {
- lc -= base_length[code];
- send_bits(s, lc, extra); /* send the extra length bits */
- }
- dist--; /* dist is now the match distance - 1 */
- code = d_code(dist);
- //Assert (code < D_CODES, "bad d_code");
-
- send_code(s, code, dtree); /* send the distance code */
- extra = extra_dbits[code];
- if (extra !== 0) {
- dist -= base_dist[code];
- send_bits(s, dist, extra); /* send the extra distance bits */
- }
- } /* literal or match pair ? */
-
- /* Check that the overlay between pending_buf and d_buf+l_buf is ok: */
- //Assert((uInt)(s->pending) < s->lit_bufsize + 2*lx,
- // "pendingBuf overflow");
-
- } while (lx < s.last_lit);
- }
-
- send_code(s, END_BLOCK, ltree);
- }
-
-
- /* ===========================================================================
- * Construct one Huffman tree and assigns the code bit strings and lengths.
- * Update the total bit length for the current block.
- * IN assertion: the field freq is set for all tree elements.
- * OUT assertions: the fields len and code are set to the optimal bit length
- * and corresponding code. The length opt_len is updated; static_len is
- * also updated if stree is not null. The field max_code is set.
- */
- function build_tree(s, desc)
- // deflate_state *s;
- // tree_desc *desc; /* the tree descriptor */
- {
- var tree = desc.dyn_tree;
- var stree = desc.stat_desc.static_tree;
- var has_stree = desc.stat_desc.has_stree;
- var elems = desc.stat_desc.elems;
- var n, m; /* iterate over heap elements */
- var max_code = -1; /* largest code with non zero frequency */
- var node; /* new node being created */
-
- /* Construct the initial heap, with least frequent element in
- * heap[SMALLEST]. The sons of heap[n] are heap[2*n] and heap[2*n+1].
- * heap[0] is not used.
- */
- s.heap_len = 0;
- s.heap_max = HEAP_SIZE;
-
- for (n = 0; n < elems; n++) {
- if (tree[n * 2]/*.Freq*/ !== 0) {
- s.heap[++s.heap_len] = max_code = n;
- s.depth[n] = 0;
-
- } else {
- tree[n*2 + 1]/*.Len*/ = 0;
- }
- }
-
- /* The pkzip format requires that at least one distance code exists,
- * and that at least one bit should be sent even if there is only one
- * possible code. So to avoid special checks later on we force at least
- * two codes of non zero frequency.
- */
- while (s.heap_len < 2) {
- node = s.heap[++s.heap_len] = (max_code < 2 ? ++max_code : 0);
- tree[node * 2]/*.Freq*/ = 1;
- s.depth[node] = 0;
- s.opt_len--;
-
- if (has_stree) {
- s.static_len -= stree[node*2 + 1]/*.Len*/;
- }
- /* node is 0 or 1 so it does not have extra bits */
- }
- desc.max_code = max_code;
-
- /* The elements heap[heap_len/2+1 .. heap_len] are leaves of the tree,
- * establish sub-heaps of increasing lengths:
- */
- for (n = (s.heap_len >> 1/*int /2*/); n >= 1; n--) { pqdownheap(s, tree, n); }
-
- /* Construct the Huffman tree by repeatedly combining the least two
- * frequent nodes.
- */
- node = elems; /* next internal node of the tree */
- do {
- //pqremove(s, tree, n); /* n = node of least frequency */
- /*** pqremove ***/
- n = s.heap[1/*SMALLEST*/];
- s.heap[1/*SMALLEST*/] = s.heap[s.heap_len--];
- pqdownheap(s, tree, 1/*SMALLEST*/);
- /***/
-
- m = s.heap[1/*SMALLEST*/]; /* m = node of next least frequency */
-
- s.heap[--s.heap_max] = n; /* keep the nodes sorted by frequency */
- s.heap[--s.heap_max] = m;
-
- /* Create a new node father of n and m */
- tree[node * 2]/*.Freq*/ = tree[n * 2]/*.Freq*/ + tree[m * 2]/*.Freq*/;
- s.depth[node] = (s.depth[n] >= s.depth[m] ? s.depth[n] : s.depth[m]) + 1;
- tree[n*2 + 1]/*.Dad*/ = tree[m*2 + 1]/*.Dad*/ = node;
-
- /* and insert the new node in the heap */
- s.heap[1/*SMALLEST*/] = node++;
- pqdownheap(s, tree, 1/*SMALLEST*/);
-
- } while (s.heap_len >= 2);
-
- s.heap[--s.heap_max] = s.heap[1/*SMALLEST*/];
-
- /* At this point, the fields freq and dad are set. We can now
- * generate the bit lengths.
- */
- gen_bitlen(s, desc);
-
- /* The field len is now set, we can generate the bit codes */
- gen_codes(tree, max_code, s.bl_count);
- }
-
-
- /* ===========================================================================
- * Scan a literal or distance tree to determine the frequencies of the codes
- * in the bit length tree.
- */
- function scan_tree(s, tree, max_code)
- // deflate_state *s;
- // ct_data *tree; /* the tree to be scanned */
- // int max_code; /* and its largest code of non zero frequency */
- {
- var n; /* iterates over all tree elements */
- var prevlen = -1; /* last emitted length */
- var curlen; /* length of current code */
-
- var nextlen = tree[0*2 + 1]/*.Len*/; /* length of next code */
-
- var count = 0; /* repeat count of the current code */
- var max_count = 7; /* max repeat count */
- var min_count = 4; /* min repeat count */
-
- if (nextlen === 0) {
- max_count = 138;
- min_count = 3;
- }
- tree[(max_code+1)*2 + 1]/*.Len*/ = 0xffff; /* guard */
-
- for (n = 0; n <= max_code; n++) {
- curlen = nextlen;
- nextlen = tree[(n+1)*2 + 1]/*.Len*/;
-
- if (++count < max_count && curlen === nextlen) {
- continue;
-
- } else if (count < min_count) {
- s.bl_tree[curlen * 2]/*.Freq*/ += count;
-
- } else if (curlen !== 0) {
-
- if (curlen !== prevlen) { s.bl_tree[curlen * 2]/*.Freq*/++; }
- s.bl_tree[REP_3_6*2]/*.Freq*/++;
-
- } else if (count <= 10) {
- s.bl_tree[REPZ_3_10*2]/*.Freq*/++;
-
- } else {
- s.bl_tree[REPZ_11_138*2]/*.Freq*/++;
- }
-
- count = 0;
- prevlen = curlen;
-
- if (nextlen === 0) {
- max_count = 138;
- min_count = 3;
-
- } else if (curlen === nextlen) {
- max_count = 6;
- min_count = 3;
-
- } else {
- max_count = 7;
- min_count = 4;
- }
- }
- }
-
-
- /* ===========================================================================
- * Send a literal or distance tree in compressed form, using the codes in
- * bl_tree.
- */
- function send_tree(s, tree, max_code)
- // deflate_state *s;
- // ct_data *tree; /* the tree to be scanned */
- // int max_code; /* and its largest code of non zero frequency */
- {
- var n; /* iterates over all tree elements */
- var prevlen = -1; /* last emitted length */
- var curlen; /* length of current code */
-
- var nextlen = tree[0*2 + 1]/*.Len*/; /* length of next code */
-
- var count = 0; /* repeat count of the current code */
- var max_count = 7; /* max repeat count */
- var min_count = 4; /* min repeat count */
-
- /* tree[max_code+1].Len = -1; */ /* guard already set */
- if (nextlen === 0) {
- max_count = 138;
- min_count = 3;
- }
-
- for (n = 0; n <= max_code; n++) {
- curlen = nextlen;
- nextlen = tree[(n+1)*2 + 1]/*.Len*/;
-
- if (++count < max_count && curlen === nextlen) {
- continue;
-
- } else if (count < min_count) {
- do { send_code(s, curlen, s.bl_tree); } while (--count !== 0);
-
- } else if (curlen !== 0) {
- if (curlen !== prevlen) {
- send_code(s, curlen, s.bl_tree);
- count--;
- }
- //Assert(count >= 3 && count <= 6, " 3_6?");
- send_code(s, REP_3_6, s.bl_tree);
- send_bits(s, count-3, 2);
-
- } else if (count <= 10) {
- send_code(s, REPZ_3_10, s.bl_tree);
- send_bits(s, count-3, 3);
-
- } else {
- send_code(s, REPZ_11_138, s.bl_tree);
- send_bits(s, count-11, 7);
- }
-
- count = 0;
- prevlen = curlen;
- if (nextlen === 0) {
- max_count = 138;
- min_count = 3;
-
- } else if (curlen === nextlen) {
- max_count = 6;
- min_count = 3;
-
- } else {
- max_count = 7;
- min_count = 4;
- }
- }
- }
-
-
- /* ===========================================================================
- * Construct the Huffman tree for the bit lengths and return the index in
- * bl_order of the last bit length code to send.
- */
- function build_bl_tree(s) {
- var max_blindex; /* index of last bit length code of non zero freq */
-
- /* Determine the bit length frequencies for literal and distance trees */
- scan_tree(s, s.dyn_ltree, s.l_desc.max_code);
- scan_tree(s, s.dyn_dtree, s.d_desc.max_code);
-
- /* Build the bit length tree: */
- build_tree(s, s.bl_desc);
- /* opt_len now includes the length of the tree representations, except
- * the lengths of the bit lengths codes and the 5+5+4 bits for the counts.
- */
-
- /* Determine the number of bit length codes to send. The pkzip format
- * requires that at least 4 bit length codes be sent. (appnote.txt says
- * 3 but the actual value used is 4.)
- */
- for (max_blindex = BL_CODES-1; max_blindex >= 3; max_blindex--) {
- if (s.bl_tree[bl_order[max_blindex]*2 + 1]/*.Len*/ !== 0) {
- break;
- }
- }
- /* Update opt_len to include the bit length tree and counts */
- s.opt_len += 3*(max_blindex+1) + 5+5+4;
- //Tracev((stderr, "\ndyn trees: dyn %ld, stat %ld",
- // s->opt_len, s->static_len));
-
- return max_blindex;
- }
-
-
- /* ===========================================================================
- * Send the header for a block using dynamic Huffman trees: the counts, the
- * lengths of the bit length codes, the literal tree and the distance tree.
- * IN assertion: lcodes >= 257, dcodes >= 1, blcodes >= 4.
- */
- function send_all_trees(s, lcodes, dcodes, blcodes)
- // deflate_state *s;
- // int lcodes, dcodes, blcodes; /* number of codes for each tree */
- {
- var rank; /* index in bl_order */
-
- //Assert (lcodes >= 257 && dcodes >= 1 && blcodes >= 4, "not enough codes");
- //Assert (lcodes <= L_CODES && dcodes <= D_CODES && blcodes <= BL_CODES,
- // "too many codes");
- //Tracev((stderr, "\nbl counts: "));
- send_bits(s, lcodes-257, 5); /* not +255 as stated in appnote.txt */
- send_bits(s, dcodes-1, 5);
- send_bits(s, blcodes-4, 4); /* not -3 as stated in appnote.txt */
- for (rank = 0; rank < blcodes; rank++) {
- //Tracev((stderr, "\nbl code %2d ", bl_order[rank]));
- send_bits(s, s.bl_tree[bl_order[rank]*2 + 1]/*.Len*/, 3);
- }
- //Tracev((stderr, "\nbl tree: sent %ld", s->bits_sent));
-
- send_tree(s, s.dyn_ltree, lcodes-1); /* literal tree */
- //Tracev((stderr, "\nlit tree: sent %ld", s->bits_sent));
-
- send_tree(s, s.dyn_dtree, dcodes-1); /* distance tree */
- //Tracev((stderr, "\ndist tree: sent %ld", s->bits_sent));
- }
-
-
- /* ===========================================================================
- * Check if the data type is TEXT or BINARY, using the following algorithm:
- * - TEXT if the two conditions below are satisfied:
- * a) There are no non-portable control characters belonging to the
- * "black list" (0..6, 14..25, 28..31).
- * b) There is at least one printable character belonging to the
- * "white list" (9 {TAB}, 10 {LF}, 13 {CR}, 32..255).
- * - BINARY otherwise.
- * - The following partially-portable control characters form a
- * "gray list" that is ignored in this detection algorithm:
- * (7 {BEL}, 8 {BS}, 11 {VT}, 12 {FF}, 26 {SUB}, 27 {ESC}).
- * IN assertion: the fields Freq of dyn_ltree are set.
- */
- function detect_data_type(s) {
- /* black_mask is the bit mask of black-listed bytes
- * set bits 0..6, 14..25, and 28..31
- * 0xf3ffc07f = binary 11110011111111111100000001111111
- */
- var black_mask = 0xf3ffc07f;
- var n;
-
- /* Check for non-textual ("black-listed") bytes. */
- for (n = 0; n <= 31; n++, black_mask >>>= 1) {
- if ((black_mask & 1) && (s.dyn_ltree[n*2]/*.Freq*/ !== 0)) {
- return Z_BINARY;
- }
- }
-
- /* Check for textual ("white-listed") bytes. */
- if (s.dyn_ltree[9 * 2]/*.Freq*/ !== 0 || s.dyn_ltree[10 * 2]/*.Freq*/ !== 0 ||
- s.dyn_ltree[13 * 2]/*.Freq*/ !== 0) {
- return Z_TEXT;
- }
- for (n = 32; n < LITERALS; n++) {
- if (s.dyn_ltree[n * 2]/*.Freq*/ !== 0) {
- return Z_TEXT;
- }
- }
-
- /* There are no "black-listed" or "white-listed" bytes:
- * this stream either is empty or has tolerated ("gray-listed") bytes only.
- */
- return Z_BINARY;
- }
-
-
- var static_init_done = false;
-
- /* ===========================================================================
- * Initialize the tree data structures for a new zlib stream.
- */
- function _tr_init(s)
- {
-
- if (!static_init_done) {
- tr_static_init();
- static_init_done = true;
- }
-
- s.l_desc = new TreeDesc(s.dyn_ltree, static_l_desc);
- s.d_desc = new TreeDesc(s.dyn_dtree, static_d_desc);
- s.bl_desc = new TreeDesc(s.bl_tree, static_bl_desc);
-
- s.bi_buf = 0;
- s.bi_valid = 0;
-
- /* Initialize the first block of the first file: */
- init_block(s);
- }
-
-
- /* ===========================================================================
- * Send a stored block
- */
- function _tr_stored_block(s, buf, stored_len, last)
- //DeflateState *s;
- //charf *buf; /* input block */
- //ulg stored_len; /* length of input block */
- //int last; /* one if this is the last block for a file */
- {
- send_bits(s, (STORED_BLOCK<<1)+(last ? 1 : 0), 3); /* send block type */
- copy_block(s, buf, stored_len, true); /* with header */
- }
-
-
- /* ===========================================================================
- * Send one empty static block to give enough lookahead for inflate.
- * This takes 10 bits, of which 7 may remain in the bit buffer.
- */
- function _tr_align(s) {
- send_bits(s, STATIC_TREES<<1, 3);
- send_code(s, END_BLOCK, static_ltree);
- bi_flush(s);
- }
-
-
- /* ===========================================================================
- * Determine the best encoding for the current block: dynamic trees, static
- * trees or store, and output the encoded block to the zip file.
- */
- function _tr_flush_block(s, buf, stored_len, last)
- //DeflateState *s;
- //charf *buf; /* input block, or NULL if too old */
- //ulg stored_len; /* length of input block */
- //int last; /* one if this is the last block for a file */
- {
- var opt_lenb, static_lenb; /* opt_len and static_len in bytes */
- var max_blindex = 0; /* index of last bit length code of non zero freq */
-
- /* Build the Huffman trees unless a stored block is forced */
- if (s.level > 0) {
-
- /* Check if the file is binary or text */
- if (s.strm.data_type === Z_UNKNOWN) {
- s.strm.data_type = detect_data_type(s);
- }
-
- /* Construct the literal and distance trees */
- build_tree(s, s.l_desc);
- // Tracev((stderr, "\nlit data: dyn %ld, stat %ld", s->opt_len,
- // s->static_len));
-
- build_tree(s, s.d_desc);
- // Tracev((stderr, "\ndist data: dyn %ld, stat %ld", s->opt_len,
- // s->static_len));
- /* At this point, opt_len and static_len are the total bit lengths of
- * the compressed block data, excluding the tree representations.
- */
-
- /* Build the bit length tree for the above two trees, and get the index
- * in bl_order of the last bit length code to send.
- */
- max_blindex = build_bl_tree(s);
-
- /* Determine the best encoding. Compute the block lengths in bytes. */
- opt_lenb = (s.opt_len+3+7) >>> 3;
- static_lenb = (s.static_len+3+7) >>> 3;
-
- // Tracev((stderr, "\nopt %lu(%lu) stat %lu(%lu) stored %lu lit %u ",
- // opt_lenb, s->opt_len, static_lenb, s->static_len, stored_len,
- // s->last_lit));
-
- if (static_lenb <= opt_lenb) { opt_lenb = static_lenb; }
-
- } else {
- // Assert(buf != (char*)0, "lost buf");
- opt_lenb = static_lenb = stored_len + 5; /* force a stored block */
- }
-
- if ((stored_len+4 <= opt_lenb) && (buf !== -1)) {
- /* 4: two words for the lengths */
-
- /* The test buf != NULL is only necessary if LIT_BUFSIZE > WSIZE.
- * Otherwise we can't have processed more than WSIZE input bytes since
- * the last block flush, because compression would have been
- * successful. If LIT_BUFSIZE <= WSIZE, it is never too late to
- * transform a block into a stored block.
- */
- _tr_stored_block(s, buf, stored_len, last);
-
- } else if (s.strategy === Z_FIXED || static_lenb === opt_lenb) {
-
- send_bits(s, (STATIC_TREES<<1) + (last ? 1 : 0), 3);
- compress_block(s, static_ltree, static_dtree);
-
- } else {
- send_bits(s, (DYN_TREES<<1) + (last ? 1 : 0), 3);
- send_all_trees(s, s.l_desc.max_code+1, s.d_desc.max_code+1, max_blindex+1);
- compress_block(s, s.dyn_ltree, s.dyn_dtree);
- }
- // Assert (s->compressed_len == s->bits_sent, "bad compressed size");
- /* The above check is made mod 2^32, for files larger than 512 MB
- * and uLong implemented on 32 bits.
- */
- init_block(s);
-
- if (last) {
- bi_windup(s);
- }
- // Tracev((stderr,"\ncomprlen %lu(%lu) ", s->compressed_len>>3,
- // s->compressed_len-7*last));
- }
-
- /* ===========================================================================
- * Save the match info and tally the frequency counts. Return true if
- * the current block must be flushed.
- */
- function _tr_tally(s, dist, lc)
- // deflate_state *s;
- // unsigned dist; /* distance of matched string */
- // unsigned lc; /* match length-MIN_MATCH or unmatched char (if dist==0) */
- {
- //var out_length, in_length, dcode;
-
- s.pending_buf[s.d_buf + s.last_lit * 2] = (dist >>> 8) & 0xff;
- s.pending_buf[s.d_buf + s.last_lit * 2 + 1] = dist & 0xff;
-
- s.pending_buf[s.l_buf + s.last_lit] = lc & 0xff;
- s.last_lit++;
-
- if (dist === 0) {
- /* lc is the unmatched char */
- s.dyn_ltree[lc*2]/*.Freq*/++;
- } else {
- s.matches++;
- /* Here, lc is the match length - MIN_MATCH */
- dist--; /* dist = match distance - 1 */
- //Assert((ush)dist < (ush)MAX_DIST(s) &&
- // (ush)lc <= (ush)(MAX_MATCH-MIN_MATCH) &&
- // (ush)d_code(dist) < (ush)D_CODES, "_tr_tally: bad match");
-
- s.dyn_ltree[(_length_code[lc]+LITERALS+1) * 2]/*.Freq*/++;
- s.dyn_dtree[d_code(dist) * 2]/*.Freq*/++;
- }
-
- // (!) This block is disabled in zlib defailts,
- // don't enable it for binary compatibility
-
- //#ifdef TRUNCATE_BLOCK
- // /* Try to guess if it is profitable to stop the current block here */
- // if ((s.last_lit & 0x1fff) === 0 && s.level > 2) {
- // /* Compute an upper bound for the compressed length */
- // out_length = s.last_lit*8;
- // in_length = s.strstart - s.block_start;
- //
- // for (dcode = 0; dcode < D_CODES; dcode++) {
- // out_length += s.dyn_dtree[dcode*2]/*.Freq*/ * (5 + extra_dbits[dcode]);
- // }
- // out_length >>>= 3;
- // //Tracev((stderr,"\nlast_lit %u, in %ld, out ~%ld(%ld%%) ",
- // // s->last_lit, in_length, out_length,
- // // 100L - out_length*100L/in_length));
- // if (s.matches < (s.last_lit>>1)/*int /2*/ && out_length < (in_length>>1)/*int /2*/) {
- // return true;
- // }
- // }
- //#endif
-
- return (s.last_lit === s.lit_bufsize-1);
- /* We avoid equality with lit_bufsize because of wraparound at 64K
- * on 16 bit machines and because stored blocks are restricted to
- * 64K-1 bytes.
- */
- }
-
- exports._tr_init = _tr_init;
- exports._tr_stored_block = _tr_stored_block;
- exports._tr_flush_block = _tr_flush_block;
- exports._tr_tally = _tr_tally;
- exports._tr_align = _tr_align;
- },{"../utils/common":27}],39:[function(_dereq_,module,exports){
- 'use strict';
-
-
- function ZStream() {
- /* next input byte */
- this.input = null; // JS specific, because we have no pointers
- this.next_in = 0;
- /* number of bytes available at input */
- this.avail_in = 0;
- /* total number of input bytes read so far */
- this.total_in = 0;
- /* next output byte should be put there */
- this.output = null; // JS specific, because we have no pointers
- this.next_out = 0;
- /* remaining free space at output */
- this.avail_out = 0;
- /* total number of bytes output so far */
- this.total_out = 0;
- /* last error message, NULL if no error */
- this.msg = ''/*Z_NULL*/;
- /* not visible by applications */
- this.state = null;
- /* best guess about the data type: binary or text */
- this.data_type = 2/*Z_UNKNOWN*/;
- /* adler32 value of the uncompressed data */
- this.adler = 0;
- }
-
- module.exports = ZStream;
- },{}]},{},[9])
- (9)
- }));
-
-
- /***/ }),
-
- /***/ "./node_modules/xlsx/xlsx.js":
- /*!***********************************!*\
- !*** ./node_modules/xlsx/xlsx.js ***!
- \***********************************/
- /***/ ((module, exports, __webpack_require__) => {
-
- /*! xlsx.js (C) 2013-present SheetJS -- http://sheetjs.com */
- /* vim: set ts=2: */
- /*exported XLSX */
- /*global global, exports, module, require:false, process:false, Buffer:false, ArrayBuffer:false */
- var XLSX = {};
- function make_xlsx_lib(XLSX){
- XLSX.version = '0.17.1';
- var current_codepage = 1200, current_ansi = 1252;
- /*global cptable:true, window */
- if(true) {
- if(typeof cptable === 'undefined') {
- if(typeof __webpack_require__.g !== 'undefined') __webpack_require__.g.cptable = __webpack_require__(/*! ./dist/cpexcel.js */ "./node_modules/xlsx/dist/cpexcel.js");
- else if(typeof window !== 'undefined') window.cptable = __webpack_require__(/*! ./dist/cpexcel.js */ "./node_modules/xlsx/dist/cpexcel.js");
- }
- }
-
- var VALID_ANSI = [ 874, 932, 936, 949, 950 ];
- for(var i = 0; i <= 8; ++i) VALID_ANSI.push(1250 + i);
- /* ECMA-376 Part I 18.4.1 charset to codepage mapping */
- var CS2CP = ({
- 0: 1252, /* ANSI */
- 1: 65001, /* DEFAULT */
- 2: 65001, /* SYMBOL */
- 77: 10000, /* MAC */
- 128: 932, /* SHIFTJIS */
- 129: 949, /* HANGUL */
- 130: 1361, /* JOHAB */
- 134: 936, /* GB2312 */
- 136: 950, /* CHINESEBIG5 */
- 161: 1253, /* GREEK */
- 162: 1254, /* TURKISH */
- 163: 1258, /* VIETNAMESE */
- 177: 1255, /* HEBREW */
- 178: 1256, /* ARABIC */
- 186: 1257, /* BALTIC */
- 204: 1251, /* RUSSIAN */
- 222: 874, /* THAI */
- 238: 1250, /* EASTEUROPE */
- 255: 1252, /* OEM */
- 69: 6969 /* MISC */
- });
-
- var set_ansi = function(cp) { if(VALID_ANSI.indexOf(cp) == -1) return; current_ansi = CS2CP[0] = cp; };
- function reset_ansi() { set_ansi(1252); }
-
- var set_cp = function(cp) { current_codepage = cp; set_ansi(cp); };
- function reset_cp() { set_cp(1200); reset_ansi(); }
-
- function char_codes(data) { var o = []; for(var i = 0, len = data.length; i < len; ++i) o[i] = data.charCodeAt(i); return o; }
-
- function utf16leread(data) {
- var o = [];
- for(var i = 0; i < (data.length>>1); ++i) o[i] = String.fromCharCode(data.charCodeAt(2*i) + (data.charCodeAt(2*i+1)<<8));
- return o.join("");
- }
- function utf16beread(data) {
- var o = [];
- for(var i = 0; i < (data.length>>1); ++i) o[i] = String.fromCharCode(data.charCodeAt(2*i+1) + (data.charCodeAt(2*i)<<8));
- return o.join("");
- }
-
- var debom = function(data) {
- var c1 = data.charCodeAt(0), c2 = data.charCodeAt(1);
- if(c1 == 0xFF && c2 == 0xFE) return utf16leread(data.slice(2));
- if(c1 == 0xFE && c2 == 0xFF) return utf16beread(data.slice(2));
- if(c1 == 0xFEFF) return data.slice(1);
- return data;
- };
-
- var _getchar = function _gc1(x) { return String.fromCharCode(x); };
- var _getansi = function _ga1(x) { return String.fromCharCode(x); };
- if(typeof cptable !== 'undefined') {
- set_cp = function(cp) { current_codepage = cp; set_ansi(cp); };
- debom = function(data) {
- if(data.charCodeAt(0) === 0xFF && data.charCodeAt(1) === 0xFE) { return cptable.utils.decode(1200, char_codes(data.slice(2))); }
- return data;
- };
- _getchar = function _gc2(x) {
- if(current_codepage === 1200) return String.fromCharCode(x);
- return cptable.utils.decode(current_codepage, [x&255,x>>8])[0];
- };
- _getansi = function _ga2(x) {
- return cptable.utils.decode(current_ansi, [x])[0];
- };
- }
- var DENSE = null;
- var DIF_XL = true;
- var Base64 = (function make_b64(){
- var map = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=";
- return {
- encode: function(input) {
- var o = "";
- var c1=0, c2=0, c3=0, e1=0, e2=0, e3=0, e4=0;
- for(var i = 0; i < input.length; ) {
- c1 = input.charCodeAt(i++);
- e1 = (c1 >> 2);
-
- c2 = input.charCodeAt(i++);
- e2 = ((c1 & 3) << 4) | (c2 >> 4);
-
- c3 = input.charCodeAt(i++);
- e3 = ((c2 & 15) << 2) | (c3 >> 6);
- e4 = (c3 & 63);
- if (isNaN(c2)) { e3 = e4 = 64; }
- else if (isNaN(c3)) { e4 = 64; }
- o += map.charAt(e1) + map.charAt(e2) + map.charAt(e3) + map.charAt(e4);
- }
- return o;
- },
- decode: function b64_decode(input) {
- var o = "";
- var c1=0, c2=0, c3=0, e1=0, e2=0, e3=0, e4=0;
- input = input.replace(/[^\w\+\/\=]/g, "");
- for(var i = 0; i < input.length;) {
- e1 = map.indexOf(input.charAt(i++));
- e2 = map.indexOf(input.charAt(i++));
- c1 = (e1 << 2) | (e2 >> 4);
- o += String.fromCharCode(c1);
-
- e3 = map.indexOf(input.charAt(i++));
- c2 = ((e2 & 15) << 4) | (e3 >> 2);
- if (e3 !== 64) { o += String.fromCharCode(c2); }
-
- e4 = map.indexOf(input.charAt(i++));
- c3 = ((e3 & 3) << 6) | e4;
- if (e4 !== 64) { o += String.fromCharCode(c3); }
- }
- return o;
- }
- };
- })();
- var has_buf = (typeof Buffer !== 'undefined' && typeof process !== 'undefined' && typeof process.versions !== 'undefined' && !!process.versions.node);
-
- var Buffer_from = function(){};
-
- if(typeof Buffer !== 'undefined') {
- var nbfs = !Buffer.from;
- if(!nbfs) try { Buffer.from("foo", "utf8"); } catch(e) { nbfs = true; }
- Buffer_from = nbfs ? function(buf, enc) { return (enc) ? new Buffer(buf, enc) : new Buffer(buf); } : Buffer.from.bind(Buffer);
- // $FlowIgnore
- if(!Buffer.alloc) Buffer.alloc = function(n) { return new Buffer(n); };
- // $FlowIgnore
- if(!Buffer.allocUnsafe) Buffer.allocUnsafe = function(n) { return new Buffer(n); };
- }
-
- function new_raw_buf(len) {
- /* jshint -W056 */
- return has_buf ? Buffer.alloc(len) : new Array(len);
- /* jshint +W056 */
- }
-
- function new_unsafe_buf(len) {
- /* jshint -W056 */
- return has_buf ? Buffer.allocUnsafe(len) : new Array(len);
- /* jshint +W056 */
- }
-
- var s2a = function s2a(s) {
- if(has_buf) return Buffer_from(s, "binary");
- return s.split("").map(function(x){ return x.charCodeAt(0) & 0xff; });
- };
-
- function s2ab(s) {
- if(typeof ArrayBuffer === 'undefined') return s2a(s);
- var buf = new ArrayBuffer(s.length), view = new Uint8Array(buf);
- for (var i=0; i!=s.length; ++i) view[i] = s.charCodeAt(i) & 0xFF;
- return buf;
- }
-
- function a2s(data) {
- if(Array.isArray(data)) return data.map(function(c) { return String.fromCharCode(c); }).join("");
- var o = []; for(var i = 0; i < data.length; ++i) o[i] = String.fromCharCode(data[i]); return o.join("");
- }
-
- function a2u(data) {
- if(typeof Uint8Array === 'undefined') throw new Error("Unsupported");
- return new Uint8Array(data);
- }
-
- function ab2a(data) {
- if(typeof ArrayBuffer == 'undefined') throw new Error("Unsupported");
- if(data instanceof ArrayBuffer) return ab2a(new Uint8Array(data));
- var o = new Array(data.length);
- for(var i = 0; i < data.length; ++i) o[i] = data[i];
- return o;
- }
-
- var bconcat = function(bufs) { return [].concat.apply([], bufs); };
-
- var chr0 = /\u0000/g, chr1 = /[\u0001-\u0006]/g;
- /* ssf.js (C) 2013-present SheetJS -- http://sheetjs.com */
- /*jshint -W041 */
- var SSF = ({});
- var make_ssf = function make_ssf(SSF){
- SSF.version = '0.11.2';
- function _strrev(x) { var o = "", i = x.length-1; while(i>=0) o += x.charAt(i--); return o; }
- function fill(c,l) { var o = ""; while(o.length < l) o+=c; return o; }
- function pad0(v,d){var t=""+v; return t.length>=d?t:fill('0',d-t.length)+t;}
- function pad_(v,d){var t=""+v;return t.length>=d?t:fill(' ',d-t.length)+t;}
- function rpad_(v,d){var t=""+v; return t.length>=d?t:t+fill(' ',d-t.length);}
- function pad0r1(v,d){var t=""+Math.round(v); return t.length>=d?t:fill('0',d-t.length)+t;}
- function pad0r2(v,d){var t=""+v; return t.length>=d?t:fill('0',d-t.length)+t;}
- var p2_32 = Math.pow(2,32);
- function pad0r(v,d){if(v>p2_32||v<-p2_32) return pad0r1(v,d); var i = Math.round(v); return pad0r2(i,d); }
- 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; }
- var days = [
- ['Sun', 'Sunday'],
- ['Mon', 'Monday'],
- ['Tue', 'Tuesday'],
- ['Wed', 'Wednesday'],
- ['Thu', 'Thursday'],
- ['Fri', 'Friday'],
- ['Sat', 'Saturday']
- ];
- var months = [
- ['J', 'Jan', 'January'],
- ['F', 'Feb', 'February'],
- ['M', 'Mar', 'March'],
- ['A', 'Apr', 'April'],
- ['M', 'May', 'May'],
- ['J', 'Jun', 'June'],
- ['J', 'Jul', 'July'],
- ['A', 'Aug', 'August'],
- ['S', 'Sep', 'September'],
- ['O', 'Oct', 'October'],
- ['N', 'Nov', 'November'],
- ['D', 'Dec', 'December']
- ];
- function init_table(t) {
- t[0]= 'General';
- t[1]= '0';
- t[2]= '0.00';
- t[3]= '#,##0';
- t[4]= '#,##0.00';
- t[9]= '0%';
- t[10]= '0.00%';
- t[11]= '0.00E+00';
- t[12]= '# ?/?';
- t[13]= '# ??/??';
- t[14]= 'm/d/yy';
- t[15]= 'd-mmm-yy';
- t[16]= 'd-mmm';
- t[17]= 'mmm-yy';
- t[18]= 'h:mm AM/PM';
- t[19]= 'h:mm:ss AM/PM';
- t[20]= 'h:mm';
- t[21]= 'h:mm:ss';
- t[22]= 'm/d/yy h:mm';
- t[37]= '#,##0 ;(#,##0)';
- t[38]= '#,##0 ;[Red](#,##0)';
- t[39]= '#,##0.00;(#,##0.00)';
- t[40]= '#,##0.00;[Red](#,##0.00)';
- t[45]= 'mm:ss';
- t[46]= '[h]:mm:ss';
- t[47]= 'mmss.0';
- t[48]= '##0.0E+0';
- t[49]= '@';
- t[56]= '"上午/下午 "hh"時"mm"分"ss"秒 "';
- }
-
- var table_fmt = {};
- init_table(table_fmt);
- /* Defaults determined by systematically testing in Excel 2019 */
-
- /* These formats appear to default to other formats in the table */
- var default_map = [];
- var defi = 0;
-
- // 5 -> 37 ... 8 -> 40
- for(defi = 5; defi <= 8; ++defi) default_map[defi] = 32 + defi;
-
- // 23 -> 0 ... 26 -> 0
- for(defi = 23; defi <= 26; ++defi) default_map[defi] = 0;
-
- // 27 -> 14 ... 31 -> 14
- for(defi = 27; defi <= 31; ++defi) default_map[defi] = 14;
- // 50 -> 14 ... 58 -> 14
- for(defi = 50; defi <= 58; ++defi) default_map[defi] = 14;
-
- // 59 -> 1 ... 62 -> 4
- for(defi = 59; defi <= 62; ++defi) default_map[defi] = defi - 58;
- // 67 -> 9 ... 68 -> 10
- for(defi = 67; defi <= 68; ++defi) default_map[defi] = defi - 58;
- // 72 -> 14 ... 75 -> 17
- for(defi = 72; defi <= 75; ++defi) default_map[defi] = defi - 58;
-
- // 69 -> 12 ... 71 -> 14
- for(defi = 67; defi <= 68; ++defi) default_map[defi] = defi - 57;
-
- // 76 -> 20 ... 78 -> 22
- for(defi = 76; defi <= 78; ++defi) default_map[defi] = defi - 56;
-
- // 79 -> 45 ... 81 -> 47
- for(defi = 79; defi <= 81; ++defi) default_map[defi] = defi - 34;
-
- // 82 -> 0 ... 65536 -> 0 (omitted)
-
- /* These formats technically refer to Accounting formats with no equivalent */
- var default_str = [];
-
- // 5 -- Currency, 0 decimal, black negative
- default_str[5] = default_str[63] = '"$"#,##0_);\\("$"#,##0\\)';
- // 6 -- Currency, 0 decimal, red negative
- default_str[6] = default_str[64] = '"$"#,##0_);[Red]\\("$"#,##0\\)';
- // 7 -- Currency, 2 decimal, black negative
- default_str[7] = default_str[65] = '"$"#,##0.00_);\\("$"#,##0.00\\)';
- // 8 -- Currency, 2 decimal, red negative
- default_str[8] = default_str[66] = '"$"#,##0.00_);[Red]\\("$"#,##0.00\\)';
-
- // 41 -- Accounting, 0 decimal, No Symbol
- default_str[41] = '_(* #,##0_);_(* \\(#,##0\\);_(* "-"_);_(@_)';
- // 42 -- Accounting, 0 decimal, $ Symbol
- default_str[42] = '_("$"* #,##0_);_("$"* \\(#,##0\\);_("$"* "-"_);_(@_)';
- // 43 -- Accounting, 2 decimal, No Symbol
- default_str[43] = '_(* #,##0.00_);_(* \\(#,##0.00\\);_(* "-"??_);_(@_)';
- // 44 -- Accounting, 2 decimal, $ Symbol
- default_str[44] = '_("$"* #,##0.00_);_("$"* \\(#,##0.00\\);_("$"* "-"??_);_(@_)';
- function frac(x, D, mixed) {
- var sgn = x < 0 ? -1 : 1;
- var B = x * sgn;
- var P_2 = 0, P_1 = 1, P = 0;
- var Q_2 = 1, Q_1 = 0, Q = 0;
- var A = Math.floor(B);
- while(Q_1 < D) {
- A = Math.floor(B);
- P = A * P_1 + P_2;
- Q = A * Q_1 + Q_2;
- if((B - A) < 0.00000005) break;
- B = 1 / (B - A);
- P_2 = P_1; P_1 = P;
- Q_2 = Q_1; Q_1 = Q;
- }
- if(Q > D) { if(Q_1 > D) { Q = Q_2; P = P_2; } else { Q = Q_1; P = P_1; } }
- if(!mixed) return [0, sgn * P, Q];
- var q = Math.floor(sgn * P/Q);
- return [q, sgn*P - q*Q, Q];
- }
- function parse_date_code(v,opts,b2) {
- if(v > 2958465 || v < 0) return null;
- var date = (v|0), time = Math.floor(86400 * (v - date)), dow=0;
- var dout=[];
- 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};
- if(Math.abs(out.u) < 1e-6) out.u = 0;
- if(opts && opts.date1904) date += 1462;
- if(out.u > 0.9999) {
- out.u = 0;
- if(++time == 86400) { out.T = time = 0; ++date; ++out.D; }
- }
- if(date === 60) {dout = b2 ? [1317,10,29] : [1900,2,29]; dow=3;}
- else if(date === 0) {dout = b2 ? [1317,8,29] : [1900,1,0]; dow=6;}
- else {
- if(date > 60) --date;
- /* 1 = Jan 1 1900 in Gregorian */
- var d = new Date(1900, 0, 1);
- d.setDate(d.getDate() + date - 1);
- dout = [d.getFullYear(), d.getMonth()+1,d.getDate()];
- dow = d.getDay();
- if(date < 60) dow = (dow + 6) % 7;
- if(b2) dow = fix_hijri(d, dout);
- }
- out.y = dout[0]; out.m = dout[1]; out.d = dout[2];
- out.S = time % 60; time = Math.floor(time / 60);
- out.M = time % 60; time = Math.floor(time / 60);
- out.H = time;
- out.q = dow;
- return out;
- }
- SSF.parse_date_code = parse_date_code;
- var basedate = new Date(1899, 11, 31, 0, 0, 0);
- var dnthresh = basedate.getTime();
- var base1904 = new Date(1900, 2, 1, 0, 0, 0);
- function datenum_local(v, date1904) {
- var epoch = v.getTime();
- if(date1904) epoch -= 1461*24*60*60*1000;
- else if(v >= base1904) epoch += 24*60*60*1000;
- return (epoch - (dnthresh + (v.getTimezoneOffset() - basedate.getTimezoneOffset()) * 60000)) / (24 * 60 * 60 * 1000);
- }
- /* The longest 32-bit integer text is "-4294967296", exactly 11 chars */
- function general_fmt_int(v) { return v.toString(10); }
- SSF._general_int = general_fmt_int;
-
- /* ECMA-376 18.8.30 numFmt*/
- /* Note: `toPrecision` uses standard form when prec > E and E >= -6 */
- var general_fmt_num = (function make_general_fmt_num() {
- var trailing_zeroes_and_decimal = /(?:\.0*|(\.\d*[1-9])0+)$/;
- function strip_decimal(o) {
- return (o.indexOf(".") == -1) ? o : o.replace(trailing_zeroes_and_decimal, "$1");
- }
-
- /* General Exponential always shows 2 digits exp and trims the mantissa */
- var mantissa_zeroes_and_decimal = /(?:\.0*|(\.\d*[1-9])0+)[Ee]/;
- var exp_with_single_digit = /(E[+-])(\d)$/;
- function normalize_exp(o) {
- if(o.indexOf("E") == -1) return o;
- return o.replace(mantissa_zeroes_and_decimal,"$1E").replace(exp_with_single_digit,"$10$2");
- }
-
- /* exponent >= -9 and <= 9 */
- function small_exp(v) {
- var w = (v<0?12:11);
- var o = strip_decimal(v.toFixed(12)); if(o.length <= w) return o;
- o = v.toPrecision(10); if(o.length <= w) return o;
- return v.toExponential(5);
- }
-
- /* exponent >= 11 or <= -10 likely exponential */
- function large_exp(v) {
- var o = strip_decimal(v.toFixed(11));
- return (o.length > (v<0?12:11) || o === "0" || o === "-0") ? v.toPrecision(6) : o;
- }
-
- function general_fmt_num_base(v) {
- var V = Math.floor(Math.log(Math.abs(v))*Math.LOG10E), o;
-
- if(V >= -4 && V <= -1) o = v.toPrecision(10+V);
- else if(Math.abs(V) <= 9) o = small_exp(v);
- else if(V === 10) o = v.toFixed(10).substr(0,12);
- else o = large_exp(v);
-
- return strip_decimal(normalize_exp(o.toUpperCase()));
- }
-
- return general_fmt_num_base;
- })();
- SSF._general_num = general_fmt_num;
-
- /*
- "General" rules:
- - text is passed through ("@")
- - booleans are rendered as TRUE/FALSE
- - "up to 11 characters" displayed for numbers
- - Default date format (code 14) used for Dates
-
- TODO: technically the display depends on the width of the cell
- */
- function general_fmt(v, opts) {
- switch(typeof v) {
- case 'string': return v;
- case 'boolean': return v ? "TRUE" : "FALSE";
- case 'number': return (v|0) === v ? v.toString(10) : general_fmt_num(v);
- case 'undefined': return "";
- case 'object':
- if(v == null) return "";
- if(v instanceof Date) return format(14, datenum_local(v, opts && opts.date1904), opts);
- }
- throw new Error("unsupported value in General format: " + v);
- }
- SSF._general = general_fmt;
- function fix_hijri(date, o) {
- /* TODO: properly adjust y/m/d and */
- o[0] -= 581;
- var dow = date.getDay();
- if(date < 60) dow = (dow + 6) % 7;
- return dow;
- }
- //var THAI_DIGITS = "\u0E50\u0E51\u0E52\u0E53\u0E54\u0E55\u0E56\u0E57\u0E58\u0E59".split("");
- /*jshint -W086 */
- function write_date(type, fmt, val, ss0) {
- var o="", ss=0, tt=0, y = val.y, out, outl = 0;
- switch(type) {
- case 98: /* 'b' buddhist year */
- y = val.y + 543;
- /* falls through */
- case 121: /* 'y' year */
- switch(fmt.length) {
- case 1: case 2: out = y % 100; outl = 2; break;
- default: out = y % 10000; outl = 4; break;
- } break;
- case 109: /* 'm' month */
- switch(fmt.length) {
- case 1: case 2: out = val.m; outl = fmt.length; break;
- case 3: return months[val.m-1][1];
- case 5: return months[val.m-1][0];
- default: return months[val.m-1][2];
- } break;
- case 100: /* 'd' day */
- switch(fmt.length) {
- case 1: case 2: out = val.d; outl = fmt.length; break;
- case 3: return days[val.q][0];
- default: return days[val.q][1];
- } break;
- case 104: /* 'h' 12-hour */
- switch(fmt.length) {
- case 1: case 2: out = 1+(val.H+11)%12; outl = fmt.length; break;
- default: throw 'bad hour format: ' + fmt;
- } break;
- case 72: /* 'H' 24-hour */
- switch(fmt.length) {
- case 1: case 2: out = val.H; outl = fmt.length; break;
- default: throw 'bad hour format: ' + fmt;
- } break;
- case 77: /* 'M' minutes */
- switch(fmt.length) {
- case 1: case 2: out = val.M; outl = fmt.length; break;
- default: throw 'bad minute format: ' + fmt;
- } break;
- case 115: /* 's' seconds */
- if(fmt != 's' && fmt != 'ss' && fmt != '.0' && fmt != '.00' && fmt != '.000') throw 'bad second format: ' + fmt;
- if(val.u === 0 && (fmt == "s" || fmt == "ss")) return pad0(val.S, fmt.length);
- if(ss0 >= 2) tt = ss0 === 3 ? 1000 : 100;
- else tt = ss0 === 1 ? 10 : 1;
- ss = Math.round((tt)*(val.S + val.u));
- if(ss >= 60*tt) ss = 0;
- if(fmt === 's') return ss === 0 ? "0" : ""+ss/tt;
- o = pad0(ss,2 + ss0);
- if(fmt === 'ss') return o.substr(0,2);
- return "." + o.substr(2,fmt.length-1);
- case 90: /* 'Z' absolute time */
- switch(fmt) {
- case '[h]': case '[hh]': out = val.D*24+val.H; break;
- case '[m]': case '[mm]': out = (val.D*24+val.H)*60+val.M; break;
- case '[s]': case '[ss]': out = ((val.D*24+val.H)*60+val.M)*60+Math.round(val.S+val.u); break;
- default: throw 'bad abstime format: ' + fmt;
- } outl = fmt.length === 3 ? 1 : 2; break;
- case 101: /* 'e' era */
- out = y; outl = 1; break;
- }
- var outstr = outl > 0 ? pad0(out, outl) : "";
- return outstr;
- }
- /*jshint +W086 */
- function commaify(s) {
- var w = 3;
- if(s.length <= w) return s;
- var j = (s.length % w), o = s.substr(0,j);
- for(; j!=s.length; j+=w) o+=(o.length > 0 ? "," : "") + s.substr(j,w);
- return o;
- }
- var write_num = (function make_write_num(){
- var pct1 = /%/g;
- function write_num_pct(type, fmt, val){
- var sfmt = fmt.replace(pct1,""), mul = fmt.length - sfmt.length;
- return write_num(type, sfmt, val * Math.pow(10,2*mul)) + fill("%",mul);
- }
- function write_num_cm(type, fmt, val){
- var idx = fmt.length - 1;
- while(fmt.charCodeAt(idx-1) === 44) --idx;
- return write_num(type, fmt.substr(0,idx), val / Math.pow(10,3*(fmt.length-idx)));
- }
- function write_num_exp(fmt, val){
- var o;
- var idx = fmt.indexOf("E") - fmt.indexOf(".") - 1;
- if(fmt.match(/^#+0.0E\+0$/)) {
- if(val == 0) return "0.0E+0";
- else if(val < 0) return "-" + write_num_exp(fmt, -val);
- var period = fmt.indexOf("."); if(period === -1) period=fmt.indexOf('E');
- var ee = Math.floor(Math.log(val)*Math.LOG10E)%period;
- if(ee < 0) ee += period;
- o = (val/Math.pow(10,ee)).toPrecision(idx+1+(period+ee)%period);
- if(o.indexOf("e") === -1) {
- var fakee = Math.floor(Math.log(val)*Math.LOG10E);
- if(o.indexOf(".") === -1) o = o.charAt(0) + "." + o.substr(1) + "E+" + (fakee - o.length+ee);
- else o += "E+" + (fakee - ee);
- while(o.substr(0,2) === "0.") {
- o = o.charAt(0) + o.substr(2,period) + "." + o.substr(2+period);
- o = o.replace(/^0+([1-9])/,"$1").replace(/^0+\./,"0.");
- }
- o = o.replace(/\+-/,"-");
- }
- o = o.replace(/^([+-]?)(\d*)\.(\d*)[Ee]/,function($$,$1,$2,$3) { return $1 + $2 + $3.substr(0,(period+ee)%period) + "." + $3.substr(ee) + "E"; });
- } else o = val.toExponential(idx);
- if(fmt.match(/E\+00$/) && o.match(/e[+-]\d$/)) o = o.substr(0,o.length-1) + "0" + o.charAt(o.length-1);
- if(fmt.match(/E\-/) && o.match(/e\+/)) o = o.replace(/e\+/,"e");
- return o.replace("e","E");
- }
- var frac1 = /# (\?+)( ?)\/( ?)(\d+)/;
- function write_num_f1(r, aval, sign) {
- var den = parseInt(r[4],10), rr = Math.round(aval * den), base = Math.floor(rr/den);
- var myn = (rr - base*den), myd = den;
- 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));
- }
- function write_num_f2(r, aval, sign) {
- return sign + (aval === 0 ? "" : ""+aval) + fill(" ", r[1].length + 2 + r[4].length);
- }
- var dec1 = /^#*0*\.([0#]+)/;
- var closeparen = /\).*[0#]/;
- var phone = /\(###\) ###\\?-####/;
- function hashq(str) {
- var o = "", cc;
- for(var i = 0; i != str.length; ++i) switch((cc=str.charCodeAt(i))) {
- case 35: break;
- case 63: o+= " "; break;
- case 48: o+= "0"; break;
- default: o+= String.fromCharCode(cc);
- }
- return o;
- }
- function rnd(val, d) { var dd = Math.pow(10,d); return ""+(Math.round(val * dd)/dd); }
- function dec(val, d) {
- var _frac = val - Math.floor(val), dd = Math.pow(10,d);
- if (d < ('' + Math.round(_frac * dd)).length) return 0;
- return Math.round(_frac * dd);
- }
- function carry(val, d) {
- if (d < ('' + Math.round((val-Math.floor(val))*Math.pow(10,d))).length) {
- return 1;
- }
- return 0;
- }
- function flr(val) {
- if(val < 2147483647 && val > -2147483648) return ""+(val >= 0 ? (val|0) : (val-1|0));
- return ""+Math.floor(val);
- }
- function write_num_flt(type, fmt, val) {
- if(type.charCodeAt(0) === 40 && !fmt.match(closeparen)) {
- var ffmt = fmt.replace(/\( */,"").replace(/ \)/,"").replace(/\)/,"");
- if(val >= 0) return write_num_flt('n', ffmt, val);
- return '(' + write_num_flt('n', ffmt, -val) + ')';
- }
- if(fmt.charCodeAt(fmt.length - 1) === 44) return write_num_cm(type, fmt, val);
- if(fmt.indexOf('%') !== -1) return write_num_pct(type, fmt, val);
- if(fmt.indexOf('E') !== -1) return write_num_exp(fmt, val);
- if(fmt.charCodeAt(0) === 36) return "$"+write_num_flt(type,fmt.substr(fmt.charAt(1)==' '?2:1),val);
- var o;
- var r, ri, ff, aval = Math.abs(val), sign = val < 0 ? "-" : "";
- if(fmt.match(/^00+$/)) return sign + pad0r(aval,fmt.length);
- if(fmt.match(/^[#?]+$/)) {
- o = pad0r(val,0); if(o === "0") o = "";
- return o.length > fmt.length ? o : hashq(fmt.substr(0,fmt.length-o.length)) + o;
- }
- if((r = fmt.match(frac1))) return write_num_f1(r, aval, sign);
- if(fmt.match(/^#+0+$/)) return sign + pad0r(aval,fmt.length - fmt.indexOf("0"));
- if((r = fmt.match(dec1))) {
- 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); });
- return fmt.indexOf("0.") !== -1 ? o : o.replace(/^0\./,".");
- }
- fmt = fmt.replace(/^#+([0.])/, "$1");
- if((r = fmt.match(/^(0*)\.(#*)$/))) {
- return sign + rnd(aval, r[2].length).replace(/\.(\d*[1-9])0*$/,".$1").replace(/^(-?\d*)$/,"$1.").replace(/^0\./,r[1].length?"0.":".");
- }
- if((r = fmt.match(/^#{1,3},##0(\.?)$/))) return sign + commaify(pad0r(aval,0));
- if((r = fmt.match(/^#,##0\.([#0]*0)$/))) {
- 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);
- }
- if((r = fmt.match(/^#,#*,#0/))) return write_num_flt(type,fmt.replace(/^#,#*,/,""),val);
- if((r = fmt.match(/^([0#]+)(\\?-([0#]+))+$/))) {
- o = _strrev(write_num_flt(type, fmt.replace(/[\\-]/g,""), val));
- ri = 0;
- return _strrev(_strrev(fmt.replace(/\\/g,"")).replace(/[0#]/g,function(x){return ri<o.length?o.charAt(ri++):x==='0'?'0':"";}));
- }
- if(fmt.match(phone)) {
- o = write_num_flt(type, "##########", val);
- return "(" + o.substr(0,3) + ") " + o.substr(3, 3) + "-" + o.substr(6);
- }
- var oa = "";
- if((r = fmt.match(/^([#0?]+)( ?)\/( ?)([#0?]+)/))) {
- ri = Math.min(r[4].length,7);
- ff = frac(aval, Math.pow(10,ri)-1, false);
- o = "" + sign;
- oa = write_num("n", r[1], ff[1]);
- if(oa.charAt(oa.length-1) == " ") oa = oa.substr(0,oa.length-1) + "0";
- o += oa + r[2] + "/" + r[3];
- oa = rpad_(ff[2],ri);
- if(oa.length < r[4].length) oa = hashq(r[4].substr(r[4].length-oa.length)) + oa;
- o += oa;
- return o;
- }
- if((r = fmt.match(/^# ([#0?]+)( ?)\/( ?)([#0?]+)/))) {
- ri = Math.min(Math.max(r[1].length, r[4].length),7);
- ff = frac(aval, Math.pow(10,ri)-1, true);
- 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));
- }
- if((r = fmt.match(/^[#0?]+$/))) {
- o = pad0r(val, 0);
- if(fmt.length <= o.length) return o;
- return hashq(fmt.substr(0,fmt.length-o.length)) + o;
- }
- if((r = fmt.match(/^([#0?]+)\.([#0]+)$/))) {
- o = "" + val.toFixed(Math.min(r[2].length,10)).replace(/([^0])0+$/,"$1");
- ri = o.indexOf(".");
- var lres = fmt.indexOf(".") - ri, rres = fmt.length - o.length - lres;
- return hashq(fmt.substr(0,lres) + o + fmt.substr(fmt.length-rres));
- }
- if((r = fmt.match(/^00,000\.([#0]*0)$/))) {
- ri = dec(val, r[1].length);
- 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);
- }
- switch(fmt) {
- case "###,##0.00": return write_num_flt(type, "#,##0.00", val);
- case "###,###":
- case "##,###":
- case "#,###": var x = commaify(pad0r(aval,0)); return x !== "0" ? sign + x : "";
- case "###,###.00": return write_num_flt(type, "###,##0.00",val).replace(/^0\./,".");
- case "#,###.00": return write_num_flt(type, "#,##0.00",val).replace(/^0\./,".");
- default:
- }
- throw new Error("unsupported format |" + fmt + "|");
- }
- function write_num_cm2(type, fmt, val){
- var idx = fmt.length - 1;
- while(fmt.charCodeAt(idx-1) === 44) --idx;
- return write_num(type, fmt.substr(0,idx), val / Math.pow(10,3*(fmt.length-idx)));
- }
- function write_num_pct2(type, fmt, val){
- var sfmt = fmt.replace(pct1,""), mul = fmt.length - sfmt.length;
- return write_num(type, sfmt, val * Math.pow(10,2*mul)) + fill("%",mul);
- }
- function write_num_exp2(fmt, val){
- var o;
- var idx = fmt.indexOf("E") - fmt.indexOf(".") - 1;
- if(fmt.match(/^#+0.0E\+0$/)) {
- if(val == 0) return "0.0E+0";
- else if(val < 0) return "-" + write_num_exp2(fmt, -val);
- var period = fmt.indexOf("."); if(period === -1) period=fmt.indexOf('E');
- var ee = Math.floor(Math.log(val)*Math.LOG10E)%period;
- if(ee < 0) ee += period;
- o = (val/Math.pow(10,ee)).toPrecision(idx+1+(period+ee)%period);
- if(!o.match(/[Ee]/)) {
- var fakee = Math.floor(Math.log(val)*Math.LOG10E);
- if(o.indexOf(".") === -1) o = o.charAt(0) + "." + o.substr(1) + "E+" + (fakee - o.length+ee);
- else o += "E+" + (fakee - ee);
- o = o.replace(/\+-/,"-");
- }
- o = o.replace(/^([+-]?)(\d*)\.(\d*)[Ee]/,function($$,$1,$2,$3) { return $1 + $2 + $3.substr(0,(period+ee)%period) + "." + $3.substr(ee) + "E"; });
- } else o = val.toExponential(idx);
- if(fmt.match(/E\+00$/) && o.match(/e[+-]\d$/)) o = o.substr(0,o.length-1) + "0" + o.charAt(o.length-1);
- if(fmt.match(/E\-/) && o.match(/e\+/)) o = o.replace(/e\+/,"e");
- return o.replace("e","E");
- }
- function write_num_int(type, fmt, val) {
- if(type.charCodeAt(0) === 40 && !fmt.match(closeparen)) {
- var ffmt = fmt.replace(/\( */,"").replace(/ \)/,"").replace(/\)/,"");
- if(val >= 0) return write_num_int('n', ffmt, val);
- return '(' + write_num_int('n', ffmt, -val) + ')';
- }
- if(fmt.charCodeAt(fmt.length - 1) === 44) return write_num_cm2(type, fmt, val);
- if(fmt.indexOf('%') !== -1) return write_num_pct2(type, fmt, val);
- if(fmt.indexOf('E') !== -1) return write_num_exp2(fmt, val);
- if(fmt.charCodeAt(0) === 36) return "$"+write_num_int(type,fmt.substr(fmt.charAt(1)==' '?2:1),val);
- var o;
- var r, ri, ff, aval = Math.abs(val), sign = val < 0 ? "-" : "";
- if(fmt.match(/^00+$/)) return sign + pad0(aval,fmt.length);
- if(fmt.match(/^[#?]+$/)) {
- o = (""+val); if(val === 0) o = "";
- return o.length > fmt.length ? o : hashq(fmt.substr(0,fmt.length-o.length)) + o;
- }
- if((r = fmt.match(frac1))) return write_num_f2(r, aval, sign);
- if(fmt.match(/^#+0+$/)) return sign + pad0(aval,fmt.length - fmt.indexOf("0"));
- if((r = fmt.match(dec1))) {
- o = (""+val).replace(/^([^\.]+)$/,"$1."+hashq(r[1])).replace(/\.$/,"."+hashq(r[1]));
- o = o.replace(/\.(\d*)$/,function($$, $1) {
- return "." + $1 + fill("0", hashq(r[1]).length-$1.length); });
- return fmt.indexOf("0.") !== -1 ? o : o.replace(/^0\./,".");
- }
- fmt = fmt.replace(/^#+([0.])/, "$1");
- if((r = fmt.match(/^(0*)\.(#*)$/))) {
- return sign + (""+aval).replace(/\.(\d*[1-9])0*$/,".$1").replace(/^(-?\d*)$/,"$1.").replace(/^0\./,r[1].length?"0.":".");
- }
- if((r = fmt.match(/^#{1,3},##0(\.?)$/))) return sign + commaify((""+aval));
- if((r = fmt.match(/^#,##0\.([#0]*0)$/))) {
- return val < 0 ? "-" + write_num_int(type, fmt, -val) : commaify((""+val)) + "." + fill('0',r[1].length);
- }
- if((r = fmt.match(/^#,#*,#0/))) return write_num_int(type,fmt.replace(/^#,#*,/,""),val);
- if((r = fmt.match(/^([0#]+)(\\?-([0#]+))+$/))) {
- o = _strrev(write_num_int(type, fmt.replace(/[\\-]/g,""), val));
- ri = 0;
- return _strrev(_strrev(fmt.replace(/\\/g,"")).replace(/[0#]/g,function(x){return ri<o.length?o.charAt(ri++):x==='0'?'0':"";}));
- }
- if(fmt.match(phone)) {
- o = write_num_int(type, "##########", val);
- return "(" + o.substr(0,3) + ") " + o.substr(3, 3) + "-" + o.substr(6);
- }
- var oa = "";
- if((r = fmt.match(/^([#0?]+)( ?)\/( ?)([#0?]+)/))) {
- ri = Math.min(r[4].length,7);
- ff = frac(aval, Math.pow(10,ri)-1, false);
- o = "" + sign;
- oa = write_num("n", r[1], ff[1]);
- if(oa.charAt(oa.length-1) == " ") oa = oa.substr(0,oa.length-1) + "0";
- o += oa + r[2] + "/" + r[3];
- oa = rpad_(ff[2],ri);
- if(oa.length < r[4].length) oa = hashq(r[4].substr(r[4].length-oa.length)) + oa;
- o += oa;
- return o;
- }
- if((r = fmt.match(/^# ([#0?]+)( ?)\/( ?)([#0?]+)/))) {
- ri = Math.min(Math.max(r[1].length, r[4].length),7);
- ff = frac(aval, Math.pow(10,ri)-1, true);
- 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));
- }
- if((r = fmt.match(/^[#0?]+$/))) {
- o = "" + val;
- if(fmt.length <= o.length) return o;
- return hashq(fmt.substr(0,fmt.length-o.length)) + o;
- }
- if((r = fmt.match(/^([#0]+)\.([#0]+)$/))) {
- o = "" + val.toFixed(Math.min(r[2].length,10)).replace(/([^0])0+$/,"$1");
- ri = o.indexOf(".");
- var lres = fmt.indexOf(".") - ri, rres = fmt.length - o.length - lres;
- return hashq(fmt.substr(0,lres) + o + fmt.substr(fmt.length-rres));
- }
- if((r = fmt.match(/^00,000\.([#0]*0)$/))) {
- 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);
- }
- switch(fmt) {
- case "###,###":
- case "##,###":
- case "#,###": var x = commaify(""+aval); return x !== "0" ? sign + x : "";
- default:
- if(fmt.match(/\.[0#?]*$/)) return write_num_int(type, fmt.slice(0,fmt.lastIndexOf(".")), val) + hashq(fmt.slice(fmt.lastIndexOf(".")));
- }
- throw new Error("unsupported format |" + fmt + "|");
- }
- return function write_num(type, fmt, val) {
- return (val|0) === val ? write_num_int(type, fmt, val) : write_num_flt(type, fmt, val);
- };})();
- function split_fmt(fmt) {
- var out = [];
- var in_str = false/*, cc*/;
- for(var i = 0, j = 0; i < fmt.length; ++i) switch((/*cc=*/fmt.charCodeAt(i))) {
- case 34: /* '"' */
- in_str = !in_str; break;
- case 95: case 42: case 92: /* '_' '*' '\\' */
- ++i; break;
- case 59: /* ';' */
- out[out.length] = fmt.substr(j,i-j);
- j = i+1;
- }
- out[out.length] = fmt.substr(j);
- if(in_str === true) throw new Error("Format |" + fmt + "| unterminated string ");
- return out;
- }
- SSF._split = split_fmt;
- var abstime = /\[[HhMmSs\u0E0A\u0E19\u0E17]*\]/;
- function fmt_is_date(fmt) {
- var i = 0, /*cc = 0,*/ c = "", o = "";
- while(i < fmt.length) {
- switch((c = fmt.charAt(i))) {
- case 'G': if(isgeneral(fmt, i)) i+= 6; i++; break;
- case '"': for(;(/*cc=*/fmt.charCodeAt(++i)) !== 34 && i < fmt.length;){/*empty*/} ++i; break;
- case '\\': i+=2; break;
- case '_': i+=2; break;
- case '@': ++i; break;
- case 'B': case 'b':
- if(fmt.charAt(i+1) === "1" || fmt.charAt(i+1) === "2") return true;
- /* falls through */
- case 'M': case 'D': case 'Y': case 'H': case 'S': case 'E':
- /* falls through */
- case 'm': case 'd': case 'y': case 'h': case 's': case 'e': case 'g': return true;
- case 'A': case 'a': case '上':
- if(fmt.substr(i, 3).toUpperCase() === "A/P") return true;
- if(fmt.substr(i, 5).toUpperCase() === "AM/PM") return true;
- if(fmt.substr(i, 5).toUpperCase() === "上午/下午") return true;
- ++i; break;
- case '[':
- o = c;
- while(fmt.charAt(i++) !== ']' && i < fmt.length) o += fmt.charAt(i);
- if(o.match(abstime)) return true;
- break;
- case '.':
- /* falls through */
- case '0': case '#':
- 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 */}
- break;
- case '?': while(fmt.charAt(++i) === c){/* empty */} break;
- case '*': ++i; if(fmt.charAt(i) == ' ' || fmt.charAt(i) == '*') ++i; break;
- case '(': case ')': ++i; break;
- case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9':
- while(i < fmt.length && "0123456789".indexOf(fmt.charAt(++i)) > -1){/* empty */} break;
- case ' ': ++i; break;
- default: ++i; break;
- }
- }
- return false;
- }
- SSF.is_date = fmt_is_date;
- function eval_fmt(fmt, v, opts, flen) {
- var out = [], o = "", i = 0, c = "", lst='t', dt, j, cc;
- var hr='H';
- /* Tokenize */
- while(i < fmt.length) {
- switch((c = fmt.charAt(i))) {
- case 'G': /* General */
- if(!isgeneral(fmt, i)) throw new Error('unrecognized character ' + c + ' in ' +fmt);
- out[out.length] = {t:'G', v:'General'}; i+=7; break;
- case '"': /* Literal text */
- for(o="";(cc=fmt.charCodeAt(++i)) !== 34 && i < fmt.length;) o += String.fromCharCode(cc);
- out[out.length] = {t:'t', v:o}; ++i; break;
- case '\\': var w = fmt.charAt(++i), t = (w === "(" || w === ")") ? w : 't';
- out[out.length] = {t:t, v:w}; ++i; break;
- case '_': out[out.length] = {t:'t', v:" "}; i+=2; break;
- case '@': /* Text Placeholder */
- out[out.length] = {t:'T', v:v}; ++i; break;
- case 'B': case 'b':
- if(fmt.charAt(i+1) === "1" || fmt.charAt(i+1) === "2") {
- if(dt==null) { dt=parse_date_code(v, opts, fmt.charAt(i+1) === "2"); if(dt==null) return ""; }
- out[out.length] = {t:'X', v:fmt.substr(i,2)}; lst = c; i+=2; break;
- }
- /* falls through */
- case 'M': case 'D': case 'Y': case 'H': case 'S': case 'E':
- c = c.toLowerCase();
- /* falls through */
- case 'm': case 'd': case 'y': case 'h': case 's': case 'e': case 'g':
- if(v < 0) return "";
- if(dt==null) { dt=parse_date_code(v, opts); if(dt==null) return ""; }
- o = c; while(++i < fmt.length && fmt.charAt(i).toLowerCase() === c) o+=c;
- if(c === 'm' && lst.toLowerCase() === 'h') c = 'M';
- if(c === 'h') c = hr;
- out[out.length] = {t:c, v:o}; lst = c; break;
- case 'A': case 'a': case '上':
- var q={t:c, v:c};
- if(dt==null) dt=parse_date_code(v, opts);
- 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;}
- 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'; }
- else if(fmt.substr(i,5).toUpperCase() === "上午/下午") { if(dt!=null) q.v = dt.H >= 12 ? "下午" : "上午"; q.t = 'T'; i+=5; hr='h'; }
- else { q.t = "t"; ++i; }
- if(dt==null && q.t === 'T') return "";
- out[out.length] = q; lst = c; break;
- case '[':
- o = c;
- while(fmt.charAt(i++) !== ']' && i < fmt.length) o += fmt.charAt(i);
- if(o.slice(-1) !== ']') throw 'unterminated "[" block: |' + o + '|';
- if(o.match(abstime)) {
- if(dt==null) { dt=parse_date_code(v, opts); if(dt==null) return ""; }
- out[out.length] = {t:'Z', v:o.toLowerCase()};
- lst = o.charAt(1);
- } else if(o.indexOf("$") > -1) {
- o = (o.match(/\$([^-\[\]]*)/)||[])[1]||"$";
- if(!fmt_is_date(fmt)) out[out.length] = {t:'t',v:o};
- }
- break;
- /* Numbers */
- case '.':
- if(dt != null) {
- o = c; while(++i < fmt.length && (c=fmt.charAt(i)) === "0") o += c;
- out[out.length] = {t:'s', v:o}; break;
- }
- /* falls through */
- case '0': case '#':
- o = c; while(++i < fmt.length && "0#?.,E+-%".indexOf(c=fmt.charAt(i)) > -1) o += c;
- out[out.length] = {t:'n', v:o}; break;
- case '?':
- o = c; while(fmt.charAt(++i) === c) o+=c;
- out[out.length] = {t:c, v:o}; lst = c; break;
- case '*': ++i; if(fmt.charAt(i) == ' ' || fmt.charAt(i) == '*') ++i; break; // **
- case '(': case ')': out[out.length] = {t:(flen===1?'t':c), v:c}; ++i; break;
- case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9':
- o = c; while(i < fmt.length && "0123456789".indexOf(fmt.charAt(++i)) > -1) o+=fmt.charAt(i);
- out[out.length] = {t:'D', v:o}; break;
- case ' ': out[out.length] = {t:c, v:c}; ++i; break;
- case '$': out[out.length] = {t:'t', v:'$'}; ++i; break;
- default:
- if(",$-+/():!^&'~{}<>=€acfijklopqrtuvwxzP".indexOf(c) === -1) throw new Error('unrecognized character ' + c + ' in ' + fmt);
- out[out.length] = {t:'t', v:c}; ++i; break;
- }
- }
-
- /* Scan for date/time parts */
- var bt = 0, ss0 = 0, ssm;
- for(i=out.length-1, lst='t'; i >= 0; --i) {
- switch(out[i].t) {
- case 'h': case 'H': out[i].t = hr; lst='h'; if(bt < 1) bt = 1; break;
- case 's':
- if((ssm=out[i].v.match(/\.0+$/))) ss0=Math.max(ss0,ssm[0].length-1);
- if(bt < 3) bt = 3;
- /* falls through */
- case 'd': case 'y': case 'M': case 'e': lst=out[i].t; break;
- case 'm': if(lst === 's') { out[i].t = 'M'; if(bt < 2) bt = 2; } break;
- case 'X': /*if(out[i].v === "B2");*/
- break;
- case 'Z':
- if(bt < 1 && out[i].v.match(/[Hh]/)) bt = 1;
- if(bt < 2 && out[i].v.match(/[Mm]/)) bt = 2;
- if(bt < 3 && out[i].v.match(/[Ss]/)) bt = 3;
- }
- }
- /* time rounding depends on presence of minute / second / usec fields */
- switch(bt) {
- case 0: break;
- case 1:
- if(dt.u >= 0.5) { dt.u = 0; ++dt.S; }
- if(dt.S >= 60) { dt.S = 0; ++dt.M; }
- if(dt.M >= 60) { dt.M = 0; ++dt.H; }
- break;
- case 2:
- if(dt.u >= 0.5) { dt.u = 0; ++dt.S; }
- if(dt.S >= 60) { dt.S = 0; ++dt.M; }
- break;
- }
-
- /* replace fields */
- var nstr = "", jj;
- for(i=0; i < out.length; ++i) {
- switch(out[i].t) {
- case 't': case 'T': case ' ': case 'D': break;
- case 'X': out[i].v = ""; out[i].t = ";"; break;
- case 'd': case 'm': case 'y': case 'h': case 'H': case 'M': case 's': case 'e': case 'b': case 'Z':
- out[i].v = write_date(out[i].t.charCodeAt(0), out[i].v, dt, ss0);
- out[i].t = 't'; break;
- case 'n': case '?':
- jj = i+1;
- while(out[jj] != null && (
- (c=out[jj].t) === "?" || c === "D" ||
- ((c === " " || c === "t") && out[jj+1] != null && (out[jj+1].t === '?' || out[jj+1].t === "t" && out[jj+1].v === '/')) ||
- (out[i].t === '(' && (c === ' ' || c === 'n' || c === ')')) ||
- (c === 't' && (out[jj].v === '/' || out[jj].v === ' ' && out[jj+1] != null && out[jj+1].t == '?'))
- )) {
- out[i].v += out[jj].v;
- out[jj] = {v:"", t:";"}; ++jj;
- }
- nstr += out[i].v;
- i = jj-1; break;
- case 'G': out[i].t = 't'; out[i].v = general_fmt(v,opts); break;
- }
- }
- var vv = "", myv, ostr;
- if(nstr.length > 0) {
- if(nstr.charCodeAt(0) == 40) /* '(' */ {
- myv = (v<0&&nstr.charCodeAt(0) === 45 ? -v : v);
- ostr = write_num('n', nstr, myv);
- } else {
- myv = (v<0 && flen > 1 ? -v : v);
- ostr = write_num('n', nstr, myv);
- if(myv < 0 && out[0] && out[0].t == 't') {
- ostr = ostr.substr(1);
- out[0].v = "-" + out[0].v;
- }
- }
- jj=ostr.length-1;
- var decpt = out.length;
- for(i=0; i < out.length; ++i) if(out[i] != null && out[i].t != 't' && out[i].v.indexOf(".") > -1) { decpt = i; break; }
- var lasti=out.length;
- if(decpt === out.length && ostr.indexOf("E") === -1) {
- for(i=out.length-1; i>= 0;--i) {
- if(out[i] == null || 'n?'.indexOf(out[i].t) === -1) continue;
- if(jj>=out[i].v.length-1) { jj -= out[i].v.length; out[i].v = ostr.substr(jj+1, out[i].v.length); }
- else if(jj < 0) out[i].v = "";
- else { out[i].v = ostr.substr(0, jj+1); jj = -1; }
- out[i].t = 't';
- lasti = i;
- }
- if(jj>=0 && lasti<out.length) out[lasti].v = ostr.substr(0,jj+1) + out[lasti].v;
- }
- else if(decpt !== out.length && ostr.indexOf("E") === -1) {
- jj = ostr.indexOf(".")-1;
- for(i=decpt; i>= 0; --i) {
- if(out[i] == null || 'n?'.indexOf(out[i].t) === -1) continue;
- j=out[i].v.indexOf(".")>-1&&i===decpt?out[i].v.indexOf(".")-1:out[i].v.length-1;
- vv = out[i].v.substr(j+1);
- for(; j>=0; --j) {
- if(jj>=0 && (out[i].v.charAt(j) === "0" || out[i].v.charAt(j) === "#")) vv = ostr.charAt(jj--) + vv;
- }
- out[i].v = vv;
- out[i].t = 't';
- lasti = i;
- }
- if(jj>=0 && lasti<out.length) out[lasti].v = ostr.substr(0,jj+1) + out[lasti].v;
- jj = ostr.indexOf(".")+1;
- for(i=decpt; i<out.length; ++i) {
- if(out[i] == null || ('n?('.indexOf(out[i].t) === -1 && i !== decpt)) continue;
- j=out[i].v.indexOf(".")>-1&&i===decpt?out[i].v.indexOf(".")+1:0;
- vv = out[i].v.substr(0,j);
- for(; j<out[i].v.length; ++j) {
- if(jj<ostr.length) vv += ostr.charAt(jj++);
- }
- out[i].v = vv;
- out[i].t = 't';
- lasti = i;
- }
- }
- }
- for(i=0; i<out.length; ++i) if(out[i] != null && 'n?'.indexOf(out[i].t)>-1) {
- myv = (flen >1 && v < 0 && i>0 && out[i-1].v === "-" ? -v:v);
- out[i].v = write_num(out[i].t, out[i].v, myv);
- out[i].t = 't';
- }
- var retval = "";
- for(i=0; i !== out.length; ++i) if(out[i] != null) retval += out[i].v;
- return retval;
- }
- SSF._eval = eval_fmt;
- var cfregex = /\[[=<>]/;
- var cfregex2 = /\[(=|>[=]?|<[>=]?)(-?\d+(?:\.\d*)?)\]/;
- function chkcond(v, rr) {
- if(rr == null) return false;
- var thresh = parseFloat(rr[2]);
- switch(rr[1]) {
- case "=": if(v == thresh) return true; break;
- case ">": if(v > thresh) return true; break;
- case "<": if(v < thresh) return true; break;
- case "<>": if(v != thresh) return true; break;
- case ">=": if(v >= thresh) return true; break;
- case "<=": if(v <= thresh) return true; break;
- }
- return false;
- }
- function choose_fmt(f, v) {
- var fmt = split_fmt(f);
- var l = fmt.length, lat = fmt[l-1].indexOf("@");
- if(l<4 && lat>-1) --l;
- if(fmt.length > 4) throw new Error("cannot find right format for |" + fmt.join("|") + "|");
- if(typeof v !== "number") return [4, fmt.length === 4 || lat>-1?fmt[fmt.length-1]:"@"];
- switch(fmt.length) {
- case 1: fmt = lat>-1 ? ["General", "General", "General", fmt[0]] : [fmt[0], fmt[0], fmt[0], "@"]; break;
- case 2: fmt = lat>-1 ? [fmt[0], fmt[0], fmt[0], fmt[1]] : [fmt[0], fmt[1], fmt[0], "@"]; break;
- case 3: fmt = lat>-1 ? [fmt[0], fmt[1], fmt[0], fmt[2]] : [fmt[0], fmt[1], fmt[2], "@"]; break;
- case 4: break;
- }
- var ff = v > 0 ? fmt[0] : v < 0 ? fmt[1] : fmt[2];
- if(fmt[0].indexOf("[") === -1 && fmt[1].indexOf("[") === -1) return [l, ff];
- if(fmt[0].match(cfregex) != null || fmt[1].match(cfregex) != null) {
- var m1 = fmt[0].match(cfregex2);
- var m2 = fmt[1].match(cfregex2);
- return chkcond(v, m1) ? [l, fmt[0]] : chkcond(v, m2) ? [l, fmt[1]] : [l, fmt[m1 != null && m2 != null ? 2 : 1]];
- }
- return [l, ff];
- }
- function format(fmt,v,o) {
- if(o == null) o = {};
- var sfmt = "";
- switch(typeof fmt) {
- case "string":
- if(fmt == "m/d/yy" && o.dateNF) sfmt = o.dateNF;
- else sfmt = fmt;
- break;
- case "number":
- if(fmt == 14 && o.dateNF) sfmt = o.dateNF;
- else sfmt = (o.table != null ? (o.table) : table_fmt)[fmt];
- if(sfmt == null) sfmt = (o.table && o.table[default_map[fmt]]) || table_fmt[default_map[fmt]];
- if(sfmt == null) sfmt = default_str[fmt] || "General";
- break;
- }
- if(isgeneral(sfmt,0)) return general_fmt(v, o);
- if(v instanceof Date) v = datenum_local(v, o.date1904);
- var f = choose_fmt(sfmt, v);
- if(isgeneral(f[1])) return general_fmt(v, o);
- if(v === true) v = "TRUE"; else if(v === false) v = "FALSE";
- else if(v === "" || v == null) return "";
- return eval_fmt(f[1], v, o, f[0]);
- }
- function load_entry(fmt, idx) {
- if(typeof idx != 'number') {
- idx = +idx || -1;
- for(var i = 0; i < 0x0188; ++i) {
- if(table_fmt[i] == undefined) { if(idx < 0) idx = i; continue; }
- if(table_fmt[i] == fmt) { idx = i; break; }
- }
- if(idx < 0) idx = 0x187;
- }
- table_fmt[idx] = fmt;
- return idx;
- }
- SSF.load = load_entry;
- SSF._table = table_fmt;
- SSF.get_table = function get_table() { return table_fmt; };
- SSF.load_table = function load_table(tbl) {
- for(var i=0; i!=0x0188; ++i)
- if(tbl[i] !== undefined) load_entry(tbl[i], i);
- };
- SSF.init_table = init_table;
- SSF.format = format;
- };
- make_ssf(SSF);
- /* map from xlml named formats to SSF TODO: localize */
- var XLMLFormatMap/*{[string]:string}*/ = ({
- "General Number": "General",
- "General Date": SSF._table[22],
- "Long Date": "dddd, mmmm dd, yyyy",
- "Medium Date": SSF._table[15],
- "Short Date": SSF._table[14],
- "Long Time": SSF._table[19],
- "Medium Time": SSF._table[18],
- "Short Time": SSF._table[20],
- "Currency": '"$"#,##0.00_);[Red]\\("$"#,##0.00\\)',
- "Fixed": SSF._table[2],
- "Standard": SSF._table[4],
- "Percent": SSF._table[10],
- "Scientific": SSF._table[11],
- "Yes/No": '"Yes";"Yes";"No";@',
- "True/False": '"True";"True";"False";@',
- "On/Off": '"Yes";"Yes";"No";@'
- });
-
- var SSFImplicit/*{[number]:string}*/ = ({
- "5": '"$"#,##0_);\\("$"#,##0\\)',
- "6": '"$"#,##0_);[Red]\\("$"#,##0\\)',
- "7": '"$"#,##0.00_);\\("$"#,##0.00\\)',
- "8": '"$"#,##0.00_);[Red]\\("$"#,##0.00\\)',
- "23": 'General', "24": 'General', "25": 'General', "26": 'General',
- "27": 'm/d/yy', "28": 'm/d/yy', "29": 'm/d/yy', "30": 'm/d/yy', "31": 'm/d/yy',
- "32": 'h:mm:ss', "33": 'h:mm:ss', "34": 'h:mm:ss', "35": 'h:mm:ss',
- "36": 'm/d/yy',
- "41": '_(* #,##0_);_(* \(#,##0\);_(* "-"_);_(@_)',
- "42": '_("$"* #,##0_);_("$"* \(#,##0\);_("$"* "-"_);_(@_)',
- "43": '_(* #,##0.00_);_(* \(#,##0.00\);_(* "-"??_);_(@_)',
- "44": '_("$"* #,##0.00_);_("$"* \(#,##0.00\);_("$"* "-"??_);_(@_)',
- "50": 'm/d/yy', "51": 'm/d/yy', "52": 'm/d/yy', "53": 'm/d/yy', "54": 'm/d/yy',
- "55": 'm/d/yy', "56": 'm/d/yy', "57": 'm/d/yy', "58": 'm/d/yy',
- "59": '0',
- "60": '0.00',
- "61": '#,##0',
- "62": '#,##0.00',
- "63": '"$"#,##0_);\\("$"#,##0\\)',
- "64": '"$"#,##0_);[Red]\\("$"#,##0\\)',
- "65": '"$"#,##0.00_);\\("$"#,##0.00\\)',
- "66": '"$"#,##0.00_);[Red]\\("$"#,##0.00\\)',
- "67": '0%',
- "68": '0.00%',
- "69": '# ?/?',
- "70": '# ??/??',
- "71": 'm/d/yy',
- "72": 'm/d/yy',
- "73": 'd-mmm-yy',
- "74": 'd-mmm',
- "75": 'mmm-yy',
- "76": 'h:mm',
- "77": 'h:mm:ss',
- "78": 'm/d/yy h:mm',
- "79": 'mm:ss',
- "80": '[h]:mm:ss',
- "81": 'mmss.0'
- });
-
- /* dateNF parse TODO: move to SSF */
- var dateNFregex = /[dD]+|[mM]+|[yYeE]+|[Hh]+|[Ss]+/g;
- function dateNF_regex(dateNF) {
- var fmt = typeof dateNF == "number" ? SSF._table[dateNF] : dateNF;
- fmt = fmt.replace(dateNFregex, "(\\d+)");
- return new RegExp("^" + fmt + "$");
- }
- function dateNF_fix(str, dateNF, match) {
- var Y = -1, m = -1, d = -1, H = -1, M = -1, S = -1;
- (dateNF.match(dateNFregex)||[]).forEach(function(n, i) {
- var v = parseInt(match[i+1], 10);
- switch(n.toLowerCase().charAt(0)) {
- case 'y': Y = v; break; case 'd': d = v; break;
- case 'h': H = v; break; case 's': S = v; break;
- case 'm': if(H >= 0) M = v; else m = v; break;
- }
- });
- if(S >= 0 && M == -1 && m >= 0) { M = m; m = -1; }
- var datestr = (("" + (Y>=0?Y: new Date().getFullYear())).slice(-4) + "-" + ("00" + (m>=1?m:1)).slice(-2) + "-" + ("00" + (d>=1?d:1)).slice(-2));
- if(datestr.length == 7) datestr = "0" + datestr;
- if(datestr.length == 8) datestr = "20" + datestr;
- var timestr = (("00" + (H>=0?H:0)).slice(-2) + ":" + ("00" + (M>=0?M:0)).slice(-2) + ":" + ("00" + (S>=0?S:0)).slice(-2));
- if(H == -1 && M == -1 && S == -1) return datestr;
- if(Y == -1 && m == -1 && d == -1) return timestr;
- return datestr + "T" + timestr;
- }
-
- var DO_NOT_EXPORT_CFB = true;
- /* cfb.js (C) 2013-present SheetJS -- http://sheetjs.com */
- /* vim: set ts=2: */
- /*jshint eqnull:true */
- /*exported CFB */
- /*global Uint8Array:false, Uint16Array:false */
-
- /* crc32.js (C) 2014-present SheetJS -- http://sheetjs.com */
- /* vim: set ts=2: */
- /*exported CRC32 */
- var CRC32;
- (function (factory) {
- /*jshint ignore:start */
- /*eslint-disable */
- factory(CRC32 = {});
- /*eslint-enable */
- /*jshint ignore:end */
- }(function(CRC32) {
- CRC32.version = '1.2.0';
- /* see perf/crc32table.js */
- /*global Int32Array */
- function signed_crc_table() {
- var c = 0, table = new Array(256);
-
- for(var n =0; n != 256; ++n){
- c = n;
- c = ((c&1) ? (-306674912 ^ (c >>> 1)) : (c >>> 1));
- c = ((c&1) ? (-306674912 ^ (c >>> 1)) : (c >>> 1));
- c = ((c&1) ? (-306674912 ^ (c >>> 1)) : (c >>> 1));
- c = ((c&1) ? (-306674912 ^ (c >>> 1)) : (c >>> 1));
- c = ((c&1) ? (-306674912 ^ (c >>> 1)) : (c >>> 1));
- c = ((c&1) ? (-306674912 ^ (c >>> 1)) : (c >>> 1));
- c = ((c&1) ? (-306674912 ^ (c >>> 1)) : (c >>> 1));
- c = ((c&1) ? (-306674912 ^ (c >>> 1)) : (c >>> 1));
- table[n] = c;
- }
-
- return typeof Int32Array !== 'undefined' ? new Int32Array(table) : table;
- }
-
- var T = signed_crc_table();
- function crc32_bstr(bstr, seed) {
- var C = seed ^ -1, L = bstr.length - 1;
- for(var i = 0; i < L;) {
- C = (C>>>8) ^ T[(C^bstr.charCodeAt(i++))&0xFF];
- C = (C>>>8) ^ T[(C^bstr.charCodeAt(i++))&0xFF];
- }
- if(i === L) C = (C>>>8) ^ T[(C ^ bstr.charCodeAt(i))&0xFF];
- return C ^ -1;
- }
-
- function crc32_buf(buf, seed) {
- if(buf.length > 10000) return crc32_buf_8(buf, seed);
- var C = seed ^ -1, L = buf.length - 3;
- for(var i = 0; i < L;) {
- C = (C>>>8) ^ T[(C^buf[i++])&0xFF];
- C = (C>>>8) ^ T[(C^buf[i++])&0xFF];
- C = (C>>>8) ^ T[(C^buf[i++])&0xFF];
- C = (C>>>8) ^ T[(C^buf[i++])&0xFF];
- }
- while(i < L+3) C = (C>>>8) ^ T[(C^buf[i++])&0xFF];
- return C ^ -1;
- }
-
- function crc32_buf_8(buf, seed) {
- var C = seed ^ -1, L = buf.length - 7;
- for(var i = 0; i < L;) {
- C = (C>>>8) ^ T[(C^buf[i++])&0xFF];
- C = (C>>>8) ^ T[(C^buf[i++])&0xFF];
- C = (C>>>8) ^ T[(C^buf[i++])&0xFF];
- C = (C>>>8) ^ T[(C^buf[i++])&0xFF];
- C = (C>>>8) ^ T[(C^buf[i++])&0xFF];
- C = (C>>>8) ^ T[(C^buf[i++])&0xFF];
- C = (C>>>8) ^ T[(C^buf[i++])&0xFF];
- C = (C>>>8) ^ T[(C^buf[i++])&0xFF];
- }
- while(i < L+7) C = (C>>>8) ^ T[(C^buf[i++])&0xFF];
- return C ^ -1;
- }
-
- function crc32_str(str, seed) {
- var C = seed ^ -1;
- for(var i = 0, L=str.length, c, d; i < L;) {
- c = str.charCodeAt(i++);
- if(c < 0x80) {
- C = (C>>>8) ^ T[(C ^ c)&0xFF];
- } else if(c < 0x800) {
- C = (C>>>8) ^ T[(C ^ (192|((c>>6)&31)))&0xFF];
- C = (C>>>8) ^ T[(C ^ (128|(c&63)))&0xFF];
- } else if(c >= 0xD800 && c < 0xE000) {
- c = (c&1023)+64; d = str.charCodeAt(i++)&1023;
- C = (C>>>8) ^ T[(C ^ (240|((c>>8)&7)))&0xFF];
- C = (C>>>8) ^ T[(C ^ (128|((c>>2)&63)))&0xFF];
- C = (C>>>8) ^ T[(C ^ (128|((d>>6)&15)|((c&3)<<4)))&0xFF];
- C = (C>>>8) ^ T[(C ^ (128|(d&63)))&0xFF];
- } else {
- C = (C>>>8) ^ T[(C ^ (224|((c>>12)&15)))&0xFF];
- C = (C>>>8) ^ T[(C ^ (128|((c>>6)&63)))&0xFF];
- C = (C>>>8) ^ T[(C ^ (128|(c&63)))&0xFF];
- }
- }
- return C ^ -1;
- }
- CRC32.table = T;
- CRC32.bstr = crc32_bstr;
- CRC32.buf = crc32_buf;
- CRC32.str = crc32_str;
- }));
- /* [MS-CFB] v20171201 */
- var CFB = (function _CFB(){
- var exports = {};
- exports.version = '1.1.4';
- /* [MS-CFB] 2.6.4 */
- function namecmp(l, r) {
- var L = l.split("/"), R = r.split("/");
- for(var i = 0, c = 0, Z = Math.min(L.length, R.length); i < Z; ++i) {
- if((c = L[i].length - R[i].length)) return c;
- if(L[i] != R[i]) return L[i] < R[i] ? -1 : 1;
- }
- return L.length - R.length;
- }
- function dirname(p) {
- if(p.charAt(p.length - 1) == "/") return (p.slice(0,-1).indexOf("/") === -1) ? p : dirname(p.slice(0, -1));
- var c = p.lastIndexOf("/");
- return (c === -1) ? p : p.slice(0, c+1);
- }
-
- function filename(p) {
- if(p.charAt(p.length - 1) == "/") return filename(p.slice(0, -1));
- var c = p.lastIndexOf("/");
- return (c === -1) ? p : p.slice(c+1);
- }
- /* -------------------------------------------------------------------------- */
- /* DOS Date format:
- high|YYYYYYYm.mmmddddd.HHHHHMMM.MMMSSSSS|low
- add 1980 to stored year
- stored second should be doubled
- */
-
- /* write JS date to buf as a DOS date */
- function write_dos_date(buf, date) {
- if(typeof date === "string") date = new Date(date);
- var hms = date.getHours();
- hms = hms << 6 | date.getMinutes();
- hms = hms << 5 | (date.getSeconds()>>>1);
- buf.write_shift(2, hms);
- var ymd = (date.getFullYear() - 1980);
- ymd = ymd << 4 | (date.getMonth()+1);
- ymd = ymd << 5 | date.getDate();
- buf.write_shift(2, ymd);
- }
-
- /* read four bytes from buf and interpret as a DOS date */
- function parse_dos_date(buf) {
- var hms = buf.read_shift(2) & 0xFFFF;
- var ymd = buf.read_shift(2) & 0xFFFF;
- var val = new Date();
- var d = ymd & 0x1F; ymd >>>= 5;
- var m = ymd & 0x0F; ymd >>>= 4;
- val.setMilliseconds(0);
- val.setFullYear(ymd + 1980);
- val.setMonth(m-1);
- val.setDate(d);
- var S = hms & 0x1F; hms >>>= 5;
- var M = hms & 0x3F; hms >>>= 6;
- val.setHours(hms);
- val.setMinutes(M);
- val.setSeconds(S<<1);
- return val;
- }
- function parse_extra_field(blob) {
- prep_blob(blob, 0);
- var o = {};
- var flags = 0;
- while(blob.l <= blob.length - 4) {
- var type = blob.read_shift(2);
- var sz = blob.read_shift(2), tgt = blob.l + sz;
- var p = {};
- switch(type) {
- /* UNIX-style Timestamps */
- case 0x5455: {
- flags = blob.read_shift(1);
- if(flags & 1) p.mtime = blob.read_shift(4);
- /* for some reason, CD flag corresponds to LFH */
- if(sz > 5) {
- if(flags & 2) p.atime = blob.read_shift(4);
- if(flags & 4) p.ctime = blob.read_shift(4);
- }
- if(p.mtime) p.mt = new Date(p.mtime*1000);
- }
- break;
- }
- blob.l = tgt;
- o[type] = p;
- }
- return o;
- }
- var fs;
- function get_fs() { return fs || (fs = __webpack_require__(/*! fs */ "?58fb")); }
- function parse(file, options) {
- if(file[0] == 0x50 && file[1] == 0x4b) return parse_zip(file, options);
- if(file.length < 512) throw new Error("CFB file size " + file.length + " < 512");
- var mver = 3;
- var ssz = 512;
- var nmfs = 0; // number of mini FAT sectors
- var difat_sec_cnt = 0;
- var dir_start = 0;
- var minifat_start = 0;
- var difat_start = 0;
-
- var fat_addrs = []; // locations of FAT sectors
-
- /* [MS-CFB] 2.2 Compound File Header */
- var blob = file.slice(0,512);
- prep_blob(blob, 0);
-
- /* major version */
- var mv = check_get_mver(blob);
- mver = mv[0];
- switch(mver) {
- case 3: ssz = 512; break; case 4: ssz = 4096; break;
- case 0: if(mv[1] == 0) return parse_zip(file, options);
- /* falls through */
- default: throw new Error("Major Version: Expected 3 or 4 saw " + mver);
- }
-
- /* reprocess header */
- if(ssz !== 512) { blob = file.slice(0,ssz); prep_blob(blob, 28 /* blob.l */); }
- /* Save header for final object */
- var header = file.slice(0,ssz);
-
- check_shifts(blob, mver);
-
- // Number of Directory Sectors
- var dir_cnt = blob.read_shift(4, 'i');
- if(mver === 3 && dir_cnt !== 0) throw new Error('# Directory Sectors: Expected 0 saw ' + dir_cnt);
-
- // Number of FAT Sectors
- blob.l += 4;
-
- // First Directory Sector Location
- dir_start = blob.read_shift(4, 'i');
-
- // Transaction Signature
- blob.l += 4;
-
- // Mini Stream Cutoff Size
- blob.chk('00100000', 'Mini Stream Cutoff Size: ');
-
- // First Mini FAT Sector Location
- minifat_start = blob.read_shift(4, 'i');
-
- // Number of Mini FAT Sectors
- nmfs = blob.read_shift(4, 'i');
-
- // First DIFAT sector location
- difat_start = blob.read_shift(4, 'i');
-
- // Number of DIFAT Sectors
- difat_sec_cnt = blob.read_shift(4, 'i');
-
- // Grab FAT Sector Locations
- for(var q = -1, j = 0; j < 109; ++j) { /* 109 = (512 - blob.l)>>>2; */
- q = blob.read_shift(4, 'i');
- if(q<0) break;
- fat_addrs[j] = q;
- }
-
- /** Break the file up into sectors */
- var sectors = sectorify(file, ssz);
-
- sleuth_fat(difat_start, difat_sec_cnt, sectors, ssz, fat_addrs);
-
- /** Chains */
- var sector_list = make_sector_list(sectors, dir_start, fat_addrs, ssz);
-
- sector_list[dir_start].name = "!Directory";
- if(nmfs > 0 && minifat_start !== ENDOFCHAIN) sector_list[minifat_start].name = "!MiniFAT";
- sector_list[fat_addrs[0]].name = "!FAT";
- sector_list.fat_addrs = fat_addrs;
- sector_list.ssz = ssz;
-
- /* [MS-CFB] 2.6.1 Compound File Directory Entry */
- var files = {}, Paths = [], FileIndex = [], FullPaths = [];
- read_directory(dir_start, sector_list, sectors, Paths, nmfs, files, FileIndex, minifat_start);
-
- build_full_paths(FileIndex, FullPaths, Paths);
- Paths.shift();
-
- var o = {
- FileIndex: FileIndex,
- FullPaths: FullPaths
- };
-
- // $FlowIgnore
- if(options && options.raw) o.raw = {header: header, sectors: sectors};
- return o;
- } // parse
-
- /* [MS-CFB] 2.2 Compound File Header -- read up to major version */
- function check_get_mver(blob) {
- if(blob[blob.l] == 0x50 && blob[blob.l + 1] == 0x4b) return [0, 0];
- // header signature 8
- blob.chk(HEADER_SIGNATURE, 'Header Signature: ');
-
- // clsid 16
- //blob.chk(HEADER_CLSID, 'CLSID: ');
- blob.l += 16;
-
- // minor version 2
- var mver = blob.read_shift(2, 'u');
-
- return [blob.read_shift(2,'u'), mver];
- }
- function check_shifts(blob, mver) {
- var shift = 0x09;
-
- // Byte Order
- //blob.chk('feff', 'Byte Order: '); // note: some writers put 0xffff
- blob.l += 2;
-
- // Sector Shift
- switch((shift = blob.read_shift(2))) {
- case 0x09: if(mver != 3) throw new Error('Sector Shift: Expected 9 saw ' + shift); break;
- case 0x0c: if(mver != 4) throw new Error('Sector Shift: Expected 12 saw ' + shift); break;
- default: throw new Error('Sector Shift: Expected 9 or 12 saw ' + shift);
- }
-
- // Mini Sector Shift
- blob.chk('0600', 'Mini Sector Shift: ');
-
- // Reserved
- blob.chk('000000000000', 'Reserved: ');
- }
-
- /** Break the file up into sectors */
- function sectorify(file, ssz) {
- var nsectors = Math.ceil(file.length/ssz)-1;
- var sectors = [];
- for(var i=1; i < nsectors; ++i) sectors[i-1] = file.slice(i*ssz,(i+1)*ssz);
- sectors[nsectors-1] = file.slice(nsectors*ssz);
- return sectors;
- }
-
- /* [MS-CFB] 2.6.4 Red-Black Tree */
- function build_full_paths(FI, FP, Paths) {
- var i = 0, L = 0, R = 0, C = 0, j = 0, pl = Paths.length;
- var dad = [], q = [];
-
- for(; i < pl; ++i) { dad[i]=q[i]=i; FP[i]=Paths[i]; }
-
- for(; j < q.length; ++j) {
- i = q[j];
- L = FI[i].L; R = FI[i].R; C = FI[i].C;
- if(dad[i] === i) {
- if(L !== -1 /*NOSTREAM*/ && dad[L] !== L) dad[i] = dad[L];
- if(R !== -1 && dad[R] !== R) dad[i] = dad[R];
- }
- if(C !== -1 /*NOSTREAM*/) dad[C] = i;
- if(L !== -1 && i != dad[i]) { dad[L] = dad[i]; if(q.lastIndexOf(L) < j) q.push(L); }
- if(R !== -1 && i != dad[i]) { dad[R] = dad[i]; if(q.lastIndexOf(R) < j) q.push(R); }
- }
- for(i=1; i < pl; ++i) if(dad[i] === i) {
- if(R !== -1 /*NOSTREAM*/ && dad[R] !== R) dad[i] = dad[R];
- else if(L !== -1 && dad[L] !== L) dad[i] = dad[L];
- }
-
- for(i=1; i < pl; ++i) {
- if(FI[i].type === 0 /* unknown */) continue;
- j = i;
- if(j != dad[j]) do {
- j = dad[j];
- FP[i] = FP[j] + "/" + FP[i];
- } while (j !== 0 && -1 !== dad[j] && j != dad[j]);
- dad[i] = -1;
- }
-
- FP[0] += "/";
- for(i=1; i < pl; ++i) {
- if(FI[i].type !== 2 /* stream */) FP[i] += "/";
- }
- }
-
- function get_mfat_entry(entry, payload, mini) {
- var start = entry.start, size = entry.size;
- //return (payload.slice(start*MSSZ, start*MSSZ + size));
- var o = [];
- var idx = start;
- while(mini && size > 0 && idx >= 0) {
- o.push(payload.slice(idx * MSSZ, idx * MSSZ + MSSZ));
- size -= MSSZ;
- idx = __readInt32LE(mini, idx * 4);
- }
- if(o.length === 0) return (new_buf(0));
- return (bconcat(o).slice(0, entry.size));
- }
-
- /** Chase down the rest of the DIFAT chain to build a comprehensive list
- DIFAT chains by storing the next sector number as the last 32 bits */
- function sleuth_fat(idx, cnt, sectors, ssz, fat_addrs) {
- var q = ENDOFCHAIN;
- if(idx === ENDOFCHAIN) {
- if(cnt !== 0) throw new Error("DIFAT chain shorter than expected");
- } else if(idx !== -1 /*FREESECT*/) {
- var sector = sectors[idx], m = (ssz>>>2)-1;
- if(!sector) return;
- for(var i = 0; i < m; ++i) {
- if((q = __readInt32LE(sector,i*4)) === ENDOFCHAIN) break;
- fat_addrs.push(q);
- }
- sleuth_fat(__readInt32LE(sector,ssz-4),cnt - 1, sectors, ssz, fat_addrs);
- }
- }
-
- /** Follow the linked list of sectors for a given starting point */
- function get_sector_list(sectors, start, fat_addrs, ssz, chkd) {
- var buf = [], buf_chain = [];
- if(!chkd) chkd = [];
- var modulus = ssz - 1, j = 0, jj = 0;
- for(j=start; j>=0;) {
- chkd[j] = true;
- buf[buf.length] = j;
- buf_chain.push(sectors[j]);
- var addr = fat_addrs[Math.floor(j*4/ssz)];
- jj = ((j*4) & modulus);
- if(ssz < 4 + jj) throw new Error("FAT boundary crossed: " + j + " 4 "+ssz);
- if(!sectors[addr]) break;
- j = __readInt32LE(sectors[addr], jj);
- }
- return {nodes: buf, data:__toBuffer([buf_chain])};
- }
-
- /** Chase down the sector linked lists */
- function make_sector_list(sectors, dir_start, fat_addrs, ssz) {
- var sl = sectors.length, sector_list = ([]);
- var chkd = [], buf = [], buf_chain = [];
- var modulus = ssz - 1, i=0, j=0, k=0, jj=0;
- for(i=0; i < sl; ++i) {
- buf = ([]);
- k = (i + dir_start); if(k >= sl) k-=sl;
- if(chkd[k]) continue;
- buf_chain = [];
- var seen = [];
- for(j=k; j>=0;) {
- seen[j] = true;
- chkd[j] = true;
- buf[buf.length] = j;
- buf_chain.push(sectors[j]);
- var addr = fat_addrs[Math.floor(j*4/ssz)];
- jj = ((j*4) & modulus);
- if(ssz < 4 + jj) throw new Error("FAT boundary crossed: " + j + " 4 "+ssz);
- if(!sectors[addr]) break;
- j = __readInt32LE(sectors[addr], jj);
- if(seen[j]) break;
- }
- sector_list[k] = ({nodes: buf, data:__toBuffer([buf_chain])});
- }
- return sector_list;
- }
-
- /* [MS-CFB] 2.6.1 Compound File Directory Entry */
- function read_directory(dir_start, sector_list, sectors, Paths, nmfs, files, FileIndex, mini) {
- var minifat_store = 0, pl = (Paths.length?2:0);
- var sector = sector_list[dir_start].data;
- var i = 0, namelen = 0, name;
- for(; i < sector.length; i+= 128) {
- var blob = sector.slice(i, i+128);
- prep_blob(blob, 64);
- namelen = blob.read_shift(2);
- name = __utf16le(blob,0,namelen-pl);
- Paths.push(name);
- var o = ({
- name: name,
- type: blob.read_shift(1),
- color: blob.read_shift(1),
- L: blob.read_shift(4, 'i'),
- R: blob.read_shift(4, 'i'),
- C: blob.read_shift(4, 'i'),
- clsid: blob.read_shift(16),
- state: blob.read_shift(4, 'i'),
- start: 0,
- size: 0
- });
- var ctime = blob.read_shift(2) + blob.read_shift(2) + blob.read_shift(2) + blob.read_shift(2);
- if(ctime !== 0) o.ct = read_date(blob, blob.l-8);
- var mtime = blob.read_shift(2) + blob.read_shift(2) + blob.read_shift(2) + blob.read_shift(2);
- if(mtime !== 0) o.mt = read_date(blob, blob.l-8);
- o.start = blob.read_shift(4, 'i');
- o.size = blob.read_shift(4, 'i');
- if(o.size < 0 && o.start < 0) { o.size = o.type = 0; o.start = ENDOFCHAIN; o.name = ""; }
- if(o.type === 5) { /* root */
- minifat_store = o.start;
- if(nmfs > 0 && minifat_store !== ENDOFCHAIN) sector_list[minifat_store].name = "!StreamData";
- /*minifat_size = o.size;*/
- } else if(o.size >= 4096 /* MSCSZ */) {
- o.storage = 'fat';
- if(sector_list[o.start] === undefined) sector_list[o.start] = get_sector_list(sectors, o.start, sector_list.fat_addrs, sector_list.ssz);
- sector_list[o.start].name = o.name;
- o.content = (sector_list[o.start].data.slice(0,o.size));
- } else {
- o.storage = 'minifat';
- if(o.size < 0) o.size = 0;
- else if(minifat_store !== ENDOFCHAIN && o.start !== ENDOFCHAIN && sector_list[minifat_store]) {
- o.content = get_mfat_entry(o, sector_list[minifat_store].data, (sector_list[mini]||{}).data);
- }
- }
- if(o.content) prep_blob(o.content, 0);
- files[name] = o;
- FileIndex.push(o);
- }
- }
-
- function read_date(blob, offset) {
- return new Date(( ( (__readUInt32LE(blob,offset+4)/1e7)*Math.pow(2,32)+__readUInt32LE(blob,offset)/1e7 ) - 11644473600)*1000);
- }
-
- function read_file(filename, options) {
- get_fs();
- return parse(fs.readFileSync(filename), options);
- }
-
- function read(blob, options) {
- switch(options && options.type || "base64") {
- case "file": return read_file(blob, options);
- case "base64": return parse(s2a(Base64.decode(blob)), options);
- case "binary": return parse(s2a(blob), options);
- }
- return parse(blob, options);
- }
-
- function init_cfb(cfb, opts) {
- var o = opts || {}, root = o.root || "Root Entry";
- if(!cfb.FullPaths) cfb.FullPaths = [];
- if(!cfb.FileIndex) cfb.FileIndex = [];
- if(cfb.FullPaths.length !== cfb.FileIndex.length) throw new Error("inconsistent CFB structure");
- if(cfb.FullPaths.length === 0) {
- cfb.FullPaths[0] = root + "/";
- cfb.FileIndex[0] = ({ name: root, type: 5 });
- }
- if(o.CLSID) cfb.FileIndex[0].clsid = o.CLSID;
- seed_cfb(cfb);
- }
- function seed_cfb(cfb) {
- var nm = "\u0001Sh33tJ5";
- if(CFB.find(cfb, "/" + nm)) return;
- var p = new_buf(4); p[0] = 55; p[1] = p[3] = 50; p[2] = 54;
- cfb.FileIndex.push(({ name: nm, type: 2, content:p, size:4, L:69, R:69, C:69 }));
- cfb.FullPaths.push(cfb.FullPaths[0] + nm);
- rebuild_cfb(cfb);
- }
- function rebuild_cfb(cfb, f) {
- init_cfb(cfb);
- var gc = false, s = false;
- for(var i = cfb.FullPaths.length - 1; i >= 0; --i) {
- var _file = cfb.FileIndex[i];
- switch(_file.type) {
- case 0:
- if(s) gc = true;
- else { cfb.FileIndex.pop(); cfb.FullPaths.pop(); }
- break;
- case 1: case 2: case 5:
- s = true;
- if(isNaN(_file.R * _file.L * _file.C)) gc = true;
- if(_file.R > -1 && _file.L > -1 && _file.R == _file.L) gc = true;
- break;
- default: gc = true; break;
- }
- }
- if(!gc && !f) return;
-
- var now = new Date(1987, 1, 19), j = 0;
- var data = [];
- for(i = 0; i < cfb.FullPaths.length; ++i) {
- if(cfb.FileIndex[i].type === 0) continue;
- data.push([cfb.FullPaths[i], cfb.FileIndex[i]]);
- }
- for(i = 0; i < data.length; ++i) {
- var dad = dirname(data[i][0]);
- s = false;
- for(j = 0; j < data.length; ++j) if(data[j][0] === dad) s = true;
- if(!s) data.push([dad, ({
- name: filename(dad).replace("/",""),
- type: 1,
- clsid: HEADER_CLSID,
- ct: now, mt: now,
- content: null
- })]);
- }
-
- data.sort(function(x,y) { return namecmp(x[0], y[0]); });
- cfb.FullPaths = []; cfb.FileIndex = [];
- for(i = 0; i < data.length; ++i) { cfb.FullPaths[i] = data[i][0]; cfb.FileIndex[i] = data[i][1]; }
- for(i = 0; i < data.length; ++i) {
- var elt = cfb.FileIndex[i];
- var nm = cfb.FullPaths[i];
-
- elt.name = filename(nm).replace("/","");
- elt.L = elt.R = elt.C = -(elt.color = 1);
- elt.size = elt.content ? elt.content.length : 0;
- elt.start = 0;
- elt.clsid = (elt.clsid || HEADER_CLSID);
- if(i === 0) {
- elt.C = data.length > 1 ? 1 : -1;
- elt.size = 0;
- elt.type = 5;
- } else if(nm.slice(-1) == "/") {
- for(j=i+1;j < data.length; ++j) if(dirname(cfb.FullPaths[j])==nm) break;
- elt.C = j >= data.length ? -1 : j;
- for(j=i+1;j < data.length; ++j) if(dirname(cfb.FullPaths[j])==dirname(nm)) break;
- elt.R = j >= data.length ? -1 : j;
- elt.type = 1;
- } else {
- if(dirname(cfb.FullPaths[i+1]||"") == dirname(nm)) elt.R = i + 1;
- elt.type = 2;
- }
- }
-
- }
-
- function _write(cfb, options) {
- var _opts = options || {};
- rebuild_cfb(cfb);
- if(_opts.fileType == 'zip') return write_zip(cfb, _opts);
- var L = (function(cfb){
- var mini_size = 0, fat_size = 0;
- for(var i = 0; i < cfb.FileIndex.length; ++i) {
- var file = cfb.FileIndex[i];
- if(!file.content) continue;
- var flen = file.content.length;
- if(flen > 0){
- if(flen < 0x1000) mini_size += (flen + 0x3F) >> 6;
- else fat_size += (flen + 0x01FF) >> 9;
- }
- }
- var dir_cnt = (cfb.FullPaths.length +3) >> 2;
- var mini_cnt = (mini_size + 7) >> 3;
- var mfat_cnt = (mini_size + 0x7F) >> 7;
- var fat_base = mini_cnt + fat_size + dir_cnt + mfat_cnt;
- var fat_cnt = (fat_base + 0x7F) >> 7;
- var difat_cnt = fat_cnt <= 109 ? 0 : Math.ceil((fat_cnt-109)/0x7F);
- while(((fat_base + fat_cnt + difat_cnt + 0x7F) >> 7) > fat_cnt) difat_cnt = ++fat_cnt <= 109 ? 0 : Math.ceil((fat_cnt-109)/0x7F);
- var L = [1, difat_cnt, fat_cnt, mfat_cnt, dir_cnt, fat_size, mini_size, 0];
- cfb.FileIndex[0].size = mini_size << 6;
- L[7] = (cfb.FileIndex[0].start=L[0]+L[1]+L[2]+L[3]+L[4]+L[5])+((L[6]+7) >> 3);
- return L;
- })(cfb);
- var o = new_buf(L[7] << 9);
- var i = 0, T = 0;
- {
- for(i = 0; i < 8; ++i) o.write_shift(1, HEADER_SIG[i]);
- for(i = 0; i < 8; ++i) o.write_shift(2, 0);
- o.write_shift(2, 0x003E);
- o.write_shift(2, 0x0003);
- o.write_shift(2, 0xFFFE);
- o.write_shift(2, 0x0009);
- o.write_shift(2, 0x0006);
- for(i = 0; i < 3; ++i) o.write_shift(2, 0);
- o.write_shift(4, 0);
- o.write_shift(4, L[2]);
- o.write_shift(4, L[0] + L[1] + L[2] + L[3] - 1);
- o.write_shift(4, 0);
- o.write_shift(4, 1<<12);
- o.write_shift(4, L[3] ? L[0] + L[1] + L[2] - 1: ENDOFCHAIN);
- o.write_shift(4, L[3]);
- o.write_shift(-4, L[1] ? L[0] - 1: ENDOFCHAIN);
- o.write_shift(4, L[1]);
- for(i = 0; i < 109; ++i) o.write_shift(-4, i < L[2] ? L[1] + i : -1);
- }
- if(L[1]) {
- for(T = 0; T < L[1]; ++T) {
- for(; i < 236 + T * 127; ++i) o.write_shift(-4, i < L[2] ? L[1] + i : -1);
- o.write_shift(-4, T === L[1] - 1 ? ENDOFCHAIN : T + 1);
- }
- }
- var chainit = function(w) {
- for(T += w; i<T-1; ++i) o.write_shift(-4, i+1);
- if(w) { ++i; o.write_shift(-4, ENDOFCHAIN); }
- };
- T = i = 0;
- for(T+=L[1]; i<T; ++i) o.write_shift(-4, consts.DIFSECT);
- for(T+=L[2]; i<T; ++i) o.write_shift(-4, consts.FATSECT);
- chainit(L[3]);
- chainit(L[4]);
- var j = 0, flen = 0;
- var file = cfb.FileIndex[0];
- for(; j < cfb.FileIndex.length; ++j) {
- file = cfb.FileIndex[j];
- if(!file.content) continue;
- flen = file.content.length;
- if(flen < 0x1000) continue;
- file.start = T;
- chainit((flen + 0x01FF) >> 9);
- }
- chainit((L[6] + 7) >> 3);
- while(o.l & 0x1FF) o.write_shift(-4, consts.ENDOFCHAIN);
- T = i = 0;
- for(j = 0; j < cfb.FileIndex.length; ++j) {
- file = cfb.FileIndex[j];
- if(!file.content) continue;
- flen = file.content.length;
- if(!flen || flen >= 0x1000) continue;
- file.start = T;
- chainit((flen + 0x3F) >> 6);
- }
- while(o.l & 0x1FF) o.write_shift(-4, consts.ENDOFCHAIN);
- for(i = 0; i < L[4]<<2; ++i) {
- var nm = cfb.FullPaths[i];
- if(!nm || nm.length === 0) {
- for(j = 0; j < 17; ++j) o.write_shift(4, 0);
- for(j = 0; j < 3; ++j) o.write_shift(4, -1);
- for(j = 0; j < 12; ++j) o.write_shift(4, 0);
- continue;
- }
- file = cfb.FileIndex[i];
- if(i === 0) file.start = file.size ? file.start - 1 : ENDOFCHAIN;
- var _nm = (i === 0 && _opts.root) || file.name;
- flen = 2*(_nm.length+1);
- o.write_shift(64, _nm, "utf16le");
- o.write_shift(2, flen);
- o.write_shift(1, file.type);
- o.write_shift(1, file.color);
- o.write_shift(-4, file.L);
- o.write_shift(-4, file.R);
- o.write_shift(-4, file.C);
- if(!file.clsid) for(j = 0; j < 4; ++j) o.write_shift(4, 0);
- else o.write_shift(16, file.clsid, "hex");
- o.write_shift(4, file.state || 0);
- o.write_shift(4, 0); o.write_shift(4, 0);
- o.write_shift(4, 0); o.write_shift(4, 0);
- o.write_shift(4, file.start);
- o.write_shift(4, file.size); o.write_shift(4, 0);
- }
- for(i = 1; i < cfb.FileIndex.length; ++i) {
- file = cfb.FileIndex[i];
- if(file.size >= 0x1000) {
- o.l = (file.start+1) << 9;
- for(j = 0; j < file.size; ++j) o.write_shift(1, file.content[j]);
- for(; j & 0x1FF; ++j) o.write_shift(1, 0);
- }
- }
- for(i = 1; i < cfb.FileIndex.length; ++i) {
- file = cfb.FileIndex[i];
- if(file.size > 0 && file.size < 0x1000) {
- for(j = 0; j < file.size; ++j) o.write_shift(1, file.content[j]);
- for(; j & 0x3F; ++j) o.write_shift(1, 0);
- }
- }
- while(o.l < o.length) o.write_shift(1, 0);
- return o;
- }
- /* [MS-CFB] 2.6.4 (Unicode 3.0.1 case conversion) */
- function find(cfb, path) {
- var UCFullPaths = cfb.FullPaths.map(function(x) { return x.toUpperCase(); });
- var UCPaths = UCFullPaths.map(function(x) { var y = x.split("/"); return y[y.length - (x.slice(-1) == "/" ? 2 : 1)]; });
- var k = false;
- if(path.charCodeAt(0) === 47 /* "/" */) { k = true; path = UCFullPaths[0].slice(0, -1) + path; }
- else k = path.indexOf("/") !== -1;
- var UCPath = path.toUpperCase();
- var w = k === true ? UCFullPaths.indexOf(UCPath) : UCPaths.indexOf(UCPath);
- if(w !== -1) return cfb.FileIndex[w];
-
- var m = !UCPath.match(chr1);
- UCPath = UCPath.replace(chr0,'');
- if(m) UCPath = UCPath.replace(chr1,'!');
- for(w = 0; w < UCFullPaths.length; ++w) {
- if((m ? UCFullPaths[w].replace(chr1,'!') : UCFullPaths[w]).replace(chr0,'') == UCPath) return cfb.FileIndex[w];
- if((m ? UCPaths[w].replace(chr1,'!') : UCPaths[w]).replace(chr0,'') == UCPath) return cfb.FileIndex[w];
- }
- return null;
- }
- /** CFB Constants */
- var MSSZ = 64; /* Mini Sector Size = 1<<6 */
- //var MSCSZ = 4096; /* Mini Stream Cutoff Size */
- /* 2.1 Compound File Sector Numbers and Types */
- var ENDOFCHAIN = -2;
- /* 2.2 Compound File Header */
- var HEADER_SIGNATURE = 'd0cf11e0a1b11ae1';
- var HEADER_SIG = [0xD0, 0xCF, 0x11, 0xE0, 0xA1, 0xB1, 0x1A, 0xE1];
- var HEADER_CLSID = '00000000000000000000000000000000';
- var consts = {
- /* 2.1 Compund File Sector Numbers and Types */
- MAXREGSECT: -6,
- DIFSECT: -4,
- FATSECT: -3,
- ENDOFCHAIN: ENDOFCHAIN,
- FREESECT: -1,
- /* 2.2 Compound File Header */
- HEADER_SIGNATURE: HEADER_SIGNATURE,
- HEADER_MINOR_VERSION: '3e00',
- MAXREGSID: -6,
- NOSTREAM: -1,
- HEADER_CLSID: HEADER_CLSID,
- /* 2.6.1 Compound File Directory Entry */
- EntryTypes: ['unknown','storage','stream','lockbytes','property','root']
- };
-
- function write_file(cfb, filename, options) {
- get_fs();
- var o = _write(cfb, options);
- fs.writeFileSync(filename, o);
- }
-
- function a2s(o) {
- var out = new Array(o.length);
- for(var i = 0; i < o.length; ++i) out[i] = String.fromCharCode(o[i]);
- return out.join("");
- }
-
- function write(cfb, options) {
- var o = _write(cfb, options);
- switch(options && options.type) {
- case "file": get_fs(); fs.writeFileSync(options.filename, (o)); return o;
- case "binary": return a2s(o);
- case "base64": return Base64.encode(a2s(o));
- }
- return o;
- }
- /* node < 8.1 zlib does not expose bytesRead, so default to pure JS */
- var _zlib;
- function use_zlib(zlib) { try {
- var InflateRaw = zlib.InflateRaw;
- var InflRaw = new InflateRaw();
- InflRaw._processChunk(new Uint8Array([3, 0]), InflRaw._finishFlushFlag);
- if(InflRaw.bytesRead) _zlib = zlib;
- else throw new Error("zlib does not expose bytesRead");
- } catch(e) {console.error("cannot use native zlib: " + (e.message || e)); } }
-
- function _inflateRawSync(payload, usz) {
- if(!_zlib) return _inflate(payload, usz);
- var InflateRaw = _zlib.InflateRaw;
- var InflRaw = new InflateRaw();
- var out = InflRaw._processChunk(payload.slice(payload.l), InflRaw._finishFlushFlag);
- payload.l += InflRaw.bytesRead;
- return out;
- }
-
- function _deflateRawSync(payload) {
- return _zlib ? _zlib.deflateRawSync(payload) : _deflate(payload);
- }
- var CLEN_ORDER = [ 16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15 ];
-
- /* 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 ]; */
- 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 ];
-
- /* 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 ]; */
- 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 ];
-
- function bit_swap_8(n) { var t = (((((n<<1)|(n<<11)) & 0x22110) | (((n<<5)|(n<<15)) & 0x88440))); return ((t>>16) | (t>>8) |t)&0xFF; }
-
- var use_typed_arrays = typeof Uint8Array !== 'undefined';
-
- var bitswap8 = use_typed_arrays ? new Uint8Array(1<<8) : [];
- for(var q = 0; q < (1<<8); ++q) bitswap8[q] = bit_swap_8(q);
-
- function bit_swap_n(n, b) {
- var rev = bitswap8[n & 0xFF];
- if(b <= 8) return rev >>> (8-b);
- rev = (rev << 8) | bitswap8[(n>>8)&0xFF];
- if(b <= 16) return rev >>> (16-b);
- rev = (rev << 8) | bitswap8[(n>>16)&0xFF];
- return rev >>> (24-b);
- }
-
- /* helpers for unaligned bit reads */
- 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; }
- 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; }
- 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; }
- 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; }
- 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; }
-
- /* works up to n = 3 * 8 + 1 = 25 */
- function read_bits_n(buf, bl, n) {
- var w = (bl&7), h = (bl>>>3), f = ((1<<n)-1);
- var v = buf[h] >>> w;
- if(n < 8 - w) return v & f;
- v |= buf[h+1]<<(8-w);
- if(n < 16 - w) return v & f;
- v |= buf[h+2]<<(16-w);
- if(n < 24 - w) return v & f;
- v |= buf[h+3]<<(24-w);
- return v & f;
- }
-
- /* until ArrayBuffer#realloc is a thing, fake a realloc */
- function realloc(b, sz) {
- var L = b.length, M = 2*L > sz ? 2*L : sz + 5, i = 0;
- if(L >= sz) return b;
- if(has_buf) {
- var o = new_unsafe_buf(M);
- // $FlowIgnore
- if(b.copy) b.copy(o);
- else for(; i < b.length; ++i) o[i] = b[i];
- return o;
- } else if(use_typed_arrays) {
- var a = new Uint8Array(M);
- if(a.set) a.set(b);
- else for(; i < b.length; ++i) a[i] = b[i];
- return a;
- }
- b.length = M;
- return b;
- }
-
- /* zero-filled arrays for older browsers */
- function zero_fill_array(n) {
- var o = new Array(n);
- for(var i = 0; i < n; ++i) o[i] = 0;
- return o;
- }var _deflate = (function() {
- var _deflateRaw = (function() {
- return function deflateRaw(data, out) {
- var boff = 0;
- while(boff < data.length) {
- var L = Math.min(0xFFFF, data.length - boff);
- var h = boff + L == data.length;
- /* TODO: this is only type 0 stored */
- out.write_shift(1, +h);
- out.write_shift(2, L);
- out.write_shift(2, (~L) & 0xFFFF);
- while(L-- > 0) out[out.l++] = data[boff++];
- }
- return out.l;
- };
- })();
-
- return function(data) {
- var buf = new_buf(50+Math.floor(data.length*1.1));
- var off = _deflateRaw(data, buf);
- return buf.slice(0, off);
- };
- })();
- /* modified inflate function also moves original read head */
-
- /* build tree (used for literals and lengths) */
- function build_tree(clens, cmap, MAX) {
- var maxlen = 1, w = 0, i = 0, j = 0, ccode = 0, L = clens.length;
-
- var bl_count = use_typed_arrays ? new Uint16Array(32) : zero_fill_array(32);
- for(i = 0; i < 32; ++i) bl_count[i] = 0;
-
- for(i = L; i < MAX; ++i) clens[i] = 0;
- L = clens.length;
-
- var ctree = use_typed_arrays ? new Uint16Array(L) : zero_fill_array(L); // []
-
- /* build code tree */
- for(i = 0; i < L; ++i) {
- bl_count[(w = clens[i])]++;
- if(maxlen < w) maxlen = w;
- ctree[i] = 0;
- }
- bl_count[0] = 0;
- for(i = 1; i <= maxlen; ++i) bl_count[i+16] = (ccode = (ccode + bl_count[i-1])<<1);
- for(i = 0; i < L; ++i) {
- ccode = clens[i];
- if(ccode != 0) ctree[i] = bl_count[ccode+16]++;
- }
-
- /* cmap[maxlen + 4 bits] = (off&15) + (lit<<4) reverse mapping */
- var cleni = 0;
- for(i = 0; i < L; ++i) {
- cleni = clens[i];
- if(cleni != 0) {
- ccode = bit_swap_n(ctree[i], maxlen)>>(maxlen-cleni);
- for(j = (1<<(maxlen + 4 - cleni)) - 1; j>=0; --j)
- cmap[ccode|(j<<cleni)] = (cleni&15) | (i<<4);
- }
- }
- return maxlen;
- }
-
- var fix_lmap = use_typed_arrays ? new Uint16Array(512) : zero_fill_array(512);
- var fix_dmap = use_typed_arrays ? new Uint16Array(32) : zero_fill_array(32);
- if(!use_typed_arrays) {
- for(var i = 0; i < 512; ++i) fix_lmap[i] = 0;
- for(i = 0; i < 32; ++i) fix_dmap[i] = 0;
- }
- (function() {
- var dlens = [];
- var i = 0;
- for(;i<32; i++) dlens.push(5);
- build_tree(dlens, fix_dmap, 32);
-
- var clens = [];
- i = 0;
- for(; i<=143; i++) clens.push(8);
- for(; i<=255; i++) clens.push(9);
- for(; i<=279; i++) clens.push(7);
- for(; i<=287; i++) clens.push(8);
- build_tree(clens, fix_lmap, 288);
- })();
-
- var dyn_lmap = use_typed_arrays ? new Uint16Array(32768) : zero_fill_array(32768);
- var dyn_dmap = use_typed_arrays ? new Uint16Array(32768) : zero_fill_array(32768);
- var dyn_cmap = use_typed_arrays ? new Uint16Array(128) : zero_fill_array(128);
- var dyn_len_1 = 1, dyn_len_2 = 1;
-
- /* 5.5.3 Expanding Huffman Codes */
- function dyn(data, boff) {
- /* nomenclature from RFC1951 refers to bit values; these are offset by the implicit constant */
- var _HLIT = read_bits_5(data, boff) + 257; boff += 5;
- var _HDIST = read_bits_5(data, boff) + 1; boff += 5;
- var _HCLEN = read_bits_4(data, boff) + 4; boff += 4;
- var w = 0;
-
- /* grab and store code lengths */
- var clens = use_typed_arrays ? new Uint8Array(19) : zero_fill_array(19);
- var ctree = [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ];
- var maxlen = 1;
- var bl_count = use_typed_arrays ? new Uint8Array(8) : zero_fill_array(8);
- var next_code = use_typed_arrays ? new Uint8Array(8) : zero_fill_array(8);
- var L = clens.length; /* 19 */
- for(var i = 0; i < _HCLEN; ++i) {
- clens[CLEN_ORDER[i]] = w = read_bits_3(data, boff);
- if(maxlen < w) maxlen = w;
- bl_count[w]++;
- boff += 3;
- }
-
- /* build code tree */
- var ccode = 0;
- bl_count[0] = 0;
- for(i = 1; i <= maxlen; ++i) next_code[i] = ccode = (ccode + bl_count[i-1])<<1;
- for(i = 0; i < L; ++i) if((ccode = clens[i]) != 0) ctree[i] = next_code[ccode]++;
- /* cmap[7 bits from stream] = (off&7) + (lit<<3) */
- var cleni = 0;
- for(i = 0; i < L; ++i) {
- cleni = clens[i];
- if(cleni != 0) {
- ccode = bitswap8[ctree[i]]>>(8-cleni);
- for(var j = (1<<(7-cleni))-1; j>=0; --j) dyn_cmap[ccode|(j<<cleni)] = (cleni&7) | (i<<3);
- }
- }
-
- /* read literal and dist codes at once */
- var hcodes = [];
- maxlen = 1;
- for(; hcodes.length < _HLIT + _HDIST;) {
- ccode = dyn_cmap[read_bits_7(data, boff)];
- boff += ccode & 7;
- switch((ccode >>>= 3)) {
- case 16:
- w = 3 + read_bits_2(data, boff); boff += 2;
- ccode = hcodes[hcodes.length - 1];
- while(w-- > 0) hcodes.push(ccode);
- break;
- case 17:
- w = 3 + read_bits_3(data, boff); boff += 3;
- while(w-- > 0) hcodes.push(0);
- break;
- case 18:
- w = 11 + read_bits_7(data, boff); boff += 7;
- while(w -- > 0) hcodes.push(0);
- break;
- default:
- hcodes.push(ccode);
- if(maxlen < ccode) maxlen = ccode;
- break;
- }
- }
-
- /* build literal / length trees */
- var h1 = hcodes.slice(0, _HLIT), h2 = hcodes.slice(_HLIT);
- for(i = _HLIT; i < 286; ++i) h1[i] = 0;
- for(i = _HDIST; i < 30; ++i) h2[i] = 0;
- dyn_len_1 = build_tree(h1, dyn_lmap, 286);
- dyn_len_2 = build_tree(h2, dyn_dmap, 30);
- return boff;
- }
-
- /* return [ data, bytesRead ] */
- function inflate(data, usz) {
- /* shortcircuit for empty buffer [0x03, 0x00] */
- if(data[0] == 3 && !(data[1] & 0x3)) { return [new_raw_buf(usz), 2]; }
-
- /* bit offset */
- var boff = 0;
-
- /* header includes final bit and type bits */
- var header = 0;
-
- var outbuf = new_unsafe_buf(usz ? usz : (1<<18));
- var woff = 0;
- var OL = outbuf.length>>>0;
- var max_len_1 = 0, max_len_2 = 0;
-
- while((header&1) == 0) {
- header = read_bits_3(data, boff); boff += 3;
- if((header >>> 1) == 0) {
- /* Stored block */
- if(boff & 7) boff += 8 - (boff&7);
- /* 2 bytes sz, 2 bytes bit inverse */
- var sz = data[boff>>>3] | data[(boff>>>3)+1]<<8;
- boff += 32;
- /* push sz bytes */
- if(!usz && OL < woff + sz) { outbuf = realloc(outbuf, woff + sz); OL = outbuf.length; }
- if(typeof data.copy === 'function') {
- // $FlowIgnore
- data.copy(outbuf, woff, boff>>>3, (boff>>>3)+sz);
- woff += sz; boff += 8*sz;
- } else while(sz-- > 0) { outbuf[woff++] = data[boff>>>3]; boff += 8; }
- continue;
- } else if((header >>> 1) == 1) {
- /* Fixed Huffman */
- max_len_1 = 9; max_len_2 = 5;
- } else {
- /* Dynamic Huffman */
- boff = dyn(data, boff);
- max_len_1 = dyn_len_1; max_len_2 = dyn_len_2;
- }
- if(!usz && (OL < woff + 32767)) { outbuf = realloc(outbuf, woff + 32767); OL = outbuf.length; }
- for(;;) { // while(true) is apparently out of vogue in modern JS circles
- /* ingest code and move read head */
- var bits = read_bits_n(data, boff, max_len_1);
- var code = (header>>>1) == 1 ? fix_lmap[bits] : dyn_lmap[bits];
- boff += code & 15; code >>>= 4;
- /* 0-255 are literals, 256 is end of block token, 257+ are copy tokens */
- if(((code>>>8)&0xFF) === 0) outbuf[woff++] = code;
- else if(code == 256) break;
- else {
- code -= 257;
- var len_eb = (code < 8) ? 0 : ((code-4)>>2); if(len_eb > 5) len_eb = 0;
- var tgt = woff + LEN_LN[code];
- /* length extra bits */
- if(len_eb > 0) {
- tgt += read_bits_n(data, boff, len_eb);
- boff += len_eb;
- }
-
- /* dist code */
- bits = read_bits_n(data, boff, max_len_2);
- code = (header>>>1) == 1 ? fix_dmap[bits] : dyn_dmap[bits];
- boff += code & 15; code >>>= 4;
- var dst_eb = (code < 4 ? 0 : (code-2)>>1);
- var dst = DST_LN[code];
- /* dist extra bits */
- if(dst_eb > 0) {
- dst += read_bits_n(data, boff, dst_eb);
- boff += dst_eb;
- }
-
- /* in the common case, manual byte copy is faster than TA set / Buffer copy */
- if(!usz && OL < tgt) { outbuf = realloc(outbuf, tgt); OL = outbuf.length; }
- while(woff < tgt) { outbuf[woff] = outbuf[woff - dst]; ++woff; }
- }
- }
- }
- return [usz ? outbuf : outbuf.slice(0, woff), (boff+7)>>>3];
- }
-
- function _inflate(payload, usz) {
- var data = payload.slice(payload.l||0);
- var out = inflate(data, usz);
- payload.l += out[1];
- return out[0];
- }
-
- function warn_or_throw(wrn, msg) {
- if(wrn) { if(typeof console !== 'undefined') console.error(msg); }
- else throw new Error(msg);
- }
-
- function parse_zip(file, options) {
- var blob = file;
- prep_blob(blob, 0);
-
- var FileIndex = [], FullPaths = [];
- var o = {
- FileIndex: FileIndex,
- FullPaths: FullPaths
- };
- init_cfb(o, { root: options.root });
-
- /* find end of central directory, start just after signature */
- var i = blob.length - 4;
- while((blob[i] != 0x50 || blob[i+1] != 0x4b || blob[i+2] != 0x05 || blob[i+3] != 0x06) && i >= 0) --i;
- blob.l = i + 4;
-
- /* parse end of central directory */
- blob.l += 4;
- var fcnt = blob.read_shift(2);
- blob.l += 6;
- var start_cd = blob.read_shift(4);
-
- /* parse central directory */
- blob.l = start_cd;
-
- for(i = 0; i < fcnt; ++i) {
- /* trust local file header instead of CD entry */
- blob.l += 20;
- var csz = blob.read_shift(4);
- var usz = blob.read_shift(4);
- var namelen = blob.read_shift(2);
- var efsz = blob.read_shift(2);
- var fcsz = blob.read_shift(2);
- blob.l += 8;
- var offset = blob.read_shift(4);
- var EF = parse_extra_field(blob.slice(blob.l+namelen, blob.l+namelen+efsz));
- blob.l += namelen + efsz + fcsz;
-
- var L = blob.l;
- blob.l = offset + 4;
- parse_local_file(blob, csz, usz, o, EF);
- blob.l = L;
- }
-
- return o;
- }
-
-
- /* head starts just after local file header signature */
- function parse_local_file(blob, csz, usz, o, EF) {
- /* [local file header] */
- blob.l += 2;
- var flags = blob.read_shift(2);
- var meth = blob.read_shift(2);
- var date = parse_dos_date(blob);
-
- if(flags & 0x2041) throw new Error("Unsupported ZIP encryption");
- var crc32 = blob.read_shift(4);
- var _csz = blob.read_shift(4);
- var _usz = blob.read_shift(4);
-
- var namelen = blob.read_shift(2);
- var efsz = blob.read_shift(2);
-
- // TODO: flags & (1<<11) // UTF8
- var name = ""; for(var i = 0; i < namelen; ++i) name += String.fromCharCode(blob[blob.l++]);
- if(efsz) {
- var ef = parse_extra_field(blob.slice(blob.l, blob.l + efsz));
- if((ef[0x5455]||{}).mt) date = ef[0x5455].mt;
- if(((EF||{})[0x5455]||{}).mt) date = EF[0x5455].mt;
- }
- blob.l += efsz;
-
- /* [encryption header] */
-
- /* [file data] */
- var data = blob.slice(blob.l, blob.l + _csz);
- switch(meth) {
- case 8: data = _inflateRawSync(blob, _usz); break;
- case 0: break;
- default: throw new Error("Unsupported ZIP Compression method " + meth);
- }
-
- /* [data descriptor] */
- var wrn = false;
- if(flags & 8) {
- crc32 = blob.read_shift(4);
- if(crc32 == 0x08074b50) { crc32 = blob.read_shift(4); wrn = true; }
- _csz = blob.read_shift(4);
- _usz = blob.read_shift(4);
- }
-
- if(_csz != csz) warn_or_throw(wrn, "Bad compressed size: " + csz + " != " + _csz);
- if(_usz != usz) warn_or_throw(wrn, "Bad uncompressed size: " + usz + " != " + _usz);
- var _crc32 = CRC32.buf(data, 0);
- if((crc32>>0) != (_crc32>>0)) warn_or_throw(wrn, "Bad CRC32 checksum: " + crc32 + " != " + _crc32);
- cfb_add(o, name, data, {unsafe: true, mt: date});
- }
- function write_zip(cfb, options) {
- var _opts = options || {};
- var out = [], cdirs = [];
- var o = new_buf(1);
- var method = (_opts.compression ? 8 : 0), flags = 0;
- var desc = false;
- if(desc) flags |= 8;
- var i = 0, j = 0;
-
- var start_cd = 0, fcnt = 0;
- var root = cfb.FullPaths[0], fp = root, fi = cfb.FileIndex[0];
- var crcs = [];
- var sz_cd = 0;
-
- for(i = 1; i < cfb.FullPaths.length; ++i) {
- fp = cfb.FullPaths[i].slice(root.length); fi = cfb.FileIndex[i];
- if(!fi.size || !fi.content || fp == "\u0001Sh33tJ5") continue;
- var start = start_cd;
-
- /* TODO: CP437 filename */
- var namebuf = new_buf(fp.length);
- for(j = 0; j < fp.length; ++j) namebuf.write_shift(1, fp.charCodeAt(j) & 0x7F);
- namebuf = namebuf.slice(0, namebuf.l);
- crcs[fcnt] = CRC32.buf(fi.content, 0);
-
- var outbuf = fi.content;
- if(method == 8) outbuf = _deflateRawSync(outbuf);
-
- /* local file header */
- o = new_buf(30);
- o.write_shift(4, 0x04034b50);
- o.write_shift(2, 20);
- o.write_shift(2, flags);
- o.write_shift(2, method);
- /* TODO: last mod file time/date */
- if(fi.mt) write_dos_date(o, fi.mt);
- else o.write_shift(4, 0);
- o.write_shift(-4, (flags & 8) ? 0 : crcs[fcnt]);
- o.write_shift(4, (flags & 8) ? 0 : outbuf.length);
- o.write_shift(4, (flags & 8) ? 0 : fi.content.length);
- o.write_shift(2, namebuf.length);
- o.write_shift(2, 0);
-
- start_cd += o.length;
- out.push(o);
- start_cd += namebuf.length;
- out.push(namebuf);
-
- /* TODO: encryption header ? */
- start_cd += outbuf.length;
- out.push(outbuf);
-
- /* data descriptor */
- if(flags & 8) {
- o = new_buf(12);
- o.write_shift(-4, crcs[fcnt]);
- o.write_shift(4, outbuf.length);
- o.write_shift(4, fi.content.length);
- start_cd += o.l;
- out.push(o);
- }
-
- /* central directory */
- o = new_buf(46);
- o.write_shift(4, 0x02014b50);
- o.write_shift(2, 0);
- o.write_shift(2, 20);
- o.write_shift(2, flags);
- o.write_shift(2, method);
- o.write_shift(4, 0); /* TODO: last mod file time/date */
- o.write_shift(-4, crcs[fcnt]);
-
- o.write_shift(4, outbuf.length);
- o.write_shift(4, fi.content.length);
- o.write_shift(2, namebuf.length);
- o.write_shift(2, 0);
- o.write_shift(2, 0);
- o.write_shift(2, 0);
- o.write_shift(2, 0);
- o.write_shift(4, 0);
- o.write_shift(4, start);
-
- sz_cd += o.l;
- cdirs.push(o);
- sz_cd += namebuf.length;
- cdirs.push(namebuf);
- ++fcnt;
- }
-
- /* end of central directory */
- o = new_buf(22);
- o.write_shift(4, 0x06054b50);
- o.write_shift(2, 0);
- o.write_shift(2, 0);
- o.write_shift(2, fcnt);
- o.write_shift(2, fcnt);
- o.write_shift(4, sz_cd);
- o.write_shift(4, start_cd);
- o.write_shift(2, 0);
-
- return bconcat(([bconcat((out)), bconcat(cdirs), o]));
- }
- function cfb_new(opts) {
- var o = ({});
- init_cfb(o, opts);
- return o;
- }
-
- function cfb_add(cfb, name, content, opts) {
- var unsafe = opts && opts.unsafe;
- if(!unsafe) init_cfb(cfb);
- var file = !unsafe && CFB.find(cfb, name);
- if(!file) {
- var fpath = cfb.FullPaths[0];
- if(name.slice(0, fpath.length) == fpath) fpath = name;
- else {
- if(fpath.slice(-1) != "/") fpath += "/";
- fpath = (fpath + name).replace("//","/");
- }
- file = ({name: filename(name), type: 2});
- cfb.FileIndex.push(file);
- cfb.FullPaths.push(fpath);
- if(!unsafe) CFB.utils.cfb_gc(cfb);
- }
- file.content = (content);
- file.size = content ? content.length : 0;
- if(opts) {
- if(opts.CLSID) file.clsid = opts.CLSID;
- if(opts.mt) file.mt = opts.mt;
- if(opts.ct) file.ct = opts.ct;
- }
- return file;
- }
-
- function cfb_del(cfb, name) {
- init_cfb(cfb);
- var file = CFB.find(cfb, name);
- if(file) for(var j = 0; j < cfb.FileIndex.length; ++j) if(cfb.FileIndex[j] == file) {
- cfb.FileIndex.splice(j, 1);
- cfb.FullPaths.splice(j, 1);
- return true;
- }
- return false;
- }
-
- function cfb_mov(cfb, old_name, new_name) {
- init_cfb(cfb);
- var file = CFB.find(cfb, old_name);
- if(file) for(var j = 0; j < cfb.FileIndex.length; ++j) if(cfb.FileIndex[j] == file) {
- cfb.FileIndex[j].name = filename(new_name);
- cfb.FullPaths[j] = new_name;
- return true;
- }
- return false;
- }
-
- function cfb_gc(cfb) { rebuild_cfb(cfb, true); }
-
- exports.find = find;
- exports.read = read;
- exports.parse = parse;
- exports.write = write;
- exports.writeFile = write_file;
- exports.utils = {
- cfb_new: cfb_new,
- cfb_add: cfb_add,
- cfb_del: cfb_del,
- cfb_mov: cfb_mov,
- cfb_gc: cfb_gc,
- ReadShift: ReadShift,
- CheckField: CheckField,
- prep_blob: prep_blob,
- bconcat: bconcat,
- use_zlib: use_zlib,
- _deflateRaw: _deflate,
- _inflateRaw: _inflate,
- consts: consts
- };
-
- return exports;
- })();
-
- if( true && typeof DO_NOT_EXPORT_CFB === 'undefined') { module.exports = CFB; }
- var _fs;
- if(true) try { _fs = __webpack_require__(/*! fs */ "?58fb"); } catch(e) {}
-
- /* normalize data for blob ctor */
- function blobify(data) {
- if(typeof data === "string") return s2ab(data);
- if(Array.isArray(data)) return a2u(data);
- return data;
- }
- /* write or download file */
- function write_dl(fname, payload, enc) {
- /*global IE_SaveFile, Blob, navigator, saveAs, document, File, chrome */
- if(typeof _fs !== 'undefined' && _fs.writeFileSync) return enc ? _fs.writeFileSync(fname, payload, enc) : _fs.writeFileSync(fname, payload);
- var data = (enc == "utf8") ? utf8write(payload) : payload;
- if(typeof IE_SaveFile !== 'undefined') return IE_SaveFile(data, fname);
- if(typeof Blob !== 'undefined') {
- var blob = new Blob([blobify(data)], {type:"application/octet-stream"});
- if(typeof navigator !== 'undefined' && navigator.msSaveBlob) return navigator.msSaveBlob(blob, fname);
- if(typeof saveAs !== 'undefined') return saveAs(blob, fname);
- if(typeof URL !== 'undefined' && typeof document !== 'undefined' && document.createElement && URL.createObjectURL) {
- var url = URL.createObjectURL(blob);
- if(typeof chrome === 'object' && typeof (chrome.downloads||{}).download == "function") {
- if(URL.revokeObjectURL && typeof setTimeout !== 'undefined') setTimeout(function() { URL.revokeObjectURL(url); }, 60000);
- return chrome.downloads.download({ url: url, filename: fname, saveAs: true});
- }
- var a = document.createElement("a");
- if(a.download != null) {
- a.download = fname; a.href = url; document.body.appendChild(a); a.click();
- document.body.removeChild(a);
- if(URL.revokeObjectURL && typeof setTimeout !== 'undefined') setTimeout(function() { URL.revokeObjectURL(url); }, 60000);
- return url;
- }
- }
- }
- // $FlowIgnore
- if(typeof $ !== 'undefined' && typeof File !== 'undefined' && typeof Folder !== 'undefined') try { // extendscript
- // $FlowIgnore
- var out = File(fname); out.open("w"); out.encoding = "binary";
- if(Array.isArray(payload)) payload = a2s(payload);
- out.write(payload); out.close(); return payload;
- } catch(e) { if(!e.message || !e.message.match(/onstruct/)) throw e; }
- throw new Error("cannot save file " + fname);
- }
-
- /* read binary data from file */
- function read_binary(path) {
- if(typeof _fs !== 'undefined') return _fs.readFileSync(path);
- // $FlowIgnore
- if(typeof $ !== 'undefined' && typeof File !== 'undefined' && typeof Folder !== 'undefined') try { // extendscript
- // $FlowIgnore
- var infile = File(path); infile.open("r"); infile.encoding = "binary";
- var data = infile.read(); infile.close();
- return data;
- } catch(e) { if(!e.message || !e.message.match(/onstruct/)) throw e; }
- throw new Error("Cannot access file " + path);
- }
- function keys(o) {
- var ks = Object.keys(o), o2 = [];
- for(var i = 0; i < ks.length; ++i) if(Object.prototype.hasOwnProperty.call(o, ks[i])) o2.push(ks[i]);
- return o2;
- }
-
- function evert_key(obj, key) {
- var o = ([]), K = keys(obj);
- for(var i = 0; i !== K.length; ++i) if(o[obj[K[i]][key]] == null) o[obj[K[i]][key]] = K[i];
- return o;
- }
-
- function evert(obj) {
- var o = ([]), K = keys(obj);
- for(var i = 0; i !== K.length; ++i) o[obj[K[i]]] = K[i];
- return o;
- }
-
- function evert_num(obj) {
- var o = ([]), K = keys(obj);
- for(var i = 0; i !== K.length; ++i) o[obj[K[i]]] = parseInt(K[i],10);
- return o;
- }
-
- function evert_arr(obj) {
- var o = ([]), K = keys(obj);
- for(var i = 0; i !== K.length; ++i) {
- if(o[obj[K[i]]] == null) o[obj[K[i]]] = [];
- o[obj[K[i]]].push(K[i]);
- }
- return o;
- }
-
- var basedate = new Date(1899, 11, 30, 0, 0, 0); // 2209161600000
- function datenum(v, date1904) {
- var epoch = v.getTime();
- if(date1904) epoch -= 1462*24*60*60*1000;
- var dnthresh = basedate.getTime() + (v.getTimezoneOffset() - basedate.getTimezoneOffset()) * 60000;
- return (epoch - dnthresh) / (24 * 60 * 60 * 1000);
- }
- var refdate = new Date();
- var dnthresh = basedate.getTime() + (refdate.getTimezoneOffset() - basedate.getTimezoneOffset()) * 60000;
- var refoffset = refdate.getTimezoneOffset();
- function numdate(v) {
- var out = new Date();
- out.setTime(v * 24 * 60 * 60 * 1000 + dnthresh);
- if (out.getTimezoneOffset() !== refoffset) {
- out.setTime(out.getTime() + (out.getTimezoneOffset() - refoffset) * 60000);
- }
- return out;
- }
-
- /* ISO 8601 Duration */
- function parse_isodur(s) {
- var sec = 0, mt = 0, time = false;
- var m = s.match(/P([0-9\.]+Y)?([0-9\.]+M)?([0-9\.]+D)?T([0-9\.]+H)?([0-9\.]+M)?([0-9\.]+S)?/);
- if(!m) throw new Error("|" + s + "| is not an ISO8601 Duration");
- for(var i = 1; i != m.length; ++i) {
- if(!m[i]) continue;
- mt = 1;
- if(i > 3) time = true;
- switch(m[i].slice(m[i].length-1)) {
- case 'Y':
- throw new Error("Unsupported ISO Duration Field: " + m[i].slice(m[i].length-1));
- case 'D': mt *= 24;
- /* falls through */
- case 'H': mt *= 60;
- /* falls through */
- case 'M':
- if(!time) throw new Error("Unsupported ISO Duration Field: M");
- else mt *= 60;
- /* falls through */
- case 'S': break;
- }
- sec += mt * parseInt(m[i], 10);
- }
- return sec;
- }
-
- var good_pd_date = new Date('2017-02-19T19:06:09.000Z');
- if(isNaN(good_pd_date.getFullYear())) good_pd_date = new Date('2/19/17');
- var good_pd = good_pd_date.getFullYear() == 2017;
- /* parses a date as a local date */
- function parseDate(str, fixdate) {
- var d = new Date(str);
- if(good_pd) {
- if(fixdate > 0) d.setTime(d.getTime() + d.getTimezoneOffset() * 60 * 1000);
- else if(fixdate < 0) d.setTime(d.getTime() - d.getTimezoneOffset() * 60 * 1000);
- return d;
- }
- if(str instanceof Date) return str;
- if(good_pd_date.getFullYear() == 1917 && !isNaN(d.getFullYear())) {
- var s = d.getFullYear();
- if(str.indexOf("" + s) > -1) return d;
- d.setFullYear(d.getFullYear() + 100); return d;
- }
- var n = str.match(/\d+/g)||["2017","2","19","0","0","0"];
- var out = new Date(+n[0], +n[1] - 1, +n[2], (+n[3]||0), (+n[4]||0), (+n[5]||0));
- if(str.indexOf("Z") > -1) out = new Date(out.getTime() - out.getTimezoneOffset() * 60 * 1000);
- return out;
- }
-
- function cc2str(arr) {
- var o = "";
- for(var i = 0; i != arr.length; ++i) o += String.fromCharCode(arr[i]);
- return o;
- }
-
- function dup(o) {
- if(typeof JSON != 'undefined' && !Array.isArray(o)) return JSON.parse(JSON.stringify(o));
- if(typeof o != 'object' || o == null) return o;
- if(o instanceof Date) return new Date(o.getTime());
- var out = {};
- for(var k in o) if(Object.prototype.hasOwnProperty.call(o, k)) out[k] = dup(o[k]);
- return out;
- }
-
- function fill(c,l) { var o = ""; while(o.length < l) o+=c; return o; }
-
- /* TODO: stress test */
- function fuzzynum(s) {
- var v = Number(s);
- if(!isNaN(v)) return v;
- if(!/\d/.test(s)) return v;
- var wt = 1;
- var ss = s.replace(/([\d]),([\d])/g,"$1$2").replace(/[$]/g,"").replace(/[%]/g, function() { wt *= 100; return "";});
- if(!isNaN(v = Number(ss))) return v / wt;
- ss = ss.replace(/[(](.*)[)]/,function($$, $1) { wt = -wt; return $1;});
- if(!isNaN(v = Number(ss))) return v / wt;
- return v;
- }
- function fuzzydate(s) {
- var o = new Date(s), n = new Date(NaN);
- var y = o.getYear(), m = o.getMonth(), d = o.getDate();
- if(isNaN(d)) return n;
- if(y < 0 || y > 8099) return n;
- if((m > 0 || d > 1) && y != 101) return o;
- if(s.toLowerCase().match(/jan|feb|mar|apr|may|jun|jul|aug|sep|oct|nov|dec/)) return o;
- if(s.match(/[^-0-9:,\/\\]/)) return n;
- return o;
- }
-
- var safe_split_regex = "abacaba".split(/(:?b)/i).length == 5;
- function split_regex(str, re, def) {
- if(safe_split_regex || typeof re == "string") return str.split(re);
- var p = str.split(re), o = [p[0]];
- for(var i = 1; i < p.length; ++i) { o.push(def); o.push(p[i]); }
- return o;
- }
- function getdatastr(data) {
- if(!data) return null;
- if(data.data) return debom(data.data);
- if(data.asNodeBuffer && has_buf) return debom(data.asNodeBuffer().toString('binary'));
- if(data.asBinary) return debom(data.asBinary());
- if(data._data && data._data.getContent) return debom(cc2str(Array.prototype.slice.call(data._data.getContent(),0)));
- if(data.content && data.type) return debom(cc2str(data.content));
- return null;
- }
-
- function getdatabin(data) {
- if(!data) return null;
- if(data.data) return char_codes(data.data);
- if(data.asNodeBuffer && has_buf) return data.asNodeBuffer();
- if(data._data && data._data.getContent) {
- var o = data._data.getContent();
- if(typeof o == "string") return char_codes(o);
- return Array.prototype.slice.call(o);
- }
- if(data.content && data.type) return data.content;
- return null;
- }
-
- function getdata(data) { return (data && data.name.slice(-4) === ".bin") ? getdatabin(data) : getdatastr(data); }
-
- /* Part 2 Section 10.1.2 "Mapping Content Types" Names are case-insensitive */
- /* OASIS does not comment on filename case sensitivity */
- function safegetzipfile(zip, file) {
- var k = zip.FullPaths || keys(zip.files);
- var f = file.toLowerCase(), g = f.replace(/\//g,'\\');
- for(var i=0; i<k.length; ++i) {
- var n = k[i].toLowerCase();
- if(f == n || g == n) return zip.files[k[i]];
- }
- return null;
- }
-
- function getzipfile(zip, file) {
- var o = safegetzipfile(zip, file);
- if(o == null) throw new Error("Cannot find file " + file + " in zip");
- return o;
- }
-
- function getzipdata(zip, file, safe) {
- if(!safe) return getdata(getzipfile(zip, file));
- if(!file) return null;
- try { return getzipdata(zip, file); } catch(e) { return null; }
- }
-
- function getzipstr(zip, file, safe) {
- if(!safe) return getdatastr(getzipfile(zip, file));
- if(!file) return null;
- try { return getzipstr(zip, file); } catch(e) { return null; }
- }
-
- function zipentries(zip) {
- var k = zip.FullPaths || keys(zip.files), o = [];
- for(var i = 0; i < k.length; ++i) if(k[i].slice(-1) != '/') o.push(k[i]);
- return o.sort();
- }
-
- function zip_add_file(zip, path, content) {
- if(zip.FullPaths) CFB.utils.cfb_add(zip, path, content);
- else zip.file(path, content);
- }
-
- var jszip;
- /*global JSZipSync:true */
- if(typeof JSZipSync !== 'undefined') jszip = JSZipSync;
- if(true) {
- if( true && module.exports) {
- if(typeof jszip === 'undefined') jszip = __webpack_require__(/*! ./jszip.js */ "./node_modules/xlsx/jszip.js");
- }
- }
-
- function zip_new() {
- if(!jszip) return CFB.utils.cfb_new();
- return new jszip();
- }
-
- function zip_read(d, o) {
- var zip;
- if(jszip) switch(o.type) {
- case "base64": zip = new jszip(d, { base64:true }); break;
- case "binary": case "array": zip = new jszip(d, { base64:false }); break;
- case "buffer": zip = new jszip(d); break;
- default: throw new Error("Unrecognized type " + o.type);
- }
- else switch(o.type) {
- case "base64": zip = CFB.read(d, { type: "base64" }); break;
- case "binary": zip = CFB.read(d, { type: "binary" }); break;
- case "buffer": case "array": zip = CFB.read(d, { type: "buffer" }); break;
- default: throw new Error("Unrecognized type " + o.type);
- }
- return zip;
- }
-
- function resolve_path(path, base) {
- if(path.charAt(0) == "/") return path.slice(1);
- var result = base.split('/');
- if(base.slice(-1) != "/") result.pop(); // folder path
- var target = path.split('/');
- while (target.length !== 0) {
- var step = target.shift();
- if (step === '..') result.pop();
- else if (step !== '.') result.push(step);
- }
- return result.join('/');
- }
- var XML_HEADER = '<?xml version="1.0" encoding="UTF-8" standalone="yes"?>\r\n';
- var attregexg=/([^"\s?>\/]+)\s*=\s*((?:")([^"]*)(?:")|(?:')([^']*)(?:')|([^'">\s]+))/g;
- var tagregex=/<[\/\?]?[a-zA-Z0-9:_-]+(?:\s+[^"\s?>\/]+\s*=\s*(?:"[^"]*"|'[^']*'|[^'">\s=]+))*\s*[\/\?]?>/mg;
-
- if(!(XML_HEADER.match(tagregex))) tagregex = /<[^>]*>/g;
- var nsregex=/<\w*:/, nsregex2 = /<(\/?)\w+:/;
- function parsexmltag(tag, skip_root, skip_LC) {
- var z = ({});
- var eq = 0, c = 0;
- for(; eq !== tag.length; ++eq) if((c = tag.charCodeAt(eq)) === 32 || c === 10 || c === 13) break;
- if(!skip_root) z[0] = tag.slice(0, eq);
- if(eq === tag.length) return z;
- var m = tag.match(attregexg), j=0, v="", i=0, q="", cc="", quot = 1;
- if(m) for(i = 0; i != m.length; ++i) {
- cc = m[i];
- for(c=0; c != cc.length; ++c) if(cc.charCodeAt(c) === 61) break;
- q = cc.slice(0,c).trim();
- while(cc.charCodeAt(c+1) == 32) ++c;
- quot = ((eq=cc.charCodeAt(c+1)) == 34 || eq == 39) ? 1 : 0;
- v = cc.slice(c+1+quot, cc.length-quot);
- for(j=0;j!=q.length;++j) if(q.charCodeAt(j) === 58) break;
- if(j===q.length) {
- if(q.indexOf("_") > 0) q = q.slice(0, q.indexOf("_")); // from ods
- z[q] = v;
- if(!skip_LC) z[q.toLowerCase()] = v;
- }
- else {
- var k = (j===5 && q.slice(0,5)==="xmlns"?"xmlns":"")+q.slice(j+1);
- if(z[k] && q.slice(j-3,j) == "ext") continue; // from ods
- z[k] = v;
- if(!skip_LC) z[k.toLowerCase()] = v;
- }
- }
- return z;
- }
- function strip_ns(x) { return x.replace(nsregex2, "<$1"); }
-
- var encodings = {
- '"': '"',
- ''': "'",
- '>': '>',
- '<': '<',
- '&': '&'
- };
- var rencoding = evert(encodings);
- //var rencstr = "&<>'\"".split("");
-
- // TODO: CP remap (need to read file version to determine OS)
- var unescapexml = (function() {
- /* 22.4.2.4 bstr (Basic String) */
- var encregex = /&(?:quot|apos|gt|lt|amp|#x?([\da-fA-F]+));/ig, coderegex = /_x([\da-fA-F]{4})_/ig;
- return function unescapexml(text) {
- var s = text + '', i = s.indexOf("<![CDATA[");
- 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));});
- var j = s.indexOf("]]>");
- return unescapexml(s.slice(0, i)) + s.slice(i+9,j) + unescapexml(s.slice(j+3));
- };
- })();
-
- var decregex=/[&<>'"]/g, charegex = /[\u0000-\u0008\u000b-\u001f]/g;
- function escapexml(text){
- var s = text + '';
- return s.replace(decregex, function(y) { return rencoding[y]; }).replace(charegex,function(s) { return "_x" + ("000"+s.charCodeAt(0).toString(16)).slice(-4) + "_";});
- }
- function escapexmltag(text){ return escapexml(text).replace(/ /g,"_x0020_"); }
-
- var htmlcharegex = /[\u0000-\u001f]/g;
- function escapehtml(text){
- var s = text + '';
- 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) + ";"; });
- }
-
- function escapexlml(text){
- var s = text + '';
- return s.replace(decregex, function(y) { return rencoding[y]; }).replace(htmlcharegex,function(s) { return "&#x" + (s.charCodeAt(0).toString(16)).toUpperCase() + ";"; });
- }
-
- /* TODO: handle codepages */
- var xlml_fixstr = (function() {
- var entregex = /&#(\d+);/g;
- function entrepl($$,$1) { return String.fromCharCode(parseInt($1,10)); }
- return function xlml_fixstr(str) { return str.replace(entregex,entrepl); };
- })();
- var xlml_unfixstr = (function() {
- return function xlml_unfixstr(str) { return str.replace(/(\r\n|[\r\n])/g,"\ "); };
- })();
-
- function parsexmlbool(value) {
- switch(value) {
- case 1: case true: case '1': case 'true': case 'TRUE': return true;
- /* case '0': case 'false': case 'FALSE':*/
- default: return false;
- }
- }
-
- var utf8read = function utf8reada(orig) {
- var out = "", i = 0, c = 0, d = 0, e = 0, f = 0, w = 0;
- while (i < orig.length) {
- c = orig.charCodeAt(i++);
- if (c < 128) { out += String.fromCharCode(c); continue; }
- d = orig.charCodeAt(i++);
- if (c>191 && c<224) { f = ((c & 31) << 6); f |= (d & 63); out += String.fromCharCode(f); continue; }
- e = orig.charCodeAt(i++);
- if (c < 240) { out += String.fromCharCode(((c & 15) << 12) | ((d & 63) << 6) | (e & 63)); continue; }
- f = orig.charCodeAt(i++);
- w = (((c & 7) << 18) | ((d & 63) << 12) | ((e & 63) << 6) | (f & 63))-65536;
- out += String.fromCharCode(0xD800 + ((w>>>10)&1023));
- out += String.fromCharCode(0xDC00 + (w&1023));
- }
- return out;
- };
-
- var utf8write = function(orig) {
- var out = [], i = 0, c = 0, d = 0;
- while(i < orig.length) {
- c = orig.charCodeAt(i++);
- switch(true) {
- case c < 128: out.push(String.fromCharCode(c)); break;
- case c < 2048:
- out.push(String.fromCharCode(192 + (c >> 6)));
- out.push(String.fromCharCode(128 + (c & 63)));
- break;
- case c >= 55296 && c < 57344:
- c -= 55296; d = orig.charCodeAt(i++) - 56320 + (c<<10);
- out.push(String.fromCharCode(240 + ((d >>18) & 7)));
- out.push(String.fromCharCode(144 + ((d >>12) & 63)));
- out.push(String.fromCharCode(128 + ((d >> 6) & 63)));
- out.push(String.fromCharCode(128 + (d & 63)));
- break;
- default:
- out.push(String.fromCharCode(224 + (c >> 12)));
- out.push(String.fromCharCode(128 + ((c >> 6) & 63)));
- out.push(String.fromCharCode(128 + (c & 63)));
- }
- }
- return out.join("");
- };
-
- if(has_buf) {
- var utf8readb = function utf8readb(data) {
- var out = Buffer.alloc(2*data.length), w, i, j = 1, k = 0, ww=0, c;
- for(i = 0; i < data.length; i+=j) {
- j = 1;
- if((c=data.charCodeAt(i)) < 128) w = c;
- else if(c < 224) { w = (c&31)*64+(data.charCodeAt(i+1)&63); j=2; }
- else if(c < 240) { w=(c&15)*4096+(data.charCodeAt(i+1)&63)*64+(data.charCodeAt(i+2)&63); j=3; }
- else { j = 4;
- w = (c & 7)*262144+(data.charCodeAt(i+1)&63)*4096+(data.charCodeAt(i+2)&63)*64+(data.charCodeAt(i+3)&63);
- w -= 65536; ww = 0xD800 + ((w>>>10)&1023); w = 0xDC00 + (w&1023);
- }
- if(ww !== 0) { out[k++] = ww&255; out[k++] = ww>>>8; ww = 0; }
- out[k++] = w%256; out[k++] = w>>>8;
- }
- return out.slice(0,k).toString('ucs2');
- };
- var corpus = "foo bar baz\u00e2\u0098\u0083\u00f0\u009f\u008d\u00a3";
- if(utf8read(corpus) == utf8readb(corpus)) utf8read = utf8readb;
- var utf8readc = function utf8readc(data) { return Buffer_from(data, 'binary').toString('utf8'); };
- if(utf8read(corpus) == utf8readc(corpus)) utf8read = utf8readc;
-
- utf8write = function(data) { return Buffer_from(data, 'utf8').toString("binary"); };
- }
-
- // matches <foo>...</foo> extracts content
- var matchtag = (function() {
- var mtcache = ({});
- return function matchtag(f,g) {
- var t = f+"|"+(g||"");
- if(mtcache[t]) return mtcache[t];
- return (mtcache[t] = new RegExp('<(?:\\w+:)?'+f+'(?: xml:space="preserve")?(?:[^>]*)>([\\s\\S]*?)</(?:\\w+:)?'+f+'>',((g||""))));
- };
- })();
-
- var htmldecode = (function() {
- var entities = [
- ['nbsp', ' '], ['middot', '·'],
- ['quot', '"'], ['apos', "'"], ['gt', '>'], ['lt', '<'], ['amp', '&']
- ].map(function(x) { return [new RegExp('&' + x[0] + ';', "ig"), x[1]]; });
- return function htmldecode(str) {
- var o = str
- // Remove new lines and spaces from start of content
- .replace(/^[\t\n\r ]+/, "")
- // Remove new lines and spaces from end of content
- .replace(/[\t\n\r ]+$/,"")
- // Added line which removes any white space characters after and before html tags
- .replace(/>\s+/g,">").replace(/\s+</g,"<")
- // Replace remaining new lines and spaces with space
- .replace(/[\t\n\r ]+/g, " ")
- // Replace <br> tags with new lines
- .replace(/<\s*[bB][rR]\s*\/?>/g,"\n")
- // Strip HTML elements
- .replace(/<[^>]*>/g,"");
- for(var i = 0; i < entities.length; ++i) o = o.replace(entities[i][0], entities[i][1]);
- return o;
- };
- })();
-
- var vtregex = (function(){ var vt_cache = {};
- return function vt_regex(bt) {
- if(vt_cache[bt] !== undefined) return vt_cache[bt];
- return (vt_cache[bt] = new RegExp("<(?:vt:)?" + bt + ">([\\s\\S]*?)</(?:vt:)?" + bt + ">", 'g') );
- };})();
- var vtvregex = /<\/?(?:vt:)?variant>/g, vtmregex = /<(?:vt:)([^>]*)>([\s\S]*)</;
- function parseVector(data, opts) {
- var h = parsexmltag(data);
-
- var matches = data.match(vtregex(h.baseType))||[];
- var res = [];
- if(matches.length != h.size) {
- if(opts.WTF) throw new Error("unexpected vector length " + matches.length + " != " + h.size);
- return res;
- }
- matches.forEach(function(x) {
- var v = x.replace(vtvregex,"").match(vtmregex);
- if(v) res.push({v:utf8read(v[2]), t:v[1]});
- });
- return res;
- }
-
- var wtregex = /(^\s|\s$|\n)/;
- function writetag(f,g) { return '<' + f + (g.match(wtregex)?' xml:space="preserve"' : "") + '>' + g + '</' + f + '>'; }
-
- function wxt_helper(h) { return keys(h).map(function(k) { return " " + k + '="' + h[k] + '"';}).join(""); }
- function writextag(f,g,h) { return '<' + f + ((h != null) ? wxt_helper(h) : "") + ((g != null) ? (g.match(wtregex)?' xml:space="preserve"' : "") + '>' + g + '</' + f : "/") + '>';}
-
- function write_w3cdtf(d, t) { try { return d.toISOString().replace(/\.\d*/,""); } catch(e) { if(t) throw e; } return ""; }
-
- function write_vt(s, xlsx) {
- switch(typeof s) {
- case 'string':
- var o = writextag('vt:lpwstr', escapexml(s));
- if(xlsx) o = o.replace(/"/g, "_x0022_");
- return o;
- case 'number': return writextag((s|0)==s?'vt:i4':'vt:r8', escapexml(String(s)));
- case 'boolean': return writextag('vt:bool',s?'true':'false');
- }
- if(s instanceof Date) return writextag('vt:filetime', write_w3cdtf(s));
- throw new Error("Unable to serialize " + s);
- }
-
- var XMLNS = ({
- 'dc': 'http://purl.org/dc/elements/1.1/',
- 'dcterms': 'http://purl.org/dc/terms/',
- 'dcmitype': 'http://purl.org/dc/dcmitype/',
- 'mx': 'http://schemas.microsoft.com/office/mac/excel/2008/main',
- 'r': 'http://schemas.openxmlformats.org/officeDocument/2006/relationships',
- 'sjs': 'http://schemas.openxmlformats.org/package/2006/sheetjs/core-properties',
- 'vt': 'http://schemas.openxmlformats.org/officeDocument/2006/docPropsVTypes',
- 'xsi': 'http://www.w3.org/2001/XMLSchema-instance',
- 'xsd': 'http://www.w3.org/2001/XMLSchema'
- });
-
- XMLNS.main = [
- 'http://schemas.openxmlformats.org/spreadsheetml/2006/main',
- 'http://purl.oclc.org/ooxml/spreadsheetml/main',
- 'http://schemas.microsoft.com/office/excel/2006/main',
- 'http://schemas.microsoft.com/office/excel/2006/2'
- ];
-
- var XLMLNS = ({
- 'o': 'urn:schemas-microsoft-com:office:office',
- 'x': 'urn:schemas-microsoft-com:office:excel',
- 'ss': 'urn:schemas-microsoft-com:office:spreadsheet',
- 'dt': 'uuid:C2F41010-65B3-11d1-A29F-00AA00C14882',
- 'mv': 'http://macVmlSchemaUri',
- 'v': 'urn:schemas-microsoft-com:vml',
- 'html': 'http://www.w3.org/TR/REC-html40'
- });
- function read_double_le(b, idx) {
- var s = 1 - 2 * (b[idx + 7] >>> 7);
- var e = ((b[idx + 7] & 0x7f) << 4) + ((b[idx + 6] >>> 4) & 0x0f);
- var m = (b[idx+6]&0x0f);
- for(var i = 5; i >= 0; --i) m = m * 256 + b[idx + i];
- if(e == 0x7ff) return m == 0 ? (s * Infinity) : NaN;
- if(e == 0) e = -1022;
- else { e -= 1023; m += Math.pow(2,52); }
- return s * Math.pow(2, e - 52) * m;
- }
-
- function write_double_le(b, v, idx) {
- var bs = ((((v < 0) || (1/v == -Infinity)) ? 1 : 0) << 7), e = 0, m = 0;
- var av = bs ? (-v) : v;
- if(!isFinite(av)) { e = 0x7ff; m = isNaN(v) ? 0x6969 : 0; }
- else if(av == 0) e = m = 0;
- else {
- e = Math.floor(Math.log(av) / Math.LN2);
- m = av * Math.pow(2, 52 - e);
- if((e <= -1023) && (!isFinite(m) || (m < Math.pow(2,52)))) { e = -1022; }
- else { m -= Math.pow(2,52); e+=1023; }
- }
- for(var i = 0; i <= 5; ++i, m/=256) b[idx + i] = m & 0xff;
- b[idx + 6] = ((e & 0x0f) << 4) | (m & 0xf);
- b[idx + 7] = (e >> 4) | bs;
- }
-
- 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; };
- var ___toBuffer = __toBuffer;
- 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,''); };
- var ___utf16le = __utf16le;
- 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(""); };
- var ___hexlify = __hexlify;
- 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(""); };
- var ___utf8 = __utf8;
- var __lpstr = function(b,i) { var len = __readUInt32LE(b,i); return len > 0 ? __utf8(b, i+4,i+4+len-1) : "";};
- var ___lpstr = __lpstr;
- var __cpstr = function(b,i) { var len = __readUInt32LE(b,i); return len > 0 ? __utf8(b, i+4,i+4+len-1) : "";};
- var ___cpstr = __cpstr;
- var __lpwstr = function(b,i) { var len = 2*__readUInt32LE(b,i); return len > 0 ? __utf8(b, i+4,i+4+len-1) : "";};
- var ___lpwstr = __lpwstr;
- var __lpp4, ___lpp4;
- __lpp4 = ___lpp4 = function lpp4_(b,i) { var len = __readUInt32LE(b,i); return len > 0 ? __utf16le(b, i+4,i+4+len) : "";};
- var __8lpp4 = function(b,i) { var len = __readUInt32LE(b,i); return len > 0 ? __utf8(b, i+4,i+4+len) : "";};
- var ___8lpp4 = __8lpp4;
- var __double, ___double;
- __double = ___double = function(b, idx) { return read_double_le(b, idx);};
- var is_buf = function is_buf_a(a) { return Array.isArray(a); };
-
- if(has_buf) {
- __utf16le = function(b,s,e) { if(!Buffer.isBuffer(b)) return ___utf16le(b,s,e); return b.toString('utf16le',s,e).replace(chr0,'')/*.replace(chr1,'!')*/; };
- __hexlify = function(b,s,l) { return Buffer.isBuffer(b) ? b.toString('hex',s,s+l) : ___hexlify(b,s,l); };
- __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) : "";};
- __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) : "";};
- __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);};
- __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);};
- __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);};
- __utf8 = function utf8_b(b, s, e) { return (Buffer.isBuffer(b)) ? b.toString('utf8',s,e) : ___utf8(b,s,e); };
- __toBuffer = function(bufs) { return (bufs[0].length > 0 && Buffer.isBuffer(bufs[0][0])) ? Buffer.concat(bufs[0]) : ___toBuffer(bufs);};
- bconcat = function(bufs) { return Buffer.isBuffer(bufs[0]) ? Buffer.concat(bufs) : [].concat.apply([], bufs); };
- __double = function double_(b, i) { if(Buffer.isBuffer(b)) return b.readDoubleLE(i); return ___double(b,i); };
- is_buf = function is_buf_b(a) { return Buffer.isBuffer(a) || Array.isArray(a); };
- }
-
- /* from js-xls */
- if(typeof cptable !== 'undefined') {
- __utf16le = function(b,s,e) { return cptable.utils.decode(1200, b.slice(s,e)).replace(chr0, ''); };
- __utf8 = function(b,s,e) { return cptable.utils.decode(65001, b.slice(s,e)); };
- __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)) : "";};
- __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)) : "";};
- __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)) : "";};
- __lpp4 = function(b,i) { var len = __readUInt32LE(b,i); return len > 0 ? cptable.utils.decode(1200, b.slice(i+4,i+4+len)) : "";};
- __8lpp4 = function(b,i) { var len = __readUInt32LE(b,i); return len > 0 ? cptable.utils.decode(65001, b.slice(i+4,i+4+len)) : "";};
- }
-
- var __readUInt8 = function(b, idx) { return b[idx]; };
- var __readUInt16LE = function(b, idx) { return (b[idx+1]*(1<<8))+b[idx]; };
- var __readInt16LE = function(b, idx) { var u = (b[idx+1]*(1<<8))+b[idx]; return (u < 0x8000) ? u : ((0xffff - u + 1) * -1); };
- var __readUInt32LE = function(b, idx) { return b[idx+3]*(1<<24)+(b[idx+2]<<16)+(b[idx+1]<<8)+b[idx]; };
- var __readInt32LE = function(b, idx) { return (b[idx+3]<<24)|(b[idx+2]<<16)|(b[idx+1]<<8)|b[idx]; };
- var __readInt32BE = function(b, idx) { return (b[idx]<<24)|(b[idx+1]<<16)|(b[idx+2]<<8)|b[idx+3]; };
-
- function ReadShift(size, t) {
- var o="", oI, oR, oo=[], w, vv, i, loc;
- switch(t) {
- case 'dbcs':
- loc = this.l;
- if(has_buf && Buffer.isBuffer(this)) o = this.slice(this.l, this.l+2*size).toString("utf16le");
- else for(i = 0; i < size; ++i) { o+=String.fromCharCode(__readUInt16LE(this, loc)); loc+=2; }
- size *= 2;
- break;
-
- case 'utf8': o = __utf8(this, this.l, this.l + size); break;
- case 'utf16le': size *= 2; o = __utf16le(this, this.l, this.l + size); break;
-
- case 'wstr':
- if(typeof cptable !== 'undefined') o = cptable.utils.decode(current_codepage, this.slice(this.l, this.l+2*size));
- else return ReadShift.call(this, size, 'dbcs');
- size = 2 * size; break;
-
- /* [MS-OLEDS] 2.1.4 LengthPrefixedAnsiString */
- case 'lpstr-ansi': o = __lpstr(this, this.l); size = 4 + __readUInt32LE(this, this.l); break;
- case 'lpstr-cp': o = __cpstr(this, this.l); size = 4 + __readUInt32LE(this, this.l); break;
- /* [MS-OLEDS] 2.1.5 LengthPrefixedUnicodeString */
- case 'lpwstr': o = __lpwstr(this, this.l); size = 4 + 2 * __readUInt32LE(this, this.l); break;
- /* [MS-OFFCRYPTO] 2.1.2 Length-Prefixed Padded Unicode String (UNICODE-LP-P4) */
- case 'lpp4': size = 4 + __readUInt32LE(this, this.l); o = __lpp4(this, this.l); if(size & 0x02) size += 2; break;
- /* [MS-OFFCRYPTO] 2.1.3 Length-Prefixed UTF-8 String (UTF-8-LP-P4) */
- case '8lpp4': size = 4 + __readUInt32LE(this, this.l); o = __8lpp4(this, this.l); if(size & 0x03) size += 4 - (size & 0x03); break;
-
- case 'cstr': size = 0; o = "";
- while((w=__readUInt8(this, this.l + size++))!==0) oo.push(_getchar(w));
- o = oo.join(""); break;
- case '_wstr': size = 0; o = "";
- while((w=__readUInt16LE(this,this.l +size))!==0){oo.push(_getchar(w));size+=2;}
- size+=2; o = oo.join(""); break;
-
- /* sbcs and dbcs support continue records in the SST way TODO codepages */
- case 'dbcs-cont': o = ""; loc = this.l;
- for(i = 0; i < size; ++i) {
- if(this.lens && this.lens.indexOf(loc) !== -1) {
- w = __readUInt8(this, loc);
- this.l = loc + 1;
- vv = ReadShift.call(this, size-i, w ? 'dbcs-cont' : 'sbcs-cont');
- return oo.join("") + vv;
- }
- oo.push(_getchar(__readUInt16LE(this, loc)));
- loc+=2;
- } o = oo.join(""); size *= 2; break;
-
- case 'cpstr':
- if(typeof cptable !== 'undefined') {
- o = cptable.utils.decode(current_codepage, this.slice(this.l, this.l + size));
- break;
- }
- /* falls through */
- case 'sbcs-cont': o = ""; loc = this.l;
- for(i = 0; i != size; ++i) {
- if(this.lens && this.lens.indexOf(loc) !== -1) {
- w = __readUInt8(this, loc);
- this.l = loc + 1;
- vv = ReadShift.call(this, size-i, w ? 'dbcs-cont' : 'sbcs-cont');
- return oo.join("") + vv;
- }
- oo.push(_getchar(__readUInt8(this, loc)));
- loc+=1;
- } o = oo.join(""); break;
-
- default:
- switch(size) {
- case 1: oI = __readUInt8(this, this.l); this.l++; return oI;
- case 2: oI = (t === 'i' ? __readInt16LE : __readUInt16LE)(this, this.l); this.l += 2; return oI;
- case 4: case -4:
- if(t === 'i' || ((this[this.l+3] & 0x80)===0)) { oI = ((size > 0) ? __readInt32LE : __readInt32BE)(this, this.l); this.l += 4; return oI; }
- else { oR = __readUInt32LE(this, this.l); this.l += 4; } return oR;
- case 8: case -8:
- if(t === 'f') {
- if(size == 8) oR = __double(this, this.l);
- 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);
- this.l += 8; return oR;
- } else size = 8;
- /* falls through */
- case 16: o = __hexlify(this, this.l, size); break;
- }}
- this.l+=size; return o;
- }
-
- 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); };
- 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); };
- var __writeUInt16LE = function(b, val, idx) { b[idx] = (val & 0xFF); b[idx+1] = ((val >>> 8) & 0xFF); };
-
- function WriteShift(t, val, f) {
- var size = 0, i = 0;
- if(f === 'dbcs') {
- for(i = 0; i != val.length; ++i) __writeUInt16LE(this, val.charCodeAt(i), this.l + 2 * i);
- size = 2 * val.length;
- } else if(f === 'sbcs') {
- if(typeof cptable !== 'undefined' && current_ansi == 874) {
- /* TODO: use tables directly, don't encode */
- for(i = 0; i != val.length; ++i) {
- var cppayload = cptable.utils.encode(current_ansi, val.charAt(i));
- this[this.l + i] = cppayload[0];
- }
- } else {
- val = val.replace(/[^\x00-\x7F]/g, "_");
- for(i = 0; i != val.length; ++i) this[this.l + i] = (val.charCodeAt(i) & 0xFF);
- }
- size = val.length;
- } else if(f === 'hex') {
- for(; i < t; ++i) {
- this[this.l++] = (parseInt(val.slice(2*i, 2*i+2), 16)||0);
- } return this;
- } else if(f === 'utf16le') {
- var end = Math.min(this.l + t, this.length);
- for(i = 0; i < Math.min(val.length, t); ++i) {
- var cc = val.charCodeAt(i);
- this[this.l++] = (cc & 0xff);
- this[this.l++] = (cc >> 8);
- }
- while(this.l < end) this[this.l++] = 0;
- return this;
- } else switch(t) {
- case 1: size = 1; this[this.l] = val&0xFF; break;
- case 2: size = 2; this[this.l] = val&0xFF; val >>>= 8; this[this.l+1] = val&0xFF; break;
- 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;
- case 4: size = 4; __writeUInt32LE(this, val, this.l); break;
- case 8: size = 8; if(f === 'f') { write_double_le(this, val, this.l); break; }
- /* falls through */
- case 16: break;
- case -4: size = 4; __writeInt32LE(this, val, this.l); break;
- }
- this.l += size; return this;
- }
-
- function CheckField(hexstr, fld) {
- var m = __hexlify(this,this.l,hexstr.length>>1);
- if(m !== hexstr) throw new Error(fld + 'Expected ' + hexstr + ' saw ' + m);
- this.l += hexstr.length>>1;
- }
-
- function prep_blob(blob, pos) {
- blob.l = pos;
- blob.read_shift = ReadShift;
- blob.chk = CheckField;
- blob.write_shift = WriteShift;
- }
-
- function parsenoop(blob, length) { blob.l += length; }
-
- function new_buf(sz) {
- var o = new_raw_buf(sz);
- prep_blob(o, 0);
- return o;
- }
-
- /* [MS-XLSB] 2.1.4 Record */
- function recordhopper(data, cb, opts) {
- if(!data) return;
- var tmpbyte, cntbyte, length;
- prep_blob(data, data.l || 0);
- var L = data.length, RT = 0, tgt = 0;
- while(data.l < L) {
- RT = data.read_shift(1);
- if(RT & 0x80) RT = (RT & 0x7F) + ((data.read_shift(1) & 0x7F)<<7);
- var R = XLSBRecordEnum[RT] || XLSBRecordEnum[0xFFFF];
- tmpbyte = data.read_shift(1);
- length = tmpbyte & 0x7F;
- for(cntbyte = 1; cntbyte <4 && (tmpbyte & 0x80); ++cntbyte) length += ((tmpbyte = data.read_shift(1)) & 0x7F)<<(7*cntbyte);
- tgt = data.l + length;
- var d = (R.f||parsenoop)(data, length, opts);
- data.l = tgt;
- if(cb(d, R.n, RT)) return;
- }
- }
-
- /* control buffer usage for fixed-length buffers */
- function buf_array() {
- var bufs = [], blksz = has_buf ? 256 : 2048;
- var newblk = function ba_newblk(sz) {
- var o = (new_buf(sz));
- prep_blob(o, 0);
- return o;
- };
-
- var curbuf = newblk(blksz);
-
- var endbuf = function ba_endbuf() {
- if(!curbuf) return;
- if(curbuf.length > curbuf.l) { curbuf = curbuf.slice(0, curbuf.l); curbuf.l = curbuf.length; }
- if(curbuf.length > 0) bufs.push(curbuf);
- curbuf = null;
- };
-
- var next = function ba_next(sz) {
- if(curbuf && (sz < (curbuf.length - curbuf.l))) return curbuf;
- endbuf();
- return (curbuf = newblk(Math.max(sz+1, blksz)));
- };
-
- var end = function ba_end() {
- endbuf();
- return __toBuffer([bufs]);
- };
-
- var push = function ba_push(buf) { endbuf(); curbuf = buf; if(curbuf.l == null) curbuf.l = curbuf.length; next(blksz); };
-
- return ({ next:next, push:push, end:end, _bufs:bufs });
- }
-
- function write_record(ba, type, payload, length) {
- var t = +XLSBRE[type], l;
- if(isNaN(t)) return; // TODO: throw something here?
- if(!length) length = XLSBRecordEnum[t].p || (payload||[]).length || 0;
- l = 1 + (t >= 0x80 ? 1 : 0) + 1/* + length*/;
- if(length >= 0x80) ++l; if(length >= 0x4000) ++l; if(length >= 0x200000) ++l;
- var o = ba.next(l);
- if(t <= 0x7F) o.write_shift(1, t);
- else {
- o.write_shift(1, (t & 0x7F) + 0x80);
- o.write_shift(1, (t >> 7));
- }
- for(var i = 0; i != 4; ++i) {
- if(length >= 0x80) { o.write_shift(1, (length & 0x7F)+0x80); length >>= 7; }
- else { o.write_shift(1, length); break; }
- }
- if(length > 0 && is_buf(payload)) ba.push(payload);
- }
- /* XLS ranges enforced */
- function shift_cell_xls(cell, tgt, opts) {
- var out = dup(cell);
- if(tgt.s) {
- if(out.cRel) out.c += tgt.s.c;
- if(out.rRel) out.r += tgt.s.r;
- } else {
- if(out.cRel) out.c += tgt.c;
- if(out.rRel) out.r += tgt.r;
- }
- if(!opts || opts.biff < 12) {
- while(out.c >= 0x100) out.c -= 0x100;
- while(out.r >= 0x10000) out.r -= 0x10000;
- }
- return out;
- }
-
- function shift_range_xls(cell, range, opts) {
- var out = dup(cell);
- out.s = shift_cell_xls(out.s, range.s, opts);
- out.e = shift_cell_xls(out.e, range.s, opts);
- return out;
- }
-
- function encode_cell_xls(c, biff) {
- if(c.cRel && c.c < 0) { c = dup(c); while(c.c < 0) c.c += (biff > 8) ? 0x4000 : 0x100; }
- if(c.rRel && c.r < 0) { c = dup(c); while(c.r < 0) c.r += (biff > 8) ? 0x100000 : ((biff > 5) ? 0x10000 : 0x4000); }
- var s = encode_cell(c);
- if(!c.cRel && c.cRel != null) s = fix_col(s);
- if(!c.rRel && c.rRel != null) s = fix_row(s);
- return s;
- }
-
- function encode_range_xls(r, opts) {
- if(r.s.r == 0 && !r.s.rRel) {
- if(r.e.r == (opts.biff >= 12 ? 0xFFFFF : (opts.biff >= 8 ? 0x10000 : 0x4000)) && !r.e.rRel) {
- return (r.s.cRel ? "" : "$") + encode_col(r.s.c) + ":" + (r.e.cRel ? "" : "$") + encode_col(r.e.c);
- }
- }
- if(r.s.c == 0 && !r.s.cRel) {
- if(r.e.c == (opts.biff >= 12 ? 0x3FFF : 0xFF) && !r.e.cRel) {
- return (r.s.rRel ? "" : "$") + encode_row(r.s.r) + ":" + (r.e.rRel ? "" : "$") + encode_row(r.e.r);
- }
- }
- return encode_cell_xls(r.s, opts.biff) + ":" + encode_cell_xls(r.e, opts.biff);
- }
- var OFFCRYPTO = {};
-
- var make_offcrypto = function(O, _crypto) {
- var crypto;
- if(typeof _crypto !== 'undefined') crypto = _crypto;
- else if(true) {
- try { crypto = __webpack_require__(/*! crypto */ "?e708"); }
- catch(e) { crypto = null; }
- }
-
- O.rc4 = function(key, data) {
- var S = new Array(256);
- var c = 0, i = 0, j = 0, t = 0;
- for(i = 0; i != 256; ++i) S[i] = i;
- for(i = 0; i != 256; ++i) {
- j = (j + S[i] + (key[i%key.length]).charCodeAt(0))&255;
- t = S[i]; S[i] = S[j]; S[j] = t;
- }
- // $FlowIgnore
- i = j = 0; var out = new_raw_buf(data.length);
- for(c = 0; c != data.length; ++c) {
- i = (i + 1)&255;
- j = (j + S[i])%256;
- t = S[i]; S[i] = S[j]; S[j] = t;
- out[c] = (data[c] ^ S[(S[i]+S[j])&255]);
- }
- return out;
- };
-
- O.md5 = function(hex) {
- if(!crypto) throw new Error("Unsupported crypto");
- return crypto.createHash('md5').update(hex).digest('hex');
- };
- };
- /*global crypto:true */
- make_offcrypto(OFFCRYPTO, typeof crypto !== "undefined" ? crypto : undefined);
-
- function decode_row(rowstr) { return parseInt(unfix_row(rowstr),10) - 1; }
- function encode_row(row) { return "" + (row + 1); }
- function fix_row(cstr) { return cstr.replace(/([A-Z]|^)(\d+)$/,"$1$$$2"); }
- function unfix_row(cstr) { return cstr.replace(/\$(\d+)$/,"$1"); }
-
- 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; }
- 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; }
- function fix_col(cstr) { return cstr.replace(/^([A-Z])/,"$$$1"); }
- function unfix_col(cstr) { return cstr.replace(/^\$([A-Z])/,"$1"); }
-
- function split_cell(cstr) { return cstr.replace(/(\$?[A-Z]*)(\$?\d*)/,"$1,$2").split(","); }
- //function decode_cell(cstr) { var splt = split_cell(cstr); return { c:decode_col(splt[0]), r:decode_row(splt[1]) }; }
- function decode_cell(cstr) {
- var R = 0, C = 0;
- for(var i = 0; i < cstr.length; ++i) {
- var cc = cstr.charCodeAt(i);
- if(cc >= 48 && cc <= 57) R = 10 * R + (cc - 48);
- else if(cc >= 65 && cc <= 90) C = 26 * C + (cc - 64);
- }
- return { c: C - 1, r:R - 1 };
- }
- //function encode_cell(cell) { return encode_col(cell.c) + encode_row(cell.r); }
- function encode_cell(cell) {
- var col = cell.c + 1;
- var s="";
- for(; col; col=((col-1)/26)|0) s = String.fromCharCode(((col-1)%26) + 65) + s;
- return s + (cell.r + 1);
- }
- function decode_range(range) {
- var idx = range.indexOf(":");
- if(idx == -1) return { s: decode_cell(range), e: decode_cell(range) };
- return { s: decode_cell(range.slice(0, idx)), e: decode_cell(range.slice(idx + 1)) };
- }
- function encode_range(cs,ce) {
- if(typeof ce === 'undefined' || typeof ce === 'number') {
- return encode_range(cs.s, cs.e);
- }
- if(typeof cs !== 'string') cs = encode_cell((cs));
- if(typeof ce !== 'string') ce = encode_cell((ce));
- return cs == ce ? cs : cs + ":" + ce;
- }
-
- function safe_decode_range(range) {
- var o = {s:{c:0,r:0},e:{c:0,r:0}};
- var idx = 0, i = 0, cc = 0;
- var len = range.length;
- for(idx = 0; i < len; ++i) {
- if((cc=range.charCodeAt(i)-64) < 1 || cc > 26) break;
- idx = 26*idx + cc;
- }
- o.s.c = --idx;
-
- for(idx = 0; i < len; ++i) {
- if((cc=range.charCodeAt(i)-48) < 0 || cc > 9) break;
- idx = 10*idx + cc;
- }
- o.s.r = --idx;
-
- if(i === len || range.charCodeAt(++i) === 58) { o.e.c=o.s.c; o.e.r=o.s.r; return o; }
-
- for(idx = 0; i != len; ++i) {
- if((cc=range.charCodeAt(i)-64) < 1 || cc > 26) break;
- idx = 26*idx + cc;
- }
- o.e.c = --idx;
-
- for(idx = 0; i != len; ++i) {
- if((cc=range.charCodeAt(i)-48) < 0 || cc > 9) break;
- idx = 10*idx + cc;
- }
- o.e.r = --idx;
- return o;
- }
-
- function safe_format_cell(cell, v) {
- var q = (cell.t == 'd' && v instanceof Date);
- if(cell.z != null) try { return (cell.w = SSF.format(cell.z, q ? datenum(v) : v)); } catch(e) { }
- try { return (cell.w = SSF.format((cell.XF||{}).numFmtId||(q ? 14 : 0), q ? datenum(v) : v)); } catch(e) { return ''+v; }
- }
-
- function format_cell(cell, v, o) {
- if(cell == null || cell.t == null || cell.t == 'z') return "";
- if(cell.w !== undefined) return cell.w;
- if(cell.t == 'd' && !cell.z && o && o.dateNF) cell.z = o.dateNF;
- if(v == undefined) return safe_format_cell(cell, cell.v);
- return safe_format_cell(cell, v);
- }
-
- function sheet_to_workbook(sheet, opts) {
- var n = opts && opts.sheet ? opts.sheet : "Sheet1";
- var sheets = {}; sheets[n] = sheet;
- return { SheetNames: [n], Sheets: sheets };
- }
-
- function sheet_add_aoa(_ws, data, opts) {
- var o = opts || {};
- var dense = _ws ? Array.isArray(_ws) : o.dense;
- if(DENSE != null && dense == null) dense = DENSE;
- var ws = _ws || (dense ? ([]) : ({}));
- var _R = 0, _C = 0;
- if(ws && o.origin != null) {
- if(typeof o.origin == 'number') _R = o.origin;
- else {
- var _origin = typeof o.origin == "string" ? decode_cell(o.origin) : o.origin;
- _R = _origin.r; _C = _origin.c;
- }
- if(!ws["!ref"]) ws["!ref"] = "A1:A1";
- }
- var range = ({s: {c:10000000, r:10000000}, e: {c:0, r:0}});
- if(ws['!ref']) {
- var _range = safe_decode_range(ws['!ref']);
- range.s.c = _range.s.c;
- range.s.r = _range.s.r;
- range.e.c = Math.max(range.e.c, _range.e.c);
- range.e.r = Math.max(range.e.r, _range.e.r);
- if(_R == -1) range.e.r = _R = _range.e.r + 1;
- }
- for(var R = 0; R != data.length; ++R) {
- if(!data[R]) continue;
- if(!Array.isArray(data[R])) throw new Error("aoa_to_sheet expects an array of arrays");
- for(var C = 0; C != data[R].length; ++C) {
- if(typeof data[R][C] === 'undefined') continue;
- var cell = ({v: data[R][C] });
- var __R = _R + R, __C = _C + C;
- if(range.s.r > __R) range.s.r = __R;
- if(range.s.c > __C) range.s.c = __C;
- if(range.e.r < __R) range.e.r = __R;
- if(range.e.c < __C) range.e.c = __C;
- if(data[R][C] && typeof data[R][C] === 'object' && !Array.isArray(data[R][C]) && !(data[R][C] instanceof Date)) cell = data[R][C];
- else {
- if(Array.isArray(cell.v)) { cell.f = data[R][C][1]; cell.v = cell.v[0]; }
- if(cell.v === null) { if(cell.f) cell.t = 'n'; else if(!o.sheetStubs) continue; else cell.t = 'z'; }
- else if(typeof cell.v === 'number') cell.t = 'n';
- else if(typeof cell.v === 'boolean') cell.t = 'b';
- else if(cell.v instanceof Date) {
- cell.z = o.dateNF || SSF._table[14];
- if(o.cellDates) { cell.t = 'd'; cell.w = SSF.format(cell.z, datenum(cell.v)); }
- else { cell.t = 'n'; cell.v = datenum(cell.v); cell.w = SSF.format(cell.z, cell.v); }
- }
- else cell.t = 's';
- }
- if(dense) {
- if(!ws[__R]) ws[__R] = [];
- if(ws[__R][__C] && ws[__R][__C].z) cell.z = ws[__R][__C].z;
- ws[__R][__C] = cell;
- } else {
- var cell_ref = encode_cell(({c:__C,r:__R}));
- if(ws[cell_ref] && ws[cell_ref].z) cell.z = ws[cell_ref].z;
- ws[cell_ref] = cell;
- }
- }
- }
- if(range.s.c < 10000000) ws['!ref'] = encode_range(range);
- return ws;
- }
- function aoa_to_sheet(data, opts) { return sheet_add_aoa(null, data, opts); }
-
- function write_UInt32LE(x, o) {
- if (!o) o = new_buf(4);
- o.write_shift(4, x);
- return o;
- }
-
- /* [MS-XLSB] 2.5.168 */
- function parse_XLWideString(data) {
- var cchCharacters = data.read_shift(4);
- return cchCharacters === 0 ? "" : data.read_shift(cchCharacters, 'dbcs');
- }
- function write_XLWideString(data, o) {
- var _null = false; if (o == null) { _null = true; o = new_buf(4 + 2 * data.length); }
- o.write_shift(4, data.length);
- if (data.length > 0) o.write_shift(0, data, 'dbcs');
- return _null ? o.slice(0, o.l) : o;
- }
-
- /* [MS-XLSB] 2.5.91 */
- //function parse_LPWideString(data) {
- // var cchCharacters = data.read_shift(2);
- // return cchCharacters === 0 ? "" : data.read_shift(cchCharacters, "utf16le");
- //}
-
- /* [MS-XLSB] 2.5.143 */
- function parse_StrRun(data) {
- return { ich: data.read_shift(2), ifnt: data.read_shift(2) };
- }
- function write_StrRun(run, o) {
- if (!o) o = new_buf(4);
- o.write_shift(2, run.ich || 0);
- o.write_shift(2, run.ifnt || 0);
- return o;
- }
-
- /* [MS-XLSB] 2.5.121 */
- function parse_RichStr(data, length) {
- var start = data.l;
- var flags = data.read_shift(1);
- var str = parse_XLWideString(data);
- var rgsStrRun = [];
- var z = ({ t: str, h: str });
- if ((flags & 1) !== 0) { /* fRichStr */
- /* TODO: formatted string */
- var dwSizeStrRun = data.read_shift(4);
- for (var i = 0; i != dwSizeStrRun; ++i) rgsStrRun.push(parse_StrRun(data));
- z.r = rgsStrRun;
- }
- else z.r = [{ ich: 0, ifnt: 0 }];
- //if((flags & 2) !== 0) { /* fExtStr */
- // /* TODO: phonetic string */
- //}
- data.l = start + length;
- return z;
- }
- function write_RichStr(str, o) {
- /* TODO: formatted string */
- var _null = false; if (o == null) { _null = true; o = new_buf(15 + 4 * str.t.length); }
- o.write_shift(1, 0);
- write_XLWideString(str.t, o);
- return _null ? o.slice(0, o.l) : o;
- }
- /* [MS-XLSB] 2.4.328 BrtCommentText (RichStr w/1 run) */
- var parse_BrtCommentText = parse_RichStr;
- function write_BrtCommentText(str, o) {
- /* TODO: formatted string */
- var _null = false; if (o == null) { _null = true; o = new_buf(23 + 4 * str.t.length); }
- o.write_shift(1, 1);
- write_XLWideString(str.t, o);
- o.write_shift(4, 1);
- write_StrRun({ ich: 0, ifnt: 0 }, o);
- return _null ? o.slice(0, o.l) : o;
- }
-
- /* [MS-XLSB] 2.5.9 */
- function parse_XLSBCell(data) {
- var col = data.read_shift(4);
- var iStyleRef = data.read_shift(2);
- iStyleRef += data.read_shift(1) << 16;
- data.l++; //var fPhShow = data.read_shift(1);
- return { c: col, iStyleRef: iStyleRef };
- }
- function write_XLSBCell(cell, o) {
- if (o == null) o = new_buf(8);
- o.write_shift(-4, cell.c);
- o.write_shift(3, cell.iStyleRef || cell.s);
- o.write_shift(1, 0); /* fPhShow */
- return o;
- }
-
- /* Short XLSB Cell does not include column */
- function parse_XLSBShortCell(data) {
- var iStyleRef = data.read_shift(2);
- iStyleRef += data.read_shift(1) <<16;
- data.l++; //var fPhShow = data.read_shift(1);
- return { c:-1, iStyleRef: iStyleRef };
- }
- function write_XLSBShortCell(cell, o) {
- if(o == null) o = new_buf(4);
- o.write_shift(3, cell.iStyleRef || cell.s);
- o.write_shift(1, 0); /* fPhShow */
- return o;
- }
-
- /* [MS-XLSB] 2.5.21 */
- var parse_XLSBCodeName = parse_XLWideString;
- var write_XLSBCodeName = write_XLWideString;
-
- /* [MS-XLSB] 2.5.166 */
- function parse_XLNullableWideString(data) {
- var cchCharacters = data.read_shift(4);
- return cchCharacters === 0 || cchCharacters === 0xFFFFFFFF ? "" : data.read_shift(cchCharacters, 'dbcs');
- }
- function write_XLNullableWideString(data, o) {
- var _null = false; if (o == null) { _null = true; o = new_buf(127); }
- o.write_shift(4, data.length > 0 ? data.length : 0xFFFFFFFF);
- if (data.length > 0) o.write_shift(0, data, 'dbcs');
- return _null ? o.slice(0, o.l) : o;
- }
-
- /* [MS-XLSB] 2.5.165 */
- var parse_XLNameWideString = parse_XLWideString;
- //var write_XLNameWideString = write_XLWideString;
-
- /* [MS-XLSB] 2.5.114 */
- var parse_RelID = parse_XLNullableWideString;
- var write_RelID = write_XLNullableWideString;
-
-
- /* [MS-XLS] 2.5.217 ; [MS-XLSB] 2.5.122 */
- function parse_RkNumber(data) {
- var b = data.slice(data.l, data.l + 4);
- var fX100 = (b[0] & 1), fInt = (b[0] & 2);
- data.l += 4;
- b[0] &= 0xFC; // b[0] &= ~3;
- var RK = fInt === 0 ? __double([0, 0, 0, 0, b[0], b[1], b[2], b[3]], 0) : __readInt32LE(b, 0) >> 2;
- return fX100 ? (RK / 100) : RK;
- }
- function write_RkNumber(data, o) {
- if (o == null) o = new_buf(4);
- var fX100 = 0, fInt = 0, d100 = data * 100;
- if ((data == (data | 0)) && (data >= -(1 << 29)) && (data < (1 << 29))) { fInt = 1; }
- else if ((d100 == (d100 | 0)) && (d100 >= -(1 << 29)) && (d100 < (1 << 29))) { fInt = 1; fX100 = 1; }
- if (fInt) o.write_shift(-4, ((fX100 ? d100 : data) << 2) + (fX100 + 2));
- else throw new Error("unsupported RkNumber " + data); // TODO
- }
-
-
- /* [MS-XLSB] 2.5.117 RfX */
- function parse_RfX(data ) {
- var cell = ({ s: {}, e: {} });
- cell.s.r = data.read_shift(4);
- cell.e.r = data.read_shift(4);
- cell.s.c = data.read_shift(4);
- cell.e.c = data.read_shift(4);
- return cell;
- }
- function write_RfX(r, o) {
- if (!o) o = new_buf(16);
- o.write_shift(4, r.s.r);
- o.write_shift(4, r.e.r);
- o.write_shift(4, r.s.c);
- o.write_shift(4, r.e.c);
- return o;
- }
-
- /* [MS-XLSB] 2.5.153 UncheckedRfX */
- var parse_UncheckedRfX = parse_RfX;
- var write_UncheckedRfX = write_RfX;
-
- /* [MS-XLSB] 2.5.155 UncheckedSqRfX */
- //function parse_UncheckedSqRfX(data) {
- // var cnt = data.read_shift(4);
- // var out = [];
- // for(var i = 0; i < cnt; ++i) {
- // var rng = parse_UncheckedRfX(data);
- // out.push(encode_range(rng));
- // }
- // return out.join(",");
- //}
- //function write_UncheckedSqRfX(sqrfx) {
- // var parts = sqrfx.split(/\s*,\s*/);
- // var o = new_buf(4); o.write_shift(4, parts.length);
- // var out = [o];
- // parts.forEach(function(rng) {
- // out.push(write_UncheckedRfX(safe_decode_range(rng)));
- // });
- // return bconcat(out);
- //}
-
- /* [MS-XLS] 2.5.342 ; [MS-XLSB] 2.5.171 */
- /* TODO: error checking, NaN and Infinity values are not valid Xnum */
- function parse_Xnum(data) {
- if(data.length - data.l < 8) throw "XLS Xnum Buffer underflow";
- return data.read_shift(8, 'f');
- }
- function write_Xnum(data, o) { return (o || new_buf(8)).write_shift(8, data, 'f'); }
-
- /* [MS-XLSB] 2.4.324 BrtColor */
- function parse_BrtColor(data) {
- var out = {};
- var d = data.read_shift(1);
-
- //var fValidRGB = d & 1;
- var xColorType = d >>> 1;
-
- var index = data.read_shift(1);
- var nTS = data.read_shift(2, 'i');
- var bR = data.read_shift(1);
- var bG = data.read_shift(1);
- var bB = data.read_shift(1);
- data.l++; //var bAlpha = data.read_shift(1);
-
- switch (xColorType) {
- case 0: out.auto = 1; break;
- case 1:
- out.index = index;
- var icv = XLSIcv[index];
- /* automatic pseudo index 81 */
- if (icv) out.rgb = rgb2Hex(icv);
- break;
- case 2:
- /* if(!fValidRGB) throw new Error("invalid"); */
- out.rgb = rgb2Hex([bR, bG, bB]);
- break;
- case 3: out.theme = index; break;
- }
- if (nTS != 0) out.tint = nTS > 0 ? nTS / 32767 : nTS / 32768;
-
- return out;
- }
- function write_BrtColor(color, o) {
- if (!o) o = new_buf(8);
- if (!color || color.auto) { o.write_shift(4, 0); o.write_shift(4, 0); return o; }
- if (color.index != null) {
- o.write_shift(1, 0x02);
- o.write_shift(1, color.index);
- } else if (color.theme != null) {
- o.write_shift(1, 0x06);
- o.write_shift(1, color.theme);
- } else {
- o.write_shift(1, 0x05);
- o.write_shift(1, 0);
- }
- var nTS = color.tint || 0;
- if (nTS > 0) nTS *= 32767;
- else if (nTS < 0) nTS *= 32768;
- o.write_shift(2, nTS);
- if (!color.rgb || color.theme != null) {
- o.write_shift(2, 0);
- o.write_shift(1, 0);
- o.write_shift(1, 0);
- } else {
- var rgb = (color.rgb || 'FFFFFF');
- if (typeof rgb == 'number') rgb = ("000000" + rgb.toString(16)).slice(-6);
- o.write_shift(1, parseInt(rgb.slice(0, 2), 16));
- o.write_shift(1, parseInt(rgb.slice(2, 4), 16));
- o.write_shift(1, parseInt(rgb.slice(4, 6), 16));
- o.write_shift(1, 0xFF);
- }
- return o;
- }
-
- /* [MS-XLSB] 2.5.52 */
- function parse_FontFlags(data) {
- var d = data.read_shift(1);
- data.l++;
- var out = {
- fBold: d & 0x01,
- fItalic: d & 0x02,
- fUnderline: d & 0x04,
- fStrikeout: d & 0x08,
- fOutline: d & 0x10,
- fShadow: d & 0x20,
- fCondense: d & 0x40,
- fExtend: d & 0x80
- };
- return out;
- }
- function write_FontFlags(font, o) {
- if (!o) o = new_buf(2);
- var grbit =
- (font.italic ? 0x02 : 0) |
- (font.strike ? 0x08 : 0) |
- (font.outline ? 0x10 : 0) |
- (font.shadow ? 0x20 : 0) |
- (font.condense ? 0x40 : 0) |
- (font.extend ? 0x80 : 0);
- o.write_shift(1, grbit);
- o.write_shift(1, 0);
- return o;
- }
-
- /* [MS-OLEDS] 2.3.1 and 2.3.2 */
- function parse_ClipboardFormatOrString(o, w) {
- // $FlowIgnore
- var ClipFmt = { 2: "BITMAP", 3: "METAFILEPICT", 8: "DIB", 14: "ENHMETAFILE" };
- var m = o.read_shift(4);
- switch (m) {
- case 0x00000000: return "";
- case 0xffffffff: case 0xfffffffe: return ClipFmt[o.read_shift(4)] || "";
- }
- if (m > 0x190) throw new Error("Unsupported Clipboard: " + m.toString(16));
- o.l -= 4;
- return o.read_shift(0, w == 1 ? "lpstr" : "lpwstr");
- }
- function parse_ClipboardFormatOrAnsiString(o) { return parse_ClipboardFormatOrString(o, 1); }
- function parse_ClipboardFormatOrUnicodeString(o) { return parse_ClipboardFormatOrString(o, 2); }
-
- /* [MS-OLEPS] 2.2 PropertyType */
- //var VT_EMPTY = 0x0000;
- //var VT_NULL = 0x0001;
- var VT_I2 = 0x0002;
- var VT_I4 = 0x0003;
- //var VT_R4 = 0x0004;
- //var VT_R8 = 0x0005;
- //var VT_CY = 0x0006;
- //var VT_DATE = 0x0007;
- //var VT_BSTR = 0x0008;
- //var VT_ERROR = 0x000A;
- var VT_BOOL = 0x000B;
- var VT_VARIANT = 0x000C;
- //var VT_DECIMAL = 0x000E;
- //var VT_I1 = 0x0010;
- //var VT_UI1 = 0x0011;
- //var VT_UI2 = 0x0012;
- var VT_UI4 = 0x0013;
- //var VT_I8 = 0x0014;
- //var VT_UI8 = 0x0015;
- //var VT_INT = 0x0016;
- //var VT_UINT = 0x0017;
- var VT_LPSTR = 0x001E;
- //var VT_LPWSTR = 0x001F;
- var VT_FILETIME = 0x0040;
- var VT_BLOB = 0x0041;
- //var VT_STREAM = 0x0042;
- //var VT_STORAGE = 0x0043;
- //var VT_STREAMED_Object = 0x0044;
- //var VT_STORED_Object = 0x0045;
- //var VT_BLOB_Object = 0x0046;
- var VT_CF = 0x0047;
- //var VT_CLSID = 0x0048;
- //var VT_VERSIONED_STREAM = 0x0049;
- var VT_VECTOR = 0x1000;
- //var VT_ARRAY = 0x2000;
-
- var VT_STRING = 0x0050; // 2.3.3.1.11 VtString
- var VT_USTR = 0x0051; // 2.3.3.1.12 VtUnalignedString
- var VT_CUSTOM = [VT_STRING, VT_USTR];
-
- /* [MS-OSHARED] 2.3.3.2.2.1 Document Summary Information PIDDSI */
- var DocSummaryPIDDSI = {
- 0x01: { n: 'CodePage', t: VT_I2 },
- 0x02: { n: 'Category', t: VT_STRING },
- 0x03: { n: 'PresentationFormat', t: VT_STRING },
- 0x04: { n: 'ByteCount', t: VT_I4 },
- 0x05: { n: 'LineCount', t: VT_I4 },
- 0x06: { n: 'ParagraphCount', t: VT_I4 },
- 0x07: { n: 'SlideCount', t: VT_I4 },
- 0x08: { n: 'NoteCount', t: VT_I4 },
- 0x09: { n: 'HiddenCount', t: VT_I4 },
- 0x0a: { n: 'MultimediaClipCount', t: VT_I4 },
- 0x0b: { n: 'ScaleCrop', t: VT_BOOL },
- 0x0c: { n: 'HeadingPairs', t: VT_VECTOR | VT_VARIANT },
- 0x0d: { n: 'TitlesOfParts', t: VT_VECTOR | VT_LPSTR },
- 0x0e: { n: 'Manager', t: VT_STRING },
- 0x0f: { n: 'Company', t: VT_STRING },
- 0x10: { n: 'LinksUpToDate', t: VT_BOOL },
- 0x11: { n: 'CharacterCount', t: VT_I4 },
- 0x13: { n: 'SharedDoc', t: VT_BOOL },
- 0x16: { n: 'HyperlinksChanged', t: VT_BOOL },
- 0x17: { n: 'AppVersion', t: VT_I4, p: 'version' },
- 0x18: { n: 'DigSig', t: VT_BLOB },
- 0x1A: { n: 'ContentType', t: VT_STRING },
- 0x1B: { n: 'ContentStatus', t: VT_STRING },
- 0x1C: { n: 'Language', t: VT_STRING },
- 0x1D: { n: 'Version', t: VT_STRING },
- 0xFF: {}
- };
-
- /* [MS-OSHARED] 2.3.3.2.1.1 Summary Information Property Set PIDSI */
- var SummaryPIDSI = {
- 0x01: { n: 'CodePage', t: VT_I2 },
- 0x02: { n: 'Title', t: VT_STRING },
- 0x03: { n: 'Subject', t: VT_STRING },
- 0x04: { n: 'Author', t: VT_STRING },
- 0x05: { n: 'Keywords', t: VT_STRING },
- 0x06: { n: 'Comments', t: VT_STRING },
- 0x07: { n: 'Template', t: VT_STRING },
- 0x08: { n: 'LastAuthor', t: VT_STRING },
- 0x09: { n: 'RevNumber', t: VT_STRING },
- 0x0A: { n: 'EditTime', t: VT_FILETIME },
- 0x0B: { n: 'LastPrinted', t: VT_FILETIME },
- 0x0C: { n: 'CreatedDate', t: VT_FILETIME },
- 0x0D: { n: 'ModifiedDate', t: VT_FILETIME },
- 0x0E: { n: 'PageCount', t: VT_I4 },
- 0x0F: { n: 'WordCount', t: VT_I4 },
- 0x10: { n: 'CharCount', t: VT_I4 },
- 0x11: { n: 'Thumbnail', t: VT_CF },
- 0x12: { n: 'Application', t: VT_STRING },
- 0x13: { n: 'DocSecurity', t: VT_I4 },
- 0xFF: {}
- };
-
- /* [MS-OLEPS] 2.18 */
- var SpecialProperties = {
- 0x80000000: { n: 'Locale', t: VT_UI4 },
- 0x80000003: { n: 'Behavior', t: VT_UI4 },
- 0x72627262: {}
- };
-
- (function() {
- for(var y in SpecialProperties) if(Object.prototype.hasOwnProperty.call(SpecialProperties, y))
- DocSummaryPIDDSI[y] = SummaryPIDSI[y] = SpecialProperties[y];
- })();
-
- var DocSummaryRE = evert_key(DocSummaryPIDDSI, "n");
- var SummaryRE = evert_key(SummaryPIDSI, "n");
-
- /* [MS-XLS] 2.4.63 Country/Region codes */
- var CountryEnum = {
- 0x0001: "US", // United States
- 0x0002: "CA", // Canada
- 0x0003: "", // Latin America (except Brazil)
- 0x0007: "RU", // Russia
- 0x0014: "EG", // Egypt
- 0x001E: "GR", // Greece
- 0x001F: "NL", // Netherlands
- 0x0020: "BE", // Belgium
- 0x0021: "FR", // France
- 0x0022: "ES", // Spain
- 0x0024: "HU", // Hungary
- 0x0027: "IT", // Italy
- 0x0029: "CH", // Switzerland
- 0x002B: "AT", // Austria
- 0x002C: "GB", // United Kingdom
- 0x002D: "DK", // Denmark
- 0x002E: "SE", // Sweden
- 0x002F: "NO", // Norway
- 0x0030: "PL", // Poland
- 0x0031: "DE", // Germany
- 0x0034: "MX", // Mexico
- 0x0037: "BR", // Brazil
- 0x003d: "AU", // Australia
- 0x0040: "NZ", // New Zealand
- 0x0042: "TH", // Thailand
- 0x0051: "JP", // Japan
- 0x0052: "KR", // Korea
- 0x0054: "VN", // Viet Nam
- 0x0056: "CN", // China
- 0x005A: "TR", // Turkey
- 0x0069: "JS", // Ramastan
- 0x00D5: "DZ", // Algeria
- 0x00D8: "MA", // Morocco
- 0x00DA: "LY", // Libya
- 0x015F: "PT", // Portugal
- 0x0162: "IS", // Iceland
- 0x0166: "FI", // Finland
- 0x01A4: "CZ", // Czech Republic
- 0x0376: "TW", // Taiwan
- 0x03C1: "LB", // Lebanon
- 0x03C2: "JO", // Jordan
- 0x03C3: "SY", // Syria
- 0x03C4: "IQ", // Iraq
- 0x03C5: "KW", // Kuwait
- 0x03C6: "SA", // Saudi Arabia
- 0x03CB: "AE", // United Arab Emirates
- 0x03CC: "IL", // Israel
- 0x03CE: "QA", // Qatar
- 0x03D5: "IR", // Iran
- 0xFFFF: "US" // United States
- };
-
- /* [MS-XLS] 2.5.127 */
- var XLSFillPattern = [
- null,
- 'solid',
- 'mediumGray',
- 'darkGray',
- 'lightGray',
- 'darkHorizontal',
- 'darkVertical',
- 'darkDown',
- 'darkUp',
- 'darkGrid',
- 'darkTrellis',
- 'lightHorizontal',
- 'lightVertical',
- 'lightDown',
- 'lightUp',
- 'lightGrid',
- 'lightTrellis',
- 'gray125',
- 'gray0625'
- ];
-
- function rgbify(arr) { return arr.map(function(x) { return [(x>>16)&255,(x>>8)&255,x&255]; }); }
-
- /* [MS-XLS] 2.5.161 */
- /* [MS-XLSB] 2.5.75 Icv */
- var _XLSIcv = rgbify([
- /* Color Constants */
- 0x000000,
- 0xFFFFFF,
- 0xFF0000,
- 0x00FF00,
- 0x0000FF,
- 0xFFFF00,
- 0xFF00FF,
- 0x00FFFF,
-
- /* Overridable Defaults */
- 0x000000,
- 0xFFFFFF,
- 0xFF0000,
- 0x00FF00,
- 0x0000FF,
- 0xFFFF00,
- 0xFF00FF,
- 0x00FFFF,
-
- 0x800000,
- 0x008000,
- 0x000080,
- 0x808000,
- 0x800080,
- 0x008080,
- 0xC0C0C0,
- 0x808080,
- 0x9999FF,
- 0x993366,
- 0xFFFFCC,
- 0xCCFFFF,
- 0x660066,
- 0xFF8080,
- 0x0066CC,
- 0xCCCCFF,
-
- 0x000080,
- 0xFF00FF,
- 0xFFFF00,
- 0x00FFFF,
- 0x800080,
- 0x800000,
- 0x008080,
- 0x0000FF,
- 0x00CCFF,
- 0xCCFFFF,
- 0xCCFFCC,
- 0xFFFF99,
- 0x99CCFF,
- 0xFF99CC,
- 0xCC99FF,
- 0xFFCC99,
-
- 0x3366FF,
- 0x33CCCC,
- 0x99CC00,
- 0xFFCC00,
- 0xFF9900,
- 0xFF6600,
- 0x666699,
- 0x969696,
- 0x003366,
- 0x339966,
- 0x003300,
- 0x333300,
- 0x993300,
- 0x993366,
- 0x333399,
- 0x333333,
-
- /* Other entries to appease BIFF8/12 */
- 0xFFFFFF, /* 0x40 icvForeground ?? */
- 0x000000, /* 0x41 icvBackground ?? */
- 0x000000, /* 0x42 icvFrame ?? */
- 0x000000, /* 0x43 icv3D ?? */
- 0x000000, /* 0x44 icv3DText ?? */
- 0x000000, /* 0x45 icv3DHilite ?? */
- 0x000000, /* 0x46 icv3DShadow ?? */
- 0x000000, /* 0x47 icvHilite ?? */
- 0x000000, /* 0x48 icvCtlText ?? */
- 0x000000, /* 0x49 icvCtlScrl ?? */
- 0x000000, /* 0x4A icvCtlInv ?? */
- 0x000000, /* 0x4B icvCtlBody ?? */
- 0x000000, /* 0x4C icvCtlFrame ?? */
- 0x000000, /* 0x4D icvCtlFore ?? */
- 0x000000, /* 0x4E icvCtlBack ?? */
- 0x000000, /* 0x4F icvCtlNeutral */
- 0x000000, /* 0x50 icvInfoBk ?? */
- 0x000000 /* 0x51 icvInfoText ?? */
- ]);
- var XLSIcv = dup(_XLSIcv);
-
- /* [MS-XLSB] 2.5.97.2 */
- var BErr = {
- 0x00: "#NULL!",
- 0x07: "#DIV/0!",
- 0x0F: "#VALUE!",
- 0x17: "#REF!",
- 0x1D: "#NAME?",
- 0x24: "#NUM!",
- 0x2A: "#N/A",
- 0x2B: "#GETTING_DATA",
- 0xFF: "#WTF?"
- };
- var RBErr = evert_num(BErr);
- /* Parts enumerated in OPC spec, MS-XLSB and MS-XLSX */
- /* 12.3 Part Summary <SpreadsheetML> */
- /* 14.2 Part Summary <DrawingML> */
- /* [MS-XLSX] 2.1 Part Enumerations ; [MS-XLSB] 2.1.7 Part Enumeration */
- var ct2type/*{[string]:string}*/ = ({
- /* Workbook */
- "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet.main+xml": "workbooks",
-
- /* Worksheet */
- "application/vnd.ms-excel.binIndexWs": "TODO", /* Binary Index */
-
- /* Macrosheet */
- "application/vnd.ms-excel.intlmacrosheet": "TODO",
- "application/vnd.ms-excel.binIndexMs": "TODO", /* Binary Index */
-
- /* File Properties */
- "application/vnd.openxmlformats-package.core-properties+xml": "coreprops",
- "application/vnd.openxmlformats-officedocument.custom-properties+xml": "custprops",
- "application/vnd.openxmlformats-officedocument.extended-properties+xml": "extprops",
-
- /* Custom Data Properties */
- "application/vnd.openxmlformats-officedocument.customXmlProperties+xml": "TODO",
- "application/vnd.openxmlformats-officedocument.spreadsheetml.customProperty": "TODO",
-
- /* PivotTable */
- "application/vnd.ms-excel.pivotTable": "TODO",
- "application/vnd.openxmlformats-officedocument.spreadsheetml.pivotTable+xml": "TODO",
-
- /* Chart Objects */
- "application/vnd.openxmlformats-officedocument.drawingml.chart+xml": "TODO",
-
- /* Chart Colors */
- "application/vnd.ms-office.chartcolorstyle+xml": "TODO",
-
- /* Chart Style */
- "application/vnd.ms-office.chartstyle+xml": "TODO",
-
- /* Chart Advanced */
- "application/vnd.ms-office.chartex+xml": "TODO",
-
- /* Calculation Chain */
- "application/vnd.ms-excel.calcChain": "calcchains",
- "application/vnd.openxmlformats-officedocument.spreadsheetml.calcChain+xml": "calcchains",
-
- /* Printer Settings */
- "application/vnd.openxmlformats-officedocument.spreadsheetml.printerSettings": "TODO",
-
- /* ActiveX */
- "application/vnd.ms-office.activeX": "TODO",
- "application/vnd.ms-office.activeX+xml": "TODO",
-
- /* Custom Toolbars */
- "application/vnd.ms-excel.attachedToolbars": "TODO",
-
- /* External Data Connections */
- "application/vnd.ms-excel.connections": "TODO",
- "application/vnd.openxmlformats-officedocument.spreadsheetml.connections+xml": "TODO",
-
- /* External Links */
- "application/vnd.ms-excel.externalLink": "links",
- "application/vnd.openxmlformats-officedocument.spreadsheetml.externalLink+xml": "links",
-
- /* Metadata */
- "application/vnd.ms-excel.sheetMetadata": "TODO",
- "application/vnd.openxmlformats-officedocument.spreadsheetml.sheetMetadata+xml": "TODO",
-
- /* PivotCache */
- "application/vnd.ms-excel.pivotCacheDefinition": "TODO",
- "application/vnd.ms-excel.pivotCacheRecords": "TODO",
- "application/vnd.openxmlformats-officedocument.spreadsheetml.pivotCacheDefinition+xml": "TODO",
- "application/vnd.openxmlformats-officedocument.spreadsheetml.pivotCacheRecords+xml": "TODO",
-
- /* Query Table */
- "application/vnd.ms-excel.queryTable": "TODO",
- "application/vnd.openxmlformats-officedocument.spreadsheetml.queryTable+xml": "TODO",
-
- /* Shared Workbook */
- "application/vnd.ms-excel.userNames": "TODO",
- "application/vnd.ms-excel.revisionHeaders": "TODO",
- "application/vnd.ms-excel.revisionLog": "TODO",
- "application/vnd.openxmlformats-officedocument.spreadsheetml.revisionHeaders+xml": "TODO",
- "application/vnd.openxmlformats-officedocument.spreadsheetml.revisionLog+xml": "TODO",
- "application/vnd.openxmlformats-officedocument.spreadsheetml.userNames+xml": "TODO",
-
- /* Single Cell Table */
- "application/vnd.ms-excel.tableSingleCells": "TODO",
- "application/vnd.openxmlformats-officedocument.spreadsheetml.tableSingleCells+xml": "TODO",
-
- /* Slicer */
- "application/vnd.ms-excel.slicer": "TODO",
- "application/vnd.ms-excel.slicerCache": "TODO",
- "application/vnd.ms-excel.slicer+xml": "TODO",
- "application/vnd.ms-excel.slicerCache+xml": "TODO",
-
- /* Sort Map */
- "application/vnd.ms-excel.wsSortMap": "TODO",
-
- /* Table */
- "application/vnd.ms-excel.table": "TODO",
- "application/vnd.openxmlformats-officedocument.spreadsheetml.table+xml": "TODO",
-
- /* Themes */
- "application/vnd.openxmlformats-officedocument.theme+xml": "themes",
-
- /* Theme Override */
- "application/vnd.openxmlformats-officedocument.themeOverride+xml": "TODO",
-
- /* Timeline */
- "application/vnd.ms-excel.Timeline+xml": "TODO", /* verify */
- "application/vnd.ms-excel.TimelineCache+xml": "TODO", /* verify */
-
- /* VBA */
- "application/vnd.ms-office.vbaProject": "vba",
- "application/vnd.ms-office.vbaProjectSignature": "vba",
-
- /* Volatile Dependencies */
- "application/vnd.ms-office.volatileDependencies": "TODO",
- "application/vnd.openxmlformats-officedocument.spreadsheetml.volatileDependencies+xml": "TODO",
-
- /* Control Properties */
- "application/vnd.ms-excel.controlproperties+xml": "TODO",
-
- /* Data Model */
- "application/vnd.openxmlformats-officedocument.model+data": "TODO",
-
- /* Survey */
- "application/vnd.ms-excel.Survey+xml": "TODO",
-
- /* Drawing */
- "application/vnd.openxmlformats-officedocument.drawing+xml": "drawings",
- "application/vnd.openxmlformats-officedocument.drawingml.chartshapes+xml": "TODO",
- "application/vnd.openxmlformats-officedocument.drawingml.diagramColors+xml": "TODO",
- "application/vnd.openxmlformats-officedocument.drawingml.diagramData+xml": "TODO",
- "application/vnd.openxmlformats-officedocument.drawingml.diagramLayout+xml": "TODO",
- "application/vnd.openxmlformats-officedocument.drawingml.diagramStyle+xml": "TODO",
-
- /* VML */
- "application/vnd.openxmlformats-officedocument.vmlDrawing": "TODO",
-
- "application/vnd.openxmlformats-package.relationships+xml": "rels",
- "application/vnd.openxmlformats-officedocument.oleObject": "TODO",
-
- /* Image */
- "image/png": "TODO",
-
- "sheet": "js"
- });
-
- var CT_LIST = (function(){
- var o = {
- workbooks: {
- xlsx: "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet.main+xml",
- xlsm: "application/vnd.ms-excel.sheet.macroEnabled.main+xml",
- xlsb: "application/vnd.ms-excel.sheet.binary.macroEnabled.main",
- xlam: "application/vnd.ms-excel.addin.macroEnabled.main+xml",
- xltx: "application/vnd.openxmlformats-officedocument.spreadsheetml.template.main+xml"
- },
- strs: { /* Shared Strings */
- xlsx: "application/vnd.openxmlformats-officedocument.spreadsheetml.sharedStrings+xml",
- xlsb: "application/vnd.ms-excel.sharedStrings"
- },
- comments: { /* Comments */
- xlsx: "application/vnd.openxmlformats-officedocument.spreadsheetml.comments+xml",
- xlsb: "application/vnd.ms-excel.comments"
- },
- sheets: { /* Worksheet */
- xlsx: "application/vnd.openxmlformats-officedocument.spreadsheetml.worksheet+xml",
- xlsb: "application/vnd.ms-excel.worksheet"
- },
- charts: { /* Chartsheet */
- xlsx: "application/vnd.openxmlformats-officedocument.spreadsheetml.chartsheet+xml",
- xlsb: "application/vnd.ms-excel.chartsheet"
- },
- dialogs: { /* Dialogsheet */
- xlsx: "application/vnd.openxmlformats-officedocument.spreadsheetml.dialogsheet+xml",
- xlsb: "application/vnd.ms-excel.dialogsheet"
- },
- macros: { /* Macrosheet (Excel 4.0 Macros) */
- xlsx: "application/vnd.ms-excel.macrosheet+xml",
- xlsb: "application/vnd.ms-excel.macrosheet"
- },
- styles: { /* Styles */
- xlsx: "application/vnd.openxmlformats-officedocument.spreadsheetml.styles+xml",
- xlsb: "application/vnd.ms-excel.styles"
- }
- };
- keys(o).forEach(function(k) { ["xlsm", "xlam"].forEach(function(v) { if(!o[k][v]) o[k][v] = o[k].xlsx; }); });
- keys(o).forEach(function(k){ keys(o[k]).forEach(function(v) { ct2type[o[k][v]] = k; }); });
- return o;
- })();
-
- var type2ct/*{[string]:Array<string>}*/ = evert_arr(ct2type);
-
- XMLNS.CT = 'http://schemas.openxmlformats.org/package/2006/content-types';
-
- function new_ct() {
- return ({
- workbooks:[], sheets:[], charts:[], dialogs:[], macros:[],
- rels:[], strs:[], comments:[], links:[],
- coreprops:[], extprops:[], custprops:[], themes:[], styles:[],
- calcchains:[], vba: [], drawings: [],
- TODO:[], xmlns: "" });
- }
-
- function parse_ct(data) {
- var ct = new_ct();
- if(!data || !data.match) return ct;
- var ctext = {};
- (data.match(tagregex)||[]).forEach(function(x) {
- var y = parsexmltag(x);
- switch(y[0].replace(nsregex,"<")) {
- case '<?xml': break;
- case '<Types': ct.xmlns = y['xmlns' + (y[0].match(/<(\w+):/)||["",""])[1] ]; break;
- case '<Default': ctext[y.Extension] = y.ContentType; break;
- case '<Override':
- if(ct[ct2type[y.ContentType]] !== undefined) ct[ct2type[y.ContentType]].push(y.PartName);
- break;
- }
- });
- if(ct.xmlns !== XMLNS.CT) throw new Error("Unknown Namespace: " + ct.xmlns);
- ct.calcchain = ct.calcchains.length > 0 ? ct.calcchains[0] : "";
- ct.sst = ct.strs.length > 0 ? ct.strs[0] : "";
- ct.style = ct.styles.length > 0 ? ct.styles[0] : "";
- ct.defaults = ctext;
- delete ct.calcchains;
- return ct;
- }
-
- var CTYPE_XML_ROOT = writextag('Types', null, {
- 'xmlns': XMLNS.CT,
- 'xmlns:xsd': XMLNS.xsd,
- 'xmlns:xsi': XMLNS.xsi
- });
-
- var CTYPE_DEFAULTS = [
- ['xml', 'application/xml'],
- ['bin', 'application/vnd.ms-excel.sheet.binary.macroEnabled.main'],
- ['vml', 'application/vnd.openxmlformats-officedocument.vmlDrawing'],
- ['data', 'application/vnd.openxmlformats-officedocument.model+data'],
- /* from test files */
- ['bmp', 'image/bmp'],
- ['png', 'image/png'],
- ['gif', 'image/gif'],
- ['emf', 'image/x-emf'],
- ['wmf', 'image/x-wmf'],
- ['jpg', 'image/jpeg'], ['jpeg', 'image/jpeg'],
- ['tif', 'image/tiff'], ['tiff', 'image/tiff'],
- ['pdf', 'application/pdf'],
- ['rels', type2ct.rels[0]]
- ].map(function(x) {
- return writextag('Default', null, {'Extension':x[0], 'ContentType': x[1]});
- });
-
- function write_ct(ct, opts) {
- var o = [], v;
- o[o.length] = (XML_HEADER);
- o[o.length] = (CTYPE_XML_ROOT);
- o = o.concat(CTYPE_DEFAULTS);
-
- /* only write first instance */
- var f1 = function(w) {
- if(ct[w] && ct[w].length > 0) {
- v = ct[w][0];
- o[o.length] = (writextag('Override', null, {
- 'PartName': (v[0] == '/' ? "":"/") + v,
- 'ContentType': CT_LIST[w][opts.bookType || 'xlsx']
- }));
- }
- };
-
- /* book type-specific */
- var f2 = function(w) {
- (ct[w]||[]).forEach(function(v) {
- o[o.length] = (writextag('Override', null, {
- 'PartName': (v[0] == '/' ? "":"/") + v,
- 'ContentType': CT_LIST[w][opts.bookType || 'xlsx']
- }));
- });
- };
-
- /* standard type */
- var f3 = function(t) {
- (ct[t]||[]).forEach(function(v) {
- o[o.length] = (writextag('Override', null, {
- 'PartName': (v[0] == '/' ? "":"/") + v,
- 'ContentType': type2ct[t][0]
- }));
- });
- };
-
- f1('workbooks');
- f2('sheets');
- f2('charts');
- f3('themes');
- ['strs', 'styles'].forEach(f1);
- ['coreprops', 'extprops', 'custprops'].forEach(f3);
- f3('vba');
- f3('comments');
- f3('drawings');
- if(o.length>2){ o[o.length] = ('</Types>'); o[1]=o[1].replace("/>",">"); }
- return o.join("");
- }
- /* 9.3 Relationships */
- var RELS = ({
- WB: "http://schemas.openxmlformats.org/officeDocument/2006/relationships/officeDocument",
- SHEET: "http://sheetjs.openxmlformats.org/officeDocument/2006/relationships/officeDocument",
- HLINK: "http://schemas.openxmlformats.org/officeDocument/2006/relationships/hyperlink",
- VML: "http://schemas.openxmlformats.org/officeDocument/2006/relationships/vmlDrawing",
- XPATH: "http://schemas.openxmlformats.org/officeDocument/2006/relationships/externalLinkPath",
- XMISS: "http://schemas.microsoft.com/office/2006/relationships/xlExternalLinkPath/xlPathMissing",
- XLINK: "http://schemas.openxmlformats.org/officeDocument/2006/relationships/externalLink",
- CXML: "http://schemas.openxmlformats.org/officeDocument/2006/relationships/customXml",
- CXMLP: "http://schemas.openxmlformats.org/officeDocument/2006/relationships/customXmlProps",
- VBA: "http://schemas.microsoft.com/office/2006/relationships/vbaProject"
- });
-
- /* 9.3.3 Representing Relationships */
- function get_rels_path(file) {
- var n = file.lastIndexOf("/");
- return file.slice(0,n+1) + '_rels/' + file.slice(n+1) + ".rels";
- }
-
- function parse_rels(data, currentFilePath) {
- var rels = {"!id":{}};
- if (!data) return rels;
- if (currentFilePath.charAt(0) !== '/') {
- currentFilePath = '/'+currentFilePath;
- }
- var hash = {};
-
- (data.match(tagregex)||[]).forEach(function(x) {
- var y = parsexmltag(x);
- /* 9.3.2.2 OPC_Relationships */
- if (y[0] === '<Relationship') {
- var rel = {}; rel.Type = y.Type; rel.Target = y.Target; rel.Id = y.Id; rel.TargetMode = y.TargetMode;
- var canonictarget = y.TargetMode === 'External' ? y.Target : resolve_path(y.Target, currentFilePath);
- rels[canonictarget] = rel;
- hash[y.Id] = rel;
- }
- });
- rels["!id"] = hash;
- return rels;
- }
-
- XMLNS.RELS = 'http://schemas.openxmlformats.org/package/2006/relationships';
-
- var RELS_ROOT = writextag('Relationships', null, {
- //'xmlns:ns0': XMLNS.RELS,
- 'xmlns': XMLNS.RELS
- });
-
- /* TODO */
- function write_rels(rels) {
- var o = [XML_HEADER, RELS_ROOT];
- keys(rels['!id']).forEach(function(rid) {
- o[o.length] = (writextag('Relationship', null, rels['!id'][rid]));
- });
- if(o.length>2){ o[o.length] = ('</Relationships>'); o[1]=o[1].replace("/>",">"); }
- return o.join("");
- }
-
- var RELS_EXTERN = [RELS.HLINK, RELS.XPATH, RELS.XMISS];
- function add_rels(rels, rId, f, type, relobj, targetmode) {
- if(!relobj) relobj = {};
- if(!rels['!id']) rels['!id'] = {};
- if(rId < 0) for(rId = 1; rels['!id']['rId' + rId]; ++rId){/* empty */}
- relobj.Id = 'rId' + rId;
- relobj.Type = type;
- relobj.Target = f;
- if(targetmode) relobj.TargetMode = targetmode;
- else if(RELS_EXTERN.indexOf(relobj.Type) > -1) relobj.TargetMode = "External";
- if(rels['!id'][relobj.Id]) throw new Error("Cannot rewrite rId " + rId);
- rels['!id'][relobj.Id] = relobj;
- rels[('/' + relobj.Target).replace("//","/")] = relobj;
- return rId;
- }
- /* Open Document Format for Office Applications (OpenDocument) Version 1.2 */
- /* Part 3 Section 4 Manifest File */
- var CT_ODS = "application/vnd.oasis.opendocument.spreadsheet";
- function parse_manifest(d, opts) {
- var str = xlml_normalize(d);
- var Rn;
- var FEtag;
- while((Rn = xlmlregex.exec(str))) switch(Rn[3]) {
- case 'manifest': break; // 4.2 <manifest:manifest>
- case 'file-entry': // 4.3 <manifest:file-entry>
- FEtag = parsexmltag(Rn[0], false);
- if(FEtag.path == '/' && FEtag.type !== CT_ODS) throw new Error("This OpenDocument is not a spreadsheet");
- break;
- case 'encryption-data': // 4.4 <manifest:encryption-data>
- case 'algorithm': // 4.5 <manifest:algorithm>
- case 'start-key-generation': // 4.6 <manifest:start-key-generation>
- case 'key-derivation': // 4.7 <manifest:key-derivation>
- throw new Error("Unsupported ODS Encryption");
- default: if(opts && opts.WTF) throw Rn;
- }
- }
-
- function write_manifest(manifest) {
- var o = [XML_HEADER];
- o.push('<manifest:manifest xmlns:manifest="urn:oasis:names:tc:opendocument:xmlns:manifest:1.0" manifest:version="1.2">\n');
- o.push(' <manifest:file-entry manifest:full-path="/" manifest:version="1.2" manifest:media-type="application/vnd.oasis.opendocument.spreadsheet"/>\n');
- 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');
- o.push('</manifest:manifest>');
- return o.join("");
- }
-
- /* Part 3 Section 6 Metadata Manifest File */
- function write_rdf_type(file, res, tag) {
- return [
- ' <rdf:Description rdf:about="' + file + '">\n',
- ' <rdf:type rdf:resource="http://docs.oasis-open.org/ns/office/1.2/meta/' + (tag || "odf") + '#' + res + '"/>\n',
- ' </rdf:Description>\n'
- ].join("");
- }
- function write_rdf_has(base, file) {
- return [
- ' <rdf:Description rdf:about="' + base + '">\n',
- ' <ns0:hasPart xmlns:ns0="http://docs.oasis-open.org/ns/office/1.2/meta/pkg#" rdf:resource="' + file + '"/>\n',
- ' </rdf:Description>\n'
- ].join("");
- }
- function write_rdf(rdf) {
- var o = [XML_HEADER];
- o.push('<rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#">\n');
- for(var i = 0; i != rdf.length; ++i) {
- o.push(write_rdf_type(rdf[i][0], rdf[i][1]));
- o.push(write_rdf_has("",rdf[i][0]));
- }
- o.push(write_rdf_type("","Document", "pkg"));
- o.push('</rdf:RDF>');
- return o.join("");
- }
- /* TODO: pull properties */
- var write_meta_ods = (function() {
- 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>';
- return function wmo() {
- return payload;
- };
- })();
-
- /* ECMA-376 Part II 11.1 Core Properties Part */
- /* [MS-OSHARED] 2.3.3.2.[1-2].1 (PIDSI/PIDDSI) */
- var CORE_PROPS = [
- ["cp:category", "Category"],
- ["cp:contentStatus", "ContentStatus"],
- ["cp:keywords", "Keywords"],
- ["cp:lastModifiedBy", "LastAuthor"],
- ["cp:lastPrinted", "LastPrinted"],
- ["cp:revision", "RevNumber"],
- ["cp:version", "Version"],
- ["dc:creator", "Author"],
- ["dc:description", "Comments"],
- ["dc:identifier", "Identifier"],
- ["dc:language", "Language"],
- ["dc:subject", "Subject"],
- ["dc:title", "Title"],
- ["dcterms:created", "CreatedDate", 'date'],
- ["dcterms:modified", "ModifiedDate", 'date']
- ];
-
- XMLNS.CORE_PROPS = "http://schemas.openxmlformats.org/package/2006/metadata/core-properties";
- RELS.CORE_PROPS = 'http://schemas.openxmlformats.org/package/2006/relationships/metadata/core-properties';
-
- var CORE_PROPS_REGEX = (function() {
- var r = new Array(CORE_PROPS.length);
- for(var i = 0; i < CORE_PROPS.length; ++i) {
- var f = CORE_PROPS[i];
- var g = "(?:"+ f[0].slice(0,f[0].indexOf(":")) +":)"+ f[0].slice(f[0].indexOf(":")+1);
- r[i] = new RegExp("<" + g + "[^>]*>([\\s\\S]*?)<\/" + g + ">");
- }
- return r;
- })();
-
- function parse_core_props(data) {
- var p = {};
- data = utf8read(data);
-
- for(var i = 0; i < CORE_PROPS.length; ++i) {
- var f = CORE_PROPS[i], cur = data.match(CORE_PROPS_REGEX[i]);
- if(cur != null && cur.length > 0) p[f[1]] = unescapexml(cur[1]);
- if(f[2] === 'date' && p[f[1]]) p[f[1]] = parseDate(p[f[1]]);
- }
-
- return p;
- }
-
- var CORE_PROPS_XML_ROOT = writextag('cp:coreProperties', null, {
- //'xmlns': XMLNS.CORE_PROPS,
- 'xmlns:cp': XMLNS.CORE_PROPS,
- 'xmlns:dc': XMLNS.dc,
- 'xmlns:dcterms': XMLNS.dcterms,
- 'xmlns:dcmitype': XMLNS.dcmitype,
- 'xmlns:xsi': XMLNS.xsi
- });
-
- function cp_doit(f, g, h, o, p) {
- if(p[f] != null || g == null || g === "") return;
- p[f] = g;
- g = escapexml(g);
- o[o.length] = (h ? writextag(f,g,h) : writetag(f,g));
- }
-
- function write_core_props(cp, _opts) {
- var opts = _opts || {};
- var o = [XML_HEADER, CORE_PROPS_XML_ROOT], p = {};
- if(!cp && !opts.Props) return o.join("");
-
- if(cp) {
- 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);
- 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);
- }
-
- for(var i = 0; i != CORE_PROPS.length; ++i) {
- var f = CORE_PROPS[i];
- var v = opts.Props && opts.Props[f[1]] != null ? opts.Props[f[1]] : cp ? cp[f[1]] : null;
- if(v === true) v = "1";
- else if(v === false) v = "0";
- else if(typeof v == "number") v = String(v);
- if(v != null) cp_doit(f[0], v, null, o, p);
- }
- if(o.length>2){ o[o.length] = ('</cp:coreProperties>'); o[1]=o[1].replace("/>",">"); }
- return o.join("");
- }
- /* 15.2.12.3 Extended File Properties Part */
- /* [MS-OSHARED] 2.3.3.2.[1-2].1 (PIDSI/PIDDSI) */
- var EXT_PROPS = [
- ["Application", "Application", "string"],
- ["AppVersion", "AppVersion", "string"],
- ["Company", "Company", "string"],
- ["DocSecurity", "DocSecurity", "string"],
- ["Manager", "Manager", "string"],
- ["HyperlinksChanged", "HyperlinksChanged", "bool"],
- ["SharedDoc", "SharedDoc", "bool"],
- ["LinksUpToDate", "LinksUpToDate", "bool"],
- ["ScaleCrop", "ScaleCrop", "bool"],
- ["HeadingPairs", "HeadingPairs", "raw"],
- ["TitlesOfParts", "TitlesOfParts", "raw"]
- ];
-
- XMLNS.EXT_PROPS = "http://schemas.openxmlformats.org/officeDocument/2006/extended-properties";
- RELS.EXT_PROPS = 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/extended-properties';
-
- var PseudoPropsPairs = [
- "Worksheets", "SheetNames",
- "NamedRanges", "DefinedNames",
- "Chartsheets", "ChartNames"
- ];
- function load_props_pairs(HP, TOP, props, opts) {
- var v = [];
- if(typeof HP == "string") v = parseVector(HP, opts);
- else for(var j = 0; j < HP.length; ++j) v = v.concat(HP[j].map(function(hp) { return {v:hp}; }));
- var parts = (typeof TOP == "string") ? parseVector(TOP, opts).map(function (x) { return x.v; }) : TOP;
- var idx = 0, len = 0;
- if(parts.length > 0) for(var i = 0; i !== v.length; i += 2) {
- len = +(v[i+1].v);
- switch(v[i].v) {
- case "Worksheets":
- case "工作表":
- case "Листы":
- case "أوراق العمل":
- case "ワークシート":
- case "גליונות עבודה":
- case "Arbeitsblätter":
- case "Çalışma Sayfaları":
- case "Feuilles de calcul":
- case "Fogli di lavoro":
- case "Folhas de cálculo":
- case "Planilhas":
- case "Regneark":
- case "Hojas de cálculo":
- case "Werkbladen":
- props.Worksheets = len;
- props.SheetNames = parts.slice(idx, idx + len);
- break;
-
- case "Named Ranges":
- case "Rangos con nombre":
- case "名前付き一覧":
- case "Benannte Bereiche":
- case "Navngivne områder":
- props.NamedRanges = len;
- props.DefinedNames = parts.slice(idx, idx + len);
- break;
-
- case "Charts":
- case "Diagramme":
- props.Chartsheets = len;
- props.ChartNames = parts.slice(idx, idx + len);
- break;
- }
- idx += len;
- }
- }
-
- function parse_ext_props(data, p, opts) {
- var q = {}; if(!p) p = {};
- data = utf8read(data);
-
- EXT_PROPS.forEach(function(f) {
- var xml = (data.match(matchtag(f[0]))||[])[1];
- switch(f[2]) {
- case "string": if(xml) p[f[1]] = unescapexml(xml); break;
- case "bool": p[f[1]] = xml === "true"; break;
- case "raw":
- var cur = data.match(new RegExp("<" + f[0] + "[^>]*>([\\s\\S]*?)<\/" + f[0] + ">"));
- if(cur && cur.length > 0) q[f[1]] = cur[1];
- break;
- }
- });
-
- if(q.HeadingPairs && q.TitlesOfParts) load_props_pairs(q.HeadingPairs, q.TitlesOfParts, p, opts);
-
- return p;
- }
-
- var EXT_PROPS_XML_ROOT = writextag('Properties', null, {
- 'xmlns': XMLNS.EXT_PROPS,
- 'xmlns:vt': XMLNS.vt
- });
-
- function write_ext_props(cp) {
- var o = [], W = writextag;
- if(!cp) cp = {};
- cp.Application = "SheetJS";
- o[o.length] = (XML_HEADER);
- o[o.length] = (EXT_PROPS_XML_ROOT);
-
- EXT_PROPS.forEach(function(f) {
- if(cp[f[1]] === undefined) return;
- var v;
- switch(f[2]) {
- case 'string': v = escapexml(String(cp[f[1]])); break;
- case 'bool': v = cp[f[1]] ? 'true' : 'false'; break;
- }
- if(v !== undefined) o[o.length] = (W(f[0], v));
- });
-
- /* TODO: HeadingPairs, TitlesOfParts */
- 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"})));
- 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"})));
- if(o.length>2){ o[o.length] = ('</Properties>'); o[1]=o[1].replace("/>",">"); }
- return o.join("");
- }
- /* 15.2.12.2 Custom File Properties Part */
- XMLNS.CUST_PROPS = "http://schemas.openxmlformats.org/officeDocument/2006/custom-properties";
- RELS.CUST_PROPS = 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/custom-properties';
-
- var custregex = /<[^>]+>[^<]*/g;
- function parse_cust_props(data, opts) {
- var p = {}, name = "";
- var m = data.match(custregex);
- if(m) for(var i = 0; i != m.length; ++i) {
- var x = m[i], y = parsexmltag(x);
- switch(y[0]) {
- case '<?xml': break;
- case '<Properties': break;
- case '<property': name = unescapexml(y.name); break;
- case '</property>': name = null; break;
- default: if (x.indexOf('<vt:') === 0) {
- var toks = x.split('>');
- var type = toks[0].slice(4), text = toks[1];
- /* 22.4.2.32 (CT_Variant). Omit the binary types from 22.4 (Variant Types) */
- switch(type) {
- case 'lpstr': case 'bstr': case 'lpwstr':
- p[name] = unescapexml(text);
- break;
- case 'bool':
- p[name] = parsexmlbool(text);
- break;
- case 'i1': case 'i2': case 'i4': case 'i8': case 'int': case 'uint':
- p[name] = parseInt(text, 10);
- break;
- case 'r4': case 'r8': case 'decimal':
- p[name] = parseFloat(text);
- break;
- case 'filetime': case 'date':
- p[name] = parseDate(text);
- break;
- case 'cy': case 'error':
- p[name] = unescapexml(text);
- break;
- default:
- if(type.slice(-1) == '/') break;
- if(opts.WTF && typeof console !== 'undefined') console.warn('Unexpected', x, type, toks);
- }
- } else if(x.slice(0,2) === "</") {/* empty */
- } else if(opts.WTF) throw new Error(x);
- }
- }
- return p;
- }
-
- var CUST_PROPS_XML_ROOT = writextag('Properties', null, {
- 'xmlns': XMLNS.CUST_PROPS,
- 'xmlns:vt': XMLNS.vt
- });
-
- function write_cust_props(cp) {
- var o = [XML_HEADER, CUST_PROPS_XML_ROOT];
- if(!cp) return o.join("");
- var pid = 1;
- keys(cp).forEach(function custprop(k) { ++pid;
- o[o.length] = (writextag('property', write_vt(cp[k], true), {
- 'fmtid': '{D5CDD505-2E9C-101B-9397-08002B2CF9AE}',
- 'pid': pid,
- 'name': escapexml(k)
- }));
- });
- if(o.length>2){ o[o.length] = '</Properties>'; o[1]=o[1].replace("/>",">"); }
- return o.join("");
- }
- /* Common Name -> XLML Name */
- var XLMLDocPropsMap = {
- Title: 'Title',
- Subject: 'Subject',
- Author: 'Author',
- Keywords: 'Keywords',
- Comments: 'Description',
- LastAuthor: 'LastAuthor',
- RevNumber: 'Revision',
- Application: 'AppName',
- /* TotalTime: 'TotalTime', */
- LastPrinted: 'LastPrinted',
- CreatedDate: 'Created',
- ModifiedDate: 'LastSaved',
- /* Pages */
- /* Words */
- /* Characters */
- Category: 'Category',
- /* PresentationFormat */
- Manager: 'Manager',
- Company: 'Company',
- /* Guid */
- /* HyperlinkBase */
- /* Bytes */
- /* Lines */
- /* Paragraphs */
- /* CharactersWithSpaces */
- AppVersion: 'Version',
-
- ContentStatus: 'ContentStatus', /* NOTE: missing from schema */
- Identifier: 'Identifier', /* NOTE: missing from schema */
- Language: 'Language' /* NOTE: missing from schema */
- };
- var evert_XLMLDPM = evert(XLMLDocPropsMap);
-
- function xlml_set_prop(Props, tag, val) {
- tag = evert_XLMLDPM[tag] || tag;
- Props[tag] = val;
- }
-
- function xlml_write_docprops(Props, opts) {
- var o = [];
- keys(XLMLDocPropsMap).map(function(m) {
- for(var i = 0; i < CORE_PROPS.length; ++i) if(CORE_PROPS[i][1] == m) return CORE_PROPS[i];
- for(i = 0; i < EXT_PROPS.length; ++i) if(EXT_PROPS[i][1] == m) return EXT_PROPS[i];
- throw m;
- }).forEach(function(p) {
- if(Props[p[1]] == null) return;
- var m = opts && opts.Props && opts.Props[p[1]] != null ? opts.Props[p[1]] : Props[p[1]];
- switch(p[2]) {
- case 'date': m = new Date(m).toISOString().replace(/\.\d*Z/,"Z"); break;
- }
- if(typeof m == 'number') m = String(m);
- else if(m === true || m === false) { m = m ? "1" : "0"; }
- else if(m instanceof Date) m = new Date(m).toISOString().replace(/\.\d*Z/,"");
- o.push(writetag(XLMLDocPropsMap[p[1]] || p[1], m));
- });
- return writextag('DocumentProperties', o.join(""), {xmlns:XLMLNS.o });
- }
- function xlml_write_custprops(Props, Custprops) {
- var BLACKLIST = ["Worksheets","SheetNames"];
- var T = 'CustomDocumentProperties';
- var o = [];
- if(Props) keys(Props).forEach(function(k) {
- if(!Object.prototype.hasOwnProperty.call(Props, k)) return;
- for(var i = 0; i < CORE_PROPS.length; ++i) if(k == CORE_PROPS[i][1]) return;
- for(i = 0; i < EXT_PROPS.length; ++i) if(k == EXT_PROPS[i][1]) return;
- for(i = 0; i < BLACKLIST.length; ++i) if(k == BLACKLIST[i]) return;
-
- var m = Props[k];
- var t = "string";
- if(typeof m == 'number') { t = "float"; m = String(m); }
- else if(m === true || m === false) { t = "boolean"; m = m ? "1" : "0"; }
- else m = String(m);
- o.push(writextag(escapexmltag(k), m, {"dt:dt":t}));
- });
- if(Custprops) keys(Custprops).forEach(function(k) {
- if(!Object.prototype.hasOwnProperty.call(Custprops, k)) return;
- if(Props && Object.prototype.hasOwnProperty.call(Props, k)) return;
- var m = Custprops[k];
- var t = "string";
- if(typeof m == 'number') { t = "float"; m = String(m); }
- else if(m === true || m === false) { t = "boolean"; m = m ? "1" : "0"; }
- else if(m instanceof Date) { t = "dateTime.tz"; m = m.toISOString(); }
- else m = String(m);
- o.push(writextag(escapexmltag(k), m, {"dt:dt":t}));
- });
- return '<' + T + ' xmlns="' + XLMLNS.o + '">' + o.join("") + '</' + T + '>';
- }
- /* [MS-DTYP] 2.3.3 FILETIME */
- /* [MS-OLEDS] 2.1.3 FILETIME (Packet Version) */
- /* [MS-OLEPS] 2.8 FILETIME (Packet Version) */
- function parse_FILETIME(blob) {
- var dwLowDateTime = blob.read_shift(4), dwHighDateTime = blob.read_shift(4);
- return new Date(((dwHighDateTime/1e7*Math.pow(2,32) + dwLowDateTime/1e7) - 11644473600)*1000).toISOString().replace(/\.000/,"");
- }
- function write_FILETIME(time) {
- var date = (typeof time == "string") ? new Date(Date.parse(time)) : time;
- var t = date.getTime() / 1000 + 11644473600;
- var l = t % Math.pow(2,32), h = (t - l) / Math.pow(2,32);
- l *= 1e7; h *= 1e7;
- var w = (l / Math.pow(2,32)) | 0;
- if(w > 0) { l = l % Math.pow(2,32); h += w; }
- var o = new_buf(8); o.write_shift(4, l); o.write_shift(4, h); return o;
- }
-
- /* [MS-OSHARED] 2.3.3.1.4 Lpstr */
- function parse_lpstr(blob, type, pad) {
- var start = blob.l;
- var str = blob.read_shift(0, 'lpstr-cp');
- if(pad) while((blob.l - start) & 3) ++blob.l;
- return str;
- }
-
- /* [MS-OSHARED] 2.3.3.1.6 Lpwstr */
- function parse_lpwstr(blob, type, pad) {
- var str = blob.read_shift(0, 'lpwstr');
- if(pad) blob.l += (4 - ((str.length+1) & 3)) & 3;
- return str;
- }
-
-
- /* [MS-OSHARED] 2.3.3.1.11 VtString */
- /* [MS-OSHARED] 2.3.3.1.12 VtUnalignedString */
- function parse_VtStringBase(blob, stringType, pad) {
- if(stringType === 0x1F /*VT_LPWSTR*/) return parse_lpwstr(blob);
- return parse_lpstr(blob, stringType, pad);
- }
-
- function parse_VtString(blob, t, pad) { return parse_VtStringBase(blob, t, pad === false ? 0: 4); }
- function parse_VtUnalignedString(blob, t) { if(!t) throw new Error("VtUnalignedString must have positive length"); return parse_VtStringBase(blob, t, 0); }
-
- /* [MS-OSHARED] 2.3.3.1.9 VtVecUnalignedLpstrValue */
- function parse_VtVecUnalignedLpstrValue(blob) {
- var length = blob.read_shift(4);
- var ret = [];
- for(var i = 0; i != length; ++i) ret[i] = blob.read_shift(0, 'lpstr-cp').replace(chr0,'');
- return ret;
- }
-
- /* [MS-OSHARED] 2.3.3.1.10 VtVecUnalignedLpstr */
- function parse_VtVecUnalignedLpstr(blob) {
- return parse_VtVecUnalignedLpstrValue(blob);
- }
-
- /* [MS-OSHARED] 2.3.3.1.13 VtHeadingPair */
- function parse_VtHeadingPair(blob) {
- var headingString = parse_TypedPropertyValue(blob, VT_USTR);
- var headerParts = parse_TypedPropertyValue(blob, VT_I4);
- return [headingString, headerParts];
- }
-
- /* [MS-OSHARED] 2.3.3.1.14 VtVecHeadingPairValue */
- function parse_VtVecHeadingPairValue(blob) {
- var cElements = blob.read_shift(4);
- var out = [];
- for(var i = 0; i != cElements / 2; ++i) out.push(parse_VtHeadingPair(blob));
- return out;
- }
-
- /* [MS-OSHARED] 2.3.3.1.15 VtVecHeadingPair */
- function parse_VtVecHeadingPair(blob) {
- // NOTE: When invoked, wType & padding were already consumed
- return parse_VtVecHeadingPairValue(blob);
- }
-
- /* [MS-OLEPS] 2.18.1 Dictionary (uses 2.17, 2.16) */
- function parse_dictionary(blob,CodePage) {
- var cnt = blob.read_shift(4);
- var dict = ({});
- for(var j = 0; j != cnt; ++j) {
- var pid = blob.read_shift(4);
- var len = blob.read_shift(4);
- dict[pid] = blob.read_shift(len, (CodePage === 0x4B0 ?'utf16le':'utf8')).replace(chr0,'').replace(chr1,'!');
- if(CodePage === 0x4B0 && (len % 2)) blob.l += 2;
- }
- if(blob.l & 3) blob.l = (blob.l>>2+1)<<2;
- return dict;
- }
-
- /* [MS-OLEPS] 2.9 BLOB */
- function parse_BLOB(blob) {
- var size = blob.read_shift(4);
- var bytes = blob.slice(blob.l,blob.l+size);
- blob.l += size;
- if((size & 3) > 0) blob.l += (4 - (size & 3)) & 3;
- return bytes;
- }
-
- /* [MS-OLEPS] 2.11 ClipboardData */
- function parse_ClipboardData(blob) {
- // TODO
- var o = {};
- o.Size = blob.read_shift(4);
- //o.Format = blob.read_shift(4);
- blob.l += o.Size + 3 - (o.Size - 1) % 4;
- return o;
- }
-
- /* [MS-OLEPS] 2.15 TypedPropertyValue */
- function parse_TypedPropertyValue(blob, type, _opts) {
- var t = blob.read_shift(2), ret, opts = _opts||{};
- blob.l += 2;
- if(type !== VT_VARIANT)
- if(t !== type && VT_CUSTOM.indexOf(type)===-1) throw new Error('Expected type ' + type + ' saw ' + t);
- switch(type === VT_VARIANT ? t : type) {
- case 0x02 /*VT_I2*/: ret = blob.read_shift(2, 'i'); if(!opts.raw) blob.l += 2; return ret;
- case 0x03 /*VT_I4*/: ret = blob.read_shift(4, 'i'); return ret;
- case 0x0B /*VT_BOOL*/: return blob.read_shift(4) !== 0x0;
- case 0x13 /*VT_UI4*/: ret = blob.read_shift(4); return ret;
- case 0x1E /*VT_LPSTR*/: return parse_lpstr(blob, t, 4).replace(chr0,'');
- case 0x1F /*VT_LPWSTR*/: return parse_lpwstr(blob);
- case 0x40 /*VT_FILETIME*/: return parse_FILETIME(blob);
- case 0x41 /*VT_BLOB*/: return parse_BLOB(blob);
- case 0x47 /*VT_CF*/: return parse_ClipboardData(blob);
- case 0x50 /*VT_STRING*/: return parse_VtString(blob, t, !opts.raw).replace(chr0,'');
- case 0x51 /*VT_USTR*/: return parse_VtUnalignedString(blob, t/*, 4*/).replace(chr0,'');
- case 0x100C /*VT_VECTOR|VT_VARIANT*/: return parse_VtVecHeadingPair(blob);
- case 0x101E /*VT_LPSTR*/: return parse_VtVecUnalignedLpstr(blob);
- default: throw new Error("TypedPropertyValue unrecognized type " + type + " " + t);
- }
- }
- function write_TypedPropertyValue(type, value) {
- var o = new_buf(4), p = new_buf(4);
- o.write_shift(4, type == 0x50 ? 0x1F : type);
- switch(type) {
- case 0x03 /*VT_I4*/: p.write_shift(-4, value); break;
- case 0x05 /*VT_I4*/: p = new_buf(8); p.write_shift(8, value, 'f'); break;
- case 0x0B /*VT_BOOL*/: p.write_shift(4, value ? 0x01 : 0x00); break;
- case 0x40 /*VT_FILETIME*/: p = write_FILETIME(value); break;
- case 0x1F /*VT_LPWSTR*/:
- case 0x50 /*VT_STRING*/:
- p = new_buf(4 + 2 * (value.length + 1) + (value.length % 2 ? 0 : 2));
- p.write_shift(4, value.length + 1);
- p.write_shift(0, value, "dbcs");
- while(p.l != p.length) p.write_shift(1, 0);
- break;
- default: throw new Error("TypedPropertyValue unrecognized type " + type + " " + value);
- }
- return bconcat([o, p]);
- }
-
- /* [MS-OLEPS] 2.20 PropertySet */
- function parse_PropertySet(blob, PIDSI) {
- var start_addr = blob.l;
- var size = blob.read_shift(4);
- var NumProps = blob.read_shift(4);
- var Props = [], i = 0;
- var CodePage = 0;
- var Dictionary = -1, DictObj = ({});
- for(i = 0; i != NumProps; ++i) {
- var PropID = blob.read_shift(4);
- var Offset = blob.read_shift(4);
- Props[i] = [PropID, Offset + start_addr];
- }
- Props.sort(function(x,y) { return x[1] - y[1]; });
- var PropH = {};
- for(i = 0; i != NumProps; ++i) {
- if(blob.l !== Props[i][1]) {
- var fail = true;
- if(i>0 && PIDSI) switch(PIDSI[Props[i-1][0]].t) {
- case 0x02 /*VT_I2*/: if(blob.l+2 === Props[i][1]) { blob.l+=2; fail = false; } break;
- case 0x50 /*VT_STRING*/: if(blob.l <= Props[i][1]) { blob.l=Props[i][1]; fail = false; } break;
- case 0x100C /*VT_VECTOR|VT_VARIANT*/: if(blob.l <= Props[i][1]) { blob.l=Props[i][1]; fail = false; } break;
- }
- if((!PIDSI||i==0) && blob.l <= Props[i][1]) { fail=false; blob.l = Props[i][1]; }
- if(fail) throw new Error("Read Error: Expected address " + Props[i][1] + ' at ' + blob.l + ' :' + i);
- }
- if(PIDSI) {
- var piddsi = PIDSI[Props[i][0]];
- PropH[piddsi.n] = parse_TypedPropertyValue(blob, piddsi.t, {raw:true});
- if(piddsi.p === 'version') PropH[piddsi.n] = String(PropH[piddsi.n] >> 16) + "." + ("0000" + String(PropH[piddsi.n] & 0xFFFF)).slice(-4);
- if(piddsi.n == "CodePage") switch(PropH[piddsi.n]) {
- case 0: PropH[piddsi.n] = 1252;
- /* falls through */
- case 874:
- case 932:
- case 936:
- case 949:
- case 950:
- case 1250:
- case 1251:
- case 1253:
- case 1254:
- case 1255:
- case 1256:
- case 1257:
- case 1258:
- case 10000:
- case 1200:
- case 1201:
- case 1252:
- case 65000: case -536:
- case 65001: case -535:
- set_cp(CodePage = (PropH[piddsi.n]>>>0) & 0xFFFF); break;
- default: throw new Error("Unsupported CodePage: " + PropH[piddsi.n]);
- }
- } else {
- if(Props[i][0] === 0x1) {
- CodePage = PropH.CodePage = (parse_TypedPropertyValue(blob, VT_I2));
- set_cp(CodePage);
- if(Dictionary !== -1) {
- var oldpos = blob.l;
- blob.l = Props[Dictionary][1];
- DictObj = parse_dictionary(blob,CodePage);
- blob.l = oldpos;
- }
- } else if(Props[i][0] === 0) {
- if(CodePage === 0) { Dictionary = i; blob.l = Props[i+1][1]; continue; }
- DictObj = parse_dictionary(blob,CodePage);
- } else {
- var name = DictObj[Props[i][0]];
- var val;
- /* [MS-OSHARED] 2.3.3.2.3.1.2 + PROPVARIANT */
- switch(blob[blob.l]) {
- case 0x41 /*VT_BLOB*/: blob.l += 4; val = parse_BLOB(blob); break;
- case 0x1E /*VT_LPSTR*/: blob.l += 4; val = parse_VtString(blob, blob[blob.l-4]).replace(/\u0000+$/,""); break;
- case 0x1F /*VT_LPWSTR*/: blob.l += 4; val = parse_VtString(blob, blob[blob.l-4]).replace(/\u0000+$/,""); break;
- case 0x03 /*VT_I4*/: blob.l += 4; val = blob.read_shift(4, 'i'); break;
- case 0x13 /*VT_UI4*/: blob.l += 4; val = blob.read_shift(4); break;
- case 0x05 /*VT_R8*/: blob.l += 4; val = blob.read_shift(8, 'f'); break;
- case 0x0B /*VT_BOOL*/: blob.l += 4; val = parsebool(blob, 4); break;
- case 0x40 /*VT_FILETIME*/: blob.l += 4; val = parseDate(parse_FILETIME(blob)); break;
- default: throw new Error("unparsed value: " + blob[blob.l]);
- }
- PropH[name] = val;
- }
- }
- }
- blob.l = start_addr + size; /* step ahead to skip padding */
- return PropH;
- }
- var XLSPSSkip = [ "CodePage", "Thumbnail", "_PID_LINKBASE", "_PID_HLINKS", "SystemIdentifier", "FMTID" ].concat(PseudoPropsPairs);
- function guess_property_type(val) {
- switch(typeof val) {
- case "boolean": return 0x0B;
- case "number": return ((val|0)==val) ? 0x03 : 0x05;
- case "string": return 0x1F;
- case "object": if(val instanceof Date) return 0x40; break;
- }
- return -1;
- }
- function write_PropertySet(entries, RE, PIDSI) {
- var hdr = new_buf(8), piao = [], prop = [];
- var sz = 8, i = 0;
-
- var pr = new_buf(8), pio = new_buf(8);
- pr.write_shift(4, 0x0002);
- pr.write_shift(4, 0x04B0);
- pio.write_shift(4, 0x0001);
- prop.push(pr); piao.push(pio);
- sz += 8 + pr.length;
-
- if(!RE) {
- pio = new_buf(8);
- pio.write_shift(4, 0);
- piao.unshift(pio);
-
- var bufs = [new_buf(4)];
- bufs[0].write_shift(4, entries.length);
- for(i = 0; i < entries.length; ++i) {
- var value = entries[i][0];
- pr = new_buf(4 + 4 + 2 * (value.length + 1) + (value.length % 2 ? 0 : 2));
- pr.write_shift(4, i+2);
- pr.write_shift(4, value.length + 1);
- pr.write_shift(0, value, "dbcs");
- while(pr.l != pr.length) pr.write_shift(1, 0);
- bufs.push(pr);
- }
- pr = bconcat(bufs);
- prop.unshift(pr);
- sz += 8 + pr.length;
- }
-
- for(i = 0; i < entries.length; ++i) {
- if(RE && !RE[entries[i][0]]) continue;
- if(XLSPSSkip.indexOf(entries[i][0]) > -1) continue;
- if(entries[i][1] == null) continue;
-
- var val = entries[i][1], idx = 0;
- if(RE) {
- idx = +RE[entries[i][0]];
- var pinfo = (PIDSI)[idx];
- if(pinfo.p == "version" && typeof val == "string") {
- var arr = val.split(".");
- val = ((+arr[0])<<16) + ((+arr[1])||0);
- }
- pr = write_TypedPropertyValue(pinfo.t, val);
- } else {
- var T = guess_property_type(val);
- if(T == -1) { T = 0x1F; val = String(val); }
- pr = write_TypedPropertyValue(T, val);
- }
- prop.push(pr);
-
- pio = new_buf(8);
- pio.write_shift(4, !RE ? 2+i : idx);
- piao.push(pio);
-
- sz += 8 + pr.length;
- }
-
- var w = 8 * (prop.length + 1);
- for(i = 0; i < prop.length; ++i) { piao[i].write_shift(4, w); w += prop[i].length; }
- hdr.write_shift(4, sz);
- hdr.write_shift(4, prop.length);
- return bconcat([hdr].concat(piao).concat(prop));
- }
-
- /* [MS-OLEPS] 2.21 PropertySetStream */
- function parse_PropertySetStream(file, PIDSI, clsid) {
- var blob = file.content;
- if(!blob) return ({});
- prep_blob(blob, 0);
-
- var NumSets, FMTID0, FMTID1, Offset0, Offset1 = 0;
- blob.chk('feff', 'Byte Order: ');
-
- /*var vers = */blob.read_shift(2); // TODO: check version
- var SystemIdentifier = blob.read_shift(4);
- var CLSID = blob.read_shift(16);
- if(CLSID !== CFB.utils.consts.HEADER_CLSID && CLSID !== clsid) throw new Error("Bad PropertySet CLSID " + CLSID);
- NumSets = blob.read_shift(4);
- if(NumSets !== 1 && NumSets !== 2) throw new Error("Unrecognized #Sets: " + NumSets);
- FMTID0 = blob.read_shift(16); Offset0 = blob.read_shift(4);
-
- if(NumSets === 1 && Offset0 !== blob.l) throw new Error("Length mismatch: " + Offset0 + " !== " + blob.l);
- else if(NumSets === 2) { FMTID1 = blob.read_shift(16); Offset1 = blob.read_shift(4); }
- var PSet0 = parse_PropertySet(blob, PIDSI);
-
- var rval = ({ SystemIdentifier: SystemIdentifier });
- for(var y in PSet0) rval[y] = PSet0[y];
- //rval.blob = blob;
- rval.FMTID = FMTID0;
- //rval.PSet0 = PSet0;
- if(NumSets === 1) return rval;
- if(Offset1 - blob.l == 2) blob.l += 2;
- if(blob.l !== Offset1) throw new Error("Length mismatch 2: " + blob.l + " !== " + Offset1);
- var PSet1;
- try { PSet1 = parse_PropertySet(blob, null); } catch(e) {/* empty */}
- for(y in PSet1) rval[y] = PSet1[y];
- rval.FMTID = [FMTID0, FMTID1]; // TODO: verify FMTID0/1
- return rval;
- }
- function write_PropertySetStream(entries, clsid, RE, PIDSI, entries2, clsid2) {
- var hdr = new_buf(entries2 ? 68 : 48);
- var bufs = [hdr];
- hdr.write_shift(2, 0xFFFE);
- hdr.write_shift(2, 0x0000); /* TODO: type 1 props */
- hdr.write_shift(4, 0x32363237);
- hdr.write_shift(16, CFB.utils.consts.HEADER_CLSID, "hex");
- hdr.write_shift(4, (entries2 ? 2 : 1));
- hdr.write_shift(16, clsid, "hex");
- hdr.write_shift(4, (entries2 ? 68 : 48));
- var ps0 = write_PropertySet(entries, RE, PIDSI);
- bufs.push(ps0);
-
- if(entries2) {
- var ps1 = write_PropertySet(entries2, null, null);
- hdr.write_shift(16, clsid2, "hex");
- hdr.write_shift(4, 68 + ps0.length);
- bufs.push(ps1);
- }
- return bconcat(bufs);
- }
-
- function parsenoop2(blob, length) { blob.read_shift(length); return null; }
- function writezeroes(n, o) { if(!o) o=new_buf(n); for(var j=0; j<n; ++j) o.write_shift(1, 0); return o; }
-
- function parslurp(blob, length, cb) {
- var arr = [], target = blob.l + length;
- while(blob.l < target) arr.push(cb(blob, target - blob.l));
- if(target !== blob.l) throw new Error("Slurp error");
- return arr;
- }
-
- function parsebool(blob, length) { return blob.read_shift(length) === 0x1; }
- function writebool(v, o) { if(!o) o=new_buf(2); o.write_shift(2, +!!v); return o; }
-
- function parseuint16(blob) { return blob.read_shift(2, 'u'); }
- function writeuint16(v, o) { if(!o) o=new_buf(2); o.write_shift(2, v); return o; }
- function parseuint16a(blob, length) { return parslurp(blob,length,parseuint16);}
-
- /* --- 2.5 Structures --- */
-
- /* [MS-XLS] 2.5.10 Bes (boolean or error) */
- function parse_Bes(blob) {
- var v = blob.read_shift(1), t = blob.read_shift(1);
- return t === 0x01 ? v : v === 0x01;
- }
- function write_Bes(v, t, o) {
- if(!o) o = new_buf(2);
- o.write_shift(1, +v);
- o.write_shift(1, ((t == 'e') ? 1 : 0));
- return o;
- }
-
- /* [MS-XLS] 2.5.240 ShortXLUnicodeString */
- function parse_ShortXLUnicodeString(blob, length, opts) {
- var cch = blob.read_shift(opts && opts.biff >= 12 ? 2 : 1);
- var encoding = 'sbcs-cont';
- var cp = current_codepage;
- if(opts && opts.biff >= 8) current_codepage = 1200;
- if(!opts || opts.biff == 8 ) {
- var fHighByte = blob.read_shift(1);
- if(fHighByte) { encoding = 'dbcs-cont'; }
- } else if(opts.biff == 12) {
- encoding = 'wstr';
- }
- if(opts.biff >= 2 && opts.biff <= 5) encoding = 'cpstr';
- var o = cch ? blob.read_shift(cch, encoding) : "";
- current_codepage = cp;
- return o;
- }
-
- /* 2.5.293 XLUnicodeRichExtendedString */
- function parse_XLUnicodeRichExtendedString(blob) {
- var cp = current_codepage;
- current_codepage = 1200;
- var cch = blob.read_shift(2), flags = blob.read_shift(1);
- var /*fHighByte = flags & 0x1,*/ fExtSt = flags & 0x4, fRichSt = flags & 0x8;
- var width = 1 + (flags & 0x1); // 0x0 -> utf8, 0x1 -> dbcs
- var cRun = 0, cbExtRst;
- var z = {};
- if(fRichSt) cRun = blob.read_shift(2);
- if(fExtSt) cbExtRst = blob.read_shift(4);
- var encoding = width == 2 ? 'dbcs-cont' : 'sbcs-cont';
- var msg = cch === 0 ? "" : blob.read_shift(cch, encoding);
- if(fRichSt) blob.l += 4 * cRun; //TODO: parse this
- if(fExtSt) blob.l += cbExtRst; //TODO: parse this
- z.t = msg;
- if(!fRichSt) { z.raw = "<t>" + z.t + "</t>"; z.r = z.t; }
- current_codepage = cp;
- return z;
- }
- function write_XLUnicodeRichExtendedString(xlstr) {
- var str = (xlstr.t||""), nfmts = 1;
-
- var hdr = new_buf(3 + (nfmts > 1 ? 2 : 0));
- hdr.write_shift(2, str.length);
- hdr.write_shift(1, (nfmts > 1 ? 0x08 : 0x00) | 0x01);
- if(nfmts > 1) hdr.write_shift(2, nfmts);
-
- var otext = new_buf(2 * str.length);
- otext.write_shift(2 * str.length, str, 'utf16le');
-
- var out = [hdr, otext];
-
- return bconcat(out);
- }
-
- /* 2.5.296 XLUnicodeStringNoCch */
- function parse_XLUnicodeStringNoCch(blob, cch, opts) {
- var retval;
- if(opts) {
- if(opts.biff >= 2 && opts.biff <= 5) return blob.read_shift(cch, 'cpstr');
- if(opts.biff >= 12) return blob.read_shift(cch, 'dbcs-cont');
- }
- var fHighByte = blob.read_shift(1);
- if(fHighByte===0) { retval = blob.read_shift(cch, 'sbcs-cont'); }
- else { retval = blob.read_shift(cch, 'dbcs-cont'); }
- return retval;
- }
-
- /* 2.5.294 XLUnicodeString */
- function parse_XLUnicodeString(blob, length, opts) {
- var cch = blob.read_shift(opts && opts.biff == 2 ? 1 : 2);
- if(cch === 0) { blob.l++; return ""; }
- return parse_XLUnicodeStringNoCch(blob, cch, opts);
- }
- /* BIFF5 override */
- function parse_XLUnicodeString2(blob, length, opts) {
- if(opts.biff > 5) return parse_XLUnicodeString(blob, length, opts);
- var cch = blob.read_shift(1);
- if(cch === 0) { blob.l++; return ""; }
- return blob.read_shift(cch, (opts.biff <= 4 || !blob.lens ) ? 'cpstr' : 'sbcs-cont');
- }
- /* TODO: BIFF5 and lower, codepage awareness */
- function write_XLUnicodeString(str, opts, o) {
- if(!o) o = new_buf(3 + 2 * str.length);
- o.write_shift(2, str.length);
- o.write_shift(1, 1);
- o.write_shift(31, str, 'utf16le');
- return o;
- }
-
- /* [MS-XLS] 2.5.61 ControlInfo */
- function parse_ControlInfo(blob) {
- var flags = blob.read_shift(1);
- blob.l++;
- var accel = blob.read_shift(2);
- blob.l += 2;
- return [flags, accel];
- }
-
- /* [MS-OSHARED] 2.3.7.6 URLMoniker TODO: flags */
- function parse_URLMoniker(blob) {
- var len = blob.read_shift(4), start = blob.l;
- var extra = false;
- if(len > 24) {
- /* look ahead */
- blob.l += len - 24;
- if(blob.read_shift(16) === "795881f43b1d7f48af2c825dc4852763") extra = true;
- blob.l = start;
- }
- var url = blob.read_shift((extra?len-24:len)>>1, 'utf16le').replace(chr0,"");
- if(extra) blob.l += 24;
- return url;
- }
-
- /* [MS-OSHARED] 2.3.7.8 FileMoniker TODO: all fields */
- function parse_FileMoniker(blob) {
- blob.l += 2; //var cAnti = blob.read_shift(2);
- var ansiPath = blob.read_shift(0, 'lpstr-ansi');
- blob.l += 2; //var endServer = blob.read_shift(2);
- if(blob.read_shift(2) != 0xDEAD) throw new Error("Bad FileMoniker");
- var sz = blob.read_shift(4);
- if(sz === 0) return ansiPath.replace(/\\/g,"/");
- var bytes = blob.read_shift(4);
- if(blob.read_shift(2) != 3) throw new Error("Bad FileMoniker");
- var unicodePath = blob.read_shift(bytes>>1, 'utf16le').replace(chr0,"");
- return unicodePath;
- }
-
- /* [MS-OSHARED] 2.3.7.2 HyperlinkMoniker TODO: all the monikers */
- function parse_HyperlinkMoniker(blob, length) {
- var clsid = blob.read_shift(16); length -= 16;
- switch(clsid) {
- case "e0c9ea79f9bace118c8200aa004ba90b": return parse_URLMoniker(blob, length);
- case "0303000000000000c000000000000046": return parse_FileMoniker(blob, length);
- default: throw new Error("Unsupported Moniker " + clsid);
- }
- }
-
- /* [MS-OSHARED] 2.3.7.9 HyperlinkString */
- function parse_HyperlinkString(blob) {
- var len = blob.read_shift(4);
- var o = len > 0 ? blob.read_shift(len, 'utf16le').replace(chr0, "") : "";
- return o;
- }
-
- /* [MS-OSHARED] 2.3.7.1 Hyperlink Object */
- function parse_Hyperlink(blob, length) {
- var end = blob.l + length;
- var sVer = blob.read_shift(4);
- if(sVer !== 2) throw new Error("Unrecognized streamVersion: " + sVer);
- var flags = blob.read_shift(2);
- blob.l += 2;
- var displayName, targetFrameName, moniker, oleMoniker, Loc="", guid, fileTime;
- if(flags & 0x0010) displayName = parse_HyperlinkString(blob, end - blob.l);
- if(flags & 0x0080) targetFrameName = parse_HyperlinkString(blob, end - blob.l);
- if((flags & 0x0101) === 0x0101) moniker = parse_HyperlinkString(blob, end - blob.l);
- if((flags & 0x0101) === 0x0001) oleMoniker = parse_HyperlinkMoniker(blob, end - blob.l);
- if(flags & 0x0008) Loc = parse_HyperlinkString(blob, end - blob.l);
- if(flags & 0x0020) guid = blob.read_shift(16);
- if(flags & 0x0040) fileTime = parse_FILETIME(blob/*, 8*/);
- blob.l = end;
- var target = targetFrameName||moniker||oleMoniker||"";
- if(target && Loc) target+="#"+Loc;
- if(!target) target = "#" + Loc;
- var out = ({Target:target});
- if(guid) out.guid = guid;
- if(fileTime) out.time = fileTime;
- if(displayName) out.Tooltip = displayName;
- return out;
- }
- function write_Hyperlink(hl) {
- var out = new_buf(512), i = 0;
- var Target = hl.Target;
- var F = Target.indexOf("#") > -1 ? 0x1f : 0x17;
- switch(Target.charAt(0)) { case "#": F=0x1c; break; case ".": F&=~2; break; }
- out.write_shift(4,2); out.write_shift(4, F);
- var data = [8,6815827,6619237,4849780,83]; for(i = 0; i < data.length; ++i) out.write_shift(4, data[i]);
- if(F == 0x1C) {
- Target = Target.slice(1);
- out.write_shift(4, Target.length + 1);
- for(i = 0; i < Target.length; ++i) out.write_shift(2, Target.charCodeAt(i));
- out.write_shift(2, 0);
- } else if(F & 0x02) {
- data = "e0 c9 ea 79 f9 ba ce 11 8c 82 00 aa 00 4b a9 0b".split(" ");
- for(i = 0; i < data.length; ++i) out.write_shift(1, parseInt(data[i], 16));
- out.write_shift(4, 2*(Target.length + 1));
- for(i = 0; i < Target.length; ++i) out.write_shift(2, Target.charCodeAt(i));
- out.write_shift(2, 0);
- } else {
- data = "03 03 00 00 00 00 00 00 c0 00 00 00 00 00 00 46".split(" ");
- for(i = 0; i < data.length; ++i) out.write_shift(1, parseInt(data[i], 16));
- var P = 0;
- while(Target.slice(P*3,P*3+3)=="../"||Target.slice(P*3,P*3+3)=="..\\") ++P;
- out.write_shift(2, P);
- out.write_shift(4, Target.length + 1);
- for(i = 0; i < Target.length; ++i) out.write_shift(1, Target.charCodeAt(i) & 0xFF);
- out.write_shift(1, 0);
- out.write_shift(2, 0xFFFF);
- out.write_shift(2, 0xDEAD);
- for(i = 0; i < 6; ++i) out.write_shift(4, 0);
- }
- return out.slice(0, out.l);
- }
-
- /* 2.5.178 LongRGBA */
- 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]; }
-
- /* 2.5.177 LongRGB */
- function parse_LongRGB(blob, length) { var x = parse_LongRGBA(blob, length); x[3] = 0; return x; }
-
-
- /* [MS-XLS] 2.5.19 */
- function parse_XLSCell(blob) {
- var rw = blob.read_shift(2); // 0-indexed
- var col = blob.read_shift(2);
- var ixfe = blob.read_shift(2);
- return ({r:rw, c:col, ixfe:ixfe});
- }
- function write_XLSCell(R, C, ixfe, o) {
- if(!o) o = new_buf(6);
- o.write_shift(2, R);
- o.write_shift(2, C);
- o.write_shift(2, ixfe||0);
- return o;
- }
-
- /* [MS-XLS] 2.5.134 */
- function parse_frtHeader(blob) {
- var rt = blob.read_shift(2);
- var flags = blob.read_shift(2); // TODO: parse these flags
- blob.l += 8;
- return {type: rt, flags: flags};
- }
-
-
-
- function parse_OptXLUnicodeString(blob, length, opts) { return length === 0 ? "" : parse_XLUnicodeString2(blob, length, opts); }
-
- /* [MS-XLS] 2.5.344 */
- function parse_XTI(blob, length, opts) {
- var w = opts.biff > 8 ? 4 : 2;
- var iSupBook = blob.read_shift(w), itabFirst = blob.read_shift(w,'i'), itabLast = blob.read_shift(w,'i');
- return [iSupBook, itabFirst, itabLast];
- }
-
- /* [MS-XLS] 2.5.218 */
- function parse_RkRec(blob) {
- var ixfe = blob.read_shift(2);
- var RK = parse_RkNumber(blob);
- return [ixfe, RK];
- }
-
- /* [MS-XLS] 2.5.1 */
- function parse_AddinUdf(blob, length, opts) {
- blob.l += 4; length -= 4;
- var l = blob.l + length;
- var udfName = parse_ShortXLUnicodeString(blob, length, opts);
- var cb = blob.read_shift(2);
- l -= blob.l;
- if(cb !== l) throw new Error("Malformed AddinUdf: padding = " + l + " != " + cb);
- blob.l += cb;
- return udfName;
- }
-
- /* [MS-XLS] 2.5.209 TODO: Check sizes */
- function parse_Ref8U(blob) {
- var rwFirst = blob.read_shift(2);
- var rwLast = blob.read_shift(2);
- var colFirst = blob.read_shift(2);
- var colLast = blob.read_shift(2);
- return {s:{c:colFirst, r:rwFirst}, e:{c:colLast,r:rwLast}};
- }
- function write_Ref8U(r, o) {
- if(!o) o = new_buf(8);
- o.write_shift(2, r.s.r);
- o.write_shift(2, r.e.r);
- o.write_shift(2, r.s.c);
- o.write_shift(2, r.e.c);
- return o;
- }
-
- /* [MS-XLS] 2.5.211 */
- function parse_RefU(blob) {
- var rwFirst = blob.read_shift(2);
- var rwLast = blob.read_shift(2);
- var colFirst = blob.read_shift(1);
- var colLast = blob.read_shift(1);
- return {s:{c:colFirst, r:rwFirst}, e:{c:colLast,r:rwLast}};
- }
-
- /* [MS-XLS] 2.5.207 */
- var parse_Ref = parse_RefU;
-
- /* [MS-XLS] 2.5.143 */
- function parse_FtCmo(blob) {
- blob.l += 4;
- var ot = blob.read_shift(2);
- var id = blob.read_shift(2);
- var flags = blob.read_shift(2);
- blob.l+=12;
- return [id, ot, flags];
- }
-
- /* [MS-XLS] 2.5.149 */
- function parse_FtNts(blob) {
- var out = {};
- blob.l += 4;
- blob.l += 16; // GUID TODO
- out.fSharedNote = blob.read_shift(2);
- blob.l += 4;
- return out;
- }
-
- /* [MS-XLS] 2.5.142 */
- function parse_FtCf(blob) {
- var out = {};
- blob.l += 4;
- blob.cf = blob.read_shift(2);
- return out;
- }
-
- /* [MS-XLS] 2.5.140 - 2.5.154 and friends */
- function parse_FtSkip(blob) { blob.l += 2; blob.l += blob.read_shift(2); }
- var FtTab = {
- 0x00: parse_FtSkip, /* FtEnd */
- 0x04: parse_FtSkip, /* FtMacro */
- 0x05: parse_FtSkip, /* FtButton */
- 0x06: parse_FtSkip, /* FtGmo */
- 0x07: parse_FtCf, /* FtCf */
- 0x08: parse_FtSkip, /* FtPioGrbit */
- 0x09: parse_FtSkip, /* FtPictFmla */
- 0x0A: parse_FtSkip, /* FtCbls */
- 0x0B: parse_FtSkip, /* FtRbo */
- 0x0C: parse_FtSkip, /* FtSbs */
- 0x0D: parse_FtNts, /* FtNts */
- 0x0E: parse_FtSkip, /* FtSbsFmla */
- 0x0F: parse_FtSkip, /* FtGboData */
- 0x10: parse_FtSkip, /* FtEdoData */
- 0x11: parse_FtSkip, /* FtRboData */
- 0x12: parse_FtSkip, /* FtCblsData */
- 0x13: parse_FtSkip, /* FtLbsData */
- 0x14: parse_FtSkip, /* FtCblsFmla */
- 0x15: parse_FtCmo
- };
- function parse_FtArray(blob, length) {
- var tgt = blob.l + length;
- var fts = [];
- while(blob.l < tgt) {
- var ft = blob.read_shift(2);
- blob.l-=2;
- try {
- fts.push(FtTab[ft](blob, tgt - blob.l));
- } catch(e) { blob.l = tgt; return fts; }
- }
- if(blob.l != tgt) blob.l = tgt; //throw new Error("bad Object Ft-sequence");
- return fts;
- }
-
- /* --- 2.4 Records --- */
-
- /* [MS-XLS] 2.4.21 */
- function parse_BOF(blob, length) {
- var o = {BIFFVer:0, dt:0};
- o.BIFFVer = blob.read_shift(2); length -= 2;
- if(length >= 2) { o.dt = blob.read_shift(2); blob.l -= 2; }
- switch(o.BIFFVer) {
- case 0x0600: /* BIFF8 */
- case 0x0500: /* BIFF5 */
- case 0x0400: /* BIFF4 */
- case 0x0300: /* BIFF3 */
- case 0x0200: /* BIFF2 */
- case 0x0002: case 0x0007: /* BIFF2 */
- break;
- default: if(length > 6) throw new Error("Unexpected BIFF Ver " + o.BIFFVer);
- }
-
- blob.read_shift(length);
- return o;
- }
- function write_BOF(wb, t, o) {
- var h = 0x0600, w = 16;
- switch(o.bookType) {
- case 'biff8': break;
- case 'biff5': h = 0x0500; w = 8; break;
- case 'biff4': h = 0x0004; w = 6; break;
- case 'biff3': h = 0x0003; w = 6; break;
- case 'biff2': h = 0x0002; w = 4; break;
- case 'xla': break;
- default: throw new Error("unsupported BIFF version");
- }
- var out = new_buf(w);
- out.write_shift(2, h);
- out.write_shift(2, t);
- if(w > 4) out.write_shift(2, 0x7262);
- if(w > 6) out.write_shift(2, 0x07CD);
- if(w > 8) {
- out.write_shift(2, 0xC009);
- out.write_shift(2, 0x0001);
- out.write_shift(2, 0x0706);
- out.write_shift(2, 0x0000);
- }
- return out;
- }
-
-
- /* [MS-XLS] 2.4.146 */
- function parse_InterfaceHdr(blob, length) {
- if(length === 0) return 0x04b0;
- if((blob.read_shift(2))!==0x04b0){/* empty */}
- return 0x04b0;
- }
-
-
- /* [MS-XLS] 2.4.349 */
- function parse_WriteAccess(blob, length, opts) {
- if(opts.enc) { blob.l += length; return ""; }
- var l = blob.l;
- // TODO: make sure XLUnicodeString doesnt overrun
- var UserName = parse_XLUnicodeString2(blob, 0, opts);
- blob.read_shift(length + l - blob.l);
- return UserName;
- }
- function write_WriteAccess(s, opts) {
- var b8 = !opts || opts.biff == 8;
- var o = new_buf(b8 ? 112 : 54);
- o.write_shift(opts.biff == 8 ? 2 : 1, 7);
- if(b8) o.write_shift(1, 0);
- o.write_shift(4, 0x33336853);
- o.write_shift(4, (0x00534A74 | (b8 ? 0 : 0x20000000)));
- while(o.l < o.length) o.write_shift(1, (b8 ? 0 : 32));
- return o;
- }
-
- /* [MS-XLS] 2.4.351 */
- function parse_WsBool(blob, length, opts) {
- var flags = opts && opts.biff == 8 || length == 2 ? blob.read_shift(2) : (blob.l += length, 0);
- return { fDialog: flags & 0x10 };
- }
-
- /* [MS-XLS] 2.4.28 */
- function parse_BoundSheet8(blob, length, opts) {
- var pos = blob.read_shift(4);
- var hidden = blob.read_shift(1) & 0x03;
- var dt = blob.read_shift(1);
- switch(dt) {
- case 0: dt = 'Worksheet'; break;
- case 1: dt = 'Macrosheet'; break;
- case 2: dt = 'Chartsheet'; break;
- case 6: dt = 'VBAModule'; break;
- }
- var name = parse_ShortXLUnicodeString(blob, 0, opts);
- if(name.length === 0) name = "Sheet1";
- return { pos:pos, hs:hidden, dt:dt, name:name };
- }
- function write_BoundSheet8(data, opts) {
- var w = (!opts || opts.biff >= 8 ? 2 : 1);
- var o = new_buf(8 + w * data.name.length);
- o.write_shift(4, data.pos);
- o.write_shift(1, data.hs || 0);
- o.write_shift(1, data.dt);
- o.write_shift(1, data.name.length);
- if(opts.biff >= 8) o.write_shift(1, 1);
- o.write_shift(w * data.name.length, data.name, opts.biff < 8 ? 'sbcs' : 'utf16le');
- var out = o.slice(0, o.l);
- out.l = o.l; return out;
- }
-
- /* [MS-XLS] 2.4.265 TODO */
- function parse_SST(blob, length) {
- var end = blob.l + length;
- var cnt = blob.read_shift(4);
- var ucnt = blob.read_shift(4);
- var strs = ([]);
- for(var i = 0; i != ucnt && blob.l < end; ++i) {
- strs.push(parse_XLUnicodeRichExtendedString(blob));
- }
- strs.Count = cnt; strs.Unique = ucnt;
- return strs;
- }
- function write_SST(sst, opts) {
- var header = new_buf(8);
- header.write_shift(4, sst.Count);
- header.write_shift(4, sst.Unique);
- var strs = [];
- for(var j = 0; j < sst.length; ++j) strs[j] = write_XLUnicodeRichExtendedString(sst[j], opts);
- var o = bconcat([header].concat(strs));
- o.parts = [header.length].concat(strs.map(function(str) { return str.length; }));
- return o;
- }
-
- /* [MS-XLS] 2.4.107 */
- function parse_ExtSST(blob, length) {
- var extsst = {};
- extsst.dsst = blob.read_shift(2);
- blob.l += length-2;
- return extsst;
- }
-
-
- /* [MS-XLS] 2.4.221 TODO: check BIFF2-4 */
- function parse_Row(blob) {
- var z = ({});
- z.r = blob.read_shift(2);
- z.c = blob.read_shift(2);
- z.cnt = blob.read_shift(2) - z.c;
- var miyRw = blob.read_shift(2);
- blob.l += 4; // reserved(2), unused(2)
- var flags = blob.read_shift(1); // various flags
- blob.l += 3; // reserved(8), ixfe(12), flags(4)
- if(flags & 0x07) z.level = flags & 0x07;
- // collapsed: flags & 0x10
- if(flags & 0x20) z.hidden = true;
- if(flags & 0x40) z.hpt = miyRw / 20;
- return z;
- }
-
-
- /* [MS-XLS] 2.4.125 */
- function parse_ForceFullCalculation(blob) {
- var header = parse_frtHeader(blob);
- if(header.type != 0x08A3) throw new Error("Invalid Future Record " + header.type);
- var fullcalc = blob.read_shift(4);
- return fullcalc !== 0x0;
- }
-
-
-
-
-
- /* [MS-XLS] 2.4.215 rt */
- function parse_RecalcId(blob) {
- blob.read_shift(2);
- return blob.read_shift(4);
- }
-
- /* [MS-XLS] 2.4.87 */
- function parse_DefaultRowHeight(blob, length, opts) {
- var f = 0;
- if(!(opts && opts.biff == 2)) {
- f = blob.read_shift(2);
- }
- var miyRw = blob.read_shift(2);
- if((opts && opts.biff == 2)) {
- f = 1 - (miyRw >> 15); miyRw &= 0x7fff;
- }
- var fl = {Unsynced:f&1,DyZero:(f&2)>>1,ExAsc:(f&4)>>2,ExDsc:(f&8)>>3};
- return [fl, miyRw];
- }
-
- /* [MS-XLS] 2.4.345 TODO */
- function parse_Window1(blob) {
- var xWn = blob.read_shift(2), yWn = blob.read_shift(2), dxWn = blob.read_shift(2), dyWn = blob.read_shift(2);
- var flags = blob.read_shift(2), iTabCur = blob.read_shift(2), iTabFirst = blob.read_shift(2);
- var ctabSel = blob.read_shift(2), wTabRatio = blob.read_shift(2);
- return { Pos: [xWn, yWn], Dim: [dxWn, dyWn], Flags: flags, CurTab: iTabCur,
- FirstTab: iTabFirst, Selected: ctabSel, TabRatio: wTabRatio };
- }
- function write_Window1() {
- var o = new_buf(18);
- o.write_shift(2, 0);
- o.write_shift(2, 0);
- o.write_shift(2, 0x7260);
- o.write_shift(2, 0x44c0);
- o.write_shift(2, 0x38);
- o.write_shift(2, 0);
- o.write_shift(2, 0);
- o.write_shift(2, 1);
- o.write_shift(2, 0x01f4);
- return o;
- }
- /* [MS-XLS] 2.4.346 TODO */
- function parse_Window2(blob, length, opts) {
- if(opts && opts.biff >= 2 && opts.biff < 5) return {};
- var f = blob.read_shift(2);
- return { RTL: f & 0x40 };
- }
- function write_Window2(view) {
- var o = new_buf(18), f = 0x6b6;
- if(view && view.RTL) f |= 0x40;
- o.write_shift(2, f);
- o.write_shift(4, 0);
- o.write_shift(4, 64);
- o.write_shift(4, 0);
- o.write_shift(4, 0);
- return o;
- }
-
- /* [MS-XLS] 2.4.189 TODO */
- function parse_Pane(/*blob, length, opts*/) {
- }
-
- /* [MS-XLS] 2.4.122 TODO */
- function parse_Font(blob, length, opts) {
- var o = {
- dyHeight: blob.read_shift(2),
- fl: blob.read_shift(2)
- };
- switch((opts && opts.biff) || 8) {
- case 2: break;
- case 3: case 4: blob.l += 2; break;
- default: blob.l += 10; break;
- }
- o.name = parse_ShortXLUnicodeString(blob, 0, opts);
- return o;
- }
- function write_Font(data, opts) {
- var name = data.name || "Arial";
- var b5 = (opts && (opts.biff == 5)), w = (b5 ? (15 + name.length) : (16 + 2 * name.length));
- var o = new_buf(w);
- o.write_shift(2, (data.sz || 12) * 20);
- o.write_shift(4, 0);
- o.write_shift(2, 400);
- o.write_shift(4, 0);
- o.write_shift(2, 0);
- o.write_shift(1, name.length);
- if(!b5) o.write_shift(1, 1);
- o.write_shift((b5 ? 1 : 2) * name.length, name, (b5 ? "sbcs" : "utf16le"));
- return o;
- }
-
- /* [MS-XLS] 2.4.149 */
- function parse_LabelSst(blob) {
- var cell = parse_XLSCell(blob);
- cell.isst = blob.read_shift(4);
- return cell;
- }
- function write_LabelSst(R, C, v, os ) {
- var o = new_buf(10);
- write_XLSCell(R, C, os, o);
- o.write_shift(4, v);
- return o;
- }
-
- /* [MS-XLS] 2.4.148 */
- function parse_Label(blob, length, opts) {
- var target = blob.l + length;
- var cell = parse_XLSCell(blob, 6);
- if(opts.biff == 2) blob.l++;
- var str = parse_XLUnicodeString(blob, target - blob.l, opts);
- cell.val = str;
- return cell;
- }
- function write_Label(R, C, v, os, opts) {
- var b8 = !opts || opts.biff == 8;
- var o = new_buf(6 + 2 + (+b8) + (1 + b8) * v.length);
- write_XLSCell(R, C, os, o);
- o.write_shift(2, v.length);
- if(b8) o.write_shift(1, 1);
- o.write_shift((1 + b8) * v.length, v, b8 ? 'utf16le' : 'sbcs');
- return o;
- }
-
-
- /* [MS-XLS] 2.4.126 Number Formats */
- function parse_Format(blob, length, opts) {
- var numFmtId = blob.read_shift(2);
- var fmtstr = parse_XLUnicodeString2(blob, 0, opts);
- return [numFmtId, fmtstr];
- }
- function write_Format(i, f, opts, o) {
- var b5 = (opts && (opts.biff == 5));
- if(!o) o = new_buf(b5 ? (3 + f.length) : (5 + 2 * f.length));
- o.write_shift(2, i);
- o.write_shift((b5 ? 1 : 2), f.length);
- if(!b5) o.write_shift(1, 1);
- o.write_shift((b5 ? 1 : 2) * f.length, f, (b5 ? 'sbcs' : 'utf16le'));
- var out = (o.length > o.l) ? o.slice(0, o.l) : o;
- if(out.l == null) out.l = out.length;
- return out;
- }
- var parse_BIFF2Format = parse_XLUnicodeString2;
-
- /* [MS-XLS] 2.4.90 */
- function parse_Dimensions(blob, length, opts) {
- var end = blob.l + length;
- var w = opts.biff == 8 || !opts.biff ? 4 : 2;
- var r = blob.read_shift(w), R = blob.read_shift(w);
- var c = blob.read_shift(2), C = blob.read_shift(2);
- blob.l = end;
- return {s: {r:r, c:c}, e: {r:R, c:C}};
- }
- function write_Dimensions(range, opts) {
- var w = opts.biff == 8 || !opts.biff ? 4 : 2;
- var o = new_buf(2*w + 6);
- o.write_shift(w, range.s.r);
- o.write_shift(w, range.e.r + 1);
- o.write_shift(2, range.s.c);
- o.write_shift(2, range.e.c + 1);
- o.write_shift(2, 0);
- return o;
- }
-
- /* [MS-XLS] 2.4.220 */
- function parse_RK(blob) {
- var rw = blob.read_shift(2), col = blob.read_shift(2);
- var rkrec = parse_RkRec(blob);
- return {r:rw, c:col, ixfe:rkrec[0], rknum:rkrec[1]};
- }
-
- /* [MS-XLS] 2.4.175 */
- function parse_MulRk(blob, length) {
- var target = blob.l + length - 2;
- var rw = blob.read_shift(2), col = blob.read_shift(2);
- var rkrecs = [];
- while(blob.l < target) rkrecs.push(parse_RkRec(blob));
- if(blob.l !== target) throw new Error("MulRK read error");
- var lastcol = blob.read_shift(2);
- if(rkrecs.length != lastcol - col + 1) throw new Error("MulRK length mismatch");
- return {r:rw, c:col, C:lastcol, rkrec:rkrecs};
- }
- /* [MS-XLS] 2.4.174 */
- function parse_MulBlank(blob, length) {
- var target = blob.l + length - 2;
- var rw = blob.read_shift(2), col = blob.read_shift(2);
- var ixfes = [];
- while(blob.l < target) ixfes.push(blob.read_shift(2));
- if(blob.l !== target) throw new Error("MulBlank read error");
- var lastcol = blob.read_shift(2);
- if(ixfes.length != lastcol - col + 1) throw new Error("MulBlank length mismatch");
- return {r:rw, c:col, C:lastcol, ixfe:ixfes};
- }
-
- /* [MS-XLS] 2.5.20 2.5.249 TODO: interpret values here */
- function parse_CellStyleXF(blob, length, style, opts) {
- var o = {};
- var a = blob.read_shift(4), b = blob.read_shift(4);
- var c = blob.read_shift(4), d = blob.read_shift(2);
- o.patternType = XLSFillPattern[c >> 26];
-
- if(!opts.cellStyles) return o;
- o.alc = a & 0x07;
- o.fWrap = (a >> 3) & 0x01;
- o.alcV = (a >> 4) & 0x07;
- o.fJustLast = (a >> 7) & 0x01;
- o.trot = (a >> 8) & 0xFF;
- o.cIndent = (a >> 16) & 0x0F;
- o.fShrinkToFit = (a >> 20) & 0x01;
- o.iReadOrder = (a >> 22) & 0x02;
- o.fAtrNum = (a >> 26) & 0x01;
- o.fAtrFnt = (a >> 27) & 0x01;
- o.fAtrAlc = (a >> 28) & 0x01;
- o.fAtrBdr = (a >> 29) & 0x01;
- o.fAtrPat = (a >> 30) & 0x01;
- o.fAtrProt = (a >> 31) & 0x01;
-
- o.dgLeft = b & 0x0F;
- o.dgRight = (b >> 4) & 0x0F;
- o.dgTop = (b >> 8) & 0x0F;
- o.dgBottom = (b >> 12) & 0x0F;
- o.icvLeft = (b >> 16) & 0x7F;
- o.icvRight = (b >> 23) & 0x7F;
- o.grbitDiag = (b >> 30) & 0x03;
-
- o.icvTop = c & 0x7F;
- o.icvBottom = (c >> 7) & 0x7F;
- o.icvDiag = (c >> 14) & 0x7F;
- o.dgDiag = (c >> 21) & 0x0F;
-
- o.icvFore = d & 0x7F;
- o.icvBack = (d >> 7) & 0x7F;
- o.fsxButton = (d >> 14) & 0x01;
- return o;
- }
- //function parse_CellXF(blob, length, opts) {return parse_CellStyleXF(blob,length,0, opts);}
- //function parse_StyleXF(blob, length, opts) {return parse_CellStyleXF(blob,length,1, opts);}
-
- /* [MS-XLS] 2.4.353 TODO: actually do this right */
- function parse_XF(blob, length, opts) {
- var o = {};
- o.ifnt = blob.read_shift(2); o.numFmtId = blob.read_shift(2); o.flags = blob.read_shift(2);
- o.fStyle = (o.flags >> 2) & 0x01;
- length -= 6;
- o.data = parse_CellStyleXF(blob, length, o.fStyle, opts);
- return o;
- }
- function write_XF(data, ixfeP, opts, o) {
- var b5 = (opts && (opts.biff == 5));
- if(!o) o = new_buf(b5 ? 16 : 20);
- o.write_shift(2, 0);
- if(data.style) {
- o.write_shift(2, (data.numFmtId||0));
- o.write_shift(2, 0xFFF4);
- } else {
- o.write_shift(2, (data.numFmtId||0));
- o.write_shift(2, (ixfeP<<4));
- }
- o.write_shift(4, 0);
- o.write_shift(4, 0);
- if(!b5) o.write_shift(4, 0);
- o.write_shift(2, 0);
- return o;
- }
-
- /* [MS-XLS] 2.4.134 */
- function parse_Guts(blob) {
- blob.l += 4;
- var out = [blob.read_shift(2), blob.read_shift(2)];
- if(out[0] !== 0) out[0]--;
- if(out[1] !== 0) out[1]--;
- if(out[0] > 7 || out[1] > 7) throw new Error("Bad Gutters: " + out.join("|"));
- return out;
- }
- function write_Guts(guts) {
- var o = new_buf(8);
- o.write_shift(4, 0);
- o.write_shift(2, guts[0] ? guts[0] + 1 : 0);
- o.write_shift(2, guts[1] ? guts[1] + 1 : 0);
- return o;
- }
-
- /* [MS-XLS] 2.4.24 */
- function parse_BoolErr(blob, length, opts) {
- var cell = parse_XLSCell(blob, 6);
- if(opts.biff == 2) ++blob.l;
- var val = parse_Bes(blob, 2);
- cell.val = val;
- cell.t = (val === true || val === false) ? 'b' : 'e';
- return cell;
- }
- function write_BoolErr(R, C, v, os, opts, t) {
- var o = new_buf(8);
- write_XLSCell(R, C, os, o);
- write_Bes(v, t, o);
- return o;
- }
-
- /* [MS-XLS] 2.4.180 Number */
- function parse_Number(blob) {
- var cell = parse_XLSCell(blob, 6);
- var xnum = parse_Xnum(blob, 8);
- cell.val = xnum;
- return cell;
- }
- function write_Number(R, C, v, os) {
- var o = new_buf(14);
- write_XLSCell(R, C, os, o);
- write_Xnum(v, o);
- return o;
- }
-
- var parse_XLHeaderFooter = parse_OptXLUnicodeString; // TODO: parse 2.4.136
-
- /* [MS-XLS] 2.4.271 */
- function parse_SupBook(blob, length, opts) {
- var end = blob.l + length;
- var ctab = blob.read_shift(2);
- var cch = blob.read_shift(2);
- opts.sbcch = cch;
- if(cch == 0x0401 || cch == 0x3A01) return [cch, ctab];
- if(cch < 0x01 || cch >0xff) throw new Error("Unexpected SupBook type: "+cch);
- var virtPath = parse_XLUnicodeStringNoCch(blob, cch);
- /* TODO: 2.5.277 Virtual Path */
- var rgst = [];
- while(end > blob.l) rgst.push(parse_XLUnicodeString(blob));
- return [cch, ctab, virtPath, rgst];
- }
-
- /* [MS-XLS] 2.4.105 TODO */
- function parse_ExternName(blob, length, opts) {
- var flags = blob.read_shift(2);
- var body;
- var o = ({
- fBuiltIn: flags & 0x01,
- fWantAdvise: (flags >>> 1) & 0x01,
- fWantPict: (flags >>> 2) & 0x01,
- fOle: (flags >>> 3) & 0x01,
- fOleLink: (flags >>> 4) & 0x01,
- cf: (flags >>> 5) & 0x3FF,
- fIcon: flags >>> 15 & 0x01
- });
- if(opts.sbcch === 0x3A01) body = parse_AddinUdf(blob, length-2, opts);
- //else throw new Error("unsupported SupBook cch: " + opts.sbcch);
- o.body = body || blob.read_shift(length-2);
- if(typeof body === "string") o.Name = body;
- return o;
- }
-
- /* [MS-XLS] 2.4.150 TODO */
- var XLSLblBuiltIn = [
- "_xlnm.Consolidate_Area",
- "_xlnm.Auto_Open",
- "_xlnm.Auto_Close",
- "_xlnm.Extract",
- "_xlnm.Database",
- "_xlnm.Criteria",
- "_xlnm.Print_Area",
- "_xlnm.Print_Titles",
- "_xlnm.Recorder",
- "_xlnm.Data_Form",
- "_xlnm.Auto_Activate",
- "_xlnm.Auto_Deactivate",
- "_xlnm.Sheet_Title",
- "_xlnm._FilterDatabase"
- ];
- function parse_Lbl(blob, length, opts) {
- var target = blob.l + length;
- var flags = blob.read_shift(2);
- var chKey = blob.read_shift(1);
- var cch = blob.read_shift(1);
- var cce = blob.read_shift(opts && opts.biff == 2 ? 1 : 2);
- var itab = 0;
- if(!opts || opts.biff >= 5) {
- if(opts.biff != 5) blob.l += 2;
- itab = blob.read_shift(2);
- if(opts.biff == 5) blob.l += 2;
- blob.l += 4;
- }
- var name = parse_XLUnicodeStringNoCch(blob, cch, opts);
- if(flags & 0x20) name = XLSLblBuiltIn[name.charCodeAt(0)];
- var npflen = target - blob.l; if(opts && opts.biff == 2) --npflen;
- var rgce = (target == blob.l || cce === 0 || !(npflen > 0)) ? [] : parse_NameParsedFormula(blob, npflen, opts, cce);
- return {
- chKey: chKey,
- Name: name,
- itab: itab,
- rgce: rgce
- };
- }
-
- /* [MS-XLS] 2.4.106 TODO: verify filename encoding */
- function parse_ExternSheet(blob, length, opts) {
- if(opts.biff < 8) return parse_BIFF5ExternSheet(blob, length, opts);
- var o = [], target = blob.l + length, len = blob.read_shift(opts.biff > 8 ? 4 : 2);
- while(len-- !== 0) o.push(parse_XTI(blob, opts.biff > 8 ? 12 : 6, opts));
- // [iSupBook, itabFirst, itabLast];
- if(blob.l != target) throw new Error("Bad ExternSheet: " + blob.l + " != " + target);
- return o;
- }
- function parse_BIFF5ExternSheet(blob, length, opts) {
- if(blob[blob.l + 1] == 0x03) blob[blob.l]++;
- var o = parse_ShortXLUnicodeString(blob, length, opts);
- return o.charCodeAt(0) == 0x03 ? o.slice(1) : o;
- }
-
- /* [MS-XLS] 2.4.176 TODO: check older biff */
- function parse_NameCmt(blob, length, opts) {
- if(opts.biff < 8) { blob.l += length; return; }
- var cchName = blob.read_shift(2);
- var cchComment = blob.read_shift(2);
- var name = parse_XLUnicodeStringNoCch(blob, cchName, opts);
- var comment = parse_XLUnicodeStringNoCch(blob, cchComment, opts);
- return [name, comment];
- }
-
- /* [MS-XLS] 2.4.260 */
- function parse_ShrFmla(blob, length, opts) {
- var ref = parse_RefU(blob, 6);
- blob.l++;
- var cUse = blob.read_shift(1);
- length -= 8;
- return [parse_SharedParsedFormula(blob, length, opts), cUse, ref];
- }
-
- /* [MS-XLS] 2.4.4 TODO */
- function parse_Array(blob, length, opts) {
- var ref = parse_Ref(blob, 6);
- /* TODO: fAlwaysCalc */
- switch(opts.biff) {
- case 2: blob.l ++; length -= 7; break;
- case 3: case 4: blob.l += 2; length -= 8; break;
- default: blob.l += 6; length -= 12;
- }
- return [ref, parse_ArrayParsedFormula(blob, length, opts, ref)];
- }
-
- /* [MS-XLS] 2.4.173 */
- function parse_MTRSettings(blob) {
- var fMTREnabled = blob.read_shift(4) !== 0x00;
- var fUserSetThreadCount = blob.read_shift(4) !== 0x00;
- var cUserThreadCount = blob.read_shift(4);
- return [fMTREnabled, fUserSetThreadCount, cUserThreadCount];
- }
-
- /* [MS-XLS] 2.5.186 TODO: BIFF5 */
- function parse_NoteSh(blob, length, opts) {
- if(opts.biff < 8) return;
- var row = blob.read_shift(2), col = blob.read_shift(2);
- var flags = blob.read_shift(2), idObj = blob.read_shift(2);
- var stAuthor = parse_XLUnicodeString2(blob, 0, opts);
- if(opts.biff < 8) blob.read_shift(1);
- return [{r:row,c:col}, stAuthor, idObj, flags];
- }
-
- /* [MS-XLS] 2.4.179 */
- function parse_Note(blob, length, opts) {
- /* TODO: Support revisions */
- return parse_NoteSh(blob, length, opts);
- }
-
- /* [MS-XLS] 2.4.168 */
- function parse_MergeCells(blob, length) {
- var merges = [];
- var cmcs = blob.read_shift(2);
- while (cmcs--) merges.push(parse_Ref8U(blob,length));
- return merges;
- }
- function write_MergeCells(merges) {
- var o = new_buf(2 + merges.length * 8);
- o.write_shift(2, merges.length);
- for(var i = 0; i < merges.length; ++i) write_Ref8U(merges[i], o);
- return o;
- }
-
- /* [MS-XLS] 2.4.181 TODO: parse all the things! */
- function parse_Obj(blob, length, opts) {
- if(opts && opts.biff < 8) return parse_BIFF5Obj(blob, length, opts);
- var cmo = parse_FtCmo(blob, 22); // id, ot, flags
- var fts = parse_FtArray(blob, length-22, cmo[1]);
- return { cmo: cmo, ft:fts };
- }
- /* from older spec */
- var parse_BIFF5OT = [];
- parse_BIFF5OT[0x08] = function(blob, length) {
- var tgt = blob.l + length;
- blob.l += 10; // todo
- var cf = blob.read_shift(2);
- blob.l += 4;
- blob.l += 2; //var cbPictFmla = blob.read_shift(2);
- blob.l += 2;
- blob.l += 2; //var grbit = blob.read_shift(2);
- blob.l += 4;
- var cchName = blob.read_shift(1);
- blob.l += cchName; // TODO: stName
- blob.l = tgt; // TODO: fmla
- return { fmt:cf };
- };
-
- function parse_BIFF5Obj(blob, length, opts) {
- blob.l += 4; //var cnt = blob.read_shift(4);
- var ot = blob.read_shift(2);
- var id = blob.read_shift(2);
- var grbit = blob.read_shift(2);
- blob.l += 2; //var colL = blob.read_shift(2);
- blob.l += 2; //var dxL = blob.read_shift(2);
- blob.l += 2; //var rwT = blob.read_shift(2);
- blob.l += 2; //var dyT = blob.read_shift(2);
- blob.l += 2; //var colR = blob.read_shift(2);
- blob.l += 2; //var dxR = blob.read_shift(2);
- blob.l += 2; //var rwB = blob.read_shift(2);
- blob.l += 2; //var dyB = blob.read_shift(2);
- blob.l += 2; //var cbMacro = blob.read_shift(2);
- blob.l += 6;
- length -= 36;
- var fts = [];
- fts.push((parse_BIFF5OT[ot]||parsenoop)(blob, length, opts));
- return { cmo: [id, ot, grbit], ft:fts };
- }
-
- /* [MS-XLS] 2.4.329 TODO: parse properly */
- function parse_TxO(blob, length, opts) {
- var s = blob.l;
- var texts = "";
- try {
- blob.l += 4;
- var ot = (opts.lastobj||{cmo:[0,0]}).cmo[1];
- var controlInfo; // eslint-disable-line no-unused-vars
- if([0,5,7,11,12,14].indexOf(ot) == -1) blob.l += 6;
- else controlInfo = parse_ControlInfo(blob, 6, opts);
- var cchText = blob.read_shift(2);
- /*var cbRuns = */blob.read_shift(2);
- /*var ifntEmpty = */parseuint16(blob, 2);
- var len = blob.read_shift(2);
- blob.l += len;
- //var fmla = parse_ObjFmla(blob, s + length - blob.l);
-
- for(var i = 1; i < blob.lens.length-1; ++i) {
- if(blob.l-s != blob.lens[i]) throw new Error("TxO: bad continue record");
- var hdr = blob[blob.l];
- var t = parse_XLUnicodeStringNoCch(blob, blob.lens[i+1]-blob.lens[i]-1);
- texts += t;
- if(texts.length >= (hdr ? cchText : 2*cchText)) break;
- }
- if(texts.length !== cchText && texts.length !== cchText*2) {
- throw new Error("cchText: " + cchText + " != " + texts.length);
- }
-
- blob.l = s + length;
- /* [MS-XLS] 2.5.272 TxORuns */
- // var rgTxoRuns = [];
- // for(var j = 0; j != cbRuns/8-1; ++j) blob.l += 8;
- // var cchText2 = blob.read_shift(2);
- // if(cchText2 !== cchText) throw new Error("TxOLastRun mismatch: " + cchText2 + " " + cchText);
- // blob.l += 6;
- // if(s + length != blob.l) throw new Error("TxO " + (s + length) + ", at " + blob.l);
- return { t: texts };
- } catch(e) { blob.l = s + length; return { t: texts }; }
- }
-
- /* [MS-XLS] 2.4.140 */
- function parse_HLink(blob, length) {
- var ref = parse_Ref8U(blob, 8);
- blob.l += 16; /* CLSID */
- var hlink = parse_Hyperlink(blob, length-24);
- return [ref, hlink];
- }
- function write_HLink(hl) {
- var O = new_buf(24);
- var ref = decode_cell(hl[0]);
- O.write_shift(2, ref.r); O.write_shift(2, ref.r);
- O.write_shift(2, ref.c); O.write_shift(2, ref.c);
- var clsid = "d0 c9 ea 79 f9 ba ce 11 8c 82 00 aa 00 4b a9 0b".split(" ");
- for(var i = 0; i < 16; ++i) O.write_shift(1, parseInt(clsid[i], 16));
- return bconcat([O, write_Hyperlink(hl[1])]);
- }
-
-
- /* [MS-XLS] 2.4.141 */
- function parse_HLinkTooltip(blob, length) {
- blob.read_shift(2);
- var ref = parse_Ref8U(blob, 8);
- var wzTooltip = blob.read_shift((length-10)/2, 'dbcs-cont');
- wzTooltip = wzTooltip.replace(chr0,"");
- return [ref, wzTooltip];
- }
- function write_HLinkTooltip(hl) {
- var TT = hl[1].Tooltip;
- var O = new_buf(10 + 2 * (TT.length + 1));
- O.write_shift(2, 0x0800);
- var ref = decode_cell(hl[0]);
- O.write_shift(2, ref.r); O.write_shift(2, ref.r);
- O.write_shift(2, ref.c); O.write_shift(2, ref.c);
- for(var i = 0; i < TT.length; ++i) O.write_shift(2, TT.charCodeAt(i));
- O.write_shift(2, 0);
- return O;
- }
-
- /* [MS-XLS] 2.4.63 */
- function parse_Country(blob) {
- var o = [0,0], d;
- d = blob.read_shift(2); o[0] = CountryEnum[d] || d;
- d = blob.read_shift(2); o[1] = CountryEnum[d] || d;
- return o;
- }
- function write_Country(o) {
- if(!o) o = new_buf(4);
- o.write_shift(2, 0x01);
- o.write_shift(2, 0x01);
- return o;
- }
-
- /* [MS-XLS] 2.4.50 ClrtClient */
- function parse_ClrtClient(blob) {
- var ccv = blob.read_shift(2);
- var o = [];
- while(ccv-->0) o.push(parse_LongRGB(blob, 8));
- return o;
- }
-
- /* [MS-XLS] 2.4.188 */
- function parse_Palette(blob) {
- var ccv = blob.read_shift(2);
- var o = [];
- while(ccv-->0) o.push(parse_LongRGB(blob, 8));
- return o;
- }
-
- /* [MS-XLS] 2.4.354 */
- function parse_XFCRC(blob) {
- blob.l += 2;
- var o = {cxfs:0, crc:0};
- o.cxfs = blob.read_shift(2);
- o.crc = blob.read_shift(4);
- return o;
- }
-
- /* [MS-XLS] 2.4.53 TODO: parse flags */
- /* [MS-XLSB] 2.4.323 TODO: parse flags */
- function parse_ColInfo(blob, length, opts) {
- if(!opts.cellStyles) return parsenoop(blob, length);
- var w = opts && opts.biff >= 12 ? 4 : 2;
- var colFirst = blob.read_shift(w);
- var colLast = blob.read_shift(w);
- var coldx = blob.read_shift(w);
- var ixfe = blob.read_shift(w);
- var flags = blob.read_shift(2);
- if(w == 2) blob.l += 2;
- var o = ({s:colFirst, e:colLast, w:coldx, ixfe:ixfe, flags:flags});
- if(opts.biff >= 5 || !opts.biff) o.level = (flags >> 8) & 0x7;
- return o;
- }
-
- /* [MS-XLS] 2.4.257 */
- function parse_Setup(blob, length) {
- var o = {};
- if(length < 32) return o;
- blob.l += 16;
- o.header = parse_Xnum(blob, 8);
- o.footer = parse_Xnum(blob, 8);
- blob.l += 2;
- return o;
- }
-
- /* [MS-XLS] 2.4.261 */
- function parse_ShtProps(blob, length, opts) {
- var def = {area:false};
- if(opts.biff != 5) { blob.l += length; return def; }
- var d = blob.read_shift(1); blob.l += 3;
- if((d & 0x10)) def.area = true;
- return def;
- }
-
- /* [MS-XLS] 2.4.241 */
- function write_RRTabId(n) {
- var out = new_buf(2 * n);
- for(var i = 0; i < n; ++i) out.write_shift(2, i+1);
- return out;
- }
-
- var parse_Blank = parse_XLSCell; /* [MS-XLS] 2.4.20 Just the cell */
- var parse_Scl = parseuint16a; /* [MS-XLS] 2.4.247 num, den */
- var parse_String = parse_XLUnicodeString; /* [MS-XLS] 2.4.268 */
-
- /* --- Specific to versions before BIFF8 --- */
- function parse_ImData(blob) {
- var cf = blob.read_shift(2);
- var env = blob.read_shift(2);
- var lcb = blob.read_shift(4);
- var o = {fmt:cf, env:env, len:lcb, data:blob.slice(blob.l,blob.l+lcb)};
- blob.l += lcb;
- return o;
- }
-
- /* BIFF2_??? where ??? is the name from [XLS] */
- function parse_BIFF2STR(blob, length, opts) {
- var cell = parse_XLSCell(blob, 6);
- ++blob.l;
- var str = parse_XLUnicodeString2(blob, length-7, opts);
- cell.t = 'str';
- cell.val = str;
- return cell;
- }
-
- function parse_BIFF2NUM(blob) {
- var cell = parse_XLSCell(blob, 6);
- ++blob.l;
- var num = parse_Xnum(blob, 8);
- cell.t = 'n';
- cell.val = num;
- return cell;
- }
- function write_BIFF2NUM(r, c, val) {
- var out = new_buf(15);
- write_BIFF2Cell(out, r, c);
- out.write_shift(8, val, 'f');
- return out;
- }
-
- function parse_BIFF2INT(blob) {
- var cell = parse_XLSCell(blob, 6);
- ++blob.l;
- var num = blob.read_shift(2);
- cell.t = 'n';
- cell.val = num;
- return cell;
- }
- function write_BIFF2INT(r, c, val) {
- var out = new_buf(9);
- write_BIFF2Cell(out, r, c);
- out.write_shift(2, val);
- return out;
- }
-
- function parse_BIFF2STRING(blob) {
- var cch = blob.read_shift(1);
- if(cch === 0) { blob.l++; return ""; }
- return blob.read_shift(cch, 'sbcs-cont');
- }
-
- /* TODO: convert to BIFF8 font struct */
- function parse_BIFF2FONTXTRA(blob, length) {
- blob.l += 6; // unknown
- blob.l += 2; // font weight "bls"
- blob.l += 1; // charset
- blob.l += 3; // unknown
- blob.l += 1; // font family
- blob.l += length - 13;
- }
-
- /* TODO: parse rich text runs */
- function parse_RString(blob, length, opts) {
- var end = blob.l + length;
- var cell = parse_XLSCell(blob, 6);
- var cch = blob.read_shift(2);
- var str = parse_XLUnicodeStringNoCch(blob, cch, opts);
- blob.l = end;
- cell.t = 'str';
- cell.val = str;
- return cell;
- }
- /* from js-harb (C) 2014-present SheetJS */
- var DBF = (function() {
- var dbf_codepage_map = {
- /* Code Pages Supported by Visual FoxPro */
- 0x01: 437, 0x02: 850,
- 0x03: 1252, 0x04: 10000,
- 0x64: 852, 0x65: 866,
- 0x66: 865, 0x67: 861,
- 0x68: 895, 0x69: 620,
- 0x6A: 737, 0x6B: 857,
- 0x78: 950, 0x79: 949,
- 0x7A: 936, 0x7B: 932,
- 0x7C: 874, 0x7D: 1255,
- 0x7E: 1256, 0x96: 10007,
- 0x97: 10029, 0x98: 10006,
- 0xC8: 1250, 0xC9: 1251,
- 0xCA: 1254, 0xCB: 1253,
-
- /* shapefile DBF extension */
- 0x00: 20127, 0x08: 865,
- 0x09: 437, 0x0A: 850,
- 0x0B: 437, 0x0D: 437,
- 0x0E: 850, 0x0F: 437,
- 0x10: 850, 0x11: 437,
- 0x12: 850, 0x13: 932,
- 0x14: 850, 0x15: 437,
- 0x16: 850, 0x17: 865,
- 0x18: 437, 0x19: 437,
- 0x1A: 850, 0x1B: 437,
- 0x1C: 863, 0x1D: 850,
- 0x1F: 852, 0x22: 852,
- 0x23: 852, 0x24: 860,
- 0x25: 850, 0x26: 866,
- 0x37: 850, 0x40: 852,
- 0x4D: 936, 0x4E: 949,
- 0x4F: 950, 0x50: 874,
- 0x57: 1252, 0x58: 1252,
- 0x59: 1252, 0x6C: 863,
- 0x86: 737, 0x87: 852,
- 0x88: 857, 0xCC: 1257,
-
- 0xFF: 16969
- };
- var dbf_reverse_map = evert({
- 0x01: 437, 0x02: 850,
- 0x03: 1252, 0x04: 10000,
- 0x64: 852, 0x65: 866,
- 0x66: 865, 0x67: 861,
- 0x68: 895, 0x69: 620,
- 0x6A: 737, 0x6B: 857,
- 0x78: 950, 0x79: 949,
- 0x7A: 936, 0x7B: 932,
- 0x7C: 874, 0x7D: 1255,
- 0x7E: 1256, 0x96: 10007,
- 0x97: 10029, 0x98: 10006,
- 0xC8: 1250, 0xC9: 1251,
- 0xCA: 1254, 0xCB: 1253,
- 0x00: 20127
- });
- var DBF_SUPPORTED_VERSIONS = [0x02, 0x03, 0x30, 0x31, 0x83, 0x8B, 0x8C, 0xF5];
- /* TODO: find an actual specification */
- function dbf_to_aoa(buf, opts) {
- var out = [];
- var d = (new_raw_buf(1));
- switch(opts.type) {
- case 'base64': d = s2a(Base64.decode(buf)); break;
- case 'binary': d = s2a(buf); break;
- case 'buffer':
- case 'array': d = buf; break;
- }
- prep_blob(d, 0);
-
- /* header */
- var ft = d.read_shift(1);
- var memo = !!(ft & 0x88);
- var vfp = false, l7 = false;
- switch(ft) {
- case 0x02: break; // dBASE II
- case 0x03: break; // dBASE III
- case 0x30: vfp = true; memo = true; break; // VFP
- case 0x31: vfp = true; memo = true; break; // VFP with autoincrement
- // 0x43 dBASE IV SQL table files
- // 0x63 dBASE IV SQL system files
- case 0x83: break; // dBASE III with memo
- case 0x8B: break; // dBASE IV with memo
- case 0x8C: l7 = true; break; // dBASE Level 7 with memo
- // case 0xCB dBASE IV SQL table files with memo
- case 0xF5: break; // FoxPro 2.x with memo
- // case 0xFB FoxBASE
- default: throw new Error("DBF Unsupported Version: " + ft.toString(16));
- }
-
- var nrow = 0, fpos = 0x0209;
- if(ft == 0x02) nrow = d.read_shift(2);
- d.l += 3; // dBASE II stores DDMMYY date, others use YYMMDD
- if(ft != 0x02) nrow = d.read_shift(4);
- if(nrow > 1048576) nrow = 1e6;
-
- if(ft != 0x02) fpos = d.read_shift(2); // header length
- var rlen = d.read_shift(2); // record length
-
- var /*flags = 0,*/ current_cp = opts.codepage || 1252;
- if(ft != 0x02) { // 20 reserved bytes
- d.l+=16;
- /*flags = */d.read_shift(1);
- //if(memo && ((flags & 0x02) === 0)) throw new Error("DBF Flags " + flags.toString(16) + " ft " + ft.toString(16));
-
- /* codepage present in FoxPro and dBASE Level 7 */
- if(d[d.l] !== 0) current_cp = dbf_codepage_map[d[d.l]];
- d.l+=1;
-
- d.l+=2;
- }
- if(l7) d.l += 36; // Level 7: 32 byte "Language driver name", 4 byte reserved
-
- var fields = [], field = ({});
- var hend = Math.min(d.length, (ft == 0x02 ? 0x209 : (fpos - 10 - (vfp ? 264 : 0))));
- var ww = l7 ? 32 : 11;
- while(d.l < hend && d[d.l] != 0x0d) {
- field = ({});
- field.name = cptable.utils.decode(current_cp, d.slice(d.l, d.l+ww)).replace(/[\u0000\r\n].*$/g,"");
- d.l += ww;
- field.type = String.fromCharCode(d.read_shift(1));
- if(ft != 0x02 && !l7) field.offset = d.read_shift(4);
- field.len = d.read_shift(1);
- if(ft == 0x02) field.offset = d.read_shift(2);
- field.dec = d.read_shift(1);
- if(field.name.length) fields.push(field);
- if(ft != 0x02) d.l += l7 ? 13 : 14;
- switch(field.type) {
- case 'B': // Double (VFP) / Binary (dBASE L7)
- if((!vfp || field.len != 8) && opts.WTF) console.log('Skipping ' + field.name + ':' + field.type);
- break;
- case 'G': // General (FoxPro and dBASE L7)
- case 'P': // Picture (FoxPro and dBASE L7)
- if(opts.WTF) console.log('Skipping ' + field.name + ':' + field.type);
- break;
- case '+': // Autoincrement (dBASE L7 only)
- case '0': // _NullFlags (VFP only)
- case '@': // Timestamp (dBASE L7 only)
- case 'C': // Character (dBASE II)
- case 'D': // Date (dBASE III)
- case 'F': // Float (dBASE IV)
- case 'I': // Long (VFP and dBASE L7)
- case 'L': // Logical (dBASE II)
- case 'M': // Memo (dBASE III)
- case 'N': // Number (dBASE II)
- case 'O': // Double (dBASE L7 only)
- case 'T': // Datetime (VFP only)
- case 'Y': // Currency (VFP only)
- break;
- default: throw new Error('Unknown Field Type: ' + field.type);
- }
- }
-
- if(d[d.l] !== 0x0D) d.l = fpos-1;
- if(d.read_shift(1) !== 0x0D) throw new Error("DBF Terminator not found " + d.l + " " + d[d.l]);
- d.l = fpos;
-
- /* data */
- var R = 0, C = 0;
- out[0] = [];
- for(C = 0; C != fields.length; ++C) out[0][C] = fields[C].name;
- while(nrow-- > 0) {
- if(d[d.l] === 0x2A) {
- // TODO: record marked as deleted -- create a hidden row?
- d.l+=rlen;
- continue;
- }
- ++d.l;
- out[++R] = []; C = 0;
- for(C = 0; C != fields.length; ++C) {
- var dd = d.slice(d.l, d.l+fields[C].len); d.l+=fields[C].len;
- prep_blob(dd, 0);
- var s = cptable.utils.decode(current_cp, dd);
- switch(fields[C].type) {
- case 'C':
- // NOTE: it is conventional to write ' / / ' for empty dates
- if(s.trim().length) out[R][C] = s.replace(/\s+$/,"");
- break;
- case 'D':
- if(s.length === 8) out[R][C] = new Date(+s.slice(0,4), +s.slice(4,6)-1, +s.slice(6,8));
- else out[R][C] = s;
- break;
- case 'F': out[R][C] = parseFloat(s.trim()); break;
- case '+': case 'I': out[R][C] = l7 ? dd.read_shift(-4, 'i') ^ 0x80000000 : dd.read_shift(4, 'i'); break;
- case 'L': switch(s.trim().toUpperCase()) {
- case 'Y': case 'T': out[R][C] = true; break;
- case 'N': case 'F': out[R][C] = false; break;
- case '': case '?': break;
- default: throw new Error("DBF Unrecognized L:|" + s + "|");
- } break;
- case 'M': /* TODO: handle memo files */
- if(!memo) throw new Error("DBF Unexpected MEMO for type " + ft.toString(16));
- out[R][C] = "##MEMO##" + (l7 ? parseInt(s.trim(), 10): dd.read_shift(4));
- break;
- case 'N':
- s = s.replace(/\u0000/g,"").trim();
- // NOTE: dBASE II interprets " . " as 0
- if(s && s != ".") out[R][C] = +s || 0; break;
- case '@':
- // NOTE: dBASE specs appear to be incorrect
- out[R][C] = new Date(dd.read_shift(-8, 'f') - 0x388317533400);
- break;
- case 'T': out[R][C] = new Date((dd.read_shift(4) - 0x253D8C) * 0x5265C00 + dd.read_shift(4)); break;
- case 'Y': out[R][C] = dd.read_shift(4,'i')/1e4; break;
- case 'O': out[R][C] = -dd.read_shift(-8, 'f'); break;
- case 'B': if(vfp && fields[C].len == 8) { out[R][C] = dd.read_shift(8,'f'); break; }
- /* falls through */
- case 'G': case 'P': dd.l += fields[C].len; break;
- case '0':
- if(fields[C].name === '_NullFlags') break;
- /* falls through */
- default: throw new Error("DBF Unsupported data type " + fields[C].type);
- }
- }
- }
- 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));
- if(opts && opts.sheetRows) out = out.slice(0, opts.sheetRows);
- return out;
- }
-
- function dbf_to_sheet(buf, opts) {
- var o = opts || {};
- if(!o.dateNF) o.dateNF = "yyyymmdd";
- return aoa_to_sheet(dbf_to_aoa(buf, o), o);
- }
-
- function dbf_to_workbook(buf, opts) {
- try { return sheet_to_workbook(dbf_to_sheet(buf, opts), opts); }
- catch(e) { if(opts && opts.WTF) throw e; }
- return ({SheetNames:[],Sheets:{}});
- }
-
- var _RLEN = { 'B': 8, 'C': 250, 'L': 1, 'D': 8, '?': 0, '': 0 };
- function sheet_to_dbf(ws, opts) {
- var o = opts || {};
- if(+o.codepage >= 0) set_cp(+o.codepage);
- if(o.type == "string") throw new Error("Cannot write DBF to JS string");
- var ba = buf_array();
- var aoa = sheet_to_json(ws, {header:1, raw:true, cellDates:true});
- var headers = aoa[0], data = aoa.slice(1);
- var i = 0, j = 0, hcnt = 0, rlen = 1;
- for(i = 0; i < headers.length; ++i) {
- if(i == null) continue;
- ++hcnt;
- if(typeof headers[i] === 'number') headers[i] = headers[i].toString(10);
- if(typeof headers[i] !== 'string') throw new Error("DBF Invalid column name " + headers[i] + " |" + (typeof headers[i]) + "|");
- if(headers.indexOf(headers[i]) !== i) for(j=0; j<1024;++j)
- if(headers.indexOf(headers[i] + "_" + j) == -1) { headers[i] += "_" + j; break; }
- }
- var range = safe_decode_range(ws['!ref']);
- var coltypes = [];
- for(i = 0; i <= range.e.c - range.s.c; ++i) {
- var col = [];
- for(j=0; j < data.length; ++j) {
- if(data[j][i] != null) col.push(data[j][i]);
- }
- if(col.length == 0 || headers[i] == null) { coltypes[i] = '?'; continue; }
- var guess = '', _guess = '';
- for(j = 0; j < col.length; ++j) {
- switch(typeof col[j]) {
- /* TODO: check if L2 compat is desired */
- case 'number': _guess = 'B'; break;
- case 'string': _guess = 'C'; break;
- case 'boolean': _guess = 'L'; break;
- case 'object': _guess = col[j] instanceof Date ? 'D' : 'C'; break;
- default: _guess = 'C';
- }
- guess = guess && guess != _guess ? 'C' : _guess;
- if(guess == 'C') break;
- }
- rlen += _RLEN[guess] || 0;
- coltypes[i] = guess;
- }
-
- var h = ba.next(32);
- h.write_shift(4, 0x13021130);
- h.write_shift(4, data.length);
- h.write_shift(2, 296 + 32 * hcnt);
- h.write_shift(2, rlen);
- for(i=0; i < 4; ++i) h.write_shift(4, 0);
- h.write_shift(4, 0x00000000 | ((+dbf_reverse_map[current_ansi] || 0x03)<<8));
-
- for(i = 0, j = 0; i < headers.length; ++i) {
- if(headers[i] == null) continue;
- var hf = ba.next(32);
- var _f = (headers[i].slice(-10) + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00").slice(0, 11);
- hf.write_shift(1, _f, "sbcs");
- hf.write_shift(1, coltypes[i] == '?' ? 'C' : coltypes[i], "sbcs");
- hf.write_shift(4, j);
- hf.write_shift(1, _RLEN[coltypes[i]] || 0);
- hf.write_shift(1, 0);
- hf.write_shift(1, 0x02);
- hf.write_shift(4, 0);
- hf.write_shift(1, 0);
- hf.write_shift(4, 0);
- hf.write_shift(4, 0);
- j += _RLEN[coltypes[i]] || 0;
- }
-
- var hb = ba.next(264);
- hb.write_shift(4, 0x0000000D);
- for(i=0; i < 65;++i) hb.write_shift(4, 0x00000000);
- for(i=0; i < data.length; ++i) {
- var rout = ba.next(rlen);
- rout.write_shift(1, 0);
- for(j=0; j<headers.length; ++j) {
- if(headers[j] == null) continue;
- switch(coltypes[j]) {
- case 'L': rout.write_shift(1, data[i][j] == null ? 0x3F : data[i][j] ? 0x54 : 0x46); break;
- case 'B': rout.write_shift(8, data[i][j]||0, 'f'); break;
- case 'D':
- if(!data[i][j]) rout.write_shift(8, "00000000", "sbcs");
- else {
- rout.write_shift(4, ("0000"+data[i][j].getFullYear()).slice(-4), "sbcs");
- rout.write_shift(2, ("00"+(data[i][j].getMonth()+1)).slice(-2), "sbcs");
- rout.write_shift(2, ("00"+data[i][j].getDate()).slice(-2), "sbcs");
- } break;
- case 'C':
- var _s = String(data[i][j]||"");
- rout.write_shift(1, _s, "sbcs");
- for(hcnt=0; hcnt < 250-_s.length; ++hcnt) rout.write_shift(1, 0x20); break;
- }
- }
- // data
- }
- ba.next(1).write_shift(1, 0x1A);
- return ba.end();
- }
- return {
- versions: DBF_SUPPORTED_VERSIONS,
- to_workbook: dbf_to_workbook,
- to_sheet: dbf_to_sheet,
- from_sheet: sheet_to_dbf
- };
- })();
-
- var SYLK = (function() {
- /* TODO: stress test sequences */
- var sylk_escapes = ({
- AA:'À', BA:'Á', CA:'Â', DA:195, HA:'Ä', JA:197,
- AE:'È', BE:'É', CE:'Ê', HE:'Ë',
- AI:'Ì', BI:'Í', CI:'Î', HI:'Ï',
- AO:'Ò', BO:'Ó', CO:'Ô', DO:213, HO:'Ö',
- AU:'Ù', BU:'Ú', CU:'Û', HU:'Ü',
- Aa:'à', Ba:'á', Ca:'â', Da:227, Ha:'ä', Ja:229,
- Ae:'è', Be:'é', Ce:'ê', He:'ë',
- Ai:'ì', Bi:'í', Ci:'î', Hi:'ï',
- Ao:'ò', Bo:'ó', Co:'ô', Do:245, Ho:'ö',
- Au:'ù', Bu:'ú', Cu:'û', Hu:'ü',
- KC:'Ç', Kc:'ç', q:'æ', z:'œ', a:'Æ', j:'Œ',
- DN:209, Dn:241, Hy:255,
- S:169, c:170, R:174, B:180,
- 0:176, 1:177, 2:178,
- 3:179, 5:181, 6:182,
- 7:183, Q:185, k:186, b:208, i:216, l:222, s:240, y:248,
- "!":161, '"':162, "#":163, "(":164, "%":165, "'":167, "H ":168,
- "+":171, ";":187, "<":188, "=":189, ">":190, "?":191, "{":223
- });
- var sylk_char_regex = new RegExp("\u001BN(" + keys(sylk_escapes).join("|").replace(/\|\|\|/, "|\\||").replace(/([?()+])/g,"\\$1") + "|\\|)", "gm");
- var sylk_char_fn = function(_, $1){ var o = sylk_escapes[$1]; return typeof o == "number" ? _getansi(o) : o; };
- var decode_sylk_char = function($$, $1, $2) { var newcc = (($1.charCodeAt(0) - 0x20)<<4) | ($2.charCodeAt(0) - 0x30); return newcc == 59 ? $$ : _getansi(newcc); };
- sylk_escapes["|"] = 254;
- /* TODO: find an actual specification */
- function sylk_to_aoa(d, opts) {
- switch(opts.type) {
- case 'base64': return sylk_to_aoa_str(Base64.decode(d), opts);
- case 'binary': return sylk_to_aoa_str(d, opts);
- case 'buffer': return sylk_to_aoa_str(d.toString('binary'), opts);
- case 'array': return sylk_to_aoa_str(cc2str(d), opts);
- }
- throw new Error("Unrecognized type " + opts.type);
- }
- function sylk_to_aoa_str(str, opts) {
- var records = str.split(/[\n\r]+/), R = -1, C = -1, ri = 0, rj = 0, arr = [];
- var formats = [];
- var next_cell_format = null;
- var sht = {}, rowinfo = [], colinfo = [], cw = [];
- var Mval = 0, j;
- if(+opts.codepage >= 0) set_cp(+opts.codepage);
- for (; ri !== records.length; ++ri) {
- Mval = 0;
- var rstr=records[ri].trim().replace(/\x1B([\x20-\x2F])([\x30-\x3F])/g, decode_sylk_char).replace(sylk_char_regex, sylk_char_fn);
- var record=rstr.replace(/;;/g, "\u0000").split(";").map(function(x) { return x.replace(/\u0000/g, ";"); });
- var RT=record[0], val;
- if(rstr.length > 0) switch(RT) {
- case 'ID': break; /* header */
- case 'E': break; /* EOF */
- case 'B': break; /* dimensions */
- case 'O': break; /* options? */
- case 'P':
- if(record[1].charAt(0) == 'P')
- formats.push(rstr.slice(3).replace(/;;/g, ";"));
- break;
- case 'C':
- var C_seen_K = false, C_seen_X = false, C_seen_S = false, C_seen_E = false, _R = -1, _C = -1;
- for(rj=1; rj<record.length; ++rj) switch(record[rj].charAt(0)) {
- case 'A': break; // TODO: comment
- case 'X': C = parseInt(record[rj].slice(1))-1; C_seen_X = true; break;
- case 'Y':
- R = parseInt(record[rj].slice(1))-1; if(!C_seen_X) C = 0;
- for(j = arr.length; j <= R; ++j) arr[j] = [];
- break;
- case 'K':
- val = record[rj].slice(1);
- if(val.charAt(0) === '"') val = val.slice(1,val.length - 1);
- else if(val === 'TRUE') val = true;
- else if(val === 'FALSE') val = false;
- else if(!isNaN(fuzzynum(val))) {
- val = fuzzynum(val);
- if(next_cell_format !== null && SSF.is_date(next_cell_format)) val = numdate(val);
- } else if(!isNaN(fuzzydate(val).getDate())) {
- val = parseDate(val);
- }
- if(typeof cptable !== 'undefined' && typeof val == "string" && ((opts||{}).type != "string") && (opts||{}).codepage) val = cptable.utils.decode(opts.codepage, val);
- C_seen_K = true;
- break;
- case 'E':
- C_seen_E = true;
- var formula = rc_to_a1(record[rj].slice(1), {r:R,c:C});
- arr[R][C] = [arr[R][C], formula];
- break;
- case 'S':
- C_seen_S = true;
- arr[R][C] = [arr[R][C], "S5S"];
- break;
- case 'G': break; // unknown
- case 'R': _R = parseInt(record[rj].slice(1))-1; break;
- case 'C': _C = parseInt(record[rj].slice(1))-1; break;
- default: if(opts && opts.WTF) throw new Error("SYLK bad record " + rstr);
- }
- if(C_seen_K) {
- if(arr[R][C] && arr[R][C].length == 2) arr[R][C][0] = val;
- else arr[R][C] = val;
- next_cell_format = null;
- }
- if(C_seen_S) {
- if(C_seen_E) throw new Error("SYLK shared formula cannot have own formula");
- var shrbase = _R > -1 && arr[_R][_C];
- if(!shrbase || !shrbase[1]) throw new Error("SYLK shared formula cannot find base");
- arr[R][C][1] = shift_formula_str(shrbase[1], {r: R - _R, c: C - _C});
- }
- break;
- case 'F':
- var F_seen = 0;
- for(rj=1; rj<record.length; ++rj) switch(record[rj].charAt(0)) {
- case 'X': C = parseInt(record[rj].slice(1))-1; ++F_seen; break;
- case 'Y':
- R = parseInt(record[rj].slice(1))-1; /*C = 0;*/
- for(j = arr.length; j <= R; ++j) arr[j] = [];
- break;
- case 'M': Mval = parseInt(record[rj].slice(1)) / 20; break;
- case 'F': break; /* ??? */
- case 'G': break; /* hide grid */
- case 'P':
- next_cell_format = formats[parseInt(record[rj].slice(1))];
- break;
- case 'S': break; /* cell style */
- case 'D': break; /* column */
- case 'N': break; /* font */
- case 'W':
- cw = record[rj].slice(1).split(" ");
- for(j = parseInt(cw[0], 10); j <= parseInt(cw[1], 10); ++j) {
- Mval = parseInt(cw[2], 10);
- colinfo[j-1] = Mval === 0 ? {hidden:true}: {wch:Mval}; process_col(colinfo[j-1]);
- } break;
- case 'C': /* default column format */
- C = parseInt(record[rj].slice(1))-1;
- if(!colinfo[C]) colinfo[C] = {};
- break;
- case 'R': /* row properties */
- R = parseInt(record[rj].slice(1))-1;
- if(!rowinfo[R]) rowinfo[R] = {};
- if(Mval > 0) { rowinfo[R].hpt = Mval; rowinfo[R].hpx = pt2px(Mval); }
- else if(Mval === 0) rowinfo[R].hidden = true;
- break;
- default: if(opts && opts.WTF) throw new Error("SYLK bad record " + rstr);
- }
- if(F_seen < 1) next_cell_format = null; break;
- default: if(opts && opts.WTF) throw new Error("SYLK bad record " + rstr);
- }
- }
- if(rowinfo.length > 0) sht['!rows'] = rowinfo;
- if(colinfo.length > 0) sht['!cols'] = colinfo;
- if(opts && opts.sheetRows) arr = arr.slice(0, opts.sheetRows);
- return [arr, sht];
- }
-
- function sylk_to_sheet(d, opts) {
- var aoasht = sylk_to_aoa(d, opts);
- var aoa = aoasht[0], ws = aoasht[1];
- var o = aoa_to_sheet(aoa, opts);
- keys(ws).forEach(function(k) { o[k] = ws[k]; });
- return o;
- }
-
- function sylk_to_workbook(d, opts) { return sheet_to_workbook(sylk_to_sheet(d, opts), opts); }
-
- function write_ws_cell_sylk(cell, ws, R, C) {
- var o = "C;Y" + (R+1) + ";X" + (C+1) + ";K";
- switch(cell.t) {
- case 'n':
- o += (cell.v||0);
- if(cell.f && !cell.F) o += ";E" + a1_to_rc(cell.f, {r:R, c:C}); break;
- case 'b': o += cell.v ? "TRUE" : "FALSE"; break;
- case 'e': o += cell.w || cell.v; break;
- case 'd': o += '"' + (cell.w || cell.v) + '"'; break;
- case 's': o += '"' + cell.v.replace(/"/g,"") + '"'; break;
- }
- return o;
- }
-
- function write_ws_cols_sylk(out, cols) {
- cols.forEach(function(col, i) {
- var rec = "F;W" + (i+1) + " " + (i+1) + " ";
- if(col.hidden) rec += "0";
- else {
- if(typeof col.width == 'number') col.wpx = width2px(col.width);
- if(typeof col.wpx == 'number') col.wch = px2char(col.wpx);
- if(typeof col.wch == 'number') rec += Math.round(col.wch);
- }
- if(rec.charAt(rec.length - 1) != " ") out.push(rec);
- });
- }
-
- function write_ws_rows_sylk(out, rows) {
- rows.forEach(function(row, i) {
- var rec = "F;";
- if(row.hidden) rec += "M0;";
- else if(row.hpt) rec += "M" + 20 * row.hpt + ";";
- else if(row.hpx) rec += "M" + 20 * px2pt(row.hpx) + ";";
- if(rec.length > 2) out.push(rec + "R" + (i+1));
- });
- }
-
- function sheet_to_sylk(ws, opts) {
- var preamble = ["ID;PWXL;N;E"], o = [];
- var r = safe_decode_range(ws['!ref']), cell;
- var dense = Array.isArray(ws);
- var RS = "\r\n";
-
- preamble.push("P;PGeneral");
- preamble.push("F;P0;DG0G8;M255");
- if(ws['!cols']) write_ws_cols_sylk(preamble, ws['!cols']);
- if(ws['!rows']) write_ws_rows_sylk(preamble, ws['!rows']);
-
- 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(" "));
- for(var R = r.s.r; R <= r.e.r; ++R) {
- for(var C = r.s.c; C <= r.e.c; ++C) {
- var coord = encode_cell({r:R,c:C});
- cell = dense ? (ws[R]||[])[C]: ws[coord];
- if(!cell || (cell.v == null && (!cell.f || cell.F))) continue;
- o.push(write_ws_cell_sylk(cell, ws, R, C, opts));
- }
- }
- return preamble.join(RS) + RS + o.join(RS) + RS + "E" + RS;
- }
-
- return {
- to_workbook: sylk_to_workbook,
- to_sheet: sylk_to_sheet,
- from_sheet: sheet_to_sylk
- };
- })();
-
- var DIF = (function() {
- function dif_to_aoa(d, opts) {
- switch(opts.type) {
- case 'base64': return dif_to_aoa_str(Base64.decode(d), opts);
- case 'binary': return dif_to_aoa_str(d, opts);
- case 'buffer': return dif_to_aoa_str(d.toString('binary'), opts);
- case 'array': return dif_to_aoa_str(cc2str(d), opts);
- }
- throw new Error("Unrecognized type " + opts.type);
- }
- function dif_to_aoa_str(str, opts) {
- var records = str.split('\n'), R = -1, C = -1, ri = 0, arr = [];
- for (; ri !== records.length; ++ri) {
- if (records[ri].trim() === 'BOT') { arr[++R] = []; C = 0; continue; }
- if (R < 0) continue;
- var metadata = records[ri].trim().split(",");
- var type = metadata[0], value = metadata[1];
- ++ri;
- var data = records[ri].trim();
- switch (+type) {
- case -1:
- if (data === 'BOT') { arr[++R] = []; C = 0; continue; }
- else if (data !== 'EOD') throw new Error("Unrecognized DIF special command " + data);
- break;
- case 0:
- if(data === 'TRUE') arr[R][C] = true;
- else if(data === 'FALSE') arr[R][C] = false;
- else if(!isNaN(fuzzynum(value))) arr[R][C] = fuzzynum(value);
- else if(!isNaN(fuzzydate(value).getDate())) arr[R][C] = parseDate(value);
- else arr[R][C] = value;
- ++C; break;
- case 1:
- data = data.slice(1,data.length-1);
- arr[R][C++] = data !== '' ? data : null;
- break;
- }
- if (data === 'EOD') break;
- }
- if(opts && opts.sheetRows) arr = arr.slice(0, opts.sheetRows);
- return arr;
- }
-
- function dif_to_sheet(str, opts) { return aoa_to_sheet(dif_to_aoa(str, opts), opts); }
- function dif_to_workbook(str, opts) { return sheet_to_workbook(dif_to_sheet(str, opts), opts); }
-
- var sheet_to_dif = (function() {
- var push_field = function pf(o, topic, v, n, s) {
- o.push(topic);
- o.push(v + "," + n);
- o.push('"' + s.replace(/"/g,'""') + '"');
- };
- var push_value = function po(o, type, v, s) {
- o.push(type + "," + v);
- o.push(type == 1 ? '"' + s.replace(/"/g,'""') + '"' : s);
- };
- return function sheet_to_dif(ws) {
- var o = [];
- var r = safe_decode_range(ws['!ref']), cell;
- var dense = Array.isArray(ws);
- push_field(o, "TABLE", 0, 1, "sheetjs");
- push_field(o, "VECTORS", 0, r.e.r - r.s.r + 1,"");
- push_field(o, "TUPLES", 0, r.e.c - r.s.c + 1,"");
- push_field(o, "DATA", 0, 0,"");
- for(var R = r.s.r; R <= r.e.r; ++R) {
- push_value(o, -1, 0, "BOT");
- for(var C = r.s.c; C <= r.e.c; ++C) {
- var coord = encode_cell({r:R,c:C});
- cell = dense ? (ws[R]||[])[C] : ws[coord];
- if(!cell) { push_value(o, 1, 0, ""); continue;}
- switch(cell.t) {
- case 'n':
- var val = DIF_XL ? cell.w : cell.v;
- if(!val && cell.v != null) val = cell.v;
- if(val == null) {
- if(DIF_XL && cell.f && !cell.F) push_value(o, 1, 0, "=" + cell.f);
- else push_value(o, 1, 0, "");
- }
- else push_value(o, 0, val, "V");
- break;
- case 'b':
- push_value(o, 0, cell.v ? 1 : 0, cell.v ? "TRUE" : "FALSE");
- break;
- case 's':
- push_value(o, 1, 0, (!DIF_XL || isNaN(cell.v)) ? cell.v : '="' + cell.v + '"');
- break;
- case 'd':
- if(!cell.w) cell.w = SSF.format(cell.z || SSF._table[14], datenum(parseDate(cell.v)));
- if(DIF_XL) push_value(o, 0, cell.w, "V");
- else push_value(o, 1, 0, cell.w);
- break;
- default: push_value(o, 1, 0, "");
- }
- }
- }
- push_value(o, -1, 0, "EOD");
- var RS = "\r\n";
- var oo = o.join(RS);
- //while((oo.length & 0x7F) != 0) oo += "\0";
- return oo;
- };
- })();
- return {
- to_workbook: dif_to_workbook,
- to_sheet: dif_to_sheet,
- from_sheet: sheet_to_dif
- };
- })();
-
- var ETH = (function() {
- function decode(s) { return s.replace(/\\b/g,"\\").replace(/\\c/g,":").replace(/\\n/g,"\n"); }
- function encode(s) { return s.replace(/\\/g, "\\b").replace(/:/g, "\\c").replace(/\n/g,"\\n"); }
-
- function eth_to_aoa(str, opts) {
- var records = str.split('\n'), R = -1, C = -1, ri = 0, arr = [];
- for (; ri !== records.length; ++ri) {
- var record = records[ri].trim().split(":");
- if(record[0] !== 'cell') continue;
- var addr = decode_cell(record[1]);
- if(arr.length <= addr.r) for(R = arr.length; R <= addr.r; ++R) if(!arr[R]) arr[R] = [];
- R = addr.r; C = addr.c;
- switch(record[2]) {
- case 't': arr[R][C] = decode(record[3]); break;
- case 'v': arr[R][C] = +record[3]; break;
- case 'vtf': var _f = record[record.length - 1];
- /* falls through */
- case 'vtc':
- switch(record[3]) {
- case 'nl': arr[R][C] = +record[4] ? true : false; break;
- default: arr[R][C] = +record[4]; break;
- }
- if(record[2] == 'vtf') arr[R][C] = [arr[R][C], _f];
- }
- }
- if(opts && opts.sheetRows) arr = arr.slice(0, opts.sheetRows);
- return arr;
- }
-
- function eth_to_sheet(d, opts) { return aoa_to_sheet(eth_to_aoa(d, opts), opts); }
- function eth_to_workbook(d, opts) { return sheet_to_workbook(eth_to_sheet(d, opts), opts); }
-
- var header = [
- "socialcalc:version:1.5",
- "MIME-Version: 1.0",
- "Content-Type: multipart/mixed; boundary=SocialCalcSpreadsheetControlSave"
- ].join("\n");
-
- var sep = [
- "--SocialCalcSpreadsheetControlSave",
- "Content-type: text/plain; charset=UTF-8"
- ].join("\n") + "\n";
-
- /* TODO: the other parts */
- var meta = [
- "# SocialCalc Spreadsheet Control Save",
- "part:sheet"
- ].join("\n");
-
- var end = "--SocialCalcSpreadsheetControlSave--";
-
- function sheet_to_eth_data(ws) {
- if(!ws || !ws['!ref']) return "";
- var o = [], oo = [], cell, coord = "";
- var r = decode_range(ws['!ref']);
- var dense = Array.isArray(ws);
- for(var R = r.s.r; R <= r.e.r; ++R) {
- for(var C = r.s.c; C <= r.e.c; ++C) {
- coord = encode_cell({r:R,c:C});
- cell = dense ? (ws[R]||[])[C] : ws[coord];
- if(!cell || cell.v == null || cell.t === 'z') continue;
- oo = ["cell", coord, 't'];
- switch(cell.t) {
- case 's': case 'str': oo.push(encode(cell.v)); break;
- case 'n':
- if(!cell.f) { oo[2]='v'; oo[3]=cell.v; }
- else { oo[2]='vtf'; oo[3]='n'; oo[4]=cell.v; oo[5]=encode(cell.f); }
- break;
- case 'b':
- oo[2] = 'vt'+(cell.f?'f':'c'); oo[3]='nl'; oo[4]=cell.v?"1":"0";
- oo[5] = encode(cell.f||(cell.v?'TRUE':'FALSE'));
- break;
- case 'd':
- var t = datenum(parseDate(cell.v));
- oo[2] = 'vtc'; oo[3] = 'nd'; oo[4] = ""+t;
- oo[5] = cell.w || SSF.format(cell.z || SSF._table[14], t);
- break;
- case 'e': continue;
- }
- o.push(oo.join(":"));
- }
- }
- o.push("sheet:c:" + (r.e.c-r.s.c+1) + ":r:" + (r.e.r-r.s.r+1) + ":tvf:1");
- o.push("valueformat:1:text-wiki");
- //o.push("copiedfrom:" + ws['!ref']); // clipboard only
- return o.join("\n");
- }
-
- function sheet_to_eth(ws) {
- return [header, sep, meta, sep, sheet_to_eth_data(ws), end].join("\n");
- // return ["version:1.5", sheet_to_eth_data(ws)].join("\n"); // clipboard form
- }
-
- return {
- to_workbook: eth_to_workbook,
- to_sheet: eth_to_sheet,
- from_sheet: sheet_to_eth
- };
- })();
-
- var PRN = (function() {
- function set_text_arr(data, arr, R, C, o) {
- if(o.raw) arr[R][C] = data;
- else if(data === ""){/* empty */}
- else if(data === 'TRUE') arr[R][C] = true;
- else if(data === 'FALSE') arr[R][C] = false;
- else if(!isNaN(fuzzynum(data))) arr[R][C] = fuzzynum(data);
- else if(!isNaN(fuzzydate(data).getDate())) arr[R][C] = parseDate(data);
- else arr[R][C] = data;
- }
-
- function prn_to_aoa_str(f, opts) {
- var o = opts || {};
- var arr = ([]);
- if(!f || f.length === 0) return arr;
- var lines = f.split(/[\r\n]/);
- var L = lines.length - 1;
- while(L >= 0 && lines[L].length === 0) --L;
- var start = 10, idx = 0;
- var R = 0;
- for(; R <= L; ++R) {
- idx = lines[R].indexOf(" ");
- if(idx == -1) idx = lines[R].length; else idx++;
- start = Math.max(start, idx);
- }
- for(R = 0; R <= L; ++R) {
- arr[R] = [];
- /* TODO: confirm that widths are always 10 */
- var C = 0;
- set_text_arr(lines[R].slice(0, start).trim(), arr, R, C, o);
- for(C = 1; C <= (lines[R].length - start)/10 + 1; ++C)
- set_text_arr(lines[R].slice(start+(C-1)*10,start+C*10).trim(),arr,R,C,o);
- }
- if(o.sheetRows) arr = arr.slice(0, o.sheetRows);
- return arr;
- }
-
- // List of accepted CSV separators
- var guess_seps = {
- 0x2C: ',',
- 0x09: "\t",
- 0x3B: ';'
- };
-
- // CSV separator weights to be used in case of equal numbers
- var guess_sep_weights = {
- 0x2C: 3,
- 0x09: 2,
- 0x3B: 1
- };
-
- function guess_sep(str) {
- var cnt = {}, instr = false, end = 0, cc = 0;
- for(;end < str.length;++end) {
- if((cc=str.charCodeAt(end)) == 0x22) instr = !instr;
- else if(!instr && cc in guess_seps) cnt[cc] = (cnt[cc]||0)+1;
- }
-
- cc = [];
- for(end in cnt) if ( Object.prototype.hasOwnProperty.call(cnt, end) ) {
- cc.push([ cnt[end], end ]);
- }
-
- if ( !cc.length ) {
- cnt = guess_sep_weights;
- for(end in cnt) if ( Object.prototype.hasOwnProperty.call(cnt, end) ) {
- cc.push([ cnt[end], end ]);
- }
- }
-
- cc.sort(function(a, b) { return a[0] - b[0] || guess_sep_weights[a[1]] - guess_sep_weights[b[1]]; });
-
- return guess_seps[cc.pop()[1]];
- }
-
- function dsv_to_sheet_str(str, opts) {
- var o = opts || {};
- var sep = "";
- if(DENSE != null && o.dense == null) o.dense = DENSE;
- var ws = o.dense ? ([]) : ({});
- var range = ({s: {c:0, r:0}, e: {c:0, r:0}});
-
- if(str.slice(0,4) == "sep=") {
- // If the line ends in \r\n
- if(str.charCodeAt(5) == 13 && str.charCodeAt(6) == 10 ) {
- sep = str.charAt(4); str = str.slice(7);
- }
- // If line ends in \r OR \n
- else if(str.charCodeAt(5) == 13 || str.charCodeAt(5) == 10 ) {
- sep = str.charAt(4); str = str.slice(6);
- }
- else sep = guess_sep(str.slice(0,1024));
- }
- else sep = guess_sep(str.slice(0,1024));
- var R = 0, C = 0, v = 0;
- var start = 0, end = 0, sepcc = sep.charCodeAt(0), instr = false, cc=0;
- str = str.replace(/\r\n/mg, "\n");
- var _re = o.dateNF != null ? dateNF_regex(o.dateNF) : null;
- function finish_cell() {
- var s = str.slice(start, end);
- var cell = ({});
- if(s.charAt(0) == '"' && s.charAt(s.length - 1) == '"') s = s.slice(1,-1).replace(/""/g,'"');
- if(s.length === 0) cell.t = 'z';
- else if(o.raw) { cell.t = 's'; cell.v = s; }
- else if(s.trim().length === 0) { cell.t = 's'; cell.v = s; }
- else if(s.charCodeAt(0) == 0x3D) {
- if(s.charCodeAt(1) == 0x22 && s.charCodeAt(s.length - 1) == 0x22) { cell.t = 's'; cell.v = s.slice(2,-1).replace(/""/g,'"'); }
- else if(fuzzyfmla(s)) { cell.t = 'n'; cell.f = s.slice(1); }
- else { cell.t = 's'; cell.v = s; } }
- else if(s == "TRUE") { cell.t = 'b'; cell.v = true; }
- else if(s == "FALSE") { cell.t = 'b'; cell.v = false; }
- else if(!isNaN(v = fuzzynum(s))) { cell.t = 'n'; if(o.cellText !== false) cell.w = s; cell.v = v; }
- else if(!isNaN(fuzzydate(s).getDate()) || _re && s.match(_re)) {
- cell.z = o.dateNF || SSF._table[14];
- var k = 0;
- if(_re && s.match(_re)){ s=dateNF_fix(s, o.dateNF, (s.match(_re)||[])); k=1; }
- if(o.cellDates) { cell.t = 'd'; cell.v = parseDate(s, k); }
- else { cell.t = 'n'; cell.v = datenum(parseDate(s, k)); }
- if(o.cellText !== false) cell.w = SSF.format(cell.z, cell.v instanceof Date ? datenum(cell.v):cell.v);
- if(!o.cellNF) delete cell.z;
- } else {
- cell.t = 's';
- cell.v = s;
- }
- if(cell.t == 'z'){}
- else if(o.dense) { if(!ws[R]) ws[R] = []; ws[R][C] = cell; }
- else ws[encode_cell({c:C,r:R})] = cell;
- start = end+1;
- if(range.e.c < C) range.e.c = C;
- if(range.e.r < R) range.e.r = R;
- if(cc == sepcc) ++C; else { C = 0; ++R; if(o.sheetRows && o.sheetRows <= R) return true; }
- }
- outer: for(;end < str.length;++end) switch((cc=str.charCodeAt(end))) {
- case 0x22: instr = !instr; break;
- case sepcc: case 0x0a: case 0x0d: if(!instr && finish_cell()) break outer; break;
- default: break;
- }
- if(end - start > 0) finish_cell();
-
- ws['!ref'] = encode_range(range);
- return ws;
- }
-
- function prn_to_sheet_str(str, opts) {
- if(!(opts && opts.PRN)) return dsv_to_sheet_str(str, opts);
- if(str.slice(0,4) == "sep=") return dsv_to_sheet_str(str, opts);
- if(str.indexOf("\t") >= 0 || str.indexOf(",") >= 0 || str.indexOf(";") >= 0) return dsv_to_sheet_str(str, opts);
- return aoa_to_sheet(prn_to_aoa_str(str, opts), opts);
- }
-
- function prn_to_sheet(d, opts) {
- var str = "", bytes = opts.type == 'string' ? [0,0,0,0] : firstbyte(d, opts);
- switch(opts.type) {
- case 'base64': str = Base64.decode(d); break;
- case 'binary': str = d; break;
- case 'buffer':
- if(opts.codepage == 65001) str = d.toString('utf8');
- else if(opts.codepage && typeof cptable !== 'undefined') str = cptable.utils.decode(opts.codepage, d);
- else str = d.toString('binary');
- break;
- case 'array': str = cc2str(d); break;
- case 'string': str = d; break;
- default: throw new Error("Unrecognized type " + opts.type);
- }
- if(bytes[0] == 0xEF && bytes[1] == 0xBB && bytes[2] == 0xBF) str = utf8read(str.slice(3));
- else if((opts.type == 'binary') && typeof cptable !== 'undefined' && opts.codepage) str = cptable.utils.decode(opts.codepage, cptable.utils.encode(28591,str));
- if(str.slice(0,19) == "socialcalc:version:") return ETH.to_sheet(opts.type == 'string' ? str : utf8read(str), opts);
- return prn_to_sheet_str(str, opts);
- }
-
- function prn_to_workbook(d, opts) { return sheet_to_workbook(prn_to_sheet(d, opts), opts); }
-
- function sheet_to_prn(ws) {
- var o = [];
- var r = safe_decode_range(ws['!ref']), cell;
- var dense = Array.isArray(ws);
- for(var R = r.s.r; R <= r.e.r; ++R) {
- var oo = [];
- for(var C = r.s.c; C <= r.e.c; ++C) {
- var coord = encode_cell({r:R,c:C});
- cell = dense ? (ws[R]||[])[C] : ws[coord];
- if(!cell || cell.v == null) { oo.push(" "); continue; }
- var w = (cell.w || (format_cell(cell), cell.w) || "").slice(0,10);
- while(w.length < 10) w += " ";
- oo.push(w + (C === 0 ? " " : ""));
- }
- o.push(oo.join(""));
- }
- return o.join("\n");
- }
-
- return {
- to_workbook: prn_to_workbook,
- to_sheet: prn_to_sheet,
- from_sheet: sheet_to_prn
- };
- })();
-
- /* Excel defaults to SYLK but warns if data is not valid */
- function read_wb_ID(d, opts) {
- var o = opts || {}, OLD_WTF = !!o.WTF; o.WTF = true;
- try {
- var out = SYLK.to_workbook(d, o);
- o.WTF = OLD_WTF;
- return out;
- } catch(e) {
- o.WTF = OLD_WTF;
- if(!e.message.match(/SYLK bad record ID/) && OLD_WTF) throw e;
- return PRN.to_workbook(d, opts);
- }
- }
-
- var WK_ = (function() {
- function lotushopper(data, cb, opts) {
- if(!data) return;
- prep_blob(data, data.l || 0);
- var Enum = opts.Enum || WK1Enum;
- while(data.l < data.length) {
- var RT = data.read_shift(2);
- var R = Enum[RT] || Enum[0xFF];
- var length = data.read_shift(2);
- var tgt = data.l + length;
- var d = (R.f||parsenoop)(data, length, opts);
- data.l = tgt;
- if(cb(d, R.n, RT)) return;
- }
- }
-
- function lotus_to_workbook(d, opts) {
- switch(opts.type) {
- case 'base64': return lotus_to_workbook_buf(s2a(Base64.decode(d)), opts);
- case 'binary': return lotus_to_workbook_buf(s2a(d), opts);
- case 'buffer':
- case 'array': return lotus_to_workbook_buf(d, opts);
- }
- throw "Unsupported type " + opts.type;
- }
-
- function lotus_to_workbook_buf(d, opts) {
- if(!d) return d;
- var o = opts || {};
- if(DENSE != null && o.dense == null) o.dense = DENSE;
- var s = ((o.dense ? [] : {})), n = "Sheet1", sidx = 0;
- var sheets = {}, snames = [n];
-
- var refguess = {s: {r:0, c:0}, e: {r:0, c:0} };
- var sheetRows = o.sheetRows || 0;
-
- if(d[2] == 0x02) o.Enum = WK1Enum;
- else if(d[2] == 0x1a) o.Enum = WK3Enum;
- else if(d[2] == 0x0e) { o.Enum = WK3Enum; o.qpro = true; d.l = 0; }
- else throw new Error("Unrecognized LOTUS BOF " + d[2]);
- lotushopper(d, function(val, Rn, RT) {
- if(d[2] == 0x02) switch(RT) {
- case 0x00:
- o.vers = val;
- if(val >= 0x1000) o.qpro = true;
- break;
- case 0x06: refguess = val; break; /* RANGE */
- case 0x0F: /* LABEL */
- if(!o.qpro) val[1].v = val[1].v.slice(1);
- /* falls through */
- case 0x0D: /* INTEGER */
- case 0x0E: /* NUMBER */
- case 0x10: /* FORMULA */
- case 0x33: /* STRING */
- /* TODO: actual translation of the format code */
- if(RT == 0x0E && (val[2] & 0x70) == 0x70 && (val[2] & 0x0F) > 1 && (val[2] & 0x0F) < 15) {
- val[1].z = o.dateNF || SSF._table[14];
- if(o.cellDates) { val[1].t = 'd'; val[1].v = numdate(val[1].v); }
- }
- if(o.dense) {
- if(!s[val[0].r]) s[val[0].r] = [];
- s[val[0].r][val[0].c] = val[1];
- } else s[encode_cell(val[0])] = val[1];
- break;
- } else switch(RT) {
- case 0x16: /* LABEL16 */
- val[1].v = val[1].v.slice(1);
- /* falls through */
- case 0x17: /* NUMBER17 */
- case 0x18: /* NUMBER18 */
- case 0x19: /* FORMULA19 */
- case 0x25: /* NUMBER25 */
- case 0x27: /* NUMBER27 */
- case 0x28: /* FORMULA28 */
- if(val[3] > sidx) {
- s["!ref"] = encode_range(refguess);
- sheets[n] = s;
- s = (o.dense ? [] : {});
- refguess = {s: {r:0, c:0}, e: {r:0, c:0} };
- sidx = val[3]; n = "Sheet" + (sidx + 1);
- snames.push(n);
- }
- if(sheetRows > 0 && val[0].r >= sheetRows) break;
- if(o.dense) {
- if(!s[val[0].r]) s[val[0].r] = [];
- s[val[0].r][val[0].c] = val[1];
- } else s[encode_cell(val[0])] = val[1];
- if(refguess.e.c < val[0].c) refguess.e.c = val[0].c;
- if(refguess.e.r < val[0].r) refguess.e.r = val[0].r;
- break;
- default: break;
- }
- }, o);
-
- s["!ref"] = encode_range(refguess);
- sheets[n] = s;
- return { SheetNames: snames, Sheets:sheets };
- }
-
- function parse_RANGE(blob) {
- var o = {s:{c:0,r:0},e:{c:0,r:0}};
- o.s.c = blob.read_shift(2);
- o.s.r = blob.read_shift(2);
- o.e.c = blob.read_shift(2);
- o.e.r = blob.read_shift(2);
- if(o.s.c == 0xFFFF) o.s.c = o.e.c = o.s.r = o.e.r = 0;
- return o;
- }
-
- function parse_cell(blob, length, opts) {
- var o = [{c:0,r:0}, {t:'n',v:0}, 0];
- if(opts.qpro && opts.vers != 0x5120) {
- o[0].c = blob.read_shift(1);
- blob.l++;
- o[0].r = blob.read_shift(2);
- blob.l+=2;
- } else {
- o[2] = blob.read_shift(1);
- o[0].c = blob.read_shift(2); o[0].r = blob.read_shift(2);
- }
- return o;
- }
-
- function parse_LABEL(blob, length, opts) {
- var tgt = blob.l + length;
- var o = parse_cell(blob, length, opts);
- o[1].t = 's';
- if(opts.vers == 0x5120) {
- blob.l++;
- var len = blob.read_shift(1);
- o[1].v = blob.read_shift(len, 'utf8');
- return o;
- }
- if(opts.qpro) blob.l++;
- o[1].v = blob.read_shift(tgt - blob.l, 'cstr');
- return o;
- }
-
- function parse_INTEGER(blob, length, opts) {
- var o = parse_cell(blob, length, opts);
- o[1].v = blob.read_shift(2, 'i');
- return o;
- }
-
- function parse_NUMBER(blob, length, opts) {
- var o = parse_cell(blob, length, opts);
- o[1].v = blob.read_shift(8, 'f');
- return o;
- }
-
- function parse_FORMULA(blob, length, opts) {
- var tgt = blob.l + length;
- var o = parse_cell(blob, length, opts);
- /* TODO: formula */
- o[1].v = blob.read_shift(8, 'f');
- if(opts.qpro) blob.l = tgt;
- else {
- var flen = blob.read_shift(2);
- blob.l += flen;
- }
- return o;
- }
-
- function parse_cell_3(blob) {
- var o = [{c:0,r:0}, {t:'n',v:0}, 0];
- o[0].r = blob.read_shift(2); o[3] = blob[blob.l++]; o[0].c = blob[blob.l++];
- return o;
- }
-
- function parse_LABEL_16(blob, length) {
- var o = parse_cell_3(blob, length);
- o[1].t = 's';
- o[1].v = blob.read_shift(length - 4, 'cstr');
- return o;
- }
-
- function parse_NUMBER_18(blob, length) {
- var o = parse_cell_3(blob, length);
- o[1].v = blob.read_shift(2);
- var v = o[1].v >> 1;
- /* TODO: figure out all of the corner cases */
- if(o[1].v & 0x1) {
- switch(v & 0x07) {
- case 1: v = (v >> 3) * 500; break;
- case 2: v = (v >> 3) / 20; break;
- case 4: v = (v >> 3) / 2000; break;
- case 6: v = (v >> 3) / 16; break;
- case 7: v = (v >> 3) / 64; break;
- default: throw "unknown NUMBER_18 encoding " + (v & 0x07);
- }
- }
- o[1].v = v;
- return o;
- }
-
- function parse_NUMBER_17(blob, length) {
- var o = parse_cell_3(blob, length);
- var v1 = blob.read_shift(4);
- var v2 = blob.read_shift(4);
- var e = blob.read_shift(2);
- if(e == 0xFFFF) { o[1].v = 0; return o; }
- var s = e & 0x8000; e = (e&0x7FFF) - 16446;
- o[1].v = (s*2 - 1) * ((e > 0 ? (v2 << e) : (v2 >>> -e)) + (e > -32 ? (v1 << (e + 32)) : (v1 >>> -(e + 32))));
- return o;
- }
-
- function parse_FORMULA_19(blob, length) {
- var o = parse_NUMBER_17(blob, 14);
- blob.l += length - 14; /* TODO: formula */
- return o;
- }
-
- function parse_NUMBER_25(blob, length) {
- var o = parse_cell_3(blob, length);
- var v1 = blob.read_shift(4);
- o[1].v = v1 >> 6;
- return o;
- }
-
- function parse_NUMBER_27(blob, length) {
- var o = parse_cell_3(blob, length);
- var v1 = blob.read_shift(8,'f');
- o[1].v = v1;
- return o;
- }
-
- function parse_FORMULA_28(blob, length) {
- var o = parse_NUMBER_27(blob, 14);
- blob.l += length - 10; /* TODO: formula */
- return o;
- }
-
- var WK1Enum = {
- 0x0000: { n:"BOF", f:parseuint16 },
- 0x0001: { n:"EOF" },
- 0x0002: { n:"CALCMODE" },
- 0x0003: { n:"CALCORDER" },
- 0x0004: { n:"SPLIT" },
- 0x0005: { n:"SYNC" },
- 0x0006: { n:"RANGE", f:parse_RANGE },
- 0x0007: { n:"WINDOW1" },
- 0x0008: { n:"COLW1" },
- 0x0009: { n:"WINTWO" },
- 0x000A: { n:"COLW2" },
- 0x000B: { n:"NAME" },
- 0x000C: { n:"BLANK" },
- 0x000D: { n:"INTEGER", f:parse_INTEGER },
- 0x000E: { n:"NUMBER", f:parse_NUMBER },
- 0x000F: { n:"LABEL", f:parse_LABEL },
- 0x0010: { n:"FORMULA", f:parse_FORMULA },
- 0x0018: { n:"TABLE" },
- 0x0019: { n:"ORANGE" },
- 0x001A: { n:"PRANGE" },
- 0x001B: { n:"SRANGE" },
- 0x001C: { n:"FRANGE" },
- 0x001D: { n:"KRANGE1" },
- 0x0020: { n:"HRANGE" },
- 0x0023: { n:"KRANGE2" },
- 0x0024: { n:"PROTEC" },
- 0x0025: { n:"FOOTER" },
- 0x0026: { n:"HEADER" },
- 0x0027: { n:"SETUP" },
- 0x0028: { n:"MARGINS" },
- 0x0029: { n:"LABELFMT" },
- 0x002A: { n:"TITLES" },
- 0x002B: { n:"SHEETJS" },
- 0x002D: { n:"GRAPH" },
- 0x002E: { n:"NGRAPH" },
- 0x002F: { n:"CALCCOUNT" },
- 0x0030: { n:"UNFORMATTED" },
- 0x0031: { n:"CURSORW12" },
- 0x0032: { n:"WINDOW" },
- 0x0033: { n:"STRING", f:parse_LABEL },
- 0x0037: { n:"PASSWORD" },
- 0x0038: { n:"LOCKED" },
- 0x003C: { n:"QUERY" },
- 0x003D: { n:"QUERYNAME" },
- 0x003E: { n:"PRINT" },
- 0x003F: { n:"PRINTNAME" },
- 0x0040: { n:"GRAPH2" },
- 0x0041: { n:"GRAPHNAME" },
- 0x0042: { n:"ZOOM" },
- 0x0043: { n:"SYMSPLIT" },
- 0x0044: { n:"NSROWS" },
- 0x0045: { n:"NSCOLS" },
- 0x0046: { n:"RULER" },
- 0x0047: { n:"NNAME" },
- 0x0048: { n:"ACOMM" },
- 0x0049: { n:"AMACRO" },
- 0x004A: { n:"PARSE" },
- 0x00FF: { n:"", f:parsenoop }
- };
-
- var WK3Enum = {
- 0x0000: { n:"BOF" },
- 0x0001: { n:"EOF" },
- 0x0003: { n:"??" },
- 0x0004: { n:"??" },
- 0x0005: { n:"??" },
- 0x0006: { n:"??" },
- 0x0007: { n:"??" },
- 0x0009: { n:"??" },
- 0x000a: { n:"??" },
- 0x000b: { n:"??" },
- 0x000c: { n:"??" },
- 0x000e: { n:"??" },
- 0x000f: { n:"??" },
- 0x0010: { n:"??" },
- 0x0011: { n:"??" },
- 0x0012: { n:"??" },
- 0x0013: { n:"??" },
- 0x0015: { n:"??" },
- 0x0016: { n:"LABEL16", f:parse_LABEL_16},
- 0x0017: { n:"NUMBER17", f:parse_NUMBER_17 },
- 0x0018: { n:"NUMBER18", f:parse_NUMBER_18 },
- 0x0019: { n:"FORMULA19", f:parse_FORMULA_19},
- 0x001a: { n:"??" },
- 0x001b: { n:"??" },
- 0x001c: { n:"??" },
- 0x001d: { n:"??" },
- 0x001e: { n:"??" },
- 0x001f: { n:"??" },
- 0x0021: { n:"??" },
- 0x0025: { n:"NUMBER25", f:parse_NUMBER_25 },
- 0x0027: { n:"NUMBER27", f:parse_NUMBER_27 },
- 0x0028: { n:"FORMULA28", f:parse_FORMULA_28 },
- 0x00FF: { n:"", f:parsenoop }
- };
- return {
- to_workbook: lotus_to_workbook
- };
- })();
- /* 18.4.7 rPr CT_RPrElt */
- function parse_rpr(rpr) {
- var font = {}, m = rpr.match(tagregex), i = 0;
- var pass = false;
- if(m) for(;i!=m.length; ++i) {
- var y = parsexmltag(m[i]);
- switch(y[0].replace(/\w*:/g,"")) {
- /* 18.8.12 condense CT_BooleanProperty */
- /* ** not required . */
- case '<condense': break;
- /* 18.8.17 extend CT_BooleanProperty */
- /* ** not required . */
- case '<extend': break;
- /* 18.8.36 shadow CT_BooleanProperty */
- /* ** not required . */
- case '<shadow':
- if(!y.val) break;
- /* falls through */
- case '<shadow>':
- case '<shadow/>': font.shadow = 1; break;
- case '</shadow>': break;
-
- /* 18.4.1 charset CT_IntProperty TODO */
- case '<charset':
- if(y.val == '1') break;
- font.cp = CS2CP[parseInt(y.val, 10)];
- break;
-
- /* 18.4.2 outline CT_BooleanProperty TODO */
- case '<outline':
- if(!y.val) break;
- /* falls through */
- case '<outline>':
- case '<outline/>': font.outline = 1; break;
- case '</outline>': break;
-
- /* 18.4.5 rFont CT_FontName */
- case '<rFont': font.name = y.val; break;
-
- /* 18.4.11 sz CT_FontSize */
- case '<sz': font.sz = y.val; break;
-
- /* 18.4.10 strike CT_BooleanProperty */
- case '<strike':
- if(!y.val) break;
- /* falls through */
- case '<strike>':
- case '<strike/>': font.strike = 1; break;
- case '</strike>': break;
-
- /* 18.4.13 u CT_UnderlineProperty */
- case '<u':
- if(!y.val) break;
- switch(y.val) {
- case 'double': font.uval = "double"; break;
- case 'singleAccounting': font.uval = "single-accounting"; break;
- case 'doubleAccounting': font.uval = "double-accounting"; break;
- }
- /* falls through */
- case '<u>':
- case '<u/>': font.u = 1; break;
- case '</u>': break;
-
- /* 18.8.2 b */
- case '<b':
- if(y.val == '0') break;
- /* falls through */
- case '<b>':
- case '<b/>': font.b = 1; break;
- case '</b>': break;
-
- /* 18.8.26 i */
- case '<i':
- if(y.val == '0') break;
- /* falls through */
- case '<i>':
- case '<i/>': font.i = 1; break;
- case '</i>': break;
-
- /* 18.3.1.15 color CT_Color TODO: tint, theme, auto, indexed */
- case '<color':
- if(y.rgb) font.color = y.rgb.slice(2,8);
- break;
-
- /* 18.8.18 family ST_FontFamily */
- case '<family': font.family = y.val; break;
-
- /* 18.4.14 vertAlign CT_VerticalAlignFontProperty TODO */
- case '<vertAlign': font.valign = y.val; break;
-
- /* 18.8.35 scheme CT_FontScheme TODO */
- case '<scheme': break;
-
- /* 18.2.10 extLst CT_ExtensionList ? */
- case '<extLst': case '<extLst>': case '</extLst>': break;
- case '<ext': pass = true; break;
- case '</ext>': pass = false; break;
- default:
- if(y[0].charCodeAt(1) !== 47 && !pass) throw new Error('Unrecognized rich format ' + y[0]);
- }
- }
- return font;
- }
-
- var parse_rs = (function() {
- var tregex = matchtag("t"), rpregex = matchtag("rPr");
- /* 18.4.4 r CT_RElt */
- function parse_r(r) {
- /* 18.4.12 t ST_Xstring */
- var t = r.match(tregex)/*, cp = 65001*/;
- if(!t) return {t:"s", v:""};
-
- var o = ({t:'s', v:unescapexml(t[1])});
- var rpr = r.match(rpregex);
- if(rpr) o.s = parse_rpr(rpr[1]);
- return o;
- }
- var rregex = /<(?:\w+:)?r>/g, rend = /<\/(?:\w+:)?r>/;
- return function parse_rs(rs) {
- return rs.replace(rregex,"").split(rend).map(parse_r).filter(function(r) { return r.v; });
- };
- })();
-
-
- /* Parse a list of <r> tags */
- var rs_to_html = (function parse_rs_factory() {
- var nlregex = /(\r\n|\n)/g;
- function parse_rpr2(font, intro, outro) {
- var style = [];
-
- if(font.u) style.push("text-decoration: underline;");
- if(font.uval) style.push("text-underline-style:" + font.uval + ";");
- if(font.sz) style.push("font-size:" + font.sz + "pt;");
- if(font.outline) style.push("text-effect: outline;");
- if(font.shadow) style.push("text-shadow: auto;");
- intro.push('<span style="' + style.join("") + '">');
-
- if(font.b) { intro.push("<b>"); outro.push("</b>"); }
- if(font.i) { intro.push("<i>"); outro.push("</i>"); }
- if(font.strike) { intro.push("<s>"); outro.push("</s>"); }
-
- var align = font.valign || "";
- if(align == "superscript" || align == "super") align = "sup";
- else if(align == "subscript") align = "sub";
- if(align != "") { intro.push("<" + align + ">"); outro.push("</" + align + ">"); }
-
- outro.push("</span>");
- return font;
- }
-
- /* 18.4.4 r CT_RElt */
- function r_to_html(r) {
- var terms = [[],r.v,[]];
- if(!r.v) return "";
-
- if(r.s) parse_rpr2(r.s, terms[0], terms[2]);
-
- return terms[0].join("") + terms[1].replace(nlregex,'<br/>') + terms[2].join("");
- }
-
- return function parse_rs(rs) {
- return rs.map(r_to_html).join("");
- };
- })();
-
- /* 18.4.8 si CT_Rst */
- var sitregex = /<(?:\w+:)?t[^>]*>([^<]*)<\/(?:\w+:)?t>/g, sirregex = /<(?:\w+:)?r>/;
- var sirphregex = /<(?:\w+:)?rPh.*?>([\s\S]*?)<\/(?:\w+:)?rPh>/g;
- function parse_si(x, opts) {
- var html = opts ? opts.cellHTML : true;
- var z = {};
- if(!x) return { t: "" };
- //var y;
- /* 18.4.12 t ST_Xstring (Plaintext String) */
- // TODO: is whitespace actually valid here?
- if(x.match(/^\s*<(?:\w+:)?t[^>]*>/)) {
- z.t = unescapexml(utf8read(x.slice(x.indexOf(">")+1).split(/<\/(?:\w+:)?t>/)[0]||""));
- z.r = utf8read(x);
- if(html) z.h = escapehtml(z.t);
- }
- /* 18.4.4 r CT_RElt (Rich Text Run) */
- else if((/*y = */x.match(sirregex))) {
- z.r = utf8read(x);
- z.t = unescapexml(utf8read((x.replace(sirphregex, '').match(sitregex)||[]).join("").replace(tagregex,"")));
- if(html) z.h = rs_to_html(parse_rs(z.r));
- }
- /* 18.4.3 phoneticPr CT_PhoneticPr (TODO: needed for Asian support) */
- /* 18.4.6 rPh CT_PhoneticRun (TODO: needed for Asian support) */
- return z;
- }
-
- /* 18.4 Shared String Table */
- var sstr0 = /<(?:\w+:)?sst([^>]*)>([\s\S]*)<\/(?:\w+:)?sst>/;
- var sstr1 = /<(?:\w+:)?(?:si|sstItem)>/g;
- var sstr2 = /<\/(?:\w+:)?(?:si|sstItem)>/;
- function parse_sst_xml(data, opts) {
- var s = ([]), ss = "";
- if(!data) return s;
- /* 18.4.9 sst CT_Sst */
- var sst = data.match(sstr0);
- if(sst) {
- ss = sst[2].replace(sstr1,"").split(sstr2);
- for(var i = 0; i != ss.length; ++i) {
- var o = parse_si(ss[i].trim(), opts);
- if(o != null) s[s.length] = o;
- }
- sst = parsexmltag(sst[1]); s.Count = sst.count; s.Unique = sst.uniqueCount;
- }
- return s;
- }
-
- RELS.SST = "http://schemas.openxmlformats.org/officeDocument/2006/relationships/sharedStrings";
- var straywsregex = /^\s|\s$|[\t\n\r]/;
- function write_sst_xml(sst, opts) {
- if(!opts.bookSST) return "";
- var o = [XML_HEADER];
- o[o.length] = (writextag('sst', null, {
- xmlns: XMLNS.main[0],
- count: sst.Count,
- uniqueCount: sst.Unique
- }));
- for(var i = 0; i != sst.length; ++i) { if(sst[i] == null) continue;
- var s = sst[i];
- var sitag = "<si>";
- if(s.r) sitag += s.r;
- else {
- sitag += "<t";
- if(!s.t) s.t = "";
- if(s.t.match(straywsregex)) sitag += ' xml:space="preserve"';
- sitag += ">" + escapexml(s.t) + "</t>";
- }
- sitag += "</si>";
- o[o.length] = (sitag);
- }
- if(o.length>2){ o[o.length] = ('</sst>'); o[1]=o[1].replace("/>",">"); }
- return o.join("");
- }
- /* [MS-XLSB] 2.4.221 BrtBeginSst */
- function parse_BrtBeginSst(data) {
- return [data.read_shift(4), data.read_shift(4)];
- }
-
- /* [MS-XLSB] 2.1.7.45 Shared Strings */
- function parse_sst_bin(data, opts) {
- var s = ([]);
- var pass = false;
- recordhopper(data, function hopper_sst(val, R_n, RT) {
- switch(RT) {
- case 0x009F: /* 'BrtBeginSst' */
- s.Count = val[0]; s.Unique = val[1]; break;
- case 0x0013: /* 'BrtSSTItem' */
- s.push(val); break;
- case 0x00A0: /* 'BrtEndSst' */
- return true;
-
- case 0x0023: /* 'BrtFRTBegin' */
- pass = true; break;
- case 0x0024: /* 'BrtFRTEnd' */
- pass = false; break;
-
- default:
- if(R_n.indexOf("Begin") > 0){/* empty */}
- else if(R_n.indexOf("End") > 0){/* empty */}
- if(!pass || opts.WTF) throw new Error("Unexpected record " + RT + " " + R_n);
- }
- });
- return s;
- }
-
- function write_BrtBeginSst(sst, o) {
- if(!o) o = new_buf(8);
- o.write_shift(4, sst.Count);
- o.write_shift(4, sst.Unique);
- return o;
- }
-
- var write_BrtSSTItem = write_RichStr;
-
- function write_sst_bin(sst) {
- var ba = buf_array();
- write_record(ba, "BrtBeginSst", write_BrtBeginSst(sst));
- for(var i = 0; i < sst.length; ++i) write_record(ba, "BrtSSTItem", write_BrtSSTItem(sst[i]));
- /* FRTSST */
- write_record(ba, "BrtEndSst");
- return ba.end();
- }
- function _JS2ANSI(str) {
- if(typeof cptable !== 'undefined') return cptable.utils.encode(current_ansi, str);
- var o = [], oo = str.split("");
- for(var i = 0; i < oo.length; ++i) o[i] = oo[i].charCodeAt(0);
- return o;
- }
-
- /* [MS-OFFCRYPTO] 2.1.4 Version */
- function parse_CRYPTOVersion(blob, length) {
- var o = {};
- o.Major = blob.read_shift(2);
- o.Minor = blob.read_shift(2);
- if(length >= 4) blob.l += length - 4;
- return o;
- }
-
- /* [MS-OFFCRYPTO] 2.1.5 DataSpaceVersionInfo */
- function parse_DataSpaceVersionInfo(blob) {
- var o = {};
- o.id = blob.read_shift(0, 'lpp4');
- o.R = parse_CRYPTOVersion(blob, 4);
- o.U = parse_CRYPTOVersion(blob, 4);
- o.W = parse_CRYPTOVersion(blob, 4);
- return o;
- }
-
- /* [MS-OFFCRYPTO] 2.1.6.1 DataSpaceMapEntry Structure */
- function parse_DataSpaceMapEntry(blob) {
- var len = blob.read_shift(4);
- var end = blob.l + len - 4;
- var o = {};
- var cnt = blob.read_shift(4);
- var comps = [];
- /* [MS-OFFCRYPTO] 2.1.6.2 DataSpaceReferenceComponent Structure */
- while(cnt-- > 0) comps.push({ t: blob.read_shift(4), v: blob.read_shift(0, 'lpp4') });
- o.name = blob.read_shift(0, 'lpp4');
- o.comps = comps;
- if(blob.l != end) throw new Error("Bad DataSpaceMapEntry: " + blob.l + " != " + end);
- return o;
- }
-
- /* [MS-OFFCRYPTO] 2.1.6 DataSpaceMap */
- function parse_DataSpaceMap(blob) {
- var o = [];
- blob.l += 4; // must be 0x8
- var cnt = blob.read_shift(4);
- while(cnt-- > 0) o.push(parse_DataSpaceMapEntry(blob));
- return o;
- }
-
- /* [MS-OFFCRYPTO] 2.1.7 DataSpaceDefinition */
- function parse_DataSpaceDefinition(blob) {
- var o = [];
- blob.l += 4; // must be 0x8
- var cnt = blob.read_shift(4);
- while(cnt-- > 0) o.push(blob.read_shift(0, 'lpp4'));
- return o;
- }
-
- /* [MS-OFFCRYPTO] 2.1.8 DataSpaceDefinition */
- function parse_TransformInfoHeader(blob) {
- var o = {};
- /*var len = */blob.read_shift(4);
- blob.l += 4; // must be 0x1
- o.id = blob.read_shift(0, 'lpp4');
- o.name = blob.read_shift(0, 'lpp4');
- o.R = parse_CRYPTOVersion(blob, 4);
- o.U = parse_CRYPTOVersion(blob, 4);
- o.W = parse_CRYPTOVersion(blob, 4);
- return o;
- }
-
- function parse_Primary(blob) {
- /* [MS-OFFCRYPTO] 2.2.6 IRMDSTransformInfo */
- var hdr = parse_TransformInfoHeader(blob);
- /* [MS-OFFCRYPTO] 2.1.9 EncryptionTransformInfo */
- hdr.ename = blob.read_shift(0, '8lpp4');
- hdr.blksz = blob.read_shift(4);
- hdr.cmode = blob.read_shift(4);
- if(blob.read_shift(4) != 0x04) throw new Error("Bad !Primary record");
- return hdr;
- }
-
- /* [MS-OFFCRYPTO] 2.3.2 Encryption Header */
- function parse_EncryptionHeader(blob, length) {
- var tgt = blob.l + length;
- var o = {};
- o.Flags = (blob.read_shift(4) & 0x3F);
- blob.l += 4;
- o.AlgID = blob.read_shift(4);
- var valid = false;
- switch(o.AlgID) {
- case 0x660E: case 0x660F: case 0x6610: valid = (o.Flags == 0x24); break;
- case 0x6801: valid = (o.Flags == 0x04); break;
- case 0: valid = (o.Flags == 0x10 || o.Flags == 0x04 || o.Flags == 0x24); break;
- default: throw 'Unrecognized encryption algorithm: ' + o.AlgID;
- }
- if(!valid) throw new Error("Encryption Flags/AlgID mismatch");
- o.AlgIDHash = blob.read_shift(4);
- o.KeySize = blob.read_shift(4);
- o.ProviderType = blob.read_shift(4);
- blob.l += 8;
- o.CSPName = blob.read_shift((tgt-blob.l)>>1, 'utf16le');
- blob.l = tgt;
- return o;
- }
-
- /* [MS-OFFCRYPTO] 2.3.3 Encryption Verifier */
- function parse_EncryptionVerifier(blob, length) {
- var o = {}, tgt = blob.l + length;
- blob.l += 4; // SaltSize must be 0x10
- o.Salt = blob.slice(blob.l, blob.l+16); blob.l += 16;
- o.Verifier = blob.slice(blob.l, blob.l+16); blob.l += 16;
- /*var sz = */blob.read_shift(4);
- o.VerifierHash = blob.slice(blob.l, tgt); blob.l = tgt;
- return o;
- }
-
- /* [MS-OFFCRYPTO] 2.3.4.* EncryptionInfo Stream */
- function parse_EncryptionInfo(blob) {
- var vers = parse_CRYPTOVersion(blob);
- switch(vers.Minor) {
- case 0x02: return [vers.Minor, parse_EncInfoStd(blob, vers)];
- case 0x03: return [vers.Minor, parse_EncInfoExt(blob, vers)];
- case 0x04: return [vers.Minor, parse_EncInfoAgl(blob, vers)];
- }
- throw new Error("ECMA-376 Encrypted file unrecognized Version: " + vers.Minor);
- }
-
- /* [MS-OFFCRYPTO] 2.3.4.5 EncryptionInfo Stream (Standard Encryption) */
- function parse_EncInfoStd(blob) {
- var flags = blob.read_shift(4);
- if((flags & 0x3F) != 0x24) throw new Error("EncryptionInfo mismatch");
- var sz = blob.read_shift(4);
- //var tgt = blob.l + sz;
- var hdr = parse_EncryptionHeader(blob, sz);
- var verifier = parse_EncryptionVerifier(blob, blob.length - blob.l);
- return { t:"Std", h:hdr, v:verifier };
- }
- /* [MS-OFFCRYPTO] 2.3.4.6 EncryptionInfo Stream (Extensible Encryption) */
- function parse_EncInfoExt() { throw new Error("File is password-protected: ECMA-376 Extensible"); }
- /* [MS-OFFCRYPTO] 2.3.4.10 EncryptionInfo Stream (Agile Encryption) */
- function parse_EncInfoAgl(blob) {
- var KeyData = ["saltSize","blockSize","keyBits","hashSize","cipherAlgorithm","cipherChaining","hashAlgorithm","saltValue"];
- blob.l+=4;
- var xml = blob.read_shift(blob.length - blob.l, 'utf8');
- var o = {};
- xml.replace(tagregex, function xml_agile(x) {
- var y = parsexmltag(x);
- switch(strip_ns(y[0])) {
- case '<?xml': break;
- case '<encryption': case '</encryption>': break;
- case '<keyData': KeyData.forEach(function(k) { o[k] = y[k]; }); break;
- case '<dataIntegrity': o.encryptedHmacKey = y.encryptedHmacKey; o.encryptedHmacValue = y.encryptedHmacValue; break;
- case '<keyEncryptors>': case '<keyEncryptors': o.encs = []; break;
- case '</keyEncryptors>': break;
-
- case '<keyEncryptor': o.uri = y.uri; break;
- case '</keyEncryptor>': break;
- case '<encryptedKey': o.encs.push(y); break;
- default: throw y[0];
- }
- });
- return o;
- }
-
- /* [MS-OFFCRYPTO] 2.3.5.1 RC4 CryptoAPI Encryption Header */
- function parse_RC4CryptoHeader(blob, length) {
- var o = {};
- var vers = o.EncryptionVersionInfo = parse_CRYPTOVersion(blob, 4); length -= 4;
- if(vers.Minor != 2) throw new Error('unrecognized minor version code: ' + vers.Minor);
- if(vers.Major > 4 || vers.Major < 2) throw new Error('unrecognized major version code: ' + vers.Major);
- o.Flags = blob.read_shift(4); length -= 4;
- var sz = blob.read_shift(4); length -= 4;
- o.EncryptionHeader = parse_EncryptionHeader(blob, sz); length -= sz;
- o.EncryptionVerifier = parse_EncryptionVerifier(blob, length);
- return o;
- }
- /* [MS-OFFCRYPTO] 2.3.6.1 RC4 Encryption Header */
- function parse_RC4Header(blob) {
- var o = {};
- var vers = o.EncryptionVersionInfo = parse_CRYPTOVersion(blob, 4);
- if(vers.Major != 1 || vers.Minor != 1) throw 'unrecognized version code ' + vers.Major + ' : ' + vers.Minor;
- o.Salt = blob.read_shift(16);
- o.EncryptedVerifier = blob.read_shift(16);
- o.EncryptedVerifierHash = blob.read_shift(16);
- return o;
- }
-
- /* [MS-OFFCRYPTO] 2.3.7.1 Binary Document Password Verifier Derivation */
- function crypto_CreatePasswordVerifier_Method1(Password) {
- var Verifier = 0x0000, PasswordArray;
- var PasswordDecoded = _JS2ANSI(Password);
- var len = PasswordDecoded.length + 1, i, PasswordByte;
- var Intermediate1, Intermediate2, Intermediate3;
- PasswordArray = new_raw_buf(len);
- PasswordArray[0] = PasswordDecoded.length;
- for(i = 1; i != len; ++i) PasswordArray[i] = PasswordDecoded[i-1];
- for(i = len-1; i >= 0; --i) {
- PasswordByte = PasswordArray[i];
- Intermediate1 = ((Verifier & 0x4000) === 0x0000) ? 0 : 1;
- Intermediate2 = (Verifier << 1) & 0x7FFF;
- Intermediate3 = Intermediate1 | Intermediate2;
- Verifier = Intermediate3 ^ PasswordByte;
- }
- return Verifier ^ 0xCE4B;
- }
-
- /* [MS-OFFCRYPTO] 2.3.7.2 Binary Document XOR Array Initialization */
- var crypto_CreateXorArray_Method1 = (function() {
- var PadArray = [0xBB, 0xFF, 0xFF, 0xBA, 0xFF, 0xFF, 0xB9, 0x80, 0x00, 0xBE, 0x0F, 0x00, 0xBF, 0x0F, 0x00];
- var InitialCode = [0xE1F0, 0x1D0F, 0xCC9C, 0x84C0, 0x110C, 0x0E10, 0xF1CE, 0x313E, 0x1872, 0xE139, 0xD40F, 0x84F9, 0x280C, 0xA96A, 0x4EC3];
- 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];
- var Ror = function(Byte) { return ((Byte/2) | (Byte*128)) & 0xFF; };
- var XorRor = function(byte1, byte2) { return Ror(byte1 ^ byte2); };
- var CreateXorKey_Method1 = function(Password) {
- var XorKey = InitialCode[Password.length - 1];
- var CurrentElement = 0x68;
- for(var i = Password.length-1; i >= 0; --i) {
- var Char = Password[i];
- for(var j = 0; j != 7; ++j) {
- if(Char & 0x40) XorKey ^= XorMatrix[CurrentElement];
- Char *= 2; --CurrentElement;
- }
- }
- return XorKey;
- };
- return function(password) {
- var Password = _JS2ANSI(password);
- var XorKey = CreateXorKey_Method1(Password);
- var Index = Password.length;
- var ObfuscationArray = new_raw_buf(16);
- for(var i = 0; i != 16; ++i) ObfuscationArray[i] = 0x00;
- var Temp, PasswordLastChar, PadIndex;
- if((Index & 1) === 1) {
- Temp = XorKey >> 8;
- ObfuscationArray[Index] = XorRor(PadArray[0], Temp);
- --Index;
- Temp = XorKey & 0xFF;
- PasswordLastChar = Password[Password.length - 1];
- ObfuscationArray[Index] = XorRor(PasswordLastChar, Temp);
- }
- while(Index > 0) {
- --Index;
- Temp = XorKey >> 8;
- ObfuscationArray[Index] = XorRor(Password[Index], Temp);
- --Index;
- Temp = XorKey & 0xFF;
- ObfuscationArray[Index] = XorRor(Password[Index], Temp);
- }
- Index = 15;
- PadIndex = 15 - Password.length;
- while(PadIndex > 0) {
- Temp = XorKey >> 8;
- ObfuscationArray[Index] = XorRor(PadArray[PadIndex], Temp);
- --Index;
- --PadIndex;
- Temp = XorKey & 0xFF;
- ObfuscationArray[Index] = XorRor(Password[Index], Temp);
- --Index;
- --PadIndex;
- }
- return ObfuscationArray;
- };
- })();
-
- /* [MS-OFFCRYPTO] 2.3.7.3 Binary Document XOR Data Transformation Method 1 */
- var crypto_DecryptData_Method1 = function(password, Data, XorArrayIndex, XorArray, O) {
- /* If XorArray is set, use it; if O is not set, make changes in-place */
- if(!O) O = Data;
- if(!XorArray) XorArray = crypto_CreateXorArray_Method1(password);
- var Index, Value;
- for(Index = 0; Index != Data.length; ++Index) {
- Value = Data[Index];
- Value ^= XorArray[XorArrayIndex];
- Value = ((Value>>5) | (Value<<3)) & 0xFF;
- O[Index] = Value;
- ++XorArrayIndex;
- }
- return [O, XorArrayIndex, XorArray];
- };
-
- var crypto_MakeXorDecryptor = function(password) {
- var XorArrayIndex = 0, XorArray = crypto_CreateXorArray_Method1(password);
- return function(Data) {
- var O = crypto_DecryptData_Method1("", Data, XorArrayIndex, XorArray);
- XorArrayIndex = O[1];
- return O[0];
- };
- };
-
- /* 2.5.343 */
- function parse_XORObfuscation(blob, length, opts, out) {
- var o = ({ key: parseuint16(blob), verificationBytes: parseuint16(blob) });
- if(opts.password) o.verifier = crypto_CreatePasswordVerifier_Method1(opts.password);
- out.valid = o.verificationBytes === o.verifier;
- if(out.valid) out.insitu = crypto_MakeXorDecryptor(opts.password);
- return o;
- }
-
- /* 2.4.117 */
- function parse_FilePassHeader(blob, length, oo) {
- var o = oo || {}; o.Info = blob.read_shift(2); blob.l -= 2;
- if(o.Info === 1) o.Data = parse_RC4Header(blob, length);
- else o.Data = parse_RC4CryptoHeader(blob, length);
- return o;
- }
- function parse_FilePass(blob, length, opts) {
- var o = ({ Type: opts.biff >= 8 ? blob.read_shift(2) : 0 }); /* wEncryptionType */
- if(o.Type) parse_FilePassHeader(blob, length-2, o);
- else parse_XORObfuscation(blob, opts.biff >= 8 ? length : length - 2, opts, o);
- return o;
- }
-
-
- var RTF = (function() {
- function rtf_to_sheet(d, opts) {
- switch(opts.type) {
- case 'base64': return rtf_to_sheet_str(Base64.decode(d), opts);
- case 'binary': return rtf_to_sheet_str(d, opts);
- case 'buffer': return rtf_to_sheet_str(d.toString('binary'), opts);
- case 'array': return rtf_to_sheet_str(cc2str(d), opts);
- }
- throw new Error("Unrecognized type " + opts.type);
- }
-
- function rtf_to_sheet_str(str, opts) {
- var o = opts || {};
- var ws = o.dense ? ([]) : ({});
- var range = ({s: {c:0, r:0}, e: {c:0, r:0}});
-
- // TODO: parse
- if(!str.match(/\\trowd/)) throw new Error("RTF missing table");
-
- ws['!ref'] = encode_range(range);
- return ws;
- }
-
- function rtf_to_workbook(d, opts) { return sheet_to_workbook(rtf_to_sheet(d, opts), opts); }
-
- /* TODO: this is a stub */
- function sheet_to_rtf(ws) {
- var o = ["{\\rtf1\\ansi"];
- var r = safe_decode_range(ws['!ref']), cell;
- var dense = Array.isArray(ws);
- for(var R = r.s.r; R <= r.e.r; ++R) {
- o.push("\\trowd\\trautofit1");
- for(var C = r.s.c; C <= r.e.c; ++C) o.push("\\cellx" + (C+1));
- o.push("\\pard\\intbl");
- for(C = r.s.c; C <= r.e.c; ++C) {
- var coord = encode_cell({r:R,c:C});
- cell = dense ? (ws[R]||[])[C]: ws[coord];
- if(!cell || cell.v == null && (!cell.f || cell.F)) continue;
- o.push(" " + (cell.w || (format_cell(cell), cell.w)));
- o.push("\\cell");
- }
- o.push("\\pard\\intbl\\row");
- }
- return o.join("") + "}";
- }
-
- return {
- to_workbook: rtf_to_workbook,
- to_sheet: rtf_to_sheet,
- from_sheet: sheet_to_rtf
- };
- })();
- function hex2RGB(h) {
- var o = h.slice(h[0]==="#"?1:0).slice(0,6);
- return [parseInt(o.slice(0,2),16),parseInt(o.slice(2,4),16),parseInt(o.slice(4,6),16)];
- }
- function rgb2Hex(rgb) {
- for(var i=0,o=1; i!=3; ++i) o = o*256 + (rgb[i]>255?255:rgb[i]<0?0:rgb[i]);
- return o.toString(16).toUpperCase().slice(1);
- }
-
- function rgb2HSL(rgb) {
- var R = rgb[0]/255, G = rgb[1]/255, B=rgb[2]/255;
- var M = Math.max(R, G, B), m = Math.min(R, G, B), C = M - m;
- if(C === 0) return [0, 0, R];
-
- var H6 = 0, S = 0, L2 = (M + m);
- S = C / (L2 > 1 ? 2 - L2 : L2);
- switch(M){
- case R: H6 = ((G - B) / C + 6)%6; break;
- case G: H6 = ((B - R) / C + 2); break;
- case B: H6 = ((R - G) / C + 4); break;
- }
- return [H6 / 6, S, L2 / 2];
- }
-
- function hsl2RGB(hsl){
- var H = hsl[0], S = hsl[1], L = hsl[2];
- var C = S * 2 * (L < 0.5 ? L : 1 - L), m = L - C/2;
- var rgb = [m,m,m], h6 = 6*H;
-
- var X;
- if(S !== 0) switch(h6|0) {
- case 0: case 6: X = C * h6; rgb[0] += C; rgb[1] += X; break;
- case 1: X = C * (2 - h6); rgb[0] += X; rgb[1] += C; break;
- case 2: X = C * (h6 - 2); rgb[1] += C; rgb[2] += X; break;
- case 3: X = C * (4 - h6); rgb[1] += X; rgb[2] += C; break;
- case 4: X = C * (h6 - 4); rgb[2] += C; rgb[0] += X; break;
- case 5: X = C * (6 - h6); rgb[2] += X; rgb[0] += C; break;
- }
- for(var i = 0; i != 3; ++i) rgb[i] = Math.round(rgb[i]*255);
- return rgb;
- }
-
- /* 18.8.3 bgColor tint algorithm */
- function rgb_tint(hex, tint) {
- if(tint === 0) return hex;
- var hsl = rgb2HSL(hex2RGB(hex));
- if (tint < 0) hsl[2] = hsl[2] * (1 + tint);
- else hsl[2] = 1 - (1 - hsl[2]) * (1 - tint);
- return rgb2Hex(hsl2RGB(hsl));
- }
-
- /* 18.3.1.13 width calculations */
- /* [MS-OI29500] 2.1.595 Column Width & Formatting */
- var DEF_MDW = 6, MAX_MDW = 15, MIN_MDW = 1, MDW = DEF_MDW;
- function width2px(width) { return Math.floor(( width + (Math.round(128/MDW))/256 )* MDW ); }
- function px2char(px) { return (Math.floor((px - 5)/MDW * 100 + 0.5))/100; }
- function char2width(chr) { return (Math.round((chr * MDW + 5)/MDW*256))/256; }
- //function px2char_(px) { return (((px - 5)/MDW * 100 + 0.5))/100; }
- //function char2width_(chr) { return (((chr * MDW + 5)/MDW*256))/256; }
- function cycle_width(collw) { return char2width(px2char(width2px(collw))); }
- /* XLSX/XLSB/XLS specify width in units of MDW */
- function find_mdw_colw(collw) {
- var delta = Math.abs(collw - cycle_width(collw)), _MDW = MDW;
- 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; }
- MDW = _MDW;
- }
- /* XLML specifies width in terms of pixels */
- /*function find_mdw_wpx(wpx) {
- var delta = Infinity, guess = 0, _MDW = MIN_MDW;
- for(MDW=MIN_MDW; MDW<MAX_MDW; ++MDW) {
- guess = char2width_(px2char_(wpx))*256;
- guess = (guess) % 1;
- if(guess > 0.5) guess--;
- if(Math.abs(guess) < delta) { delta = Math.abs(guess); _MDW = MDW; }
- }
- MDW = _MDW;
- }*/
-
- function process_col(coll) {
- if(coll.width) {
- coll.wpx = width2px(coll.width);
- coll.wch = px2char(coll.wpx);
- coll.MDW = MDW;
- } else if(coll.wpx) {
- coll.wch = px2char(coll.wpx);
- coll.width = char2width(coll.wch);
- coll.MDW = MDW;
- } else if(typeof coll.wch == 'number') {
- coll.width = char2width(coll.wch);
- coll.wpx = width2px(coll.width);
- coll.MDW = MDW;
- }
- if(coll.customWidth) delete coll.customWidth;
- }
-
- var DEF_PPI = 96, PPI = DEF_PPI;
- function px2pt(px) { return px * 96 / PPI; }
- function pt2px(pt) { return pt * PPI / 96; }
-
- /* [MS-EXSPXML3] 2.4.54 ST_enmPattern */
- var XLMLPatternTypeMap = {
- "None": "none",
- "Solid": "solid",
- "Gray50": "mediumGray",
- "Gray75": "darkGray",
- "Gray25": "lightGray",
- "HorzStripe": "darkHorizontal",
- "VertStripe": "darkVertical",
- "ReverseDiagStripe": "darkDown",
- "DiagStripe": "darkUp",
- "DiagCross": "darkGrid",
- "ThickDiagCross": "darkTrellis",
- "ThinHorzStripe": "lightHorizontal",
- "ThinVertStripe": "lightVertical",
- "ThinReverseDiagStripe": "lightDown",
- "ThinHorzCross": "lightGrid"
- };
-
- /* 18.8.5 borders CT_Borders */
- function parse_borders(t, styles, themes, opts) {
- styles.Borders = [];
- var border = {};
- var pass = false;
- (t[0].match(tagregex)||[]).forEach(function(x) {
- var y = parsexmltag(x);
- switch(strip_ns(y[0])) {
- case '<borders': case '<borders>': case '</borders>': break;
-
- /* 18.8.4 border CT_Border */
- case '<border': case '<border>': case '<border/>':
- border = {};
- if(y.diagonalUp) border.diagonalUp = parsexmlbool(y.diagonalUp);
- if(y.diagonalDown) border.diagonalDown = parsexmlbool(y.diagonalDown);
- styles.Borders.push(border);
- break;
- case '</border>': break;
-
- /* note: not in spec, appears to be CT_BorderPr */
- case '<left/>': break;
- case '<left': case '<left>': break;
- case '</left>': break;
-
- /* note: not in spec, appears to be CT_BorderPr */
- case '<right/>': break;
- case '<right': case '<right>': break;
- case '</right>': break;
-
- /* 18.8.43 top CT_BorderPr */
- case '<top/>': break;
- case '<top': case '<top>': break;
- case '</top>': break;
-
- /* 18.8.6 bottom CT_BorderPr */
- case '<bottom/>': break;
- case '<bottom': case '<bottom>': break;
- case '</bottom>': break;
-
- /* 18.8.13 diagonal CT_BorderPr */
- case '<diagonal': case '<diagonal>': case '<diagonal/>': break;
- case '</diagonal>': break;
-
- /* 18.8.25 horizontal CT_BorderPr */
- case '<horizontal': case '<horizontal>': case '<horizontal/>': break;
- case '</horizontal>': break;
-
- /* 18.8.44 vertical CT_BorderPr */
- case '<vertical': case '<vertical>': case '<vertical/>': break;
- case '</vertical>': break;
-
- /* 18.8.37 start CT_BorderPr */
- case '<start': case '<start>': case '<start/>': break;
- case '</start>': break;
-
- /* 18.8.16 end CT_BorderPr */
- case '<end': case '<end>': case '<end/>': break;
- case '</end>': break;
-
- /* 18.8.? color CT_Color */
- case '<color': case '<color>':
- break;
- case '<color/>': case '</color>': break;
-
- /* 18.2.10 extLst CT_ExtensionList ? */
- case '<extLst': case '<extLst>': case '</extLst>': break;
- case '<ext': pass = true; break;
- case '</ext>': pass = false; break;
- default: if(opts && opts.WTF) {
- if(!pass) throw new Error('unrecognized ' + y[0] + ' in borders');
- }
- }
- });
- }
-
- /* 18.8.21 fills CT_Fills */
- function parse_fills(t, styles, themes, opts) {
- styles.Fills = [];
- var fill = {};
- var pass = false;
- (t[0].match(tagregex)||[]).forEach(function(x) {
- var y = parsexmltag(x);
- switch(strip_ns(y[0])) {
- case '<fills': case '<fills>': case '</fills>': break;
-
- /* 18.8.20 fill CT_Fill */
- case '<fill>': case '<fill': case '<fill/>':
- fill = {}; styles.Fills.push(fill); break;
- case '</fill>': break;
-
- /* 18.8.24 gradientFill CT_GradientFill */
- case '<gradientFill>': break;
- case '<gradientFill':
- case '</gradientFill>': styles.Fills.push(fill); fill = {}; break;
-
- /* 18.8.32 patternFill CT_PatternFill */
- case '<patternFill': case '<patternFill>':
- if(y.patternType) fill.patternType = y.patternType;
- break;
- case '<patternFill/>': case '</patternFill>': break;
-
- /* 18.8.3 bgColor CT_Color */
- case '<bgColor':
- if(!fill.bgColor) fill.bgColor = {};
- if(y.indexed) fill.bgColor.indexed = parseInt(y.indexed, 10);
- if(y.theme) fill.bgColor.theme = parseInt(y.theme, 10);
- if(y.tint) fill.bgColor.tint = parseFloat(y.tint);
- /* Excel uses ARGB strings */
- if(y.rgb) fill.bgColor.rgb = y.rgb.slice(-6);
- break;
- case '<bgColor/>': case '</bgColor>': break;
-
- /* 18.8.19 fgColor CT_Color */
- case '<fgColor':
- if(!fill.fgColor) fill.fgColor = {};
- if(y.theme) fill.fgColor.theme = parseInt(y.theme, 10);
- if(y.tint) fill.fgColor.tint = parseFloat(y.tint);
- /* Excel uses ARGB strings */
- if(y.rgb != null) fill.fgColor.rgb = y.rgb.slice(-6);
- break;
- case '<fgColor/>': case '</fgColor>': break;
-
- /* 18.8.38 stop CT_GradientStop */
- case '<stop': case '<stop/>': break;
- case '</stop>': break;
-
- /* 18.8.? color CT_Color */
- case '<color': case '<color/>': break;
- case '</color>': break;
-
- /* 18.2.10 extLst CT_ExtensionList ? */
- case '<extLst': case '<extLst>': case '</extLst>': break;
- case '<ext': pass = true; break;
- case '</ext>': pass = false; break;
- default: if(opts && opts.WTF) {
- if(!pass) throw new Error('unrecognized ' + y[0] + ' in fills');
- }
- }
- });
- }
-
- /* 18.8.23 fonts CT_Fonts */
- function parse_fonts(t, styles, themes, opts) {
- styles.Fonts = [];
- var font = {};
- var pass = false;
- (t[0].match(tagregex)||[]).forEach(function(x) {
- var y = parsexmltag(x);
- switch(strip_ns(y[0])) {
- case '<fonts': case '<fonts>': case '</fonts>': break;
-
- /* 18.8.22 font CT_Font */
- case '<font': case '<font>': break;
- case '</font>': case '<font/>':
- styles.Fonts.push(font);
- font = {};
- break;
-
- /* 18.8.29 name CT_FontName */
- case '<name': if(y.val) font.name = utf8read(y.val); break;
- case '<name/>': case '</name>': break;
-
- /* 18.8.2 b CT_BooleanProperty */
- case '<b': font.bold = y.val ? parsexmlbool(y.val) : 1; break;
- case '<b/>': font.bold = 1; break;
-
- /* 18.8.26 i CT_BooleanProperty */
- case '<i': font.italic = y.val ? parsexmlbool(y.val) : 1; break;
- case '<i/>': font.italic = 1; break;
-
- /* 18.4.13 u CT_UnderlineProperty */
- case '<u':
- switch(y.val) {
- case "none": font.underline = 0x00; break;
- case "single": font.underline = 0x01; break;
- case "double": font.underline = 0x02; break;
- case "singleAccounting": font.underline = 0x21; break;
- case "doubleAccounting": font.underline = 0x22; break;
- } break;
- case '<u/>': font.underline = 1; break;
-
- /* 18.4.10 strike CT_BooleanProperty */
- case '<strike': font.strike = y.val ? parsexmlbool(y.val) : 1; break;
- case '<strike/>': font.strike = 1; break;
-
- /* 18.4.2 outline CT_BooleanProperty */
- case '<outline': font.outline = y.val ? parsexmlbool(y.val) : 1; break;
- case '<outline/>': font.outline = 1; break;
-
- /* 18.8.36 shadow CT_BooleanProperty */
- case '<shadow': font.shadow = y.val ? parsexmlbool(y.val) : 1; break;
- case '<shadow/>': font.shadow = 1; break;
-
- /* 18.8.12 condense CT_BooleanProperty */
- case '<condense': font.condense = y.val ? parsexmlbool(y.val) : 1; break;
- case '<condense/>': font.condense = 1; break;
-
- /* 18.8.17 extend CT_BooleanProperty */
- case '<extend': font.extend = y.val ? parsexmlbool(y.val) : 1; break;
- case '<extend/>': font.extend = 1; break;
-
- /* 18.4.11 sz CT_FontSize */
- case '<sz': if(y.val) font.sz = +y.val; break;
- case '<sz/>': case '</sz>': break;
-
- /* 18.4.14 vertAlign CT_VerticalAlignFontProperty */
- case '<vertAlign': if(y.val) font.vertAlign = y.val; break;
- case '<vertAlign/>': case '</vertAlign>': break;
-
- /* 18.8.18 family CT_FontFamily */
- case '<family': if(y.val) font.family = parseInt(y.val,10); break;
- case '<family/>': case '</family>': break;
-
- /* 18.8.35 scheme CT_FontScheme */
- case '<scheme': if(y.val) font.scheme = y.val; break;
- case '<scheme/>': case '</scheme>': break;
-
- /* 18.4.1 charset CT_IntProperty */
- case '<charset':
- if(y.val == '1') break;
- y.codepage = CS2CP[parseInt(y.val, 10)];
- break;
-
- /* 18.?.? color CT_Color */
- case '<color':
- if(!font.color) font.color = {};
- if(y.auto) font.color.auto = parsexmlbool(y.auto);
-
- if(y.rgb) font.color.rgb = y.rgb.slice(-6);
- else if(y.indexed) {
- font.color.index = parseInt(y.indexed, 10);
- var icv = XLSIcv[font.color.index];
- if(font.color.index == 81) icv = XLSIcv[1];
- if(!icv) throw new Error(x);
- font.color.rgb = icv[0].toString(16) + icv[1].toString(16) + icv[2].toString(16);
- } else if(y.theme) {
- font.color.theme = parseInt(y.theme, 10);
- if(y.tint) font.color.tint = parseFloat(y.tint);
- if(y.theme && themes.themeElements && themes.themeElements.clrScheme) {
- font.color.rgb = rgb_tint(themes.themeElements.clrScheme[font.color.theme].rgb, font.color.tint || 0);
- }
- }
-
- break;
- case '<color/>': case '</color>': break;
-
- /* note: sometimes mc:AlternateContent appears bare */
- case '<AlternateContent': pass = true; break;
- case '</AlternateContent>': pass = false; break;
-
- /* 18.2.10 extLst CT_ExtensionList ? */
- case '<extLst': case '<extLst>': case '</extLst>': break;
- case '<ext': pass = true; break;
- case '</ext>': pass = false; break;
- default: if(opts && opts.WTF) {
- if(!pass) throw new Error('unrecognized ' + y[0] + ' in fonts');
- }
- }
- });
- }
-
- /* 18.8.31 numFmts CT_NumFmts */
- function parse_numFmts(t, styles, opts) {
- styles.NumberFmt = [];
- var k/*Array<number>*/ = (keys(SSF._table));
- for(var i=0; i < k.length; ++i) styles.NumberFmt[k[i]] = SSF._table[k[i]];
- var m = t[0].match(tagregex);
- if(!m) return;
- for(i=0; i < m.length; ++i) {
- var y = parsexmltag(m[i]);
- switch(strip_ns(y[0])) {
- case '<numFmts': case '</numFmts>': case '<numFmts/>': case '<numFmts>': break;
- case '<numFmt': {
- var f=unescapexml(utf8read(y.formatCode)), j=parseInt(y.numFmtId,10);
- styles.NumberFmt[j] = f;
- if(j>0) {
- if(j > 0x188) {
- for(j = 0x188; j > 0x3c; --j) if(styles.NumberFmt[j] == null) break;
- styles.NumberFmt[j] = f;
- }
- SSF.load(f,j);
- }
- } break;
- case '</numFmt>': break;
- default: if(opts.WTF) throw new Error('unrecognized ' + y[0] + ' in numFmts');
- }
- }
- }
-
- function write_numFmts(NF) {
- var o = ["<numFmts>"];
- [[5,8],[23,26],[41,44],[/*63*/50,/*66],[164,*/392]].forEach(function(r) {
- 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])}));
- });
- if(o.length === 1) return "";
- o[o.length] = ("</numFmts>");
- o[0] = writextag('numFmts', null, { count:o.length-2 }).replace("/>", ">");
- return o.join("");
- }
-
- /* 18.8.10 cellXfs CT_CellXfs */
- var cellXF_uint = [ "numFmtId", "fillId", "fontId", "borderId", "xfId" ];
- var cellXF_bool = [ "applyAlignment", "applyBorder", "applyFill", "applyFont", "applyNumberFormat", "applyProtection", "pivotButton", "quotePrefix" ];
- function parse_cellXfs(t, styles, opts) {
- styles.CellXf = [];
- var xf;
- var pass = false;
- (t[0].match(tagregex)||[]).forEach(function(x) {
- var y = parsexmltag(x), i = 0;
- switch(strip_ns(y[0])) {
- case '<cellXfs': case '<cellXfs>': case '<cellXfs/>': case '</cellXfs>': break;
-
- /* 18.8.45 xf CT_Xf */
- case '<xf': case '<xf/>':
- xf = y;
- delete xf[0];
- for(i = 0; i < cellXF_uint.length; ++i) if(xf[cellXF_uint[i]])
- xf[cellXF_uint[i]] = parseInt(xf[cellXF_uint[i]], 10);
- for(i = 0; i < cellXF_bool.length; ++i) if(xf[cellXF_bool[i]])
- xf[cellXF_bool[i]] = parsexmlbool(xf[cellXF_bool[i]]);
- if(xf.numFmtId > 0x188) {
- for(i = 0x188; i > 0x3c; --i) if(styles.NumberFmt[xf.numFmtId] == styles.NumberFmt[i]) { xf.numFmtId = i; break; }
- }
- styles.CellXf.push(xf); break;
- case '</xf>': break;
-
- /* 18.8.1 alignment CT_CellAlignment */
- case '<alignment': case '<alignment/>':
- var alignment = {};
- if(y.vertical) alignment.vertical = y.vertical;
- if(y.horizontal) alignment.horizontal = y.horizontal;
- if(y.textRotation != null) alignment.textRotation = y.textRotation;
- if(y.indent) alignment.indent = y.indent;
- if(y.wrapText) alignment.wrapText = parsexmlbool(y.wrapText);
- xf.alignment = alignment;
- break;
- case '</alignment>': break;
-
- /* 18.8.33 protection CT_CellProtection */
- case '<protection':
- break;
- case '</protection>': case '<protection/>': break;
-
- /* note: sometimes mc:AlternateContent appears bare */
- case '<AlternateContent': pass = true; break;
- case '</AlternateContent>': pass = false; break;
-
- /* 18.2.10 extLst CT_ExtensionList ? */
- case '<extLst': case '<extLst>': case '</extLst>': break;
- case '<ext': pass = true; break;
- case '</ext>': pass = false; break;
- default: if(opts && opts.WTF) {
- if(!pass) throw new Error('unrecognized ' + y[0] + ' in cellXfs');
- }
- }
- });
- }
-
- function write_cellXfs(cellXfs) {
- var o = [];
- o[o.length] = (writextag('cellXfs',null));
- cellXfs.forEach(function(c) {
- o[o.length] = (writextag('xf', null, c));
- });
- o[o.length] = ("</cellXfs>");
- if(o.length === 2) return "";
- o[0] = writextag('cellXfs',null, {count:o.length-2}).replace("/>",">");
- return o.join("");
- }
-
- /* 18.8 Styles CT_Stylesheet*/
- var parse_sty_xml= (function make_pstyx() {
- var numFmtRegex = /<(?:\w+:)?numFmts([^>]*)>[\S\s]*?<\/(?:\w+:)?numFmts>/;
- var cellXfRegex = /<(?:\w+:)?cellXfs([^>]*)>[\S\s]*?<\/(?:\w+:)?cellXfs>/;
- var fillsRegex = /<(?:\w+:)?fills([^>]*)>[\S\s]*?<\/(?:\w+:)?fills>/;
- var fontsRegex = /<(?:\w+:)?fonts([^>]*)>[\S\s]*?<\/(?:\w+:)?fonts>/;
- var bordersRegex = /<(?:\w+:)?borders([^>]*)>[\S\s]*?<\/(?:\w+:)?borders>/;
-
- return function parse_sty_xml(data, themes, opts) {
- var styles = {};
- if(!data) return styles;
- data = data.replace(/<!--([\s\S]*?)-->/mg,"").replace(/<!DOCTYPE[^\[]*\[[^\]]*\]>/gm,"");
- /* 18.8.39 styleSheet CT_Stylesheet */
- var t;
-
- /* 18.8.31 numFmts CT_NumFmts ? */
- if((t=data.match(numFmtRegex))) parse_numFmts(t, styles, opts);
-
- /* 18.8.23 fonts CT_Fonts ? */
- if((t=data.match(fontsRegex))) parse_fonts(t, styles, themes, opts);
-
- /* 18.8.21 fills CT_Fills ? */
- if((t=data.match(fillsRegex))) parse_fills(t, styles, themes, opts);
-
- /* 18.8.5 borders CT_Borders ? */
- if((t=data.match(bordersRegex))) parse_borders(t, styles, themes, opts);
-
- /* 18.8.9 cellStyleXfs CT_CellStyleXfs ? */
- /* 18.8.8 cellStyles CT_CellStyles ? */
-
- /* 18.8.10 cellXfs CT_CellXfs ? */
- if((t=data.match(cellXfRegex))) parse_cellXfs(t, styles, opts);
-
- /* 18.8.15 dxfs CT_Dxfs ? */
- /* 18.8.42 tableStyles CT_TableStyles ? */
- /* 18.8.11 colors CT_Colors ? */
- /* 18.2.10 extLst CT_ExtensionList ? */
-
- return styles;
- };
- })();
-
- var STYLES_XML_ROOT = writextag('styleSheet', null, {
- 'xmlns': XMLNS.main[0],
- 'xmlns:vt': XMLNS.vt
- });
-
- RELS.STY = "http://schemas.openxmlformats.org/officeDocument/2006/relationships/styles";
-
- function write_sty_xml(wb, opts) {
- var o = [XML_HEADER, STYLES_XML_ROOT], w;
- if(wb.SSF && (w = write_numFmts(wb.SSF)) != null) o[o.length] = w;
- o[o.length] = ('<fonts count="1"><font><sz val="12"/><color theme="1"/><name val="Calibri"/><family val="2"/><scheme val="minor"/></font></fonts>');
- o[o.length] = ('<fills count="2"><fill><patternFill patternType="none"/></fill><fill><patternFill patternType="gray125"/></fill></fills>');
- o[o.length] = ('<borders count="1"><border><left/><right/><top/><bottom/><diagonal/></border></borders>');
- o[o.length] = ('<cellStyleXfs count="1"><xf numFmtId="0" fontId="0" fillId="0" borderId="0"/></cellStyleXfs>');
- if((w = write_cellXfs(opts.cellXfs))) o[o.length] = (w);
- o[o.length] = ('<cellStyles count="1"><cellStyle name="Normal" xfId="0" builtinId="0"/></cellStyles>');
- o[o.length] = ('<dxfs count="0"/>');
- o[o.length] = ('<tableStyles count="0" defaultTableStyle="TableStyleMedium9" defaultPivotStyle="PivotStyleMedium4"/>');
-
- if(o.length>2){ o[o.length] = ('</styleSheet>'); o[1]=o[1].replace("/>",">"); }
- return o.join("");
- }
- /* [MS-XLSB] 2.4.657 BrtFmt */
- function parse_BrtFmt(data, length) {
- var numFmtId = data.read_shift(2);
- var stFmtCode = parse_XLWideString(data,length-2);
- return [numFmtId, stFmtCode];
- }
- function write_BrtFmt(i, f, o) {
- if(!o) o = new_buf(6 + 4 * f.length);
- o.write_shift(2, i);
- write_XLWideString(f, o);
- var out = (o.length > o.l) ? o.slice(0, o.l) : o;
- if(o.l == null) o.l = o.length;
- return out;
- }
-
- /* [MS-XLSB] 2.4.659 BrtFont TODO */
- function parse_BrtFont(data, length, opts) {
- var out = ({});
-
- out.sz = data.read_shift(2) / 20;
-
- var grbit = parse_FontFlags(data, 2, opts);
- if(grbit.fItalic) out.italic = 1;
- if(grbit.fCondense) out.condense = 1;
- if(grbit.fExtend) out.extend = 1;
- if(grbit.fShadow) out.shadow = 1;
- if(grbit.fOutline) out.outline = 1;
- if(grbit.fStrikeout) out.strike = 1;
-
- var bls = data.read_shift(2);
- if(bls === 0x02BC) out.bold = 1;
-
- switch(data.read_shift(2)) {
- /* case 0: out.vertAlign = "baseline"; break; */
- case 1: out.vertAlign = "superscript"; break;
- case 2: out.vertAlign = "subscript"; break;
- }
-
- var underline = data.read_shift(1);
- if(underline != 0) out.underline = underline;
-
- var family = data.read_shift(1);
- if(family > 0) out.family = family;
-
- var bCharSet = data.read_shift(1);
- if(bCharSet > 0) out.charset = bCharSet;
-
- data.l++;
- out.color = parse_BrtColor(data, 8);
-
- switch(data.read_shift(1)) {
- /* case 0: out.scheme = "none": break; */
- case 1: out.scheme = "major"; break;
- case 2: out.scheme = "minor"; break;
- }
-
- out.name = parse_XLWideString(data, length - 21);
-
- return out;
- }
- function write_BrtFont(font, o) {
- if(!o) o = new_buf(25+4*32);
- o.write_shift(2, font.sz * 20);
- write_FontFlags(font, o);
- o.write_shift(2, font.bold ? 0x02BC : 0x0190);
- var sss = 0;
- if(font.vertAlign == "superscript") sss = 1;
- else if(font.vertAlign == "subscript") sss = 2;
- o.write_shift(2, sss);
- o.write_shift(1, font.underline || 0);
- o.write_shift(1, font.family || 0);
- o.write_shift(1, font.charset || 0);
- o.write_shift(1, 0);
- write_BrtColor(font.color, o);
- var scheme = 0;
- if(font.scheme == "major") scheme = 1;
- if(font.scheme == "minor") scheme = 2;
- o.write_shift(1, scheme);
- write_XLWideString(font.name, o);
- return o.length > o.l ? o.slice(0, o.l) : o;
- }
-
- /* [MS-XLSB] 2.4.650 BrtFill */
- var XLSBFillPTNames = [
- "none",
- "solid",
- "mediumGray",
- "darkGray",
- "lightGray",
- "darkHorizontal",
- "darkVertical",
- "darkDown",
- "darkUp",
- "darkGrid",
- "darkTrellis",
- "lightHorizontal",
- "lightVertical",
- "lightDown",
- "lightUp",
- "lightGrid",
- "lightTrellis",
- "gray125",
- "gray0625"
- ];
- var rev_XLSBFillPTNames = (evert(XLSBFillPTNames));
- /* TODO: gradient fill representation */
- var parse_BrtFill = parsenoop;
- function write_BrtFill(fill, o) {
- if(!o) o = new_buf(4*3 + 8*7 + 16*1);
- var fls = rev_XLSBFillPTNames[fill.patternType];
- if(fls == null) fls = 0x28;
- o.write_shift(4, fls);
- var j = 0;
- if(fls != 0x28) {
- /* TODO: custom FG Color */
- write_BrtColor({auto:1}, o);
- /* TODO: custom BG Color */
- write_BrtColor({auto:1}, o);
-
- for(; j < 12; ++j) o.write_shift(4, 0);
- } else {
- for(; j < 4; ++j) o.write_shift(4, 0);
-
- for(; j < 12; ++j) o.write_shift(4, 0); /* TODO */
- /* iGradientType */
- /* xnumDegree */
- /* xnumFillToLeft */
- /* xnumFillToRight */
- /* xnumFillToTop */
- /* xnumFillToBottom */
- /* cNumStop */
- /* xfillGradientStop */
- }
- return o.length > o.l ? o.slice(0, o.l) : o;
- }
-
- /* [MS-XLSB] 2.4.824 BrtXF */
- function parse_BrtXF(data, length) {
- var tgt = data.l + length;
- var ixfeParent = data.read_shift(2);
- var ifmt = data.read_shift(2);
- data.l = tgt;
- return {ixfe:ixfeParent, numFmtId:ifmt };
- }
- function write_BrtXF(data, ixfeP, o) {
- if(!o) o = new_buf(16);
- o.write_shift(2, ixfeP||0);
- o.write_shift(2, data.numFmtId||0);
- o.write_shift(2, 0); /* iFont */
- o.write_shift(2, 0); /* iFill */
- o.write_shift(2, 0); /* ixBorder */
- o.write_shift(1, 0); /* trot */
- o.write_shift(1, 0); /* indent */
- var flow = 0;
- o.write_shift(1, flow); /* flags */
- o.write_shift(1, 0); /* flags */
- o.write_shift(1, 0); /* xfGrbitAtr */
- o.write_shift(1, 0);
- return o;
- }
-
- /* [MS-XLSB] 2.5.4 Blxf TODO */
- function write_Blxf(data, o) {
- if(!o) o = new_buf(10);
- o.write_shift(1, 0); /* dg */
- o.write_shift(1, 0);
- o.write_shift(4, 0); /* color */
- o.write_shift(4, 0); /* color */
- return o;
- }
- /* [MS-XLSB] 2.4.302 BrtBorder TODO */
- var parse_BrtBorder = parsenoop;
- function write_BrtBorder(border, o) {
- if(!o) o = new_buf(51);
- o.write_shift(1, 0); /* diagonal */
- write_Blxf(null, o); /* top */
- write_Blxf(null, o); /* bottom */
- write_Blxf(null, o); /* left */
- write_Blxf(null, o); /* right */
- write_Blxf(null, o); /* diag */
- return o.length > o.l ? o.slice(0, o.l) : o;
- }
-
- /* [MS-XLSB] 2.4.763 BrtStyle TODO */
- function write_BrtStyle(style, o) {
- if(!o) o = new_buf(12+4*10);
- o.write_shift(4, style.xfId);
- o.write_shift(2, 1);
- o.write_shift(1, +style.builtinId);
- o.write_shift(1, 0); /* iLevel */
- write_XLNullableWideString(style.name || "", o);
- return o.length > o.l ? o.slice(0, o.l) : o;
- }
-
- /* [MS-XLSB] 2.4.272 BrtBeginTableStyles */
- function write_BrtBeginTableStyles(cnt, defTableStyle, defPivotStyle) {
- var o = new_buf(4+256*2*4);
- o.write_shift(4, cnt);
- write_XLNullableWideString(defTableStyle, o);
- write_XLNullableWideString(defPivotStyle, o);
- return o.length > o.l ? o.slice(0, o.l) : o;
- }
-
- /* [MS-XLSB] 2.1.7.50 Styles */
- function parse_sty_bin(data, themes, opts) {
- var styles = {};
- styles.NumberFmt = ([]);
- for(var y in SSF._table) styles.NumberFmt[y] = SSF._table[y];
-
- styles.CellXf = [];
- styles.Fonts = [];
- var state = [];
- var pass = false;
- recordhopper(data, function hopper_sty(val, R_n, RT) {
- switch(RT) {
- case 0x002C: /* 'BrtFmt' */
- styles.NumberFmt[val[0]] = val[1]; SSF.load(val[1], val[0]);
- break;
- case 0x002B: /* 'BrtFont' */
- styles.Fonts.push(val);
- if(val.color.theme != null && themes && themes.themeElements && themes.themeElements.clrScheme) {
- val.color.rgb = rgb_tint(themes.themeElements.clrScheme[val.color.theme].rgb, val.color.tint || 0);
- }
- break;
- case 0x0401: /* 'BrtKnownFonts' */ break;
- case 0x002D: /* 'BrtFill' */
- break;
- case 0x002E: /* 'BrtBorder' */
- break;
- case 0x002F: /* 'BrtXF' */
- if(state[state.length - 1] == "BrtBeginCellXFs") {
- styles.CellXf.push(val);
- }
- break;
- case 0x0030: /* 'BrtStyle' */
- case 0x01FB: /* 'BrtDXF' */
- case 0x023C: /* 'BrtMRUColor' */
- case 0x01DB: /* 'BrtIndexedColor': */
- break;
-
- case 0x0493: /* 'BrtDXF14' */
- case 0x0836: /* 'BrtDXF15' */
- case 0x046A: /* 'BrtSlicerStyleElement' */
- case 0x0200: /* 'BrtTableStyleElement' */
- case 0x082F: /* 'BrtTimelineStyleElement' */
- case 0x0C00: /* 'BrtUid' */
- break;
-
- case 0x0023: /* 'BrtFRTBegin' */
- pass = true; break;
- case 0x0024: /* 'BrtFRTEnd' */
- pass = false; break;
- case 0x0025: /* 'BrtACBegin' */
- state.push(R_n); pass = true; break;
- case 0x0026: /* 'BrtACEnd' */
- state.pop(); pass = false; break;
-
- default:
- if((R_n||"").indexOf("Begin") > 0) state.push(R_n);
- else if((R_n||"").indexOf("End") > 0) state.pop();
- else if(!pass || (opts.WTF && state[state.length-1] != "BrtACBegin")) throw new Error("Unexpected record " + RT + " " + R_n);
- }
- });
- return styles;
- }
-
- function write_FMTS_bin(ba, NF) {
- if(!NF) return;
- var cnt = 0;
- [[5,8],[23,26],[41,44],[/*63*/50,/*66],[164,*/392]].forEach(function(r) {
- for(var i = r[0]; i <= r[1]; ++i) if(NF[i] != null) ++cnt;
- });
-
- if(cnt == 0) return;
- write_record(ba, "BrtBeginFmts", write_UInt32LE(cnt));
- [[5,8],[23,26],[41,44],[/*63*/50,/*66],[164,*/392]].forEach(function(r) {
- for(var i = r[0]; i <= r[1]; ++i) if(NF[i] != null) write_record(ba, "BrtFmt", write_BrtFmt(i, NF[i]));
- });
- write_record(ba, "BrtEndFmts");
- }
-
- function write_FONTS_bin(ba) {
- var cnt = 1;
-
- if(cnt == 0) return;
- write_record(ba, "BrtBeginFonts", write_UInt32LE(cnt));
- write_record(ba, "BrtFont", write_BrtFont({
- sz:12,
- color: {theme:1},
- name: "Calibri",
- family: 2,
- scheme: "minor"
- }));
- /* 1*65491BrtFont [ACFONTS] */
- write_record(ba, "BrtEndFonts");
- }
-
- function write_FILLS_bin(ba) {
- var cnt = 2;
-
- if(cnt == 0) return;
- write_record(ba, "BrtBeginFills", write_UInt32LE(cnt));
- write_record(ba, "BrtFill", write_BrtFill({patternType:"none"}));
- write_record(ba, "BrtFill", write_BrtFill({patternType:"gray125"}));
- /* 1*65431BrtFill */
- write_record(ba, "BrtEndFills");
- }
-
- function write_BORDERS_bin(ba) {
- var cnt = 1;
-
- if(cnt == 0) return;
- write_record(ba, "BrtBeginBorders", write_UInt32LE(cnt));
- write_record(ba, "BrtBorder", write_BrtBorder({}));
- /* 1*65430BrtBorder */
- write_record(ba, "BrtEndBorders");
- }
-
- function write_CELLSTYLEXFS_bin(ba) {
- var cnt = 1;
- write_record(ba, "BrtBeginCellStyleXFs", write_UInt32LE(cnt));
- write_record(ba, "BrtXF", write_BrtXF({
- numFmtId: 0,
- fontId: 0,
- fillId: 0,
- borderId: 0
- }, 0xFFFF));
- /* 1*65430(BrtXF *FRT) */
- write_record(ba, "BrtEndCellStyleXFs");
- }
-
- function write_CELLXFS_bin(ba, data) {
- write_record(ba, "BrtBeginCellXFs", write_UInt32LE(data.length));
- data.forEach(function(c) { write_record(ba, "BrtXF", write_BrtXF(c,0)); });
- /* 1*65430(BrtXF *FRT) */
- write_record(ba, "BrtEndCellXFs");
- }
-
- function write_STYLES_bin(ba) {
- var cnt = 1;
-
- write_record(ba, "BrtBeginStyles", write_UInt32LE(cnt));
- write_record(ba, "BrtStyle", write_BrtStyle({
- xfId:0,
- builtinId:0,
- name:"Normal"
- }));
- /* 1*65430(BrtStyle *FRT) */
- write_record(ba, "BrtEndStyles");
- }
-
- function write_DXFS_bin(ba) {
- var cnt = 0;
-
- write_record(ba, "BrtBeginDXFs", write_UInt32LE(cnt));
- /* *2147483647(BrtDXF *FRT) */
- write_record(ba, "BrtEndDXFs");
- }
-
- function write_TABLESTYLES_bin(ba) {
- var cnt = 0;
-
- write_record(ba, "BrtBeginTableStyles", write_BrtBeginTableStyles(cnt, "TableStyleMedium9", "PivotStyleMedium4"));
- /* *TABLESTYLE */
- write_record(ba, "BrtEndTableStyles");
- }
-
- function write_COLORPALETTE_bin() {
- return;
- /* BrtBeginColorPalette [INDEXEDCOLORS] [MRUCOLORS] BrtEndColorPalette */
- }
-
- /* [MS-XLSB] 2.1.7.50 Styles */
- function write_sty_bin(wb, opts) {
- var ba = buf_array();
- write_record(ba, "BrtBeginStyleSheet");
- write_FMTS_bin(ba, wb.SSF);
- write_FONTS_bin(ba, wb);
- write_FILLS_bin(ba, wb);
- write_BORDERS_bin(ba, wb);
- write_CELLSTYLEXFS_bin(ba, wb);
- write_CELLXFS_bin(ba, opts.cellXfs);
- write_STYLES_bin(ba, wb);
- write_DXFS_bin(ba, wb);
- write_TABLESTYLES_bin(ba, wb);
- write_COLORPALETTE_bin(ba, wb);
- /* FRTSTYLESHEET*/
- write_record(ba, "BrtEndStyleSheet");
- return ba.end();
- }
- RELS.THEME = "http://schemas.openxmlformats.org/officeDocument/2006/relationships/theme";
-
- /* Even though theme layout is dk1 lt1 dk2 lt2, true order is lt1 dk1 lt2 dk2 */
- var XLSXThemeClrScheme = [
- '</a:lt1>', '</a:dk1>', '</a:lt2>', '</a:dk2>',
- '</a:accent1>', '</a:accent2>', '</a:accent3>',
- '</a:accent4>', '</a:accent5>', '</a:accent6>',
- '</a:hlink>', '</a:folHlink>'
- ];
- /* 20.1.6.2 clrScheme CT_ColorScheme */
- function parse_clrScheme(t, themes, opts) {
- themes.themeElements.clrScheme = [];
- var color = {};
- (t[0].match(tagregex)||[]).forEach(function(x) {
- var y = parsexmltag(x);
- switch(y[0]) {
- /* 20.1.6.2 clrScheme (Color Scheme) CT_ColorScheme */
- case '<a:clrScheme': case '</a:clrScheme>': break;
-
- /* 20.1.2.3.32 srgbClr CT_SRgbColor */
- case '<a:srgbClr':
- color.rgb = y.val; break;
-
- /* 20.1.2.3.33 sysClr CT_SystemColor */
- case '<a:sysClr':
- color.rgb = y.lastClr; break;
-
- /* 20.1.4.1.1 accent1 (Accent 1) */
- /* 20.1.4.1.2 accent2 (Accent 2) */
- /* 20.1.4.1.3 accent3 (Accent 3) */
- /* 20.1.4.1.4 accent4 (Accent 4) */
- /* 20.1.4.1.5 accent5 (Accent 5) */
- /* 20.1.4.1.6 accent6 (Accent 6) */
- /* 20.1.4.1.9 dk1 (Dark 1) */
- /* 20.1.4.1.10 dk2 (Dark 2) */
- /* 20.1.4.1.15 folHlink (Followed Hyperlink) */
- /* 20.1.4.1.19 hlink (Hyperlink) */
- /* 20.1.4.1.22 lt1 (Light 1) */
- /* 20.1.4.1.23 lt2 (Light 2) */
- case '<a:dk1>': case '</a:dk1>':
- case '<a:lt1>': case '</a:lt1>':
- case '<a:dk2>': case '</a:dk2>':
- case '<a:lt2>': case '</a:lt2>':
- case '<a:accent1>': case '</a:accent1>':
- case '<a:accent2>': case '</a:accent2>':
- case '<a:accent3>': case '</a:accent3>':
- case '<a:accent4>': case '</a:accent4>':
- case '<a:accent5>': case '</a:accent5>':
- case '<a:accent6>': case '</a:accent6>':
- case '<a:hlink>': case '</a:hlink>':
- case '<a:folHlink>': case '</a:folHlink>':
- if (y[0].charAt(1) === '/') {
- themes.themeElements.clrScheme[XLSXThemeClrScheme.indexOf(y[0])] = color;
- color = {};
- } else {
- color.name = y[0].slice(3, y[0].length - 1);
- }
- break;
-
- default: if(opts && opts.WTF) throw new Error('Unrecognized ' + y[0] + ' in clrScheme');
- }
- });
- }
-
- /* 20.1.4.1.18 fontScheme CT_FontScheme */
- function parse_fontScheme() { }
-
- /* 20.1.4.1.15 fmtScheme CT_StyleMatrix */
- function parse_fmtScheme() { }
-
- var clrsregex = /<a:clrScheme([^>]*)>[\s\S]*<\/a:clrScheme>/;
- var fntsregex = /<a:fontScheme([^>]*)>[\s\S]*<\/a:fontScheme>/;
- var fmtsregex = /<a:fmtScheme([^>]*)>[\s\S]*<\/a:fmtScheme>/;
-
- /* 20.1.6.10 themeElements CT_BaseStyles */
- function parse_themeElements(data, themes, opts) {
- themes.themeElements = {};
-
- var t;
-
- [
- /* clrScheme CT_ColorScheme */
- ['clrScheme', clrsregex, parse_clrScheme],
- /* fontScheme CT_FontScheme */
- ['fontScheme', fntsregex, parse_fontScheme],
- /* fmtScheme CT_StyleMatrix */
- ['fmtScheme', fmtsregex, parse_fmtScheme]
- ].forEach(function(m) {
- if(!(t=data.match(m[1]))) throw new Error(m[0] + ' not found in themeElements');
- m[2](t, themes, opts);
- });
- }
-
- var themeltregex = /<a:themeElements([^>]*)>[\s\S]*<\/a:themeElements>/;
-
- /* 14.2.7 Theme Part */
- function parse_theme_xml(data, opts) {
- /* 20.1.6.9 theme CT_OfficeStyleSheet */
- if(!data || data.length === 0) return parse_theme_xml(write_theme());
-
- var t;
- var themes = {};
-
- /* themeElements CT_BaseStyles */
- if(!(t=data.match(themeltregex))) throw new Error('themeElements not found in theme');
- parse_themeElements(t[0], themes, opts);
- themes.raw = data;
- return themes;
- }
-
- function write_theme(Themes, opts) {
- if(opts && opts.themeXLSX) return opts.themeXLSX;
- if(Themes && typeof Themes.raw == "string") return Themes.raw;
- var o = [XML_HEADER];
- o[o.length] = '<a:theme xmlns:a="http://schemas.openxmlformats.org/drawingml/2006/main" name="Office Theme">';
- o[o.length] = '<a:themeElements>';
-
- o[o.length] = '<a:clrScheme name="Office">';
- o[o.length] = '<a:dk1><a:sysClr val="windowText" lastClr="000000"/></a:dk1>';
- o[o.length] = '<a:lt1><a:sysClr val="window" lastClr="FFFFFF"/></a:lt1>';
- o[o.length] = '<a:dk2><a:srgbClr val="1F497D"/></a:dk2>';
- o[o.length] = '<a:lt2><a:srgbClr val="EEECE1"/></a:lt2>';
- o[o.length] = '<a:accent1><a:srgbClr val="4F81BD"/></a:accent1>';
- o[o.length] = '<a:accent2><a:srgbClr val="C0504D"/></a:accent2>';
- o[o.length] = '<a:accent3><a:srgbClr val="9BBB59"/></a:accent3>';
- o[o.length] = '<a:accent4><a:srgbClr val="8064A2"/></a:accent4>';
- o[o.length] = '<a:accent5><a:srgbClr val="4BACC6"/></a:accent5>';
- o[o.length] = '<a:accent6><a:srgbClr val="F79646"/></a:accent6>';
- o[o.length] = '<a:hlink><a:srgbClr val="0000FF"/></a:hlink>';
- o[o.length] = '<a:folHlink><a:srgbClr val="800080"/></a:folHlink>';
- o[o.length] = '</a:clrScheme>';
-
- o[o.length] = '<a:fontScheme name="Office">';
- o[o.length] = '<a:majorFont>';
- o[o.length] = '<a:latin typeface="Cambria"/>';
- o[o.length] = '<a:ea typeface=""/>';
- o[o.length] = '<a:cs typeface=""/>';
- o[o.length] = '<a:font script="Jpan" typeface="MS Pゴシック"/>';
- o[o.length] = '<a:font script="Hang" typeface="맑은 고딕"/>';
- o[o.length] = '<a:font script="Hans" typeface="宋体"/>';
- o[o.length] = '<a:font script="Hant" typeface="新細明體"/>';
- o[o.length] = '<a:font script="Arab" typeface="Times New Roman"/>';
- o[o.length] = '<a:font script="Hebr" typeface="Times New Roman"/>';
- o[o.length] = '<a:font script="Thai" typeface="Tahoma"/>';
- o[o.length] = '<a:font script="Ethi" typeface="Nyala"/>';
- o[o.length] = '<a:font script="Beng" typeface="Vrinda"/>';
- o[o.length] = '<a:font script="Gujr" typeface="Shruti"/>';
- o[o.length] = '<a:font script="Khmr" typeface="MoolBoran"/>';
- o[o.length] = '<a:font script="Knda" typeface="Tunga"/>';
- o[o.length] = '<a:font script="Guru" typeface="Raavi"/>';
- o[o.length] = '<a:font script="Cans" typeface="Euphemia"/>';
- o[o.length] = '<a:font script="Cher" typeface="Plantagenet Cherokee"/>';
- o[o.length] = '<a:font script="Yiii" typeface="Microsoft Yi Baiti"/>';
- o[o.length] = '<a:font script="Tibt" typeface="Microsoft Himalaya"/>';
- o[o.length] = '<a:font script="Thaa" typeface="MV Boli"/>';
- o[o.length] = '<a:font script="Deva" typeface="Mangal"/>';
- o[o.length] = '<a:font script="Telu" typeface="Gautami"/>';
- o[o.length] = '<a:font script="Taml" typeface="Latha"/>';
- o[o.length] = '<a:font script="Syrc" typeface="Estrangelo Edessa"/>';
- o[o.length] = '<a:font script="Orya" typeface="Kalinga"/>';
- o[o.length] = '<a:font script="Mlym" typeface="Kartika"/>';
- o[o.length] = '<a:font script="Laoo" typeface="DokChampa"/>';
- o[o.length] = '<a:font script="Sinh" typeface="Iskoola Pota"/>';
- o[o.length] = '<a:font script="Mong" typeface="Mongolian Baiti"/>';
- o[o.length] = '<a:font script="Viet" typeface="Times New Roman"/>';
- o[o.length] = '<a:font script="Uigh" typeface="Microsoft Uighur"/>';
- o[o.length] = '<a:font script="Geor" typeface="Sylfaen"/>';
- o[o.length] = '</a:majorFont>';
- o[o.length] = '<a:minorFont>';
- o[o.length] = '<a:latin typeface="Calibri"/>';
- o[o.length] = '<a:ea typeface=""/>';
- o[o.length] = '<a:cs typeface=""/>';
- o[o.length] = '<a:font script="Jpan" typeface="MS Pゴシック"/>';
- o[o.length] = '<a:font script="Hang" typeface="맑은 고딕"/>';
- o[o.length] = '<a:font script="Hans" typeface="宋体"/>';
- o[o.length] = '<a:font script="Hant" typeface="新細明體"/>';
- o[o.length] = '<a:font script="Arab" typeface="Arial"/>';
- o[o.length] = '<a:font script="Hebr" typeface="Arial"/>';
- o[o.length] = '<a:font script="Thai" typeface="Tahoma"/>';
- o[o.length] = '<a:font script="Ethi" typeface="Nyala"/>';
- o[o.length] = '<a:font script="Beng" typeface="Vrinda"/>';
- o[o.length] = '<a:font script="Gujr" typeface="Shruti"/>';
- o[o.length] = '<a:font script="Khmr" typeface="DaunPenh"/>';
- o[o.length] = '<a:font script="Knda" typeface="Tunga"/>';
- o[o.length] = '<a:font script="Guru" typeface="Raavi"/>';
- o[o.length] = '<a:font script="Cans" typeface="Euphemia"/>';
- o[o.length] = '<a:font script="Cher" typeface="Plantagenet Cherokee"/>';
- o[o.length] = '<a:font script="Yiii" typeface="Microsoft Yi Baiti"/>';
- o[o.length] = '<a:font script="Tibt" typeface="Microsoft Himalaya"/>';
- o[o.length] = '<a:font script="Thaa" typeface="MV Boli"/>';
- o[o.length] = '<a:font script="Deva" typeface="Mangal"/>';
- o[o.length] = '<a:font script="Telu" typeface="Gautami"/>';
- o[o.length] = '<a:font script="Taml" typeface="Latha"/>';
- o[o.length] = '<a:font script="Syrc" typeface="Estrangelo Edessa"/>';
- o[o.length] = '<a:font script="Orya" typeface="Kalinga"/>';
- o[o.length] = '<a:font script="Mlym" typeface="Kartika"/>';
- o[o.length] = '<a:font script="Laoo" typeface="DokChampa"/>';
- o[o.length] = '<a:font script="Sinh" typeface="Iskoola Pota"/>';
- o[o.length] = '<a:font script="Mong" typeface="Mongolian Baiti"/>';
- o[o.length] = '<a:font script="Viet" typeface="Arial"/>';
- o[o.length] = '<a:font script="Uigh" typeface="Microsoft Uighur"/>';
- o[o.length] = '<a:font script="Geor" typeface="Sylfaen"/>';
- o[o.length] = '</a:minorFont>';
- o[o.length] = '</a:fontScheme>';
-
- o[o.length] = '<a:fmtScheme name="Office">';
- o[o.length] = '<a:fillStyleLst>';
- o[o.length] = '<a:solidFill><a:schemeClr val="phClr"/></a:solidFill>';
- o[o.length] = '<a:gradFill rotWithShape="1">';
- o[o.length] = '<a:gsLst>';
- o[o.length] = '<a:gs pos="0"><a:schemeClr val="phClr"><a:tint val="50000"/><a:satMod val="300000"/></a:schemeClr></a:gs>';
- o[o.length] = '<a:gs pos="35000"><a:schemeClr val="phClr"><a:tint val="37000"/><a:satMod val="300000"/></a:schemeClr></a:gs>';
- o[o.length] = '<a:gs pos="100000"><a:schemeClr val="phClr"><a:tint val="15000"/><a:satMod val="350000"/></a:schemeClr></a:gs>';
- o[o.length] = '</a:gsLst>';
- o[o.length] = '<a:lin ang="16200000" scaled="1"/>';
- o[o.length] = '</a:gradFill>';
- o[o.length] = '<a:gradFill rotWithShape="1">';
- o[o.length] = '<a:gsLst>';
- 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>';
- 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>';
- o[o.length] = '</a:gsLst>';
- o[o.length] = '<a:lin ang="16200000" scaled="0"/>';
- o[o.length] = '</a:gradFill>';
- o[o.length] = '</a:fillStyleLst>';
- o[o.length] = '<a:lnStyleLst>';
- 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>';
- 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>';
- 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>';
- o[o.length] = '</a:lnStyleLst>';
- o[o.length] = '<a:effectStyleLst>';
- o[o.length] = '<a:effectStyle>';
- o[o.length] = '<a:effectLst>';
- 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>';
- o[o.length] = '</a:effectLst>';
- o[o.length] = '</a:effectStyle>';
- o[o.length] = '<a:effectStyle>';
- o[o.length] = '<a:effectLst>';
- 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>';
- o[o.length] = '</a:effectLst>';
- o[o.length] = '</a:effectStyle>';
- o[o.length] = '<a:effectStyle>';
- o[o.length] = '<a:effectLst>';
- 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>';
- o[o.length] = '</a:effectLst>';
- 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>';
- o[o.length] = '<a:sp3d><a:bevelT w="63500" h="25400"/></a:sp3d>';
- o[o.length] = '</a:effectStyle>';
- o[o.length] = '</a:effectStyleLst>';
- o[o.length] = '<a:bgFillStyleLst>';
- o[o.length] = '<a:solidFill><a:schemeClr val="phClr"/></a:solidFill>';
- o[o.length] = '<a:gradFill rotWithShape="1">';
- o[o.length] = '<a:gsLst>';
- o[o.length] = '<a:gs pos="0"><a:schemeClr val="phClr"><a:tint val="40000"/><a:satMod val="350000"/></a:schemeClr></a:gs>';
- 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>';
- o[o.length] = '<a:gs pos="100000"><a:schemeClr val="phClr"><a:shade val="20000"/><a:satMod val="255000"/></a:schemeClr></a:gs>';
- o[o.length] = '</a:gsLst>';
- o[o.length] = '<a:path path="circle"><a:fillToRect l="50000" t="-80000" r="50000" b="180000"/></a:path>';
- o[o.length] = '</a:gradFill>';
- o[o.length] = '<a:gradFill rotWithShape="1">';
- o[o.length] = '<a:gsLst>';
- o[o.length] = '<a:gs pos="0"><a:schemeClr val="phClr"><a:tint val="80000"/><a:satMod val="300000"/></a:schemeClr></a:gs>';
- o[o.length] = '<a:gs pos="100000"><a:schemeClr val="phClr"><a:shade val="30000"/><a:satMod val="200000"/></a:schemeClr></a:gs>';
- o[o.length] = '</a:gsLst>';
- o[o.length] = '<a:path path="circle"><a:fillToRect l="50000" t="50000" r="50000" b="50000"/></a:path>';
- o[o.length] = '</a:gradFill>';
- o[o.length] = '</a:bgFillStyleLst>';
- o[o.length] = '</a:fmtScheme>';
- o[o.length] = '</a:themeElements>';
-
- o[o.length] = '<a:objectDefaults>';
- o[o.length] = '<a:spDef>';
- 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>';
- o[o.length] = '</a:spDef>';
- o[o.length] = '<a:lnDef>';
- 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>';
- o[o.length] = '</a:lnDef>';
- o[o.length] = '</a:objectDefaults>';
- o[o.length] = '<a:extraClrSchemeLst/>';
- o[o.length] = '</a:theme>';
- return o.join("");
- }
- /* [MS-XLS] 2.4.326 TODO: payload is a zip file */
- function parse_Theme(blob, length, opts) {
- var end = blob.l + length;
- var dwThemeVersion = blob.read_shift(4);
- if(dwThemeVersion === 124226) return;
- if(!opts.cellStyles || !jszip) { blob.l = end; return; }
- var data = blob.slice(blob.l);
- blob.l = end;
- var zip; try { zip = new jszip(data); } catch(e) { return; }
- var themeXML = getzipstr(zip, "theme/theme/theme1.xml", true);
- if(!themeXML) return;
- return parse_theme_xml(themeXML, opts);
- }
-
- /* 2.5.49 */
- function parse_ColorTheme(blob) { return blob.read_shift(4); }
-
- /* 2.5.155 */
- function parse_FullColorExt(blob) {
- var o = {};
- o.xclrType = blob.read_shift(2);
- o.nTintShade = blob.read_shift(2);
- switch(o.xclrType) {
- case 0: blob.l += 4; break;
- case 1: o.xclrValue = parse_IcvXF(blob, 4); break;
- case 2: o.xclrValue = parse_LongRGBA(blob, 4); break;
- case 3: o.xclrValue = parse_ColorTheme(blob, 4); break;
- case 4: blob.l += 4; break;
- }
- blob.l += 8;
- return o;
- }
-
- /* 2.5.164 TODO: read 7 bits*/
- function parse_IcvXF(blob, length) {
- return parsenoop(blob, length);
- }
-
- /* 2.5.280 */
- function parse_XFExtGradient(blob, length) {
- return parsenoop(blob, length);
- }
-
- /* [MS-XLS] 2.5.108 */
- function parse_ExtProp(blob) {
- var extType = blob.read_shift(2);
- var cb = blob.read_shift(2) - 4;
- var o = [extType];
- switch(extType) {
- case 0x04: case 0x05: case 0x07: case 0x08:
- case 0x09: case 0x0A: case 0x0B: case 0x0D:
- o[1] = parse_FullColorExt(blob, cb); break;
- case 0x06: o[1] = parse_XFExtGradient(blob, cb); break;
- case 0x0E: case 0x0F: o[1] = blob.read_shift(cb === 1 ? 1 : 2); break;
- default: throw new Error("Unrecognized ExtProp type: " + extType + " " + cb);
- }
- return o;
- }
-
- /* 2.4.355 */
- function parse_XFExt(blob, length) {
- var end = blob.l + length;
- blob.l += 2;
- var ixfe = blob.read_shift(2);
- blob.l += 2;
- var cexts = blob.read_shift(2);
- var ext = [];
- while(cexts-- > 0) ext.push(parse_ExtProp(blob, end-blob.l));
- return {ixfe:ixfe, ext:ext};
- }
-
- /* xf is an XF, see parse_XFExt for xfext */
- function update_xfext(xf, xfext) {
- xfext.forEach(function(xfe) {
- switch(xfe[0]) { /* 2.5.108 extPropData */
- case 0x04: break; /* foreground color */
- case 0x05: break; /* background color */
- case 0x06: break; /* gradient fill */
- case 0x07: break; /* top cell border color */
- case 0x08: break; /* bottom cell border color */
- case 0x09: break; /* left cell border color */
- case 0x0a: break; /* right cell border color */
- case 0x0b: break; /* diagonal cell border color */
- case 0x0d: /* text color */
- break;
- case 0x0e: break; /* font scheme */
- case 0x0f: break; /* indentation level */
- }
- });
- }
-
- /* 18.6 Calculation Chain */
- function parse_cc_xml(data) {
- var d = [];
- if(!data) return d;
- var i = 1;
- (data.match(tagregex)||[]).forEach(function(x) {
- var y = parsexmltag(x);
- switch(y[0]) {
- case '<?xml': break;
- /* 18.6.2 calcChain CT_CalcChain 1 */
- case '<calcChain': case '<calcChain>': case '</calcChain>': break;
- /* 18.6.1 c CT_CalcCell 1 */
- case '<c': delete y[0]; if(y.i) i = y.i; else y.i = i; d.push(y); break;
- }
- });
- return d;
- }
-
- //function write_cc_xml(data, opts) { }
-
- /* [MS-XLSB] 2.6.4.1 */
- function parse_BrtCalcChainItem$(data) {
- var out = {};
- out.i = data.read_shift(4);
- var cell = {};
- cell.r = data.read_shift(4);
- cell.c = data.read_shift(4);
- out.r = encode_cell(cell);
- var flags = data.read_shift(1);
- if(flags & 0x2) out.l = '1';
- if(flags & 0x8) out.a = '1';
- return out;
- }
-
- /* 18.6 Calculation Chain */
- function parse_cc_bin(data, name, opts) {
- var out = [];
- var pass = false;
- recordhopper(data, function hopper_cc(val, R_n, RT) {
- switch(RT) {
- case 0x003F: /* 'BrtCalcChainItem$' */
- out.push(val); break;
-
- default:
- if((R_n||"").indexOf("Begin") > 0){/* empty */}
- else if((R_n||"").indexOf("End") > 0){/* empty */}
- else if(!pass || opts.WTF) throw new Error("Unexpected record " + RT + " " + R_n);
- }
- });
- return out;
- }
-
- //function write_cc_bin(data, opts) { }
- /* 18.14 Supplementary Workbook Data */
- function parse_xlink_xml() {
- //var opts = _opts || {};
- //if(opts.WTF) throw "XLSX External Link";
- }
-
- /* [MS-XLSB] 2.1.7.25 External Link */
- function parse_xlink_bin(data, rel, name, _opts) {
- if(!data) return data;
- var opts = _opts || {};
-
- var pass = false, end = false;
-
- recordhopper(data, function xlink_parse(val, R_n, RT) {
- if(end) return;
- switch(RT) {
- case 0x0167: /* 'BrtSupTabs' */
- case 0x016B: /* 'BrtExternTableStart' */
- case 0x016C: /* 'BrtExternTableEnd' */
- case 0x016E: /* 'BrtExternRowHdr' */
- case 0x016F: /* 'BrtExternCellBlank' */
- case 0x0170: /* 'BrtExternCellReal' */
- case 0x0171: /* 'BrtExternCellBool' */
- case 0x0172: /* 'BrtExternCellError' */
- case 0x0173: /* 'BrtExternCellString' */
- case 0x01D8: /* 'BrtExternValueMeta' */
- case 0x0241: /* 'BrtSupNameStart' */
- case 0x0242: /* 'BrtSupNameValueStart' */
- case 0x0243: /* 'BrtSupNameValueEnd' */
- case 0x0244: /* 'BrtSupNameNum' */
- case 0x0245: /* 'BrtSupNameErr' */
- case 0x0246: /* 'BrtSupNameSt' */
- case 0x0247: /* 'BrtSupNameNil' */
- case 0x0248: /* 'BrtSupNameBool' */
- case 0x0249: /* 'BrtSupNameFmla' */
- case 0x024A: /* 'BrtSupNameBits' */
- case 0x024B: /* 'BrtSupNameEnd' */
- break;
-
- case 0x0023: /* 'BrtFRTBegin' */
- pass = true; break;
- case 0x0024: /* 'BrtFRTEnd' */
- pass = false; break;
-
- default:
- if((R_n||"").indexOf("Begin") > 0){/* empty */}
- else if((R_n||"").indexOf("End") > 0){/* empty */}
- else if(!pass || opts.WTF) throw new Error("Unexpected record " + RT.toString(16) + " " + R_n);
- }
- }, opts);
- }
- /* 20.5 DrawingML - SpreadsheetML Drawing */
- RELS.IMG = "http://schemas.openxmlformats.org/officeDocument/2006/relationships/image";
- RELS.DRAW = "http://schemas.openxmlformats.org/officeDocument/2006/relationships/drawing";
-
- /* 20.5.2.35 wsDr CT_Drawing */
- function parse_drawing(data, rels) {
- if(!data) return "??";
- /*
- Chartsheet Drawing:
- - 20.5.2.35 wsDr CT_Drawing
- - 20.5.2.1 absoluteAnchor CT_AbsoluteAnchor
- - 20.5.2.16 graphicFrame CT_GraphicalObjectFrame
- - 20.1.2.2.16 graphic CT_GraphicalObject
- - 20.1.2.2.17 graphicData CT_GraphicalObjectData
- - chart reference
- the actual type is based on the URI of the graphicData
- TODO: handle embedded charts and other types of graphics
- */
- var id = (data.match(/<c:chart [^>]*r:id="([^"]*)"/)||["",""])[1];
-
- return rels['!id'][id].Target;
- }
-
- /* L.5.5.2 SpreadsheetML Comments + VML Schema */
- var _shapeid = 1024;
- function write_comments_vml(rId, comments) {
- var csize = [21600, 21600];
- /* L.5.2.1.2 Path Attribute */
- var bbox = ["m0,0l0",csize[1],csize[0],csize[1],csize[0],"0xe"].join(",");
- var o = [
- writextag("xml", null, { 'xmlns:v': XLMLNS.v, 'xmlns:o': XLMLNS.o, 'xmlns:x': XLMLNS.x, 'xmlns:mv': XLMLNS.mv }).replace(/\/>/,">"),
- writextag("o:shapelayout", writextag("o:idmap", null, {'v:ext':"edit", 'data':rId}), {'v:ext':"edit"}),
- writextag("v:shapetype", [
- writextag("v:stroke", null, {joinstyle:"miter"}),
- writextag("v:path", null, {gradientshapeok:"t", 'o:connecttype':"rect"})
- ].join(""), {id:"_x0000_t202", 'o:spt':202, coordsize:csize.join(","),path:bbox})
- ];
- while(_shapeid < rId * 1000) _shapeid += 1000;
-
- comments.forEach(function(x) {
- var c = decode_cell(x[0]);
- var fillopts = {'color2':"#BEFF82", 'type':"gradient"};
- if(fillopts.type == "gradient") fillopts.angle = "-180";
- var fillparm = fillopts.type == "gradient" ? writextag("o:fill", null, {type:"gradientUnscaled", 'v:ext':"view"}) : null;
- var fillxml = writextag('v:fill', fillparm, fillopts);
-
- var shadata = ({on:"t", 'obscured':"t"});
- ++_shapeid;
-
- o = o.concat([
- '<v:shape' + wxt_helper({
- id:'_x0000_s' + _shapeid,
- type:"#_x0000_t202",
- style:"position:absolute; margin-left:80pt;margin-top:5pt;width:104pt;height:64pt;z-index:10" + (x[1].hidden ? ";visibility:hidden" : "") ,
- fillcolor:"#ECFAD4",
- strokecolor:"#edeaa1"
- }) + '>',
- fillxml,
- writextag("v:shadow", null, shadata),
- writextag("v:path", null, {'o:connecttype':"none"}),
- '<v:textbox><div style="text-align:left"></div></v:textbox>',
- '<x:ClientData ObjectType="Note">',
- '<x:MoveWithCells/>',
- '<x:SizeWithCells/>',
- /* Part 4 19.4.2.3 Anchor (Anchor) */
- writetag('x:Anchor', [c.c+1, 0, c.r+1, 0, c.c+3, 20, c.r+5, 20].join(",")),
- writetag('x:AutoFill', "False"),
- writetag('x:Row', String(c.r)),
- writetag('x:Column', String(c.c)),
- x[1].hidden ? '' : '<x:Visible/>',
- '</x:ClientData>',
- '</v:shape>'
- ]); });
- o.push('</xml>');
- return o.join("");
- }
- RELS.CMNT = "http://schemas.openxmlformats.org/officeDocument/2006/relationships/comments";
-
- function sheet_insert_comments(sheet, comments) {
- var dense = Array.isArray(sheet);
- var cell;
- comments.forEach(function(comment) {
- var r = decode_cell(comment.ref);
- if(dense) {
- if(!sheet[r.r]) sheet[r.r] = [];
- cell = sheet[r.r][r.c];
- } else cell = sheet[comment.ref];
- if (!cell) {
- cell = ({t:"z"});
- if(dense) sheet[r.r][r.c] = cell;
- else sheet[comment.ref] = cell;
- var range = safe_decode_range(sheet["!ref"]||"BDWGO1000001:A1");
- if(range.s.r > r.r) range.s.r = r.r;
- if(range.e.r < r.r) range.e.r = r.r;
- if(range.s.c > r.c) range.s.c = r.c;
- if(range.e.c < r.c) range.e.c = r.c;
- var encoded = encode_range(range);
- if (encoded !== sheet["!ref"]) sheet["!ref"] = encoded;
- }
-
- if (!cell.c) cell.c = [];
- var o = ({a: comment.author, t: comment.t, r: comment.r});
- if(comment.h) o.h = comment.h;
- cell.c.push(o);
- });
- }
-
- /* 18.7 Comments */
- function parse_comments_xml(data, opts) {
- /* 18.7.6 CT_Comments */
- if(data.match(/<(?:\w+:)?comments *\/>/)) return [];
- var authors = [];
- var commentList = [];
- var authtag = data.match(/<(?:\w+:)?authors>([\s\S]*)<\/(?:\w+:)?authors>/);
- if(authtag && authtag[1]) authtag[1].split(/<\/\w*:?author>/).forEach(function(x) {
- if(x === "" || x.trim() === "") return;
- var a = x.match(/<(?:\w+:)?author[^>]*>(.*)/);
- if(a) authors.push(a[1]);
- });
- var cmnttag = data.match(/<(?:\w+:)?commentList>([\s\S]*)<\/(?:\w+:)?commentList>/);
- if(cmnttag && cmnttag[1]) cmnttag[1].split(/<\/\w*:?comment>/).forEach(function(x) {
- if(x === "" || x.trim() === "") return;
- var cm = x.match(/<(?:\w+:)?comment[^>]*>/);
- if(!cm) return;
- var y = parsexmltag(cm[0]);
- var comment = ({ author: y.authorId && authors[y.authorId] || "sheetjsghost", ref: y.ref, guid: y.guid });
- var cell = decode_cell(y.ref);
- if(opts.sheetRows && opts.sheetRows <= cell.r) return;
- var textMatch = x.match(/<(?:\w+:)?text>([\s\S]*)<\/(?:\w+:)?text>/);
- var rt = !!textMatch && !!textMatch[1] && parse_si(textMatch[1]) || {r:"",t:"",h:""};
- comment.r = rt.r;
- if(rt.r == "<t></t>") rt.t = rt.h = "";
- comment.t = rt.t.replace(/\r\n/g,"\n").replace(/\r/g,"\n");
- if(opts.cellHTML) comment.h = rt.h;
- commentList.push(comment);
- });
- return commentList;
- }
-
- var CMNT_XML_ROOT = writextag('comments', null, { 'xmlns': XMLNS.main[0] });
- function write_comments_xml(data) {
- var o = [XML_HEADER, CMNT_XML_ROOT];
-
- var iauthor = [];
- o.push("<authors>");
- data.forEach(function(x) { x[1].forEach(function(w) { var a = escapexml(w.a);
- if(iauthor.indexOf(a) > -1) return;
- iauthor.push(a);
- o.push("<author>" + a + "</author>");
- }); });
- o.push("</authors>");
- o.push("<commentList>");
- data.forEach(function(d) {
- d[1].forEach(function(c) {
- /* 18.7.3 CT_Comment */
- o.push('<comment ref="' + d[0] + '" authorId="' + iauthor.indexOf(escapexml(c.a)) + '"><text>');
- o.push(writetag("t", c.t == null ? "" : escapexml(c.t)));
- o.push('</text></comment>');
- });
- });
- o.push("</commentList>");
- if(o.length>2) { o[o.length] = ('</comments>'); o[1]=o[1].replace("/>",">"); }
- return o.join("");
- }
- /* [MS-XLSB] 2.4.28 BrtBeginComment */
- function parse_BrtBeginComment(data) {
- var out = {};
- out.iauthor = data.read_shift(4);
- var rfx = parse_UncheckedRfX(data, 16);
- out.rfx = rfx.s;
- out.ref = encode_cell(rfx.s);
- data.l += 16; /*var guid = parse_GUID(data); */
- return out;
- }
- function write_BrtBeginComment(data, o) {
- if(o == null) o = new_buf(36);
- o.write_shift(4, data[1].iauthor);
- write_UncheckedRfX((data[0]), o);
- o.write_shift(4, 0);
- o.write_shift(4, 0);
- o.write_shift(4, 0);
- o.write_shift(4, 0);
- return o;
- }
-
- /* [MS-XLSB] 2.4.327 BrtCommentAuthor */
- var parse_BrtCommentAuthor = parse_XLWideString;
- function write_BrtCommentAuthor(data) { return write_XLWideString(data.slice(0, 54)); }
-
- /* [MS-XLSB] 2.1.7.8 Comments */
- function parse_comments_bin(data, opts) {
- var out = [];
- var authors = [];
- var c = {};
- var pass = false;
- recordhopper(data, function hopper_cmnt(val, R_n, RT) {
- switch(RT) {
- case 0x0278: /* 'BrtCommentAuthor' */
- authors.push(val); break;
- case 0x027B: /* 'BrtBeginComment' */
- c = val; break;
- case 0x027D: /* 'BrtCommentText' */
- c.t = val.t; c.h = val.h; c.r = val.r; break;
- case 0x027C: /* 'BrtEndComment' */
- c.author = authors[c.iauthor];
- delete (c).iauthor;
- if(opts.sheetRows && c.rfx && opts.sheetRows <= c.rfx.r) break;
- if(!c.t) c.t = "";
- delete c.rfx; out.push(c); break;
-
- case 0x0C00: /* 'BrtUid' */
- break;
-
- case 0x0023: /* 'BrtFRTBegin' */
- pass = true; break;
- case 0x0024: /* 'BrtFRTEnd' */
- pass = false; break;
- case 0x0025: /* 'BrtACBegin' */ break;
- case 0x0026: /* 'BrtACEnd' */ break;
-
-
- default:
- if((R_n||"").indexOf("Begin") > 0){/* empty */}
- else if((R_n||"").indexOf("End") > 0){/* empty */}
- else if(!pass || opts.WTF) throw new Error("Unexpected record " + RT + " " + R_n);
- }
- });
- return out;
- }
-
- function write_comments_bin(data) {
- var ba = buf_array();
- var iauthor = [];
- write_record(ba, "BrtBeginComments");
-
- write_record(ba, "BrtBeginCommentAuthors");
- data.forEach(function(comment) {
- comment[1].forEach(function(c) {
- if(iauthor.indexOf(c.a) > -1) return;
- iauthor.push(c.a.slice(0,54));
- write_record(ba, "BrtCommentAuthor", write_BrtCommentAuthor(c.a));
- });
- });
- write_record(ba, "BrtEndCommentAuthors");
-
- write_record(ba, "BrtBeginCommentList");
- data.forEach(function(comment) {
- comment[1].forEach(function(c) {
- c.iauthor = iauthor.indexOf(c.a);
- var range = {s:decode_cell(comment[0]),e:decode_cell(comment[0])};
- write_record(ba, "BrtBeginComment", write_BrtBeginComment([range, c]));
- if(c.t && c.t.length > 0) write_record(ba, "BrtCommentText", write_BrtCommentText(c));
- write_record(ba, "BrtEndComment");
- delete c.iauthor;
- });
- });
- write_record(ba, "BrtEndCommentList");
-
- write_record(ba, "BrtEndComments");
- return ba.end();
- }
- var CT_VBA = "application/vnd.ms-office.vbaProject";
- function make_vba_xls(cfb) {
- var newcfb = CFB.utils.cfb_new({root:"R"});
- cfb.FullPaths.forEach(function(p, i) {
- if(p.slice(-1) === "/" || !p.match(/_VBA_PROJECT_CUR/)) return;
- var newpath = p.replace(/^[^\/]*/,"R").replace(/\/_VBA_PROJECT_CUR\u0000*/, "");
- CFB.utils.cfb_add(newcfb, newpath, cfb.FileIndex[i].content);
- });
- return CFB.write(newcfb);
- }
-
- function fill_vba_xls(cfb, vba) {
- vba.FullPaths.forEach(function(p, i) {
- if(i == 0) return;
- var newpath = p.replace(/[^\/]*[\/]/, "/_VBA_PROJECT_CUR/");
- if(newpath.slice(-1) !== "/") CFB.utils.cfb_add(cfb, newpath, vba.FileIndex[i].content);
- });
- }
-
- var VBAFMTS = [ "xlsb", "xlsm", "xlam", "biff8", "xla" ];
-
- RELS.DS = "http://schemas.openxmlformats.org/officeDocument/2006/relationships/dialogsheet";
- RELS.MS = "http://schemas.microsoft.com/office/2006/relationships/xlMacrosheet";
-
- /* macro and dialog sheet stubs */
- function parse_ds_bin() { return {'!type':'dialog'}; }
- function parse_ds_xml() { return {'!type':'dialog'}; }
- function parse_ms_bin() { return {'!type':'macro'}; }
- function parse_ms_xml() { return {'!type':'macro'}; }
- /* TODO: it will be useful to parse the function str */
- var rc_to_a1 = (function(){
- var rcregex = /(^|[^A-Za-z_])R(\[?-?\d+\]|[1-9]\d*|)C(\[?-?\d+\]|[1-9]\d*|)(?![A-Za-z0-9_])/g;
- var rcbase = ({r:0,c:0});
- function rcfunc($$,$1,$2,$3) {
- var cRel = false, rRel = false;
-
- if($2.length == 0) rRel = true;
- else if($2.charAt(0) == "[") { rRel = true; $2 = $2.slice(1, -1); }
-
- if($3.length == 0) cRel = true;
- else if($3.charAt(0) == "[") { cRel = true; $3 = $3.slice(1, -1); }
-
- var R = $2.length>0?parseInt($2,10)|0:0, C = $3.length>0?parseInt($3,10)|0:0;
-
- if(cRel) C += rcbase.c; else --C;
- if(rRel) R += rcbase.r; else --R;
- return $1 + (cRel ? "" : "$") + encode_col(C) + (rRel ? "" : "$") + encode_row(R);
- }
- return function rc_to_a1(fstr, base) {
- rcbase = base;
- return fstr.replace(rcregex, rcfunc);
- };
- })();
-
- 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;
- var a1_to_rc =(function(){
- return function a1_to_rc(fstr, base) {
- return fstr.replace(crefregex, function($0, $1, $2, $3, $4, $5) {
- var c = decode_col($3) - ($2 ? 0 : base.c);
- var r = decode_row($5) - ($4 ? 0 : base.r);
- var R = (r == 0 ? "" : !$4 ? "[" + r + "]" : (r+1));
- var C = (c == 0 ? "" : !$2 ? "[" + c + "]" : (c+1));
- return $1 + "R" + R + "C" + C;
- });
- };
- })();
-
- /* no defined name can collide with a valid cell address A1:XFD1048576 ... except LOG10! */
- function shift_formula_str(f, delta) {
- return f.replace(crefregex, function($0, $1, $2, $3, $4, $5) {
- return $1+($2=="$" ? $2+$3 : encode_col(decode_col($3)+delta.c))+($4=="$" ? $4+$5 : encode_row(decode_row($5) + delta.r));
- });
- }
-
- function shift_formula_xlsx(f, range, cell) {
- var r = decode_range(range), s = r.s, c = decode_cell(cell);
- var delta = {r:c.r - s.r, c:c.c - s.c};
- return shift_formula_str(f, delta);
- }
-
- /* TODO: parse formula */
- function fuzzyfmla(f) {
- if(f.length == 1) return false;
- return true;
- }
-
- function _xlfn(f) {
- return f.replace(/_xlfn\./g,"");
- }
- function parseread1(blob) { blob.l+=1; return; }
-
- /* [MS-XLS] 2.5.51 */
- function parse_ColRelU(blob, length) {
- var c = blob.read_shift(length == 1 ? 1 : 2);
- return [c & 0x3FFF, (c >> 14) & 1, (c >> 15) & 1];
- }
-
- /* [MS-XLS] 2.5.198.105 ; [MS-XLSB] 2.5.97.89 */
- function parse_RgceArea(blob, length, opts) {
- var w = 2;
- if(opts) {
- if(opts.biff >= 2 && opts.biff <= 5) return parse_RgceArea_BIFF2(blob, length, opts);
- else if(opts.biff == 12) w = 4;
- }
- var r=blob.read_shift(w), R=blob.read_shift(w);
- var c=parse_ColRelU(blob, 2);
- var C=parse_ColRelU(blob, 2);
- 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]} };
- }
- /* BIFF 2-5 encodes flags in the row field */
- function parse_RgceArea_BIFF2(blob) {
- var r=parse_ColRelU(blob, 2), R=parse_ColRelU(blob, 2);
- var c=blob.read_shift(1);
- var C=blob.read_shift(1);
- 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]} };
- }
-
- /* [MS-XLS] 2.5.198.105 ; [MS-XLSB] 2.5.97.90 */
- function parse_RgceAreaRel(blob, length, opts) {
- if(opts.biff < 8) return parse_RgceArea_BIFF2(blob, length, opts);
- var r=blob.read_shift(opts.biff == 12 ? 4 : 2), R=blob.read_shift(opts.biff == 12 ? 4 : 2);
- var c=parse_ColRelU(blob, 2);
- var C=parse_ColRelU(blob, 2);
- 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]} };
- }
-
- /* [MS-XLS] 2.5.198.109 ; [MS-XLSB] 2.5.97.91 */
- function parse_RgceLoc(blob, length, opts) {
- if(opts && opts.biff >= 2 && opts.biff <= 5) return parse_RgceLoc_BIFF2(blob, length, opts);
- var r = blob.read_shift(opts && opts.biff == 12 ? 4 : 2);
- var c = parse_ColRelU(blob, 2);
- return {r:r, c:c[0], cRel:c[1], rRel:c[2]};
- }
- function parse_RgceLoc_BIFF2(blob) {
- var r = parse_ColRelU(blob, 2);
- var c = blob.read_shift(1);
- return {r:r[0], c:c, cRel:r[1], rRel:r[2]};
- }
-
- /* [MS-XLS] 2.5.198.107, 2.5.47 */
- function parse_RgceElfLoc(blob) {
- var r = blob.read_shift(2);
- var c = blob.read_shift(2);
- return {r:r, c:c & 0xFF, fQuoted:!!(c & 0x4000), cRel:c>>15, rRel:c>>15 };
- }
-
- /* [MS-XLS] 2.5.198.111 ; [MS-XLSB] 2.5.97.92 TODO */
- function parse_RgceLocRel(blob, length, opts) {
- var biff = opts && opts.biff ? opts.biff : 8;
- if(biff >= 2 && biff <= 5) return parse_RgceLocRel_BIFF2(blob, length, opts);
- var r = blob.read_shift(biff >= 12 ? 4 : 2);
- var cl = blob.read_shift(2);
- var cRel = (cl & 0x4000) >> 14, rRel = (cl & 0x8000) >> 15;
- cl &= 0x3FFF;
- if(rRel == 1) while(r > 0x7FFFF) r -= 0x100000;
- if(cRel == 1) while(cl > 0x1FFF) cl = cl - 0x4000;
- return {r:r,c:cl,cRel:cRel,rRel:rRel};
- }
- function parse_RgceLocRel_BIFF2(blob) {
- var rl = blob.read_shift(2);
- var c = blob.read_shift(1);
- var rRel = (rl & 0x8000) >> 15, cRel = (rl & 0x4000) >> 14;
- rl &= 0x3FFF;
- if(rRel == 1 && rl >= 0x2000) rl = rl - 0x4000;
- if(cRel == 1 && c >= 0x80) c = c - 0x100;
- return {r:rl,c:c,cRel:cRel,rRel:rRel};
- }
-
- /* [MS-XLS] 2.5.198.27 ; [MS-XLSB] 2.5.97.18 */
- function parse_PtgArea(blob, length, opts) {
- var type = (blob[blob.l++] & 0x60) >> 5;
- var area = parse_RgceArea(blob, opts.biff >= 2 && opts.biff <= 5 ? 6 : 8, opts);
- return [type, area];
- }
-
- /* [MS-XLS] 2.5.198.28 ; [MS-XLSB] 2.5.97.19 */
- function parse_PtgArea3d(blob, length, opts) {
- var type = (blob[blob.l++] & 0x60) >> 5;
- var ixti = blob.read_shift(2, 'i');
- var w = 8;
- if(opts) switch(opts.biff) {
- case 5: blob.l += 12; w = 6; break;
- case 12: w = 12; break;
- }
- var area = parse_RgceArea(blob, w, opts);
- return [type, ixti, area];
- }
-
- /* [MS-XLS] 2.5.198.29 ; [MS-XLSB] 2.5.97.20 */
- function parse_PtgAreaErr(blob, length, opts) {
- var type = (blob[blob.l++] & 0x60) >> 5;
- blob.l += opts && (opts.biff > 8) ? 12 : (opts.biff < 8 ? 6 : 8);
- return [type];
- }
- /* [MS-XLS] 2.5.198.30 ; [MS-XLSB] 2.5.97.21 */
- function parse_PtgAreaErr3d(blob, length, opts) {
- var type = (blob[blob.l++] & 0x60) >> 5;
- var ixti = blob.read_shift(2);
- var w = 8;
- if(opts) switch(opts.biff) {
- case 5: blob.l += 12; w = 6; break;
- case 12: w = 12; break;
- }
- blob.l += w;
- return [type, ixti];
- }
-
- /* [MS-XLS] 2.5.198.31 ; [MS-XLSB] 2.5.97.22 */
- function parse_PtgAreaN(blob, length, opts) {
- var type = (blob[blob.l++] & 0x60) >> 5;
- var area = parse_RgceAreaRel(blob, length - 1, opts);
- return [type, area];
- }
-
- /* [MS-XLS] 2.5.198.32 ; [MS-XLSB] 2.5.97.23 */
- function parse_PtgArray(blob, length, opts) {
- var type = (blob[blob.l++] & 0x60) >> 5;
- blob.l += opts.biff == 2 ? 6 : opts.biff == 12 ? 14 : 7;
- return [type];
- }
-
- /* [MS-XLS] 2.5.198.33 ; [MS-XLSB] 2.5.97.24 */
- function parse_PtgAttrBaxcel(blob) {
- var bitSemi = blob[blob.l+1] & 0x01; /* 1 = volatile */
- var bitBaxcel = 1;
- blob.l += 4;
- return [bitSemi, bitBaxcel];
- }
-
- /* [MS-XLS] 2.5.198.34 ; [MS-XLSB] 2.5.97.25 */
- function parse_PtgAttrChoose(blob, length, opts) {
- blob.l +=2;
- var offset = blob.read_shift(opts && opts.biff == 2 ? 1 : 2);
- var o = [];
- /* offset is 1 less than the number of elements */
- for(var i = 0; i <= offset; ++i) o.push(blob.read_shift(opts && opts.biff == 2 ? 1 : 2));
- return o;
- }
-
- /* [MS-XLS] 2.5.198.35 ; [MS-XLSB] 2.5.97.26 */
- function parse_PtgAttrGoto(blob, length, opts) {
- var bitGoto = (blob[blob.l+1] & 0xFF) ? 1 : 0;
- blob.l += 2;
- return [bitGoto, blob.read_shift(opts && opts.biff == 2 ? 1 : 2)];
- }
-
- /* [MS-XLS] 2.5.198.36 ; [MS-XLSB] 2.5.97.27 */
- function parse_PtgAttrIf(blob, length, opts) {
- var bitIf = (blob[blob.l+1] & 0xFF) ? 1 : 0;
- blob.l += 2;
- return [bitIf, blob.read_shift(opts && opts.biff == 2 ? 1 : 2)];
- }
-
- /* [MS-XLSB] 2.5.97.28 */
- function parse_PtgAttrIfError(blob) {
- var bitIf = (blob[blob.l+1] & 0xFF) ? 1 : 0;
- blob.l += 2;
- return [bitIf, blob.read_shift(2)];
- }
-
- /* [MS-XLS] 2.5.198.37 ; [MS-XLSB] 2.5.97.29 */
- function parse_PtgAttrSemi(blob, length, opts) {
- var bitSemi = (blob[blob.l+1] & 0xFF) ? 1 : 0;
- blob.l += opts && opts.biff == 2 ? 3 : 4;
- return [bitSemi];
- }
-
- /* [MS-XLS] 2.5.198.40 ; [MS-XLSB] 2.5.97.32 */
- function parse_PtgAttrSpaceType(blob) {
- var type = blob.read_shift(1), cch = blob.read_shift(1);
- return [type, cch];
- }
-
- /* [MS-XLS] 2.5.198.38 ; [MS-XLSB] 2.5.97.30 */
- function parse_PtgAttrSpace(blob) {
- blob.read_shift(2);
- return parse_PtgAttrSpaceType(blob, 2);
- }
-
- /* [MS-XLS] 2.5.198.39 ; [MS-XLSB] 2.5.97.31 */
- function parse_PtgAttrSpaceSemi(blob) {
- blob.read_shift(2);
- return parse_PtgAttrSpaceType(blob, 2);
- }
-
- /* [MS-XLS] 2.5.198.84 ; [MS-XLSB] 2.5.97.68 TODO */
- function parse_PtgRef(blob, length, opts) {
- //var ptg = blob[blob.l] & 0x1F;
- var type = (blob[blob.l] & 0x60)>>5;
- blob.l += 1;
- var loc = parse_RgceLoc(blob, 0, opts);
- return [type, loc];
- }
-
- /* [MS-XLS] 2.5.198.88 ; [MS-XLSB] 2.5.97.72 TODO */
- function parse_PtgRefN(blob, length, opts) {
- var type = (blob[blob.l] & 0x60)>>5;
- blob.l += 1;
- var loc = parse_RgceLocRel(blob, 0, opts);
- return [type, loc];
- }
-
- /* [MS-XLS] 2.5.198.85 ; [MS-XLSB] 2.5.97.69 TODO */
- function parse_PtgRef3d(blob, length, opts) {
- var type = (blob[blob.l] & 0x60)>>5;
- blob.l += 1;
- var ixti = blob.read_shift(2); // XtiIndex
- if(opts && opts.biff == 5) blob.l += 12;
- var loc = parse_RgceLoc(blob, 0, opts); // TODO: or RgceLocRel
- return [type, ixti, loc];
- }
-
-
- /* [MS-XLS] 2.5.198.62 ; [MS-XLSB] 2.5.97.45 TODO */
- function parse_PtgFunc(blob, length, opts) {
- //var ptg = blob[blob.l] & 0x1F;
- var type = (blob[blob.l] & 0x60)>>5;
- blob.l += 1;
- var iftab = blob.read_shift(opts && opts.biff <= 3 ? 1 : 2);
- return [FtabArgc[iftab], Ftab[iftab], type];
- }
- /* [MS-XLS] 2.5.198.63 ; [MS-XLSB] 2.5.97.46 TODO */
- function parse_PtgFuncVar(blob, length, opts) {
- var type = blob[blob.l++];
- var cparams = blob.read_shift(1), tab = opts && opts.biff <= 3 ? [(type == 0x58 ? -1 : 0), blob.read_shift(1)]: parsetab(blob);
- return [cparams, (tab[0] === 0 ? Ftab : Cetab)[tab[1]]];
- }
-
- function parsetab(blob) {
- return [blob[blob.l+1]>>7, blob.read_shift(2) & 0x7FFF];
- }
-
- /* [MS-XLS] 2.5.198.41 ; [MS-XLSB] 2.5.97.33 */
- function parse_PtgAttrSum(blob, length, opts) {
- blob.l += opts && opts.biff == 2 ? 3 : 4; return;
- }
-
- /* [MS-XLS] 2.5.198.58 ; [MS-XLSB] 2.5.97.40 */
- function parse_PtgExp(blob, length, opts) {
- blob.l++;
- if(opts && opts.biff == 12) return [blob.read_shift(4, 'i'), 0];
- var row = blob.read_shift(2);
- var col = blob.read_shift(opts && opts.biff == 2 ? 1 : 2);
- return [row, col];
- }
-
- /* [MS-XLS] 2.5.198.57 ; [MS-XLSB] 2.5.97.39 */
- function parse_PtgErr(blob) { blob.l++; return BErr[blob.read_shift(1)]; }
-
- /* [MS-XLS] 2.5.198.66 ; [MS-XLSB] 2.5.97.49 */
- function parse_PtgInt(blob) { blob.l++; return blob.read_shift(2); }
-
- /* [MS-XLS] 2.5.198.42 ; [MS-XLSB] 2.5.97.34 */
- function parse_PtgBool(blob) { blob.l++; return blob.read_shift(1)!==0;}
-
- /* [MS-XLS] 2.5.198.79 ; [MS-XLSB] 2.5.97.63 */
- function parse_PtgNum(blob) { blob.l++; return parse_Xnum(blob, 8); }
-
- /* [MS-XLS] 2.5.198.89 ; [MS-XLSB] 2.5.97.74 */
- function parse_PtgStr(blob, length, opts) { blob.l++; return parse_ShortXLUnicodeString(blob, length-1, opts); }
-
- /* [MS-XLS] 2.5.192.112 + 2.5.192.11{3,4,5,6,7} */
- /* [MS-XLSB] 2.5.97.93 + 2.5.97.9{4,5,6,7} */
- function parse_SerAr(blob, biff) {
- var val = [blob.read_shift(1)];
- if(biff == 12) switch(val[0]) {
- case 0x02: val[0] = 0x04; break; /* SerBool */
- case 0x04: val[0] = 0x10; break; /* SerErr */
- case 0x00: val[0] = 0x01; break; /* SerNum */
- case 0x01: val[0] = 0x02; break; /* SerStr */
- }
- switch(val[0]) {
- case 0x04: /* SerBool -- boolean */
- val[1] = parsebool(blob, 1) ? 'TRUE' : 'FALSE';
- if(biff != 12) blob.l += 7; break;
- case 0x25: /* appears to be an alias */
- case 0x10: /* SerErr -- error */
- val[1] = BErr[blob[blob.l]];
- blob.l += ((biff == 12) ? 4 : 8); break;
- case 0x00: /* SerNil -- honestly, I'm not sure how to reproduce this */
- blob.l += 8; break;
- case 0x01: /* SerNum -- Xnum */
- val[1] = parse_Xnum(blob, 8); break;
- case 0x02: /* SerStr -- XLUnicodeString (<256 chars) */
- val[1] = parse_XLUnicodeString2(blob, 0, {biff:biff > 0 && biff < 8 ? 2 : biff}); break;
- default: throw new Error("Bad SerAr: " + val[0]); /* Unreachable */
- }
- return val;
- }
-
- /* [MS-XLS] 2.5.198.61 ; [MS-XLSB] 2.5.97.44 */
- function parse_PtgExtraMem(blob, cce, opts) {
- var count = blob.read_shift((opts.biff == 12) ? 4 : 2);
- var out = [];
- for(var i = 0; i != count; ++i) out.push(((opts.biff == 12) ? parse_UncheckedRfX : parse_Ref8U)(blob, 8));
- return out;
- }
-
- /* [MS-XLS] 2.5.198.59 ; [MS-XLSB] 2.5.97.41 */
- function parse_PtgExtraArray(blob, length, opts) {
- var rows = 0, cols = 0;
- if(opts.biff == 12) {
- rows = blob.read_shift(4); // DRw
- cols = blob.read_shift(4); // DCol
- } else {
- cols = 1 + blob.read_shift(1); //DColByteU
- rows = 1 + blob.read_shift(2); //DRw
- }
- if(opts.biff >= 2 && opts.biff < 8) { --rows; if(--cols == 0) cols = 0x100; }
- // $FlowIgnore
- for(var i = 0, o = []; i != rows && (o[i] = []); ++i)
- for(var j = 0; j != cols; ++j) o[i][j] = parse_SerAr(blob, opts.biff);
- return o;
- }
-
- /* [MS-XLS] 2.5.198.76 ; [MS-XLSB] 2.5.97.60 */
- function parse_PtgName(blob, length, opts) {
- var type = (blob.read_shift(1) >>> 5) & 0x03;
- var w = (!opts || (opts.biff >= 8)) ? 4 : 2;
- var nameindex = blob.read_shift(w);
- switch(opts.biff) {
- case 2: blob.l += 5; break;
- case 3: case 4: blob.l += 8; break;
- case 5: blob.l += 12; break;
- }
- return [type, 0, nameindex];
- }
-
- /* [MS-XLS] 2.5.198.77 ; [MS-XLSB] 2.5.97.61 */
- function parse_PtgNameX(blob, length, opts) {
- if(opts.biff == 5) return parse_PtgNameX_BIFF5(blob, length, opts);
- var type = (blob.read_shift(1) >>> 5) & 0x03;
- var ixti = blob.read_shift(2); // XtiIndex
- var nameindex = blob.read_shift(4);
- return [type, ixti, nameindex];
- }
- function parse_PtgNameX_BIFF5(blob) {
- var type = (blob.read_shift(1) >>> 5) & 0x03;
- var ixti = blob.read_shift(2, 'i'); // XtiIndex
- blob.l += 8;
- var nameindex = blob.read_shift(2);
- blob.l += 12;
- return [type, ixti, nameindex];
- }
-
- /* [MS-XLS] 2.5.198.70 ; [MS-XLSB] 2.5.97.54 */
- function parse_PtgMemArea(blob, length, opts) {
- var type = (blob.read_shift(1) >>> 5) & 0x03;
- blob.l += (opts && opts.biff == 2 ? 3 : 4);
- var cce = blob.read_shift(opts && opts.biff == 2 ? 1 : 2);
- return [type, cce];
- }
-
- /* [MS-XLS] 2.5.198.72 ; [MS-XLSB] 2.5.97.56 */
- function parse_PtgMemFunc(blob, length, opts) {
- var type = (blob.read_shift(1) >>> 5) & 0x03;
- var cce = blob.read_shift(opts && opts.biff == 2 ? 1 : 2);
- return [type, cce];
- }
-
-
- /* [MS-XLS] 2.5.198.86 ; [MS-XLSB] 2.5.97.69 */
- function parse_PtgRefErr(blob, length, opts) {
- var type = (blob.read_shift(1) >>> 5) & 0x03;
- blob.l += 4;
- if(opts.biff < 8) blob.l--;
- if(opts.biff == 12) blob.l += 2;
- return [type];
- }
-
- /* [MS-XLS] 2.5.198.87 ; [MS-XLSB] 2.5.97.71 */
- function parse_PtgRefErr3d(blob, length, opts) {
- var type = (blob[blob.l++] & 0x60) >> 5;
- var ixti = blob.read_shift(2);
- var w = 4;
- if(opts) switch(opts.biff) {
- case 5: w = 15; break;
- case 12: w = 6; break;
- }
- blob.l += w;
- return [type, ixti];
- }
-
- /* [MS-XLS] 2.5.198.71 ; [MS-XLSB] 2.5.97.55 */
- var parse_PtgMemErr = parsenoop;
- /* [MS-XLS] 2.5.198.73 ; [MS-XLSB] 2.5.97.57 */
- var parse_PtgMemNoMem = parsenoop;
- /* [MS-XLS] 2.5.198.92 */
- var parse_PtgTbl = parsenoop;
-
- function parse_PtgElfLoc(blob, length, opts) {
- blob.l += 2;
- return [parse_RgceElfLoc(blob, 4, opts)];
- }
- function parse_PtgElfNoop(blob) {
- blob.l += 6;
- return [];
- }
- /* [MS-XLS] 2.5.198.46 */
- var parse_PtgElfCol = parse_PtgElfLoc;
- /* [MS-XLS] 2.5.198.47 */
- var parse_PtgElfColS = parse_PtgElfNoop;
- /* [MS-XLS] 2.5.198.48 */
- var parse_PtgElfColSV = parse_PtgElfNoop;
- /* [MS-XLS] 2.5.198.49 */
- var parse_PtgElfColV = parse_PtgElfLoc;
- /* [MS-XLS] 2.5.198.50 */
- function parse_PtgElfLel(blob) {
- blob.l += 2;
- return [parseuint16(blob), blob.read_shift(2) & 0x01];
- }
- /* [MS-XLS] 2.5.198.51 */
- var parse_PtgElfRadical = parse_PtgElfLoc;
- /* [MS-XLS] 2.5.198.52 */
- var parse_PtgElfRadicalLel = parse_PtgElfLel;
- /* [MS-XLS] 2.5.198.53 */
- var parse_PtgElfRadicalS = parse_PtgElfNoop;
- /* [MS-XLS] 2.5.198.54 */
- var parse_PtgElfRw = parse_PtgElfLoc;
- /* [MS-XLS] 2.5.198.55 */
- var parse_PtgElfRwV = parse_PtgElfLoc;
-
- /* [MS-XLSB] 2.5.97.52 TODO */
- var PtgListRT = [
- "Data",
- "All",
- "Headers",
- "??",
- "?Data2",
- "??",
- "?DataHeaders",
- "??",
- "Totals",
- "??",
- "??",
- "??",
- "?DataTotals",
- "??",
- "??",
- "??",
- "?Current"
- ];
- function parse_PtgList(blob) {
- blob.l += 2;
- var ixti = blob.read_shift(2);
- var flags = blob.read_shift(2);
- var idx = blob.read_shift(4);
- var c = blob.read_shift(2);
- var C = blob.read_shift(2);
- var rt = PtgListRT[(flags >> 2) & 0x1F];
- return {ixti: ixti, coltype:(flags&0x3), rt:rt, idx:idx, c:c, C:C};
- }
- /* [MS-XLS] 2.5.198.91 ; [MS-XLSB] 2.5.97.76 */
- function parse_PtgSxName(blob) {
- blob.l += 2;
- return [blob.read_shift(4)];
- }
-
- /* [XLS] old spec */
- function parse_PtgSheet(blob, length, opts) {
- blob.l += 5;
- blob.l += 2;
- blob.l += (opts.biff == 2 ? 1 : 4);
- return ["PTGSHEET"];
- }
- function parse_PtgEndSheet(blob, length, opts) {
- blob.l += (opts.biff == 2 ? 4 : 5);
- return ["PTGENDSHEET"];
- }
- function parse_PtgMemAreaN(blob) {
- var type = (blob.read_shift(1) >>> 5) & 0x03;
- var cce = blob.read_shift(2);
- return [type, cce];
- }
- function parse_PtgMemNoMemN(blob) {
- var type = (blob.read_shift(1) >>> 5) & 0x03;
- var cce = blob.read_shift(2);
- return [type, cce];
- }
- function parse_PtgAttrNoop(blob) {
- blob.l += 4;
- return [0, 0];
- }
-
- /* [MS-XLS] 2.5.198.25 ; [MS-XLSB] 2.5.97.16 */
- var PtgTypes = {
- 0x01: { n:'PtgExp', f:parse_PtgExp },
- 0x02: { n:'PtgTbl', f:parse_PtgTbl },
- 0x03: { n:'PtgAdd', f:parseread1 },
- 0x04: { n:'PtgSub', f:parseread1 },
- 0x05: { n:'PtgMul', f:parseread1 },
- 0x06: { n:'PtgDiv', f:parseread1 },
- 0x07: { n:'PtgPower', f:parseread1 },
- 0x08: { n:'PtgConcat', f:parseread1 },
- 0x09: { n:'PtgLt', f:parseread1 },
- 0x0A: { n:'PtgLe', f:parseread1 },
- 0x0B: { n:'PtgEq', f:parseread1 },
- 0x0C: { n:'PtgGe', f:parseread1 },
- 0x0D: { n:'PtgGt', f:parseread1 },
- 0x0E: { n:'PtgNe', f:parseread1 },
- 0x0F: { n:'PtgIsect', f:parseread1 },
- 0x10: { n:'PtgUnion', f:parseread1 },
- 0x11: { n:'PtgRange', f:parseread1 },
- 0x12: { n:'PtgUplus', f:parseread1 },
- 0x13: { n:'PtgUminus', f:parseread1 },
- 0x14: { n:'PtgPercent', f:parseread1 },
- 0x15: { n:'PtgParen', f:parseread1 },
- 0x16: { n:'PtgMissArg', f:parseread1 },
- 0x17: { n:'PtgStr', f:parse_PtgStr },
- 0x1A: { n:'PtgSheet', f:parse_PtgSheet },
- 0x1B: { n:'PtgEndSheet', f:parse_PtgEndSheet },
- 0x1C: { n:'PtgErr', f:parse_PtgErr },
- 0x1D: { n:'PtgBool', f:parse_PtgBool },
- 0x1E: { n:'PtgInt', f:parse_PtgInt },
- 0x1F: { n:'PtgNum', f:parse_PtgNum },
- 0x20: { n:'PtgArray', f:parse_PtgArray },
- 0x21: { n:'PtgFunc', f:parse_PtgFunc },
- 0x22: { n:'PtgFuncVar', f:parse_PtgFuncVar },
- 0x23: { n:'PtgName', f:parse_PtgName },
- 0x24: { n:'PtgRef', f:parse_PtgRef },
- 0x25: { n:'PtgArea', f:parse_PtgArea },
- 0x26: { n:'PtgMemArea', f:parse_PtgMemArea },
- 0x27: { n:'PtgMemErr', f:parse_PtgMemErr },
- 0x28: { n:'PtgMemNoMem', f:parse_PtgMemNoMem },
- 0x29: { n:'PtgMemFunc', f:parse_PtgMemFunc },
- 0x2A: { n:'PtgRefErr', f:parse_PtgRefErr },
- 0x2B: { n:'PtgAreaErr', f:parse_PtgAreaErr },
- 0x2C: { n:'PtgRefN', f:parse_PtgRefN },
- 0x2D: { n:'PtgAreaN', f:parse_PtgAreaN },
- 0x2E: { n:'PtgMemAreaN', f:parse_PtgMemAreaN },
- 0x2F: { n:'PtgMemNoMemN', f:parse_PtgMemNoMemN },
- 0x39: { n:'PtgNameX', f:parse_PtgNameX },
- 0x3A: { n:'PtgRef3d', f:parse_PtgRef3d },
- 0x3B: { n:'PtgArea3d', f:parse_PtgArea3d },
- 0x3C: { n:'PtgRefErr3d', f:parse_PtgRefErr3d },
- 0x3D: { n:'PtgAreaErr3d', f:parse_PtgAreaErr3d },
- 0xFF: {}
- };
- /* These are duplicated in the PtgTypes table */
- var PtgDupes = {
- 0x40: 0x20, 0x60: 0x20,
- 0x41: 0x21, 0x61: 0x21,
- 0x42: 0x22, 0x62: 0x22,
- 0x43: 0x23, 0x63: 0x23,
- 0x44: 0x24, 0x64: 0x24,
- 0x45: 0x25, 0x65: 0x25,
- 0x46: 0x26, 0x66: 0x26,
- 0x47: 0x27, 0x67: 0x27,
- 0x48: 0x28, 0x68: 0x28,
- 0x49: 0x29, 0x69: 0x29,
- 0x4A: 0x2A, 0x6A: 0x2A,
- 0x4B: 0x2B, 0x6B: 0x2B,
- 0x4C: 0x2C, 0x6C: 0x2C,
- 0x4D: 0x2D, 0x6D: 0x2D,
- 0x4E: 0x2E, 0x6E: 0x2E,
- 0x4F: 0x2F, 0x6F: 0x2F,
- 0x58: 0x22, 0x78: 0x22,
- 0x59: 0x39, 0x79: 0x39,
- 0x5A: 0x3A, 0x7A: 0x3A,
- 0x5B: 0x3B, 0x7B: 0x3B,
- 0x5C: 0x3C, 0x7C: 0x3C,
- 0x5D: 0x3D, 0x7D: 0x3D
- };
- (function(){for(var y in PtgDupes) PtgTypes[y] = PtgTypes[PtgDupes[y]];})();
-
- var Ptg18 = {
- 0x01: { n:'PtgElfLel', f:parse_PtgElfLel },
- 0x02: { n:'PtgElfRw', f:parse_PtgElfRw },
- 0x03: { n:'PtgElfCol', f:parse_PtgElfCol },
- 0x06: { n:'PtgElfRwV', f:parse_PtgElfRwV },
- 0x07: { n:'PtgElfColV', f:parse_PtgElfColV },
- 0x0A: { n:'PtgElfRadical', f:parse_PtgElfRadical },
- 0x0B: { n:'PtgElfRadicalS', f:parse_PtgElfRadicalS },
- 0x0D: { n:'PtgElfColS', f:parse_PtgElfColS },
- 0x0F: { n:'PtgElfColSV', f:parse_PtgElfColSV },
- 0x10: { n:'PtgElfRadicalLel', f:parse_PtgElfRadicalLel },
- 0x19: { n:'PtgList', f:parse_PtgList },
- 0x1D: { n:'PtgSxName', f:parse_PtgSxName },
- 0xFF: {}
- };
- var Ptg19 = {
- 0x00: { n:'PtgAttrNoop', f:parse_PtgAttrNoop },
- 0x01: { n:'PtgAttrSemi', f:parse_PtgAttrSemi },
- 0x02: { n:'PtgAttrIf', f:parse_PtgAttrIf },
- 0x04: { n:'PtgAttrChoose', f:parse_PtgAttrChoose },
- 0x08: { n:'PtgAttrGoto', f:parse_PtgAttrGoto },
- 0x10: { n:'PtgAttrSum', f:parse_PtgAttrSum },
- 0x20: { n:'PtgAttrBaxcel', f:parse_PtgAttrBaxcel },
- 0x40: { n:'PtgAttrSpace', f:parse_PtgAttrSpace },
- 0x41: { n:'PtgAttrSpaceSemi', f:parse_PtgAttrSpaceSemi },
- 0x80: { n:'PtgAttrIfError', f:parse_PtgAttrIfError },
- 0xFF: {}
- };
- Ptg19[0x21] = Ptg19[0x20];
-
- /* [MS-XLS] 2.5.198.103 ; [MS-XLSB] 2.5.97.87 */
- function parse_RgbExtra(blob, length, rgce, opts) {
- if(opts.biff < 8) return parsenoop(blob, length);
- var target = blob.l + length;
- var o = [];
- for(var i = 0; i !== rgce.length; ++i) {
- switch(rgce[i][0]) {
- case 'PtgArray': /* PtgArray -> PtgExtraArray */
- rgce[i][1] = parse_PtgExtraArray(blob, 0, opts);
- o.push(rgce[i][1]);
- break;
- case 'PtgMemArea': /* PtgMemArea -> PtgExtraMem */
- rgce[i][2] = parse_PtgExtraMem(blob, rgce[i][1], opts);
- o.push(rgce[i][2]);
- break;
- case 'PtgExp': /* PtgExp -> PtgExtraCol */
- if(opts && opts.biff == 12) {
- rgce[i][1][1] = blob.read_shift(4);
- o.push(rgce[i][1]);
- } break;
- case 'PtgList': /* TODO: PtgList -> PtgExtraList */
- case 'PtgElfRadicalS': /* TODO: PtgElfRadicalS -> PtgExtraElf */
- case 'PtgElfColS': /* TODO: PtgElfColS -> PtgExtraElf */
- case 'PtgElfColSV': /* TODO: PtgElfColSV -> PtgExtraElf */
- throw "Unsupported " + rgce[i][0];
- default: break;
- }
- }
- length = target - blob.l;
- /* note: this is technically an error but Excel disregards */
- //if(target !== blob.l && blob.l !== target - length) throw new Error(target + " != " + blob.l);
- if(length !== 0) o.push(parsenoop(blob, length));
- return o;
- }
-
- /* [MS-XLS] 2.5.198.104 ; [MS-XLSB] 2.5.97.88 */
- function parse_Rgce(blob, length, opts) {
- var target = blob.l + length;
- var R, id, ptgs = [];
- while(target != blob.l) {
- length = target - blob.l;
- id = blob[blob.l];
- R = PtgTypes[id];
- if(id === 0x18 || id === 0x19) R = (id === 0x18 ? Ptg18 : Ptg19)[blob[blob.l + 1]];
- if(!R || !R.f) { /*ptgs.push*/(parsenoop(blob, length)); }
- else { ptgs.push([R.n, R.f(blob, length, opts)]); }
- }
- return ptgs;
- }
-
- function stringify_array(f) {
- var o = [];
- for(var i = 0; i < f.length; ++i) {
- var x = f[i], r = [];
- for(var j = 0; j < x.length; ++j) {
- var y = x[j];
- if(y) switch(y[0]) {
- // TODO: handle embedded quotes
- case 0x02:
- r.push('"' + y[1].replace(/"/g,'""') + '"'); break;
- default: r.push(y[1]);
- } else r.push("");
- }
- o.push(r.join(","));
- }
- return o.join(";");
- }
-
- /* [MS-XLS] 2.2.2 ; [MS-XLSB] 2.2.2 TODO */
- var PtgBinOp = {
- PtgAdd: "+",
- PtgConcat: "&",
- PtgDiv: "/",
- PtgEq: "=",
- PtgGe: ">=",
- PtgGt: ">",
- PtgLe: "<=",
- PtgLt: "<",
- PtgMul: "*",
- PtgNe: "<>",
- PtgPower: "^",
- PtgSub: "-"
- };
-
- // List of invalid characters needs to be tested further
- var quoteCharacters = new RegExp(/[^\w\u4E00-\u9FFF\u3040-\u30FF]/);
- function formula_quote_sheet_name(sname, opts) {
- if(!sname && !(opts && opts.biff <= 5 && opts.biff >= 2)) throw new Error("empty sheet name");
- if (quoteCharacters.test(sname)) return "'" + sname + "'";
- return sname;
- }
- function get_ixti_raw(supbooks, ixti, opts) {
- if(!supbooks) return "SH33TJSERR0";
- if(opts.biff > 8 && (!supbooks.XTI || !supbooks.XTI[ixti])) return supbooks.SheetNames[ixti];
- if(!supbooks.XTI) return "SH33TJSERR6";
- var XTI = supbooks.XTI[ixti];
- if(opts.biff < 8) {
- if(ixti > 10000) ixti-= 65536;
- if(ixti < 0) ixti = -ixti;
- return ixti == 0 ? "" : supbooks.XTI[ixti - 1];
- }
- if(!XTI) return "SH33TJSERR1";
- var o = "";
- if(opts.biff > 8) switch(supbooks[XTI[0]][0]) {
- case 0x0165: /* 'BrtSupSelf' */
- o = XTI[1] == -1 ? "#REF" : supbooks.SheetNames[XTI[1]];
- return XTI[1] == XTI[2] ? o : o + ":" + supbooks.SheetNames[XTI[2]];
- case 0x0166: /* 'BrtSupSame' */
- if(opts.SID != null) return supbooks.SheetNames[opts.SID];
- return "SH33TJSSAME" + supbooks[XTI[0]][0];
- case 0x0163: /* 'BrtSupBookSrc' */
- /* falls through */
- default: return "SH33TJSSRC" + supbooks[XTI[0]][0];
- }
- switch(supbooks[XTI[0]][0][0]) {
- case 0x0401:
- o = XTI[1] == -1 ? "#REF" : (supbooks.SheetNames[XTI[1]] || "SH33TJSERR3");
- return XTI[1] == XTI[2] ? o : o + ":" + supbooks.SheetNames[XTI[2]];
- case 0x3A01: return supbooks[XTI[0]].slice(1).map(function(name) { return name.Name; }).join(";;"); //return "SH33TJSERR8";
- default:
- if(!supbooks[XTI[0]][0][3]) return "SH33TJSERR2";
- o = XTI[1] == -1 ? "#REF" : (supbooks[XTI[0]][0][3][XTI[1]] || "SH33TJSERR4");
- return XTI[1] == XTI[2] ? o : o + ":" + supbooks[XTI[0]][0][3][XTI[2]];
- }
- }
- function get_ixti(supbooks, ixti, opts) {
- return formula_quote_sheet_name(get_ixti_raw(supbooks, ixti, opts), opts);
- }
- function stringify_formula(formula/*Array<any>*/, range, cell, supbooks, opts) {
- var biff = (opts && opts.biff) || 8;
- var _range = /*range != null ? range :*/ {s:{c:0, r:0},e:{c:0, r:0}};
- var stack = [], e1, e2, c, ixti=0, nameidx=0, r, sname="";
- if(!formula[0] || !formula[0][0]) return "";
- var last_sp = -1, sp = "";
- for(var ff = 0, fflen = formula[0].length; ff < fflen; ++ff) {
- var f = formula[0][ff];
- switch(f[0]) {
- case 'PtgUminus': /* [MS-XLS] 2.5.198.93 */
- stack.push("-" + stack.pop()); break;
- case 'PtgUplus': /* [MS-XLS] 2.5.198.95 */
- stack.push("+" + stack.pop()); break;
- case 'PtgPercent': /* [MS-XLS] 2.5.198.81 */
- stack.push(stack.pop() + "%"); break;
-
- case 'PtgAdd': /* [MS-XLS] 2.5.198.26 */
- case 'PtgConcat': /* [MS-XLS] 2.5.198.43 */
- case 'PtgDiv': /* [MS-XLS] 2.5.198.45 */
- case 'PtgEq': /* [MS-XLS] 2.5.198.56 */
- case 'PtgGe': /* [MS-XLS] 2.5.198.64 */
- case 'PtgGt': /* [MS-XLS] 2.5.198.65 */
- case 'PtgLe': /* [MS-XLS] 2.5.198.68 */
- case 'PtgLt': /* [MS-XLS] 2.5.198.69 */
- case 'PtgMul': /* [MS-XLS] 2.5.198.75 */
- case 'PtgNe': /* [MS-XLS] 2.5.198.78 */
- case 'PtgPower': /* [MS-XLS] 2.5.198.82 */
- case 'PtgSub': /* [MS-XLS] 2.5.198.90 */
- e1 = stack.pop(); e2 = stack.pop();
- if(last_sp >= 0) {
- switch(formula[0][last_sp][1][0]) {
- case 0:
- // $FlowIgnore
- sp = fill(" ", formula[0][last_sp][1][1]); break;
- case 1:
- // $FlowIgnore
- sp = fill("\r", formula[0][last_sp][1][1]); break;
- default:
- sp = "";
- // $FlowIgnore
- if(opts.WTF) throw new Error("Unexpected PtgAttrSpaceType " + formula[0][last_sp][1][0]);
- }
- e2 = e2 + sp;
- last_sp = -1;
- }
- stack.push(e2+PtgBinOp[f[0]]+e1);
- break;
-
- case 'PtgIsect': /* [MS-XLS] 2.5.198.67 */
- e1 = stack.pop(); e2 = stack.pop();
- stack.push(e2+" "+e1);
- break;
- case 'PtgUnion': /* [MS-XLS] 2.5.198.94 */
- e1 = stack.pop(); e2 = stack.pop();
- stack.push(e2+","+e1);
- break;
- case 'PtgRange': /* [MS-XLS] 2.5.198.83 */
- e1 = stack.pop(); e2 = stack.pop();
- stack.push(e2+":"+e1);
- break;
-
- case 'PtgAttrChoose': /* [MS-XLS] 2.5.198.34 */
- break;
- case 'PtgAttrGoto': /* [MS-XLS] 2.5.198.35 */
- break;
- case 'PtgAttrIf': /* [MS-XLS] 2.5.198.36 */
- break;
- case 'PtgAttrIfError': /* [MS-XLSB] 2.5.97.28 */
- break;
-
-
- case 'PtgRef': /* [MS-XLS] 2.5.198.84 */
- c = shift_cell_xls((f[1][1]), _range, opts);
- stack.push(encode_cell_xls(c, biff));
- break;
- case 'PtgRefN': /* [MS-XLS] 2.5.198.88 */
- c = cell ? shift_cell_xls((f[1][1]), cell, opts) : (f[1][1]);
- stack.push(encode_cell_xls(c, biff));
- break;
- case 'PtgRef3d': /* [MS-XLS] 2.5.198.85 */
- ixti = f[1][1]; c = shift_cell_xls((f[1][2]), _range, opts);
- sname = get_ixti(supbooks, ixti, opts);
- var w = sname; /* IE9 fails on defined names */ // eslint-disable-line no-unused-vars
- stack.push(sname + "!" + encode_cell_xls(c, biff));
- break;
-
- case 'PtgFunc': /* [MS-XLS] 2.5.198.62 */
- case 'PtgFuncVar': /* [MS-XLS] 2.5.198.63 */
- /* f[1] = [argc, func, type] */
- var argc = (f[1][0]), func = (f[1][1]);
- if(!argc) argc = 0;
- argc &= 0x7F;
- var args = argc == 0 ? [] : stack.slice(-argc);
- stack.length -= argc;
- if(func === 'User') func = args.shift();
- stack.push(func + "(" + args.join(",") + ")");
- break;
-
- case 'PtgBool': /* [MS-XLS] 2.5.198.42 */
- stack.push(f[1] ? "TRUE" : "FALSE"); break;
- case 'PtgInt': /* [MS-XLS] 2.5.198.66 */
- stack.push(f[1]); break;
- case 'PtgNum': /* [MS-XLS] 2.5.198.79 TODO: precision? */
- stack.push(String(f[1])); break;
- case 'PtgStr': /* [MS-XLS] 2.5.198.89 */
- // $FlowIgnore
- stack.push('"' + f[1].replace(/"/g, '""') + '"'); break;
- case 'PtgErr': /* [MS-XLS] 2.5.198.57 */
- stack.push(f[1]); break;
- case 'PtgAreaN': /* [MS-XLS] 2.5.198.31 TODO */
- r = shift_range_xls(f[1][1], cell ? {s:cell} : _range, opts);
- stack.push(encode_range_xls((r), opts));
- break;
- case 'PtgArea': /* [MS-XLS] 2.5.198.27 TODO: fixed points */
- r = shift_range_xls(f[1][1], _range, opts);
- stack.push(encode_range_xls((r), opts));
- break;
- case 'PtgArea3d': /* [MS-XLS] 2.5.198.28 TODO */
- ixti = f[1][1]; r = f[1][2];
- sname = get_ixti(supbooks, ixti, opts);
- stack.push(sname + "!" + encode_range_xls((r), opts));
- break;
- case 'PtgAttrSum': /* [MS-XLS] 2.5.198.41 */
- stack.push("SUM(" + stack.pop() + ")");
- break;
-
- case 'PtgAttrBaxcel': /* [MS-XLS] 2.5.198.33 */
- case 'PtgAttrSemi': /* [MS-XLS] 2.5.198.37 */
- break;
-
- case 'PtgName': /* [MS-XLS] 2.5.198.76 ; [MS-XLSB] 2.5.97.60 TODO: revisions */
- /* f[1] = type, 0, nameindex */
- nameidx = (f[1][2]);
- var lbl = (supbooks.names||[])[nameidx-1] || (supbooks[0]||[])[nameidx];
- var name = lbl ? lbl.Name : "SH33TJSNAME" + String(nameidx);
- if(name in XLSXFutureFunctions) name = XLSXFutureFunctions[name];
- stack.push(name);
- break;
-
- case 'PtgNameX': /* [MS-XLS] 2.5.198.77 ; [MS-XLSB] 2.5.97.61 TODO: revisions */
- /* f[1] = type, ixti, nameindex */
- var bookidx = (f[1][1]); nameidx = (f[1][2]); var externbook;
- /* TODO: Properly handle missing values -- this should be using get_ixti_raw primarily */
- if(opts.biff <= 5) {
- if(bookidx < 0) bookidx = -bookidx;
- if(supbooks[bookidx]) externbook = supbooks[bookidx][nameidx];
- } else {
- var o = "";
- if(((supbooks[bookidx]||[])[0]||[])[0] == 0x3A01){/* empty */}
- else if(((supbooks[bookidx]||[])[0]||[])[0] == 0x0401){
- if(supbooks[bookidx][nameidx] && supbooks[bookidx][nameidx].itab > 0) {
- o = supbooks.SheetNames[supbooks[bookidx][nameidx].itab-1] + "!";
- }
- }
- else o = supbooks.SheetNames[nameidx-1]+ "!";
- if(supbooks[bookidx] && supbooks[bookidx][nameidx]) o += supbooks[bookidx][nameidx].Name;
- else if(supbooks[0] && supbooks[0][nameidx]) o += supbooks[0][nameidx].Name;
- else {
- var ixtidata = get_ixti_raw(supbooks, bookidx, opts).split(";;");
- if(ixtidata[nameidx - 1]) o = ixtidata[nameidx - 1]; // TODO: confirm this is correct
- else o += "SH33TJSERRX";
- }
- stack.push(o);
- break;
- }
- if(!externbook) externbook = {Name: "SH33TJSERRY"};
- stack.push(externbook.Name);
- break;
-
- case 'PtgParen': /* [MS-XLS] 2.5.198.80 */
- var lp = '(', rp = ')';
- if(last_sp >= 0) {
- sp = "";
- switch(formula[0][last_sp][1][0]) {
- // $FlowIgnore
- case 2: lp = fill(" ", formula[0][last_sp][1][1]) + lp; break;
- // $FlowIgnore
- case 3: lp = fill("\r", formula[0][last_sp][1][1]) + lp; break;
- // $FlowIgnore
- case 4: rp = fill(" ", formula[0][last_sp][1][1]) + rp; break;
- // $FlowIgnore
- case 5: rp = fill("\r", formula[0][last_sp][1][1]) + rp; break;
- default:
- // $FlowIgnore
- if(opts.WTF) throw new Error("Unexpected PtgAttrSpaceType " + formula[0][last_sp][1][0]);
- }
- last_sp = -1;
- }
- stack.push(lp + stack.pop() + rp); break;
-
- case 'PtgRefErr': /* [MS-XLS] 2.5.198.86 */
- stack.push('#REF!'); break;
-
- case 'PtgRefErr3d': /* [MS-XLS] 2.5.198.87 */
- stack.push('#REF!'); break;
-
- case 'PtgExp': /* [MS-XLS] 2.5.198.58 TODO */
- c = {c:(f[1][1]),r:(f[1][0])};
- var q = ({c: cell.c, r:cell.r});
- if(supbooks.sharedf[encode_cell(c)]) {
- var parsedf = (supbooks.sharedf[encode_cell(c)]);
- stack.push(stringify_formula(parsedf, _range, q, supbooks, opts));
- }
- else {
- var fnd = false;
- for(e1=0;e1!=supbooks.arrayf.length; ++e1) {
- /* TODO: should be something like range_has */
- e2 = supbooks.arrayf[e1];
- if(c.c < e2[0].s.c || c.c > e2[0].e.c) continue;
- if(c.r < e2[0].s.r || c.r > e2[0].e.r) continue;
- stack.push(stringify_formula(e2[1], _range, q, supbooks, opts));
- fnd = true;
- break;
- }
- if(!fnd) stack.push(f[1]);
- }
- break;
-
- case 'PtgArray': /* [MS-XLS] 2.5.198.32 TODO */
- stack.push("{" + stringify_array(f[1]) + "}");
- break;
-
- case 'PtgMemArea': /* [MS-XLS] 2.5.198.70 TODO: confirm this is a non-display */
- //stack.push("(" + f[2].map(encode_range).join(",") + ")");
- break;
-
- case 'PtgAttrSpace': /* [MS-XLS] 2.5.198.38 */
- case 'PtgAttrSpaceSemi': /* [MS-XLS] 2.5.198.39 */
- last_sp = ff;
- break;
-
- case 'PtgTbl': /* [MS-XLS] 2.5.198.92 TODO */
- break;
-
- case 'PtgMemErr': /* [MS-XLS] 2.5.198.71 */
- break;
-
- case 'PtgMissArg': /* [MS-XLS] 2.5.198.74 */
- stack.push("");
- break;
-
- case 'PtgAreaErr': /* [MS-XLS] 2.5.198.29 */
- stack.push("#REF!"); break;
-
- case 'PtgAreaErr3d': /* [MS-XLS] 2.5.198.30 */
- stack.push("#REF!"); break;
-
- case 'PtgList': /* [MS-XLSB] 2.5.97.52 */
- // $FlowIgnore
- stack.push("Table" + f[1].idx + "[#" + f[1].rt + "]");
- break;
-
- case 'PtgMemAreaN':
- case 'PtgMemNoMemN':
- case 'PtgAttrNoop':
- case 'PtgSheet':
- case 'PtgEndSheet':
- break;
-
- case 'PtgMemFunc': /* [MS-XLS] 2.5.198.72 TODO */
- break;
- case 'PtgMemNoMem': /* [MS-XLS] 2.5.198.73 TODO */
- break;
-
- case 'PtgElfCol': /* [MS-XLS] 2.5.198.46 */
- case 'PtgElfColS': /* [MS-XLS] 2.5.198.47 */
- case 'PtgElfColSV': /* [MS-XLS] 2.5.198.48 */
- case 'PtgElfColV': /* [MS-XLS] 2.5.198.49 */
- case 'PtgElfLel': /* [MS-XLS] 2.5.198.50 */
- case 'PtgElfRadical': /* [MS-XLS] 2.5.198.51 */
- case 'PtgElfRadicalLel': /* [MS-XLS] 2.5.198.52 */
- case 'PtgElfRadicalS': /* [MS-XLS] 2.5.198.53 */
- case 'PtgElfRw': /* [MS-XLS] 2.5.198.54 */
- case 'PtgElfRwV': /* [MS-XLS] 2.5.198.55 */
- throw new Error("Unsupported ELFs");
-
- case 'PtgSxName': /* [MS-XLS] 2.5.198.91 TODO -- find a test case */
- throw new Error('Unrecognized Formula Token: ' + String(f));
- default: throw new Error('Unrecognized Formula Token: ' + String(f));
- }
- var PtgNonDisp = ['PtgAttrSpace', 'PtgAttrSpaceSemi', 'PtgAttrGoto'];
- if(opts.biff != 3) if(last_sp >= 0 && PtgNonDisp.indexOf(formula[0][ff][0]) == -1) {
- f = formula[0][last_sp];
- var _left = true;
- switch(f[1][0]) {
- /* note: some bad XLSB files omit the PtgParen */
- case 4: _left = false;
- /* falls through */
- case 0:
- // $FlowIgnore
- sp = fill(" ", f[1][1]); break;
- case 5: _left = false;
- /* falls through */
- case 1:
- // $FlowIgnore
- sp = fill("\r", f[1][1]); break;
- default:
- sp = "";
- // $FlowIgnore
- if(opts.WTF) throw new Error("Unexpected PtgAttrSpaceType " + f[1][0]);
- }
- stack.push((_left ? sp : "") + stack.pop() + (_left ? "" : sp));
- last_sp = -1;
- }
- }
- if(stack.length > 1 && opts.WTF) throw new Error("bad formula stack");
- return stack[0];
- }
-
- /* [MS-XLS] 2.5.198.1 TODO */
- function parse_ArrayParsedFormula(blob, length, opts) {
- var target = blob.l + length, len = opts.biff == 2 ? 1 : 2;
- var rgcb, cce = blob.read_shift(len); // length of rgce
- if(cce == 0xFFFF) return [[],parsenoop(blob, length-2)];
- var rgce = parse_Rgce(blob, cce, opts);
- if(length !== cce + len) rgcb = parse_RgbExtra(blob, length - cce - len, rgce, opts);
- blob.l = target;
- return [rgce, rgcb];
- }
-
- /* [MS-XLS] 2.5.198.3 TODO */
- function parse_XLSCellParsedFormula(blob, length, opts) {
- var target = blob.l + length, len = opts.biff == 2 ? 1 : 2;
- var rgcb, cce = blob.read_shift(len); // length of rgce
- if(cce == 0xFFFF) return [[],parsenoop(blob, length-2)];
- var rgce = parse_Rgce(blob, cce, opts);
- if(length !== cce + len) rgcb = parse_RgbExtra(blob, length - cce - len, rgce, opts);
- blob.l = target;
- return [rgce, rgcb];
- }
-
- /* [MS-XLS] 2.5.198.21 */
- function parse_NameParsedFormula(blob, length, opts, cce) {
- var target = blob.l + length;
- var rgce = parse_Rgce(blob, cce, opts);
- var rgcb;
- if(target !== blob.l) rgcb = parse_RgbExtra(blob, target - blob.l, rgce, opts);
- return [rgce, rgcb];
- }
-
- /* [MS-XLS] 2.5.198.118 TODO */
- function parse_SharedParsedFormula(blob, length, opts) {
- var target = blob.l + length;
- var rgcb, cce = blob.read_shift(2); // length of rgce
- var rgce = parse_Rgce(blob, cce, opts);
- if(cce == 0xFFFF) return [[],parsenoop(blob, length-2)];
- if(length !== cce + 2) rgcb = parse_RgbExtra(blob, target - cce - 2, rgce, opts);
- return [rgce, rgcb];
- }
-
- /* [MS-XLS] 2.5.133 TODO: how to emit empty strings? */
- function parse_FormulaValue(blob) {
- var b;
- if(__readUInt16LE(blob,blob.l + 6) !== 0xFFFF) return [parse_Xnum(blob),'n'];
- switch(blob[blob.l]) {
- case 0x00: blob.l += 8; return ["String", 's'];
- case 0x01: b = blob[blob.l+2] === 0x1; blob.l += 8; return [b,'b'];
- case 0x02: b = blob[blob.l+2]; blob.l += 8; return [b,'e'];
- case 0x03: blob.l += 8; return ["",'s'];
- }
- return [];
- }
- function write_FormulaValue(value) {
- if(value == null) {
- // Blank String Value
- var o = new_buf(8);
- o.write_shift(1, 0x03);
- o.write_shift(1, 0);
- o.write_shift(2, 0);
- o.write_shift(2, 0);
- o.write_shift(2, 0xFFFF);
- return o;
- } else if(typeof value == "number") return write_Xnum(value);
- return write_Xnum(0);
- }
-
- /* [MS-XLS] 2.4.127 TODO */
- function parse_Formula(blob, length, opts) {
- var end = blob.l + length;
- var cell = parse_XLSCell(blob, 6);
- if(opts.biff == 2) ++blob.l;
- var val = parse_FormulaValue(blob,8);
- var flags = blob.read_shift(1);
- if(opts.biff != 2) {
- blob.read_shift(1);
- if(opts.biff >= 5) {
- /*var chn = */blob.read_shift(4);
- }
- }
- var cbf = parse_XLSCellParsedFormula(blob, end - blob.l, opts);
- return {cell:cell, val:val[0], formula:cbf, shared: (flags >> 3) & 1, tt:val[1]};
- }
- function write_Formula(cell, R, C, opts, os) {
- // Cell
- var o1 = write_XLSCell(R, C, os);
-
- // FormulaValue
- var o2 = write_FormulaValue(cell.v);
-
- // flags + cache
- var o3 = new_buf(6);
- var flags = 0x01 | 0x20;
- o3.write_shift(2, flags);
- o3.write_shift(4, 0);
-
- // CellParsedFormula
- var bf = new_buf(cell.bf.length);
- for(var i = 0; i < cell.bf.length; ++i) bf[i] = cell.bf[i];
-
- var out = bconcat([o1, o2, o3, bf]);
- return out;
- }
-
-
- /* XLSB Parsed Formula records have the same shape */
- function parse_XLSBParsedFormula(data, length, opts) {
- var cce = data.read_shift(4);
- var rgce = parse_Rgce(data, cce, opts);
- var cb = data.read_shift(4);
- var rgcb = cb > 0 ? parse_RgbExtra(data, cb, rgce, opts) : null;
- return [rgce, rgcb];
- }
-
- /* [MS-XLSB] 2.5.97.1 ArrayParsedFormula */
- var parse_XLSBArrayParsedFormula = parse_XLSBParsedFormula;
- /* [MS-XLSB] 2.5.97.4 CellParsedFormula */
- var parse_XLSBCellParsedFormula = parse_XLSBParsedFormula;
- /* [MS-XLSB] 2.5.97.8 DVParsedFormula */
- //var parse_XLSBDVParsedFormula = parse_XLSBParsedFormula;
- /* [MS-XLSB] 2.5.97.9 FRTParsedFormula */
- //var parse_XLSBFRTParsedFormula = parse_XLSBParsedFormula2;
- /* [MS-XLSB] 2.5.97.12 NameParsedFormula */
- var parse_XLSBNameParsedFormula = parse_XLSBParsedFormula;
- /* [MS-XLSB] 2.5.97.98 SharedParsedFormula */
- var parse_XLSBSharedParsedFormula = parse_XLSBParsedFormula;
- /* [MS-XLS] 2.5.198.4 */
- var Cetab = {
- 0x0000: 'BEEP',
- 0x0001: 'OPEN',
- 0x0002: 'OPEN.LINKS',
- 0x0003: 'CLOSE.ALL',
- 0x0004: 'SAVE',
- 0x0005: 'SAVE.AS',
- 0x0006: 'FILE.DELETE',
- 0x0007: 'PAGE.SETUP',
- 0x0008: 'PRINT',
- 0x0009: 'PRINTER.SETUP',
- 0x000A: 'QUIT',
- 0x000B: 'NEW.WINDOW',
- 0x000C: 'ARRANGE.ALL',
- 0x000D: 'WINDOW.SIZE',
- 0x000E: 'WINDOW.MOVE',
- 0x000F: 'FULL',
- 0x0010: 'CLOSE',
- 0x0011: 'RUN',
- 0x0016: 'SET.PRINT.AREA',
- 0x0017: 'SET.PRINT.TITLES',
- 0x0018: 'SET.PAGE.BREAK',
- 0x0019: 'REMOVE.PAGE.BREAK',
- 0x001A: 'FONT',
- 0x001B: 'DISPLAY',
- 0x001C: 'PROTECT.DOCUMENT',
- 0x001D: 'PRECISION',
- 0x001E: 'A1.R1C1',
- 0x001F: 'CALCULATE.NOW',
- 0x0020: 'CALCULATION',
- 0x0022: 'DATA.FIND',
- 0x0023: 'EXTRACT',
- 0x0024: 'DATA.DELETE',
- 0x0025: 'SET.DATABASE',
- 0x0026: 'SET.CRITERIA',
- 0x0027: 'SORT',
- 0x0028: 'DATA.SERIES',
- 0x0029: 'TABLE',
- 0x002A: 'FORMAT.NUMBER',
- 0x002B: 'ALIGNMENT',
- 0x002C: 'STYLE',
- 0x002D: 'BORDER',
- 0x002E: 'CELL.PROTECTION',
- 0x002F: 'COLUMN.WIDTH',
- 0x0030: 'UNDO',
- 0x0031: 'CUT',
- 0x0032: 'COPY',
- 0x0033: 'PASTE',
- 0x0034: 'CLEAR',
- 0x0035: 'PASTE.SPECIAL',
- 0x0036: 'EDIT.DELETE',
- 0x0037: 'INSERT',
- 0x0038: 'FILL.RIGHT',
- 0x0039: 'FILL.DOWN',
- 0x003D: 'DEFINE.NAME',
- 0x003E: 'CREATE.NAMES',
- 0x003F: 'FORMULA.GOTO',
- 0x0040: 'FORMULA.FIND',
- 0x0041: 'SELECT.LAST.CELL',
- 0x0042: 'SHOW.ACTIVE.CELL',
- 0x0043: 'GALLERY.AREA',
- 0x0044: 'GALLERY.BAR',
- 0x0045: 'GALLERY.COLUMN',
- 0x0046: 'GALLERY.LINE',
- 0x0047: 'GALLERY.PIE',
- 0x0048: 'GALLERY.SCATTER',
- 0x0049: 'COMBINATION',
- 0x004A: 'PREFERRED',
- 0x004B: 'ADD.OVERLAY',
- 0x004C: 'GRIDLINES',
- 0x004D: 'SET.PREFERRED',
- 0x004E: 'AXES',
- 0x004F: 'LEGEND',
- 0x0050: 'ATTACH.TEXT',
- 0x0051: 'ADD.ARROW',
- 0x0052: 'SELECT.CHART',
- 0x0053: 'SELECT.PLOT.AREA',
- 0x0054: 'PATTERNS',
- 0x0055: 'MAIN.CHART',
- 0x0056: 'OVERLAY',
- 0x0057: 'SCALE',
- 0x0058: 'FORMAT.LEGEND',
- 0x0059: 'FORMAT.TEXT',
- 0x005A: 'EDIT.REPEAT',
- 0x005B: 'PARSE',
- 0x005C: 'JUSTIFY',
- 0x005D: 'HIDE',
- 0x005E: 'UNHIDE',
- 0x005F: 'WORKSPACE',
- 0x0060: 'FORMULA',
- 0x0061: 'FORMULA.FILL',
- 0x0062: 'FORMULA.ARRAY',
- 0x0063: 'DATA.FIND.NEXT',
- 0x0064: 'DATA.FIND.PREV',
- 0x0065: 'FORMULA.FIND.NEXT',
- 0x0066: 'FORMULA.FIND.PREV',
- 0x0067: 'ACTIVATE',
- 0x0068: 'ACTIVATE.NEXT',
- 0x0069: 'ACTIVATE.PREV',
- 0x006A: 'UNLOCKED.NEXT',
- 0x006B: 'UNLOCKED.PREV',
- 0x006C: 'COPY.PICTURE',
- 0x006D: 'SELECT',
- 0x006E: 'DELETE.NAME',
- 0x006F: 'DELETE.FORMAT',
- 0x0070: 'VLINE',
- 0x0071: 'HLINE',
- 0x0072: 'VPAGE',
- 0x0073: 'HPAGE',
- 0x0074: 'VSCROLL',
- 0x0075: 'HSCROLL',
- 0x0076: 'ALERT',
- 0x0077: 'NEW',
- 0x0078: 'CANCEL.COPY',
- 0x0079: 'SHOW.CLIPBOARD',
- 0x007A: 'MESSAGE',
- 0x007C: 'PASTE.LINK',
- 0x007D: 'APP.ACTIVATE',
- 0x007E: 'DELETE.ARROW',
- 0x007F: 'ROW.HEIGHT',
- 0x0080: 'FORMAT.MOVE',
- 0x0081: 'FORMAT.SIZE',
- 0x0082: 'FORMULA.REPLACE',
- 0x0083: 'SEND.KEYS',
- 0x0084: 'SELECT.SPECIAL',
- 0x0085: 'APPLY.NAMES',
- 0x0086: 'REPLACE.FONT',
- 0x0087: 'FREEZE.PANES',
- 0x0088: 'SHOW.INFO',
- 0x0089: 'SPLIT',
- 0x008A: 'ON.WINDOW',
- 0x008B: 'ON.DATA',
- 0x008C: 'DISABLE.INPUT',
- 0x008E: 'OUTLINE',
- 0x008F: 'LIST.NAMES',
- 0x0090: 'FILE.CLOSE',
- 0x0091: 'SAVE.WORKBOOK',
- 0x0092: 'DATA.FORM',
- 0x0093: 'COPY.CHART',
- 0x0094: 'ON.TIME',
- 0x0095: 'WAIT',
- 0x0096: 'FORMAT.FONT',
- 0x0097: 'FILL.UP',
- 0x0098: 'FILL.LEFT',
- 0x0099: 'DELETE.OVERLAY',
- 0x009B: 'SHORT.MENUS',
- 0x009F: 'SET.UPDATE.STATUS',
- 0x00A1: 'COLOR.PALETTE',
- 0x00A2: 'DELETE.STYLE',
- 0x00A3: 'WINDOW.RESTORE',
- 0x00A4: 'WINDOW.MAXIMIZE',
- 0x00A6: 'CHANGE.LINK',
- 0x00A7: 'CALCULATE.DOCUMENT',
- 0x00A8: 'ON.KEY',
- 0x00A9: 'APP.RESTORE',
- 0x00AA: 'APP.MOVE',
- 0x00AB: 'APP.SIZE',
- 0x00AC: 'APP.MINIMIZE',
- 0x00AD: 'APP.MAXIMIZE',
- 0x00AE: 'BRING.TO.FRONT',
- 0x00AF: 'SEND.TO.BACK',
- 0x00B9: 'MAIN.CHART.TYPE',
- 0x00BA: 'OVERLAY.CHART.TYPE',
- 0x00BB: 'SELECT.END',
- 0x00BC: 'OPEN.MAIL',
- 0x00BD: 'SEND.MAIL',
- 0x00BE: 'STANDARD.FONT',
- 0x00BF: 'CONSOLIDATE',
- 0x00C0: 'SORT.SPECIAL',
- 0x00C1: 'GALLERY.3D.AREA',
- 0x00C2: 'GALLERY.3D.COLUMN',
- 0x00C3: 'GALLERY.3D.LINE',
- 0x00C4: 'GALLERY.3D.PIE',
- 0x00C5: 'VIEW.3D',
- 0x00C6: 'GOAL.SEEK',
- 0x00C7: 'WORKGROUP',
- 0x00C8: 'FILL.GROUP',
- 0x00C9: 'UPDATE.LINK',
- 0x00CA: 'PROMOTE',
- 0x00CB: 'DEMOTE',
- 0x00CC: 'SHOW.DETAIL',
- 0x00CE: 'UNGROUP',
- 0x00CF: 'OBJECT.PROPERTIES',
- 0x00D0: 'SAVE.NEW.OBJECT',
- 0x00D1: 'SHARE',
- 0x00D2: 'SHARE.NAME',
- 0x00D3: 'DUPLICATE',
- 0x00D4: 'APPLY.STYLE',
- 0x00D5: 'ASSIGN.TO.OBJECT',
- 0x00D6: 'OBJECT.PROTECTION',
- 0x00D7: 'HIDE.OBJECT',
- 0x00D8: 'SET.EXTRACT',
- 0x00D9: 'CREATE.PUBLISHER',
- 0x00DA: 'SUBSCRIBE.TO',
- 0x00DB: 'ATTRIBUTES',
- 0x00DC: 'SHOW.TOOLBAR',
- 0x00DE: 'PRINT.PREVIEW',
- 0x00DF: 'EDIT.COLOR',
- 0x00E0: 'SHOW.LEVELS',
- 0x00E1: 'FORMAT.MAIN',
- 0x00E2: 'FORMAT.OVERLAY',
- 0x00E3: 'ON.RECALC',
- 0x00E4: 'EDIT.SERIES',
- 0x00E5: 'DEFINE.STYLE',
- 0x00F0: 'LINE.PRINT',
- 0x00F3: 'ENTER.DATA',
- 0x00F9: 'GALLERY.RADAR',
- 0x00FA: 'MERGE.STYLES',
- 0x00FB: 'EDITION.OPTIONS',
- 0x00FC: 'PASTE.PICTURE',
- 0x00FD: 'PASTE.PICTURE.LINK',
- 0x00FE: 'SPELLING',
- 0x0100: 'ZOOM',
- 0x0103: 'INSERT.OBJECT',
- 0x0104: 'WINDOW.MINIMIZE',
- 0x0109: 'SOUND.NOTE',
- 0x010A: 'SOUND.PLAY',
- 0x010B: 'FORMAT.SHAPE',
- 0x010C: 'EXTEND.POLYGON',
- 0x010D: 'FORMAT.AUTO',
- 0x0110: 'GALLERY.3D.BAR',
- 0x0111: 'GALLERY.3D.SURFACE',
- 0x0112: 'FILL.AUTO',
- 0x0114: 'CUSTOMIZE.TOOLBAR',
- 0x0115: 'ADD.TOOL',
- 0x0116: 'EDIT.OBJECT',
- 0x0117: 'ON.DOUBLECLICK',
- 0x0118: 'ON.ENTRY',
- 0x0119: 'WORKBOOK.ADD',
- 0x011A: 'WORKBOOK.MOVE',
- 0x011B: 'WORKBOOK.COPY',
- 0x011C: 'WORKBOOK.OPTIONS',
- 0x011D: 'SAVE.WORKSPACE',
- 0x0120: 'CHART.WIZARD',
- 0x0121: 'DELETE.TOOL',
- 0x0122: 'MOVE.TOOL',
- 0x0123: 'WORKBOOK.SELECT',
- 0x0124: 'WORKBOOK.ACTIVATE',
- 0x0125: 'ASSIGN.TO.TOOL',
- 0x0127: 'COPY.TOOL',
- 0x0128: 'RESET.TOOL',
- 0x0129: 'CONSTRAIN.NUMERIC',
- 0x012A: 'PASTE.TOOL',
- 0x012E: 'WORKBOOK.NEW',
- 0x0131: 'SCENARIO.CELLS',
- 0x0132: 'SCENARIO.DELETE',
- 0x0133: 'SCENARIO.ADD',
- 0x0134: 'SCENARIO.EDIT',
- 0x0135: 'SCENARIO.SHOW',
- 0x0136: 'SCENARIO.SHOW.NEXT',
- 0x0137: 'SCENARIO.SUMMARY',
- 0x0138: 'PIVOT.TABLE.WIZARD',
- 0x0139: 'PIVOT.FIELD.PROPERTIES',
- 0x013A: 'PIVOT.FIELD',
- 0x013B: 'PIVOT.ITEM',
- 0x013C: 'PIVOT.ADD.FIELDS',
- 0x013E: 'OPTIONS.CALCULATION',
- 0x013F: 'OPTIONS.EDIT',
- 0x0140: 'OPTIONS.VIEW',
- 0x0141: 'ADDIN.MANAGER',
- 0x0142: 'MENU.EDITOR',
- 0x0143: 'ATTACH.TOOLBARS',
- 0x0144: 'VBAActivate',
- 0x0145: 'OPTIONS.CHART',
- 0x0148: 'VBA.INSERT.FILE',
- 0x014A: 'VBA.PROCEDURE.DEFINITION',
- 0x0150: 'ROUTING.SLIP',
- 0x0152: 'ROUTE.DOCUMENT',
- 0x0153: 'MAIL.LOGON',
- 0x0156: 'INSERT.PICTURE',
- 0x0157: 'EDIT.TOOL',
- 0x0158: 'GALLERY.DOUGHNUT',
- 0x015E: 'CHART.TREND',
- 0x0160: 'PIVOT.ITEM.PROPERTIES',
- 0x0162: 'WORKBOOK.INSERT',
- 0x0163: 'OPTIONS.TRANSITION',
- 0x0164: 'OPTIONS.GENERAL',
- 0x0172: 'FILTER.ADVANCED',
- 0x0175: 'MAIL.ADD.MAILER',
- 0x0176: 'MAIL.DELETE.MAILER',
- 0x0177: 'MAIL.REPLY',
- 0x0178: 'MAIL.REPLY.ALL',
- 0x0179: 'MAIL.FORWARD',
- 0x017A: 'MAIL.NEXT.LETTER',
- 0x017B: 'DATA.LABEL',
- 0x017C: 'INSERT.TITLE',
- 0x017D: 'FONT.PROPERTIES',
- 0x017E: 'MACRO.OPTIONS',
- 0x017F: 'WORKBOOK.HIDE',
- 0x0180: 'WORKBOOK.UNHIDE',
- 0x0181: 'WORKBOOK.DELETE',
- 0x0182: 'WORKBOOK.NAME',
- 0x0184: 'GALLERY.CUSTOM',
- 0x0186: 'ADD.CHART.AUTOFORMAT',
- 0x0187: 'DELETE.CHART.AUTOFORMAT',
- 0x0188: 'CHART.ADD.DATA',
- 0x0189: 'AUTO.OUTLINE',
- 0x018A: 'TAB.ORDER',
- 0x018B: 'SHOW.DIALOG',
- 0x018C: 'SELECT.ALL',
- 0x018D: 'UNGROUP.SHEETS',
- 0x018E: 'SUBTOTAL.CREATE',
- 0x018F: 'SUBTOTAL.REMOVE',
- 0x0190: 'RENAME.OBJECT',
- 0x019C: 'WORKBOOK.SCROLL',
- 0x019D: 'WORKBOOK.NEXT',
- 0x019E: 'WORKBOOK.PREV',
- 0x019F: 'WORKBOOK.TAB.SPLIT',
- 0x01A0: 'FULL.SCREEN',
- 0x01A1: 'WORKBOOK.PROTECT',
- 0x01A4: 'SCROLLBAR.PROPERTIES',
- 0x01A5: 'PIVOT.SHOW.PAGES',
- 0x01A6: 'TEXT.TO.COLUMNS',
- 0x01A7: 'FORMAT.CHARTTYPE',
- 0x01A8: 'LINK.FORMAT',
- 0x01A9: 'TRACER.DISPLAY',
- 0x01AE: 'TRACER.NAVIGATE',
- 0x01AF: 'TRACER.CLEAR',
- 0x01B0: 'TRACER.ERROR',
- 0x01B1: 'PIVOT.FIELD.GROUP',
- 0x01B2: 'PIVOT.FIELD.UNGROUP',
- 0x01B3: 'CHECKBOX.PROPERTIES',
- 0x01B4: 'LABEL.PROPERTIES',
- 0x01B5: 'LISTBOX.PROPERTIES',
- 0x01B6: 'EDITBOX.PROPERTIES',
- 0x01B7: 'PIVOT.REFRESH',
- 0x01B8: 'LINK.COMBO',
- 0x01B9: 'OPEN.TEXT',
- 0x01BA: 'HIDE.DIALOG',
- 0x01BB: 'SET.DIALOG.FOCUS',
- 0x01BC: 'ENABLE.OBJECT',
- 0x01BD: 'PUSHBUTTON.PROPERTIES',
- 0x01BE: 'SET.DIALOG.DEFAULT',
- 0x01BF: 'FILTER',
- 0x01C0: 'FILTER.SHOW.ALL',
- 0x01C1: 'CLEAR.OUTLINE',
- 0x01C2: 'FUNCTION.WIZARD',
- 0x01C3: 'ADD.LIST.ITEM',
- 0x01C4: 'SET.LIST.ITEM',
- 0x01C5: 'REMOVE.LIST.ITEM',
- 0x01C6: 'SELECT.LIST.ITEM',
- 0x01C7: 'SET.CONTROL.VALUE',
- 0x01C8: 'SAVE.COPY.AS',
- 0x01CA: 'OPTIONS.LISTS.ADD',
- 0x01CB: 'OPTIONS.LISTS.DELETE',
- 0x01CC: 'SERIES.AXES',
- 0x01CD: 'SERIES.X',
- 0x01CE: 'SERIES.Y',
- 0x01CF: 'ERRORBAR.X',
- 0x01D0: 'ERRORBAR.Y',
- 0x01D1: 'FORMAT.CHART',
- 0x01D2: 'SERIES.ORDER',
- 0x01D3: 'MAIL.LOGOFF',
- 0x01D4: 'CLEAR.ROUTING.SLIP',
- 0x01D5: 'APP.ACTIVATE.MICROSOFT',
- 0x01D6: 'MAIL.EDIT.MAILER',
- 0x01D7: 'ON.SHEET',
- 0x01D8: 'STANDARD.WIDTH',
- 0x01D9: 'SCENARIO.MERGE',
- 0x01DA: 'SUMMARY.INFO',
- 0x01DB: 'FIND.FILE',
- 0x01DC: 'ACTIVE.CELL.FONT',
- 0x01DD: 'ENABLE.TIPWIZARD',
- 0x01DE: 'VBA.MAKE.ADDIN',
- 0x01E0: 'INSERTDATATABLE',
- 0x01E1: 'WORKGROUP.OPTIONS',
- 0x01E2: 'MAIL.SEND.MAILER',
- 0x01E5: 'AUTOCORRECT',
- 0x01E9: 'POST.DOCUMENT',
- 0x01EB: 'PICKLIST',
- 0x01ED: 'VIEW.SHOW',
- 0x01EE: 'VIEW.DEFINE',
- 0x01EF: 'VIEW.DELETE',
- 0x01FD: 'SHEET.BACKGROUND',
- 0x01FE: 'INSERT.MAP.OBJECT',
- 0x01FF: 'OPTIONS.MENONO',
- 0x0205: 'MSOCHECKS',
- 0x0206: 'NORMAL',
- 0x0207: 'LAYOUT',
- 0x0208: 'RM.PRINT.AREA',
- 0x0209: 'CLEAR.PRINT.AREA',
- 0x020A: 'ADD.PRINT.AREA',
- 0x020B: 'MOVE.BRK',
- 0x0221: 'HIDECURR.NOTE',
- 0x0222: 'HIDEALL.NOTES',
- 0x0223: 'DELETE.NOTE',
- 0x0224: 'TRAVERSE.NOTES',
- 0x0225: 'ACTIVATE.NOTES',
- 0x026C: 'PROTECT.REVISIONS',
- 0x026D: 'UNPROTECT.REVISIONS',
- 0x0287: 'OPTIONS.ME',
- 0x028D: 'WEB.PUBLISH',
- 0x029B: 'NEWWEBQUERY',
- 0x02A1: 'PIVOT.TABLE.CHART',
- 0x02F1: 'OPTIONS.SAVE',
- 0x02F3: 'OPTIONS.SPELL',
- 0x0328: 'HIDEALL.INKANNOTS'
- };
-
- /* [MS-XLS] 2.5.198.17 */
- /* [MS-XLSB] 2.5.97.10 */
- var Ftab = {
- 0x0000: 'COUNT',
- 0x0001: 'IF',
- 0x0002: 'ISNA',
- 0x0003: 'ISERROR',
- 0x0004: 'SUM',
- 0x0005: 'AVERAGE',
- 0x0006: 'MIN',
- 0x0007: 'MAX',
- 0x0008: 'ROW',
- 0x0009: 'COLUMN',
- 0x000A: 'NA',
- 0x000B: 'NPV',
- 0x000C: 'STDEV',
- 0x000D: 'DOLLAR',
- 0x000E: 'FIXED',
- 0x000F: 'SIN',
- 0x0010: 'COS',
- 0x0011: 'TAN',
- 0x0012: 'ATAN',
- 0x0013: 'PI',
- 0x0014: 'SQRT',
- 0x0015: 'EXP',
- 0x0016: 'LN',
- 0x0017: 'LOG10',
- 0x0018: 'ABS',
- 0x0019: 'INT',
- 0x001A: 'SIGN',
- 0x001B: 'ROUND',
- 0x001C: 'LOOKUP',
- 0x001D: 'INDEX',
- 0x001E: 'REPT',
- 0x001F: 'MID',
- 0x0020: 'LEN',
- 0x0021: 'VALUE',
- 0x0022: 'TRUE',
- 0x0023: 'FALSE',
- 0x0024: 'AND',
- 0x0025: 'OR',
- 0x0026: 'NOT',
- 0x0027: 'MOD',
- 0x0028: 'DCOUNT',
- 0x0029: 'DSUM',
- 0x002A: 'DAVERAGE',
- 0x002B: 'DMIN',
- 0x002C: 'DMAX',
- 0x002D: 'DSTDEV',
- 0x002E: 'VAR',
- 0x002F: 'DVAR',
- 0x0030: 'TEXT',
- 0x0031: 'LINEST',
- 0x0032: 'TREND',
- 0x0033: 'LOGEST',
- 0x0034: 'GROWTH',
- 0x0035: 'GOTO',
- 0x0036: 'HALT',
- 0x0037: 'RETURN',
- 0x0038: 'PV',
- 0x0039: 'FV',
- 0x003A: 'NPER',
- 0x003B: 'PMT',
- 0x003C: 'RATE',
- 0x003D: 'MIRR',
- 0x003E: 'IRR',
- 0x003F: 'RAND',
- 0x0040: 'MATCH',
- 0x0041: 'DATE',
- 0x0042: 'TIME',
- 0x0043: 'DAY',
- 0x0044: 'MONTH',
- 0x0045: 'YEAR',
- 0x0046: 'WEEKDAY',
- 0x0047: 'HOUR',
- 0x0048: 'MINUTE',
- 0x0049: 'SECOND',
- 0x004A: 'NOW',
- 0x004B: 'AREAS',
- 0x004C: 'ROWS',
- 0x004D: 'COLUMNS',
- 0x004E: 'OFFSET',
- 0x004F: 'ABSREF',
- 0x0050: 'RELREF',
- 0x0051: 'ARGUMENT',
- 0x0052: 'SEARCH',
- 0x0053: 'TRANSPOSE',
- 0x0054: 'ERROR',
- 0x0055: 'STEP',
- 0x0056: 'TYPE',
- 0x0057: 'ECHO',
- 0x0058: 'SET.NAME',
- 0x0059: 'CALLER',
- 0x005A: 'DEREF',
- 0x005B: 'WINDOWS',
- 0x005C: 'SERIES',
- 0x005D: 'DOCUMENTS',
- 0x005E: 'ACTIVE.CELL',
- 0x005F: 'SELECTION',
- 0x0060: 'RESULT',
- 0x0061: 'ATAN2',
- 0x0062: 'ASIN',
- 0x0063: 'ACOS',
- 0x0064: 'CHOOSE',
- 0x0065: 'HLOOKUP',
- 0x0066: 'VLOOKUP',
- 0x0067: 'LINKS',
- 0x0068: 'INPUT',
- 0x0069: 'ISREF',
- 0x006A: 'GET.FORMULA',
- 0x006B: 'GET.NAME',
- 0x006C: 'SET.VALUE',
- 0x006D: 'LOG',
- 0x006E: 'EXEC',
- 0x006F: 'CHAR',
- 0x0070: 'LOWER',
- 0x0071: 'UPPER',
- 0x0072: 'PROPER',
- 0x0073: 'LEFT',
- 0x0074: 'RIGHT',
- 0x0075: 'EXACT',
- 0x0076: 'TRIM',
- 0x0077: 'REPLACE',
- 0x0078: 'SUBSTITUTE',
- 0x0079: 'CODE',
- 0x007A: 'NAMES',
- 0x007B: 'DIRECTORY',
- 0x007C: 'FIND',
- 0x007D: 'CELL',
- 0x007E: 'ISERR',
- 0x007F: 'ISTEXT',
- 0x0080: 'ISNUMBER',
- 0x0081: 'ISBLANK',
- 0x0082: 'T',
- 0x0083: 'N',
- 0x0084: 'FOPEN',
- 0x0085: 'FCLOSE',
- 0x0086: 'FSIZE',
- 0x0087: 'FREADLN',
- 0x0088: 'FREAD',
- 0x0089: 'FWRITELN',
- 0x008A: 'FWRITE',
- 0x008B: 'FPOS',
- 0x008C: 'DATEVALUE',
- 0x008D: 'TIMEVALUE',
- 0x008E: 'SLN',
- 0x008F: 'SYD',
- 0x0090: 'DDB',
- 0x0091: 'GET.DEF',
- 0x0092: 'REFTEXT',
- 0x0093: 'TEXTREF',
- 0x0094: 'INDIRECT',
- 0x0095: 'REGISTER',
- 0x0096: 'CALL',
- 0x0097: 'ADD.BAR',
- 0x0098: 'ADD.MENU',
- 0x0099: 'ADD.COMMAND',
- 0x009A: 'ENABLE.COMMAND',
- 0x009B: 'CHECK.COMMAND',
- 0x009C: 'RENAME.COMMAND',
- 0x009D: 'SHOW.BAR',
- 0x009E: 'DELETE.MENU',
- 0x009F: 'DELETE.COMMAND',
- 0x00A0: 'GET.CHART.ITEM',
- 0x00A1: 'DIALOG.BOX',
- 0x00A2: 'CLEAN',
- 0x00A3: 'MDETERM',
- 0x00A4: 'MINVERSE',
- 0x00A5: 'MMULT',
- 0x00A6: 'FILES',
- 0x00A7: 'IPMT',
- 0x00A8: 'PPMT',
- 0x00A9: 'COUNTA',
- 0x00AA: 'CANCEL.KEY',
- 0x00AB: 'FOR',
- 0x00AC: 'WHILE',
- 0x00AD: 'BREAK',
- 0x00AE: 'NEXT',
- 0x00AF: 'INITIATE',
- 0x00B0: 'REQUEST',
- 0x00B1: 'POKE',
- 0x00B2: 'EXECUTE',
- 0x00B3: 'TERMINATE',
- 0x00B4: 'RESTART',
- 0x00B5: 'HELP',
- 0x00B6: 'GET.BAR',
- 0x00B7: 'PRODUCT',
- 0x00B8: 'FACT',
- 0x00B9: 'GET.CELL',
- 0x00BA: 'GET.WORKSPACE',
- 0x00BB: 'GET.WINDOW',
- 0x00BC: 'GET.DOCUMENT',
- 0x00BD: 'DPRODUCT',
- 0x00BE: 'ISNONTEXT',
- 0x00BF: 'GET.NOTE',
- 0x00C0: 'NOTE',
- 0x00C1: 'STDEVP',
- 0x00C2: 'VARP',
- 0x00C3: 'DSTDEVP',
- 0x00C4: 'DVARP',
- 0x00C5: 'TRUNC',
- 0x00C6: 'ISLOGICAL',
- 0x00C7: 'DCOUNTA',
- 0x00C8: 'DELETE.BAR',
- 0x00C9: 'UNREGISTER',
- 0x00CC: 'USDOLLAR',
- 0x00CD: 'FINDB',
- 0x00CE: 'SEARCHB',
- 0x00CF: 'REPLACEB',
- 0x00D0: 'LEFTB',
- 0x00D1: 'RIGHTB',
- 0x00D2: 'MIDB',
- 0x00D3: 'LENB',
- 0x00D4: 'ROUNDUP',
- 0x00D5: 'ROUNDDOWN',
- 0x00D6: 'ASC',
- 0x00D7: 'DBCS',
- 0x00D8: 'RANK',
- 0x00DB: 'ADDRESS',
- 0x00DC: 'DAYS360',
- 0x00DD: 'TODAY',
- 0x00DE: 'VDB',
- 0x00DF: 'ELSE',
- 0x00E0: 'ELSE.IF',
- 0x00E1: 'END.IF',
- 0x00E2: 'FOR.CELL',
- 0x00E3: 'MEDIAN',
- 0x00E4: 'SUMPRODUCT',
- 0x00E5: 'SINH',
- 0x00E6: 'COSH',
- 0x00E7: 'TANH',
- 0x00E8: 'ASINH',
- 0x00E9: 'ACOSH',
- 0x00EA: 'ATANH',
- 0x00EB: 'DGET',
- 0x00EC: 'CREATE.OBJECT',
- 0x00ED: 'VOLATILE',
- 0x00EE: 'LAST.ERROR',
- 0x00EF: 'CUSTOM.UNDO',
- 0x00F0: 'CUSTOM.REPEAT',
- 0x00F1: 'FORMULA.CONVERT',
- 0x00F2: 'GET.LINK.INFO',
- 0x00F3: 'TEXT.BOX',
- 0x00F4: 'INFO',
- 0x00F5: 'GROUP',
- 0x00F6: 'GET.OBJECT',
- 0x00F7: 'DB',
- 0x00F8: 'PAUSE',
- 0x00FB: 'RESUME',
- 0x00FC: 'FREQUENCY',
- 0x00FD: 'ADD.TOOLBAR',
- 0x00FE: 'DELETE.TOOLBAR',
- 0x00FF: 'User',
- 0x0100: 'RESET.TOOLBAR',
- 0x0101: 'EVALUATE',
- 0x0102: 'GET.TOOLBAR',
- 0x0103: 'GET.TOOL',
- 0x0104: 'SPELLING.CHECK',
- 0x0105: 'ERROR.TYPE',
- 0x0106: 'APP.TITLE',
- 0x0107: 'WINDOW.TITLE',
- 0x0108: 'SAVE.TOOLBAR',
- 0x0109: 'ENABLE.TOOL',
- 0x010A: 'PRESS.TOOL',
- 0x010B: 'REGISTER.ID',
- 0x010C: 'GET.WORKBOOK',
- 0x010D: 'AVEDEV',
- 0x010E: 'BETADIST',
- 0x010F: 'GAMMALN',
- 0x0110: 'BETAINV',
- 0x0111: 'BINOMDIST',
- 0x0112: 'CHIDIST',
- 0x0113: 'CHIINV',
- 0x0114: 'COMBIN',
- 0x0115: 'CONFIDENCE',
- 0x0116: 'CRITBINOM',
- 0x0117: 'EVEN',
- 0x0118: 'EXPONDIST',
- 0x0119: 'FDIST',
- 0x011A: 'FINV',
- 0x011B: 'FISHER',
- 0x011C: 'FISHERINV',
- 0x011D: 'FLOOR',
- 0x011E: 'GAMMADIST',
- 0x011F: 'GAMMAINV',
- 0x0120: 'CEILING',
- 0x0121: 'HYPGEOMDIST',
- 0x0122: 'LOGNORMDIST',
- 0x0123: 'LOGINV',
- 0x0124: 'NEGBINOMDIST',
- 0x0125: 'NORMDIST',
- 0x0126: 'NORMSDIST',
- 0x0127: 'NORMINV',
- 0x0128: 'NORMSINV',
- 0x0129: 'STANDARDIZE',
- 0x012A: 'ODD',
- 0x012B: 'PERMUT',
- 0x012C: 'POISSON',
- 0x012D: 'TDIST',
- 0x012E: 'WEIBULL',
- 0x012F: 'SUMXMY2',
- 0x0130: 'SUMX2MY2',
- 0x0131: 'SUMX2PY2',
- 0x0132: 'CHITEST',
- 0x0133: 'CORREL',
- 0x0134: 'COVAR',
- 0x0135: 'FORECAST',
- 0x0136: 'FTEST',
- 0x0137: 'INTERCEPT',
- 0x0138: 'PEARSON',
- 0x0139: 'RSQ',
- 0x013A: 'STEYX',
- 0x013B: 'SLOPE',
- 0x013C: 'TTEST',
- 0x013D: 'PROB',
- 0x013E: 'DEVSQ',
- 0x013F: 'GEOMEAN',
- 0x0140: 'HARMEAN',
- 0x0141: 'SUMSQ',
- 0x0142: 'KURT',
- 0x0143: 'SKEW',
- 0x0144: 'ZTEST',
- 0x0145: 'LARGE',
- 0x0146: 'SMALL',
- 0x0147: 'QUARTILE',
- 0x0148: 'PERCENTILE',
- 0x0149: 'PERCENTRANK',
- 0x014A: 'MODE',
- 0x014B: 'TRIMMEAN',
- 0x014C: 'TINV',
- 0x014E: 'MOVIE.COMMAND',
- 0x014F: 'GET.MOVIE',
- 0x0150: 'CONCATENATE',
- 0x0151: 'POWER',
- 0x0152: 'PIVOT.ADD.DATA',
- 0x0153: 'GET.PIVOT.TABLE',
- 0x0154: 'GET.PIVOT.FIELD',
- 0x0155: 'GET.PIVOT.ITEM',
- 0x0156: 'RADIANS',
- 0x0157: 'DEGREES',
- 0x0158: 'SUBTOTAL',
- 0x0159: 'SUMIF',
- 0x015A: 'COUNTIF',
- 0x015B: 'COUNTBLANK',
- 0x015C: 'SCENARIO.GET',
- 0x015D: 'OPTIONS.LISTS.GET',
- 0x015E: 'ISPMT',
- 0x015F: 'DATEDIF',
- 0x0160: 'DATESTRING',
- 0x0161: 'NUMBERSTRING',
- 0x0162: 'ROMAN',
- 0x0163: 'OPEN.DIALOG',
- 0x0164: 'SAVE.DIALOG',
- 0x0165: 'VIEW.GET',
- 0x0166: 'GETPIVOTDATA',
- 0x0167: 'HYPERLINK',
- 0x0168: 'PHONETIC',
- 0x0169: 'AVERAGEA',
- 0x016A: 'MAXA',
- 0x016B: 'MINA',
- 0x016C: 'STDEVPA',
- 0x016D: 'VARPA',
- 0x016E: 'STDEVA',
- 0x016F: 'VARA',
- 0x0170: 'BAHTTEXT',
- 0x0171: 'THAIDAYOFWEEK',
- 0x0172: 'THAIDIGIT',
- 0x0173: 'THAIMONTHOFYEAR',
- 0x0174: 'THAINUMSOUND',
- 0x0175: 'THAINUMSTRING',
- 0x0176: 'THAISTRINGLENGTH',
- 0x0177: 'ISTHAIDIGIT',
- 0x0178: 'ROUNDBAHTDOWN',
- 0x0179: 'ROUNDBAHTUP',
- 0x017A: 'THAIYEAR',
- 0x017B: 'RTD',
-
- 0x017C: 'CUBEVALUE',
- 0x017D: 'CUBEMEMBER',
- 0x017E: 'CUBEMEMBERPROPERTY',
- 0x017F: 'CUBERANKEDMEMBER',
- 0x0180: 'HEX2BIN',
- 0x0181: 'HEX2DEC',
- 0x0182: 'HEX2OCT',
- 0x0183: 'DEC2BIN',
- 0x0184: 'DEC2HEX',
- 0x0185: 'DEC2OCT',
- 0x0186: 'OCT2BIN',
- 0x0187: 'OCT2HEX',
- 0x0188: 'OCT2DEC',
- 0x0189: 'BIN2DEC',
- 0x018A: 'BIN2OCT',
- 0x018B: 'BIN2HEX',
- 0x018C: 'IMSUB',
- 0x018D: 'IMDIV',
- 0x018E: 'IMPOWER',
- 0x018F: 'IMABS',
- 0x0190: 'IMSQRT',
- 0x0191: 'IMLN',
- 0x0192: 'IMLOG2',
- 0x0193: 'IMLOG10',
- 0x0194: 'IMSIN',
- 0x0195: 'IMCOS',
- 0x0196: 'IMEXP',
- 0x0197: 'IMARGUMENT',
- 0x0198: 'IMCONJUGATE',
- 0x0199: 'IMAGINARY',
- 0x019A: 'IMREAL',
- 0x019B: 'COMPLEX',
- 0x019C: 'IMSUM',
- 0x019D: 'IMPRODUCT',
- 0x019E: 'SERIESSUM',
- 0x019F: 'FACTDOUBLE',
- 0x01A0: 'SQRTPI',
- 0x01A1: 'QUOTIENT',
- 0x01A2: 'DELTA',
- 0x01A3: 'GESTEP',
- 0x01A4: 'ISEVEN',
- 0x01A5: 'ISODD',
- 0x01A6: 'MROUND',
- 0x01A7: 'ERF',
- 0x01A8: 'ERFC',
- 0x01A9: 'BESSELJ',
- 0x01AA: 'BESSELK',
- 0x01AB: 'BESSELY',
- 0x01AC: 'BESSELI',
- 0x01AD: 'XIRR',
- 0x01AE: 'XNPV',
- 0x01AF: 'PRICEMAT',
- 0x01B0: 'YIELDMAT',
- 0x01B1: 'INTRATE',
- 0x01B2: 'RECEIVED',
- 0x01B3: 'DISC',
- 0x01B4: 'PRICEDISC',
- 0x01B5: 'YIELDDISC',
- 0x01B6: 'TBILLEQ',
- 0x01B7: 'TBILLPRICE',
- 0x01B8: 'TBILLYIELD',
- 0x01B9: 'PRICE',
- 0x01BA: 'YIELD',
- 0x01BB: 'DOLLARDE',
- 0x01BC: 'DOLLARFR',
- 0x01BD: 'NOMINAL',
- 0x01BE: 'EFFECT',
- 0x01BF: 'CUMPRINC',
- 0x01C0: 'CUMIPMT',
- 0x01C1: 'EDATE',
- 0x01C2: 'EOMONTH',
- 0x01C3: 'YEARFRAC',
- 0x01C4: 'COUPDAYBS',
- 0x01C5: 'COUPDAYS',
- 0x01C6: 'COUPDAYSNC',
- 0x01C7: 'COUPNCD',
- 0x01C8: 'COUPNUM',
- 0x01C9: 'COUPPCD',
- 0x01CA: 'DURATION',
- 0x01CB: 'MDURATION',
- 0x01CC: 'ODDLPRICE',
- 0x01CD: 'ODDLYIELD',
- 0x01CE: 'ODDFPRICE',
- 0x01CF: 'ODDFYIELD',
- 0x01D0: 'RANDBETWEEN',
- 0x01D1: 'WEEKNUM',
- 0x01D2: 'AMORDEGRC',
- 0x01D3: 'AMORLINC',
- 0x01D4: 'CONVERT',
- 0x02D4: 'SHEETJS',
- 0x01D5: 'ACCRINT',
- 0x01D6: 'ACCRINTM',
- 0x01D7: 'WORKDAY',
- 0x01D8: 'NETWORKDAYS',
- 0x01D9: 'GCD',
- 0x01DA: 'MULTINOMIAL',
- 0x01DB: 'LCM',
- 0x01DC: 'FVSCHEDULE',
- 0x01DD: 'CUBEKPIMEMBER',
- 0x01DE: 'CUBESET',
- 0x01DF: 'CUBESETCOUNT',
- 0x01E0: 'IFERROR',
- 0x01E1: 'COUNTIFS',
- 0x01E2: 'SUMIFS',
- 0x01E3: 'AVERAGEIF',
- 0x01E4: 'AVERAGEIFS'
- };
- var FtabArgc = {
- 0x0002: 1, /* ISNA */
- 0x0003: 1, /* ISERROR */
- 0x000A: 0, /* NA */
- 0x000F: 1, /* SIN */
- 0x0010: 1, /* COS */
- 0x0011: 1, /* TAN */
- 0x0012: 1, /* ATAN */
- 0x0013: 0, /* PI */
- 0x0014: 1, /* SQRT */
- 0x0015: 1, /* EXP */
- 0x0016: 1, /* LN */
- 0x0017: 1, /* LOG10 */
- 0x0018: 1, /* ABS */
- 0x0019: 1, /* INT */
- 0x001A: 1, /* SIGN */
- 0x001B: 2, /* ROUND */
- 0x001E: 2, /* REPT */
- 0x001F: 3, /* MID */
- 0x0020: 1, /* LEN */
- 0x0021: 1, /* VALUE */
- 0x0022: 0, /* TRUE */
- 0x0023: 0, /* FALSE */
- 0x0026: 1, /* NOT */
- 0x0027: 2, /* MOD */
- 0x0028: 3, /* DCOUNT */
- 0x0029: 3, /* DSUM */
- 0x002A: 3, /* DAVERAGE */
- 0x002B: 3, /* DMIN */
- 0x002C: 3, /* DMAX */
- 0x002D: 3, /* DSTDEV */
- 0x002F: 3, /* DVAR */
- 0x0030: 2, /* TEXT */
- 0x0035: 1, /* GOTO */
- 0x003D: 3, /* MIRR */
- 0x003F: 0, /* RAND */
- 0x0041: 3, /* DATE */
- 0x0042: 3, /* TIME */
- 0x0043: 1, /* DAY */
- 0x0044: 1, /* MONTH */
- 0x0045: 1, /* YEAR */
- 0x0046: 1, /* WEEKDAY */
- 0x0047: 1, /* HOUR */
- 0x0048: 1, /* MINUTE */
- 0x0049: 1, /* SECOND */
- 0x004A: 0, /* NOW */
- 0x004B: 1, /* AREAS */
- 0x004C: 1, /* ROWS */
- 0x004D: 1, /* COLUMNS */
- 0x004F: 2, /* ABSREF */
- 0x0050: 2, /* RELREF */
- 0x0053: 1, /* TRANSPOSE */
- 0x0055: 0, /* STEP */
- 0x0056: 1, /* TYPE */
- 0x0059: 0, /* CALLER */
- 0x005A: 1, /* DEREF */
- 0x005E: 0, /* ACTIVE.CELL */
- 0x005F: 0, /* SELECTION */
- 0x0061: 2, /* ATAN2 */
- 0x0062: 1, /* ASIN */
- 0x0063: 1, /* ACOS */
- 0x0065: 3, /* HLOOKUP */
- 0x0066: 3, /* VLOOKUP */
- 0x0069: 1, /* ISREF */
- 0x006A: 1, /* GET.FORMULA */
- 0x006C: 2, /* SET.VALUE */
- 0x006F: 1, /* CHAR */
- 0x0070: 1, /* LOWER */
- 0x0071: 1, /* UPPER */
- 0x0072: 1, /* PROPER */
- 0x0075: 2, /* EXACT */
- 0x0076: 1, /* TRIM */
- 0x0077: 4, /* REPLACE */
- 0x0079: 1, /* CODE */
- 0x007E: 1, /* ISERR */
- 0x007F: 1, /* ISTEXT */
- 0x0080: 1, /* ISNUMBER */
- 0x0081: 1, /* ISBLANK */
- 0x0082: 1, /* T */
- 0x0083: 1, /* N */
- 0x0085: 1, /* FCLOSE */
- 0x0086: 1, /* FSIZE */
- 0x0087: 1, /* FREADLN */
- 0x0088: 2, /* FREAD */
- 0x0089: 2, /* FWRITELN */
- 0x008A: 2, /* FWRITE */
- 0x008C: 1, /* DATEVALUE */
- 0x008D: 1, /* TIMEVALUE */
- 0x008E: 3, /* SLN */
- 0x008F: 4, /* SYD */
- 0x0090: 4, /* DDB */
- 0x00A1: 1, /* DIALOG.BOX */
- 0x00A2: 1, /* CLEAN */
- 0x00A3: 1, /* MDETERM */
- 0x00A4: 1, /* MINVERSE */
- 0x00A5: 2, /* MMULT */
- 0x00AC: 1, /* WHILE */
- 0x00AF: 2, /* INITIATE */
- 0x00B0: 2, /* REQUEST */
- 0x00B1: 3, /* POKE */
- 0x00B2: 2, /* EXECUTE */
- 0x00B3: 1, /* TERMINATE */
- 0x00B8: 1, /* FACT */
- 0x00BA: 1, /* GET.WORKSPACE */
- 0x00BD: 3, /* DPRODUCT */
- 0x00BE: 1, /* ISNONTEXT */
- 0x00C3: 3, /* DSTDEVP */
- 0x00C4: 3, /* DVARP */
- 0x00C5: 1, /* TRUNC */
- 0x00C6: 1, /* ISLOGICAL */
- 0x00C7: 3, /* DCOUNTA */
- 0x00C9: 1, /* UNREGISTER */
- 0x00CF: 4, /* REPLACEB */
- 0x00D2: 3, /* MIDB */
- 0x00D3: 1, /* LENB */
- 0x00D4: 2, /* ROUNDUP */
- 0x00D5: 2, /* ROUNDDOWN */
- 0x00D6: 1, /* ASC */
- 0x00D7: 1, /* DBCS */
- 0x00E1: 0, /* END.IF */
- 0x00E5: 1, /* SINH */
- 0x00E6: 1, /* COSH */
- 0x00E7: 1, /* TANH */
- 0x00E8: 1, /* ASINH */
- 0x00E9: 1, /* ACOSH */
- 0x00EA: 1, /* ATANH */
- 0x00EB: 3, /* DGET */
- 0x00F4: 1, /* INFO */
- 0x00F7: 4, /* DB */
- 0x00FC: 2, /* FREQUENCY */
- 0x0101: 1, /* EVALUATE */
- 0x0105: 1, /* ERROR.TYPE */
- 0x010F: 1, /* GAMMALN */
- 0x0111: 4, /* BINOMDIST */
- 0x0112: 2, /* CHIDIST */
- 0x0113: 2, /* CHIINV */
- 0x0114: 2, /* COMBIN */
- 0x0115: 3, /* CONFIDENCE */
- 0x0116: 3, /* CRITBINOM */
- 0x0117: 1, /* EVEN */
- 0x0118: 3, /* EXPONDIST */
- 0x0119: 3, /* FDIST */
- 0x011A: 3, /* FINV */
- 0x011B: 1, /* FISHER */
- 0x011C: 1, /* FISHERINV */
- 0x011D: 2, /* FLOOR */
- 0x011E: 4, /* GAMMADIST */
- 0x011F: 3, /* GAMMAINV */
- 0x0120: 2, /* CEILING */
- 0x0121: 4, /* HYPGEOMDIST */
- 0x0122: 3, /* LOGNORMDIST */
- 0x0123: 3, /* LOGINV */
- 0x0124: 3, /* NEGBINOMDIST */
- 0x0125: 4, /* NORMDIST */
- 0x0126: 1, /* NORMSDIST */
- 0x0127: 3, /* NORMINV */
- 0x0128: 1, /* NORMSINV */
- 0x0129: 3, /* STANDARDIZE */
- 0x012A: 1, /* ODD */
- 0x012B: 2, /* PERMUT */
- 0x012C: 3, /* POISSON */
- 0x012D: 3, /* TDIST */
- 0x012E: 4, /* WEIBULL */
- 0x012F: 2, /* SUMXMY2 */
- 0x0130: 2, /* SUMX2MY2 */
- 0x0131: 2, /* SUMX2PY2 */
- 0x0132: 2, /* CHITEST */
- 0x0133: 2, /* CORREL */
- 0x0134: 2, /* COVAR */
- 0x0135: 3, /* FORECAST */
- 0x0136: 2, /* FTEST */
- 0x0137: 2, /* INTERCEPT */
- 0x0138: 2, /* PEARSON */
- 0x0139: 2, /* RSQ */
- 0x013A: 2, /* STEYX */
- 0x013B: 2, /* SLOPE */
- 0x013C: 4, /* TTEST */
- 0x0145: 2, /* LARGE */
- 0x0146: 2, /* SMALL */
- 0x0147: 2, /* QUARTILE */
- 0x0148: 2, /* PERCENTILE */
- 0x014B: 2, /* TRIMMEAN */
- 0x014C: 2, /* TINV */
- 0x0151: 2, /* POWER */
- 0x0156: 1, /* RADIANS */
- 0x0157: 1, /* DEGREES */
- 0x015A: 2, /* COUNTIF */
- 0x015B: 1, /* COUNTBLANK */
- 0x015E: 4, /* ISPMT */
- 0x015F: 3, /* DATEDIF */
- 0x0160: 1, /* DATESTRING */
- 0x0161: 2, /* NUMBERSTRING */
- 0x0168: 1, /* PHONETIC */
- 0x0170: 1, /* BAHTTEXT */
- 0x0171: 1, /* THAIDAYOFWEEK */
- 0x0172: 1, /* THAIDIGIT */
- 0x0173: 1, /* THAIMONTHOFYEAR */
- 0x0174: 1, /* THAINUMSOUND */
- 0x0175: 1, /* THAINUMSTRING */
- 0x0176: 1, /* THAISTRINGLENGTH */
- 0x0177: 1, /* ISTHAIDIGIT */
- 0x0178: 1, /* ROUNDBAHTDOWN */
- 0x0179: 1, /* ROUNDBAHTUP */
- 0x017A: 1, /* THAIYEAR */
- 0x017E: 3, /* CUBEMEMBERPROPERTY */
- 0x0181: 1, /* HEX2DEC */
- 0x0188: 1, /* OCT2DEC */
- 0x0189: 1, /* BIN2DEC */
- 0x018C: 2, /* IMSUB */
- 0x018D: 2, /* IMDIV */
- 0x018E: 2, /* IMPOWER */
- 0x018F: 1, /* IMABS */
- 0x0190: 1, /* IMSQRT */
- 0x0191: 1, /* IMLN */
- 0x0192: 1, /* IMLOG2 */
- 0x0193: 1, /* IMLOG10 */
- 0x0194: 1, /* IMSIN */
- 0x0195: 1, /* IMCOS */
- 0x0196: 1, /* IMEXP */
- 0x0197: 1, /* IMARGUMENT */
- 0x0198: 1, /* IMCONJUGATE */
- 0x0199: 1, /* IMAGINARY */
- 0x019A: 1, /* IMREAL */
- 0x019E: 4, /* SERIESSUM */
- 0x019F: 1, /* FACTDOUBLE */
- 0x01A0: 1, /* SQRTPI */
- 0x01A1: 2, /* QUOTIENT */
- 0x01A4: 1, /* ISEVEN */
- 0x01A5: 1, /* ISODD */
- 0x01A6: 2, /* MROUND */
- 0x01A8: 1, /* ERFC */
- 0x01A9: 2, /* BESSELJ */
- 0x01AA: 2, /* BESSELK */
- 0x01AB: 2, /* BESSELY */
- 0x01AC: 2, /* BESSELI */
- 0x01AE: 3, /* XNPV */
- 0x01B6: 3, /* TBILLEQ */
- 0x01B7: 3, /* TBILLPRICE */
- 0x01B8: 3, /* TBILLYIELD */
- 0x01BB: 2, /* DOLLARDE */
- 0x01BC: 2, /* DOLLARFR */
- 0x01BD: 2, /* NOMINAL */
- 0x01BE: 2, /* EFFECT */
- 0x01BF: 6, /* CUMPRINC */
- 0x01C0: 6, /* CUMIPMT */
- 0x01C1: 2, /* EDATE */
- 0x01C2: 2, /* EOMONTH */
- 0x01D0: 2, /* RANDBETWEEN */
- 0x01D4: 3, /* CONVERT */
- 0x01DC: 2, /* FVSCHEDULE */
- 0x01DF: 1, /* CUBESETCOUNT */
- 0x01E0: 2, /* IFERROR */
- 0xFFFF: 0
- };
- /* [MS-XLSX] 2.2.3 Functions */
- /* [MS-XLSB] 2.5.97.10 Ftab */
- var XLSXFutureFunctions = {
- "_xlfn.ACOT": "ACOT",
- "_xlfn.ACOTH": "ACOTH",
- "_xlfn.AGGREGATE": "AGGREGATE",
- "_xlfn.ARABIC": "ARABIC",
- "_xlfn.AVERAGEIF": "AVERAGEIF",
- "_xlfn.AVERAGEIFS": "AVERAGEIFS",
- "_xlfn.BASE": "BASE",
- "_xlfn.BETA.DIST": "BETA.DIST",
- "_xlfn.BETA.INV": "BETA.INV",
- "_xlfn.BINOM.DIST": "BINOM.DIST",
- "_xlfn.BINOM.DIST.RANGE": "BINOM.DIST.RANGE",
- "_xlfn.BINOM.INV": "BINOM.INV",
- "_xlfn.BITAND": "BITAND",
- "_xlfn.BITLSHIFT": "BITLSHIFT",
- "_xlfn.BITOR": "BITOR",
- "_xlfn.BITRSHIFT": "BITRSHIFT",
- "_xlfn.BITXOR": "BITXOR",
- "_xlfn.CEILING.MATH": "CEILING.MATH",
- "_xlfn.CEILING.PRECISE": "CEILING.PRECISE",
- "_xlfn.CHISQ.DIST": "CHISQ.DIST",
- "_xlfn.CHISQ.DIST.RT": "CHISQ.DIST.RT",
- "_xlfn.CHISQ.INV": "CHISQ.INV",
- "_xlfn.CHISQ.INV.RT": "CHISQ.INV.RT",
- "_xlfn.CHISQ.TEST": "CHISQ.TEST",
- "_xlfn.COMBINA": "COMBINA",
- "_xlfn.CONCAT": "CONCAT",
- "_xlfn.CONFIDENCE.NORM": "CONFIDENCE.NORM",
- "_xlfn.CONFIDENCE.T": "CONFIDENCE.T",
- "_xlfn.COT": "COT",
- "_xlfn.COTH": "COTH",
- "_xlfn.COUNTIFS": "COUNTIFS",
- "_xlfn.COVARIANCE.P": "COVARIANCE.P",
- "_xlfn.COVARIANCE.S": "COVARIANCE.S",
- "_xlfn.CSC": "CSC",
- "_xlfn.CSCH": "CSCH",
- "_xlfn.DAYS": "DAYS",
- "_xlfn.DECIMAL": "DECIMAL",
- "_xlfn.ECMA.CEILING": "ECMA.CEILING",
- "_xlfn.ERF.PRECISE": "ERF.PRECISE",
- "_xlfn.ERFC.PRECISE": "ERFC.PRECISE",
- "_xlfn.EXPON.DIST": "EXPON.DIST",
- "_xlfn.F.DIST": "F.DIST",
- "_xlfn.F.DIST.RT": "F.DIST.RT",
- "_xlfn.F.INV": "F.INV",
- "_xlfn.F.INV.RT": "F.INV.RT",
- "_xlfn.F.TEST": "F.TEST",
- "_xlfn.FILTERXML": "FILTERXML",
- "_xlfn.FLOOR.MATH": "FLOOR.MATH",
- "_xlfn.FLOOR.PRECISE": "FLOOR.PRECISE",
- "_xlfn.FORECAST.ETS": "FORECAST.ETS",
- "_xlfn.FORECAST.ETS.CONFINT": "FORECAST.ETS.CONFINT",
- "_xlfn.FORECAST.ETS.SEASONALITY": "FORECAST.ETS.SEASONALITY",
- "_xlfn.FORECAST.ETS.STAT": "FORECAST.ETS.STAT",
- "_xlfn.FORECAST.LINEAR": "FORECAST.LINEAR",
- "_xlfn.FORMULATEXT": "FORMULATEXT",
- "_xlfn.GAMMA": "GAMMA",
- "_xlfn.GAMMA.DIST": "GAMMA.DIST",
- "_xlfn.GAMMA.INV": "GAMMA.INV",
- "_xlfn.GAMMALN.PRECISE": "GAMMALN.PRECISE",
- "_xlfn.GAUSS": "GAUSS",
- "_xlfn.HYPGEOM.DIST": "HYPGEOM.DIST",
- "_xlfn.IFERROR": "IFERROR",
- "_xlfn.IFNA": "IFNA",
- "_xlfn.IFS": "IFS",
- "_xlfn.IMCOSH": "IMCOSH",
- "_xlfn.IMCOT": "IMCOT",
- "_xlfn.IMCSC": "IMCSC",
- "_xlfn.IMCSCH": "IMCSCH",
- "_xlfn.IMSEC": "IMSEC",
- "_xlfn.IMSECH": "IMSECH",
- "_xlfn.IMSINH": "IMSINH",
- "_xlfn.IMTAN": "IMTAN",
- "_xlfn.ISFORMULA": "ISFORMULA",
- "_xlfn.ISO.CEILING": "ISO.CEILING",
- "_xlfn.ISOWEEKNUM": "ISOWEEKNUM",
- "_xlfn.LOGNORM.DIST": "LOGNORM.DIST",
- "_xlfn.LOGNORM.INV": "LOGNORM.INV",
- "_xlfn.MAXIFS": "MAXIFS",
- "_xlfn.MINIFS": "MINIFS",
- "_xlfn.MODE.MULT": "MODE.MULT",
- "_xlfn.MODE.SNGL": "MODE.SNGL",
- "_xlfn.MUNIT": "MUNIT",
- "_xlfn.NEGBINOM.DIST": "NEGBINOM.DIST",
- "_xlfn.NETWORKDAYS.INTL": "NETWORKDAYS.INTL",
- "_xlfn.NIGBINOM": "NIGBINOM",
- "_xlfn.NORM.DIST": "NORM.DIST",
- "_xlfn.NORM.INV": "NORM.INV",
- "_xlfn.NORM.S.DIST": "NORM.S.DIST",
- "_xlfn.NORM.S.INV": "NORM.S.INV",
- "_xlfn.NUMBERVALUE": "NUMBERVALUE",
- "_xlfn.PDURATION": "PDURATION",
- "_xlfn.PERCENTILE.EXC": "PERCENTILE.EXC",
- "_xlfn.PERCENTILE.INC": "PERCENTILE.INC",
- "_xlfn.PERCENTRANK.EXC": "PERCENTRANK.EXC",
- "_xlfn.PERCENTRANK.INC": "PERCENTRANK.INC",
- "_xlfn.PERMUTATIONA": "PERMUTATIONA",
- "_xlfn.PHI": "PHI",
- "_xlfn.POISSON.DIST": "POISSON.DIST",
- "_xlfn.QUARTILE.EXC": "QUARTILE.EXC",
- "_xlfn.QUARTILE.INC": "QUARTILE.INC",
- "_xlfn.QUERYSTRING": "QUERYSTRING",
- "_xlfn.RANK.AVG": "RANK.AVG",
- "_xlfn.RANK.EQ": "RANK.EQ",
- "_xlfn.RRI": "RRI",
- "_xlfn.SEC": "SEC",
- "_xlfn.SECH": "SECH",
- "_xlfn.SHEET": "SHEET",
- "_xlfn.SHEETS": "SHEETS",
- "_xlfn.SKEW.P": "SKEW.P",
- "_xlfn.STDEV.P": "STDEV.P",
- "_xlfn.STDEV.S": "STDEV.S",
- "_xlfn.SUMIFS": "SUMIFS",
- "_xlfn.SWITCH": "SWITCH",
- "_xlfn.T.DIST": "T.DIST",
- "_xlfn.T.DIST.2T": "T.DIST.2T",
- "_xlfn.T.DIST.RT": "T.DIST.RT",
- "_xlfn.T.INV": "T.INV",
- "_xlfn.T.INV.2T": "T.INV.2T",
- "_xlfn.T.TEST": "T.TEST",
- "_xlfn.TEXTJOIN": "TEXTJOIN",
- "_xlfn.UNICHAR": "UNICHAR",
- "_xlfn.UNICODE": "UNICODE",
- "_xlfn.VAR.P": "VAR.P",
- "_xlfn.VAR.S": "VAR.S",
- "_xlfn.WEBSERVICE": "WEBSERVICE",
- "_xlfn.WEIBULL.DIST": "WEIBULL.DIST",
- "_xlfn.WORKDAY.INTL": "WORKDAY.INTL",
- "_xlfn.XOR": "XOR",
- "_xlfn.Z.TEST": "Z.TEST"
- };
-
- /* Part 3 TODO: actually parse formulae */
- function ods_to_csf_formula(f) {
- if(f.slice(0,3) == "of:") f = f.slice(3);
- /* 5.2 Basic Expressions */
- if(f.charCodeAt(0) == 61) {
- f = f.slice(1);
- if(f.charCodeAt(0) == 61) f = f.slice(1);
- }
- f = f.replace(/COM\.MICROSOFT\./g, "");
- /* Part 3 Section 5.8 References */
- f = f.replace(/\[((?:\.[A-Z]+[0-9]+)(?::\.[A-Z]+[0-9]+)?)\]/g, function($$, $1) { return $1.replace(/\./g,""); });
- /* TODO: something other than this */
- f = f.replace(/\[.(#[A-Z]*[?!])\]/g, "$1");
- return f.replace(/[;~]/g,",").replace(/\|/g,";");
- }
-
- function csf_to_ods_formula(f) {
- var o = "of:=" + f.replace(crefregex, "$1[.$2$3$4$5]").replace(/\]:\[/g,":");
- /* TODO: something other than this */
- return o.replace(/;/g, "|").replace(/,/g,";");
- }
-
- function ods_to_csf_3D(r) {
- var a = r.split(":");
- var s = a[0].split(".")[0];
- return [s, a[0].split(".")[1] + (a.length > 1 ? (":" + (a[1].split(".")[1] || a[1].split(".")[0])) : "")];
- }
-
- function csf_to_ods_3D(r) {
- return r.replace(/\./,"!");
- }
-
- var strs = {}; // shared strings
- var _ssfopts = {}; // spreadsheet formatting options
-
- RELS.WS = [
- "http://schemas.openxmlformats.org/officeDocument/2006/relationships/worksheet",
- "http://purl.oclc.org/ooxml/officeDocument/relationships/worksheet"
- ];
-
- /*global Map */
- var browser_has_Map = typeof Map !== 'undefined';
-
- function get_sst_id(sst, str, rev) {
- var i = 0, len = sst.length;
- if(rev) {
- if(browser_has_Map ? rev.has(str) : Object.prototype.hasOwnProperty.call(rev, str)) {
- var revarr = browser_has_Map ? rev.get(str) : rev[str];
- for(; i < revarr.length; ++i) {
- if(sst[revarr[i]].t === str) { sst.Count ++; return revarr[i]; }
- }
- }
- } else for(; i < len; ++i) {
- if(sst[i].t === str) { sst.Count ++; return i; }
- }
- sst[len] = ({t:str}); sst.Count ++; sst.Unique ++;
- if(rev) {
- if(browser_has_Map) {
- if(!rev.has(str)) rev.set(str, []);
- rev.get(str).push(len);
- } else {
- if(!Object.prototype.hasOwnProperty.call(rev, str)) rev[str] = [];
- rev[str].push(len);
- }
- }
- return len;
- }
-
- function col_obj_w(C, col) {
- var p = ({min:C+1,max:C+1});
- /* wch (chars), wpx (pixels) */
- var wch = -1;
- if(col.MDW) MDW = col.MDW;
- if(col.width != null) p.customWidth = 1;
- else if(col.wpx != null) wch = px2char(col.wpx);
- else if(col.wch != null) wch = col.wch;
- if(wch > -1) { p.width = char2width(wch); p.customWidth = 1; }
- else if(col.width != null) p.width = col.width;
- if(col.hidden) p.hidden = true;
- return p;
- }
-
- function default_margins(margins, mode) {
- if(!margins) return;
- var defs = [0.7, 0.7, 0.75, 0.75, 0.3, 0.3];
- if(mode == 'xlml') defs = [1, 1, 1, 1, 0.5, 0.5];
- if(margins.left == null) margins.left = defs[0];
- if(margins.right == null) margins.right = defs[1];
- if(margins.top == null) margins.top = defs[2];
- if(margins.bottom == null) margins.bottom = defs[3];
- if(margins.header == null) margins.header = defs[4];
- if(margins.footer == null) margins.footer = defs[5];
- }
-
- function get_cell_style(styles, cell, opts) {
- var z = opts.revssf[cell.z != null ? cell.z : "General"];
- var i = 0x3c, len = styles.length;
- if(z == null && opts.ssf) {
- for(; i < 0x188; ++i) if(opts.ssf[i] == null) {
- SSF.load(cell.z, i);
- // $FlowIgnore
- opts.ssf[i] = cell.z;
- opts.revssf[cell.z] = z = i;
- break;
- }
- }
- for(i = 0; i != len; ++i) if(styles[i].numFmtId === z) return i;
- styles[len] = {
- numFmtId:z,
- fontId:0,
- fillId:0,
- borderId:0,
- xfId:0,
- applyNumberFormat:1
- };
- return len;
- }
-
- function safe_format(p, fmtid, fillid, opts, themes, styles) {
- try {
- if(opts.cellNF) p.z = SSF._table[fmtid];
- } catch(e) { if(opts.WTF) throw e; }
- if(p.t === 'z') return;
- if(p.t === 'd' && typeof p.v === 'string') p.v = parseDate(p.v);
- if(!opts || opts.cellText !== false) try {
- if(SSF._table[fmtid] == null) SSF.load(SSFImplicit[fmtid] || "General", fmtid);
- if(p.t === 'e') p.w = p.w || BErr[p.v];
- else if(fmtid === 0) {
- if(p.t === 'n') {
- if((p.v|0) === p.v) p.w = SSF._general_int(p.v);
- else p.w = SSF._general_num(p.v);
- }
- else if(p.t === 'd') {
- var dd = datenum(p.v);
- if((dd|0) === dd) p.w = SSF._general_int(dd);
- else p.w = SSF._general_num(dd);
- }
- else if(p.v === undefined) return "";
- else p.w = SSF._general(p.v,_ssfopts);
- }
- else if(p.t === 'd') p.w = SSF.format(fmtid,datenum(p.v),_ssfopts);
- else p.w = SSF.format(fmtid,p.v,_ssfopts);
- } catch(e) { if(opts.WTF) throw e; }
- if(!opts.cellStyles) return;
- if(fillid != null) try {
- p.s = styles.Fills[fillid];
- if (p.s.fgColor && p.s.fgColor.theme && !p.s.fgColor.rgb) {
- p.s.fgColor.rgb = rgb_tint(themes.themeElements.clrScheme[p.s.fgColor.theme].rgb, p.s.fgColor.tint || 0);
- if(opts.WTF) p.s.fgColor.raw_rgb = themes.themeElements.clrScheme[p.s.fgColor.theme].rgb;
- }
- if (p.s.bgColor && p.s.bgColor.theme) {
- p.s.bgColor.rgb = rgb_tint(themes.themeElements.clrScheme[p.s.bgColor.theme].rgb, p.s.bgColor.tint || 0);
- if(opts.WTF) p.s.bgColor.raw_rgb = themes.themeElements.clrScheme[p.s.bgColor.theme].rgb;
- }
- } catch(e) { if(opts.WTF && styles.Fills) throw e; }
- }
-
- function check_ws(ws, sname, i) {
- if(ws && ws['!ref']) {
- var range = safe_decode_range(ws['!ref']);
- if(range.e.c < range.s.c || range.e.r < range.s.r) throw new Error("Bad range (" + i + "): " + ws['!ref']);
- }
- }
- function parse_ws_xml_dim(ws, s) {
- var d = safe_decode_range(s);
- 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);
- }
- var mergecregex = /<(?:\w:)?mergeCell ref="[A-Z0-9:]+"\s*[\/]?>/g;
- var sheetdataregex = /<(?:\w+:)?sheetData[^>]*>([\s\S]*)<\/(?:\w+:)?sheetData>/;
- var hlinkregex = /<(?:\w:)?hyperlink [^>]*>/mg;
- var dimregex = /"(\w*:\w*)"/;
- var colregex = /<(?:\w:)?col\b[^>]*[\/]?>/g;
- var afregex = /<(?:\w:)?autoFilter[^>]*([\/]|>([\s\S]*)<\/(?:\w:)?autoFilter)>/g;
- var marginregex= /<(?:\w:)?pageMargins[^>]*\/>/g;
- var sheetprregex = /<(?:\w:)?sheetPr\b(?:[^>a-z][^>]*)?\/>/;
- var svsregex = /<(?:\w:)?sheetViews[^>]*(?:[\/]|>([\s\S]*)<\/(?:\w:)?sheetViews)>/;
-
- /* 18.3 Worksheets */
- function parse_ws_xml(data, opts, idx, rels, wb, themes, styles) {
- if(!data) return data;
- if(!rels) rels = {'!id':{}};
- if(DENSE != null && opts.dense == null) opts.dense = DENSE;
-
- /* 18.3.1.99 worksheet CT_Worksheet */
- var s = opts.dense ? ([]) : ({});
- var refguess = ({s: {r:2000000, c:2000000}, e: {r:0, c:0} });
-
- var data1 = "", data2 = "";
- var mtch = data.match(sheetdataregex);
- if(mtch) {
- data1 = data.slice(0, mtch.index);
- data2 = data.slice(mtch.index + mtch[0].length);
- } else data1 = data2 = data;
-
- /* 18.3.1.82 sheetPr CT_SheetPr */
- var sheetPr = data1.match(sheetprregex);
- if(sheetPr) parse_ws_xml_sheetpr(sheetPr[0], s, wb, idx);
-
- /* 18.3.1.35 dimension CT_SheetDimension */
- var ridx = (data1.match(/<(?:\w*:)?dimension/)||{index:-1}).index;
- if(ridx > 0) {
- var ref = data1.slice(ridx,ridx+50).match(dimregex);
- if(ref) parse_ws_xml_dim(s, ref[1]);
- }
-
- /* 18.3.1.88 sheetViews CT_SheetViews */
- var svs = data1.match(svsregex);
- if(svs && svs[1]) parse_ws_xml_sheetviews(svs[1], wb);
-
- /* 18.3.1.17 cols CT_Cols */
- var columns = [];
- if(opts.cellStyles) {
- /* 18.3.1.13 col CT_Col */
- var cols = data1.match(colregex);
- if(cols) parse_ws_xml_cols(columns, cols);
- }
-
- /* 18.3.1.80 sheetData CT_SheetData ? */
- if(mtch) parse_ws_xml_data(mtch[1], s, opts, refguess, themes, styles);
-
- /* 18.3.1.2 autoFilter CT_AutoFilter */
- var afilter = data2.match(afregex);
- if(afilter) s['!autofilter'] = parse_ws_xml_autofilter(afilter[0]);
-
- /* 18.3.1.55 mergeCells CT_MergeCells */
- var merges = [];
- var _merge = data2.match(mergecregex);
- if(_merge) for(ridx = 0; ridx != _merge.length; ++ridx)
- merges[ridx] = safe_decode_range(_merge[ridx].slice(_merge[ridx].indexOf("\"")+1));
-
- /* 18.3.1.48 hyperlinks CT_Hyperlinks */
- var hlink = data2.match(hlinkregex);
- if(hlink) parse_ws_xml_hlinks(s, hlink, rels);
-
- /* 18.3.1.62 pageMargins CT_PageMargins */
- var margins = data2.match(marginregex);
- if(margins) s['!margins'] = parse_ws_xml_margins(parsexmltag(margins[0]));
-
- if(!s["!ref"] && refguess.e.c >= refguess.s.c && refguess.e.r >= refguess.s.r) s["!ref"] = encode_range(refguess);
- if(opts.sheetRows > 0 && s["!ref"]) {
- var tmpref = safe_decode_range(s["!ref"]);
- if(opts.sheetRows <= +tmpref.e.r) {
- tmpref.e.r = opts.sheetRows - 1;
- if(tmpref.e.r > refguess.e.r) tmpref.e.r = refguess.e.r;
- if(tmpref.e.r < tmpref.s.r) tmpref.s.r = tmpref.e.r;
- if(tmpref.e.c > refguess.e.c) tmpref.e.c = refguess.e.c;
- if(tmpref.e.c < tmpref.s.c) tmpref.s.c = tmpref.e.c;
- s["!fullref"] = s["!ref"];
- s["!ref"] = encode_range(tmpref);
- }
- }
- if(columns.length > 0) s["!cols"] = columns;
- if(merges.length > 0) s["!merges"] = merges;
- return s;
- }
-
- function write_ws_xml_merges(merges) {
- if(merges.length === 0) return "";
- var o = '<mergeCells count="' + merges.length + '">';
- for(var i = 0; i != merges.length; ++i) o += '<mergeCell ref="' + encode_range(merges[i]) + '"/>';
- return o + '</mergeCells>';
- }
-
- /* 18.3.1.82-3 sheetPr CT_ChartsheetPr / CT_SheetPr */
- function parse_ws_xml_sheetpr(sheetPr, s, wb, idx) {
- var data = parsexmltag(sheetPr);
- if(!wb.Sheets[idx]) wb.Sheets[idx] = {};
- if(data.codeName) wb.Sheets[idx].CodeName = unescapexml(utf8read(data.codeName));
- }
- function write_ws_xml_sheetpr(ws, wb, idx, opts, o) {
- var needed = false;
- var props = {}, payload = null;
- if(opts.bookType !== 'xlsx' && wb.vbaraw) {
- var cname = wb.SheetNames[idx];
- try { if(wb.Workbook) cname = wb.Workbook.Sheets[idx].CodeName || cname; } catch(e) {}
- needed = true;
- props.codeName = utf8write(escapexml(cname));
- }
-
- if(ws && ws["!outline"]) {
- var outlineprops = {summaryBelow:1, summaryRight:1};
- if(ws["!outline"].above) outlineprops.summaryBelow = 0;
- if(ws["!outline"].left) outlineprops.summaryRight = 0;
- payload = (payload||"") + writextag('outlinePr', null, outlineprops);
- }
-
- if(!needed && !payload) return;
- o[o.length] = (writextag('sheetPr', payload, props));
- }
-
- /* 18.3.1.85 sheetProtection CT_SheetProtection */
- var sheetprot_deffalse = ["objects", "scenarios", "selectLockedCells", "selectUnlockedCells"];
- var sheetprot_deftrue = [
- "formatColumns", "formatRows", "formatCells",
- "insertColumns", "insertRows", "insertHyperlinks",
- "deleteColumns", "deleteRows",
- "sort", "autoFilter", "pivotTables"
- ];
- function write_ws_xml_protection(sp) {
- // algorithmName, hashValue, saltValue, spinCount
- var o = ({sheet:1});
- sheetprot_deffalse.forEach(function(n) { if(sp[n] != null && sp[n]) o[n] = "1"; });
- sheetprot_deftrue.forEach(function(n) { if(sp[n] != null && !sp[n]) o[n] = "0"; });
- /* TODO: algorithm */
- if(sp.password) o.password = crypto_CreatePasswordVerifier_Method1(sp.password).toString(16).toUpperCase();
- return writextag('sheetProtection', null, o);
- }
-
- function parse_ws_xml_hlinks(s, data, rels) {
- var dense = Array.isArray(s);
- for(var i = 0; i != data.length; ++i) {
- var val = parsexmltag(utf8read(data[i]), true);
- if(!val.ref) return;
- var rel = ((rels || {})['!id']||[])[val.id];
- if(rel) {
- val.Target = rel.Target;
- if(val.location) val.Target += "#"+val.location;
- } else {
- val.Target = "#" + val.location;
- rel = {Target: val.Target, TargetMode: 'Internal'};
- }
- val.Rel = rel;
- if(val.tooltip) { val.Tooltip = val.tooltip; delete val.tooltip; }
- var rng = safe_decode_range(val.ref);
- for(var R=rng.s.r;R<=rng.e.r;++R) for(var C=rng.s.c;C<=rng.e.c;++C) {
- var addr = encode_cell({c:C,r:R});
- if(dense) {
- if(!s[R]) s[R] = [];
- if(!s[R][C]) s[R][C] = {t:"z",v:undefined};
- s[R][C].l = val;
- } else {
- if(!s[addr]) s[addr] = {t:"z",v:undefined};
- s[addr].l = val;
- }
- }
- }
- }
-
- function parse_ws_xml_margins(margin) {
- var o = {};
- ["left", "right", "top", "bottom", "header", "footer"].forEach(function(k) {
- if(margin[k]) o[k] = parseFloat(margin[k]);
- });
- return o;
- }
- function write_ws_xml_margins(margin) {
- default_margins(margin);
- return writextag('pageMargins', null, margin);
- }
-
- function parse_ws_xml_cols(columns, cols) {
- var seencol = false;
- for(var coli = 0; coli != cols.length; ++coli) {
- var coll = parsexmltag(cols[coli], true);
- if(coll.hidden) coll.hidden = parsexmlbool(coll.hidden);
- var colm=parseInt(coll.min, 10)-1, colM=parseInt(coll.max,10)-1;
- delete coll.min; delete coll.max; coll.width = +coll.width;
- if(!seencol && coll.width) { seencol = true; find_mdw_colw(coll.width); }
- process_col(coll);
- while(colm <= colM) columns[colm++] = dup(coll);
- }
- }
- function write_ws_xml_cols(ws, cols) {
- var o = ["<cols>"], col;
- for(var i = 0; i != cols.length; ++i) {
- if(!(col = cols[i])) continue;
- o[o.length] = (writextag('col', null, col_obj_w(i, col)));
- }
- o[o.length] = "</cols>";
- return o.join("");
- }
-
- function parse_ws_xml_autofilter(data) {
- var o = { ref: (data.match(/ref="([^"]*)"/)||[])[1]};
- return o;
- }
- function write_ws_xml_autofilter(data, ws, wb, idx) {
- var ref = typeof data.ref == "string" ? data.ref : encode_range(data.ref);
- if(!wb.Workbook) wb.Workbook = ({Sheets:[]});
- if(!wb.Workbook.Names) wb.Workbook.Names = [];
- var names = wb.Workbook.Names;
- var range = decode_range(ref);
- if(range.s.r == range.e.r) { range.e.r = decode_range(ws["!ref"]).e.r; ref = encode_range(range); }
- for(var i = 0; i < names.length; ++i) {
- var name = names[i];
- if(name.Name != '_xlnm._FilterDatabase') continue;
- if(name.Sheet != idx) continue;
- name.Ref = "'" + wb.SheetNames[idx] + "'!" + ref; break;
- }
- if(i == names.length) names.push({ Name: '_xlnm._FilterDatabase', Sheet: idx, Ref: "'" + wb.SheetNames[idx] + "'!" + ref });
- return writextag("autoFilter", null, {ref:ref});
- }
-
- /* 18.3.1.88 sheetViews CT_SheetViews */
- /* 18.3.1.87 sheetView CT_SheetView */
- var sviewregex = /<(?:\w:)?sheetView(?:[^>a-z][^>]*)?\/?>/;
- function parse_ws_xml_sheetviews(data, wb) {
- if(!wb.Views) wb.Views = [{}];
- (data.match(sviewregex)||[]).forEach(function(r, i) {
- var tag = parsexmltag(r);
- // $FlowIgnore
- if(!wb.Views[i]) wb.Views[i] = {};
- // $FlowIgnore
- if(+tag.zoomScale) wb.Views[i].zoom = +tag.zoomScale;
- // $FlowIgnore
- if(parsexmlbool(tag.rightToLeft)) wb.Views[i].RTL = true;
- });
- }
- function write_ws_xml_sheetviews(ws, opts, idx, wb) {
- var sview = ({workbookViewId:"0"});
- // $FlowIgnore
- if((((wb||{}).Workbook||{}).Views||[])[0]) sview.rightToLeft = wb.Workbook.Views[0].RTL ? "1" : "0";
- return writextag("sheetViews", writextag("sheetView", null, sview), {});
- }
-
- function write_ws_xml_cell(cell, ref, ws, opts) {
- if(cell.v === undefined && typeof cell.f !== "string" || cell.t === 'z') return "";
- var vv = "";
- var oldt = cell.t, oldv = cell.v;
- if(cell.t !== "z") switch(cell.t) {
- case 'b': vv = cell.v ? "1" : "0"; break;
- case 'n': vv = ''+cell.v; break;
- case 'e': vv = BErr[cell.v]; break;
- case 'd':
- if(opts && opts.cellDates) vv = parseDate(cell.v, -1).toISOString();
- else {
- cell = dup(cell);
- cell.t = 'n';
- vv = ''+(cell.v = datenum(parseDate(cell.v)));
- }
- if(typeof cell.z === 'undefined') cell.z = SSF._table[14];
- break;
- default: vv = cell.v; break;
- }
- var v = writetag('v', escapexml(vv)), o = ({r:ref});
- /* TODO: cell style */
- var os = get_cell_style(opts.cellXfs, cell, opts);
- if(os !== 0) o.s = os;
- switch(cell.t) {
- case 'n': break;
- case 'd': o.t = "d"; break;
- case 'b': o.t = "b"; break;
- case 'e': o.t = "e"; break;
- case 'z': break;
- default: if(cell.v == null) { delete cell.t; break; }
- if(opts && opts.bookSST) {
- v = writetag('v', ''+get_sst_id(opts.Strings, cell.v, opts.revStrings));
- o.t = "s"; break;
- }
- o.t = "str"; break;
- }
- if(cell.t != oldt) { cell.t = oldt; cell.v = oldv; }
- if(typeof cell.f == "string" && cell.f) {
- var ff = cell.F && cell.F.slice(0, ref.length) == ref ? {t:"array", ref:cell.F} : null;
- v = writextag('f', escapexml(cell.f), ff) + (cell.v != null ? v : "");
- }
- if(cell.l) ws['!links'].push([ref, cell.l]);
- if(cell.c) ws['!comments'].push([ref, cell.c]);
- return writextag('c', v, o);
- }
-
- var parse_ws_xml_data = (function() {
- var cellregex = /<(?:\w+:)?c[ \/>]/, rowregex = /<\/(?:\w+:)?row>/;
- var rregex = /r=["']([^"']*)["']/, isregex = /<(?:\w+:)?is>([\S\s]*?)<\/(?:\w+:)?is>/;
- var refregex = /ref=["']([^"']*)["']/;
- var match_v = matchtag("v"), match_f = matchtag("f");
-
- return function parse_ws_xml_data(sdata, s, opts, guess, themes, styles) {
- var ri = 0, x = "", cells = [], cref = [], idx=0, i=0, cc=0, d="", p;
- var tag, tagr = 0, tagc = 0;
- var sstr, ftag;
- var fmtid = 0, fillid = 0;
- var do_format = Array.isArray(styles.CellXf), cf;
- var arrayf = [];
- var sharedf = [];
- var dense = Array.isArray(s);
- var rows = [], rowobj = {}, rowrite = false;
- var sheetStubs = !!opts.sheetStubs;
- for(var marr = sdata.split(rowregex), mt = 0, marrlen = marr.length; mt != marrlen; ++mt) {
- x = marr[mt].trim();
- var xlen = x.length;
- if(xlen === 0) continue;
-
- /* 18.3.1.73 row CT_Row */
- for(ri = 0; ri < xlen; ++ri) if(x.charCodeAt(ri) === 62) break; ++ri;
- tag = parsexmltag(x.slice(0,ri), true);
- tagr = tag.r != null ? parseInt(tag.r, 10) : tagr+1; tagc = -1;
- if(opts.sheetRows && opts.sheetRows < tagr) continue;
- if(guess.s.r > tagr - 1) guess.s.r = tagr - 1;
- if(guess.e.r < tagr - 1) guess.e.r = tagr - 1;
-
- if(opts && opts.cellStyles) {
- rowobj = {}; rowrite = false;
- if(tag.ht) { rowrite = true; rowobj.hpt = parseFloat(tag.ht); rowobj.hpx = pt2px(rowobj.hpt); }
- if(tag.hidden == "1") { rowrite = true; rowobj.hidden = true; }
- if(tag.outlineLevel != null) { rowrite = true; rowobj.level = +tag.outlineLevel; }
- if(rowrite) rows[tagr-1] = rowobj;
- }
-
- /* 18.3.1.4 c CT_Cell */
- cells = x.slice(ri).split(cellregex);
- for(var rslice = 0; rslice != cells.length; ++rslice) if(cells[rslice].trim().charAt(0) != "<") break;
- cells = cells.slice(rslice);
- for(ri = 0; ri != cells.length; ++ri) {
- x = cells[ri].trim();
- if(x.length === 0) continue;
- cref = x.match(rregex); idx = ri; i=0; cc=0;
- x = "<c " + (x.slice(0,1)=="<"?">":"") + x;
- if(cref != null && cref.length === 2) {
- idx = 0; d=cref[1];
- for(i=0; i != d.length; ++i) {
- if((cc=d.charCodeAt(i)-64) < 1 || cc > 26) break;
- idx = 26*idx + cc;
- }
- --idx;
- tagc = idx;
- } else ++tagc;
- for(i = 0; i != x.length; ++i) if(x.charCodeAt(i) === 62) break; ++i;
- tag = parsexmltag(x.slice(0,i), true);
- if(!tag.r) tag.r = encode_cell({r:tagr-1, c:tagc});
- d = x.slice(i);
- p = ({t:""});
-
- if((cref=d.match(match_v))!= null && cref[1] !== '') p.v=unescapexml(cref[1]);
- if(opts.cellFormula) {
- if((cref=d.match(match_f))!= null && cref[1] !== '') {
- /* TODO: match against XLSXFutureFunctions */
- p.f=unescapexml(utf8read(cref[1])).replace(/\r\n/g, "\n");
- if(!opts.xlfn) p.f = _xlfn(p.f);
- if(cref[0].indexOf('t="array"') > -1) {
- p.F = (d.match(refregex)||[])[1];
- if(p.F.indexOf(":") > -1) arrayf.push([safe_decode_range(p.F), p.F]);
- } else if(cref[0].indexOf('t="shared"') > -1) {
- // TODO: parse formula
- ftag = parsexmltag(cref[0]);
- var ___f = unescapexml(utf8read(cref[1]));
- if(!opts.xlfn) ___f = _xlfn(___f);
- sharedf[parseInt(ftag.si, 10)] = [ftag, ___f, tag.r];
- }
- } else if((cref=d.match(/<f[^>]*\/>/))) {
- ftag = parsexmltag(cref[0]);
- if(sharedf[ftag.si]) p.f = shift_formula_xlsx(sharedf[ftag.si][1], sharedf[ftag.si][2]/*[0].ref*/, tag.r);
- }
- /* TODO: factor out contains logic */
- var _tag = decode_cell(tag.r);
- for(i = 0; i < arrayf.length; ++i)
- if(_tag.r >= arrayf[i][0].s.r && _tag.r <= arrayf[i][0].e.r)
- if(_tag.c >= arrayf[i][0].s.c && _tag.c <= arrayf[i][0].e.c)
- p.F = arrayf[i][1];
- }
-
- if(tag.t == null && p.v === undefined) {
- if(p.f || p.F) {
- p.v = 0; p.t = "n";
- } else if(!sheetStubs) continue;
- else p.t = "z";
- }
- else p.t = tag.t || "n";
- if(guess.s.c > tagc) guess.s.c = tagc;
- if(guess.e.c < tagc) guess.e.c = tagc;
- /* 18.18.11 t ST_CellType */
- switch(p.t) {
- case 'n':
- if(p.v == "" || p.v == null) {
- if(!sheetStubs) continue;
- p.t = 'z';
- } else p.v = parseFloat(p.v);
- break;
- case 's':
- if(typeof p.v == 'undefined') {
- if(!sheetStubs) continue;
- p.t = 'z';
- } else {
- sstr = strs[parseInt(p.v, 10)];
- p.v = sstr.t;
- p.r = sstr.r;
- if(opts.cellHTML) p.h = sstr.h;
- }
- break;
- case 'str':
- p.t = "s";
- p.v = (p.v!=null) ? utf8read(p.v) : '';
- if(opts.cellHTML) p.h = escapehtml(p.v);
- break;
- case 'inlineStr':
- cref = d.match(isregex);
- p.t = 's';
- if(cref != null && (sstr = parse_si(cref[1]))) {
- p.v = sstr.t;
- if(opts.cellHTML) p.h = sstr.h;
- } else p.v = "";
- break;
- case 'b': p.v = parsexmlbool(p.v); break;
- case 'd':
- if(opts.cellDates) p.v = parseDate(p.v, 1);
- else { p.v = datenum(parseDate(p.v, 1)); p.t = 'n'; }
- break;
- /* error string in .w, number in .v */
- case 'e':
- if(!opts || opts.cellText !== false) p.w = p.v;
- p.v = RBErr[p.v]; break;
- }
- /* formatting */
- fmtid = fillid = 0;
- cf = null;
- if(do_format && tag.s !== undefined) {
- cf = styles.CellXf[tag.s];
- if(cf != null) {
- if(cf.numFmtId != null) fmtid = cf.numFmtId;
- if(opts.cellStyles) {
- if(cf.fillId != null) fillid = cf.fillId;
- }
- }
- }
- safe_format(p, fmtid, fillid, opts, themes, styles);
- if(opts.cellDates && do_format && p.t == 'n' && SSF.is_date(SSF._table[fmtid])) { p.t = 'd'; p.v = numdate(p.v); }
- if(dense) {
- var _r = decode_cell(tag.r);
- if(!s[_r.r]) s[_r.r] = [];
- s[_r.r][_r.c] = p;
- } else s[tag.r] = p;
- }
- }
- if(rows.length > 0) s['!rows'] = rows;
- }; })();
-
- function write_ws_xml_data(ws, opts, idx, wb) {
- var o = [], r = [], range = safe_decode_range(ws['!ref']), cell="", ref, rr = "", cols = [], R=0, C=0, rows = ws['!rows'];
- var dense = Array.isArray(ws);
- var params = ({r:rr}), row, height = -1;
- for(C = range.s.c; C <= range.e.c; ++C) cols[C] = encode_col(C);
- for(R = range.s.r; R <= range.e.r; ++R) {
- r = [];
- rr = encode_row(R);
- for(C = range.s.c; C <= range.e.c; ++C) {
- ref = cols[C] + rr;
- var _cell = dense ? (ws[R]||[])[C]: ws[ref];
- if(_cell === undefined) continue;
- if((cell = write_ws_xml_cell(_cell, ref, ws, opts, idx, wb)) != null) r.push(cell);
- }
- if(r.length > 0 || (rows && rows[R])) {
- params = ({r:rr});
- if(rows && rows[R]) {
- row = rows[R];
- if(row.hidden) params.hidden = 1;
- height = -1;
- if(row.hpx) height = px2pt(row.hpx);
- else if(row.hpt) height = row.hpt;
- if(height > -1) { params.ht = height; params.customHeight = 1; }
- if(row.level) { params.outlineLevel = row.level; }
- }
- o[o.length] = (writextag('row', r.join(""), params));
- }
- }
- if(rows) for(; R < rows.length; ++R) {
- if(rows && rows[R]) {
- params = ({r:R+1});
- row = rows[R];
- if(row.hidden) params.hidden = 1;
- height = -1;
- if (row.hpx) height = px2pt(row.hpx);
- else if (row.hpt) height = row.hpt;
- if (height > -1) { params.ht = height; params.customHeight = 1; }
- if (row.level) { params.outlineLevel = row.level; }
- o[o.length] = (writextag('row', "", params));
- }
- }
- return o.join("");
- }
-
- var WS_XML_ROOT = writextag('worksheet', null, {
- 'xmlns': XMLNS.main[0],
- 'xmlns:r': XMLNS.r
- });
-
- function write_ws_xml(idx, opts, wb, rels) {
- var o = [XML_HEADER, WS_XML_ROOT];
- var s = wb.SheetNames[idx], sidx = 0, rdata = "";
- var ws = wb.Sheets[s];
- if(ws == null) ws = {};
- var ref = ws['!ref'] || 'A1';
- var range = safe_decode_range(ref);
- if(range.e.c > 0x3FFF || range.e.r > 0xFFFFF) {
- if(opts.WTF) throw new Error("Range " + ref + " exceeds format limit A1:XFD1048576");
- range.e.c = Math.min(range.e.c, 0x3FFF);
- range.e.r = Math.min(range.e.c, 0xFFFFF);
- ref = encode_range(range);
- }
- if(!rels) rels = {};
- ws['!comments'] = [];
- var _drawing = [];
-
- write_ws_xml_sheetpr(ws, wb, idx, opts, o);
-
- o[o.length] = (writextag('dimension', null, {'ref': ref}));
-
- o[o.length] = write_ws_xml_sheetviews(ws, opts, idx, wb);
-
- /* TODO: store in WB, process styles */
- if(opts.sheetFormat) o[o.length] = (writextag('sheetFormatPr', null, {
- defaultRowHeight:opts.sheetFormat.defaultRowHeight||'16',
- baseColWidth:opts.sheetFormat.baseColWidth||'10',
- outlineLevelRow:opts.sheetFormat.outlineLevelRow||'7'
- }));
-
- if(ws['!cols'] != null && ws['!cols'].length > 0) o[o.length] = (write_ws_xml_cols(ws, ws['!cols']));
-
- o[sidx = o.length] = '<sheetData/>';
- ws['!links'] = [];
- if(ws['!ref'] != null) {
- rdata = write_ws_xml_data(ws, opts, idx, wb, rels);
- if(rdata.length > 0) o[o.length] = (rdata);
- }
- if(o.length>sidx+1) { o[o.length] = ('</sheetData>'); o[sidx]=o[sidx].replace("/>",">"); }
-
- /* sheetCalcPr */
-
- if(ws['!protect'] != null) o[o.length] = write_ws_xml_protection(ws['!protect']);
-
- /* protectedRanges */
- /* scenarios */
-
- if(ws['!autofilter'] != null) o[o.length] = write_ws_xml_autofilter(ws['!autofilter'], ws, wb, idx);
-
- /* sortState */
- /* dataConsolidate */
- /* customSheetViews */
-
- if(ws['!merges'] != null && ws['!merges'].length > 0) o[o.length] = (write_ws_xml_merges(ws['!merges']));
-
- /* phoneticPr */
- /* conditionalFormatting */
- /* dataValidations */
-
- var relc = -1, rel, rId = -1;
- if(ws['!links'].length > 0) {
- o[o.length] = "<hyperlinks>";
- ws['!links'].forEach(function(l) {
- if(!l[1].Target) return;
- rel = ({"ref":l[0]});
- if(l[1].Target.charAt(0) != "#") {
- rId = add_rels(rels, -1, escapexml(l[1].Target).replace(/#.*$/, ""), RELS.HLINK);
- rel["r:id"] = "rId"+rId;
- }
- if((relc = l[1].Target.indexOf("#")) > -1) rel.location = escapexml(l[1].Target.slice(relc+1));
- if(l[1].Tooltip) rel.tooltip = escapexml(l[1].Tooltip);
- o[o.length] = writextag("hyperlink",null,rel);
- });
- o[o.length] = "</hyperlinks>";
- }
- delete ws['!links'];
-
- /* printOptions */
-
- if(ws['!margins'] != null) o[o.length] = write_ws_xml_margins(ws['!margins']);
-
- /* pageSetup */
- /* headerFooter */
- /* rowBreaks */
- /* colBreaks */
- /* customProperties */
- /* cellWatches */
-
- if(!opts || opts.ignoreEC || (opts.ignoreEC == (void 0))) o[o.length] = writetag("ignoredErrors", writextag("ignoredError", null, {numberStoredAsText:1, sqref:ref}));
-
- /* smartTags */
-
- if(_drawing.length > 0) {
- rId = add_rels(rels, -1, "../drawings/drawing" + (idx+1) + ".xml", RELS.DRAW);
- o[o.length] = writextag("drawing", null, {"r:id":"rId" + rId});
- ws['!drawing'] = _drawing;
- }
-
- if(ws['!comments'].length > 0) {
- rId = add_rels(rels, -1, "../drawings/vmlDrawing" + (idx+1) + ".vml", RELS.VML);
- o[o.length] = writextag("legacyDrawing", null, {"r:id":"rId" + rId});
- ws['!legacy'] = rId;
- }
-
- /* legacyDrawingHF */
- /* picture */
- /* oleObjects */
- /* controls */
- /* webPublishItems */
- /* tableParts */
- /* extLst */
-
- if(o.length>1) { o[o.length] = ('</worksheet>'); o[1]=o[1].replace("/>",">"); }
- return o.join("");
- }
-
- /* [MS-XLSB] 2.4.726 BrtRowHdr */
- function parse_BrtRowHdr(data, length) {
- var z = ({});
- var tgt = data.l + length;
- z.r = data.read_shift(4);
- data.l += 4; // TODO: ixfe
- var miyRw = data.read_shift(2);
- data.l += 1; // TODO: top/bot padding
- var flags = data.read_shift(1);
- data.l = tgt;
- if(flags & 0x07) z.level = flags & 0x07;
- if(flags & 0x10) z.hidden = true;
- if(flags & 0x20) z.hpt = miyRw / 20;
- return z;
- }
- function write_BrtRowHdr(R, range, ws) {
- var o = new_buf(17+8*16);
- var row = (ws['!rows']||[])[R]||{};
- o.write_shift(4, R);
-
- o.write_shift(4, 0); /* TODO: ixfe */
-
- var miyRw = 0x0140;
- if(row.hpx) miyRw = px2pt(row.hpx) * 20;
- else if(row.hpt) miyRw = row.hpt * 20;
- o.write_shift(2, miyRw);
-
- o.write_shift(1, 0); /* top/bot padding */
-
- var flags = 0x0;
- if(row.level) flags |= row.level;
- if(row.hidden) flags |= 0x10;
- if(row.hpx || row.hpt) flags |= 0x20;
- o.write_shift(1, flags);
-
- o.write_shift(1, 0); /* phonetic guide */
-
- /* [MS-XLSB] 2.5.8 BrtColSpan explains the mechanism */
- var ncolspan = 0, lcs = o.l;
- o.l += 4;
-
- var caddr = {r:R, c:0};
- for(var i = 0; i < 16; ++i) {
- if((range.s.c > ((i+1) << 10)) || (range.e.c < (i << 10))) continue;
- var first = -1, last = -1;
- for(var j = (i<<10); j < ((i+1)<<10); ++j) {
- caddr.c = j;
- var cell = Array.isArray(ws) ? (ws[caddr.r]||[])[caddr.c] : ws[encode_cell(caddr)];
- if(cell) { if(first < 0) first = j; last = j; }
- }
- if(first < 0) continue;
- ++ncolspan;
- o.write_shift(4, first);
- o.write_shift(4, last);
- }
-
- var l = o.l;
- o.l = lcs;
- o.write_shift(4, ncolspan);
- o.l = l;
-
- return o.length > o.l ? o.slice(0, o.l) : o;
- }
- function write_row_header(ba, ws, range, R) {
- var o = write_BrtRowHdr(R, range, ws);
- if((o.length > 17) || (ws['!rows']||[])[R]) write_record(ba, 'BrtRowHdr', o);
- }
-
- /* [MS-XLSB] 2.4.820 BrtWsDim */
- var parse_BrtWsDim = parse_UncheckedRfX;
- var write_BrtWsDim = write_UncheckedRfX;
-
- /* [MS-XLSB] 2.4.821 BrtWsFmtInfo */
- function parse_BrtWsFmtInfo() {
- }
- //function write_BrtWsFmtInfo(ws, o) { }
-
- /* [MS-XLSB] 2.4.823 BrtWsProp */
- function parse_BrtWsProp(data, length) {
- var z = {};
- /* TODO: pull flags */
- data.l += 19;
- z.name = parse_XLSBCodeName(data, length - 19);
- return z;
- }
- function write_BrtWsProp(str, o) {
- if(o == null) o = new_buf(84+4*str.length);
- for(var i = 0; i < 3; ++i) o.write_shift(1,0);
- write_BrtColor({auto:1}, o);
- o.write_shift(-4,-1);
- o.write_shift(-4,-1);
- write_XLSBCodeName(str, o);
- return o.slice(0, o.l);
- }
-
- /* [MS-XLSB] 2.4.306 BrtCellBlank */
- function parse_BrtCellBlank(data) {
- var cell = parse_XLSBCell(data);
- return [cell];
- }
- function write_BrtCellBlank(cell, ncell, o) {
- if(o == null) o = new_buf(8);
- return write_XLSBCell(ncell, o);
- }
- function parse_BrtShortBlank(data) {
- var cell = parse_XLSBShortCell(data);
- return [cell];
- }
- function write_BrtShortBlank(cell, ncell, o) {
- if(o == null) o = new_buf(4);
- return write_XLSBShortCell(ncell, o);
- }
-
- /* [MS-XLSB] 2.4.307 BrtCellBool */
- function parse_BrtCellBool(data) {
- var cell = parse_XLSBCell(data);
- var fBool = data.read_shift(1);
- return [cell, fBool, 'b'];
- }
- function write_BrtCellBool(cell, ncell, o) {
- if(o == null) o = new_buf(9);
- write_XLSBCell(ncell, o);
- o.write_shift(1, cell.v ? 1 : 0);
- return o;
- }
- function parse_BrtShortBool(data) {
- var cell = parse_XLSBShortCell(data);
- var fBool = data.read_shift(1);
- return [cell, fBool, 'b'];
- }
- function write_BrtShortBool(cell, ncell, o) {
- if(o == null) o = new_buf(5);
- write_XLSBShortCell(ncell, o);
- o.write_shift(1, cell.v ? 1 : 0);
- return o;
- }
-
- /* [MS-XLSB] 2.4.308 BrtCellError */
- function parse_BrtCellError(data) {
- var cell = parse_XLSBCell(data);
- var bError = data.read_shift(1);
- return [cell, bError, 'e'];
- }
- function write_BrtCellError(cell, ncell, o) {
- if(o == null) o = new_buf(9);
- write_XLSBCell(ncell, o);
- o.write_shift(1, cell.v);
- return o;
- }
- function parse_BrtShortError(data) {
- var cell = parse_XLSBShortCell(data);
- var bError = data.read_shift(1);
- return [cell, bError, 'e'];
- }
- function write_BrtShortError(cell, ncell, o) {
- if(o == null) o = new_buf(8);
- write_XLSBShortCell(ncell, o);
- o.write_shift(1, cell.v);
- o.write_shift(2, 0);
- o.write_shift(1, 0);
- return o;
- }
-
-
- /* [MS-XLSB] 2.4.311 BrtCellIsst */
- function parse_BrtCellIsst(data) {
- var cell = parse_XLSBCell(data);
- var isst = data.read_shift(4);
- return [cell, isst, 's'];
- }
- function write_BrtCellIsst(cell, ncell, o) {
- if(o == null) o = new_buf(12);
- write_XLSBCell(ncell, o);
- o.write_shift(4, ncell.v);
- return o;
- }
- function parse_BrtShortIsst(data) {
- var cell = parse_XLSBShortCell(data);
- var isst = data.read_shift(4);
- return [cell, isst, 's'];
- }
- function write_BrtShortIsst(cell, ncell, o) {
- if(o == null) o = new_buf(8);
- write_XLSBShortCell(ncell, o);
- o.write_shift(4, ncell.v);
- return o;
- }
-
- /* [MS-XLSB] 2.4.313 BrtCellReal */
- function parse_BrtCellReal(data) {
- var cell = parse_XLSBCell(data);
- var value = parse_Xnum(data);
- return [cell, value, 'n'];
- }
- function write_BrtCellReal(cell, ncell, o) {
- if(o == null) o = new_buf(16);
- write_XLSBCell(ncell, o);
- write_Xnum(cell.v, o);
- return o;
- }
- function parse_BrtShortReal(data) {
- var cell = parse_XLSBShortCell(data);
- var value = parse_Xnum(data);
- return [cell, value, 'n'];
- }
- function write_BrtShortReal(cell, ncell, o) {
- if(o == null) o = new_buf(12);
- write_XLSBShortCell(ncell, o);
- write_Xnum(cell.v, o);
- return o;
- }
-
- /* [MS-XLSB] 2.4.314 BrtCellRk */
- function parse_BrtCellRk(data) {
- var cell = parse_XLSBCell(data);
- var value = parse_RkNumber(data);
- return [cell, value, 'n'];
- }
- function write_BrtCellRk(cell, ncell, o) {
- if(o == null) o = new_buf(12);
- write_XLSBCell(ncell, o);
- write_RkNumber(cell.v, o);
- return o;
- }
- function parse_BrtShortRk(data) {
- var cell = parse_XLSBShortCell(data);
- var value = parse_RkNumber(data);
- return [cell, value, 'n'];
- }
- function write_BrtShortRk(cell, ncell, o) {
- if(o == null) o = new_buf(8);
- write_XLSBShortCell(ncell, o);
- write_RkNumber(cell.v, o);
- return o;
- }
-
-
- /* [MS-XLSB] 2.4.317 BrtCellSt */
- function parse_BrtCellSt(data) {
- var cell = parse_XLSBCell(data);
- var value = parse_XLWideString(data);
- return [cell, value, 'str'];
- }
- function write_BrtCellSt(cell, ncell, o) {
- if(o == null) o = new_buf(12 + 4 * cell.v.length);
- write_XLSBCell(ncell, o);
- write_XLWideString(cell.v, o);
- return o.length > o.l ? o.slice(0, o.l) : o;
- }
- function parse_BrtShortSt(data) {
- var cell = parse_XLSBShortCell(data);
- var value = parse_XLWideString(data);
- return [cell, value, 'str'];
- }
- function write_BrtShortSt(cell, ncell, o) {
- if(o == null) o = new_buf(8 + 4 * cell.v.length);
- write_XLSBShortCell(ncell, o);
- write_XLWideString(cell.v, o);
- return o.length > o.l ? o.slice(0, o.l) : o;
- }
-
- /* [MS-XLSB] 2.4.653 BrtFmlaBool */
- function parse_BrtFmlaBool(data, length, opts) {
- var end = data.l + length;
- var cell = parse_XLSBCell(data);
- cell.r = opts['!row'];
- var value = data.read_shift(1);
- var o = [cell, value, 'b'];
- if(opts.cellFormula) {
- data.l += 2;
- var formula = parse_XLSBCellParsedFormula(data, end - data.l, opts);
- o[3] = stringify_formula(formula, null/*range*/, cell, opts.supbooks, opts);/* TODO */
- }
- else data.l = end;
- return o;
- }
-
- /* [MS-XLSB] 2.4.654 BrtFmlaError */
- function parse_BrtFmlaError(data, length, opts) {
- var end = data.l + length;
- var cell = parse_XLSBCell(data);
- cell.r = opts['!row'];
- var value = data.read_shift(1);
- var o = [cell, value, 'e'];
- if(opts.cellFormula) {
- data.l += 2;
- var formula = parse_XLSBCellParsedFormula(data, end - data.l, opts);
- o[3] = stringify_formula(formula, null/*range*/, cell, opts.supbooks, opts);/* TODO */
- }
- else data.l = end;
- return o;
- }
-
- /* [MS-XLSB] 2.4.655 BrtFmlaNum */
- function parse_BrtFmlaNum(data, length, opts) {
- var end = data.l + length;
- var cell = parse_XLSBCell(data);
- cell.r = opts['!row'];
- var value = parse_Xnum(data);
- var o = [cell, value, 'n'];
- if(opts.cellFormula) {
- data.l += 2;
- var formula = parse_XLSBCellParsedFormula(data, end - data.l, opts);
- o[3] = stringify_formula(formula, null/*range*/, cell, opts.supbooks, opts);/* TODO */
- }
- else data.l = end;
- return o;
- }
-
- /* [MS-XLSB] 2.4.656 BrtFmlaString */
- function parse_BrtFmlaString(data, length, opts) {
- var end = data.l + length;
- var cell = parse_XLSBCell(data);
- cell.r = opts['!row'];
- var value = parse_XLWideString(data);
- var o = [cell, value, 'str'];
- if(opts.cellFormula) {
- data.l += 2;
- var formula = parse_XLSBCellParsedFormula(data, end - data.l, opts);
- o[3] = stringify_formula(formula, null/*range*/, cell, opts.supbooks, opts);/* TODO */
- }
- else data.l = end;
- return o;
- }
-
- /* [MS-XLSB] 2.4.682 BrtMergeCell */
- var parse_BrtMergeCell = parse_UncheckedRfX;
- var write_BrtMergeCell = write_UncheckedRfX;
- /* [MS-XLSB] 2.4.107 BrtBeginMergeCells */
- function write_BrtBeginMergeCells(cnt, o) {
- if(o == null) o = new_buf(4);
- o.write_shift(4, cnt);
- return o;
- }
-
- /* [MS-XLSB] 2.4.662 BrtHLink */
- function parse_BrtHLink(data, length) {
- var end = data.l + length;
- var rfx = parse_UncheckedRfX(data, 16);
- var relId = parse_XLNullableWideString(data);
- var loc = parse_XLWideString(data);
- var tooltip = parse_XLWideString(data);
- var display = parse_XLWideString(data);
- data.l = end;
- var o = ({rfx:rfx, relId:relId, loc:loc, display:display});
- if(tooltip) o.Tooltip = tooltip;
- return o;
- }
- function write_BrtHLink(l, rId) {
- var o = new_buf(50+4*(l[1].Target.length + (l[1].Tooltip || "").length));
- write_UncheckedRfX({s:decode_cell(l[0]), e:decode_cell(l[0])}, o);
- write_RelID("rId" + rId, o);
- var locidx = l[1].Target.indexOf("#");
- var loc = locidx == -1 ? "" : l[1].Target.slice(locidx+1);
- write_XLWideString(loc || "", o);
- write_XLWideString(l[1].Tooltip || "", o);
- write_XLWideString("", o);
- return o.slice(0, o.l);
- }
-
- /* [MS-XLSB] 2.4.692 BrtPane */
- function parse_BrtPane(/*data, length, opts*/) {
- }
-
- /* [MS-XLSB] 2.4.6 BrtArrFmla */
- function parse_BrtArrFmla(data, length, opts) {
- var end = data.l + length;
- var rfx = parse_RfX(data, 16);
- var fAlwaysCalc = data.read_shift(1);
- var o = [rfx]; o[2] = fAlwaysCalc;
- if(opts.cellFormula) {
- var formula = parse_XLSBArrayParsedFormula(data, end - data.l, opts);
- o[1] = formula;
- } else data.l = end;
- return o;
- }
-
- /* [MS-XLSB] 2.4.750 BrtShrFmla */
- function parse_BrtShrFmla(data, length, opts) {
- var end = data.l + length;
- var rfx = parse_UncheckedRfX(data, 16);
- var o = [rfx];
- if(opts.cellFormula) {
- var formula = parse_XLSBSharedParsedFormula(data, end - data.l, opts);
- o[1] = formula;
- data.l = end;
- } else data.l = end;
- return o;
- }
-
- /* [MS-XLSB] 2.4.323 BrtColInfo */
- /* TODO: once XLS ColInfo is set, combine the functions */
- function write_BrtColInfo(C, col, o) {
- if(o == null) o = new_buf(18);
- var p = col_obj_w(C, col);
- o.write_shift(-4, C);
- o.write_shift(-4, C);
- o.write_shift(4, (p.width || 10) * 256);
- o.write_shift(4, 0/*ixfe*/); // style
- var flags = 0;
- if(col.hidden) flags |= 0x01;
- if(typeof p.width == 'number') flags |= 0x02;
- if(col.level) flags |= (col.level << 8);
- o.write_shift(2, flags); // bit flag
- return o;
- }
-
- /* [MS-XLSB] 2.4.678 BrtMargins */
- var BrtMarginKeys = ["left","right","top","bottom","header","footer"];
- function parse_BrtMargins(data) {
- var margins = ({});
- BrtMarginKeys.forEach(function(k) { margins[k] = parse_Xnum(data, 8); });
- return margins;
- }
- function write_BrtMargins(margins, o) {
- if(o == null) o = new_buf(6*8);
- default_margins(margins);
- BrtMarginKeys.forEach(function(k) { write_Xnum((margins)[k], o); });
- return o;
- }
-
- /* [MS-XLSB] 2.4.299 BrtBeginWsView */
- function parse_BrtBeginWsView(data) {
- var f = data.read_shift(2);
- data.l += 28;
- return { RTL: f & 0x20 };
- }
- function write_BrtBeginWsView(ws, Workbook, o) {
- if(o == null) o = new_buf(30);
- var f = 0x39c;
- if((((Workbook||{}).Views||[])[0]||{}).RTL) f |= 0x20;
- o.write_shift(2, f); // bit flag
- o.write_shift(4, 0);
- o.write_shift(4, 0); // view first row
- o.write_shift(4, 0); // view first col
- o.write_shift(1, 0); // gridline color ICV
- o.write_shift(1, 0);
- o.write_shift(2, 0);
- o.write_shift(2, 100); // zoom scale
- o.write_shift(2, 0);
- o.write_shift(2, 0);
- o.write_shift(2, 0);
- o.write_shift(4, 0); // workbook view id
- return o;
- }
-
- /* [MS-XLSB] 2.4.309 BrtCellIgnoreEC */
- function write_BrtCellIgnoreEC(ref) {
- var o = new_buf(24);
- o.write_shift(4, 4);
- o.write_shift(4, 1);
- write_UncheckedRfX(ref, o);
- return o;
- }
-
- /* [MS-XLSB] 2.4.748 BrtSheetProtection */
- function write_BrtSheetProtection(sp, o) {
- if(o == null) o = new_buf(16*4+2);
- o.write_shift(2, sp.password ? crypto_CreatePasswordVerifier_Method1(sp.password) : 0);
- o.write_shift(4, 1); // this record should not be written if no protection
- [
- ["objects", false], // fObjects
- ["scenarios", false], // fScenarios
- ["formatCells", true], // fFormatCells
- ["formatColumns", true], // fFormatColumns
- ["formatRows", true], // fFormatRows
- ["insertColumns", true], // fInsertColumns
- ["insertRows", true], // fInsertRows
- ["insertHyperlinks", true], // fInsertHyperlinks
- ["deleteColumns", true], // fDeleteColumns
- ["deleteRows", true], // fDeleteRows
- ["selectLockedCells", false], // fSelLockedCells
- ["sort", true], // fSort
- ["autoFilter", true], // fAutoFilter
- ["pivotTables", true], // fPivotTables
- ["selectUnlockedCells", false] // fSelUnlockedCells
- ].forEach(function(n) {
- if(n[1]) o.write_shift(4, sp[n[0]] != null && !sp[n[0]] ? 1 : 0);
- else o.write_shift(4, sp[n[0]] != null && sp[n[0]] ? 0 : 1);
- });
- return o;
- }
-
- function parse_BrtDVal(/*data, length, opts*/) {
- }
- function parse_BrtDVal14(/*data, length, opts*/) {
- }
- /* [MS-XLSB] 2.1.7.61 Worksheet */
- function parse_ws_bin(data, _opts, idx, rels, wb, themes, styles) {
- if(!data) return data;
- var opts = _opts || {};
- if(!rels) rels = {'!id':{}};
- if(DENSE != null && opts.dense == null) opts.dense = DENSE;
- var s = (opts.dense ? [] : {});
-
- var ref;
- var refguess = {s: {r:2000000, c:2000000}, e: {r:0, c:0} };
-
- var state = [];
- var pass = false, end = false;
- var row, p, cf, R, C, addr, sstr, rr, cell;
- var merges = [];
- opts.biff = 12;
- opts['!row'] = 0;
-
- var ai = 0, af = false;
-
- var arrayf = [];
- var sharedf = {};
- var supbooks = opts.supbooks || wb.supbooks || ([[]]);
- supbooks.sharedf = sharedf;
- supbooks.arrayf = arrayf;
- supbooks.SheetNames = wb.SheetNames || wb.Sheets.map(function(x) { return x.name; });
- if(!opts.supbooks) {
- opts.supbooks = supbooks;
- if(wb.Names) for(var i = 0; i < wb.Names.length; ++i) supbooks[0][i+1] = wb.Names[i];
- }
-
- var colinfo = [], rowinfo = [];
- var seencol = false;
-
- XLSBRecordEnum[0x0010] = { n:"BrtShortReal", f:parse_BrtShortReal };
-
- recordhopper(data, function ws_parse(val, R_n, RT) {
- if(end) return;
- switch(RT) {
- case 0x0094: /* 'BrtWsDim' */
- ref = val; break;
- case 0x0000: /* 'BrtRowHdr' */
- row = val;
- if(opts.sheetRows && opts.sheetRows <= row.r) end=true;
- rr = encode_row(R = row.r);
- opts['!row'] = row.r;
- if(val.hidden || val.hpt || val.level != null) {
- if(val.hpt) val.hpx = pt2px(val.hpt);
- rowinfo[val.r] = val;
- }
- break;
-
- case 0x0002: /* 'BrtCellRk' */
- case 0x0003: /* 'BrtCellError' */
- case 0x0004: /* 'BrtCellBool' */
- case 0x0005: /* 'BrtCellReal' */
- case 0x0006: /* 'BrtCellSt' */
- case 0x0007: /* 'BrtCellIsst' */
- case 0x0008: /* 'BrtFmlaString' */
- case 0x0009: /* 'BrtFmlaNum' */
- case 0x000A: /* 'BrtFmlaBool' */
- case 0x000B: /* 'BrtFmlaError' */
- case 0x000D: /* 'BrtShortRk' */
- case 0x000E: /* 'BrtShortError' */
- case 0x000F: /* 'BrtShortBool' */
- case 0x0010: /* 'BrtShortReal' */
- case 0x0011: /* 'BrtShortSt' */
- case 0x0012: /* 'BrtShortIsst' */
- p = ({t:val[2]});
- switch(val[2]) {
- case 'n': p.v = val[1]; break;
- case 's': sstr = strs[val[1]]; p.v = sstr.t; p.r = sstr.r; break;
- case 'b': p.v = val[1] ? true : false; break;
- case 'e': p.v = val[1]; if(opts.cellText !== false) p.w = BErr[p.v]; break;
- case 'str': p.t = 's'; p.v = val[1]; break;
- }
- if((cf = styles.CellXf[val[0].iStyleRef])) safe_format(p,cf.numFmtId,null,opts, themes, styles);
- C = val[0].c == -1 ? C + 1 : val[0].c;
- if(opts.dense) { if(!s[R]) s[R] = []; s[R][C] = p; }
- else s[encode_col(C) + rr] = p;
- if(opts.cellFormula) {
- af = false;
- for(ai = 0; ai < arrayf.length; ++ai) {
- var aii = arrayf[ai];
- if(row.r >= aii[0].s.r && row.r <= aii[0].e.r)
- if(C >= aii[0].s.c && C <= aii[0].e.c) {
- p.F = encode_range(aii[0]); af = true;
- }
- }
- if(!af && val.length > 3) p.f = val[3];
- }
- if(refguess.s.r > row.r) refguess.s.r = row.r;
- if(refguess.s.c > C) refguess.s.c = C;
- if(refguess.e.r < row.r) refguess.e.r = row.r;
- if(refguess.e.c < C) refguess.e.c = C;
- if(opts.cellDates && cf && p.t == 'n' && SSF.is_date(SSF._table[cf.numFmtId])) {
- 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); }
- }
- break;
-
- case 0x0001: /* 'BrtCellBlank' */
- case 0x000C: /* 'BrtShortBlank' */
- if(!opts.sheetStubs || pass) break;
- p = ({t:'z',v:undefined});
- C = val[0].c == -1 ? C + 1 : val[0].c;
- if(opts.dense) { if(!s[R]) s[R] = []; s[R][C] = p; }
- else s[encode_col(C) + rr] = p;
- if(refguess.s.r > row.r) refguess.s.r = row.r;
- if(refguess.s.c > C) refguess.s.c = C;
- if(refguess.e.r < row.r) refguess.e.r = row.r;
- if(refguess.e.c < C) refguess.e.c = C;
- break;
-
- case 0x00B0: /* 'BrtMergeCell' */
- merges.push(val); break;
-
- case 0x01EE: /* 'BrtHLink' */
- var rel = rels['!id'][val.relId];
- if(rel) {
- val.Target = rel.Target;
- if(val.loc) val.Target += "#"+val.loc;
- val.Rel = rel;
- } else if(val.relId == '') {
- val.Target = "#" + val.loc;
- }
- for(R=val.rfx.s.r;R<=val.rfx.e.r;++R) for(C=val.rfx.s.c;C<=val.rfx.e.c;++C) {
- if(opts.dense) {
- if(!s[R]) s[R] = [];
- if(!s[R][C]) s[R][C] = {t:'z',v:undefined};
- s[R][C].l = val;
- } else {
- addr = encode_cell({c:C,r:R});
- if(!s[addr]) s[addr] = {t:'z',v:undefined};
- s[addr].l = val;
- }
- }
- break;
-
- case 0x01AA: /* 'BrtArrFmla' */
- if(!opts.cellFormula) break;
- arrayf.push(val);
- cell = ((opts.dense ? s[R][C] : s[encode_col(C) + rr]));
- cell.f = stringify_formula(val[1], refguess, {r:row.r, c:C}, supbooks, opts);
- cell.F = encode_range(val[0]);
- break;
- case 0x01AB: /* 'BrtShrFmla' */
- if(!opts.cellFormula) break;
- sharedf[encode_cell(val[0].s)] = val[1];
- cell = (opts.dense ? s[R][C] : s[encode_col(C) + rr]);
- cell.f = stringify_formula(val[1], refguess, {r:row.r, c:C}, supbooks, opts);
- break;
-
- /* identical to 'ColInfo' in XLS */
- case 0x003C: /* 'BrtColInfo' */
- if(!opts.cellStyles) break;
- while(val.e >= val.s) {
- colinfo[val.e--] = { width: val.w/256, hidden: !!(val.flags & 0x01), level: val.level };
- if(!seencol) { seencol = true; find_mdw_colw(val.w/256); }
- process_col(colinfo[val.e+1]);
- }
- break;
-
- case 0x00A1: /* 'BrtBeginAFilter' */
- s['!autofilter'] = { ref:encode_range(val) };
- break;
-
- case 0x01DC: /* 'BrtMargins' */
- s['!margins'] = val;
- break;
-
- case 0x0093: /* 'BrtWsProp' */
- if(!wb.Sheets[idx]) wb.Sheets[idx] = {};
- if(val.name) wb.Sheets[idx].CodeName = val.name;
- break;
-
- case 0x0089: /* 'BrtBeginWsView' */
- if(!wb.Views) wb.Views = [{}];
- if(!wb.Views[0]) wb.Views[0] = {};
- if(val.RTL) wb.Views[0].RTL = true;
- break;
-
- case 0x01E5: /* 'BrtWsFmtInfo' */
- break;
-
- case 0x0040: /* 'BrtDVal' */
- case 0x041D: /* 'BrtDVal14' */
- break;
-
- case 0x0097: /* 'BrtPane' */
- break;
- case 0x0098: /* 'BrtSel' */
- case 0x00AF: /* 'BrtAFilterDateGroupItem' */
- case 0x0284: /* 'BrtActiveX' */
- case 0x0271: /* 'BrtBigName' */
- case 0x0232: /* 'BrtBkHim' */
- case 0x018C: /* 'BrtBrk' */
- case 0x0458: /* 'BrtCFIcon' */
- case 0x047A: /* 'BrtCFRuleExt' */
- case 0x01D7: /* 'BrtCFVO' */
- case 0x041A: /* 'BrtCFVO14' */
- case 0x0289: /* 'BrtCellIgnoreEC' */
- case 0x0451: /* 'BrtCellIgnoreEC14' */
- case 0x0031: /* 'BrtCellMeta' */
- case 0x024D: /* 'BrtCellSmartTagProperty' */
- case 0x025F: /* 'BrtCellWatch' */
- case 0x0234: /* 'BrtColor' */
- case 0x041F: /* 'BrtColor14' */
- case 0x00A8: /* 'BrtColorFilter' */
- case 0x00AE: /* 'BrtCustomFilter' */
- case 0x049C: /* 'BrtCustomFilter14' */
- case 0x01F3: /* 'BrtDRef' */
- case 0x01FB: /* 'BrtDXF' */
- case 0x0226: /* 'BrtDrawing' */
- case 0x00AB: /* 'BrtDynamicFilter' */
- case 0x00A7: /* 'BrtFilter' */
- case 0x0499: /* 'BrtFilter14' */
- case 0x00A9: /* 'BrtIconFilter' */
- case 0x049D: /* 'BrtIconFilter14' */
- case 0x0227: /* 'BrtLegacyDrawing' */
- case 0x0228: /* 'BrtLegacyDrawingHF' */
- case 0x0295: /* 'BrtListPart' */
- case 0x027F: /* 'BrtOleObject' */
- case 0x01DE: /* 'BrtPageSetup' */
- case 0x0219: /* 'BrtPhoneticInfo' */
- case 0x01DD: /* 'BrtPrintOptions' */
- case 0x0218: /* 'BrtRangeProtection' */
- case 0x044F: /* 'BrtRangeProtection14' */
- case 0x02A8: /* 'BrtRangeProtectionIso' */
- case 0x0450: /* 'BrtRangeProtectionIso14' */
- case 0x0400: /* 'BrtRwDescent' */
- case 0x0297: /* 'BrtSheetCalcProp' */
- case 0x0217: /* 'BrtSheetProtection' */
- case 0x02A6: /* 'BrtSheetProtectionIso' */
- case 0x01F8: /* 'BrtSlc' */
- case 0x0413: /* 'BrtSparkline' */
- case 0x01AC: /* 'BrtTable' */
- case 0x00AA: /* 'BrtTop10Filter' */
- case 0x0C00: /* 'BrtUid' */
- case 0x0032: /* 'BrtValueMeta' */
- case 0x0816: /* 'BrtWebExtension' */
- case 0x0415: /* 'BrtWsFmtInfoEx14' */
- break;
-
- case 0x0023: /* 'BrtFRTBegin' */
- pass = true; break;
- case 0x0024: /* 'BrtFRTEnd' */
- pass = false; break;
- case 0x0025: /* 'BrtACBegin' */
- state.push(R_n); pass = true; break;
- case 0x0026: /* 'BrtACEnd' */
- state.pop(); pass = false; break;
-
- default:
- if((R_n||"").indexOf("Begin") > 0){/* empty */}
- else if((R_n||"").indexOf("End") > 0){/* empty */}
- else if(!pass || opts.WTF) throw new Error("Unexpected record " + RT + " " + R_n);
- }
- }, opts);
-
- delete opts.supbooks;
- delete opts['!row'];
-
- 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);
- if(opts.sheetRows && s["!ref"]) {
- var tmpref = safe_decode_range(s["!ref"]);
- if(opts.sheetRows <= +tmpref.e.r) {
- tmpref.e.r = opts.sheetRows - 1;
- if(tmpref.e.r > refguess.e.r) tmpref.e.r = refguess.e.r;
- if(tmpref.e.r < tmpref.s.r) tmpref.s.r = tmpref.e.r;
- if(tmpref.e.c > refguess.e.c) tmpref.e.c = refguess.e.c;
- if(tmpref.e.c < tmpref.s.c) tmpref.s.c = tmpref.e.c;
- s["!fullref"] = s["!ref"];
- s["!ref"] = encode_range(tmpref);
- }
- }
- if(merges.length > 0) s["!merges"] = merges;
- if(colinfo.length > 0) s["!cols"] = colinfo;
- if(rowinfo.length > 0) s["!rows"] = rowinfo;
- return s;
- }
-
- /* TODO: something useful -- this is a stub */
- function write_ws_bin_cell(ba, cell, R, C, opts, ws, last_seen) {
- if(cell.v === undefined) return false;
- var vv = "";
- switch(cell.t) {
- case 'b': vv = cell.v ? "1" : "0"; break;
- case 'd': // no BrtCellDate :(
- cell = dup(cell);
- cell.z = cell.z || SSF._table[14];
- cell.v = datenum(parseDate(cell.v)); cell.t = 'n';
- break;
- /* falls through */
- case 'n': case 'e': vv = ''+cell.v; break;
- default: vv = cell.v; break;
- }
- var o = ({r:R, c:C});
- /* TODO: cell style */
- o.s = get_cell_style(opts.cellXfs, cell, opts);
- if(cell.l) ws['!links'].push([encode_cell(o), cell.l]);
- if(cell.c) ws['!comments'].push([encode_cell(o), cell.c]);
- switch(cell.t) {
- case 's': case 'str':
- if(opts.bookSST) {
- vv = get_sst_id(opts.Strings, (cell.v), opts.revStrings);
- o.t = "s"; o.v = vv;
- if(last_seen) write_record(ba, "BrtShortIsst", write_BrtShortIsst(cell, o));
- else write_record(ba, "BrtCellIsst", write_BrtCellIsst(cell, o));
- } else {
- o.t = "str";
- if(last_seen) write_record(ba, "BrtShortSt", write_BrtShortSt(cell, o));
- else write_record(ba, "BrtCellSt", write_BrtCellSt(cell, o));
- }
- return true;
- case 'n':
- /* TODO: determine threshold for Real vs RK */
- if(cell.v == (cell.v | 0) && cell.v > -1000 && cell.v < 1000) {
- if(last_seen) write_record(ba, "BrtShortRk", write_BrtShortRk(cell, o));
- else write_record(ba, "BrtCellRk", write_BrtCellRk(cell, o));
- } else {
- if(last_seen) write_record(ba, "BrtShortReal", write_BrtShortReal(cell, o));
- else write_record(ba, "BrtCellReal", write_BrtCellReal(cell, o));
- } return true;
- case 'b':
- o.t = "b";
- if(last_seen) write_record(ba, "BrtShortBool", write_BrtShortBool(cell, o));
- else write_record(ba, "BrtCellBool", write_BrtCellBool(cell, o));
- return true;
- case 'e':
- o.t = "e";
- if(last_seen) write_record(ba, "BrtShortError", write_BrtShortError(cell, o));
- else write_record(ba, "BrtCellError", write_BrtCellError(cell, o));
- return true;
- }
- if(last_seen) write_record(ba, "BrtShortBlank", write_BrtShortBlank(cell, o));
- else write_record(ba, "BrtCellBlank", write_BrtCellBlank(cell, o));
- return true;
- }
-
- function write_CELLTABLE(ba, ws, idx, opts) {
- var range = safe_decode_range(ws['!ref'] || "A1"), ref, rr = "", cols = [];
- write_record(ba, 'BrtBeginSheetData');
- var dense = Array.isArray(ws);
- var cap = range.e.r;
- if(ws['!rows']) cap = Math.max(range.e.r, ws['!rows'].length - 1);
- for(var R = range.s.r; R <= cap; ++R) {
- rr = encode_row(R);
- /* [ACCELLTABLE] */
- /* BrtRowHdr */
- write_row_header(ba, ws, range, R);
- var last_seen = false;
- if(R <= range.e.r) for(var C = range.s.c; C <= range.e.c; ++C) {
- /* *16384CELL */
- if(R === range.s.r) cols[C] = encode_col(C);
- ref = cols[C] + rr;
- var cell = dense ? (ws[R]||[])[C] : ws[ref];
- if(!cell) { last_seen = false; continue; }
- /* write cell */
- last_seen = write_ws_bin_cell(ba, cell, R, C, opts, ws, last_seen);
- }
- }
- write_record(ba, 'BrtEndSheetData');
- }
-
- function write_MERGECELLS(ba, ws) {
- if(!ws || !ws['!merges']) return;
- write_record(ba, 'BrtBeginMergeCells', write_BrtBeginMergeCells(ws['!merges'].length));
- ws['!merges'].forEach(function(m) { write_record(ba, 'BrtMergeCell', write_BrtMergeCell(m)); });
- write_record(ba, 'BrtEndMergeCells');
- }
-
- function write_COLINFOS(ba, ws) {
- if(!ws || !ws['!cols']) return;
- write_record(ba, 'BrtBeginColInfos');
- ws['!cols'].forEach(function(m, i) { if(m) write_record(ba, 'BrtColInfo', write_BrtColInfo(i, m)); });
- write_record(ba, 'BrtEndColInfos');
- }
-
- function write_IGNOREECS(ba, ws) {
- if(!ws || !ws['!ref']) return;
- write_record(ba, 'BrtBeginCellIgnoreECs');
- write_record(ba, 'BrtCellIgnoreEC', write_BrtCellIgnoreEC(safe_decode_range(ws['!ref'])));
- write_record(ba, 'BrtEndCellIgnoreECs');
- }
-
- function write_HLINKS(ba, ws, rels) {
- /* *BrtHLink */
- ws['!links'].forEach(function(l) {
- if(!l[1].Target) return;
- var rId = add_rels(rels, -1, l[1].Target.replace(/#.*$/, ""), RELS.HLINK);
- write_record(ba, "BrtHLink", write_BrtHLink(l, rId));
- });
- delete ws['!links'];
- }
- function write_LEGACYDRAWING(ba, ws, idx, rels) {
- /* [BrtLegacyDrawing] */
- if(ws['!comments'].length > 0) {
- var rId = add_rels(rels, -1, "../drawings/vmlDrawing" + (idx+1) + ".vml", RELS.VML);
- write_record(ba, "BrtLegacyDrawing", write_RelID("rId" + rId));
- ws['!legacy'] = rId;
- }
- }
-
- function write_AUTOFILTER(ba, ws, wb, idx) {
- if(!ws['!autofilter']) return;
- var data = ws['!autofilter'];
- var ref = typeof data.ref === "string" ? data.ref : encode_range(data.ref);
-
- /* Update FilterDatabase defined name for the worksheet */
- if(!wb.Workbook) wb.Workbook = ({Sheets:[]});
- if(!wb.Workbook.Names) wb.Workbook.Names = [];
- var names = wb.Workbook.Names;
- var range = decode_range(ref);
- if(range.s.r == range.e.r) { range.e.r = decode_range(ws["!ref"]).e.r; ref = encode_range(range); }
- for(var i = 0; i < names.length; ++i) {
- var name = names[i];
- if(name.Name != '_xlnm._FilterDatabase') continue;
- if(name.Sheet != idx) continue;
- name.Ref = "'" + wb.SheetNames[idx] + "'!" + ref; break;
- }
- if(i == names.length) names.push({ Name: '_xlnm._FilterDatabase', Sheet: idx, Ref: "'" + wb.SheetNames[idx] + "'!" + ref });
-
- write_record(ba, "BrtBeginAFilter", write_UncheckedRfX(safe_decode_range(ref)));
- /* *FILTERCOLUMN */
- /* [SORTSTATE] */
- /* BrtEndAFilter */
- write_record(ba, "BrtEndAFilter");
- }
-
- function write_WSVIEWS2(ba, ws, Workbook) {
- write_record(ba, "BrtBeginWsViews");
- { /* 1*WSVIEW2 */
- /* [ACUID] */
- write_record(ba, "BrtBeginWsView", write_BrtBeginWsView(ws, Workbook));
- /* [BrtPane] */
- /* *4BrtSel */
- /* *4SXSELECT */
- /* *FRT */
- write_record(ba, "BrtEndWsView");
- }
- /* *FRT */
- write_record(ba, "BrtEndWsViews");
- }
-
- function write_WSFMTINFO() {
- /* [ACWSFMTINFO] */
- //write_record(ba, "BrtWsFmtInfo", write_BrtWsFmtInfo(ws));
- }
-
- function write_SHEETPROTECT(ba, ws) {
- if(!ws['!protect']) return;
- /* [BrtSheetProtectionIso] */
- write_record(ba, "BrtSheetProtection", write_BrtSheetProtection(ws['!protect']));
- }
-
- function write_ws_bin(idx, opts, wb, rels) {
- var ba = buf_array();
- var s = wb.SheetNames[idx], ws = wb.Sheets[s] || {};
- var c = s; try { if(wb && wb.Workbook) c = wb.Workbook.Sheets[idx].CodeName || c; } catch(e) {}
- var r = safe_decode_range(ws['!ref'] || "A1");
- if(r.e.c > 0x3FFF || r.e.r > 0xFFFFF) {
- if(opts.WTF) throw new Error("Range " + (ws['!ref'] || "A1") + " exceeds format limit A1:XFD1048576");
- r.e.c = Math.min(r.e.c, 0x3FFF);
- r.e.r = Math.min(r.e.c, 0xFFFFF);
- }
- ws['!links'] = [];
- /* passed back to write_zip and removed there */
- ws['!comments'] = [];
- write_record(ba, "BrtBeginSheet");
- if(wb.vbaraw) write_record(ba, "BrtWsProp", write_BrtWsProp(c));
- write_record(ba, "BrtWsDim", write_BrtWsDim(r));
- write_WSVIEWS2(ba, ws, wb.Workbook);
- write_WSFMTINFO(ba, ws);
- write_COLINFOS(ba, ws, idx, opts, wb);
- write_CELLTABLE(ba, ws, idx, opts, wb);
- /* [BrtSheetCalcProp] */
- write_SHEETPROTECT(ba, ws);
- /* *([BrtRangeProtectionIso] BrtRangeProtection) */
- /* [SCENMAN] */
- write_AUTOFILTER(ba, ws, wb, idx);
- /* [SORTSTATE] */
- /* [DCON] */
- /* [USERSHVIEWS] */
- write_MERGECELLS(ba, ws);
- /* [BrtPhoneticInfo] */
- /* *CONDITIONALFORMATTING */
- /* [DVALS] */
- write_HLINKS(ba, ws, rels);
- /* [BrtPrintOptions] */
- if(ws['!margins']) write_record(ba, "BrtMargins", write_BrtMargins(ws['!margins']));
- /* [BrtPageSetup] */
- /* [HEADERFOOTER] */
- /* [RWBRK] */
- /* [COLBRK] */
- /* *BrtBigName */
- /* [CELLWATCHES] */
- if(!opts || opts.ignoreEC || (opts.ignoreEC == (void 0))) write_IGNOREECS(ba, ws);
- /* [SMARTTAGS] */
- /* [BrtDrawing] */
- write_LEGACYDRAWING(ba, ws, idx, rels);
- /* [BrtLegacyDrawingHF] */
- /* [BrtBkHim] */
- /* [OLEOBJECTS] */
- /* [ACTIVEXCONTROLS] */
- /* [WEBPUBITEMS] */
- /* [LISTPARTS] */
- /* FRTWORKSHEET */
- write_record(ba, "BrtEndSheet");
- return ba.end();
- }
- RELS.CHART = "http://schemas.openxmlformats.org/officeDocument/2006/relationships/chart";
- RELS.CHARTEX = "http://schemas.microsoft.com/office/2014/relationships/chartEx";
-
- function parse_Cache(data) {
- var col = [];
- var num = data.match(/^<c:numCache>/);
- var f;
-
- /* 21.2.2.150 pt CT_NumVal */
- (data.match(/<c:pt idx="(\d*)">(.*?)<\/c:pt>/mg)||[]).forEach(function(pt) {
- var q = pt.match(/<c:pt idx="(\d*?)"><c:v>(.*)<\/c:v><\/c:pt>/);
- if(!q) return;
- col[+q[1]] = num ? +q[2] : q[2];
- });
-
- /* 21.2.2.71 formatCode CT_Xstring */
- var nf = unescapexml((data.match(/<c:formatCode>([\s\S]*?)<\/c:formatCode>/) || ["","General"])[1]);
-
- (data.match(/<c:f>(.*?)<\/c:f>/mg)||[]).forEach(function(F) { f = F.replace(/<.*?>/g,""); });
-
- return [col, nf, f];
- }
-
- /* 21.2 DrawingML - Charts */
- function parse_chart(data, name, opts, rels, wb, csheet) {
- var cs = ((csheet || {"!type":"chart"}));
- if(!data) return csheet;
- /* 21.2.2.27 chart CT_Chart */
-
- var C = 0, R = 0, col = "A";
- var refguess = {s: {r:2000000, c:2000000}, e: {r:0, c:0} };
-
- /* 21.2.2.120 numCache CT_NumData */
- (data.match(/<c:numCache>[\s\S]*?<\/c:numCache>/gm)||[]).forEach(function(nc) {
- var cache = parse_Cache(nc);
- refguess.s.r = refguess.s.c = 0;
- refguess.e.c = C;
- col = encode_col(C);
- cache[0].forEach(function(n,i) {
- cs[col + encode_row(i)] = {t:'n', v:n, z:cache[1] };
- R = i;
- });
- if(refguess.e.r < R) refguess.e.r = R;
- ++C;
- });
- if(C > 0) cs["!ref"] = encode_range(refguess);
- return cs;
- }
- RELS.CS = "http://schemas.openxmlformats.org/officeDocument/2006/relationships/chartsheet";
-
- var CS_XML_ROOT = writextag('chartsheet', null, {
- 'xmlns': XMLNS.main[0],
- 'xmlns:r': XMLNS.r
- });
-
- /* 18.3 Worksheets also covers Chartsheets */
- function parse_cs_xml(data, opts, idx, rels, wb) {
- if(!data) return data;
- /* 18.3.1.12 chartsheet CT_ChartSheet */
- if(!rels) rels = {'!id':{}};
- var s = ({'!type':"chart", '!drawel':null, '!rel':""});
- var m;
-
- /* 18.3.1.83 sheetPr CT_ChartsheetPr */
- var sheetPr = data.match(sheetprregex);
- if(sheetPr) parse_ws_xml_sheetpr(sheetPr[0], s, wb, idx);
-
- /* 18.3.1.36 drawing CT_Drawing */
- if((m = data.match(/drawing r:id="(.*?)"/))) s['!rel'] = m[1];
-
- if(rels['!id'][s['!rel']]) s['!drawel'] = rels['!id'][s['!rel']];
- return s;
- }
- function write_cs_xml(idx, opts, wb, rels) {
- var o = [XML_HEADER, CS_XML_ROOT];
- o[o.length] = writextag("drawing", null, {"r:id": "rId1"});
- add_rels(rels, -1, "../drawings/drawing" + (idx+1) + ".xml", RELS.DRAW);
- if(o.length>2) { o[o.length] = ('</chartsheet>'); o[1]=o[1].replace("/>",">"); }
- return o.join("");
- }
-
- /* [MS-XLSB] 2.4.331 BrtCsProp */
- function parse_BrtCsProp(data, length) {
- data.l += 10;
- var name = parse_XLWideString(data, length - 10);
- return { name: name };
- }
-
- /* [MS-XLSB] 2.1.7.7 Chart Sheet */
- function parse_cs_bin(data, opts, idx, rels, wb) {
- if(!data) return data;
- if(!rels) rels = {'!id':{}};
- var s = {'!type':"chart", '!drawel':null, '!rel':""};
- var state = [];
- var pass = false;
- recordhopper(data, function cs_parse(val, R_n, RT) {
- switch(RT) {
-
- case 0x0226: /* 'BrtDrawing' */
- s['!rel'] = val; break;
-
- case 0x028B: /* 'BrtCsProp' */
- if(!wb.Sheets[idx]) wb.Sheets[idx] = {};
- if(val.name) wb.Sheets[idx].CodeName = val.name;
- break;
-
- case 0x0232: /* 'BrtBkHim' */
- case 0x028C: /* 'BrtCsPageSetup' */
- case 0x029D: /* 'BrtCsProtection' */
- case 0x02A7: /* 'BrtCsProtectionIso' */
- case 0x0227: /* 'BrtLegacyDrawing' */
- case 0x0228: /* 'BrtLegacyDrawingHF' */
- case 0x01DC: /* 'BrtMargins' */
- case 0x0C00: /* 'BrtUid' */
- break;
-
- case 0x0023: /* 'BrtFRTBegin' */
- pass = true; break;
- case 0x0024: /* 'BrtFRTEnd' */
- pass = false; break;
- case 0x0025: /* 'BrtACBegin' */
- state.push(R_n); break;
- case 0x0026: /* 'BrtACEnd' */
- state.pop(); break;
-
- default:
- if((R_n||"").indexOf("Begin") > 0) state.push(R_n);
- else if((R_n||"").indexOf("End") > 0) state.pop();
- else if(!pass || opts.WTF) throw new Error("Unexpected record " + RT + " " + R_n);
- }
- }, opts);
-
- if(rels['!id'][s['!rel']]) s['!drawel'] = rels['!id'][s['!rel']];
- return s;
- }
- function write_cs_bin() {
- var ba = buf_array();
- write_record(ba, "BrtBeginSheet");
- /* [BrtCsProp] */
- /* CSVIEWS */
- /* [[BrtCsProtectionIso] BrtCsProtection] */
- /* [USERCSVIEWS] */
- /* [BrtMargins] */
- /* [BrtCsPageSetup] */
- /* [HEADERFOOTER] */
- /* BrtDrawing */
- /* [BrtLegacyDrawing] */
- /* [BrtLegacyDrawingHF] */
- /* [BrtBkHim] */
- /* [WEBPUBITEMS] */
- /* FRTCHARTSHEET */
- write_record(ba, "BrtEndSheet");
- return ba.end();
- }
- /* 18.2.28 (CT_WorkbookProtection) Defaults */
- var WBPropsDef = [
- ['allowRefreshQuery', false, "bool"],
- ['autoCompressPictures', true, "bool"],
- ['backupFile', false, "bool"],
- ['checkCompatibility', false, "bool"],
- ['CodeName', ''],
- ['date1904', false, "bool"],
- ['defaultThemeVersion', 0, "int"],
- ['filterPrivacy', false, "bool"],
- ['hidePivotFieldList', false, "bool"],
- ['promptedSolutions', false, "bool"],
- ['publishItems', false, "bool"],
- ['refreshAllConnections', false, "bool"],
- ['saveExternalLinkValues', true, "bool"],
- ['showBorderUnselectedTables', true, "bool"],
- ['showInkAnnotation', true, "bool"],
- ['showObjects', 'all'],
- ['showPivotChartFilter', false, "bool"],
- ['updateLinks', 'userSet']
- ];
-
- /* 18.2.30 (CT_BookView) Defaults */
- var WBViewDef = [
- ['activeTab', 0, "int"],
- ['autoFilterDateGrouping', true, "bool"],
- ['firstSheet', 0, "int"],
- ['minimized', false, "bool"],
- ['showHorizontalScroll', true, "bool"],
- ['showSheetTabs', true, "bool"],
- ['showVerticalScroll', true, "bool"],
- ['tabRatio', 600, "int"],
- ['visibility', 'visible']
- //window{Height,Width}, {x,y}Window
- ];
-
- /* 18.2.19 (CT_Sheet) Defaults */
- var SheetDef = [
- //['state', 'visible']
- ];
-
- /* 18.2.2 (CT_CalcPr) Defaults */
- var CalcPrDef = [
- ['calcCompleted', 'true'],
- ['calcMode', 'auto'],
- ['calcOnSave', 'true'],
- ['concurrentCalc', 'true'],
- ['fullCalcOnLoad', 'false'],
- ['fullPrecision', 'true'],
- ['iterate', 'false'],
- ['iterateCount', '100'],
- ['iterateDelta', '0.001'],
- ['refMode', 'A1']
- ];
-
- /* 18.2.3 (CT_CustomWorkbookView) Defaults */
- /*var CustomWBViewDef = [
- ['autoUpdate', 'false'],
- ['changesSavedWin', 'false'],
- ['includeHiddenRowCol', 'true'],
- ['includePrintSettings', 'true'],
- ['maximized', 'false'],
- ['minimized', 'false'],
- ['onlySync', 'false'],
- ['personalView', 'false'],
- ['showComments', 'commIndicator'],
- ['showFormulaBar', 'true'],
- ['showHorizontalScroll', 'true'],
- ['showObjects', 'all'],
- ['showSheetTabs', 'true'],
- ['showStatusbar', 'true'],
- ['showVerticalScroll', 'true'],
- ['tabRatio', '600'],
- ['xWindow', '0'],
- ['yWindow', '0']
- ];*/
-
- function push_defaults_array(target, defaults) {
- for(var j = 0; j != target.length; ++j) { var w = target[j];
- for(var i=0; i != defaults.length; ++i) { var z = defaults[i];
- if(w[z[0]] == null) w[z[0]] = z[1];
- else switch(z[2]) {
- case "bool": if(typeof w[z[0]] == "string") w[z[0]] = parsexmlbool(w[z[0]]); break;
- case "int": if(typeof w[z[0]] == "string") w[z[0]] = parseInt(w[z[0]], 10); break;
- }
- }
- }
- }
- function push_defaults(target, defaults) {
- for(var i = 0; i != defaults.length; ++i) { var z = defaults[i];
- if(target[z[0]] == null) target[z[0]] = z[1];
- else switch(z[2]) {
- case "bool": if(typeof target[z[0]] == "string") target[z[0]] = parsexmlbool(target[z[0]]); break;
- case "int": if(typeof target[z[0]] == "string") target[z[0]] = parseInt(target[z[0]], 10); break;
- }
- }
- }
-
- function parse_wb_defaults(wb) {
- push_defaults(wb.WBProps, WBPropsDef);
- push_defaults(wb.CalcPr, CalcPrDef);
-
- push_defaults_array(wb.WBView, WBViewDef);
- push_defaults_array(wb.Sheets, SheetDef);
-
- _ssfopts.date1904 = parsexmlbool(wb.WBProps.date1904);
- }
-
- function safe1904(wb) {
- /* TODO: store date1904 somewhere else */
- if(!wb.Workbook) return "false";
- if(!wb.Workbook.WBProps) return "false";
- return parsexmlbool(wb.Workbook.WBProps.date1904) ? "true" : "false";
- }
-
- var badchars = "][*?\/\\".split("");
- function check_ws_name(n, safe) {
- if(n.length > 31) { if(safe) return false; throw new Error("Sheet names cannot exceed 31 chars"); }
- var _good = true;
- badchars.forEach(function(c) {
- if(n.indexOf(c) == -1) return;
- if(!safe) throw new Error("Sheet name cannot contain : \\ / ? * [ ]");
- _good = false;
- });
- return _good;
- }
- function check_wb_names(N, S, codes) {
- N.forEach(function(n,i) {
- check_ws_name(n);
- for(var j = 0; j < i; ++j) if(n == N[j]) throw new Error("Duplicate Sheet Name: " + n);
- if(codes) {
- var cn = (S && S[i] && S[i].CodeName) || n;
- if(cn.charCodeAt(0) == 95 && cn.length > 22) throw new Error("Bad Code Name: Worksheet" + cn);
- }
- });
- }
- function check_wb(wb) {
- if(!wb || !wb.SheetNames || !wb.Sheets) throw new Error("Invalid Workbook");
- if(!wb.SheetNames.length) throw new Error("Workbook is empty");
- var Sheets = (wb.Workbook && wb.Workbook.Sheets) || [];
- check_wb_names(wb.SheetNames, Sheets, !!wb.vbaraw);
- for(var i = 0; i < wb.SheetNames.length; ++i) check_ws(wb.Sheets[wb.SheetNames[i]], wb.SheetNames[i], i);
- /* TODO: validate workbook */
- }
- /* 18.2 Workbook */
- var wbnsregex = /<\w+:workbook/;
- function parse_wb_xml(data, opts) {
- if(!data) throw new Error("Could not find file");
- var wb = { AppVersion:{}, WBProps:{}, WBView:[], Sheets:[], CalcPr:{}, Names:[], xmlns: "" };
- var pass = false, xmlns = "xmlns";
- var dname = {}, dnstart = 0;
- data.replace(tagregex, function xml_wb(x, idx) {
- var y = parsexmltag(x);
- switch(strip_ns(y[0])) {
- case '<?xml': break;
-
- /* 18.2.27 workbook CT_Workbook 1 */
- case '<workbook':
- if(x.match(wbnsregex)) xmlns = "xmlns" + x.match(/<(\w+):/)[1];
- wb.xmlns = y[xmlns];
- break;
- case '</workbook>': break;
-
- /* 18.2.13 fileVersion CT_FileVersion ? */
- case '<fileVersion': delete y[0]; wb.AppVersion = y; break;
- case '<fileVersion/>': case '</fileVersion>': break;
-
- /* 18.2.12 fileSharing CT_FileSharing ? */
- case '<fileSharing':
- break;
- case '<fileSharing/>': break;
-
- /* 18.2.28 workbookPr CT_WorkbookPr ? */
- case '<workbookPr':
- case '<workbookPr/>':
- WBPropsDef.forEach(function(w) {
- if(y[w[0]] == null) return;
- switch(w[2]) {
- case "bool": wb.WBProps[w[0]] = parsexmlbool(y[w[0]]); break;
- case "int": wb.WBProps[w[0]] = parseInt(y[w[0]], 10); break;
- default: wb.WBProps[w[0]] = y[w[0]];
- }
- });
- if(y.codeName) wb.WBProps.CodeName = utf8read(y.codeName);
- break;
- case '</workbookPr>': break;
-
- /* 18.2.29 workbookProtection CT_WorkbookProtection ? */
- case '<workbookProtection':
- break;
- case '<workbookProtection/>': break;
-
- /* 18.2.1 bookViews CT_BookViews ? */
- case '<bookViews': case '<bookViews>': case '</bookViews>': break;
- /* 18.2.30 workbookView CT_BookView + */
- case '<workbookView': case '<workbookView/>': delete y[0]; wb.WBView.push(y); break;
- case '</workbookView>': break;
-
- /* 18.2.20 sheets CT_Sheets 1 */
- case '<sheets': case '<sheets>': case '</sheets>': break; // aggregate sheet
- /* 18.2.19 sheet CT_Sheet + */
- case '<sheet':
- switch(y.state) {
- case "hidden": y.Hidden = 1; break;
- case "veryHidden": y.Hidden = 2; break;
- default: y.Hidden = 0;
- }
- delete y.state;
- y.name = unescapexml(utf8read(y.name));
- delete y[0]; wb.Sheets.push(y); break;
- case '</sheet>': break;
-
- /* 18.2.15 functionGroups CT_FunctionGroups ? */
- case '<functionGroups': case '<functionGroups/>': break;
- /* 18.2.14 functionGroup CT_FunctionGroup + */
- case '<functionGroup': break;
-
- /* 18.2.9 externalReferences CT_ExternalReferences ? */
- case '<externalReferences': case '</externalReferences>': case '<externalReferences>': break;
- /* 18.2.8 externalReference CT_ExternalReference + */
- case '<externalReference': break;
-
- /* 18.2.6 definedNames CT_DefinedNames ? */
- case '<definedNames/>': break;
- case '<definedNames>': case '<definedNames': pass=true; break;
- case '</definedNames>': pass=false; break;
- /* 18.2.5 definedName CT_DefinedName + */
- case '<definedName': {
- dname = {};
- dname.Name = utf8read(y.name);
- if(y.comment) dname.Comment = y.comment;
- if(y.localSheetId) dname.Sheet = +y.localSheetId;
- if(parsexmlbool(y.hidden||"0")) dname.Hidden = true;
- dnstart = idx + x.length;
- } break;
- case '</definedName>': {
- dname.Ref = unescapexml(utf8read(data.slice(dnstart, idx)));
- wb.Names.push(dname);
- } break;
- case '<definedName/>': break;
-
- /* 18.2.2 calcPr CT_CalcPr ? */
- case '<calcPr': delete y[0]; wb.CalcPr = y; break;
- case '<calcPr/>': delete y[0]; wb.CalcPr = y; break;
- case '</calcPr>': break;
-
- /* 18.2.16 oleSize CT_OleSize ? (ref required) */
- case '<oleSize': break;
-
- /* 18.2.4 customWorkbookViews CT_CustomWorkbookViews ? */
- case '<customWorkbookViews>': case '</customWorkbookViews>': case '<customWorkbookViews': break;
- /* 18.2.3 customWorkbookView CT_CustomWorkbookView + */
- case '<customWorkbookView': case '</customWorkbookView>': break;
-
- /* 18.2.18 pivotCaches CT_PivotCaches ? */
- case '<pivotCaches>': case '</pivotCaches>': case '<pivotCaches': break;
- /* 18.2.17 pivotCache CT_PivotCache ? */
- case '<pivotCache': break;
-
- /* 18.2.21 smartTagPr CT_SmartTagPr ? */
- case '<smartTagPr': case '<smartTagPr/>': break;
-
- /* 18.2.23 smartTagTypes CT_SmartTagTypes ? */
- case '<smartTagTypes': case '<smartTagTypes>': case '</smartTagTypes>': break;
- /* 18.2.22 smartTagType CT_SmartTagType ? */
- case '<smartTagType': break;
-
- /* 18.2.24 webPublishing CT_WebPublishing ? */
- case '<webPublishing': case '<webPublishing/>': break;
-
- /* 18.2.11 fileRecoveryPr CT_FileRecoveryPr ? */
- case '<fileRecoveryPr': case '<fileRecoveryPr/>': break;
-
- /* 18.2.26 webPublishObjects CT_WebPublishObjects ? */
- case '<webPublishObjects>': case '<webPublishObjects': case '</webPublishObjects>': break;
- /* 18.2.25 webPublishObject CT_WebPublishObject ? */
- case '<webPublishObject': break;
-
- /* 18.2.10 extLst CT_ExtensionList ? */
- case '<extLst': case '<extLst>': case '</extLst>': case '<extLst/>': break;
- /* 18.2.7 ext CT_Extension + */
- case '<ext': pass=true; break; //TODO: check with versions of excel
- case '</ext>': pass=false; break;
-
- /* Others */
- case '<ArchID': break;
- case '<AlternateContent':
- case '<AlternateContent>': pass=true; break;
- case '</AlternateContent>': pass=false; break;
-
- /* TODO */
- case '<revisionPtr': break;
-
- default: if(!pass && opts.WTF) throw new Error('unrecognized ' + y[0] + ' in workbook');
- }
- return x;
- });
- if(XMLNS.main.indexOf(wb.xmlns) === -1) throw new Error("Unknown Namespace: " + wb.xmlns);
-
- parse_wb_defaults(wb);
-
- return wb;
- }
-
- var WB_XML_ROOT = writextag('workbook', null, {
- 'xmlns': XMLNS.main[0],
- //'xmlns:mx': XMLNS.mx,
- //'xmlns:s': XMLNS.main[0],
- 'xmlns:r': XMLNS.r
- });
-
- function write_wb_xml(wb) {
- var o = [XML_HEADER];
- o[o.length] = WB_XML_ROOT;
-
- var write_names = (wb.Workbook && (wb.Workbook.Names||[]).length > 0);
-
- /* fileVersion */
- /* fileSharing */
-
- var workbookPr = ({codeName:"ThisWorkbook"});
- if(wb.Workbook && wb.Workbook.WBProps) {
- WBPropsDef.forEach(function(x) {
- if((wb.Workbook.WBProps[x[0]]) == null) return;
- if((wb.Workbook.WBProps[x[0]]) == x[1]) return;
- workbookPr[x[0]] = (wb.Workbook.WBProps[x[0]]);
- });
- if(wb.Workbook.WBProps.CodeName) { workbookPr.codeName = wb.Workbook.WBProps.CodeName; delete workbookPr.CodeName; }
- }
- o[o.length] = (writextag('workbookPr', null, workbookPr));
-
- /* workbookProtection */
-
- var sheets = wb.Workbook && wb.Workbook.Sheets || [];
- var i = 0;
-
- /* bookViews only written if first worksheet is hidden */
- if(sheets && sheets[0] && !!sheets[0].Hidden) {
- o[o.length] = "<bookViews>";
- for(i = 0; i != wb.SheetNames.length; ++i) {
- if(!sheets[i]) break;
- if(!sheets[i].Hidden) break;
- }
- if(i == wb.SheetNames.length) i = 0;
- o[o.length] = '<workbookView firstSheet="' + i + '" activeTab="' + i + '"/>';
- o[o.length] = "</bookViews>";
- }
-
- o[o.length] = "<sheets>";
- for(i = 0; i != wb.SheetNames.length; ++i) {
- var sht = ({name:escapexml(wb.SheetNames[i].slice(0,31))});
- sht.sheetId = ""+(i+1);
- sht["r:id"] = "rId"+(i+1);
- if(sheets[i]) switch(sheets[i].Hidden) {
- case 1: sht.state = "hidden"; break;
- case 2: sht.state = "veryHidden"; break;
- }
- o[o.length] = (writextag('sheet',null,sht));
- }
- o[o.length] = "</sheets>";
-
- /* functionGroups */
- /* externalReferences */
-
- if(write_names) {
- o[o.length] = "<definedNames>";
- if(wb.Workbook && wb.Workbook.Names) wb.Workbook.Names.forEach(function(n) {
- var d = {name:n.Name};
- if(n.Comment) d.comment = n.Comment;
- if(n.Sheet != null) d.localSheetId = ""+n.Sheet;
- if(n.Hidden) d.hidden = "1";
- if(!n.Ref) return;
- o[o.length] = writextag('definedName', escapexml(n.Ref), d);
- });
- o[o.length] = "</definedNames>";
- }
-
- /* calcPr */
- /* oleSize */
- /* customWorkbookViews */
- /* pivotCaches */
- /* smartTagPr */
- /* smartTagTypes */
- /* webPublishing */
- /* fileRecoveryPr */
- /* webPublishObjects */
- /* extLst */
-
- if(o.length>2){ o[o.length] = '</workbook>'; o[1]=o[1].replace("/>",">"); }
- return o.join("");
- }
- /* [MS-XLSB] 2.4.304 BrtBundleSh */
- function parse_BrtBundleSh(data, length) {
- var z = {};
- z.Hidden = data.read_shift(4); //hsState ST_SheetState
- z.iTabID = data.read_shift(4);
- z.strRelID = parse_RelID(data,length-8);
- z.name = parse_XLWideString(data);
- return z;
- }
- function write_BrtBundleSh(data, o) {
- if(!o) o = new_buf(127);
- o.write_shift(4, data.Hidden);
- o.write_shift(4, data.iTabID);
- write_RelID(data.strRelID, o);
- write_XLWideString(data.name.slice(0,31), o);
- return o.length > o.l ? o.slice(0, o.l) : o;
- }
-
- /* [MS-XLSB] 2.4.815 BrtWbProp */
- function parse_BrtWbProp(data, length) {
- var o = ({});
- var flags = data.read_shift(4);
- o.defaultThemeVersion = data.read_shift(4);
- var strName = (length > 8) ? parse_XLWideString(data) : "";
- if(strName.length > 0) o.CodeName = strName;
- o.autoCompressPictures = !!(flags & 0x10000);
- o.backupFile = !!(flags & 0x40);
- o.checkCompatibility = !!(flags & 0x1000);
- o.date1904 = !!(flags & 0x01);
- o.filterPrivacy = !!(flags & 0x08);
- o.hidePivotFieldList = !!(flags & 0x400);
- o.promptedSolutions = !!(flags & 0x10);
- o.publishItems = !!(flags & 0x800);
- o.refreshAllConnections = !!(flags & 0x40000);
- o.saveExternalLinkValues = !!(flags & 0x80);
- o.showBorderUnselectedTables = !!(flags & 0x04);
- o.showInkAnnotation = !!(flags & 0x20);
- o.showObjects = ["all", "placeholders", "none"][(flags >> 13) & 0x03];
- o.showPivotChartFilter = !!(flags & 0x8000);
- o.updateLinks = ["userSet", "never", "always"][(flags >> 8) & 0x03];
- return o;
- }
- function write_BrtWbProp(data, o) {
- if(!o) o = new_buf(72);
- var flags = 0;
- if(data) {
- /* TODO: mirror parse_BrtWbProp fields */
- if(data.filterPrivacy) flags |= 0x08;
- }
- o.write_shift(4, flags);
- o.write_shift(4, 0);
- write_XLSBCodeName(data && data.CodeName || "ThisWorkbook", o);
- return o.slice(0, o.l);
- }
-
- function parse_BrtFRTArchID$(data, length) {
- var o = {};
- data.read_shift(4);
- o.ArchID = data.read_shift(4);
- data.l += length - 8;
- return o;
- }
-
- /* [MS-XLSB] 2.4.687 BrtName */
- function parse_BrtName(data, length, opts) {
- var end = data.l + length;
- data.l += 4; //var flags = data.read_shift(4);
- data.l += 1; //var chKey = data.read_shift(1);
- var itab = data.read_shift(4);
- var name = parse_XLNameWideString(data);
- var formula = parse_XLSBNameParsedFormula(data, 0, opts);
- var comment = parse_XLNullableWideString(data);
- //if(0 /* fProc */) {
- // unusedstring1: XLNullableWideString
- // description: XLNullableWideString
- // helpTopic: XLNullableWideString
- // unusedstring2: XLNullableWideString
- //}
- data.l = end;
- var out = ({Name:name, Ptg:formula});
- if(itab < 0xFFFFFFF) out.Sheet = itab;
- if(comment) out.Comment = comment;
- return out;
- }
-
- /* [MS-XLSB] 2.1.7.61 Workbook */
- function parse_wb_bin(data, opts) {
- var wb = { AppVersion:{}, WBProps:{}, WBView:[], Sheets:[], CalcPr:{}, xmlns: "" };
- var state = [];
- var pass = false;
-
- if(!opts) opts = {};
- opts.biff = 12;
-
- var Names = [];
- var supbooks = ([[]]);
- supbooks.SheetNames = [];
- supbooks.XTI = [];
-
- XLSBRecordEnum[0x0010] = { n:"BrtFRTArchID$", f:parse_BrtFRTArchID$ };
-
- recordhopper(data, function hopper_wb(val, R_n, RT) {
- switch(RT) {
- case 0x009C: /* 'BrtBundleSh' */
- supbooks.SheetNames.push(val.name);
- wb.Sheets.push(val); break;
-
- case 0x0099: /* 'BrtWbProp' */
- wb.WBProps = val; break;
-
- case 0x0027: /* 'BrtName' */
- if(val.Sheet != null) opts.SID = val.Sheet;
- val.Ref = stringify_formula(val.Ptg, null, null, supbooks, opts);
- delete opts.SID;
- delete val.Ptg;
- Names.push(val);
- break;
- case 0x040C: /* 'BrtNameExt' */ break;
-
- case 0x0165: /* 'BrtSupSelf' */
- case 0x0166: /* 'BrtSupSame' */
- case 0x0163: /* 'BrtSupBookSrc' */
- case 0x029B: /* 'BrtSupAddin' */
- if(!supbooks[0].length) supbooks[0] = [RT, val];
- else supbooks.push([RT, val]);
- supbooks[supbooks.length - 1].XTI = [];
- break;
- case 0x016A: /* 'BrtExternSheet' */
- if(supbooks.length === 0) { supbooks[0] = []; supbooks[0].XTI = []; }
- supbooks[supbooks.length - 1].XTI = supbooks[supbooks.length - 1].XTI.concat(val);
- supbooks.XTI = supbooks.XTI.concat(val);
- break;
- case 0x0169: /* 'BrtPlaceholderName' */
- break;
-
- case 0x0817: /* 'BrtAbsPath15' */
- case 0x009E: /* 'BrtBookView' */
- case 0x008F: /* 'BrtBeginBundleShs' */
- case 0x0298: /* 'BrtBeginFnGroup' */
- case 0x0161: /* 'BrtBeginExternals' */
- break;
-
- /* case 'BrtModelTimeGroupingCalcCol' */
- case 0x0C00: /* 'BrtUid' */
- case 0x0C01: /* 'BrtRevisionPtr' */
- case 0x0216: /* 'BrtBookProtection' */
- case 0x02A5: /* 'BrtBookProtectionIso' */
- case 0x009D: /* 'BrtCalcProp' */
- case 0x0262: /* 'BrtCrashRecErr' */
- case 0x0802: /* 'BrtDecoupledPivotCacheID' */
- case 0x009B: /* 'BrtFileRecover' */
- case 0x0224: /* 'BrtFileSharing' */
- case 0x02A4: /* 'BrtFileSharingIso' */
- case 0x0080: /* 'BrtFileVersion' */
- case 0x0299: /* 'BrtFnGroup' */
- case 0x0850: /* 'BrtModelRelationship' */
- case 0x084D: /* 'BrtModelTable' */
- case 0x0225: /* 'BrtOleSize' */
- case 0x0805: /* 'BrtPivotTableRef' */
- case 0x0254: /* 'BrtSmartTagType' */
- case 0x081C: /* 'BrtTableSlicerCacheID' */
- case 0x081B: /* 'BrtTableSlicerCacheIDs' */
- case 0x0822: /* 'BrtTimelineCachePivotCacheID' */
- case 0x018D: /* 'BrtUserBookView' */
- case 0x009A: /* 'BrtWbFactoid' */
- case 0x045D: /* 'BrtWbProp14' */
- case 0x0229: /* 'BrtWebOpt' */
- case 0x082B: /* 'BrtWorkBookPr15' */
- break;
-
- case 0x0023: /* 'BrtFRTBegin' */
- state.push(R_n); pass = true; break;
- case 0x0024: /* 'BrtFRTEnd' */
- state.pop(); pass = false; break;
- case 0x0025: /* 'BrtACBegin' */
- state.push(R_n); pass = true; break;
- case 0x0026: /* 'BrtACEnd' */
- state.pop(); pass = false; break;
-
- case 0x0010: /* 'BrtFRTArchID$' */ break;
-
- default:
- if((R_n||"").indexOf("Begin") > 0){/* empty */}
- else if((R_n||"").indexOf("End") > 0){/* empty */}
- else if(!pass || (opts.WTF && state[state.length-1] != "BrtACBegin" && state[state.length-1] != "BrtFRTBegin")) throw new Error("Unexpected record " + RT + " " + R_n);
- }
- }, opts);
-
- parse_wb_defaults(wb);
-
- // $FlowIgnore
- wb.Names = Names;
-
- (wb).supbooks = supbooks;
- return wb;
- }
-
- function write_BUNDLESHS(ba, wb) {
- write_record(ba, "BrtBeginBundleShs");
- for(var idx = 0; idx != wb.SheetNames.length; ++idx) {
- var viz = wb.Workbook && wb.Workbook.Sheets && wb.Workbook.Sheets[idx] && wb.Workbook.Sheets[idx].Hidden || 0;
- var d = { Hidden: viz, iTabID: idx+1, strRelID: 'rId' + (idx+1), name: wb.SheetNames[idx] };
- write_record(ba, "BrtBundleSh", write_BrtBundleSh(d));
- }
- write_record(ba, "BrtEndBundleShs");
- }
-
- /* [MS-XLSB] 2.4.649 BrtFileVersion */
- function write_BrtFileVersion(data, o) {
- if(!o) o = new_buf(127);
- for(var i = 0; i != 4; ++i) o.write_shift(4, 0);
- write_XLWideString("SheetJS", o);
- write_XLWideString(XLSX.version, o);
- write_XLWideString(XLSX.version, o);
- write_XLWideString("7262", o);
- o.length = o.l;
- return o.length > o.l ? o.slice(0, o.l) : o;
- }
-
- /* [MS-XLSB] 2.4.301 BrtBookView */
- function write_BrtBookView(idx, o) {
- if(!o) o = new_buf(29);
- o.write_shift(-4, 0);
- o.write_shift(-4, 460);
- o.write_shift(4, 28800);
- o.write_shift(4, 17600);
- o.write_shift(4, 500);
- o.write_shift(4, idx);
- o.write_shift(4, idx);
- var flags = 0x78;
- o.write_shift(1, flags);
- return o.length > o.l ? o.slice(0, o.l) : o;
- }
-
- function write_BOOKVIEWS(ba, wb) {
- /* required if hidden tab appears before visible tab */
- if(!wb.Workbook || !wb.Workbook.Sheets) return;
- var sheets = wb.Workbook.Sheets;
- var i = 0, vistab = -1, hidden = -1;
- for(; i < sheets.length; ++i) {
- if(!sheets[i] || !sheets[i].Hidden && vistab == -1) vistab = i;
- else if(sheets[i].Hidden == 1 && hidden == -1) hidden = i;
- }
- if(hidden > vistab) return;
- write_record(ba, "BrtBeginBookViews");
- write_record(ba, "BrtBookView", write_BrtBookView(vistab));
- /* 1*(BrtBookView *FRT) */
- write_record(ba, "BrtEndBookViews");
- }
-
- /* [MS-XLSB] 2.4.305 BrtCalcProp */
- /*function write_BrtCalcProp(data, o) {
- if(!o) o = new_buf(26);
- o.write_shift(4,0); // force recalc
- o.write_shift(4,1);
- o.write_shift(4,0);
- write_Xnum(0, o);
- o.write_shift(-4, 1023);
- o.write_shift(1, 0x33);
- o.write_shift(1, 0x00);
- return o;
- }*/
-
- /* [MS-XLSB] 2.4.646 BrtFileRecover */
- /*function write_BrtFileRecover(data, o) {
- if(!o) o = new_buf(1);
- o.write_shift(1,0);
- return o;
- }*/
-
- /* [MS-XLSB] 2.1.7.61 Workbook */
- function write_wb_bin(wb, opts) {
- var ba = buf_array();
- write_record(ba, "BrtBeginBook");
- write_record(ba, "BrtFileVersion", write_BrtFileVersion());
- /* [[BrtFileSharingIso] BrtFileSharing] */
- write_record(ba, "BrtWbProp", write_BrtWbProp(wb.Workbook && wb.Workbook.WBProps || null));
- /* [ACABSPATH] */
- /* [[BrtBookProtectionIso] BrtBookProtection] */
- write_BOOKVIEWS(ba, wb, opts);
- write_BUNDLESHS(ba, wb, opts);
- /* [FNGROUP] */
- /* [EXTERNALS] */
- /* *BrtName */
- /* write_record(ba, "BrtCalcProp", write_BrtCalcProp()); */
- /* [BrtOleSize] */
- /* *(BrtUserBookView *FRT) */
- /* [PIVOTCACHEIDS] */
- /* [BrtWbFactoid] */
- /* [SMARTTAGTYPES] */
- /* [BrtWebOpt] */
- /* write_record(ba, "BrtFileRecover", write_BrtFileRecover()); */
- /* [WEBPUBITEMS] */
- /* [CRERRS] */
- /* FRTWORKBOOK */
- write_record(ba, "BrtEndBook");
-
- return ba.end();
- }
- function parse_wb(data, name, opts) {
- if(name.slice(-4)===".bin") return parse_wb_bin((data), opts);
- return parse_wb_xml((data), opts);
- }
-
- function parse_ws(data, name, idx, opts, rels, wb, themes, styles) {
- if(name.slice(-4)===".bin") return parse_ws_bin((data), opts, idx, rels, wb, themes, styles);
- return parse_ws_xml((data), opts, idx, rels, wb, themes, styles);
- }
-
- function parse_cs(data, name, idx, opts, rels, wb, themes, styles) {
- if(name.slice(-4)===".bin") return parse_cs_bin((data), opts, idx, rels, wb, themes, styles);
- return parse_cs_xml((data), opts, idx, rels, wb, themes, styles);
- }
-
- function parse_ms(data, name, idx, opts, rels, wb, themes, styles) {
- if(name.slice(-4)===".bin") return parse_ms_bin((data), opts, idx, rels, wb, themes, styles);
- return parse_ms_xml((data), opts, idx, rels, wb, themes, styles);
- }
-
- function parse_ds(data, name, idx, opts, rels, wb, themes, styles) {
- if(name.slice(-4)===".bin") return parse_ds_bin((data), opts, idx, rels, wb, themes, styles);
- return parse_ds_xml((data), opts, idx, rels, wb, themes, styles);
- }
-
- function parse_sty(data, name, themes, opts) {
- if(name.slice(-4)===".bin") return parse_sty_bin((data), themes, opts);
- return parse_sty_xml((data), themes, opts);
- }
-
- function parse_theme(data, name, opts) {
- return parse_theme_xml(data, opts);
- }
-
- function parse_sst(data, name, opts) {
- if(name.slice(-4)===".bin") return parse_sst_bin((data), opts);
- return parse_sst_xml((data), opts);
- }
-
- function parse_cmnt(data, name, opts) {
- if(name.slice(-4)===".bin") return parse_comments_bin((data), opts);
- return parse_comments_xml((data), opts);
- }
-
- function parse_cc(data, name, opts) {
- if(name.slice(-4)===".bin") return parse_cc_bin((data), name, opts);
- return parse_cc_xml((data), name, opts);
- }
-
- function parse_xlink(data, rel, name, opts) {
- if(name.slice(-4)===".bin") return parse_xlink_bin((data), rel, name, opts);
- return parse_xlink_xml((data), rel, name, opts);
- }
-
- function write_wb(wb, name, opts) {
- return (name.slice(-4)===".bin" ? write_wb_bin : write_wb_xml)(wb, opts);
- }
-
- function write_ws(data, name, opts, wb, rels) {
- return (name.slice(-4)===".bin" ? write_ws_bin : write_ws_xml)(data, opts, wb, rels);
- }
-
- // eslint-disable-next-line no-unused-vars
- function write_cs(data, name, opts, wb, rels) {
- return (name.slice(-4)===".bin" ? write_cs_bin : write_cs_xml)(data, opts, wb, rels);
- }
-
- function write_sty(data, name, opts) {
- return (name.slice(-4)===".bin" ? write_sty_bin : write_sty_xml)(data, opts);
- }
-
- function write_sst(data, name, opts) {
- return (name.slice(-4)===".bin" ? write_sst_bin : write_sst_xml)(data, opts);
- }
-
- function write_cmnt(data, name, opts) {
- return (name.slice(-4)===".bin" ? write_comments_bin : write_comments_xml)(data, opts);
- }
- /*
- function write_cc(data, name:string, opts) {
- return (name.slice(-4)===".bin" ? write_cc_bin : write_cc_xml)(data, opts);
- }
- */
- var attregexg2=/([\w:]+)=((?:")([^"]*)(?:")|(?:')([^']*)(?:'))/g;
- var attregex2=/([\w:]+)=((?:")(?:[^"]*)(?:")|(?:')(?:[^']*)(?:'))/;
- function xlml_parsexmltag(tag, skip_root) {
- var words = tag.split(/\s+/);
- var z = ([]); if(!skip_root) z[0] = words[0];
- if(words.length === 1) return z;
- var m = tag.match(attregexg2), y, j, w, i;
- if(m) for(i = 0; i != m.length; ++i) {
- y = m[i].match(attregex2);
- if((j=y[1].indexOf(":")) === -1) z[y[1]] = y[2].slice(1,y[2].length-1);
- else {
- if(y[1].slice(0,6) === "xmlns:") w = "xmlns"+y[1].slice(6);
- else w = y[1].slice(j+1);
- z[w] = y[2].slice(1,y[2].length-1);
- }
- }
- return z;
- }
- function xlml_parsexmltagobj(tag) {
- var words = tag.split(/\s+/);
- var z = {};
- if(words.length === 1) return z;
- var m = tag.match(attregexg2), y, j, w, i;
- if(m) for(i = 0; i != m.length; ++i) {
- y = m[i].match(attregex2);
- if((j=y[1].indexOf(":")) === -1) z[y[1]] = y[2].slice(1,y[2].length-1);
- else {
- if(y[1].slice(0,6) === "xmlns:") w = "xmlns"+y[1].slice(6);
- else w = y[1].slice(j+1);
- z[w] = y[2].slice(1,y[2].length-1);
- }
- }
- return z;
- }
-
- // ----
-
- function xlml_format(format, value) {
- var fmt = XLMLFormatMap[format] || unescapexml(format);
- if(fmt === "General") return SSF._general(value);
- return SSF.format(fmt, value);
- }
-
- function xlml_set_custprop(Custprops, key, cp, val) {
- var oval = val;
- switch((cp[0].match(/dt:dt="([\w.]+)"/)||["",""])[1]) {
- case "boolean": oval = parsexmlbool(val); break;
- case "i2": case "int": oval = parseInt(val, 10); break;
- case "r4": case "float": oval = parseFloat(val); break;
- case "date": case "dateTime.tz": oval = parseDate(val); break;
- case "i8": case "string": case "fixed": case "uuid": case "bin.base64": break;
- default: throw new Error("bad custprop:" + cp[0]);
- }
- Custprops[unescapexml(key)] = oval;
- }
-
- function safe_format_xlml(cell, nf, o) {
- if(cell.t === 'z') return;
- if(!o || o.cellText !== false) try {
- if(cell.t === 'e') { cell.w = cell.w || BErr[cell.v]; }
- else if(nf === "General") {
- if(cell.t === 'n') {
- if((cell.v|0) === cell.v) cell.w = SSF._general_int(cell.v);
- else cell.w = SSF._general_num(cell.v);
- }
- else cell.w = SSF._general(cell.v);
- }
- else cell.w = xlml_format(nf||"General", cell.v);
- } catch(e) { if(o.WTF) throw e; }
- try {
- var z = XLMLFormatMap[nf]||nf||"General";
- if(o.cellNF) cell.z = z;
- if(o.cellDates && cell.t == 'n' && SSF.is_date(z)) {
- 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); }
- }
- } catch(e) { if(o.WTF) throw e; }
- }
-
- function process_style_xlml(styles, stag, opts) {
- if(opts.cellStyles) {
- if(stag.Interior) {
- var I = stag.Interior;
- if(I.Pattern) I.patternType = XLMLPatternTypeMap[I.Pattern] || I.Pattern;
- }
- }
- styles[stag.ID] = stag;
- }
-
- /* TODO: there must exist some form of OSP-blessed spec */
- function parse_xlml_data(xml, ss, data, cell, base, styles, csty, row, arrayf, o) {
- var nf = "General", sid = cell.StyleID, S = {}; o = o || {};
- var interiors = [];
- var i = 0;
- if(sid === undefined && row) sid = row.StyleID;
- if(sid === undefined && csty) sid = csty.StyleID;
- while(styles[sid] !== undefined) {
- if(styles[sid].nf) nf = styles[sid].nf;
- if(styles[sid].Interior) interiors.push(styles[sid].Interior);
- if(!styles[sid].Parent) break;
- sid = styles[sid].Parent;
- }
- switch(data.Type) {
- case 'Boolean':
- cell.t = 'b';
- cell.v = parsexmlbool(xml);
- break;
- case 'String':
- cell.t = 's'; cell.r = xlml_fixstr(unescapexml(xml));
- cell.v = (xml.indexOf("<") > -1 ? unescapexml(ss||xml).replace(/<.*?>/g, "") : cell.r); // todo: BR etc
- break;
- case 'DateTime':
- if(xml.slice(-1) != "Z") xml += "Z";
- cell.v = (parseDate(xml) - new Date(Date.UTC(1899, 11, 30))) / (24 * 60 * 60 * 1000);
- if(cell.v !== cell.v) cell.v = unescapexml(xml);
- else if(cell.v<60) cell.v = cell.v -1;
- if(!nf || nf == "General") nf = "yyyy-mm-dd";
- /* falls through */
- case 'Number':
- if(cell.v === undefined) cell.v=+xml;
- if(!cell.t) cell.t = 'n';
- break;
- case 'Error': cell.t = 'e'; cell.v = RBErr[xml]; if(o.cellText !== false) cell.w = xml; break;
- default:
- if(xml == "" && ss == "") { cell.t = 'z'; }
- else { cell.t = 's'; cell.v = xlml_fixstr(ss||xml); }
- break;
- }
- safe_format_xlml(cell, nf, o);
- if(o.cellFormula !== false) {
- if(cell.Formula) {
- var fstr = unescapexml(cell.Formula);
- /* strictly speaking, the leading = is required but some writers omit */
- if(fstr.charCodeAt(0) == 61 /* = */) fstr = fstr.slice(1);
- cell.f = rc_to_a1(fstr, base);
- delete cell.Formula;
- if(cell.ArrayRange == "RC") cell.F = rc_to_a1("RC:RC", base);
- else if(cell.ArrayRange) {
- cell.F = rc_to_a1(cell.ArrayRange, base);
- arrayf.push([safe_decode_range(cell.F), cell.F]);
- }
- } else {
- for(i = 0; i < arrayf.length; ++i)
- if(base.r >= arrayf[i][0].s.r && base.r <= arrayf[i][0].e.r)
- if(base.c >= arrayf[i][0].s.c && base.c <= arrayf[i][0].e.c)
- cell.F = arrayf[i][1];
- }
- }
- if(o.cellStyles) {
- interiors.forEach(function(x) {
- if(!S.patternType && x.patternType) S.patternType = x.patternType;
- });
- cell.s = S;
- }
- if(cell.StyleID !== undefined) cell.ixfe = cell.StyleID;
- }
-
- function xlml_clean_comment(comment) {
- comment.t = comment.v || "";
- comment.t = comment.t.replace(/\r\n/g,"\n").replace(/\r/g,"\n");
- comment.v = comment.w = comment.ixfe = undefined;
- }
-
- function xlml_normalize(d) {
- if(has_buf && Buffer.isBuffer(d)) return d.toString('utf8');
- if(typeof d === 'string') return d;
- /* duktape */
- if(typeof Uint8Array !== 'undefined' && d instanceof Uint8Array) return utf8read(a2s(ab2a(d)));
- throw new Error("Bad input format: expected Buffer or string");
- }
-
- /* TODO: Everything */
- /* UOS uses CJK in tags */
- var xlmlregex = /<(\/?)([^\s?><!\/:]*:|)([^\s?<>:\/]+)(?:[\s?:\/][^>]*)?>/mg;
- //var xlmlregex = /<(\/?)([a-z0-9]*:|)(\w+)[^>]*>/mg;
- function parse_xlml_xml(d, _opts) {
- var opts = _opts || {};
- make_ssf(SSF);
- var str = debom(xlml_normalize(d));
- if(opts.type == 'binary' || opts.type == 'array' || opts.type == 'base64') {
- if(typeof cptable !== 'undefined') str = cptable.utils.decode(65001, char_codes(str));
- else str = utf8read(str);
- }
- var opening = str.slice(0, 1024).toLowerCase(), ishtml = false;
- if(opening.indexOf("<?xml") == -1) ["html", "table", "head", "meta", "script", "style", "div"].forEach(function(tag) { if(opening.indexOf("<" + tag) >= 0) ishtml = true; });
- if(ishtml) return HTML_.to_workbook(str, opts);
- var Rn;
- var state = [], tmp;
- if(DENSE != null && opts.dense == null) opts.dense = DENSE;
- var sheets = {}, sheetnames = [], cursheet = (opts.dense ? [] : {}), sheetname = "";
- var table = {}, cell = ({}), row = {};// eslint-disable-line no-unused-vars
- var dtag = xlml_parsexmltag('<Data ss:Type="String">'), didx = 0;
- var c = 0, r = 0;
- var refguess = {s: {r:2000000, c:2000000}, e: {r:0, c:0} };
- var styles = {}, stag = {};
- var ss = "", fidx = 0;
- var merges = [];
- var Props = {}, Custprops = {}, pidx = 0, cp = [];
- var comments = [], comment = ({});
- var cstys = [], csty, seencol = false;
- var arrayf = [];
- var rowinfo = [], rowobj = {}, cc = 0, rr = 0;
- var Workbook = ({ Sheets:[], WBProps:{date1904:false} }), wsprops = {};
- xlmlregex.lastIndex = 0;
- str = str.replace(/<!--([\s\S]*?)-->/mg,"");
- var raw_Rn3 = "";
- while((Rn = xlmlregex.exec(str))) switch((Rn[3] = (raw_Rn3 = Rn[3]).toLowerCase())) {
- case 'data' /*case 'Data'*/:
- if(raw_Rn3 == "data") {
- if(Rn[1]==='/'){if((tmp=state.pop())[0]!==Rn[3]) throw new Error("Bad state: "+tmp.join("|"));}
- else if(Rn[0].charAt(Rn[0].length-2) !== '/') state.push([Rn[3], true]);
- break;
- }
- if(state[state.length-1][1]) break;
- 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);
- else { ss = ""; dtag = xlml_parsexmltag(Rn[0]); didx = Rn.index + Rn[0].length; }
- break;
- case 'cell' /*case 'Cell'*/:
- if(Rn[1]==='/'){
- if(comments.length > 0) cell.c = comments;
- if((!opts.sheetRows || opts.sheetRows > r) && cell.v !== undefined) {
- if(opts.dense) {
- if(!cursheet[r]) cursheet[r] = [];
- cursheet[r][c] = cell;
- } else cursheet[encode_col(c) + encode_row(r)] = cell;
- }
- if(cell.HRef) {
- cell.l = ({Target:cell.HRef});
- if(cell.HRefScreenTip) cell.l.Tooltip = cell.HRefScreenTip;
- delete cell.HRef; delete cell.HRefScreenTip;
- }
- if(cell.MergeAcross || cell.MergeDown) {
- cc = c + (parseInt(cell.MergeAcross,10)|0);
- rr = r + (parseInt(cell.MergeDown,10)|0);
- merges.push({s:{c:c,r:r},e:{c:cc,r:rr}});
- }
- if(!opts.sheetStubs) { if(cell.MergeAcross) c = cc + 1; else ++c; }
- else if(cell.MergeAcross || cell.MergeDown) {
- for(var cma = c; cma <= cc; ++cma) {
- for(var cmd = r; cmd <= rr; ++cmd) {
- if(cma > c || cmd > r) {
- if(opts.dense) {
- if(!cursheet[cmd]) cursheet[cmd] = [];
- cursheet[cmd][cma] = {t:'z'};
- } else cursheet[encode_col(cma) + encode_row(cmd)] = {t:'z'};
- }
- }
- }
- c = cc + 1;
- }
- else ++c;
- } else {
- cell = xlml_parsexmltagobj(Rn[0]);
- if(cell.Index) c = +cell.Index - 1;
- if(c < refguess.s.c) refguess.s.c = c;
- if(c > refguess.e.c) refguess.e.c = c;
- if(Rn[0].slice(-2) === "/>") ++c;
- comments = [];
- }
- break;
- case 'row' /*case 'Row'*/:
- if(Rn[1]==='/' || Rn[0].slice(-2) === "/>") {
- if(r < refguess.s.r) refguess.s.r = r;
- if(r > refguess.e.r) refguess.e.r = r;
- if(Rn[0].slice(-2) === "/>") {
- row = xlml_parsexmltag(Rn[0]);
- if(row.Index) r = +row.Index - 1;
- }
- c = 0; ++r;
- } else {
- row = xlml_parsexmltag(Rn[0]);
- if(row.Index) r = +row.Index - 1;
- rowobj = {};
- if(row.AutoFitHeight == "0" || row.Height) {
- rowobj.hpx = parseInt(row.Height, 10); rowobj.hpt = px2pt(rowobj.hpx);
- rowinfo[r] = rowobj;
- }
- if(row.Hidden == "1") { rowobj.hidden = true; rowinfo[r] = rowobj; }
- }
- break;
- case 'worksheet' /*case 'Worksheet'*/: /* TODO: read range from FullRows/FullColumns */
- if(Rn[1]==='/'){
- if((tmp=state.pop())[0]!==Rn[3]) throw new Error("Bad state: "+tmp.join("|"));
- sheetnames.push(sheetname);
- if(refguess.s.r <= refguess.e.r && refguess.s.c <= refguess.e.c) {
- cursheet["!ref"] = encode_range(refguess);
- if(opts.sheetRows && opts.sheetRows <= refguess.e.r) {
- cursheet["!fullref"] = cursheet["!ref"];
- refguess.e.r = opts.sheetRows - 1;
- cursheet["!ref"] = encode_range(refguess);
- }
- }
- if(merges.length) cursheet["!merges"] = merges;
- if(cstys.length > 0) cursheet["!cols"] = cstys;
- if(rowinfo.length > 0) cursheet["!rows"] = rowinfo;
- sheets[sheetname] = cursheet;
- } else {
- refguess = {s: {r:2000000, c:2000000}, e: {r:0, c:0} };
- r = c = 0;
- state.push([Rn[3], false]);
- tmp = xlml_parsexmltag(Rn[0]);
- sheetname = unescapexml(tmp.Name);
- cursheet = (opts.dense ? [] : {});
- merges = [];
- arrayf = [];
- rowinfo = [];
- wsprops = {name:sheetname, Hidden:0};
- Workbook.Sheets.push(wsprops);
- }
- break;
- case 'table' /*case 'Table'*/:
- if(Rn[1]==='/'){if((tmp=state.pop())[0]!==Rn[3]) throw new Error("Bad state: "+tmp.join("|"));}
- else if(Rn[0].slice(-2) == "/>") break;
- else {
- table = xlml_parsexmltag(Rn[0]);
- state.push([Rn[3], false]);
- cstys = []; seencol = false;
- }
- break;
-
- case 'style' /*case 'Style'*/:
- if(Rn[1]==='/') process_style_xlml(styles, stag, opts);
- else stag = xlml_parsexmltag(Rn[0]);
- break;
-
- case 'numberformat' /*case 'NumberFormat'*/:
- stag.nf = unescapexml(xlml_parsexmltag(Rn[0]).Format || "General");
- if(XLMLFormatMap[stag.nf]) stag.nf = XLMLFormatMap[stag.nf];
- for(var ssfidx = 0; ssfidx != 0x188; ++ssfidx) if(SSF._table[ssfidx] == stag.nf) break;
- if(ssfidx == 0x188) for(ssfidx = 0x39; ssfidx != 0x188; ++ssfidx) if(SSF._table[ssfidx] == null) { SSF.load(stag.nf, ssfidx); break; }
- break;
-
- case 'column' /*case 'Column'*/:
- if(state[state.length-1][0] !== /*'Table'*/'table') break;
- csty = xlml_parsexmltag(Rn[0]);
- if(csty.Hidden) { csty.hidden = true; delete csty.Hidden; }
- if(csty.Width) csty.wpx = parseInt(csty.Width, 10);
- if(!seencol && csty.wpx > 10) {
- seencol = true; MDW = DEF_MDW; //find_mdw_wpx(csty.wpx);
- for(var _col = 0; _col < cstys.length; ++_col) if(cstys[_col]) process_col(cstys[_col]);
- }
- if(seencol) process_col(csty);
- cstys[(csty.Index-1||cstys.length)] = csty;
- for(var i = 0; i < +csty.Span; ++i) cstys[cstys.length] = dup(csty);
- break;
-
- case 'namedrange' /*case 'NamedRange'*/:
- if(Rn[1]==='/') break;
- if(!Workbook.Names) Workbook.Names = [];
- var _NamedRange = parsexmltag(Rn[0]);
- var _DefinedName = ({
- Name: _NamedRange.Name,
- Ref: rc_to_a1(_NamedRange.RefersTo.slice(1), {r:0, c:0})
- });
- if(Workbook.Sheets.length>0) _DefinedName.Sheet=Workbook.Sheets.length-1;
- Workbook.Names.push(_DefinedName);
- break;
-
- case 'namedcell' /*case 'NamedCell'*/: break;
- case 'b' /*case 'B'*/: break;
- case 'i' /*case 'I'*/: break;
- case 'u' /*case 'U'*/: break;
- case 's' /*case 'S'*/: break;
- case 'em' /*case 'EM'*/: break;
- case 'h2' /*case 'H2'*/: break;
- case 'h3' /*case 'H3'*/: break;
- case 'sub' /*case 'Sub'*/: break;
- case 'sup' /*case 'Sup'*/: break;
- case 'span' /*case 'Span'*/: break;
- case 'alignment' /*case 'Alignment'*/:
- break;
- case 'borders' /*case 'Borders'*/: break;
- case 'border' /*case 'Border'*/: break;
- case 'font' /*case 'Font'*/:
- if(Rn[0].slice(-2) === "/>") break;
- else if(Rn[1]==="/") ss += str.slice(fidx, Rn.index);
- else fidx = Rn.index + Rn[0].length;
- break;
- case 'interior' /*case 'Interior'*/:
- if(!opts.cellStyles) break;
- stag.Interior = xlml_parsexmltag(Rn[0]);
- break;
- case 'protection' /*case 'Protection'*/: break;
-
- case 'author' /*case 'Author'*/:
- case 'title' /*case 'Title'*/:
- case 'description' /*case 'Description'*/:
- case 'created' /*case 'Created'*/:
- case 'keywords' /*case 'Keywords'*/:
- case 'subject' /*case 'Subject'*/:
- case 'category' /*case 'Category'*/:
- case 'company' /*case 'Company'*/:
- case 'lastauthor' /*case 'LastAuthor'*/:
- case 'lastsaved' /*case 'LastSaved'*/:
- case 'lastprinted' /*case 'LastPrinted'*/:
- case 'version' /*case 'Version'*/:
- case 'revision' /*case 'Revision'*/:
- case 'totaltime' /*case 'TotalTime'*/:
- case 'hyperlinkbase' /*case 'HyperlinkBase'*/:
- case 'manager' /*case 'Manager'*/:
- case 'contentstatus' /*case 'ContentStatus'*/:
- case 'identifier' /*case 'Identifier'*/:
- case 'language' /*case 'Language'*/:
- case 'appname' /*case 'AppName'*/:
- if(Rn[0].slice(-2) === "/>") break;
- else if(Rn[1]==="/") xlml_set_prop(Props, raw_Rn3, str.slice(pidx, Rn.index));
- else pidx = Rn.index + Rn[0].length;
- break;
- case 'paragraphs' /*case 'Paragraphs'*/: break;
-
- case 'styles' /*case 'Styles'*/:
- case 'workbook' /*case 'Workbook'*/:
- if(Rn[1]==='/'){if((tmp=state.pop())[0]!==Rn[3]) throw new Error("Bad state: "+tmp.join("|"));}
- else state.push([Rn[3], false]);
- break;
-
- case 'comment' /*case 'Comment'*/:
- if(Rn[1]==='/'){
- if((tmp=state.pop())[0]!==Rn[3]) throw new Error("Bad state: "+tmp.join("|"));
- xlml_clean_comment(comment);
- comments.push(comment);
- } else {
- state.push([Rn[3], false]);
- tmp = xlml_parsexmltag(Rn[0]);
- comment = ({a:tmp.Author});
- }
- break;
-
- case 'autofilter' /*case 'AutoFilter'*/:
- if(Rn[1]==='/'){if((tmp=state.pop())[0]!==Rn[3]) throw new Error("Bad state: "+tmp.join("|"));}
- else if(Rn[0].charAt(Rn[0].length-2) !== '/') {
- var AutoFilter = xlml_parsexmltag(Rn[0]);
- cursheet['!autofilter'] = { ref:rc_to_a1(AutoFilter.Range).replace(/\$/g,"") };
- state.push([Rn[3], true]);
- }
- break;
-
- case 'name' /*case 'Name'*/: break;
-
- case 'datavalidation' /*case 'DataValidation'*/:
- if(Rn[1]==='/'){
- if((tmp=state.pop())[0]!==Rn[3]) throw new Error("Bad state: "+tmp.join("|"));
- } else {
- if(Rn[0].charAt(Rn[0].length-2) !== '/') state.push([Rn[3], true]);
- }
- break;
-
- case 'pixelsperinch' /*case 'PixelsPerInch'*/:
- break;
- case 'componentoptions' /*case 'ComponentOptions'*/:
- case 'documentproperties' /*case 'DocumentProperties'*/:
- case 'customdocumentproperties' /*case 'CustomDocumentProperties'*/:
- case 'officedocumentsettings' /*case 'OfficeDocumentSettings'*/:
- case 'pivottable' /*case 'PivotTable'*/:
- case 'pivotcache' /*case 'PivotCache'*/:
- case 'names' /*case 'Names'*/:
- case 'mapinfo' /*case 'MapInfo'*/:
- case 'pagebreaks' /*case 'PageBreaks'*/:
- case 'querytable' /*case 'QueryTable'*/:
- case 'sorting' /*case 'Sorting'*/:
- case 'schema' /*case 'Schema'*/: //case 'data' /*case 'data'*/:
- case 'conditionalformatting' /*case 'ConditionalFormatting'*/:
- case 'smarttagtype' /*case 'SmartTagType'*/:
- case 'smarttags' /*case 'SmartTags'*/:
- case 'excelworkbook' /*case 'ExcelWorkbook'*/:
- case 'workbookoptions' /*case 'WorkbookOptions'*/:
- case 'worksheetoptions' /*case 'WorksheetOptions'*/:
- if(Rn[1]==='/'){if((tmp=state.pop())[0]!==Rn[3]) throw new Error("Bad state: "+tmp.join("|"));}
- else if(Rn[0].charAt(Rn[0].length-2) !== '/') state.push([Rn[3], true]);
- break;
-
- default:
- /* FODS file root is <office:document> */
- if(state.length == 0 && Rn[3] == "document") return parse_fods(str, opts);
- /* UOS file root is <uof:UOF> */
- if(state.length == 0 && Rn[3] == "uof"/*"UOF"*/) return parse_fods(str, opts);
-
- var seen = true;
- switch(state[state.length-1][0]) {
- /* OfficeDocumentSettings */
- case 'officedocumentsettings' /*case 'OfficeDocumentSettings'*/: switch(Rn[3]) {
- case 'allowpng' /*case 'AllowPNG'*/: break;
- case 'removepersonalinformation' /*case 'RemovePersonalInformation'*/: break;
- case 'downloadcomponents' /*case 'DownloadComponents'*/: break;
- case 'locationofcomponents' /*case 'LocationOfComponents'*/: break;
- case 'colors' /*case 'Colors'*/: break;
- case 'color' /*case 'Color'*/: break;
- case 'index' /*case 'Index'*/: break;
- case 'rgb' /*case 'RGB'*/: break;
- case 'targetscreensize' /*case 'TargetScreenSize'*/: break;
- case 'readonlyrecommended' /*case 'ReadOnlyRecommended'*/: break;
- default: seen = false;
- } break;
-
- /* ComponentOptions */
- case 'componentoptions' /*case 'ComponentOptions'*/: switch(Rn[3]) {
- case 'toolbar' /*case 'Toolbar'*/: break;
- case 'hideofficelogo' /*case 'HideOfficeLogo'*/: break;
- case 'spreadsheetautofit' /*case 'SpreadsheetAutoFit'*/: break;
- case 'label' /*case 'Label'*/: break;
- case 'caption' /*case 'Caption'*/: break;
- case 'maxheight' /*case 'MaxHeight'*/: break;
- case 'maxwidth' /*case 'MaxWidth'*/: break;
- case 'nextsheetnumber' /*case 'NextSheetNumber'*/: break;
- default: seen = false;
- } break;
-
- /* ExcelWorkbook */
- case 'excelworkbook' /*case 'ExcelWorkbook'*/: switch(Rn[3]) {
- case 'date1904' /*case 'Date1904'*/:
- Workbook.WBProps.date1904 = true;
- break;
- case 'windowheight' /*case 'WindowHeight'*/: break;
- case 'windowwidth' /*case 'WindowWidth'*/: break;
- case 'windowtopx' /*case 'WindowTopX'*/: break;
- case 'windowtopy' /*case 'WindowTopY'*/: break;
- case 'tabratio' /*case 'TabRatio'*/: break;
- case 'protectstructure' /*case 'ProtectStructure'*/: break;
- case 'protectwindow' /*case 'ProtectWindow'*/: break;
- case 'protectwindows' /*case 'ProtectWindows'*/: break;
- case 'activesheet' /*case 'ActiveSheet'*/: break;
- case 'displayinknotes' /*case 'DisplayInkNotes'*/: break;
- case 'firstvisiblesheet' /*case 'FirstVisibleSheet'*/: break;
- case 'supbook' /*case 'SupBook'*/: break;
- case 'sheetname' /*case 'SheetName'*/: break;
- case 'sheetindex' /*case 'SheetIndex'*/: break;
- case 'sheetindexfirst' /*case 'SheetIndexFirst'*/: break;
- case 'sheetindexlast' /*case 'SheetIndexLast'*/: break;
- case 'dll' /*case 'Dll'*/: break;
- case 'acceptlabelsinformulas' /*case 'AcceptLabelsInFormulas'*/: break;
- case 'donotsavelinkvalues' /*case 'DoNotSaveLinkValues'*/: break;
- case 'iteration' /*case 'Iteration'*/: break;
- case 'maxiterations' /*case 'MaxIterations'*/: break;
- case 'maxchange' /*case 'MaxChange'*/: break;
- case 'path' /*case 'Path'*/: break;
- case 'xct' /*case 'Xct'*/: break;
- case 'count' /*case 'Count'*/: break;
- case 'selectedsheets' /*case 'SelectedSheets'*/: break;
- case 'calculation' /*case 'Calculation'*/: break;
- case 'uncalced' /*case 'Uncalced'*/: break;
- case 'startupprompt' /*case 'StartupPrompt'*/: break;
- case 'crn' /*case 'Crn'*/: break;
- case 'externname' /*case 'ExternName'*/: break;
- case 'formula' /*case 'Formula'*/: break;
- case 'colfirst' /*case 'ColFirst'*/: break;
- case 'collast' /*case 'ColLast'*/: break;
- case 'wantadvise' /*case 'WantAdvise'*/: break;
- case 'boolean' /*case 'Boolean'*/: break;
- case 'error' /*case 'Error'*/: break;
- case 'text' /*case 'Text'*/: break;
- case 'ole' /*case 'OLE'*/: break;
- case 'noautorecover' /*case 'NoAutoRecover'*/: break;
- case 'publishobjects' /*case 'PublishObjects'*/: break;
- case 'donotcalculatebeforesave' /*case 'DoNotCalculateBeforeSave'*/: break;
- case 'number' /*case 'Number'*/: break;
- case 'refmoder1c1' /*case 'RefModeR1C1'*/: break;
- case 'embedsavesmarttags' /*case 'EmbedSaveSmartTags'*/: break;
- default: seen = false;
- } break;
-
- /* WorkbookOptions */
- case 'workbookoptions' /*case 'WorkbookOptions'*/: switch(Rn[3]) {
- case 'owcversion' /*case 'OWCVersion'*/: break;
- case 'height' /*case 'Height'*/: break;
- case 'width' /*case 'Width'*/: break;
- default: seen = false;
- } break;
-
- /* WorksheetOptions */
- case 'worksheetoptions' /*case 'WorksheetOptions'*/: switch(Rn[3]) {
- case 'visible' /*case 'Visible'*/:
- if(Rn[0].slice(-2) === "/>"){/* empty */}
- else if(Rn[1]==="/") switch(str.slice(pidx, Rn.index)) {
- case "SheetHidden": wsprops.Hidden = 1; break;
- case "SheetVeryHidden": wsprops.Hidden = 2; break;
- }
- else pidx = Rn.index + Rn[0].length;
- break;
- case 'header' /*case 'Header'*/:
- if(!cursheet['!margins']) default_margins(cursheet['!margins']={}, 'xlml');
- cursheet['!margins'].header = parsexmltag(Rn[0]).Margin;
- break;
- case 'footer' /*case 'Footer'*/:
- if(!cursheet['!margins']) default_margins(cursheet['!margins']={}, 'xlml');
- cursheet['!margins'].footer = parsexmltag(Rn[0]).Margin;
- break;
- case 'pagemargins' /*case 'PageMargins'*/:
- var pagemargins = parsexmltag(Rn[0]);
- if(!cursheet['!margins']) default_margins(cursheet['!margins']={},'xlml');
- if(pagemargins.Top) cursheet['!margins'].top = pagemargins.Top;
- if(pagemargins.Left) cursheet['!margins'].left = pagemargins.Left;
- if(pagemargins.Right) cursheet['!margins'].right = pagemargins.Right;
- if(pagemargins.Bottom) cursheet['!margins'].bottom = pagemargins.Bottom;
- break;
- case 'displayrighttoleft' /*case 'DisplayRightToLeft'*/:
- if(!Workbook.Views) Workbook.Views = [];
- if(!Workbook.Views[0]) Workbook.Views[0] = {};
- Workbook.Views[0].RTL = true;
- break;
-
- case 'freezepanes' /*case 'FreezePanes'*/: break;
- case 'frozennosplit' /*case 'FrozenNoSplit'*/: break;
-
- case 'splithorizontal' /*case 'SplitHorizontal'*/:
- case 'splitvertical' /*case 'SplitVertical'*/:
- break;
-
- case 'donotdisplaygridlines' /*case 'DoNotDisplayGridlines'*/:
- break;
-
- case 'activerow' /*case 'ActiveRow'*/: break;
- case 'activecol' /*case 'ActiveCol'*/: break;
- case 'toprowbottompane' /*case 'TopRowBottomPane'*/: break;
- case 'leftcolumnrightpane' /*case 'LeftColumnRightPane'*/: break;
-
- case 'unsynced' /*case 'Unsynced'*/: break;
- case 'print' /*case 'Print'*/: break;
- case 'panes' /*case 'Panes'*/: break;
- case 'scale' /*case 'Scale'*/: break;
- case 'pane' /*case 'Pane'*/: break;
- case 'number' /*case 'Number'*/: break;
- case 'layout' /*case 'Layout'*/: break;
- case 'pagesetup' /*case 'PageSetup'*/: break;
- case 'selected' /*case 'Selected'*/: break;
- case 'protectobjects' /*case 'ProtectObjects'*/: break;
- case 'enableselection' /*case 'EnableSelection'*/: break;
- case 'protectscenarios' /*case 'ProtectScenarios'*/: break;
- case 'validprinterinfo' /*case 'ValidPrinterInfo'*/: break;
- case 'horizontalresolution' /*case 'HorizontalResolution'*/: break;
- case 'verticalresolution' /*case 'VerticalResolution'*/: break;
- case 'numberofcopies' /*case 'NumberofCopies'*/: break;
- case 'activepane' /*case 'ActivePane'*/: break;
- case 'toprowvisible' /*case 'TopRowVisible'*/: break;
- case 'leftcolumnvisible' /*case 'LeftColumnVisible'*/: break;
- case 'fittopage' /*case 'FitToPage'*/: break;
- case 'rangeselection' /*case 'RangeSelection'*/: break;
- case 'papersizeindex' /*case 'PaperSizeIndex'*/: break;
- case 'pagelayoutzoom' /*case 'PageLayoutZoom'*/: break;
- case 'pagebreakzoom' /*case 'PageBreakZoom'*/: break;
- case 'filteron' /*case 'FilterOn'*/: break;
- case 'fitwidth' /*case 'FitWidth'*/: break;
- case 'fitheight' /*case 'FitHeight'*/: break;
- case 'commentslayout' /*case 'CommentsLayout'*/: break;
- case 'zoom' /*case 'Zoom'*/: break;
- case 'lefttoright' /*case 'LeftToRight'*/: break;
- case 'gridlines' /*case 'Gridlines'*/: break;
- case 'allowsort' /*case 'AllowSort'*/: break;
- case 'allowfilter' /*case 'AllowFilter'*/: break;
- case 'allowinsertrows' /*case 'AllowInsertRows'*/: break;
- case 'allowdeleterows' /*case 'AllowDeleteRows'*/: break;
- case 'allowinsertcols' /*case 'AllowInsertCols'*/: break;
- case 'allowdeletecols' /*case 'AllowDeleteCols'*/: break;
- case 'allowinserthyperlinks' /*case 'AllowInsertHyperlinks'*/: break;
- case 'allowformatcells' /*case 'AllowFormatCells'*/: break;
- case 'allowsizecols' /*case 'AllowSizeCols'*/: break;
- case 'allowsizerows' /*case 'AllowSizeRows'*/: break;
- case 'nosummaryrowsbelowdetail' /*case 'NoSummaryRowsBelowDetail'*/: break;
- case 'tabcolorindex' /*case 'TabColorIndex'*/: break;
- case 'donotdisplayheadings' /*case 'DoNotDisplayHeadings'*/: break;
- case 'showpagelayoutzoom' /*case 'ShowPageLayoutZoom'*/: break;
- case 'nosummarycolumnsrightdetail' /*case 'NoSummaryColumnsRightDetail'*/: break;
- case 'blackandwhite' /*case 'BlackAndWhite'*/: break;
- case 'donotdisplayzeros' /*case 'DoNotDisplayZeros'*/: break;
- case 'displaypagebreak' /*case 'DisplayPageBreak'*/: break;
- case 'rowcolheadings' /*case 'RowColHeadings'*/: break;
- case 'donotdisplayoutline' /*case 'DoNotDisplayOutline'*/: break;
- case 'noorientation' /*case 'NoOrientation'*/: break;
- case 'allowusepivottables' /*case 'AllowUsePivotTables'*/: break;
- case 'zeroheight' /*case 'ZeroHeight'*/: break;
- case 'viewablerange' /*case 'ViewableRange'*/: break;
- case 'selection' /*case 'Selection'*/: break;
- case 'protectcontents' /*case 'ProtectContents'*/: break;
- default: seen = false;
- } break;
-
- /* PivotTable */
- case 'pivottable' /*case 'PivotTable'*/: case 'pivotcache' /*case 'PivotCache'*/: switch(Rn[3]) {
- case 'immediateitemsondrop' /*case 'ImmediateItemsOnDrop'*/: break;
- case 'showpagemultipleitemlabel' /*case 'ShowPageMultipleItemLabel'*/: break;
- case 'compactrowindent' /*case 'CompactRowIndent'*/: break;
- case 'location' /*case 'Location'*/: break;
- case 'pivotfield' /*case 'PivotField'*/: break;
- case 'orientation' /*case 'Orientation'*/: break;
- case 'layoutform' /*case 'LayoutForm'*/: break;
- case 'layoutsubtotallocation' /*case 'LayoutSubtotalLocation'*/: break;
- case 'layoutcompactrow' /*case 'LayoutCompactRow'*/: break;
- case 'position' /*case 'Position'*/: break;
- case 'pivotitem' /*case 'PivotItem'*/: break;
- case 'datatype' /*case 'DataType'*/: break;
- case 'datafield' /*case 'DataField'*/: break;
- case 'sourcename' /*case 'SourceName'*/: break;
- case 'parentfield' /*case 'ParentField'*/: break;
- case 'ptlineitems' /*case 'PTLineItems'*/: break;
- case 'ptlineitem' /*case 'PTLineItem'*/: break;
- case 'countofsameitems' /*case 'CountOfSameItems'*/: break;
- case 'item' /*case 'Item'*/: break;
- case 'itemtype' /*case 'ItemType'*/: break;
- case 'ptsource' /*case 'PTSource'*/: break;
- case 'cacheindex' /*case 'CacheIndex'*/: break;
- case 'consolidationreference' /*case 'ConsolidationReference'*/: break;
- case 'filename' /*case 'FileName'*/: break;
- case 'reference' /*case 'Reference'*/: break;
- case 'nocolumngrand' /*case 'NoColumnGrand'*/: break;
- case 'norowgrand' /*case 'NoRowGrand'*/: break;
- case 'blanklineafteritems' /*case 'BlankLineAfterItems'*/: break;
- case 'hidden' /*case 'Hidden'*/: break;
- case 'subtotal' /*case 'Subtotal'*/: break;
- case 'basefield' /*case 'BaseField'*/: break;
- case 'mapchilditems' /*case 'MapChildItems'*/: break;
- case 'function' /*case 'Function'*/: break;
- case 'refreshonfileopen' /*case 'RefreshOnFileOpen'*/: break;
- case 'printsettitles' /*case 'PrintSetTitles'*/: break;
- case 'mergelabels' /*case 'MergeLabels'*/: break;
- case 'defaultversion' /*case 'DefaultVersion'*/: break;
- case 'refreshname' /*case 'RefreshName'*/: break;
- case 'refreshdate' /*case 'RefreshDate'*/: break;
- case 'refreshdatecopy' /*case 'RefreshDateCopy'*/: break;
- case 'versionlastrefresh' /*case 'VersionLastRefresh'*/: break;
- case 'versionlastupdate' /*case 'VersionLastUpdate'*/: break;
- case 'versionupdateablemin' /*case 'VersionUpdateableMin'*/: break;
- case 'versionrefreshablemin' /*case 'VersionRefreshableMin'*/: break;
- case 'calculation' /*case 'Calculation'*/: break;
- default: seen = false;
- } break;
-
- /* PageBreaks */
- case 'pagebreaks' /*case 'PageBreaks'*/: switch(Rn[3]) {
- case 'colbreaks' /*case 'ColBreaks'*/: break;
- case 'colbreak' /*case 'ColBreak'*/: break;
- case 'rowbreaks' /*case 'RowBreaks'*/: break;
- case 'rowbreak' /*case 'RowBreak'*/: break;
- case 'colstart' /*case 'ColStart'*/: break;
- case 'colend' /*case 'ColEnd'*/: break;
- case 'rowend' /*case 'RowEnd'*/: break;
- default: seen = false;
- } break;
-
- /* AutoFilter */
- case 'autofilter' /*case 'AutoFilter'*/: switch(Rn[3]) {
- case 'autofiltercolumn' /*case 'AutoFilterColumn'*/: break;
- case 'autofiltercondition' /*case 'AutoFilterCondition'*/: break;
- case 'autofilterand' /*case 'AutoFilterAnd'*/: break;
- case 'autofilteror' /*case 'AutoFilterOr'*/: break;
- default: seen = false;
- } break;
-
- /* QueryTable */
- case 'querytable' /*case 'QueryTable'*/: switch(Rn[3]) {
- case 'id' /*case 'Id'*/: break;
- case 'autoformatfont' /*case 'AutoFormatFont'*/: break;
- case 'autoformatpattern' /*case 'AutoFormatPattern'*/: break;
- case 'querysource' /*case 'QuerySource'*/: break;
- case 'querytype' /*case 'QueryType'*/: break;
- case 'enableredirections' /*case 'EnableRedirections'*/: break;
- case 'refreshedinxl9' /*case 'RefreshedInXl9'*/: break;
- case 'urlstring' /*case 'URLString'*/: break;
- case 'htmltables' /*case 'HTMLTables'*/: break;
- case 'connection' /*case 'Connection'*/: break;
- case 'commandtext' /*case 'CommandText'*/: break;
- case 'refreshinfo' /*case 'RefreshInfo'*/: break;
- case 'notitles' /*case 'NoTitles'*/: break;
- case 'nextid' /*case 'NextId'*/: break;
- case 'columninfo' /*case 'ColumnInfo'*/: break;
- case 'overwritecells' /*case 'OverwriteCells'*/: break;
- case 'donotpromptforfile' /*case 'DoNotPromptForFile'*/: break;
- case 'textwizardsettings' /*case 'TextWizardSettings'*/: break;
- case 'source' /*case 'Source'*/: break;
- case 'number' /*case 'Number'*/: break;
- case 'decimal' /*case 'Decimal'*/: break;
- case 'thousandseparator' /*case 'ThousandSeparator'*/: break;
- case 'trailingminusnumbers' /*case 'TrailingMinusNumbers'*/: break;
- case 'formatsettings' /*case 'FormatSettings'*/: break;
- case 'fieldtype' /*case 'FieldType'*/: break;
- case 'delimiters' /*case 'Delimiters'*/: break;
- case 'tab' /*case 'Tab'*/: break;
- case 'comma' /*case 'Comma'*/: break;
- case 'autoformatname' /*case 'AutoFormatName'*/: break;
- case 'versionlastedit' /*case 'VersionLastEdit'*/: break;
- case 'versionlastrefresh' /*case 'VersionLastRefresh'*/: break;
- default: seen = false;
- } break;
-
- case 'datavalidation' /*case 'DataValidation'*/:
- switch(Rn[3]) {
- case 'range' /*case 'Range'*/: break;
-
- case 'type' /*case 'Type'*/: break;
- case 'min' /*case 'Min'*/: break;
- case 'max' /*case 'Max'*/: break;
- case 'sort' /*case 'Sort'*/: break;
- case 'descending' /*case 'Descending'*/: break;
- case 'order' /*case 'Order'*/: break;
- case 'casesensitive' /*case 'CaseSensitive'*/: break;
- case 'value' /*case 'Value'*/: break;
- case 'errorstyle' /*case 'ErrorStyle'*/: break;
- case 'errormessage' /*case 'ErrorMessage'*/: break;
- case 'errortitle' /*case 'ErrorTitle'*/: break;
- case 'inputmessage' /*case 'InputMessage'*/: break;
- case 'inputtitle' /*case 'InputTitle'*/: break;
- case 'combohide' /*case 'ComboHide'*/: break;
- case 'inputhide' /*case 'InputHide'*/: break;
- case 'condition' /*case 'Condition'*/: break;
- case 'qualifier' /*case 'Qualifier'*/: break;
- case 'useblank' /*case 'UseBlank'*/: break;
- case 'value1' /*case 'Value1'*/: break;
- case 'value2' /*case 'Value2'*/: break;
- case 'format' /*case 'Format'*/: break;
-
- case 'cellrangelist' /*case 'CellRangeList'*/: break;
- default: seen = false;
- } break;
-
- case 'sorting' /*case 'Sorting'*/:
- case 'conditionalformatting' /*case 'ConditionalFormatting'*/:
- switch(Rn[3]) {
- case 'range' /*case 'Range'*/: break;
- case 'type' /*case 'Type'*/: break;
- case 'min' /*case 'Min'*/: break;
- case 'max' /*case 'Max'*/: break;
- case 'sort' /*case 'Sort'*/: break;
- case 'descending' /*case 'Descending'*/: break;
- case 'order' /*case 'Order'*/: break;
- case 'casesensitive' /*case 'CaseSensitive'*/: break;
- case 'value' /*case 'Value'*/: break;
- case 'errorstyle' /*case 'ErrorStyle'*/: break;
- case 'errormessage' /*case 'ErrorMessage'*/: break;
- case 'errortitle' /*case 'ErrorTitle'*/: break;
- case 'cellrangelist' /*case 'CellRangeList'*/: break;
- case 'inputmessage' /*case 'InputMessage'*/: break;
- case 'inputtitle' /*case 'InputTitle'*/: break;
- case 'combohide' /*case 'ComboHide'*/: break;
- case 'inputhide' /*case 'InputHide'*/: break;
- case 'condition' /*case 'Condition'*/: break;
- case 'qualifier' /*case 'Qualifier'*/: break;
- case 'useblank' /*case 'UseBlank'*/: break;
- case 'value1' /*case 'Value1'*/: break;
- case 'value2' /*case 'Value2'*/: break;
- case 'format' /*case 'Format'*/: break;
- default: seen = false;
- } break;
-
- /* MapInfo (schema) */
- case 'mapinfo' /*case 'MapInfo'*/: case 'schema' /*case 'Schema'*/: case 'data' /*case 'data'*/: switch(Rn[3]) {
- case 'map' /*case 'Map'*/: break;
- case 'entry' /*case 'Entry'*/: break;
- case 'range' /*case 'Range'*/: break;
- case 'xpath' /*case 'XPath'*/: break;
- case 'field' /*case 'Field'*/: break;
- case 'xsdtype' /*case 'XSDType'*/: break;
- case 'filteron' /*case 'FilterOn'*/: break;
- case 'aggregate' /*case 'Aggregate'*/: break;
- case 'elementtype' /*case 'ElementType'*/: break;
- case 'attributetype' /*case 'AttributeType'*/: break;
- /* These are from xsd (XML Schema Definition) */
- case 'schema' /*case 'schema'*/:
- case 'element' /*case 'element'*/:
- case 'complextype' /*case 'complexType'*/:
- case 'datatype' /*case 'datatype'*/:
- case 'all' /*case 'all'*/:
- case 'attribute' /*case 'attribute'*/:
- case 'extends' /*case 'extends'*/: break;
-
- case 'row' /*case 'row'*/: break;
- default: seen = false;
- } break;
-
- /* SmartTags (can be anything) */
- case 'smarttags' /*case 'SmartTags'*/: break;
-
- default: seen = false; break;
- }
- if(seen) break;
- /* CustomDocumentProperties */
- if(Rn[3].match(/!\[CDATA/)) break;
- if(!state[state.length-1][1]) throw 'Unrecognized tag: ' + Rn[3] + "|" + state.join("|");
- if(state[state.length-1][0]===/*'CustomDocumentProperties'*/'customdocumentproperties') {
- if(Rn[0].slice(-2) === "/>") break;
- else if(Rn[1]==="/") xlml_set_custprop(Custprops, raw_Rn3, cp, str.slice(pidx, Rn.index));
- else { cp = Rn; pidx = Rn.index + Rn[0].length; }
- break;
- }
- if(opts.WTF) throw 'Unrecognized tag: ' + Rn[3] + "|" + state.join("|");
- }
- var out = ({});
- if(!opts.bookSheets && !opts.bookProps) out.Sheets = sheets;
- out.SheetNames = sheetnames;
- out.Workbook = Workbook;
- out.SSF = SSF.get_table();
- out.Props = Props;
- out.Custprops = Custprops;
- return out;
- }
-
- function parse_xlml(data, opts) {
- fix_read_opts(opts=opts||{});
- switch(opts.type||"base64") {
- case "base64": return parse_xlml_xml(Base64.decode(data), opts);
- case "binary": case "buffer": case "file": return parse_xlml_xml(data, opts);
- case "array": return parse_xlml_xml(a2s(data), opts);
- }
- }
-
- /* TODO */
- function write_props_xlml(wb, opts) {
- var o = [];
- /* DocumentProperties */
- if(wb.Props) o.push(xlml_write_docprops(wb.Props, opts));
- /* CustomDocumentProperties */
- if(wb.Custprops) o.push(xlml_write_custprops(wb.Props, wb.Custprops, opts));
- return o.join("");
- }
- /* TODO */
- function write_wb_xlml() {
- /* OfficeDocumentSettings */
- /* ExcelWorkbook */
- return "";
- }
- /* TODO */
- function write_sty_xlml(wb, opts) {
- /* Styles */
- var styles = ['<Style ss:ID="Default" ss:Name="Normal"><NumberFormat/></Style>'];
- opts.cellXfs.forEach(function(xf, id) {
- var payload = [];
- payload.push(writextag('NumberFormat', null, {"ss:Format": escapexml(SSF._table[xf.numFmtId])}));
-
- var o = {"ss:ID": "s" + (21+id)};
- styles.push(writextag('Style', payload.join(""), o));
- });
- return writextag("Styles", styles.join(""));
- }
- function write_name_xlml(n) { return writextag("NamedRange", null, {"ss:Name": n.Name, "ss:RefersTo":"=" + a1_to_rc(n.Ref, {r:0,c:0})}); }
- function write_names_xlml(wb) {
- if(!((wb||{}).Workbook||{}).Names) return "";
- var names = wb.Workbook.Names;
- var out = [];
- for(var i = 0; i < names.length; ++i) {
- var n = names[i];
- if(n.Sheet != null) continue;
- if(n.Name.match(/^_xlfn\./)) continue;
- out.push(write_name_xlml(n));
- }
- return writextag("Names", out.join(""));
- }
- function write_ws_xlml_names(ws, opts, idx, wb) {
- if(!ws) return "";
- if(!((wb||{}).Workbook||{}).Names) return "";
- var names = wb.Workbook.Names;
- var out = [];
- for(var i = 0; i < names.length; ++i) {
- var n = names[i];
- if(n.Sheet != idx) continue;
- /*switch(n.Name) {
- case "_": continue;
- }*/
- if(n.Name.match(/^_xlfn\./)) continue;
- out.push(write_name_xlml(n));
- }
- return out.join("");
- }
- /* WorksheetOptions */
- function write_ws_xlml_wsopts(ws, opts, idx, wb) {
- if(!ws) return "";
- var o = [];
- /* NOTE: spec technically allows any order, but stick with implied order */
-
- /* FitToPage */
- /* DoNotDisplayColHeaders */
- /* DoNotDisplayRowHeaders */
- /* ViewableRange */
- /* Selection */
- /* GridlineColor */
- /* Name */
- /* ExcelWorksheetType */
- /* IntlMacro */
- /* Unsynced */
- /* Selected */
- /* CodeName */
-
- if(ws['!margins']) {
- o.push("<PageSetup>");
- if(ws['!margins'].header) o.push(writextag("Header", null, {'x:Margin':ws['!margins'].header}));
- if(ws['!margins'].footer) o.push(writextag("Footer", null, {'x:Margin':ws['!margins'].footer}));
- o.push(writextag("PageMargins", null, {
- 'x:Bottom': ws['!margins'].bottom || "0.75",
- 'x:Left': ws['!margins'].left || "0.7",
- 'x:Right': ws['!margins'].right || "0.7",
- 'x:Top': ws['!margins'].top || "0.75"
- }));
- o.push("</PageSetup>");
- }
-
- /* PageSetup */
- /* DisplayPageBreak */
- /* TransitionExpressionEvaluation */
- /* TransitionFormulaEntry */
- /* Print */
- /* Zoom */
- /* PageLayoutZoom */
- /* PageBreakZoom */
- /* ShowPageBreakZoom */
- /* DefaultRowHeight */
- /* DefaultColumnWidth */
- /* StandardWidth */
-
- if(wb && wb.Workbook && wb.Workbook.Sheets && wb.Workbook.Sheets[idx]) {
- /* Visible */
- if(wb.Workbook.Sheets[idx].Hidden) o.push(writextag("Visible", (wb.Workbook.Sheets[idx].Hidden == 1 ? "SheetHidden" : "SheetVeryHidden"), {}));
- else {
- /* Selected */
- for(var i = 0; i < idx; ++i) if(wb.Workbook.Sheets[i] && !wb.Workbook.Sheets[i].Hidden) break;
- if(i == idx) o.push("<Selected/>");
- }
- }
-
- /* LeftColumnVisible */
-
- if(((((wb||{}).Workbook||{}).Views||[])[0]||{}).RTL) o.push("<DisplayRightToLeft/>");
-
- /* GridlineColorIndex */
- /* DisplayFormulas */
- /* DoNotDisplayGridlines */
- /* DoNotDisplayHeadings */
- /* DoNotDisplayOutline */
- /* ApplyAutomaticOutlineStyles */
- /* NoSummaryRowsBelowDetail */
- /* NoSummaryColumnsRightDetail */
- /* DoNotDisplayZeros */
- /* ActiveRow */
- /* ActiveColumn */
- /* FilterOn */
- /* RangeSelection */
- /* TopRowVisible */
- /* TopRowBottomPane */
- /* LeftColumnRightPane */
- /* ActivePane */
- /* SplitHorizontal */
- /* SplitVertical */
- /* FreezePanes */
- /* FrozenNoSplit */
- /* TabColorIndex */
- /* Panes */
-
- /* NOTE: Password not supported in XLML Format */
- if(ws['!protect']) {
- o.push(writetag("ProtectContents", "True"));
- if(ws['!protect'].objects) o.push(writetag("ProtectObjects", "True"));
- if(ws['!protect'].scenarios) o.push(writetag("ProtectScenarios", "True"));
- if(ws['!protect'].selectLockedCells != null && !ws['!protect'].selectLockedCells) o.push(writetag("EnableSelection", "NoSelection"));
- else if(ws['!protect'].selectUnlockedCells != null && !ws['!protect'].selectUnlockedCells) o.push(writetag("EnableSelection", "UnlockedCells"));
- [
- [ "formatCells", "AllowFormatCells" ],
- [ "formatColumns", "AllowSizeCols" ],
- [ "formatRows", "AllowSizeRows" ],
- [ "insertColumns", "AllowInsertCols" ],
- [ "insertRows", "AllowInsertRows" ],
- [ "insertHyperlinks", "AllowInsertHyperlinks" ],
- [ "deleteColumns", "AllowDeleteCols" ],
- [ "deleteRows", "AllowDeleteRows" ],
- [ "sort", "AllowSort" ],
- [ "autoFilter", "AllowFilter" ],
- [ "pivotTables", "AllowUsePivotTables" ]
- ].forEach(function(x) { if(ws['!protect'][x[0]]) o.push("<"+x[1]+"/>"); });
- }
-
- if(o.length == 0) return "";
- return writextag("WorksheetOptions", o.join(""), {xmlns:XLMLNS.x});
- }
- function write_ws_xlml_comment(comments) {
- return comments.map(function(c) {
- // TODO: formatted text
- var t = xlml_unfixstr(c.t||"");
- var d =writextag("ss:Data", t, {"xmlns":"http://www.w3.org/TR/REC-html40"});
- return writextag("Comment", d, {"ss:Author":c.a});
- }).join("");
- }
- function write_ws_xlml_cell(cell, ref, ws, opts, idx, wb, addr){
- if(!cell || (cell.v == undefined && cell.f == undefined)) return "";
-
- var attr = {};
- if(cell.f) attr["ss:Formula"] = "=" + escapexml(a1_to_rc(cell.f, addr));
- if(cell.F && cell.F.slice(0, ref.length) == ref) {
- var end = decode_cell(cell.F.slice(ref.length + 1));
- attr["ss:ArrayRange"] = "RC:R" + (end.r == addr.r ? "" : "[" + (end.r - addr.r) + "]") + "C" + (end.c == addr.c ? "" : "[" + (end.c - addr.c) + "]");
- }
-
- if(cell.l && cell.l.Target) {
- attr["ss:HRef"] = escapexml(cell.l.Target);
- if(cell.l.Tooltip) attr["x:HRefScreenTip"] = escapexml(cell.l.Tooltip);
- }
-
- if(ws['!merges']) {
- var marr = ws['!merges'];
- for(var mi = 0; mi != marr.length; ++mi) {
- if(marr[mi].s.c != addr.c || marr[mi].s.r != addr.r) continue;
- if(marr[mi].e.c > marr[mi].s.c) attr['ss:MergeAcross'] = marr[mi].e.c - marr[mi].s.c;
- if(marr[mi].e.r > marr[mi].s.r) attr['ss:MergeDown'] = marr[mi].e.r - marr[mi].s.r;
- }
- }
-
- var t = "", p = "";
- switch(cell.t) {
- case 'z': if(!opts.sheetStubs) return ""; break;
- case 'n': t = 'Number'; p = String(cell.v); break;
- case 'b': t = 'Boolean'; p = (cell.v ? "1" : "0"); break;
- case 'e': t = 'Error'; p = BErr[cell.v]; break;
- case 'd': t = 'DateTime'; p = new Date(cell.v).toISOString(); if(cell.z == null) cell.z = cell.z || SSF._table[14]; break;
- case 's': t = 'String'; p = escapexlml(cell.v||""); break;
- }
- /* TODO: cell style */
- var os = get_cell_style(opts.cellXfs, cell, opts);
- attr["ss:StyleID"] = "s" + (21+os);
- attr["ss:Index"] = addr.c + 1;
- var _v = (cell.v != null ? p : "");
- var m = cell.t == 'z' ? "" : ('<Data ss:Type="' + t + '">' + _v + '</Data>');
-
- if((cell.c||[]).length > 0) m += write_ws_xlml_comment(cell.c);
-
- return writextag("Cell", m, attr);
- }
- function write_ws_xlml_row(R, row) {
- var o = '<Row ss:Index="' + (R+1) + '"';
- if(row) {
- if(row.hpt && !row.hpx) row.hpx = pt2px(row.hpt);
- if(row.hpx) o += ' ss:AutoFitHeight="0" ss:Height="' + row.hpx + '"';
- if(row.hidden) o += ' ss:Hidden="1"';
- }
- return o + '>';
- }
- /* TODO */
- function write_ws_xlml_table(ws, opts, idx, wb) {
- if(!ws['!ref']) return "";
- var range = safe_decode_range(ws['!ref']);
- var marr = ws['!merges'] || [], mi = 0;
- var o = [];
- if(ws['!cols']) ws['!cols'].forEach(function(n, i) {
- process_col(n);
- var w = !!n.width;
- var p = col_obj_w(i, n);
- var k = {"ss:Index":i+1};
- if(w) k['ss:Width'] = width2px(p.width);
- if(n.hidden) k['ss:Hidden']="1";
- o.push(writextag("Column",null,k));
- });
- var dense = Array.isArray(ws);
- for(var R = range.s.r; R <= range.e.r; ++R) {
- var row = [write_ws_xlml_row(R, (ws['!rows']||[])[R])];
- for(var C = range.s.c; C <= range.e.c; ++C) {
- var skip = false;
- for(mi = 0; mi != marr.length; ++mi) {
- if(marr[mi].s.c > C) continue;
- if(marr[mi].s.r > R) continue;
- if(marr[mi].e.c < C) continue;
- if(marr[mi].e.r < R) continue;
- if(marr[mi].s.c != C || marr[mi].s.r != R) skip = true;
- break;
- }
- if(skip) continue;
- var addr = {r:R,c:C};
- var ref = encode_cell(addr), cell = dense ? (ws[R]||[])[C] : ws[ref];
- row.push(write_ws_xlml_cell(cell, ref, ws, opts, idx, wb, addr));
- }
- row.push("</Row>");
- if(row.length > 2) o.push(row.join(""));
- }
- return o.join("");
- }
- function write_ws_xlml(idx, opts, wb) {
- var o = [];
- var s = wb.SheetNames[idx];
- var ws = wb.Sheets[s];
-
- var t = ws ? write_ws_xlml_names(ws, opts, idx, wb) : "";
- if(t.length > 0) o.push("<Names>" + t + "</Names>");
-
- /* Table */
- t = ws ? write_ws_xlml_table(ws, opts, idx, wb) : "";
- if(t.length > 0) o.push("<Table>" + t + "</Table>");
-
- /* WorksheetOptions */
- o.push(write_ws_xlml_wsopts(ws, opts, idx, wb));
-
- return o.join("");
- }
- function write_xlml(wb, opts) {
- if(!opts) opts = {};
- if(!wb.SSF) wb.SSF = SSF.get_table();
- if(wb.SSF) {
- make_ssf(SSF); SSF.load_table(wb.SSF);
- // $FlowIgnore
- opts.revssf = evert_num(wb.SSF); opts.revssf[wb.SSF[65535]] = 0;
- opts.ssf = wb.SSF;
- opts.cellXfs = [];
- get_cell_style(opts.cellXfs, {}, {revssf:{"General":0}});
- }
- var d = [];
- d.push(write_props_xlml(wb, opts));
- d.push(write_wb_xlml(wb, opts));
- d.push("");
- d.push("");
- for(var i = 0; i < wb.SheetNames.length; ++i)
- d.push(writextag("Worksheet", write_ws_xlml(i, opts, wb), {"ss:Name":escapexml(wb.SheetNames[i])}));
- d[2] = write_sty_xlml(wb, opts);
- d[3] = write_names_xlml(wb, opts);
- return XML_HEADER + writextag("Workbook", d.join(""), {
- 'xmlns': XLMLNS.ss,
- 'xmlns:o': XLMLNS.o,
- 'xmlns:x': XLMLNS.x,
- 'xmlns:ss': XLMLNS.ss,
- 'xmlns:dt': XLMLNS.dt,
- 'xmlns:html': XLMLNS.html
- });
- }
- /* [MS-OLEDS] 2.3.8 CompObjStream */
- function parse_compobj(obj) {
- var v = {};
- var o = obj.content;
- /* [MS-OLEDS] 2.3.7 CompObjHeader -- All fields MUST be ignored */
- o.l = 28;
-
- v.AnsiUserType = o.read_shift(0, "lpstr-ansi");
- v.AnsiClipboardFormat = parse_ClipboardFormatOrAnsiString(o);
-
- if(o.length - o.l <= 4) return v;
-
- var m = o.read_shift(4);
- if(m == 0 || m > 40) return v;
- o.l-=4; v.Reserved1 = o.read_shift(0, "lpstr-ansi");
-
- if(o.length - o.l <= 4) return v;
- m = o.read_shift(4);
- if(m !== 0x71b239f4) return v;
- v.UnicodeClipboardFormat = parse_ClipboardFormatOrUnicodeString(o);
-
- m = o.read_shift(4);
- if(m == 0 || m > 40) return v;
- o.l-=4; v.Reserved2 = o.read_shift(0, "lpwstr");
- }
-
- /*
- Continue logic for:
- - 2.4.58 Continue
- - 2.4.59 ContinueBigName
- - 2.4.60 ContinueFrt
- - 2.4.61 ContinueFrt11
- - 2.4.62 ContinueFrt12
- */
- function slurp(R, blob, length, opts) {
- var l = length;
- var bufs = [];
- var d = blob.slice(blob.l,blob.l+l);
- if(opts && opts.enc && opts.enc.insitu && d.length > 0) switch(R.n) {
- case 'BOF': case 'FilePass': case 'FileLock': case 'InterfaceHdr': case 'RRDInfo': case 'RRDHead': case 'UsrExcl': case 'EOF':
- break;
- case 'BoundSheet8':
- break;
- default:
- opts.enc.insitu(d);
- }
- bufs.push(d);
- blob.l += l;
- var next = (XLSRecordEnum[__readUInt16LE(blob,blob.l)]);
- var start = 0;
- while(next != null && next.n.slice(0,8) === 'Continue') {
- l = __readUInt16LE(blob,blob.l+2);
- start = blob.l + 4;
- if(next.n == 'ContinueFrt') start += 4;
- else if(next.n.slice(0,11) == 'ContinueFrt') {
- start += 12;
- }
- d = blob.slice(start,blob.l+4+l);
- bufs.push(d);
- blob.l += 4+l;
- next = (XLSRecordEnum[__readUInt16LE(blob, blob.l)]);
- }
- var b = (bconcat(bufs));
- prep_blob(b, 0);
- var ll = 0; b.lens = [];
- for(var j = 0; j < bufs.length; ++j) { b.lens.push(ll); ll += bufs[j].length; }
- if(b.length < length) throw "XLS Record " + (R && R.n || "??") + " Truncated: " + b.length + " < " + length;
- return R.f(b, b.length, opts);
- }
-
- function safe_format_xf(p, opts, date1904) {
- if(p.t === 'z') return;
- if(!p.XF) return;
- var fmtid = 0;
- try {
- fmtid = p.z || p.XF.numFmtId || 0;
- if(opts.cellNF) p.z = SSF._table[fmtid];
- } catch(e) { if(opts.WTF) throw e; }
- if(!opts || opts.cellText !== false) try {
- if(p.t === 'e') { p.w = p.w || BErr[p.v]; }
- else if(fmtid === 0 || fmtid == "General") {
- if(p.t === 'n') {
- if((p.v|0) === p.v) p.w = SSF._general_int(p.v);
- else p.w = SSF._general_num(p.v);
- }
- else p.w = SSF._general(p.v);
- }
- else p.w = SSF.format(fmtid,p.v, {date1904:!!date1904});
- } catch(e) { if(opts.WTF) throw e; }
- if(opts.cellDates && fmtid && p.t == 'n' && SSF.is_date(SSF._table[fmtid] || String(fmtid))) {
- 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); }
- }
- }
-
- function make_cell(val, ixfe, t) {
- return ({v:val, ixfe:ixfe, t:t});
- }
-
- // 2.3.2
- function parse_workbook(blob, options) {
- var wb = ({opts:{}});
- var Sheets = {};
- if(DENSE != null && options.dense == null) options.dense = DENSE;
- var out = ((options.dense ? [] : {}));
- var Directory = {};
- var range = ({});
- var last_formula = null;
- var sst = ([]);
- var cur_sheet = "";
- var Preamble = {};
- var lastcell, last_cell = "", cc, cmnt, rngC, rngR;
- var sharedf = {};
- var arrayf = [];
- var temp_val;
- var country;
- var cell_valid = true;
- var XFs = []; /* XF records */
- var palette = [];
- var Workbook = ({ Sheets:[], WBProps:{date1904:false}, Views:[{}] }), wsprops = {};
- var get_rgb = function getrgb(icv) {
- if(icv < 8) return XLSIcv[icv];
- if(icv < 64) return palette[icv-8] || XLSIcv[icv];
- return XLSIcv[icv];
- };
- var process_cell_style = function pcs(cell, line, options) {
- var xfd = line.XF.data;
- if(!xfd || !xfd.patternType || !options || !options.cellStyles) return;
- line.s = ({});
- line.s.patternType = xfd.patternType;
- var t;
- if((t = rgb2Hex(get_rgb(xfd.icvFore)))) { line.s.fgColor = {rgb:t}; }
- if((t = rgb2Hex(get_rgb(xfd.icvBack)))) { line.s.bgColor = {rgb:t}; }
- };
- var addcell = function addcell(cell, line, options) {
- if(file_depth > 1) return;
- if(options.sheetRows && cell.r >= options.sheetRows) cell_valid = false;
- if(!cell_valid) return;
- if(options.cellStyles && line.XF && line.XF.data) process_cell_style(cell, line, options);
- delete line.ixfe; delete line.XF;
- lastcell = cell;
- last_cell = encode_cell(cell);
- if(!range || !range.s || !range.e) range = {s:{r:0,c:0},e:{r:0,c:0}};
- if(cell.r < range.s.r) range.s.r = cell.r;
- if(cell.c < range.s.c) range.s.c = cell.c;
- if(cell.r + 1 > range.e.r) range.e.r = cell.r + 1;
- if(cell.c + 1 > range.e.c) range.e.c = cell.c + 1;
- if(options.cellFormula && line.f) {
- for(var afi = 0; afi < arrayf.length; ++afi) {
- if(arrayf[afi][0].s.c > cell.c || arrayf[afi][0].s.r > cell.r) continue;
- if(arrayf[afi][0].e.c < cell.c || arrayf[afi][0].e.r < cell.r) continue;
- line.F = encode_range(arrayf[afi][0]);
- if(arrayf[afi][0].s.c != cell.c || arrayf[afi][0].s.r != cell.r) delete line.f;
- if(line.f) line.f = "" + stringify_formula(arrayf[afi][1], range, cell, supbooks, opts);
- break;
- }
- }
- {
- if(options.dense) {
- if(!out[cell.r]) out[cell.r] = [];
- out[cell.r][cell.c] = line;
- } else out[last_cell] = line;
- }
- };
- var opts = ({
- enc: false, // encrypted
- sbcch: 0, // cch in the preceding SupBook
- snames: [], // sheetnames
- sharedf: sharedf, // shared formulae by address
- arrayf: arrayf, // array formulae array
- rrtabid: [], // RRTabId
- lastuser: "", // Last User from WriteAccess
- biff: 8, // BIFF version
- codepage: 0, // CP from CodePage record
- winlocked: 0, // fLockWn from WinProtect
- cellStyles: !!options && !!options.cellStyles,
- WTF: !!options && !!options.wtf
- });
- if(options.password) opts.password = options.password;
- var themes;
- var merges = [];
- var objects = [];
- var colinfo = [], rowinfo = [];
- // eslint-disable-next-line no-unused-vars
- var defwidth = 0, defheight = 0; // twips / MDW respectively
- var seencol = false;
- var supbooks = ([]); // 1-indexed, will hold extern names
- supbooks.SheetNames = opts.snames;
- supbooks.sharedf = opts.sharedf;
- supbooks.arrayf = opts.arrayf;
- supbooks.names = [];
- supbooks.XTI = [];
- var last_Rn = '';
- var file_depth = 0; /* TODO: make a real stack */
- var BIFF2Fmt = 0, BIFF2FmtTable = [];
- var FilterDatabases = []; /* TODO: sort out supbooks and process elsewhere */
- var last_lbl;
-
- /* explicit override for some broken writers */
- opts.codepage = 1200;
- set_cp(1200);
- var seen_codepage = false;
- while(blob.l < blob.length - 1) {
- var s = blob.l;
- var RecordType = blob.read_shift(2);
- if(RecordType === 0 && last_Rn === 'EOF') break;
- var length = (blob.l === blob.length ? 0 : blob.read_shift(2));
- var R = XLSRecordEnum[RecordType];
- //console.log(RecordType.toString(16), RecordType, R, blob.l, length, blob.length);
- //if(!R) console.log(blob.slice(blob.l, blob.l + length));
- if(R && R.f) {
- if(options.bookSheets) {
- if(last_Rn === 'BoundSheet8' && R.n !== 'BoundSheet8') break;
- }
- last_Rn = R.n;
- if(R.r === 2 || R.r == 12) {
- var rt = blob.read_shift(2); length -= 2;
- if(!opts.enc && rt !== RecordType && (((rt&0xFF)<<8)|(rt>>8)) !== RecordType) throw new Error("rt mismatch: " + rt + "!=" + RecordType);
- if(R.r == 12){ blob.l += 10; length -= 10; } // skip FRT
- }
- //console.error(R,blob.l,length,blob.length);
- var val = ({});
- if(R.n === 'EOF') val = R.f(blob, length, opts);
- else val = slurp(R, blob, length, opts);
- var Rn = R.n;
- if(file_depth == 0 && Rn != 'BOF') continue;
- /* nested switch statements to workaround V8 128 limit */
- switch(Rn) {
- /* Workbook Options */
- case 'Date1904':
- wb.opts.Date1904 = Workbook.WBProps.date1904 = val; break;
- case 'WriteProtect': wb.opts.WriteProtect = true; break;
- case 'FilePass':
- if(!opts.enc) blob.l = 0;
- opts.enc = val;
- if(!options.password) throw new Error("File is password-protected");
- if(val.valid == null) throw new Error("Encryption scheme unsupported");
- if(!val.valid) throw new Error("Password is incorrect");
- break;
- case 'WriteAccess': opts.lastuser = val; break;
- case 'FileSharing': break; //TODO
- case 'CodePage':
- var cpval = Number(val);
- /* overrides based on test cases */
- switch(cpval) {
- case 0x5212: cpval = 1200; break;
- case 0x8000: cpval = 10000; break;
- case 0x8001: cpval = 1252; break;
- }
- set_cp(opts.codepage = cpval);
- seen_codepage = true;
- break;
- case 'RRTabId': opts.rrtabid = val; break;
- case 'WinProtect': opts.winlocked = val; break;
- case 'Template': break; // TODO
- case 'BookBool': break; // TODO
- case 'UsesELFs': break;
- case 'MTRSettings': break;
- case 'RefreshAll':
- case 'CalcCount':
- case 'CalcDelta':
- case 'CalcIter':
- case 'CalcMode':
- case 'CalcPrecision':
- case 'CalcSaveRecalc':
- wb.opts[Rn] = val; break;
- case 'CalcRefMode': opts.CalcRefMode = val; break; // TODO: implement R1C1
- case 'Uncalced': break;
- case 'ForceFullCalculation': wb.opts.FullCalc = val; break;
- case 'WsBool':
- if(val.fDialog) out["!type"] = "dialog";
- break; // TODO
- case 'XF':
- XFs.push(val); break;
- case 'ExtSST': break; // TODO
- case 'BookExt': break; // TODO
- case 'RichTextStream': break;
- case 'BkHim': break;
-
- case 'SupBook':
- supbooks.push([val]);
- supbooks[supbooks.length-1].XTI = [];
- break;
- case 'ExternName':
- supbooks[supbooks.length-1].push(val);
- break;
- case 'Index': break; // TODO
- case 'Lbl':
- last_lbl = ({
- Name: val.Name,
- Ref: stringify_formula(val.rgce,range,null,supbooks,opts)
- });
- if(val.itab > 0) last_lbl.Sheet = val.itab - 1;
- supbooks.names.push(last_lbl);
- if(!supbooks[0]) { supbooks[0] = []; supbooks[0].XTI = []; }
- supbooks[supbooks.length-1].push(val);
- if(val.Name == "_xlnm._FilterDatabase" && val.itab > 0)
- if(val.rgce && val.rgce[0] && val.rgce[0][0] && val.rgce[0][0][0] == 'PtgArea3d')
- FilterDatabases[val.itab - 1] = { ref: encode_range(val.rgce[0][0][1][2]) };
- break;
- case 'ExternCount': opts.ExternCount = val; break;
- case 'ExternSheet':
- if(supbooks.length == 0) { supbooks[0] = []; supbooks[0].XTI = []; }
- supbooks[supbooks.length - 1].XTI = supbooks[supbooks.length - 1].XTI.concat(val); supbooks.XTI = supbooks.XTI.concat(val); break;
- case 'NameCmt':
- /* TODO: search for correct name */
- if(opts.biff < 8) break;
- if(last_lbl != null) last_lbl.Comment = val[1];
- break;
-
- case 'Protect': out["!protect"] = val; break; /* for sheet or book */
- case 'Password': if(val !== 0 && opts.WTF) console.error("Password verifier: " + val); break;
- case 'Prot4Rev': case 'Prot4RevPass': break; /*TODO: Revision Control*/
-
- case 'BoundSheet8': {
- Directory[val.pos] = val;
- opts.snames.push(val.name);
- } break;
- case 'EOF': {
- if(--file_depth) break;
- if(range.e) {
- if(range.e.r > 0 && range.e.c > 0) {
- range.e.r--; range.e.c--;
- out["!ref"] = encode_range(range);
- if(options.sheetRows && options.sheetRows <= range.e.r) {
- var tmpri = range.e.r;
- range.e.r = options.sheetRows - 1;
- out["!fullref"] = out["!ref"];
- out["!ref"] = encode_range(range);
- range.e.r = tmpri;
- }
- range.e.r++; range.e.c++;
- }
- if(merges.length > 0) out["!merges"] = merges;
- if(objects.length > 0) out["!objects"] = objects;
- if(colinfo.length > 0) out["!cols"] = colinfo;
- if(rowinfo.length > 0) out["!rows"] = rowinfo;
- Workbook.Sheets.push(wsprops);
- }
- if(cur_sheet === "") Preamble = out; else Sheets[cur_sheet] = out;
- out = ((options.dense ? [] : {}));
- } break;
- case 'BOF': {
- if(opts.biff === 8) opts.biff = {
- 0x0009:2,
- 0x0209:3,
- 0x0409:4
- }[RecordType] || {
- 0x0200:2,
- 0x0300:3,
- 0x0400:4,
- 0x0500:5,
- 0x0600:8,
- 0x0002:2,
- 0x0007:2
- }[val.BIFFVer] || 8;
- if(opts.biff == 8 && val.BIFFVer == 0 && val.dt == 16) opts.biff = 2;
- if(file_depth++) break;
- cell_valid = true;
- out = ((options.dense ? [] : {}));
-
- if(opts.biff < 8 && !seen_codepage) { seen_codepage = true; set_cp(opts.codepage = options.codepage || 1252); }
- if(opts.biff < 5) {
- if(cur_sheet === "") cur_sheet = "Sheet1";
- range = {s:{r:0,c:0},e:{r:0,c:0}};
- /* fake BoundSheet8 */
- var fakebs8 = {pos: blob.l - length, name:cur_sheet};
- Directory[fakebs8.pos] = fakebs8;
- opts.snames.push(cur_sheet);
- }
- else cur_sheet = (Directory[s] || {name:""}).name;
- if(val.dt == 0x20) out["!type"] = "chart";
- if(val.dt == 0x40) out["!type"] = "macro";
- merges = [];
- objects = [];
- opts.arrayf = arrayf = [];
- colinfo = []; rowinfo = [];
- defwidth = defheight = 0;
- seencol = false;
- wsprops = {Hidden:(Directory[s]||{hs:0}).hs, name:cur_sheet };
- } break;
-
- case 'Number': case 'BIFF2NUM': case 'BIFF2INT': {
- if(out["!type"] == "chart") if(options.dense ? (out[val.r]||[])[val.c]: out[encode_cell({c:val.c, r:val.r})]) ++val.c;
- temp_val = ({ixfe: val.ixfe, XF: XFs[val.ixfe]||{}, v:val.val, t:'n'});
- if(BIFF2Fmt > 0) temp_val.z = BIFF2FmtTable[(temp_val.ixfe>>8) & 0x1F];
- safe_format_xf(temp_val, options, wb.opts.Date1904);
- addcell({c:val.c, r:val.r}, temp_val, options);
- } break;
- case 'BoolErr': {
- temp_val = ({ixfe: val.ixfe, XF: XFs[val.ixfe], v:val.val, t:val.t});
- if(BIFF2Fmt > 0) temp_val.z = BIFF2FmtTable[(temp_val.ixfe>>8) & 0x1F];
- safe_format_xf(temp_val, options, wb.opts.Date1904);
- addcell({c:val.c, r:val.r}, temp_val, options);
- } break;
- case 'RK': {
- temp_val = ({ixfe: val.ixfe, XF: XFs[val.ixfe], v:val.rknum, t:'n'});
- if(BIFF2Fmt > 0) temp_val.z = BIFF2FmtTable[(temp_val.ixfe>>8) & 0x1F];
- safe_format_xf(temp_val, options, wb.opts.Date1904);
- addcell({c:val.c, r:val.r}, temp_val, options);
- } break;
- case 'MulRk': {
- for(var j = val.c; j <= val.C; ++j) {
- var ixfe = val.rkrec[j-val.c][0];
- temp_val= ({ixfe:ixfe, XF:XFs[ixfe], v:val.rkrec[j-val.c][1], t:'n'});
- if(BIFF2Fmt > 0) temp_val.z = BIFF2FmtTable[(temp_val.ixfe>>8) & 0x1F];
- safe_format_xf(temp_val, options, wb.opts.Date1904);
- addcell({c:j, r:val.r}, temp_val, options);
- }
- } break;
- case 'Formula': {
- if(val.val == 'String') { last_formula = val; break; }
- temp_val = make_cell(val.val, val.cell.ixfe, val.tt);
- temp_val.XF = XFs[temp_val.ixfe];
- if(options.cellFormula) {
- var _f = val.formula;
- if(_f && _f[0] && _f[0][0] && _f[0][0][0] == 'PtgExp') {
- var _fr = _f[0][0][1][0], _fc = _f[0][0][1][1];
- var _fe = encode_cell({r:_fr, c:_fc});
- if(sharedf[_fe]) temp_val.f = ""+stringify_formula(val.formula,range,val.cell,supbooks, opts);
- else temp_val.F = ((options.dense ? (out[_fr]||[])[_fc]: out[_fe]) || {}).F;
- } else temp_val.f = ""+stringify_formula(val.formula,range,val.cell,supbooks, opts);
- }
- if(BIFF2Fmt > 0) temp_val.z = BIFF2FmtTable[(temp_val.ixfe>>8) & 0x1F];
- safe_format_xf(temp_val, options, wb.opts.Date1904);
- addcell(val.cell, temp_val, options);
- last_formula = val;
- } break;
- case 'String': {
- if(last_formula) { /* technically always true */
- last_formula.val = val;
- temp_val = make_cell(val, last_formula.cell.ixfe, 's');
- temp_val.XF = XFs[temp_val.ixfe];
- if(options.cellFormula) {
- temp_val.f = ""+stringify_formula(last_formula.formula, range, last_formula.cell, supbooks, opts);
- }
- if(BIFF2Fmt > 0) temp_val.z = BIFF2FmtTable[(temp_val.ixfe>>8) & 0x1F];
- safe_format_xf(temp_val, options, wb.opts.Date1904);
- addcell(last_formula.cell, temp_val, options);
- last_formula = null;
- } else throw new Error("String record expects Formula");
- } break;
- case 'Array': {
- arrayf.push(val);
- var _arraystart = encode_cell(val[0].s);
- cc = options.dense ? (out[val[0].s.r]||[])[val[0].s.c] : out[_arraystart];
- if(options.cellFormula && cc) {
- if(!last_formula) break; /* technically unreachable */
- if(!_arraystart || !cc) break;
- cc.f = ""+stringify_formula(val[1], range, val[0], supbooks, opts);
- cc.F = encode_range(val[0]);
- }
- } break;
- case 'ShrFmla': {
- if(!cell_valid) break;
- if(!options.cellFormula) break;
- if(last_cell) {
- /* TODO: capture range */
- if(!last_formula) break; /* technically unreachable */
- sharedf[encode_cell(last_formula.cell)]= val[0];
- cc = options.dense ? (out[last_formula.cell.r]||[])[last_formula.cell.c] : out[encode_cell(last_formula.cell)];
- (cc||{}).f = ""+stringify_formula(val[0], range, lastcell, supbooks, opts);
- }
- } break;
- case 'LabelSst':
- temp_val=make_cell(sst[val.isst].t, val.ixfe, 's');
- if(sst[val.isst].h) temp_val.h = sst[val.isst].h;
- temp_val.XF = XFs[temp_val.ixfe];
- if(BIFF2Fmt > 0) temp_val.z = BIFF2FmtTable[(temp_val.ixfe>>8) & 0x1F];
- safe_format_xf(temp_val, options, wb.opts.Date1904);
- addcell({c:val.c, r:val.r}, temp_val, options);
- break;
- case 'Blank': if(options.sheetStubs) {
- temp_val = ({ixfe: val.ixfe, XF: XFs[val.ixfe], t:'z'});
- if(BIFF2Fmt > 0) temp_val.z = BIFF2FmtTable[(temp_val.ixfe>>8) & 0x1F];
- safe_format_xf(temp_val, options, wb.opts.Date1904);
- addcell({c:val.c, r:val.r}, temp_val, options);
- } break;
- case 'MulBlank': if(options.sheetStubs) {
- for(var _j = val.c; _j <= val.C; ++_j) {
- var _ixfe = val.ixfe[_j-val.c];
- temp_val= ({ixfe:_ixfe, XF:XFs[_ixfe], t:'z'});
- if(BIFF2Fmt > 0) temp_val.z = BIFF2FmtTable[(temp_val.ixfe>>8) & 0x1F];
- safe_format_xf(temp_val, options, wb.opts.Date1904);
- addcell({c:_j, r:val.r}, temp_val, options);
- }
- } break;
- case 'RString':
- case 'Label': case 'BIFF2STR':
- temp_val=make_cell(val.val, val.ixfe, 's');
- temp_val.XF = XFs[temp_val.ixfe];
- if(BIFF2Fmt > 0) temp_val.z = BIFF2FmtTable[(temp_val.ixfe>>8) & 0x1F];
- safe_format_xf(temp_val, options, wb.opts.Date1904);
- addcell({c:val.c, r:val.r}, temp_val, options);
- break;
-
- case 'Dimensions': {
- if(file_depth === 1) range = val; /* TODO: stack */
- } break;
- case 'SST': {
- sst = val;
- } break;
- case 'Format': { /* val = [id, fmt] */
- if(opts.biff == 4) {
- BIFF2FmtTable[BIFF2Fmt++] = val[1];
- for(var b4idx = 0; b4idx < BIFF2Fmt + 163; ++b4idx) if(SSF._table[b4idx] == val[1]) break;
- if(b4idx >= 163) SSF.load(val[1], BIFF2Fmt + 163);
- }
- else SSF.load(val[1], val[0]);
- } break;
- case 'BIFF2FORMAT': {
- BIFF2FmtTable[BIFF2Fmt++] = val;
- for(var b2idx = 0; b2idx < BIFF2Fmt + 163; ++b2idx) if(SSF._table[b2idx] == val) break;
- if(b2idx >= 163) SSF.load(val, BIFF2Fmt + 163);
- } break;
-
- case 'MergeCells': merges = merges.concat(val); break;
-
- case 'Obj': objects[val.cmo[0]] = opts.lastobj = val; break;
- case 'TxO': opts.lastobj.TxO = val; break;
- case 'ImData': opts.lastobj.ImData = val; break;
-
- case 'HLink': {
- for(rngR = val[0].s.r; rngR <= val[0].e.r; ++rngR)
- for(rngC = val[0].s.c; rngC <= val[0].e.c; ++rngC) {
- cc = options.dense ? (out[rngR]||[])[rngC] : out[encode_cell({c:rngC,r:rngR})];
- if(cc) cc.l = val[1];
- }
- } break;
- case 'HLinkTooltip': {
- for(rngR = val[0].s.r; rngR <= val[0].e.r; ++rngR)
- for(rngC = val[0].s.c; rngC <= val[0].e.c; ++rngC) {
- cc = options.dense ? (out[rngR]||[])[rngC] : out[encode_cell({c:rngC,r:rngR})];
- if(cc && cc.l) cc.l.Tooltip = val[1];
- }
- } break;
-
- /* Comments */
- case 'Note': {
- if(opts.biff <= 5 && opts.biff >= 2) break; /* TODO: BIFF5 */
- cc = options.dense ? (out[val[0].r]||[])[val[0].c] : out[encode_cell(val[0])];
- var noteobj = objects[val[2]];
- if(!cc) {
- if(options.dense) {
- if(!out[val[0].r]) out[val[0].r] = [];
- cc = out[val[0].r][val[0].c] = ({t:"z"});
- } else {
- cc = out[encode_cell(val[0])] = ({t:"z"});
- }
- range.e.r = Math.max(range.e.r, val[0].r);
- range.s.r = Math.min(range.s.r, val[0].r);
- range.e.c = Math.max(range.e.c, val[0].c);
- range.s.c = Math.min(range.s.c, val[0].c);
- }
- if(!cc.c) cc.c = [];
- cmnt = {a:val[1],t:noteobj.TxO.t};
- cc.c.push(cmnt);
- } break;
-
- default: switch(R.n) { /* nested */
- case 'ClrtClient': break;
- case 'XFExt': update_xfext(XFs[val.ixfe], val.ext); break;
-
- case 'DefColWidth': defwidth = val; break;
- case 'DefaultRowHeight': defheight = val[1]; break; // TODO: flags
-
- case 'ColInfo': {
- if(!opts.cellStyles) break;
- while(val.e >= val.s) {
- colinfo[val.e--] = { width: val.w/256 };
- if(!seencol) { seencol = true; find_mdw_colw(val.w/256); }
- process_col(colinfo[val.e+1]);
- }
- } break;
- case 'Row': {
- var rowobj = {};
- if(val.level != null) { rowinfo[val.r] = rowobj; rowobj.level = val.level; }
- if(val.hidden) { rowinfo[val.r] = rowobj; rowobj.hidden = true; }
- if(val.hpt) {
- rowinfo[val.r] = rowobj;
- rowobj.hpt = val.hpt; rowobj.hpx = pt2px(val.hpt);
- }
- } break;
-
- case 'LeftMargin':
- case 'RightMargin':
- case 'TopMargin':
- case 'BottomMargin':
- if(!out['!margins']) default_margins(out['!margins'] = {});
- out['!margins'][Rn.slice(0,-6).toLowerCase()] = val;
- break;
-
- case 'Setup': // TODO
- if(!out['!margins']) default_margins(out['!margins'] = {});
- out['!margins'].header = val.header;
- out['!margins'].footer = val.footer;
- break;
-
- case 'Window2': // TODO
- // $FlowIgnore
- if(val.RTL) Workbook.Views[0].RTL = true;
- break;
-
- case 'Header': break; // TODO
- case 'Footer': break; // TODO
- case 'HCenter': break; // TODO
- case 'VCenter': break; // TODO
- case 'Pls': break; // TODO
- case 'GCW': break;
- case 'LHRecord': break;
- case 'DBCell': break; // TODO
- case 'EntExU2': break; // TODO
- case 'SxView': break; // TODO
- case 'Sxvd': break; // TODO
- case 'SXVI': break; // TODO
- case 'SXVDEx': break; // TODO
- case 'SxIvd': break; // TODO
- case 'SXString': break; // TODO
- case 'Sync': break;
- case 'Addin': break;
- case 'SXDI': break; // TODO
- case 'SXLI': break; // TODO
- case 'SXEx': break; // TODO
- case 'QsiSXTag': break; // TODO
- case 'Selection': break;
- case 'Feat': break;
- case 'FeatHdr': case 'FeatHdr11': break;
- case 'Feature11': case 'Feature12': case 'List12': break;
- case 'Country': country = val; break;
- case 'RecalcId': break;
- case 'DxGCol': break; // TODO: htmlify
- case 'Fbi': case 'Fbi2': case 'GelFrame': break;
- case 'Font': break; // TODO
- case 'XFCRC': break; // TODO
- case 'Style': break; // TODO
- case 'StyleExt': break; // TODO
- case 'Palette': palette = val; break;
- case 'Theme': themes = val; break;
- /* Protection */
- case 'ScenarioProtect': break;
- case 'ObjProtect': break;
-
- /* Conditional Formatting */
- case 'CondFmt12': break;
-
- /* Table */
- case 'Table': break; // TODO
- case 'TableStyles': break; // TODO
- case 'TableStyle': break; // TODO
- case 'TableStyleElement': break; // TODO
-
- /* PivotTable */
- case 'SXStreamID': break; // TODO
- case 'SXVS': break; // TODO
- case 'DConRef': break; // TODO
- case 'SXAddl': break; // TODO
- case 'DConBin': break; // TODO
- case 'DConName': break; // TODO
- case 'SXPI': break; // TODO
- case 'SxFormat': break; // TODO
- case 'SxSelect': break; // TODO
- case 'SxRule': break; // TODO
- case 'SxFilt': break; // TODO
- case 'SxItm': break; // TODO
- case 'SxDXF': break; // TODO
-
- /* Scenario Manager */
- case 'ScenMan': break;
-
- /* Data Consolidation */
- case 'DCon': break;
-
- /* Watched Cell */
- case 'CellWatch': break;
-
- /* Print Settings */
- case 'PrintRowCol': break;
- case 'PrintGrid': break;
- case 'PrintSize': break;
-
- case 'XCT': break;
- case 'CRN': break;
-
- case 'Scl': {
- //console.log("Zoom Level:", val[0]/val[1],val);
- } break;
- case 'SheetExt': {
- /* empty */
- } break;
- case 'SheetExtOptional': {
- /* empty */
- } break;
-
- /* VBA */
- case 'ObNoMacros': {
- /* empty */
- } break;
- case 'ObProj': {
- /* empty */
- } break;
- case 'CodeName': {
- if(!cur_sheet) Workbook.WBProps.CodeName = val || "ThisWorkbook";
- else wsprops.CodeName = val || wsprops.name;
- } break;
- case 'GUIDTypeLib': {
- /* empty */
- } break;
-
- case 'WOpt': break; // TODO: WTF?
- case 'PhoneticInfo': break;
-
- case 'OleObjectSize': break;
-
- /* Differential Formatting */
- case 'DXF': case 'DXFN': case 'DXFN12': case 'DXFN12List': case 'DXFN12NoCB': break;
-
- /* Data Validation */
- case 'Dv': case 'DVal': break;
-
- /* Data Series */
- case 'BRAI': case 'Series': case 'SeriesText': break;
-
- /* Data Connection */
- case 'DConn': break;
- case 'DbOrParamQry': break;
- case 'DBQueryExt': break;
-
- case 'OleDbConn': break;
- case 'ExtString': break;
-
- /* Formatting */
- case 'IFmtRecord': break;
- case 'CondFmt': case 'CF': case 'CF12': case 'CFEx': break;
-
- /* Explicitly Ignored */
- case 'Excel9File': break;
- case 'Units': break;
- case 'InterfaceHdr': case 'Mms': case 'InterfaceEnd': case 'DSF': break;
- case 'BuiltInFnGroupCount': /* 2.4.30 0x0E or 0x10 but excel 2011 generates 0x11? */ break;
- /* View Stuff */
- case 'Window1': case 'HideObj': case 'GridSet': case 'Guts':
- case 'UserBView': case 'UserSViewBegin': case 'UserSViewEnd': break;
- case 'Pane': break;
- default: switch(R.n) { /* nested */
- /* Chart */
- case 'Dat':
- case 'Begin': case 'End':
- case 'StartBlock': case 'EndBlock':
- case 'Frame': case 'Area':
- case 'Axis': case 'AxisLine': case 'Tick': break;
- case 'AxesUsed':
- case 'CrtLayout12': case 'CrtLayout12A': case 'CrtLink': case 'CrtLine': case 'CrtMlFrt': case 'CrtMlFrtContinue': break;
- case 'LineFormat': case 'AreaFormat':
- case 'Chart': case 'Chart3d': case 'Chart3DBarShape': case 'ChartFormat': case 'ChartFrtInfo': break;
- case 'PlotArea': case 'PlotGrowth': break;
- case 'SeriesList': case 'SerParent': case 'SerAuxTrend': break;
- case 'DataFormat': case 'SerToCrt': case 'FontX': break;
- case 'CatSerRange': case 'AxcExt': case 'SerFmt': break;
- case 'ShtProps': break;
- case 'DefaultText': case 'Text': case 'CatLab': break;
- case 'DataLabExtContents': break;
- case 'Legend': case 'LegendException': break;
- case 'Pie': case 'Scatter': break;
- case 'PieFormat': case 'MarkerFormat': break;
- case 'StartObject': case 'EndObject': break;
- case 'AlRuns': case 'ObjectLink': break;
- case 'SIIndex': break;
- case 'AttachedLabel': case 'YMult': break;
-
- /* Chart Group */
- case 'Line': case 'Bar': break;
- case 'Surf': break;
-
- /* Axis Group */
- case 'AxisParent': break;
- case 'Pos': break;
- case 'ValueRange': break;
-
- /* Pivot Chart */
- case 'SXViewEx9': break; // TODO
- case 'SXViewLink': break;
- case 'PivotChartBits': break;
- case 'SBaseRef': break;
- case 'TextPropsStream': break;
-
- /* Chart Misc */
- case 'LnExt': break;
- case 'MkrExt': break;
- case 'CrtCoopt': break;
-
- /* Query Table */
- case 'Qsi': case 'Qsif': case 'Qsir': case 'QsiSXTag': break;
- case 'TxtQry': break;
-
- /* Filter */
- case 'FilterMode': break;
- case 'AutoFilter': case 'AutoFilterInfo': break;
- case 'AutoFilter12': break;
- case 'DropDownObjIds': break;
- case 'Sort': break;
- case 'SortData': break;
-
- /* Drawing */
- case 'ShapePropsStream': break;
- case 'MsoDrawing': case 'MsoDrawingGroup': case 'MsoDrawingSelection': break;
- /* Pub Stuff */
- case 'WebPub': case 'AutoWebPub': break;
-
- /* Print Stuff */
- case 'HeaderFooter': case 'HFPicture': case 'PLV':
- case 'HorizontalPageBreaks': case 'VerticalPageBreaks': break;
- /* Behavioral */
- case 'Backup': case 'CompressPictures': case 'Compat12': break;
-
- /* Should not Happen */
- case 'Continue': case 'ContinueFrt12': break;
-
- /* Future Records */
- case 'FrtFontList': case 'FrtWrapper': break;
-
- default: switch(R.n) { /* nested */
- /* BIFF5 records */
- case 'TabIdConf': case 'Radar': case 'RadarArea': case 'DropBar': case 'Intl': case 'CoordList': case 'SerAuxErrBar': break;
-
- /* BIFF2-4 records */
- case 'BIFF2FONTCLR': case 'BIFF2FMTCNT': case 'BIFF2FONTXTRA': break;
- case 'BIFF2XF': case 'BIFF3XF': case 'BIFF4XF': break;
- case 'BIFF4FMTCNT': case 'BIFF2ROW': case 'BIFF2WINDOW2': break;
-
- /* Miscellaneous */
- case 'SCENARIO': case 'DConBin': case 'PicF': case 'DataLabExt':
- case 'Lel': case 'BopPop': case 'BopPopCustom': case 'RealTimeData':
- case 'Name': break;
- case 'LHNGraph': case 'FnGroupName': case 'AddMenu': case 'LPr': break;
- case 'ListObj': case 'ListField': break;
- case 'RRSort': break;
- case 'BigName': break;
- case 'ToolbarHdr': case 'ToolbarEnd': break;
- case 'DDEObjName': break;
- case 'FRTArchId$': break;
- default: if(options.WTF) throw 'Unrecognized Record ' + R.n;
- }}}}
- } else blob.l += length;
- }
- wb.SheetNames=keys(Directory).sort(function(a,b) { return Number(a) - Number(b); }).map(function(x){return Directory[x].name;});
- if(!options.bookSheets) wb.Sheets=Sheets;
- if(wb.Sheets) FilterDatabases.forEach(function(r,i) { wb.Sheets[wb.SheetNames[i]]['!autofilter'] = r; });
- wb.Preamble=Preamble;
- wb.Strings = sst;
- wb.SSF = SSF.get_table();
- if(opts.enc) wb.Encryption = opts.enc;
- if(themes) wb.Themes = themes;
- wb.Metadata = {};
- if(country !== undefined) wb.Metadata.Country = country;
- if(supbooks.names.length > 0) Workbook.Names = supbooks.names;
- wb.Workbook = Workbook;
- return wb;
- }
-
- /* TODO: split props*/
- var PSCLSID = {
- SI: "e0859ff2f94f6810ab9108002b27b3d9",
- DSI: "02d5cdd59c2e1b10939708002b2cf9ae",
- UDI: "05d5cdd59c2e1b10939708002b2cf9ae"
- };
- function parse_xls_props(cfb, props, o) {
- /* [MS-OSHARED] 2.3.3.2.2 Document Summary Information Property Set */
- var DSI = CFB.find(cfb, '!DocumentSummaryInformation');
- if(DSI && DSI.size > 0) try {
- var DocSummary = parse_PropertySetStream(DSI, DocSummaryPIDDSI, PSCLSID.DSI);
- for(var d in DocSummary) props[d] = DocSummary[d];
- } catch(e) {if(o.WTF) throw e;/* empty */}
-
- /* [MS-OSHARED] 2.3.3.2.1 Summary Information Property Set*/
- var SI = CFB.find(cfb, '!SummaryInformation');
- if(SI && SI.size > 0) try {
- var Summary = parse_PropertySetStream(SI, SummaryPIDSI, PSCLSID.SI);
- for(var s in Summary) if(props[s] == null) props[s] = Summary[s];
- } catch(e) {if(o.WTF) throw e;/* empty */}
-
- if(props.HeadingPairs && props.TitlesOfParts) {
- load_props_pairs(props.HeadingPairs, props.TitlesOfParts, props, o);
- delete props.HeadingPairs; delete props.TitlesOfParts;
- }
- }
- function write_xls_props(wb, cfb) {
- var DSEntries = [], SEntries = [], CEntries = [];
- var i = 0, Keys;
- if(wb.Props) {
- Keys = keys(wb.Props);
- // $FlowIgnore
- 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]]]);
- }
- if(wb.Custprops) {
- Keys = keys(wb.Custprops);
- // $FlowIgnore
- 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]]]);
- }
- var CEntries2 = [];
- for(i = 0; i < CEntries.length; ++i) {
- if(XLSPSSkip.indexOf(CEntries[i][0]) > -1) continue;
- if(CEntries[i][1] == null) continue;
- CEntries2.push(CEntries[i]);
- }
- if(SEntries.length) CFB.utils.cfb_add(cfb, "/\u0005SummaryInformation", write_PropertySetStream(SEntries, PSCLSID.SI, SummaryRE, SummaryPIDSI));
- if(DSEntries.length || CEntries2.length) CFB.utils.cfb_add(cfb, "/\u0005DocumentSummaryInformation", write_PropertySetStream(DSEntries, PSCLSID.DSI, DocSummaryRE, DocSummaryPIDDSI, CEntries2.length ? CEntries2 : null, PSCLSID.UDI));
- }
-
- function parse_xlscfb(cfb, options) {
- if(!options) options = {};
- fix_read_opts(options);
- reset_cp();
- if(options.codepage) set_ansi(options.codepage);
- var CompObj, WB;
- if(cfb.FullPaths) {
- if(CFB.find(cfb, '/encryption')) throw new Error("File is password-protected");
- CompObj = CFB.find(cfb, '!CompObj');
- WB = CFB.find(cfb, '/Workbook') || CFB.find(cfb, '/Book');
- } else {
- switch(options.type) {
- case 'base64': cfb = s2a(Base64.decode(cfb)); break;
- case 'binary': cfb = s2a(cfb); break;
- case 'buffer': break;
- case 'array': if(!Array.isArray(cfb)) cfb = Array.prototype.slice.call(cfb); break;
- }
- prep_blob(cfb, 0);
- WB = ({content: cfb});
- }
- var WorkbookP;
-
- var _data;
- if(CompObj) parse_compobj(CompObj);
- if(options.bookProps && !options.bookSheets) WorkbookP = ({});
- else {
- var T = has_buf ? 'buffer' : 'array';
- if(WB && WB.content) WorkbookP = parse_workbook(WB.content, options);
- /* Quattro Pro 7-8 */
- else if((_data=CFB.find(cfb, 'PerfectOffice_MAIN')) && _data.content) WorkbookP = WK_.to_workbook(_data.content, (options.type = T, options));
- /* Quattro Pro 9 */
- else if((_data=CFB.find(cfb, 'NativeContent_MAIN')) && _data.content) WorkbookP = WK_.to_workbook(_data.content, (options.type = T, options));
- else throw new Error("Cannot find Workbook stream");
- if(options.bookVBA && cfb.FullPaths && CFB.find(cfb, '/_VBA_PROJECT_CUR/VBA/dir')) WorkbookP.vbaraw = make_vba_xls(cfb);
- }
-
- var props = {};
- if(cfb.FullPaths) parse_xls_props(cfb, props, options);
-
- WorkbookP.Props = WorkbookP.Custprops = props; /* TODO: split up properties */
- if(options.bookFiles) WorkbookP.cfb = cfb;
- /*WorkbookP.CompObjP = CompObjP; // TODO: storage? */
- return WorkbookP;
- }
-
-
- function write_xlscfb(wb, opts) {
- var o = opts || {};
- var cfb = CFB.utils.cfb_new({root:"R"});
- var wbpath = "/Workbook";
- switch(o.bookType || "xls") {
- case "xls": o.bookType = "biff8";
- /* falls through */
- case "xla": if(!o.bookType) o.bookType = "xla";
- /* falls through */
- case "biff8": wbpath = "/Workbook"; o.biff = 8; break;
- case "biff5": wbpath = "/Book"; o.biff = 5; break;
- default: throw new Error("invalid type " + o.bookType + " for XLS CFB");
- }
- CFB.utils.cfb_add(cfb, wbpath, write_biff_buf(wb, o));
- if(o.biff == 8 && (wb.Props || wb.Custprops)) write_xls_props(wb, cfb);
- // TODO: SI, DSI, CO
- if(o.biff == 8 && wb.vbaraw) fill_vba_xls(cfb, CFB.read(wb.vbaraw, {type: typeof wb.vbaraw == "string" ? "binary" : "buffer"}));
- return cfb;
- }
- /* [MS-XLSB] 2.3 Record Enumeration */
- var XLSBRecordEnum = {
- 0x0000: { n:"BrtRowHdr", f:parse_BrtRowHdr },
- 0x0001: { n:"BrtCellBlank", f:parse_BrtCellBlank },
- 0x0002: { n:"BrtCellRk", f:parse_BrtCellRk },
- 0x0003: { n:"BrtCellError", f:parse_BrtCellError },
- 0x0004: { n:"BrtCellBool", f:parse_BrtCellBool },
- 0x0005: { n:"BrtCellReal", f:parse_BrtCellReal },
- 0x0006: { n:"BrtCellSt", f:parse_BrtCellSt },
- 0x0007: { n:"BrtCellIsst", f:parse_BrtCellIsst },
- 0x0008: { n:"BrtFmlaString", f:parse_BrtFmlaString },
- 0x0009: { n:"BrtFmlaNum", f:parse_BrtFmlaNum },
- 0x000A: { n:"BrtFmlaBool", f:parse_BrtFmlaBool },
- 0x000B: { n:"BrtFmlaError", f:parse_BrtFmlaError },
- 0x000C: { n:"BrtShortBlank", f:parse_BrtShortBlank },
- 0x000D: { n:"BrtShortRk", f:parse_BrtShortRk },
- 0x000E: { n:"BrtShortError", f:parse_BrtShortError },
- 0x000F: { n:"BrtShortBool", f:parse_BrtShortBool },
- 0x0010: { n:"BrtShortReal", f:parse_BrtShortReal },
- 0x0011: { n:"BrtShortSt", f:parse_BrtShortSt },
- 0x0012: { n:"BrtShortIsst", f:parse_BrtShortIsst },
- 0x0013: { n:"BrtSSTItem", f:parse_RichStr },
- 0x0014: { n:"BrtPCDIMissing" },
- 0x0015: { n:"BrtPCDINumber" },
- 0x0016: { n:"BrtPCDIBoolean" },
- 0x0017: { n:"BrtPCDIError" },
- 0x0018: { n:"BrtPCDIString" },
- 0x0019: { n:"BrtPCDIDatetime" },
- 0x001A: { n:"BrtPCDIIndex" },
- 0x001B: { n:"BrtPCDIAMissing" },
- 0x001C: { n:"BrtPCDIANumber" },
- 0x001D: { n:"BrtPCDIABoolean" },
- 0x001E: { n:"BrtPCDIAError" },
- 0x001F: { n:"BrtPCDIAString" },
- 0x0020: { n:"BrtPCDIADatetime" },
- 0x0021: { n:"BrtPCRRecord" },
- 0x0022: { n:"BrtPCRRecordDt" },
- 0x0023: { n:"BrtFRTBegin" },
- 0x0024: { n:"BrtFRTEnd" },
- 0x0025: { n:"BrtACBegin" },
- 0x0026: { n:"BrtACEnd" },
- 0x0027: { n:"BrtName", f:parse_BrtName },
- 0x0028: { n:"BrtIndexRowBlock" },
- 0x002A: { n:"BrtIndexBlock" },
- 0x002B: { n:"BrtFont", f:parse_BrtFont },
- 0x002C: { n:"BrtFmt", f:parse_BrtFmt },
- 0x002D: { n:"BrtFill", f:parse_BrtFill },
- 0x002E: { n:"BrtBorder", f:parse_BrtBorder },
- 0x002F: { n:"BrtXF", f:parse_BrtXF },
- 0x0030: { n:"BrtStyle" },
- 0x0031: { n:"BrtCellMeta" },
- 0x0032: { n:"BrtValueMeta" },
- 0x0033: { n:"BrtMdb" },
- 0x0034: { n:"BrtBeginFmd" },
- 0x0035: { n:"BrtEndFmd" },
- 0x0036: { n:"BrtBeginMdx" },
- 0x0037: { n:"BrtEndMdx" },
- 0x0038: { n:"BrtBeginMdxTuple" },
- 0x0039: { n:"BrtEndMdxTuple" },
- 0x003A: { n:"BrtMdxMbrIstr" },
- 0x003B: { n:"BrtStr" },
- 0x003C: { n:"BrtColInfo", f:parse_ColInfo },
- 0x003E: { n:"BrtCellRString" },
- 0x003F: { n:"BrtCalcChainItem$", f:parse_BrtCalcChainItem$ },
- 0x0040: { n:"BrtDVal", f:parse_BrtDVal },
- 0x0041: { n:"BrtSxvcellNum" },
- 0x0042: { n:"BrtSxvcellStr" },
- 0x0043: { n:"BrtSxvcellBool" },
- 0x0044: { n:"BrtSxvcellErr" },
- 0x0045: { n:"BrtSxvcellDate" },
- 0x0046: { n:"BrtSxvcellNil" },
- 0x0080: { n:"BrtFileVersion" },
- 0x0081: { n:"BrtBeginSheet" },
- 0x0082: { n:"BrtEndSheet" },
- 0x0083: { n:"BrtBeginBook", f:parsenoop, p:0 },
- 0x0084: { n:"BrtEndBook" },
- 0x0085: { n:"BrtBeginWsViews" },
- 0x0086: { n:"BrtEndWsViews" },
- 0x0087: { n:"BrtBeginBookViews" },
- 0x0088: { n:"BrtEndBookViews" },
- 0x0089: { n:"BrtBeginWsView", f:parse_BrtBeginWsView },
- 0x008A: { n:"BrtEndWsView" },
- 0x008B: { n:"BrtBeginCsViews" },
- 0x008C: { n:"BrtEndCsViews" },
- 0x008D: { n:"BrtBeginCsView" },
- 0x008E: { n:"BrtEndCsView" },
- 0x008F: { n:"BrtBeginBundleShs" },
- 0x0090: { n:"BrtEndBundleShs" },
- 0x0091: { n:"BrtBeginSheetData" },
- 0x0092: { n:"BrtEndSheetData" },
- 0x0093: { n:"BrtWsProp", f:parse_BrtWsProp },
- 0x0094: { n:"BrtWsDim", f:parse_BrtWsDim, p:16 },
- 0x0097: { n:"BrtPane", f:parse_BrtPane },
- 0x0098: { n:"BrtSel" },
- 0x0099: { n:"BrtWbProp", f:parse_BrtWbProp },
- 0x009A: { n:"BrtWbFactoid" },
- 0x009B: { n:"BrtFileRecover" },
- 0x009C: { n:"BrtBundleSh", f:parse_BrtBundleSh },
- 0x009D: { n:"BrtCalcProp" },
- 0x009E: { n:"BrtBookView" },
- 0x009F: { n:"BrtBeginSst", f:parse_BrtBeginSst },
- 0x00A0: { n:"BrtEndSst" },
- 0x00A1: { n:"BrtBeginAFilter", f:parse_UncheckedRfX },
- 0x00A2: { n:"BrtEndAFilter" },
- 0x00A3: { n:"BrtBeginFilterColumn" },
- 0x00A4: { n:"BrtEndFilterColumn" },
- 0x00A5: { n:"BrtBeginFilters" },
- 0x00A6: { n:"BrtEndFilters" },
- 0x00A7: { n:"BrtFilter" },
- 0x00A8: { n:"BrtColorFilter" },
- 0x00A9: { n:"BrtIconFilter" },
- 0x00AA: { n:"BrtTop10Filter" },
- 0x00AB: { n:"BrtDynamicFilter" },
- 0x00AC: { n:"BrtBeginCustomFilters" },
- 0x00AD: { n:"BrtEndCustomFilters" },
- 0x00AE: { n:"BrtCustomFilter" },
- 0x00AF: { n:"BrtAFilterDateGroupItem" },
- 0x00B0: { n:"BrtMergeCell", f:parse_BrtMergeCell },
- 0x00B1: { n:"BrtBeginMergeCells" },
- 0x00B2: { n:"BrtEndMergeCells" },
- 0x00B3: { n:"BrtBeginPivotCacheDef" },
- 0x00B4: { n:"BrtEndPivotCacheDef" },
- 0x00B5: { n:"BrtBeginPCDFields" },
- 0x00B6: { n:"BrtEndPCDFields" },
- 0x00B7: { n:"BrtBeginPCDField" },
- 0x00B8: { n:"BrtEndPCDField" },
- 0x00B9: { n:"BrtBeginPCDSource" },
- 0x00BA: { n:"BrtEndPCDSource" },
- 0x00BB: { n:"BrtBeginPCDSRange" },
- 0x00BC: { n:"BrtEndPCDSRange" },
- 0x00BD: { n:"BrtBeginPCDFAtbl" },
- 0x00BE: { n:"BrtEndPCDFAtbl" },
- 0x00BF: { n:"BrtBeginPCDIRun" },
- 0x00C0: { n:"BrtEndPCDIRun" },
- 0x00C1: { n:"BrtBeginPivotCacheRecords" },
- 0x00C2: { n:"BrtEndPivotCacheRecords" },
- 0x00C3: { n:"BrtBeginPCDHierarchies" },
- 0x00C4: { n:"BrtEndPCDHierarchies" },
- 0x00C5: { n:"BrtBeginPCDHierarchy" },
- 0x00C6: { n:"BrtEndPCDHierarchy" },
- 0x00C7: { n:"BrtBeginPCDHFieldsUsage" },
- 0x00C8: { n:"BrtEndPCDHFieldsUsage" },
- 0x00C9: { n:"BrtBeginExtConnection" },
- 0x00CA: { n:"BrtEndExtConnection" },
- 0x00CB: { n:"BrtBeginECDbProps" },
- 0x00CC: { n:"BrtEndECDbProps" },
- 0x00CD: { n:"BrtBeginECOlapProps" },
- 0x00CE: { n:"BrtEndECOlapProps" },
- 0x00CF: { n:"BrtBeginPCDSConsol" },
- 0x00D0: { n:"BrtEndPCDSConsol" },
- 0x00D1: { n:"BrtBeginPCDSCPages" },
- 0x00D2: { n:"BrtEndPCDSCPages" },
- 0x00D3: { n:"BrtBeginPCDSCPage" },
- 0x00D4: { n:"BrtEndPCDSCPage" },
- 0x00D5: { n:"BrtBeginPCDSCPItem" },
- 0x00D6: { n:"BrtEndPCDSCPItem" },
- 0x00D7: { n:"BrtBeginPCDSCSets" },
- 0x00D8: { n:"BrtEndPCDSCSets" },
- 0x00D9: { n:"BrtBeginPCDSCSet" },
- 0x00DA: { n:"BrtEndPCDSCSet" },
- 0x00DB: { n:"BrtBeginPCDFGroup" },
- 0x00DC: { n:"BrtEndPCDFGroup" },
- 0x00DD: { n:"BrtBeginPCDFGItems" },
- 0x00DE: { n:"BrtEndPCDFGItems" },
- 0x00DF: { n:"BrtBeginPCDFGRange" },
- 0x00E0: { n:"BrtEndPCDFGRange" },
- 0x00E1: { n:"BrtBeginPCDFGDiscrete" },
- 0x00E2: { n:"BrtEndPCDFGDiscrete" },
- 0x00E3: { n:"BrtBeginPCDSDTupleCache" },
- 0x00E4: { n:"BrtEndPCDSDTupleCache" },
- 0x00E5: { n:"BrtBeginPCDSDTCEntries" },
- 0x00E6: { n:"BrtEndPCDSDTCEntries" },
- 0x00E7: { n:"BrtBeginPCDSDTCEMembers" },
- 0x00E8: { n:"BrtEndPCDSDTCEMembers" },
- 0x00E9: { n:"BrtBeginPCDSDTCEMember" },
- 0x00EA: { n:"BrtEndPCDSDTCEMember" },
- 0x00EB: { n:"BrtBeginPCDSDTCQueries" },
- 0x00EC: { n:"BrtEndPCDSDTCQueries" },
- 0x00ED: { n:"BrtBeginPCDSDTCQuery" },
- 0x00EE: { n:"BrtEndPCDSDTCQuery" },
- 0x00EF: { n:"BrtBeginPCDSDTCSets" },
- 0x00F0: { n:"BrtEndPCDSDTCSets" },
- 0x00F1: { n:"BrtBeginPCDSDTCSet" },
- 0x00F2: { n:"BrtEndPCDSDTCSet" },
- 0x00F3: { n:"BrtBeginPCDCalcItems" },
- 0x00F4: { n:"BrtEndPCDCalcItems" },
- 0x00F5: { n:"BrtBeginPCDCalcItem" },
- 0x00F6: { n:"BrtEndPCDCalcItem" },
- 0x00F7: { n:"BrtBeginPRule" },
- 0x00F8: { n:"BrtEndPRule" },
- 0x00F9: { n:"BrtBeginPRFilters" },
- 0x00FA: { n:"BrtEndPRFilters" },
- 0x00FB: { n:"BrtBeginPRFilter" },
- 0x00FC: { n:"BrtEndPRFilter" },
- 0x00FD: { n:"BrtBeginPNames" },
- 0x00FE: { n:"BrtEndPNames" },
- 0x00FF: { n:"BrtBeginPName" },
- 0x0100: { n:"BrtEndPName" },
- 0x0101: { n:"BrtBeginPNPairs" },
- 0x0102: { n:"BrtEndPNPairs" },
- 0x0103: { n:"BrtBeginPNPair" },
- 0x0104: { n:"BrtEndPNPair" },
- 0x0105: { n:"BrtBeginECWebProps" },
- 0x0106: { n:"BrtEndECWebProps" },
- 0x0107: { n:"BrtBeginEcWpTables" },
- 0x0108: { n:"BrtEndECWPTables" },
- 0x0109: { n:"BrtBeginECParams" },
- 0x010A: { n:"BrtEndECParams" },
- 0x010B: { n:"BrtBeginECParam" },
- 0x010C: { n:"BrtEndECParam" },
- 0x010D: { n:"BrtBeginPCDKPIs" },
- 0x010E: { n:"BrtEndPCDKPIs" },
- 0x010F: { n:"BrtBeginPCDKPI" },
- 0x0110: { n:"BrtEndPCDKPI" },
- 0x0111: { n:"BrtBeginDims" },
- 0x0112: { n:"BrtEndDims" },
- 0x0113: { n:"BrtBeginDim" },
- 0x0114: { n:"BrtEndDim" },
- 0x0115: { n:"BrtIndexPartEnd" },
- 0x0116: { n:"BrtBeginStyleSheet" },
- 0x0117: { n:"BrtEndStyleSheet" },
- 0x0118: { n:"BrtBeginSXView" },
- 0x0119: { n:"BrtEndSXVI" },
- 0x011A: { n:"BrtBeginSXVI" },
- 0x011B: { n:"BrtBeginSXVIs" },
- 0x011C: { n:"BrtEndSXVIs" },
- 0x011D: { n:"BrtBeginSXVD" },
- 0x011E: { n:"BrtEndSXVD" },
- 0x011F: { n:"BrtBeginSXVDs" },
- 0x0120: { n:"BrtEndSXVDs" },
- 0x0121: { n:"BrtBeginSXPI" },
- 0x0122: { n:"BrtEndSXPI" },
- 0x0123: { n:"BrtBeginSXPIs" },
- 0x0124: { n:"BrtEndSXPIs" },
- 0x0125: { n:"BrtBeginSXDI" },
- 0x0126: { n:"BrtEndSXDI" },
- 0x0127: { n:"BrtBeginSXDIs" },
- 0x0128: { n:"BrtEndSXDIs" },
- 0x0129: { n:"BrtBeginSXLI" },
- 0x012A: { n:"BrtEndSXLI" },
- 0x012B: { n:"BrtBeginSXLIRws" },
- 0x012C: { n:"BrtEndSXLIRws" },
- 0x012D: { n:"BrtBeginSXLICols" },
- 0x012E: { n:"BrtEndSXLICols" },
- 0x012F: { n:"BrtBeginSXFormat" },
- 0x0130: { n:"BrtEndSXFormat" },
- 0x0131: { n:"BrtBeginSXFormats" },
- 0x0132: { n:"BrtEndSxFormats" },
- 0x0133: { n:"BrtBeginSxSelect" },
- 0x0134: { n:"BrtEndSxSelect" },
- 0x0135: { n:"BrtBeginISXVDRws" },
- 0x0136: { n:"BrtEndISXVDRws" },
- 0x0137: { n:"BrtBeginISXVDCols" },
- 0x0138: { n:"BrtEndISXVDCols" },
- 0x0139: { n:"BrtEndSXLocation" },
- 0x013A: { n:"BrtBeginSXLocation" },
- 0x013B: { n:"BrtEndSXView" },
- 0x013C: { n:"BrtBeginSXTHs" },
- 0x013D: { n:"BrtEndSXTHs" },
- 0x013E: { n:"BrtBeginSXTH" },
- 0x013F: { n:"BrtEndSXTH" },
- 0x0140: { n:"BrtBeginISXTHRws" },
- 0x0141: { n:"BrtEndISXTHRws" },
- 0x0142: { n:"BrtBeginISXTHCols" },
- 0x0143: { n:"BrtEndISXTHCols" },
- 0x0144: { n:"BrtBeginSXTDMPS" },
- 0x0145: { n:"BrtEndSXTDMPs" },
- 0x0146: { n:"BrtBeginSXTDMP" },
- 0x0147: { n:"BrtEndSXTDMP" },
- 0x0148: { n:"BrtBeginSXTHItems" },
- 0x0149: { n:"BrtEndSXTHItems" },
- 0x014A: { n:"BrtBeginSXTHItem" },
- 0x014B: { n:"BrtEndSXTHItem" },
- 0x014C: { n:"BrtBeginMetadata" },
- 0x014D: { n:"BrtEndMetadata" },
- 0x014E: { n:"BrtBeginEsmdtinfo" },
- 0x014F: { n:"BrtMdtinfo" },
- 0x0150: { n:"BrtEndEsmdtinfo" },
- 0x0151: { n:"BrtBeginEsmdb" },
- 0x0152: { n:"BrtEndEsmdb" },
- 0x0153: { n:"BrtBeginEsfmd" },
- 0x0154: { n:"BrtEndEsfmd" },
- 0x0155: { n:"BrtBeginSingleCells" },
- 0x0156: { n:"BrtEndSingleCells" },
- 0x0157: { n:"BrtBeginList" },
- 0x0158: { n:"BrtEndList" },
- 0x0159: { n:"BrtBeginListCols" },
- 0x015A: { n:"BrtEndListCols" },
- 0x015B: { n:"BrtBeginListCol" },
- 0x015C: { n:"BrtEndListCol" },
- 0x015D: { n:"BrtBeginListXmlCPr" },
- 0x015E: { n:"BrtEndListXmlCPr" },
- 0x015F: { n:"BrtListCCFmla" },
- 0x0160: { n:"BrtListTrFmla" },
- 0x0161: { n:"BrtBeginExternals" },
- 0x0162: { n:"BrtEndExternals" },
- 0x0163: { n:"BrtSupBookSrc", f:parse_RelID},
- 0x0165: { n:"BrtSupSelf" },
- 0x0166: { n:"BrtSupSame" },
- 0x0167: { n:"BrtSupTabs" },
- 0x0168: { n:"BrtBeginSupBook" },
- 0x0169: { n:"BrtPlaceholderName" },
- 0x016A: { n:"BrtExternSheet", f:parse_ExternSheet },
- 0x016B: { n:"BrtExternTableStart" },
- 0x016C: { n:"BrtExternTableEnd" },
- 0x016E: { n:"BrtExternRowHdr" },
- 0x016F: { n:"BrtExternCellBlank" },
- 0x0170: { n:"BrtExternCellReal" },
- 0x0171: { n:"BrtExternCellBool" },
- 0x0172: { n:"BrtExternCellError" },
- 0x0173: { n:"BrtExternCellString" },
- 0x0174: { n:"BrtBeginEsmdx" },
- 0x0175: { n:"BrtEndEsmdx" },
- 0x0176: { n:"BrtBeginMdxSet" },
- 0x0177: { n:"BrtEndMdxSet" },
- 0x0178: { n:"BrtBeginMdxMbrProp" },
- 0x0179: { n:"BrtEndMdxMbrProp" },
- 0x017A: { n:"BrtBeginMdxKPI" },
- 0x017B: { n:"BrtEndMdxKPI" },
- 0x017C: { n:"BrtBeginEsstr" },
- 0x017D: { n:"BrtEndEsstr" },
- 0x017E: { n:"BrtBeginPRFItem" },
- 0x017F: { n:"BrtEndPRFItem" },
- 0x0180: { n:"BrtBeginPivotCacheIDs" },
- 0x0181: { n:"BrtEndPivotCacheIDs" },
- 0x0182: { n:"BrtBeginPivotCacheID" },
- 0x0183: { n:"BrtEndPivotCacheID" },
- 0x0184: { n:"BrtBeginISXVIs" },
- 0x0185: { n:"BrtEndISXVIs" },
- 0x0186: { n:"BrtBeginColInfos" },
- 0x0187: { n:"BrtEndColInfos" },
- 0x0188: { n:"BrtBeginRwBrk" },
- 0x0189: { n:"BrtEndRwBrk" },
- 0x018A: { n:"BrtBeginColBrk" },
- 0x018B: { n:"BrtEndColBrk" },
- 0x018C: { n:"BrtBrk" },
- 0x018D: { n:"BrtUserBookView" },
- 0x018E: { n:"BrtInfo" },
- 0x018F: { n:"BrtCUsr" },
- 0x0190: { n:"BrtUsr" },
- 0x0191: { n:"BrtBeginUsers" },
- 0x0193: { n:"BrtEOF" },
- 0x0194: { n:"BrtUCR" },
- 0x0195: { n:"BrtRRInsDel" },
- 0x0196: { n:"BrtRREndInsDel" },
- 0x0197: { n:"BrtRRMove" },
- 0x0198: { n:"BrtRREndMove" },
- 0x0199: { n:"BrtRRChgCell" },
- 0x019A: { n:"BrtRREndChgCell" },
- 0x019B: { n:"BrtRRHeader" },
- 0x019C: { n:"BrtRRUserView" },
- 0x019D: { n:"BrtRRRenSheet" },
- 0x019E: { n:"BrtRRInsertSh" },
- 0x019F: { n:"BrtRRDefName" },
- 0x01A0: { n:"BrtRRNote" },
- 0x01A1: { n:"BrtRRConflict" },
- 0x01A2: { n:"BrtRRTQSIF" },
- 0x01A3: { n:"BrtRRFormat" },
- 0x01A4: { n:"BrtRREndFormat" },
- 0x01A5: { n:"BrtRRAutoFmt" },
- 0x01A6: { n:"BrtBeginUserShViews" },
- 0x01A7: { n:"BrtBeginUserShView" },
- 0x01A8: { n:"BrtEndUserShView" },
- 0x01A9: { n:"BrtEndUserShViews" },
- 0x01AA: { n:"BrtArrFmla", f:parse_BrtArrFmla },
- 0x01AB: { n:"BrtShrFmla", f:parse_BrtShrFmla },
- 0x01AC: { n:"BrtTable" },
- 0x01AD: { n:"BrtBeginExtConnections" },
- 0x01AE: { n:"BrtEndExtConnections" },
- 0x01AF: { n:"BrtBeginPCDCalcMems" },
- 0x01B0: { n:"BrtEndPCDCalcMems" },
- 0x01B1: { n:"BrtBeginPCDCalcMem" },
- 0x01B2: { n:"BrtEndPCDCalcMem" },
- 0x01B3: { n:"BrtBeginPCDHGLevels" },
- 0x01B4: { n:"BrtEndPCDHGLevels" },
- 0x01B5: { n:"BrtBeginPCDHGLevel" },
- 0x01B6: { n:"BrtEndPCDHGLevel" },
- 0x01B7: { n:"BrtBeginPCDHGLGroups" },
- 0x01B8: { n:"BrtEndPCDHGLGroups" },
- 0x01B9: { n:"BrtBeginPCDHGLGroup" },
- 0x01BA: { n:"BrtEndPCDHGLGroup" },
- 0x01BB: { n:"BrtBeginPCDHGLGMembers" },
- 0x01BC: { n:"BrtEndPCDHGLGMembers" },
- 0x01BD: { n:"BrtBeginPCDHGLGMember" },
- 0x01BE: { n:"BrtEndPCDHGLGMember" },
- 0x01BF: { n:"BrtBeginQSI" },
- 0x01C0: { n:"BrtEndQSI" },
- 0x01C1: { n:"BrtBeginQSIR" },
- 0x01C2: { n:"BrtEndQSIR" },
- 0x01C3: { n:"BrtBeginDeletedNames" },
- 0x01C4: { n:"BrtEndDeletedNames" },
- 0x01C5: { n:"BrtBeginDeletedName" },
- 0x01C6: { n:"BrtEndDeletedName" },
- 0x01C7: { n:"BrtBeginQSIFs" },
- 0x01C8: { n:"BrtEndQSIFs" },
- 0x01C9: { n:"BrtBeginQSIF" },
- 0x01CA: { n:"BrtEndQSIF" },
- 0x01CB: { n:"BrtBeginAutoSortScope" },
- 0x01CC: { n:"BrtEndAutoSortScope" },
- 0x01CD: { n:"BrtBeginConditionalFormatting" },
- 0x01CE: { n:"BrtEndConditionalFormatting" },
- 0x01CF: { n:"BrtBeginCFRule" },
- 0x01D0: { n:"BrtEndCFRule" },
- 0x01D1: { n:"BrtBeginIconSet" },
- 0x01D2: { n:"BrtEndIconSet" },
- 0x01D3: { n:"BrtBeginDatabar" },
- 0x01D4: { n:"BrtEndDatabar" },
- 0x01D5: { n:"BrtBeginColorScale" },
- 0x01D6: { n:"BrtEndColorScale" },
- 0x01D7: { n:"BrtCFVO" },
- 0x01D8: { n:"BrtExternValueMeta" },
- 0x01D9: { n:"BrtBeginColorPalette" },
- 0x01DA: { n:"BrtEndColorPalette" },
- 0x01DB: { n:"BrtIndexedColor" },
- 0x01DC: { n:"BrtMargins", f:parse_BrtMargins },
- 0x01DD: { n:"BrtPrintOptions" },
- 0x01DE: { n:"BrtPageSetup" },
- 0x01DF: { n:"BrtBeginHeaderFooter" },
- 0x01E0: { n:"BrtEndHeaderFooter" },
- 0x01E1: { n:"BrtBeginSXCrtFormat" },
- 0x01E2: { n:"BrtEndSXCrtFormat" },
- 0x01E3: { n:"BrtBeginSXCrtFormats" },
- 0x01E4: { n:"BrtEndSXCrtFormats" },
- 0x01E5: { n:"BrtWsFmtInfo", f:parse_BrtWsFmtInfo },
- 0x01E6: { n:"BrtBeginMgs" },
- 0x01E7: { n:"BrtEndMGs" },
- 0x01E8: { n:"BrtBeginMGMaps" },
- 0x01E9: { n:"BrtEndMGMaps" },
- 0x01EA: { n:"BrtBeginMG" },
- 0x01EB: { n:"BrtEndMG" },
- 0x01EC: { n:"BrtBeginMap" },
- 0x01ED: { n:"BrtEndMap" },
- 0x01EE: { n:"BrtHLink", f:parse_BrtHLink },
- 0x01EF: { n:"BrtBeginDCon" },
- 0x01F0: { n:"BrtEndDCon" },
- 0x01F1: { n:"BrtBeginDRefs" },
- 0x01F2: { n:"BrtEndDRefs" },
- 0x01F3: { n:"BrtDRef" },
- 0x01F4: { n:"BrtBeginScenMan" },
- 0x01F5: { n:"BrtEndScenMan" },
- 0x01F6: { n:"BrtBeginSct" },
- 0x01F7: { n:"BrtEndSct" },
- 0x01F8: { n:"BrtSlc" },
- 0x01F9: { n:"BrtBeginDXFs" },
- 0x01FA: { n:"BrtEndDXFs" },
- 0x01FB: { n:"BrtDXF" },
- 0x01FC: { n:"BrtBeginTableStyles" },
- 0x01FD: { n:"BrtEndTableStyles" },
- 0x01FE: { n:"BrtBeginTableStyle" },
- 0x01FF: { n:"BrtEndTableStyle" },
- 0x0200: { n:"BrtTableStyleElement" },
- 0x0201: { n:"BrtTableStyleClient" },
- 0x0202: { n:"BrtBeginVolDeps" },
- 0x0203: { n:"BrtEndVolDeps" },
- 0x0204: { n:"BrtBeginVolType" },
- 0x0205: { n:"BrtEndVolType" },
- 0x0206: { n:"BrtBeginVolMain" },
- 0x0207: { n:"BrtEndVolMain" },
- 0x0208: { n:"BrtBeginVolTopic" },
- 0x0209: { n:"BrtEndVolTopic" },
- 0x020A: { n:"BrtVolSubtopic" },
- 0x020B: { n:"BrtVolRef" },
- 0x020C: { n:"BrtVolNum" },
- 0x020D: { n:"BrtVolErr" },
- 0x020E: { n:"BrtVolStr" },
- 0x020F: { n:"BrtVolBool" },
- 0x0210: { n:"BrtBeginCalcChain$" },
- 0x0211: { n:"BrtEndCalcChain$" },
- 0x0212: { n:"BrtBeginSortState" },
- 0x0213: { n:"BrtEndSortState" },
- 0x0214: { n:"BrtBeginSortCond" },
- 0x0215: { n:"BrtEndSortCond" },
- 0x0216: { n:"BrtBookProtection" },
- 0x0217: { n:"BrtSheetProtection" },
- 0x0218: { n:"BrtRangeProtection" },
- 0x0219: { n:"BrtPhoneticInfo" },
- 0x021A: { n:"BrtBeginECTxtWiz" },
- 0x021B: { n:"BrtEndECTxtWiz" },
- 0x021C: { n:"BrtBeginECTWFldInfoLst" },
- 0x021D: { n:"BrtEndECTWFldInfoLst" },
- 0x021E: { n:"BrtBeginECTwFldInfo" },
- 0x0224: { n:"BrtFileSharing" },
- 0x0225: { n:"BrtOleSize" },
- 0x0226: { n:"BrtDrawing", f:parse_RelID },
- 0x0227: { n:"BrtLegacyDrawing" },
- 0x0228: { n:"BrtLegacyDrawingHF" },
- 0x0229: { n:"BrtWebOpt" },
- 0x022A: { n:"BrtBeginWebPubItems" },
- 0x022B: { n:"BrtEndWebPubItems" },
- 0x022C: { n:"BrtBeginWebPubItem" },
- 0x022D: { n:"BrtEndWebPubItem" },
- 0x022E: { n:"BrtBeginSXCondFmt" },
- 0x022F: { n:"BrtEndSXCondFmt" },
- 0x0230: { n:"BrtBeginSXCondFmts" },
- 0x0231: { n:"BrtEndSXCondFmts" },
- 0x0232: { n:"BrtBkHim" },
- 0x0234: { n:"BrtColor" },
- 0x0235: { n:"BrtBeginIndexedColors" },
- 0x0236: { n:"BrtEndIndexedColors" },
- 0x0239: { n:"BrtBeginMRUColors" },
- 0x023A: { n:"BrtEndMRUColors" },
- 0x023C: { n:"BrtMRUColor" },
- 0x023D: { n:"BrtBeginDVals" },
- 0x023E: { n:"BrtEndDVals" },
- 0x0241: { n:"BrtSupNameStart" },
- 0x0242: { n:"BrtSupNameValueStart" },
- 0x0243: { n:"BrtSupNameValueEnd" },
- 0x0244: { n:"BrtSupNameNum" },
- 0x0245: { n:"BrtSupNameErr" },
- 0x0246: { n:"BrtSupNameSt" },
- 0x0247: { n:"BrtSupNameNil" },
- 0x0248: { n:"BrtSupNameBool" },
- 0x0249: { n:"BrtSupNameFmla" },
- 0x024A: { n:"BrtSupNameBits" },
- 0x024B: { n:"BrtSupNameEnd" },
- 0x024C: { n:"BrtEndSupBook" },
- 0x024D: { n:"BrtCellSmartTagProperty" },
- 0x024E: { n:"BrtBeginCellSmartTag" },
- 0x024F: { n:"BrtEndCellSmartTag" },
- 0x0250: { n:"BrtBeginCellSmartTags" },
- 0x0251: { n:"BrtEndCellSmartTags" },
- 0x0252: { n:"BrtBeginSmartTags" },
- 0x0253: { n:"BrtEndSmartTags" },
- 0x0254: { n:"BrtSmartTagType" },
- 0x0255: { n:"BrtBeginSmartTagTypes" },
- 0x0256: { n:"BrtEndSmartTagTypes" },
- 0x0257: { n:"BrtBeginSXFilters" },
- 0x0258: { n:"BrtEndSXFilters" },
- 0x0259: { n:"BrtBeginSXFILTER" },
- 0x025A: { n:"BrtEndSXFilter" },
- 0x025B: { n:"BrtBeginFills" },
- 0x025C: { n:"BrtEndFills" },
- 0x025D: { n:"BrtBeginCellWatches" },
- 0x025E: { n:"BrtEndCellWatches" },
- 0x025F: { n:"BrtCellWatch" },
- 0x0260: { n:"BrtBeginCRErrs" },
- 0x0261: { n:"BrtEndCRErrs" },
- 0x0262: { n:"BrtCrashRecErr" },
- 0x0263: { n:"BrtBeginFonts" },
- 0x0264: { n:"BrtEndFonts" },
- 0x0265: { n:"BrtBeginBorders" },
- 0x0266: { n:"BrtEndBorders" },
- 0x0267: { n:"BrtBeginFmts" },
- 0x0268: { n:"BrtEndFmts" },
- 0x0269: { n:"BrtBeginCellXFs" },
- 0x026A: { n:"BrtEndCellXFs" },
- 0x026B: { n:"BrtBeginStyles" },
- 0x026C: { n:"BrtEndStyles" },
- 0x0271: { n:"BrtBigName" },
- 0x0272: { n:"BrtBeginCellStyleXFs" },
- 0x0273: { n:"BrtEndCellStyleXFs" },
- 0x0274: { n:"BrtBeginComments" },
- 0x0275: { n:"BrtEndComments" },
- 0x0276: { n:"BrtBeginCommentAuthors" },
- 0x0277: { n:"BrtEndCommentAuthors" },
- 0x0278: { n:"BrtCommentAuthor", f:parse_BrtCommentAuthor },
- 0x0279: { n:"BrtBeginCommentList" },
- 0x027A: { n:"BrtEndCommentList" },
- 0x027B: { n:"BrtBeginComment", f:parse_BrtBeginComment},
- 0x027C: { n:"BrtEndComment" },
- 0x027D: { n:"BrtCommentText", f:parse_BrtCommentText },
- 0x027E: { n:"BrtBeginOleObjects" },
- 0x027F: { n:"BrtOleObject" },
- 0x0280: { n:"BrtEndOleObjects" },
- 0x0281: { n:"BrtBeginSxrules" },
- 0x0282: { n:"BrtEndSxRules" },
- 0x0283: { n:"BrtBeginActiveXControls" },
- 0x0284: { n:"BrtActiveX" },
- 0x0285: { n:"BrtEndActiveXControls" },
- 0x0286: { n:"BrtBeginPCDSDTCEMembersSortBy" },
- 0x0288: { n:"BrtBeginCellIgnoreECs" },
- 0x0289: { n:"BrtCellIgnoreEC" },
- 0x028A: { n:"BrtEndCellIgnoreECs" },
- 0x028B: { n:"BrtCsProp", f:parse_BrtCsProp },
- 0x028C: { n:"BrtCsPageSetup" },
- 0x028D: { n:"BrtBeginUserCsViews" },
- 0x028E: { n:"BrtEndUserCsViews" },
- 0x028F: { n:"BrtBeginUserCsView" },
- 0x0290: { n:"BrtEndUserCsView" },
- 0x0291: { n:"BrtBeginPcdSFCIEntries" },
- 0x0292: { n:"BrtEndPCDSFCIEntries" },
- 0x0293: { n:"BrtPCDSFCIEntry" },
- 0x0294: { n:"BrtBeginListParts" },
- 0x0295: { n:"BrtListPart" },
- 0x0296: { n:"BrtEndListParts" },
- 0x0297: { n:"BrtSheetCalcProp" },
- 0x0298: { n:"BrtBeginFnGroup" },
- 0x0299: { n:"BrtFnGroup" },
- 0x029A: { n:"BrtEndFnGroup" },
- 0x029B: { n:"BrtSupAddin" },
- 0x029C: { n:"BrtSXTDMPOrder" },
- 0x029D: { n:"BrtCsProtection" },
- 0x029F: { n:"BrtBeginWsSortMap" },
- 0x02A0: { n:"BrtEndWsSortMap" },
- 0x02A1: { n:"BrtBeginRRSort" },
- 0x02A2: { n:"BrtEndRRSort" },
- 0x02A3: { n:"BrtRRSortItem" },
- 0x02A4: { n:"BrtFileSharingIso" },
- 0x02A5: { n:"BrtBookProtectionIso" },
- 0x02A6: { n:"BrtSheetProtectionIso" },
- 0x02A7: { n:"BrtCsProtectionIso" },
- 0x02A8: { n:"BrtRangeProtectionIso" },
- 0x02A9: { n:"BrtDValList" },
- 0x0400: { n:"BrtRwDescent" },
- 0x0401: { n:"BrtKnownFonts" },
- 0x0402: { n:"BrtBeginSXTupleSet" },
- 0x0403: { n:"BrtEndSXTupleSet" },
- 0x0404: { n:"BrtBeginSXTupleSetHeader" },
- 0x0405: { n:"BrtEndSXTupleSetHeader" },
- 0x0406: { n:"BrtSXTupleSetHeaderItem" },
- 0x0407: { n:"BrtBeginSXTupleSetData" },
- 0x0408: { n:"BrtEndSXTupleSetData" },
- 0x0409: { n:"BrtBeginSXTupleSetRow" },
- 0x040A: { n:"BrtEndSXTupleSetRow" },
- 0x040B: { n:"BrtSXTupleSetRowItem" },
- 0x040C: { n:"BrtNameExt" },
- 0x040D: { n:"BrtPCDH14" },
- 0x040E: { n:"BrtBeginPCDCalcMem14" },
- 0x040F: { n:"BrtEndPCDCalcMem14" },
- 0x0410: { n:"BrtSXTH14" },
- 0x0411: { n:"BrtBeginSparklineGroup" },
- 0x0412: { n:"BrtEndSparklineGroup" },
- 0x0413: { n:"BrtSparkline" },
- 0x0414: { n:"BrtSXDI14" },
- 0x0415: { n:"BrtWsFmtInfoEx14" },
- 0x0416: { n:"BrtBeginConditionalFormatting14" },
- 0x0417: { n:"BrtEndConditionalFormatting14" },
- 0x0418: { n:"BrtBeginCFRule14" },
- 0x0419: { n:"BrtEndCFRule14" },
- 0x041A: { n:"BrtCFVO14" },
- 0x041B: { n:"BrtBeginDatabar14" },
- 0x041C: { n:"BrtBeginIconSet14" },
- 0x041D: { n:"BrtDVal14", f: parse_BrtDVal14 },
- 0x041E: { n:"BrtBeginDVals14" },
- 0x041F: { n:"BrtColor14" },
- 0x0420: { n:"BrtBeginSparklines" },
- 0x0421: { n:"BrtEndSparklines" },
- 0x0422: { n:"BrtBeginSparklineGroups" },
- 0x0423: { n:"BrtEndSparklineGroups" },
- 0x0425: { n:"BrtSXVD14" },
- 0x0426: { n:"BrtBeginSXView14" },
- 0x0427: { n:"BrtEndSXView14" },
- 0x0428: { n:"BrtBeginSXView16" },
- 0x0429: { n:"BrtEndSXView16" },
- 0x042A: { n:"BrtBeginPCD14" },
- 0x042B: { n:"BrtEndPCD14" },
- 0x042C: { n:"BrtBeginExtConn14" },
- 0x042D: { n:"BrtEndExtConn14" },
- 0x042E: { n:"BrtBeginSlicerCacheIDs" },
- 0x042F: { n:"BrtEndSlicerCacheIDs" },
- 0x0430: { n:"BrtBeginSlicerCacheID" },
- 0x0431: { n:"BrtEndSlicerCacheID" },
- 0x0433: { n:"BrtBeginSlicerCache" },
- 0x0434: { n:"BrtEndSlicerCache" },
- 0x0435: { n:"BrtBeginSlicerCacheDef" },
- 0x0436: { n:"BrtEndSlicerCacheDef" },
- 0x0437: { n:"BrtBeginSlicersEx" },
- 0x0438: { n:"BrtEndSlicersEx" },
- 0x0439: { n:"BrtBeginSlicerEx" },
- 0x043A: { n:"BrtEndSlicerEx" },
- 0x043B: { n:"BrtBeginSlicer" },
- 0x043C: { n:"BrtEndSlicer" },
- 0x043D: { n:"BrtSlicerCachePivotTables" },
- 0x043E: { n:"BrtBeginSlicerCacheOlapImpl" },
- 0x043F: { n:"BrtEndSlicerCacheOlapImpl" },
- 0x0440: { n:"BrtBeginSlicerCacheLevelsData" },
- 0x0441: { n:"BrtEndSlicerCacheLevelsData" },
- 0x0442: { n:"BrtBeginSlicerCacheLevelData" },
- 0x0443: { n:"BrtEndSlicerCacheLevelData" },
- 0x0444: { n:"BrtBeginSlicerCacheSiRanges" },
- 0x0445: { n:"BrtEndSlicerCacheSiRanges" },
- 0x0446: { n:"BrtBeginSlicerCacheSiRange" },
- 0x0447: { n:"BrtEndSlicerCacheSiRange" },
- 0x0448: { n:"BrtSlicerCacheOlapItem" },
- 0x0449: { n:"BrtBeginSlicerCacheSelections" },
- 0x044A: { n:"BrtSlicerCacheSelection" },
- 0x044B: { n:"BrtEndSlicerCacheSelections" },
- 0x044C: { n:"BrtBeginSlicerCacheNative" },
- 0x044D: { n:"BrtEndSlicerCacheNative" },
- 0x044E: { n:"BrtSlicerCacheNativeItem" },
- 0x044F: { n:"BrtRangeProtection14" },
- 0x0450: { n:"BrtRangeProtectionIso14" },
- 0x0451: { n:"BrtCellIgnoreEC14" },
- 0x0457: { n:"BrtList14" },
- 0x0458: { n:"BrtCFIcon" },
- 0x0459: { n:"BrtBeginSlicerCachesPivotCacheIDs" },
- 0x045A: { n:"BrtEndSlicerCachesPivotCacheIDs" },
- 0x045B: { n:"BrtBeginSlicers" },
- 0x045C: { n:"BrtEndSlicers" },
- 0x045D: { n:"BrtWbProp14" },
- 0x045E: { n:"BrtBeginSXEdit" },
- 0x045F: { n:"BrtEndSXEdit" },
- 0x0460: { n:"BrtBeginSXEdits" },
- 0x0461: { n:"BrtEndSXEdits" },
- 0x0462: { n:"BrtBeginSXChange" },
- 0x0463: { n:"BrtEndSXChange" },
- 0x0464: { n:"BrtBeginSXChanges" },
- 0x0465: { n:"BrtEndSXChanges" },
- 0x0466: { n:"BrtSXTupleItems" },
- 0x0468: { n:"BrtBeginSlicerStyle" },
- 0x0469: { n:"BrtEndSlicerStyle" },
- 0x046A: { n:"BrtSlicerStyleElement" },
- 0x046B: { n:"BrtBeginStyleSheetExt14" },
- 0x046C: { n:"BrtEndStyleSheetExt14" },
- 0x046D: { n:"BrtBeginSlicerCachesPivotCacheID" },
- 0x046E: { n:"BrtEndSlicerCachesPivotCacheID" },
- 0x046F: { n:"BrtBeginConditionalFormattings" },
- 0x0470: { n:"BrtEndConditionalFormattings" },
- 0x0471: { n:"BrtBeginPCDCalcMemExt" },
- 0x0472: { n:"BrtEndPCDCalcMemExt" },
- 0x0473: { n:"BrtBeginPCDCalcMemsExt" },
- 0x0474: { n:"BrtEndPCDCalcMemsExt" },
- 0x0475: { n:"BrtPCDField14" },
- 0x0476: { n:"BrtBeginSlicerStyles" },
- 0x0477: { n:"BrtEndSlicerStyles" },
- 0x0478: { n:"BrtBeginSlicerStyleElements" },
- 0x0479: { n:"BrtEndSlicerStyleElements" },
- 0x047A: { n:"BrtCFRuleExt" },
- 0x047B: { n:"BrtBeginSXCondFmt14" },
- 0x047C: { n:"BrtEndSXCondFmt14" },
- 0x047D: { n:"BrtBeginSXCondFmts14" },
- 0x047E: { n:"BrtEndSXCondFmts14" },
- 0x0480: { n:"BrtBeginSortCond14" },
- 0x0481: { n:"BrtEndSortCond14" },
- 0x0482: { n:"BrtEndDVals14" },
- 0x0483: { n:"BrtEndIconSet14" },
- 0x0484: { n:"BrtEndDatabar14" },
- 0x0485: { n:"BrtBeginColorScale14" },
- 0x0486: { n:"BrtEndColorScale14" },
- 0x0487: { n:"BrtBeginSxrules14" },
- 0x0488: { n:"BrtEndSxrules14" },
- 0x0489: { n:"BrtBeginPRule14" },
- 0x048A: { n:"BrtEndPRule14" },
- 0x048B: { n:"BrtBeginPRFilters14" },
- 0x048C: { n:"BrtEndPRFilters14" },
- 0x048D: { n:"BrtBeginPRFilter14" },
- 0x048E: { n:"BrtEndPRFilter14" },
- 0x048F: { n:"BrtBeginPRFItem14" },
- 0x0490: { n:"BrtEndPRFItem14" },
- 0x0491: { n:"BrtBeginCellIgnoreECs14" },
- 0x0492: { n:"BrtEndCellIgnoreECs14" },
- 0x0493: { n:"BrtDxf14" },
- 0x0494: { n:"BrtBeginDxF14s" },
- 0x0495: { n:"BrtEndDxf14s" },
- 0x0499: { n:"BrtFilter14" },
- 0x049A: { n:"BrtBeginCustomFilters14" },
- 0x049C: { n:"BrtCustomFilter14" },
- 0x049D: { n:"BrtIconFilter14" },
- 0x049E: { n:"BrtPivotCacheConnectionName" },
- 0x0800: { n:"BrtBeginDecoupledPivotCacheIDs" },
- 0x0801: { n:"BrtEndDecoupledPivotCacheIDs" },
- 0x0802: { n:"BrtDecoupledPivotCacheID" },
- 0x0803: { n:"BrtBeginPivotTableRefs" },
- 0x0804: { n:"BrtEndPivotTableRefs" },
- 0x0805: { n:"BrtPivotTableRef" },
- 0x0806: { n:"BrtSlicerCacheBookPivotTables" },
- 0x0807: { n:"BrtBeginSxvcells" },
- 0x0808: { n:"BrtEndSxvcells" },
- 0x0809: { n:"BrtBeginSxRow" },
- 0x080A: { n:"BrtEndSxRow" },
- 0x080C: { n:"BrtPcdCalcMem15" },
- 0x0813: { n:"BrtQsi15" },
- 0x0814: { n:"BrtBeginWebExtensions" },
- 0x0815: { n:"BrtEndWebExtensions" },
- 0x0816: { n:"BrtWebExtension" },
- 0x0817: { n:"BrtAbsPath15" },
- 0x0818: { n:"BrtBeginPivotTableUISettings" },
- 0x0819: { n:"BrtEndPivotTableUISettings" },
- 0x081B: { n:"BrtTableSlicerCacheIDs" },
- 0x081C: { n:"BrtTableSlicerCacheID" },
- 0x081D: { n:"BrtBeginTableSlicerCache" },
- 0x081E: { n:"BrtEndTableSlicerCache" },
- 0x081F: { n:"BrtSxFilter15" },
- 0x0820: { n:"BrtBeginTimelineCachePivotCacheIDs" },
- 0x0821: { n:"BrtEndTimelineCachePivotCacheIDs" },
- 0x0822: { n:"BrtTimelineCachePivotCacheID" },
- 0x0823: { n:"BrtBeginTimelineCacheIDs" },
- 0x0824: { n:"BrtEndTimelineCacheIDs" },
- 0x0825: { n:"BrtBeginTimelineCacheID" },
- 0x0826: { n:"BrtEndTimelineCacheID" },
- 0x0827: { n:"BrtBeginTimelinesEx" },
- 0x0828: { n:"BrtEndTimelinesEx" },
- 0x0829: { n:"BrtBeginTimelineEx" },
- 0x082A: { n:"BrtEndTimelineEx" },
- 0x082B: { n:"BrtWorkBookPr15" },
- 0x082C: { n:"BrtPCDH15" },
- 0x082D: { n:"BrtBeginTimelineStyle" },
- 0x082E: { n:"BrtEndTimelineStyle" },
- 0x082F: { n:"BrtTimelineStyleElement" },
- 0x0830: { n:"BrtBeginTimelineStylesheetExt15" },
- 0x0831: { n:"BrtEndTimelineStylesheetExt15" },
- 0x0832: { n:"BrtBeginTimelineStyles" },
- 0x0833: { n:"BrtEndTimelineStyles" },
- 0x0834: { n:"BrtBeginTimelineStyleElements" },
- 0x0835: { n:"BrtEndTimelineStyleElements" },
- 0x0836: { n:"BrtDxf15" },
- 0x0837: { n:"BrtBeginDxfs15" },
- 0x0838: { n:"brtEndDxfs15" },
- 0x0839: { n:"BrtSlicerCacheHideItemsWithNoData" },
- 0x083A: { n:"BrtBeginItemUniqueNames" },
- 0x083B: { n:"BrtEndItemUniqueNames" },
- 0x083C: { n:"BrtItemUniqueName" },
- 0x083D: { n:"BrtBeginExtConn15" },
- 0x083E: { n:"BrtEndExtConn15" },
- 0x083F: { n:"BrtBeginOledbPr15" },
- 0x0840: { n:"BrtEndOledbPr15" },
- 0x0841: { n:"BrtBeginDataFeedPr15" },
- 0x0842: { n:"BrtEndDataFeedPr15" },
- 0x0843: { n:"BrtTextPr15" },
- 0x0844: { n:"BrtRangePr15" },
- 0x0845: { n:"BrtDbCommand15" },
- 0x0846: { n:"BrtBeginDbTables15" },
- 0x0847: { n:"BrtEndDbTables15" },
- 0x0848: { n:"BrtDbTable15" },
- 0x0849: { n:"BrtBeginDataModel" },
- 0x084A: { n:"BrtEndDataModel" },
- 0x084B: { n:"BrtBeginModelTables" },
- 0x084C: { n:"BrtEndModelTables" },
- 0x084D: { n:"BrtModelTable" },
- 0x084E: { n:"BrtBeginModelRelationships" },
- 0x084F: { n:"BrtEndModelRelationships" },
- 0x0850: { n:"BrtModelRelationship" },
- 0x0851: { n:"BrtBeginECTxtWiz15" },
- 0x0852: { n:"BrtEndECTxtWiz15" },
- 0x0853: { n:"BrtBeginECTWFldInfoLst15" },
- 0x0854: { n:"BrtEndECTWFldInfoLst15" },
- 0x0855: { n:"BrtBeginECTWFldInfo15" },
- 0x0856: { n:"BrtFieldListActiveItem" },
- 0x0857: { n:"BrtPivotCacheIdVersion" },
- 0x0858: { n:"BrtSXDI15" },
- 0x0859: { n:"BrtBeginModelTimeGroupings" },
- 0x085A: { n:"BrtEndModelTimeGroupings" },
- 0x085B: { n:"BrtBeginModelTimeGrouping" },
- 0x085C: { n:"BrtEndModelTimeGrouping" },
- 0x085D: { n:"BrtModelTimeGroupingCalcCol" },
- 0x0C00: { n:"BrtUid" },
- 0x0C01: { n:"BrtRevisionPtr" },
- 0x13e7: { n:"BrtBeginCalcFeatures" },
- 0x13e8: { n:"BrtEndCalcFeatures" },
- 0x13e9: { n:"BrtCalcFeature" },
- 0xFFFF: { n:"" }
- };
-
- var XLSBRE = evert_key(XLSBRecordEnum, 'n');
- XLSBRE["BrtFRTArchID$"] = 0x0010;
-
- /* [MS-XLS] 2.3 Record Enumeration */
- var XLSRecordEnum = {
- 0x0003: { n:"BIFF2NUM", f:parse_BIFF2NUM },
- 0x0004: { n:"BIFF2STR", f:parse_BIFF2STR },
- 0x0006: { n:"Formula", f:parse_Formula },
- 0x0009: { n:'BOF', f:parse_BOF },
- 0x000a: { n:'EOF', f:parsenoop2 },
- 0x000c: { n:"CalcCount", f:parseuint16 },
- 0x000d: { n:"CalcMode", f:parseuint16 },
- 0x000e: { n:"CalcPrecision", f:parsebool },
- 0x000f: { n:"CalcRefMode", f:parsebool },
- 0x0010: { n:"CalcDelta", f:parse_Xnum },
- 0x0011: { n:"CalcIter", f:parsebool },
- 0x0012: { n:"Protect", f:parsebool },
- 0x0013: { n:"Password", f:parseuint16 },
- 0x0014: { n:"Header", f:parse_XLHeaderFooter },
- 0x0015: { n:"Footer", f:parse_XLHeaderFooter },
- 0x0017: { n:"ExternSheet", f:parse_ExternSheet },
- 0x0018: { n:"Lbl", f:parse_Lbl },
- 0x0019: { n:"WinProtect", f:parsebool },
- 0x001a: { n:"VerticalPageBreaks" },
- 0x001b: { n:"HorizontalPageBreaks" },
- 0x001c: { n:"Note", f:parse_Note },
- 0x001d: { n:"Selection" },
- 0x0022: { n:"Date1904", f:parsebool },
- 0x0023: { n:"ExternName", f:parse_ExternName },
- 0x0024: { n:"COLWIDTH" },
- 0x0026: { n:"LeftMargin", f:parse_Xnum },
- 0x0027: { n:"RightMargin", f:parse_Xnum },
- 0x0028: { n:"TopMargin", f:parse_Xnum },
- 0x0029: { n:"BottomMargin", f:parse_Xnum },
- 0x002a: { n:"PrintRowCol", f:parsebool },
- 0x002b: { n:"PrintGrid", f:parsebool },
- 0x002f: { n:"FilePass", f:parse_FilePass },
- 0x0031: { n:"Font", f:parse_Font },
- 0x0033: { n:"PrintSize", f:parseuint16 },
- 0x003c: { n:"Continue" },
- 0x003d: { n:"Window1", f:parse_Window1 },
- 0x0040: { n:"Backup", f:parsebool },
- 0x0041: { n:"Pane", f:parse_Pane },
- 0x0042: { n:'CodePage', f:parseuint16 },
- 0x004d: { n:"Pls" },
- 0x0050: { n:"DCon" },
- 0x0051: { n:"DConRef" },
- 0x0052: { n:"DConName" },
- 0x0055: { n:"DefColWidth", f:parseuint16 },
- 0x0059: { n:"XCT" },
- 0x005a: { n:"CRN" },
- 0x005b: { n:"FileSharing" },
- 0x005c: { n:'WriteAccess', f:parse_WriteAccess },
- 0x005d: { n:"Obj", f:parse_Obj },
- 0x005e: { n:"Uncalced" },
- 0x005f: { n:"CalcSaveRecalc", f:parsebool },
- 0x0060: { n:"Template" },
- 0x0061: { n:"Intl" },
- 0x0063: { n:"ObjProtect", f:parsebool },
- 0x007d: { n:"ColInfo", f:parse_ColInfo },
- 0x0080: { n:"Guts", f:parse_Guts },
- 0x0081: { n:"WsBool", f:parse_WsBool },
- 0x0082: { n:"GridSet", f:parseuint16 },
- 0x0083: { n:"HCenter", f:parsebool },
- 0x0084: { n:"VCenter", f:parsebool },
- 0x0085: { n:'BoundSheet8', f:parse_BoundSheet8 },
- 0x0086: { n:"WriteProtect" },
- 0x008c: { n:"Country", f:parse_Country },
- 0x008d: { n:"HideObj", f:parseuint16 },
- 0x0090: { n:"Sort" },
- 0x0092: { n:"Palette", f:parse_Palette },
- 0x0097: { n:"Sync" },
- 0x0098: { n:"LPr" },
- 0x0099: { n:"DxGCol" },
- 0x009a: { n:"FnGroupName" },
- 0x009b: { n:"FilterMode" },
- 0x009c: { n:"BuiltInFnGroupCount", f:parseuint16 },
- 0x009d: { n:"AutoFilterInfo" },
- 0x009e: { n:"AutoFilter" },
- 0x00a0: { n:"Scl", f:parse_Scl },
- 0x00a1: { n:"Setup", f:parse_Setup },
- 0x00ae: { n:"ScenMan" },
- 0x00af: { n:"SCENARIO" },
- 0x00b0: { n:"SxView" },
- 0x00b1: { n:"Sxvd" },
- 0x00b2: { n:"SXVI" },
- 0x00b4: { n:"SxIvd" },
- 0x00b5: { n:"SXLI" },
- 0x00b6: { n:"SXPI" },
- 0x00b8: { n:"DocRoute" },
- 0x00b9: { n:"RecipName" },
- 0x00bd: { n:"MulRk", f:parse_MulRk },
- 0x00be: { n:"MulBlank", f:parse_MulBlank },
- 0x00c1: { n:'Mms', f:parsenoop2 },
- 0x00c5: { n:"SXDI" },
- 0x00c6: { n:"SXDB" },
- 0x00c7: { n:"SXFDB" },
- 0x00c8: { n:"SXDBB" },
- 0x00c9: { n:"SXNum" },
- 0x00ca: { n:"SxBool", f:parsebool },
- 0x00cb: { n:"SxErr" },
- 0x00cc: { n:"SXInt" },
- 0x00cd: { n:"SXString" },
- 0x00ce: { n:"SXDtr" },
- 0x00cf: { n:"SxNil" },
- 0x00d0: { n:"SXTbl" },
- 0x00d1: { n:"SXTBRGIITM" },
- 0x00d2: { n:"SxTbpg" },
- 0x00d3: { n:"ObProj" },
- 0x00d5: { n:"SXStreamID" },
- 0x00d7: { n:"DBCell" },
- 0x00d8: { n:"SXRng" },
- 0x00d9: { n:"SxIsxoper" },
- 0x00da: { n:"BookBool", f:parseuint16 },
- 0x00dc: { n:"DbOrParamQry" },
- 0x00dd: { n:"ScenarioProtect", f:parsebool },
- 0x00de: { n:"OleObjectSize" },
- 0x00e0: { n:"XF", f:parse_XF },
- 0x00e1: { n:'InterfaceHdr', f:parse_InterfaceHdr },
- 0x00e2: { n:'InterfaceEnd', f:parsenoop2 },
- 0x00e3: { n:"SXVS" },
- 0x00e5: { n:"MergeCells", f:parse_MergeCells },
- 0x00e9: { n:"BkHim" },
- 0x00eb: { n:"MsoDrawingGroup" },
- 0x00ec: { n:"MsoDrawing" },
- 0x00ed: { n:"MsoDrawingSelection" },
- 0x00ef: { n:"PhoneticInfo" },
- 0x00f0: { n:"SxRule" },
- 0x00f1: { n:"SXEx" },
- 0x00f2: { n:"SxFilt" },
- 0x00f4: { n:"SxDXF" },
- 0x00f5: { n:"SxItm" },
- 0x00f6: { n:"SxName" },
- 0x00f7: { n:"SxSelect" },
- 0x00f8: { n:"SXPair" },
- 0x00f9: { n:"SxFmla" },
- 0x00fb: { n:"SxFormat" },
- 0x00fc: { n:"SST", f:parse_SST },
- 0x00fd: { n:"LabelSst", f:parse_LabelSst },
- 0x00ff: { n:"ExtSST", f:parse_ExtSST },
- 0x0100: { n:"SXVDEx" },
- 0x0103: { n:"SXFormula" },
- 0x0122: { n:"SXDBEx" },
- 0x0137: { n:"RRDInsDel" },
- 0x0138: { n:"RRDHead" },
- 0x013b: { n:"RRDChgCell" },
- 0x013d: { n:"RRTabId", f:parseuint16a },
- 0x013e: { n:"RRDRenSheet" },
- 0x013f: { n:"RRSort" },
- 0x0140: { n:"RRDMove" },
- 0x014a: { n:"RRFormat" },
- 0x014b: { n:"RRAutoFmt" },
- 0x014d: { n:"RRInsertSh" },
- 0x014e: { n:"RRDMoveBegin" },
- 0x014f: { n:"RRDMoveEnd" },
- 0x0150: { n:"RRDInsDelBegin" },
- 0x0151: { n:"RRDInsDelEnd" },
- 0x0152: { n:"RRDConflict" },
- 0x0153: { n:"RRDDefName" },
- 0x0154: { n:"RRDRstEtxp" },
- 0x015f: { n:"LRng" },
- 0x0160: { n:"UsesELFs", f:parsebool },
- 0x0161: { n:"DSF", f:parsenoop2 },
- 0x0191: { n:"CUsr" },
- 0x0192: { n:"CbUsr" },
- 0x0193: { n:"UsrInfo" },
- 0x0194: { n:"UsrExcl" },
- 0x0195: { n:"FileLock" },
- 0x0196: { n:"RRDInfo" },
- 0x0197: { n:"BCUsrs" },
- 0x0198: { n:"UsrChk" },
- 0x01a9: { n:"UserBView" },
- 0x01aa: { n:"UserSViewBegin" },
- 0x01ab: { n:"UserSViewEnd" },
- 0x01ac: { n:"RRDUserView" },
- 0x01ad: { n:"Qsi" },
- 0x01ae: { n:"SupBook", f:parse_SupBook },
- 0x01af: { n:"Prot4Rev", f:parsebool },
- 0x01b0: { n:"CondFmt" },
- 0x01b1: { n:"CF" },
- 0x01b2: { n:"DVal" },
- 0x01b5: { n:"DConBin" },
- 0x01b6: { n:"TxO", f:parse_TxO },
- 0x01b7: { n:"RefreshAll", f:parsebool },
- 0x01b8: { n:"HLink", f:parse_HLink },
- 0x01b9: { n:"Lel" },
- 0x01ba: { n:"CodeName", f:parse_XLUnicodeString },
- 0x01bb: { n:"SXFDBType" },
- 0x01bc: { n:"Prot4RevPass", f:parseuint16 },
- 0x01bd: { n:"ObNoMacros" },
- 0x01be: { n:"Dv" },
- 0x01c0: { n:"Excel9File", f:parsenoop2 },
- 0x01c1: { n:"RecalcId", f:parse_RecalcId, r:2},
- 0x01c2: { n:"EntExU2", f:parsenoop2 },
- 0x0200: { n:"Dimensions", f:parse_Dimensions },
- 0x0201: { n:"Blank", f:parse_Blank },
- 0x0203: { n:"Number", f:parse_Number },
- 0x0204: { n:"Label", f:parse_Label },
- 0x0205: { n:"BoolErr", f:parse_BoolErr },
- 0x0206: { n:"Formula", f:parse_Formula },
- 0x0207: { n:"String", f:parse_String },
- 0x0208: { n:'Row', f:parse_Row },
- 0x020b: { n:"Index" },
- 0x0221: { n:"Array", f:parse_Array },
- 0x0225: { n:"DefaultRowHeight", f:parse_DefaultRowHeight },
- 0x0236: { n:"Table" },
- 0x023e: { n:"Window2", f:parse_Window2 },
- 0x027e: { n:"RK", f:parse_RK },
- 0x0293: { n:"Style" },
- 0x0406: { n:"Formula", f:parse_Formula },
- 0x0418: { n:"BigName" },
- 0x041e: { n:"Format", f:parse_Format },
- 0x043c: { n:"ContinueBigName" },
- 0x04bc: { n:"ShrFmla", f:parse_ShrFmla },
- 0x0800: { n:"HLinkTooltip", f:parse_HLinkTooltip },
- 0x0801: { n:"WebPub" },
- 0x0802: { n:"QsiSXTag" },
- 0x0803: { n:"DBQueryExt" },
- 0x0804: { n:"ExtString" },
- 0x0805: { n:"TxtQry" },
- 0x0806: { n:"Qsir" },
- 0x0807: { n:"Qsif" },
- 0x0808: { n:"RRDTQSIF" },
- 0x0809: { n:'BOF', f:parse_BOF },
- 0x080a: { n:"OleDbConn" },
- 0x080b: { n:"WOpt" },
- 0x080c: { n:"SXViewEx" },
- 0x080d: { n:"SXTH" },
- 0x080e: { n:"SXPIEx" },
- 0x080f: { n:"SXVDTEx" },
- 0x0810: { n:"SXViewEx9" },
- 0x0812: { n:"ContinueFrt" },
- 0x0813: { n:"RealTimeData" },
- 0x0850: { n:"ChartFrtInfo" },
- 0x0851: { n:"FrtWrapper" },
- 0x0852: { n:"StartBlock" },
- 0x0853: { n:"EndBlock" },
- 0x0854: { n:"StartObject" },
- 0x0855: { n:"EndObject" },
- 0x0856: { n:"CatLab" },
- 0x0857: { n:"YMult" },
- 0x0858: { n:"SXViewLink" },
- 0x0859: { n:"PivotChartBits" },
- 0x085a: { n:"FrtFontList" },
- 0x0862: { n:"SheetExt" },
- 0x0863: { n:"BookExt", r:12},
- 0x0864: { n:"SXAddl" },
- 0x0865: { n:"CrErr" },
- 0x0866: { n:"HFPicture" },
- 0x0867: { n:'FeatHdr', f:parsenoop2 },
- 0x0868: { n:"Feat" },
- 0x086a: { n:"DataLabExt" },
- 0x086b: { n:"DataLabExtContents" },
- 0x086c: { n:"CellWatch" },
- 0x0871: { n:"FeatHdr11" },
- 0x0872: { n:"Feature11" },
- 0x0874: { n:"DropDownObjIds" },
- 0x0875: { n:"ContinueFrt11" },
- 0x0876: { n:"DConn" },
- 0x0877: { n:"List12" },
- 0x0878: { n:"Feature12" },
- 0x0879: { n:"CondFmt12" },
- 0x087a: { n:"CF12" },
- 0x087b: { n:"CFEx" },
- 0x087c: { n:"XFCRC", f:parse_XFCRC, r:12 },
- 0x087d: { n:"XFExt", f:parse_XFExt, r:12 },
- 0x087e: { n:"AutoFilter12" },
- 0x087f: { n:"ContinueFrt12" },
- 0x0884: { n:"MDTInfo" },
- 0x0885: { n:"MDXStr" },
- 0x0886: { n:"MDXTuple" },
- 0x0887: { n:"MDXSet" },
- 0x0888: { n:"MDXProp" },
- 0x0889: { n:"MDXKPI" },
- 0x088a: { n:"MDB" },
- 0x088b: { n:"PLV" },
- 0x088c: { n:"Compat12", f:parsebool, r:12 },
- 0x088d: { n:"DXF" },
- 0x088e: { n:"TableStyles", r:12 },
- 0x088f: { n:"TableStyle" },
- 0x0890: { n:"TableStyleElement" },
- 0x0892: { n:"StyleExt" },
- 0x0893: { n:"NamePublish" },
- 0x0894: { n:"NameCmt", f:parse_NameCmt, r:12 },
- 0x0895: { n:"SortData" },
- 0x0896: { n:"Theme", f:parse_Theme, r:12 },
- 0x0897: { n:"GUIDTypeLib" },
- 0x0898: { n:"FnGrp12" },
- 0x0899: { n:"NameFnGrp12" },
- 0x089a: { n:"MTRSettings", f:parse_MTRSettings, r:12 },
- 0x089b: { n:"CompressPictures", f:parsenoop2 },
- 0x089c: { n:"HeaderFooter" },
- 0x089d: { n:"CrtLayout12" },
- 0x089e: { n:"CrtMlFrt" },
- 0x089f: { n:"CrtMlFrtContinue" },
- 0x08a3: { n:"ForceFullCalculation", f:parse_ForceFullCalculation },
- 0x08a4: { n:"ShapePropsStream" },
- 0x08a5: { n:"TextPropsStream" },
- 0x08a6: { n:"RichTextStream" },
- 0x08a7: { n:"CrtLayout12A" },
- 0x1001: { n:"Units" },
- 0x1002: { n:"Chart" },
- 0x1003: { n:"Series" },
- 0x1006: { n:"DataFormat" },
- 0x1007: { n:"LineFormat" },
- 0x1009: { n:"MarkerFormat" },
- 0x100a: { n:"AreaFormat" },
- 0x100b: { n:"PieFormat" },
- 0x100c: { n:"AttachedLabel" },
- 0x100d: { n:"SeriesText" },
- 0x1014: { n:"ChartFormat" },
- 0x1015: { n:"Legend" },
- 0x1016: { n:"SeriesList" },
- 0x1017: { n:"Bar" },
- 0x1018: { n:"Line" },
- 0x1019: { n:"Pie" },
- 0x101a: { n:"Area" },
- 0x101b: { n:"Scatter" },
- 0x101c: { n:"CrtLine" },
- 0x101d: { n:"Axis" },
- 0x101e: { n:"Tick" },
- 0x101f: { n:"ValueRange" },
- 0x1020: { n:"CatSerRange" },
- 0x1021: { n:"AxisLine" },
- 0x1022: { n:"CrtLink" },
- 0x1024: { n:"DefaultText" },
- 0x1025: { n:"Text" },
- 0x1026: { n:"FontX", f:parseuint16 },
- 0x1027: { n:"ObjectLink" },
- 0x1032: { n:"Frame" },
- 0x1033: { n:"Begin" },
- 0x1034: { n:"End" },
- 0x1035: { n:"PlotArea" },
- 0x103a: { n:"Chart3d" },
- 0x103c: { n:"PicF" },
- 0x103d: { n:"DropBar" },
- 0x103e: { n:"Radar" },
- 0x103f: { n:"Surf" },
- 0x1040: { n:"RadarArea" },
- 0x1041: { n:"AxisParent" },
- 0x1043: { n:"LegendException" },
- 0x1044: { n:"ShtProps", f:parse_ShtProps },
- 0x1045: { n:"SerToCrt" },
- 0x1046: { n:"AxesUsed" },
- 0x1048: { n:"SBaseRef" },
- 0x104a: { n:"SerParent" },
- 0x104b: { n:"SerAuxTrend" },
- 0x104e: { n:"IFmtRecord" },
- 0x104f: { n:"Pos" },
- 0x1050: { n:"AlRuns" },
- 0x1051: { n:"BRAI" },
- 0x105b: { n:"SerAuxErrBar" },
- 0x105c: { n:"ClrtClient", f:parse_ClrtClient },
- 0x105d: { n:"SerFmt" },
- 0x105f: { n:"Chart3DBarShape" },
- 0x1060: { n:"Fbi" },
- 0x1061: { n:"BopPop" },
- 0x1062: { n:"AxcExt" },
- 0x1063: { n:"Dat" },
- 0x1064: { n:"PlotGrowth" },
- 0x1065: { n:"SIIndex" },
- 0x1066: { n:"GelFrame" },
- 0x1067: { n:"BopPopCustom" },
- 0x1068: { n:"Fbi2" },
-
- 0x0000: { n:"Dimensions", f:parse_Dimensions },
- 0x0002: { n:"BIFF2INT", f:parse_BIFF2INT },
- 0x0005: { n:"BoolErr", f:parse_BoolErr },
- 0x0007: { n:"String", f:parse_BIFF2STRING },
- 0x0008: { n:"BIFF2ROW" },
- 0x000b: { n:"Index" },
- 0x0016: { n:"ExternCount", f:parseuint16 },
- 0x001e: { n:"BIFF2FORMAT", f:parse_BIFF2Format },
- 0x001f: { n:"BIFF2FMTCNT" }, /* 16-bit cnt of BIFF2FORMAT records */
- 0x0020: { n:"BIFF2COLINFO" },
- 0x0021: { n:"Array", f:parse_Array },
- 0x0025: { n:"DefaultRowHeight", f:parse_DefaultRowHeight },
- 0x0032: { n:"BIFF2FONTXTRA", f:parse_BIFF2FONTXTRA },
- 0x0034: { n:"DDEObjName" },
- 0x003e: { n:"BIFF2WINDOW2" },
- 0x0043: { n:"BIFF2XF" },
- 0x0045: { n:"BIFF2FONTCLR" },
- 0x0056: { n:"BIFF4FMTCNT" }, /* 16-bit cnt, similar to BIFF2 */
- 0x007e: { n:"RK" }, /* Not necessarily same as 0x027e */
- 0x007f: { n:"ImData", f:parse_ImData },
- 0x0087: { n:"Addin" },
- 0x0088: { n:"Edg" },
- 0x0089: { n:"Pub" },
- 0x0091: { n:"Sub" },
- 0x0094: { n:"LHRecord" },
- 0x0095: { n:"LHNGraph" },
- 0x0096: { n:"Sound" },
- 0x00a9: { n:"CoordList" },
- 0x00ab: { n:"GCW" },
- 0x00bc: { n:"ShrFmla" }, /* Not necessarily same as 0x04bc */
- 0x00bf: { n:"ToolbarHdr" },
- 0x00c0: { n:"ToolbarEnd" },
- 0x00c2: { n:"AddMenu" },
- 0x00c3: { n:"DelMenu" },
- 0x00d6: { n:"RString", f:parse_RString },
- 0x00df: { n:"UDDesc" },
- 0x00ea: { n:"TabIdConf" },
- 0x0162: { n:"XL5Modify" },
- 0x01a5: { n:"FileSharing2" },
- 0x0209: { n:'BOF', f:parse_BOF },
- 0x0218: { n:"Lbl", f:parse_Lbl },
- 0x0223: { n:"ExternName", f:parse_ExternName },
- 0x0231: { n:"Font" },
- 0x0243: { n:"BIFF3XF" },
- 0x0409: { n:'BOF', f:parse_BOF },
- 0x0443: { n:"BIFF4XF" },
- 0x086d: { n:"FeatInfo" },
- 0x0873: { n:"FeatInfo11" },
- 0x0881: { n:"SXAddl12" },
- 0x08c0: { n:"AutoWebPub" },
- 0x08c1: { n:"ListObj" },
- 0x08c2: { n:"ListField" },
- 0x08c3: { n:"ListDV" },
- 0x08c4: { n:"ListCondFmt" },
- 0x08c5: { n:"ListCF" },
- 0x08c6: { n:"FMQry" },
- 0x08c7: { n:"FMSQry" },
- 0x08c8: { n:"PLV" },
- 0x08c9: { n:"LnExt" },
- 0x08ca: { n:"MkrExt" },
- 0x08cb: { n:"CrtCoopt" },
- 0x08d6: { n:"FRTArchId$", r:12 },
-
- 0x7262: {}
- };
-
- var XLSRE = evert_key(XLSRecordEnum, 'n');
- function write_biff_rec(ba, type, payload, length) {
- var t = +type || +XLSRE[type];
- if(isNaN(t)) return;
- var len = length || (payload||[]).length || 0;
- var o = ba.next(4);
- o.write_shift(2, t);
- o.write_shift(2, len);
- if(len > 0 && is_buf(payload)) ba.push(payload);
- }
-
- function write_biff_continue(ba, type, payload, length) {
- var len = length || (payload||[]).length || 0;
- if(len <= 8224) return write_biff_rec(ba, type, payload, len);
- var t = +type || +XLSRE[type];
- if(isNaN(t)) return;
- var parts = payload.parts || [], sidx = 0;
- var i = 0, w = 0;
- while(w + (parts[sidx] || 8224) <= 8224) { w+= (parts[sidx] || 8224); sidx++; }
- var o = ba.next(4);
- o.write_shift(2, t);
- o.write_shift(2, w);
- ba.push(payload.slice(i, i + w));
- i += w;
- while(i < len) {
- o = ba.next(4);
- o.write_shift(2, 0x3c); // TODO: figure out correct continue type
- w = 0;
- while(w + (parts[sidx] || 8224) <= 8224) { w+= (parts[sidx] || 8224); sidx++; }
- o.write_shift(2, w);
- ba.push(payload.slice(i, i+w)); i+= w;
- }
- }
-
- function write_BIFF2Cell(out, r, c) {
- if(!out) out = new_buf(7);
- out.write_shift(2, r);
- out.write_shift(2, c);
- out.write_shift(2, 0);
- out.write_shift(1, 0);
- return out;
- }
-
- function write_BIFF2BERR(r, c, val, t) {
- var out = new_buf(9);
- write_BIFF2Cell(out, r, c);
- if(t == 'e') { out.write_shift(1, val); out.write_shift(1, 1); }
- else { out.write_shift(1, val?1:0); out.write_shift(1, 0); }
- return out;
- }
-
- /* TODO: codepage, large strings */
- function write_BIFF2LABEL(r, c, val) {
- var out = new_buf(8 + 2*val.length);
- write_BIFF2Cell(out, r, c);
- out.write_shift(1, val.length);
- out.write_shift(val.length, val, 'sbcs');
- return out.l < out.length ? out.slice(0, out.l) : out;
- }
-
- function write_ws_biff2_cell(ba, cell, R, C) {
- if(cell.v != null) switch(cell.t) {
- case 'd': case 'n':
- var v = cell.t == 'd' ? datenum(parseDate(cell.v)) : cell.v;
- if((v == (v|0)) && (v >= 0) && (v < 65536))
- write_biff_rec(ba, 0x0002, write_BIFF2INT(R, C, v));
- else
- write_biff_rec(ba, 0x0003, write_BIFF2NUM(R,C, v));
- return;
- case 'b': case 'e': write_biff_rec(ba, 0x0005, write_BIFF2BERR(R, C, cell.v, cell.t)); return;
- /* TODO: codepage, sst */
- case 's': case 'str':
- write_biff_rec(ba, 0x0004, write_BIFF2LABEL(R, C, cell.v));
- return;
- }
- write_biff_rec(ba, 0x0001, write_BIFF2Cell(null, R, C));
- }
-
- function write_ws_biff2(ba, ws, idx, opts) {
- var dense = Array.isArray(ws);
- var range = safe_decode_range(ws['!ref'] || "A1"), ref, rr = "", cols = [];
- if(range.e.c > 0xFF || range.e.r > 0x3FFF) {
- if(opts.WTF) throw new Error("Range " + (ws['!ref'] || "A1") + " exceeds format limit A1:IV16384");
- range.e.c = Math.min(range.e.c, 0xFF);
- range.e.r = Math.min(range.e.c, 0x3FFF);
- ref = encode_range(range);
- }
- for(var R = range.s.r; R <= range.e.r; ++R) {
- rr = encode_row(R);
- for(var C = range.s.c; C <= range.e.c; ++C) {
- if(R === range.s.r) cols[C] = encode_col(C);
- ref = cols[C] + rr;
- var cell = dense ? (ws[R]||[])[C] : ws[ref];
- if(!cell) continue;
- /* write cell */
- write_ws_biff2_cell(ba, cell, R, C, opts);
- }
- }
- }
-
- /* Based on test files */
- function write_biff2_buf(wb, opts) {
- var o = opts || {};
- if(DENSE != null && o.dense == null) o.dense = DENSE;
- var ba = buf_array();
- var idx = 0;
- for(var i=0;i<wb.SheetNames.length;++i) if(wb.SheetNames[i] == o.sheet) idx=i;
- if(idx == 0 && !!o.sheet && wb.SheetNames[0] != o.sheet) throw new Error("Sheet not found: " + o.sheet);
- write_biff_rec(ba, 0x0009, write_BOF(wb, 0x10, o));
- /* ... */
- write_ws_biff2(ba, wb.Sheets[wb.SheetNames[idx]], idx, o, wb);
- /* ... */
- write_biff_rec(ba, 0x000A);
- return ba.end();
- }
-
- function write_FONTS_biff8(ba, data, opts) {
- write_biff_rec(ba, "Font", write_Font({
- sz:12,
- color: {theme:1},
- name: "Arial",
- family: 2,
- scheme: "minor"
- }, opts));
- }
-
-
- function write_FMTS_biff8(ba, NF, opts) {
- if(!NF) return;
- [[5,8],[23,26],[41,44],[/*63*/50,/*66],[164,*/392]].forEach(function(r) {
- for(var i = r[0]; i <= r[1]; ++i) if(NF[i] != null) write_biff_rec(ba, "Format", write_Format(i, NF[i], opts));
- });
- }
-
- function write_FEAT(ba, ws) {
- /* [MS-XLS] 2.4.112 */
- var o = new_buf(19);
- o.write_shift(4, 0x867); o.write_shift(4, 0); o.write_shift(4, 0);
- o.write_shift(2, 3); o.write_shift(1, 1); o.write_shift(4, 0);
- write_biff_rec(ba, "FeatHdr", o);
- /* [MS-XLS] 2.4.111 */
- o = new_buf(39);
- o.write_shift(4, 0x868); o.write_shift(4, 0); o.write_shift(4, 0);
- o.write_shift(2, 3); o.write_shift(1, 0); o.write_shift(4, 0);
- o.write_shift(2, 1); o.write_shift(4, 4); o.write_shift(2, 0);
- write_Ref8U(safe_decode_range(ws['!ref']||"A1"), o);
- o.write_shift(4, 4);
- write_biff_rec(ba, "Feat", o);
- }
-
- function write_CELLXFS_biff8(ba, opts) {
- for(var i = 0; i < 16; ++i) write_biff_rec(ba, "XF", write_XF({numFmtId:0, style:true}, 0, opts));
- opts.cellXfs.forEach(function(c) {
- write_biff_rec(ba, "XF", write_XF(c, 0, opts));
- });
- }
-
- function write_ws_biff8_hlinks(ba, ws) {
- for(var R=0; R<ws['!links'].length; ++R) {
- var HL = ws['!links'][R];
- write_biff_rec(ba, "HLink", write_HLink(HL));
- if(HL[1].Tooltip) write_biff_rec(ba, "HLinkTooltip", write_HLinkTooltip(HL));
- }
- delete ws['!links'];
- }
-
- function write_ws_biff8_cell(ba, cell, R, C, opts) {
- var os = 16 + get_cell_style(opts.cellXfs, cell, opts);
- if(cell.v == null && !cell.bf) {
- write_biff_rec(ba, "Blank", write_XLSCell(R, C, os));
- return;
- }
- if(cell.bf) write_biff_rec(ba, "Formula", write_Formula(cell, R, C, opts, os));
- else switch(cell.t) {
- case 'd': case 'n':
- var v = cell.t == 'd' ? datenum(parseDate(cell.v)) : cell.v;
- /* TODO: emit RK as appropriate */
- write_biff_rec(ba, "Number", write_Number(R, C, v, os, opts));
- break;
- case 'b': case 'e':
- write_biff_rec(ba, 0x0205, write_BoolErr(R, C, cell.v, os, opts, cell.t));
- break;
- /* TODO: codepage, sst */
- case 's': case 'str':
- if(opts.bookSST) {
- var isst = get_sst_id(opts.Strings, cell.v, opts.revStrings);
- write_biff_rec(ba, "LabelSst", write_LabelSst(R, C, isst, os, opts));
- } else write_biff_rec(ba, "Label", write_Label(R, C, cell.v, os, opts));
- break;
- default:
- write_biff_rec(ba, "Blank", write_XLSCell(R, C, os));
- }
- }
-
- /* [MS-XLS] 2.1.7.20.5 */
- function write_ws_biff8(idx, opts, wb) {
- var ba = buf_array();
- var s = wb.SheetNames[idx], ws = wb.Sheets[s] || {};
- var _WB = ((wb||{}).Workbook||{});
- var _sheet = ((_WB.Sheets||[])[idx]||{});
- var dense = Array.isArray(ws);
- var b8 = opts.biff == 8;
- var ref, rr = "", cols = [];
- var range = safe_decode_range(ws['!ref'] || "A1");
- var MAX_ROWS = b8 ? 65536 : 16384;
- if(range.e.c > 0xFF || range.e.r >= MAX_ROWS) {
- if(opts.WTF) throw new Error("Range " + (ws['!ref'] || "A1") + " exceeds format limit A1:IV16384");
- range.e.c = Math.min(range.e.c, 0xFF);
- range.e.r = Math.min(range.e.c, MAX_ROWS-1);
- }
-
- write_biff_rec(ba, 0x0809, write_BOF(wb, 0x10, opts));
- /* [Uncalced] Index */
- write_biff_rec(ba, "CalcMode", writeuint16(1));
- write_biff_rec(ba, "CalcCount", writeuint16(100));
- write_biff_rec(ba, "CalcRefMode", writebool(true));
- write_biff_rec(ba, "CalcIter", writebool(false));
- write_biff_rec(ba, "CalcDelta", write_Xnum(0.001));
- write_biff_rec(ba, "CalcSaveRecalc", writebool(true));
- write_biff_rec(ba, "PrintRowCol", writebool(false));
- write_biff_rec(ba, "PrintGrid", writebool(false));
- write_biff_rec(ba, "GridSet", writeuint16(1));
- write_biff_rec(ba, "Guts", write_Guts([0,0]));
- /* DefaultRowHeight WsBool [Sync] [LPr] [HorizontalPageBreaks] [VerticalPageBreaks] */
- /* Header (string) */
- /* Footer (string) */
- write_biff_rec(ba, "HCenter", writebool(false));
- write_biff_rec(ba, "VCenter", writebool(false));
- /* ... */
- write_biff_rec(ba, 0x200, write_Dimensions(range, opts));
- /* ... */
-
- if(b8) ws['!links'] = [];
- for(var R = range.s.r; R <= range.e.r; ++R) {
- rr = encode_row(R);
- for(var C = range.s.c; C <= range.e.c; ++C) {
- if(R === range.s.r) cols[C] = encode_col(C);
- ref = cols[C] + rr;
- var cell = dense ? (ws[R]||[])[C] : ws[ref];
- if(!cell) continue;
- /* write cell */
- write_ws_biff8_cell(ba, cell, R, C, opts);
- if(b8 && cell.l) ws['!links'].push([ref, cell.l]);
- }
- }
- var cname = _sheet.CodeName || _sheet.name || s;
- /* ... */
- if(b8) write_biff_rec(ba, "Window2", write_Window2((_WB.Views||[])[0]));
- /* ... */
- if(b8 && (ws['!merges']||[]).length) write_biff_rec(ba, "MergeCells", write_MergeCells(ws['!merges']));
- /* [LRng] *QUERYTABLE [PHONETICINFO] CONDFMTS */
- if(b8) write_ws_biff8_hlinks(ba, ws);
- /* [DVAL] */
- write_biff_rec(ba, "CodeName", write_XLUnicodeString(cname, opts));
- /* *WebPub *CellWatch [SheetExt] */
- if(b8) write_FEAT(ba, ws);
- /* *FEAT11 *RECORD12 */
- write_biff_rec(ba, "EOF");
- return ba.end();
- }
-
- /* [MS-XLS] 2.1.7.20.3 */
- function write_biff8_global(wb, bufs, opts) {
- var A = buf_array();
- var _WB = ((wb||{}).Workbook||{});
- var _sheets = (_WB.Sheets||[]);
- var _wb = _WB.WBProps||{};
- var b8 = opts.biff == 8, b5 = opts.biff == 5;
- write_biff_rec(A, 0x0809, write_BOF(wb, 0x05, opts));
- if(opts.bookType == "xla") write_biff_rec(A, "Addin");
- write_biff_rec(A, "InterfaceHdr", b8 ? writeuint16(0x04b0) : null);
- write_biff_rec(A, "Mms", writezeroes(2));
- if(b5) write_biff_rec(A, "ToolbarHdr");
- if(b5) write_biff_rec(A, "ToolbarEnd");
- write_biff_rec(A, "InterfaceEnd");
- write_biff_rec(A, "WriteAccess", write_WriteAccess("SheetJS", opts));
- /* [FileSharing] */
- write_biff_rec(A, "CodePage", writeuint16(b8 ? 0x04b0 : 0x04E4));
- /* *2047 Lel */
- if(b8) write_biff_rec(A, "DSF", writeuint16(0));
- if(b8) write_biff_rec(A, "Excel9File");
- write_biff_rec(A, "RRTabId", write_RRTabId(wb.SheetNames.length));
- if(b8 && wb.vbaraw) write_biff_rec(A, "ObProj");
- /* [ObNoMacros] */
- if(b8 && wb.vbaraw) {
- var cname = _wb.CodeName || "ThisWorkbook";
- write_biff_rec(A, "CodeName", write_XLUnicodeString(cname, opts));
- }
- write_biff_rec(A, "BuiltInFnGroupCount", writeuint16(0x11));
- /* *FnGroupName *FnGrp12 */
- /* *Lbl */
- /* [OleObjectSize] */
- write_biff_rec(A, "WinProtect", writebool(false));
- write_biff_rec(A, "Protect", writebool(false));
- write_biff_rec(A, "Password", writeuint16(0));
- if(b8) write_biff_rec(A, "Prot4Rev", writebool(false));
- if(b8) write_biff_rec(A, "Prot4RevPass", writeuint16(0));
- write_biff_rec(A, "Window1", write_Window1(opts));
- write_biff_rec(A, "Backup", writebool(false));
- write_biff_rec(A, "HideObj", writeuint16(0));
- write_biff_rec(A, "Date1904", writebool(safe1904(wb)=="true"));
- write_biff_rec(A, "CalcPrecision", writebool(true));
- if(b8) write_biff_rec(A, "RefreshAll", writebool(false));
- write_biff_rec(A, "BookBool", writeuint16(0));
- /* ... */
- write_FONTS_biff8(A, wb, opts);
- write_FMTS_biff8(A, wb.SSF, opts);
- write_CELLXFS_biff8(A, opts);
- /* ... */
- if(b8) write_biff_rec(A, "UsesELFs", writebool(false));
- var a = A.end();
-
- var C = buf_array();
- /* METADATA [MTRSettings] [ForceFullCalculation] */
- if(b8) write_biff_rec(C, "Country", write_Country());
- /* *SUPBOOK *LBL *RTD [RecalcId] *HFPicture *MSODRAWINGGROUP */
-
- /* BIFF8: [SST *Continue] ExtSST */
- if(b8 && opts.Strings) write_biff_continue(C, "SST", write_SST(opts.Strings, opts));
-
- /* *WebPub [WOpt] [CrErr] [BookExt] *FeatHdr *DConn [THEME] [CompressPictures] [Compat12] [GUIDTypeLib] */
- write_biff_rec(C, "EOF");
- var c = C.end();
-
- var B = buf_array();
- var blen = 0, j = 0;
- for(j = 0; j < wb.SheetNames.length; ++j) blen += (b8 ? 12 : 11) + (b8 ? 2 : 1) * wb.SheetNames[j].length;
- var start = a.length + blen + c.length;
- for(j = 0; j < wb.SheetNames.length; ++j) {
- var _sheet = _sheets[j] || ({});
- write_biff_rec(B, "BoundSheet8", write_BoundSheet8({pos:start, hs:_sheet.Hidden||0, dt:0, name:wb.SheetNames[j]}, opts));
- start += bufs[j].length;
- }
- /* 1*BoundSheet8 */
- var b = B.end();
- if(blen != b.length) throw new Error("BS8 " + blen + " != " + b.length);
-
- var out = [];
- if(a.length) out.push(a);
- if(b.length) out.push(b);
- if(c.length) out.push(c);
- return __toBuffer([out]);
- }
-
- /* [MS-XLS] 2.1.7.20 Workbook Stream */
- function write_biff8_buf(wb, opts) {
- var o = opts || {};
- var bufs = [];
-
- if(wb && !wb.SSF) {
- wb.SSF = SSF.get_table();
- }
- if(wb && wb.SSF) {
- make_ssf(SSF); SSF.load_table(wb.SSF);
- // $FlowIgnore
- o.revssf = evert_num(wb.SSF); o.revssf[wb.SSF[65535]] = 0;
- o.ssf = wb.SSF;
- }
-
- o.Strings = []; o.Strings.Count = 0; o.Strings.Unique = 0;
- fix_write_opts(o);
-
- o.cellXfs = [];
- get_cell_style(o.cellXfs, {}, {revssf:{"General":0}});
-
- if(!wb.Props) wb.Props = {};
-
- for(var i = 0; i < wb.SheetNames.length; ++i) bufs[bufs.length] = write_ws_biff8(i, o, wb);
- bufs.unshift(write_biff8_global(wb, bufs, o));
- return __toBuffer([bufs]);
- }
-
- function write_biff_buf(wb, opts) {
- var o = opts || {};
- switch(o.biff || 2) {
- case 8: case 5: return write_biff8_buf(wb, opts);
- case 4: case 3: case 2: return write_biff2_buf(wb, opts);
- }
- throw new Error("invalid type " + o.bookType + " for BIFF");
- }
- /* note: browser DOM element cannot see mso- style attrs, must parse */
- var HTML_ = (function() {
- function html_to_sheet(str, _opts) {
- var opts = _opts || {};
- if(DENSE != null && opts.dense == null) opts.dense = DENSE;
- var ws = opts.dense ? ([]) : ({});
- str = str.replace(/<!--.*?-->/g, "");
- var mtch = str.match(/<table/i);
- if(!mtch) throw new Error("Invalid HTML: could not find <table>");
- var mtch2 = str.match(/<\/table/i);
- var i = mtch.index, j = mtch2 && mtch2.index || str.length;
- var rows = split_regex(str.slice(i, j), /(:?<tr[^>]*>)/i, "<tr>");
- var R = -1, C = 0, RS = 0, CS = 0;
- var range = {s:{r:10000000, c:10000000},e:{r:0,c:0}};
- var merges = [];
- for(i = 0; i < rows.length; ++i) {
- var row = rows[i].trim();
- var hd = row.slice(0,3).toLowerCase();
- if(hd == "<tr") { ++R; if(opts.sheetRows && opts.sheetRows <= R) { --R; break; } C = 0; continue; }
- if(hd != "<td" && hd != "<th") continue;
- var cells = row.split(/<\/t[dh]>/i);
- for(j = 0; j < cells.length; ++j) {
- var cell = cells[j].trim();
- if(!cell.match(/<t[dh]/i)) continue;
- var m = cell, cc = 0;
- /* TODO: parse styles etc */
- while(m.charAt(0) == "<" && (cc = m.indexOf(">")) > -1) m = m.slice(cc+1);
- for(var midx = 0; midx < merges.length; ++midx) {
- var _merge = merges[midx];
- if(_merge.s.c == C && _merge.s.r < R && R <= _merge.e.r) { C = _merge.e.c + 1; midx = -1; }
- }
- var tag = parsexmltag(cell.slice(0, cell.indexOf(">")));
- CS = tag.colspan ? +tag.colspan : 1;
- if((RS = +tag.rowspan)>1 || CS>1) merges.push({s:{r:R,c:C},e:{r:R + (RS||1) - 1, c:C + CS - 1}});
- var _t = tag.t || "";
- /* TODO: generate stub cells */
- if(!m.length) { C += CS; continue; }
- m = htmldecode(m);
- if(range.s.r > R) range.s.r = R; if(range.e.r < R) range.e.r = R;
- if(range.s.c > C) range.s.c = C; if(range.e.c < C) range.e.c = C;
- if(!m.length) continue;
- var o = {t:'s', v:m};
- if(opts.raw || !m.trim().length || _t == 's'){}
- else if(m === 'TRUE') o = {t:'b', v:true};
- else if(m === 'FALSE') o = {t:'b', v:false};
- else if(!isNaN(fuzzynum(m))) o = {t:'n', v:fuzzynum(m)};
- else if(!isNaN(fuzzydate(m).getDate())) {
- o = ({t:'d', v:parseDate(m)});
- if(!opts.cellDates) o = ({t:'n', v:datenum(o.v)});
- o.z = opts.dateNF || SSF._table[14];
- }
- if(opts.dense) { if(!ws[R]) ws[R] = []; ws[R][C] = o; }
- else ws[encode_cell({r:R, c:C})] = o;
- C += CS;
- }
- }
- ws['!ref'] = encode_range(range);
- if(merges.length) ws["!merges"] = merges;
- return ws;
- }
- function html_to_book(str, opts) {
- return sheet_to_workbook(html_to_sheet(str, opts), opts);
- }
- function make_html_row(ws, r, R, o) {
- var M = (ws['!merges'] ||[]);
- var oo = [];
- for(var C = r.s.c; C <= r.e.c; ++C) {
- var RS = 0, CS = 0;
- for(var j = 0; j < M.length; ++j) {
- if(M[j].s.r > R || M[j].s.c > C) continue;
- if(M[j].e.r < R || M[j].e.c < C) continue;
- if(M[j].s.r < R || M[j].s.c < C) { RS = -1; break; }
- RS = M[j].e.r - M[j].s.r + 1; CS = M[j].e.c - M[j].s.c + 1; break;
- }
- if(RS < 0) continue;
- var coord = encode_cell({r:R,c:C});
- var cell = o.dense ? (ws[R]||[])[C] : ws[coord];
- /* TODO: html entities */
- var w = (cell && cell.v != null) && (cell.h || escapehtml(cell.w || (format_cell(cell), cell.w) || "")) || "";
- var sp = ({});
- if(RS > 1) sp.rowspan = RS;
- if(CS > 1) sp.colspan = CS;
- sp.t = cell && cell.t || 'z';
- if(o.editable) w = '<span contenteditable="true">' + w + '</span>';
- sp.id = (o.id || "sjs") + "-" + coord;
- if(sp.t != "z") { sp.v = cell.v; if(cell.z != null) sp.z = cell.z; }
- oo.push(writextag('td', w, sp));
- }
- var preamble = "<tr>";
- return preamble + oo.join("") + "</tr>";
- }
- function make_html_preamble(ws, R, o) {
- var out = [];
- return out.join("") + '<table' + (o && o.id ? ' id="' + o.id + '"' : "") + '>';
- }
- var _BEGIN = '<html><head><meta charset="utf-8"/><title>SheetJS Table Export</title></head><body>';
- var _END = '</body></html>';
- function sheet_to_html(ws, opts/*, wb:?Workbook*/) {
- var o = opts || {};
- var header = o.header != null ? o.header : _BEGIN;
- var footer = o.footer != null ? o.footer : _END;
- var out = [header];
- var r = decode_range(ws['!ref']);
- o.dense = Array.isArray(ws);
- out.push(make_html_preamble(ws, r, o));
- for(var R = r.s.r; R <= r.e.r; ++R) out.push(make_html_row(ws, r, R, o));
- out.push("</table>" + footer);
- return out.join("");
-
- }
- return {
- to_workbook: html_to_book,
- to_sheet: html_to_sheet,
- _row: make_html_row,
- BEGIN: _BEGIN,
- END: _END,
- _preamble: make_html_preamble,
- from_sheet: sheet_to_html
- };
- })();
-
- function sheet_add_dom(ws, table, _opts) {
- var opts = _opts || {};
- if(DENSE != null) opts.dense = DENSE;
- var or_R = 0, or_C = 0;
- if(opts.origin != null) {
- if(typeof opts.origin == 'number') or_R = opts.origin;
- else {
- var _origin = typeof opts.origin == "string" ? decode_cell(opts.origin) : opts.origin;
- or_R = _origin.r; or_C = _origin.c;
- }
- }
- var rows = table.getElementsByTagName('tr');
- var sheetRows = Math.min(opts.sheetRows||10000000, rows.length);
- var range = {s:{r:0,c:0},e:{r:or_R,c:or_C}};
- if(ws["!ref"]) {
- var _range = decode_range(ws["!ref"]);
- range.s.r = Math.min(range.s.r, _range.s.r);
- range.s.c = Math.min(range.s.c, _range.s.c);
- range.e.r = Math.max(range.e.r, _range.e.r);
- range.e.c = Math.max(range.e.c, _range.e.c);
- if(or_R == -1) range.e.r = or_R = _range.e.r + 1;
- }
- var merges = [], midx = 0;
- var rowinfo = ws["!rows"] || (ws["!rows"] = []);
- var _R = 0, R = 0, _C = 0, C = 0, RS = 0, CS = 0;
- if(!ws["!cols"]) ws['!cols'] = [];
- for(; _R < rows.length && R < sheetRows; ++_R) {
- var row = rows[_R];
- if (is_dom_element_hidden(row)) {
- if (opts.display) continue;
- rowinfo[R] = {hidden: true};
- }
- var elts = (row.children);
- for(_C = C = 0; _C < elts.length; ++_C) {
- var elt = elts[_C];
- if (opts.display && is_dom_element_hidden(elt)) continue;
- var v = elt.hasAttribute('v') ? elt.getAttribute('v') : htmldecode(elt.innerHTML);
- var z = elt.getAttribute('z');
- for(midx = 0; midx < merges.length; ++midx) {
- var m = merges[midx];
- 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; }
- }
- /* TODO: figure out how to extract nonstandard mso- style */
- CS = +elt.getAttribute("colspan") || 1;
- 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}});
- var o = {t:'s', v:v};
- var _t = elt.getAttribute("t") || "";
- if(v != null) {
- if(v.length == 0) o.t = _t || 'z';
- else if(opts.raw || v.trim().length == 0 || _t == "s"){}
- else if(v === 'TRUE') o = {t:'b', v:true};
- else if(v === 'FALSE') o = {t:'b', v:false};
- else if(!isNaN(fuzzynum(v))) o = {t:'n', v:fuzzynum(v)};
- else if(!isNaN(fuzzydate(v).getDate())) {
- o = ({t:'d', v:parseDate(v)});
- if(!opts.cellDates) o = ({t:'n', v:datenum(o.v)});
- o.z = opts.dateNF || SSF._table[14];
- }
- }
- if(o.z === undefined && z != null) o.z = z;
- if(opts.dense) { if(!ws[R + or_R]) ws[R + or_R] = []; ws[R + or_R][C + or_C] = o; }
- else ws[encode_cell({c:C + or_C, r:R + or_R})] = o;
- if(range.e.c < C + or_C) range.e.c = C + or_C;
- C += CS;
- }
- ++R;
- }
- if(merges.length) ws['!merges'] = (ws["!merges"] || []).concat(merges);
- range.e.r = Math.max(range.e.r, R - 1 + or_R);
- ws['!ref'] = encode_range(range);
- 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
- return ws;
- }
-
- function parse_dom_table(table, _opts) {
- var opts = _opts || {};
- var ws = opts.dense ? ([]) : ({});
- return sheet_add_dom(ws, table, _opts);
- }
-
- function table_to_book(table, opts) {
- return sheet_to_workbook(parse_dom_table(table, opts), opts);
- }
-
- function is_dom_element_hidden(element) {
- var display = '';
- var get_computed_style = get_get_computed_style_function(element);
- if(get_computed_style) display = get_computed_style(element).getPropertyValue('display');
- 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)
- return display === 'none';
- }
-
- /* global getComputedStyle */
- function get_get_computed_style_function(element) {
- // The proper getComputedStyle implementation is the one defined in the element window
- if(element.ownerDocument.defaultView && typeof element.ownerDocument.defaultView.getComputedStyle === 'function') return element.ownerDocument.defaultView.getComputedStyle;
- // If it is not available, try to get one from the global namespace
- if(typeof getComputedStyle === 'function') return getComputedStyle;
- return null;
- }
- /* OpenDocument */
- var parse_content_xml = (function() {
-
- var parse_text_p = function(text) {
- /* 6.1.2 White Space Characters */
- var fixed = text
- .replace(/[\t\r\n]/g, " ").trim().replace(/ +/g, " ")
- .replace(/<text:s\/>/g," ")
- .replace(/<text:s text:c="(\d+)"\/>/g, function($$,$1) { return Array(parseInt($1,10)+1).join(" "); })
- .replace(/<text:tab[^>]*\/>/g,"\t")
- .replace(/<text:line-break\/>/g,"\n");
- var v = unescapexml(fixed.replace(/<[^>]*>/g,""));
-
- return [v];
- };
-
- var number_formats = {
- /* ods name: [short ssf fmt, long ssf fmt] */
- day: ["d", "dd"],
- month: ["m", "mm"],
- year: ["y", "yy"],
- hours: ["h", "hh"],
- minutes: ["m", "mm"],
- seconds: ["s", "ss"],
- "am-pm": ["A/P", "AM/PM"],
- "day-of-week": ["ddd", "dddd"],
- era: ["e", "ee"],
- /* there is no native representation of LO "Q" format */
- quarter: ["\\Qm", "m\\\"th quarter\""]
- };
-
- return function pcx(d, _opts) {
- var opts = _opts || {};
- if(DENSE != null && opts.dense == null) opts.dense = DENSE;
- var str = xlml_normalize(d);
- var state = [], tmp;
- var tag;
- var NFtag = {name:""}, NF = "", pidx = 0;
- var sheetag;
- var rowtag;
- var Sheets = {}, SheetNames = [];
- var ws = opts.dense ? ([]) : ({});
- var Rn, q;
- var ctag = ({value:""});
- var textp = "", textpidx = 0, textptag;
- var textR = [];
- var R = -1, C = -1, range = {s: {r:1000000,c:10000000}, e: {r:0, c:0}};
- var row_ol = 0;
- var number_format_map = {};
- var merges = [], mrange = {}, mR = 0, mC = 0;
- var rowinfo = [], rowpeat = 1, colpeat = 1;
- var arrayf = [];
- var WB = {Names:[]};
- var atag = ({});
- var _Ref = ["", ""];
- var comments = [], comment = ({});
- var creator = "", creatoridx = 0;
- var isstub = false, intable = false;
- var i = 0;
- xlmlregex.lastIndex = 0;
- str = str.replace(/<!--([\s\S]*?)-->/mg,"").replace(/<!DOCTYPE[^\[]*\[[^\]]*\]>/gm,"");
- while((Rn = xlmlregex.exec(str))) switch((Rn[3]=Rn[3].replace(/_.*$/,""))) {
-
- case 'table': case '工作表': // 9.1.2 <table:table>
- if(Rn[1]==='/') {
- if(range.e.c >= range.s.c && range.e.r >= range.s.r) ws['!ref'] = encode_range(range);
- else ws['!ref'] = "A1:A1";
- if(opts.sheetRows > 0 && opts.sheetRows <= range.e.r) {
- ws['!fullref'] = ws['!ref'];
- range.e.r = opts.sheetRows - 1;
- ws['!ref'] = encode_range(range);
- }
- if(merges.length) ws['!merges'] = merges;
- if(rowinfo.length) ws["!rows"] = rowinfo;
- sheetag.name = sheetag['名称'] || sheetag.name;
- if(typeof JSON !== 'undefined') JSON.stringify(sheetag);
- SheetNames.push(sheetag.name);
- Sheets[sheetag.name] = ws;
- intable = false;
- }
- else if(Rn[0].charAt(Rn[0].length-2) !== '/') {
- sheetag = parsexmltag(Rn[0], false);
- R = C = -1;
- range.s.r = range.s.c = 10000000; range.e.r = range.e.c = 0;
- ws = opts.dense ? ([]) : ({}); merges = [];
- rowinfo = [];
- intable = true;
- }
- break;
-
- case 'table-row-group': // 9.1.9 <table:table-row-group>
- if(Rn[1] === "/") --row_ol; else ++row_ol;
- break;
- case 'table-row': case '行': // 9.1.3 <table:table-row>
- if(Rn[1] === '/') { R+=rowpeat; rowpeat = 1; break; }
- rowtag = parsexmltag(Rn[0], false);
- if(rowtag['行号']) R = rowtag['行号'] - 1; else if(R == -1) R = 0;
- rowpeat = +rowtag['number-rows-repeated'] || 1;
- /* TODO: remove magic */
- if(rowpeat < 10) for(i = 0; i < rowpeat; ++i) if(row_ol > 0) rowinfo[R + i] = {level: row_ol};
- C = -1; break;
- case 'covered-table-cell': // 9.1.5 <table:covered-table-cell>
- if(Rn[1] !== '/') ++C;
- if(opts.sheetStubs) {
- if(opts.dense) { if(!ws[R]) ws[R] = []; ws[R][C] = {t:'z'}; }
- else ws[encode_cell({r:R,c:C})] = {t:'z'};
- }
- textp = ""; textR = [];
- break; /* stub */
- case 'table-cell': case '数据':
- if(Rn[0].charAt(Rn[0].length-2) === '/') {
- ++C;
- ctag = parsexmltag(Rn[0], false);
- colpeat = parseInt(ctag['number-columns-repeated']||"1", 10);
- q = ({t:'z', v:null});
- if(ctag.formula && opts.cellFormula != false) q.f = ods_to_csf_formula(unescapexml(ctag.formula));
- if((ctag['数据类型'] || ctag['value-type']) == "string") {
- q.t = "s"; q.v = unescapexml(ctag['string-value'] || "");
- if(opts.dense) {
- if(!ws[R]) ws[R] = [];
- ws[R][C] = q;
- } else {
- ws[encode_cell({r:R,c:C})] = q;
- }
- }
- C+= colpeat-1;
- } else if(Rn[1]!=='/') {
- ++C;
- colpeat = 1;
- var rptR = rowpeat ? R + rowpeat - 1 : R;
- if(C > range.e.c) range.e.c = C;
- if(C < range.s.c) range.s.c = C;
- if(R < range.s.r) range.s.r = R;
- if(rptR > range.e.r) range.e.r = rptR;
- ctag = parsexmltag(Rn[0], false);
- comments = []; comment = ({});
- q = ({t:ctag['数据类型'] || ctag['value-type'], v:null});
- if(opts.cellFormula) {
- if(ctag.formula) ctag.formula = unescapexml(ctag.formula);
- if(ctag['number-matrix-columns-spanned'] && ctag['number-matrix-rows-spanned']) {
- mR = parseInt(ctag['number-matrix-rows-spanned'],10) || 0;
- mC = parseInt(ctag['number-matrix-columns-spanned'],10) || 0;
- mrange = {s: {r:R,c:C}, e:{r:R + mR-1,c:C + mC-1}};
- q.F = encode_range(mrange);
- arrayf.push([mrange, q.F]);
- }
- if(ctag.formula) q.f = ods_to_csf_formula(ctag.formula);
- else for(i = 0; i < arrayf.length; ++i)
- if(R >= arrayf[i][0].s.r && R <= arrayf[i][0].e.r)
- if(C >= arrayf[i][0].s.c && C <= arrayf[i][0].e.c)
- q.F = arrayf[i][1];
- }
- if(ctag['number-columns-spanned'] || ctag['number-rows-spanned']) {
- mR = parseInt(ctag['number-rows-spanned'],10) || 0;
- mC = parseInt(ctag['number-columns-spanned'],10) || 0;
- mrange = {s: {r:R,c:C}, e:{r:R + mR-1,c:C + mC-1}};
- merges.push(mrange);
- }
-
- /* 19.675.2 table:number-columns-repeated */
- if(ctag['number-columns-repeated']) colpeat = parseInt(ctag['number-columns-repeated'], 10);
-
- /* 19.385 office:value-type */
- switch(q.t) {
- case 'boolean': q.t = 'b'; q.v = parsexmlbool(ctag['boolean-value']); break;
- case 'float': q.t = 'n'; q.v = parseFloat(ctag.value); break;
- case 'percentage': q.t = 'n'; q.v = parseFloat(ctag.value); break;
- case 'currency': q.t = 'n'; q.v = parseFloat(ctag.value); break;
- case 'date': q.t = 'd'; q.v = parseDate(ctag['date-value']);
- if(!opts.cellDates) { q.t = 'n'; q.v = datenum(q.v); }
- q.z = 'm/d/yy'; break;
- case 'time': q.t = 'n'; q.v = parse_isodur(ctag['time-value'])/86400; break;
- case 'number': q.t = 'n'; q.v = parseFloat(ctag['数据数值']); break;
- default:
- if(q.t === 'string' || q.t === 'text' || !q.t) {
- q.t = 's';
- if(ctag['string-value'] != null) { textp = unescapexml(ctag['string-value']); textR = []; }
- } else throw new Error('Unsupported value type ' + q.t);
- }
- } else {
- isstub = false;
- if(q.t === 's') {
- q.v = textp || '';
- if(textR.length) q.R = textR;
- isstub = textpidx == 0;
- }
- if(atag.Target) q.l = atag;
- if(comments.length > 0) { q.c = comments; comments = []; }
- if(textp && opts.cellText !== false) q.w = textp;
- if(isstub) { q.t = "z"; delete q.v; }
- if(!isstub || opts.sheetStubs) {
- if(!(opts.sheetRows && opts.sheetRows <= R)) {
- for(var rpt = 0; rpt < rowpeat; ++rpt) {
- colpeat = parseInt(ctag['number-columns-repeated']||"1", 10);
- if(opts.dense) {
- if(!ws[R + rpt]) ws[R + rpt] = [];
- ws[R + rpt][C] = rpt == 0 ? q : dup(q);
- while(--colpeat > 0) ws[R + rpt][C + colpeat] = dup(q);
- } else {
- ws[encode_cell({r:R + rpt,c:C})] = q;
- while(--colpeat > 0) ws[encode_cell({r:R + rpt,c:C + colpeat})] = dup(q);
- }
- if(range.e.c <= C) range.e.c = C;
- }
- }
- }
- colpeat = parseInt(ctag['number-columns-repeated']||"1", 10);
- C += colpeat-1; colpeat = 0;
- q = {};
- textp = ""; textR = [];
- }
- atag = ({});
- break; // 9.1.4 <table:table-cell>
-
- /* pure state */
- case 'document': // TODO: <office:document> is the root for FODS
- case 'document-content': case '电子表格文档': // 3.1.3.2 <office:document-content>
- case 'spreadsheet': case '主体': // 3.7 <office:spreadsheet>
- case 'scripts': // 3.12 <office:scripts>
- case 'styles': // TODO <office:styles>
- case 'font-face-decls': // 3.14 <office:font-face-decls>
- case 'master-styles': //3.15.4 <office:master-styles> -- relevant for FODS
- if(Rn[1]==='/'){if((tmp=state.pop())[0]!==Rn[3]) throw "Bad state: "+tmp;}
- else if(Rn[0].charAt(Rn[0].length-2) !== '/') state.push([Rn[3], true]);
- break;
-
- case 'annotation': // 14.1 <office:annotation>
- if(Rn[1]==='/'){
- if((tmp=state.pop())[0]!==Rn[3]) throw "Bad state: "+tmp;
- comment.t = textp;
- if(textR.length) comment.R = textR;
- comment.a = creator;
- comments.push(comment);
- }
- else if(Rn[0].charAt(Rn[0].length-2) !== '/') {state.push([Rn[3], false]);}
- creator = ""; creatoridx = 0;
- textp = ""; textpidx = 0; textR = [];
- break;
-
- case 'creator': // 4.3.2.7 <dc:creator>
- if(Rn[1]==='/') { creator = str.slice(creatoridx,Rn.index); }
- else creatoridx = Rn.index + Rn[0].length;
- break;
-
- /* ignore state */
- case 'meta': case '元数据': // TODO: <office:meta> <uof:元数据> FODS/UOF
- case 'settings': // TODO: <office:settings>
- case 'config-item-set': // TODO: <office:config-item-set>
- case 'config-item-map-indexed': // TODO: <office:config-item-map-indexed>
- case 'config-item-map-entry': // TODO: <office:config-item-map-entry>
- case 'config-item-map-named': // TODO: <office:config-item-map-entry>
- case 'shapes': // 9.2.8 <table:shapes>
- case 'frame': // 10.4.2 <draw:frame>
- case 'text-box': // 10.4.3 <draw:text-box>
- case 'image': // 10.4.4 <draw:image>
- case 'data-pilot-tables': // 9.6.2 <table:data-pilot-tables>
- case 'list-style': // 16.30 <text:list-style>
- case 'form': // 13.13 <form:form>
- case 'dde-links': // 9.8 <table:dde-links>
- case 'event-listeners': // TODO
- case 'chart': // TODO
- if(Rn[1]==='/'){if((tmp=state.pop())[0]!==Rn[3]) throw "Bad state: "+tmp;}
- else if(Rn[0].charAt(Rn[0].length-2) !== '/') state.push([Rn[3], false]);
- textp = ""; textpidx = 0; textR = [];
- break;
-
- case 'scientific-number': // TODO: <number:scientific-number>
- break;
- case 'currency-symbol': // TODO: <number:currency-symbol>
- break;
- case 'currency-style': // TODO: <number:currency-style>
- break;
- case 'number-style': // 16.27.2 <number:number-style>
- case 'percentage-style': // 16.27.9 <number:percentage-style>
- case 'date-style': // 16.27.10 <number:date-style>
- case 'time-style': // 16.27.18 <number:time-style>
- if(Rn[1]==='/'){
- number_format_map[NFtag.name] = NF;
- if((tmp=state.pop())[0]!==Rn[3]) throw "Bad state: "+tmp;
- } else if(Rn[0].charAt(Rn[0].length-2) !== '/') {
- NF = "";
- NFtag = parsexmltag(Rn[0], false);
- state.push([Rn[3], true]);
- } break;
-
- case 'script': break; // 3.13 <office:script>
- case 'libraries': break; // TODO: <ooo:libraries>
- case 'automatic-styles': break; // 3.15.3 <office:automatic-styles>
-
- case 'default-style': // TODO: <style:default-style>
- case 'page-layout': break; // TODO: <style:page-layout>
- case 'style': // 16.2 <style:style>
- break;
- case 'map': break; // 16.3 <style:map>
- case 'font-face': break; // 16.21 <style:font-face>
-
- case 'paragraph-properties': break; // 17.6 <style:paragraph-properties>
- case 'table-properties': break; // 17.15 <style:table-properties>
- case 'table-column-properties': break; // 17.16 <style:table-column-properties>
- case 'table-row-properties': break; // 17.17 <style:table-row-properties>
- case 'table-cell-properties': break; // 17.18 <style:table-cell-properties>
-
- case 'number': // 16.27.3 <number:number>
- switch(state[state.length-1][0]) {
- case 'time-style':
- case 'date-style':
- tag = parsexmltag(Rn[0], false);
- NF += number_formats[Rn[3]][tag.style==='long'?1:0]; break;
- } break;
-
- case 'fraction': break; // TODO 16.27.6 <number:fraction>
-
- case 'day': // 16.27.11 <number:day>
- case 'month': // 16.27.12 <number:month>
- case 'year': // 16.27.13 <number:year>
- case 'era': // 16.27.14 <number:era>
- case 'day-of-week': // 16.27.15 <number:day-of-week>
- case 'week-of-year': // 16.27.16 <number:week-of-year>
- case 'quarter': // 16.27.17 <number:quarter>
- case 'hours': // 16.27.19 <number:hours>
- case 'minutes': // 16.27.20 <number:minutes>
- case 'seconds': // 16.27.21 <number:seconds>
- case 'am-pm': // 16.27.22 <number:am-pm>
- switch(state[state.length-1][0]) {
- case 'time-style':
- case 'date-style':
- tag = parsexmltag(Rn[0], false);
- NF += number_formats[Rn[3]][tag.style==='long'?1:0]; break;
- } break;
-
- case 'boolean-style': break; // 16.27.23 <number:boolean-style>
- case 'boolean': break; // 16.27.24 <number:boolean>
- case 'text-style': break; // 16.27.25 <number:text-style>
- case 'text': // 16.27.26 <number:text>
- if(Rn[0].slice(-2) === "/>") break;
- else if(Rn[1]==="/") switch(state[state.length-1][0]) {
- case 'number-style':
- case 'date-style':
- case 'time-style':
- NF += str.slice(pidx, Rn.index);
- break;
- }
- else pidx = Rn.index + Rn[0].length;
- break;
-
- case 'named-range': // 9.4.12 <table:named-range>
- tag = parsexmltag(Rn[0], false);
- _Ref = ods_to_csf_3D(tag['cell-range-address']);
- var nrange = ({Name:tag.name, Ref:_Ref[0] + '!' + _Ref[1]});
- if(intable) nrange.Sheet = SheetNames.length;
- WB.Names.push(nrange);
- break;
-
- case 'text-content': break; // 16.27.27 <number:text-content>
- case 'text-properties': break; // 16.27.27 <style:text-properties>
- case 'embedded-text': break; // 16.27.4 <number:embedded-text>
-
- case 'body': case '电子表格': break; // 3.3 16.9.6 19.726.3
-
- case 'forms': break; // 12.25.2 13.2
- case 'table-column': break; // 9.1.6 <table:table-column>
- case 'table-header-rows': break; // 9.1.7 <table:table-header-rows>
- case 'table-rows': break; // 9.1.12 <table:table-rows>
- /* TODO: outline levels */
- case 'table-column-group': break; // 9.1.10 <table:table-column-group>
- case 'table-header-columns': break; // 9.1.11 <table:table-header-columns>
- case 'table-columns': break; // 9.1.12 <table:table-columns>
-
- case 'null-date': break; // 9.4.2 <table:null-date> TODO: date1904
-
- case 'graphic-properties': break; // 17.21 <style:graphic-properties>
- case 'calculation-settings': break; // 9.4.1 <table:calculation-settings>
- case 'named-expressions': break; // 9.4.11 <table:named-expressions>
- case 'label-range': break; // 9.4.9 <table:label-range>
- case 'label-ranges': break; // 9.4.10 <table:label-ranges>
- case 'named-expression': break; // 9.4.13 <table:named-expression>
- case 'sort': break; // 9.4.19 <table:sort>
- case 'sort-by': break; // 9.4.20 <table:sort-by>
- case 'sort-groups': break; // 9.4.22 <table:sort-groups>
-
- case 'tab': break; // 6.1.4 <text:tab>
- case 'line-break': break; // 6.1.5 <text:line-break>
- case 'span': break; // 6.1.7 <text:span>
- case 'p': case '文本串': // 5.1.3 <text:p>
- if(['master-styles'].indexOf(state[state.length-1][0]) > -1) break;
- if(Rn[1]==='/' && (!ctag || !ctag['string-value'])) {
- var ptp = parse_text_p(str.slice(textpidx,Rn.index), textptag);
- textp = (textp.length > 0 ? textp + "\n" : "") + ptp[0];
- } else { textptag = parsexmltag(Rn[0], false); textpidx = Rn.index + Rn[0].length; }
- break; // <text:p>
- case 's': break; // <text:s>
-
- case 'database-range': // 9.4.15 <table:database-range>
- if(Rn[1]==='/') break;
- try {
- _Ref = ods_to_csf_3D(parsexmltag(Rn[0])['target-range-address']);
- Sheets[_Ref[0]]['!autofilter'] = { ref:_Ref[1] };
- } catch(e) {/* empty */}
- break;
-
- case 'date': break; // <*:date>
-
- case 'object': break; // 10.4.6.2 <draw:object>
- case 'title': case '标题': break; // <*:title> OR <uof:标题>
- case 'desc': break; // <*:desc>
- case 'binary-data': break; // 10.4.5 TODO: b64 blob
-
- /* 9.2 Advanced Tables */
- case 'table-source': break; // 9.2.6
- case 'scenario': break; // 9.2.6
-
- case 'iteration': break; // 9.4.3 <table:iteration>
- case 'content-validations': break; // 9.4.4 <table:
- case 'content-validation': break; // 9.4.5 <table:
- case 'help-message': break; // 9.4.6 <table:
- case 'error-message': break; // 9.4.7 <table:
- case 'database-ranges': break; // 9.4.14 <table:database-ranges>
- case 'filter': break; // 9.5.2 <table:filter>
- case 'filter-and': break; // 9.5.3 <table:filter-and>
- case 'filter-or': break; // 9.5.4 <table:filter-or>
- case 'filter-condition': break; // 9.5.5 <table:filter-condition>
-
- case 'list-level-style-bullet': break; // 16.31 <text:
- case 'list-level-style-number': break; // 16.32 <text:
- case 'list-level-properties': break; // 17.19 <style:
-
- /* 7.3 Document Fields */
- case 'sender-firstname': // 7.3.6.2
- case 'sender-lastname': // 7.3.6.3
- case 'sender-initials': // 7.3.6.4
- case 'sender-title': // 7.3.6.5
- case 'sender-position': // 7.3.6.6
- case 'sender-email': // 7.3.6.7
- case 'sender-phone-private': // 7.3.6.8
- case 'sender-fax': // 7.3.6.9
- case 'sender-company': // 7.3.6.10
- case 'sender-phone-work': // 7.3.6.11
- case 'sender-street': // 7.3.6.12
- case 'sender-city': // 7.3.6.13
- case 'sender-postal-code': // 7.3.6.14
- case 'sender-country': // 7.3.6.15
- case 'sender-state-or-province': // 7.3.6.16
- case 'author-name': // 7.3.7.1
- case 'author-initials': // 7.3.7.2
- case 'chapter': // 7.3.8
- case 'file-name': // 7.3.9
- case 'template-name': // 7.3.9
- case 'sheet-name': // 7.3.9
- break;
-
- case 'event-listener':
- break;
- /* TODO: FODS Properties */
- case 'initial-creator':
- case 'creation-date':
- case 'print-date':
- case 'generator':
- case 'document-statistic':
- case 'user-defined':
- case 'editing-duration':
- case 'editing-cycles':
- break;
-
- /* TODO: FODS Config */
- case 'config-item':
- break;
-
- /* TODO: style tokens */
- case 'page-number': break; // TODO <text:page-number>
- case 'page-count': break; // TODO <text:page-count>
- case 'time': break; // TODO <text:time>
-
- /* 9.3 Advanced Table Cells */
- case 'cell-range-source': break; // 9.3.1 <table:
- case 'detective': break; // 9.3.2 <table:
- case 'operation': break; // 9.3.3 <table:
- case 'highlighted-range': break; // 9.3.4 <table:
-
- /* 9.6 Data Pilot Tables <table: */
- case 'data-pilot-table': // 9.6.3
- case 'source-cell-range': // 9.6.5
- case 'source-service': // 9.6.6
- case 'data-pilot-field': // 9.6.7
- case 'data-pilot-level': // 9.6.8
- case 'data-pilot-subtotals': // 9.6.9
- case 'data-pilot-subtotal': // 9.6.10
- case 'data-pilot-members': // 9.6.11
- case 'data-pilot-member': // 9.6.12
- case 'data-pilot-display-info': // 9.6.13
- case 'data-pilot-sort-info': // 9.6.14
- case 'data-pilot-layout-info': // 9.6.15
- case 'data-pilot-field-reference': // 9.6.16
- case 'data-pilot-groups': // 9.6.17
- case 'data-pilot-group': // 9.6.18
- case 'data-pilot-group-member': // 9.6.19
- break;
-
- /* 10.3 Drawing Shapes */
- case 'rect': // 10.3.2
- break;
-
- /* 14.6 DDE Connections */
- case 'dde-connection-decls': // 14.6.2 <text:
- case 'dde-connection-decl': // 14.6.3 <text:
- case 'dde-link': // 14.6.4 <table:
- case 'dde-source': // 14.6.5 <office:
- break;
-
- case 'properties': break; // 13.7 <form:properties>
- case 'property': break; // 13.8 <form:property>
-
- case 'a': // 6.1.8 hyperlink
- if(Rn[1]!== '/') {
- atag = parsexmltag(Rn[0], false);
- if(!atag.href) break;
- atag.Target = atag.href; delete atag.href;
- if(atag.Target.charAt(0) == "#" && atag.Target.indexOf(".") > -1) {
- _Ref = ods_to_csf_3D(atag.Target.slice(1));
- atag.Target = "#" + _Ref[0] + "!" + _Ref[1];
- }
- }
- break;
-
- /* non-standard */
- case 'table-protection': break;
- case 'data-pilot-grand-total': break; // <table:
- case 'office-document-common-attrs': break; // bare
- default: switch(Rn[2]) {
- case 'dc:': // TODO: properties
- case 'calcext:': // ignore undocumented extensions
- case 'loext:': // ignore undocumented extensions
- case 'ooo:': // ignore undocumented extensions
- case 'chartooo:': // ignore undocumented extensions
- case 'draw:': // TODO: drawing
- case 'style:': // TODO: styles
- case 'chart:': // TODO: charts
- case 'form:': // TODO: forms
- case 'uof:': // TODO: uof
- case '表:': // TODO: uof
- case '字:': // TODO: uof
- break;
- default: if(opts.WTF) throw new Error(Rn);
- }
- }
- var out = ({
- Sheets: Sheets,
- SheetNames: SheetNames,
- Workbook: WB
- });
- if(opts.bookSheets) delete out.Sheets;
- return out;
- };
- })();
-
- function parse_ods(zip, opts) {
- opts = opts || ({});
- var ods = !!safegetzipfile(zip, 'objectdata');
- if(ods) parse_manifest(getzipdata(zip, 'META-INF/manifest.xml'), opts);
- var content = getzipstr(zip, 'content.xml');
- if(!content) throw new Error("Missing content.xml in " + (ods ? "ODS" : "UOF")+ " file");
- var wb = parse_content_xml(ods ? content : utf8read(content), opts);
- if(safegetzipfile(zip, 'meta.xml')) wb.Props = parse_core_props(getzipdata(zip, 'meta.xml'));
- return wb;
- }
- function parse_fods(data, opts) {
- return parse_content_xml(data, opts);
- }
-
- /* OpenDocument */
- var write_styles_ods = (function() {
- var payload = '<office:document-styles ' + wxt_helper({
- 'xmlns:office': "urn:oasis:names:tc:opendocument:xmlns:office:1.0",
- 'xmlns:table': "urn:oasis:names:tc:opendocument:xmlns:table:1.0",
- 'xmlns:style': "urn:oasis:names:tc:opendocument:xmlns:style:1.0",
- 'xmlns:text': "urn:oasis:names:tc:opendocument:xmlns:text:1.0",
- 'xmlns:draw': "urn:oasis:names:tc:opendocument:xmlns:drawing:1.0",
- 'xmlns:fo': "urn:oasis:names:tc:opendocument:xmlns:xsl-fo-compatible:1.0",
- 'xmlns:xlink': "http://www.w3.org/1999/xlink",
- 'xmlns:dc': "http://purl.org/dc/elements/1.1/",
- 'xmlns:number': "urn:oasis:names:tc:opendocument:xmlns:datastyle:1.0",
- 'xmlns:svg': "urn:oasis:names:tc:opendocument:xmlns:svg-compatible:1.0",
- 'xmlns:of': "urn:oasis:names:tc:opendocument:xmlns:of:1.2",
- 'office:version': "1.2"
- }) + '></office:document-styles>';
- return function wso() {
- return XML_HEADER + payload;
- };
- })();
- var write_content_ods = (function() {
- /* 6.1.2 White Space Characters */
- var write_text_p = function(text) {
- return escapexml(text)
- .replace(/ +/g, function($$){return '<text:s text:c="'+$$.length+'"/>';})
- .replace(/\t/g, "<text:tab/>")
- .replace(/\n/g, "<text:line-break/>")
- .replace(/^ /, "<text:s/>").replace(/ $/, "<text:s/>");
- };
-
- var null_cell_xml = ' <table:table-cell />\n';
- var covered_cell_xml = ' <table:covered-table-cell/>\n';
- var write_ws = function(ws, wb, i) {
- /* Section 9 Tables */
- var o = [];
- o.push(' <table:table table:name="' + escapexml(wb.SheetNames[i]) + '" table:style-name="ta1">\n');
- var R=0,C=0, range = decode_range(ws['!ref']);
- var marr = ws['!merges'] || [], mi = 0;
- var dense = Array.isArray(ws);
- for(R = 0; R < range.s.r; ++R) o.push(' <table:table-row></table:table-row>\n');
- for(; R <= range.e.r; ++R) {
- o.push(' <table:table-row>\n');
- for(C=0; C < range.s.c; ++C) o.push(null_cell_xml);
- for(; C <= range.e.c; ++C) {
- var skip = false, ct = {}, textp = "";
- for(mi = 0; mi != marr.length; ++mi) {
- if(marr[mi].s.c > C) continue;
- if(marr[mi].s.r > R) continue;
- if(marr[mi].e.c < C) continue;
- if(marr[mi].e.r < R) continue;
- if(marr[mi].s.c != C || marr[mi].s.r != R) skip = true;
- ct['table:number-columns-spanned'] = (marr[mi].e.c - marr[mi].s.c + 1);
- ct['table:number-rows-spanned'] = (marr[mi].e.r - marr[mi].s.r + 1);
- break;
- }
- if(skip) { o.push(covered_cell_xml); continue; }
- var ref = encode_cell({r:R, c:C}), cell = dense ? (ws[R]||[])[C]: ws[ref];
- if(cell && cell.f) {
- ct['table:formula'] = escapexml(csf_to_ods_formula(cell.f));
- if(cell.F) {
- if(cell.F.slice(0, ref.length) == ref) {
- var _Fref = decode_range(cell.F);
- ct['table:number-matrix-columns-spanned'] = (_Fref.e.c - _Fref.s.c + 1);
- ct['table:number-matrix-rows-spanned'] = (_Fref.e.r - _Fref.s.r + 1);
- }
- }
- }
- if(!cell) { o.push(null_cell_xml); continue; }
- switch(cell.t) {
- case 'b':
- textp = (cell.v ? 'TRUE' : 'FALSE');
- ct['office:value-type'] = "boolean";
- ct['office:boolean-value'] = (cell.v ? 'true' : 'false');
- break;
- case 'n':
- textp = (cell.w||String(cell.v||0));
- ct['office:value-type'] = "float";
- ct['office:value'] = (cell.v||0);
- break;
- case 's': case 'str':
- textp = cell.v == null ? "" : cell.v;
- ct['office:value-type'] = "string";
- break;
- case 'd':
- textp = (cell.w||(parseDate(cell.v).toISOString()));
- ct['office:value-type'] = "date";
- ct['office:date-value'] = (parseDate(cell.v).toISOString());
- ct['table:style-name'] = "ce1";
- break;
- //case 'e':
- default: o.push(null_cell_xml); continue;
- }
- var text_p = write_text_p(textp);
- if(cell.l && cell.l.Target) {
- var _tgt = cell.l.Target; _tgt = _tgt.charAt(0) == "#" ? "#" + csf_to_ods_3D(_tgt.slice(1)) : _tgt;
- text_p = writextag('text:a', text_p, {'xlink:href': _tgt});
- }
- o.push(' ' + writextag('table:table-cell', writextag('text:p', text_p, {}), ct) + '\n');
- }
- o.push(' </table:table-row>\n');
- }
- o.push(' </table:table>\n');
- return o.join("");
- };
-
- var write_automatic_styles_ods = function(o) {
- o.push(' <office:automatic-styles>\n');
-
- o.push(' <number:date-style style:name="N37" number:automatic-order="true">\n');
- o.push(' <number:month number:style="long"/>\n');
- o.push(' <number:text>/</number:text>\n');
- o.push(' <number:day number:style="long"/>\n');
- o.push(' <number:text>/</number:text>\n');
- o.push(' <number:year/>\n');
- o.push(' </number:date-style>\n');
-
- /* table */
- o.push(' <style:style style:name="ta1" style:family="table">\n'); // style:master-page-name="mp1">\n');
- o.push(' <style:table-properties table:display="true" style:writing-mode="lr-tb"/>\n');
- o.push(' </style:style>\n');
-
- /* table cells, text */
- o.push(' <style:style style:name="ce1" style:family="table-cell" style:parent-style-name="Default" style:data-style-name="N37"/>\n');
-
- /* page-layout */
-
- o.push(' </office:automatic-styles>\n');
- };
-
- return function wcx(wb, opts) {
- var o = [XML_HEADER];
- /* 3.1.3.2 */
- var attr = wxt_helper({
- 'xmlns:office': "urn:oasis:names:tc:opendocument:xmlns:office:1.0",
- 'xmlns:table': "urn:oasis:names:tc:opendocument:xmlns:table:1.0",
- 'xmlns:style': "urn:oasis:names:tc:opendocument:xmlns:style:1.0",
- 'xmlns:text': "urn:oasis:names:tc:opendocument:xmlns:text:1.0",
- 'xmlns:draw': "urn:oasis:names:tc:opendocument:xmlns:drawing:1.0",
- 'xmlns:fo': "urn:oasis:names:tc:opendocument:xmlns:xsl-fo-compatible:1.0",
- 'xmlns:xlink': "http://www.w3.org/1999/xlink",
- 'xmlns:dc': "http://purl.org/dc/elements/1.1/",
- 'xmlns:meta': "urn:oasis:names:tc:opendocument:xmlns:meta:1.0",
- 'xmlns:number': "urn:oasis:names:tc:opendocument:xmlns:datastyle:1.0",
- 'xmlns:presentation': "urn:oasis:names:tc:opendocument:xmlns:presentation:1.0",
- 'xmlns:svg': "urn:oasis:names:tc:opendocument:xmlns:svg-compatible:1.0",
- 'xmlns:chart': "urn:oasis:names:tc:opendocument:xmlns:chart:1.0",
- 'xmlns:dr3d': "urn:oasis:names:tc:opendocument:xmlns:dr3d:1.0",
- 'xmlns:math': "http://www.w3.org/1998/Math/MathML",
- 'xmlns:form': "urn:oasis:names:tc:opendocument:xmlns:form:1.0",
- 'xmlns:script': "urn:oasis:names:tc:opendocument:xmlns:script:1.0",
- 'xmlns:ooo': "http://openoffice.org/2004/office",
- 'xmlns:ooow': "http://openoffice.org/2004/writer",
- 'xmlns:oooc': "http://openoffice.org/2004/calc",
- 'xmlns:dom': "http://www.w3.org/2001/xml-events",
- 'xmlns:xforms': "http://www.w3.org/2002/xforms",
- 'xmlns:xsd': "http://www.w3.org/2001/XMLSchema",
- 'xmlns:xsi': "http://www.w3.org/2001/XMLSchema-instance",
- 'xmlns:sheet': "urn:oasis:names:tc:opendocument:sh33tjs:1.0",
- 'xmlns:rpt': "http://openoffice.org/2005/report",
- 'xmlns:of': "urn:oasis:names:tc:opendocument:xmlns:of:1.2",
- 'xmlns:xhtml': "http://www.w3.org/1999/xhtml",
- 'xmlns:grddl': "http://www.w3.org/2003/g/data-view#",
- 'xmlns:tableooo': "http://openoffice.org/2009/table",
- 'xmlns:drawooo': "http://openoffice.org/2010/draw",
- 'xmlns:calcext': "urn:org:documentfoundation:names:experimental:calc:xmlns:calcext:1.0",
- 'xmlns:loext': "urn:org:documentfoundation:names:experimental:office:xmlns:loext:1.0",
- 'xmlns:field': "urn:openoffice:names:experimental:ooo-ms-interop:xmlns:field:1.0",
- 'xmlns:formx': "urn:openoffice:names:experimental:ooxml-odf-interop:xmlns:form:1.0",
- 'xmlns:css3t': "http://www.w3.org/TR/css3-text/",
- 'office:version': "1.2"
- });
-
- var fods = wxt_helper({
- 'xmlns:config': "urn:oasis:names:tc:opendocument:xmlns:config:1.0",
- 'office:mimetype': "application/vnd.oasis.opendocument.spreadsheet"
- });
-
- if(opts.bookType == "fods") o.push('<office:document' + attr + fods + '>\n');
- else o.push('<office:document-content' + attr + '>\n');
- write_automatic_styles_ods(o);
- o.push(' <office:body>\n');
- o.push(' <office:spreadsheet>\n');
- for(var i = 0; i != wb.SheetNames.length; ++i) o.push(write_ws(wb.Sheets[wb.SheetNames[i]], wb, i, opts));
- o.push(' </office:spreadsheet>\n');
- o.push(' </office:body>\n');
- if(opts.bookType == "fods") o.push('</office:document>');
- else o.push('</office:document-content>');
- return o.join("");
- };
- })();
-
- function write_ods(wb, opts) {
- if(opts.bookType == "fods") return write_content_ods(wb, opts);
-
- var zip = zip_new();
- var f = "";
-
- var manifest = [];
- var rdf = [];
-
- /* Part 3 Section 3.3 MIME Media Type */
- f = "mimetype";
- zip_add_file(zip, f, "application/vnd.oasis.opendocument.spreadsheet");
-
- /* Part 1 Section 2.2 Documents */
- f = "content.xml";
- zip_add_file(zip, f, write_content_ods(wb, opts));
- manifest.push([f, "text/xml"]);
- rdf.push([f, "ContentFile"]);
-
- /* TODO: these are hard-coded styles to satiate excel */
- f = "styles.xml";
- zip_add_file(zip, f, write_styles_ods(wb, opts));
- manifest.push([f, "text/xml"]);
- rdf.push([f, "StylesFile"]);
-
- /* TODO: this is hard-coded to satiate excel */
- f = "meta.xml";
- zip_add_file(zip, f, write_meta_ods());
- manifest.push([f, "text/xml"]);
- rdf.push([f, "MetadataFile"]);
-
- /* Part 3 Section 6 Metadata Manifest File */
- f = "manifest.rdf";
- zip_add_file(zip, f, write_rdf(rdf/*, opts*/));
- manifest.push([f, "application/rdf+xml"]);
-
- /* Part 3 Section 4 Manifest File */
- f = "META-INF/manifest.xml";
- zip_add_file(zip, f, write_manifest(manifest/*, opts*/));
-
- return zip;
- }
-
- function write_sheet_index(wb, sheet) {
- if(!sheet) return 0;
- var idx = wb.SheetNames.indexOf(sheet);
- if(idx == -1) throw new Error("Sheet not found: " + sheet);
- return idx;
- }
-
- function write_obj_str(factory) {
- return function write_str(wb, o) {
- var idx = write_sheet_index(wb, o.sheet);
- return factory.from_sheet(wb.Sheets[wb.SheetNames[idx]], o, wb);
- };
- }
-
- var write_htm_str = write_obj_str(HTML_);
- var write_csv_str = write_obj_str({from_sheet:sheet_to_csv});
- var write_slk_str = write_obj_str(typeof SYLK !== "undefined" ? SYLK : {});
- var write_dif_str = write_obj_str(typeof DIF !== "undefined" ? DIF : {});
- var write_prn_str = write_obj_str(typeof PRN !== "undefined" ? PRN : {});
- var write_rtf_str = write_obj_str(typeof RTF !== "undefined" ? RTF : {});
- var write_txt_str = write_obj_str({from_sheet:sheet_to_txt});
- var write_dbf_buf = write_obj_str(typeof DBF !== "undefined" ? DBF : {});
- var write_eth_str = write_obj_str(typeof ETH !== "undefined" ? ETH : {});
-
- function fix_opts_func(defaults) {
- return function fix_opts(opts) {
- for(var i = 0; i != defaults.length; ++i) {
- var d = defaults[i];
- if(opts[d[0]] === undefined) opts[d[0]] = d[1];
- if(d[2] === 'n') opts[d[0]] = Number(opts[d[0]]);
- }
- };
- }
-
- var fix_read_opts = function(opts) {
- fix_opts_func([
- ['cellNF', false], /* emit cell number format string as .z */
- ['cellHTML', true], /* emit html string as .h */
- ['cellFormula', true], /* emit formulae as .f */
- ['cellStyles', false], /* emits style/theme as .s */
- ['cellText', true], /* emit formatted text as .w */
- ['cellDates', false], /* emit date cells with type `d` */
-
- ['sheetStubs', false], /* emit empty cells */
- ['sheetRows', 0, 'n'], /* read n rows (0 = read all rows) */
-
- ['bookDeps', false], /* parse calculation chains */
- ['bookSheets', false], /* only try to get sheet names (no Sheets) */
- ['bookProps', false], /* only try to get properties (no Sheets) */
- ['bookFiles', false], /* include raw file structure (keys, files, cfb) */
- ['bookVBA', false], /* include vba raw data (vbaraw) */
-
- ['password',''], /* password */
- ['WTF', false] /* WTF mode (throws errors) */
- ])(opts);
- };
-
- var fix_write_opts = fix_opts_func([
- ['cellDates', false], /* write date cells with type `d` */
-
- ['bookSST', false], /* Generate Shared String Table */
-
- ['bookType', 'xlsx'], /* Type of workbook (xlsx/m/b) */
-
- ['compression', false], /* Use file compression */
-
- ['WTF', false] /* WTF mode (throws errors) */
- ]);
- function get_sheet_type(n) {
- if(RELS.WS.indexOf(n) > -1) return "sheet";
- if(RELS.CS && n == RELS.CS) return "chart";
- if(RELS.DS && n == RELS.DS) return "dialog";
- if(RELS.MS && n == RELS.MS) return "macro";
- return (n && n.length) ? n : "sheet";
- }
- function safe_parse_wbrels(wbrels, sheets) {
- if(!wbrels) return 0;
- try {
- 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)]; });
- } catch(e) { return null; }
- return !wbrels || wbrels.length === 0 ? null : wbrels;
- }
-
- function safe_parse_sheet(zip, path, relsPath, sheet, idx, sheetRels, sheets, stype, opts, wb, themes, styles) {
- try {
- sheetRels[sheet]=parse_rels(getzipstr(zip, relsPath, true), path);
- var data = getzipdata(zip, path);
- var _ws;
- switch(stype) {
- case 'sheet': _ws = parse_ws(data, path, idx, opts, sheetRels[sheet], wb, themes, styles); break;
- case 'chart': _ws = parse_cs(data, path, idx, opts, sheetRels[sheet], wb, themes, styles);
- if(!_ws || !_ws['!drawel']) break;
- var dfile = resolve_path(_ws['!drawel'].Target, path);
- var drelsp = get_rels_path(dfile);
- var draw = parse_drawing(getzipstr(zip, dfile, true), parse_rels(getzipstr(zip, drelsp, true), dfile));
- var chartp = resolve_path(draw, dfile);
- var crelsp = get_rels_path(chartp);
- _ws = parse_chart(getzipstr(zip, chartp, true), chartp, opts, parse_rels(getzipstr(zip, crelsp, true), chartp), wb, _ws);
- break;
- case 'macro': _ws = parse_ms(data, path, idx, opts, sheetRels[sheet], wb, themes, styles); break;
- case 'dialog': _ws = parse_ds(data, path, idx, opts, sheetRels[sheet], wb, themes, styles); break;
- default: throw new Error("Unrecognized sheet type " + stype);
- }
- sheets[sheet] = _ws;
-
- /* scan rels for comments */
- var comments = [];
- if(sheetRels && sheetRels[sheet]) keys(sheetRels[sheet]).forEach(function(n) {
- if(sheetRels[sheet][n].Type == RELS.CMNT) {
- var dfile = resolve_path(sheetRels[sheet][n].Target, path);
- comments = parse_cmnt(getzipdata(zip, dfile, true), dfile, opts);
- if(!comments || !comments.length) return;
- sheet_insert_comments(_ws, comments);
- }
- });
- } catch(e) { if(opts.WTF) throw e; }
- }
-
- function strip_front_slash(x) { return x.charAt(0) == '/' ? x.slice(1) : x; }
-
- function parse_zip(zip, opts) {
- make_ssf(SSF);
- opts = opts || {};
- fix_read_opts(opts);
-
- /* OpenDocument Part 3 Section 2.2.1 OpenDocument Package */
- if(safegetzipfile(zip, 'META-INF/manifest.xml')) return parse_ods(zip, opts);
- /* UOC */
- if(safegetzipfile(zip, 'objectdata.xml')) return parse_ods(zip, opts);
- /* Numbers */
- if(safegetzipfile(zip, 'Index/Document.iwa')) throw new Error('Unsupported NUMBERS file');
-
- var entries = zipentries(zip);
- var dir = parse_ct((getzipstr(zip, '[Content_Types].xml')));
- var xlsb = false;
- var sheets, binname;
- if(dir.workbooks.length === 0) {
- binname = "xl/workbook.xml";
- if(getzipdata(zip,binname, true)) dir.workbooks.push(binname);
- }
- if(dir.workbooks.length === 0) {
- binname = "xl/workbook.bin";
- if(!getzipdata(zip,binname,true)) throw new Error("Could not find workbook");
- dir.workbooks.push(binname);
- xlsb = true;
- }
- if(dir.workbooks[0].slice(-3) == "bin") xlsb = true;
-
- var themes = ({});
- var styles = ({});
- if(!opts.bookSheets && !opts.bookProps) {
- strs = [];
- if(dir.sst) try { strs=parse_sst(getzipdata(zip, strip_front_slash(dir.sst)), dir.sst, opts); } catch(e) { if(opts.WTF) throw e; }
-
- if(opts.cellStyles && dir.themes.length) themes = parse_theme(getzipstr(zip, dir.themes[0].replace(/^\//,''), true)||"",dir.themes[0], opts);
-
- if(dir.style) styles = parse_sty(getzipdata(zip, strip_front_slash(dir.style)), dir.style, themes, opts);
- }
-
- /*var externbooks = */dir.links.map(function(link) {
- try {
- var rels = parse_rels(getzipstr(zip, get_rels_path(strip_front_slash(link))), link);
- return parse_xlink(getzipdata(zip, strip_front_slash(link)), rels, link, opts);
- } catch(e) {}
- });
-
- var wb = parse_wb(getzipdata(zip, strip_front_slash(dir.workbooks[0])), dir.workbooks[0], opts);
-
- var props = {}, propdata = "";
-
- if(dir.coreprops.length) {
- propdata = getzipdata(zip, strip_front_slash(dir.coreprops[0]), true);
- if(propdata) props = parse_core_props(propdata);
- if(dir.extprops.length !== 0) {
- propdata = getzipdata(zip, strip_front_slash(dir.extprops[0]), true);
- if(propdata) parse_ext_props(propdata, props, opts);
- }
- }
-
- var custprops = {};
- if(!opts.bookSheets || opts.bookProps) {
- if (dir.custprops.length !== 0) {
- propdata = getzipstr(zip, strip_front_slash(dir.custprops[0]), true);
- if(propdata) custprops = parse_cust_props(propdata, opts);
- }
- }
-
- var out = ({});
- if(opts.bookSheets || opts.bookProps) {
- if(wb.Sheets) sheets = wb.Sheets.map(function pluck(x){ return x.name; });
- else if(props.Worksheets && props.SheetNames.length > 0) sheets=props.SheetNames;
- if(opts.bookProps) { out.Props = props; out.Custprops = custprops; }
- if(opts.bookSheets && typeof sheets !== 'undefined') out.SheetNames = sheets;
- if(opts.bookSheets ? out.SheetNames : opts.bookProps) return out;
- }
- sheets = {};
-
- var deps = {};
- if(opts.bookDeps && dir.calcchain) deps=parse_cc(getzipdata(zip, strip_front_slash(dir.calcchain)),dir.calcchain,opts);
-
- var i=0;
- var sheetRels = ({});
- var path, relsPath;
-
- {
- var wbsheets = wb.Sheets;
- props.Worksheets = wbsheets.length;
- props.SheetNames = [];
- for(var j = 0; j != wbsheets.length; ++j) {
- props.SheetNames[j] = wbsheets[j].name;
- }
- }
-
- var wbext = xlsb ? "bin" : "xml";
- var wbrelsi = dir.workbooks[0].lastIndexOf("/");
- var wbrelsfile = (dir.workbooks[0].slice(0, wbrelsi+1) + "_rels/" + dir.workbooks[0].slice(wbrelsi+1) + ".rels").replace(/^\//,"");
- if(!safegetzipfile(zip, wbrelsfile)) wbrelsfile = 'xl/_rels/workbook.' + wbext + '.rels';
- var wbrels = parse_rels(getzipstr(zip, wbrelsfile, true), wbrelsfile);
- if(wbrels) wbrels = safe_parse_wbrels(wbrels, wb.Sheets);
-
- /* Numbers iOS hack */
- var nmode = (getzipdata(zip,"xl/worksheets/sheet.xml",true))?1:0;
- wsloop: for(i = 0; i != props.Worksheets; ++i) {
- var stype = "sheet";
- if(wbrels && wbrels[i]) {
- path = 'xl/' + (wbrels[i][1]).replace(/[\/]?xl\//, "");
- if(!safegetzipfile(zip, path)) path = wbrels[i][1];
- if(!safegetzipfile(zip, path)) path = wbrelsfile.replace(/_rels\/.*$/,"") + wbrels[i][1];
- stype = wbrels[i][2];
- } else {
- path = 'xl/worksheets/sheet'+(i+1-nmode)+"." + wbext;
- path = path.replace(/sheet0\./,"sheet.");
- }
- relsPath = path.replace(/^(.*)(\/)([^\/]*)$/, "$1/_rels/$3.rels");
- if(opts && opts.sheets != null) switch(typeof opts.sheets) {
- case "number": if(i != opts.sheets) continue wsloop; break;
- case "string": if(props.SheetNames[i].toLowerCase() != opts.sheets.toLowerCase()) continue wsloop; break;
- default: if(Array.isArray && Array.isArray(opts.sheets)) {
- var snjseen = false;
- for(var snj = 0; snj != opts.sheets.length; ++snj) {
- if(typeof opts.sheets[snj] == "number" && opts.sheets[snj] == i) snjseen=1;
- if(typeof opts.sheets[snj] == "string" && opts.sheets[snj].toLowerCase() == props.SheetNames[i].toLowerCase()) snjseen = 1;
- }
- if(!snjseen) continue wsloop;
- }
- }
- safe_parse_sheet(zip, path, relsPath, props.SheetNames[i], i, sheetRels, sheets, stype, opts, wb, themes, styles);
- }
-
- out = ({
- Directory: dir,
- Workbook: wb,
- Props: props,
- Custprops: custprops,
- Deps: deps,
- Sheets: sheets,
- SheetNames: props.SheetNames,
- Strings: strs,
- Styles: styles,
- Themes: themes,
- SSF: SSF.get_table()
- });
- if(opts && opts.bookFiles) {
- out.keys = entries;
- out.files = zip.files;
- }
- if(opts && opts.bookVBA) {
- if(dir.vba.length > 0) out.vbaraw = getzipdata(zip,strip_front_slash(dir.vba[0]),true);
- else if(dir.defaults && dir.defaults.bin === CT_VBA) out.vbaraw = getzipdata(zip, 'xl/vbaProject.bin',true);
- }
- return out;
- }
-
- /* [MS-OFFCRYPTO] 2.1.1 */
- function parse_xlsxcfb(cfb, _opts) {
- var opts = _opts || {};
- var f = 'Workbook', data = CFB.find(cfb, f);
- try {
- f = '/!DataSpaces/Version';
- data = CFB.find(cfb, f); if(!data || !data.content) throw new Error("ECMA-376 Encrypted file missing " + f);
- /*var version = */parse_DataSpaceVersionInfo(data.content);
-
- /* 2.3.4.1 */
- f = '/!DataSpaces/DataSpaceMap';
- data = CFB.find(cfb, f); if(!data || !data.content) throw new Error("ECMA-376 Encrypted file missing " + f);
- var dsm = parse_DataSpaceMap(data.content);
- 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")
- throw new Error("ECMA-376 Encrypted file bad " + f);
-
- /* 2.3.4.2 */
- f = '/!DataSpaces/DataSpaceInfo/StrongEncryptionDataSpace';
- data = CFB.find(cfb, f); if(!data || !data.content) throw new Error("ECMA-376 Encrypted file missing " + f);
- var seds = parse_DataSpaceDefinition(data.content);
- if(seds.length != 1 || seds[0] != "StrongEncryptionTransform")
- throw new Error("ECMA-376 Encrypted file bad " + f);
-
- /* 2.3.4.3 */
- f = '/!DataSpaces/TransformInfo/StrongEncryptionTransform/!Primary';
- data = CFB.find(cfb, f); if(!data || !data.content) throw new Error("ECMA-376 Encrypted file missing " + f);
- /*var hdr = */parse_Primary(data.content);
- } catch(e) {}
-
- f = '/EncryptionInfo';
- data = CFB.find(cfb, f); if(!data || !data.content) throw new Error("ECMA-376 Encrypted file missing " + f);
- var einfo = parse_EncryptionInfo(data.content);
-
- /* 2.3.4.4 */
- f = '/EncryptedPackage';
- data = CFB.find(cfb, f); if(!data || !data.content) throw new Error("ECMA-376 Encrypted file missing " + f);
-
- /*global decrypt_agile */
- if(einfo[0] == 0x04 && typeof decrypt_agile !== 'undefined') return decrypt_agile(einfo[1], data.content, opts.password || "", opts);
- /*global decrypt_std76 */
- if(einfo[0] == 0x02 && typeof decrypt_std76 !== 'undefined') return decrypt_std76(einfo[1], data.content, opts.password || "", opts);
- throw new Error("File is password-protected");
- }
-
- function write_zip(wb, opts) {
- _shapeid = 1024;
- if(opts.bookType == "ods") return write_ods(wb, opts);
- if(wb && !wb.SSF) {
- wb.SSF = SSF.get_table();
- }
- if(wb && wb.SSF) {
- make_ssf(SSF); SSF.load_table(wb.SSF);
- // $FlowIgnore
- opts.revssf = evert_num(wb.SSF); opts.revssf[wb.SSF[65535]] = 0;
- opts.ssf = wb.SSF;
- }
- opts.rels = {}; opts.wbrels = {};
- opts.Strings = []; opts.Strings.Count = 0; opts.Strings.Unique = 0;
- if(browser_has_Map) opts.revStrings = new Map();
- else { opts.revStrings = {}; opts.revStrings.foo = []; delete opts.revStrings.foo; }
- var wbext = opts.bookType == "xlsb" ? "bin" : "xml";
- var vbafmt = VBAFMTS.indexOf(opts.bookType) > -1;
- var ct = new_ct();
- fix_write_opts(opts = opts || {});
- var zip = zip_new();
- var f = "", rId = 0;
-
- opts.cellXfs = [];
- get_cell_style(opts.cellXfs, {}, {revssf:{"General":0}});
-
- if(!wb.Props) wb.Props = {};
-
- f = "docProps/core.xml";
- zip_add_file(zip, f, write_core_props(wb.Props, opts));
- ct.coreprops.push(f);
- add_rels(opts.rels, 2, f, RELS.CORE_PROPS);
-
- f = "docProps/app.xml";
- if(wb.Props && wb.Props.SheetNames){/* empty */}
- else if(!wb.Workbook || !wb.Workbook.Sheets) wb.Props.SheetNames = wb.SheetNames;
- else {
- var _sn = [];
- for(var _i = 0; _i < wb.SheetNames.length; ++_i)
- if((wb.Workbook.Sheets[_i]||{}).Hidden != 2) _sn.push(wb.SheetNames[_i]);
- wb.Props.SheetNames = _sn;
- }
- wb.Props.Worksheets = wb.Props.SheetNames.length;
- zip_add_file(zip, f, write_ext_props(wb.Props, opts));
- ct.extprops.push(f);
- add_rels(opts.rels, 3, f, RELS.EXT_PROPS);
-
- if(wb.Custprops !== wb.Props && keys(wb.Custprops||{}).length > 0) {
- f = "docProps/custom.xml";
- zip_add_file(zip, f, write_cust_props(wb.Custprops, opts));
- ct.custprops.push(f);
- add_rels(opts.rels, 4, f, RELS.CUST_PROPS);
- }
-
- for(rId=1;rId <= wb.SheetNames.length; ++rId) {
- var wsrels = {'!id':{}};
- var ws = wb.Sheets[wb.SheetNames[rId-1]];
- var _type = (ws || {})["!type"] || "sheet";
- switch(_type) {
- case "chart":
- /* falls through */
- default:
- f = "xl/worksheets/sheet" + rId + "." + wbext;
- zip_add_file(zip, f, write_ws(rId-1, f, opts, wb, wsrels));
- ct.sheets.push(f);
- add_rels(opts.wbrels, -1, "worksheets/sheet" + rId + "." + wbext, RELS.WS[0]);
- }
-
- if(ws) {
- var comments = ws['!comments'];
- var need_vml = false;
- if(comments && comments.length > 0) {
- var cf = "xl/comments" + rId + "." + wbext;
- zip_add_file(zip, cf, write_cmnt(comments, cf, opts));
- ct.comments.push(cf);
- add_rels(wsrels, -1, "../comments" + rId + "." + wbext, RELS.CMNT);
- need_vml = true;
- }
- if(ws['!legacy']) {
- if(need_vml) zip_add_file(zip, "xl/drawings/vmlDrawing" + (rId) + ".vml", write_comments_vml(rId, ws['!comments']));
- }
- delete ws['!comments'];
- delete ws['!legacy'];
- }
-
- if(wsrels['!id'].rId1) zip_add_file(zip, get_rels_path(f), write_rels(wsrels));
- }
-
- if(opts.Strings != null && opts.Strings.length > 0) {
- f = "xl/sharedStrings." + wbext;
- zip_add_file(zip, f, write_sst(opts.Strings, f, opts));
- ct.strs.push(f);
- add_rels(opts.wbrels, -1, "sharedStrings." + wbext, RELS.SST);
- }
-
- f = "xl/workbook." + wbext;
- zip_add_file(zip, f, write_wb(wb, f, opts));
- ct.workbooks.push(f);
- add_rels(opts.rels, 1, f, RELS.WB);
-
- /* TODO: something more intelligent with themes */
-
- f = "xl/theme/theme1.xml";
- zip_add_file(zip, f, write_theme(wb.Themes, opts));
- ct.themes.push(f);
- add_rels(opts.wbrels, -1, "theme/theme1.xml", RELS.THEME);
-
- /* TODO: something more intelligent with styles */
-
- f = "xl/styles." + wbext;
- zip_add_file(zip, f, write_sty(wb, f, opts));
- ct.styles.push(f);
- add_rels(opts.wbrels, -1, "styles." + wbext, RELS.STY);
-
- if(wb.vbaraw && vbafmt) {
- f = "xl/vbaProject.bin";
- zip_add_file(zip, f, wb.vbaraw);
- ct.vba.push(f);
- add_rels(opts.wbrels, -1, "vbaProject.bin", RELS.VBA);
- }
-
- zip_add_file(zip, "[Content_Types].xml", write_ct(ct, opts));
- zip_add_file(zip, '_rels/.rels', write_rels(opts.rels));
- zip_add_file(zip, 'xl/_rels/workbook.' + wbext + '.rels', write_rels(opts.wbrels));
-
- delete opts.revssf; delete opts.ssf;
- return zip;
- }
- function firstbyte(f,o) {
- var x = "";
- switch((o||{}).type || "base64") {
- case 'buffer': return [f[0], f[1], f[2], f[3], f[4], f[5], f[6], f[7]];
- case 'base64': x = Base64.decode(f.slice(0,12)); break;
- case 'binary': x = f; break;
- case 'array': return [f[0], f[1], f[2], f[3], f[4], f[5], f[6], f[7]];
- default: throw new Error("Unrecognized type " + (o && o.type || "undefined"));
- }
- 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)];
- }
-
- function read_cfb(cfb, opts) {
- if(CFB.find(cfb, "EncryptedPackage")) return parse_xlsxcfb(cfb, opts);
- return parse_xlscfb(cfb, opts);
- }
-
- function read_zip(data, opts) {
- var zip, d = data;
- var o = opts||{};
- if(!o.type) o.type = (has_buf && Buffer.isBuffer(data)) ? "buffer" : "base64";
- zip = zip_read(d, o);
- return parse_zip(zip, o);
- }
-
- function read_plaintext(data, o) {
- var i = 0;
- main: while(i < data.length) switch(data.charCodeAt(i)) {
- case 0x0A: case 0x0D: case 0x20: ++i; break;
- case 0x3C: return parse_xlml(data.slice(i),o);
- default: break main;
- }
- return PRN.to_workbook(data, o);
- }
-
- function read_plaintext_raw(data, o) {
- var str = "", bytes = firstbyte(data, o);
- switch(o.type) {
- case 'base64': str = Base64.decode(data); break;
- case 'binary': str = data; break;
- case 'buffer': str = data.toString('binary'); break;
- case 'array': str = cc2str(data); break;
- default: throw new Error("Unrecognized type " + o.type);
- }
- if(bytes[0] == 0xEF && bytes[1] == 0xBB && bytes[2] == 0xBF) str = utf8read(str);
- return read_plaintext(str, o);
- }
-
- function read_utf16(data, o) {
- var d = data;
- if(o.type == 'base64') d = Base64.decode(d);
- d = cptable.utils.decode(1200, d.slice(2), 'str');
- o.type = "binary";
- return read_plaintext(d, o);
- }
-
- function bstrify(data) {
- return !data.match(/[^\x00-\x7F]/) ? data : utf8write(data);
- }
-
- function read_prn(data, d, o, str) {
- if(str) { o.type = "string"; return PRN.to_workbook(data, o); }
- return PRN.to_workbook(d, o);
- }
-
- function readSync(data, opts) {
- reset_cp();
- if(typeof ArrayBuffer !== 'undefined' && data instanceof ArrayBuffer) return readSync(new Uint8Array(data), opts);
- var d = data, n = [0,0,0,0], str = false;
- var o = opts||{};
- if(o.cellStyles) { o.cellNF = true; o.sheetStubs = true; }
- _ssfopts = {};
- if(o.dateNF) _ssfopts.dateNF = o.dateNF;
- if(!o.type) o.type = (has_buf && Buffer.isBuffer(data)) ? "buffer" : "base64";
- if(o.type == "file") { o.type = has_buf ? "buffer" : "binary"; d = read_binary(data); }
- if(o.type == "string") { str = true; o.type = "binary"; o.codepage = 65001; d = bstrify(data); }
- if(o.type == 'array' && typeof Uint8Array !== 'undefined' && data instanceof Uint8Array && typeof ArrayBuffer !== 'undefined') {
- // $FlowIgnore
- var ab=new ArrayBuffer(3), vu=new Uint8Array(ab); vu.foo="bar";
- // $FlowIgnore
- if(!vu.foo) {o=dup(o); o.type='array'; return readSync(ab2a(d), o);}
- }
- switch((n = firstbyte(d, o))[0]) {
- 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;
- case 0x09: if(n[1] <= 0x04) return parse_xlscfb(d, o); break;
- case 0x3C: return parse_xlml(d, o);
- case 0x49:
- if(n[1] === 0x49 && n[2] === 0x2a && n[3] === 0x00) throw new Error("TIFF Image File is not a spreadsheet");
- if(n[1] === 0x44) return read_wb_ID(d, o);
- break;
- case 0x54: if(n[1] === 0x41 && n[2] === 0x42 && n[3] === 0x4C) return DIF.to_workbook(d, o); break;
- case 0x50: return (n[1] === 0x4B && n[2] < 0x09 && n[3] < 0x09) ? read_zip(d, o) : read_prn(data, d, o, str);
- case 0xEF: return n[3] === 0x3C ? parse_xlml(d, o) : read_prn(data, d, o, str);
- case 0xFF: if(n[1] === 0xFE) { return read_utf16(d, o); } break;
- case 0x00: if(n[1] === 0x00 && n[2] >= 0x02 && n[3] === 0x00) return WK_.to_workbook(d, o); break;
- case 0x03: case 0x83: case 0x8B: case 0x8C: return DBF.to_workbook(d, o);
- case 0x7B: if(n[1] === 0x5C && n[2] === 0x72 && n[3] === 0x74) return RTF.to_workbook(d, o); break;
- case 0x0A: case 0x0D: case 0x20: return read_plaintext_raw(d, o);
- }
- if(DBF.versions.indexOf(n[0]) > -1 && n[2] <= 12 && n[3] <= 31) return DBF.to_workbook(d, o);
- return read_prn(data, d, o, str);
- }
-
- function readFileSync(filename, opts) {
- var o = opts||{}; o.type = 'file';
- return readSync(filename, o);
- }
- function write_cfb_ctr(cfb, o) {
- switch(o.type) {
- case "base64": case "binary": break;
- case "buffer": case "array": o.type = ""; break;
- case "file": return write_dl(o.file, CFB.write(cfb, {type:has_buf ? 'buffer' : ""}));
- case "string": throw new Error("'string' output type invalid for '" + o.bookType + "' files");
- default: throw new Error("Unrecognized type " + o.type);
- }
- return CFB.write(cfb, o);
- }
-
- function write_zip_type(wb, opts) {
- var o = opts||{};
- var z = write_zip(wb, o);
- var oopts = {};
- if(o.compression) oopts.compression = 'DEFLATE';
- if(o.password) oopts.type = has_buf ? "nodebuffer" : "string";
- else switch(o.type) {
- case "base64": oopts.type = "base64"; break;
- case "binary": oopts.type = "string"; break;
- case "string": throw new Error("'string' output type invalid for '" + o.bookType + "' files");
- case "buffer":
- case "file": oopts.type = has_buf ? "nodebuffer" : "string"; break;
- default: throw new Error("Unrecognized type " + o.type);
- }
- var out = z.FullPaths ? CFB.write(z, {fileType:"zip", type: {"nodebuffer": "buffer", "string": "binary"}[oopts.type] || oopts.type}) : z.generate(oopts);
- /*jshint -W083 */
- if(o.password && typeof encrypt_agile !== 'undefined') return write_cfb_ctr(encrypt_agile(out, o.password), o); // eslint-disable-line no-undef
- /*jshint +W083 */
- if(o.type === "file") return write_dl(o.file, out);
- return o.type == "string" ? utf8read(out) : out;
- }
-
- function write_cfb_type(wb, opts) {
- var o = opts||{};
- var cfb = write_xlscfb(wb, o);
- return write_cfb_ctr(cfb, o);
- }
-
- function write_string_type(out, opts, bom) {
- if(!bom) bom = "";
- var o = bom + out;
- switch(opts.type) {
- case "base64": return Base64.encode(utf8write(o));
- case "binary": return utf8write(o);
- case "string": return out;
- case "file": return write_dl(opts.file, o, 'utf8');
- case "buffer": {
- if(has_buf) return Buffer_from(o, 'utf8');
- else return write_string_type(o, {type:'binary'}).split("").map(function(c) { return c.charCodeAt(0); });
- }
- }
- throw new Error("Unrecognized type " + opts.type);
- }
-
- function write_stxt_type(out, opts) {
- switch(opts.type) {
- case "base64": return Base64.encode(out);
- case "binary": return out;
- case "string": return out; /* override in sheet_to_txt */
- case "file": return write_dl(opts.file, out, 'binary');
- case "buffer": {
- if(has_buf) return Buffer_from(out, 'binary');
- else return out.split("").map(function(c) { return c.charCodeAt(0); });
- }
- }
- throw new Error("Unrecognized type " + opts.type);
- }
-
- /* TODO: test consistency */
- function write_binary_type(out, opts) {
- switch(opts.type) {
- case "string":
- case "base64":
- case "binary":
- var bstr = "";
- // $FlowIgnore
- for(var i = 0; i < out.length; ++i) bstr += String.fromCharCode(out[i]);
- return opts.type == 'base64' ? Base64.encode(bstr) : opts.type == 'string' ? utf8read(bstr) : bstr;
- case "file": return write_dl(opts.file, out);
- case "buffer": return out;
- default: throw new Error("Unrecognized type " + opts.type);
- }
- }
-
- function writeSync(wb, opts) {
- reset_cp();
- check_wb(wb);
- var o = opts||{};
- if(o.cellStyles) { o.cellNF = true; o.sheetStubs = true; }
- if(o.type == "array") { o.type = "binary"; var out = (writeSync(wb, o)); o.type = "array"; return s2ab(out); }
- switch(o.bookType || 'xlsb') {
- case 'xml':
- case 'xlml': return write_string_type(write_xlml(wb, o), o);
- case 'slk':
- case 'sylk': return write_string_type(write_slk_str(wb, o), o);
- case 'htm':
- case 'html': return write_string_type(write_htm_str(wb, o), o);
- case 'txt': return write_stxt_type(write_txt_str(wb, o), o);
- case 'csv': return write_string_type(write_csv_str(wb, o), o, "\ufeff");
- case 'dif': return write_string_type(write_dif_str(wb, o), o);
- case 'dbf': return write_binary_type(write_dbf_buf(wb, o), o);
- case 'prn': return write_string_type(write_prn_str(wb, o), o);
- case 'rtf': return write_string_type(write_rtf_str(wb, o), o);
- case 'eth': return write_string_type(write_eth_str(wb, o), o);
- case 'fods': return write_string_type(write_ods(wb, o), o);
- case 'biff2': if(!o.biff) o.biff = 2; /* falls through */
- case 'biff3': if(!o.biff) o.biff = 3; /* falls through */
- case 'biff4': if(!o.biff) o.biff = 4; return write_binary_type(write_biff_buf(wb, o), o);
- case 'biff5': if(!o.biff) o.biff = 5; /* falls through */
- case 'biff8':
- case 'xla':
- case 'xls': if(!o.biff) o.biff = 8; return write_cfb_type(wb, o);
- case 'xlsx':
- case 'xlsm':
- case 'xlam':
- case 'xlsb':
- case 'ods': return write_zip_type(wb, o);
- default: throw new Error ("Unrecognized bookType |" + o.bookType + "|");
- }
- }
-
- function resolve_book_type(o) {
- if(o.bookType) return;
- var _BT = {
- "xls": "biff8",
- "htm": "html",
- "slk": "sylk",
- "socialcalc": "eth",
- "Sh33tJS": "WTF"
- };
- var ext = o.file.slice(o.file.lastIndexOf(".")).toLowerCase();
- if(ext.match(/^\.[a-z]+$/)) o.bookType = ext.slice(1);
- o.bookType = _BT[o.bookType] || o.bookType;
- }
-
- function writeFileSync(wb, filename, opts) {
- var o = opts||{}; o.type = 'file';
- o.file = filename;
- resolve_book_type(o);
- return writeSync(wb, o);
- }
-
- function writeFileAsync(filename, wb, opts, cb) {
- var o = opts||{}; o.type = 'file';
- o.file = filename;
- resolve_book_type(o);
- o.type = 'buffer';
- var _cb = cb; if(!(_cb instanceof Function)) _cb = (opts);
- return _fs.writeFile(filename, writeSync(wb, o), _cb);
- }
- function make_json_row(sheet, r, R, cols, header, hdr, dense, o) {
- var rr = encode_row(R);
- var defval = o.defval, raw = o.raw || !Object.prototype.hasOwnProperty.call(o, "raw");
- var isempty = true;
- var row = (header === 1) ? [] : {};
- if(header !== 1) {
- if(Object.defineProperty) try { Object.defineProperty(row, '__rowNum__', {value:R, enumerable:false}); } catch(e) { row.__rowNum__ = R; }
- else row.__rowNum__ = R;
- }
- if(!dense || sheet[R]) for (var C = r.s.c; C <= r.e.c; ++C) {
- var val = dense ? sheet[R][C] : sheet[cols[C] + rr];
- if(val === undefined || val.t === undefined) {
- if(defval === undefined) continue;
- if(hdr[C] != null) { row[hdr[C]] = defval; }
- continue;
- }
- var v = val.v;
- switch(val.t){
- case 'z': if(v == null) break; continue;
- case 'e': v = void 0; break;
- case 's': case 'd': case 'b': case 'n': break;
- default: throw new Error('unrecognized type ' + val.t);
- }
- if(hdr[C] != null) {
- if(v == null) {
- if(defval !== undefined) row[hdr[C]] = defval;
- else if(raw && v === null) row[hdr[C]] = null;
- else continue;
- } else {
- row[hdr[C]] = raw || (o.rawNumbers && val.t == "n") ? v : format_cell(val,v,o);
- }
- if(v != null) isempty = false;
- }
- }
- return { row: row, isempty: isempty };
- }
-
-
- function sheet_to_json(sheet, opts) {
- if(sheet == null || sheet["!ref"] == null) return [];
- var val = {t:'n',v:0}, header = 0, offset = 1, hdr = [], v=0, vv="";
- var r = {s:{r:0,c:0},e:{r:0,c:0}};
- var o = opts || {};
- var range = o.range != null ? o.range : sheet["!ref"];
- if(o.header === 1) header = 1;
- else if(o.header === "A") header = 2;
- else if(Array.isArray(o.header)) header = 3;
- else if(o.header == null) header = 0;
- switch(typeof range) {
- case 'string': r = safe_decode_range(range); break;
- case 'number': r = safe_decode_range(sheet["!ref"]); r.s.r = range; break;
- default: r = range;
- }
- if(header > 0) offset = 0;
- var rr = encode_row(r.s.r);
- var cols = [];
- var out = [];
- var outi = 0, counter = 0;
- var dense = Array.isArray(sheet);
- var R = r.s.r, C = 0, CC = 0;
- if(dense && !sheet[R]) sheet[R] = [];
- for(C = r.s.c; C <= r.e.c; ++C) {
- cols[C] = encode_col(C);
- val = dense ? sheet[R][C] : sheet[cols[C] + rr];
- switch(header) {
- case 1: hdr[C] = C - r.s.c; break;
- case 2: hdr[C] = cols[C]; break;
- case 3: hdr[C] = o.header[C - r.s.c]; break;
- default:
- if(val == null) val = {w: "__EMPTY", t: "s"};
- vv = v = format_cell(val, null, o);
- counter = 0;
- for(CC = 0; CC < hdr.length; ++CC) if(hdr[CC] == vv) vv = v + "_" + (++counter);
- hdr[C] = vv;
- }
- }
- for (R = r.s.r + offset; R <= r.e.r; ++R) {
- var row = make_json_row(sheet, r, R, cols, header, hdr, dense, o);
- if((row.isempty === false) || (header === 1 ? o.blankrows !== false : !!o.blankrows)) out[outi++] = row.row;
- }
- out.length = outi;
- return out;
- }
-
- var qreg = /"/g;
- function make_csv_row(sheet, r, R, cols, fs, rs, FS, o) {
- var isempty = true;
- var row = [], txt = "", rr = encode_row(R);
- for(var C = r.s.c; C <= r.e.c; ++C) {
- if (!cols[C]) continue;
- var val = o.dense ? (sheet[R]||[])[C]: sheet[cols[C] + rr];
- if(val == null) txt = "";
- else if(val.v != null) {
- isempty = false;
- txt = ''+(o.rawNumbers && val.t == "n" ? val.v : format_cell(val, null, o));
- 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; }
- if(txt == "ID") txt = '"ID"';
- } else if(val.f != null && !val.F) {
- isempty = false;
- txt = '=' + val.f; if(txt.indexOf(",") >= 0) txt = '"' + txt.replace(qreg, '""') + '"';
- } else txt = "";
- /* NOTE: Excel CSV does not support array formulae */
- row.push(txt);
- }
- if(o.blankrows === false && isempty) return null;
- return row.join(FS);
- }
-
- function sheet_to_csv(sheet, opts) {
- var out = [];
- var o = opts == null ? {} : opts;
- if(sheet == null || sheet["!ref"] == null) return "";
- var r = safe_decode_range(sheet["!ref"]);
- var FS = o.FS !== undefined ? o.FS : ",", fs = FS.charCodeAt(0);
- var RS = o.RS !== undefined ? o.RS : "\n", rs = RS.charCodeAt(0);
- var endregex = new RegExp((FS=="|" ? "\\|" : FS)+"+$");
- var row = "", cols = [];
- o.dense = Array.isArray(sheet);
- var colinfo = o.skipHidden && sheet["!cols"] || [];
- var rowinfo = o.skipHidden && sheet["!rows"] || [];
- for(var C = r.s.c; C <= r.e.c; ++C) if (!((colinfo[C]||{}).hidden)) cols[C] = encode_col(C);
- for(var R = r.s.r; R <= r.e.r; ++R) {
- if ((rowinfo[R]||{}).hidden) continue;
- row = make_csv_row(sheet, r, R, cols, fs, rs, FS, o);
- if(row == null) { continue; }
- if(o.strip) row = row.replace(endregex,"");
- out.push(row + RS);
- }
- delete o.dense;
- return out.join("");
- }
-
- function sheet_to_txt(sheet, opts) {
- if(!opts) opts = {}; opts.FS = "\t"; opts.RS = "\n";
- var s = sheet_to_csv(sheet, opts);
- if(typeof cptable == 'undefined' || opts.type == 'string') return s;
- var o = cptable.utils.encode(1200, s, 'str');
- return String.fromCharCode(255) + String.fromCharCode(254) + o;
- }
-
- function sheet_to_formulae(sheet) {
- var y = "", x, val="";
- if(sheet == null || sheet["!ref"] == null) return [];
- var r = safe_decode_range(sheet['!ref']), rr = "", cols = [], C;
- var cmds = [];
- var dense = Array.isArray(sheet);
- for(C = r.s.c; C <= r.e.c; ++C) cols[C] = encode_col(C);
- for(var R = r.s.r; R <= r.e.r; ++R) {
- rr = encode_row(R);
- for(C = r.s.c; C <= r.e.c; ++C) {
- y = cols[C] + rr;
- x = dense ? (sheet[R]||[])[C] : sheet[y];
- val = "";
- if(x === undefined) continue;
- else if(x.F != null) {
- y = x.F;
- if(!x.f) continue;
- val = x.f;
- if(y.indexOf(":") == -1) y = y + ":" + y;
- }
- if(x.f != null) val = x.f;
- else if(x.t == 'z') continue;
- else if(x.t == 'n' && x.v != null) val = "" + x.v;
- else if(x.t == 'b') val = x.v ? "TRUE" : "FALSE";
- else if(x.w !== undefined) val = "'" + x.w;
- else if(x.v === undefined) continue;
- else if(x.t == 's') val = "'" + x.v;
- else val = ""+x.v;
- cmds[cmds.length] = y + "=" + val;
- }
- }
- return cmds;
- }
-
- function sheet_add_json(_ws, js, opts) {
- var o = opts || {};
- var offset = +!o.skipHeader;
- var ws = _ws || ({});
- var _R = 0, _C = 0;
- if(ws && o.origin != null) {
- if(typeof o.origin == 'number') _R = o.origin;
- else {
- var _origin = typeof o.origin == "string" ? decode_cell(o.origin) : o.origin;
- _R = _origin.r; _C = _origin.c;
- }
- }
- var cell;
- var range = ({s: {c:0, r:0}, e: {c:_C, r:_R + js.length - 1 + offset}});
- if(ws['!ref']) {
- var _range = safe_decode_range(ws['!ref']);
- range.e.c = Math.max(range.e.c, _range.e.c);
- range.e.r = Math.max(range.e.r, _range.e.r);
- if(_R == -1) { _R = _range.e.r + 1; range.e.r = _R + js.length - 1 + offset; }
- } else {
- if(_R == -1) { _R = 0; range.e.r = js.length - 1 + offset; }
- }
- var hdr = o.header || [], C = 0;
-
- js.forEach(function (JS, R) {
- keys(JS).forEach(function(k) {
- if((C=hdr.indexOf(k)) == -1) hdr[C=hdr.length] = k;
- var v = JS[k];
- var t = 'z';
- var z = "";
- var ref = encode_cell({c:_C + C,r:_R + R + offset});
- cell = utils.sheet_get_cell(ws, ref);
- if(v && typeof v === 'object' && !(v instanceof Date)){
- ws[ref] = v;
- } else {
- if(typeof v == 'number') t = 'n';
- else if(typeof v == 'boolean') t = 'b';
- else if(typeof v == 'string') t = 's';
- else if(v instanceof Date) {
- t = 'd';
- if(!o.cellDates) { t = 'n'; v = datenum(v); }
- z = (o.dateNF || SSF._table[14]);
- }
- if(!cell) ws[ref] = cell = ({t:t, v:v});
- else {
- cell.t = t; cell.v = v;
- delete cell.w; delete cell.R;
- if(z) cell.z = z;
- }
- if(z) cell.z = z;
- }
- });
- });
- range.e.c = Math.max(range.e.c, _C + hdr.length - 1);
- var __R = encode_row(_R);
- if(offset) for(C = 0; C < hdr.length; ++C) ws[encode_col(C + _C) + __R] = {t:'s', v:hdr[C]};
- ws['!ref'] = encode_range(range);
- return ws;
- }
- function json_to_sheet(js, opts) { return sheet_add_json(null, js, opts); }
-
- var utils = {
- encode_col: encode_col,
- encode_row: encode_row,
- encode_cell: encode_cell,
- encode_range: encode_range,
- decode_col: decode_col,
- decode_row: decode_row,
- split_cell: split_cell,
- decode_cell: decode_cell,
- decode_range: decode_range,
- format_cell: format_cell,
- get_formulae: sheet_to_formulae,
- make_csv: sheet_to_csv,
- make_json: sheet_to_json,
- make_formulae: sheet_to_formulae,
- sheet_add_aoa: sheet_add_aoa,
- sheet_add_json: sheet_add_json,
- sheet_add_dom: sheet_add_dom,
- aoa_to_sheet: aoa_to_sheet,
- json_to_sheet: json_to_sheet,
- table_to_sheet: parse_dom_table,
- table_to_book: table_to_book,
- sheet_to_csv: sheet_to_csv,
- sheet_to_txt: sheet_to_txt,
- sheet_to_json: sheet_to_json,
- sheet_to_html: HTML_.from_sheet,
- sheet_to_formulae: sheet_to_formulae,
- sheet_to_row_object_array: sheet_to_json
- };
-
- (function(utils) {
- utils.consts = utils.consts || {};
- function add_consts(R/*Array<any>*/) { R.forEach(function(a){ utils.consts[a[0]] = a[1]; }); }
-
- function get_default(x, y, z) { return x[y] != null ? x[y] : (x[y] = z); }
-
- /* get cell, creating a stub if necessary */
- function ws_get_cell_stub(ws, R, C) {
- /* A1 cell address */
- if(typeof R == "string") {
- /* dense */
- if(Array.isArray(ws)) {
- var RC = decode_cell(R);
- if(!ws[RC.r]) ws[RC.r] = [];
- return ws[RC.r][RC.c] || (ws[RC.r][RC.c] = {t:'z'});
- }
- return ws[R] || (ws[R] = {t:'z'});
- }
- /* cell address object */
- if(typeof R != "number") return ws_get_cell_stub(ws, encode_cell(R));
- /* R and C are 0-based indices */
- return ws_get_cell_stub(ws, encode_cell({r:R,c:C||0}));
- }
- utils.sheet_get_cell = ws_get_cell_stub;
-
- /* find sheet index for given name / validate index */
- function wb_sheet_idx(wb, sh) {
- if(typeof sh == "number") {
- if(sh >= 0 && wb.SheetNames.length > sh) return sh;
- throw new Error("Cannot find sheet # " + sh);
- } else if(typeof sh == "string") {
- var idx = wb.SheetNames.indexOf(sh);
- if(idx > -1) return idx;
- throw new Error("Cannot find sheet name |" + sh + "|");
- } else throw new Error("Cannot find sheet |" + sh + "|");
- }
-
- /* simple blank workbook object */
- utils.book_new = function() {
- return { SheetNames: [], Sheets: {} };
- };
-
- /* add a worksheet to the end of a given workbook */
- utils.book_append_sheet = function(wb, ws, name) {
- if(!name) for(var i = 1; i <= 0xFFFF; ++i, name = undefined) if(wb.SheetNames.indexOf(name = "Sheet" + i) == -1) break;
- if(!name || wb.SheetNames.length >= 0xFFFF) throw new Error("Too many worksheets");
- check_ws_name(name);
- if(wb.SheetNames.indexOf(name) >= 0) throw new Error("Worksheet with name |" + name + "| already exists!");
-
- wb.SheetNames.push(name);
- wb.Sheets[name] = ws;
- };
-
- /* set sheet visibility (visible/hidden/very hidden) */
- utils.book_set_sheet_visibility = function(wb, sh, vis) {
- get_default(wb,"Workbook",{});
- get_default(wb.Workbook,"Sheets",[]);
-
- var idx = wb_sheet_idx(wb, sh);
- // $FlowIgnore
- get_default(wb.Workbook.Sheets,idx, {});
-
- switch(vis) {
- case 0: case 1: case 2: break;
- default: throw new Error("Bad sheet visibility setting " + vis);
- }
- // $FlowIgnore
- wb.Workbook.Sheets[idx].Hidden = vis;
- };
- add_consts([
- ["SHEET_VISIBLE", 0],
- ["SHEET_HIDDEN", 1],
- ["SHEET_VERY_HIDDEN", 2]
- ]);
-
- /* set number format */
- utils.cell_set_number_format = function(cell, fmt) {
- cell.z = fmt;
- return cell;
- };
-
- /* set cell hyperlink */
- utils.cell_set_hyperlink = function(cell, target, tooltip) {
- if(!target) {
- delete cell.l;
- } else {
- cell.l = ({ Target: target });
- if(tooltip) cell.l.Tooltip = tooltip;
- }
- return cell;
- };
- utils.cell_set_internal_link = function(cell, range, tooltip) { return utils.cell_set_hyperlink(cell, "#" + range, tooltip); };
-
- /* add to cell comments */
- utils.cell_add_comment = function(cell, text, author) {
- if(!cell.c) cell.c = [];
- cell.c.push({t:text, a:author||"SheetJS"});
- };
-
- /* set array formula and flush related cells */
- utils.sheet_set_array_formula = function(ws, range, formula) {
- var rng = typeof range != "string" ? range : safe_decode_range(range);
- var rngstr = typeof range == "string" ? range : encode_range(range);
- for(var R = rng.s.r; R <= rng.e.r; ++R) for(var C = rng.s.c; C <= rng.e.c; ++C) {
- var cell = ws_get_cell_stub(ws, R, C);
- cell.t = 'n';
- cell.F = rngstr;
- delete cell.v;
- if(R == rng.s.r && C == rng.s.c) cell.f = formula;
- }
- return ws;
- };
-
- return utils;
- })(utils);
-
- if(has_buf && "function" != 'undefined') (function() {
- var Readable = __webpack_require__(/*! stream */ "?20df").Readable;
-
- var write_csv_stream = function(sheet, opts) {
- var stream = Readable();
- var o = opts == null ? {} : opts;
- if(sheet == null || sheet["!ref"] == null) { stream.push(null); return stream; }
- var r = safe_decode_range(sheet["!ref"]);
- var FS = o.FS !== undefined ? o.FS : ",", fs = FS.charCodeAt(0);
- var RS = o.RS !== undefined ? o.RS : "\n", rs = RS.charCodeAt(0);
- var endregex = new RegExp((FS=="|" ? "\\|" : FS)+"+$");
- var row = "", cols = [];
- o.dense = Array.isArray(sheet);
- var colinfo = o.skipHidden && sheet["!cols"] || [];
- var rowinfo = o.skipHidden && sheet["!rows"] || [];
- for(var C = r.s.c; C <= r.e.c; ++C) if (!((colinfo[C]||{}).hidden)) cols[C] = encode_col(C);
- var R = r.s.r;
- var BOM = false;
- stream._read = function() {
- if(!BOM) { BOM = true; return stream.push("\uFEFF"); }
- while(R <= r.e.r) {
- ++R;
- if ((rowinfo[R-1]||{}).hidden) continue;
- row = make_csv_row(sheet, r, R-1, cols, fs, rs, FS, o);
- if(row != null) {
- if(o.strip) row = row.replace(endregex,"");
- stream.push(row + RS);
- break;
- }
- }
- if(R > r.e.r) return stream.push(null);
- };
- return stream;
- };
-
- var write_html_stream = function(ws, opts) {
- var stream = Readable();
-
- var o = opts || {};
- var header = o.header != null ? o.header : HTML_.BEGIN;
- var footer = o.footer != null ? o.footer : HTML_.END;
- stream.push(header);
- var r = decode_range(ws['!ref']);
- o.dense = Array.isArray(ws);
- stream.push(HTML_._preamble(ws, r, o));
- var R = r.s.r;
- var end = false;
- stream._read = function() {
- if(R > r.e.r) {
- if(!end) { end = true; stream.push("</table>" + footer); }
- return stream.push(null);
- }
- while(R <= r.e.r) {
- stream.push(HTML_._row(ws, r, R, o));
- ++R;
- break;
- }
- };
- return stream;
- };
-
- var write_json_stream = function(sheet, opts) {
- var stream = Readable({objectMode:true});
-
- if(sheet == null || sheet["!ref"] == null) { stream.push(null); return stream; }
- var val = {t:'n',v:0}, header = 0, offset = 1, hdr = [], v=0, vv="";
- var r = {s:{r:0,c:0},e:{r:0,c:0}};
- var o = opts || {};
- var range = o.range != null ? o.range : sheet["!ref"];
- if(o.header === 1) header = 1;
- else if(o.header === "A") header = 2;
- else if(Array.isArray(o.header)) header = 3;
- switch(typeof range) {
- case 'string': r = safe_decode_range(range); break;
- case 'number': r = safe_decode_range(sheet["!ref"]); r.s.r = range; break;
- default: r = range;
- }
- if(header > 0) offset = 0;
- var rr = encode_row(r.s.r);
- var cols = [];
- var counter = 0;
- var dense = Array.isArray(sheet);
- var R = r.s.r, C = 0, CC = 0;
- if(dense && !sheet[R]) sheet[R] = [];
- for(C = r.s.c; C <= r.e.c; ++C) {
- cols[C] = encode_col(C);
- val = dense ? sheet[R][C] : sheet[cols[C] + rr];
- switch(header) {
- case 1: hdr[C] = C - r.s.c; break;
- case 2: hdr[C] = cols[C]; break;
- case 3: hdr[C] = o.header[C - r.s.c]; break;
- default:
- if(val == null) val = {w: "__EMPTY", t: "s"};
- vv = v = format_cell(val, null, o);
- counter = 0;
- for(CC = 0; CC < hdr.length; ++CC) if(hdr[CC] == vv) vv = v + "_" + (++counter);
- hdr[C] = vv;
- }
- }
- R = r.s.r + offset;
- stream._read = function() {
- if(R > r.e.r) return stream.push(null);
- while(R <= r.e.r) {
- //if ((rowinfo[R-1]||{}).hidden) continue;
- var row = make_json_row(sheet, r, R, cols, header, hdr, dense, o);
- ++R;
- if((row.isempty === false) || (header === 1 ? o.blankrows !== false : !!o.blankrows)) {
- stream.push(row.row);
- break;
- }
- }
- };
- return stream;
- };
-
- XLSX.stream = {
- to_json: write_json_stream,
- to_html: write_html_stream,
- to_csv: write_csv_stream
- };
- })();
-
- if(typeof parse_xlscfb !== "undefined") XLSX.parse_xlscfb = parse_xlscfb;
- XLSX.parse_zip = parse_zip;
- XLSX.read = readSync; //xlsread
- XLSX.readFile = readFileSync; //readFile
- XLSX.readFileSync = readFileSync;
- XLSX.write = writeSync;
- XLSX.writeFile = writeFileSync;
- XLSX.writeFileSync = writeFileSync;
- XLSX.writeFileAsync = writeFileAsync;
- XLSX.utils = utils;
- XLSX.SSF = SSF;
- if(typeof CFB !== "undefined") XLSX.CFB = CFB;
- }
- /*global define */
- if(true) make_xlsx_lib(exports);
- else {}
- /*exported XLS, ODS */
- var XLS = XLSX, ODS = XLSX;
-
-
- /***/ })
-
- }]);
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMveGxzeC9kaXN0L2NwZXhjZWwuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL3hsc3gvanN6aXAuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL3hsc3gveGxzeC5qcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7OztBQUFBO0FBQ0E7QUFDQSxlQUFlO0FBQ2YsMkJBQTJCLG1OQUFtTixpRUFBaUUsRUFBRSxvSkFBb0osYUFBYSxZQUFZLE1BQU0sbURBQW1ELG9CQUFvQixFQUFFLFNBQVMscUJBQXFCLEVBQUU7QUFDN2tCLDJCQUEyQixtTkFBbU4saUVBQWlFLEVBQUUsb0pBQW9KLGFBQWEsWUFBWSxNQUFNLG1EQUFtRCxvQkFBb0IsRUFBRSxTQUFTLHFCQUFxQixFQUFFO0FBQzdrQiwyQkFBMkIsbU5BQW1OLGlFQUFpRSxFQUFFLG9KQUFvSixhQUFhLFlBQVksTUFBTSxtREFBbUQsb0JBQW9CLEVBQUUsU0FBUyxxQkFBcUIsRUFBRTtBQUM3a0IsMkJBQTJCLG1OQUFtTixpRUFBaUUsRUFBRSxvSkFBb0osYUFBYSxZQUFZLE1BQU0sbURBQW1ELG9CQUFvQixFQUFFLFNBQVMscUJBQXFCLEVBQUU7QUFDN2tCLDJCQUEyQixtTkFBbU4saUVBQWlFLEVBQUUsb0pBQW9KLGFBQWEsWUFBWSxNQUFNLG1EQUFtRCxvQkFBb0IsRUFBRSxTQUFTLHFCQUFxQixFQUFFO0FBQzdrQiwyQkFBMkIsbU5BQW1OLGlFQUFpRSxFQUFFLG9KQUFvSixhQUFhLFlBQVksTUFBTSxtREFBbUQsb0JBQW9CLEVBQUUsU0FBUyxxQkFBcUIsRUFBRTtBQUM3a0IsMkJBQTJCLG1OQUFtTixpRUFBaUUsRUFBRSxvSkFBb0osYUFBYSxZQUFZLE1BQU0sbURBQW1ELG9CQUFvQixFQUFFLFNBQVMscUJBQXFCLEVBQUU7QUFDN2tCLDJCQUEyQixtTkFBbU4saUVBQWlFLEVBQUUsb0pBQW9KLGFBQWEsWUFBWSxNQUFNLG1EQUFtRCxvQkFBb0IsRUFBRSxTQUFTLHFCQUFxQixFQUFFO0FBQzdrQiwyQkFBMkIsbU5BQW1OLGlFQUFpRSxFQUFFLG9KQUFvSixhQUFhLFlBQVksTUFBTSxtREFBbUQsb0JBQW9CLEVBQUUsU0FBUyxxQkFBcUIsRUFBRTtBQUM3a0IsMkJBQTJCLG1OQUFtTixpRUFBaUUsRUFBRSxvSkFBb0osYUFBYSxZQUFZLE1BQU0sbURBQW1ELG9CQUFvQixFQUFFLFNBQVMscUJBQXFCLEVBQUU7QUFDN2tCLDJCQUEyQixtTkFBbU4saUVBQWlFLEVBQUUsb0pBQW9KLGFBQWEsWUFBWSxNQUFNLG1EQUFtRCxvQkFBb0IsRUFBRSxTQUFTLHFCQUFxQixFQUFFO0FBQzdrQiwyQkFBMkIsbUJBQW1CO0FBQzlDLGlOQUFpTixpRUFBaUUsRUFBRTtBQUNwUixVQUFVLGtCQUFrQiw0Q0FBNEMsb0JBQW9CO0FBQzVGO0FBQ0EsVUFBVSxvQkFBb0IsOENBQThDLDBCQUEwQjtBQUN0RztBQUNBLFVBQVUsb0JBQW9CLDhDQUE4QywwQkFBMEI7QUFDdEc7QUFDQSxVQUFVLG9CQUFvQiw4Q0FBOEMsMEJBQTBCO0FBQ3RHO0FBQ0EsVUFBVSxvQkFBb0IsOENBQThDLDBCQUEwQjtBQUN0RztBQUNBLFVBQVUsb0JBQW9CLDhDQUE4QywwQkFBMEI7QUFDdEc7QUFDQSxVQUFVLG9CQUFvQiw4Q0FBOEMsMEJBQTBCO0FBQ3RHO0FBQ0EsVUFBVSxvQkFBb0IsOENBQThDLDBCQUEwQjtBQUN0RztBQUNBLFVBQVUsb0JBQW9CLDhDQUE4QywwQkFBMEI7QUFDdEc7QUFDQSxVQUFVLG9CQUFvQiw4Q0FBOEMsMEJBQTBCO0FBQ3RHO0FBQ0EsVUFBVSxvQkFBb0IsOENBQThDLDBCQUEwQjtBQUN0RztBQUNBLFVBQVUsb0JBQW9CLDhDQUE4QywwQkFBMEI7QUFDdEc7QUFDQSxVQUFVLG9CQUFvQiw4Q0FBOEMsMEJBQTBCO0FBQ3RHO0FBQ0EsVUFBVSxvQkFBb0IsOENBQThDLDBCQUEwQjtBQUN0RztBQUNBLFVBQVUsb0JBQW9CLDhDQUE4QywwQkFBMEI7QUFDdEc7QUFDQSxVQUFVLG9CQUFvQiw4Q0FBOEMsMEJBQTBCO0FBQ3RHO0FBQ0EsVUFBVSxvQkFBb0IsOENBQThDLDBCQUEwQjtBQUN0RztBQUNBLFVBQVUsb0JBQW9CLDhDQUE4QywwQkFBMEI7QUFDdEc7QUFDQSxVQUFVLG9CQUFvQiw4Q0FBOEMsMEJBQTBCO0FBQ3RHO0FBQ0EsVUFBVSxvQkFBb0IsOENBQThDLDBCQUEwQjtBQUN0RztBQUNBLFVBQVUsb0JBQW9CLDhDQUE4QywwQkFBMEI7QUFDdEc7QUFDQSxVQUFVLG9CQUFvQiw4Q0FBOEMsMEJBQTBCO0FBQ3RHO0FBQ0EsVUFBVSxvQkFBb0IsOENBQThDLDBCQUEwQjtBQUN0RztBQUNBLFVBQVUsb0JBQW9CLDhDQUE4QywwQkFBMEI7QUFDdEc7QUFDQSxVQUFVLG9CQUFvQiw4Q0FBOEMsMEJBQTBCO0FBQ3RHO0FBQ0EsVUFBVSxvQkFBb0IsOENBQThDLDBCQUEwQjtBQUN0RztBQUNBLFVBQVUsb0JBQW9CLDhDQUE4QywwQkFBMEI7QUFDdEc7QUFDQSxVQUFVLG9CQUFvQiw4Q0FBOEMsMEJBQTBCO0FBQ3RHO0FBQ0EsVUFBVSxvQkFBb0IsOENBQThDLDBCQUEwQjtBQUN0RztBQUNBLFVBQVUsb0JBQW9CLDhDQUE4QywwQkFBMEI7QUFDdEc7QUFDQSxVQUFVLG9CQUFvQiw4Q0FBOEMsMEJBQTBCO0FBQ3RHO0FBQ0EsVUFBVSxvQkFBb0IsOENBQThDLDBCQUEwQjtBQUN0RztBQUNBLFVBQVUsb0JBQW9CLDhDQUE4QywwQkFBMEI7QUFDdEc7QUFDQSxVQUFVLG9CQUFvQiw4Q0FBOEMsMEJBQTBCO0FBQ3RHO0FBQ0EsVUFBVSxvQkFBb0IsOENBQThDLDBCQUEwQjtBQUN0RztBQUNBLFVBQVUsb0JBQW9CLDhDQUE4QywwQkFBMEI7QUFDdEc7QUFDQSxVQUFVLG9CQUFvQiw4Q0FBOEMsMEJBQTBCO0FBQ3RHO0FBQ0EsVUFBVSxvQkFBb0IsOENBQThDLDBCQUEwQjtBQUN0RztBQUNBLFVBQVUsb0JBQW9CLDhDQUE4QywwQkFBMEI7QUFDdEc7QUFDQSxVQUFVLG9CQUFvQiw4Q0FBOEMsMEJBQTBCO0FBQ3RHO0FBQ0EsVUFBVSxvQkFBb0IsOENBQThDLDBCQUEwQjtBQUN0RztBQUNBLFVBQVUsb0JBQW9CLDhDQUE4QywwQkFBMEI7QUFDdEc7QUFDQSxVQUFVLG9CQUFvQiw4Q0FBOEMsMEJBQTBCO0FBQ3RHO0FBQ0EsVUFBVSxvQkFBb0IsOENBQThDLDBCQUEwQjtBQUN0RztBQUNBLFVBQVUsb0JBQW9CLDhDQUE4QywwQkFBMEI7QUFDdEc7QUFDQSxVQUFVLG9CQUFvQiw4Q0FBOEMsMEJBQTBCO0FBQ3RHLFFBQVEscUJBQXFCLEVBQUU7QUFDL0IsMkJBQTJCLG1CQUFtQjtBQUM5QyxpTkFBaU4saUVBQWlFLEVBQUU7QUFDcFIsVUFBVSxrQkFBa0IsNENBQTRDLG9CQUFvQjtBQUM1RjtBQUNBLFVBQVUsb0JBQW9CLDhDQUE4QywwQkFBMEI7QUFDdEc7QUFDQSxVQUFVLG9CQUFvQiw4Q0FBOEMsMEJBQTBCO0FBQ3RHO0FBQ0EsVUFBVSxvQkFBb0IsOENBQThDLDBCQUEwQjtBQUN0RztBQUNBLFVBQVUsb0JBQW9CLDhDQUE4QywwQkFBMEI7QUFDdEc7QUFDQSxVQUFVLG9CQUFvQiw4Q0FBOEMsMEJBQTBCO0FBQ3RHO0FBQ0EsVUFBVSxvQkFBb0IsOENBQThDLDBCQUEwQjtBQUN0RztBQUNBLFVBQVUsb0JBQW9CLDhDQUE4QywwQkFBMEI7QUFDdEc7QUFDQSxVQUFVLG9CQUFvQiw4Q0FBOEMsMEJBQTBCO0FBQ3RHO0FBQ0EsVUFBVSxvQkFBb0IsOENBQThDLDBCQUEwQjtBQUN0RztBQUNBLFVBQVUsb0JBQW9CLDhDQUE4QywwQkFBMEI7QUFDdEc7QUFDQSxVQUFVLG9CQUFvQiw4Q0FBOEMsMEJBQTBCO0FBQ3RHO0FBQ0EsVUFBVSxvQkFBb0IsOENBQThDLDBCQUEwQjtBQUN0RztBQUNBLFVBQVUsb0JBQW9CLDhDQUE4QywwQkFBMEI7QUFDdEc7QUFDQSxVQUFVLG9CQUFvQiw4Q0FBOEMsMEJBQTBCO0FBQ3RHO0FBQ0EsVUFBVSxvQkFBb0IsOENBQThDLDBCQUEwQjtBQUN0RztBQUNBLFVBQVUsb0JBQW9CLDhDQUE4QywwQkFBMEI7QUFDdEc7QUFDQSxVQUFVLG9CQUFvQiw4Q0FBOEMsMEJBQTBCO0FBQ3RHO0FBQ0EsVUFBVSxvQkFBb0IsOENBQThDLDBCQUEwQjtBQUN0RztBQUNBLFVBQVUsb0JBQW9CLDhDQUE4QywwQkFBMEI7QUFDdEc7QUFDQSxVQUFVLG9CQUFvQiw4Q0FBOEMsMEJBQTBCO0FBQ3RHO0FBQ0EsVUFBVSxvQkFBb0IsOENBQThDLDBCQUEwQjtBQUN0RztBQUNBLFVBQVUsb0JBQW9CLDhDQUE4QywwQkFBMEI7QUFDdEc7QUFDQSxVQUFVLG9CQUFvQiw4Q0FBOEMsMEJBQTBCO0FBQ3RHO0FBQ0EsVUFBVSxvQkFBb0IsOENBQThDLDBCQUEwQjtBQUN0RztBQUNBLFVBQVUsb0JBQW9CLDhDQUE4QywwQkFBMEI7QUFDdEc7QUFDQSxVQUFVLG9CQUFvQiw4Q0FBOEMsMEJBQTBCO0FBQ3RHO0FBQ0EsVUFBVSxvQkFBb0IsOENBQThDLDBCQUEwQjtBQUN0RztBQUNBLFVBQVUsb0JBQW9CLDhDQUE4QywwQkFBMEI7QUFDdEc7QUFDQSxVQUFVLG9CQUFvQiw4Q0FBOEMsMEJBQTBCO0FBQ3RHO0FBQ0EsVUFBVSxvQkFBb0IsOENBQThDLDBCQUEwQjtBQUN0RztBQUNBLFVBQVUsb0JBQW9CLDhDQUE4QywwQkFBMEI7QUFDdEc7QUFDQSxVQUFVLG9CQUFvQiw4Q0FBOEMsMEJBQTBCO0FBQ3RHO0FBQ0EsVUFBVSxvQkFBb0IsOENBQThDLDBCQUEwQjtBQUN0RztBQUNBLFVBQVUsb0JBQW9CLDhDQUE4QywwQkFBMEI7QUFDdEc7QUFDQSxVQUFVLG9CQUFvQiw4Q0FBOEMsMEJBQTBCO0FBQ3RHO0FBQ0EsVUFBVSxvQkFBb0IsOENBQThDLDBCQUEwQjtBQUN0RztBQUNBLFVBQVUsb0JBQW9CLDhDQUE4QywwQkFBMEI7QUFDdEc7QUFDQSxVQUFVLG9CQUFvQiw4Q0FBOEMsMEJBQTBCO0FBQ3RHO0FBQ0EsVUFBVSxvQkFBb0IsOENBQThDLDBCQUEwQjtBQUN0RztBQUNBLFVBQVUsb0JBQW9CLDhDQUE4QywwQkFBMEI7QUFDdEc7QUFDQSxVQUFVLG9CQUFvQiw4Q0FBOEMsMEJBQTBCO0FBQ3RHO0FBQ0EsVUFBVSxvQkFBb0IsOENBQThDLDBCQUEwQjtBQUN0RztBQUNBLFVBQVUsb0JBQW9CLDhDQUE4QywwQkFBMEI7QUFDdEc7QUFDQSxVQUFVLG9CQUFvQiw4Q0FBOEMsMEJBQTBCO0FBQ3RHO0FBQ0EsVUFBVSxvQkFBb0IsOENBQThDLDBCQUEwQjtBQUN0RztBQUNBLFVBQVUsb0JBQW9CLDhDQUE4QywwQkFBMEI7QUFDdEc7QUFDQSxVQUFVLG9CQUFvQiw4Q0FBOEMsMEJBQTBCO0FBQ3RHO0FBQ0EsVUFBVSxvQkFBb0IsOENBQThDLDBCQUEwQjtBQUN0RztBQUNBLFVBQVUsb0JBQW9CLDhDQUE4QywwQkFBMEI7QUFDdEc7QUFDQSxVQUFVLG9CQUFvQiw4Q0FBOEMsMEJBQTBCO0FBQ3RHO0FBQ0EsVUFBVSxvQkFBb0IsOENBQThDLDBCQUEwQjtBQUN0RztBQUNBLFVBQVUsb0JBQW9CLDhDQUE4QywwQkFBMEI7QUFDdEc7QUFDQSxVQUFVLG9CQUFvQiw4Q0FBOEMsMEJBQTBCO0FBQ3RHO0FBQ0EsVUFBVSxvQkFBb0IsOENBQThDLDBCQUEwQjtBQUN0RztBQUNBLFVBQVUsb0JBQW9CLDhDQUE4QywwQkFBMEI7QUFDdEc7QUFDQSxVQUFVLG9CQUFvQiw4Q0FBOEMsMEJBQTBCO0FBQ3RHO0FBQ0EsVUFBVSxvQkFBb0IsOENBQThDLDBCQUEwQjtBQUN0RztBQUNBLFVBQVUsb0JBQW9CLDhDQUE4QywwQkFBMEI7QUFDdEc7QUFDQSxVQUFVLG9CQUFvQiw4Q0FBOEMsMEJBQTBCO0FBQ3RHO0FBQ0EsVUFBVSxvQkFBb0IsOENBQThDLDBCQUEwQjtBQUN0RztBQUNBLFVBQVUsb0JBQW9CLDhDQUE4QywwQkFBMEI7QUFDdEc7QUFDQSxVQUFVLG9CQUFvQiw4Q0FBOEMsMEJBQTBCO0FBQ3RHO0FBQ0EsVUFBVSxvQkFBb0IsOENBQThDLDBCQUEwQjtBQUN0RztBQUNBLFVBQVUsb0JBQW9CLDhDQUE4QywwQkFBMEI7QUFDdEc7QUFDQSxVQUFVLG9CQUFvQiw4Q0FBOEMsMEJBQTBCO0FBQ3RHO0FBQ0EsVUFBVSxvQkFBb0IsOENBQThDLDBCQUEwQjtBQUN0RztBQUNBLFVBQVUsb0JBQW9CLDhDQUE4QywwQkFBMEI7QUFDdEc7QUFDQSxVQUFVLG9CQUFvQiw4Q0FBOEMsMEJBQTBCO0FBQ3RHO0FBQ0EsVUFBVSxvQkFBb0IsOENBQThDLDBCQUEwQjtBQUN0RztBQUNBLFVBQVUsb0JBQW9CLDhDQUE4QywwQkFBMEI7QUFDdEc7QUFDQSxVQUFVLG9CQUFvQiw4Q0FBOEMsMEJBQTBCO0FBQ3RHO0FBQ0EsVUFBVSxvQkFBb0IsOENBQThDLDBCQUEwQjtBQUN0RztBQUNBLFVBQVUsb0JBQW9CLDhDQUE4QywwQkFBMEI7QUFDdEc7QUFDQSxVQUFVLG9CQUFvQiw4Q0FBOEMsMEJBQTBCO0FBQ3RHO0FBQ0EsVUFBVSxvQkFBb0IsOENBQThDLDBCQUEwQjtBQUN0RztBQUNBLFVBQVUsb0JBQW9CLDhDQUE4QywwQkFBMEI7QUFDdEc7QUFDQSxVQUFVLG9CQUFvQiw4Q0FBOEMsMEJBQTBCO0FBQ3RHO0FBQ0EsVUFBVSxvQkFBb0IsOENBQThDLDBCQUEwQjtBQUN0RztBQUNBLFVBQVUsb0JBQW9CLDhDQUE4QywwQkFBMEI7QUFDdEc7QUFDQSxVQUFVLG9CQUFvQiw4Q0FBOEMsMEJBQTBCO0FBQ3RHO0FBQ0EsVUFBVSxvQkFBb0IsOENBQThDLDBCQUEwQjtBQUN0RztBQUNBLFVBQVUsb0JBQW9CLDhDQUE4QywwQkFBMEI7QUFDdEc7QUFDQSxVQUFVLG9CQUFvQiw4Q0FBOEMsMEJBQTBCO0FBQ3RHO0FBQ0EsVUFBVSxvQkFBb0IsOENBQThDLDBCQUEwQjtBQUN0RztBQUNBLFVBQVUsb0JBQW9CLDhDQUE4QywwQkFBMEI7QUFDdEc7QUFDQSxVQUFVLG9CQUFvQiw4Q0FBOEMsMEJBQTBCO0FBQ3RHO0FBQ0EsVUFBVSxvQkFBb0IsOENBQThDLDBCQUEwQjtBQUN0RztBQUNBLFVBQVUsb0JBQW9CLDhDQUE4QywwQkFBMEI7QUFDdEc7QUFDQSxVQUFVLG9CQUFvQiw4Q0FBOEMsMEJBQTBCO0FBQ3RHO0FBQ0EsVUFBVSxvQkFBb0IsOENBQThDLDBCQUEwQjtBQUN0RztBQUNBLFVBQVUsb0JBQW9CLDhDQUE4QywwQkFBMEI7QUFDdEc7QUFDQSxVQUFVLG9CQUFvQiw4Q0FBOEMsMEJBQTBCO0FBQ3RHO0FBQ0EsVUFBVSxvQkFBb0IsOENBQThDLDBCQUEwQjtBQUN0RztBQUNBLFVBQVUsb0JBQW9CLDhDQUE4QywwQkFBMEI7QUFDdEc7QUFDQSxVQUFVLG9CQUFvQiw4Q0FBOEMsMEJBQTBCO0FBQ3RHO0FBQ0EsVUFBVSxvQkFBb0IsOENBQThDLDBCQUEwQjtBQUN0RztBQUNBLFVBQVUsb0JBQW9CLDhDQUE4QywwQkFBMEI7QUFDdEc7QUFDQSxVQUFVLG9CQUFvQiw4Q0FBOEMsMEJBQTBCO0FBQ3RHO0FBQ0EsVUFBVSxvQkFBb0IsOENBQThDLDBCQUEwQjtBQUN0RztBQUNBLFVBQVUsb0JBQW9CLDhDQUE4QywwQkFBMEI7QUFDdEc7QUFDQSxVQUFVLG9CQUFvQiw4Q0FBOEMsMEJBQTBCO0FBQ3RHO0FBQ0EsVUFBVSxvQkFBb0IsOENBQThDLDBCQUEwQjtBQUN0RztBQUNBLFVBQVUsb0JBQW9CLDhDQUE4QywwQkFBMEI7QUFDdEc7QUFDQSxVQUFVLG9CQUFvQiw4Q0FBOEMsMEJBQTBCO0FBQ3RHO0FBQ0EsVUFBVSxvQkFBb0IsOENBQThDLDBCQUEwQjtBQUN0RztBQUNBLFVBQVUsb0JBQW9CLDhDQUE4QywwQkFBMEI7QUFDdEc7QUFDQSxVQUFVLG9CQUFvQiw4Q0FBOEMsMEJBQTBCO0FBQ3RHO0FBQ0EsVUFBVSxvQkFBb0IsOENBQThDLDBCQUEwQjtBQUN0RztBQUNBLFVBQVUsb0JBQW9CLDhDQUE4QywwQkFBMEI7QUFDdEc7QUFDQSxVQUFVLG9CQUFvQiw4Q0FBOEMsMEJBQTBCO0FBQ3RHO0FBQ0EsVUFBVSxvQkFBb0IsOENBQThDLDBCQUEwQjtBQUN0RztBQUNBLFVBQVUsb0JBQW9CLDhDQUE4QywwQkFBMEI7QUFDdEc7QUFDQSxVQUFVLG9CQUFvQiw4Q0FBOEMsMEJBQTBCO0FBQ3RHO0FBQ0EsVUFBVSxvQkFBb0IsOENBQThDLDBCQUEwQjtBQUN0RztBQUNBLFVBQVUsb0JBQW9CLDhDQUE4QywwQkFBMEI7QUFDdEc7QUFDQSxVQUFVLG9CQUFvQiw4Q0FBOEMsMEJBQTBCO0FBQ3RHO0FBQ0EsVUFBVSxvQkFBb0IsOENBQThDLDBCQUEwQjtBQUN0RztBQUNBLFVBQVUsb0JBQW9CLDhDQUE4QywwQkFBMEI7QUFDdEc7QUFDQSxVQUFVLG9CQUFvQiw4Q0FBOEMsMEJBQTBCO0FBQ3RHO0FBQ0EsVUFBVSxvQkFBb0IsOENBQThDLDBCQUEwQjtBQUN0RztBQUNBLFVBQVUsb0JBQW9CLDhDQUE4QywwQkFBMEI7QUFDdEc7QUFDQSxVQUFVLG9CQUFvQiw4Q0FBOEMsMEJBQTBCO0FBQ3RHO0FBQ0EsVUFBVSxvQkFBb0IsOENBQThDLDBCQUEwQjtBQUN0RztBQUNBLFVBQVUsb0JBQW9CLDhDQUE4QywwQkFBMEI7QUFDdEc7QUFDQSxVQUFVLG9CQUFvQiw4Q0FBOEMsMEJBQTBCO0FBQ3RHO0FBQ0EsVUFBVSxvQkFBb0IsOENBQThDLDBCQUEwQjtBQUN0RyxRQUFRLHFCQUFxQixFQUFFO0FBQy9CLDJCQUEyQixtQkFBbUI7QUFDOUMsaU5BQWlOLGlFQUFpRSxFQUFFO0FBQ3BSLFVBQVUsa0JBQWtCLDRDQUE0QyxvQkFBb0I7QUFDNUY7QUFDQSxVQUFVLG9CQUFvQiw4Q0FBOEMsMEJBQTBCO0FBQ3RHO0FBQ0EsVUFBVSxvQkFBb0IsOENBQThDLDBCQUEwQjtBQUN0RztBQUNBLFVBQVUsb0JBQW9CLDhDQUE4QywwQkFBMEI7QUFDdEc7QUFDQSxVQUFVLG9CQUFvQiw4Q0FBOEMsMEJBQTBCO0FBQ3RHO0FBQ0EsVUFBVSxvQkFBb0IsOENBQThDLDBCQUEwQjtBQUN0RztBQUNBLFVBQVUsb0JBQW9CLDhDQUE4QywwQkFBMEI7QUFDdEc7QUFDQSxVQUFVLG9CQUFvQiw4Q0FBOEMsMEJBQTBCO0FBQ3RHO0FBQ0EsVUFBVSxvQkFBb0IsOENBQThDLDBCQUEwQjtBQUN0RztBQUNBLFVBQVUsb0JBQW9CLDhDQUE4QywwQkFBMEI7QUFDdEc7QUFDQSxVQUFVLG9CQUFvQiw4Q0FBOEMsMEJBQTBCO0FBQ3RHO0FBQ0EsVUFBVSxvQkFBb0IsOENBQThDLDBCQUEwQjtBQUN0RztBQUNBLFVBQVUsb0JBQW9CLDhDQUE4QywwQkFBMEI7QUFDdEc7QUFDQSxVQUFVLG9CQUFvQiw4Q0FBOEMsMEJBQTBCO0FBQ3RHO0FBQ0EsVUFBVSxvQkFBb0IsOENBQThDLDBCQUEwQjtBQUN0RztBQUNBLFVBQVUsb0JBQW9CLDhDQUE4QywwQkFBMEI7QUFDdEc7QUFDQSxVQUFVLG9CQUFvQiw4Q0FBOEMsMEJBQTBCO0FBQ3RHO0FBQ0EsVUFBVSxvQkFBb0IsOENBQThDLDBCQUEwQjtBQUN0RztBQUNBLFVBQVUsb0JBQW9CLDhDQUE4QywwQkFBMEI7QUFDdEc7QUFDQSxVQUFVLG9CQUFvQiw4Q0FBOEMsMEJBQTBCO0FBQ3RHO0FBQ0EsVUFBVSxvQkFBb0IsOENBQThDLDBCQUEwQjtBQUN0RztBQUNBLFVBQVUsb0JBQW9CLDhDQUE4QywwQkFBMEI7QUFDdEc7QUFDQSxVQUFVLG9CQUFvQiw4Q0FBOEMsMEJBQTBCO0FBQ3RHO0FBQ0EsVUFBVSxvQkFBb0IsOENBQThDLDBCQUEwQjtBQUN0RztBQUNBLFVBQVUsb0JBQW9CLDhDQUE4QywwQkFBMEI7QUFDdEc7QUFDQSxVQUFVLG9CQUFvQiw4Q0FBOEMsMEJBQTBCO0FBQ3RHO0FBQ0EsVUFBVSxvQkFBb0IsOENBQThDLDBCQUEwQjtBQUN0RztBQUNBLFVBQVUsb0JBQW9CLDhDQUE4QywwQkFBMEI7QUFDdEc7QUFDQSxVQUFVLG9CQUFvQiw4Q0FBOEMsMEJBQTBCO0FBQ3RHO0FBQ0EsVUFBVSxvQkFBb0IsOENBQThDLDBCQUEwQjtBQUN0RztBQUNBLFVBQVUsb0JBQW9CLDhDQUE4QywwQkFBMEI7QUFDdEc7QUFDQSxVQUFVLG9CQUFvQiw4Q0FBOEMsMEJBQTBCO0FBQ3RHO0FBQ0EsVUFBVSxvQkFBb0IsOENBQThDLDBCQUEwQjtBQUN0RztBQUNBLFVBQVUsb0JBQW9CLDhDQUE4QywwQkFBMEI7QUFDdEc7QUFDQSxVQUFVLG9CQUFvQiw4Q0FBOEMsMEJBQTBCO0FBQ3RHO0FBQ0EsVUFBVSxvQkFBb0IsOENBQThDLDBCQUEwQjtBQUN0RztBQUNBLFVBQVUsb0JBQW9CLDhDQUE4QywwQkFBMEI7QUFDdEc7QUFDQSxVQUFVLG9CQUFvQiw4Q0FBOEMsMEJBQTBCO0FBQ3RHO0FBQ0EsVUFBVSxvQkFBb0IsOENBQThDLDBCQUEwQjtBQUN0RztBQUNBLFVBQVUsb0JBQW9CLDhDQUE4QywwQkFBMEI7QUFDdEc7QUFDQSxVQUFVLG9CQUFvQiw4Q0FBOEMsMEJBQTBCO0FBQ3RHO0FBQ0EsVUFBVSxvQkFBb0IsOENBQThDLDBCQUEwQjtBQUN0RztBQUNBLFVBQVUsb0JBQW9CLDhDQUE4QywwQkFBMEI7QUFDdEc7QUFDQSxVQUFVLG9CQUFvQiw4Q0FBOEMsMEJBQTBCO0FBQ3RHO0FBQ0EsVUFBVSxvQkFBb0IsOENBQThDLDBCQUEwQjtBQUN0RztBQUNBLFVBQVUsb0JBQW9CLDhDQUE4QywwQkFBMEI7QUFDdEc7QUFDQSxVQUFVLG9CQUFvQiw4Q0FBOEMsMEJBQTBCO0FBQ3RHO0FBQ0EsVUFBVSxvQkFBb0IsOENBQThDLDBCQUEwQjtBQUN0RztBQUNBLFVBQVUsb0JBQW9CLDhDQUE4QywwQkFBMEI7QUFDdEc7QUFDQSxVQUFVLG9CQUFvQiw4Q0FBOEMsMEJBQTBCO0FBQ3RHO0FBQ0EsVUFBVSxvQkFBb0IsOENBQThDLDBCQUEwQjtBQUN0RztBQUNBLFVBQVUsb0JBQW9CLDhDQUE4QywwQkFBMEI7QUFDdEc7QUFDQSxVQUFVLG9CQUFvQiw4Q0FBOEMsMEJBQTBCO0FBQ3RHO0FBQ0EsVUFBVSxvQkFBb0IsOENBQThDLDBCQUEwQjtBQUN0RztBQUNBLFVBQVUsb0JBQW9CLDhDQUE4QywwQkFBMEI7QUFDdEc7QUFDQSxVQUFVLG9CQUFvQiw4Q0FBOEMsMEJBQTBCO0FBQ3RHO0FBQ0EsVUFBVSxvQkFBb0IsOENBQThDLDBCQUEwQjtBQUN0RztBQUNBLFVBQVUsb0JBQW9CLDhDQUE4QywwQkFBMEI7QUFDdEc7QUFDQSxVQUFVLG9CQUFvQiw4Q0FBOEMsMEJBQTBCO0FBQ3RHO0FBQ0EsVUFBVSxvQkFBb0IsOENBQThDLDBCQUEwQjtBQUN0RztBQUNBLFVBQVUsb0JBQW9CLDhDQUE4QywwQkFBMEI7QUFDdEc7QUFDQSxVQUFVLG9CQUFvQiw4Q0FBOEMsMEJBQTBCO0FBQ3RHO0FBQ0EsVUFBVSxvQkFBb0IsOENBQThDLDBCQUEwQjtBQUN0RztBQUNBLFVBQVUsb0JBQW9CLDhDQUE4QywwQkFBMEI7QUFDdEc7QUFDQSxVQUFVLG9CQUFvQiw4Q0FBOEMsMEJBQTBCO0FBQ3RHO0FBQ0EsVUFBVSxvQkFBb0IsOENBQThDLDBCQUEwQjtBQUN0RztBQUNBLFVBQVUsb0JBQW9CLDhDQUE4QywwQkFBMEI7QUFDdEc7QUFDQSxVQUFVLG9CQUFvQiw4Q0FBOEMsMEJBQTBCO0FBQ3RHO0FBQ0EsVUFBVSxvQkFBb0IsOENBQThDLDBCQUEwQjtBQUN0RztBQUNBLFVBQVUsb0JBQW9CLDhDQUE4QywwQkFBMEI7QUFDdEc7QUFDQSxVQUFVLG9CQUFvQiw4Q0FBOEMsMEJBQTBCO0FBQ3RHO0FBQ0EsVUFBVSxvQkFBb0IsOENBQThDLDBCQUEwQjtBQUN0RztBQUNBLFVBQVUsb0JBQW9CLDhDQUE4QywwQkFBMEI7QUFDdEc7QUFDQSxVQUFVLG9CQUFvQiw4Q0FBOEMsMEJBQTBCO0FBQ3RHO0FBQ0EsVUFBVSxvQkFBb0IsOENBQThDLDBCQUEwQjtBQUN0RztBQUNBLFVBQVUsb0JBQW9CLDhDQUE4QywwQkFBMEI7QUFDdEc7QUFDQSxVQUFVLG9CQUFvQiw4Q0FBOEMsMEJBQTBCO0FBQ3RHO0FBQ0EsVUFBVSxvQkFBb0IsOENBQThDLDBCQUEwQjtBQUN0RztBQUNBLFVBQVUsb0JBQW9CLDhDQUE4QywwQkFBMEI7QUFDdEc7QUFDQSxVQUFVLG9CQUFvQiw4Q0FBOEMsMEJBQTBCO0FBQ3RHO0FBQ0EsVUFBVSxvQkFBb0IsOENBQThDLDBCQUEwQjtBQUN0RztBQUNBLFVBQVUsb0JBQW9CLDhDQUE4QywwQkFBMEI7QUFDdEc7QUFDQSxVQUFVLG9CQUFvQiw4Q0FBOEMsMEJBQTBCO0FBQ3RHO0FBQ0EsVUFBVSxvQkFBb0IsOENBQThDLDBCQUEwQjtBQUN0RztBQUNBLFVBQVUsb0JBQW9CLDhDQUE4QywwQkFBMEI7QUFDdEc7QUFDQSxVQUFVLG9CQUFvQiw4Q0FBOEMsMEJBQTBCO0FBQ3RHO0FBQ0EsVUFBVSxvQkFBb0IsOENBQThDLDBCQUEwQjtBQUN0RztBQUNBLFVBQVUsb0JBQW9CLDhDQUE4QywwQkFBMEI7QUFDdEc7QUFDQSxVQUFVLG9CQUFvQiw4Q0FBOEMsMEJBQTBCO0FBQ3RHO0FBQ0EsVUFBVSxvQkFBb0IsOENBQThDLDBCQUEwQjtBQUN0RztBQUNBLFVBQVUsb0JBQW9CLDhDQUE4QywwQkFBMEI7QUFDdEc7QUFDQSxVQUFVLG9CQUFvQiw4Q0FBOEMsMEJBQTBCO0FBQ3RHO0FBQ0EsVUFBVSxvQkFBb0IsOENBQThDLDBCQUEwQjtBQUN0RztBQUNBLFVBQVUsb0JBQW9CLDhDQUE4QywwQkFBMEI7QUFDdEc7QUFDQSxVQUFVLG9CQUFvQiw4Q0FBOEMsMEJBQTBCO0FBQ3RHO0FBQ0EsVUFBVSxvQkFBb0IsOENBQThDLDBCQUEwQjtBQUN0RztBQUNBLFVBQVUsb0JBQW9CLDhDQUE4QywwQkFBMEI7QUFDdEc7QUFDQSxVQUFVLG9CQUFvQiw4Q0FBOEMsMEJBQTBCO0FBQ3RHO0FBQ0EsVUFBVSxvQkFBb0IsOENBQThDLDBCQUEwQjtBQUN0RztBQUNBLFVBQVUsb0JBQW9CLDhDQUE4QywwQkFBMEI7QUFDdEc7QUFDQSxVQUFVLG9CQUFvQiw4Q0FBOEMsMEJBQTBCO0FBQ3RHO0FBQ0EsVUFBVSxvQkFBb0IsOENBQThDLDBCQUEwQjtBQUN0RztBQUNBLFVBQVUsb0JBQW9CLDhDQUE4QywwQkFBMEI7QUFDdEc7QUFDQSxVQUFVLG9CQUFvQiw4Q0FBOEMsMEJBQTBCO0FBQ3RHO0FBQ0EsVUFBVSxvQkFBb0IsOENBQThDLDBCQUEwQjtBQUN0RztBQUNBLFVBQVUsb0JBQW9CLDhDQUE4QywwQkFBMEI7QUFDdEc7QUFDQSxVQUFVLG9CQUFvQiw4Q0FBOEMsMEJBQTBCO0FBQ3RHO0FBQ0EsVUFBVSxvQkFBb0IsOENBQThDLDBCQUEwQjtBQUN0RztBQUNBLFVBQVUsb0JBQW9CLDhDQUE4QywwQkFBMEI7QUFDdEc7QUFDQSxVQUFVLG9CQUFvQiw4Q0FBOEMsMEJBQTBCO0FBQ3RHO0FBQ0EsVUFBVSxvQkFBb0IsOENBQThDLDBCQUEwQjtBQUN0RztBQUNBLFVBQVUsb0JBQW9CLDhDQUE4QywwQkFBMEI7QUFDdEc7QUFDQSxVQUFVLG9CQUFvQiw4Q0FBOEMsMEJBQTBCO0FBQ3RHO0FBQ0EsVUFBVSxvQkFBb0IsOENBQThDLDBCQUEwQjtBQUN0RztBQUNBLFVBQVUsb0JBQW9CLDhDQUE4QywwQkFBMEI7QUFDdEc7QUFDQSxVQUFVLG9CQUFvQiw4Q0FBOEMsMEJBQTBCO0FBQ3RHO0FBQ0EsVUFBVSxvQkFBb0IsOENBQThDLDBCQUEwQjtBQUN0RztBQUNBLFVBQVUsb0JBQW9CLDhDQUE4QywwQkFBMEI7QUFDdEc7QUFDQSxVQUFVLG9CQUFvQiw4Q0FBOEMsMEJBQTBCO0FBQ3RHO0FBQ0EsVUFBVSxvQkFBb0IsOENBQThDLDBCQUEwQjtBQUN0RztBQUNBLFVBQVUsb0JBQW9CLDhDQUE4QywwQkFBMEI7QUFDdEc7QUFDQSxVQUFVLG9CQUFvQiw4Q0FBOEMsMEJBQTBCO0FBQ3RHO0FBQ0EsVUFBVSxvQkFBb0IsOENBQThDLDBCQUEwQjtBQUN0RztBQUNBLFVBQVUsb0JBQW9CLDhDQUE4QywwQkFBMEI7QUFDdEc7QUFDQSxVQUFVLG9CQUFvQiw4Q0FBOEMsMEJBQTBCO0FBQ3RHLFFBQVEscUJBQXFCLEVBQUU7QUFDL0IsMkJBQTJCLG1CQUFtQjtBQUM5QyxpTkFBaU4saUVBQWlFLEVBQUU7QUFDcFIsVUFBVSxrQkFBa0IsNENBQTRDLG9CQUFvQjtBQUM1RjtBQUNBLFVBQVUsb0JBQW9CLDhDQUE4QywwQkFBMEI7QUFDdEc7QUFDQSxVQUFVLG9CQUFvQiw4Q0FBOEMsMEJBQTBCO0FBQ3RHO0FBQ0EsVUFBVSxvQkFBb0IsOENBQThDLDBCQUEwQjtBQUN0RztBQUNBLFVBQVUsb0JBQW9CLDhDQUE4QywwQkFBMEI7QUFDdEc7QUFDQSxVQUFVLG9CQUFvQiw4Q0FBOEMsMEJBQTBCO0FBQ3RHO0FBQ0EsVUFBVSxvQkFBb0IsOENBQThDLDBCQUEwQjtBQUN0RztBQUNBLFVBQVUsb0JBQW9CLDhDQUE4QywwQkFBMEI7QUFDdEc7QUFDQSxVQUFVLG9CQUFvQiw4Q0FBOEMsMEJBQTBCO0FBQ3RHO0FBQ0EsVUFBVSxvQkFBb0IsOENBQThDLDBCQUEwQjtBQUN0RztBQUNBLFVBQVUsb0JBQW9CLDhDQUE4QywwQkFBMEI7QUFDdEc7QUFDQSxVQUFVLG9CQUFvQiw4Q0FBOEMsMEJBQTBCO0FBQ3RHO0FBQ0EsVUFBVSxvQkFBb0IsOENBQThDLDBCQUEwQjtBQUN0RztBQUNBLFVBQVUsb0JBQW9CLDhDQUE4QywwQkFBMEI7QUFDdEc7QUFDQSxVQUFVLG9CQUFvQiw4Q0FBOEMsMEJBQTBCO0FBQ3RHO0FBQ0EsVUFBVSxvQkFBb0IsOENBQThDLDBCQUEwQjtBQUN0RztBQUNBLFVBQVUsb0JBQW9CLDhDQUE4QywwQkFBMEI7QUFDdEc7QUFDQSxVQUFVLG9CQUFvQiw4Q0FBOEMsMEJBQTBCO0FBQ3RHO0FBQ0EsVUFBVSxvQkFBb0IsOENBQThDLDBCQUEwQjtBQUN0RztBQUNBLFVBQVUsb0JBQW9CLDhDQUE4QywwQkFBMEI7QUFDdEc7QUFDQSxVQUFVLG9CQUFvQiw4Q0FBOEMsMEJBQTBCO0FBQ3RHO0FBQ0EsVUFBVSxvQkFBb0IsOENBQThDLDBCQUEwQjtBQUN0RztBQUNBLFVBQVUsb0JBQW9CLDhDQUE4QywwQkFBMEI7QUFDdEc7QUFDQSxVQUFVLG9CQUFvQiw4Q0FBOEMsMEJBQTBCO0FBQ3RHO0FBQ0EsVUFBVSxvQkFBb0IsOENBQThDLDBCQUEwQjtBQUN0RztBQUNBLFVBQVUsb0JBQW9CLDhDQUE4QywwQkFBMEI7QUFDdEc7QUFDQSxVQUFVLG9CQUFvQiw4Q0FBOEMsMEJBQTBCO0FBQ3RHO0FBQ0EsVUFBVSxvQkFBb0IsOENBQThDLDBCQUEwQjtBQUN0RztBQUNBLFVBQVUsb0JBQW9CLDhDQUE4QywwQkFBMEI7QUFDdEc7QUFDQSxVQUFVLG9CQUFvQiw4Q0FBOEMsMEJBQTBCO0FBQ3RHO0FBQ0EsVUFBVSxvQkFBb0IsOENBQThDLDBCQUEwQjtBQUN0RztBQUNBLFVBQVUsb0JBQW9CLDhDQUE4QywwQkFBMEI7QUFDdEc7QUFDQSxVQUFVLG9CQUFvQiw4Q0FBOEMsMEJBQTBCO0FBQ3RHO0FBQ0EsVUFBVSxvQkFBb0IsOENBQThDLDBCQUEwQjtBQUN0RztBQUNBLFVBQVUsb0JBQW9CLDhDQUE4QywwQkFBMEI7QUFDdEc7QUFDQSxVQUFVLG9CQUFvQiw4Q0FBOEMsMEJBQTBCO0FBQ3RHO0FBQ0EsVUFBVSxvQkFBb0IsOENBQThDLDBCQUEwQjtBQUN0RztBQUNBLFVBQVUsb0JBQW9CLDhDQUE4QywwQkFBMEI7QUFDdEc7QUFDQSxVQUFVLG9CQUFvQiw4Q0FBOEMsMEJBQTBCO0FBQ3RHO0FBQ0EsVUFBVSxvQkFBb0IsOENBQThDLDBCQUEwQjtBQUN0RztBQUNBLFVBQVUsb0JBQW9CLDhDQUE4QywwQkFBMEI7QUFDdEc7QUFDQSxVQUFVLG9CQUFvQiw4Q0FBOEMsMEJBQTBCO0FBQ3RHO0FBQ0EsVUFBVSxvQkFBb0IsOENBQThDLDBCQUEwQjtBQUN0RztBQUNBLFVBQVUsb0JBQW9CLDhDQUE4QywwQkFBMEI7QUFDdEc7QUFDQSxVQUFVLG9CQUFvQiw4Q0FBOEMsMEJBQTBCO0FBQ3RHO0FBQ0EsVUFBVSxvQkFBb0IsOENBQThDLDBCQUEwQjtBQUN0RztBQUNBLFVBQVUsb0JBQW9CLDhDQUE4QywwQkFBMEI7QUFDdEc7QUFDQSxVQUFVLG9CQUFvQiw4Q0FBOEMsMEJBQTBCO0FBQ3RHO0FBQ0EsVUFBVSxvQkFBb0IsOENBQThDLDBCQUEwQjtBQUN0RztBQUNBLFVBQVUsb0JBQW9CLDhDQUE4QywwQkFBMEI7QUFDdEc7QUFDQSxVQUFVLG9CQUFvQiw4Q0FBOEMsMEJBQTBCO0FBQ3RHO0FBQ0EsVUFBVSxvQkFBb0IsOENBQThDLDBCQUEwQjtBQUN0RztBQUNBLFVBQVUsb0JBQW9CLDhDQUE4QywwQkFBMEI7QUFDdEc7QUFDQSxVQUFVLG9CQUFvQiw4Q0FBOEMsMEJBQTBCO0FBQ3RHO0FBQ0EsVUFBVSxvQkFBb0IsOENBQThDLDBCQUEwQjtBQUN0RztBQUNBLFVBQVUsb0JBQW9CLDhDQUE4QywwQkFBMEI7QUFDdEc7QUFDQSxVQUFVLG9CQUFvQiw4Q0FBOEMsMEJBQTBCO0FBQ3RHO0FBQ0EsVUFBVSxvQkFBb0IsOENBQThDLDBCQUEwQjtBQUN0RztBQUNBLFVBQVUsb0JBQW9CLDhDQUE4QywwQkFBMEI7QUFDdEc7QUFDQSxVQUFVLG9CQUFvQiw4Q0FBOEMsMEJBQTBCO0FBQ3RHO0FBQ0EsVUFBVSxvQkFBb0IsOENBQThDLDBCQUEwQjtBQUN0RztBQUNBLFVBQVUsb0JBQW9CLDhDQUE4QywwQkFBMEI7QUFDdEc7QUFDQSxVQUFVLG9CQUFvQiw4Q0FBOEMsMEJBQTBCO0FBQ3RHO0FBQ0EsVUFBVSxvQkFBb0IsOENBQThDLDBCQUEwQjtBQUN0RztBQUNBLFVBQVUsb0JBQW9CLDhDQUE4QywwQkFBMEI7QUFDdEc7QUFDQSxVQUFVLG9CQUFvQiw4Q0FBOEMsMEJBQTBCO0FBQ3RHO0FBQ0EsVUFBVSxvQkFBb0IsOENBQThDLDBCQUEwQjtBQUN0RztBQUNBLFVBQVUsb0JBQW9CLDhDQUE4QywwQkFBMEI7QUFDdEc7QUFDQSxVQUFVLG9CQUFvQiw4Q0FBOEMsMEJBQTBCO0FBQ3RHO0FBQ0EsVUFBVSxvQkFBb0IsOENBQThDLDBCQUEwQjtBQUN0RztBQUNBLFVBQVUsb0JBQW9CLDhDQUE4QywwQkFBMEI7QUFDdEc7QUFDQSxVQUFVLG9CQUFvQiw4Q0FBOEMsMEJBQTBCO0FBQ3RHO0FBQ0EsVUFBVSxvQkFBb0IsOENBQThDLDBCQUEwQjtBQUN0RztBQUNBLFVBQVUsb0JBQW9CLDhDQUE4QywwQkFBMEI7QUFDdEc7QUFDQSxVQUFVLG9CQUFvQiw4Q0FBOEMsMEJBQTBCO0FBQ3RHO0FBQ0EsVUFBVSxvQkFBb0IsOENBQThDLDBCQUEwQjtBQUN0RztBQUNBLFVBQVUsb0JBQW9CLDhD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RztBQUNBLFVBQVUsb0JBQW9CLDhDQUE4QywwQkFBMEI7QUFDdEc7QUFDQSxVQUFVLG9CQUFvQiw4Q0FBOEMsMEJBQTBCO0FBQ3RHO0FBQ0EsVUFBVSxvQkFBb0IsOENBQThDLDBCQUEwQjtBQUN0RztBQUNBLFVBQVUsb0JBQW9CLDhDQUE4QywwQkFBMEI7QUFDdEc7QUFDQSxVQUFVLG9CQUFvQiw4Q0FBOEMsMEJBQTBCO0FBQ3RHO0FBQ0EsVUFBVSxvQkFBb0IsOENBQThDLDBCQUEwQjtBQUN0RztBQUNBLFVBQVUsb0JBQW9CLDhDQUE4QywwQkFBMEI7QUFDdEc7QUFDQSxVQUFVLG9CQUFvQiw4Q0FBOEMsMEJBQTBCO0FBQ3RHO0FBQ0EsVUFBVSxvQkFBb0IsOENBQThDLDBCQUEwQjtBQUN0RztBQUNBLFVBQVUsb0JBQW9CLDhDQUE4QywwQkFBMEI7QUFDdEc7QUFDQSxVQUFVLG9CQUFvQiw4Q0FBOEMsMEJBQTBCO0FBQ3RHO0FBQ0EsVUFBVSxvQkFBb0IsOENBQThDLDBCQUEwQjtBQUN0RztBQUNBLFVBQVUsb0JBQW9CLDhDQUE4QywwQkFBMEI7QUFDdEc7QUFDQSxVQUFVLG9CQUFvQiw4Q0FBOEMsMEJBQTBCO0FBQ3RHO0FBQ0EsVUFBVSxvQkFBb0IsOENBQThDLDBCQUEwQjtBQUN0RztBQUNBLFVBQVUsb0JBQW9CLDhDQUE4QywwQkFBMEI7QUFDdEc7QUFDQSxVQUFVLG9CQUFvQiw4Q0FBOEMsMEJBQTBCO0FBQ3RHO0FBQ0EsVUFBVSxvQkFBb0IsOENBQThDLDBCQUEwQjtBQUN0RztBQUNBLFVBQVUsb0JBQW9CLDhDQUE4QywwQkFBMEI7QUFDdEc7QUFDQSxVQUFVLG9CQUFvQiw4Q0FBOEMsMEJBQTBCO0FBQ3RHO0FBQ0EsVUFBVSxvQkFBb0IsOENBQThDLDBCQUEwQjtBQUN0RztBQUNBLFVBQVUsb0JBQW9CLDhDQUE4QywwQkFBMEI7QUFDdEc7QUFDQSxVQUFVLG9CQUFvQiw4Q0FBOEMsMEJBQTBCO0FBQ3RHO0FBQ0EsVUFBVSxvQkFBb0IsOENBQThDLDBCQUEwQjtBQUN0RztBQUNBLFVBQVUsb0JBQW9CLDhDQUE4QywwQkFBMEI7QUFDdEc7QUFDQSxVQUFVLG9CQUFvQiw4Q0FBOEMsMEJBQTBCO0FBQ3RHO0FBQ0EsVUFBVSxvQkFBb0IsOENBQThDLDBCQUEwQjtBQUN0RztBQUNBLFVBQVUsb0JBQW9CLDhDQUE4QywwQkFBMEI7QUFDdEc7QUFDQSxVQUFVLG9CQUFvQiw4Q0FBOEMsMEJBQTBCO0FBQ3RHO0FBQ0EsVUFBVSxvQkFBb0IsOENBQThDLDBCQUEwQjtBQUN0RztBQUNBLFVBQVUsb0JBQW9CLDhDQUE4QywwQkFBMEI7QUFDdEc7QUFDQSxVQUFVLG9CQUFvQiw4Q0FBOEMsMEJBQTBCO0FBQ3RHO0FBQ0EsVUFBVSxvQkFBb0IsOENBQThDLDBCQUEwQjtBQUN0RztBQUNBLFVBQVUsb0JBQW9CLDhDQUE4QywwQkFBMEI7QUFDdEc7QUFDQSxVQUFVLG9CQUFvQiw4Q0FBOEMsMEJBQTBCO0FBQ3RHO0FBQ0EsVUFBVSxvQkFBb0IsOENBQThDLDBCQUEwQjtBQUN0RztBQUNBLFVBQVUsb0JBQW9CLDhDQUE4QywwQkFBMEI7QUFDdEc7QUFDQSxVQUFVLG9CQUFvQiw4Q0FBOEMsMEJBQTBCO0FBQ3RHO0FBQ0EsVUFBVSxvQkFBb0IsOENBQThDLDBCQUEwQjtBQUN0RztBQUNBLFVBQVUsb0JBQW9CLDhDQUE4QywwQkFBMEI7QUFDdEc7QUFDQSxVQUFVLG9CQUFvQiw4Q0FBOEMsMEJBQTBCO0FBQ3RHO0FBQ0EsVUFBVSxvQkFBb0IsOENBQThDLDBCQUEwQjtBQUN0RztBQUNBLFVBQVUsb0JBQW9CLDhDQUE4QywwQkFBMEI7QUFDdEc7QUFDQSxVQUFVLG9CQUFvQiw4Q0FBOEMsMEJBQTBCO0FBQ3RHO0FBQ0EsVUFBVSxvQkFBb0IsOENBQThDLDBCQUEwQjtBQUN0RztBQUNBLFVBQVUsb0JBQW9CLDhDQUE4QywwQkFBMEI7QUFDdEc7QUFDQSxVQUFVLG9CQUFvQiw4Q0FBOEMsMEJBQTBCO0FBQ3RHO0FBQ0EsVUFBVSxvQkFBb0IsOENBQThDLDBCQUEwQjtBQUN0RztBQUNBLFVBQVUsb0JBQW9CLDhDQUE4QywwQkFBMEI7QUFDdEc7QUFDQSxVQUFVLG9CQUFvQiw4Q0FBOEMsMEJBQTBCO0FBQ3RHO0FBQ0EsVUFBVSxvQkFBb0IsOENBQThDLDBCQUEwQjtBQUN0RztBQUNBLFVBQVUsb0JBQW9CLDhDQUE4QywwQkFBMEI7QUFDdEc7QUFDQSxVQUFVLG9CQUFvQiw4Q0FBOEMsMEJBQTBCO0FBQ3RHO0FBQ0EsVUFBVSxvQkFBb0IsOENBQThDLDBCQUEwQjtBQUN0RztBQUNBLFVBQVUsb0JBQW9CLDhDQUE4QywwQkFBMEI7QUFDdEc7QUFDQSxVQUFVLG9CQUFvQiw4Q0FBOEMsMEJBQTBCO0FBQ3RHO0FBQ0EsVUFBVSxvQkFBb0IsOENBQThDLDBCQUEwQjtBQUN0RztBQUNBLFVBQVUsb0JBQW9CLDhDQUE4QywwQkFBMEI7QUFDdEc7QUFDQSxVQUFVLG9CQUFvQiw4Q0FBOEMsMEJBQTBCO0FBQ3RHO0FBQ0EsVUFBVSxvQkFBb0IsOENBQThDLDBCQUEwQjtBQUN0RztBQUNBLFVBQVUsb0JBQW9CLDhDQUE4QywwQkFBMEI7QUFDdEc7QUFDQSxVQUFVLG9CQUFvQiw4Q0FBOEMsMEJBQTBCO0FBQ3RHO0FBQ0EsVUFBVSxvQkFBb0IsOENBQThDLDBCQUEwQjtBQUN0RztBQUNBLFVBQVUsb0JBQW9CLDhDQUE4QywwQkFBMEI7QUFDdEc7QUFDQSxVQUFVLG9CQUFvQiw4Q0FBOEMsMEJBQTBCO0FBQ3RHO0FBQ0EsVUFBVSxvQkFBb0IsOENBQThDLDBCQUEwQjtBQUN0RztBQUNBLFVBQVUsb0JBQW9CLDhDQUE4QywwQkFBMEI7QUFDdEc7QUFDQSxVQUFVLG9CQUFvQiw4Q0FBOEMsMEJBQTBCO0FBQ3RHO0FBQ0EsVUFBVSxvQkFBb0IsOENBQThDLDBCQUEwQjtBQUN0RztBQUNBLFVBQVUsb0JBQW9CLDhDQUE4QywwQkFBMEI7QUFDdEc7QUFDQSxVQUFVLG9CQUFvQiw4Q0FBOEMsMEJBQTBCO0FBQ3RHO0FBQ0EsVUFBVSxvQkFBb0IsOENBQThDLDBCQUEwQjtBQUN0RztBQUNBLFVBQVUsb0JBQW9CLDhDQUE4QywwQkFBMEI7QUFD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O0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsV0FBVyxPQUFPO0FBQ2xCLFdBQVcsVUFBVTtBQUNyQixXQUFXLHVCQUF1QjtBQUNsQyxXQUFXLE9BQU87QUFDbEIsWUFBWSxPQUFPO0FBQ25CO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7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O0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxlQUFlLFdBQVc7QUFDMUI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLOztBQUVMO0FBQ0E7QUFDQSxnQkFBZ0IsT0FBTztBQUN2QjtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7O0FBRUw7QUFDQTtBQUNBLGdCQUFnQixPQUFPO0FBQ3ZCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLENBQUMsRUFBRSxzRUFBc0U7QUFDekU7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7O0FBRUE7QUFDQSxDQUFDLEVBQUUsd0ZBQXdGO0FBQzNGOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTs7QUFFQTs7QUFFQTs7QUFFQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxtQ0FBbUMsVUFBVTtBQUM3QztBQUNBO0FBQ0EsOEJBQThCO0FBQzlCO0FBQ0EscUJBQXFCLDhCQUE4QjtBQUNuRDtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHLGVBQWU7O0FBRWxCOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUEsa0JBQWtCO0FBQ2xCLG1CQUFtQjtBQUNuQixzQkFBc0I7QUFDdEIsbUJBQW1COztBQUVuQjtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxzQkFBc0I7QUFDdEI7QUFDQSxxQkFBcUI7QUFDckI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLG1CQUFtQixjQUFjOztBQUVqQzs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsK0NBQStDOztBQUUvQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBLEdBQUc7O0FBRUg7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0EscUJBQXFCLG9CQUFvQjs7QUFFekM7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUMsRUFBRSx5R0FBeUc7QUFDNUc7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNB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QTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTzs7QUFFUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTzs7QUFFUDtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsc0RBQXNEO0FBQ3REO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxrRUFBa0U7QUFDbEU7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLEdBQUc7O0FBRUg7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxTQUFTO0FBQ1Q7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsNkJBQTZCO0FBQzdCO0FBQ0E7QUFDQTtBQUNBO0FB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QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EseUJBQXlCO0FBQ3pCO0FBQ0EseUJBQXlCLGlCQUFpQjtBQUMxQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx5QkFBeUI7QUFDekI7QUFDQSx5QkFBeUIsaUJBQWlCO0FBQzFDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHlCQUF5QjtBQUN6QjtBQUNBLHlCQUF5QixpQkFBaUI7QUFDMUM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsMkJBQTJCO0FBQzNCO0FBQ0EsMkJBQTJCLGlCQUFpQjtBQUM1QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsMEJBQTBCLGFBQWE7QUFDdkM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwyQkFBMkIsaUJBQWlCO0FBQzVDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHlCQUF5QixpQkFBaUI7QUFDMUM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUzs7QUFFVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0JBQWtCLGlCQUFpQjtBQUNuQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx5QkFBeUIsaUJBQWlCO0FBQzFDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGtCQUFrQixpQkFBaUI7QUFDbkM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDJCQUEyQjtBQUMzQjtBQUNBLDJCQUEyQixpQkFBaUI7QUFDNUM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHlCQUF5QjtBQUN6QjtBQUNBLHlCQUF5QixpQkFBaUI7QUFDMUM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxtREFBbUQsaUJBQWlCO0FBQ3BFO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esd0JBQXdCO0FBQ3hCO0FBQ0EseUJBQXlCLGlCQUFpQjtBQUMxQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDBCQUEwQjtBQUMxQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx5QkFBeUI7QUFDekI7QUFDQSx5QkFBeUIsaUJBQWlCO0FBQzFDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDhCQUE4QixpQkFBaUI7QUFDL0M7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwwQkFBMEIsYUFBYTtBQUN2QywwQkFBMEIsYUFBYTtBQUN2Qyx5QkFBeUIsaUJBQWlCO0FBQzFDLHVDQUF1QztBQUN2QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHlCQUF5QjtBQUN6QjtBQUNBLHlCQUF5QixpQkFBaUI7QUFDMUM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDJCQUEyQixpQkFBaUI7QUFDNUM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHdEQUF3RDtBQUN4RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLGNBQWM7QUFDZDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxlQUFlO0FBQ2Ysa0VBQWtFO0FBQ2xFO0FBQ0E7QUFDQTs7QUFFQSxvQ0FBb0MsT0FBTztBQUMzQztBQUNBLDJCQUEyQixpQkFBaUI7QUFDNUM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLCtCQUErQixpQkFBaUI7QUFDaEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EscUNBQXFDO0FBQ3JDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLCtCQUErQixpQkFBaUI7QUFDaEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxxQ0FBcUM7QUFDckM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsK0JBQStCLGlCQUFpQjtBQUNoRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHNDQUFzQztBQUN0QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSwrQkFBK0IsT0FBTzs7QUFFdEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLGNBQWM7QUFDZDtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxjQUFjO0FBQ2Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDhCQUE4QixpQkFBaUI7QUFDL0M7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiLCtEQUErRDtBQUMvRDtBQUNBO0FBQ0E7O0FBRUEsZ0NBQWdDLE9BQU87QUFDdkM7QUFDQSx5QkFBeUIsaUJBQWlCO0FBQzFDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGVBQWU7QUFDZjtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLGdEQUFnRCxPQUFPO0FBQ3ZEO0FBQ0EsMkJBQTJCLGlCQUFpQjtBQUM1QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDJCQUEyQixpQkFBaUI7QUFDNUM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYixpRUFBaUU7QUFDakU7QUFDQTtBQUNBOztBQUVBLGtDQUFrQyxPQUFPO0FBQ3pDO0FBQ0EseUJBQXlCLGlCQUFpQjtBQUMxQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxlQUFlO0FBQ2Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxnREFBZ0QsT0FBTztBQUN2RDtBQUNBLDJCQUEyQixpQkFBaUI7QUFDNUM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsMkJBQTJCLGlCQUFpQjtBQUM1QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsdUJBQXVCLGlCQUFpQjtBQUN4QztBQUNBLGdDQUFnQztBQUNoQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxzQ0FBc0MscUJBQXFCO0FBQzNELDhCQUE4QixhQUFhO0FBQzNDO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiLHFDQUFxQyxrQkFBa0I7QUFDdkQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxrQ0FBa0MscUJBQXFCO0FBQ3ZEO0FBQ0E7QUFDQSxZQUFZO0FBQ1o7QUFDQTtBQUNBO0FBQ0E7QUFDQSx3QkFBd0IsYUFBYTtBQUNyQztBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUCwrQkFBK0Isa0JBQWtCO0FBQ2pEO0FBQ0E7QUFDQSx1QkFBdUIsaUJBQWlCO0FBQ3hDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwyQkFBMkIsaUJBQWlCO0FBQzVDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxzREFBc0Q7QUFDdEQ7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDJCQUEyQixpQkFBaUI7QUFDNUM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlGQUFpRjtBQUNqRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBLDZCQUE2Qix1QkFBdUI7QUFDcEQ7QUFDQSwrQkFBK0IsdUJBQXVCOztBQUV0RDtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDLEVBQUUsZ0ZBQWdGO0FBQ25GOzs7QUFHQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLHlCQUF5Qjs7QUFFekIsY0FBYztBQUNkLGNBQWM7QUFDZCx1QkFBdUI7QUFDdkIsZUFBZTtBQUNmLGVBQWU7QUFDZixlQUFlO0FBQ2YsZUFBZTtBQUNmLGVBQWU7QUFDZixlQUFlO0FBQ2YsV0FBVztBQUNYLFdBQVc7QUFDWCxVQUFVO0FBQ1YsV0FBVztBQUNYLFdBQVc7QUFDWCxrQkFBa0I7QUFDbEI7QUFDQSxpQkFBaUI7QUFDakIsVUFBVTtBQUNWLHlDQUF5QyxlQUFlO0FBQ3hELHdDQUF3QyxlQUFlO0FBQ3ZEO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsZUFBZSxnQkFBZ0I7QUFDL0I7QUFDQTtBQUNBLGVBQWUsYUFBYTtBQUM1QjtBQUNBOztBQUVBO0FBQ0E7QUFDQSxxQkFBcUIsVUFBVTtBQUMvQiwyQkFBMkIsT0FBTztBQUNsQztBQUNBO0FBQ0E7QUFDQTtBQUNBLGtCQUFrQjtBQUNsQixzQ0FBc0MsMkJBQTJCO0FBQ2pFLHVDQUF1QztBQUN2Qyx3Q0FBd0M7QUFDeEM7OztBQUdBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsYUFBYTtBQUNiO0FBQ0EsZUFBZSxXQUFXO0FBQzFCLDJCQUEyQixPQUFPO0FBQ2xDO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxlQUFlLGdCQUFnQjtBQUMvQjtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsY0FBYztBQUNkOztBQUVBO0FBQ0E7QUFDQSxlQUFlLGVBQWU7QUFDOUI7QUFDQTs7QUFFQTtBQUNBLGVBQWUsYUFBYTtBQUM1QjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDBCQUEwQjtBQUMxQjtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRyxPQUFPO0FBQ1Y7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxXQUFXO0FBQ1gsVUFBVTtBQUNWLFlBQVk7QUFDWixxQkFBcUI7QUFDckIsY0FBYztBQUNkLFdBQVc7QUFDWCxXQUFXO0FBQ1gsbUJBQW1CO0FBQ25CLGtCQUFrQjs7QUFFbEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHdCQUF3QjtBQUN4QjtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLGVBQWU7QUFDZjtBQUNBO0FBQ0E7QUFDQSxLQUFLOztBQUVMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSx3QkFBd0IsT0FBTztBQUMvQjtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLGtCQUFrQjs7QUFFbEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHdCQUF3QixPQUFPO0FBQy9CO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSwrQ0FBK0M7QUFDL0M7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUNBQWlDO0FBQ2pDO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsQ0FBQyxFQUFFLHFCQUFxQjtBQUN4Qjs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQyxHQUFHO0FBQ0o7OztBQUdBOztBQUVBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsOEJBQThCO0FBQzlCOztBQUVBOzs7QUFHQSxvQkFBb0Isc0JBQXNCLHFCQUFxQixjQUFjLEVBQUU7O0FBRS9FOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUEsd0JBQXdCOztBQUV4QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOzs7QUFHQTs7QUFFQSxrQ0FBa0M7QUFDbEMsaUNBQWlDO0FBQ2pDLGlDQUFpQztBQUNqQyw0QkFBNEI7QUFDNUIsaUNBQWlDOztBQUVqQztBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQSwyQkFBMkI7QUFDM0Isb0JBQW9CO0FBQ3BCLDZCQUE2QjtBQUM3Qjs7OztBQUlBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxxQ0FBcUM7QUFDckM7QUFDQTtBQUNBO0FBQ0E7QUFDQSxzQkFBc0I7QUFDdEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUixXQUFXO0FBQ1gsV0FBVztBQUNYLFlBQVk7QUFDWixRQUFRO0FBQ1IsbUJBQW1COztBQUVuQixnQkFBZ0Isa0JBQWtCO0FBQ2xDO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsNkNBQTZDOztBQUU3Qyx3QkFBd0IsZUFBZTtBQUN2QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLHVCQUF1QixVQUFVLEVBQUU7O0FBRW5DO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx1QkFBdUIsUUFBUTs7QUFFL0I7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxvQ0FBb0MsUUFBUTtBQUM1Qyx1QkFBdUI7QUFDdkIsNEJBQTRCO0FBQzVCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHOztBQUVIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx5QkFBeUIsWUFBWTtBQUNyQztBQUNBO0FBQ0E7QUFDQSx5QkFBeUIsVUFBVTtBQUNuQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG9CQUFvQjtBQUNwQixtQkFBbUI7QUFDbkIscUJBQXFCO0FBQ3JCO0FBQ0Esd0NBQXdDO0FBQ3hDLGVBQWU7QUFDZixXQUFXO0FBQ1gsUUFBUTs7QUFFUjtBQUNBO0FBQ0E7QUFDQSxnQkFBZ0Isa0JBQWtCO0FBQ2xDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsYUFBYSxnQkFBZ0I7QUFDN0I7QUFDQSxvQkFBb0IsVUFBVTtBQUM5QjtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUixXQUFXO0FBQ1gsYUFBYTtBQUNiLFdBQVc7QUFDWCxXQUFXO0FBQ1g7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLGdCQUFnQix1QkFBdUI7QUFDdkM7QUFDQSxlQUFlLDRCQUE0QjtBQUMzQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLGlCQUFpQixXQUFXO0FBQzVCO0FBQ0EsZUFBZSw0QkFBNEI7QUFDM0M7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2IsU0FBUyxnQkFBZ0I7QUFDekI7QUFDQSxlQUFlLGdDQUFnQztBQUMvQztBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLGdCQUFnQixrQkFBa0I7QUFDbEM7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsYUFBYSxhQUFhO0FBQzFCO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7O0FBRVI7QUFDQSxhQUFhLGFBQWEsUUFBUSwrQkFBK0I7QUFDakUsYUFBYSxhQUFhLFFBQVEsK0JBQStCO0FBQ2pFLGFBQWEsY0FBYyxPQUFPLDZCQUE2Qjs7QUFFL0Q7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxnQkFBZ0I7QUFDaEIsZUFBZTtBQUNmLGtCQUFrQjtBQUNsQjtBQUNBLGVBQWU7O0FBRWY7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG9CQUFvQjtBQUNwQixZQUFZO0FBQ1o7QUFDQTtBQUNBLGlCQUFpQjtBQUNqQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLCtDQUErQyxPQUFPOztBQUV0RDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsMkJBQTJCO0FBQzNCLDJCQUEyQjtBQUMzQjtBQUNBLFdBQVc7QUFDWCxTQUFTO0FBQ1QsYUFBYTtBQUNiLFdBQVc7QUFDWCxZQUFZOztBQUVaO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxnQ0FBZ0M7QUFDaEM7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBLDZDQUE2QztBQUM3QztBQUNBO0FBQ0E7QUFDQSxrQ0FBa0M7QUFDbEM7QUFDQSxlQUFlO0FBQ2Y7QUFDQTs7QUFFQSxrQ0FBa0M7QUFDbEM7QUFDQTtBQUNBO0FBQ0Esb0NBQW9DO0FBQ3BDO0FBQ0EsT0FBTzs7QUFFUDtBQUNBO0FBQ0E7O0FBRUEsS0FBSztBQUNMOztBQUVBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw2REFBNkQ7QUFDN0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQSxzQkFBc0I7QUFDdEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVc7QUFDWCxvQkFBb0I7QUFDcEIsV0FBVzs7QUFFWDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsYUFBYSxXQUFXO0FBQ3hCO0FBQ0E7QUFDQTs7QUFFQSxLQUFLO0FBQ0w7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSx1Q0FBdUMsUUFBUSxPQUFPLHdCQUF3Qjs7QUFFOUU7QUFDQTtBQUNBO0FBQ0EsZUFBZTtBQUNmO0FBQ0EsMkJBQTJCO0FBQzNCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsOEJBQThCOztBQUU5Qiw2QkFBNkI7QUFDN0I7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBLEdBQUc7O0FBRUg7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxvQkFBb0I7QUFDcEIsbUJBQW1CO0FBQ25CO0FBQ0EsUUFBUTtBQUNSLG1CQUFtQjtBQUNuQixhQUFhOztBQUViLHNDQUFzQzs7QUFFdEMsZ0JBQWdCO0FBQ2hCLG9CQUFvQjtBQUNwQixvQkFBb0I7O0FBRXBCO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsNENBQTRDOztBQUU1QyxhQUFhLGVBQWU7QUFDNUI7QUFDQTs7QUFFQTtBQUNBOztBQUVBLEtBQUs7QUFDTDs7QUFFQSxLQUFLOztBQUVMLCtCQUErQixrQ0FBa0M7QUFDakU7O0FBRUEsS0FBSztBQUNMOztBQUVBLEtBQUs7QUFDTDtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBLEtBQUs7QUFDTDtBQUNBOztBQUVBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxvQkFBb0I7QUFDcEIsbUJBQW1CO0FBQ25CO0FBQ0EsUUFBUTtBQUNSLG1CQUFtQjtBQUNuQixhQUFhOztBQUViLHNDQUFzQzs7QUFFdEMsZ0JBQWdCO0FBQ2hCLG9CQUFvQjtBQUNwQixvQkFBb0I7O0FBRXBCLCtCQUErQjtBQUMvQjtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxhQUFhLGVBQWU7QUFDNUI7QUFDQTs7QUFFQTtBQUNBOztBQUVBLEtBQUs7QUFDTCxVQUFVLGlDQUFpQyxFQUFFOztBQUU3QyxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsS0FBSztBQUNMO0FBQ0E7O0FBRUEsS0FBSztBQUNMO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLEtBQUs7QUFDTDtBQUNBOztBQUVBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0JBQWtCOztBQUVsQjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGdDQUFnQyxrQkFBa0I7QUFDbEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGtDQUFrQztBQUNsQztBQUNBLFdBQVc7O0FBRVg7QUFDQTtBQUNBO0FBQ0E7QUFDQSw4QkFBOEI7QUFDOUI7QUFDQSw4QkFBOEI7QUFDOUIsZ0JBQWdCLGdCQUFnQjtBQUNoQztBQUNBO0FBQ0E7QUFDQTs7QUFFQSxzQ0FBc0M7QUFDdEM7O0FBRUEsc0NBQXNDO0FBQ3RDO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDBCQUEwQixJQUFJLE1BQU0sR0FBRyxNQUFNLEdBQUc7QUFDaEQ7QUFDQTtBQUNBO0FBQ0EsU0FBUyxJQUFJLEtBQUssR0FBRyxNQUFNLEdBQUcsTUFBTSxHQUFHLE1BQU0sSUFBSSxNQUFNLElBQUk7QUFDM0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsYUFBYSxTQUFTO0FBQ3RCO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxjQUFjLGNBQWM7QUFDNUI7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2IsaUJBQWlCO0FBQ2pCLFdBQVc7QUFDWDtBQUNBLG9EQUFvRDtBQUNwRCx1Q0FBdUM7QUFDdkM7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiLGlCQUFpQjtBQUNqQixXQUFXO0FBQ1g7QUFDQSw0QkFBNEI7QUFDNUIsc0JBQXNCOztBQUV0QjtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBLGtDQUFrQyx3QkFBd0I7O0FBRTFELEdBQUc7QUFDSDtBQUNBLDRDQUE0QztBQUM1Qzs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLEdBQUc7O0FBRUg7QUFDQTs7QUFFQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxvQkFBb0I7QUFDcEIsa0JBQWtCO0FBQ2xCO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0EsV0FBVztBQUNYO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHFCQUFxQixpQkFBaUI7QUFDdEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUMsRUFBRSxxQkFBcUI7QUFDeEI7OztBQUdBO0FBQ0E7QUFDQSxvQkFBb0I7QUFDcEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EscUJBQXFCO0FBQ3JCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxDQUFDLEdBQUcsRUFBRSxHQUFHO0FBQ1Q7QUFDQSxDQUFDOzs7Ozs7Ozs7OztBQ3Z5UkQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRyxJQUErRDtBQUNsRTtBQUNBLFlBQVkscUJBQU0sa0JBQWtCLHFCQUFNLFdBQVcsbUJBQU8sQ0FBQyw4REFBbUI7QUFDaEYsMERBQTBELG1CQUFPLENBQUMsOERBQW1CO0FBQ3JGO0FBQ0E7O0FBRUE7QUFDQSxjQUFjLFFBQVE7QUFDdEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDOztBQUVELDZCQUE2Qix5Q0FBeUMsOEJBQThCO0FBQ3BHLHVCQUF1QixnQkFBZ0I7O0FBRXZDLDJCQUEyQix1QkFBdUIsY0FBYztBQUNoRSxxQkFBcUIsY0FBYyxjQUFjOztBQUVqRCwyQkFBMkIsWUFBWSxrQ0FBa0MsU0FBUyxnQ0FBZ0MsVUFBVTs7QUFFNUg7QUFDQTtBQUNBLGVBQWUsc0JBQXNCO0FBQ3JDO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZUFBZSxzQkFBc0I7QUFDckM7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxpQ0FBaUMsK0JBQStCO0FBQ2hFLGlDQUFpQywrQkFBK0I7QUFDaEU7QUFDQSx3QkFBd0IsdUJBQXVCLGNBQWM7QUFDN0Q7QUFDQSxrRUFBa0UsOERBQThEO0FBQ2hJO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlCQUFpQixrQkFBa0I7QUFDbkM7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLG9CQUFvQixjQUFjO0FBQ2xDLHlCQUF5QixTQUFTO0FBQ2xDO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlCQUFpQixrQkFBa0I7QUFDbkM7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLG9CQUFvQiw4QkFBOEI7O0FBRWxEO0FBQ0E7QUFDQSxvQkFBb0IsOEJBQThCO0FBQ2xEO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNEOztBQUVBOztBQUVBO0FBQ0E7QUFDQSxnQkFBZ0IsNEJBQTRCLEVBQUUsV0FBVyxhQUFhO0FBQ3RFLDBDQUEwQyx1REFBdUQsRUFBRTtBQUNuRztBQUNBLCtDQUErQyxzQkFBc0I7QUFDckU7QUFDQSwyREFBMkQsc0JBQXNCO0FBQ2pGOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0Esb0NBQW9DLCtCQUErQixFQUFFO0FBQ3JFOztBQUVBO0FBQ0E7QUFDQTtBQUNBLGNBQWMsYUFBYTtBQUMzQjtBQUNBOztBQUVBO0FBQ0Esc0RBQXNELCtCQUErQixFQUFFO0FBQ3ZGLFlBQVksZUFBZSxpQkFBaUIsMENBQTBDO0FBQ3RGOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZUFBZSxpQkFBaUI7QUFDaEM7QUFDQTs7QUFFQSw4QkFBOEIsa0NBQWtDOztBQUVoRTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBLHFCQUFxQiw0QkFBNEIsZ0NBQWdDLFVBQVU7QUFDM0Ysb0JBQW9CLFlBQVksMEJBQTBCLFVBQVU7QUFDcEUsbUJBQW1CLFdBQVc7QUFDOUIsbUJBQW1CLFdBQVc7QUFDOUIsb0JBQW9CLFdBQVc7QUFDL0IscUJBQXFCLHVCQUF1QjtBQUM1QyxxQkFBcUIsV0FBVztBQUNoQztBQUNBLG9CQUFvQix5Q0FBeUMsdUJBQXVCLG9CQUFvQjtBQUN4RywwQkFBMEIsWUFBWSxxUUFBcVE7QUFDM1M7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxnQkFBZ0I7QUFDaEIsZ0JBQWdCO0FBQ2hCLGtCQUFrQjtBQUNsQixrQkFBa0I7QUFDbEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLGFBQWEsV0FBVzs7QUFFeEI7QUFDQSxjQUFjLFlBQVk7O0FBRTFCO0FBQ0EsY0FBYyxZQUFZO0FBQzFCO0FBQ0EsY0FBYyxZQUFZOztBQUUxQjtBQUNBLGNBQWMsWUFBWTtBQUMxQjtBQUNBLGNBQWMsWUFBWTtBQUMxQjtBQUNBLGNBQWMsWUFBWTs7QUFFMUI7QUFDQSxjQUFjLFlBQVk7O0FBRTFCO0FBQ0EsY0FBYyxZQUFZOztBQUUxQjtBQUNBLGNBQWMsWUFBWTs7QUFFMUI7O0FBRUE7QUFDQTs7QUFFQTtBQUNBLCtDQUErQztBQUMvQztBQUNBLCtDQUErQztBQUMvQztBQUNBLGtEQUFrRDtBQUNsRDtBQUNBLGtEQUFrRDs7QUFFbEQ7QUFDQSwrQkFBK0IsZ0JBQWdCLFVBQVU7QUFDekQ7QUFDQSxrQ0FBa0MsbUJBQW1CLGFBQWE7QUFDbEU7QUFDQSxrQ0FBa0MsbUJBQW1CLFlBQVk7QUFDakU7QUFDQSxxQ0FBcUMsc0JBQXNCLGVBQWU7QUFDMUU7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsWUFBWTtBQUNaLFlBQVk7QUFDWjtBQUNBLFlBQVksY0FBYyxTQUFTLFNBQVMsRUFBRSxPQUFPLFNBQVMsU0FBUyxFQUFFO0FBQ3pFO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBO0FBQ0E7QUFDQSx1QkFBdUIsa0JBQWtCLFFBQVEsU0FBUztBQUMxRDtBQUNBLGtCQUFrQix1Q0FBdUM7QUFDekQsc0JBQXNCLHFDQUFxQztBQUMzRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlCQUFpQixpQkFBaUI7QUFDbEMsbUJBQW1CO0FBQ25CLG1CQUFtQjtBQUNuQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw2QkFBNkIsdUJBQXVCO0FBQ3BEOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLHVDQUF1QztBQUN2Qyx3QkFBd0I7QUFDeEI7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBLENBQUM7QUFDRDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlDQUFpQyxVQUFVO0FBQzNDLDRCQUE0QixVQUFVO0FBQ3RDLEdBQUc7QUFDSDtBQUNBO0FBQ0EsK0JBQStCLG1CQUFtQjtBQUNsRDtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBLCtCQUErQixtQkFBbUI7QUFDbEQ7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0EseUNBQXlDLG1CQUFtQjtBQUM1RDtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0EsK0JBQStCLG1CQUFtQjtBQUNsRDtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0EsK0JBQStCLG1CQUFtQjtBQUNsRDtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlEQUFpRDtBQUNqRCw0REFBNEQ7QUFDNUQseUZBQXlGO0FBQ3pGO0FBQ0EsR0FBRyxpQ0FBaUM7QUFDcEM7QUFDQSxXQUFXLFVBQVU7QUFDckI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTSxhQUFhO0FBQ25CO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZ0NBQWdDO0FBQ2hDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0VBQWtFLDhFQUE4RSxFQUFFO0FBQ2xKLEVBQUU7QUFDRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxlQUFlLGlCQUFpQjtBQUNoQztBQUNBLG1CQUFtQjtBQUNuQixtQkFBbUI7QUFDbkI7QUFDQTtBQUNBO0FBQ0E7QUFDQSxzQkFBc0IseUJBQXlCLHFDQUFxQztBQUNwRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsbUJBQW1CO0FBQ25CO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx3SUFBd0ksMkRBQTJELEVBQUU7QUFDck07QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsdUJBQXVCLElBQUk7QUFDM0I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw0RUFBNEUsa0RBQWtEO0FBQzlIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDZGQUE2RixFQUFFLHdDQUF3QyxnRUFBZ0UsRUFBRTtBQUN6TTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZ0RBQWdEO0FBQ2hEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGdDQUFnQztBQUNoQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxrRUFBa0UsOEVBQThFLEVBQUU7QUFDbEosRUFBRTtBQUNGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGVBQWU7QUFDZjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDBEQUEwRCxFQUFFO0FBQzVEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHVCQUF1QixJQUFJO0FBQzNCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsNEVBQTRFLGtEQUFrRDtBQUM5SDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsMkZBQTJGLEVBQUUsd0NBQXdDLGdFQUFnRSxFQUFFO0FBQ3ZNO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsMENBQTBDO0FBQzFDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBLHNCQUFzQixnQkFBZ0I7QUFDdEM7QUFDQSxvQkFBb0I7QUFDcEI7QUFDQSxPQUFPO0FBQ1AsZ0JBQWdCO0FBQ2hCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EseUNBQXlDLEtBQUs7QUFDOUMsa0JBQWtCLHNEQUFzRCxFQUFFLFVBQVUsS0FBSztBQUN6RixtQkFBbUI7QUFDbkIsa0JBQWtCO0FBQ2xCLGlCQUFpQjtBQUNqQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esc0pBQXNKO0FBQ3RKO0FBQ0EsMENBQTBDLFlBQVk7QUFDdEQsaUJBQWlCLHNEQUFzRDtBQUN2RSwyQkFBMkI7QUFDM0I7QUFDQSx3RUFBd0UsWUFBWTtBQUNwRixpQkFBaUI7QUFDakIsZ0JBQWdCO0FBQ2hCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsdUJBQXVCLG9CQUFvQixNQUFNO0FBQ2pEO0FBQ0EsYUFBYSxrREFBa0Q7QUFDL0QsdUJBQXVCLFlBQVksS0FBSztBQUN4QztBQUNBLHVCQUF1QixVQUFVLEtBQUs7QUFDdEMsZ0NBQWdDLGNBQWMsTUFBTTtBQUNwRDtBQUNBLHVCQUF1QixZQUFZLEtBQUs7QUFDeEM7QUFDQTtBQUNBLG1CQUFtQixzREFBc0Qsd0JBQXdCO0FBQ2pHLHdCQUF3QiwwQkFBMEIsU0FBUyxNQUFNO0FBQ2pFO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0JBQWtCLDZCQUE2Qix3QkFBd0I7QUFDdkUsVUFBVTtBQUNWO0FBQ0E7QUFDQSx1QkFBdUIsVUFBVSxTQUFTO0FBQzFDO0FBQ0EsV0FBVztBQUNYO0FBQ0Esa0RBQWtELDJDQUEyQyxXQUFXLFFBQVE7QUFDaEgsd0RBQXdELDZDQUE2QyxXQUFXLE1BQU0sUUFBUTtBQUM5SCx3REFBd0QsNkNBQTZDLFdBQVcsTUFBTSxRQUFRO0FBQzlILFVBQVUsV0FBVyxLQUFLO0FBQzFCO0FBQ0Esd0JBQXdCLFNBQVM7QUFDakM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG1CQUFtQiw2QkFBNkIsd0JBQXdCO0FBQ3hFLHdCQUF3QjtBQUN4QjtBQUNBLEtBQUs7QUFDTDtBQUNBLDhDQUE4QztBQUM5QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVztBQUNYLHdCQUF3QixZQUFZO0FBQ3BDO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVix1QkFBdUIsWUFBWTtBQUNuQztBQUNBLFVBQVU7QUFDVix1QkFBdUIsVUFBVSxTQUFTO0FBQzFDLGlCQUFpQixzREFBc0QsT0FBTztBQUM5RSwwQ0FBMEMseUJBQXlCLEtBQUs7QUFDeEU7QUFDQSxVQUFVO0FBQ1YsdUJBQXVCLFlBQVk7QUFDbkMsZ0NBQWdDLFVBQVUsS0FBSztBQUMvQyxnQ0FBZ0MsY0FBYyxLQUFLO0FBQ25EO0FBQ0EsdUJBQXVCO0FBQ3ZCLHVCQUF1QixZQUFZLEtBQUs7QUFDeEM7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsNkJBQTZCLFFBQVE7QUFDckM7QUFDQSxxQ0FBcUMsU0FBUyxtQkFBbUI7QUFDakU7QUFDQTtBQUNBO0FBQ0E7QUFDQSx3REFBd0Q7QUFDeEQsOEJBQThCLGdCQUFnQixtQkFBbUIsRUFBRTtBQUNuRSxxQ0FBcUM7QUFDckM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlCQUFpQixVQUFVLFFBQVE7QUFDbkMsb0JBQW9CLFVBQVUsUUFBUTtBQUN0QyxvQkFBb0IsVUFBVSxRQUFRO0FBQ3RDO0FBQ0E7QUFDQSxpQkFBaUIsVUFBVSxRQUFRO0FBQ25DLG9CQUFvQixVQUFVLFFBQVE7QUFDdEM7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsU0FBUyxnQkFBZ0I7QUFDekI7QUFDQTtBQUNBLDJCQUEyQixjQUFjLEVBQUU7QUFDM0M7QUFDQTtBQUNBLG1CQUFtQjtBQUNuQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxnQkFBZ0IsVUFBVSxHQUFHO0FBQzdCO0FBQ0E7QUFDQSxhQUFhO0FBQ2IsNEJBQTRCLGdDQUFnQztBQUM1RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxVQUFVLGdCQUFnQiwyRUFBMkUsV0FBVyxPQUFPO0FBQ3ZIO0FBQ0E7QUFDQSxzQkFBc0IsT0FBTztBQUM3QjtBQUNBLCtCQUErQix1QkFBdUIsK0NBQStDO0FBQ3JHO0FBQ0EsVUFBVSxpQ0FBaUMsU0FBUztBQUNwRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGVBQWUsT0FBTztBQUN0QjtBQUNBO0FBQ0E7QUFDQSxTQUFTLE1BQU07QUFDZjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZUFBZSxjQUFjO0FBQzdCO0FBQ0E7QUFDQTtBQUNBLFNBQVMsbUJBQW1CO0FBQzVCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTLGNBQWM7QUFDdkI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVMsa0JBQWtCO0FBQzNCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHlDQUF5QztBQUN6Qyx5Q0FBeUM7QUFDekMseUNBQXlDO0FBQ3pDLHlDQUF5QztBQUN6Qyx5Q0FBeUM7QUFDekMseUNBQXlDO0FBQ3pDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsbUdBQW1HO0FBQ25HLDBGQUEwRjtBQUMxRiwwRkFBMEY7QUFDMUY7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsMkJBQTJCO0FBQzNCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGNBQWMsWUFBWTtBQUMxQiwrQkFBK0IscUJBQXFCLFVBQVU7QUFDOUQsNEJBQTRCLFNBQVMsT0FBTztBQUM1QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esc0NBQXNDLGtCQUFrQjtBQUN4RDtBQUNBLGFBQWEsV0FBVztBQUN4QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG9CQUFvQixnQkFBZ0I7QUFDcEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDRCQUE0QjtBQUM1QjtBQUNBO0FBQ0E7QUFDQTtBQUNBLGtCQUFrQixNQUFNLEtBQUs7QUFDN0IsdUJBQXVCLE9BQU8sUUFBUTtBQUN0QyxrQkFBa0IsTUFBTSxLQUFLO0FBQzdCLENBQUM7O0FBRUQsa0JBQWtCLGdCQUFnQjtBQUNsQyxrQkFBa0I7QUFDbEIsa0JBQWtCO0FBQ2xCLHFCQUFxQjtBQUNyQixxQkFBcUI7QUFDckI7QUFDQTtBQUNBO0FBQ0E7QUFDQSxvQkFBb0IsY0FBYyxVQUFVO0FBQzVDLHVCQUF1QixpQkFBaUIsYUFBYTtBQUNyRCx1QkFBdUIsaUJBQWlCLFlBQVk7QUFDcEQsMEJBQTBCLG9CQUFvQixlQUFlO0FBQzdEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG1CQUFtQjtBQUNuQixtQkFBbUI7QUFDbkIsc0JBQXNCO0FBQ3RCLHNCQUFzQjtBQUN0QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDOztBQUVEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG1CQUFtQixPQUFPLGlCQUFpQjtBQUMzQyxtQkFBbUIsT0FBTyxpQkFBaUI7QUFDM0MsOEJBQThCLFlBQVk7QUFDMUM7QUFDQSxFQUFFO0FBQ0Ysa0NBQWtDLE9BQU8sUUFBUTtBQUNqRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG1CQUFtQjtBQUNuQjtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsY0FBYyxVQUFVO0FBQ3hCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxlQUFlLE9BQU87QUFDdEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLGVBQWUsT0FBTztBQUN0QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxlQUFlLE9BQU87QUFDdEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxtQ0FBbUMsT0FBTztBQUMxQztBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBLEdBQUc7QUFDSCxtQkFBbUI7QUFDbkI7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHdEQUF3RCxPQUFPO0FBQy9EO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxvQkFBb0I7QUFDcEIsb0JBQW9CO0FBQ3BCO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esb0JBQW9CO0FBQ3BCLG9CQUFvQjtBQUNwQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxtQkFBbUIsb0JBQW9CLG1CQUFPLENBQUMsaUJBQUksR0FBRztBQUN0RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBOztBQUVBLG1CQUFtQjs7QUFFbkI7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsbUJBQW1CLE9BQU8sb0JBQW9CO0FBQzlDO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsaUJBQWlCLDBCQUEwQixrQ0FBa0M7QUFDN0U7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0Esc0JBQXNCLFNBQVMsT0FBTyw2QkFBNkI7QUFDbkU7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxjQUFjO0FBQ2Q7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLG9DQUFvQztBQUNwQztBQUNBLENBQUM7O0FBRUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLG9DQUFvQztBQUNwQzs7QUFFQTtBQUNBO0FBQ0Esb0ZBQW9GO0FBQ3BGLHFGQUFxRjtBQUNyRjtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYSxjQUFjO0FBQzNCO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxNQUFNLFFBQVEsT0FBTyxlQUFlLGdCQUFnQjs7QUFFcEQsTUFBTSxjQUFjO0FBQ3BCO0FBQ0EsY0FBYyxhQUFhO0FBQzNCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwrQkFBK0IsaUJBQWlCLG9DQUFvQztBQUNwRiwrQkFBK0IsaUJBQWlCLG9DQUFvQztBQUNwRjtBQUNBLFNBQVMsUUFBUTtBQUNqQjtBQUNBO0FBQ0E7O0FBRUEsU0FBUyxRQUFRO0FBQ2pCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTs7QUFFQTtBQUNBLFNBQVMsUUFBUTtBQUNqQjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsRUFBRTtBQUNGO0FBQ0E7QUFDQSxnQkFBZ0IsT0FBTztBQUN2QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWEsTUFBTTtBQUNuQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVMsUUFBUTtBQUNqQjtBQUNBLHNCQUFzQjtBQUN0QjtBQUNBO0FBQ0E7QUFDQSxVQUFVLE1BQU07QUFDaEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHFCQUFxQix5Q0FBeUM7QUFDOUQ7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNLG1CQUFtQjtBQUN6QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQ0FBaUMscUJBQXFCLHNCQUFzQixhQUFhO0FBQ3pGLG9CQUFvQjtBQUNwQjtBQUNBO0FBQ0EsMkJBQTJCO0FBQzNCLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQSx5RkFBeUY7QUFDekY7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxtQkFBbUI7QUFDbkI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHVCQUF1QixzQkFBc0I7QUFDN0M7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxvQkFBb0IsV0FBVyxrQkFBa0I7QUFDakQsc0JBQXNCLHlEQUF5RDtBQUMvRTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxzQ0FBc0MsUUFBUTtBQUM5QztBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVUscUJBQXFCLHFCQUFxQjtBQUNwRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxzQkFBc0I7QUFDdEI7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxXQUFXLDBCQUEwQjtBQUNyQztBQUNBO0FBQ0E7QUFDQSxXQUFXLGlCQUFpQjtBQUM1QjtBQUNBO0FBQ0EsWUFBWSxpQkFBaUI7QUFDN0I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIOztBQUVBLDBCQUEwQiw0QkFBNEIsRUFBRTtBQUN4RCxvQkFBb0I7QUFDcEIsV0FBVyxpQkFBaUIsT0FBTywrQkFBK0IsK0JBQStCO0FBQ2pHLFdBQVcsaUJBQWlCO0FBQzVCO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNILGFBQWEsZ0JBQWdCO0FBQzdCO0FBQ0EsYUFBYSxnQkFBZ0I7QUFDN0I7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxnQkFBZ0IsMEJBQTBCO0FBQzFDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsRUFBRTtBQUNGO0FBQ0E7QUFDQTtBQUNBLFlBQVksT0FBTztBQUNuQixZQUFZLE9BQU87QUFDbkI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFlBQVksT0FBTztBQUNuQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxZQUFZLFNBQVM7QUFDckI7QUFDQTtBQUNBLFlBQVksVUFBVTtBQUN0QixRQUFRLG1CQUFtQjtBQUMzQjtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWEsT0FBTztBQUNwQixTQUFTLEtBQUssK0JBQStCO0FBQzdDO0FBQ0E7QUFDQSxhQUFhLEtBQUs7QUFDbEIsYUFBYSxLQUFLO0FBQ2xCO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTSwwQkFBMEI7QUFDaEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLDBCQUEwQjtBQUNyQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVyxhQUFhO0FBQ3hCO0FBQ0E7QUFDQSxhQUFhLFFBQVE7QUFDckIsYUFBYSxPQUFPO0FBQ3BCLGFBQWEsUUFBUTtBQUNyQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDRCQUE0QixPQUFPO0FBQ25DO0FBQ0E7QUFDQSxzQkFBc0I7QUFDdEIsc0JBQXNCO0FBQ3RCO0FBQ0EsOEJBQThCO0FBQzlCO0FBQ0EsV0FBVywwQkFBMEI7QUFDckM7QUFDQTtBQUNBO0FBQ0EsYUFBYSxlQUFlO0FBQzVCLFFBQVEsV0FBVztBQUNuQjtBQUNBO0FBQ0EsV0FBVywwQkFBMEI7QUFDckM7QUFDQTtBQUNBLGFBQWEsZUFBZTtBQUM1QixRQUFRLFVBQVU7QUFDbEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxrREFBa0Qsd0JBQXdCLEVBQUU7QUFDNUUsNENBQTRDLHNCQUFzQixtREFBbUQsRUFBRTtBQUN2SDtBQUNBLDBDQUEwQyxVQUFVLDJDQUEyQztBQUMvRjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLHdCQUF3QjtBQUNuQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxjQUFjO0FBQ2QsbUJBQW1CO0FBQ25CO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLGVBQWUsY0FBYztBQUM3QjtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLHdCQUF3Qix5Q0FBeUM7QUFDakU7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx5QkFBeUI7QUFDekI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUMsV0FBVyw2REFBNkQsRUFBRTs7QUFFM0U7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxpS0FBaUs7QUFDaks7O0FBRUEscUtBQXFLO0FBQ3JLOztBQUVBLHdCQUF3Qix5RUFBeUUsbUNBQW1DOztBQUVwSTs7QUFFQTtBQUNBLGNBQWMsWUFBWTs7QUFFMUI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLCtCQUErQiw4QkFBOEIsd0RBQXdEO0FBQ3JILCtCQUErQiw4QkFBOEIsd0RBQXdEO0FBQ3JILCtCQUErQiw4QkFBOEIsd0RBQXdEO0FBQ3JILCtCQUErQiw4QkFBOEIsd0RBQXdEO0FBQ3JILCtCQUErQiw4QkFBOEIsd0RBQXdEOztBQUVySDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFlBQVksY0FBYztBQUMxQjtBQUNBLEVBQUU7QUFDRjtBQUNBO0FBQ0EsWUFBWSxjQUFjO0FBQzFCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsZUFBZSxPQUFPO0FBQ3RCO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDOztBQUVEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0EsV0FBVyxRQUFROztBQUVuQixXQUFXLFNBQVM7QUFDcEI7O0FBRUEsd0VBQXdFOztBQUV4RTtBQUNBLFdBQVcsT0FBTztBQUNsQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVyxhQUFhO0FBQ3hCLFdBQVcsT0FBTztBQUNsQjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLFdBQVcsT0FBTztBQUNsQjtBQUNBO0FBQ0E7QUFDQSx5Q0FBeUMsTUFBTTtBQUMvQztBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLGVBQWUsU0FBUztBQUN4QixXQUFXLFFBQVE7QUFDbkI7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNLEtBQUs7QUFDWDs7QUFFQTtBQUNBO0FBQ0EsTUFBTSxRQUFRO0FBQ2QsTUFBTSxRQUFRO0FBQ2QsTUFBTSxRQUFRO0FBQ2QsTUFBTSxRQUFRO0FBQ2Q7QUFDQSxDQUFDOztBQUVEO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxtREFBbUQ7QUFDbkQsMkNBQTJDO0FBQzNDLDBDQUEwQztBQUMxQywwQ0FBMEM7QUFDMUM7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esc0JBQXNCO0FBQ3RCLGVBQWUsWUFBWTtBQUMzQjtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsYUFBYTtBQUN4QixXQUFXLE9BQU87QUFDbEI7QUFDQTtBQUNBLFdBQVcsT0FBTztBQUNsQjtBQUNBO0FBQ0E7QUFDQSxnQ0FBZ0MsTUFBTTtBQUN0QztBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLE1BQU0sZ0NBQWdDO0FBQ3RDO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esb0NBQW9DO0FBQ3BDO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esb0NBQW9DO0FBQ3BDO0FBQ0E7QUFDQTtBQUNBLHFDQUFxQztBQUNyQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxlQUFlLFNBQVM7QUFDeEIsZ0JBQWdCLFFBQVE7QUFDeEI7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsdUNBQXVDLDhCQUE4Qjs7QUFFckU7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsbUNBQW1DO0FBQ25DO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsK0JBQStCLHFDQUFxQyxvQkFBb0I7QUFDeEY7QUFDQTtBQUNBO0FBQ0EsZUFBZTtBQUNmLElBQUksdUJBQXVCLGlDQUFpQyxXQUFXO0FBQ3ZFO0FBQ0EsR0FBRztBQUNIO0FBQ0EsaUJBQWlCO0FBQ2pCLEdBQUc7QUFDSDtBQUNBO0FBQ0EseUJBQXlCO0FBQ3pCO0FBQ0EsbUNBQW1DLHdDQUF3QyxvQkFBb0I7QUFDL0YsUUFBUSxHQUFHO0FBQ1g7QUFDQTtBQUNBO0FBQ0EscUJBQXFCO0FBQ3JCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxnREFBZ0Q7QUFDaEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLHNCQUFzQjtBQUN0QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLDBCQUEwQiwrQkFBK0Isb0JBQW9CO0FBQzdFLHVCQUF1QixtQ0FBbUMsUUFBUTtBQUNsRTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLFVBQVUsdURBQXVEO0FBQ2pFO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxjQUFjLHFCQUFxQjs7QUFFbkM7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBLFdBQVcsVUFBVTtBQUNyQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBLGVBQWUsZUFBZSxhQUFhO0FBQzNDO0FBQ0E7QUFDQSxvQkFBb0I7QUFDcEIsYUFBYSxhQUFhO0FBQzFCO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsNkNBQTZDO0FBQzdDO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDJCQUEyQiw0QkFBNEIsWUFBWTtBQUNuRTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSx5QkFBeUIsdUJBQXVCO0FBQ2hEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxXQUFXLDBCQUEwQjtBQUNyQywyQ0FBMkM7QUFDM0M7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsWUFBWSxlQUFlO0FBQzNCO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxzQkFBc0I7QUFDdEI7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxZQUFZO0FBQ1o7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLDhCQUE4QjtBQUN6QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSx3QkFBd0IsMEJBQTBCO0FBQ2xEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSx3QkFBd0IsMEJBQTBCO0FBQ2xEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxzQkFBc0Isd0JBQXdCOztBQUU5QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsQ0FBQzs7QUFFRCxHQUFHLEtBQStELCtDQUErQyxzQkFBc0I7QUFDdkk7QUFDQSxHQUFHLElBQThCLE9BQU8sT0FBTyxtQkFBTyxDQUFDLGlCQUFJLEVBQUUsRUFBRTs7QUFFL0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx3Q0FBd0MsZ0NBQWdDO0FBQ3hFO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsNkRBQTZEO0FBQzdELHdGQUF3RiwwQkFBMEIsRUFBRTtBQUNwSCxzQ0FBc0MseUNBQXlDO0FBQy9FO0FBQ0E7QUFDQTtBQUNBLG1CQUFtQixjQUFjLDhCQUE4QjtBQUMvRDtBQUNBLHdGQUF3RiwwQkFBMEIsRUFBRTtBQUNwSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsbUdBQW1HO0FBQ25HO0FBQ0Esd0JBQXdCLGVBQWU7QUFDdkM7QUFDQSxxQkFBcUIsYUFBYTtBQUNsQyxFQUFFLFdBQVcsd0RBQXdEO0FBQ3JFO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxtR0FBbUc7QUFDbkc7QUFDQSwwQkFBMEIsa0JBQWtCO0FBQzVDLDJCQUEyQjtBQUMzQjtBQUNBLEVBQUUsV0FBVyx3REFBd0Q7QUFDckU7QUFDQTtBQUNBO0FBQ0E7QUFDQSxlQUFlLGVBQWU7QUFDOUI7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsZUFBZSxnQkFBZ0I7QUFDL0I7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsZUFBZSxnQkFBZ0I7QUFDL0I7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsZUFBZSxnQkFBZ0I7QUFDL0I7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsZUFBZSxnQkFBZ0I7QUFDL0I7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSwrQ0FBK0M7QUFDL0M7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZUFBZSxlQUFlO0FBQzlCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsdUNBQXVDO0FBQ3ZDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsZUFBZSxpQkFBaUI7QUFDaEM7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLG9CQUFvQixZQUFZLDBCQUEwQixVQUFVOztBQUVwRTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw0RkFBNEYsV0FBVyxZQUFZO0FBQ25IO0FBQ0EsZ0RBQWdELFVBQVUsWUFBWTtBQUN0RTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGVBQWUsY0FBYyxPQUFPLGFBQWEsY0FBYztBQUMvRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSx3QkFBd0IsdUZBQXVGOztBQUUvRztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYSxZQUFZO0FBQ3pCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxNQUFNLDhCQUE4QixFQUFFLFdBQVcsYUFBYTtBQUM5RDs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxNQUFNLDZCQUE2QixFQUFFLFdBQVcsYUFBYTtBQUM3RDs7QUFFQTtBQUNBO0FBQ0EsZUFBZSxjQUFjO0FBQzdCO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsR0FBRyxJQUE4QjtBQUNqQyxJQUFJLEtBQTZCO0FBQ2pDLDJDQUEyQyxtQkFBTyxDQUFDLGdEQUFZO0FBQy9EO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EscUNBQXFDLGNBQWMsRUFBRTtBQUNyRCxtREFBbUQsZUFBZSxFQUFFO0FBQ3BFLG9DQUFvQztBQUNwQztBQUNBO0FBQ0E7QUFDQSxvQ0FBb0MsaUJBQWlCLEVBQUU7QUFDdkQsb0NBQW9DLGlCQUFpQixFQUFFO0FBQ3ZELGtEQUFrRCxpQkFBaUIsRUFBRTtBQUNyRTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSx3Q0FBd0M7QUFDeEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxZQUFZO0FBQ1o7QUFDQSxNQUFNLG1CQUFtQjtBQUN6QjtBQUNBO0FBQ0E7QUFDQSxpQkFBaUIsZUFBZTtBQUNoQztBQUNBLFVBQVUsZ0JBQWdCO0FBQzFCO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBVSxZQUFZO0FBQ3RCO0FBQ0EseURBQXlEO0FBQ3pEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxnREFBZ0Q7QUFDaEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esc0JBQXNCLG1DQUFtQzs7QUFFekQ7QUFDQSxRQUFRO0FBQ1IsUUFBUTtBQUNSLE1BQU07QUFDTixNQUFNO0FBQ04sT0FBTztBQUNQO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSwyREFBMkQsZ0NBQWdDLEVBQUU7QUFDN0Y7QUFDQTtBQUNBLDJEQUEyRCxzRkFBc0YsRUFBRSxtQ0FBbUMsNENBQTRDO0FBQ2xPO0FBQ0E7QUFDQTtBQUNBLENBQUM7O0FBRUQ7QUFDQTtBQUNBO0FBQ0EseUNBQXlDLHFCQUFxQixFQUFFLGdDQUFnQyxxRUFBcUU7QUFDcks7QUFDQSw0QkFBNEIsZ0RBQWdEOztBQUU1RTtBQUNBO0FBQ0E7QUFDQSx5Q0FBeUMscUJBQXFCLEVBQUUsNERBQTRELG1FQUFtRSxFQUFFLEVBQUU7QUFDbk07O0FBRUE7QUFDQTtBQUNBLHlDQUF5QyxxQkFBcUIsRUFBRSxvQ0FBb0MsaUVBQWlFLEVBQUUsRUFBRTtBQUN6Szs7QUFFQTtBQUNBO0FBQ0EseUJBQXlCO0FBQ3pCLDBCQUEwQiw2Q0FBNkM7QUFDdkUsbUNBQW1DLHNDQUFzQztBQUN6RSxDQUFDO0FBQ0Q7QUFDQSxxQ0FBcUMsNENBQTRDLEdBQUc7QUFDcEYsQ0FBQzs7QUFFRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGdCQUFnQiwrQkFBK0IsVUFBVTtBQUN6RDtBQUNBLHVCQUF1QixxQkFBcUIsZUFBZSwrQkFBK0IsVUFBVTtBQUNwRztBQUNBLGdCQUFnQiwyRUFBMkUsVUFBVTtBQUNyRztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0RBQWtEO0FBQ2xEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxlQUFlO0FBQ2Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsWUFBWSxpQkFBaUI7QUFDN0I7QUFDQTtBQUNBLHFCQUFxQix5Q0FBeUMsS0FBSztBQUNuRSxxQkFBcUIsc0VBQXNFLEtBQUs7QUFDaEcsU0FBUztBQUNUO0FBQ0EsZUFBZSwrQkFBK0I7QUFDOUM7QUFDQSxpQkFBaUIsbUJBQW1CLG1CQUFtQixRQUFRO0FBQy9ELG9CQUFvQjtBQUNwQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsMkNBQTJDLHFEQUFxRDtBQUNoRzs7QUFFQSw2QkFBNkIscURBQXFEO0FBQ2xGOztBQUVBO0FBQ0E7QUFDQSxrQkFBa0I7QUFDbEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7O0FBRUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQSxvQkFBb0IsbUNBQW1DLGdCQUFnQixFQUFFO0FBQ3pFO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxnQkFBZ0IscUJBQXFCO0FBQ3JDO0FBQ0E7QUFDQSxDQUFDOztBQUVELDBCQUEwQjtBQUMxQjtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxrQkFBa0IseUJBQXlCO0FBQzNDLEVBQUU7QUFDRjtBQUNBOztBQUVBO0FBQ0Esd0JBQXdCLDZGQUE2Rjs7QUFFckgsd0JBQXdCLGlDQUFpQyxxQ0FBcUMsV0FBVztBQUN6RywyQkFBMkI7O0FBRTNCLDZCQUE2QixNQUFNLDRDQUE0QyxFQUFFLFdBQVcsZUFBZSxFQUFFLFdBQVc7O0FBRXhIO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUNBQWlDO0FBQ2pDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQzs7QUFFRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBLGVBQWUsUUFBUTtBQUN2QjtBQUNBO0FBQ0EsT0FBTyxXQUFXLHFCQUFxQjtBQUN2QztBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLG9CQUFvQixXQUFXLDJCQUEyQjtBQUMxRDtBQUNBO0FBQ0E7QUFDQTtBQUNBLDhEQUE4RCxXQUFXO0FBQ3pFLFFBQVEscUJBQXFCLFNBQVM7QUFDdEM7QUFDQSxlQUFlLFFBQVE7QUFDdkI7QUFDQTtBQUNBOztBQUVBLGlDQUFpQyxrQkFBa0IsYUFBYSxpQkFBaUIsb0RBQW9ELElBQUksK0NBQStDLFVBQVU7QUFDbE07QUFDQSxpQ0FBaUMsV0FBVyxhQUFhLEtBQUsseURBQXlELHFDQUFxQztBQUM1SjtBQUNBLGlDQUFpQyxXQUFXLGFBQWEsT0FBTyxtREFBbUQsb0JBQW9CO0FBQ3ZJO0FBQ0EsOEJBQThCLFdBQVcsYUFBYSxLQUFLLHFEQUFxRCxvQkFBb0I7QUFDcEk7QUFDQSw2QkFBNkIsK0JBQStCO0FBQzVEO0FBQ0EsNkJBQTZCLCtCQUErQjtBQUM1RDtBQUNBLDhCQUE4QixpQ0FBaUM7QUFDL0Q7QUFDQTtBQUNBLHdDQUF3QywrQkFBK0I7QUFDdkUsNkJBQTZCLCtCQUErQjtBQUM1RDtBQUNBO0FBQ0EseUNBQXlDO0FBQ3pDLG1DQUFtQyx5QkFBeUI7O0FBRTVEO0FBQ0EsOEJBQThCLGtEQUFrRCx5RUFBeUU7QUFDekosOEJBQThCLHlFQUF5RTtBQUN2RyxtQ0FBbUMsK0NBQStDLDZCQUE2QjtBQUMvRyxtQ0FBbUMsK0NBQStDLDZCQUE2QjtBQUMvRyxxQ0FBcUMsZ0RBQWdELCtCQUErQjtBQUNwSCxpQ0FBaUMsOENBQThDLDZCQUE2QjtBQUM1RyxtQ0FBbUMsK0NBQStDLDZCQUE2QjtBQUMvRyxvQ0FBb0MsdUVBQXVFO0FBQzNHLDhCQUE4QjtBQUM5QiwyQkFBMkIsbUZBQW1GO0FBQzlHLG9DQUFvQyxpREFBaUQsdUJBQXVCO0FBQzVHLGdDQUFnQywrQ0FBK0M7QUFDL0U7O0FBRUE7QUFDQTtBQUNBLDhCQUE4QixtRUFBbUU7QUFDakcsMkJBQTJCLGtEQUFrRDtBQUM3RSwwQkFBMEIsK0JBQStCO0FBQ3pELDBCQUEwQiwrQkFBK0I7QUFDekQsMkJBQTJCLGlDQUFpQztBQUM1RCx5QkFBeUIsK0JBQStCO0FBQ3hELDBCQUEwQiwrQkFBK0I7QUFDekQ7O0FBRUEsb0NBQW9DLGVBQWU7QUFDbkQsdUNBQXVDLGlDQUFpQztBQUN4RSxzQ0FBc0Msa0NBQWtDLG1EQUFtRDtBQUMzSCx1Q0FBdUMsNkRBQTZEO0FBQ3BHLHNDQUFzQywyREFBMkQ7QUFDakcsc0NBQXNDLDJEQUEyRDs7QUFFakc7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0JBQWtCLFVBQVUsT0FBTyxtREFBbUQsUUFBUTtBQUM5RjtBQUNBOztBQUVBLHVEQUF1RDtBQUN2RCw0QkFBNEIsNENBQTRDOztBQUV4RTtBQUNBO0FBQ0E7QUFDQSxtQkFBbUI7O0FBRW5CO0FBQ0EsK0NBQStDLHlDQUF5QztBQUN4Riw2Q0FBNkMseUNBQXlDO0FBQ3RGO0FBQ0EsNENBQTRDLDZDQUE2QztBQUN6RjtBQUNBLHdEQUF3RCwwQkFBMEIsMkJBQTJCO0FBQzdHO0FBQ0EseURBQXlELDJCQUEyQiwyQ0FBMkM7O0FBRS9ILHdCQUF3QjtBQUN4QjtBQUNBLG1CQUFtQjtBQUNuQix5QkFBeUI7QUFDekIsb0RBQW9ELHFCQUFxQjtBQUN6RSxXQUFXLGlCQUFpQjs7QUFFNUI7QUFDQSwyQkFBMkI7QUFDM0IsYUFBYSxVQUFVO0FBQ3ZCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJLGlCQUFpQixXQUFXOztBQUVoQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwyQkFBMkI7QUFDM0IsYUFBYSxXQUFXO0FBQ3hCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJLGlCQUFpQjs7QUFFckI7QUFDQTtBQUNBLHlDQUF5QyxVQUFVO0FBQ25ELDBFQUEwRSxhQUFhO0FBQ3ZGO0FBQ0EsbURBQW1ELGlFQUFpRSxhQUFhLFdBQVc7QUFDNUksU0FBUyxtQ0FBbUMsYUFBYSxFQUFFO0FBQzNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZ0JBQWdCO0FBQ2hCLElBQUk7QUFDSjtBQUNBLDZDQUE2QztBQUM3QztBQUNBLGNBQWM7QUFDZDs7QUFFQSw2Q0FBNkMsdUJBQXVCLGlDQUFpQyxrQ0FBa0Msa0NBQWtDO0FBQ3pLLDZDQUE2Qyx1QkFBdUIsZ0NBQWdDLGlDQUFpQyxpQ0FBaUM7QUFDdEssNkNBQTZDLHVCQUF1QixpQ0FBaUM7O0FBRXJHO0FBQ0E7QUFDQTtBQUNBLFVBQVUsaUJBQWlCO0FBQzNCO0FBQ0EsRUFBRTtBQUNGO0FBQ0E7QUFDQSxVQUFVLGlCQUFpQjtBQUMzQjtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQSxVQUFVLGlCQUFpQjtBQUMzQjtBQUNBO0FBQ0EsRUFBRTtBQUNGLE9BQU8sT0FBTztBQUNkO0FBQ0EsR0FBRztBQUNILEVBQUU7QUFDRjtBQUNBLGFBQWEsNkJBQTZCO0FBQzFDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEVBQUU7QUFDRixvQkFBb0IseUJBQXlCO0FBQzdDLG9CQUFvQix5QkFBeUIsWUFBWSwyQkFBMkI7QUFDcEYsb0JBQW9CLHlCQUF5QixZQUFZLDJCQUEyQixZQUFZLDJCQUEyQjtBQUMzSCxvQkFBb0Isb0NBQW9DO0FBQ3hELG9CQUFvQixnQkFBZ0Isb0NBQW9DLE9BQU87QUFDL0U7QUFDQTtBQUNBLG9CQUFvQixtQ0FBbUM7QUFDdkQ7QUFDQSxnQkFBZ0I7QUFDaEI7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsa0NBQWtDLGtCQUFrQjs7QUFFcEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxrQkFBa0IsZ0NBQWdDO0FBQ2xEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQSxnQ0FBZ0Msb0NBQW9DLDBCQUEwQjtBQUM5RjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxtQ0FBbUMsVUFBVSxjQUFjLCtDQUErQyxhQUFhOztBQUV2SCxVQUFVLDRDQUE0QztBQUN0RDs7QUFFQTtBQUNBO0FBQ0EscUJBQXFCO0FBQ3JCO0FBQ0E7QUFDQSx3QkFBd0IsMEJBQTBCO0FBQ2xEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGVBQWUsUUFBUTtBQUN2QixzQkFBc0Isd0NBQXdDLGNBQWM7QUFDNUUsUUFBUSwwQkFBMEIsT0FBTztBQUN6QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxFQUFFO0FBQ0Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLHdCQUF3QixZQUFZLG1EQUFtRDtBQUN2Rix3QkFBd0IsWUFBWSwrRUFBK0U7QUFDbkg7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLFNBQVMsSUFBOEI7QUFDdkMsT0FBTyxVQUFVLG1CQUFPLENBQUMscUJBQVEsRUFBRTtBQUNuQyxZQUFZLGVBQWU7QUFDM0I7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsWUFBWSxVQUFVO0FBQ3RCLFlBQVksVUFBVTtBQUN0QjtBQUNBLFlBQVksYUFBYTtBQUN6QjtBQUNBO0FBQ0EsWUFBWTtBQUNaLFlBQVksa0JBQWtCO0FBQzlCO0FBQ0E7QUFDQSxZQUFZLGFBQWE7QUFDekI7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsNkJBQTZCLDJDQUEyQztBQUN4RSwwQkFBMEIsdUJBQXVCO0FBQ2pELHdCQUF3QixpREFBaUQ7QUFDekUsMEJBQTBCLHNDQUFzQzs7QUFFaEUsNkJBQTZCLHlDQUF5QyxNQUFNLGdCQUFnQixzQ0FBc0MsY0FBYztBQUNoSiwwQkFBMEIsc0RBQXNELFVBQVUsV0FBVyxLQUFLLDRFQUE0RSxVQUFVO0FBQ2hNLHdCQUF3Qix3Q0FBd0M7QUFDaEUsMEJBQTBCLHdDQUF3Qzs7QUFFbEUsMkJBQTJCLCtEQUErRDtBQUMxRiw4QkFBOEIsNkJBQTZCLFNBQVMsZ0RBQWdEO0FBQ3BIO0FBQ0E7QUFDQSxlQUFlLGlCQUFpQjtBQUNoQztBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBLDhCQUE4QixnREFBZ0Q7QUFDOUU7QUFDQTtBQUNBO0FBQ0EsTUFBTSxLQUFLO0FBQ1g7QUFDQTtBQUNBO0FBQ0E7QUFDQSx1QkFBdUI7QUFDdkIsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLFVBQVUsR0FBRyxRQUFRLElBQUk7QUFDekI7QUFDQTtBQUNBLGFBQWEsU0FBUztBQUN0QjtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxhQUFhLFNBQVM7QUFDdEI7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsZ0RBQWdELGFBQWEsYUFBYSxVQUFVOztBQUVwRixhQUFhLFVBQVU7QUFDdkI7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsYUFBYSxVQUFVO0FBQ3ZCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EseUJBQXlCLDBEQUEwRCxFQUFFLFdBQVc7QUFDaEcsTUFBTSx5Q0FBeUMsZ0RBQWdELEVBQUUsV0FBVyxhQUFhO0FBQ3pIOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxpQkFBaUI7QUFDakIsU0FBUztBQUNUOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esb0NBQW9DO0FBQ3BDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxrQkFBa0I7QUFDbEI7QUFDQTtBQUNBO0FBQ0EsZUFBZSxJQUFJLHVCQUF1QixNQUFNLFVBQVU7QUFDMUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGVBQWUsa0JBQWtCO0FBQ2pDO0FBQ0E7QUFDQSxnQkFBZ0IscUJBQXFCO0FBQ3JDO0FBQ0EsZ0JBQWdCLGVBQWU7QUFDL0I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwrQkFBK0Isd0JBQXdCLG9CQUFvQjtBQUMzRSx5QkFBeUIseUJBQXlCLGlDQUFpQyxtQkFBbUI7QUFDdEc7QUFDQTtBQUNBO0FBQ0E7QUFDQSxzQkFBc0IsY0FBYyw4Q0FBOEM7QUFDbEYsV0FBVyxjQUFjLDBCQUEwQixxQ0FBcUM7QUFDeEY7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0osaUNBQWlDLFlBQVk7QUFDN0M7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG1DQUFtQyx3Q0FBd0M7O0FBRTNFO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsbUJBQW1CLGlCQUFpQixjQUFjLGtDQUFrQztBQUNwRjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVyxpQkFBaUI7QUFDNUIseUJBQXlCO0FBQ3pCO0FBQ0E7QUFDQSxpQkFBaUIsbUJBQW1CO0FBQ3BDO0FBQ0E7QUFDQSxjQUFjLGtCQUFrQjtBQUNoQywwQkFBMEI7QUFDMUI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxtQkFBbUIsaUJBQWlCLGNBQWMsb0NBQW9DO0FBQ3RGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxtQkFBbUIsaUJBQWlCLGNBQWMsb0NBQW9DO0FBQ3RGO0FBQ0E7QUFDQTtBQUNBLGVBQWUsa0JBQWtCO0FBQ2pDO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVixTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHFCQUFxQjtBQUNyQjtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBLHFCQUFxQjtBQUNyQjtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxtQkFBbUIsaUJBQWlCLGNBQWMsa0JBQWtCO0FBQ3BFO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7OztBQUdBLHFCQUFxQjtBQUNyQjtBQUNBO0FBQ0E7QUFDQTtBQUNBLGNBQWM7QUFDZDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwwRUFBMEUsVUFBVTtBQUNwRiwrRUFBK0UsVUFBVSxXQUFXO0FBQ3BHO0FBQ0Esc0RBQXNEO0FBQ3REOzs7QUFHQTtBQUNBO0FBQ0EsY0FBYyxNQUFNLE9BQU8sRUFBRTtBQUM3QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlCQUFpQixTQUFTO0FBQzFCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esc0JBQXNCO0FBQ3RCO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBOztBQUVBLHFCQUFxQjtBQUNyQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsOEJBQThCLG9EQUFvRDs7QUFFbEY7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBVTs7QUFFVjtBQUNBLHVCQUF1QjtBQUN2QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGdEQUFnRDtBQUNoRDtBQUNBO0FBQ0EsNEJBQTRCO0FBQzVCO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSw0QkFBNEIscUJBQXFCLHFCQUFxQixVQUFVO0FBQ2hGO0FBQ0E7QUFDQTtBQUNBLEVBQUU7QUFDRjtBQUNBO0FBQ0EsRUFBRTtBQUNGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxFQUFFO0FBQ0Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsZ0JBQWdCO0FBQ2hCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLCtDQUErQyw0Q0FBNEM7QUFDM0Ysa0RBQWtELDRDQUE0Qzs7QUFFOUY7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLHlCQUF5QjtBQUN6Qix5QkFBeUI7QUFDekI7O0FBRUE7QUFDQTtBQUNBLE9BQU8sMEJBQTBCO0FBQ2pDLE9BQU8sOEJBQThCO0FBQ3JDLE9BQU8sd0NBQXdDO0FBQy9DLE9BQU8sMkJBQTJCO0FBQ2xDLE9BQU8sMkJBQTJCO0FBQ2xDLE9BQU8sZ0NBQWdDO0FBQ3ZDLE9BQU8sNEJBQTRCO0FBQ25DLE9BQU8sMkJBQTJCO0FBQ2xDLE9BQU8sNkJBQTZCO0FBQ3BDLE9BQU8scUNBQXFDO0FBQzVDLE9BQU8sNkJBQTZCO0FBQ3BDLE9BQU8sK0NBQStDO0FBQ3RELE9BQU8sOENBQThDO0FBQ3JELE9BQU8sNkJBQTZCO0FBQ3BDLE9BQU8sNkJBQTZCO0FBQ3BDLE9BQU8saUNBQWlDO0FBQ3hDLE9BQU8sZ0NBQWdDO0FBQ3ZDLE9BQU8sNkJBQTZCO0FBQ3BDLE9BQU8scUNBQXFDO0FBQzVDLE9BQU8sMENBQTBDO0FBQ2pELE9BQU8sMEJBQTBCO0FBQ2pDLE9BQU8saUNBQWlDO0FBQ3hDLE9BQU8sbUNBQW1DO0FBQzFDLE9BQU8sOEJBQThCO0FBQ3JDLE9BQU8sNkJBQTZCO0FBQ3BDO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLE9BQU8sMEJBQTBCO0FBQ2pDLE9BQU8sMkJBQTJCO0FBQ2xDLE9BQU8sNkJBQTZCO0FBQ3BDLE9BQU8sNEJBQTRCO0FBQ25DLE9BQU8sOEJBQThCO0FBQ3JDLE9BQU8sOEJBQThCO0FBQ3JDLE9BQU8sOEJBQThCO0FBQ3JDLE9BQU8sZ0NBQWdDO0FBQ3ZDLE9BQU8sK0JBQStCO0FBQ3RDLE9BQU8sZ0NBQWdDO0FBQ3ZDLE9BQU8sbUNBQW1DO0FBQzFDLE9BQU8sbUNBQW1DO0FBQzFDLE9BQU8sb0NBQW9DO0FBQzNDLE9BQU8sMkJBQTJCO0FBQ2xDLE9BQU8sMkJBQTJCO0FBQ2xDLE9BQU8sMkJBQTJCO0FBQ2xDLE9BQU8sMkJBQTJCO0FBQ2xDLE9BQU8saUNBQWlDO0FBQ3hDLE9BQU8sNkJBQTZCO0FBQ3BDO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLGFBQWEseUJBQXlCO0FBQ3RDLGFBQWEsMkJBQTJCO0FBQ3hDO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsQ0FBQzs7QUFFRDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsc0JBQXNCLDZCQUE2Qix1Q0FBdUMsRUFBRSxFQUFFOztBQUU5RjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG9DQUFvQztBQUNwQyxjQUFjLGdCQUFnQjtBQUM5QjtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7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QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVMsSUFBSSxTQUFTLE1BQU07QUFDNUI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsNkNBQTZDO0FBQzdDLDhDQUE4Qzs7QUFFOUM7QUFDQTtBQUNBO0FBQ0EsNkJBQTZCLGlDQUFpQztBQUM5RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxFQUFFO0FBQ0Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7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QUNBO0FBQ0Esc0JBQXNCOztBQUV0QjtBQUNBO0FBQ0EsMEJBQTBCOztBQUUxQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxFQUFFO0FBQ0Y7O0FBRUE7QUFDQSw2QkFBNkI7O0FBRTdCO0FBQ0EsNEJBQTRCOztBQUU1QjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsRUFBRTtBQUNGOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFD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O0FBQ0EsT0FBTyw2QkFBNkI7QUFDcEMsT0FBTyw2QkFBNkI7QUFDcEMsT0FBTywyQkFBMkI7QUFDbEMsT0FBTywyQkFBMkI7QUFDbEMsT0FBTywyQkFBMkI7QUFDbEMsT0FBTywyQkFBMkI7QUFDbEMsT0FBTyw2QkFBNkI7QUFDcEMsT0FBTyw4QkFBOEI7QUFDckMsT0FBTywwQkFBMEI7QUFDakMsT0FBTywwQkFBMEI7QUFDakMsT0FBTywwQkFBMEI7QUFDakMsT0FBTywwQkFBMEI7QUFDakMsT0FBTywwQkFBMEI7QUFDakMsT0FBTywwQkFBMEI7QUFDakMsT0FBTyw2QkFBNkI7QUFDcEMsT0FBTyw2QkFBNkI7QUFDcEMsT0FBTyw2QkFBNkI7QUFDcEMsT0FBTyw2QkFBNkI7QUFDcEMsT0FBTyw4QkFBOEI7QUFDckMsT0FBTywrQkFBK0I7QUFDdEMsT0FBTyw2QkFBNkI7QUFDcEMsT0FBTywrQkFBK0I7QUFDdEMsT0FBTyw2QkFBNkI7QUFDcEMsT0FBTyxpQ0FBaUM7QUFDeEMsT0FBTyx1Q0FBdUM7QUFDOUMsT0FBTyw2QkFBNkI7QUFDcEMsT0FBTywrQkFBK0I7QUFDdEMsT0FBTyw2QkFBNkI7QUFDcEMsT0FBTyw2QkFBNkI7QUFDcEMsT0FBTyxpQ0FBaUM7QUFDeEMsT0FBTywrQkFBK0I7QUFDdEMsT0FBTyxxQ0FBcUM7QUFDNUMsT0FBTywrQkFBK0I7QUFDdEMsT0FBTyw2QkFBNkI7QUFDcEMsT0FBTywrQkFBK0I7QUFDdEMsT0FBTyxxQ0FBcUM7QUFDNUMsT0FBTyxtQ0FBbUM7QUFDMUMsT0FBTyx1Q0FBdUM7QUFDOUMsT0FBTyxxQ0FBcUM7QUFDNUMsT0FBTyxtQ0FBbUM7QUFDMUMsT0FBTyxxQ0FBcUM7QUFDNUMsT0FBTywrQkFBK0I7QUFDdEMsT0FBTyxpQ0FBaUM7QUFDeEMsT0FBTyx1Q0FBdUM7QUFDOUMsT0FBTyx5Q0FBeUM7QUFDaEQsT0FBTyxpQ0FBaUM7QUFDeEMsT0FBTyxpQ0FBaUM7QUFDeEMsT0FBTyxtQ0FBbUM7QUFDMUMsT0FBTyx1Q0FBdUM7QUFDOUMsT0FBTyx5Q0FBeUM7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O0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLGVBQWUsb0JBQW9COztBQUVuQztBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FB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QUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsOEVBQThFO0FBQzlFO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsOEVBQThFO0FBQzlFO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsOEVBQThFO0FBQzlFO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsOEVBQThFO0FBQzlFO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFD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Q0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLOztBQUVMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7O0FBRUw7QUFDQTtBQUNBO0FBQ0EsbUNBQW1DO0FBQ25DO0FBQ0EsOENBQThDO0FBQzlDLGtEQUFrRDtBQUNsRDtBQUNBO0FBQ0E7QUFDQTtBQUNBLHVFQUF1RTtBQUN2RTtBQUNBO0FBQ0E7QUFDQSx1RUFBdUU7QUFDdkU7QUFDQTtBQUNBO0FBQ0E7QUFDQSx1RUFBdUU7QUFDdkU7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7O0FBRUw7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSzs7QUFFTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7O0FBRUw7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLOztBQUVMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSzs7QUFFTDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxLQUFLOztBQUVMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7O0FBRUw7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsS0FBSzs7QUFFTDtBQUNBOztBQUVBLDBCQUEwQjtBQUMxQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBVSxTQUFTLGdDQUFnQztBQUNuRDtBQUNBO0FBQ0E7QUFDQTtBQUNBLGNBQWM7QUFDZDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsNEJBQTRCO0FBQzVCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxnREFBZ0QsZ0RBQWdEOztBQUVoRyxXQUFXO0FBQ1g7QUFDQSxFQUFFO0FBQ0Y7QUFDQTtBQUNBLDZCQUE2Qix1Q0FBdUMsd0RBQXdELFFBQVEsRUFBRSxFQUFFO0FBQ3hJO0FBQ0EsYUFBYSxjQUFjO0FBQzNCO0FBQ0E7QUFDQSxlQUFlLGtCQUFrQjtBQUNqQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhLGNBQWM7QUFDM0I7QUFDQTtBQUNBLGVBQWUsa0JBQWtCO0FBQ2pDO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsOERBQThELGlDQUFpQztBQUMvRiw4REFBOEQsaUNBQWlDO0FBQy9GO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLDhJQUE4STtBQUM5STtBQUNBO0FBQ0EsaUJBQWlCLFNBQVM7QUFDMUI7QUFDQTtBQUNBOztBQUVBOztBQUVBLGNBQWMsY0FBYyxtQkFBbUI7O0FBRS9DO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx3QkFBd0IsZ0RBQWdELEVBQUU7QUFDMUU7O0FBRUE7QUFDQSxtREFBbUQsZUFBZTtBQUNsRTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0NBQWtDLDBDQUEwQztBQUM1RSxrQ0FBa0MsZ0JBQWdCO0FBQ2xELEVBQUU7QUFDRjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxpQkFBaUIsbUJBQW1CO0FBQ3BDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLDJDQUEyQztBQUMzQyx5QkFBeUIsb0JBQW9CO0FBQzdDLDBCQUEwQiwwQkFBMEI7QUFDcEQsd0JBQXdCLGtCQUFrQjtBQUMxQywyQkFBMkIsb0NBQW9DLHNEQUFzRDtBQUNySCx5QkFBeUIsNEJBQTRCO0FBQ3JEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVc7QUFDWDtBQUNBO0FBQ0E7QUFDQSxFQUFFO0FBQ0Y7QUFDQSx1QkFBdUIsZ0JBQWdCO0FBQ3ZDO0FBQ0Esd0JBQXdCLGdCQUFnQjtBQUN4QztBQUNBLGNBQWMsbUJBQW1CO0FBQ2pDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxlQUFlO0FBQ2Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZ0JBQWdCO0FBQ2hCO0FBQ0Esa0NBQWtDO0FBQ2xDO0FBQ0E7QUFDQSxpQ0FBaUMsR0FBRyxRQUFRLGFBQWE7QUFDekQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZUFBZSwwQkFBMEI7QUFDekMsNkRBQTZELHNDQUFzQztBQUNuRztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxFQUFFO0FBQ0Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0EsUUFBUTs7QUFFUjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsUUFBUTtBQUNSOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxZQUFZO0FBQ1osZUFBZSxpQkFBaUIsT0FBTyxpQkFBaUIsc0JBQXNCO0FBQzlFO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEVBQUUsV0FBVyxzQkFBc0I7QUFDbkM7QUFDQSxtQkFBbUIsd0JBQXdCO0FBQzNDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esb0NBQW9DLG9CQUFvQjtBQUN4RCxFQUFFLFdBQVcsc0JBQXNCO0FBQ25DO0FBQ0Esb0NBQW9DLFNBQVMsV0FBVyx1REFBdUQ7QUFDL0c7QUFDQTs7QUFFQTtBQUNBLFVBQVUsc0JBQXNCO0FBQ2hDOztBQUVBO0FBQ0E7QUFDQSxZQUFZLFFBQVE7QUFDcEI7QUFDQTtBQUNBLG9DQUFvQztBQUNwQztBQUNBLGdCQUFnQjtBQUNoQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGNBQWM7QUFDZDtBQUNBLGtCQUFrQixxQkFBcUIsZUFBZSxXQUFXLEdBQUc7QUFDcEU7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGNBQWM7QUFDZDtBQUNBO0FBQ0EsMkNBQTJDLG1CQUFtQixPQUFPO0FBQ3JFLDJDQUEyQyxtQkFBbUIsT0FBTztBQUNyRTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxtQkFBbUI7QUFDbkI7QUFDQTtBQUNBLDhDQUE4QyxHQUFHLFFBQVEsSUFBSTtBQUM3RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsbUJBQW1CLHFCQUFxQjtBQUN4QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsRUFBRTtBQUNGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlDQUFpQztBQUNqQztBQUNBLHFCQUFxQjtBQUNyQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxvQkFBb0I7QUFDcEI7QUFDQSwwQkFBMEI7QUFDMUI7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZ0NBQWdDO0FBQ2hDO0FBQ0Esa0JBQWtCLGNBQWMsY0FBYyxFQUFFO0FBQ2hEO0FBQ0E7QUFDQSxnQkFBZ0I7QUFDaEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG1EQUFtRDtBQUNuRCxxREFBcUQ7QUFDckQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw0Q0FBNEM7QUFDNUMsOEJBQThCO0FBQzlCO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUNBQWlDO0FBQ2pDLGlDQUFpQztBQUNqQyxpQ0FBaUM7QUFDakM7QUFDQTtBQUNBO0FBQ0E7QUFDQSx1Q0FBdUM7QUFDdkMsNENBQTRDO0FBQzVDLDJCQUEyQjtBQUMzQiwyQkFBMkI7QUFDM0I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsdUJBQXVCO0FBQ3ZCLCtDQUErQyxPQUFPO0FBQ3REO0FBQ0Esd0RBQXdEO0FBQ3hEO0FBQ0E7QUFDQSxXQUFXO0FBQ1g7QUFDQSxtQkFBbUI7QUFDbkIseUJBQXlCO0FBQ3pCLDBCQUEwQjtBQUMxQjtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esd0JBQXdCO0FBQ3hCO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQSx1QkFBdUIsa0JBQWtCLHNCQUFzQjtBQUMvRDtBQUNBO0FBQ0E7QUFDQSx3Q0FBd0M7QUFDeEM7QUFDQSwrQ0FBK0M7QUFDL0M7QUFDQSwrQkFBK0Isa0JBQWtCLHNCQUFzQjtBQUN2RSx1RkFBdUYseUNBQXlDO0FBQ2hJO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsMENBQTBDLE9BQU87QUFDakQsMEZBQTBGO0FBQzFGLGdEQUFnRDs7QUFFaEQ7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsbUJBQW1CO0FBQ25CO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxtQkFBbUI7QUFDbkI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx5Q0FBeUM7QUFDekMsb0NBQW9DO0FBQ3BDLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBLG9DQUFvQzs7QUFFcEMsMENBQTBDLHNCQUFzQixrREFBa0Q7QUFDbEg7QUFDQTtBQUNBLGVBQWUsR0FBRyxRQUFRLElBQUk7QUFDOUI7QUFDQSxxQkFBcUI7QUFDckI7QUFDQTtBQUNBO0FBQ0Esd0NBQXdDLFFBQVE7QUFDaEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGtCQUFrQjtBQUNsQjtBQUNBO0FBQ0EsZ0JBQWdCLHVCQUF1QixLQUFLO0FBQzVDLEtBQUs7O0FBRUw7QUFDQSw4RkFBOEYsaUJBQWlCO0FBQy9HLGtCQUFrQixxQ0FBcUMsbUJBQW1CO0FBQzFFO0FBQ0E7QUFDQSxjQUFjLGlCQUFpQjtBQUMvQixLQUFLO0FBQ0w7QUFDQSxrQkFBa0Isc0RBQXNEO0FBQ3hFO0FBQ0E7QUFDQSxjQUFjLGlCQUFpQjtBQUMvQixLQUFLO0FBQ0w7QUFDQSxrQkFBa0Isc0RBQXNEO0FBQ3hFO0FBQ0E7QUFDQSxjQUFjLGlCQUFpQjtBQUMvQixLQUFLO0FBQ0w7QUFDQSx1QkFBdUIsWUFBWTtBQUNuQztBQUNBLGtCQUFrQix3REFBd0Q7QUFDMUU7QUFDQTtBQUNBLGVBQWUsYUFBYTtBQUM1QjtBQUNBLEtBQUs7QUFDTDtBQUNBLDhCQUE4QixvQkFBb0IsT0FBTztBQUN6RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw4QkFBOEIsYUFBYTtBQUMzQztBQUNBLCtFQUErRTtBQUMvRSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBLHVCQUF1QjtBQUN2QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTixLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDhCQUE4QjtBQUM5QjtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsOEJBQThCO0FBQzlCO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsY0FBYyxpQkFBaUI7QUFDL0I7QUFDQTtBQUNBLGtCQUFrQix5Q0FBeUM7QUFDM0Q7QUFDQTtBQUNBLGNBQWMsaUJBQWlCO0FBQy9CLEtBQUs7QUFDTDtBQUNBLHdCQUF3QixhQUFhO0FBQ3JDO0FBQ0Esa0JBQWtCLGlDQUFpQztBQUNuRDtBQUNBO0FBQ0EsZUFBZSxjQUFjO0FBQzdCO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGNBQWMsaUJBQWlCO0FBQy9COztBQUVBO0FBQ0Esc0NBQXNDO0FBQ3RDLEtBQUs7QUFDTDtBQUNBO0FBQ0EsS0FBSztBQUNMLG9CQUFvQjtBQUNwQjtBQUNBO0FBQ0Esd0JBQXdCLHdCQUF3QjtBQUNoRDtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLHVCQUF1Qix3QkFBd0I7QUFDL0M7QUFDQSxLQUFLOztBQUVMLG1EQUFtRDs7QUFFbkQseURBQXlEO0FBQ3pELHVDQUF1QztBQUN2Qyw2Q0FBNkM7O0FBRTdDO0FBQ0EsMkJBQTJCLG9CQUFvQjtBQUMvQyw0QkFBNEIsb0JBQW9CO0FBQ2hELHFFQUFxRSxjQUFjO0FBQ25GO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQSwyQkFBMkIsb0JBQW9CO0FBQy9DLDRCQUE0QixvQkFBb0I7QUFDaEQscUVBQXFFLGNBQWM7QUFDbkY7QUFDQTtBQUNBLEtBQUs7O0FBRUw7QUFDQTtBQUNBLGdEQUFnRDtBQUNoRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esd0NBQXdDLE1BQU07QUFDOUMsT0FBTztBQUNQLHlDQUF5QyxNQUFNO0FBQy9DO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0EsS0FBSzs7QUFFTCwwQkFBMEI7QUFDMUI7QUFDQSx1REFBdUQ7O0FBRXZELHVDQUF1QztBQUN2QyxnREFBZ0QsT0FBTzs7QUFFdkQ7QUFDQTtBQUNBO0FBQ0EsMEJBQTBCO0FBQzFCLG9CQUFvQixnQkFBZ0IsMEJBQTBCO0FBQzlEO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLDRCQUE0Qix5QkFBeUIsMEJBQTBCO0FBQy9FLHFCQUFxQix5QkFBeUIsc0JBQXNCO0FBQ3BFO0FBQ0E7QUFDQSwyQkFBMkI7QUFDM0I7QUFDQSxLQUFLOztBQUVMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsOERBQThEO0FBQzlEO0FBQ0E7O0FBRUE7QUFDQSw4REFBOEQ7QUFDOUQ7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLHlCQUF5QjtBQUN6Qix5QkFBeUI7QUFDekIsMEJBQTBCO0FBQzFCLDBCQUEwQjtBQUMxQixzQkFBc0I7QUFDdEI7QUFDQTtBQUNBLHlCQUF5QjtBQUN6QiwwQkFBMEI7QUFDMUIseUJBQXlCO0FBQ3pCLHVCQUF1QjtBQUN2Qix1QkFBdUI7QUFDdkIseUJBQXlCO0FBQ3pCLHdCQUF3QjtBQUN4QiwyQkFBMkI7QUFDM0I7QUFDQTtBQUNBLHVCQUF1QjtBQUN2Qix1QkFBdUI7QUFDdkIsdUJBQXVCO0FBQ3ZCLDJCQUEyQjtBQUMzQjtBQUNBO0FBQ0E7QUFDQTtBQUNBLGtDQUFrQztBQUNsQztBQUNBLHlCQUF5QjtBQUN6QjtBQUNBLHVCQUF1QjtBQUN2Qix3QkFBd0I7QUFDeEIsd0JBQXdCO0FBQ3hCLDJCQUEyQjtBQUMzQixrQ0FBa0M7QUFDbEMsK0JBQStCO0FBQy9CO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0Esd0JBQXdCO0FBQ3hCLDhCQUE4QjtBQUM5Qiw2QkFBNkI7QUFDN0Isb0NBQW9DOztBQUVwQztBQUNBLDZCQUE2QjtBQUM3Qix1QkFBdUI7QUFDdkIsMEJBQTBCO0FBQzFCLHlCQUF5QjtBQUN6QiwwQkFBMEI7QUFDMUIsMkJBQTJCO0FBQzNCLHVCQUF1QjtBQUN2QiwyQkFBMkI7QUFDM0IsMkJBQTJCO0FBQzNCLHlCQUF5QjtBQUN6Qix5QkFBeUI7QUFDekIsd0JBQXdCO0FBQ3hCLHdCQUF3Qjs7QUFFeEI7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLEtBQUs7O0FBRUw7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxLQUFLOztBQUVMLHVCQUF1QjtBQUN2Qjs7QUFFQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwwQkFBMEI7QUFDMUI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLDRCQUE0QjtBQUM1QjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQSwwQkFBMEI7QUFDMUI7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBLG1EQUFtRCw4QkFBOEIsRUFBRSxrQkFBa0IsMEJBQTBCO0FBQy9IO0FBQ0Es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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==
|