UNPKG

ngx-amplify

Version:

An angular library for integration AWS cloud services (cognito, s3)

321 lines 25 kB
/** * @fileoverview added by tsickle * @suppress {checkTypes,constantProperty,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc */ import { Injectable, Inject } from '@angular/core'; import { AuthService } from './auth.service'; import { NGX_AMPLIFY_CONFIG } from '../common/interfaces/ngx-amplify.config'; import * as AWS from 'aws-sdk'; import * as S3 from 'aws-sdk/clients/s3'; import moment from 'moment'; import { CognitoException } from '../common/common.resource'; import * as i0 from "@angular/core"; import * as i1 from "../common/interfaces/ngx-amplify.config"; import * as i2 from "./auth.service"; export class StorageService { /** * @param {?} config * @param {?} auth */ constructor(config, auth) { this.config = config; this.auth = auth; if (!config.storage) { throw new TypeError('NgxAmplify:Storage options are not found. Please refer to the README for usage.'); } } /** * @private * @return {?} */ get storage() { AWS.config.update({ region: this.config.storage.bucketRegion }); return new S3({ params: { 'Bucket': this.config.storage.bucketName, }, region: this.config.storage.bucketRegion }); } /** * @private * @param {?} url * @return {?} */ isExpired(url) { /** @type {?} */ let result; /** @type {?} */ let _url = new URL(url); if (_url.search === '') { result = true; } else { /** @type {?} */ let param = _url.searchParams.get('Expires'); if (param) { result = moment().isAfter(moment.unix(parseInt(param))); } else { result = false; } } return result; } /** * @param {?} url * @return {?} */ getFileByUrl(url) { /** @type {?} */ let self = this; /** @type {?} */ let baseUrl = `https://${self.config.storage.bucketName}.s3.amazonaws.com/`; /** @type {?} */ let fileKey = url.replace(baseUrl, ''); return new Promise((/** * @param {?} resolve * @param {?} reject * @return {?} */ (resolve, reject) => { try { if (fileKey === '') { resolve(url); } else if (self.isExpired(url)) { self.storage.getSignedUrl('getObject', { Key: fileKey }, (/** * @param {?} err * @param {?} url * @return {?} */ (err, url) => { if (err) { reject(self.handleError(err, 'getSignedUrl')); } else { resolve(url); } })); } else { resolve(url); } } catch (error) { reject(self.handleError(error, 'try/catch getSignedUrl')); } })); } /** * @param {?} filename * @param {?=} folder * @return {?} */ getFile(filename, folder) { /** @type {?} */ let self = this; // File Access Level = "protected" - this prevents unautheticated access to the file. /** @type {?} */ let directory = `${self.config.storage.folderLevel}/`; if (folder) { directory += `${folder}/`; } /** @type {?} */ let fileKey = `${directory}${filename}`; return new Promise((/** * @param {?} resolve * @param {?} reject * @return {?} */ (resolve, reject) => { try { self.storage.getSignedUrl('getObject', { Key: fileKey }, (/** * @param {?} err * @param {?} url * @return {?} */ (err, url) => { if (err) { reject(self.handleError(err, 'getSignedUrl')); } else { // self.cognitoService.user.cognitoProfile.picture = url; resolve(url); } })); } catch (error) { reject(self.handleError(error, 'try/catch getSignedUrl')); } })); } /** * @param {?} file * @param {?} filename * @param {?=} folder * @param {?=} accessLevel * @return {?} */ upload(file, filename, folder, accessLevel) { /** @type {?} */ let self = this; // self.config.folderLevel = "protected" - this prevents unautheticated access to the file. /** @type {?} */ let directory = ''; if (accessLevel) { directory = `${accessLevel}/`; } else { directory = `${self.config.storage.defaultLevel}/`; } if (folder) { directory += `${folder}/`; } filename = filename.toLowerCase().replace(/\s+/g, "-"); if (file.type === 'image/jpeg') { filename += '.jpg'; } if (file.type === 'image/png') { filename += '.png'; } if (file.type === 'image/tiff') { filename += '.tiff'; } /** @type {?} */ let fileKey = `${directory}${filename}`; return new Promise((/** * @param {?} resolve * @param {?} reject * @return {?} */ (resolve, reject) => { try { self.storage.upload({ Bucket: self.config.storage.bucketName, Key: fileKey, ContentType: file.type, ContentEncoding: 'base64', Body: file, StorageClass: 'STANDARD', }, (/** * @param {?} err * @param {?} data * @return {?} */ (err, data) => { if (err) { self.handleError(err, 'error during upload.'); reject(err); } else { console.log('successful upload.'); resolve(data); } })); } catch (error) { reject(self.handleError(error, 'try/catch upload')); } })); } /** * @param {?=} directory * @return {?} */ list(directory) { /** @type {?} */ let self = this; return new Promise((/** * @param {?} resolve * @param {?} reject * @return {?} */ (resolve, reject) => { if (directory) { // let directoryKey = encodeURIComponent(directory); /** @type {?} */ let param = { Prefix: directory, Delimiter: '/', Bucket: self.config.storage.bucketName }; self.storage.listObjectsV2(param, (/** * @param {?} err * @param {?} data * @return {?} */ (err, data) => { if (err) { reject(self.handleError(err, 'list')); } resolve(data); })); } else { self.storage.listObjectsV2((/** * @param {?} err * @param {?} data * @return {?} */ (err, data) => { if (err) { reject(self.handleError(err, 'list')); } resolve(data); })); } })); } /** * @param {?} dataURI * @param {?} type * @return {?} */ static dataURItoBlob(dataURI, type) { /** @type {?} */ let binary = atob(dataURI.split(',')[1]); /** @type {?} */ let array = []; for (let i = 0; i < binary.length; i++) { array.push(binary.charCodeAt(i)); } /** @type {?} */ let blob = new Blob([new Uint8Array(array)], { type: type }); return blob; } /** * @private * @param {?} error * @param {?} caller * @return {?} */ handleError(error, caller) { /** @type {?} */ let exception = new CognitoException(error); console.error(`NgxAmplifyStorageSevice::handleError calledBy::${caller}`, exception); return exception; } } StorageService.decorators = [ { type: Injectable, args: [{ providedIn: 'root' },] } ]; /** @nocollapse */ StorageService.ctorParameters = () => [ { type: undefined, decorators: [{ type: Inject, args: [NGX_AMPLIFY_CONFIG,] }] }, { type: AuthService } ]; /** @nocollapse */ StorageService.ngInjectableDef = i0.ɵɵdefineInjectable({ factory: function StorageService_Factory() { return new StorageService(i0.ɵɵinject(i1.NGX_AMPLIFY_CONFIG), i0.ɵɵinject(i2.AuthService)); }, token: StorageService, providedIn: "root" }); if (false) { /** * @type {?} * @private */ StorageService.prototype.config; /** * @type {?} * @private */ StorageService.prototype.auth; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RvcmFnZS5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6Im5nOi8vbmd4LWFtcGxpZnkvIiwic291cmNlcyI6WyJsaWIvc2VydmljZXMvc3RvcmFnZS5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7QUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNuRCxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDN0MsT0FBTyxFQUFxQixrQkFBa0IsRUFBbUIsTUFBTSx5Q0FBeUMsQ0FBQztBQUNqSCxPQUFPLEtBQUssR0FBRyxNQUFNLFNBQVMsQ0FBQztBQUMvQixPQUFPLEtBQUssRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBQ3pDLE9BQU8sTUFBTSxNQUFNLFFBQVEsQ0FBQztBQUU1QixPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQzs7OztBQUs3RCxNQUFNLE9BQU8sY0FBYzs7Ozs7SUFFekIsWUFDc0MsTUFBd0IsRUFDcEQsSUFBaUI7UUFEVyxXQUFNLEdBQU4sTUFBTSxDQUFrQjtRQUNwRCxTQUFJLEdBQUosSUFBSSxDQUFhO1FBQ3pCLElBQUksQ0FBQyxNQUFNLENBQUMsT0FBTyxFQUFFO1lBQ25CLE1BQU0sSUFBSSxTQUFTLENBQUMsaUZBQWlGLENBQUMsQ0FBQztTQUN4RztJQUNILENBQUM7Ozs7O0lBRUQsSUFBWSxPQUFPO1FBQ2pCLEdBQUcsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDO1lBQ2hCLE1BQU0sRUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxZQUFZO1NBQ3pDLENBQUMsQ0FBQztRQUVILE9BQU8sSUFBSSxFQUFFLENBQUM7WUFDWixNQUFNLEVBQUU7Z0JBQ04sUUFBUSxFQUFFLElBQUksQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLFVBQVU7YUFDekM7WUFDRCxNQUFNLEVBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxPQUFP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QUssQ0FBQztRQUM5RCxPQUFPLENBQUMsS0FBSyxDQUFDLGtEQUFrRCxNQUFNLEVBQUUsRUFBRSxTQUFTLENBQUMsQ0FBQztRQUNyRixPQUFPLFNBQVMsQ0FBQztJQUNuQixDQUFDOzs7WUE1TEYsVUFBVSxTQUFDO2dCQUNWLFVBQVUsRUFBRSxNQUFNO2FBQ25COzs7OzRDQUlJLE1BQU0sU0FBQyxrQkFBa0I7WUFkckIsV0FBVzs7Ozs7Ozs7SUFjaEIsZ0NBQTREOzs7OztJQUM1RCw4QkFBeUIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3RhYmxlLCBJbmplY3QgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEF1dGhTZXJ2aWNlIH0gZnJvbSAnLi9hdXRoLnNlcnZpY2UnO1xuaW1wb3J0IHsgIE5neEFtcGxpZnlDb25maWcsIE5HWF9BTVBMSUZZX0NPTkZJRywgQWNjZXNzTGV2ZWxUeXBlIH0gZnJvbSAnLi4vY29tbW9uL2ludGVyZmFjZXMvbmd4LWFtcGxpZnkuY29uZmlnJztcbmltcG9ydCAqIGFzIEFXUyBmcm9tICdhd3Mtc2RrJztcbmltcG9ydCAqIGFzIFMzIGZyb20gJ2F3cy1zZGsvY2xpZW50cy9zMyc7XG5pbXBvcnQgbW9tZW50IGZyb20gJ21vbWVudCc7XG5pbXBvcnQgeyBJQ29nbml0b0V4Y2VwdGlvbiB9IGZyb20gJy4uL2NvbW1vbi9pbnRlcmZhY2VzL2NvbW1vbi5pbnRlcmZhY2UnO1xuaW1wb3J0IHsgQ29nbml0b0V4Y2VwdGlvbiB9IGZyb20gJy4uL2NvbW1vbi9jb21tb24ucmVzb3VyY2UnO1xuXG5ASW5qZWN0YWJsZSh7XG4gIHByb3ZpZGVkSW46ICdyb290J1xufSlcbmV4cG9ydCBjbGFzcyBTdG9yYWdlU2VydmljZSB7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgQEluamVjdChOR1hfQU1QTElGWV9DT05GSUcpIHByaXZhdGUgY29uZmlnOiBOZ3hBbXBsaWZ5Q29uZmlnLFxuICAgIHByaXZhdGUgYXV0aDogQXV0aFNlcnZpY2UpIHsgXG4gICAgaWYgKCFjb25maWcuc3RvcmFnZSkge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignTmd4QW1wbGlmeTpTdG9yYWdlIG9wdGlvbnMgYXJlIG5vdCBmb3VuZC4gUGxlYXNlIHJlZmVyIHRvIHRoZSBSRUFETUUgZm9yIHVzYWdlLicpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgZ2V0IHN0b3JhZ2UoKSB7XG4gICAgQVdTLmNvbmZpZy51cGRhdGUoe1xuICAgICAgcmVnaW9uOiB0aGlzLmNvbmZpZy5zdG9yYWdlLmJ1Y2tldFJlZ2lvblxuICAgIH0pO1xuXG4gICAgcmV0dXJuIG5ldyBTMyh7XG4gICAgICBwYXJhbXM6IHtcbiAgICAgICAgJ0J1Y2tldCc6IHRoaXMuY29uZmlnLnN0b3JhZ2UuYnVja2V0TmFtZSxcbiAgICAgIH0sXG4gICAgICByZWdpb246IHRoaXMuY29uZmlnLnN0b3JhZ2UuYnVja2V0UmVnaW9uXG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGlzRXhwaXJlZCh1cmw6c3RyaW5nKSB7XG5cbiAgICBsZXQgcmVzdWx0OmJvb2xlYW47XG4gICAgbGV0IF91cmwgPSBuZXcgVVJMKHVybCk7XG5cbiAgICBpZiAoX3VybC5zZWFyY2ggPT09ICcnKXtcbiAgICAgICAgcmVzdWx0ID0gdHJ1ZTtcbiAgICB9IGVsc2Uge1xuICAgICAgICBsZXQgcGFyYW06IHN0cmluZyA9IF91cmwuc2VhcmNoUGFyYW1zLmdldCgnRXhwaXJlcycpO1xuICAgICAgICBpZiAocGFyYW0pIHtcbiAgICAgICAgICAgIHJlc3VsdCA9IG1vbWVudCgpLmlzQWZ0ZXIobW9tZW50LnVuaXgocGFyc2VJbnQocGFyYW0pKSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXN1bHQgPSBmYWxzZTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiByZXN1bHQ7XG59XG5cbiAgZ2V0RmlsZUJ5VXJsKHVybDogc3RyaW5nKSB7XG4gICAgbGV0IHNlbGYgPSB0aGlzO1xuICAgIGxldCBiYXNlVXJsID0gYGh0dHBzOi8vJHtzZWxmLmNvbmZpZy5zdG9yYWdlLmJ1Y2tldE5hbWV9LnMzLmFtYXpvbmF3cy5jb20vYDtcbiAgICBsZXQgZmlsZUtleSA9IHVybC5yZXBsYWNlKGJhc2VVcmwsICcnKTtcblxuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICB0cnkge1xuICAgICAgICBpZiAoZmlsZUtleSA9PT0gJycpIHtcbiAgICAgICAgICByZXNvbHZlKHVybCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoc2VsZi5pc0V4cGlyZWQodXJsKSkge1xuICAgICAgICAgIHNlbGYuc3RvcmFnZS5nZXRTaWduZWRVcmwoJ2dldE9iamVjdCcsIHsgS2V5OiBmaWxlS2V5IH0sIChlcnIsIHVybCkgPT4ge1xuICAgICAgICAgICAgaWYgKGVycikge1xuICAgICAgICAgICAgICByZWplY3Qoc2VsZi5oYW5kbGVFcnJvcihlcnIsICdnZXRTaWduZWRVcmwnKSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICByZXNvbHZlKHVybCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmVzb2x2ZSh1cmwpO1xuICAgICAgICB9XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICByZWplY3Qoc2VsZi5oYW5kbGVFcnJvcihlcnJvciwgJ3RyeS9jYXRjaCBnZXRTaWduZWRVcmwnKSk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBnZXRGaWxlKGZpbGVuYW1lOiBzdHJpbmcsIGZvbGRlcj86IHN0cmluZyk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgbGV0IHNlbGYgPSB0aGlzO1xuXG4gICAgLy8gRmlsZSBBY2Nlc3MgTGV2ZWwgPSBcInByb3RlY3RlZFwiIC0gdGhpcyBwcmV2ZW50cyB1bmF1dGhldGljYXRlZCBhY2Nlc3MgdG8gdGhlIGZpbGUuXG4gICAgbGV0IGRpcmVjdG9yeSA9IGAke3NlbGYuY29uZmlnLnN0b3JhZ2UuZm9sZGVyTGV2ZWx9L2A7XG4gICAgaWYgKGZvbGRlcikge1xuICAgICAgZGlyZWN0b3J5ICs9IGAke2ZvbGRlcn0vYDtcbiAgICB9XG4gICAgbGV0IGZpbGVLZXkgPSBgJHtkaXJlY3Rvcnl9JHtmaWxlbmFtZX1gO1xuXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHNlbGYuc3RvcmFnZS5nZXRTaWduZWRVcmwoJ2dldE9iamVjdCcsIHsgS2V5OiBmaWxlS2V5IH0sIChlcnIsIHVybCkgPT4ge1xuICAgICAgICAgIGlmIChlcnIpIHtcbiAgICAgICAgICAgIHJlamVjdChzZWxmLmhhbmRsZUVycm9yKGVyciwgJ2dldFNpZ25lZFVybCcpKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gc2VsZi5jb2duaXRvU2VydmljZS51c2VyLmNvZ25pdG9Qcm9maWxlLnBpY3R1cmUgPSB1cmw7XG4gICAgICAgICAgICByZXNvbHZlKHVybCk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIHJlamVjdChzZWxmLmhhbmRsZUVycm9yKGVycm9yLCAndHJ5L2NhdGNoIGdldFNpZ25lZFVybCcpKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIHVwbG9hZChmaWxlOiBCbG9iLCBmaWxlbmFtZTogc3RyaW5nLCBmb2xkZXI/OiBzdHJpbmcsIGFjY2Vzc0xldmVsPzpBY2Nlc3NMZXZlbFR5cGUpIHtcbiAgICBsZXQgc2VsZiA9IHRoaXM7XG5cbiAgICAvLyBzZWxmLmNvbmZpZy5mb2xkZXJMZXZlbCA9IFwicHJvdGVjdGVkXCIgLSB0aGlzIHByZXZlbnRzIHVuYXV0aGV0aWNhdGVkIGFjY2VzcyB0byB0aGUgZmlsZS5cbiAgICBsZXQgZGlyZWN0b3J5ID0gJyc7XG4gICAgaWYgKGFjY2Vzc0xldmVsKSB7XG4gICAgICBkaXJlY3RvcnkgPSBgJHthY2Nlc3NMZXZlbH0vYFxuICAgIH0gZWxzZSB7XG4gICAgICBkaXJlY3RvcnkgPSBgJHtzZWxmLmNvbmZpZy5zdG9yYWdlLmRlZmF1bHRMZXZlbH0vYDtcbiAgICB9XG4gICAgaWYgKGZvbGRlcikge1xuICAgICAgZGlyZWN0b3J5ICs9IGAke2ZvbGRlcn0vYDtcbiAgICB9XG5cbiAgICBmaWxlbmFtZSA9IGZpbGVuYW1lLnRvTG93ZXJDYXNlKCkucmVwbGFjZSgvXFxzKy9nLCBcIi1cIilcbiAgICBpZiAoZmlsZS50eXBlID09PSAnaW1hZ2UvanBlZycpIHtcbiAgICAgIGZpbGVuYW1lICs9ICcuanBnJztcbiAgICB9XG4gICAgaWYgKGZpbGUudHlwZSA9PT0gJ2ltYWdlL3BuZycpIHtcbiAgICAgIGZpbGVuYW1lICs9ICcucG5nJztcbiAgICB9XG4gICAgaWYgKGZpbGUudHlwZSA9PT0gJ2ltYWdlL3RpZmYnKSB7XG4gICAgICBmaWxlbmFtZSArPSAnLnRpZmYnO1xuICAgIH1cblxuICAgIGxldCBmaWxlS2V5ID0gYCR7ZGlyZWN0b3J5fSR7ZmlsZW5hbWV9YDtcblxuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICB0cnkge1xuICAgICAgICBzZWxmLnN0b3JhZ2UudXBsb2FkKHtcbiAgICAgICAgICBCdWNrZXQ6IHNlbGYuY29uZmlnLnN0b3JhZ2UuYnVja2V0TmFtZSxcbiAgICAgICAgICBLZXk6IGZpbGVLZXksXG4gICAgICAgICAgQ29udGVudFR5cGU6IGZpbGUudHlwZSxcbiAgICAgICAgICBDb250ZW50RW5jb2Rpbmc6ICdiYXNlNjQnLFxuICAgICAgICAgIEJvZHk6IGZpbGUsXG4gICAgICAgICAgU3RvcmFnZUNsYXNzOiAnU1RBTkRBUkQnLFxuICAgICAgICB9LCAoZXJyLCBkYXRhKSA9PiB7XG4gICAgICAgICAgaWYgKGVycikge1xuICAgICAgICAgICAgc2VsZi5oYW5kbGVFcnJvcihlcnIsICdlcnJvciBkdXJpbmcgdXBsb2FkLicpO1xuICAgICAgICAgICAgcmVqZWN0KGVycik7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKCdzdWNjZXNzZnVsIHVwbG9hZC4nKTtcbiAgICAgICAgICAgIHJlc29sdmUoZGF0YSk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIHJlamVjdChzZWxmLmhhbmRsZUVycm9yKGVycm9yLCAndHJ5L2NhdGNoIHVwbG9hZCcpKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIGxpc3QoZGlyZWN0b3J5Pzogc3RyaW5nKSB7XG4gICAgbGV0IHNlbGYgPSB0aGlzO1xuXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIGlmIChkaXJlY3RvcnkpIHtcbiAgICAgICAgLy8gbGV0IGRpcmVjdG9yeUtleSA9IGVuY29kZVVSSUNvbXBvbmVudChkaXJlY3RvcnkpO1xuICAgICAgICBsZXQgcGFyYW0gPSB7IFByZWZpeDogZGlyZWN0b3J5LCBEZWxpbWl0ZXI6ICcvJywgQnVja2V0OiBzZWxmLmNvbmZpZy5zdG9yYWdlLmJ1Y2tldE5hbWUgfTtcblxuICAgICAgICBzZWxmLnN0b3JhZ2UubGlzdE9iamVjdHNWMihwYXJhbSwgKGVyciwgZGF0YSkgPT4ge1xuICAgICAgICAgIGlmIChlcnIpIHtcbiAgICAgICAgICAgIHJlamVjdChzZWxmLmhhbmRsZUVycm9yKGVyciwgJ2xpc3QnKSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJlc29sdmUoZGF0YSk7XG4gICAgICAgIH0pXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzZWxmLnN0b3JhZ2UubGlzdE9iamVjdHNWMigoZXJyLCBkYXRhKSA9PiB7XG4gICAgICAgICAgaWYgKGVycikge1xuICAgICAgICAgICAgcmVqZWN0KHNlbGYuaGFuZGxlRXJyb3IoZXJyLCAnbGlzdCcpKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmVzb2x2ZShkYXRhKTtcbiAgICAgICAgfSlcbiAgICAgIH1cbiAgICB9KVxuICB9XG5cbiAgcHVibGljIHN0YXRpYyBkYXRhVVJJdG9CbG9iKGRhdGFVUkksIHR5cGU6c3RyaW5nKSB7XG4gICAgbGV0IGJpbmFyeSA9IGF0b2IoZGF0YVVSSS5zcGxpdCgnLCcpWzFdKTtcbiAgICBsZXQgYXJyYXkgPSBbXTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGJpbmFyeS5sZW5ndGg7IGkrKykge1xuICAgICAgICBhcnJheS5wdXNoKGJpbmFyeS5jaGFyQ29kZUF0KGkpKTtcbiAgICB9XG4gICAgbGV0IGJsb2IgPSBuZXcgQmxvYihbbmV3IFVpbnQ4QXJyYXkoYXJyYXkpXSwgeyB0eXBlOiB0eXBlIH0pO1xuICAgIHJldHVybiBibG9iO1xufVxuXG4gIHByaXZhdGUgaGFuZGxlRXJyb3IoZXJyb3I6IGFueSwgY2FsbGVyOiBzdHJpbmcpIHtcbiAgICBsZXQgZXhjZXB0aW9uOiBJQ29nbml0b0V4Y2VwdGlvbiA9IG5ldyBDb2duaXRvRXhjZXB0aW9uKGVycm9yKTtcbiAgICBjb25zb2xlLmVycm9yKGBOZ3hBbXBsaWZ5U3RvcmFnZVNldmljZTo6aGFuZGxlRXJyb3IgY2FsbGVkQnk6OiR7Y2FsbGVyfWAsIGV4Y2VwdGlvbik7XG4gICAgcmV0dXJuIGV4Y2VwdGlvbjtcbiAgfVxufVxuIl19