(function() { var nodeEnv = typeof require !== 'undefined' && typeof process !== 'undefined'; var __module = nodeEnv ? module : {exports:{}}; var __filename = 'preview-scripts/assets/Scripts/common/baserole.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, '1e370LPZpZI56omBMKNFvi0', 'baserole'); // Scripts/common/baserole.js "use strict"; // -------------------------------------------------------------------- // @author: shiraho@syg.com(必填, 创建模块的人员) // @description: // 通用展示角色对象 //
Create: new Date().toISOString() // -------------------------------------------------------------------- // var LoaderManager = require("loadermanager"); var PathTool = require("pathtool"); var BaseRole = cc.Class({ "extends": BaseClass, ctor: function ctor() { this.loadFinish = false; // 是否加载完成 }, is_load_finish: false, action_data: null, // 尚未创建完成之前播放动作的携带数据 anima_path: null, effect_path: null, statics: { type: { hero: 1, unit: 2 } }, setParent: function setParent(parent) { this.parent = parent; this.node = new cc.Node(""); this.node.setAnchorPoint(0.5, 0.5); this.spine = this.node.addComponent(sp.Skeleton); var effect_nd = new cc.Node(""); this.effect_sk = effect_nd.addComponent(sp.Skeleton); this.parent.addChild(this.node); this.node.addChild(effect_nd); }, // 设置数据,这个是主接口,怪物类型和怪物id setData: function setData(unit_type, bidordata, action_name, loop, scale, setting) { // cc.log(unit_type, bidordata, action_name, loop, scale) var anima_path = null; var effect_path = null; scale = scale || 1; this.node.scale = scale; setting = setting || {}; var effectScale = setting.scale || 1; this.effect_sk.node.scale = effectScale; if (unit_type == BaseRole.type.role) { var config = Config.looks_data.data_data[bidordata]; if (config) { var key = Utils.getNorKey(config.partner_id, config.star); var star_config = gdata("partner_data", "data_partner_star", key); action_name = action_name ? action_name : PlayerAction.show; anima_path = cc.js.formatStr("spine/%s/%s.atlas", config.ico_id, action_name); if (star_config && star_config.show_effect != "") { // action_name = action_name ? action_name : PlayerAction.show; // anima_path = cc.js.formatStr("spine/%s/%s.atlas", star_config.show_effect, action_name); if (star_config.show_effect) { effect_path = "spine/" + star_config.show_effect + "/action.atlas"; var skin_id = config.skin_id; if (skin_id == 0 && setting.skin_id != null) { skin_id = setting.skin_id; } var skin_config = Config.partner_skin_data.data_skin_info[skin_id]; if (skin_config && skin_config.res_id != null && skin_config.res_id != "") { anima_path = "spine/" + skin_config.res_id + "/show.atlas"; } if (skin_config && skin_config.show_effect != "") { effect_path = "spine/" + skin_config.show_effect + "/action.atlas"; } } else { if (this.effect_sk) { this.effect_sk.setToSetupPose(); this.effect_sk.clearTracks(); } } } } } else if (unit_type == BaseRole.type.partner) { // 测试使用 var star_key = bidordata.bid + "_" + bidordata.star; var star_cfg = gdata("partner_data", "data_partner_star", star_key); anima_path = "spine/" + star_cfg.res_id + "/show.atlas"; var test_cfg = gdata("partner_data", "data_partner_base", bidordata.bid); //英雄皮肤id var _skin_id = setting.skin_id; var _skin_config = Config.partner_skin_data.data_skin_info[_skin_id]; if (_skin_config && _skin_config.res_id != null && _skin_config.res_id != "") { anima_path = "spine/" + _skin_config.res_id + "/show.atlas"; } // 十星特效 if (star_cfg.show_effect) { effect_path = "spine/" + star_cfg.show_effect + "/action.atlas"; if (_skin_config && _skin_config.show_effect != "") { effect_path = "spine/" + _skin_config.show_effect + "/action.atlas"; } } else { if (this.effect_sk) { this.effect_sk.setToSetupPose(); this.effect_sk.clearTracks(); } } } else if (unit_type == BaseRole.type.unit) { var config = Utils.getUnitConfig(bidordata); if (PathTool.specialBSModel(Number(bidordata))) { action_name = PlayerAction.battle_stand; } if (config != null) { anima_path = cc.js.formatStr("spine/%s/%s.atlas", config.body_id, action_name); } } else if (unit_type == BaseRole.type.skin) { if (typeof bidordata == "number") { //显示皮肤外观 var _skin_id2 = bidordata; var _skin_config2 = Config.partner_skin_data.data_skin_info[_skin_id2]; if (_skin_config2 && _skin_config2.res_id != null && _skin_config2.res_id != "") { anima_path = "spine/" + _skin_config2.res_id + "/show.atlas"; } if (_skin_config2 && _skin_config2.show_effect != "") { effect_path = "spine/" + _skin_config2.show_effect + "/action.atlas"; } } } else {} if (!anima_path) return; if (this.anima_path && this.anima_path != anima_path) { this.spine.enabled = false; LoaderManager.getInstance().releaseRes(this.anima_path); } if (this.effect_path && this.effect_path != effect_path) { this.effect_sk.enabled = false; LoaderManager.getInstance().releaseRes(this.effect_path); } LoaderManager.getInstance().loadRes(anima_path, function (res) { this.spine.enabled = true; this.spine.skeletonData = res; this.is_load_finish = true; this.setAnimationAct(action_name, loop); }.bind(this)); if (effect_path) { LoaderManager.getInstance().loadRes(effect_path, function (effect_sd) { this.effect_sk.enabled = true; this.effect_sk.skeletonData = effect_sd; this.effect_sk.setAnimation(0, "action", true); }.bind(this)); } this.effect_path = effect_path; this.anima_path = anima_path; }, // 设置动作,如果是加载完成之后,那么直接播放,否则等加载之后播放 setAnimation: function setAnimation(action_name, loop) { action_name = action_name ? action_name : PlayerAction.show; if (loop == null) { loop = true; } if (this.is_load_finish) { this.setAnimationAct(action_name, loop); } else { this.action_data = { action_name: action_name, loop: loop }; } }, // 播放动作的具体细节 setAnimationAct: function setAnimationAct(action_name, loop) { if (this.spine.skeletonData) { this.spine.setAnimation(0, action_name, loop); } }, setPosition: function setPosition(x, y) { if (this.node) { this.node.setPosition(x, y); } }, showShadowUI: function showShadowUI(status) { if (status) { if (this.shadow == null) { var node = new cc.Node(); this.sript_path = PathTool.getUIIconPath("common", "common_90095"); LoaderManager.getInstance().loadRes(this.sript_path, function (res) { if (node && node.isValid) { node.addComponent(cc.Sprite).spriteFrame = res; } }.bind(this)); this.node.addChild(node, -2); node.setPosition(0, -210); this.shadow = node; } else { this.shadow.active = true; } } else { if (this.shadow) { this.shadow.active = false; } } }, // 移除对象,并且移除掉加载资源 deleteMe: function deleteMe() { if (this.anima_path) LoaderManager.getInstance().releaseRes(this.anima_path); if (this.effect_path) LoaderManager.getInstance().releaseRes(this.effect_path); if (this.sript_path) LoaderManager.getInstance().releaseRes(this.sript_path); this.node.destroy(); } }); // 类型 BaseRole.type = { role: 0, //角色外观的 partner: 1, //伙伴的 在partner_data表里面的 unit: 2, skin: 3 //显示皮肤外观 }; module.exports = BaseRole; 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,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImFzc2V0c1xcU2NyaXB0c1xcY29tbW9uXFxiYXNlcm9sZS5qcyJdLCJuYW1lcyI6WyJQYXRoVG9vbCIsInJlcXVpcmUiLCJCYXNlUm9sZSIsImNjIiwiQ2xhc3MiLCJCYXNlQ2xhc3MiLCJjdG9yIiwibG9hZEZpbmlzaCIsImlzX2xvYWRfZmluaXNoIiwiYWN0aW9uX2RhdGEiLCJhbmltYV9wYXRoIiwiZWZmZWN0X3BhdGgiLCJzdGF0aWNzIiwidHlwZSIsImhlcm8iLCJ1bml0Iiwic2V0UGFyZW50IiwicGFyZW50Iiwibm9kZSIsIk5vZGUiLCJzZXRBbmNob3JQb2ludCIsInNwaW5lIiwiYWRkQ29tcG9uZW50Iiwic3AiLCJTa2VsZXRvbiIsImVmZmVjdF9uZCIsImVmZmVjdF9zayIsImFkZENoaWxkIiwic2V0RGF0YSIsInVuaXRfdHlwZSIsImJpZG9yZGF0YSIsImFjdGlvbl9uYW1lIiwibG9vcCIsInNjYWxlIiwic2V0dGluZyIsImVmZmVjdFNjYWxlIiwicm9sZSIsImNvbmZpZyIsIkNvbmZpZyIsImxvb2tzX2RhdGEiLCJkYXRhX2RhdGEiLCJrZXkiLCJVdGlscyIsImdldE5vcktleSIsInBhcnRuZXJfaWQiLCJzdGFyIiwic3Rhcl9jb25maWciLCJnZGF0YSIsIlBsYXllckFjdGlvbiIsInNob3ciLCJqcyIsImZvcm1hdFN0ciIsImljb19pZCIsInNob3dfZWZmZWN0Iiwic2tpbl9pZCIsInNraW5fY29uZmlnIiwicGFydG5lcl9za2luX2RhdGEiLCJkYXRhX3NraW5faW5mbyIsInJlc19pZCIsInNldFRvU2V0dXBQb3NlIiwiY2xlYXJUcmFja3MiLCJwYXJ0bmVyIiwic3Rhcl9rZXkiLCJiaWQiLCJzdGFyX2NmZyIsInRlc3RfY2ZnIiwiZ2V0VW5pdENvbmZpZyIsInNwZWNpYWxCU01vZGVsIiwiTnVtYmVyIiwiYmF0dGxlX3N0YW5kIiwiYm9keV9pZCIsInNraW4iLCJlbmFibGVkIiwiTG9hZGVyTWFuYWdlciIsImdldEluc3RhbmNlIiwicmVsZWFzZVJlcyIsImxvYWRSZXMiLCJyZXMiLCJza2VsZXRvbkRhdGEiLCJzZXRBbmltYXRpb25BY3QiLCJiaW5kIiwiZWZmZWN0X3NkIiwic2V0QW5pbWF0aW9uIiwic2V0UG9zaXRpb24iLCJ4IiwieSIsInNob3dTaGFkb3dVSSIsInN0YXR1cyIsInNoYWRvdyIsInNyaXB0X3BhdGgiLCJnZXRVSUljb25QYXRoIiwiaXNWYWxpZCIsIlNwcml0ZSIsInNwcml0ZUZyYW1lIiwiYWN0aXZlIiwiZGVsZXRlTWUiLCJkZXN0cm95IiwibW9kdWxlIiwiZXhwb3J0cyJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUlBLFFBQVEsR0FBR0MsT0FBTyxDQUFDLFVBQUQsQ0FBdEI7O0FBRUEsSUFBSUMsUUFBUSxHQUFHQyxFQUFFLENBQUNDLEtBQUgsQ0FBUztBQUNwQixhQUFTQyxTQURXO0FBRXBCQyxFQUFBQSxJQUFJLEVBQUUsZ0JBQVk7QUFDZCxTQUFLQyxVQUFMLEdBQWtCLEtBQWxCLENBRGMsQ0FDa0I7QUFDbkMsR0FKbUI7QUFLcEJDLEVBQUFBLGNBQWMsRUFBRSxLQUxJO0FBTXBCQyxFQUFBQSxXQUFXLEVBQUUsSUFOTztBQU1pQjtBQUNyQ0MsRUFBQUEsVUFBVSxFQUFFLElBUFE7QUFRcEJDLEVBQUFBLFdBQVcsRUFBRSxJQVJPO0FBU3BCQyxFQUFBQSxPQUFPLEVBQUU7QUFDTEMsSUFBQUEsSUFBSSxFQUFFO0FBQ0ZDLE1BQUFBLElBQUksRUFBRSxDQURKO0FBRUZDLE1BQUFBLElBQUksRUFBRTtBQUZKO0FBREQsR0FUVztBQWdCcEJDLEVBQUFBLFNBQVMsRUFBRSxtQkFBVUMsTUFBVixFQUFrQjtBQUN6QixTQUFLQSxNQUFMLEdBQWNBLE1BQWQ7QUFDQSxTQUFLQyxJQUFMLEdBQVksSUFBSWYsRUFBRSxDQUFDZ0IsSUFBUCxDQUFZLEVBQVosQ0FBWjtBQUNBLFNBQUtELElBQUwsQ0FBVUUsY0FBVixDQUF5QixHQUF6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QUFMLENBQVlNLE1BQVosR0FBc0IsSUFBdEI7QUFDSDtBQUNKLEtBZkQsTUFlTztBQUNILFVBQUksS0FBS04sTUFBVCxFQUFpQjtBQUNiLGFBQUtBLE1BQUwsQ0FBWU0sTUFBWixHQUFzQixLQUF0QjtBQUNIO0FBQ0o7QUFDSixHQXpNbUI7QUEwTXBCO0FBQ0FDLEVBQUFBLFFBQVEsRUFBRSxvQkFBWTtBQUNsQixRQUFJLEtBQUtyRixVQUFULEVBQ0krRCxhQUFhLENBQUNDLFdBQWQsR0FBNEJDLFVBQTVCLENBQXVDLEtBQUtqRSxVQUE1QztBQUNKLFFBQUksS0FBS0MsV0FBVCxFQUNJOEQsYUFBYSxDQUFDQyxXQUFkLEdBQTRCQyxVQUE1QixDQUF1QyxLQUFLaEUsV0FBNUM7QUFDSixRQUFJLEtBQUs4RSxVQUFULEVBQ0loQixhQUFhLENBQUNDLFdBQWQsR0FBNEJDLFVBQTVCLENBQXVDLEtBQUtjLFVBQTVDO0FBQ0osU0FBS3ZFLElBQUwsQ0FBVThFLE9BQVY7QUFDSDtBQW5ObUIsQ0FBVCxDQUFmLEVBc05BOztBQUNBOUYsUUFBUSxDQUFDVyxJQUFULEdBQ0k7QUFDSXVCLEVBQUFBLElBQUksRUFBRSxDQURWO0FBQ2dCO0FBQ1p5QixFQUFBQSxPQUFPLEVBQUUsQ0FGYjtBQUVnQjtBQUNaOUMsRUFBQUEsSUFBSSxFQUFFLENBSFY7QUFJSXdELEVBQUFBLElBQUksRUFBRSxDQUpWLENBSWdCOztBQUpoQixDQURKO0FBUUEwQixNQUFNLENBQUNDLE9BQVAsR0FBaUJoRyxRQUFqQiIsInNvdXJjZVJvb3QiOiIvIiwic291cmNlc0NvbnRlbnQiOlsiLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIEBhdXRob3I6IHNoaXJhaG9Ac3lnLmNvbSjlv4XloassIOWIm+W7uuaooeWdl+eahOS6uuWRmClcbi8vIEBkZXNjcmlwdGlvbjpcbi8vICAgICAg6YCa55So5bGV56S66KeS6Imy5a+56LGhXG4vLyA8YnIvPkNyZWF0ZTogbmV3IERhdGUoKS50b0lTT1N0cmluZygpXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gdmFyIExvYWRlck1hbmFnZXIgPSByZXF1aXJlKFwibG9hZGVybWFuYWdlclwiKTtcbnZhciBQYXRoVG9vbCA9IHJlcXVpcmUoXCJwYXRodG9vbFwiKVxuXG52YXIgQmFzZVJvbGUgPSBjYy5DbGFzcyh7XG4gICAgZXh0ZW5kczogQmFzZUNsYXNzLFxuICAgIGN0b3I6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdGhpcy5sb2FkRmluaXNoID0gZmFsc2U7ICAgICAgICAvLyDmmK/lkKbliqDovb3lrozmiJBcbiAgICB9LFxuICAgIGlzX2xvYWRfZmluaXNoOiBmYWxzZSxcbiAgICBhY3Rpb25fZGF0YTogbnVsbCwgICAgICAgICAgICAgICAgICAgLy8g5bCa5pyq5Yib5bu65a6M5oiQ5LmL5YmN5pKt5pS+5Yqo5L2c55qE5pC65bim5pWw5o2uXG4gICAgYW5pbWFfcGF0aDogbnVsbCxcbiAgICBlZmZlY3RfcGF0aDogbnVsbCxcbiAgICBzdGF0aWNzOiB7XG4gICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgIGhlcm86IDEsXG4gICAgICAgICAgICB1bml0OiAyLFxuICAgICAgICB9XG4gICAgfSxcblxuICAgIHNldFBhcmVudDogZnVuY3Rpb24gKHBhcmVudCkge1xuICAgICAgICB0aGlzLnBhcmVudCA9IHBhcmVudDtcbiAgICAgICAgdGhpcy5ub2RlID0gbmV3IGNjLk5vZGUoXCJcIik7XG4gICAgICAgIHRoaXMubm9kZS5zZXRBbmNob3JQb2ludCgwLjUsIDAuNSk7XG4gICAgICAgIHRoaXMuc3BpbmUgPSB0aGlzLm5vZGUuYWRkQ29tcG9uZW50KHNwLlNrZWxldG9uKTtcbiAgICAgICAgdmFyIGVmZmVjdF9uZCA9IG5ldyBjYy5Ob2RlKFwiXCIpO1xuICAgICAgICB0aGlzLmVmZmVjdF9zayA9IGVmZmVjdF9uZC5hZGRDb21wb25lbnQoc3AuU2tlbGV0b24pO1xuICAgICAgICB0aGlzLnBhcmVudC5hZGRDaGlsZCh0aGlzLm5vZGUpO1xuICAgICAgICB0aGlzLm5vZGUuYWRkQ2hpbGQoZWZmZWN0X25kKTtcbiAgICB9LFxuXG4gICAgLy8g6K6+572u5pWw5o2uLOi/meS4quaYr+S4u+aOpeWPoyzmgKrniannsbvlnovlkozmgKrnialpZFxuICAgIHNldERhdGE6IGZ1bmN0aW9uICh1bml0X3R5cGUsIGJpZG9yZGF0YSwgYWN0aW9uX25hbWUsIGxvb3AsIHNjYWxlLCBzZXR0aW5nKSB7XG4gICAgICAgIC8vIGNjLmxvZyh1bml0X3R5cGUsIGJpZG9yZGF0YSwgYWN0aW9uX25hbWUsIGxvb3AsIHNjYWxlKVxuICAgICAgICB2YXIgYW5pbWFfcGF0aCA9IG51bGw7XG4gICAgICAgIHZhciBlZmZlY3RfcGF0aCA9IG51bGw7XG4gICAgICAgIHNjYWxlID0gc2NhbGUgfHwgMTtcbiAgICAgICAgdGhpcy5ub2RlLnNjYWxlID0gc2NhbGU7XG4gICAgICAgIHNldHRpbmcgPSBzZXR0aW5nIHx8IHt9O1xuICAgICAgICBsZXQgZWZmZWN0U2NhbGUgPSBzZXR0aW5nLnNjYWxlIHx8IDE7XG4gICAgICAgIHRoaXMuZWZmZWN0X3NrLm5vZGUuc2NhbGUgPSBlZmZlY3RTY2FsZTtcbiAgICAgICAgaWYgKHVuaXRfdHlwZSA9PSBCYXNlUm9sZS50eXBlLnJvbGUpIHtcbiAgICAgICAgICAgIHZhciBjb25maWcgPSBDb25maWcubG9va3NfZGF0YS5kYXRhX2RhdGFbYmlkb3JkYXRhXTtcbiAgICAgICAgICAgIGlmIChjb25maWcpIHtcbiAgICAgICAgICAgICAgICB2YXIga2V5ID0gVXRpbHMuZ2V0Tm9yS2V5KGNvbmZpZy5wYXJ0bmVyX2lkLCBjb25maWcuc3RhcilcbiAgICAgICAgICAgICAgICB2YXIgc3Rhcl9jb25maWcgPSBnZGF0YShcInBhcnRuZXJfZGF0YVwiLCBcImRhdGFfcGFydG5lcl9zdGFyXCIsIGtleSlcbiAgICAgICAgICAgICAgICBhY3Rpb25fbmFtZSA9IGFjdGlvbl9uYW1lID8gYWN0aW9uX25hbWUgOiBQbGF5ZXJBY3Rpb24uc2hvdztcbiAgICAgICAgICAgICAgICBhbmltYV9wYXRoID0gY2MuanMuZm9ybWF0U3RyKFwic3BpbmUvJXMvJXMuYXRsYXNcIiwgY29uZmlnLmljb19pZCwgYWN0aW9uX25hbWUpO1xuICAgICAgICAgICAgICAgIGlmIChzdGFyX2NvbmZpZyAmJiBzdGFyX2NvbmZpZy5zaG93X2VmZmVjdCAhPSBcIlwiKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIGFjdGlvbl9uYW1lID0gYWN0aW9uX25hbWUgPyBhY3Rpb25fbmFtZSA6IFBsYXllckFjdGlvbi5zaG93OyBcbiAgICAgICAgICAgICAgICAgICAgLy8gYW5pbWFfcGF0aCA9IGNjLmpzLmZvcm1hdFN0cihcInNwaW5lLyVzLyVzLmF0bGFzXCIsIHN0YXJfY29uZmlnLnNob3dfZWZmZWN0LCBhY3Rpb25fbmFtZSk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChzdGFyX2NvbmZpZy5zaG93X2VmZmVjdCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgZWZmZWN0X3BhdGggPSBcInNwaW5lL1wiICsgc3Rhcl9jb25maWcuc2hvd19lZmZlY3QgKyBcIi9hY3Rpb24uYXRsYXNcIjtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBza2luX2lkID0gY29uZmlnLnNraW5faWQ7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2tpbl9pZCA9PSAwICYmIHNldHRpbmcuc2tpbl9pZCAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2tpbl9pZCA9IHNldHRpbmcuc2tpbl9pZDtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBza2luX2NvbmZpZyA9IENvbmZpZy5wYXJ0bmVyX3NraW5fZGF0YS5kYXRhX3NraW5faW5mb1tza2luX2lkXVxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNraW5fY29uZmlnICYmIHNraW5fY29uZmlnLnJlc19pZCAhPSBudWxsICYmIHNraW5fY29uZmlnLnJlc19pZCAhPSBcIlwiKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5pbWFfcGF0aCA9IFwic3BpbmUvXCIgKyBza2luX2NvbmZpZy5yZXNfaWQgKyBcIi9zaG93LmF0bGFzXCI7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChza2luX2NvbmZpZyAmJiBza2luX2NvbmZpZy5zaG93X2VmZmVjdCAhPSBcIlwiKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZWZmZWN0X3BhdGggPSBcInNwaW5lL1wiICsgc2tpbl9jb25maWcuc2hvd19lZmZlY3QgKyBcIi9hY3Rpb24uYXRsYXNcIjtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmVmZmVjdF9zaykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZWZmZWN0X3NrLnNldFRvU2V0dXBQb3NlKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5lZmZlY3Rfc2suY2xlYXJUcmFja3MoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmICh1bml0X3R5cGUgPT0gQmFzZVJvbGUudHlwZS5wYXJ0bmVyKSB7XG4gICAgICAgICAgICAvLyDmtYvor5Xkvb/nlKhcbiAgICAgICAgICAgIHZhciBzdGFyX2tleSA9IGJpZG9yZGF0YS5iaWQgKyBcIl9cIiArIGJpZG9yZGF0YS5zdGFyO1xuICAgICAgICAgICAgdmFyIHN0YXJfY2ZnID0gZ2RhdGEoXCJwYXJ0bmVyX2RhdGFcIiwgXCJkYXRhX3BhcnRuZXJfc3RhclwiLCBzdGFyX2tleSk7XG4gICAgICAgICAgICBhbmltYV9wYXRoID0gXCJzcGluZS9cIiArIHN0YXJfY2ZnLnJlc19pZCArIFwiL3Nob3cuYXRsYXNcIjtcblxuICAgICAgICAgICAgdmFyIHRlc3RfY2ZnID0gZ2RhdGEoXCJwYXJ0bmVyX2RhdGFcIiwgXCJkYXRhX3BhcnRuZXJfYmFzZVwiLCBiaWRvcmRhdGEuYmlkKTtcblxuICAgICAgICAgICAgLy/oi7Hpm4Tnmq7ogqRpZFxuICAgICAgICAgICAgbGV0IHNraW5faWQgPSBzZXR0aW5nLnNraW5faWQ7XG4gICAgICAgICAgICBsZXQgc2tpbl9jb25maWcgPSBDb25maWcucGFydG5lcl9za2luX2RhdGEuZGF0YV9za2luX2luZm9bc2tpbl9pZF1cbiAgICAgICAgICAgIGlmIChza2luX2NvbmZpZyAmJiBza2luX2NvbmZpZy5yZXNfaWQgIT0gbnVsbCAmJiBza2luX2NvbmZpZy5yZXNfaWQgIT0gXCJcIikge1xuICAgICAgICAgICAgICAgIGFuaW1hX3BhdGggPSBcInNwaW5lL1wiICsgc2tpbl9jb25maWcucmVzX2lkICsgXCIvc2hvdy5hdGxhc1wiO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8g5Y2B5pif54m55pWIXG4gICAgICAgICAgICBpZiAoc3Rhcl9jZmcuc2hvd19lZmZlY3QpIHtcbiAgICAgICAgICAgICAgICBlZmZlY3RfcGF0aCA9IFwic3BpbmUvXCIgKyBzdGFyX2NmZy5zaG93X2VmZmVjdCArIFwiL2FjdGlvbi5hdGxhc1wiO1xuICAgICAgICAgICAgICAgIGlmIChza2luX2NvbmZpZyAmJiBza2luX2NvbmZpZy5zaG93X2VmZmVjdCAhPSBcIlwiKSB7XG4gICAgICAgICAgICAgICAgICAgIGVmZmVjdF9wYXRoID0gXCJzcGluZS9cIiArIHNraW5fY29uZmlnLnNob3dfZWZmZWN0ICsgXCIvYWN0aW9uLmF0bGFzXCI7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuZWZmZWN0X3NrKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZWZmZWN0X3NrLnNldFRvU2V0dXBQb3NlKCk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZWZmZWN0X3NrLmNsZWFyVHJhY2tzKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG5cblxuICAgICAgICB9IGVsc2UgaWYgKHVuaXRfdHlwZSA9PSBCYXNlUm9sZS50eXBlLnVuaXQpIHtcbiAgICAgICAgICAgIHZhciBjb25maWcgPSBVdGlscy5nZXRVbml0Q29uZmlnKGJpZG9yZGF0YSk7XG4gICAgICAgICAgICBpZiAoUGF0aFRvb2wuc3BlY2lhbEJTTW9kZWwoTnVtYmVyKGJpZG9yZGF0YSkpKSB7XG4gICAgICAgICAgICAgICAgYWN0aW9uX25hbWUgPSBQbGF5ZXJBY3Rpb24uYmF0dGxlX3N0YW5kO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGNvbmZpZyAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgYW5pbWFfcGF0aCA9IGNjLmpzLmZvcm1hdFN0cihcInNwaW5lLyVzLyVzLmF0bGFzXCIsIGNvbmZpZy5ib2R5X2lkLCBhY3Rpb25fbmFtZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAodW5pdF90eXBlID09IEJhc2VSb2xlLnR5cGUuc2tpbikge1xuICAgICAgICAgICAgaWYgKHR5cGVvZiAoYmlkb3JkYXRhKSA9PSBcIm51bWJlclwiKSB7XG4gICAgICAgICAgICAgICAgLy/mmL7npLrnmq7ogqTlpJbop4JcbiAgICAgICAgICAgICAgICBsZXQgc2tpbl9pZCA9IGJpZG9yZGF0YVxuICAgICAgICAgICAgICAgIGxldCBza2luX2NvbmZpZyA9IENvbmZpZy5wYXJ0bmVyX3NraW5fZGF0YS5kYXRhX3NraW5faW5mb1tza2luX2lkXVxuICAgICAgICAgICAgICAgIGlmIChza2luX2NvbmZpZyAmJiBza2luX2NvbmZpZy5yZXNfaWQgIT0gbnVsbCAmJiBza2luX2NvbmZpZy5yZXNfaWQgIT0gXCJcIikge1xuICAgICAgICAgICAgICAgICAgICBhbmltYV9wYXRoID0gXCJzcGluZS9cIiArIHNraW5fY29uZmlnLnJlc19pZCArIFwiL3Nob3cuYXRsYXNcIjtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBpZiAoc2tpbl9jb25maWcgJiYgc2tpbl9jb25maWcuc2hvd19lZmZlY3QgIT0gXCJcIikge1xuICAgICAgICAgICAgICAgICAgICBlZmZlY3RfcGF0aCA9IFwic3BpbmUvXCIgKyBza2luX2NvbmZpZy5zaG93X2VmZmVjdCArIFwiL2FjdGlvbi5hdGxhc1wiO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcblxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCFhbmltYV9wYXRoKSByZXR1cm47XG4gICAgICAgIGlmICh0aGlzLmFuaW1hX3BhdGggJiYgdGhpcy5hbmltYV9wYXRoICE9IGFuaW1hX3BhdGgpIHtcbiAgICAgICAgICAgIHRoaXMuc3BpbmUuZW5hYmxlZCA9IGZhbHNlO1xuICAgICAgICAgICAgTG9hZGVyTWFuYWdlci5nZXRJbnN0YW5jZSgpLnJlbGVhc2VSZXModGhpcy5hbmltYV9wYXRoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLmVmZmVjdF9wYXRoICYmIHRoaXMuZWZmZWN0X3BhdGggIT0gZWZmZWN0X3BhdGgpIHtcbiAgICAgICAgICAgIHRoaXMuZWZmZWN0X3NrLmVuYWJsZWQgPSBmYWxzZTtcbiAgICAgICAgICAgIExvYWRlck1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5yZWxlYXNlUmVzKHRoaXMuZWZmZWN0X3BhdGgpO1xuICAgICAgICB9XG5cbiAgICAgICAgTG9hZGVyTWFuYWdlci5nZXRJbnN0YW5jZSgpLmxvYWRSZXMoYW5pbWFfcGF0aCwgKGZ1bmN0aW9uIChyZXMpIHtcbiAgICAgICAgICAgIHRoaXMuc3BpbmUuZW5hYmxlZCA9IHRydWU7XG4gICAgICAgICAgICB0aGlzLnNwaW5lLnNrZWxldG9uRGF0YSA9IHJlcztcbiAgICAgICAgICAgIHRoaXMuaXNfbG9hZF9maW5pc2ggPSB0cnVlO1xuICAgICAgICAgICAgdGhpcy5zZXRBbmltYXRpb25BY3QoYWN0aW9uX25hbWUsIGxvb3ApO1xuICAgICAgICB9KS5iaW5kKHRoaXMpKTtcblxuICAgICAgICBpZiAoZWZmZWN0X3BhdGgpIHtcbiAgICAgICAgICAgIExvYWRlck1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5sb2FkUmVzKGVmZmVjdF9wYXRoLCBmdW5jdGlvbiAoZWZmZWN0X3NkKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5lZmZlY3Rfc2suZW5hYmxlZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgdGhpcy5lZmZlY3Rfc2suc2tlbGV0b25EYXRhID0gZWZmZWN0X3NkO1xuICAgICAgICAgICAgICAgIHRoaXMuZWZmZWN0X3NrLnNldEFuaW1hdGlvbigwLCBcImFjdGlvblwiLCB0cnVlKTtcbiAgICAgICAgICAgIH0uYmluZCh0aGlzKSk7XG5cbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuZWZmZWN0X3BhdGggPSBlZmZlY3RfcGF0aDtcbiAgICAgICAgdGhpcy5hbmltYV9wYXRoID0gYW5pbWFfcGF0aDtcbiAgICB9LFxuXG4gICAgLy8g6K6+572u5Yqo5L2cLOWmguaenOaYr+WKoOi9veWujOaIkOS5i+WQjizpgqPkuYjnm7TmjqXmkq3mlL4s5ZCm5YiZ562J5Yqg6L295LmL5ZCO5pKt5pS+XG4gICAgc2V0QW5pbWF0aW9uOiBmdW5jdGlvbiAoYWN0aW9uX25hbWUsIGxvb3ApIHtcbiAgICAgICAgYWN0aW9uX25hbWUgPSBhY3Rpb25fbmFtZSA/IGFjdGlvbl9uYW1lIDogUGxheWVyQWN0aW9uLnNob3c7XG4gICAgICAgIGlmIChsb29wID09IG51bGwpIHtcbiAgICAgICAgICAgIGxvb3AgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLmlzX2xvYWRfZmluaXNoKSB7XG4gICAgICAgICAgICB0aGlzLnNldEFuaW1hdGlvbkFjdChhY3Rpb25fbmFtZSwgbG9vcCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmFjdGlvbl9kYXRhID0geyBhY3Rpb25fbmFtZTogYWN0aW9uX25hbWUsIGxvb3A6IGxvb3AgfTtcbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICAvLyDmkq3mlL7liqjkvZznmoTlhbfkvZPnu4boioJcbiAgICBzZXRBbmltYXRpb25BY3Q6IGZ1bmN0aW9uIChhY3Rpb25fbmFtZSwgbG9vcCkge1xuICAgICAgICBpZiAodGhpcy5zcGluZS5za2VsZXRvbkRhdGEpIHtcbiAgICAgICAgICAgIHRoaXMuc3BpbmUuc2V0QW5pbWF0aW9uKDAsIGFjdGlvbl9uYW1lLCBsb29wKTtcbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICBzZXRQb3NpdGlvbjogZnVuY3Rpb24gKHgsIHkpIHtcbiAgICAgICAgaWYgKHRoaXMubm9kZSkge1xuICAgICAgICAgICAgdGhpcy5ub2RlLnNldFBvc2l0aW9uKHgsIHkpO1xuICAgICAgICB9XG4gICAgfSxcbiAgICBzaG93U2hhZG93VUk6IGZ1bmN0aW9uIChzdGF0dXMpIHtcbiAgICAgICAgaWYgKHN0YXR1cykge1xuICAgICAgICAgICAgaWYgKHRoaXMuc2hhZG93ID09IG51bGwpIHtcbiAgICAgICAgICAgICAgICBsZXQgbm9kZSA9IG5ldyBjYy5Ob2RlKClcbiAgICAgICAgICAgICAgICB0aGlzLnNyaXB0X3BhdGggPSBQYXRoVG9vbC5nZXRVSUljb25QYXRoKFwiY29tbW9uXCIsIFwiY29tbW9uXzkwMDk1XCIpXG4gICAgICAgICAgICAgICAgTG9hZGVyTWFuYWdlci5nZXRJbnN0YW5jZSgpLmxvYWRSZXModGhpcy5zcmlwdF9wYXRoLCAoZnVuY3Rpb24gKHJlcykge1xuICAgICAgICAgICAgICAgICAgICBpZiAobm9kZSAmJiBub2RlLmlzVmFsaWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG5vZGUuYWRkQ29tcG9uZW50KGNjLlNwcml0ZSkuc3ByaXRlRnJhbWUgPSByZXM7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KS5iaW5kKHRoaXMpKTtcbiAgICAgICAgICAgICAgICB0aGlzLm5vZGUuYWRkQ2hpbGQobm9kZSwgLTIpXG4gICAgICAgICAgICAgICAgbm9kZS5zZXRQb3NpdGlvbigwLCAtMjEwKVxuICAgICAgICAgICAgICAgIHRoaXMuc2hhZG93ID0gbm9kZVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLnNoYWRvdy5hY3RpdmUgPSAodHJ1ZSlcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGlmICh0aGlzLnNoYWRvdykge1xuICAgICAgICAgICAgICAgIHRoaXMuc2hhZG93LmFjdGl2ZSA9IChmYWxzZSlcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH0sXG4gICAgLy8g56e76Zmk5a+56LGhLOW5tuS4lOenu+mZpOaOieWKoOi9vei1hOa6kFxuICAgIGRlbGV0ZU1lOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGlmICh0aGlzLmFuaW1hX3BhdGgpXG4gICAgICAgICAgICBMb2FkZXJNYW5hZ2VyLmdldEluc3RhbmNlKCkucmVsZWFzZVJlcyh0aGlzLmFuaW1hX3BhdGgpO1xuICAgICAgICBpZiAodGhpcy5lZmZlY3RfcGF0aClcbiAgICAgICAgICAgIExvYWRlck1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5yZWxlYXNlUmVzKHRoaXMuZWZmZWN0X3BhdGgpO1xuICAgICAgICBpZiAodGhpcy5zcmlwdF9wYXRoKVxuICAgICAgICAgICAgTG9hZGVyTWFuYWdlci5nZXRJbnN0YW5jZSgpLnJlbGVhc2VSZXModGhpcy5zcmlwdF9wYXRoKTtcbiAgICAgICAgdGhpcy5ub2RlLmRlc3Ryb3koKTtcbiAgICB9LFxufSk7XG5cbi8vIOexu+Wei1xuQmFzZVJvbGUudHlwZSA9XG4gICAge1xuICAgICAgICByb2xlOiAwLCAgICAvL+inkuiJsuWkluingueahCAgICAgICBcbiAgICAgICAgcGFydG5lcjogMSwgLy/kvJnkvLTnmoQg5ZyocGFydG5lcl9kYXRh6KGo6YeM6Z2i55qEXG4gICAgICAgIHVuaXQ6IDIsXG4gICAgICAgIHNraW46IDMsICAgIC8v5pi+56S655qu6IKk5aSW6KeCXG4gICAgfVxuXG5tb2R1bGUuZXhwb3J0cyA9IEJhc2VSb2xlO1xuIl19