difenduandada
2024-12-31 34abe6963b344c882358274957f4b992456fee40
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
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
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
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
 
                (function() {
                    var nodeEnv = typeof require !== 'undefined' && typeof process !== 'undefined';
                    var __module = nodeEnv ? module : {exports:{}};
                    var __filename = 'preview-scripts/assets/Scripts/util/pathtool.js';
                    var __require = nodeEnv ? function (request) {
                        return cc.require(request);
                    } : function (request) {
                        return __quick_compile_project__.require(request, __filename);
                    };
                    function __define (exports, require, module) {
                        if (!nodeEnv) {__quick_compile_project__.registerModule(__filename, module);}"use strict";
cc._RF.push(module, '5c24ew9BclME7NqSzhzS5RV', 'pathtool');
// Scripts/util/pathtool.js
 
"use strict";
 
// --------------------------------------------------------------------
// @author: shiraho@syg.com(必填, 创建模块的人员)
// @description:
//      获取资源路径的接口
// <br/>Create: new Date().toISOString()
// --------------------------------------------------------------------
window.PathTool = {
  getPrefabPath: function getPrefabPath(module_name, file_name) {
    return "prefab/" + module_name + "/" + file_name + ".prefab"; // + ".prefab";
  },
  // 获取动态资源
  getIconPath: function getIconPath(module_name, file_name, type) {
    var suffix = "png";
    if (type) suffix = type;
    return "res/" + module_name + "/" + file_name + "." + suffix;
  },
  // 获取动态资源
  getUIIconPath: function getUIIconPath(module_name, file_name, type) {
    var suffix = "png";
    if (type) suffix = type;
    return "ui_res/" + module_name + "/" + file_name + "." + suffix;
  },
  // 已经废弃
  getResFrame: function getResFrame(packageName, resName) {
    // cc.error(null, "不再使用加载合图的方式加载资源 faild--->" + resName);
    // return
    resName = resName || packageName;
    return "res/" + packageName + "/" + resName + ".plist";
  },
  // 已经废弃
  getPlistPath: function getPlistPath(module_name, file_name) {
    // cc.error(null, "不再使用加载合图的方式加载资源 faild--->" + file_name);
    // return
    return "res/" + module_name + "/" + file_name + ".plist";
  },
  getHeadRes: function getHeadRes(res_id) {
    return "res/headicon/" + res_id + ".png";
  },
  getHeadcircle: function getHeadcircle(res_id) {
    return "res/headcircle/txt_cn_headcircle_" + res_id + ".png";
  },
  getHonorRes: function getHonorRes(res_id) {
    return "res/honor/txt_cn_honor_" + res_id + ".png";
  },
  getWelfareBannerRes: function getWelfareBannerRes(res_id) {
    return "res/welfare/welfare_banner/" + res_id + ".png";
  },
  getBigBuffRes: function getBigBuffRes(res_id) {
    return "res/bigbufficon/" + res_id + ".png";
  },
  // COMMON   = "common",
  // SCENE    = "scene",
  // BATTLE   = "battle",
  // DUBBING  = "dubbing",
  // Recruit  = "recruit",
  // Drama    = "drama",
  getSoundRes: function getSoundRes(res_type, res_name) {
    if (!res_type || !res_name) return; // return "sound/common/" + res_id + ".mp3";
    // var res_path = null;
 
    return cc.js.formatStr("sound/%s/%s.mp3", res_type, res_name);
  },
  // 获取大图 
  getBigBg: function getBigBg(res_id, bgType, module_name) {
    if (module_name) {
      module_name += "/";
    } else {
      module_name = "";
    }
 
    return "ui_res/bigbg/" + module_name + res_id + "." + (bgType || "png");
  },
  getCommonIcomPath: function getCommonIcomPath(icon_name) {
    return "ui_res/common/" + icon_name + ".png";
  },
  // 获取物品图标
  getItemRes: function getItemRes(res_id) {
    return "res/item/" + res_id + ".png";
  },
  // 获取单战斗场景的资源
  getBattleSingleBg: function getBattleSingleBg(res_id) {
    return "ui_res/bigbg/battle_bg/" + res_id + "/b_bg.jpg";
  },
  // 用于从cdn下载战斗资源的接口
  getBattleSceneRes: function getBattleSceneRes(resName, is_jpg) {
    if (is_jpg == true) {
      return "ui_res/bigbg/battle_bg/" + resName + ".jpg";
    } else {
      return "ui_res/bigbg/battle_bg/" + resName + ".png";
    }
  },
  // 获取buff资源路径
  getBuffRes: function getBuffRes(res_id) {
    return "res/bufficon/" + res_id + ".png";
  },
  //获取游戏图标的接口
  getFunctionRes: function getFunctionRes(res_id) {
    return "res/functionicon/" + res_id + ".png";
  },
  // 获取剧情副本的战斗背景
  getBattleDrameBg: function getBattleDrameBg(res_id) {
    var bg_path = "ui_res/bigbg/battle_bg/" + res_id;
    return {
      s: bg_path + "/map_bg.png",
      f: bg_path + "/m_bg.png"
    };
  },
  getActivityBig: function getActivityBig(res_id) {
    return "res/activity/activity_big/" + res_id + ".png";
  },
 
  /**
   * 获取spine路径
   */
  getSpinePath: function getSpinePath(res_id, res_name) {
    if (res_name == null) {
      res_name = PlayerAction.action;
    }
 
    return "spine/" + res_id + "/" + res_name + ".atlas";
  },
  // 获取战斗中的阵法图标
  getBattleFormIcon: function getBattleFormIcon(res_id) {
    return "res/battleformicon/battle_form_icon_" + res_id + ".png";
  },
  // 获取战斗中的阵营图标
  getBattleCampIcon: function getBattleCampIcon(res_id) {
    return "res/battlecamp/battlecamp_" + res_id + ".png";
  },
  // 获取战斗中的阵营图标
  getBattleCampIconByType: function getBattleCampIconByType(camp_type) {
    if (camp_type == null) {
      camp_type = 1;
    }
 
    var HeroConst = require("hero_const");
 
    if (camp_type == HeroConst.CampType.eWater) {
      return "res/battlecamp/battlecamp_1001.png";
    } else if (camp_type == HeroConst.CampType.eFire) {
      return "res/battlecamp/battlecamp_1002.png";
    } else if (camp_type == HeroConst.CampType.eWind) {
      return "res/battlecamp/battlecamp_1003.png";
    } else if (camp_type == HeroConst.CampType.eLight) {
      return "res/battlecamp/battlecamp_1004.png";
    } else if (camp_type == HeroConst.CampType.eDark) {
      return "res/battlecamp/battlecamp_1005.png";
    } else {
      return "res/battlecamp/battlecamp_1000.png";
    }
  },
  // 获取品质框背景(圆形的)
  getRoundQualityBg: function getRoundQualityBg(quality) {
    var quality = quality || 1;
 
    if (quality > 5) {
      quality = 5;
    }
 
    quality = 2000 + quality;
    var res_id = "mainui_" + quality;
    return PathTool.getUIIconPath("mainui", res_id);
  },
  //获取配置表中的effect资源id吧
  getEffectRes: function getEffectRes(id) {
    return gdata("effect_data", "data_effect_info", [id]) || "E88888";
  },
  // 根据物品品质色获取指定的图集ia
  getItemQualityBG: function getItemQualityBG(quality) {
    if (quality == null) {
      quality = 0;
    } else if (quality > 5) {
      quality = 5;
    }
 
    if (quality == 0) {
      return "common_1005";
    } else if (quality == 1) {
      return "common_1006";
    } else if (quality == 2) {
      return "common_1007";
    } else if (quality == 3) {
      return "common_1008";
    } else if (quality == 4) {
      return "common_1009";
    } else {
      return "common_1010";
    }
  },
  // 获取阵营资源
  getHeroCampRes: function getHeroCampRes(camp) {
    if (camp == null) {
      camp = 1;
    } else if (camp > 6) {
      camp = 1;
    }
 
    if (camp == 1) {
      // 水
      return "common_90067";
    } else if (camp == 2) {
      // 火
      return "common_90068";
    } else if (camp == 3) {
      // 风
      return "common_90069";
    } else if (camp == 4) {
      // 光
      return "common_90070";
    } else if (camp == 5) {
      // 暗
      return "common_90071";
    } else if (camp == 6) {
      //光和暗
      return "common_90079";
    }
  },
  // 获取属性图标
  getAttrIconByStr: function getAttrIconByStr(str) {
    if (str == "atk" || str == "atk_per") {
      return "common_90021";
    } else if (str == "hp" || str == "hp_max" || str == "hp_max_per") {
      return "common_90022";
    } else if (str == "def" || str == "def_per") {
      return "common_90023";
    } else if (str == "speed") {
      return "common_90038";
    } else if (str == "crit_rate") {
      return "common_90043";
    } else if (str == "crit_ratio") {
      return "common_90039";
    } else if (str == "hit_magic") {
      return "common_90040";
    } else if (str == "dodge_magic") {
      return "common_90037";
    } else if (str == "tenacity") {
      return "common_90021_1";
    } else if (str == "hit_rate") {
      return "common_90021_2";
    } else if (str == "res") {
      return "common_90021_3";
    } else if (str == "dodge_rate") {
      return "common_90021_4";
    } else if (str == "cure") {
      return "common_90021_5";
    } else if (str == "be_cure") {
      return "common_90021_6";
    } else if (str == "dam") {
      return "common_90021_7";
    } else {
      return "common_90037";
    }
  },
  // 获取阵营图标
  getHeroCampTypeIcon: function getHeroCampTypeIcon(camp_type) {
    if (camp_type == null) {
      camp_type = 1;
    }
 
    var HeroConst = require("hero_const");
 
    if (camp_type == HeroConst.CampType.eWater) {
      return "common_90067";
    } else if (camp_type == HeroConst.CampType.eFire) {
      return "common_90068";
    } else if (camp_type == HeroConst.CampType.eWind) {
      return "common_90069";
    } else if (camp_type == HeroConst.CampType.eLight) {
      return "common_90070";
    } else if (camp_type == HeroConst.CampType.eLingtDark) {
      return "common_90079";
    } else {
      return "common_90071";
    }
  },
  //这类单位是没有show动作的,所以要特殊处理
  specialBSModel: function specialBSModel(id) {
    return id == 37300 || id == 37301 || id == 37302;
  },
  //获取伙伴类型的,坦克法师这些
  getPartnerTypeIcon: function getPartnerTypeIcon(_type) {
    _type = _type || 1;
 
    var _index = 45 + _type;
 
    return this.getCommonIcomPath("common_900" + _index);
  },
  //获取伙伴半身像资源
  getPartnerBustRes: function getPartnerBustRes(bust_id) {
    bust_id = bust_id || 10000;
    return this.getIconPath("partner", bust_id);
  },
  getLogoRes: function getLogoRes() {
    // var logo_res = cc.js.formatStr("ui_res/login/%s/txt_cn_logo.png", "app")
    return "ui_res/login/txt_cn_logo.png";
  },
  //获取选中背景,通用
  getSelectBg: function getSelectBg() {
    return this.getUIIconPath("common", "common_90019");
  }
};
module.exports = PathTool;
 
cc._RF.pop();
                    }
                    if (nodeEnv) {
                        __define(__module.exports, __require, __module);
                    }
                    else {
                        __quick_compile_project__.registerModuleFunc(__filename, function () {
                            __define(__module.exports, __require, __module);
                        });
                    }
                })();
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImFzc2V0c1xcU2NyaXB0c1xcdXRpbFxccGF0aHRvb2wuanMiXSwibmFtZXMiOlsid2luZG93IiwiUGF0aFRvb2wiLCJnZXRQcmVmYWJQYXRoIiwibW9kdWxlX25hbWUiLCJmaWxlX25hbWUiLCJnZXRJY29uUGF0aCIsInR5cGUiLCJzdWZmaXgiLCJnZXRVSUljb25QYXRoIiwiZ2V0UmVzRnJhbWUiLCJwYWNrYWdlTmFtZSIsInJlc05hbWUiLCJnZXRQbGlzdFBhdGgiLCJnZXRIZWFkUmVzIiwicmVzX2lkIiwiZ2V0SGVhZGNpcmNsZSIsImdldEhvbm9yUmVzIiwiZ2V0V2VsZmFyZUJhbm5lclJlcyIsImdldEJpZ0J1ZmZSZXMiLCJnZXRTb3VuZFJlcyIsInJlc190eXBlIiwicmVzX25hbWUiLCJjYyIsImpzIiwiZm9ybWF0U3RyIiwiZ2V0QmlnQmciLCJiZ1R5cGUiLCJnZXRDb21tb25JY29tUGF0aCIsImljb25fbmFtZSIsImdldEl0ZW1SZXMiLCJnZXRCYXR0bGVTaW5nbGVCZyIsImdldEJhdHRsZVNjZW5lUmVzIiwiaXNfanBnIiwiZ2V0QnVmZlJlcyIsImdldEZ1bmN0aW9uUmVzIiwiZ2V0QmF0dGxlRHJhbWVCZyIsImJnX3BhdGgiLCJzIiwiZiIsImdldEFjdGl2aXR5QmlnIiwiZ2V0U3BpbmVQYXRoIiwiUGxheWVyQWN0aW9uIiwiYWN0aW9uIiwiZ2V0QmF0dGxlRm9ybUljb24iLCJnZXRCYXR0bGVDYW1wSWNvbiIsImdldEJhdHRsZUNhbXBJY29uQnlUeXBlIiwiY2FtcF90eXBlIiwiSGVyb0NvbnN0IiwicmVxdWlyZSIsIkNhbXBUeXBlIiwiZVdhdGVyIiwiZUZpcmUiLCJlV2luZCIsImVMaWdodCIsImVEYXJrIiwiZ2V0Um91bmRRdWFsaXR5QmciLCJxdWFsaXR5IiwiZ2V0RWZmZWN0UmVzIiwiaWQiLCJnZGF0YSIsImdldEl0ZW1RdWFsaXR5QkciLCJnZXRIZXJvQ2FtcFJlcyIsImNhbXAiLCJnZXRBdHRySWNvbkJ5U3RyIiwic3RyIiwiZ2V0SGVyb0NhbXBUeXBlSWNvbiIsImVMaW5ndERhcmsiLCJzcGVjaWFsQlNNb2RlbCIsImdldFBhcnRuZXJUeXBlSWNvbiIsIl90eXBlIiwiX2luZGV4IiwiZ2V0UGFydG5lckJ1c3RSZXMiLCJidXN0X2lkIiwiZ2V0TG9nb1JlcyIsImdldFNlbGVjdEJnIiwibW9kdWxlIiwiZXhwb3J0cyJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQUEsTUFBTSxDQUFDQyxRQUFQLEdBQWtCO0FBQ2RDLEVBQUFBLGFBQWEsRUFBRSx1QkFBVUMsV0FBVixFQUF1QkMsU0FBdkIsRUFBa0M7QUFDN0MsV0FBTyxZQUFZRCxXQUFaLEdBQTBCLEdBQTFCLEdBQWdDQyxTQUFoQyxHQUE0QyxTQUFuRCxDQUQ2QyxDQUU3QztBQUNILEdBSmE7QUFNZDtBQUNBQyxFQUFBQSxXQUFXLEVBQUUscUJBQVVGLFdBQVYsRUFBdUJDLFNBQXZCLEVBQWtDRSxJQUFsQyxFQUF3QztBQUNqRCxRQUFJQyxNQUFNLEdBQUcsS0FBYjtBQUNBLFFBQUlELElBQUosRUFBVUMsTUFBTSxHQUFHRCxJQUFUO0FBQ1YsV0FBTyxTQUFTSCxXQUFULEdBQXVCLEdBQXZCLEdBQTZCQyxTQUE3QixHQUF5QyxHQUF6QyxHQUErQ0csTUFBdEQ7QUFDSCxHQVhhO0FBYWQ7QUFDQUMsRUFBQUEsYUFBYSxFQUFFLHVCQUFVTCxXQUFWLEVBQXVCQyxTQUF2QixFQUFrQ0UsSUFBbEMsRUFBd0M7QUFDbkQsUUFBSUMsTUFBTSxHQUFHLEtBQWI7QUFDQSxRQUFJRCxJQUFKLEVBQVVDLE1BQU0sR0FBR0QsSUFBVDtBQUNWLFdBQU8sWUFBWUgsV0FBWixHQUEwQixHQUExQixHQUFnQ0MsU0FBaEMsR0FBNEMsR0FBNUMsR0FBa0RHLE1BQXpEO0FBQ0gsR0FsQmE7QUFvQmQ7QUFDQUUsRUFBQUEsV0FBVyxFQUFFLHFCQUFVQyxXQUFWLEVBQXVCQyxPQUF2QixFQUFnQztBQUN6QztBQUNBO0FBQ0FBLElBQUFB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RCxhQUFPLGNBQVA7QUFDSDtBQUNKLEdBOVFhO0FBZ1JkO0FBQ0FDLEVBQUFBLGNBQWMsRUFBRSx3QkFBVVQsRUFBVixFQUFjO0FBQzFCLFdBQU9BLEVBQUUsSUFBSSxLQUFOLElBQWVBLEVBQUUsSUFBSSxLQUFyQixJQUE4QkEsRUFBRSxJQUFJLEtBQTNDO0FBQ0gsR0FuUmE7QUFxUmQ7QUFDQVUsRUFBQUEsa0JBQWtCLEVBQUUsNEJBQVVDLEtBQVYsRUFBaUI7QUFDakNBLElBQUFBLEtBQUssR0FBR0EsS0FBSyxJQUFJLENBQWpCOztBQUNBLFFBQUlDLE1BQU0sR0FBRyxLQUFLRCxLQUFsQjs7QUFDQSxXQUFPLEtBQUsxQyxpQkFBTCxDQUF1QixlQUFlMkMsTUFBdEMsQ0FBUDtBQUNILEdBMVJhO0FBNFJkO0FBQ0FDLEVBQUFBLGlCQUFpQixFQUFDLDJCQUFTQyxPQUFULEVBQWlCO0FBQy9CQSxJQUFBQSxPQUFPLEdBQUdBLE9BQU8sSUFBSSxLQUFyQjtBQUNBLFdBQU8sS0FBS25FLFdBQUwsQ0FBaUIsU0FBakIsRUFBMkJtRSxPQUEzQixDQUFQO0FBQ0gsR0FoU2E7QUFrU2RDLEVBQUFBLFVBQVUsRUFBQyxzQkFBVTtBQUNqQjtBQUNBLFdBQU8sOEJBQVA7QUFDSCxHQXJTYTtBQXVTZDtBQUNBQyxFQUFBQSxXQXhTYyx5QkF3U0Q7QUFDVCxXQUFPLEtBQUtsRSxhQUFMLENBQW1CLFFBQW5CLEVBQTZCLGNBQTdCLENBQVA7QUFDSDtBQTFTYSxDQUFsQjtBQTZTQW1FLE1BQU0sQ0FBQ0MsT0FBUCxHQUFpQjNFLFFBQWpCIiwic291cmNlUm9vdCI6Ii8iLCJzb3VyY2VzQ29udGVudCI6WyIvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gQGF1dGhvcjogc2hpcmFob0BzeWcuY29tKOW/heWhqywg5Yib5bu65qih5Z2X55qE5Lq65ZGYKVxuLy8gQGRlc2NyaXB0aW9uOlxuLy8gICAgICDojrflj5botYTmupDot6/lvoTnmoTmjqXlj6Ncbi8vIDxici8+Q3JlYXRlOiBuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKClcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbndpbmRvdy5QYXRoVG9vbCA9IHtcbiAgICBnZXRQcmVmYWJQYXRoOiBmdW5jdGlvbiAobW9kdWxlX25hbWUsIGZpbGVfbmFtZSkge1xuICAgICAgICByZXR1cm4gXCJwcmVmYWIvXCIgKyBtb2R1bGVfbmFtZSArIFwiL1wiICsgZmlsZV9uYW1lICsgXCIucHJlZmFiXCI7XG4gICAgICAgIC8vICsgXCIucHJlZmFiXCI7XG4gICAgfSxcblxuICAgIC8vIOiOt+WPluWKqOaAgei1hOa6kFxuICAgIGdldEljb25QYXRoOiBmdW5jdGlvbiAobW9kdWxlX25hbWUsIGZpbGVfbmFtZSwgdHlwZSkge1xuICAgICAgICB2YXIgc3VmZml4ID0gXCJwbmdcIlxuICAgICAgICBpZiAodHlwZSkgc3VmZml4ID0gdHlwZVxuICAgICAgICByZXR1cm4gXCJyZXMvXCIgKyBtb2R1bGVfbmFtZSArIFwiL1wiICsgZmlsZV9uYW1lICsgXCIuXCIgKyBzdWZmaXg7XG4gICAgfSxcblxuICAgIC8vIOiOt+WPluWKqOaAgei1hOa6kFxuICAgIGdldFVJSWNvblBhdGg6IGZ1bmN0aW9uIChtb2R1bGVfbmFtZSwgZmlsZV9uYW1lLCB0eXBlKSB7XG4gICAgICAgIHZhciBzdWZmaXggPSBcInBuZ1wiXG4gICAgICAgIGlmICh0eXBlKSBzdWZmaXggPSB0eXBlXG4gICAgICAgIHJldHVybiBcInVpX3Jlcy9cIiArIG1vZHVsZV9uYW1lICsgXCIvXCIgKyBmaWxlX25hbWUgKyBcIi5cIiArIHN1ZmZpeDtcbiAgICB9LFxuXG4gICAgLy8g5bey57uP5bqf5byDXG4gICAgZ2V0UmVzRnJhbWU6IGZ1bmN0aW9uIChwYWNrYWdlTmFtZSwgcmVzTmFtZSkge1xuICAgICAgICAvLyBjYy5lcnJvcihudWxsLCBcIuS4jeWGjeS9v+eUqOWKoOi9veWQiOWbvueahOaWueW8j+WKoOi9vei1hOa6kCBmYWlsZC0tLT5cIiArIHJlc05hbWUpO1xuICAgICAgICAvLyByZXR1cm5cbiAgICAgICAgcmVzTmFtZSA9IHJlc05hbWUgfHwgcGFja2FnZU5hbWU7XG4gICAgICAgIHJldHVybiBcInJlcy9cIiArIHBhY2thZ2VOYW1lICsgXCIvXCIgKyByZXNOYW1lICsgXCIucGxpc3RcIjtcbiAgICB9LFxuXG4gICAgLy8g5bey57uP5bqf5byDXG4gICAgZ2V0UGxpc3RQYXRoOiBmdW5jdGlvbiAobW9kdWxlX25hbWUsIGZpbGVfbmFtZSkge1xuICAgICAgICAvLyBjYy5lcnJvcihudWxsLCBcIuS4jeWGjeS9v+eUqOWKoOi9veWQiOWbvueahOaWueW8j+WKoOi9vei1hOa6kCBmYWlsZC0tLT5cIiArIGZpbGVfbmFtZSk7XG4gICAgICAgIC8vIHJldHVyblxuICAgICAgICByZXR1cm4gXCJyZXMvXCIgKyBtb2R1bGVfbmFtZSArIFwiL1wiICsgZmlsZV9uYW1lICsgXCIucGxpc3RcIjtcbiAgICB9LFxuXG4gICAgZ2V0SGVhZFJlczogZnVuY3Rpb24gKHJlc19pZCkge1xuICAgICAgICByZXR1cm4gXCJyZXMvaGVhZGljb24vXCIgKyByZXNfaWQgKyBcIi5wbmdcIjtcbiAgICB9LFxuICAgIGdldEhlYWRjaXJjbGU6IGZ1bmN0aW9uIChyZXNfaWQpIHtcbiAgICAgICAgcmV0dXJuIFwicmVzL2hlYWRjaXJjbGUvdHh0X2NuX2hlYWRjaXJjbGVfXCIgKyByZXNfaWQgKyBcIi5wbmdcIjtcbiAgICB9LFxuICAgIGdldEhvbm9yUmVzOiBmdW5jdGlvbiAocmVzX2lkKSB7XG4gICAgICAgIHJldHVybiBcInJlcy9ob25vci90eHRfY25faG9ub3JfXCIgKyByZXNfaWQgKyBcIi5wbmdcIjtcbiAgICB9LFxuICAgIGdldFdlbGZhcmVCYW5uZXJSZXM6IGZ1bmN0aW9uKHJlc19pZCl7XG4gICAgICAgIHJldHVybiBcInJlcy93ZWxmYXJlL3dlbGZhcmVfYmFubmVyL1wiICsgcmVzX2lkICsgXCIucG5nXCJcbiAgICB9LFxuICAgIGdldEJpZ0J1ZmZSZXMocmVzX2lkKXtcbiAgICAgICAgcmV0dXJuIFwicmVzL2JpZ2J1ZmZpY29uL1wiICsgcmVzX2lkICsgXCIucG5nXCJcbiAgICB9LFxuICAgIC8vIENPTU1PTiAgID0gXCJjb21tb25cIixcbiAgICAvLyBTQ0VORSAgICA9IFwic2NlbmVcIixcbiAgICAvLyBCQVRUTEUgICA9IFwiYmF0dGxlXCIsXG4gICAgLy8gRFVCQklORyAgPSBcImR1YmJpbmdcIixcbiAgICAvLyBSZWNydWl0ICA9IFwicmVjcnVpdFwiLFxuICAgIC8vIERyYW1hICAgID0gXCJkcmFtYVwiLFxuICAgIGdldFNvdW5kUmVzOiBmdW5jdGlvbiAocmVzX3R5cGUsIHJlc19uYW1lKSB7XG4gICAgICAgIGlmICghcmVzX3R5cGUgfHwgIXJlc19uYW1lKSByZXR1cm5cbiAgICAgICAgLy8gcmV0dXJuIFwic291bmQvY29tbW9uL1wiICsgcmVzX2lkICsgXCIubXAzXCI7XG4gICAgICAgIC8vIHZhciByZXNfcGF0aCA9IG51bGw7XG4gICAgICAgIHJldHVybiBjYy5qcy5mb3JtYXRTdHIoXCJzb3VuZC8lcy8lcy5tcDNcIiwgcmVzX3R5cGUsIHJlc19uYW1lKTtcbiAgICB9LFxuXG4gICAgLy8g6I635Y+W5aSn5Zu+IFxuICAgIGdldEJpZ0JnOiBmdW5jdGlvbiAocmVzX2lkLCBiZ1R5cGUsIG1vZHVsZV9uYW1lKSB7XG4gICAgICAgIGlmIChtb2R1bGVfbmFtZSkge1xuICAgICAgICAgICAgbW9kdWxlX25hbWUgKz0gXCIvXCI7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBtb2R1bGVfbmFtZSA9IFwiXCI7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIFwidWlfcmVzL2JpZ2JnL1wiICsgbW9kdWxlX25hbWUgKyByZXNfaWQgKyBcIi5cIiArIChiZ1R5cGUgfHwgXCJwbmdcIik7XG4gICAgfSxcblxuICAgIGdldENvbW1vbkljb21QYXRoOiBmdW5jdGlvbiAoaWNvbl9uYW1lKSB7XG4gICAgICAgIHJldHVybiBcInVpX3Jlcy9jb21tb24vXCIgKyBpY29uX25hbWUgKyBcIi5wbmdcIjtcbiAgICB9LFxuXG4gICAgLy8g6I635Y+W54mp5ZOB5Zu+5qCHXG4gICAgZ2V0SXRlbVJlczogZnVuY3Rpb24gKHJlc19pZCkge1xuICAgICAgICByZXR1cm4gXCJyZXMvaXRlbS9cIiArIHJlc19pZCArIFwiLnBuZ1wiO1xuICAgIH0sXG4gICAgLy8g6I635Y+W5Y2V5oiY5paX5Zy65pmv55qE6LWE5rqQXG4gICAgZ2V0QmF0dGxlU2luZ2xlQmc6IGZ1bmN0aW9uIChyZXNfaWQpIHtcbiAgICAgICAgcmV0dXJuIFwidWlfcmVzL2JpZ2JnL2JhdHRsZV9iZy9cIiArIHJlc19pZCArIFwiL2JfYmcuanBnXCI7XG4gICAgfSxcblxuICAgIC8vIOeUqOS6juS7jmNkbuS4i+i9veaImOaWl+i1hOa6kOeahOaOpeWPo1xuICAgIGdldEJhdHRsZVNjZW5lUmVzOmZ1bmN0aW9uKHJlc05hbWUsIGlzX2pwZyl7XG4gICAgICAgIGlmKGlzX2pwZyA9PSB0cnVlKXtcbiAgICAgICAgICAgIHJldHVybiBcInVpX3Jlcy9iaWdiZy9iYXR0bGVfYmcvXCIrcmVzTmFtZStcIi5qcGdcIjtcbiAgICAgICAgfWVsc2V7XG4gICAgICAgICAgICByZXR1cm4gXCJ1aV9yZXMvYmlnYmcvYmF0dGxlX2JnL1wiKyByZXNOYW1lICtcIi5wbmdcIjtcbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICAvLyDojrflj5ZidWZm6LWE5rqQ6Lev5b6EXG4gICAgZ2V0QnVmZlJlczpmdW5jdGlvbihyZXNfaWQpe1xuICAgICAgICByZXR1cm4gXCJyZXMvYnVmZmljb24vXCIgKyByZXNfaWQgKyBcIi5wbmdcIjtcbiAgICB9LFxuXG4gICAgLy/ojrflj5bmuLjmiI/lm77moIfnmoTmjqXlj6NcbiAgICBnZXRGdW5jdGlvblJlczpmdW5jdGlvbihyZXNfaWQpe1xuICAgICAgICByZXR1cm4gXCJyZXMvZnVuY3Rpb25pY29uL1wiICsgcmVzX2lkICsgXCIucG5nXCJcbiAgICB9LFxuXG4gICAgLy8g6I635Y+W5Ymn5oOF5Ymv5pys55qE5oiY5paX6IOM5pmvXG4gICAgZ2V0QmF0dGxlRHJhbWVCZzogZnVuY3Rpb24gKHJlc19pZCkge1xuICAgICAgICB2YXIgYmdfcGF0aCA9IFwidWlfcmVzL2JpZ2JnL2JhdHRsZV9iZy9cIiArIHJlc19pZDtcbiAgICAgICAgcmV0dXJuIHsgczogYmdfcGF0aCArIFwiL21hcF9iZy5wbmdcIiwgZjogYmdfcGF0aCArIFwiL21fYmcucG5nXCIgfTtcbiAgICB9LFxuICAgIGdldEFjdGl2aXR5QmlnOiBmdW5jdGlvbiAocmVzX2lkKSB7XG4gICAgICAgIHJldHVybiBcInJlcy9hY3Rpdml0eS9hY3Rpdml0eV9iaWcvXCIgKyByZXNfaWQgKyBcIi5wbmdcIjtcbiAgICB9LFxuICAgIC8qKlxuICAgICAqIOiOt+WPlnNwaW5l6Lev5b6EXG4gICAgICovXG4gICAgZ2V0U3BpbmVQYXRoOiBmdW5jdGlvbiAocmVzX2lkLCByZXNfbmFtZSkge1xuICAgICAgICBpZiAocmVzX25hbWUgPT0gbnVsbCkge1xuICAgICAgICAgICAgcmVzX25hbWUgPSBQbGF5ZXJBY3Rpb24uYWN0aW9uXG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIFwic3BpbmUvXCIgKyByZXNfaWQgKyBcIi9cIiArIHJlc19uYW1lICsgXCIuYXRsYXNcIjtcbiAgICB9LFxuXG4gICAgLy8g6I635Y+W5oiY5paX5Lit55qE6Zi15rOV5Zu+5qCHXG4gICAgZ2V0QmF0dGxlRm9ybUljb246ZnVuY3Rpb24ocmVzX2lkKXtcbiAgICAgICAgcmV0dXJuIFwicmVzL2JhdHRsZWZvcm1pY29uL2JhdHRsZV9mb3JtX2ljb25fXCIgKyByZXNfaWQgKyBcIi5wbmdcIjtcbiAgICB9LFxuXG4gICAgLy8g6I635Y+W5oiY5paX5Lit55qE6Zi16JCl5Zu+5qCHXG4gICAgZ2V0QmF0dGxlQ2FtcEljb246ZnVuY3Rpb24ocmVzX2lkKXtcbiAgICAgICAgcmV0dXJuIFwicmVzL2JhdHRsZWNhbXAvYmF0dGxlY2FtcF9cIiArIHJlc19pZCArIFwiLnBuZ1wiO1xuICAgIH0sXG5cbiAgICAvLyDojrflj5bmiJjmlpfkuK3nmoTpmLXokKXlm77moIdcbiAgICBnZXRCYXR0bGVDYW1wSWNvbkJ5VHlwZTpmdW5jdGlvbihjYW1wX3R5cGUpe1xuICAgICAgICBpZiAoY2FtcF90eXBlID09IG51bGwpIHtcbiAgICAgICAgICAgIGNhbXBfdHlwZSA9IDE7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIEhlcm9Db25zdCA9IHJlcXVpcmUoXCJoZXJvX2NvbnN0XCIpXG4gICAgICAgIGlmIChjYW1wX3R5cGUgPT0gSGVyb0NvbnN0LkNhbXBUeXBlLmVXYXRlcikge1xuICAgICAgICAgICAgcmV0dXJuIFwicmVzL2JhdHRsZWNhbXAvYmF0dGxlY2FtcF8xMDAxLnBuZ1wiO1xuICAgICAgICB9IGVsc2UgaWYgKGNhbXBfdHlwZSA9PSBIZXJvQ29uc3QuQ2FtcFR5cGUuZUZpcmUpIHtcbiAgICAgICAgICAgIHJldHVybiBcInJlcy9iYXR0bGVjYW1wL2JhdHRsZWNhbXBfMTAwMi5wbmdcIjtcbiAgICAgICAgfSBlbHNlIGlmIChjYW1wX3R5cGUgPT0gSGVyb0NvbnN0LkNhbXBUeXBlLmVXaW5kKSB7XG4gICAgICAgICAgICByZXR1cm4gXCJyZXMvYmF0dGxlY2FtcC9iYXR0bGVjYW1wXzEwMDMucG5nXCI7XG4gICAgICAgIH0gZWxzZSBpZiAoY2FtcF90eXBlID09IEhlcm9Db25zdC5DYW1wVHlwZS5lTGlnaHQpIHtcbiAgICAgICAgICAgIHJldHVybiBcInJlcy9iYXR0bGVjYW1wL2JhdHRsZWNhbXBfMTAwNC5wbmdcIjtcbiAgICAgICAgfSBlbHNlIGlmIChjYW1wX3R5cGUgPT0gSGVyb0NvbnN0LkNhbXBUeXBlLmVEYXJrKSB7XG4gICAgICAgICAgICByZXR1cm4gXCJyZXMvYmF0dGxlY2FtcC9iYXR0bGVjYW1wXzEwMDUucG5nXCI7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gXCJyZXMvYmF0dGxlY2FtcC9iYXR0bGVjYW1wXzEwMDAucG5nXCI7XG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgLy8g6I635Y+W5ZOB6LSo5qGG6IOM5pmvKOWchuW9oueahClcbiAgICBnZXRSb3VuZFF1YWxpdHlCZzpmdW5jdGlvbihxdWFsaXR5KXtcbiAgICAgICAgdmFyIHF1YWxpdHkgPSBxdWFsaXR5IHx8IDE7XG4gICAgICAgIGlmKHF1YWxpdHkgPiA1KXtcbiAgICAgICAgICAgIHF1YWxpdHkgPSA1O1xuICAgICAgICB9XG4gICAgICAgIHF1YWxpdHkgPSAyMDAwICsgcXVhbGl0eTtcbiAgICAgICAgdmFyIHJlc19pZCA9IFwibWFpbnVpX1wiK3F1YWxpdHk7XG4gICAgICAgIHJldHVybiBQYXRoVG9vbC5nZXRVSUljb25QYXRoKFwibWFpbnVpXCIsIHJlc19pZCk7XG4gICAgfSxcblxuICAgIC8v6I635Y+W6YWN572u6KGo5Lit55qEZWZmZWN06LWE5rqQaWTlkKdcbiAgICBnZXRFZmZlY3RSZXM6IGZ1bmN0aW9uIChpZCkge1xuICAgICAgICByZXR1cm4gZ2RhdGEoXCJlZmZlY3RfZGF0YVwiLCBcImRhdGFfZWZmZWN0X2luZm9cIiwgW2lkXSkgfHwgXCJFODg4ODhcIjtcbiAgICB9LFxuXG4gICAgLy8g5qC55o2u54mp5ZOB5ZOB6LSo6Imy6I635Y+W5oyH5a6a55qE5Zu+6ZuGaWFcbiAgICBnZXRJdGVtUXVhbGl0eUJHOiBmdW5jdGlvbiAocXVhbGl0eSkge1xuICAgICAgICBpZiAocXVhbGl0eSA9PSBudWxsKSB7XG4gICAgICAgICAgICBxdWFsaXR5ID0gMFxuICAgICAgICB9IGVsc2UgaWYgKHF1YWxpdHkgPiA1KSB7XG4gICAgICAgICAgICBxdWFsaXR5ID0gNVxuICAgICAgICB9XG4gICAgICAgIGlmIChxdWFsaXR5ID09IDApIHtcbiAgICAgICAgICAgIHJldHVybiBcImNvbW1vbl8xMDA1XCJcbiAgICAgICAgfSBlbHNlIGlmIChxdWFsaXR5ID09IDEpIHtcbiAgICAgICAgICAgIHJldHVybiBcImNvbW1vbl8xMDA2XCJcbiAgICAgICAgfSBlbHNlIGlmIChxdWFsaXR5ID09IDIpIHtcbiAgICAgICAgICAgIHJldHVybiBcImNvbW1vbl8xMDA3XCJcbiAgICAgICAgfSBlbHNlIGlmIChxdWFsaXR5ID09IDMpIHtcbiAgICAgICAgICAgIHJldHVybiBcImNvbW1vbl8xMDA4XCJcbiAgICAgICAgfSBlbHNlIGlmIChxdWFsaXR5ID09IDQpIHtcbiAgICAgICAgICAgIHJldHVybiBcImNvbW1vbl8xMDA5XCJcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBcImNvbW1vbl8xMDEwXCJcbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICAvLyDojrflj5bpmLXokKXotYTmupBcbiAgICBnZXRIZXJvQ2FtcFJlczogZnVuY3Rpb24gKGNhbXApIHtcbiAgICAgICAgaWYgKGNhbXAgPT0gbnVsbCkge1xuICAgICAgICAgICAgY2FtcCA9IDFcbiAgICAgICAgfSBlbHNlIGlmIChjYW1wID4gNikge1xuICAgICAgICAgICAgY2FtcCA9IDFcbiAgICAgICAgfVxuICAgICAgICBpZiAoY2FtcCA9PSAxKSB7ICAgICAgICAgICAgICAgIC8vIOawtFxuICAgICAgICAgICAgcmV0dXJuIFwiY29tbW9uXzkwMDY3XCJcbiAgICAgICAgfSBlbHNlIGlmIChjYW1wID09IDIpIHsgICAgICAgICAvLyDngatcbiAgICAgICAgICAgIHJldHVybiBcImNvbW1vbl85MDA2OFwiXG4gICAgICAgIH0gZWxzZSBpZiAoY2FtcCA9PSAzKSB7ICAgICAgICAgLy8g6aOOXG4gICAgICAgICAgICByZXR1cm4gXCJjb21tb25fOTAwNjlcIlxuICAgICAgICB9IGVsc2UgaWYgKGNhbXAgPT0gNCkgeyAgICAgICAgIC8vIOWFiVxuICAgICAgICAgICAgcmV0dXJuIFwiY29tbW9uXzkwMDcwXCJcbiAgICAgICAgfSBlbHNlIGlmIChjYW1wID09IDUpeyAgICAgICAgICAvLyDmmpdcbiAgICAgICAgICAgIHJldHVybiBcImNvbW1vbl85MDA3MVwiXG4gICAgICAgIH0gZWxzZSBpZihjYW1wID09IDYpeyAgICAgICAgICAgLy/lhYnlkozmmpdcbiAgICAgICAgICAgIHJldHVybiBcImNvbW1vbl85MDA3OVwiXG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgLy8g6I635Y+W5bGe5oCn5Zu+5qCHXG4gICAgZ2V0QXR0ckljb25CeVN0cjogZnVuY3Rpb24gKHN0cikge1xuICAgICAgICBpZiAoc3RyID09IFwiYXRrXCIgfHwgc3RyID09IFwiYXRrX3BlclwiKSB7XG4gICAgICAgICAgICByZXR1cm4gXCJjb21tb25fOTAwMjFcIlxuICAgICAgICB9IGVsc2UgaWYgKHN0ciA9PSBcImhwXCIgfHwgc3RyID09IFwiaHBfbWF4XCIgfHwgc3RyID09IFwiaHBfbWF4X3BlclwiKSB7XG4gICAgICAgICAgICByZXR1cm4gXCJjb21tb25fOTAwMjJcIlxuICAgICAgICB9IGVsc2UgaWYgKHN0ciA9PSBcImRlZlwiIHx8IHN0ciA9PSBcImRlZl9wZXJcIikge1xuICAgICAgICAgICAgcmV0dXJuIFwiY29tbW9uXzkwMDIzXCJcbiAgICAgICAgfSBlbHNlIGlmIChzdHIgPT0gXCJzcGVlZFwiKSB7XG4gICAgICAgICAgICByZXR1cm4gXCJjb21tb25fOTAwMzhcIlxuICAgICAgICB9IGVsc2UgaWYgKHN0ciA9PSBcImNyaXRfcmF0ZVwiKSB7XG4gICAgICAgICAgICByZXR1cm4gXCJjb21tb25fOTAwNDNcIlxuICAgICAgICB9IGVsc2UgaWYgKHN0ciA9PSBcImNyaXRfcmF0aW9cIikge1xuICAgICAgICAgICAgcmV0dXJuIFwiY29tbW9uXzkwMDM5XCJcbiAgICAgICAgfSBlbHNlIGlmIChzdHIgPT0gXCJoaXRfbWFnaWNcIikge1xuICAgICAgICAgICAgcmV0dXJuIFwiY29tbW9uXzkwMDQwXCJcbiAgICAgICAgfSBlbHNlIGlmIChzdHIgPT0gXCJkb2RnZV9tYWdpY1wiKSB7XG4gICAgICAgICAgICByZXR1cm4gXCJjb21tb25fOTAwMzdcIlxuICAgICAgICB9IGVsc2UgaWYoc3RyID09IFwidGVuYWNpdHlcIil7XG4gICAgICAgICAgICByZXR1cm4gXCJjb21tb25fOTAwMjFfMVwiXG4gICAgICAgIH0gZWxzZSBpZihzdHIgPT0gXCJoaXRfcmF0ZVwiKXtcbiAgICAgICAgICAgIHJldHVybiBcImNvbW1vbl85MDAyMV8yXCJcbiAgICAgICAgfSBlbHNlIGlmKHN0ciA9PSBcInJlc1wiKXtcbiAgICAgICAgICAgIHJldHVybiBcImNvbW1vbl85MDAyMV8zXCJcbiAgICAgICAgfSBlbHNlIGlmKHN0ciA9PSBcImRvZGdlX3JhdGVcIil7XG4gICAgICAgICAgICByZXR1cm4gXCJjb21tb25fOTAwMjFfNFwiXG4gICAgICAgIH0gZWxzZSBpZihzdHIgPT0gXCJjdXJlXCIpe1xuICAgICAgICAgICAgcmV0dXJuIFwiY29tbW9uXzkwMDIxXzVcIlxuICAgICAgICB9IGVsc2UgaWYoc3RyID09IFwiYmVfY3VyZVwiKXtcbiAgICAgICAgICAgIHJldHVybiBcImNvbW1vbl85MDAyMV82XCJcbiAgICAgICAgfSBlbHNlIGlmKHN0ciA9PSBcImRhbVwiKXtcbiAgICAgICAgICAgIHJldHVybiBcImNvbW1vbl85MDAyMV83XCJcbiAgICAgICAgfWVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIFwiY29tbW9uXzkwMDM3XCJcbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICAvLyDojrflj5bpmLXokKXlm77moIdcbiAgICBnZXRIZXJvQ2FtcFR5cGVJY29uOmZ1bmN0aW9uKGNhbXBfdHlwZSl7XG4gICAgICAgIGlmIChjYW1wX3R5cGUgPT0gbnVsbCl7XG4gICAgICAgICAgICBjYW1wX3R5cGUgPSAxO1xuICAgICAgICB9XG4gICAgICAgIHZhciBIZXJvQ29uc3QgPSByZXF1aXJlKFwiaGVyb19jb25zdFwiKVxuICAgICAgICBpZiAoY2FtcF90eXBlID09IEhlcm9Db25zdC5DYW1wVHlwZS5lV2F0ZXIpe1xuICAgICAgICAgICAgcmV0dXJuIFwiY29tbW9uXzkwMDY3XCI7XG4gICAgICAgIH1lbHNlIGlmKGNhbXBfdHlwZSA9PSBIZXJvQ29uc3QuQ2FtcFR5cGUuZUZpcmUpe1xuICAgICAgICAgICAgcmV0dXJuIFwiY29tbW9uXzkwMDY4XCI7XG4gICAgICAgIH1lbHNlIGlmKGNhbXBfdHlwZSA9PSBIZXJvQ29uc3QuQ2FtcFR5cGUuZVdpbmQpe1xuICAgICAgICAgICAgcmV0dXJuIFwiY29tbW9uXzkwMDY5XCI7XG4gICAgICAgIH1lbHNlIGlmKGNhbXBfdHlwZSA9PSBIZXJvQ29uc3QuQ2FtcFR5cGUuZUxpZ2h0KXtcbiAgICAgICAgICAgIHJldHVybiBcImNvbW1vbl85MDA3MFwiO1xuICAgICAgICB9ZWxzZSBpZihjYW1wX3R5cGUgPT0gSGVyb0NvbnN0LkNhbXBUeXBlLmVMaW5ndERhcmspe1xuICAgICAgICAgICAgcmV0dXJuIFwiY29tbW9uXzkwMDc5XCI7XG4gICAgICAgIH1lbHNle1xuICAgICAgICAgICAgcmV0dXJuIFwiY29tbW9uXzkwMDcxXCI7XG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgLy/ov5nnsbvljZXkvY3mmK/msqHmnIlzaG935Yqo5L2c55qELOaJgOS7peimgeeJueauiuWkhOeQhlxuICAgIHNwZWNpYWxCU01vZGVsOiBmdW5jdGlvbiAoaWQpIHtcbiAgICAgICAgcmV0dXJuIGlkID09IDM3MzAwIHx8IGlkID09IDM3MzAxIHx8IGlkID09IDM3MzAyXG4gICAgfSxcblxuICAgIC8v6I635Y+W5LyZ5Ly057G75Z6L55qELOWdpuWFi+azleW4iOi/meS6m1xuICAgIGdldFBhcnRuZXJUeXBlSWNvbjogZnVuY3Rpb24gKF90eXBlKSB7XG4gICAgICAgIF90eXBlID0gX3R5cGUgfHwgMTtcbiAgICAgICAgdmFyIF9pbmRleCA9IDQ1ICsgX3R5cGU7XG4gICAgICAgIHJldHVybiB0aGlzLmdldENvbW1vbkljb21QYXRoKFwiY29tbW9uXzkwMFwiICsgX2luZGV4KTtcbiAgICB9LFxuXG4gICAgLy/ojrflj5bkvJnkvLTljYrouqvlg4/otYTmupBcbiAgICBnZXRQYXJ0bmVyQnVzdFJlczpmdW5jdGlvbihidXN0X2lkKXtcbiAgICAgICAgYnVzdF9pZCA9IGJ1c3RfaWQgfHwgMTAwMDA7XG4gICAgICAgIHJldHVybiB0aGlzLmdldEljb25QYXRoKFwicGFydG5lclwiLGJ1c3RfaWQpO1xuICAgIH0sXG5cbiAgICBnZXRMb2dvUmVzOmZ1bmN0aW9uKCl7XG4gICAgICAgIC8vIHZhciBsb2dvX3JlcyA9IGNjLmpzLmZvcm1hdFN0cihcInVpX3Jlcy9sb2dpbi8lcy90eHRfY25fbG9nby5wbmdcIiwgXCJhcHBcIilcbiAgICAgICAgcmV0dXJuIFwidWlfcmVzL2xvZ2luL3R4dF9jbl9sb2dvLnBuZ1wiXG4gICAgfSxcblxuICAgIC8v6I635Y+W6YCJ5Lit6IOM5pmvLOmAmueUqFxuICAgIGdldFNlbGVjdEJnKCl7XG4gICAgICAgIHJldHVybiB0aGlzLmdldFVJSWNvblBhdGgoXCJjb21tb25cIiwgXCJjb21tb25fOTAwMTlcIilcbiAgICB9LFxufTtcblxubW9kdWxlLmV4cG9ydHMgPSBQYXRoVG9vbDtcbiJdfQ==