UNPKG

@magic-xpa/utils

Version:

magic utils package

429 lines 42.2 kB
/** * @fileoverview added by tsickle * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc */ import { PICInterface } from "./PICInterface"; import { UtilStrByteMode } from "./UtilStrByteMode"; import { NNumber } from "@magic-xpa/mscorelib"; /** @type {?} */ const MAX_GENGO = 5; /** @type {?} */ const IDX_UPPERCASE_ALPHA = 0; /** @type {?} */ const IDX_LOWERCASE_ALPHA = 1; /** @type {?} */ const IDX_KANJI = 2; /** @type {?} */ const IDX_YEAR = 0; /** @type {?} */ const IDX_MONTH = 1; /** @type {?} */ const IDX_DAY = 2; /** @type {?} */ const IDX_DOY = 3; export class UtilDateJpn { constructor() { /// <summary> /// JPN: Japanese date picture support /// Utility Class for Japanese date /// </summary> /// <author> Toshiro Nakayoshi (MSJ) /// </author> // ---- gengo (the name of an era) --------------------------------------- this.MaxGengo = MAX_GENGO; } /** * @return {?} */ static getInstance() { if (UtilDateJpn._instance === null) { UtilDateJpn._instance = new UtilDateJpn(); } return UtilDateJpn._instance; } /** * @return {?} */ static getArrayDow() { return UtilDateJpn.JweekStr; } /** * @param {?} intIdx * @return {?} */ static getStrDow(intIdx) { /** @type {?} */ let flag = intIdx < 0 || 7 < intIdx; if (flag) { intIdx = 0; } return UtilDateJpn.JweekStr[intIdx]; } /** * @param {?} month * @return {?} */ static convertStrMonth(month) { /** @type {?} */ let flag = month < 0 || 12 < month; if (flag) { month = 0; } return UtilDateJpn.JmonthStr[month]; } /// <summary> /// Convert a year (A.D.) into Japanese year of an era /// This method is modeled after "date_jpn_year_ofs" function in /// "\mglocal\jpn\jpndate_jpn.cpp". /// </summary> /// <param name = "intYear:">year (A.D.) /// </param> /// <param name = "intDoy:">DOY /// </param> /// <returns> year of an era. /// if either param is invalid, it returns 0. /// </returns> /** * @param {?} intYear * @param {?} intDoy * @return {?} */ date_jpn_year_ofs(intYear, intDoy) { /** @type {?} */ let result; if (intYear < 1 || intDoy < 1) { result = 0; } else { /** @type {?} */ let num = this.MaxGengo - 1; while (intYear < UtilDateJpn.StartDayOfGengo[num][0]) { num = num - 1; } if (intYear === UtilDateJpn.StartDayOfGengo[num][0] && intDoy < UtilDateJpn.StartDayOfGengo[num][3]) { num = num - 1; } result = intYear - UtilDateJpn.StartDayOfGengo[num][0] + 1; } return result; } /// <summary> /// Convert a year (A.D.) into a name of a Japanese era /// This method is modeled after "date_jpn_yr_2_a" function in /// "\mglocal\jpn\jpndate_jpn.cpp". /// </summary> /// <param name = "intYear:">year (A.D.) /// </param> /// <param name = "intDoy:">DOY /// </param> /// <param name = "isKanji:">return a full name (true) or the first letter (false). /// </param> /// <returns> name of an era /// if either param is invalid, it returns "?". /// </returns> /** * @param {?} intYear * @param {?} intDoy * @param {?} isKanji * @return {?} */ date_jpn_yr_2_a(intYear, intDoy, isKanji) { /** @type {?} */ let num; if (intYear < 1 || intDoy < 1) { num = 0; } else { num = this.MaxGengo - 1; while (intYear < UtilDateJpn.StartDayOfGengo[num][0]) { num = num - 1; } if (intYear === UtilDateJpn.StartDayOfGengo[num][0] && intDoy < UtilDateJpn.StartDayOfGengo[num][3]) { num = num - 1; } } /** @type {?} */ let result; if (isKanji) { result = UtilDateJpn.GengoStr[num][2]; } else { result = UtilDateJpn.GengoStr[num][0]; } return result; } /// <summary> /// Get the first year (A.D.) of a specified Japanese era /// This method is modeled after "date_jpn_yr_4_a" function in /// "\mglocal\jpn\jpndate_jpn.cpp". /// </summary> /// <param name = "ucp_str:">name of a specified Japanese era /// </param> /// <param name = "s_len:">length (the number of bytes) of ucp_str /// </param> /// <returns> year (A.D.) /// </returns> /** * @param {?} ucp_str * @param {?} s_len * @return {?} */ date_jpn_yr_4_a(ucp_str, s_len) { /** @type {?} */ let i = this.MaxGengo - 1; if (s_len > 0) { if (s_len > 1) { ucp_str = UtilStrByteMode.leftB(ucp_str, s_len); } while (i > 0) { if (s_len === 1) { if (ucp_str === UtilDateJpn.GengoStr[i][0] || ucp_str === UtilDateJpn.GengoStr[i][1]) { break; } } else { if (s_len > 1) { /** @type {?} */ let text = UtilStrByteMode.leftB(UtilDateJpn.GengoStr[i][2], s_len); if (ucp_str === text) { break; } } } i = i - 1; } } /** @type {?} */ let result; if (i > 0) { result = UtilDateJpn.StartDayOfGengo[i][0]; } else { /** @type {?} */ const text = ucp_str.substr(0, 1); if (text === " " || text === "?") { result = 1; } else { result = 0; } } return result; } /// <summary> /// Get the name of an era in date string /// </summary> /// <param name = "strDate:">string of input strDate /// </param> /// <param name = "strPicture:">string of picture /// </param> /// <param name = "intStartPos:">start position to search /// </param> /// <returns> name of an era /// </returns> /** * @param {?} strDate * @param {?} strPicture * @param {?} intStartPos * @return {?} */ static getEraNameStrInDate(strDate, strPicture, intStartPos) { /** @type {?} */ let result = null; /** @type {?} */ let intPicIdxOfs = 0; /** @type {?} */ let i = intStartPos; while (i + intPicIdxOfs < strPicture.length) { /** @type {?} */ let intLetters; if (strPicture.charCodeAt(i + intPicIdxOfs) === PICInterface.PIC_JY1) { intLetters = 1; } else { if (strPicture.charCodeAt(i + intPicIdxOfs) === PICInterface.PIC_JY2) { intLetters = 1; } else { if (strPicture.charCodeAt(i + intPicIdxOfs) === PICInterface.PIC_JY4) { intLetters = 2; } else { // If "strDate" contains DBCS, the position of "strPicture" has to skip next index. if (i < strDate.length) { if (!UtilStrByteMode.isHalfWidth(strDate[i]) && UtilStrByteMode.isHalfWidth(strPicture[i + intPicIdxOfs])) { intPicIdxOfs = intPicIdxOfs + 1; } } i = i + 1; continue; } } } result = strDate.substr(i, intLetters); break; // exit loop } return result; } /// <summary> /// Get the length of the name of an era in picture /// </summary> /// <param name = "strPicture">string of picture /// </param> /// <param name = "intStartPos">start position to search /// </param> /// <returns> length of the name (the number of bytes) /// </returns> /** * @param {?} strPicture * @param {?} intStartPos * @return {?} */ static getEraNameLenInPicture(strPicture, intStartPos) { /** @type {?} */ let intLetters = 0; for (let i = intStartPos; i < strPicture.length; i = i + 1) { if (strPicture.charCodeAt(i) === PICInterface.PIC_JY1) { intLetters = 1; } else { if (strPicture.charCodeAt(i) === PICInterface.PIC_JY2) { intLetters = 2; } else { if (strPicture.charCodeAt(i) === PICInterface.PIC_JY4) { intLetters = 4; } } } if (intLetters > 0) { break; } } return intLetters; } /// <summary> /// Get the start year of an era in picture /// </summary> /// <param name = "strDate:">string of input strDate /// </param> /// <param name = "strPicture:">string of picture /// </param> /// <returns> start year of the era /// </returns> /** * @param {?} strDate * @param {?} strPicture * @return {?} */ getStartYearOfEra(strDate, strPicture) { /** @type {?} */ let eraNameStrInDate = UtilDateJpn.getEraNameStrInDate(strDate, strPicture, 0); /** @type {?} */ let result; if (eraNameStrInDate === null) { result = 0; } else { /** @type {?} */ let eraNameLenInPicture = UtilDateJpn.getEraNameLenInPicture(strPicture, 0); if (eraNameLenInPicture === 0) { result = 0; } else { /** @type {?} */ let intStartYearOfEra = this.date_jpn_yr_4_a(eraNameStrInDate, eraNameLenInPicture); result = intStartYearOfEra; } } return result; } /// <summary> Add extra Gengo data into the Gengo tables</summary> /// <param name="strExtraGengo:"> /// </param> /// <returns> /// </returns> /** * @param {?} strExtraGengo * @return {?} */ addExtraGengo(strExtraGengo) { // e.g. strExtraGengo = "2012/04/01,092,AaABCD;2013/04/01,091,WwWXYZ;" /** @type {?} */ let array = strExtraGengo.split(';'); for (let i = 0; i <= array.length; i = i + 1) { if (array[i].length > 0) { /** @type {?} */ let array2 = array[i].split(','); if (array2.length === 2 && array2[0].length > 0 && array2[1].length > 0 && array2[2].length > 0) { /** @type {?} */ let array3 = array2[0].split('/'); if (array3.length === 2 && array3[0].length > 0 && array3[1].length > 0 && array3[2].length > 0) { UtilDateJpn.GengoStr[5 + i][0] = array2[2].substr(0, 1); // symbol name (upper case): A UtilDateJpn.GengoStr[5 + i][1] = array2[2].substr(1, 1); // symbol name (lower case): a UtilDateJpn.GengoStr[5 + i][2] = array2[2].substr(2); // gengo name: ABCD UtilDateJpn.StartDayOfGengo[5 + i][0] = NNumber.Parse(array3[0]); // start year: 2012 UtilDateJpn.StartDayOfGengo[5 + i][1] = NNumber.Parse(array3[1]); // start month: 4 UtilDateJpn.StartDayOfGengo[5 + i][2] = NNumber.Parse(array3[2]); // start day: 1 UtilDateJpn.StartDayOfGengo[5 + i][3] = NNumber.Parse(array2[1]); // days since January 1: 92 this.MaxGengo = this.MaxGengo + 1; } } } } } } UtilDateJpn._instance = null; UtilDateJpn.JweekStr = [ " ", "日曜日", "月曜日", "火曜日", "水曜日", "木曜日", "金曜日", "土曜日" ]; UtilDateJpn.JmonthStr = [ "", " 1月", " 2月", " 3月", " 4月", " 5月", " 6月", " 7月", " 8月", " 9月", "10月", "11月", "12月" ]; UtilDateJpn.GengoStr = [ [ "?", "?", "????" ], [ "M", "m", "明治" ], [ "T", "t", "大正" ], [ "S", "s", "昭和" ], [ "H", "h", "平成" ], [ "?", "?", "??" ], [ "?", "?", "??" ], [ "?", "?", "??" ] ]; UtilDateJpn.StartDayOfGengo = [ [ 1, 1, 1, 1 ], [ 1868, 9, 8, 252 ], [ 1912, 6, 30, 212 ], [ 1926, 12, 25, 359 ], [ 1989, 1, 8, 8 ], new Array(4), new Array(4), new Array(4) ]; if (false) { /** @type {?} */ UtilDateJpn._instance; /** @type {?} */ UtilDateJpn.JweekStr; /** @type {?} */ UtilDateJpn.JmonthStr; /** @type {?} */ UtilDateJpn.GengoStr; /** @type {?} */ UtilDateJpn.StartDayOfGengo; /** @type {?} */ UtilDateJpn.prototype.MaxGengo; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiVXRpbERhdGVKcG4uanMiLCJzb3VyY2VSb290Ijoibmc6Ly9AbWFnaWMteHBhL3V0aWxzLyIsInNvdXJjZXMiOlsic3JjL1V0aWxEYXRlSnBuLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7QUFBQSxPQUFPLEVBQUMsWUFBWSxFQUFDLE1BQU0sZ0JBQWdCLENBQUM7QUFDNUMsT0FBTyxFQUFDLGVBQWUsRUFBQyxNQUFNLG1CQUFtQixDQUFDO0FBQ2xELE9BQU8sRUFBVSxPQUFPLEVBQUMsTUFBTSxzQkFBc0IsQ0FBQzs7TUFFaEQsU0FBUyxHQUFXLENBQUM7O01BQ3JCLG1CQUFtQixHQUFXLENBQUM7O01BQy9CLG1CQUFtQixHQUFXLENBQUM7O01BQy9CLFNBQVMsR0FBVyxDQUFDOztNQUNyQixRQUFRLEdBQVcsQ0FBQzs7TUFDcEIsU0FBUyxHQUFXLENBQUM7O01BQ3JCLE9BQU8sR0FBVyxDQUFDOztNQUNuQixPQUFPLEdBQVcsQ0FBQztBQUd6QixNQUFNO0lBQU47UUFDRSxhQUFhO1FBQ2Isd0NBQXdDO1FBQ3hDLHFDQUFxQztRQUNyQyxjQUFjO1FBQ2QscUNBQXFDO1FBQ3JDLGFBQWE7UUEyQ2IsMkVBQTJFO1FBQ25FLGFBQVEsR0FBVyxTQUFTLENBQUM7SUF3UnZDLENBQUM7Ozs7SUF0UkMsTUFBTSxDQUFDLFdBQVc7UUFDaEIsRUFBRSxDQUFDLENBQUMsV0FBVyxDQUFDLFNBQVMsS0FBSyxJQUFJLENBQUMsQ0FBQyxDQUFDO1lBQ25DLFdBQVcsQ0FBQyxTQUFTLEdBQUcsSUFBSSxXQUFXLEVBQUUsQ0FBQztRQUM1QyxDQUFDO1FBQ0QsTUFBTSxDQUFDLFdBQVcsQ0FBQyxTQUFTLENBQUM7SUFDL0IsQ0FBQzs7OztJQUVELE1BQU0sQ0FBQyxXQUFXO1FBQ2hCLE1BQU0sQ0FBQyxXQUFXLENBQUMsUUFBUSxDQUFDO0lBQzlCLENBQUM7Ozs7O0lBRUQsTUFBTSxDQUFDLFNBQVMsQ0FBQyxNQUFjOztZQUN6QixJQUFJLEdBQVksTUFBTSxHQUFHLENB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RUFBRSxHQUFHLEVBQUUsSUFBSTtLQUNmO0NBQ0YsQ0FBQztBQUNhLDJCQUFlLEdBQWU7SUFDM0M7UUFDRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDO0tBQ1gsRUFBRTtRQUNELElBQUksRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLEdBQUc7S0FDaEIsRUFBRTtRQUNELElBQUksRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLEdBQUc7S0FDakIsRUFBRTtRQUNELElBQUksRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEdBQUc7S0FDbEIsRUFBRTtRQUNELElBQUksRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUM7S0FDZCxFQUFFLElBQUksS0FBSyxDQUFTLENBQUMsQ0FBQyxFQUFFLElBQUksS0FBSyxDQUFTLENBQUMsQ0FBQyxFQUFFLElBQUksS0FBSyxDQUFTLENBQUMsQ0FBQztDQUNwRSxDQUFDOzs7SUF2Q0Ysc0JBQTZDOztJQUU3QyxxQkFFRTs7SUFDRixzQkFFRTs7SUFDRixxQkFrQkU7O0lBQ0YsNEJBWUU7O0lBR0YsK0JBQXFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtQSUNJbnRlcmZhY2V9IGZyb20gXCIuL1BJQ0ludGVyZmFjZVwiO1xyXG5pbXBvcnQge1V0aWxTdHJCeXRlTW9kZX0gZnJvbSBcIi4vVXRpbFN0ckJ5dGVNb2RlXCI7XHJcbmltcG9ydCB7TlN0cmluZywgTk51bWJlcn0gZnJvbSBcIkBtYWdpYy14cGEvbXNjb3JlbGliXCI7XHJcblxyXG5jb25zdCBNQVhfR0VOR086IG51bWJlciA9IDU7XHJcbmNvbnN0IElEWF9VUFBFUkNBU0VfQUxQSEE6IG51bWJlciA9IDA7XHJcbmNvbnN0IElEWF9MT1dFUkNBU0VfQUxQSEE6IG51bWJlciA9IDE7XHJcbmNvbnN0IElEWF9LQU5KSTogbnVtYmVyID0gMjtcclxuY29uc3QgSURYX1lFQVI6IG51bWJlciA9IDA7XHJcbmNvbnN0IElEWF9NT05USDogbnVtYmVyID0gMTtcclxuY29uc3QgSURYX0RBWTogbnVtYmVyID0gMjtcclxuY29uc3QgSURYX0RPWTogbnVtYmVyID0gMztcclxuXHJcblxyXG5leHBvcnQgY2xhc3MgVXRpbERhdGVKcG4ge1xyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBKUE46IEphcGFuZXNlIGRhdGUgcGljdHVyZSBzdXBwb3J0XHJcbiAgLy8vICAgVXRpbGl0eSBDbGFzcyBmb3IgSmFwYW5lc2UgZGF0ZVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxhdXRob3I+ICBUb3NoaXJvIE5ha2F5b3NoaSAoTVNKKVxyXG4gIC8vLyA8L2F1dGhvcj5cclxuXHJcbiAgcHJpdmF0ZSBzdGF0aWMgX2luc3RhbmNlOiBVdGlsRGF0ZUpwbiA9IG51bGw7XHJcblxyXG4gIHByaXZhdGUgc3RhdGljIEp3ZWVrU3RyOiBzdHJpbmdbXSA9IFtcclxuICAgIFwiICAgXCIsIFwi5pel5puc5pelXCIsIFwi5pyI5puc5pelXCIsIFwi54Gr5puc5pelXCIsIFwi5rC05puc5pelXCIsIFwi5pyo5puc5pelXCIsIFwi6YeR5puc5pelXCIsIFwi5Zyf5puc5pelXCJcclxuICBdO1xyXG4gIHByaXZhdGUgc3RhdGljIEptb250aFN0cjogc3RyaW5nW10gPSBbXHJcbiAgICBcIlwiLCBcIiAx5pyIXCIsIFwiIDLmnIhcIiwgXCIgM+aciFwiLCBcIiA05pyIXCIsIFwiIDXmnIhcIiwgXCIgNuaciFwiLCBcIiA35pyIXCIsIFwiIDjmnIhcIiwgXCIgOeaciFwiLCBcIjEw5pyIXCIsIFwiMTHmnIhcIiwgXCIxMuaciFwiXHJcbiAgXTtcclxuICBwcml2YXRlIHN0YXRpYyBHZW5nb1N0cjogc3RyaW5nW11bXSA9IFtcclxuICAgIFtcclxuICAgICAgXCI/XCIsIFwiP1wiLCBcIj8/Pz9cIlxyXG4gICAgXSwgW1xyXG4gICAgICBcIk1cIiwgXCJtXCIsIFwi5piO5rK7XCJcclxuICAgIF0sIFtcclxuICAgICAgXCJUXCIsIFwidFwiLCBcIuWkp+ato1wiXHJcbiAgICBdLCBbXHJcbiAgICAgIFwiU1wiLCBcInNcIiwgXCLmmK3lkoxcIlxyXG4gICAgXSwgW1xyXG4gICAgICBcIkhcIiwgXCJoXCIsIFwi5bmz5oiQXCJcclxuICAgIF0sIFtcclxuICAgICAgXCI/XCIsIFwiP1wiLCBcIu+8n++8n1wiXHJcbiAgICBdLCBbXHJcbiAgICAgIFwiP1wiLCBcIj9cIiwgXCLvvJ/vvJ9cIlxyXG4gICAgXSwgW1xyXG4gICAgICBcIj9cIiwgXCI/XCIsIFwi77yf77yfXCJcclxuICAgIF1cclxuICBdO1xyXG4gIHByaXZhdGUgc3RhdGljIFN0YXJ0RGF5T2ZHZW5nbzogbnVtYmVyW11bXSA9IFtcclxuICAgIFtcclxuICAgICAgMSwgMSwgMSwgMVxyXG4gICAgXSwgW1xyXG4gICAgICAxODY4LCA5LCA4LCAyNTJcclxuICAgIF0sIFtcclxuICAgICAgMTkxMiwgNiwgMzAsIDIxMlxyXG4gICAgXSwgW1xyXG4gICAgICAxOTI2LCAxMiwgMjUsIDM1OVxyXG4gICAgXSwgW1xyXG4gICAgICAxOTg5LCAxLCA4LCA4XHJcbiAgICBdLCBuZXcgQXJyYXk8bnVtYmVyPig0KSwgbmV3IEFycmF5PG51bWJlcj4oNCksIG5ldyBBcnJheTxudW1iZXI+KDQpXHJcbiAgXTtcclxuXHJcbiAgLy8gLS0tLSBnZW5nbyAodGhlIG5hbWUgb2YgYW4gZXJhKSAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXHJcbiAgcHJpdmF0ZSBNYXhHZW5nbzogbnVtYmVyID0gTUFYX0dFTkdPO1xyXG5cclxuICBzdGF0aWMgZ2V0SW5zdGFuY2UoKTogVXRpbERhdGVKcG4ge1xyXG4gICAgaWYgKFV0aWxEYXRlSnBuLl9pbnN0YW5jZSA9PT0gbnVsbCkge1xyXG4gICAgICBVdGlsRGF0ZUpwbi5faW5zdGFuY2UgPSBuZXcgVXRpbERhdGVKcG4oKTtcclxuICAgIH1cclxuICAgIHJldHVybiBVdGlsRGF0ZUpwbi5faW5zdGFuY2U7XHJcbiAgfVxyXG5cclxuICBzdGF0aWMgZ2V0QXJyYXlEb3coKTogc3RyaW5nW10ge1xyXG4gICAgcmV0dXJuIFV0aWxEYXRlSnBuLkp3ZWVrU3RyO1xyXG4gIH1cclxuXHJcbiAgc3RhdGljIGdldFN0ckRvdyhpbnRJZHg6IG51bWJlcik6IHN0cmluZyB7XHJcbiAgICBsZXQgZmxhZzogYm9vbGVhbiA9IGludElkeCA8IDAgfHwgNyA8IGludElkeDtcclxuICAgIGlmIChmbGFnKSB7XHJcbiAgICAgIGludElkeCA9IDA7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gVXRpbERhdGVKcG4uSndlZWtTdHJbaW50SWR4XTtcclxuICB9XHJcblxyXG4gIHN0YXRpYyBjb252ZXJ0U3RyTW9udGgobW9udGg6IG51bWJlcik6IHN0cmluZyB7XHJcbiAgICBsZXQgZmxhZzogYm9vbGVhbiA9IG1vbnRoIDwgMCB8fCAxMiA8IG1vbnRoO1xyXG4gICAgaWYgKGZsYWcpIHtcclxuICAgICAgbW9udGggPSAwO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIFV0aWxEYXRlSnBuLkptb250aFN0clttb250aF07XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgQ29udmVydCBhIHllYXIgKEEuRC4pIGludG8gSmFwYW5lc2UgeWVhciBvZiBhbiBlcmFcclxuICAvLy8gICBUaGlzIG1ldGhvZCBpcyBtb2RlbGVkIGFmdGVyIFwiZGF0ZV9qcG5feWVhcl9vZnNcIiBmdW5jdGlvbiBpblxyXG4gIC8vLyAgIFwiXFxtZ2xvY2FsXFxqcG5cXGpwbmRhdGVfanBuLmNwcFwiLlxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJpbnRZZWFyOlwiPnllYXIgKEEuRC4pXHJcbiAgLy8vIDwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJpbnREb3k6XCI+RE9ZXHJcbiAgLy8vIDwvcGFyYW0+XHJcbiAgLy8vIDxyZXR1cm5zPiB5ZWFyIG9mIGFuIGVyYS5cclxuICAvLy8gICBpZiBlaXRoZXIgcGFyYW0gaXMgaW52YWxpZCwgaXQgcmV0dXJucyAwLlxyXG4gIC8vLyA8L3JldHVybnM+XHJcbiAgZGF0ZV9qcG5feWVhcl9vZnMoaW50WWVhcjogbnVtYmVyLCBpbnREb3k6IG51bWJlcik6IG51bWJlciB7XHJcbiAgICBsZXQgcmVzdWx0OiBudW1iZXI7XHJcbiAgICBpZiAoaW50WWVhciA8IDEgfHwgaW50RG95IDwgMSkge1xyXG4gICAgICByZXN1bHQgPSAwO1xyXG4gICAgfVxyXG4gICAgZWxzZSB7XHJcbiAgICAgIGxldCBudW06IG51bWJlciA9IHRoaXMuTWF4R2VuZ28gLSAxO1xyXG4gICAgICB3aGlsZSAoaW50WWVhciA8IFV0aWxEYXRlSnBuLlN0YXJ0RGF5T2ZHZW5nb1tudW1dWzBdKSB7XHJcbiAgICAgICAgbnVtID0gbnVtIC0gMTtcclxuICAgICAgfVxyXG4gICAgICBpZiAoaW50WWVhciA9PT0gVXRpbERhdGVKcG4uU3RhcnREYXlPZkdlbmdvW251bV1bMF0gJiYgaW50RG95IDwgVXRpbERhdGVKcG4uU3RhcnREYXlPZkdlbmdvW251bV1bM10pIHtcclxuICAgICAgICBudW0gPSBudW0gLSAxO1xyXG4gICAgICB9XHJcbiAgICAgIHJlc3VsdCA9IGludFllYXIgLSBVdGlsRGF0ZUpwbi5TdGFydERheU9mR2VuZ29bbnVtXVswXSArIDE7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gcmVzdWx0O1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIENvbnZlcnQgYSB5ZWFyIChBLkQuKSBpbnRvIGEgbmFtZSBvZiBhIEphcGFuZXNlIGVyYVxyXG4gIC8vLyAgIFRoaXMgbWV0aG9kIGlzIG1vZGVsZWQgYWZ0ZXIgXCJkYXRlX2pwbl95cl8yX2FcIiBmdW5jdGlvbiBpblxyXG4gIC8vLyAgIFwiXFxtZ2xvY2FsXFxqcG5cXGpwbmRhdGVfanBuLmNwcFwiLlxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJpbnRZZWFyOlwiPnllYXIgKEEuRC4pXHJcbiAgLy8vIDwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJpbnREb3k6XCI+RE9ZXHJcbiAgLy8vIDwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJpc0thbmppOlwiPnJldHVybiBhIGZ1bGwgbmFtZSAodHJ1ZSkgb3IgdGhlIGZpcnN0IGxldHRlciAoZmFsc2UpLlxyXG4gIC8vLyA8L3BhcmFtPlxyXG4gIC8vLyA8cmV0dXJucz4gbmFtZSBvZiBhbiBlcmFcclxuICAvLy8gICBpZiBlaXRoZXIgcGFyYW0gaXMgaW52YWxpZCwgaXQgcmV0dXJucyBcIj9cIi5cclxuICAvLy8gPC9yZXR1cm5zPlxyXG4gIGRhdGVfanBuX3lyXzJfYShpbnRZZWFyOiBudW1iZXIsIGludERveTogbnVtYmVyLCBpc0thbmppOiBib29sZWFuKTogc3RyaW5nIHtcclxuICAgIGxldCBudW06IG51bWJlcjtcclxuICAgIGlmIChpbnRZZWFyIDwgMSB8fCBpbnREb3kgPCAxKSB7XHJcbiAgICAgIG51bSA9IDA7XHJcbiAgICB9XHJcbiAgICBlbHNlIHtcclxuICAgICAgbnVtID0gdGhpcy5NYXhHZW5nbyAtIDE7XHJcbiAgICAgIHdoaWxlIChpbnRZZWFyIDwgVXRpbERhdGVKcG4uU3RhcnREYXlPZkdlbmdvW251bV1bMF0pIHtcclxuICAgICAgICBudW0gPSBudW0gLSAxO1xyXG4gICAgICB9XHJcbiAgICAgIGlmIChpbnRZZWFyID09PSBVdGlsRGF0ZUpwbi5TdGFydERheU9mR2VuZ29bbnVtXVswXSAmJiBpbnREb3kgPCBVdGlsRGF0ZUpwbi5TdGFydERheU9mR2VuZ29bbnVtXVszXSkge1xyXG4gICAgICAgIG51bSA9IG51bSAtIDE7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIGxldCByZXN1bHQ6IHN0cmluZztcclxuICAgIGlmIChpc0thbmppKSB7XHJcbiAgICAgIHJlc3VsdCA9IFV0aWxEYXRlSnBuLkdlbmdvU3RyW251bV1bMl07XHJcbiAgICB9XHJcbiAgICBlbHNlIHtcclxuICAgICAgcmVzdWx0ID0gVXRpbERhdGVKcG4uR2VuZ29TdHJbbnVtXVswXTtcclxuICAgIH1cclxuICAgIHJldHVybiByZXN1bHQ7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgR2V0IHRoZSBmaXJzdCB5ZWFyIChBLkQuKSBvZiBhIHNwZWNpZmllZCBKYXBhbmVzZSBlcmFcclxuICAvLy8gICBUaGlzIG1ldGhvZCBpcyBtb2RlbGVkIGFmdGVyIFwiZGF0ZV9qcG5feXJfNF9hXCIgZnVuY3Rpb24gaW5cclxuICAvLy8gICBcIlxcbWdsb2NhbFxcanBuXFxqcG5kYXRlX2pwbi5jcHBcIi5cclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwidWNwX3N0cjpcIj5uYW1lIG9mIGEgc3BlY2lmaWVkIEphcGFuZXNlIGVyYVxyXG4gIC8vLyA8L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwic19sZW46XCI+bGVuZ3RoICh0aGUgbnVtYmVyIG9mIGJ5dGVzKSBvZiB1Y3Bfc3RyXHJcbiAgLy8vIDwvcGFyYW0+XHJcbiAgLy8vIDxyZXR1cm5zPiB5ZWFyIChBLkQuKVxyXG4gIC8vLyA8L3JldHVybnM+XHJcbiAgcHJpdmF0ZSBkYXRlX2pwbl95cl80X2EodWNwX3N0cjogc3RyaW5nLCBzX2xlbjogbnVtYmVyKTogbnVtYmVyIHtcclxuICAgIGxldCBpOiBudW1iZXIgPSB0aGlzLk1heEdlbmdvIC0gMTtcclxuICAgIGlmIChzX2xlbiA+IDApIHtcclxuICAgICAgaWYgKHNfbGVuID4gMSkge1xyXG4gICAgICAgIHVjcF9zdHIgPSBVdGlsU3RyQnl0ZU1vZGUubGVmdEIodWNwX3N0ciwgc19sZW4pO1xyXG4gICAgICB9XHJcbiAgICAgIHdoaWxlIChpID4gMCkge1xyXG4gICAgICAgIGlmIChzX2xlbiA9PT0gMSkge1xyXG4gICAgICAgICAgaWYgKHVjcF9zdHIgPT09IFV0aWxEYXRlSnBuLkdlbmdvU3RyW2ldWzBdIHx8IHVjcF9zdHIgPT09IFV0aWxEYXRlSnBuLkdlbmdvU3RyW2ldWzFdKSB7XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgIGlmIChzX2xlbiA+IDEpIHtcclxuICAgICAgICAgICAgbGV0IHRleHQ6IHN0cmluZyA9IFV0aWxTdHJCeXRlTW9kZS5sZWZ0QihVdGlsRGF0ZUpwbi5HZW5nb1N0cltpXVsyXSwgc19sZW4pO1xyXG4gICAgICAgICAgICBpZiAodWNwX3N0ciA9PT0gdGV4dCkge1xyXG4gICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGkgPSBpIC0gMTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgbGV0IHJlc3VsdDogbnVtYmVyO1xyXG4gICAgaWYgKGkgPiAwKSB7XHJcbiAgICAgIHJlc3VsdCA9IFV0aWxEYXRlSnBuLlN0YXJ0RGF5T2ZHZW5nb1tpXVswXTtcclxuICAgIH1cclxuICAgIGVsc2Uge1xyXG4gICAgICBjb25zdCB0ZXh0OiBzdHJpbmcgPSB1Y3Bfc3RyLnN1YnN0cigwLCAxKTtcclxuICAgICAgaWYgKHRleHQgPT09IFwiIFwiIHx8IHRleHQgPT09IFwiP1wiKSB7XHJcbiAgICAgICAgcmVzdWx0ID0gMTtcclxuICAgICAgfVxyXG4gICAgICBlbHNlIHtcclxuICAgICAgICByZXN1bHQgPSAwO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gcmVzdWx0O1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIEdldCB0aGUgbmFtZSBvZiBhbiBlcmEgaW4gZGF0ZSBzdHJpbmdcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwic3RyRGF0ZTpcIj5zdHJpbmcgb2YgaW5wdXQgc3RyRGF0ZVxyXG4gIC8vLyA8L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwic3RyUGljdHVyZTpcIj5zdHJpbmcgb2YgcGljdHVyZVxyXG4gIC8vLyA8L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiaW50U3RhcnRQb3M6XCI+c3RhcnQgcG9zaXRpb24gdG8gc2VhcmNoXHJcbiAgLy8vIDwvcGFyYW0+XHJcbiAgLy8vIDxyZXR1cm5zPiBuYW1lIG9mIGFuIGVyYVxyXG4gIC8vLyA8L3JldHVybnM+XHJcbiAgcHJpdmF0ZSBzdGF0aWMgZ2V0RXJhTmFtZVN0ckluRGF0ZShzdHJEYXRlOiBzdHJpbmcsIHN0clBpY3R1cmU6IHN0cmluZywgaW50U3RhcnRQb3M6IG51bWJlcik6IHN0cmluZyB7XHJcbiAgICBsZXQgcmVzdWx0OiBzdHJpbmcgPSBudWxsO1xyXG4gICAgbGV0IGludFBpY0lkeE9mczogbnVtYmVyID0gMDtcclxuICAgIGxldCBpOiBudW1iZXIgPSBpbnRTdGFydFBvcztcclxuICAgIHdoaWxlIChpICsgaW50UGljSWR4T2ZzIDwgc3RyUGljdHVyZS5sZW5ndGgpIHtcclxuICAgICAgbGV0IGludExldHRlcnM6IG51bWJlcjtcclxuICAgICAgaWYgKHN0clBpY3R1cmUuY2hhckNvZGVBdChpICsgaW50UGljSWR4T2ZzKSA9PT0gUElDSW50ZXJmYWNlLlBJQ19KWTEpIHtcclxuICAgICAgICBpbnRMZXR0ZXJzID0gMTtcclxuICAgICAgfVxyXG4gICAgICBlbHNlIHtcclxuICAgICAgICBpZiAoc3RyUGljdHVyZS5jaGFyQ29kZUF0KGkgKyBpbnRQaWNJZHhPZnMpID09PSBQSUNJbnRlcmZhY2UuUElDX0pZMikge1xyXG4gICAgICAgICAgaW50TGV0dGVycyA9IDE7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgaWYgKHN0clBpY3R1cmUuY2hhckNvZGVBdChpICsgaW50UGljSWR4T2ZzKSA9PT0gUElDSW50ZXJmYWNlLlBJQ19KWTQpIHtcclxuICAgICAgICAgICAgaW50TGV0dGVycyA9IDI7XHJcbiAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAvLyBJZiBcInN0ckRhdGVcIiBjb250YWlucyBEQkNTLCB0aGUgcG9zaXRpb24gb2YgXCJzdHJQaWN0dXJlXCIgaGFzIHRvIHNraXAgbmV4dCBpbmRleC5cclxuICAgICAgICAgICAgaWYgKGkgPCBzdHJEYXRlLmxlbmd0aCkge1xyXG4gICAgICAgICAgICAgIGlmICghVXRpbFN0ckJ5dGVNb2RlLmlzSGFsZldpZHRoKHN0ckRhdGVbaV0pICYmIFV0aWxTdHJCeXRlTW9kZS5pc0hhbGZXaWR0aChzdHJQaWN0dXJlW2kgKyBpbnRQaWNJZHhPZnNdKSkge1xyXG4gICAgICAgICAgICAgICAgaW50UGljSWR4T2ZzID0gaW50UGljSWR4T2ZzICsgMTtcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaSA9IGkgKyAxO1xyXG4gICAgICAgICAgICBjb250aW51ZTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgICAgcmVzdWx0ID0gc3RyRGF0ZS5zdWJzdHIoaSwgaW50TGV0dGVycyk7XHJcbiAgICAgIGJyZWFrOyAvLyBleGl0IGxvb3BcclxuICAgIH1cclxuICAgIHJldHVybiByZXN1bHQ7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgR2V0IHRoZSBsZW5ndGggb2YgdGhlIG5hbWUgb2YgYW4gZXJhIGluIHBpY3R1cmVcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwic3RyUGljdHVyZVwiPnN0cmluZyBvZiBwaWN0dXJlXHJcbiAgLy8vIDwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJpbnRTdGFydFBvc1wiPnN0YXJ0IHBvc2l0aW9uIHRvIHNlYXJjaFxyXG4gIC8vLyA8L3BhcmFtPlxyXG4gIC8vLyA8cmV0dXJucz4gbGVuZ3RoIG9mIHRoZSBuYW1lICh0aGUgbnVtYmVyIG9mIGJ5dGVzKVxyXG4gIC8vLyA8L3JldHVybnM+XHJcbiAgcHJpdmF0ZSBzdGF0aWMgZ2V0RXJhTmFtZUxlbkluUGljdHVyZShzdHJQaWN0dXJlOiBzdHJpbmcsIGludFN0YXJ0UG9zOiBudW1iZXIpOiBudW1iZXIge1xyXG4gICAgbGV0IGludExldHRlcnM6IG51bWJlciA9IDA7XHJcbiAgICBmb3IgKGxldCBpOiBudW1iZXIgPSBpbnRTdGFydFBvczsgaSA8IHN0clBpY3R1cmUubGVuZ3RoOyBpID0gaSArIDEpIHtcclxuICAgICAgaWYgKHN0clBpY3R1cmUuY2hhckNvZGVBdChpKSA9PT0gUElDSW50ZXJmYWNlLlBJQ19KWTEpIHtcclxuICAgICAgICBpbnRMZXR0ZXJzID0gMTtcclxuICAgICAgfVxyXG4gICAgICBlbHNlIHtcclxuICAgICAgICBpZiAoc3RyUGljdHVyZS5jaGFyQ29kZUF0KGkpID09PSBQSUNJbnRlcmZhY2UuUElDX0pZMikge1xyXG4gICAgICAgICAgaW50TGV0dGVycyA9IDI7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgaWYgKHN0clBpY3R1cmUuY2hhckNvZGVBdChpKSA9PT0gUElDSW50ZXJmYWNlLlBJQ19KWTQpIHtcclxuICAgICAgICAgICAgaW50TGV0dGVycyA9IDQ7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICAgIGlmIChpbnRMZXR0ZXJzID4gMCkge1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gaW50TGV0dGVycztcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBHZXQgdGhlIHN0YXJ0IHllYXIgb2YgYW4gZXJhIGluIHBpY3R1cmVcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwic3RyRGF0ZTpcIj5zdHJpbmcgb2YgaW5wdXQgc3RyRGF0ZVxyXG4gIC8vLyA8L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwic3RyUGljdHVyZTpcIj5zdHJpbmcgb2YgcGljdHVyZVxyXG4gIC8vLyA8L3BhcmFtPlxyXG4gIC8vLyA8cmV0dXJucz4gc3RhcnQgeWVhciBvZiB0aGUgZXJhXHJcbiAgLy8vIDwvcmV0dXJucz5cclxuICBnZXRTdGFydFllYXJPZkVyYShzdHJEYXRlOiBzdHJpbmcsIHN0clBpY3R1cmU6IHN0cmluZyk6IG51bWJlciB7XHJcbiAgICBsZXQgZXJhTmFtZVN0ckluRGF0ZTogc3RyaW5nID0gVXRpbERhdGVKcG4uZ2V0RXJhTmFtZVN0ckluRGF0ZShzdHJEYXRlLCBzdHJQaWN0dXJlLCAwKTtcclxuICAgIGxldCByZXN1bHQ6IG51bWJlcjtcclxuICAgIGlmIChlcmFOYW1lU3RySW5EYXRlID09PSBudWxsKSB7XHJcbiAgICAgIHJlc3VsdCA9IDA7XHJcbiAgICB9XHJcbiAgICBlbHNlIHtcclxuICAgICAgbGV0IGVyYU5hbWVMZW5JblBpY3R1cmU6IG51bWJlciA9IFV0aWxEYXRlSnBuLmdldEVyYU5hbWVMZW5JblBpY3R1cmUoc3RyUGljdHVyZSwgMCk7XHJcbiAgICAgIGlmIChlcmFOYW1lTGVuSW5QaWN0dXJlID09PSAwKSB7XHJcbiAgICAgICAgcmVzdWx0ID0gMDtcclxuICAgICAgfVxyXG4gICAgICBlbHNlIHtcclxuICAgICAgICBsZXQgaW50U3RhcnRZZWFyT2ZFcmE6IG51bWJlciA9IHRoaXMuZGF0ZV9qcG5feXJfNF9hKGVyYU5hbWVTdHJJbkRhdGUsIGVyYU5hbWVMZW5JblBpY3R1cmUpO1xyXG4gICAgICAgIHJlc3VsdCA9IGludFN0YXJ0WWVhck9mRXJhO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gcmVzdWx0O1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PiBBZGQgZXh0cmEgR2VuZ28gZGF0YSBpbnRvIHRoZSBHZW5nbyB0YWJsZXM8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwic3RyRXh0cmFHZW5nbzpcIj5cclxuICAvLy8gPC9wYXJhbT5cclxuICAvLy8gPHJldHVybnM+XHJcbiAgLy8vIDwvcmV0dXJucz5cclxuICBhZGRFeHRyYUdlbmdvKHN0ckV4dHJhR2VuZ286IHN0cmluZyk6IHZvaWQge1xyXG4gICAgLy8gZS5nLiBzdHJFeHRyYUdlbmdvID0gXCIyMDEyLzA0LzAxLDA5MixBYUFCQ0Q7MjAxMy8wNC8wMSwwOTEsV3dXWFlaO1wiXHJcbiAgICBsZXQgYXJyYXk6IHN0cmluZ1tdID0gc3RyRXh0cmFHZW5nby5zcGxpdCgnOycpO1xyXG4gICAgZm9yIChsZXQgaTogbnVtYmVyID0gMDsgaSA8PSBhcnJheS5sZW5ndGg7IGkgPSBpICsgMSkge1xyXG4gICAgICBpZiAoYXJyYXlbaV0ubGVuZ3RoID4gMCkge1xyXG4gICAgICAgIGxldCBhcnJheTI6IHN0cmluZ1tdID0gYXJyYXlbaV0uc3BsaXQoJywnKTtcclxuICAgICAgICBpZiAoYXJyYXkyLmxlbmd0aCA9PT0gMiAmJiBhcnJheTJbMF0ubGVuZ3RoID4gMCAmJiBhcnJheTJbMV0ubGVuZ3RoID4gMCAmJiBhcnJheTJbMl0ubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgbGV0IGFycmF5Mzogc3RyaW5nW10gPSBhcnJheTJbMF0uc3BsaXQoJy8nKTtcclxuICAgICAgICAgIGlmIChhcnJheTMubGVuZ3RoID09PSAyICYmIGFycmF5M1swXS5sZW5ndGggPiAwICYmIGFycmF5M1sxXS5sZW5ndGggPiAwICYmIGFycmF5M1syXS5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgIFV0aWxEYXRlSnBuLkdlbmdvU3RyWzUgKyBpXVswXSA9IGFycmF5MlsyXS5zdWJzdHIoMCwgMSk7IC8vIHN5bWJvbCBuYW1lICh1cHBlciBjYXNlKTogQVxyXG4gICAgICAgICAgICBVdGlsRGF0ZUpwbi5HZW5nb1N0cls1ICsgaV1bMV0gPSBhcnJheTJbMl0uc3Vic3RyKDEsIDEpOyAvLyBzeW1ib2wgbmFtZSAobG93ZXIgY2FzZSk6IGFcclxuICAgICAgICAgICAgVXRpbERhdGVKcG4uR2VuZ29TdHJbNSArIGldWzJdID0gYXJyYXkyWzJdLnN1YnN0cigyKTsgICAgLy8gZ2VuZ28gbmFtZTogQUJDRFxyXG5cclxuICAgICAgICAgICAgVXRpbERhdGVKcG4uU3RhcnREYXlPZkdlbmdvWzUgKyBpXVswXSA9IE5OdW1iZXIuUGFyc2UoYXJyYXkzWzBdKTsgICAgLy8gc3RhcnQgeWVhcjogMjAxMlxyXG4gICAgICAgICAgICBVdGlsRGF0ZUpwbi5TdGFydERheU9mR2VuZ29bNSArIGldWzFdID0gTk51bWJlci5QYXJzZShhcnJheTNbMV0pOyAgICAvLyBzdGFydCBtb250aDogNFxyXG4gICAgICAgICAgICBVdGlsRGF0ZUpwbi5TdGFydERheU9mR2VuZ29bNSArIGldWzJdID0gTk51bWJlci5QYXJzZShhcnJheTNbMl0pOyAgICAvLyBzdGFydCBkYXk6IDFcclxuICAgICAgICAgICAgVXRpbERhdGVKcG4uU3RhcnREYXlPZkdlbmdvWzUgKyBpXVszXSA9IE5OdW1iZXIuUGFyc2UoYXJyYXkyWzFdKTsgICAgLy8gZGF5cyBzaW5jZSBKYW51YXJ5IDE6IDkyXHJcbiAgICAgICAgICAgIHRoaXMuTWF4R2VuZ28gPSB0aGlzLk1heEdlbmdvICsgMTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcbn1cclxuIl19