@c8y/ngx-components
Version:
Angular modules for Cumulocity IoT applications
201 lines • 31.1 kB
JavaScript
import { Injectable } from '@angular/core';
import { FetchClient } from '@c8y/client';
import { BehaviorSubject, Subject, from, of, throwError } from 'rxjs';
import { catchError, map, switchMap, takeUntil, tap } from 'rxjs/operators';
import { Lwm2mClientService } from './lwm2m-client.service';
import { AlertService, gettext } from '@c8y/ngx-components';
import { LWM2MEndpoint, agentBaseUrl, ValidationType, Mode } from '@c8y/ngx-components/protocol-lwm2m/model';
import * as i0 from "@angular/core";
import * as i1 from "@c8y/client";
import * as i2 from "@c8y/ngx-components";
export class Lwm2mConfigurationService extends Lwm2mClientService {
constructor(client, alertService) {
super(client);
this.alertService = alertService;
this.baseUrl = `${agentBaseUrl}/v1`;
this._destroy$ = new Subject();
this._listServers$ = new Subject();
this._servers$ = new BehaviorSubject([]);
this._settings$ = new BehaviorSubject({});
this._certificates$ = new BehaviorSubject([]);
this._securityModeDictRaw$ = new BehaviorSubject([]);
this._securityModeByScope$ = new BehaviorSubject([]);
this.servers$ = this._servers$.asObservable();
this.settings$ = this._settings$.asObservable();
this.certificates$ = this._certificates$.asObservable();
this.securityModesByScope$ = this._securityModeByScope$.asObservable();
this.securityModesRaw$ = this._securityModeDictRaw$.asObservable();
this._listServers$
.pipe(switchMap(() => this.listServers$().pipe(map(resp => this._servers$.next(resp?.data)))), catchError(error => {
this.alertService.addServerFailure(error);
return of([]);
}), takeUntil(this._destroy$))
.subscribe();
}
ngOnDestroy() {
this._destroy$.next();
this._destroy$.complete();
}
getSettingsFor(urlCfg) {
this.detail$(urlCfg)
.pipe(map(({ data }) => data), catchError(error => {
this.alertService.addServerFailure(error);
return of({});
}), takeUntil(this._destroy$))
.subscribe(data => this._settings$.next(data));
}
listServers() {
this._listServers$.next();
}
updateConfig(entity, endpoint) {
this.update$({ ...entity, endpoint })
.pipe(catchError(error => {
this.alertService.addServerFailure(error);
return of(null);
}), takeUntil(this._destroy$))
.subscribe();
}
onBeforeUpdate(entity) {
return this.deleteFieldsInRequest(entity);
}
onBeforeCreate(entity) {
return this.deleteFieldsInRequest(entity);
}
getDetailUrl(entity) {
const { endpoint } = entity;
const id = entity.id ?? '';
const deviceConfigUrl = `device/${this.deviceId}/configuration`;
if (!endpoint) {
throw { data: { message: gettext('Unable to find endpoint') } };
}
return id.length > 0 && endpoint === LWM2MEndpoint.servers
? `${deviceConfigUrl}/${endpoint}/${id}`
: `${deviceConfigUrl}/${endpoint}`;
}
validate(certificate, type) {
if (certificate?.length > 0) {
const body = JSON.stringify({
[type === ValidationType.PRIVATE_KEY ? 'encodedPrivateKey' : 'encodedCertificate']: certificate
});
return this.fetch$(`device/configuration/${type}/validate`, {
method: 'POST',
headers: { 'content-type': 'application/json', accept: 'application/json' },
body
}).pipe(switchMap(result => from(result.json()).pipe(map(data => data['fingerprint'] || data['commonName']))), catchError((e) => {
const { message, error } = e?.data;
this.alertService.addServerFailure({
data: { message, exceptionMessage: error }
});
return throwError(e);
}));
}
}
getServerCertificates() {
this.fetchServerCertificates$()
.pipe(catchError(error => {
this.alertService.addServerFailure(error);
return of([]);
}), takeUntil(this._destroy$))
.subscribe();
}
fetchServerCertificates$() {
return this.fetch$('dictionary/server-certificates').pipe(switchMap(result => result.json()), tap(result => {
this._certificates$.next(result);
}));
}
getSecurityModes() {
this.fetchSecurityModes$()
.pipe(catchError(error => {
// Use this as fallback. There is the possibility that
// the UI version runs against an agent version without the needed endpoint:
// 'dictionary/security-modes'
const { data: { status } } = error;
status !== 404
? this.alertService.addServerFailure(error)
: this._securityModeDictRaw$.next([
{
label: Mode.DISABLED,
value: Mode.DISABLED,
useInBootstrapConnectivity: true,
useInServerConnectivity: true
},
{
label: Mode.NO_SEC,
value: Mode.NO_SEC,
useInBootstrapConnectivity: true,
useInServerConnectivity: true
},
{
label: Mode.PSK,
value: Mode.PSK,
useInBootstrapConnectivity: true,
useInServerConnectivity: true
},
{
label: 'X.509',
value: Mode.X509,
useInBootstrapConnectivity: true,
useInServerConnectivity: true
}
]);
return of([]);
}))
.subscribe();
}
fetchSecurityModes$() {
return this.fetch$('dictionary/security-modes').pipe(switchMap(result => result.json()), map((result) => result.map(({ name, useInBootstrapConnectivity, useInServerConnectivity }) => ({
label: name.replace('X509', 'X.509'),
value: name,
useInBootstrapConnectivity,
useInServerConnectivity
}))), tap((result) => {
this._securityModeDictRaw$.next(result);
}));
}
getSecurityModeByScope(scope) {
this._securityModeByScope$.next(this._securityModeDictRaw$
.getValue()
.filter(({ useInBootstrapConnectivity, useInServerConnectivity }) => (useInBootstrapConnectivity && scope === 'useInBootstrapConnectivity') ||
(useInServerConnectivity && scope === 'useInServerConnectivity')));
}
cleanUpBase64Data(fileReadAsDataURL) {
const base64RegExp = RegExp(/data:\S+;base64,/gi);
return fileReadAsDataURL?.length > 0 && base64RegExp.test(fileReadAsDataURL)
? fileReadAsDataURL.replace(base64RegExp, '')
: undefined;
}
listServers$() {
this.listUrl = this.getDetailUrl({ endpoint: LWM2MEndpoint.servers });
return from(super.list());
}
createServer$(server) {
return from(super.create({ ...server, endpoint: LWM2MEndpoint.servers }));
}
deleteServer$(server) {
return from(super.delete({ ...server, endpoint: LWM2MEndpoint.servers }));
}
update$(entity) {
return from(super.update(entity));
}
detail$(urlCfg) {
return from(super.detail(urlCfg));
}
fetch$(url, init) {
return from(super.fetch(url, init));
}
deleteFieldsInRequest(entity) {
delete entity?.id;
delete entity?.endpoint;
delete entity?.deviceInfo;
return entity;
}
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: Lwm2mConfigurationService, deps: [{ token: i1.FetchClient }, { token: i2.AlertService }], target: i0.ɵɵFactoryTarget.Injectable }); }
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: Lwm2mConfigurationService, providedIn: 'root' }); }
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: Lwm2mConfigurationService, decorators: [{
type: Injectable,
args: [{
providedIn: 'root'
}]
}], ctorParameters: () => [{ type: i1.FetchClient }, { type: i2.AlertService }] });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibHdtMm0tY29uZmlndXJhdGlvbi5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vcHJvdG9jb2wtbHdtMm0vc2VydmljZXMvbHdtMm0tY29uZmlndXJhdGlvbi5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQWEsTUFBTSxlQUFlLENBQUM7QUFDdEQsT0FBTyxFQUFFLFdBQVcsRUFBb0QsTUFBTSxhQUFhLENBQUM7QUFDNUYsT0FBTyxFQUFFLGVBQWUsRUFBYyxPQUFPLEVBQUUsSUFBSSxFQUFFLEVBQUUsRUFBRSxVQUFVLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDbEYsT0FBTyxFQUFFLFVBQVUsRUFBRSxHQUFHLEVBQUUsU0FBUyxFQUFFLFNBQVMsRUFBRSxHQUFHLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUM1RSxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUM1RCxPQUFPLEVBQUUsWUFBWSxFQUFFLE9BQU8sRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQzVELE9BQU8sRUFDTCxhQUFhLEVBRWIsWUFBWSxFQUdaLGNBQWMsRUFHZCxJQUFJLEVBQ0wsTUFBTSwwQ0FBMEMsQ0FBQzs7OztBQUtsRCxNQUFNLE9BQU8seUJBQ1gsU0FBUSxrQkFBcUI7SUF3QjdCLFlBQ0UsTUFBbUIsRUFDWCxZQUEwQjtRQUVsQyxLQUFLLENBQUMsTUFBTSxDQUFDLENBQUM7UUFGTixpQkFBWSxHQUFaLFlBQVksQ0FBYztRQXRCMUIsWUFBTyxHQUFHLEdBQUcsWUFBWSxLQUFLLENBQUM7UUFFeEIsY0FBUyxHQUFrQixJQUFJLE9BQU8sRUFBRSxDQUFDO1FBQ3pDLGtCQUFhLEdBQWtCLElBQUksT0FBTyxFQUFFLENBQUM7UUFDN0MsY0FBUyxHQUFzQyxJQUFJLGVBQWUsQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUN2RSxlQUFVLEdBQXVCLElBQUksZUFBZSxD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Q0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQztJQUN0QyxDQUFDO0lBRU8scUJBQXFCLENBQUMsTUFBYztRQUMxQyxPQUFPLE1BQU0sRUFBRSxFQUFFLENBQUM7UUFDbEIsT0FBTyxNQUFNLEVBQUUsUUFBUSxDQUFDO1FBQ3hCLE9BQVEsTUFBc0IsRUFBRSxVQUFVLENBQUM7UUFDM0MsT0FBTyxNQUFXLENBQUM7SUFDckIsQ0FBQzsrR0ExUVUseUJBQXlCO21IQUF6Qix5QkFBeUIsY0FGeEIsTUFBTTs7NEZBRVAseUJBQXlCO2tCQUhyQyxVQUFVO21CQUFDO29CQUNWLFVBQVUsRUFBRSxNQUFNO2lCQUNuQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdGFibGUsIE9uRGVzdHJveSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgRmV0Y2hDbGllbnQsIElGZXRjaE9wdGlvbnMsIElJZGVudGlmaWVkLCBJUmVzdWx0LCBJUmVzdWx0TGlzdCB9IGZyb20gJ0BjOHkvY2xpZW50JztcbmltcG9ydCB7IEJlaGF2aW9yU3ViamVjdCwgT2JzZXJ2YWJsZSwgU3ViamVjdCwgZnJvbSwgb2YsIHRocm93RXJyb3IgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IGNhdGNoRXJyb3IsIG1hcCwgc3dpdGNoTWFwLCB0YWtlVW50aWwsIHRhcCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcbmltcG9ydCB7IEx3bTJtQ2xpZW50U2VydmljZSB9IGZyb20gJy4vbHdtMm0tY2xpZW50LnNlcnZpY2UnO1xuaW1wb3J0IHsgQWxlcnRTZXJ2aWNlLCBnZXR0ZXh0IH0gZnJvbSAnQGM4eS9uZ3gtY29tcG9uZW50cyc7XG5pbXBvcnQge1xuICBMV00yTUVuZHBvaW50LFxuICBTZXJ2ZXJTZXR0aW5ncyxcbiAgYWdlbnRCYXNlVXJsLFxuICBFbnRpdHksXG4gIFVybENvbmZpZyxcbiAgVmFsaWRhdGlvblR5cGUsXG4gIFZhbGlkYXRpb25FcnJvcixcbiAgU2VjdXJpdHlNb2RlRGljdGlvbmFyeU9iaixcbiAgTW9kZVxufSBmcm9tICdAYzh5L25neC1jb21wb25lbnRzL3Byb3RvY29sLWx3bTJtL21vZGVsJztcblxuQEluamVjdGFibGUoe1xuICBwcm92aWRlZEluOiAncm9vdCdcbn0pXG5leHBvcnQgY2xhc3MgTHdtMm1Db25maWd1cmF0aW9uU2VydmljZTxUID0gRW50aXR5PlxuICBleHRlbmRzIEx3bTJtQ2xpZW50U2VydmljZTxUPlxuICBpbXBsZW1lbnRzIE9uRGVzdHJveVxue1xuICBkZXZpY2VJZDogc3RyaW5nO1xuICBwcm90ZWN0ZWQgYmFzZVVybCA9IGAke2FnZW50QmFzZVVybH0vdjFgO1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgX2Rlc3Ryb3kkOiBTdWJqZWN0PHZvaWQ+ID0gbmV3IFN1YmplY3QoKTtcbiAgcHJpdmF0ZSByZWFkb25seSBfbGlzdFNlcnZlcnMkOiBTdWJqZWN0PHZvaWQ+ID0gbmV3IFN1YmplY3QoKTtcbiAgcHJpdmF0ZSByZWFkb25seSBfc2VydmVycyQ6IEJlaGF2aW9yU3ViamVjdDxTZXJ2ZXJTZXR0aW5nc1tdPiA9IG5ldyBCZWhhdmlvclN1YmplY3QoW10pO1xuICBwcml2YXRlIHJlYWRvbmx5IF9zZXR0aW5ncyQ6IEJlaGF2aW9yU3ViamVjdDxUPiA9IG5ldyBCZWhhdmlvclN1YmplY3Qoe30gYXMgVCk7XG4gIHByaXZhdGUgcmVhZG9ubHkgX2NlcnRpZmljYXRlcyQ6IEJlaGF2aW9yU3ViamVjdDxzdHJpbmdbXT4gPSBuZXcgQmVoYXZpb3JTdWJqZWN0KFtdIGFzIHN0cmluZ1tdKTtcbiAgcHJpdmF0ZSByZWFkb25seSBfc2VjdXJpdHlNb2RlRGljdFJhdyQ6IEJlaGF2aW9yU3ViamVjdDxTZWN1cml0eU1vZGVEaWN0aW9uYXJ5T2JqW10+ID1cbiAgICBuZXcgQmVoYXZpb3JTdWJqZWN0KFtdIGFzIFNlY3VyaXR5TW9kZURpY3Rpb25hcnlPYmpbXSk7XG4gIHByaXZhdGUgcmVhZG9ubHkgX3NlY3VyaXR5TW9kZUJ5U2NvcGUkOiBCZWhhdmlvclN1YmplY3Q8U2VjdXJpdHlNb2RlRGljdGlvbmFyeU9ialtdPiA9XG4gICAgbmV3IEJlaGF2aW9yU3ViamVjdChbXSBhcyBTZWN1cml0eU1vZGVEaWN0aW9uYXJ5T2JqW10pO1xuXG4gIHNlcnZlcnMkOiBPYnNlcnZhYmxlPFNlcnZlclNldHRpbmdzW10+ID0gdGhpcy5fc2VydmVycyQuYXNPYnNlcnZhYmxlKCk7XG4gIHNldHRpbmdzJDogT2JzZXJ2YWJsZTxUPiA9IHRoaXMuX3NldHRpbmdzJC5hc09ic2VydmFibGUoKTtcbiAgY2VydGlmaWNhdGVzJDogT2JzZXJ2YWJsZTxzdHJpbmdbXT4gPSB0aGlzLl9jZXJ0aWZpY2F0ZXMkLmFzT2JzZXJ2YWJsZSgpO1xuICBzZWN1cml0eU1vZGVzQnlTY29wZSQ6IE9ic2VydmFibGU8U2VjdXJpdHlNb2RlRGljdGlvbmFyeU9ialtdPiA9XG4gICAgdGhpcy5fc2VjdXJpdHlNb2RlQnlTY29wZSQuYXNPYnNlcnZhYmxlKCk7XG4gIHNlY3VyaXR5TW9kZXNSYXckOiBPYnNlcnZhYmxlPFNlY3VyaXR5TW9kZURpY3Rpb25hcnlPYmpbXT4gPVxuICAgIHRoaXMuX3NlY3VyaXR5TW9kZURpY3RSYXckLmFzT2JzZXJ2YWJsZSgpO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIGNsaWVudDogRmV0Y2hDbGllbnQsXG4gICAgcHJpdmF0ZSBhbGVydFNlcnZpY2U6IEFsZXJ0U2VydmljZVxuICApIHtcbiAgICBzdXBlcihjbGllbnQpO1xuXG4gICAgdGhpcy5fbGlzdFNlcnZlcnMkXG4gICAgICAucGlwZShcbiAgICAgICAgc3dpdGNoTWFwKCgpID0+XG4gICAgICAgICAgdGhpcy5saXN0U2VydmVycyQoKS5waXBlKFxuICAgICAgICAgICAgbWFwKHJlc3AgPT4gdGhpcy5fc2VydmVycyQubmV4dChyZXNwPy5kYXRhIGFzIHVua25vd24gYXMgU2VydmVyU2V0dGluZ3NbXSkpXG4gICAgICAgICAgKVxuICAgICAgICApLFxuICAgICAgICBjYXRjaEVycm9yKGVycm9yID0+IHtcbiAgICAgICAgICB0aGlzLmFsZXJ0U2VydmljZS5hZGRTZXJ2ZXJGYWlsdXJlKGVycm9yKTtcbiAgICAgICAgICByZXR1cm4gb2YoW10pO1xuICAgICAgICB9KSxcbiAgICAgICAgdGFrZVVudGlsKHRoaXMuX2Rlc3Ryb3kkKVxuICAgICAgKVxuICAgICAgLnN1YnNjcmliZSgpO1xuICB9XG5cbiAgbmdPbkRlc3Ryb3koKSB7XG4gICAgdGhpcy5fZGVzdHJveSQubmV4dCgpO1xuICAgIHRoaXMuX2Rlc3Ryb3kkLmNvbXBsZXRlKCk7XG4gIH1cblxuICBnZXRTZXR0aW5nc0Zvcih1cmxDZmc6IFVybENvbmZpZykge1xuICAgIHRoaXMuZGV0YWlsJCh1cmxDZmcpXG4gICAgICAucGlwZShcbiAgICAgICAgbWFwKCh7IGRhdGEgfSkgPT4gZGF0YSksXG4gICAgICAgIGNhdGNoRXJyb3IoZXJyb3IgPT4ge1xuICAgICAgICAgIHRoaXMuYWxlcnRTZXJ2aWNlLmFkZFNlcnZlckZhaWx1cmUoZXJyb3IpO1xuICAgICAgICAgIHJldHVybiBvZih7fSBhcyBUKTtcbiAgICAgICAgfSksXG4gICAgICAgIHRha2VVbnRpbCh0aGlzLl9kZXN0cm95JClcbiAgICAgIClcbiAgICAgIC5zdWJzY3JpYmUoZGF0YSA9PiB0aGlzLl9zZXR0aW5ncyQubmV4dChkYXRhIGFzIFQpKTtcbiAgfVxuXG4gIGxpc3RTZXJ2ZXJzKCkge1xuICAgIHRoaXMuX2xpc3RTZXJ2ZXJzJC5uZXh0KCk7XG4gIH1cblxuICB1cGRhdGVDb25maWcoZW50aXR5OiBULCBlbmRwb2ludDogTFdNMk1FbmRwb2ludCkge1xuICAgIHRoaXMudXBkYXRlJCh7IC4uLmVudGl0eSwgZW5kcG9pbnQgfSlcbiAgICAgIC5waXBlKFxuICAgICAgICBjYXRjaEVycm9yKGVycm9yID0+IHtcbiAgICAgICAgICB0aGlzLmFsZXJ0U2VydmljZS5hZGRTZXJ2ZXJGYWlsdXJlKGVycm9yKTtcbiAgICAgICAgICByZXR1cm4gb2YobnVsbCk7XG4gICAgICAgIH0pLFxuICAgICAgICB0YWtlVW50aWwodGhpcy5fZGVzdHJveSQpXG4gICAgICApXG4gICAgICAuc3Vic2NyaWJlKCk7XG4gIH1cblxuICBvbkJlZm9yZVVwZGF0ZShlbnRpdHk6IEVudGl0eSkge1xuICAgIHJldHVybiB0aGlzLmRlbGV0ZUZpZWxkc0luUmVxdWVzdChlbnRpdHkpO1xuICB9XG5cbiAgb25CZWZvcmVDcmVhdGUoZW50aXR5OiBFbnRpdHkpIHtcbiAgICByZXR1cm4gdGhpcy5kZWxldGVGaWVsZHNJblJlcXVlc3QoZW50aXR5KTtcbiAgfVxuXG4gIGdldERldGFpbFVybChlbnRpdHk6IEVudGl0eSk6IHN0cmluZyB7XG4gICAgY29uc3QgeyBlbmRwb2ludCB9ID0gZW50aXR5O1xuICAgIGNvbnN0IGlkID0gZW50aXR5LmlkID8/ICcnO1xuICAgIGNvbnN0IGRldmljZUNvbmZpZ1VybCA9IGBkZXZpY2UvJHt0aGlzLmRldmljZUlkfS9jb25maWd1cmF0aW9uYDtcblxuICAgIGlmICghZW5kcG9pbnQpIHtcbiAgICAgIHRocm93IHsgZGF0YTogeyBtZXNzYWdlOiBnZXR0ZXh0KCdVbmFibGUgdG8gZmluZCBlbmRwb2ludCcpIH0gfTtcbiAgICB9XG5cbiAgICByZXR1cm4gaWQubGVuZ3RoID4gMCAmJiBlbmRwb2ludCA9PT0gTFdNMk1FbmRwb2ludC5zZXJ2ZXJzXG4gICAgICA/IGAke2RldmljZUNvbmZpZ1VybH0vJHtlbmRwb2ludH0vJHtpZH1gXG4gICAgICA6IGAke2RldmljZUNvbmZpZ1VybH0vJHtlbmRwb2ludH1gO1xuICB9XG5cbiAgdmFsaWRhdGUoY2VydGlmaWNhdGU6IHN0cmluZywgdHlwZTogVmFsaWRhdGlvblR5cGUpOiBPYnNlcnZhYmxlPHN0cmluZz4ge1xuICAgIGlmIChjZXJ0aWZpY2F0ZT8ubGVuZ3RoID4gMCkge1xuICAgICAgY29uc3QgYm9keSA9IEpTT04uc3RyaW5naWZ5KHtcbiAgICAgICAgW3R5cGUgPT09IFZhbGlkYXRpb25UeXBlLlBSSVZBVEVfS0VZID8gJ2VuY29kZWRQcml2YXRlS2V5JyA6ICdlbmNvZGVkQ2VydGlmaWNhdGUnXTpcbiAgICAgICAgICBjZXJ0aWZpY2F0ZVxuICAgICAgfSk7XG5cbiAgICAgIHJldHVybiB0aGlzLmZldGNoJChgZGV2aWNlL2NvbmZpZ3VyYXRpb24vJHt0eXBlfS92YWxpZGF0ZWAsIHtcbiAgICAgICAgbWV0aG9kOiAnUE9TVCcsXG4gICAgICAgIGhlYWRlcnM6IHsgJ2NvbnRlbnQtdHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJywgYWNjZXB0OiAnYXBwbGljYXRpb24vanNvbicgfSxcbiAgICAgICAgYm9keVxuICAgICAgfSkucGlwZShcbiAgICAgICAgc3dpdGNoTWFwKHJlc3VsdCA9PlxuICAgICAgICAgIGZyb20ocmVzdWx0Lmpzb24oKSBhcyBQcm9taXNlPG9iamVjdD4pLnBpcGUoXG4gICAgICAgICAgICBtYXAoZGF0YSA9PiBkYXRhWydmaW5nZXJwcmludCddIHx8IGRhdGFbJ2NvbW1vbk5hbWUnXSlcbiAgICAgICAgICApXG4gICAgICAgICksXG4gICAgICAgIGNhdGNoRXJyb3IoKGU6IElSZXN1bHQ8VmFsaWRhdGlvbkVycm9yPikgPT4ge1xuICAgICAgICAgIGNvbnN0IHsgbWVzc2FnZSwgZXJyb3IgfSA9IGU/LmRhdGE7XG4gICAgICAgICAgdGhpcy5hbGVydFNlcnZpY2UuYWRkU2VydmVyRmFpbHVyZSh7XG4gICAgICAgICAgICBkYXRhOiB7IG1lc3NhZ2UsIGV4Y2VwdGlvbk1lc3NhZ2U6IGVycm9yIH1cbiAgICAgICAgICB9KTtcbiAgICAgICAgICByZXR1cm4gdGhyb3dFcnJvcihlKTtcbiAgICAgICAgfSlcbiAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgZ2V0U2VydmVyQ2VydGlmaWNhdGVzKCkge1xuICAgIHRoaXMuZmV0Y2hTZXJ2ZXJDZXJ0aWZpY2F0ZXMkKClcbiAgICAgIC5waXBlKFxuICAgICAgICBjYXRjaEVycm9yKGVycm9yID0+IHtcbiAgICAgICAgICB0aGlzLmFsZXJ0U2VydmljZS5hZGRTZXJ2ZXJGYWlsdXJlKGVycm9yKTtcbiAgICAgICAgICByZXR1cm4gb2YoW10pO1xuICAgICAgICB9KSxcbiAgICAgICAgdGFrZVVudGlsKHRoaXMuX2Rlc3Ryb3kkKVxuICAgICAgKVxuICAgICAgLnN1YnNjcmliZSgpO1xuICB9XG5cbiAgZmV0Y2hTZXJ2ZXJDZXJ0aWZpY2F0ZXMkKCkge1xuICAgIHJldHVybiB0aGlzLmZldGNoJCgnZGljdGlvbmFyeS9zZXJ2ZXItY2VydGlmaWNhdGVzJykucGlwZShcbiAgICAgIHN3aXRjaE1hcChyZXN1bHQgPT4gcmVzdWx0Lmpzb24oKSksXG4gICAgICB0YXAocmVzdWx0ID0+IHtcbiAgICAgICAgdGhpcy5fY2VydGlmaWNhdGVzJC5uZXh0KHJlc3VsdCk7XG4gICAgICB9KVxuICAgICkgYXMgT2JzZXJ2YWJsZTxzdHJpbmdbXT47XG4gIH1cblxuICBnZXRTZWN1cml0eU1vZGVzKCkge1xuICAgIHRoaXMuZmV0Y2hTZWN1cml0eU1vZGVzJCgpXG4gICAgICAucGlwZShcbiAgICAgICAgY2F0Y2hFcnJvcihlcnJvciA9PiB7XG4gICAgICAgICAgLy8gVXNlIHRoaXMgYXMgZmFsbGJhY2suIFRoZXJlIGlzIHRoZSBwb3NzaWJpbGl0eSB0aGF0XG4gICAgICAgICAgLy8gdGhlIFVJIHZlcnNpb24gcnVucyBhZ2FpbnN0IGFuIGFnZW50IHZlcnNpb24gd2l0aG91dCB0aGUgbmVlZGVkIGVuZHBvaW50OlxuICAgICAgICAgIC8vICdkaWN0aW9uYXJ5L3NlY3VyaXR5LW1vZGVzJ1xuICAgICAgICAgIGNvbnN0IHtcbiAgICAgICAgICAgIGRhdGE6IHsgc3RhdHVzIH1cbiAgICAgICAgICB9ID0gZXJyb3I7XG4gICAgICAgICAgc3RhdHVzICE9PSA0MDRcbiAgICAgICAgICAgID8gdGhpcy5hbGVydFNlcnZpY2UuYWRkU2VydmVyRmFpbHVyZShlcnJvcilcbiAgICAgICAgICAgIDogdGhpcy5fc2VjdXJpdHlNb2RlRGljdFJhdyQubmV4dChbXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgbGFiZWw6IE1vZGUuRElTQUJMRUQsXG4gICAgICAgICAgICAgICAgICB2YWx1ZTogTW9kZS5ESVNBQkxFRCxcbiAgICAgICAgICAgICAgICAgIHVzZUluQm9vdHN0cmFwQ29ubmVjdGl2aXR5OiB0cnVlLFxuICAgICAgICAgICAgICAgICAgdXNlSW5TZXJ2ZXJDb25uZWN0aXZpdHk6IHRydWVcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgIGxhYmVsOiBNb2RlLk5PX1NFQyxcbiAgICAgICAgICAgICAgICAgIHZhbHVlOiBNb2RlLk5PX1NFQyxcbiAgICAgICAgICAgICAgICAgIHVzZUluQm9vdHN0cmFwQ29ubmVjdGl2aXR5OiB0cnVlLFxuICAgICAgICAgICAgICAgICAgdXNlSW5TZXJ2ZXJDb25uZWN0aXZpdHk6IHRydWVcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgIGxhYmVsOiBNb2RlLlBTSyxcbiAgICAgICAgICAgICAgICAgIHZhbHVlOiBNb2RlLlBTSyxcbiAgICAgICAgICAgICAgICAgIHVzZUluQm9vdHN0cmFwQ29ubmVjdGl2aXR5OiB0cnVlLFxuICAgICAgICAgICAgICAgICAgdXNlSW5TZXJ2ZXJDb25uZWN0aXZpdHk6IHRydWVcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgIGxhYmVsOiAnWC41MDknLFxuICAgICAgICAgICAgICAgICAgdmFsdWU6IE1vZGUuWDUwOSxcbiAgICAgICAgICAgICAgICAgIHVzZUluQm9vdHN0cmFwQ29ubmVjdGl2aXR5OiB0cnVlLFxuICAgICAgICAgICAgICAgICAgdXNlSW5TZXJ2ZXJDb25uZWN0aXZpdHk6IHRydWVcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIF0pO1xuICAgICAgICAgIHJldHVybiBvZihbXSk7XG4gICAgICAgIH0pXG4gICAgICApXG4gICAgICAuc3Vic2NyaWJlKCk7XG4gIH1cblxuICBmZXRjaFNlY3VyaXR5TW9kZXMkKCkge1xuICAgIHJldHVybiB0aGlzLmZldGNoJCgnZGljdGlvbmFyeS9zZWN1cml0eS1tb2RlcycpLnBpcGUoXG4gICAgICBzd2l0Y2hNYXAocmVzdWx0ID0+IHJlc3VsdC5qc29uKCkpLFxuICAgICAgbWFwKChyZXN1bHQ6IFNlY3VyaXR5TW9kZURpY3Rpb25hcnlPYmpbXSkgPT5cbiAgICAgICAgcmVzdWx0Lm1hcCgoeyBuYW1lLCB1c2VJbkJvb3RzdHJhcENvbm5lY3Rpdml0eSwgdXNlSW5TZXJ2ZXJDb25uZWN0aXZpdHkgfSkgPT4gKHtcbiAgICAgICAgICBsYWJlbDogbmFtZS5yZXBsYWNlKCdYNTA5JywgJ1guNTA5JyksXG4gICAgICAgICAgdmFsdWU6IG5hbWUsXG4gICAgICAgICAgdXNlSW5Cb290c3RyYXBDb25uZWN0aXZpdHksXG4gICAgICAgICAgdXNlSW5TZXJ2ZXJDb25uZWN0aXZpdHlcbiAgICAgICAgfSkpXG4gICAgICApLFxuICAgICAgdGFwKChyZXN1bHQ6IFNlY3VyaXR5TW9kZURpY3Rpb25hcnlPYmpbXSkgPT4ge1xuICAgICAgICB0aGlzLl9zZWN1cml0eU1vZGVEaWN0UmF3JC5uZXh0KHJlc3VsdCk7XG4gICAgICB9KVxuICAgICk7XG4gIH1cblxuICBnZXRTZWN1cml0eU1vZGVCeVNjb3BlKHNjb3BlOiAndXNlSW5Cb290c3RyYXBDb25uZWN0aXZpdHknIHwgJ3VzZUluU2VydmVyQ29ubmVjdGl2aXR5Jykge1xuICAgIHRoaXMuX3NlY3VyaXR5TW9kZUJ5U2NvcGUkLm5leHQoXG4gICAgICB0aGlzLl9zZWN1cml0eU1vZGVEaWN0UmF3JFxuICAgICAgICAuZ2V0VmFsdWUoKVxuICAgICAgICAuZmlsdGVyKFxuICAgICAgICAgICh7IHVzZUluQm9vdHN0cmFwQ29ubmVjdGl2aXR5LCB1c2VJblNlcnZlckNvbm5lY3Rpdml0eSB9KSA9PlxuICAgICAgICAgICAgKHVzZUluQm9vdHN0cmFwQ29ubmVjdGl2aXR5ICYmIHNjb3BlID09PSAndXNlSW5Cb290c3RyYXBDb25uZWN0aXZpdHknKSB8fFxuICAgICAgICAgICAgKHVzZUluU2VydmVyQ29ubmVjdGl2aXR5ICYmIHNjb3BlID09PSAndXNlSW5TZXJ2ZXJDb25uZWN0aXZpdHknKVxuICAgICAgICApXG4gICAgKTtcbiAgfVxuXG4gIGNsZWFuVXBCYXNlNjREYXRhKGZpbGVSZWFkQXNEYXRhVVJMOiBzdHJpbmcpIHtcbiAgICBjb25zdCBiYXNlNjRSZWdFeHAgPSBSZWdFeHAoL2RhdGE6XFxTKztiYXNlNjQsL2dpKTtcbiAgICByZXR1cm4gZmlsZVJlYWRBc0RhdGFVUkw/Lmxlbmd0aCA+IDAgJiYgYmFzZTY0UmVnRXhwLnRlc3QoZmlsZVJlYWRBc0RhdGFVUkwpXG4gICAgICA/IGZpbGVSZWFkQXNEYXRhVVJMLnJlcGxhY2UoYmFzZTY0UmVnRXhwLCAnJylcbiAgICAgIDogdW5kZWZpbmVkO1xuICB9XG5cbiAgbGlzdFNlcnZlcnMkKCkge1xuICAgIHRoaXMubGlzdFVybCA9IHRoaXMuZ2V0RGV0YWlsVXJsKHsgZW5kcG9pbnQ6IExXTTJNRW5kcG9pbnQuc2VydmVycyB9KTtcbiAgICByZXR1cm4gZnJvbShzdXBlci5saXN0KCkgYXMgUHJvbWlzZTxJUmVzdWx0TGlzdDxTZXJ2ZXJTZXR0aW5ncz4+KTtcbiAgfVxuXG4gIGNyZWF0ZVNlcnZlciQoc2VydmVyOiBTZXJ2ZXJTZXR0aW5ncykge1xuICAgIHJldHVybiBmcm9tKFxuICAgICAgc3VwZXIuY3JlYXRlKHsgLi4uc2VydmVyLCBlbmRwb2ludDogTFdNMk1FbmRwb2ludC5zZXJ2ZXJzIH0pIGFzIFByb21pc2U8XG4gICAgICAgIElSZXN1bHQ8U2VydmVyU2V0dGluZ3M+XG4gICAgICA+XG4gICAgKTtcbiAgfVxuXG4gIGRlbGV0ZVNlcnZlciQoc2VydmVyOiBTZXJ2ZXJTZXR0aW5ncykge1xuICAgIHJldHVybiBmcm9tKHN1cGVyLmRlbGV0ZSh7IC4uLnNlcnZlciwgZW5kcG9pbnQ6IExXTTJNRW5kcG9pbnQuc2VydmVycyB9KSk7XG4gIH1cblxuICB1cGRhdGUkKGVudGl0eTogRW50aXR5KSB7XG4gICAgcmV0dXJuIGZyb20oc3VwZXIudXBkYXRlKGVudGl0eSBhcyBUKSBhcyBQcm9taXNlPElSZXN1bHQ8VD4+KTtcbiAgfVxuXG4gIGRldGFpbCQodXJsQ2ZnOiBVcmxDb25maWcpIHtcbiAgICByZXR1cm4gZnJvbShzdXBlci5kZXRhaWwodXJsQ2ZnIGFzIFQpIGFzIFByb21pc2U8SVJlc3VsdDxUPj4pO1xuICB9XG5cbiAgZmV0Y2gkKHVybDogc3RyaW5nLCBpbml0PzogSUZldGNoT3B0aW9ucykge1xuICAgIHJldHVybiBmcm9tKHN1cGVyLmZldGNoKHVybCwgaW5pdCkpO1xuICB9XG5cbiAgcHJpdmF0ZSBkZWxldGVGaWVsZHNJblJlcXVlc3QoZW50aXR5OiBFbnRpdHkpIHtcbiAgICBkZWxldGUgZW50aXR5Py5pZDtcbiAgICBkZWxldGUgZW50aXR5Py5lbmRwb2ludDtcbiAgICBkZWxldGUgKGVudGl0eSBhcyBJSWRlbnRpZmllZCk/LmRldmljZUluZm87XG4gICAgcmV0dXJuIGVudGl0eSBhcyBUO1xuICB9XG59XG4iXX0=