ngx-cropperjs-wrapper
Version:
This angular library is a wrapper of Javascript image cropper
358 lines (352 loc) • 36.7 kB
JavaScript
import { Component, EventEmitter, Input, Output, forwardRef, NgModule } from '@angular/core';
import { NG_VALUE_ACCESSOR } from '@angular/forms';
import Cropper from 'cropperjs';
import { CommonModule } from '@angular/common';
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,uselessCode} checked by tsc
*/
var CropperComponent = /** @class */ (function () {
function CropperComponent() {
this.crop = new EventEmitter();
this.cropMove = new EventEmitter();
this.cropStart = new EventEmitter();
this.cropEnd = new EventEmitter();
this.ready = new EventEmitter();
this.zoom = new EventEmitter();
this.init = new EventEmitter();
this.fail = new EventEmitter();
this.fileChange = new EventEmitter();
this.options = /** @type {?} */ ({});
this.data = /** @type {?} */ ({});
this.propagateChange = function (value) { return value; };
}
Object.defineProperty(CropperComponent.prototype, "imageFile", {
get: /**
* @return {?}
*/
function () {
return this.originalFile;
},
set: /**
* @param {?} value
* @return {?}
*/
function (value) {
var _this = this;
delete this.dataUrl;
this.destroyCropperIfExists();
if (!value) {
return;
}
if (['image/gif', 'image/jpeg', 'image/png'].indexOf(value.type) === -1) {
this.fail.emit(new Error('Invalid input file type'));
return;
}
/** @type {?} */
var reader = new FileReader();
reader.onload = function () {
_this.dataUrl = reader.result;
};
this.originalFile = value;
reader.readAsDataURL(this.originalFile);
},
enumerable: true,
configurable: true
});
Object.defineProperty(CropperComponent.prototype, "imageUrl", {
set: /**
* @param {?} value
* @return {?}
*/
function (value) {
delete this.dataUrl;
this.destroyCropperIfExists();
if (!value) {
return;
}
this.dataUrl = value;
},
enumerable: true,
configurable: true
});
/**
* @param {?} value
* @return {?}
*/
CropperComponent.prototype.writeValue = /**
* @param {?} value
* @return {?}
*/
function (value) {
this.data = value;
if (this.data && this.cropper) {
this.cropper.setData(this.data);
}
};
/**
* @param {?} fn
* @return {?}
*/
CropperComponent.prototype.registerOnChange = /**
* @param {?} fn
* @return {?}
*/
function (fn) {
this.propagateChange = fn;
};
/**
* @return {?}
*/
CropperComponent.prototype.registerOnTouched = /**
* @return {?}
*/
function () { };
/**
* @return {?}
*/
CropperComponent.prototype.ngOnDestroy = /**
* @return {?}
*/
function () {
this.destroyCropperIfExists();
};
/**
* @param {?} event
* @return {?}
*/
CropperComponent.prototype.onImageLoad = /**
* @param {?} event
* @return {?}
*/
function (event) {
/** @type {?} */
var img = /** @type {?} */ (event.target);
this.destroyCropperIfExists();
if ((this.options.minCropWidth && img.naturalWidth < this.options.minCropWidth)
|| (this.options.minCropHeight && img.naturalHeight < this.options.minCropHeight)) {
delete this.dataUrl;
this.fail.emit(new Error('Input image is too small'));
return;
}
this.isReady = false;
this.cropper = new Cropper(img, Object.assign({
crop: this.onCrop.bind(this),
cropmove: this.onCropMove.bind(this),
cropstart: this.onCropStart.bind(this),
cropend: this.onCropEnd.bind(this),
ready: this.onReady.bind(this),
zoom: this.onZoom.bind(this),
}, this.options));
this.init.emit(this.cropper);
};
/**
* @param {?} event
* @return {?}
*/
CropperComponent.prototype.onCrop = /**
* @param {?} event
* @return {?}
*/
function (event) {
if (this.options.viewMode !== 0) {
this.correctCropArea();
}
if (this.isReady) {
this.update();
}
this.crop.emit(event);
};
/**
* @param {?} event
* @return {?}
*/
CropperComponent.prototype.onCropMove = /**
* @param {?} event
* @return {?}
*/
function (event) {
if (this.options.viewMode === 0) {
this.correctCropArea();
}
this.update();
this.cropMove.emit(event);
};
/**
* @param {?} event
* @return {?}
*/
CropperComponent.prototype.onCropStart = /**
* @param {?} event
* @return {?}
*/
function (event) {
this.update();
this.cropStart.emit(event);
};
/**
* @param {?} event
* @return {?}
*/
CropperComponent.prototype.onCropEnd = /**
* @param {?} event
* @return {?}
*/
function (event) {
this.correctCropArea();
this.updateFile();
this.update();
this.cropEnd.emit(event);
};
/**
* @param {?} event
* @return {?}
*/
CropperComponent.prototype.onReady = /**
* @param {?} event
* @return {?}
*/
function (event) {
if (this.data) {
this.cropper.setData(this.data);
this.correctCropArea();
}
else {
this.correctCropArea();
this.update();
}
this.isReady = true;
this.ready.emit(event);
this.updateFile();
};
/**
* @param {?} event
* @return {?}
*/
CropperComponent.prototype.onZoom = /**
* @param {?} event
* @return {?}
*/
function (event) {
this.update();
this.zoom.emit(event);
};
/**
* @return {?}
*/
CropperComponent.prototype.updateFile = /**
* @return {?}
*/
function () {
var _this = this;
/** @type {?} */
var name = 'cropped_file';
if (typeof this.dataUrl === 'string') {
/** @type {?} */
var urlParams = this.dataUrl.split('/');
name = urlParams[urlParams.length - 1];
}
/** @type {?} */
var mimeType = (this.options.outputOptions && this.options.outputOptions.mimeType) || 'image/png';
/** @type {?} */
var qualityArgument = (this.options.outputOptions && this.options.outputOptions.qualityArgument) || 0.9;
this.cropper.getCroppedCanvas().toBlob(function (blob) {
blob.lastModifiedDate = new Date();
blob.name = _this.originalFile ? _this.originalFile.name : name;
_this.fileChange.emit(blob);
}, mimeType, qualityArgument);
};
/**
* @return {?}
*/
CropperComponent.prototype.correctCropArea = /**
* @return {?}
*/
function () {
/** @type {?} */
var data = this.cropper.getData();
if (data.height < this.options.minCropHeight || data.width < this.options.minCropWidth) {
data.width = Math.max(data.width, this.options.minCropWidth || 0);
data.height = Math.max(data.height, this.options.minCropHeight || 0);
this.cropper.setData(data);
}
};
/**
* @return {?}
*/
CropperComponent.prototype.update = /**
* @return {?}
*/
function () {
this.data = this.cropper.getData();
this.propagateChange(this.data);
};
/**
* @return {?}
*/
CropperComponent.prototype.destroyCropperIfExists = /**
* @return {?}
*/
function () {
if (!this.cropper) {
return;
}
this.cropper.destroy();
delete this.cropper;
};
CropperComponent.decorators = [
{ type: Component, args: [{
selector: 'lib-cropper',
template: "<div class=\"cropper-component\" *ngIf=\"dataUrl\">\n <img #image alt=\"image\" [src]=\"dataUrl\" (load)=\"onImageLoad($event)\"/>\n</div>\n",
styles: [".cropper-component img{max-width:100%;max-height:100%}::ng-deep{/*!\n * Cropper.js v1.4.0\n * https://fengyuanchen.github.io/cropperjs\n *\n * Copyright 2015-present Chen Fengyuan\n * Released under the MIT license\n *\n * Date: 2018-06-01T15:18:09.891Z\n */}::ng-deep .cropper-container{direction:ltr;font-size:0;line-height:0;position:relative;touch-action:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}::ng-deep .cropper-container img{display:block;height:100%;image-orientation:0deg;max-height:none!important;max-width:none!important;min-height:0!important;min-width:0!important;width:100%}::ng-deep .cropper-canvas,::ng-deep .cropper-crop-box,::ng-deep .cropper-drag-box,::ng-deep .cropper-modal,::ng-deep .cropper-wrap-box{bottom:0;left:0;position:absolute;right:0;top:0}::ng-deep .cropper-canvas,::ng-deep .cropper-wrap-box{overflow:hidden}::ng-deep .cropper-drag-box{background-color:#fff;opacity:0}::ng-deep .cropper-modal{background-color:#000;opacity:.5}::ng-deep .cropper-view-box{display:block;height:100%;outline:#eee solid 1px;overflow:hidden;width:100%}::ng-deep .cropper-dashed{border:0 dashed #eee;display:block;opacity:.5;position:absolute}::ng-deep .cropper-dashed.dashed-h{border-bottom-width:1px;border-top-width:1px;height:33.33333%;left:0;top:33.33333%;width:100%}::ng-deep .cropper-dashed.dashed-v{border-left-width:1px;border-right-width:1px;height:100%;left:33.33333%;top:0;width:33.33333%}::ng-deep .cropper-center{display:block;height:0;left:50%;opacity:.75;position:absolute;top:50%;width:0}::ng-deep .cropper-center:after,::ng-deep .cropper-center:before{background-color:#eee;content:' ';display:block;position:absolute}::ng-deep .cropper-center:before{height:1px;left:-3px;top:0;width:7px}::ng-deep .cropper-center:after{height:7px;left:0;top:-3px;width:1px}::ng-deep .cropper-face,::ng-deep .cropper-line,::ng-deep .cropper-point{display:block;height:100%;opacity:.1;position:absolute;width:100%}::ng-deep .cropper-face{background-color:#fff;left:0;top:0}::ng-deep .cropper-line{background-color:#39f}::ng-deep .cropper-line.line-e{cursor:ew-resize;right:-3px;top:0;width:5px}::ng-deep .cropper-line.line-n{cursor:ns-resize;height:5px;left:0;top:-3px}::ng-deep .cropper-line.line-w{cursor:ew-resize;left:-3px;top:0;width:5px}::ng-deep .cropper-line.line-s{bottom:-3px;cursor:ns-resize;height:5px;left:0}::ng-deep .cropper-point{background-color:#39f;height:5px;opacity:.75;width:5px}::ng-deep .cropper-point.point-e{cursor:ew-resize;margin-top:-3px;right:-3px;top:50%}::ng-deep .cropper-point.point-n{cursor:ns-resize;left:50%;margin-left:-3px;top:-3px}::ng-deep .cropper-point.point-w{cursor:ew-resize;left:-3px;margin-top:-3px;top:50%}::ng-deep .cropper-point.point-s{bottom:-3px;cursor:s-resize;left:50%;margin-left:-3px}::ng-deep .cropper-point.point-ne{cursor:nesw-resize;right:-3px;top:-3px}::ng-deep .cropper-point.point-nw{cursor:nwse-resize;left:-3px;top:-3px}::ng-deep .cropper-point.point-sw{bottom:-3px;cursor:nesw-resize;left:-3px}::ng-deep .cropper-point.point-se{bottom:-3px;cursor:nwse-resize;height:20px;opacity:1;right:-3px;width:20px}@media (min-width:768px){::ng-deep .cropper-point.point-se{height:15px;width:15px}}@media (min-width:992px){::ng-deep .cropper-point.point-se{height:10px;width:10px}}@media (min-width:1200px){::ng-deep .cropper-point.point-se{height:5px;opacity:.75;width:5px}}::ng-deep .cropper-point.point-se:before{background-color:#39f;bottom:-50%;content:' ';display:block;height:200%;opacity:0;position:absolute;right:-50%;width:200%}::ng-deep .cropper-invisible{opacity:0}::ng-deep .cropper-bg{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQAQMAAAAlPW0iAAAAA3NCSVQICAjb4U/gAAAABlBMVEXMzMz////TjRV2AAAACXBIWXMAAArrAAAK6wGCiw1aAAAAHHRFWHRTb2Z0d2FyZQBBZG9iZSBGaXJld29ya3MgQ1M26LyyjAAAABFJREFUCJlj+M/AgBVhF/0PAH6/D/HkDxOGAAAAAElFTkSuQmCC)}::ng-deep .cropper-hide{display:block;height:0;position:absolute;width:0}::ng-deep .cropper-hidden{display:none!important}::ng-deep .cropper-move{cursor:move}::ng-deep .cropper-crop{cursor:crosshair}::ng-deep .cropper-disabled .cropper-drag-box,::ng-deep .cropper-disabled .cropper-face,::ng-deep .cropper-disabled .cropper-line,::ng-deep .cropper-disabled .cropper-point{cursor:not-allowed}::ng-deep .cropper-line,::ng-deep .cropper-point,::ng-deep .cropper-point.point-se::before{background-color:#eee}"],
providers: [
{
provide: NG_VALUE_ACCESSOR,
useExisting: forwardRef(function () { return CropperComponent; }),
multi: true
}
],
},] },
];
CropperComponent.propDecorators = {
crop: [{ type: Output }],
cropMove: [{ type: Output }],
cropStart: [{ type: Output }],
cropEnd: [{ type: Output }],
ready: [{ type: Output }],
zoom: [{ type: Output }],
init: [{ type: Output }],
fail: [{ type: Output }],
fileChange: [{ type: Output }],
options: [{ type: Input }],
imageFile: [{ type: Input, args: ['imageFile',] }],
imageUrl: [{ type: Input, args: ['imageUrl',] }]
};
return CropperComponent;
}());
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,uselessCode} checked by tsc
*/
var NgxCropperJsModule = /** @class */ (function () {
function NgxCropperJsModule() {
}
NgxCropperJsModule.decorators = [
{ type: NgModule, args: [{
imports: [CommonModule],
declarations: [CropperComponent],
exports: [CropperComponent]
},] },
];
return NgxCropperJsModule;
}());
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,uselessCode} checked by tsc
*/
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,uselessCode} checked by tsc
*/
export { CropperComponent, NgxCropperJsModule };
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmd4LWNyb3BwZXJqcy13cmFwcGVyLmpzLm1hcCIsInNvdXJjZXMiOlsibmc6Ly9uZ3gtY3JvcHBlcmpzLXdyYXBwZXIvbGliL2Nyb3BwZXIvY3JvcHBlci5jb21wb25lbnQudHMiLCJuZzovL25neC1jcm9wcGVyanMtd3JhcHBlci9saWIvbmd4LWNyb3BwZXItanMubW9kdWxlLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgRXZlbnRFbWl0dGVyLCBJbnB1dCwgT25EZXN0cm95LCBPdXRwdXQsIGZvcndhcmRSZWYgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IENvbnRyb2xWYWx1ZUFjY2Vzc29yLCBOR19WQUxVRV9BQ0NFU1NPUiB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCBDcm9wcGVyIGZyb20gJ2Nyb3BwZXJqcyc7XG5pbXBvcnQgeyBTYWZlVXJsIH0gZnJvbSAnQGFuZ3VsYXIvcGxhdGZvcm0tYnJvd3Nlcic7XG5cbmV4cG9ydCBpbnRlcmZhY2UgQ3JvcHBlck91dHB1dE9wdGlvbnMge1xuICBtaW1lVHlwZTogc3RyaW5nO1xuICBxdWFsaXR5QXJndW1lbnQ6IG51bWJlcjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBDcm9wcGVyT3B0aW9ucyBleHRlbmRzIENyb3BwZXIuT3B0aW9ucyB7XG4gIG1pbkNyb3BXaWR0aDogbnVtYmVyO1xuICBtaW5Dcm9wSGVpZ2h0OiBudW1iZXI7XG4gIG91dHB1dE9wdGlvbnM6IENyb3BwZXJPdXRwdXRPcHRpb25zO1xufVxuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdsaWItY3JvcHBlcicsXG4gIHRlbXBsYXRlOiBgPGRpdiBjbGFzcz1cImNyb3BwZXItY29tcG9uZW50XCIgKm5nSWY9XCJkYXRhVXJsXCI+XG4gIDxpbWcgI2ltYWdlIGFsdD1cImltYWdlXCIgW3NyY109XCJkYXRhVXJsXCIgKGxvYWQpPVwib25JbWFnZUxvYWQoJGV2ZW50KVwiLz5cbjwvZGl2PlxuYCxcbiAgc3R5bGVzOiBbYC5jcm9wcGVyLWNvbXBvbmVudCBpbWd7bWF4LXdpZHRoOjEwMCU7bWF4LWhlaWdodDoxMDAlfTo6bmctZGVlcHsvKiFcbiAqIENyb3BwZXIuanMgdjEuNC4wXG4gKiBodHRwczovL2Zlbmd5dWFuY2hlbi5naXRodWIuaW8vY3JvcHBlcmpzXG4gKlxuICogQ29weXJpZ2h0IDIwMTUtcHJlc2VudCBDaGVuIEZlbmd5dWFuXG4gKiBSZWxlYXNlZCB1bmRlciB0aGUgTUlUIGxpY2Vuc2VcbiAqXG4gKiBEYXRlOiAyMDE4LTA2LTAxVDE1OjE4OjA5Ljg5MVpcbiAqL306Om5nLWRlZXAgLmNyb3BwZXItY29udGFpbmVye2RpcmVjdGlvbjpsdHI7Zm9udC1zaXplOjA7bGluZS1oZWlnaHQ6MDtwb3NpdGlvbjpyZWxhdGl2ZTt0b3VjaC1hY3Rpb246bm9uZTstd2Via2l0LXVzZXItc2VsZWN0Om5vbmU7LW1vei11c2VyLXNlbGVjdDpub25lOy1tcy11c2VyLXNlbGVjdDpub25lO3VzZXItc2VsZWN0Om5vbmV9OjpuZy1kZWVwIC5jcm9wcGVyLWNvbnRhaW5lciBpbWd7ZGlzcGxheTpibG9jaztoZWlnaHQ6MTAwJTtpbWFnZS1vcmllbnRhdGlvbjowZGVnO21heC1oZWlnaHQ6bm9uZSFpbXBvcnRhbnQ7bWF4LXdpZHRoOm5vbmUhaW1wb3J0YW50O21pbi1oZWlnaHQ6MCFpbXBvcnRhbnQ7bWluLXdpZHRoOjAhaW1wb3J0YW50O3dpZHRoOjEwMCV9OjpuZy1kZWVwIC5jcm9wcGVyLWNhbnZhcyw6Om5nLWRlZXAgLmNyb3BwZXItY3JvcC1ib3gsOjpuZy1kZWVwIC5jcm9wcGVyLWRyYWctYm94LDo6bmctZGVlcCAuY3JvcHBlci1tb2RhbCw6Om5nLWRlZXAgLmNyb3BwZXItd3JhcC1ib3h7Ym90dG9tOjA7bGVmdDowO3Bvc2l0aW9uOmFic29sdXRlO3JpZ2h0OjA7dG9wOjB9OjpuZy1kZWVwIC5jcm9wcGVyLWNhbnZhcyw6Om5nLWRlZXAgLmNyb3BwZXItd3JhcC1ib3h7b3ZlcmZsb3c6aGlkZGVufTo6bmctZGVlcCAuY3JvcHBlci1kcmFnLWJveHtiYWNrZ3JvdW5kLWNvbG9yOiNmZmY7b3BhY2l0eTowfTo6bmctZGVlcCAuY3JvcHBlci1tb2RhbHtiYWNrZ3JvdW5kLWNvbG9yOiMwMDA7b3BhY2l0eTouNX06Om5nLWRlZXAgLmNyb3BwZXItdmlldy1ib3h7ZGlzcGxheTpibG9jaztoZWlnaHQ6MTAwJTtvdXRsaW5lOiNlZWUgc29saWQgMXB4O292ZXJmbG93OmhpZGRlbjt3aWR0aDoxMDAlfTo6bmctZGVlcCAuY3JvcHBlci1kYXNoZWR7Ym9yZGVyOjAgZGFzaGVkICNlZWU7ZGlzcGxheTpibG9jaztvcGFjaXR5Oi41O3Bvc2l0aW9uOmFic29sdXRlfTo6bmctZGVlcCAuY3JvcHBlci1kYXNoZWQuZGFzaGVkLWh7Ym9yZGVyLWJvdHRvbS13aWR0aDoxcHg7Ym9yZGVyLXRvcC13aWR0aDoxcHg7aGVpZ2h0OjMzLjMzMzMzJTtsZWZ0OjA7dG9wOjMzLjMzMzMzJTt3aWR0aDoxMDAlfTo6bmctZGVlcCAuY3JvcHBlci1kYXNoZWQuZGFzaGVkLXZ7Ym9yZGVyLWxlZnQtd2lkdGg6MXB4O2JvcmRlci1yaWdodC13aWR0aDoxcHg7aGVpZ2h0OjEwMCU7bGVmdDozMy4zMzMzMyU7dG9wOjA7d2lkdGg6MzMuMzMzMzMlfTo6bmctZGVlcCAuY3JvcHBlci1jZW50ZXJ7ZGlzcGxheTpibG9jaztoZWlnaHQ6MDtsZWZ0OjUwJTtvcGFjaXR5Oi43NTtwb3NpdGlvbjphYnNvbHV0ZTt0b3A6NTAlO3dpZHRoOjB9OjpuZy1kZWVwIC5jcm9wcGVyLWNlbnRlcjphZnRlciw6Om5nLWRlZXAgLmNyb3BwZXItY2VudGVyOmJlZm9yZXtiYWNrZ3JvdW5kLWNvbG9yOiNlZWU7Y29udGVudDonICc7ZGlzcGxheTpibG9jaztwb3NpdGlvbjphYnNvbHV0ZX06Om5nLWRlZXAgLmNyb3BwZXItY2VudGVyOmJlZm9yZXtoZWlnaHQ6MXB4O2xlZnQ6LTNweDt0b3A6MDt3aWR0aDo3cHh9OjpuZy1kZWVwIC5jcm9wcGVyLWNlbnRlcjphZnRlcntoZWlnaHQ6N3B4O2xlZnQ6MDt0b3A6LTNweDt3aWR0aDoxcHh9OjpuZy1kZWVwIC5jcm9wcGVyLWZhY2UsOjpuZy1kZWVwIC5jcm9wcGVyLWxpbmUsOjpuZy1kZWVwIC5jcm9wcGVyLXBvaW50e2Rpc3BsYXk6YmxvY2s7aGVpZ2h0OjEwMCU7b3BhY2l0eTouMTtwb3NpdGlvbjphYnNvbHV0ZTt3aWR0aDoxMDAlfTo6bmctZGVlcCAuY3JvcHBlci1mYWNle2JhY2tncm91bmQtY29sb3I6I2ZmZjtsZWZ0OjA7dG9wOjB9OjpuZy1kZWVwIC5jcm9wcGVyLWxpbmV7YmFja2dyb3VuZC1jb2xvcjojMzlmfTo6bmctZGVlcCAuY3JvcHBlci1saW5lLmxpbmUtZXtjdXJzb3I6ZXctcmVzaXplO3JpZ2h0Oi0zcHg7dG9wOjA7d2lkdGg6NXB4fTo6bmctZGVlcCAuY3JvcHBlci1saW5lLmxpbmUtbntjdXJzb3I6bnMtcmVzaXplO2hlaWdodDo1cHg7bGVmdDowO3RvcDotM3B4fTo6bmctZGVlcCAuY3JvcHBlci1saW5lLmxpbmUtd3tjdXJzb3I6ZXctcmVzaXplO2xlZnQ6LTNweDt0b3A6MDt3aWR0aDo1cHh9OjpuZy1kZWVwIC5jcm9wcGVyLWxpbmUubGluZS1ze2JvdHRvbTotM3B4O2N1cnNvcjpucy1yZXNpemU7aGVpZ2h0OjVweDtsZWZ0OjB9OjpuZy1kZWVwIC5jcm9wcGVyLXBvaW50e2JhY2tncm91bmQtY29sb3I6IzM5ZjtoZWlnaHQ6NXB4O29wYWNpdHk6Ljc1O3dpZHRoOjVweH06Om5nLWRlZXAgLmNyb3BwZXItcG9pbnQucG9pbnQtZXtjdXJzb3I6ZXctcmVzaXplO21hcmdpbi10b3A6LTNweDtyaWdodDotM3B4O3RvcDo1MCV9OjpuZy1kZWVwIC5jcm9wcGVyLXBvaW50LnBvaW50LW57Y3Vyc29yOm5zLXJlc2l6ZTtsZWZ0OjUwJTttYXJnaW4tbGVmdDotM3B4O3RvcDotM3B4fTo6bmctZGVlcCAuY3JvcHBlci1wb2ludC5wb2ludC13e2N1cnNvcjpldy1yZXNpemU7bGVmdDotM3B4O21hcmdpbi10b3A6LTNweDt0b3A6NTAlfTo6bmctZGVlcCAuY3JvcHBlci1wb2ludC5wb2ludC1ze2JvdHRvbTotM3B4O2N1cnNvcjpzLXJlc2l6ZTtsZWZ0OjUwJTttYXJnaW4tbGVmdDotM3B4fTo6bmctZGVlcCAuY3JvcHBlci1wb2ludC5wb2ludC1uZXtjdXJzb3I6bmVzdy1yZXNpemU7cmlnaHQ6LTNweDt0b3A6LTNweH06Om5nLWRlZXAgLmNyb3BwZXItcG9pbnQucG9pbnQtbnd7Y3Vyc29yOm53c2UtcmVzaXplO2xlZnQ6LTNweDt0b3A6LTNweH06Om5nLWRlZXAgLmNyb3BwZXItcG9pbnQucG9pbnQtc3d7Ym90dG9tOi0zcHg7Y3Vyc29yOm5lc3ctcmVzaXplO2xlZnQ6LTNweH06Om5nLWRlZXAgLmNyb3BwZXItcG9pbnQucG9pbnQtc2V7Ym90dG9tOi0zcHg7Y3Vyc29yOm53c2UtcmVzaXplO2hlaWdodDoyMHB4O29wYWNpdHk6MTtyaWdodDotM3B4O3dpZHRoOjIwcHh9QG1lZGlhIChtaW4td2lkdGg6NzY4cHgpezo6bmctZGVlcCAuY3JvcHBlci1wb2ludC5wb2ludC1zZXtoZWlnaHQ6MTVweDt3aWR0aDoxNXB4fX1AbWVkaWEgKG1pbi13aWR0aDo5OTJweCl7OjpuZy1kZWVwIC5jcm9wcGVyLXBvaW50LnBvaW50LXNle2hlaWdodDoxMHB4O3dpZHRoOjEwcHh9fUBtZWRpYSAobWluLXdpZHRoOjEyMDBweCl7OjpuZy1kZWVwIC5jcm9wcGVyLXBvaW50LnBvaW50LXNle2hlaWdodDo1cHg7b3BhY2l0eTouNzU7d2lkdGg6NXB4fX06Om5nLWRlZXAgLmNyb3BwZXItcG9pbnQucG9pbnQtc2U6YmVmb3Jle2JhY2tncm91bmQtY29sb3I6IzM5Zjtib3R0b206LTUwJTtjb250ZW50OicgJztkaXNwbGF5OmJsb2NrO2hlaWdodDoyMDAlO29wYWNpdHk6MDtwb3NpdGlvbjphYnNvbHV0ZTtyaWdodDotNTAlO3dpZHRoOjIwMCV9OjpuZy1kZWVwIC5jcm9wcGVyLWludmlzaWJsZXtvcGFjaXR5OjB9OjpuZy1kZWVwIC5jcm9wcGVyLWJne2JhY2tncm91bmQtaW1hZ2U6dXJsKGRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBQkFBQUFBUUFRTUFBQUFsUFcwaUFBQUFBM05DU1ZRSUNBamI0VS9nQUFBQUJsQk1WRVhNek16Ly8vL1RqUlYyQUFBQUNYQklXWE1BQUFyckFBQUs2d0dDaXcxYUFBQUFISFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JHYVhKbGQyOXlhM01nUTFNMjZMeXlqQUFBQUJGSlJFRlVDSmxqK00vQWdCVmhGLzBQQUg2L0QvSGtEeE9HQUFBQUFFbEZUa1N1UW1DQyl9OjpuZy1kZWVwIC5jcm9wcGVyLWhpZGV7ZGlzcGxheTpibG9jaztoZWlnaHQ6MDtwb3NpdGlvbjphYnNvbHV0ZTt3aWR0aDowfTo6bmctZGVlcCAuY3JvcHBlci1oaWRkZW57ZGlzcGxheTpub25lIWltcG9ydGFudH06Om5nLWRlZXAgLmNyb3BwZXItbW92ZXtjdXJzb3I6bW92ZX06Om5nLWRlZXAgLmNyb3BwZXItY3JvcHtjdXJzb3I6Y3Jvc3NoYWlyfTo6bmctZGVlcCAuY3JvcHBlci1kaXNhYmxlZCAuY3JvcHBlci1kcmFnLWJveCw6Om5nLWRlZXAgLmNyb3BwZXItZGlzYWJsZWQgLmNyb3BwZXItZmFjZSw6Om5nLWRlZXAgLmNyb3BwZXItZGlzYWJsZWQgLmNyb3BwZXItbGluZSw6Om5nLWRlZXAgLmNyb3BwZXItZGlzYWJsZWQgLmNyb3BwZXItcG9pbnR7Y3Vyc29yOm5vdC1hbGxvd2VkfTo6bmctZGVlcCAuY3JvcHBlci1saW5lLDo6bmctZGVlcCAuY3JvcHBlci1wb2ludCw6Om5nLWRlZXAgLmNyb3BwZXItcG9pbnQucG9pbnQtc2U6OmJlZm9yZXtiYWNrZ3JvdW5kLWNvbG9yOiNlZWV9YF0sXG4gIHByb3ZpZGVyczogW1xuICAgIHtcbiAgICAgIHByb3ZpZGU6IE5HX1ZBTFVFX0FDQ0VTU09SLFxuICAgICAgdXNlRXhpc3Rpbmc6IGZvcndhcmRSZWYoKCkgPT4gQ3JvcHBlckNvbXBvbmVudCksXG4gICAgICBtdWx0aTogdHJ1ZVxuICAgIH1cbiAgXSxcbn0pXG5leHBvcnQgY2xhc3MgQ3JvcHBlckNvbXBvbmVudCBpbXBsZW1lbnRzIE9uRGVzdHJveSwgQ29udHJvbFZhbHVlQWNjZXNzb3Ige1xuXG4gIEBPdXRwdXQoKSBjcm9wID0gbmV3IEV2ZW50RW1pdHRlcjxDdXN0b21FdmVudD4oKTtcbiAgQE91dHB1dCgpIGNyb3BNb3ZlID0gbmV3IEV2ZW50RW1pdHRlcjxDdXN0b21FdmVudD4oKTtcbiAgQE91dHB1dCgpIGNyb3BTdGFydCA9IG5ldyBFdmVudEVtaXR0ZXI8Q3VzdG9tRXZlbnQ+KCk7XG4gIEBPdXRwdXQoKSBjcm9wRW5kID0gbmV3IEV2ZW50RW1pdHRlcjxDdXN0b21FdmVudD4oKTtcbiAgQE91dHB1dCgpIHJlYWR5ID0gbmV3IEV2ZW50RW1pdHRlcjxDdXN0b21FdmVudD4oKTtcbiAgQE91dHB1dCgpIHpvb20gPSBuZXcgRXZlbnRFbWl0dGVyPEN1c3RvbUV2ZW50PigpO1xuICBAT3V0cHV0KCkgaW5pdCA9IG5ldyBFdmVudEVtaXR0ZXI8Q3JvcHBlcj4oKTtcbiAgQE91dHB1dCgpIGZhaWwgPSBuZXcgRXZlbnRFbWl0dGVyPEVycm9yPigpO1xuICBAT3V0cHV0KCkgZmlsZUNoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8RmlsZT4oKTtcblxuICBASW5wdXQoKSBvcHRpb25zID0ge30gYXMgQ3JvcHBlck9wdGlvbnM7XG5cbiAgZ2V0IGltYWdlRmlsZSgpOiBGaWxlIHtcbiAgICByZXR1cm4gdGhpcy5vcmlnaW5hbEZpbGU7XG4gIH1cblxuICBASW5wdXQoJ2ltYWdlRmlsZScpIHNldCBpbWFnZUZpbGUodmFsdWU6IEZpbGUpIHtcbiAgICBkZWxldGUgdGhpcy5kYXRhVXJsO1xuICAgIHRoaXMuZGVzdHJveUNyb3BwZXJJZkV4aXN0cygpO1xuXG4gICAgaWYgKCF2YWx1ZSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmIChbJ2ltYWdlL2dpZicsICdpbWFnZS9qcGVnJywgJ2ltYWdlL3BuZyddLmluZGV4T2YodmFsdWUudHlwZSkgPT09IC0xKSB7XG4gICAgICB0aGlzLmZhaWwuZW1pdChuZXcgRXJyb3IoJ0ludmFsaWQgaW5wdXQgZmlsZSB0eXBlJykpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IHJlYWRlciA9IG5ldyBGaWxlUmVhZGVyKCk7XG4gICAgcmVhZGVyLm9ubG9hZCA9ICgpID0+IHtcbiAgICAgIHRoaXMuZGF0YVVybCA9IHJlYWRlci5yZXN1bHQ7XG4gICAgfTtcblxuICAgIHRoaXMub3JpZ2luYWxGaWxlID0gdmFsdWU7XG4gICAgcmVhZGVyLnJlYWRBc0RhdGFVUkwodGhpcy5vcmlnaW5hbEZpbGUpO1xuICB9XG5cbiAgQElucHV0KCdpbWFnZVVybCcpIHNldCBpbWFnZVVybCh2YWx1ZTogc3RyaW5nKSB7XG4gICAgZGVsZXRlIHRoaXMuZGF0YVVybDtcbiAgICB0aGlzLmRlc3Ryb3lDcm9wcGVySWZFeGlzdHMoKTtcblxuICAgIGlmICghdmFsdWUpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLmRhdGFVcmwgPSB2YWx1ZTtcbiAgfVxuXG4gIGRhdGFVcmw6IHN0cmluZ3xTYWZlVXJsO1xuICBwcml2YXRlIGNyb3BwZXI6IENyb3BwZXI7XG4gIHByaXZhdGUgaXNSZWFkeTogYm9vbGVhbjtcbiAgcHJpdmF0ZSBvcmlnaW5hbEZpbGU6IEZpbGU7XG4gIHByaXZhdGUgZGF0YSA9IHt9IGFzIENyb3BwZXIuU2V0RGF0YU9wdGlvbnM7XG5cbiAgcHJvcGFnYXRlQ2hhbmdlID0gKHZhbHVlOiBDcm9wcGVyLlNldERhdGFPcHRpb25zKSA9PiB2YWx1ZTtcblxuICB3cml0ZVZhbHVlKHZhbHVlOiBDcm9wcGVyLlNldERhdGFPcHRpb25zKSB7XG4gICAgdGhpcy5kYXRhID0gdmFsdWU7XG5cbiAgICBpZiAodGhpcy5kYXRhICYmIHRoaXMuY3JvcHBlcikge1xuICAgICAgdGhpcy5jcm9wcGVyLnNldERhdGEodGhpcy5kYXRhKTtcbiAgICB9XG4gIH1cblxuICByZWdpc3Rlck9uQ2hhbmdlKGZuKSB7XG4gICAgdGhpcy5wcm9wYWdhdGVDaGFuZ2UgPSBmbjtcbiAgfVxuXG4gIHJlZ2lzdGVyT25Ub3VjaGVkKCkge31cblxuICBuZ09uRGVzdHJveSgpIHtcbiAgICB0aGlzLmRlc3Ryb3lDcm9wcGVySWZFeGlzdHMoKTtcbiAgfVxuXG4gIG9uSW1hZ2VMb2FkKGV2ZW50OiBFdmVudCkge1xuICAgIGNvbnN0IGltZyA9IGV2ZW50LnRhcmdldCBhcyBIVE1MSW1hZ2VFbGVtZW50O1xuXG4gICAgdGhpcy5kZXN0cm95Q3JvcHBlcklmRXhpc3RzKCk7XG5cbiAgICBpZiAoKHRoaXMub3B0aW9ucy5taW5Dcm9wV2lkdGggJiYgaW1nLm5hdHVyYWxXaWR0aCA8IHRoaXMub3B0aW9ucy5taW5Dcm9wV2lkdGgpXG4gICAgICB8fCAodGhpcy5vcHRpb25zLm1pbkNyb3BIZWlnaHQgJiYgaW1nLm5hdHVyYWxIZWlnaHQgPCB0aGlzLm9wdGlvbnMubWluQ3JvcEhlaWdodCkpIHtcbiAgICAgIGRlbGV0ZSB0aGlzLmRhdGFVcmw7XG4gICAgICB0aGlzLmZhaWwuZW1pdChuZXcgRXJyb3IoJ0lucHV0IGltYWdlIGlzIHRvbyBzbWFsbCcpKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLmlzUmVhZHkgPSBmYWxzZTtcbiAgICB0aGlzLmNyb3BwZXIgPSBuZXcgQ3JvcHBlcihpbWcsIE9iamVjdC5hc3NpZ24oe1xuICAgICAgY3JvcDogdGhpcy5vbkNyb3AuYmluZCh0aGlzKSxcbiAgICAgIGNyb3Btb3ZlOiB0aGlzLm9uQ3JvcE1vdmUuYmluZCh0aGlzKSxcbiAgICAgIGNyb3BzdGFydDogdGhpcy5vbkNyb3BTdGFydC5iaW5kKHRoaXMpLFxuICAgICAgY3JvcGVuZDogdGhpcy5vbkNyb3BFbmQuYmluZCh0aGlzKSxcbiAgICAgIHJlYWR5OiB0aGlzLm9uUmVhZHkuYmluZCh0aGlzKSxcbiAgICAgIHpvb206IHRoaXMub25ab29tLmJpbmQodGhpcyksXG4gICAgfSwgdGhpcy5vcHRpb25zKSk7XG5cbiAgICB0aGlzLmluaXQuZW1pdCh0aGlzLmNyb3BwZXIpO1xuICB9XG5cbiAgcHJpdmF0ZSBvbkNyb3AoZXZlbnQ6IEN1c3RvbUV2ZW50KSB7XG4gICAgaWYgKHRoaXMub3B0aW9ucy52aWV3TW9kZSAhPT0gMCkge1xuICAgICAgdGhpcy5jb3JyZWN0Q3JvcEFyZWEoKTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5pc1JlYWR5KSB7XG4gICAgICB0aGlzLnVwZGF0ZSgpO1xuICAgIH1cblxuICAgIHRoaXMuY3JvcC5lbWl0KGV2ZW50KTtcbiAgfVxuXG4gIHByaXZhdGUgb25Dcm9wTW92ZShldmVudDogQ3VzdG9tRXZlbnQpIHtcbiAgICBpZiAodGhpcy5vcHRpb25zLnZpZXdNb2RlID09PSAwKSB7XG4gICAgICB0aGlzLmNvcnJlY3RDcm9wQXJlYSgpO1xuICAgIH1cblxuICAgIHRoaXMudXBkYXRlKCk7XG4gICAgdGhpcy5jcm9wTW92ZS5lbWl0KGV2ZW50KTtcbiAgfVxuXG4gIHByaXZhdGUgb25Dcm9wU3RhcnQoZXZlbnQ6IEN1c3RvbUV2ZW50KSB7XG4gICAgdGhpcy51cGRhdGUoKTtcbiAgICB0aGlzLmNyb3BTdGFydC5lbWl0KGV2ZW50KTtcbiAgfVxuXG4gIHByaXZhdGUgb25Dcm9wRW5kKGV2ZW50OiBDdXN0b21FdmVudCkge1xuICAgIHRoaXMuY29ycmVjdENyb3BBcmVhKCk7XG4gICAgdGhpcy51cGRhdGVGaWxlKCk7XG4gICAgdGhpcy51cGRhdGUoKTtcbiAgICB0aGlzLmNyb3BFbmQuZW1pdChldmVudCk7XG4gIH1cblxuICBwcml2YXRlIG9uUmVhZHkoZXZlbnQ6IEN1c3RvbUV2ZW50KSB7XG4gICAgaWYgKHRoaXMuZGF0YSkge1xuICAgICAgdGhpcy5jcm9wcGVyLnNldERhdGEodGhpcy5kYXRhKTtcbiAgICAgIHRoaXMuY29ycmVjdENyb3BBcmVhKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuY29ycmVjdENyb3BBcmVhKCk7XG4gICAgICB0aGlzLnVwZGF0ZSgpO1xuICAgIH1cblxuICAgIHRoaXMuaXNSZWFkeSA9IHRydWU7XG4gICAgdGhpcy5yZWFkeS5lbWl0KGV2ZW50KTtcbiAgICB0aGlzLnVwZGF0ZUZpbGUoKTtcbiAgfVxuXG4gIHByaXZhdGUgb25ab29tKGV2ZW50OiBDdXN0b21FdmVudCkge1xuICAgIHRoaXMudXBkYXRlKCk7XG4gICAgdGhpcy56b29tLmVtaXQoZXZlbnQpO1xuICB9XG5cbiAgcHJpdmF0ZSB1cGRhdGVGaWxlKCkge1xuICAgIGxldCBuYW1lID0gJ2Nyb3BwZWRfZmlsZSc7XG5cbiAgICBpZiAodHlwZW9mIHRoaXMuZGF0YVVybCA9PT0gJ3N0cmluZycpIHtcbiAgICAgIGNvbnN0IHVybFBhcmFtcyA9IHRoaXMuZGF0YVVybC5zcGxpdCgnLycpO1xuICAgICAgbmFtZSA9IHVybFBhcmFtc1t1cmxQYXJhbXMubGVuZ3RoIC0gMV07XG4gICAgfVxuXG5cbiAgICBjb25zdCBtaW1lVHlwZSA9ICh0aGlzLm9wdGlvbnMub3V0cHV0T3B0aW9ucyAmJiB0aGlzLm9wdGlvbnMub3V0cHV0T3B0aW9ucy5taW1lVHlwZSkgfHwgJ2ltYWdlL3BuZyc7XG4gICAgY29uc3QgcXVhbGl0eUFyZ3VtZW50ID0gKHRoaXMub3B0aW9ucy5vdXRwdXRPcHRpb25zICYmIHRoaXMub3B0aW9ucy5vdXRwdXRPcHRpb25zLnF1YWxpdHlBcmd1bWVudCkgfHwgMC45O1xuXG4gICAgdGhpcy5jcm9wcGVyLmdldENyb3BwZWRDYW52YXMoKS50b0Jsb2IoKGJsb2I6IGFueSkgPT4ge1xuICAgICAgYmxvYi5sYXN0TW9kaWZpZWREYXRlID0gbmV3IERhdGUoKTtcbiAgICAgIGJsb2IubmFtZSA9IHRoaXMub3JpZ2luYWxGaWxlID8gdGhpcy5vcmlnaW5hbEZpbGUubmFtZSA6IG5hbWU7XG4gICAgICB0aGlzLmZpbGVDaGFuZ2UuZW1pdChibG9iKTtcbiAgICB9LCBtaW1lVHlwZSwgcXVhbGl0eUFyZ3VtZW50KTtcbiAgfVxuXG4gIHByaXZhdGUgY29ycmVjdENyb3BBcmVhKCkge1xuICAgIGNvbnN0IGRhdGEgPSB0aGlzLmNyb3BwZXIuZ2V0RGF0YSgpO1xuXG4gICAgaWYgKGRhdGEuaGVpZ2h0IDwgdGhpcy5vcHRpb25zLm1pbkNyb3BIZWlnaHQgfHwgZGF0YS53aWR0aCA8IHRoaXMub3B0aW9ucy5taW5Dcm9wV2lkdGgpIHtcbiAgICAgIGRhdGEud2lkdGggPSBNYXRoLm1heChkYXRhLndpZHRoLCB0aGlzLm9wdGlvbnMubWluQ3JvcFdpZHRoIHx8IDApO1xuICAgICAgZGF0YS5oZWlnaHQgPSBNYXRoLm1heChkYXRhLmhlaWdodCwgdGhpcy5vcHRpb25zLm1pbkNyb3BIZWlnaHQgfHwgMCk7XG4gICAgICB0aGlzLmNyb3BwZXIuc2V0RGF0YShkYXRhKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHVwZGF0ZSgpIHtcbiAgICB0aGlzLmRhdGEgPSB0aGlzLmNyb3BwZXIuZ2V0RGF0YSgpO1xuICAgIHRoaXMucHJvcGFnYXRlQ2hhbmdlKHRoaXMuZGF0YSk7XG4gIH1cblxuICBwcml2YXRlIGRlc3Ryb3lDcm9wcGVySWZFeGlzdHMoKSB7XG4gICAgaWYgKCF0aGlzLmNyb3BwZXIpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLmNyb3BwZXIuZGVzdHJveSgpO1xuICAgIGRlbGV0ZSB0aGlzLmNyb3BwZXI7XG4gIH1cblxufVxuIiwiaW1wb3J0IHsgTmdNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IENyb3BwZXJDb21wb25lbnQgfSBmcm9tICcuL2Nyb3BwZXIvY3JvcHBlci5jb21wb25lbnQnO1xuaW1wb3J0IHsgQ29tbW9uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcblxuQE5nTW9kdWxlKHtcbiAgaW1wb3J0czogW0NvbW1vbk1vZHVsZV0sXG4gIGRlY2xhcmF0aW9uczogW0Nyb3BwZXJDb21wb25lbnRdLFxuICBleHBvcnRzOiBbQ3JvcHBlckNvbXBvbmVudF1cbn0pXG5leHBvcnQgY2xhc3MgTmd4Q3JvcHBlckpzTW9kdWxlIHsgfVxuIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7OztBQUFBOztvQkF5Q21CLElBQUksWUFBWSxFQUFlO3dCQUMzQixJQUFJLFlBQVksRUFBZTt5QkFDOUIsSUFBSSxZQUFZLEVBQWU7dUJBQ2pDLElBQUksWUFBWSxFQUFlO3FCQUNqQyxJQUFJLFlBQVksRUFBZTtvQkFDaEMsSUFBSSxZQUFZLEVBQWU7b0JBQy9CLElBQUksWUFBWSxFQUFXO29CQUMzQixJQUFJLFlBQVksRUFBUzswQkFDbkIsSUFBSSxZQUFZLEVBQVE7eUNBRTVCLEVBQW9CO3NDQTJDeEIsRUFBNEI7K0JBRXpCLFVBQUMsS0FBNkIsSUFBSyxPQUFBLEtBQUssR0FBQTs7SUEzQzFELHNCQUFJLHVDQUFTOzs7O1FBQWI7WUFDRSxPQUFPLElBQUksQ0FBQyxZQUFZLENBQUM7U0FDMUI7Ozs7O1FBRUQsVUFBa0MsS0FBVztZQUE3QyxpQkFvQkM7WUFuQkMsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDO1lBQ3BCLElBQUksQ0FBQyxzQkFBc0IsRUFBRSxDQUFDO1lBRTlCLElBQUksQ0FBQyxLQUFLLEVBQUU7Z0JBQ1YsT0FBTzthQUNSO1lBRUQsSUFBSSxDQUFDLFdBQVcsRUFBRSxZQUFZLEVBQUUsV0FBVyxDQUFDLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRTtnQkFDdkUsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxLQUFLLENBQUMseUJBQXlCLENBQUMsQ0FBQyxDQUFDO2dCQUNyRCxPQUFPO2FBQ1I7O1lBRUQsSUFBTSxNQUFNLEdBQUcsSUFBSSxVQUFVLEVBQUUsQ0FBQztZQUNoQyxNQUFNLENBQUMsTUFBTSxHQUFHO2dCQUNkLEtBQUksQ0FBQyxPQUFPLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQzth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