362 lines
44 KiB
JavaScript
362 lines
44 KiB
JavaScript
|
||
(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 GameAppStart_1 = require("../module/GameStart/GameAppStart");
|
||
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);
|
||
// 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) {
|
||
GameAppStart_1.Fx.GameTool.getUserId(code, function (data) { return _this.setUserId(data); });
|
||
}
|
||
});
|
||
};
|
||
MiniGameManager.prototype.setUserId = function (data) {
|
||
GameAppStart_1.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": GameAppStart_1.Fx.GameConfig.GM_INFO.gameId,
|
||
"userId": GameAppStart_1.Fx.GameConfig.GM_INFO.userId,
|
||
"nickName": data.userInfo.nickName,
|
||
"pic": data.userInfo.avatarUrl
|
||
};
|
||
console.log("即将上传的用户信息:", GameAppStart_1.Fx.GameConfig.GM_INFO.userId, data.userInfo.nickName, data.userInfo.avatarUrl);
|
||
console.log("Post数据:", useData);
|
||
GameAppStart_1.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,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImFzc2V0c1xcU2NyaXB0XFxTZGtcXE1pbmlHYW1lTWFuYWdlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQ0EsaUVBQXNEO0FBQ3RELDZDQUE0QztBQUN0QyxJQUFBLEtBQXdCLEVBQUUsQ0FBQyxVQUFVLEVBQW5DLE9BQU8sYUFBQSxFQUFFLFFBQVEsY0FBa0IsQ0FBQztBQUM1QyxJQUFLLFNBRUo7QUFGRCxXQUFLLFNBQVM7SUFDVixtREFBc0MsQ0FBQTtBQUMxQyxDQUFDLEVBRkksU0FBUyxLQUFULFNBQVMsUUFFYjtBQUdEO0lBQXFDLG1DQUFZO0lBQWpEO1FBQUEscUVBMlVDO1FBeFVHLGtCQUFZLEdBQVksSUFBSSxDQUFDOztJQXdVakMsQ0FBQzt3QkEzVVksZUFBZTtJQWtCeEIsc0JBQVcsMkJBQVE7YUFBbkI7WUFDSSxJQUFJLENBQUMsaUJBQWUsQ0FBQyxTQUFTLEVBQUU7Z0JBQzVCLGlCQUFlLENBQUMsU0FBUyxHQUFHLElBQUksaUJBQWUsRUFBRSxDQUFDO2FBQ3JEO1lBQ0QsT0FBTyxpQkFBZSxDQUFDLFNBQVMsQ0FBQztRQUNyQyxDQUFDOzs7T0FBQTtJQUVELCtCQUFLLEdBQUw7UUFDSSxXQUFXO1FBQ1gsb0NBQW9DO1FBQ3BDLGtEQUFrRDtRQUNsRCwrQkFBK0I7UUFDL0IsSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFDO1FBQ3RCLCtCQUErQjtRQUMvQixnR0FBZ0c7UUFDaEcsd0JBQXdCO1FBQ3hCLGNBQWM7UUFDZCxJQUFJO1FBRUoseUJBQXlCO1FBRXpCLElBQUkseUJBQVcsQ0FBQyxXQUFXLEVBQUUsRUFBRTtZQUMzQixjQUFjO1lBQ2QseUJBQVcsQ0FBQyxnQkFBZ0IsQ0FBQyxZQUFZLENBQUMsVUFBQyxPQUFnQjtnQkFDdkQsc0JBQXNCO2dCQUN0QixtQ0FBbUM7WUFDdkMsQ0FBQyxDQUFDLENBQUM7U0FDTjthQUFNO1lBQ0gsc0JBQXNCO1lBQ3RCLGVB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O0lBQ0gsc0NBQVksR0FBWjtRQUNJLG1DQUFtQztRQUNuQyx5QkFBVyxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUNoQyx5QkFBVyxDQUFDLGFBQWEsQ0FBQyxLQUFLLEVBQy9CLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxJQUFJLEVBQUUsQ0FBQyxFQUFFLEVBQ3JCLEVBQUUsS0FBSyxFQUFFLEVBQUUsRUFBRSxNQUFNLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQztRQUMvQixZQUFZO1FBQ1oseUJBQVcsQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLElBQUksRUFBRSxDQUFDO0lBQ3pDLENBQUM7O0lBdlVEO1FBREMsUUFBUSxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUM7eURBQ1c7SUFIcEIsZUFBZTtRQUQzQixPQUFPO09BQ0ssZUFBZSxDQTJVM0I7SUFBRCxzQkFBQztDQTNVRCxBQTJVQyxDQTNVb0MsRUFBRSxDQUFDLFNBQVMsR0EyVWhEO0FBM1VZLDBDQUFlIiwiZmlsZSI6IiIsInNvdXJjZVJvb3QiOiIvIiwic291cmNlc0NvbnRlbnQiOlsiXHJcbmltcG9ydCB7IEZ4IH0gZnJvbSBcIi4uL21vZHVsZS9HYW1lU3RhcnQvR2FtZUFwcFN0YXJ0XCI7XHJcbmltcG9ydCB7IE1pbmlHYW1lU2RrIH0gZnJvbSBcIi4vTWluaUdhbWVTZGtcIjtcclxuY29uc3QgeyBjY2NsYXNzLCBwcm9wZXJ0eSB9ID0gY2MuX2RlY29yYXRvcjtcclxuZW51bSBFV2VjaGF0QUQge1xyXG4gICAgQ1VNU1RPTV8wMSA9ICdhZHVuaXQtZjdjMjQxN2ViMmMyZTQ3MydcclxufVxyXG5cclxuQGNjY2xhc3NcclxuZXhwb3J0IGNsYXNzIE1pbmlHYW1lTWFuYWdlciBleHRlbmRzIGNjLkNvbXBvbmVudCB7XHJcblxyXG4gICAgQHByb3BlcnR5KGNjLk5vZGUpXHJcbiAgICBlbnRyYW5jZVZpZXc6IGNjLk5vZGUgPSBudWxsO1xyXG4gICAgLyoqXHJcbiAgICAgKiDlvIDlp4vmuLjmiI/liY3nmoTliJ3lp4vljJbmk43kvZzjgIJcclxuICAgICAqIOS4u+imgei0n+i0o+ajgOafpeW5tuWkhOeQhua4uOaIj+WFpeWPo+aMiemSrueahOa/gOa0u+eKtuaAge+8jOS7peWPiuWcqOeJueWumueOr+Wig+S4i+iuvue9ruS+p+i+ueagj+eahOebkeWQrOWZqOOAglxyXG4gICAgICogXHJcbiAgICAgKiBAcmVtYXJrc1xyXG4gICAgICog5q2k5pa55rOV6aaW5YWI5bCG5ri45oiP5YWl5Y+j6KeG5Zu+6K6+5Li66Z2e5r+A5rS754q25oCB77yM5Lul5YeG5aSH6L+b6KGM5ZCO57ut55qE5qOA5p+l5ZKM6K6+572u44CCXHJcbiAgICAgKiDlpoLmnpzlvZPliY3njq/looPmmK/mipbpn7PlsI/muLjmiI/vvIzkvJrmo4Dmn6XmmK/lkKblrZjlnKjkvqfovrnmoI/vvIzlubbmoLnmja7mo4Dmn6Xnu5Pmnpzmv4DmtLvmiJbnpoHnlKjmuLjmiI/lhaXlj6PmjInpkq7jgIJcclxuICAgICAqIOWvueS6jumdnuaKlumfs+Wwj+a4uOaIj+eOr+Wig++8jOebtOaOpea/gOa0u+a4uOaIj+WFpeWPo+aMiemSruOAglxyXG4gICAgICog5q2k5aSW77yM5peg6K66546v5aKD5aaC5L2V77yM6YO95Lya6K6+572u5LiA5Liq55uR5ZCs5Zmo77yM5Lul5aSE55CG5p2l6Ieq5L6n6L655qCP55qE5LqL5Lu277yM5aaC5oiQ5Yqf6Kem5Y+R5pe25pi+56S65aWW5Yqx5o+Q56S644CCXHJcbiAgICAgKi9cclxuICAgIHByaXZhdGUgX2lkOmFueTtcclxuICAgIHByaXZhdGUgX3VzZXJEYXRhOmFueTtcclxuXHJcbiAgICBwcml2YXRlIHN0YXRpYyBfaW5zdGFuY2U6IE1pbmlHYW1lTWFuYWdlcjtcclxuICAgIHN0YXRpYyBnZXQgaW5zdGFuY2UoKTogTWluaUdhbWVNYW5hZ2VyIHtcclxuICAgICAgICBpZiAoIU1pbmlHYW1lTWFuYWdlci5faW5zdGFuY2UpIHtcclxuICAgICAgICAgICAgTWluaUdhbWVNYW5hZ2VyLl9pbnN0YW5jZSA9IG5ldyBNaW5pR2FtZU1hbmFnZXIoKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIE1pbmlHYW1lTWFuYWdlci5faW5zdGFuY2U7XHJcbiAgICB9XHJcblxyXG4gICAgc3RhcnQoKSB7XHJcbiAgICAgICAgLy8g56aB55So5ri45oiP5YWl5Y+j6KeG5Zu+XHJcbiAgICAgICAgLy8gdGhpcy5lbnRyYW5jZVZpZXcuYWN0aXZlID0gZmFsc2U7XHJcbiAgICAgICAgLy8gTWluaUdhbWVTZGsuQVBJLmdldFVzZXJQcm9maWxlKHRoaXMuc2V0VXNlcklkKTtcclxuICAgICAgICAvLyBGeC5HYW1lVG9vbC5zZXRVc2VySW5mbyhcIlwiKTtcclxuICAgICAgICB0aGlzLm9uR2V0TG9naW5Db2RlKCk7XHJcbiAgICAgICAgLy8g5bCd6K+V6I635Y+W5ri45oiP5YWl5Y+j5oyJ6ZKu77yM5aaC5p6c5a2Y5Zyo5YiZ55u05o6l6L+U5Zue77yM5LiN6L+b6KGM5ZCO57ut5pON5L2cXHJcbiAgICAgICAgLy8gbGV0IGJ1dHRvbkVudHJhbmNlID0gdGhpcy5ub2RlLmdldENoaWxkQnlOYW1lKCdCdG5zJyk/LmdldENoaWxkQnlOYW1lKCdCdXR0b25fRW50cmFuY2VWaWV3Jyk7XHJcbiAgICAgICAgLy8gaWYgKGJ1dHRvbkVudHJhbmNlKSB7XHJcbiAgICAgICAgLy8gICAgIHJldHVybjtcclxuICAgICAgICAvLyB9XHJcblxyXG4gICAgICAgIC8vIOWmguaenOaYr+Wtl+iKgui3s+WKqOWwj+a4uOaIj+eOr+Wig++8jOajgOafpeS+p+i+ueagj+aYr+WQpuWtmOWcqFxyXG5cclxuICAgICAgICBpZiAoTWluaUdhbWVTZGsuaXNCeXRlZGFuY2UoKSkge1xyXG4gICAgICAgICAgICAvL+aKlumfs+eOr+Wig++8jOajgOa1i+S+p+i+ueagj+WtmOWcqFxyXG4gICAgICAgICAgICBNaW5pR2FtZVNkay5CeXRlZGFuY2VTaWRlYmFyLmNoZWNrU2lkZUJhcigoc3VjY2VzczogYm9vbGVhbikgPT4ge1xyXG4gICAgICAgICAgICAgICAgLy8g5qC55o2u5L6n6L655qCP5a2Y5Zyo5oCn5r+A5rS75oiW56aB55So5ri45oiP5YWl5Y+j5oyJ6ZKuXHJcbiAgICAgICAgICAgICAgICAvLyBidXR0b25FbnRyYW5jZS5hY3RpdmUgPSBzdWNjZXNzO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAvLyDpnZ7mipbpn7PlsI/muLjmiI/njq/looPvvIznm7TmjqXmv4DmtLvmuLjmiI/lhaXlj6PmjInpkq5cclxuICAgICAgICAgICAgLy8g6Z2e5oqW6Z+z546v5aKD77yM5q2j5bi45pi+56S65oyJ6ZKuXHJcbiAgICAgICAgICAgIC8vIGJ1dHRvbkVudHJhbmNlLmFjdGl2ZSA9IHRydWU7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyDorr7nva7nm5HlkKzlmajvvIzku6XlpITnkIbmnaXoh6rkvqfovrnmoI/nmoTkuqTkupLkuovku7ZcclxuICAgICAgICBNaW5pR2FtZVNkay5CeXRlZGFuY2VTaWRlYmFyLmxpc3RlbkZyb21TaWRlYmFyKChzdWNjZXNzOiBib29sZWFuKSA9PiB7XHJcbiAgICAgICAgICAgIC8vIOWmguaenOS6pOS6kuaIkOWKn++8jOaYvuekuuWlluWKseaPkOekulxyXG4gICAgICAgICAgICBpZiAoc3VjY2Vzcykge1xyXG4gICAgICAgICAgICAgICAgTWluaUdhbWVTZGsuQVBJLnNob3dUb2FzdCgn5L6n6L655qCP5aWW5YqxJywgNSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICB1cGRhdGUoZGVsdGFUaW1lOiBudW1iZXIpIHtcclxuXHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiDlvLnlh7rlub/lkYrmqKrluYXjgIJcclxuICAgICAqIOatpOaWueazleeUqOS6juWKoOi9veW5tuaYvuekuuW5v+WRiuaoquW5heOAguWug+mmluWFiOWKoOi9veaMh+WumuW5v+WRiuS9jeeahOaoquW5heW5v+WRiu+8jOeEtuWQjuaYvuekuuW5v+WRiuOAglxyXG4gICAgICog5Yqg6L295bm/5ZGK5ZKM5pi+56S65bm/5ZGK5piv6YCa6L+HTWluaUdhbWVTZGsuQWR2ZXJ0TWFuYWdlcueahOWunuS+i+aWueazleadpeWunueOsOeahOOAglxyXG4gICAgICogXHJcbiAgICAgKiBAcmVtYXJrc1xyXG4gICAgICog5q2k5pa55rOV5o+Q5L6b5LqG5Lik56eN5pi+56S65qiq5bmF5bm/5ZGK55qE5pa55byP77yaXHJcbiAgICAgKiAxLiDpu5jorqTmlrnlvI/vvJrosIPnlKhzaG93QmFubmVy5pa55rOV5pi+56S65bm/5ZGK77yM57O757uf5Lya6Ieq5Yqo6YCJ5oup5pi+56S65L2N572u44CCXHJcbiAgICAgKiAyLiDmjIflrprkvY3nva7mlrnlvI/vvJrlj6/ku6XpgJrov4fkvKDlhaXpop3lpJbnmoTlj4LmlbDmnaXmjIflrprlub/lkYrmmL7npLrlnKjlsY/luZXnmoTpobbpg6jmiJblupXpg6jvvIzmiJbogIXpgJrov4flnZDmoIfmjIflrprmmL7npLrkvY3nva7jgIJcclxuICAgICAqIFxyXG4gICAgICog56S65L6L5Luj56CB5Lit5rOo6YeK5o6J5LqG5Lik56eN5pi+56S65bm/5ZGK55qE5YW35L2T5pa55rOV77yM5Y+v5Lul5qC55o2u5a6e6ZmF6ZyA5rGC6YCJ5oup5L2/55So44CCXHJcbiAgICAgKi9cclxuICAgIG9uU2hvd0Jhbm5lcigpIHtcclxuICAgICAgICAvLyDliqDovb3mjIflrprlub/lkYrkvY3nmoTmqKrluYXlub/lkYrjgIJcclxuICAgICAgICBNaW5pR2FtZVNkay5BZHZlcnRNYW5hZ2VyLmluc3RhbmNlLmxvYWRCYW5uZXIoJ2FkdW5pdC00ZTdlZjQ2N2UzZWFhYjUxJyk7XHJcblxyXG4gICAgICAgIC8vIOm7mOiupOaWueW8j+aYvuekuuaoquW5heW5v+WRiuOAglxyXG4gICAgICAgIC8vIOaWueazlTHvvJrpu5jorqTosIPnlKhcclxuICAgICAgICBNaW5pR2FtZVNkay5BZHZlcnRNYW5hZ2VyLmluc3RhbmNlLnNob3dCYW5uZXIoKTtcclxuXHJcbiAgICAgICAgLy8g56S65L6L77ya5oyH5a6a5bGP5bmV5bqV6YOo5q2j5Lit5pi+56S65qiq5bmF5bm/5ZGK44CCXHJcbiAgICAgICAgLy8g5pa55rOVMu+8muaMh+WumuWxj+W5lemhtumDqOaIluW6lemDqOato+S4rVxyXG4gICAgICAgIC8vIE1pbmlHYW1lU2RrLkFkdmVydE1hbmFnZXIuaW5zdGFuY2Uuc2hvd0Jhbm5lcignYWR1bml0LTRlN2VmNDY3ZTNlYWFiNTEnLCBNaW5pR2FtZVNkay5FQWRCYW5uZXJMb2NhdGlvbi5CT1RUT00pOyBcclxuXHJcbiAgICAgICAgLy8g56S65L6L77ya6YCa6L+H5Z2Q5qCH5oyH5a6a5L2N572u5pi+56S65qiq5bmF5bm/5ZGK44CCXHJcbiAgICAgICAgLy8g5pa55rOVMu+8muaMh+WumuWdkOagh1xyXG4gICAgICAgIC8vIE1pbmlHYW1lU2RrLkFkdmVydE1hbmFnZXIuaW5zdGFuY2Uuc2hvd0Jhbm5lcignYWR1bml0LTRlN2VmNDY3ZTNlYWFiNTEnLCB7IHRvcDogMTAsIGxlZnQ6IDEwIH0pOyBcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIOmakOiXj+W5v+WRiuaoquW5heeahOWHveaVsOOAglxyXG4gICAgICogXHJcbiAgICAgKiDor6Xlh73mlbDosIPnlKhNaW5pR2FtZVNkay5BZHZlcnRNYW5hZ2Vy5a6e5L6L55qE5pa55rOV77yM55So5LqO6ZqQ6JeP5bm/5ZGK5qiq5bmF44CCXHJcbiAgICAgKiDlvZPpnIDopoHmmoLml7blgZzmraLlsZXnpLrlub/lkYrmiJbnlKjmiLfkuLvliqjor7fmsYLpmpDol4/lub/lkYrml7bvvIzlj6/ku6XosIPnlKjmraTlh73mlbDjgIJcclxuICAgICAqIFxyXG4gICAgICogQHJlbWFya3NcclxuICAgICAqIOatpOWHveaVsOS4jeaOpeWPl+S7u+S9leWPguaVsO+8jOS5n+S4jei/lOWbnuS7u+S9leWAvOOAglxyXG4gICAgICog5a6D5Y2V57qv5Zyw6Kem5Y+R5bm/5ZGK5qiq5bmF55qE6ZqQ6JeP5pON5L2c77yM5YW35L2T5a6e546w5L6d6LWW5LqOQWR2ZXJ0TWFuYWdlcueahOWunueOsOOAglxyXG4gICAgICovXHJcbiAgICBvbkhpZGVCYW5uZXIoKSB7XHJcbiAgICAgICAgTWluaUdhbWVTZGsuQWR2ZXJ0TWFuYWdlci5pbnN0YW5jZS5oaWRlQmFubmVyKCk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiDmmL7npLrmj5LlsY/lub/lkYrnmoTlh73mlbDjgIJcclxuICAgICAqIFxyXG4gICAgICog5q2k5Ye95pWw6LCD55SoTWluaUdhbWVTZGsuQWR2ZXJ0TWFuYWdlcuWunuS+i+eahOaWueazle+8jOS7peaYvuekuuS4gOS4quaMh+WumueahOaPkuWxj+W5v+WRiuOAglxyXG4gICAgICog5a6D5L2/55So5LqG56Gs57yW56CB55qE5bm/5ZGK5Y2V5YWD5qCH6K+G56ym77yM6L+Z5oSP5ZGz552A5a6D5LiT5Li654m55a6a55qE5bm/5ZGK5L2N6K6+6K6h44CCXHJcbiAgICAgKiDlnKjlrp7pmYXlupTnlKjkuK3vvIzlj6/og73pnIDopoHmoLnmja7lupTnlKjnmoTphY3nva7miJbnlKjmiLfnmoTnibnlrprmnaHku7bmnaXliqjmgIHpgInmi6nlub/lkYrljZXlhYPmoIfor4bnrKbjgIJcclxuICAgICAqL1xyXG4gICAgb25TaG93SW50ZXJzdGl0aWFsKCkge1xyXG4gICAgICAgIE1pbmlHYW1lU2RrLkFkdmVydE1hbmFnZXIuaW5zdGFuY2Uuc2hvd0ludGVyc3RpdGlhbCgnYWR1bml0LWVhZGQ2Nzg1MWQzMDUwYWQnKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIOiwg+eUqOW5v+WRiueuoeeQhuWZqOWKoOi9veW5tuWxleekuuiHquWumuS5ieW5v+WRiuOAglxyXG4gICAgICog5q2k5pa55rOV6aaW5YWI6YCa6L+H5bm/5ZGK566h55CG5Zmo55qE5a6e5L6L5Yqg6L295oyH5a6a55qE6Ieq5a6a5LmJ5bm/5ZGK5Y2V5YWD77yM54S25ZCO5bGV56S66L+Z5Liq6Ieq5a6a5LmJ5bm/5ZGK44CCXHJcbiAgICAgKiDliqDovb3lkozlsZXnpLrlub/lkYrmmK/lub/lkYrnrqHnkIbns7vnu5/kuK3nmoTluLjop4Hmk43kvZzvvIzov5nph4zpgJrov4fkuKTmraXliIbliKvlrozmiJDliqDovb3lkozlsZXnpLrnmoTov4fnqIvvvIxcclxuICAgICAqIOS7peehruS/neW5v+WRiuWcqOWxleekuuWJjeato+ehruS4lOWFheWIhuWcsOiiq+WKoOi9veOAglxyXG4gICAgICovXHJcbiAgICBvblNob3dDdXN0b20oKSB7XHJcbiAgICAgICAgLy8g5Yqg6L295oyH5a6a55qE6Ieq5a6a5LmJ5bm/5ZGK5Y2V5YWD44CCXHJcbiAgICAgICAgTWluaUdhbWVTZGsuQWR2ZXJ0TWFuYWdlci5pbnN0YW5jZS5sb2FkQ3VzdG9tKEVXZWNoYXRBRC5DVU1TVE9NXzAxKTtcclxuICAgICAgICAvLyDlsZXnpLrlt7LliqDovb3nmoToh6rlrprkuYnlub/lkYrjgIJcclxuICAgICAgICBNaW5pR2FtZVNkay5BZHZlcnRNYW5hZ2VyLmluc3RhbmNlLnNob3dDdXN0b20oRVdlY2hhdEFELkNVTVNUT01fMDEpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICog6ZqQ6JeP6Ieq5a6a5LmJ5bm/5ZGK44CCXHJcbiAgICAgKiBcclxuICAgICAqIOacrOWHveaVsOiwg+eUqE1pbmlHYW1lU2RrLkFkdmVydE1hbmFnZXIuaW5zdGFuY2UuaGlkZUN1c3RvbSgp5p2l6ZqQ6JeP6Ieq5a6a5LmJ5bm/5ZGK44CCXHJcbiAgICAgKiDov5nmmK/lr7nmjqXlub/lkYrnrqHnkIbns7vnu5/nmoTkuIDpg6jliIbvvIznlKjkuo7mjqfliLblub/lkYrnmoTmmL7npLrkuI7pmpDol4/jgIJcclxuICAgICAqIOWcqOmcgOimgemakOiXj+iHquWumuS5ieW5v+WRiueahOWcuuaZr+S4i++8jOiwg+eUqOatpOWHveaVsOWNs+WPr+WunueOsOebuOW6lOWKn+iDveOAglxyXG4gICAgICovXHJcbiAgICBvbkhpZGVDdXN0b20oKSB7XHJcbiAgICAgICAgTWluaUdhbWVTZGsuQWR2ZXJ0TWFuYWdlci5pbnN0YW5jZS5oaWRlQ3VzdG9tKEVXZWNoYXRBRC5DVU1TVE9NXzAxKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIOinpuWPkeaYvuekuuinhumikeW5v+WRiueahOWHveaVsOOAglxyXG4gICAgICog6YCa6L+H6LCD55SoTWluaUdhbWVTZGsuQWR2ZXJ0TWFuYWdlci5pbnN0YW5jZS5zaG93VmlkZW/mlrnms5XvvIzmmL7npLrkuIDkuKrop4bpopHlub/lkYrvvIzlubbmoLnmja7nlKjmiLfop4LnnIvlub/lkYrnmoTmg4XlhrXmiafooYznm7jlupTnmoTpgLvovpHjgIJcclxuICAgICAqIFxyXG4gICAgICogQHJlbWFya3NcclxuICAgICAqIOatpOWHveaVsOmmluWFiOS8oOWFpeS4gOS4quW5v+WRiuWNleWFg0lE77yM55So5LqO5qCH6K+G6KaB5pi+56S655qE6KeG6aKR5bm/5ZGK44CC54S25ZCO5Lyg5YWl5LiA5Liq5Zue6LCD5Ye95pWw77yM6K+l5Zue6LCD5Ye95pWw5Zyo55So5oi36KeC55yL5bm/5ZGK5ZCO6KKr6LCD55So77yM5peg6K6655So5oi35piv5a6M5oiQ5LqG6KeC55yL44CB5ouS57ud5LqG6KeC55yL6L+Y5piv6KeC55yL6L+H56iL5Lit5Y+R55Sf5LqG6ZSZ6K+v44CCXHJcbiAgICAgKiDlm57osIPlh73mlbDmjqXmlLbkuKTkuKrlj4LmlbDvvJrkuIDkuKrmmK/nlKjmiLfop4LnnIvlub/lkYrnmoTnu5PmnpzvvIzlj6bkuIDkuKrmmK/nlKjmiLfop4LnnIvnmoTlub/lkYrmlbDph4/jgILmoLnmja7op4LnnIvnu5PmnpznmoTkuI3lkIzvvIzmmL7npLrkuI3lkIznmoTmj5DnpLrkv6Hmga/jgIJcclxuICAgICAqL1xyXG4gICAgb25TaG93VmlkZW8oKSB7XHJcbiAgICAgICAgLy8g5bm/5ZGK5Y2V5YWDSUTvvIznlKjkuo7moIfor4bopoHmmL7npLrnmoTop4bpopHlub/lkYpcclxuICAgICAgICAvLyDlub/lkYrljZXlhYNJROeahOagt+S+i1xyXG4gICAgICAgIC8v5oqW6Z+z5b2i5aaCOiAxcmUzbmZxa215ODFtNG04Z2VcclxuICAgICAgICAvL+W+ruS/oeW9ouWmgjogYWR1bml0LWE3NzE4ZjZlMTk1ZTQyZmVcclxuICAgICAgICBNaW5pR2FtZVNkay5BZHZlcnRNYW5hZ2VyLmluc3RhbmNlLnNob3dWaWRlbygnMXJlM25mcWtteTgxbTRtOGdlJywgKHJlczogTWluaUdhbWVTZGsuRUFkVmlkZW9SZXN1bHQsIGNvdW50OiBudW1iZXIpID0+IHtcclxuICAgICAgICAgICAgLy8g6L6T5Ye655So5oi36KeC55yL55qE5bm/5ZGK5pWw6YePXHJcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKCfnlKjmiLfnnIvnmoTop4bpopHlub/lkYrkuKrmlbDmmK86JywgY291bnQpO1xyXG5cclxuICAgICAgICAgICAgLy8g5qC55o2u55So5oi36KeC55yL5bm/5ZGK55qE57uT5p6c77yM5omn6KGM5LiN5ZCM55qE6YC76L6RXHJcbiAgICAgICAgICAgIHN3aXRjaCAocmVzKSB7XHJcbiAgICAgICAgICAgICAgICBjYXNlIE1pbmlHYW1lU2RrLkVBZFZpZGVvUmVzdWx0LkFDQ0VQVDpcclxuICAgICAgICAgICAgICAgICAgICAvLyDnlKjmiLflrozmiJDkuoblub/lkYrop4LnnIvvvIzmmL7npLrlpZblirHmj5DnpLpcclxuICAgICAgICAgICAgICAgICAgICBNaW5pR2FtZVNkay5BUEkuc2hvd1RvYXN0KCfnlKjmiLfnnIvlrozlub/lkYrvvIzlj6/ku6XlpZblirEnKTtcclxuICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgIGNhc2UgTWluaUdhbWVTZGsuRUFkVmlkZW9SZXN1bHQuUkVKRUNUOlxyXG4gICAgICAgICAgICAgICAgICAgIC8vIOeUqOaIt+aLkue7neS6huW5v+WRiuingueci++8jOaYvuekuuS4jeWlluWKseaPkOekulxyXG4gICAgICAgICAgICAgICAgICAgIE1pbmlHYW1lU2RrLkFQSS5zaG93VG9hc3QoJ+eUqOaIt+aLkue7neaOieW5v+WRiu+8jOS4jeWlluWKsScpO1xyXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgY2FzZSBNaW5pR2FtZVNkay5FQWRWaWRlb1Jlc3VsdC5FUlJPUjpcclxuICAgICAgICAgICAgICAgICAgICAvLyDlub/lkYrmkq3mlL7lj5HnlJ/plJnor6/vvIzmmL7npLrplJnor6/mj5DnpLpcclxuICAgICAgICAgICAgICAgICAgICBNaW5pR2FtZVNkay5BUEkuc2hvd1RvYXN0KCfmkq3mlL7lub/lkYrlj5HnlJ/plJnor6/vvIzkuI3lpZblirEnKTtcclxuICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgICAgICAgICAgICAgLy8g5YW25LuW5oOF5Ya177yM5LiN5L2c5aSE55CGXHJcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIOW8leWvvOeUqOaIt+WIhuS6q+W6lOeUqOe7meaci+WPi+OAglxyXG4gICAgICogXHJcbiAgICAgKiDpgJrov4fosIPnlKhNaW5pR2FtZVNka+eahEFQSeWIhuS6q+WKn+iDve+8jOWQkeeUqOaIt+eahOaci+WPi+WciOWPkemAgemCgOivt++8jOmCgOivt+S7luS7rOS4gOi1t+eOqea4uOaIj+OAglxyXG4gICAgICog6L+Z5piv5LiA5Liq6YeN6KaB55qE5o6o5bm/5omL5q6177yM5Y+v5Lul5aKe5Yqg5bqU55So55qE5pud5YWJ5bqm5ZKM55So5oi36YeP44CCXHJcbiAgICAgKiBcclxuICAgICAqIEByZW1hcmtzXHJcbiAgICAgKiDmraTmlrnms5XkuK3osIPnlKjnmoRBUEnkvp3otZbkuo7nibnlrprnmoTlsI/muLjmiI/lubPlj7DvvIzlm6DmraTlnKjkuI3lkIznmoTlubPlj7DkuIrlj6/og73pnIDopoHkuI3lkIznmoTlrp7njrDjgIJcclxuICAgICAqL1xyXG4gICAgb25TaGFyZSgpIHtcclxuICAgICAgICBNaW5pR2FtZVNkay5BUEkuc2hhcmVBcHBUb0ZyaWVuZHMoJ+adpeeOqea4uOaIj+WQpycpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICog5pi+56S65LiA5LiqdG9hc3Tmj5DnpLrjgIJcclxuICAgICAqIFxyXG4gICAgICog6YCa6L+H6LCD55SoTWluaUdhbWVTZGvnmoRBUEnmlrnms5XmnaXmmL7npLrkuIDkuKrnroDnn63nmoTmj5DnpLrkv6Hmga/jgIJ0b2FzdOaYr+S4gOenjei9u+mHj+e6p+eahOaPkOekuuaWueW8j++8jOeUqOS6juWcqOeVjOmdouS4iuefreaaguWcsOWxleekuuS4gOS6m+S/oeaBr++8jOS4jeW9seWTjeeUqOaIt+aTjeS9nOOAglxyXG4gICAgICog6L+Z6YeM5L2/55So5LqG5Zu65a6a55qE5o+Q56S65paH5pysICfov5nmmK/kuIDkuKp0b2FzdCfvvIzlnKjlrp7pmYXlupTnlKjkuK3vvIzlj6/ku6XmoLnmja7pnIDopoHliqjmgIHorr7nva7mj5DnpLrmlofmnKzjgIJcclxuICAgICAqL1xyXG4gICAgb25TaG93VG9hc3QoKSB7XHJcbiAgICAgICAgTWluaUdhbWVTZGsuQVBJLnNob3dUb2FzdCgn6L+Z5piv5LiA5LiqdG9hc3QnKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIOinpuWPkeiuvuWkh+aMr+WKqOWKn+iDveOAglxyXG4gICAgICogXHJcbiAgICAgKiDor6Xmlrnms5XnlKjkuo7osIPnlKhNaW5pR2FtZVNka+aPkOS+m+eahEFQSe+8jOS7peWunueOsOiuvuWkh+eahOaMr+WKqOWKn+iDveOAguW9k+mcgOimgeaPkOmGkueUqOaIt+aIluaPkOS+m+inpuinieWPjemmiOaXtu+8jOWPr+S7peiwg+eUqOatpOaWueazleOAglxyXG4gICAgICog5L6L5aaC77yM5Zyo5ri45oiP5oiW5bqU55So5Lit77yM5b2T55So5oi35a6M5oiQ54m55a6a5pON5L2c5oiW5Y+R55Sf54m55a6a5LqL5Lu25pe277yM5Y+v5Lul6YCa6L+H5oyv5Yqo57uZ5LqI55So5oi35Y+N6aaI44CCXHJcbiAgICAgKiBcclxuICAgICAqIEByZW1hcmtzXHJcbiAgICAgKiDmraTmlrnms5Xml6Dlj4LmlbDvvIzkuZ/kuI3ov5Tlm57ku7vkvZXlgLzjgIJcclxuICAgICAqL1xyXG4gICAgb25WaXJicmF0ZSgpIHtcclxuICAgICAgICBNaW5pR2FtZVNkay5BUEkudmlicmF0ZSgpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICog6YeN5paw5ZCv5Yqo5ri45oiP5a6e5L6L44CCXHJcbiAgICAgKiBcclxuICAgICAqIOatpOWHveaVsOiwg+eUqE1pbmlHYW1lU2Rr5Lit55qEQVBJ6YeN5paw5ZCv5Yqo5ri45oiP44CC6YeN5paw5ZCv5Yqo5pON5L2c5Y+v6IO95piv5Li65LqG5Yid5aeL5YyW5ri45oiP546v5aKD44CB6YeN572u5ri45oiP54q25oCB5oiW5aSE55CG5YW25LuW6ZyA6KaB6YeN5ZCv55qE5Zy65pmv44CCXHJcbiAgICAgKiDosIPnlKjmraTlh73mlbDlkI7vvIzmuLjmiI/lsIbkvJrph43mlrDlvIDlp4vvvIzlvZPliY3nmoTmuLjmiI/nirbmgIHlsIbkvJrooqvmuIXpmaTjgIJcclxuICAgICAqIFxyXG4gICAgICogQHJlbWFya3NcclxuICAgICAqIOatpOWHveaVsOS4jeaOpeWPl+S7u+S9leWPguaVsOOAglxyXG4gICAgICogXHJcbiAgICAgKiBAcmV0dXJucyDml6Dov5Tlm57lgLzjgIJcclxuICAgICAqL1xyXG4gICAgb25SZWJvb3QoKSB7XHJcbiAgICAgICAgTWluaUdhbWVTZGsuQVBJLnJlYm9vdCgpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICog5b2T5YmN5Ye95pWw55So5LqO5Zyo6L+35L2g5ri45oiP5Lit5a6e546w6YCA5Ye65Yqf6IO944CCXHJcbiAgICAgKiDlroPosIPnlKjkuoZNaW5pR2FtZVNka+aPkOS+m+eahEFQSeaWueazleadpeinpuWPkemAgOWHuuaTjeS9nOOAglxyXG4gICAgICog6K+l5pa55rOV6YCa5bi45Zyo6ZyA6KaB57uT5p2f5b2T5YmN6L+35L2g5ri45oiP5oiW6L+U5Zue5Yiw5LiK5LiA57qn6I+c5Y2V5pe26KKr6LCD55So44CCXHJcbiAgICAgKi9cclxuICAgIG9uRXhpdCgpIHtcclxuICAgICAgICBNaW5pR2FtZVNkay5BUEkuZXhpdCgpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICog5pi+56S65YiG5Lqr6I+c5Y2V44CCXHJcbiAgICAgKiBcclxuICAgICAqIOmAmui/h+iwg+eUqE1pbmlHYW1lU2Rr55qEQVBJ5pa55rOV77yM6Kem5Y+R5pi+56S65YiG5Lqr6I+c5Y2V55qE5pON5L2c44CC5q2k5Ye95pWw5peo5Zyo5o+Q5L6b5LiA5Liq57uf5LiA55qE5YWl5Y+j77yMXHJcbiAgICAgKiDku6Xkvr/lnKjpnIDopoHml7bovbvmnb7osIPnlKjliIbkuqvlip/og73vvIzogIzml6DpnIDnm7TmjqXkuI7lhbfkvZPnmoRTREvmjqXlj6PkuqTkupLjgIJcclxuICAgICAqIFxyXG4gICAgICogQHJlbWFya3NcclxuICAgICAqIOatpOaWueazleS4jeaOpeWPl+S7u+S9leWPguaVsO+8jOS5n+S4jei/lOWbnuS7u+S9leWAvOOAglxyXG4gICAgICovXHJcbiAgICBvblNob3dTaGFyZU1lbnUoKSB7XHJcbiAgICAgICAgTWluaUdhbWVTZGsuQVBJLnNob3dTaGFyZU1lbnUoKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIOWvvOiIquWIsOaMh+WumueahOWwj+a4uOaIj+OAglxyXG4gICAgICogXHJcbiAgICAgKiDmnKzlh73mlbDnlKjkuo7op6blj5Hlr7zoiKrliLDkuIDkuKrnibnlrprnmoTlsI/muLjmiI/jgILov5npnIDopoHmj5Dkvpvnm67moIflsI/muLjmiI/nmoRJRO+8jFxyXG4gICAgICog5Lul5L6/57O757uf6IO95aSf5q2j56Gu5Zyw5bCG55So5oi36YeN5a6a5ZCR5Yiw55uu5qCH5bCP5ri45oiP44CCXHJcbiAgICAgKiBcclxuICAgICAqIOazqOaEj++8mui/memHjOeahCd4eHgn5piv5Y2g5L2N56ym77yM5a6e6ZmF5L2/55So5pe26ZyA6KaB5pu/5o2i5Li65YW35L2T55qE5bCP5ri45oiPSUTjgIJcclxuICAgICAqL1xyXG4gICAgb25OYXZpZ2F0ZSgpIHtcclxuICAgICAgICBNaW5pR2FtZVNkay5BUEkubmF2aWdhdGVUbygneHh4Jyk7IC8vIHh4eOabv+aNouS4uuS9oOeahOWwj+a4uOaIj2lkXHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiDmv4DmtLvlrZfoioLot7PliqjlhaXlj6Pop4blm77jgIJcclxuICAgICAqIFxyXG4gICAgICog5q2k5pa55rOV55So5LqO5bCG5a2X6IqC6Lez5Yqo5YWl5Y+j6KeG5Zu+6K6+572u5Li65rS76LeD54q25oCB44CC5b2T6ZyA6KaB5Zyo55So5oi355WM6Z2i5Lit5pi+56S65a2X6IqC6Lez5Yqo55qE5YWl5Y+j5pe277yMXHJcbiAgICAgKiDlj6/ku6XosIPnlKjmraTmlrnms5XmnaXmv4DmtLvnm7jlupTnmoTop4blm77lhYPntKDvvIzkvb/lhbblr7nnlKjmiLflj6/op4HjgIJcclxuICAgICAqL1xyXG4gICAgb25CeXRlZGFuY2VFbnRyYW5jZVZpZXcoKSB7XHJcbiAgICAgICAgLy8gdGhpcy5lbnRyYW5jZVZpZXcuYWN0aXZlID0gdHJ1ZTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIOivt+axgueZu+W9leS7o+eggVxyXG4gICAgICogXHJcbiAgICAgKiDmnKzlh73mlbDnlKjkuo7op6blj5HlsI/nqIvluo/nmoTnmbvlvZXmtYHnqIvvvIzojrflj5blvq7kv6HmiJblpLTmnaHnrYnnrKzkuInmlrnlubPlj7DnmoTnmbvlvZXku6PnoIHjgIJcclxuICAgICAqIOi/meS6m+S7o+eggeWPr+S7peeUqOS6juWQjue7reeahOeUqOaIt+i6q+S7vemqjOivgeWSjOaVsOaNruWQjOatpea1geeoi+OAglxyXG4gICAgICovXHJcbiAgICBvbkdldExvZ2luQ29kZSgpIHtcclxuICAgICAgICAvLyDosIPnlKhNaW5pR2FtZVNka+eahEFQSeeZu+W9leaWueazle+8jOS8oOWFpeS4gOS4quWbnuiwg+WHveaVsOWkhOeQhueZu+W9lee7k+aenFxyXG4gICAgICAgIE1pbmlHYW1lU2RrLkFQSS5sb2dpbigoY29kZTogc3RyaW5nLCBhbm9ueW1vdXNDb2RlOiBzdHJpbmcpID0+IHtcclxuICAgICAgICAgICAgLy8g5omT5Y2w5b6u5L+h5oiW5aS05p2h55qE55m75b2V5Luj56CBXHJcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKCdXZWNoYXQgT3IgQnl0ZWRhbmNlIENvZGU6JywgY29kZSk7XHJcbiAgICAgICAgICAgIC8vIOaJk+WNsOWktOadoeeahOWMv+WQjeeZu+W9leS7o+eggVxyXG4gICAgICAgICAgICAvLyBjb25zb2xlLmxvZygnQnl0ZWRhbmNlIEFub255bW91cyBDb2RlOicsIGFub255bW91c0NvZGUpO1xyXG4gICAgICAgICAgICBpZihjb2RlKXtcclxuICAgICAgICAgICAgICAgIEZ4LkdhbWVUb29sLmdldFVzZXJJZChjb2RlLCBkYXRhID0+IHRoaXMuc2V0VXNlcklkKGRhdGEpKTsgXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBzZXRVc2VySWQoZGF0YSl7XHJcbiAgICAgICAgRnguR2FtZUNvbmZpZy5HTV9JTkZPLnVzZXJJZCA9IGRhdGEuZGF0YS51c2VySWQ7XHJcbiAgICAgICAgTWluaUdhbWVTZGsuQVBJLmdldFVzZXJJbmZvKHRoaXMuc2V0VXNlckluZm8pO1xyXG4gICAgfVxyXG5cclxuICAgIHNldFVzZXJJbmZvKGRhdGEpe1xyXG4gICAgICAgIGNvbnNvbGUubG9nKFwi6I635Y+W5Yiw55qE55So5oi35L+h5oGvXCIsZGF0YS51c2VySW5mbyk7XHJcbiAgICAgICAgdmFyIHVzZURhdGEgPSB7XHJcbiAgICAgICAgICAgIFwiZ2FtZUlkXCI6IEZ4LkdhbWVDb25maWcuR01fSU5GTy5nYW1lSWQsXHJcbiAgICAgICAgICAgIFwidXNlcklkXCI6IEZ4LkdhbWVDb25maWcuR01fSU5GTy51c2VySWQsXHJcbiAgICAgICAgICAgIFwibmlja05hbWVcIjpkYXRhLnVzZXJJbmZvLm5pY2tOYW1lLFxyXG4gICAgICAgICAgICBcInBpY1wiOiBkYXRhLnVzZXJJbmZvLmF2YXRhclVybFxyXG4gICAgICAgICAgIFxyXG4gICAgICAgIH1cclxuICAgICAgICBjb25zb2xlLmxvZyhcIuWNs+WwhuS4iuS8oOeahOeUqOaIt+S/oeaBrzpcIixGeC5HYW1lQ29uZmlnLkdNX0lORk8udXNlcklkLGRhdGEudXNlckluZm8ubmlja05hbWUsZGF0YS51c2VySW5mby5hdmF0YXJVcmwpO1xyXG4gICAgICAgIGNvbnNvbGUubG9nKFwiUG9zdOaVsOaNrjpcIix1c2VEYXRhKTtcclxuICAgICAgICBGeC5IdHRwVXRpbC5zZXRVc2VySW5mbyh1c2VEYXRhLChyZXMpPT57XHJcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKFwi5LiK5Lyg5oiQ5YqfOlwiLHJlcyk7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiDliJvlu7rlubbmmL7npLrmuLjmiI/lnIjmjInpkq5cclxuICAgICAqIFxyXG4gICAgICog5pys5Ye95pWw6YCa6L+H6LCD55SoTWluaUdhbWVTZGvnmoRHYW1lQ2x1YuWunuS+i+aWueazle+8jOWunueOsOa4uOaIj+S/seS5kOmDqOeahOWIm+W7uuWSjOaYvuekuuOAglxyXG4gICAgICog5a6D6aaW5YWI6YWN572u5L+x5LmQ6YOo55qE5Zu+5qCH57G75Z6L5ZKM5L2N572u5aSn5bCP77yM54S25ZCO5Yib5bu65L+x5LmQ6YOo77yM5pyA5ZCO5pi+56S65L+x5LmQ6YOo44CCXHJcbiAgICAgKiDov5nmoLflgZrmmK/kuLrkuoblnKjlsI/muLjmiI/lhoXliJvlu7rlubblsZXnpLrkuIDkuKrmuLjmiI/kv7HkuZDpg6jnmoTlm77moIfvvIzkvpvnjqnlrrbliqDlhaXmiJbkupLliqjjgIJcclxuICAgICAqL1xyXG4gICAgb25DcmVhdGVDbHViKCkge1xyXG4gICAgICAgIC8vIOmFjee9ruS/seS5kOmDqOWbvuagh+S4uue7v+iJsu+8jOiuvue9ruWbvuagh+eahOS9jee9ruS4uumhtumDqDIwMOWDj+e0oO+8jOW3puS+pzDlg4/ntKBcclxuICAgICAgICBNaW5pR2FtZVNkay5HYW1lQ2x1Yi5pbnN0YW5jZS5jcmVhdGUoXHJcbiAgICAgICAgICAgIE1pbmlHYW1lU2RrLkVHYW1lQ2x1Ykljb24uR1JFRU4sXHJcbiAgICAgICAgICAgIHsgdG9wOiAyMDAsIGxlZnQ6IDAgfSxcclxuICAgICAgICAgICAgeyB3aWR0aDogNTAsIGhlaWdodDogNTAgfSk7XHJcbiAgICAgICAgLy8g5pi+56S65ri45oiP5L+x5LmQ6YOo5Zu+5qCHXHJcbiAgICAgICAgTWluaUdhbWVTZGsuR2FtZUNsdWIuaW5zdGFuY2Uuc2hvdygpO1xyXG4gICAgfVxyXG59XHJcbiJdfQ==
|