(function() { var nodeEnv = typeof require !== 'undefined' && typeof process !== 'undefined'; var __module = nodeEnv ? module : {exports:{}}; var __filename = 'preview-scripts/assets/Script/Sdk/MiniGameSdk.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, 'c1af9nd7gNA95YJ04h9DdNX', 'MiniGameSdk'); // Script/Sdk/MiniGameSdk.ts "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.MiniGameSdk = void 0; /** * 小游戏平台SDK工具封装,目前只支持微信和抖音平台 */ var MiniGameSdk; (function (MiniGameSdk) { function isWechat() { //@ts-ignore return window.wx !== null && window.wx !== undefined; } MiniGameSdk.isWechat = isWechat; function isBytedance() { //@ts-ignore return window.tt !== null && window.tt !== undefined; } MiniGameSdk.isBytedance = isBytedance; function getSysWinSize() { var sys; if (isWechat()) { // @ts-ignore sys = wx.getSystemInfoSync(); } else if (isBytedance()) { // @ts-ignore sys = tt.getSystemInfoSync(); } var size = { width: 0, height: 0 }; if (sys) { size.width = sys.windowWidth; size.height = sys.windowHeight; } return size; } /** * 插屏广告。微信抖音都支持! */ var ADInterstitial = /** @class */ (function () { function ADInterstitial(adUid) { this._adUid = adUid; } Object.defineProperty(ADInterstitial.prototype, "aduid", { get: function () { return this._adUid; }, enumerable: false, configurable: true }); ADInterstitial.prototype.show = function () { var _this = this; var _a, _b; // @ts-ignore if (isWechat() && !wx.createInterstitialAd) { console.warn('wechat unsupport interstitial AD!'); this._interstitial = null; return; } // @ts-ignore if (isBytedance() && !tt.createInterstitialAd) { console.warn('bytedance unsupport interstitial AD!'); this._interstitial = null; return; } if (this._interstitial) { this._interstitial.load(); } else { if (isWechat()) { // @ts-ignore this._interstitial = wx.createInterstitialAd({ adUnitId: this._adUid }); } else if (isBytedance()) { // @ts-ignore this._interstitial = tt.createInterstitialAd({ adUnitId: this._adUid }); } else { this._interstitial = null; } (_a = this._interstitial) === null || _a === void 0 ? void 0 : _a.onLoad(function () { console.log('load interstitial ad success'); _this._interstitial.show().catch(function (err) { console.log('catch interstitial ad error:', err); }); }); (_b = this._interstitial) === null || _b === void 0 ? void 0 : _b.onError(function (err) { console.log('interstitial ad on error:', err); }); } }; ADInterstitial.prototype.destory = function () { var _a; (_a = this._interstitial) === null || _a === void 0 ? void 0 : _a.destroy(); }; return ADInterstitial; }()); var ADBanner = /** @class */ (function () { /** * 抖音和微信都支持 * 横幅广告。预估宽度默认为300,预估高度为140。如果你不确定就按默认值来。 * @param adUid 广告UID,后端配置 * @param isTop 是否在屏幕顶部展示。内部会自动居中计算位置。 * @param bannerWidth 横幅广告的预估宽度。默认300 * @param autoShow 广告加载完成后是否立刻显示,默认为不显示 */ function ADBanner(adUid, param, bannerWidth, autoShow) { if (bannerWidth === void 0) { bannerWidth = 300; } if (autoShow === void 0) { autoShow = false; } this._adUid = adUid; this.create(autoShow, bannerWidth, param); // 默认300比较合适 } Object.defineProperty(ADBanner.prototype, "aduid", { get: function () { return this._adUid; }, enumerable: false, configurable: true }); ADBanner.prototype.create = function (autoShow, bannerWidth, param) { var _this = this; var _a, _b; if (!isWechat() && !isBytedance()) { this._banner = null; return; } this.destroy(); var winSize = getSysWinSize(); var height = bannerWidth * 0.4; var top = 0, left = 0; if (typeof param === "boolean") { left = (winSize.width - bannerWidth) / 2; top = param ? 5 : (winSize.height - height); } else { left = param.left; top = param.top; } var params = { adUnitId: this._adUid, adIntervals: 30, style: { left: left, top: top, width: bannerWidth } }; if (isWechat()) { // @ts-ignore this._banner = wx.createBannerAd(params); } else if (isBytedance()) { // @ts-ignore this._banner = tt.createBannerAd(params); } else { this._banner = null; } (_a = this._banner) === null || _a === void 0 ? void 0 : _a.onError(function (err) { console.log('ad banner error:', err); }); (_b = this._banner) === null || _b === void 0 ? void 0 : _b.onLoad(function () { autoShow && _this._banner.show(); }); }; ADBanner.prototype.show = function () { var _a; (_a = this._banner) === null || _a === void 0 ? void 0 : _a.show(); }; ADBanner.prototype.hide = function () { var _a; (_a = this._banner) === null || _a === void 0 ? void 0 : _a.hide(); }; ADBanner.prototype.destroy = function () { var _a; (_a = this._banner) === null || _a === void 0 ? void 0 : _a.destroy(); }; return ADBanner; }()); var ADCustom = /** @class */ (function () { /** * 由于原生模板广告在微信服务后端可以定制宽度大小,个数,缩放比例等,所以位置调整要根据设置的宽度来定。抖音不支持! * @param adUid 广告UID,后端配置 * @param top 从左上角开始,距离屏幕顶部的距离。注意:这个数据为设备屏幕宽度width。如果需要获取屏幕的像素,需要乘以设备像素比Pixel-Ratio,例如iPhone 13 Pro的Pixel-Ratio为3,像素为Width*3。 * @param left 从左上角开始,距离屏幕最左边的距离。注意:这个数据为设备屏幕宽度width。如果需要获取屏幕的像素,需要乘以设备像素比Pixel-Ratio,例如iPhone 13 Pro的Pixel-Ratio为3,像素为Width*3。 * @param scale 原生模板广告的尺寸,默认为1,即100%。此值在微信服务后端广告中获得,默认为100%,目前有100%,90%,80%三种,一般情况不用修改。若有修改,记得传入值,例如90%就传入0.9。 */ function ADCustom(adUid, top, left, scale) { if (top === void 0) { top = 0; } if (left === void 0) { left = 0; } if (scale === void 0) { scale = 1.0; } this._adUid = adUid; this.createCustomAd(top, left, scale); } Object.defineProperty(ADCustom.prototype, "aduid", { get: function () { return this._adUid; }, enumerable: false, configurable: true }); ADCustom.prototype.createCustomAd = function (top, left, scale) { var _a; if (!isWechat()) { // only wechat support custom ad this._adCustom = null; console.log('Only wechat support Custom Ad'); return; } this.destroy(); // 原生模板5个应用宽度为375,若设置了缩放比例,则宽度也需要设置 // let width = 375 * this._scale; // let newLeft = (sys.windowWidth - width) / 2; // let newTop = sys.windowHeight / 2; // 120是预估高度 // @ts-ignore this._adCustom = wx.createCustomAd({ adUnitId: this._adUid, style: { left: left, top: top, fixed: true } }); (_a = this._adCustom) === null || _a === void 0 ? void 0 : _a.onError(function (err) { console.log('ad custom error:', err); }); }; ADCustom.prototype.show = function () { var _a; (_a = this._adCustom) === null || _a === void 0 ? void 0 : _a.show(); }; ADCustom.prototype.hide = function () { var _a; (_a = this._adCustom) === null || _a === void 0 ? void 0 : _a.hide(); }; ADCustom.prototype.destroy = function () { var _a; (_a = this._adCustom) === null || _a === void 0 ? void 0 : _a.destroy(); }; return ADCustom; }()); /** * 视频广告用户点击行为结果 */ var EAdVideoResult; (function (EAdVideoResult) { /** * 用户看完了广告,游戏可发放奖励。 */ EAdVideoResult[EAdVideoResult["ACCEPT"] = 0] = "ACCEPT"; /** * 用户中途关闭了广告,即未看完状态。不可发放奖励。 */ EAdVideoResult[EAdVideoResult["REJECT"] = 1] = "REJECT"; /** * 广告组件内部发生了错误。不可发放奖励。 */ EAdVideoResult[EAdVideoResult["ERROR"] = 2] = "ERROR"; })(EAdVideoResult = MiniGameSdk.EAdVideoResult || (MiniGameSdk.EAdVideoResult = {})); var ADVideo = /** @class */ (function () { function ADVideo(adUid) { this._adVideo = null; this._adUid = adUid; } Object.defineProperty(ADVideo.prototype, "aduid", { get: function () { return this._adUid; }, enumerable: false, configurable: true }); /** * 由于微信和抖音视频广告机制不同,微信可以看的视频广告个数只有0和1个,抖音平台则可以看0~maxVideoCount * @param onResult 两个参数:第一个res是EAdVideoResult定义,第二count是用户看了多少个视频广告。 * @param target onResult的拥有者 * @param maxVideoCount 可以连续看最大视频个数,可最大化商业效率。默认为3个。 * @returns */ ADVideo.prototype.show = function (onResult, target, maxVideoCount) { var _this = this; var _a, _b, _c, _d, _e; if (maxVideoCount === void 0) { maxVideoCount = 3; } var callback = function (state, count) { onResult === null || onResult === void 0 ? void 0 : onResult.call(target, state, count); }; if (!isWechat() && !isBytedance()) { callback(EAdVideoResult.ACCEPT, 1); this._adVideo = null; return; } var onAdVideoClosed = function (res) { var _a; (_a = _this._adVideo) === null || _a === void 0 ? void 0 : _a.offClose(onAdVideoClosed); if (isWechat()) { if (res && res.isEnded || res === undefined) { callback(EAdVideoResult.ACCEPT, 1); } else { callback(EAdVideoResult.REJECT, 0); } } else if (isBytedance()) { var resConverted = res; if (resConverted && resConverted.count > 0) { callback(EAdVideoResult.ACCEPT, resConverted.count); } else { callback(EAdVideoResult.REJECT, 0); } } }; (_a = this._adVideo) === null || _a === void 0 ? void 0 : _a.offClose(onAdVideoClosed); if (isWechat()) { // @ts-ignore this._adVideo = wx.createRewardedVideoAd({ adUnitId: this._adUid }); } else if (isBytedance()) { // @ts-ignore this._adVideo = tt.createRewardedVideoAd({ adUnitId: this._adUid, multiton: true, multitonRewardMsg: ['多1次奖励', '再多一次奖励', '再多一次奖励'], multitonRewardTimes: maxVideoCount, }); } else { this._adVideo = null; } (_b = this._adVideo) === null || _b === void 0 ? void 0 : _b.onLoad(function () { console.log('Ad load success'); }); (_c = this._adVideo) === null || _c === void 0 ? void 0 : _c.onError(function (err) { console.log('Ad video error:', err); callback(EAdVideoResult.ERROR, 0); }); (_d = this._adVideo) === null || _d === void 0 ? void 0 : _d.onClose(onAdVideoClosed); (_e = this._adVideo) === null || _e === void 0 ? void 0 : _e.show().catch(function () { var _a; (_a = _this._adVideo) === null || _a === void 0 ? void 0 : _a.load().then(function () { var _a; return (_a = _this._adVideo) === null || _a === void 0 ? void 0 : _a.show(); }).catch(function (err) { console.log('Catch video ad error:', err); callback(EAdVideoResult.ERROR, 0); }); }); }; ADVideo.prototype.destory = function () { var _a; (_a = this._adVideo) === null || _a === void 0 ? void 0 : _a.destory(); }; return ADVideo; }()); var EAdBannerLocation; (function (EAdBannerLocation) { /** * 屏幕顶部 */ EAdBannerLocation[EAdBannerLocation["TOP"] = 0] = "TOP"; /** * 屏幕底部 */ EAdBannerLocation[EAdBannerLocation["BOTTOM"] = 1] = "BOTTOM"; })(EAdBannerLocation = MiniGameSdk.EAdBannerLocation || (MiniGameSdk.EAdBannerLocation = {})); var AdvertManager = /** @class */ (function () { function AdvertManager() { this._customs = {}; } Object.defineProperty(AdvertManager, "instance", { get: function () { if (!AdvertManager._instance) { AdvertManager._instance = new AdvertManager(); } return AdvertManager._instance; }, enumerable: false, configurable: true }); /** * 预加载横幅广告,不会显示。只有你在调用showBanner时才会显示。 * 可重复调用,但是会销毁上一次的实例。一般情况,全局有一个就行了,太多占用内存,而且没必要。 * @param adUid 广告UID * @param location 位置有两种情况:1、可以传入枚举值,默认上方; 2、可以自定义位置传入IPosition,注意IPosition中的top和left跟平台的top,left是一致(没有乘以设备像素比ratio),需要开发者自己调试位置 * @param scale 默认为跟屏幕一样的宽度,可以通过设置缩放比例来调整大小。当然,平台有规定最大或最小宽度,函数内部会自动计算。 */ AdvertManager.prototype.loadBanner = function (adUid, location, scale) { var _a; if (location === void 0) { location = EAdBannerLocation.TOP; } if (scale === void 0) { scale = 1.0; } (_a = this._banner) === null || _a === void 0 ? void 0 : _a.destroy(); var size = getSysWinSize(); // 当 style.width 小于 300 时,会取作 300。 当 style.width 大于屏幕宽度时,会取作屏幕宽度。 var width = size.width * scale; width = width < 300 ? 300 : width; // 最小值矫正 width = width > size.width ? size.width : width; //最大值矫正 this._banner = typeof location === 'number' ? new ADBanner(adUid, location === EAdBannerLocation.TOP, width, false) : new ADBanner(adUid, location, width, false); }; /** * 显示横幅广告 */ AdvertManager.prototype.showBanner = function () { if (this._banner) { this._banner.show(); } else { console.warn('MiniGameSDK: banner is null, you must call loadBanner(...) first!'); } }; /** * 隐藏横幅广告 */ AdvertManager.prototype.hideBanner = function () { var _a; (_a = this._banner) === null || _a === void 0 ? void 0 : _a.hide(); }; /** * 弹出插屏广告 * @param adUid 广告单元id */ AdvertManager.prototype.showInterstitial = function (adUid) { var _a; if (this._interstitial && this._interstitial.aduid === adUid) { this._interstitial.show(); } else { (_a = this._interstitial) === null || _a === void 0 ? void 0 : _a.destory(); this._interstitial = new ADInterstitial(adUid); this._interstitial.show(); } }; /** * 加载原生模板广告,不会显示。只有你在调用showCustom时才会显示。 * 由于原生模板广告在微信服务后端可以定制宽度大小,个数,缩放比例等,所以位置调整要根据设置的宽度来定。抖音不支持本函数,会调用无效! * @param adUid 广告ID * @param location 位置有两种情况:1、可以传入枚举值,默认上方; 2、可以自定义位置传入IPosition,注意IPosition中的top和left跟平台的top,left是一致(没有乘以设备像素比ratio),需要开发者自己调试位置 * @param scale 缩放比例,默认是1,即不缩放。这个缩放并不是自己填,而是根据微信MP后台你配置的原生模板广告的缩放比例填,目前有100%,90%,80%三种,一般情况不用修改。若有后台修改,记得传入值,例如90%就传入0.9。 */ AdvertManager.prototype.loadCustom = function (adUid, location, scale) { if (location === void 0) { location = { top: 0, left: 0 }; } if (scale === void 0) { scale = 1; } // this._custom?.destroy(); // this._custom = new ADCustom(adUid, location.top, location.left, scale); if (this._customs[adUid]) { console.log(adUid + " has been loaded."); return; } this._customs[adUid] = new ADCustom(adUid, location.top, location.left, scale); }; /** * 显示自定义广告。 * @param adUid 广告的唯一标识符。使用此标识符来查找和显示特定的自定义广告。 * * 此方法尝试根据提供的adUid显示一个自定义广告。如果给定的adUid对应的自定义广告已加载, * 则调用该广告的显示方法。如果广告未加载,则在控制台输出警告信息。 */ AdvertManager.prototype.showCustom = function (adUid) { if (this._customs[adUid]) { this._customs[adUid].show(); } else { console.warn("You have not load " + adUid + " of Custom AD, can not show!"); } }; /** * 隐藏指定的自定义广告单元 * * 此方法用于隐藏通过广告单元标识符(adUid)指定的自定义广告。如果指定的广告单元已加载并显示, * 则将其隐藏;如果广告单元未加载,则在控制台输出警告信息。 * * @param adUid 广告单元标识符,用于唯一标识一个自定义广告单元。 */ AdvertManager.prototype.hideCustom = function (adUid) { if (this._customs[adUid]) { this._customs[adUid].hide(); } else { console.warn("You have not load " + adUid + " of Custom AD, can not hide!"); } }; /** * 由于微信和抖音视频广告机制不同,微信可以看的视频广告个数只有0和1个,抖音平台则可以看0~maxVideoCount * @param adUid 广告ID。如果与上一次UID不同,则内部会重新创建实例。开发者完全不用关心这个细节。 * @param onVideoResult 两个参数:第一个res是EAdVideoResult定义,第二count是用户看了多少个视频广告。 * @param target onVideoResult的拥有者 * @param maxVideoCount 最大视频个数。默认是3,仅对抖音平台生效。微信平台看完视频count的结果永远是1或0 */ AdvertManager.prototype.showVideo = function (adUid, onVideoResult, target, maxVideoCount) { var _a; if (maxVideoCount === void 0) { maxVideoCount = 3; } if (this._video && this._video.aduid === adUid) { this._video.show(onVideoResult, target, maxVideoCount); } else { (_a = this._video) === null || _a === void 0 ? void 0 : _a.destory(); this._video = new ADVideo(adUid); this._video.show(onVideoResult, target, maxVideoCount); } }; /** * 销毁内部所有实例,清空内存 */ AdvertManager.prototype.destroyAll = function () { var _a, _b, _c, _d; (_a = this._banner) === null || _a === void 0 ? void 0 : _a.destroy(); this._banner = null; (_b = this._interstitial) === null || _b === void 0 ? void 0 : _b.destory(); this._interstitial = null; (_c = this._video) === null || _c === void 0 ? void 0 : _c.destory(); this._video = null; if (this._customs) { for (var val in this._customs) { (_d = this._customs[val]) === null || _d === void 0 ? void 0 : _d.destroy(); } this._customs = {}; } }; return AdvertManager; }()); MiniGameSdk.AdvertManager = AdvertManager; var EGameClubIcon; (function (EGameClubIcon) { /** 绿色图标 */ EGameClubIcon["GREEN"] = "green"; /** 红色图标 */ EGameClubIcon["WHITE"] = "white"; /** 有黑色圆角背景的白色图标 */ EGameClubIcon["DARK"] = "dark"; /** 有白色圆角背景的绿色图标 */ EGameClubIcon["LIGHT"] = "light"; })(EGameClubIcon = MiniGameSdk.EGameClubIcon || (MiniGameSdk.EGameClubIcon = {})); var GameClub = /** @class */ (function () { function GameClub() { } Object.defineProperty(GameClub, "instance", { get: function () { if (!this._instance) { this._instance = new GameClub(); } return this._instance; }, enumerable: false, configurable: true }); /** * 创建游戏圈按钮 * @param icon * @param position * @param size * @param openLink */ GameClub.prototype.create = function (icon, position, size, openLink) { if (icon === void 0) { icon = EGameClubIcon.GREEN; } if (position === void 0) { position = { top: 0, left: 0 }; } if (size === void 0) { size = { width: 40, height: 40 }; } if (isWechat()) { // @ts-ignore this._club = wx.createGameClubButton({ icon: icon, style: { left: position.left, top: position.top, width: size.width, height: size.height }, openlink: openLink }); } }; GameClub.prototype.show = function () { var _a; (_a = this._club) === null || _a === void 0 ? void 0 : _a.show(); }; GameClub.prototype.hide = function () { var _a; (_a = this._club) === null || _a === void 0 ? void 0 : _a.hide(); }; GameClub.prototype.destory = function () { var _a; (_a = this._club) === null || _a === void 0 ? void 0 : _a.destroy(); }; return GameClub; }()); MiniGameSdk.GameClub = GameClub; /** * 振动类型 */ var EVirbrateType; (function (EVirbrateType) { /** * 短振动 */ EVirbrateType[EVirbrateType["SHORT"] = 0] = "SHORT"; /** * 长振动 */ EVirbrateType[EVirbrateType["LONG"] = 1] = "LONG"; })(EVirbrateType = MiniGameSdk.EVirbrateType || (MiniGameSdk.EVirbrateType = {})); /** * 平台常用API合集 */ var API = /** @class */ (function () { function API() { } /** * 分享app给朋友,微信小游戏分享是没有onSuccess回调的。 * @param title 标题 * @param description 细节描述信息 * @param imageUrl 图片地址 * @param query 查询信息 * @param onSuccess 抖音会回调,微信不会回调 */ API.shareAppToFriends = function (title, description, imageUrl, query, onSuccess) { if (description === void 0) { description = ''; } if (isWechat()) { try { //@ts-ignore wx.shareAppMessage({ title: title, imageUrl: imageUrl, query: query, }); } catch (err) { console.log("share faild: " + err); } } if (isBytedance()) { //@ts-ignore tt.shareAppMessage({ title: title, desc: description, imageUrl: imageUrl !== null && imageUrl !== void 0 ? imageUrl : '', query: query !== null && query !== void 0 ? query : '', success: function (res) { console.log('share success:', res); onSuccess === null || onSuccess === void 0 ? void 0 : onSuccess(); }, fail: function (res) { console.log('share fail:', res); } }); } }; /** * 显示提示信息 * @param title 标题 * @param duration 时长(单位:秒) * @returns */ API.showToast = function (title, duration) { if (duration === void 0) { duration = 2; } if (isWechat()) { // @ts-ignore wx.showToast({ title: title, icon: 'success', duration: duration * 1000 }); } if (isBytedance()) { //@ts-ignore tt.showToast({ title: title, duration: duration * 1000, success: function (res) { console.log("" + res); }, fail: function (res) { console.log("showToast\u8C03\u7528\u5931\u8D25"); }, }); } }; /** * 设备震动效果,默认为短震动。注意:可能一些机型不会生效,具体看平台方的说明 * @param type MiniGameSdk.API.EVirbrateType */ API.vibrate = function (type) { if (type === void 0) { type = EVirbrateType.SHORT; } if (isWechat()) { switch (type) { case EVirbrateType.SHORT: //@ts-ignore wx.vibrateShort({ success: function (res) { console.log('vibrate success:', res); }, fail: function (res) { console.log('vibrateShort failed', res); }, }); break; case EVirbrateType.LONG: //@ts-ignore wx.vibrateLong({ success: function (res) { console.log('vibrate success', res); }, fail: function (res) { console.log("vibrateLong failed", res); }, }); break; default: break; } } if (isBytedance()) { switch (type) { case EVirbrateType.SHORT: //@ts-ignore tt.vibrateShort({ success: function (res) { console.log('vibrate success:', res); }, fail: function (res) { console.log('vibrateShort failed', res); }, }); break; case EVirbrateType.LONG: //@ts-ignore tt.vibrateLong({ success: function (res) { console.log('vibrate success', res); }, fail: function (res) { console.log("vibrateLong failed", res); }, }); break; default: break; } } }; /** * 重启小游戏 */ API.reboot = function () { if (isWechat()) { //@ts-ignore wx.restartMiniProgram({ success: function () { console.log('restart success'); }, fail: function () { console.log('restart failed'); } }); } if (isBytedance()) { try { // @ts-ignore tt.restartMiniProgramSync(); } catch (error) { console.log("restartMiniProgramSync", error); } } }; /** * 退出小游戏 */ API.exit = function () { if (isWechat()) { //@ts-ignore wx.exitMiniProgram({ success: function () { console.log('exit success'); }, fail: function () { console.log('exit failed'); } }); } if (isBytedance()) { // @ts-ignore tt.exitMiniProgram({ success: function (res) { console.log("exit success:", res === null || res === void 0 ? void 0 : res.data); }, fail: function (res) { console.log("exit fail:", res === null || res === void 0 ? void 0 : res.errMsg); }, }); } }; /** * 显示转发按钮。通常在刚进入游戏的时候调用。 * 主要是打开平台“...”这个按钮里面的分享菜单,一般默认是关闭的,需要调用这个函数打开。可以让用户分享你的游戏入口。 */ API.showShareMenu = function () { if (isWechat()) { //@ts-ignore wx.showShareMenu({ withShareTicket: true, menus: ['shareAppMessage', 'shareTimeline'], success: function () { }, fail: function () { }, complete: function () { } }); } if (isBytedance()) { //@ts-ignore tt.showShareMenu({ success: function (res) { console.log("show menu is showing"); }, fail: function (err) { console.log("showShareMenu:", err.errMsg); }, complete: function (res) { console.log("showShareMenu complete"); }, }); } }; /** * 微信小游戏:跳转到另外一款小游戏 * 抖音小游戏:跳转到指定的视频界面 * @param targetId 微信小游戏appid或者视频界面 */ API.navigateTo = function (targetId, onSuccess) { if (isWechat()) { // @ts-ignore wx.navigateToMiniProgram({ appId: targetId, extraData: { foo: 'bar' }, envVersion: 'develop', success: function (res) { onSuccess === null || onSuccess === void 0 ? void 0 : onSuccess(); } }); } if (isBytedance()) { // @ts-ignore tt.navigateToVideoView({ videoId: targetId, success: function (res) { onSuccess === null || onSuccess === void 0 ? void 0 : onSuccess(); }, fail: function (err) { console.log("bytedance navigateToVideoView fail", err); }, }); } }; /** * 小游戏平台登录功能。微信返回code,抖音返回code和anonymousCode。用于登录的凭证,需要把这个code传回你的服务器程序中去调用code2Session * @param callback (code, anonymousCode) 第一个参数为code,微信和抖音都支持;第二个参数为匿名设备ID,仅抖音支持,失败都返回null */ API.login = function (callback) { var loginPlatform = function () { if (isWechat()) { //@ts-ignore wx.login({ success: function (res) { if (res.code) { API._loginCode = res.code; API._loginAnonymousCode = null; callback === null || callback === void 0 ? void 0 : callback(API._loginCode, API._loginAnonymousCode); } else { console.log('login error:', res.errMsg); } }, fail: function () { API._loginCode = null; API._loginAnonymousCode = null; callback === null || callback === void 0 ? void 0 : callback(API._loginCode, API._loginAnonymousCode); console.log('login fail'); } }); } else if (isBytedance()) { //@ts-ignore tt.login({ force: true, success: function (res) { var _a, _b; console.log("login " + res.code + " " + res.anonymousCode); if (res.code) { API._loginCode = (_a = res.code) === null || _a === void 0 ? void 0 : _a.toString(); API._loginAnonymousCode = (_b = res.anonymousCode) === null || _b === void 0 ? void 0 : _b.toString(); callback === null || callback === void 0 ? void 0 : callback(API._loginCode, API._loginAnonymousCode); } else { console.log('login error:', res.errMsg); } }, fail: function (res) { API._loginCode = null; API._loginAnonymousCode = null; callback === null || callback === void 0 ? void 0 : callback(API._loginCode, API._loginAnonymousCode); console.log("login fail", res); }, }); } else { API._loginCode = null; API._loginAnonymousCode = null; callback === null || callback === void 0 ? void 0 : callback(API._loginCode, API._loginAnonymousCode); console.log('not mini game platform, login codes are all null'); } }; if (!API._loginCode) { loginPlatform(); } else { if (isWechat()) { //@ts-ignore wx.checkSession({ success: function () { console.log("session is valid, use current code:", API._loginCode); callback === null || callback === void 0 ? void 0 : callback(API._loginCode, API._loginAnonymousCode); }, fail: function () { console.log("session expired"); loginPlatform(); } }); } else if (isBytedance()) { //@ts-ignore tt.checkSession({ success: function () { console.log("session is valid, user current code: " + API._loginCode + ", " + API._loginAnonymousCode); callback === null || callback === void 0 ? void 0 : callback(API._loginCode, API._loginAnonymousCode); }, fail: function () { console.log("session expired"); loginPlatform(); }, }); } else { console.log('not mini game platform, login null'); callback === null || callback === void 0 ? void 0 : callback(null, null); } } }; /** * 小游戏平台登录功能。微信返回code,抖音返回code和anonymousCode。用于登录的凭证,需要把这个code传回你的服务器程序中去调用code2Session * @param callback (code, anonymousCode) 第一个参数为code,微信和抖音都支持;第二个参数为匿名设备ID,仅抖音支持,失败都返回null */ API.getUserInfo = function (callback) { //@ts-ignore tt.getUserInfo({ withCredentials: true, success: function (res) { API._userInfo = res; callback(API._userInfo); }, fail: function (err) { callback(err); } }); }; /** * 调用微信云函数。由于参数需要自定义,所以为any,需要自行解释。函数只完成通道和处理一场的作用 * @param callback 返回云函数调用结果。需要检查返回参数是否为空,失败的时候为空 * @param name 云函数的名字 * @param data 云函数的内容 */ API.callWechatCloudFunction = function (callback, name, data) { if (!isWechat()) { console.log('Not wechat platform, not support callWechatCloudFunction'); return; } this.login(function (code, anonymousCode) { if (!API._hasInitWechatCloudFunction) { //@ts-ignore wx.cloud.init(); API._hasInitWechatCloudFunction = true; } //@ts-ignore wx.cloud.callFunction({ name: name, data: data, success: function (res) { return callback === null || callback === void 0 ? void 0 : callback(res); }, fail: function (err) { console.log('wechat cloud function error:', err); callback === null || callback === void 0 ? void 0 : callback(null); } }); }); }; /** * 存储用户信息,数据量不能大。可以考虑用于分数排行榜。用户之间可共享排行数据。 * @param key * @param value */ API.setUserCloudStorage = function (key, value) { if (isWechat()) { // @ts-ignore wx.setUserCloudStorage({ KVDataList: [{ key: key, value: value }], success: function () { return console.log("set cloud storage success:" + key + ", value:" + value); }, fail: function (err) { return console.log('set cloud storage error:', err); } }); } if (isBytedance()) { // @ts-ignore tt.setUserCloudStorage({ KVDataList: [{ key: key, value: value, }], success: function () { return console.log("set cloud storage success:" + key + ", value:" + value); }, fail: function (err) { return console.log('set cloud storage error:', err); } }); } }; API._loginCode = null; API._loginAnonymousCode = null; API._hasInitWechatCloudFunction = false; API._userInfo = null; return API; }()); MiniGameSdk.API = API; /** * 抖音侧边栏专属接口 */ var BytedanceSidebar = /** @class */ (function () { function BytedanceSidebar() { } /** * 本游戏在抖音环境下启动监控,需要放在全局环境中,保证能第一时间启动。因为可能监听抖音失败(抖音小游戏官方的说明)! * @param onResult 包含一个boolean参数的函数 * @param target 上述函数的拥有者,如果是类的成员函数,需要传入this。普通或匿名函数忽略即可。 */ BytedanceSidebar.listenFromSidebar = function (onResult, target) { if (!isBytedance()) { onResult === null || onResult === void 0 ? void 0 : onResult.call(target, false); return; } // @ts-ignore tt.onShow(function (res) { console.log('onShow launch res:', res); if (res.scene === '021036') { onResult === null || onResult === void 0 ? void 0 : onResult.call(target, true); console.log('launch from sidebar'); } else { onResult === null || onResult === void 0 ? void 0 : onResult.call(target, false); console.log('NOT launch from douyin sidebar!'); } }); // @ts-ignore var options = tt.getLaunchOptionsSync(); if (options && options.scene === '021036') { onResult === null || onResult === void 0 ? void 0 : onResult.call(target, true); } }; /** * 检测抖音侧边栏是否存在 * @param onResult 包含一个boolean参数的函数 * @param target 上述函数的拥有者,如果是类的成员函数,需要传入this。普通或匿名函数忽略即可。 * @returns */ BytedanceSidebar.checkSideBar = function (onResult, target) { if (!isBytedance()) { onResult === null || onResult === void 0 ? void 0 : onResult.call(target, false); return; } //@ts-ignore tt.checkScene({ scene: "sidebar", success: function (res) { console.log("check scene success: ", res.isExist); onResult === null || onResult === void 0 ? void 0 : onResult.call(target, res.isExist); }, fail: function (res) { console.log("check scene fail:", res); onResult === null || onResult === void 0 ? void 0 : onResult.call(target, false); } }); }; /** * 跳转到抖音侧边栏 * @param onResult 包含一个boolean参数的函数 * @param target 上述函数的拥有者,如果是类的成员函数,需要传入this。普通或匿名函数忽略即可。 * @returns */ BytedanceSidebar.navigateToSidebar = function (onResult, target) { if (!isBytedance()) { console.log("not douyin platform!"); onResult === null || onResult === void 0 ? void 0 : onResult.call(target, false); return; } // @ts-ignore tt.navigateToScene({ scene: "sidebar", success: function () { console.log("navigate success"); onResult === null || onResult === void 0 ? void 0 : onResult.call(target, true); }, fail: function (res) { console.log("navigate failed reason:", res); onResult === null || onResult === void 0 ? void 0 : onResult.call(target, false); }, }); }; return BytedanceSidebar; }()); MiniGameSdk.BytedanceSidebar = BytedanceSidebar; })(MiniGameSdk = exports.MiniGameSdk || (exports.MiniGameSdk = {})); 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,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImFzc2V0c1xcU2NyaXB0XFxTZGtcXE1pbmlHYW1lU2RrLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBOztHQUVHO0FBQ0gsSUFBaUIsV0FBVyxDQXNtQzNCO0FBdG1DRCxXQUFpQixXQUFXO0lBWXhCLFNBQWdCLFFBQVE7UUFDcEIsWUFBWTtRQUNaLE9BQU8sTUFBTSxDQUFDLEVBQUUsS0FBSyxJQUFJLElBQUksTUFBTSxDQUFDLEVBQUUsS0FBSyxTQUFTLENBQUM7SUFDekQsQ0FBQztJQUhlLG9CQUFRLFdBR3ZCLENBQUE7SUFFRCxTQUFnQixXQUFXO1FBQ3ZCLFlBQVk7UUFDWixPQUFPLE1BQU0sQ0FBQyxFQUFFLEtBQUssSUFBSSxJQUFJLE1BQU0sQ0FBQyxFQUFFLEtBQUssU0FBUyxDQUFDO0lBQ3pELENBQUM7SUFIZSx1QkFBVyxjQUcxQixDQUFBO0lBR0QsU0FBUyxhQUFhO1FBQ2xCLElBQUksR0FBUSxDQUFDO1FBQ2IsSUFBSSxRQUFRLEVBQUUsRUFBRTtZQUNaLGFBQWE7WUFDYixHQUFHLEdBQUcsRUFBRSxDQUFDLGlCQUFpQixFQUFFLENBQUM7U0FDaEM7YUFBTSxJQUFJLFdBQVcsRUFBRSxFQUFFO1lBQ3RCLGFBQWE7WUFDYixHQUFHLEdBQUcsRUFBRSxDQUFDLGlCQUFpQixFQUFFLENBQUM7U0FDaEM7UUFFRCxJQUFJLElBQUksR0FBVSxFQUFFLEtBQUssRUFBRSxDQUFDLEVBQUUsTUFBTSxFQUFFLENBQUMsRUFBRSxDQUFDO1FBQzFDLElBQUksR0FBRyxFQUFFO1lBQ0wsSUFBSSxDQUFDLEtBQUssR0FBRyxHQUFHLENBQUMsV0FBVyxDQUFDO1lBQzdCLElBQUksQ0FBQyxNQUFNLEdBQUcsR0FBRyxDQUFDLFlBQVksQ0FBQztTQUNsQztRQUVELE9BQU8sSUFBSSxDQUFDO0lBQ2hCLENBQUM7SUFFRDs7T0FFRztJQUNIO1FBUUksd0JBQVksS0FBYTtZQUNyQixJQUFJLENBQUMsTUFBTSxHQUFHLEtB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c0IsQ0FBQyxDQUFDO2dCQUNwQyxRQUFRLGFBQVIsUUFBUSx1QkFBUixRQUFRLENBQUUsSUFBSSxDQUFDLE1BQU0sRUFBRSxLQUFLLEVBQUU7Z0JBQzlCLE9BQU87YUFDVjtZQUVELGFBQWE7WUFDYixFQUFFLENBQUMsZUFBZSxDQUFDO2dCQUNmLEtBQUssRUFBRSxTQUFTO2dCQUNoQixPQUFPLEVBQUU7b0JBQ0wsT0FBTyxDQUFDLEdBQUcsQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDO29CQUNoQyxRQUFRLGFBQVIsUUFBUSx1QkFBUixRQUFRLENBQUUsSUFBSSxDQUFDLE1BQU0sRUFBRSxJQUFJLEVBQUU7Z0JBQ2pDLENBQUM7Z0JBQ0QsSUFBSSxFQUFFLFVBQUMsR0FBUTtvQkFDWCxPQUFPLENBQUMsR0FBRyxDQUFDLHlCQUF5QixFQUFFLEdBQUcsQ0FBQyxDQUFDO29CQUM1QyxRQUFRLGFBQVIsUUFBUSx1QkFBUixRQUFRLENBQUUsSUFBSSxDQUFDLE1BQU0sRUFBRSxLQUFLLEVBQUU7Z0JBQ2xDLENBQUM7YUFDSixDQUFDLENBQUM7UUFDUCxDQUFDO1FBQ0wsdUJBQUM7SUFBRCxDQW5GQSxBQW1GQyxJQUFBO0lBbkZZLDRCQUFnQixtQkFtRjVCLENBQUE7QUFFTCxDQUFDLEVBdG1DZ0IsV0FBVyxHQUFYLG1CQUFXLEtBQVgsbUJBQVcsUUFzbUMzQiIsImZpbGUiOiIiLCJzb3VyY2VSb290IjoiLyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxyXG4gKiDlsI/muLjmiI/lubPlj7BTREvlt6XlhbflsIHoo4XvvIznm67liY3lj6rmlK/mjIHlvq7kv6Hlkozmipbpn7PlubPlj7BcclxuICovXHJcbmV4cG9ydCBuYW1lc3BhY2UgTWluaUdhbWVTZGsge1xyXG5cclxuICAgIGludGVyZmFjZSBJU2l6ZSB7XHJcbiAgICAgICAgd2lkdGg6IG51bWJlcjtcclxuICAgICAgICBoZWlnaHQ6IG51bWJlcjtcclxuICAgIH1cclxuXHJcbiAgICBleHBvcnQgaW50ZXJmYWNlIElQb3NpdGlvbiB7XHJcbiAgICAgICAgdG9wOiBudW1iZXI7XHJcbiAgICAgICAgbGVmdDogbnVtYmVyO1xyXG4gICAgfVxyXG5cclxuICAgIGV4cG9ydCBmdW5jdGlvbiBpc1dlY2hhdCgpOiBib29sZWFuIHtcclxuICAgICAgICAvL0B0cy1pZ25vcmVcclxuICAgICAgICByZXR1cm4gd2luZG93Lnd4ICE9PSBudWxsICYmIHdpbmRvdy53eCAhPT0gdW5kZWZpbmVkO1xyXG4gICAgfVxyXG5cclxuICAgIGV4cG9ydCBmdW5jdGlvbiBpc0J5dGVkYW5jZSgpOiBib29sZWFuIHtcclxuICAgICAgICAvL0B0cy1pZ25vcmVcclxuICAgICAgICByZXR1cm4gd2luZG93LnR0ICE9PSBudWxsICYmIHdpbmRvdy50dCAhPT0gdW5kZWZpbmVkO1xyXG4gICAgfVxyXG5cclxuXHJcbiAgICBmdW5jdGlvbiBnZXRTeXNXaW5TaXplKCk6IElTaXplIHtcclxuICAgICAgICBsZXQgc3lzOiBhbnk7XHJcbiAgICAgICAgaWYgKGlzV2VjaGF0KCkpIHtcclxuICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxyXG4gICAgICAgICAgICBzeXMgPSB3eC5nZXRTeXN0ZW1JbmZvU3luYygpO1xyXG4gICAgICAgIH0gZWxzZSBpZiAoaXNCeXRlZGFuY2UoKSkge1xyXG4gICAgICAgICAgICAvLyBAdHMtaWdub3JlXHJcbiAgICAgICAgICAgIHN5cyA9IHR0LmdldFN5c3RlbUluZm9TeW5jKCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBsZXQgc2l6ZTogSVNpemUgPSB7IHdpZHRoOiAwLCBoZWlnaHQ6IDAgfTtcclxuICAgICAgICBpZiAoc3lzKSB7XHJcbiAgICAgICAgICAgIHNpemUud2lkdGggPSBzeXMud2luZG93V2lkdGg7XHJcbiAgICAgICAgICAgIHNpemUuaGVpZ2h0ID0gc3lzLndpbmRvd0hlaWdodDtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiBzaXplO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICog5o+S5bGP5bm/5ZGK44CC5b6u5L+h5oqW6Z+z6YO95pSv5oyB77yBXHJcbiAgICAgKi9cclxuICAgIGNsYXNzIEFESW50ZXJzdGl0aWFsIHtcclxuICAgICAgICBwcml2YXRlIF9hZFVpZDogc3RyaW5nO1xyXG4gICAgICAgIHByaXZhdGUgX2ludGVyc3RpdGlhbDogYW55O1xyXG5cclxuICAgICAgICBnZXQgYWR1aWQoKSB7XHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9hZFVpZDtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGNvbnN0cnVjdG9yKGFkVWlkOiBzdHJpbmcpIHtcclxuICAgICAgICAgICAgdGhpcy5fYWRVaWQgPSBhZFVpZDtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHNob3coKSB7XHJcbiAgICAgICAgICAgIC8vIEB0cy1pZ25vcmVcclxuICAgICAgICAgICAgaWYgKGlzV2VjaGF0KCkgJiYgIXd4LmNyZWF0ZUludGVyc3RpdGlhbEFkKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zb2xlLndhcm4oJ3dlY2hhdCB1bnN1cHBvcnQgaW50ZXJzdGl0aWFsIEFEIScpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5faW50ZXJzdGl0aWFsID0gbnVsbDtcclxuICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxyXG4gICAgICAgICAgICBpZiAoaXNCeXRlZGFuY2UoKSAmJiAhdHQuY3JlYXRlSW50ZXJzdGl0aWFsQWQpIHtcclxuICAgICAgICAgICAgICAgIGNvbnNvbGUud2FybignYnl0ZWRhbmNlIHVuc3VwcG9ydCBpbnRlcnN0aXRpYWwgQUQhJyk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLl9pbnRlcnN0aXRpYWwgPSBudWxsO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICB9XHJcblxyXG5cclxuICAgICAgICAgICAgaWYgKHRoaXMuX2ludGVyc3RpdGlhbCkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5faW50ZXJzdGl0aWFsLmxvYWQoKTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIGlmIChpc1dlY2hhdCgpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2ludGVyc3RpdGlhbCA9IHd4LmNyZWF0ZUludGVyc3RpdGlhbEFkKHsgYWRVbml0SWQ6IHRoaXMuX2FkVWlkIH0pO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChpc0J5dGVkYW5jZSgpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2ludGVyc3RpdGlhbCA9IHR0LmNyZWF0ZUludGVyc3RpdGlhbEFkKHsgYWRVbml0SWQ6IHRoaXMuX2FkVWlkIH0pO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLl9pbnRlcnN0aXRpYWwgPSBudWxsO1xyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgIHRoaXMuX2ludGVyc3RpdGlhbD8ub25Mb2FkKCgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnbG9hZCBpbnRlcnN0aXRpYWwgYWQgc3VjY2VzcycpO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2ludGVyc3RpdGlhbC5zaG93KCkuY2F0Y2goKGVycjogYW55KSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdjYXRjaCBpbnRlcnN0aXRpYWwgYWQgZXJyb3I6JywgZXJyKTtcclxuICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICAgICAgICAgIHRoaXMuX2ludGVyc3RpdGlhbD8ub25FcnJvcigoZXJyOiBhbnkpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnaW50ZXJzdGl0aWFsIGFkIG9uIGVycm9yOicsIGVycik7XHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBkZXN0b3J5KCkge1xyXG4gICAgICAgICAgICB0aGlzLl9pbnRlcnN0aXRpYWw/LmRlc3Ryb3koKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgY2xhc3MgQURCYW5uZXIge1xyXG4gICAgICAgIHByaXZhdGUgX2FkVWlkOiBzdHJpbmc7XHJcbiAgICAgICAgcHJpdmF0ZSBfYmFubmVyOiBhbnk7XHJcblxyXG4gICAgICAgIGdldCBhZHVpZCgpIHtcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2FkVWlkO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICog5oqW6Z+z5ZKM5b6u5L+h6YO95pSv5oyBXHJcbiAgICAgICAgICog5qiq5bmF5bm/5ZGK44CC6aKE5Lyw5a695bqm6buY6K6k5Li6MzAw77yM6aKE5Lyw6auY5bqm5Li6MTQw44CC5aaC5p6c5L2g5LiN56Gu5a6a5bCx5oyJ6buY6K6k5YC85p2l44CCXHJcbiAgICAgICAgICogQHBhcmFtIGFkVWlkIOW5v+WRilVJRO+8jOWQjuerr+mFjee9rlxyXG4gICAgICAgICAqIEBwYXJhbSBpc1RvcCDmmK/lkKblnKjlsY/luZXpobbpg6jlsZXnpLrjgILlhoXpg6jkvJroh6rliqjlsYXkuK3orqHnrpfkvY3nva7jgIJcclxuICAgICAgICAgKiBAcGFyYW0gYmFubmVyV2lkdGgg5qiq5bmF5bm/5ZGK55qE6aKE5Lyw5a695bqm44CC6buY6K6kMzAwXHJcbiAgICAgICAgICogQHBhcmFtIGF1dG9TaG93IOW5v+WRiuWKoOi9veWujOaIkOWQjuaYr+WQpueri+WIu+aYvuekuu+8jOm7mOiupOS4uuS4jeaYvuekulxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIGNvbnN0cnVjdG9yKGFkVWlkOiBzdHJpbmcsIHBhcmFtOiBib29sZWFuIHwgSVBvc2l0aW9uLCBiYW5uZXJXaWR0aDogbnVtYmVyID0gMzAwLCBhdXRvU2hvdzogYm9vbGVhbiA9IGZhbHNlKSB7XHJcbiAgICAgICAgICAgIHRoaXMuX2FkVWlkID0gYWRVaWQ7XHJcbiAgICAgICAgICAgIHRoaXMuY3JlYXRlKGF1dG9TaG93LCBiYW5uZXJXaWR0aCwgcGFyYW0pOyAvLyDpu5jorqQzMDDmr5TovoPlkIjpgIJcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHByaXZhdGUgY3JlYXRlKGF1dG9TaG93OiBib29sZWFuLCBiYW5uZXJXaWR0aDogbnVtYmVyLCBwYXJhbTogYm9vbGVhbiB8IElQb3NpdGlvbikge1xyXG4gICAgICAgICAgICBpZiAoIWlzV2VjaGF0KCkgJiYgIWlzQnl0ZWRhbmNlKCkpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuX2Jhbm5lciA9IG51bGw7XHJcbiAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIHRoaXMuZGVzdHJveSgpO1xyXG5cclxuICAgICAgICAgICAgbGV0IHdpblNpemUgPSBnZXRTeXNXaW5TaXplKCk7XHJcblxyXG4gICAgICAgICAgICBsZXQgaGVpZ2h0ID0gYmFubmVyV2lkdGggKiAwLjQ7XHJcbiAgICAgICAgICAgIGxldCB0b3AgPSAwLCBsZWZ0ID0gMDtcclxuXHJcbiAgICAgICAgICAgIGlmICh0eXBlb2YgcGFyYW0gPT09IFwiYm9vbGVhblwiKSB7XHJcbiAgICAgICAgICAgICAgICBsZWZ0ID0gKHdpblNpemUud2lkdGggLSBiYW5uZXJXaWR0aCkgLyAyXHJcbiAgICAgICAgICAgICAgICB0b3AgPSBwYXJhbSA/IDUgOiAod2luU2l6ZS5oZWlnaHQgLSBoZWlnaHQpO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgbGVmdCA9IHBhcmFtLmxlZnQ7XHJcbiAgICAgICAgICAgICAgICB0b3AgPSBwYXJhbS50b3A7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGxldCBwYXJhbXMgPSB7XHJcbiAgICAgICAgICAgICAgICBhZFVuaXRJZDogdGhpcy5fYWRVaWQsXHJcbiAgICAgICAgICAgICAgICBhZEludGVydmFsczogMzAsLy8g6Ieq5Yqo5Yi35paw6aKR546H5LiN6IO95bCP5LqOMzDnp5JcclxuICAgICAgICAgICAgICAgIHN0eWxlOiB7IGxlZnQ6IGxlZnQsIHRvcDogdG9wLCB3aWR0aDogYmFubmVyV2lkdGggfVxyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBpZiAoaXNXZWNoYXQoKSkge1xyXG4gICAgICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxyXG4gICAgICAgICAgICAgICAgdGhpcy5fYmFubmVyID0gd3guY3JlYXRlQmFubmVyQWQocGFyYW1zKTtcclxuICAgICAgICAgICAgfSBlbHNlIGlmIChpc0J5dGVkYW5jZSgpKSB7XHJcbiAgICAgICAgICAgICAgICAvLyBAdHMtaWdub3JlXHJcbiAgICAgICAgICAgICAgICB0aGlzLl9iYW5uZXIgPSB0dC5jcmVhdGVCYW5uZXJBZChwYXJhbXMpO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5fYmFubmVyID0gbnVsbDtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgdGhpcy5fYmFubmVyPy5vbkVycm9yKChlcnI6IGFueSkgPT4ge1xyXG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ2FkIGJhbm5lciBlcnJvcjonLCBlcnIpO1xyXG4gICAgICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgICAgIHRoaXMuX2Jhbm5lcj8ub25Mb2FkKCgpID0+IHtcclxuICAgICAgICAgICAgICAgIGF1dG9TaG93ICYmIHRoaXMuX2Jhbm5lci5zaG93KCk7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgc2hvdygpIHtcclxuICAgICAgICAgICAgdGhpcy5fYmFubmVyPy5zaG93KCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBoaWRlKCkge1xyXG4gICAgICAgICAgICB0aGlzLl9iYW5uZXI/LmhpZGUoKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGRlc3Ryb3koKSB7XHJcbiAgICAgICAgICAgIHRoaXMuX2Jhbm5lcj8uZGVzdHJveSgpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBjbGFzcyBBREN1c3RvbSB7XHJcbiAgICAgICAgcHJpdmF0ZSBfYWRVaWQ6IHN0cmluZztcclxuICAgICAgICBwcml2YXRlIF9hZEN1c3RvbTogYW55O1xyXG5cclxuICAgICAgICBnZXQgYWR1aWQoKSB7XHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9hZFVpZDtcclxuICAgICAgICB9XHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICog55Sx5LqO5Y6f55Sf5qih5p2/5bm/5ZGK5Zyo5b6u5L+h5pyN5Yqh5ZCO56uv5Y+v5Lul5a6a5Yi25a695bqm5aSn5bCP77yM5Liq5pWw77yM57yp5pS+5q+U5L6L562J77yM5omA5Lul5L2N572u6LCD5pW06KaB5qC55o2u6K6+572u55qE5a695bqm5p2l5a6a44CC5oqW6Z+z5LiN5pSv5oyB77yBXHJcbiAgICAgICAgICogQHBhcmFtIGFkVWlkIOW5v+WRilVJRO+8jOWQjuerr+mFjee9rlxyXG4gICAgICAgICAqIEBwYXJhbSB0b3Ag5LuO5bem5LiK6KeS5byA5aeL77yM6Led56a75bGP5bmV6aG26YOo55qE6Led56a744CC5rOo5oSP77ya6L+Z5Liq5pWw5o2u5Li66K6+5aSH5bGP5bmV5a695bqmd2lkdGjjgILlpoLmnpzpnIDopoHojrflj5blsY/luZXnmoTlg4/ntKDvvIzpnIDopoHkuZjku6Xorr7lpIflg4/ntKDmr5RQaXhlbC1SYXRpb++8jOS+i+WmgmlQaG9uZSAxMyBQcm/nmoRQaXhlbC1SYXRpb+S4ujPvvIzlg4/ntKDkuLpXaWR0aCoz44CCXHJcbiAgICAgICAgICogQHBhcmFtIGxlZnQg5LuO5bem5LiK6KeS5byA5aeL77yM6Led56a75bGP5bmV5pyA5bem6L6555qE6Led56a744CC5rOo5oSP77ya6L+Z5Liq5pWw5o2u5Li66K6+5aSH5bGP5bmV5a695bqmd2lkdGjjgILlpoLmnpzpnIDopoHojrflj5blsY/luZXnmoTlg4/ntKDvvIzpnIDopoHkuZjku6Xorr7lpIflg4/ntKDmr5RQaXhlbC1SYXRpb++8jOS+i+WmgmlQaG9uZSAxMyBQcm/nmoRQaXhlbC1SYXRpb+S4ujPvvIzlg4/ntKDkuLpXaWR0aCoz44CCXHJcbiAgICAgICAgICogQHBhcmFtIHNjYWxlIOWOn+eUn+aooeadv+W5v+WRiueahOWwuuWvuO+8jOm7mOiupOS4ujHvvIzljbMxMDAl44CC5q2k5YC85Zyo5b6u5L+h5pyN5Yqh5ZCO56uv5bm/5ZGK5Lit6I635b6X77yM6buY6K6k5Li6MTAwJe+8jOebruWJjeaciTEwMCXvvIw5MCXvvIw4MCXkuInnp43vvIzkuIDoiKzmg4XlhrXkuI3nlKjkv67mlLnjgILoi6XmnInkv67mlLnvvIzorrDlvpfkvKDlhaXlgLzvvIzkvovlpoI5MCXlsLHkvKDlhaUwLjnjgIJcclxuICAgICAgICAgKi9cclxuICAgICAgICBjb25zdHJ1Y3RvcihhZFVpZDogc3RyaW5nLCB0b3A6IG51bWJlciA9IDAsIGxlZnQ6IG51bWJlciA9IDAsIHNjYWxlOiBudW1iZXIgPSAxLjApIHtcclxuICAgICAgICAgICAgdGhpcy5fYWRVaWQgPSBhZFVpZDtcclxuICAgICAgICAgICAgdGhpcy5jcmVhdGVDdXN0b21BZCh0b3AsIGxlZnQsIHNjYWxlKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHByaXZhdGUgY3JlYXRlQ3VzdG9tQWQodG9wOiBudW1iZXIsIGxlZnQ6IG51bWJlciwgc2NhbGU6IG51bWJlcikge1xyXG4gICAgICAgICAgICBpZiAoIWlzV2VjaGF0KCkpIHsgLy8gb25seSB3ZWNoYXQgc3VwcG9ydCBjdXN0b20gYWRcclxuICAgICAgICAgICAgICAgIHRoaXMuX2FkQ3VzdG9tID0gbnVsbDtcclxuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdPbmx5IHdlY2hhdCBzdXBwb3J0IEN1c3RvbSBBZCcpO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICB0aGlzLmRlc3Ryb3koKTtcclxuICAgICAgICAgICAgLy8g5Y6f55Sf5qih5p2/NeS4quW6lOeUqOWuveW6puS4ujM3Ne+8jOiLpeiuvue9ruS6hue8qeaUvuavlOS+i++8jOWImeWuveW6puS5n+mcgOimgeiuvue9rlxyXG4gICAgICAgICAgICAvLyBsZXQgd2lkdGggPSAzNzUgKiB0aGlzLl9zY2FsZTtcclxuICAgICAgICAgICAgLy8gbGV0IG5ld0xlZnQgPSAoc3lzLndpbmRvd1dpZHRoIC0gd2lkdGgpIC8gMjtcclxuICAgICAgICAgICAgLy8gbGV0IG5ld1RvcCA9IHN5cy53aW5kb3dIZWlnaHQgLyAyOyAvLyAxMjDmmK/pooTkvLDpq5jluqZcclxuXHJcbiAgICAgICAgICAgIC8vIEB0cy1pZ25vcmVcclxuICAgICAgICAgICAgdGhpcy5fYWRDdXN0b20gPSB3eC5jcmVhdGVDdXN0b21BZCh7XHJcbiAgICAgICAgICAgICAgICBhZFVuaXRJZDogdGhpcy5fYWRVaWQsXHJcbiAgICAgICAgICAgICAgICBzdHlsZTogeyBsZWZ0OiBsZWZ0LCB0b3A6IHRvcCwgZml4ZWQ6IHRydWUgfVxyXG4gICAgICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgICAgIHRoaXMuX2FkQ3VzdG9tPy5vbkVycm9yKChlcnI6IGFueSkgPT4ge1xyXG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ2FkIGN1c3RvbSBlcnJvcjonLCBlcnIpO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgc2hvdygpIHtcclxuICAgICAgICAgICAgdGhpcy5fYWRDdXN0b20/LnNob3coKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGhpZGUoKSB7XHJcbiAgICAgICAgICAgIHRoaXMuX2FkQ3VzdG9tPy5oaWRlKCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBkZXN0cm95KCkge1xyXG4gICAgICAgICAgICB0aGlzLl9hZEN1c3RvbT8uZGVzdHJveSgpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiDop4bpopHlub/lkYrnlKjmiLfngrnlh7vooYzkuLrnu5PmnpxcclxuICAgICAqL1xyXG4gICAgZXhwb3J0IGVudW0gRUFkVmlkZW9SZXN1bHQge1xyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIOeUqOaIt+eci+WujOS6huW5v+WRiu+8jOa4uOaIj+WPr+WPkeaUvuWlluWKseOAglxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIEFDQ0VQVCxcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICog55So5oi35Lit6YCU5YWz6Zet5LqG5bm/5ZGK77yM5Y2z5pyq55yL5a6M54q25oCB44CC5LiN5Y+v5Y+R5pS+5aWW5Yqx44CCXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgUkVKRUNULFxyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiDlub/lkYrnu4Tku7blhoXpg6jlj5HnlJ/kuobplJnor6/jgILkuI3lj6/lj5HmlL7lpZblirHjgIJcclxuICAgICAgICAgKi9cclxuICAgICAgICBFUlJPUixcclxuICAgIH1cclxuXHJcbiAgICBjbGFzcyBBRFZpZGVvIHtcclxuICAgICAgICBwcml2YXRlIF9hZFVpZDogc3RyaW5nO1xyXG4gICAgICAgIHByaXZhdGUgX2FkVmlkZW86IGFueSA9IG51bGw7XHJcblxyXG4gICAgICAgIGdldCBhZHVpZCgpIHtcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2FkVWlkO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgY29uc3RydWN0b3IoYWRVaWQ6IHN0cmluZykge1xyXG4gICAgICAgICAgICB0aGlzLl9hZFVpZCA9IGFkVWlkO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICog55Sx5LqO5b6u5L+h5ZKM5oqW6Z+z6KeG6aKR5bm/5ZGK5py65Yi25LiN5ZCM77yM5b6u5L+h5Y+v5Lul55yL55qE6KeG6aKR5bm/5ZGK5Liq5pWw5Y+q5pyJMOWSjDHkuKrvvIzmipbpn7PlubPlj7DliJnlj6/ku6XnnIswfm1heFZpZGVvQ291bnRcclxuICAgICAgICAgKiBAcGFyYW0gb25SZXN1bHQg5Lik5Liq5Y+C5pWw77ya56ys5LiA5LiqcmVz5pivRUFkVmlkZW9SZXN1bHTlrprkuYnvvIznrKzkuoxjb3VudOaYr+eUqOaIt+eci+S6huWkmuWwkeS4quinhumikeW5v+WRiuOAglxyXG4gICAgICAgICAqIEBwYXJhbSB0YXJnZXQgb25SZXN1bHTnmoTmi6XmnInogIVcclxuICAgICAgICAgKiBAcGFyYW0gbWF4VmlkZW9Db3VudCDlj6/ku6Xov57nu63nnIvmnIDlpKfop4bpopHkuKrmlbDvvIzlj6/mnIDlpKfljJbllYbkuJrmlYjnjofjgILpu5jorqTkuLoz5Liq44CCXHJcbiAgICAgICAgICogQHJldHVybnMgXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgc2hvdyhvblJlc3VsdDogKHJlczogRUFkVmlkZW9SZXN1bHQsIGNvdW50OiBudW1iZXIpID0+IHZvaWQsIHRhcmdldD86IGFueSwgbWF4VmlkZW9Db3VudDogbnVtYmVyID0gMyk6IHZvaWQge1xyXG4gICAgICAgICAgICBsZXQgY2FsbGJhY2sgPSAoc3RhdGU6IEVBZFZpZGVvUmVzdWx0LCBjb3VudDogbnVtYmVyKSA9PiB7XHJcbiAgICAgICAgICAgICAgICBvblJlc3VsdD8uY2FsbCh0YXJnZXQsIHN0YXRlLCBjb3VudCk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGlmICghaXNXZWNoYXQoKSAmJiAhaXNCeXRlZGFuY2UoKSkge1xyXG4gICAgICAgICAgICAgICAgY2FsbGJhY2soRUFkVmlkZW9SZXN1bHQuQUNDRVBULCAxKTtcclxuICAgICAgICAgICAgICAgIHRoaXMuX2FkVmlkZW8gPSBudWxsO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBsZXQgb25BZFZpZGVvQ2xvc2VkID0gKHJlczogYW55KSA9PiB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLl9hZFZpZGVvPy5vZmZDbG9zZShvbkFkVmlkZW9DbG9zZWQpO1xyXG4gICAgICAgICAgICAgICAgaWYgKGlzV2VjaGF0KCkpIHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAocmVzICYmIHJlcy5pc0VuZGVkIHx8IHJlcyA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKEVBZFZpZGVvUmVzdWx0LkFDQ0VQVCwgMSk7XHJcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2soRUFkVmlkZW9SZXN1bHQuUkVKRUNULCAwKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGlzQnl0ZWRhbmNlKCkpIHtcclxuICAgICAgICAgICAgICAgICAgICBsZXQgcmVzQ29udmVydGVkID0gcmVzIGFzIHsgaXNFbmRlZDogYm9vbGVhbiwgY291bnQ6IG51bWJlciB9O1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChyZXNDb252ZXJ0ZWQgJiYgcmVzQ29udmVydGVkLmNvdW50ID4gMCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjayhFQWRWaWRlb1Jlc3VsdC5BQ0NFUFQsIHJlc0NvbnZlcnRlZC5jb3VudCk7XHJcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2soRUFkVmlkZW9SZXN1bHQuUkVKRUNULCAwKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIHRoaXMuX2FkVmlkZW8/Lm9mZkNsb3NlKG9uQWRWaWRlb0Nsb3NlZCk7XHJcblxyXG4gICAgICAgICAgICBpZiAoaXNXZWNoYXQoKSkge1xyXG4gICAgICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxyXG4gICAgICAgICAgICAgICAgdGhpcy5fYWRWaWRlbyA9IHd4LmNyZWF0ZVJld2FyZGVkVmlkZW9BZCh7XHJcbiAgICAgICAgICAgICAgICAgICAgYWRVbml0SWQ6IHRoaXMuX2FkVWlkXHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgfSBlbHNlIGlmIChpc0J5dGVkYW5jZSgpKSB7XHJcbiAgICAgICAgICAgICAgICAvLyBAdHMtaWdub3JlXHJcbiAgICAgICAgICAgICAgICB0aGlzLl9hZFZpZGVvID0gdHQuY3JlYXRlUmV3YXJkZWRWaWRlb0FkKHtcclxuICAgICAgICAgICAgICAgICAgICBhZFVuaXRJZDogdGhpcy5fYWRVaWQsXHJcbiAgICAgICAgICAgICAgICAgICAgbXVsdGl0b246IHRydWUsXHJcbiAgICAgICAgICAgICAgICAgICAgbXVsdGl0b25SZXdhcmRNc2c6IFsn5aSaMeasoeWlluWKsScsICflho3lpJrkuIDmrKHlpZblirEnLCAn5YaN5aSa5LiA5qyh5aWW5YqxJ10sXHJcbiAgICAgICAgICAgICAgICAgICAgbXVsdGl0b25SZXdhcmRUaW1lczogbWF4VmlkZW9Db3VudCxcclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5fYWRWaWRlbyA9IG51bGw7XHJcbiAgICAgICAgICAgIH1cclxuXHJcblxyXG4gICAgICAgICAgICB0aGlzLl9hZFZpZGVvPy5vbkxvYWQoKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ0FkIGxvYWQgc3VjY2VzcycpO1xyXG4gICAgICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgICAgIHRoaXMuX2FkVmlkZW8/Lm9uRXJyb3IoKGVycjogeyBlcnJNc2c6IHN0cmluZywgZXJyQ29kZTogbnVtYmVyIH0pID0+IHtcclxuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdBZCB2aWRlbyBlcnJvcjonLCBlcnIpO1xyXG4gICAgICAgICAgICAgICAgY2FsbGJhY2soRUFkVmlkZW9SZXN1bHQuRVJST1IsIDApO1xyXG4gICAgICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgICAgIHRoaXMuX2FkVmlkZW8/Lm9uQ2xvc2Uob25BZFZpZGVvQ2xvc2VkKTtcclxuXHJcbiAgICAgICAgICAgIHRoaXMuX2FkVmlkZW8/LnNob3coKS5jYXRjaCgoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLl9hZFZpZGVvPy5sb2FkKCkudGhlbigoKSA9PlxyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2FkVmlkZW8/LnNob3coKSkuY2F0Y2goKGVycjogeyBlcnJNc2c6IHN0cmluZywgZXJyQ29kZTogbnVtYmVyIH0pID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ0NhdGNoIHZpZGVvIGFkIGVycm9yOicsIGVycik7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKEVBZFZpZGVvUmVzdWx0LkVSUk9SLCAwKTtcclxuICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBkZXN0b3J5KCkge1xyXG4gICAgICAgICAgICB0aGlzLl9hZFZpZGVvPy5kZXN0b3J5KCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGV4cG9ydCBlbnVtIEVBZEJhbm5lckxvY2F0aW9uIHtcclxuICAgICAgICAvKipcclxuICAgICAgICAgKiDlsY/luZXpobbpg6hcclxuICAgICAgICAgKi9cclxuICAgICAgICBUT1AsXHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIOWxj+W5leW6lemDqFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIEJPVFRPTSxcclxuICAgIH1cclxuXHJcbiAgICBleHBvcnQgY2xhc3MgQWR2ZXJ0TWFuYWdlciB7XHJcblxyXG4gICAgICAgIHByaXZhdGUgc3RhdGljIF9pbnN0YW5jZTogQWR2ZXJ0TWFuYWdlcjtcclxuXHJcbiAgICAgICAgc3RhdGljIGdldCBpbnN0YW5jZSgpOiBBZHZlcnRNYW5hZ2VyIHtcclxuICAgICAgICAgICAgaWYgKCFBZHZlcnRNYW5hZ2VyLl9pbnN0YW5jZSkge1xyXG4gICAgICAgICAgICAgICAgQWR2ZXJ0TWFuYWdlci5faW5zdGFuY2UgPSBuZXcgQWR2ZXJ0TWFuYWdlcigpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJldHVybiBBZHZlcnRNYW5hZ2VyLl9pbnN0YW5jZTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHByaXZhdGUgX3ZpZGVvOiBBRFZpZGVvO1xyXG4gICAgICAgIHByaXZhdGUgX2ludGVyc3RpdGlhbDogQURJbnRlcnN0aXRpYWw7XHJcbiAgICAgICAgcHJpdmF0ZSBfYmFubmVyOiBBREJhbm5lcjtcclxuICAgICAgICBwcml2YXRlIF9jdXN0b21zOiBSZWNvcmQ8c3RyaW5nLCBBREN1c3RvbT4gPSB7fTtcclxuXHJcbiAgICAgICAgcHJpdmF0ZSBjb25zdHJ1Y3RvcigpIHtcclxuXHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiDpooTliqDovb3mqKrluYXlub/lkYrvvIzkuI3kvJrmmL7npLrjgILlj6rmnInkvaDlnKjosIPnlKhzaG93QmFubmVy5pe25omN5Lya5pi+56S644CCXHJcbiAgICAgICAgICog5Y+v6YeN5aSN6LCD55So77yM5L2G5piv5Lya6ZSA5q+B5LiK5LiA5qyh55qE5a6e5L6L44CC5LiA6Iis5oOF5Ya177yM5YWo5bGA5pyJ5LiA5Liq5bCx6KGM5LqG77yM5aSq5aSa5Y2g55So5YaF5a2Y77yM6ICM5LiU5rKh5b+F6KaB44CCXHJcbiAgICAgICAgICogQHBhcmFtIGFkVWlkIOW5v+WRilVJRFxyXG4gICAgICAgICAqIEBwYXJhbSBsb2NhdGlvbiDkvY3nva7mnInkuKTnp43mg4XlhrXvvJox44CB5Y+v5Lul5Lyg5YWl5p6a5Li+5YC877yM6buY6K6k5LiK5pa5OyAy44CB5Y+v5Lul6Ieq5a6a5LmJ5L2N572u5Lyg5YWlSVBvc2l0aW9u77yM5rOo5oSPSVBvc2l0aW9u5Lit55qEdG9w5ZKMbGVmdOi3n+W5s+WPsOeahHRvcCxsZWZ05piv5LiA6Ie077yI5rKh5pyJ5LmY5Lul6K6+5aSH5YOP57Sg5q+UcmF0aW/vvInvvIzpnIDopoHlvIDlj5HogIXoh6rlt7HosIPor5XkvY3nva5cclxuICAgICAgICAgKiBAcGFyYW0gc2NhbGUg6buY6K6k5Li66Lef5bGP5bmV5LiA5qC355qE5a695bqm77yM5Y+v5Lul6YCa6L+H6K6+572u57yp5pS+5q+U5L6L5p2l6LCD5pW05aSn5bCP44CC5b2T54S277yM5bmz5Y+w5pyJ6KeE5a6a5pyA5aSn5oiW5pyA5bCP5a695bqm77yM5Ye95pWw5YaF6YOo5Lya6Ieq5Yqo6K6h566X44CCXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgcHVibGljIGxvYWRCYW5uZXIoYWRVaWQ6IHN0cmluZywgbG9jYXRpb246IEVBZEJhbm5lckxvY2F0aW9uIHwgSVBvc2l0aW9uID0gRUFkQmFubmVyTG9jYXRpb24uVE9QLCBzY2FsZTogbnVtYmVyID0gMS4wKSB7XHJcbiAgICAgICAgICAgIHRoaXMuX2Jhbm5lcj8uZGVzdHJveSgpO1xyXG4gICAgICAgICAgICBsZXQgc2l6ZTogSVNpemUgPSBnZXRTeXNXaW5TaXplKCk7XHJcbiAgICAgICAgICAgIC8vIOW9kyBzdHlsZS53aWR0aCDlsI/kuo4gMzAwIOaXtu+8jOS8muWPluS9nCAzMDDjgIIg5b2TIHN0eWxlLndpZHRoIOWkp+S6juWxj+W5leWuveW6puaXtu+8jOS8muWPluS9nOWxj+W5leWuveW6puOAglxyXG4gICAgICAgICAgICBsZXQgd2lkdGggPSBzaXplLndpZHRoICogc2NhbGU7XHJcbiAgICAgICAgICAgIHdpZHRoID0gd2lkdGggPCAzMDAgPyAzMDAgOiB3aWR0aDsgLy8g5pyA5bCP5YC855+r5q2jXHJcbiAgICAgICAgICAgIHdpZHRoID0gd2lkdGggPiBzaXplLndpZHRoID8gc2l6ZS53aWR0aCA6IHdpZHRoOyAvL+acgOWkp+WAvOefq+ato1xyXG4gICAgICAgICAgICB0aGlzLl9iYW5uZXIgPSB0eXBlb2YgbG9jYXRpb24gPT09ICdudW1iZXInID8gbmV3IEFEQmFubmVyKGFkVWlkLCBsb2NhdGlvbiA9PT0gRUFkQmFubmVyTG9jYXRpb24uVE9QLCB3aWR0aCwgZmFsc2UpIDogbmV3IEFEQmFubmVyKGFkVWlkLCBsb2NhdGlvbiwgd2lkdGgsIGZhbHNlKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIOaYvuekuuaoquW5heW5v+WRilxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHB1YmxpYyBzaG93QmFubmVyKCkge1xyXG4gICAgICAgICAgICBpZiAodGhpcy5fYmFubmVyKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLl9iYW5uZXIuc2hvdygpO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgY29uc29sZS53YXJuKCdNaW5pR2FtZVNESzogYmFubmVyIGlzIG51bGwsIHlvdSBtdXN0IGNhbGwgbG9hZEJhbm5lciguLi4pIGZpcnN0IScpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiDpmpDol4/mqKrluYXlub/lkYpcclxuICAgICAgICAgKi9cclxuICAgICAgICBwdWJsaWMgaGlkZUJhbm5lcigpIHtcclxuICAgICAgICAgICAgdGhpcy5fYmFubmVyPy5oaWRlKCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiDlvLnlh7rmj5LlsY/lub/lkYpcclxuICAgICAgICAgKiBAcGFyYW0gYWRVaWQg5bm/5ZGK5Y2V5YWDaWRcclxuICAgICAgICAgKi9cclxuICAgICAgICBwdWJsaWMgc2hvd0ludGVyc3RpdGlhbChhZFVpZDogc3RyaW5nKSB7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLl9pbnRlcnN0aXRpYWwgJiYgdGhpcy5faW50ZXJzdGl0aWFsLmFkdWlkID09PSBhZFVpZCkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5faW50ZXJzdGl0aWFsLnNob3coKTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuX2ludGVyc3RpdGlhbD8uZGVzdG9yeSgpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5faW50ZXJzdGl0aWFsID0gbmV3IEFESW50ZXJzdGl0aWFsKGFkVWlkKTtcclxuICAgICAgICAgICAgICAgIHRoaXMuX2ludGVyc3RpdGlhbC5zaG93KCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIOWKoOi9veWOn+eUn+aooeadv+W5v+WRiu+8jOS4jeS8muaYvuekuuOAguWPquacieS9oOWcqOiwg+eUqHNob3dDdXN0b23ml7bmiY3kvJrmmL7npLrjgIJcclxuICAgICAgICAgKiDnlLHkuo7ljp/nlJ/mqKHmnb/lub/lkYrlnKjlvq7kv6HmnI3liqHlkI7nq6/lj6/ku6XlrprliLblrr3luqblpKflsI/vvIzkuKrmlbDvvIznvKnmlL7mr5TkvovnrYnvvIzmiYDku6XkvY3nva7osIPmlbTopoHmoLnmja7orr7nva7nmoTlrr3luqbmnaXlrprjgILmipbpn7PkuI3mlK/mjIHmnKzlh73mlbDvvIzkvJrosIPnlKjml6DmlYjvvIFcclxuICAgICAgICAgKiBAcGFyYW0gYWRVaWQg5bm/5ZGKSURcclxuICAgICAgICAgKiBAcGFyYW0gbG9jYXRpb24g5L2N572u5pyJ5Lik56eN5oOF5Ya177yaMeOAgeWPr+S7peS8oOWFpeaemuS4vuWAvO+8jOm7mOiupOS4iuaWuTsgMuOAgeWPr+S7peiHquWumuS5ieS9jee9ruS8oOWFpUlQb3NpdGlvbu+8jOazqOaEj0lQb3NpdGlvbuS4reeahHRvcOWSjGxlZnTot5/lubPlj7DnmoR0b3AsbGVmdOaYr+S4gOiHtO+8iOayoeacieS5mOS7peiuvuWkh+WDj+e0oOavlHJhdGlv77yJ77yM6ZyA6KaB5byA5Y+R6ICF6Ieq5bex6LCD6K+V5L2N572uXHJcbiAgICAgICAgICogQHBhcmFtIHNjYWxlIOe8qeaUvuavlOS+i++8jOm7mOiupOaYrzHvvIzljbPkuI3nvKnmlL7jgILov5nkuKrnvKnmlL7lubbkuI3mmK/oh6rlt7HloavvvIzogIzmmK/moLnmja7lvq7kv6FNUOWQjuWPsOS9oOmFjee9rueahOWOn+eUn+aooeadv+W5v+WRiueahOe8qeaUvuavlOS+i+Whq++8jOebruWJjeaciTEwMCXvvIw5MCXvvIw4MCXkuInnp43vvIzkuIDoiKzmg4XlhrXkuI3nlKjkv67mlLnjgILoi6XmnInlkI7lj7Dkv67mlLnvvIzorrDlvpfkvKDlhaXlgLzvvIzkvovlpoI5MCXlsLHkvKDlhaUwLjnjgIJcclxuICAgICAgICAgKi9cclxuICAgICAgICBwdWJsaWMgbG9hZEN1c3RvbShhZFVpZDogc3RyaW5nLCBsb2NhdGlvbjogSVBvc2l0aW9uID0geyB0b3A6IDAsIGxlZnQ6IDAgfSwgc2NhbGU6IG51bWJlciA9IDEpIHtcclxuICAgICAgICAgICAgLy8gdGhpcy5fY3VzdG9tPy5kZXN0cm95KCk7XHJcbiAgICAgICAgICAgIC8vIHRoaXMuX2N1c3RvbSA9IG5ldyBBREN1c3RvbShhZFVpZCwgbG9jYXRpb24udG9wLCBsb2NhdGlvbi5sZWZ0LCBzY2FsZSk7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLl9jdXN0b21zW2FkVWlkXSkge1xyXG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coYCR7YWRVaWR9IGhhcyBiZWVuIGxvYWRlZC5gKTtcclxuICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgdGhpcy5fY3VzdG9tc1thZFVpZF0gPSBuZXcgQURDdXN0b20oYWRVaWQsIGxvY2F0aW9uLnRvcCwgbG9jYXRpb24ubGVmdCwgc2NhbGUpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICog5pi+56S66Ieq5a6a5LmJ5bm/5ZGK44CCXHJcbiAgICAgICAgICogQHBhcmFtIGFkVWlkIOW5v+WRiueahOWUr+S4gOagh+ivhuespuOAguS9v+eUqOatpOagh+ivhuespuadpeafpeaJvuWSjOaYvuekuueJueWumueahOiHquWumuS5ieW5v+WRiuOAglxyXG4gICAgICAgICAqIFxyXG4gICAgICAgICAqIOatpOaWueazleWwneivleagueaNruaPkOS+m+eahGFkVWlk5pi+56S65LiA5Liq6Ieq5a6a5LmJ5bm/5ZGK44CC5aaC5p6c57uZ5a6a55qEYWRVaWTlr7nlupTnmoToh6rlrprkuYnlub/lkYrlt7LliqDovb3vvIxcclxuICAgICAgICAgKiDliJnosIPnlKjor6Xlub/lkYrnmoTmmL7npLrmlrnms5XjgILlpoLmnpzlub/lkYrmnKrliqDovb3vvIzliJnlnKjmjqfliLblj7DovpPlh7rorablkYrkv6Hmga/jgIJcclxuICAgICAgICAgKi9cclxuICAgICAgICBwdWJsaWMgc2hvd0N1c3RvbShhZFVpZDogc3RyaW5nKSB7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLl9jdXN0b21zW2FkVWlkXSkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5fY3VzdG9tc1thZFVpZF0uc2hvdygpO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgY29uc29sZS53YXJuKGBZb3UgaGF2ZSBub3QgbG9hZCAke2FkVWlkfSBvZiBDdXN0b20gQUQsIGNhbiBub3Qgc2hvdyFgKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICog6ZqQ6JeP5oyH5a6a55qE6Ieq5a6a5LmJ5bm/5ZGK5Y2V5YWDXHJcbiAgICAgICAgICogXHJcbiAgICAgICAgICog5q2k5pa55rOV55So5LqO6ZqQ6JeP6YCa6L+H5bm/5ZGK5Y2V5YWD5qCH6K+G56ym77yIYWRVaWTvvInmjIflrprnmoToh6rlrprkuYnlub/lkYrjgILlpoLmnpzmjIflrprnmoTlub/lkYrljZXlhYPlt7LliqDovb3lubbmmL7npLrvvIxcclxuICAgICAgICAgKiDliJnlsIblhbbpmpDol4/vvJvlpoLmnpzlub/lkYrljZXlhYPmnKrliqDovb3vvIzliJnlnKjmjqfliLblj7DovpPlh7rorablkYrkv6Hmga/jgIJcclxuICAgICAgICAgKiBcclxuICAgICAgICAgKiBAcGFyYW0gYWRVaWQg5bm/5ZGK5Y2V5YWD5qCH6K+G56ym77yM55So5LqO5ZSv5LiA5qCH6K+G5LiA5Liq6Ieq5a6a5LmJ5bm/5ZGK5Y2V5YWD44CCXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgcHVibGljIGhpZGVDdXN0b20oYWRVaWQ6IHN0cmluZykge1xyXG4gICAgICAgICAgICBpZiAodGhpcy5fY3VzdG9tc1thZFVpZF0pIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuX2N1c3RvbXNbYWRVaWRdLmhpZGUoKTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIGNvbnNvbGUud2FybihgWW91IGhhdmUgbm90IGxvYWQgJHthZFVpZH0gb2YgQ3VzdG9tIEFELCBjYW4gbm90IGhpZGUhYCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIOeUseS6juW+ruS/oeWSjOaKlumfs+inhumikeW5v+WRiuacuuWItuS4jeWQjO+8jOW+ruS/oeWPr+S7peeci+eahOinhumikeW5v+WRiuS4quaVsOWPquaciTDlkowx5Liq77yM5oqW6Z+z5bmz5Y+w5YiZ5Y+v5Lul55yLMH5tYXhWaWRlb0NvdW50XHJcbiAgICAgICAgICogQHBhcmFtIGFkVWlkIOW5v+WRiklE44CC5aaC5p6c5LiO5LiK5LiA5qyhVUlE5LiN5ZCM77yM5YiZ5YaF6YOo5Lya6YeN5paw5Yib5bu65a6e5L6L44CC5byA5Y+R6ICF5a6M5YWo5LiN55So5YWz5b+D6L+Z5Liq57uG6IqC44CCXHJcbiAgICAgICAgICogQHBhcmFtIG9uVmlkZW9SZXN1bHQg5Lik5Liq5Y+C5pWw77ya56ys5LiA5LiqcmVz5pivRUFkVmlkZW9SZXN1bHTlrprkuYnvvIznrKzkuoxjb3VudOaYr+eUqOaIt+eci+S6huWkmuWwkeS4quinhumikeW5v+WRiuOAgiBcclxuICAgICAgICAgKiBAcGFyYW0gdGFyZ2V0IG9uVmlkZW9SZXN1bHTnmoTmi6XmnInogIVcclxuICAgICAgICAgKiBAcGFyYW0gbWF4VmlkZW9Db3VudCDmnIDlpKfop4bpopHkuKrmlbDjgILpu5jorqTmmK8z77yM5LuF5a+55oqW6Z+z5bmz5Y+w55Sf5pWI44CC5b6u5L+h5bmz5Y+w55yL5a6M6KeG6aKRY291bnTnmoTnu5PmnpzmsLjov5zmmK8x5oiWMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHB1YmxpYyBzaG93VmlkZW8oYWRVaWQ6IHN0cmluZywgb25WaWRlb1Jlc3VsdDogKHJlczogRUFkVmlkZW9SZXN1bHQsIGNvdW50OiBudW1iZXIpID0+IHZvaWQsIHRhcmdldD86IGFueSwgbWF4VmlkZW9Db3VudDogbnVtYmVyID0gMykge1xyXG4gICAgICAgICAgICBpZiAodGhpcy5fdmlkZW8gJiYgdGhpcy5fdmlkZW8uYWR1aWQgPT09IGFkVWlkKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLl92aWRlby5zaG93KG9uVmlkZW9SZXN1bHQsIHRhcmdldCwgbWF4VmlkZW9Db3VudCk7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLl92aWRlbz8uZGVzdG9yeSgpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5fdmlkZW8gPSBuZXcgQURWaWRlbyhhZFVpZCk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLl92aWRlby5zaG93KG9uVmlkZW9SZXN1bHQsIHRhcmdldCwgbWF4VmlkZW9Db3VudCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIOmUgOavgeWGhemDqOaJgOacieWunuS+i++8jOa4heepuuWGheWtmFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHB1YmxpYyBkZXN0cm95QWxsKCkge1xyXG4gICAgICAgICAgICB0aGlzLl9iYW5uZXI/LmRlc3Ryb3koKTtcclxuICAgICAgICAgICAgdGhpcy5fYmFubmVyID0gbnVsbDtcclxuXHJcbiAgICAgICAgICAgIHRoaXMuX2ludGVyc3RpdGlhbD8uZGVzdG9yeSgpO1xyXG4gICAgICAgICAgICB0aGlzLl9pbnRlcnN0aXRpYWwgPSBudWxsO1xyXG5cclxuICAgICAgICAgICAgdGhpcy5fdmlkZW8/LmRlc3RvcnkoKTtcclxuICAgICAgICAgICAgdGhpcy5fdmlkZW8gPSBudWxsO1xyXG5cclxuICAgICAgICAgICAgaWYgKHRoaXMuX2N1c3RvbXMpIHtcclxuICAgICAgICAgICAgICAgIGZvciAobGV0IHZhbCBpbiB0aGlzLl9jdXN0b21zKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fY3VzdG9tc1t2YWxdPy5kZXN0cm95KCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB0aGlzLl9jdXN0b21zID0ge307XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgZXhwb3J0IGVudW0gRUdhbWVDbHViSWNvbiB7XHJcbiAgICAgICAgLyoqIOe7v+iJsuWbvuaghyAqL1xyXG4gICAgICAgIEdSRUVOID0gJ2dyZWVuJyxcclxuXHJcbiAgICAgICAgLyoqIOe6ouiJsuWbvuaghyAqL1xyXG4gICAgICAgIFdISVRFID0gJ3doaXRlJyxcclxuXHJcbiAgICAgICAgLyoqIOaciem7keiJsuWchuinkuiDjOaZr+eahOeZveiJsuWbvuaghyAqL1xyXG4gICAgICAgIERBUksgPSAnZGFyaycsXHJcblxyXG4gICAgICAgIC8qKiDmnInnmb3oibLlnIbop5Log4zmma/nmoTnu7/oibLlm77moIcgKi9cclxuICAgICAgICBMSUdIVCA9ICdsaWdodCdcclxuICAgIH1cclxuXHJcbiAgICBleHBvcnQgY2xhc3MgR2FtZUNsdWIge1xyXG4gICAgICAgIHByaXZhdGUgc3RhdGljIF9pbnN0YW5jZTogR2FtZUNsdWI7XHJcblxyXG4gICAgICAgIHN0YXRpYyBnZXQgaW5zdGFuY2UoKTogR2FtZUNsdWIge1xyXG4gICAgICAgICAgICBpZiAoIXRoaXMuX2luc3RhbmNlKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLl9pbnN0YW5jZSA9IG5ldyBHYW1lQ2x1YigpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9pbnN0YW5jZTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHByaXZhdGUgX2NsdWI6IGFueTtcclxuXHJcbiAgICAgICAgcHJpdmF0ZSBjb25zdHJ1Y3RvcigpIHtcclxuXHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiDliJvlu7rmuLjmiI/lnIjmjInpkq5cclxuICAgICAgICAgKiBAcGFyYW0gaWNvbiBcclxuICAgICAgICAgKiBAcGFyYW0gcG9zaXRpb24gXHJcbiAgICAgICAgICogQHBhcmFtIHNpemUgXHJcbiAgICAgICAgICogQHBhcmFtIG9wZW5MaW5rIFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIGNyZWF0ZShpY29uOiBFR2FtZUNsdWJJY29uID0gRUdhbWVDbHViSWNvbi5HUkVFTiwgcG9zaXRpb246IElQb3NpdGlvbiA9IHsgdG9wOiAwLCBsZWZ0OiAwIH0sIHNpemU6IElTaXplID0geyB3aWR0aDogNDAsIGhlaWdodDogNDAgfSwgb3Blbkxpbms/OiBzdHJpbmcpIHtcclxuICAgICAgICAgICAgaWYgKGlzV2VjaGF0KCkpIHtcclxuICAgICAgICAgICAgICAgIC8vIEB0cy1pZ25vcmVcclxuICAgICAgICAgICAgICAgIHRoaXMuX2NsdWIgPSB3eC5jcmVhdGVHYW1lQ2x1YkJ1dHRvbih7XHJcbiAgICAgICAgICAgICAgICAgICAgaWNvbjogaWNvbixcclxuICAgICAgICAgICAgICAgICAgICBzdHlsZToge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBsZWZ0OiBwb3NpdGlvbi5sZWZ0LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICB0b3A6IHBvc2l0aW9uLnRvcCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGg6IHNpemUud2lkdGgsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGhlaWdodDogc2l6ZS5oZWlnaHRcclxuICAgICAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgICAgIG9wZW5saW5rOiBvcGVuTGlua1xyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHNob3coKSB7XHJcbiAgICAgICAgICAgIHRoaXMuX2NsdWI/LnNob3coKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGhpZGUoKSB7XHJcbiAgICAgICAgICAgIHRoaXMuX2NsdWI/LmhpZGUoKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGRlc3RvcnkoKSB7XHJcbiAgICAgICAgICAgIHRoaXMuX2NsdWI/LmRlc3Ryb3koKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG5cclxuICAgIC8qKlxyXG4gICAgICog5oyv5Yqo57G75Z6LXHJcbiAgICAgKi9cclxuICAgIGV4cG9ydCBlbnVtIEVWaXJicmF0ZVR5cGUge1xyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIOefreaMr+WKqFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIFNIT1JULFxyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiDplb/mjK/liqhcclxuICAgICAgICAgKi9cclxuICAgICAgICBMT05HXHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiDlubPlj7DluLjnlKhBUEnlkIjpm4ZcclxuICAgICAqL1xyXG4gICAgZXhwb3J0IGNsYXNzIEFQSSB7XHJcbiAgICAgICAgcHJpdmF0ZSBzdGF0aWMgX2xvZ2luQ29kZTogc3RyaW5nID0gbnVsbDtcclxuICAgICAgICBwcml2YXRlIHN0YXRpYyBfbG9naW5Bbm9ueW1vdXNDb2RlOiBzdHJpbmcgPSBudWxsO1xyXG4gICAgICAgIHByaXZhdGUgc3RhdGljIF9oYXNJbml0V2VjaGF0Q2xvdWRGdW5jdGlvbjogYm9vbGVhbiA9IGZhbHNlO1xyXG4gICAgICAgIHByaXZhdGUgc3RhdGljIF91c2VySW5mbzogYW55ID0gbnVsbDtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICog5YiG5LqrYXBw57uZ5pyL5Y+L77yM5b6u5L+h5bCP5ri45oiP5YiG5Lqr5piv5rKh5pyJb25TdWNjZXNz5Zue6LCD55qE44CCXHJcbiAgICAgICAgICogQHBhcmFtIHRpdGxlIOagh+mimFxyXG4gICAgICAgICAqIEBwYXJhbSBkZXNjcmlwdGlvbiDnu4boioLmj4/ov7Dkv6Hmga8gXHJcbiAgICAgICAgICogQHBhcmFtIGltYWdlVXJsIOWbvueJh+WcsOWdgFxyXG4gICAgICAgICAqIEBwYXJhbSBxdWVyeSDmn6Xor6Lkv6Hmga9cclxuICAgICAgICAgKiBAcGFyYW0gb25TdWNjZXNzIOaKlumfs+S8muWbnuiwg++8jOW+ruS/oeS4jeS8muWbnuiwg1xyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHN0YXRpYyBzaGFyZUFwcFRvRnJpZW5kcyh0aXRsZTogc3RyaW5nLCBkZXNjcmlwdGlvbjogc3RyaW5nID0gJycsIGltYWdlVXJsPzogc3RyaW5nLCBxdWVyeT86IHN0cmluZywgb25TdWNjZXNzPzogKCkgPT4gdm9pZCkge1xyXG4gICAgICAgICAgICBpZiAoaXNXZWNoYXQoKSkge1xyXG4gICAgICAgICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgICAgICAgICAvL0B0cy1pZ25vcmVcclxuICAgICAgICAgICAgICAgICAgICB3eC5zaGFyZUFwcE1lc3NhZ2Uoe1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aXRsZTogdGl0bGUsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGltYWdlVXJsOiBpbWFnZVVybCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgcXVlcnk6IHF1ZXJ5LFxyXG4gICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgfSBjYXRjaCAoZXJyKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coYHNoYXJlIGZhaWxkOiAke2Vycn1gKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgaWYgKGlzQnl0ZWRhbmNlKCkpIHtcclxuICAgICAgICAgICAgICAgIC8vQHRzLWlnbm9yZVxyXG4gICAgICAgICAgICAgICAgdHQuc2hhcmVBcHBNZXNzYWdlKHtcclxuICAgICAgICAgICAgICAgICAgICB0aXRsZTogdGl0bGUsXHJcbiAgICAgICAgICAgICAgICAgICAgZGVzYzogZGVzY3JpcHRpb24sXHJcbiAgICAgICAgICAgICAgICAgICAgaW1hZ2VVcmw6IGltYWdlVXJsID8/ICcnLFxyXG4gICAgICAgICAgICAgICAgICAgIHF1ZXJ5OiBxdWVyeSA/PyAnJyxcclxuICAgICAgICAgICAgICAgICAgICBzdWNjZXNzKHJlczogYW55KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdzaGFyZSBzdWNjZXNzOicsIHJlcyk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG9uU3VjY2Vzcz8uKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgICAgICBmYWlsKHJlczogYW55KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdzaGFyZSBmYWlsOicsIHJlcyk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIOaYvuekuuaPkOekuuS/oeaBr1xyXG4gICAgICAgICAqIEBwYXJhbSB0aXRsZSDmoIfpophcclxuICAgICAgICAgKiBAcGFyYW0gZHVyYXRpb24g5pe26ZW/77yI5Y2V5L2N77ya56eS77yJXHJcbiAgICAgICAgICogQHJldHVybnMgXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgc3RhdGljIHNob3dUb2FzdCh0aXRsZTogc3RyaW5nLCBkdXJhdGlvbjogbnVtYmVyID0gMikge1xyXG4gICAgICAgICAgICBpZiAoaXNXZWNoYXQoKSkge1xyXG4gICAgICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxyXG4gICAgICAgICAgICAgICAgd3guc2hvd1RvYXN0KHtcclxuICAgICAgICAgICAgICAgICAgICB0aXRsZTogdGl0bGUsXHJcbiAgICAgICAgICAgICAgICAgICAgaWNvbjogJ3N1Y2Nlc3MnLFxyXG4gICAgICAgICAgICAgICAgICAgIGR1cmF0aW9uOiBkdXJhdGlvbiAqIDEwMDBcclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBpZiAoaXNCeXRlZGFuY2UoKSkge1xyXG4gICAgICAgICAgICAgICAgLy9AdHMtaWdub3JlXHJcbiAgICAgICAgICAgICAgICB0dC5zaG93VG9hc3Qoe1xyXG4gICAgICAgICAgICAgICAgICAgIHRpdGxlOiB0aXRsZSxcclxuICAgICAgICAgICAgICAgICAgICBkdXJhdGlvbjogZHVyYXRpb24gKiAxMDAwLFxyXG4gICAgICAgICAgICAgICAgICAgIHN1Y2Nlc3MocmVzOiBhbnkpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coYCR7cmVzfWApO1xyXG4gICAgICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICAgICAgZmFpbChyZXM6IGFueSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhgc2hvd1RvYXN06LCD55So5aSx6LSlYCk7XHJcbiAgICAgICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiDorr7lpIfpnIfliqjmlYjmnpzvvIzpu5jorqTkuLrnn63pnIfliqjjgILms6jmhI/vvJrlj6/og73kuIDkupvmnLrlnovkuI3kvJrnlJ/mlYjvvIzlhbfkvZPnnIvlubPlj7DmlrnnmoTor7TmmI5cclxuICAgICAgICAgKiBAcGFyYW0gdHlwZSBNaW5pR2FtZVNkay5BUEkuRVZpcmJyYXRlVHlwZVxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHN0YXRpYyB2aWJyYXRlKHR5cGU6IEVWaXJicmF0ZVR5cGUgPSBFVmlyYnJhdGVUeXBlLlNIT1JUKSB7XHJcbiAgICAgICAgICAgIGlmIChpc1dlY2hhdCgpKSB7XHJcbiAgICAgICAgICAgICAgICBzd2l0Y2ggKHR5cGUpIHtcclxuICAgICAgICAgICAgICAgICAgICBjYXNlIEVWaXJicmF0ZVR5cGUuU0hPUlQ6XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vQHRzLWlnbm9yZVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB3eC52aWJyYXRlU2hvcnQoe1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VjY2VzcyhyZXM6IGFueSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCd2aWJyYXRlIHN1Y2Nlc3M6JywgcmVzKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWlsKHJlczogYW55KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ3ZpYnJhdGVTaG9ydCBmYWlsZWQnLCByZXMpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgICAgIGNhc2UgRVZpcmJyYXRlVHlwZS5MT05HOlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAvL0B0cy1pZ25vcmVcclxuICAgICAgICAgICAgICAgICAgICAgICAgd3gudmlicmF0ZUxvbmcoe1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VjY2VzcyhyZXM6IGFueSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCd2aWJyYXRlIHN1Y2Nlc3MnLCByZXMpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhaWwocmVzOiBhbnkpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhgdmlicmF0ZUxvbmcgZmFpbGVkYCwgcmVzKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgaWYgKGlzQnl0ZWRhbmNlKCkpIHtcclxuICAgICAgICAgICAgICAgIHN3aXRjaCAodHlwZSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGNhc2UgRVZpcmJyYXRlVHlwZS5TSE9SVDpcclxuICAgICAgICAgICAgICAgICAgICAgICAgLy9AdHMtaWdub3JlXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHR0LnZpYnJhdGVTaG9ydCh7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdWNjZXNzKHJlczogYW55KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ3ZpYnJhdGUgc3VjY2VzczonLCByZXMpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhaWwocmVzOiBhbnkpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygndmlicmF0ZVNob3J0IGZhaWxlZCcsIHJlcyk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICAgICAgY2FzZSBFVmlyYnJhdGVUeXBlLkxPTkc6XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vQHRzLWlnbm9yZVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB0dC52aWJyYXRlTG9uZyh7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdWNjZXNzKHJlczogYW55KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ3ZpYnJhdGUgc3VjY2VzcycsIHJlcyk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFpbChyZXM6IGFueSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKGB2aWJyYXRlTG9uZyBmYWlsZWRgLCByZXMpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiDph43lkK/lsI/muLjmiI9cclxuICAgICAgICAgKi9cclxuICAgICAgICBzdGF0aWMgcmVib290KCkge1xyXG4gICAgICAgICAgICBpZiAoaXNXZWNoYXQoKSkge1xyXG4gICAgICAgICAgICAgICAgLy9AdHMtaWdub3JlXHJcbiAgICAgICAgICAgICAgICB3eC5yZXN0YXJ0TWluaVByb2dyYW0oe1xyXG4gICAgICAgICAgICAgICAgICAgIHN1Y2Nlc3M6ICgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ3Jlc3RhcnQgc3VjY2VzcycpO1xyXG4gICAgICAgICAgICAgICAgICAgIH0sXHJcblxyXG4gICAgICAgICAgICAgICAgICAgIGZhaWw6ICgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ3Jlc3RhcnQgZmFpbGVkJyk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgaWYgKGlzQnl0ZWRhbmNlKCkpIHtcclxuICAgICAgICAgICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxyXG4gICAgICAgICAgICAgICAgICAgIHR0LnJlc3RhcnRNaW5pUHJvZ3JhbVN5bmMoKTtcclxuICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coYHJlc3RhcnRNaW5pUHJvZ3JhbVN5bmNgLCBlcnJvcik7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIOmAgOWHuuWwj+a4uOaIj1xyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHN0YXRpYyBleGl0KCkge1xyXG4gICAgICAgICAgICBpZiAoaXNXZWNoYXQoKSkge1xyXG4gICAgICAgICAgICAgICAgLy9AdHMtaWdub3JlXHJcbiAgICAgICAgICAgICAgICB3eC5leGl0TWluaVByb2dyYW0oe1xyXG4gICAgICAgICAgICAgICAgICAgIHN1Y2Nlc3M6ICgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ2V4aXQgc3VjY2VzcycpO1xyXG4gICAgICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICAgICAgZmFpbDogKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnZXhpdCBmYWlsZWQnKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgaWYgKGlzQnl0ZWRhbmNlKCkpIHtcclxuICAgICAgICAgICAgICAgIC8vIEB0cy1pZ25vcmVcclxuICAgICAgICAgICAgICAgIHR0LmV4aXRNaW5pUHJvZ3JhbSh7XHJcbiAgICAgICAgICAgICAgICAgICAgc3VjY2VzcyhyZXM6IGFueSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhcImV4aXQgc3VjY2VzczpcIiwgcmVzPy5kYXRhKTtcclxuICAgICAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgICAgIGZhaWwocmVzOiBhbnkpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coXCJleGl0IGZhaWw6XCIsIHJlcz8uZXJyTXNnKTtcclxuICAgICAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIOaYvuekuui9rOWPkeaMiemSruOAgumAmuW4uOWcqOWImui/m+WFpea4uOaIj+eahOaXtuWAmeiwg+eUqOOAglxyXG4gICAgICAgICAqIOS4u+imgeaYr+aJk+W8gOW5s+WPsOKAnC4uLuKAnei/meS4quaMiemSrumHjOmdoueahOWIhuS6q+iPnOWNle+8jOS4gOiIrOm7mOiupOaYr+WFs+mXreeahO+8jOmcgOimgeiwg+eUqOi/meS4quWHveaVsOaJk+W8gOOAguWPr+S7peiuqeeUqOaIt+WIhuS6q+S9oOeahOa4uOaIj+WFpeWPo+OAglxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHN0YXRpYyBzaG93U2hhcmVNZW51KCkge1xyXG4gICAgICAgICAgICBpZiAoaXNXZWNoYXQoKSkge1xyXG4gICAgICAgICAgICAgICAgLy9AdHMtaWdub3JlXHJcbiAgICAgICAgICAgICAgICB3eC5zaG93U2hhcmVNZW51KHtcclxuICAgICAgICAgICAgICAgICAgICB3aXRoU2hhcmVUaWNrZXQ6IHRydWUsXHJcbiAgICAgICAgICAgICAgICAgICAgbWVudXM6IFsnc2hhcmVBcHBNZXNzYWdlJywgJ3NoYXJlVGltZWxpbmUnXSxcclxuICAgICAgICAgICAgICAgICAgICBzdWNjZXNzOiAoKSA9PiB7IH0sXHJcbiAgICAgICAgICAgICAgICAgICAgZmFpbDogKCkgPT4geyB9LFxyXG4gICAgICAgICAgICAgICAgICAgIGNvbXBsZXRlOiAoKSA9PiB7IH1cclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBpZiAoaXNCeXRlZGFuY2UoKSkge1xyXG4gICAgICAgICAgICAgICAgLy9AdHMtaWdub3JlXHJcbiAgICAgICAgICAgICAgICB0dC5zaG93U2hhcmVNZW51KHtcclxuICAgICAgICAgICAgICAgICAgICBzdWNjZXNzKHJlczogYW55KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKFwic2hvdyBtZW51IGlzIHNob3dpbmdcIik7XHJcbiAgICAgICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgICAgICBmYWlsKGVycjogYW55KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKFwic2hvd1NoYXJlTWVudTpcIiwgZXJyLmVyck1zZyk7XHJcbiAgICAgICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgICAgICBjb21wbGV0ZShyZXM6IGFueSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhcInNob3dTaGFyZU1lbnUgY29tcGxldGVcIik7XHJcbiAgICAgICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiDlvq7kv6HlsI/muLjmiI/vvJrot7PovazliLDlj6blpJbkuIDmrL7lsI/muLjmiI9cclxuICAgICAgICAgKiDmipbpn7PlsI/muLjmiI/vvJrot7PovazliLDmjIflrprnmoTop4bpopHnlYzpnaJcclxuICAgICAgICAgKiBAcGFyYW0gdGFyZ2V0SWQg5b6u5L+h5bCP5ri45oiPYXBwaWTmiJbogIXop4bpopHnlYzpnaJcclxuICAgICAgICAgKi9cclxuICAgICAgICBzdGF0aWMgbmF2aWdhdGVUbyh0YXJnZXRJZDogc3RyaW5nLCBvblN1Y2Nlc3M/OiAoKSA9PiB2b2lkKSB7XHJcbiAgICAgICAgICAgIGlmIChpc1dlY2hhdCgpKSB7XHJcbiAgICAgICAgICAgICAgICAvLyBAdHMtaWdub3JlXHJcbiAgICAgICAgICAgICAgICB3eC5uYXZpZ2F0ZVRvTWluaVByb2dyYW0oe1xyXG4gICAgICAgICAgICAgICAgICAgIGFwcElkOiB0YXJnZXRJZCxcclxuICAgICAgICAgICAgICAgICAgICBleHRyYURhdGE6IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgZm9vOiAnYmFyJ1xyXG4gICAgICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICAgICAgZW52VmVyc2lvbjogJ2RldmVsb3AnLFxyXG4gICAgICAgICAgICAgICAgICAgIHN1Y2Nlc3MocmVzOiBhbnkpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgb25TdWNjZXNzPy4oKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgaWYgKGlzQnl0ZWRhbmNlKCkpIHtcclxuICAgICAgICAgICAgICAgIC8vIEB0cy1pZ25vcmVcclxuICAgICAgICAgICAgICAgIHR0Lm5hdmlnYXRlVG9WaWRlb1ZpZXcoe1xyXG4gICAgICAgICAgICAgICAgICAgIHZpZGVvSWQ6IHRhcmdldElkLFxyXG4gICAgICAgICAgICAgICAgICAgIHN1Y2Nlc3M6IChyZXM6IGFueSkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBvblN1Y2Nlc3M/LigpO1xyXG4gICAgICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICAgICAgZmFpbDogKGVycjogYW55KSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKFwiYnl0ZWRhbmNlIG5hdmlnYXRlVG9WaWRlb1ZpZXcgZmFpbFwiLCBlcnIpO1xyXG4gICAgICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIOWwj+a4uOaIj+W5s+WPsOeZu+W9leWKn+iDveOAguW+ruS/oei/lOWbnmNvZGXvvIzmipbpn7Pov5Tlm55jb2Rl5ZKMYW5vbnltb3VzQ29kZeOAgueUqOS6jueZu+W9leeahOWHreivge+8jOmcgOimgeaKiui/meS4qmNvZGXkvKDlm57kvaDnmoTmnI3liqHlmajnqIvluo/kuK3ljrvosIPnlKhjb2RlMlNlc3Npb25cclxuICAgICAgICAgKiBAcGFyYW0gY2FsbGJhY2sgKGNvZGUsIGFub255bW91c0NvZGUpIOesrOS4gOS4quWPguaVsOS4umNvZGXvvIzlvq7kv6Hlkozmipbpn7Ppg73mlK/mjIHvvJvnrKzkuozkuKrlj4LmlbDkuLrljL/lkI3orr7lpIdJRO+8jOS7heaKlumfs+aUr+aMge+8jOWksei0pemDvei/lOWbnm51bGxcclxuICAgICAgICAgKi9cclxuICAgICAgICBzdGF0aWMgbG9naW4oY2FsbGJhY2s6IChjb2RlOiBzdHJpbmcsIGFub255bW91c0NvZGU6IHN0cmluZykgPT4gdm9pZCkge1xyXG4gICAgICAgICAgICBsZXQgbG9naW5QbGF0Zm9ybSA9ICgpID0+IHtcclxuICAgICAgICAgICAgICAgIGlmIChpc1dlY2hhdCgpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgLy9AdHMtaWdub3JlXHJcbiAgICAgICAgICAgICAgICAgICAgd3gubG9naW4oe1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBzdWNjZXNzOiAocmVzOiB7IGNvZGU6IGFueTsgZXJyTXNnOiBhbnk7IH0pID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZXMuY29kZSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFQSS5fbG9naW5Db2RlID0gcmVzLmNvZGU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVBJLl9sb2dpbkFub255bW91c0NvZGUgPSBudWxsO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrPy4oQVBJLl9sb2dpbkNvZGUsIEFQSS5fbG9naW5Bbm9ueW1vdXNDb2RlKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ2xvZ2luIGVycm9yOicsIHJlcy5lcnJNc2cpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sXHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICBmYWlsOiAoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBBUEkuX2xvZ2luQ29kZSA9IG51bGw7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBBUEkuX2xvZ2luQW5vbnltb3VzQ29kZSA9IG51bGw7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjaz8uKEFQSS5fbG9naW5Db2RlLCBBUEkuX2xvZ2luQW5vbnltb3VzQ29kZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnbG9naW4gZmFpbCcpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoaXNCeXRlZGFuY2UoKSkge1xyXG4gICAgICAgICAgICAgICAgICAgIC8vQHRzLWlnbm9yZVxyXG4gICAgICAgICAgICAgICAgICAgIHR0LmxvZ2luKHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgZm9yY2U6IHRydWUsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHN1Y2Nlc3MocmVzOiBhbnkpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKGBsb2dpbiAke3Jlcy5jb2RlfSAke3Jlcy5hbm9ueW1vdXNDb2RlfWApO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlcy5jb2RlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVBJLl9sb2dpbkNvZGUgPSByZXMuY29kZT8udG9TdHJpbmcoKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBUEkuX2xvZ2luQW5vbnltb3VzQ29kZSA9IHJlcy5hbm9ueW1vdXNDb2RlPy50b1N0cmluZygpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrPy4oQVBJLl9sb2dpbkNvZGUsIEFQSS5fbG9naW5Bbm9ueW1vdXNDb2RlKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ2xvZ2luIGVycm9yOicsIHJlcy5lcnJNc2cpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGZhaWwocmVzOiBhbnkpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFQSS5fbG9naW5Db2RlID0gbnVsbDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFQSS5fbG9naW5Bbm9ueW1vdXNDb2RlID0gbnVsbDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrPy4oQVBJLl9sb2dpbkNvZGUsIEFQSS5fbG9naW5Bbm9ueW1vdXNDb2RlKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKGBsb2dpbiBmYWlsYCwgcmVzKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgQVBJLl9sb2dpbkNvZGUgPSBudWxsO1xyXG4gICAgICAgICAgICAgICAgICAgIEFQSS5fbG9naW5Bbm9ueW1vdXNDb2RlID0gbnVsbDtcclxuICAgICAgICAgICAgICAgICAgICBjYWxsYmFjaz8uKEFQSS5fbG9naW5Db2RlLCBBUEkuX2xvZ2luQW5vbnltb3VzQ29kZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ25vdCBtaW5pIGdhbWUgcGxhdGZvcm0sIGxvZ2luIGNvZGVzIGFyZSBhbGwgbnVsbCcpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcblxyXG5cclxuXHJcbiAgICAgICAgICAgIGlmICghQVBJLl9sb2dpbkNvZGUpIHtcclxuICAgICAgICAgICAgICAgIGxvZ2luUGxhdGZvcm0oKTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIGlmIChpc1dlY2hhdCgpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgLy9AdHMtaWdub3JlXHJcbiAgICAgICAgICAgICAgICAgICAgd3guY2hlY2tTZXNzaW9uKHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgc3VjY2VzcygpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKGBzZXNzaW9uIGlzIHZhbGlkLCB1c2UgY3VycmVudCBjb2RlOmAsIEFQSS5fbG9naW5Db2RlKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrPy4oQVBJLl9sb2dpbkNvZGUsIEFQSS5fbG9naW5Bbm9ueW1vdXNDb2RlKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgZmFpbCgpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKGBzZXNzaW9uIGV4cGlyZWRgKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZ2luUGxhdGZvcm0oKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChpc0J5dGVkYW5jZSgpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgLy9AdHMtaWdub3JlXHJcbiAgICAgICAgICAgICAgICAgICAgdHQuY2hlY2tTZXNzaW9uKHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgc3VjY2VzcygpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKGBzZXNzaW9uIGlzIHZhbGlkLCB1c2VyIGN1cnJlbnQgY29kZTogJHtBUEkuX2xvZ2luQ29kZX0sICR7QVBJLl9sb2dpbkFub255bW91c0NvZGV9YCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjaz8uKEFQSS5fbG9naW5Db2RlLCBBUEkuX2xvZ2luQW5vbnltb3VzQ29kZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGZhaWwoKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhgc2Vzc2lvbiBleHBpcmVkYCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2dpblBsYXRmb3JtKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnbm90IG1pbmkgZ2FtZSBwbGF0Zm9ybSwgbG9naW4gbnVsbCcpO1xyXG4gICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrPy4obnVsbCwgbnVsbCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgLyoqXHJcbiAgICAgICAgICog5bCP5ri45oiP5bmz5Y+w55m75b2V5Yqf6IO944CC5b6u5L+h6L+U5ZueY29kZe+8jOaKlumfs+i/lOWbnmNvZGXlkoxhbm9ueW1vdXNDb2Rl44CC55So5LqO55m75b2V55qE5Yet6K+B77yM6ZyA6KaB5oqK6L+Z5LiqY29kZeS8oOWbnuS9oOeahOacjeWKoeWZqOeoi+W6j+S4reWOu+iwg+eUqGNvZGUyU2Vzc2lvblxyXG4gICAgICAgICAqIEBwYXJhbSBjYWxsYmFjayAoY29kZSwgYW5vbnltb3VzQ29kZSkg56ys5LiA5Liq5Y+C5pWw5Li6Y29kZe+8jOW+ruS/oeWSjOaKlumfs+mDveaUr+aMge+8m+esrOS6jOS4quWPguaVsOS4uuWMv+WQjeiuvuWkh0lE77yM5LuF5oqW6Z+z5pSv5oyB77yM5aSx6LSl6YO96L+U5ZuebnVsbFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHN0YXRpYyBnZXRVc2VySW5mbyhjYWxsYmFjazogKHVzZXJJbmZvOiBhbnkpID0+IHZvaWQpIHtcclxuICAgICAgICAgICAgLy9AdHMtaWdub3JlXHJcbiAgICAgICAgICAgIHR0LmdldFVzZXJJbmZvKHtcclxuICAgICAgICAgICAgICAgIHdpdGhDcmVkZW50aWFsczogdHJ1ZSxcclxuICAgICAgICAgICAgICAgIHN1Y2Nlc3M6IChyZXM6IGFueSkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIEFQSS5fdXNlckluZm8gPSByZXM7XHJcbiAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2soQVBJLl91c2VySW5mbyk7XHJcbiAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgZmFpbDogKGVycjogYW55KSA9PntcclxuICAgICAgICAgICAgICAgICAgICBjYWxsYmFjayhlcnIpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIOiwg+eUqOW+ruS/oeS6keWHveaVsOOAgueUseS6juWPguaVsOmcgOimgeiHquWumuS5ie+8jOaJgOS7peS4umFuee+8jOmcgOimgeiHquihjOino+mHiuOAguWHveaVsOWPquWujOaIkOmAmumBk+WSjOWkhOeQhuS4gOWcuueahOS9nOeUqFxyXG4gICAgICAgICAqIEBwYXJhbSBjYWxsYmFjayDov5Tlm57kupHlh73mlbDosIPnlKjnu5PmnpzjgILpnIDopoHmo4Dmn6Xov5Tlm57lj4LmlbDmmK/lkKbkuLrnqbrvvIzlpLHotKXnmoTml7blgJnkuLrnqbpcclxuICAgICAgICAgKiBAcGFyYW0gbmFtZSDkupHlh73mlbDnmoTlkI3lrZdcclxuICAgICAgICAgKiBAcGFyYW0gZGF0YSDkupHlh73mlbDnmoTlhoXlrrlcclxuICAgICAgICAgKi9cclxuICAgICAgICBzdGF0aWMgY2FsbFdlY2hhdENsb3VkRnVuY3Rpb24oY2FsbGJhY2s6IChyZXM6IGFueSkgPT4gdm9pZCwgbmFtZTogc3RyaW5nLCBkYXRhOiB7fSkge1xyXG4gICAgICAgICAgICBpZiAoIWlzV2VjaGF0KCkpIHtcclxuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdOb3Qgd2VjaGF0IHBsYXRmb3JtLCBub3Qgc3VwcG9ydCBjYWxsV2VjaGF0Q2xvdWRGdW5jdGlvbicpO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICB0aGlzLmxvZ2luKChjb2RlOiBzdHJpbmcsIGFub255bW91c0NvZGU6IHN0cmluZykgPT4ge1xyXG4gICAgICAgICAgICAgICAgaWYgKCFBUEkuX2hhc0luaXRXZWNoYXRDbG91ZEZ1bmN0aW9uKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgLy9AdHMtaWdub3JlXHJcbiAgICAgICAgICAgICAgICAgICAgd3guY2xvdWQuaW5pdCgpO1xyXG4gICAgICAgICAgICAgICAgICAgIEFQSS5faGFzSW5pdFdlY2hhdENsb3VkRnVuY3Rpb24gPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgLy9AdHMtaWdub3JlXHJcbiAgICAgICAgICAgICAgICB3eC5jbG91ZC5jYWxsRnVuY3Rpb24oe1xyXG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IG5hbWUsXHJcbiAgICAgICAgICAgICAgICAgICAgZGF0YTogZGF0YSxcclxuICAgICAgICAgICAgICAgICAgICBzdWNjZXNzOiAocmVzOiBhbnkpID0+IGNhbGxiYWNrPy4ocmVzKSxcclxuICAgICAgICAgICAgICAgICAgICBmYWlsOiAoZXJyOiBhbnkpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ3dlY2hhdCBjbG91ZCBmdW5jdGlvbiBlcnJvcjonLCBlcnIpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjaz8uKG51bGwpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIOWtmOWCqOeUqOaIt+S/oeaBr++8jOaVsOaNrumHj+S4jeiDveWkp+OAguWPr+S7peiAg+iZkeeUqOS6juWIhuaVsOaOkuihjOamnOOAgueUqOaIt+S5i+mXtOWPr+WFseS6q+aOkuihjOaVsOaNruOAglxyXG4gICAgICAgICAqIEBwYXJhbSBrZXkgXHJcbiAgICAgICAgICogQHBhcmFtIHZhbHVlIFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHN0YXRpYyBzZXRVc2VyQ2xvdWRTdG9yYWdlKGtleTogc3RyaW5nLCB2YWx1ZTogc3RyaW5nKSB7XHJcbiAgICAgICAgICAgIGlmIChpc1dlY2hhdCgpKSB7XHJcbiAgICAgICAgICAgICAgICAvLyBAdHMtaWdub3JlXHJcbiAgICAgICAgICAgICAgICB3eC5zZXRVc2VyQ2xvdWRTdG9yYWdlKHtcclxuICAgICAgICAgICAgICAgICAgICBLVkRhdGFMaXN0OiBbeyBrZXk6IGtleSwgdmFsdWU6IHZhbHVlIH1dLFxyXG4gICAgICAgICAgICAgICAgICAgIHN1Y2Nlc3M6ICgpID0+IGNvbnNvbGUubG9nKGBzZXQgY2xvdWQgc3RvcmFnZSBzdWNjZXNzOiR7a2V5fSwgdmFsdWU6JHt2YWx1ZX1gKSxcclxuICAgICAgICAgICAgICAgICAgICBmYWlsOiAoZXJyOiBhbnkpID0+IGNvbnNvbGUubG9nKCdzZXQgY2xvdWQgc3RvcmFnZSBlcnJvcjonLCBlcnIpXHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgaWYgKGlzQnl0ZWRhbmNlKCkpIHtcclxuICAgICAgICAgICAgICAgIC8vIEB0cy1pZ25vcmVcclxuICAgICAgICAgICAgICAgIHR0LnNldFVzZXJDbG91ZFN0b3JhZ2Uoe1xyXG4gICAgICAgICAgICAgICAgICAgIEtWRGF0YUxpc3Q6IFt7IGtleToga2V5LCB2YWx1ZTogdmFsdWUsIH1dLFxyXG4gICAgICAgICAgICAgICAgICAgIHN1Y2Nlc3M6ICgpID0+IGNvbnNvbGUubG9nKGBzZXQgY2xvdWQgc3RvcmFnZSBzdWNjZXNzOiR7a2V5fSwgdmFsdWU6JHt2YWx1ZX1gKSxcclxuICAgICAgICAgICAgICAgICAgICBmYWlsOiAoZXJyOiBhbnkpID0+IGNvbnNvbGUubG9nKCdzZXQgY2xvdWQgc3RvcmFnZSBlcnJvcjonLCBlcnIpXHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiDmipbpn7PkvqfovrnmoI/kuJPlsZ7mjqXlj6NcclxuICAgICAqL1xyXG4gICAgZXhwb3J0IGNsYXNzIEJ5dGVkYW5jZVNpZGViYXIge1xyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIOacrOa4uOaIj+WcqOaKlumfs+eOr+Wig+S4i+WQr+WKqOebkeaOp++8jOmcgOimgeaUvuWcqOWFqOWxgOeOr+Wig+S4re+8jOS/neivgeiDveesrOS4gOaXtumXtOWQr+WKqOOAguWboOS4uuWPr+iDveebkeWQrOaKlumfs+Wksei0pe+8iOaKlumfs+Wwj+a4uOaIj+WumOaWueeahOivtOaYju+8ie+8gVxyXG4gICAgICAgICAqIEBwYXJhbSBvblJlc3VsdCDljIXlkKvkuIDkuKpib29sZWFu5Y+C5pWw55qE5Ye95pWwXHJcbiAgICAgICAgICogQHBhcmFtIHRhcmdldCDkuIrov7Dlh73mlbDnmoTmi6XmnInogIXvvIzlpoLmnpzmmK/nsbvnmoTmiJDlkZjlh73mlbDvvIzpnIDopoHkvKDlhaV0aGlz44CC5pmu6YCa5oiW5Yy/5ZCN5Ye95pWw5b+955Wl5Y2z5Y+v44CCXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgc3RhdGljIGxpc3RlbkZyb21TaWRlYmFyKG9uUmVzdWx0OiAoc3VjY2VzczogYm9vbGVhbikgPT4gdm9pZCwgdGFyZ2V0PzogYW55KSB7XHJcbiAgICAgICAgICAgIGlmICghaXNCeXRlZGFuY2UoKSkge1xyXG4gICAgICAgICAgICAgICAgb25SZXN1bHQ/LmNhbGwodGFyZ2V0LCBmYWxzZSk7XHJcbiAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxyXG4gICAgICAgICAgICB0dC5vblNob3coKHJlczogYW55KSA9PiB7XHJcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnb25TaG93IGxhdW5jaCByZXM6JywgcmVzKTtcclxuICAgICAgICAgICAgICAgIGlmIChyZXMuc2NlbmUgPT09ICcwMjEwMzYnKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgb25SZXN1bHQ/LmNhbGwodGFyZ2V0LCB0cnVlKTtcclxuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnbGF1bmNoIGZyb20gc2lkZWJhcicpO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICBvblJlc3VsdD8uY2FsbCh0YXJnZXQsIGZhbHNlKTtcclxuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnTk9UIGxhdW5jaCBmcm9tIGRvdXlpbiBzaWRlYmFyIScpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgICAgIC8vIEB0cy1pZ25vcmVcclxuICAgICAgICAgICAgbGV0IG9wdGlvbnMgPSB0dC5nZXRMYXVuY2hPcHRpb25zU3luYygpO1xyXG4gICAgICAgICAgICBpZiAob3B0aW9ucyAmJiBvcHRpb25zLnNjZW5lID09PSAnMDIxMDM2Jykge1xyXG4gICAgICAgICAgICAgICAgb25SZXN1bHQ/LmNhbGwodGFyZ2V0LCB0cnVlKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICog5qOA5rWL5oqW6Z+z5L6n6L655qCP5piv5ZCm5a2Y5ZyoXHJcbiAgICAgICAgICogQHBhcmFtIG9uUmVzdWx0IOWMheWQq+S4gOS4qmJvb2xlYW7lj4LmlbDnmoTlh73mlbBcclxuICAgICAgICAgKiBAcGFyYW0gdGFyZ2V0IOS4iui/sOWHveaVsOeahOaLpeacieiAhe+8jOWmguaenOaYr+exu+eahOaIkOWRmOWHveaVsO+8jOmcgOimgeS8oOWFpXRoaXPjgILmma7pgJrmiJbljL/lkI3lh73mlbDlv73nlaXljbPlj6/jgIJcclxuICAgICAgICAgKiBAcmV0dXJucyBcclxuICAgICAgICAgKi9cclxuICAgICAgICBzdGF0aWMgY2hlY2tTaWRlQmFyKG9uUmVzdWx0OiAoc3VjY2VzczogYm9vbGVhbikgPT4gdm9pZCwgdGFyZ2V0PzogYW55KSB7XHJcbiAgICAgICAgICAgIGlmICghaXNCeXRlZGFuY2UoKSkge1xyXG4gICAgICAgICAgICAgICAgb25SZXN1bHQ/LmNhbGwodGFyZ2V0LCBmYWxzZSk7XHJcbiAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIC8vQHRzLWlnbm9yZVxyXG4gICAgICAgICAgICB0dC5jaGVja1NjZW5lKHtcclxuICAgICAgICAgICAgICAgIHNjZW5lOiBcInNpZGViYXJcIixcclxuICAgICAgICAgICAgICAgIHN1Y2Nlc3M6IChyZXM6IGFueSkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKFwiY2hlY2sgc2NlbmUgc3VjY2VzczogXCIsIHJlcy5pc0V4aXN0KTtcclxuICAgICAgICAgICAgICAgICAgICBvblJlc3VsdD8uY2FsbCh0YXJnZXQsIDxib29sZWFuPnJlcy5pc0V4aXN0KTtcclxuXHJcbiAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgZmFpbDogKHJlczogYW55KSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coXCJjaGVjayBzY2VuZSBmYWlsOlwiLCByZXMpO1xyXG4gICAgICAgICAgICAgICAgICAgIG9uUmVzdWx0Py5jYWxsKHRhcmdldCwgZmFsc2UpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIOi3s+i9rOWIsOaKlumfs+S+p+i+ueagj1xyXG4gICAgICAgICAqIEBwYXJhbSBvblJlc3VsdCDljIXlkKvkuIDkuKpib29sZWFu5Y+C5pWw55qE5Ye95pWwXHJcbiAgICAgICAgICogQHBhcmFtIHRhcmdldCDkuIrov7Dlh73mlbDnmoTmi6XmnInogIXvvIzlpoLmnpzmmK/nsbvnmoTmiJDlkZjlh73mlbDvvIzpnIDopoHkvKDlhaV0aGlz44CC5pmu6YCa5oiW5Yy/5ZCN5Ye95pWw5b+955Wl5Y2z5Y+v44CCXHJcbiAgICAgICAgICogQHJldHVybnMgXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgc3RhdGljIG5hdmlnYXRlVG9TaWRlYmFyKG9uUmVzdWx0OiAoc3VjY2VzczogYm9vbGVhbikgPT4gdm9pZCwgdGFyZ2V0PzogYW55KSB7XHJcbiAgICAgICAgICAgIGlmICghaXNCeXRlZGFuY2UoKSkge1xyXG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coXCJub3QgZG91eWluIHBsYXRmb3JtIVwiKTtcclxuICAgICAgICAgICAgICAgIG9uUmVzdWx0Py5jYWxsKHRhcmdldCwgZmFsc2UpO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAvLyBAdHMtaWdub3JlXHJcbiAgICAgICAgICAgIHR0Lm5hdmlnYXRlVG9TY2VuZSh7XHJcbiAgICAgICAgICAgICAgICBzY2VuZTogXCJzaWRlYmFyXCIsXHJcbiAgICAgICAgICAgICAgICBzdWNjZXNzOiAoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coXCJuYXZpZ2F0ZSBzdWNjZXNzXCIpO1xyXG4gICAgICAgICAgICAgICAgICAgIG9uUmVzdWx0Py5jYWxsKHRhcmdldCwgdHJ1ZSk7XHJcbiAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgZmFpbDogKHJlczogYW55KSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coXCJuYXZpZ2F0ZSBmYWlsZWQgcmVhc29uOlwiLCByZXMpO1xyXG4gICAgICAgICAgICAgICAgICAgIG9uUmVzdWx0Py5jYWxsKHRhcmdldCwgZmFsc2UpO1xyXG4gICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxufSJdfQ==