UNPKG

@cute-dw/core

Version:

This TypeScript library is the main part of a more powerfull package designed for the fast WEB software development. The cornerstone of the library is the **DataStore** class, which might be useful when you need a full control of the data, but do not need

182 lines 22.8 kB
var _a; import { UnsupportedOperationException } from "../util/exception/UnsupportedOperationException"; import { IndexOutOfBoundsException } from "../util/exception/IndexOutOfBoundsException"; import { AbstractList } from "./AbstractList"; import { ListView } from "./view/ListView"; import { Objects } from "../util/Objects"; /** * Resizable-array implementation of the List interface. Implements all optional list operations, and permits all elements, including null. * In addition to implementing the List interface, this class provides methods to manipulate the size of the array that is used internally to store the list. */ export class ArrayList extends AbstractList { /** * Constructs an empty list with the specified initial capacity (as number), or * constructs a list containing the elements of the specified collection, in the order * they are returned by the collection's iterator * @param capacityOrCollection */ constructor(capacityOrCollection) { super(); this._elems = []; this._size = 0; this[_a] = "ArrayList"; capacityOrCollection = capacityOrCollection ?? 10; if (Objects.isNumber(capacityOrCollection)) { this._elems = new Array(Math.max(capacityOrCollection, 0)).fill(null); } else { const collection = capacityOrCollection; this._elems = new Array(Math.max(collection.length, 0)).fill(null); this.appendAll(collection); this._modCount = 0; } } _checkRange(index) { if (index >= 0 && index < this.length) { // OK! } else throw new IndexOutOfBoundsException(`Index '${index}' is out of range`); } *[Symbol.iterator]() { for (const elem of this._elems) { yield elem; } } get size() { return this._size; } append(value) { this.ensureCapacity(this.length + 1); // Increments modCount!! this._elems[this._size++] = value; return true; } clear() { this._modCount++; this._elems.fill(null); this._size = 0; } clone() { const aList = new ArrayList(this.size); aList.appendAll(this); return aList; } contains(value) { return this.indexOf(value) >= 0; } /** * @throws IndexOutOfBoundsException */ get(index) { this._checkRange(index); return this._elems[index]; } /** * @throws UnsupportedOperationException */ getNode(index) { throw new UnsupportedOperationException("Unsupported operation"); } indexOf(value, fromIndex = 0) { fromIndex = Math.max(fromIndex, 0); const nLen = this.length; for (let i = 0; i < nLen; i++) { if (this._elems[i] === value) { return i; } } return -1; } insert(index, value) { this._checkRange(index); this.ensureCapacity(this.length + 1); this._size++; this._elems.splice(index, 0, value); return true; } lastIndexOf(value, fromIndex = 0) { fromIndex = Math.max(fromIndex, 0); const nLen = this.length; for (let i = nLen - 1; i >= 0; i--) { if (this._elems[i] === value) { return i; } } return -1; } remove(value) { let i = -1; let nLen = this.length; while (++i < nLen) { if (this._elems[i] === value) { this._modCount++; this._elems.splice(i, 1); this._elems[--this._size] = null; // Let gc do its work return true; } } return false; } removeAt(index) { this._checkRange(index); this._modCount++; const oldValue = this._elems[index]; this._elems.splice(index, 1); this._elems[--this._size] = null; // Let gc do its work return oldValue; } removeRange(fromIndex, toIndex) { this._checkRange(fromIndex); toIndex = toIndex ?? this.length; const lastIndex = Math.min(toIndex, this.length); if (lastIndex > fromIndex) { this._modCount++; const oldLen = this._elems.length; const delCount = lastIndex - fromIndex; this._elems.splice(fromIndex, delCount); this._size -= delCount; this._elems.length = oldLen; this._elems.fill(null, this._size); return true; } return false; } set(index, value) { this._checkRange(index); const oldValue = this._elems[index]; this._elems[index] = value; this._modCount++; return oldValue; } subList(fromIndex, toIndex) { return new ListView(this, fromIndex, toIndex); } /** * Increases the capacity of this ArrayList instance, if necessary, to ensure that it can hold at least the number of elements specified by the minimum capacity argument * @param minCapacity The desired minimum capacity */ ensureCapacity(minCapacity) { const oldCapacity = this._elems.length; if (minCapacity > oldCapacity) { let newCapacity = Math.ceil((oldCapacity * 3) / 2 + 1); if (newCapacity < minCapacity) newCapacity = minCapacity; this._elems.length = newCapacity; this._elems.fill(null, this.length); this._modCount++; } } /** * Trims the capacity of this ArrayList instance to be the list's current size */ trimToSize() { const oldCap = this._elems.length; if (this.size < oldCap) { this._elems.length = this.size; this._modCount++; } } toArray() { return this._elems.slice(0, this.size); } } _a = Symbol.toStringTag; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQXJyYXlMaXN0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvY3V0ZS1jb3JlL3NyYy9saWIvY29sbGVjdGlvbnMvQXJyYXlMaXN0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSxPQUFPLEVBQUUsNkJBQTZCLEVBQUUsTUFBTSxpREFBaUQsQ0FBQztBQUNoRyxPQUFPLEVBQUUseUJBQXlCLEVBQUUsTUFBTSw2Q0FBNkMsQ0FBQztBQUN4RixPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFHOUMsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBRzNDLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMxQzs7O0dBR0c7QUFDSCxNQUFNLE9BQU8sU0FBYSxTQUFRLFlBQWU7SUFJL0M7Ozs7O09BS0c7SUFDSCxZQUFZLG9CQUFvRDtRQUM5RCxLQUFLLEVBQUUsQ0FBQztRQVZPLFdBQU0sR0FBaUIsRUFBRSxDQUFDO1FBQ25DLFVBQUssR0FBVyxDQUFDLENBQUM7UUFrQ2pCLFFBQW9CLEdBQUcsV0FBVyxDQUFDO1FBeEIxQyxvQkFBb0IsR0FBRyxvQkFBb0IsSUFBSSxFQUFFLENBQUM7UUFDbEQsSUFBSSxPQUFPLENBQUMsUUFBUSxDQUFDLG9CQUFvQixDQUFDLEVBQUU7WUFDMUMsSUFBSSxDQUFDLE1BQU0sR0FBRyxJQUFJLEtBQUssQ0FBYSxJQUFJLENBQUMsR0FBRyxDQUFDLG9CQUFvQixFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO1NBQ25GO2FBQU07WUFDTCxNQUFNLFVBQVUsR0FBRyxvQkFBb0IsQ0FBQztZQUN4QyxJQUFJLENBQUMsTUFBTSxHQUFHLElBQUksS0FBSyxDQUFhLElBQUksQ0FBQyxHQUFHLENBQUMsVUFBVSxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFD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Q0FBQztTQUNsQjtJQUNILENBQUM7SUFFUSxPQUFPO1FBQ2QsT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ3pDLENBQUM7Q0FDRjtLQXZKVyxNQUFNLENBQUMsV0FBVyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIH0gZnJvbSBcIi4uL3V0aWwvZXhjZXB0aW9uL1Vuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uXCI7XHJcbmltcG9ydCB7IEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gfSBmcm9tIFwiLi4vdXRpbC9leGNlcHRpb24vSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvblwiO1xyXG5pbXBvcnQgeyBBYnN0cmFjdExpc3QgfSBmcm9tIFwiLi9BYnN0cmFjdExpc3RcIjtcclxuaW1wb3J0IHsgTGlua2VkTGlzdE5vZGUgfSBmcm9tIFwiLi9MaW5rZWRMaXN0XCI7XHJcbmltcG9ydCB7IExpc3QgfSBmcm9tIFwiLi9MaXN0XCI7XHJcbmltcG9ydCB7IExpc3RWaWV3IH0gZnJvbSBcIi4vdmlldy9MaXN0Vmlld1wiO1xyXG5pbXBvcnQgeyBDbG9uZWFibGUgfSBmcm9tIFwiLi4vdXRpbC9pbnRlcmZhY2UvQ2xvbmVhYmxlXCI7XHJcbmltcG9ydCB7IENvbGxlY3Rpb24sIEVsZW1lbnQgfSBmcm9tIFwiLi9Db2xsZWN0aW9uXCI7XHJcbmltcG9ydCB7IE9iamVjdHMgfSBmcm9tIFwiLi4vdXRpbC9PYmplY3RzXCI7XHJcbi8qKlxyXG4gKiBSZXNpemFibGUtYXJyYXkgaW1wbGVtZW50YXRpb24gb2YgdGhlIExpc3QgaW50ZXJmYWNlLiBJbXBsZW1lbnRzIGFsbCBvcHRpb25hbCBsaXN0IG9wZXJhdGlvbnMsIGFuZCBwZXJtaXRzIGFsbCBlbGVtZW50cywgaW5jbHVkaW5nIG51bGwuXHJcbiAqIEluIGFkZGl0aW9uIHRvIGltcGxlbWVudGluZyB0aGUgTGlzdCBpbnRlcmZhY2UsIHRoaXMgY2xhc3MgcHJvdmlkZXMgbWV0aG9kcyB0byBtYW5pcHVsYXRlIHRoZSBzaXplIG9mIHRoZSBhcnJheSB0aGF0IGlzIHVzZWQgaW50ZXJuYWxseSB0byBzdG9yZSB0aGUgbGlzdC5cclxuICovXHJcbmV4cG9ydCBjbGFzcyBBcnJheUxpc3Q8VD4gZXh0ZW5kcyBBYnN0cmFjdExpc3Q8VD4gaW1wbGVtZW50cyBDbG9uZWFibGUge1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgX2VsZW1zOiBFbGVtZW50PFQ+W10gPSBbXTtcclxuICBwcml2YXRlIF9zaXplOiBudW1iZXIgPSAwO1xyXG5cclxuICAvKipcclxuICAgKiBDb25zdHJ1Y3RzIGFuIGVtcHR5IGxpc3Qgd2l0aCB0aGUgc3BlY2lmaWVkIGluaXRpYWwgY2FwYWNpdHkgKGFzIG51bWJlciksIG9yXHJcbiAgICogY29uc3RydWN0cyBhIGxpc3QgY29udGFpbmluZyB0aGUgZWxlbWVudHMgb2YgdGhlIHNwZWNpZmllZCBjb2xsZWN0aW9uLCBpbiB0aGUgb3JkZXJcclxuICAgKiB0aGV5IGFyZSByZXR1cm5lZCBieSB0aGUgY29sbGVjdGlvbidzIGl0ZXJhdG9yXHJcbiAgICogQHBhcmFtIGNhcGFjaXR5T3JDb2xsZWN0aW9uXHJcbiAgICovXHJcbiAgY29uc3RydWN0b3IoY2FwYWNpdHlPckNvbGxlY3Rpb24/OiBDb2xsZWN0aW9uPFQ+fEFycmF5PFQ+fG51bWJlcikge1xyXG4gICAgc3VwZXIoKTtcclxuICAgIGNhcGFjaXR5T3JDb2xsZWN0aW9uID0gY2FwYWNpdHlPckNvbGxlY3Rpb24gPz8gMTA7XHJcbiAgICBpZiAoT2JqZWN0cy5pc051bWJlcihjYXBhY2l0eU9yQ29sbGVjdGlvbikpIHtcclxuICAgICAgdGhpcy5fZWxlbXMgPSBuZXcgQXJyYXk8RWxlbWVudDxUPj4oTWF0aC5tYXgoY2FwYWNpdHlPckNvbGxlY3Rpb24sIDApKS5maWxsKG51bGwpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgY29uc3QgY29sbGVjdGlvbiA9IGNhcGFjaXR5T3JDb2xsZWN0aW9uO1xyXG4gICAgICB0aGlzLl9lbGVtcyA9IG5ldyBBcnJheTxFbGVtZW50PFQ+PihNYXRoLm1heChjb2xsZWN0aW9uLmxlbmd0aCwgMCkpLmZpbGwobnVsbCk7XHJcbiAgICAgIHRoaXMuYXBwZW5kQWxsKGNvbGxlY3Rpb24pO1xyXG4gICAgICB0aGlzLl9tb2RDb3VudCA9IDA7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIF9jaGVja1JhbmdlKGluZGV4OiBudW1iZXIpOiB2b2lkIHtcclxuICAgIGlmIChpbmRleCA+PSAwICYmIGluZGV4IDwgdGhpcy5sZW5ndGgpIHtcclxuICAgICAgLy8gT0shXHJcbiAgICB9IGVsc2VcclxuICAgICAgdGhyb3cgbmV3IEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24oYEluZGV4ICcke2luZGV4fScgaXMgb3V0IG9mIHJhbmdlYClcclxuICB9XHJcblxyXG4gIG92ZXJyaWRlICpbU3ltYm9sLml0ZXJhdG9yXSgpOiBJdGVyYWJsZUl0ZXJhdG9yPEVsZW1lbnQ8VD4+IHtcclxuICAgIGZvciAoY29uc3QgZWxlbSBvZiB0aGlzLl9lbGVtcykge1xyXG4gICAgICB5aWVsZCBlbGVtO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgb3ZlcnJpZGUgW1N5bWJvbC50b1N0cmluZ1RhZ10gPSBcIkFycmF5TGlzdFwiO1xyXG5cclxuICBvdmVycmlkZSBnZXQgc2l6ZSgpOiBudW1iZXIgeyByZXR1cm4gdGhpcy5fc2l6ZSB9XHJcblxyXG4gIG92ZXJyaWRlIGFwcGVuZCh2YWx1ZTogRWxlbWVudDxUPik6IGJvb2xlYW4ge1xyXG4gICAgdGhpcy5lbnN1cmVDYXBhY2l0eSh0aGlzLmxlbmd0aCArIDEpOyAvLyBJbmNyZW1lbnRzIG1vZENvdW50ISFcclxuICAgIHRoaXMuX2VsZW1zW3RoaXMuX3NpemUrK10gPSB2YWx1ZTtcclxuICAgIHJldHVybiB0cnVlO1xyXG4gIH1cclxuXHJcbiAgb3ZlcnJpZGUgY2xlYXIoKTogdm9pZCB7XHJcbiAgICB0aGlzLl9tb2RDb3VudCsrO1xyXG4gICAgdGhpcy5fZWxlbXMuZmlsbChudWxsKTtcclxuICAgIHRoaXMuX3NpemUgPSAwO1xyXG4gIH1cclxuXHJcbiAgY2xvbmUoKTogQXJyYXlMaXN0PFQ+IHtcclxuICAgIGNvbnN0IGFMaXN0ID0gbmV3IEFycmF5TGlzdDxUPih0aGlzLnNpemUpO1xyXG4gICAgYUxpc3QuYXBwZW5kQWxsKHRoaXMpO1xyXG4gICAgcmV0dXJuIGFMaXN0O1xyXG4gIH1cclxuXHJcbiAgb3ZlcnJpZGUgY29udGFpbnModmFsdWU6IEVsZW1lbnQ8VD4pOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLmluZGV4T2YodmFsdWUpID49IDA7XHJcbiAgfVxyXG4gIC8qKlxyXG4gICAqIEB0aHJvd3MgSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvblxyXG4gICAqL1xyXG4gIG92ZXJyaWRlIGdldChpbmRleDogbnVtYmVyKTogRWxlbWVudDxUPiB8IHVuZGVmaW5lZCB7XHJcbiAgICB0aGlzLl9jaGVja1JhbmdlKGluZGV4KTtcclxuICAgIHJldHVybiB0aGlzLl9lbGVtc1tpbmRleF07XHJcbiAgfVxyXG4gIC8qKlxyXG4gICAqIEB0aHJvd3MgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb25cclxuICAgKi9cclxuICBvdmVycmlkZSBnZXROb2RlKGluZGV4OiBudW1iZXIpOiBSZWFkb25seTxMaW5rZWRMaXN0Tm9kZTxUPj4gfCBudWxsIHtcclxuICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbihcIlVuc3VwcG9ydGVkIG9wZXJhdGlvblwiKTtcclxuICB9XHJcblxyXG4gIG92ZXJyaWRlIGluZGV4T2YodmFsdWU6IEVsZW1lbnQ8VD4sIGZyb21JbmRleDogbnVtYmVyID0gMCk6IG51bWJlciB7XHJcbiAgICBmcm9tSW5kZXggPSBNYXRoLm1heChmcm9tSW5kZXgsIDApO1xyXG4gICAgY29uc3QgbkxlbiA9IHRoaXMubGVuZ3RoO1xyXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBuTGVuOyBpKyspIHtcclxuICAgICAgaWYgKHRoaXMuX2VsZW1zW2ldID09PSB2YWx1ZSkge1xyXG4gICAgICAgIHJldHVybiBpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gLTE7XHJcbiAgfVxyXG5cclxuICBvdmVycmlkZSBpbnNlcnQoaW5kZXg6IG51bWJlciwgdmFsdWU6IEVsZW1lbnQ8VD4pOiBib29sZWFuIHtcclxuICAgIHRoaXMuX2NoZWNrUmFuZ2UoaW5kZXgpO1xyXG4gICAgdGhpcy5lbnN1cmVDYXBhY2l0eSh0aGlzLmxlbmd0aCArIDEpO1xyXG4gICAgdGhpcy5fc2l6ZSsrO1xyXG4gICAgdGhpcy5fZWxlbXMuc3BsaWNlKGluZGV4LCAwLCB2YWx1ZSk7XHJcbiAgICByZXR1cm4gdHJ1ZTtcclxuICB9XHJcblxyXG4gIG92ZXJyaWRlIGxhc3RJbmRleE9mKHZhbHVlOiBFbGVtZW50PFQ+LCBmcm9tSW5kZXg6IG51bWJlciA9IDApOiBudW1iZXIge1xyXG4gICAgZnJvbUluZGV4ID0gTWF0aC5tYXgoZnJvbUluZGV4LCAwKTtcclxuICAgIGNvbnN0IG5MZW4gPSB0aGlzLmxlbmd0aDtcclxuICAgIGZvciAobGV0IGkgPSBuTGVuIC0gMTsgaSA+PSAwOyBpLS0pIHtcclxuICAgICAgaWYgKHRoaXMuX2VsZW1zW2ldID09PSB2YWx1ZSkge1xyXG4gICAgICAgIHJldHVybiBpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gLTE7XHJcbiAgfVxyXG5cclxuICBvdmVycmlkZSByZW1vdmUodmFsdWU6IEVsZW1lbnQ8VD4pOiBib29sZWFuIHtcclxuICAgIGxldCBpID0gLTE7XHJcbiAgICBsZXQgbkxlbiA9IHRoaXMubGVuZ3RoO1xyXG4gICAgd2hpbGUgKCsraSA8IG5MZW4pIHtcclxuICAgICAgaWYgKHRoaXMuX2VsZW1zW2ldID09PSB2YWx1ZSkge1xyXG4gICAgICAgIHRoaXMuX21vZENvdW50Kys7XHJcbiAgICAgICAgdGhpcy5fZWxlbXMuc3BsaWNlKGksIDEpO1xyXG4gICAgICAgIHRoaXMuX2VsZW1zWy0tdGhpcy5fc2l6ZV0gPSBudWxsOyAvLyBMZXQgZ2MgZG8gaXRzIHdvcmtcclxuICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIGZhbHNlO1xyXG4gIH1cclxuXHJcbiAgb3ZlcnJpZGUgcmVtb3ZlQXQoaW5kZXg6IG51bWJlcik6IEVsZW1lbnQ8VD4gfCB1bmRlZmluZWQge1xyXG4gICAgdGhpcy5fY2hlY2tSYW5nZShpbmRleCk7XHJcblxyXG4gICAgdGhpcy5fbW9kQ291bnQrKztcclxuICAgIGNvbnN0IG9sZFZhbHVlID0gdGhpcy5fZWxlbXNbaW5kZXhdO1xyXG4gICAgdGhpcy5fZWxlbXMuc3BsaWNlKGluZGV4LCAxKTtcclxuICAgIHRoaXMuX2VsZW1zWy0tdGhpcy5fc2l6ZV0gPSBudWxsOyAvLyBMZXQgZ2MgZG8gaXRzIHdvcmtcclxuXHJcbiAgICByZXR1cm4gb2xkVmFsdWU7XHJcbiAgfVxyXG5cclxuICBvdmVycmlkZSByZW1vdmVSYW5nZShmcm9tSW5kZXg6IG51bWJlciwgdG9JbmRleD86IG51bWJlcik6IGJvb2xlYW4ge1xyXG4gICAgdGhpcy5fY2hlY2tSYW5nZShmcm9tSW5kZXgpO1xyXG4gICAgdG9JbmRleCA9IHRvSW5kZXggPz8gdGhpcy5sZW5ndGg7XHJcbiAgICBjb25zdCBsYXN0SW5kZXggPSBNYXRoLm1pbih0b0luZGV4LCB0aGlzLmxlbmd0aCk7XHJcbiAgICBpZiAobGFzdEluZGV4ID4gZnJvbUluZGV4KSB7XHJcbiAgICAgIHRoaXMuX21vZENvdW50Kys7XHJcbiAgICAgIGNvbnN0IG9sZExlbiA9IHRoaXMuX2VsZW1zLmxlbmd0aDtcclxuICAgICAgY29uc3QgZGVsQ291bnQgPSBsYXN0SW5kZXggLSBmcm9tSW5kZXg7XHJcbiAgICAgIHRoaXMuX2VsZW1zLnNwbGljZShmcm9tSW5kZXgsIGRlbENvdW50KTtcclxuICAgICAgdGhpcy5fc2l6ZSAtPSBkZWxDb3VudDtcclxuICAgICAgdGhpcy5fZWxlbXMubGVuZ3RoID0gb2xkTGVuO1xyXG4gICAgICB0aGlzLl9lbGVtcy5maWxsKG51bGwsIHRoaXMuX3NpemUpO1xyXG4gICAgICByZXR1cm4gdHJ1ZTtcclxuICAgIH1cclxuICAgIHJldHVybiBmYWxzZTtcclxuICB9XHJcblxyXG4gIG92ZXJyaWRlIHNldChpbmRleDogbnVtYmVyLCB2YWx1ZTogRWxlbWVudDxUPik6IEVsZW1lbnQ8VD4gfCB1bmRlZmluZWQge1xyXG4gICAgdGhpcy5fY2hlY2tSYW5nZShpbmRleCk7XHJcbiAgICBjb25zdCBvbGRWYWx1ZSA9IHRoaXMuX2VsZW1zW2luZGV4XTtcclxuICAgIHRoaXMuX2VsZW1zW2luZGV4XSA9IHZhbHVlO1xyXG4gICAgdGhpcy5fbW9kQ291bnQrKztcclxuICAgIHJldHVybiBvbGRWYWx1ZTtcclxuICB9XHJcblxyXG4gIG92ZXJyaWRlIHN1Ykxpc3QoZnJvbUluZGV4OiBudW1iZXIsIHRvSW5kZXg6IG51bWJlcik6IExpc3Q8VD4ge1xyXG4gICAgcmV0dXJuIG5ldyBMaXN0Vmlldyh0aGlzLCBmcm9tSW5kZXgsIHRvSW5kZXgpO1xyXG4gIH1cclxuICAvKipcclxuICAgKiBJbmNyZWFzZXMgdGhlIGNhcGFjaXR5IG9mIHRoaXMgQXJyYXlMaXN0IGluc3RhbmNlLCBpZiBuZWNlc3NhcnksIHRvIGVuc3VyZSB0aGF0IGl0IGNhbiBob2xkIGF0IGxlYXN0IHRoZSBudW1iZXIgb2YgZWxlbWVudHMgc3BlY2lmaWVkIGJ5IHRoZSBtaW5pbXVtIGNhcGFjaXR5IGFyZ3VtZW50XHJcbiAgICogQHBhcmFtIG1pbkNhcGFjaXR5IFRoZSBkZXNpcmVkIG1pbmltdW0gY2FwYWNpdHlcclxuICAgKi9cclxuICBlbnN1cmVDYXBhY2l0eShtaW5DYXBhY2l0eTogbnVtYmVyKTogdm9pZCB7XHJcbiAgICBjb25zdCBvbGRDYXBhY2l0eSA9IHRoaXMuX2VsZW1zLmxlbmd0aDtcclxuICAgIGlmIChtaW5DYXBhY2l0eSA+IG9sZENhcGFjaXR5KSB7XHJcbiAgICAgIGxldCBuZXdDYXBhY2l0eSA9IE1hdGguY2VpbCgob2xkQ2FwYWNpdHkgKiAzKSAvIDIgKyAxKTtcclxuICAgICAgaWYgKG5ld0NhcGFjaXR5IDwgbWluQ2FwYWNpdHkpXHJcbiAgICAgICAgbmV3Q2FwYWNpdHkgPSBtaW5DYXBhY2l0eTtcclxuICAgICAgdGhpcy5fZWxlbXMubGVuZ3RoID0gbmV3Q2FwYWNpdHk7XHJcbiAgICAgIHRoaXMuX2VsZW1zLmZpbGwobnVsbCwgdGhpcy5sZW5ndGgpO1xyXG4gICAgICB0aGlzLl9tb2RDb3VudCsrO1xyXG4gICAgfVxyXG4gIH1cclxuICAvKipcclxuICAgKiBUcmltcyB0aGUgY2FwYWNpdHkgb2YgdGhpcyBBcnJheUxpc3QgaW5zdGFuY2UgdG8gYmUgdGhlIGxpc3QncyBjdXJyZW50IHNpemVcclxuICAgKi9cclxuICB0cmltVG9TaXplKCk6IHZvaWQge1xyXG4gICAgY29uc3Qgb2xkQ2FwID0gdGhpcy5fZWxlbXMubGVuZ3RoO1xyXG4gICAgaWYgKHRoaXMuc2l6ZSA8IG9sZENhcCkge1xyXG4gICAgICB0aGlzLl9lbGVtcy5sZW5ndGggPSB0aGlzLnNpemU7XHJcbiAgICAgIHRoaXMuX21vZENvdW50Kys7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBvdmVycmlkZSB0b0FycmF5KCk6IEVsZW1lbnQ8VD5bXSB7XHJcbiAgICByZXR1cm4gdGhpcy5fZWxlbXMuc2xpY2UoMCwgdGhpcy5zaXplKTtcclxuICB9XHJcbn1cclxuIl19