ngx-image-cropper 4.0.1 → 6.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1 -0
- package/esm2020/lib/component/image-cropper.component.mjs +540 -0
- package/esm2020/lib/image-cropper.module.mjs +26 -0
- package/esm2020/lib/interfaces/cropper-options.interface.mjs +2 -0
- package/esm2020/lib/interfaces/cropper-position.interface.mjs +2 -0
- package/esm2020/lib/interfaces/cropper.settings.mjs +50 -0
- package/esm2020/lib/interfaces/dimensions.interface.mjs +2 -0
- package/esm2020/lib/interfaces/exif-transform.interface.mjs +2 -0
- package/esm2020/lib/interfaces/image-cropped-event.interface.mjs +2 -0
- package/esm2020/lib/interfaces/image-transform.interface.mjs +2 -0
- package/esm2020/lib/interfaces/index.mjs +2 -0
- package/esm2020/lib/interfaces/loaded-image.interface.mjs +2 -0
- package/esm2020/lib/interfaces/move-start.interface.mjs +7 -0
- package/esm2020/lib/services/crop.service.mjs +117 -0
- package/esm2020/lib/services/cropper-position.service.mjs +201 -0
- package/esm2020/lib/services/load-image.service.mjs +168 -0
- package/esm2020/lib/utils/blob.utils.mjs +12 -0
- package/esm2020/lib/utils/exif.utils.mjs +89 -0
- package/esm2020/lib/utils/hammer.utils.mjs +2 -0
- package/esm2020/lib/utils/keyboard.utils.mjs +40 -0
- package/esm2020/lib/utils/resize.utils.mjs +75 -0
- package/esm2020/ngx-image-cropper.mjs +5 -0
- package/esm2020/public-api.mjs +6 -0
- package/fesm2015/{ngx-image-cropper.js → ngx-image-cropper.mjs} +544 -1324
- package/fesm2015/ngx-image-cropper.mjs.map +1 -0
- package/fesm2020/ngx-image-cropper.mjs +1315 -0
- package/fesm2020/ngx-image-cropper.mjs.map +1 -0
- package/lib/component/image-cropper.component.d.ts +15 -12
- package/lib/image-cropper.module.d.ts +6 -0
- package/lib/interfaces/cropper.settings.d.ts +1 -1
- package/lib/interfaces/index.d.ts +1 -0
- package/lib/services/crop.service.d.ts +4 -1
- package/lib/services/cropper-position.service.d.ts +3 -0
- package/lib/services/load-image.service.d.ts +3 -0
- package/lib/utils/hammer.utils.d.ts +1 -1
- package/ngx-image-cropper.d.ts +1 -3
- package/package.json +24 -15
- package/bundles/ngx-image-cropper.umd.js +0 -2617
- package/bundles/ngx-image-cropper.umd.js.map +0 -1
- package/bundles/ngx-image-cropper.umd.min.js +0 -16
- package/bundles/ngx-image-cropper.umd.min.js.map +0 -1
- package/esm2015/lib/component/image-cropper.component.js +0 -825
- package/esm2015/lib/image-cropper.module.js +0 -24
- package/esm2015/lib/interfaces/cropper-options.interface.js +0 -56
- package/esm2015/lib/interfaces/cropper-position.interface.js +0 -20
- package/esm2015/lib/interfaces/cropper.settings.js +0 -140
- package/esm2015/lib/interfaces/dimensions.interface.js +0 -16
- package/esm2015/lib/interfaces/exif-transform.interface.js +0 -16
- package/esm2015/lib/interfaces/image-cropped-event.interface.js +0 -24
- package/esm2015/lib/interfaces/image-transform.interface.js +0 -20
- package/esm2015/lib/interfaces/index.js +0 -6
- package/esm2015/lib/interfaces/loaded-image.interface.js +0 -18
- package/esm2015/lib/interfaces/move-start.interface.js +0 -37
- package/esm2015/lib/services/crop.service.js +0 -176
- package/esm2015/lib/services/cropper-position.service.js +0 -257
- package/esm2015/lib/services/load-image.service.js +0 -304
- package/esm2015/lib/utils/blob.utils.js +0 -26
- package/esm2015/lib/utils/exif.utils.js +0 -128
- package/esm2015/lib/utils/hammer.utils.js +0 -29
- package/esm2015/lib/utils/keyboard.utils.js +0 -58
- package/esm2015/lib/utils/resize.utils.js +0 -116
- package/esm2015/ngx-image-cropper.js +0 -13
- package/esm2015/public-api.js +0 -11
- package/esm5/lib/component/image-cropper.component.js +0 -978
- package/esm5/lib/image-cropper.module.js +0 -28
- package/esm5/lib/interfaces/cropper-options.interface.js +0 -56
- package/esm5/lib/interfaces/cropper-position.interface.js +0 -20
- package/esm5/lib/interfaces/cropper.settings.js +0 -156
- package/esm5/lib/interfaces/dimensions.interface.js +0 -16
- package/esm5/lib/interfaces/exif-transform.interface.js +0 -16
- package/esm5/lib/interfaces/image-cropped-event.interface.js +0 -24
- package/esm5/lib/interfaces/image-transform.interface.js +0 -20
- package/esm5/lib/interfaces/index.js +0 -6
- package/esm5/lib/interfaces/loaded-image.interface.js +0 -18
- package/esm5/lib/interfaces/move-start.interface.js +0 -37
- package/esm5/lib/services/crop.service.js +0 -214
- package/esm5/lib/services/cropper-position.service.js +0 -296
- package/esm5/lib/services/load-image.service.js +0 -366
- package/esm5/lib/utils/blob.utils.js +0 -26
- package/esm5/lib/utils/exif.utils.js +0 -128
- package/esm5/lib/utils/hammer.utils.js +0 -29
- package/esm5/lib/utils/keyboard.utils.js +0 -58
- package/esm5/lib/utils/resize.utils.js +0 -116
- package/esm5/ngx-image-cropper.js +0 -13
- package/esm5/public-api.js +0 -11
- package/fesm2015/ngx-image-cropper.js.map +0 -1
- package/fesm5/ngx-image-cropper.js +0 -2399
- package/fesm5/ngx-image-cropper.js.map +0 -1
- package/ngx-image-cropper.metadata.json +0 -1
|
@@ -1,214 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* @fileoverview added by tsickle
|
|
3
|
-
* Generated from: lib/services/crop.service.ts
|
|
4
|
-
* @suppress {checkTypes,constantProperty,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
|
|
5
|
-
*/
|
|
6
|
-
import { __assign, __read, __spread } from "tslib";
|
|
7
|
-
import { Injectable } from '@angular/core';
|
|
8
|
-
import { resizeCanvas } from '../utils/resize.utils';
|
|
9
|
-
import * as i0 from "@angular/core";
|
|
10
|
-
var CropService = /** @class */ (function () {
|
|
11
|
-
function CropService() {
|
|
12
|
-
}
|
|
13
|
-
/**
|
|
14
|
-
* @param {?} sourceImage
|
|
15
|
-
* @param {?} loadedImage
|
|
16
|
-
* @param {?} cropper
|
|
17
|
-
* @param {?} settings
|
|
18
|
-
* @return {?}
|
|
19
|
-
*/
|
|
20
|
-
CropService.prototype.crop = /**
|
|
21
|
-
* @param {?} sourceImage
|
|
22
|
-
* @param {?} loadedImage
|
|
23
|
-
* @param {?} cropper
|
|
24
|
-
* @param {?} settings
|
|
25
|
-
* @return {?}
|
|
26
|
-
*/
|
|
27
|
-
function (sourceImage, loadedImage, cropper, settings) {
|
|
28
|
-
/** @type {?} */
|
|
29
|
-
var imagePosition = this.getImagePosition(sourceImage, loadedImage, cropper, settings);
|
|
30
|
-
/** @type {?} */
|
|
31
|
-
var width = imagePosition.x2 - imagePosition.x1;
|
|
32
|
-
/** @type {?} */
|
|
33
|
-
var height = imagePosition.y2 - imagePosition.y1;
|
|
34
|
-
/** @type {?} */
|
|
35
|
-
var cropCanvas = (/** @type {?} */ (document.createElement('canvas')));
|
|
36
|
-
cropCanvas.width = width;
|
|
37
|
-
cropCanvas.height = height;
|
|
38
|
-
/** @type {?} */
|
|
39
|
-
var ctx = cropCanvas.getContext('2d');
|
|
40
|
-
if (!ctx) {
|
|
41
|
-
return;
|
|
42
|
-
}
|
|
43
|
-
if (settings.backgroundColor != null) {
|
|
44
|
-
ctx.fillStyle = settings.backgroundColor;
|
|
45
|
-
ctx.fillRect(0, 0, width, height);
|
|
46
|
-
}
|
|
47
|
-
/** @type {?} */
|
|
48
|
-
var scaleX = (settings.transform.scale || 1) * (settings.transform.flipH ? -1 : 1);
|
|
49
|
-
/** @type {?} */
|
|
50
|
-
var scaleY = (settings.transform.scale || 1) * (settings.transform.flipV ? -1 : 1);
|
|
51
|
-
/** @type {?} */
|
|
52
|
-
var transformedImage = loadedImage.transformed;
|
|
53
|
-
ctx.setTransform(scaleX, 0, 0, scaleY, transformedImage.size.width / 2, transformedImage.size.height / 2);
|
|
54
|
-
ctx.translate(-imagePosition.x1 / scaleX, -imagePosition.y1 / scaleY);
|
|
55
|
-
ctx.rotate((settings.transform.rotate || 0) * Math.PI / 180);
|
|
56
|
-
ctx.drawImage(transformedImage.image, -transformedImage.size.width / 2, -transformedImage.size.height / 2);
|
|
57
|
-
/** @type {?} */
|
|
58
|
-
var output = {
|
|
59
|
-
width: width, height: height,
|
|
60
|
-
imagePosition: imagePosition,
|
|
61
|
-
cropperPosition: __assign({}, cropper)
|
|
62
|
-
};
|
|
63
|
-
if (settings.containWithinAspectRatio) {
|
|
64
|
-
output.offsetImagePosition = this.getOffsetImagePosition(sourceImage, loadedImage, cropper, settings);
|
|
65
|
-
}
|
|
66
|
-
/** @type {?} */
|
|
67
|
-
var resizeRatio = this.getResizeRatio(width, height, settings);
|
|
68
|
-
if (resizeRatio !== 1) {
|
|
69
|
-
output.width = Math.round(width * resizeRatio);
|
|
70
|
-
output.height = settings.maintainAspectRatio
|
|
71
|
-
? Math.round(output.width / settings.aspectRatio)
|
|
72
|
-
: Math.round(height * resizeRatio);
|
|
73
|
-
resizeCanvas(cropCanvas, output.width, output.height);
|
|
74
|
-
}
|
|
75
|
-
output.base64 = cropCanvas.toDataURL('image/' + settings.format, this.getQuality(settings));
|
|
76
|
-
return output;
|
|
77
|
-
};
|
|
78
|
-
/**
|
|
79
|
-
* @private
|
|
80
|
-
* @param {?} sourceImage
|
|
81
|
-
* @param {?} loadedImage
|
|
82
|
-
* @param {?} cropper
|
|
83
|
-
* @param {?} settings
|
|
84
|
-
* @return {?}
|
|
85
|
-
*/
|
|
86
|
-
CropService.prototype.getImagePosition = /**
|
|
87
|
-
* @private
|
|
88
|
-
* @param {?} sourceImage
|
|
89
|
-
* @param {?} loadedImage
|
|
90
|
-
* @param {?} cropper
|
|
91
|
-
* @param {?} settings
|
|
92
|
-
* @return {?}
|
|
93
|
-
*/
|
|
94
|
-
function (sourceImage, loadedImage, cropper, settings) {
|
|
95
|
-
/** @type {?} */
|
|
96
|
-
var sourceImageElement = sourceImage.nativeElement;
|
|
97
|
-
/** @type {?} */
|
|
98
|
-
var ratio = loadedImage.transformed.size.width / sourceImageElement.offsetWidth;
|
|
99
|
-
/** @type {?} */
|
|
100
|
-
var out = {
|
|
101
|
-
x1: Math.round(cropper.x1 * ratio),
|
|
102
|
-
y1: Math.round(cropper.y1 * ratio),
|
|
103
|
-
x2: Math.round(cropper.x2 * ratio),
|
|
104
|
-
y2: Math.round(cropper.y2 * ratio)
|
|
105
|
-
};
|
|
106
|
-
if (!settings.containWithinAspectRatio) {
|
|
107
|
-
out.x1 = Math.max(out.x1, 0);
|
|
108
|
-
out.y1 = Math.max(out.y1, 0);
|
|
109
|
-
out.x2 = Math.min(out.x2, loadedImage.transformed.size.width);
|
|
110
|
-
out.y2 = Math.min(out.y2, loadedImage.transformed.size.height);
|
|
111
|
-
}
|
|
112
|
-
return out;
|
|
113
|
-
};
|
|
114
|
-
/**
|
|
115
|
-
* @private
|
|
116
|
-
* @param {?} sourceImage
|
|
117
|
-
* @param {?} loadedImage
|
|
118
|
-
* @param {?} cropper
|
|
119
|
-
* @param {?} settings
|
|
120
|
-
* @return {?}
|
|
121
|
-
*/
|
|
122
|
-
CropService.prototype.getOffsetImagePosition = /**
|
|
123
|
-
* @private
|
|
124
|
-
* @param {?} sourceImage
|
|
125
|
-
* @param {?} loadedImage
|
|
126
|
-
* @param {?} cropper
|
|
127
|
-
* @param {?} settings
|
|
128
|
-
* @return {?}
|
|
129
|
-
*/
|
|
130
|
-
function (sourceImage, loadedImage, cropper, settings) {
|
|
131
|
-
/** @type {?} */
|
|
132
|
-
var canvasRotation = settings.canvasRotation + loadedImage.exifTransform.rotate;
|
|
133
|
-
/** @type {?} */
|
|
134
|
-
var sourceImageElement = sourceImage.nativeElement;
|
|
135
|
-
/** @type {?} */
|
|
136
|
-
var ratio = loadedImage.transformed.size.width / sourceImageElement.offsetWidth;
|
|
137
|
-
/** @type {?} */
|
|
138
|
-
var offsetX;
|
|
139
|
-
/** @type {?} */
|
|
140
|
-
var offsetY;
|
|
141
|
-
if (canvasRotation % 2) {
|
|
142
|
-
offsetX = (loadedImage.transformed.size.width - loadedImage.original.size.height) / 2;
|
|
143
|
-
offsetY = (loadedImage.transformed.size.height - loadedImage.original.size.width) / 2;
|
|
144
|
-
}
|
|
145
|
-
else {
|
|
146
|
-
offsetX = (loadedImage.transformed.size.width - loadedImage.original.size.width) / 2;
|
|
147
|
-
offsetY = (loadedImage.transformed.size.height - loadedImage.original.size.height) / 2;
|
|
148
|
-
}
|
|
149
|
-
/** @type {?} */
|
|
150
|
-
var out = {
|
|
151
|
-
x1: Math.round(cropper.x1 * ratio) - offsetX,
|
|
152
|
-
y1: Math.round(cropper.y1 * ratio) - offsetY,
|
|
153
|
-
x2: Math.round(cropper.x2 * ratio) - offsetX,
|
|
154
|
-
y2: Math.round(cropper.y2 * ratio) - offsetY
|
|
155
|
-
};
|
|
156
|
-
if (!settings.containWithinAspectRatio) {
|
|
157
|
-
out.x1 = Math.max(out.x1, 0);
|
|
158
|
-
out.y1 = Math.max(out.y1, 0);
|
|
159
|
-
out.x2 = Math.min(out.x2, loadedImage.transformed.size.width);
|
|
160
|
-
out.y2 = Math.min(out.y2, loadedImage.transformed.size.height);
|
|
161
|
-
}
|
|
162
|
-
return out;
|
|
163
|
-
};
|
|
164
|
-
/**
|
|
165
|
-
* @param {?} width
|
|
166
|
-
* @param {?} height
|
|
167
|
-
* @param {?} settings
|
|
168
|
-
* @return {?}
|
|
169
|
-
*/
|
|
170
|
-
CropService.prototype.getResizeRatio = /**
|
|
171
|
-
* @param {?} width
|
|
172
|
-
* @param {?} height
|
|
173
|
-
* @param {?} settings
|
|
174
|
-
* @return {?}
|
|
175
|
-
*/
|
|
176
|
-
function (width, height, settings) {
|
|
177
|
-
/** @type {?} */
|
|
178
|
-
var ratioWidth = settings.resizeToWidth / width;
|
|
179
|
-
/** @type {?} */
|
|
180
|
-
var ratioHeight = settings.resizeToHeight / height;
|
|
181
|
-
/** @type {?} */
|
|
182
|
-
var ratios = new Array();
|
|
183
|
-
if (settings.resizeToWidth > 0) {
|
|
184
|
-
ratios.push(ratioWidth);
|
|
185
|
-
}
|
|
186
|
-
if (settings.resizeToHeight > 0) {
|
|
187
|
-
ratios.push(ratioHeight);
|
|
188
|
-
}
|
|
189
|
-
/** @type {?} */
|
|
190
|
-
var result = ratios.length === 0 ? 1 : Math.min.apply(Math, __spread(ratios));
|
|
191
|
-
if (result > 1 && !settings.onlyScaleDown) {
|
|
192
|
-
return result;
|
|
193
|
-
}
|
|
194
|
-
return Math.min(result, 1);
|
|
195
|
-
};
|
|
196
|
-
/**
|
|
197
|
-
* @param {?} settings
|
|
198
|
-
* @return {?}
|
|
199
|
-
*/
|
|
200
|
-
CropService.prototype.getQuality = /**
|
|
201
|
-
* @param {?} settings
|
|
202
|
-
* @return {?}
|
|
203
|
-
*/
|
|
204
|
-
function (settings) {
|
|
205
|
-
return Math.min(1, Math.max(0, settings.imageQuality / 100));
|
|
206
|
-
};
|
|
207
|
-
CropService.decorators = [
|
|
208
|
-
{ type: Injectable, args: [{ providedIn: 'root' },] }
|
|
209
|
-
];
|
|
210
|
-
/** @nocollapse */ CropService.ɵprov = i0.ɵɵdefineInjectable({ factory: function CropService_Factory() { return new CropService(); }, token: CropService, providedIn: "root" });
|
|
211
|
-
return CropService;
|
|
212
|
-
}());
|
|
213
|
-
export { CropService };
|
|
214
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3JvcC5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6Im5nOi8vbmd4LWltYWdlLWNyb3BwZXIvIiwic291cmNlcyI6WyJsaWIvc2VydmljZXMvY3JvcC5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7OztBQUFBLE9BQU8sRUFBYyxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFHdkQsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLHVCQUF1QixDQUFDOztBQUVyRDtJQUFBO0tBNkhDOzs7Ozs7OztJQTFIQywwQkFBSTs7Ozs7OztJQUFKLFVBQUssV0FBdUIsRUFBRSxXQUF3QixFQUFFLE9BQXdCLEVBQUUsUUFBeUI7O1lBQ25HLGFBQWEsR0FBRyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsV0FBVyxFQUFFLFdBQVcsRUFBRSxPQUFPLEVBQUUsUUFBUSxDQUFDOztZQUNsRixLQUFLLEdBQUcsYUFBYSxDQUFDLEVBQUUsR0FBRyxhQUFhLENBQUMsRUFBRTs7WUFDM0MsTUFBTSxHQUFHLGFBQWEsQ0FBQyxFQUFFLEdBQUcsYUFBYSxDQUFDLEVBQUU7O1lBQzVDLFVBQVUsR0FBRyxtQkFBQSxRQUFRLENBQUMsYUFBYSxDQUFDLFFBQVEsQ0FBQyxFQUFxQjtRQUN4RSxVQUFVLENBQUMsS0FBSyxHQUFHLEtBQUssQ0FBQztRQUN6QixVQUFVLENBQUMsTUFBTSxHQUFHLE1BQU0sQ0FBQzs7WUFFckIsR0FBRyxHQUFHLFVBQVUsQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDO1FBQ3ZDLElBQUksQ0FBQyxHQUFHLEVBQUU7WUFDUixPQUFPO1NBQ1I7UUFDRCxJQUFJLFFBQVEsQ0FBQyxlQUFlLElBQUksSUFBSSxFQUFFO1lBQ3BDLEdBQUcsQ0FBQyxTQUFTLEdBQUcsUUFBUSxDQUFDLGVBQWUsQ0FBQztZQUN6QyxHQUFHLENBQUMsUUFBUSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsS0FBSyxFQUFFLE1BQU0sQ0FBQyxDQUFDO1NBQ25DOztZQUVLLE1BQU0s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QUFDLE1BQU0sS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsT0FBUixJQUFJLFdBQVEsTUFBTSxFQUFDO1FBRTVELElBQUksTUFBTSxHQUFHLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxhQUFhLEVBQUU7WUFDekMsT0FBTyxNQUFNLENBQUM7U0FDZjtRQUNELE9BQU8sSUFBSSxDQUFDLEdBQUcsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFDN0IsQ0FBQzs7Ozs7SUFFRCxnQ0FBVTs7OztJQUFWLFVBQVcsUUFBeUI7UUFDbEMsT0FBTyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxRQUFRLENBQUMsWUFBWSxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUM7SUFDL0QsQ0FBQzs7Z0JBNUhGLFVBQVUsU0FBQyxFQUFDLFVBQVUsRUFBRSxNQUFNLEVBQUM7OztzQkFMaEM7Q0FrSUMsQUE3SEQsSUE2SEM7U0E1SFksV0FBVyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEVsZW1lbnRSZWYsIEluamVjdGFibGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IENyb3BwZXJTZXR0aW5ncyB9IGZyb20gJy4uL2ludGVyZmFjZXMvY3JvcHBlci5zZXR0aW5ncyc7XG5pbXBvcnQgeyBDcm9wcGVyUG9zaXRpb24sIEltYWdlQ3JvcHBlZEV2ZW50LCBMb2FkZWRJbWFnZSB9IGZyb20gJy4uL2ludGVyZmFjZXMnO1xuaW1wb3J0IHsgcmVzaXplQ2FudmFzIH0gZnJvbSAnLi4vdXRpbHMvcmVzaXplLnV0aWxzJztcblxuQEluamVjdGFibGUoe3Byb3ZpZGVkSW46ICdyb290J30pXG5leHBvcnQgY2xhc3MgQ3JvcFNlcnZpY2Uge1xuXG4gIGNyb3Aoc291cmNlSW1hZ2U6IEVsZW1lbnRSZWYsIGxvYWRlZEltYWdlOiBMb2FkZWRJbWFnZSwgY3JvcHBlcjogQ3JvcHBlclBvc2l0aW9uLCBzZXR0aW5nczogQ3JvcHBlclNldHRpbmdzKTogSW1hZ2VDcm9wcGVkRXZlbnQgfCBudWxsIHtcbiAgICBjb25zdCBpbWFnZVBvc2l0aW9uID0gdGhpcy5nZXRJbWFnZVBvc2l0aW9uKHNvdXJjZUltYWdlLCBsb2FkZWRJbWFnZSwgY3JvcHBlciwgc2V0dGluZ3MpO1xuICAgIGNvbnN0IHdpZHRoID0gaW1hZ2VQb3NpdGlvbi54MiAtIGltYWdlUG9zaXRpb24ueDE7XG4gICAgY29uc3QgaGVpZ2h0ID0gaW1hZ2VQb3NpdGlvbi55MiAtIGltYWdlUG9zaXRpb24ueTE7XG4gICAgY29uc3QgY3JvcENhbnZhcyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2NhbnZhcycpIGFzIEhUTUxDYW52YXNFbGVtZW50O1xuICAgIGNyb3BDYW52YXMud2lkdGggPSB3aWR0aDtcbiAgICBjcm9wQ2FudmFzLmhlaWdodCA9IGhlaWdodDtcblxuICAgIGNvbnN0IGN0eCA9IGNyb3BDYW52YXMuZ2V0Q29udGV4dCgnMmQnKTtcbiAgICBpZiAoIWN0eCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAoc2V0dGluZ3MuYmFja2dyb3VuZENvbG9yICE9IG51bGwpIHtcbiAgICAgIGN0eC5maWxsU3R5bGUgPSBzZXR0aW5ncy5iYWNrZ3JvdW5kQ29sb3I7XG4gICAgICBjdHguZmlsbFJlY3QoMCwgMCwgd2lkdGgsIGhlaWdodCk7XG4gICAgfVxuXG4gICAgY29uc3Qgc2NhbGVYID0gKHNldHRpbmdzLnRyYW5zZm9ybS5zY2FsZSB8fCAxKSAqIChzZXR0aW5ncy50cmFuc2Zvcm0uZmxpcEggPyAtMSA6IDEpO1xuICAgIGNvbnN0IHNjYWxlWSA9IChzZXR0aW5ncy50cmFuc2Zvcm0uc2NhbGUgfHwgMSkgKiAoc2V0dGluZ3MudHJhbnNmb3JtLmZsaXBWID8gLTEgOiAxKTtcblxuICAgIGNvbnN0IHRyYW5zZm9ybWVkSW1hZ2UgPSBsb2FkZWRJbWFnZS50cmFuc2Zvcm1lZDtcbiAgICBjdHguc2V0VHJhbnNmb3JtKHNjYWxlWCwgMCwgMCwgc2NhbGVZLCB0cmFuc2Zvcm1lZEltYWdlLnNpemUud2lkdGggLyAyLCB0cmFuc2Zvcm1lZEltYWdlLnNpemUuaGVpZ2h0IC8gMik7XG4gICAgY3R4LnRyYW5zbGF0ZSgtaW1hZ2VQb3NpdGlvbi54MSAvIHNjYWxlWCwgLWltYWdlUG9zaXRpb24ueTEgLyBzY2FsZVkpO1xuICAgIGN0eC5yb3RhdGUoKHNldHRpbmdzLnRyYW5zZm9ybS5yb3RhdGUgfHwgMCkgKiBNYXRoLlBJIC8gMTgwKTtcbiAgICBjdHguZHJhd0ltYWdlKHRyYW5zZm9ybWVkSW1hZ2UuaW1hZ2UsIC10cmFuc2Zvcm1lZEltYWdlLnNpemUud2lkdGggLyAyLCAtdHJhbnNmb3JtZWRJbWFnZS5zaXplLmhlaWdodCAvIDIpO1xuXG4gICAgY29uc3Qgb3V0cHV0OiBJbWFnZUNyb3BwZWRFdmVudCA9IHtcbiAgICAgIHdpZHRoLCBoZWlnaHQsXG4gICAgICBpbWFnZVBvc2l0aW9uLFxuICAgICAgY3JvcHBlclBvc2l0aW9uOiB7Li4uY3JvcHBlcn1cbiAgICB9O1xuICAgIGlmIChzZXR0aW5ncy5jb250YWluV2l0aGluQXNwZWN0UmF0aW8pIHtcbiAgICAgIG91dHB1dC5vZmZzZXRJbWFnZVBvc2l0aW9uID0gdGhpcy5nZXRPZmZzZXRJbWFnZVBvc2l0aW9uKHNvdXJjZUltYWdlLCBsb2FkZWRJbWFnZSwgY3JvcHBlciwgc2V0dGluZ3MpO1xuICAgIH1cbiAgICBjb25zdCByZXNpemVSYXRpbyA9IHRoaXMuZ2V0UmVzaXplUmF0aW8od2lkdGgsIGhlaWdodCwgc2V0dGluZ3MpO1xuICAgIGlmIChyZXNpemVSYXRpbyAhPT0gMSkge1xuICAgICAgb3V0cHV0LndpZHRoID0gTWF0aC5yb3VuZCh3aWR0aCAqIHJlc2l6ZVJhdGlvKTtcbiAgICAgIG91dHB1dC5oZWlnaHQgPSBzZXR0aW5ncy5tYWludGFpbkFzcGVjdFJhdGlvXG4gICAgICAgID8gTWF0aC5yb3VuZChvdXRwdXQud2lkdGggLyBzZXR0aW5ncy5hc3BlY3RSYXRpbylcbiAgICAgICAgOiBNYXRoLnJvdW5kKGhlaWdodCAqIHJlc2l6ZVJhdGlvKTtcbiAgICAgIHJlc2l6ZUNhbnZhcyhjcm9wQ2FudmFzLCBvdXRwdXQud2lkdGgsIG91dHB1dC5oZWlnaHQpO1xuICAgIH1cbiAgICBvdXRwdXQuYmFzZTY0ID0gY3JvcENhbnZhcy50b0RhdGFVUkwoJ2ltYWdlLycgKyBzZXR0aW5ncy5mb3JtYXQsIHRoaXMuZ2V0UXVhbGl0eShzZXR0aW5ncykpO1xuICAgIHJldHVybiBvdXRwdXQ7XG4gIH1cblxuICBwcml2YXRlIGdldEltYWdlUG9zaXRpb24oc291cmNlSW1hZ2U6IEVsZW1lbnRSZWYsIGxvYWRlZEltYWdlOiBMb2FkZWRJbWFnZSwgY3JvcHBlcjogQ3JvcHBlclBvc2l0aW9uLCBzZXR0aW5nczogQ3JvcHBlclNldHRpbmdzKTogQ3JvcHBlclBvc2l0aW9uIHtcbiAgICBjb25zdCBzb3VyY2VJbWFnZUVsZW1lbnQgPSBzb3VyY2VJbWFnZS5uYXRpdmVFbGVtZW50O1xuICAgIGNvbnN0IHJhdGlvID0gbG9hZGVkSW1hZ2UudHJhbnNmb3JtZWQuc2l6ZS53aWR0aCAvIHNvdXJjZUltYWdlRWxlbWVudC5vZmZzZXRXaWR0aDtcblxuICAgIGNvbnN0IG91dDogQ3JvcHBlclBvc2l0aW9uID0ge1xuICAgICAgeDE6IE1hdGgucm91bmQoY3JvcHBlci54MSAqIHJhdGlvKSxcbiAgICAgIHkxOiBNYXRoLnJvdW5kKGNyb3BwZXIueTEgKiByYXRpbyksXG4gICAgICB4MjogTWF0aC5yb3VuZChjcm9wcGVyLngyICogcmF0aW8pLFxuICAgICAgeTI6IE1hdGgucm91bmQoY3JvcHBlci55MiAqIHJhdGlvKVxuICAgIH07XG5cbiAgICBpZiAoIXNldHRpbmdzLmNvbnRhaW5XaXRoaW5Bc3BlY3RSYXRpbykge1xuICAgICAgb3V0LngxID0gTWF0aC5tYXgob3V0LngxLCAwKTtcbiAgICAgIG91dC55MSA9IE1hdGgubWF4KG91dC55MSwgMCk7XG4gICAgICBvdXQueDIgPSBNYXRoLm1pbihvdXQueDIsIGxvYWRlZEltYWdlLnRyYW5zZm9ybWVkLnNpemUud2lkdGgpO1xuICAgICAgb3V0LnkyID0gTWF0aC5taW4ob3V0LnkyLCBsb2FkZWRJbWFnZS50cmFuc2Zvcm1lZC5zaXplLmhlaWdodCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIG91dDtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0T2Zmc2V0SW1hZ2VQb3NpdGlvbihzb3VyY2VJbWFnZTogRWxlbWVudFJlZiwgbG9hZGVkSW1hZ2U6IExvYWRlZEltYWdlLCBjcm9wcGVyOiBDcm9wcGVyUG9zaXRpb24sIHNldHRpbmdzOiBDcm9wcGVyU2V0dGluZ3MpOiBDcm9wcGVyUG9zaXRpb24ge1xuICAgIGNvbnN0IGNhbnZhc1JvdGF0aW9uID0gc2V0dGluZ3MuY2FudmFzUm90YXRpb24gKyBsb2FkZWRJbWFnZS5leGlmVHJhbnNmb3JtLnJvdGF0ZTtcbiAgICBjb25zdCBzb3VyY2VJbWFnZUVsZW1lbnQgPSBzb3VyY2VJbWFnZS5uYXRpdmVFbGVtZW50O1xuICAgIGNvbnN0IHJhdGlvID0gbG9hZGVkSW1hZ2UudHJhbnNmb3JtZWQuc2l6ZS53aWR0aCAvIHNvdXJjZUltYWdlRWxlbWVudC5vZmZzZXRXaWR0aDtcbiAgICBsZXQgb2Zmc2V0WDogbnVtYmVyO1xuICAgIGxldCBvZmZzZXRZOiBudW1iZXI7XG5cbiAgICBpZiAoY2FudmFzUm90YXRpb24gJSAyKSB7XG4gICAgICBvZmZzZXRYID0gKGxvYWRlZEltYWdlLnRyYW5zZm9ybWVkLnNpemUud2lkdGggLSBsb2FkZWRJbWFnZS5vcmlnaW5hbC5zaXplLmhlaWdodCkgLyAyO1xuICAgICAgb2Zmc2V0WSA9IChsb2FkZWRJbWFnZS50cmFuc2Zvcm1lZC5zaXplLmhlaWdodCAtIGxvYWRlZEltYWdlLm9yaWdpbmFsLnNpemUud2lkdGgpIC8gMjtcbiAgICB9IGVsc2Uge1xuICAgICAgb2Zmc2V0WCA9IChsb2FkZWRJbWFnZS50cmFuc2Zvcm1lZC5zaXplLndpZHRoIC0gbG9hZGVkSW1hZ2Uub3JpZ2luYWwuc2l6ZS53aWR0aCkgLyAyO1xuICAgICAgb2Zmc2V0WSA9IChsb2FkZWRJbWFnZS50cmFuc2Zvcm1lZC5zaXplLmhlaWdodCAtIGxvYWRlZEltYWdlLm9yaWdpbmFsLnNpemUuaGVpZ2h0KSAvIDI7XG4gICAgfVxuXG4gICAgY29uc3Qgb3V0OiBDcm9wcGVyUG9zaXRpb24gPSB7XG4gICAgICB4MTogTWF0aC5yb3VuZChjcm9wcGVyLngxICogcmF0aW8pIC0gb2Zmc2V0WCxcbiAgICAgIHkxOiBNYXRoLnJvdW5kKGNyb3BwZXIueTEgKiByYXRpbykgLSBvZmZzZXRZLFxuICAgICAgeDI6IE1hdGgucm91bmQoY3JvcHBlci54MiAqIHJhdGlvKSAtIG9mZnNldFgsXG4gICAgICB5MjogTWF0aC5yb3VuZChjcm9wcGVyLnkyICogcmF0aW8pIC0gb2Zmc2V0WVxuICAgIH07XG5cbiAgICBpZiAoIXNldHRpbmdzLmNvbnRhaW5XaXRoaW5Bc3BlY3RSYXRpbykge1xuICAgICAgb3V0LngxID0gTWF0aC5tYXgob3V0LngxLCAwKTtcbiAgICAgIG91dC55MSA9IE1hdGgubWF4KG91dC55MSwgMCk7XG4gICAgICBvdXQueDIgPSBNYXRoLm1pbihvdXQueDIsIGxvYWRlZEltYWdlLnRyYW5zZm9ybWVkLnNpemUud2lkdGgpO1xuICAgICAgb3V0LnkyID0gTWF0aC5taW4ob3V0LnkyLCBsb2FkZWRJbWFnZS50cmFuc2Zvcm1lZC5zaXplLmhlaWdodCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIG91dDtcbiAgfVxuXG4gIGdldFJlc2l6ZVJhdGlvKHdpZHRoOiBudW1iZXIsIGhlaWdodDogbnVtYmVyLCBzZXR0aW5nczogQ3JvcHBlclNldHRpbmdzKTogbnVtYmVyIHtcbiAgICBjb25zdCByYXRpb1dpZHRoID0gc2V0dGluZ3MucmVzaXplVG9XaWR0aCAvIHdpZHRoO1xuICAgIGNvbnN0IHJhdGlvSGVpZ2h0ID0gc2V0dGluZ3MucmVzaXplVG9IZWlnaHQgLyBoZWlnaHQ7XG4gICAgY29uc3QgcmF0aW9zID0gbmV3IEFycmF5PG51bWJlcj4oKTtcblxuICAgIGlmIChzZXR0aW5ncy5yZXNpemVUb1dpZHRoID4gMCkge1xuICAgICAgcmF0aW9zLnB1c2gocmF0aW9XaWR0aCk7XG4gICAgfVxuICAgIGlmIChzZXR0aW5ncy5yZXNpemVUb0hlaWdodCA+IDApIHtcbiAgICAgIHJhdGlvcy5wdXNoKHJhdGlvSGVpZ2h0KTtcbiAgICB9XG5cbiAgICBjb25zdCByZXN1bHQgPSByYXRpb3MubGVuZ3RoID09PSAwID8gMSA6IE1hdGgubWluKC4uLnJhdGlvcyk7XG5cbiAgICBpZiAocmVzdWx0ID4gMSAmJiAhc2V0dGluZ3Mub25seVNjYWxlRG93bikge1xuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG4gICAgcmV0dXJuIE1hdGgubWluKHJlc3VsdCwgMSk7XG4gIH1cblxuICBnZXRRdWFsaXR5KHNldHRpbmdzOiBDcm9wcGVyU2V0dGluZ3MpOiBudW1iZXIge1xuICAgIHJldHVybiBNYXRoLm1pbigxLCBNYXRoLm1heCgwLCBzZXR0aW5ncy5pbWFnZVF1YWxpdHkgLyAxMDApKTtcbiAgfVxufVxuIl19
|
|
@@ -1,296 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* @fileoverview added by tsickle
|
|
3
|
-
* Generated from: lib/services/cropper-position.service.ts
|
|
4
|
-
* @suppress {checkTypes,constantProperty,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
|
|
5
|
-
*/
|
|
6
|
-
import { Injectable } from '@angular/core';
|
|
7
|
-
import * as i0 from "@angular/core";
|
|
8
|
-
var CropperPositionService = /** @class */ (function () {
|
|
9
|
-
function CropperPositionService() {
|
|
10
|
-
}
|
|
11
|
-
/**
|
|
12
|
-
* @param {?} sourceImage
|
|
13
|
-
* @param {?} cropperPosition
|
|
14
|
-
* @param {?} settings
|
|
15
|
-
* @return {?}
|
|
16
|
-
*/
|
|
17
|
-
CropperPositionService.prototype.resetCropperPosition = /**
|
|
18
|
-
* @param {?} sourceImage
|
|
19
|
-
* @param {?} cropperPosition
|
|
20
|
-
* @param {?} settings
|
|
21
|
-
* @return {?}
|
|
22
|
-
*/
|
|
23
|
-
function (sourceImage, cropperPosition, settings) {
|
|
24
|
-
if (!(sourceImage === null || sourceImage === void 0 ? void 0 : sourceImage.nativeElement)) {
|
|
25
|
-
return;
|
|
26
|
-
}
|
|
27
|
-
/** @type {?} */
|
|
28
|
-
var sourceImageElement = sourceImage.nativeElement;
|
|
29
|
-
if (settings.cropperStaticHeight && settings.cropperStaticWidth) {
|
|
30
|
-
cropperPosition.x1 = 0;
|
|
31
|
-
cropperPosition.x2 = sourceImageElement.offsetWidth > settings.cropperStaticWidth ?
|
|
32
|
-
settings.cropperStaticWidth : sourceImageElement.offsetWidth;
|
|
33
|
-
cropperPosition.y1 = 0;
|
|
34
|
-
cropperPosition.y2 = sourceImageElement.offsetHeight > settings.cropperStaticHeight ?
|
|
35
|
-
settings.cropperStaticHeight : sourceImageElement.offsetHeight;
|
|
36
|
-
}
|
|
37
|
-
else {
|
|
38
|
-
/** @type {?} */
|
|
39
|
-
var cropperWidth = Math.min(settings.cropperScaledMaxWidth, sourceImageElement.offsetWidth);
|
|
40
|
-
/** @type {?} */
|
|
41
|
-
var cropperHeight = Math.min(settings.cropperScaledMaxHeight, sourceImageElement.offsetHeight);
|
|
42
|
-
if (!settings.maintainAspectRatio) {
|
|
43
|
-
cropperPosition.x1 = 0;
|
|
44
|
-
cropperPosition.x2 = cropperWidth;
|
|
45
|
-
cropperPosition.y1 = 0;
|
|
46
|
-
cropperPosition.y2 = cropperHeight;
|
|
47
|
-
}
|
|
48
|
-
else if (cropperWidth / settings.aspectRatio < cropperHeight) {
|
|
49
|
-
cropperPosition.x1 = 0;
|
|
50
|
-
cropperPosition.x2 = cropperWidth;
|
|
51
|
-
/** @type {?} */
|
|
52
|
-
var cropperHeightWithAspectRatio = cropperWidth / settings.aspectRatio;
|
|
53
|
-
cropperPosition.y1 = (sourceImageElement.offsetHeight - cropperHeightWithAspectRatio) / 2;
|
|
54
|
-
cropperPosition.y2 = cropperPosition.y1 + cropperHeightWithAspectRatio;
|
|
55
|
-
}
|
|
56
|
-
else {
|
|
57
|
-
cropperPosition.y1 = 0;
|
|
58
|
-
cropperPosition.y2 = cropperHeight;
|
|
59
|
-
/** @type {?} */
|
|
60
|
-
var cropperWidthWithAspectRatio = cropperHeight * settings.aspectRatio;
|
|
61
|
-
cropperPosition.x1 = (sourceImageElement.offsetWidth - cropperWidthWithAspectRatio) / 2;
|
|
62
|
-
cropperPosition.x2 = cropperPosition.x1 + cropperWidthWithAspectRatio;
|
|
63
|
-
}
|
|
64
|
-
}
|
|
65
|
-
};
|
|
66
|
-
/**
|
|
67
|
-
* @param {?} event
|
|
68
|
-
* @param {?} moveStart
|
|
69
|
-
* @param {?} cropperPosition
|
|
70
|
-
* @return {?}
|
|
71
|
-
*/
|
|
72
|
-
CropperPositionService.prototype.move = /**
|
|
73
|
-
* @param {?} event
|
|
74
|
-
* @param {?} moveStart
|
|
75
|
-
* @param {?} cropperPosition
|
|
76
|
-
* @return {?}
|
|
77
|
-
*/
|
|
78
|
-
function (event, moveStart, cropperPosition) {
|
|
79
|
-
/** @type {?} */
|
|
80
|
-
var diffX = this.getClientX(event) - moveStart.clientX;
|
|
81
|
-
/** @type {?} */
|
|
82
|
-
var diffY = this.getClientY(event) - moveStart.clientY;
|
|
83
|
-
cropperPosition.x1 = moveStart.x1 + diffX;
|
|
84
|
-
cropperPosition.y1 = moveStart.y1 + diffY;
|
|
85
|
-
cropperPosition.x2 = moveStart.x2 + diffX;
|
|
86
|
-
cropperPosition.y2 = moveStart.y2 + diffY;
|
|
87
|
-
};
|
|
88
|
-
/**
|
|
89
|
-
* @param {?} event
|
|
90
|
-
* @param {?} moveStart
|
|
91
|
-
* @param {?} cropperPosition
|
|
92
|
-
* @param {?} maxSize
|
|
93
|
-
* @param {?} settings
|
|
94
|
-
* @return {?}
|
|
95
|
-
*/
|
|
96
|
-
CropperPositionService.prototype.resize = /**
|
|
97
|
-
* @param {?} event
|
|
98
|
-
* @param {?} moveStart
|
|
99
|
-
* @param {?} cropperPosition
|
|
100
|
-
* @param {?} maxSize
|
|
101
|
-
* @param {?} settings
|
|
102
|
-
* @return {?}
|
|
103
|
-
*/
|
|
104
|
-
function (event, moveStart, cropperPosition, maxSize, settings) {
|
|
105
|
-
/** @type {?} */
|
|
106
|
-
var moveX = this.getClientX(event) - moveStart.clientX;
|
|
107
|
-
/** @type {?} */
|
|
108
|
-
var moveY = this.getClientY(event) - moveStart.clientY;
|
|
109
|
-
switch (moveStart.position) {
|
|
110
|
-
case 'left':
|
|
111
|
-
cropperPosition.x1 = Math.min(Math.max(moveStart.x1 + moveX, cropperPosition.x2 - settings.cropperScaledMaxWidth), cropperPosition.x2 - settings.cropperScaledMinWidth);
|
|
112
|
-
break;
|
|
113
|
-
case 'topleft':
|
|
114
|
-
cropperPosition.x1 = Math.min(Math.max(moveStart.x1 + moveX, cropperPosition.x2 - settings.cropperScaledMaxWidth), cropperPosition.x2 - settings.cropperScaledMinWidth);
|
|
115
|
-
cropperPosition.y1 = Math.min(Math.max(moveStart.y1 + moveY, cropperPosition.y2 - settings.cropperScaledMaxHeight), cropperPosition.y2 - settings.cropperScaledMinHeight);
|
|
116
|
-
break;
|
|
117
|
-
case 'top':
|
|
118
|
-
cropperPosition.y1 = Math.min(Math.max(moveStart.y1 + moveY, cropperPosition.y2 - settings.cropperScaledMaxHeight), cropperPosition.y2 - settings.cropperScaledMinHeight);
|
|
119
|
-
break;
|
|
120
|
-
case 'topright':
|
|
121
|
-
cropperPosition.x2 = Math.max(Math.min(moveStart.x2 + moveX, cropperPosition.x1 + settings.cropperScaledMaxWidth), cropperPosition.x1 + settings.cropperScaledMinWidth);
|
|
122
|
-
cropperPosition.y1 = Math.min(Math.max(moveStart.y1 + moveY, cropperPosition.y2 - settings.cropperScaledMaxHeight), cropperPosition.y2 - settings.cropperScaledMinHeight);
|
|
123
|
-
break;
|
|
124
|
-
case 'right':
|
|
125
|
-
cropperPosition.x2 = Math.max(Math.min(moveStart.x2 + moveX, cropperPosition.x1 + settings.cropperScaledMaxWidth), cropperPosition.x1 + settings.cropperScaledMinWidth);
|
|
126
|
-
break;
|
|
127
|
-
case 'bottomright':
|
|
128
|
-
cropperPosition.x2 = Math.max(Math.min(moveStart.x2 + moveX, cropperPosition.x1 + settings.cropperScaledMaxWidth), cropperPosition.x1 + settings.cropperScaledMinWidth);
|
|
129
|
-
cropperPosition.y2 = Math.max(Math.min(moveStart.y2 + moveY, cropperPosition.y1 + settings.cropperScaledMaxHeight), cropperPosition.y1 + settings.cropperScaledMinHeight);
|
|
130
|
-
break;
|
|
131
|
-
case 'bottom':
|
|
132
|
-
cropperPosition.y2 = Math.max(Math.min(moveStart.y2 + moveY, cropperPosition.y1 + settings.cropperScaledMaxHeight), cropperPosition.y1 + settings.cropperScaledMinHeight);
|
|
133
|
-
break;
|
|
134
|
-
case 'bottomleft':
|
|
135
|
-
cropperPosition.x1 = Math.min(Math.max(moveStart.x1 + moveX, cropperPosition.x2 - settings.cropperScaledMaxWidth), cropperPosition.x2 - settings.cropperScaledMinWidth);
|
|
136
|
-
cropperPosition.y2 = Math.max(Math.min(moveStart.y2 + moveY, cropperPosition.y1 + settings.cropperScaledMaxHeight), cropperPosition.y1 + settings.cropperScaledMinHeight);
|
|
137
|
-
break;
|
|
138
|
-
case 'center':
|
|
139
|
-
/** @type {?} */
|
|
140
|
-
var scale = event.scale;
|
|
141
|
-
/** @type {?} */
|
|
142
|
-
var newWidth = Math.min(Math.max(settings.cropperScaledMinWidth, (Math.abs(moveStart.x2 - moveStart.x1)) * scale), settings.cropperScaledMaxWidth);
|
|
143
|
-
/** @type {?} */
|
|
144
|
-
var newHeight = Math.min(Math.max(settings.cropperScaledMinHeight, (Math.abs(moveStart.y2 - moveStart.y1)) * scale), settings.cropperScaledMaxHeight);
|
|
145
|
-
cropperPosition.x1 = moveStart.clientX - newWidth / 2;
|
|
146
|
-
cropperPosition.x2 = moveStart.clientX + newWidth / 2;
|
|
147
|
-
cropperPosition.y1 = moveStart.clientY - newHeight / 2;
|
|
148
|
-
cropperPosition.y2 = moveStart.clientY + newHeight / 2;
|
|
149
|
-
if (cropperPosition.x1 < 0) {
|
|
150
|
-
cropperPosition.x2 -= cropperPosition.x1;
|
|
151
|
-
cropperPosition.x1 = 0;
|
|
152
|
-
}
|
|
153
|
-
else if (cropperPosition.x2 > maxSize.width) {
|
|
154
|
-
cropperPosition.x1 -= (cropperPosition.x2 - maxSize.width);
|
|
155
|
-
cropperPosition.x2 = maxSize.width;
|
|
156
|
-
}
|
|
157
|
-
if (cropperPosition.y1 < 0) {
|
|
158
|
-
cropperPosition.y2 -= cropperPosition.y1;
|
|
159
|
-
cropperPosition.y1 = 0;
|
|
160
|
-
}
|
|
161
|
-
else if (cropperPosition.y2 > maxSize.height) {
|
|
162
|
-
cropperPosition.y1 -= (cropperPosition.y2 - maxSize.height);
|
|
163
|
-
cropperPosition.y2 = maxSize.height;
|
|
164
|
-
}
|
|
165
|
-
break;
|
|
166
|
-
}
|
|
167
|
-
if (settings.maintainAspectRatio) {
|
|
168
|
-
this.checkAspectRatio(moveStart.position, cropperPosition, maxSize, settings);
|
|
169
|
-
}
|
|
170
|
-
};
|
|
171
|
-
/**
|
|
172
|
-
* @param {?} position
|
|
173
|
-
* @param {?} cropperPosition
|
|
174
|
-
* @param {?} maxSize
|
|
175
|
-
* @param {?} settings
|
|
176
|
-
* @return {?}
|
|
177
|
-
*/
|
|
178
|
-
CropperPositionService.prototype.checkAspectRatio = /**
|
|
179
|
-
* @param {?} position
|
|
180
|
-
* @param {?} cropperPosition
|
|
181
|
-
* @param {?} maxSize
|
|
182
|
-
* @param {?} settings
|
|
183
|
-
* @return {?}
|
|
184
|
-
*/
|
|
185
|
-
function (position, cropperPosition, maxSize, settings) {
|
|
186
|
-
/** @type {?} */
|
|
187
|
-
var overflowX = 0;
|
|
188
|
-
/** @type {?} */
|
|
189
|
-
var overflowY = 0;
|
|
190
|
-
switch (position) {
|
|
191
|
-
case 'top':
|
|
192
|
-
cropperPosition.x2 = cropperPosition.x1 + (cropperPosition.y2 - cropperPosition.y1) * settings.aspectRatio;
|
|
193
|
-
overflowX = Math.max(cropperPosition.x2 - maxSize.width, 0);
|
|
194
|
-
overflowY = Math.max(0 - cropperPosition.y1, 0);
|
|
195
|
-
if (overflowX > 0 || overflowY > 0) {
|
|
196
|
-
cropperPosition.x2 -= (overflowY * settings.aspectRatio) > overflowX ? (overflowY * settings.aspectRatio) : overflowX;
|
|
197
|
-
cropperPosition.y1 += (overflowY * settings.aspectRatio) > overflowX ? overflowY : overflowX / settings.aspectRatio;
|
|
198
|
-
}
|
|
199
|
-
break;
|
|
200
|
-
case 'bottom':
|
|
201
|
-
cropperPosition.x2 = cropperPosition.x1 + (cropperPosition.y2 - cropperPosition.y1) * settings.aspectRatio;
|
|
202
|
-
overflowX = Math.max(cropperPosition.x2 - maxSize.width, 0);
|
|
203
|
-
overflowY = Math.max(cropperPosition.y2 - maxSize.height, 0);
|
|
204
|
-
if (overflowX > 0 || overflowY > 0) {
|
|
205
|
-
cropperPosition.x2 -= (overflowY * settings.aspectRatio) > overflowX ? (overflowY * settings.aspectRatio) : overflowX;
|
|
206
|
-
cropperPosition.y2 -= (overflowY * settings.aspectRatio) > overflowX ? overflowY : (overflowX / settings.aspectRatio);
|
|
207
|
-
}
|
|
208
|
-
break;
|
|
209
|
-
case 'topleft':
|
|
210
|
-
cropperPosition.y1 = cropperPosition.y2 - (cropperPosition.x2 - cropperPosition.x1) / settings.aspectRatio;
|
|
211
|
-
overflowX = Math.max(0 - cropperPosition.x1, 0);
|
|
212
|
-
overflowY = Math.max(0 - cropperPosition.y1, 0);
|
|
213
|
-
if (overflowX > 0 || overflowY > 0) {
|
|
214
|
-
cropperPosition.x1 += (overflowY * settings.aspectRatio) > overflowX ? (overflowY * settings.aspectRatio) : overflowX;
|
|
215
|
-
cropperPosition.y1 += (overflowY * settings.aspectRatio) > overflowX ? overflowY : overflowX / settings.aspectRatio;
|
|
216
|
-
}
|
|
217
|
-
break;
|
|
218
|
-
case 'topright':
|
|
219
|
-
cropperPosition.y1 = cropperPosition.y2 - (cropperPosition.x2 - cropperPosition.x1) / settings.aspectRatio;
|
|
220
|
-
overflowX = Math.max(cropperPosition.x2 - maxSize.width, 0);
|
|
221
|
-
overflowY = Math.max(0 - cropperPosition.y1, 0);
|
|
222
|
-
if (overflowX > 0 || overflowY > 0) {
|
|
223
|
-
cropperPosition.x2 -= (overflowY * settings.aspectRatio) > overflowX ? (overflowY * settings.aspectRatio) : overflowX;
|
|
224
|
-
cropperPosition.y1 += (overflowY * settings.aspectRatio) > overflowX ? overflowY : overflowX / settings.aspectRatio;
|
|
225
|
-
}
|
|
226
|
-
break;
|
|
227
|
-
case 'right':
|
|
228
|
-
case 'bottomright':
|
|
229
|
-
cropperPosition.y2 = cropperPosition.y1 + (cropperPosition.x2 - cropperPosition.x1) / settings.aspectRatio;
|
|
230
|
-
overflowX = Math.max(cropperPosition.x2 - maxSize.width, 0);
|
|
231
|
-
overflowY = Math.max(cropperPosition.y2 - maxSize.height, 0);
|
|
232
|
-
if (overflowX > 0 || overflowY > 0) {
|
|
233
|
-
cropperPosition.x2 -= (overflowY * settings.aspectRatio) > overflowX ? (overflowY * settings.aspectRatio) : overflowX;
|
|
234
|
-
cropperPosition.y2 -= (overflowY * settings.aspectRatio) > overflowX ? overflowY : overflowX / settings.aspectRatio;
|
|
235
|
-
}
|
|
236
|
-
break;
|
|
237
|
-
case 'left':
|
|
238
|
-
case 'bottomleft':
|
|
239
|
-
cropperPosition.y2 = cropperPosition.y1 + (cropperPosition.x2 - cropperPosition.x1) / settings.aspectRatio;
|
|
240
|
-
overflowX = Math.max(0 - cropperPosition.x1, 0);
|
|
241
|
-
overflowY = Math.max(cropperPosition.y2 - maxSize.height, 0);
|
|
242
|
-
if (overflowX > 0 || overflowY > 0) {
|
|
243
|
-
cropperPosition.x1 += (overflowY * settings.aspectRatio) > overflowX ? (overflowY * settings.aspectRatio) : overflowX;
|
|
244
|
-
cropperPosition.y2 -= (overflowY * settings.aspectRatio) > overflowX ? overflowY : overflowX / settings.aspectRatio;
|
|
245
|
-
}
|
|
246
|
-
break;
|
|
247
|
-
case 'center':
|
|
248
|
-
cropperPosition.x2 = cropperPosition.x1 + (cropperPosition.y2 - cropperPosition.y1) * settings.aspectRatio;
|
|
249
|
-
cropperPosition.y2 = cropperPosition.y1 + (cropperPosition.x2 - cropperPosition.x1) / settings.aspectRatio;
|
|
250
|
-
/** @type {?} */
|
|
251
|
-
var overflowX1 = Math.max(0 - cropperPosition.x1, 0);
|
|
252
|
-
/** @type {?} */
|
|
253
|
-
var overflowX2 = Math.max(cropperPosition.x2 - maxSize.width, 0);
|
|
254
|
-
/** @type {?} */
|
|
255
|
-
var overflowY1 = Math.max(cropperPosition.y2 - maxSize.height, 0);
|
|
256
|
-
/** @type {?} */
|
|
257
|
-
var overflowY2 = Math.max(0 - cropperPosition.y1, 0);
|
|
258
|
-
if (overflowX1 > 0 || overflowX2 > 0 || overflowY1 > 0 || overflowY2 > 0) {
|
|
259
|
-
cropperPosition.x1 += (overflowY1 * settings.aspectRatio) > overflowX1 ? (overflowY1 * settings.aspectRatio) : overflowX1;
|
|
260
|
-
cropperPosition.x2 -= (overflowY2 * settings.aspectRatio) > overflowX2 ? (overflowY2 * settings.aspectRatio) : overflowX2;
|
|
261
|
-
cropperPosition.y1 += (overflowY2 * settings.aspectRatio) > overflowX2 ? overflowY2 : overflowX2 / settings.aspectRatio;
|
|
262
|
-
cropperPosition.y2 -= (overflowY1 * settings.aspectRatio) > overflowX1 ? overflowY1 : overflowX1 / settings.aspectRatio;
|
|
263
|
-
}
|
|
264
|
-
break;
|
|
265
|
-
}
|
|
266
|
-
};
|
|
267
|
-
/**
|
|
268
|
-
* @param {?} event
|
|
269
|
-
* @return {?}
|
|
270
|
-
*/
|
|
271
|
-
CropperPositionService.prototype.getClientX = /**
|
|
272
|
-
* @param {?} event
|
|
273
|
-
* @return {?}
|
|
274
|
-
*/
|
|
275
|
-
function (event) {
|
|
276
|
-
return (event.touches && event.touches[0] ? event.touches[0].clientX : event.clientX) || 0;
|
|
277
|
-
};
|
|
278
|
-
/**
|
|
279
|
-
* @param {?} event
|
|
280
|
-
* @return {?}
|
|
281
|
-
*/
|
|
282
|
-
CropperPositionService.prototype.getClientY = /**
|
|
283
|
-
* @param {?} event
|
|
284
|
-
* @return {?}
|
|
285
|
-
*/
|
|
286
|
-
function (event) {
|
|
287
|
-
return (event.touches && event.touches[0] ? event.touches[0].clientY : event.clientY) || 0;
|
|
288
|
-
};
|
|
289
|
-
CropperPositionService.decorators = [
|
|
290
|
-
{ type: Injectable, args: [{ providedIn: 'root' },] }
|
|
291
|
-
];
|
|
292
|
-
/** @nocollapse */ CropperPositionService.ɵprov = i0.ɵɵdefineInjectable({ factory: function CropperPositionService_Factory() { return new CropperPositionService(); }, token: CropperPositionService, providedIn: "root" });
|
|
293
|
-
return CropperPositionService;
|
|
294
|
-
}());
|
|
295
|
-
export { CropperPositionService };
|
|
296
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3JvcHBlci1wb3NpdGlvbi5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6Im5nOi8vbmd4LWltYWdlLWNyb3BwZXIvIiwic291cmNlcyI6WyJsaWIvc2VydmljZXMvY3JvcHBlci1wb3NpdGlvbi5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBQUEsT0FBTyxFQUFjLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQzs7QUFJdkQ7SUFBQTtLQW9OQzs7Ozs7OztJQWpOQyxxREFBb0I7Ozs7OztJQUFwQixVQUFxQixXQUF1QixFQUFFLGVBQWdDLEVBQUUsUUFBeUI7UUFDdkcsSUFBSSxFQUFDLFdBQVcsYUFBWCxXQUFXLHVCQUFYLFdBQVcsQ0FBRSxhQUFhLENBQUEsRUFBRTtZQUMvQixPQUFPO1NBQ1I7O1lBQ0ssa0JBQWtCLEdBQUcsV0FBVyxDQUFDLGFBQWE7UUFDcEQsSUFBSSxRQUFRLENBQUMsbUJBQW1CLElBQUksUUFBUSxDQUFDLGtCQUFrQixFQUFFO1lBQy9ELGVBQWUsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDO1lBQ3ZCLGVBQWUsQ0FBQyxFQUFFLEdBQUcsa0JBQWtCLENBQUMsV0FBVyxHQUFHLFFBQVEsQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDO2dCQUNqRixRQUFRLENBQUMsa0JBQWtCLENBQUMsQ0FBQyxDQUFDLGtCQUFrQixDQUFDLFdBQVcsQ0FBQztZQUMvRCxlQUFlLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQztZQUN2QixlQUFlLENBQUMsRUFBRSxHQUFHLGtCQUFrQixDQUFDLFlBQVksR0FBRyxRQUFRLENBQUMsbUJBQW1CLENBQUMsQ0FBQztnQkFDbkYsUUFBUSxDQUFDLG1CQUFtQixDQUFDLENBQUMsQ0FBQyxrQkFBa0IsQ0FBQyxZQUFZLENBQUM7U0FDbEU7YUFBTTs7Z0JBQ0MsWUFBWSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLHFCQUFxQixFQUFFLGtCQUFrQixDQUFDLFdBQVcsQ0FBQzs7Z0JBQ3ZGLGFBQWEsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxzQkFBc0IsRUFBRSxrQkFBa0IsQ0FBQyxZQUFZLENBQUM7WUFDaEcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxtQkFBbUIsRUFBRTtnQkFDakMsZUFBZSxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUM7Z0JBQ3ZCLGVBQWUsQ0FBQyxFQUFFLEdBQUcsWUFBWSxDQUFDO2dCQUNsQyxlQUFlLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQztnQkFDdkIsZUFBZSxDQUFDLEVBQUUsR0FBRyxhQUFhLENBQUM7YUFDcEM7aUJBQU0sSUFBSSxZQUFZLEdBQUcsUUFBUSxDQUFDLFdBQVcsR0FBRyxhQUFhLEVBQUU7Z0JBQzlELGVBQWUsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDO2dCQUN2QixlQUFlLENBQUMsRUFBRSxHQUFHLFlBQVksQ0FBQzs7b0JBQzVCLDRCQUE0QixHQUFHLFlBQVksR0FBRyxRQUFRLENBQUMsV0FBVztnQkFDeEUsZUFBZSxDQUFDLEVBQUUsR0FBRyxDQUFDLGtCQUFrQixDQUFDLFlBQVksR0FBRyw0QkFBNEIsQ0FBQyxHQUFHLENBQUMsQ0FBQztnQkFDMUYsZUFBZSxDQUFDLEVBQUUsR0FBRyxlQUFlLENBQUMsRUFBRSxHQUFHLDRCQUE0QixDQUFDO2FBQ3hFO2lCQUFNO2dCQUNMLGVBQWUsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDO2dCQUN2QixlQUFlLENBQUMsRUFBRSxHQUFHLGFBQWEsQ0FBQzs7b0JBQzdCLDJCQUEyQixHQUFHLGFBQWEsR0FBRyxRQUFRLENBQUMsV0FBVztnQkFDeEUsZUFBZSxDQUFDLEVBQUUsR0FBRyxDQUFDLGtCQUFrQixDQUFDLFdBQVcsR0FBRywyQkFBMkIsQ0FBQyxHQUFHLENBQUMsQ0FBQztnQkFDeEYsZUFBZSxDQUFDLEVBQUUsR0FBRyxlQUFlLENBQUMsRUFBRSxHQUFHLDJCQUEyQixDQUFDO2FBQ3ZFO1NBQ0Y7SUFDSCxDQUFDOzs7Ozs7O0lBRUQscUNBQUk7Ozs7OztJQUFKLFVBQUssS0FBVSxFQUFFLFNBQW9CLEVBQUUsZUFBZ0M7O1lBQy9ELEtBQUssR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLEtBQUssQ0FBQyxHQUFHLFNBQVMsQ0FBQyxPQUFPOztZQUNsRCxLQUFLLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxLQUFLLENBQUMsR0FBRyxTQUFTLENBQUMsT0FBTztRQUV4RCxlQUFlLENBQUMsRUFBRSxHQUFHLFNBQVMsQ0FBQyxFQUFFLEdBQUcsS0FBSyxDQUFDO1FBQzFDLGVBQWUsQ0FBQyxFQUFFLEdBQUcsU0FBUyxDQUFDLEVBQUUsR0FBRyxLQUFLLENBQUM7UUFDMUMsZUFBZSxDQUFDLEVBQUUsR0FBRyxTQUFTLENBQUMsRUFBRSxHQUFHLEtBQUssQ0FBQztRQUMxQyxlQUFlLENBQUMsRUFBRSxHQUFHLFNBQVMsQ0FBQyxFQUFFLEdBQUcsS0FBSyxDQUFDO0lBQzVDLENBQUM7Ozs7Ozs7OztJQUVELHVDQUFNOzs7Ozs7OztJQUFOLFVBQU8sS0FBVSxFQUFFLFNBQW9CLEVBQUUsZUFBZ0MsRUFBRSxPQUFtQixFQUFFLFFBQXlCOztZQUNqSCxLQUFLLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxLQUFLLENBQUMsR0FBRyxTQUFTLENBQUMsT0FBTzs7WUFDbEQsS0FBSyxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsS0FBSyxDQUFDLEdBQUcsU0FBUyxDQUFDLE9BQU87UUFDeEQsUUFBUSxTQUFTLENBQUMsUUFBUSxFQUFFO1lBQzFCLEtBQUssTUFBTTtnQkFDVCxlQUFlLENBQUMsRUFBRSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUMsRUFBRSxHQUFHLEtBQUssRUFBRSxlQUFlLENBQUMsRUFBRSxHQUFHLFFBQVEsQ0FBQyxxQkFBcUIsQ0FBQyxFQUMvRyxlQUFlLENBQUMsRUFBRSxHQUFHLFFBQVEsQ0FBQyxxQkFBcUIsQ0FBQyxDQUFDO2dCQUN2RCxNQUFNO1lBQ1IsS0FBSyxTQUFTO2dCQUNaLGVBQWUsQ0FBQyxFQUFFLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxFQUFFLEdBQUcsS0FBSyxFQUFFLGVBQWUsQ0FBQyxFQUFFLEdBQUcsUUFBUSxDQUFDLHFCQUFxQixDQUFDLEVBQy9HLGVBQWUsQ0FBQyxFQUFFLEdBQUcsUUFBUSxDQUFDLHFCQUFxQixDQUFDLENBQUM7Z0JBQ3ZELGVBQWUsQ0FBQyxFQUFFLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxFQUFFLEdBQUcsS0FBSyxFQUFFLGVBQWUsQ0FBQyxFQUFFLEdBQUcsUUFBUSxDQUFDLHNCQUFzQixDQUFDLEVBQ2hILGVBQWUsQ0FBQyxFQUFFLEdBQUcsUUFBUSxDQUFDLHNCQUFzQixDQUFDLENBQUM7Z0JBQ3hELE1BQU07WUFDUixLQUFLLEtBQUs7Z0JBQ1IsZUFBZSxDQUFDLEVBQUUsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLEVBQUUsR0FBRyxLQUFLLEVBQUUsZUFBZSxDQUFDLEVBQUUsR0FBRyxRQUFRLENBQUMsc0JBQXNCLENBQUMsRUFDaEgsZUFBZSxDQUFDLEVBQUUsR0FBRyxRQUFRLENBQUMsc0JBQXNCLENBQUMsQ0FBQztnQkFDeEQsTUFBTTtZQUNSLEtBQUssVUFBVTtnQkFDYixlQUFlLENBQUMsRUFBRSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUMsRUFBRSxHQUFHLEtBQUssRUFBRSxlQUFlLENBQUMsRUFBRSxHQUFHLFFBQVEsQ0FBQyxxQkFBcUIsQ0FBQyxFQUMvRyxlQUFlLENBQUMsRUFBRSxHQUFHLFFBQVEsQ0FBQyxxQkFBcUIsQ0FBQyxDQUFDO2dCQUN2RCxlQUFlLENBQUMsRUFBRSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUMsRUFBRSxHQUFHLEtBQUssRUFBRSxlQUFlLENBQUMsRUFBRSxHQUFHLFFBQVEsQ0FBQyxzQkFBc0IsQ0FBQyxFQUNoSCxlQUFlLENBQUMsRUFBRSxHQUFHLFFBQVEsQ0FBQyxzQkFBc0IsQ0FBQyxDQUFDO2dCQUN4RCxNQUFNO1lBQ1IsS0FBSyxPQUFPO2dCQUNWLGVBQWUsQ0FBQyxFQUFFLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxFQUFFLEdBQUcsS0FBSyxFQUFFLGVBQWUsQ0FBQyxFQUFFLEdBQUcsUUFBUSxDQUFDLHFCQUFxQixDQUFDLEVBQy9HLGVBQWUsQ0FBQyxFQUFFLEdBQUcsUUFBUSxDQUFDLHFCQUFxQixDQUFDLENBQUM7Z0JBQ3ZELE1BQU07WUFDUixLQUFLLGFBQWE7Z0JBQ2hCLGVBQWUsQ0FBQyxFQUFFLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxFQUFFLEdBQUcsS0FBSyxFQUFFLGVBQWUsQ0FBQyxFQUFFLEdBQUcsUUFBUSxDQUFDLHFCQUFxQixDQUFDLEVBQy9HLGVBQWUsQ0FBQyxFQUFFLEdBQUcsUUFBUSxDQUFDLHFCQUFxQixDQUFDLENBQUM7Z0JBQ3ZELGVBQWUsQ0FBQyxFQUFFLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxFQUFFLEdBQUcsS0FBSyxFQUFFLGVBQWUsQ0FBQyxFQUFFLEdBQUcsUUFBUSxDQUFDLHNCQUFzQixDQUFDLEVBQ2hILGVBQWUsQ0FBQyxFQUFFLEdBQUcsUUFBUSxDQUFDLHNCQUFzQixDQUFDLENBQUM7Z0JBQ3hELE1BQU07WUFDUixLQUFLLFFBQVE7Z0JBQ1gsZUFBZSxDQUFDLEVBQUUsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLEVBQUUsR0FBRyxLQUFLLEVBQUUsZUFBZSxDQUFDLEVBQUUsR0FBRyxRQUFRLENBQUMsc0JBQXNCLENBQUMsRUFDaEgsZUFBZSxDQUFDLEVBQUUsR0FBRyxRQUFRLENBQUMsc0JBQXNCLENBQUMsQ0FBQztnQkFDeEQsTUFBTTtZQUNSLEtBQUssWUFBWTtnQkFDZixlQUFlLENBQUMsRUFBRSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUMsRUFBRSxHQUFHLEtBQUssRUFBRSxlQUFlLENBQUMsRUFBRSxHQUFHLFFBQVEsQ0FBQyxxQkFBcUIsQ0FBQyxFQUMvRyxlQUFlLENBQUMsRUFBRSxHQUFHLFFBQVEsQ0FBQyxxQkFBcUIsQ0FBQyxDQUFDO2dCQUN2RCxlQUFlLENBQUMsRUFBRSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUMsRUFBRSxHQUFHLEtBQUssRUFBRSxlQUFlLENBQUMsRUFBRSxHQUFHLFFBQVEsQ0FBQyxzQkFBc0IsQ0FBQyxFQUNoSCxlQUFlLENBQUMsRUFBRSxHQUFHLFFBQVEsQ0FBQyxzQkFBc0IsQ0FBQyxDQUFDO2dCQUN4RCxNQUFNO1lBQ1IsS0FBSyxRQUFROztvQkFDTCxLQUFLLEdBQUcsS0FBSyxDQUFDLEtBQUs7O29CQUNuQixRQUFRLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FDdkIsSUFBSSxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMscUJBQXFCLEVBQUUsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxFQUFFLEdBQUcsU0FBUyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDLEVBQ3pGLFFBQVEsQ0FBQyxxQkFBcUIsQ0FBQzs7b0JBQzNCLFNBQVMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUN4QixJQUFJLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxzQkFBc0IsRUFBRSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLEVBQUUsR0FBRyxTQUFTLENBQUMsRUFBRSxDQUFDLENBQUMsR0FBRyxLQUFLLENBQUMsRUFDMUYsUUFBUSxDQUFDLHNCQUFzQixDQUFDO2dCQUNsQyxlQUFlLENBQUMsRUFBRSxHQUFHLFNBQVMsQ0FBQyxPQUFPLEdBQUcsUUFBUSxHQUFHLENBQUMsQ0FBQztnQkFDdEQsZUFBZSxDQUFDLEVBQUUsR0FBRyxTQUFTLENBQUMsT0FBTyxHQUFHLFFBQVEsR0FBRyxDQUFDLENBQUM7Z0JBQ3RELGVBQWUsQ0FBQyxFQUFFLEdBQUcsU0FBUyxDQUFDLE9BQU8sR0FBRyxTQUFTLEdBQUcsQ0FBQyxDQUFDO2dCQUN2RCxlQUFlLENBQUMsRUFBRSxHQUFHLFNBQVMsQ0FBQyxPQUFPLEdBQUcsU0FBUyxHQUFHLENBQUMsQ0FBQztnQkFDdkQsSUFBSSxlQUFlLENBQUMsRUFBRSxHQUFHLENBQUMsRUFBRTtvQkFDMUIsZUFBZSxDQUFDLEVBQUUsSUFBSSxlQUFlLENBQUMsRUFBRSxDQUFDO29CQUN6QyxlQUFlLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQztpQkFDeEI7cUJBQU0sSUFBSSxlQUFlLENBQUMsRUFBRSxHQUFHLE9BQU8sQ0FBQyxLQUFLLEVBQUU7b0JBQzdDLGVBQWUsQ0FBQyxFQUFFLElBQUksQ0FBQyxlQUFlLENBQUMsRUFBRSxHQUFHLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQztvQkFDM0QsZUFBZSxDQUFDLEVBQUUsR0FBRyxPQUFPLENBQUMsS0FBSyxDQUFDO2lCQUNwQztnQkFDRCxJQUFJLGVBQWUsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxFQUFFO29CQUMxQixlQUFlLENBQUMsRUFBRSxJQUFJLGVBQWUsQ0FBQyxFQUFFLENBQUM7b0JBQ3pDLGVBQWUsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDO2lCQUN4QjtxQkFBTSxJQUFJLGVBQWUsQ0FBQyxFQUFFLEdBQUcsT0FBTyxDQUFDLE1BQU0sRUFBRTtvQkFDOUMsZUFBZSxDQUFDLEVBQUUsSUFBSSxDQUFDLGVBQWUsQ0FBQyxFQUFFLEdBQUcsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDO29CQUM1RCxlQUFlLENBQUMsRUFBRSxHQUFHLE9BQU8sQ0FBQyxNQUFNLENBQUM7aUJBQ3JDO2dCQUNELE1BQU07U0FDVDtRQUVELElBQUksUUFBUSxDQUFDLG1CQUFtQixFQUFFO1lBQ2hDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxTQUFTLENBQUMsUUFBUSxFQUFFLGVBQWUsRUFBRSxPQUFPLEVBQUUsUUFBUSxDQUFDLENBQUM7U0FDL0U7SUFDSCxDQUFDOzs7Ozs7OztJQUVELGlEQUFnQjs7Ozs7OztJQUFoQixVQUFpQixRQUFnQixFQUFFLGVBQWdDLEVBQUUsT0FBbUIsRUFBRSxRQUF5Qjs7WUFDN0csU0FBUyxHQUFHLENBQUM7O1lBQ2IsU0FBUyxHQUFHLENBQUM7UUFFakIsUUFBUSxRQUFRLEVBQUU7WUFDaEIsS0FBSyxLQUFLO2dCQUNSLGVBQWUsQ0FBQyxFQUFFLEdBQUcsZUFBZSxDQUFDLEVBQUUsR0FBRyxDQUFDLGVBQWUsQ0FBQyxFQUFFLEdBQUcsZUFBZSxDQUFDLEVBQUUsQ0FBQyxHQUFHLFFBQVEsQ0FBQyxXQUFXLENBQUM7Z0JBQzNHLFNBQVMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLGVBQWUsQ0FBQyxFQUFFLEdBQUcsT0FBTyxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUMsQ0FBQztnQkFDNUQsU0FBUyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLGVBQWUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUM7Z0JBQ2hELElBQUksU0FBUyxHQUFHLENBQUMsSUFBSSxTQUFTLEdBQUcsQ0FBQyxFQUFFO29CQUNsQyxlQUFlLENBQUMsRUFBRSxJQUFJLENBQUMsU0FBUyxHQUFHLFFBQVEsQ0FBQyxXQUFXLENBQUMsR0FBRyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxHQUFHLFFBQVEsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDO29CQUN0SCxlQUFlLENBQUMsRUFBRSxJQUFJLENBQUMsU0FBUyxHQUFHLFFBQVEsQ0FBQyxXQUFXLENBQUMsR0FBRyxTQUFTLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsU0FBUyxHQUFHLFFBQVEsQ0FBQyxXQUFXLENBQUM7aUJBQ3JIO2dCQUNELE1BQU07WUFDUixLQUFLLFFBQVE7Z0JBQ1gsZUFBZSxDQUFDLEVBQUUsR0FBRyxlQUFlLENBQUMsRUFBRSxHQUFHLENBQUMsZUFBZSxDQUFDLEVBQUUsR0FBRyxlQUFlLENBQUMsRUFBRSxDQUFDLEdBQUcsUUFBUSxDQUFDLFdBQVcsQ0FBQztnQkFDM0csU0FBUyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsZUFBZSxDQUFDLEVBQUUsR0FBRyxPQUFPLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFDO2dCQUM1RCxTQUFTLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxlQUFlLENBQUMsRUFBRSxHQUFHLE9BQU8sQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDLENBQUM7Z0JBQzdELElBQUksU0FBUyxHQUFHLENBQUMsSUFBSSxTQUFTLEdBQUcsQ0FBQyxFQUFFO29CQUNsQyxlQUFlLENBQUMsRUFBRSxJQUFJLENBQUMsU0FBUyxHQUFHLFFBQVEsQ0FBQyxXQUFXLENBQUMsR0FBRyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxHQUFHLFFBQVEsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDO29CQUN0SCxlQUFlLENBQUMsRUFBRSxJQUFJLENBQUMsU0FBUyxHQUFHLFFBQVEsQ0FBQyxXQUFXLENBQUMsR0FBRyxTQUFTLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLEdBQUcsUUFBUSxDQUFDLFdBQVcsQ0FBQyxDQUFDO2lCQUN2SDtnQkFDRCxNQUFNO1lBQ1IsS0FBSyxTQUFTO2dCQUNaLGVBQWUsQ0FBQyxFQUFFLEdBQUcsZUFBZSxDQUFDLEVBQUUsR0FBRyxDQUFDLGVBQWUsQ0FBQyxFQUFFLEdBQUcsZUFBZSxDQUFDLEVBQUUsQ0FBQyxHQUFHLFFBQVEsQ0FBQyxXQUFXLENBQUM7Z0JBQzNHLFNBQVMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxlQUFlLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDO2dCQUNoRCxTQUFTLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsZUFBZSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQztnQkFDaEQsSUFBSSxTQUFTLEdBQUcsQ0FBQyxJQUFJLFNBQVMsR0FBRyxDQUFDLEVBQUU7b0JBQ2xDLGVBQWUsQ0FBQyxFQUFFLElBQUksQ0FBQyxTQUFTLEdBQUcsUUFBUSxDQUFDLFdBQVcsQ0FBQyxHQUFHLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLEdBQUcsUUFBUSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUM7b0JBQ3RILGVBQWUsQ0FBQyxFQUFFLElBQUksQ0FBQyxTQUFTLEdBQUcsUUFBUSxDQUFDLFdBQVcsQ0FBQyxHQUFHLFNBQVMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxTQUFTLEdBQUcsUUFBUSxDQUFDLFdBQVcsQ0FBQztpQkFDckg7Z0JBQ0QsTUFBTTtZQUNSLEtBQUssVUFBVTtnQkFDYixlQUFlLENBQUMsRUFBRSxHQUFHLGVBQWUsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxlQUFlLENBQUMsRUFBRSxHQUFHLGVBQWUsQ0FBQyxFQUFFLENBQUMsR0FBRyxRQUFRLENBQUMsV0FBVyxDQUFDO2dCQUMzRyxTQUFTLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxlQUFlLENBQUMsRUFBRSxHQUFHLE9BQU8sQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDLENBQUM7Z0JBQzVELFNBQVMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxlQUFlLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDO2dCQUNoRCxJQUFJLFNBQVMsR0FBRyxDQUFDLElBQUksU0FBUyxHQUFHLENBQUMsRUFBRTtvQkFDbEMsZUFBZSxDQUFDLEVBQUUsSUFBSSxDQUFDLFNBQVMsR0FBRyxRQUFRLENBQUMsV0FBVyxDQUFDLEdBQUcsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsR0FBRyxRQUFRLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQztvQkFDdEgsZUFBZSxDQUFDLEVBQUUsSUFBSSxDQUFDLFNBQVMsR0FBRyxRQUFRLENBQUMsV0FBVyxDQUFDLEdBQUcsU0FBUyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLFNBQVMsR0FBRyxRQUFRLENBQUMsV0FBVyxDQUFDO2lCQUNySDtnQkFDRCxNQUFNO1lBQ1IsS0FBSyxPQUFPLENBQUM7WUFDYixLQUFLLGFBQWE7Z0JBQ2hCLGVBQWUsQ0FBQyxFQUFFLEdBQUcsZUFBZSxDQUFDLEVBQUUsR0FBRyxDQUFDLGVBQWUsQ0FBQyxFQUFFLEdBQUcsZUFBZSxDQUFDLEVBQUUsQ0FBQyxHQUFHLFFBQVEsQ0FBQyxXQUFXLENBQUM7Z0JBQzNHLFNBQVMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLGVBQWUsQ0FBQyxFQUFFLEdBQUcsT0FBTyxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUMsQ0FBQztnQkFDNUQsU0FBUyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsZUFBZSxDQUFDLEVBQUUsR0FBRyxPQUFPLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQyxDQUFDO2dCQUM3RCxJQUFJLFNBQVMsR0FBRyxDQUFDLElBQUksU0FBUyxHQUFHLENBQUMsRUFBRTtvQkFDbEMsZUFBZSxDQUFDLEVBQUUsSUFBSSxDQUFDLFNBQVMsR0FBRyxRQUFRLENBQUMsV0FBVyxDQUFDLEdBQUcsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsR0FBRyxRQUFRLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQztvQkFDdEgsZUFBZSxDQUFDLEVBQUUsSUFBSSxDQUFDLFNBQVMsR0FBRyxRQUFRLENBQUMsV0FBVyxDQUFDLEdBQUcsU0FBUyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLFNBQVMsR0FBRyxRQUFRLENBQUMsV0FBVyxDQUFDO2lCQUNySDtnQkFDRCxNQUFNO1lBQ1IsS0FBSyxNQUFNLENBQUM7WUFDWixLQUFLLFlBQVk7Z0JBQ2YsZUFBZSxDQUFDLEVBQUUsR0FBRyxlQUFlLENBQUMsRUFBRSxHQUFHLENBQUMsZUFBZSxDQUFDLEVBQUUsR0FBRyxlQUFlLENBQUMsRUFBRSxDQUFDLEdBQUcsUUFBUSxDQUFDLFdBQVcsQ0FBQztnQkFDM0csU0FBUyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLGVBQWUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUM7Z0JBQ2hELFNBQVMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLGVBQWUsQ0FBQyxFQUFFLEdBQUcsT0FBTyxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUMsQ0FBQztnQkFDN0QsSUFBSSxTQUFTLEdBQUcsQ0FBQyxJQUFJLFNBQVMsR0FBRyxDQUFDLEVBQUU7b0JBQ2xDLGVBQWUsQ0FBQyxFQUFFLElBQUksQ0FBQyxTQUFTLEdBQUcsUUFBUSxDQUFDLFdBQVcsQ0FBQyxHQUFHLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLEdBQUcsUUFBUSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUM7b0JBQ3RILGVBQWUsQ0FBQyxFQUFFLElBQUksQ0FBQyxTQUFTLEdBQUcsUUFBUSxDQUFDLFdBQVcsQ0FBQyxHQUFHLFNBQVMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxTQUFTLEdBQUcsUUFBUSxDQUFDLFdBQVcsQ0FBQztpQkFDckg7Z0JBQ0QsTUFBTTtZQUNSLEtBQUssUUFBUTtnQkFDWCxlQUFlLENBQUMsRUFBRSxHQUFHLGVBQWUsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxlQUFlLENBQUMsRUFBRSxHQUFHLGVBQWUsQ0FBQyxFQUFFLENBQUMsR0FBRyxRQUFRLENBQUMsV0FBVyxDQUFDO2dCQUMzRyxlQUFlLENBQUMsRUFBRSxHQUFHLGVBQWUsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxlQUFlLENBQUMsRUFBRSxHQUFHLGVBQWUsQ0FBQyxFQUFFLENBQUMsR0FBRyxRQUFRLENBQUMsV0FBVyxDQUFDOztvQkFDckcsVUFBVSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLGVBQWUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDOztvQkFDaEQsVUFBVSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsZUFBZSxDQUFDLEVBQUUsR0FBRyxPQUFPLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQzs7b0JBQzVELFVBQVUsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLGVBQWUsQ0FBQyxFQUFFLEdBQUcsT0FBTyxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUM7O29CQUM3RCxVQUFVLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsZUFBZSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUM7Z0JBQ3RELElBQUksVUFBVSxHQUFHLENBQUMsSUFBSSxVQUFVLEdBQUcsQ0FBQyxJQUFJLFVBQVUsR0FBRyxDQUFDLElBQUksVUFBVSxHQUFHLENBQUMsRUFBRTtvQkFDeEUsZUFBZSxDQUFDLEVBQUUsSUFBSSxDQUFDLFVBQVUsR0FBRyxRQUFRLENBQUMsV0FBVyxDQUFDLEdBQUcsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLFVBQVUsR0FBRyxRQUFRLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQztvQkFDMUgsZUFBZSxDQUFDLEVBQUUsSUFBSSxDQUFDLFVBQVUsR0FBRyxRQUFRLENBQUMsV0FBVyxDQUFDLEdBQUcsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLFVBQVUsR0FBRyxRQUFRLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQztvQkFDMUgsZUFBZSxDQUFDLEVBQUUsSUFBSSxDQUFDLFVBQVUsR0FBRyxRQUFRLENBQUMsV0FBVyxDQUFDLEdBQUcsVUFBVSxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLFVBQVUsR0FBRyxRQUFRLENBQUMsV0FBVyxDQUFDO29CQUN4SCxlQUFlLENBQUMsRUFBRSxJQUFJLENBQUMsVUFBVSxHQUFHLFFBQVEsQ0FBQyxXQUFXLENBQUMsR0FBRyxVQUFVLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsVUFBVSxHQUFHLFFBQVEsQ0FBQyxXQUFXLENBQUM7aUJBQ3pIO2dCQUNELE1BQU07U0FDVDtJQUNILENBQUM7Ozs7O0lBRUQsMkNBQVU7Ozs7SUFBVixVQUFXLEtBQVU7UUFDbkIsT0FBTyxDQUFDLEtBQUssQ0FBQyxPQUFPLElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDN0YsQ0FBQzs7Ozs7SUFFRCwyQ0FBVTs7OztJQUFWLFVBQVcsS0FBVTtRQUNuQixPQUFPLENBQUMsS0FBSyxDQUFDLE9BQU8sSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUM3RixDQUFDOztnQkFuTkYsVUFBVSxTQUFDLEVBQUMsVUFBVSxFQUFFLE1BQU0sRUFBQzs7O2lDQUpoQztDQXdOQyxBQXBORCxJQW9OQztTQW5OWSxzQkFBc0IiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBFbGVtZW50UmVmLCBJbmplY3RhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBDcm9wcGVyUG9zaXRpb24sIERpbWVuc2lvbnMsIE1vdmVTdGFydCB9IGZyb20gJy4uL2ludGVyZmFjZXMnO1xuaW1wb3J0IHsgQ3JvcHBlclNldHRpbmdzIH0gZnJvbSAnLi4vaW50ZXJmYWNlcy9jcm9wcGVyLnNldHRpbmdzJztcblxuQEluamVjdGFibGUoe3Byb3ZpZGVkSW46ICdyb290J30pXG5leHBvcnQgY2xhc3MgQ3JvcHBlclBvc2l0aW9uU2VydmljZSB7XG5cbiAgcmVzZXRDcm9wcGVyUG9zaXRpb24oc291cmNlSW1hZ2U6IEVsZW1lbnRSZWYsIGNyb3BwZXJQb3NpdGlvbjogQ3JvcHBlclBvc2l0aW9uLCBzZXR0aW5nczogQ3JvcHBlclNldHRpbmdzKTogdm9pZCB7XG4gICAgaWYgKCFzb3VyY2VJbWFnZT8ubmF0aXZlRWxlbWVudCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBzb3VyY2VJbWFnZUVsZW1lbnQgPSBzb3VyY2VJbWFnZS5uYXRpdmVFbGVtZW50O1xuICAgIGlmIChzZXR0aW5ncy5jcm9wcGVyU3RhdGljSGVpZ2h0ICYmIHNldHRpbmdzLmNyb3BwZXJTdGF0aWNXaWR0aCkge1xuICAgICAgY3JvcHBlclBvc2l0aW9uLngxID0gMDtcbiAgICAgIGNyb3BwZXJQb3NpdGlvbi54MiA9IHNvdXJjZUltYWdlRWxlbWVudC5vZmZzZXRXaWR0aCA+IHNldHRpbmdzLmNyb3BwZXJTdGF0aWNXaWR0aCA/XG4gICAgICAgIHNldHRpbmdzLmNyb3BwZXJTdGF0aWNXaWR0aCA6IHNvdXJjZUltYWdlRWxlbWVudC5vZmZzZXRXaWR0aDtcbiAgICAgIGNyb3BwZXJQb3NpdGlvbi55MSA9IDA7XG4gICAgICBjcm9wcGVyUG9zaXRpb24ueTIgPSBzb3VyY2VJbWFnZUVsZW1lbnQub2Zmc2V0SGVpZ2h0ID4gc2V0dGluZ3MuY3JvcHBlclN0YXRpY0hlaWdodCA/XG4gICAgICAgIHNldHRpbmdzLmNyb3BwZXJTdGF0aWNIZWlnaHQgOiBzb3VyY2VJbWFnZUVsZW1lbnQub2Zmc2V0SGVpZ2h0O1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCBjcm9wcGVyV2lkdGggPSBNYXRoLm1pbihzZXR0aW5ncy5jcm9wcGVyU2NhbGVkTWF4V2lkdGgsIHNvdXJjZUltYWdlRWxlbWVudC5vZmZzZXRXaWR0aCk7XG4gICAgICBjb25zdCBjcm9wcGVySGVpZ2h0ID0gTWF0aC5taW4oc2V0dGluZ3MuY3JvcHBlclNjYWxlZE1heEhlaWdodCwgc291cmNlSW1hZ2VFbGVtZW50Lm9mZnNldEhlaWdodCk7XG4gICAgICBpZiAoIXNldHRpbmdzLm1haW50YWluQXNwZWN0UmF0aW8pIHtcbiAgICAgICAgY3JvcHBlclBvc2l0aW9uLngxID0gMDtcbiAgICAgICAgY3JvcHBlclBvc2l0aW9uLngyID0gY3JvcHBlcldpZHRoO1xuICAgICAgICBjcm9wcGVyUG9zaXRpb24ueTEgPSAwO1xuICAgICAgICBjcm9wcGVyUG9zaXRpb24ueTIgPSBjcm9wcGVySGVpZ2h0O1xuICAgICAgfSBlbHNlIGlmIChjcm9wcGVyV2lkdGggLyBzZXR0aW5ncy5hc3BlY3RSYXRpbyA8IGNyb3BwZXJIZWlnaHQpIHtcbiAgICAgICAgY3JvcHBlclBvc2l0aW9uLngxID0gMDtcbiAgICAgICAgY3JvcHBlclBvc2l0aW9uLngyID0gY3JvcHBlcldpZHRoO1xuICAgICAgICBjb25zdCBjcm9wcGVySGVpZ2h0V2l0aEFzcGVjdFJhdGlvID0gY3JvcHBlcldpZHRoIC8gc2V0dGluZ3MuYXNwZWN0UmF0aW87XG4gICAgICAgIGNyb3BwZXJQb3NpdGlvbi55MSA9IChzb3VyY2VJbWFnZUVsZW1lbnQub2Zmc2V0SGVpZ2h0IC0gY3JvcHBlckhlaWdodFdpdGhBc3BlY3RSYXRpbykgLyAyO1xuICAgICAgICBjcm9wcGVyUG9zaXRpb24ueTIgPSBjcm9wcGVyUG9zaXRpb24ueTEgKyBjcm9wcGVySGVpZ2h0V2l0aEFzcGVjdFJhdGlvO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY3JvcHBlclBvc2l0aW9uLnkxID0gMDtcbiAgICAgICAgY3JvcHBlclBvc2l0aW9uLnkyID0gY3JvcHBlckhlaWdodDtcbiAgICAgICAgY29uc3QgY3JvcHBlcldpZHRoV2l0aEFzcGVjdFJhdGlvID0gY3JvcHBlckhlaWdodCAqIHNldHRpbmdzLmFzcGVjdFJhdGlvO1xuICAgICAgICBjcm9wcGVyUG9zaXRpb24ueDEgPSAoc291cmNlSW1hZ2VFbGVtZW50Lm9mZnNldFdpZHRoIC0gY3JvcHBlcldpZHRoV2l0aEFzcGVjdFJhdGlvKSAvIDI7XG4gICAgICAgIGNyb3BwZXJQb3NpdGlvbi54MiA9IGNyb3BwZXJQb3NpdGlvbi54MSArIGNyb3BwZXJXaWR0aFdpdGhBc3BlY3RSYXRpbztcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBtb3ZlKGV2ZW50OiBhbnksIG1vdmVTdGFydDogTW92ZVN0YXJ0LCBjcm9wcGVyUG9zaXRpb246IENyb3BwZXJQb3NpdGlvbikge1xuICAgIGNvbnN0IGRpZmZYID0gdGhpcy5nZXRDbGllbnRYKGV2ZW50KSAtIG1vdmVTdGFydC5jbGllbnRYO1xuICAgIGNvbnN0IGRpZmZZID0gdGhpcy5nZXRDbGllbnRZKGV2ZW50KSAtIG1vdmVTdGFydC5jbGllbnRZO1xuXG4gICAgY3JvcHBlclBvc2l0aW9uLngxID0gbW92ZVN0YXJ0LngxICsgZGlmZlg7XG4gICAgY3JvcHBlclBvc2l0aW9uLnkxID0gbW92ZVN0YXJ0LnkxICsgZGlmZlk7XG4gICAgY3JvcHBlclBvc2l0aW9uLngyID0gbW92ZVN0YXJ0LngyICsgZGlmZlg7XG4gICAgY3JvcHBlclBvc2l0aW9uLnkyID0gbW92ZVN0YXJ0LnkyICsgZGlmZlk7XG4gIH1cblxuICByZXNpemUoZXZlbnQ6IGFueSwgbW92ZVN0YXJ0OiBNb3ZlU3RhcnQsIGNyb3BwZXJQb3NpdGlvbjogQ3JvcHBlclBvc2l0aW9uLCBtYXhTaXplOiBEaW1lbnNpb25zLCBzZXR0aW5nczogQ3JvcHBlclNldHRpbmdzKTogdm9pZCB7XG4gICAgY29uc3QgbW92ZVggPSB0aGlzLmdldENsaWVudFgoZXZlbnQpIC0gbW92ZVN0YXJ0LmNsaWVudFg7XG4gICAgY29uc3QgbW92ZVkgPSB0aGlzLmdldENsaWVudFkoZXZlbnQpIC0gbW92ZVN0YXJ0LmNsaWVudFk7XG4gICAgc3dpdGNoIChtb3ZlU3RhcnQucG9zaXRpb24pIHtcbiAgICAgIGNhc2UgJ2xlZnQnOlxuICAgICAgICBjcm9wcGVyUG9zaXRpb24ueDEgPSBNYXRoLm1pbihNYXRoLm1heChtb3ZlU3RhcnQueDEgKyBtb3ZlWCwgY3JvcHBlclBvc2l0aW9uLngyIC0gc2V0dGluZ3MuY3JvcHBlclNjYWxlZE1heFdpZHRoKSxcbiAgICAgICAgICBjcm9wcGVyUG9zaXRpb24ueDIgLSBzZXR0aW5ncy5jcm9wcGVyU2NhbGVkTWluV2lkdGgpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ3RvcGxlZnQnOlxuICAgICAgICBjcm9wcGVyUG9zaXRpb24ueDEgPSBNYXRoLm1pbihNYXRoLm1heChtb3ZlU3RhcnQueDEgKyBtb3ZlWCwgY3JvcHBlclBvc2l0aW9uLngyIC0gc2V0dGluZ3MuY3JvcHBlclNjYWxlZE1heFdpZHRoKSxcbiAgICAgICAgICBjcm9wcGVyUG9zaXRpb24ueDIgLSBzZXR0aW5ncy5jcm9wcGVyU2NhbGVkTWluV2lkdGgpO1xuICAgICAgICBjcm9wcGVyUG9zaXRpb24ueTEgPSBNYXRoLm1pbihNYXRoLm1heChtb3ZlU3RhcnQueTEgKyBtb3ZlWSwgY3JvcHBlclBvc2l0aW9uLnkyIC0gc2V0dGluZ3MuY3JvcHBlclNjYWxlZE1heEhlaWdodCksXG4gICAgICAgICAgY3JvcHBlclBvc2l0aW9uLnkyIC0gc2V0dGluZ3MuY3JvcHBlclNjYWxlZE1pbkhlaWdodCk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAndG9wJzpcbiAgICAgICAgY3JvcHBlclBvc2l0aW9uLnkxID0gTWF0aC5taW4oTWF0aC5tYXgobW92ZVN0YXJ0LnkxICsgbW92ZVksIGNyb3BwZXJQb3NpdGlvbi55MiAtIHNldHRpbmdzLmNyb3BwZXJTY2FsZWRNYXhIZWlnaHQpLFxuICAgICAgICAgIGNyb3BwZXJQb3NpdGlvbi55MiAtIHNldHRpbmdzLmNyb3BwZXJTY2FsZWRNaW5IZWlnaHQpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ3RvcHJpZ2h0JzpcbiAgICAgICAgY3JvcHBlclBvc2l0aW9uLngyID0gTWF0aC5tYXgoTWF0aC5taW4obW92ZVN0YXJ0LngyICsgbW92ZVgsIGNyb3BwZXJQb3NpdGlvbi54MSArIHNldHRpbmdzLmNyb3BwZXJTY2FsZWRNYXhXaWR0aCksXG4gICAgICAgICAgY3JvcHBlclBvc2l0aW9uLngxICsgc2V0dGluZ3MuY3JvcHBlclNjYWxlZE1pbldpZHRoKTtcbiAgICAgICAgY3JvcHBlclBvc2l0aW9uLnkxID0gTWF0aC5taW4oTWF0aC5tYXgobW92ZVN0YXJ0LnkxICsgbW92ZVksIGNyb3BwZXJQb3NpdGlvbi55MiAtIHNldHRpbmdzLmNyb3BwZXJTY2FsZWRNYXhIZWlnaHQpLFxuICAgICAgICAgIGNyb3BwZXJQb3NpdGlvbi55MiAtIHNldHRpbmdzLmNyb3BwZXJTY2FsZWRNaW5IZWlnaHQpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ3JpZ2h0JzpcbiAgICAgICAgY3JvcHBlclBvc2l0aW9uLngyID0gTWF0aC5tYXgoTWF0aC5taW4obW92ZVN0YXJ0LngyICsgbW92ZVgsIGNyb3BwZXJQb3NpdGlvbi54MSArIHNldHRpbmdzLmNyb3BwZXJTY2FsZWRNYXhXaWR0aCksXG4gICAgICAgICAgY3JvcHBlclBvc2l0aW9uLngxICsgc2V0dGluZ3MuY3JvcHBlclNjYWxlZE1pbldpZHRoKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdib3R0b21yaWdodCc6XG4gICAgICAgIGNyb3BwZXJQb3NpdGlvbi54MiA9IE1hdGgubWF4KE1hdGgubWluKG1vdmVTdGFydC54MiArIG1vdmVYLCBjcm9wcGVyUG9zaXRpb24ueDEgKyBzZXR0aW5ncy5jcm9wcGVyU2NhbGVkTWF4V2lkdGgpLFxuICAgICAgICAgIGNyb3BwZXJQb3NpdGlvbi54MSArIHNldHRpbmdzLmNyb3BwZXJTY2FsZWRNaW5XaWR0aCk7XG4gICAgICAgIGNyb3BwZXJQb3NpdGlvbi55MiA9IE1hdGgubWF4KE1hdGgubWluKG1vdmVTdGFydC55MiArIG1vdmVZLCBjcm9wcGVyUG9zaXRpb24ueTEgKyBzZXR0aW5ncy5jcm9wcGVyU2NhbGVkTWF4SGVpZ2h0KSxcbiAgICAgICAgICBjcm9wcGVyUG9zaXRpb24ueTEgKyBzZXR0aW5ncy5jcm9wcGVyU2NhbGVkTWluSGVpZ2h0KTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdib3R0b20nOlxuICAgICAgICBjcm9wcGVyUG9zaXRpb24ueTIgPSBNYXRoLm1heChNYXRoLm1pbihtb3ZlU3RhcnQueTIgKyBtb3ZlWSwgY3JvcHBlclBvc2l0aW9uLnkxICsgc2V0dGluZ3MuY3JvcHBlclNjYWxlZE1heEhlaWdodCksXG4gICAgICAgICAgY3JvcHBlclBvc2l0aW9uLnkxICsgc2V0dGluZ3MuY3JvcHBlclNjYWxlZE1pbkhlaWdodCk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnYm90dG9tbGVmdCc6XG4gICAgICAgIGNyb3BwZXJQb3NpdGlvbi54MSA9IE1hdGgubWluKE1hdGgubWF4KG1vdmVTdGFydC54MSArIG1vdmVYLCBjcm9wcGVyUG9zaXRpb24ueDIgLSBzZXR0aW5ncy5jcm9wcGVyU2NhbGVkTWF4V2lkdGgpLFxuICAgICAgICAgIGNyb3BwZXJQb3NpdGlvbi54MiAtIHNldHRpbmdzLmNyb3BwZXJTY2FsZWRNaW5XaWR0aCk7XG4gICAgICAgIGNyb3BwZXJQb3NpdGlvbi55MiA9IE1hdGgubWF4KE1hdGgubWluKG1vdmVTdGFydC55MiArIG1vdmVZLCBjcm9wcGVyUG9zaXRpb24ueTEgKyBzZXR0aW5ncy5jcm9wcGVyU2NhbGVkTWF4SGVpZ2h0KSxcbiAgICAgICAgICBjcm9wcGVyUG9zaXRpb24ueTEgKyBzZXR0aW5ncy5jcm9wcGVyU2NhbGVkTWluSGVpZ2h0KTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdjZW50ZXInOlxuICAgICAgICBjb25zdCBzY2FsZSA9IGV2ZW50LnNjYWxlO1xuICAgICAgICBjb25zdCBuZXdXaWR0aCA9IE1hdGgubWluKFxuICAgICAgICAgIE1hdGgubWF4KHNldHRpbmdzLmNyb3BwZXJTY2FsZWRNaW5XaWR0aCwgKE1hdGguYWJzKG1vdmVTdGFydC54MiAtIG1vdmVTdGFydC54MSkpICogc2NhbGUpLFxuICAgICAgICAgIHNldHRpbmdzLmNyb3BwZXJTY2FsZWRNYXhXaWR0aCk7XG4gICAgICAgIGNvbnN0IG5ld0hlaWdodCA9IE1hdGgubWluKFxuICAgICAgICAgIE1hdGgubWF4KHNldHRpbmdzLmNyb3BwZXJTY2FsZWRNaW5IZWlnaHQsIChNYXRoLmFicyhtb3ZlU3RhcnQueTIgLSBtb3ZlU3RhcnQueTEpKSAqIHNjYWxlKSxcbiAgICAgICAgICBzZXR0aW5ncy5jcm9wcGVyU2NhbGVkTWF4SGVpZ2h0KTtcbiAgICAgICAgY3JvcHBlclBvc2l0aW9uLngxID0gbW92ZVN0YXJ0LmNsaWVudFggLSBuZXdXaWR0aCAvIDI7XG4gICAgICAgIGNyb3BwZXJQb3NpdGlvbi54MiA9IG1vdmVTdGFydC5jbGllbnRYICsgbmV3V2lkdGggLyAyO1xuICAgICAgICBjcm9wcGVyUG9zaXRpb24ueTEgPSBtb3ZlU3RhcnQuY2xpZW50WSAtIG5ld0hlaWdodCAvIDI7XG4gICAgICAgIGNyb3BwZXJQb3NpdGlvbi55MiA9IG1vdmVTdGFydC5jbGllbnRZICsgbmV3SGVpZ2h0IC8gMjtcbiAgICAgICAgaWYgKGNyb3BwZXJQb3NpdGlvbi54MSA8IDApIHtcbiAgICAgICAgICBjcm9wcGVyUG9zaXRpb24ueDIgLT0gY3JvcHBlclBvc2l0aW9uLngxO1xuICAgICAgICAgIGNyb3BwZXJQb3NpdGlvbi54MSA9IDA7XG4gICAgICAgIH0gZWxzZSBpZiAoY3JvcHBlclBvc2l0aW9uLngyID4gbWF4U2l6ZS53aWR0aCkge1xuICAgICAgICAgIGNyb3BwZXJQb3NpdGlvbi54MSAtPSAoY3JvcHBlclBvc2l0aW9uLngyIC0gbWF4U2l6ZS53aWR0aCk7XG4gICAgICAgICAgY3JvcHBlclBvc2l0aW9uLngyID0gbWF4U2l6ZS53aWR0aDtcbiAgICAgICAgfVxuICAgICAgICBpZiAoY3JvcHBlclBvc2l0aW9uLnkxIDwgMCkge1xuICAgICAgICAgIGNyb3BwZXJQb3NpdGlvbi55MiAtPSBjcm9wcGVyUG9zaXRpb24ueTE7XG4gICAgICAgICAgY3JvcHBlclBvc2l0aW9uLnkxID0gMDtcbiAgICAgICAgfSBlbHNlIGlmIChjcm9wcGVyUG9zaXRpb24ueTIgPiBtYXhTaXplLmhlaWdodCkge1xuICAgICAgICAgIGNyb3BwZXJQb3NpdGlvbi55MSAtPSAoY3JvcHBlclBvc2l0aW9uLnkyIC0gbWF4U2l6ZS5oZWlnaHQpO1xuICAgICAgICAgIGNyb3BwZXJQb3NpdGlvbi55MiA9IG1heFNpemUuaGVpZ2h0O1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuICAgIH1cblxuICAgIGlmIChzZXR0aW5ncy5tYWludGFpbkFzcGVjdFJhdGlvKSB7XG4gICAgICB0aGlzLmNoZWNrQXNwZWN0UmF0aW8obW92ZVN0YXJ0LnBvc2l0aW9uLCBjcm9wcGVyUG9zaXRpb24sIG1heFNpemUsIHNldHRpbmdzKTtcbiAgICB9XG4gIH1cblxuICBjaGVja0FzcGVjdFJhdGlvKHBvc2l0aW9uOiBzdHJpbmcsIGNyb3BwZXJQb3NpdGlvbjogQ3JvcHBlclBvc2l0aW9uLCBtYXhTaXplOiBEaW1lbnNpb25zLCBzZXR0aW5nczogQ3JvcHBlclNldHRpbmdzKTogdm9pZCB7XG4gICAgbGV0IG92ZXJmbG93WCA9IDA7XG4gICAgbGV0IG92ZXJmbG93WSA9IDA7XG5cbiAgICBzd2l0Y2ggKHBvc2l0aW9uKSB7XG4gICAgICBjYXNlICd0b3AnOlxuICAgICAgICBjcm9wcGVyUG9zaXRpb24ueDIgPSBjcm9wcGVyUG9zaXRpb24ueDEgKyAoY3JvcHBlclBvc2l0aW9uLnkyIC0gY3JvcHBlclBvc2l0aW9uLnkxKSAqIHNldHRpbmdzLmFzcGVjdFJhdGlvO1xuICAgICAgICBvdmVyZmxvd1ggPSBNYXRoLm1heChjcm9wcGVyUG9zaXRpb24ueDIgLSBtYXhTaXplLndpZHRoLCAwKTtcbiAgICAgICAgb3ZlcmZsb3dZID0gTWF0aC5tYXgoMCAtIGNyb3BwZXJQb3NpdGlvbi55MSwgMCk7XG4gICAgICAgIGlmIChvdmVyZmxvd1ggPiAwIHx8IG92ZXJmbG93WSA+IDApIHtcbiAgICAgICAgICBjcm9wcGVyUG9zaXRpb24ueDIgLT0gKG92ZXJmbG93WSAqIHNldHRpbmdzLmFzcGVjdFJhdGlvKSA+IG92ZXJmbG93WCA/IChvdmVyZmxvd1kgKiBzZXR0aW5ncy5hc3BlY3RSYXRpbykgOiBvdmVyZmxvd1g7XG4gICAgICAgICAgY3JvcHBlclBvc2l0aW9uLnkxICs9IChvdmVyZmxvd1kgKiBzZXR0aW5ncy5hc3BlY3RSYXRpbykgPiBvdmVyZmxvd1ggPyBvdmVyZmxvd1kgOiBvdmVyZmxvd1ggLyBzZXR0aW5ncy5hc3BlY3RSYXRpbztcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ2JvdHRvbSc6XG4gICAgICAgIGNyb3BwZXJQb3NpdGlvbi54MiA9IGNyb3BwZXJQb3NpdGlvbi54MSArIChjcm9wcGVyUG9zaXRpb24ueTIgLSBjcm9wcGVyUG9zaXRpb24ueTEpICogc2V0dGluZ3MuYXNwZWN0UmF0aW87XG4gICAgICAgIG92ZXJmbG93WCA9IE1hdGgubWF4KGNyb3BwZXJQb3NpdGlvbi54MiAtIG1heFNpemUud2lkdGgsIDApO1xuICAgICAgICBvdmVyZmxvd1kgPSBNYXRoLm1heChjcm9wcGVyUG9zaXRpb24ueTIgLSBtYXhTaXplLmhlaWdodCwgMCk7XG4gICAgICAgIGlmIChvdmVyZmxvd1ggPiAwIHx8IG92ZXJmbG93WSA+IDApIHtcbiAgICAgICAgICBjcm9wcGVyUG9zaXRpb24ueDIgLT0gKG92ZXJmbG93WSAqIHNldHRpbmdzLmFzcGVjdFJhdGlvKSA+IG92ZXJmbG93WCA/IChvdmVyZmxvd1kgKiBzZXR0aW5ncy5hc3BlY3RSYXRpbykgOiBvdmVyZmxvd1g7XG4gICAgICAgICAgY3JvcHBlclBvc2l0aW9uLnkyIC09IChvdmVyZmxvd1kgKiBzZXR0aW5ncy5hc3BlY3RSYXRpbykgPiBvdmVyZmxvd1ggPyBvdmVyZmxvd1kgOiAob3ZlcmZsb3dYIC8gc2V0dGluZ3MuYXNwZWN0UmF0aW8pO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAndG9wbGVmdCc6XG4gICAgICAgIGNyb3BwZXJQb3NpdGlvbi55MSA9IGNyb3BwZXJQb3NpdGlvbi55MiAtIChjcm9wcGVyUG9zaXRpb24ueDIgLSBjcm9wcGVyUG9zaXRpb24ueDEpIC8gc2V0dGluZ3MuYXNwZWN0UmF0aW87XG4gICAgICAgIG92ZXJmbG93WCA9IE1hdGgubWF4KDAgLSBjcm9wcGVyUG9zaXRpb24ueDEsIDApO1xuICAgICAgICBvdmVyZmxvd1kgPSBNYXRoLm1heCgwIC0gY3JvcHBlclBvc2l0aW9uLnkxLCAwKTtcbiAgICAgICAgaWYgKG92ZXJmbG93WCA+IDAgfHwgb3ZlcmZsb3dZID4gMCkge1xuICAgICAgICAgIGNyb3BwZXJQb3NpdGlvbi54MSArPSAob3ZlcmZsb3dZICogc2V0dGluZ3MuYXNwZWN0UmF0aW8pID4gb3ZlcmZsb3dYID8gKG92ZXJmbG93WSAqIHNldHRpbmdzLmFzcGVjdFJhdGlvKSA6IG92ZXJmbG93WDtcbiAgICAgICAgICBjcm9wcGVyUG9zaXRpb24ueTEgKz0gKG92ZXJmbG93WSAqIHNldHRpbmdzLmFzcGVjdFJhdGlvKSA+IG92ZXJmbG93WCA/IG92ZXJmbG93WSA6IG92ZXJmbG93WCAvIHNldHRpbmdzLmFzcGVjdFJhdGlvO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAndG9wcmlnaHQnOlxuICAgICAgICBjcm9wcGVyUG9zaXRpb24ueTEgPSBjcm9wcGVyUG9zaXRpb24ueTIgLSAoY3JvcHBlclBvc2l0aW9uLngyIC0gY3JvcHBlclBvc2l0aW9uLngxKSAvIHNldHRpbmdzLmFzcGVjdFJhdGlvO1xuICAgICAgICBvdmVyZmxvd1ggPSBNYXRoLm1heChjcm9wcGVyUG9zaXRpb24ueDIgLSBtYXhTaXplLndpZHRoLCAwKTtcbiAgICAgICAgb3ZlcmZsb3dZID0gTWF0aC5tYXgoMCAtIGNyb3BwZXJQb3NpdGlvbi55MSwgMCk7XG4gICAgICAgIGlmIChvdmVyZmxvd1ggPiAwIHx8IG92ZXJmbG93WSA+IDApIHtcbiAgICAgICAgICBjcm9wcGVyUG9zaXRpb24ueDIgLT0gKG92ZXJmbG93WSAqIHNldHRpbmdzLmFzcGVjdFJhdGlvKSA+IG92ZXJmbG93WCA/IChvdmVyZmxvd1kgKiBzZXR0aW5ncy5hc3BlY3RSYXRpbykgOiBvdmVyZmxvd1g7XG4gICAgICAgICAgY3JvcHBlclBvc2l0aW9uLnkxICs9IChvdmVyZmxvd1kgKiBzZXR0aW5ncy5hc3BlY3RSYXRpbykgPiBvdmVyZmxvd1ggPyBvdmVyZmxvd1kgOiBvdmVyZmxvd1ggLyBzZXR0aW5ncy5hc3BlY3RSYXRpbztcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ3JpZ2h0JzpcbiAgICAgIGNhc2UgJ2JvdHRvbXJpZ2h0JzpcbiAgICAgICAgY3JvcHBlclBvc2l0aW9uLnkyID0gY3JvcHBlclBvc2l0aW9uLnkxICsgKGNyb3BwZXJQb3NpdGlvbi54MiAtIGNyb3BwZXJQb3NpdGlvbi54MSkgLyBzZXR0aW5ncy5hc3BlY3RSYXRpbztcbiAgICAgICAgb3ZlcmZsb3dYID0gTWF0aC5tYXgoY3JvcHBlclBvc2l0aW9uLngyIC0gbWF4U2l6ZS53aWR0aCwgMCk7XG4gICAgICAgIG92ZXJmbG93WSA9IE1hdGgubWF4KGNyb3BwZXJQb3NpdGlvbi55MiAtIG1heFNpemUuaGVpZ2h0LCAwKTtcbiAgICAgICAgaWYgKG92ZXJmbG93WCA+IDAgfHwgb3ZlcmZsb3dZID4gMCkge1xuICAgICAgICAgIGNyb3BwZXJQb3NpdGlvbi54MiAtPSAob3ZlcmZsb3dZICogc2V0dGluZ3MuYXNwZWN0UmF0aW8pID4gb3ZlcmZsb3dYID8gKG92ZXJmbG93WSAqIHNldHRpbmdzLmFzcGVjdFJhdGlvKSA6IG92ZXJmbG93WDtcbiAgICAgICAgICBjcm9wcGVyUG9zaXRpb24ueTIgLT0gKG92ZXJmbG93WSAqIHNldHRpbmdzLmFzcGVjdFJhdGlvKSA+IG92ZXJmbG93WCA/IG92ZXJmbG93WSA6IG92ZXJmbG93WCAvIHNldHRpbmdzLmFzcGVjdFJhdGlvO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnbGVmdCc6XG4gICAgICBjYXNlICdib3R0b21sZWZ0JzpcbiAgICAgICAgY3JvcHBlclBvc2l0aW9uLnkyID0gY3JvcHBlclBvc2l0aW9uLnkxICsgKGNyb3BwZXJQb3NpdGlvbi54MiAtIGNyb3BwZXJQb3NpdGlvbi54MSkgLyBzZXR0aW5ncy5hc3BlY3RSYXRpbztcbiAgICAgICAgb3ZlcmZsb3dYID0gTWF0aC5tYXgoMCAtIGNyb3BwZXJQb3NpdGlvbi54MSwgMCk7XG4gICAgICAgIG92ZXJmbG93WSA9IE1hdGgubWF4KGNyb3BwZXJQb3NpdGlvbi55MiAtIG1heFNpemUuaGVpZ2h0LCAwKTtcbiAgICAgICAgaWYgKG92ZXJmbG93WCA+IDAgfHwgb3ZlcmZsb3dZID4gMCkge1xuICAgICAgICAgIGNyb3BwZXJQb3NpdGlvbi54MSArPSAob3ZlcmZsb3dZICogc2V0dGluZ3MuYXNwZWN0UmF0aW8pID4gb3ZlcmZsb3dYID8gKG92ZXJmbG93WSAqIHNldHRpbmdzLmFzcGVjdFJhdGlvKSA6IG92ZXJmbG93WDtcbiAgICAgICAgICBjcm9wcGVyUG9zaXRpb24ueTIgLT0gKG92ZXJmbG93WSAqIHNldHRpbmdzLmFzcGVjdFJhdGlvKSA+IG92ZXJmbG93WCA/IG92ZXJmbG93WSA6IG92ZXJmbG93WCAvIHNldHRpbmdzLmFzcGVjdFJhdGlvO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnY2VudGVyJzpcbiAgICAgICAgY3JvcHBlclBvc2l0aW9uLngyID0gY3JvcHBlclBvc2l0aW9uLngxICsgKGNyb3BwZXJQb3NpdGlvbi55MiAtIGNyb3BwZXJQb3NpdGlvbi55MSkgKiBzZXR0aW5ncy5hc3BlY3RSYXRpbztcbiAgICAgICAgY3JvcHBlclBvc2l0aW9uLnkyID0gY3JvcHBlclBvc2l0aW9uLnkxICsgKGNyb3BwZXJQb3NpdGlvbi54MiAtIGNyb3BwZXJQb3NpdGlvbi54MSkgLyBzZXR0aW5ncy5hc3BlY3RSYXRpbztcbiAgICAgICAgY29uc3Qgb3ZlcmZsb3dYMSA9IE1hdGgubWF4KDAgLSBjcm9wcGVyUG9zaXRpb24ueDEsIDApO1xuICAgICAgICBjb25zdCBvdmVyZmxvd1gyID0gTWF0aC5tYXgoY3JvcHBlclBvc2l0aW9uLngyIC0gbWF4U2l6ZS53aWR0aCwgMCk7XG4gICAgICAgIGNvbnN0IG92ZXJmbG93WTEgPSBNYXRoLm1heChjcm9wcGVyUG9zaXRpb24ueTIgLSBtYXhTaXplLmhlaWdodCwgMCk7XG4gICAgICAgIGNvbnN0IG92ZXJmbG93WTIgPSBNYXRoLm1heCgwIC0gY3JvcHBlclBvc2l0aW9uLnkxLCAwKTtcbiAgICAgICAgaWYgKG92ZXJmbG93WDEgPiAwIHx8IG92ZXJmbG93WDIgPiAwIHx8IG92ZXJmbG93WTEgPiAwIHx8IG92ZXJmbG93WTIgPiAwKSB7XG4gICAgICAgICAgY3JvcHBlclBvc2l0aW9uLngxICs9IChvdmVyZmxvd1kxICogc2V0dGluZ3MuYXNwZWN0UmF0aW8pID4gb3ZlcmZsb3dYMSA/IChvdmVyZmxvd1kxICogc2V0dGluZ3MuYXNwZWN0UmF0aW8pIDogb3ZlcmZsb3dYMTtcbiAgICAgICAgICBjcm9wcGVyUG9zaXRpb24ueDIgLT0gKG92ZXJmbG93WTIgKiBzZXR0aW5ncy5hc3BlY3RSYXRpbykgPiBvdmVyZmxvd1gyID8gKG92ZXJmbG93WTIgKiBzZXR0aW5ncy5hc3BlY3RSYXRpbykgOiBvdmVyZmxvd1gyO1xuICAgICAgICAgIGNyb3BwZXJQb3NpdGlvbi55MSArPSAob3ZlcmZsb3dZMiAqIHNldHRpbmdzLmFzcGVjdFJhdGlvKSA+IG92ZXJmbG93WDIgPyBvdmVyZmxvd1kyIDogb3ZlcmZsb3dYMiAvIHNldHRpbmdzLmFzcGVjdFJhdGlvO1xuICAgICAgICAgIGNyb3BwZXJQb3NpdGlvbi55MiAtPSAob3ZlcmZsb3dZMSAqIHNldHRpbmdzLmFzcGVjdFJhdGlvKSA+IG92ZXJmbG93WDEgPyBvdmVyZmxvd1kxIDogb3ZlcmZsb3dYMSAvIHNldHRpbmdzLmFzcGVjdFJhdGlvO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxuXG4gIGdldENsaWVudFgoZXZlbnQ6IGFueSk6IG51bWJlciB7XG4gICAgcmV0dXJuIChldmVudC50b3VjaGVzICYmIGV2ZW50LnRvdWNoZXNbMF0gPyBldmVudC50b3VjaGVzWzBdLmNsaWVudFggOiBldmVudC5jbGllbnRYKSB8fCAwO1xuICB9XG5cbiAgZ2V0Q2xpZW50WShldmVudDogYW55KTogbnVtYmVyIHtcbiAgICByZXR1cm4gKGV2ZW50LnRvdWNoZXMgJiYgZXZlbnQudG91Y2hlc1swXSA/IGV2ZW50LnRvdWNoZXNbMF0uY2xpZW50WSA6IGV2ZW50LmNsaWVudFkpIHx8IDA7XG4gIH1cbn1cbiJdfQ==
|