angular-upcrop
Version:
Library with upload and crop feature for Angular 6+
354 lines (353 loc) • 26.7 kB
JavaScript
/**
* @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=