UNPKG

@hmcts/annotation-ui-lib

Version:

PDF Viewer and ability to highlight text with and comment tracking

409 lines 39.7 kB
/** * @fileoverview added by tsickle * @suppress {checkTypes,extraRequire,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc */ import * as tslib_1 from "tslib"; import { Injectable } from '@angular/core'; import { HttpErrorResponse } from '@angular/common/http'; import { Subject, BehaviorSubject, throwError } from 'rxjs'; import { catchError } from 'rxjs/operators'; import { v4 as uuid } from 'uuid'; import { Annotation } from './annotation-set.model'; import { PdfService } from './pdf.service'; import { PdfAdapter } from './pdf-adapter'; import { ApiHttpService } from './api-http.service'; import { PdfAnnotateWrapper } from './js-wrapper/pdf-annotate-wrapper'; import { EmLoggerService } from '../logging/em-logger.service'; import { PdfRenderService } from './pdf-render.service'; export class AnnotationStoreService { /** * @param {?} log * @param {?} pdfAdapter * @param {?} apiHttpService * @param {?} pdfService * @param {?} pdfAnnotateWrapper * @param {?} pdfRenderService */ constructor(log, pdfAdapter, apiHttpService, pdfService, pdfAnnotateWrapper, pdfRenderService) { this.log = log; this.pdfAdapter = pdfAdapter; this.apiHttpService = apiHttpService; this.pdfService = pdfService; this.pdfAnnotateWrapper = pdfAnnotateWrapper; this.pdfRenderService = pdfRenderService; log.setClass('AnnotationStoreService'); this.commentBtnSubject = new Subject(); this.commentFocusSubject = new BehaviorSubject({ annotation: new Annotation(null, null, null, null, null, null, null, null, null, null, null, null) }); this.contextualToolBarOptions = new Subject(); this.annotationFocusSubject = new Subject(); this.annotationChangeSubscription = this.pdfAdapter.getAnnotationChangeSubject().subscribe((e) => this.handleAnnotationEvent(e)); } /** * @return {?} */ getAnnotationFocusSubject() { return this.annotationFocusSubject; } /** * @param {?} annotation * @return {?} */ setAnnotationFocusSubject(annotation) { this.annotationFocusSubject.next(annotation); } /** * @return {?} */ getCommentFocusSubject() { return this.commentFocusSubject; } /** * @param {?} annotation * @param {?=} showButton * @return {?} */ setCommentFocusSubject(annotation, showButton) { this.commentFocusSubject.next({ annotation, showButton }); } /** * @return {?} */ getCommentBtnSubject() { return this.commentBtnSubject; } /** * @param {?} commentId * @return {?} */ setCommentBtnSubject(commentId) { this.commentBtnSubject.next(commentId); } /** * @param {?} annotation * @param {?=} showDelete * @return {?} */ setToolBarUpdate(annotation, showDelete) { /** @type {?} */ const contextualOptions = { annotation, showDelete }; this.contextualToolBarOptions.next(contextualOptions); } /** * @return {?} */ getToolbarUpdate() { return this.contextualToolBarOptions; } /** * @param {?} annotationData * @return {?} */ preLoad(annotationData) { if (annotationData != null) { this.pdfAdapter.setStoreData(annotationData); this.pdfAnnotateWrapper.setStoreAdapter(this.pdfAdapter.getStoreAdapter()); this.pdfService.setHighlightTool(); } else { this.pdfService.setCursorTool(); this.pdfAnnotateWrapper.setStoreAdapter(); } } /** * @param {?} e * @return {?} */ handleAnnotationEvent(e) { switch (e.type) { case 'addAnnotation': { this.saveAnnotation(e.annotation); break; } case 'addComment': { this.saveAnnotation(e.annotation, e.type); break; } case 'editComment': { this.saveAnnotation(e.annotation, e.type); break; } case 'deleteComment': { this.saveAnnotation(e.annotation); break; } case 'editAnnotation': { this.saveAnnotation(e.annotation); break; } case 'deleteAnnotation': { this.deleteAnnotation(e.annotation); break; } } } /** * @param {?} baseUrl * @param {?} dmDocumentId * @return {?} */ getAnnotationSet(baseUrl, dmDocumentId) { return this.apiHttpService.fetch(baseUrl, dmDocumentId).pipe(catchError((err) => { if (err instanceof HttpErrorResponse) { switch (err.status) { case 400: { this.log.error('Bad request: ' + err.error); return throwError(err.error); } case 404: { /** @type {?} */ const body = { documentId: dmDocumentId, id: uuid() }; this.log.info('Creating new annotation set for document id:' + dmDocumentId); return this.apiHttpService.createAnnotationSet(baseUrl, body); } case 500: { this.log.error('Internal server error: ' + err); return throwError('Internal server error: ' + err); } } } })); } /** * @return {?} */ saveData() { /** @type {?} */ let loadedData; /** @type {?} */ let toKeepAnnotations; /** @type {?} */ let toRemoveAnnotations; loadedData = this.pdfAdapter.annotationSet; toKeepAnnotations = this.pdfAdapter.annotations; toRemoveAnnotations = this.pdfAdapter.annotationSet.annotations .filter((annotation) => !this.pdfAdapter.annotations.map(a => a.id).includes(annotation.id)); toKeepAnnotations.forEach((annotation) => { this.apiHttpService.saveAnnotation(annotation).subscribe(response => this.log.info('Successfully saved annotation:' + response), error => this.log.error('There has been a problem saving the annotation:' + annotation.id + '-' + error)); }); toRemoveAnnotations.forEach((annotation) => { this.apiHttpService.deleteAnnotation(annotation).subscribe(response => this.log.info('Successfully deleted annotation:' + response), error => this.log.error('There has been a problem deleting annotation:' + annotation.id + '-' + error)); }); loadedData.annotations.splice(0, loadedData.annotations.length); loadedData.annotations.concat(toKeepAnnotations); this.pdfAdapter.annotationSet = loadedData; } /** * @param {?} annotation * @param {?=} type * @return {?} */ saveAnnotation(annotation, type) { this.apiHttpService.saveAnnotation(annotation).subscribe(response => { if (type === 'addComment' || type === 'editComment') { this.pdfAdapter.annotationSet.annotations[this.pdfAdapter.annotationSet.annotations .findIndex(x => x.id === annotation.id)] = response.body; } this.log.info('Successfully saved annotation:' + response); }, error => this.log.error('There has been a problem saving the annotation:' + annotation.id + '-' + error)); } /** * @param {?} annotation * @return {?} */ deleteAnnotation(annotation) { this.apiHttpService.deleteAnnotation(annotation).subscribe(response => { this.log.info('Successfully deleted annotation:' + annotation.id + '-' + response); }, error => this.log.error('There has been a problem deleting annotation:' + annotation.id + '-' + error)); } /** * @param {?} comment * @return {?} */ editComment(comment) { this.pdfAdapter.editComment(comment); } /** * @param {?} annotationId * @return {?} */ getAnnotationById(annotationId) { return new Promise((resolve) => { this.getAnnotation(annotationId, annotation => { resolve(annotation); }); }); } /** * @param {?} pageNumber * @return {?} */ getAnnotationsForPage(pageNumber) { return new Promise((resolve) => { this.getAnnotations(pageNumber, pageData => { resolve(pageData); }); }); } /** * @param {?} annotationId * @return {?} */ getCommentsForAnnotation(annotationId) { return new Promise((resolve) => { this.getComments(annotationId, comments => { resolve(comments); }); }); } /** * @param {?} annotationId * @param {?} callback * @return {?} */ getAnnotation(annotationId, callback) { this.pdfAnnotateWrapper.getStoreAdapter() .getAnnotation(this.pdfRenderService.getRenderOptions().documentId, annotationId) .then(callback); } /** * @param {?} annotationId * @param {?} callback * @return {?} */ getComments(annotationId, callback) { this.pdfAnnotateWrapper.getStoreAdapter() .getComments(this.pdfRenderService.getRenderOptions().documentId, annotationId) .then(callback); } /** * @param {?} comment * @return {?} */ addComment(comment) { this.pdfAnnotateWrapper.getStoreAdapter() .addComment(this.pdfRenderService.getRenderOptions().documentId, comment.annotationId, comment.content) .then(); } /** * @param {?} pageNumber * @param {?} callback * @return {?} */ getAnnotations(pageNumber, callback) { this.pdfAnnotateWrapper.getStoreAdapter() .getAnnotations(this.pdfRenderService.getRenderOptions().documentId, pageNumber) .then(callback); } /** * @param {?} commentId * @return {?} */ deleteComment(commentId) { this.pdfAnnotateWrapper.getStoreAdapter() .deleteComment(this.pdfRenderService.getRenderOptions().documentId, commentId) .then(); } /** * @param {?} annotationId * @param {?} pageNumber * @return {?} */ deleteAnnotationById(annotationId, pageNumber) { return tslib_1.__awaiter(this, void 0, void 0, function* () { /** @type {?} */ const renderOptions = this.pdfRenderService.getRenderOptions(); yield this.pdfAnnotateWrapper.getStoreAdapter() .deleteAnnotation(renderOptions.documentId, annotationId); this.renderPage(renderOptions, pageNumber); }); } /** * @param {?} renderOptions * @param {?} pageNumber * @return {?} */ renderPage(renderOptions, pageNumber) { renderOptions.rotate = this.pdfRenderService.getPageRotation(renderOptions, { pageNumber: pageNumber }); this.pdfAnnotateWrapper.renderPage(pageNumber, renderOptions); } /** * @return {?} */ ngOnDestroy() { if (this.annotationChangeSubscription) { this.annotationChangeSubscription.unsubscribe(); } } } AnnotationStoreService.decorators = [ { type: Injectable } ]; AnnotationStoreService.ctorParameters = () => [ { type: EmLoggerService }, { type: PdfAdapter }, { type: ApiHttpService }, { type: PdfService }, { type: PdfAnnotateWrapper }, { type: PdfRenderService } ]; if (false) { /** @type {?} */ AnnotationStoreService.prototype.annotationChangeSubscription; /** * @type {?} * @private */ AnnotationStoreService.prototype.commentBtnSubject; /** * @type {?} * @private */ AnnotationStoreService.prototype.commentFocusSubject; /** * @type {?} * @private */ AnnotationStoreService.prototype.annotationFocusSubject; /** * @type {?} * @private */ AnnotationStoreService.prototype.contextualToolBarOptions; /** * @type {?} * @private */ AnnotationStoreService.prototype.log; /** * @type {?} * @private */ AnnotationStoreService.prototype.pdfAdapter; /** * @type {?} * @private */ AnnotationStoreService.prototype.apiHttpService; /** * @type {?} * @private */ AnnotationStoreService.prototype.pdfService; /** * @type {?} * @private */ AnnotationStoreService.prototype.pdfAnnotateWrapper; /** * @type {?} * @private */ AnnotationStoreService.prototype.pdfRenderService; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYW5ub3RhdGlvbi1zdG9yZS5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6Im5nOi8vQGhtY3RzL2Fubm90YXRpb24tdWktbGliLyIsInNvdXJjZXMiOlsibGliL2RhdGEvYW5ub3RhdGlvbi1zdG9yZS5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBQUEsT0FBTyxFQUFDLFVBQVUsRUFBWSxNQUFNLGVBQWUsQ0FBQztBQUNwRCxPQUFPLEVBQUMsaUJBQWlCLEVBQWUsTUFBTSxzQkFBc0IsQ0FBQztBQUNyRSxPQUFPLEVBQTJCLE9BQU8sRUFBRSxlQUFlLEVBQUUsVUFBVSxFQUFDLE1BQU0sTUFBTSxDQUFDO0FBQ3BGLE9BQU8sRUFBQyxVQUFVLEVBQUMsTUFBTSxnQkFBZ0IsQ0FBQztBQUMxQyxPQUFPLEVBQUMsRUFBRSxJQUFJLElBQUksRUFBQyxNQUFNLE1BQU0sQ0FBQztBQUNoQyxPQUFPLEVBQUMsVUFBVSxFQUF1QyxNQUFNLHdCQUF3QixDQUFDO0FBQ3hGLE9BQU8sRUFBQyxVQUFVLEVBQUMsTUFBTSxlQUFlLENBQUM7QUFDekMsT0FBTyxFQUFDLFVBQVUsRUFBQyxNQUFNLGVBQWUsQ0FBQztBQUN6QyxPQUFPLEVBQUMsY0FBYyxFQUFDLE1BQU0sb0JBQW9CLENBQUM7QUFDbEQsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sbUNBQW1DLENBQUM7QUFDdkUsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLDhCQUE4QixDQUFDO0FBQy9ELE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBR3hELE1BQU07Ozs7Ozs7OztJQVFGLFlBQW9CLEdBQW9CLEVBQ3BCLFVBQXNCLEVBQ3RCLGNBQThCLEVBQzlCLFVBQXNCLEVBQ3RCLGtCQUFzQyxFQUN0QyxnQkFBa0M7UUFMbEMsUUFBRyxHQUFILEdBQUcsQ0FBaUI7UUFDcEIsZUFBVSxHQUFWLFVBQVUsQ0FBWTtRQUN0QixtQkFBYyxHQUFkLGNBQWMsQ0FBZ0I7UUFD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ekQsYUFBYSxHQUFHLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxnQkFBZ0IsRUFBRTtZQUM5RCxNQUFNLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxlQUFlLEVBQUU7aUJBQzVDLGdCQUFnQixDQUFDLGFBQWEsQ0FBQyxVQUFVLEVBQUUsWUFBWSxDQUFDLENBQUM7WUFDNUQsSUFBSSxDQUFDLFVBQVUsQ0FBQyxhQUFhLEVBQUUsVUFBVSxDQUFDLENBQUM7UUFDL0MsQ0FBQztLQUFBOzs7Ozs7SUFFRCxVQUFVLENBQUMsYUFBa0IsRUFBRSxVQUFrQjtRQUM3QyxhQUFhLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxlQUFlLENBQUMsYUFBYSxFQUFFLEVBQUMsVUFBVSxFQUFFLFVBQVUsRUFBQyxDQUFDLENBQUM7UUFDdEcsSUFBSSxDQUFDLGtCQUFrQixDQUFDLFVBQVUsQ0FBQyxVQUFVLEVBQUUsYUFBYSxDQUFDLENBQUM7SUFDbEUsQ0FBQzs7OztJQUVELFdBQVc7UUFDUCxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsNEJBQTRCLENBQUMsQ0FBQyxDQUFDO1lBQ3BDLElBQUksQ0FBQyw0QkFBNEIsQ0FBQyxXQUFXLEVBQUUsQ0FBQztRQUNwRCxDQUFDO0lBQ0wsQ0FBQzs7O1lBeFFKLFVBQVU7OztZQUhGLGVBQWU7WUFIaEIsVUFBVTtZQUNWLGNBQWM7WUFGZCxVQUFVO1lBR1Qsa0JBQWtCO1lBRWxCLGdCQUFnQjs7OztJQUtyQiw4REFBMkM7Ozs7O0lBQzNDLG1EQUEyQzs7Ozs7SUFDM0MscURBQTZGOzs7OztJQUM3Rix3REFBb0Q7Ozs7O0lBQ3BELDBEQUF5Rjs7Ozs7SUFFN0UscUNBQTRCOzs7OztJQUM1Qiw0Q0FBOEI7Ozs7O0lBQzlCLGdEQUFzQzs7Ozs7SUFDdEMsNENBQThCOzs7OztJQUM5QixvREFBOEM7Ozs7O0lBQzlDLGtEQUEwQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7SW5qZWN0YWJsZSwgT25EZXN0cm95fSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7SHR0cEVycm9yUmVzcG9uc2UsIEh0dHBSZXNwb25zZX0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uL2h0dHAnO1xuaW1wb3J0IHtPYnNlcnZhYmxlLCBTdWJzY3JpcHRpb24sIFN1YmplY3QsIEJlaGF2aW9yU3ViamVjdCwgdGhyb3dFcnJvcn0gZnJvbSAncnhqcyc7XG5pbXBvcnQge2NhdGNoRXJyb3J9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcbmltcG9ydCB7djQgYXMgdXVpZH0gZnJvbSAndXVpZCc7XG5pbXBvcnQge0Fubm90YXRpb24sIENvbW1lbnQsIElBbm5vdGF0aW9uLCBJQW5ub3RhdGlvblNldH0gZnJvbSAnLi9hbm5vdGF0aW9uLXNldC5tb2RlbCc7XG5pbXBvcnQge1BkZlNlcnZpY2V9IGZyb20gJy4vcGRmLnNlcnZpY2UnO1xuaW1wb3J0IHtQZGZBZGFwdGVyfSBmcm9tICcuL3BkZi1hZGFwdGVyJztcbmltcG9ydCB7QXBpSHR0cFNlcnZpY2V9IGZyb20gJy4vYXBpLWh0dHAuc2VydmljZSc7XG5pbXBvcnQgeyBQZGZBbm5vdGF0ZVdyYXBwZXIgfSBmcm9tICcuL2pzLXdyYXBwZXIvcGRmLWFubm90YXRlLXdyYXBwZXInO1xuaW1wb3J0IHsgRW1Mb2dnZXJTZXJ2aWNlIH0gZnJvbSAnLi4vbG9nZ2luZy9lbS1sb2dnZXIuc2VydmljZSc7XG5pbXBvcnQgeyBQZGZSZW5kZXJTZXJ2aWNlIH0gZnJvbSAnLi9wZGYtcmVuZGVyLnNlcnZpY2UnO1xuXG5ASW5qZWN0YWJsZSgpXG5leHBvcnQgY2xhc3MgQW5ub3RhdGlvblN0b3JlU2VydmljZSBpbXBsZW1lbnRzIE9uRGVzdHJveSB7XG5cbiAgICBhbm5vdGF0aW9uQ2hhbmdlU3Vic2NyaXB0aW9uOiBTdWJzY3JpcHRpb247XG4gICAgcHJpdmF0ZSBjb21tZW50QnRuU3ViamVjdDogU3ViamVjdDxzdHJpbmc+O1xuICAgIHByaXZhdGUgY29tbWVudEZvY3VzU3ViamVjdDogQmVoYXZpb3JTdWJqZWN0PHthbm5vdGF0aW9uOiBBbm5vdGF0aW9uLCBzaG93QnV0dG9uPzogYm9vbGVhbn0+O1xuICAgIHByaXZhdGUgYW5ub3RhdGlvbkZvY3VzU3ViamVjdDogU3ViamVjdDxBbm5vdGF0aW9uPjtcbiAgICBwcml2YXRlIGNvbnRleHR1YWxUb29sQmFyT3B0aW9uczogU3ViamVjdDx7YW5ub3RhdGlvbjogQW5ub3RhdGlvbiwgc2hvd0RlbGV0ZTogYm9vbGVhbn0+O1xuXG4gICAgY29uc3RydWN0b3IocHJpdmF0ZSBsb2c6IEVtTG9nZ2VyU2VydmljZSxcbiAgICAgICAgICAgICAgICBwcml2YXRlIHBkZkFkYXB0ZXI6IFBkZkFkYXB0ZXIsXG4gICAgICAgICAgICAgICAgcHJpdmF0ZSBhcGlIdHRwU2VydmljZTogQXBpSHR0cFNlcnZpY2UsXG4gICAgICAgICAgICAgICAgcHJpdmF0ZSBwZGZTZXJ2aWNlOiBQZGZTZXJ2aWNlLFxuICAgICAgICAgICAgICAgIHByaXZhdGUgcGRmQW5ub3RhdGVXcmFwcGVyOiBQZGZBbm5vdGF0ZVdyYXBwZXIsXG4gICAgICAgICAgICAgICAgcHJpdmF0ZSBwZGZSZW5kZXJTZXJ2aWNlOiBQZGZSZW5kZXJTZXJ2aWNlKSB7XG5cbiAgICAgICAgbG9nLnNldENsYXNzKCdBbm5vdGF0aW9uU3RvcmVTZXJ2aWNlJyk7XG4gICAgICAgIHRoaXMuY29tbWVudEJ0blN1YmplY3QgPSBuZXcgU3ViamVjdCgpO1xuICAgICAgICB0aGlzLmNvbW1lbnRGb2N1c1N1YmplY3QgPSBuZXcgQmVoYXZpb3JTdWJqZWN0KFxuICAgICAgICAgICAge2Fubm90YXRpb246IG5ldyBBbm5vdGF0aW9uKG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwpfSk7XG5cbiAgICAgICAgdGhpcy5jb250ZXh0dWFsVG9vbEJhck9wdGlvbnMgPSBuZXcgU3ViamVjdCgpO1xuXG4gICAgICAgIHRoaXMuYW5ub3RhdGlvbkZvY3VzU3ViamVjdCA9IG5ldyBTdWJqZWN0KCk7XG5cbiAgICAgICAgdGhpcy5hbm5vdGF0aW9uQ2hhbmdlU3Vic2NyaXB0aW9uID0gdGhpcy5wZGZBZGFwdGVyLmdldEFubm90YXRpb25DaGFuZ2VTdWJqZWN0KCkuc3Vic2NyaWJlKChlKSA9PiB0aGlzLmhhbmRsZUFubm90YXRpb25FdmVudChlKSk7XG4gICAgfVxuXG4gICAgZ2V0QW5ub3RhdGlvbkZvY3VzU3ViamVjdCgpOiBTdWJqZWN0PEFubm90YXRpb24+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuYW5ub3RhdGlvbkZvY3VzU3ViamVjdDtcbiAgICB9XG5cbiAgICBzZXRBbm5vdGF0aW9uRm9jdXNTdWJqZWN0KGFubm90YXRpb246IEFubm90YXRpb24pIHtcbiAgICAgICAgdGhpcy5hbm5vdGF0aW9uRm9jdXNTdWJqZWN0Lm5leHQoYW5ub3RhdGlvbik7XG4gICAgfVxuXG4gICAgZ2V0Q29tbWVudEZvY3VzU3ViamVjdCgpOiBCZWhhdmlvclN1YmplY3Q8e2Fubm90YXRpb246IEFubm90YXRpb24sIHNob3dCdXR0b24/OiBib29sZWFufT4ge1xuICAgICAgICByZXR1cm4gdGhpcy5jb21tZW50Rm9jdXNTdWJqZWN0O1xuICAgIH1cblxuICAgIHNldENvbW1lbnRGb2N1c1N1YmplY3QoYW5ub3RhdGlvbjogQW5ub3RhdGlvbiwgc2hvd0J1dHRvbj86IGJvb2xlYW4pIHtcbiAgICAgICAgdGhpcy5jb21tZW50Rm9jdXNTdWJqZWN0Lm5leHQoe2Fubm90YXRpb24sIHNob3dCdXR0b259KTtcbiAgICB9XG5cbiAgICBnZXRDb21tZW50QnRuU3ViamVjdCgpOiBTdWJqZWN0PHN0cmluZz4ge1xuICAgICAgICByZXR1cm4gdGhpcy5jb21tZW50QnRuU3ViamVjdDtcbiAgICB9XG5cbiAgICBzZXRDb21tZW50QnRuU3ViamVjdChjb21tZW50SWQ6IHN0cmluZykge1xuICAgICAgICB0aGlzLmNvbW1lbnRCdG5TdWJqZWN0Lm5leHQoY29tbWVudElkKTtcbiAgICB9XG5cbiAgICBzZXRUb29sQmFyVXBkYXRlKGFubm90YXRpb246IEFubm90YXRpb24sIHNob3dEZWxldGU/OiBib29sZWFuKSB7XG4gICAgICAgIGNvbnN0IGNvbnRleHR1YWxPcHRpb25zID0ge1xuICAgICAgICAgICAgYW5ub3RhdGlvbixcbiAgICAgICAgICAgIHNob3dEZWxldGVcbiAgICAgICAgfTtcblxuICAgICAgICB0aGlzLmNvbnRleHR1YWxUb29sQmFyT3B0aW9ucy5uZXh0KGNvbnRleHR1YWxPcHRpb25zKTtcbiAgICB9XG5cbiAgICBnZXRUb29sYmFyVXBkYXRlKCk6IFN1YmplY3Q8e2Fubm90YXRpb246IEFubm90YXRpb24sIHNob3dEZWxldGU6IGJvb2xlYW59PiB7XG4gICAgICAgIHJldHVybiB0aGlzLmNvbnRleHR1YWxUb29sQmFyT3B0aW9ucztcbiAgICB9XG5cbiAgICBwcmVMb2FkKGFubm90YXRpb25EYXRhOiBJQW5ub3RhdGlvblNldCkge1xuICAgICAgICBpZiAoYW5ub3RhdGlvbkRhdGEgIT0gbnVsbCkge1xuICAgICAgICAgICAgdGhpcy5wZGZBZGFwdGVyLnNldFN0b3JlRGF0YShhbm5vdGF0aW9uRGF0YSk7XG4gICAgICAgICAgICB0aGlzLnBkZkFubm90YXRlV3JhcHBlci5zZXRTdG9yZUFkYXB0ZXIodGhpcy5wZGZBZGFwdGVyLmdldFN0b3JlQWRhcHRlcigpKTtcbiAgICAgICAgICAgIHRoaXMucGRmU2VydmljZS5zZXRIaWdobGlnaHRUb29sKCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLnBkZlNlcnZpY2Uuc2V0Q3Vyc29yVG9vbCgpO1xuICAgICAgICAgICAgdGhpcy5wZGZBbm5vdGF0ZVdyYXBwZXIuc2V0U3RvcmVBZGFwdGVyKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBoYW5kbGVBbm5vdGF0aW9uRXZlbnQoZSkge1xuICAgICAgICBzd2l0Y2ggKGUudHlwZSkge1xuICAgICAgICAgICAgY2FzZSAnYWRkQW5ub3RhdGlvbic6IHtcbiAgICAgICAgICAgICAgICB0aGlzLnNhdmVBbm5vdGF0aW9uKGUuYW5ub3RhdGlvbik7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXNlICdhZGRDb21tZW50Jzoge1xuICAgICAgICAgICAgICAgIHRoaXMuc2F2ZUFubm90YXRpb24oZS5hbm5vdGF0aW9uLCBlLnR5cGUpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2FzZSAnZWRpdENvbW1lbnQnOiB7XG4gICAgICAgICAgICAgICAgdGhpcy5zYXZlQW5ub3RhdGlvbihlLmFubm90YXRpb24sIGUudHlwZSk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXNlICdkZWxldGVDb21tZW50Jzoge1xuICAgICAgICAgICAgICAgIHRoaXMuc2F2ZUFubm90YXRpb24oZS5hbm5vdGF0aW9uKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhc2UgJ2VkaXRBbm5vdGF0aW9uJzoge1xuICAgICAgICAgICAgICAgIHRoaXMuc2F2ZUFubm90YXRpb24oZS5hbm5vdGF0aW9uKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhc2UgJ2RlbGV0ZUFubm90YXRpb24nOiB7XG4gICAgICAgICAgICAgICAgdGhpcy5kZWxldGVBbm5vdGF0aW9uKGUuYW5ub3RhdGlvbik7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBnZXRBbm5vdGF0aW9uU2V0KGJhc2VVcmwsIGRtRG9jdW1lbnRJZCk6IE9ic2VydmFibGU8SHR0cFJlc3BvbnNlPElBbm5vdGF0aW9uU2V0Pj4ge1xuICAgICAgICByZXR1cm4gdGhpcy5hcGlIdHRwU2VydmljZS5mZXRjaChiYXNlVXJsLCBkbURvY3VtZW50SWQpLnBpcGUoXG4gICAgICAgICAgICBjYXRjaEVycm9yKChlcnIpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoZXJyIGluc3RhbmNlb2YgSHR0cEVycm9yUmVzcG9uc2UpIHtcbiAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChlcnIuc3RhdHVzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDQwMDoge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubG9nLmVycm9yKCdCYWQgcmVxdWVzdDogJyArIGVyci5lcnJvcik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRocm93RXJyb3IoZXJyLmVycm9yKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgNDA0OiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYm9keSA9IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG9jdW1lbnRJZDogZG1Eb2N1bWVudElkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZDogdXVpZCgpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmxvZy5pbmZvKCdDcmVhdGluZyBuZXcgYW5ub3RhdGlvbiBzZXQgZm9yIGRvY3VtZW50IGlkOicgKyBkbURvY3VtZW50SWQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmFwaUh0dHBTZXJ2aWNlLmNyZWF0ZUFubm90YXRpb25TZXQoYmFzZVVybCwgYm9keSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDUwMDoge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubG9nLmVycm9yKCdJbnRlcm5hbCBzZXJ2ZXIgZXJyb3I6ICcgKyBlcnIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aHJvd0Vycm9yKCdJbnRlcm5hbCBzZXJ2ZXIgZXJyb3I6ICcgKyBlcnIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSkpO1xuICAgIH1cblxuICAgIHNhdmVEYXRhKCkge1xuICAgICAgICBsZXQgbG9hZGVkRGF0YTogSUFubm90YXRpb25TZXQ7XG4gICAgICAgIGxldCB0b0tlZXBBbm5vdGF0aW9uczogSUFubm90YXRpb25bXTtcbiAgICAgICAgbGV0IHRvUmVtb3ZlQW5ub3RhdGlvbnM6IElBbm5vdGF0aW9uW107XG5cbiAgICAgICAgbG9hZGVkRGF0YSA9IHRoaXMucGRmQWRhcHRlci5hbm5vdGF0aW9uU2V0O1xuXG4gICAgICAgIHRvS2VlcEFubm90YXRpb25zID0gdGhpcy5wZGZBZGFwdGVyLmFubm90YXRpb25zO1xuXG4gICAgICAgIHRvUmVtb3ZlQW5ub3RhdGlvbnMgPSB0aGlzLnBkZkFkYXB0ZXIuYW5ub3RhdGlvblNldC5hbm5vdGF0aW9uc1xuICAgICAgICAgICAgLmZpbHRlcigoYW5ub3RhdGlvbjogSUFubm90YXRpb24pID0+ICF0aGlzLnBkZkFkYXB0ZXIuYW5ub3RhdGlvbnMubWFwKGEgPT4gYS5pZCkuaW5jbHVkZXMoYW5ub3RhdGlvbi5pZCkpO1xuXG4gICAgICAgIHRvS2VlcEFubm90YXRpb25zLmZvckVhY2goKGFubm90YXRpb246IEFubm90YXRpb24pID0+IHtcbiAgICAgICAgICAgIHRoaXMuYXBpSHR0cFNlcnZpY2Uuc2F2ZUFubm90YXRpb24oYW5ub3RhdGlvbikuc3Vic2NyaWJlKFxuICAgICAgICAgICAgICAgIHJlc3BvbnNlID0+IHRoaXMubG9nLmluZm8oJ1N1Y2Nlc3NmdWxseSBzYXZlZCBhbm5vdGF0aW9uOicgKyByZXNwb25zZSksXG4gICAgICAgICAgICAgICAgZXJyb3IgPT4gdGhpcy5sb2cuZXJyb3IoJ1RoZXJlIGhhcyBiZWVuIGEgcHJvYmxlbSBzYXZpbmcgdGhlIGFubm90YXRpb246JyArIGFubm90YXRpb24uaWQgKyAnLScgKyBlcnJvcilcbiAgICAgICAgICAgICk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHRvUmVtb3ZlQW5ub3RhdGlvbnMuZm9yRWFjaCgoYW5ub3RhdGlvbjogQW5ub3RhdGlvbikgPT4ge1xuICAgICAgICAgICAgdGhpcy5hcGlIdHRwU2VydmljZS5kZWxldGVBbm5vdGF0aW9uKGFubm90YXRpb24pLnN1YnNjcmliZShcbiAgICAgICAgICAgICAgICByZXNwb25zZSA9PiB0aGlzLmxvZy5pbmZvKCdTdWNjZXNzZnVsbHkgZGVsZXRlZCBhbm5vdGF0aW9uOicgKyByZXNwb25zZSksXG4gICAgICAgICAgICAgICAgZXJyb3IgPT4gdGhpcy5sb2cuZXJyb3IoJ1RoZXJlIGhhcyBiZWVuIGEgcHJvYmxlbSBkZWxldGluZyBhbm5vdGF0aW9uOicgKyBhbm5vdGF0aW9uLmlkICsgJy0nICsgZXJyb3IpXG4gICAgICAgICAgICApO1xuICAgICAgICB9KTtcblxuICAgICAgICBsb2FkZWREYXRhLmFubm90YXRpb25zLnNwbGljZSgwLCBsb2FkZWREYXRhLmFubm90YXRpb25zLmxlbmd0aCk7XG4gICAgICAgIGxvYWRlZERhdGEuYW5ub3RhdGlvbnMuY29uY2F0KHRvS2VlcEFubm90YXRpb25zKTtcbiAgICAgICAgdGhpcy5wZGZBZGFwdGVyLmFubm90YXRpb25TZXQgPSBsb2FkZWREYXRhO1xuICAgIH1cblxuICAgIHNhdmVBbm5vdGF0aW9uKGFubm90YXRpb246IEFubm90YXRpb24sIHR5cGU/OiBzdHJpbmcpIHtcbiAgICAgICAgdGhpcy5hcGlIdHRwU2VydmljZS5zYXZlQW5ub3RhdGlvbihhbm5vdGF0aW9uKS5zdWJzY3JpYmUoXG4gICAgICAgICAgICByZXNwb25zZSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKHR5cGUgPT09ICdhZGRDb21tZW50JyB8fCB0eXBlID09PSAnZWRpdENvbW1lbnQnKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMucGRmQWRhcHRlci5hbm5vdGF0aW9uU2V0LmFubm90YXRpb25zW3RoaXMucGRmQWRhcHRlci5hbm5vdGF0aW9uU2V0LmFubm90YXRpb25zXG4gICAgICAgICAgICAgICAgICAgICAgICAuZmluZEluZGV4KHggPT4geC5pZCA9PT0gYW5ub3RhdGlvbi5pZCldID0gcmVzcG9uc2UuYm9keTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdGhpcy5sb2cuaW5mbygnU3VjY2Vzc2Z1bGx5IHNhdmVkIGFubm90YXRpb246JyArIHJlc3BvbnNlKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBlcnJvciA9PiB0aGlzLmxvZy5lcnJvcignVGhlcmUgaGFzIGJlZW4gYSBwcm9ibGVtIHNhdmluZyB0aGUgYW5ub3RhdGlvbjonICsgYW5ub3RhdGlvbi5pZCArICctJyArIGVycm9yKVxuICAgICAgICApO1xuICAgIH1cblxuICAgIGRlbGV0ZUFubm90YXRpb24oYW5ub3RhdGlvbikge1xuICAgICAgICB0aGlzLmFwaUh0dHBTZXJ2aWNlLmRlbGV0ZUFubm90YXRpb24oYW5ub3RhdGlvbikuc3Vic2NyaWJlKFxuICAgICAgICAgICAgcmVzcG9uc2UgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMubG9nLmluZm8oJ1N1Y2Nlc3NmdWxseSBkZWxldGVkIGFubm90YXRpb246JyArIGFubm90YXRpb24uaWQgKyAnLScgKyByZXNwb25zZSk7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgZXJyb3IgPT4gdGhpcy5sb2cuZXJyb3IoJ1RoZXJlIGhhcyBiZWVuIGEgcHJvYmxlbSBkZWxldGluZyBhbm5vdGF0aW9uOicgKyBhbm5vdGF0aW9uLmlkICsgJy0nICsgZXJyb3IpXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgZWRpdENvbW1lbnQoY29tbWVudDogQ29tbWVudCkge1xuICAgICAgICB0aGlzLnBkZkFkYXB0ZXIuZWRpdENvbW1lbnQoY29tbWVudCk7XG4gICAgfVxuXG4gICAgZ2V0QW5ub3RhdGlvbkJ5SWQoYW5ub3RhdGlvbklkOiBzdHJpbmcpOiBQcm9taXNlPEFubm90YXRpb24+IHtcbiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlPEFubm90YXRpb24+KChyZXNvbHZlKSA9PiB7XG4gICAgICAgICAgICB0aGlzLmdldEFubm90YXRpb24oXG4gICAgICAgICAgICAgICAgYW5ub3RhdGlvbklkLFxuICAgICAgICAgICAgICAgIGFubm90YXRpb24gPT4ge1xuICAgICAgICAgICAgICAgICAgICByZXNvbHZlKGFubm90YXRpb24pO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBnZXRBbm5vdGF0aW9uc0ZvclBhZ2UocGFnZU51bWJlcik6IFByb21pc2U8QW5ub3RhdGlvbltdPiB7XG4gICAgICAgIHJldHVybiBuZXcgUHJvbWlzZTxBbm5vdGF0aW9uW10+KChyZXNvbHZlKSA9PiB7XG4gICAgICAgICAgICB0aGlzLmdldEFubm90YXRpb25zKFxuICAgICAgICAgICAgICAgIHBhZ2VOdW1iZXIsXG4gICAgICAgICAgICAgICAgcGFnZURhdGEgPT4ge1xuICAgICAgICAgICAgICAgICAgICByZXNvbHZlKHBhZ2VEYXRhKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgZ2V0Q29tbWVudHNGb3JBbm5vdGF0aW9uKGFubm90YXRpb25JZCk6IFByb21pc2U8Q29tbWVudFtdPiB7XG4gICAgICAgIHJldHVybiBuZXcgUHJvbWlzZTxDb21tZW50W10+KChyZXNvbHZlKSA9PiB7XG4gICAgICAgICAgICB0aGlzLmdldENvbW1lbnRzKFxuICAgICAgICAgICAgICAgIGFubm90YXRpb25JZCxcbiAgICAgICAgICAgICAgICBjb21tZW50cyA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHJlc29sdmUoY29tbWVudHMpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBnZXRBbm5vdGF0aW9uKGFubm90YXRpb25JZDogc3RyaW5nLCBjYWxsYmFjaykge1xuICAgICAgICB0aGlzLnBkZkFubm90YXRlV3JhcHBlci5nZXRTdG9yZUFkYXB0ZXIoKVxuICAgICAgICAgICAgLmdldEFubm90YXRpb24odGhpcy5wZGZSZW5kZXJTZXJ2aWNlLmdldFJlbmRlck9wdGlvbnMoKS5kb2N1bWVudElkLCBhbm5vdGF0aW9uSWQpXG4gICAgICAgICAgICAudGhlbihjYWxsYmFjayk7XG4gICAgfVxuXG4gICAgZ2V0Q29tbWVudHMoYW5ub3RhdGlvbklkOiBzdHJpbmcsIGNhbGxiYWNrKSB7XG4gICAgICAgIHRoaXMucGRmQW5ub3RhdGVXcmFwcGVyLmdldFN0b3JlQWRhcHRlcigpXG4gICAgICAgICAgICAuZ2V0Q29tbWVudHModGhpcy5wZGZSZW5kZXJTZXJ2aWNlLmdldFJlbmRlck9wdGlvbnMoKS5kb2N1bWVudElkLCBhbm5vdGF0aW9uSWQpXG4gICAgICAgICAgICAudGhlbihjYWxsYmFjayk7XG4gICAgfVxuXG4gICAgYWRkQ29tbWVudChjb21tZW50OiBDb21tZW50KSB7XG4gICAgICAgIHRoaXMucGRmQW5ub3RhdGVXcmFwcGVyLmdldFN0b3JlQWRhcHRlcigpXG4gICAgICAgICAgICAuYWRkQ29tbWVudCh0aGlzLnBkZlJlbmRlclNlcnZpY2UuZ2V0UmVuZGVyT3B0aW9ucygpLmRvY3VtZW50SWQsIGNvbW1lbnQuYW5ub3RhdGlvbklkLCBjb21tZW50LmNvbnRlbnQpXG4gICAgICAgICAgICAudGhlbigpO1xuICAgIH1cblxuICAgIGdldEFubm90YXRpb25zKHBhZ2VOdW1iZXI6IG51bWJlciwgY2FsbGJhY2spIHtcbiAgICAgICAgdGhpcy5wZGZBbm5vdGF0ZVdyYXBwZXIuZ2V0U3RvcmVBZGFwdGVyKClcbiAgICAgICAgICAgIC5nZXRBbm5vdGF0aW9ucyh0aGlzLnBkZlJlbmRlclNlcnZpY2UuZ2V0UmVuZGVyT3B0aW9ucygpLmRvY3VtZW50SWQsIHBhZ2VOdW1iZXIpXG4gICAgICAgICAgICAudGhlbihjYWxsYmFjayk7XG4gICAgfVxuXG4gICAgZGVsZXRlQ29tbWVudChjb21tZW50SWQ6IHN0cmluZykge1xuICAgICAgICB0aGlzLnBkZkFubm90YXRlV3JhcHBlci5nZXRTdG9yZUFkYXB0ZXIoKVxuICAgICAgICAgICAgLmRlbGV0ZUNvbW1lbnQodGhpcy5wZGZSZW5kZXJTZXJ2aWNlLmdldFJlbmRlck9wdGlvbnMoKS5kb2N1bWVudElkLCBjb21tZW50SWQpXG4gICAgICAgICAgICAudGhlbigpO1xuICAgIH1cblxuICAgIGFzeW5jIGRlbGV0ZUFubm90YXRpb25CeUlkKGFubm90YXRpb25JZDogc3RyaW5nLCBwYWdlTnVtYmVyOiBudW1iZXIpIHtcbiAgICAgICAgY29uc3QgcmVuZGVyT3B0aW9ucyA9IHRoaXMucGRmUmVuZGVyU2VydmljZS5nZXRSZW5kZXJPcHRpb25zKCk7XG4gICAgICAgIGF3YWl0IHRoaXMucGRmQW5ub3RhdGVXcmFwcGVyLmdldFN0b3JlQWRhcHRlcigpXG4gICAgICAgICAgLmRlbGV0ZUFubm90YXRpb24ocmVuZGVyT3B0aW9ucy5kb2N1bWVudElkLCBhbm5vdGF0aW9uSWQpO1xuICAgICAgICB0aGlzLnJlbmRlclBhZ2UocmVuZGVyT3B0aW9ucywgcGFnZU51bWJlcik7XG4gICAgfVxuXG4gICAgcmVuZGVyUGFnZShyZW5kZXJPcHRpb25zOiBhbnksIHBhZ2VOdW1iZXI6IG51bWJlcikge1xuICAgICAgICByZW5kZXJPcHRpb25zLnJvdGF0ZSA9IHRoaXMucGRmUmVuZGVyU2VydmljZS5nZXRQYWdlUm90YXRpb24ocmVuZGVyT3B0aW9ucywge3BhZ2VOdW1iZXI6IHBhZ2VOdW1iZXJ9KTtcbiAgICAgICAgdGhpcy5wZGZBbm5vdGF0ZVdyYXBwZXIucmVuZGVyUGFnZShwYWdlTnVtYmVyLCByZW5kZXJPcHRpb25zKTtcbiAgICB9XG5cbiAgICBuZ09uRGVzdHJveSgpIHtcbiAgICAgICAgaWYgKHRoaXMuYW5ub3RhdGlvbkNoYW5nZVN1YnNjcmlwdGlvbikge1xuICAgICAgICAgICAgdGhpcy5hbm5vdGF0aW9uQ2hhbmdlU3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7XG4gICAgICAgIH1cbiAgICB9XG59XG4iXX0=