|
(function() {
|
var nodeEnv = typeof require !== 'undefined' && typeof process !== 'undefined';
|
var __module = nodeEnv ? module : {exports:{}};
|
var __filename = 'preview-scripts/assets/Scripts/mod/chat/view/chat_input.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, 'ea923y+uqlHmL0q5Enx7xlT', 'chat_input');
|
// Scripts/mod/chat/view/chat_input.js
|
|
"use strict";
|
|
var ChatEvent = require("chat_event");
|
|
var RoleController = require("role_controller");
|
|
var ChatItemController = require("chat_item_controller");
|
|
var ChatConst = require("chat_const");
|
|
var ChatInput = cc.Class({
|
"extends": BasePanel,
|
properties: {
|
root_wnd: cc.Node,
|
is_keyboard: true,
|
// 是否是键盘输入状态
|
send_cb: null,
|
visible: true
|
},
|
ctor: function ctor() {
|
this.prefabPath = PathTool.getPrefabPath("chat", "chat_input");
|
this.chat_item_ctrl = ChatItemController.getInstance();
|
this.ctrl = require("chat_controller").getInstance();
|
},
|
// 可以初始化声明一些变量的
|
initConfig: function initConfig() {
|
this.item_code_list = {}; // item eqip存储信息
|
|
this.item_desc_list = {};
|
this.select_face = [];
|
},
|
// 初始化一些配置数据,可以用于声明一些变量之类的
|
initPanel: function initPanel() {
|
var change_nd = this.seekChild("change_btn");
|
var send_nd = this.seekChild("send_btn");
|
this.chat_sound_nd = this.seekChild("chat_sound_icon");
|
this.chat_keybord_nd = this.seekChild("chat_keybord_icon");
|
this.keyboard_nd = this.seekChild("keybord");
|
this.sound_nd = this.seekChild("song_btn");
|
this.input_ed = this.seekChild("editbox", cc.EditBox);
|
this.placholder_label = this.seekChild("PLACEHOLDER_LABEL", cc.Label);
|
this.face_btn = this.seekChild("face_btn");
|
change_nd.on(cc.Node.EventType.TOUCH_END, this.didClickChangeBtn, this);
|
send_nd.on(cc.Node.EventType.TOUCH_END, this.didClickSendBtn, this);
|
this.face_btn.on(cc.Node.EventType.TOUCH_END, this.onClickFaceBtn, this);
|
},
|
// 注册事件监听的接口,不需要手动调用,如果是使用gcore.GlobalEvent监听,可以直接调用addGlobalEvent
|
registerEvent: function registerEvent() {
|
this.addGlobalEvent(ChatEvent.CHAT_SELECT_ITEM, function (data) {
|
this.onEditTextAddItem(data);
|
}.bind(this));
|
},
|
// 预制体加载完成之后,添加到对应主节点之后的回调可以设置一些数据了
|
onShow: function onShow(params) {},
|
// 面板设置不可见的回调,这里做一些不可见的屏蔽处理
|
onHide: function onHide() {},
|
// 当面板从主节点释放掉的调用接口,需要手动调用,而且也一定要调用
|
onDelete: function onDelete() {
|
if (this.chat_input_list) this.chat_input_list.deleteMe();
|
},
|
setSendCallback: function setSendCallback(send_cb) {
|
this.send_cb = send_cb;
|
},
|
didClickChangeBtn: function didClickChangeBtn(event) {
|
if (this.is_keyboard) {
|
this.is_keyboard = false;
|
this.chat_keybord_nd.active = true;
|
this.sound_nd.active = true;
|
this.chat_sound_nd.active = false;
|
this.keyboard_nd.active = false;
|
} else {
|
this.is_keyboard = true;
|
this.chat_keybord_nd.active = false;
|
this.sound_nd.active = false;
|
this.chat_sound_nd.active = true;
|
this.keyboard_nd.active = true;
|
}
|
},
|
repleaceAtPeopleText: function repleaceAtPeopleText(text, srv_id) {
|
var num1 = text.search(/@/);
|
var num2 = text.search(/ /);
|
var len = text.length;
|
|
if (num1 != -1 && num2 != -1) {
|
var at = text.substring(num1, num2);
|
var rep = cc.js.formatStr("<on click='handler' param='atpeople srvid=%s'><u>%s</u></on>", srv_id, at + " ");
|
text = text.replace(at, rep);
|
}
|
|
return text;
|
},
|
setChannel: function setChannel(channel) {
|
this.channel = channel;
|
},
|
didClickSendBtn: function didClickSendBtn() {
|
var seedMesageArr = this.getInputText();
|
if (!seedMesageArr) return;
|
var seedMesage = seedMesageArr[0] || "";
|
var srv_id = seedMesageArr[1] || "";
|
|
if (seedMesage.length > 0 && this.send_cb) {
|
// 替换表情
|
var message = this.chat_item_ctrl.relapceFaceIconTag(seedMesage); // 替换表情
|
// 替换teim
|
|
for (var item_i in this.item_code_list) {
|
var item_info = this.item_code_list[item_i];
|
message = message.replace(new RegExp(item_info.key, 'i'), item_info.desc);
|
}
|
|
if (this.channel == ChatConst.Channel.World || this.channel == ChatConst.Channel.Cross || this.channel == ChatConst.Channel.Province || this.channel == ChatConst.Channel.Gang) {
|
//世界聊天 跨服聊天 同省聊天 帮派聊天
|
message = this.repleaceAtPeopleText(message, srv_id);
|
}
|
|
if (this.ctrl.canSend(this.channel)) {
|
this.input_ed.string = "";
|
}
|
|
this.send_cb(message);
|
if (this.chat_input_list) this.chat_input_list.setVisible(false);
|
} else {}
|
},
|
onClickFaceBtn: function onClickFaceBtn(event) {
|
if (!this.chat_input_list) {
|
var ChatInputList = require("chat_input_list");
|
|
var chat_input_list = this.chat_input_list = new ChatInputList();
|
chat_input_list.setParent(this.root_wnd);
|
chat_input_list.setSelectCB(this.onEditTextAddFace.bind(this));
|
chat_input_list.show();
|
} else {
|
if (this.chat_input_list.isOpen()) {
|
this.chat_input_list.setVisible(false);
|
} else {
|
this.chat_input_list.setVisible(true);
|
}
|
}
|
},
|
// 选中表情返回
|
onEditTextAddFace: function onEditTextAddFace(face_txt) {
|
if (face_txt) {
|
if (this.select_face.length < 5) {
|
this.select_face.push(face_txt);
|
this.input_ed.string += face_txt;
|
} else {
|
message(Utils.TI18N("发言中不能超过5个表情"));
|
}
|
}
|
},
|
onEditTextAddItem: function onEditTextAddItem(data) {
|
if (!data) return;
|
var text = this.input_ed.string;
|
|
if (text == "") {
|
this.item_code_list = {};
|
this.item_desc_list = {};
|
}
|
|
var base_id = data.base_id;
|
var share_id = data.share_id;
|
var count = data.count;
|
var role_vo = RoleController.getInstance().getRoleVo();
|
var item_config = Utils.getItemConfig(base_id);
|
var code = data.code;
|
|
if (item_config) {
|
var key = cc.js.formatStr("{%s,%s}", share_id, item_config.name);
|
var desc = this.chat_item_ctrl.buildItemMsg(base_id, role_vo.srv_id, share_id, count);
|
|
if (this.item_code_list[code]) {
|
var cur_object = this.item_code_list[code];
|
var cur_key = cur_object.key;
|
var cur_desc = cur_object.desc; // 获取原有的
|
|
text = text.replace(cur_key, key);
|
} else {
|
text = text + key;
|
}
|
|
this.item_code_list[code] = {
|
key: key,
|
desc: desc
|
};
|
this.input_ed.string = text;
|
}
|
},
|
setPlacholderLabel: function setPlacholderLabel(str) {
|
if (this.placholder_label && str) {
|
this.placholder_label.string = str;
|
}
|
},
|
// 文本框内容
|
getInputText: function getInputText() {
|
return [this.input_ed.string, this.extend];
|
},
|
setInputText: function setInputText(str, extend) {
|
this.extend = extend;
|
|
if (this.input_ed) {
|
if (!str) {
|
str = "";
|
}
|
|
this.input_ed.string = str;
|
}
|
}
|
});
|
module.exports = ChatInput;
|
|
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,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImFzc2V0c1xcU2NyaXB0c1xcbW9kXFxjaGF0XFx2aWV3XFxjaGF0X2lucHV0LmpzIl0sIm5hbWVzIjpbIkNoYXRFdmVudCIsInJlcXVpcmUiLCJSb2xlQ29udHJvbGxlciIsIkNoYXRJdGVtQ29udHJvbGxlciIsIkNoYXRDb25zdCIsIkNoYXRJbnB1dCIsImNjIiwiQ2xhc3MiLCJCYXNlUGFuZWwiLCJwcm9wZXJ0aWVzIiwicm9vdF93bmQiLCJOb2RlIiwiaXNfa2V5Ym9hcmQiLCJzZW5kX2NiIiwidmlzaWJsZSIsImN0b3IiLCJwcmVmYWJQYXRoIiwiUGF0aFRvb2wiLCJnZXRQcmVmYWJQYXRoIiwiY2hhdF9pdGVtX2N0cmwiLCJnZXRJbnN0YW5jZSIsImN0cmwiLCJpbml0Q29uZmlnIiwiaXRlbV9jb2RlX2xpc3QiLCJpdGVtX2Rlc2NfbGlzdCIsInNlbGVjdF9mYWNlIiwiaW5pdFBhbmVsIiwiY2hhbmdlX25kIiwic2Vla0NoaWxkIiwic2VuZF9uZCIsImNoYXRfc291bmRfbmQiLCJjaGF0X2tleWJvcmRfbmQiLCJrZXlib2FyZF9uZCIsInNvdW5kX25kIiwiaW5wdXRfZWQiLCJFZGl0Qm94IiwicGxhY2hvbGRlcl9sYWJlbCIsIkxhYmVsIiwiZmFjZV9idG4iLCJvbiIsIkV2ZW50VHlwZSIsIlRPVUNIX0VORCIsImRpZENsaWNrQ2hhbmdlQnRuIiwiZGlkQ2xpY2tTZW5kQnRuIiwib25DbGlja0ZhY2VCdG4iLCJyZWdpc3RlckV2ZW50IiwiYWRkR2xvYmFsRXZlbnQiLCJDSEFUX1NFTEVDVF9JVEVNIiwiZGF0YSIsIm9uRWRpdFRleHRBZGRJdGVtIiwiYmluZCIsIm9uU2hvdyIsInBhcmFtcyIsIm9uSGlkZSIsIm9uRGVsZXRlIiwiY2hhdF9pbnB1dF9saXN0IiwiZGVsZXRlTWUiLCJzZXRTZW5kQ2FsbGJhY2siLCJldmVudCIsImFjdGl2ZSIsInJlcGxlYWNlQXRQZW9wbGVUZXh0IiwidGV4dCIsInNydl9pZCIsIm51bTEiLCJzZWFyY2giLCJudW0yIiwibGVuIiwibGVuZ3RoIiwiYXQiLCJzdWJzdHJpbmciLCJyZXAiLCJqcyIsImZvcm1hdFN0ciIsInJlcGxhY2UiLCJzZXRDaGFubmVsIiwiY2hhbm5lbCIsInNlZWRNZXNhZ2VBcnIiLCJnZXRJbnB1dFRleHQiLCJzZWVkTWVzYWdlIiwibWVzc2FnZSIsInJlbGFwY2VGYWNlSWNvblRhZyIsIml0ZW1faSIsIml0ZW1faW5mbyIsIlJlZ0V4cCIsImtleSIsImRlc2MiLCJDaGFubmVsIiwiV29ybGQiLCJDcm9zcyIsIlByb3ZpbmNlIiwiR2FuZyIsImNhblNlbmQiLCJzdHJpbmciLCJzZXRWaXNpYmxlIiwiQ2hhdElucHV0TGlzdCIsInNldFBhcmVudCIsInNldFNlbGVjdENCIiwib25FZGl0VGV4dEFkZEZhY2UiLCJzaG93IiwiaXNPcGVuIiwiZmFjZV90eHQiLCJwdXNoIiwiVXRpbHMiLCJUSTE4TiIsImJhc2VfaWQiLCJzaGFyZV9pZCIsImNvdW50Iiwicm9sZV92byIsImdldFJvbGVWbyIsIml0ZW1fY29uZmlnIiwiZ2V0SXRlbUNvbmZpZyIsImNvZGUiLCJuYW1lIiwiYnVpbGRJdGVtTXNnIiwiY3VyX29iamVjdCIsImN1cl9rZXkiLCJjdXJfZGVzYyIsInNldFBsYWNob2xkZXJMYWJlbCIsInN0ciIsImV4dGVuZCIsInNldElucHV0VGV4dCIsIm1vZHVsZSIsImV4cG9ydHMiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUEsSUFBSUEsU0FBUyxHQUFHQyxPQUFPLENBQUMsWUFBRCxDQUF2Qjs7QUFDQSxJQUFJQyxjQUFjLEdBQUdELE9BQU8sQ0FBQyxpQkFBRCxDQUE1Qjs7QUFDQSxJQUFJRSxrQkFBa0IsR0FBR0YsT0FBTyxDQUFDLHNCQUFELENBQWhDOztBQUNBLElBQUlHLFNBQVMsR0FBR0gsT0FBTyxDQUFDLFlBQUQsQ0FBdkI7O0FBRUEsSUFBSUksU0FBUyxHQUFHQyxFQUFFLENBQUNDLEtBQUgsQ0FBUztBQUN4QixhQUFTQyxTQURlO0FBR3hCQyxFQUFBQSxVQUFVLEVB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QUF0QixHQUErQjBCLEdBQS9CO0FBQ0E7QUFDRCxHQXpNdUI7QUEyTXhCO0FBQ0F6QyxFQUFBQSxZQUFZLEVBQUMsd0JBQVU7QUFDdEIsV0FBTyxDQUFDLEtBQUszQyxRQUFMLENBQWMwRCxNQUFmLEVBQXNCLEtBQUsyQixNQUEzQixDQUFQO0FBQ0EsR0E5TXVCO0FBZ054QkMsRUFBQUEsWUFBWSxFQUFDLHNCQUFTRixHQUFULEVBQWNDLE1BQWQsRUFBcUI7QUFDakMsU0FBS0EsTUFBTCxHQUFjQSxNQUFkOztBQUNBLFFBQUcsS0FBS3JGLFFBQVIsRUFBaUI7QUFDaEIsVUFBRyxDQUFDb0YsR0FBSixFQUFRO0FBQ1BBLFFBQUFBLEdBQUcsR0FBQyxFQUFKO0FBQ0E7O0FBQ0QsV0FBS3BGLFFBQUwsQ0FBYzBELE1BQWQsR0FBdUIwQixHQUF2QjtBQUNBO0FBQ0Q7QUF4TnVCLENBQVQsQ0FBaEI7QUEyTkFHLE1BQU0sQ0FBQ0MsT0FBUCxHQUFpQnJILFNBQWpCIiwic291cmNlUm9vdCI6Ii8iLCJzb3VyY2VzQ29udGVudCI6WyJ2YXIgQ2hhdEV2ZW50ID0gcmVxdWlyZShcImNoYXRfZXZlbnRcIik7XHJcbnZhciBSb2xlQ29udHJvbGxlciA9IHJlcXVpcmUoXCJyb2xlX2NvbnRyb2xsZXJcIik7XHJcbnZhciBDaGF0SXRlbUNvbnRyb2xsZXIgPSByZXF1aXJlKFwiY2hhdF9pdGVtX2NvbnRyb2xsZXJcIik7XHJcbnZhciBDaGF0Q29uc3QgPSByZXF1aXJlKFwiY2hhdF9jb25zdFwiKTtcclxuXHJcbnZhciBDaGF0SW5wdXQgPSBjYy5DbGFzcyh7XHJcblx0ZXh0ZW5kczogQmFzZVBhbmVsLFxyXG5cclxuXHRwcm9wZXJ0aWVzOiB7XHJcblx0XHRyb290X3duZDogY2MuTm9kZSxcclxuXHRcdGlzX2tleWJvYXJkOiB0cnVlLCAgICAgICAgICAgICAgLy8g5piv5ZCm5piv6ZSu55uY6L6T5YWl54q25oCBXHJcblx0XHRzZW5kX2NiOiBudWxsLFxyXG5cdFx0dmlzaWJsZTogdHJ1ZSxcclxuXHR9LCBcclxuXHJcblx0Y3RvcjogZnVuY3Rpb24oKSB7XHJcbiAgICAgICAgdGhpcy5wcmVmYWJQYXRoID0gUGF0aFRvb2wuZ2V0UHJlZmFiUGF0aChcImNoYXRcIiwgXCJjaGF0X2lucHV0XCIpO1xyXG5cdFx0dGhpcy5jaGF0X2l0ZW1fY3RybCA9IENoYXRJdGVtQ29udHJvbGxlci5nZXRJbnN0YW5jZSgpO1xyXG5cdFx0dGhpcy5jdHJsID0gcmVxdWlyZShcImNoYXRfY29udHJvbGxlclwiKS5nZXRJbnN0YW5jZSgpO1xyXG5cdH0sXHJcblxyXG5cclxuICAgIC8vIOWPr+S7peWIneWni+WMluWjsOaYjuS4gOS6m+WPmOmHj+eahFxyXG4gICAgaW5pdENvbmZpZzpmdW5jdGlvbigpe1xyXG4gICAgXHR0aGlzLml0ZW1fY29kZV9saXN0ID0ge307ICAvLyBpdGVtIGVxaXDlrZjlgqjkv6Hmga9cclxuICAgIFx0dGhpcy5pdGVtX2Rlc2NfbGlzdCA9IHt9O1xyXG4gICAgXHR0aGlzLnNlbGVjdF9mYWNlID0gW107XHJcbiAgICB9LFxyXG5cclxuICAgIC8vIOWIneWni+WMluS4gOS6m+mFjee9ruaVsOaNrizlj6/ku6XnlKjkuo7lo7DmmI7kuIDkupvlj5jph4/kuYvnsbvnmoRcclxuICAgIGluaXRQYW5lbDpmdW5jdGlvbigpe1xyXG5cdFx0dmFyIGNoYW5nZV9uZCAgICAgICAgPSB0aGlzLnNlZWtDaGlsZChcImNoYW5nZV9idG5cIik7XHJcblx0XHR2YXIgc2VuZF9uZCAgICAgICAgICA9IHRoaXMuc2Vla0NoaWxkKFwic2VuZF9idG5cIik7XHJcblx0XHR0aGlzLmNoYXRfc291bmRfbmQgICA9IHRoaXMuc2Vla0NoaWxkKFwiY2hhdF9zb3VuZF9pY29uXCIpO1xyXG5cdFx0dGhpcy5jaGF0X2tleWJvcmRfbmQgPSB0aGlzLnNlZWtDaGlsZChcImNoYXRfa2V5Ym9yZF9pY29uXCIpO1xyXG5cdFx0dGhpcy5rZXlib2FyZF9uZCAgICAgPSB0aGlzLnNlZWtDaGlsZChcImtleWJvcmRcIik7XHJcblx0XHR0aGlzLnNvdW5kX25kICAgICAgICA9IHRoaXMuc2Vla0NoaWxkKFwic29uZ19idG5cIik7XHJcblx0XHR0aGlzLmlucHV0X2VkICAgICAgICA9IHRoaXMuc2Vla0NoaWxkKFwiZWRpdGJveFwiLCBjYy5FZGl0Qm94KTtcclxuXHRcdHRoaXMucGxhY2hvbGRlcl9sYWJlbCA9IHRoaXMuc2Vla0NoaWxkKFwiUExBQ0VIT0xERVJfTEFCRUxcIiwgY2MuTGFiZWwpO1xyXG5cdFx0XHJcblx0XHR0aGlzLmZhY2VfYnRuICAgICAgICA9IHRoaXMuc2Vla0NoaWxkKFwiZmFjZV9idG5cIik7XHJcblx0XHRcclxuXHRcdGNoYW5nZV9uZC5vbihjYy5Ob2RlLkV2ZW50VHlwZS5UT1VDSF9FTkQsIHRoaXMuZGlkQ2xpY2tDaGFuZ2VCdG4sIHRoaXMpO1x0XHRcclxuXHRcdHNlbmRfbmQub24oY2MuTm9kZS5FdmVudFR5cGUuVE9VQ0hfRU5ELCB0aGlzLmRpZENsaWNrU2VuZEJ0biwgdGhpcyk7XHJcblx0XHR0aGlzLmZhY2VfYnRuLm9uKGNjLk5vZGUuRXZlbnRUeXBlLlRPVUNIX0VORCwgdGhpcy5vbkNsaWNrRmFjZUJ0biwgdGhpcyk7XHJcbiAgICB9LFxyXG5cclxuICAgIC8vIOazqOWGjOS6i+S7tuebkeWQrOeahOaOpeWPoyzkuI3pnIDopoHmiYvliqjosIPnlKgs5aaC5p6c5piv5L2/55SoZ2NvcmUuR2xvYmFsRXZlbnTnm5HlkKws5Y+v5Lul55u05o6l6LCD55SoYWRkR2xvYmFsRXZlbnRcclxuICAgIHJlZ2lzdGVyRXZlbnQ6ZnVuY3Rpb24oKXtcclxuICAgIFx0dGhpcy5hZGRHbG9iYWxFdmVudChDaGF0RXZlbnQuQ0hBVF9TRUxFQ1RfSVRFTSwgZnVuY3Rpb24oZGF0YSkge1xyXG4gICAgXHRcdHRoaXMub25FZGl0VGV4dEFkZEl0ZW0oZGF0YSk7XHJcbiAgICBcdH0uYmluZCh0aGlzKSk7XHJcbiAgICB9LFxyXG5cclxuICAgIC8vIOmihOWItuS9k+WKoOi9veWujOaIkOS5i+WQjizmt7vliqDliLDlr7nlupTkuLvoioLngrnkuYvlkI7nmoTlm57osIPlj6/ku6Xorr7nva7kuIDkupvmlbDmja7kuoZcclxuICAgIG9uU2hvdzpmdW5jdGlvbihwYXJhbXMpe1xyXG5cclxuICAgIH0sXHJcblxyXG4gICAgLy8g6Z2i5p2/6K6+572u5LiN5Y+v6KeB55qE5Zue6LCDLOi/memHjOWBmuS4gOS6m+S4jeWPr+ingeeahOWxj+iUveWkhOeQhlxyXG4gICAgb25IaWRlOmZ1bmN0aW9uKCl7XHJcblxyXG4gICAgfSxcclxuXHJcbiAgICAvLyDlvZPpnaLmnb/ku47kuLvoioLngrnph4rmlL7mjonnmoTosIPnlKjmjqXlj6Ms6ZyA6KaB5omL5Yqo6LCD55SoLOiAjOS4lOS5n+S4gOWumuimgeiwg+eUqFxyXG4gICAgb25EZWxldGU6ZnVuY3Rpb24oKXtcclxuICAgIFx0aWYgKHRoaXMuY2hhdF9pbnB1dF9saXN0KVxyXG4gICAgXHRcdHRoaXMuY2hhdF9pbnB1dF9saXN0LmRlbGV0ZU1lKCk7XHJcbiAgICB9LFxyXG5cclxuXHJcblx0c2V0U2VuZENhbGxiYWNrOiBmdW5jdGlvbihzZW5kX2NiKSB7XHJcblx0XHR0aGlzLnNlbmRfY2IgPSBzZW5kX2NiO1xyXG5cdH0sXHJcblxyXG5cdGRpZENsaWNrQ2hhbmdlQnRuOiBmdW5jdGlvbihldmVudCkge1xyXG5cdFx0aWYgKHRoaXMuaXNfa2V5Ym9hcmQpIHtcclxuXHRcdFx0dGhpcy5pc19rZXlib2FyZCA9IGZhbHNlO1xyXG5cdFx0XHR0aGlzLmNoYXRfa2V5Ym9yZF9uZC5hY3RpdmUgPSB0cnVlO1xyXG5cdFx0XHR0aGlzLnNvdW5kX25kLmFjdGl2ZSA9IHRydWU7XHJcblx0XHRcdHRoaXMuY2hhdF9zb3VuZF9uZC5hY3RpdmUgPSBmYWxzZTtcclxuXHRcdFx0dGhpcy5rZXlib2FyZF9uZC5hY3RpdmUgPSBmYWxzZTtcclxuXHRcdH0gZWxzZSB7XHJcblx0XHRcdHRoaXMuaXNfa2V5Ym9hcmQgPSB0cnVlO1xyXG5cdFx0XHR0aGlzLmNoYXRfa2V5Ym9yZF9uZC5hY3RpdmUgPSBmYWxzZTtcclxuXHRcdFx0dGhpcy5zb3VuZF9uZC5hY3RpdmUgPSBmYWxzZTtcclxuXHRcdFx0dGhpcy5jaGF0X3NvdW5kX25kLmFjdGl2ZSA9IHRydWU7XHJcblx0XHRcdHRoaXMua2V5Ym9hcmRfbmQuYWN0aXZlID0gdHJ1ZTtcclxuXHRcdH1cclxuXHR9LFxyXG5cclxuXHRyZXBsZWFjZUF0UGVvcGxlVGV4dDpmdW5jdGlvbiggdGV4dCwgc3J2X2lkICl7XHJcblx0XHR2YXIgbnVtMSA9IHRleHQuc2VhcmNoKC9ALyk7XHJcblx0XHR2YXIgbnVtMiA9IHRleHQuc2VhcmNoKC8gLyk7XHJcblx0XHR2YXIgbGVuID0gdGV4dC5sZW5ndGg7XHJcblx0XHRpZihudW0xIT0tMSAmJiBudW0yIT0tMSl7XHJcblx0XHRcdHZhciBhdCA9IHRleHQuc3Vic3RyaW5nKG51bTEsbnVtMik7XHJcblx0XHRcdHZhciByZXAgPSBjYy5qcy5mb3JtYXRTdHIoXCI8b24gY2xpY2s9J2hhbmRsZXInIHBhcmFtPSdhdHBlb3BsZSBzcnZpZD0lcyc+PHU+JXM8L3U+PC9vbj5cIixzcnZfaWQsYXQrXCIgXCIpXHJcblx0XHRcdHRleHQgPSB0ZXh0LnJlcGxhY2UoYXQscmVwKTtcclxuXHRcdH1cclxuXHRcdHJldHVybiB0ZXh0O1xyXG5cdH0sXHJcblxyXG5cdHNldENoYW5uZWw6ZnVuY3Rpb24oY2hhbm5lbCl7XHJcblx0XHR0aGlzLmNoYW5uZWwgPSBjaGFubmVsO1xyXG5cdH0sXHJcblxyXG5cdGRpZENsaWNrU2VuZEJ0bjogZnVuY3Rpb24oKSB7XHJcblx0XHR2YXIgc2VlZE1lc2FnZUFyciA9IHRoaXMuZ2V0SW5wdXRUZXh0KCk7XHJcblx0XHRpZighc2VlZE1lc2FnZUFycilyZXR1cm47XHJcblxyXG5cdFx0dmFyIHNlZWRNZXNhZ2UgPSBzZWVkTWVzYWdlQXJyWzBdIHx8IFwiXCI7XHJcblx0XHR2YXIgc3J2X2lkID0gc2VlZE1lc2FnZUFyclsxXSB8fCBcIlwiO1xyXG5cdFx0XHJcblx0XHRpZiAoc2VlZE1lc2FnZS5sZW5ndGggPiAwICYm44CAdGhpcy5zZW5kX2NiKSB7XHJcblx0XHRcdC8vIOabv+aNouihqOaDhVxyXG5cdFx0XHR2YXIgbWVzc2FnZSA9IHRoaXMuY2hhdF9pdGVtX2N0cmwucmVsYXBjZUZhY2VJY29uVGFnKHNlZWRNZXNhZ2UpOyAvLyDmm7/mjaLooajmg4VcclxuXHRcdFx0Ly8g5pu/5o2idGVpbVxyXG5cdFx0XHRmb3IgKHZhciBpdGVtX2kgaW4gdGhpcy5pdGVtX2NvZGVfbGlzdCkge1xyXG5cdFx0XHRcdHZhciBpdGVtX2luZm8gPSB0aGlzLml0ZW1fY29kZV9saXN0W2l0ZW1faV07XHJcblx0XHRcdFx0bWVzc2FnZSA9IG1lc3NhZ2UucmVwbGFjZShuZXcgUmVnRXhwKGl0ZW1faW5mby5rZXksICdpJyksIGl0ZW1faW5mby5kZXNjKTtcclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0aWYodGhpcy5jaGFubmVsID09IENoYXRDb25zdC5DaGFubmVsLldvcmxkIHx8IHRoaXMuY2hhbm5lbCA9PSBDaGF0Q29uc3QuQ2hhbm5lbC5Dcm9zcyB8fCB0aGlzLmNoYW5uZWwgPT0gQ2hhdENvbnN0LkNoYW5uZWwuUHJvdmluY2UgfHwgdGhpcy5jaGFubmVsID09IENoYXRDb25zdC5DaGFubmVsLkdhbmcpey8v5LiW55WM6IGK5aSpIOi3qOacjeiBiuWkqSDlkIznnIHogYrlpKkg5biu5rS+6IGK5aSpXHJcblx0XHRcdFx0bWVzc2FnZSA9IHRoaXMucmVwbGVhY2VBdFBlb3BsZVRleHQobWVzc2FnZSwgc3J2X2lkKTtcclxuXHRcdFx0fVxyXG5cdFx0XHJcblx0XHRcdGlmKHRoaXMuY3RybC5jYW5TZW5kKHRoaXMuY2hhbm5lbCkpe1xyXG5cdFx0XHRcdHRoaXMuaW5wdXRfZWQuc3RyaW5nID0gXCJcIjtcclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0dGhpcy5zZW5kX2NiKG1lc3NhZ2UpO1xyXG5cdFx0XHRcclxuXHRcdFx0aWYgKHRoaXMuY2hhdF9pbnB1dF9saXN0KVxyXG5cdFx0XHRcdHRoaXMuY2hhdF9pbnB1dF9saXN0LnNldFZpc2libGUoZmFsc2UpO1xyXG5cdFx0fSBlbHNlIHtcclxuXHRcdH1cclxuXHR9LFxyXG5cclxuXHRvbkNsaWNrRmFjZUJ0bjogZnVuY3Rpb24oZXZlbnQpIHtcclxuXHRcdGlmICghdGhpcy5jaGF0X2lucHV0X2xpc3QpIHtcclxuXHRcdFx0dmFyIENoYXRJbnB1dExpc3QgPSByZXF1aXJlKFwiY2hhdF9pbnB1dF9saXN0XCIpO1xyXG5cdFx0XHR2YXIgY2hhdF9pbnB1dF9saXN0ID0gdGhpcy5jaGF0X2lucHV0X2xpc3QgPSBuZXcgQ2hhdElucHV0TGlzdCgpO1xyXG5cdFx0XHRjaGF0X2lucHV0X2xpc3Quc2V0UGFyZW50KHRoaXMucm9vdF93bmQpO1x0XHJcblx0XHRcdGNoYXRfaW5wdXRfbGlzdC5zZXRTZWxlY3RDQih0aGlzLm9uRWRpdFRleHRBZGRGYWNlLmJpbmQodGhpcykpO1x0XHRcclxuXHRcdFx0Y2hhdF9pbnB1dF9saXN0LnNob3coKTtcclxuXHRcdH0gZWxzZSB7XHJcblx0XHRcdGlmICh0aGlzLmNoYXRfaW5wdXRfbGlzdC5pc09wZW4oKSkge1xyXG5cdFx0XHRcdHRoaXMuY2hhdF9pbnB1dF9saXN0LnNldFZpc2libGUoZmFsc2UpO1xyXG5cdFx0XHR9IGVsc2Uge1xyXG5cdFx0XHRcdHRoaXMuY2hhdF9pbnB1dF9saXN0LnNldFZpc2libGUodHJ1ZSk7XHJcblx0XHRcdH1cclxuXHRcdH1cclxuXHR9LFxyXG5cclxuXHQvLyDpgInkuK3ooajmg4Xov5Tlm55cclxuXHRvbkVkaXRUZXh0QWRkRmFjZTogZnVuY3Rpb24oZmFjZV90eHQpIHtcclxuXHRcdGlmIChmYWNlX3R4dCkge1xyXG5cdFx0XHRpZiAodGhpcy5zZWxlY3RfZmFjZS5sZW5ndGggPCA1KSB7XHJcblx0XHRcdFx0dGhpcy5zZWxlY3RfZmFjZS5wdXNoKGZhY2VfdHh0KTtcclxuXHRcdFx0XHR0aGlzLmlucHV0X2VkLnN0cmluZyArPSBmYWNlX3R4dDtcclxuXHRcdFx0fSBlbHNlIHtcclxuXHRcdCAgICAgICAgbWVzc2FnZShVdGlscy5USTE4TihcIuWPkeiogOS4reS4jeiDvei2hei/hzXkuKrooajmg4VcIikpO1xyXG5cdFx0XHR9XHJcblx0XHR9XHJcblx0fSxcclxuXHJcblx0b25FZGl0VGV4dEFkZEl0ZW06IGZ1bmN0aW9uKGRhdGEpIHtcclxuXHRcdGlmICghZGF0YSkgcmV0dXJuO1xyXG5cdFx0dmFyIHRleHQgPSB0aGlzLmlucHV0X2VkLnN0cmluZztcclxuXHRcclxuXHRcdGlmKHRleHQgPT0gXCJcIil7XHJcblx0XHRcdHRoaXMuaXRlbV9jb2RlX2xpc3QgPSB7fTtcclxuXHRcdFx0dGhpcy5pdGVtX2Rlc2NfbGlzdCA9IHt9O1xyXG5cdFx0fVxyXG5cclxuXHRcdHZhciBiYXNlX2lkICAgICA9IGRhdGEuYmFzZV9pZDtcclxuXHRcdHZhciBzaGFyZV9pZCAgICA9IGRhdGEuc2hhcmVfaWQ7XHJcblx0XHR2YXIgY291bnQgICAgICAgPSBkYXRhLmNvdW50O1xyXG5cdFx0dmFyIHJvbGVfdm8gICAgID0gUm9sZUNvbnRyb2xsZXIuZ2V0SW5zdGFuY2UoKS5nZXRSb2xlVm8oKTtcclxuXHRcdHZhciBpdGVtX2NvbmZpZyA9IFV0aWxzLmdldEl0ZW1Db25maWcoYmFzZV9pZCk7XHJcblx0XHR2YXIgY29kZSAgICAgICAgPSBkYXRhLmNvZGU7XHJcblxyXG5cdCAgICBpZiAoaXRlbV9jb25maWcpIHtcclxuXHQgICAgICAgIHZhciBrZXkgPSBjYy5qcy5mb3JtYXRTdHIoXCJ7JXMsJXN9XCIsIHNoYXJlX2lkLCBpdGVtX2NvbmZpZy5uYW1lKTtcclxuXHQgICAgICAgIHZhciBkZXNjID0gdGhpcy5jaGF0X2l0ZW1fY3RybC5idWlsZEl0ZW1Nc2coYmFzZV9pZCwgcm9sZV92by5zcnZfaWQsIHNoYXJlX2lkLCBjb3VudCk7XHJcblxyXG5cdCAgICAgICAgaWYgKHRoaXMuaXRlbV9jb2RlX2xpc3RbY29kZV0pIHtcclxuXHQgICAgICAgICAgICB2YXIgY3VyX29iamVjdCA9IHRoaXMuaXRlbV9jb2RlX2xpc3RbY29kZV07XHJcblx0ICAgICAgICAgICAgdmFyIGN1cl9rZXkgPSBjdXJfb2JqZWN0LmtleTtcclxuXHQgICAgICAgICAgICB2YXIgY3VyX2Rlc2MgPSBjdXJfb2JqZWN0LmRlc2M7XHJcblx0ICAgICAgICAgICAgLy8g6I635Y+W5Y6f5pyJ55qEXHJcblx0ICAgICAgICAgICAgdGV4dCA9IHRleHQucmVwbGFjZShjdXJfa2V5LCBrZXkpO1xyXG5cdCAgICAgICAgfSBlbHNlIHtcclxuXHQgICAgICAgICAgICB0ZXh0ID0gdGV4dCArIGtleTtcclxuXHQgICAgICAgIH1cclxuXHJcblx0ICAgICAgICB0aGlzLml0ZW1fY29kZV9saXN0W2NvZGVdID0ge2tleTprZXksIGRlc2M6ZGVzY307XHJcblx0ICAgICAgICB0aGlzLmlucHV0X2VkLnN0cmluZyA9IHRleHQ7XHJcblx0ICAgIH0gXHJcblx0fSxcclxuXHJcblx0c2V0UGxhY2hvbGRlckxhYmVsOmZ1bmN0aW9uKHN0cil7XHJcblx0XHRpZih0aGlzLnBsYWNob2xkZXJfbGFiZWwgJiYgc3RyKXtcclxuXHRcdFx0dGhpcy5wbGFjaG9sZGVyX2xhYmVsLnN0cmluZyA9IHN0cjtcclxuXHRcdH1cclxuXHR9LFxyXG5cclxuXHQvLyAg5paH5pys5qGG5YaF5a65XHJcblx0Z2V0SW5wdXRUZXh0OmZ1bmN0aW9uKCl7XHJcblx0XHRyZXR1cm4gW3RoaXMuaW5wdXRfZWQuc3RyaW5nLHRoaXMuZXh0ZW5kXTtcclxuXHR9LFxyXG5cclxuXHRzZXRJbnB1dFRleHQ6ZnVuY3Rpb24oc3RyLCBleHRlbmQpe1xyXG5cdFx0dGhpcy5leHRlbmQgPSBleHRlbmQ7XHJcblx0XHRpZih0aGlzLmlucHV0X2VkKXtcclxuXHRcdFx0aWYoIXN0cil7XHJcblx0XHRcdFx0c3RyPVwiXCI7XHJcblx0XHRcdH1cclxuXHRcdFx0dGhpcy5pbnB1dF9lZC5zdHJpbmcgPSBzdHI7XHJcblx0XHR9XHJcblx0fSxcclxuXHJcbn0pXHJcbm1vZHVsZS5leHBvcnRzID0gQ2hhdElucHV0O1xyXG4iXX0=
|