ng-yunzai-mobile
Version:
1. 适配yunzai_uni_app_x
433 lines • 33.4 kB
JavaScript
/**
* @fileoverview added by tsickle
* Generated from: devices/wechat.micro.ts
* @suppress {checkTypes,constantProperty,extraRequire,missingOverride,missingRequire,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
*/
import { BaseDevice } from "./base.device";
import { from } from "rxjs";
import { TokenService } from "../token/token.service";
import { UserService } from "../user/user.service";
import { HttpClient } from "@angular/common/http";
import { BASE_CLIENT } from "../client/base.client";
import { Inject, Injectable } from "@angular/core";
import { preloaderFinished } from "../auth/preloader";
import { Title } from "@angular/platform-browser";
import * as i0 from "@angular/core";
import * as i1 from "../token/token.service";
import * as i2 from "@angular/common/http";
import * as i3 from "../user/user.service";
import * as i4 from "@angular/platform-browser";
import * as i5 from "../client/base.client";
/** @type {?} */
const apis = [
"updateAppMessageShareData",
"updateTimelineShareData",
"onMenuShareTimeline",
"onMenuShareAppMessage",
"onMenuShareQQ",
"onMenuShareWeibo",
"onMenuShareQZone",
"startRecord",
"stopRecord",
"onVoiceRecordEnd",
"playVoice",
"pauseVoice",
"stopVoice",
"onVoicePlayEnd",
"uploadVoice",
"downloadVoice",
"chooseImage",
"previewImage",
"uploadImage",
"downloadImage",
"translateVoice",
"getNetworkType",
"openLocation",
"getLocation",
"hideOptionMenu",
"showOptionMenu",
"hideMenuItems",
"showMenuItems",
"hideAllNonBaseMenuItem",
"showAllNonBaseMenuItem",
"closeWindow",
"scanQRCode",
"chooseWXPay",
"openProductSpecificView",
"addCard",
"chooseCard",
"openCard",
];
/** @type {?} */
const openTags = [
'wx-open-launch-weapp',
'wx-open-launch-app',
'wx-open-subscribe',
'wx-open-audio'
];
export class WechatMicro extends BaseDevice {
/**
* @param {?} tokenService
* @param {?} http
* @param {?} user
* @param {?} title
* @param {?} baseclient
*/
constructor(tokenService, http, user, title, baseclient) {
super();
this.tokenService = tokenService;
this.http = http;
this.user = user;
this.title = title;
this.baseclient = baseclient;
}
/**
* @return {?}
*/
auth() {
if (this.baseclient.wechatMicro && this.baseclient.wechatMicro.auth === false) {
return new Promise((/**
* @param {?} resolve
* @param {?} reject
* @return {?}
*/
(resolve, reject) => {
preloaderFinished();
resolve(true);
}));
}
return new Promise((/**
* @param {?} resolve
* @param {?} reject
* @return {?}
*/
(resolve, reject) => {
/** @type {?} */
const tokenInfo = {};
tokenInfo.account = this.getUrlParam('account');
tokenInfo.accessToken = this.getUrlParam('accessToken');
tokenInfo.userId = this.getUrlParam('userId');
tokenInfo.tokenType = 'bearer';
this.tokenService.set((/** @type {?} */ (tokenInfo)));
this.http
.get(`${this.baseclient.gateway}/auth/user`)
.subscribe((/**
* @param {?} response
* @return {?}
*/
(response) => {
// 设置user
this.user.set(Object.assign({}, response.principal, { tenantId: response.tenantId }));
this.generateWechatConfig();
// 加载结束
preloaderFinished();
resolve(true);
}));
}));
}
/**
* @return {?}
*/
generateWechatConfig() {
this.http
.get(`${this.baseclient.gateway}/wechat/mp/jssdk?url=${encodeURIComponent(window.location.href)}`)
.subscribe((/**
* @param {?} response
* @return {?}
*/
(response) => {
wx.config({
debug: false,
// 开启调试模式,调用的所有api的返回值会在客户端alert出来,若要查看传入的参数,可以在pc端打开,参数信息会通过log打出,仅在pc端时才会打印。
appId: response.appId,
// 必填,公众号的唯一标识
timestamp: response.timestamp,
// 必填,生成签名的时间戳
nonceStr: response.nonceStr,
// 必填,生成签名的随机串
signature: response.signature,
// 必填,签名
jsApiList: apis,
// 必填,需要使用的JS接口列表
openTagList: openTags // 可选,需要使用的开放标签列表,例如['wx-open-launch-app']
});
}));
wx.ready((/**
* @return {?}
*/
() => {
// config信息验证后会执行ready方法,所有接口调用都必须在config接口获得结果之后,config是一个客户端的异步操作,
// 所以如果需要在页面加载时就调用相关接口,则须把相关接口放在ready函数中调用来确保正确执行。对于用户触发时才调用的接口,则可以直接调用,不需要放在ready函数中。
console.log('微信jssdk初始化完成.');
}));
wx.error((/**
* @param {?} res
* @return {?}
*/
(res) => {
// config信息验证失败会执行error函数,如签名过期导致验证失败,具体错误信息可以打开config的debug模式查看,也可以在返回的res参数中查看,对于SPA可以在这里更新签名。
console.log('微信jssdk初始化失败:', res);
}));
}
/**
* @param {?} iwindow
* @return {?}
*/
openWindow(iwindow) {
window.location.href = iwindow.url;
}
/**
* @param {?} ititle
* @return {?}
*/
setTitle(ititle) {
this.title.setTitle(ititle.title);
}
/**
* @param {?} navigationBar
* @return {?}
*/
setNavigationBar(navigationBar) {
alert("小程序暂不支持放置按钮,请在APP中使用此功能!");
}
/**
* @param {?} ishare
* @return {?}
*/
share(ishare) {
alert("小程序暂不支持分享,请在APP中使用此功能!");
}
/**
* @return {?}
*/
getToken() {
/** @type {?} */
const itoken = {
accessToken: this.tokenService.get().accessToken,
tokenType: null,
tokenDataLine: null,
scope: null,
};
return itoken;
}
/**
* @return {?}
*/
scanCode() {
/** @type {?} */
const p = new Promise((/**
* @param {?} resolve
* @param {?} reject
* @return {?}
*/
(resolve, reject) => {
wx.scanQRCode({
needResult: 1,
scanType: ['qrCode', 'barCode'],
success: (/**
* @param {?} res
* @return {?}
*/
(res) => {
resolve(res.resultStr);
}),
});
}));
return from(p);
}
/**
* @return {?}
*/
userLocation() {
/** @type {?} */
const p = new Promise((/**
* @param {?} resolve
* @param {?} reject
* @return {?}
*/
(resolve, reject) => {
wx.getLocation({
type: 'wgs84',
// 默认为wgs84的gps坐标,如果要返回直接给openLocation用的火星坐标,可传入'gcj02'
/**
* @param {?} res
* @return {?}
*/
success(res) {
if (res.errMsg === 'getLocation:ok') {
/** @type {?} */
const latitude = res.latitude;
// 纬度,浮点数,范围为90 ~ -90
/** @type {?} */
const longitude = res.longitude;
// 经度,浮点数,范围为180 ~ -180。
/** @type {?} */
const address = '微信无address';
resolve({ latitude, longitude, address });
}
},
});
}));
return from(p);
}
/**
* @param {?} bssids
* @return {?}
*/
validateInWifi(bssids) {
alert("小程序暂不支持WIFI验证,请在APP中使用此功能!");
return undefined;
}
/**
* @return {?}
*/
getWifiMac() {
alert("小程序暂不支持获取MAC地址,请在APP中使用此功能!");
return undefined;
}
/**
* @param {?} count
* @return {?}
*/
chooseContacts(count) {
alert("小程序暂不支持获取联系人,请在APP中使用此功能!");
return undefined;
}
/**
* @param {?} targetUserId
* @return {?}
*/
contactDetails(targetUserId) {
alert("小程序暂不支持查询联系人详细信息,请在APP中使用此功能!");
return undefined;
}
/**
* @param {?} count
* @param {?} sourceType
* @return {?}
*/
uploadImage(count, sourceType) {
alert("小程序暂不支持图片上传,请在APP中使用此功能!");
return undefined;
}
/**
* @param {?} url
* @param {?} openType
* @param {?} title
* @param {?} id
* @param {?} type
* @return {?}
*/
openReadWithTimer(url, openType, title, id, type) {
alert("小程序暂不支持读物时间统计,请在APP中使用此功能!");
return undefined;
}
/**
* @param {?} limitMinute
* @return {?}
*/
uploadMovie(limitMinute) {
alert("小程序暂不支持视频上传,请在APP中使用此功能!");
return undefined;
}
/**
* @param {?} url
* @param {?} title
* @return {?}
*/
fileBrowser(url, title) {
alert("小程序暂不支持此功能,请在APP中使用此功能!");
return undefined;
}
/**
* @param {?} ticket
* @param {?} callback
* @return {?}
*/
startSearchBeacons(ticket, callback) {
wx.startSearchBeacons({
ticket: ticket,
complete: callback,
});
}
/**
* @param {?} callback
* @return {?}
*/
stopSearchBeacons(callback) {
wx.stopSearchBeacons({
complete: callback,
});
}
/**
* @param {?} callback
* @return {?}
*/
onSearchBeacons(callback) {
wx.onSearchBeacons({
complete: callback,
});
}
// 封装方法: 获取url中的参数
/**
* @private
* @param {?} name
* @return {?}
*/
getUrlParam(name) {
// 构造一个含有目标参数的正则表达式对象
/** @type {?} */
const reg = new RegExp('(^|&)' + name + '=([^&]*)(&|$)');
/** @type {?} */
const strings = window.location.href.split('?');
// 匹配目标参数
/** @type {?} */
const r = strings[strings.length - 1].match(reg);
if (r != null) {
return unescape(r[2]);
}
return null;
}
}
WechatMicro.decorators = [
{ type: Injectable, args: [{
providedIn: "root",
},] }
];
/** @nocollapse */
WechatMicro.ctorParameters = () => [
{ type: TokenService },
{ type: HttpClient },
{ type: UserService },
{ type: Title },
{ type: undefined, decorators: [{ type: Inject, args: [BASE_CLIENT,] }] }
];
/** @nocollapse */ WechatMicro.ngInjectableDef = i0.ɵɵdefineInjectable({ factory: function WechatMicro_Factory() { return new WechatMicro(i0.ɵɵinject(i1.TokenService), i0.ɵɵinject(i2.HttpClient), i0.ɵɵinject(i3.UserService), i0.ɵɵinject(i4.Title), i0.ɵɵinject(i5.BASE_CLIENT)); }, token: WechatMicro, providedIn: "root" });
if (false) {
/**
* @type {?}
* @private
*/
WechatMicro.prototype.tokenService;
/**
* @type {?}
* @private
*/
WechatMicro.prototype.http;
/**
* @type {?}
* @private
*/
WechatMicro.prototype.user;
/**
* @type {?}
* @private
*/
WechatMicro.prototype.title;
/**
* @type {?}
* @private
*/
WechatMicro.prototype.baseclient;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2VjaGF0Lm1pY3JvLmpzIiwic291cmNlUm9vdCI6Im5nOi8vbmcteXVuemFpLW1vYmlsZS8iLCJzb3VyY2VzIjpbImRldmljZXMvd2VjaGF0Lm1pY3JvLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUczQyxPQUFPLEVBQUUsSUFBSSxFQUFrQixNQUFNLE1BQU0sQ0FBQztBQUM1QyxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDdEQsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBQ25ELE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUNsRCxPQUFPLEVBQUUsV0FBVyxFQUFjLE1BQU0sdUJBQXVCLENBQUM7QUFDaEUsT0FBTyxFQUFFLE1BQU0sRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDbkQsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFDdEQsT0FBTyxFQUFFLEtBQUssRUFBRSxNQUFNLDJCQUEyQixDQUFDOzs7Ozs7OztNQUU1QyxJQUFJLEdBQUc7SUFDWCwyQkFBMkI7SUFDM0IseUJBQXlCO0lBQ3pCLHFCQUFxQjtJQUNyQix1QkFBdUI7SUFDdkIsZUFBZTtJQUNmLGtCQUFrQjtJQUNsQixrQkFBa0I7SUFDbEIsYUFBYTtJQUNiLFlBQVk7SUFDWixrQkFBa0I7SUFDbEIsV0FBVztJQUNYLFlBQVk7SUFDWixXQUFXO0lBQ1gsZ0JBQWdCO0lBQ2hCLGFBQWE7SUFDYixlQUFlO0lBQ2YsYUFBYTtJQUNiLGNBQWM7SUFDZCxhQUFhO0lBQ2IsZUFBZTtJQUNmLGdCQUFnQjtJQUNoQixnQkFBZ0I7SUFDaEIsY0FBYztJQUNkLGFBQWE7SUFDYixnQkFBZ0I7SUFDaEIsZ0JBQWdCO0lBQ2hCLGVBQWU7SUFDZixlQUFlO0lBQ2Ysd0JBQXdCO0lBQ3hCLHdCQUF3QjtJ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QUM7Ozs7Ozs7SUFHTyxXQUFXLENBQUMsSUFBSTs7O2NBRWhCLEdBQUcsR0FBRyxJQUFJLE1BQU0sQ0FBQyxPQUFPLEdBQUcsSUFBSSxHQUFHLGVBQWUsQ0FBQzs7Y0FDbEQsT0FBTyxHQUFHLE1BQU0sQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUM7OztjQUV6QyxDQUFDLEdBQUcsT0FBTyxDQUFDLE9BQU8sQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQztRQUNoRCxJQUFJLENBQUMsSUFBSSxJQUFJLEVBQUU7WUFDYixPQUFPLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztTQUN2QjtRQUNELE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQzs7O1lBck1GLFVBQVUsU0FBQztnQkFDVixVQUFVLEVBQUUsTUFBTTthQUNuQjs7OztZQTNEUSxZQUFZO1lBRVosVUFBVTtZQURWLFdBQVc7WUFLWCxLQUFLOzRDQTREVCxNQUFNLFNBQUMsV0FBVzs7Ozs7Ozs7SUFKbkIsbUNBQWtDOzs7OztJQUNsQywyQkFBd0I7Ozs7O0lBQ3hCLDJCQUF5Qjs7Ozs7SUFDekIsNEJBQW9COzs7OztJQUNwQixpQ0FBbUQiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBCYXNlRGV2aWNlIH0gZnJvbSBcIi4vYmFzZS5kZXZpY2VcIjtcclxuaW1wb3J0IHsgSVNoYXJlLCBJVGl0bGUsIElXaW5kb3csIE5hdmlnYXRpb25CYXIsIFVzZXJMb2NhdGlvbiB9IGZyb20gXCIuL21vZGVsXCI7XHJcbmltcG9ydCB7IEl0b2tlbiB9IGZyb20gXCIuLi9hdXRoXCI7XHJcbmltcG9ydCB7IGZyb20sIE9ic2VydmFibGUsIG9mIH0gZnJvbSBcInJ4anNcIjtcclxuaW1wb3J0IHsgVG9rZW5TZXJ2aWNlIH0gZnJvbSBcIi4uL3Rva2VuL3Rva2VuLnNlcnZpY2VcIjtcclxuaW1wb3J0IHsgVXNlclNlcnZpY2UgfSBmcm9tIFwiLi4vdXNlci91c2VyLnNlcnZpY2VcIjtcclxuaW1wb3J0IHsgSHR0cENsaWVudCB9IGZyb20gXCJAYW5ndWxhci9jb21tb24vaHR0cFwiO1xyXG5pbXBvcnQgeyBCQVNFX0NMSUVOVCwgQmFzZUNsaWVudCB9IGZyb20gXCIuLi9jbGllbnQvYmFzZS5jbGllbnRcIjtcclxuaW1wb3J0IHsgSW5qZWN0LCBJbmplY3RhYmxlIH0gZnJvbSBcIkBhbmd1bGFyL2NvcmVcIjtcclxuaW1wb3J0IHsgcHJlbG9hZGVyRmluaXNoZWQgfSBmcm9tIFwiLi4vYXV0aC9wcmVsb2FkZXJcIjtcclxuaW1wb3J0IHsgVGl0bGUgfSBmcm9tIFwiQGFuZ3VsYXIvcGxhdGZvcm0tYnJvd3NlclwiO1xyXG5cclxuY29uc3QgYXBpcyA9IFtcclxuICBcInVwZGF0ZUFwcE1lc3NhZ2VTaGFyZURhdGFcIixcclxuICBcInVwZGF0ZVRpbWVsaW5lU2hhcmVEYXRhXCIsXHJcbiAgXCJvbk1lbnVTaGFyZVRpbWVsaW5lXCIsXHJcbiAgXCJvbk1lbnVTaGFyZUFwcE1lc3NhZ2VcIixcclxuICBcIm9uTWVudVNoYXJlUVFcIixcclxuICBcIm9uTWVudVNoYXJlV2VpYm9cIixcclxuICBcIm9uTWVudVNoYXJlUVpvbmVcIixcclxuICBcInN0YXJ0UmVjb3JkXCIsXHJcbiAgXCJzdG9wUmVjb3JkXCIsXHJcbiAgXCJvblZvaWNlUmVjb3JkRW5kXCIsXHJcbiAgXCJwbGF5Vm9pY2VcIixcclxuICBcInBhdXNlVm9pY2VcIixcclxuICBcInN0b3BWb2ljZVwiLFxyXG4gIFwib25Wb2ljZVBsYXlFbmRcIixcclxuICBcInVwbG9hZFZvaWNlXCIsXHJcbiAgXCJkb3dubG9hZFZvaWNlXCIsXHJcbiAgXCJjaG9vc2VJbWFnZVwiLFxyXG4gIFwicHJldmlld0ltYWdlXCIsXHJcbiAgXCJ1cGxvYWRJbWFnZVwiLFxyXG4gIFwiZG93bmxvYWRJbWFnZVwiLFxyXG4gIFwidHJhbnNsYXRlVm9pY2VcIixcclxuICBcImdldE5ldHdvcmtUeXBlXCIsXHJcbiAgXCJvcGVuTG9jYXRpb25cIixcclxuICBcImdldExvY2F0aW9uXCIsXHJcbiAgXCJoaWRlT3B0aW9uTWVudVwiLFxyXG4gIFwic2hvd09wdGlvbk1lbnVcIixcclxuICBcImhpZGVNZW51SXRlbXNcIixcclxuICBcInNob3dNZW51SXRlbXNcIixcclxuICBcImhpZGVBbGxOb25CYXNlTWVudUl0ZW1cIixcclxuICBcInNob3dBbGxOb25CYXNlTWVudUl0ZW1cIixcclxuICBcImNsb3NlV2luZG93XCIsXHJcbiAgXCJzY2FuUVJDb2RlXCIsXHJcbiAgXCJjaG9vc2VXWFBheVwiLFxyXG4gIFwib3BlblByb2R1Y3RTcGVjaWZpY1ZpZXdcIixcclxuICBcImFkZENhcmRcIixcclxuICBcImNob29zZUNhcmRcIixcclxuICBcIm9wZW5DYXJkXCIsXHJcbl07XHJcblxyXG5jb25zdCBvcGVuVGFncyA9IFtcclxuICAnd3gtb3Blbi1sYXVuY2gtd2VhcHAnLFxyXG4gICd3eC1vcGVuLWxhdW5jaC1hcHAnLFxyXG4gICd3eC1vcGVuLXN1YnNjcmliZScsXHJcbiAgJ3d4LW9wZW4tYXVkaW8nXHJcbl07XHJcblxyXG5kZWNsYXJlIGxldCB3eDtcclxuXHJcbkBJbmplY3RhYmxlKHtcclxuICBwcm92aWRlZEluOiBcInJvb3RcIixcclxufSlcclxuZXhwb3J0IGNsYXNzIFdlY2hhdE1pY3JvIGV4dGVuZHMgQmFzZURldmljZSB7XHJcbiAgY29uc3RydWN0b3IoXHJcbiAgICBwcml2YXRlIHRva2VuU2VydmljZTogVG9rZW5TZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSBodHRwOiBIdHRwQ2xpZW50LFxyXG4gICAgcHJpdmF0ZSB1c2VyOiBVc2VyU2VydmljZSxcclxuICAgIHByaXZhdGUgdGl0bGU6IFRpdGxlLFxyXG4gICAgQEluamVjdChCQVNFX0NMSUVOVCkgcHJpdmF0ZSBiYXNlY2xpZW50OiBCYXNlQ2xpZW50XHJcbiAgKSB7XHJcbiAgICBzdXBlcigpO1xyXG4gIH1cclxuXHJcbiAgYXV0aCgpOiBQcm9taXNlPGFueT4ge1xyXG4gICAgaWYgKHRoaXMuYmFzZWNsaWVudC53ZWNoYXRNaWNybyAmJiB0aGlzLmJhc2VjbGllbnQud2VjaGF0TWljcm8uYXV0aCA9PT0gZmFsc2UpIHtcclxuICAgICAgcmV0dXJuIG5ldyBQcm9taXNlPGFueT4oKHJlc29sdmUsIHJlamVjdCkgPT4ge1xyXG4gICAgICAgIHByZWxvYWRlckZpbmlzaGVkKCk7XHJcbiAgICAgICAgcmVzb2x2ZSh0cnVlKTtcclxuICAgICAgfSk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gbmV3IFByb21pc2U8YW55PigocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XHJcbiAgICAgIGNvbnN0IHRva2VuSW5mbzogYW55ID0ge307XHJcbiAgICAgIHRva2VuSW5mby5hY2NvdW50ID0gdGhpcy5nZXRVcmxQYXJhbSgnYWNjb3VudCcpO1xyXG4gICAgICB0b2tlbkluZm8uYWNjZXNzVG9rZW4gPSB0aGlzLmdldFVybFBhcmFtKCdhY2Nlc3NUb2tlbicpO1xyXG4gICAgICB0b2tlbkluZm8udXNlcklkID0gdGhpcy5nZXRVcmxQYXJhbSgndXNlcklkJyk7XHJcbiAgICAgIHRva2VuSW5mby50b2tlblR5cGUgPSAnYmVhcmVyJztcclxuICAgICAgdGhpcy50b2tlblNlcnZpY2Uuc2V0KHRva2VuSW5mbyBhcyBhbnkpO1xyXG4gICAgICB0aGlzLmh0dHBcclxuICAgICAgICAuZ2V0KGAke3RoaXMuYmFzZWNsaWVudC5nYXRld2F5fS9hdXRoL3VzZXJgKVxyXG4gICAgICAgIC5zdWJzY3JpYmUoKHJlc3BvbnNlOiBhbnkpID0+IHtcclxuICAgICAgICAgIC8vIOiuvue9rnVzZXJcclxuICAgICAgICAgIHRoaXMudXNlci5zZXQoeyAuLi5yZXNwb25zZS5wcmluY2lwYWwsIHRlbmFudElkOiByZXNwb25zZS50ZW5hbnRJZCB9KTtcclxuICAgICAgICAgIHRoaXMuZ2VuZXJhdGVXZWNoYXRDb25maWcoKTtcclxuICAgICAgICAgIC8vIOWKoOi9vee7k+adn1xyXG4gICAgICAgICAgcHJlbG9hZGVyRmluaXNoZWQoKTtcclxuICAgICAgICAgIHJlc29sdmUodHJ1ZSk7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIGdlbmVyYXRlV2VjaGF0Q29uZmlnKCk6IHZvaWQge1xyXG4gICAgdGhpcy5odHRwXHJcbiAgICAgIC5nZXQoYCR7dGhpcy5iYXNlY2xpZW50LmdhdGV3YXl9L3dlY2hhdC9tcC9qc3Nkaz91cmw9JHtlbmNvZGVVUklDb21wb25lbnQod2luZG93LmxvY2F0aW9uLmhyZWYpfWApXHJcbiAgICAgIC5zdWJzY3JpYmUoKHJlc3BvbnNlOiBhbnkpID0+IHtcclxuICAgICAgICB3eC5jb25maWcoe1xyXG4gICAgICAgICAgZGVidWc6IGZhbHNlLCAvLyDlvIDlkK/osIPor5XmqKHlvI8s6LCD55So55qE5omA5pyJYXBp55qE6L+U5Zue5YC85Lya5Zyo5a6i5oi356uvYWxlcnTlh7rmnaXvvIzoi6XopoHmn6XnnIvkvKDlhaXnmoTlj4LmlbDvvIzlj6/ku6XlnKhwY+err+aJk+W8gO+8jOWPguaVsOS/oeaBr+S8mumAmui/h2xvZ+aJk+WHuu+8jOS7heWcqHBj56uv5pe25omN5Lya5omT5Y2w44CCXHJcbiAgICAgICAgICBhcHBJZDogcmVzcG9uc2UuYXBwSWQsIC8vIOW/heWhq++8jOWFrOS8l+WPt+eahOWUr+S4gOagh+ivhlxyXG4gICAgICAgICAgdGltZXN0YW1wOiByZXNwb25zZS50aW1lc3RhbXAsIC8vIOW/heWhq++8jOeUn+aIkOetvuWQjeeahOaXtumXtOaIs1xyXG4gICAgICAgICAgbm9uY2VTdHI6IHJlc3BvbnNlLm5vbmNlU3RyLCAvLyDlv4XloavvvIznlJ/miJDnrb7lkI3nmoTpmo/mnLrkuLJcclxuICAgICAgICAgIHNpZ25hdHVyZTogcmVzcG9uc2Uuc2lnbmF0dXJlLCAvLyDlv4XloavvvIznrb7lkI1cclxuICAgICAgICAgIGpzQXBpTGlzdDogYXBpcywgLy8g5b+F5aGr77yM6ZyA6KaB5L2/55So55qESlPmjqXlj6PliJfooahcclxuICAgICAgICAgIG9wZW5UYWdMaXN0OiBvcGVuVGFncyAvLyDlj6/pgInvvIzpnIDopoHkvb/nlKjnmoTlvIDmlL7moIfnrb7liJfooajvvIzkvovlpoJbJ3d4LW9wZW4tbGF1bmNoLWFwcCddXHJcbiAgICAgICAgfSk7XHJcbiAgICAgIH0pO1xyXG4gICAgd3gucmVhZHkoKCkgPT4ge1xyXG4gICAgICAvLyBjb25maWfkv6Hmga/pqozor4HlkI7kvJrmiafooYxyZWFkeeaWueazle+8jOaJgOacieaOpeWPo+iwg+eUqOmDveW/hemhu+WcqGNvbmZpZ+aOpeWPo+iOt+W+l+e7k+aenOS5i+WQju+8jGNvbmZpZ+aYr+S4gOS4quWuouaIt+err+eahOW8guatpeaTjeS9nO+8jFxyXG4gICAgICAvLyDmiYDku6XlpoLmnpzpnIDopoHlnKjpobXpnaLliqDovb3ml7blsLHosIPnlKjnm7jlhbPmjqXlj6PvvIzliJnpobvmiornm7jlhbPmjqXlj6PmlL7lnKhyZWFkeeWHveaVsOS4reiwg+eUqOadpeehruS/neato+ehruaJp+ihjOOAguWvueS6jueUqOaIt+inpuWPkeaXtuaJjeiwg+eUqOeahOaOpeWPo++8jOWImeWPr+S7peebtOaOpeiwg+eUqO+8jOS4jemcgOimgeaUvuWcqHJlYWR55Ye95pWw5Lit44CCXHJcbiAgICAgIGNvbnNvbGUubG9nKCflvq7kv6Fqc3Nka+WIneWni+WMluWujOaIkC4nKTtcclxuICAgIH0pO1xyXG5cclxuICAgIHd4LmVycm9yKChyZXMpID0+IHtcclxuICAgICAgLy8gY29uZmln5L+h5oGv6aqM6K+B5aSx6LSl5Lya5omn6KGMZXJyb3Llh73mlbDvvIzlpoLnrb7lkI3ov4fmnJ/lr7zoh7Tpqozor4HlpLHotKXvvIzlhbfkvZPplJnor6/kv6Hmga/lj6/ku6XmiZPlvIBjb25maWfnmoRkZWJ1Z+aooeW8j+afpeeci++8jOS5n+WPr+S7peWcqOi/lOWbnueahHJlc+WPguaVsOS4reafpeeci++8jOWvueS6jlNQQeWPr+S7peWcqOi/memHjOabtOaWsOetvuWQjeOAglxyXG4gICAgICBjb25zb2xlLmxvZygn5b6u5L+hanNzZGvliJ3lp4vljJblpLHotKU6JywgcmVzKTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgb3BlbldpbmRvdyhpd2luZG93OiBJV2luZG93KTogdm9pZCB7XHJcbiAgICB3aW5kb3cubG9jYXRpb24uaHJlZiA9IGl3aW5kb3cudXJsO1xyXG4gIH1cclxuXHJcbiAgc2V0VGl0bGUoaXRpdGxlOiBJVGl0bGUpOiB2b2lkIHtcclxuICAgIHRoaXMudGl0bGUuc2V0VGl0bGUoaXRpdGxlLnRpdGxlKTtcclxuICB9XHJcblxyXG4gIHNldE5hdmlnYXRpb25CYXIobmF2aWdhdGlvbkJhcjogTmF2aWdhdGlvbkJhcik6IHZvaWQge1xyXG4gICAgYWxlcnQoXCLlsI/nqIvluo/mmoLkuI3mlK/mjIHmlL7nva7mjInpkq4s6K+35ZyoQVBQ5Lit5L2/55So5q2k5Yqf6IO9IVwiKTtcclxuICB9XHJcblxyXG4gIHNoYXJlKGlzaGFyZTogSVNoYXJlKTogdm9pZCB7XHJcbiAgICBhbGVydChcIuWwj+eoi+W6j+aaguS4jeaUr+aMgeWIhuS6qyzor7flnKhBUFDkuK3kvb/nlKjmraTlip/og70hXCIpO1xyXG4gIH1cclxuXHJcbiAgZ2V0VG9rZW4oKTogSXRva2VuIHtcclxuICAgIGNvbnN0IGl0b2tlbjogSXRva2VuID0ge1xyXG4gICAgICBhY2Nlc3NUb2tlbjogdGhpcy50b2tlblNlcnZpY2UuZ2V0KCkuYWNjZXNzVG9rZW4sXHJcbiAgICAgIHRva2VuVHlwZTogbnVsbCxcclxuICAgICAgdG9rZW5EYXRhTGluZTogbnVsbCxcclxuICAgICAgc2NvcGU6IG51bGwsXHJcbiAgICB9O1xyXG4gICAgcmV0dXJuIGl0b2tlbjtcclxuICB9XHJcblxyXG4gIHNjYW5Db2RlKCk6IE9ic2VydmFibGU8c3RyaW5nPiB7XHJcbiAgICBjb25zdCBwID0gbmV3IFByb21pc2U8c3RyaW5nPigocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XHJcbiAgICAgIHd4LnNjYW5RUkNvZGUoe1xyXG4gICAgICAgIG5lZWRSZXN1bHQ6IDEsXHJcbiAgICAgICAgc2NhblR5cGU6IFsncXJDb2RlJywgJ2JhckNvZGUnXSxcclxuICAgICAgICBzdWNjZXNzOiAocmVzOiBhbnkpID0+IHtcclxuICAgICAgICAgIHJlc29sdmUocmVzLnJlc3VsdFN0cik7XHJcbiAgICAgICAgfSxcclxuICAgICAgfSk7XHJcbiAgICB9KTtcclxuICAgIHJldHVybiBmcm9tKHApO1xyXG4gIH1cclxuXHJcbiAgdXNlckxvY2F0aW9uKCk6IE9ic2VydmFibGU8VXNlckxvY2F0aW9uPiB7XHJcbiAgICBjb25zdCBwID0gbmV3IFByb21pc2U8VXNlckxvY2F0aW9uPigocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XHJcbiAgICAgIHd4LmdldExvY2F0aW9uKHtcclxuICAgICAgICB0eXBlOiAnd2dzODQnLCAvLyDpu5jorqTkuLp3Z3M4NOeahGdwc+WdkOagh++8jOWmguaenOimgei/lOWbnuebtOaOpee7mW9wZW5Mb2NhdGlvbueUqOeahOeBq+aYn+WdkOagh++8jOWPr+S8oOWFpSdnY2owMidcclxuICAgICAgICBzdWNjZXNzKHJlczogYW55KSB7XHJcbiAgICAgICAgICBpZiAocmVzLmVyck1zZyA9PT0gJ2dldExvY2F0aW9uOm9rJykge1xyXG4gICAgICAgICAgICBjb25zdCBsYXRpdHVkZSA9IHJlcy5sYXRpdHVkZTsgLy8g57qs5bqm77yM5rWu54K55pWw77yM6IyD5Zu05Li6OTAgfiAtOTBcclxuICAgICAgICAgICAgY29uc3QgbG9uZ2l0dWRlID0gcmVzLmxvbmdpdHVkZTsgLy8g57uP5bqm77yM5rWu54K55pWw77yM6IyD5Zu05Li6MTgwIH4gLTE4MOOAglxyXG4gICAgICAgICAgICBjb25zdCBhZGRyZXNzID0gJ+W+ruS/oeaXoGFkZHJlc3MnO1xyXG4gICAgICAgICAgICByZXNvbHZlKHtsYXRpdHVkZSwgbG9uZ2l0dWRlLCBhZGRyZXNzfSk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSxcclxuICAgICAgfSk7XHJcbiAgICB9KTtcclxuICAgIHJldHVybiBmcm9tKHApO1xyXG4gIH1cclxuXHJcbiAgdmFsaWRhdGVJbldpZmkoYnNzaWRzOiBzdHJpbmdbXSk6IE9ic2VydmFibGU8Ym9vbGVhbj4ge1xyXG4gICAgYWxlcnQoXCLlsI/nqIvluo/mmoLkuI3mlK/mjIFXSUZJ6aqM6K+BLOivt+WcqEFQUOS4reS9v+eUqOatpOWKn+iDvSFcIik7XHJcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xyXG4gIH1cclxuXHJcbiAgZ2V0V2lmaU1hYygpOiBPYnNlcnZhYmxlPHN0cmluZz4ge1xyXG4gICAgYWxlcnQoXCLlsI/nqIvluo/mmoLkuI3mlK/mjIHojrflj5ZNQUPlnLDlnYAs6K+35ZyoQVBQ5Lit5L2/55So5q2k5Yqf6IO9IVwiKTtcclxuICAgIHJldHVybiB1bmRlZmluZWQ7XHJcbiAgfVxyXG5cclxuICBjaG9vc2VDb250YWN0cyhjb3VudDogbnVtYmVyKTogT2JzZXJ2YWJsZTxhbnk+IHtcclxuICAgIGFsZXJ0KFwi5bCP56iL5bqP5pqC5LiN5pSv5oyB6I635Y+W6IGU57O75Lq6LOivt+WcqEFQUOS4reS9v+eUqOatpOWKn+iDvSFcIik7XHJcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xyXG4gIH1cclxuXHJcbiAgY29udGFjdERldGFpbHModGFyZ2V0VXNlcklkOiBzdHJpbmcpOiBPYnNlcnZhYmxlPGFueT4ge1xyXG4gICAgYWxlcnQoXCLlsI/nqIvluo/mmoLkuI3mlK/mjIHmn6Xor6LogZTns7vkurror6bnu4bkv6Hmga8s6K+35ZyoQVBQ5Lit5L2/55So5q2k5Yqf6IO9IVwiKTtcclxuICAgIHJldHVybiB1bmRlZmluZWQ7XHJcbiAgfVxyXG5cclxuICB1cGxvYWRJbWFnZShjb3VudDogbnVtYmVyLCBzb3VyY2VUeXBlOiBhbnkpOiBPYnNlcnZhYmxlPGFueT4ge1xyXG4gICAgYWxlcnQoXCLlsI/nqIvluo/mmoLkuI3mlK/mjIHlm77niYfkuIrkvKAs6K+35ZyoQVBQ5Lit5L2/55So5q2k5Yqf6IO9IVwiKTtcclxuICAgIHJldHVybiB1bmRlZmluZWQ7XHJcbiAgfVxyXG5cclxuICBvcGVuUmVhZFdpdGhUaW1lcihcclxuICAgIHVybDogYW55LFxyXG4gICAgb3BlblR5cGU6IGFueSxcclxuICAgIHRpdGxlOiBhbnksXHJcbiAgICBpZDogYW55LFxyXG4gICAgdHlwZTogYW55XHJcbiAgKTogT2JzZXJ2YWJsZTxhbnk+IHtcclxuICAgIGFsZXJ0KFwi5bCP56iL5bqP5pqC5LiN5pSv5oyB6K+754mp5pe26Ze057uf6K6hLOivt+WcqEFQUOS4reS9v+eUqOatpOWKn+iDvSFcIik7XHJcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xyXG4gIH1cclxuXHJcbiAgdXBsb2FkTW92aWUobGltaXRNaW51dGU6IG51bWJlcik6IE9ic2VydmFibGU8YW55PiB7XHJcbiAgICBhbGVydChcIuWwj+eoi+W6j+aaguS4jeaUr+aMgeinhumikeS4iuS8oCzor7flnKhBUFDkuK3kvb/nlKjmraTlip/og70hXCIpO1xyXG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcclxuICB9XHJcblxyXG4gIGZpbGVCcm93c2VyKHVybDogc3RyaW5nLCB0aXRsZTogc3RyaW5nKTogT2JzZXJ2YWJsZTxhbnk+IHtcclxuICAgIGFsZXJ0KFwi5bCP56iL5bqP5pqC5LiN5pSv5oyB5q2k5Yqf6IO9LOivt+WcqEFQUOS4reS9v+eUqOatpOWKn+iDvSFcIik7XHJcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xyXG4gIH1cclxuXHJcbiAgc3RhcnRTZWFyY2hCZWFjb25zKHRpY2tldDogc3RyaW5nLCBjYWxsYmFjazogKGFyZ3Y6IGFueSkgPT4gdm9pZCk6IHZvaWQge1xyXG4gICAgd3guc3RhcnRTZWFyY2hCZWFjb25zKHtcclxuICAgICAgdGlja2V0OiB0aWNrZXQsXHJcbiAgICAgIGNvbXBsZXRlOiBjYWxsYmFjayxcclxuICAgIH0pO1xyXG4gIH1cclxuICBzdG9wU2VhcmNoQmVhY29ucyhjYWxsYmFjazogKGFyZ3Y6IGFueSkgPT4gdm9pZCk6IHZvaWQge1xyXG4gICAgd3guc3RvcFNlYXJjaEJlYWNvbnMoe1xyXG4gICAgICBjb21wbGV0ZTogY2FsbGJhY2ssXHJcbiAgICB9KTtcclxuICB9XHJcbiAgb25TZWFyY2hCZWFjb25zKGNhbGxiYWNrOiAoYXJndjogYW55KSA9PiB2b2lkKTogdm9pZCB7XHJcbiAgICB3eC5vblNlYXJjaEJlYWNvbnMoe1xyXG4gICAgICBjb21wbGV0ZTogY2FsbGJhY2ssXHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIC8vIOWwgeijheaWueazlTog6I635Y+WdXJs5Lit55qE5Y+C5pWwXHJcbiAgcHJpdmF0ZSBnZXRVcmxQYXJhbShuYW1lKTogc3RyaW5nIHtcclxuICAgIC8vIOaehOmAoOS4gOS4quWQq+acieebruagh+WPguaVsOeahOato+WImeihqOi+vuW8j+WvueixoVxyXG4gICAgY29uc3QgcmVnID0gbmV3IFJlZ0V4cCgnKF58JiknICsgbmFtZSArICc9KFteJl0qKSgmfCQpJyk7XHJcbiAgICBjb25zdCBzdHJpbmdzID0gd2luZG93LmxvY2F0aW9uLmhyZWYuc3BsaXQoJz8nKTtcclxuICAgIC8vIOWMuemFjeebruagh+WPguaVsFxyXG4gICAgY29uc3QgciA9IHN0cmluZ3Nbc3RyaW5ncy5sZW5ndGggLSAxXS5tYXRjaChyZWcpO1xyXG4gICAgaWYgKHIgIT0gbnVsbCkge1xyXG4gICAgICByZXR1cm4gdW5lc2NhcGUoclsyXSk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gbnVsbDtcclxuICB9XHJcbn1cclxuIl19