(function() { var nodeEnv = typeof require !== 'undefined' && typeof process !== 'undefined'; var __module = nodeEnv ? module : {exports:{}}; var __filename = 'preview-scripts/assets/Script/Sdk/MiniGameManager.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, '0d272pXVChFDqi5FXTD2JlR', 'MiniGameManager'); // Script/Sdk/MiniGameManager.ts "use strict"; var __extends = (this && this.__extends) || (function () { var extendStatics = function (d, b) { extendStatics = Object.setPrototypeOf || ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; }; return extendStatics(d, b); }; return function (d, b) { extendStatics(d, b); function __() { this.constructor = d; } d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); }; })(); var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) { var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; return c > 3 && r && Object.defineProperty(target, key, r), r; }; Object.defineProperty(exports, "__esModule", { value: true }); exports.MiniGameManager = void 0; var MiniGameSdk_1 = require("./MiniGameSdk"); var _a = cc._decorator, ccclass = _a.ccclass, property = _a.property; var EWechatAD; (function (EWechatAD) { EWechatAD["CUMSTOM_01"] = "adunit-f7c2417eb2c2e473"; })(EWechatAD || (EWechatAD = {})); var MiniGameManager = /** @class */ (function (_super) { __extends(MiniGameManager, _super); function MiniGameManager() { var _this = _super !== null && _super.apply(this, arguments) || this; _this.entranceView = null; return _this; } MiniGameManager_1 = MiniGameManager; Object.defineProperty(MiniGameManager, "instance", { get: function () { if (!MiniGameManager_1._instance) { MiniGameManager_1._instance = new MiniGameManager_1(); } return MiniGameManager_1._instance; }, enumerable: false, configurable: true }); MiniGameManager.prototype.start = function () { // 禁用游戏入口视图 // this.entranceView.active = false; // MiniGameSdk.API.getUserProfile(this.setUserId); // cc.fx.GameTool.setUserInfo(""); this.onGetLoginCode(); // 尝试获取游戏入口按钮,如果存在则直接返回,不进行后续操作 // let buttonEntrance = this.node.getChildByName('Btns')?.getChildByName('Button_EntranceView'); // if (buttonEntrance) { // return; // } // 如果是字节跳动小游戏环境,检查侧边栏是否存在 if (MiniGameSdk_1.MiniGameSdk.isBytedance()) { //抖音环境,检测侧边栏存在 MiniGameSdk_1.MiniGameSdk.BytedanceSidebar.checkSideBar(function (success) { // 根据侧边栏存在性激活或禁用游戏入口按钮 // buttonEntrance.active = success; }); } else { // 非抖音小游戏环境,直接激活游戏入口按钮 // 非抖音环境,正常显示按钮 // buttonEntrance.active = true; } // 设置监听器,以处理来自侧边栏的交互事件 MiniGameSdk_1.MiniGameSdk.BytedanceSidebar.listenFromSidebar(function (success) { // 如果交互成功,显示奖励提示 if (success) { MiniGameSdk_1.MiniGameSdk.API.showToast('侧边栏奖励', 5); } }); }; MiniGameManager.prototype.update = function (deltaTime) { }; /** * 弹出广告横幅。 * 此方法用于加载并显示广告横幅。它首先加载指定广告位的横幅广告,然后显示广告。 * 加载广告和显示广告是通过MiniGameSdk.AdvertManager的实例方法来实现的。 * * @remarks * 此方法提供了两种显示横幅广告的方式: * 1. 默认方式:调用showBanner方法显示广告,系统会自动选择显示位置。 * 2. 指定位置方式:可以通过传入额外的参数来指定广告显示在屏幕的顶部或底部,或者通过坐标指定显示位置。 * * 示例代码中注释掉了两种显示广告的具体方法,可以根据实际需求选择使用。 */ MiniGameManager.prototype.onShowBanner = function () { // 加载指定广告位的横幅广告。 MiniGameSdk_1.MiniGameSdk.AdvertManager.instance.loadBanner('adunit-4e7ef467e3eaab51'); // 默认方式显示横幅广告。 // 方法1:默认调用 MiniGameSdk_1.MiniGameSdk.AdvertManager.instance.showBanner(); // 示例:指定屏幕底部正中显示横幅广告。 // 方法2:指定屏幕顶部或底部正中 // MiniGameSdk.AdvertManager.instance.showBanner('adunit-4e7ef467e3eaab51', MiniGameSdk.EAdBannerLocation.BOTTOM); // 示例:通过坐标指定位置显示横幅广告。 // 方法2:指定坐标 // MiniGameSdk.AdvertManager.instance.showBanner('adunit-4e7ef467e3eaab51', { top: 10, left: 10 }); }; /** * 隐藏广告横幅的函数。 * * 该函数调用MiniGameSdk.AdvertManager实例的方法,用于隐藏广告横幅。 * 当需要暂时停止展示广告或用户主动请求隐藏广告时,可以调用此函数。 * * @remarks * 此函数不接受任何参数,也不返回任何值。 * 它单纯地触发广告横幅的隐藏操作,具体实现依赖于AdvertManager的实现。 */ MiniGameManager.prototype.onHideBanner = function () { MiniGameSdk_1.MiniGameSdk.AdvertManager.instance.hideBanner(); }; /** * 显示插屏广告的函数。 * * 此函数调用MiniGameSdk.AdvertManager实例的方法,以显示一个指定的插屏广告。 * 它使用了硬编码的广告单元标识符,这意味着它专为特定的广告位设计。 * 在实际应用中,可能需要根据应用的配置或用户的特定条件来动态选择广告单元标识符。 */ MiniGameManager.prototype.onShowInterstitial = function () { MiniGameSdk_1.MiniGameSdk.AdvertManager.instance.showInterstitial('adunit-eadd67851d3050ad'); }; /** * 调用广告管理器加载并展示自定义广告。 * 此方法首先通过广告管理器的实例加载指定的自定义广告单元,然后展示这个自定义广告。 * 加载和展示广告是广告管理系统中的常见操作,这里通过两步分别完成加载和展示的过程, * 以确保广告在展示前正确且充分地被加载。 */ MiniGameManager.prototype.onShowCustom = function () { // 加载指定的自定义广告单元。 MiniGameSdk_1.MiniGameSdk.AdvertManager.instance.loadCustom(EWechatAD.CUMSTOM_01); // 展示已加载的自定义广告。 MiniGameSdk_1.MiniGameSdk.AdvertManager.instance.showCustom(EWechatAD.CUMSTOM_01); }; /** * 隐藏自定义广告。 * * 本函数调用MiniGameSdk.AdvertManager.instance.hideCustom()来隐藏自定义广告。 * 这是对接广告管理系统的一部分,用于控制广告的显示与隐藏。 * 在需要隐藏自定义广告的场景下,调用此函数即可实现相应功能。 */ MiniGameManager.prototype.onHideCustom = function () { MiniGameSdk_1.MiniGameSdk.AdvertManager.instance.hideCustom(EWechatAD.CUMSTOM_01); }; /** * 触发显示视频广告的函数。 * 通过调用MiniGameSdk.AdvertManager.instance.showVideo方法,显示一个视频广告,并根据用户观看广告的情况执行相应的逻辑。 * * @remarks * 此函数首先传入一个广告单元ID,用于标识要显示的视频广告。然后传入一个回调函数,该回调函数在用户观看广告后被调用,无论用户是完成了观看、拒绝了观看还是观看过程中发生了错误。 * 回调函数接收两个参数:一个是用户观看广告的结果,另一个是用户观看的广告数量。根据观看结果的不同,显示不同的提示信息。 */ MiniGameManager.prototype.onShowVideo = function () { // 广告单元ID,用于标识要显示的视频广告 // 广告单元ID的样例 //抖音形如: 1re3nfqkmy81m4m8ge //微信形如: adunit-a7718f6e195e42fe MiniGameSdk_1.MiniGameSdk.AdvertManager.instance.showVideo('1re3nfqkmy81m4m8ge', function (res, count) { // 输出用户观看的广告数量 console.log('用户看的视频广告个数是:', count); // 根据用户观看广告的结果,执行不同的逻辑 switch (res) { case MiniGameSdk_1.MiniGameSdk.EAdVideoResult.ACCEPT: // 用户完成了广告观看,显示奖励提示 MiniGameSdk_1.MiniGameSdk.API.showToast('用户看完广告,可以奖励'); break; case MiniGameSdk_1.MiniGameSdk.EAdVideoResult.REJECT: // 用户拒绝了广告观看,显示不奖励提示 MiniGameSdk_1.MiniGameSdk.API.showToast('用户拒绝掉广告,不奖励'); break; case MiniGameSdk_1.MiniGameSdk.EAdVideoResult.ERROR: // 广告播放发生错误,显示错误提示 MiniGameSdk_1.MiniGameSdk.API.showToast('播放广告发生错误,不奖励'); break; default: // 其他情况,不作处理 break; } }); }; /** * 引导用户分享应用给朋友。 * * 通过调用MiniGameSdk的API分享功能,向用户的朋友圈发送邀请,邀请他们一起玩游戏。 * 这是一个重要的推广手段,可以增加应用的曝光度和用户量。 * * @remarks * 此方法中调用的API依赖于特定的小游戏平台,因此在不同的平台上可能需要不同的实现。 */ MiniGameManager.prototype.onShare = function () { MiniGameSdk_1.MiniGameSdk.API.shareAppToFriends('来玩游戏吧'); }; /** * 显示一个toast提示。 * * 通过调用MiniGameSdk的API方法来显示一个简短的提示信息。toast是一种轻量级的提示方式,用于在界面上短暂地展示一些信息,不影响用户操作。 * 这里使用了固定的提示文本 '这是一个toast',在实际应用中,可以根据需要动态设置提示文本。 */ MiniGameManager.prototype.onShowToast = function () { MiniGameSdk_1.MiniGameSdk.API.showToast('这是一个toast'); }; /** * 触发设备振动功能。 * * 该方法用于调用MiniGameSdk提供的API,以实现设备的振动功能。当需要提醒用户或提供触觉反馈时,可以调用此方法。 * 例如,在游戏或应用中,当用户完成特定操作或发生特定事件时,可以通过振动给予用户反馈。 * * @remarks * 此方法无参数,也不返回任何值。 */ MiniGameManager.prototype.onVirbrate = function () { MiniGameSdk_1.MiniGameSdk.API.vibrate(); }; /** * 重新启动游戏实例。 * * 此函数调用MiniGameSdk中的API重新启动游戏。重新启动操作可能是为了初始化游戏环境、重置游戏状态或处理其他需要重启的场景。 * 调用此函数后,游戏将会重新开始,当前的游戏状态将会被清除。 * * @remarks * 此函数不接受任何参数。 * * @returns 无返回值。 */ MiniGameManager.prototype.onReboot = function () { MiniGameSdk_1.MiniGameSdk.API.reboot(); }; /** * 当前函数用于在迷你游戏中实现退出功能。 * 它调用了MiniGameSdk提供的API方法来触发退出操作。 * 该方法通常在需要结束当前迷你游戏或返回到上一级菜单时被调用。 */ MiniGameManager.prototype.onExit = function () { MiniGameSdk_1.MiniGameSdk.API.exit(); }; /** * 显示分享菜单。 * * 通过调用MiniGameSdk的API方法,触发显示分享菜单的操作。此函数旨在提供一个统一的入口, * 以便在需要时轻松调用分享功能,而无需直接与具体的SDK接口交互。 * * @remarks * 此方法不接受任何参数,也不返回任何值。 */ MiniGameManager.prototype.onShowShareMenu = function () { MiniGameSdk_1.MiniGameSdk.API.showShareMenu(); }; /** * 导航到指定的小游戏。 * * 本函数用于触发导航到一个特定的小游戏。这需要提供目标小游戏的ID, * 以便系统能够正确地将用户重定向到目标小游戏。 * * 注意:这里的'xxx'是占位符,实际使用时需要替换为具体的小游戏ID。 */ MiniGameManager.prototype.onNavigate = function () { MiniGameSdk_1.MiniGameSdk.API.navigateTo('xxx'); // xxx替换为你的小游戏id }; /** * 激活字节跳动入口视图。 * * 此方法用于将字节跳动入口视图设置为活跃状态。当需要在用户界面中显示字节跳动的入口时, * 可以调用此方法来激活相应的视图元素,使其对用户可见。 */ MiniGameManager.prototype.onBytedanceEntranceView = function () { // this.entranceView.active = true; }; /** * 请求登录代码 * * 本函数用于触发小程序的登录流程,获取微信或头条等第三方平台的登录代码。 * 这些代码可以用于后续的用户身份验证和数据同步流程。 */ MiniGameManager.prototype.onGetLoginCode = function () { var _this = this; // 调用MiniGameSdk的API登录方法,传入一个回调函数处理登录结果 MiniGameSdk_1.MiniGameSdk.API.login(function (code, anonymousCode) { // 打印微信或头条的登录代码 console.log('Wechat Or Bytedance Code:', code); // 打印头条的匿名登录代码 // console.log('Bytedance Anonymous Code:', anonymousCode); if (code) { cc.fx.GameTool.getUserId(code, function (data) { return _this.setUserId(data); }); } }); }; MiniGameManager.prototype.setUserId = function (data) { cc.fx.GameConfig.GM_INFO.userId = data.data.userId; MiniGameSdk_1.MiniGameSdk.API.getUserInfo(this.setUserInfo); }; MiniGameManager.prototype.setUserInfo = function (data) { console.log("获取到的用户信息", data.userInfo); var useData = { "gameId": cc.fx.GameConfig.GM_INFO.gameId, "userId": cc.fx.GameConfig.GM_INFO.userId, "nickName": data.userInfo.nickName, "pic": data.userInfo.avatarUrl }; console.log("即将上传的用户信息:", cc.fx.GameConfig.GM_INFO.userId, data.userInfo.nickName, data.userInfo.avatarUrl); console.log("Post数据:", useData); cc.fx.HttpUtil.setUserInfo(useData, function (res) { console.log("上传成功:", res); }); }; /** * 创建并显示游戏圈按钮 * * 本函数通过调用MiniGameSdk的GameClub实例方法,实现游戏俱乐部的创建和显示。 * 它首先配置俱乐部的图标类型和位置大小,然后创建俱乐部,最后显示俱乐部。 * 这样做是为了在小游戏内创建并展示一个游戏俱乐部的图标,供玩家加入或互动。 */ MiniGameManager.prototype.onCreateClub = function () { // 配置俱乐部图标为绿色,设置图标的位置为顶部200像素,左侧0像素 MiniGameSdk_1.MiniGameSdk.GameClub.instance.create(MiniGameSdk_1.MiniGameSdk.EGameClubIcon.GREEN, { top: 200, left: 0 }, { width: 50, height: 50 }); // 显示游戏俱乐部图标 MiniGameSdk_1.MiniGameSdk.GameClub.instance.show(); }; var MiniGameManager_1; __decorate([ property(cc.Node) ], MiniGameManager.prototype, "entranceView", void 0); MiniGameManager = MiniGameManager_1 = __decorate([ ccclass ], MiniGameManager); return MiniGameManager; }(cc.Component)); exports.MiniGameManager = MiniGameManager; 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,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImFzc2V0c1xcU2NyaXB0XFxTZGtcXE1pbmlHYW1lTWFuYWdlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQ0EsNkNBQTRDO0FBQ3RDLElBQUEsS0FBd0IsRUFBRSxDQUFDLFVBQVUsRUFBbkMsT0FBTyxhQUFBLEVBQUUsUUFBUSxjQUFrQixDQUFDO0FBQzVDLElBQUssU0FFSjtBQUZELFdBQUssU0FBUztJQUNWLG1EQUFzQyxDQUFBO0FBQzFDLENBQUMsRUFGSSxTQUFTLEtBQVQsU0FBUyxRQUViO0FBR0Q7SUFBcUMsbUNBQVk7SUFBakQ7UUFBQSxxRUEyVUM7UUF4VUcsa0JBQVksR0FBWSxJQUFJLENBQUM7O0lBd1VqQyxDQUFDO3dCQTNVWSxlQUFlO0lBa0J4QixzQkFBVywyQkFBUTthQUFuQjtZQUNJLElBQUksQ0FBQyxpQkFBZSxDQUFDLFNBQVMsRUFBRTtnQkFDNUIsaUJBQWUsQ0FBQyxTQUFTLEdBQUcsSUFBSSxpQkFBZSxFQUFFLENBQUM7YUFDckQ7WUFDRCxPQUFPLGlCQUFlLENBQUMsU0FBUyxDQUFDO1FBQ3JDLENBQUM7OztPQUFBO0lBRUQsK0JBQUssR0FBTDtRQUNJLFdBQVc7UUFDWCxvQ0FBb0M7UUFDcEMsa0RBQWtEO1FBQ2xELGtDQUFrQztRQUNsQyxJQUFJLENBQUMsY0FBYyxFQUFFLENBQUM7UUFDdEIsK0JBQStCO1FBQy9CLGdHQUFnRztRQUNoRyx3QkFBd0I7UUFDeEIsY0FBYztRQUNkLElBQUk7UUFFSix5QkFBeUI7UUFFekIsSUFBSSx5QkFBVyxDQUFDLFdBQVcsRUFBRSxFQUFFO1lBQzNCLGNBQWM7WUFDZCx5QkFBVyxDQUFDLGdCQUFnQixDQUFDLFlBQVksQ0FBQyxVQUFDLE9BQWdCO2dCQUN2RCxzQkFBc0I7Z0JBQ3RCLG1DQUFtQztZQUN2QyxDQUFDLENBQUMsQ0FBQztTQUNOO2FBQU07WUFDSCxzQkFBc0I7WUFDdEIsZUFBZTtZQUNmLGdDQUFn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QixDQUFDLENBQUMsQ0FBQztJQUNQLENBQUM7SUFFRDs7Ozs7O09BTUc7SUFDSCxzQ0FBWSxHQUFaO1FBQ0ksbUNBQW1DO1FBQ25DLHlCQUFXLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQ2hDLHlCQUFXLENBQUMsYUFBYSxDQUFDLEtBQUssRUFDL0IsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLElBQUksRUFBRSxDQUFDLEVBQUUsRUFDckIsRUFBRSxLQUFLLEVBQUUsRUFBRSxFQUFFLE1BQU0sRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBQy9CLFlBQVk7UUFDWix5QkFBVyxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsSUFBSSxFQUFFLENBQUM7SUFDekMsQ0FBQzs7SUF2VUQ7UUFEQyxRQUFRLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQzt5REFDVztJQUhwQixlQUFlO1FBRDNCLE9BQU87T0FDSyxlQUFlLENBMlUzQjtJQUFELHNCQUFDO0NBM1VELEFBMlVDLENBM1VvQyxFQUFFLENBQUMsU0FBUyxHQTJVaEQ7QUEzVVksMENBQWUiLCJmaWxlIjoiIiwic291cmNlUm9vdCI6Ii8iLCJzb3VyY2VzQ29udGVudCI6WyJcclxuaW1wb3J0IHsgTWluaUdhbWVTZGsgfSBmcm9tIFwiLi9NaW5pR2FtZVNka1wiO1xyXG5jb25zdCB7IGNjY2xhc3MsIHByb3BlcnR5IH0gPSBjYy5fZGVjb3JhdG9yO1xyXG5lbnVtIEVXZWNoYXRBRCB7XHJcbiAgICBDVU1TVE9NXzAxID0gJ2FkdW5pdC1mN2MyNDE3ZWIyYzJlNDczJ1xyXG59XHJcblxyXG5AY2NjbGFzc1xyXG5leHBvcnQgY2xhc3MgTWluaUdhbWVNYW5hZ2VyIGV4dGVuZHMgY2MuQ29tcG9uZW50IHtcclxuXHJcbiAgICBAcHJvcGVydHkoY2MuTm9kZSlcclxuICAgIGVudHJhbmNlVmlldzogY2MuTm9kZSA9IG51bGw7XHJcbiAgICAvKipcclxuICAgICAqIOW8gOWni+a4uOaIj+WJjeeahOWIneWni+WMluaTjeS9nOOAglxyXG4gICAgICog5Li76KaB6LSf6LSj5qOA5p+l5bm25aSE55CG5ri45oiP5YWl5Y+j5oyJ6ZKu55qE5r+A5rS754q25oCB77yM5Lul5Y+K5Zyo54m55a6a546v5aKD5LiL6K6+572u5L6n6L655qCP55qE55uR5ZCs5Zmo44CCXHJcbiAgICAgKiBcclxuICAgICAqIEByZW1hcmtzXHJcbiAgICAgKiDmraTmlrnms5XpppblhYjlsIbmuLjmiI/lhaXlj6Pop4blm77orr7kuLrpnZ7mv4DmtLvnirbmgIHvvIzku6Xlh4blpIfov5vooYzlkI7nu63nmoTmo4Dmn6Xlkozorr7nva7jgIJcclxuICAgICAqIOWmguaenOW9k+WJjeeOr+Wig+aYr+aKlumfs+Wwj+a4uOaIj++8jOS8muajgOafpeaYr+WQpuWtmOWcqOS+p+i+ueagj++8jOW5tuagueaNruajgOafpee7k+aenOa/gOa0u+aIluemgeeUqOa4uOaIj+WFpeWPo+aMiemSruOAglxyXG4gICAgICog5a+55LqO6Z2e5oqW6Z+z5bCP5ri45oiP546v5aKD77yM55u05o6l5r+A5rS75ri45oiP5YWl5Y+j5oyJ6ZKu44CCXHJcbiAgICAgKiDmraTlpJbvvIzml6Dorrrnjq/looPlpoLkvZXvvIzpg73kvJrorr7nva7kuIDkuKrnm5HlkKzlmajvvIzku6XlpITnkIbmnaXoh6rkvqfovrnmoI/nmoTkuovku7bvvIzlpoLmiJDlip/op6blj5Hml7bmmL7npLrlpZblirHmj5DnpLrjgIJcclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSBfaWQ6YW55O1xyXG4gICAgcHJpdmF0ZSBfdXNlckRhdGE6YW55O1xyXG5cclxuICAgIHByaXZhdGUgc3RhdGljIF9pbnN0YW5jZTogTWluaUdhbWVNYW5hZ2VyO1xyXG4gICAgc3RhdGljIGdldCBpbnN0YW5jZSgpOiBNaW5pR2FtZU1hbmFnZXIge1xyXG4gICAgICAgIGlmICghTWluaUdhbWVNYW5hZ2VyLl9pbnN0YW5jZSkge1xyXG4gICAgICAgICAgICBNaW5pR2FtZU1hbmFnZXIuX2luc3RhbmNlID0gbmV3IE1pbmlHYW1lTWFuYWdlcigpO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gTWluaUdhbWVNYW5hZ2VyLl9pbnN0YW5jZTtcclxuICAgIH1cclxuXHJcbiAgICBzdGFydCgpIHtcclxuICAgICAgICAvLyDnpoHnlKjmuLjmiI/lhaXlj6Pop4blm75cclxuICAgICAgICAvLyB0aGlzLmVudHJhbmNlVmlldy5hY3RpdmUgPSBmYWxzZTtcclxuICAgICAgICAvLyBNaW5pR2FtZVNkay5BUEkuZ2V0VXNlclByb2ZpbGUodGhpcy5zZXRVc2VySWQpO1xyXG4gICAgICAgIC8vIGNjLmZ4LkdhbWVUb29sLnNldFVzZXJJbmZvKFwiXCIpO1xyXG4gICAgICAgIHRoaXMub25HZXRMb2dpbkNvZGUoKTtcclxuICAgICAgICAvLyDlsJ3or5Xojrflj5bmuLjmiI/lhaXlj6PmjInpkq7vvIzlpoLmnpzlrZjlnKjliJnnm7TmjqXov5Tlm57vvIzkuI3ov5vooYzlkI7nu63mk43kvZxcclxuICAgICAgICAvLyBsZXQgYnV0dG9uRW50cmFuY2UgPSB0aGlzLm5vZGUuZ2V0Q2hpbGRCeU5hbWUoJ0J0bnMnKT8uZ2V0Q2hpbGRCeU5hbWUoJ0J1dHRvbl9FbnRyYW5jZVZpZXcnKTtcclxuICAgICAgICAvLyBpZiAoYnV0dG9uRW50cmFuY2UpIHtcclxuICAgICAgICAvLyAgICAgcmV0dXJuO1xyXG4gICAgICAgIC8vIH1cclxuXHJcbiAgICAgICAgLy8g5aaC5p6c5piv5a2X6IqC6Lez5Yqo5bCP5ri45oiP546v5aKD77yM5qOA5p+l5L6n6L655qCP5piv5ZCm5a2Y5ZyoXHJcblxyXG4gICAgICAgIGlmIChNaW5pR2FtZVNkay5pc0J5dGVkYW5jZSgpKSB7XHJcbiAgICAgICAgICAgIC8v5oqW6Z+z546v5aKD77yM5qOA5rWL5L6n6L655qCP5a2Y5ZyoXHJcbiAgICAgICAgICAgIE1pbmlHYW1lU2RrLkJ5dGVkYW5jZVNpZGViYXIuY2hlY2tTaWRlQmFyKChzdWNjZXNzOiBib29sZWFuKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAvLyDmoLnmja7kvqfovrnmoI/lrZjlnKjmgKfmv4DmtLvmiJbnpoHnlKjmuLjmiI/lhaXlj6PmjInpkq5cclxuICAgICAgICAgICAgICAgIC8vIGJ1dHRvbkVudHJhbmNlLmFjdGl2ZSA9IHN1Y2Nlc3M7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIC8vIOmdnuaKlumfs+Wwj+a4uOaIj+eOr+Wig++8jOebtOaOpea/gOa0u+a4uOaIj+WFpeWPo+aMiemSrlxyXG4gICAgICAgICAgICAvLyDpnZ7mipbpn7Pnjq/looPvvIzmraPluLjmmL7npLrmjInpkq5cclxuICAgICAgICAgICAgLy8gYnV0dG9uRW50cmFuY2UuYWN0aXZlID0gdHJ1ZTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vIOiuvue9ruebkeWQrOWZqO+8jOS7peWkhOeQhuadpeiHquS+p+i+ueagj+eahOS6pOS6kuS6i+S7tlxyXG4gICAgICAgIE1pbmlHYW1lU2RrLkJ5dGVkYW5jZVNpZGViYXIubGlzdGVuRnJvbVNpZGViYXIoKHN1Y2Nlc3M6IGJvb2xlYW4pID0+IHtcclxuICAgICAgICAgICAgLy8g5aaC5p6c5Lqk5LqS5oiQ5Yqf77yM5pi+56S65aWW5Yqx5o+Q56S6XHJcbiAgICAgICAgICAgIGlmIChzdWNjZXNzKSB7XHJcbiAgICAgICAgICAgICAgICBNaW5pR2FtZVNkay5BUEkuc2hvd1RvYXN0KCfkvqfovrnmoI/lpZblirEnLCA1KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIHVwZGF0ZShkZWx0YVRpbWU6IG51bWJlcikge1xyXG5cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIOW8ueWHuuW5v+WRiuaoquW5heOAglxyXG4gICAgICog5q2k5pa55rOV55So5LqO5Yqg6L295bm25pi+56S65bm/5ZGK5qiq5bmF44CC5a6D6aaW5YWI5Yqg6L295oyH5a6a5bm/5ZGK5L2N55qE5qiq5bmF5bm/5ZGK77yM54S25ZCO5pi+56S65bm/5ZGK44CCXHJcbiAgICAgKiDliqDovb3lub/lkYrlkozmmL7npLrlub/lkYrmmK/pgJrov4dNaW5pR2FtZVNkay5BZHZlcnRNYW5hZ2Vy55qE5a6e5L6L5pa55rOV5p2l5a6e546w55qE44CCXHJcbiAgICAgKiBcclxuICAgICAqIEByZW1hcmtzXHJcbiAgICAgKiDmraTmlrnms5Xmj5DkvpvkuobkuKTnp43mmL7npLrmqKrluYXlub/lkYrnmoTmlrnlvI/vvJpcclxuICAgICAqIDEuIOm7mOiupOaWueW8j++8muiwg+eUqHNob3dCYW5uZXLmlrnms5XmmL7npLrlub/lkYrvvIzns7vnu5/kvJroh6rliqjpgInmi6nmmL7npLrkvY3nva7jgIJcclxuICAgICAqIDIuIOaMh+WumuS9jee9ruaWueW8j++8muWPr+S7pemAmui/h+S8oOWFpemineWklueahOWPguaVsOadpeaMh+WumuW5v+WRiuaYvuekuuWcqOWxj+W5leeahOmhtumDqOaIluW6lemDqO+8jOaIluiAhemAmui/h+WdkOagh+aMh+WumuaYvuekuuS9jee9ruOAglxyXG4gICAgICogXHJcbiAgICAgKiDnpLrkvovku6PnoIHkuK3ms6jph4rmjonkuobkuKTnp43mmL7npLrlub/lkYrnmoTlhbfkvZPmlrnms5XvvIzlj6/ku6XmoLnmja7lrp7pmYXpnIDmsYLpgInmi6nkvb/nlKjjgIJcclxuICAgICAqL1xyXG4gICAgb25TaG93QmFubmVyKCkge1xyXG4gICAgICAgIC8vIOWKoOi9veaMh+WumuW5v+WRiuS9jeeahOaoquW5heW5v+WRiuOAglxyXG4gICAgICAgIE1pbmlHYW1lU2RrLkFkdmVydE1hbmFnZXIuaW5zdGFuY2UubG9hZEJhbm5lcignYWR1bml0LTRlN2VmNDY3ZTNlYWFiNTEnKTtcclxuXHJcbiAgICAgICAgLy8g6buY6K6k5pa55byP5pi+56S65qiq5bmF5bm/5ZGK44CCXHJcbiAgICAgICAgLy8g5pa55rOVMe+8mum7mOiupOiwg+eUqFxyXG4gICAgICAgIE1pbmlHYW1lU2RrLkFkdmVydE1hbmFnZXIuaW5zdGFuY2Uuc2hvd0Jhbm5lcigpO1xyXG5cclxuICAgICAgICAvLyDnpLrkvovvvJrmjIflrprlsY/luZXlupXpg6jmraPkuK3mmL7npLrmqKrluYXlub/lkYrjgIJcclxuICAgICAgICAvLyDmlrnms5Uy77ya5oyH5a6a5bGP5bmV6aG26YOo5oiW5bqV6YOo5q2j5LitXHJcbiAgICAgICAgLy8gTWluaUdhbWVTZGsuQWR2ZXJ0TWFuYWdlci5pbnN0YW5jZS5zaG93QmFubmVyKCdhZHVuaXQtNGU3ZWY0NjdlM2VhYWI1MScsIE1pbmlHYW1lU2RrLkVBZEJhbm5lckxvY2F0aW9uLkJPVFRPTSk7IFxyXG5cclxuICAgICAgICAvLyDnpLrkvovvvJrpgJrov4flnZDmoIfmjIflrprkvY3nva7mmL7npLrmqKrluYXlub/lkYrjgIJcclxuICAgICAgICAvLyDmlrnms5Uy77ya5oyH5a6a5Z2Q5qCHXHJcbiAgICAgICAgLy8gTWluaUdhbWVTZGsuQWR2ZXJ0TWFuYWdlci5pbnN0YW5jZS5zaG93QmFubmVyKCdhZHVuaXQtNGU3ZWY0NjdlM2VhYWI1MScsIHsgdG9wOiAxMCwgbGVmdDogMTAgfSk7IFxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICog6ZqQ6JeP5bm/5ZGK5qiq5bmF55qE5Ye95pWw44CCXHJcbiAgICAgKiBcclxuICAgICAqIOivpeWHveaVsOiwg+eUqE1pbmlHYW1lU2RrLkFkdmVydE1hbmFnZXLlrp7kvovnmoTmlrnms5XvvIznlKjkuo7pmpDol4/lub/lkYrmqKrluYXjgIJcclxuICAgICAqIOW9k+mcgOimgeaaguaXtuWBnOatouWxleekuuW5v+WRiuaIlueUqOaIt+S4u+WKqOivt+axgumakOiXj+W5v+WRiuaXtu+8jOWPr+S7peiwg+eUqOatpOWHveaVsOOAglxyXG4gICAgICogXHJcbiAgICAgKiBAcmVtYXJrc1xyXG4gICAgICog5q2k5Ye95pWw5LiN5o6l5Y+X5Lu75L2V5Y+C5pWw77yM5Lmf5LiN6L+U5Zue5Lu75L2V5YC844CCXHJcbiAgICAgKiDlroPljZXnuq/lnLDop6blj5Hlub/lkYrmqKrluYXnmoTpmpDol4/mk43kvZzvvIzlhbfkvZPlrp7njrDkvp3otZbkuo5BZHZlcnRNYW5hZ2Vy55qE5a6e546w44CCXHJcbiAgICAgKi9cclxuICAgIG9uSGlkZUJhbm5lcigpIHtcclxuICAgICAgICBNaW5pR2FtZVNkay5BZHZlcnRNYW5hZ2VyLmluc3RhbmNlLmhpZGVCYW5uZXIoKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIOaYvuekuuaPkuWxj+W5v+WRiueahOWHveaVsOOAglxyXG4gICAgICogXHJcbiAgICAgKiDmraTlh73mlbDosIPnlKhNaW5pR2FtZVNkay5BZHZlcnRNYW5hZ2Vy5a6e5L6L55qE5pa55rOV77yM5Lul5pi+56S65LiA5Liq5oyH5a6a55qE5o+S5bGP5bm/5ZGK44CCXHJcbiAgICAgKiDlroPkvb/nlKjkuobnoaznvJbnoIHnmoTlub/lkYrljZXlhYPmoIfor4bnrKbvvIzov5nmhI/lkbPnnYDlroPkuJPkuLrnibnlrprnmoTlub/lkYrkvY3orr7orqHjgIJcclxuICAgICAqIOWcqOWunumZheW6lOeUqOS4re+8jOWPr+iDvemcgOimgeagueaNruW6lOeUqOeahOmFjee9ruaIlueUqOaIt+eahOeJueWumuadoeS7tuadpeWKqOaAgemAieaLqeW5v+WRiuWNleWFg+agh+ivhuespuOAglxyXG4gICAgICovXHJcbiAgICBvblNob3dJbnRlcnN0aXRpYWwoKSB7XHJcbiAgICAgICAgTWluaUdhbWVTZGsuQWR2ZXJ0TWFuYWdlci5pbnN0YW5jZS5zaG93SW50ZXJzdGl0aWFsKCdhZHVuaXQtZWFkZDY3ODUxZDMwNTBhZCcpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICog6LCD55So5bm/5ZGK566h55CG5Zmo5Yqg6L295bm25bGV56S66Ieq5a6a5LmJ5bm/5ZGK44CCXHJcbiAgICAgKiDmraTmlrnms5XpppblhYjpgJrov4flub/lkYrnrqHnkIblmajnmoTlrp7kvovliqDovb3mjIflrprnmoToh6rlrprkuYnlub/lkYrljZXlhYPvvIznhLblkI7lsZXnpLrov5nkuKroh6rlrprkuYnlub/lkYrjgIJcclxuICAgICAqIOWKoOi9veWSjOWxleekuuW5v+WRiuaYr+W5v+WRiueuoeeQhuezu+e7n+S4reeahOW4uOingeaTjeS9nO+8jOi/memHjOmAmui/h+S4pOatpeWIhuWIq+WujOaIkOWKoOi9veWSjOWxleekuueahOi/h+eoi++8jFxyXG4gICAgICog5Lul56Gu5L+d5bm/5ZGK5Zyo5bGV56S65YmN5q2j56Gu5LiU5YWF5YiG5Zyw6KKr5Yqg6L2944CCXHJcbiAgICAgKi9cclxuICAgIG9uU2hvd0N1c3RvbSgpIHtcclxuICAgICAgICAvLyDliqDovb3mjIflrprnmoToh6rlrprkuYnlub/lkYrljZXlhYPjgIJcclxuICAgICAgICBNaW5pR2FtZVNkay5BZHZlcnRNYW5hZ2VyLmluc3RhbmNlLmxvYWRDdXN0b20oRVdlY2hhdEFELkNVTVNUT01fMDEpO1xyXG4gICAgICAgIC8vIOWxleekuuW3suWKoOi9veeahOiHquWumuS5ieW5v+WRiuOAglxyXG4gICAgICAgIE1pbmlHYW1lU2RrLkFkdmVydE1hbmFnZXIuaW5zdGFuY2Uuc2hvd0N1c3RvbShFV2VjaGF0QUQuQ1VNU1RPTV8wMSk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiDpmpDol4/oh6rlrprkuYnlub/lkYrjgIJcclxuICAgICAqIFxyXG4gICAgICog5pys5Ye95pWw6LCD55SoTWluaUdhbWVTZGsuQWR2ZXJ0TWFuYWdlci5pbnN0YW5jZS5oaWRlQ3VzdG9tKCnmnaXpmpDol4/oh6rlrprkuYnlub/lkYrjgIJcclxuICAgICAqIOi/meaYr+WvueaOpeW5v+WRiueuoeeQhuezu+e7n+eahOS4gOmDqOWIhu+8jOeUqOS6juaOp+WItuW5v+WRiueahOaYvuekuuS4jumakOiXj+OAglxyXG4gICAgICog5Zyo6ZyA6KaB6ZqQ6JeP6Ieq5a6a5LmJ5bm/5ZGK55qE5Zy65pmv5LiL77yM6LCD55So5q2k5Ye95pWw5Y2z5Y+v5a6e546w55u45bqU5Yqf6IO944CCXHJcbiAgICAgKi9cclxuICAgIG9uSGlkZUN1c3RvbSgpIHtcclxuICAgICAgICBNaW5pR2FtZVNkay5BZHZlcnRNYW5hZ2VyLmluc3RhbmNlLmhpZGVDdXN0b20oRVdlY2hhdEFELkNVTVNUT01fMDEpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICog6Kem5Y+R5pi+56S66KeG6aKR5bm/5ZGK55qE5Ye95pWw44CCXHJcbiAgICAgKiDpgJrov4fosIPnlKhNaW5pR2FtZVNkay5BZHZlcnRNYW5hZ2VyLmluc3RhbmNlLnNob3dWaWRlb+aWueazle+8jOaYvuekuuS4gOS4quinhumikeW5v+WRiu+8jOW5tuagueaNrueUqOaIt+ingueci+W5v+WRiueahOaDheWGteaJp+ihjOebuOW6lOeahOmAu+i+keOAglxyXG4gICAgICogXHJcbiAgICAgKiBAcmVtYXJrc1xyXG4gICAgICog5q2k5Ye95pWw6aaW5YWI5Lyg5YWl5LiA5Liq5bm/5ZGK5Y2V5YWDSUTvvIznlKjkuo7moIfor4bopoHmmL7npLrnmoTop4bpopHlub/lkYrjgILnhLblkI7kvKDlhaXkuIDkuKrlm57osIPlh73mlbDvvIzor6Xlm57osIPlh73mlbDlnKjnlKjmiLfop4LnnIvlub/lkYrlkI7ooqvosIPnlKjvvIzml6DorrrnlKjmiLfmmK/lrozmiJDkuobop4LnnIvjgIHmi5Lnu53kuobop4LnnIvov5jmmK/op4LnnIvov4fnqIvkuK3lj5HnlJ/kuobplJnor6/jgIJcclxuICAgICAqIOWbnuiwg+WHveaVsOaOpeaUtuS4pOS4quWPguaVsO+8muS4gOS4quaYr+eUqOaIt+ingueci+W5v+WRiueahOe7k+aenO+8jOWPpuS4gOS4quaYr+eUqOaIt+ingueci+eahOW5v+WRiuaVsOmHj+OAguagueaNruingueci+e7k+aenOeahOS4jeWQjO+8jOaYvuekuuS4jeWQjOeahOaPkOekuuS/oeaBr+OAglxyXG4gICAgICovXHJcbiAgICBvblNob3dWaWRlbygpIHtcclxuICAgICAgICAvLyDlub/lkYrljZXlhYNJRO+8jOeUqOS6juagh+ivhuimgeaYvuekuueahOinhumikeW5v+WRilxyXG4gICAgICAgIC8vIOW5v+WRiuWNleWFg0lE55qE5qC35L6LXHJcbiAgICAgICAgLy/mipbpn7PlvaLlpoI6IDFyZTNuZnFrbXk4MW00bThnZVxyXG4gICAgICAgIC8v5b6u5L+h5b2i5aaCOiBhZHVuaXQtYTc3MThmNmUxOTVlNDJmZVxyXG4gICAgICAgIE1pbmlHYW1lU2RrLkFkdmVydE1hbmFnZXIuaW5zdGFuY2Uuc2hvd1ZpZGVvKCcxcmUzbmZxa215ODFtNG04Z2UnLCAocmVzOiBNaW5pR2FtZVNkay5FQWRWaWRlb1Jlc3VsdCwgY291bnQ6IG51bWJlcikgPT4ge1xyXG4gICAgICAgICAgICAvLyDovpPlh7rnlKjmiLfop4LnnIvnmoTlub/lkYrmlbDph49cclxuICAgICAgICAgICAgY29uc29sZS5sb2coJ+eUqOaIt+eci+eahOinhumikeW5v+WRiuS4quaVsOaYrzonLCBjb3VudCk7XHJcblxyXG4gICAgICAgICAgICAvLyDmoLnmja7nlKjmiLfop4LnnIvlub/lkYrnmoTnu5PmnpzvvIzmiafooYzkuI3lkIznmoTpgLvovpFcclxuICAgICAgICAgICAgc3dpdGNoIChyZXMpIHtcclxuICAgICAgICAgICAgICAgIGNhc2UgTWluaUdhbWVTZGsuRUFkVmlkZW9SZXN1bHQuQUNDRVBUOlxyXG4gICAgICAgICAgICAgICAgICAgIC8vIOeUqOaIt+WujOaIkOS6huW5v+WRiuingueci++8jOaYvuekuuWlluWKseaPkOekulxyXG4gICAgICAgICAgICAgICAgICAgIE1pbmlHYW1lU2RrLkFQSS5zaG93VG9hc3QoJ+eUqOaIt+eci+WujOW5v+WRiu+8jOWPr+S7peWlluWKsScpO1xyXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgY2FzZSBNaW5pR2FtZVNkay5FQWRWaWRlb1Jlc3VsdC5SRUpFQ1Q6XHJcbiAgICAgICAgICAgICAgICAgICAgLy8g55So5oi35ouS57ud5LqG5bm/5ZGK6KeC55yL77yM5pi+56S65LiN5aWW5Yqx5o+Q56S6XHJcbiAgICAgICAgICAgICAgICAgICAgTWluaUdhbWVTZGsuQVBJLnNob3dUb2FzdCgn55So5oi35ouS57ud5o6J5bm/5ZGK77yM5LiN5aWW5YqxJyk7XHJcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICBjYXNlIE1pbmlHYW1lU2RrLkVBZFZpZGVvUmVzdWx0LkVSUk9SOlxyXG4gICAgICAgICAgICAgICAgICAgIC8vIOW5v+WRiuaSreaUvuWPkeeUn+mUmeivr++8jOaYvuekuumUmeivr+aPkOekulxyXG4gICAgICAgICAgICAgICAgICAgIE1pbmlHYW1lU2RrLkFQSS5zaG93VG9hc3QoJ+aSreaUvuW5v+WRiuWPkeeUn+mUmeivr++8jOS4jeWlluWKsScpO1xyXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgZGVmYXVsdDpcclxuICAgICAgICAgICAgICAgICAgICAvLyDlhbbku5bmg4XlhrXvvIzkuI3kvZzlpITnkIZcclxuICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICog5byV5a+855So5oi35YiG5Lqr5bqU55So57uZ5pyL5Y+L44CCXHJcbiAgICAgKiBcclxuICAgICAqIOmAmui/h+iwg+eUqE1pbmlHYW1lU2Rr55qEQVBJ5YiG5Lqr5Yqf6IO977yM5ZCR55So5oi355qE5pyL5Y+L5ZyI5Y+R6YCB6YKA6K+377yM6YKA6K+35LuW5Lus5LiA6LW3546p5ri45oiP44CCXHJcbiAgICAgKiDov5nmmK/kuIDkuKrph43opoHnmoTmjqjlub/miYvmrrXvvIzlj6/ku6Xlop7liqDlupTnlKjnmoTmm53lhYnluqblkoznlKjmiLfph4/jgIJcclxuICAgICAqIFxyXG4gICAgICogQHJlbWFya3NcclxuICAgICAqIOatpOaWueazleS4reiwg+eUqOeahEFQSeS+nei1luS6jueJueWumueahOWwj+a4uOaIj+W5s+WPsO+8jOWboOatpOWcqOS4jeWQjOeahOW5s+WPsOS4iuWPr+iDvemcgOimgeS4jeWQjOeahOWunueOsOOAglxyXG4gICAgICovXHJcbiAgICBvblNoYXJlKCkge1xyXG4gICAgICAgIE1pbmlHYW1lU2RrLkFQSS5zaGFyZUFwcFRvRnJpZW5kcygn5p2l546p5ri45oiP5ZCnJyk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiDmmL7npLrkuIDkuKp0b2FzdOaPkOekuuOAglxyXG4gICAgICogXHJcbiAgICAgKiDpgJrov4fosIPnlKhNaW5pR2FtZVNka+eahEFQSeaWueazleadpeaYvuekuuS4gOS4queugOefreeahOaPkOekuuS/oeaBr+OAgnRvYXN05piv5LiA56eN6L276YeP57qn55qE5o+Q56S65pa55byP77yM55So5LqO5Zyo55WM6Z2i5LiK55+t5pqC5Zyw5bGV56S65LiA5Lqb5L+h5oGv77yM5LiN5b2x5ZON55So5oi35pON5L2c44CCXHJcbiAgICAgKiDov5nph4zkvb/nlKjkuoblm7rlrprnmoTmj5DnpLrmlofmnKwgJ+i/meaYr+S4gOS4qnRvYXN0J++8jOWcqOWunumZheW6lOeUqOS4re+8jOWPr+S7peagueaNrumcgOimgeWKqOaAgeiuvue9ruaPkOekuuaWh+acrOOAglxyXG4gICAgICovXHJcbiAgICBvblNob3dUb2FzdCgpIHtcclxuICAgICAgICBNaW5pR2FtZVNkay5BUEkuc2hvd1RvYXN0KCfov5nmmK/kuIDkuKp0b2FzdCcpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICog6Kem5Y+R6K6+5aSH5oyv5Yqo5Yqf6IO944CCXHJcbiAgICAgKiBcclxuICAgICAqIOivpeaWueazleeUqOS6juiwg+eUqE1pbmlHYW1lU2Rr5o+Q5L6b55qEQVBJ77yM5Lul5a6e546w6K6+5aSH55qE5oyv5Yqo5Yqf6IO944CC5b2T6ZyA6KaB5o+Q6YaS55So5oi35oiW5o+Q5L6b6Kem6KeJ5Y+N6aaI5pe277yM5Y+v5Lul6LCD55So5q2k5pa55rOV44CCXHJcbiAgICAgKiDkvovlpoLvvIzlnKjmuLjmiI/miJblupTnlKjkuK3vvIzlvZPnlKjmiLflrozmiJDnibnlrprmk43kvZzmiJblj5HnlJ/nibnlrprkuovku7bml7bvvIzlj6/ku6XpgJrov4fmjK/liqjnu5nkuojnlKjmiLflj43ppojjgIJcclxuICAgICAqIFxyXG4gICAgICogQHJlbWFya3NcclxuICAgICAqIOatpOaWueazleaXoOWPguaVsO+8jOS5n+S4jei/lOWbnuS7u+S9leWAvOOAglxyXG4gICAgICovXHJcbiAgICBvblZpcmJyYXRlKCkge1xyXG4gICAgICAgIE1pbmlHYW1lU2RrLkFQSS52aWJyYXRlKCk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiDph43mlrDlkK/liqjmuLjmiI/lrp7kvovjgIJcclxuICAgICAqIFxyXG4gICAgICog5q2k5Ye95pWw6LCD55SoTWluaUdhbWVTZGvkuK3nmoRBUEnph43mlrDlkK/liqjmuLjmiI/jgILph43mlrDlkK/liqjmk43kvZzlj6/og73mmK/kuLrkuobliJ3lp4vljJbmuLjmiI/njq/looPjgIHph43nva7muLjmiI/nirbmgIHmiJblpITnkIblhbbku5bpnIDopoHph43lkK/nmoTlnLrmma/jgIJcclxuICAgICAqIOiwg+eUqOatpOWHveaVsOWQju+8jOa4uOaIj+WwhuS8mumHjeaWsOW8gOWni++8jOW9k+WJjeeahOa4uOaIj+eKtuaAgeWwhuS8muiiq+a4hemZpOOAglxyXG4gICAgICogXHJcbiAgICAgKiBAcmVtYXJrc1xyXG4gICAgICog5q2k5Ye95pWw5LiN5o6l5Y+X5Lu75L2V5Y+C5pWw44CCXHJcbiAgICAgKiBcclxuICAgICAqIEByZXR1cm5zIOaXoOi/lOWbnuWAvOOAglxyXG4gICAgICovXHJcbiAgICBvblJlYm9vdCgpIHtcclxuICAgICAgICBNaW5pR2FtZVNkay5BUEkucmVib290KCk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiDlvZPliY3lh73mlbDnlKjkuo7lnKjov7fkvaDmuLjmiI/kuK3lrp7njrDpgIDlh7rlip/og73jgIJcclxuICAgICAqIOWug+iwg+eUqOS6hk1pbmlHYW1lU2Rr5o+Q5L6b55qEQVBJ5pa55rOV5p2l6Kem5Y+R6YCA5Ye65pON5L2c44CCXHJcbiAgICAgKiDor6Xmlrnms5XpgJrluLjlnKjpnIDopoHnu5PmnZ/lvZPliY3ov7fkvaDmuLjmiI/miJbov5Tlm57liLDkuIrkuIDnuqfoj5zljZXml7booqvosIPnlKjjgIJcclxuICAgICAqL1xyXG4gICAgb25FeGl0KCkge1xyXG4gICAgICAgIE1pbmlHYW1lU2RrLkFQSS5leGl0KCk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiDmmL7npLrliIbkuqvoj5zljZXjgIJcclxuICAgICAqIFxyXG4gICAgICog6YCa6L+H6LCD55SoTWluaUdhbWVTZGvnmoRBUEnmlrnms5XvvIzop6blj5HmmL7npLrliIbkuqvoj5zljZXnmoTmk43kvZzjgILmraTlh73mlbDml6jlnKjmj5DkvpvkuIDkuKrnu5/kuIDnmoTlhaXlj6PvvIxcclxuICAgICAqIOS7peS+v+WcqOmcgOimgeaXtui9u+advuiwg+eUqOWIhuS6q+WKn+iDve+8jOiAjOaXoOmcgOebtOaOpeS4juWFt+S9k+eahFNES+aOpeWPo+S6pOS6kuOAglxyXG4gICAgICogXHJcbiAgICAgKiBAcmVtYXJrc1xyXG4gICAgICog5q2k5pa55rOV5LiN5o6l5Y+X5Lu75L2V5Y+C5pWw77yM5Lmf5LiN6L+U5Zue5Lu75L2V5YC844CCXHJcbiAgICAgKi9cclxuICAgIG9uU2hvd1NoYXJlTWVudSgpIHtcclxuICAgICAgICBNaW5pR2FtZVNkay5BUEkuc2hvd1NoYXJlTWVudSgpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICog5a+86Iiq5Yiw5oyH5a6a55qE5bCP5ri45oiP44CCXHJcbiAgICAgKiBcclxuICAgICAqIOacrOWHveaVsOeUqOS6juinpuWPkeWvvOiIquWIsOS4gOS4queJueWumueahOWwj+a4uOaIj+OAgui/memcgOimgeaPkOS+m+ebruagh+Wwj+a4uOaIj+eahElE77yMXHJcbiAgICAgKiDku6Xkvr/ns7vnu5/og73lpJ/mraPnoa7lnLDlsIbnlKjmiLfph43lrprlkJHliLDnm67moIflsI/muLjmiI/jgIJcclxuICAgICAqIFxyXG4gICAgICog5rOo5oSP77ya6L+Z6YeM55qEJ3h4eCfmmK/ljaDkvY3nrKbvvIzlrp7pmYXkvb/nlKjml7bpnIDopoHmm7/mjaLkuLrlhbfkvZPnmoTlsI/muLjmiI9JROOAglxyXG4gICAgICovXHJcbiAgICBvbk5hdmlnYXRlKCkge1xyXG4gICAgICAgIE1pbmlHYW1lU2RrLkFQSS5uYXZpZ2F0ZVRvKCd4eHgnKTsgLy8geHh45pu/5o2i5Li65L2g55qE5bCP5ri45oiPaWRcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIOa/gOa0u+Wtl+iKgui3s+WKqOWFpeWPo+inhuWbvuOAglxyXG4gICAgICogXHJcbiAgICAgKiDmraTmlrnms5XnlKjkuo7lsIblrZfoioLot7PliqjlhaXlj6Pop4blm77orr7nva7kuLrmtLvot4PnirbmgIHjgILlvZPpnIDopoHlnKjnlKjmiLfnlYzpnaLkuK3mmL7npLrlrZfoioLot7PliqjnmoTlhaXlj6Pml7bvvIxcclxuICAgICAqIOWPr+S7peiwg+eUqOatpOaWueazleadpea/gOa0u+ebuOW6lOeahOinhuWbvuWFg+e0oO+8jOS9v+WFtuWvueeUqOaIt+WPr+ingeOAglxyXG4gICAgICovXHJcbiAgICBvbkJ5dGVkYW5jZUVudHJhbmNlVmlldygpIHtcclxuICAgICAgICAvLyB0aGlzLmVudHJhbmNlVmlldy5hY3RpdmUgPSB0cnVlO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICog6K+35rGC55m75b2V5Luj56CBXHJcbiAgICAgKiBcclxuICAgICAqIOacrOWHveaVsOeUqOS6juinpuWPkeWwj+eoi+W6j+eahOeZu+W9lea1geeoi++8jOiOt+WPluW+ruS/oeaIluWktOadoeetieesrOS4ieaWueW5s+WPsOeahOeZu+W9leS7o+eggeOAglxyXG4gICAgICog6L+Z5Lqb5Luj56CB5Y+v5Lul55So5LqO5ZCO57ut55qE55So5oi36Lqr5Lu96aqM6K+B5ZKM5pWw5o2u5ZCM5q2l5rWB56iL44CCXHJcbiAgICAgKi9cclxuICAgIG9uR2V0TG9naW5Db2RlKCkge1xyXG4gICAgICAgIC8vIOiwg+eUqE1pbmlHYW1lU2Rr55qEQVBJ55m75b2V5pa55rOV77yM5Lyg5YWl5LiA5Liq5Zue6LCD5Ye95pWw5aSE55CG55m75b2V57uT5p6cXHJcbiAgICAgICAgTWluaUdhbWVTZGsuQVBJLmxvZ2luKChjb2RlOiBzdHJpbmcsIGFub255bW91c0NvZGU6IHN0cmluZykgPT4ge1xyXG4gICAgICAgICAgICAvLyDmiZPljbDlvq7kv6HmiJblpLTmnaHnmoTnmbvlvZXku6PnoIFcclxuICAgICAgICAgICAgY29uc29sZS5sb2coJ1dlY2hhdCBPciBCeXRlZGFuY2UgQ29kZTonLCBjb2RlKTtcclxuICAgICAgICAgICAgLy8g5omT5Y2w5aS05p2h55qE5Yy/5ZCN55m75b2V5Luj56CBXHJcbiAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKCdCeXRlZGFuY2UgQW5vbnltb3VzIENvZGU6JywgYW5vbnltb3VzQ29kZSk7XHJcbiAgICAgICAgICAgIGlmKGNvZGUpe1xyXG4gICAgICAgICAgICAgICAgY2MuZnguR2FtZVRvb2wuZ2V0VXNlcklkKGNvZGUsIGRhdGEgPT4gdGhpcy5zZXRVc2VySWQoZGF0YSkpOyBcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIHNldFVzZXJJZChkYXRhKXtcclxuICAgICAgICBjYy5meC5HYW1lQ29uZmlnLkdNX0lORk8udXNlcklkID0gZGF0YS5kYXRhLnVzZXJJZDtcclxuICAgICAgICBNaW5pR2FtZVNkay5BUEkuZ2V0VXNlckluZm8odGhpcy5zZXRVc2VySW5mbyk7XHJcbiAgICB9XHJcblxyXG4gICAgc2V0VXNlckluZm8oZGF0YSl7XHJcbiAgICAgICAgY29uc29sZS5sb2coXCLojrflj5bliLDnmoTnlKjmiLfkv6Hmga9cIixkYXRhLnVzZXJJbmZvKTtcclxuICAgICAgICB2YXIgdXNlRGF0YSA9IHtcclxuICAgICAgICAgICAgXCJnYW1lSWRcIjogY2MuZnguR2FtZUNvbmZpZy5HTV9JTkZPLmdhbWVJZCxcclxuICAgICAgICAgICAgXCJ1c2VySWRcIjogY2MuZnguR2FtZUNvbmZpZy5HTV9JTkZPLnVzZXJJZCxcclxuICAgICAgICAgICAgXCJuaWNrTmFtZVwiOmRhdGEudXNlckluZm8ubmlja05hbWUsXHJcbiAgICAgICAgICAgIFwicGljXCI6IGRhdGEudXNlckluZm8uYXZhdGFyVXJsXHJcbiAgICAgICAgICAgXHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnNvbGUubG9nKFwi5Y2z5bCG5LiK5Lyg55qE55So5oi35L+h5oGvOlwiLGNjLmZ4LkdhbWVDb25maWcuR01fSU5GTy51c2VySWQsZGF0YS51c2VySW5mby5uaWNrTmFtZSxkYXRhLnVzZXJJbmZvLmF2YXRhclVybCk7XHJcbiAgICAgICAgY29uc29sZS5sb2coXCJQb3N05pWw5o2uOlwiLHVzZURhdGEpO1xyXG4gICAgICAgIGNjLmZ4Lkh0dHBVdGlsLnNldFVzZXJJbmZvKHVzZURhdGEsKHJlcyk9PntcclxuICAgICAgICAgICAgY29uc29sZS5sb2coXCLkuIrkvKDmiJDlip86XCIscmVzKTtcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIOWIm+W7uuW5tuaYvuekuua4uOaIj+WciOaMiemSrlxyXG4gICAgICogXHJcbiAgICAgKiDmnKzlh73mlbDpgJrov4fosIPnlKhNaW5pR2FtZVNka+eahEdhbWVDbHVi5a6e5L6L5pa55rOV77yM5a6e546w5ri45oiP5L+x5LmQ6YOo55qE5Yib5bu65ZKM5pi+56S644CCXHJcbiAgICAgKiDlroPpppblhYjphY3nva7kv7HkuZDpg6jnmoTlm77moIfnsbvlnovlkozkvY3nva7lpKflsI/vvIznhLblkI7liJvlu7rkv7HkuZDpg6jvvIzmnIDlkI7mmL7npLrkv7HkuZDpg6jjgIJcclxuICAgICAqIOi/meagt+WBmuaYr+S4uuS6huWcqOWwj+a4uOaIj+WGheWIm+W7uuW5tuWxleekuuS4gOS4qua4uOaIj+S/seS5kOmDqOeahOWbvuagh++8jOS+m+eOqeWutuWKoOWFpeaIluS6kuWKqOOAglxyXG4gICAgICovXHJcbiAgICBvbkNyZWF0ZUNsdWIoKSB7XHJcbiAgICAgICAgLy8g6YWN572u5L+x5LmQ6YOo5Zu+5qCH5Li657u/6Imy77yM6K6+572u5Zu+5qCH55qE5L2N572u5Li66aG26YOoMjAw5YOP57Sg77yM5bem5L6nMOWDj+e0oFxyXG4gICAgICAgIE1pbmlHYW1lU2RrLkdhbWVDbHViLmluc3RhbmNlLmNyZWF0ZShcclxuICAgICAgICAgICAgTWluaUdhbWVTZGsuRUdhbWVDbHViSWNvbi5HUkVFTixcclxuICAgICAgICAgICAgeyB0b3A6IDIwMCwgbGVmdDogMCB9LFxyXG4gICAgICAgICAgICB7IHdpZHRoOiA1MCwgaGVpZ2h0OiA1MCB9KTtcclxuICAgICAgICAvLyDmmL7npLrmuLjmiI/kv7HkuZDpg6jlm77moIdcclxuICAgICAgICBNaW5pR2FtZVNkay5HYW1lQ2x1Yi5pbnN0YW5jZS5zaG93KCk7XHJcbiAgICB9XHJcbn1cclxuIl19