UNPKG

angular-upcrop

Version:

Library with upload and crop feature for Angular 6+

354 lines (353 loc) 26.7 kB
/** * @fileoverview added by tsickle * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc */ import { Component, ViewChild, Input, Output, EventEmitter } from '@angular/core'; import { CropperComponent } from 'angular-cropperjs'; var UpcropCropComponent = /** @class */ (function () { function UpcropCropComponent() { this.config = {}; this.uploader = []; this.onCropImage = new EventEmitter(); this.uploading = false; this.current = false; this.currentNumber = false; } /** * @return {?} */ UpcropCropComponent.prototype.ngOnInit = /** * @return {?} */ function () { }; /** * Set cropping * set cropping and everything to start crop * @param uploader */ /** * Set cropping * set cropping and everything to start crop * @param {?} uploader * @return {?} */ UpcropCropComponent.prototype.setCropping = /** * Set cropping * set cropping and everything to start crop * @param {?} uploader * @return {?} */ function (uploader) { // // Disable cropping this.current = false; this.currentNumber = false; // // Set uploader this.uploader = uploader; // // Set queue for crop this.uploader.queue; // // Get next crop in the queue this.goToNextCrop(); }; /** * Unset cropping */ /** * Unset cropping * @return {?} */ UpcropCropComponent.prototype.unsetCropping = /** * Unset cropping * @return {?} */ function () { this.angularCropper.cropper.destroy(); this.current = false; }; /** * Go to next crop */ /** * Go to next crop * @return {?} */ UpcropCropComponent.prototype.goToNextCrop = /** * Go to next crop * @return {?} */ function () { var _this = this; // // Validate file if (!this.uploader.queue.length) return; // // Update counter and file if (this.currentNumber === false) { this.currentNumber = 0; } else { this.emitOnCropImage(); // // Unset cropping this.unsetCropping(); // // Update counter this.currentNumber++; } // // Get next crop in the queue this.current = this.uploader.queue[this.currentNumber]; /** @type {?} */ var reader = new FileReader(); // // Callback for reader.readAsDataUrl() below reader.onloadend = function (e) { // // Set _dataUrl // // Set _dataUrl _this.current._dataUrl = reader.result; }; // // Get data url reader.readAsDataURL(this.current._file); }; /** * Emit on crop image */ /** * Emit on crop image * @return {?} */ UpcropCropComponent.prototype.emitOnCropImage = /** * Emit on crop image * @return {?} */ function () { // // Add image data to current file this.onCropImage.emit({ data: this.angularCropper.cropper.getData(), file: this.currentNumber }); }; /** * Zoom in */ /** * Zoom in * @return {?} */ UpcropCropComponent.prototype.zoomIn = /** * Zoom in * @return {?} */ function () { // // Validate if (!this.angularCropper || !this.angularCropper.cropper) return; // // Action this.angularCropper.cropper.zoom(0.1); }; /** * Zoom out */ /** * Zoom out * @return {?} */ UpcropCropComponent.prototype.zoomOut = /** * Zoom out * @return {?} */ function () { // // Validate if (!this.angularCropper || !this.angularCropper.cropper) return; // // Action this.angularCropper.cropper.zoom(-0.1); }; /** * Go left */ /** * Go left * @return {?} */ UpcropCropComponent.prototype.goLeft = /** * Go left * @return {?} */ function () { // // Validate if (!this.angularCropper || !this.angularCropper.cropper) return; // // Action this.angularCropper.cropper.move(-10, 0); }; /** * Go right */ /** * Go right * @return {?} */ UpcropCropComponent.prototype.goRight = /** * Go right * @return {?} */ function () { // // Validate if (!this.angularCropper || !this.angularCropper.cropper) return; // // Action this.angularCropper.cropper.move(10, 0); }; /** * Go up */ /** * Go up * @return {?} */ UpcropCropComponent.prototype.goUp = /** * Go up * @return {?} */ function () { // // Validate if (!this.angularCropper || !this.angularCropper.cropper) return; // // Action this.angularCropper.cropper.move(0, -10); }; /** * Go down */ /** * Go down * @return {?} */ UpcropCropComponent.prototype.goDown = /** * Go down * @return {?} */ function () { // // Validate if (!this.angularCropper || !this.angularCropper.cropper) return; // // Action this.angularCropper.cropper.move(0, 10); }; /** * Rotate left */ /** * Rotate left * @return {?} */ UpcropCropComponent.prototype.rotateLeft = /** * Rotate left * @return {?} */ function () { // // Validate if (!this.angularCropper || !this.angularCropper.cropper) return; // // Action this.angularCropper.cropper.rotate(-45); }; /** * Rotate right */ /** * Rotate right * @return {?} */ UpcropCropComponent.prototype.rotateRight = /** * Rotate right * @return {?} */ function () { // // Validate if (!this.angularCropper || !this.angularCropper.cropper) return; // // Action this.angularCropper.cropper.rotate(45); }; /** * Reset */ /** * Reset * @return {?} */ UpcropCropComponent.prototype.reset = /** * Reset * @return {?} */ function () { // // Validate if (!this.angularCropper || !this.angularCropper.cropper) return; // // Action this.angularCropper.cropper.reset(); }; UpcropCropComponent.decorators = [ { type: Component, args: [{ selector: 'upcrop-crop', template: "<!-- MAIN LOAD -->\n<div class=\"crop-loading\" [fxHide]=\"!uploading\">\n <div class=\"spinner\"></div>\n</div>\n\n<div [hidden]=\"uploading\" class=\"upcrop-crop\">\n <h2 class=\"has-text-centered mat-subheading-2\">Imagem {{currentNumber + 1}} de {{uploader?.queue?.length}}</h2>\n\n <div class=\"crop-image-container\">\n <angular-cropper #angularCropper *ngIf=\"current && current._dataUrl\" [cropperOptions]=\"config\" [imageUrl]=\"current?._dataUrl\"></angular-cropper>\n </div>\n\n <!--CROPPER CONTROLS-->\n <div class=\"crop-controls\" fxLayout fxLayoutAlign=\"center center\" fxLayoutWrap *ngIf=\"current && current._dataUrl\">\n <button mat-button (click)=\"zoomIn()\" class=\"mat-icon-button\" aria-label=\"Aumentar zoom\" mdTooltip=\"Aumentar zoom\">\n <mat-icon>zoom_in</mat-icon>\n </button>\n\n <button mat-button (click)=\"zoomOut()\" class=\"mat-icon-button\" aria-label=\"Diminuir zoom\" mdTooltip=\"Diminuir zoom\">\n <mat-icon>zoom_out</mat-icon>\n </button>\n\n <button mat-button (click)=\"goLeft()\" class=\"mat-icon-button\" aria-label=\"Mover para esquerda\" mdTooltip=\"Mover para esquerda\">\n <mat-icon>keyboard_arrow_left</mat-icon>\n </button>\n\n <button mat-button (click)=\"goRight()\" class=\"mat-icon-button\" aria-label=\"Mover para direita\" mdTooltip=\"Mover para direita\">\n <mat-icon>keyboard_arrow_right</mat-icon>\n </button>\n\n <button mat-button (click)=\"goUp()\" class=\"mat-icon-button\" aria-label=\"Mover para cima\" mdTooltip=\"Mover para cima\">\n <mat-icon>keyboard_arrow_up</mat-icon>\n </button>\n\n <button mat-button (click)=\"goDown()\" class=\"mat-icon-button\" aria-label=\"Mover para baixo\" mdTooltip=\"Mover para baixo\">\n <mat-icon>keyboard_arrow_down</mat-icon>\n </button>\n\n <button mat-button (click)=\"reset()\" class=\"mat-icon-button mat-primary\" aria-label=\"Restaurar imagem original\" mdTooltip=\"Restaurar imagem original\">\n <mat-icon>cached</mat-icon>\n </button>\n </div>\n</div>\n", styles: [".crop-image-container{max-height:500px;width:100%}.crop-image-container img{max-width:100%;max-height:100%}.crop-controls{padding-top:20px;padding-bottom:20px}.crop-loading{min-height:120px;padding-top:34px;margin:100px 24px;box-sizing:border-box;flex-direction:column;max-width:100%;place-content:center;align-items:center;display:flex}.crop-loading .spinner{margin-top:-20px;border:4px solid rgba(0,0,0,.06);border-top:4px solid #2196f3;border-radius:50%;width:50px;height:50px;-webkit-animation:1.1s linear infinite spin;animation:1.1s linear infinite spin}.upcrop-crop .has-text-centered{text-align:center!important}@-webkit-keyframes spin{0%{-webkit-transform:rotate(0);transform:rotate(0)}100%{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}@keyframes spin{0%{-webkit-transform:rotate(0);transform:rotate(0)}100%{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}"] },] }, ]; /** @nocollapse */ UpcropCropComponent.ctorParameters = function () { return []; }; UpcropCropComponent.propDecorators = { angularCropper: [{ type: ViewChild, args: ['angularCropper',] }], config: [{ type: Input }], uploader: [{ type: Input }], onCropImage: [{ type: Output }] }; return UpcropCropComponent; }()); export { UpcropCropComponent }; if (false) { /** @type {?} */ UpcropCropComponent.prototype.angularCropper; /** @type {?} */ UpcropCropComponent.prototype.config; /** @type {?} */ UpcropCropComponent.prototype.uploader; /** @type {?} */ UpcropCropComponent.prototype.onCropImage; /** @type {?} */ UpcropCropComponent.prototype.uploading; /** @type {?} */ UpcropCropComponent.prototype.current; /** @type {?} */ UpcropCropComponent.prototype.currentNumber; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXBjcm9wLWNyb3AuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6Im5nOi8vYW5ndWxhci11cGNyb3AvIiwic291cmNlcyI6WyJsaWIvdXBjcm9wLWNyb3AvdXBjcm9wLWNyb3AuY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7QUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFVLFNBQVMsRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLFlBQVksRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUMxRixPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQzs7SUE2RGpEO3NCQVI4QixFQUFFO3dCQUNBLEVBQUU7MkJBQ0gsSUFBSSxZQUFZLEVBQUU7eUJBRXpCLEtBQUs7dUJBQ1AsS0FBSzs2QkFDQyxLQUFLO0tBRWhCOzs7O0lBRWpCLHNDQUFROzs7SUFBUjtLQUNDO0lBRUQ7Ozs7T0FJRzs7Ozs7OztJQUNILHlDQUFXOzs7Ozs7SUFBWCxVQUFZLFFBQVE7OztRQUloQixJQUFJLENBQUMsT0FBTyxHQUFHLEtBQUssQ0FBQztRQUNyQixJQUFJLENBQUMsYUFBYSxHQUFHLEtBQUssQ0FBQzs7O1FBSTNCLElBQUksQ0FBQyxRQUFRLEdBQUcsUUFBUSxDQUFDOzs7UUFJekIsSUFBSSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUM7OztRQUlwQixJQUFJLENBQUMsWUFBWSxFQUFFLENBQUM7S0FDdkI7SUFFRDs7T0FFRzs7Ozs7SUFDSCwyQ0FBYTs7OztJQUFiO1FBQ0ksSUFBSSxDQUFDLGNBQWMsQ0FBQyxPQUFPLENBQUMsT0FBTyxFQUFFLENBQUM7UUFDdEMsSUFBSSxDQUFDLE9BQU8sR0FBRyxLQUFLLENBQUM7S0FDeEI7SUFFRDs7T0FFRzs7Ozs7SUFDSCwwQ0FBWTs7OztJQUFaO1FBQUEsaUJBMkNDOzs7UUF2Q0csRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUM7WUFBQyxNQUFNLENB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U0FBUyxTQUFDLGdCQUFnQjt5QkFDMUIsS0FBSzsyQkFDTCxLQUFLOzhCQUNMLE1BQU07OzhCQXhEWDs7U0FtRGEsbUJBQW1CIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBPbkluaXQsIFZpZXdDaGlsZCwgSW5wdXQsIE91dHB1dCwgRXZlbnRFbWl0dGVyIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBDcm9wcGVyQ29tcG9uZW50IH0gZnJvbSAnYW5ndWxhci1jcm9wcGVyanMnO1xuXG5AQ29tcG9uZW50KHtcbiAgICBzZWxlY3RvcjogJ3VwY3JvcC1jcm9wJyxcbiAgICB0ZW1wbGF0ZTogYDwhLS0gTUFJTiBMT0FEIC0tPlxuPGRpdiBjbGFzcz1cImNyb3AtbG9hZGluZ1wiIFtmeEhpZGVdPVwiIXVwbG9hZGluZ1wiPlxuICAgIDxkaXYgY2xhc3M9XCJzcGlubmVyXCI+PC9kaXY+XG48L2Rpdj5cblxuPGRpdiBbaGlkZGVuXT1cInVwbG9hZGluZ1wiIGNsYXNzPVwidXBjcm9wLWNyb3BcIj5cbiAgICA8aDIgY2xhc3M9XCJoYXMtdGV4dC1jZW50ZXJlZCBtYXQtc3ViaGVhZGluZy0yXCI+SW1hZ2VtIHt7Y3VycmVudE51bWJlciArIDF9fSBkZSB7e3VwbG9hZGVyPy5xdWV1ZT8ubGVuZ3RofX08L2gyPlxuXG4gICAgPGRpdiBjbGFzcz1cImNyb3AtaW1hZ2UtY29udGFpbmVyXCI+XG4gICAgICAgIDxhbmd1bGFyLWNyb3BwZXIgI2FuZ3VsYXJDcm9wcGVyICpuZ0lmPVwiY3VycmVudCAmJiBjdXJyZW50Ll9kYXRhVXJsXCIgW2Nyb3BwZXJPcHRpb25zXT1cImNvbmZpZ1wiIFtpbWFnZVVybF09XCJjdXJyZW50Py5fZGF0YVVybFwiPjwvYW5ndWxhci1jcm9wcGVyPlxuICAgIDwvZGl2PlxuXG4gICAgPCEtLUNST1BQRVIgQ09OVFJPTFMtLT5cbiAgICA8ZGl2IGNsYXNzPVwiY3JvcC1jb250cm9sc1wiIGZ4TGF5b3V0IGZ4TGF5b3V0QWxpZ249XCJjZW50ZXIgY2VudGVyXCIgZnhMYXlvdXRXcmFwICpuZ0lmPVwiY3VycmVudCAmJiBjdXJyZW50Ll9kYXRhVXJsXCI+XG4gICAgICAgIDxidXR0b24gbWF0LWJ1dHRvbiAoY2xpY2spPVwiem9vbUluKClcIiBjbGFzcz1cIm1hdC1pY29uLWJ1dHRvblwiIGFyaWEtbGFiZWw9XCJBdW1lbnRhciB6b29tXCIgbWRUb29sdGlwPVwiQXVtZW50YXIgem9vbVwiPlxuICAgICAgICAgICAgPG1hdC1pY29uPnpvb21faW48L21hdC1pY29uPlxuICAgICAgICA8L2J1dHRvbj5cblxuICAgICAgICA8YnV0dG9uIG1hdC1idXR0b24gKGNsaWNrKT1cInpvb21PdXQoKVwiIGNsYXNzPVwibWF0LWljb24tYnV0dG9uXCIgYXJpYS1sYWJlbD1cIkRpbWludWlyIHpvb21cIiBtZFRvb2x0aXA9XCJEaW1pbnVpciB6b29tXCI+XG4gICAgICAgICAgICA8bWF0LWljb24+em9vbV9vdXQ8L21hdC1pY29uPlxuICAgICAgICA8L2J1dHRvbj5cblxuICAgICAgICA8YnV0dG9uIG1hdC1idXR0b24gKGNsaWNrKT1cImdvTGVmdCgpXCIgY2xhc3M9XCJtYXQtaWNvbi1idXR0b25cIiBhcmlhLWxhYmVsPVwiTW92ZXIgcGFyYSBlc3F1ZXJkYVwiIG1kVG9vbHRpcD1cIk1vdmVyIHBhcmEgZXNxdWVyZGFcIj5cbiAgICAgICAgICAgIDxtYXQtaWNvbj5rZXlib2FyZF9hcnJvd19sZWZ0PC9tYXQtaWNvbj5cbiAgICAgICAgPC9idXR0b24+XG5cbiAgICAgICAgPGJ1dHRvbiBtYXQtYnV0dG9uIChjbGljayk9XCJnb1JpZ2h0KClcIiBjbGFzcz1cIm1hdC1pY29uLWJ1dHRvblwiIGFyaWEtbGFiZWw9XCJNb3ZlciBwYXJhIGRpcmVpdGFcIiBtZFRvb2x0aXA9XCJNb3ZlciBwYXJhIGRpcmVpdGFcIj5cbiAgICAgICAgICAgIDxtYXQtaWNvbj5rZXlib2FyZF9hcnJvd19yaWdodDwvbWF0LWljb24+XG4gICAgICAgIDwvYnV0dG9uPlxuXG4gICAgICAgIDxidXR0b24gbWF0LWJ1dHRvbiAoY2xpY2spPVwiZ29VcCgpXCIgY2xhc3M9XCJtYXQtaWNvbi1idXR0b25cIiBhcmlhLWxhYmVsPVwiTW92ZXIgcGFyYSBjaW1hXCIgbWRUb29sdGlwPVwiTW92ZXIgcGFyYSBjaW1hXCI+XG4gICAgICAgICAgICA8bWF0LWljb24+a2V5Ym9hcmRfYXJyb3dfdXA8L21hdC1pY29uPlxuICAgICAgICA8L2J1dHRvbj5cblxuICAgICAgICA8YnV0dG9uIG1hdC1idXR0b24gKGNsaWNrKT1cImdvRG93bigpXCIgY2xhc3M9XCJtYXQtaWNvbi1idXR0b25cIiBhcmlhLWxhYmVsPVwiTW92ZXIgcGFyYSBiYWl4b1wiIG1kVG9vbHRpcD1cIk1vdmVyIHBhcmEgYmFpeG9cIj5cbiAgICAgICAgICAgIDxtYXQtaWNvbj5rZXlib2FyZF9hcnJvd19kb3duPC9tYXQtaWNvbj5cbiAgICAgICAgPC9idXR0b24+XG5cbiAgICAgICAgPGJ1dHRvbiBtYXQtYnV0dG9uIChjbGljayk9XCJyZXNldCgpXCIgY2xhc3M9XCJtYXQtaWNvbi1idXR0b24gbWF0LXByaW1hcnlcIiBhcmlhLWxhYmVsPVwiUmVzdGF1cmFyIGltYWdlbSBvcmlnaW5hbFwiIG1kVG9vbHRpcD1cIlJlc3RhdXJhciBpbWFnZW0gb3JpZ2luYWxcIj5cbiAgICAgICAgICAgIDxtYXQtaWNvbj5jYWNoZWQ8L21hdC1pY29uPlxuICAgICAgICA8L2J1dHRvbj5cbiAgICA8L2Rpdj5cbjwvZGl2PlxuYCxcbiAgICBzdHlsZXM6IFtgLmNyb3AtaW1hZ2UtY29udGFpbmVye21heC1oZWlnaHQ6NTAwcHg7d2lkdGg6MTAwJX0uY3JvcC1pbWFnZS1jb250YWluZXIgaW1ne21heC13aWR0aDoxMDAlO21heC1oZWlnaHQ6MTAwJX0uY3JvcC1jb250cm9sc3twYWRkaW5nLXRvcDoyMHB4O3BhZGRpbmctYm90dG9tOjIwcHh9LmNyb3AtbG9hZGluZ3ttaW4taGVpZ2h0OjEyMHB4O3BhZGRpbmctdG9wOjM0cHg7bWFyZ2luOjEwMHB4IDI0cHg7Ym94LXNpemluZzpib3JkZXItYm94O2ZsZXgtZGlyZWN0aW9uOmNvbHVtbjttYXgtd2lkdGg6MTAwJTtwbGFjZS1jb250ZW50OmNlbnRlcjthbGlnbi1pdGVtczpjZW50ZXI7ZGlzcGxheTpmbGV4fS5jcm9wLWxvYWRpbmcgLnNwaW5uZXJ7bWFyZ2luLXRvcDotMjBweDtib3JkZXI6NHB4IHNvbGlkIHJnYmEoMCwwLDAsLjA2KTtib3JkZXItdG9wOjRweCBzb2xpZCAjMjE5NmYzO2JvcmRlci1yYWRpdXM6NTAlO3dpZHRoOjUwcHg7aGVpZ2h0OjUwcHg7LXdlYmtpdC1hbmltYXRpb246MS4xcyBsaW5lYXIgaW5maW5pdGUgc3BpbjthbmltYXRpb246MS4xcyBsaW5lYXIgaW5maW5pdGUgc3Bpbn0udXBjcm9wLWNyb3AgLmhhcy10ZXh0LWNlbnRlcmVke3RleHQtYWxpZ246Y2VudGVyIWltcG9ydGFudH1ALXdlYmtpdC1rZXlmcmFtZXMgc3BpbnswJXstd2Via2l0LXRyYW5zZm9ybTpyb3RhdGUoMCk7dHJhbnNmb3JtOnJvdGF0ZSgwKX0xMDAley13ZWJraXQtdHJhbnNmb3JtOnJvdGF0ZSgzNjBkZWcpO3RyYW5zZm9ybTpyb3RhdGUoMzYwZGVnKX19QGtleWZyYW1lcyBzcGluezAley13ZWJraXQtdHJhbnNmb3JtOnJvdGF0ZSgwKTt0cmFuc2Zvcm06cm90YXRlKDApfTEwMCV7LXdlYmtpdC10cmFuc2Zvcm06cm90YXRlKDM2MGRlZyk7dHJhbnNmb3JtOnJvdGF0ZSgzNjBkZWcpfX1gXVxufSlcbmV4cG9ydCBjbGFzcyBVcGNyb3BDcm9wQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0IHtcblxuICAgIEBWaWV3Q2hpbGQoJ2FuZ3VsYXJDcm9wcGVyJykgcHVibGljIGFuZ3VsYXJDcm9wcGVyOiBDcm9wcGVyQ29tcG9uZW50O1xuICAgIEBJbnB1dCgpIHB1YmxpYyBjb25maWc6IGFueSA9IHt9O1xuICAgIEBJbnB1dCgpIHB1YmxpYyB1cGxvYWRlcjogYW55ID0gW107XG4gICAgQE91dHB1dCgpIHB1YmxpYyBvbkNyb3BJbWFnZSA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcblxuICAgIHB1YmxpYyB1cGxvYWRpbmc6IGFueSA9IGZhbHNlO1xuICAgIHB1YmxpYyBjdXJyZW50OiBhbnkgPSBmYWxzZTtcbiAgICBwdWJsaWMgY3VycmVudE51bWJlcjogYW55ID0gZmFsc2U7XG5cbiAgICBjb25zdHJ1Y3RvcigpIHsgfVxuXG4gICAgbmdPbkluaXQoKSB7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2V0IGNyb3BwaW5nXG4gICAgICogc2V0IGNyb3BwaW5nIGFuZCBldmVyeXRoaW5nIHRvIHN0YXJ0IGNyb3BcbiAgICAgKiBAcGFyYW0gdXBsb2FkZXJcbiAgICAgKi9cbiAgICBzZXRDcm9wcGluZyh1cGxvYWRlcikge1xuXG4gICAgICAgIC8vXG4gICAgICAgIC8vIERpc2FibGUgY3JvcHBpbmdcbiAgICAgICAgdGhpcy5jdXJyZW50ID0gZmFsc2U7XG4gICAgICAgIHRoaXMuY3VycmVudE51bWJlciA9IGZhbHNlO1xuXG4gICAgICAgIC8vXG4gICAgICAgIC8vIFNldCB1cGxvYWRlclxuICAgICAgICB0aGlzLnVwbG9hZGVyID0gdXBsb2FkZXI7XG5cbiAgICAgICAgLy9cbiAgICAgICAgLy8gU2V0IHF1ZXVlIGZvciBjcm9wXG4gICAgICAgIHRoaXMudXBsb2FkZXIucXVldWU7XG5cbiAgICAgICAgLy9cbiAgICAgICAgLy8gR2V0IG5leHQgY3JvcCBpbiB0aGUgcXVldWVcbiAgICAgICAgdGhpcy5nb1RvTmV4dENyb3AoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBVbnNldCBjcm9wcGluZ1xuICAgICAqL1xuICAgIHVuc2V0Q3JvcHBpbmcoKSB7XG4gICAgICAgIHRoaXMuYW5ndWxhckNyb3BwZXIuY3JvcHBlci5kZXN0cm95KCk7XG4gICAgICAgIHRoaXMuY3VycmVudCA9IGZhbHNlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdvIHRvIG5leHQgY3JvcFxuICAgICAqL1xuICAgIGdvVG9OZXh0Q3JvcCgpIHtcblxuICAgICAgICAvL1xuICAgICAgICAvLyBWYWxpZGF0ZSBmaWxlXG4gICAgICAgIGlmICghdGhpcy51cGxvYWRlci5xdWV1ZS5sZW5ndGgpIHJldHVybjtcblxuICAgICAgICAvL1xuICAgICAgICAvLyBVcGRhdGUgY291bnRlciBhbmQgZmlsZVxuICAgICAgICBpZiAodGhpcy5jdXJyZW50TnVtYmVyID09PSBmYWxzZSkge1xuICAgICAgICAgICAgdGhpcy5jdXJyZW50TnVtYmVyID0gMDtcbiAgICAgICAgfSBlbHNlIHtcblxuICAgICAgICAgICAgdGhpcy5lbWl0T25Dcm9wSW1hZ2UoKTtcblxuICAgICAgICAgICAgLy9cbiAgICAgICAgICAgIC8vIFVuc2V0IGNyb3BwaW5nXG4gICAgICAgICAgICB0aGlzLnVuc2V0Q3JvcHBpbmcoKTtcblxuICAgICAgICAgICAgLy9cbiAgICAgICAgICAgIC8vIFVwZGF0ZSBjb3VudGVyXG4gICAgICAgICAgICB0aGlzLmN1cnJlbnROdW1iZXIrKztcbiAgICAgICAgfVxuXG4gICAgICAgIC8vXG4gICAgICAgIC8vIEdldCBuZXh0IGNyb3AgaW4gdGhlIHF1ZXVlXG4gICAgICAgIHRoaXMuY3VycmVudCA9IHRoaXMudXBsb2FkZXIucXVldWVbdGhpcy5jdXJyZW50TnVtYmVyXTtcblxuICAgICAgICAvL1xuICAgICAgICAvLyBTZXQgaW1hZ2UgZGF0YSB1cmxcbiAgICAgICAgbGV0IHJlYWRlciA9IG5ldyBGaWxlUmVhZGVyKCk7XG5cbiAgICAgICAgLy9cbiAgICAgICAgLy8gQ2FsbGJhY2sgZm9yIHJlYWRlci5yZWFkQXNEYXRhVXJsKCkgYmVsb3dcbiAgICAgICAgcmVhZGVyLm9ubG9hZGVuZCA9IChlKSA9PiB7XG5cbiAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAvLyBTZXQgX2RhdGFVcmxcbiAgICAgICAgICAgIHRoaXMuY3VycmVudC5fZGF0YVVybCA9IHJlYWRlci5yZXN1bHQ7XG4gICAgICAgIH07XG5cbiAgICAgICAgLy9cbiAgICAgICAgLy8gR2V0IGRhdGEgdXJsXG4gICAgICAgIHJlYWRlci5yZWFkQXNEYXRhVVJMKHRoaXMuY3VycmVudC5fZmlsZSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRW1pdCBvbiBjcm9wIGltYWdlXG4gICAgICovXG4gICAgZW1pdE9uQ3JvcEltYWdlKCkge1xuXG4gICAgICAgIC8vXG4gICAgICAgIC8vIEFkZCBpbWFnZSBkYXRhIHRvIGN1cnJlbnQgZmlsZVxuICAgICAgICB0aGlzLm9uQ3JvcEltYWdlLmVtaXQoe1xuICAgICAgICAgICAgZGF0YTogdGhpcy5hbmd1bGFyQ3JvcHBlci5jcm9wcGVyLmdldERhdGEoKSxcbiAgICAgICAgICAgIGZpbGU6IHRoaXMuY3VycmVudE51bWJlclxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBab29tIGluXG4gICAgICovXG4gICAgem9vbUluKCkge1xuXG4gICAgICAgIC8vXG4gICAgICAgIC8vIFZhbGlkYXRlXG4gICAgICAgIGlmICghdGhpcy5hbmd1bGFyQ3JvcHBlciB8fCAhdGhpcy5hbmd1bGFyQ3JvcHBlci5jcm9wcGVyKSByZXR1cm47XG5cbiAgICAgICAgLy9cbiAgICAgICAgLy8gQWN0aW9uXG4gICAgICAgIHRoaXMuYW5ndWxhckNyb3BwZXIuY3JvcHBlci56b29tKDAuMSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogWm9vbSBvdXRcbiAgICAgKi9cbiAgICB6b29tT3V0KCkge1xuXG4gICAgICAgIC8vXG4gICAgICAgIC8vIFZhbGlkYXRlXG4gICAgICAgIGlmICghdGhpcy5hbmd1bGFyQ3JvcHBlciB8fCAhdGhpcy5hbmd1bGFyQ3JvcHBlci5jcm9wcGVyKSByZXR1cm47XG5cbiAgICAgICAgLy9cbiAgICAgICAgLy8gQWN0aW9uXG4gICAgICAgIHRoaXMuYW5ndWxhckNyb3BwZXIuY3JvcHBlci56b29tKC0wLjEpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdvIGxlZnRcbiAgICAgKi9cbiAgICBnb0xlZnQoKSB7XG5cbiAgICAgICAgLy9cbiAgICAgICAgLy8gVmFsaWRhdGVcbiAgICAgICAgaWYgKCF0aGlzLmFuZ3VsYXJDcm9wcGVyIHx8ICF0aGlzLmFuZ3VsYXJDcm9wcGVyLmNyb3BwZXIpIHJldHVybjtcblxuICAgICAgICAvL1xuICAgICAgICAvLyBBY3Rpb25cbiAgICAgICAgdGhpcy5hbmd1bGFyQ3JvcHBlci5jcm9wcGVyLm1vdmUoLTEwLCAwKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHbyByaWdodFxuICAgICAqL1xuICAgIGdvUmlnaHQoKSB7XG5cbiAgICAgICAgLy9cbiAgICAgICAgLy8gVmFsaWRhdGVcbiAgICAgICAgaWYgKCF0aGlzLmFuZ3VsYXJDcm9wcGVyIHx8ICF0aGlzLmFuZ3VsYXJDcm9wcGVyLmNyb3BwZXIpIHJldHVybjtcblxuICAgICAgICAvL1xuICAgICAgICAvLyBBY3Rpb25cbiAgICAgICAgdGhpcy5hbmd1bGFyQ3JvcHBlci5jcm9wcGVyLm1vdmUoMTAsIDApO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdvIHVwXG4gICAgICovXG4gICAgZ29VcCgpIHtcblxuICAgICAgICAvL1xuICAgICAgICAvLyBWYWxpZGF0ZVxuICAgICAgICBpZiAoIXRoaXMuYW5ndWxhckNyb3BwZXIgfHwgIXRoaXMuYW5ndWxhckNyb3BwZXIuY3JvcHBlcikgcmV0dXJuO1xuXG4gICAgICAgIC8vXG4gICAgICAgIC8vIEFjdGlvblxuICAgICAgICB0aGlzLmFuZ3VsYXJDcm9wcGVyLmNyb3BwZXIubW92ZSgwLCAtMTApO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdvIGRvd25cbiAgICAgKi9cbiAgICBnb0Rvd24oKSB7XG5cbiAgICAgICAgLy9cbiAgICAgICAgLy8gVmFsaWRhdGVcbiAgICAgICAgaWYgKCF0aGlzLmFuZ3VsYXJDcm9wcGVyIHx8ICF0aGlzLmFuZ3VsYXJDcm9wcGVyLmNyb3BwZXIpIHJldHVybjtcblxuICAgICAgICAvL1xuICAgICAgICAvLyBBY3Rpb25cbiAgICAgICAgdGhpcy5hbmd1bGFyQ3JvcHBlci5jcm9wcGVyLm1vdmUoMCwgMTApO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJvdGF0ZSBsZWZ0XG4gICAgICovXG4gICAgcm90YXRlTGVmdCgpIHtcblxuICAgICAgICAvL1xuICAgICAgICAvLyBWYWxpZGF0ZVxuICAgICAgICBpZiAoIXRoaXMuYW5ndWxhckNyb3BwZXIgfHwgIXRoaXMuYW5ndWxhckNyb3BwZXIuY3JvcHBlcikgcmV0dXJuO1xuXG4gICAgICAgIC8vXG4gICAgICAgIC8vIEFjdGlvblxuICAgICAgICB0aGlzLmFuZ3VsYXJDcm9wcGVyLmNyb3BwZXIucm90YXRlKC00NSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUm90YXRlIHJpZ2h0XG4gICAgICovXG4gICAgcm90YXRlUmlnaHQoKSB7XG5cbiAgICAgICAgLy9cbiAgICAgICAgLy8gVmFsaWRhdGVcbiAgICAgICAgaWYgKCF0aGlzLmFuZ3VsYXJDcm9wcGVyIHx8ICF0aGlzLmFuZ3VsYXJDcm9wcGVyLmNyb3BwZXIpIHJldHVybjtcblxuICAgICAgICAvL1xuICAgICAgICAvLyBBY3Rpb25cbiAgICAgICAgdGhpcy5hbmd1bGFyQ3JvcHBlci5jcm9wcGVyLnJvdGF0ZSg0NSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmVzZXRcbiAgICAgKi9cbiAgICByZXNldCgpIHtcblxuICAgICAgICAvL1xuICAgICAgICAvLyBWYWxpZGF0ZVxuICAgICAgICBpZiAoIXRoaXMuYW5ndWxhckNyb3BwZXIgfHwgIXRoaXMuYW5ndWxhckNyb3BwZXIuY3JvcHBlcikgcmV0dXJuO1xuXG4gICAgICAgIC8vXG4gICAgICAgIC8vIEFjdGlvblxuICAgICAgICB0aGlzLmFuZ3VsYXJDcm9wcGVyLmNyb3BwZXIucmVzZXQoKTtcbiAgICB9XG59XG4iXX0=