UNPKG

@c8y/ngx-components

Version:

Angular modules for Cumulocity IoT applications

184 lines 23.5 kB
import { Injectable } from '@angular/core'; import { FetchClient, InventoryService, TenantOptionsService } from '@c8y/client'; import { AppStateService, gettext } from '@c8y/ngx-components'; import { TranslateService } from '@ngx-translate/core'; 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 SigfoxErrorName; (function (SigfoxErrorName) { SigfoxErrorName["NoDeviceProtocolsError"] = "NoDeviceProtocolsError"; SigfoxErrorName["NoConnectivitySettingsError"] = "NoConnectivitySettingsError"; SigfoxErrorName["ConnectivitySettingsError"] = "ConnectivitySettingsError"; SigfoxErrorName["ContractError"] = "ContractError"; SigfoxErrorName["NoContractsError"] = "NoContractsError"; SigfoxErrorName["RegistrationError"] = "RegistrationError"; SigfoxErrorName["DeviceProtocolsFetchError"] = "DeviceProtocolsFetchError"; })(SigfoxErrorName || (SigfoxErrorName = {})); export class SigfoxProviderService { constructor(client, inventoryService, tenantOptions, translateService, appState) { this.client = client; this.inventoryService = inventoryService; this.tenantOptions = tenantOptions; this.translateService = translateService; this.appState = appState; this.baseUrl = '/service/sigfox-agent/'; this.registrationUrl = `${this.baseUrl}newDeviceRequest`; this.contractsUrl = `${this.baseUrl}contract`; this.header = { 'Content-Type': 'application/json' }; } 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 }; } /** * Gets contracts from Sigfox platform. * @param connectionName The name of connection for which contracts will be retrieved * @returns The result list with contract, or throws an error with exception. */ async getContracts(connectionName) { const options = { method: 'GET', headers: this.header, params: { sigfoxConnectionName: connectionName } }; const res = await this.client.fetch(this.contractsUrl, options); const data = await res.json(); if (res.status === 200) { if (data.length === 0) { this.throwNoContractsError(); } } else { this.throwContractError(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_SigfoxDeviceType', '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 hasConnectivitySettings() { const option = { category: 'sigfox-agent', key: 'provider.token' }; try { await this.tenantOptions.detail(option); return true; } catch (e) { await this.throwNoConnectivitySettingsError(); } } async throwNoConnectivitySettingsError() { const error = new Error(); error.name = SigfoxErrorName.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_sigfox' }); } else { error.message = gettext('Connectivity settings are not configured. Contact the administrator.'); } throw error; } throwConnectivitySettingsError(data) { const error = new Error(); error.name = SigfoxErrorName.ConnectivitySettingsError; error.message = data.message; throw error; } throwRegistrationError(data) { const error = new Error(); error.name = SigfoxErrorName.RegistrationError; error.message = data.message; throw error; } throwDeviceProtocolsFetchError() { const error = new Error(); error.name = SigfoxErrorName.DeviceProtocolsFetchError; error.message = gettext('Could not load device protocols.'); throw error; } throwNoDeviceProtocolsError() { const error = new Error(); error.name = SigfoxErrorName.NoDeviceProtocolsError; error.message = this.translateService.instant(gettext(`No device protocols configured. Create a Sigfox device protocol in <a href="{{ link }}">Device protocols</a>.`), { link: '/apps/devicemanagement/#/deviceprotocols' }); throw error; } throwContractError(data) { const error = new Error(); error.name = SigfoxErrorName.ContractError; error.message = data.message; throw error; } throwNoContractsError() { const error = new Error(); error.name = SigfoxErrorName.NoContractsError; error.message = gettext('No contracts found. New contracts must be created via the Sigfox platform.'); throw error; } static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: SigfoxProviderService, deps: [{ token: i1.FetchClient }, { token: i1.InventoryService }, { token: i1.TenantOptionsService }, { 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: SigfoxProviderService, providedIn: 'root' }); } } i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: SigfoxProviderService, decorators: [{ type: Injectable, args: [{ providedIn: 'root' }] }], ctorParameters: () => [{ type: i1.FetchClient }, { type: i1.InventoryService }, { type: i1.TenantOptionsService }, { type: i2.TranslateService }, { type: i3.AppStateService }] }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2lnZm94LXByb3ZpZGVyLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zaWdmb3gtZGV2aWNlLXJlZ2lzdHJhdGlvbi9zaWdmb3gtcHJvdmlkZXIuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzNDLE9BQU8sRUFDTCxXQUFXLEVBR1gsZ0JBQWdCLEVBSWhCLG9CQUFvQixFQUNyQixNQUFNLGFBQWEsQ0FBQztBQUNyQixPQUFPLEVBQUUsZUFBZSxFQUFFLE9BQU8sRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQy9ELE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLHFCQUFxQixDQUFDOzs7OztBQUd2RCxNQUFNLENBQU4sSUFBWSxlQVFYO0FBUkQsV0FBWSxlQUFlO0lBQ3pCLG9FQUFpRCxDQUFBO0lBQ2pELDhFQUEyRCxDQUFBO0lBQzNELDBFQUF1RCxDQUFBO0lBQ3ZELGtEQUErQixDQUFBO0lBQy9CLHdEQUFxQyxDQUFBO0lBQ3JDLDBEQUF1QyxDQUFBO0lBQ3ZDLDBFQUF1RCxDQUFBO0FBQ3pELENBQUMsRUFSVyxlQUFlLEtBQWYsZUFBZSxRQVExQjtBQUtELE1BQU0sT0FBTyxxQkFBcUI7SUFNaEMsWUFDVSxNQUFtQixFQUNuQixnQkFBa0MsRUFDbEMsYUFBbUMsRUFDbkMsZ0JBQWtDLEVBQ2xDLFFBQXlCO1FBSnpCLFdBQU0sR0FBTixNQUFNLENBQWE7UUFDbkIscUJBQWdCLEdBQWhCLGdCQUFnQixDQUFrQjtRQUNsQyxrQkFBYSxHQUFiLGFBQWEsQ0FBc0I7UUFDbkMscUJBQWdCLEdBQWhCLGdCQUFnQixDQUFrQjtRQUNsQyxhQUFRLEdBQVIsUUFBUSxDQUFpQjtRQVZsQixZQUFPLEdBQVcsd0JBQXdCLENBQUM7UUFDM0Msb0JBQWUsR0FBVyxHQUFHLElBQUksQ0FBQyxPQUFPLGtCQUFrQixDQUFDO1FBQzVELGlCQUFZ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QUM7SUFDZCxDQUFDO0lBRU8sMkJBQTJCO1FBQ2pDLE1BQU0sS0FBSyxHQUFHLElBQUksS0FBSyxFQUFFLENBQUM7UUFDMUIsS0FBSyxDQUFDLElBQUksR0FBRyxlQUFlLENBQUMsc0JBQXNCLENBQUM7UUFDcEQsS0FBSyxDQUFDLE9BQU8sR0FBRyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsT0FBTyxDQUMzQyxPQUFPLENBQ0wsK0dBQStHLENBQ2hILEVBQ0Q7WUFDRSxJQUFJLEVBQUUsMENBQTBDO1NBQ2pELENBQ0YsQ0FBQztRQUNGLE1BQU0sS0FBSyxDQUFDO0lBQ2QsQ0FBQztJQUVPLGtCQUFrQixDQUFDLElBQXlCO1FBQ2xELE1BQU0sS0FBSyxHQUFHLElBQUksS0FBSyxFQUFFLENBQUM7UUFDMUIsS0FBSyxDQUFDLElBQUksR0FBRyxlQUFlLENBQUMsYUFBYSxDQUFDO1FBQzNDLEtBQUssQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQztRQUM3QixNQUFNLEtBQUssQ0FBQztJQUNkLENBQUM7SUFFTyxxQkFBcUI7UUFDM0IsTUFBTSxLQUFLLEdBQUcsSUFBSSxLQUFLLEVBQUUsQ0FBQztRQUMxQixLQUFLLENBQUMsSUFBSSxHQUFHLGVBQWUsQ0FBQyxnQkFBZ0IsQ0FBQztRQUM5QyxLQUFLLENBQUMsT0FBTyxHQUFHLE9BQU8sQ0FDckIsNEVBQTRFLENBQzdFLENBQUM7UUFDRixNQUFNLEtBQUssQ0FBQztJQUNkLENBQUM7K0dBdkxVLHFCQUFxQjttSEFBckIscUJBQXFCLGNBRnBCLE1BQU07OzRGQUVQLHFCQUFxQjtrQkFIakMsVUFBVTttQkFBQztvQkFDVixVQUFVLEVBQUUsTUFBTTtpQkFDbkIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3RhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQge1xuICBGZXRjaENsaWVudCxcbiAgSUZldGNoT3B0aW9ucyxcbiAgSU1hbmFnZWRPYmplY3QsXG4gIEludmVudG9yeVNlcnZpY2UsXG4gIElSZXN1bHQsXG4gIElSZXN1bHRMaXN0LFxuICBJVGVuYW50T3B0aW9uLFxuICBUZW5hbnRPcHRpb25zU2VydmljZVxufSBmcm9tICdAYzh5L2NsaWVudCc7XG5pbXBvcnQgeyBBcHBTdGF0ZVNlcnZpY2UsIGdldHRleHQgfSBmcm9tICdAYzh5L25neC1jb21wb25lbnRzJztcbmltcG9ydCB7IFRyYW5zbGF0ZVNlcnZpY2UgfSBmcm9tICdAbmd4LXRyYW5zbGF0ZS9jb3JlJztcbmltcG9ydCB7IFNpZ2ZveERldmljZSB9IGZyb20gJy4vc2lnZm94LWRldmljZS1yZWdpc3RyYXRpb24ubW9kZWwnO1xuXG5leHBvcnQgZW51bSBTaWdmb3hFcnJvck5hbWUge1xuICBOb0RldmljZVByb3RvY29sc0Vycm9yID0gJ05vRGV2aWNlUHJvdG9jb2xzRXJyb3InLFxuICBOb0Nvbm5lY3Rpdml0eVNldHRpbmdzRXJyb3IgPSAnTm9Db25uZWN0aXZpdHlTZXR0aW5nc0Vycm9yJyxcbiAgQ29ubmVjdGl2aXR5U2V0dGluZ3NFcnJvciA9ICdDb25uZWN0aXZpdHlTZXR0aW5nc0Vycm9yJyxcbiAgQ29udHJhY3RFcnJvciA9ICdDb250cmFjdEVycm9yJyxcbiAgTm9Db250cmFjdHNFcnJvciA9ICdOb0NvbnRyYWN0c0Vycm9yJyxcbiAgUmVnaXN0cmF0aW9uRXJyb3IgPSAnUmVnaXN0cmF0aW9uRXJyb3InLFxuICBEZXZpY2VQcm90b2NvbHNGZXRjaEVycm9yID0gJ0RldmljZVByb3RvY29sc0ZldGNoRXJyb3InXG59XG5cbkBJbmplY3RhYmxlKHtcbiAgcHJvdmlkZWRJbjogJ3Jvb3QnXG59KVxuZXhwb3J0IGNsYXNzIFNpZ2ZveFByb3ZpZGVyU2VydmljZSB7XG4gIHByaXZhdGUgcmVhZG9ubHkgYmFzZVVybDogc3RyaW5nID0gJy9zZXJ2aWNlL3NpZ2ZveC1hZ2VudC8nO1xuICBwcml2YXRlIHJlYWRvbmx5IHJlZ2lzdHJhdGlvblVybDogc3RyaW5nID0gYCR7dGhpcy5iYXNlVXJsfW5ld0RldmljZVJlcXVlc3RgO1xuICBwcml2YXRlIHJlYWRvbmx5IGNvbnRyYWN0c1VybDogc3RyaW5nID0gYCR7dGhpcy5iYXNlVXJsfWNvbnRyYWN0YDtcbiAgcHJpdmF0ZSByZWFkb25seSBoZWFkZXI6IGFueSA9IHsgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyB9O1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgY2xpZW50OiBGZXRjaENsaWVudCxcbiAgICBwcml2YXRlIGludmVudG9yeVNlcnZpY2U6IEludmVudG9yeVNlcnZpY2UsXG4gICAgcHJpdmF0ZSB0ZW5hbnRPcHRpb25zOiBUZW5hbnRPcHRpb25zU2VydmljZSxcbiAgICBwcml2YXRlIHRyYW5zbGF0ZVNlcnZpY2U6IFRyYW5zbGF0ZVNlcnZpY2UsXG4gICAgcHJpdmF0ZSBhcHBTdGF0ZTogQXBwU3RhdGVTZXJ2aWNlXG4gICkge31cbiAgYXN5bmMgZ2V0Q29ubmVjdGlvbnMoKSB7XG4gICAgY29uc3Qgb3B0aW9uczogSUZldGNoT3B0aW9ucyA9IHtcbiAgICAgIG1ldGhvZDogJ0dFVCcsXG4gICAgICBoZWFkZXJzOiB0aGlzLmhlYWRlclxuICAgIH07XG4gICAgY29uc3QgcmVzID0gYXdhaXQgdGhpcy5jbGllbnQuZmV0Y2goYCR7dGhpcy5iYXNlVXJsfWxucy1jb25uZWN0aW9uYCwgb3B0aW9ucyk7XG4gICAgY29uc3QgZGF0YSA9IGF3YWl0IHJlcy5qc29uKCk7XG5cbiAgICBpZiAocmVzLnN0YXR1cyA9PT0gMjAwKSB7XG4gICAgICBpZiAoZGF0YS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgYXdhaXQgdGhpcy50aHJvd05vQ29ubmVjdGl2aXR5U2V0dGluZ3NFcnJvcigpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBhd2FpdCB0aGlzLnRocm93Q29ubmVjdGl2aXR5U2V0dGluZ3NFcnJvcihkYXRhKTtcbiAgICB9XG4gICAgcmV0dXJuIHsgcmVzLCBkYXRhIH07XG4gIH1cblxuICAvKipcbiAgICogR2V0cyBjb250cmFjdHMgZnJvbSBTaWdmb3ggcGxhdGZvcm0uXG4gICAqIEBwYXJhbSBjb25uZWN0aW9uTmFtZSBUaGUgbmFtZSBvZiBjb25uZWN0aW9uIGZvciB3aGljaCBjb250cmFjdHMgd2lsbCBiZSByZXRyaWV2ZWRcbiAgICogQHJldHVybnMgVGhlIHJlc3VsdCBsaXN0IHdpdGggY29udHJhY3QsIG9yIHRocm93cyBhbiBlcnJvciB3aXRoIGV4Y2VwdGlvbi5cbiAgICovXG4gIGFzeW5jIGdldENvbnRyYWN0cyhjb25uZWN0aW9uTmFtZTogc3RyaW5nKTogUHJvbWlzZTxJUmVzdWx0TGlzdDxhbnk+PiB7XG4gICAgY29uc3Qgb3B0aW9uczogSUZldGNoT3B0aW9ucyA9IHtcbiAgICAgIG1ldGhvZDogJ0dFVCcsXG4gICAgICBoZWFkZXJzOiB0aGlzLmhlYWRlcixcbiAgICAgIHBhcmFtczoge1xuICAgICAgICBzaWdmb3hDb25uZWN0aW9uTmFtZTogY29ubmVjdGlvbk5hbWVcbiAgICAgIH1cbiAgICB9O1xuICAgIGNvbnN0IHJlcyA9IGF3YWl0IHRoaXMuY2xpZW50LmZldGNoKHRoaXMuY29udHJhY3RzVXJsLCBvcHRpb25zKTtcblxuICAgIGNvbnN0IGRhdGEgPSBhd2FpdCByZXMuanNvbigpO1xuXG4gICAgaWYgKHJlcy5zdGF0dXMgPT09IDIwMCkge1xuICAgICAgaWYgKGRhdGEubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIHRoaXMudGhyb3dOb0NvbnRyYWN0c0Vycm9yKCk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMudGhyb3dDb250cmFjdEVycm9yKGRhdGEpO1xuICAgIH1cbiAgICByZXR1cm4geyByZXMsIGRhdGEgfTtcbiAgfVxuXG4gIGFzeW5jIGNyZWF0ZURldmljZShkZXZpY2U6IFNpZ2ZveERldmljZSk6IFByb21pc2U8SVJlc3VsdDxTaWdmb3hEZXZpY2U+PiB7XG4gICAgY29uc3Qgb3B0aW9uczogSUZldGNoT3B0aW9ucyA9IHtcbiAgICAgIG1ldGhvZDogJ1BPU1QnLFxuICAgICAgaGVhZGVyczogdGhpcy5oZWFkZXIsXG4gICAgICBib2R5OiBKU09OLnN0cmluZ2lmeShkZXZpY2UpXG4gICAgfTtcbiAgICBjb25zdCByZXMgPSBhd2FpdCB0aGlzLmNsaWVudC5mZXRjaCh0aGlzLnJlZ2lzdHJhdGlvblVybCwgb3B0aW9ucyk7XG4gICAgY29uc3QgZGF0YSA9IGF3YWl0IHJlcy5qc29uKCk7XG5cbiAgICBpZiAocmVzLnN0YXR1cyAhPT0gMjAxKSB7XG4gICAgICB0aGlzLnRocm93UmVnaXN0cmF0aW9uRXJyb3IoZGF0YSk7XG4gICAgfVxuICAgIHJldHVybiB7IHJlcywgZGF0YSB9O1xuICB9XG5cbiAgYXN5bmMgZ2V0QXZhaWxhYmxlUHJvdG9jb2xzKFxuICAgIGZpbHRlcjogb2JqZWN0ID0geyB3aXRoVG90YWxQYWdlczogdHJ1ZSB9XG4gICk6IFByb21pc2U8SVJlc3VsdExpc3Q8SU1hbmFnZWRPYmplY3Q+PiB7XG4gICAgY29uc3QgcXVlcnkgPSB7XG4gICAgICBfX2ZpbHRlcjoge1xuICAgICAgICBfX2FuZDogW1xuICAgICAgICAgIHsgX19oYXM6ICdjOHlfSXNEZXZpY2VUeXBlJyB9LFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIHR5cGU6IHsgX19pbjogWydjOHlfU2lnZm94RGV2aWNlVHlwZScsICdjOHlfTHB3YW5EZXZpY2VUeXBlJ10gfVxuICAgICAgICAgIH1cbiAgICAgICAgXVxuICAgICAgfSxcbiAgICAgIF9fb3JkZXJieTogW3sgbmFtZTogMSB9XVxuICAgIH07XG4gICAgY29uc3QgZGV2aWNlUHJvdG9jb2xzTGlzdCA9IGF3YWl0IHRoaXMuaW52ZW50b3J5U2VydmljZS5saXN0UXVlcnkocXVlcnksIGZpbHRlcik7XG4gICAgY29uc3QgeyByZXMsIGRhdGEgfSA9IGRldmljZVByb3RvY29sc0xpc3Q7XG5cbiAgICBpZiAocmVzLnN0YXR1cyA9PT0gMjAwKSB7XG4gICAgICBpZiAoZGF0YS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgdGhpcy50aHJvd05vRGV2aWNlUHJvdG9jb2xzRXJyb3IoKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy50aHJvd0RldmljZVByb3RvY29sc0ZldGNoRXJyb3IoKTtcbiAgICB9XG4gICAgcmV0dXJuIGRldmljZVByb3RvY29sc0xpc3Q7XG4gIH1cblxuICBhc3luYyBoYXNDb25uZWN0aXZpdHlTZXR0aW5ncygpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICBjb25zdCBvcHRpb246IElUZW5hbnRPcHRpb24gPSB7XG4gICAgICBjYXRlZ29yeTogJ3NpZ2ZveC1hZ2VudCcsXG4gICAgICBrZXk6ICdwcm92aWRlci50b2tlbidcbiAgICB9O1xuICAgIHRyeSB7XG4gICAgICBhd2FpdCB0aGlzLnRlbmFudE9wdGlvbnMuZGV0YWlsKG9wdGlvbik7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBhd2FpdCB0aGlzLnRocm93Tm9Db25uZWN0aXZpdHlTZXR0aW5nc0Vycm9yKCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyB0aHJvd05vQ29ubmVjdGl2aXR5U2V0dGluZ3NFcnJvcigpIHtcbiAgICBjb25zdCBlcnJvciA9IG5ldyBFcnJvcigpO1xuICAgIGVycm9yLm5hbWUgPSBTaWdmb3hFcnJvck5hbWUuTm9Db25uZWN0aXZpdHlTZXR0aW5nc0Vycm9yO1xuICAgIGNvbnN0IGhhc0FkbWluUmlnaHQgPSBhd2FpdCB0aGlzLmFwcFN0YXRlLmlzQXBwbGljYXRpb25BdmFpbGFibGUoJ2FkbWluaXN0cmF0aW9uJyk7XG4gICAgaWYgKGhhc0FkbWluUmlnaHQpIHtcbiAgICAgIGVycm9yLm1lc3NhZ2UgPSB0aGlzLnRyYW5zbGF0ZVNlcnZpY2UuaW5zdGFudChcbiAgICAgICAgZ2V0dGV4dChcbiAgICAgICAgICBgQ29ubmVjdGl2aXR5IHNldHRpbmdzIGFyZSBub3QgY29uZmlndXJlZC4gQ29uZmlndXJlIHRoZW0gaW4gdGhlIEFkbWluaXN0cmF0aW9uIGFwcGxpY2F0aW9uIHVuZGVyIDxhIGhyZWY9XCJ7eyBsaW5rIH19XCI+U2V0dGluZ3M8L2E+LmBcbiAgICAgICAgKSxcbiAgICAgICAge1xuICAgICAgICAgIGxpbms6ICcvYXBwcy9hZG1pbmlzdHJhdGlvbi9pbmRleC5odG1sIy9jb25uZWN0aXZpdHlTZXR0aW5ncy9tdWx0aXBsZV9sbnNfY29ubmVjdG9yc19zaWdmb3gnXG4gICAgICAgIH1cbiAgICAgICk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGVycm9yLm1lc3NhZ2UgPSBnZXR0ZXh0KFxuICAgICAgICAnQ29ubmVjdGl2aXR5IHNldHRpbmdzIGFyZSBub3QgY29uZmlndXJlZC4gQ29udGFjdCB0aGUgYWRtaW5pc3RyYXRvci4nXG4gICAgICApO1xuICAgIH1cblxuICAgIHRocm93IGVycm9yO1xuICB9XG5cbiAgcHJpdmF0ZSB0aHJvd0Nvbm5lY3Rpdml0eVNldHRpbmdzRXJyb3IoZGF0YTogeyBtZXNzYWdlOiBzdHJpbmcgfSkge1xuICAgIGNvbnN0IGVycm9yID0gbmV3IEVycm9yKCk7XG4gICAgZXJyb3IubmFtZSA9IFNpZ2ZveEVycm9yTmFtZS5Db25uZWN0aXZpdHlTZXR0aW5nc0Vycm9yO1xuICAgIGVycm9yLm1lc3NhZ2UgPSBkYXRhLm1lc3NhZ2U7XG4gICAgdGhyb3cgZXJyb3I7XG4gIH1cbiAgcHJpdmF0ZSB0aHJvd1JlZ2lzdHJhdGlvbkVycm9yKGRhdGE6IHsgbWVzc2FnZTogc3RyaW5nIH0pIHtcbiAgICBjb25zdCBlcnJvciA9IG5ldyBFcnJvcigpO1xuICAgIGVycm9yLm5hbWUgPSBTaWdmb3hFcnJvck5hbWUuUmVnaXN0cmF0aW9uRXJyb3I7XG4gICAgZXJyb3IubWVzc2FnZSA9IGRhdGEubWVzc2FnZTtcbiAgICB0aHJvdyBlcnJvcjtcbiAgfVxuXG4gIHByaXZhdGUgdGhyb3dEZXZpY2VQcm90b2NvbHNGZXRjaEVycm9yKCkge1xuICAgIGNvbnN0IGVycm9yID0gbmV3IEVycm9yKCk7XG4gICAgZXJyb3IubmFtZSA9IFNpZ2ZveEVycm9yTmFtZS5EZXZpY2VQcm90b2NvbHNGZXRjaEVycm9yO1xuICAgIGVycm9yLm1lc3NhZ2UgPSBnZXR0ZXh0KCdDb3VsZCBub3QgbG9hZCBkZXZpY2UgcHJvdG9jb2xzLicpO1xuICAgIHRocm93IGVycm9yO1xuICB9XG5cbiAgcHJpdmF0ZSB0aHJvd05vRGV2aWNlUHJvdG9jb2xzRXJyb3IoKSB7XG4gICAgY29uc3QgZXJyb3IgPSBuZXcgRXJyb3IoKTtcbiAgICBlcnJvci5uYW1lID0gU2lnZm94RXJyb3JOYW1lLk5vRGV2aWNlUHJvdG9jb2xzRXJyb3I7XG4gICAgZXJyb3IubWVzc2FnZSA9IHRoaXMudHJhbnNsYXRlU2VydmljZS5pbnN0YW50KFxuICAgICAgZ2V0dGV4dChcbiAgICAgICAgYE5vIGRldmljZSBwcm90b2NvbHMgY29uZmlndXJlZC4gQ3JlYXRlIGEgU2lnZm94IGRldmljZSBwcm90b2NvbCBpbiA8YSBocmVmPVwie3sgbGluayB9fVwiPkRldmljZSBwcm90b2NvbHM8L2E+LmBcbiAgICAgICksXG4gICAgICB7XG4gICAgICAgIGxpbms6ICcvYXBwcy9kZXZpY2VtYW5hZ2VtZW50LyMvZGV2aWNlcHJvdG9jb2xzJ1xuICAgICAgfVxuICAgICk7XG4gICAgdGhyb3cgZXJyb3I7XG4gIH1cblxuICBwcml2YXRlIHRocm93Q29udHJhY3RFcnJvcihkYXRhOiB7IG1lc3NhZ2U6IHN0cmluZyB9KSB7XG4gICAgY29uc3QgZXJyb3IgPSBuZXcgRXJyb3IoKTtcbiAgICBlcnJvci5uYW1lID0gU2lnZm94RXJyb3JOYW1lLkNvbnRyYWN0RXJyb3I7XG4gICAgZXJyb3IubWVzc2FnZSA9IGRhdGEubWVzc2FnZTtcbiAgICB0aHJvdyBlcnJvcjtcbiAgfVxuXG4gIHByaXZhdGUgdGhyb3dOb0NvbnRyYWN0c0Vycm9yKCkge1xuICAgIGNvbnN0IGVycm9yID0gbmV3IEVycm9yKCk7XG4gICAgZXJyb3IubmFtZSA9IFNpZ2ZveEVycm9yTmFtZS5Ob0NvbnRyYWN0c0Vycm9yO1xuICAgIGVycm9yLm1lc3NhZ2UgPSBnZXR0ZXh0KFxuICAgICAgJ05vIGNvbnRyYWN0cyBmb3VuZC4gTmV3IGNvbnRyYWN0cyBtdXN0IGJlIGNyZWF0ZWQgdmlhIHRoZSBTaWdmb3ggcGxhdGZvcm0uJ1xuICAgICk7XG4gICAgdGhyb3cgZXJyb3I7XG4gIH1cbn1cbiJdfQ==