@c8y/ngx-components
Version:
Angular modules for Cumulocity IoT applications
155 lines • 20.5 kB
JavaScript
import { Injectable } from '@angular/core';
import { FetchClient, InventoryService } from '@c8y/client';
import { TranslateService } from '@ngx-translate/core';
import { gettext, AppStateService } from '@c8y/ngx-components';
import * as i0 from "@angular/core";
import * as i1 from "@c8y/client";
import * as i2 from "@ngx-translate/core";
import * as i3 from "@c8y/ngx-components";
export var LoriotErrorName;
(function (LoriotErrorName) {
LoriotErrorName["NoDeviceProtocolsError"] = "NoDeviceProtocolsError";
LoriotErrorName["NoConnectivitySettingsError"] = "NoConnectivitySettingsError";
LoriotErrorName["ConnectivitySettingsError"] = "ConnectivitySettingsError";
LoriotErrorName["RegistrationError"] = "RegistrationError";
LoriotErrorName["DeviceProtocolsFetchError"] = "DeviceProtocolsFetchError";
LoriotErrorName["ApplicationError"] = "ApplicationError";
})(LoriotErrorName || (LoriotErrorName = {}));
export class LoriotProviderService {
constructor(client, inventoryService, translateService, appState) {
this.client = client;
this.inventoryService = inventoryService;
this.translateService = translateService;
this.appState = appState;
this.baseUrl = '/service/loriot/';
this.registrationUrl = `${this.baseUrl}newDeviceRequest`;
this.header = { 'Content-Type': 'application/json' };
this.applicationsUrl = `${this.baseUrl}applications`;
}
async getConnections() {
const options = {
method: 'GET',
headers: this.header
};
const res = await this.client.fetch(`${this.baseUrl}lns-connection`, options);
const data = await res.json();
if (res.status === 200) {
if (data.length === 0) {
await this.throwNoConnectivitySettingsError();
}
}
else {
await this.throwConnectivitySettingsError(data);
}
return { res, data };
}
async createDevice(device) {
const options = {
method: 'POST',
headers: this.header,
body: JSON.stringify(device)
};
const res = await this.client.fetch(this.registrationUrl, options);
const data = await res.json();
if (res.status !== 201) {
this.throwRegistrationError(data);
}
return { res, data };
}
async getAvailableProtocols(filter = { withTotalPages: true }) {
const query = {
__filter: {
__and: [
{ __has: 'c8y_IsDeviceType' },
{
type: { __in: ['c8y_LoraDeviceType', 'c8y_LpwanDeviceType'] }
}
]
},
__orderby: [{ name: 1 }]
};
const deviceProtocolsList = await this.inventoryService.listQuery(query, filter);
const { res, data } = deviceProtocolsList;
if (res.status === 200) {
if (data.length === 0) {
this.throwNoDeviceProtocolsError();
}
}
else {
this.throwDeviceProtocolsFetchError();
}
return deviceProtocolsList;
}
async getApplications(connectionName) {
const options = {
method: 'GET',
headers: this.header,
params: {
loriotConnectionName: connectionName
}
};
const res = await this.client.fetch(this.applicationsUrl, options);
const data = await res.json();
/* Every connection will have atleast 1 application,
so having check for this enpoint returning empty result is not needed*/
if (res.status !== 200) {
this.throwApplicationError(data);
}
return { res, data };
}
async throwNoConnectivitySettingsError() {
const error = new Error();
error.name = LoriotErrorName.NoConnectivitySettingsError;
const hasAdminRight = await this.appState.isApplicationAvailable('administration');
if (hasAdminRight) {
error.message = this.translateService.instant(gettext(`Connectivity settings are not configured. Configure them in the Administration application under <a href="{{ link }}">Settings</a>.`), {
link: '/apps/administration/index.html#/connectivitySettings/multiple_lns_connectors_loriot'
});
}
else {
error.message = gettext('Connectivity settings are not configured. Contact the administrator.');
}
throw error;
}
throwConnectivitySettingsError(data) {
const error = new Error();
error.name = LoriotErrorName.ConnectivitySettingsError;
error.message = data.message;
throw error;
}
throwRegistrationError(data) {
const error = new Error();
error.name = LoriotErrorName.RegistrationError;
error.message = data.message;
throw error;
}
throwDeviceProtocolsFetchError() {
const error = new Error();
error.name = LoriotErrorName.DeviceProtocolsFetchError;
error.message = gettext('Could not load device protocols.');
throw error;
}
throwNoDeviceProtocolsError() {
const error = new Error();
error.name = LoriotErrorName.NoDeviceProtocolsError;
error.message = this.translateService.instant(gettext(`No device protocols configured. Create a LoRa device protocol in <a href="{{ link }}">Device protocols</a>.`), {
link: '/apps/devicemanagement/#/deviceprotocols'
});
throw error;
}
throwApplicationError(data) {
const error = new Error();
error.name = LoriotErrorName.ApplicationError;
error.message = data.message;
throw error;
}
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: LoriotProviderService, deps: [{ token: i1.FetchClient }, { token: i1.InventoryService }, { token: i2.TranslateService }, { token: i3.AppStateService }], target: i0.ɵɵFactoryTarget.Injectable }); }
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: LoriotProviderService, providedIn: 'root' }); }
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: LoriotProviderService, decorators: [{
type: Injectable,
args: [{
providedIn: 'root'
}]
}], ctorParameters: () => [{ type: i1.FetchClient }, { type: i1.InventoryService }, { type: i2.TranslateService }, { type: i3.AppStateService }] });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibG9yaW90LXByb3ZpZGVyLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9sb3Jpb3QtZGV2aWNlLXJlZ2lzdHJhdGlvbi9sb3Jpb3QtcHJvdmlkZXIuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzNDLE9BQU8sRUFDTCxXQUFXLEVBR1gsZ0JBQWdCLEVBR2pCLE1BQU0sYUFBYSxDQUFDO0FBQ3JCLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQ3ZELE9BQU8sRUFBRSxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0scUJBQXFCLENBQUM7Ozs7O0FBRy9ELE1BQU0sQ0FBTixJQUFZLGVBT1g7QUFQRCxXQUFZLGVBQWU7SUFDekIsb0VBQWlELENBQUE7SUFDakQsOEVBQTJELENBQUE7SUFDM0QsMEVBQXVELENBQUE7SUFDdkQsMERBQXVDLENBQUE7SUFDdkMsMEVBQXVELENBQUE7SUFDdkQsd0RBQXFDLENBQUE7QUFDdkMsQ0FBQyxFQVBXLGVBQWUsS0FBZixlQUFlLFFBTzFCO0FBS0QsTUFBTSxPQUFPLHFCQUFxQjtJQUtoQyxZQUNVLE1BQW1CLEVBQ25CLGdCQUFrQyxFQUNsQyxnQkFBa0MsRUFDbEMsUUFBeUI7UUFIekIsV0FBTSxHQUFOLE1BQU0sQ0FBYTtRQUNuQixxQkFBZ0IsR0FBaEIsZ0JBQWdCLENBQWtCO1FBQ2xDLHFCQUFnQixHQUFoQixnQkFBZ0IsQ0FBa0I7UUFDbEMsYUFBUSxHQUFSLFFBQVEsQ0FBaUI7UUFSbEIsWUFBTyxHQUFXLGtCQUFrQixDQUFDO1FBQ3JDLG9CQUFlLEdBQVcsR0FBRyxJQUFJLENBQUMsT0FBTyxrQkFBa0IsQ0FBQztRQUM1RCxXQUFNLEdBQVEsRUFBRSxjQUFjLEVBQUUsa0JBQWtCLEVBQUUsQ0FBQztRQUNyRCxvQkFBZSxHQUFXLEdBQUcsSUFBSSxDQUFDLE9B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LHFCQUFxQjttSEFBckIscUJBQXFCLGNBRnBCLE1BQU07OzRGQUVQLHFCQUFxQjtrQkFIakMsVUFBVTttQkFBQztvQkFDVixVQUFVLEVBQUUsTUFBTTtpQkFDbkIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3RhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQge1xuICBGZXRjaENsaWVudCxcbiAgSUZldGNoT3B0aW9ucyxcbiAgSU1hbmFnZWRPYmplY3QsXG4gIEludmVudG9yeVNlcnZpY2UsXG4gIElSZXN1bHQsXG4gIElSZXN1bHRMaXN0XG59IGZyb20gJ0BjOHkvY2xpZW50JztcbmltcG9ydCB7IFRyYW5zbGF0ZVNlcnZpY2UgfSBmcm9tICdAbmd4LXRyYW5zbGF0ZS9jb3JlJztcbmltcG9ydCB7IGdldHRleHQsIEFwcFN0YXRlU2VydmljZSB9IGZyb20gJ0BjOHkvbmd4LWNvbXBvbmVudHMnO1xuaW1wb3J0IHsgQXBwbGljYXRpb24sIExvcmlvdERldmljZSB9IGZyb20gJy4vbG9yaW90LWRldmljZS1yZWdpc3RyYXRpb24ubW9kZWwnO1xuXG5leHBvcnQgZW51bSBMb3Jpb3RFcnJvck5hbWUge1xuICBOb0RldmljZVByb3RvY29sc0Vycm9yID0gJ05vRGV2aWNlUHJvdG9jb2xzRXJyb3InLFxuICBOb0Nvbm5lY3Rpdml0eVNldHRpbmdzRXJyb3IgPSAnTm9Db25uZWN0aXZpdHlTZXR0aW5nc0Vycm9yJyxcbiAgQ29ubmVjdGl2aXR5U2V0dGluZ3NFcnJvciA9ICdDb25uZWN0aXZpdHlTZXR0aW5nc0Vycm9yJyxcbiAgUmVnaXN0cmF0aW9uRXJyb3IgPSAnUmVnaXN0cmF0aW9uRXJyb3InLFxuICBEZXZpY2VQcm90b2NvbHNGZXRjaEVycm9yID0gJ0RldmljZVByb3RvY29sc0ZldGNoRXJyb3InLFxuICBBcHBsaWNhdGlvbkVycm9yID0gJ0FwcGxpY2F0aW9uRXJyb3InXG59XG5cbkBJbmplY3RhYmxlKHtcbiAgcHJvdmlkZWRJbjogJ3Jvb3QnXG59KVxuZXhwb3J0IGNsYXNzIExvcmlvdFByb3ZpZGVyU2VydmljZSB7XG4gIHByaXZhdGUgcmVhZG9ubHkgYmFzZVVybDogc3RyaW5nID0gJy9zZXJ2aWNlL2xvcmlvdC8nO1xuICBwcml2YXRlIHJlYWRvbmx5IHJlZ2lzdHJhdGlvblVybDogc3RyaW5nID0gYCR7dGhpcy5iYXNlVXJsfW5ld0RldmljZVJlcXVlc3RgO1xuICBwcml2YXRlIHJlYWRvbmx5IGhlYWRlcjogYW55ID0geyAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nIH07XG4gIHByaXZhdGUgcmVhZG9ubHkgYXBwbGljYXRpb25zVXJsOiBzdHJpbmcgPSBgJHt0aGlzLmJhc2VVcmx9YXBwbGljYXRpb25zYDtcbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSBjbGllbnQ6IEZldGNoQ2xpZW50LFxuICAgIHByaXZhdGUgaW52ZW50b3J5U2VydmljZTogSW52ZW50b3J5U2VydmljZSxcbiAgICBwcml2YXRlIHRyYW5zbGF0ZVNlcnZpY2U6IFRyYW5zbGF0ZVNlcnZpY2UsXG4gICAgcHJpdmF0ZSBhcHBTdGF0ZTogQXBwU3RhdGVTZXJ2aWNlXG4gICkge31cbiAgYXN5bmMgZ2V0Q29ubmVjdGlvbnMoKSB7XG4gICAgY29uc3Qgb3B0aW9uczogSUZldGNoT3B0aW9ucyA9IHtcbiAgICAgIG1ldGhvZDogJ0dFVCcsXG4gICAgICBoZWFkZXJzOiB0aGlzLmhlYWRlclxuICAgIH07XG4gICAgY29uc3QgcmVzID0gYXdhaXQgdGhpcy5jbGllbnQuZmV0Y2goYCR7dGhpcy5iYXNlVXJsfWxucy1jb25uZWN0aW9uYCwgb3B0aW9ucyk7XG4gICAgY29uc3QgZGF0YSA9IGF3YWl0IHJlcy5qc29uKCk7XG5cbiAgICBpZiAocmVzLnN0YXR1cyA9PT0gMjAwKSB7XG4gICAgICBpZiAoZGF0YS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgYXdhaXQgdGhpcy50aHJvd05vQ29ubmVjdGl2aXR5U2V0dGluZ3NFcnJvcigpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBhd2FpdCB0aGlzLnRocm93Q29ubmVjdGl2aXR5U2V0dGluZ3NFcnJvcihkYXRhKTtcbiAgICB9XG4gICAgcmV0dXJuIHsgcmVzLCBkYXRhIH07XG4gIH1cblxuICBhc3luYyBjcmVhdGVEZXZpY2UoZGV2aWNlOiBMb3Jpb3REZXZpY2UpOiBQcm9taXNlPElSZXN1bHQ8TG9yaW90RGV2aWNlPj4ge1xuICAgIGNvbnN0IG9wdGlvbnM6IElGZXRjaE9wdGlvbnMgPSB7XG4gICAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICAgIGhlYWRlcnM6IHRoaXMuaGVhZGVyLFxuICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkoZGV2aWNlKVxuICAgIH07XG4gICAgY29uc3QgcmVzID0gYXdhaXQgdGhpcy5jbGllbnQuZmV0Y2godGhpcy5yZWdpc3RyYXRpb25VcmwsIG9wdGlvbnMpO1xuICAgIGNvbnN0IGRhdGEgPSBhd2FpdCByZXMuanNvbigpO1xuXG4gICAgaWYgKHJlcy5zdGF0dXMgIT09IDIwMSkge1xuICAgICAgdGhpcy50aHJvd1JlZ2lzdHJhdGlvbkVycm9yKGRhdGEpO1xuICAgIH1cbiAgICByZXR1cm4geyByZXMsIGRhdGEgfTtcbiAgfVxuXG4gIGFzeW5jIGdldEF2YWlsYWJsZVByb3RvY29scyhcbiAgICBmaWx0ZXI6IG9iamVjdCA9IHsgd2l0aFRvdGFsUGFnZXM6IHRydWUgfVxuICApOiBQcm9taXNlPElSZXN1bHRMaXN0PElNYW5hZ2VkT2JqZWN0Pj4ge1xuICAgIGNvbnN0IHF1ZXJ5ID0ge1xuICAgICAgX19maWx0ZXI6IHtcbiAgICAgICAgX19hbmQ6IFtcbiAgICAgICAgICB7IF9faGFzOiAnYzh5X0lzRGV2aWNlVHlwZScgfSxcbiAgICAgICAgICB7XG4gICAgICAgICAgICB0eXBlOiB7IF9faW46IFsnYzh5X0xvcmFEZXZpY2VUeXBlJywgJ2M4eV9McHdhbkRldmljZVR5cGUnXSB9XG4gICAgICAgICAgfVxuICAgICAgICBdXG4gICAgICB9LFxuICAgICAgX19vcmRlcmJ5OiBbeyBuYW1lOiAxIH1dXG4gICAgfTtcbiAgICBjb25zdCBkZXZpY2VQcm90b2NvbHNMaXN0ID0gYXdhaXQgdGhpcy5pbnZlbnRvcnlTZXJ2aWNlLmxpc3RRdWVyeShxdWVyeSwgZmlsdGVyKTtcbiAgICBjb25zdCB7IHJlcywgZGF0YSB9ID0gZGV2aWNlUHJvdG9jb2xzTGlzdDtcbiAgICBpZiAocmVzLnN0YXR1cyA9PT0gMjAwKSB7XG4gICAgICBpZiAoZGF0YS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgdGhpcy50aHJvd05vRGV2aWNlUHJvdG9jb2xzRXJyb3IoKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy50aHJvd0RldmljZVByb3RvY29sc0ZldGNoRXJyb3IoKTtcbiAgICB9XG5cbiAgICByZXR1cm4gZGV2aWNlUHJvdG9jb2xzTGlzdDtcbiAgfVxuXG4gIGFzeW5jIGdldEFwcGxpY2F0aW9ucyhjb25uZWN0aW9uTmFtZTogc3RyaW5nKTogUHJvbWlzZTxJUmVzdWx0TGlzdDxBcHBsaWNhdGlvbj4+IHtcbiAgICBjb25zdCBvcHRpb25zOiBJRmV0Y2hPcHRpb25zID0ge1xuICAgICAgbWV0aG9kOiAnR0VUJyxcbiAgICAgIGhlYWRlcnM6IHRoaXMuaGVhZGVyLFxuICAgICAgcGFyYW1zOiB7XG4gICAgICAgIGxvcmlvdENvbm5lY3Rpb25OYW1lOiBjb25uZWN0aW9uTmFtZVxuICAgICAgfVxuICAgIH07XG4gICAgY29uc3QgcmVzID0gYXdhaXQgdGhpcy5jbGllbnQuZmV0Y2godGhpcy5hcHBsaWNhdGlvbnNVcmwsIG9wdGlvbnMpO1xuXG4gICAgY29uc3QgZGF0YSA9IGF3YWl0IHJlcy5qc29uKCk7XG4gICAgLyogRXZlcnkgY29ubmVjdGlvbiB3aWxsIGhhdmUgYXRsZWFzdCAxIGFwcGxpY2F0aW9uLFxuICAgIHNvIGhhdmluZyBjaGVjayBmb3IgdGhpcyBlbnBvaW50IHJldHVybmluZyBlbXB0eSByZXN1bHQgaXMgbm90IG5lZWRlZCovXG4gICAgaWYgKHJlcy5zdGF0dXMgIT09IDIwMCkge1xuICAgICAgdGhpcy50aHJvd0FwcGxpY2F0aW9uRXJyb3IoZGF0YSk7XG4gICAgfVxuICAgIHJldHVybiB7IHJlcywgZGF0YSB9O1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyB0aHJvd05vQ29ubmVjdGl2aXR5U2V0dGluZ3NFcnJvcigpIHtcbiAgICBjb25zdCBlcnJvciA9IG5ldyBFcnJvcigpO1xuICAgIGVycm9yLm5hbWUgPSBMb3Jpb3RFcnJvck5hbWUuTm9Db25uZWN0aXZpdHlTZXR0aW5nc0Vycm9yO1xuICAgIGNvbnN0IGhhc0FkbWluUmlnaHQgPSBhd2FpdCB0aGlzLmFwcFN0YXRlLmlzQXBwbGljYXRpb25BdmFpbGFibGUoJ2FkbWluaXN0cmF0aW9uJyk7XG4gICAgaWYgKGhhc0FkbWluUmlnaHQpIHtcbiAgICAgIGVycm9yLm1lc3NhZ2UgPSB0aGlzLnRyYW5zbGF0ZVNlcnZpY2UuaW5zdGFudChcbiAgICAgICAgZ2V0dGV4dChcbiAgICAgICAgICBgQ29ubmVjdGl2aXR5IHNldHRpbmdzIGFyZSBub3QgY29uZmlndXJlZC4gQ29uZmlndXJlIHRoZW0gaW4gdGhlIEFkbWluaXN0cmF0aW9uIGFwcGxpY2F0aW9uIHVuZGVyIDxhIGhyZWY9XCJ7eyBsaW5rIH19XCI+U2V0dGluZ3M8L2E+LmBcbiAgICAgICAgKSxcbiAgICAgICAge1xuICAgICAgICAgIGxpbms6ICcvYXBwcy9hZG1pbmlzdHJhdGlvbi9pbmRleC5odG1sIy9jb25uZWN0aXZpdHlTZXR0aW5ncy9tdWx0aXBsZV9sbnNfY29ubmVjdG9yc19sb3Jpb3QnXG4gICAgICAgIH1cbiAgICAgICk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGVycm9yLm1lc3NhZ2UgPSBnZXR0ZXh0KFxuICAgICAgICAnQ29ubmVjdGl2aXR5IHNldHRpbmdzIGFyZSBub3QgY29uZmlndXJlZC4gQ29udGFjdCB0aGUgYWRtaW5pc3RyYXRvci4nXG4gICAgICApO1xuICAgIH1cblxuICAgIHRocm93IGVycm9yO1xuICB9XG5cbiAgcHJpdmF0ZSB0aHJvd0Nvbm5lY3Rpdml0eVNldHRpbmdzRXJyb3IoZGF0YTogeyBtZXNzYWdlOiBzdHJpbmcgfSkge1xuICAgIGNvbnN0IGVycm9yID0gbmV3IEVycm9yKCk7XG4gICAgZXJyb3IubmFtZSA9IExvcmlvdEVycm9yTmFtZS5Db25uZWN0aXZpdHlTZXR0aW5nc0Vycm9yO1xuICAgIGVycm9yLm1lc3NhZ2UgPSBkYXRhLm1lc3NhZ2U7XG4gICAgdGhyb3cgZXJyb3I7XG4gIH1cblxuICBwcml2YXRlIHRocm93UmVnaXN0cmF0aW9uRXJyb3IoZGF0YTogeyBtZXNzYWdlOiBzdHJpbmcgfSkge1xuICAgIGNvbnN0IGVycm9yID0gbmV3IEVycm9yKCk7XG4gICAgZXJyb3IubmFtZSA9IExvcmlvdEVycm9yTmFtZS5SZWdpc3RyYXRpb25FcnJvcjtcbiAgICBlcnJvci5tZXNzYWdlID0gZGF0YS5tZXNzYWdlO1xuICAgIHRocm93IGVycm9yO1xuICB9XG5cbiAgcHJpdmF0ZSB0aHJvd0RldmljZVByb3RvY29sc0ZldGNoRXJyb3IoKSB7XG4gICAgY29uc3QgZXJyb3IgPSBuZXcgRXJyb3IoKTtcbiAgICBlcnJvci5uYW1lID0gTG9yaW90RXJyb3JOYW1lLkRldmljZVByb3RvY29sc0ZldGNoRXJyb3I7XG4gICAgZXJyb3IubWVzc2FnZSA9IGdldHRleHQoJ0NvdWxkIG5vdCBsb2FkIGRldmljZSBwcm90b2NvbHMuJyk7XG4gICAgdGhyb3cgZXJyb3I7XG4gIH1cblxuICBwcml2YXRlIHRocm93Tm9EZXZpY2VQcm90b2NvbHNFcnJvcigpIHtcbiAgICBjb25zdCBlcnJvciA9IG5ldyBFcnJvcigpO1xuICAgIGVycm9yLm5hbWUgPSBMb3Jpb3RFcnJvck5hbWUuTm9EZXZpY2VQcm90b2NvbHNFcnJvcjtcbiAgICBlcnJvci5tZXNzYWdlID0gdGhpcy50cmFuc2xhdGVTZXJ2aWNlLmluc3RhbnQoXG4gICAgICBnZXR0ZXh0KFxuICAgICAgICBgTm8gZGV2aWNlIHByb3RvY29scyBjb25maWd1cmVkLiBDcmVhdGUgYSBMb1JhIGRldmljZSBwcm90b2NvbCBpbiA8YSBocmVmPVwie3sgbGluayB9fVwiPkRldmljZSBwcm90b2NvbHM8L2E+LmBcbiAgICAgICksXG4gICAgICB7XG4gICAgICAgIGxpbms6ICcvYXBwcy9kZXZpY2VtYW5hZ2VtZW50LyMvZGV2aWNlcHJvdG9jb2xzJ1xuICAgICAgfVxuICAgICk7XG4gICAgdGhyb3cgZXJyb3I7XG4gIH1cblxuICBwcml2YXRlIHRocm93QXBwbGljYXRpb25FcnJvcihkYXRhOiB7IG1lc3NhZ2U6IHN0cmluZyB9KSB7XG4gICAgY29uc3QgZXJyb3IgPSBuZXcgRXJyb3IoKTtcbiAgICBlcnJvci5uYW1lID0gTG9yaW90RXJyb3JOYW1lLkFwcGxpY2F0aW9uRXJyb3I7XG4gICAgZXJyb3IubWVzc2FnZSA9IGRhdGEubWVzc2FnZTtcbiAgICB0aHJvdyBlcnJvcjtcbiAgfVxufVxuIl19