UNPKG

@hmcts/annotation-ui-lib

Version:

PDF Viewer and ability to highlight text with and comment tracking

298 lines 32.1 kB
/** * @fileoverview added by tsickle * @suppress {checkTypes,extraRequire,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc */ import { v4 as uuid } from 'uuid'; import { Injectable, Inject } from '@angular/core'; import { Subject } from 'rxjs'; import { Annotation, Comment } from './annotation-set.model'; import { Utils } from './utils'; import { WINDOW } from '@ng-toolkit/universal'; import { EmLoggerService } from '../logging/em-logger.service'; export class PdfAdapter { /** * @param {?} log * @param {?} utils * @param {?} window */ constructor(log, utils, window) { this.log = log; this.utils = utils; this.window = window; this.annotationChangeSubject = new Subject(); log.setClass('PdfAdapter'); } /** * @return {?} */ getAnnotationChangeSubject() { return this.annotationChangeSubject; } /** * @param {?} annotationSet * @return {?} */ setStoreData(annotationSet) { this.annotationSet = annotationSet; this.annotations = annotationSet.annotations; this.commentData = []; this.annotations.forEach((annotation) => { annotation.comments.forEach((comment) => { this.commentData.push(comment); }); }); this.annotationSetId = annotationSet.id; } /** * @param {?} comment * @return {?} */ editComment(comment) { this.annotations.forEach((annotation) => { annotation.comments .filter(storeComment => storeComment.id === comment.id) .map(storeComment => { this.log.info('Editing comment:' + comment.id); storeComment.content = comment.content; this.annotationChangeSubject.next({ 'type': 'editComment', 'annotation': annotation }); }); }); } /** * @param {?} documentId * @param {?} comment * @return {?} */ updateComments(documentId, comment) { this.commentData.push(comment); } /** * @param {?} documentId * @return {?} */ _getAnnotations(documentId) { return this.annotations || []; } /** * @param {?} documentId * @return {?} */ _getComments(documentId) { return this.commentData || []; } /** * @return {?} */ clearSelection() { /** @type {?} */ const sel = this.window.getSelection(); if (sel) { if (sel.removeAllRanges) { sel.removeAllRanges(); } else if (sel.empty) { sel.empty(); } } } /** * @param {?} comment * @return {?} */ isDraftComment(comment) { return (comment.content === null || comment.content === ''); } /** * @return {?} */ getStoreAdapter() { /** @type {?} */ const getAnnotations = (documentId, pageNumber) => { return new Promise((resolve, reject) => { /** @type {?} */ const annotations = this._getAnnotations(documentId).filter(function (i) { return i.page === pageNumber; }); resolve({ documentId: documentId, pageNumber: pageNumber, annotations: annotations }); }); }; /** @type {?} */ const getComments = (documentId, annotationId) => { return new Promise((resolve, reject) => { resolve(this._getComments(documentId).filter(function (i) { return i.annotationId === annotationId; })); }); }; /** @type {?} */ const getAnnotation = (documentId, annotationId) => { return new Promise((resolve, reject) => { /** @type {?} */ const annotation = this._getAnnotations(documentId).find(function (i) { return i.id === annotationId; }); resolve(annotation); }); }; /** @type {?} */ const addAnnotation = (documentId, pageNumber, annotation) => { return new Promise((resolve, reject) => { this.clearSelection(); /** @type {?} */ const persistAnnotation = new Annotation(); persistAnnotation.id = uuid(); persistAnnotation.page = pageNumber; persistAnnotation.color = annotation.color; persistAnnotation.type = annotation.type; persistAnnotation.comments = []; persistAnnotation.annotationSetId = this.annotationSetId; /** @type {?} */ const rectangles = []; this.log.info('Generating efficient rectangles for new annotation:' + persistAnnotation.id); this.utils.generateRectanglePerLine(annotation.rectangles, rectangles); rectangles.forEach((rectangle) => { rectangle.id = uuid(); }); persistAnnotation.rectangles = rectangles; /** @type {?} */ const annotations = this._getAnnotations(documentId); annotations.push(persistAnnotation); this.log.info('Added annotation:' + annotation.id); this.annotationChangeSubject.next({ 'type': 'addAnnotation', 'annotation': persistAnnotation }); resolve(persistAnnotation); }); }; /** @type {?} */ const deleteAnnotation = (documentId, annotationId) => { return new Promise((resolve, reject) => { /** @type {?} */ const annotation = this.findById(this.annotations, annotationId); this.remove(this.annotations, annotationId); this.log.info('Deleted annotation:' + annotationId); this.annotationChangeSubject.next({ 'type': 'deleteAnnotation', 'annotation': annotation }); resolve(this.annotations); }); }; /** @type {?} */ const addComment = (documentId, annotationId, content) => { return new Promise((resolve, reject) => { /** @type {?} */ const comment = new Comment(uuid(), annotationId, null, null, new Date(), null, null, null, content); this.updateComments(documentId, comment); /** @type {?} */ const annotation = this.findById(this.annotations, annotationId); this.log.info('Comment:' + comment.id + ' has been added to annotation:' + annotationId); annotation.comments.push(comment); if (this.isDraftComment(comment)) { this.log.info('Removing comment box because no content exists'); resolve(comment); } else { this.log.info('Add comment:' + comment.id + '-' + 'annotationId:' + annotation.id); this.annotationChangeSubject.next({ 'type': 'addComment', 'annotation': annotation }); resolve(comment); } }); }; /** @type {?} */ const deleteComment = (documentId, commentId) => { return new Promise((resolve, reject) => { /** @type {?} */ const comment = this.findById(this.commentData, commentId); /** @type {?} */ const annotation = this.findById(this.annotations, comment.annotationId); this.remove(this.commentData, commentId); this.remove(annotation.comments, commentId); if (this.isDraftComment(comment)) { this.log.info('Removing comment box because no content exists'); resolve(comment); } else { this.log.info('Deleted comment:' + commentId + '-' + 'annotationId:' + annotation.id); this.annotationChangeSubject.next({ 'type': 'deleteComment', 'annotation': annotation }); resolve(this.annotations); } }); }; // Unused /** @type {?} */ const editAnnotation = (documentId, pageNumber, annotation) => { return new Promise((resolve, reject) => { this.annotationChangeSubject.next({ 'type': 'editAnnotation', 'annotation': annotation }); resolve(this.commentData); }); }; return { getAnnotations, getComments, getAnnotation, addAnnotation, editAnnotation, deleteAnnotation, addComment, deleteComment }; } /** * @param {?} array * @param {?} id * @return {?} */ findById(array, id) { return array.find(e => e.id === id); } /** * @param {?} array * @param {?} id * @return {?} */ remove(array, id) { return array.splice(array.findIndex(e => e.id === id), 1); } } PdfAdapter.decorators = [ { type: Injectable } ]; PdfAdapter.ctorParameters = () => [ { type: EmLoggerService }, { type: Utils }, { type: undefined, decorators: [{ type: Inject, args: [WINDOW,] }] } ]; if (false) { /** @type {?} */ PdfAdapter.prototype.annotationSet; /** @type {?} */ PdfAdapter.prototype.annotations; /** * @type {?} * @private */ PdfAdapter.prototype.commentData; /** @type {?} */ PdfAdapter.prototype.annotationSetId; /** * @type {?} * @private */ PdfAdapter.prototype.annotationChangeSubject; /** * @type {?} * @private */ PdfAdapter.prototype.log; /** * @type {?} * @private */ PdfAdapter.prototype.utils; /** * @type {?} * @private */ PdfAdapter.prototype.window; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGRmLWFkYXB0ZXIuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9AaG1jdHMvYW5ub3RhdGlvbi11aS1saWIvIiwic291cmNlcyI6WyJsaWIvZGF0YS9wZGYtYWRhcHRlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7O0FBQUEsT0FBTyxFQUFDLEVBQUUsSUFBSSxJQUFJLEVBQUMsTUFBTSxNQUFNLENBQUM7QUFDaEMsT0FBTyxFQUFDLFVBQVUsRUFBRSxNQUFNLEVBQUMsTUFBTSxlQUFlLENBQUM7QUFDakQsT0FBTyxFQUFDLE9BQU8sRUFBQyxNQUFNLE1BQU0sQ0FBQztBQUM3QixPQUFPLEVBQUMsVUFBVSxFQUFpQixPQUFPLEVBQVksTUFBTSx3QkFBd0IsQ0FBQztBQUNyRixPQUFPLEVBQUMsS0FBSyxFQUFDLE1BQU0sU0FBUyxDQUFDO0FBQzlCLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUMvQyxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sOEJBQThCLENBQUM7QUFHL0QsTUFBTTs7Ozs7O0lBT0YsWUFBb0IsR0FBb0IsRUFDcEIsS0FBWSxFQUNJLE1BQU07UUFGdEIsUUFBRyxHQUFILEdBQUcsQ0FBaUI7UUFDcEIsVUFBSyxHQUFMLEtBQUssQ0FBTztRQUNJLFdBQU0sR0FBTixNQUFNLENBQUE7UUFDdEMsSUFBSSxDQUFDLHVCQUF1QixHQUFHLElBQUksT0FBTyxFQUE0QyxDQUFDO1FBQ3ZGLEdBQUcsQ0FBQyxRQUFRLENBQUMsWUFBWSxDQUFDLENBQUM7SUFDL0IsQ0FBQzs7OztJQUVELDBCQUEwQjtRQUN0QixNQUFNLENBQUMsSUFBSSxDQUFDLHVCQUF1QixDQUFDO0lBQ3hDLENBQUM7Ozs7O0lBRUQsWUFBWSxDQUFDLGFBQTRCO1FBQ3JDLElBQUksQ0FBQyxhQUFhLEdBQUcsYUFBYSxDQUFDO1FBQ25DLElBQUksQ0FBQyxXQUFXLEdBQUcsYUFBYSxDQUFDLFdBQVcsQ0FBQztRQUM3QyxJQUFJLENBQUMsV0FBVyxHQUFHLEVBQUUsQ0FBQztRQUN0QixJQUFJLENBQUMsV0FBVyxDQUFDLE9BQU8sQ0FBQyxDQUFDLFVBQXNCLEVBQUUsRUFBRTtZQUNoRCxVQUFVLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxDQUFDLE9BQWdCLEVBQUUsRUFBRTtnQkFDN0MsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7WUFDbkMsQ0FBQyxDQUFDLENBQUM7UUFDUCxDQUFDLENBQUMsQ0FBQztRQUNILElBQUksQ0FBQyxlQUFlLEdBQUcsYUFBYSxDQUFDLEVBQUUsQ0FBQztJQUM1QyxDQUFDOzs7OztJQUVELFdBQVcsQ0FBQyxPQUFnQjtRQUN4QixJQUFJLENBQUMsV0FBVyxDQUFDLE9BQU8sQ0FBQyxDQUFDLFVBQXNCLEVBQUUsRUFBRTtZQUNoRCxVQUFVLENBQUMsUUFBUTtpQkFDZCxNQUFNLENBQUMsWUFBWSxDQUFDLEVBQUUsQ0FBQyxZQUFZLENBQUMsRUFBRSxLQUFLLE9BQU8sQ0FBQyxFQUFFLENBQUM7aUJBQ3RELEdBQUcsQ0FBQyxZQUFZLENBQUMsRUFBRTtnQkFDaEIsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsa0JBQWtCLEdBQUcsT0FBTyxDQUFDLEVBQUUsQ0FBQyxDQUFDO2dCQUMvQyxZQUFZLENBQUMsT0FBTyxHQUFHLE9BQU8sQ0FBQyxPQUFPLENBQUM7Z0JBQ3ZDLElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxJQUFJLENBQUMsRUFBQyxNQUFNLEVBQUUsYUFBYSxFQUFFLFlBQVksRUFBRSxVQUFVLEVBQUMsQ0FBQyxDQUFDO1lBQ3pGLENBQUMsQ0FBQyxDQUFDO1FBQ1gsQ0FBQyxDQUFDLENBQUM7SUFDUCxDQUFDOzs7Ozs7SUFFRCxjQUFjLENBQUMsVUFBVSxFQUFFLE9BQU87UUFDOUIsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDbkMsQ0FBQzs7Ozs7SUFFRCxlQUFlLENBQUMsVUFBVTtRQUN0QixNQUFNLENBQUMsSUFBSSxDQUFDLFdBQVcsSUFBSSxFQUFFLENBQUM7SUFDbEMsQ0FBQzs7Ozs7SUFFRCxZQUFZLENBQUMsVUFBVTtRQUNuQixNQUFNLENBQUMsSUFBSSxDQUFDLFdBQVcsSUFBSSxFQUFFLENBQUM7SUFDbEMsQ0FBQzs7OztJQUVELGNBQWM7O2NBQ0osR0FBRyxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsWUFBWSxFQUFFO1FBQ3RDLEVBQUUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7WUFDTixFQUFFLENBQUMsQ0FBQyxHQUFHLENBQUMsZUFBZSxDQUFDLENBQUMsQ0FBQztnQkFDdEIsR0FBRyxDQUFDLGVBQWUsRUFBRSxDQUFDO1lBQzFCLENBQUM7WUFBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7Z0JBQ25CLEdBQUcsQ0FBQyxLQUFLLEVBQUUsQ0FBQztZQUNoQixDQUFDO1FBQ0wsQ0FBQztJQUNMLENBQUM7Ozs7O0lBRUQsY0FBYyxDQUFDLE9BQWdCO1FBQzNCLE1BQU0sQ0FBQyxDQUFDLE9BQU8sQ0FBQyxPQUFPLEtBQUssSUFBSSxJQUFJLE9BQU8sQ0FBQyxPQUFPLEtBQUssRUFBRSxDQUFDLENBQUM7SUFDaEUsQ0FBQzs7OztJQUVELGVBQWU7O2NBQ0wsY0FBYyxHQUFHLENBQUMsVUFBVSxFQUFFLFVBQVUsRUFBRSxFQUFFO1lBQzlDLE1BQU0sQ0FBQyxJQUFJLE9BQU8sQ0FBQyxDQUFDLE9BQU8sRUFBRSxNQUFNLEVBQUUsRUFBRTs7c0JBQzdCLFdBQVcsR0FBRyxJQUFJLENBQUMsZUFBZSxDQUFDLFVBQVUsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUM7b0JBQ25FLE1BQU0sQ0FBQyxDQUFDLENBQUMsSUFBSSxLQUFLLFVBQVUsQ0FBQztnQkFDakMsQ0FBQyxDQUFDO2dCQUNGLE9BQU8sQ0FBQztvQkFDSixVQUFVLEVBQUUsVUFBVTtvQkFDdEIsVUFBVSxFQUFFLFVBQVU7b0JBQ3RCLFdBQVcsRUFBRSxXQUFXO2lCQUMzQixDQUFDLENBQUM7WUFDUCxDQUFDLENBQUMsQ0FBQztRQUNQLENBQUM7O2NBRUssV0FBVyxHQUFHLENBQUMsVUFBVSxFQUFFLFlBQVksRUFBRSxFQUFFO1lBQzdDLE1BQU0sQ0FBQyxJQUFJLE9BQU8sQ0FBQyxDQUFDLE9BQU8sRUFBRSxNQUFNLEVBQUUsRUFBRTtnQkFDbkMsT0FBTyxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsVUFBVSxDQUFDLENBQUMsTUFBTSxDQUFDLFVBQVUsQ0FBQztvQkFDcEQsTUFBTSxDQUFDLENBQUMsQ0FBQyxZQUFZLEtBQUssWUFBWSxDQUFDO2dCQUMzQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ1IsQ0FBQyxDQUFDLENBQUM7UUFDUCxDQUFDOztjQUVLLGFBQWEsR0FBRyxDQUFDLFVBQVUsRUFBRSxZQUFZLEVBQUUsRUFBRTtZQUMvQyxNQUFNLENBQUMsSUFBSSxPQUFPLENBQUMsQ0FBQyxPQUFPLEVBQUUsTUFBTSxFQUFFLEVBQUU7O3NCQUM3QixVQUFVLEdBQUcsSUFBSSxDQUFDLGVBQWUsQ0FBQyxVQUFVLENBQUMsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDO29CQUNoRSxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsS0FBSyxZQUFZLENBQUM7Z0JBQ2pDLENBQUMsQ0FBQztnQkFDRixPQUFPLENBQUMsVUFBVSxDQUFDLENBQUM7WUFDeEIsQ0FBQyxDQUFDLENBQUM7UUFDUCxDQUFDOztjQUVLLGFBQWEsR0FBRyxDQUFDLFVBQVUsRUFBRSxVQUFVLEVBQUUsVUFBVSxFQUFFLEVBQUU7WUFDekQsTUFBTSxDQUFDLElBQUksT0FBTyxDQUFDLENBQUMsT0FBTyxFQUFFLE1BQU0sRUFBRSxFQUFFO2dCQUVuQyxJQUFJLENBQUMsY0FBYyxFQUFFLENBQUM7O3NCQUNoQixpQkFBaUIsR0FBRyxJQUFJLFVBQVUsRUFBRTtnQkFDMUMsaUJBQWlCLENBQUMsRUFBRSxHQUFHLElBQUksRUFBRSxDQUFDO2dCQUM5QixpQkFBaUIsQ0FBQyxJQUFJLEdBQUcsVUFBVSxDQUFDO2dCQUNwQyxpQkFBaUIsQ0FBQyxLQUFLLEdBQUcsVUFBVSxDQUFDLEtBQUssQ0FBQztnQkFDM0MsaUJBQWlCLENBQUMsSUFBSSxHQUFHLFVBQVUsQ0FBQyxJQUFJLENBQUM7Z0JBQ3pDLGlCQUFpQixDQUFDLFFBQVEsR0FBRyxFQUFFLENBQUM7Z0JBQ2hDLGlCQUFpQixDQUFDLGVBQWUsR0FBRyxJQUFJLENBQUMsZUFBZSxDQUFDOztzQkFFbkQsVUFBVSxHQUFHLEVBQUU7Z0JBQ3JCLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLHFEQUFxRCxHQUFHLGlCQUFpQixDQUFDLEVBQUUsQ0FBQyxDQUFDO2dCQUM1RixJQUFJLENBQUMsS0FBSyxDQUFDLHdCQUF3QixDQUFDLFVBQVUsQ0FBQyxVQUFVLEVBQUUsVUFBVSxDQUFDLENBQUM7Z0JBRXZFLFVBQVUsQ0FBQyxPQUFPLENBQ2QsQ0FBQyxTQUFvQixFQUFFLEVBQUU7b0JBQ3JCLFNBQVMsQ0FBQyxFQUFFLEdBQUcsSUFBSSxFQUFFLENBQUM7Z0JBQzFCLENBQUMsQ0FBQyxDQUFDO2dCQUVQLGlCQUFpQixDQUFDLFVBQVUsR0FBRyxVQUFVLENBQUM7O3NCQUVwQyxXQUFXLEdBQUcsSUFBSSxDQUFDLGVBQWUsQ0FBQyxVQUFVLENBQUM7Z0JBQ3BELFdBQVcsQ0FBQyxJQUFJLENBQUMsaUJBQWlCLENBQUMsQ0FBQztnQkFDcEMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsbUJBQW1CLEdBQUcsVUFBVSxDQUFDLEVBQUUsQ0FBQyxDQUFDO2dCQUNuRCxJQUFJLENBQUMsdUJBQXVCLENBQUMsSUFBSSxDQUFDLEVBQUMsTUFBTSxFQUFFLGVBQWUsRUFBRSxZQUFZLEVBQUUsaUJBQWlCLEVBQUMsQ0FBQyxDQUFDO2dCQUM5RixPQUFPLENBQUMsaUJBQWlCLENBQUMsQ0FBQztZQUMvQixDQUFDLENBQUMsQ0FBQztRQUNQLENBQUM7O2NBRUssZ0JBQWdCLEdBQUcsQ0FBQyxVQUFVLEVBQUUsWUFBWSxFQUFFLEVBQUU7WUFDbEQsTUFBTSxDQUFDLElBQUksT0FBTyxDQUFDLENBQUMsT0FBTyxFQUFFLE1BQU0sRUFBRSxFQUFFOztzQkFDN0IsVUFBVSxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLFdBQVcsRUFBRSxZQUFZLENBQUM7Z0JBQ2hFLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLFdBQVcsRUFBRSxZQUFZLENBQUMsQ0FBQztnQkFDNUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMscUJBQXFCLEdBQUcsWUFBWSxDQUFDLENBQUM7Z0JBQ3BELElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxJQUFJLENBQUMsRUFBQyxNQUFNLEVBQUUsa0JBQWtCLEVBQUUsWUFBWSxFQUFFLFVBQVUsRUFBQyxDQUFDLENBQUM7Z0JBQzFGLE9BQU8sQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUM7WUFDOUIsQ0FBQyxDQUFDLENBQUM7UUFDUCxDQUFDOztjQUVLLFVBQVUsR0FBRyxDQUFDLFVBQVUsRUFBRSxZQUFZLEVBQUUsT0FBTyxFQUFFLEVBQUU7WUFDckQsTUFBTSxDQUFDLElBQUksT0FBTyxDQUFDLENBQUMsT0FBTyxFQUFFLE1BQU0sRUFBRSxFQUFFOztzQkFDN0IsT0FBTyxHQUFHLElBQUksT0FBTyxDQUN2QixJQUFJLEVBQUUsRUFDTixZQUFZLEVBQ1osSUFBSSxFQUNKLElBQUksRUFDSixJQUFJLElBQUksRUFBRSxFQUNWLElBQUksRUFDSixJQUFJLEVBQ0osSUFBSSxFQUNKLE9BQU8sQ0FDVjtnQkFDRCxJQUFJLENBQUMsY0FBYyxDQUFDLFVBQVUsRUFBRSxPQUFPLENBQUMsQ0FBQzs7c0JBQ25DLFVBQVUsR0FBZSxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxXQUFXLEVBQUUsWUFBWSxDQUFDO2dCQUM1RSxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxVQUFVLEdBQUcsT0FBTyxDQUFDLEVBQUUsR0FBRyxnQ0FBZ0MsR0FBRyxZQUFZLENBQUMsQ0FBQztnQkFDekYsVUFBVSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7Z0JBRWxDLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDO29CQUMvQixJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxnREFBZ0QsQ0FBQyxDQUFDO29CQUNoRSxPQUFPLENBQUMsT0FBTyxDQUFDLENBQUM7Z0JBQ3JCLENBQUM7Z0JBQUMsSUFBSSxDQUFDLENBQUM7b0JBQ0osSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsY0FBYyxHQUFHLE9BQU8sQ0FBQyxFQUFFLEdBQUcsR0FBRyxHQUFHLGVBQWUsR0FBRyxVQUFVLENBQUMsRUFBRSxDQUFDLENBQUM7b0JBQ25GLElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxJQUFJLENBQUMsRUFBQyxNQUFNLEVBQUUsWUFBWSxFQUFFLFlBQVksRUFBRSxVQUFVLEVBQUMsQ0FBQyxDQUFDO29CQUNwRixPQUFPLENBQUMsT0FBTyxDQUFDLENBQUM7Z0JBQ3JCLENBQUM7WUFDTCxDQUFDLENBQUMsQ0FBQztRQUNQLENBQUM7O2NBRUssYUFBYSxHQUFHLENBQUMsVUFBVSxFQUFFLFNBQVMsRUFBRSxFQUFFO1lBQzVDLE1BQU0sQ0FBQyxJQUFJLE9BQU8sQ0FBQyxDQUFDLE9BQU8sRUFBRSxNQUFNLEVBQUUsRUFBRTs7c0JBQzdCLE9BQU8sR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxXQUFXLEVBQUUsU0FBUyxDQUFDOztzQkFDcEQsVUFBVSxHQUFlLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLFdBQVcsRUFBRSxPQUFPLENBQUMsWUFBWSxDQUFDO2dCQUNwRixJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxXQUFXLEVBQUUsU0FBUyxDQUFDLENBQUM7Z0JBQ3pDLElBQUksQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDLFFBQVEsRUFBRSxTQUFTLENBQUMsQ0FBQztnQkFFNUMsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUM7b0JBQy9CLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLGdEQUFnRCxDQUFDLENBQUM7b0JBQ2hFLE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FBQztnQkFDckIsQ0FBQztnQkFBQyxJQUFJLENBQUMsQ0FBQztvQkFDSixJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxrQkFBa0IsR0FBRyxTQUFTLEdBQUcsR0FBRyxHQUFHLGVBQWUsR0FBRyxVQUFVLENBQUMsRUFBRSxDQUFDLENBQUM7b0JBQ3RGLElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxJQUFJLENBQUMsRUFBQyxNQUFNLEVBQUUsZUFBZSxFQUFFLFlBQVksRUFBRSxVQUFVLEVBQUMsQ0FBQyxDQUFDO29CQUN2RixPQUFPLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDO2dCQUM5QixDQUFDO1lBQ0wsQ0FBQyxDQUFDLENBQUM7UUFDUCxDQUFDOzs7Y0FHSyxjQUFjLEdBQUcsQ0FBQyxVQUFVLEVBQUUsVUFBVSxFQUFFLFVBQVUsRUFBRSxFQUFFO1lBQzFELE1BQU0sQ0FBQyxJQUFJLE9BQU8sQ0FBQyxDQUFDLE9BQU8sRUFBRSxNQUFNLEVBQUUsRUFBRTtnQkFDbkMsSUFBSSxDQUFDLHVCQUF1QixDQUFDLElBQUksQ0FBQyxFQUFDLE1BQU0sRUFBRSxnQkFBZ0IsRUFBRSxZQUFZLEVBQUUsVUFBVSxFQUFDLENBQUMsQ0FBQztnQkFDeEYsT0FBTyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQztZQUM5QixDQUFDLENBQUMsQ0FBQztRQUNQLENBQUM7UUFFRCxNQUFNLENBQUM7WUFDSCxjQUFjO1lBQ2QsV0FBVztZQUNYLGFBQWE7WUFDYixhQUFhO1lBQ2IsY0FBYztZQUNkLGdCQUFnQjtZQUNoQixVQUFVO1lBQ1YsYUFBYTtTQUNoQixDQUFDO0lBQ04sQ0FBQzs7Ozs7O0lBRUQsUUFBUSxDQUFDLEtBQUssRUFBRSxFQUFFO1FBQ2QsTUFBTSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFDO0lBQ3hDLENBQUM7Ozs7OztJQUVELE1BQU0sQ0FBQyxLQUFLLEVBQUUsRUFBRTtRQUNaLE1BQU0sQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxLQUFLLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQzlELENBQUM7OztZQXZOSixVQUFVOzs7WUFGRixlQUFlO1lBRmhCLEtBQUs7NENBY0ksTUFBTSxTQUFDLE1BQU07Ozs7SUFSMUIsbUNBQTZCOztJQUM3QixpQ0FBMEI7Ozs7O0lBQzFCLGlDQUErQjs7SUFDL0IscUNBQXdCOzs7OztJQUN4Qiw2Q0FBbUY7Ozs7O0lBRXZFLHlCQUE0Qjs7Ozs7SUFDNUIsMkJBQW9COzs7OztJQUNwQiw0QkFBOEIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge3Y0IGFzIHV1aWR9IGZyb20gJ3V1aWQnO1xuaW1wb3J0IHtJbmplY3RhYmxlLCBJbmplY3R9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHtTdWJqZWN0fSBmcm9tICdyeGpzJztcbmltcG9ydCB7QW5ub3RhdGlvbiwgQW5ub3RhdGlvblNldCwgQ29tbWVudCwgUmVjdGFuZ2xlfSBmcm9tICcuL2Fubm90YXRpb24tc2V0Lm1vZGVsJztcbmltcG9ydCB7VXRpbHN9IGZyb20gJy4vdXRpbHMnO1xuaW1wb3J0IHsgV0lORE9XIH0gZnJvbSAnQG5nLXRvb2xraXQvdW5pdmVyc2FsJztcbmltcG9ydCB7IEVtTG9nZ2VyU2VydmljZSB9IGZyb20gJy4uL2xvZ2dpbmcvZW0tbG9nZ2VyLnNlcnZpY2UnO1xuXG5ASW5qZWN0YWJsZSgpXG5leHBvcnQgY2xhc3MgUGRmQWRhcHRlciB7XG4gICAgYW5ub3RhdGlvblNldDogQW5ub3RhdGlvblNldDtcbiAgICBhbm5vdGF0aW9uczogQW5ub3RhdGlvbltdO1xuICAgIHByaXZhdGUgY29tbWVudERhdGE6IENvbW1lbnRbXTtcbiAgICBhbm5vdGF0aW9uU2V0SWQ6IHN0cmluZztcbiAgICBwcml2YXRlIGFubm90YXRpb25DaGFuZ2VTdWJqZWN0OiBTdWJqZWN0PHsgdHlwZTogc3RyaW5nLCBhbm5vdGF0aW9uOiBBbm5vdGF0aW9uIH0+O1xuXG4gICAgY29uc3RydWN0b3IocHJpdmF0ZSBsb2c6IEVtTG9nZ2VyU2VydmljZSxcbiAgICAgICAgICAgICAgICBwcml2YXRlIHV0aWxzOiBVdGlscyxcbiAgICAgICAgICAgICAgICBASW5qZWN0KFdJTkRPVykgcHJpdmF0ZSB3aW5kb3cpIHtcbiAgICAgICAgdGhpcy5hbm5vdGF0aW9uQ2hhbmdlU3ViamVjdCA9IG5ldyBTdWJqZWN0PHsgdHlwZTogc3RyaW5nLCBhbm5vdGF0aW9uOiBBbm5vdGF0aW9uIH0+KCk7XG4gICAgICAgIGxvZy5zZXRDbGFzcygnUGRmQWRhcHRlcicpO1xuICAgIH1cblxuICAgIGdldEFubm90YXRpb25DaGFuZ2VTdWJqZWN0KCk6IFN1YmplY3Q8eyB0eXBlOiBzdHJpbmcsIGFubm90YXRpb246IEFubm90YXRpb24gfT4ge1xuICAgICAgICByZXR1cm4gdGhpcy5hbm5vdGF0aW9uQ2hhbmdlU3ViamVjdDtcbiAgICB9XG5cbiAgICBzZXRTdG9yZURhdGEoYW5ub3RhdGlvblNldDogQW5ub3RhdGlvblNldCkge1xuICAgICAgICB0aGlzLmFubm90YXRpb25TZXQgPSBhbm5vdGF0aW9uU2V0O1xuICAgICAgICB0aGlzLmFubm90YXRpb25zID0gYW5ub3RhdGlvblNldC5hbm5vdGF0aW9ucztcbiAgICAgICAgdGhpcy5jb21tZW50RGF0YSA9IFtdO1xuICAgICAgICB0aGlzLmFubm90YXRpb25zLmZvckVhY2goKGFubm90YXRpb246IEFubm90YXRpb24pID0+IHtcbiAgICAgICAgICAgIGFubm90YXRpb24uY29tbWVudHMuZm9yRWFjaCgoY29tbWVudDogQ29tbWVudCkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuY29tbWVudERhdGEucHVzaChjb21tZW50KTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5hbm5vdGF0aW9uU2V0SWQgPSBhbm5vdGF0aW9uU2V0LmlkO1xuICAgIH1cblxuICAgIGVkaXRDb21tZW50KGNvbW1lbnQ6IENvbW1lbnQpIHtcbiAgICAgICAgdGhpcy5hbm5vdGF0aW9ucy5mb3JFYWNoKChhbm5vdGF0aW9uOiBBbm5vdGF0aW9uKSA9PiB7XG4gICAgICAgICAgICBhbm5vdGF0aW9uLmNvbW1lbnRzXG4gICAgICAgICAgICAgICAgLmZpbHRlcihzdG9yZUNvbW1lbnQgPT4gc3RvcmVDb21tZW50LmlkID09PSBjb21tZW50LmlkKVxuICAgICAgICAgICAgICAgIC5tYXAoc3RvcmVDb21tZW50ID0+IHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5sb2cuaW5mbygnRWRpdGluZyBjb21tZW50OicgKyBjb21tZW50LmlkKTtcbiAgICAgICAgICAgICAgICAgICAgc3RvcmVDb21tZW50LmNvbnRlbnQgPSBjb21tZW50LmNvbnRlbnQ7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYW5ub3RhdGlvbkNoYW5nZVN1YmplY3QubmV4dCh7J3R5cGUnOiAnZWRpdENvbW1lbnQnLCAnYW5ub3RhdGlvbic6IGFubm90YXRpb259KTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgdXBkYXRlQ29tbWVudHMoZG9jdW1lbnRJZCwgY29tbWVudCkge1xuICAgICAgICB0aGlzLmNvbW1lbnREYXRhLnB1c2goY29tbWVudCk7XG4gICAgfVxuXG4gICAgX2dldEFubm90YXRpb25zKGRvY3VtZW50SWQpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuYW5ub3RhdGlvbnMgfHwgW107XG4gICAgfVxuXG4gICAgX2dldENvbW1lbnRzKGRvY3VtZW50SWQpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY29tbWVudERhdGEgfHwgW107XG4gICAgfVxuXG4gICAgY2xlYXJTZWxlY3Rpb24oKSB7XG4gICAgICAgIGNvbnN0IHNlbCA9IHRoaXMud2luZG93LmdldFNlbGVjdGlvbigpO1xuICAgICAgICBpZiAoc2VsKSB7XG4gICAgICAgICAgICBpZiAoc2VsLnJlbW92ZUFsbFJhbmdlcykge1xuICAgICAgICAgICAgICAgIHNlbC5yZW1vdmVBbGxSYW5nZXMoKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoc2VsLmVtcHR5KSB7XG4gICAgICAgICAgICAgICAgc2VsLmVtcHR5KCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBpc0RyYWZ0Q29tbWVudChjb21tZW50OiBDb21tZW50KTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiAoY29tbWVudC5jb250ZW50ID09PSBudWxsIHx8IGNvbW1lbnQuY29udGVudCA9PT0gJycpO1xuICAgIH1cblxuICAgIGdldFN0b3JlQWRhcHRlcigpIHtcbiAgICAgICAgY29uc3QgZ2V0QW5ub3RhdGlvbnMgPSAoZG9jdW1lbnRJZCwgcGFnZU51bWJlcikgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBhbm5vdGF0aW9ucyA9IHRoaXMuX2dldEFubm90YXRpb25zKGRvY3VtZW50SWQpLmZpbHRlcihmdW5jdGlvbiAoaSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gaS5wYWdlID09PSBwYWdlTnVtYmVyO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIHJlc29sdmUoe1xuICAgICAgICAgICAgICAgICAgICBkb2N1bWVudElkOiBkb2N1bWVudElkLFxuICAgICAgICAgICAgICAgICAgICBwYWdlTnVtYmVyOiBwYWdlTnVtYmVyLFxuICAgICAgICAgICAgICAgICAgICBhbm5vdGF0aW9uczogYW5ub3RhdGlvbnNcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9O1xuXG4gICAgICAgIGNvbnN0IGdldENvbW1lbnRzID0gKGRvY3VtZW50SWQsIGFubm90YXRpb25JZCkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgICAgICAgICByZXNvbHZlKHRoaXMuX2dldENvbW1lbnRzKGRvY3VtZW50SWQpLmZpbHRlcihmdW5jdGlvbiAoaSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gaS5hbm5vdGF0aW9uSWQgPT09IGFubm90YXRpb25JZDtcbiAgICAgICAgICAgICAgICB9KSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfTtcblxuICAgICAgICBjb25zdCBnZXRBbm5vdGF0aW9uID0gKGRvY3VtZW50SWQsIGFubm90YXRpb25JZCkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBhbm5vdGF0aW9uID0gdGhpcy5fZ2V0QW5ub3RhdGlvbnMoZG9jdW1lbnRJZCkuZmluZChmdW5jdGlvbiAoaSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gaS5pZCA9PT0gYW5ub3RhdGlvbklkO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIHJlc29sdmUoYW5ub3RhdGlvbik7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfTtcblxuICAgICAgICBjb25zdCBhZGRBbm5vdGF0aW9uID0gKGRvY3VtZW50SWQsIHBhZ2VOdW1iZXIsIGFubm90YXRpb24pID0+IHtcbiAgICAgICAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG5cbiAgICAgICAgICAgICAgICB0aGlzLmNsZWFyU2VsZWN0aW9uKCk7XG4gICAgICAgICAgICAgICAgY29uc3QgcGVyc2lzdEFubm90YXRpb24gPSBuZXcgQW5ub3RhdGlvbigpO1xuICAgICAgICAgICAgICAgIHBlcnNpc3RBbm5vdGF0aW9uLmlkID0gdXVpZCgpO1xuICAgICAgICAgICAgICAgIHBlcnNpc3RBbm5vdGF0aW9uLnBhZ2UgPSBwYWdlTnVtYmVyO1xuICAgICAgICAgICAgICAgIHBlcnNpc3RBbm5vdGF0aW9uLmNvbG9yID0gYW5ub3RhdGlvbi5jb2xvcjtcbiAgICAgICAgICAgICAgICBwZXJzaXN0QW5ub3RhdGlvbi50eXBlID0gYW5ub3RhdGlvbi50eXBlO1xuICAgICAgICAgICAgICAgIHBlcnNpc3RBbm5vdGF0aW9uLmNvbW1lbnRzID0gW107XG4gICAgICAgICAgICAgICAgcGVyc2lzdEFubm90YXRpb24uYW5ub3RhdGlvblNldElkID0gdGhpcy5hbm5vdGF0aW9uU2V0SWQ7XG5cbiAgICAgICAgICAgICAgICBjb25zdCByZWN0YW5nbGVzID0gW107XG4gICAgICAgICAgICAgICAgdGhpcy5sb2cuaW5mbygnR2VuZXJhdGluZyBlZmZpY2llbnQgcmVjdGFuZ2xlcyBmb3IgbmV3IGFubm90YXRpb246JyArIHBlcnNpc3RBbm5vdGF0aW9uLmlkKTtcbiAgICAgICAgICAgICAgICB0aGlzLnV0aWxzLmdlbmVyYXRlUmVjdGFuZ2xlUGVyTGluZShhbm5vdGF0aW9uLnJlY3RhbmdsZXMsIHJlY3RhbmdsZXMpO1xuXG4gICAgICAgICAgICAgICAgcmVjdGFuZ2xlcy5mb3JFYWNoKFxuICAgICAgICAgICAgICAgICAgICAocmVjdGFuZ2xlOiBSZWN0YW5nbGUpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlY3RhbmdsZS5pZCA9IHV1aWQoKTtcbiAgICAgICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgICBwZXJzaXN0QW5ub3RhdGlvbi5yZWN0YW5nbGVzID0gcmVjdGFuZ2xlcztcblxuICAgICAgICAgICAgICAgIGNvbnN0IGFubm90YXRpb25zID0gdGhpcy5fZ2V0QW5ub3RhdGlvbnMoZG9jdW1lbnRJZCk7XG4gICAgICAgICAgICAgICAgYW5ub3RhdGlvbnMucHVzaChwZXJzaXN0QW5ub3RhdGlvbik7XG4gICAgICAgICAgICAgICAgdGhpcy5sb2cuaW5mbygnQWRkZWQgYW5ub3RhdGlvbjonICsgYW5ub3RhdGlvbi5pZCk7XG4gICAgICAgICAgICAgICAgdGhpcy5hbm5vdGF0aW9uQ2hhbmdlU3ViamVjdC5uZXh0KHsndHlwZSc6ICdhZGRBbm5vdGF0aW9uJywgJ2Fubm90YXRpb24nOiBwZXJzaXN0QW5ub3RhdGlvbn0pO1xuICAgICAgICAgICAgICAgIHJlc29sdmUocGVyc2lzdEFubm90YXRpb24pO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH07XG5cbiAgICAgICAgY29uc3QgZGVsZXRlQW5ub3RhdGlvbiA9IChkb2N1bWVudElkLCBhbm5vdGF0aW9uSWQpID0+IHtcbiAgICAgICAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgYW5ub3RhdGlvbiA9IHRoaXMuZmluZEJ5SWQodGhpcy5hbm5vdGF0aW9ucywgYW5ub3RhdGlvbklkKTtcbiAgICAgICAgICAgICAgICB0aGlzLnJlbW92ZSh0aGlzLmFubm90YXRpb25zLCBhbm5vdGF0aW9uSWQpO1xuICAgICAgICAgICAgICAgIHRoaXMubG9nLmluZm8oJ0RlbGV0ZWQgYW5ub3RhdGlvbjonICsgYW5ub3RhdGlvbklkKTtcbiAgICAgICAgICAgICAgICB0aGlzLmFubm90YXRpb25DaGFuZ2VTdWJqZWN0Lm5leHQoeyd0eXBlJzogJ2RlbGV0ZUFubm90YXRpb24nLCAnYW5ub3RhdGlvbic6IGFubm90YXRpb259KTtcbiAgICAgICAgICAgICAgICByZXNvbHZlKHRoaXMuYW5ub3RhdGlvbnMpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH07XG5cbiAgICAgICAgY29uc3QgYWRkQ29tbWVudCA9IChkb2N1bWVudElkLCBhbm5vdGF0aW9uSWQsIGNvbnRlbnQpID0+IHtcbiAgICAgICAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgY29tbWVudCA9IG5ldyBDb21tZW50KFxuICAgICAgICAgICAgICAgICAgICB1dWlkKCksXG4gICAgICAgICAgICAgICAgICAgIGFubm90YXRpb25JZCxcbiAgICAgICAgICAgICAgICAgICAgbnVsbCxcbiAgICAgICAgICAgICAgICAgICAgbnVsbCxcbiAgICAgICAgICAgICAgICAgICAgbmV3IERhdGUoKSxcbiAgICAgICAgICAgICAgICAgICAgbnVsbCxcbiAgICAgICAgICAgICAgICAgICAgbnVsbCxcbiAgICAgICAgICAgICAgICAgICAgbnVsbCxcbiAgICAgICAgICAgICAgICAgICAgY29udGVudFxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgdGhpcy51cGRhdGVDb21tZW50cyhkb2N1bWVudElkLCBjb21tZW50KTtcbiAgICAgICAgICAgICAgICBjb25zdCBhbm5vdGF0aW9uOiBBbm5vdGF0aW9uID0gdGhpcy5maW5kQnlJZCh0aGlzLmFubm90YXRpb25zLCBhbm5vdGF0aW9uSWQpO1xuICAgICAgICAgICAgICAgIHRoaXMubG9nLmluZm8oJ0NvbW1lbnQ6JyArIGNvbW1lbnQuaWQgKyAnIGhhcyBiZWVuIGFkZGVkIHRvIGFubm90YXRpb246JyArIGFubm90YXRpb25JZCk7XG4gICAgICAgICAgICAgICAgYW5ub3RhdGlvbi5jb21tZW50cy5wdXNoKGNvbW1lbnQpO1xuXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuaXNEcmFmdENvbW1lbnQoY29tbWVudCkpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5sb2cuaW5mbygnUmVtb3ZpbmcgY29tbWVudCBib3ggYmVjYXVzZSBubyBjb250ZW50IGV4aXN0cycpO1xuICAgICAgICAgICAgICAgICAgICByZXNvbHZlKGNvbW1lbnQpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMubG9nLmluZm8oJ0FkZCBjb21tZW50OicgKyBjb21tZW50LmlkICsgJy0nICsgJ2Fubm90YXRpb25JZDonICsgYW5ub3RhdGlvbi5pZCk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYW5ub3RhdGlvbkNoYW5nZVN1YmplY3QubmV4dCh7J3R5cGUnOiAnYWRkQ29tbWVudCcsICdhbm5vdGF0aW9uJzogYW5ub3RhdGlvbn0pO1xuICAgICAgICAgICAgICAgICAgICByZXNvbHZlKGNvbW1lbnQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9O1xuXG4gICAgICAgIGNvbnN0IGRlbGV0ZUNvbW1lbnQgPSAoZG9jdW1lbnRJZCwgY29tbWVudElkKSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IGNvbW1lbnQgPSB0aGlzLmZpbmRCeUlkKHRoaXMuY29tbWVudERhdGEsIGNvbW1lbnRJZCk7XG4gICAgICAgICAgICAgICAgY29uc3QgYW5ub3RhdGlvbjogQW5ub3RhdGlvbiA9IHRoaXMuZmluZEJ5SWQodGhpcy5hbm5vdGF0aW9ucywgY29tbWVudC5hbm5vdGF0aW9uSWQpO1xuICAgICAgICAgICAgICAgIHRoaXMucmVtb3ZlKHRoaXMuY29tbWVudERhdGEsIGNvbW1lbnRJZCk7XG4gICAgICAgICAgICAgICAgdGhpcy5yZW1vdmUoYW5ub3RhdGlvbi5jb21tZW50cywgY29tbWVudElkKTtcblxuICAgICAgICAgICAgICAgIGlmICh0aGlzLmlzRHJhZnRDb21tZW50KGNvbW1lbnQpKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMubG9nLmluZm8oJ1JlbW92aW5nIGNvbW1lbnQgYm94IGJlY2F1c2Ugbm8gY29udGVudCBleGlzdHMnKTtcbiAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZShjb21tZW50KTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmxvZy5pbmZvKCdEZWxldGVkIGNvbW1lbnQ6JyArIGNvbW1lbnRJZCArICctJyArICdhbm5vdGF0aW9uSWQ6JyArIGFubm90YXRpb24uaWQpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmFubm90YXRpb25DaGFuZ2VTdWJqZWN0Lm5leHQoeyd0eXBlJzogJ2RlbGV0ZUNvbW1lbnQnLCAnYW5ub3RhdGlvbic6IGFubm90YXRpb259KTtcbiAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZSh0aGlzLmFubm90YXRpb25zKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfTtcblxuICAgICAgICAvLyBVbnVzZWRcbiAgICAgICAgY29uc3QgZWRpdEFubm90YXRpb24gPSAoZG9jdW1lbnRJZCwgcGFnZU51bWJlciwgYW5ub3RhdGlvbikgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLmFubm90YXRpb25DaGFuZ2VTdWJqZWN0Lm5leHQoeyd0eXBlJzogJ2VkaXRBbm5vdGF0aW9uJywgJ2Fubm90YXRpb24nOiBhbm5vdGF0aW9ufSk7XG4gICAgICAgICAgICAgICAgcmVzb2x2ZSh0aGlzLmNvbW1lbnREYXRhKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9O1xuXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBnZXRBbm5vdGF0aW9ucyxcbiAgICAgICAgICAgIGdldENvbW1lbnRzLFxuICAgICAgICAgICAgZ2V0QW5ub3RhdGlvbixcbiAgICAgICAgICAgIGFkZEFubm90YXRpb24sXG4gICAgICAgICAgICBlZGl0QW5ub3RhdGlvbixcbiAgICAgICAgICAgIGRlbGV0ZUFubm90YXRpb24sXG4gICAgICAgICAgICBhZGRDb21tZW50LFxuICAgICAgICAgICAgZGVsZXRlQ29tbWVudFxuICAgICAgICB9O1xuICAgIH1cblxuICAgIGZpbmRCeUlkKGFycmF5LCBpZCkge1xuICAgICAgICByZXR1cm4gYXJyYXkuZmluZChlID0+IGUuaWQgPT09IGlkKTtcbiAgICB9XG5cbiAgICByZW1vdmUoYXJyYXksIGlkKSB7XG4gICAgICAgIHJldHVybiBhcnJheS5zcGxpY2UoYXJyYXkuZmluZEluZGV4KGUgPT4gZS5pZCA9PT0gaWQpLCAxKTtcbiAgICB9XG59XG4iXX0=