UNPKG

ng-smart-on-fhir

Version:

[![SRDC](https://www.srdc.com.tr/wp-content/uploads/2014/12/srdc-wp.png)](https://srdc.com.tr/en)

157 lines 20.9 kB
import { Inject, Injectable } from '@angular/core'; import * as i0 from "@angular/core"; import * as i1 from "./smart-auth.service"; /** * Authenticated FHIR client */ export class SmartOnFhirService { get importedResources() { return this._importedResources; } constructor(config = {}, auth) { this.config = config; this.auth = auth; // imported local resources from SHCs this.importedSHCards = []; this._importedResources = {}; } getClient() { return this.auth.getClient(); } async ready(callback) { const client = await this.getClient(); return client ? callback(client) : Promise.reject(); } getPatient() { return this.auth.getPatient(); } // FHIR Search search(resourceType, ...params) { return this.ready(client => client.request({ url: this.constructQueryURL(resourceType, params) })); } // FHIR Create (POST/PUT) create(resource, id) { return this.ready(client => { if (id) { const _resource = { ...resource, id: id }; return client.update(resource); } else { const _resource = { ...resource }; delete _resource.id; return client.create(_resource); } }); } // FHIR DELETE delete(resourceType, id, params) { if (!resourceType) return Promise.reject('Resource type should be provided.'); return this.ready(client => { if (id) { return client.delete(resourceType + '/' + id); } else { return client.delete(this.constructQueryURL(resourceType, params)); } }); } // FHIR Operation operation(options) { const opUrl = (options.resourceType ? options.resourceType + (options.resourceId ? '/' + options.resourceId : '') + '/' : '') + '$' + options.operationName; return this.ready(client => client.request({ method: 'POST', url: opUrl + (options.queryParams?.length ? this.constructQueryURL('', options.queryParams) : ''), body: JSON.stringify(options.params || {}) })); } transaction(bundle, method) { let transactionBundle; if (method && Array.isArray(bundle)) { transactionBundle = { resourceType: 'Bundle', type: 'transaction', entry: bundle.map(resource => { return { resource, request: { method: method, url: (method === 'PUT' || method === 'PATCH') && resource.id ? resource.resourceType + '/' + resource.id : resource.resourceType } }; }) }; } else { transactionBundle = bundle; } return this.ready(client => client.request({ method: 'POST', url: '/', body: JSON.stringify(transactionBundle) })); } // FHIR Request query(url) { if (url.length >= 2048) { return this.ready(client => client.request({ method: 'POST', url: '', body: JSON.stringify({ resourceType: 'Bundle', type: 'batch', entry: [{ request: { url, method: 'GET' } }] }) })).then(bundle => bundle.entry?.at(0)?.resource); } return this.ready(client => client.request({ url: url + (url.includes('Observation') ? '&_count=999' : '') })); } logout() { this.auth.logout(); } // Construct FHIR API url from the given query constructQueryURL(resourceType, params) { return resourceType + '?' + (params?.map(_params => Object.keys(_params).map(key => key + '=' + _params[key]).join('&')).filter(_ => _).join('&') || ''); } // Import data from SHC importSHCData(param) { const { bundle, shc } = param; this.importedSHCards.push(param); this._importedResources = this.importedSHCards.map(shc => shc.bundle.entry?.map(entry => entry.resource) || []).flat() .reduce((o, r) => { if (!r) { return; } if (!o[r.resourceType]) { o[r.resourceType] = []; } o[r.resourceType].push(r); return o; }, {}); const patient = bundle.entry?.find(entry => entry.resource?.resourceType === 'Patient')?.resource; this.auth.offline(patient, shc); } // Return all imported resources from SHC getAllImportedResources() { return Object.values(this.importedResources).flat(); } static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: SmartOnFhirService, deps: [{ token: 'sofConfig' }, { token: i1.SmartAuthService }], target: i0.ɵɵFactoryTarget.Injectable }); } static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: SmartOnFhirService }); } } i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: SmartOnFhirService, decorators: [{ type: Injectable }], ctorParameters: () => [{ type: undefined, decorators: [{ type: Inject, args: ['sofConfig'] }] }, { type: i1.SmartAuthService }] }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic21hcnQtb24tZmhpci5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvc21hcnQtb24tZmhpci9zcmMvbGliL3NlcnZpY2VzL3NtYXJ0LW9uLWZoaXIuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUMsTUFBTSxFQUFFLFVBQVUsRUFBQyxNQUFNLGVBQWUsQ0FBQzs7O0FBS2pEOztHQUVHO0FBRUgsTUFBTSxPQUFPLGtCQUFrQjtJQUs3QixJQUFJLGlCQUFpQjtRQUNuQixPQUFPLElBQUksQ0FBQyxrQkFBa0IsQ0FBQztJQUNqQyxDQUFDO0lBRUQsWUFBd0MsU0FBNEIsRUFBRSxFQUFVLElBQXNCO1FBQTlELFdBQU0sR0FBTixNQUFNLENBQXdCO1FBQVUsU0FBSSxHQUFKLElBQUksQ0FBa0I7UUFQdEcscUNBQXFDO1FBQzdCLG9CQUFlLEdBQThELEVBQUUsQ0FBQztRQUNoRix1QkFBa0IsR0FBMEMsRUFBRSxDQUFDO0lBTXZFLENBQUM7SUFFRCxTQUFTO1FBQ1AsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDO0lBQy9CLENBQUM7SUFFTyxLQUFLLENBQUMsS0FBSyxDQUFJLFFBQXdDO1FBQzdELE1BQU0sTUFBTSxHQUFHLE1BQU0sSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFBO1FBQ3JDLE9BQU8sTUFBTSxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxNQUFNLEVBQUUsQ0FBQTtJQUNyRCxDQUFDO0lBRUQsVUFBVTtRQUNSLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQTtJQUMvQixDQUFDO0lBRUQsY0FBYztJQUNkLE1BQU0sQ0FBSSxZQUFvQixFQUFFLEdBQUcsTUFBYTtRQUM5QyxPQUFPLElBQUksQ0FBQyxLQUFLLENBQWtCLE1BQU0sQ0FBQyxF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amVjdCwgSW5qZWN0YWJsZX0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCBDbGllbnQgZnJvbSBcImZoaXJjbGllbnQvbGliL0NsaWVudFwiO1xyXG5pbXBvcnQge1NtYXJ0QXV0aFNlcnZpY2V9IGZyb20gXCIuL3NtYXJ0LWF1dGguc2VydmljZVwiO1xyXG5pbXBvcnQge1NtYXJ0T25GaGlyQ29uZmlnfSBmcm9tIFwiLi4vbW9kZWwvc21hcnQtb24tZmhpci5jb25maWdcIjtcclxuXHJcbi8qKlxyXG4gKiBBdXRoZW50aWNhdGVkIEZISVIgY2xpZW50XHJcbiAqL1xyXG5ASW5qZWN0YWJsZSgpXHJcbmV4cG9ydCBjbGFzcyBTbWFydE9uRmhpclNlcnZpY2Uge1xyXG5cclxuICAvLyBpbXBvcnRlZCBsb2NhbCByZXNvdXJjZXMgZnJvbSBTSENzXHJcbiAgcHJpdmF0ZSBpbXBvcnRlZFNIQ2FyZHM6IHsgbGFiZWw/OiBzdHJpbmcsIHNoYzogc3RyaW5nW10sIGJ1bmRsZTogZmhpcjQuQnVuZGxlIH1bXSA9IFtdO1xyXG4gIHByaXZhdGUgX2ltcG9ydGVkUmVzb3VyY2VzOiB7IFtydHlwZTogc3RyaW5nXTogZmhpcjQuUmVzb3VyY2VbXSB9ID0ge307XHJcbiAgZ2V0IGltcG9ydGVkUmVzb3VyY2VzKCkge1xyXG4gICAgcmV0dXJuIHRoaXMuX2ltcG9ydGVkUmVzb3VyY2VzO1xyXG4gIH1cclxuXHJcbiAgY29uc3RydWN0b3IoQEluamVjdCgnc29mQ29uZmlnJykgcHVibGljIGNvbmZpZzogU21hcnRPbkZoaXJDb25maWcgPSB7fSwgcHJpdmF0ZSBhdXRoOiBTbWFydEF1dGhTZXJ2aWNlKSB7XHJcbiAgfVxyXG5cclxuICBnZXRDbGllbnQoKSB7XHJcbiAgICByZXR1cm4gdGhpcy5hdXRoLmdldENsaWVudCgpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBhc3luYyByZWFkeTxUPihjYWxsYmFjazogKGNsaWVudDogQ2xpZW50KSA9PiBQcm9taXNlPFQ+KTogUHJvbWlzZTxUPiB7XHJcbiAgICBjb25zdCBjbGllbnQgPSBhd2FpdCB0aGlzLmdldENsaWVudCgpXHJcbiAgICByZXR1cm4gY2xpZW50ID8gY2FsbGJhY2soY2xpZW50KSA6IFByb21pc2UucmVqZWN0KClcclxuICB9XHJcblxyXG4gIGdldFBhdGllbnQoKSB7XHJcbiAgICByZXR1cm4gdGhpcy5hdXRoLmdldFBhdGllbnQoKVxyXG4gIH1cclxuXHJcbiAgLy8gRkhJUiBTZWFyY2hcclxuICBzZWFyY2g8VD4ocmVzb3VyY2VUeXBlOiBzdHJpbmcsIC4uLnBhcmFtczogYW55W10pOiBQcm9taXNlPGZoaXI0LkJ1bmRsZTxUPj4ge1xyXG4gICAgcmV0dXJuIHRoaXMucmVhZHk8ZmhpcjQuQnVuZGxlPFQ+PihjbGllbnQgPT4gY2xpZW50LnJlcXVlc3Qoe1xyXG4gICAgICB1cmw6IHRoaXMuY29uc3RydWN0UXVlcnlVUkwocmVzb3VyY2VUeXBlLCBwYXJhbXMpXHJcbiAgICB9KSlcclxuICB9XHJcblxyXG4gIC8vIEZISVIgQ3JlYXRlIChQT1NUL1BVVClcclxuICBjcmVhdGU8VD4ocmVzb3VyY2U6IFQsIGlkPzogc3RyaW5nKTogUHJvbWlzZTxUPiB7XHJcbiAgICByZXR1cm4gdGhpcy5yZWFkeTxUPihjbGllbnQgPT4ge1xyXG4gICAgICBpZiAoaWQpIHtcclxuICAgICAgICBjb25zdCBfcmVzb3VyY2UgPSB7IC4uLnJlc291cmNlLCBpZDogaWQgfVxyXG4gICAgICAgIHJldHVybiBjbGllbnQudXBkYXRlPFQ+KDxhbnk+cmVzb3VyY2UpO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIGNvbnN0IF9yZXNvdXJjZTogYW55ID0gey4uLnJlc291cmNlfTtcclxuICAgICAgICBkZWxldGUgX3Jlc291cmNlLmlkO1xyXG4gICAgICAgIHJldHVybiBjbGllbnQuY3JlYXRlPFQ+KF9yZXNvdXJjZSk7XHJcbiAgICAgIH1cclxuICAgIH0pXHJcbiAgfVxyXG5cclxuICAvLyBGSElSIERFTEVURVxyXG4gIGRlbGV0ZShyZXNvdXJjZVR5cGU6IHN0cmluZywgaWQ/OiBzdHJpbmcsIHBhcmFtcz86IHsgW2tleTogc3RyaW5nXTogc3RyaW5nfG51bWJlciB9W10pOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIGlmICghcmVzb3VyY2VUeXBlKSByZXR1cm4gUHJvbWlzZS5yZWplY3QoJ1Jlc291cmNlIHR5cGUgc2hvdWxkIGJlIHByb3ZpZGVkLicpO1xyXG4gICAgcmV0dXJuIHRoaXMucmVhZHkoY2xpZW50ID0+IHtcclxuICAgICAgaWYgKGlkKSB7XHJcbiAgICAgICAgcmV0dXJuIGNsaWVudC5kZWxldGUocmVzb3VyY2VUeXBlICsgJy8nICsgaWQpO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHJldHVybiBjbGllbnQuZGVsZXRlKHRoaXMuY29uc3RydWN0UXVlcnlVUkwocmVzb3VyY2VUeXBlLCBwYXJhbXMpKVxyXG4gICAgICB9XHJcbiAgICB9KVxyXG4gIH1cclxuXHJcbiAgLy8gRkhJUiBPcGVyYXRpb25cclxuICBvcGVyYXRpb248VD4ob3B0aW9uczoge1xyXG4gICAgb3BlcmF0aW9uTmFtZTogc3RyaW5nLFxyXG4gICAgcmVzb3VyY2VUeXBlPzogc3RyaW5nLFxyXG4gICAgcmVzb3VyY2VJZD86IHN0cmluZyxcclxuICAgIHBhcmFtcz86IGZoaXI0LlBhcmFtZXRlcnNcclxuICAgIHF1ZXJ5UGFyYW1zPzogeyBba2V5OiBzdHJpbmddOiBzdHJpbmd8bnVtYmVyIH1bXSxcclxuICB9KSB7XHJcbiAgICBjb25zdCBvcFVybCA9IChvcHRpb25zLnJlc291cmNlVHlwZSA/IG9wdGlvbnMucmVzb3VyY2VUeXBlICsgKG9wdGlvbnMucmVzb3VyY2VJZCA/ICcvJyArIG9wdGlvbnMucmVzb3VyY2VJZCA6ICcnKSArICcvJyA6ICcnKVxyXG4gICAgICArICckJyArIG9wdGlvbnMub3BlcmF0aW9uTmFtZTtcclxuICAgIHJldHVybiB0aGlzLnJlYWR5PFQ+KGNsaWVudCA9PiBjbGllbnQucmVxdWVzdCh7XHJcbiAgICAgIG1ldGhvZDogJ1BPU1QnLFxyXG4gICAgICB1cmw6IG9wVXJsICsgKG9wdGlvbnMucXVlcnlQYXJhbXM/Lmxlbmd0aCA/IHRoaXMuY29uc3RydWN0UXVlcnlVUkwoJycsIG9wdGlvbnMucXVlcnlQYXJhbXMpIDogJycpLFxyXG4gICAgICBib2R5OiBKU09OLnN0cmluZ2lmeShvcHRpb25zLnBhcmFtcyB8fCB7fSlcclxuICAgIH0pKTtcclxuICB9XHJcblxyXG4gIHRyYW5zYWN0aW9uKGJ1bmRsZTogKGZoaXI0LkJ1bmRsZSAmIHsgdHlwZTogJ3RyYW5zYWN0aW9uJyB9KXxmaGlyNC5SZXNvdXJjZVtdLCBtZXRob2Q/OiAnR0VUJ3wnSEVBRCd8J1BPU1QnfCdQVVQnfCdERUxFVEUnfCdQQVRDSCcpIHtcclxuICAgIGxldCB0cmFuc2FjdGlvbkJ1bmRsZTogZmhpcjQuQnVuZGxlPGZoaXI0LlJlc291cmNlPjtcclxuICAgIGlmIChtZXRob2QgJiYgQXJyYXkuaXNBcnJheShidW5kbGUpKSB7XHJcbiAgICAgICB0cmFuc2FjdGlvbkJ1bmRsZSA9IHtcclxuICAgICAgICByZXNvdXJjZVR5cGU6ICdCdW5kbGUnLFxyXG4gICAgICAgIHR5cGU6ICd0cmFuc2FjdGlvbicsXHJcbiAgICAgICAgZW50cnk6IGJ1bmRsZS5tYXAocmVzb3VyY2UgPT4ge1xyXG4gICAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgcmVzb3VyY2UsXHJcbiAgICAgICAgICAgIHJlcXVlc3Q6IHtcclxuICAgICAgICAgICAgICBtZXRob2Q6IG1ldGhvZCxcclxuICAgICAgICAgICAgICB1cmw6IChtZXRob2QgPT09ICdQVVQnIHx8IG1ldGhvZCA9PT0gJ1BBVENIJykgJiYgcmVzb3VyY2UuaWQgPyByZXNvdXJjZS5yZXNvdXJjZVR5cGUgKyAnLycgKyByZXNvdXJjZS5pZCA6IHJlc291cmNlLnJlc291cmNlVHlwZVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSlcclxuICAgICAgfVxyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdHJhbnNhY3Rpb25CdW5kbGUgPSA8ZmhpcjQuQnVuZGxlPGZoaXI0LlJlc291cmNlPj5idW5kbGU7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gdGhpcy5yZWFkeTxmaGlyNC5CdW5kbGU+KGNsaWVudCA9PiBjbGllbnQucmVxdWVzdCh7XHJcbiAgICAgIG1ldGhvZDogJ1BPU1QnLFxyXG4gICAgICB1cmw6ICcvJyxcclxuICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkodHJhbnNhY3Rpb25CdW5kbGUpXHJcbiAgICB9KSlcclxuICB9XHJcblxyXG4gIC8vIEZISVIgUmVxdWVzdFxyXG4gIHF1ZXJ5PFQ+KHVybDogc3RyaW5nKTogUHJvbWlzZTxmaGlyNC5CdW5kbGU8VD4+IHtcclxuICAgIGlmICh1cmwubGVuZ3RoID49IDIwNDgpIHtcclxuICAgICAgcmV0dXJuIHRoaXMucmVhZHk8ZmhpcjQuQnVuZGxlPFQ+PihjbGllbnQgPT4gY2xpZW50LnJlcXVlc3Qoe1xyXG4gICAgICAgIG1ldGhvZDogJ1BPU1QnLFxyXG4gICAgICAgIHVybDogJycsXHJcbiAgICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkoe1xyXG4gICAgICAgICAgcmVzb3VyY2VUeXBlOiAnQnVuZGxlJyxcclxuICAgICAgICAgIHR5cGU6ICdiYXRjaCcsXHJcbiAgICAgICAgICBlbnRyeTogW3tcclxuICAgICAgICAgICAgcmVxdWVzdDoge1xyXG4gICAgICAgICAgICAgIHVybCxcclxuICAgICAgICAgICAgICBtZXRob2Q6ICdHRVQnXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH1dXHJcbiAgICAgICAgfSlcclxuICAgICAgfSkpLnRoZW4oYnVuZGxlID0+IDxmaGlyNC5CdW5kbGU8VD4+YnVuZGxlLmVudHJ5Py5hdCgwKT8ucmVzb3VyY2UpO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHRoaXMucmVhZHk8ZmhpcjQuQnVuZGxlPFQ+PihjbGllbnQgPT4gY2xpZW50LnJlcXVlc3Qoe1xyXG4gICAgICB1cmw6IHVybCArICh1cmwuaW5jbHVkZXMoJ09ic2VydmF0aW9uJykgPyAnJl9jb3VudD05OTknIDogJycpXHJcbiAgICB9KSlcclxuICB9XHJcblxyXG4gIGxvZ291dCgpIHtcclxuICAgIHRoaXMuYXV0aC5sb2dvdXQoKVxyXG4gIH1cclxuXHJcbiAgLy8gQ29uc3RydWN0IEZISVIgQVBJIHVybCBmcm9tIHRoZSBnaXZlbiBxdWVyeVxyXG4gIHByaXZhdGUgY29uc3RydWN0UXVlcnlVUkwocmVzb3VyY2VUeXBlOiBzdHJpbmcsIHBhcmFtcz86IHsgW2tleTogc3RyaW5nXTogc3RyaW5nfG51bWJlciB9W10pIHtcclxuICAgIHJldHVybiByZXNvdXJjZVR5cGUgKyAnPycgKyAocGFyYW1zPy5tYXAoX3BhcmFtcyA9PlxyXG4gICAgICBPYmplY3Qua2V5cyhfcGFyYW1zKS5tYXAoa2V5ID0+IGtleSArICc9JyArIF9wYXJhbXNba2V5XSkuam9pbignJicpXHJcbiAgICApLmZpbHRlcihfID0+IF8pLmpvaW4oJyYnKSB8fCAnJyk7XHJcbiAgfVxyXG5cclxuICAvLyBJbXBvcnQgZGF0YSBmcm9tIFNIQ1xyXG4gIGltcG9ydFNIQ0RhdGEocGFyYW06IHsgbGFiZWw/OiBzdHJpbmcsIHNoYzogc3RyaW5nW10sIGJ1bmRsZTogZmhpcjQuQnVuZGxlIH0pIHtcclxuICAgIGNvbnN0IHtidW5kbGUsIHNoY30gPSBwYXJhbTtcclxuICAgIHRoaXMuaW1wb3J0ZWRTSENhcmRzLnB1c2gocGFyYW0pXHJcbiAgICB0aGlzLl9pbXBvcnRlZFJlc291cmNlcyA9IHRoaXMuaW1wb3J0ZWRTSENhcmRzLm1hcChzaGMgPT5cclxuICAgICAgc2hjLmJ1bmRsZS5lbnRyeT8ubWFwKGVudHJ5ID0+IGVudHJ5LnJlc291cmNlKSB8fCBbXSkuZmxhdCgpXHJcbiAgICAgIC5yZWR1Y2UoKG86IGFueSwgcjogZmhpcjQuUmVzb3VyY2V8dW5kZWZpbmVkKSA9PiB7XHJcbiAgICAgICAgaWYgKCFyKSB7IHJldHVybjsgfVxyXG4gICAgICAgIGlmICghb1tyLnJlc291cmNlVHlwZV0pIHsgb1tyLnJlc291cmNlVHlwZV0gPSBbXSB9XHJcbiAgICAgICAgb1tyLnJlc291cmNlVHlwZV0ucHVzaChyKTtcclxuICAgICAgICByZXR1cm4gbztcclxuICAgICAgfSwge30pXHJcbiAgICBjb25zdCBwYXRpZW50ID0gYnVuZGxlLmVudHJ5Py5maW5kKGVudHJ5ID0+IGVudHJ5LnJlc291cmNlPy5yZXNvdXJjZVR5cGUgPT09ICdQYXRpZW50Jyk/LnJlc291cmNlO1xyXG4gICAgdGhpcy5hdXRoLm9mZmxpbmUoPGZoaXI0LlBhdGllbnQ+cGF0aWVudCwgc2hjKTtcclxuICB9XHJcblxyXG4gIC8vIFJldHVybiBhbGwgaW1wb3J0ZWQgcmVzb3VyY2VzIGZyb20gU0hDXHJcbiAgZ2V0QWxsSW1wb3J0ZWRSZXNvdXJjZXMoKSB7XHJcbiAgICByZXR1cm4gT2JqZWN0LnZhbHVlcyh0aGlzLmltcG9ydGVkUmVzb3VyY2VzKS5mbGF0KCk7XHJcbiAgfVxyXG59XHJcbiJdfQ==