ng-zorro-antd-mobile
Version:
An enterprise-class mobile UI components based on Ant Design and Angular
410 lines • 30.1 kB
JavaScript
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
*/
import { Component, Input, Output, EventEmitter, ViewChild, ViewContainerRef } from '@angular/core';
/**
* @record
*/
export function ElementType() { }
if (false) {
/** @type {?} */
ElementType.prototype.type;
/** @type {?} */
ElementType.prototype.backgroundImage;
/** @type {?} */
ElementType.prototype.transform;
}
export class ImagePickerComponent {
constructor() {
this.prefixCls = 'am-image-picker';
this.flexEl = [];
this._accept = 'image/*';
this._count = 4;
this._selectable = true;
this._files = [];
this._multiple = false;
this.capture = false;
this.disableDelete = false;
this.onFail = new EventEmitter();
this.onChange = new EventEmitter();
this.onImageClick = new EventEmitter();
this.onAddImageClick = new EventEmitter();
}
/**
* @return {?}
*/
get files() {
return this._files;
}
/**
* @param {?} value
* @return {?}
*/
set files(value) {
this._files = value;
this.sortItem();
}
/**
* @return {?}
*/
get accept() {
return this._accept;
}
/**
* @param {?} value
* @return {?}
*/
set accept(value) {
this._accept = value;
this.sortItem();
}
/**
* @return {?}
*/
get length() {
return this._count;
}
/**
* @param {?} value
* @return {?}
*/
set length(value) {
if (value > 0) {
this._count = value;
}
else {
this._count = 4;
}
this.sortItem();
}
/**
* @return {?}
*/
get multiple() {
return this._multiple;
}
/**
* @param {?} value
* @return {?}
*/
set multiple(value) {
this._multiple = value;
this.sortItem();
}
/**
* @return {?}
*/
get selectable() {
return this._selectable;
}
/**
* @param {?} value
* @return {?}
*/
set selectable(value) {
this._selectable = value;
this.sortItem();
}
/**
* @return {?}
*/
sortItem() {
if (!this._files) {
return;
}
/** @type {?} */
let count = parseInt('' + this._count, 10);
if (count <= 0) {
count = 4;
}
/** @type {?} */
let allEl = this._files.map((/**
* @param {?} item
* @return {?}
*/
item => {
return {
type: 'img',
backgroundImage: 'url(' + item.url + ')',
transform: 'rotate(' + this.getRotation(item.orientation) + ')deg'
};
}));
if (this._selectable) {
allEl.push({
type: 'select',
backgroundImage: '',
transform: ''
});
}
/** @type {?} */
const length = allEl.length;
if (length !== 0 && length % count !== 0) {
/** @type {?} */
const blankCount = count - (length % count);
/** @type {?} */
const fillBlankEl = [];
for (let i = 0; i < blankCount; i++) {
fillBlankEl.push({
type: 'white',
backgroundImage: '',
transform: ''
});
}
allEl = allEl.concat(fillBlankEl);
}
this.flexEl = [];
for (let i = 0; i < allEl.length / count; i++) {
/** @type {?} */
const rowEl = allEl.slice(i * count, i * count + count);
this.flexEl.push(rowEl);
}
}
/**
* @param {?} imgItem
* @return {?}
*/
addImage(imgItem) {
this._files.push({
type: 'img',
url: imgItem.url,
orientation: imgItem.orientation
});
this.sortItem();
this.onChange.emit({
files: this._files,
operationType: 'add',
index: this._files.length - 1
});
}
/**
* @param {?} index
* @return {?}
*/
removeImage(index) {
this._files.splice(index, 1);
this.sortItem();
this.onChange.emit({
files: this._files,
operationType: 'remove',
index: index
});
}
/**
* @param {?} index
* @return {?}
*/
imageClick(index) {
this.onImageClick.emit({
index: index,
files: this._files
});
}
/**
* @param {?} e
* @return {?}
*/
addImageClick(e) {
this.onAddImageClick.emit(e);
}
/**
* @param {?} file
* @param {?} index
* @return {?}
*/
parseFile(file, index) {
/** @type {?} */
const reader = new FileReader();
reader.onload = (/**
* @param {?} e
* @return {?}
*/
e => {
/** @type {?} */
const dataURL = ((/** @type {?} */ (e.target))).result;
if (!dataURL) {
this.onFail.emit(`Fail to get the ${index} image`);
return;
}
/** @type {?} */
let orientation = 1;
this.getOrientation(file, (/**
* @param {?} res
* @return {?}
*/
res => {
// -2: not jpeg , -1: not defined
if (res > 0) {
orientation = res;
}
this.addImage({
url: dataURL,
orientation,
file
});
}));
});
reader.readAsDataURL(file);
}
/**
* @param {?} event
* @return {?}
*/
fileChange(event) {
/** @type {?} */
const fileList = event.target.files;
if (fileList && fileList.length) {
for (let i = 0; i < fileList.length; i++) {
this.parseFile(fileList[i], i);
}
}
}
/**
* @param {?=} orientation
* @return {?}
*/
getRotation(orientation = 1) {
/** @type {?} */
let imgRotation = 0;
switch (orientation) {
case 3:
imgRotation = 180;
break;
case 6:
imgRotation = 90;
break;
case 8:
imgRotation = 270;
break;
default:
}
return imgRotation;
}
// https://stackoverflow.com/questions/7584794/accessing-jpeg-exif-rotation-data-in-javascript-on-the-client-side
/**
* @param {?} file
* @param {?} callback
* @return {?}
*/
getOrientation(file, callback) {
/** @type {?} */
const reader = new FileReader();
reader.onload = (/**
* @param {?} e
* @return {?}
*/
e => {
/** @type {?} */
const view = new DataView(((/** @type {?} */ (e.target))).result);
if (view.getUint16(0, false) !== 0xffd8) {
return callback(-2);
}
/** @type {?} */
const length = view.byteLength;
/** @type {?} */
let offset = 2;
while (offset < length) {
/** @type {?} */
const marker = view.getUint16(offset, false);
offset += 2;
if (marker === 0xffe1) {
/** @type {?} */
const tmp = view.getUint32((offset += 2), false);
if (tmp !== 0x45786966) {
return callback(-1);
}
/** @type {?} */
const little = view.getUint16((offset += 6), false) === 0x4949;
offset += view.getUint32(offset + 4, little);
/** @type {?} */
const tags = view.getUint16(offset, little);
offset += 2;
for (let i = 0; i < tags; i++) {
if (view.getUint16(offset + i * 12, little) === 0x0112) {
return callback(view.getUint16(offset + i * 12 + 8, little));
}
}
}
else if ((marker & 0xff00) !== 0xff00) {
break;
}
else {
offset += view.getUint16(offset, false);
}
}
return callback(-1);
});
reader.readAsArrayBuffer(file.slice(0, 64 * 1024));
}
}
ImagePickerComponent.decorators = [
{ type: Component, args: [{
selector: 'ImagePicker, nzm-image-picker',
template: "<div class=\"{{ prefixCls }}-list\" role=\"group\">\n <Flex *ngFor=\"let rowItem of flexEl; let i = index\">\n <FlexItem *ngFor=\"let item of rowItem; let j = index\">\n <div *ngIf=\"item && 'img' === item.type && item.backgroundImage\" class=\"{{ prefixCls }}-item\">\n <div\n role=\"button\"\n *ngIf=\"!disableDelete\"\n aria-label=\"Click and Remove this image\"\n class=\"{{ prefixCls }}-item-remove\"\n (click)=\"removeImage(i * length + j)\"\n ></div>\n <div\n role=\"button\"\n aria-label=\"Image can be clicked\"\n class=\"{{ prefixCls }}-item-content\"\n [ngStyle]=\"{ 'background-image': item.backgroundImage, transform: item.transform }\"\n (click)=\"imageClick(i * length + j)\"\n ></div>\n </div>\n <div\n role=\"button\"\n aria-label=\"Choose and add image\"\n *ngIf=\"item && 'select' === item.type\"\n class=\"{{ prefixCls }}-item {{ prefixCls }}-upload-btn\"\n (click)=\"addImageClick($event)\"\n >\n <input\n #fileSelectorInput\n type=\"file\"\n [accept]=\"accept\"\n [multiple]=\"multiple\"\n [attr.capture]=\"capture ? capture : null\"\n (change)=\"fileChange($event)\"\n />\n </div>\n <div *ngIf=\"item && 'white' === item.type\" class=\"{{ prefixCls }}-item-white\"></div>\n </FlexItem>\n </Flex>\n</div>\n"
}] }
];
/** @nocollapse */
ImagePickerComponent.ctorParameters = () => [];
ImagePickerComponent.propDecorators = {
_fileSelectorInput: [{ type: ViewChild, args: ['fileSelectorInput', { read: ViewContainerRef },] }],
capture: [{ type: Input }],
disableDelete: [{ type: Input }],
files: [{ type: Input }],
accept: [{ type: Input }],
length: [{ type: Input }],
multiple: [{ type: Input }],
selectable: [{ type: Input }],
onFail: [{ type: Output }],
onChange: [{ type: Output }],
onImageClick: [{ type: Output }],
onAddImageClick: [{ type: Output }]
};
if (false) {
/** @type {?} */
ImagePickerComponent.prototype.prefixCls;
/** @type {?} */
ImagePickerComponent.prototype.flexEl;
/**
* @type {?}
* @private
*/
ImagePickerComponent.prototype._accept;
/**
* @type {?}
* @private
*/
ImagePickerComponent.prototype._count;
/**
* @type {?}
* @private
*/
ImagePickerComponent.prototype._selectable;
/**
* @type {?}
* @private
*/
ImagePickerComponent.prototype._files;
/**
* @type {?}
* @private
*/
ImagePickerComponent.prototype._multiple;
/**
* @type {?}
* @private
*/
ImagePickerComponent.prototype._fileSelectorInput;
/** @type {?} */
ImagePickerComponent.prototype.capture;
/** @type {?} */
ImagePickerComponent.prototype.disableDelete;
/** @type {?} */
ImagePickerComponent.prototype.onFail;
/** @type {?} */
ImagePickerComponent.prototype.onChange;
/** @type {?} */
ImagePickerComponent.prototype.onImageClick;
/** @type {?} */
ImagePickerComponent.prototype.onAddImageClick;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW1hZ2UtcGlja2VyLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiJuZzovL25nLXpvcnJvLWFudGQtbW9iaWxlLyIsInNvdXJjZXMiOlsiaW1hZ2UtcGlja2VyL2ltYWdlLXBpY2tlci5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7OztBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxZQUFZLEVBQUUsU0FBUyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sZUFBZSxDQUFDOzs7O0FBRXBHLGlDQUlDOzs7SUFIQywyQkFBYTs7SUFDYixzQ0FBd0I7O0lBQ3hCLGdDQUFrQjs7QUFPcEIsTUFBTSxPQUFPLG9CQUFvQjtJQW9FL0I7UUFuRUEsY0FBUyxHQUFXLGlCQUFpQixDQUFDO1FBQ3RDLFdBQU0sR0FBb0IsRUFBRSxDQUFDO1FBRXJCLFlBQU8sR0FBVyxTQUFTLENBQUM7UUFDNUIsV0FBTSxHQUFXLENBQUMsQ0FBQztRQUNuQixnQkFBVyxHQUFZLElBQUksQ0FBQztRQUM1QixXQUFNLEdBQWUsRUFBRSxDQUFDO1FBQ3hCLGNBQVMsR0FBWSxLQUFLLENBQUM7UUFLMUIsWUFBTyxHQUFxQixLQUFLLENBQUM7UUFDbEMsa0JBQWEsR0FBWSxLQUFLLENBQUM7UUE4Q3hDLFdBQU0sR0FBc0IsSUFBSSxZQUFZLEVBQUUsQ0FBQztRQUUvQyxhQUFRLEdBQXNCLElBQUksWUFBWSxFQUFFLENBQUM7UUFFakQsaUJBQVksR0FBc0IsSUFBSSxZQUFZLEVBQUUsQ0FBQztRQUVyRCxvQkFBZSxHQUFzQixJQUFJLFlBQVksRUFBRSxDQUFDO0lBRXpDLENBQUM7Ozs7SUFyRGhCLElBQ0ksS0FBSztRQUNQLE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQztJQUNyQixDQUFDOzs7OztJQUNELElBQUksS0FBSyxDQUFDLEtBQWlCO1FBQ3pCLElBQUksQ0FBQyxNQUFNLEdBQUcsS0FBSyxDQUFDO1FBQ3BCLElBQUksQ0FBQyxRQUFRLEVB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QyxDQUFDO1FBQ3RCLENBQUMsQ0FBQSxDQUFDO1FBQ0YsTUFBTSxDQUFDLGlCQUFpQixDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLEVBQUUsR0FBRyxJQUFJLENBQUMsQ0FBQyxDQUFDO0lBQ3JELENBQUM7OztZQTlPRixTQUFTLFNBQUM7Z0JBQ1QsUUFBUSxFQUFFLCtCQUErQjtnQkFDekMsMjlDQUE0QzthQUM3Qzs7Ozs7aUNBV0UsU0FBUyxTQUFDLG1CQUFtQixFQUFFLEVBQUUsSUFBSSxFQUFFLGdCQUFnQixFQUFFO3NCQUd6RCxLQUFLOzRCQUNMLEtBQUs7b0JBQ0wsS0FBSztxQkFRTCxLQUFLO3FCQVFMLEtBQUs7dUJBWUwsS0FBSzt5QkFRTCxLQUFLO3FCQVFMLE1BQU07dUJBRU4sTUFBTTsyQkFFTixNQUFNOzhCQUVOLE1BQU07Ozs7SUFoRVAseUNBQXNDOztJQUN0QyxzQ0FBNkI7Ozs7O0lBRTdCLHVDQUFvQzs7Ozs7SUFDcEMsc0NBQTJCOzs7OztJQUMzQiwyQ0FBb0M7Ozs7O0lBQ3BDLHNDQUFnQzs7Ozs7SUFDaEMseUNBQW1DOzs7OztJQUVuQyxrREFDNkM7O0lBRTdDLHVDQUEyQzs7SUFDM0MsNkNBQXdDOztJQTZDeEMsc0NBQytDOztJQUMvQyx3Q0FDaUQ7O0lBQ2pELDRDQUNxRDs7SUFDckQsK0NBQ3dEIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBJbnB1dCwgT3V0cHV0LCBFdmVudEVtaXR0ZXIsIFZpZXdDaGlsZCwgVmlld0NvbnRhaW5lclJlZiB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuXG5leHBvcnQgaW50ZXJmYWNlIEVsZW1lbnRUeXBlIHtcbiAgdHlwZTogc3RyaW5nOyAvLyAnaW1nJyB8ICdzZWxlY3QnIHwgJ3doaXRlJ1xuICBiYWNrZ3JvdW5kSW1hZ2U6IHN0cmluZztcbiAgdHJhbnNmb3JtOiBzdHJpbmc7XG59XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ0ltYWdlUGlja2VyLCBuem0taW1hZ2UtcGlja2VyJyxcbiAgdGVtcGxhdGVVcmw6ICcuL2ltYWdlLXBpY2tlci5jb21wb25lbnQuaHRtbCdcbn0pXG5leHBvcnQgY2xhc3MgSW1hZ2VQaWNrZXJDb21wb25lbnQge1xuICBwcmVmaXhDbHM6IHN0cmluZyA9ICdhbS1pbWFnZS1waWNrZXInO1xuICBmbGV4RWw6IEVsZW1lbnRUeXBlW11bXSA9IFtdO1xuXG4gIHByaXZhdGUgX2FjY2VwdDogc3RyaW5nID0gJ2ltYWdlLyonO1xuICBwcml2YXRlIF9jb3VudDogbnVtYmVyID0gNDtcbiAgcHJpdmF0ZSBfc2VsZWN0YWJsZTogYm9vbGVhbiA9IHRydWU7XG4gIHByaXZhdGUgX2ZpbGVzOiBBcnJheTxhbnk+ID0gW107XG4gIHByaXZhdGUgX211bHRpcGxlOiBib29sZWFuID0gZmFsc2U7XG5cbiAgQFZpZXdDaGlsZCgnZmlsZVNlbGVjdG9ySW5wdXQnLCB7IHJlYWQ6IFZpZXdDb250YWluZXJSZWYgfSlcbiAgcHJpdmF0ZSBfZmlsZVNlbGVjdG9ySW5wdXQ6IFZpZXdDb250YWluZXJSZWY7XG5cbiAgQElucHV0KCkgY2FwdHVyZTogYm9vbGVhbiB8IHN0cmluZyA9IGZhbHNlO1xuICBASW5wdXQoKSBkaXNhYmxlRGVsZXRlOiBib29sZWFuID0gZmFsc2U7XG4gIEBJbnB1dCgpXG4gIGdldCBmaWxlcygpIHtcbiAgICByZXR1cm4gdGhpcy5fZmlsZXM7XG4gIH1cbiAgc2V0IGZpbGVzKHZhbHVlOiBBcnJheTxhbnk+KSB7XG4gICAgdGhpcy5fZmlsZXMgPSB2YWx1ZTtcbiAgICB0aGlzLnNvcnRJdGVtKCk7XG4gIH1cbiAgQElucHV0KClcbiAgZ2V0IGFjY2VwdCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLl9hY2NlcHQ7XG4gIH1cbiAgc2V0IGFjY2VwdCh2YWx1ZTogc3RyaW5nKSB7XG4gICAgdGhpcy5fYWNjZXB0ID0gdmFsdWU7XG4gICAgdGhpcy5zb3J0SXRlbSgpO1xuICB9XG4gIEBJbnB1dCgpXG4gIGdldCBsZW5ndGgoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5fY291bnQ7XG4gIH1cbiAgc2V0IGxlbmd0aCh2YWx1ZTogbnVtYmVyKSB7XG4gICAgaWYgKHZhbHVlID4gMCkge1xuICAgICAgdGhpcy5fY291bnQgPSB2YWx1ZTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5fY291bnQgPSA0O1xuICAgIH1cbiAgICB0aGlzLnNvcnRJdGVtKCk7XG4gIH1cbiAgQElucHV0KClcbiAgZ2V0IG11bHRpcGxlKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl9tdWx0aXBsZTtcbiAgfVxuICBzZXQgbXVsdGlwbGUodmFsdWU6IGJvb2xlYW4pIHtcbiAgICB0aGlzLl9tdWx0aXBsZSA9IHZhbHVlO1xuICAgIHRoaXMuc29ydEl0ZW0oKTtcbiAgfVxuICBASW5wdXQoKVxuICBnZXQgc2VsZWN0YWJsZSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5fc2VsZWN0YWJsZTtcbiAgfVxuICBzZXQgc2VsZWN0YWJsZSh2YWx1ZTogYm9vbGVhbikge1xuICAgIHRoaXMuX3NlbGVjdGFibGUgPSB2YWx1ZTtcbiAgICB0aGlzLnNvcnRJdGVtKCk7XG4gIH1cbiAgQE91dHB1dCgpXG4gIG9uRmFpbDogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG4gIEBPdXRwdXQoKVxuICBvbkNoYW5nZTogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG4gIEBPdXRwdXQoKVxuICBvbkltYWdlQ2xpY2s6IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuICBAT3V0cHV0KClcbiAgb25BZGRJbWFnZUNsaWNrOiBFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcblxuICBjb25zdHJ1Y3RvcigpIHt9XG5cbiAgc29ydEl0ZW0oKSB7XG4gICAgaWYgKCF0aGlzLl9maWxlcykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBsZXQgY291bnQgPSBwYXJzZUludCgnJyArIHRoaXMuX2NvdW50LCAxMCk7XG4gICAgaWYgKGNvdW50IDw9IDApIHtcbiAgICAgIGNvdW50ID0gNDtcbiAgICB9XG4gICAgbGV0IGFsbEVsOiBFbGVtZW50VHlwZVtdID0gdGhpcy5fZmlsZXMubWFwKGl0ZW0gPT4ge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgdHlwZTogJ2ltZycsXG4gICAgICAgIGJhY2tncm91bmRJbWFnZTogJ3VybCgnICsgaXRlbS51cmwgKyAnKScsXG4gICAgICAgIHRyYW5zZm9ybTogJ3JvdGF0ZSgnICsgdGhpcy5nZXRSb3RhdGlvbihpdGVtLm9yaWVudGF0aW9uKSArICcpZGVnJ1xuICAgICAgfTtcbiAgICB9KTtcbiAgICBpZiAodGhpcy5fc2VsZWN0YWJsZSkge1xuICAgICAgYWxsRWwucHVzaCh7XG4gICAgICAgIHR5cGU6ICdzZWxlY3QnLFxuICAgICAgICBiYWNrZ3JvdW5kSW1hZ2U6ICcnLFxuICAgICAgICB0cmFuc2Zvcm06ICcnXG4gICAgICB9KTtcbiAgICB9XG4gICAgY29uc3QgbGVuZ3RoID0gYWxsRWwubGVuZ3RoO1xuICAgIGlmIChsZW5ndGggIT09IDAgJiYgbGVuZ3RoICUgY291bnQgIT09IDApIHtcbiAgICAgIGNvbnN0IGJsYW5rQ291bnQgPSBjb3VudCAtIChsZW5ndGggJSBjb3VudCk7XG4gICAgICBjb25zdCBmaWxsQmxhbmtFbDogYW55W10gPSBbXTtcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYmxhbmtDb3VudDsgaSsrKSB7XG4gICAgICAgIGZpbGxCbGFua0VsLnB1c2goe1xuICAgICAgICAgIHR5cGU6ICd3aGl0ZScsXG4gICAgICAgICAgYmFja2dyb3VuZEltYWdlOiAnJyxcbiAgICAgICAgICB0cmFuc2Zvcm06ICcnXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgYWxsRWwgPSBhbGxFbC5jb25jYXQoZmlsbEJsYW5rRWwpO1xuICAgIH1cbiAgICB0aGlzLmZsZXhFbCA9IFtdO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYWxsRWwubGVuZ3RoIC8gY291bnQ7IGkrKykge1xuICAgICAgY29uc3Qgcm93RWwgPSBhbGxFbC5zbGljZShpICogY291bnQsIGkgKiBjb3VudCArIGNvdW50KTtcbiAgICAgIHRoaXMuZmxleEVsLnB1c2gocm93RWwpO1xuICAgIH1cbiAgfVxuXG4gIGFkZEltYWdlKGltZ0l0ZW06IGFueSkge1xuICAgIHRoaXMuX2ZpbGVzLnB1c2goe1xuICAgICAgdHlwZTogJ2ltZycsXG4gICAgICB1cmw6IGltZ0l0ZW0udXJsLFxuICAgICAgb3JpZW50YXRpb246IGltZ0l0ZW0ub3JpZW50YXRpb25cbiAgICB9KTtcbiAgICB0aGlzLnNvcnRJdGVtKCk7XG4gICAgdGhpcy5vbkNoYW5nZS5lbWl0KHtcbiAgICAgIGZpbGVzOiB0aGlzLl9maWxlcyxcbiAgICAgIG9wZXJhdGlvblR5cGU6ICdhZGQnLFxuICAgICAgaW5kZXg6IHRoaXMuX2ZpbGVzLmxlbmd0aCAtIDFcbiAgICB9KTtcbiAgfVxuXG4gIHJlbW92ZUltYWdlKGluZGV4OiBudW1iZXIpIHtcbiAgICB0aGlzLl9maWxlcy5zcGxpY2UoaW5kZXgsIDEpO1xuICAgIHRoaXMuc29ydEl0ZW0oKTtcbiAgICB0aGlzLm9uQ2hhbmdlLmVtaXQoe1xuICAgICAgZmlsZXM6IHRoaXMuX2ZpbGVzLFxuICAgICAgb3BlcmF0aW9uVHlwZTogJ3JlbW92ZScsXG4gICAgICBpbmRleDogaW5kZXhcbiAgICB9KTtcbiAgfVxuXG4gIGltYWdlQ2xpY2soaW5kZXg6IG51bWJlcikge1xuICAgIHRoaXMub25JbWFnZUNsaWNrLmVtaXQoe1xuICAgICAgaW5kZXg6IGluZGV4LFxuICAgICAgZmlsZXM6IHRoaXMuX2ZpbGVzXG4gICAgfSk7XG4gIH1cblxuICBhZGRJbWFnZUNsaWNrKGUpIHtcbiAgICB0aGlzLm9uQWRkSW1hZ2VDbGljay5lbWl0KGUpO1xuICB9XG5cbiAgcGFyc2VGaWxlKGZpbGU6IGFueSwgaW5kZXg6IG51bWJlcikge1xuICAgIGNvbnN0IHJlYWRlciA9IG5ldyBGaWxlUmVhZGVyKCk7XG4gICAgcmVhZGVyLm9ubG9hZCA9IGUgPT4ge1xuICAgICAgY29uc3QgZGF0YVVSTCA9IChlLnRhcmdldCBhcyBhbnkpLnJlc3VsdDtcbiAgICAgIGlmICghZGF0YVVSTCkge1xuICAgICAgICB0aGlzLm9uRmFpbC5lbWl0KGBGYWlsIHRvIGdldCB0aGUgJHtpbmRleH0gaW1hZ2VgKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBsZXQgb3JpZW50YXRpb24gPSAxO1xuICAgICAgdGhpcy5nZXRPcmllbnRhdGlvbihmaWxlLCByZXMgPT4ge1xuICAgICAgICAvLyAtMjogbm90IGpwZWcgLCAtMTogbm90IGRlZmluZWRcbiAgICAgICAgaWYgKHJlcyA+IDApIHtcbiAgICAgICAgICBvcmllbnRhdGlvbiA9IHJlcztcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmFkZEltYWdlKHtcbiAgICAgICAgICB1cmw6IGRhdGFVUkwsXG4gICAgICAgICAgb3JpZW50YXRpb24sXG4gICAgICAgICAgZmlsZVxuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgIH07XG4gICAgcmVhZGVyLnJlYWRBc0RhdGFVUkwoZmlsZSk7XG4gIH1cblxuICBmaWxlQ2hhbmdlKGV2ZW50KSB7XG4gICAgY29uc3QgZmlsZUxpc3Q6IEZpbGVMaXN0ID0gZXZlbnQudGFyZ2V0LmZpbGVzO1xuICAgIGlmIChmaWxlTGlzdCAmJiBmaWxlTGlzdC5sZW5ndGgpIHtcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZmlsZUxpc3QubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgdGhpcy5wYXJzZUZpbGUoZmlsZUxpc3RbaV0sIGkpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGdldFJvdGF0aW9uKG9yaWVudGF0aW9uID0gMSkge1xuICAgIGxldCBpbWdSb3RhdGlvbiA9IDA7XG4gICAgc3dpdGNoIChvcmllbnRhdGlvbikge1xuICAgICAgY2FzZSAzOlxuICAgICAgICBpbWdSb3RhdGlvbiA9IDE4MDtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIDY6XG4gICAgICAgIGltZ1JvdGF0aW9uID0gOTA7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSA4OlxuICAgICAgICBpbWdSb3RhdGlvbiA9IDI3MDtcbiAgICAgICAgYnJlYWs7XG4gICAgICBkZWZhdWx0OlxuICAgIH1cbiAgICByZXR1cm4gaW1nUm90YXRpb247XG4gIH1cblxuICAvLyBodHRwczovL3N0YWNrb3ZlcmZsb3cuY29tL3F1ZXN0aW9ucy83NTg0Nzk0L2FjY2Vzc2luZy1qcGVnLWV4aWYtcm90YXRpb24tZGF0YS1pbi1qYXZhc2NyaXB0LW9uLXRoZS1jbGllbnQtc2lkZVxuICBnZXRPcmllbnRhdGlvbihmaWxlOiBhbnksIGNhbGxiYWNrOiAoXzogbnVtYmVyKSA9PiB2b2lkKSB7XG4gICAgY29uc3QgcmVhZGVyID0gbmV3IEZpbGVSZWFkZXIoKTtcbiAgICByZWFkZXIub25sb2FkID0gZSA9PiB7XG4gICAgICBjb25zdCB2aWV3ID0gbmV3IERhdGFWaWV3KChlLnRhcmdldCBhcyBhbnkpLnJlc3VsdCk7XG4gICAgICBpZiAodmlldy5nZXRVaW50MTYoMCwgZmFsc2UpICE9PSAweGZmZDgpIHtcbiAgICAgICAgcmV0dXJuIGNhbGxiYWNrKC0yKTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGxlbmd0aCA9IHZpZXcuYnl0ZUxlbmd0aDtcbiAgICAgIGxldCBvZmZzZXQgPSAyO1xuICAgICAgd2hpbGUgKG9mZnNldCA8IGxlbmd0aCkge1xuICAgICAgICBjb25zdCBtYXJrZXIgPSB2aWV3LmdldFVpbnQxNihvZmZzZXQsIGZhbHNlKTtcbiAgICAgICAgb2Zmc2V0ICs9IDI7XG4gICAgICAgIGlmIChtYXJrZXIgPT09IDB4ZmZlMSkge1xuICAgICAgICAgIGNvbnN0IHRtcCA9IHZpZXcuZ2V0VWludDMyKChvZmZzZXQgKz0gMiksIGZhbHNlKTtcbiAgICAgICAgICBpZiAodG1wICE9PSAweDQ1Nzg2OTY2KSB7XG4gICAgICAgICAgICByZXR1cm4gY2FsbGJhY2soLTEpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBjb25zdCBsaXR0bGUgPSB2aWV3LmdldFVpbnQxNigob2Zmc2V0ICs9IDYpLCBmYWxzZSkgPT09IDB4NDk0OTtcbiAgICAgICAgICBvZmZzZXQgKz0gdmlldy5nZXRVaW50MzIob2Zmc2V0ICsgNCwgbGl0dGxlKTtcbiAgICAgICAgICBjb25zdCB0YWdzID0gdmlldy5nZXRVaW50MTYob2Zmc2V0LCBsaXR0bGUpO1xuICAgICAgICAgIG9mZnNldCArPSAyO1xuICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGFnczsgaSsrKSB7XG4gICAgICAgICAgICBpZiAodmlldy5nZXRVaW50MTYob2Zmc2V0ICsgaSAqIDEyLCBsaXR0bGUpID09PSAweDAxMTIpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIGNhbGxiYWNrKHZpZXcuZ2V0VWludDE2KG9mZnNldCArIGkgKiAxMiArIDgsIGxpdHRsZSkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmICgobWFya2VyICYgMHhmZjAwKSAhPT0gMHhmZjAwKSB7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgb2Zmc2V0ICs9IHZpZXcuZ2V0VWludDE2KG9mZnNldCwgZmFsc2UpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gY2FsbGJhY2soLTEpO1xuICAgIH07XG4gICAgcmVhZGVyLnJlYWRBc0FycmF5QnVmZmVyKGZpbGUuc2xpY2UoMCwgNjQgKiAxMDI0KSk7XG4gIH1cbn1cbiJdfQ==