UNPKG

@hmcts/annotation-ui-lib

Version:

PDF Viewer and ability to highlight text with and comment tracking

310 lines 29.1 kB
/** * @fileoverview added by tsickle * @suppress {checkTypes,extraRequire,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc */ import { Component, ViewChild, ElementRef, Input, ChangeDetectorRef, Renderer2 } from '@angular/core'; import { PdfService } from '../../data/pdf.service'; import { AnnotationStoreService } from '../../data/annotation-store.service'; import { Annotation } from '../../data/annotation-set.model'; import { NpaService } from '../../data/npa.service'; import { ApiHttpService } from '../../data/api-http.service'; import { Utils } from '../../data/utils'; import { PdfAnnotateWrapper } from '../../data/js-wrapper/pdf-annotate-wrapper'; import { CommentsComponent } from './comments/comments.component'; import { ContextualToolbarComponent } from './contextual-toolbar/contextual-toolbar.component'; import { EmLoggerService } from '../../logging/em-logger.service'; import { RenderOptions } from '../../data/js-wrapper/renderOptions.model'; import { PdfRenderService } from '../../data/pdf-render.service'; import { RotationFactoryService } from './rotation-toolbar/rotation-factory.service'; export class AnnotationPdfViewerComponent { /** * @param {?} pdfService * @param {?} npaService * @param {?} apiHttpService * @param {?} annotationStoreService * @param {?} utils * @param {?} ref * @param {?} renderer * @param {?} pdfAnnotateWrapper * @param {?} pdfRenderService * @param {?} rotationFactoryService * @param {?} log */ constructor(pdfService, npaService, apiHttpService, annotationStoreService, utils, ref, renderer, pdfAnnotateWrapper, pdfRenderService, rotationFactoryService, log) { this.pdfService = pdfService; this.npaService = npaService; this.apiHttpService = apiHttpService; this.annotationStoreService = annotationStoreService; this.utils = utils; this.ref = ref; this.renderer = renderer; this.pdfAnnotateWrapper = pdfAnnotateWrapper; this.pdfRenderService = pdfRenderService; this.rotationFactoryService = rotationFactoryService; this.log = log; this.rotationComponents = []; } /** * @return {?} */ ngOnInit() { this.loadAnnotations(this.annotate); this.pdfService.preRun(); this.pdfRenderService.setRenderOptions(new RenderOptions(this.url, null, parseFloat('1.33'), 0, [])); if (this.rotate) { this.pdfPageSubscription = this.pdfRenderService.listPagesSubject .subscribe((listPages) => { this.rotationComponents.forEach(rc => rc.destroy()); listPages.forEach(pageDetails => { this.rotationComponents.push(this.rotationFactoryService.addToDom(pageDetails)); }); }); } this.pdfRenderService.render(this.viewerElementRef); this.pdfService.setAnnotationWrapper(this.annotationWrapper); this.pageNumberSubscription = this.pdfService.getPageNumber() .subscribe(page => this.page = page); this.focusedAnnotationSubscription = this.annotationStoreService.getAnnotationFocusSubject() .subscribe(focusedAnnotation => this.focusHighlightStyle(focusedAnnotation)); } /** * @return {?} */ ngAfterViewInit() { this.pdfAnnotateWrapper.getUi().addEventListener('annotation:click', this.handleAnnotationClick.bind(this)); } /** * @return {?} */ ngOnDestroy() { if (this.pageNumberSubscription) { this.pageNumberSubscription.unsubscribe(); } if (this.focusedAnnotationSubscription) { this.focusedAnnotationSubscription.unsubscribe(); } if (this.pdfPageSubscription) { this.pdfPageSubscription.unsubscribe(); } } /** * @param {?} annotate * @return {?} */ loadAnnotations(annotate) { if (annotate) { this.log.info('annotations are enabled'); this.apiHttpService.setBaseUrl(this.baseUrl); this.annotationStoreService.preLoad(this.annotationSet); this.npaService.outputDmDocumentId.next(this.outputDmDocumentId); } else { this.log.info('annotations are disabled'); this.annotationStoreService.preLoad(null); } } /** * @param {?} event * @param {?=} isPage * @return {?} */ handleClick(event, isPage) { if (this.annotate) { if (!this.utils.clickIsHighlight(event)) { this.unfocusAnnotation(); this.annotationStoreService.setToolBarUpdate(null, null); } this.commentsComponent.handleAnnotationBlur(); if (isPage) { this.pdfService.setPageNumber(this.utils.getClickedPage(event)); } } } /** * @return {?} */ renderComments() { this.unfocusAnnotation(); this.commentsComponent.showAllComments(); } /** * @return {?} */ unfocusAnnotation() { this.annotationStoreService.setAnnotationFocusSubject(new Annotation()); this.annotationStoreService.setCommentBtnSubject(null); this.annotationStoreService.setCommentFocusSubject(new Annotation(), null); } /** * @param {?} event * @return {?} */ handleAnnotationClick(event) { if (!this.contextualToolbar.isShowToolbar) { /** @type {?} */ const annotationId = event.getAttribute('data-pdf-annotate-id'); this.annotationStoreService.getAnnotationById(annotationId) .then((annotation) => { this.annotationStoreService.setAnnotationFocusSubject(annotation); this.annotationStoreService.setCommentFocusSubject(annotation); this.annotationStoreService.setToolBarUpdate(annotation, true); }); } } /** * @param {?} focusedAnnotation * @return {?} */ focusHighlightStyle(focusedAnnotation) { Array.from(this.viewerElementRef.nativeElement.querySelector(`#pageContainer${this.page} .annotationLayer`).childNodes) .forEach((annotationDom) => { if (annotationDom.dataset.pdfAnnotateId === focusedAnnotation.id) { this.renderer.addClass(annotationDom, 'comment-selected'); } else { this.renderer.removeClass(annotationDom, 'comment-selected'); } }); if (!this.ref['destroyed']) { this.ref.detectChanges(); } } } AnnotationPdfViewerComponent.decorators = [ { type: Component, args: [{ selector: 'app-annotation-pdf-viewer', template: "\n<app-comments (click)=\"handleClick($event, false)\" #commentsComponent\n *ngIf=\"annotate\"></app-comments>\n\n<div id=\"annotation-wrapper\" #annotationWrapper>\n <app-contextual-toolbar (deletedAnnotation)=\"renderComments()\" #contextualToolbar></app-contextual-toolbar>\n\n <div id=\"content-wrapper\"\n #contentWrapper\n (click)=\"handleClick($event, true)\">\n <div id=\"viewer\" #viewer class=\"pdfViewer\"></div>\n </div>\n</div>\n", styles: ["#annotation-wrapper{position:relative;width:100%}#content-wrapper{overflow:hidden}"] }] } ]; AnnotationPdfViewerComponent.ctorParameters = () => [ { type: PdfService }, { type: NpaService }, { type: ApiHttpService }, { type: AnnotationStoreService }, { type: Utils }, { type: ChangeDetectorRef }, { type: Renderer2 }, { type: PdfAnnotateWrapper }, { type: PdfRenderService }, { type: RotationFactoryService }, { type: EmLoggerService } ]; AnnotationPdfViewerComponent.propDecorators = { annotate: [{ type: Input }], dmDocumentId: [{ type: Input }], outputDmDocumentId: [{ type: Input }], url: [{ type: Input }], annotationSet: [{ type: Input }], baseUrl: [{ type: Input }], rotate: [{ type: Input }], contentWrapper: [{ type: ViewChild, args: ['contentWrapper',] }], viewerElementRef: [{ type: ViewChild, args: ['viewer',] }], annotationWrapper: [{ type: ViewChild, args: ['annotationWrapper',] }], commentsComponent: [{ type: ViewChild, args: ['commentsComponent',] }], contextualToolbar: [{ type: ViewChild, args: ['contextualToolbar',] }] }; if (false) { /** @type {?} */ AnnotationPdfViewerComponent.prototype.annotate; /** @type {?} */ AnnotationPdfViewerComponent.prototype.dmDocumentId; /** @type {?} */ AnnotationPdfViewerComponent.prototype.outputDmDocumentId; /** @type {?} */ AnnotationPdfViewerComponent.prototype.url; /** @type {?} */ AnnotationPdfViewerComponent.prototype.annotationSet; /** @type {?} */ AnnotationPdfViewerComponent.prototype.baseUrl; /** @type {?} */ AnnotationPdfViewerComponent.prototype.rotate; /** * @type {?} * @private */ AnnotationPdfViewerComponent.prototype.page; /** * @type {?} * @private */ AnnotationPdfViewerComponent.prototype.focusedAnnotationSubscription; /** * @type {?} * @private */ AnnotationPdfViewerComponent.prototype.pageNumberSubscription; /** * @type {?} * @private */ AnnotationPdfViewerComponent.prototype.pdfPageSubscription; /** @type {?} */ AnnotationPdfViewerComponent.prototype.rotationComponents; /** @type {?} */ AnnotationPdfViewerComponent.prototype.contentWrapper; /** @type {?} */ AnnotationPdfViewerComponent.prototype.viewerElementRef; /** @type {?} */ AnnotationPdfViewerComponent.prototype.annotationWrapper; /** @type {?} */ AnnotationPdfViewerComponent.prototype.commentsComponent; /** @type {?} */ AnnotationPdfViewerComponent.prototype.contextualToolbar; /** * @type {?} * @private */ AnnotationPdfViewerComponent.prototype.pdfService; /** * @type {?} * @private */ AnnotationPdfViewerComponent.prototype.npaService; /** * @type {?} * @private */ AnnotationPdfViewerComponent.prototype.apiHttpService; /** * @type {?} * @private */ AnnotationPdfViewerComponent.prototype.annotationStoreService; /** * @type {?} * @private */ AnnotationPdfViewerComponent.prototype.utils; /** * @type {?} * @private */ AnnotationPdfViewerComponent.prototype.ref; /** * @type {?} * @private */ AnnotationPdfViewerComponent.prototype.renderer; /** * @type {?} * @private */ AnnotationPdfViewerComponent.prototype.pdfAnnotateWrapper; /** * @type {?} * @private */ AnnotationPdfViewerComponent.prototype.pdfRenderService; /** * @type {?} * @private */ AnnotationPdfViewerComponent.prototype.rotationFactoryService; /** * @type {?} * @private */ AnnotationPdfViewerComponent.prototype.log; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYW5ub3RhdGlvbi1wZGYtdmlld2VyLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiJuZzovL0BobWN0cy9hbm5vdGF0aW9uLXVpLWxpYi8iLCJzb3VyY2VzIjpbImxpYi92aWV3ZXJzL2Fubm90YXRpb24tcGRmLXZpZXdlci9hbm5vdGF0aW9uLXBkZi12aWV3ZXIuY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7QUFBQSxPQUFPLEVBQUMsU0FBUyxFQUFVLFNBQVMsRUFBRSxVQUFVLEVBQUUsS0FBSyxFQUFFLGlCQUFpQixFQUFFLFNBQVMsRUFBeUMsTUFBTSxlQUFlLENBQUM7QUFFcEosT0FBTyxFQUFDLFVBQVUsRUFBQyxNQUFNLHdCQUF3QixDQUFDO0FBQ2xELE9BQU8sRUFBQyxzQkFBc0IsRUFBQyxNQUFNLHFDQUFxQyxDQUFDO0FBQzNFLE9BQU8sRUFBaUIsVUFBVSxFQUFDLE1BQU0saUNBQWlDLENBQUM7QUFDM0UsT0FBTyxFQUFDLFVBQVUsRUFBQyxNQUFNLHdCQUF3QixDQUFDO0FBQ2xELE9BQU8sRUFBQyxjQUFjLEVBQUMsTUFBTSw2QkFBNkIsQ0FBQztBQUMzRCxPQUFPLEVBQUUsS0FBSyxFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFDekMsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sNENBQTRDLENBQUM7QUFDaEYsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sK0JBQStCLENBQUM7QUFDbEUsT0FBTyxFQUFFLDBCQUEwQixFQUFFLE1BQU0sbURBQW1ELENBQUM7QUFDL0YsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLGlDQUFpQyxDQUFDO0FBQ2xFLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSwyQ0FBMkMsQ0FBQztBQUMxRSxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSwrQkFBK0IsQ0FBQztBQUNqRSxPQUFPLEVBQUUsc0JBQXNCLEVBQUUsTUFBTSw2Q0FBNkMsQ0FBQztBQVVyRixNQUFNOzs7Ozs7Ozs7Ozs7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O1lBQUUsU0FBUztZQVE1RSxrQkFBa0I7WUFLbEIsZ0JBQWdCO1lBQ2hCLHNCQUFzQjtZQUh0QixlQUFlOzs7dUJBZW5CLEtBQUs7MkJBQ0wsS0FBSztpQ0FDTCxLQUFLO2tCQUNMLEtBQUs7NEJBQ0wsS0FBSztzQkFDTCxLQUFLO3FCQUNMLEtBQUs7NkJBUUwsU0FBUyxTQUFDLGdCQUFnQjsrQkFDMUIsU0FBUyxTQUFDLFFBQVE7Z0NBQ2xCLFNBQVMsU0FBQyxtQkFBbUI7Z0NBQzdCLFNBQVMsU0FBQyxtQkFBbUI7Z0NBQzdCLFNBQVMsU0FBQyxtQkFBbUI7Ozs7SUFsQjlCLGdEQUEyQjs7SUFDM0Isb0RBQThCOztJQUM5QiwwREFBb0M7O0lBQ3BDLDJDQUFxQjs7SUFDckIscURBQXVDOztJQUN2QywrQ0FBeUI7O0lBQ3pCLDhDQUF5Qjs7Ozs7SUFFekIsNENBQXFCOzs7OztJQUNyQixxRUFBb0Q7Ozs7O0lBQ3BELDhEQUE2Qzs7Ozs7SUFDN0MsMkRBQTBDOztJQUMxQywwREFBMkQ7O0lBRTNELHNEQUF3RDs7SUFDeEQsd0RBQWtEOztJQUNsRCx5REFBOEQ7O0lBQzlELHlEQUFxRTs7SUFDckUseURBQThFOzs7OztJQUVsRSxrREFBOEI7Ozs7O0lBQzlCLGtEQUE4Qjs7Ozs7SUFDOUIsc0RBQXNDOzs7OztJQUN0Qyw4REFBc0Q7Ozs7O0lBQ3RELDZDQUFvQjs7Ozs7SUFDcEIsMkNBQThCOzs7OztJQUM5QixnREFBMkI7Ozs7O0lBQzNCLDBEQUE4Qzs7Ozs7SUFDOUMsd0RBQTBDOzs7OztJQUMxQyw4REFBc0Q7Ozs7O0lBQ3RELDJDQUE0QiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7Q29tcG9uZW50LCBPbkluaXQsIFZpZXdDaGlsZCwgRWxlbWVudFJlZiwgSW5wdXQsIENoYW5nZURldGVjdG9yUmVmLCBSZW5kZXJlcjIsIE9uRGVzdHJveSwgQWZ0ZXJWaWV3SW5pdCwgQ29tcG9uZW50UmVmfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IFN1YnNjcmlwdGlvbiB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHtQZGZTZXJ2aWNlfSBmcm9tICcuLi8uLi9kYXRhL3BkZi5zZXJ2aWNlJztcbmltcG9ydCB7QW5ub3RhdGlvblN0b3JlU2VydmljZX0gZnJvbSAnLi4vLi4vZGF0YS9hbm5vdGF0aW9uLXN0b3JlLnNlcnZpY2UnO1xuaW1wb3J0IHtJQW5ub3RhdGlvblNldCwgQW5ub3RhdGlvbn0gZnJvbSAnLi4vLi4vZGF0YS9hbm5vdGF0aW9uLXNldC5tb2RlbCc7XG5pbXBvcnQge05wYVNlcnZpY2V9IGZyb20gJy4uLy4uL2RhdGEvbnBhLnNlcnZpY2UnO1xuaW1wb3J0IHtBcGlIdHRwU2VydmljZX0gZnJvbSAnLi4vLi4vZGF0YS9hcGktaHR0cC5zZXJ2aWNlJztcbmltcG9ydCB7IFV0aWxzIH0gZnJvbSAnLi4vLi4vZGF0YS91dGlscyc7XG5pbXBvcnQgeyBQZGZBbm5vdGF0ZVdyYXBwZXIgfSBmcm9tICcuLi8uLi9kYXRhL2pzLXdyYXBwZXIvcGRmLWFubm90YXRlLXdyYXBwZXInO1xuaW1wb3J0IHsgQ29tbWVudHNDb21wb25lbnQgfSBmcm9tICcuL2NvbW1lbnRzL2NvbW1lbnRzLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBDb250ZXh0dWFsVG9vbGJhckNvbXBvbmVudCB9IGZyb20gJy4vY29udGV4dHVhbC10b29sYmFyL2NvbnRleHR1YWwtdG9vbGJhci5jb21wb25lbnQnO1xuaW1wb3J0IHsgRW1Mb2dnZXJTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vbG9nZ2luZy9lbS1sb2dnZXIuc2VydmljZSc7XG5pbXBvcnQgeyBSZW5kZXJPcHRpb25zIH0gZnJvbSAnLi4vLi4vZGF0YS9qcy13cmFwcGVyL3JlbmRlck9wdGlvbnMubW9kZWwnO1xuaW1wb3J0IHsgUGRmUmVuZGVyU2VydmljZSB9IGZyb20gJy4uLy4uL2RhdGEvcGRmLXJlbmRlci5zZXJ2aWNlJztcbmltcG9ydCB7IFJvdGF0aW9uRmFjdG9yeVNlcnZpY2UgfSBmcm9tICcuL3JvdGF0aW9uLXRvb2xiYXIvcm90YXRpb24tZmFjdG9yeS5zZXJ2aWNlJztcbmltcG9ydCB7IFJvdGF0aW9uQ29tcG9uZW50IH0gZnJvbSAnLi9yb3RhdGlvbi10b29sYmFyL3JvdGF0aW9uLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBSb3RhdGlvbk1vZGVsIH0gZnJvbSAnLi4vLi4vbW9kZWwvcm90YXRpb24tZmFjdG9yeS5tb2RlbCc7XG5cblxuQENvbXBvbmVudCh7XG4gICAgc2VsZWN0b3I6ICdhcHAtYW5ub3RhdGlvbi1wZGYtdmlld2VyJyxcbiAgICB0ZW1wbGF0ZVVybDogJy4vYW5ub3RhdGlvbi1wZGYtdmlld2VyLmNvbXBvbmVudC5odG1sJyxcbiAgICBzdHlsZVVybHM6IFsnLi9hbm5vdGF0aW9uLXBkZi12aWV3ZXIuY29tcG9uZW50LnNjc3MnXVxufSlcbmV4cG9ydCBjbGFzcyBBbm5vdGF0aW9uUGRmVmlld2VyQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBBZnRlclZpZXdJbml0LCBPbkRlc3Ryb3kge1xuXG4gICAgQElucHV0KCkgYW5ub3RhdGU6IGJvb2xlYW47XG4gICAgQElucHV0KCkgZG1Eb2N1bWVudElkOiBzdHJpbmc7XG4gICAgQElucHV0KCkgb3V0cHV0RG1Eb2N1bWVudElkOiBzdHJpbmc7XG4gICAgQElucHV0KCkgdXJsOiBzdHJpbmc7XG4gICAgQElucHV0KCkgYW5ub3RhdGlvblNldDogSUFubm90YXRpb25TZXQ7XG4gICAgQElucHV0KCkgYmFzZVVybDogc3RyaW5nO1xuICAgIEBJbnB1dCgpIHJvdGF0ZTogYm9vbGVhbjtcblxuICAgIHByaXZhdGUgcGFnZTogbnVtYmVyO1xuICAgIHByaXZhdGUgZm9jdXNlZEFubm90YXRpb25TdWJzY3JpcHRpb246IFN1YnNjcmlwdGlvbjtcbiAgICBwcml2YXRlIHBhZ2VOdW1iZXJTdWJzY3JpcHRpb246IFN1YnNjcmlwdGlvbjtcbiAgICBwcml2YXRlIHBkZlBhZ2VTdWJzY3JpcHRpb246IFN1YnNjcmlwdGlvbjtcbiAgICByb3RhdGlvbkNvbXBvbmVudHM6IENvbXBvbmVudFJlZjxSb3RhdGlvbkNvbXBvbmVudD5bXSA9IFtdO1xuXG4gICAgQFZpZXdDaGlsZCgnY29udGVudFdyYXBwZXInKSBjb250ZW50V3JhcHBlcjogRWxlbWVudFJlZjtcbiAgICBAVmlld0NoaWxkKCd2aWV3ZXInKSB2aWV3ZXJFbGVtZW50UmVmOiBFbGVtZW50UmVmO1xuICAgIEBWaWV3Q2hpbGQoJ2Fubm90YXRpb25XcmFwcGVyJykgYW5ub3RhdGlvbldyYXBwZXI6IEVsZW1lbnRSZWY7XG4gICAgQFZpZXdDaGlsZCgnY29tbWVudHNDb21wb25lbnQnKSBjb21tZW50c0NvbXBvbmVudDogQ29tbWVudHNDb21wb25lbnQ7XG4gICAgQFZpZXdDaGlsZCgnY29udGV4dHVhbFRvb2xiYXInKSBjb250ZXh0dWFsVG9vbGJhcjogQ29udGV4dHVhbFRvb2xiYXJDb21wb25lbnQ7XG5cbiAgICBjb25zdHJ1Y3Rvcihwcml2YXRlIHBkZlNlcnZpY2U6IFBkZlNlcnZpY2UsXG4gICAgICAgICAgICAgICAgcHJpdmF0ZSBucGFTZXJ2aWNlOiBOcGFTZXJ2aWNlLFxuICAgICAgICAgICAgICAgIHByaXZhdGUgYXBpSHR0cFNlcnZpY2U6IEFwaUh0dHBTZXJ2aWNlLFxuICAgICAgICAgICAgICAgIHByaXZhdGUgYW5ub3RhdGlvblN0b3JlU2VydmljZTogQW5ub3RhdGlvblN0b3JlU2VydmljZSxcbiAgICAgICAgICAgICAgICBwcml2YXRlIHV0aWxzOiBVdGlscyxcbiAgICAgICAgICAgICAgICBwcml2YXRlIHJlZjogQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gICAgICAgICAgICAgICAgcHJpdmF0ZSByZW5kZXJlcjogUmVuZGVyZXIyLFxuICAgICAgICAgICAgICAgIHByaXZhdGUgcGRmQW5ub3RhdGVXcmFwcGVyOiBQZGZBbm5vdGF0ZVdyYXBwZXIsXG4gICAgICAgICAgICAgICAgcHJpdmF0ZSBwZGZSZW5kZXJTZXJ2aWNlOiBQZGZSZW5kZXJTZXJ2aWNlLFxuICAgICAgICAgICAgICAgIHByaXZhdGUgcm90YXRpb25GYWN0b3J5U2VydmljZTogUm90YXRpb25GYWN0b3J5U2VydmljZSxcbiAgICAgICAgICAgICAgICBwcml2YXRlIGxvZzogRW1Mb2dnZXJTZXJ2aWNlKSB7XG4gICAgfVxuXG4gICAgbmdPbkluaXQoKSB7XG4gICAgICAgIHRoaXMubG9hZEFubm90YXRpb25zKHRoaXMuYW5ub3RhdGUpO1xuICAgICAgICB0aGlzLnBkZlNlcnZpY2UucHJlUnVuKCk7XG4gICAgICAgIHRoaXMucGRmUmVuZGVyU2VydmljZS5zZXRSZW5kZXJPcHRpb25zKG5ldyBSZW5kZXJPcHRpb25zKFxuICAgICAgICAgICAgdGhpcy51cmwsXG4gICAgICAgICAgICBudWxsLFxuICAgICAgICAgICAgcGFyc2VGbG9hdCgnMS4zMycpLFxuICAgICAgICAgICAgMCxcbiAgICAgICAgICAgIFtdXG4gICAgICAgICkpO1xuXG4gICAgICAgIGlmICh0aGlzLnJvdGF0ZSkge1xuICAgICAgICAgICAgdGhpcy5wZGZQYWdlU3Vic2NyaXB0aW9uID0gdGhpcy5wZGZSZW5kZXJTZXJ2aWNlLmxpc3RQYWdlc1N1YmplY3RcbiAgICAgICAgICAgICAgLnN1YnNjcmliZSgobGlzdFBhZ2VzOiBSb3RhdGlvbk1vZGVsW10pID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLnJvdGF0aW9uQ29tcG9uZW50cy5mb3JFYWNoKHJjID0+IHJjLmRlc3Ryb3koKSk7XG4gICAgICAgICAgICAgICAgbGlzdFBhZ2VzLmZvckVhY2gocGFnZURldGFpbHMgPT4ge1xuICAgICAgICAgICAgICAgICAgdGhpcy5yb3RhdGlvbkNvbXBvbmVudHMucHVzaCh0aGlzLnJvdGF0aW9uRmFjdG9yeVNlcnZpY2UuYWRkVG9Eb20ocGFnZURldGFpbHMpKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnBkZlJlbmRlclNlcnZpY2UucmVuZGVyKHRoaXMudmlld2VyRWxlbWVudFJlZik7XG4gICAgICAgIHRoaXMucGRmU2VydmljZS5zZXRBbm5vdGF0aW9uV3JhcHBlcih0aGlzLmFubm90YXRpb25XcmFwcGVyKTtcblxuICAgICAgICB0aGlzLnBhZ2VOdW1iZXJTdWJzY3JpcHRpb24gPSB0aGlzLnBkZlNlcnZpY2UuZ2V0UGFnZU51bWJlcigpXG4gICAgICAgICAgICAuc3Vic2NyaWJlKHBhZ2UgPT4gdGhpcy5wYWdlID0gcGFnZSk7XG4gICAgICAgIHRoaXMuZm9jdXNlZEFubm90YXRpb25TdWJzY3JpcHRpb24gPSB0aGlzLmFubm90YXRpb25TdG9yZVNlcnZpY2UuZ2V0QW5ub3RhdGlvbkZvY3VzU3ViamVjdCgpXG4gICAgICAgICAgICAuc3Vic2NyaWJlKGZvY3VzZWRBbm5vdGF0aW9uID0+IHRoaXMuZm9jdXNIaWdobGlnaHRTdHlsZShmb2N1c2VkQW5ub3RhdGlvbikpO1xuICAgIH1cblxuICAgIG5nQWZ0ZXJWaWV3SW5pdCgpIHtcbiAgICAgICAgdGhpcy5wZGZBbm5vdGF0ZVdyYXBwZXIuZ2V0VWkoKS5hZGRFdmVudExpc3RlbmVyKCdhbm5vdGF0aW9uOmNsaWNrJywgdGhpcy5oYW5kbGVBbm5vdGF0aW9uQ2xpY2suYmluZCh0aGlzKSk7XG4gICAgfVxuXG4gICAgbmdPbkRlc3Ryb3koKSB7XG4gICAgICAgIGlmICh0aGlzLnBhZ2VOdW1iZXJTdWJzY3JpcHRpb24pIHtcbiAgICAgICAgICAgIHRoaXMucGFnZU51bWJlclN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLmZvY3VzZWRBbm5vdGF0aW9uU3Vic2NyaXB0aW9uKSB7XG4gICAgICAgICAgICB0aGlzLmZvY3VzZWRBbm5vdGF0aW9uU3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMucGRmUGFnZVN1YnNjcmlwdGlvbikge1xuICAgICAgICAgICAgdGhpcy5wZGZQYWdlU3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBsb2FkQW5ub3RhdGlvbnMoYW5ub3RhdGU6IGJvb2xlYW4pIHtcbiAgICAgICAgaWYgKGFubm90YXRlKSB7XG4gICAgICAgICAgICB0aGlzLmxvZy5pbmZvKCdhbm5vdGF0aW9ucyBhcmUgZW5hYmxlZCcpO1xuICAgICAgICAgICAgdGhpcy5hcGlIdHRwU2VydmljZS5zZXRCYXNlVXJsKHRoaXMuYmFzZVVybCk7XG4gICAgICAgICAgICB0aGlzLmFubm90YXRpb25TdG9yZVNlcnZpY2UucHJlTG9hZCh0aGlzLmFubm90YXRpb25TZXQpO1xuICAgICAgICAgICAgdGhpcy5ucGFTZXJ2aWNlLm91dHB1dERtRG9jdW1lbnRJZC5uZXh0KHRoaXMub3V0cHV0RG1Eb2N1bWVudElkKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMubG9nLmluZm8oJ2Fubm90YXRpb25zIGFyZSBkaXNhYmxlZCcpO1xuICAgICAgICAgICAgdGhpcy5hbm5vdGF0aW9uU3RvcmVTZXJ2aWNlLnByZUxvYWQobnVsbCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBoYW5kbGVDbGljayhldmVudDogYW55LCBpc1BhZ2U/OiBib29sZWFuKSB7XG4gICAgICAgIGlmICh0aGlzLmFubm90YXRlKSB7XG4gICAgICAgICAgICBpZiAoIXRoaXMudXRpbHMuY2xpY2tJc0hpZ2hsaWdodChldmVudCkpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnVuZm9jdXNBbm5vdGF0aW9uKCk7XG4gICAgICAgICAgICAgICAgdGhpcy5hbm5vdGF0aW9uU3RvcmVTZXJ2aWNlLnNldFRvb2xCYXJVcGRhdGUobnVsbCwgbnVsbCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLmNvbW1lbnRzQ29tcG9uZW50LmhhbmRsZUFubm90YXRpb25CbHVyKCk7XG5cbiAgICAgICAgICAgIGlmIChpc1BhZ2UpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnBkZlNlcnZpY2Uuc2V0UGFnZU51bWJlcih0aGlzLnV0aWxzLmdldENsaWNrZWRQYWdlKGV2ZW50KSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICByZW5kZXJDb21tZW50cygpIHtcbiAgICAgICAgdGhpcy51bmZvY3VzQW5ub3RhdGlvbigpO1xuICAgICAgICB0aGlzLmNvbW1lbnRzQ29tcG9uZW50LnNob3dBbGxDb21tZW50cygpO1xuICAgIH1cblxuICAgIHVuZm9jdXNBbm5vdGF0aW9uKCkge1xuICAgICAgICB0aGlzLmFubm90YXRpb25TdG9yZVNlcnZpY2Uuc2V0QW5ub3RhdGlvbkZvY3VzU3ViamVjdChuZXcgQW5ub3RhdGlvbigpKTtcbiAgICAgICAgdGhpcy5hbm5vdGF0aW9uU3RvcmVTZXJ2aWNlLnNldENvbW1lbnRCdG5TdWJqZWN0KG51bGwpO1xuICAgICAgICB0aGlzLmFubm90YXRpb25TdG9yZVNlcnZpY2Uuc2V0Q29tbWVudEZvY3VzU3ViamVjdChuZXcgQW5ub3RhdGlvbigpLCBudWxsKTtcbiAgICB9XG5cbiAgICBoYW5kbGVBbm5vdGF0aW9uQ2xpY2soZXZlbnQpIHtcbiAgICAgICAgaWYgKCF0aGlzLmNvbnRleHR1YWxUb29sYmFyLmlzU2hvd1Rvb2xiYXIpIHtcbiAgICAgICAgICAgIGNvbnN0IGFubm90YXRpb25JZCA9IGV2ZW50LmdldEF0dHJpYnV0ZSgnZGF0YS1wZGYtYW5ub3RhdGUtaWQnKTtcbiAgICAgICAgICAgIHRoaXMuYW5ub3RhdGlvblN0b3JlU2VydmljZS5nZXRBbm5vdGF0aW9uQnlJZChhbm5vdGF0aW9uSWQpXG4gICAgICAgICAgICAgICAgLnRoZW4oKGFubm90YXRpb246IEFubm90YXRpb24pID0+IHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5hbm5vdGF0aW9uU3RvcmVTZXJ2aWNlLnNldEFubm90YXRpb25Gb2N1c1N1YmplY3QoYW5ub3RhdGlvbik7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYW5ub3RhdGlvblN0b3JlU2VydmljZS5zZXRDb21tZW50Rm9jdXNTdWJqZWN0KGFubm90YXRpb24pO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmFubm90YXRpb25TdG9yZVNlcnZpY2Uuc2V0VG9vbEJhclVwZGF0ZShhbm5vdGF0aW9uLCB0cnVlKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGZvY3VzSGlnaGxpZ2h0U3R5bGUoZm9jdXNlZEFubm90YXRpb246IEFubm90YXRpb24pIHtcbiAgICAgICAgQXJyYXkuZnJvbSh0aGlzLnZpZXdlckVsZW1lbnRSZWYubmF0aXZlRWxlbWVudC5xdWVyeVNlbGVjdG9yKGAjcGFnZUNvbnRhaW5lciR7dGhpcy5wYWdlfSAuYW5ub3RhdGlvbkxheWVyYCkuY2hpbGROb2RlcylcbiAgICAgICAgICAgIC5mb3JFYWNoKChhbm5vdGF0aW9uRG9tOiBIVE1MSW5wdXRFbGVtZW50KSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKGFubm90YXRpb25Eb20uZGF0YXNldC5wZGZBbm5vdGF0ZUlkID09PSBmb2N1c2VkQW5ub3RhdGlvbi5pZCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnJlbmRlcmVyLmFkZENsYXNzKGFubm90YXRpb25Eb20sICdjb21tZW50LXNlbGVjdGVkJyk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5yZW5kZXJlci5yZW1vdmVDbGFzcyhhbm5vdGF0aW9uRG9tLCAnY29tbWVudC1zZWxlY3RlZCcpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICBpZiAoIXRoaXMucmVmWydkZXN0cm95ZWQnXSkge1xuICAgICAgICAgICAgdGhpcy5yZWYuZGV0ZWN0Q2hhbmdlcygpO1xuICAgICAgICB9XG4gICAgfVxuXG59XG4iXX0=