ntk-cms-api
Version:
Ntk Cms Api And Model For Typscript
230 lines • 33.2 kB
JavaScript
import { Injectable } from '@angular/core';
import { BehaviorSubject } from 'rxjs';
import { map } from 'rxjs/operators';
import { AuthEmailConfirmDtoModel } from '../../models/dto/core-main/authEmailConfirmDtoModel';
import { AuthMobileConfirmDtoModel } from '../../models/dto/core-main/authMobileConfirmDtoModel';
import { AuthRenewTokenModel } from '../../models/dto/core-main/authRenewTokenModel';
import { AuthUserSignOutModel } from '../../models/dto/core-main/authUserSignOutModel';
import { FilterModel } from '../../models/entity/base/filterModel';
import { TokenDeviceModel } from '../../models/entity/core-token/tokenDeviceModel';
import { TokenInfoModel } from '../../models/entity/core-token/tokenInfoModel';
import { ApiServerBase } from '../base/apiServerBase.service';
import * as i0 from "@angular/core";
export class CoreAuthService extends ApiServerBase {
constructor() {
super(...arguments);
this.tokenInfoSubject = new BehaviorSubject(new TokenInfoModel);
this.tokenDeviceSubject = new BehaviorSubject(new TokenDeviceModel);
}
getModuleControllerUrl() {
return 'auth';
}
SetCurrentTokenInfo(model) {
if (model == null) {
this.removeToken();
//this.cmsApiStore.setState({ type: SET_TOKEN_INFO, payload: new TokenInfoModel() });
this.tokenInfoSubject.next(new TokenInfoModel());
return;
}
if (model.token && model.deviceToken && model.refreshToken) {
this.setToken(model.token, model.deviceToken, model.refreshToken);
}
else if (model.token && model.deviceToken) {
this.setToken(model.token, model.deviceToken, '');
}
else if (model.token) {
this.setToken(model.token, '', '');
}
else if (model.deviceToken) {
this.setToken('', model.deviceToken, '');
}
//this.cmsApiStore.setState({ type: SET_TOKEN_INFO, payload: model });
this.tokenInfoSubject.next(model);
}
SetCurrentDeviceTokenInfo(model) {
if (model == null) {
this.removeToken();
//this.cmsApiStore.setState({ type: SET_DEVICE_TOKEN_INFO, payload: new TokenDeviceModel() });
this.tokenDeviceSubject.next(new TokenDeviceModel());
return;
}
if (model.deviceToken) {
this.setDeviceToken(model.deviceToken);
}
//this.cmsApiStore.setState({ type: SET_DEVICE_TOKEN_INFO, payload: model });
this.tokenDeviceSubject.next(model);
}
CurrentTokenInfoRenew() {
this.ServiceCurrentToken().subscribe((next) => {
this.SetCurrentTokenInfo(next.item);
}, (error) => {
});
}
ServiceCurrentToken() {
return this.http.get(this.getBaseUrl() + this.getModuleControllerUrl() + '/CurrentToken', { headers: this.getHeaders() }).pipe(
// catchError(this.handleError)
map((ret) => {
this.setToken(ret.item.token, ret.item.deviceToken, '');
return ret;
}));
}
ServiceCurrentDeviceToken() {
return this.http.get(this.getBaseUrl() + this.getModuleControllerUrl() + '/CurrentDeviceToken', { headers: this.getHeaders() }).pipe(
// catchError(this.handleError)
map((ret) => {
this.setDeviceToken(ret.item.deviceToken);
return ret;
}));
}
ServiceCaptcha() {
return this.http.get(this.getBaseUrl() + this.getModuleControllerUrl() + '/captcha').pipe(
// catchError(this.handleError)
map((ret) => {
return ret;
}));
}
ServiceGetTokenDevice(model) {
return this.http.post(this.getBaseUrl() + this.getModuleControllerUrl() + '/GetTokenDevice/', model).pipe(
// catchError(this.handleError)
map((ret) => {
this.setDeviceToken(ret.item.deviceToken);
return ret;
}));
}
ServiceSetTokenDeviceNotificationId(model) {
return this.http.post(this.getBaseUrl() + this.getModuleControllerUrl() + '/SetTokenDeviceNotificationId/', model).pipe(
// catchError(this.handleError)
map((ret) => {
return ret;
}));
}
ServiceSignupUser(model) {
return this.http.post(this.getBaseUrl() + this.getModuleControllerUrl() + '/signup', model).pipe(
// catchError(this.handleError)
map((ret) => {
return ret;
}));
}
ServiceSigninUser(model) {
return this.http.post(this.getBaseUrl() + this.getModuleControllerUrl() + '/signin', model).pipe(
// catchError(this.handleError)
map((ret) => {
if (ret.isSuccess) {
this.SetCurrentTokenInfo(ret.item);
}
return ret;
}));
}
ServiceSigninUserBySMS(model) {
return this.http.post(this.getBaseUrl() + this.getModuleControllerUrl() + '/signInBySms', model).pipe(
// catchError(this.handleError)
map((ret) => {
if (ret.isSuccess) {
this.SetCurrentTokenInfo(ret.item);
}
return ret;
}));
}
ServiceRenewToken(model) {
if (model == null) {
model = new AuthRenewTokenModel();
}
return this.http
.post(this.getBaseUrl() + this.getModuleControllerUrl() + '/renewToken', model, {
headers: this.getHeaders(),
})
.pipe(
// catchError(this.handleError)
map((ret) => {
if (ret.isSuccess) {
this.SetCurrentTokenInfo(ret.item);
}
return ret;
}));
}
ServiceChangePassword(model) {
return this.http
.post(this.getBaseUrl() + this.getModuleControllerUrl() + '/changePassword', model, {
headers: this.getHeaders(),
})
.pipe(
// catchError(this.handleError)
map((ret) => {
return ret;
}));
}
ServiceForgetPassword(model) {
return this.http.post(this.getBaseUrl() + this.getModuleControllerUrl() + '/forgetPassword', model).pipe(
// catchError(this.handleError)
map((ret) => {
return ret;
}));
}
ServiceForgetPasswordEntryPinCode(model) {
return this.http.post(this.getBaseUrl() + this.getModuleControllerUrl() + '/ForgetPasswordEntryPinCode', model).pipe(
// catchError(this.handleError)
map((ret) => {
return ret;
}));
}
ServiceLogout(model = new AuthUserSignOutModel()) {
return this.http
.post(this.getBaseUrl() + this.getModuleControllerUrl() + '/signOut', model, {
headers: this.getHeaders(),
})
.pipe(
// catchError(this.handleError)
map((ret) => {
this.SetCurrentTokenInfo(null);
return ret;
}));
}
ServiceExistToken(model) {
if (model == null) {
model = new FilterModel();
}
return this.http
.post(this.getBaseUrl() + this.getModuleControllerUrl() + '/existToken', model, {
headers: this.getHeaders(),
})
.pipe(
// catchError(this.handleError)
map((ret) => {
return ret;
}));
}
ServiceMobileConfirm(model) {
if (model == null) {
model = new AuthMobileConfirmDtoModel();
}
return this.http
.post(this.getBaseUrl() + this.getModuleControllerUrl() + '/mobileConfirm', model, {
headers: this.getHeaders(),
})
.pipe(
// catchError(this.handleError)
map((ret) => {
return ret;
}));
}
ServiceEmailConfirm(model) {
if (model == null) {
model = new AuthEmailConfirmDtoModel();
}
return this.http
.post(this.getBaseUrl() + this.getModuleControllerUrl() + '/emailConfirm', model, {
headers: this.getHeaders(),
})
.pipe(
// catchError(this.handleError)
map((ret) => {
return ret;
}));
}
}
CoreAuthService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: CoreAuthService, deps: null, target: i0.ɵɵFactoryTarget.Injectable });
CoreAuthService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: CoreAuthService });
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: CoreAuthService, decorators: [{
type: Injectable
}] });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29yZUF1dGguc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL250ay1jbXMtYXBpL3NyYy9saWIvc2VydmljZS9jb3JlLXRva2VuL2NvcmVBdXRoLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUMzQyxPQUFPLEVBQUUsZUFBZSxFQUFjLE1BQU0sTUFBTSxDQUFDO0FBQ25ELE9BQU8sRUFBRSxHQUFHLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUNyQyxPQUFPLEVBQUUsd0JBQXdCLEVBQUUsTUFBTSxxREFBcUQsQ0FBQztBQUMvRixPQUFPLEVBQUUseUJBQXlCLEVBQUUsTUFBTSxzREFBc0QsQ0FBQztBQUNqRyxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxnREFBZ0QsQ0FBQztBQU1yRixPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSxpREFBaUQsQ0FBQztBQU92RixPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sc0NBQXNDLENBQUM7QUFDbkUsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0saURBQWlELENBQUM7QUFDbkYsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLCtDQUErQyxDQUFDO0FBQy9FLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSwrQkFBK0IsQ0FBQzs7QUFJOUQsTUFBTSxPQUFPLGVBQWdCLFNBQVEsYUFBYTtJQURsRDs7UUFFUyxxQkFBZ0IsR0FBa0MsSUFBSSxlQUFlLENBQUMsSUFBSSxjQUFjLENBQUMsQ0FBQztRQUMxRix1QkFBa0IsR0FBb0MsSUFBSSxlQUFlLENBQUMsSUFBSSxnQkFBZ0IsQ0FBQyxDQUFDO0tBeU94RztJQXhPQyxzQkFBc0I7UUFDcEIsT0FBTyxNQUFNLENBQUM7SUFDaEIsQ0FBQztJQUNELG1CQUFtQixDQUFDLEtBQTRCO1FBQzlDLElBQUksS0FBSyxJ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RTtTQUMzQixDQUFDO2FBQ0QsSUFBSTtRQUNILCtCQUErQjtRQUMvQixHQUFHLENBQUMsQ0FBQyxHQUFRLEVBQUUsRUFBRTtZQUNmLE9BQU8sR0FBRyxDQUFDO1FBQ2IsQ0FBQyxDQUFDLENBQ0gsQ0FBQztJQUNOLENBQUM7OzZHQTFPVSxlQUFlO2lIQUFmLGVBQWU7NEZBQWYsZUFBZTtrQkFEM0IsVUFBVSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdGFibGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgQmVoYXZpb3JTdWJqZWN0LCBPYnNlcnZhYmxlIH0gZnJvbSAncnhqcyc7XHJcbmltcG9ydCB7IG1hcCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcclxuaW1wb3J0IHsgQXV0aEVtYWlsQ29uZmlybUR0b01vZGVsIH0gZnJvbSAnLi4vLi4vbW9kZWxzL2R0by9jb3JlLW1haW4vYXV0aEVtYWlsQ29uZmlybUR0b01vZGVsJztcclxuaW1wb3J0IHsgQXV0aE1vYmlsZUNvbmZpcm1EdG9Nb2RlbCB9IGZyb20gJy4uLy4uL21vZGVscy9kdG8vY29yZS1tYWluL2F1dGhNb2JpbGVDb25maXJtRHRvTW9kZWwnO1xyXG5pbXBvcnQgeyBBdXRoUmVuZXdUb2tlbk1vZGVsIH0gZnJvbSAnLi4vLi4vbW9kZWxzL2R0by9jb3JlLW1haW4vYXV0aFJlbmV3VG9rZW5Nb2RlbCc7XHJcbmltcG9ydCB7IEF1dGhVc2VyQ2hhbmdlUGFzc3dvcmRNb2RlbCB9IGZyb20gJy4uLy4uL21vZGVscy9kdG8vY29yZS1tYWluL2F1dGhVc2VyQ2hhbmdlUGFzc3dvcmRNb2RlbCc7XHJcbmltcG9ydCB7IEF1dGhVc2VyRm9yZ2V0UGFzc3dvcmRFbnRyeVBpbkNvZGVNb2RlbCB9IGZyb20gJy4uLy4uL21vZGVscy9kdG8vY29yZS1tYWluL2F1dGhVc2VyRm9yZ2V0UGFzc3dvcmRFbnRyeVBpbkNvZGVNb2RlbCc7XHJcbmltcG9ydCB7IEF1dGhVc2VyRm9yZ2V0UGFzc3dvcmRNb2RlbCB9IGZyb20gJy4uLy4uL21vZGVscy9kdG8vY29yZS1tYWluL2F1dGhVc2VyRm9yZ2V0UGFzc3dvcmRNb2RlbCc7XHJcbmltcG9ydCB7IEF1dGhVc2VyU2lnbkluQnlTbXNEdG9Nb2RlbCB9IGZyb20gJy4uLy4uL21vZGVscy9kdG8vY29yZS1tYWluL2F1dGhVc2VyU2lnbkluQnlTbXNEdG9Nb2RlbCc7XHJcbmltcG9ydCB7IEF1dGhVc2VyU2lnbkluTW9kZWwgfSBmcm9tICcuLi8uLi9tb2RlbHMvZHRvL2NvcmUtbWFpbi9hdXRoVXNlclNpZ25Jbk1vZGVsJztcclxuaW1wb3J0IHsgQXV0aFVzZXJTaWduT3V0TW9kZWwgfSBmcm9tICcuLi8uLi9tb2RlbHMvZHRvL2NvcmUtbWFpbi9hdXRoVXNlclNpZ25PdXRNb2RlbCc7XHJcbmltcG9ydCB7IEF1dGhVc2VyU2lnblVwTW9kZWwgfSBmcm9tICcuLi8uLi9tb2RlbHMvZHRvL2NvcmUtbWFpbi9hdXRoVXNlclNpZ25VcE1vZGVsJztcclxuaW1wb3J0IHsgVG9rZW5EZXZpY2VDbGllbnRJbmZvRHRvTW9kZWwgfSBmcm9tICcuLi8uLi9tb2RlbHMvZHRvL2NvcmUtbWFpbi90b2tlbkRldmljZUNsaWVudEluZm9EdG9Nb2RlbCc7XHJcbmltcG9ydCB7IFRva2VuRGV2aWNlU2V0Tm90aWZpY2F0aW9uSWREdG9Nb2RlbCB9IGZyb20gJy4uLy4uL21vZGVscy9kdG8vY29yZS1tYWluL3Rva2VuRGV2aWNlU2V0Tm90aWZpY2F0aW9uSWREdG9Nb2RlbCc7XHJcbmltcG9ydCB7IENhcHRjaGFNb2RlbCB9IGZyb20gJy4uLy4uL21vZGVscy9lbnRpdHkvYmFzZS9jYXB0Y2hhTW9kZWwnO1xyXG5pbXBvcnQgeyBFcnJvckV4Y2VwdGlvblJlc3VsdCB9IGZyb20gJy4uLy4uL21vZGVscy9lbnRpdHkvYmFzZS9lcnJvckV4Y2VwdGlvblJlc3VsdCc7XHJcbmltcG9ydCB7IEVycm9yRXhjZXB0aW9uUmVzdWx0QmFzZSB9IGZyb20gJy4uLy4uL21vZGVscy9lbnRpdHkvYmFzZS9lcnJvckV4Y2VwdGlvblJlc3VsdEJhc2UnO1xyXG5pbXBvcnQgeyBGaWx0ZXJNb2RlbCB9IGZyb20gJy4uLy4uL21vZGVscy9lbnRpdHkvYmFzZS9maWx0ZXJNb2RlbCc7XHJcbmltcG9ydCB7IFRva2VuRGV2aWNlTW9kZWwgfSBmcm9tICcuLi8uLi9tb2RlbHMvZW50aXR5L2NvcmUtdG9rZW4vdG9rZW5EZXZpY2VNb2RlbCc7XHJcbmltcG9ydCB7IFRva2VuSW5mb01vZGVsIH0gZnJvbSAnLi4vLi4vbW9kZWxzL2VudGl0eS9jb3JlLXRva2VuL3Rva2VuSW5mb01vZGVsJztcclxuaW1wb3J0IHsgQXBpU2VydmVyQmFzZSB9IGZyb20gJy4uL2Jhc2UvYXBpU2VydmVyQmFzZS5zZXJ2aWNlJztcclxuXHJcblxyXG5ASW5qZWN0YWJsZSgpXHJcbmV4cG9ydCBjbGFzcyBDb3JlQXV0aFNlcnZpY2UgZXh0ZW5kcyBBcGlTZXJ2ZXJCYXNlIHtcclxuICBwdWJsaWMgdG9rZW5JbmZvU3ViamVjdDogQmVoYXZpb3JTdWJqZWN0PFRva2VuSW5mb01vZGVsPj1uZXcgQmVoYXZpb3JTdWJqZWN0KG5ldyBUb2tlbkluZm9Nb2RlbCk7XHJcbiAgcHVibGljIHRva2VuRGV2aWNlU3ViamVjdDogQmVoYXZpb3JTdWJqZWN0PFRva2VuRGV2aWNlTW9kZWw+PW5ldyBCZWhhdmlvclN1YmplY3QobmV3IFRva2VuRGV2aWNlTW9kZWwpO1xyXG4gIGdldE1vZHVsZUNvbnRyb2xsZXJVcmwoKTogc3RyaW5nIHtcclxuICAgIHJldHVybiAnYXV0aCc7XHJcbiAgfVxyXG4gIFNldEN1cnJlbnRUb2tlbkluZm8obW9kZWw6IFRva2VuSW5mb01vZGVsIHwgbnVsbCk6IGFueSB7XHJcbiAgICBpZiAobW9kZWwgPT0gbnVsbCkge1xyXG4gICAgICB0aGlzLnJlbW92ZVRva2VuKCk7XHJcbiAgICAgIC8vdGhpcy5jbXNBcGlTdG9yZS5zZXRTdGF0ZSh7IHR5cGU6IFNFVF9UT0tFTl9JTkZPLCBwYXlsb2FkOiBuZXcgVG9rZW5JbmZvTW9kZWwoKSB9KTtcclxuICAgICAgdGhpcy50b2tlbkluZm9TdWJqZWN0Lm5leHQobmV3IFRva2VuSW5mb01vZGVsKCkpO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICBpZiAobW9kZWwudG9rZW4gJiYgbW9kZWwuZGV2aWNlVG9rZW4gJiYgbW9kZWwucmVmcmVzaFRva2VuKSB7XHJcbiAgICAgIHRoaXMuc2V0VG9rZW4obW9kZWwudG9rZW4sIG1vZGVsLmRldmljZVRva2VuLCBtb2RlbC5yZWZyZXNoVG9rZW4pO1xyXG4gICAgfSBlbHNlIGlmIChtb2RlbC50b2tlbiAmJiBtb2RlbC5kZXZpY2VUb2tlbikge1xyXG4gICAgICB0aGlzLnNldFRva2VuKG1vZGVsLnRva2VuLCBtb2RlbC5kZXZpY2VUb2tlbiwgJycpO1xyXG4gICAgfSBlbHNlIGlmIChtb2RlbC50b2tlbikge1xyXG4gICAgICB0aGlzLnNldFRva2VuKG1vZGVsLnRva2VuLCAnJywgJycpO1xyXG4gICAgfVxyXG4gICAgZWxzZSBpZiAobW9kZWwuZGV2aWNlVG9rZW4pIHtcclxuICAgICAgdGhpcy5zZXRUb2tlbignJywgbW9kZWwuZGV2aWNlVG9rZW4sICcnKTtcclxuICAgIH1cclxuICAgIC8vdGhpcy5jbXNBcGlTdG9yZS5zZXRTdGF0ZSh7IHR5cGU6IFNFVF9UT0tFTl9JTkZPLCBwYXlsb2FkOiBtb2RlbCB9KTtcclxuICAgIHRoaXMudG9rZW5JbmZvU3ViamVjdC5uZXh0KG1vZGVsKTtcclxuICB9XHJcbiAgU2V0Q3VycmVudERldmljZVRva2VuSW5mbyhtb2RlbDogVG9rZW5EZXZpY2VNb2RlbCB8IG51bGwpOiBhbnkge1xyXG4gICAgaWYgKG1vZGVsID09IG51bGwpIHtcclxuICAgICAgdGhpcy5yZW1vdmVUb2tlbigpO1xyXG4gICAgICAvL3RoaXMuY21zQXBpU3RvcmUuc2V0U3RhdGUoeyB0eXBlOiBTRVRfREVWSUNFX1RPS0VOX0lORk8sIHBheWxvYWQ6IG5ldyBUb2tlbkRldmljZU1vZGVsKCkgfSk7XHJcbiAgICAgIHRoaXMudG9rZW5EZXZpY2VTdWJqZWN0Lm5leHQobmV3IFRva2VuRGV2aWNlTW9kZWwoKSk7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIGlmIChtb2RlbC5kZXZpY2VUb2tlbikge1xyXG4gICAgICB0aGlzLnNldERldmljZVRva2VuKG1vZGVsLmRldmljZVRva2VuKTtcclxuICAgIH1cclxuICAgIC8vdGhpcy5jbXNBcGlTdG9yZS5zZXRTdGF0ZSh7IHR5cGU6IFNFVF9ERVZJQ0VfVE9LRU5fSU5GTywgcGF5bG9hZDogbW9kZWwgfSk7XHJcbiAgICB0aGlzLnRva2VuRGV2aWNlU3ViamVjdC5uZXh0KG1vZGVsKTtcclxuICB9XHJcblxyXG4gIEN1cnJlbnRUb2tlbkluZm9SZW5ldygpOiB2b2lkIHtcclxuICAgIHRoaXMuU2VydmljZUN1cnJlbnRUb2tlbigpLnN1YnNjcmliZShcclxuICAgICAgKG5leHQpID0+IHtcclxuICAgICAgICB0aGlzLlNldEN1cnJlbnRUb2tlbkluZm8obmV4dC5pdGVtKTtcclxuICAgICAgfSxcclxuICAgICAgKGVycm9yKSA9PiB7XHJcbiAgICAgIH1cclxuICAgICk7XHJcbiAgfVxyXG5cclxuICBTZXJ2aWNlQ3VycmVudFRva2VuKCk6IE9ic2VydmFibGU8RXJyb3JFeGNlcHRpb25SZXN1bHQ8VG9rZW5JbmZvTW9kZWw+PiB7XHJcbiAgICByZXR1cm4gdGhpcy5odHRwLmdldCh0aGlzLmdldEJhc2VVcmwoKSArIHRoaXMuZ2V0TW9kdWxlQ29udHJvbGxlclVybCgpICsgJy9DdXJyZW50VG9rZW4nLCB7IGhlYWRlcnM6IHRoaXMuZ2V0SGVhZGVycygpIH0pLnBpcGUoXHJcbiAgICAgIC8vIGNhdGNoRXJyb3IodGhpcy5oYW5kbGVFcnJvcilcclxuICAgICAgbWFwKChyZXQ6IGFueSkgPT4ge1xyXG4gICAgICAgIHRoaXMuc2V0VG9rZW4ocmV0Lml0ZW0udG9rZW4sIHJldC5pdGVtLmRldmljZVRva2VuLCAnJyk7XHJcbiAgICAgICAgcmV0dXJuIHJldDtcclxuICAgICAgfSksXHJcbiAgICApO1xyXG4gIH1cclxuICBTZXJ2aWNlQ3VycmVudERldmljZVRva2VuKCk6IE9ic2VydmFibGU8RXJyb3JFeGNlcHRpb25SZXN1bHQ8VG9rZW5EZXZpY2VNb2RlbD4+IHtcclxuICAgIHJldHVybiB0aGlzLmh0dHAuZ2V0KHRoaXMuZ2V0QmFzZVVybCgpICsgdGhpcy5nZXRNb2R1bGVDb250cm9sbGVyVXJsKCkgKyAnL0N1cnJlbnREZXZpY2VUb2tlbicsIHsgaGVhZGVyczogdGhpcy5nZXRIZWFkZXJzKCkgfSkucGlwZShcclxuICAgICAgLy8gY2F0Y2hFcnJvcih0aGlzLmhhbmRsZUVycm9yKVxyXG4gICAgICBtYXAoKHJldDogYW55KSA9PiB7XHJcbiAgICAgICAgdGhpcy5zZXREZXZpY2VUb2tlbihyZXQuaXRlbS5kZXZpY2VUb2tlbik7XHJcbiAgICAgICAgcmV0dXJuIHJldDtcclxuICAgICAgfSksXHJcbiAgICApO1xyXG4gIH1cclxuICBTZXJ2aWNlQ2FwdGNoYSgpOiBPYnNlcnZhYmxlPEVycm9yRXhjZXB0aW9uUmVzdWx0PENhcHRjaGFNb2RlbD4+IHtcclxuICAgIHJldHVybiB0aGlzLmh0dHAuZ2V0KHRoaXMuZ2V0QmFzZVVybCgpICsgdGhpcy5nZXRNb2R1bGVDb250cm9sbGVyVXJsKCkgKyAnL2NhcHRjaGEnKS5waXBlKFxyXG4gICAgICAvLyBjYXRjaEVycm9yKHRoaXMuaGFuZGxlRXJyb3IpXHJcbiAgICAgIG1hcCgocmV0OiBhbnkpID0+IHtcclxuICAgICAgICByZXR1cm4gcmV0O1xyXG4gICAgICB9KSxcclxuICAgICk7XHJcbiAgfVxyXG4gIFNlcnZpY2VHZXRUb2tlbkRldmljZShtb2RlbDogVG9rZW5EZXZpY2VDbGllbnRJbmZvRHRvTW9kZWwpOiBPYnNlcnZhYmxlPEVycm9yRXhjZXB0aW9uUmVzdWx0PFRva2VuRGV2aWNlTW9kZWw+PiB7XHJcbiAgICByZXR1cm4gdGhpcy5odHRwLnBvc3QodGhpcy5nZXRCYXNlVXJsKCkgKyB0aGlzLmdldE1vZHVsZUNvbnRyb2xsZXJVcmwoKSArICcvR2V0VG9rZW5EZXZpY2UvJywgbW9kZWwpLnBpcGUoXHJcbiAgICAgIC8vIGNhdGNoRXJyb3IodGhpcy5oYW5kbGVFcnJvcilcclxuICAgICAgbWFwKChyZXQ6IGFueSkgPT4ge1xyXG4gICAgICAgIHRoaXMuc2V0RGV2aWNlVG9rZW4ocmV0Lml0ZW0uZGV2aWNlVG9rZW4pO1xyXG4gICAgICAgIHJldHVybiByZXQ7XHJcbiAgICAgIH0pLFxyXG4gICAgKTtcclxuICB9XHJcbiAgU2VydmljZVNldFRva2VuRGV2aWNlTm90aWZpY2F0aW9uSWQobW9kZWw6IFRva2VuRGV2aWNlU2V0Tm90aWZpY2F0aW9uSWREdG9Nb2RlbCk6IE9ic2VydmFibGU8RXJyb3JFeGNlcHRpb25SZXN1bHRCYXNlPiB7XHJcbiAgICByZXR1cm4gdGhpcy5odHRwLnBvc3QodGhpcy5nZXRCYXNlVXJsKCkgKyB0aGlzLmdldE1vZHVsZUNvbnRyb2xsZXJVcmwoKSArICcvU2V0VG9rZW5EZXZpY2VOb3RpZmljYXRpb25JZC8nLCBtb2RlbCkucGlwZShcclxuICAgICAgLy8gY2F0Y2hFcnJvcih0aGlzLmhhbmRsZUVycm9yKVxyXG4gICAgICBtYXAoKHJldDogYW55KSA9PiB7XHJcbiAgICAgICAgcmV0dXJuIHJldDtcclxuICAgICAgfSksXHJcbiAgICApO1xyXG4gIH1cclxuICBTZXJ2aWNlU2lnbnVwVXNlcihtb2RlbDogQXV0aFVzZXJTaWduVXBNb2RlbCk6IE9ic2VydmFibGU8RXJyb3JFeGNlcHRpb25SZXN1bHQ8VG9rZW5JbmZvTW9kZWw+PiB7XHJcbiAgICByZXR1cm4gdGhpcy5odHRwLnBvc3QodGhpcy5nZXRCYXNlVXJsKCkgKyB0aGlzLmdldE1vZHVsZUNvbnRyb2xsZXJVcmwoKSArICcvc2lnbnVwJywgbW9kZWwpLnBpcGUoXHJcbiAgICAgIC8vIGNhdGNoRXJyb3IodGhpcy5oYW5kbGVFcnJvcilcclxuICAgICAgbWFwKChyZXQ6IGFueSkgPT4ge1xyXG4gICAgICAgIHJldHVybiByZXQ7XHJcbiAgICAgIH0pLFxyXG4gICAgKTtcclxuICB9XHJcblxyXG4gIFNlcnZpY2VTaWduaW5Vc2VyKG1vZGVsOiBBdXRoVXNlclNpZ25Jbk1vZGVsKTogT2JzZXJ2YWJsZTxFcnJvckV4Y2VwdGlvblJlc3VsdDxUb2tlbkluZm9Nb2RlbD4+IHtcclxuICAgIHJldHVybiB0aGlzLmh0dHAucG9zdCh0aGlzLmdldEJhc2VVcmwoKSArIHRoaXMuZ2V0TW9kdWxlQ29udHJvbGxlclVybCgpICsgJy9zaWduaW4nLCBtb2RlbCkucGlwZShcclxuICAgICAgLy8gY2F0Y2hFcnJvcih0aGlzLmhhbmRsZUVycm9yKVxyXG4gICAgICBtYXAoKHJldDogYW55KSA9PiB7XHJcbiAgICAgICAgaWYgKHJldC5pc1N1Y2Nlc3MpIHtcclxuICAgICAgICAgIHRoaXMuU2V0Q3VycmVudFRva2VuSW5mbyhyZXQuaXRlbSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiByZXQ7XHJcbiAgICAgIH0pLFxyXG4gICAgKTtcclxuICB9XHJcblxyXG4gIFNlcnZpY2VTaWduaW5Vc2VyQnlTTVMobW9kZWw6IEF1dGhVc2VyU2lnbkluQnlTbXNEdG9Nb2RlbCk6IE9ic2VydmFibGU8RXJyb3JFeGNlcHRpb25SZXN1bHQ8VG9rZW5JbmZvTW9kZWw+PiB7XHJcbiAgICByZXR1cm4gdGhpcy5odHRwLnBvc3QodGhpcy5nZXRCYXNlVXJsKCkgKyB0aGlzLmdldE1vZHVsZUNvbnRyb2xsZXJVcmwoKSArICcvc2lnbkluQnlTbXMnLCBtb2RlbCkucGlwZShcclxuICAgICAgLy8gY2F0Y2hFcnJvcih0aGlzLmhhbmRsZUVycm9yKVxyXG4gICAgICBtYXAoKHJldDogYW55KSA9PiB7XHJcbiAgICAgICAgaWYgKHJldC5pc1N1Y2Nlc3MpIHtcclxuICAgICAgICAgIHRoaXMuU2V0Q3VycmVudFRva2VuSW5mbyhyZXQuaXRlbSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiByZXQ7XHJcbiAgICAgIH0pLFxyXG4gICAgKTtcclxuICB9XHJcblxyXG4gIFNlcnZpY2VSZW5ld1Rva2VuKG1vZGVsOiBBdXRoUmVuZXdUb2tlbk1vZGVsKTogT2JzZXJ2YWJsZTxFcnJvckV4Y2VwdGlvblJlc3VsdDxUb2tlbkluZm9Nb2RlbD4+IHtcclxuICAgIGlmIChtb2RlbCA9PSBudWxsKSB7XHJcbiAgICAgIG1vZGVsID0gbmV3IEF1dGhSZW5ld1Rva2VuTW9kZWwoKTtcclxuICAgIH1cclxuICAgIHJldHVybiB0aGlzLmh0dHBcclxuICAgICAgLnBvc3QodGhpcy5nZXRCYXNlVXJsKCkgKyB0aGlzLmdldE1vZHVsZUNvbnRyb2xsZXJVcmwoKSArICcvcmVuZXdUb2tlbicsIG1vZGVsLCB7XHJcbiAgICAgICAgaGVhZGVyczogdGhpcy5nZXRIZWFkZXJzKCksXHJcbiAgICAgIH0pXHJcbiAgICAgIC5waXBlKFxyXG4gICAgICAgIC8vIGNhdGNoRXJyb3IodGhpcy5oYW5kbGVFcnJvcilcclxuICAgICAgICBtYXAoKHJldDogYW55KSA9PiB7XHJcbiAgICAgICAgICBpZiAocmV0LmlzU3VjY2Vzcykge1xyXG4gICAgICAgICAgICB0aGlzLlNldEN1cnJlbnRUb2tlbkluZm8ocmV0Lml0ZW0pO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgcmV0dXJuIHJldDtcclxuICAgICAgICB9KSxcclxuICAgICAgKTtcclxuICB9XHJcbiAgU2VydmljZUNoYW5nZVBhc3N3b3JkKG1vZGVsOiBBdXRoVXNlckNoYW5nZVBhc3N3b3JkTW9kZWwpOiBPYnNlcnZhYmxlPEVycm9yRXhjZXB0aW9uUmVzdWx0QmFzZT4ge1xyXG4gICAgcmV0dXJuIHRoaXMuaHR0cFxyXG4gICAgICAucG9zdCh0aGlzLmdldEJhc2VVcmwoKSArIHRoaXMuZ2V0TW9kdWxlQ29udHJvbGxlclVybCgpICsgJy9jaGFuZ2VQYXNzd29yZCcsIG1vZGVsLCB7XHJcbiAgICAgICAgaGVhZGVyczogdGhpcy5nZXRIZWFkZXJzKCksXHJcbiAgICAgIH0pXHJcbiAgICAgIC5waXBlKFxyXG4gICAgICAgIC8vIGNhdGNoRXJyb3IodGhpcy5oYW5kbGVFcnJvcilcclxuICAgICAgICBtYXAoKHJldDogYW55KSA9PiB7XHJcbiAgICAgICAgICByZXR1cm4gcmV0O1xyXG4gICAgICAgIH0pLFxyXG4gICAgICApO1xyXG4gIH1cclxuICBTZXJ2aWNlRm9yZ2V0UGFzc3dvcmQobW9kZWw6IEF1dGhVc2VyRm9yZ2V0UGFzc3dvcmRNb2RlbCk6IE9ic2VydmFibGU8RXJyb3JFeGNlcHRpb25SZXN1bHQ8VG9rZW5JbmZvTW9kZWw+PiB7XHJcbiAgICByZXR1cm4gdGhpcy5odHRwLnBvc3QodGhpcy5nZXRCYXNlVXJsKCkgKyB0aGlzLmdldE1vZHVsZUNvbnRyb2xsZXJVcmwoKSArICcvZm9yZ2V0UGFzc3dvcmQnLCBtb2RlbCkucGlwZShcclxuICAgICAgLy8gY2F0Y2hFcnJvcih0aGlzLmhhbmRsZUVycm9yKVxyXG4gICAgICBtYXAoKHJldDogYW55KSA9PiB7XHJcbiAgICAgICAgcmV0dXJuIHJldDtcclxuICAgICAgfSksXHJcbiAgICApO1xyXG4gIH1cclxuICBTZXJ2aWNlRm9yZ2V0UGFzc3dvcmRFbnRyeVBpbkNvZGUobW9kZWw6IEF1dGhVc2VyRm9yZ2V0UGFzc3dvcmRFbnRyeVBpbkNvZGVNb2RlbCk6IE9ic2VydmFibGU8RXJyb3JFeGNlcHRpb25SZXN1bHQ8VG9rZW5JbmZvTW9kZWw+PiB7XHJcbiAgICByZXR1cm4gdGhpcy5odHRwLnBvc3QodGhpcy5nZXRCYXNlVXJsKCkgKyB0aGlzLmdldE1vZHVsZUNvbnRyb2xsZXJVcmwoKSArICcvRm9yZ2V0UGFzc3dvcmRFbnRyeVBpbkNvZGUnLCBtb2RlbCkucGlwZShcclxuICAgICAgLy8gY2F0Y2hFcnJvcih0aGlzLmhhbmRsZUVycm9yKVxyXG4gICAgICBtYXAoKHJldDogYW55KSA9PiB7XHJcbiAgICAgICAgcmV0dXJuIHJldDtcclxuICAgICAgfSksXHJcbiAgICApO1xyXG4gIH1cclxuICBTZXJ2aWNlTG9nb3V0KG1vZGVsOiBBdXRoVXNlclNpZ25PdXRNb2RlbCA9IG5ldyBBdXRoVXNlclNpZ25PdXRNb2RlbCgpKTogT2JzZXJ2YWJsZTxFcnJvckV4Y2VwdGlvblJlc3VsdEJhc2U+IHtcclxuICAgIHJldHVybiB0aGlzLmh0dHBcclxuICAgICAgLnBvc3QodGhpcy5nZXRCYXNlVXJsKCkgKyB0aGlzLmdldE1vZHVsZUNvbnRyb2xsZXJVcmwoKSArICcvc2lnbk91dCcsIG1vZGVsLCB7XHJcbiAgICAgICAgaGVhZGVyczogdGhpcy5nZXRIZWFkZXJzKCksXHJcbiAgICAgIH0pXHJcbiAgICAgIC5waXBlKFxyXG4gICAgICAgIC8vIGNhdGNoRXJyb3IodGhpcy5oYW5kbGVFcnJvcilcclxuICAgICAgICBtYXAoKHJldDogYW55KSA9PiB7XHJcbiAgICAgICAgICB0aGlzLlNldEN1cnJlbnRUb2tlbkluZm8obnVsbCk7XHJcblxyXG4gICAgICAgICAgcmV0dXJuIHJldDtcclxuICAgICAgICB9KSxcclxuICAgICAgKTtcclxuICB9XHJcblxyXG4gIFNlcnZpY2VFeGlzdFRva2VuKG1vZGVsOiBGaWx0ZXJNb2RlbCk6IE9ic2VydmFibGU8RXJyb3JFeGNlcHRpb25SZXN1bHRCYXNlPiB7XHJcbiAgICBpZiAobW9kZWwgPT0gbnVsbCkge1xyXG4gICAgICBtb2RlbCA9IG5ldyBGaWx0ZXJNb2RlbCgpO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiB0aGlzLmh0dHBcclxuICAgICAgLnBvc3QodGhpcy5nZXRCYXNlVXJsKCkgKyB0aGlzLmdldE1vZHVsZUNvbnRyb2xsZXJVcmwoKSArICcvZXhpc3RUb2tlbicsIG1vZGVsLCB7XHJcbiAgICAgICAgaGVhZGVyczogdGhpcy5nZXRIZWFkZXJzKCksXHJcbiAgICAgIH0pXHJcbiAgICAgIC5waXBlKFxyXG4gICAgICAgIC8vIGNhdGNoRXJyb3IodGhpcy5oYW5kbGVFcnJvcilcclxuICAgICAgICBtYXAoKHJldDogYW55KSA9PiB7XHJcbiAgICAgICAgICByZXR1cm4gcmV0O1xyXG4gICAgICAgIH0pLFxyXG4gICAgICApO1xyXG4gIH1cclxuICBTZXJ2aWNlTW9iaWxlQ29uZmlybShtb2RlbDogQXV0aE1vYmlsZUNvbmZpcm1EdG9Nb2RlbCk6IE9ic2VydmFibGU8RXJyb3JFeGNlcHRpb25SZXN1bHRCYXNlPiB7XHJcbiAgICBpZiAobW9kZWwgPT0gbnVsbCkge1xyXG4gICAgICBtb2RlbCA9IG5ldyBBdXRoTW9iaWxlQ29uZmlybUR0b01vZGVsKCk7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIHRoaXMuaHR0cFxyXG4gICAgICAucG9zdCh0aGlzLmdldEJhc2VVcmwoKSArIHRoaXMuZ2V0TW9kdWxlQ29udHJvbGxlclVybCgpICsgJy9tb2JpbGVDb25maXJtJywgbW9kZWwsIHtcclxuICAgICAgICBoZWFkZXJzOiB0aGlzLmdldEhlYWRlcnMoKSxcclxuICAgICAgfSlcclxuICAgICAgLnBpcGUoXHJcbiAgICAgICAgLy8gY2F0Y2hFcnJvcih0aGlzLmhhbmRsZUVycm9yKVxyXG4gICAgICAgIG1hcCgocmV0OiBhbnkpID0+IHtcclxuICAgICAgICAgIHJldHVybiByZXQ7XHJcbiAgICAgICAgfSksXHJcbiAgICAgICk7XHJcbiAgfVxyXG4gIFNlcnZpY2VFbWFpbENvbmZpcm0obW9kZWw6IEF1dGhFbWFpbENvbmZpcm1EdG9Nb2RlbCk6IE9ic2VydmFibGU8RXJyb3JFeGNlcHRpb25SZXN1bHRCYXNlPiB7XHJcbiAgICBpZiAobW9kZWwgPT0gbnVsbCkge1xyXG4gICAgICBtb2RlbCA9IG5ldyBBdXRoRW1haWxDb25maXJtRHRvTW9kZWwoKTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gdGhpcy5odHRwXHJcbiAgICAgIC5wb3N0KHRoaXMuZ2V0QmFzZVVybCgpICsgdGhpcy5nZXRNb2R1bGVDb250cm9sbGVyVXJsKCkgKyAnL2VtYWlsQ29uZmlybScsIG1vZGVsLCB7XHJcbiAgICAgICAgaGVhZGVyczogdGhpcy5nZXRIZWFkZXJzKCksXHJcbiAgICAgIH0pXHJcbiAgICAgIC5waXBlKFxyXG4gICAgICAgIC8vIGNhdGNoRXJyb3IodGhpcy5oYW5kbGVFcnJvcilcclxuICAgICAgICBtYXAoKHJldDogYW55KSA9PiB7XHJcbiAgICAgICAgICByZXR1cm4gcmV0O1xyXG4gICAgICAgIH0pLFxyXG4gICAgICApO1xyXG4gIH1cclxufVxyXG4iXX0=