@textbus/collaborate 2.0.3 → 2.1.2
Sign up to get free protection for your applications and to get access to all the features.
- package/bundles/collaborate-cursor.js +3 -3
- package/bundles/collaborate.d.ts +1 -0
- package/bundles/collaborate.js +88 -39
- package/package.json +5 -5
- package/src/collaborate-cursor.ts +2 -3
- package/src/collaborate.ts +106 -38
@@ -11,7 +11,7 @@ var __param = (this && this.__param) || function (paramIndex, decorator) {
|
|
11
11
|
return function (target, key) { decorator(target, key, paramIndex); }
|
12
12
|
};
|
13
13
|
import { Inject, Injectable, Optional } from '@tanbo/di';
|
14
|
-
import { createElement, VIEW_CONTAINER, getLayoutRectByRange, SelectionBridge
|
14
|
+
import { createElement, VIEW_CONTAINER, getLayoutRectByRange, SelectionBridge } from '@textbus/browser';
|
15
15
|
import { Selection, Scheduler } from '@textbus/core';
|
16
16
|
import { fromEvent, Subject, Subscription } from '@tanbo/stream';
|
17
17
|
export class CollaborateSelectionAwarenessDelegate {
|
@@ -97,7 +97,7 @@ let CollaborateCursor = class CollaborateCursor {
|
|
97
97
|
}
|
98
98
|
draw(paths) {
|
99
99
|
this.currentSelection = paths;
|
100
|
-
const containerRect =
|
100
|
+
const containerRect = this.container.getBoundingClientRect();
|
101
101
|
this.canvas.style.top = containerRect.top * -1 + 'px';
|
102
102
|
this.canvas.width = this.canvas.offsetWidth;
|
103
103
|
this.canvas.height = this.canvas.offsetHeight;
|
@@ -268,4 +268,4 @@ CollaborateCursor = __decorate([
|
|
268
268
|
Selection])
|
269
269
|
], CollaborateCursor);
|
270
270
|
export { CollaborateCursor };
|
271
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29sbGFib3JhdGUtY3Vyc29yLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL2NvbGxhYm9yYXRlLWN1cnNvci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7QUFBQSxPQUFPLEVBQUUsTUFBTSxFQUFFLFVBQVUsRUFBRSxRQUFRLEVBQUUsTUFBTSxXQUFXLENBQUE7QUFDeEQsT0FBTyxFQUNMLGFBQWEsRUFDYixjQUFjLEVBQ2Qsb0JBQW9CLEVBQ3BCLGVBQWUsRUFDZixxQkFBcUIsRUFDdEIsTUFBTSxrQkFBa0IsQ0FBQTtBQUN6QixPQUFPLEVBQUUsU0FBUyxFQUFxQyxTQUFTLEVBQVEsTUFBTSxlQUFlLENBQUE7QUFDN0YsT0FBTyxFQUFFLFNBQVMsRUFBRSxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sZUFBZSxDQUFBO0FBbUJoRSxNQUFNLE9BQWdCLHFDQUFxQztDQUUxRDtBQUdELElBQWEsaUJBQWlCLEdBQTlCLE1BQWEsaUJBQWlCO0lBb0Q1QixZQUE0QyxTQUFzQixFQUNsQyxpQkFBd0QsRUFDcEUsZUFBZ0MsRUFDaEMsU0FBb0IsRUFDcEIsU0FBb0I7UUFKSSxjQUFTLEdBQVQsU0FBUyxDQUFhO1FBQ2xDLHNCQUFpQixHQUFqQixpQkFBaUIsQ0FBdUM7UUFDcEUsb0JBQWUsR0FBZixlQUFlLENBQWlCO1FBQ2hDLGNBQVMsR0FBVCxTQUFTLENBQVc7UUFDcEIsY0FBUyxHQUFULFNBQVMsQ0FBVztRQXZEaEMsU0FBSSxHQUFHLGFBQWEsQ0FBQyxLQUFLLEVBQUU7WUFDbEMsTUFBTSxFQUFFO2dCQUNOLFFBQVEsRUFBRSxVQUFVO2dCQUNwQixJQUFJLEVBQUUsQ0FBQztnQkFDUCxHQUFHLEVBQUUsQ0FBQztnQkFDTixLQUFLLEVBQUUsTUFBTTtnQkFDYixNQUFNLEVBQUUsTUFBTTtnQkFDZCxhQUFhLEVBQUUsTUFBTTtnQkFDckIsTUFBTSxFQUFFLENBQUM7YUFDVjtTQUNGLENBQUMsQ0FBQTtRQUNNLG9C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UUFDM0IsT0FBTztZQUNMLE1BQU0sRUFBRSxLQUFLO1lBQ2IsTUFBTTtZQUNOLE9BQU87U0FDUixDQUFBO0lBQ0gsQ0FBQztDQUNGLENBQUE7QUFoUVksaUJBQWlCO0lBRDdCLFVBQVUsRUFBRTtJQXFERSxXQUFBLE1BQU0sQ0FBQyxjQUFjLENBQUMsQ0FBQTtJQUN0QixXQUFBLFFBQVEsRUFBRSxDQUFBO3FDQURnQyxXQUFXO1FBQ2YscUNBQXFDO1FBQ25ELGVBQWU7UUFDckIsU0FBUztRQUNULFNBQVM7R0F4RDdCLGlCQUFpQixDQWdRN0I7U0FoUVksaUJBQWlCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0LCBJbmplY3RhYmxlLCBPcHRpb25hbCB9IGZyb20gJ0B0YW5iby9kaSdcbmltcG9ydCB7XG4gIGNyZWF0ZUVsZW1lbnQsXG4gIFZJRVdfQ09OVEFJTkVSLFxuICBnZXRMYXlvdXRSZWN0QnlSYW5nZSxcbiAgU2VsZWN0aW9uQnJpZGdlLFxuICBnZXRCb3VuZGluZ0NsaWVudFJlY3Rcbn0gZnJvbSAnQHRleHRidXMvYnJvd3NlcidcbmltcG9ydCB7IFNlbGVjdGlvbiwgU2VsZWN0aW9uUGF0aHMsIEFic3RyYWN0U2VsZWN0aW9uLCBTY2hlZHVsZXIsIFJlY3QgfSBmcm9tICdAdGV4dGJ1cy9jb3JlJ1xuaW1wb3J0IHsgZnJvbUV2ZW50LCBTdWJqZWN0LCBTdWJzY3JpcHRpb24gfSBmcm9tICdAdGFuYm8vc3RyZWFtJ1xuXG5leHBvcnQgaW50ZXJmYWNlIFJlbW90ZVNlbGVjdGlvbiB7XG4gIGNvbG9yOiBzdHJpbmdcbiAgdXNlcm5hbWU6IHN0cmluZ1xuICBwYXRoczogU2VsZWN0aW9uUGF0aHNcbn1cblxuZXhwb3J0IGludGVyZmFjZSBTZWxlY3Rpb25SZWN0IGV4dGVuZHMgUmVjdCB7XG4gIGNvbG9yOiBzdHJpbmdcbiAgdXNlcm5hbWU6IHN0cmluZ1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFJlbW90ZVNlbGVjdGlvbkN1cnNvciB7XG4gIGN1cnNvcjogSFRNTEVsZW1lbnRcbiAgYW5jaG9yOiBIVE1MRWxlbWVudFxuICB1c2VyVGlwOiBIVE1MRWxlbWVudFxufVxuXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgQ29sbGFib3JhdGVTZWxlY3Rpb25Bd2FyZW5lc3NEZWxlZ2F0ZSB7XG4gIGFic3RyYWN0IGdldFJlY3RzKGFic3RyYWN0U2VsZWN0aW9uOiBBYnN0cmFjdFNlbGVjdGlvbiwgbmF0aXZlUmFuZ2U6IFJhbmdlKTogZmFsc2UgfCBSZWN0W11cbn1cblxuQEluamVjdGFibGUoKVxuZXhwb3J0IGNsYXNzIENvbGxhYm9yYXRlQ3Vyc29yIHtcbiAgcHJpdmF0ZSBob3N0ID0gY3JlYXRlRWxlbWVudCgnZGl2Jywge1xuICAgIHN0eWxlczoge1xuICAgICAgcG9zaXRpb246ICdhYnNvbHV0ZScsXG4gICAgICBsZWZ0OiAwLFxuICAgICAgdG9wOiAwLFxuICAgICAgd2lkdGg6ICcxMDAlJyxcbiAgICAgIGhlaWdodDogJzEwMCUnLFxuICAgICAgcG9pbnRlckV2ZW50czogJ25vbmUnLFxuICAgICAgekluZGV4OiAxXG4gICAgfVxuICB9KVxuICBwcml2YXRlIGNhbnZhc0NvbnRhaW5lciA9IGNyZWF0ZUVsZW1lbnQoJ2RpdicsIHtcbiAgICBzdHlsZXM6IHtcbiAgICAgIHBvc2l0aW9uOiAnYWJzb2x1dGUnLFxuICAgICAgbGVmdDogMCxcbiAgICAgIHRvcDogMCxcbiAgICAgIHdpZHRoOiAnMTAwJScsXG4gICAgICBoZWlnaHQ6ICcxMDAlJyxcbiAgICAgIG92ZXJmbG93OiAnaGlkZGVuJ1xuICAgIH1cbiAgfSlcbiAgcHJpdmF0ZSBjYW52YXMgPSBjcmVhdGVFbGVtZW50KCdjYW52YXMnLCB7XG4gICAgc3R5bGVzOiB7XG4gICAgICBwb3NpdGlvbjogJ2Fic29sdXRlJyxcbiAgICAgIG9wYWNpdHk6IDAuNSxcbiAgICAgIGxlZnQ6IDAsXG4gICAgICB0b3A6IDAsXG4gICAgICB3aWR0aDogJzEwMCUnLFxuICAgICAgaGVpZ2h0OiBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50SGVpZ2h0ICsgJ3B4JyxcbiAgICAgIHBvaW50ZXJFdmVudHM6ICdub25lJyxcbiAgICB9XG4gIH0pIGFzIEhUTUxDYW52YXNFbGVtZW50XG4gIHByaXZhdGUgY29udGV4dCA9IHRoaXMuY2FudmFzLmdldENvbnRleHQoJzJkJykhXG4gIHByaXZhdGUgdG9vbHRpcHMgPSBjcmVhdGVFbGVtZW50KCdkaXYnLCB7XG4gICAgc3R5bGVzOiB7XG4gICAgICBwb3NpdGlvbjogJ2Fic29sdXRlJyxcbiAgICAgIGxlZnQ6IDAsXG4gICAgICB0b3A6IDAsXG4gICAgICB3aWR0aDogJzEwMCUnLFxuICAgICAgaGVpZ2h0OiAnMTAwJScsXG4gICAgICBwb2ludGVyRXZlbnRzOiAnbm9uZScsXG4gICAgICBmb250U2l6ZTogJzEycHgnLFxuICAgICAgekluZGV4OiAxMFxuICAgIH1cbiAgfSlcblxuICBwcml2YXRlIG9uUmVjdHNDaGFuZ2UgPSBuZXcgU3ViamVjdDxTZWxlY3Rpb25SZWN0W10+KClcblxuICBwcml2YXRlIHN1YnNjcmlwdGlvbiA9IG5ldyBTdWJzY3JpcHRpb24oKVxuICBwcml2YXRlIGN1cnJlbnRTZWxlY3Rpb246IFJlbW90ZVNlbGVjdGlvbltdID0gW11cblxuICBjb25zdHJ1Y3RvcihASW5qZWN0KFZJRVdfQ09OVEFJTkVSKSBwcml2YXRlIGNvbnRhaW5lcjogSFRNTEVsZW1lbnQsXG4gICAgICAgICAgICAgIEBPcHRpb25hbCgpIHByaXZhdGUgYXdhcmVuZXNzRGVsZWdhdGU6IENvbGxhYm9yYXRlU2VsZWN0aW9uQXdhcmVuZXNzRGVsZWdhdGUsXG4gICAgICAgICAgICAgIHByaXZhdGUgbmF0aXZlU2VsZWN0aW9uOiBTZWxlY3Rpb25CcmlkZ2UsXG4gICAgICAgICAgICAgIHByaXZhdGUgc2NoZWR1bGVyOiBTY2hlZHVsZXIsXG4gICAgICAgICAgICAgIHByaXZhdGUgc2VsZWN0aW9uOiBTZWxlY3Rpb24pIHtcbiAgICB0aGlzLmNhbnZhc0NvbnRhaW5lci5hcHBlbmQodGhpcy5jYW52YXMpXG4gICAgdGhpcy5ob3N0LmFwcGVuZCh0aGlzLmNhbnZhc0NvbnRhaW5lciwgdGhpcy50b29sdGlwcylcbiAgICBjb250YWluZXIucHJlcGVuZCh0aGlzLmhvc3QpXG4gICAgdGhpcy5zdWJzY3JpcHRpb24uYWRkKHRoaXMub25SZWN0c0NoYW5nZS5zdWJzY3JpYmUocmVjdHMgPT4ge1xuICAgICAgZm9yIChjb25zdCByZWN0IG9mIHJlY3RzKSB7XG4gICAgICAgIHRoaXMuY29udGV4dC5maWxsU3R5bGUgPSByZWN0LmNvbG9yXG4gICAgICAgIHRoaXMuY29udGV4dC5iZWdpblBhdGgoKVxuICAgICAgICB0aGlzLmNvbnRleHQucmVjdChyZWN0LmxlZnQsIHJlY3QudG9wLCByZWN0LndpZHRoLCByZWN0LmhlaWdodClcbiAgICAgICAgdGhpcy5jb250ZXh0LmZpbGwoKVxuICAgICAgICB0aGlzLmNvbnRleHQuY2xvc2VQYXRoKClcbiAgICAgIH1cbiAgICB9KSwgZnJvbUV2ZW50KHdpbmRvdywgJ3Jlc2l6ZScpLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICB0aGlzLmNhbnZhcy5zdHlsZS5oZWlnaHQgPSBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50SGVpZ2h0ICsgJ3B4J1xuICAgICAgdGhpcy5yZWZyZXNoKClcbiAgICB9KSwgdGhpcy5zY2hlZHVsZXIub25Eb2NDaGFuZ2VkLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICB0aGlzLnJlZnJlc2goKVxuICAgIH0pKVxuICB9XG5cbiAgcmVmcmVzaCgpIHtcbiAgICB0aGlzLmRyYXcodGhpcy5jdXJyZW50U2VsZWN0aW9uKVxuICB9XG5cbiAgZGVzdHJveSgpIHtcbiAgICB0aGlzLnN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpXG4gIH1cblxuICBkcmF3KHBhdGhzOiBSZW1vdGVTZWxlY3Rpb25bXSkge1xuICAgIHRoaXMuY3VycmVudFNlbGVjdGlvbiA9IHBhdGhzXG4gICAgY29uc3QgY29udGFpbmVyUmVjdCA9IGdldEJvdW5kaW5nQ2xpZW50UmVjdCh0aGlzLmNvbnRhaW5lcilcbiAgICB0aGlzLmNhbnZhcy5zdHlsZS50b3AgPSBjb250YWluZXJSZWN0LnRvcCAqIC0xICsgJ3B4J1xuICAgIHRoaXMuY2FudmFzLndpZHRoID0gdGhpcy5jYW52YXMub2Zmc2V0V2lkdGhcbiAgICB0aGlzLmNhbnZhcy5oZWlnaHQgPSB0aGlzLmNhbnZhcy5vZmZzZXRIZWlnaHRcbiAgICB0aGlzLmNvbnRleHQuY2xlYXJSZWN0KDAsIDAsIHRoaXMuY2FudmFzLndpZHRoLCB0aGlzLmNhbnZhcy5oZWlnaHQpXG5cbiAgICBjb25zdCB1c2VyczogU2VsZWN0aW9uUmVjdFtdID0gW11cblxuICAgIHBhdGhzLmZpbHRlcihpID0+IHtcbiAgICAgIHJldHVybiBpLnBhdGhzLmFuY2hvci5sZW5ndGggJiYgaS5wYXRocy5mb2N1cy5sZW5ndGhcbiAgICB9KS5mb3JFYWNoKGl0ZW0gPT4ge1xuICAgICAgY29uc3QgYW5jaG9yUGF0aHMgPSBbLi4uaXRlbS5wYXRocy5hbmNob3JdXG4gICAgICBjb25zdCBmb2N1c1BhdGhzID0gWy4uLml0ZW0ucGF0aHMuZm9jdXNdXG4gICAgICBjb25zdCBhbmNob3JPZmZzZXQgPSBhbmNob3JQYXRocy5wb3AoKSFcbiAgICAgIGNvbnN0IGFuY2hvclNsb3QgPSB0aGlzLnNlbGVjdGlvbi5maW5kU2xvdEJ5UGF0aHMoYW5jaG9yUGF0aHMpXG4gICAgICBjb25zdCBmb2N1c09mZnNldCA9IGZvY3VzUGF0aHMucG9wKCkhXG4gICAgICBjb25zdCBmb2N1c1Nsb3QgPSB0aGlzLnNlbGVjdGlvbi5maW5kU2xvdEJ5UGF0aHMoZm9jdXNQYXRocylcbiAgICAgIGlmICghYW5jaG9yU2xvdCB8fCAhZm9jdXNTbG90KSB7XG4gICAgICAgIHJldHVyblxuICAgICAgfVxuXG4gICAgICBjb25zdCB7IGZvY3VzLCBhbmNob3IgfSA9IHRoaXMubmF0aXZlU2VsZWN0aW9uLmdldFBvc2l0aW9uQnlSYW5nZSh7XG4gICAgICAgIGZvY3VzT2Zmc2V0LFxuICAgICAgICBhbmNob3JPZmZzZXQsXG4gICAgICAgIGZvY3VzU2xvdCxcbiAgICAgICAgYW5jaG9yU2xvdFxuICAgICAgfSlcbiAgICAgIGlmICghZm9jdXMgfHwgIWFuY2hvcikge1xuICAgICAgICByZXR1cm5cbiAgICAgIH1cbiAgICAgIGNvbnN0IG5hdGl2ZVJhbmdlID0gZG9jdW1lbnQuY3JlYXRlUmFuZ2UoKVxuICAgICAgbmF0aXZlUmFuZ2Uuc2V0U3RhcnQoYW5jaG9yLm5vZGUsIGFuY2hvci5vZmZzZXQpXG4gICAgICBuYXRpdmVSYW5nZS5zZXRFbmQoZm9jdXMubm9kZSwgZm9jdXMub2Zmc2V0KVxuICAgICAgaWYgKChhbmNob3Iubm9kZSAhPT0gZm9jdXMubm9kZSB8fCBhbmNob3Iub2Zmc2V0ICE9PSBmb2N1cy5vZmZzZXQpICYmIG5hdGl2ZVJhbmdlLmNvbGxhcHNlZCkge1xuICAgICAgICBuYXRpdmVSYW5nZS5zZXRTdGFydChmb2N1cy5ub2RlLCBmb2N1cy5vZmZzZXQpXG4gICAgICAgIG5hdGl2ZVJhbmdlLnNldEVuZChhbmNob3Iubm9kZSwgYW5jaG9yLm9mZnNldClcbiAgICAgIH1cblxuICAgICAgbGV0IHJlY3RzOiBSZWN0W10gfCBET01SZWN0TGlzdCB8IGZhbHNlID0gZmFsc2VcbiAgICAgIGlmICh0aGlzLmF3YXJlbmVzc0RlbGVnYXRlKSB7XG4gICAgICAgIHJlY3RzID0gdGhpcy5hd2FyZW5lc3NEZWxlZ2F0ZS5nZXRSZWN0cyh7XG4gICAgICAgICAgZm9jdXNPZmZzZXQsXG4gICAgICAgICAgYW5jaG9yT2Zmc2V0LFxuICAgICAgICAgIGZvY3VzU2xvdCxcbiAgICAgICAgICBhbmNob3JTbG90XG4gICAgICAgIH0sIG5hdGl2ZVJhbmdlKVxuICAgICAgfVxuICAgICAgaWYgKCFyZWN0cykge1xuICAgICAgICByZWN0cyA9IG5hdGl2ZVJhbmdlLmdldENsaWVudFJlY3RzKClcbiAgICAgIH1cbiAgICAgIGNvbnN0IHNlbGVjdGlvblJlY3RzOiBTZWxlY3Rpb25SZWN0W10gPSBbXVxuICAgICAgZm9yIChsZXQgaSA9IHJlY3RzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgICAgIGNvbnN0IHJlY3QgPSByZWN0c1tpXVxuICAgICAgICBzZWxlY3Rpb25SZWN0cy5wdXNoKHtcbiAgICAgICAgICBjb2xvcjogaXRlbS5jb2xvcixcbiAgICAgICAgICB1c2VybmFtZTogaXRlbS51c2VybmFtZSxcbiAgICAgICAgICBsZWZ0OiByZWN0LmxlZnQgLSBjb250YWluZXJSZWN0LmxlZnQsXG4gICAgICAgICAgdG9wOiByZWN0LnRvcCxcbiAgICAgICAgICB3aWR0aDogcmVjdC53aWR0aCxcbiAgICAgICAgICBoZWlnaHQ6IHJlY3QuaGVpZ2h0LFxuICAgICAgICB9KVxuICAgICAgfVxuICAgICAgdGhpcy5vblJlY3RzQ2hhbmdlLm5leHQoc2VsZWN0aW9uUmVjdHMpXG5cbiAgICAgIGNvbnN0IGN1cnNvclJhbmdlID0gbmF0aXZlUmFuZ2UuY2xvbmVSYW5nZSgpXG4gICAgICBjdXJzb3JSYW5nZS5zZXRTdGFydChmb2N1cy5ub2RlLCBmb2N1cy5vZmZzZXQpXG4gICAgICBjdXJzb3JSYW5nZS5jb2xsYXBzZSh0cnVlKVxuXG4gICAgICBjb25zdCBjdXJzb3JSZWN0ID0gZ2V0TGF5b3V0UmVjdEJ5UmFuZ2UoY3Vyc29yUmFuZ2UpXG5cbiAgICAgIGNvbnN0IHJlY3Q6IFNlbGVjdGlvblJlY3QgPSB7XG4gICAgICAgIHVzZXJuYW1lOiBpdGVtLnVzZXJuYW1lLFxuICAgICAgICBjb2xvcjogaXRlbS5jb2xvcixcbiAgICAgICAgbGVmdDogY3Vyc29yUmVjdC5sZWZ0IC0gY29udGFpbmVyUmVjdC5sZWZ0LFxuICAgICAgICB0b3A6IGN1cnNvclJlY3QudG9wIC0gY29udGFpbmVyUmVjdC50b3AsXG4gICAgICAgIHdpZHRoOiAyLFxuICAgICAgICBoZWlnaHQ6IGN1cnNvclJlY3QuaGVpZ2h0XG4gICAgICB9XG4gICAgICBpZiAocmVjdC5sZWZ0IDwgMCB8fCByZWN0LnRvcCA8IDAgfHwgcmVjdC5sZWZ0ID4gY29udGFpbmVyUmVjdC53aWR0aCkge1xuICAgICAgICByZXR1cm5cbiAgICAgIH1cbiAgICAgIHVzZXJzLnB1c2gocmVjdClcbiAgICB9KVxuICAgIHRoaXMuZHJhd1VzZXJDdXJzb3IodXNlcnMpXG4gIH1cblxuICBwcml2YXRlIGRyYXdVc2VyQ3Vyc29yKHJlY3RzOiBTZWxlY3Rpb25SZWN0W10pIHtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHJlY3RzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBjb25zdCByZWN0ID0gcmVjdHNbaV1cbiAgICAgIGNvbnN0IHsgY3Vyc29yLCB1c2VyVGlwLCBhbmNob3IgfSA9IHRoaXMuZ2V0VXNlckN1cnNvcihpKVxuICAgICAgT2JqZWN0LmFzc2lnbihjdXJzb3Iuc3R5bGUsIHtcbiAgICAgICAgbGVmdDogcmVjdC5sZWZ0ICsgJ3B4JyxcbiAgICAgICAgdG9wOiByZWN0LnRvcCArICdweCcsXG4gICAgICAgIHdpZHRoOiByZWN0LndpZHRoICsgJ3B4JyxcbiAgICAgICAgaGVpZ2h0OiByZWN0LmhlaWdodCArICdweCcsXG4gICAgICAgIGJhY2tncm91bmQ6IHJlY3QuY29sb3IsXG4gICAgICAgIGRpc3BsYXk6ICdibG9jaydcbiAgICAgIH0pXG4gICAgICBhbmNob3Iuc3R5bGUuYmFja2dyb3VuZCA9IHJlY3QuY29sb3JcbiAgICAgIHVzZXJUaXAuaW5uZXJUZXh0ID0gcmVjdC51c2VybmFtZVxuICAgICAgdXNlclRpcC5zdHlsZS5iYWNrZ3JvdW5kID0gcmVjdC5jb2xvclxuICAgIH1cblxuICAgIGZvciAobGV0IGkgPSByZWN0cy5sZW5ndGg7IGkgPCB0aGlzLnRvb2x0aXBzLmNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7XG4gICAgICB0aGlzLnRvb2x0aXBzLnJlbW92ZUNoaWxkKHRoaXMudG9vbHRpcHMuY2hpbGRyZW5baV0pXG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBnZXRVc2VyQ3Vyc29yKGluZGV4OiBudW1iZXIpOiBSZW1vdGVTZWxlY3Rpb25DdXJzb3Ige1xuICAgIGxldCBjaGlsZDogSFRNTEVsZW1lbnQgPSB0aGlzLnRvb2x0aXBzLmNoaWxkcmVuW2luZGV4XSBhcyBIVE1MRWxlbWVudFxuICAgIGlmIChjaGlsZCkge1xuICAgICAgY29uc3QgYW5jaG9yID0gY2hpbGQuY2hpbGRyZW5bMF0gYXMgSFRNTEVsZW1lbnRcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGN1cnNvcjogY2hpbGQsXG4gICAgICAgIGFuY2hvcixcbiAgICAgICAgdXNlclRpcDogYW5jaG9yLmNoaWxkcmVuWzBdIGFzIEhUTUxFbGVtZW50XG4gICAgICB9XG4gICAgfVxuICAgIGNvbnN0IHVzZXJUaXAgPSBjcmVhdGVFbGVtZW50KCdzcGFuJywge1xuICAgICAgc3R5bGVzOiB7XG4gICAgICAgIHBvc2l0aW9uOiAnYWJzb2x1dGUnLFxuICAgICAgICBkaXNwbGF5OiAnbm9uZScsXG4gICAgICAgIGxlZnQ6ICc1MCUnLFxuICAgICAgICB0cmFuc2Zvcm06ICd0cmFuc2xhdGVYKC01MCUpJyxcbiAgICAgICAgbWFyZ2luQm90dG9tOiAnMnB4JyxcbiAgICAgICAgYm90dG9tOiAnMTAwJScsXG4gICAgICAgIHdoaXRlU3BhY2U6ICdub3dyYXAnLFxuICAgICAgICBjb2xvcjogJyNmZmYnLFxuICAgICAgICBib3hTaGFkb3c6ICcwIDFweCAycHggcmdiYSgwLDAsMCwuMSknLFxuICAgICAgICBib3JkZXJSYWRpdXM6ICczcHgnLFxuICAgICAgICBwYWRkaW5nOiAnM3B4IDVweCcsXG4gICAgICAgIHBvaW50ZXJFdmVudHM6ICdub25lJyxcbiAgICAgIH1cbiAgICB9KVxuXG4gICAgY29uc3QgYW5jaG9yID0gY3JlYXRlRWxlbWVudCgnc3BhbicsIHtcbiAgICAgIHN0eWxlczoge1xuICAgICAgICBwb3NpdGlvbjogJ2Fic29sdXRlJyxcbiAgICAgICAgdG9wOiAnLTJweCcsXG4gICAgICAgIGxlZnQ6ICctMnB4JyxcbiAgICAgICAgd2lkdGg6ICc2cHgnLFxuICAgICAgICBoZWlnaHQ6ICc2cHgnLFxuICAgICAgICBwb2ludGVyRXZlbnRzOiAnYXV0bycsXG4gICAgICAgIHBvaW50ZXI6ICdjdXJzb3InLFxuICAgICAgfSxcbiAgICAgIGNoaWxkcmVuOiBbdXNlclRpcF0sXG4gICAgICBvbjoge1xuICAgICAgICBtb3VzZWVudGVyKCkge1xuICAgICAgICAgIHVzZXJUaXAuc3R5bGUuZGlzcGxheSA9ICdibG9jaydcbiAgICAgICAgfSxcbiAgICAgICAgbW91c2VsZWF2ZSgpIHtcbiAgICAgICAgICB1c2VyVGlwLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSdcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pXG4gICAgY2hpbGQgPSBjcmVhdGVFbGVtZW50KCdzcGFuJywge1xuICAgICAgc3R5bGVzOiB7XG4gICAgICAgIHBvc2l0aW9uOiAnYWJzb2x1dGUnLFxuICAgICAgfSxcbiAgICAgIGNoaWxkcmVuOiBbXG4gICAgICAgIGFuY2hvclxuICAgICAgXVxuICAgIH0pXG4gICAgdGhpcy50b29sdGlwcy5hcHBlbmQoY2hpbGQpXG4gICAgcmV0dXJuIHtcbiAgICAgIGN1cnNvcjogY2hpbGQsXG4gICAgICBhbmNob3IsXG4gICAgICB1c2VyVGlwXG4gICAgfVxuICB9XG59XG4iXX0=
|
271
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29sbGFib3JhdGUtY3Vyc29yLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL2NvbGxhYm9yYXRlLWN1cnNvci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7QUFBQSxPQUFPLEVBQUUsTUFBTSxFQUFFLFVBQVUsRUFBRSxRQUFRLEVBQUUsTUFBTSxXQUFXLENBQUE7QUFDeEQsT0FBTyxFQUNMLGFBQWEsRUFDYixjQUFjLEVBQ2Qsb0JBQW9CLEVBQ3BCLGVBQWUsRUFDaEIsTUFBTSxrQkFBa0IsQ0FBQTtBQUN6QixPQUFPLEVBQUUsU0FBUyxFQUFxQyxTQUFTLEVBQVEsTUFBTSxlQUFlLENBQUE7QUFDN0YsT0FBTyxFQUFFLFNBQVMsRUFBRSxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sZUFBZSxDQUFBO0FBbUJoRSxNQUFNLE9BQWdCLHFDQUFxQztDQUUxRDtBQUdELElBQWEsaUJBQWlCLEdBQTlCLE1BQWEsaUJBQWlCO0lBb0Q1QixZQUE0QyxTQUFzQixFQUNsQyxpQkFBd0QsRUFDcEUsZUFBZ0MsRUFDaEMsU0FBb0IsRUFDcEIsU0FBb0I7UUFKSSxjQUFTLEdBQVQsU0FBUyxDQUFhO1FBQ2xDLHNCQUFpQixHQUFqQixpQkFBaUIsQ0FBdUM7UUFDcEUsb0JBQWUsR0FBZixlQUFlLENBQWlCO1FBQ2hDLGNBQVMsR0FBVCxTQUFTLENBQVc7UUFDcEIsY0FBUyxHQUFULFNBQVMsQ0FBVztRQXZEaEMsU0FBSSxHQUFHLGFBQWEsQ0FBQyxLQUFLLEVBQUU7WUFDbEMsTUFBTSxFQUFFO2dCQUNOLFFBQVEsRUFBRSxVQUFVO2dCQUNwQixJQUFJLEVBQUUsQ0FBQztnQkFDUCxHQUFHLEVBQUUsQ0FBQztnQkFDTixLQUFLLEVBQUUsTUFBTTtnQkFDYixNQUFNLEVBQUUsTUFBTTtnQkFDZCxhQUFhLEVBQUUsTUFBTTtnQkFDckIsTUFBTSxFQUFFLENBQUM7YUFDVjtTQUNGLENBQUMsQ0FBQTtRQUNNLG9CQUFlLEdBQUcsYUFB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QUNMLE1BQU0sRUFBRSxLQUFLO1lBQ2IsTUFBTTtZQUNOLE9BQU87U0FDUixDQUFBO0lBQ0gsQ0FBQztDQUNGLENBQUE7QUFoUVksaUJBQWlCO0lBRDdCLFVBQVUsRUFBRTtJQXFERSxXQUFBLE1BQU0sQ0FBQyxjQUFjLENBQUMsQ0FBQTtJQUN0QixXQUFBLFFBQVEsRUFBRSxDQUFBO3FDQURnQyxXQUFXO1FBQ2YscUNBQXFDO1FBQ25ELGVBQWU7UUFDckIsU0FBUztRQUNULFNBQVM7R0F4RDdCLGlCQUFpQixDQWdRN0I7U0FoUVksaUJBQWlCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0LCBJbmplY3RhYmxlLCBPcHRpb25hbCB9IGZyb20gJ0B0YW5iby9kaSdcbmltcG9ydCB7XG4gIGNyZWF0ZUVsZW1lbnQsXG4gIFZJRVdfQ09OVEFJTkVSLFxuICBnZXRMYXlvdXRSZWN0QnlSYW5nZSxcbiAgU2VsZWN0aW9uQnJpZGdlXG59IGZyb20gJ0B0ZXh0YnVzL2Jyb3dzZXInXG5pbXBvcnQgeyBTZWxlY3Rpb24sIFNlbGVjdGlvblBhdGhzLCBBYnN0cmFjdFNlbGVjdGlvbiwgU2NoZWR1bGVyLCBSZWN0IH0gZnJvbSAnQHRleHRidXMvY29yZSdcbmltcG9ydCB7IGZyb21FdmVudCwgU3ViamVjdCwgU3Vic2NyaXB0aW9uIH0gZnJvbSAnQHRhbmJvL3N0cmVhbSdcblxuZXhwb3J0IGludGVyZmFjZSBSZW1vdGVTZWxlY3Rpb24ge1xuICBjb2xvcjogc3RyaW5nXG4gIHVzZXJuYW1lOiBzdHJpbmdcbiAgcGF0aHM6IFNlbGVjdGlvblBhdGhzXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgU2VsZWN0aW9uUmVjdCBleHRlbmRzIFJlY3Qge1xuICBjb2xvcjogc3RyaW5nXG4gIHVzZXJuYW1lOiBzdHJpbmdcbn1cblxuZXhwb3J0IGludGVyZmFjZSBSZW1vdGVTZWxlY3Rpb25DdXJzb3Ige1xuICBjdXJzb3I6IEhUTUxFbGVtZW50XG4gIGFuY2hvcjogSFRNTEVsZW1lbnRcbiAgdXNlclRpcDogSFRNTEVsZW1lbnRcbn1cblxuZXhwb3J0IGFic3RyYWN0IGNsYXNzIENvbGxhYm9yYXRlU2VsZWN0aW9uQXdhcmVuZXNzRGVsZWdhdGUge1xuICBhYnN0cmFjdCBnZXRSZWN0cyhhYnN0cmFjdFNlbGVjdGlvbjogQWJzdHJhY3RTZWxlY3Rpb24sIG5hdGl2ZVJhbmdlOiBSYW5nZSk6IGZhbHNlIHwgUmVjdFtdXG59XG5cbkBJbmplY3RhYmxlKClcbmV4cG9ydCBjbGFzcyBDb2xsYWJvcmF0ZUN1cnNvciB7XG4gIHByaXZhdGUgaG9zdCA9IGNyZWF0ZUVsZW1lbnQoJ2RpdicsIHtcbiAgICBzdHlsZXM6IHtcbiAgICAgIHBvc2l0aW9uOiAnYWJzb2x1dGUnLFxuICAgICAgbGVmdDogMCxcbiAgICAgIHRvcDogMCxcbiAgICAgIHdpZHRoOiAnMTAwJScsXG4gICAgICBoZWlnaHQ6ICcxMDAlJyxcbiAgICAgIHBvaW50ZXJFdmVudHM6ICdub25lJyxcbiAgICAgIHpJbmRleDogMVxuICAgIH1cbiAgfSlcbiAgcHJpdmF0ZSBjYW52YXNDb250YWluZXIgPSBjcmVhdGVFbGVtZW50KCdkaXYnLCB7XG4gICAgc3R5bGVzOiB7XG4gICAgICBwb3NpdGlvbjogJ2Fic29sdXRlJyxcbiAgICAgIGxlZnQ6IDAsXG4gICAgICB0b3A6IDAsXG4gICAgICB3aWR0aDogJzEwMCUnLFxuICAgICAgaGVpZ2h0OiAnMTAwJScsXG4gICAgICBvdmVyZmxvdzogJ2hpZGRlbidcbiAgICB9XG4gIH0pXG4gIHByaXZhdGUgY2FudmFzID0gY3JlYXRlRWxlbWVudCgnY2FudmFzJywge1xuICAgIHN0eWxlczoge1xuICAgICAgcG9zaXRpb246ICdhYnNvbHV0ZScsXG4gICAgICBvcGFjaXR5OiAwLjUsXG4gICAgICBsZWZ0OiAwLFxuICAgICAgdG9wOiAwLFxuICAgICAgd2lkdGg6ICcxMDAlJyxcbiAgICAgIGhlaWdodDogZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudEhlaWdodCArICdweCcsXG4gICAgICBwb2ludGVyRXZlbnRzOiAnbm9uZScsXG4gICAgfVxuICB9KSBhcyBIVE1MQ2FudmFzRWxlbWVudFxuICBwcml2YXRlIGNvbnRleHQgPSB0aGlzLmNhbnZhcy5nZXRDb250ZXh0KCcyZCcpIVxuICBwcml2YXRlIHRvb2x0aXBzID0gY3JlYXRlRWxlbWVudCgnZGl2Jywge1xuICAgIHN0eWxlczoge1xuICAgICAgcG9zaXRpb246ICdhYnNvbHV0ZScsXG4gICAgICBsZWZ0OiAwLFxuICAgICAgdG9wOiAwLFxuICAgICAgd2lkdGg6ICcxMDAlJyxcbiAgICAgIGhlaWdodDogJzEwMCUnLFxuICAgICAgcG9pbnRlckV2ZW50czogJ25vbmUnLFxuICAgICAgZm9udFNpemU6ICcxMnB4JyxcbiAgICAgIHpJbmRleDogMTBcbiAgICB9XG4gIH0pXG5cbiAgcHJpdmF0ZSBvblJlY3RzQ2hhbmdlID0gbmV3IFN1YmplY3Q8U2VsZWN0aW9uUmVjdFtdPigpXG5cbiAgcHJpdmF0ZSBzdWJzY3JpcHRpb24gPSBuZXcgU3Vic2NyaXB0aW9uKClcbiAgcHJpdmF0ZSBjdXJyZW50U2VsZWN0aW9uOiBSZW1vdGVTZWxlY3Rpb25bXSA9IFtdXG5cbiAgY29uc3RydWN0b3IoQEluamVjdChWSUVXX0NPTlRBSU5FUikgcHJpdmF0ZSBjb250YWluZXI6IEhUTUxFbGVtZW50LFxuICAgICAgICAgICAgICBAT3B0aW9uYWwoKSBwcml2YXRlIGF3YXJlbmVzc0RlbGVnYXRlOiBDb2xsYWJvcmF0ZVNlbGVjdGlvbkF3YXJlbmVzc0RlbGVnYXRlLFxuICAgICAgICAgICAgICBwcml2YXRlIG5hdGl2ZVNlbGVjdGlvbjogU2VsZWN0aW9uQnJpZGdlLFxuICAgICAgICAgICAgICBwcml2YXRlIHNjaGVkdWxlcjogU2NoZWR1bGVyLFxuICAgICAgICAgICAgICBwcml2YXRlIHNlbGVjdGlvbjogU2VsZWN0aW9uKSB7XG4gICAgdGhpcy5jYW52YXNDb250YWluZXIuYXBwZW5kKHRoaXMuY2FudmFzKVxuICAgIHRoaXMuaG9zdC5hcHBlbmQodGhpcy5jYW52YXNDb250YWluZXIsIHRoaXMudG9vbHRpcHMpXG4gICAgY29udGFpbmVyLnByZXBlbmQodGhpcy5ob3N0KVxuICAgIHRoaXMuc3Vic2NyaXB0aW9uLmFkZCh0aGlzLm9uUmVjdHNDaGFuZ2Uuc3Vic2NyaWJlKHJlY3RzID0+IHtcbiAgICAgIGZvciAoY29uc3QgcmVjdCBvZiByZWN0cykge1xuICAgICAgICB0aGlzLmNvbnRleHQuZmlsbFN0eWxlID0gcmVjdC5jb2xvclxuICAgICAgICB0aGlzLmNvbnRleHQuYmVnaW5QYXRoKClcbiAgICAgICAgdGhpcy5jb250ZXh0LnJlY3QocmVjdC5sZWZ0LCByZWN0LnRvcCwgcmVjdC53aWR0aCwgcmVjdC5oZWlnaHQpXG4gICAgICAgIHRoaXMuY29udGV4dC5maWxsKClcbiAgICAgICAgdGhpcy5jb250ZXh0LmNsb3NlUGF0aCgpXG4gICAgICB9XG4gICAgfSksIGZyb21FdmVudCh3aW5kb3csICdyZXNpemUnKS5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgdGhpcy5jYW52YXMuc3R5bGUuaGVpZ2h0ID0gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudEhlaWdodCArICdweCdcbiAgICAgIHRoaXMucmVmcmVzaCgpXG4gICAgfSksIHRoaXMuc2NoZWR1bGVyLm9uRG9jQ2hhbmdlZC5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgdGhpcy5yZWZyZXNoKClcbiAgICB9KSlcbiAgfVxuXG4gIHJlZnJlc2goKSB7XG4gICAgdGhpcy5kcmF3KHRoaXMuY3VycmVudFNlbGVjdGlvbilcbiAgfVxuXG4gIGRlc3Ryb3koKSB7XG4gICAgdGhpcy5zdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKVxuICB9XG5cbiAgZHJhdyhwYXRoczogUmVtb3RlU2VsZWN0aW9uW10pIHtcbiAgICB0aGlzLmN1cnJlbnRTZWxlY3Rpb24gPSBwYXRoc1xuICAgIGNvbnN0IGNvbnRhaW5lclJlY3QgPSB0aGlzLmNvbnRhaW5lci5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKVxuICAgIHRoaXMuY2FudmFzLnN0eWxlLnRvcCA9IGNvbnRhaW5lclJlY3QudG9wICogLTEgKyAncHgnXG4gICAgdGhpcy5jYW52YXMud2lkdGggPSB0aGlzLmNhbnZhcy5vZmZzZXRXaWR0aFxuICAgIHRoaXMuY2FudmFzLmhlaWdodCA9IHRoaXMuY2FudmFzLm9mZnNldEhlaWdodFxuICAgIHRoaXMuY29udGV4dC5jbGVhclJlY3QoMCwgMCwgdGhpcy5jYW52YXMud2lkdGgsIHRoaXMuY2FudmFzLmhlaWdodClcblxuICAgIGNvbnN0IHVzZXJzOiBTZWxlY3Rpb25SZWN0W10gPSBbXVxuXG4gICAgcGF0aHMuZmlsdGVyKGkgPT4ge1xuICAgICAgcmV0dXJuIGkucGF0aHMuYW5jaG9yLmxlbmd0aCAmJiBpLnBhdGhzLmZvY3VzLmxlbmd0aFxuICAgIH0pLmZvckVhY2goaXRlbSA9PiB7XG4gICAgICBjb25zdCBhbmNob3JQYXRocyA9IFsuLi5pdGVtLnBhdGhzLmFuY2hvcl1cbiAgICAgIGNvbnN0IGZvY3VzUGF0aHMgPSBbLi4uaXRlbS5wYXRocy5mb2N1c11cbiAgICAgIGNvbnN0IGFuY2hvck9mZnNldCA9IGFuY2hvclBhdGhzLnBvcCgpIVxuICAgICAgY29uc3QgYW5jaG9yU2xvdCA9IHRoaXMuc2VsZWN0aW9uLmZpbmRTbG90QnlQYXRocyhhbmNob3JQYXRocylcbiAgICAgIGNvbnN0IGZvY3VzT2Zmc2V0ID0gZm9jdXNQYXRocy5wb3AoKSFcbiAgICAgIGNvbnN0IGZvY3VzU2xvdCA9IHRoaXMuc2VsZWN0aW9uLmZpbmRTbG90QnlQYXRocyhmb2N1c1BhdGhzKVxuICAgICAgaWYgKCFhbmNob3JTbG90IHx8ICFmb2N1c1Nsb3QpIHtcbiAgICAgICAgcmV0dXJuXG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHsgZm9jdXMsIGFuY2hvciB9ID0gdGhpcy5uYXRpdmVTZWxlY3Rpb24uZ2V0UG9zaXRpb25CeVJhbmdlKHtcbiAgICAgICAgZm9jdXNPZmZzZXQsXG4gICAgICAgIGFuY2hvck9mZnNldCxcbiAgICAgICAgZm9jdXNTbG90LFxuICAgICAgICBhbmNob3JTbG90XG4gICAgICB9KVxuICAgICAgaWYgKCFmb2N1cyB8fCAhYW5jaG9yKSB7XG4gICAgICAgIHJldHVyblxuICAgICAgfVxuICAgICAgY29uc3QgbmF0aXZlUmFuZ2UgPSBkb2N1bWVudC5jcmVhdGVSYW5nZSgpXG4gICAgICBuYXRpdmVSYW5nZS5zZXRTdGFydChhbmNob3Iubm9kZSwgYW5jaG9yLm9mZnNldClcbiAgICAgIG5hdGl2ZVJhbmdlLnNldEVuZChmb2N1cy5ub2RlLCBmb2N1cy5vZmZzZXQpXG4gICAgICBpZiAoKGFuY2hvci5ub2RlICE9PSBmb2N1cy5ub2RlIHx8IGFuY2hvci5vZmZzZXQgIT09IGZvY3VzLm9mZnNldCkgJiYgbmF0aXZlUmFuZ2UuY29sbGFwc2VkKSB7XG4gICAgICAgIG5hdGl2ZVJhbmdlLnNldFN0YXJ0KGZvY3VzLm5vZGUsIGZvY3VzLm9mZnNldClcbiAgICAgICAgbmF0aXZlUmFuZ2Uuc2V0RW5kKGFuY2hvci5ub2RlLCBhbmNob3Iub2Zmc2V0KVxuICAgICAgfVxuXG4gICAgICBsZXQgcmVjdHM6IFJlY3RbXSB8IERPTVJlY3RMaXN0IHwgZmFsc2UgPSBmYWxzZVxuICAgICAgaWYgKHRoaXMuYXdhcmVuZXNzRGVsZWdhdGUpIHtcbiAgICAgICAgcmVjdHMgPSB0aGlzLmF3YXJlbmVzc0RlbGVnYXRlLmdldFJlY3RzKHtcbiAgICAgICAgICBmb2N1c09mZnNldCxcbiAgICAgICAgICBhbmNob3JPZmZzZXQsXG4gICAgICAgICAgZm9jdXNTbG90LFxuICAgICAgICAgIGFuY2hvclNsb3RcbiAgICAgICAgfSwgbmF0aXZlUmFuZ2UpXG4gICAgICB9XG4gICAgICBpZiAoIXJlY3RzKSB7XG4gICAgICAgIHJlY3RzID0gbmF0aXZlUmFuZ2UuZ2V0Q2xpZW50UmVjdHMoKVxuICAgICAgfVxuICAgICAgY29uc3Qgc2VsZWN0aW9uUmVjdHM6IFNlbGVjdGlvblJlY3RbXSA9IFtdXG4gICAgICBmb3IgKGxldCBpID0gcmVjdHMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICAgICAgY29uc3QgcmVjdCA9IHJlY3RzW2ldXG4gICAgICAgIHNlbGVjdGlvblJlY3RzLnB1c2goe1xuICAgICAgICAgIGNvbG9yOiBpdGVtLmNvbG9yLFxuICAgICAgICAgIHVzZXJuYW1lOiBpdGVtLnVzZXJuYW1lLFxuICAgICAgICAgIGxlZnQ6IHJlY3QubGVmdCAtIGNvbnRhaW5lclJlY3QubGVmdCxcbiAgICAgICAgICB0b3A6IHJlY3QudG9wLFxuICAgICAgICAgIHdpZHRoOiByZWN0LndpZHRoLFxuICAgICAgICAgIGhlaWdodDogcmVjdC5oZWlnaHQsXG4gICAgICAgIH0pXG4gICAgICB9XG4gICAgICB0aGlzLm9uUmVjdHNDaGFuZ2UubmV4dChzZWxlY3Rpb25SZWN0cylcblxuICAgICAgY29uc3QgY3Vyc29yUmFuZ2UgPSBuYXRpdmVSYW5nZS5jbG9uZVJhbmdlKClcbiAgICAgIGN1cnNvclJhbmdlLnNldFN0YXJ0KGZvY3VzLm5vZGUsIGZvY3VzLm9mZnNldClcbiAgICAgIGN1cnNvclJhbmdlLmNvbGxhcHNlKHRydWUpXG5cbiAgICAgIGNvbnN0IGN1cnNvclJlY3QgPSBnZXRMYXlvdXRSZWN0QnlSYW5nZShjdXJzb3JSYW5nZSlcblxuICAgICAgY29uc3QgcmVjdDogU2VsZWN0aW9uUmVjdCA9IHtcbiAgICAgICAgdXNlcm5hbWU6IGl0ZW0udXNlcm5hbWUsXG4gICAgICAgIGNvbG9yOiBpdGVtLmNvbG9yLFxuICAgICAgICBsZWZ0OiBjdXJzb3JSZWN0LmxlZnQgLSBjb250YWluZXJSZWN0LmxlZnQsXG4gICAgICAgIHRvcDogY3Vyc29yUmVjdC50b3AgLSBjb250YWluZXJSZWN0LnRvcCxcbiAgICAgICAgd2lkdGg6IDIsXG4gICAgICAgIGhlaWdodDogY3Vyc29yUmVjdC5oZWlnaHRcbiAgICAgIH1cbiAgICAgIGlmIChyZWN0LmxlZnQgPCAwIHx8IHJlY3QudG9wIDwgMCB8fCByZWN0LmxlZnQgPiBjb250YWluZXJSZWN0LndpZHRoKSB7XG4gICAgICAgIHJldHVyblxuICAgICAgfVxuICAgICAgdXNlcnMucHVzaChyZWN0KVxuICAgIH0pXG4gICAgdGhpcy5kcmF3VXNlckN1cnNvcih1c2VycylcbiAgfVxuXG4gIHByaXZhdGUgZHJhd1VzZXJDdXJzb3IocmVjdHM6IFNlbGVjdGlvblJlY3RbXSkge1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcmVjdHMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGNvbnN0IHJlY3QgPSByZWN0c1tpXVxuICAgICAgY29uc3QgeyBjdXJzb3IsIHVzZXJUaXAsIGFuY2hvciB9ID0gdGhpcy5nZXRVc2VyQ3Vyc29yKGkpXG4gICAgICBPYmplY3QuYXNzaWduKGN1cnNvci5zdHlsZSwge1xuICAgICAgICBsZWZ0OiByZWN0LmxlZnQgKyAncHgnLFxuICAgICAgICB0b3A6IHJlY3QudG9wICsgJ3B4JyxcbiAgICAgICAgd2lkdGg6IHJlY3Qud2lkdGggKyAncHgnLFxuICAgICAgICBoZWlnaHQ6IHJlY3QuaGVpZ2h0ICsgJ3B4JyxcbiAgICAgICAgYmFja2dyb3VuZDogcmVjdC5jb2xvcixcbiAgICAgICAgZGlzcGxheTogJ2Jsb2NrJ1xuICAgICAgfSlcbiAgICAgIGFuY2hvci5zdHlsZS5iYWNrZ3JvdW5kID0gcmVjdC5jb2xvclxuICAgICAgdXNlclRpcC5pbm5lclRleHQgPSByZWN0LnVzZXJuYW1lXG4gICAgICB1c2VyVGlwLnN0eWxlLmJhY2tncm91bmQgPSByZWN0LmNvbG9yXG4gICAgfVxuXG4gICAgZm9yIChsZXQgaSA9IHJlY3RzLmxlbmd0aDsgaSA8IHRoaXMudG9vbHRpcHMuY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHtcbiAgICAgIHRoaXMudG9vbHRpcHMucmVtb3ZlQ2hpbGQodGhpcy50b29sdGlwcy5jaGlsZHJlbltpXSlcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGdldFVzZXJDdXJzb3IoaW5kZXg6IG51bWJlcik6IFJlbW90ZVNlbGVjdGlvbkN1cnNvciB7XG4gICAgbGV0IGNoaWxkOiBIVE1MRWxlbWVudCA9IHRoaXMudG9vbHRpcHMuY2hpbGRyZW5baW5kZXhdIGFzIEhUTUxFbGVtZW50XG4gICAgaWYgKGNoaWxkKSB7XG4gICAgICBjb25zdCBhbmNob3IgPSBjaGlsZC5jaGlsZHJlblswXSBhcyBIVE1MRWxlbWVudFxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgY3Vyc29yOiBjaGlsZCxcbiAgICAgICAgYW5jaG9yLFxuICAgICAgICB1c2VyVGlwOiBhbmNob3IuY2hpbGRyZW5bMF0gYXMgSFRNTEVsZW1lbnRcbiAgICAgIH1cbiAgICB9XG4gICAgY29uc3QgdXNlclRpcCA9IGNyZWF0ZUVsZW1lbnQoJ3NwYW4nLCB7XG4gICAgICBzdHlsZXM6IHtcbiAgICAgICAgcG9zaXRpb246ICdhYnNvbHV0ZScsXG4gICAgICAgIGRpc3BsYXk6ICdub25lJyxcbiAgICAgICAgbGVmdDogJzUwJScsXG4gICAgICAgIHRyYW5zZm9ybTogJ3RyYW5zbGF0ZVgoLTUwJSknLFxuICAgICAgICBtYXJnaW5Cb3R0b206ICcycHgnLFxuICAgICAgICBib3R0b206ICcxMDAlJyxcbiAgICAgICAgd2hpdGVTcGFjZTogJ25vd3JhcCcsXG4gICAgICAgIGNvbG9yOiAnI2ZmZicsXG4gICAgICAgIGJveFNoYWRvdzogJzAgMXB4IDJweCByZ2JhKDAsMCwwLC4xKScsXG4gICAgICAgIGJvcmRlclJhZGl1czogJzNweCcsXG4gICAgICAgIHBhZGRpbmc6ICczcHggNXB4JyxcbiAgICAgICAgcG9pbnRlckV2ZW50czogJ25vbmUnLFxuICAgICAgfVxuICAgIH0pXG5cbiAgICBjb25zdCBhbmNob3IgPSBjcmVhdGVFbGVtZW50KCdzcGFuJywge1xuICAgICAgc3R5bGVzOiB7XG4gICAgICAgIHBvc2l0aW9uOiAnYWJzb2x1dGUnLFxuICAgICAgICB0b3A6ICctMnB4JyxcbiAgICAgICAgbGVmdDogJy0ycHgnLFxuICAgICAgICB3aWR0aDogJzZweCcsXG4gICAgICAgIGhlaWdodDogJzZweCcsXG4gICAgICAgIHBvaW50ZXJFdmVudHM6ICdhdXRvJyxcbiAgICAgICAgcG9pbnRlcjogJ2N1cnNvcicsXG4gICAgICB9LFxuICAgICAgY2hpbGRyZW46IFt1c2VyVGlwXSxcbiAgICAgIG9uOiB7XG4gICAgICAgIG1vdXNlZW50ZXIoKSB7XG4gICAgICAgICAgdXNlclRpcC5zdHlsZS5kaXNwbGF5ID0gJ2Jsb2NrJ1xuICAgICAgICB9LFxuICAgICAgICBtb3VzZWxlYXZlKCkge1xuICAgICAgICAgIHVzZXJUaXAuc3R5bGUuZGlzcGxheSA9ICdub25lJ1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSlcbiAgICBjaGlsZCA9IGNyZWF0ZUVsZW1lbnQoJ3NwYW4nLCB7XG4gICAgICBzdHlsZXM6IHtcbiAgICAgICAgcG9zaXRpb246ICdhYnNvbHV0ZScsXG4gICAgICB9LFxuICAgICAgY2hpbGRyZW46IFtcbiAgICAgICAgYW5jaG9yXG4gICAgICBdXG4gICAgfSlcbiAgICB0aGlzLnRvb2x0aXBzLmFwcGVuZChjaGlsZClcbiAgICByZXR1cm4ge1xuICAgICAgY3Vyc29yOiBjaGlsZCxcbiAgICAgIGFuY2hvcixcbiAgICAgIHVzZXJUaXBcbiAgICB9XG4gIH1cbn1cbiJdfQ==
|
package/bundles/collaborate.d.ts
CHANGED
@@ -38,6 +38,7 @@ export declare class Collaborate implements History {
|
|
38
38
|
private selectionChangeEvent;
|
39
39
|
private contentMap;
|
40
40
|
private updateRemoteActions;
|
41
|
+
private noRecord;
|
41
42
|
constructor(stackSize: number, rootComponentRef: RootComponentRef, collaborateCursor: CollaborateCursor, controller: Controller, scheduler: Scheduler, translator: Translator, registry: Registry, selection: Selection, starter: Starter, translatorFallback: TranslatorFallback);
|
42
43
|
listen(): void;
|
43
44
|
updateRemoteSelection(paths: RemoteSelection[]): void;
|
package/bundles/collaborate.js
CHANGED
@@ -84,6 +84,7 @@ let Collaborate = class Collaborate {
|
|
84
84
|
this.selectionChangeEvent = new Subject();
|
85
85
|
this.contentMap = new ContentMap();
|
86
86
|
this.updateRemoteActions = [];
|
87
|
+
this.noRecord = {};
|
87
88
|
this.onSelectionChange = this.selectionChangeEvent.asObservable().pipe(delay());
|
88
89
|
this.onBack = this.backEvent.asObservable();
|
89
90
|
this.onForward = this.forwardEvent.asObservable();
|
@@ -131,12 +132,35 @@ let Collaborate = class Collaborate {
|
|
131
132
|
}), filter(item => {
|
132
133
|
return item.length;
|
133
134
|
})).subscribe(() => {
|
134
|
-
|
135
|
-
|
136
|
-
|
137
|
-
|
138
|
-
|
139
|
-
|
135
|
+
const updates = [];
|
136
|
+
let update = null;
|
137
|
+
for (const item of this.updateRemoteActions) {
|
138
|
+
if (!update) {
|
139
|
+
update = {
|
140
|
+
record: item.record,
|
141
|
+
actions: []
|
142
|
+
};
|
143
|
+
updates.push(update);
|
144
|
+
}
|
145
|
+
if (update.record === item.record) {
|
146
|
+
update.actions.push(item.action);
|
147
|
+
}
|
148
|
+
else {
|
149
|
+
update = {
|
150
|
+
record: item.record,
|
151
|
+
actions: [item.action]
|
152
|
+
};
|
153
|
+
updates.push(update);
|
154
|
+
}
|
155
|
+
}
|
156
|
+
this.updateRemoteActions = [];
|
157
|
+
for (const item of updates) {
|
158
|
+
this.yDoc.transact(() => {
|
159
|
+
item.actions.forEach(fn => {
|
160
|
+
fn();
|
161
|
+
});
|
162
|
+
}, item.record ? this.yDoc : this.noRecord);
|
163
|
+
}
|
140
164
|
}));
|
141
165
|
this.syncRootComponent(root, rootComponent);
|
142
166
|
}
|
@@ -318,17 +342,7 @@ let Collaborate = class Collaborate {
|
|
318
342
|
if (action.type === 'retain') {
|
319
343
|
const formats = action.formats;
|
320
344
|
if (formats) {
|
321
|
-
|
322
|
-
let length = keys.length;
|
323
|
-
keys.forEach(key => {
|
324
|
-
if (!this.registry.getFormatter(key)) {
|
325
|
-
length--;
|
326
|
-
Reflect.deleteProperty(formats, key);
|
327
|
-
}
|
328
|
-
});
|
329
|
-
if (length) {
|
330
|
-
content.format(offset, action.offset, formats);
|
331
|
-
}
|
345
|
+
content.format(offset, action.offset, localFormatToRemote(formats, this.registry));
|
332
346
|
}
|
333
347
|
else {
|
334
348
|
offset = action.offset;
|
@@ -339,12 +353,12 @@ let Collaborate = class Collaborate {
|
|
339
353
|
const isEmpty = delta.length === 1 && delta[0].insert === Slot.emptyPlaceholder;
|
340
354
|
if (typeof action.content === 'string') {
|
341
355
|
length = action.content.length;
|
342
|
-
content.insert(offset, action.content, action.formats || {});
|
356
|
+
content.insert(offset, action.content, localFormatToRemote(action.formats || {}, this.registry));
|
343
357
|
}
|
344
358
|
else {
|
345
359
|
length = 1;
|
346
360
|
const sharedComponent = this.createSharedComponentByComponent(action.ref);
|
347
|
-
content.insertEmbed(offset, sharedComponent);
|
361
|
+
content.insertEmbed(offset, sharedComponent, localFormatToRemote(action.formats || {}, this.registry));
|
348
362
|
}
|
349
363
|
if (isEmpty && offset === 0) {
|
350
364
|
content.delete(content.length - 1, 1);
|
@@ -392,12 +406,10 @@ let Collaborate = class Collaborate {
|
|
392
406
|
});
|
393
407
|
};
|
394
408
|
remoteSlot.observe(syncRemote);
|
395
|
-
const sub = slot.onStateChange.subscribe(
|
409
|
+
const sub = slot.onStateChange.subscribe(change => {
|
396
410
|
this.runLocalUpdate(() => {
|
397
|
-
|
398
|
-
|
399
|
-
});
|
400
|
-
});
|
411
|
+
remoteSlot.set('state', change.newState);
|
412
|
+
}, change.record);
|
401
413
|
});
|
402
414
|
this.slotStateSyncCaches.set(slot, () => {
|
403
415
|
remoteSlot.unobserve(syncRemote);
|
@@ -479,21 +491,24 @@ let Collaborate = class Collaborate {
|
|
479
491
|
});
|
480
492
|
};
|
481
493
|
remoteComponent.observe(syncRemote);
|
482
|
-
const sub = component.onStateChange.subscribe(
|
494
|
+
const sub = component.onStateChange.subscribe(change => {
|
483
495
|
this.runLocalUpdate(() => {
|
484
|
-
remoteComponent.set('state', newState);
|
485
|
-
});
|
496
|
+
remoteComponent.set('state', change.newState);
|
497
|
+
}, change.record);
|
486
498
|
});
|
487
499
|
this.componentStateSyncCaches.set(component, () => {
|
488
500
|
remoteComponent.unobserve(syncRemote);
|
489
501
|
sub.unsubscribe();
|
490
502
|
});
|
491
503
|
}
|
492
|
-
runLocalUpdate(fn) {
|
504
|
+
runLocalUpdate(fn, record = true) {
|
493
505
|
if (this.updateFromRemote || this.controller.readonly) {
|
494
506
|
return;
|
495
507
|
}
|
496
|
-
this.updateRemoteActions.push(
|
508
|
+
this.updateRemoteActions.push({
|
509
|
+
record,
|
510
|
+
action: fn
|
511
|
+
});
|
497
512
|
}
|
498
513
|
runRemoteUpdate(tr, fn) {
|
499
514
|
if (tr.origin === this.yDoc) {
|
@@ -530,14 +545,9 @@ let Collaborate = class Collaborate {
|
|
530
545
|
sharedSlot.set('content', sharedContent);
|
531
546
|
let offset = 0;
|
532
547
|
slot.toDelta().forEach(i => {
|
533
|
-
let formats
|
548
|
+
let formats;
|
534
549
|
if (i.formats) {
|
535
|
-
i.formats
|
536
|
-
formats[item[0].name] = item[1];
|
537
|
-
});
|
538
|
-
}
|
539
|
-
else {
|
540
|
-
formats = null;
|
550
|
+
formats = formatsToRemote(i.formats);
|
541
551
|
}
|
542
552
|
if (typeof i.insert === 'string') {
|
543
553
|
sharedContent.insert(offset, i.insert, formats);
|
@@ -603,7 +613,7 @@ let Collaborate = class Collaborate {
|
|
603
613
|
const sharedComponent = action.insert;
|
604
614
|
const canInsertInlineComponent = slot.schema.includes(ContentType.InlineComponent);
|
605
615
|
const component = this.createComponentBySharedComponent(sharedComponent, canInsertInlineComponent);
|
606
|
-
slot.insert(component);
|
616
|
+
slot.insert(component, makeFormats(this.registry, action.attributes));
|
607
617
|
this.syncSlots(sharedComponent.get('slots'), component);
|
608
618
|
this.syncComponent(sharedComponent, component);
|
609
619
|
}
|
@@ -653,11 +663,50 @@ Collaborate = __decorate([
|
|
653
663
|
TranslatorFallback])
|
654
664
|
], Collaborate);
|
655
665
|
export { Collaborate };
|
666
|
+
function formatsToRemote(formats) {
|
667
|
+
const result = {};
|
668
|
+
for (const item of formats) {
|
669
|
+
const [formatter, values] = item;
|
670
|
+
if (typeof formatter.createValueIdIfOverlap === 'function') {
|
671
|
+
if (Array.isArray(values)) {
|
672
|
+
values.forEach(value => {
|
673
|
+
const valueId = formatter.createValueIdIfOverlap(value);
|
674
|
+
result[`${formatter.name}:${valueId}`] = value;
|
675
|
+
});
|
676
|
+
break;
|
677
|
+
}
|
678
|
+
}
|
679
|
+
result[formatter.name] = values;
|
680
|
+
}
|
681
|
+
return result;
|
682
|
+
}
|
683
|
+
function localFormatToRemote(formats, registry) {
|
684
|
+
const keys = Object.keys(formats);
|
685
|
+
const result = {};
|
686
|
+
for (const key of keys) {
|
687
|
+
const formatter = registry.getFormatter(key);
|
688
|
+
if (!formatter) {
|
689
|
+
break;
|
690
|
+
}
|
691
|
+
if (typeof formatter.createValueIdIfOverlap === 'function') {
|
692
|
+
const values = formats[key];
|
693
|
+
if (Array.isArray(values)) {
|
694
|
+
values.forEach(value => {
|
695
|
+
const valueId = formatter.createValueIdIfOverlap(value);
|
696
|
+
result[`${formatter.name}:${valueId}`] = value;
|
697
|
+
});
|
698
|
+
break;
|
699
|
+
}
|
700
|
+
}
|
701
|
+
result[key] = formats[key];
|
702
|
+
}
|
703
|
+
return result;
|
704
|
+
}
|
656
705
|
function makeFormats(registry, attrs) {
|
657
706
|
const formats = [];
|
658
707
|
if (attrs) {
|
659
708
|
Object.keys(attrs).forEach(key => {
|
660
|
-
const formatter = registry.getFormatter(key);
|
709
|
+
const formatter = registry.getFormatter(key.split(':')[0]);
|
661
710
|
if (formatter) {
|
662
711
|
formats.push([formatter, attrs[key]]);
|
663
712
|
}
|
@@ -665,4 +714,4 @@ function makeFormats(registry, attrs) {
|
|
665
714
|
}
|
666
715
|
return formats;
|
667
716
|
}
|
668
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29sbGFib3JhdGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvY29sbGFib3JhdGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7O0FBQUEsT0FBTyxFQUFFLE1BQU0sRUFBRSxVQUFVLEVBQUUsUUFBUSxFQUFFLE1BQU0sV0FBVyxDQUFBO0FBQ3hELE9BQU8sRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLEdBQUcsRUFBYyxPQUFPLEVBQWdCLE1BQU0sZUFBZSxDQUFBO0FBQ3JGLE9BQU8sRUFDTCxZQUFZLEVBRVosV0FBVyxFQUFFLFVBQVUsRUFFZCxrQkFBa0IsRUFDM0IsU0FBUyxFQUNULFFBQVEsRUFDUixnQkFBZ0IsRUFDaEIsU0FBUyxFQUNULFNBQVMsRUFFVCxJQUFJLEVBQ0osT0FBTyxFQUNQLFVBQVUsRUFDWCxNQUFNLGVBQWUsQ0FBQTtBQUN0QixPQUFPLEVBQ0wsS0FBSyxJQUFJLE1BQU0sRUFDZixHQUFHLElBQUksSUFBSSxFQUNYLEdBQUcsSUFBSSxJQUFJLEVBRVgsSUFBSSxJQUFJLEtBQUssRUFFYixXQUFXLEVBQ1gsMENBQTBDLEVBQzFDLG1DQUFtQyxFQUNwQyxNQUFNLEtBQUssQ0FBQTtBQUVaLE9BQU8sRUFBRSxpQkFBaUIsRUFBbUIsTUFBTSxzQkFBc0IsQ0FBQTtBQUN6RSxPQUFPLEVBQUUsc0JBQXNCLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQTtBQUU1RCxNQUFNLGtCQUFrQixHQUFHLFNBQVMsQ0FBQyxhQUFhLENBQUMsQ0FBQTtBQU9uRCxNQUFNLFVBQVU7SUFBaEI7UUFDVSxvQkFBZSxHQUFHLElBQUksT0FBTyxFQUFlLENBQUE7UUFDNUMsb0JBQWUsR0FBRyxJQUFJLE9BQU8sRUFBZSxDQUFBO0lBc0N0RCxDQUFDO0lBbENDLEdBQUcsQ0FBQyxHQUFRLEVBQUUsS0FBVTtRQUN0QixJQUFJLEdBQUcsWUFBWSxJQUFJLEVBQUU7WUFDdkIsSUFBSSxDQUFDLGVBQWUsQ0FBQyxHQUFHLENB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RSxFQUFFLENBQUE7YUFDTDtRQUNILENBQUMsQ0FBQyxDQUFBO1FBQ0YsU0FBUyxDQUFDLEtBQUssQ0FBQyxPQUFPLEVBQUUsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLEVBQUU7WUFDdkMsSUFBSSxDQUFDLHdCQUF3QixDQUFDLElBQUksQ0FBQyxDQUFBO1FBQ3JDLENBQUMsQ0FBQyxDQUFBO0lBQ0osQ0FBQztDQUNGLENBQUE7QUF4bEJZLFdBQVc7SUFEdkIsVUFBVSxFQUFFO0lBcUNFLFdBQUEsTUFBTSxDQUFDLGtCQUFrQixDQUFDLENBQUE7SUFTMUIsV0FBQSxRQUFRLEVBQUUsQ0FBQTs2Q0FSZSxnQkFBZ0I7UUFDZixpQkFBaUI7UUFDeEIsVUFBVTtRQUNYLFNBQVM7UUFDUixVQUFVO1FBQ1osUUFBUTtRQUNQLFNBQVM7UUFDWCxPQUFPO1FBQ2dCLGtCQUFrQjtHQTdDM0QsV0FBVyxDQXdsQnZCO1NBeGxCWSxXQUFXO0FBMGxCeEIsU0FBUyxXQUFXLENBQUMsUUFBa0IsRUFBRSxLQUFXO0lBQ2xELE1BQU0sT0FBTyxHQUFZLEVBQUUsQ0FBQTtJQUMzQixJQUFJLEtBQUssRUFBRTtRQUNULE1BQU0sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxFQUFFO1lBQy9CLE1BQU0sU0FBUyxHQUFHLFFBQVEsQ0FBQyxZQUFZLENBQUMsR0FBRyxDQUFDLENBQUE7WUFDNUMsSUFBSSxTQUFTLEVBQUU7Z0JBQ2IsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDLFNBQVMsRUFBRSxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFBO2FBQ3RDO1FBQ0gsQ0FBQyxDQUFDLENBQUE7S0FDSDtJQUNELE9BQU8sT0FBTyxDQUFBO0FBQ2hCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3QsIEluamVjdGFibGUsIE9wdGlvbmFsIH0gZnJvbSAnQHRhbmJvL2RpJ1xuaW1wb3J0IHsgZGVsYXksIGZpbHRlciwgbWFwLCBPYnNlcnZhYmxlLCBTdWJqZWN0LCBTdWJzY3JpcHRpb24gfSBmcm9tICdAdGFuYm8vc3RyZWFtJ1xuaW1wb3J0IHtcbiAgQ2hhbmdlT3JpZ2luLCBDb21wb25lbnRJbml0RGF0YSxcbiAgQ29tcG9uZW50SW5zdGFuY2UsXG4gIENvbnRlbnRUeXBlLCBDb250cm9sbGVyLFxuICBGb3JtYXRzLFxuICBIaXN0b3J5LCBISVNUT1JZX1NUQUNLX1NJWkUsXG4gIG1ha2VFcnJvcixcbiAgUmVnaXN0cnksXG4gIFJvb3RDb21wb25lbnRSZWYsXG4gIFNjaGVkdWxlcixcbiAgU2VsZWN0aW9uLFxuICBTZWxlY3Rpb25QYXRocyxcbiAgU2xvdCxcbiAgU3RhcnRlcixcbiAgVHJhbnNsYXRvclxufSBmcm9tICdAdGV4dGJ1cy9jb3JlJ1xuaW1wb3J0IHtcbiAgQXJyYXkgYXMgWUFycmF5LFxuICBEb2MgYXMgWURvYyxcbiAgTWFwIGFzIFlNYXAsXG4gIFJlbGF0aXZlUG9zaXRpb24sXG4gIFRleHQgYXMgWVRleHQsXG4gIFRyYW5zYWN0aW9uLFxuICBVbmRvTWFuYWdlcixcbiAgY3JlYXRlQWJzb2x1dGVQb3NpdGlvbkZyb21SZWxhdGl2ZVBvc2l0aW9uLFxuICBjcmVhdGVSZWxhdGl2ZVBvc2l0aW9uRnJvbVR5cGVJbmRleFxufSBmcm9tICd5anMnXG5cbmltcG9ydCB7IENvbGxhYm9yYXRlQ3Vyc29yLCBSZW1vdGVTZWxlY3Rpb24gfSBmcm9tICcuL2NvbGxhYm9yYXRlLWN1cnNvcidcbmltcG9ydCB7IGNyZWF0ZVVua25vd25Db21wb25lbnQgfSBmcm9tICcuL3Vua25vd24uY29tcG9uZW50J1xuXG5jb25zdCBjb2xsYWJvcmF0ZUVycm9yRm4gPSBtYWtlRXJyb3IoJ0NvbGxhYm9yYXRlJylcblxuaW50ZXJmYWNlIEN1cnNvclBvc2l0aW9uIHtcbiAgYW5jaG9yOiBSZWxhdGl2ZVBvc2l0aW9uXG4gIGZvY3VzOiBSZWxhdGl2ZVBvc2l0aW9uXG59XG5cbmNsYXNzIENvbnRlbnRNYXAge1xuICBwcml2YXRlIHNsb3RBbmRZVGV4dE1hcCA9IG5ldyBXZWFrTWFwPFNsb3QsIFlUZXh0PigpXG4gIHByaXZhdGUgeVRleHRBbmRTTG90TWFwID0gbmV3IFdlYWtNYXA8WVRleHQsIFNsb3Q+KClcblxuICBzZXQoa2V5OiBTbG90LCB2YWx1ZTogWVRleHQpOiB2b2lkXG4gIHNldChrZXk6IFlUZXh0LCB2YWx1ZTogU2xvdCk6IHZvaWRcbiAgc2V0KGtleTogYW55LCB2YWx1ZTogYW55KSB7XG4gICAgaWYgKGtleSBpbnN0YW5jZW9mIFNsb3QpIHtcbiAgICAgIHRoaXMuc2xvdEFuZFlUZXh0TWFwLnNldChrZXksIHZhbHVlKVxuICAgICAgdGhpcy55VGV4dEFuZFNMb3RNYXAuc2V0KHZhbHVlLCBrZXkpXG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuc2xvdEFuZFlUZXh0TWFwLnNldCh2YWx1ZSwga2V5KVxuICAgICAgdGhpcy55VGV4dEFuZFNMb3RNYXAuc2V0KGtleSwgdmFsdWUpXG4gICAgfVxuICB9XG5cbiAgZ2V0KGtleTogU2xvdCk6IFlUZXh0IHwgbnVsbFxuICBnZXQoa2V5OiBZVGV4dCk6IFNsb3QgfCBudWxsXG4gIGdldChrZXk6IGFueSkge1xuICAgIGlmIChrZXkgaW5zdGFuY2VvZiBTbG90KSB7XG4gICAgICByZXR1cm4gdGhpcy5zbG90QW5kWVRleHRNYXAuZ2V0KGtleSkgfHwgbnVsbFxuICAgIH1cbiAgICByZXR1cm4gdGhpcy55VGV4dEFuZFNMb3RNYXAuZ2V0KGtleSkgfHwgbnVsbFxuICB9XG5cbiAgZGVsZXRlKGtleTogU2xvdCB8IFlUZXh0KSB7XG4gICAgaWYgKGtleSBpbnN0YW5jZW9mIFNsb3QpIHtcbiAgICAgIGNvbnN0IHYgPSB0aGlzLnNsb3RBbmRZVGV4dE1hcC5nZXQoa2V5KVxuICAgICAgdGhpcy5zbG90QW5kWVRleHRNYXAuZGVsZXRlKGtleSlcbiAgICAgIGlmICh2KSB7XG4gICAgICAgIHRoaXMueVRleHRBbmRTTG90TWFwLmRlbGV0ZSh2KVxuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCB2ID0gdGhpcy55VGV4dEFuZFNMb3RNYXAuZ2V0KGtleSlcbiAgICAgIHRoaXMueVRleHRBbmRTTG90TWFwLmRlbGV0ZShrZXkpXG4gICAgICBpZiAodikge1xuICAgICAgICB0aGlzLnNsb3RBbmRZVGV4dE1hcC5kZWxldGUodilcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cblxuZXhwb3J0IGFic3RyYWN0IGNsYXNzIFRyYW5zbGF0b3JGYWxsYmFjayB7XG4gIGFic3RyYWN0IGNyZWF0ZUNvbXBvbmVudEJ5RGF0YShuYW1lOiBzdHJpbmcsIGRhdGE6IENvbXBvbmVudEluaXREYXRhKTogQ29tcG9uZW50SW5zdGFuY2UgfCBudWxsXG59XG5cbkBJbmplY3RhYmxlKClcbmV4cG9ydCBjbGFzcyBDb2xsYWJvcmF0ZSBpbXBsZW1lbnRzIEhpc3Rvcnkge1xuICBvblNlbGVjdGlvbkNoYW5nZTogT2JzZXJ2YWJsZTxTZWxlY3Rpb25QYXRocz5cbiAgeURvYyA9IG5ldyBZRG9jKClcbiAgb25CYWNrOiBPYnNlcnZhYmxlPHZvaWQ+XG4gIG9uRm9yd2FyZDogT2JzZXJ2YWJsZTx2b2lkPlxuICBvbkNoYW5nZTogT2JzZXJ2YWJsZTx2b2lkPlxuICBvblB1c2g6IE9ic2VydmFibGU8dm9pZD5cblxuICBnZXQgY2FuQmFjaygpIHtcbiAgICByZXR1cm4gdGhpcy5tYW5hZ2VyPy5jYW5VbmRvKCkgfHwgZmFsc2VcbiAgfVxuXG4gIGdldCBjYW5Gb3J3YXJkKCkge1xuICAgIHJldHVybiB0aGlzLm1hbmFnZXI/LmNhblJlZG8oKSB8fCBmYWxzZVxuICB9XG5cbiAgcHJpdmF0ZSBiYWNrRXZlbnQgPSBuZXcgU3ViamVjdDx2b2lkPigpXG4gIHByaXZhdGUgZm9yd2FyZEV2ZW50ID0gbmV3IFN1YmplY3Q8dm9pZD4oKVxuICBwcml2YXRlIGNoYW5nZUV2ZW50ID0gbmV3IFN1YmplY3Q8dm9pZD4oKVxuICBwcml2YXRlIHB1c2hFdmVudCA9IG5ldyBTdWJqZWN0PHZvaWQ+KClcblxuICBwcml2YXRlIG1hbmFnZXI6IFVuZG9NYW5hZ2VyIHwgbnVsbCA9IG51bGxcblxuICBwcml2YXRlIHN1YnNjcmlwdGlvbnM6IFN1YnNjcmlwdGlvbltdID0gW11cbiAgcHJpdmF0ZSB1cGRhdGVGcm9tUmVtb3RlID0gZmFsc2VcblxuICBwcml2YXRlIGNvbnRlbnRTeW5jQ2FjaGVzID0gbmV3IFdlYWtNYXA8U2xvdCwgKCkgPT4gdm9pZD4oKVxuICBwcml2YXRlIHNsb3RTdGF0ZVN5bmNDYWNoZXMgPSBuZXcgV2Vha01hcDxTbG90LCAoKSA9PiB2b2lkPigpXG4gIHByaXZhdGUgc2xvdHNTeW5jQ2FjaGVzID0gbmV3IFdlYWtNYXA8Q29tcG9uZW50SW5zdGFuY2UsICgpID0+IHZvaWQ+KClcbiAgcHJpdmF0ZSBjb21wb25lbnRTdGF0ZVN5bmNDYWNoZXMgPSBuZXcgV2Vha01hcDxDb21wb25lbnRJbnN0YW5jZSwgKCkgPT4gdm9pZD4oKVxuXG4gIHByaXZhdGUgc2VsZWN0aW9uQ2hhbmdlRXZlbnQgPSBuZXcgU3ViamVjdDxTZWxlY3Rpb25QYXRocz4oKVxuICBwcml2YXRlIGNvbnRlbnRNYXAgPSBuZXcgQ29udGVudE1hcCgpXG5cbiAgcHJpdmF0ZSB1cGRhdGVSZW1vdGVBY3Rpb25zOiBBcnJheTwoKSA9PiB2b2lkPiA9IFtdXG5cbiAgY29uc3RydWN0b3IoQEluamVjdChISVNUT1JZX1NUQUNLX1NJWkUpIHByaXZhdGUgc3RhY2tTaXplOiBudW1iZXIsXG4gICAgICAgICAgICAgIHByaXZhdGUgcm9vdENvbXBvbmVudFJlZjogUm9vdENvbXBvbmVudFJlZixcbiAgICAgICAgICAgICAgcHJpdmF0ZSBjb2xsYWJvcmF0ZUN1cnNvcjogQ29sbGFib3JhdGVDdXJzb3IsXG4gICAgICAgICAgICAgIHByaXZhdGUgY29udHJvbGxlcjogQ29udHJvbGxlcixcbiAgICAgICAgICAgICAgcHJpdmF0ZSBzY2hlZHVsZXI6IFNjaGVkdWxlcixcbiAgICAgICAgICAgICAgcHJpdmF0ZSB0cmFuc2xhdG9yOiBUcmFuc2xhdG9yLFxuICAgICAgICAgICAgICBwcml2YXRlIHJlZ2lzdHJ5OiBSZWdpc3RyeSxcbiAgICAgICAgICAgICAgcHJpdmF0ZSBzZWxlY3Rpb246IFNlbGVjdGlvbixcbiAgICAgICAgICAgICAgcHJpdmF0ZSBzdGFydGVyOiBTdGFydGVyLFxuICAgICAgICAgICAgICBAT3B0aW9uYWwoKSBwcml2YXRlIHRyYW5zbGF0b3JGYWxsYmFjazogVHJhbnNsYXRvckZhbGxiYWNrKSB7XG4gICAgdGhpcy5vblNlbGVjdGlvbkNoYW5nZSA9IHRoaXMuc2VsZWN0aW9uQ2hhbmdlRXZlbnQuYXNPYnNlcnZhYmxlKCkucGlwZShkZWxheSgpKVxuICAgIHRoaXMub25CYWNrID0gdGhpcy5iYWNrRXZlbnQuYXNPYnNlcnZhYmxlKClcbiAgICB0aGlzLm9uRm9yd2FyZCA9IHRoaXMuZm9yd2FyZEV2ZW50LmFzT2JzZXJ2YWJsZSgpXG4gICAgdGhpcy5vbkNoYW5nZSA9IHRoaXMuY2hhbmdlRXZlbnQuYXNPYnNlcnZhYmxlKClcbiAgICB0aGlzLm9uUHVzaCA9IHRoaXMucHVzaEV2ZW50LmFzT2JzZXJ2YWJsZSgpXG4gIH1cblxuICBsaXN0ZW4oKSB7XG4gICAgY29uc3Qgcm9vdCA9IHRoaXMueURvYy5nZXRNYXAoJ1Jvb3RDb21wb25lbnQnKVxuICAgIGNvbnN0IHJvb3RDb21wb25lbnQgPSB0aGlzLnJvb3RDb21wb25lbnRSZWYuY29tcG9uZW50IVxuICAgIHRoaXMubWFuYWdlciA9IG5ldyBVbmRvTWFuYWdlcihyb290LCB7XG4gICAgICB0cmFja2VkT3JpZ2luczogbmV3IFNldDxhbnk+KFt0aGlzLnlEb2NdKVxuICAgIH0pXG4gICAgY29uc3QgY3Vyc29yS2V5ID0gJ2N1cnNvci1wb3NpdGlvbidcbiAgICB0aGlzLm1hbmFnZXIub24oJ3N0YWNrLWl0ZW0tYWRkZWQnLCBldmVudCA9PiB7XG4gICAgICBldmVudC5zdGFja0l0ZW0ubWV0YS5zZXQoY3Vyc29yS2V5LCB0aGlzLmdldFJlbGF0aXZlQ3Vyc29yTG9jYXRpb24oKSlcbiAgICAgIGlmICh0aGlzLm1hbmFnZXIhLnVuZG9TdGFjay5sZW5ndGggPiB0aGlzLnN0YWNrU2l6ZSkge1xuICAgICAgICB0aGlzLm1hbmFnZXIhLnVuZG9TdGFjay5zaGlmdCgpXG4gICAgICB9XG4gICAgICBpZiAoZXZlbnQub3JpZ2luID09PSB0aGlzLnlEb2MpIHtcbiAgICAgICAgdGhpcy5wdXNoRXZlbnQubmV4dCgpXG4gICAgICB9XG4gICAgICB0aGlzLmNoYW5nZUV2ZW50Lm5leHQoKVxuICAgIH0pXG4gICAgdGhpcy5tYW5hZ2VyLm9uKCdzdGFjay1pdGVtLXBvcHBlZCcsIGV2ZW50ID0+IHtcbiAgICAgIGNvbnN0IHBvc2l0aW9uID0gZXZlbnQuc3RhY2tJdGVtLm1ldGEuZ2V0KGN1cnNvcktleSkgYXMgQ3Vyc29yUG9zaXRpb25cbiAgICAgIGlmIChwb3NpdGlvbikge1xuICAgICAgICB0aGlzLnJlc3RvcmVDdXJzb3JMb2NhdGlvbihwb3NpdGlvbilcbiAgICAgIH1cbiAgICB9KVxuICAgIHRoaXMuc3Vic2NyaXB0aW9ucy5wdXNoKFxuICAgICAgdGhpcy5zZWxlY3Rpb24ub25DaGFuZ2Uuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgY29uc3QgcGF0aHMgPSB0aGlzLnNlbGVjdGlvbi5nZXRQYXRocygpXG4gICAgICAgIHRoaXMuc2VsZWN0aW9uQ2hhbmdlRXZlbnQubmV4dChwYXRocylcbiAgICAgIH0pLFxuICAgICAgdGhpcy5zY2hlZHVsZXIub25Eb2NDaGFuZ2VkLnBpcGUoXG4gICAgICAgIG1hcChpdGVtID0+IHtcbiAgICAgICAgICByZXR1cm4gaXRlbS5maWx0ZXIoaSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gaS5mcm9tICE9PSBDaGFuZ2VPcmlnaW4uUmVtb3RlXG4gICAgICAgICAgfSlcbiAgICAgICAgfSksXG4gICAgICAgIGZpbHRlcihpdGVtID0+IHtcbiAgICAgICAgICByZXR1cm4gaXRlbS5sZW5ndGhcbiAgICAgICAgfSlcbiAgICAgICkuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgdGhpcy55RG9jLnRyYW5zYWN0KCgpID0+IHtcbiAgICAgICAgICB0aGlzLnVwZGF0ZVJlbW90ZUFjdGlvbnMuZm9yRWFjaChmbiA9PiB7XG4gICAgICAgICAgICBmbigpXG4gICAgICAgICAgfSlcbiAgICAgICAgICB0aGlzLnVwZGF0ZVJlbW90ZUFjdGlvbnMgPSBbXVxuICAgICAgICB9LCB0aGlzLnlEb2MpXG4gICAgICB9KVxuICAgIClcbiAgICB0aGlzLnN5bmNSb290Q29tcG9uZW50KHJvb3QsIHJvb3RDb21wb25lbnQpXG4gIH1cblxuICB1cGRhdGVSZW1vdGVTZWxlY3Rpb24ocGF0aHM6IFJlbW90ZVNlbGVjdGlvbltdKSB7XG4gICAgdGhpcy5jb2xsYWJvcmF0ZUN1cnNvci5kcmF3KHBhdGhzKVxuICB9XG5cbiAgYmFjaygpIHtcbiAgICBpZiAodGhpcy5jYW5CYWNrKSB7XG4gICAgICB0aGlzLm1hbmFnZXI/LnVuZG8oKVxuICAgICAgdGhpcy5iYWNrRXZlbnQubmV4dCgpXG4gICAgfVxuICB9XG5cbiAgZm9yd2FyZCgpIHtcbiAgICBpZiAodGhpcy5jYW5Gb3J3YXJkKSB7XG4gICAgICB0aGlzLm1hbmFnZXI/LnJlZG8oKVxuICAgICAgdGhpcy5mb3J3YXJkRXZlbnQubmV4dCgpXG4gICAgfVxuICB9XG5cbiAgY2xlYXIoKSB7XG4gICAgdGhpcy5tYW5hZ2VyPy5jbGVhcigpXG4gICAgdGhpcy5jaGFuZ2VFdmVudC5uZXh0KClcbiAgfVxuXG4gIGRlc3Ryb3koKSB7XG4gICAgdGhpcy5zdWJzY3JpcHRpb25zLmZvckVhY2goaSA9PiBpLnVuc3Vic2NyaWJlKCkpXG4gICAgdGhpcy5jb2xsYWJvcmF0ZUN1cnNvci5kZXN0cm95KClcbiAgICB0aGlzLm1hbmFnZXI/LmRlc3Ryb3koKVxuICB9XG5cbiAgcHJpdmF0ZSBzeW5jUm9vdENvbXBvbmVudChyb290OiBZTWFwPGFueT4sIHJvb3RDb21wb25lbnQ6IENvbXBvbmVudEluc3RhbmNlKSB7XG4gICAgbGV0IHNsb3RzID0gcm9vdC5nZXQoJ3Nsb3RzJykgYXMgWUFycmF5PFlNYXA8YW55Pj5cbiAgICBpZiAoIXNsb3RzKSB7XG4gICAgICBzbG90cyA9IG5ldyBZQXJyYXkoKVxuICAgICAgcm9vdENvbXBvbmVudC5zbG90cy50b0FycmF5KCkuZm9yRWFjaChpID0+IHtcbiAgICAgICAgY29uc3Qgc2hhcmVkU2xvdCA9IHRoaXMuY3JlYXRlU2hhcmVkU2xvdEJ5U2xvdChpKVxuICAgICAgICBzbG90cy5wdXNoKFtzaGFyZWRTbG90XSlcbiAgICAgIH0pXG4gICAgICB0aGlzLnlEb2MudHJhbnNhY3QoKCkgPT4ge1xuICAgICAgICByb290LnNldCgnc3RhdGUnLCByb290Q29tcG9uZW50LnN0YXRlKVxuICAgICAgICByb290LnNldCgnc2xvdHMnLCBzbG90cylcbiAgICAgIH0pXG4gICAgfSBlbHNlIGlmIChzbG90cy5sZW5ndGggPT09IDApIHtcbiAgICAgIHJvb3RDb21wb25lbnQudXBkYXRlU3RhdGUoKCkgPT4ge1xuICAgICAgICByZXR1cm4gcm9vdC5nZXQoJ3N0YXRlJylcbiAgICAgIH0pXG4gICAgICB0aGlzLnlEb2MudHJhbnNhY3QoKCkgPT4ge1xuICAgICAgICByb290Q29tcG9uZW50LnNsb3RzLnRvQXJyYXkoKS5mb3JFYWNoKGkgPT4ge1xuICAgICAgICAgIGNvbnN0IHNoYXJlZFNsb3QgPSB0aGlzLmNyZWF0ZVNoYXJlZFNsb3RCeVNsb3QoaSlcbiAgICAgICAgICBzbG90cy5wdXNoKFtzaGFyZWRTbG90XSlcbiAgICAgICAgfSlcbiAgICAgIH0pXG4gICAgfSBlbHNlIHtcbiAgICAgIHJvb3RDb21wb25lbnQudXBkYXRlU3RhdGUoKCkgPT4ge1xuICAgICAgICByZXR1cm4gcm9vdC5nZXQoJ3N0YXRlJylcbiAgICAgIH0pXG4gICAgICByb290Q29tcG9uZW50LnNsb3RzLmNsZWFuKClcbiAgICAgIHNsb3RzLmZvckVhY2goc2hhcmVkU2xvdCA9PiB7XG4gICAgICAgIGNvbnN0IHNsb3QgPSB0aGlzLmNyZWF0ZVNsb3RCeVNoYXJlZFNsb3Qoc2hhcmVkU2xvdClcbiAgICAgICAgdGhpcy5zeW5jQ29udGVudChzaGFyZWRTbG90LmdldCgnY29udGVudCcpLCBzbG90KVxuICAgICAgICB0aGlzLnN5bmNTbG90KHNoYXJlZFNsb3QsIHNsb3QpXG4gICAgICAgIHJvb3RDb21wb25lbnQuc2xvdHMuaW5zZXJ0KHNsb3QpXG4gICAgICB9KVxuICAgIH1cbiAgICB0aGlzLnN5bmNDb21wb25lbnQocm9vdCwgcm9vdENvbXBvbmVudClcbiAgICB0aGlzLnN5bmNTbG90cyhzbG90cywgcm9vdENvbXBvbmVudClcbiAgfVxuXG4gIHByaXZhdGUgcmVzdG9yZUN1cnNvckxvY2F0aW9uKHBvc2l0aW9uOiBDdXJzb3JQb3NpdGlvbikge1xuICAgIGNvbnN0IGFuY2hvclBvc2l0aW9uID0gY3JlYXRlQWJzb2x1dGVQb3NpdGlvbkZyb21SZWxhdGl2ZVBvc2l0aW9uKHBvc2l0aW9uLmFuY2hvciwgdGhpcy55RG9jKVxuICAgIGNvbnN0IGZvY3VzUG9zaXRpb24gPSBjcmVhdGVBYnNvbHV0ZVBvc2l0aW9uRnJvbVJlbGF0aXZlUG9zaXRpb24ocG9zaXRpb24uZm9jdXMsIHRoaXMueURvYylcbiAgICBpZiAoYW5jaG9yUG9zaXRpb24gJiYgZm9jdXNQb3NpdGlvbikge1xuICAgICAgY29uc3QgZm9jdXNTbG90ID0gdGhpcy5jb250ZW50TWFwLmdldChmb2N1c1Bvc2l0aW9uLnR5cGUgYXMgWVRleHQpXG4gICAgICBjb25zdCBhbmNob3JTbG90ID0gdGhpcy5jb250ZW50TWFwLmdldChhbmNob3JQb3NpdGlvbi50eXBlIGFzIFlUZXh0KVxuICAgICAgaWYgKGZvY3VzU2xvdCAmJiBhbmNob3JTbG90KSB7XG4gICAgICAgIHRoaXMuc2VsZWN0aW9uLnNldEJhc2VBbmRFeHRlbnQoYW5jaG9yU2xvdCwgYW5jaG9yUG9zaXRpb24uaW5kZXgsIGZvY3VzU2xvdCwgZm9jdXNQb3NpdGlvbi5pbmRleClcbiAgICAgICAgcmV0dXJuXG4gICAgICB9XG4gICAgfVxuICAgIHRoaXMuc2VsZWN0aW9uLnVuU2VsZWN0KClcbiAgfVxuXG4gIHByaXZhdGUgZ2V0UmVsYXRpdmVDdXJzb3JMb2NhdGlvbigpOiBDdXJzb3JQb3NpdGlvbiB8IG51bGwge1xuICAgIGNvbnN0IHsgYW5jaG9yU2xvdCwgYW5jaG9yT2Zmc2V0LCBmb2N1c1Nsb3QsIGZvY3VzT2Zmc2V0IH0gPSB0aGlzLnNlbGVjdGlvblxuICAgIGlmIChhbmNob3JTbG90KSB7XG4gICAgICBjb25zdCBhbmNob3JZVGV4dCA9IHRoaXMuY29udGVudE1hcC5nZXQoYW5jaG9yU2xvdClcbiAgICAgIGlmIChhbmNob3JZVGV4dCkge1xuICAgICAgICBjb25zdCBhbmNob3JQb3NpdGlvbiA9IGNyZWF0ZVJlbGF0aXZlUG9zaXRpb25Gcm9tVHlwZUluZGV4KGFuY2hvcllUZXh0LCBhbmNob3JPZmZzZXQhKVxuICAgICAgICBpZiAoZm9jdXNTbG90KSB7XG4gICAgICAgICAgY29uc3QgZm9jdXNZVGV4dCA9IHRoaXMuY29udGVudE1hcC5nZXQoZm9jdXNTbG90KVxuICAgICAgICAgIGlmIChmb2N1c1lUZXh0KSB7XG4gICAgICAgICAgICBjb25zdCBmb2N1c1Bvc2l0aW9uID0gY3JlYXRlUmVsYXRpdmVQb3NpdGlvbkZyb21UeXBlSW5kZXgoZm9jdXNZVGV4dCwgZm9jdXNPZmZzZXQhKVxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgZm9jdXM6IGZvY3VzUG9zaXRpb24sXG4gICAgICAgICAgICAgIGFuY2hvcjogYW5jaG9yUG9zaXRpb25cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG51bGxcbiAgfVxuXG4gIHByaXZhdGUgc3luY0NvbnRlbnQoY29udGVudDogWVRleHQsIHNsb3Q6IFNsb3QpIHtcbiAgICB0aGlzLmNvbnRlbnRNYXAuc2V0KHNsb3QsIGNvbnRlbnQpXG4gICAgY29uc3Qgc3luY1JlbW90ZSA9IChldiwgdHIpID0+IHtcbiAgICAgIHRoaXMucnVuUmVtb3RlVXBkYXRlKHRyLCAoKSA9PiB7XG4gICAgICAgIHNsb3QucmV0YWluKDApXG4gICAgICAgIGV2LmRlbHRhLmZvckVhY2goYWN0aW9uID0+IHtcbiAgICAgICAgICBpZiAoUmVmbGVjdC5oYXMoYWN0aW9uLCAncmV0YWluJykpIHtcbiAgICAgICAgICAgIGlmIChhY3Rpb24uYXR0cmlidXRlcykge1xuICAgICAgICAgICAgICBjb25zdCBmb3JtYXRzID0gbWFrZUZvcm1hdHModGhpcy5yZWdpc3RyeSwgYWN0aW9uLmF0dHJpYnV0ZXMpXG4gICAgICAgICAgICAgIGlmIChmb3JtYXRzLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgIHNsb3QucmV0YWluKGFjdGlvbi5yZXRhaW4hLCBmb3JtYXRzKVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIHNsb3QucmV0YWluKHNsb3QuaW5kZXggKyBhY3Rpb24ucmV0YWluKVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgc2xvdC5yZXRhaW4oYWN0aW9uLnJldGFpbilcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGVsc2UgaWYgKGFjdGlvbi5pbnNlcnQpIHtcbiAgICAgICAgICAgIGNvbnN0IGluZGV4ID0gc2xvdC5pbmRleFxuICAgICAgICAgICAgbGV0IGxlbmd0aCA9IDFcbiAgICAgICAgICAgIGlmICh0eXBlb2YgYWN0aW9uLmluc2VydCA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgICAgbGVuZ3RoID0gYWN0aW9uLmluc2VydC5sZW5ndGhcbiAgICAgICAgICAgICAgc2xvdC5pbnNlcnQoYWN0aW9uLmluc2VydCwgbWFrZUZvcm1hdHModGhpcy5yZWdpc3RyeSwgYWN0aW9uLmF0dHJpYnV0ZXMpKVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgY29uc3Qgc2hhcmVkQ29tcG9uZW50ID0gYWN0aW9uLmluc2VydCBhcyBZTWFwPGFueT5cbiAgICAgICAgICAgICAgY29uc3QgY2FuSW5zZXJ0SW5saW5lQ29tcG9uZW50ID0gc2xvdC5zY2hlbWEuaW5jbHVkZXMoQ29udGVudFR5cGUuSW5saW5lQ29tcG9uZW50KVxuICAgICAgICAgICAgICBjb25zdCBjb21wb25lbnQgPSB0aGlzLmNyZWF0ZUNvbXBvbmVudEJ5U2hhcmVkQ29tcG9uZW50KHNoYXJlZENvbXBvbmVudCwgY2FuSW5zZXJ0SW5saW5lQ29tcG9uZW50KVxuICAgICAgICAgICAgICB0aGlzLnN5bmNTbG90cyhzaGFyZWRDb21wb25lbnQuZ2V0KCdzbG90cycpLCBjb21wb25lbnQpXG4gICAgICAgICAgICAgIHRoaXMuc3luY0NvbXBvbmVudChzaGFyZWRDb21wb25lbnQsIGNvbXBvbmVudClcbiAgICAgICAgICAgICAgc2xvdC5pbnNlcnQoY29tcG9uZW50KVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHRoaXMuc2VsZWN0aW9uLmlzU2VsZWN0ZWQpIHtcbiAgICAgICAgICAgICAgaWYgKHNsb3QgPT09IHRoaXMuc2VsZWN0aW9uLmFuY2hvclNsb3QgJiYgdGhpcy5zZWxlY3Rpb24uYW5jaG9yT2Zmc2V0ISA+IGluZGV4KSB7XG4gICAgICAgICAgICAgICAgdGhpcy5zZWxlY3Rpb24uc2V0QW5jaG9yKHNsb3QsIHRoaXMuc2VsZWN0aW9uLmFuY2hvck9mZnNldCEgKyBsZW5ndGgpXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgaWYgKHNsb3QgPT09IHRoaXMuc2VsZWN0aW9uLmZvY3VzU2xvdCAmJiB0aGlzLnNlbGVjdGlvbi5mb2N1c09mZnNldCEgPiBpbmRleCkge1xuICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0aW9uLnNldEZvY3VzKHNsb3QsIHRoaXMuc2VsZWN0aW9uLmZvY3VzT2Zmc2V0ISArIGxlbmd0aClcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSBpZiAoYWN0aW9uLmRlbGV0ZSkge1xuICAgICAgICAgICAgY29uc3QgaW5kZXggPSBzbG90LmluZGV4XG4gICAgICAgICAgICBzbG90LnJldGFpbihzbG90LmluZGV4KVxuICAgICAgICAgICAgc2xvdC5kZWxldGUoYWN0aW9uLmRlbGV0ZSlcbiAgICAgICAgICAgIGlmICh0aGlzLnNlbGVjdGlvbi5pc1NlbGVjdGVkKSB7XG4gICAgICAgICAgICAgIGlmIChzbG90ID09PSB0aGlzLnNlbGVjdGlvbi5hbmNob3JTbG90ICYmIHRoaXMuc2VsZWN0aW9uLmFuY2hvck9mZnNldCEgPj0gaW5kZXgpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdGlvbi5zZXRBbmNob3Ioc2xvdCwgdGhpcy5zZWxlY3Rpb24uc3RhcnRPZmZzZXQhIC0gYWN0aW9uLmRlbGV0ZSlcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBpZiAoc2xvdCA9PT0gdGhpcy5zZWxlY3Rpb24uZm9jdXNTbG90ICYmIHRoaXMuc2VsZWN0aW9uLmZvY3VzT2Zmc2V0ISA+PSBpbmRleCkge1xuICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0aW9uLnNldEZvY3VzKHNsb3QsIHRoaXMuc2VsZWN0aW9uLmZvY3VzT2Zmc2V0ISAtIGFjdGlvbi5kZWxldGUpXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGVsc2UgaWYgKGFjdGlvbi5hdHRyaWJ1dGVzKSB7XG4gICAgICAgICAgICBzbG90LnVwZGF0ZVN0YXRlKGRyYWZ0ID0+IHtcbiAgICAgICAgICAgICAgaWYgKHR5cGVvZiBkcmFmdCA9PT0gJ29iamVjdCcgJiYgZHJhZnQgIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICBPYmplY3QuYXNzaWduKGRyYWZ0LCBhY3Rpb24uYXR0cmlidXRlcylcbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gYWN0aW9uLmF0dHJpYnV0ZXNcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSlcbiAgICAgICAgICB9XG4gICAgICAgIH0pXG4gICAgICB9KVxuICAgIH1cbiAgICBjb250ZW50Lm9ic2VydmUoc3luY1JlbW90ZSlcblxuICAgIGNvbnN0IHN1YiA9IHNsb3Qub25Db250ZW50Q2hhbmdlLnN1YnNjcmliZShhY3Rpb25zID0+IHtcbiAgICAgIHRoaXMucnVuTG9jYWxVcGRhdGUoKCkgPT4ge1xuICAgICAgICBsZXQgb2Zmc2V0ID0gMFxuICAgICAgICBsZXQgbGVuZ3RoID0gMFxuICAgICAgICBmb3IgKGNvbnN0IGFjdGlvbiBvZiBhY3Rpb25zKSB7XG4gICAgICAgICAgaWYgKGFjdGlvbi50eXBlID09PSAncmV0YWluJykge1xuICAgICAgICAgICAgY29uc3QgZm9ybWF0cyA9IGFjdGlvbi5mb3JtYXRzXG4gICAgICAgICAgICBpZiAoZm9ybWF0cykge1xuICAgICAgICAgICAgICBjb25zdCBrZXlzID0gT2JqZWN0LmtleXMoZm9ybWF0cylcbiAgICAgICAgICAgICAgbGV0IGxlbmd0aCA9IGtleXMubGVuZ3RoXG4gICAgICAgICAgICAgIGtleXMuZm9yRWFjaChrZXkgPT4ge1xuICAgICAgICAgICAgICAgIGlmICghdGhpcy5yZWdpc3RyeS5nZXRGb3JtYXR0ZXIoa2V5KSkge1xuICAgICAgICAgICAgICAgICAgbGVuZ3RoLS1cbiAgICAgICAgICAgICAgICAgIFJlZmxlY3QuZGVsZXRlUHJvcGVydHkoZm9ybWF0cywga2V5KVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgaWYgKGxlbmd0aCkge1xuICAgICAgICAgICAgICAgIGNvbnRlbnQuZm9ybWF0KG9mZnNldCwgYWN0aW9uLm9mZnNldCwgZm9ybWF0cylcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgb2Zmc2V0ID0gYWN0aW9uLm9mZnNldFxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSBpZiAoYWN0aW9uLnR5cGUgPT09ICdpbnNlcnQnKSB7XG4gICAgICAgICAgICBjb25zdCBkZWx0YSA9IGNvbnRlbnQudG9EZWx0YSgpXG4gICAgICAgICAgICBjb25zdCBpc0VtcHR5ID0gZGVsdGEubGVuZ3RoID09PSAxICYmIGRlbHRhWzBdLmluc2VydCA9PT0gU2xvdC5lbXB0eVBsYWNlaG9sZGVyXG4gICAgICAgICAgICBpZiAodHlwZW9mIGFjdGlvbi5jb250ZW50ID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgICBsZW5ndGggPSBhY3Rpb24uY29udGVudC5sZW5ndGhcbiAgICAgICAgICAgICAgY29udGVudC5pbnNlcnQob2Zmc2V0LCBhY3Rpb24uY29udGVudCwgYWN0aW9uLmZvcm1hdHMgfHwge30pXG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBsZW5ndGggPSAxXG4gICAgICAgICAgICAgIGNvbnN0IHNoYXJlZENvbXBvbmVudCA9IHRoaXMuY3JlYXRlU2hhcmVkQ29tcG9uZW50QnlDb21wb25lbnQoYWN0aW9uLnJlZiBhcyBDb21wb25lbnRJbnN0YW5jZSlcbiAgICAgICAgICAgICAgY29udGVudC5pbnNlcnRFbWJlZChvZmZzZXQsIHNoYXJlZENvbXBvbmVudClcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKGlzRW1wdHkgJiYgb2Zmc2V0ID09PSAwKSB7XG4gICAgICAgICAgICAgIGNvbnRlbnQuZGVsZXRlKGNvbnRlbnQubGVuZ3RoIC0gMSwgMSlcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIG9mZnNldCArPSBsZW5ndGhcbiAgICAgICAgICB9IGVsc2UgaWYgKGFjdGlvbi50eXBlID09PSAnZGVsZXRlJykge1xuICAgICAgICAgICAgY29uc3QgZGVsdGEgPSBjb250ZW50LnRvRGVsdGEoKVxuICAgICAgICAgICAgaWYgKGNvbnRlbnQubGVuZ3RoKSB7XG4gICAgICAgICAgICAgIGNvbnRlbnQuZGVsZXRlKG9mZnNldCwgYWN0aW9uLmNvdW50KVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGNvbnRlbnQubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICAgIGNvbnRlbnQuaW5zZXJ0KDAsICdcXG4nLCBkZWx0YVswXT8uYXR0cmlidXRlcylcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgfSlcblxuICAgIHN1Yi5hZGQoc2xvdC5vbkNoaWxkQ29tcG9uZW50UmVtb3ZlLnN1YnNjcmliZShjb21wb25lbnRzID0+IHtcbiAgICAgIGNvbXBvbmVudHMuZm9yRWFjaChjID0+IHtcbiAgICAgICAgdGhpcy5jbGVhblN1YnNjcmlwdGlvbnNCeUNvbXBvbmVudChjKVxuICAgICAgfSlcbiAgICB9KSlcbiAgICB0aGlzLmNvbnRlbnRTeW5jQ2FjaGVzLnNldChzbG90LCAoKSA9PiB7XG4gICAgICBjb250ZW50LnVub2JzZXJ2ZShzeW5jUmVtb3RlKVxuICAgICAgc3ViLnVuc3Vic2NyaWJlKClcbiAgICB9KVxuICB9XG5cbiAgcHJpdmF0ZSBzeW5jU2xvdChyZW1vdGVTbG90OiBZTWFwPGFueT4sIHNsb3Q6IFNsb3QpIHtcbiAgICBjb25zdCBzeW5jUmVtb3RlID0gKGV2LCB0cikgPT4ge1xuICAgICAgdGhpcy5ydW5SZW1vdGVVcGRhdGUodHIsICgpID0+IHtcbiAgICAgICAgZXYua2V5c0NoYW5nZWQuZm9yRWFjaChrZXkgPT4ge1xuICAgICAgICAgIGlmIChrZXkgPT09ICdzdGF0ZScpIHtcbiAgICAgICAgICAgIGNvbnN0IHN0YXRlID0gKGV2LnRhcmdldCBhcyBZTWFwPGFueT4pLmdldCgnc3RhdGUnKVxuICAgICAgICAgICAgc2xvdC51cGRhdGVTdGF0ZShkcmFmdCA9PiB7XG4gICAgICAgICAgICAgIGlmICh0eXBlb2YgZHJhZnQgPT09ICdvYmplY3QnICYmIGRyYWZ0ICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgT2JqZWN0LmFzc2lnbihkcmFmdCwgc3RhdGUpXG4gICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHN0YXRlXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgfVxuICAgICAgICB9KVxuICAgICAgfSlcbiAgICB9XG4gICAgcmVtb3RlU2xvdC5vYnNlcnZlKHN5bmNSZW1vdGUpXG5cbiAgICBjb25zdCBzdWIgPSBzbG90Lm9uU3RhdGVDaGFuZ2Uuc3Vic2NyaWJlKGFjdGlvbnMgPT4ge1xuICAgICAgdGhpcy5ydW5Mb2NhbFVwZGF0ZSgoKSA9PiB7XG4gICAgICAgIGFjdGlvbnMuZm9yRWFjaChhY3Rpb24gPT4ge1xuICAgICAgICAgIHJlbW90ZVNsb3Quc2V0KCdzdGF0ZScsIGFjdGlvbi52YWx1ZSlcbiAgICAgICAgfSlcbiAgICAgIH0pXG4gICAgfSlcbiAgICB0aGlzLnNsb3RTdGF0ZVN5bmNDYWNoZXMuc2V0KHNsb3QsICgpID0+IHtcbiAgICAgIHJlbW90ZVNsb3QudW5vYnNlcnZlKHN5bmNSZW1vdGUpXG4gICAgICBzdWIudW5zdWJzY3JpYmUoKVxuICAgIH0pXG4gIH1cblxuICBwcml2YXRlIHN5bmNTbG90cyhyZW1vdGVTbG90czogWUFycmF5PGFueT4sIGNvbXBvbmVudDogQ29tcG9uZW50SW5zdGFuY2UpIHtcbiAgICBjb25zdCBzbG90cyA9IGNvbXBvbmVudC5zbG90c1xuICAgIGNvbnN0IHN5bmNSZW1vdGUgPSAoZXYsIHRyKSA9PiB7XG4gICAgICB0aGlzLnJ1blJlbW90ZVVwZGF0ZSh0ciwgKCkgPT4ge1xuICAgICAgICBsZXQgaW5kZXggPSAwXG4gICAgICAgIGV2LmRlbHRhLmZvckVhY2goYWN0aW9uID0+IHtcbiAgICAgICAgICBpZiAoUmVmbGVjdC5oYXMoYWN0aW9uLCAncmV0YWluJykpIHtcbiAgICAgICAgICAgIGluZGV4ICs9IGFjdGlvbi5yZXRhaW5cbiAgICAgICAgICAgIHNsb3RzLnJldGFpbihpbmRleClcbiAgICAgICAgICB9IGVsc2UgaWYgKGFjdGlvbi5pbnNlcnQpIHtcbiAgICAgICAgICAgIChhY3Rpb24uaW5zZXJ0IGFzIEFycmF5PFlNYXA8YW55Pj4pLmZvckVhY2goaXRlbSA9PiB7XG4gICAgICAgICAgICAgIGNvbnN0IHNsb3QgPSB0aGlzLmNyZWF0ZVNsb3RCeVNoYXJlZFNsb3QoaXRlbSlcbiAgICAgICAgICAgICAgc2xvdHMuaW5zZXJ0KHNsb3QpXG4gICAgICAgICAgICAgIHRoaXMuc3luY0NvbnRlbnQoaXRlbS5nZXQoJ2NvbnRlbnQnKSwgc2xvdClcbiAgICAgICAgICAgICAgdGhpcy5zeW5jU2xvdChpdGVtLCBzbG90KVxuICAgICAgICAgICAgICBpbmRleCsrXG4gICAgICAgICAgICB9KVxuICAgICAgICAgIH0gZWxzZSBpZiAoYWN0aW9uLmRlbGV0ZSkge1xuICAgICAgICAgICAgc2xvdHMucmV0YWluKGluZGV4KVxuICAgICAgICAgICAgc2xvdHMuZGVsZXRlKGFjdGlvbi5kZWxldGUpXG4gICAgICAgICAgfVxuICAgICAgICB9KVxuICAgICAgfSlcbiAgICB9XG4gICAgcmVtb3RlU2xvdHMub2JzZXJ2ZShzeW5jUmVtb3RlKVxuXG4gICAgY29uc3Qgc3ViID0gc2xvdHMub25DaGFuZ2Uuc3Vic2NyaWJlKG9wZXJhdGlvbnMgPT4ge1xuICAgICAgdGhpcy5ydW5Mb2NhbFVwZGF0ZSgoKSA9PiB7XG4gICAgICAgIGNvbnN0IGFwcGx5QWN0aW9ucyA9IG9wZXJhdGlvbnMuYXBwbHlcbiAgICAgICAgbGV0IGluZGV4OiBudW1iZXJcbiAgICAgICAgYXBwbHlBY3Rpb25zLmZvckVhY2goYWN0aW9uID0+IHtcbiAgICAgICAgICBpZiAoYWN0aW9uLnR5cGUgPT09ICdyZXRhaW4nKSB7XG4gICAgICAgICAgICBpbmRleCA9IGFjdGlvbi5vZmZzZXRcbiAgICAgICAgICB9IGVsc2UgaWYgKGFjdGlvbi50eXBlID09PSAnaW5zZXJ0U2xvdCcpIHtcbiAgICAgICAgICAgIGNvbnN0IHNoYXJlZFNsb3QgPSB0aGlzLmNyZWF0ZVNoYXJlZFNsb3RCeVNsb3QoYWN0aW9uLnJlZilcbiAgICAgICAgICAgIHJlbW90ZVNsb3RzLmluc2VydChpbmRleCwgW3NoYXJlZFNsb3RdKVxuICAgICAgICAgICAgaW5kZXgrK1xuICAgICAgICAgIH0gZWxzZSBpZiAoYWN0aW9uLnR5cGUgPT09ICdkZWxldGUnKSB7XG4gICAgICAgICAgICByZW1vdGVTbG90cy5kZWxldGUoaW5kZXgsIGFjdGlvbi5jb3VudClcbiAgICAgICAgICB9XG4gICAgICAgIH0pXG4gICAgICB9KVxuICAgIH0pXG5cbiAgICBzdWIuYWRkKHNsb3RzLm9uQ2hpbGRTbG90UmVtb3ZlLnN1YnNjcmliZShzbG90cyA9PiB7XG4gICAgICBzbG90cy5mb3JFYWNoKHNsb3QgPT4ge1xuICAgICAgICB0aGlzLmNsZWFuU3Vic2NyaXB0aW9uc0J5U2xvdChzbG90KVxuICAgICAgfSlcbiAgICB9KSlcblxuICAgIHRoaXMuc2xvdHNTeW5jQ2FjaGVzLnNldChjb21wb25lbnQsICgpID0+IHtcbiAgICAgIHJlbW90ZVNsb3RzLnVub2JzZXJ2ZShzeW5jUmVtb3RlKVxuICAgICAgc3ViLnVuc3Vic2NyaWJlKClcbiAgICB9KVxuICB9XG5cbiAgcHJpdmF0ZSBzeW5jQ29tcG9uZW50KHJlbW90ZUNvbXBvbmVudDogWU1hcDxhbnk+LCBjb21wb25lbnQ6IENvbXBvbmVudEluc3RhbmNlKSB7XG4gICAgY29uc3Qgc3luY1JlbW90ZSA9IChldiwgdHIpID0+IHtcbiAgICAgIHRoaXMucnVuUmVtb3RlVXBkYXRlKHRyLCAoKSA9PiB7XG4gICAgICAgIGV2LmtleXNDaGFuZ2VkLmZvckVhY2goa2V5ID0+IHtcbiAgICAgICAgICBpZiAoa2V5ID09PSAnc3RhdGUnKSB7XG4gICAgICAgICAgICBjb25zdCBzdGF0ZSA9IChldi50YXJnZXQgYXMgWU1hcDxhbnk+KS5nZXQoJ3N0YXRlJylcbiAgICAgICAgICAgIGNvbXBvbmVudC51cGRhdGVTdGF0ZShkcmFmdCA9PiB7XG4gICAgICAgICAgICAgIGlmICh0eXBlb2YgZHJhZnQgPT09ICdvYmplY3QnICYmIGRyYWZ0ICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgT2JqZWN0LmFzc2lnbihkcmFmdCwgc3RhdGUpXG4gICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHN0YXRlXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgfVxuICAgICAgICB9KVxuICAgICAgfSlcbiAgICB9XG4gICAgcmVtb3RlQ29tcG9uZW50Lm9ic2VydmUoc3luY1JlbW90ZSlcblxuICAgIGNvbnN0IHN1YiA9IGNvbXBvbmVudC5vblN0YXRlQ2hhbmdlLnN1YnNjcmliZShuZXdTdGF0ZSA9PiB7XG4gICAgICB0aGlzLnJ1bkxvY2FsVXBkYXRlKCgpID0+IHtcbiAgICAgICAgcmVtb3RlQ29tcG9uZW50LnNldCgnc3RhdGUnLCBuZXdTdGF0ZSlcbiAgICAgIH0pXG4gICAgfSlcbiAgICB0aGlzLmNvbXBvbmVudFN0YXRlU3luY0NhY2hlcy5zZXQoY29tcG9uZW50LCAoKSA9PiB7XG4gICAgICByZW1vdGVDb21wb25lbnQudW5vYnNlcnZlKHN5bmNSZW1vdGUpXG4gICAgICBzdWIudW5zdWJzY3JpYmUoKVxuICAgIH0pXG4gIH1cblxuICBwcml2YXRlIHJ1bkxvY2FsVXBkYXRlKGZuOiAoKSA9PiB2b2lkKSB7XG4gICAgaWYgKHRoaXMudXBkYXRlRnJvbVJlbW90ZSB8fCB0aGlzLmNvbnRyb2xsZXIucmVhZG9ubHkpIHtcbiAgICAgIHJldHVyblxuICAgIH1cbiAgICB0aGlzLnVwZGF0ZVJlbW90ZUFjdGlvbnMucHVzaChmbilcbiAgfVxuXG4gIHByaXZhdGUgcnVuUmVtb3RlVXBkYXRlKHRyOiBUcmFuc2FjdGlvbiwgZm46ICgpID0+IHZvaWQpIHtcbiAgICBpZiAodHIub3JpZ2luID09PSB0aGlzLnlEb2MpIHtcbiAgICAgIHJldHVyblxuICAgIH1cbiAgICB0aGlzLnVwZGF0ZUZyb21SZW1vdGUgPSB0cnVlXG4gICAgaWYgKHRyLm9yaWdpbiA9PT0gdGhpcy5tYW5hZ2VyKSB7XG4gICAgICB0aGlzLnNjaGVkdWxlci5oaXN0b3J5QXBwbHlUcmFuc2FjdChmbilcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5zY2hlZHVsZXIucmVtb3RlVXBkYXRlVHJhbnNhY3QoZm4pXG4gICAgfVxuICAgIHRoaXMudXBkYXRlRnJvbVJlbW90ZSA9IGZhbHNlXG4gIH1cblxuICBwcml2YXRlIGNyZWF0ZVNoYXJlZENvbXBvbmVudEJ5Q29tcG9uZW50KGNvbXBvbmVudDogQ29tcG9uZW50SW5zdGFuY2UpOiBZTWFwPGFueT4ge1xuICAgIGNvbnN0IHNoYXJlZENvbXBvbmVudCA9IG5ldyBZTWFwKClcbiAgICBzaGFyZWRDb21wb25lbnQuc2V0KCdzdGF0ZScsIGNvbXBvbmVudC5zdGF0ZSlcbiAgICBzaGFyZWRDb21wb25lbnQuc2V0KCduYW1lJywgY29tcG9uZW50Lm5hbWUpXG4gICAgY29uc3Qgc2hhcmVkU2xvdHMgPSBuZXcgWUFycmF5KClcbiAgICBzaGFyZWRDb21wb25lbnQuc2V0KCdzbG90cycsIHNoYXJlZFNsb3RzKVxuICAgIGNvbXBvbmVudC5zbG90cy50b0FycmF5KCkuZm9yRWFjaChzbG90ID0+IHtcbiAgICAgIGNvbnN0IHNoYXJlZFNsb3QgPSB0aGlzLmNyZWF0ZVNoYXJlZFNsb3RCeVNsb3Qoc2xvdClcbiAgICAgIHNoYXJlZFNsb3RzLnB1c2goW3NoYXJlZFNsb3RdKVxuICAgIH0pXG4gICAgdGhpcy5zeW5jU2xvdHMoc2hhcmVkU2xvdHMsIGNvbXBvbmVudClcbiAgICB0aGlzLnN5bmNDb21wb25lbnQoc2hhcmVkQ29tcG9uZW50LCBjb21wb25lbnQpXG4gICAgcmV0dXJuIHNoYXJlZENvbXBvbmVudFxuICB9XG5cbiAgcHJpdmF0ZSBjcmVhdGVTaGFyZWRTbG90QnlTbG90KHNsb3Q6IFNsb3QpOiBZTWFwPGFueT4ge1xuICAgIGNvbnN0IHNoYXJlZFNsb3QgPSBuZXcgWU1hcCgpXG4gICAgc2hhcmVkU2xvdC5zZXQoJ3NjaGVtYScsIHNsb3Quc2NoZW1hKVxuICAgIHNoYXJlZFNsb3Quc2V0KCdzdGF0ZScsIHNsb3Quc3RhdGUpXG4gICAgY29uc3Qgc2hhcmVkQ29udGVudCA9IG5ldyBZVGV4dCgpXG4gICAgc2hhcmVkU2xvdC5zZXQoJ2NvbnRlbnQnLCBzaGFyZWRDb250ZW50KVxuICAgIGxldCBvZmZzZXQgPSAwXG4gICAgc2xvdC50b0RlbHRhKCkuZm9yRWFjaChpID0+IHtcbiAgICAgIGxldCBmb3JtYXRzOiBhbnkgPSB7fVxuICAgICAgaWYgKGkuZm9ybWF0cykge1xuICAgICAgICBpLmZvcm1hdHMuZm9yRWFjaChpdGVtID0+IHtcbiAgICAgICAgICBmb3JtYXRzW2l0ZW1bMF0ubmFtZV0gPSBpdGVtWzFdXG4gICAgICAgIH0pXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBmb3JtYXRzID0gbnVsbFxuICAgICAgfVxuICAgICAgaWYgKHR5cGVvZiBpLmluc2VydCA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgc2hhcmVkQ29udGVudC5pbnNlcnQob2Zmc2V0LCBpLmluc2VydCwgZm9ybWF0cylcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IHNoYXJlZENvbXBvbmVudCA9IHRoaXMuY3JlYXRlU2hhcmVkQ29tcG9uZW50QnlDb21wb25lbnQoaS5pbnNlcnQpXG4gICAgICAgIHNoYXJlZENvbnRlbnQuaW5zZXJ0RW1iZWQob2Zmc2V0LCBzaGFyZWRDb21wb25lbnQsIGZvcm1hdHMpXG4gICAgICB9XG4gICAgICBvZmZzZXQgKz0gaS5pbnNlcnQubGVuZ3RoXG4gICAgfSlcbiAgICB0aGlzLnN5bmNDb250ZW50KHNoYXJlZENvbnRlbnQsIHNsb3QpXG4gICAgdGhpcy5zeW5jU2xvdChzaGFyZWRTbG90LCBzbG90KVxuICAgIHJldHVybiBzaGFyZWRTbG90XG4gIH1cblxuICBwcml2YXRlIGNyZWF0ZUNvbXBvbmVudEJ5U2hhcmVkQ29tcG9uZW50KHlNYXA6IFlNYXA8YW55PiwgY2FuSW5zZXJ0SW5saW5lQ29tcG9uZW50OiBib29sZWFuKTogQ29tcG9uZW50SW5zdGFuY2Uge1xuICAgIGNvbnN0IHNoYXJlZFNsb3RzID0geU1hcC5nZXQoJ3Nsb3RzJykgYXMgWUFycmF5PFlNYXA8YW55Pj5cbiAgICBjb25zdCBzbG90czogU2xvdFtdID0gW11cbiAgICBzaGFyZWRTbG90cy5mb3JFYWNoKHNoYXJlZFNsb3QgPT4ge1xuICAgICAgY29uc3Qgc2xvdCA9IHRoaXMuY3JlYXRlU2xvdEJ5U2hhcmVkU2xvdChzaGFyZWRTbG90KVxuICAgICAgc2xvdHMucHVzaChzbG90KVxuICAgIH0pXG4gICAgY29uc3QgbmFtZSA9IHlNYXAuZ2V0KCduYW1lJylcbiAgICBjb25zdCBzdGF0ZSA9IHlNYXAuZ2V0KCdzdGF0ZScpXG4gICAgbGV0IGluc3RhbmNlID0gdGhpcy50cmFuc2xhdG9yLmNyZWF0ZUNvbXBvbmVudEJ5RGF0YShuYW1lLCB7XG4gICAgICBzdGF0ZSxcbiAgICAgIHNsb3RzXG4gICAgfSlcbiAgICBpZiAoIWluc3RhbmNlKSB7XG4gICAgICBpbnN0YW5jZSA9IHRoaXMudHJhbnNsYXRvckZhbGxiYWNrLmNyZWF0ZUNvbXBvbmVudEJ5RGF0YShuYW1lLCB7XG4gICAgICAgIHN0YXRlLFxuICAgICAgICBzbG90c1xuICAgICAgfSlcbiAgICB9XG4gICAgaWYgKGluc3RhbmNlKSB7XG4gICAgICBpbnN0YW5jZS5zbG90cy50b0FycmF5KCkuZm9yRWFjaCgoc2xvdCwgaW5kZXgpID0+IHtcbiAgICAgICAgbGV0IHNoYXJlZFNsb3QgPSBzaGFyZWRTbG90cy5nZXQoaW5kZXgpXG4gICAgICAgIGlmICghc2hhcmVkU2xvdCkge1xuICAgICAgICAgIHNoYXJlZFNsb3QgPSB0aGlzLmNyZWF0ZVNoYXJlZFNsb3RCeVNsb3Qoc2xvdClcbiAgICAgICAgICBzaGFyZWRTbG90cy5wdXNoKFtzaGFyZWRTbG90XSlcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnN5bmNTbG90KHNoYXJlZFNsb3QsIHNsb3QpXG4gICAgICAgIHRoaXMuc3luY0NvbnRlbnQoc2hhcmVkU2xvdC5nZXQoJ2NvbnRlbnQnKSwgc2xvdClcbiAgICAgIH0pXG4gICAgICByZXR1cm4gaW5zdGFuY2VcbiAgICB9XG4gICAgcmV0dXJuIGNyZWF0ZVVua25vd25Db21wb25lbnQobmFtZSwgY2FuSW5zZXJ0SW5saW5lQ29tcG9uZW50KS5jcmVhdGVJbnN0YW5jZSh0aGlzLnN0YXJ0ZXIpXG4gIH1cblxuICBwcml2YXRlIGNyZWF0ZVNsb3RCeVNoYXJlZFNsb3Qoc2hhcmVkU2xvdDogWU1hcDxhbnk+KTogU2xvdCB7XG4gICAgY29uc3QgY29udGVudCA9IHNoYXJlZFNsb3QuZ2V0KCdjb250ZW50JykgYXMgWVRleHRcbiAgICBjb25zdCBkZWx0YSA9IGNvbnRlbnQudG9EZWx0YSgpXG5cbiAgICBjb25zdCBzbG90ID0gdGhpcy50cmFuc2xhdG9yLmNyZWF0ZVNsb3Qoe1xuICAgICAgc2NoZW1hOiBzaGFyZWRTbG90LmdldCgnc2NoZW1hJyksXG4gICAgICBzdGF0ZTogc2hhcmVkU2xvdC5nZXQoJ3N0YXRlJyksXG4gICAgICBmb3JtYXRzOiB7fSxcbiAgICAgIGNvbnRlbnQ6IFtdXG4gICAgfSlcblxuICAgIGZvciAoY29uc3QgYWN0aW9uIG9mIGRlbHRhKSB7XG4gICAgICBpZiAoYWN0aW9uLmluc2VydCkge1xuICAgICAgICBpZiAodHlwZW9mIGFjdGlvbi5pbnNlcnQgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgc2xvdC5pbnNlcnQoYWN0aW9uLmluc2VydCwgbWFrZUZvcm1hdHModGhpcy5yZWdpc3RyeSwgYWN0aW9uLmF0dHJpYnV0ZXMpKVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNvbnN0IHNoYXJlZENvbXBvbmVudCA9IGFjdGlvbi5pbnNlcnQgYXMgWU1hcDxhbnk+XG4gICAgICAgICAgY29uc3QgY2FuSW5zZXJ0SW5saW5lQ29tcG9uZW50ID0gc2xvdC5zY2hlbWEuaW5jbHVkZXMoQ29udGVudFR5cGUuSW5saW5lQ29tcG9uZW50KVxuICAgICAgICAgIGNvbnN0IGNvbXBvbmVudCA9IHRoaXMuY3JlYXRlQ29tcG9uZW50QnlTaGFyZWRDb21wb25lbnQoc2hhcmVkQ29tcG9uZW50LCBjYW5JbnNlcnRJbmxpbmVDb21wb25lbnQpXG4gICAgICAgICAgc2xvdC5pbnNlcnQoY29tcG9uZW50KVxuICAgICAgICAgIHRoaXMuc3luY1Nsb3RzKHNoYXJlZENvbXBvbmVudC5nZXQoJ3Nsb3RzJyksIGNvbXBvbmVudClcbiAgICAgICAgICB0aGlzLnN5bmNDb21wb25lbnQoc2hhcmVkQ29tcG9uZW50LCBjb21wb25lbnQpXG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRocm93IGNvbGxhYm9yYXRlRXJyb3JGbigndW5leHBlY3RlZCBkZWx0YSBhY3Rpb24uJylcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHNsb3RcbiAgfVxuXG4gIHByaXZhdGUgY2xlYW5TdWJzY3JpcHRpb25zQnlTbG90KHNsb3Q6IFNsb3QpIHtcbiAgICB0aGlzLmNvbnRlbnRNYXAuZGVsZXRlKHNsb3QpO1xuICAgIFt0aGlzLmNvbnRlbnRTeW5jQ2FjaGVzLmdldChzbG90KSwgdGhpcy5zbG90U3RhdGVTeW5jQ2FjaGVzLmdldChzbG90KV0uZm9yRWFjaChmbiA9PiB7XG4gICAgICBpZiAoZm4pIHtcbiAgICAgICAgZm4oKVxuICAgICAgfVxuICAgIH0pXG4gICAgc2xvdC5zbGljZUNvbnRlbnQoKS5mb3JFYWNoKGkgPT4ge1xuICAgICAgaWYgKHR5cGVvZiBpICE9PSAnc3RyaW5nJykge1xuICAgICAgICB0aGlzLmNsZWFuU3Vic2NyaXB0aW9uc0J5Q29tcG9uZW50KGkpXG4gICAgICB9XG4gICAgfSlcbiAgfVxuXG4gIHByaXZhdGUgY2xlYW5TdWJzY3JpcHRpb25zQnlDb21wb25lbnQoY29tcG9uZW50OiBDb21wb25lbnRJbnN0YW5jZSkge1xuICAgIFt0aGlzLnNsb3RzU3luY0NhY2hlcy5nZXQoY29tcG9uZW50KSwgdGhpcy5jb21wb25lbnRTdGF0ZVN5bmNDYWNoZXMuZ2V0KGNvbXBvbmVudCldLmZvckVhY2goZm4gPT4ge1xuICAgICAgaWYgKGZuKSB7XG4gICAgICAgIGZuKClcbiAgICAgIH1cbiAgICB9KVxuICAgIGNvbXBvbmVudC5zbG90cy50b0FycmF5KCkuZm9yRWFjaChzbG90ID0+IHtcbiAgICAgIHRoaXMuY2xlYW5TdWJzY3JpcHRpb25zQnlTbG90KHNsb3QpXG4gICAgfSlcbiAgfVxufVxuXG5mdW5jdGlvbiBtYWtlRm9ybWF0cyhyZWdpc3RyeTogUmVnaXN0cnksIGF0dHJzPzogYW55KSB7XG4gIGNvbnN0IGZvcm1hdHM6IEZvcm1hdHMgPSBbXVxuICBpZiAoYXR0cnMpIHtcbiAgICBPYmplY3Qua2V5cyhhdHRycykuZm9yRWFjaChrZXkgPT4ge1xuICAgICAgY29uc3QgZm9ybWF0dGVyID0gcmVnaXN0cnkuZ2V0Rm9ybWF0dGVyKGtleSlcbiAgICAgIGlmIChmb3JtYXR0ZXIpIHtcbiAgICAgICAgZm9ybWF0cy5wdXNoKFtmb3JtYXR0ZXIsIGF0dHJzW2tleV1dKVxuICAgICAgfVxuICAgIH0pXG4gIH1cbiAgcmV0dXJuIGZvcm1hdHNcbn1cbiJdfQ==
|
717
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29sbGFib3JhdGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvY29sbGFib3JhdGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7O0FBQUEsT0FBTyxFQUFFLE1BQU0sRUFBRSxVQUFVLEVBQUUsUUFBUSxFQUFFLE1BQU0sV0FBVyxDQUFBO0FBQ3hELE9BQU8sRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLEdBQUcsRUFBYyxPQUFPLEVBQWdCLE1BQU0sZUFBZSxDQUFBO0FBQ3JGLE9BQU8sRUFDTCxZQUFZLEVBRVosV0FBVyxFQUFFLFVBQVUsRUFFZCxrQkFBa0IsRUFDM0IsU0FBUyxFQUNULFFBQVEsRUFDUixnQkFBZ0IsRUFDaEIsU0FBUyxFQUNULFNBQVMsRUFFVCxJQUFJLEVBQ0osT0FBTyxFQUNQLFVBQVUsRUFDWCxNQUFNLGVBQWUsQ0FBQTtBQUN0QixPQUFPLEVBQ0wsS0FBSyxJQUFJLE1BQU0sRUFDZixHQUFHLElBQUksSUFBSSxFQUNYLEdBQUcsSUFBSSxJQUFJLEVBRVgsSUFBSSxJQUFJLEtBQUssRUFFYixXQUFXLEVBQ1gsMENBQTBDLEVBQzFDLG1DQUFtQyxFQUNwQyxNQUFNLEtBQUssQ0FBQTtBQUVaLE9BQU8sRUFBRSxpQkFBaUIsRUFBbUIsTUFBTSxzQkFBc0IsQ0FBQTtBQUN6RSxPQUFPLEVBQUUsc0JBQXNCLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQTtBQUU1RCxNQUFNLGtCQUFrQixHQUFHLFNBQVMsQ0FBQyxhQUFhLENBQUMsQ0FBQTtBQU9uRCxNQUFNLFVBQVU7SUFBaEI7UUFDVSxvQkFBZSxHQUFHLElBQUksT0FBTyxFQUFlLENBQUE7UUFDNUMsb0JBQWUsR0FBRyxJQUFJLE9BQU8sRUFBZSxDQUFBO0lBc0N0RCxDQUFDO0lBbENDLEdBQUcsQ0FBQyxHQUFRLEVBQUUsS0FBVTtRQUN0QixJQUFJLEdBQUcsWUFBWSxJQUFJLEVBQUU7WUFDdkIsSUFBSSxDQUFDLGVBQWUsQ0FBQyxHQUFHLENB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Q0FBQyxLQUFLLENBQUMsRUFBRTtvQkFDckIsTUFBTSxPQUFPLEdBQUksU0FBUyxDQUFDLHNCQUE4QixDQUFDLEtBQUssQ0FBQyxDQUFBO29CQUNoRSxNQUFNLENBQUMsR0FBRyxTQUFTLENBQUMsSUFBSSxJQUFJLE9BQU8sRUFBRSxDQUFDLEdBQUcsS0FBSyxDQUFBO2dCQUNoRCxDQUFDLENBQUMsQ0FBQTtnQkFDRixNQUFLO2FBQ047U0FDRjtRQUNELE1BQU0sQ0FBQyxHQUFHLENBQUMsR0FBRyxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUE7S0FDM0I7SUFDRCxPQUFPLE1BQU0sQ0FBQTtBQUNmLENBQUM7QUFFRCxTQUFTLFdBQVcsQ0FBQyxRQUFrQixFQUFFLEtBQVc7SUFDbEQsTUFBTSxPQUFPLEdBQVksRUFBRSxDQUFBO0lBQzNCLElBQUksS0FBSyxFQUFFO1FBQ1QsTUFBTSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLEVBQUU7WUFDL0IsTUFBTSxTQUFTLEdBQUcsUUFBUSxDQUFDLFlBQVksQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUE7WUFDMUQsSUFBSSxTQUFTLEVBQUU7Z0JBQ2IsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDLFNBQVMsRUFBRSxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFBO2FBQ3RDO1FBQ0gsQ0FBQyxDQUFDLENBQUE7S0FDSDtJQUNELE9BQU8sT0FBTyxDQUFBO0FBQ2hCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3QsIEluamVjdGFibGUsIE9wdGlvbmFsIH0gZnJvbSAnQHRhbmJvL2RpJ1xuaW1wb3J0IHsgZGVsYXksIGZpbHRlciwgbWFwLCBPYnNlcnZhYmxlLCBTdWJqZWN0LCBTdWJzY3JpcHRpb24gfSBmcm9tICdAdGFuYm8vc3RyZWFtJ1xuaW1wb3J0IHtcbiAgQ2hhbmdlT3JpZ2luLCBDb21wb25lbnRJbml0RGF0YSxcbiAgQ29tcG9uZW50SW5zdGFuY2UsXG4gIENvbnRlbnRUeXBlLCBDb250cm9sbGVyLFxuICBGb3JtYXRzLFxuICBIaXN0b3J5LCBISVNUT1JZX1NUQUNLX1NJWkUsXG4gIG1ha2VFcnJvcixcbiAgUmVnaXN0cnksXG4gIFJvb3RDb21wb25lbnRSZWYsXG4gIFNjaGVkdWxlcixcbiAgU2VsZWN0aW9uLFxuICBTZWxlY3Rpb25QYXRocyxcbiAgU2xvdCxcbiAgU3RhcnRlcixcbiAgVHJhbnNsYXRvclxufSBmcm9tICdAdGV4dGJ1cy9jb3JlJ1xuaW1wb3J0IHtcbiAgQXJyYXkgYXMgWUFycmF5LFxuICBEb2MgYXMgWURvYyxcbiAgTWFwIGFzIFlNYXAsXG4gIFJlbGF0aXZlUG9zaXRpb24sXG4gIFRleHQgYXMgWVRleHQsXG4gIFRyYW5zYWN0aW9uLFxuICBVbmRvTWFuYWdlcixcbiAgY3JlYXRlQWJzb2x1dGVQb3NpdGlvbkZyb21SZWxhdGl2ZVBvc2l0aW9uLFxuICBjcmVhdGVSZWxhdGl2ZVBvc2l0aW9uRnJvbVR5cGVJbmRleFxufSBmcm9tICd5anMnXG5cbmltcG9ydCB7IENvbGxhYm9yYXRlQ3Vyc29yLCBSZW1vdGVTZWxlY3Rpb24gfSBmcm9tICcuL2NvbGxhYm9yYXRlLWN1cnNvcidcbmltcG9ydCB7IGNyZWF0ZVVua25vd25Db21wb25lbnQgfSBmcm9tICcuL3Vua25vd24uY29tcG9uZW50J1xuXG5jb25zdCBjb2xsYWJvcmF0ZUVycm9yRm4gPSBtYWtlRXJyb3IoJ0NvbGxhYm9yYXRlJylcblxuaW50ZXJmYWNlIEN1cnNvclBvc2l0aW9uIHtcbiAgYW5jaG9yOiBSZWxhdGl2ZVBvc2l0aW9uXG4gIGZvY3VzOiBSZWxhdGl2ZVBvc2l0aW9uXG59XG5cbmNsYXNzIENvbnRlbnRNYXAge1xuICBwcml2YXRlIHNsb3RBbmRZVGV4dE1hcCA9IG5ldyBXZWFrTWFwPFNsb3QsIFlUZXh0PigpXG4gIHByaXZhdGUgeVRleHRBbmRTTG90TWFwID0gbmV3IFdlYWtNYXA8WVRleHQsIFNsb3Q+KClcblxuICBzZXQoa2V5OiBTbG90LCB2YWx1ZTogWVRleHQpOiB2b2lkXG4gIHNldChrZXk6IFlUZXh0LCB2YWx1ZTogU2xvdCk6IHZvaWRcbiAgc2V0KGtleTogYW55LCB2YWx1ZTogYW55KSB7XG4gICAgaWYgKGtleSBpbnN0YW5jZW9mIFNsb3QpIHtcbiAgICAgIHRoaXMuc2xvdEFuZFlUZXh0TWFwLnNldChrZXksIHZhbHVlKVxuICAgICAgdGhpcy55VGV4dEFuZFNMb3RNYXAuc2V0KHZhbHVlLCBrZXkpXG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuc2xvdEFuZFlUZXh0TWFwLnNldCh2YWx1ZSwga2V5KVxuICAgICAgdGhpcy55VGV4dEFuZFNMb3RNYXAuc2V0KGtleSwgdmFsdWUpXG4gICAgfVxuICB9XG5cbiAgZ2V0KGtleTogU2xvdCk6IFlUZXh0IHwgbnVsbFxuICBnZXQoa2V5OiBZVGV4dCk6IFNsb3QgfCBudWxsXG4gIGdldChrZXk6IGFueSkge1xuICAgIGlmIChrZXkgaW5zdGFuY2VvZiBTbG90KSB7XG4gICAgICByZXR1cm4gdGhpcy5zbG90QW5kWVRleHRNYXAuZ2V0KGtleSkgfHwgbnVsbFxuICAgIH1cbiAgICByZXR1cm4gdGhpcy55VGV4dEFuZFNMb3RNYXAuZ2V0KGtleSkgfHwgbnVsbFxuICB9XG5cbiAgZGVsZXRlKGtleTogU2xvdCB8IFlUZXh0KSB7XG4gICAgaWYgKGtleSBpbnN0YW5jZW9mIFNsb3QpIHtcbiAgICAgIGNvbnN0IHYgPSB0aGlzLnNsb3RBbmRZVGV4dE1hcC5nZXQoa2V5KVxuICAgICAgdGhpcy5zbG90QW5kWVRleHRNYXAuZGVsZXRlKGtleSlcbiAgICAgIGlmICh2KSB7XG4gICAgICAgIHRoaXMueVRleHRBbmRTTG90TWFwLmRlbGV0ZSh2KVxuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCB2ID0gdGhpcy55VGV4dEFuZFNMb3RNYXAuZ2V0KGtleSlcbiAgICAgIHRoaXMueVRleHRBbmRTTG90TWFwLmRlbGV0ZShrZXkpXG4gICAgICBpZiAodikge1xuICAgICAgICB0aGlzLnNsb3RBbmRZVGV4dE1hcC5kZWxldGUodilcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cblxuZXhwb3J0IGFic3RyYWN0IGNsYXNzIFRyYW5zbGF0b3JGYWxsYmFjayB7XG4gIGFic3RyYWN0IGNyZWF0ZUNvbXBvbmVudEJ5RGF0YShuYW1lOiBzdHJpbmcsIGRhdGE6IENvbXBvbmVudEluaXREYXRhKTogQ29tcG9uZW50SW5zdGFuY2UgfCBudWxsXG59XG5cbmludGVyZmFjZSBVcGRhdGUge1xuICByZWNvcmQ6IGJvb2xlYW5cbiAgYWN0aW9uczogQXJyYXk8KCkgPT4gdm9pZD5cbn1cblxuaW50ZXJmYWNlIFVwZGF0ZUl0ZW0ge1xuICByZWNvcmQ6IGJvb2xlYW5cblxuICBhY3Rpb24oKTogdm9pZFxufVxuXG5ASW5qZWN0YWJsZSgpXG5leHBvcnQgY2xhc3MgQ29sbGFib3JhdGUgaW1wbGVtZW50cyBIaXN0b3J5IHtcbiAgb25TZWxlY3Rpb25DaGFuZ2U6IE9ic2VydmFibGU8U2VsZWN0aW9uUGF0aHM+XG4gIHlEb2MgPSBuZXcgWURvYygpXG4gIG9uQmFjazogT2JzZXJ2YWJsZTx2b2lkPlxuICBvbkZvcndhcmQ6IE9ic2VydmFibGU8dm9pZD5cbiAgb25DaGFuZ2U6IE9ic2VydmFibGU8dm9pZD5cbiAgb25QdXNoOiBPYnNlcnZhYmxlPHZvaWQ+XG5cbiAgZ2V0IGNhbkJhY2soKSB7XG4gICAgcmV0dXJuIHRoaXMubWFuYWdlcj8uY2FuVW5kbygpIHx8IGZhbHNlXG4gIH1cblxuICBnZXQgY2FuRm9yd2FyZCgpIHtcbiAgICByZXR1cm4gdGhpcy5tYW5hZ2VyPy5jYW5SZWRvKCkgfHwgZmFsc2VcbiAgfVxuXG4gIHByaXZhdGUgYmFja0V2ZW50ID0gbmV3IFN1YmplY3Q8dm9pZD4oKVxuICBwcml2YXRlIGZvcndhcmRFdmVudCA9IG5ldyBTdWJqZWN0PHZvaWQ+KClcbiAgcHJpdmF0ZSBjaGFuZ2VFdmVudCA9IG5ldyBTdWJqZWN0PHZvaWQ+KClcbiAgcHJpdmF0ZSBwdXNoRXZlbnQgPSBuZXcgU3ViamVjdDx2b2lkPigpXG5cbiAgcHJpdmF0ZSBtYW5hZ2VyOiBVbmRvTWFuYWdlciB8IG51bGwgPSBudWxsXG5cbiAgcHJpdmF0ZSBzdWJzY3JpcHRpb25zOiBTdWJzY3JpcHRpb25bXSA9IFtdXG4gIHByaXZhdGUgdXBkYXRlRnJvbVJlbW90ZSA9IGZhbHNlXG5cbiAgcHJpdmF0ZSBjb250ZW50U3luY0NhY2hlcyA9IG5ldyBXZWFrTWFwPFNsb3QsICgpID0+IHZvaWQ+KClcbiAgcHJpdmF0ZSBzbG90U3RhdGVTeW5jQ2FjaGVzID0gbmV3IFdlYWtNYXA8U2xvdCwgKCkgPT4gdm9pZD4oKVxuICBwcml2YXRlIHNsb3RzU3luY0NhY2hlcyA9IG5ldyBXZWFrTWFwPENvbXBvbmVudEluc3RhbmNlLCAoKSA9PiB2b2lkPigpXG4gIHByaXZhdGUgY29tcG9uZW50U3RhdGVTeW5jQ2FjaGVzID0gbmV3IFdlYWtNYXA8Q29tcG9uZW50SW5zdGFuY2UsICgpID0+IHZvaWQ+KClcblxuICBwcml2YXRlIHNlbGVjdGlvbkNoYW5nZUV2ZW50ID0gbmV3IFN1YmplY3Q8U2VsZWN0aW9uUGF0aHM+KClcbiAgcHJpdmF0ZSBjb250ZW50TWFwID0gbmV3IENvbnRlbnRNYXAoKVxuXG4gIHByaXZhdGUgdXBkYXRlUmVtb3RlQWN0aW9uczogQXJyYXk8VXBkYXRlSXRlbT4gPSBbXVxuICBwcml2YXRlIG5vUmVjb3JkID0ge31cblxuICBjb25zdHJ1Y3RvcihASW5qZWN0KEhJU1RPUllfU1RBQ0tfU0laRSkgcHJpdmF0ZSBzdGFja1NpemU6IG51bWJlcixcbiAgICAgICAgICAgICAgcHJpdmF0ZSByb290Q29tcG9uZW50UmVmOiBSb290Q29tcG9uZW50UmVmLFxuICAgICAgICAgICAgICBwcml2YXRlIGNvbGxhYm9yYXRlQ3Vyc29yOiBDb2xsYWJvcmF0ZUN1cnNvcixcbiAgICAgICAgICAgICAgcHJpdmF0ZSBjb250cm9sbGVyOiBDb250cm9sbGVyLFxuICAgICAgICAgICAgICBwcml2YXRlIHNjaGVkdWxlcjogU2NoZWR1bGVyLFxuICAgICAgICAgICAgICBwcml2YXRlIHRyYW5zbGF0b3I6IFRyYW5zbGF0b3IsXG4gICAgICAgICAgICAgIHByaXZhdGUgcmVnaXN0cnk6IFJlZ2lzdHJ5LFxuICAgICAgICAgICAgICBwcml2YXRlIHNlbGVjdGlvbjogU2VsZWN0aW9uLFxuICAgICAgICAgICAgICBwcml2YXRlIHN0YXJ0ZXI6IFN0YXJ0ZXIsXG4gICAgICAgICAgICAgIEBPcHRpb25hbCgpIHByaXZhdGUgdHJhbnNsYXRvckZhbGxiYWNrOiBUcmFuc2xhdG9yRmFsbGJhY2spIHtcbiAgICB0aGlzLm9uU2VsZWN0aW9uQ2hhbmdlID0gdGhpcy5zZWxlY3Rpb25DaGFuZ2VFdmVudC5hc09ic2VydmFibGUoKS5waXBlKGRlbGF5KCkpXG4gICAgdGhpcy5vbkJhY2sgPSB0aGlzLmJhY2tFdmVudC5hc09ic2VydmFibGUoKVxuICAgIHRoaXMub25Gb3J3YXJkID0gdGhpcy5mb3J3YXJkRXZlbnQuYXNPYnNlcnZhYmxlKClcbiAgICB0aGlzLm9uQ2hhbmdlID0gdGhpcy5jaGFuZ2VFdmVudC5hc09ic2VydmFibGUoKVxuICAgIHRoaXMub25QdXNoID0gdGhpcy5wdXNoRXZlbnQuYXNPYnNlcnZhYmxlKClcbiAgfVxuXG4gIGxpc3RlbigpIHtcbiAgICBjb25zdCByb290ID0gdGhpcy55RG9jLmdldE1hcCgnUm9vdENvbXBvbmVudCcpXG4gICAgY29uc3Qgcm9vdENvbXBvbmVudCA9IHRoaXMucm9vdENvbXBvbmVudFJlZi5jb21wb25lbnQhXG4gICAgdGhpcy5tYW5hZ2VyID0gbmV3IFVuZG9NYW5hZ2VyKHJvb3QsIHtcbiAgICAgIHRyYWNrZWRPcmlnaW5zOiBuZXcgU2V0PGFueT4oW3RoaXMueURvY10pXG4gICAgfSlcbiAgICBjb25zdCBjdXJzb3JLZXkgPSAnY3Vyc29yLXBvc2l0aW9uJ1xuICAgIHRoaXMubWFuYWdlci5vbignc3RhY2staXRlbS1hZGRlZCcsIGV2ZW50ID0+IHtcbiAgICAgIGV2ZW50LnN0YWNrSXRlbS5tZXRhLnNldChjdXJzb3JLZXksIHRoaXMuZ2V0UmVsYXRpdmVDdXJzb3JMb2NhdGlvbigpKVxuICAgICAgaWYgKHRoaXMubWFuYWdlciEudW5kb1N0YWNrLmxlbmd0aCA+IHRoaXMuc3RhY2tTaXplKSB7XG4gICAgICAgIHRoaXMubWFuYWdlciEudW5kb1N0YWNrLnNoaWZ0KClcbiAgICAgIH1cbiAgICAgIGlmIChldmVudC5vcmlnaW4gPT09IHRoaXMueURvYykge1xuICAgICAgICB0aGlzLnB1c2hFdmVudC5uZXh0KClcbiAgICAgIH1cbiAgICAgIHRoaXMuY2hhbmdlRXZlbnQubmV4dCgpXG4gICAgfSlcbiAgICB0aGlzLm1hbmFnZXIub24oJ3N0YWNrLWl0ZW0tcG9wcGVkJywgZXZlbnQgPT4ge1xuICAgICAgY29uc3QgcG9zaXRpb24gPSBldmVudC5zdGFja0l0ZW0ubWV0YS5nZXQoY3Vyc29yS2V5KSBhcyBDdXJzb3JQb3NpdGlvblxuICAgICAgaWYgKHBvc2l0aW9uKSB7XG4gICAgICAgIHRoaXMucmVzdG9yZUN1cnNvckxvY2F0aW9uKHBvc2l0aW9uKVxuICAgICAgfVxuICAgIH0pXG4gICAgdGhpcy5zdWJzY3JpcHRpb25zLnB1c2goXG4gICAgICB0aGlzLnNlbGVjdGlvbi5vbkNoYW5nZS5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICBjb25zdCBwYXRocyA9IHRoaXMuc2VsZWN0aW9uLmdldFBhdGhzKClcbiAgICAgICAgdGhpcy5zZWxlY3Rpb25DaGFuZ2VFdmVudC5uZXh0KHBhdGhzKVxuICAgICAgfSksXG4gICAgICB0aGlzLnNjaGVkdWxlci5vbkRvY0NoYW5nZWQucGlwZShcbiAgICAgICAgbWFwKGl0ZW0gPT4ge1xuICAgICAgICAgIHJldHVybiBpdGVtLmZpbHRlcihpID0+IHtcbiAgICAgICAgICAgIHJldHVybiBpLmZyb20gIT09IENoYW5nZU9yaWdpbi5SZW1vdGVcbiAgICAgICAgICB9KVxuICAgICAgICB9KSxcbiAgICAgICAgZmlsdGVyKGl0ZW0gPT4ge1xuICAgICAgICAgIHJldHVybiBpdGVtLmxlbmd0aFxuICAgICAgICB9KVxuICAgICAgKS5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICBjb25zdCB1cGRhdGVzOiBVcGRhdGVbXSA9IFtdXG5cbiAgICAgICAgbGV0IHVwZGF0ZTogVXBkYXRlIHwgbnVsbCA9IG51bGxcblxuICAgICAgICBmb3IgKGNvbnN0IGl0ZW0gb2YgdGhpcy51cGRhdGVSZW1vdGVBY3Rpb25zKSB7XG4gICAgICAgICAgaWYgKCF1cGRhdGUpIHtcbiAgICAgICAgICAgIHVwZGF0ZSA9IHtcbiAgICAgICAgICAgICAgcmVjb3JkOiBpdGVtLnJlY29yZCxcbiAgICAgICAgICAgICAgYWN0aW9uczogW11cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHVwZGF0ZXMucHVzaCh1cGRhdGUpXG4gICAgICAgICAgfVxuICAgICAgICAgIGlmICh1cGRhdGUucmVjb3JkID09PSBpdGVtLnJlY29yZCkge1xuICAgICAgICAgICAgdXBkYXRlLmFjdGlvbnMucHVzaChpdGVtLmFjdGlvbilcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdXBkYXRlID0ge1xuICAgICAgICAgICAgICByZWNvcmQ6IGl0ZW0ucmVjb3JkLFxuICAgICAgICAgICAgICBhY3Rpb25zOiBbaXRlbS5hY3Rpb25dXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB1cGRhdGVzLnB1c2godXBkYXRlKVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMudXBkYXRlUmVtb3RlQWN0aW9ucyA9IFtdXG5cbiAgICAgICAgZm9yIChjb25zdCBpdGVtIG9mIHVwZGF0ZXMpIHtcbiAgICAgICAgICB0aGlzLnlEb2MudHJhbnNhY3QoKCkgPT4ge1xuICAgICAgICAgICAgaXRlbS5hY3Rpb25zLmZvckVhY2goZm4gPT4ge1xuICAgICAgICAgICAgICBmbigpXG4gICAgICAgICAgICB9KVxuICAgICAgICAgIH0sIGl0ZW0ucmVjb3JkID8gdGhpcy55RG9jIDogdGhpcy5ub1JlY29yZClcbiAgICAgICAgfVxuICAgICAgfSlcbiAgICApXG4gICAgdGhpcy5zeW5jUm9vdENvbXBvbmVudChyb290LCByb290Q29tcG9uZW50KVxuICB9XG5cbiAgdXBkYXRlUmVtb3RlU2VsZWN0aW9uKHBhdGhzOiBSZW1vdGVTZWxlY3Rpb25bXSkge1xuICAgIHRoaXMuY29sbGFib3JhdGVDdXJzb3IuZHJhdyhwYXRocylcbiAgfVxuXG4gIGJhY2soKSB7XG4gICAgaWYgKHRoaXMuY2FuQmFjaykge1xuICAgICAgdGhpcy5tYW5hZ2VyPy51bmRvKClcbiAgICAgIHRoaXMuYmFja0V2ZW50Lm5leHQoKVxuICAgIH1cbiAgfVxuXG4gIGZvcndhcmQoKSB7XG4gICAgaWYgKHRoaXMuY2FuRm9yd2FyZCkge1xuICAgICAgdGhpcy5tYW5hZ2VyPy5yZWRvKClcbiAgICAgIHRoaXMuZm9yd2FyZEV2ZW50Lm5leHQoKVxuICAgIH1cbiAgfVxuXG4gIGNsZWFyKCkge1xuICAgIHRoaXMubWFuYWdlcj8uY2xlYXIoKVxuICAgIHRoaXMuY2hhbmdlRXZlbnQubmV4dCgpXG4gIH1cblxuICBkZXN0cm95KCkge1xuICAgIHRoaXMuc3Vic2NyaXB0aW9ucy5mb3JFYWNoKGkgPT4gaS51bnN1YnNjcmliZSgpKVxuICAgIHRoaXMuY29sbGFib3JhdGVDdXJzb3IuZGVzdHJveSgpXG4gICAgdGhpcy5tYW5hZ2VyPy5kZXN0cm95KClcbiAgfVxuXG4gIHByaXZhdGUgc3luY1Jvb3RDb21wb25lbnQocm9vdDogWU1hcDxhbnk+LCByb290Q29tcG9uZW50OiBDb21wb25lbnRJbnN0YW5jZSkge1xuICAgIGxldCBzbG90cyA9IHJvb3QuZ2V0KCdzbG90cycpIGFzIFlBcnJheTxZTWFwPGFueT4+XG4gICAgaWYgKCFzbG90cykge1xuICAgICAgc2xvdHMgPSBuZXcgWUFycmF5KClcbiAgICAgIHJvb3RDb21wb25lbnQuc2xvdHMudG9BcnJheSgpLmZvckVhY2goaSA9PiB7XG4gICAgICAgIGNvbnN0IHNoYXJlZFNsb3QgPSB0aGlzLmNyZWF0ZVNoYXJlZFNsb3RCeVNsb3QoaSlcbiAgICAgICAgc2xvdHMucHVzaChbc2hhcmVkU2xvdF0pXG4gICAgICB9KVxuICAgICAgdGhpcy55RG9jLnRyYW5zYWN0KCgpID0+IHtcbiAgICAgICAgcm9vdC5zZXQoJ3N0YXRlJywgcm9vdENvbXBvbmVudC5zdGF0ZSlcbiAgICAgICAgcm9vdC5zZXQoJ3Nsb3RzJywgc2xvdHMpXG4gICAgICB9KVxuICAgIH0gZWxzZSBpZiAoc2xvdHMubGVuZ3RoID09PSAwKSB7XG4gICAgICByb290Q29tcG9uZW50LnVwZGF0ZVN0YXRlKCgpID0+IHtcbiAgICAgICAgcmV0dXJuIHJvb3QuZ2V0KCdzdGF0ZScpXG4gICAgICB9KVxuICAgICAgdGhpcy55RG9jLnRyYW5zYWN0KCgpID0+IHtcbiAgICAgICAgcm9vdENvbXBvbmVudC5zbG90cy50b0FycmF5KCkuZm9yRWFjaChpID0+IHtcbiAgICAgICAgICBjb25zdCBzaGFyZWRTbG90ID0gdGhpcy5jcmVhdGVTaGFyZWRTbG90QnlTbG90KGkpXG4gICAgICAgICAgc2xvdHMucHVzaChbc2hhcmVkU2xvdF0pXG4gICAgICAgIH0pXG4gICAgICB9KVxuICAgIH0gZWxzZSB7XG4gICAgICByb290Q29tcG9uZW50LnVwZGF0ZVN0YXRlKCgpID0+IHtcbiAgICAgICAgcmV0dXJuIHJvb3QuZ2V0KCdzdGF0ZScpXG4gICAgICB9KVxuICAgICAgcm9vdENvbXBvbmVudC5zbG90cy5jbGVhbigpXG4gICAgICBzbG90cy5mb3JFYWNoKHNoYXJlZFNsb3QgPT4ge1xuICAgICAgICBjb25zdCBzbG90ID0gdGhpcy5jcmVhdGVTbG90QnlTaGFyZWRTbG90KHNoYXJlZFNsb3QpXG4gICAgICAgIHRoaXMuc3luY0NvbnRlbnQoc2hhcmVkU2xvdC5nZXQoJ2NvbnRlbnQnKSwgc2xvdClcbiAgICAgICAgdGhpcy5zeW5jU2xvdChzaGFyZWRTbG90LCBzbG90KVxuICAgICAgICByb290Q29tcG9uZW50LnNsb3RzLmluc2VydChzbG90KVxuICAgICAgfSlcbiAgICB9XG4gICAgdGhpcy5zeW5jQ29tcG9uZW50KHJvb3QsIHJvb3RDb21wb25lbnQpXG4gICAgdGhpcy5zeW5jU2xvdHMoc2xvdHMsIHJvb3RDb21wb25lbnQpXG4gIH1cblxuICBwcml2YXRlIHJlc3RvcmVDdXJzb3JMb2NhdGlvbihwb3NpdGlvbjogQ3Vyc29yUG9zaXRpb24pIHtcbiAgICBjb25zdCBhbmNob3JQb3NpdGlvbiA9IGNyZWF0ZUFic29sdXRlUG9zaXRpb25Gcm9tUmVsYXRpdmVQb3NpdGlvbihwb3NpdGlvbi5hbmNob3IsIHRoaXMueURvYylcbiAgICBjb25zdCBmb2N1c1Bvc2l0aW9uID0gY3JlYXRlQWJzb2x1dGVQb3NpdGlvbkZyb21SZWxhdGl2ZVBvc2l0aW9uKHBvc2l0aW9uLmZvY3VzLCB0aGlzLnlEb2MpXG4gICAgaWYgKGFuY2hvclBvc2l0aW9uICYmIGZvY3VzUG9zaXRpb24pIHtcbiAgICAgIGNvbnN0IGZvY3VzU2xvdCA9IHRoaXMuY29udGVudE1hcC5nZXQoZm9jdXNQb3NpdGlvbi50eXBlIGFzIFlUZXh0KVxuICAgICAgY29uc3QgYW5jaG9yU2xvdCA9IHRoaXMuY29udGVudE1hcC5nZXQoYW5jaG9yUG9zaXRpb24udHlwZSBhcyBZVGV4dClcbiAgICAgIGlmIChmb2N1c1Nsb3QgJiYgYW5jaG9yU2xvdCkge1xuICAgICAgICB0aGlzLnNlbGVjdGlvbi5zZXRCYXNlQW5kRXh0ZW50KGFuY2hvclNsb3QsIGFuY2hvclBvc2l0aW9uLmluZGV4LCBmb2N1c1Nsb3QsIGZvY3VzUG9zaXRpb24uaW5kZXgpXG4gICAgICAgIHJldHVyblxuICAgICAgfVxuICAgIH1cbiAgICB0aGlzLnNlbGVjdGlvbi51blNlbGVjdCgpXG4gIH1cblxuICBwcml2YXRlIGdldFJlbGF0aXZlQ3Vyc29yTG9jYXRpb24oKTogQ3Vyc29yUG9zaXRpb24gfCBudWxsIHtcbiAgICBjb25zdCB7IGFuY2hvclNsb3QsIGFuY2hvck9mZnNldCwgZm9jdXNTbG90LCBmb2N1c09mZnNldCB9ID0gdGhpcy5zZWxlY3Rpb25cbiAgICBpZiAoYW5jaG9yU2xvdCkge1xuICAgICAgY29uc3QgYW5jaG9yWVRleHQgPSB0aGlzLmNvbnRlbnRNYXAuZ2V0KGFuY2hvclNsb3QpXG4gICAgICBpZiAoYW5jaG9yWVRleHQpIHtcbiAgICAgICAgY29uc3QgYW5jaG9yUG9zaXRpb24gPSBjcmVhdGVSZWxhdGl2ZVBvc2l0aW9uRnJvbVR5cGVJbmRleChhbmNob3JZVGV4dCwgYW5jaG9yT2Zmc2V0ISlcbiAgICAgICAgaWYgKGZvY3VzU2xvdCkge1xuICAgICAgICAgIGNvbnN0IGZvY3VzWVRleHQgPSB0aGlzLmNvbnRlbnRNYXAuZ2V0KGZvY3VzU2xvdClcbiAgICAgICAgICBpZiAoZm9jdXNZVGV4dCkge1xuICAgICAgICAgICAgY29uc3QgZm9jdXNQb3NpdGlvbiA9IGNyZWF0ZVJlbGF0aXZlUG9zaXRpb25Gcm9tVHlwZUluZGV4KGZvY3VzWVRleHQsIGZvY3VzT2Zmc2V0ISlcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgIGZvY3VzOiBmb2N1c1Bvc2l0aW9uLFxuICAgICAgICAgICAgICBhbmNob3I6IGFuY2hvclBvc2l0aW9uXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBudWxsXG4gIH1cblxuICBwcml2YXRlIHN5bmNDb250ZW50KGNvbnRlbnQ6IFlUZXh0LCBzbG90OiBTbG90KSB7XG4gICAgdGhpcy5jb250ZW50TWFwLnNldChzbG90LCBjb250ZW50KVxuICAgIGNvbnN0IHN5bmNSZW1vdGUgPSAoZXYsIHRyKSA9PiB7XG4gICAgICB0aGlzLnJ1blJlbW90ZVVwZGF0ZSh0ciwgKCkgPT4ge1xuICAgICAgICBzbG90LnJldGFpbigwKVxuICAgICAgICBldi5kZWx0YS5mb3JFYWNoKGFjdGlvbiA9PiB7XG4gICAgICAgICAgaWYgKFJlZmxlY3QuaGFzKGFjdGlvbiwgJ3JldGFpbicpKSB7XG4gICAgICAgICAgICBpZiAoYWN0aW9uLmF0dHJpYnV0ZXMpIHtcbiAgICAgICAgICAgICAgY29uc3QgZm9ybWF0cyA9IG1ha2VGb3JtYXRzKHRoaXMucmVnaXN0cnksIGFjdGlvbi5hdHRyaWJ1dGVzKVxuICAgICAgICAgICAgICBpZiAoZm9ybWF0cy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICBzbG90LnJldGFpbihhY3Rpb24ucmV0YWluISwgZm9ybWF0cylcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBzbG90LnJldGFpbihzbG90LmluZGV4ICsgYWN0aW9uLnJldGFpbilcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHNsb3QucmV0YWluKGFjdGlvbi5yZXRhaW4pXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBlbHNlIGlmIChhY3Rpb24uaW5zZXJ0KSB7XG4gICAgICAgICAgICBjb25zdCBpbmRleCA9IHNsb3QuaW5kZXhcbiAgICAgICAgICAgIGxldCBsZW5ndGggPSAxXG4gICAgICAgICAgICBpZiAodHlwZW9mIGFjdGlvbi5pbnNlcnQgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICAgIGxlbmd0aCA9IGFjdGlvbi5pbnNlcnQubGVuZ3RoXG4gICAgICAgICAgICAgIHNsb3QuaW5zZXJ0KGFjdGlvbi5pbnNlcnQsIG1ha2VGb3JtYXRzKHRoaXMucmVnaXN0cnksIGFjdGlvbi5hdHRyaWJ1dGVzKSlcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIGNvbnN0IHNoYXJlZENvbXBvbmVudCA9IGFjdGlvbi5pbnNlcnQgYXMgWU1hcDxhbnk+XG4gICAgICAgICAgICAgIGNvbnN0IGNhbkluc2VydElubGluZUNvbXBvbmVudCA9IHNsb3Quc2NoZW1hLmluY2x1ZGVzKENvbnRlbnRUeXBlLklubGluZUNvbXBvbmVudClcbiAgICAgICAgICAgICAgY29uc3QgY29tcG9uZW50ID0gdGhpcy5jcmVhdGVDb21wb25lbnRCeVNoYXJlZENvbXBvbmVudChzaGFyZWRDb21wb25lbnQsIGNhbkluc2VydElubGluZUNvbXBvbmVudClcbiAgICAgICAgICAgICAgdGhpcy5zeW5jU2xvdHMoc2hhcmVkQ29tcG9uZW50LmdldCgnc2xvdHMnKSwgY29tcG9uZW50KVxuICAgICAgICAgICAgICB0aGlzLnN5bmNDb21wb25lbnQoc2hhcmVkQ29tcG9uZW50LCBjb21wb25lbnQpXG4gICAgICAgICAgICAgIHNsb3QuaW5zZXJ0KGNvbXBvbmVudClcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh0aGlzLnNlbGVjdGlvbi5pc1NlbGVjdGVkKSB7XG4gICAgICAgICAgICAgIGlmIChzbG90ID09PSB0aGlzLnNlbGVjdGlvbi5hbmNob3JTbG90ICYmIHRoaXMuc2VsZWN0aW9uLmFuY2hvck9mZnNldCEgPiBpbmRleCkge1xuICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0aW9uLnNldEFuY2hvcihzbG90LCB0aGlzLnNlbGVjdGlvbi5hbmNob3JPZmZzZXQhICsgbGVuZ3RoKVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGlmIChzbG90ID09PSB0aGlzLnNlbGVjdGlvbi5mb2N1c1Nsb3QgJiYgdGhpcy5zZWxlY3Rpb24uZm9jdXNPZmZzZXQhID4gaW5kZXgpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdGlvbi5zZXRGb2N1cyhzbG90LCB0aGlzLnNlbGVjdGlvbi5mb2N1c09mZnNldCEgKyBsZW5ndGgpXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGVsc2UgaWYgKGFjdGlvbi5kZWxldGUpIHtcbiAgICAgICAgICAgIGNvbnN0IGluZGV4ID0gc2xvdC5pbmRleFxuICAgICAgICAgICAgc2xvdC5yZXRhaW4oc2xvdC5pbmRleClcbiAgICAgICAgICAgIHNsb3QuZGVsZXRlKGFjdGlvbi5kZWxldGUpXG4gICAgICAgICAgICBpZiAodGhpcy5zZWxlY3Rpb24uaXNTZWxlY3RlZCkge1xuICAgICAgICAgICAgICBpZiAoc2xvdCA9PT0gdGhpcy5zZWxlY3Rpb24uYW5jaG9yU2xvdCAmJiB0aGlzLnNlbGVjdGlvbi5hbmNob3JPZmZzZXQhID49IGluZGV4KSB7XG4gICAgICAgICAgICAgICAgdGhpcy5zZWxlY3Rpb24uc2V0QW5jaG9yKHNsb3QsIHRoaXMuc2VsZWN0aW9uLnN0YXJ0T2Zmc2V0ISAtIGFjdGlvbi5kZWxldGUpXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgaWYgKHNsb3QgPT09IHRoaXMuc2VsZWN0aW9uLmZvY3VzU2xvdCAmJiB0aGlzLnNlbGVjdGlvbi5mb2N1c09mZnNldCEgPj0gaW5kZXgpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdGlvbi5zZXRGb2N1cyhzbG90LCB0aGlzLnNlbGVjdGlvbi5mb2N1c09mZnNldCEgLSBhY3Rpb24uZGVsZXRlKVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBlbHNlIGlmIChhY3Rpb24uYXR0cmlidXRlcykge1xuICAgICAgICAgICAgc2xvdC51cGRhdGVTdGF0ZShkcmFmdCA9PiB7XG4gICAgICAgICAgICAgIGlmICh0eXBlb2YgZHJhZnQgPT09ICdvYmplY3QnICYmIGRyYWZ0ICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgT2JqZWN0LmFzc2lnbihkcmFmdCwgYWN0aW9uLmF0dHJpYnV0ZXMpXG4gICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGFjdGlvbi5hdHRyaWJ1dGVzXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgfVxuICAgICAgICB9KVxuICAgICAgfSlcbiAgICB9XG4gICAgY29udGVudC5vYnNlcnZlKHN5bmNSZW1vdGUpXG5cbiAgICBjb25zdCBzdWIgPSBzbG90Lm9uQ29udGVudENoYW5nZS5zdWJzY3JpYmUoYWN0aW9ucyA9PiB7XG4gICAgICB0aGlzLnJ1bkxvY2FsVXBkYXRlKCgpID0+IHtcbiAgICAgICAgbGV0IG9mZnNldCA9IDBcbiAgICAgICAgbGV0IGxlbmd0aCA9IDBcbiAgICAgICAgZm9yIChjb25zdCBhY3Rpb24gb2YgYWN0aW9ucykge1xuICAgICAgICAgIGlmIChhY3Rpb24udHlwZSA9PT0gJ3JldGFpbicpIHtcbiAgICAgICAgICAgIGNvbnN0IGZvcm1hdHMgPSBhY3Rpb24uZm9ybWF0c1xuICAgICAgICAgICAgaWYgKGZvcm1hdHMpIHtcbiAgICAgICAgICAgICAgY29udGVudC5mb3JtYXQob2Zmc2V0LCBhY3Rpb24ub2Zmc2V0LCBsb2NhbEZvcm1hdFRvUmVtb3RlKGZvcm1hdHMsIHRoaXMucmVnaXN0cnkpKVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgb2Zmc2V0ID0gYWN0aW9uLm9mZnNldFxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSBpZiAoYWN0aW9uLnR5cGUgPT09ICdpbnNlcnQnKSB7XG4gICAgICAgICAgICBjb25zdCBkZWx0YSA9IGNvbnRlbnQudG9EZWx0YSgpXG4gICAgICAgICAgICBjb25zdCBpc0VtcHR5ID0gZGVsdGEubGVuZ3RoID09PSAxICYmIGRlbHRhWzBdLmluc2VydCA9PT0gU2xvdC5lbXB0eVBsYWNlaG9sZGVyXG4gICAgICAgICAgICBpZiAodHlwZW9mIGFjdGlvbi5jb250ZW50ID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgICBsZW5ndGggPSBhY3Rpb24uY29udGVudC5sZW5ndGhcbiAgICAgICAgICAgICAgY29udGVudC5pbnNlcnQob2Zmc2V0LCBhY3Rpb24uY29udGVudCwgbG9jYWxGb3JtYXRUb1JlbW90ZShhY3Rpb24uZm9ybWF0cyB8fCB7fSwgdGhpcy5yZWdpc3RyeSkpXG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBsZW5ndGggPSAxXG4gICAgICAgICAgICAgIGNvbnN0IHNoYXJlZENvbXBvbmVudCA9IHRoaXMuY3JlYXRlU2hhcmVkQ29tcG9uZW50QnlDb21wb25lbnQoYWN0aW9uLnJlZiBhcyBDb21wb25lbnRJbnN0YW5jZSlcbiAgICAgICAgICAgICAgY29udGVudC5pbnNlcnRFbWJlZChvZmZzZXQsIHNoYXJlZENvbXBvbmVudCwgbG9jYWxGb3JtYXRUb1JlbW90ZShhY3Rpb24uZm9ybWF0cyB8fCB7fSwgdGhpcy5yZWdpc3RyeSkpXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChpc0VtcHR5ICYmIG9mZnNldCA9PT0gMCkge1xuICAgICAgICAgICAgICBjb250ZW50LmRlbGV0ZShjb250ZW50Lmxlbmd0aCAtIDEsIDEpXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBvZmZzZXQgKz0gbGVuZ3RoXG4gICAgICAgICAgfSBlbHNlIGlmIChhY3Rpb24udHlwZSA9PT0gJ2RlbGV0ZScpIHtcbiAgICAgICAgICAgIGNvbnN0IGRlbHRhID0gY29udGVudC50b0RlbHRhKClcbiAgICAgICAgICAgIGlmIChjb250ZW50Lmxlbmd0aCkge1xuICAgICAgICAgICAgICBjb250ZW50LmRlbGV0ZShvZmZzZXQsIGFjdGlvbi5jb3VudClcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChjb250ZW50Lmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgICBjb250ZW50Lmluc2VydCgwLCAnXFxuJywgZGVsdGFbMF0/LmF0dHJpYnV0ZXMpXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9KVxuICAgIH0pXG5cbiAgICBzdWIuYWRkKHNsb3Qub25DaGlsZENvbXBvbmVudFJlbW92ZS5zdWJzY3JpYmUoY29tcG9uZW50cyA9PiB7XG4gICAgICBjb21wb25lbnRzLmZvckVhY2goYyA9PiB7XG4gICAgICAgIHRoaXMuY2xlYW5TdWJzY3JpcHRpb25zQnlDb21wb25lbnQoYylcbiAgICAgIH0pXG4gICAgfSkpXG4gICAgdGhpcy5jb250ZW50U3luY0NhY2hlcy5zZXQoc2xvdCwgKCkgPT4ge1xuICAgICAgY29udGVudC51bm9ic2VydmUoc3luY1JlbW90ZSlcbiAgICAgIHN1Yi51bnN1YnNjcmliZSgpXG4gICAgfSlcbiAgfVxuXG4gIHByaXZhdGUgc3luY1Nsb3QocmVtb3RlU2xvdDogWU1hcDxhbnk+LCBzbG90OiBTbG90KSB7XG4gICAgY29uc3Qgc3luY1JlbW90ZSA9IChldiwgdHIpID0+IHtcbiAgICAgIHRoaXMucnVuUmVtb3RlVXBkYXRlKHRyLCAoKSA9PiB7XG4gICAgICAgIGV2LmtleXNDaGFuZ2VkLmZvckVhY2goa2V5ID0+IHtcbiAgICAgICAgICBpZiAoa2V5ID09PSAnc3RhdGUnKSB7XG4gICAgICAgICAgICBjb25zdCBzdGF0ZSA9IChldi50YXJnZXQgYXMgWU1hcDxhbnk+KS5nZXQoJ3N0YXRlJylcbiAgICAgICAgICAgIHNsb3QudXBkYXRlU3RhdGUoZHJhZnQgPT4ge1xuICAgICAgICAgICAgICBpZiAodHlwZW9mIGRyYWZ0ID09PSAnb2JqZWN0JyAmJiBkcmFmdCAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIE9iamVjdC5hc3NpZ24oZHJhZnQsIHN0YXRlKVxuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybiBzdGF0ZVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KVxuICAgICAgICAgIH1cbiAgICAgICAgfSlcbiAgICAgIH0pXG4gICAgfVxuICAgIHJlbW90ZVNsb3Qub2JzZXJ2ZShzeW5jUmVtb3RlKVxuXG4gICAgY29uc3Qgc3ViID0gc2xvdC5vblN0YXRlQ2hhbmdlLnN1YnNjcmliZShjaGFuZ2UgPT4ge1xuICAgICAgdGhpcy5ydW5Mb2NhbFVwZGF0ZSgoKSA9PiB7XG4gICAgICAgIHJlbW90ZVNsb3Quc2V0KCdzdGF0ZScsIGNoYW5nZS5uZXdTdGF0ZSlcbiAgICAgIH0sIGNoYW5nZS5yZWNvcmQpXG4gICAgfSlcbiAgICB0aGlzLnNsb3RTdGF0ZVN5bmNDYWNoZXMuc2V0KHNsb3QsICgpID0+IHtcbiAgICAgIHJlbW90ZVNsb3QudW5vYnNlcnZlKHN5bmNSZW1vdGUpXG4gICAgICBzdWIudW5zdWJzY3JpYmUoKVxuICAgIH0pXG4gIH1cblxuICBwcml2YXRlIHN5bmNTbG90cyhyZW1vdGVTbG90czogWUFycmF5PGFueT4sIGNvbXBvbmVudDogQ29tcG9uZW50SW5zdGFuY2UpIHtcbiAgICBjb25zdCBzbG90cyA9IGNvbXBvbmVudC5zbG90c1xuICAgIGNvbnN0IHN5bmNSZW1vdGUgPSAoZXYsIHRyKSA9PiB7XG4gICAgICB0aGlzLnJ1blJlbW90ZVVwZGF0ZSh0ciwgKCkgPT4ge1xuICAgICAgICBsZXQgaW5kZXggPSAwXG4gICAgICAgIGV2LmRlbHRhLmZvckVhY2goYWN0aW9uID0+IHtcbiAgICAgICAgICBpZiAoUmVmbGVjdC5oYXMoYWN0aW9uLCAncmV0YWluJykpIHtcbiAgICAgICAgICAgIGluZGV4ICs9IGFjdGlvbi5yZXRhaW5cbiAgICAgICAgICAgIHNsb3RzLnJldGFpbihpbmRleClcbiAgICAgICAgICB9IGVsc2UgaWYgKGFjdGlvbi5pbnNlcnQpIHtcbiAgICAgICAgICAgIChhY3Rpb24uaW5zZXJ0IGFzIEFycmF5PFlNYXA8YW55Pj4pLmZvckVhY2goaXRlbSA9PiB7XG4gICAgICAgICAgICAgIGNvbnN0IHNsb3QgPSB0aGlzLmNyZWF0ZVNsb3RCeVNoYXJlZFNsb3QoaXRlbSlcbiAgICAgICAgICAgICAgc2xvdHMuaW5zZXJ0KHNsb3QpXG4gICAgICAgICAgICAgIHRoaXMuc3luY0NvbnRlbnQoaXRlbS5nZXQoJ2NvbnRlbnQnKSwgc2xvdClcbiAgICAgICAgICAgICAgdGhpcy5zeW5jU2xvdChpdGVtLCBzbG90KVxuICAgICAgICAgICAgICBpbmRleCsrXG4gICAgICAgICAgICB9KVxuICAgICAgICAgIH0gZWxzZSBpZiAoYWN0aW9uLmRlbGV0ZSkge1xuICAgICAgICAgICAgc2xvdHMucmV0YWluKGluZGV4KVxuICAgICAgICAgICAgc2xvdHMuZGVsZXRlKGFjdGlvbi5kZWxldGUpXG4gICAgICAgICAgfVxuICAgICAgICB9KVxuICAgICAgfSlcbiAgICB9XG4gICAgcmVtb3RlU2xvdHMub2JzZXJ2ZShzeW5jUmVtb3RlKVxuXG4gICAgY29uc3Qgc3ViID0gc2xvdHMub25DaGFuZ2Uuc3Vic2NyaWJlKG9wZXJhdGlvbnMgPT4ge1xuICAgICAgdGhpcy5ydW5Mb2NhbFVwZGF0ZSgoKSA9PiB7XG4gICAgICAgIGNvbnN0IGFwcGx5QWN0aW9ucyA9IG9wZXJhdGlvbnMuYXBwbHlcbiAgICAgICAgbGV0IGluZGV4OiBudW1iZXJcbiAgICAgICAgYXBwbHlBY3Rpb25zLmZvckVhY2goYWN0aW9uID0+IHtcbiAgICAgICAgICBpZiAoYWN0aW9uLnR5cGUgPT09ICdyZXRhaW4nKSB7XG4gICAgICAgICAgICBpbmRleCA9IGFjdGlvbi5vZmZzZXRcbiAgICAgICAgICB9IGVsc2UgaWYgKGFjdGlvbi50eXBlID09PSAnaW5zZXJ0U2xvdCcpIHtcbiAgICAgICAgICAgIGNvbnN0IHNoYXJlZFNsb3QgPSB0aGlzLmNyZWF0ZVNoYXJlZFNsb3RCeVNsb3QoYWN0aW9uLnJlZilcbiAgICAgICAgICAgIHJlbW90ZVNsb3RzLmluc2VydChpbmRleCwgW3NoYXJlZFNsb3RdKVxuICAgICAgICAgICAgaW5kZXgrK1xuICAgICAgICAgIH0gZWxzZSBpZiAoYWN0aW9uLnR5cGUgPT09ICdkZWxldGUnKSB7XG4gICAgICAgICAgICByZW1vdGVTbG90cy5kZWxldGUoaW5kZXgsIGFjdGlvbi5jb3VudClcbiAgICAgICAgICB9XG4gICAgICAgIH0pXG4gICAgICB9KVxuICAgIH0pXG5cbiAgICBzdWIuYWRkKHNsb3RzLm9uQ2hpbGRTbG90UmVtb3ZlLnN1YnNjcmliZShzbG90cyA9PiB7XG4gICAgICBzbG90cy5mb3JFYWNoKHNsb3QgPT4ge1xuICAgICAgICB0aGlzLmNsZWFuU3Vic2NyaXB0aW9uc0J5U2xvdChzbG90KVxuICAgICAgfSlcbiAgICB9KSlcblxuICAgIHRoaXMuc2xvdHNTeW5jQ2FjaGVzLnNldChjb21wb25lbnQsICgpID0+IHtcbiAgICAgIHJlbW90ZVNsb3RzLnVub2JzZXJ2ZShzeW5jUmVtb3RlKVxuICAgICAgc3ViLnVuc3Vic2NyaWJlKClcbiAgICB9KVxuICB9XG5cbiAgcHJpdmF0ZSBzeW5jQ29tcG9uZW50KHJlbW90ZUNvbXBvbmVudDogWU1hcDxhbnk+LCBjb21wb25lbnQ6IENvbXBvbmVudEluc3RhbmNlKSB7XG4gICAgY29uc3Qgc3luY1JlbW90ZSA9IChldiwgdHIpID0+IHtcbiAgICAgIHRoaXMucnVuUmVtb3RlVXBkYXRlKHRyLCAoKSA9PiB7XG4gICAgICAgIGV2LmtleXNDaGFuZ2VkLmZvckVhY2goa2V5ID0+IHtcbiAgICAgICAgICBpZiAoa2V5ID09PSAnc3RhdGUnKSB7XG4gICAgICAgICAgICBjb25zdCBzdGF0ZSA9IChldi50YXJnZXQgYXMgWU1hcDxhbnk+KS5nZXQoJ3N0YXRlJylcbiAgICAgICAgICAgIGNvbXBvbmVudC51cGRhdGVTdGF0ZShkcmFmdCA9PiB7XG4gICAgICAgICAgICAgIGlmICh0eXBlb2YgZHJhZnQgPT09ICdvYmplY3QnICYmIGRyYWZ0ICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgT2JqZWN0LmFzc2lnbihkcmFmdCwgc3RhdGUpXG4gICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHN0YXRlXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgfVxuICAgICAgICB9KVxuICAgICAgfSlcbiAgICB9XG4gICAgcmVtb3RlQ29tcG9uZW50Lm9ic2VydmUoc3luY1JlbW90ZSlcblxuICAgIGNvbnN0IHN1YiA9IGNvbXBvbmVudC5vblN0YXRlQ2hhbmdlLnN1YnNjcmliZShjaGFuZ2UgPT4ge1xuICAgICAgdGhpcy5ydW5Mb2NhbFVwZGF0ZSgoKSA9PiB7XG4gICAgICAgIHJlbW90ZUNvbXBvbmVudC5zZXQoJ3N0YXRlJywgY2hhbmdlLm5ld1N0YXRlKVxuICAgICAgfSwgY2hhbmdlLnJlY29yZClcbiAgICB9KVxuICAgIHRoaXMuY29tcG9uZW50U3RhdGVTeW5jQ2FjaGVzLnNldChjb21wb25lbnQsICgpID0+IHtcbiAgICAgIHJlbW90ZUNvbXBvbmVudC51bm9ic2VydmUoc3luY1JlbW90ZSlcbiAgICAgIHN1Yi51bnN1YnNjcmliZSgpXG4gICAgfSlcbiAgfVxuXG4gIHByaXZhdGUgcnVuTG9jYWxVcGRhdGUoZm46ICgpID0+IHZvaWQsIHJlY29yZCA9IHRydWUpIHtcbiAgICBpZiAodGhpcy51cGRhdGVGcm9tUmVtb3RlIHx8IHRoaXMuY29udHJvbGxlci5yZWFkb25seSkge1xuICAgICAgcmV0dXJuXG4gICAgfVxuICAgIHRoaXMudXBkYXRlUmVtb3RlQWN0aW9ucy5wdXNoKHtcbiAgICAgIHJlY29yZCxcbiAgICAgIGFjdGlvbjogZm5cbiAgICB9KVxuICB9XG5cbiAgcHJpdmF0ZSBydW5SZW1vdGVVcGRhdGUodHI6IFRyYW5zYWN0aW9uLCBmbjogKCkgPT4gdm9pZCkge1xuICAgIGlmICh0ci5vcmlnaW4gPT09IHRoaXMueURvYykge1xuICAgICAgcmV0dXJuXG4gICAgfVxuICAgIHRoaXMudXBkYXRlRnJvbVJlbW90ZSA9IHRydWVcbiAgICBpZiAodHIub3JpZ2luID09PSB0aGlzLm1hbmFnZXIpIHtcbiAgICAgIHRoaXMuc2NoZWR1bGVyLmhpc3RvcnlBcHBseVRyYW5zYWN0KGZuKVxuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnNjaGVkdWxlci5yZW1vdGVVcGRhdGVUcmFuc2FjdChmbilcbiAgICB9XG4gICAgdGhpcy51cGRhdGVGcm9tUmVtb3RlID0gZmFsc2VcbiAgfVxuXG4gIHByaXZhdGUgY3JlYXRlU2hhcmVkQ29tcG9uZW50QnlDb21wb25lbnQoY29tcG9uZW50OiBDb21wb25lbnRJbnN0YW5jZSk6IFlNYXA8YW55PiB7XG4gICAgY29uc3Qgc2hhcmVkQ29tcG9uZW50ID0gbmV3IFlNYXAoKVxuICAgIHNoYXJlZENvbXBvbmVudC5zZXQoJ3N0YXRlJywgY29tcG9uZW50LnN0YXRlKVxuICAgIHNoYXJlZENvbXBvbmVudC5zZXQoJ25hbWUnLCBjb21wb25lbnQubmFtZSlcbiAgICBjb25zdCBzaGFyZWRTbG90cyA9IG5ldyBZQXJyYXkoKVxuICAgIHNoYXJlZENvbXBvbmVudC5zZXQoJ3Nsb3RzJywgc2hhcmVkU2xvdHMpXG4gICAgY29tcG9uZW50LnNsb3RzLnRvQXJyYXkoKS5mb3JFYWNoKHNsb3QgPT4ge1xuICAgICAgY29uc3Qgc2hhcmVkU2xvdCA9IHRoaXMuY3JlYXRlU2hhcmVkU2xvdEJ5U2xvdChzbG90KVxuICAgICAgc2hhcmVkU2xvdHMucHVzaChbc2hhcmVkU2xvdF0pXG4gICAgfSlcbiAgICB0aGlzLnN5bmNTbG90cyhzaGFyZWRTbG90cywgY29tcG9uZW50KVxuICAgIHRoaXMuc3luY0NvbXBvbmVudChzaGFyZWRDb21wb25lbnQsIGNvbXBvbmVudClcbiAgICByZXR1cm4gc2hhcmVkQ29tcG9uZW50XG4gIH1cblxuICBwcml2YXRlIGNyZWF0ZVNoYXJlZFNsb3RCeVNsb3Qoc2xvdDogU2xvdCk6IFlNYXA8YW55PiB7XG4gICAgY29uc3Qgc2hhcmVkU2xvdCA9IG5ldyBZTWFwKClcbiAgICBzaGFyZWRTbG90LnNldCgnc2NoZW1hJywgc2xvdC5zY2hlbWEpXG4gICAgc2hhcmVkU2xvdC5zZXQoJ3N0YXRlJywgc2xvdC5zdGF0ZSlcbiAgICBjb25zdCBzaGFyZWRDb250ZW50ID0gbmV3IFlUZXh0KClcbiAgICBzaGFyZWRTbG90LnNldCgnY29udGVudCcsIHNoYXJlZENvbnRlbnQpXG4gICAgbGV0IG9mZnNldCA9IDBcbiAgICBzbG90LnRvRGVsdGEoKS5mb3JFYWNoKGkgPT4ge1xuICAgICAgbGV0IGZvcm1hdHNcbiAgICAgIGlmIChpLmZvcm1hdHMpIHtcbiAgICAgICAgZm9ybWF0cyA9IGZvcm1hdHNUb1JlbW90ZShpLmZvcm1hdHMpXG4gICAgICB9XG4gICAgICBpZiAodHlwZW9mIGkuaW5zZXJ0ID09PSAnc3RyaW5nJykge1xuICAgICAgICBzaGFyZWRDb250ZW50Lmluc2VydChvZmZzZXQsIGkuaW5zZXJ0LCBmb3JtYXRzKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc3Qgc2hhcmVkQ29tcG9uZW50ID0gdGhpcy5jcmVhdGVTaGFyZWRDb21wb25lbnRCeUNvbXBvbmVudChpLmluc2VydClcbiAgICAgICAgc2hhcmVkQ29udGVudC5pbnNlcnRFbWJlZChvZmZzZXQsIHNoYXJlZENvbXBvbmVudCwgZm9ybWF0cylcbiAgICAgIH1cbiAgICAgIG9mZnNldCArPSBpLmluc2VydC5sZW5ndGhcbiAgICB9KVxuICAgIHRoaXMuc3luY0NvbnRlbnQoc2hhcmVkQ29udGVudCwgc2xvdClcbiAgICB0aGlzLnN5bmNTbG90KHNoYXJlZFNsb3QsIHNsb3QpXG4gICAgcmV0dXJuIHNoYXJlZFNsb3RcbiAgfVxuXG4gIHByaXZhdGUgY3JlYXRlQ29tcG9uZW50QnlTaGFyZWRDb21wb25lbnQoeU1hcDogWU1hcDxhbnk+LCBjYW5JbnNlcnRJbmxpbmVDb21wb25lbnQ6IGJvb2xlYW4pOiBDb21wb25lbnRJbnN0YW5jZSB7XG4gICAgY29uc3Qgc2hhcmVkU2xvdHMgPSB5TWFwLmdldCgnc2xvdHMnKSBhcyBZQXJyYXk8WU1hcDxhbnk+PlxuICAgIGNvbnN0IHNsb3RzOiBTbG90W10gPSBbXVxuICAgIHNoYXJlZFNsb3RzLmZvckVhY2goc2hhcmVkU2xvdCA9PiB7XG4gICAgICBjb25zdCBzbG90ID0gdGhpcy5jcmVhdGVTbG90QnlTaGFyZWRTbG90KHNoYXJlZFNsb3QpXG4gICAgICBzbG90cy5wdXNoKHNsb3QpXG4gICAgfSlcbiAgICBjb25zdCBuYW1lID0geU1hcC5nZXQoJ25hbWUnKVxuICAgIGNvbnN0IHN0YXRlID0geU1hcC5nZXQoJ3N0YXRlJylcbiAgICBsZXQgaW5zdGFuY2UgPSB0aGlzLnRyYW5zbGF0b3IuY3JlYXRlQ29tcG9uZW50QnlEYXRhKG5hbWUsIHtcbiAgICAgIHN0YXRlLFxuICAgICAgc2xvdHNcbiAgICB9KVxuICAgIGlmICghaW5zdGFuY2UpIHtcbiAgICAgIGluc3RhbmNlID0gdGhpcy50cmFuc2xhdG9yRmFsbGJhY2suY3JlYXRlQ29tcG9uZW50QnlEYXRhKG5hbWUsIHtcbiAgICAgICAgc3RhdGUsXG4gICAgICAgIHNsb3RzXG4gICAgICB9KVxuICAgIH1cbiAgICBpZiAoaW5zdGFuY2UpIHtcbiAgICAgIGluc3RhbmNlLnNsb3RzLnRvQXJyYXkoKS5mb3JFYWNoKChzbG90LCBpbmRleCkgPT4ge1xuICAgICAgICBsZXQgc2hhcmVkU2xvdCA9IHNoYXJlZFNsb3RzLmdldChpbmRleClcbiAgICAgICAgaWYgKCFzaGFyZWRTbG90KSB7XG4gICAgICAgICAgc2hhcmVkU2xvdCA9IHRoaXMuY3JlYXRlU2hhcmVkU2xvdEJ5U2xvdChzbG90KVxuICAgICAgICAgIHNoYXJlZFNsb3RzLnB1c2goW3NoYXJlZFNsb3RdKVxuICAgICAgICB9XG4gICAgICAgIHRoaXMuc3luY1Nsb3Qoc2hhcmVkU2xvdCwgc2xvdClcbiAgICAgICAgdGhpcy5zeW5jQ29udGVudChzaGFyZWRTbG90LmdldCgnY29udGVudCcpLCBzbG90KVxuICAgICAgfSlcbiAgICAgIHJldHVybiBpbnN0YW5jZVxuICAgIH1cbiAgICByZXR1cm4gY3JlYXRlVW5rbm93bkNvbXBvbmVudChuYW1lLCBjYW5JbnNlcnRJbmxpbmVDb21wb25lbnQpLmNyZWF0ZUluc3RhbmNlKHRoaXMuc3RhcnRlcilcbiAgfVxuXG4gIHByaXZhdGUgY3JlYXRlU2xvdEJ5U2hhcmVkU2xvdChzaGFyZWRTbG90OiBZTWFwPGFueT4pOiBTbG90IHtcbiAgICBjb25zdCBjb250ZW50ID0gc2hhcmVkU2xvdC5nZXQoJ2NvbnRlbnQnKSBhcyBZVGV4dFxuICAgIGNvbnN0IGRlbHRhID0gY29udGVudC50b0RlbHRhKClcblxuICAgIGNvbnN0IHNsb3QgPSB0aGlzLnRyYW5zbGF0b3IuY3JlYXRlU2xvdCh7XG4gICAgICBzY2hlbWE6IHNoYXJlZFNsb3QuZ2V0KCdzY2hlbWEnKSxcbiAgICAgIHN0YXRlOiBzaGFyZWRTbG90LmdldCgnc3RhdGUnKSxcbiAgICAgIGZvcm1hdHM6IHt9LFxuICAgICAgY29udGVudDogW11cbiAgICB9KVxuXG4gICAgZm9yIChjb25zdCBhY3Rpb24gb2YgZGVsdGEpIHtcbiAgICAgIGlmIChhY3Rpb24uaW5zZXJ0KSB7XG4gICAgICAgIGlmICh0eXBlb2YgYWN0aW9uLmluc2VydCA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICBzbG90Lmluc2VydChhY3Rpb24uaW5zZXJ0LCBtYWtlRm9ybWF0cyh0aGlzLnJlZ2lzdHJ5LCBhY3Rpb24uYXR0cmlidXRlcykpXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY29uc3Qgc2hhcmVkQ29tcG9uZW50ID0gYWN0aW9uLmluc2VydCBhcyBZTWFwPGFueT5cbiAgICAgICAgICBjb25zdCBjYW5JbnNlcnRJbmxpbmVDb21wb25lbnQgPSBzbG90LnNjaGVtYS5pbmNsdWRlcyhDb250ZW50VHlwZS5JbmxpbmVDb21wb25lbnQpXG4gICAgICAgICAgY29uc3QgY29tcG9uZW50ID0gdGhpcy5jcmVhdGVDb21wb25lbnRCeVNoYXJlZENvbXBvbmVudChzaGFyZWRDb21wb25lbnQsIGNhbkluc2VydElubGluZUNvbXBvbmVudClcbiAgICAgICAgICBzbG90Lmluc2VydChjb21wb25lbnQsIG1ha2VGb3JtYXRzKHRoaXMucmVnaXN0cnksIGFjdGlvbi5hdHRyaWJ1dGVzKSlcbiAgICAgICAgICB0aGlzLnN5bmNTbG90cyhzaGFyZWRDb21wb25lbnQuZ2V0KCdzbG90cycpLCBjb21wb25lbnQpXG4gICAgICAgICAgdGhpcy5zeW5jQ29tcG9uZW50KHNoYXJlZENvbXBvbmVudCwgY29tcG9uZW50KVxuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aHJvdyBjb2xsYWJvcmF0ZUVycm9yRm4oJ3VuZXhwZWN0ZWQgZGVsdGEgYWN0aW9uLicpXG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBzbG90XG4gIH1cblxuICBwcml2YXRlIGNsZWFuU3Vic2NyaXB0aW9uc0J5U2xvdChzbG90OiBTbG90KSB7XG4gICAgdGhpcy5jb250ZW50TWFwLmRlbGV0ZShzbG90KTtcbiAgICBbdGhpcy5jb250ZW50U3luY0NhY2hlcy5nZXQoc2xvdCksIHRoaXMuc2xvdFN0YXRlU3luY0NhY2hlcy5nZXQoc2xvdCldLmZvckVhY2goZm4gPT4ge1xuICAgICAgaWYgKGZuKSB7XG4gICAgICAgIGZuKClcbiAgICAgIH1cbiAgICB9KVxuICAgIHNsb3Quc2xpY2VDb250ZW50KCkuZm9yRWFjaChpID0+IHtcbiAgICAgIGlmICh0eXBlb2YgaSAhPT0gJ3N0cmluZycpIHtcbiAgICAgICAgdGhpcy5jbGVhblN1YnNjcmlwdGlvbnNCeUNvbXBvbmVudChpKVxuICAgICAgfVxuICAgIH0pXG4gIH1cblxuICBwcml2YXRlIGNsZWFuU3Vic2NyaXB0aW9uc0J5Q29tcG9uZW50KGNvbXBvbmVudDogQ29tcG9uZW50SW5zdGFuY2UpIHtcbiAgICBbdGhpcy5zbG90c1N5bmNDYWNoZXMuZ2V0KGNvbXBvbmVudCksIHRoaXMuY29tcG9uZW50U3RhdGVTeW5jQ2FjaGVzLmdldChjb21wb25lbnQpXS5mb3JFYWNoKGZuID0+IHtcbiAgICAgIGlmIChmbikge1xuICAgICAgICBmbigpXG4gICAgICB9XG4gICAgfSlcbiAgICBjb21wb25lbnQuc2xvdHMudG9BcnJheSgpLmZvckVhY2goc2xvdCA9PiB7XG4gICAgICB0aGlzLmNsZWFuU3Vic2NyaXB0aW9uc0J5U2xvdChzbG90KVxuICAgIH0pXG4gIH1cbn1cblxuZnVuY3Rpb24gZm9ybWF0c1RvUmVtb3RlKGZvcm1hdHM6IEZvcm1hdHMpIHtcbiAgY29uc3QgcmVzdWx0OiBSZWNvcmQ8c3RyaW5nLCBhbnk+ID0ge31cblxuICBmb3IgKGNvbnN0IGl0ZW0gb2YgZm9ybWF0cykge1xuICAgIGNvbnN0IFtmb3JtYXR0ZXIsIHZhbHVlc10gPSBpdGVtXG4gICAgaWYgKHR5cGVvZiBmb3JtYXR0ZXIuY3JlYXRlVmFsdWVJZElmT3ZlcmxhcCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWVzKSkge1xuICAgICAgICB2YWx1ZXMuZm9yRWFjaCh2YWx1ZSA9PiB7XG4gICAgICAgICAgY29uc3QgdmFsdWVJZCA9IChmb3JtYXR0ZXIuY3JlYXRlVmFsdWVJZElmT3ZlcmxhcCBhcyBhbnkpKHZhbHVlKVxuICAgICAgICAgIHJlc3VsdFtgJHtmb3JtYXR0ZXIubmFtZX06JHt2YWx1ZUlkfWBdID0gdmFsdWVcbiAgICAgICAgfSlcbiAgICAgICAgYnJlYWtcbiAgICAgIH1cbiAgICB9XG4gICAgcmVzdWx0W2Zvcm1hdHRlci5uYW1lXSA9IHZhbHVlc1xuICB9XG4gIHJldHVybiByZXN1bHRcbn1cblxuZnVuY3Rpb24gbG9jYWxGb3JtYXRUb1JlbW90ZShmb3JtYXRzOiBSZWNvcmQ8c3RyaW5nLCBhbnk+LCByZWdpc3RyeTogUmVnaXN0cnkpIHtcbiAgY29uc3Qga2V5cyA9IE9iamVjdC5rZXlzKGZvcm1hdHMpXG4gIGNvbnN0IHJlc3VsdDogUmVjb3JkPHN0cmluZywgYW55PiA9IHt9XG5cbiAgZm9yIChjb25zdCBrZXkgb2Yga2V5cykge1xuICAgIGNvbnN0IGZvcm1hdHRlciA9IHJlZ2lzdHJ5LmdldEZvcm1hdHRlcihrZXkpXG4gICAgaWYgKCFmb3JtYXR0ZXIpIHtcbiAgICAgIGJyZWFrXG4gICAgfVxuICAgIGlmICh0eXBlb2YgZm9ybWF0dGVyLmNyZWF0ZVZhbHVlSWRJZk92ZXJsYXAgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIGNvbnN0IHZhbHVlcyA9IGZvcm1hdHNba2V5XVxuICAgICAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWVzKSkge1xuICAgICAgICB2YWx1ZXMuZm9yRWFjaCh2YWx1ZSA9PiB7XG4gICAgICAgICAgY29uc3QgdmFsdWVJZCA9IChmb3JtYXR0ZXIuY3JlYXRlVmFsdWVJZElmT3ZlcmxhcCBhcyBhbnkpKHZhbHVlKVxuICAgICAgICAgIHJlc3VsdFtgJHtmb3JtYXR0ZXIubmFtZX06JHt2YWx1ZUlkfWBdID0gdmFsdWVcbiAgICAgICAgfSlcbiAgICAgICAgYnJlYWtcbiAgICAgIH1cbiAgICB9XG4gICAgcmVzdWx0W2tleV0gPSBmb3JtYXRzW2tleV1cbiAgfVxuICByZXR1cm4gcmVzdWx0XG59XG5cbmZ1bmN0aW9uIG1ha2VGb3JtYXRzKHJlZ2lzdHJ5OiBSZWdpc3RyeSwgYXR0cnM/OiBhbnkpIHtcbiAgY29uc3QgZm9ybWF0czogRm9ybWF0cyA9IFtdXG4gIGlmIChhdHRycykge1xuICAgIE9iamVjdC5rZXlzKGF0dHJzKS5mb3JFYWNoKGtleSA9PiB7XG4gICAgICBjb25zdCBmb3JtYXR0ZXIgPSByZWdpc3RyeS5nZXRGb3JtYXR0ZXIoa2V5LnNwbGl0KCc6JylbMF0pXG4gICAgICBpZiAoZm9ybWF0dGVyKSB7XG4gICAgICAgIGZvcm1hdHMucHVzaChbZm9ybWF0dGVyLCBhdHRyc1trZXldXSlcbiAgICAgIH1cbiAgICB9KVxuICB9XG4gIHJldHVybiBmb3JtYXRzXG59XG4iXX0=
|
package/package.json
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
{
|
2
2
|
"name": "@textbus/collaborate",
|
3
|
-
"version": "2.
|
3
|
+
"version": "2.1.2",
|
4
4
|
"description": "Textbus is a rich text editor and framework that is highly customizable and extensible to achieve rich wysiwyg effects.",
|
5
5
|
"main": "./bundles/public-api.js",
|
6
6
|
"module": "./bundles/public-api.js",
|
@@ -26,9 +26,9 @@
|
|
26
26
|
],
|
27
27
|
"dependencies": {
|
28
28
|
"@tanbo/di": "^1.1.3",
|
29
|
-
"@tanbo/stream": "^1.1.
|
30
|
-
"@textbus/browser": "^2.
|
31
|
-
"@textbus/core": "^2.
|
29
|
+
"@tanbo/stream": "^1.1.8",
|
30
|
+
"@textbus/browser": "^2.1.2",
|
31
|
+
"@textbus/core": "^2.1.2",
|
32
32
|
"reflect-metadata": "^0.1.13",
|
33
33
|
"y-protocols": "^1.0.5",
|
34
34
|
"yjs": "^13.5.39"
|
@@ -44,5 +44,5 @@
|
|
44
44
|
"bugs": {
|
45
45
|
"url": "https://github.com/textbus/textbus.git/issues"
|
46
46
|
},
|
47
|
-
"gitHead": "
|
47
|
+
"gitHead": "f3feb2bf7e5eab7c8b1e636e558359bd275be61c"
|
48
48
|
}
|
@@ -3,8 +3,7 @@ import {
|
|
3
3
|
createElement,
|
4
4
|
VIEW_CONTAINER,
|
5
5
|
getLayoutRectByRange,
|
6
|
-
SelectionBridge
|
7
|
-
getBoundingClientRect
|
6
|
+
SelectionBridge
|
8
7
|
} from '@textbus/browser'
|
9
8
|
import { Selection, SelectionPaths, AbstractSelection, Scheduler, Rect } from '@textbus/core'
|
10
9
|
import { fromEvent, Subject, Subscription } from '@tanbo/stream'
|
@@ -117,7 +116,7 @@ export class CollaborateCursor {
|
|
117
116
|
|
118
117
|
draw(paths: RemoteSelection[]) {
|
119
118
|
this.currentSelection = paths
|
120
|
-
const containerRect =
|
119
|
+
const containerRect = this.container.getBoundingClientRect()
|
121
120
|
this.canvas.style.top = containerRect.top * -1 + 'px'
|
122
121
|
this.canvas.width = this.canvas.offsetWidth
|
123
122
|
this.canvas.height = this.canvas.offsetHeight
|
package/src/collaborate.ts
CHANGED
@@ -84,6 +84,17 @@ export abstract class TranslatorFallback {
|
|
84
84
|
abstract createComponentByData(name: string, data: ComponentInitData): ComponentInstance | null
|
85
85
|
}
|
86
86
|
|
87
|
+
interface Update {
|
88
|
+
record: boolean
|
89
|
+
actions: Array<() => void>
|
90
|
+
}
|
91
|
+
|
92
|
+
interface UpdateItem {
|
93
|
+
record: boolean
|
94
|
+
|
95
|
+
action(): void
|
96
|
+
}
|
97
|
+
|
87
98
|
@Injectable()
|
88
99
|
export class Collaborate implements History {
|
89
100
|
onSelectionChange: Observable<SelectionPaths>
|
@@ -119,7 +130,8 @@ export class Collaborate implements History {
|
|
119
130
|
private selectionChangeEvent = new Subject<SelectionPaths>()
|
120
131
|
private contentMap = new ContentMap()
|
121
132
|
|
122
|
-
private updateRemoteActions: Array<
|
133
|
+
private updateRemoteActions: Array<UpdateItem> = []
|
134
|
+
private noRecord = {}
|
123
135
|
|
124
136
|
constructor(@Inject(HISTORY_STACK_SIZE) private stackSize: number,
|
125
137
|
private rootComponentRef: RootComponentRef,
|
@@ -176,12 +188,38 @@ export class Collaborate implements History {
|
|
176
188
|
return item.length
|
177
189
|
})
|
178
190
|
).subscribe(() => {
|
179
|
-
|
180
|
-
|
181
|
-
|
182
|
-
|
183
|
-
|
184
|
-
|
191
|
+
const updates: Update[] = []
|
192
|
+
|
193
|
+
let update: Update | null = null
|
194
|
+
|
195
|
+
for (const item of this.updateRemoteActions) {
|
196
|
+
if (!update) {
|
197
|
+
update = {
|
198
|
+
record: item.record,
|
199
|
+
actions: []
|
200
|
+
}
|
201
|
+
updates.push(update)
|
202
|
+
}
|
203
|
+
if (update.record === item.record) {
|
204
|
+
update.actions.push(item.action)
|
205
|
+
} else {
|
206
|
+
update = {
|
207
|
+
record: item.record,
|
208
|
+
actions: [item.action]
|
209
|
+
}
|
210
|
+
updates.push(update)
|
211
|
+
}
|
212
|
+
}
|
213
|
+
|
214
|
+
this.updateRemoteActions = []
|
215
|
+
|
216
|
+
for (const item of updates) {
|
217
|
+
this.yDoc.transact(() => {
|
218
|
+
item.actions.forEach(fn => {
|
219
|
+
fn()
|
220
|
+
})
|
221
|
+
}, item.record ? this.yDoc : this.noRecord)
|
222
|
+
}
|
185
223
|
})
|
186
224
|
)
|
187
225
|
this.syncRootComponent(root, rootComponent)
|
@@ -361,17 +399,7 @@ export class Collaborate implements History {
|
|
361
399
|
if (action.type === 'retain') {
|
362
400
|
const formats = action.formats
|
363
401
|
if (formats) {
|
364
|
-
|
365
|
-
let length = keys.length
|
366
|
-
keys.forEach(key => {
|
367
|
-
if (!this.registry.getFormatter(key)) {
|
368
|
-
length--
|
369
|
-
Reflect.deleteProperty(formats, key)
|
370
|
-
}
|
371
|
-
})
|
372
|
-
if (length) {
|
373
|
-
content.format(offset, action.offset, formats)
|
374
|
-
}
|
402
|
+
content.format(offset, action.offset, localFormatToRemote(formats, this.registry))
|
375
403
|
} else {
|
376
404
|
offset = action.offset
|
377
405
|
}
|
@@ -380,11 +408,11 @@ export class Collaborate implements History {
|
|
380
408
|
const isEmpty = delta.length === 1 && delta[0].insert === Slot.emptyPlaceholder
|
381
409
|
if (typeof action.content === 'string') {
|
382
410
|
length = action.content.length
|
383
|
-
content.insert(offset, action.content, action.formats || {})
|
411
|
+
content.insert(offset, action.content, localFormatToRemote(action.formats || {}, this.registry))
|
384
412
|
} else {
|
385
413
|
length = 1
|
386
414
|
const sharedComponent = this.createSharedComponentByComponent(action.ref as ComponentInstance)
|
387
|
-
content.insertEmbed(offset, sharedComponent)
|
415
|
+
content.insertEmbed(offset, sharedComponent, localFormatToRemote(action.formats || {}, this.registry))
|
388
416
|
}
|
389
417
|
|
390
418
|
if (isEmpty && offset === 0) {
|
@@ -434,12 +462,10 @@ export class Collaborate implements History {
|
|
434
462
|
}
|
435
463
|
remoteSlot.observe(syncRemote)
|
436
464
|
|
437
|
-
const sub = slot.onStateChange.subscribe(
|
465
|
+
const sub = slot.onStateChange.subscribe(change => {
|
438
466
|
this.runLocalUpdate(() => {
|
439
|
-
|
440
|
-
|
441
|
-
})
|
442
|
-
})
|
467
|
+
remoteSlot.set('state', change.newState)
|
468
|
+
}, change.record)
|
443
469
|
})
|
444
470
|
this.slotStateSyncCaches.set(slot, () => {
|
445
471
|
remoteSlot.unobserve(syncRemote)
|
@@ -522,10 +548,10 @@ export class Collaborate implements History {
|
|
522
548
|
}
|
523
549
|
remoteComponent.observe(syncRemote)
|
524
550
|
|
525
|
-
const sub = component.onStateChange.subscribe(
|
551
|
+
const sub = component.onStateChange.subscribe(change => {
|
526
552
|
this.runLocalUpdate(() => {
|
527
|
-
remoteComponent.set('state', newState)
|
528
|
-
})
|
553
|
+
remoteComponent.set('state', change.newState)
|
554
|
+
}, change.record)
|
529
555
|
})
|
530
556
|
this.componentStateSyncCaches.set(component, () => {
|
531
557
|
remoteComponent.unobserve(syncRemote)
|
@@ -533,11 +559,14 @@ export class Collaborate implements History {
|
|
533
559
|
})
|
534
560
|
}
|
535
561
|
|
536
|
-
private runLocalUpdate(fn: () => void) {
|
562
|
+
private runLocalUpdate(fn: () => void, record = true) {
|
537
563
|
if (this.updateFromRemote || this.controller.readonly) {
|
538
564
|
return
|
539
565
|
}
|
540
|
-
this.updateRemoteActions.push(
|
566
|
+
this.updateRemoteActions.push({
|
567
|
+
record,
|
568
|
+
action: fn
|
569
|
+
})
|
541
570
|
}
|
542
571
|
|
543
572
|
private runRemoteUpdate(tr: Transaction, fn: () => void) {
|
@@ -576,13 +605,9 @@ export class Collaborate implements History {
|
|
576
605
|
sharedSlot.set('content', sharedContent)
|
577
606
|
let offset = 0
|
578
607
|
slot.toDelta().forEach(i => {
|
579
|
-
let formats
|
608
|
+
let formats
|
580
609
|
if (i.formats) {
|
581
|
-
i.formats
|
582
|
-
formats[item[0].name] = item[1]
|
583
|
-
})
|
584
|
-
} else {
|
585
|
-
formats = null
|
610
|
+
formats = formatsToRemote(i.formats)
|
586
611
|
}
|
587
612
|
if (typeof i.insert === 'string') {
|
588
613
|
sharedContent.insert(offset, i.insert, formats)
|
@@ -650,7 +675,7 @@ export class Collaborate implements History {
|
|
650
675
|
const sharedComponent = action.insert as YMap<any>
|
651
676
|
const canInsertInlineComponent = slot.schema.includes(ContentType.InlineComponent)
|
652
677
|
const component = this.createComponentBySharedComponent(sharedComponent, canInsertInlineComponent)
|
653
|
-
slot.insert(component)
|
678
|
+
slot.insert(component, makeFormats(this.registry, action.attributes))
|
654
679
|
this.syncSlots(sharedComponent.get('slots'), component)
|
655
680
|
this.syncComponent(sharedComponent, component)
|
656
681
|
}
|
@@ -687,11 +712,54 @@ export class Collaborate implements History {
|
|
687
712
|
}
|
688
713
|
}
|
689
714
|
|
715
|
+
function formatsToRemote(formats: Formats) {
|
716
|
+
const result: Record<string, any> = {}
|
717
|
+
|
718
|
+
for (const item of formats) {
|
719
|
+
const [formatter, values] = item
|
720
|
+
if (typeof formatter.createValueIdIfOverlap === 'function') {
|
721
|
+
if (Array.isArray(values)) {
|
722
|
+
values.forEach(value => {
|
723
|
+
const valueId = (formatter.createValueIdIfOverlap as any)(value)
|
724
|
+
result[`${formatter.name}:${valueId}`] = value
|
725
|
+
})
|
726
|
+
break
|
727
|
+
}
|
728
|
+
}
|
729
|
+
result[formatter.name] = values
|
730
|
+
}
|
731
|
+
return result
|
732
|
+
}
|
733
|
+
|
734
|
+
function localFormatToRemote(formats: Record<string, any>, registry: Registry) {
|
735
|
+
const keys = Object.keys(formats)
|
736
|
+
const result: Record<string, any> = {}
|
737
|
+
|
738
|
+
for (const key of keys) {
|
739
|
+
const formatter = registry.getFormatter(key)
|
740
|
+
if (!formatter) {
|
741
|
+
break
|
742
|
+
}
|
743
|
+
if (typeof formatter.createValueIdIfOverlap === 'function') {
|
744
|
+
const values = formats[key]
|
745
|
+
if (Array.isArray(values)) {
|
746
|
+
values.forEach(value => {
|
747
|
+
const valueId = (formatter.createValueIdIfOverlap as any)(value)
|
748
|
+
result[`${formatter.name}:${valueId}`] = value
|
749
|
+
})
|
750
|
+
break
|
751
|
+
}
|
752
|
+
}
|
753
|
+
result[key] = formats[key]
|
754
|
+
}
|
755
|
+
return result
|
756
|
+
}
|
757
|
+
|
690
758
|
function makeFormats(registry: Registry, attrs?: any) {
|
691
759
|
const formats: Formats = []
|
692
760
|
if (attrs) {
|
693
761
|
Object.keys(attrs).forEach(key => {
|
694
|
-
const formatter = registry.getFormatter(key)
|
762
|
+
const formatter = registry.getFormatter(key.split(':')[0])
|
695
763
|
if (formatter) {
|
696
764
|
formats.push([formatter, attrs[key]])
|
697
765
|
}
|