(function() { var nodeEnv = typeof require !== 'undefined' && typeof process !== 'undefined'; var __module = nodeEnv ? module : {exports:{}}; var __filename = 'preview-scripts/assets/script/mk/system/JsbSystem.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, '144031h5xRBsa+umFGEHyuG', 'JsbSystem'); // script/mk/system/JsbSystem.ts "use strict"; var __spreadArrays = (this && this.__spreadArrays) || function () { for (var s = 0, i = 0, il = arguments.length; i < il; i++) s += arguments[i].length; for (var r = Array(s), k = 0, i = 0; i < il; i++) for (var a = arguments[i], j = 0, jl = a.length; j < jl; j++, k++) r[k] = a[j]; return r; }; Object.defineProperty(exports, "__esModule", { value: true }); /** * Jsb管理类(与安卓Java类或者IOS交互) * @description * @author 冯聪 */ var JsbSystem = /** @class */ (function () { function JsbSystem() { } /** * 是否文件存在 * @param filePath 文件路径 * @returns 是否文件存在 boolean */ JsbSystem.isFileExit = function (filePath) { return jsb.fileUtils.isFileExist(filePath); }; /** * 获取写入的路径 * @description * @returns path 写入路径(string) */ JsbSystem.getWritablePath = function () { return jsb.fileUtils.getWritablePath(); }; /** * 调用项目工程静态方法 * @description 调用Android与IOS对应的静态方法 * @param path 调用路径:"org/cocos2dx/javascript/AppActivity":java中的包名(.换成/)+class文件名,就当是路径好了 * @param methodName 调用的方法名:必须public static * @param methodSignature 方法签名:“(Ljava/lang/String;)Ljava/lang/String;”:()内的是调用的java方法的参数类型,()外面的是返回值类 * @param parameters 参数:是java方法需要传入的参数(可以多个,与methodSignature中()内的数量和类型一一对应) */ JsbSystem.callStaticMethod = function (path, methodName, methodSignature) { var _a; var parameters = []; for (var _i = 3; _i < arguments.length; _i++) { parameters[_i - 3] = arguments[_i]; } (_a = jsb.reflection).callStaticMethod.apply(_a, __spreadArrays([path, methodName, methodSignature], parameters)); }; /** * Java调用返回测试 * @description 自定义功能 JavaToCocos */ JsbSystem.backTest = function () { }; /** * 更新设备信息 * @description 自定义功能 JavaToCocos * @param info info(Java返回) */ JsbSystem.updateDeviceInfo = function (info) { if (cc.sys.os == cc.sys.OS_ANDROID) { //GameConst.updateDeviceInfo(info) } else if (cc.sys.os == cc.sys.OS_IOS) { } }; /** * 获取设备信息 * @description 自定义功能 CocosToJava */ JsbSystem.getDeviceInfo = function () { if (cc.sys.os == cc.sys.OS_ANDROID) { this.callStaticMethod(this._JSB_ANDROID_PATH, "getDeviceInfo", "()V"); } else if (cc.sys.os == cc.sys.OS_IOS) { this.callStaticMethod(this._JSB_IOS_PATH, "getDeviceInfo", ""); } }; /** * 获取包名 * @description 自定义功能 CocosToJava * @returns packName 包名 */ JsbSystem.getPackageName = function () { var packName = ''; if (cc.sys.os == cc.sys.OS_ANDROID) { packName = this.callStaticMethod(this._JSB_ANDROID_PATH, "getPackageName", "()Ljava/lang/String;"); } else if (cc.sys.os == cc.sys.OS_IOS) { packName = this.callStaticMethod("CsjAdReward", "getPackageName", ""); } return packName; }; /** * 获取微信appid * @description 自定义功能 CocosToJava * @returns appid */ JsbSystem.getWxAppId = function () { var appid = ""; if (cc.sys.os == cc.sys.OS_ANDROID) { appid = this.callStaticMethod(this._JSB_ANDROID_PATH, "getWXAppId", "()Ljava/lang/String;"); } else if (cc.sys.os == cc.sys.OS_IOS) { appid = this.callStaticMethod("CsjAdReward", "getWXAppId", ""); } return appid; }; /** * 获取广告渠道和相关id * @description 自定义功能 CocosToJava * @returns str */ JsbSystem.getAdvertisingChannel = function () { var str = ""; if (cc.sys.os == cc.sys.OS_ANDROID) { str = this.callStaticMethod(this._JSB_ANDROID_PATH, "getAdvertisingChannel", "()Ljava/lang/String;"); } else if (cc.sys.os == cc.sys.OS_IOS) { str = this.callStaticMethod("CsjAdReward", "AdvertisingChannel", ""); } return str; }; /** * 复制到剪切板 * @description Andorid功能 CocosToJava * @param str 剪切板字符串内容 */ JsbSystem.setClipboard = function (str) { if (cc.sys.os == cc.sys.OS_ANDROID) { this.callStaticMethod(this._JSB_ANDROID_PATH, "setClipboard", "(Ljava/lang/String;)V", str); } else if (cc.sys.os == cc.sys.OS_IOS) { } }; /** * 请求用户授权 * @description Andorid功能 CocosToJava */ JsbSystem.requestPermission = function () { if (cc.sys.os == cc.sys.OS_ANDROID) { this.callStaticMethod(this._JSB_ANDROID_PATH, "requestPermission", "()V"); } else if (cc.sys.os == cc.sys.OS_IOS) { this.callStaticMethod("AppController", "requestPermission", ""); } }; /** * 获取安卓的版本号 * @description Andorid功能 CocosToJava */ JsbSystem.getAppVersion = function () { if (cc.sys.os == cc.sys.OS_ANDROID) { this.callStaticMethod(this._JSB_ANDROID_PATH, "getAppVersion", "()V"); } else if (cc.sys.os == cc.sys.OS_IOS) { this.callStaticMethod("AppController", "getAppVersion", ""); } }; /** * 设置安卓得版本号 * @description Andorid功能 JavaToCocos * @param appVersion app版本号 */ JsbSystem.setAppVersion = function (appVersion) { if (cc.sys.os == cc.sys.OS_ANDROID) { // GameConst.appVersion = appVersion; } else if (cc.sys.os == cc.sys.OS_IOS) { } }; /** * 安装apk * @description Andorid功能 CocosToJava * @param apkName apkName */ JsbSystem.installApk = function (apkName) { var fullPath = this.getWritablePath() + apkName; if (cc.sys.os == cc.sys.OS_ANDROID) { this.callStaticMethod(this._JSB_ANDROID_PATH, "installApk", "(Ljava/lang/String;)V", fullPath); } else if (cc.sys.os == cc.sys.OS_IOS) { this.callStaticMethod("GameConfig", "installApk:", ""); } }; /** * 是否可以启动游戏 * @param packageName 包名 * @param start 如存在是否启动 * @returns ifCan */ JsbSystem.ifCanStartGame = function (packageName, start) { var isCan = false; if (cc.sys.os == cc.sys.OS_ANDROID) { isCan = this.callStaticMethod(this._JSB_ANDROID_PATH, "isStartGame", "(Ljava/lang/String;Z)Z", packageName, start); } else if (cc.sys.os == cc.sys.OS_IOS) { isCan = this.callStaticMethod("GameConfig", "installApk:", ""); } return isCan; }; /** * 数数事件注册 * @description 数数SDK功能 已经自动放到AS授权后了 前端无需调用 * @returns */ JsbSystem.setTAEventRegister = function () { if (cc.sys.os == cc.sys.OS_ANDROID) { this.callStaticMethod(this._JSB_ANDROID_PATH, "setTAEventRegister", "()V"); } else if (cc.sys.os == cc.sys.OS_IOS) { } }; /** * 发送自定义事件 自定义功能 CocosToJava * @description 发送统计事件 * @param key 事件的key值 * @param value 事件的value值 */ JsbSystem.sendEvent = function (key, value) { if (cc.sys.os == cc.sys.OS_ANDROID) { this.callStaticMethod(this._JSB_ANDROID_PATH, "sendEvent", "(Ljava/lang/String;Ljava/lang/String;)V", key, value); } else if (cc.sys.os == cc.sys.OS_IOS) { } }; /** * 微信授权 * @description 微信SDK功能 CocosToJava */ JsbSystem.WxAuth = function () { if (cc.sys.os == cc.sys.OS_ANDROID) { this.callStaticMethod(this._JSB_ANDROID_PATH, "WxAuth", "()V"); } else if (cc.sys.os == cc.sys.OS_IOS) { this.callStaticMethod("AppController", "WxAuth", ""); } }; /** * 获取授权code * @description 微信SDK功能 JavaToCocos * @param code 微信code(Java返回) */ JsbSystem.onGetAccessCode = function (code) { // 暂时注释,需要网络通信 // GameConst.wxCode = code; // HttpMgr.Inst.wxlogin(true); }; /** * 微信打开小游戏 * @description 微信SDK功能 CocosToJava */ JsbSystem.OpenMiniGame = function () { if (cc.sys.os == cc.sys.OS_ANDROID) { this.callStaticMethod(this._JSB_ANDROID_PATH, "OpenMiniGame", "()V"); } else if (cc.sys.os == cc.sys.OS_IOS) { this.callStaticMethod("AppController", "WxAuth", ""); } }; /** * 分享成微信小游戏 * @description 微信SDK功能 CocosToJava */ JsbSystem.ShareToMiniGame = function () { if (cc.sys.os == cc.sys.OS_ANDROID) { this.callStaticMethod(this._JSB_ANDROID_PATH, "ShareToMiniGame", "()V"); } else if (cc.sys.os == cc.sys.OS_IOS) { this.callStaticMethod("AppController", "WxAuth", ""); } }; /**代码桥在AS中的路径 */ JsbSystem._JSB_ANDROID_PATH = "org/cocos2dx/javascript/thridSdk/ThirdSdkMgr"; /**代码桥在IOS中的路径 */ JsbSystem._JSB_IOS_PATH = "ThirdSdkMgr"; return JsbSystem; }()); exports.default = JsbSystem; window['JsbMgr'] = JsbSystem; 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,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImFzc2V0c1xcc2NyaXB0XFxta1xcc3lzdGVtXFxKc2JTeXN0ZW0udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUE7Ozs7R0FJRztBQUNIO0lBQUE7SUE2UkEsQ0FBQztJQXRSRzs7OztPQUlHO0lBQ1csb0JBQVUsR0FBeEIsVUFBeUIsUUFBZ0I7UUFDckMsT0FBTyxHQUFHLENBQUMsU0FBUyxDQUFDLFdBQVcsQ0FBQyxRQUFRLENBQUMsQ0FBQztJQUMvQyxDQUFDO0lBRUQ7Ozs7T0FJRztJQUNXLHlCQUFlLEdBQTdCO1FBQ0ksT0FBTyxHQUFHLENBQUMsU0FBUyxDQUFDLGVBQWUsRUFBRSxDQUFDO0lBQzNDLENBQUM7SUFFRDs7Ozs7OztPQU9HO0lBQ1csMEJBQWdCLEdBQTlCLFVBQStCLElBQVksRUFBRSxVQUFrQixFQUFFLGVBQXVCOztRQUFFLG9CQUFrQjthQUFsQixVQUFrQixFQUFsQixxQkFBa0IsRUFBbEIsSUFBa0I7WUFBbEIsbUNBQWtCOztRQUN4RyxDQUFBLEtBQUEsR0FBRyxDQUFDLFVBQVUsQ0FBQSxDQUFDLGdCQUFnQiwyQkFBQyxJQUFJLEVBQUUsVUFBVSxFQUFFLGVBQWUsR0FBSyxVQUFVLEdBQUU7SUFDdEYsQ0FBQztJQUVEOzs7T0FHRztJQUNXLGtCQUFRLEdBQXRCO0lBRUEsQ0FBQztJQUVEOzs7O09BSUc7SUFDVywwQkFBZ0IsR0FBOUIsVUFBK0IsSUFBSTtRQUMvQixJQUFJLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxJQUFJLEVBQUUsQ0FBQyxHQUFHLENBQUMsVUFBVSxFQUFFO1lBQ2hDLGtDQUFrQztTQUNyQzthQUNJLElBQUksRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLElBQUksRUFBRSxDQUFDLEdBQUcsQ0FBQyxNQUFNLEVBQUU7U0FFcEM7SUFDTCxDQUFDO0lBRUQ7OztPQUdHO0lBQ1csdUJBQWEsR0FBM0I7UUFDSSxJQUFJLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFB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XHJcbiAqIEpzYueuoeeQhuexuyjkuI7lronljZNKYXZh57G75oiW6ICFSU9T5Lqk5LqSKVxyXG4gKiBAZGVzY3JpcHRpb25cclxuICogQGF1dGhvciDlhq/ogapcclxuICovXHJcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEpzYlN5c3RlbSB7XHJcblxyXG4gICAgLyoq5Luj56CB5qGl5ZyoQVPkuK3nmoTot6/lvoQgKi9cclxuICAgIHByaXZhdGUgc3RhdGljIF9KU0JfQU5EUk9JRF9QQVRIOiBzdHJpbmcgPSBcIm9yZy9jb2NvczJkeC9qYXZhc2NyaXB0L3RocmlkU2RrL1RoaXJkU2RrTWdyXCI7XHJcbiAgICAvKirku6PnoIHmoaXlnKhJT1PkuK3nmoTot6/lvoQgKi9cclxuICAgIHByaXZhdGUgc3RhdGljIF9KU0JfSU9TX1BBVEg6IHN0cmluZyA9IFwiVGhpcmRTZGtNZ3JcIjtcclxuXHJcbiAgICAvKipcclxuICAgICAqIOaYr+WQpuaWh+S7tuWtmOWcqFxyXG4gICAgICogQHBhcmFtIGZpbGVQYXRoIOaWh+S7tui3r+W+hCBcclxuICAgICAqIEByZXR1cm5zIOaYr+WQpuaWh+S7tuWtmOWcqCBib29sZWFuXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBzdGF0aWMgaXNGaWxlRXhpdChmaWxlUGF0aDogc3RyaW5nKTogYm9vbGVhbiB7XHJcbiAgICAgICAgcmV0dXJuIGpzYi5maWxlVXRpbHMuaXNGaWxlRXhpc3QoZmlsZVBhdGgpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICog6I635Y+W5YaZ5YWl55qE6Lev5b6EXHJcbiAgICAgKiBAZGVzY3JpcHRpb24gXHJcbiAgICAgKiBAcmV0dXJucyBwYXRoIOWGmeWFpei3r+W+hChzdHJpbmcpXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBzdGF0aWMgZ2V0V3JpdGFibGVQYXRoKCk6IHN0cmluZyB7XHJcbiAgICAgICAgcmV0dXJuIGpzYi5maWxlVXRpbHMuZ2V0V3JpdGFibGVQYXRoKCk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIFxyXG4gICAgICog6LCD55So6aG555uu5bel56iL6Z2Z5oCB5pa55rOVXHJcbiAgICAgKiBAZGVzY3JpcHRpb24gICAgICAgICAgIOiwg+eUqEFuZHJvaWTkuI5JT1Plr7nlupTnmoTpnZnmgIHmlrnms5VcclxuICAgICAqIEBwYXJhbSBwYXRoICAgICAgICAgICAg6LCD55So6Lev5b6E77yaXCJvcmcvY29jb3MyZHgvamF2YXNjcmlwdC9BcHBBY3Rpdml0eVwi77yaamF2YeS4reeahOWMheWQje+8iC7mjaLmiJAv77yJK2NsYXNz5paH5Lu25ZCN77yM5bCx5b2T5piv6Lev5b6E5aW95LqGXHJcbiAgICAgKiBAcGFyYW0gbWV0aG9kTmFtZSAgICAgIOiwg+eUqOeahOaWueazleWQje+8muW/hemhu3B1YmxpYyBzdGF0aWNcclxuICAgICAqIEBwYXJhbSBtZXRob2RTaWduYXR1cmUg5pa55rOV562+5ZCN77ya4oCcKExqYXZhL2xhbmcvU3RyaW5nOylMamF2YS9sYW5nL1N0cmluZzvigJ3vvJrvvIjvvInlhoXnmoTmmK/osIPnlKjnmoRqYXZh5pa55rOV55qE5Y+C5pWw57G75Z6L77yM77yI77yJ5aSW6Z2i55qE5piv6L+U5Zue5YC857G7XHJcbiAgICAgKiBAcGFyYW0gcGFyYW1ldGVycyAgICAgIOWPguaVsO+8muaYr2phdmHmlrnms5XpnIDopoHkvKDlhaXnmoTlj4LmlbDvvIjlj6/ku6XlpJrkuKrvvIzkuI5tZXRob2RTaWduYXR1cmXkuK3vvIjvvInlhoXnmoTmlbDph4/lkoznsbvlnovkuIDkuIDlr7nlupTvvIlcclxuICAgICAqL1xyXG4gICAgcHVibGljIHN0YXRpYyBjYWxsU3RhdGljTWV0aG9kKHBhdGg6IHN0cmluZywgbWV0aG9kTmFtZTogc3RyaW5nLCBtZXRob2RTaWduYXR1cmU6IHN0cmluZywgLi4ucGFyYW1ldGVyczogYW55KTogYW55IHtcclxuICAgICAgICBqc2IucmVmbGVjdGlvbi5jYWxsU3RhdGljTWV0aG9kKHBhdGgsIG1ldGhvZE5hbWUsIG1ldGhvZFNpZ25hdHVyZSwgLi4ucGFyYW1ldGVycyk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBKYXZh6LCD55So6L+U5Zue5rWL6K+VXHJcbiAgICAgKiBAZGVzY3JpcHRpb24g6Ieq5a6a5LmJ5Yqf6IO9IEphdmFUb0NvY29zXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBzdGF0aWMgYmFja1Rlc3QoKSB7XHJcblxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICog5pu05paw6K6+5aSH5L+h5oGvXHJcbiAgICAgKiBAZGVzY3JpcHRpb24g6Ieq5a6a5LmJ5Yqf6IO9IEphdmFUb0NvY29zXHJcbiAgICAgKiBAcGFyYW0gaW5mbyAgaW5mbyhKYXZh6L+U5ZueKVxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgc3RhdGljIHVwZGF0ZURldmljZUluZm8oaW5mbykge1xyXG4gICAgICAgIGlmIChjYy5zeXMub3MgPT0gY2Muc3lzLk9TX0FORFJPSUQpIHtcclxuICAgICAgICAgICAgLy9HYW1lQ29uc3QudXBkYXRlRGV2aWNlSW5mbyhpbmZvKVxyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIGlmIChjYy5zeXMub3MgPT0gY2Muc3lzLk9TX0lPUykge1xyXG5cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiDojrflj5borr7lpIfkv6Hmga9cclxuICAgICAqIEBkZXNjcmlwdGlvbiDoh6rlrprkuYnlip/og70gQ29jb3NUb0phdmFcclxuICAgICAqL1xyXG4gICAgcHVibGljIHN0YXRpYyBnZXREZXZpY2VJbmZvKCkge1xyXG4gICAgICAgIGlmIChjYy5zeXMub3MgPT0gY2Muc3lzLk9TX0FORFJPSUQpIHtcclxuICAgICAgICAgICAgdGhpcy5jYWxsU3RhdGljTWV0aG9kKHRoaXMuX0pTQl9BTkRST0lEX1BBVEgsIFwiZ2V0RGV2aWNlSW5mb1wiLCBcIigpVlwiKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSBpZiAoY2Muc3lzLm9zID09IGNjLnN5cy5PU19JT1MpIHtcclxuICAgICAgICAgICAgdGhpcy5jYWxsU3RhdGljTWV0aG9kKHRoaXMuX0pTQl9JT1NfUEFUSCwgXCJnZXREZXZpY2VJbmZvXCIsIFwiXCIpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIOiOt+WPluWMheWQjVxyXG4gICAgICogQGRlc2NyaXB0aW9uIOiHquWumuS5ieWKn+iDvSBDb2Nvc1RvSmF2YVxyXG4gICAgICogQHJldHVybnMgICAgIHBhY2tOYW1lIOWMheWQjVxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgc3RhdGljIGdldFBhY2thZ2VOYW1lKCkge1xyXG4gICAgICAgIGxldCBwYWNrTmFtZSA9ICcnO1xyXG4gICAgICAgIGlmIChjYy5zeXMub3MgPT0gY2Muc3lzLk9TX0FORFJPSUQpIHtcclxuICAgICAgICAgICAgcGFja05hbWUgPSB0aGlzLmNhbGxTdGF0aWNNZXRob2QodGhpcy5fSlNCX0FORFJPSURfUEFUSCwgXCJnZXRQYWNrYWdlTmFtZVwiLCBcIigpTGphdmEvbGFuZy9TdHJpbmc7XCIpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIGlmIChjYy5zeXMub3MgPT0gY2Muc3lzLk9TX0lPUykge1xyXG4gICAgICAgICAgICBwYWNrTmFtZSA9IHRoaXMuY2FsbFN0YXRpY01ldGhvZChcIkNzakFkUmV3YXJkXCIsIFwiZ2V0UGFja2FnZU5hbWVcIiwgXCJcIik7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBwYWNrTmFtZTtcclxuICAgIH1cclxuXHJcbiAgICAvKiogXHJcbiAgICAgKiDojrflj5blvq7kv6FhcHBpZFxyXG4gICAgICogQGRlc2NyaXB0aW9uIOiHquWumuS5ieWKn+iDvSBDb2Nvc1RvSmF2YVxyXG4gICAgICogQHJldHVybnMgICAgIGFwcGlkIFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgc3RhdGljIGdldFd4QXBwSWQoKSB7XHJcbiAgICAgICAgbGV0IGFwcGlkID0gXCJcIjtcclxuICAgICAgICBpZiAoY2Muc3lzLm9zID09IGNjLnN5cy5PU19BTkRST0lEKSB7XHJcbiAgICAgICAgICAgIGFwcGlkID0gdGhpcy5jYWxsU3RhdGljTWV0aG9kKHRoaXMuX0pTQl9BTkRST0lEX1BBVEgsIFwiZ2V0V1hBcHBJZFwiLCBcIigpTGphdmEvbGFuZy9TdHJpbmc7XCIpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIGlmIChjYy5zeXMub3MgPT0gY2Muc3lzLk9TX0lPUykge1xyXG4gICAgICAgICAgICBhcHBpZCA9IHRoaXMuY2FsbFN0YXRpY01ldGhvZChcIkNzakFkUmV3YXJkXCIsIFwiZ2V0V1hBcHBJZFwiLCBcIlwiLCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBhcHBpZDtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIOiOt+WPluW5v+WRiua4oOmBk+WSjOebuOWFs2lkXHJcbiAgICAgKiBAZGVzY3JpcHRpb24g6Ieq5a6a5LmJ5Yqf6IO9IENvY29zVG9KYXZhXHJcbiAgICAgKiBAcmV0dXJucyAgICAgc3RyIFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgc3RhdGljIGdldEFkdmVydGlzaW5nQ2hhbm5lbCgpOiBzdHJpbmcge1xyXG4gICAgICAgIGxldCBzdHIgPSBcIlwiO1xyXG4gICAgICAgIGlmIChjYy5zeXMub3MgPT0gY2Muc3lzLk9TX0FORFJPSUQpIHtcclxuICAgICAgICAgICAgc3RyID0gdGhpcy5jYWxsU3RhdGljTWV0aG9kKHRoaXMuX0pTQl9BTkRST0lEX1BBVEgsIFwiZ2V0QWR2ZXJ0aXNpbmdDaGFubmVsXCIsIFwiKClMamF2YS9sYW5nL1N0cmluZztcIik7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2UgaWYgKGNjLnN5cy5vcyA9PSBjYy5zeXMuT1NfSU9TKSB7XHJcbiAgICAgICAgICAgIHN0ciA9IHRoaXMuY2FsbFN0YXRpY01ldGhvZChcIkNzakFkUmV3YXJkXCIsIFwiQWR2ZXJ0aXNpbmdDaGFubmVsXCIsIFwiXCIpO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gc3RyO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICog5aSN5Yi25Yiw5Ymq5YiH5p2/XHJcbiAgICAgKiBAZGVzY3JpcHRpb24gQW5kb3JpZOWKn+iDvSBDb2Nvc1RvSmF2YVxyXG4gICAgICogQHBhcmFtIHN0ciAgIOWJquWIh+adv+Wtl+espuS4suWGheWuuVxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgc3RhdGljIHNldENsaXBib2FyZChzdHI6IHN0cmluZykge1xyXG4gICAgICAgIGlmIChjYy5zeXMub3MgPT0gY2Muc3lzLk9TX0FORFJPSUQpIHtcclxuICAgICAgICAgICAgdGhpcy5jYWxsU3RhdGljTWV0aG9kKHRoaXMuX0pTQl9BTkRST0lEX1BBVEgsIFwic2V0Q2xpcGJvYXJkXCIsIFwiKExqYXZhL2xhbmcvU3RyaW5nOylWXCIsIHN0cik7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2UgaWYgKGNjLnN5cy5vcyA9PSBjYy5zeXMuT1NfSU9TKSB7XHJcblxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIOivt+axgueUqOaIt+aOiOadgyAgXHJcbiAgICAgKiBAZGVzY3JpcHRpb24gQW5kb3JpZOWKn+iDvSBDb2Nvc1RvSmF2YVxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgc3RhdGljIHJlcXVlc3RQZXJtaXNzaW9uKCkge1xyXG4gICAgICAgIGlmIChjYy5zeXMub3MgPT0gY2Muc3lzLk9TX0FORFJPSUQpIHtcclxuICAgICAgICAgICAgdGhpcy5jYWxsU3RhdGljTWV0aG9kKHRoaXMuX0pTQl9BTkRST0lEX1BBVEgsIFwicmVxdWVzdFBlcm1pc3Npb25cIiwgXCIoKVZcIik7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2UgaWYgKGNjLnN5cy5vcyA9PSBjYy5zeXMuT1NfSU9TKSB7XHJcbiAgICAgICAgICAgIHRoaXMuY2FsbFN0YXRpY01ldGhvZChcIkFwcENvbnRyb2xsZXJcIiwgXCJyZXF1ZXN0UGVybWlzc2lvblwiLCBcIlwiKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiDojrflj5blronljZPnmoTniYjmnKzlj7cgIFxyXG4gICAgICogQGRlc2NyaXB0aW9uIEFuZG9yaWTlip/og70gQ29jb3NUb0phdmFcclxuICAgICAqL1xyXG4gICAgcHVibGljIHN0YXRpYyBnZXRBcHBWZXJzaW9uKCkge1xyXG4gICAgICAgIGlmIChjYy5zeXMub3MgPT0gY2Muc3lzLk9TX0FORFJPSUQpIHtcclxuICAgICAgICAgICAgdGhpcy5jYWxsU3RhdGljTWV0aG9kKHRoaXMuX0pTQl9BTkRST0lEX1BBVEgsIFwiZ2V0QXBwVmVyc2lvblwiLCBcIigpVlwiKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSBpZiAoY2Muc3lzLm9zID09IGNjLnN5cy5PU19JT1MpIHtcclxuICAgICAgICAgICAgdGhpcy5jYWxsU3RhdGljTWV0aG9kKFwiQXBwQ29udHJvbGxlclwiLCBcImdldEFwcFZlcnNpb25cIiwgXCJcIik7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgKiDorr7nva7lronljZPlvpfniYjmnKzlj7dcclxuICAgICogQGRlc2NyaXB0aW9uIEFuZG9yaWTlip/og70gSmF2YVRvQ29jb3NcclxuICAgICogQHBhcmFtICAgICAgIGFwcFZlcnNpb24gYXBw54mI5pys5Y+3XHJcbiAgICAqL1xyXG4gICAgcHVibGljIHN0YXRpYyBzZXRBcHBWZXJzaW9uKGFwcFZlcnNpb246IHN0cmluZykge1xyXG4gICAgICAgIGlmIChjYy5zeXMub3MgPT0gY2Muc3lzLk9TX0FORFJPSUQpIHtcclxuICAgICAgICAgICAgLy8gR2FtZUNvbnN0LmFwcFZlcnNpb24gPSBhcHBWZXJzaW9uO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIGlmIChjYy5zeXMub3MgPT0gY2Muc3lzLk9TX0lPUykge1xyXG5cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiDlronoo4VhcGtcclxuICAgICAqIEBkZXNjcmlwdGlvbiAgIEFuZG9yaWTlip/og70gQ29jb3NUb0phdmFcclxuICAgICAqIEBwYXJhbSBhcGtOYW1lIGFwa05hbWVcclxuICAgICAqL1xyXG4gICAgcHVibGljIHN0YXRpYyBpbnN0YWxsQXBrKGFwa05hbWU6IHN0cmluZykge1xyXG4gICAgICAgIGxldCBmdWxsUGF0aCA9IHRoaXMuZ2V0V3JpdGFibGVQYXRoKCkgKyBhcGtOYW1lO1xyXG4gICAgICAgIGlmIChjYy5zeXMub3MgPT0gY2Muc3lzLk9TX0FORFJPSUQpIHtcclxuICAgICAgICAgICAgdGhpcy5jYWxsU3RhdGljTWV0aG9kKHRoaXMuX0pTQl9BTkRST0lEX1BBVEgsIFwiaW5zdGFsbEFwa1wiLCBcIihMamF2YS9sYW5nL1N0cmluZzspVlwiLCBmdWxsUGF0aCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2UgaWYgKGNjLnN5cy5vcyA9PSBjYy5zeXMuT1NfSU9TKSB7XHJcbiAgICAgICAgICAgIHRoaXMuY2FsbFN0YXRpY01ldGhvZChcIkdhbWVDb25maWdcIiwgXCJpbnN0YWxsQXBrOlwiLCBcIlwiKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIFxyXG4gICAgICog5piv5ZCm5Y+v5Lul5ZCv5Yqo5ri45oiPXHJcbiAgICAgKiBAcGFyYW0gcGFja2FnZU5hbWUg5YyF5ZCNXHJcbiAgICAgKiBAcGFyYW0gc3RhcnQgICAgICAg5aaC5a2Y5Zyo5piv5ZCm5ZCv5YqoXHJcbiAgICAgKiBAcmV0dXJucyBpZkNhbiAgICAgICAgIFxyXG4gICAgICovXHJcbiAgICBzdGF0aWMgaWZDYW5TdGFydEdhbWUocGFja2FnZU5hbWU6IHN0cmluZywgc3RhcnQ6IGJvb2xlYW4pOiBib29sZWFuIHtcclxuICAgICAgICBsZXQgaXNDYW4gPSBmYWxzZTtcclxuICAgICAgICBpZiAoY2Muc3lzLm9zID09IGNjLnN5cy5PU19BTkRST0lEKSB7XHJcbiAgICAgICAgICAgIGlzQ2FuID0gdGhpcy5jYWxsU3RhdGljTWV0aG9kKHRoaXMuX0pTQl9BTkRST0lEX1BBVEgsIFwiaXNTdGFydEdhbWVcIiwgXCIoTGphdmEvbGFuZy9TdHJpbmc7WilaXCIsIHBhY2thZ2VOYW1lLCBzdGFydCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2UgaWYgKGNjLnN5cy5vcyA9PSBjYy5zeXMuT1NfSU9TKSB7XHJcbiAgICAgICAgICAgIGlzQ2FuID0gdGhpcy5jYWxsU3RhdGljTWV0aG9kKFwiR2FtZUNvbmZpZ1wiLCBcImluc3RhbGxBcGs6XCIsIFwiXCIpO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gaXNDYW47XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiDmlbDmlbDkuovku7bms6jlhoxcclxuICAgICAqIEBkZXNjcmlwdGlvbiDmlbDmlbBTREvlip/og70g5bey57uP6Ieq5Yqo5pS+5YiwQVPmjojmnYPlkI7kuoYg5YmN56uv5peg6ZyA6LCD55SoXHJcbiAgICAgKiBAcmV0dXJucyBcclxuICAgICAqL1xyXG4gICAgc3RhdGljIHNldFRBRXZlbnRSZWdpc3RlcigpIHtcclxuICAgICAgICBpZiAoY2Muc3lzLm9zID09IGNjLnN5cy5PU19BTkRST0lEKSB7XHJcbiAgICAgICAgICAgIHRoaXMuY2FsbFN0YXRpY01ldGhvZCh0aGlzLl9KU0JfQU5EUk9JRF9QQVRILCBcInNldFRBRXZlbnRSZWdpc3RlclwiLCBcIigpVlwiKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSBpZiAoY2Muc3lzLm9zID09IGNjLnN5cy5PU19JT1MpIHtcclxuXHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICog5Y+R6YCB6Ieq5a6a5LmJ5LqL5Lu2IOiHquWumuS5ieWKn+iDvSBDb2Nvc1RvSmF2YVxyXG4gICAgICogQGRlc2NyaXB0aW9uICDlj5HpgIHnu5/orqHkuovku7ZcclxuICAgICAqIEBwYXJhbSBrZXkgICAg5LqL5Lu255qEa2V55YC8XHJcbiAgICAgKiBAcGFyYW0gdmFsdWUgIOS6i+S7tueahHZhbHVl5YC8XHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBzdGF0aWMgc2VuZEV2ZW50KGtleTogc3RyaW5nLCB2YWx1ZTogc3RyaW5nKSB7XHJcbiAgICAgICAgaWYgKGNjLnN5cy5vcyA9PSBjYy5zeXMuT1NfQU5EUk9JRCkge1xyXG4gICAgICAgICAgICB0aGlzLmNhbGxTdGF0aWNNZXRob2QodGhpcy5fSlNCX0FORFJPSURfUEFUSCwgXCJzZW5kRXZlbnRcIiwgXCIoTGphdmEvbGFuZy9TdHJpbmc7TGphdmEvbGFuZy9TdHJpbmc7KVZcIiwga2V5LCB2YWx1ZSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2UgaWYgKGNjLnN5cy5vcyA9PSBjYy5zeXMuT1NfSU9TKSB7XHJcblxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIOW+ruS/oeaOiOadg1xyXG4gICAgICogQGRlc2NyaXB0aW9uIOW+ruS/oVNES+WKn+iDvSBDb2Nvc1RvSmF2YVxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgc3RhdGljIFd4QXV0aCgpIHtcclxuICAgICAgICBpZiAoY2Muc3lzLm9zID09IGNjLnN5cy5PU19BTkRST0lEKSB7XHJcbiAgICAgICAgICAgIHRoaXMuY2FsbFN0YXRpY01ldGhvZCh0aGlzLl9KU0JfQU5EUk9JRF9QQVRILCBcIld4QXV0aFwiLCBcIigpVlwiKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSBpZiAoY2Muc3lzLm9zID09IGNjLnN5cy5PU19JT1MpIHtcclxuICAgICAgICAgICAgdGhpcy5jYWxsU3RhdGljTWV0aG9kKFwiQXBwQ29udHJvbGxlclwiLCBcIld4QXV0aFwiLCBcIlwiKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiDojrflj5bmjojmnYNjb2RlXHJcbiAgICAgKiBAZGVzY3JpcHRpb24g5b6u5L+hU0RL5Yqf6IO9IEphdmFUb0NvY29zXHJcbiAgICAgKiBAcGFyYW0gY29kZSAg5b6u5L+hY29kZShKYXZh6L+U5ZueKVxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgc3RhdGljIG9uR2V0QWNjZXNzQ29kZShjb2RlKSB7XHJcblxyXG4gICAgICAgIC8vIOaaguaXtuazqOmHiizpnIDopoHnvZHnu5zpgJrkv6FcclxuICAgICAgICAvLyBHYW1lQ29uc3Qud3hDb2RlID0gY29kZTtcclxuICAgICAgICAvLyBIdHRwTWdyLkluc3Qud3hsb2dpbih0cnVlKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIOW+ruS/oeaJk+W8gOWwj+a4uOaIj1xyXG4gICAgICogQGRlc2NyaXB0aW9uIOW+ruS/oVNES+WKn+iDvSBDb2Nvc1RvSmF2YVxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgc3RhdGljIE9wZW5NaW5pR2FtZSgpIHtcclxuICAgICAgICBpZiAoY2Muc3lzLm9zID09IGNjLnN5cy5PU19BTkRST0lEKSB7XHJcbiAgICAgICAgICAgIHRoaXMuY2FsbFN0YXRpY01ldGhvZCh0aGlzLl9KU0JfQU5EUk9JRF9QQVRILCBcIk9wZW5NaW5pR2FtZVwiLCBcIigpVlwiKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSBpZiAoY2Muc3lzLm9zID09IGNjLnN5cy5PU19JT1MpIHtcclxuICAgICAgICAgICAgdGhpcy5jYWxsU3RhdGljTWV0aG9kKFwiQXBwQ29udHJvbGxlclwiLCBcIld4QXV0aFwiLCBcIlwiKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiDliIbkuqvmiJDlvq7kv6HlsI/muLjmiI9cclxuICAgICAqIEBkZXNjcmlwdGlvbiDlvq7kv6FTREvlip/og70gQ29jb3NUb0phdmFcclxuICAgICAqL1xyXG4gICAgcHVibGljIHN0YXRpYyBTaGFyZVRvTWluaUdhbWUoKSB7XHJcbiAgICAgICAgaWYgKGNjLnN5cy5vcyA9PSBjYy5zeXMuT1NfQU5EUk9JRCkge1xyXG4gICAgICAgICAgICB0aGlzLmNhbGxTdGF0aWNNZXRob2QodGhpcy5fSlNCX0FORFJPSURfUEFUSCwgXCJTaGFyZVRvTWluaUdhbWVcIiwgXCIoKVZcIik7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2UgaWYgKGNjLnN5cy5vcyA9PSBjYy5zeXMuT1NfSU9TKSB7XHJcbiAgICAgICAgICAgIHRoaXMuY2FsbFN0YXRpY01ldGhvZChcIkFwcENvbnRyb2xsZXJcIiwgXCJXeEF1dGhcIiwgXCJcIik7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG59XHJcblxyXG53aW5kb3dbJ0pzYk1nciddID0gSnNiU3lzdGVtXHJcbiJdfQ==